From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 67E447EF0A for ; Tue, 3 Sep 2019 09:35:13 +0200 (CEST) X-IronPort-AV: E=Sophos;i="5.64,462,1559512800"; d="asc'?scan'208,217";a="399963924" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 03 Sep 2019 09:35:13 +0200 User-agent: mu4e 1.2.0; emacs 26.2 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 03 Sep 2019 09:35:11 +0200 Message-ID: <87imq94yts.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgQXVndXN0IDI3IHRvDQpTZXB0ZW1iZXIgMDMs IDIwMTkuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KT2NhbWwt bXVsdGljb3JlOiByZXBvcnQgb24gYSBKdW5lIDIwMTggZGV2ZWxvcG1lbnQg bWVldGluZyBpbiANClBhcmlzDQpJbnRlcmVzdGluZyBPQ2FtbCBBcnRpY2xl cw0KT2xkIENXTg0KDQoNCk9jYW1sLW11bHRpY29yZTogcmVwb3J0IG9uIGEg SnVuZSAyMDE4IGRldmVsb3BtZW50IG1lZXRpbmcgaW4gDQpQYXJpcw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1tdWx0aWNvcmUtcmVwb3J0LW9u LWEtanVuZS0yMDE4LWRldmVsb3BtZW50LW1lZXRpbmctaW4tcGFyaXMvMjIw Mi8xMD4NCg0KDQpEZWVwIGluIHRoaXMgdGhyZWFkLCBzaWQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBBcyBhIHNtYWxsIHN0ZXAgdG93YXJkcyBt dWx0aWNvcmUsIGl0cyBpbnRlcmVzdGluZyB0byBub3RlIHRoYXQNCiAgPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzg3MTM+IGp1c3Qg Z290IG1lcmdlZCB0byANCiAgbWFzdGVyIQ0KDQoNCkludGVyZXN0aW5nIE9D YW1sIEFydGljbGVzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2ludGVyZXN0aW5nLW9jYW1sLWFydGljbGVzLzE4NjcvNDY+DQoNCg0K WW90YW0gQmFybm95IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgPGh0dHBzOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDE5LzA4LzMwL29j YW1scHJvcy1jb21waWxlci10ZWFtLXdvcmstdXBkYXRlLz4NCg0KDQpPbGQg Q1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVu IHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBh bmQgDQogIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBs b29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCANCiAgb2Yg dGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IA0KICBzdWJz Y3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0 ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNo aXZlc10gDQo8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24u cnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0 aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0 dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 27 to September 03, 2019.

Ocaml-multicore: report on a June 2018 development meeting in Paris

Deep in this thread, sid announced

As a small step towards multicore, its interesting to note that https://github.com/ocaml/ocaml/pull/8713 just got merged to master!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl1uF7AACgkQBA0KO07S 5cdiSgf/ZWsdlX/0nazVFrtkEirEZgHW0JlfvmoNMS93W+LA5hsEf4U8ONmB+Ul5 pomzOirqMRZ/+liX+JxAO8c9RpbX+5MeCwsFKSrG9bjMFBlZUNagbjQmDFMQkxVc Gdi3xBxyLiByu8s+640K+jps/IRW1RYeDdqmLyVG6/XpbdUcIIotxWf+55l0/wSB ozktHKX632sLq4ZAIrNkkodtot/M/KQIAD8i165YvGlk3QUVB6g8P11EX1+Fpw/Y d9pSPdrnU2zeSqa7q9xFEIZxG1PRHhaBorSybKhFdqwdQkfmYw8N/i9wuVaVb9XA +Q+bkdr4CeFa1lVnyQpsmyc0FpapWA== =8IpS -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4762B7ED21 for ; Tue, 15 Oct 2019 09:28:29 +0200 (CEST) X-IronPort-AV: E=Sophos;i="5.67,298,1566856800"; d="asc'?scan'208,217";a="406188093" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 15 Oct 2019 09:28:28 +0200 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 15 Oct 2019 09:28:27 +0200 Message-ID: <87zhi2v55w.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 08=20 to 15, 2019. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 capnp-rpc 0.4.0 Ocaml-protoc.plugin.1.0.0 Old CWN capnp-rpc 0.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive:=20 Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of [capnp-rpc 0.4.0], an=20 OCaml implementation of the Cap'n Proto RPC specification. If you haven't used the library before, please see the=20 [documentation and tutorial]. Cap'n Proto RPC aims to provide secure,=20 efficient, typed communications between multiple parties. This library is now being used to build [ocaml-ci], where it is=20 used for all communication between the web frontend and backend=20 services, and to provide a command-line client. [capnp-rpc 0.4.0] [documentation and tutorial] [ocaml-ci] Main changes since v0.3 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Breaking changes: =E2=80=A2 Wrap errors with the ``Capnp' tag to make it easier to compose= =20 with other types of error. =E2=80=A2 Prefix all command-line options with `capnp-'. e.g. `--listen-address' is now `--capnp-listen-address'. The=20 old names were confusing for applications that supported other=20 protocols too (e.g. a web server). New features: =E2=80=A2 Add `Capability.with_ref' convenience function. This=20 automatically calls `dec_ref' when done. =E2=80=A2 Add Unix `Cap_file' module to load and save `Sturdy_refs'. In particular, this ensures that saved cap files get a mode of=20 `0o600', since they contain secrets. =E2=80=A2 Export cmdliner network address parsing. This is useful if=20 you don't want to use the default option parsing. For example, if=20 you want to make Cap'n Proto an optional feature of your program. =E2=80=A2 Upgrade from `uint' (which is deprecated) to the newer=20 `stdint'. The latest version of `uint' is just a wrapper around=20 `stdint', so this shouldn't break anything if you are using the latest=20 version. =E2=80=A2 Put cmdliner options in their own man-page section. Use `Capnp_rpc_unix.manpage_capnp_options' to control where in=20 your man-page they appear. =E2=80=A2 Enable `SO_KEEPALIVE' for TCP connections. For use with=20 Docker's libnetwork, try something like this in your `stack.yml': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 sysctls: =E2=94=82 - 'net.ipv4.tcp_keepalive_time=3D60' =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Ocaml-protoc.plugin.1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anders Fugmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the second release of=20 [ocaml-protoc-plugin]. Ocaml-protoc-plugin is a plugin to googles `protoc' compiler=20 which generates type idiomatic to ocaml from `.proto' files including=20 full compliant serialization and deserialization functions. [ocaml-protoc-plugin]=20 Most noteworthy changes in this release: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Full proto2 support. =E2=80=A2 The list of dependencies has been slimmed way down, and now=20 only depends on `conf-protoc' (the `protoc' compiler and googles=20 *well known types*). =E2=80=A2 Buckescript support. =E2=80=A2 Added options to change the ocaml (type for scalar types (int,= =20 int64 or int32). Many thanks to Wojtek Czekalski for helping trimming=20 dependencies and for Buclescript support. Full changelog: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Support enum aliasing =E2=80=A2 Avoid name clash with on 'name' =E2=80=A2 Fix code generation when argument contains a path =E2=80=A2 Refactor internal types to make serialization and=20 deserialization type spec symmetrical. =E2=80=A2 Optimize deserialization for messages with max_id < 1024 =E2=80=A2 Don't depend on Base in runtime =E2=80=A2 Slim runtime dependencies: Remove need for base, ocplib-endian= =20 and ppx_let =E2=80=A2 Honor [packed=3D=E2=80=A6] flag. =E2=80=A2 Make fixed scalar types default to int32 and int64 =E2=80=A2 Support proto2 specification =E2=80=A2 Add options to switch between int64|int32 and int =E2=80=A2 Fix name clash problem with special enum names =E2=80=A2 Refactor serialization and deserialization to simplify emitted= =20 code =E2=80=A2 Eagerly evaluate serialization (for speed). Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and=20 I'll mail it to you, or go take a look at [the archive] or the [RSS feed=20 of the archives]. If you also wish to receive it every week by mail, you may=20 subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives]=20 [online] [Alan Schmitt] --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 08 to 15, 2019.

capnp-rpc 0.4.0

Thomas Leonard announced

I'm pleased to announce the release of capnp-rpc 0.4.0, an OCaml implementation of the Cap'n Proto RPC specification.

If you haven't used the library before, please see the documentation and tutorial. Cap'n Proto RPC aims to provide secure, efficient, typed communications between multiple parties.

This library is now being used to build ocaml-ci, where it is used for all communication between the web frontend and backend services, and to provide a command-line client.

Main changes since v0.3

Breaking changes:

  • Wrap errors with the `Capnp tag to make it easier to compose with other types of error.
  • Prefix all command-line options with capnp-. e.g. --listen-address is now --capnp-listen-address. The old names were confusing for applications that supported other protocols too (e.g. a web server).

New features:

  • Add Capability.with_ref convenience function. This automatically calls dec_ref when done.
  • Add Unix Cap_file module to load and save Sturdy_refs. In particular, this ensures that saved cap files get a mode of 0o600, since they contain secrets.
  • Export cmdliner network address parsing. This is useful if you don't want to use the default option parsing. For example, if you want to make Cap'n Proto an optional feature of your program.
  • Upgrade from uint (which is deprecated) to the newer stdint. The latest version of uint is just a wrapper around stdint, so this shouldn't break anything if you are using the latest version.
  • Put cmdliner options in their own man-page section. Use Capnp_rpc_unix.manpage_capnp_options to control where in your man-page they appear.
  • Enable SO_KEEPALIVE for TCP connections. For use with Docker's libnetwork, try something like this in your stack.yml:

    sysctls:
      - 'net.ipv4.tcp_keepalive_time=60'
    

Ocaml-protoc.plugin.1.0.0

Anders Fugmann announced

I'm happy to announce the second release of ocaml-protoc-plugin.

Ocaml-protoc-plugin is a plugin to googles protoc compiler which generates type idiomatic to ocaml from .proto files including full compliant serialization and deserialization functions.

Most noteworthy changes in this release:

  • Full proto2 support.
  • The list of dependencies has been slimmed way down, and now only depends on conf-protoc (the protoc compiler and googles well known types).
  • Buckescript support.
  • Added options to change the ocaml (type for scalar types (int, int64 or int32).

Many thanks to Wojtek Czekalski for helping trimming dependencies and for Buclescript support.

Full changelog:

  • Support enum aliasing
  • Avoid name clash with on 'name'
  • Fix code generation when argument contains a path
  • Refactor internal types to make serialization and deserialization type spec symmetrical.
  • Optimize deserialization for messages with max_id < 1024
  • Don't depend on Base in runtime
  • Slim runtime dependencies: Remove need for base, ocplib-endian and ppx_let
  • Honor [packed=…] flag.
  • Make fixed scalar types default to int32 and int64
  • Support proto2 specification
  • Add options to switch between int64|int32 and int
  • Fix name clash problem with special enum names
  • Refactor serialization and deserialization to simplify emitted code
  • Eagerly evaluate serialization (for speed).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl2ldRwACgkQBA0KO07S 5ce3fwgAvgCDwj/J7cYCkyGpsRX7gjw1Wu+eANeb9rzgHNKkg6h5/fPVhvQrfb3w AtShU12hco3OiI46XKUZ9757qPRVOg9RcyO6cEEe+VOBIsdNrnipeaXxRY5VrSwh rCIRzjOQkbfbyuJOhl2wPov7bspdvBwSnB5J++pYH/4Cm9943qtfaAeTwMtXkYZW 61Kj8E+qc6qa1LQY9RK+HqKI4sSl0V60YhEXQ68wrB8iuWKY4TdIZZEbqbN/7YcC X+6p5e7l+gBkMdaasTvDnHxlWx5x4Tx5AyAPnV/sNf/fC5xEsHmNzwDkKtu84w5E RMkS85UlpZTGZXzDOPDcgkN8U8u8eg== =Bbxg -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 59C027F32D for ; Tue, 5 Nov 2019 07:55:13 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.68,270,1569276000"; d="asc'?scan'208,217";a="325644514" Received: from unknown (HELO set) ([109.190.253.16]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 05 Nov 2019 07:55:11 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 05 Nov 2019 07:55:08 +0100 Message-ID: <87h83ivmlv.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Here is the latest OCaml Weekly News, for the week of October 29=20 to November 05, 2019. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 vim-ocaml - new home Old CWN vim-ocaml - new home =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive:=20 Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear Vim & Neovim users, I would like to announce that I've officially moved the=20 [vim-ocaml] repository under the control of the OCaml organization on github. Please direct your bug reports and pull requests to this repository. This move is done not because vim-ocaml is being neglected, on the contrary, there's an active team of=20 maintainers that recently expanded. I simply want to take this opportunity to=20 draw more Vim & Noevim users to this project, as I suspect many users=20 aren't aware of recent efforts. [vim-ocaml] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and=20 I'll mail it to you, or go take a look at [the archive] or the [RSS feed=20 of the archives]. If you also wish to receive it every week by mail, you may=20 subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives]=20 [online] [Alan Schmitt] --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 29 to November 05, 2019.

Table of Contents

vim-ocaml - new home

Rudi Grinberg announced

Dear Vim & Neovim users,

I would like to announce that I've officially moved the vim-ocaml repository under the control of the OCaml organization on github. Please direct your bug reports and pull requests to this repository. This move is done not because vim-ocaml is being neglected, on the contrary, there's an active team of maintainers that recently expanded. I simply want to take this opportunity to draw more Vim & Noevim users to this project, as I suspect many users aren't aware of recent efforts.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3BHM4ACgkQBA0KO07S 5cdXNAf/TY9kfZzgVf15TxbYuhudsEWozqdiK0tZvryQBOZdUkBdPs7B96G0XWtE sq+SkHwWcLN8KTxaB3WUegI/Knr5Q+rv5Q+ZX1Ix7O0LoPat+WqdMKpYUTyI87HM d3fI/Lq+6+lOvpRiAC4V4KpTsDhr5U8QGgmeJ1vP77R1gCTcmdswxCzQhEWEHiY2 GLo43WXfSt6l24whJWTHUcoHBCYx7a/1k4rA+1LS5blbbiw1selNKQCYvhUZUdnW w2FztYDcKf1PBihgGgXBYdXkzdZpqsRjbaO4e6sX5imU4Oqk+yB3fhMUVhAXVc+y KN/O99Wr2yu5gXlOnVVcLjo5AthfIA== =uGv8 -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 51AA07F30F for ; Tue, 12 Nov 2019 14:21:21 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.68,296,1569276000"; d="asc'?scan'208,217";a="326418721" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 12 Nov 2019 14:21:20 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 12 Nov 2019 14:21:19 +0100 Message-ID: <87tv792ptc.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 05=20 to 12, 2019. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Mirage 3.7.1 released Old CWN Mirage 3.7.1 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive:=20 Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 MirageOS 3.7.1 is released to opam repository now. Breaking change: =E2=80=A2 The hooks previously defined in OS.Main.at_enter/at_enter_iter/at_exit/at_exit_iter are now=20 part of Mirage_runtime (only used by mirage-entropy) Behaviour changes of MirageOS unikernels: =E2=80=A2 A unikernel now always calls the Mirage_runtime.at_exit=20 registered hooks =E2=80=93 once a unikernel succesfully executed its `start' in `Lwt_main.run', `exit 0' is called to ensure this behaviour =E2=80=A2 Top-level exceptions are no longer caught (there used to be in mirage-unix/mirage-xen/mirage-solo5 custom handlers). The=20 OCaml runtime prints the exception and backtrace on stdout and calls=20 exit 2 (from 4.10.0, abort() will be called). Deprecations (being removed from Mirage 4.0) =E2=80=A2 All Mirage_YYY_lwt are deprecated, Mirage_YYY interfaces are=20 no longer astracted over 'a io and buffer. This reduces the=20 amount of opam packages - mirage-yyy-lwt are no longer part of the=20 release (each mirage-yyy package provides a Mirage_yyy_lwt module for backwards compatibility). Motivation was discussed in =E2=80=A2 mirage-types and mirage-types-lwt are deprecated, please use=20 the Mirage_YYY signatures directly instead. Other observable changes =E2=80=A2 `mirage configure' now deletes all exising opam files Most reverse dependencies are already released to opam, have a=20 look at for progress (and=20 the temporary opam overlay). Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and=20 I'll mail it to you, or go take a look at [the archive] or the [RSS feed=20 of the archives]. If you also wish to receive it every week by mail, you may=20 subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives]=20 [online] [Alan Schmitt] --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 05 to 12, 2019.

Table of Contents

Mirage 3.7.1 released

Hannes Mehnert announced

MirageOS 3.7.1 is released to opam repository now.

Breaking change:

Behaviour changes of MirageOS unikernels:

  • A unikernel now always calls the Mirage_runtime.at_exit registered hooks – once a unikernel succesfully executed its start in Lwt_main.run, exit 0 is called to ensure this behaviour https://github.com/mirage/mirage/pull/1011
  • Top-level exceptions are no longer caught (there used to be in mirage-unix/mirage-xen/mirage-solo5 custom handlers). The OCaml runtime prints the exception and backtrace on stdout and calls exit 2 (from 4.10.0, abort() will be called).

Deprecations (being removed from Mirage 4.0)

  • All Mirage_YYY_lwt are deprecated, Mirage_YYY interfaces are no longer astracted over 'a io and buffer. This reduces the amount of opam packages - mirage-yyy-lwt are no longer part of the release (each mirage-yyy package provides a Mirage_yyy_lwt module for backwards compatibility). Motivation was discussed in https://github.com/mirage/mirage/issues/1004
  • mirage-types and mirage-types-lwt are deprecated, please use the Mirage_YYY signatures directly instead.

Other observable changes

  • mirage configure now deletes all exising opam files

Most reverse dependencies are already released to opam, have a look at https://github.com/mirage/mirage/issues/1012 for progress (and the temporary https://github.com/mirage/mirage-dev.git#easy opam overlay).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3Ksc8ACgkQBA0KO07S 5cfMBwf/aG5wiv/ahZnau075Cl9Yv391ZiYTrUV/hqM+2hlF9TGAHfKBObyJu7Oe etkkgsU+qKnzqxLHiiFISL11Mjut8U8MafcchAB8IbnGJi5AyVzDAdB4UFluWpjL jxo5Nm5jX6RSuwGOJsIAjHcNu7K8VeXZDLZMbZlBsGGOHHPLaDb9nz7BNYZ8pflS RPDdNryucegRfAzm7Cgd0VRo9wvGBO2sdeJPW7BbqeHlH521+MgfXox2eH0a5g8S Kv29uMhbEtuLBzZtXq/8sks3gXaxPzvlqbqqltkhMr1E7xt2pJeyt46l2U/s2QWI loAYViJmH5g+Hra9NSV2YBUyLFGAcw== =2G5v -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6230A7ED20 for ; Tue, 26 Nov 2019 09:33:39 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,245,1571695200"; d="asc'?scan'208,217";a="413501118" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 26 Nov 2019 09:33:38 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 26 Nov 2019 09:33:35 +0100 Message-ID: <87tv6rjau8.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 19=20 to 26, 2019. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 tiny_httpd 0.1 printbox.0.3 v0.13 release of Jane Street packages opam2nix (v1) GitHub Actions for OCaml / opam now available OCurrent 0.1 (CI/CD pipeline eDSL) New pages for OCaml API Irmin 2.0.0 release Tail cascade: a new indentation style for some OCaml constructs Old CWN tiny_httpd 0.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello and good morning, I'm pleased to announce that=20 [tiny_httpd] 0.1 has been released and is on opam. The goal is to emulate python's standard `http.server' by=20 providing a 0-dependencies, minimalist, simple HTTP server for embedding in applications that are not primarily a website, with very basic=20 routing (thanks to `Scanf'). A binary `http_of_dir' is also distributed=20 and can be used to serve a directory, with optional upload of files. [tiny_httpd] printbox.0.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let b =3D =E2=94=82 let open PrintBox in =E2=94=82 PrintBox_unicode.setup(); =E2=94=82 frame @@ grid_l [ =E2=94=82 [text "subject"; text_with_style Style.bold "announce:=20 printbox 0.3"]; =E2=94=82 [text "explanation"; =E2=94=82 frame @@ text {|PrintBox is a library for rendering nested= =20 tables, =E2=94=82 trees, and similar structures in monospace text or=20 HTML.|}]; =E2=94=82 [text "github"; =E2=94=82 text_with_style Style.(bg_color Blue)=20 "https://github.com/c-cube/printbox/releases/tag/0.3"]; =E2=94=82 [text "contributors"; =E2=94=82 vlist_map (text_with_style Style.(fg_color Green))=20 ["Simon"; "Guillaume"; "Matt"]]; =E2=94=82 [text "dependencies"; =E2=94=82 tree empty =E2=94=82 [tree (text "mandatory") =E2=94=82 [text "dune"; text "bytes"]; =E2=94=82 tree (text "optional") =E2=94=82 [text "uutf"; text "uucp"; text "tyxml"]]]; =E2=94=82 [text "expected reaction"; text "=F0=9F=8E=89"]; =E2=94=82 ] =E2=94=82 =E2=94=82 let () =3D print_endline @@ PrintBox_text.to_string b =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 ([actual link to the release]) [actual link to the release] v0.13 release of Jane Street packages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Clerc announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the v0.13 release of Jane Street=20 packages! This release comes with 14 new packages, and a number of fixes=20 and enhancements. The documentation for this release is available on=20 our website: The remainder of this mail highlights the main changes since the=20 v0.12 release; we hope it will be useful to developers in the process=20 of migrating to the new version. A comprehensive changelog is=20 available at the end. Notable changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Changed `Base', `Core_kernel', and `Core' functions to raise `Not_found_s' instead of `Not_found'. `Hashtbl.find_exn' and `Map.find_exn' now include the key in their error message. =E2=80=A2 Changed `Core' and `Core_kernel' to export `int' comparison=20 rather than polymorphic comparison. =E2=80=A2 Removed the "robust" float comparison operators (`>.', `=3D.',= =20 =E2=80=A6) from the default namespace. =E2=80=A2 Replaced `sexp_*' types (`sexp_list', `sexp_option',=20 `sexp_opaque', =E2=80=A6) with preprocessor attributes (`[@sexp.list]',=20 `[@sexp.option]', `[@sexp.opaque]', =E2=80=A6). =E2=80=A2 Changed `let%map' syntax from `let%map.Foo.Let_syntax' to `let%map.Foo'. =E2=80=A2 Added to `match%optional' support for specifying a path, so=20 you can write `match%optional.Foo foo_option' rather than `let open Foo.Optional_syntax in match%optional foo_option'. =E2=80=A2 Improved `Base.Backtrace' so that it enables recording of=20 backtraces in more situations, specifically when `OCAMLRUNPARAM' is=20 defined but doesn't mention the backtrace flag, `b'. =E2=80=A2 Added javascript support for `Zarith', `Bigint', `Bignum', and `Bigdecimal'. =E2=80=A2 Changed `Hashtbl.create''s default `size' from 128 to 0. =E2=80=A2 Changed `Core_kernel.Command' so that all commands accept=20 double dash flags: `--help', `--version', and `--build-info'. New packages =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 async_udp (): UDP=20 support for Async. =E2=80=A2 async_websocket=20 (): A library that implements the websocket protocol on top of=20 Async. =E2=80=A2 bonsai (): A library for building dynamic webapps, using Js_of_ocaml. =E2=80=A2 postgres_async=20 (): OCaml/async implementation of the postgres protocol (i.e.,=20 does not use C-bindings to libpq). =E2=80=A2 ppx_cold (): Expands `[@cold]' into `[@inline never][@specialise never][@local=20 never]'. =E2=80=A2 ppx_pattern_bind=20 (): A ppx for writing fast incremental bind nodes in a pattern=20 match. =E2=80=A2 ppx_python (): `[@@deriving]' plugin to generate Python conversion functions. =E2=80=A2 ppx_yojson_conv=20 (): `[@@deriving]' plugin to generate Yojson conversion functions. =E2=80=A2 ppx_yojson_conv_lib (): Runtime=20 lib for `ppx_yojson_conv'. =E2=80=A2 pythonlib (): A=20 library to help writing wrappers around OCaml code for python. =E2=80=A2 sexp_select (): A=20 library to use CSS-style selectors to traverse sexp trees. =E2=80=A2 timezone (): Time-zone handling. =E2=80=A2 toplevel_backend=20 (): Shared backend for setting up toplevels. =E2=80=A2 zarith_stubs_js=20 (): Javascript stubs for the Zarith library. Deprecations / Removals =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `Async_kernel': =E2=80=A2 Deprecated monadic `ignore' functions in favor of `ignore_m'. `Base': =E2=80=A2 Deleted `Array.replace' and `replace_all' functions, which=20 have been deprecated since before the last public release. =E2=80=A2 Deprecated `Result.ok_unit'; use `Ok ()'. =E2=80=A2 Removed the `Monad' and `Applicative' interfaces' `all_ignore' function; it was previously deprecated and replaced by=20 `all_unit'. =E2=80=A2 Removed `List.dedup', which has been deprecated since 2017-04. =E2=80=A2 Removed `String' mutation functions, which have been=20 deprecated in favor of `Bytes' since 2017-10. =E2=80=A2 Deprecated `Array.truncate', `Obj_array.unsafe_truncate', and `Uniform_array.unsafe_truncate'. =E2=80=A2 Deprecated `Sys.argv', which has been superseded by=20 `get_argv', which is a function, reflecting the fact that `argv' can=20 change (as of OCaml 4.09). `Core_kernel': =E2=80=A2 Removed `Core_kernel.Std', which had been deprecated for a=20 year. =E2=80=A2 Deprecated type `Command.Spec.param' in favor of=20 `Command.Param.t'. =E2=80=A2 Removed `Hashtbl' functions that had been deprecated for=20 years. =E2=80=A2 Removed `Float.to_string_round_trippable', which has been=20 deprecated in favor of `to_string' since 2017-04. =E2=80=A2 Deprecated `Fqueue' functions where one should use `Fdeque'=20 instead: `bot', `bot_exn', and `enqueue_top'. =E2=80=A2 Deleted `Bus.unsubscribes', which will be obviated by a=20 performance improvement to `Bus.unsubscribe'. `Timing_wheel': =E2=80=A2 Removed the `alarm_upper_bound' function, which has been=20 deprecated for 6 months, and superseded by `max_allowed_alarm_time'. Moves =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `Core_kernel': =E2=80=A2 Moved `Bounded_int_table' to a standalone library. =E2=80=A2 Moved the `Pool' and `Tuple_type' modules to a standalone=20 library, `Tuple_pool'. `Async_unix': =E2=80=A2 Moved `Unix.Fd.replace' into a `Private' submodule. Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C Please visit opam2nix (v1) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Tim Cuthbertson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Anouncing opam2nix (v1) [opam2nix] generates [nix] expressions from the [opam] OCaml=20 package repository. It works similarly to [bundix], [node2nix], etc: You run an (impure) command to resolve all transitive dependency versions using the current opam repository, generating a .nix=20 file that locks down the exact package sources and versions. Then=20 this file can be imported to provide `buildInputs' for building your ocaml project in nix. *What is nix and why would I care?* Well, that's a long story=20 but the headline benefits of nix are: =E2=80=A2 reproducible builds (if it builds for me, it builds for you) =E2=80=A2 stateless (you don't set up switches and then install=20 packages, each expression specifies everything it needs, and anything you=20 don't have is fetched/built on demand) =E2=80=A2 language agnostic (takes care of non-ocaml dependencies) It's sadly not a shallow learning curve, but those benefits are=20 hard to find elsewhere, so I obviously think it's worthwhile. So if=20 you use nix (or would like to), please give it a try and provide feedback. I'll (slowly) start working on upstreaming it into=20 nixpkgs. [opam2nix] [nix] [opam] [bundix] [node2nix] GitHub Actions for OCaml / opam now available =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 I was in the [GitHub Actions] beta program and forward ported my=20 code to the latest version that just went public. It's a pretty=20 simple way to get your OCaml code tested on Linux, macOS and Windows,=20 without requiring an external CI service. The action attempts to=20 provide a homogenous interface across all three operating systems, so=20 invoking 'opam' from subsequent actions should "just work". You can find it here: =E2=80=A2 In the GitHub Marketplace at =E2=80=A2 Source code on =E2=80=A2 Hello World usage on =E2=80=A2 Usage in ocaml-yaml: =E2=80=A2=20 =E2=80=A2 An [example ocaml-yaml run] This should be considered fairly experimental as GH Actions is=20 so new. If you do use it, then consider [updating this issue with your=20 usage]. It does not current supporting caching yet, but is pretty fast=20 to bootstrap (~4minutes). It also doesn't have any higher level purpose other than to set=20 up an opam environment, since most of the additional functionality=20 such as revdeps testing is planned for addition to the [ocurrent DSL]. Nevertheless, this GH feature will hopefully be useful for=20 smaller projects without a lot of computational requirements. Let me=20 know how it goes! Windows is currently supported through @fdopen's excellent fork=20 that uses Cygwin. As Windows support is being mainlined into opam=20 itself at the moment, I'm hoping that we will gradually move over to=20 that. That should eventually remove the need for two separate opam-repositories, so I won't be adding any features that are=20 Linux or macOS-specific and do not work on the Cygwin version. [GitHub Actions] [example ocaml-yaml run] [updating this issue with your usage] [ocurrent DSL] OCurrent 0.1 (CI/CD pipeline eDSL) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [OCurrent] 0.1 has just been released to opam-repository. OCurrent is an OCaml eDSL intended for writing build/test/deploy pipelines. It is being used as the engine for [ocaml-ci] and the [docker-base-images] builder (used to build the OCaml Docker=20 images, such as `ocurrent/opam:alpine-3.10-ocaml-4.08'). Other good uses=20 might be building and redeploying a Docker service or a unikernel=20 whenever its source repository changes. It can be run locally as a single=20 Unix process. An OCurrent pipeline is written as an OCaml program, but the=20 OCurrent engine ensures that it is kept up-to-date by re-running stages=20 when their inputs change. A web UI is available so you can view your pipeline and see its current state. OCurrent can statically analyse the pipelines before they have=20 run, allowing it to run steps in parallel automatically and to=20 display the whole pipeline. It does this using a light-weight alternative to arrows, which doesn't require programming in an awkward=20 point-free style. See [CI/CD Pipelines: Monad, Arrow or Dart?] for more=20 about that. The basic functionality can be extended using "plugins" (just=20 normal OCaml libraries). Plugins are available for interacting with=20 Docker, Git, GitHub and Slack. These are in separate packages (e.g. `current_github') to avoid having the base package pull in=20 too many dependencies). There is also an optional Cap'n Proto RPC interface, in the `current_rpc' opam package. This is used, for example, by=20 [citty] to provide a TTY interface to ocaml-ci. [The OCurrent wiki] contains examples, and documentation on the various plugins. Here's an example pipeline (from the base image builder): [OCurrent] [ocaml-ci] [docker-base-images]=20 [CI/CD Pipelines: Monad, Arrow or Dart?] [citty] [The OCurrent wiki] Anil Madhavapeddy then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 For those curious about the relation to the existing CI used in opam-repository, then it is no coincidence that @talex5 is the=20 author of both :-) This DSL is the next iteration of the [datakit-ci], but=20 specialised to be faster and simpler for extending with OCaml and more complex workflows that our OCaml Platform tools need these days (like ocamlformat linting, or dune expect promotion, or odoc cross-referenced doc generation). We are planning a smooth=20 migration next year over to the new system, but wanted to release this=20 early to show you some of the pieces going into this new iteration. I am particularly excited about the new tty-based interface that=20 saves an awful lot of clicking around on web UIs for CI results=E2=80=A6 [datakit-ci] New pages for OCaml API =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive:=20 Continuing this thread, sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have uploaded a new version (same link ) =E2=80=A2 background color for links in the TOC @Maelan =E2=80=A2 more indentation for value descriptions @Maelan, @grayswandyr =E2=80=A2 word wrapping long `
' codes @grayswandyr
  =E2=80=A2 type table: remove `(*' and `*)', give more space to code wrt
    comments, diminish comment's color @grayswandyr

  searching is not ready yet=E2=80=A6 please wait suggestions for dark=20
  theme
  welcome


sanette later added
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80

  I have just uploaded a new version with a basic search engine.
  =E2=80=A2 for each page, you can search values/modules
  =E2=80=A2 in the general index page, the search includes also the=20
  descriptions
  =E2=80=A2 search results are ranked by relevance

  the downside is that each page now comes with an index of about=20
  570Kb
  in the form of an index.js file. I'm kind of hoping that the=20
  browser
  will cache this, but I'm not sure. It would be maybe better to=20
  only
  load the index file on demand.


Irmin 2.0.0 release
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90

  Archive:=20
  


Thomas Gazagnaire announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80

  On behalf of the Irmin development team, I am very happy to=20
  announce
  the release of Irmin 2.0.0, a major release of the Git-like
  distributed branching and storage substrate that underpins
  [MirageOS]. We began the release process for all the components=20
  that
  make up Irmin [back in May 2019], and there have been close to=20
  1000
  commits since Irmin 1.4.0 released back in June 2018. To=20
  celebrate
  this milestone, we have a new logo and opened a dedicated=20
  website:
  [irmin.org].

  More details here:=20
  


[MirageOS] 

[back in May 2019]


[irmin.org] 


Tail cascade: a new indentation style for some OCaml constructs
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=
=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=
=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90

  Archive:
  


gasche announced
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  I recently decided to change my indentation style for certain=20
  OCaml
  constructs in a way that I'm going to describe below. I just=20
  coined a
  name for this approach, "tail cascade". I'm creating this topic=20
  to
  convince everyone that this is a cool idea you should adopt as
  well. Or at least tolerate it when you review other people's=20
  code.


Problem
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  Programs that heavily use `match' often see a shift to the right=20
  due
  to nested indentation.

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 match foo with
  =E2=94=82 | Foo -> ...
  =E2=94=82 | Bar x ->
  =E2=94=82   match bar x with
  =E2=94=82   | FooBar -> ...
  =E2=94=82   | Blah y ->
  =E2=94=82     match f y with
  =E2=94=82     | Some z ->
  =E2=94=82       ...
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Another problem with this style is that it suffers from the=20
  "dangling
  bar" issue: if you try to add a new case for one of the exterior
  `match', it is parsed as belonging to the innermost `match'.=20
  People
  have been recommending (rightly) to use `begin match .. end' for=20
  all
  nested match constructs to avoid this issue.

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 match foo with
  =E2=94=82 | Foo -> ...
  =E2=94=82 | Bar x ->
  =E2=94=82   begin match bar x with
  =E2=94=82   | FooBar -> ...
  =E2=94=82   | Blah y ->
  =E2=94=82     begin match f y with
  =E2=94=82     | None -> ...
  =E2=94=82     | Some z ->
  =E2=94=82       ...
  =E2=94=82     end
  =E2=94=82   (* now this is safe *)
  =E2=94=82   | FooBlah -> ...
  =E2=94=82   end
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  But still the unpleasant shift to the right remains.


Proposal: cascading tail case
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C

  We should in general use `begin match .. end' for nested=20
  matches. But
  the "cascading tail case" proposal is to *not* do it for the=20
  *last*
  case of the pattern-matching, and instead *de-indent* (dedent)=20
  this
  last case =E2=80=93 tail case.

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 match foo with
  =E2=94=82 | Foo -> ...
  =E2=94=82 | Bar x ->
  =E2=94=82 match bar x with
  =E2=94=82 | FooBar -> ...
  =E2=94=82 | Blah y ->
  =E2=94=82 match f y with
  =E2=94=82 | None -> ...
  =E2=94=82 | Some z ->
  =E2=94=82 ...
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Note that with this indentation style, the "dangling match"=20
  problem is
  also avoided: unlike with the original, non `end'-protected=20
  program,
  the indentation makes it immediately obvious that any further=20
  case
  will be attached to the innermost match, and not any of the=20
  exterior
  ones.

  A program using this "cascading tail" approach should always use
  `begin match .. end' for nested matches, except for a nested=20
  match
  returned within the last branch of an outer match, which can
  (optionally) be dedented instead.

  The choice to dedent the last case corresponds to encouraging a
  sequential reading of the program, where the other cases are
  "auxiliary cases" checked first and dispatched quickly, and the=20
  last
  case is the "main part" where the "rest" of the logic of the=20
  program
  lies. This pattern is typical of nested pattern-matching on the
  `option' or `result' type for example:

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 match foo x with
  =E2=94=82 | Error err ->
  =E2=94=82   fail_foo_error err
  =E2=94=82 | Ok y ->
  =E2=94=82 match bar y with
  =E2=94=82 | Error err ->
  =E2=94=82   fail_bar_error err
  =E2=94=82 | Ok () ->
  =E2=94=82 ...
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Remark: it is *not* always the case that the `Error' constructor=20
  is
  the auxiliary case, and the `Ok' constructor is the main case;
  sometimes we implement fallback logic like "if `foo' work then=20
  we are
  good, but otherwise we have to do this and that", and the error=20
  case
  is the most salient (and longer) part of the program logic. I=20
  would
  recommend being mindful, when you write code, of whether there=20
  is a
  most convincing way to "sequentialize" it (distinguish auxiliary=20
  and
  main/tail case), and avoid using cascading tails when there is=20
  no
  clear sequentialization choice.

  Remark: some cases of tail cascades can be linearized by using a=20
  good
  definition of "bind" and a monadic style. This tends to be very
  limited however: it fixes one of the constructors to always be=20
  the
  "tail" constructor (always `Some', always `Ok'), and it only=20
  works
  when the handling of the other constructors is very homogeneous
  (typically: return directly). In real code, many situations=20
  occur
  where the monadic style doesn't fit the problem, but tail=20
  cascade does
  help writing a readable program.


Generalization: tail cascade
=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=
=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=
=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=
=E2=95=8C=E2=95=8C=E2=95=8C

  While I have never seen cascading tail cases in real-world OCaml=20
  code
  before (I'm happy to be given pointers; I think that the idea is=20
  not
  new, but I'm not aware of previous attempts to give it a catchy=20
  name
  and spread the cascade love), this is in fact a new (to me)=20
  instance
  of a common technique that is used for other OCaml constructs:

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 if foo x then ...
  =E2=94=82 else if bar x then ...
  =E2=94=82 else ... (* this `tail else` was dedented *)
  =E2=94=82
  =E2=94=82 let x =3D foo in
  =E2=94=82 let y =3D bar in (* this `tail let` was dedented *)
  =E2=94=82 ...            (* and the rest as well *)
  =E2=94=82
  =E2=94=82 bind foo @@ fun x ->
  =E2=94=82 bind bar @@ fun y -> (* this "tail function body" was dedented=
=20
  *)
  =E2=94=82 ...                  (* and the rest as well *)
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  I would call "tail cascade" (or maybe: "cascading tail") the=20
  idea of
  dedenting the "rest" of an OCaml expression (compared to a=20
  strict
  tree-nesting-based approach) when it morally describes the=20
  "rest" of
  the expression. I use the name "tail" because those expressions=20
  are
  almost always in tail-position in the sense of tail-calls.

  This general approach legitimizes some styles that I have seen,=20
  and
  sometimes used, in the wild, while at the same time considering=20
  that I
  may have been doing something improper, for example:

  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 if foo then blah else
  =E2=94=82 ... (* dedented *)
  =E2=94=82
  =E2=94=82
  =E2=94=82 Fun.protect
  =E2=94=82   ~finally:(...)
  =E2=94=82 @@ fun () ->
  =E2=94=82 ... (* dedented *)
  =E2=94=82
  =E2=94=82
  =E2=94=82 try simple_approach with exn ->
  =E2=94=82 ... (* dedented *)
  =E2=94=82
  =E2=94=82
  =E2=94=82 1 +
  =E2=94=82 2 + (* dedented *)
  =E2=94=82 ... (* dedented *)
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  Remark: after a `then' or `else', many people share the=20
  reasonable
  view that any expression containing imperative constructs (`foo;=20
  bar')
  should be enclosed in a `begin .. end' block to avoid
  surprising-precedence issue. Just as for nested `match', this
  recommendation should be lifted for "tail else" constructs.

  Remark: The last example is a case where the dedented=20
  expressions are
  *not* in tail-position from a runtime-evaluation point of view.=20
  I am
  not sure as whether the two notions should be made to coincide=20
  more
  strongly, but in any case I'm not fond of the style in this=20
  particular
  example, I prefer to move the infix operator to the beginning of=20
  the
  next line instead, following a different style and=20
  justification.

  The possibility this "cascading tail" style today crucially=20
  relies on
  the nesting properties of open-ended syntactic constructs,=20
  notably
  `let' (commonly cascaded), and now `match' and `if
  ... else'. Proposals to transition to a syntax where `match' and
  `else' are forced to take a closing marker are incompatible with=20
  the
  cascading style. I have not made my mind on whether this should=20
  be
  considered a blocker for those proposals, but at least it shows=20
  that
  having the open-ended form available has value for certain=20
  programs.


Louis Gesbert then said
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80

  @gasche I prototyped a dedicated option in `ocp-indent', if=20
  you're
  interested in trying it out :)
  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80
  =E2=94=82 opam pin=20
  git+https://github.com/OCamlPro/ocp-indent#match-tail-cascade
  =E2=94=82 echo "match_tail_cascade=3Dtrue" >> ~/.ocp-indent
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80


Old CWN
=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90

  If you happen to miss a CWN, you can [send me a message] and=20
  I'll mail
  it to you, or go take a look at [the archive] or the [RSS feed=20
  of the
  archives].

  If you also wish to receive it every week by mail, you may=20
  subscribe
  [online].

  [Alan Schmitt]


[send me a message] 

[the archive] 

[RSS feed of the archives]=20


[online] 

[Alan Schmitt] 


--==-=-=
Content-Type: text/html
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable








OCaml Weekly News







OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 19 to 26, 20= 19.

tiny_httpd 0.1

Simon Cruanes announced

Hello and good morning, I'm pleased to announce that tiny_httpd 0.1 has been released and is on o= pam.

The goal is to emulate python's standard http.server by provid= ing a 0-dependencies, minimalist, simple HTTP server for embedding in appli= cations that are not primarily a website, with very basic routing (thanks t= o Scanf). A binary http_of_dir is also distribute= d and can be used to serve a directory, with optional upload of files.

printbox.0.3

Simon Cruanes announced

3D"8e7c55c5ab69=

let b =3D
  let open PrintBox in
  PrintBox_unicode.setup();
  frame @@ grid_l [
    [text "subject"; text_with_style=
 Style.bold "announce: printbox 0.3"];
    [text "explanation";
    frame @@ text {|PrintBox is a library for rendering nested tables,
    trees, and similar structures in monosp=
ace text or HTML.|}];
    [text "github";
    text_with_style Style.(bg_color =
Blue) "https://github.com/c-cube/printbox/releases/t=
ag/0.3"];
    [text "contributors";
     vlist_map (text_with_style Style.(fg_color Gree=
n)) ["Simon"; "Guillaume"; "Matt"=
]];
    [text "dependencies";
    tree empty
      [tree (text "mandatory")
         [text "dune"; text "bytes"];
       tree (text "optional")
         [text "uutf"; text "uucp"; text "tyxml"]]];
    [text "expected reaction"; text =
"🎉"];
  ]

let () =3D print_=
endline @@ PrintBox_text.to_string b

(actual lin= k to the release)

v0.13 release of Jane Street packages

Xavier Clerc announced

We are pleased to announce the v0.13 release of Jane Street packages!

This release comes with 14 new packages, and a number of fixes and enhancements. The documentation for this release is available on our website:

https://ocam= l.janestreet.com/ocaml-core/v0.13/doc/

The remainder of this mail highlights the main changes since the v0.12 release; we hope it will be useful to developers in the process of migrating to the new version. A comprehensive changelog is available at the end.

Notable changes

  • Changed Base, Core_kernel, and Core functions to raise Not_found_s instead of Not_found. Hashtbl.= find_exn and Map.find_exn now include the key in their error message.
  • Changed Core and Core_kernel to export = int comparison rather than polymorphic comparison.
  • Removed the "robust" float comparison operators (>., =3D., …) from the default namespace.
  • Replaced sexp_* types (sexp_list, sexp_= option, sexp_opaque, …) with preprocessor attributes ([@sexp.list], [@= sexp.option], [@sexp.opaque], …).
  • Changed let%map syntax from let%map.Foo.Let_syntax to let%map.Foo.
  • Added to match%optional support for specifying a path, so = you can write match%optional.Foo foo_option rather than let open Foo.Optional_syntax in match%optional foo_option.
  • Improved Base.Backtrace so that it enables recording of ba= cktraces in more situations, specifically when OCAMLRUNPARAM is defined= but doesn't mention the backtrace flag, b.
  • Added javascript support for Zarith, Bigint, = Bignum, and Bigdecimal.
  • Changed Hashtbl.create's default size from 12= 8 to 0.
  • Changed Core_kernel.Command so that all commands accept do= uble dash flags: --help, --version, and --build-= info.

New packages

Deprecations / Removals

Async_kernel:

  • Deprecated monadic ignore functions in favor of igno= re_m.

Base:

  • Deleted Array.replace and replace_all functio= ns, which have been deprecated since before the last public release.
  • Deprecated Result.ok_unit; use Ok ().
  • Removed the Monad and Applicative interfaces'= all_ignore function; it was previously deprecated and replaced by all_unit.
  • Removed List.dedup, which has been deprecated since 2017-0= 4.
  • Removed String mutation functions, which have been depreca= ted in favor of Bytes since 2017-10.
  • Deprecated Array.truncate, Obj_array.unsafe_truncate= , and Uniform_array.unsafe_truncate.
  • Deprecated Sys.argv, which has been superseded by ge= t_argv, which is a function, reflecting the fact that argv can change = (as of OCaml 4.09).

Core_kernel:

  • Removed Core_kernel.Std, which had been deprecated for a y= ear.
  • Deprecated type Command.Spec.param in favor of Comma= nd.Param.t.
  • Removed Hashtbl functions that had been deprecated for yea= rs.
  • Removed Float.to_string_round_trippable, which has been de= precated in favor of to_string since 2017-04.
  • Deprecated Fqueue functions where one should use Fde= que instead: bot, bot_exn, and enqueue_top.
  • Deleted Bus.unsubscribes, which will be obviated by a perf= ormance improvement to Bus.unsubscribe.

Timing_wheel:

  • Removed the alarm_upper_bound function, which has been dep= recated for 6 months, and superseded by max_allowed_alarm_time.

Moves

Core_kernel:

  • Moved Bounded_int_table to a standalone library.
  • Moved the Pool and Tuple_type modules to a st= andalone library, Tuple_pool.

Async_unix:

  • Moved Unix.Fd.replace into a Private submodul= e.

opam2nix (v1)

Tim Cuthbertson announced

Anouncing opam2nix (v1)

opam2nix generates <= a href=3D"https://nixos.org/">nix expressions from the opam OCaml package repository. It works similarly t= o bundix, node2nix, etc:

You run an (impure) command to resolve all transitive dependency versions u= sing the current opam repository, generating a .nix file that locks down th= e exact package sources and versions. Then this file can be imported to pro= vide buildInputs for building your ocaml project in nix.

What is nix and why would I care? Well, that's a long story but the = headline benefits of nix are:

  • reproducible builds (if it builds for me, it builds for you)
  • stateless (you don't set up switches and then install packages, each ex= pression specifies everything it needs, and anything you don't have is fetc= hed/built on demand)
  • language agnostic (takes care of non-ocaml dependencies)

It's sadly not a shallow learning curve, but those benefits are hard to fin= d elsewhere, so I obviously think it's worthwhile. So if you use nix (or wo= uld like to), please give it a try and provide feedback. I'll (slowly) star= t working on upstreaming it into nixpkgs.

GitHub Actions for OCaml / opam now available

Anil Madhavapeddy announced

I was in the GitHub Actions beta= program and forward ported my code to the latest version that just went pu= blic. It's a pretty simple way to get your OCaml code tested on Linux, mac= OS and Windows, without requiring an external CI service. The action attem= pts to provide a homogenous interface across all three operating systems, s= o invoking 'opam' from subsequent actions should "just work".

You can find it here:

This should be considered fairly experimental as GH Actions is so new. If = you do use it, then consider updating this issue with your usage. It does not current su= pporting caching yet, but is pretty fast to bootstrap (~4minutes).

It also doesn't have any higher level purpose other than to set up an opam = environment, since most of the additional functionality such as revdeps tes= ting is planned for addition to the ocurrent DSL. Neverthele= ss, this GH feature will hopefully be useful for smaller projects without a= lot of computational requirements. Let me know how it goes!

Windows is currently supported through @fdopen's excellent fork that uses C= ygwin. As Windows support is being mainlined into opam itself at the mome= nt, I'm hoping that we will gradually move over to that. That should event= ually remove the need for two separate opam-repositories, so I won't be add= ing any features that are Linux or macOS-specific and do not work on the Cy= gwin version.

OCurrent 0.1 (CI/CD pipeline eDSL)

Thomas Leonard announced

OCurrent 0.1 has just = been released to opam-repository.

OCurrent is an OCaml eDSL intended for writing build/test/deploy pipelines.= It is being used as the engine for ocaml-ci and the docker-base-images builder (used to build the OCaml Doc= ker images, such as ocurrent/opam:alpine-3.10-ocaml-4.08). Oth= er good uses might be building and redeploying a Docker service or a uniker= nel whenever its source repository changes. It can be run locally as a sing= le Unix process.

An OCurrent pipeline is written as an OCaml program, but the OCurrent engin= e ensures that it is kept up-to-date by re-running stages when their inputs= change. A web UI is available so you can view your pipeline and see its cu= rrent state.

OCurrent can statically analyse the pipelines before they have run, allowin= g it to run steps in parallel automatically and to display the whole pipeli= ne. It does this using a light-weight alternative to arrows, which doesn't = require programming in an awkward point-free style. See CI/CD= Pipelines: Monad, Arrow or Dart? for more about that.

The basic functionality can be extended using "plugins" (just normal OCaml = libraries). Plugins are available for interacting with Docker, Git, GitHub = and Slack. These are in separate packages (e.g. current_github= ) to avoid having the base package pull in too many dependencies).

There is also an optional Cap'n Proto RPC interface, in the current_r= pc opam package. This is used, for example, by citty to provide a TTY interface to ocaml-ci.

The OCurrent wiki= contains examples, and documentation on the various plugins.

Here's an example pipeline (from the base image builder):

3D"docker-base-images-thumb.png"

Anil Madhavapeddy then added

For those curious about the relation to the existing CI used in opam-reposi= tory, then it is no coincidence that @talex5 is the author of both :-)

This DSL is the next iteration of the datakit-ci, but specialised to be faster and simpler for extendi= ng with OCaml and more complex workflows that our OCaml Platform tools need= these days (like ocamlformat linting, or dune expect promotion, or odoc cr= oss-referenced doc generation). We are planning a smooth migration next ye= ar over to the new system, but wanted to release this early to show you som= e of the pieces going into this new iteration. I am particularly excited a= bout the new tty-based interface that saves an awful lot of clicking around= on web UIs for CI results…

New pages for OCaml API

Continuing this thread, sanette announced

I have uploaded a new version (same link https://sanette.github.io/ocaml-api/)

  • background color for links in the TOC @Maelan
  • more indentation for value descriptions @Maelan, @grayswandyr
  • word wrapping long <pre> codes @grayswandyr
  • type table: remove (* and *), give more space= to code wrt comments, diminish comment's color @grayswandyr

searching is not ready yet… please wait suggestions for dark theme welcome

sanette later added

I have just uploaded a new version with a basic search engine.

  • for each page, you can search values/modules
  • in the general index page, the search includes also the descriptions
  • search results are ranked by relevance

the downside is that each page now comes with an index of about 570Kb in th= e form of an index.js file. I'm kind of hoping that the browser will cache = this, but I'm not sure. It would be maybe better to only load the index fil= e on demand.

Irmin 2.0.0 release

Thomas Gazagnaire announced

On behalf of the Irmin development team, I am very happy to announce the re= lease of Irmin 2.0.0, a major release of the Git-like distributed branching= and storage substrate that underpins Mirage= OS. We began the release process for all the components that make up Ir= min back in May 2019, and there have been close to 1000 commits since Irmi= n 1.4.0 released back in June 2018. To celebrate this milestone, we have a = new logo and opened a dedicated website: irm= in.org.

More details here: https://tarides.com/blog/2019-11-21-irmin-v2

Tail cascade: a new indentation style for some OCaml construct= s

gasche announced

I recently decided to change my indentation style for certain OCaml constru= cts in a way that I'm going to describe below. I just coined a name for thi= s approach, "tail cascade". I'm creating this topic to convince everyone th= at this is a cool idea you should adopt as well. Or at least tolerate it wh= en you review other people's code.

Problem

Programs that heavily use match often see a shift to the right= due to nested indentation.

match f=
oo with
| Foo -&g=
t; ...
| Bar x -=
>
  match bar x with
  | FooBar -> ...
  | Blah =
y ->
    match f y with
    | Some z ->
      ...

Another problem with this style is that it suffers from the "dangling bar" = issue: if you try to add a new case for one of the exterior match, it is parsed as belonging to the innermost match. People = have been recommending (rightly) to use begin match .. end for= all nested match constructs to avoid this issue.

match f=
oo with
| Foo -&g=
t; ...
| Bar x -=
>
  begin match bar x w=
ith
  | FooBar -> ...
  | Blah =
y ->
    begin match f y w=
ith
    | None -> ...
    | Some z ->
      ...
    end
  (* now this is safe *)
  | FooBlah -> ...
  end

But still the unpleasant shift to the right remains.

Proposal: cascading tail case

We should in general use begin match .. end for nested matches= . But the "cascading tail case" proposal is to not do it for the = last case of the pattern-matching, and instead de-indent (dedent= ) this last case – tail case.

match f=
oo with
| Foo -&g=
t; ...
| Bar x -=
>
match bar x with
| FooBar =
-> ...
| Blah y =
->
match f y with
| None -&=
gt; ...
| Some z =
->
...

Note that with this indentation style, the "dangling match" problem is also= avoided: unlike with the original, non end-protected program,= the indentation makes it immediately obvious that any further case will be= attached to the innermost match, and not any of the exterior ones.

A program using this "cascading tail" approach should always use begi= n match .. end for nested matches, except for a nested match returne= d within the last branch of an outer match, which can (optionally) be deden= ted instead.

The choice to dedent the last case corresponds to encouraging a sequential = reading of the program, where the other cases are "auxiliary cases" checked= first and dispatched quickly, and the last case is the "main part" where t= he "rest" of the logic of the program lies. This pattern is typical of nest= ed pattern-matching on the option or result type = for example:

match f=
oo x with
| Error e=
rr ->
  fail_foo_error err
| Ok y -&=
gt;
match bar y with
| Error e=
rr ->
  fail_bar_error err
| Ok () -=
>
...

Remark: it is not always the case that the Error constr= uctor is the auxiliary case, and the Ok constructor is the mai= n case; sometimes we implement fallback logic like "if foo wor= k then we are good, but otherwise we have to do this and that", and the err= or case is the most salient (and longer) part of the program logic. I would= recommend being mindful, when you write code, of whether there is a most c= onvincing way to "sequentialize" it (distinguish auxiliary and main/tail ca= se), and avoid using cascading tails when there is no clear sequentializati= on choice.

Remark: some cases of tail cascades can be linearized by using a good defin= ition of "bind" and a monadic style. This tends to be very limited however:= it fixes one of the constructors to always be the "tail" constructor (alwa= ys Some, always Ok), and it only works when the h= andling of the other constructors is very homogeneous (typically: return di= rectly). In real code, many situations occur where the monadic style doesn'= t fit the problem, but tail cascade does help writing a readable program.

Generalization: tail cascade

While I have never seen cascading tail cases in real-world OCaml code befor= e (I'm happy to be given pointers; I think that the idea is not new, but I'= m not aware of previous attempts to give it a catchy name and spread the ca= scade love), this is in fact a new (to me) instance of a common technique t= hat is used for other OCaml constructs:

if foo =
x then ...
else if bar x then ...
else ... (* this `tail else` was dedente=
d *)

let x =3D foo in
let y =3D bar in (* this `tail let` was dedented *)
...            (* and the rest as well *=
)

bind foo @@ fun x ->
bind bar @@ fun y -> (* this "tail=
 function body" was dedented *)
...                  (* and the rest as well *)

I would call "tail cascade" (or maybe: "cascading tail") the idea of dedent= ing the "rest" of an OCaml expression (compared to a strict tree-nesting-ba= sed approach) when it morally describes the "rest" of the expression. I use= the name "tail" because those expressions are almost always in tail-positi= on in the sense of tail-calls.

This general approach legitimizes some styles that I have seen, and sometim= es used, in the wild, while at the same time considering that I may have be= en doing something improper, for example:

if foo =
then blah else
... (* dedented *)


Fun.protect
  ~finally:(...)
@@ f=
un () ->
... (* dedented *)


try simple_approach with exn ->
... (* dedented *)


1 +
2 + (* dedented *)
... (* dedented *)

Remark: after a then or else, many people share t= he reasonable view that any expression containing imperative constructs (foo; bar) should be enclosed in a begin .. end bloc= k to avoid surprising-precedence issue. Just as for nested match, this recommendation should be lifted for "tail else" constructs.

Remark: The last example is a case where the dedented expressions are no= t in tail-position from a runtime-evaluation point of view. I am not su= re as whether the two notions should be made to coincide more strongly, but= in any case I'm not fond of the style in this particular example, I prefer= to move the infix operator to the beginning of the next line instead, foll= owing a different style and justification.

The possibility this "cascading tail" style today crucially relies on the n= esting properties of open-ended syntactic constructs, notably let (commonly cascaded), and now match and if ... else. Proposals to transition to a syntax where match and else are forced to take a closing marker are incompatible with th= e cascading style. I have not made my mind on whether this should be consid= ered a blocker for those proposals, but at least it shows that having the o= pen-ended form available has value for certain programs.

Louis Gesbert then said

@gasche I prototyped a dedicated option in ocp-indent, if you'= re interested in trying it out :)

opam pin git+https://github.com/OCamlPro/ocp-i=
ndent#match-tail-cascade
echo "match_tail_cascade=3Dtrue" >> ~/.ocp-indent

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3c42EACgkQBA0KO07S 5cfB9gf/czKc6TFbofxgE9nIYYCFKHj/ugAahe9Tj3tz9r4XsjOui8PmVJVkR1Pz vePH8oPCB72YPB8kUUYmCSdfy/g+VgujiDa1FDbJcMo+lFcDFtouEZsIS/FI31hR 4LehomvbjLb/x6Yd10DUarCptHoHnBXssg3FKkeP08GJHiO+qPoQTu/QEy4nASET DYy5zYhZ+XEheArpV52gFr2yUFEMXRhbLNVp+g4retI9WAwsBH5loHnNoQeOXAyq 3I4sYxQH2IxPHoM1k1NjDD2B0Ktj4T3fslfbSrhDDqOEscQOlorAFO0z522bMmB4 XW8SKn5MLDQEM4lWh+NCzIJA5DnOXw== =Xjob -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B25027F332 for ; Tue, 3 Dec 2019 16:42:57 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,273,1571695200"; d="asc'?scan'208,217";a="417352768" Received: from 207-7-99-34.oc.nextlevelinternet.com (HELO set) ([207.7.99.34]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 03 Dec 2019 16:42:54 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 03 Dec 2019 16:42:51 +0100 Message-ID: <878sntl8jo.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTm92ZW1iZXIgMjYgDQp0bw0KRGVjZW1iZXIg MDMsIDIwMTkuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSXJt aW4gMi4wLjAgcmVsZWFzZQ0KSG93IHZpYWJsZSBpcyBkZWxpdmVyaW5nIGJp bmFyaWVzIGxpbmtlZCB0byBDeWd3aW4gdG8gV2luZG93cyANCmN1c3RvbWVy cz8NCkR1bmUgMi4wLjANCkFkdmFuY2VkIEMgYmluZGluZyB1c2luZyBvY2Ft bC1jdHlwZXMgYW5kIGR1bmUNClVwY29taW5nIGJyZWFraW5nIGNoYW5nZSBp biBCYXNlL0NvcmUgdjAuMTQNCkNJL0NEIFBpcGVsaW5lczogTW9uYWQsIEFy cm93IG9yIERhcnQ/DQpVc2Ugb2YgZnVuY3RvcnMgdG8gYXBwcm94aW1hdGUg RiMgc3RhdGljYWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0KT2xk IENXTg0KDQoNCklybWluIDIuMC4wIHJlbGVhc2UNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IA0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1pcm1pbi0yLTAtMC1yZWxlYXNlLzQ3NDYvNT4NCg0KDQpDb250aW51 aW5nIHRoaXMgdGhyZWFkLCBzYW1vaHQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBBbmQgdGhlcmUgaXMgbm93IGEg Zm9sbG93LXVwIGJsb2cgcG9zdCwgZXhwbGFpbmluZyBob3cgdG8gdXNlIA0K ICB0aGUgbmV3DQogIEdyYXBoUUwgQVBJIGF2YWlsYWJsZSBpbiBJcm1pbjI6 DQogIDxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAxOS0xMS0yNy1pbnRy b2R1Y2luZy1pcm1pbi1ncmFwaHFsPi4NCg0KDQpIb3cgdmlhYmxlIGlzIGRl bGl2ZXJpbmcgYmluYXJpZXMgbGlua2VkIHRvIEN5Z3dpbiB0byBXaW5kb3dz IA0KY3VzdG9tZXJzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9ob3ctdmlhYmxlLWlzLWRlbGl2ZXJpbmctYmluYXJpZXMtbGlu a2VkLXRvLWN5Z3dpbi10by13aW5kb3dzLWN1c3RvbWVycy80Nzc1Pg0KDQoN Cm1iYWNhcmVsbGEgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGluIHRoZSBlYXJs eSBzdGFnZXMgb2YgcGxhbm5pbmcgYSBkZWxpdmVyYWJsZSBiaW5hcnkgcHJv ZHVjdCANCiAgdGhhdA0KICB3aWxsIHJ1biBvbiBMaW51eCwgTWFjIGFuZCBX aW5kb3dzLg0KDQogIE15IGJyaWVmIHNuaWZmIG9mIHRoZSBhaXIgYXJvdW5k IHRoZSBPQ2FtbCBlY29zeXN0ZW0gc2F5cyBJIA0KICBzaG91bGQNCiAgZXhw ZWN0IHRvIHRhcmdldCBDeWd3aW4gdG8gZ2V0IFdpbmRvd3MgZ29pbmcgKGFs dGhvdWdoIHRoZXJl4oCZcw0KICBpbXByZXNzaXZlIHdvcmsgdG8gZ2V0IG5h dGl2ZSBXaW5kb3dzIHN0dWZmIGRvbmUgdGhhdCBjYW4gYmVjb21lIA0KICB0 aGUNCiAgcHJlZmVycmVkIGFwcHJvYWNoIGluIGEgZmV3IHllYXJzKS4NCg0K ICBNeSBleHBlcmllbmNlIHVzaW5nIEN5Z3dpbiBhcyBhbiBvcGVyYXRpbmcg ZW52aXJvbm1lbnQgaXMgdGhhdCANCiAgaXTigJlzDQogIHByZXR0eSBkYXJu IHNsdWdnaXNoIGNvbXBhcmVkIHRvIExpbnV4IG9uIHRoZSBzYW1lIGNvbXB1 dGVyLg0KDQogIFdoeSBpcyB0aGlzPyBUaGVyZeKAmXMgYW4gYW5lY2RvdGUg dGhhdCBzYXlzIEN5Z3dpbiBjYW4gb25seSBmb3JrIA0KICBhdA0KICBhYm91 dCAzMC01MHggYSBzZWNvbmQgb24gV2luZG93cywgZHVlIHRvIGhvdyBpdCBo YXMgdG8gYWRhcHQgaXQgDQogIHRvDQogIHdvcmsgd2l0aGluIFdpbmRvd3Pi gJkgdGFzayBzcGF3bmluZyBtb2RlbC4gKEZvciBjb250cmFzdCwgTGludXgg DQogIGNhbg0KICBhY2hpZXZlIHRob3VzYW5kcyBvZiBmb3JrcyBwZXIgc2Vj b25kIGlmIHlvdSBwbGF5IGFyb3VuZCB3aXRoIA0KICBpdCkuDQoNCiAgSSB1 bmRlcnN0YW5kIGZyb20gYW5vdGhlciBwcm9kdWN0IGRldmVsb3BlciB0aGF0 IHdoZW4gdGhleSBidWlsZA0KICBiaW5hcmllcyB0byBkZWxpdmVyIHRvIFdp bmRvd3MvQ3lnd2luLCB0aGV5IGFjdHVhbGx5IA0KICBjcm9zcy1jb21waWxl IG9uDQogIExpbnV4IGJlY2F1c2Ugb2YgaG93IHNsb3dseSB0aGUgdG9vbGNo YWluIHJ1bnMgb24gQ3lnd2luLg0KDQogIFRoYXQgc291bmRzIGxpa2UgYmFk IG5ld3MgaWYgeW91IHdhbnQgdG8gZG8gVU5JWHkgdGhpbmdzLCBidXQgDQog IGZvciBhDQogIHNpbmdsZSBzdGFuZGFsb25lIGFwcGxpY2F0aW9uIHRoaXMg bWlnaHQgbm90IGJlIHNvIGJhZD8gSSBhc3N1bWUgDQogIGlmIEkNCiAgc2hp cCBhIGRlbGl2ZXJhYmxlIHRvIFdpbmRvd3MvQ3lnd2luLCB0aGUgZW5kIHVz ZXIgbWF5IGVuam95IA0KICBnb29kDQogIHBlcmZvcm1hbmNlLCBzbyBsb25n IGFzIEnigJltIG5vdCBzcGF3bmluZyB0b25zIG9mIHByb2Nlc3NlcyBvciAN CiAgcmVseWluZw0KICBvbiBmb3JrIGZvciBtdWx0aS1wcm9ncmFtbWluZy4g SXMgdGhpcyBhIHNhZmUgYXNzdW1wdGlvbnM/DQoNCiAgQW55IG90aGVyIGdv dGNoYXMgd2hlbiBpdCBjb21lcyB0byBPQ2FtbCBvbiBDeWd3aW4gdy5yLnQu IA0KICBwZXJmb3JtYW5jZT8NCg0KICBUaGUgYXBwIHByZXR0eSBtdWNoIGhh cyByZWFsLXRpbWUgZ2FtaW5nIHJlcXVpcmVtZW50cyAodGhvdWdoIA0KICBp dOKAmXMgbm90DQogIGEgZ2FtZSBzbyBjYW4gc2lkZS1zdGVwIHdvcnJ5aW5n IGFib3V0IGFjY2VzcyB0byBHUFVzIGFuZA0KICB3aGF0LW5vdCkuIFN0YXRl ZCBhbm90aGVyIHdheSwgYWx0aG91Z2ggbXkgYXBwbGljYXRpb24gd2lsbCAN CiAgZGVwZW5kIG9uDQogIHRoZSBQT1NJWCBsYXllciBvZmZlcmVkIGJ5IEN5 Z3dpbiwgSSBleHBlY3QgaXQgbm90IHRvIGNydW5jaCANCiAgUE9TSVgNCiAg cmVsYXRlZCBzdHVmZiBpbiB0aGUgbWFpbiBsb29wLg0KDQogIEhvdyBoYXMg eW91ciBleHBlcmllbmNlIGdvbmU/DQoNCg0KSm9obiBXaGl0aW5ndG9uIHJl cGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgaGF2ZSBi ZWVuIHNoaXBwaW5nIGNvbW1lcmNpYWwgYmluYXJpZXMgZm9yIExpbnV4ICgz MiBhbmQgNjQgDQogIGJpdCksDQogIFdpbmRvd3MgKDMyIGFuZCA2NGJpdCkg YW5kIE9TIFggZm9yIHllYXJzLiBGb3IgZXhhbXBsZToNCiAgPGh0dHBzOi8v Z2l0aHViLmNvbS9jb2hlcmVudGdyYXBoaWNzL2NwZGYtYmluYXJpZXM+DQoN CiAgQW5kIGV2ZW4gc3RhdGljIG9yIHNoYXJlZCBsaWJyYXJpZXMgaW4gYmlu YXJ5IGZvcm06DQogIDxodHRwczovL2dpdGh1Yi5jb20vY29oZXJlbnRncmFw aGljcy9jcGRmbGliLWJpbmFyeT4NCg0KICBPbiBPUyBYLCB5b3UgbmVlZCB0 byB1c2UgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIG9yIHNpbWlsYXIgdG8g DQogIG1ha2UNCiAgc3VyZSB5b3VyIGJ1aWxkcyB3aWxsIHJ1biBvbiBvbGRl ciBzeXN0ZW1zLiBBbmQsIGluIGZhY3QsIHlvdSANCiAgbmVlZCB0bw0KICB1 c2UgTUFDT1NYX0RFUExPWU1FTlRfVEFSR0VUIHdoZW4gYXNraW5nIE9QQU0g dG8gY29tcGlsZSB0aGUgDQogIE9DYW1sDQogIGNvbXBpbGVyIGl0c2VsZi4g QW5kLCB5b3Ugd2lsbCBuZWVkIHRvIGRlYWwgd2l0aCBjb2Rlc2lnbmluZyBh bmQNCiAgbm90YXJpemF0aW9uLiBCdXQgaXTigJlzIGFsbCBkb2FibGUuDQoN CiAgRm9yIGxpbnV4LCB5b3UgbWF5IG5lZWQgdG8gYnVpbGQgdW5kZXIgb2xk ZXIgbGludXggdmVyc2lvbnMsIHRvIA0KICBtYWtlDQogIHN1cmUgdGhhdCB0 aGUgZ2xpYmMgaW4gdXNlIGlzIG9sZCBlbm91Z2guIFRoaXMgaXMgbm90IGFu DQogIG9jYW1sLXNwZWNpZmljIHByb2JsZW0uIEkgaGF2ZSBhIDY0IGJpdCBh bmQgMzIgYml0IFZNIHdpdGggDQogIG9sZC1pc2gNCiAgZ2xpYmMgdmVyc2lv bnMgZm9yIHRoaXMgcHVycG9zZS4NCg0KICBVbmRlciBXaW5kb3dzLCB0aGVy ZSBhcmUgbm8gc3VjaCBiYWNrd2FyZC1jb21wYXRpYmlsaXR5IA0KICBwcm9i bGVtcy4gSQ0KICB1c2UgdGhlIG5ldyBPQ2FtbCBmb3Igd2luZG93cyBzeXN0 ZW0sIHdoaWNoIGNvbWVzIHdpdGggT1BBTSwgYW5kIA0KICBpcw0KICBtaW5n dy1iYXNlZC4gTm8gY3lnd2luIHJlbWFpbnMgaW4gdGhlIGZpbmFsIGJpbmFy eS4NCg0KICBGb3IgbW9yZSBvYnNjdXJlIHN5c3RlbXMgKEFJWCwgSFBVWCwg U3BhcmMgZXRjKSBjdXN0b21lcnMgDQogIGNvbXBpbGUgZnJvbQ0KICBzb3Vy Y2UgKHdpdGggaGVscCBmcm9tIG1lKS4gTm90IG9uY2UgaW4gbW9yZSB0aGFu IHRlbiB5ZWFycyBoYXMgDQogIGFueW9uZQ0KICBjYXJlZCB0aGF0IGl0IHdh cyB3cml0dGVuIGluIE9DYW1sLg0KDQoNCmRidWVuemxpIGFsc28gcmVwbGll ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgcmVtZW1iZXIgdGhhdCBvbiB0 aGUgV2luZG93cyBuYXRpdmUgcG9ydCwgdGhlIFVuaXggbW9kdWxlIA0KICBk aXN0cmlidXRlZA0KICB3aXRoIE9DYW1sIGlzIHlvdXIgUE9TSVggY29tcGF0 aWJpbGl0eSBsYXllci4gVGhlcmUgYXJlIGEgZmV3IA0KICBlbnRyeQ0KICBw b2ludHMgdG8gYXZvaWQgdGhvdWdoLCB0aGUgbGlzdCBpcyBhdCB0aGUgYm90 dG9tIG9mIFt0aGlzIA0KICBwYWdlXS4NCg0KDQpbdGhpcyBwYWdlXSANCjxo dHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xp YnVuaXguaHRtbD4NCg0KDQpub2piIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgQXQgTGV4aUZpIG91ciBtYWluIGFwcGxpY2F0aW9uIGlzIGRldmVsb3Bl ZCBhbmQgc2hpcHBlZCBvbiANCiAgV2luZG93cy4gV2UNCiAgdXNlIHRoZSBt c3ZjIHBvcnQgb2YgT0NhbWwuIFRoaXMgbWVhbnMgdGhhdCB5b3UgbmVlZCBD eWd3aW4gdG8NCiAgZGV2ZWxvcCwgYnV0IHRoZSByZXN1bHRpbmcgYXBwbGlj YXRpb24gaXMgZnVsbHkgbmF0aXZlIGFuZCBkb2VzIA0KICBub3QNCiAgZGVw ZW5kIG9uIHRoZSBDeWd3aW4gRExMLiBBcyBAZGJ1ZW56bGkgbWVudGlvbmVk LCB0aGUgVW5peCANCiAgbW9kdWxlICppcyoNCiAgdGhlIFBPU0lYIGNvbXBh dGliaWxpdHkgbGF5ZXIuDQoNCiAgQ29tcGlsYXRpb24gc3BlZWQgaXMgc2xv d2VyIG9uIFdpbmRvd3MgYmVjYXVzZSBwcm9jZXNzIGNyZWF0aW9uIA0KICBp cw0KICBzbG93ZXIgb24gV2luZG93cyBhcyBhIGdlbmVyYWwgcnVsZSwgYnV0 IGl0IGlzIG1hbmFnZWFibGUgKG91cg0KICBhcHBsaWNhdGlvbiBoYXMgYXJv dW5kIDIwMDAgbW9kdWxlcyArIEpzX29mX29jYW1sICsgQyBiaW5kaW5ncyAr IA0KICBDIw0KICBjb21wb25lbnQpLg0KDQogIFdlIGRvbuKAmXQgaGF2ZSBh bnkgaXNzdWVzIHdpdGggcnVudGltZSBwZXJmb3JtYW5jZS4gVGhlIGBVbml4 JyANCiAgbGlicmFyeQ0KICBtZW50aW9uZWQgYWJvdmUgaW1wbGVtZW50cyBX aW5kb3dzIHN1cHBvcnQgZGlyZWN0bHkgd2l0aG91dCANCiAgZ29pbmcNCiAg dGhyb3VnaCBhbnkgY29tcGF0aWJpbGl0eSBsYXllciBhbmQgaXMgcXVpdGUg ZWZmaWNpZW50Lg0KDQoNCkJpa2FsR3VydW5nIGFsc28gcmVwbGllZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlcmUgaXMgYW4gZWRp dG9yIGJlaW5nIGJ1aWx0IGluIG9jYW1sL3JlYXNvbm1sIHdoaWNoIGN1cnJl bnRseQ0KICB0YXJnZXRzIHdpbmRvd3MsIGxpbnV4IGFuZCBtYWNvcyAtDQog IDxodHRwczovL2dpdGh1Yi5jb20vb25pdmltL29uaTI+LiBIb3dldmVyLCB0 aGUgYmluYXJ5IGlzIG5hdGl2ZQ0KICB3aW5kb3dzIHJhdGhlciB0aGFuIGN5 Z3dpbiBkZXJpdmF0aXZlLiBTbyBpZiB5b3UgZG9u4oCZdCBoYXZlIHRvIA0K ICB1c2UNCiAgY3lnd2luIGRlcGVuZGVuY2llcyB0aGVuIG5hdGl2ZSB3aW5k b3dzIGJpbmFyeSBjb3VsZCBiZSB0aGUgd2F5IA0KICB0byBnby4NCg0KICBB bHNvIGVzeSAtIDxodHRwczovL2dpdGh1Yi5jb20vZXN5L2VzeT4gbWFrZXMg ZGV2ZWxvcGluZw0KICBvY2FtbC9yZWFzb25tbCBvbiB3aW5kb3dzIHZpYWJs ZS4NCg0KDQprZWxlc2hldiBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogICpUTERSKjogSW5zdGFsbCB0aGUgW01pbmd3IHBvcnQgb2Yg T0NhbWwgNF0sIGZyZWVseSB1c2UgbW9zdCANCiAgb3BhbQ0KICAgbGlicmFy aWVzLCBhbmQgY29tcGlsZSB0byBuYXRpdmUgV2luZG93cyBiaW5hcmllcywg d2l0aG91dCANCiAgIGxpY2Vuc2luZw0KICAgaXNzdWVzLg0KDQogIEkgcmVj b21tZW5kIHlvdSByZWFkIHRoZSDigJxSZWxlYXNlIG5vdGVzIGZvciBXaW5k b3dz4oCdOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Js b2IvdHJ1bmsvUkVBRE1FLndpbjMyLmFkb2M+DQoNCiAgVG8gc3VtbWFyaXNl LCB0aGVyZSBhcmUgdGhyZWUgV2luZG93cyBwb3J0czoNCg0KICDigKIgTmF0 aXZlIE1pY3Jvc29mdCBwb3J0LA0KICDigKIgTmF0aXZlIE1pbmd3IHBvcnQs DQogIOKAoiBDeWd3aW4gcG9ydC4NCg0KICBBbGwgdGhyZWUgcmVxdWlyZSBD eWd3aW4gZm9yIGRldmVsb3BtZW50IHB1cnBvc2VzLiBJIHJlY29tbWVuZCAN CiAgdXNpbmcNCiAgdGhlIE5hdGl2ZSBNaW5ndywgYXM6DQoNCiAg4oCiIGl0 ICpkb2VzbuKAmXQqIHJlcXVpcmUgVmlzdWFsIFN0dWRpbyAoaXQgdXNlcyBh IG1pbmd3IGZvcmsgb2YgDQogIEdDQyB0aGF0DQogICAg4oCcY3Jvc3MtY29t cGlsZXPigJ0gbmF0aXZlIFdpbmRvd3MgZXhlY3V0YWJsZXMpLA0KICDigKIg aXQgKmRvZXNu4oCZdCogcmVseSBvbiB0aGUgZHJlYWRlZCBjeWd3aW4uZGxs DQogIOKAoiBpdCBoYXMgZ29vZCBvcGFtIHN1cHBvcnQgd2l0aCBvcGFtLXJl cG9zaXRvcnktbWluZ3c6DQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9mZG9w ZW4vb3BhbS1yZXBvc2l0b3J5LW1pbmd3Pg0KICDigKIgaXQgaGFzIGEgY29u dmVuaWVudCBpbnN0YWxsZXI6DQogICAgPGh0dHBzOi8vZmRvcGVuLmdpdGh1 Yi5pby9vcGFtLXJlcG9zaXRvcnktbWluZ3cvPiA1Lg0KDQogIFRvIGNvbnRy YXN0LCBOYXRpdmUgTWljcm9zb2Z0IHJlcXVpcmVzIFZpc3VhbCBTdHVkaW8s IGFuZCANCiAgZG9lc27igJl0IGhhdmUNCiAgb3BhbS4gWW91IGNhbiBzdGls bCB2ZW5kb3IgcHVyZSBPQ2FtbCBwYWNrYWdlcywgYnV0IGFzIHNvb24gYXMg DQogIHlvdQ0KICB3YW50IHRvIHVzZSBzb21lIEMgYmluZGluZ3MgeW914oCZ cmUgaW4gdHJvdWJsZSwgYmVjYXVzZSBvZiB0aGUgDQogIOKAnG1pbm9y4oCd DQogIGRpZmZlcmVuY2VzIGJldHdlZW4gVmlzdWFsIEMgYW5kIEdDQy4gQW5k IGV2ZXJ5dGhpbmcgYXNzdW1lcyBHQ0MNCiAgbm93YWRheXMuDQoNCiAgQ3ln d2luIHBvcnQgaXMgdGhlIG9uZSBJIGRvbuKAmXQgaGF2ZSBleHBlcmllbmNl IHdpdGgsIGJ1dCANCiAgcmUtcmVhZGluZw0KICB0aGUg4oCcUmVsZWFzZSBu b3RlcyBmb3IgV2luZG93c+KAnSBhYm92ZSBpdCBzdHJpa2VzIG1lIHRoYXQg aXQgDQogIG1lbnRpb25zDQogIHRoYXQgQ3lnd2luIHdhcyByZS1saWNlbnNl ZCBmcm9tIEdQTCB0byBMR1BMIHdpdGggc3RhdGljIGxpbmtpbmcNCiAgZXhj ZXB0aW9uLiBTbyBpdCBsb29rcyBsaWtlIHRoZSBDeWd3aW4gcG9ydCBjb3Vs ZCBiZSB2aWFibGUgZm9yDQogIGNvbW1lcmNpYWwgdXNlLCBidXQgSSBuZXZl ciB0cmllZCB0byBzdGF0aWNhbGx5IGxpbmtlZCANCiAgYGN5Z3dpbi5kbGwn LA0KICBhbmQgSeKAmW0gbm90IHN1cmUgd2hhdCBhcmUgdGhlIGJlbmVmaXRz IG9mIEN5Z3dpbiBwb3J0IG92ZXIgdGhlIA0KICBNaW5ndw0KICBwb3J0Lg0K DQoNCltNaW5ndyBwb3J0IG9mIE9DYW1sIDRdDQo8aHR0cHM6Ly9mZG9wZW4u Z2l0aHViLmlvL29wYW0tcmVwb3NpdG9yeS1taW5ndy8+DQoNCg0KZG1iYXR1 cmluIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V2l0aCBbc291cGF1bHQgNF0sIEkgZGVjaWRlZCB0byBzaGlwIHByZWJ1aWx0 IGJpbmFyaWVzIGZvciBhbGwNCiAgcGxhdGZvcm1zIGluY2x1ZGluZyBXaW5k b3dzLiBNb3N0bHkgdG8gc2VlIGlmIEkgY2FuLCBhbGwgaXRzIA0KICB1c2Vy cyBJDQogIGtub3cgb2YgYXJlIG9uIFVOSVgtbGlrZSBzeXN0ZW1zIGFuZCBr bm93IGhvdyB0byBidWlsZCBmcm9tIA0KICBzb3VyY2UsDQogIGJ1dCB0aGF0 4oCZcyBiZXNpZGUgdGhlIHBvaW50LiA6d2luazoNCg0KICBJIGNhbiBjb25m aXJtIGV2ZXJ5dGhpbmcgQGtlbGVzaGV2IHNheXM6IGZkb3BlbuKAmXMgcGFj a2FnZSBqdXN0IA0KICB3b3JrcywNCiAgb3BhbSB3b3JrcyBleGFjdGx5IGxp a2UgaXQgZG9lcyBvbiBVTklYLCBwdXJlIE9DYW1sIGxpYnJhcmllcyANCiAg YXJlDQogIHRyaXZpYWwgdG8gaW5zdGFsbCwgYW5kIHRoZSBiaW5hcmllcyBk b27igJl0IGRlcGVuZCBvbiBjeWd3aW4uIA0KICBOb3RlDQogIHRoYXQg4oCc b3BhbSBzd2l0Y2ggY3JlYXRl4oCdIGFsc28ganVzdCB3b3JrcywgeW91IGNh biBpbnN0YWxsIA0KICBlaXRoZXINCiAgTWluR1cgb3IgTVNWQyBjb21waWxl ciB2ZXJzaW9ucyBhcyBvcGFtIHN3aXRjaGVzLiAgSSBvbmx5IGV2ZXIgDQog IHN0YXJ0DQogIHRoZSBXaW5kb3dzIFZNIHRvIG1ha2UgcmVsZWFzZSBidWls ZHMsIGFuZCB0aGUgd29ya2Zsb3cgaXMgDQogIGV4YWN0bHkgdGhlDQogIHNh bWUgYXMgb24gTGludXggd2hlcmUgSeKAmW0gYWN0dWFsbHkgd3JpdGluZyBj b2RlLg0KDQogIE15IG9ubHkgb2JzdGFjbGUgb24gdGhhdCBwYXRoIHdhcyB0 aGF0IEZpbGVVdGlscyBsb3N0IGl0cyANCiAgV2luZG93cw0KICBjb21wYXRp YmlsaXR5LCBidXQgSSB3YW50ZWQgdG8gdXNlIGl0LCBzbyBJIHdvcmtlZCB3 aXRoIA0KICBAZ2lsZG9yNDc4IHRvDQogIG1ha2UgaXQgY3Jvc3MtcGxhdGZv cm0gYWdhaW4uIFVuY292ZXJlZCBhIGJ1ZyBpbiB0aGUgDQogIGltcGxlbWVu dGF0aW9uIG9mDQogIFVuaXgudXRpbWVzIGluIHRoZSBwcm9jZXNzLCBidXQg aXTigJlzIGhhcmRseSBhIGNvbW1vbmx5IHVzZWQgDQogIGZ1bmN0aW9uLg0K DQogIFlvdSBjYW4gYWxzbyBzZXR1cCBBcHBWZXlvciBidWlsZHMuIEl04oCZ cyBub3QgYXMgc2ltcGxlIGFzIEkgd2lzaCANCiAgaXQNCiAgd291bGQgYmUs IGJ1dCB0aGVyZSBhcmUgcHJvamVjdHMgZG9pbmcgaXQgdGhhdCB5b3UgY2Fu IHN0ZWFsIHRoZSANCiAgc2V0dXANCiAgZnJvbS4NCg0KICBUaGVyZeKAmXMg YWxzbyBvcGFtLWNyb3NzLXdpbmRvd3MsIGJ1dCBpdOKAmXMgdmVyeSBpbmNv bXBsZXRlIGFuZCANCiAgbmVlZHMNCiAgd29yayB0byBiZSBwcmFjdGljYWwu IFRoZXJlIGFyZSBubyBiaWcgb2JzdGFjbGVzLCBpdCBqdXN0IG5lZWRzDQog IHdvcmsuIFdoaWxlIGZpbGVzIGluIG9wYW0tcmVwb3NpdG9yeS1taW5ndyBh cmUgbm9ybWFsbHkgDQogIGlkZW50aWNhbCB0bw0KICB0aGUgZGVmYXVsdCBv cGFtIHJlcG9zaXRvcnksIHRoZSBjcm9zcyBvbmUgbmVlZHMgc21hbGwgDQog IGFkanVzdG1lbnRzIGluDQogIGV2ZXJ5IHBhY2thZ2UgdG8gc3BlY2lmeSB0 aGUgdG9vbGNoYWluIHRvIHVzZSwgc28gdGhlIHJlcXVpcmVkIA0KICB3b3Jr IGlzDQogIG1vc3RseSBhIGxvdCBvZiB0cml2aWFsIGJ1dCBtYW51YWwgYWN0 aW9ucy4gSSBob3BlIGV2ZW50dWFsbHkgaXQNCiAgcmVhY2hlcyBwYXJpdHkg d2l0aCBmZG9wZW7igJlzIG9uZSBhbmQgd2XigJlsbCBiZSBhYmxlIHRvIGVh c2lseSANCiAgYnVpbGQgZm9yDQogIFdpbmRvd3Mgd2l0aG91dCBldmVyIHRv dWNoaW5nIFdpbmRvd3MuDQoNCiAgQXMgb2Ygc3RhdGljIExpbnV4IGJ1aWxk cywgQEpvaG5XaGl0aW5ndG9u4oCZcyBhcHByb2FjaCBjYW4gd29yaywgDQog IGJ1dA0KICB0aGVyZeKAmXMgYSBiZXR0ZXIgb3B0aW9uIGlmIHlvdSBkb27i gJl0IG5lZWQgYW55dGhpbmcgZnJvbSBnbGliYw0KICBzcGVjaWZpY2FsbHkg YW5kIGRvbuKAmXQgbGluayBhZ2FpbnN0IGFueSBDIGxpYnM6IGJ1aWxkIHN0 YXRpY2FsbHkgDQogIHdpdGgNCiAgbXVzbC4gVGhlcmXigJlzIGEgYCttdXNs K3N0YXRpYytmbGFtYmRhJyBjb21waWxlciBmbGF2b3VyLiBZb3UgDQogIG5l ZWQgbXVzbA0KICBhbmQgZ2NjLW11c2wgdG8gaW5zdGFsbCBpdCwgYnV0IGFm dGVyIHRoYXQsIGp1c3QgYnVpbGQgd2l0aCANCiAgYC1jY29wdA0KICAtc3Rh dGljJyBmbGFnIGFuZCB5b3UgZ2V0IGEgYmluYXJ5IHRoYXQgZG9lc27igJl0 IGRlcGVuZCBvbiANCiAgYW55dGhpbmcuDQoNCg0KW3NvdXBhdWx0IDRdIDxo dHRwczovL3NvdXBhdWx0Lm5lb2NpdGllcy5vcmcvPg0KDQoNCkR1bmUgMi4w LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMi0w LTAvNDc1OD4NCg0KDQpyZ3JpbmJlcmcgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIGR1bmUgdGVhbSwgSeKAmW0gZGVs aWdodGVkIHRvIGFubm91bmNlIHRoZSANCiAgcmVsZWFzZSBvZg0KICBkdW5l IDIuMC4gVGhpcyByZWxlYXNlIGlzIHRoZSBjdWxtaW5hdGlvbiBvZiA0IG1v bnRocyBvZiBoYXJkIA0KICB3b3JrIGJ5DQogIHRoZSBkdW5lIHRlYW0gYW5k IGNvbnRhaW5zIG5ldyBmZWF0dXJlcywgYnVnIGZpeGVzLCBhbmQgDQogIHBl cmZvcm1hbmNlDQogIGltcHJvdmVtZW50cyAuIEhlcmXigJlzIGEgc2VsZWN0 aW9uIG9mIG5ldyBmZWF0dXJlcyB0aGF0IEkgDQogIHBlcnNvbmFsbHkNCiAg ZmluZCBpbnRlcmVzdGluZzoNCg0KICDigKIgTmV3IGJvb3N0cmFwIHByb2Nl ZHVyZSB0aGF0IHdvcmtzIGluIGxvdyBtZW1vcnkgZW52aXJvbm1lbnRzDQog IOKAoiAoYGRlcHJlY2F0ZWRfbGlicmFyeV9uYW1lJyAuLikgc3RhbnphIHRv IHByb3Blcmx5IGRlcHJlY2F0ZSANCiAgb2xkDQogICAgbGlicmFyeSBuYW1l cw0KICDigKIgKGBmb3JlaWduX2xpYnJhcnknIC4uKSBzdGFuemEgdG8gZGVm aW5lIEMvQysrIGxpYnJhcmllcy4NCiAg4oCiIEMgc3R1YnMgZGlyZWN0bHkg aW4gT0NhbWwgZXhlY3V0YWJsZXMNCg0KICBSZWZlciB0byB0aGUgY2hhbmdl IGxvZyBmb3IgYW4gZXhoYXVzdGl2ZSBsaXN0Lg0KDQogIFdlIHN0cml2ZSBm b3IgYSBnb29kIG91dCBvZiB0aGUgYm94IGV4cGVyaWVuY2UgdGhhdCByZXF1 aXJlcyBubw0KICBjb25maWd1cmF0aW9uLCBzbyB3ZeKAmXZlIGFsc28gdHdl YWtlZCBhIGZldyBkZWZhdWx0cy4gSW4gDQogIHBhcnRpY3VsYXIsIGAkDQog IGR1bmUgYnVpbGQnIHdpbGwgbm93IGJ1aWxkIGBAYWxsJyBpbnN0ZWFkIG9m IGBAaW5zdGFsbCcsIGFuZA0KICBvY2FtbGZvcm1hdCBydWxlcyBhcmUgc2V0 dXAgYnkgZGVmYXVsdC4NCg0KICBMYXN0bHksIGR1bmUgMi4wIHNoZWRzIGFs bCB0aGUgbGVnYWN5IHJlbGF0ZWQgdG8gamJ1aWxkZXIgYW5kIA0KICB3aWxs IG5vDQogIGxvbmdlciBidWlsZCBqYnVpbGRlciBwcm9qZWN0cy4gVGhpcyBj aGFuZ2UgaXMgbmVjZXNzYXJ5IHRvIGVhc2UNCiAgbWFpbnRlbmFuY2UgYW5k IG1ha2UgaXQgZWFzaWVyIHRvIGFkZCBuZXcgZmVhdHVyZXMgZG93biB0aGUN CiAgbGluZS4gVGhlcmUgYXJlIGEgZmV3IG90aGVyIG1pbm9yIGJyZWFraW5n IGNoYW5nZXMuIFJlZmVyIHRvIHRoZQ0KICBjaGFuZ2UgbG9nIGZvciB0aGUg ZnVsbCBsaXN0LiBXZSBhcG9sb2dpemUgaW4gYWR2YW5jZSBmb3IgYW55DQog IGNvbnZlbmllbmNlIHRoaXMgbWlnaHQgY2F1c2UuDQoNCiAgW0NoYW5nZWxv Z10NCg0KDQpbQ2hhbmdlbG9nXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1kdW5lLTItMC0wLzQ3NTg+DQoNCg0KQWR2YW5jZWQgQyBiaW5k aW5nIHVzaW5nIG9jYW1sLWN0eXBlcyBhbmQgZHVuZQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZHZhbmNl ZC1jLWJpbmRpbmctdXNpbmctb2NhbWwtY3R5cGVzLWFuZC1kdW5lLzQ4MDU+ DQoNCg0KdG9vdHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHdvcmtlZCBvbiBhIHNv Y2tldC5oIGJpbmRpbmcgbGFzdCBzdW1tZXIgYW5kIGhhZCBhIGdyZWF0IA0K ICBleHBlcmllbmNlDQogIGludGVncmF0aW5nIG9jYW1sLWN0eXBlcyB3aXRo IGR1bmUsIEkgdGhvdWdodCB0aGF0IG1pZ2h0IGJlIG9mDQogIGludGVyZXN0 IHRvIG90aGVyIGRldmVsb3BlcnMgc28gSSB3cm90ZSBhYm91dCBpdDoNCiAg PGh0dHBzOi8vbWVkaXVtLmNvbS9Acm9tYWluLmJlYXV4aXMvYWR2YW5jZWQt Yy1iaW5kaW5nLXVzaW5nLW9jYW1sLWN0eXBlcy1hbmQtZHVuZS1jYzNmNGNi YWIzMDI+DQoNCg0KcmdyaW5iZXJnIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRo aXMgaXMgYSBnb29kIGFydGljbGUuIEkgZW5jb3VyYWdlIGFueW9uZSB3aG8g d3JpdGVzIEMgYmluZGluZ3MgDQogIHdpdGgNCiAgY3R5cGVzIHRvIHN0dWR5 IGl0IGNhcmVmdWxseS4NCg0KICBBIGxpdHRsZSBiaXQgb2YgYWR2aWNlIHRv IHNob3J0ZW4geW91ciBkdW5lIGZpbGVzOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgKGRlcHMgICAgKDpnZW4gLi9nZW5fY29uc3RhbnRzX2MuZXhl KSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBsaW5lIGlzbuKAmXQg bmVjZXNzYXJ5LiBEdW5lIGlzIHNtYXJ0IGVub3VnaCB0byBrbm93IHRoYXQg DQogIHJ1bm5pbmcgYQ0KICBiaW5hcnkgaW4gYSBydWxlIGluY3VycyBhIGRl cGVuZGVuY3kgb24gaXQuDQoNCiAgICAgICAgZHVuZSBoYXMgYSB0cnVseSBh bWF6aW5nIFtzdXBwb3J0IGZvciBjcm9zcy1jb21waWxpbmddLA0KICAgICAg ICB3aGljaCB3ZSBkbyBub3QgY292ZXIgaGVyZSwgYnV0LCB1bmZvcnR1bmF0 ZWx5LCBpdHMNCiAgICAgICAgcHJpbWl0aXZlcyBmb3IgYnVpbGRpbmcgYW5k IGV4ZWN1dGluZyBiaW5hcmllcyBkbyBub3QgeWV0DQogICAgICAgIGNvdmVy IHRoaXMgdXNlIGNhc2UuDQoNCiAgSW5kZWVkLCB3ZSBkb27igJl0IGhhdmUg YW55IHByaW1pdGl2ZXMgZm9yIHJ1bm5pbmcgYmluYXJpZXMgb24gdGhlDQog IHRhcmdldCBwbGF0Zm9ybS4gUGVyaGFwcyB3ZSBzaG91bGQgYWRkIHNvbWUu IEhvd2V2ZXIsIHdlIGRvIGluIA0KICBmYWN0DQogIGhhdmUgc29tZSBmZWF0 dXJlcyBpbiBkdW5lIHRvIHNvbHZlIHRoaXMgY29uY3JldGUgY3Jvc3MgDQog IGNvbXBpbGF0aW9uDQogIHByb2JsZW0uIEFzIGZhciBhcyBJIHVuZGVyc3Rh bmQsIHRoZSBnb2FsIGlzIHRvIG9idGFpbiBzb21lIA0KICBjb21waWxlDQog IHRpbWUgdmFsdWVzIHN1Y2ggYXMgI2RlZmluZSBjb25zdGFudHMgYW5kIGZp ZWxkIG9mZnNldHMgZm9yIHRoZSANCiAgdGFyZ2V0DQogIHBsYXRmb3JtLiBU aGlzIGRvZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4gYW55dGhpbmcg b24gdGhlIA0KICBjcm9zcw0KICBjb21waWxhdGlvbiB0YXJnZXQuIEluIGNv bmZpZ3VyYXRvciwgd2UgaGF2ZSBhIHByaW1pdGl2ZQ0KICBgQ19kZWZpbmUu aW1wb3J0JyB0byBleHRyYWN0IHRoaXMgaW5mb3JtYXRpb24uIFRoZSBlbmQg cmVzdWx0IGlzIA0KICB0aGF0DQogIHRoZXNlIGNvbmZpZ3VyYXRvciBzY3Jp cHRzIGFyZSBjb21wbGV0ZWx5IGNvbXBhdGlibGUgd2l0aCBjcm9zcw0KICBj b21waWxhdGlvbi4NCg0KICBQZXJoYXBzIHRoaXMgY291bGQgYmUgZ2VuZXJh bGl6ZWQgdG8gd29yayB3aXRoIGN0eXBlcyBnZW5lcmF0b3JzIA0KICBhcw0K ICB3ZWxsPw0KDQogIEZ1bm55IGJpdCBvZiB0cml2aWE6IFRoZSBoYWNrIGlu IGNvbmZpZ3VyYXRvciByZXF1aXJlZCB0byBkbyANCiAgdGhpcyBpcw0KICBp biBmYWN0IHNvbWV0aGluZyBJIGV4dHJhY3RlZCBmcm9tIGN0eXBlcyBpdHNl bGYuIFRoZSBvcmlnaW5hbCANCiAgYXV0aG9yDQogIGlzIFt3aGl0ZXF1YXJr XSwgd2hvIGluIHR1cm4gd3JvdGUgaXQgdG8gbWFrZSBjdHlwZXMgaXRzZWxm IA0KICBhbWVuZGFibGUNCiAgdG8gY3Jvc3MgY29tcGlsYXRpb24uDQoNCg0K W3N1cHBvcnQgZm9yIGNyb3NzLWNvbXBpbGluZ10NCjxodHRwczovL2R1bmUu cmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L2Nyb3NzLWNvbXBpbGF0aW9uLmh0 bWw+DQoNClt3aGl0ZXF1YXJrXSA8aHR0cHM6Ly9naXRodWIuY29tL3doaXRl cXVhcms+DQoNCg0KZW1pbGxvbiB0aGVuIGFkZGVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICAgICAgICBUaGlzIGRvZXMgbm90IGluIGZhY3QgcmVxdWlyZSB0byBydW4g YW55dGhpbmcgb24gdGhlIGNyb3NzDQogICAgICAgIGNvbXBpbGF0aW9uIHRh cmdldC4gSW4gY29uZmlndXJhdG9yLCB3ZSBoYXZlIGEgcHJpbWl0aXZlDQog ICAgICAgIGBDX2RlZmluZS5pbXBvcnQnIHRvIGV4dHJhY3QgdGhpcyBpbmZv cm1hdGlvbi4gVGhlIGVuZA0KICAgICAgICByZXN1bHQgaXMgdGhhdCB0aGVz ZSBjb25maWd1cmF0b3Igc2NyaXB0cyBhcmUgY29tcGxldGVseQ0KICAgICAg ICBjb21wYXRpYmxlIHdpdGggY3Jvc3MgY29tcGlsYXRpb24uDQoNCiAgSWYg YW55Ym9keSB3YW50cyB0byBrbm93IG1vcmUgYWJvdXQgdGhpcyBiaXQsIEkg d3JvdGUgYW4gYXJ0aWNsZSANCiAgYWJvdXQNCiAgdGhpcyBsYXN0IHllYXI6 IA0KICA8aHR0cHM6Ly9kdW5lLmJ1aWxkL2Jsb2cvY29uZmlndXJhdG9yLWNv bnN0YW50cy8+DQoNCg0KVXBjb21pbmcgYnJlYWtpbmcgY2hhbmdlIGluIEJh c2UvQ29yZSB2MC4xNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC91cGNvbWluZy1icmVha2luZy1jaGFuZ2UtaW4tYmFzZS1j b3JlLXYwLTE0LzQ4MDY+DQoNCg0KYmNjMzIgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBX ZeKAmXJlIGNoYW5naW5nIGZ1bmN0aW9ucyBpbiBCYXNlIHRoYXQgdXNlZCB0 byB1c2UgdGhlIA0KICBwb2x5bW9ycGhpYw0KICB2YXJpYW50IHR5cGUgYFsg YEZzdCBvZiAnYSB8IGBTbmQgb2YgJ2IgXScgdG8gdXNlIGAoJ2EsICdiKSAN CiAgRWl0aGVyLnQnDQogIGluc3RlYWQuIEFzIHdlbGwgYXMgZW5hYmxpbmcg dGhlIHVzZSBvZiBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiANCiAgdGhlDQog IEVpdGhlciBtb2R1bGUsIHRoaXMgbWFrZXMgdGhlIGZ1bmN0aW9ucyBjb25z aXN0ZW50IHdpdGggb3RoZXINCiAgZnVuY3Rpb25zIHRoYXQgYWxyZWFkeSB1 c2UgYEVpdGhlci50JywgKGN1cnJlbnRseSBqdXN0DQogIGBTZXQuc3ltbWV0 cmljX2RpZmYnKQ0KDQogIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25z4oCZIHR5 cGVzIHdpbGwgY2hhbmdlOg0KICDigKIgYFJlc3VsdC5va19mc3QnDQogIOKA oiBgTGlzdC5wYXJ0aXRpb25fbWFwJw0KICDigKIgYE1hcC5wYXJ0aXRpb25f bWFwJywgYE1hcC5wYXJ0aXRpb25fbWFwaScNCiAg4oCiIGBIYXNodGJsLnBh cnRpdGlvbl9tYXAnLCBgSGFzaHRibC5wYXJ0aXRpb25fbWFwaScNCg0KICBU aGUgdHlwZSBvZiBMaXN0LnBhcnRpdGlvbjNfbWFwIHdpbGwgbm90IGNoYW5n ZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHZhbCBwYXJ0aXRpb24z X21hcA0KICDilIIgICA6ICAnYSB0DQogIOKUgiAgIC0+IGY6KCdhIC0+IFsg YEZzdCBvZiAnYiB8IGBTbmQgb2YgJ2MgfCBgVHJkIG9mICdkIF0pDQogIOKU giAgIC0+ICdiIHQgKiAnYyB0ICogJ2QgdA0KICDilJTilIDilIDilIDilIAN Cg0KICBXZSBkb27igJl0IGhhdmUgYSBnZW5lcmljIHRlcm5hcnkgdmFyaWFu dCwgYW5kIGl0IGRvZXNu4oCZdCBzZWVtIA0KICB3b3J0aCBpdA0KICB0byBt aW50IG9uZSBqdXN0IGZvciB0aGlzIHB1cnBvc2UuDQoNCiAgU2luY2UgdGhp cyBjaGFuZ2UgaXMgcHJldHR5IHN0cmFpZ2h0Zm9yd2FyZCwgd2UgZXhwZWN0 IHRoYXQgYSANCiAgc2ltcGxlDQogIGZpbmQvcmVwbGFjZSB3aWxsIGJlIHN1 ZmZpY2llbnQgdG8gdXBkYXRlIGFueSBhZmZlY3RlZCBjYWxsIA0KICBzaXRl cy4NCg0KDQpDSS9DRCBQaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0 Pw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogDQog IDxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8xNC9j aWNkLXBpcGVsaW5lcy8+DQoNCg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbiB0aGlzIHBv c3QgSSBkZXNjcmliZSB0aHJlZSBhcHByb2FjaGVzIHRvIGJ1aWxkaW5nIGEg bGFuZ3VhZ2UgDQogIGZvcg0KICB3cml0aW5nIENJL0NEIHBpcGVsaW5lcy4g TXkgZmlyc3QgYXR0ZW1wdCB1c2VkIGEgbW9uYWQsIGJ1dCB0aGlzDQogIHBy ZXZlbnRlZCBzdGF0aWMgYW5hbHlzaXMgb2YgdGhlIHBpcGVsaW5lcy4gSSB0 aGVuIHRyaWVkIHVzaW5nIA0KICBhbg0KICBhcnJvdywgYnV0IGZvdW5kIHRo ZSBzeW50YXggdmVyeSBkaWZmaWN1bHQgdG8gdXNlLiBGaW5hbGx5LCBJIA0K ICBlbmRlZCB1cA0KICB1c2luZyBhIGxpZ2h0LXdlaWdodCBhbHRlcm5hdGl2 ZSB0byBhcnJvd3MgdGhhdCBJIHdpbGwgcmVmZXIgdG8gDQogIGhlcmUNCiAg YXMgYSBkYXJ0IChJIGRvbuKAmXQga25vdyBpZiB0aGlzIGhhcyBhIG5hbWUg YWxyZWFkeSkuIFRoaXMgYWxsb3dzIA0KICBmb3INCiAgc3RhdGljIGFuYWx5 c2lzIGxpa2UgYW4gYXJyb3csIGJ1dCBoYXMgYSBzeW50YXggZXZlbiBzaW1w bGVyIA0KICB0aGFuIGENCiAgbW9uYWQuDQoNCiAgPGh0dHBzOi8vcm9zY2lk dXMuY29tL2Jsb2cvYmxvZy8yMDE5LzExLzE0L2NpY2QtcGlwZWxpbmVzLz4N Cg0KDQpVc2Ugb2YgZnVuY3RvcnMgdG8gYXBwcm94aW1hdGUgRiMgc3RhdGlj YWxseSByZXNvbHZlZCB0eXBlIA0KcGFyYW1ldGVycw0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC91c2Utb2YtZnVuY3RvcnMtdG8tYXBwcm94aW1h dGUtZi1zdGF0aWNhbGx5LXJlc29sdmVkLXR5cGUtcGFyYW1ldGVycy80Nzgy Pg0KDQoNCmNteGEgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEkgYW0gbGVhcm5pbmcgT0NhbWwgY29taW5nIGZyb20gRiMu IEluIEYjLCB0byBjYWxjdWxhdGUgdGhlIA0KICBhdmVyYWdlIG9mDQogIGFu IGFycmF5IHdob3NlIGVsZW1lbnQgdHlwZSBzdXBwb3J0cyBhZGRpdGlvbiBh bmQgZGl2aXNpb24sIG9uZSANCiAgY2FuDQogIHdyaXRlDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBsZXQgaW5saW5lIGF2ZXJhZ2UgKGFycjogJ2Fb XSkgOiAnYQ0KICDilIIgICAgIHdoZW4gXmEgOiAoc3RhdGljIG1lbWJlciBE aXZpZGVCeUludCA6IF5hICogaW50IC0+IF5hKQ0KICDilIIgICAgIGFuZCAg XmEgOiAoc3RhdGljIG1lbWJlciAoKykgOiBeYSAqIF5hIC0+IF5hKQ0KICDi lIIgICAgIGFuZCAgXmEgOiAoc3RhdGljIG1lbWJlciBaZXJvIDogXmEpDQog IOKUgiAgICAgPQ0KICDilIIgICAgIGlmIEFycmF5Lmxlbmd0aCBhcnIgPSAw IHRoZW4gDQogIChMYW5ndWFnZVByaW1pdGl2ZXMuR2VuZXJpY1plcm8pIGVs c2UNCiAg4pSCICAgICBMYW5ndWFnZVByaW1pdGl2ZXMuRGl2aWRlQnlJbnQg KEFycmF5LmZvbGQgKCspIA0KICAoTGFuZ3VhZ2VQcmltaXRpdmVzLkdlbmVy aWNaZXJvKSBhcnIpIChBcnJheS5sZW5ndGggYXJyKQ0KICDilJTilIDilIDi lIDilIANCg0KICBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgaW4gT0NhbWws IG9uZSB3b3VsZCBoYXZlIGEgbW9kdWxlIHR5cGUgDQogIGxpa2UNCiAgc286 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgdHlwZSBBdmVy YWdhYmxlID0gc2lnDQogIOKUgiAgIHR5cGUgJ2EgdA0KICDilIINCiAg4pSC ICAgdmFsIGRpdmlkZV9ieV9pbnQgOiAnYSAtPiBpbnQgLT4gJ2ENCiAg4pSC ICAgdmFsIHBsdXMgOiAnYSAtPiAnYSAtPiAnYQ0KICDilIIgICB2YWwgemVy byA6ICdhDQogIOKUgiBlbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTXkg cXVlc3Rpb24gaXMgaG93IHRoZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIHdv dWxkIGJlIHdyaXR0ZW46DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBs ZXQgYXZlcmFnZSBhcnIgPQ0KICDilIIgICA/Pz8NCiAg4pSU4pSA4pSA4pSA 4pSADQoNCg0Kc21vbGthaiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGaXJzdCwgYEF2ZXJh Z2FibGUnIHNob3VsZCBsb29rIGxpa2UgdGhpczoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG1vZHVsZSB0eXBlIEF2ZXJhZ2FibGUgPSBzaWcNCiAg 4pSCICAgdHlwZSB0DQogIOKUgiAgIHZhbCBkaXZpZGVfYnlfaW50IDogdCAt PiBpbnQgLT4gdA0KICDilIIgICB2YWwgcGx1cyA6IHQgLT4gdCAtPiB0DQog IOKUgiAgIHZhbCB6ZXJvIDogdA0KICDilIIgZW5kDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIFRoZW4gYXZlcmFnZSB3aWxsIGxvb2sgc29tZXRoaW5nIGxp a2UgdGhpczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhdmVy YWdlICh0eXBlIHQpIChtb2R1bGUgQSA6IEF2ZXJhZ2FibGUgd2l0aCB0eXBl IHQgPSB0KSANCiAgKGFyciA6IHQgYXJyYXkpIDogdCA9DQogIOKUgiAgIEFy cmF5LmZvbGQgfmluaXQ6QS56ZXJvIH5mOkEucGx1cyBhcnINCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgKFRoZSBjb2RlIGFib3ZlIHVzZXMgSmFuZSBTdHJl ZXTigJlzIEJhc2UvQ29yZSBsaWJyYXJ5LikNCg0KDQppdmcgdGhlbiBhZGRl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2hpbGUgQHNtb2xrYWrigJlzIGFuc3dlciBpcyBhIGNvcnJlY3Qg YW5kIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiANCiAgb2YgeW91cg0KICBGIyBj b2RlLCBpdCBtaWdodCBiZSBuaWNlciBpZiB5b3VyIGNvZGUgY2FuIGludGVy cGxheSB3aXRoIA0KICBleGlzdGluZw0KICBhYnN0cmFjdGlvbnMgaW4gdGhl IE9DYW1sIGluZnJhc3RydWN0dXJlLiBGb3IgZXhhbXBsZSwNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG9wZW4gQmFzZQ0KICDilIINCiAg4pSCIGxl dCBhdmVyYWdlICh0eXBlIGEpIChtb2R1bGUgVCA6IEZsb2F0YWJsZS5TIHdp dGggdHlwZSB0ID0gYSkgDQogIHhzID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+ aW5pdDowLiB+ZjooZnVuIHMgeCAtPiBzICsuIFQudG9fZmxvYXQgeCkgeHMg Ly4NCiAg4pSCICAgRmxvYXQub2ZfaW50IChBcnJheS5sZW5ndGggeHMpDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZCBub3cgaXQgY291bGQgYmUgdXNl ZCB3aXRoIGFueSBleGlzdGluZyBudW1lcmljIGRhdGEgaW4gDQogIEJhc2Uv Q29yZQ0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgYXZlcmFnZSAobW9k dWxlIEludCkgW3wxOzI7Mzs0fF07Ow0KICDilIIgLSA6IEJhc2UuRmxvYXQu dCA9IDIuNQ0KICDilJTilIDilIDilIDilIANCg0KICBhbmQgZXZlbiBhZGFw dGVkIHRvIG5vbi1udW1iZXJzLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgbGV0IGF2ZXJhZ2VfbGVuZ3RoID0gYXZlcmFnZSAobW9kdWxlIHN0cnVj dA0KICDilIIgICAgIGluY2x1ZGUgU3RyaW5nDQogIOKUgiAgICAgbGV0IHRv X2Zsb2F0IHggPSBGbG9hdC5vZl9pbnQgKFN0cmluZy5sZW5ndGggeCkNCiAg 4pSCICAgICBsZXQgb2ZfZmxvYXQgXyA9IGFzc2VydCBmYWxzZQ0KICDilIIg ICBlbmQpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBsYXR0ZXIgZXhh bXBsZSBzaG93cyB0aGF0IHdlIHJlcXVlc3RlZCBtb3JlIGludGVyZmFjZSB0 aGFuIA0KICBuZWVkLCBhDQogIGNvc3QgdGhhdCB3ZSBoYXZlIHRvIHBheSBm b3IgdXNpbmcgYW4gZXhpc3RpbmcgZGVmaW5pdGlvbi4gSW4gDQogIGNhc2Vz DQogIHdoZW4gaXQgbWF0dGVycywgeW91IGNhbiBzcGVjaWZ5IHRoZSBzcGVj aWZpYyBpbnRlcmZhY2UsIGUuZy4sDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBtb2R1bGUgdHlwZSBGbG9hdGFibGUgPSBzaWcNCiAg4pSCICAgdHlw ZSB0DQogIOKUgiAgIHZhbCB0b19mbG9hdCA6IHQgLT4gZmxvYXQNCiAg4pSC IGVuZA0KICDilIINCiAg4pSCIGxldCBhdmVyYWdlICh0eXBlIGEpIChtb2R1 bGUgVCA6IEZsb2F0YWJsZSB3aXRoIHR5cGUgdCA9IGEpIHhzIA0KICA9DQog IOKUgiAgIEFycmF5LmZvbGQgfmluaXQ6MC4gfmY6KGZ1biBzIHggLT4gcyAr LiBULnRvX2Zsb2F0IHgpIHhzIC8uDQogIOKUgiAgIEZsb2F0Lm9mX2ludCAo QXJyYXkubGVuZ3RoIHhzKQ0KICDilJTilIDilIDilIDilIANCg0KICBCdXQg d2UgcmVhY2hlZCB0aGUgcG9pbnQgd2hlcmUgdXNpbmcgZmlyc3QgY2xhc3Mg bW9kdWxlcyBpcyANCiAgdG90YWxseQ0KICB1bm5lY2Vzc2FyeS4gT3VyIGlu dGVyZmFjZSBoYXMgb25seSBvbmUgZnVuY3Rpb24sIHNvIHRoZSANCiAgZm9s bG93aW5nDQogIGRlZmluaXRpb24gb2YgYXZlcmFnZSwgaXMgbXVjaCBtb3Jl IG5hdHVyYWwNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBhdmVy YWdlIHhzIH5mID0NCiAg4pSCICAgQXJyYXkuZm9sZCB+aW5pdDowLiB+Zjoo ZnVuIHMgeCAtPiBzICsuIGYgeCkgeHMgLy4NCiAg4pSCICAgRmxvYXQub2Zf aW50IChBcnJheS5sZW5ndGggeHMpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IGl0IGhhcyB0eXBlIGAnYSBhcnJheSAtPiBmOignYSAtPiBmbG9hdCkgLT4g ZmxvYXQnIGFuZCBjb21wdXRlcyANCiAgYW4NCiAgYXZlcmFnZSBvZiBgZiB4 X2knIGZvciBhbGwgZWxlbWVudHMgaW4gdGhlIGFycmF5Lg0KDQoNCk9sZCBD V04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCANCiAgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIA0KICBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgDQogIHN1YnNj cmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRl Y2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHA6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hp dmVzXSANCjxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3Rp bmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 26 to Decemb= er 03, 2019.

Irmin 2.0.0 release

Continuing this thread, samoht announced

And there is now a follow-up blog post, explaining how to use the new Graph= QL API available in Irmin2: https://tarides.com/blog/2019-11-27-introducing-= irmin-graphql.

How viable is delivering binaries linked to Cygwin to Windows = customers?

mbacarella asked

I=E2=80=99m in the early stages of planning a deliverable binary product th= at will run on Linux, Mac and Windows.

My brief sniff of the air around the OCaml ecosystem says I should expect t= o target Cygwin to get Windows going (although there=E2=80=99s impressive w= ork to get native Windows stuff done that can become the preferred approach= in a few years).

My experience using Cygwin as an operating environment is that it=E2=80=99s= pretty darn sluggish compared to Linux on the same computer.

Why is this? There=E2=80=99s an anecdote that says Cygwin can only fork at = about 30-50x a second on Windows, due to how it has to adapt it to work wit= hin Windows=E2=80=99 task spawning model. (For contrast, Linux can achieve = thousands of forks per second if you play around with it).

I understand from another product developer that when they build binaries t= o deliver to Windows/Cygwin, they actually cross-compile on Linux because o= f how slowly the toolchain runs on Cygwin.

That sounds like bad news if you want to do UNIXy things, but for a single = standalone application this might not be so bad? I assume if I ship a deliv= erable to Windows/Cygwin, the end user may enjoy good performance, so long = as I=E2=80=99m not spawning tons of processes or relying on fork for multi-= programming. Is this a safe assumptions?

Any other gotchas when it comes to OCaml on Cygwin w.r.t. performance?

The app pretty much has real-time gaming requirements (though it=E2=80=99s = not a game so can side-step worrying about access to GPUs and what-not). St= ated another way, although my application will depend on the POSIX layer of= fered by Cygwin, I expect it not to crunch POSIX related stuff in the main = loop.

How has your experience gone?

John Whitington replied

I have been shipping commercial binaries for Linux (32 and 64 bit), Windows= (32 and 64bit) and OS X for years. For example: https://githu= b.com/coherentgraphics/cpdf-binaries

And even static or shared libraries in binary form: https://gith= ub.com/coherentgraphics/cpdflib-binary

On OS X, you need to use MACOSX_DEPLOYMENT_TARGET or similar to make sure y= our builds will run on older systems. And, in fact, you need to use MACOSX_= DEPLOYMENT_TARGET when asking OPAM to compile the OCaml compiler itself. An= d, you will need to deal with codesigning and notarization. But it=E2=80=99= s all doable.

For linux, you may need to build under older linux versions, to make sure t= hat the glibc in use is old enough. This is not an ocaml-specific problem. = I have a 64 bit and 32 bit VM with old-ish glibc versions for this purpose.

Under Windows, there are no such backward-compatibility problems. I use the= new OCaml for windows system, which comes with OPAM, and is mingw-based. N= o cygwin remains in the final binary.

For more obscure systems (AIX, HPUX, Sparc etc) customers compile from sour= ce (with help from me). Not once in more than ten years has anyone cared that = it was written in OCaml.

dbuenzli also replied

remember that on the Windows native port, the Unix module distributed with = OCaml is your POSIX compatibility layer. There are a few entry points to av= oid though, the list is at the bottom of this page.

nojb also replied

At LexiFi our main application is developed and shipped on Windows. We use = the msvc port of OCaml. This means that you need Cygwin to develop, but the= resulting application is fully native and does not depend on the Cygwin DL= L. As @dbuenzli mentioned, the Unix module is the POSIX compatibilit= y layer.

Compilation speed is slower on Windows because process creation is slower o= n Windows as a general rule, but it is manageable (our application has arou= nd 2000 modules + Js_of_ocaml + C bindings + C# component).

We don=E2=80=99t have any issues with runtime performance. The Unix library mentioned above implements Windows support directly without g= oing through any compatibility layer and is quite efficient.

BikalGurung also replied

There is an editor being built in ocaml/reasonml which currently targets wi= ndows, linux and macos - https:/= /github.com/onivim/oni2. However, the binary is native windows rather t= han cygwin derivative. So if you don=E2=80=99t have to use cygwin dependenc= ies then native windows binary could be the way to go.

Also esy - https://github.com/esy/es= y makes developing ocaml/reasonml on windows viable.

keleshev also replied

TLDR: Install the Mingw port of OCaml 4, freely use most opam libraries, and co= mpile to native Windows binaries, without licensing issues.

I recommend you read the =E2=80=9CRelease notes for Windows=E2=80=9D: htt= ps://github.com/ocaml/ocaml/blob/trunk/README.win32.adoc

To summarise, there are three Windows ports:

  • Native Microsoft port,
  • Native Mingw port,
  • Cygwin port.

All three require Cygwin for development purposes. I recommend using the Na= tive Mingw, as:

To contrast, Native Microsoft requires Visual Studio, and doesn=E2=80=99t h= ave opam. You can still vendor pure OCaml packages, but as soon as you want= to use some C bindings you=E2=80=99re in trouble, because of the =E2=80=9C= minor=E2=80=9D differences between Visual C and GCC. And everything assumes= GCC nowadays.

Cygwin port is the one I don=E2=80=99t have experience with, but re-reading= the =E2=80=9CRelease notes for Windows=E2=80=9D above it strikes me that i= t mentions that Cygwin was re-licensed from GPL to LGPL with static linking= exception. So it looks like the Cygwin port could be viable for commercial= use, but I never tried to statically linked cygwin.dll, and I= =E2=80=99m not sure what are the benefits of Cygwin port over the Mingw por= t.

dmbaturin also replied

With soupault 4, I decided = to ship prebuilt binaries for all platforms including Windows. Mostly to se= e if I can, all its users I know of are on UNIX-like systems and know how t= o build from source, but that=E2=80=99s beside the point. :wink:

I can confirm everything @keleshev says: fdopen=E2=80=99s package just work= s, opam works exactly like it does on UNIX, pure OCaml libraries are trivia= l to install, and the binaries don=E2=80=99t depend on cygwin. Note that =E2=80=9Copam switch create=E2=80=9D also just works, you can ins= tall either MinGW or MSVC compiler versions as opam switches. I only ever start the Windows VM to make release builds, and the workflow i= s exactly the same as on Linux where I=E2=80=99m actually writing code.

My only obstacle on that path was that FileUtils lost its Windows compatibi= lity, but I wanted to use it, so I worked with @gildor478 to make it cross-= platform again. Uncovered a bug in the implementation of Unix.utimes in the= process, but it=E2=80=99s hardly a commonly used function.

You can also setup AppVeyor builds. It=E2=80=99s not as simple as I wish it= would be, but there are projects doing it that you can steal the setup fro= m.

There=E2=80=99s also opam-cross-windows, but it=E2=80=99s very incomplete a= nd needs work to be practical. There are no big obstacles, it just needs wo= rk. While files in opam-repository-mingw are normally identical to the defa= ult opam repository, the cross one needs small adjustments in every package= to specify the toolchain to use, so the required work is mostly a lot of t= rivial but manual actions. I hope eventually it reaches parity with fdopen= =E2=80=99s one and we=E2=80=99ll be able to easily build for Windows withou= t ever touching Windows.

As of static Linux builds, @JohnWhitington=E2=80=99s approach can work, but= there=E2=80=99s a better option if you don=E2=80=99t need anything from gl= ibc specifically and don=E2=80=99t link against any C libs: build staticall= y with musl. There=E2=80=99s a +musl+static+flambda compiler f= lavour. You need musl and gcc-musl to install it, but after that, just buil= d with -ccopt -static flag and you get a binary that doesn=E2= =80=99t depend on anything.

Dune 2.0.0

rgrinberg announced

On behalf of the dune team, I=E2=80=99m delighted to announce the release o= f dune 2.0. This release is the culmination of 4 months of hard work by the= dune team and contains new features, bug fixes, and performance improvemen= ts . Here=E2=80=99s a selection of new features that I personally find inte= resting:

  • New boostrap procedure that works in low memory environments
  • (deprecated_library_name ..) stanza to properly deprecate = old library names
  • (foreign_library ..) stanza to define C/C++ libraries.
  • C stubs directly in OCaml executables

Refer to the change log for an exhaustive list.

We strive for a good out of the box experience that requires no configurati= on, so we=E2=80=99ve also tweaked a few defaults. In particular, $ du= ne build will now build @all instead of @install<= /code>, and ocamlformat rules are setup by default.

Lastly, dune 2.0 sheds all the legacy related to jbuilder and will no longe= r build jbuilder projects. This change is necessary to ease maintenance and= make it easier to add new features down the line. There are a few other mi= nor breaking changes. Refer to the change log for the full list. We apologi= ze in advance for any convenience this might cause.

Changelog

Advanced C binding using ocaml-ctypes and dune

toots announced

I worked on a socket.h binding last summer and had a great experience integ= rating ocaml-ctypes with dune, I thought that might be of interest to other= developers so I wrote about it: https://me= dium.com/@romain.beauxis/advanced-c-binding-using-ocaml-ctypes-and-dune-cc3= f4cbab302

rgrinberg replied

This is a good article. I encourage anyone who writes C bindings with ctype= s to study it carefully.

A little bit of advice to shorten your dune files:

(deps    (:gen ./gen_constants_c.exe))

This line isn=E2=80=99t necessary. Dune is smart enough to know that runnin= g a binary in a rule incurs a dependency on it.

dune has a truly amazing support for cross-compiling, which we do not cov= er here, but, unfortunately, its primitives for building and executing bina= ries do not yet cover this use case.

Indeed, we don=E2=80=99t have any primitives for running binaries on the ta= rget platform. Perhaps we should add some. However, we do in fact have some= features in dune to solve this concrete cross compilation problem. As far = as I understand, the goal is to obtain some compile time values such as #de= fine constants and field offsets for the target platform. This does not in = fact require to run anything on the cross compilation target. In configurat= or, we have a primitive C_define.import to extract this inform= ation. The end result is that these configurator scripts are completely com= patible with cross compilation.

Perhaps this could be generalized to work with ctypes generators as well?

Funny bit of trivia: The hack in configurator required to do this is in fac= t something I extracted from ctypes itself. The original author is whitequark, who in turn wrote it to = make ctypes itself amendable to cross compilation.

emillon then added

This does not in fact require to run anything on the cross compilation targ= et. In configurator, we have a primitive C_define.import to ex= tract this information. The end result is that these configurator scripts a= re completely compatible with cross compilation.

If anybody wants to know more about this bit, I wrote an article about this= last year: https://dune.bu= ild/blog/configurator-constants/

Upcoming breaking change in Base/Core v0.14

bcc32 announced

We=E2=80=99re changing functions in Base that used to use the polymorphic variant type [ `Fst of 'a | `Snd of 'b ] to use ('a, 'b)= Either.t instead. As well as enabling the use of all of the functions in the Either module, this makes the functions consistent with other functions that already use Either.t, (currently just Set.symmetric_diff)

The following functions=E2=80=99 types will change:

  • Result.ok_fst
  • List.partition_map
  • Map.partition_map, Map.partition_mapi
  • Hashtbl.partition_map, Hashtbl.partition_mapi=

The type of List.partition3_map will not change:

val partition3_map
  :  'a t
  -> f:('a -> [ `Fst of 'b | `Snd of 'c | `Trd of 'd ])
  -> 'b t * 'c t * 'd t

We don=E2=80=99t have a generic ternary variant, and it doesn=E2=80=99t see= m worth it to mint one just for this purpose.

Since this change is pretty straightforward, we expect that a simple find/r= eplace will be sufficient to update any affected call sites.

CI/CD Pipelines: Monad, Arrow or Dart?

Thomas Leonard announced

In this post I describe three approaches to building a language for writing= CI/CD pipelines. My first attempt used a monad, but this prevented static = analysis of the pipelines. I then tried using an arrow, but found the synta= x very difficult to use. Finally, I ended up using a light-weight alternati= ve to arrows that I will refer to here as a dart (I don=E2=80=99t know if t= his has a name already). This allows for static analysis like an arrow, but= has a syntax even simpler than a monad.

https= ://roscidus.com/blog/blog/2019/11/14/cicd-pipelines/

Use of functors to approximate F# statically resolved type par= ameters

cmxa asked

I am learning OCaml coming from F#. In F#, to calculate the average of an a= rray whose element type supports addition and division, one can write

let inline average (arr: 'a[]) : 'a
    when ^a : (static member DivideByInt : ^a * int -> ^a)
    and  ^a : (static member (+) : ^a * ^a -> ^a)
    and  ^a : (static member Zero : ^a)
    =3D
    if Array.length arr =3D 0 then (LanguagePrimitives.GenericZero) else
    LanguagePrimitives.DivideByInt (Array.fold (+) (LanguagePrimitives.Gene=
ricZero) arr) (Array.length arr)

My understanding is that in OCaml, one would have a module type like so:

module type Averagable =
=3D sig
  type 'a t

  val divide_by_int : 'a -> int -> 'a
  val plus : 'a -> 'a -> 'a
  val zero : 'a
end

My question is how the corresponding function would be written:

let average arr =3D
  ???

smolkaj replied

First, Averagable should look like this:

module type Averagable =
=3D sig
  type t
  val divide_by_int : t -> int -> t
  val plus : t -> t -> t
  val zero : t
end

Then average will look something like this:

let average (type t) =
(module A : Averagable with type t =3D t) (arr : t array) : t =3D
  Array.fold ~init:A.zero ~f:A.plus arr

(The code above uses Jane Street=E2=80=99s Base/Core library.)

ivg then added

While @smolkaj=E2=80=99s answer is a correct and direct implementation of y= our F# code, it might be nicer if your code can interplay with existing abs= tractions in the OCaml infrastructure. For example,

open Base

let average (type a) (module T : Floatable.S with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

and now it could be used with any existing numeric data in Base/Core

average (modul=
e Int) [|1;2;3;4|];;
- : Base.Float.t =3D 2.5

and even adapted to non-numbers,

let average_length =3D a=
verage (module struct
    include String
    let to_float x =3D Float.of_int (String.length x)
    let of_float _ =3D assert false
  end)

The latter example shows that we requested more interface than need, a cost= that we have to pay for using an existing definition. In cases when it mat= ters, you can specify the specific interface, e.g.,

module type Floatable =
=3D sig
  type t
  val to_float : t -> float
end

let average (type a) (module T : Floatable with type t =3D a) xs =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. T.to_float x) xs /.
  Float.of_int (Array.length xs)

But we reached the point where using first class modules is totally unneces= sary. Our interface has only one function, so the following definition of a= verage, is much more natural

let average xs ~f =3D
  Array.fold ~init:0. ~f:(fun s x -> s +. f x) xs /.
  Float.of_int (Array.length xs)

it has type 'a array -> f:('a -> float) -> float and = computes an average of f x_i for all elements in the array.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3mgnwACgkQBA0KO07S 5cf5fwf+OCEPaFcQMlEOtzuErgqjV/oabUhQIJqA3Yq7Kih3ehj3RGYDkUpZj6+T xWTHVEIRrH5zpyE851nzkwHPqMEkP1AyQYu24mtgwKTcfQgbNVJUMUB8vjtGA+Fc aW+XeC0IeTn3dv1lluGuR4w/4wkYjIxGAmsF+iXH2rEmvUzpM7+G8MjK98CM6W5e 9upIsJFmkr7LvAntKafU9bKxNfki8K8JdWlV9rJIoTwNhdx2oQYxAz+KVUagX1SW Yvoe8Kq1NAzFl0dWW91JM6O/dVpRvEo6WF/HBMePZuRbkySAzTJUascbJarxqHcn O4nLgjkzwmdfPZgsc6Q3MfVNWRNKfw== =a7+2 -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 8CDC87ED1F for ; Tue, 10 Dec 2019 09:21:05 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,299,1571695200"; d="asc'?scan'208,217";a="419541662" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 10 Dec 2019 09:21:05 +0100 User-agent: mu4e 1.2.0; emacs 26.3 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 10 Dec 2019 09:21:04 +0100 Message-ID: <87o8wg4mmn.fsf@inria.fr> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgRGVjZW1iZXIgMDMgDQp0byAxMCwNCjIwMTku DQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSW50ZXJuc2hpcHMg YXQgTm9tYWRpYy1sYWJzDQpJbnRlcmVzdGluZyBPQ2FtbCBBcnRpY2xlcw0K TmV4dCBPVVBTIG1lZXR1cCBEZWNlbWJlciAxOHRoIDIwMTkNCk9sZCBDV04N Cg0KDQpJbnRlcm5zaGlwcyBhdCBOb21hZGljLWxhYnMNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IA0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ludGVybnNoaXAtYXQtbm9t YWRpYy1sYWJzLzQ4MTk+DQoNCg0KSnVsaWVuIFRlc3NvbiBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vbWFkaWMgTGFicyBp cyBjdXJyZW50bHkgbG9va2luZyBmb3Igc3R1ZGVudHMgd2l0aCBhbiBpbnRl cmVzdCANCiAgaW4NCiAgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBmb3IgaW50 ZXJuc2hpcHMgdGhhdCB3b3VsZCB0YWtlIHBsYWNlIGluIA0KICBvdXINCiAg b2ZmaWNlcyBpbiBQYXJpcyBvciBHcmVub2JsZS4NCg0KICBXZSBoYXZlIGEg Y2F0YWxvZyBvZiBpbnRlcm5zaGlwcyB0b3BpY3MgYXZhaWxhYmxlIGF0IFsx XSBUaGUNCiAgaW50ZXJuc2hpcHMgdG9waWNzIGFyZSBtYWlubHkgYWRkcmVz c2VkIHRvIG1hc3RlciBzdHVkZW50IGJ1dCANCiAgb3RoZXINCiAgd2VsbCBt b3RpdmF0ZWQgYXBwbGljYXRpb24gd2lsbCBiZSBjb25zaWRlcmVkLg0KDQog IEEgZmlyc3Qgc2VsZWN0aW9uIHBoYXNlIG9uIHJlY2VpdmVkIHLDqXN1bcOp IHdpbGwgb2NjdXIgb24gDQogIGRlY2VtYmVyDQogIDE1dGguICBQbGVhc2Ug Y29udGFjdCB1cyBhdCBjb250YWN0QG5vbWFkaWMtbGFicy5jb20gYnkgDQog IHNwZWNpZnlpbmcNCiAgd2hpY2ggdG9waWNzIGluIHRoZSBjYXRhbG9nIHlv dSdyZSBpbnRlcmVzdGVkIGluLg0KDQogIFsxXTogPGh0dHBzOi8vbm9tYWRp Yy1sYWJzLmNvbS9kb3dubG9hZC9pbnRlcm5zaGlwX2NhdGFsb2cucGRmPg0K DQogIFBsZWFzZSwgZmVlbCBmcmVlIHRvIHJlZGlzdHJpYnV0ZSB3aWRlbHku DQoNCg0KSW50ZXJlc3RpbmcgT0NhbWwgQXJ0aWNsZXMNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50ZXJlc3Rpbmctb2NhbWwtYXJ0 aWNsZXMvMTg2Ny81Nz4NCg0KDQpqYW1lcyB3b29keWF0dCBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvdW5kIG9uICpM b2JzdGUucnMqOiBNYXJrIEthcnBvdiB3cml0ZXMgeWV0IGFub3RoZXIgW0hh c2tlbGwNCiAgdnMuIE9DYW1sXSBmb3Igb2xkIHRpbWUncyBzYWtlLiBJIGZv dW5kIGl0IHdvcnRoIGEgcmVhZCBhbmQgYSANCiAgbWVudGlvbg0KICBoZXJl Lg0KDQogIHAucy4gSGUgc3BlbmRzIGEgYml0IG9mIHRpbWUgaW4gdGhlIGlu dHJvIGxhbWVudGluZyB0aGUgbGFjayBvZiANCiAgYQ0KICBjb252ZW50aW9u YWwgVW5pY29kZSBzdHJpbmcgbGlicmFyeSBmb3IgT0NhbWwsIGFuZCBJIGZl ZWwgdGhhdCANCiAgcGFpbg0KICBhY3V0ZWx5LCBlc3BlY2lhbGx5IHNpbmNl IEknbSB0aGUgYXV0aG9yIG9mIGFuICp1bmNvbnZlbnRpb25hbCogDQogIG9u ZSwNCiAgaS5lLiB0aGUgW1Vjc190ZXh0XSBtb2R1bGUgaW4gbXkgW09yc2V0 dG9dIHByb2plY3QuDQoNCg0KW0hhc2tlbGwgdnMuIE9DYW1sXSANCjxodHRw czovL21hcmtrYXJwb3YuY29tL3Bvc3QvaGFza2VsbC12cy1vY2FtbC5odG1s Pg0KDQpbVWNzX3RleHRdDQo8aHR0cHM6Ly9iaXRidWNrZXQub3JnL2pody9v cnNldHRvL3NyYy9kZWZhdWx0L3NyYy91Y3MvdWNzX3RleHQubWxpPg0KDQpb T3JzZXR0b10gPGh0dHBzOi8vYml0YnVja2V0Lm9yZy9qaHcvb3JzZXR0bz4N Cg0KDQpOZXh0IE9VUFMgbWVldHVwIERlY2VtYmVyIDE4dGggMjAxOQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEu aW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDE5LTEyL21zZzAwMDA5 Lmh0bWw+DQoNCg0KQnJ1bm8gQmVybmFyZG8gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgT1VQUyBtZWV0dXAgaXMg YmFjay4gVGhlIG5leHQgb25lIHdpbGwgdGFrZSBwbGFjZSBvbiANCiAgV2Vk bmVzZGF5LA0KICBEZWNlbWJlciAxOCwgN3BtIGF0IElSSUxMIG9uIHRoZSBK dXNzaWV1IGNhbXB1cy4gQXMgdXN1YWwsIHdlIA0KICB3aWxsDQogIGhhdmUg YSBmZXcgdGFsa3MsIGZvbGxvd2VkIGJ5IHBpenphcyBhbmQgZHJpbmtzLg0K DQogIFRoZSB0YWxrcyB3aWxsIGJlIHRoZSBmb2xsb3dpbmc6DQoNCiAg4oCi IE5hdGhhbiBSZWJvdXJzLCBUaGUgZnV0dXJlIG9mIE9DYW1sLVBQWA0KDQog IOKAoiBHdWlsbGF1bWUgQ2xhcmV0LCBjb3Etb2Ytb2NhbWwNCiAgICAoPGh0 dHBzOi8vY2xhcnVzLmdpdGh1Yi5pby9jb3Etb2Ytb2NhbWwvPikNCg0KICBB bmQgcG9zc2libHkgYSB0aGlyZCB0YWxrLiBDb250YWN0IHVzIGlmIHlvdSB3 YW50IHRvIHByZXNlbnQNCiAgc29tZXRoaW5nLCBlc3BlY2lhbGx5IGlmIHlv dSBoYXZlIGEgc21hbGwgcHJvamVjdCB5b3Ugd2FudCB0byANCiAgc2hvdyBp bg0KICAxMC0xNW1pbi4NCg0KICBUbyByZWdpc3Rlciwgb3IgZm9yIG1vcmUg aW5mb3JtYXRpb24sIGdvIGhlcmU6DQogIDxodHRwczovL3d3dy5tZWV0dXAu Y29tL29jYW1sLXBhcmlzL2V2ZW50cy8yNjcwMTk0NTg+DQoNCiAgKlJlZ2lz dHJhdGlvbiBpcyByZXF1aXJlZCEgQWNjZXNzIGlzIG5vdCBndWFyYW50ZWVk IGFmdGVyIDdwbSBpZg0KICB5b3UncmUgbm90IHJlZ2lzdGVyZWQuKiAoSXQg YWxzbyBoZWxwcyB1cyB0byBvcmRlciB0aGUgcmlnaHQgDQogIGFtb3VudCBv Zg0KICBmb29kLikNCg0KICBBY2Nlc3MgbWFwOg0KICBJUklMTCAtIFVuaXZl cnNpdMOpIFBpZXJyZSBldCBNYXJpZSBDdXJpZSAoUGFyaXMgVkkpDQogIEJh cnJlIDE1LTE2IDFlciDDqXRhZ2UNCiAgNCBQbGFjZSBKdXNzaWV1DQogIDc1 MDA1IFBhcmlzDQogIDxodHRwczovL3d3dy5pcmlsbC5vcmcvcGFnZXMvYWNj ZXNzLmh0bWw+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIA0KICBJJ2xsIG1haWwNCiAgaXQgdG8g eW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRo ZSBbUlNTIGZlZWQgDQogIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSANCiAgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNo aXZlXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltS U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIA0KPGh0dHA6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9s aXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoN CltBbGFuIFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Pg0KDQo= --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 03 to 10, 20= 19.

Internships at Nomadic-labs

Julien Tesson announced

Nomadic Labs is currently looking for students with an interest in functional programming for internships that would take place in our offices in Paris or Grenoble.

We have a catalog of internships topics available at [1] The internships topics are mainly addressed to master student but other well motivated application will be considered.

A first selection phase on received r=C3=A9sum=C3=A9 will occur on december= 15th. Please contact us at contact@nomadic-labs.com by specifying which topics in the catalog you're interested in.

[1]: h= ttps://nomadic-labs.com/download/internship_catalog.pdf

Please, feel free to redistribute widely.

Interesting OCaml Articles

james woodyatt announced

Found on Lobste.rs: Mark Karpov writes yet another Haskell vs. OCaml for old = time's sake. I found it worth a read and a mention here.

p.s. He spends a bit of time in the intro lamenting the lack of a conventio= nal Unicode string library for OCaml, and I feel that pain acutely, especia= lly since I'm the author of an unconventional one, i.e. the Ucs= _text module in my Orsett= o project.

Next OUPS meetup December 18th 2019

Bruno Bernardo announced

The OUPS meetup is back. The next one will take place on Wednesday, December 18, 7pm at IRILL on the Jussieu campus. As usual, we will have a few talks, followed by pizzas and drinks.

The talks will be the following:

And possibly a third talk. Contact us if you want to present something, especially if you have a small project you want to show in 10-15min.

To register, or for more information, go here: https://www= .meetup.com/ocaml-paris/events/267019458

Registration is required! Access is not guaranteed after 7pm if you're not registered. (It also helps us to order the right amount of food.)

Access map:
IRILL - Universit=C3=A9 Pierre et Marie Curie (Paris VI)
Barre 15-16 1er =C3=A9tage
4 Place Jussieu
75005 Paris
https://www.irill.org/p= ages/access.html

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl3vVXEACgkQBA0KO07S 5cd+xwgAifRorC0FhUDS5VJtd0snvomxspU71Tjpn65hKzSCvyx3wVlFZjuzfgPy tZQX13DNx5cz1ws9QxL4ElxptDNs2e5z6zPhegzXQS7ayEC3+n/Cs3V5uNMGksds KSIw6Wsq76Z2QUQ7uH5Q/sLekyqa3TofVi7CDDZ/kR6mFH+gDtQPZkp97L/r/xGG PvX+v/yJUj7MmWKQ6BWaEXPcfDeeOabqFPdzZS7ysnw+WR2QgVjG4GRieJTp+WYX vQ6n60CKcSiB8iPgIZ1NT4Wrq+ROPbO0XQ4MTWnIZDgr+5LcmvB3EVlVpeNFZv75 v9435hpdZhBGbnIkQYyuFDrEmV1+7g== =8eNz -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 9DC5C7F30F for ; Tue, 17 Dec 2019 09:52:12 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,324,1571695200"; d="asc'?scan'208,217";a="333418708" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 17 Dec 2019 09:52:12 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 17 Dec 2019 09:52:10 +0100 Message-ID: <87fthjwczp.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgRGVjZW1iZXIgMTAgdG8gMTcsDQoyMDE5Lg0K DQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCklzIHRoZXJlIGEgZ29v ZCB3YXkgdG8gZW5jb2RlIGxpbmVhciB0eXBlcyBpbiBPQ2FtbD8NCkFyY2gg TGludXggaW5zdGFsbGVyIHdyaXR0ZW4gaW4gT0NhbWwNCmJhdHRlcmllcyBi YXR0ZXJpZXMuMi4xMS4wDQpPbGQgQ1dODQoNCg0KSXMgdGhlcmUgYSBnb29k IHdheSB0byBlbmNvZGUgbGluZWFyIHR5cGVzIGluIE9DYW1sPw0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9pcy10aGVyZS1hLWdvb2Qtd2F5LXRvLWVuY29k ZS1saW5lYXItdHlwZXMtaW4tb2NhbWwvMTI5Mi83Pg0KDQoNCkNvbnRpbnVp bmcgdGhpcyBvbGQgdGhyZWFkLCBLb25zdGFudGluIE9sa2hvdnNraXkgc2Fp ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSd2ZSBzdHVt YmxlZCB1cG9uIGEgbGlicmFyeSB0aGF0IGltcGxlbWVudHMgbGluZWFyIHR5 cGVzIGZvciBPQ2FtbCwNCiAgdXNpbmcgbW9uYWRzLCBsZW5zIGFuZCBzb21l IHBweCB0byBtYWtlIGl0IG1vcmUgbGlnaHR3ZWlnaHQuIE1pZ2h0IGJlDQog IG9mIGludGVyZXN0OiA8aHR0cHM6Ly9naXRodWIuY29tL2tlaWdvaS9saW5v Y2FtbD4NCg0KDQpBbnRvbiBLb2Noa292IGFkZGVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBJdCBpcyB0aGUgcGFydCBvZiBldmVuIG1vcmUgaW50ZXJlc3Rpbmcg c3lzdGVtIC0gW09DYW1sIE1QU1RdDQogIChNdWx0aXBhcnR5IFNlc3Npb24g VHlwZXMpIFNlZSB0aGUgW3NsaWRlc10uDQoNCg0KW09DYW1sIE1QU1RdIDxo dHRwczovL2dpdGh1Yi5jb20va2VpZ29pL29jYW1sLW1wc3Q+DQoNCltzbGlk ZXNdDQo8aHR0cHM6Ly93d3cuc2xpZGVzaGFyZS5uZXQva2VpZ29pL29jYW1s bXBzdC1nbG9iYWwtcHJvdG9jb2wtY29tYmluYXRvcnMtMTc1NTE5MjE0Pg0K DQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pIHRoZW4gc2FpZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgKFRoZSBwYXBlciBsaW5rZWQgb24gdGhh dCBwYWdlIGlzIGRhdGVkIDIwMTEvMjAxNC4gSW4gY2FzZSBhbnlvbmUNCiAg d29uZGVycyB3aGV0aGVyIHRoZSBhdXRob3JzIGhhdmUgZm91bmQgYSB0aW1l IG1hY2hpbmUgaW4gYSBiYXJuIHRvIGJlDQogIGFibGUgdG8gY2l0ZSBwYXBl cnMgZnJvbSAyMDE4LCB0aGVyZSBqdXN0IHNlZW1zIHRvIGJlIGFuIGVycm9y IGluIHRoZQ0KICBwcmVwYXJhdGlvbi4gSXQgaXMgZnJlc2hseSBwdWJsaXNo ZWQsIGFuZCBhIFBERiB3aXRoIGNvcnJlY3QgZGF0ZXMgaXMNCiAgYXZhaWxh YmxlIFtoZXJlXS4pDQoNCg0KW2hlcmVdDQo8aHR0cHM6Ly93d3cuanN0YWdl LmpzdC5nby5qcC9hcnRpY2xlL2lwc2pqaXAvMjcvMC8yN180MzEvX2FydGlj bGU+DQoNCg0KQXJjaCBMaW51eCBpbnN0YWxsZXIgd3JpdHRlbiBpbiBPQ2Ft bA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hcmNoLWxpbnV4LWluc3RhbGxl ci13cml0dGVuLWluLW9jYW1sLzQzODgvMTI+DQoNCg0KRGFycmVuIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSSdtIGRvaW5nIGEgc2hvcnQgdXBkYXRlIGhlcmUg YXMgT2FsaSBoYXMgc2VlbiBzb21lIHNpZ25pZmljYW50DQogIGNoYW5nZXMu IFRoaXMgdXBkYXRlIGlzIGFsc28gdGhlIGxhc3Qgb25lIGhlcmUgdG8gYXZv aWQgYmVpbmcgdG9vDQogIGFubm95aW5nLCBhbmQgYWxzbyBzaW5jZSBJIHdv bid0IGJlIGFkZCB0b28gbXVjaCBuZXcgc3R1ZmYgdG8gT2FsaSBpbg0KICBm b3Jlc2VlYWJsZSBmdXR1cmUuDQoNCiAgTWFqb3IgY2hhbmdlcyBzaW5jZSBs YXN0IHRpbWUNCiAg4oCiIFNhbHRTdGFjayBmaWxlcyBhbmQgc2NyaXB0IGZp bGVzIChvciBwcm9maWxlcykgbm93IGxpdmUgaW4gYQ0KICAgIHNlcGFyYXRl IFtyZXBvXQ0KICAgIOKAoiBPYWxpIGFjY2VwdHMgY3VzdG9tIHByb2ZpbGUg cmVwbyBVUkwgdG8gZmFjaWxpdGF0ZSB1c2luZyB5b3VyIG93bg0KICAgICAg U2FsdFN0YWNrIGZpbGVzIHdpdGhvdXQgZm9ya2luZyBPYWxpIGl0c2VsZg0K ICDigKIgU2VtaSBzZWxmLWRvY3VtZW50YXRpb24NCiAgICDigKIgQWRkZWQg bWVjaGFuaXNtIHRvIGZhY2lsaXRhdGUgaW5saW5lIGRvY3VtZW50YXRpb24g aW5zaWRlDQogICAgICBgb2FsaS5tbCcgaXRzZWxmDQogICAg4oCiIFRoZSBn ZW5lcmF0ZWQgbWFya2Rvd24gZG9jIGlzIHN0b3JlZCBhcyBbT0FMSV9ET0Nd IGluIHJlcG8sIGl0DQogICAgICBsaXN0cyBhbGwgdGhlIHN0ZXBzIChvciB0 YXNrcykgT2FsaSBkb2VzLCBhbG9uZyB3aXRoIGRlc2NyaXB0aW9ucw0KICDi gKIgQWRkZWQgTFZNIHN1cHBvcnQNCiAgICDigKIgV29ya3Mgd2l0aCBhbGwg MyBkaXNrIGxheW91dHMsIGFuZCBlbmNyeXB0aW9uDQogICAg4oCiIFNlZSBb aGVyZV0gZm9yIGRldGFpbHMgb24gYWRkZWQgbG9naWNhbCB2b2x1bWVzDQog IOKAoiBBbnN3ZXIgcmVtZW1iZXJpbmcgb2YgZGlhbG9ndWVzIHdoZW4gYXBw cm9wcmlhdGUNCiAgICDigKIgUmVsYXRpdmVseSBzdGF0aWMgYW5zd2VycyAo ZS5nLiBob3N0bmFtZSwgd2hldGhlciB0byB1c2UNCiAgICAgIGVuY3J5cHRp b24sIExWTSkgYXJlIHN0b3JlZCBpbiBgb2FsaV9hbnN3ZXJzJyBkaXJlY3Rv cnksIHdpdGggYQ0KICAgICAgSlNPTiBmaWxlIGZvciBlYWNoIHRhc2sNCiAg ICDigKIgVGhlICJhbnN3ZXIgc3RvcmUiIGNhbiBiZSB1c2VkIGluIG5ldyBz ZXNzaW9uIG9mIE9hbGkuIFRoZSBvbGQNCiAgICAgIGFuc3dlciBzdG9yZSBp cyB3aXBlZCBhY2NvcmRpbmdseSBpZiB1c2VyIGNoYW5nZXMgdGhlaXIgYW5z d2VyLg0KICDigKIgQWRkZWQgU1NIIHNlcnZlciBzZXR1cCBhbmQgcHVibGlj IGtleSB0cmFuc2ZlciBjb2RlIChwb3J0ZWQgZnJvbSBvbGQNCiAgICBzZXJ2 ZXIgYmFzaCBzY3JpcHQpDQogICAg4oCiIFNlZSBbaGVyZV0gZm9yIGRldGFp bHMNCiAgICDigKIgTWFpbmx5IHVzZWZ1bCBmb3Igd2hlbiB5b3UgaGF2ZSAo dmlydHVhbCkgY29uc29sZSBhY2Nlc3MgdG8gbGl2ZQ0KICAgICAgQ0QvT2Fs aSBpbnN0YWxsIHNjcmVlbiwgYW5kIHdhbnQgdG8gYWRkIG5lZWRlZCBwdWJs aWMga2V5IHRvIHRoZQ0KICAgICAgdXNlcidzIGAuc3NoL2F1dGhvcml6ZWRf a2V5cycgdmlhIG5ldHdvcmsgaW5zdGVhZCBvZiBsb2FkaW5nIGZyb20NCiAg ICAgIHBoeXNpY2FsIG1lZGl1bQ0KDQogIEkndmUgdXNlZCBPYWxpIHRvIGlu c3RhbGwgaW4gdmFyaW91cyBjb25maWd1cmF0aW9ucyBpbiBwYXN0IGNvdXBs ZSBvZg0KICBkYXlzLCBhbmQgaGF2ZSB5ZXQgdG8gbm90aWNlIG1ham9yIGRl ZmVjdHMuIFRoYXQgYmVpbmcgc2FpZCwgZXhlcmNpc2UNCiAgY2F1dGlvbiBh cyB5b3Ugd291bGQgZm9yIGluc3RhbGxpbmcgYW4gT1MuDQoNCg0KW3JlcG9d IDxodHRwczovL2dpdGh1Yi5jb20vZGFycmVubGRsL29hbGktcHJvZmlsZXM+ DQoNCltPQUxJX0RPQ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXJyZW5sZGwv b2FsaS9ibG9iL21hc3Rlci9PQUxJX0RPQy5tZD4NCg0KW2hlcmVdDQo8aHR0 cHM6Ly9naXRodWIuY29tL2RhcnJlbmxkbC9vYWxpL2Jsb2IvbWFzdGVyL09B TElfRE9DLm1kIzIwLXNldC11cC1kaXNrPg0KDQpbaGVyZV0NCjxodHRwczov L2dpdGh1Yi5jb20vZGFycmVubGRsL29hbGkvYmxvYi9tYXN0ZXIvT0FMSV9E T0MubWQjNTQtdHJhbnNmZXItc3NoLXB1YmxpYy1rZXlzPg0KDQoNCmJhdHRl cmllcyBiYXR0ZXJpZXMuMi4xMS4wDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1iYXR0ZXJpZXMtYmF0dGVyaWVzLTItMTEtMC80 ODcxLzE+DQoNCg0KVW5peEp1bmtpZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFRoZSBsYXRlc3QgMi54IHJlbGVhc2Ugb2YgYmF0dGVyaWVz IGlzIGF2YWlsYWJsZSBpbiBvcGFtLiAgT0NhbWwNCiAgYmF0dGVyaWVzIGlu Y2x1ZGVkIGlzIGEgY29tbXVuaXR5IG1haW50YWluZWQgZXh0ZW5kZWQgc3Rh bmRhcmQNCiAgbGlicmFyeS4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLWJhdHRlcmllcy10ZWFtL2JhdHRlcmllcy1pbmNsdWRlZD4NCg0KICBU aGUgQVBJIGRvY3VtZW50YXRpb24gaXMgaG9zdGVkIGhlcmU6DQogIDxodHRw czovL29jYW1sLWJhdHRlcmllcy10ZWFtLmdpdGh1Yi5pby9iYXR0ZXJpZXMt aW5jbHVkZWQvaGRvYzIvPg0KDQogIEhlcmUgaXMgdGhlIGNoYW5nZWxvZzoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2Mi4xMS4wIChtaW5vciByZWxl YXNlKQ0KICDilIIgDQogIOKUgiBUaGlzIG1pbm9yIHJlbGVhc2UgZml4ZXMg YSBmZXcgYnVncyBvciBpbnRlcmZhY2UgbWlzbWF0Y2ggd2l0aCBPQ2FtbCBz dGRsaWIsDQogIOKUgiBhbmQgaXMgY29tcGF0aWJsZSB3aXRoIEJFUiBNZXRh T0NhbWwuDQogIOKUgiANCiAg4pSCIFRoaXMgaXMgdGhlIGxhc3QgcGxhbm5l ZCByZWxlYXNlIG9mIHRoZSB2MiBzZXJpZXMuDQogIOKUgiBOZXh0IHBsYW5u ZWQgcmVsZWFzZSAodjMuMC4wKSB3aWxsIGludHJvZHVjZSBzb21lIEFQSSBj aGFuZ2VzLg0KICDilIIgDQogIOKUgiBOb3RhYmxlIGNoYW5nZXM6DQogIOKU giANCiAg4pSCICAgICBBZGQgVW5peC53aXRoX2xvY2tlZF9maWxlDQogIOKU giAgICAgIzkwNA0KICDilIIgICAgIChTaW1vbiBDcnVhbmVzLCBDZWRyaWMg Q2VsbGllciwgcmV2aWV3IGJ5IEZyYW5jb2lzIEJlcmVuZ2VyKQ0KICDilIIg DQogIOKUgiAgICAgQnVpbGQgd2l0aCAtc3RyaWN0LXNlcXVlbmNlDQogIOKU giAgICAgIzkyNw0KICDilIIgICAgIChBcm1hw6tsIEd1w6luZWF1LCByZXZp ZXcgYnkgRnJhbmNvaXMgQmVyZW5nZXIpDQogIOKUgiANCiAg4pSCICAgICBB ZGQgTGVnYWN5LlJlc3VsdCBmb3IgT0NhbWwgPj0gNC44LjANCiAg4pSCICAg ICAjOTEzDQogIOKUgiAgICAgKENlZHJpYyBDZWxsaWVyLCByZXZpZXcgYnkg RnJhbmNvaXMgQmVyZW5nZXIpDQogIOKUgiANCiAg4pSCICAgICBSZW1vdmUg QmF0T28NCiAg4pSCICAgICAjOTE1DQogIOKUgiAgICAgKENlZHJpYyBDZWxs aWVyLCByZXZpZXcgYnkgRnJhbmNvaXMgQmVyZW5nZXIpDQogIOKUgiANCiAg 4pSCICAgICBBZGQgQmF0RmlsZW5hbWUNCiAg4pSCICAgICAjOTEwDQogIOKU giAgICAgKENlZHJpYyBDZWxsaWVyLCByZXZpZXcgYnkgRnJhbmNvaXMgQmVy ZW5nZXIpDQogIOKUgiANCiAg4pSCICAgICBNYWtlIGJhdHRlcmllcyB1c2Fi bGUgd2l0aCBCRVIgTWV0YU9DYW1sDQogIOKUgiAgICAgIzkwOQ0KICDilIIg ICAgIChDZWRyaWMgQ2VsbGllciwgcmV2aWV3IGJ5IEZyYW5jb2lzIEJlcmVu Z2VyIGFuZCBHYWJyaWVsIFNjaGVyZXIpDQogIOKUgiANCiAg4pSCICAgICBV bml4LnNsZWVwZiBpcyBwcm92aWRlZCBhY3Jvc3MgYWxsIE9DYW1sIHZlcnNp b25zOw0KICDilIIgICAgIHByZXZpb3VzbHkgaXQgd2FzIG9ubHkgZm9yIE9D YW1sID49IDQuMDMuMA0KICDilIIgICAgICM5MzANCiAg4pSCICAgICAoRnJh bmNvaXMgQmVyZW5nZXIsIHJldmlldyBieSBDZWRyaWMgQ2VsbGllcikNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3Ug Y2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0 byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3Ig dGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWws IHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNj aG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4u c2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8 aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVl ZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5 bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBT Y2htaXR0XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 10 to 17, 20= 19.

Is there a good way to encode linear types in OCaml?

Continuing this old thread, Konstantin Olkhovskiy sai= d

I've stumbled upon a library that implements linear types for OCaml, using = monads, lens and some ppx to make it more lightweight. Might be of interest= : https://github.com/keigoi/= linocaml

Anton Kochkov added

It is the part of even more interesting system - OCaml MPST (Multiparty Session Types) See the slides.

Guillaume Munch-Maccagnoni then said

(The paper linked on that page is dated 2011/2014. In case anyone wonders w= hether the authors have found a time machine in a barn to be able to cite p= apers from 2018, there just seems to be an error in the preparation. It is freshly published, and a PDF with correct d= ates is available here.)

Arch Linux installer written in OCaml

Darren announced

I'm doing a short update here as Oali has seen some significant changes. Th= is update is also the last one here to avoid being too annoying, and also s= ince I won't be add too much new stuff to Oali in foreseeable future.

Major changes since last time

  • SaltStack files and script files (or profiles) now live in a separate <= a href=3D"https://github.com/darrenldl/oali-profiles">repo
    • Oali accepts custom profile repo URL to facilitate using your own SaltS= tack files without forking Oali itself
  • Semi self-documentation
    • Added mechanism to facilitate inline documentation inside oali.ml= itself
    • The generated markdown doc is stored as OALI_DOC in repo, it lists all t= he steps (or tasks) Oali does, along with descriptions
  • Added LVM support
    • Works with all 3 disk layouts, and encryption
    • See here for details on added logical volumes
  • Answer remembering of dialogues when appropriate
    • Relatively static answers (e.g. hostname, whether to use encryption, LV= M) are stored in oali_answers directory, with a JSON file for = each task
    • The "answer store" can be used in new session of Oali. The old answer s= tore is wiped accordingly if user changes their answer.
  • Added SSH server setup and public key transfer code (ported from old se= rver bash script)
    • See here for details
    • Mainly useful for when you have (virtual) console access to live CD/Oal= i install screen, and want to add needed public key to the user's .ss= h/authorized_keys via network instead of loading from physical mediu= m

I've used Oali to install in various configurations in past couple of days,= and have yet to notice major defects. That being said, exercise caution as= you would for installing an OS.

batteries batteries.2.11.0

UnixJunkie announced

The latest 2.x release of batteries is available in opam. OCaml batteries included is a community maintained extended standard librar= y.

http= s://github.com/ocaml-batteries-team/batteries-included

The API documentation is hosted here: https://ocaml-batteries-team.github.io/batteries-included/hdoc2/

Here is the changelog:

v2.11.0 (minor release)

This minor release fixes a few bugs or interface mismatch with OCaml stdlib,
and is compatible with BER MetaOCaml.

This is the last planned release of the v2 series.
Next planned release (v3.0.0) will introduce some API changes.

Notable changes:

    Add Unix.with_locked_file
    #904
    (Simon Cruanes, Cedric Cellier, review by Francois Berenger)

    Build with -strict-sequence
    #927
    (Arma=C3=ABl Gu=C3=A9neau, review by Francois Berenger)

    Add Legacy.Result for OCaml >=3D 4.8.0
    #913
    (Cedric Cellier, review by Francois Berenger)

    Remove BatOo
    #915
    (Cedric Cellier, review by Francois Berenger)

    Add BatFilename
    #910
    (Cedric Cellier, review by Francois Berenger)

    Make batteries usable with BER MetaOCaml
    #909
    (Cedric Cellier, review by Francois Berenger and Gabriel Scherer)

    Unix.sleepf is provided across all OCaml versions;
    previously it was only for OCaml >=3D 4.03.0
    #930
    (Francois Berenger, review by Cedric Cellier)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl34lzsACgkQBA0KO07S 5cekYAf+L6G2J/gXXxJz/+8ZL58php7a2DXXAUC17PewMnaz/hPATBxe+JaMy1Xh D7GEuECgLqsIQv6Jm43oNk7ba7O0l2ER1Wy6sIdhR/MnQ+uBJHsgeFSPT0w6x5fQ dmSZtThfEVVAYlx22ckhBzYxvoBkKYtBm9SBxtSIy5JvY4QYfUU72C6O8p4jJWOW JsIbrtgYuCbylprNGuTt5KVs2ABBOgiInZHqx5qfbHl4GsP4MHzjO9qyoILvNvTz WZ/2pPFDljaKbWEbaOrBZ88bIdUrt6wYn9dmamGVsSr+XrhPLhYy/rVBnoNra0e0 lj0EUH5Jop8X9L62bIIxDfpB/Srk1g== =Nn/M -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 3F7AF7ED20 for ; Tue, 31 Dec 2019 10:18:39 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,378,1571695200"; d="scan'208,217";a="429510496" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 31 Dec 2019 10:18:38 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 31 Dec 2019 10:18:38 +0100 Message-ID: <87y2usx381.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgRGVjZW1iZXIgMTcgdG8gMzEsDQoyMDE5Lg0K DQpTb3JyeSBmb3IgdGhlIGhpYXR1cyBsYXN0IHdlZWssIEkgd2FzIGF3YXkg d2l0aCBubyBpbnRlcm5ldA0KYWNjZXNzLiBIYXBweSBuZXcgeWVhciENCg0K VGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpJbnRlcm5zaGlwcyBhdCBC ZSBTcG9ydCAoT0NhbWwsIE9jc2lnZW4pDQpvY2FtbC1sc3AgcHJldmlldw0K UmVwcm9kdWNpYmxlIGJ1aWxkcyB3aXRoIE9DYW1sIC8gb3BhbSBhbmQgTWly YWdlT1MNCnRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uDQpzb3VwYXVs dDogYSBzdGF0aWMgd2Vic2l0ZSBnZW5lcmF0b3IgYmFzZWQgb24gSFRNTCBy ZXdyaXRpbmcNClJlbGVhc2Ugb2Ygb3dsLXN5bWJvbGljIDAuMS4wDQpPbGQg Q1dODQoNCg0KSW50ZXJuc2hpcHMgYXQgQmUgU3BvcnQgKE9DYW1sLCBPY3Np Z2VuKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2Nh bWwtbGlzdC8yMDE5LTEyL21zZzAwMDIzLmh0bWw+DQoNCg0KQmUgU3BvcnQg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBCZSBTcG9ydCBjdXJyZW50bHkg aGFzIHNldmVyYWwgb3BlbiBpbnRlcm5zaGlwIHBvc2l0aW9ucyBmb3IgT0Nh bWwNCiAgZGV2ZWxvcGVycy4NCg0KICBLZXl3b3JkczogT0NhbWwsIE9jc2ln ZW4sIE1vYmlsZSBhcHAgZGV2ZWxvcG1lbnQsIFdlYiwgRGF0YWJhc2UsDQog IFNwb3J0LCBTb2NpYWwgbmV0d29ya3MNCg0KICBCZSBTcG9ydCBkZXZlbG9w cyB0aGUgZmlyc3QgZ2xvYmFsIHBsYXRmb3JtIGRlZGljYXRlZCB0byBzcG9y dCwgaW4NCiAgY29sbGFib3JhdGlvbiB3aXRoIHByb21pbmVudCBhY3RvcnMg b2Ygc3BvcnQgaW4gRnJhbmNlIGFuZCBpbiB0aGUNCiAgd29ybGQuICBBbGwg b3VyIGRldmVsb3BtZW50IGlzIGRvbmUgaW4gT0NhbWwuIE91ciBXZWIgYW5k IG1vYmlsZSBhcHBzDQogIChpT1MsIEFuZHJvaWQpIGFyZSBkZXZlbG9wZWQg YXMgYSBtdWx0aS10aWVyIGFwcCB1c2luZyB0aGUgT2NzaWdlbg0KICBmcmFt ZXdvcmsuICBPdXIgcHJlbWlzZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIGNlbnRl ciBvZiBQYXJpcy4NCg0KICBQbGVhc2UgY29udGFjdCBtZSBmb3IgbW9yZSBp bmZvcm1hdGlvbi4NCg0KDQpvY2FtbC1sc3AgcHJldmlldw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t b2NhbWwtbHNwLXByZXZpZXcvNDg3Ni8xPg0KDQoNClJ1ZGkgR3JpbmJlcmcg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20g ZXhjaXRlZCB0byBhbm5vdW5jZSBbb2NhbWwtbHNwXS4gVGhpcyBwcm9qZWN0 IGNvbnRhaW5zIGFuDQogIGltcGxlbWVudGF0aW9uIG9mIGFuIExTUCBzZXJ2 ZXIgZm9yIHRoZSBPQ2FtbCBsYW5ndWFnZS4gVGhlIGN1cnJlbnQNCiAgaW1w bGVtZW50YXRpb24gcGlnZ3kgYmFja3Mgb24gdGhlIHdpZGVseSBzdWNjZXNz ZnVsIFttZXJsaW5dIHRvb2wgdG8NCiAgcHJvdmlkZSBjb21wbGV0aW9uICYg dHlwZSBpbmZlcmVuY2UuIEluIHRoZSBmdXR1cmUsIHdlJ2QgbGlrZSB0byB1 c2UNCiAgYWxsIG90aGVyIGVzc2VudGlhbCB0b29scyBzdWNoIGFzIG9jYW1s Zm9ybWF0LCBvZG9jLCBkdW5lIHRvIHByb3ZpZGUNCiAgbW9yZSBmdW5jdGlv bmFsaXR5IGluIHlvdXIgZWRpdG9ycy4NCg0KICBGb3Igbm93LCB0aGUgcHJv amVjdCBpc24ndCB5ZXQgYXZhaWxhYmxlIG9uIG9wYW0gYXMgd2UncmUgc3Rp bGwNCiAgcG9saXNoaW5nIHNvbWUgcm91Z2ggZWRnZXMgaW4gdGhlIHJlbGVh c2UgcHJvY2Vzcy4gTmV2ZXJ0aGVsZXNzLCBJDQogIGludml0ZSBhbGwgYnJh dmUgc291bHMgd2hvIGFyZSByZWFkeSB0byBleHBlcmltZW50IHRvIGdpdmUg dGhpcyBsc3ANCiAgc2VydmVyIGEgdHJ5LiBZb3VyIGZlZWRiYWNrICYgY29u dHJpYnV0aW9ucyBhcmUgbW9zdCB3ZWxjb21lDQogIDpzbGlnaHRfc21pbGU6 DQoNCg0KW29jYW1sLWxzcF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC1sc3A+DQoNClttZXJsaW5dIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvbWVybGluPg0KDQoNClVuaXhKdW5raWUgYXNrZWQgYW5kIEFudG9uIEtv Y2hrb3YgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgICAgICAgVGhpcyBwcm9qZWN0IGxvb2tzIG5pY2UuDQoN CiAgICAgICAgSWYgSSBhbSBhbiBFbWFjcyBvciBWaSB1c2VyLCBjYW4gSSB0 YWtlIGFkdmFudGFnZSBvZiBhbg0KICAgICAgICBMU1Agc2VydmVyPw0KDQog ICAgICAgIE9yLCBpcyB0aGlzIG9ubHkgZm9yIHNvbWUgbmV3IGVkaXRvcnMg bGlrZSBBdG9tIG9yIFZTY29kZT8NCg0KICBAVW5peEp1bmtpZSBvZiBjb3Vy c2UhIFRoYXQncyB0aGUgd2hvbGUgcG9pbnQgb2YgdGhpcyB0b29saW5nLg0K DQogIEZvciBWaW0geW91IGNhbiBjaG9vc2UgYmV0d2VlbjoNCiAg4oCiIFtD b2MubnZpbV0gLSBtb3N0IHBvd2VyZnVsIG9mIGFsbCwgYnV0IHdyaXR0ZW4g aW4gVHlwZVNjcmlwdCBhbmQNCiAgICBoZWF2aWVzdCBvZiBhbGwNCiAg4oCi IFtBbGVdIC0gcHVyZSBWaW1MDQogIOKAoiBbdmltLWxzcF0gLSBwdXJlIFZp bUwNCiAg4oCiIFtMYW5ndWFnZUNsaWVudC1uZW92aW1dIC0gd3JpdHRlbiBp biBSdXN0DQogIOKAoiBTb21lIG90aGVyIGltcGxlbWVudGF0aW9ucw0KDQog IEkgYW0gbm90IGFuIEVtYWNzIGV4cGVydCwgYnV0IHRoZXJlIGlzIGFtYXpp bmcgTFNQIGludGVncmF0aW9uIHRvbzoNCiAg4oCiIFtsc3AtbW9kZV0NCg0K ICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEv dXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9iL2I4YWNkNzQ1NTI3ZTgwMWZl ZjFlYjNkNGU4NzIyZDQ5YzVjMmVkMWEucG5nPg0KDQoNCltDb2MubnZpbV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9uZW9jbGlkZS9jb2MubnZpbT4NCg0KW0Fs ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kZW5zZS1hbmFseXNpcy9hbGU+DQoN Clt2aW0tbHNwXSA8aHR0cHM6Ly9naXRodWIuY29tL3ByYWJpcnNocmVzdGhh L3ZpbS1sc3A+DQoNCltMYW5ndWFnZUNsaWVudC1uZW92aW1dDQo8aHR0cHM6 Ly9naXRodWIuY29tL2F1dG96aW11L0xhbmd1YWdlQ2xpZW50LW5lb3ZpbT4N Cg0KW2xzcC1tb2RlXSA8aHR0cHM6Ly9naXRodWIuY29tL2VtYWNzLWxzcC9s c3AtbW9kZT4NCg0KDQpQYXUgUnVpeiBTYWZvbnQgc2FpZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgTmVvdmltIDAuNS4wIChub3cgcHJlLXJlbGVhc2VkKSBo YXMgbmF0aXZlIExTUCBzdXBwb3J0IGFzIHdlbGw6DQogIDxodHRwczovL2dp dGh1Yi5jb20vbmVvdmltL25lb3ZpbS9wdWxsLzExMzM2Pg0KDQogIE5vdCBz dXJlIGhvdyB3ZWxsIGludGVncmF0ZWQgaXMgaXQgZ29pbmcgdG8gYmUgd2l0 aCB2YXJpb3VzIHBsdWdpbnMNCiAgKFtleGFtcGxlXSkNCg0KDQpbZXhhbXBs ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9TaG91Z28vZGVvcGxldGUtbHNwPg0K DQoNCkFudG9uIEtvY2hrb3YgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5l b1ZpbSAwLjUuMCB3aWxsIGFsc28gaW5jbHVkZSB0aGUgW3RyZWUtc2l0dGVy XSBwYXJzZXIgZm9yIHN5bnRheA0KICBoaWdobGlnaHRpbmcsIHdoaWNoIHdp bGwgYWxsb3cgd2F5IGJldHRlciBjb2xvcmluZy4gQW5kIHRyZWUtc2l0dGVy DQogIGFscmVhZHkgaGFzIFtPQ2FtbCBncmFtbWFyXSwgc28gaW1wbGVtZW50 aW5nIHNlbWFudGljcy1hd2FyZSBzeW50YXgNCiAgaGlnaGxpZ2h0ZXIgd2ls bCBiZSBlYXNpZXIuIEJ1dCBJIGV4cGVjdCB0aGUgc3VwcG9ydCBtb3JlIG9y IGxlc3MNCiAgcmVhZHkgZm9yIGV4dGVybmFsIGNvbnRyaWJ1dGlvbnMgb25s eSBpbiAwLjYuMCwgc2FkbHkuIEludGVncmF0aW5nIHRoZQ0KICB0b29sIHdp dGggc29tZXRoaW5nIGxpa2UgW0dpdEh1YiBTZW1hbnRpY10gKCpIYXNrZWxs IGFsZXJ0Kikgd2lsbA0KICBncmVhdGx5IGltcHJvdmUgT0NhbWwgZXhwZXJp ZW5jZSBvbiBHaXRIdWIgdG9vLCBzZWUgdGhlIFtjb3JyZXNwb25kaW5nDQog IGlzc3VlXS4NCg0KDQpbdHJlZS1zaXR0ZXJdIDxodHRwczovL3RyZWUtc2l0 dGVyLmdpdGh1Yi5pby90cmVlLXNpdHRlci8+DQoNCltPQ2FtbCBncmFtbWFy XSA8aHR0cHM6Ly9naXRodWIuY29tL3RyZWUtc2l0dGVyL3RyZWUtc2l0dGVy LW9jYW1sPg0KDQpbR2l0SHViIFNlbWFudGljXSA8aHR0cHM6Ly9naXRodWIu Y29tL2dpdGh1Yi9zZW1hbnRpYz4NCg0KW2NvcnJlc3BvbmRpbmcgaXNzdWVd IDxodHRwczovL2dpdGh1Yi5jb20vZ2l0aHViL3NlbWFudGljL2lzc3Vlcy8x Mzg+DQoNCg0KUGlldGVyIEdvZXRzY2hhbGNreCBzYWlkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBUaGUgbmV4dCBzdGVwIGZvciBTZW1h bnRpYyBzdXBwb3J0IGlzIGRvY3VtZW50ZWQgW2hlcmVdLCBidXQgSSdtDQog IHdvcmtpbmcgb24gc29tZSBbaW1wcm92ZW1lbnRzXSBvZiB0aGUgdHJlZS1z aXR0ZXIgcGFyc2VyIGZpcnN0Lg0KDQoNCltoZXJlXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS90cmVlLXNpdHRlci9oYXNrZWxsLXRyZWUtc2l0dGVyL2Jsb2Iv bWFzdGVyL2RvY3MvY29kZWdlbi5tZD4NCg0KW2ltcHJvdmVtZW50c10NCjxo dHRwczovL2dpdGh1Yi5jb20vdHJlZS1zaXR0ZXIvdHJlZS1zaXR0ZXItb2Nh bWwvcHVsbC8zNj4NCg0KDQpDYXJsb3MgRCdBZ29zdGlubyBzYWlkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBGb3IgRW1hY3MgdGhlcmUgaXMgYWxz byBgZWdsb3QnOiA8aHR0cHM6Ly9naXRodWIuY29tL2pvYW90YXZvcmEvZWds b3Q+DQogIOKAkyBBcyB0aGUgUkVBRE1FIHNheXMsIGl0J3MgcXVpdGUgbWlu aW1hbGlzdCBjb21wYXJlZCB0byBgbHNwLW1vZGUnLg0KDQoNClJlcHJvZHVj aWJsZSBidWlsZHMgd2l0aCBPQ2FtbCAvIG9wYW0gYW5kIE1pcmFnZU9TDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3JlcHJvZHVjaWJsZS1idWlsZHMtd2l0aC1vY2Ft bC1vcGFtLWFuZC1taXJhZ2Vvcy80ODc3LzE+DQoNCg0KSGFubmVzIE1laG5l cnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBJIHdyb3RlIHVwIHJlY2VudCBkZXZlbG9wbWVudHMgYWJvdXQgcmVwcm9k dWNpYmxlIGJ1aWxkcyB3aXRoIG9wYW0g4oCTDQogIGluY2x1ZGluZyBzb21l IHRvb2xpbmcgPGh0dHBzOi8vaGFubmVzLm5xc2IuaW8vUG9zdHMvUmVwcm9k dWNpYmxlT1BBTT4NCg0KICBUaGFua3MgdG8gZXZlcnlvbmUgaW52b2x2ZWQg aW4gdGhlIGVmZm9ydCB0byBnZXQgT0NhbWwgYW5kIG9wYW0NCiAgZGV0ZXJt aW5pc3RpYw0KICDigKIgTm92IDIwMTUgW0kgY29sbGVjdGVkIGRvd25zdHJl YW0gcGF0Y2hlcyBhbmQgYXNrZWQga2luZGx5IHRvIGdldA0KICAgIHRoZW0g dXBzdHJlYW1dICh0ZW1wb3JhcnkgZmxsZSBuYW1lcyBpbiBiaW5hcmllcywg dGltZXN0YW1wcykNCiAg4oCiIERlYyAyMDE3IFtCVUlMRF9QQVRIX1BSRUZJ WF9NQVAgc3VwcG9ydF0gKGFuZCBmdXJ0aGVyIHBhdGNoZXMgZm9yDQogICAg dGhhdCkNCiAg4oCiIERlYyAyMDE4IFBhcmlzIHN1bW1pdCBbb3BhbSByZXBy b2R1Y2liaWxpdHldIFtNaXJhZ2VPU10NCiAg4oCiIFtgb3JiJ10gdG9vbCBm b3IgcmVwcm9kdWNpYmlsaXR5IHRlc3RpbmcgKHNvIG11Y2ggYmV0dGVyIHRo YW4gdGhlDQogICAgc2hlbGwgc2NyaXB0cyBJIHVzZWQgaW4gdGhlIG1lYW50 aW1lKQ0KICDigKIgRGVjIDIwMTkgW01hcnJha2VzaCBzdW1taXRdDQoNCiAg VGhlIGpvdXJuZXkgaXMgbm90IHlldCBmaW5pc2hlZCwgd2UncmUgaW4gYSBw cmV0dHkgZ29vZCBzaGFwZSwgYnV0DQogIGZ1cnRoZXIgdGVzdGluZyBhbmQg dG9vbGluZyBpcyBuZWVkZWQgdG8gZXhwb3NlIHRoZSBpbmZvcm1hdGlvbiAi aXMgbXkNCiAgbGlicmFyeSByZXByb2R1Y2libGU/IiB0byBPQ2FtbCBkZXZl bG9wZXJzLg0KDQogIEknbSBpbnRlcmVzdGVkIGluIGZlZWRiYWNrLCBwbGVh c2UgbGV0IHVzIGRpc2N1c3MgdGhpcyBmdXJ0aGVyIGhlcmUgaW4NCiAgY2Fz ZSB5b3UncmUgaW50ZXJlc3RlZC4gOkQNCg0KDQpbSSBjb2xsZWN0ZWQgZG93 bnN0cmVhbSBwYXRjaGVzIGFuZCBhc2tlZCBraW5kbHkgdG8gZ2V0IHRoZW0g dXBzdHJlYW1dDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy83MDM3Pg0KDQpbQlVJTERfUEFUSF9QUkVGSVhfTUFQIHN1cHBvcnRd DQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTUxNT4N Cg0KW29wYW0gcmVwcm9kdWNpYmlsaXR5XQ0KPGh0dHBzOi8vcmVwcm9kdWNp YmxlLWJ1aWxkcy5vcmcvZXZlbnRzL3BhcmlzMjAxOC9yZXBvcnQvI1RvYzEx NDEwXzMzMTc2MzA3Mz4NCg0KW01pcmFnZU9TXQ0KPGh0dHBzOi8vcmVwcm9k dWNpYmxlLWJ1aWxkcy5vcmcvZXZlbnRzL3BhcmlzMjAxOC9yZXBvcnQvI1Rv YzExNjgxXzMzMTc2MzA3Mz4NCg0KW2BvcmInXSA8aHR0cHM6Ly9naXRodWIu Y29tL3JqYm91L29yYj4NCg0KW01hcnJha2VzaCBzdW1taXRdDQo8aHR0cHM6 Ly9yZXByb2R1Y2libGUtYnVpbGRzLm9yZy9ldmVudHMvTWFycmFrZXNoMjAx OS8+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgYWRkZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEFuIGFic29sdXRlbHkgYW1hemluZyBjcm9z cy1sYXllciBlZmZvcnQ7IHdlbGwgZG9uZSBvbiBwdXNoaW5nIGFsbA0KICB0 aGlzIHRocm91Z2ggQGhhbm5lcyEgIEkgcmVhbGx5IGVuam95ZWQgcmVhZGlu ZyB0aGUgbWludXRlcyBvZiB0aGUNCiAgUGFyaXMgc3VtbWl0IGxhc3QgeWVh cjoNCiAgPGh0dHBzOi8vcmVwcm9kdWNpYmxlLWJ1aWxkcy5vcmcvZXZlbnRz L3BhcmlzMjAxOC9yZXBvcnQvI1RvYzExNjgxXzMzMTc2MzA3Mz4NCg0KDQp0 aGUgT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGhlLW9jYW1sLXNv ZnR3YXJlLWZvdW5kYXRpb24vNDQ3Ni8xMz4NCg0KDQpDb250aW51aW5nIHRo aXMgdGhyZWFkLCBnYXNjaGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBBIHNtYWxsIHJlcG9ydCBvbiB0aGUgYWN0 aW9ucyB0aGF0IHdlIGxhdW5jaGVkIHNpbmNlIG15IGluaXRpYWwNCiAgcG9z dGluZy4NCg0KICAoVGhlcmUgd2FzIGFsc28gc29tZSBwcm9ncmVzcyBvbiB0 aGUgImVuYWJsaW5nIGluZGl2aWR1YWwgZG9uYXRpb25zIg0KICBmcm9udCwg bWF5YmUgc29tZXRoaW5nIHdpbGwgYmUgcG9zc2libGUgaW4gdGhlIG5leHQg ZmV3IG1vbnRocy4gRG9uJ3QNCiAgc3RhcnQgaG9sZGluZyB5b3VyIGJyZWF0 aCB5ZXQuKQ0KDQogIOKAoiBXZSBhcmUgZnVuZGluZyB0aGUgIkxlYWZzIiBy ZXNlYXJjaCBwcm9qZWN0IGluIExpc2JvbiB0byBkZXZlbG9wDQogICAgdGVh Y2hpbmcgbWF0ZXJpYWwgZm9yIHRoZW9yZXRpY2FsLWNvbXB1dGVyLXNjaWVu Y2UgY291cnNlcyAoYXV0b21hdGENCiAgICBhbmQgc3R1ZmYpIGluIE9DYW1s LCB3aXRoIGludGVyYWN0aXZlIHZpc3VhbGl6YXRpb24gY29tcG9uZW50cywg c29tZQ0KICAgIG9mIHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGJlIGludGVncmF0 ZWQgaW4gdGhlIFtMZWFybi1PQ2FtbF0gcGxhdGZvcm0NCiAgICBvdmVyIHRo ZSBjb3Vyc2Ugb2YgMjAyMC8yMDIxLg0KICDigKIgV2UgcHJvdmlkZSBmdW5k aW5nIGZvciB0aGUgW0dhbGxpdW0vQ2FtYml1bV0gcmVzZWFyY2ggdGVhbSBh dCBJTlJJQQ0KICAgIFBhcmlzIChGcmFuY2UpLCBhbiBhY3RpdmUgcGxhY2Ug Zm9yIE9DYW1sLXJlbGF0ZWQgZnVuZGFtZW50YWwNCiAgICByZXNlYXJjaCAo c29tZSBvZiB0aGUgdGVhbSBtZW1iZXJzIGFyZSBhbHNvIHZlcnkgYWN0aXZl IG9uIHRoZQ0KICAgIGltcGxlbWVudGF0aW9uIGZyb250LCBmb3IgZXhhbXBs ZSBYYXZpZXIgTGVyb3ksIERhbWllbiBEb2xpZ2V6LA0KICAgIEZsb3JpYW4g QG9jdGFjaHJvbiBBbmdlbGV0dGksIGFuZCBTw6liYXN0aWVuIEhpbmRlcmVy KS4NCiAg4oCiIFdlIHNwb25zb3IgdGhlIFtTV0VSQ10gcHJvZ3JhbW1pbmcg Y29udGVzdCBmb3IgMjAxOS0yMDIwLCBhbmQgaW4NCiAgICByZXR1cm4gdGhl IGNvbnRlc3QgYWRkZWQgT0NhbWwgdG8gdGhlIGxpc3Qgb2YgYXZhaWxhYmxl DQogICAgbGFuZ3VhZ2VzLiBNb3N0IHBhcnRpY2lwYW50cyB0byB0aGVzZSBj b21wZXRpdGl2ZS1wcm9ncmFtbWluZyBldmVudHMNCiAgICB1c2UgQysrLCBi dXQgd2UgdGFsa2VkIHRvIHBhc3QgYW5kIGFjdGl2ZSBwYXJ0aWNpcGFudHMg d2hvIHNhaWQgdGhleQ0KICAgIHdvdWxkIGJlIGludGVyZXN0ZWQgaW4gdXNp bmcgT0NhbWwgb24gc29tZSBwcm9ibGVtcyB3aXRoIG1vcmUNCiAgICBzeW1i b2xpYyBjb21wdXRhdGlvbi4NCiAg4oCiIE92ZXIgdGhlIGNvdXJzZSBvZiB0 aGUgNC4xMCByZWxlYXNlIHByb2Nlc3MsIHdlIGFyZSBmdW5kaW5nIHdvcmsg YnkNCiAgICBAa2l0LXR5LWthdGUgdG8gaGF2ZSBhIHdpZGUgbG9vayBhdCB0 aGUgZWNvc3lzdGVtIGFuZCBpbXByb3ZlDQogICAgY29tcGF0aWJpbGl0eSB3 aXRoIHRoZSB1cGNvbWluZyByZWxlYXNlLiAoSSBiZWxpZXZlIHRoYXQgdGhl DQogICAgdXBzdHJlYW0gUFIgWyM5MTc2XSBpcyBhIGZpcnN0IHJlc3VsdCBv ZiB0aGlzIGVmZm9ydC4pDQogIOKAoiBJbiByZWFjdGlvbiB0byB0aGUgRGlz Y291cnNlIHRocmVhZCBbU3VnZ2VzdGlvbnMgZm9yIE9DYW1sDQogICAgZG9j dW1lbnRhdGlvbl0sIHdlIGFyZSBwbGFubmluZyB0byBmdW5kIGZ1cnRoZXIg d29yayBieSBAc2FuZXR0ZSB0bw0KICAgIGV4cGVyaW1lbnQgd2l0aCB0aGUg SFRNTCByZW5kZXJpbmcgb2YgdGhlIE9DYW1sIG1hbnVhbCwgaW4NCiAgICBj b29yZGluYXRpb24gd2l0aCBAb2N0YWNocm9uIHRvIHRyeSB0byB1cHN0cmVh bSBpbXByb3ZlbWVudHMgd2hlbg0KICAgIHJlYXNvbmFibHkgcG9zc2libGUu DQogIOKAoiBXZSBnb3QgaW4gdG91Y2ggd2l0aCB0aGUgW093bF0gcHJvamVj dCB0byBzcG9uc29yIGEgZGV2ZWxvcG1lbnQNCiAgICBzcHJpbnQgaW4gMjAy MC4NCg0KDQpbTGVhcm4tT0NhbWxdIDxodHRwOi8vb2NhbWwtc2Yub3JnL2xl YXJuLW9jYW1sLmh0bWw+DQoNCltHYWxsaXVtL0NhbWJpdW1dIDxodHRwOi8v Y2FtYml1bS5pbnJpYS5mci8+DQoNCltTV0VSQ10gPGh0dHBzOi8vc3dlcmMu ZXUvMjAxOS9hYm91dC8+DQoNClsjOTE3Nl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9wdWxsLzkxNzY+DQoNCltTdWdnZXN0aW9ucyBmb3Ig T0NhbWwgZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvc3VnZ2VzdGlvbnMtZm9yLW9jYW1sLWRvY3VtZW50YXRpb24vNDUw ND4NCg0KW093bF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3Vn Z2VzdGlvbnMtZm9yLW9jYW1sLWRvY3VtZW50YXRpb24vNDUwND4NCg0KDQpz b3VwYXVsdDogYSBzdGF0aWMgd2Vic2l0ZSBnZW5lcmF0b3IgYmFzZWQgb24g SFRNTCByZXdyaXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXNvdXBhdWx0LWEtc3RhdGljLXdlYnNp dGUtZ2VuZXJhdG9yLWJhc2VkLW9uLWh0bWwtcmV3cml0aW5nLzQxMjYvMTA+ DQoNCg0KRGFuaWlsIEJhdHVyaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBNYWRlIGEgWzEuNy4wIHJlbGVhc2VdLg0K DQogIEZpcnN0IGltcHJvdmVtZW50IGlzIHRoYXQgeW91IG5vdyBjYW4gcGlw ZSB0aGUgY29udGVudCBvZiBhbnkgZWxlbWVudA0KICB0aHJvdWdoIGFueSBl eHRlcm5hbCBwcm9ncmFtIHdpdGggYHByZXByb2Nlc3NfZWxlbWVudCcgd2lk Z2V0IChQUiBieQ0KICBNYXJ0aW4gS2FybHNzb24pLiAgRm9yIGV4YW1wbGUs IGluc2VydCBpbmxpbmUgU1ZHIHZlcnNpb25zIG9mIGFsbA0KICBncmFwaHZp eiBncmFwaHMgZnJvbSBgPHByZSBjbGFzcz0ibGFuZ3VhZ2UtZ3JhcGh2aXoi PicgYW5kIGFsc28NCiAgaGlnaGxpZ2h0IHRoZSBEb3Qgc291cmNlIGl0c2Vs ZiB3aXRoIFtoaWdobGlnaHRdIChvciBhbnkgb3RoZXIgdG9vbCBvZg0KICB5 b3VyIGNob2ljZSk6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbd2lk Z2V0cy5ncmFwaHZpei1zdmddDQogIOKUgiAgIHdpZGdldCA9ICdwcmVwcm9j ZXNzX2VsZW1lbnQnDQogIOKUgiAgIHNlbGVjdG9yID0gJ3ByZS5sYW5ndWFn ZS1ncmFwaHZpeicNCiAg4pSCICAgY29tbWFuZCA9ICdkb3QgLVRzdmcnDQog IOKUgiAgIGFjdGlvbiA9ICdpbnNlcnRfYWZ0ZXInDQogIOKUgiANCiAg4pSC IFt3aWRnZXRzLmhpZ2hsaWdodF0NCiAg4pSCICAgYWZ0ZXIgPSAiZ3JhcGh2 aXotc3ZnIg0KICDilIIgICB3aWRnZXQgPSAicHJlcHJvY2Vzc19lbGVtZW50 Ig0KICDilIIgICBzZWxlY3RvciA9ICcqW2NsYXNzXj0ibGFuZ3VhZ2UtIl0n DQogIOKUgiAgIGNvbW1hbmQgPSAnaGlnaGxpZ2h0IC1PIGh0bWwgLWYgLS1z eW50YXg9JChlY2hvICRBVFRSX0NMQVNTIHwgc2VkIC1lICJzL2xhbmd1YWdl LS8vIiknDQogIOKUgiAgIGFjdGlvbiA9ICJyZXBsYWNlX2NvbnRlbnQiICMg ZGVmYXVsdA0KICDilJTilIDilIDilIDilIANCg0KICA8aHR0cHM6Ly9hd3Mx LmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fkcy9vY2FtbC9v cmlnaW5hbC8yWC9hL2E0ZDhjYzA1ZDY1NjM0ZGUwZmFmM2MwNWIxNmUwZGU4 ZDI3YTc4YTMucG5nPg0KDQogIFR3byBvdGhlciBpbXByb3ZlbWVudHMgYXJl IG11bHRpcGxlIGluZGV4ICJ2aWV3cyIgYW5kIGRlZmF1bHQgdmFsdWUNCiAg b3B0aW9uIGZvciBjdXN0b20gaW5kZXggZmllbGRzLCBsaWtlDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgW2luZGV4LmN1c3RvbV9maWVsZHNdDQogIOKU giAgIGNhdGVnb3J5ID0geyBzZWxlY3RvciA9ICJzcGFuI2NhdGVnb3J5Iiwg ZGVmYXVsdCA9ICJNaXNjIiB9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClsx LjcuMCByZWxlYXNlXQ0KPGh0dHBzOi8vc291cGF1bHQubmVvY2l0aWVzLm9y Zy9ibG9nL3NvdXBhdWx0LTEuNy4wLXJlbGVhc2U+DQoNCltoaWdobGlnaHRd IDxodHRwOi8vYW5kcmUtc2ltb24uZGU+DQoNCg0KUmVsZWFzZSBvZiBvd2wt c3ltYm9saWMgMC4xLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5ub3VuY2UtcmVsZWFzZS1vZi1vd2wtc3ltYm9s aWMtMC0xLTAvNDkzMC8xPg0KDQoNCmpyemhhbzQyIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgV2UgYXJlIHBsZWFzZSB0byByZWxlYXNlIFtvd2wtc3lt Ym9saWMgMC4xLjBdLiBJdCBmdWxseSBzdXBwb3J0cw0KICBkZWZpbmluZyBh IGNvbXB1dGF0aW9uIGdyYXBoIGFuZCBydW5uaW5nIG9uIGFjY2VsZXJhdG9y cyAoVFBVL0dQVSkgdmlhDQogIFtPTk5YXSBzcGVjaWZpY2F0aW9uLiBJdCBh bHNvIGFpbXMgdG8gc3VwcG9ydCBjb252ZXJ0aW5nIGFuIE93bA0KICBjb21w dXRhdGlvbiBncmFwaCBpbnRvIHN5bWJvbGljIHJlcHJlc2VudGF0aW9uIGFu ZCB0aGVuIHRvIE9OTlgNCiAgbW9kZWwuIFRoZSBtb2R1bGUgYWxzbyBoYXMg c29tZSBjb29sIGZlYXR1cmVzIGxpa2UgY29udmVydGluZyBhDQogIGNvbXB1 dGF0aW9uIGdyYXBoIGludG8gTGFUZVggc3RyaW5nLCBhbmQgdGhlbiBzaG93 aW5nIHRoZSByZXN1bHQgaW4gYQ0KICB3ZWIgVUksIGV0Yy4NCg0KICBXZSBp bXBsZW1lbnRzIGEgZnVsbCBuZXVyYWwgbmV0d29yayBtb2R1bGUgYXRvcCBv ZiBpdCAodGhlIGludGVyZmFjZQ0KICBvZiB3aGljaCBpcyBiYXNpY2FsbHkg aWRlbnRpY2FsIHRvIHRoYXQgaW4gT3dsJ3MgY29yZSkuIEl0IHR1cm5zIG91 dA0KICB0aGF0IHRoZSBkZXNpZ24gb2YgYG93bC1zeW1ib2xpYycgaXMgc28g bmljZSB0aGF0IHRoZSBETk4gbW9kdWxlIG9ubHkNCiAgaGFzIDE3OSBMT0Mh IFlvdSBjYW4gZWFzaWx5IGRlZmluZSBwb3B1bGFyIEROTiBhcmNoaXRlY3R1 cmVzIHN1Y2ggYXMNCiAgSW5jZXB0aW9uLCBSZXNOZXQsIFZHRywgZXRjLiBq dXN0IGxpa2UgaW4gT3dsLg0KDQogIFRoaXMgaXMgc3RpbGwgYW4gb24tZ29p bmcgcHJvamVjdCBhbmQgYSBsb3QgcmVtYWlucyB0byBiZQ0KICBkb25lLiBE ZXNwaXRlIGl0cyBuYW1lLCBgb3dsLXN5bWJvbGljJyBkb2VzIG5vdCBkbyBh bnkgdXNlZnVsIGNvbXB1dGVyDQogIGFsZ2VicmEgKENBUykgc3R1ZmYgYXQg dGhlIG1vbWVudCwgYnV0IENBUyBpcyBpbmRlZWQgb24gb3VyIFRPRE8uDQoN CiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBjaGVjayBvdXQgdGhl IHJlbGF0ZWQgc2VjdGlvbiBpbiBbT3dsDQogIHR1dG9yaWFsIGJvb2tdLg0K DQoNCltvd2wtc3ltYm9saWMgMC4xLjBdIDxodHRwczovL29wYW0ub2NhbWwu b3JnL3BhY2thZ2VzL293bC1zeW1ib2xpYy8+DQoNCltPTk5YXSA8aHR0cHM6 Ly9vbm54LmFpLz4NCg0KW093bCB0dXRvcmlhbCBib29rXSA8aHR0cHM6Ly9v Y2FtbC54eXovb3dsX3R1dG9yaWFscy9zeW1ib2xpYy5odG1sPg0KDQoNCk9s ZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBw ZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2Vd IGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9v ayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQog IGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUg aXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBb b25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEg bWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25s aW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5l d3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHA6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 17 to 31, 20= 19.

Sorry for the hiatus last week, I was away with no internet access. Happy new year!

Internships at Be Sport (OCaml, Ocsigen)

Be Sport announced

Be Sport currently has several open internship positions for OCaml developers.

Keywords: OCaml, Ocsigen, Mobile app development, Web, Database, Sport, Social networks

Be Sport develops the first global platform dedicated to sport, in collaboration with prominent actors of sport in France and in the world. All our development is done in OCaml. Our Web and mobile apps (iOS, Android) are developed as a multi-tier app using the Ocsigen framework. Our premises are located in the center of Paris.

Please contact me for more information.

ocaml-lsp preview

Rudi Grinberg announced

I'm excited to announce ocam= l-lsp. This project contains an implementation of an LSP server for the= OCaml language. The current implementation piggy backs on the widely succe= ssful merlin tool to provide comp= letion & type inference. In the future, we'd like to use all other esse= ntial tools such as ocamlformat, odoc, dune to provide more functionality i= n your editors.

For now, the project isn't yet available on opam as we're still polishing s= ome rough edges in the release process. Nevertheless, I invite all brave so= uls who are ready to experiment to give this lsp server a try. Your feedbac= k & contributions are most welcome :slight_smile:

UnixJunkie asked and Anton Kochkov replied

This project looks nice.

If I am an Emacs or Vi user, can I take advantage of an LSP server?

Or, is this only for some new editors like Atom or VScode?

@UnixJunkie of course! That's the whole point of this tooling.

For Vim you can choose between:

I am not an Emacs expert, but there is amazing LSP integration too:

3D"b8acd745527e=

Pau Ruiz Safont said

Neovim 0.5.0 (now pre-released) has native LSP support as well: https://github.com/neovim/neov= im/pull/11336

Not sure how well integrated is it going to be with various plugins (example)

Anton Kochkov added

NeoVim 0.5.0 will also include the tree-sitter parser for syntax highlighting, which will a= llow way better coloring. And tree-sitter already has OCaml grammar, so implementing semantics-aware syntax highlighter will be eas= ier. But I expect the support more or less ready for external contributions= only in 0.6.0, sadly. Integrating the tool with something like GitHub Semantic (Haskell alert) will greatly improve OCaml expe= rience on GitHub too, see the corresponding issue.

Pieter Goetschalckx said

The next step for Semantic support is documented here, = but I'm working on some improv= ements of the tree-sitter parser first.

Carlos D'Agostino said

For Emacs there is also eglot: https://github.com/joaotavora/eglot – As the RE= ADME says, it's quite minimalist compared to lsp-mode.

Reproducible builds with OCaml / opam and MirageOS

Hannes Mehnert announced

I wrote up recent developments about reproducible builds with opam –= including some tooling https://hannes.nqsb.io/Posts/ReproducibleOPAM

Thanks to everyone involved in the effort to get OCaml and opam determinist= ic

The journey is not yet finished, we're in a pretty good shape, but further = testing and tooling is needed to expose the information "is my library repr= oducible?" to OCaml developers.

I'm interested in feedback, please let us discuss this further here in case= you're interested. :D

Anil Madhavapeddy added

An absolutely amazing cross-layer effort; well done on pushing all this thr= ough @hannes! I really enjoyed reading the minutes of the Paris summit las= t year: https://reproducible-builds.org/events/paris2018/repor= t/#Toc11681_331763073

the OCaml Software Foundation

Continuing this thread, gasche announced

A small report on the actions that we launched since my initial posting.

(There was also some progress on the "enabling individual donations" front,= maybe something will be possible in the next few months. Don't start holdi= ng your breath yet.)

  • We are funding the "Leafs" research project in Lisbon to develop teachi= ng material for theoretical-computer-science courses (automata and stuff) i= n OCaml, with interactive visualization components, some of which will hope= fully be integrated in the Learn-OCaml platform over the course of 2020/2021.
  • We provide funding for the Gallium= /Cambium research team at INRIA Paris (France), an active place for OCa= ml-related fundamental research (some of the team members are also very act= ive on the implementation front, for example Xavier Leroy, Damien Doligez, = Florian @octachron Angeletti, and S=C3=A9bastien Hinderer).
  • We sponsor the SWERC progr= amming contest for 2019-2020, and in return the contest added OCaml to the = list of available languages. Most participants to these competitive-program= ming events use C++, but we talked to past and active participants who said= they would be interested in using OCaml on some problems with more symboli= c computation.
  • Over the course of the 4.10 release process, we are funding work by @ki= t-ty-kate to have a wide look at the ecosystem and improve compatibility wi= th the upcoming release. (I believe that the upstream PR #9176 is a first result of this effo= rt.)
  • In reaction to the Discourse thread Suggestions for OCaml documen= tation, we are planning to fund further work by @sanette to experiment = with the HTML rendering of the OCaml manual, in coordination with @octachro= n to try to upstream improvements when reasonably possible.
  • We got in touch with the Owl project to sponsor a development= sprint in 2020.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

Made a 1.7.0 release.

First improvement is that you now can pipe the content of any element throu= gh any external program with preprocess_element widget (PR by = Martin Karlsson). For example, insert inline SVG versions of all graphviz graphs from &= lt;pre class=3D"language-graphviz"> and also highlight the Dot so= urce itself with highlight (or any ot= her tool of your choice):

[widgets.graphviz-svg]
  widget =3D 'preprocess_element'
  selector =3D 'pre.language-graphviz'
  command =3D 'dot -Tsvg'
  action =3D 'insert_after'

[widgets.highlight]
  after =3D "graphviz-svg"
  widget =3D "preprocess_element"
  selector =3D '*[class^=3D"language-"]'
  command =3D 'highlight -O html -f --syntax=3D$(echo $ATTR_CLASS | sed -e =
"s/language-//")'
  action =3D "replace_content" # default

3D"a4d8cc05d656=

Two other improvements are multiple index "views" and default value option = for custom index fields, like

[index.custom_fields]
  category =3D { selector =3D "span#category", default =3D "Misc" }

Release of owl-symbolic 0.1.0

jrzhao42 announced

We are please to release owl-symbolic 0.1.0. It fully supports defining a computation gr= aph and running on accelerators (TPU/GPU) via = ONNX specification. It also aims to support converting an Owl computation graph into symbolic representation= and then to ONNX model. The module also has some cool features like conver= ting a computation graph into LaTeX string, and then showing the result in = a web UI, etc.

We implements a full neural network module atop of it (the interface of whi= ch is basically identical to that in Owl's core). It turns out that the des= ign of owl-symbolic is so nice that the DNN module only has 17= 9 LOC! You can easily define popular DNN architectures such as Inception, ResNet, VGG, etc. just = like in Owl.

This is still an on-going project and a lot remains to be done. Despite its= name, owl-symbolic does not do any useful computer algebra (C= AS) stuff at the moment, but CAS is indeed on our TODO.

For more information, please check out the related section in Owl tutorial book.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 073267EC74 for ; Tue, 7 Jan 2020 14:43:12 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.69,406,1571695200"; d="scan'208,217";a="430232997" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 07 Jan 2020 14:43:11 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 07 Jan 2020 14:43:10 +0100 Message-ID: <87sgkrbcwh.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 31, 2019 to January 07, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ocaml-lsp preview Mkocaml Release - Project generator Garbage Collection, Side-effects and Purity A Lightweight OCaml Webapp Tutorial (Using Opium, Caqti, and Tyxml) Release of owl-symbolic 0.1.0 Static lifetime Old CWN ocaml-lsp preview =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Continuing this thread, Edwin T=C3=B6r=C3=B6k said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here is an example with ALE and Neovim (tested with v0.3.8): =E2=80=A2 Install the [Ale] plugin. If your Vim has support for packages = (Vim 8+ or Neovim) you can simply clone it in the correct subdir, no need for a plugin manager: `git clone https://github.com/w0rp/ale.git .vim/pack/my-plugins/start/ale' =E2=80=A2 Add this to your .vimrc: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 " only invoke merlin to check for errors when =E2=94=82 " exiting insert mode, not on each keystroke. =E2=94=82 let g:ale_lint_on_text_changed=3D"never" =E2=94=82 let g:ale_lint_on_insert_leave=3D1 =E2=94=82=20 =E2=94=82 " enable ALE's internal completion if deoplete is not used =E2=94=82 let g:ale_completion_enabled=3D1 =E2=94=82=20 =E2=94=82 " only pop up completion when stopped typing for ~0.5s, =E2=94=82 " to avoid distracting when completion is not needed =E2=94=82 let g:ale_completion_delay=3D500 =E2=94=82=20 =E2=94=82 " see ale-completion-completeopt-bug =E2=94=82 set completeopt=3Dmenu,menuone,preview,noselect,noinsert =E2=94=82=20 =E2=94=82 if has('packages') =E2=94=82 packloadall =E2=94=82=20 =E2=94=82 " This should be part of ALE itself, like ols.vim =E2=94=82 call ale#linter#Define('ocaml',{ =E2=94=82 \ 'name':'ocaml-lsp', =E2=94=82 \ 'lsp': 'stdio', =E2=94=82 \ 'executable': 'ocamllsp', =E2=94=82 \ 'command': '%e', =E2=94=82 \ 'project_root': function('ale#handlers#ols#Ge= tProjectRoot') =E2=94=82 \}) =E2=94=82=20 =E2=94=82 " remap 'gd' like Merlin would =E2=94=82 nmap gd (ale_go_to_definition_in_sp= lit) =E2=94=82=20 =E2=94=82 " go back =E2=94=82 nnoremap gb =E2=94=82=20 =E2=94=82 " show list of file:line:col of references for symbol under= cursor =E2=94=82 nmap go :ALEFindReferences -r= elative =E2=94=82=20 =E2=94=82 " Show documentation if available, and type =E2=94=82 nmap hh (ale_hover) =E2=94=82=20 =E2=94=82 " So I can type ,hh. More convenient than \hh. =E2=94=82 nmap , =E2=94=82 vmap , =E2=94=82 endif =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [Ale] Mkocaml Release - Project generator =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Chris Nevers announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I recently created a tool to generate OCaml projects. I constantly have difficulties with dune commands and setting up opam files, etc. Mkocaml generates a dune project with inline tests, opam file, git repository, git ignore, and a Makefile with easy commands. This tool can be of great help to newcomers, allowing them to get up and running faster! Garbage Collection, Side-effects and Purity =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Gerard asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 GC =3D Garbage Collection GC, in a pure program, is a point that's always confused me. I always understood that freeing memory from a program was impure and would create side-effects but it seems it doesn't matter if the program is remove from all consequences of those impure acts and side-effects. Basically, if any memory block has no remaining references in the program, then freeing that block will have no consequences on the running program so its allowed to happen behind the scenes.. Is this correct reasoning? Guillaume Munch-Maccagnoni replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80 To answer your question =E2=80=9Cdoes de-allocation creates a side-effect= ?=E2=80=9D: To state the obvious: if you care about the memory consumption of your program, then you care about the side-effect of de-allocation, and this indeed voids purity. A language like OCaml lets you reason about de-allocation. Memory is collected when values are no longer reachable. Like in other languages, 1) a value that does not escape and goes out of scope will get collected, and 2) you can reason about when a value escapes and goes out of scope thanks to OCaml respecting the strict evaluation order of value types. OCaml (like other compiled languages) is in fact more precise: it ties the dynamic notion of reachability to the lexical notion of variable occurrence. For instance, in the following: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let x =3D get_huge_data () in =E2=94=82 let z =3D long_running_function x in =E2=94=82 f z =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml will be able to collect the value in `x' before `x' goes out of scope, and thus if possible before `long_running_function' returns. Indeed, OCaml performs liveness analysis during compilation, and records the information about variable occurrences in frame descriptors, for consumption by the GC when it scans for roots. In fact, you can rely on call-by-value operational semantics to (loosely) reason that a value no longer appears in a program, and therefore that the corresponding memory will be collected by the GC=C2=B9 ([Morrisett, Felleisen and Harper, "Abstract Models of Memory Management"]). Of course, using lazy or higher-order interfaces (when closures escape; with many idioms they do not) will make it harder to reason about the lifetime of values. (=C2=B9: For OCaml, this is a conjecture I make, for subsets which could = be given such operational semantics, and only for native compilation. Morrisett, Felleisen and Harper's semantics obviously assumes that the results of liveness analysis are made available to the GC, but this is not written, nor is there any mention of the link between liveness analysis and accuracy of garbage collection in Appel's "Modern Compiler Implementation in C". I assume that it was part of folklore at the time, though recently I mentioned it to some functional PL researcher and they seemed surprised. I only found it explicitly mentioned in later papers from the OOP community. I checked that everything seems in place for OCaml to allow such reasoning, but only the authors of the original code, @xavierleroy and @damiendoligez, can tell us if this is intended to be part of the language semantics.) Furthermore, memory is not collected immediately when a value becomes unreachable. Instead: =E2=80=A2 Short-lived values are allocated contiguously and deallocated i= n a batch, so that allocating and deallocating short-lived values is very cheap, with additional benefits in terms of cache locality. This replaces stack allocation from languages with explicit memory management. =E2=80=A2 Longer-lived values are moved to a heap that is scanned incrementally, to ensure a bounded latency. In contrast, naive reference-counting and unique pointers from C++/Rust make you pay the cost of deallocation up-front. While this is essential for understanding the performance of OCaml programs, from the point of view of deallocation-as-an-effect, the delaying of the collection of unreachable memory can be seen as a runtime optimisation, that does not change the effectful status of deallocation (the memory still gets freed). [The intuition is that an effect can support some degree of reordering without requiring purity, as illustrated by strong monads which can be commutative without being idempotent, one possible definition of purity for semanticists.] But is de-allocation an effect _in practice_? Faced with the scepticism and misunderstandings from this thread, I emit two hypotheses: 1) Memory consumption is not an issue in functional programming, for application areas that interest functional programmers. 2) Memory management in OCaml is efficient in such a way that programmers do not need to think about it in their day-to-day programming activities in those terms. Hypothesis 2) could be explained for instance if OCaml programmers are already dealing with effects and thinking about the order in which their code executes (my experience), and are only used to deal with deallocation as an afterthought, e.g. when chasing leaks with a profiler. Let us turn towards two programming language experiments from the 1990's that allow me to reject hypothesis 1). Both show what happens when one denies the status of deallocation as an effect controlled by the programmer. =E2=80=A2 Region-based memory management consisted in allocating in a sta= ck of memory _regions_ deallocated at once, and determined by a whole-program static analysis. Now regarded as a failed idea but successful experiment (i.e. good science!), it taught us a lot about the structure of functional programs in relationship to memory management ([see this retrospective]). There were some good performance results, but also pathological cases _=E2=80=9Cwhere lifeti= mes were not nested or where higher-order functions were used extensively=E2=80=9D_, sometimes requiring them to be altered to be _= =E2=80=9Cregion friendly=E2=80=9D_, which was _=E2=80=9Ctime-consuming=E2=80=9D_ and re= quired knowledge of the inference algorithm. In addition, the regions changed unpredictably when the programs evolved, and memory leaks appeared when the compiler inferred too wide regions. =E2=80=A2 Haskell was (at the time) an experiment with lazy functional programming. Pervasive laziness prevents reasoning about the lifetime of values, and purity is a central assumption used by the compiler for program transformations, which is antithetical with reasoning about deallocation as an effect. It is well-known that naive Haskell code has issues with memory leaks, and that realistic Haskell programs have to follow "best practices" to avoid leaks, by making extensive use of strictness annotations (e.g. bang patterns). Unfortunately, I found it hard to find reliable academic sources about lessons drawn from the experiment like the RBMM retrospective. The best I could find on the topic of memory leaks is the following blog post: , from a Haskell programmer who wrote in another post (linked from that one) _=E2=80=9CMy suspicion is that many (most?) large Haskell programs have space leaks, but they often go unnoticed=E2=80=9D_. This is consistent with comments I received from people with Haskell experience (first-hand, one academic and one industrial) and about an industrial Haskell consultant (second-hand) who reportedly commented that their main job was to fix memory leaks (but maybe in jest). Of course, take this with a grain of salt. At least, I believe that the Haskell academic community has accumulated empirical evidence of the extent and manner in which deallocation voids purity assumptions. Having an authoritative source about it would be pretty important to me, given the initial promises of functional programs being more tractable mathematically specifically via =E2=80=9Creferential transparency=E2=80= =9D and independence of execution order, whose theoretical justification already looks shaky to me from a semantic point of view. Some parts of the literature continues to promise far-reaching consequences of equational reasoning, without clear statements of limitation of the application domain. I have the impression that the Haskell which is practiced in the real world is very different from what you can read in some academic papers. The hypothesis that deallocation matters as an effect, and that ML makes it easy to program and reason about effects, seems to me a strong argument explaining OCaml's predictable and competitive performance. So, thank you for your healthy scepticism. [Morrisett, Felleisen and Harper, "Abstract Models of Memory Management"] [see this retrospective] Xavier Leroy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Concerning the "don't scan local variables that are dead" trick: =E2=80=A2 Technically it is not "intended to be part of the language semantics" because the bytecode compiler (ocamlc) doesn't implement it, only the native-code compiler (ocamlopt). =E2=80=A2 As far as I remember, I reinvented this trick circa 1993, but it seems it was used earlier in the Lazy ML compiler by Augustsson and Johnsson. See Appel and Shao's paper "An Empirical and Analytic Study of Stack vs. Heap Cost for Languages with Closures", JFP, 1996, end of section 5. Guillaume Munch-Maccagnoni the asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 TL;DR: the paper mentioned by @xavierleroy provides additional references regarding the importance of liveness analysis for GC, including a demonstration by Appel that this actually matters for space complexity (thanks!). I find that a link is still missing with an abstract semantics =C3=A0 la Morrisett, Felleisen & Harper. This seems important to me because more theoretical works about time & space complexity in the lambda-calculus seem to take for granted that garbage collection implements something like the latter (i.e., how does one specify and certify that a compiler is sound for space complexity?). Xavier Leroy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 See for example [Closure Conversion is Safe for Space], by Zoe Paraskevopoulou and Andrew W. Appel, ICFP 2019. [Closure Conversion is Safe for Space] A Lightweight OCaml Webapp Tutorial (Using Opium, Caqti, and Tyxml) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Shon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The tutorial is [hosted on gitlab pages], out of [this repository]. I put this together in response to some requests for introductory material on the topic (here and on [/r/ocaml]. I don't have much expertise to offer in this area, but I had hacked together some simple servers based on Opium in the past few months, so it seemed like I should be able to memorialize some of what I learned for the benefit of others. I received some critical guidance by the Opium maintainers, rgrinberg and anuragsoni, and from other resources online (mentioned at the end of the tutorial). Any feedback or improvements are welcome: this is my first time writing such lengthy instructional material, and I'm sure there's lots of room to make it better. [hosted on gitlab pages] [this repository] [/r/ocaml] Release of owl-symbolic 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jrzhao42 announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 The Owl tutorial book URL address is now changed to: . Static lifetime =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Andr=C3=A9 asked and Guillaume Munch-Maccagnoni replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 > Is it possible to =E2=80=9Cstatically=E2=80=9D allocate a value? By thi= s I mean mark a value such that it gets ignored by the GC and lives until the program exits? This is indeed the purpose of Ancient, which comes with limitations and does not allow you to reclaim the memory until you exit the program. (I am curious to know how well it works with recent OCaml versions.) > it would be really interesting to learn whether Ocaml forbids blocks outside the heap. The OCaml runtime has two modes (chosen at compilation) for dealing with so-called "out-of-heap" pointers. In the legacy one that Chet remembers, the GC uses a page table when scanning to be able to tell which pointers it possesses. In the "no-naked-pointers" mode devised more recently for efficiency reasons, the page table is replaced by looking at the colour in the header of the dereferenced value. Out-of-heap values must be preceded by a header with colour black. The no-naked-pointer mode is more restricted, because once a static value is referenced, it can no longer be deallocated, as you never know whether it is still reachable by the GC. This should be enough to support Ancient. > One should verify such intuitions experimentally, before trying to fix them, but I=E2=80=99m not familiar with what OCaml profilers can do= =E2=80=A6 Excluding large long-lived data from the GC is an old idea. Among recent developments, Nguyen et al. [1] distinguish a "control path" (where the generational hypothesis is assumed to hold) from a "data path" (where values are assumed to follow an "epochal" behaviour (long-lived, similar lifetimes, benefit from locality), and are excluded from GC). They give as motivation so-called "big data" and as figures of pathological GC usage up to 50% of total runtime. I remember reading similar figures from blog posts about large data sets in OCaml. In reality this indeed depends on knobs you can turn on your GC that can result in increased peak memory usage among others. (Assuming infinite available memory, it is even possible to let the GC share drop to 0%.) @ppedrot reported to me that in a recent experiment with Coq, using an Ancient-like trick to exclude some large, long-lived and rarely-accessed values from being scanned (namely serialising them into bigarrays), they saw an 8% performance improvement across the board in benchmarks. Multicore, if I understood correctly, aims to support only the no-naked-pointer mode, and I am not sure what the page table will become. Coq currently does some out-of-heap allocation in the VM, and has been adapted to be compatible with the no-naked-pointer mode by wrapping out-of-heap pointers into custom blocks. For scanning its custom stack (which mixes in-heap and out-of-heap values), Coq sets up a custom root-scanning function (`caml_scan_roots_hook`), which still relies on the page table. Note that having to wrap out-of-heap pointers in custom blocks is (much!) less expressive: for instance with Ancient you can call `List.filter` on a statically-allocated list (and correctly get a GC-allocated list of statically-allocated values). With custom blocks you cannot mix in-heap and out-of-heap values in this way. For a type system to deal with "statically" allocated values, have a look at Rust, which: 1) prevents cycles of reference-counting schemes thanks to uniqueness, 2) can treat GC roots as resources to deal with backpointers at the leaves of the value (cf. the interoperability with SpiderMonkey's GC in Servo). A point of view that I like is that tracing GCs and static allocation differ fundamentally by how they traverse values for collection: traversing live values for the first one, and traversing values at the moment of their death for the other. This gives them distinct advantages and drawbacks so one can see them as complementary. (See notably [2,3].) Static allocation is interesting for performance in some aspects (no tracing, no read-write barrier, reusability of memory cells, avoids calling the GC at inappropriate times), but I find it even more interesting for interoperability (e.g. exchanging values freely with C or Rust, or [applications from that other thread]). It is natural to want to mix them in a language. As far as I understand, developing the runtime capabilities for OCaml to deal with out-of-heap pointers without resorting to an expensive page table is an engineering problem, not a fundamental one. If anyone is interested in this, please contact me. [1] Nguyen et al., [Yak : A High-Performance Big-Data-Friendly Garbage Collector], 2016 [2] Bacon, Cheng and Rajan, [A Unified Theory of Garbage Collection], 2004 [3] Shahriyar, Blackburn and Frampton, [Down for the Count? Getting Reference Counting Back in the Ring], 2012 [applications from that other thread] [Yak : A High-Performance Big-Data-Friendly Garbage Collector] [A Unified Theory of Garbage Collection] [Down for the Count? Getting Reference Counting Back in the Ring] UnixJunkie also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you can store your long-leaved data into a bigarray, I think you would reach the effect that you were looking for (no more GC scanning of this data). This was once advised to me by Oleg, for some performance-critical section of some code. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 31, 2019 to = January 07, 2020.

ocaml-lsp preview

Continuing this thread, Edwin T=C3=B6r=C3=B6k said

Here is an example with ALE and Neovim (tested with v0.3.8):

  • Install the Ale p= lugin. If your Vim has support for packages (Vim 8+ or Neovim) you can simp= ly clone it in the correct subdir, no need for a plugin manager: git = clone https://github.com/w0rp/ale.git .vim/pack/my-plugins/start/ale=
  • Add this to your .vimrc:
" only invoke merlin to check for errors when
" exiting insert mode, not on each keystroke.
let g:ale_lint_on_text_changed=3D"never"
let g:ale_lint_on_insert_leave=3D1

" enable ALE's internal completion if deoplete is not used
let g:ale_completion_enabled=3D1

" only pop up completion when stopped typing for ~0.5s,
" to avoid distracting when completion is not needed
let g:ale_completion_delay=3D500

" see ale-completion-completeopt-bug
set completeopt=3Dmenu,menuone,preview,noselect,noinsert

if has('packages')
    packloadall

    " This should be part of ALE itself, like ols.vim
    call ale#linter#Define('ocaml',{
                \ 'name':'ocaml-lsp',
                \ 'lsp': 'stdio',
                \ 'executable': 'ocamllsp',
                \ 'command': '%e',
                \ 'project_root': function('ale#handlers#ols#GetProjectRoot=
')
                \})

    " remap 'gd' like Merlin would
    nmap <silent><buffer> gd  <Plug>(ale_go_to_definition=
_in_split)<CR>

    " go back
    nnoremap <silent> <LocalLeader>gb <C-O>

    " show list of file:line:col of references for symbol under cursor
    nmap <silent><buffer> <LocalLeader>go :ALEFindReferen=
ces -relative<CR>

    " Show documentation if available, and type
    nmap <silent><buffer> <LocalLeader>hh <Plug>(al=
e_hover)<CR>

    " So I can type ,hh. More convenient than \hh.
    nmap , <LocalLeader>
    vmap , <LocalLeader>
endif

Mkocaml Release - Project generator

Chris Nevers announced

I recently created a tool to generate OCaml projects. I constantly have dif= ficulties with dune commands and setting up opam files, etc. Mkocaml genera= tes a dune project with inline tests, opam file, git repository, git ignore= , and a Makefile with easy commands. This tool can be of great help to newcomers, a= llowing them to get up and running faster!

https://github.com/chris= nevers/mkocaml

Garbage Collection, Side-effects and Purity

Gerard asked

GC =3D Garbage Collection

GC, in a pure program, is a point that's always confused me. I always under= stood that freeing memory from a program was impure and would create side-e= ffects but it seems it doesn't matter if the program is remove from all con= sequences of those impure acts and side-effects.

Basically, if any memory block has no remaining references in the program, = then freeing that block will have no consequences on the running program so= its allowed to happen behind the scenes..

Is this correct reasoning?

Guillaume Munch-Maccagnoni replied

To answer your question =E2=80=9Cdoes de-allocation creates a side-effect?= =E2=80=9D:

To state the obvious: if you care about the memory consumption of your prog= ram, then you care about the side-effect of de-allocation, and this indeed = voids purity.

A language like OCaml lets you reason about de-allocation. Memory is collec= ted when values are no longer reachable. Like in other languages, 1) a valu= e that does not escape and goes out of scope will get collected, and 2) you= can reason about when a value escapes and goes out of scope thanks to OCam= l respecting the strict evaluation order of value types. OCaml (like other = compiled languages) is in fact more precise: it ties the dynamic notion of = reachability to the lexical notion of variable occurrence. For instance, in= the following:

let x =3D get_huge_data =
() in
let z =3D long_running_function x in
f z

OCaml will be able to collect the value in x before x goes out of scope, and thus if possible before long_running_func= tion returns. Indeed, OCaml performs liveness analysis during compil= ation, and records the information about variable occurrences in frame desc= riptors, for consumption by the GC when it scans for roots. In fact, you ca= n rely on call-by-value operational semantics to (loosely) reason that a va= lue no longer appears in a program, and therefore that the corresponding me= mory will be collected by the GC=C2=B9 (Morrisett, Felleisen and Harper, "Abstract Models of Mem= ory Management"). Of course, using lazy or higher-order interfaces (whe= n closures escape; with many idioms they do not) will make it harder to rea= son about the lifetime of values.

(=C2=B9: For OCaml, this is a conjecture I make, for subsets which could be= given such operational semantics, and only for native compilation. Morrise= tt, Felleisen and Harper's semantics obviously assumes that the results of = liveness analysis are made available to the GC, but this is not written, no= r is there any mention of the link between liveness analysis and accuracy o= f garbage collection in Appel's "Modern Compiler Implementation in C". I as= sume that it was part of folklore at the time, though recently I mentioned = it to some functional PL researcher and they seemed surprised. I only found= it explicitly mentioned in later papers from the OOP community. I checked = that everything seems in place for OCaml to allow such reasoning, but only = the authors of the original code, @xavierleroy and @damiendoligez, can tell= us if this is intended to be part of the language semantics.)

Furthermore, memory is not collected immediately when a value becomes unrea= chable. Instead:

  • Short-lived values are allocated contiguously and deallocated in a batc= h, so that allocating and deallocating short-lived values is very cheap, wi= th additional benefits in terms of cache locality. This replaces stack allo= cation from languages with explicit memory management.
  • Longer-lived values are moved to a heap that is scanned incrementally, = to ensure a bounded latency. In contrast, naive reference-counting and uniq= ue pointers from C++/Rust make you pay the cost of deallocation up-front.

While this is essential for understanding the performance of OCaml programs= , from the point of view of deallocation-as-an-effect, the delaying of the = collection of unreachable memory can be seen as a runtime optimisation, tha= t does not change the effectful status of deallocation (the memory still ge= ts freed). [The intuition is that an effect can support some degree of reor= dering without requiring purity, as illustrated by strong monads which can = be commutative without being idempotent, one possible definition of purity = for semanticists.]

But is de-allocation an effect in practice= ? Faced with the scepticism and misunderstandings from this thread, I emit = two hypotheses:

  1. Memory consumption is not an issue in functional programming, for appli= cation areas that interest functional programmers.
  2. Memory management in OCaml is efficient in such a way that programmers = do not need to think about it in their day-to-day programming activities in= those terms.

Hypothesis 2) could be explained for instance if OCaml programmers are alre= ady dealing with effects and thinking about the order in which their code e= xecutes (my experience), and are only used to deal with deallocation as an = afterthought, e.g. when chasing leaks with a profiler.

Let us turn towards two programming language experiments from the 1990's th= at allow me to reject hypothesis 1). Both show what happens when one denies= the status of deallocation as an effect controlled by the programmer.

  • Region-based memory management consisted in allocating in a stack of me= mory regions deallocated at once, and dete= rmined by a whole-program static analysis. Now regarded as a failed idea bu= t successful experiment (i.e. good science!), it taught us a lot about the = structure of functional programs in relationship to memory management (see this retrospective). There were some good performance results, bu= t also pathological cases =E2=80=9Cwhere lifetime= s were not nested or where higher-order functions were used extensively=E2= =80=9D, sometimes requiring them to be altered to be =E2=80=9Cregion friendly=E2=80=9D, which was =E2=80=9Ctime-consuming=E2=80=9D and required knowled= ge of the inference algorithm. In addition, the regions changed unpredictab= ly when the programs evolved, and memory leaks appeared when the compiler i= nferred too wide regions.
  • Haskell was (at the time) an experiment with lazy functional programmin= g. Pervasive laziness prevents reasoning about the lifetime of values, and = purity is a central assumption used by the compiler for program transformat= ions, which is antithetical with reasoning about deallocation as an effect.= It is well-known that naive Haskell code has issues with memory leaks, and= that realistic Haskell programs have to follow "best practices" to avoid l= eaks, by making extensive use of strictness annotations (e.g. bang patterns= ). Unfortunately, I found it hard to find reliable academic sources about l= essons drawn from the experiment like the RBMM retrospective. The best I co= uld find on the topic of memory leaks is the following blog post: https://queue.acm.org/de= tail.cfm?id=3D2538488, from a Haskell programmer who wrote in another p= ost (linked from that one) =E2=80=9CMy suspicion = is that many (most?) large Haskell programs have space leaks, but they ofte= n go unnoticed=E2=80=9D. This is consistent with comments I received= from people with Haskell experience (first-hand, one academic and one indu= strial) and about an industrial Haskell consultant (second-hand) who report= edly commented that their main job was to fix memory leaks (but maybe in je= st). Of course, take this with a grain of salt. At least, I believe that th= e Haskell academic community has accumulated empirical evidence of the exte= nt and manner in which deallocation voids purity assumptions. Having an aut= horitative source about it would be pretty important to me, given the initi= al promises of functional programs being more tractable mathematically spec= ifically via =E2=80=9Creferential transparency=E2=80=9D and independence of= execution order, whose theoretical justification already looks shaky to me= from a semantic point of view. Some parts of the literature continues to p= romise far-reaching consequences of equational reasoning, without clear sta= tements of limitation of the application domain. I have the impression that= the Haskell which is practiced in the real world is very different from wh= at you can read in some academic papers.

The hypothesis that deallocation matters as an effect, and that ML makes it= easy to program and reason about effects, seems to me a strong argument ex= plaining OCaml's predictable and competitive performance.

So, thank you for your healthy scepticism.

Xavier Leroy replied

Concerning the "don't scan local variables that are dead" trick:

  • Technically it is not "intended to be part of the language semantics" b= ecause the bytecode compiler (ocamlc) doesn't implement it, only the native= -code compiler (ocamlopt).
  • As far as I remember, I reinvented this trick circa 1993, but it seems = it was used earlier in the Lazy ML compiler by Augustsson and Johnsson. See= Appel and Shao's paper "An Empirical and Analytic Study of Stack vs. Heap = Cost for Languages with Closures", JFP, 1996, end of section 5.

Guillaume Munch-Maccagnoni the asked

TL;DR: the paper mentioned by @xavierleroy provides additional references r= egarding the importance of liveness analysis for GC, including a demonstrat= ion by Appel that this actually matters for space complexity (thanks!). I f= ind that a link is still missing with an abstract semantics =C3=A0 la Morri= sett, Felleisen & Harper. This seems important to me because more theor= etical works about time & space complexity in the lambda-calculus seem = to take for granted that garbage collection implements something like the l= atter (i.e., how does one specify and certify that a compiler is sound for = space complexity?).

Xavier Leroy replied

See for example Closure Conversion is Safe for Space, by Zoe Paraskevopoul= ou and Andrew W. Appel, ICFP 2019.

A Lightweight OCaml Webapp Tutorial (Using Opium, Caqti, and T= yxml)

Shon announced

The tutorial is hoste= d on gitlab pages, out of this repository.

I put this together in response to some requests for introductory material = on the topic (here and on /r/oc= aml. I don't have much expertise to offer in this area, but I had hacke= d together some simple servers based on Opium in the past few months, so it= seemed like I should be able to memorialize some of what I learned for the= benefit of others. I received some critical guidance by the Opium maintain= ers, rgrinberg and anuragsoni, and from other resources online (mentioned a= t the end of the tutorial).

Any feedback or improvements are welcome: this is my first time writing suc= h lengthy instructional material, and I'm sure there's lots of room to make= it better.

Release of owl-symbolic 0.1.0

jrzhao42 announced

The Owl tutorial book URL address is now changed to: https://ocaml.xyz/book/symbolic.html.

Static lifetime

Andr=C3=A9 asked and Guillaume Munch-Maccagnoni repli= ed

> Is it possible to =E2=80=9Cstatically=E2=80=9D allocate a value? By th= is I mean mark a value such that it gets ignored by the GC and lives until = the program exits?

This is indeed the purpose of Ancient, which comes with limitations and doe= s not allow you to reclaim the memory until you exit the program. (I am cur= ious to know how well it works with recent OCaml versions.)

> it would be really interesting to learn whether Ocaml forbids blocks o= utside the heap.

The OCaml runtime has two modes (chosen at compilation) for dealing with so= -called "out-of-heap" pointers. In the legacy one that Chet remembers, the = GC uses a page table when scanning to be able to tell which pointers it pos= sesses. In the "no-naked-pointers" mode devised more recently for efficienc= y reasons, the page table is replaced by looking at the colour in the heade= r of the dereferenced value. Out-of-heap values must be preceded by a heade= r with colour black. The no-naked-pointer mode is more restricted, because = once a static value is referenced, it can no longer be deallocated, as you = never know whether it is still reachable by the GC. This should be enough t= o support Ancient.

> One should verify such intuitions experimentally, before trying to fix= them, but I=E2=80=99m not familiar with what OCaml profilers can do=E2=80= =A6

Excluding large long-lived data from the GC is an old idea. Among recent de= velopments, Nguyen et al. [1] distinguish a "control path" (where the gener= ational hypothesis is assumed to hold) from a "data path" (where values are= assumed to follow an "epochal" behaviour (long-lived, similar lifetimes, b= enefit from locality), and are excluded from GC). They give as motivation s= o-called "big data" and as figures of pathological GC usage up to 50% of to= tal runtime. I remember reading similar figures from blog posts about large= data sets in OCaml. In reality this indeed depends on knobs you can turn o= n your GC that can result in increased peak memory usage among others. (Ass= uming infinite available memory, it is even possible to let the GC share dr= op to 0%.)

@ppedrot reported to me that in a recent experiment with Coq, using an Anci= ent-like trick to exclude some large, long-lived and rarely-accessed values= from being scanned (namely serialising them into bigarrays), they saw an 8= % performance improvement across the board in benchmarks.

Multicore, if I understood correctly, aims to support only the no-naked-poi= nter mode, and I am not sure what the page table will become. Coq currently= does some out-of-heap allocation in the VM, and has been adapted to be com= patible with the no-naked-pointer mode by wrapping out-of-heap pointers int= o custom blocks. For scanning its custom stack (which mixes in-heap and out= -of-heap values), Coq sets up a custom root-scanning function (`caml_scan_r= oots_hook`), which still relies on the page table.

Note that having to wrap out-of-heap pointers in custom blocks is (much!) l= ess expressive: for instance with Ancient you can call `List.filter` on a s= tatically-allocated list (and correctly get a GC-allocated list of statical= ly-allocated values). With custom blocks you cannot mix in-heap and out-of-= heap values in this way.

For a type system to deal with "statically" allocated values, have a look a= t Rust, which: 1) prevents cycles of reference-counting schemes thanks to u= niqueness, 2) can treat GC roots as resources to deal with backpointers at = the leaves of the value (cf. the interoperability with SpiderMonkey's GC in= Servo). A point of view that I like is that tracing GCs and static allocat= ion differ fundamentally by how they traverse values for collection: traver= sing live values for the first one, and traversing values at the moment of = their death for the other. This gives them distinct advantages and drawback= s so one can see them as complementary. (See notably [2,3].) Static allocat= ion is interesting for performance in some aspects (no tracing, no read-wri= te barrier, reusability of memory cells, avoids calling the GC at inappropr= iate times), but I find it even more interesting for interoperability (e.g.= exchanging values freely with C or Rust, or applications from that other thread). It is natural to want to mix = them in a language.

As far as I understand, developing the runtime capabilities for OCaml to de= al with out-of-heap pointers without resorting to an expensive page table i= s an engineering problem, not a fundamental one. If anyone is interested in= this, please contact me.

[1] Nguyen et al., Yak : A High-Performance Big-Data-Friendly Garb= age Collector, 2016

[2] Bacon, Cheng and Rajan, A Unified Th= eory of Garbage Collection, 2004

[3] Shahriyar, Blackburn and Frampton, Down for the Count? Getting Reference Counti= ng Back in the Ring, 2012

UnixJunkie also replied

If you can store your long-leaved data into a bigarray, I think you would r= each the effect that you were looking for (no more GC scanning of this data= ).

This was once advised to me by Oleg, for some performance-critical section = of some code.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 0FA377ED1F for ; Tue, 14 Jan 2020 15:17:06 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8bB=3D=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AbGLwuhMU8rdKjQUBw/Ul6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K/3+osbcNUDSrc9gkEXOFd2Cra4d16yO6+u8ACRAuc/H7ClZNsQUFlcsso?= =?us-ascii?q?Y/p0QYGsmLCEn2frbBThcRO4B8bmJj5GyxKkNPGczzNBX4q3y26iMOSF2kbVIm?= =?us-ascii?q?buv6FZTPgMupyuu854PcYxlShDq6fLh+MAi6oR/eu8ULjoZuMLo9xgfGrnZHZu?= =?us-ascii?q?hd2GdkKU6Okxrm6cq84ZBu/z5Mt/498sJLTLn3cbk/QbFEFjotLno75NfstRnN?= =?us-ascii?q?TAuP4mUTX2ALmRdWAAbL8Q/3UI7pviT1quRy1i+aPdbrTb8vQjSt871rSB7zhy?= =?us-ascii?q?gZMTMy7XzahdZxjKJfpxKhugB/zovJa4ybKPZyYqXQds4aSWRCWMZRSS1BApi9?= =?us-ascii?q?b4QUC+oOI/tTrof6p1sUsBS+HhSnCOfhxzNUg3P727Ax3eY8HgHcxAEuH8wAvm?= =?us-ascii?q?naotv2O6gdTfu4w7PUwTjZdf5axSvx5YrOfxs8of+MR7Vwcc/JxEQzEwPKlFOQ?= =?us-ascii?q?opH4MTyJ1uQNtmmb7/Z8VemyjGMosQVxrSKpxss2kYnGmoIVylXF9SVl3IY4Ps?= =?us-ascii?q?W4SEl/Yd+kDJtfqT2VN4twQsMjWmFopTg1xqcBuZ6hcygH0ZIqzAPRZfyAdoiH?= =?us-ascii?q?+BPjVOCJLDd/mH1qYre/hxKo/Uin0O38WdG40E5UoSpZk9nMqm4C1wTU6siCT/?= =?us-ascii?q?ty4F2t2TCR2ADP8u1EIEY0lbDaK5E72LIwmIATvVzdES/tmET6lrSWdkU89uiv?= =?us-ascii?q?9+voeLDmppuEN49ujQHyKLghmsu6AeggPQgOXnSb+eSh1LL450H2XLJKjvgunq?= =?us-ascii?q?nYrZ/bJcAbpqqjDw9SyIYj5A6zACmi0NsChnkHMFNFdw6dg4f1PFHDJu3zA/Sn?= =?us-ascii?q?g1m0jTtn2fTLMqf8DpnRIXXPirnscapn50NSxwc/1c1T6pxJBr0bPv7+WkD8uM?= =?us-ascii?q?bFAhMlKQC43uTqBMl724gDQ2yAGLWZP7nXsVKQ5uIgPe2MZIgNtTb4JPkp+uTi?= =?us-ascii?q?jWc+mV8ZfaipwYUYZ2y4HvRgIkWZeGfsjckbHWcNpAo+Q/TmiFyEUTFNe3a/R7?= =?us-ascii?q?8w6i8/BY68EIvPWo+gjKaP0SunBJFbaG9LBkiJEXjydoWEX/kMaDiVIs9kijEK?= =?us-ascii?q?SKSvRZI92Ry2rg/3yKFoI/fM9yAWu5zuzMB15+rXlRAy6Tx7EdiS02GLT2F1h2?= =?us-ascii?q?MIWiE50Lp4oUxnxVeOybJ3g/hCGtxV/f9JSRs1NZ7Zz+x7F9DyRhnMccyOSFa7?= =?us-ascii?q?RNWpHS8+Tskrz98LbEt8FM+ujhfZ3yqlG7MVjaCEBIQo8qLA2Hj8P9pyxGzD1K?= =?us-ascii?q?klllUmRspPNXa6hqNk7AjSB4vJk12DmKqwdKQc2jTN9GaZwmaUskFYSl04baKQ?= =?us-ascii?q?F3QAYAGe+dDm4GvGULnoD7k7ZE8Jg8WdLOECIoniklNuQPb4JM+YYm6gn2P2Ag?= =?us-ascii?q?yHkPfEZ4PvfyAZ3T7BIEkCiQEau3icZiYkASL0imbXCnRVHlLqYl/wub13rHq9?= =?us-ascii?q?CFQ/zwSLc1FJz72x6wIYjvyaSuoO0/QDoih3+GY8J0q0w9+DU4nInAFmZqgJOo?= =?us-ascii?q?tkvAV3kFnBvgk4BaSOarh4jwdPIRxwu1Ly2h53DIRZjMVsq2klnlMrdPColWhZ?= =?us-ascii?q?fjbd5qjef73aLm6op0Kqe/eQwlbawcqb8acJ6e0lphPkpg77TxNzoUUi6MFc1j?= =?us-ascii?q?6n3ruPCQMTVZzrVUNuqEpwoKzcaSQmoYaIxTtrK6bm6zI=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D9EQDMzB1ehyIeaIFcCR4BCxyBfYEjW?= =?us-ascii?q?IEYVTIqhA2JA4VlNIUehRqNAoQngWMNAQMBDBgBDgUBAgEBgUyDDYFmHQYBBTM?= =?us-ascii?q?TAhABAQQBAQECAQIDBAETAQEBCgsJCCmFPgxCFgGBYgwZgwMDARgBCAQGOQIBA?= =?us-ascii?q?QECJSMDFAEGAwIEDQEXARQKFwESFAUBAYMLATiCQwUKj3ibdH8zhDQBAwIBEBg?= =?us-ascii?q?jA0CDU4E9DQITgRQBhRyDCYNNJg+BTD+BEYJlbIF5Ug4LAQEBAQGBLQEICQIBC?= =?us-ascii?q?IMmgl4EjTgZCgMFGAeIQ4IhhS+Be45JZQeCO3cEhVpnhUODX02CPYJggkcwR4c?= =?us-ascii?q?LE5ARIY46gxCDVG4QeoUhgwOKH4E/KoEJcTMaMCIhgjgBAQExCRZJDYgNF4EEA?= =?us-ascii?q?QKCQwaBPoMbO4E9hAECQDMBAQEBBgIHgQ4BAQUTCwGGcIRqAQE?= X-IPAS-Result: =?us-ascii?q?A0D9EQDMzB1ehyIeaIFcCR4BCxyBfYEjWIEYVTIqhA2JA4V?= =?us-ascii?q?lNIUehRqNAoQngWMNAQMBDBgBDgUBAgEBgUyDDYFmHQYBBTMTAhABAQQBAQECA?= =?us-ascii?q?QIDBAETAQEBCgsJCCmFPgxCFgGBYgwZgwMDARgBCAQGOQIBAQECJSMDFAEGAwI?= =?us-ascii?q?EDQEXARQKFwESFAUBAYMLATiCQwUKj3ibdH8zhDQBAwIBEBgjA0CDU4E9DQITg?= =?us-ascii?q?RQBhRyDCYNNJg+BTD+BEYJlbIF5Ug4LAQEBAQGBLQEICQIBCIMmgl4EjTgZCgM?= =?us-ascii?q?FGAeIQ4IhhS+Be45JZQeCO3cEhVpnhUODX02CPYJggkcwR4cLE5ARIY46gxCDV?= =?us-ascii?q?G4QeoUhgwOKH4E/KoEJcTMaMCIhgjgBAQExCRZJDYgNF4EEAQKCQwaBPoMbO4E?= =?us-ascii?q?9hAECQDMBAQEBBgIHgQ4BAQUTCwGGcIRqAQE?= X-IronPort-AV: E=Sophos;i="5.69,433,1571695200"; d="scan'208,217";a="431299318" X-MGA-submission: =?us-ascii?q?MDHMW4Du7XzfJuCk9szIACHkMjdXCvyUrNVxQt?= =?us-ascii?q?XMt0u0HuL6p1FMM8b3bYl+gYY5OVhEV5/PDzyYqGQIizQdZ9puwUwgBe?= =?us-ascii?q?t/i7dzWsBflXynDB47wSyGN7C2cz3s60zJfTVff0ozuslfH6/aKuBllC?= =?us-ascii?q?Q5Pp6ZddAYWcmF+CYIyue5tg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Jan 2020 15:17:03 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C1A3A56467A; Tue, 14 Jan 2020 15:16:59 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 14 Jan 2020 15:16:52 +0100 Message-ID: <87pnfmt963.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 14 15:17:00 2020 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.007366, queueID=2614156468A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgSmFudWFyeSAwNyB0byAxNCwNCjIwMjAuDQoN ClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KQ2FsbGluZyBhIHNpbmds ZSBmdW5jdGlvbiBvbiBldmVyeSBtZW1iZXIgb2YgYSBHQURUPw0KT0NhbWxQ cm8ncyBvcGFtIGNoZWF0IHNoZWV0LCB3aXRoIGEgbmV3IHRoZW1lIQ0KT0Nh bWwgNC4xMC4wLCBmaXJzdCBiZXRhDQpEYXRhIGVuZ2luZWVyIHBvc2l0aW9u cyBhdCBFbGFzdGljLCBVUy9DYW5hZGEvV2VzdGVybiBFdXJvcGUgKHByb3hp bWF0ZSB0byBOQSB0aW1lem9uZXMpDQpSZWxlYXNlIG9mIG5hYm9yaXMgMC4x LjAgYSBzaW1wbGUgaHR0cCBzZXJ2ZXINCmVzeUAwLjYuMCByZWxlYXNlDQpP bGQgQ1dODQoNCg0KQ2FsbGluZyBhIHNpbmdsZSBmdW5jdGlvbiBvbiBldmVy eSBtZW1iZXIgb2YgYSBHQURUPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEv YXJjL2NhbWwtbGlzdC8yMDIwLTAxL21zZzAwMDA3Lmh0bWw+DQoNCg0KSXZh biBHb3RvdmNoaXRzIGFza2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ J20gYmFzaWNhbGx5IHRyeWluZyB0byBkbyB0aGUgZXF1aXZhbGVudCBvZiB0 aGlzIHNpbXBsZSBgZm9sZCcNCiAgZnVuY3Rpb246DQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBtb2R1bGUgU2ltcGxlID0NCiAg4pSCIHN0cnVjdA0K ICDilIIgICB0eXBlIHRlcm0gPQ0KICDilIIgICAgICB8IEludCBvZiBpbnQN CiAg4pSCICAgICAgfCBBZGQNCiAg4pSCICAgICAgfCBBcHAgb2YgdGVybSAq IHRlcm0NCiAg4pSCIA0KICDilIIgICBsZXQgcmVjIGZvbGQgaSBmID0gZnVu Y3Rpb24NCiAg4pSCICAgICB8IEludCBfIGFzIHQgLT4gZiBpIHQNCiAg4pSC ICAgICB8IEFkZCAtPiBmIGkgQWRkDQogIOKUgiAgICAgfCBBcHAgKHgsIHkp IGFzIHQgLT4gZiAoZm9sZCAoZm9sZCBpIGYgeCkgZiB5KSB0DQogIOKUgiBl bmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg4oCmIGJ1dCB1c2luZyBhIEdB RFQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgR2FkdCA9 DQogIOKUgiBzdHJ1Y3QNCiAg4pSCICAgdHlwZSBfIHRlcm0gPQ0KICDilIIg ICAgICB8IEludCA6IGludCAtPiBpbnQgdGVybQ0KICDilIIgICAgICB8IEFk ZCA6IChpbnQgLT4gaW50IC0+IGludCkgdGVybQ0KICDilIIgICAgICB8IEFw cCA6ICgnYiAtPiAnYSkgdGVybSAqICdiIHRlcm0gLT4gJ2EgdGVybQ0KICDi lIIgDQogIOKUgiAgIGxldCByZWMgZm9sZCA6IHR5cGUgYS4gJ3IgLT4gKCdy IC0+IF8gdGVybSAtPiAncikgLT4gJ3IgPSBmdW4gaSBmIC0+IGZ1bmN0aW9u DQogIOKUgiAgICAgfCBJbnQgXyBhcyB0IC0+IGYgaSB0DQogIOKUgiAgICAg fCBBZGQgLT4gZiBpIEFkZA0KICDilIIgKCoNCiAg4pSCICAgICAgXiBFcnJv cjogVGhpcyBwYXR0ZXJuIG1hdGNoZXMgdmFsdWVzIG9mIHR5cGUgKGludCAt PiBpbnQgLT4gaW50KSB0ZXJtDQogIOKUgiAJYnV0IGEgcGF0dGVybiB3YXMg ZXhwZWN0ZWQgd2hpY2ggbWF0Y2hlcyB2YWx1ZXMgb2YgdHlwZSBpbnQgdGVy bQ0KICDilIIgCVR5cGUgaW50IC0+IGludCAtPiBpbnQgaXMgbm90IGNvbXBh dGlibGUgd2l0aCB0eXBlIGludA0KICDilIIgKikNCiAg4pSCICAgICB8IEFw cCAoeCwgeSkgYXMgdCAtPiBmIChmb2xkIChmb2xkIGkgZiB4KSBmIHkpIHQN CiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0KICBJJ3ZlIHRyaWVk IG90aGVyIHZhcmlhbnRzIG9mIHRoZSBzeW50YXggYW5kIGdvdCBtYW55IGVu Y291cmFnZW1lbnRzDQogIGJ1dCBubyBncmVlbiBmbGFnIGZyb20gdGhlIHR5 cGUtY2hlY2tlci4gIFdoeSBpcyB0aGUgY29tcGlsZXINCiAgZXhwZWN0aW5n IGFuIGludCB0ZXJtIGluIHRoZXJlPyBJIHRob3VnaCB0aGUgd2hvbGUgcG9p bnQgb2YgdGhlIGB0eXBlDQogIGEuIC4uLicgc3ludGF4IHdhcyB0byBhbGxv dyB0aGUgbWF0Y2hlZCB0eXBlIHRvIHZhcnkgZnJvbSBvbmUgcGF0dGVybg0K ICB0byB0aGUgbmV4dD8gIElzIHRoZXJlIGEgd2F5IHRvIGRvIHRoaXM/DQoN Cg0KSXZhbiBHb3RvdmNoaXRzIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEl0IGlzIHRoZSBsaW1pdGF0aW9uIG9mIHRoZSBsZXQt Ym91bmQgcG9seW1vcnBoaXNtLiBBIHBhcmFtZXRlciBvZiBhDQogIGZ1bmN0 aW9uIGlzIG1vbm9tb3JwaGljIGluIGl0cyBib2R5LiBUaGUgY2xhc3NpY2Fs IGV4YW1wbGUgZG9lc24ndA0KICBldmVuIHJlZmVyZW5jZSBhbnkgR0FEVCwN Cg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBleGFtcGxlIGYgID0g ZiAiaGVsbG8iLCBmIDQyDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEl0IHdv bid0IGNvbXBpbGUgZXZlbiB0aG91Z2ggd2UgY2FuIHByb3ZpZGUgYSBwb2x5 bW9ycGhpYyBmdW5jdGlvbg0KICB0aGF0IGNhbiBhcHBsaWVkIGJvdGggdG8g aW50ZWdlcnMgYW5kIHRvIHN0cmluZ3MsIGUuZy4sIGBleGFtcGUgKGZ1biB4 DQogIC0+IHgpJyBzaG91bGQgYmUgcG9zc2libGUsIGJ1dCBub3QsIGJlY2F1 c2Ugb2YgdGhlIGxldC1ib3VuZGVkDQogIHBvbHltb3JwaGlzbS4gVGhlcmUg YXJlIGEgZmV3IHNvbHV0aW9ucyBhdmFpbGFibGUgaW4gT0NhbWwsIHRoZQ0K ICBzaW1wbGVzdCBpcyB0byB1c2UgcmVjb3JkcywgZS5nLiwNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIHR5cGUgYXBwID0ge2FwcGx5IDogJ2EuICdh IC0+ICdhfQ0KICDilIIgDQogIOKUgiBsZXQgZXhhbXBsZSB7YXBwbHl9ID0g YXBwbHkgImhlbGxvIiwgYXBwbHkgNDI7Ow0KICDilIIgDQogIOKUgiB2YWwg ZXhhbXBsZSA6IGFwcCAtPiBzdHJpbmcgKiBpbnQgPSA8ZnVuPg0KICDilJTi lIDilIDilIDilIANCg0KICBOb3cgd2UgaGF2ZSBgYXBwJyB0aGF0IGlzIHBv bHltb3JwaGljLiAgSW4geW91ciBjYXNlLCBJIHdvdWxkIGRlZmluZSBhDQog IHZpc2l0b3IgdHlwZSwgZS5nLiwNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIHR5cGUgJ3IgdmlzaXRvciA9IHt2aXNpdCA6ICdhLiAnYSB0ZXJtIC0+ ICdyIC0+ICdyfQ0KICDilIIgDQogIOKUgiBsZXQgcmVjIGZvbGQgOiB0eXBl IGEuICdyIC0+ICdyIHZpc2l0b3IgLT4gYSB0ZXJtIC0+ICdyID0NCiAg4pSC ICAgZnVuIGkgZiB0IC0+IG1hdGNoIHQgd2l0aA0KICDilIIgICAgIHwgSW50 IF8gYXMgdCAtPiBmLnZpc2l0IGkgdA0KICDilIIgICAgIHwgQWRkIGFzIHQg LT4gZi52aXNpdCBpIHQNCiAg4pSCICAgICB8IEFwcCAoeCx5KSBhcyB0IC0+ DQogIOKUgiAJbGV0IGkgPSBmb2xkIGkgZiB4IGluDQogIOKUgiAJbGV0IGkg PSBmb2xkIGkgZiB5IGluDQogIOKUgiAJZi52aXNpdCBpIHQNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCg0KSmFjcXVlcyBHYXJyaWd1ZSBhbHNvIHJlcGxpZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEFjdHVhbGx5LCB0aGlzIGlzIGEgcmFyZSBjYXNlIHdoZXJlIHVzaW5n IGEgcG9seW1vcnBoaWMgbWV0aG9kIG1heSBiZQ0KICBoYW5keSB0b286DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgcmVjIGZvbGQgOiB0eXBl IGEgci4gciAtPiA8diA6ICdiLiByIC0+ICdiIHRlcm0gLT4gcj4gLT4gYSB0 ZXJtIC0+IHIgPQ0KICDilIIgICAgICBmdW4gaSBmIC0+IGZ1bmN0aW9uDQog IOKUgiAgICAgIHwgSW50IF8gYXMgdCAtPiBmI3YgaSB0DQogIOKUgiAgICAg IHwgQWRkIC0+IGYjdiBpIEFkZA0KICDilIIgICAgICB8IEFwcCAoeCwgeSkg YXMgdCAtPiBmI3YgKGZvbGQgKGZvbGQgaSBmIHgpIGYgeSkgdA0KICDilIIg DQogIOKUgiBsZXQgdiA9DQogIOKUgiAgICBvYmplY3QgbWV0aG9kIHYgOiB0 eXBlIGEuIF8gLT4gYSBHYWR0LnRlcm0gLT4gXyA9DQogIOKUgiAgICAgIGZ1 biB4IC0+IGZ1bmN0aW9uDQogIOKUgiAgICAgICAgfCBJbnQgbiAtPiB4K24N CiAg4pSCICAgICAgICB8IEFkZCAtPiB4KzENCiAg4pSCICAgICAgICB8IEFw cCBfIC0+IHgrMg0KICDilIIgICAgZW5kDQogIOKUgiANCiAg4pSCIGxldCBy ID0gR2FkdC5mb2xkIDAgdiAoQXBwIChBcHAgKEFkZCwgSW50IDMpLCBJbnQg NSkpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBwb2ludCBiZWluZyB0 aGF0IHRvIG1hdGNoIG9uIGEgR2FkdCB5b3Ugd2lsbCBhbnl3YXkgbmVlZCB0 byB1c2UNCiAgdGhlICh0eXBlIGEpIGNvbnN0cnVjdCB0byBhbGxvdyByZWZp bmVtZW50Lg0KDQoNCnJpeGVkIGFza2VkIGFuZCBJdmFuIEdvdG92Y2hpdHMg cmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAg ICAgU28gdGhlcmUgaXMgbm8gbGlnaHRlciBzeW50YXggdG8gc3BlY2lmeSB0 aGF0IGBmJyBzaG91bGQNCiAgICAgICAgYWNjZXB0IGFueSBtZW1iZXIgb2Yg YSBHQURUIHRoYW4gdGhlIHN5bnRheCB0byBzcGVjaWZ5DQogICAgICAgIHRo YXQgYGYnIHNob3VsZCBhY2NlcHQgYW55IHR5cGUgYXQgYWxsPw0KDQogIE9u bHkgdGhyZWUgbWV0aG9kcyBvZiBpbnRyb2R1Y2luZyByYW5rLTIgcG9seW1v cnBoaXNtIGFyZSBrbm93biB0byBtZToNCiAgMS4gcmVjb3Jkcw0KICAyLiBv YmplY3RzDQogIDMuIGZpcnN0LWNsYXNzIG1vZHVsZXMNCg0KICBKYWNxdWVz IGhhcyBkZW1vbnN0cmF0ZWQgdGhlIHNvbHV0aW9uIHdpdGggb2JqZWN0cywg d2hpY2ggbWlnaHQgYmUgYQ0KICBsaXR0bGUgYml0IG1vcmUgbGlnaHR3ZWln aHQsIGF0IGxlYXN0IGFzIHlvdSBkb24ndCBuZWVkIHRvIGRlZmluZSBhDQog IG5ldyBkYXRhIHR5cGUgYmVmb3JlaGFuZC4gQnV0IHRoZSBpbnZvY2F0aW9u IGlzIG1vcmUgdmVyYm9zZSBhbmQNCiAgcmVxdWlyZXMgYW4gYW5ub3RhdGlv biBmcm9tIHRoZSBjYWxsZXIgc2lkZSwgd2hpY2ggY291bGQgYmUNCiAgY29u ZnVzaW5nLiBUaGUgdGhpcmQgc29sdXRpb24gcmVsaWVzIG9uIGZpcnN0LWNs YXNzIG1vZHVsZXMgYW5kIGlzDQogIGV2ZW4gbW9yZSB2ZXJib3NlLCBhdCBs ZWFzdCBvbiB0aGUgZGVmaW5pdGlvbiBzaWRlLiBKdXN0IGZvciB0aGUgc2Fr ZQ0KICBvZiBjb21wbGV0ZW5lc3MsDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAgIG1vZHVsZSB0eXBlIFZpc2l0b3IgPSBzaWcNCiAg4pSCICAgICB0 eXBlIHQNCiAg4pSCICAgICB2YWwgdGVybSA6IHQgLT4gJ2EgdGVybSAtPiB0 DQogIOKUgiAgIGVuZA0KICDilIIgDQogIOKUgiAgIGxldCByZWMgZm9sZCA6 IHR5cGUgYSByLiByIC0+IChtb2R1bGUgVmlzaXRvciB3aXRoIHR5cGUgdCA9 IHIpIC0+IGEgdGVybQ0KICDilIIgLT4gciA9DQogIOKUgiAgICAgZnVuIGkg KChtb2R1bGUgVmlzaXQpIGFzIGYpIHQgLT4gbWF0Y2ggdCB3aXRoDQogIOKU giAgICAgICB8IEludCBfIGFzIHQgLT4gVmlzaXQudGVybSBpIHQNCiAg4pSC ICAgICAgIHwgQWRkIGFzIHQgLT4gVmlzaXQudGVybSBpIHQNCiAg4pSCICAg ICAgIHwgQXBwICh4LHkpIGFzIHQgLT4NCiAg4pSCIAkgIGxldCBpID0gZm9s ZCBpIGYgeCBpbg0KICDilIIgCSAgbGV0IGkgPSBmb2xkIGkgZiB5IGluDQog IOKUgiAJICBWaXNpdC50ZXJtIGkgdA0KICDilIIgDQogIOKUgiAgIGxldCBz ID0gZm9sZCAwIChtb2R1bGUgc3RydWN0DQogIOKUgiAgICAgICB0eXBlIHQg PSBpbnQNCiAg4pSCICAgICAgIGxldCB0ZXJtIHggXyA9IHggKyAxDQogIOKU giAgICAgZW5kKQ0KICDilJTilIDilIDilIDilIANCg0KICBBbmQgYWdhaW4s IGl0IGlzIG5vdCBhYm91dCBHQURULiBHQURUIGFjdCBhcyBhIHJlZCBoZXJy aW5nIGhlcmUuIEFzDQogIEkndmUgZGVtb25zdHJhdGVkIGVhcmxpZXIsIHVz aW5nIGEgc2ltcGxlIHBhaXIgd2lsbCBzdWZmaWNlIHRvIGRpc3BsYXkNCiAg dGhlIGxpbWl0YXRpb24gb2YgdGhlIHByZW5leCBwb2x5bW9ycGhpc20uIEV2 ZW4gbm8gQURUIGlzIHJlcXVpcmVkLA0KICBqdXN0IGFwcGx5IG9uZSB0ZXJt IHRvIGFub3RoZXIgdHdvIGFuZCB5b3Ugd2lsbCBnZXQgdGhlbSB1bmlmaWVk LA0KICBlLmcuLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IGYg ZyB4IHkgOiB1bml0ID0gZyB4OyBnIHkNCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgd2lsbCBoYXZlIHR5cGUNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IHZhbCBmIDogKCdhIC0+IHVuaXQpIC0+ICdhIC0+ICdhIC0+IHVuaXQNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgYmVjYXVzZSAnYSBpcyBxdWFudGlmaWVk IG9uIHRoZSBzY29wZSBvZiBgZicgbm90IGBnJywgaW4gb3RoZXIgd29yZHMs DQogIGl0IGhhcyB0eXBlIChub3QgYW4gT0NhbWwgc3ludGF4KQ0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgdmFsIGYgOiBmb3JhbGwgJ2EuICgnYSAt PiB1bml0KSAtPiAnYSAtPiAnYSAtPiB1bml0DQogIOKUlOKUgOKUgOKUgOKU gA0KDQogIHdoaWxlIHdlIHdvdWxkIGxpa2UgdG8gaGF2ZSBhIHR5cGUNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIHZhbCBmIDogZm9yYWxsICdiLCAn Yy4gKGZvcmFsbCAnYS4gJ2EgLT4gdW5pdCkgLT4gJ2IgLT4gJ2MgLT4gdW5p dA0KICDilJTilIDilIDilIDilIANCg0KICBPQ2FtbCBkb2Vzbid0IGFsbG93 IHVzIHRvIGRlZmluZSB0eXBlcyBsaWtlIGAoJ2EuICdhIC0+ICdhKScgYW5k IHRoZQ0KICByZWFzb24gaXMgbm90IHRoYXQgaXQgaXMgaGFyZCB0byBleHRl bmQgdGhlIHBhcnNlciBpdCBpc+KApg0KDQogICAgICAgIEkgd29uZGVyLCBp cyB0aGlzIGp1c3QgYSBsaW1pdGF0aW9uIG9mIHRoZSBPQ2FtbCBwYXJzZXIg b3INCiAgICAgICAgaXMgdGhlcmUgc29tZSBkZWVwIHJlYXNvbiBmb3IgdGhl c2Ugd29yay1hcm91bmQgKGxpa2UgaXMNCiAgICAgICAgdGhlIGNhc2UsIGZy b20gbXkgdW5kZXJzdGFuZGluZywgZm9yIHRoZSB2YWx1ZQ0KICAgICAgICBy ZXN0cmljdGlvbik/DQoNCiAgWWVwLCBnb29kIGNhdGNoISBJdCBpcyBiZWNh dXNlIG9mIHRoZSBpbXB1cml0eS4gSW5kZWVkLCBIYXNrZWxsIGhhcw0KICB0 aGUgUmFuazJUeXBlcyBleHRlbnNpb24gdGhhdCBsZXRzIHVzIHdyaXRlIHR5 cGVzIGxpa2UgYChmb3JhbGwgYS4gYQ0KICAtPiAoKSkgLT4gYiAtPiBjIC0+ ICgpJywgd2l0aCBubyBleHRyYSBzeW50YWN0aWMgYnVyZGVuIChtb2R1bG8g aGF2aW5nDQogIHRvIHByb3ZpZGUgdGhlIHR5cGUgYW5ub3RhdGlvbikuIEJ1 dCBmdW5jdGlvbnMgaW4gSGFza2VsbCBhcmUgcHVyZSwNCiAgdGhlcmVmb3Jl IGl0IGlzIHBvc3NpYmxlLiBUbyBtYWtlIHRoZSBzdG9yeSBzaG9ydCBhbmQg b2J2aW91cywgbGV0IG1lDQogIGRvIGEgc2ltcGxlIGRlbW9uc3RyYXRpb24g b2YgaG93IHRoaW5ncyBjYW4gZ28gd3JvbmcgaW4gYSBsYW5ndWFnZQ0KICB3 aXRoIHNpZGUtZWZmZWN0cy4gIExldCdzIGdvIGJhY2sgdG8gdGhlIHNpbXBs ZSBleGFtcGxlIG9mIHBhaXJzIGFuZA0KICB0aGUgaWRlbnRpdHkgZnVuY3Rp b24uICBDb25zaWRlciB0aGUgZm9sbG93aW5nIG5hc3R5IGlkZW50aXR5DQog IGZ1bmN0aW9uLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IGJh ZF9pZCAoKSA9DQogIOKUgiAgIGxldCBjYWNoZSA9IHJlZiBOb25lIGluDQog IOKUgiAgIGZ1biB4IC0+IG1hdGNoIGNhY2hlLmNvbnRlbnRzIHdpdGgNCiAg 4pSCICAgICB8IE5vbmUgLT4gY2FjaGUgOj0gU29tZSB4OyB4DQogIOKUgiAg ICAgfCBTb21lIGNhY2hlIC0+IGNhY2hlDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIEl0IGhhcyB0eXBlIGB1bml0IC0+ICdhIC0+ICdhJyB0aGVyZWZvcmUs IGlmIHdlIHdvdWxkIGhhdmUgdGhlIHJhbmstMQ0KICBwb2x5bW9ycGhpc20g ZW5hYmxlZCBmb3IgZnVuY3Rpb25zLCB3ZSBjb3VsZCBhcHBseSBpdCB0byB0 aGUgZnVuY3Rpb24NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBt YXAyIDogZnVuICgnYS4gJ2EgLT4gJ2EpIC0+ICdiIC0+ICdjIC0+ICdiICog J2MgPSBmdW4gZiAoeCx5KSAtPiBmIHgsIGYgeQ0KICDilJTilIDilIDilIDi lIANCg0KICBhcw0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IHgs eSA6IHN0cmluZyAqIGludCA9IG1hcDIgKGJhZF9pZCAoKSkgImhlbGxvIiwg NDINCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgYW5kIHdpbGwgZ2V0IGEgc2Vn bWVudGF0aW9uIGZhdWx0LCBhcyBgeScgd2lsbCBub3cgaGF2ZSB0eXBlIGlu dCBidXQNCiAgaG9sZCBhIHN0cmluZy4NCg0KICBBbmQgaGVyZSBjb21lcyB0 aGUgc3ludGF4IGFzIGEgc2F2aW9yIGFzIGl0IGxldHMgdXMgc3BlY2lmeSBm dW5jdGlvbnMNCiAgdGhhdCBhcmUgZ3VhcmFudGVlZCB0byBiZSBzeW50YWN0 aWMgdmFsdWVzLiBJbmRlZWQsIGFsbCB0aHJlZQ0KICBzb2x1dGlvbnMgc3lu dGFjdGljYWxseSBndWFyYW50ZWUgdGhhdCB0aGUgcHJvdmlkZWQgYXJndW1l bnQgaXMgYQ0KICBmdW5jdGlvbiwgbm90IGEgY2xvc3VyZS4gSW5kZWVkLCBs ZXQncyBpbnRyb2R1Y2UgdGhlIHVuaXZlcnNhbA0KICBpZGVudGl0eSB2aWEg YSByZWNvcmQsDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlIGlk ID0geyBmIDogJ2EuICdhIC0+ICdhfQ0KICDilJTilIDilIDilIDilIANCg0K ICBhbmQgd2UgY2FuIHNlZSB0aGF0IG91ciBgYmFkX2lkJyBpcyBub3QgYWNj ZXB0ZWQgZHVlIHRvIHRoZSB2YWx1ZQ0KICByZXN0cmljdGlvbiwgd2hpbGUg Z29vZF9pZCwgZGVmaW5lZCBhcywNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIGxldCBnb29kX2lkIHggPSB4DQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IGlzIHBlcmZlY3RseSBmaW5lLCBlLmcuLA0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgbGV0IGlkMSA9IHtmID0gZ29vZF9pZH0gKCphY2NlcHRlZCAq KQ0KICDilIIgbGV0IGlkMiA9IHtmID0gYmFkX2lkfSAgICgqIHJlamVjdGVk ICopDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIG1vcmVvdmVyLCBldmVuIGEg ZmluZSwgYnV0IG5vdCBzeW50YWN0aWMsIGlkZW50aXR5IGlzIGFsc28gcmVq ZWN0ZWQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBmaW5lX2lk ICgpIHggPSB4DQogIOKUgiBsZXQgaWQzID0ge2YgPSBmaW5lX2lkICgpfSAo KiByZWplY3RlZCAqKQ0KICDilJTilIDilIDilIDilIANCg0KICB3aXRoIHRo ZSBtZXNzYWdlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBUaGlzIGZp ZWxkIHZhbHVlIGhhcyB0eXBlICdiIC0+ICdiIHdoaWNoIGlzIGxlc3MgZ2Vu ZXJhbCB0aGFuICdhLiAnYSAtPiAnYQ0KICDilJTilIDilIDilIDilIANCg0K ICBUaGUgc2FtZSBpcyB0cnVlIHdpdGggbW9kdWxlcywNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIG1vZHVsZSB0eXBlIElkID0gc2lnDQogIOKUgiAg IHZhbCBmIDogJ2EgLT4gJ2ENCiAg4pSCIGVuZA0KICDilIIgbW9kdWxlIElk MSA6IElkID0gc3RydWN0IGxldCBmID0gZ29vZF9pZCBlbmQgICAoKiBhY2Nl cHRlZCAqKQ0KICDilIIgbW9kdWxlIElkMiA6IElkID0gc3RydWN0IGxldCBm ID0gYmFkX2lkICgpIGVuZCAoKiByZWplY3RlZCAqKQ0KICDilIIgbW9kdWxl IElkMyA6IElkID0gc3RydWN0IGxldCBmID0gZmluZV9pZCAoKSBlbmQgKCog cmVqZWN0ZWQgKikNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgYW5kIHdpdGgg b2JqZWN0cyAobGVmdCBhcyBhbiBleGVyY2lzZSkuDQoNCiAgVG8gc3VtbWFy aXplLCBpbiBvcmRlciB0byBlbmFibGUgcmFuazIgcG9seW1vcnBoaXNtIHdl IG5lZWQgYSBzcGVjaWFsDQogIGtpbmQgb2YgdmFsdWVzIHRvIGJlYXIgdW5p dmVyc2FsIGZ1bmN0aW9ucywgYXMgd2UgY2FuJ3QgcmVseSBvbg0KICBvcmRp bmFyeSBmdW5jdGlvbnMsIHdoaWNoIGNvdWxkIGJlIGNvbnN0cnVjdGVkIHVz aW5nIHBhcnRpYWwNCiAgYXBwbGljYXRpb24uIE9DYW1sIGFscmVhZHkgaGFk IG9iamVjdHMgYW5kIHJlY29yZHMsIHdoaWNoIHNlcnZlIGFzIGENCiAgZmlu ZSBtZWRpYSBmb3IgdW5pdmVyc2FsbHkgcXVhbnRpZmllZCBmdW5jdGlvbnMu IExhdGVyIGZpcnN0IGNsYXNzDQogIG1vZHVsZXMgd2VyZSBpbnRyb2R1Y2Vk LCB3aGljaCBjb3VsZCBhbHNvIGJlIHVzZWQgZm9yIHRoZSBzYW1lDQogIHB1 cnBvc2UuIFByb2JhYmx5LCBvbmUgY291bGQgZGV2aXNlIGEgc3BlY2lhbCBz eW50YXggKG9yIHJlbHkgb24gdGhlDQogIG5ldyBhdHRyaWJ1dGVzIGFuZCBl eHRlbnNpb25zIHN5bnRheCwgZS5nLiwgYG1hcDIgWyVyYW5rMiA6IGZ1biB4 IC0+DQogIHhdICgiaGVsbG8iLDQyKScgYnV0IHByb2JhYmx5IHRoaXMgd2ls bCBsZWFkIHRvIGFuIHVubmVjZXNzYXJ5DQogIGJsb2F0aW5nIG9mIHRoZSBs YW5ndWFnZSBhbmQgdGhlIGltcGxlbWVudGF0aW9uLCBlc3BlY2lhbGx5IHNp bmNlIHdlDQogIGFscmVhZHkgaGF2ZSB0aHJlZSBzb2x1dGlvbnMgd2l0aCBh IG1vcmUgb3IgbGVzcyB0b2xlcmFibGUgc3ludGF4IChhbmQNCiAgYXJlIGlu IHRoZSBiYXNlIGxhbmd1YWdlLCBub3QgYW4gZXh0ZW5zaW9uKS4gIEJlc2lk ZXMsIGlmIHdlIHdpbGwgdXNlDQogIHRoZSBgW0BAdW5ib3hlZF0nIGFubm90 YXRpb24sIG9yIHZpc2l0b3Igd2lsbCBoYXZlIHRoZSBzYW1lDQogIHJlcHJl c2VudGF0aW9uIGFzIGEgZnVuY3Rpb24sIGUuZy4sDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiB0eXBlICdyIHZpc2l0b3IgPSB7dmlzaXQgOiAnYS4g J3IgLT4gJ2EgdGVybSAtPiAncn0gW0BAdW5ib3hlZF0NCiAg4pSCIGxldCBj b3VudCB4IF8gPSB4ICsgMQ0KICDilIIgbGV0IGNvdW50ZXIgPSB7dmlzaXQ9 Y291bnR9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZA0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgIyBDb3JlX2tlcm5lbC5waHlzX3NhbWUgY291 bnQgY291bnRlcjs7DQogIOKUgiAtIDogYm9vbCA9IHRydWUNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgQ29uY2VybmluZyByYW5rLW4gcG9seW1vcnBoaXNt LCBpbiBPQ2FtbCBpcyBpcyBhY2hpZXZlZCB1c2luZw0KICBmdW5jdG9ycy4g IFllcywgdGhleSBhcmUgYSBsaXR0bGUgYml0IHN5bnRhY3RpY2FsbHkgaGVh dnkgYW5kIGZvcmNlIHVzDQogIHRvIHdyaXRlIHNpZ25hdHVyZXMsIGJ1dCB0 aGlzIGlzIG5lY2Vzc2FyeSBhbnl3YXkgYXMgcmFuay1uIGlzDQogIHVuZGVj aWRhYmxlIChub24taW5mZXJyYWJsZSkuIEZpbmFsbHksIGFzIGEgcmVhbC13 b3JsZCBleGFtcGxlIFsxXSBvZg0KICByYW5rLTIgcG9seW1vcnBoaXNtIGNv bnNpZGVyIHRoZSB1bml2ZXJzYWwgV0FWTCB0cmVlIHRoYXQgaXMgYSBiaW5h cnkNCiAgdHJlZSB3aXRoIGVhY2ggZWxlbWVudCBoYXZpbmcgYSBkaWZmZXJl bnQgdHlwZSAoYWthIGhldGVyb2dlbmVvdXMNCiAgbWFwKS4gV2UgdXNlIGl0 IGluIEJBUCBhcyBhIGJhY2tpbmcgc3RvcmUuIFlvdSBtaWdodCBmaW5kIGEg ZmV3IHRyaWNrcw0KICB0aGVyZSwgZXNwZWNpYWxseSB1c2luZyBjb250aW51 YXRpb24tcGFzc2luZyBpbiB0aGUgcmVjdXJzaXZlIGNhc2VzLg0KDQogIENo ZWVycywgSXZhbg0KDQogIFsxXToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9C aW5hcnlBbmFseXNpc1BsYXRmb3JtL2JhcC9ibG9iL2I0MDY4OWU2MzY2MDdi OTc3NzU4YWYwNDhiNzlkNjU2ODRjZTQ4YzMvbGliL2tub3dsZWRnZS9iYXBf a25vd2xlZGdlLm1sI0w4NDctTDE2OTM+DQoNCg0KTWFsY29sbSBNYXRhbGth IGFza2VkIGFuZCBJdmFuIEdvdG92Y2hpdHMgcmVwbGllZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgICAgICAgV2h5IGlzIHR5cGUgY2hlY2tpbmcgY3JlYXRpbmcg YSByZWNvcmQgZGlmZmVyZW50IHRoYW4gdHlwZQ0KICAgICAgICBjaGVja2lu ZyBhIGZ1bmN0aW9uIGFyZ3VtZW50Pw0KDQogICAgICAgIElmIHdlIGhhZCB0 aGUgc3ludGF4IChvciBzb21ldGhpbmcgbGlrZSBpdCk6DQoNCiAgICAgICAg bGV0IG1hcDIgOiAoJ2EuICdhIC0+ICdhKSAtPiAoJ2IgKiAnYykgLT4gKCdi ICogJ2MpDQoNCiAgICAgICAgV2h5IHdvdWxkIHRoZSB0eXBlIGNoZWNrZXIg bm90IGJlIGFibGUgdG8gc2VlIHRoYXQNCg0KICAgICAgICBtYXAyIGdvb2Rf aWQgKCJoaSIsIDQyKQ0KDQogICAgICAgIGlzIHZhbGlkIGJ1dA0KDQogICAg ICAgIG1hcDIgKGZpbmVfaWQgKCkpICgiaGkiLCAzMikNCg0KICAgICAgICBp cyBub3QsIHVzaW5nIHRoZSBzYW1lIGxvZ2ljIHRoYXQgaXMgdmVyaWZ5aW5n IGNyZWF0aW5nDQogICAgICAgIHRoZSAiaWQiIHJlY29yZCBpcyBub3QgdmFs aWQ/DQoNCiAgSSBiZWxpZXZlIGl0IGlzIHBvc3NpYmxlLCBhcyBpdCBpcyBw b3NzaWJsZSBpbiBIYXNrZWxsICh3aXRoDQogIFJhbmtOVHlwZXMgYW5kIFNj b3BlZFR5cGVWYXJpYWJsZXMpLiBUaGUgbWFpbiAodGhlb3JldGljYWwpIGRp ZmZlcmVuY2UNCiAgaXMgdGhhdCBpbiBPQ2FtbCB3ZSBuZWVkIHRvIGNoZWNr IHdoZXRoZXIgYW4gZXhwcmVzc2lvbiBpcyBleHBhbnNpdmUNCiAgYW5kIHVz ZSBhIHNwZWNpYWxpemVkIGdlbmVyYWxpemF0aW9uIGluIGNhc2UgaWYgaXQg aXMgKGZvciB0aGUgcmVsYXhlZA0KICB2YWx1ZSByZXN0cmljdGlvbikuIEl0 IHdpbGwsIGhvd2V2ZXIsIGNvbXBsaWNhdGUgdGhlIHR5cGUgaW5mZXJlbmNl DQogIGVuZ2luZSBhIGxvdCwgYnV0IG1vc3QgaW1wb3J0YW50bHksIGNoYW5n aW5nIHRoZSB0eXBpbmcgcnVsZSBvZg0KICBmdW5jdGlvbnMgd2lsbCBoYXZl IGEgdHJlbWVuZG91cyBpbXBhY3Qgb24gdGhlIGxhbmd1YWdlLiBTbyB0aGlz IHdvdWxkDQogIGJlIGEgdmVyeSBpbXByYWN0aWNhbCBzb2x1dGlvbi4gIEVz cGVjaWFsbHksIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlDQogIG1lY2hhbmlz bSBvZiBsYW5ndWFnZSBleHRlbnNpb25zLCBlbmFibGluZyBSYW5rTlR5cGVz IHdpbGwgbWFrZSBhIGxvdA0KICBvZiBwcm9ncmFtcyB1bnR5cGVhYmxlLCBh cyB0aGV5IHdpbGwgbm93IHJlcXVpcmUgdHlwZSBhbm5vdGF0aW9ucw0KICAo cmVjYWxsIHRoYXQgUmFua04gaXMgdW5kZWNpZGFibGUgaW4gZ2VuZXJhbCku ICBJdCBjb3VsZCBwcm9iYWJseSBiZQ0KICBpbXBsZW1lbnRlZCBhcyBhIGNv bXBpbGVyIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXIsIGxpa2UgYC1yZWN0eXBl cycgYnV0DQogIHRoaXMgd2lsbCBiZSBzdGlsbCBxdWl0ZSBpbXByYWN0aWNh bCBzaW5jZSBtb3JlIG9mdGVuIGNvZGUgbGlrZSBgZnVuIGYNCiAgLT4gZiAx LCBmIHRydWUnIGlzIGEgcHJvZ3JhbW1lciBlcnJvciwgcmF0aGVyIHRoYW4g YSB0cnVlIHJlcXVlc3QgZm9yDQogIHVuaXZlcnNhbCBwb2x5bW9ycGhpc20g KHRoZSBzYW1lIGFzIHdpdGggcmVjdHlwZXMsIHJlY3Vyc2l2ZSB0eXBlcyBh DQogIG1vcmUgb2Z0ZW4gYW4gZXJyb3IgcmF0aGVyIHRoYW4gYSBkZWxpYmVy YXRlIGF0dGVtcHQpLiBUaGVyZWZvcmUsDQogIGVuYWJsaW5nIFJhbmtOKF4x KSBwb2x5bW9ycGhpc20gd2lsbCB0eXBlIHRvbyBtYW55IHByb2dyYW1zIChu b3QgdGhhdA0KICBpdCBpcyB1bnNvdW5kLCBqdXN0IG1hbnkgcHJvZ3JhbXMg d29uJ3QgaGF2ZSBzZW5zZSkgYXQgdGhlIGNvc3Qgb2YNCiAgZXZlbiBtb3Jl IG9ic2N1cmUgdHlwZSBlcnJvcnMuIE9uIHRoZSBvdGhlciBoYW5kLCB3ZSBo YXZlIHRocmVlDQogIHN5bnRhY3RpYyBjb25zdHJ1Y3RzIHRoYXQgbGV0IHVz IGV4cHJlc3Mgbm9uLXByZW5leCBwb2x5bW9ycGhpc20gb2YNCiAgdGhlIG5l Y2Vzc2FyeSByYW5rKF4yKSB3aXRob3V0IGJyZWFraW5nIGFueXRoaW5nIGVs c2UuIFNvIGl0IGxvb2tzDQogIGxpa2UgYSBnb29kIGRlYWwgLSB3ZSBjYW4g aGF2ZSByYW5rTiBwb2x5bW9ycGhpc20gYW5kIGRlY2lkYWJsZSB0eXBlDQog IGNoZWNrZXIgYXQgdGhlIHNhbWUgdGltZS4gSnVzdCB0aGluayBvZiBwb2x5 bW9ycGhpYyByZWNvcmRzL21ldGhvZHMgYXMNCiAgYW4gZW1iZWRkZWQgRFNM IGZvciByYW5rTiBwb2x5bW9ycGhpc20uDQoNCiAgYD09PT09PT09PT0nIEZv b3Rub3RlczoNCg0KICAxKSBBbiBpbXBvcnRhbnQgcG9pbnQsIHRoYXQgSSBm b3Jnb3QgdG8gbm90aWNlLCBpcyB0aGF0IGVuYWJsaW5nDQogICAgIHNjb3Bl ZA0KICB0eXBlIHZhcmlhYmxlcywgd2lsbCBpbmV2aXRhYmx5IGVuYWJsZSBy YW5rTiBwb2x5bW9ycGhpc20sIGUuZy4sIHNpbmNlDQogIG5vdyBhbnkgdHlw ZSBjb3VsZCBiZSBhIHBvbHl0eXBlLCB0aGVuIHN1cHBvc2Ugd2UgaGF2ZSB0 eXBlDQogIGAnYS4gKCdiLidiIC0+ICdhKSAtPiAnYScgY291bGQgYmUgaW5z dGFudGlhdGVkIHRvICdhID0gJ2QuICgnYy4gLT4NCiAgJ2QpIC0+ICdkLCBz byB0aGF0IG91ciB0eXBlIGlzIG5vdyBgJ2QuICgnYi4gJ2IgLT4gKCdjLiAn YyAtPiAnZCkgLT4NCiAgJ2QpIC0+ICgnYy4gJ2MgLT4gJ2QpIC0+ICdkJyB3 aGljaCBpcyBub3cgcmFuazMuIFRoZXJlZm9yZSwgZW5hYmxpbmcNCiAgYXJi aXRyYXJ5IHF1YW50aWZpY2F0aW9uIGluIHRoZSBhcnJvdyB0eXBlIHdpbGwg bGVhZCB0byByYW5rTiBhbmQNCiAgaW1tZWRpYXRlbHkgbWFrZSB1bmRlY2lk YWJsZSBtb3N0IG9mIHRoZSB0eXBlIGNoZWNrZXIuDQoNCiAgMSkgV2UgY2Fu IGNyYWZ0IGFyYml0cmFyeSByYW5rIHVzaW5nIHJlY29yZHMgd2l0aCB1bml2 ZXJzYWxseQ0KICAgICBxdWFudGlmaWVkDQogIHR5cGUgdmFyaWFibGVzLCBl LmcuLCBoZXJlIGlzIGFuIGV4YW1wbGUgb2YgcmFuazMgcG9seW1vcnBoaXNt Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdHlwZSAnYSByYW5rMSA9 IHtmMSA6ICdzLiAncyAtPiAnYX0NCiAg4pSCIHR5cGUgJ2EgcmFuazIgPSB7 ZjIgOiAnci4gJ3IgLT4gJ2EgcmFuazF9DQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIEluZGVlZCwgYGYyJyBoYXMgdHlwZSBgJ2EuKCdyLiAnciAtPiAoJ3Mu ICdzIC0+ICdhKScNCg0KDQpPQ2FtbFBybydzIG9wYW0gY2hlYXQgc2hlZXQs IHdpdGggYSBuZXcgdGhlbWUhDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JmYy1vY2FtbHByb3Mtb3BhbS1j aGVhdC1zaGVldC13aXRoLWEtbmV3LXRoZW1lLzQ2ODkvMz4NCg0KDQpUaG9t YXMgQmxhbmMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBUaGUgb3BhbSBjaGVhdC1zaGVldCBpcyBub3cgcHVibGlzaGVkIGluIGl0 cyBmaW5hbCBmb3JtLg0KDQogIFlvdSBjYW4gZ2V0IHRoZSBbY29sb3JlZF0g YW5kIFtibGFjay1hbmQtd2hpdGVdIHZlcnNpb25zIGZyb20gb3VyDQogIHdl YnNpdGUuDQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpbY29sb3JlZF0NCjxo dHRwOi8vd3d3Lm9jYW1scHJvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAx OS8xMS9vY2FtbC1vcGFtLnBkZj4NCg0KW2JsYWNrLWFuZC13aGl0ZV0NCjxo dHRwOi8vd3d3Lm9jYW1scHJvLmNvbS93cC1jb250ZW50L3VwbG9hZHMvMjAy MC8wMS9vY2FtbC1vcGFtLWJ3LnBkZj4NCg0KDQpPQ2FtbCA0LjEwLjAsIGZp cnN0IGJldGENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0x MC0wLWZpcnN0LWJldGEvNDk4OS8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxlYXNlIG9mIE9DYW1sIDQu MTAuMCBpcyBhcHByb2FjaGluZy4gV2UgaGF2ZSBwdWJsaXNoZWQgYSBmaXJz dA0KICBiZXRhIHZlcnNpb24gdG8gaGVscCB5b3UgYWRhcHQgeW91ciBzb2Z0 d2FyZSB0byB0aGUgbmV3IGZlYXR1cmVzIGFoZWFkDQogIG9mIHRoZSByZWxl YXNlLg0KDQogIER1cmluZyBvdXIgcHJlbGltaW5hcnkgdGVzdHMgZm9yIHRo aXMgbmV3IGJldGEsIHdlIGRpc2NvdmVyZWQgdGhhdCB0aGUNCiAgcmVjZW50 IHdvcmsgdG93YXJkcyBhIG11bHRpY29yZS1yZWFkeSBPQ2FtbCBydW50aW1l IGludHJvZHVjZWQNCiAgY29tcGF0aWJpbGl0eSBpc3N1ZXMgd2l0aGluIHNv bWUgb3BhbSBwYWNrYWdlcywgdGhhdCB3ZXJlIHR3ZWFraW5nIHRoZQ0KICBy dW50aW1lIGludGVybmFscy4gIE1vc3Qgb2YgdGhvc2Ugb3BhbSBwYWNrYWdl cyBoYXZlIGJlZW4gZml4ZWQsIG9yDQogIHdpbGwgYmUgc29vbi4gIE5ldmVy dGhlbGVzcywgaWYgeW91IGFyZSBhZmZlY3RlZCBieSBzdWNoIGNvbXBhdGli aWxpdHkNCiAgaXNzdWUsIHBsZWFzZSBzcGVhayB1cC4NCg0KICBUaGUgc291 cmNlIGNvZGUgaXMgYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJlc3NlczoNCg0K ICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNC4x MC4wK2JldGExLnRhci5nej4NCiAgPGh0dHBzOi8vY2FtbC5pbnJpYS5mci9w dWIvZGlzdHJpYi9vY2FtbC00LjEwL29jYW1sLTQuMTAuMCtiZXRhMS50YXIu Z3o+DQoNCiAgVGhlIGNvbXBpbGVyIGNhbiBhbHNvIGJlIGluc3RhbGxlZCBh cyBhbiBPUEFNIHN3aXRjaCB3aXRoIG9uZSBvZiB0aGUNCiAgZm9sbG93aW5n IGNvbW1hbmRzLg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dp dGNoIGNyZWF0ZSBvY2FtbC12YXJpYW50cy40LjEwLjArYmV0YTEgLS1yZXBv c2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDi lIDilIANCiAgb3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3 aXRjaCBjcmVhdGUgb2NhbWwtdmFyaWFudHMuNC4xMC4wK2JldGExKzxWQVJJ QU5UPiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJldGE9Z2l0K2h0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQog IOKUlOKUgOKUgOKUgOKUgA0KICB3aGVyZSB5b3UgcmVwbGFjZSA8VkFSSUFO VD4gd2l0aCBvbmUgb2YgdGhlc2U6DQogIOKAoiBhZmwNCiAg4oCiIGZsYW1i ZGENCiAg4oCiIGZwDQogIOKAoiBmcCtmbGFtYmRhDQoNCiAgV2Ugd2FudCB0 byBrbm93IGFib3V0IGFsbCBidWdzLiBQbGVhc2UgcmVwb3J0IHRoZW0gaGVy ZToNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cz4NCg0KICBIYXBweSBoYWNraW5nLg0KDQoNCkthdGUgYWRkZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvciB0aGUgcGVvcGxl IHdhbnRpbmcgdG8gZ2l2ZSBPQ2FtbCA0LjEwLjBiZXRhMSBhIHNob3QsIGhl cmUgaXMgYW4NCiAgb3BhbSBvdmVybGF5IHdoaWNoIGFkZHMgZml4ZXMgdG8g bWFqb3IgcGFja2FnZXMgZm9yIHRoZW0gdG8gd29yayB3aXRoDQogIHRoaXMg YmV0YTogPGh0dHBzOi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZS9vcGFtLWFs cGhhLXJlcG9zaXRvcnk+DQoNCiAgVG8gdXNlIGl0LCBzaW1wbGUgY2FsbDoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gc3dpdGNoIDQuMTAN CiAg4pSCICQgb3BhbSByZXBvc2l0b3J5IGFkZCBhbHBoYSBnaXQ6Ly9naXRo dWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgT2J2aW91c2x5LCB0aGlzIHJlcG9z aXRvcnkgc2hvdWxkIG5vdCBiZSB1c2VkIGluIHByb2R1Y3Rpb24gYW5kDQog IHByb2JhYmx5IGNvbnRhaW5zIGEgZmV3IGJ1Z3MsIGJ1dCBhdCBsZWFzdCBp dCBhbGxvd3MgZXZlcnlvbmUgdG8gaGF2ZQ0KICBhbG1vc3QgYXMgbWFueSBw YWNrYWdlcyBhdmFpbGFibGUgYXMgd2l0aCBPQ2FtbCA0LjA5LiBPbmx5IDYw aXNoDQogIHBhY2thZ2VzIGFyZSBzdGlsbCBub3QgYXZhaWxhYmxlLCBidXQg YXBhcnQgZnJvbSB0aGUgbm90YWJsZSBleGNlcHRpb24NCiAgb2YgYG1lcmxp bicgYWxsIHRoZSBlc3NlbnRpYWwgcGFja2FnZXMgYW5kIGRlcGVuZGVuY2ll cyBhcmUgdGhlcmUuDQoNCiAgVGhpcyB3b3JrIGhhcyBiZWVuIHBhcnQgb2Yg dGhlIHJlbGVhc2UtcmVhZHluZXNzIGVmZm9ydCBmb3VuZGVkIGJ5IHRoZQ0K ICBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFzIGFubm91bmNlZCBoZXJl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10aGUtb2Nh bWwtc29mdHdhcmUtZm91bmRhdGlvbi80NDc2LzEzPg0KDQogIFRoZSByZXN0 IG9mIHRoZSBlZmZvcnQgaXMgZ29pbmcgdG8gYmUgcHV0IHRvd2FyZHMgaGF2 aW5nIGBtZXJsaW4nDQogIGF2YWlsYWJsZSBmb3IgT0NhbWwgNC4xMCBhbmQg dXBzdHJlYW1pbmcgYWxsIHRoZSBmaXhlcyBmcm9tDQogIG9wYW0tYWxwaGEt cmVwb3NpdG9yeSAobW9zdCBvZiB0aGVtIGhhdmUgUFJzIGFzc29jaWF0ZWQg YWxyZWFkeSkuIEknbQ0KICBob3BlZnVsIGZvciB0aGVtIGJlIGFsbCB1cHN0 cmVhbWVkIGFuZCBhdmFpbGFibGUgYmVmb3JlIHRoZSBzdGFibGUNCiAgcmVs ZWFzZSBvZiBPQ2FtbCA0LjEwLg0KDQoNCkRhdGEgZW5naW5lZXIgcG9zaXRp b25zIGF0IEVsYXN0aWMsIFVTL0NhbmFkYS9XZXN0ZXJuIEV1cm9wZSAocHJv eGltYXRlIHRvIE5BIHRpbWV6b25lcykNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvam9iLWRhdGEtZW5naW5lZXItcG9zaXRp b25zLWF0LWVsYXN0aWMtdXMtY2FuYWRhLXdlc3Rlcm4tZXVyb3BlLXByb3hp bWF0ZS10by1uYS10aW1lem9uZXMvNDk5MS8xPg0KDQoNCkhlemVraWFoIENh cnR5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgT3VyIHRlYW0gaGVyZSBhdCBbRWxhc3RpY10gaGFzIHBvc2l0aW9ucyBv cGVuIGZvciBhIGZldyBzZWN1cml0eSBkYXRhDQogIGVuZ2luZWVycyAoYWth IHdyYW5nbGVycyBvZiBkYXRhIGFuZCBhbGwgdGhlIHN5c3RlbXMgaW52b2x2 ZWQpLiAgV2UNCiAgYXJlIGEgZGlzdHJpYnV0ZWQgY29tcGFueSBzbyB5b3Ug ZG9uJ3QgaGF2ZSB0byBiZSBjbG9zZSB0byBhbiBvZmZpY2UNCiAgdG8gYmUg Y29uc2lkZXJlZC4gIEluZm9zZWMgaW5kdXN0cnkgZXhwZXJpZW5jZSBpcyBf bm90XyByZXF1aXJlZCwNCiAgdGhvdWdoIG9mIGNvdXJzZSB3ZWxjb21lLiAg V2UncmUgc3Vycm91bmRlZCBieSBleHBlcnRzIGluIHRoZSBmaWVsZCBzbw0K ICB5b3UnbGwgaGF2ZSBsb3RzIG9mIG9wcG9ydHVuaXRpZXMgdG8gbGVhcm4g YXMgeW91IGdvIQ0KDQogIFRoZSBvZmZpY2lhbCBwb3N0aW5ncyBhcmUgYXZh aWxhYmxlIGhlcmUgKGJvdGggaGF2ZSB0aGUgc2FtZSB0ZXh0IGFuZA0KICBv bmx5IGRpZmZlciBpbiB0aXRsZS9zZW5pb3JpdHkpOg0KICDigKIgU2VjdXJp dHkgZGF0YSBlbmdpbmVlciAtDQogICAgPGh0dHBzOi8vam9icy5lbGFzdGlj LmNvL2pvYnMvc2VjdXJpdHktc29sdXRpb25zL2FtZXItZGlzdHJpYnV0ZWQt L3NlY3VyaXR5LWRhdGEtZW5naW5lZXIvMjAwNTE0MCMvPg0KICDigKIgU2Vu aW9yIHNlY3VyaXR5IGRhdGEgZW5naW5lZXIgLQ0KICAgIDxodHRwczovL2pv YnMuZWxhc3RpYy5jby9qb2JzL3NlY3VyaXR5LXNvbHV0aW9ucy9hbWVyLWRp c3RyaWJ1dGVkLS9zZWN1cml0eS1zZW5pb3ItZGF0YS1lbmdpbmVlci8yMDA1 MTUyIy8+DQoNCiAgTGFuZ3VhZ2Utd2lzZSwgT0NhbWwvUmVhc29uIG1ha2Vz IHVwIG1vc3Qgb2YgdGhlIGNvZGUgeW914oCZbGwgYmUNCiAgd29ya2luZyBv bi4gUHl0aG9uIG1ha2VzIHVwIG1vc3Qgb2YgdGhlIHJlc3QsIGluIHBhcnRp Y3VsYXIgdGFraW5nDQogIGFkdmFudGFnZSBvZiB0aGUgbWFjaGluZSBsZWFy bmluZyBhbmQgbmF0dXJhbCBsYW5ndWFnZSBwcm9jZXNzaW5nDQogIGdvb2Rp ZXMgdGhhdCBlY29zeXN0ZW0gcHJvdmlkZXMuIE1vc3Qgb2YgdGhlIHRvb2xz IGFuZCBzZXJ2aWNlIHdlDQogIGRldmVsb3AgYXJlIGludGVybmFsbHkgZm9j dXNlZCwgc3VwcG9ydGluZyBzZWN1cml0eSByZXNlYXJjaCBhbmQNCiAgaW1w cm92ZW1lbnRzIHRvIHNlY3VyaXR5IHByb3RlY3Rpb25zIGZvciBvdXIgdXNl cnMuIEZvciB0aG9zZQ0KICBzby1pbmNsaW5lZCwgdGhlcmUgYXJlIGxvdHMg b2Ygb3Bwb3J0dW5pdGllcyB0byBwcmVzZW50IGF0IGFuZCBhdHRlbmQNCiAg Y29uZmVyZW5jZXMsIHByZXNlbnQgd29yayBpbiBibG9nIHBvc3RzLCBjb250 cmlidXRlIHRvIG9wZW4gc291cmNlDQogIHNvZnR3YXJlIHByb2plY3RzIGFu ZCBvdGhlcndpc2UgZW5nYWdlIHRoZSBjb21tdW5pdHkuDQoNCiAgVGhlIHBv c2l0aW9ucyBhcmUgdmVyeSBzaW1pbGFyIHRvIG91ciBbbGFzdCBoaXJpbmcg YW5ub3VuY2VtZW50XSwNCiAgdGhvdWdoIHdlIGhhZCBhIGRpZmZlcmVudCBu YW1lIGF0IHRoYXQgcG9pbnQhDQoNCiAgUGxlYXNlIHJlYWNoIG91dCB0byBt ZSBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLiBJ4oCZbSBhdmFpbGFibGUg b24gdGhlDQogIE9DYW1sIG9yIFJlYXNvbiBEaXNjb3JkIHNlcnZlcnMgb3Ig YnkgZW1haWwgYXQNCiAgaGV6ZWtpYWguY2FydHlAZWxhc3RpYy5jby4NCg0K DQpbRWxhc3RpY10gPGh0dHBzOi8vd3d3LmVsYXN0aWMuY28vPg0KDQpbbGFz dCBoaXJpbmcgYW5ub3VuY2VtZW50XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9maWxsZWQtcG9zdGluZy1pcy1uby1sb25nZXItb3Blbi10aHJl YXQtcmVzZWFyY2gtZW5naW5lZXItam9iLWVuZGdhbWUtdXMvMTkzNz4NCg0K DQpSZWxlYXNlIG9mIG5hYm9yaXMgMC4xLjAgYSBzaW1wbGUgaHR0cCBzZXJ2 ZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvcmVsZWFzZS1vZi1uYWJvcmlzLTAtMS0wLWEtc2ltcGxlLWh0dHAt c2VydmVyLzQ5OTQvMT4NCg0KDQpTaGF3biBNY0dpbnR5IGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgPGh0dHBzOi8vZ2l0aHVi LmNvbS9zaGF3bi1tY2dpbnR5L25hYm9yaXM+DQoNCiAgSSBjb3VsZCB1c2Ug aW5wdXQgb24gdGhlIEFQSSBhbmQgdGhlIGRvY3VtZW50YXRpb24uICBXb3Jr aW5nIG9uIHRyeWluZw0KICB0byBpbXByb3ZlIGJvdGggYXQgdGhlIG1vbWVu dC4NCg0KICBUaGUgZ29hbCB3YXMgdG8gY3JlYXRlIGEgdmVyeSBzaW1wbGUg bGlicmFyeSBmb3IgYnVpbGRpbmcgUkVTVGZ1bCB0eXBlDQogIG9mIHdlYiBz ZXJ2ZXJzLiAgTWFrZSBpdCBfdmVyeV8gZWFzeSB0byBtYW5hZ2UgaGFuZGxl IHJlcXVlc3QvcmVzcG9uc2UNCiAgbGlmZWN5Y2xlIGFuZCBzZXNzaW9ucy4N Cg0KICBJbiBteSBvcGluaW9uIHRoaXMgdHlwZSBvZiB3ZWIgc2VydmVyIGlz IGEgZ3JlYXQgZW50cnkgcG9pbnQgZm9yIG5ldw0KICBkZXZlbG9wZXJzIGxv b2tpbmcgdG8gZXhwbG9yZSB0aGUgT0NhbWwvUmVhc29uIHdvcmxkLg0KDQog IFJlY2VudGx5IEkgaGF2ZSBmYWxsZW4gaW4gbG92ZSB3aXRoIE9DYW1sIGFu ZCBSZWFzb24sIGFuZCBhcyBhIG1vc3RseQ0KICB3ZWIgY2VudGVyZWQgZGV2 ZWxvcGVyIEkndmUgZm91bmQgdGhpcyBhcmVhIHF1aXRlIGxhY2tpbmcuICBJ J20gc3RpbGwNCiAgbmV3IHRvIHRoZSBsYW5ndWFnZSBhbmQgZWNvIHN5c3Rl bSBzbyBhbnkgZ3VpZGFuY2Ugd291bGQgYmUgaGlnaGx5DQogIGFwcHJlY2lh dGVkIQ0KDQoNCllhd2FyIEFtaW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V293ISBJdCBzZWVtcyB3ZSBoYWQgbXVjaCB0aGUgc2FtZSBpZGVh4oCTT0Nh bWwvUmVhc29uIG1vcmUgYWNjZXNzaWJsZQ0KICB0byB3ZWIgZGV2ZWxvcGVy cyBuZXcgdG8gdGhlIGVjb3N5c3RlbSA6LUQgSSd2ZSBiZWVuIHdvcmtpbmcg b24NCiAgc29tZXRoaW5nIHZlcnkgc2ltaWxhcjogPGh0dHBzOi8vZ2l0aHVi LmNvbS95YXdhcmFtaW4vcmUtd2ViLz4NCg0KDQpVbHJpayBTdHJpZCBzYWlk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGVyZSBpcyBhbHNvIG9waXVtIDxodHRwczovL2dpdGh1 Yi5jb20vcmdyaW5iZXJnL29waXVtPg0KDQogIEFuZCBtb3JwaCA8aHR0cHM6 Ly9naXRodWIuY29tL3JlYXNvbi1uYXRpdmUtd2ViL21vcnBoPiB0aGF0IGhh cw0KICBzaW1pbGFyIGdvYWxzLg0KDQogIEl0IHdvdWxkIGJlIG5pY2UgaWYg d2UgY291bGQgZWl0aGVyIGNyZWF0ZSBhIHNoYXJlZCBjb3JlIHRoYXQgYWxs DQogIGNvdWxkIGJ1aWxkIGZyb20gb3IgY29sbGFib3JhdGUgb24gb25lLg0K DQoNCmVzeUAwLjYuMCByZWxlYXNlDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lc3ktMC02LTAtcmVs ZWFzZS81MDEwLzE+DQoNCg0KQW5kcmV5IFBvcHAgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBXZSd2ZSBqdXN0IHJlbGVhc2VkIGEgbmV3 IHZlcnNpb24gb2YgZXN5LiBZb3UgY2FuIGluc3RhbGwgaXQgd2l0aCBucG06 DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBucG0gaW5zdGFsbCAtZyBl c3lAMC42LjANCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgW2VzeV0gaXMgYSBw YWNrYWdlLmpzb24gZHJpdmVuIHdvcmtmbG93IGZvciBuYXRpdmUgZGV2ZWxv cG1lbnQgd2l0aA0KICBSZWFzb24vT0NhbWwgKGFuZCBldmVuIEMvQysrKS4g SXQgcHJvdmlkZXMgcGVyLXByb2plY3QgYnVpbGQNCiAgZW52aXJvbm1lbnRz IHdoaWNoIGFyZSBpc29sYXRlZCBmcm9tIGVhY2ggb3RoZXIgYnV0IHNoYXJl IHVuZGVybHlpbmcNCiAgYnVpbGQgY2FjaGVzIHNvIGNyZWF0aW5nIG5ldyBl bnZpcm9ubWVudHMgaXMgY2hlYXAuDQoNCiAgV2hpbGUgMC42LjAgaXMgbWFp bmx5IGFib3V0ICJxdWFsaXR5LW9mLWxpZmUiIGltcHJvdmVtZW50cyBpdCBh bHNvIGdvdA0KICBmZXcgbmV3IGZlYXR1cmVzIGluY2x1ZGluZyBhIGJhc2lj IHN1cHBvcnQgZm9yIGdhcmJhZ2UgY29sbGVjdGlvbiBvZg0KICB1bnVzZWQg YnVpbGQgYXJ0aWZhY3RzLg0KDQogIEZvciBtb3JlIGluZm8gc2VlIGEgW2Js b2cgcG9zdF0gYnkgQHByb21ldGhlYW5zYWNyaWZpY2Ugd2hpY2gNCiAgaGln aGxpZ2h0cyBpbXBvcnRhbnQgdXBkYXRlcyBpbiAwLjYuMC4NCg0KDQpbZXN5 XSA8aHR0cHM6Ly9lc3kuc2g+DQoNCltibG9nIHBvc3RdIDxodHRwczovL2Vz eS5zaC9ibG9nLzIwMjAvMDEvMTIvMC42LjAuaHRtbD4NCg0KDQpPbGQgQ1dO DQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRv IG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQg SSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQg W3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNo aXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2 ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGlu ZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3Nh Z2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0K DQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0g PGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdl ZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 07 to 14, 202= 0.

Calling a single function on every member of a GADT?

Ivan Gotovchits asked

I'm basically trying to do the equivalent of this simple fold = function:

module Simple =3D
struct
  type term =3D
     | Int of int
     | Add
     | App of term * term

  let rec fold i f =3D function
    | Int=
 _ as t -> f i t
    | Add=
 -> f i Add
    | App=
 (x, y) as t -> f (fold (fold i f=
 x) f y) t
end

… but using a GADT:

module Gadt =3D
struct
  type _ term =3D
     | Int : int -> int term
     | Add : (int -> int -> int) term
     | App : ('b -> 'a) term * 'b term -> 'a term

  let rec fold : type a. 'r -> (=
'r -> _ term -> 'r) -> 'r =3D fun i f -> function
    | Int=
 _ as t -> f i t
    | Add=
 -> f i Add
(*
     ^ Error: This pattern matches values o=
f type (int -> int -> int) term
        but a pattern was expected which ma=
tches values of type int term
        Type int -> int -> int is not=
 compatible with type int
*)
    | App=
 (x, y) as t -> f (fold (fold i f=
 x) f y) t
end

I've tried other variants of the syntax and got many encouragements but no = green flag from the type-checker. Why is the compiler expecting an int term in there? I though the whole poin= t of the type a. ... syntax was to allow the matched type to v= ary from one pattern to the next? Is there a way to do this?

Ivan Gotovchits replied

It is the limitation of the let-bound polymorphism. A parameter of a function is monomorphic in its body. The classical example doesn't even reference any GADT,

let example f  =3D f "hello=
", f 42

It won't compile even though we can provide a polymorphic function that can applied both to integers and to strings, e.g., exampe (fun x -> x)= should be possible, but not, because of the let-bounded polymorphism. There are a few solutions available in OCaml, the simplest is to use records, e.g.,

type app =3D {apply : 'a=
. 'a -> 'a}

let example {apply<=
/span>} =3D apply "hello", apply 42<=
span style=3D"color: #ff4500;">;;

val example : app -> string * int =3D <fun>

Now we have app that is polymorphic. In your case, I would define a visitor type, e.g.,

type 'r visitor =3D {vis=
it : 'a. 'a term -> 'r -> 'r}

let rec fold : type a. 'r -> '=
r visitor -> a term -> 'r =3D
  fun f t -> match t with
    | Int=
 _ as t -> f.visit i t
    | Add=
 as t -> f.visit i t
    | App=
 (x,y) as t ->
        let i =3D fold i f x in
        let i =3D fold i f y in
        f.visit i t

Jacques Garrigue also replied

Actually, this is a rare case where using a polymorphic method may be handy too:

let rec fold : type a r. r -> &l=
t;v : 'b. r -> 'b term -> r> -> a term -> r =3D
     fun i f -> function
     | Int _ as t -> f#v i t
     | Add -> f#v i Ad=
d
     | App (x, y) as t -> f#v (fold (fold =
i f x) f y) t

let v =3D
   object method v : type a. _ ->=
; a Gadt.term -> _ =3D
     fun x -> function
       | Int n -> x+n
       | Add -> x+1
       | App _ -> x+2
   end

let r =3D Gadt.fold 0 v (App=
 (App (Add,=
 Int 3), =
Int 5))

The point being that to match on a Gadt you will anyway need to use the (type a) construct to allow refinement.

rixed asked and Ivan Gotovchits replied

So there is no lighter syntax to specify that f should accept = any member of a GADT than the syntax to specify that f should accept any = type at all?

Only three methods of introducing rank-2 polymorphism are known to me:

  1. records
  2. objects
  3. first-class modules

Jacques has demonstrated the solution with objects, which might be a little bit more lightweight, at least as you don't need to define a new data type beforehand. But the invocation is more verbose and requires an annotation from the caller side, which could be confusing. The third solution relies on first-class modules and is even more verbose, at least on the definition side. Just for the sake of completeness,

  module type Visitor =
=3D sig
    type t
    val term : t -> 'a term -> t
  end

  let rec fold : type a r. r -> =
(module Visito=
r with type t =
=3D r) -> a term
-> r =3D
    fun i ((module Visit) as <=
span style=3D"color: #a0522d;">f) t<=
/span> -> match t with
      | Int _ as t -> Visit.term i t
      | Add as t -> Visit.term i t
      | App (x,y) as t ->
          let i =3D fold i f x in
          let i =3D fold i f y in
          Visit.term i t

  let s =3D fold 0 (module struct
      type t =3D int
      let term x _ =3D x + 1
    end)

And again, it is not about GADT. GADT act as a red herring here. As I've demonstrated earlier, using a simple pair will suffice to display the limitation of the prenex polymorphism. Even no ADT is required, just apply one term to another two and you will get them unified, e.g.,

let f g x y : unit =3D g x; g y

will have type

val f : ('a -> unit) =
-> 'a -> 'a -> unit

because 'a is quantified on the scope of f not g,= in other words, it has type (not an OCaml syntax)

val f : forall 'a. ('a -=
> unit) -> 'a -> 'a -> unit

while we would like to have a type

val f : forall 'b, 'c. (=
forall 'a. 'a -> unit) -> 'b -> 'c -> unit

OCaml doesn't allow us to define types like ('a. 'a -> 'a) = and the reason is not that it is hard to extend the parser it is…

I wonder, is this just a limitation of the OCaml parser or is there some deep reason for these work-around (like is the case, from my understanding, for the value restriction)?

Yep, good catch! It is because of the impurity. Indeed, Haskell has the Rank2Types extension that lets us write types like (forall a. a ->= ()) -> b -> c -> (), with no extra syntactic burden (modulo having to= provide the type annotation). But functions in Haskell are pure, therefore it is possible. To make the story short and obvious, let me do a simple demonstration of how things can go wrong in a language with side-effects. Let's go back to the simple example of pairs and the identity function. Consider the following nasty identity function,

let bad_id () =3D
  let cache =3D ref None in
  fun match cache.content=
s with
    | None -> cache :=3D Some x; x
    | Some cache -> cache

It has type unit -> 'a -> 'a therefore, if we would have= the rank-1 polymorphism enabled for functions, we could apply it to the function

let map2 : fun ('a. 'a -> 'a) -> 'b -> 'c -> 'b * 'c=
 =3D fun f (x,y) -> f x, f y

as

let x,y : string * int =3D map2 (bad_id ()) "hello", 42

and will get a segmentation fault, as y will now have type int= but hold a string.

And here comes the syntax as a savior as it lets us specify functions that are guaranteed to be syntactic values. Indeed, all three solutions syntactically guarantee that the provided argument is a function, not a closure. Indeed, let's introduce the universal identity via a record,

type id =3D { f : 'a. 'a=
 -> 'a}

and we can see that our bad_id is not accepted due to the value restriction, while good_id, defined as,

let good_id x =3D x

is perfectly fine, e.g.,

let id1 =3D {f =3D good_=
id} (**)
let id2 =3D {f =3D bad_id}   (* rejected *)

moreover, even a fine, but not syntactic, identity is also rejected

let fine_id () x =3D x
let id3 =3D {f =3D fine_id ()} (* rejected *)

with the message

This field value has type 'b -> 'b which is less general than 'a. 'a -&g=
t; 'a

The same is true with modules,

module type Id =3D sig
  val f : 'a -> 'a
end
module Id1 : Id =3D struct let f =3D good_id end   (* accepted *)<=
/span>
module Id2 : Id =3D struct let f =3D bad_id () end (* rejected *)<=
/span>
module Id3 : Id =3D struct let f =3D fine_id () end (* rejected *)=

and with objects (left as an exercise).

To summarize, in order to enable rank2 polymorphism we need a special kind of values to bear universal functions, as we can't rely on ordinary functions, which could be constructed using partial application. OCaml already had objects and records, which serve as a fine media for universally quantified functions. Later first class modules were introduced, which could also be used for the same purpose. Probably, one could devise a special syntax (or rely on the new attributes and extensions syntax, e.g., map2 [%rank2 : fun x -> x] ("hello",42) but p= robably this will lead to an unnecessary bloating of the language and the implementation, especially since we already have three solutions with a more or less tolerable syntax (and are in the base language, not an extension). Besides, if we will use the [@@unboxed] annotatio= n, or visitor will have the same representation as a function, e.g.,

type 'r visitor =3D {vis=
it : 'a. 'r -> 'a term -> 'r} [@@unbo=
xed]
let count x =
_ =3D x + 1
let counter =3D {visit=3Dcount}

and

# Core_kernel.=
phys_same count counter;;
- : bool =3D true

Concerning rank-n polymorphism, in OCaml is is achieved using functors. Yes, they are a little bit syntactically heavy and force us to write signatures, but this is necessary anyway as rank-n is undecidable (non-inferrable). Finally, as a real-world example [1] of rank-2 polymorphism consider the universal WAVL tree that is a binary tree with each element having a different type (aka heterogeneous map). We use it in BAP as a backing store. You might find a few tricks there, especially using continuation-passing in the recursive cases.

Cheers, Ivan

[1]: https://github.com/BinaryAnalysisPlatform/bap/blob/b40689e636607b977758af0= 48b79d65684ce48c3/lib/knowledge/bap_knowledge.ml#L847-L1693

Malcolm Matalka asked and Ivan Gotovchits replied

Why is type checking creating a record different than type checking a function argument?

If we had the syntax (or something like it):

let map2 : ('a. 'a -> 'a) -> ('b * 'c) -> ('b * 'c)

Why would the type checker not be able to see that

map2 good_id ("hi", 42)

is valid but

map2 (fine_id ()) ("hi", 32)

is not, using the same logic that is verifying creating the "id" record is not valid?

I believe it is possible, as it is possible in Haskell (with RankNTypes and ScopedTypeVariables). The main (theoretical) difference is that in OCaml we need to check whether an expression is expansive and use a specialized generalization in case if it is (for the relaxed value restriction). It will, however, complicate the type inference engine a lot, but most importantly, changing the typing rule of functions will have a tremendous impact on the language. So this would be a very impractical solution. Especially, since we don't have the mechanism of language extensions, enabling RankNTypes will make a lot of programs untypeable, as they will now require type annotations (recall that RankN is undecidable in general). It could probably be implemented as a compiler command line parameter, like -rectypes but this will be still quite impractical since more = often code like fun f -> f 1, f true is a programmer error, rather tha= n a true request for universal polymorphism (the same as with rectypes, recursive types a more often an error rather than a deliberate attempt). Therefore, enabling RankN(^1) polymorphism will type too many programs (not that it is unsound, just many programs won't have sense) at the cost of even more obscure type errors. On the other hand, we have three syntactic constructs that let us express non-prenex polymorphism of the necessary rank(^2) without breaking anything else. So it looks like a good deal - we can have rankN polymorphism and decidable type checker at the same time. Just think of polymorphic records/methods as an embedded DSL for rankN polymorphism.

=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D Footnotes:

  1. An important point, that I forgot to notice, is that enabling scoped

type variables, will inevitably enable rankN polymorphism, e.g., since now any type could be a polytype, then suppose we have type 'a. ('b.'b -&= gt; 'a) -> 'a could be instantiated to 'a =3D 'd. ('c. -> 'd) -> '= d, so that our type is now 'd. ('b. 'b -> ('c. 'c -> 'd) -> 'd) -> ('c. = 'c -> 'd) -> 'd which is now rank3. Therefore, enabling arbitrary quantification in the arrow type will lead to rankN and immediately make undecidable most of the type checker.

  1. We can craft arbitrary rank using records with universally quantified

type variables, e.g., here is an example of rank3 polymorphism:

type 'a rank1 =3D {f1 : =
's. 's -> 'a}
type 'a rank2 =3D {f2 : 'r. 'r -> 'a rank1}

Indeed, f2 has type 'a.('r. 'r -> ('s. 's -> 'a)

OCamlPro's opam cheat sheet, with a new theme!

Thomas Blanc announced

The opam cheat-sheet is now published in its final form.

You can get the colored and black-and-white versions from = our website.

Happy hacking!

OCaml 4.10.0, first beta

octachron announced

The release of OCaml 4.10.0 is approaching. We have published a first beta version to help you adapt your software to the new features ahead of the release.

During our preliminary tests for this new beta, we discovered that the rece= nt work towards a multicore-ready OCaml runtime introduced compatibility issues within some opam packages, that were tweaking the runtime internals. Most of those opam packages have been fixed, or will be soon. Nevertheless, if you are affected by such compatibility issue, please speak= up.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.10.0+beta1.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.10/ocaml-4.10.0+beta1.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands.

opam switch create ocaml-variants.4.10.0+beta1=
 --repositories=3Ddefault,beta=3Dgit=
+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.10.0+beta1=
+<VARIANT> --repositories=3Ddefault,b=
eta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace <VARIANT> with one of these:

  • afl
  • flambda
  • fp
  • fp+flambda

We want to know about all bugs. Please report them here:

https://github.com/ocaml/= ocaml/issues

Happy hacking.

Kate added

For the people wanting to give OCaml 4.10.0beta1 a shot, here is an opam ov= erlay which adds fixes to major packages for them to work with this beta: <= a href=3D"https://github.com/kit-ty-kate/opam-alpha-repository">https://git= hub.com/kit-ty-kate/opam-alpha-repository

To use it, simple call:

$ opam switch 4.10
$ opam repository add alpha git://github.com/kit-ty-kate/opam-alpha-reposit=
ory.git

Obviously, this repository should not be used in production and probably co= ntains a few bugs, but at least it allows everyone to have almost as many p= ackages available as with OCaml 4.09. Only 60ish packages are still not ava= ilable, but apart from the notable exception of merlin all the= essential packages and dependencies are there.

This work has been part of the release-readyness effort founded by the OCam= l Software Foundation as announced here: https://discuss.ocaml.org/t= /ann-the-ocaml-software-foundation/4476/13

The rest of the effort is going to be put towards having merlin available for OCaml 4.10 and upstreaming all the fixes from opam-alpha-re= pository (most of them have PRs associated already). I'm hopeful for them b= e all upstreamed and available before the stable release of OCaml 4.10.

Data engineer positions at Elastic, US/Canada/Western Europe (= proximate to NA timezones)

Hezekiah Carty announced

Our team here at Elastic has positi= ons open for a few security data engineers (aka wranglers of data and all t= he systems involved). We are a distributed company so you don't have to be= close to an office to be considered. Infosec industry experience is not required, though of course welcome. We're = surrounded by experts in the field so you'll have lots of opportunities to = learn as you go!

The official postings are available here (both have the same text and only = differ in title/seniority):

Language-wise, OCaml/Reason makes up most of the code you=E2=80=99ll be wor= king on. Python makes up most of the rest, in particular taking advantage o= f the machine learning and natural language processing goodies that ecosyst= em provides. Most of the tools and service we develop are internally focuse= d, supporting security research and improvements to security protections fo= r our users. For those so-inclined, there are lots of opportunities to pres= ent at and attend conferences, present work in blog posts, contribute to op= en source software projects and otherwise engage the community.

The positions are very similar to our last hiring announcement, though we had a different name at that = point!

Please reach out to me if you have any questions. I=E2=80=99m available on = the OCaml or Reason Discord servers or by email at hezekiah.carty@elastic.c= o.

Release of naboris 0.1.0 a simple http server

Shawn McGinty announced

https://github.com/sha= wn-mcginty/naboris

I could use input on the API and the documentation. Working on trying to i= mprove both at the moment.

The goal was to create a very simple library for building RESTful type of w= eb servers. Make it very easy to manage h= andle request/response lifecycle and sessions.

In my opinion this type of web server is a great entry point for new develo= pers looking to explore the OCaml/Reason world.

Recently I have fallen in love with OCaml and Reason, and as a mostly web c= entered developer I've found this area quite lacking. I'm still new to the= language and eco system so any guidance would be highly appreciated!

Yawar Amin replied

Wow! It seems we had much the same idea=E2=80=93OCaml/Reason more accessibl= e to web developers new to the ecosystem :-D I've been working on something= very similar: https://git= hub.com/yawaramin/re-web/

Ulrik Strid said

There is also opium https://= github.com/rgrinberg/opium

And morph https://gi= thub.com/reason-native-web/morph that has similar goals.

It would be nice if we could either create a shared core that all could bui= ld from or collaborate on one.

esy@0.6.0 release

Andrey Popp announced

We've just released a new version of esy. You can install it with npm:

$ npm install -g esy@0.6.0

esy is a package.json driven workflow for na= tive development with Reason/OCaml (and even C/C++). It provides per-projec= t build environments which are isolated from each other but share underlyin= g build caches so creating new environments is cheap.

While 0.6.0 is mainly about "quality-of-life" improvements it also got few = new features including a basic support for garbage collection of unused bui= ld artifacts.

For more info see a b= log post by @prometheansacrifice which highlights important updates in = 0.6.0.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0254E7F30F for ; Tue, 21 Jan 2020 15:08:46 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=yGNW=3K=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ACl0tEhVXm618RW1l+8nZl0W7te7V8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYZRWBtKdThVPEFb/W9+hDw7KP9fy5BSpZsd3c4DhCKMUKC0Zez5?= =?us-ascii?q?1O3kQJO42sMQXDNvnkbig3ToxpdWRO2DWFC3VTA9v0fFbIo3e/vnY4ExT7Mhdp?= =?us-ascii?q?dKyuQtaBx8u42Pqv9JLNfg5GmCSyYa9oLBWxsA7dqtQajZFtJ6osxRbFuGZEdu?= =?us-ascii?q?dZyW5oJl+YghLw6tut8JJ5/Clcpvws+9RcXanmeqgzUKBVAikhP20p/sPgqAPN?= =?us-ascii?q?TRGI5nsSU2UWlgRHDg3Y5xzkXZn/rzX3uPNl1CaVIcP5Q7Y0WS+/76hwUx/nlD?= =?us-ascii?q?0HNz8i/27JjMF7kb9Wrwigpxx7xI7UfZ2VOf9jda7TYd8WWWxMVdtRWyJCBIO8?= =?us-ascii?q?cYoPD/EAPelDq4nyuUYFrBW5BQm2Gezv0SJDinv40KEm1ugsFxzN0g49ENIUqH?= =?us-ascii?q?narMv7OrocX+62w6bH0S7OYOlK1Trn8oXEbgwtrPOKULltccTR004vFwbdg1iM?= =?us-ascii?q?rYzqJTWV3fkQvWeH7+pgUOOvi3I7qwpspTWg3MMshZPPho4P0VDL6SV5wIM0Jd?= =?us-ascii?q?2kVE52esakEJxUtyCaK4t5XN8tQ2FuuCY7070GpIC0cDINyJQ9yB7ScvqKeJWG?= =?us-ascii?q?7BLkUeaeOzZ4hHR9dbK4mxm9602gyunmWsmzylZKoTJJksHSuXAR1hzT9taISu?= =?us-ascii?q?N6/kek3DaAyRrf6udaLkAojabbJJ8hwqI0lpUJqkvPBDP5mELzjKOOd0Uk/PKo?= =?us-ascii?q?6+X9bbn8qJ+cLZd4ig7/MqQymsy/HP83PhISUGic/OSwzLvj8lP+QLpWj/02jq?= =?us-ascii?q?jZv47BJcgBoa65GQBV3p4i6xmiDzam1NAYkWMALFJfdxKKiZXiNVLWIP3gEPuz?= =?us-ascii?q?nVChnC12y/zaMbDtGJvAImTZnLrvcrtx81NQxQQuwdxF+Z5ZCr4MLOjuVkPtrt?= =?us-ascii?q?DUEx00PxCyzu36EttyzJkeVniKAqKBMKPdr1uI5uU3LumJa44ZpSzxK+Ai5/7q?= =?us-ascii?q?jX45hUEScrWp3ZsRaXC4B+lmLFuDbXrrmNcBHn8Gvgs4TOP0lF2PSSNfa2i2Uq?= =?us-ascii?q?4m+z03FI2rAZ3NS4yxmrCM0ii2EoVTZm9cC1CMFXnod5+DW/cJcC+cP9NvnCEY?= =?us-ascii?q?WbW5S44v1Amguw/ixrdpK+TZ4jUYtZXn1Nl1++3ciw099TxyD8ScymGNUn97kn?= =?us-ascii?q?kPRz8s06ByuVZyylOZ3qh+mfBYDsBc5/NMUgc7KZ7c0/d3BMv1WgLceNeGVEip?= =?us-ascii?q?Qs68DTE0Qd8wzMUCY0FnG9WtlhzDxTalA6cJl7yXA5w56r7T0GL0J8Z50nrG0K?= =?us-ascii?q?ghj0I6QsZULm2nhqt/9xDJCILTkkWZkbyqdaUG0yLX+meD1znGgEYNGgpvV++N?= =?us-ascii?q?CXQAYGPSstK/4E7eGfvmQ784NEEJgZqJNa1ibtzykU4ARfvyPNCYZHi+zSP4Dh?= =?us-ascii?q?+NwvaIbZH2U2QbxiTUTkYe10gY+nOeHQw/HTu65WXEBj1yHFbhZFOq/PQthmm8?= =?us-ascii?q?SxodywiMJ3Zq17+05gJd0fWYQvVVxbkEvSY9tx1sG1Ksw9/dC9yBvhdsOqJGbo?= =?us-ascii?q?Vusx98yWvFulklbdSbJKd4iwtFK10r7XOr7A1+D8B7qeZvtGkjlVsgMaWcwU9M?= =?us-ascii?q?fDOe3IntN/vQMGagpUn+OZ6T4UnX1ZOtwolK7f05r1v5uwTwSRgo9Ghh2NROlX?= =?us-ascii?q?7A9tPNFgVACMusAHZyzABzovThWgd4547Q0ic3Y6yk63na3NY4GOYuyhChZspS?= =?us-ascii?q?dqSeG12rHg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AoBQDqBCdehyIeaIFlFggBCxyDIIFwV?= =?us-ascii?q?TIqhBKJA4YVhR6FGpMZAQMBDBgBDgUBAgEBhFmBex0GAQUzEwIQAQEEAQEBAgE?= =?us-ascii?q?CAwQBEwEBAQoLCQgphT4MgjsMGYMGASEKZSMDFAcDAgQNARcBFAoXARIagwwBg?= =?us-ascii?q?nsFCpFom3aBMoQ1ARYBDglmgy6BPg0CE4EWhRuGUyYPgUw/gRGCFVBsgksOCwE?= =?us-ascii?q?BAQEBgUABAYMugl4EjWIDkD6RLweCPHcEhVtniSKFbYJHeIcSkCYhjj2BSYUfb?= =?us-ascii?q?oELhSONKoE/KoFmDAgzGjBDgmwJCVYNh1cBhByBPoMbO4U+AkAzAgEBgR4BAQU?= =?us-ascii?q?TCwGKF4IyAQE?= X-IPAS-Result: =?us-ascii?q?A0AoBQDqBCdehyIeaIFlFggBCxyDIIFwVTIqhBKJA4YVhR6?= =?us-ascii?q?FGpMZAQMBDBgBDgUBAgEBhFmBex0GAQUzEwIQAQEEAQEBAgECAwQBEwEBAQoLC?= =?us-ascii?q?QgphT4MgjsMGYMGASEKZSMDFAcDAgQNARcBFAoXARIagwwBgnsFCpFom3aBMoQ?= =?us-ascii?q?1ARYBDglmgy6BPg0CE4EWhRuGUyYPgUw/gRGCFVBsgksOCwEBAQEBgUABAYMug?= =?us-ascii?q?l4EjWIDkD6RLweCPHcEhVtniSKFbYJHeIcSkCYhjj2BSYUfboELhSONKoE/KoF?= =?us-ascii?q?mDAgzGjBDgmwJCVYNh1cBhByBPoMbO4U+AkAzAgEBgR4BAQUTCwGKF4IyAQE?= X-IronPort-AV: E=Sophos;i="5.70,346,1574118000"; d="scan'208,217";a="336552751" X-MGA-submission: =?us-ascii?q?MDFRGz7cJYBQQnP2WzZkvEPEdiQJQnU21xsY5+?= =?us-ascii?q?OvpI43gGU3mIDeE0VX+lNROyipc0E1SQYUWwQxw+JV9x34beSA/fg9AW?= =?us-ascii?q?W7UtFwy9sUN/lTxwixEANWjGrbOeOg1vJorJQ1C4ssYvGdBdIa3fIqEc?= =?us-ascii?q?gLJrjOkcojULIbYdT7XzEcug=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jan 2020 15:08:45 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2D21E5646CA; Tue, 21 Jan 2020 15:08:43 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 21 Jan 2020 15:08:42 +0100 Message-ID: <87eevsdhqt.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 21 15:08:43 2020 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=83B985646CC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgSmFudWFyeSAxNCB0byAyMSwNCjIwMjAuDQoN ClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSG93IGRvZXMgdGhlIGNv bXBpbGVyIGNoZWNrIGZvciBleGhhdXN0aXZlIHBhdHRlcm4gbWF0Y2hpbmc/ DQpyZXN0byAwLjIgcmVsZWFzZWQNCm9wYW0gMi4wLjYgcmVsZWFzZQ0Kc291 cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhU TUwgcmV3cml0aW5nDQpTcGluOiBQcm9qZWN0IHNjYWZmb2xkaW5nIHRvb2wg YW5kIHNldCBvZiB0ZW1wbGF0ZXMgZm9yIFJlYXNvbiBhbmQgT0NhbWwNCk9s ZCBDV04NCg0KDQpIb3cgZG9lcyB0aGUgY29tcGlsZXIgY2hlY2sgZm9yIGV4 aGF1c3RpdmUgcGF0dGVybiBtYXRjaGluZz8NCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93LWRvZXMtdGhlLWNv bXBpbGVyLWNoZWNrLWZvci1leGhhdXN0aXZlLXBhdHRlcm4tbWF0Y2hpbmcv NTAxMy8xPg0KDQoNCkR5bGFuIElybGJlY2sgYXNrZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEhpIGFsbC4gSSdtIHJlbGF0aXZlbHkgbmV3IHRvIE9DYW1sLCBh bmQgSSB3YXMgY3VyaW91cyBvbiBob3cgdGhlDQogIGNvbXBpbGVyIGlzIGFi bGUgdG8gZ2l2ZSBhIHdhcm5pbmcgd2hlbiBhIGNhc2UgbGlzdCBpcyBub24t ZXhoYXVzdGl2ZQ0KICAtIGJvdGggZnJvbSBhIGhpZ2gtbGV2ZWwgYW5kLCBp ZiBwb3NzaWJsZSwgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMNCiAgY2hl Y2suIEkgaGF2ZSBzb21lIGlkZWFzIGFib3V0IGhvdyBvbmUgY291bGQgZG8g dGhpcywgYnV0IG5vbmUgb2YgbXkNCiAgaWRlYXMgc2VlbSBsaWtlIHRoZXkn ZCBiZSBuZWFybHkgYXMgZWZmaWNpZW50IGFzIHRoZSBPQ2FtbCBjb21waWxl cg0KICBpcy4NCg0KDQpnYXNjaGUgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIGNhbm9uaWNh bCByZWZlcmVuY2UgZm9yIGV4aGF1c3Rpdml0eS1jaGVja2luZyBpbiBPQ2Ft bCBpcyB0aGUNCiAgc2NpZW50aWZpYyBwdWJsaWNhdGlvbg0KDQogICAgICAg IFtXYXJuaW5ncyBmb3IgcGF0dGVybiBtYXRjaGluZ10gTHVjIE1hcmFuZ2V0 IDIwMDcNCg0KICBUaGUgZ2VuZXJhbCBpZGVhIGlzIHRvIGNvbnNpZGVyIGFs bCB0aGUgcGF0dGVybnMgb2YgYSBnaXZlbg0KICBwYXR0ZXJuLW1hdGNoaW5n IGF0IG9uY2UsIGdlbmVyYWxpemUgdGhpcyBzdHJ1Y3R1cmUgdG8gYSAibWF0 cml4IiBvZg0KICBwYXR0ZXJucyAobWF0Y2hpbmcgb24gc2V2ZXJhbCB2YWx1 ZXMgaW4gcGFyYWxsZWwpLCBhbmQgZGV2aXNlIGFuDQogIGFsZ29yaXRobSB0 byAiZXhwbG9yZSIgdGhlc2UgcGF0dGVybiBtYXRyaWNlcyBpbiBzdWNoIGEg d2F5IHRoYXQgeW91DQogIGV2ZW50dWFsbHkgdGVsbCBpZiBhIGdpdmVuIHBh dHRlcm4tbWF0cml4IGlzIGV4aGF1c3RpdmUsIG9yIGNhbg0KICBwcm9wb3Nl IGEgY291bnRlci1leGFtcGxlLg0KDQogIChJIGd1ZXNzIHdlIHNob3VsZCB3 cml0ZSBhIGhpZ2gtbGV2ZWwvYWNjZXNzaWJsZSBibG9nIHBvc3QgYWJvdXQN CiAgdGhpcy4pDQoNCg0KW1dhcm5pbmdzIGZvciBwYXR0ZXJuIG1hdGNoaW5n XQ0KPGh0dHA6Ly9tb3Njb3ZhLmlucmlhLmZyL35tYXJhbmdldC9wYXBlcnMv d2Fybi9pbmRleC5odG1sPg0KDQoNCnJlc3RvIDAuMiByZWxlYXNlZA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tcmVzdG8tMC0yLXJlbGVhc2VkLzUwMjgvMT4NCg0KDQpSYXBo YcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBPbiBiZWhhbGYgb24gTm9tYWRpYyBMYWJzLCBJJ20gaGFw cHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgdmVyc2lvbiAwLjIg b2YgYHJlc3RvJywgYSBsaWJyYXJ5IHRvIGNyZWF0ZSB0eXBlLXNhZmUgSFRU UC9KU09ODQogIHNlcnZpY2VzLg0KDQogIFRoZSBsaWJyYXJ5IGlzIGF2YWls YWJsZSB0aHJvdWdoIG9wYW0gKGBvcGFtIGluc3RhbGwgcmVzdG8nKSwNCiAg ZGlzdHJpYnV0ZWQgdW5kZXIgTEdQTCwgYW5kIGhvc3RlZCBvbg0KICA8aHR0 cHM6Ly9naXRsYWIuY29tL25vbWFkaWMtbGFicy9yZXN0bz4uDQoNCiAgYHJl c3RvJyB3YXMgcHJldmlvdXNseSByZWxlYXNlZCBhcyBgb2NwbGliLXJlc3Rv JyBtYWludGFpbmVkIGJ5DQogIE9DYW1sUHJvLiBUaGUgcHJvamVjdCBpcyBu b3cgbWFpbnRhaW5lZCBieSBOb21hZGljIExhYnMuDQoNCiAgQWxvbmcgd2l0 aCBtYW55IGJ1Z2ZpeGVzIGFuZCBhIGZldyBhZGRlZCBmZWF0dXJlcywgdGhl IG1haW4gY2hhbmdlIG9mDQogIHRoaXMgcmVsZWFzZSBpcyB0aGF0IHRoZSBs aWJyYXJ5IGlzIHNwbGl0IGludG8gbXVsdGlwbGUgcGFja2FnZXMgd2l0aA0K ICBmaW5lLWdyYWluZWQgZGVwZW5kZW5jaWVzLg0KDQoNCm9wYW0gMi4wLjYg cmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS0yLTAtNi1yZWxlYXNlLzUwMzgv MT4NCg0KDQpSLiBCb3VqYmVsIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2UgYXJlIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIG1pbm9yIHJl bGVhc2Ugb2YgW29wYW0gMi4wLjZdLg0KDQogIFRoaXMgbmV3IHZlcnNpb24g Y29udGFpbnMgbWFpbmx5IGJ1aWxkIHVwZGF0ZSAmIGZpeGVzLiBZb3UgY2Fu IGZpbmQNCiAgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGlzIFtibG9nIHBvc3Rd Lg0KDQogIF9vcGFtIGlzIGEgc291cmNlLWJhc2VkIHBhY2thZ2UgbWFuYWdl ciBmb3IgT0NhbWwuIEl0IHN1cHBvcnRzDQogIG11bHRpcGxlIHNpbXVsdGFu ZW91cyBjb21waWxlciBpbnN0YWxsYXRpb25zLCBmbGV4aWJsZSBwYWNrYWdl DQogIGNvbnN0cmFpbnRzLCBhbmQgYSBHaXQtZnJpZW5kbHkgZGV2ZWxvcG1l bnQgd29ya2Zsb3cuXw0KDQoNCltvcGFtIDIuMC42XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29wYW0vcmVsZWFzZXMvdGFnLzIuMC42Pg0KDQpbYmxv ZyBwb3N0XSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0w LTY+DQoNCg0Kc291cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9y IGJhc2VkIG9uIEhUTUwgcmV3cml0aW5nDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zb3VwYXVsdC1hLXN0 YXRpYy13ZWJzaXRlLWdlbmVyYXRvci1iYXNlZC1vbi1odG1sLXJld3JpdGlu Zy80MTI2LzExPg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgc291cGF1bHQgMS44LjAg aXMgW3JlbGVhc2VkXSBhbG9uZyB3aXRoIEx1YS1NTCAwLjkuMS4NCg0KICBM dWEtTUwgbm93IHJhaXNlcyBgRmFpbHVyZScgd2hlbiBMdWEgY29kZSBleGVj dXRpb24gZmFpbHMuIFRoZXJlJ3MNCiAgbXVjaCByb29tIGZvciBpbXByb3Zl bWVudCBpbiB0aGF0IGFyZWEsIGZvciBub3cgSSd2ZSBqdXN0IGRvbmUNCiAg c29tZXRoaW5nIHRoYXQgaXMgYmV0dGVyIHRoYW4ganVzdCBkaXNwbGF5aW5n IGVycm9ycyBvbiBzdGRlcnIgYnV0DQogIG90aGVyd2lzZSBhbGxvd2luZyBz eW50YXggYW5kIHJ1bnRpbWUgZXJyb3JzIHBhc3Mgc2lsZW50bHkuDQoNCiAg SWYgeW91IGhhdmUgYW55IGlkZWFzIGhvdyBwZXJmZWN0IGludGVycHJldGVy IGVycm9yIHJlcG9ydGluZyBfc2hvdWxkXw0KICB3b3JrLCBwbGVhc2Ugc2hh cmUhDQoNCiAgQXMgb2YgaW1wcm92ZW1lbnRzIGluIHNvdXBhdWx0IGl0c2Vs ZiwgdGhlcmUncyBub3c6DQogIOKAoiBBIHdheSBmb3IgcGx1Z2lucyB0byBz cGVjaWZ5IHRoZWlyIG1pbmltdW0gc3VwcG9ydGVkIHNvdXBhdWx0DQogICAg dmVyc2lvbiBsaWtlIGBQbHVnaW4ucmVxdWlyZV92ZXJzaW9uKCIxLjguMCIp Jw0KICDigKIgYFRBUkdFVF9ESVInIGVudmlyb25tZW50IHZhcmlhYmxlIGFu ZCBgdGFyZ2V0X2RpcicgTHVhIGdsb2JhbCB0aGF0DQogICAgY29udGFpbnMg dGhlIGRpcmVjdG9yeSB3aGVyZSB0aGUgcmVuZGVyZWQgcGFnZSB3aWxsIGJl IHdyaXR0ZW4sIHRvDQogICAgbWFrZSBpdCBlYXNpZXIgZm9yIHBsdWdpbnMv c2NyaXB0cyB0byBwbGFjZSBwcm9jZXNzZWQgYXNzZXRzDQogICAgdG9nZXRo ZXIgd2l0aCBwYWdlcy4NCiAg4oCiICJCdWlsZCBwcm9maWxlcyI6IGlmIHlv dSBhZGQgYHByb2ZpbGUgPSAicHJvZHVjdGlvbiInIG9yIHNpbWlsYXIgdG8N CiAgICB3aWRnZXQgY29uZmlnLCB0aGF0IHdpZGdldCB3aWxsIGJlIGlnbm9y ZWQgdW5sZXNzIHlvdSBydW4gYHNvdXBhdWx0DQogICAgLS1wcm9maWxlIHBy b2R1Y3Rpb24nLg0KICDigKIgQSBidW5jaCBvZiBuZXcgdXRpbGl0eSBmdW5j dGlvbnMgZm9yIHBsdWdpbnMuDQoNCg0KW3JlbGVhc2VkXSA8aHR0cHM6Ly9z b3VwYXVsdC5uZW9jaXRpZXMub3JnL2Jsb2cvc291cGF1bHQtMS44LjAtcmVs ZWFzZS8+DQoNCg0KU3BpbjogUHJvamVjdCBzY2FmZm9sZGluZyB0b29sIGFu ZCBzZXQgb2YgdGVtcGxhdGVzIGZvciBSZWFzb24gYW5kIE9DYW1sDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NwaW4tcHJvamVj dC1zY2FmZm9sZGluZy10b29sLWFuZC1zZXQtb2YtdGVtcGxhdGVzLWZvci1y ZWFzb24tYW5kLW9jYW1sLzUwNDcvMT4NCg0KDQpNb2hhbWVkIEVsc2hhcm5v dWJ5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlv L3NwaW4+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5k IG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1Mg ZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdp c2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoN Cg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cDovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUg YXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3 bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xp c3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8 aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 14 to 21, 202= 0.

How does the compiler check for exhaustive pattern matching?

Dylan Irlbeck asked

Hi all. I'm relatively new to OCaml, and I was curious on how the compiler = is able to give a warning when a case list is non-exhaustive - both from a high-level and, if possible, the implementation of this check. I have some = ideas about how one could do this, but none of my ideas seem like they'd be nearl= y as efficient as the OCaml compiler is.

gasche replied

The canonical reference for exhaustivity-checking in OCaml is the scientifi= c publication

Warnin= gs for pattern matching Luc Maranget 2007

The general idea is to consider all the patterns of a given pattern-matchin= g at once, generalize this structure to a "matrix" of patterns (matching on seve= ral values in parallel), and devise an algorithm to "explore" these pattern mat= rices in such a way that you eventually tell if a given pattern-matrix is exhaust= ive, or can propose a counter-example.

(I guess we should write a high-level/accessible blog post about this.)

resto 0.2 released

Rapha=C3=ABl Proust announced

On behalf on Nomadic Labs, I'm happy to announce the release of version 0.2= of resto, a library to create type-safe HTTP/JSON services.

The library is available through opam (opam install resto), di= stributed under LGPL, and hosted on https://gitlab.com/nomadic-labs/resto.

resto was previously released as ocplib-resto mai= ntained by OCamlPro. The project is now maintained by Nomadic Labs.

Along with many bugfixes and a few added features, the main change of this = release is that the library is split into multiple packages with fine-grain= ed dependencies.

opam 2.0.6 release

R. Boujbel announced

We are pleased to announce the minor release of opam 2.0.6.

This new version contains mainly build update & fixes. You can find mor= e information in this bl= og post.

opam is a source-based package manager for OCaml.= It supports multiple simultaneous compiler installations, flexible package= constraints, and a Git-friendly development workflow.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

soupault 1.8.0 is released along with Lua-ML 0.9.1.

Lua-ML now raises Failure when Lua code execution fails. There= 's much room for improvement in that area, for now I've just done something= that is better than just displaying errors on stderr but otherwise allowin= g syntax and runtime errors pass silently.

If you have any ideas how perfect interpreter error reporting should work, please share!

As of improvements in soupault itself, there's now:

  • A way for plugins to specify their minimum supported soupault version l= ike Plugin.require_version("1.8.0")
  • TARGET_DIR environment variable and target_dir Lua global that contains the directory where the rendered page will be wr= itten, to make it easier for plugins/scripts to place processed assets toge= ther with pages.
  • "Build profiles": if you add profile =3D "production" or s= imilar to widget config, that widget will be ignored unless you run s= oupault --profile production.
  • A bunch of new utility functions for plugins.

Spin: Project scaffolding tool and set of templates for Reason= and OCaml

Mohamed Elsharnouby announced

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id ED7F07F345 for ; Tue, 28 Jan 2020 11:54:00 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,373,1574118000"; d="scan'208,217";a="337256901" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 28 Jan 2020 11:53:59 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 28 Jan 2020 11:53:58 +0100 Message-ID: <877e1brgvt.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgSmFudWFyeSAyMSB0byAyOCwNCjIwMjAuDQoN ClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTmV3IHJlbGVhc2Ugb2Yg TWVuaGlyICgyMDIwMDEyMykNCk9jYW1sIGNyb3NzIGNvbXBpbGVyPw0KVHdv IG1hc3RlciBpbnRlcm5zaGlwIHByb3Bvc2FscyB0byBleHBsb3JlIHNvY2lh bCBhbmQgdGVjaG5pY2FsIGFzcGVjdHMgb2YgdGhlIGNyZWF0aW9uIG9mIHRo ZSBPQ2FtbCBhbmQgQ29xIHBsYXRmb3Jtcw0KUHJvcGVyIHdheSB0byBhbGxv Y2F0ZSBhbiBPQ2FtbCBzdHJpbmcgZnJvbSBDIGNvZGUgaW4gT0NhbWwgNC4x MD8NCk9DYW1sIDQuMTAuMCwgc2Vjb25kIGJldGENCk9sZCBDV04NCg0KDQpO ZXcgcmVsZWFzZSBvZiBNZW5oaXIgKDIwMjAwMTIzKQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJj L2NhbWwtbGlzdC8yMDIwLTAxL21zZzAwMDQwLmh0bWw+DQoNCg0KRnJhbsOn b2lzIFBvdHRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJdCBpcyBteSBwbGVhc3VyZSB0byBhbm5vdW5j ZSBhIG5ldyByZWxlYXNlIG9mIE1lbmhpciwgdGhlIExSKDEpDQogIHBhcnNl ciBnZW5lcmF0b3IuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFt IHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxsIG1lbmhpcg0KICDilIIgb3Bh bSBpbnN0YWxsIGNvcS1tZW5oaXJsaWIgIyBpZiB5b3Ugd2lzaCB0byB1c2Ug bWVuaGlyIC0tY29xDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZXJlIGFy ZSBubyBuZXcgZmVhdHVyZXMsIG9ubHkgYSBzaWduaWZpY2FudCBjaGFuZ2Ug aW4gdGhlIG1hbm5lciBpbg0KICB3aGljaCBNZW5oaXIgaXMgYnVpbHQ6DQoN CiAg4oCiIE1lbmhpciBpcyBub3cgYnVpbHQgYW5kIGluc3RhbGxlZCBieSBk dW5lLiBUaGlzIHNob3VsZCBtYWtlIGxpZmUNCiAgICBlYXNpZXIgZm9yIE1l bmhpcidzIGRldmVsb3BlcnM6IGluIHBhcnRpY3VsYXIsIGBtYWtlIHRlc3Qn IGFuZCBgbWFrZQ0KICAgIHNwZWVkJyBjYW4gYmUgcnVuIHN0cmFpZ2h0IGF3 YXkgYW5kIGRvIG5vdCByZXF1aXJpbmcgaW5zdGFsbGluZw0KICAgIE1lbmhp ciBmaXJzdC4gVGhpcyBzaG91bGQgYWxzbyBtYWtlIGNvbXBpbGF0aW9uIG11 Y2ggZmFzdGVyIG9uDQogICAgbXVsdGktY29yZSBtYWNoaW5lcy4gKENvbnRy aWJ1dGVkIGJ5IE5pY29sw6FzIE9qZWRhIELDpHIsIHRvIHdob20gbWFueQ0K ICAgIHRoYW5rcyBhcmUgZHVlLikNCg0KICDigKIgVGhlcmUgdXNlZCB0byBi ZSBhIGRpc3RpbmN0aW9uIGJldHdlZW4gdHdvIHNsaWdodGx5IGRpZmZlcmVu dCB3YXlzDQogICAgb2YgaW5zdGFsbGluZyBNZW5oaXIsIG5hbWVseSB3aXRo IGFuZCB3aXRob3V0IGBvY2FtbGZpbmQnLiBUaGlzDQogICAgZGlzdGluY3Rp b24gZGlzYXBwZWFycy4gVGhlIGNvbW1hbmQgbGluZSBzd2l0Y2gNCiAgICBg LS1zdWdnZXN0LW9jYW1sZmluZCcgaXMgZGVwcmVjYXRlZCBhbmQgY2F1c2Vz IE1lbmhpciB0byBwcmludA0KICAgIGBmYWxzZScuDQoNCiAgV2UgaG9wZSB0 aGF0IHRoZXNlIGNoYW5nZXMgZG8gbm90IGJyZWFrIGFueSBvZiB0aGUgY29k ZSB0aGF0IHJlbGllcyBvbg0KICBNZW5oaXIgdG9kYXkuIFBsZWFzZSByZXBv cnQgYW55IHByb2JsZW1zIHRoYXQgeW91IG1pZ2h0DQogIGVuY291bnRlci4g SGFwcHkgaGFja2luZyENCg0KDQpPY2FtbCBjcm9zcyBjb21waWxlcj8NCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvb2NhbWwtY3Jvc3MtY29tcGlsZXIvMTQ5NC83Pg0K DQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIERtaXRyeSBQb255YXRvdiBhc2tl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V2hhdCBhYm91dCBlbWJlZGRlZCB0YXJnZXRzIGxpa2UgQ29ydGV4LU0gKFNU TTMyRjMvRjQpPyAgSG93IG11Y2gNCiAgbWVtb3J5IHNob3VsZCBpdCBoYXZl IHRvIGhhdmUgdG8gcnVuIE9DYW1sLWNvbXBpbGVkIHByb2dyYW1zPw0KDQoN Ckl2YW4gR290b3ZjaGl0cyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBZb3UgbWF5IGZpbmQgdGhpcyBbcGFnZV0gaW50ZXJlc3Rp bmcuIFRvIHN1bW1hcml6ZSwgd2l0aCBfYSBsb3Qgb2YNCiAgd29ya18geW91 IGNhbiBtYWtlIGEgc3Vic2V0IG9mIE9DYW1sIHByb2dyYW1zIHJ1bm5hYmxl IG9uIGENCiAgbWljcm9jb250cm9sbGVyLiBZb3Ugd2lsbCBhbHNvIG5lZWQg dG8gcmV3cml0ZSBPQ2FtbCdzIHJ1bnRpbWUgYW5kDQogIGRldmVsb3AgYSBu ZXcgR0MgZm9yIGl0Lg0KDQogIEluIHJlYWwgbGlmZSwgbm8sIHlvdSBjYW4n dCBydW4gT0NhbWwgb24gYSBtaWNyb2NvbnRyb2xsZXIuIFlvdSBuZWVkDQog IGF0IGxlYXN0IGEgY291cGxlIG9mIG1lZ2FieXRlcyBvZiBub3JtYWwgUkFN IHdpdGggTU1VLg0KDQoNCltwYWdlXSA8aHR0cDovL3d3dy5hbGdvLXByb2cu aW5mby9vY2FwaWMvd2ViL2luZGV4LnBocD9pZD1vY2FwaWM+DQoNCg0KSXZh biBHb3RvdmNoaXRzIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEhtbSwgZm91bmQgdGhpcyBbcHJvamVjdF0s IHRoYXQgaXMgYWxzbyBxdWl0ZSByZWxldmFudCB0byB5b3UsIGl0IGlzDQog IHF1aXRlIGFsaXZlLCBzbyBtYXliZSB5b3UgaGF2ZSBjaGFuY2VzIDopDQoN Cg0KW3Byb2plY3RdIDxodHRwczovL2dpdGh1Yi5jb20vc3RldmVudmFyL09N aWNyb0I+DQoNCg0KVHdvIG1hc3RlciBpbnRlcm5zaGlwIHByb3Bvc2FscyB0 byBleHBsb3JlIHNvY2lhbCBhbmQgdGVjaG5pY2FsIGFzcGVjdHMgb2YgdGhl IGNyZWF0aW9uIG9mIHRoZSBPQ2FtbCBhbmQgQ29xIHBsYXRmb3Jtcw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90d28tbWFz dGVyLWludGVybnNoaXAtcHJvcG9zYWxzLXRvLWV4cGxvcmUtc29jaWFsLWFu ZC10ZWNobmljYWwtYXNwZWN0cy1vZi10aGUtY3JlYXRpb24tb2YtdGhlLW9j YW1sLWFuZC1jb3EtcGxhdGZvcm1zLzUwNzMvMT4NCg0KDQpUaMOpbyBaaW1t ZXJtYW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgV2UgYXJlIGxvb2tpbmcgZm9yIGNhbmRpZGF0ZXMgZm9yIHRo ZSBmb2xsb3dpbmcgdHdvIGludGVybnNoaXBzDQogIGludGVuZGVkIHRvIHBy ZWZpZ3VyZSB0aGUgY3JlYXRpb24gb2YgdGhlIE9DYW1sIGFuZCBDb3EgcGxh dGZvcm1zOg0KICDigKIgYSBmaXJzdCBpbnRlcm5zaGlwIGlzIGZvY3VzZWQg b24gZXhwbG9yaW5nIHRlY2huaWNhbCBhc3BlY3RzOg0KICAgIDxodHRwczov L3d3dy5pcmlmLmZyL19tZWRpYS91c2Vycy90aGVvL2ludGVybnNoaXBfcHJv cG9zYWxfcGxhdGZvcm1fdGVjaC5wZGY+DQogIOKAoiBhIHNlY29uZCBpbnRl cm5zaGlwIGlzIGZvY3VzZWQgb24gZXhwbG9yaW5nIHNvY2lhbCBhbmQgcG9s aWN5DQogICAgYXNwZWN0czoNCiAgICA8aHR0cHM6Ly93d3cuaXJpZi5mci9f bWVkaWEvdXNlcnMvdGhlby9pbnRlcm5zaGlwX3Byb3Bvc2FsX3BsYXRmb3Jt X3NvY2lhbC5wZGY+DQoNCiAgUGxlYXNlIGZlZWwgZnJlZSB0byBmb3J3YXJk IHRoaXMgYW5ub3VuY2VtZW50LiAgSW50ZXJlc3RlZCBzdHVkZW50cw0KICBz aG91bGQgc2VuZCB0aGVpciByZXN1bWUgYW5kIGNvdmVyIGxldHRlciBhdA0K ICBbeXJnQGlyaWYuZnJdKDxtYWlsdG86eXJnQGlyaWYuZnI+KSBhbmQNCiAg W3RoZW9AaXJpZi5mcl0oPG1haWx0bzp0aGVvQGlyaWYuZnI+KS4NCg0KICBZ YW5uIFLDqWdpcy1HaWFuYXMgKElucmlhLCBJUklGLCBPQ2FtbCBGb3VuZGF0 aW9uKSBhbmQgVGjDqW8gWmltbWVybWFubg0KICAoSW5yaWEsIElSSUYsIENv cSBkZXZlbG9wbWVudCB0ZWFtKQ0KDQoNClByb3BlciB3YXkgdG8gYWxsb2Nh dGUgYW4gT0NhbWwgc3RyaW5nIGZyb20gQyBjb2RlIGluIE9DYW1sIDQuMTA/ DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3Byb3Blci13YXktdG8tYWxsb2NhdGUtYW4t b2NhbWwtc3RyaW5nLWZyb20tYy1jb2RlLWluLW9jYW1sLTQtMTAvNTA3NS8x Pg0KDQoNClJ3bWpvbmVzIGFza2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBQcmV2aW91c2x5IHRvIGFsbG9j YXRlIGEgc3RyaW5nIHdpdGggZXhwbGljaXQgbGVuZ3RoIChpZS4gIG9uZSB3 aGljaA0KICBtYXkgY29udGFpbiBcMCBjaGFyYWN0ZXJzKSBpbiBDIGNvZGUg d2UgaGF2ZSB1c2VkOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgc3Ry diA9IGNhbWxfYWxsb2Nfc3RyaW5nIChjb3VudCk7DQogIOKUgiBtZW1jcHkg KFN0cmluZ192YWwgKHN0cnYpLCBzdHIsIGNvdW50KTsNCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgSW4gT0NhbWwgNC4xMCB0aGlzIGRvZXNuJ3QgY29tcGls ZSBiZWNhdXNlIFN0cmluZ192YWwgcmV0dXJucyBhIGBjb25zdA0KICBjaGFy IConLg0KDQogIEkgY291bGQgY2hhbmdlIFN0cmluZ192YWwgdG8gQnl0ZXNf dmFsLCBidXQgdGhhdCBmZWVscyB3cm9uZy4gIFRoZQ0KICBydW50aW1lIHNl ZW1zIHRvIHVzZSBgJkJ5dGVfdSAoc3RydiwgMCknLg0KDQogIEl0J3MgYSBz aGFtZSB0aGVyZSdzIG5vdCBhIGNhbWxfY29weV9zdHJpbmdfbGVuIGZ1bmN0 aW9uLCBidXQgd2hhdCBpcw0KICB0aGUgcHJvcGVyIHdheSB0byBkbyB0aGlz IGZvciBPQ2FtbCA0LjEwKywgZXNwZWNpYWxseSBhIHdheSB0aGF0IHdvbid0 DQogIGJyZWFrIGluIGZ1dHVyZSBhbmQgd2lsbCBiZSBjb21wYXRpYmxlIHdp dGggbXVsdGljb3JlPw0KDQoNCnlhbGxvcCBzdWdnZXN0ZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFlvdSBjYW4gdXNlIFtgY2FtbF9hbGxvY19pbml0aWFsaXplZF9zdHJpbmcn XToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIENBTUxleHRlcm4gdmFs dWUgY2FtbF9hbGxvY19pbml0aWFsaXplZF9zdHJpbmcgKG1sc2l6ZV90IGxl biwgY29uc3QgY2hhciAqKTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW2Bj YW1sX2FsbG9jX2luaXRpYWxpemVkX3N0cmluZyddDQo8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2Jsb2IvZDQwOGU1OGVhMTVlYzg5MGEyYzZk OTg0NDFkMjYxZGI1MWE2NzM1ZC9ydW50aW1lL2NhbWwvYWxsb2MuaCNMMzh+ Pg0KDQoNCk9DYW1sIDQuMTAuMCwgc2Vjb25kIGJldGENCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMC0wLXNlY29uZC1iZXRhLzUw ODMvMT4NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBUaGUgcmVsZWFzZSBvZiBPQ2FtbCA0LjEwLjAgaXMgbmVhci4gV2Ug aGF2ZSByZWxlYXNlZCBhIHNlY29uZCBiZXRhDQogIHZlcnNpb24gdG8gaGVs cCB5b3UgYWRhcHQgeW91ciBzb2Z0d2FyZXMgYW5kIGxpYnJhcmllcyB0byB0 aGUgbmV3DQogIGZlYXR1cmVzIGFoZWFkIG9mIHRoZSByZWxlYXNlLg0KDQog IFRoaXMgbmV3IGJldGEgY29udGFpbnMgYW4gdXBkYXRlIHRvIHRoZSBpbnRl cm5hbCBydW50aW1lIEFQSSB0aGF0DQogIHNob3VsZCBtYWtlIGl0IGVhc2ll ciB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IGFjcm9zcyB2ZXJzaW9uIGZv cg0KICBleHBlcnQgdXNlcnM7IGFuZCBhIHNtYWxsIGZpeCBmb3IgdGhlIGFu YWx5c2lzIG9mIHJlY3Vyc2l2ZSB2YWx1ZXMuDQoNCiAgVGhlIHNvdXJjZSBj b2RlIGlzIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6DQoNCiAgPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTAuMCti ZXRhMi50YXIuZ3o+DQogIDxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rp c3RyaWIvb2NhbWwtNC4xMC9vY2FtbC00LjEwLjArYmV0YTIudGFyLmd6Pg0K DQogIFRoZSBjb21waWxlciBjYW4gYWxzbyBiZSBpbnN0YWxsZWQgYXMgYW4g T1BBTSBzd2l0Y2ggd2l0aCBvbmUgb2YgdGhlDQogIGZvbGxvd2luZyBjb21t YW5kcy4NCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBj cmVhdGUgb2NhbWwtdmFyaWFudHMuNC4xMC4wK2JldGExIC0tcmVwb3NpdG9y aWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSA DQogIG9yDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBzd2l0Y2gg Y3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTAuMCtiZXRhMSs8VkFSSUFOVD4g LS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTi lIDilIDilIDilIANCiAgd2hlcmUgeW91IHJlcGxhY2UgPFZBUklBTlQ+IHdp dGggb25lIG9mIHRoZXNlOg0KICDigKIgYWZsDQogIOKAoiBmbGFtYmRhDQog IOKAoiBmcA0KICDigKIgZnArZmxhbWJkYQ0KDQogIEZvciBhIGJldHRlciBl eHBlcmllbmNlLCB5b3UgY2FuIHVzZSB0aGUgb3BhbSBhbHBoYSByZXBvc2l0 b3J5DQogIHByb3ZpZGVkIGJ5Og0KICDilIzilIDilIDilIDilIANCiAg4pSC IG9wYW0gcmVwb3NpdG9yeSBhZGQgYWxwaGEgZ2l0Oi8vZ2l0aHViLmNvbS9r aXQtdHkta2F0ZS9vcGFtLWFscGhhLXJlcG9zaXRvcnkuZ2l0DQogIOKUlOKU gOKUgOKUgOKUgA0KICBUaGlzIHJlcG9zaXRvcnkgY29udGFpbnMgYSBoYW5k ZnVsIG9mIHRlbXBvcmFyeSBwYXRjaGVkIHBhY2thZ2VzLCB0aGF0DQogIHlv dSBjYW4gdXNlIHdoaWxlIHdhaXRpbmcgZm9yIHRoZSBwYWNrYWdlcyB0byBi ZSBwcm9wZXJseSBwYXRjaGVkLg0KICBUaGlzIHJlcG9zaXRvcnkgc2hvdWxk IG5vdCBiZSB1c2VkIGluIHByb2R1Y3Rpb24gYW5kIHlvdSBwcm9iYWJseSB3 YW50DQogIHRvIGluc3RhbGwgaXQgb25seSBmb3IgdGhlIGJldGEgc3dpdGNo Lg0KDQogIFdlIHdhbnQgdG8ga25vdyBhYm91dCBhbGwgYnVncy4gUGxlYXNl IHJlcG9ydCB0aGVtIGhlcmU6DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBp dCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0g b3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFs YW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZl XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1Mg ZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMu aWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxh biBTY2htaXR0XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 21 to 28, 202= 0.

New release of Menhir (20200123)

Fran=C3=A7ois Pottier announced

It is my pleasure to announce a new release of Menhir, the LR(1) parser generator.

opam update
opam install menhir
opam install coq-menhirlib # if you wish to use menhir --coq

There are no new features, only a significant change in the manner in which Menhir is built:

  • Menhir is now built and installed by dune. This should make life easier= for Menhir's developers: in particular, make test and m= ake speed can be run straight away and do not requiring installing M= enhir first. This should also make compilation much faster on multi-core ma= chines. (Contributed by Nicol=C3=A1s Ojeda B=C3=A4r, to whom many thanks ar= e due.)
  • There used to be a distinction between two slightly different ways of i= nstalling Menhir, namely with and without ocamlfind. This dist= inction disappears. The command line switch --suggest-ocamlfind is deprecated and causes Menhir to print false.

We hope that these changes do not break any of the code that relies on Menh= ir today. Please report any problems that you might encounter. Happy hacking!

Ocaml cross compiler?

Deep in this thread, Dmitry Ponyatov asked

What about embedded targets like Cortex-M (STM32F3/F4)? How much memory should it have to have to run OCaml-compiled programs?

Ivan Gotovchits replied

You may find this page interesting. To summarize, with a lot of work you can make a subset of OCaml programs runnable= on a microcontroller. You will also need to rewrite OCaml's runtime and de= velop a new GC for it.

In real life, no, you can't run OCaml on a microcontroller. You need at lea= st a couple of megabytes of normal RAM with MMU.

Two master internship proposals to explore social and technica= l aspects of the creation of the OCaml and Coq platforms

Th=C3=A9o Zimmermann announced

We are looking for candidates for the following two internships intended to= prefigure the creation of the OCaml and Coq platforms:

Please feel free to forward this announcement. Interested students should send their resume and cover letter at [yrg@irif.= fr](mailto:yrg@irif.fr) and [theo@irif.f= r](mailto:theo@irif.fr).

Yann R=C3=A9gis-Gianas (Inria, IRIF, OCaml Foundation) and Th=C3=A9o Zimmer= mann (Inria, IRIF, Coq development team)

Proper way to allocate an OCaml string from C code in OCaml 4.= 10?

Rwmjones asked

Previously to allocate a string with explicit length (ie. one which may co= ntain \0 characters) in C code we have used:

strv =3D caml_alloc_string (count);
memcpy (String_val (strv), str, c=
ount);

In OCaml 4.10 this doesn't compile because String_val returns a const= char *.

I could change String_val to Bytes_val, but that feels wrong. The runtime = seems to use &Byte_u (strv, 0).

It's a shame there's not a caml_copy_string_len function, but what is the p= roper way to do this for OCaml 4.10+, especially a way that won't break in = future and will be compatible with multicore?

yallop suggested

You can use caml_alloc_initia= lized_string:

CAMLextern value caml_alloc_initialized_string =
(mlsize_t len, const char *);

OCaml 4.10.0, second beta

octachron announced

The release of OCaml 4.10.0 is near. We have released a second beta version to help you adapt your softwares and libraries to the new features ahead of the release.

This new beta contains an update to the internal runtime API that should make it easier to maintain compatibility across version for expert users; and a small fix for the analysis of recursive values.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.10.0+beta2.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.10/ocaml-4.10.0+beta2.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands.

opam switch create ocaml-variants.4.10.0+beta1=
 --repositories=3Ddefault,beta=3Dgit=
+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.10.0+beta1=
+<VARIANT> --repositories=3Ddefault,b=
eta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace <VARIANT> with one of these:

  • afl
  • flambda
  • fp
  • fp+flambda

For a better experience, you can use the opam alpha repository provided by:

opam repository add alpha git://github.com/kit=
-ty-kate/opam-alpha-repository.git

This repository contains a handful of temporary patched packages, that you = can use while waiting for the packages to be properly patched. This repository should not be used in production and you probably want to i= nstall it only for the beta switch.

We want to know about all bugs. Please report them here:

https://github.com/ocaml/= ocaml/issues

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 38AF67EC77 for ; Tue, 4 Feb 2020 09:47:46 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,398,1574118000"; d="scan'208,217";a="434325706" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 04 Feb 2020 09:47:45 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 04 Feb 2020 09:47:45 +0100 Message-ID: <878sliivri.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 28 to February 04, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Multicore OCaml: January 2020 update Use Case for Ephemerons? `json-data-encoding' version 0.8 (was `ocplib-json-typed') Developer position at Abacus Medicine, Copenhagen Camlp5 version 7.11 release (4.10 compatibility) Old CWN Multicore OCaml: January 2020 update =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Welcome to the January 2020 news update from the Multicore OCaml team! We're going to summarise our activites monthly to highlight what we're working on throughout this year. This update has kindly been assembled by @shakthimaan and @kayceesrk. The most common question we get is how to contribute to the overall multicore effort. As I [noted last year], we are now in the process of steadily upstreaming our efforts to mainline OCaml. Therefore, the best way by far to contribute is to test for regressions or opportunities for improvements in the patches that are outstanding in the main OCaml repository. A secondary benefit would be to review the PRs in the [multicore repository], but those tend to be more difficult to evaluate externally as they are being spotted as a result of stress testing at the moment. A negative contribution would be to raise discussion of orthogonal features or new project management mechanisms =E2=80=93 this t= akes time and effort to reply to, and the team has a very full plate already now that the upstreaming has begun. We don't want to prevent those discussions from happening of course, but would appreciate if they were directed to the general OCaml bugtracker or another thread on this forum. We'll first go over the OCaml PRs and issues, then cover the multicore repository and our Sandmark benchmarking infrastructure. A new initiative to implement and test new parallel algorithms for Multicore OCaml is also underway. [noted last year] [multicore repository] OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml/ocaml#9082] Eventlog tracing system Eventlog is a proposal for a new tracing facility for OCaml runtime that provides metrics and counters, and uses the Binary Trace Format (CTF). The next step to get this merged is to incubate the tracing features in separate runtime variant, so it can be selected at application link time. =E2=80=A2 [ocaml/ocaml#8984] Towards a new closure representation A new layout for closures has been proposed for traversal by the garbage collector without the use of a page table. This is very much useful for Multicore OCaml and for performance improvements. The PR is awaiting review from other developers, and can then be rebased against trunk for testing and merge. =E2=80=A2 [ocaml-multicore/ocaml-multicore#187] Better Safe Points A patch to regularly poll for inter-domain interrupts to provide better safe points is actively being reviewed. This is to ensure that any pending interrupts are notified by the runtime system. =E2=80=A2 Work is underway on improving the marshaling (runtime/extern.c)= in upstream OCaml to avoid using GC mark bits to represent visitedness, and to use a hash table (addrmap) implementation. [ocaml/ocaml#9082] [ocaml/ocaml#8984] [ocaml-multicore/ocaml-multicore#187] =E2=97=8A Completed The following PRs have been merged to upstream OCaml trunk: =E2=80=A2 [ocaml/ocaml#8713] Move C global variables to a dedicated struc= ture This PR moves the C global variables to a "domain state" table. Every domain requires its own table of domain local variables, and hence this is required for Multicore runtime. This uncovered a number of [compatability issues] with the C header files, which were all included in the recent OCaml 4.10.0+beta2 release via the next item. =E2=80=A2 [ocaml/ocaml#9253] Move back `caml_*' to thematic headers The `caml_*' definitions from runtime/caml/compatibility.h have been moved to provide a compatible API for OCaml versions 4.04 to 4.10. This change is also useful for Multicore domains that have their own state. [ocaml/ocaml#8713] [compatability issues] [ocaml/ocaml#9253] Multicore OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The following PRs have been merged into the Multicore OCaml trees: =E2=80=A2 [ocaml-multicore/ocaml-multicore#275] Fix lazy behaviour for Multicore A `caml_obj_forward_lazy()' function is implemented to handle lazy values in Multicore Ocaml. =E2=80=A2 [ocaml-multicore/ocaml-multicore#269] Move from a global `pools_to_rescan' to a domain-local one During stress testing, a segmentation fault occurred when a pool was being rescanned while a domain was allocating in to it. The rescan has now been moved to the domain local, and hence this situation will not occur again. =E2=80=A2 [ocaml-multicore/ocaml-multicore#268] Fix for a few space leaks The space leaks that occurred during domain spawning and termination when performing the stress tests have been fixed in this PR. =E2=80=A2 [ocaml-multicore/ocaml-multicore#272] Fix for DWARF CFI for non-allocating external calls The entry to `caml_classify_float_unboxed' caused a corrupted backtrace, and a fix that clearly specifies the boundary between OCaml and C has been provided. =E2=80=A2 An effort to implement a synchronized minor garbage collector f= or Multicore OCaml is actively being researched and worked upon. Benchmarking for a work-sharing parallel stop-the-world branch against multicore trunk has been performed along with clearing technical debt, handling race conditions, and fixing segmentation faults. The C-API reversion changes have been tested and merged into the stop-the-world minor GC branch for Multicore OCaml. [ocaml-multicore/ocaml-multicore#275] [ocaml-multicore/ocaml-multicore#269] [ocaml-multicore/ocaml-multicore#268] [ocaml-multicore/ocaml-multicore#272] Benchmarking =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 The [Sandmark] performance benchmarking infrastructure has been improved for backfilling data, tracking branches and naming benchmarks. =E2=80=A2 Numerical parallel benchmarks have been added to the Multicore compiler. =E2=80=A2 An [Irmin] macro benchmark has been included in Sandmark. A tes= t for measuring Irmin's merge capabilities with Git as its filesystem is being tested with different read and write rates. =E2=80=A2 Work is also underway to implement parallel algorithms for N-bo= dy, reverse-complement, k-nucleotide, binary-trees, fasta, fannkuch-redux, regex-redux, Game of Life, RayTracing, Barnes Hut, Count Graphs, SSSP and from the MultiMLton benchmarks to test on Multicore OCaml. [Sandmark] [Irmin] Documentation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 A chapter on Parallel Programming in Multicore OCaml is being written and an early draft will be made available to the community for their feedback. It is based on Domains, with examples to implement array sums, Pi approximation, and trapezoidal rules for definite integrals. Acronyms =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 API: Application Programming Interface =E2=80=A2 CTF: Common Trace Format =E2=80=A2 CFI: Call Frame Information =E2=80=A2 DWARF: Debugging With Attributed Record Formats =E2=80=A2 GC: Garbage Collector =E2=80=A2 PR: Pull Request =E2=80=A2 SSSP: Single Source Shortest Path Nicolas Tollenaere asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If I may ask a question, I am curious about the status of integration of effects into the type system. According to this page , original plan was to merge an untyped version of effect, before it was decided to integrate them into the system. I have seen this presentation of leo white on this matter along with this one (from 2016). My understanding was that, at the time of the last presentation, there was still some theoretical issues to be solved (although the speaker did not seem too worried about finding some way around eventually). I have no idea about the current status of the project. Reading your post it seems that you are now in an integration phase (PR reviews and all) that would imply that you're done with (most) theoretical questions. But that could either mean that you are integrating an untyped version of effects (and the type system is let for future development) or that you have indeed settled on a design. Which one is it ? Anyway, thanks for the post and the work in general, this project seems awesome (even if I did not dive into it too much until now) Anil Madhavapeddy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Good question; our current focus in getting the runtime components upstreamed (the "Domains" API) and some of the mechanisms that could be used by an effect system. We haven't yet settled on a final design for an effect extension to OCaml, but the general preference is to skip integrating an untyped effect system if a typed version lands in the right timescales. This will happen after all the runtime pieces are upstreamed, which will allow everyone to use multicore parallelism via the lower-level Domains API. Use Case for Ephemerons? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this old thread, Yawar Amin said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 [Here's another use] (disclaimer: this is my project). What's happening here is that I'm using an 'ephemeral cache' (i.e. a cache backed by an ephemeron hash table, [here]) to store subscribers to a 'topic', i.e. a pub-sub bus. You get a subscription token when you subscribe to a topic, and part of that token is the cache key. The cache is 'ephemeral' so as soon as the subscription token goes out of scope, it and its corresponding subscription (concretely, the stream and its push function) are automatically deleted from the cache. Hence, there's no 'unsubscribe' or 'close topic' functionality=E2=80=93it= 's assumed that you want to unsubscribe if you let the subscription token go out of scope. [Here's another use] [here] `json-data-encoding' version 0.8 (was `ocplib-json-typed') =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that Nomadic Labs is now in charge of the development, maintenance and release of `json-data-encoding' =E2=80=93 the library previously known as `ocplib-json-typed'. Even though we are changing to a more descriptive name, we are maintaining continuity of version numbers. As a result, this is an announce for the version `0.8'. The library `json-data-encoding' lets you define encodings for a given OCaml type, and use that encoding to encode values of that type into JSON or decode JSON into values of that type. The library supports multiple JSON backends: `Ezjsonm', `Yojson', native browser representation (for `js_of_ocaml', via the package `json-data-encoding-browser') and `BSON' (via the package `json-data-encoding-bson'). It is available via `opam' (`opam install json-data-encoding') and hosted on Changes from the version v0.7 include: =E2=80=A2 extensive tests using `Crowbar' (adapted from similar tests on `data-encoding' originally by @gasche) =E2=80=A2 minor documentation improvements =E2=80=A2 improved self documentation capabilities for unions' cases (wor= k by @smondet) =E2=80=A2 improved schema equality (work by @rbardou) Developer position at Abacus Medicine, Copenhagen =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: mokn announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Abacus Medicine has an open developer position. We do parallel distribution of medicine in EU and for that we have developed a system to handle the trading. A part of this system is developed in OCaml. Unfortunately the job description is only in danish, but we do accept applications in english: [Job description] [Job description] Camlp5 version 7.11 release (4.10 compatibility) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Chet Murthy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 New release 7.11 of Camlp5. Compatible with all OCaml versions >=3D 4.00.0, latest OCaml version 4.10+beta2 included. Main improvement: compatible with 4.10's blank module names and generative functors. Home page, including downloading and documentation at: Enjoy! N.B. I'm new to helping out with camlp5, so might have made some mistakes; any users who find problems should contact me either directly, or (better) thru issues on and I'll be sure to get right on it. N.B.#2: There are still lots of gaps between current Ocaml, and Camlp5's support; I'm working on fixing that, and there'll soon be a release that brings camlp5 as up-to-date as possible with Ocaml. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 28 to Februar= y 04, 2020.

Multicore OCaml: January 2020 update

Anil Madhavapeddy announced

Welcome to the January 2020 news update from the Multicore OCaml team! We'r= e going to summarise our activites monthly to highlight what we're working = on throughout this year. This update has kindly been assembled by @shakthim= aan and @kayceesrk.

The most common question we get is how to contribute to the overall multico= re effort. As I noted last year<= /a>, we are now in the process of steadily upstreaming our efforts to mainl= ine OCaml. Therefore, the best way by far to contribute is to test for regr= essions or opportunities for improvements in the patches that are outstandi= ng in the main OCaml repository.

A secondary benefit would be to review the PRs in the multicore repository, b= ut those tend to be more difficult to evaluate externally as they are being= spotted as a result of stress testing at the moment. A negative contributi= on would be to raise discussion of orthogonal features or new project manag= ement mechanisms – this takes time and effort to reply to, and the t= eam has a very full plate already now that the upstreaming has begun. We do= n't want to prevent those discussions from happening of course, but would a= ppreciate if they were directed to the general OCaml bugtracker or another = thread on this forum.

We'll first go over the OCaml PRs and issues, then cover the multicore repo= sitory and our Sandmark benchmarking infrastructure. A new initiative to im= plement and test new parallel algorithms for Multicore OCaml is also underw= ay.

OCaml

  • Ongoing
    • ocaml/ocaml#9082 E= ventlog tracing system

      Eventlog is a proposal for a new tracing facility for OCaml runtime that pr= ovides metrics and counters, and uses the Binary Trace Format (CTF). The ne= xt step to get this merged is to incubate the tracing features in separate = runtime variant, so it can be selected at application link time.

    • ocaml/ocaml#8984 T= owards a new closure representation

      A new layout for closures has been proposed for traversal by the garbage c= ollector without the use of a page table. This is very much useful for Mult= icore OCaml and for performance improvements. The PR is awaiting review fro= m other developers, and can then be rebased against trunk for testing and m= erge.

    • o= caml-multicore/ocaml-multicore#187 Better Safe Points

      A patch to regularly poll for inter-domain interrupts to provide better saf= e points is actively being reviewed. This is to ensure that any pending int= errupts are notified by the runtime system.

    • Work is underway on improving the marshaling (runtime/extern.c) in upst= ream OCaml to avoid using GC mark bits to represent visitedness, and to use= a hash table (addrmap) implementation.
  • Completed

    The following PRs have been merged to upstream OCaml trunk:

    • ocaml/ocaml#8713 M= ove C global variables to a dedicated structure

      This PR moves the C global variables to a "domain state" table. Every domai= n requires its own table of domain local variables, and hence this is requi= red for Multicore runtime.

      This uncovered a number of compatability issues with the C header files, which were all inc= luded in the recent OCaml 4.10.0+beta2 release via the next item.

    • ocaml/ocaml#9253 M= ove back caml_* to thematic headers

      The caml_* definitions from runtime/caml/compatibility.h have = been moved to provide a compatible API for OCaml versions 4.04 to 4.10. Thi= s change is also useful for Multicore domains that have their own state.

Multicore OCaml

The following PRs have been merged into the Multicore OCaml trees:

  • oca= ml-multicore/ocaml-multicore#275 Fix lazy behaviour for Multicore

    A caml_obj_forward_lazy() function is implemented to handle la= zy values in Multicore Ocaml.

  • oca= ml-multicore/ocaml-multicore#269 Move from a global pools_to_rescan to a domain-local one

    During stress testing, a segmentation fault occurred when a pool was being= rescanned while a domain was allocating in to it. The rescan has now been = moved to the domain local, and hence this situation will not occur again.

  • oca= ml-multicore/ocaml-multicore#268 Fix for a few space leaks

    The space leaks that occurred during domain spawning and termination when p= erforming the stress tests have been fixed in this PR.

  • oca= ml-multicore/ocaml-multicore#272 Fix for DWARF CFI for non-allocating external calls

    The entry to caml_classify_float_unboxed caused a corrupted ba= cktrace, and a fix that clearly specifies the boundary between OCaml and C = has been provided.

  • An effort to implement a synchronized minor garbage collector for Multi= core OCaml is actively being researched and worked upon. Benchmarking for a= work-sharing parallel stop-the-world branch against multicore trunk has be= en performed along with clearing technical debt, handling race conditions, = and fixing segmentation faults. The C-API reversion changes have been teste= d and merged into the stop-the-world minor GC branch for Multicore OCaml.

Benchmarking

  • The Sandmark performance be= nchmarking infrastructure has been improved for backfilling data, tracking = branches and naming benchmarks.
  • Numerical parallel benchmarks have been added to the Multicore compiler= .
  • An Irmin macro benchmark has been inc= luded in Sandmark. A test for measuring Irmin's merge capabilities with Git= as its filesystem is being tested with different read and write rates.
  • Work is also underway to implement parallel algorithms for N-body, reve= rse-complement, k-nucleotide, binary-trees, fasta, fannkuch-redux, regex-re= dux, Game of Life, RayTracing, Barnes Hut, Count Graphs, SSSP and from the = MultiMLton benchmarks to test on Multicore OCaml.

Documentation

  • A chapter on Parallel Programming in Multicore OCaml is being written a= nd an early draft will be made available to the community for their feedbac= k. It is based on Domains, with examples to implement array sums, Pi approx= imation, and trapezoidal rules for definite integrals.

Acronyms

  • API: Application Programming Interface
  • CTF: Common Trace Format
  • CFI: Call Frame Information
  • DWARF: Debugging With Attributed Record Formats
  • GC: Garbage Collector
  • PR: Pull Request
  • SSSP: Single Source Shortest Path

Nicolas Tollenaere asked

If I may ask a question, I am curious about the status of integration of ef= fects into the type system. According to this page https://= ocamlverse.github.io/content/future_ocaml.html#typed-algebraic-effects,= original plan was to merge an untyped version of effect, before it was dec= ided to integrate them into the system. I have seen this presentation of le= o white on this matter https://www.janestreet.com/tech-talks/effective-progra= mming/ along with this one https://www.youtube.com/watch?v=3DibpUJmlEWi4 (from 201= 6). My understanding was that, at the time of the last presentation, there = was still some theoretical issues to be solved (although the speaker did no= t seem too worried about finding some way around eventually). I have no ide= a about the current status of the project. Reading your post it seems that = you are now in an integration phase (PR reviews and all) that would imply t= hat you're done with (most) theoretical questions. But that could either me= an that you are integrating an untyped version of effects (and the type s= ystem is let for future development) or that you have indeed settled on a d= esign. Which one is it ? Anyway, thanks for the post and the work in genera= l, this project seems awesome (even if I did not dive into it too much unti= l now)

Anil Madhavapeddy replied

Good question; our current focus in getting the runtime components upstream= ed (the "Domains" API) and some of the mechanisms that could be used by an = effect system. We haven't yet settled on a final design for an effect exte= nsion to OCaml, but the general preference is to skip integrating an untype= d effect system if a typed version lands in the right timescales. This will= happen after all the runtime pieces are upstreamed, which will allow every= one to use multicore parallelism via the lower-level Domains API.

Use Case for Ephemerons?

Continuing this old thread, Yawar Amin said

Here's another use (disclaimer: this = is my project).

What's happening here is that I'm using an 'ephemeral cache' (i.e. a cache = backed by an ephemeron hash table, he= re) to store subscribers to a 'topic', i.e. a pub-sub bus. You get a su= bscription token when you subscribe to a topic, and part of that token is t= he cache key. The cache is 'ephemeral' so as soon as the subscription token= goes out of scope, it and its corresponding subscription (concretely, the = stream and its push function) are automatically deleted from the cache.

Hence, there's no 'unsubscribe' or 'close topic' functionality=E2=80=93it's= assumed that you want to unsubscribe if you let the subscription token go = out of scope.

json-data-encoding version 0.8 (was ocplib-= json-typed)

Rapha=C3=ABl Proust announced

I'm happy to announce that Nomadic Labs is now in charge of the development= , maintenance and release of json-data-encoding =E2=80=93 the = library previously known as ocplib-json-typed. Even though we = are changing to a more descriptive name, we are maintaining continuity of v= ersion numbers. As a result, this is an announce for the version 0.8<= /code>.

The library json-data-encoding lets you define encodings for a= given OCaml type, and use that encoding to encode values of that type into= JSON or decode JSON into values of that type. The library supports multipl= e JSON backends: Ezjsonm, Yojson, native browser = representation (for js_of_ocaml, via the package json-da= ta-encoding-browser) and BSON (via the package js= on-data-encoding-bson).

It is available via opam (opam install json-data-encodin= g) and hosted on https://gitlab.com/nomadic-labs/json-data-encoding/

Changes from the version v0.7 include:

  • extensive tests using Crowbar (adapted from similar tests = on data-encoding originally by @gasche)
  • minor documentation improvements
  • improved self documentation capabilities for unions' cases (work by @sm= ondet)
  • improved schema equality (work by @rbardou)

Developer position at Abacus Medicine, Copenhagen

mokn announced

Abacus Medicine has an open developer position. We do parallel distribution= of medicine in EU and for that we have developed a system to handle the tr= ading. A part of this system is developed in OCaml.

Unfortunately the job description is only in danish, but we do accept appli= cations in english: Jo= b description

Camlp5 version 7.11 release (4.10 compatibility)

Chet Murthy announced

New release 7.11 of Camlp5. Compatible with all OCaml versions >=3D 4.00= .0, latest OCaml version 4.10+beta2 included.

Main improvement: compatible with 4.10's blank module names and generative = functors.

Home page, including downloading and documentation at: https://camlp5.github.io/

Enjoy!

N.B. I'm new to helping out with camlp5, so might have made some mistakes; = any users who find problems should contact me either directly, or (better) = thru issues on https:= //github.com/camlp5/camlp5/releases and I'll be sure to get right on it.

N.B.#2: There are still lots of gaps between current Ocaml, and Camlp5's su= pport; I'm working on fixing that, and there'll soon be a release that brin= gs camlp5 as up-to-date as possible with Ocaml.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 307117EC74 for ; Tue, 18 Feb 2020 09:18:27 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,455,1574118000"; d="scan'208,217";a="339544075" Received: from eduroam-060c.sophia.inria.fr (HELO set) ([138.96.49.60]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 18 Feb 2020 09:18:13 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 18 Feb 2020 09:18:12 +0100 Message-ID: <87d0acia0r.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 11 to 18, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Logical 0.3.0 OCaml 4.10.0, first release candidate New release of Menhir, including bug fixes First release of data-encoding, JSON and binary serialisation Opam package popularity? What's the OCaml equivalent for HLint? New release of naboris 0.1.1 Category theory for Programmers book - OCaml flavor Call for Speakers: Build Meetup New York April 2020 Old CWN Logical 0.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: T=C3=B3th R=C3=B3bert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I proud to announce that I published Logical 0.3.0 and it's available in opam. I'm also not to proud to announce that I did a bunch of breaking changes in this release. :D During development of this release, I realized that I made the biggest mistake I could do as a library maintainer, which is that I didn't use my own library, so I made a bunch of stupid design mistakes, which I hopefully fixed in this release. Changelog: =E2=80=A2 Added both_multi goal =E2=80=A2 Removed set from the type system =E2=80=A2 Moved type system to separate module =E2=80=A2 Re-factored state to be a map instead of an association list =E2=80=A2 Added bunch of examples to the bin folder One of my main goal with Logical was to solve the puzzles that I found in this entertaining article: and it became a reality so hurray. Another important thing to mention is that I can proudly say that Logical is capable of solving a mystery murder, so it's at least a mystery murder complete language/framework. :D Future plans(0.4.0 release): =E2=80=A2 I want to introduce conditions or validations (I need to find a= good name for it) on the variables, which would basically be a function, which is run when the variable gets it's value, so it's possible to assess if the value is a good one or not. I think this feature is extremely general, flexible and powerful, so I have to be careful how I implement it(if I will). :D It also means that implementing negation in Logical will become a breeze, so that's it for being negation free. =E2=80=A2 I'm thinking of creating a Variable module, which will by more = like a syntactic sugar for creating variables. I'm not sure about this, because this would make Goal.equal "obsolete". =E2=80=A2 I will hide Base's datatypes behind ours, so the user don't hav= e to depend on base to use the library. Let me know if you have any suggestion or comment about Logical. Github: Docs: OCaml 4.10.0, first release candidate =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 We have released a second release candidate to integrate a bug fix for 32-bit users of the new best-fit allocator: The fix should be transparent for other users, the release is mostly here to try to minimize the difference between the candidate and final binaries. New release of Menhir, including bug fixes =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Dear users of OCaml & Menhir, It is my pleasure to announce a new release of Menhir. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam upgrade menhir =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release fixes two bugs in our implementation of Pager's algorithm. Menhir relies on this algorithm to build an LR automaton and to decide which states can safely be merged, where "safely" means "without creating unexplainable conflicts". One bug (which had been known for a long time, but not fixed) would cause Menhir to sometimes make an unsafe merge decision, thereby creating an unexplainable conflict. The other bug (which had never been discovered until now) would cause Menhir to sometimes miss a safe merge decision, thereby creating an automaton with needlessly many states. In summary, after upgrading to this version, you may find (in some cases) that the parser produced by Menhir for your grammar has changed. It may have slightly more or slightly fewer states than the parser produced by previous versions of Menhir. Even in cases where the parser hasn't changed, the numbering of the states can be different. Feedback is welcome. Happy parsing, Fran=C3=A7ois Pottier francois.pottier@inria.fr 2020/02/11 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 Re-implement Menhir's default algorithm for constructing LR(1) automata, namely Pager's algorithm. This closes issue #21 (reported by Andrej Bauer), a bug that would sometimes cause unexplainable conflicts to appear, because states were merged too aggressively. This also removes an unreported bug that would cause the automaton to have too many states, because states were *not* merged aggressively enough. In summary, the old and new construction algorithms differ: in many cases, the resulting automaton is unchanged, but in some cases, the automaton produced by the new algorithm may have slightly more or slightly fewer states. =E2=80=A2 Re-implement Menhir's algorithm for constructing automata in `--no-pager' mode. In this (undocumented) mode, Menhir does not merge any states, but allows itself to redirect a transition from a state `s' to a *larger* state `s''. This method yields an automaton whose states form a subset of the states of the canonical LR(1) automaton. It usually has significantly fewer states than the canonical automaton, and significantly more states than the automaton produced by Pager's algorithm. The new construction method removes an unreported bug that would cause the automaton to have too many states. The automaton produced by the new algorithm will usually have significantly fewer states than the automaton produced by the previous algorithm. =E2=80=A2 Re-implement Menhir's algorithms for constructing automata in `--lalr' and `--canonical' modes. The previous algorithms were correct, as far as we know, so the output of the new algorithms is the same, up to a possible renumbering of the states. The new algorithms are slightly faster. =E2=80=A2 Increase the maximum length of a production, which used to be 1= 27, up to 1023. Display a polite error message if this length is exceeded. (Problem reported by Andreas Abel.) =E2=80=A2 The new switch `--timings-to ' causes internal timing information to be written to the file `'. =E2=80=A2 A version of the library `fix' is now vendored (included) inside Menhir. This should have no impact for end users, but implies that `dune' 2.2.0 or later is required. First release of data-encoding, JSON and binary serialisation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The newly released version (0.2) addresses this. All the binary reading/writing primitives use `result' by default and have `_opt' and `_exn' variants. The JSON primitives are not yet changed because they rely on an external library that has more idiosyncratic error management. (This will eventually be fixed in a future version.) Opam package popularity? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Chet Murthy asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Is there someplace a database of opam packages and their popularity? Obviously it'd be inaccurate, but it'd still be interesting to see which packages are most-often downloaded via opam =E2=80=A6.. Levi Roth replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The listing at has the download counts (I think for the latest month, not sure if that means past 30 days or since the start of the current calendar month) as title attributes on the table rows. What's the OCaml equivalent for HLint? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fangyi Zhou asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I've been using OCaml for quite a while and one thing I've been looking for is a good linter, ideally something like the Haskell [HLint]. I found [this] which seems quite old - latest release in 2012. Sorry if this has been raised previously. [HLint] [this] "Aaron L. Zeng =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Something similar, but not as featureful, is [ppx_js_style]. It's somewhat opinionated, but the checks aren't Jane Street-specific. [ppx_js_style] New release of naboris 0.1.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Shawn McGinty announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 *(much)* Better performance =E2=80=A2 API improvements Category theory for Programmers book - OCaml flavor =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Anton Kochkov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thanks to @Arul the book was finished, and now is available for download here - Please, enjoy and report a feedback. Call for Speakers: Build Meetup New York April 2020 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: J=C3=A9r=C3=A9mie Dimino announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On April 7th and 8th, [Jane Street], [Bloomberg] and [Google] will be hosting a Build Meetup at the [Jane Street offices] in New York City. As we begin shaping our schedule, we are reaching out to a number of communities to find people who would like to participate in the event. Speaker sign-ups are now live [here]. We are excited to announce that the keynote will be presented by the authors of the research paper =E2=80=9C[From Laptop to Lambda: Outsourcing Everyday Jobs to Thousands of Transient Functional Containers]=E2=80=9D w= hich examines the exciting possibilities for build through the use of cloud functions. The entire event will be themed around all things build and test: Bazel, Buck, BuildStream, CMake, Dune, Goma, Pants, Recc and Remote Execution. In addition to this, we are interested in the growing surrounding ecosystems, such as editor integration and developer build experience as a whole. The meetup will run as follows: on day one, a series of talks will be presented along with breakfast, lunch and refreshments. This will be followed by an evening social at a nearby venue to continue the discussions from throughout the day. On the second day there will be an opportunity for broader community collaboration and discussion during our all day code sprint. We are looking for insightful and engaging talks and presentations on topics focused around build systems. Have you worked tirelessly for the past 6 months on a new feature for project foo you would like to showcase? Have you and your team spent the last year integrating the tool bar at your workplace? Do you have some comparisons to make between qux and quux that the community could benefit from? If so, we would love to [hear from you]! We welcome proposals for talks across the entire ecosystem. Each talk should ideally last 30 minutes, followed by time for questions. Keep your eyes out for meetup registration information, which will be sent separately over the next few weeks! [Jane Street] [Bloomberg] [Google] [Jane Street offices] [here] [From Laptop to Lambda: Outsourcing Everyday Jobs to Thousands of Transient Functional Containers] [hear from you] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 11 to 18, 20= 20.

Logical 0.3.0

T=C3=B3th R=C3=B3bert announced

I proud to announce that I published Logical 0.3.0 and it's available in op= am. I'm also not to proud to announce that I did a bunch of breaking change= s in this release. :D

During development of this release, I realized that I made the biggest mist= ake I could do as a library maintainer, which is that I didn't use my own l= ibrary, so I made a bunch of stupid design mistakes, which I hopefully fixed in thi= s release.

Changelog:

  • Added both_multi goal
  • Removed set from the type system
  • Moved type system to separate module
  • Re-factored state to be a map instead of an association list
  • Added bunch of examples to the bin folder

One of my main goal with Logical was to solve the puzzles that I found in t= his entertaining article: https://xmonader.github.io/prolog/2018/12/21/solving-murder-prolog= .html and it became a reality so hurray.=20 Another important thing to mention is that I can proudly say that Logical i= s capable of solving a mystery murder, so it's at least a mystery murder co= mplete language/framework. :D=20

Future plans(0.4.0 release):

  • I want to introduce conditions or validations (I need to find a good na= me for it) on the variables, which would basically be a function, which is = run when the variable gets it's value, so it's possible to assess if the va= lue is a good one or not. I think this feature is extremely general, flexib= le and powerful, so I have to be careful how I implement it(if I will). :D = It also means that implementing negation in Logical will become a breeze, s= o that's it for being negation free.
  • I'm thinking of creating a Variable module, which will by more like a s= yntactic sugar for creating variables. I'm not sure about this, because thi= s would make Goal.equal "obsolete".
  • I will hide Base's datatypes behind ours, so the user don't have to dep= end on base to use the library.

Let me know if you have any suggestion or comment about Logical.

Github: https://github.co= m/StrykerKKD/Logical
Docs: https://strykerkkd.g= ithub.io/Logical

OCaml 4.10.0, first release candidate

octachron announced

We have released a second release candidate to integrate a bug fix for 32-b= it users of the new best-fit allocator:

https://github.com/oca= ml/ocaml/pull/9292

The fix should be transparent for other users, the release is mostly here t= o try to minimize the difference between the candidate and final binaries.

New release of Menhir, including bug fixes

Fran=C3=A7ois Pottier announced

Dear users of OCaml & Menhir,

It is my pleasure to announce a new release of Menhir.

opam update
opam upgrade menhir

This release fixes two bugs in our implementation of Pager's algorithm. Menhir relies on this algorithm to build an LR automaton and to decide which states can safely be merged, where "safely" means "without creating unexplainable conflicts". One bug (which had been known for a long time, but not fixed) would cause Menhir to sometimes make an unsafe merge decision, thereby creating an unexplainable conflict. The other bug (which had never been discovered until now) would cause Menhir to sometimes miss a safe merge decision, thereby creating an automaton with needlessly many states.

In summary, after upgrading to this version, you may find (in some cases) that the parser produced by Menhir for your grammar has changed. It may have slightly more or slightly fewer states than the parser produced by previous versions of Menhir. Even in cases where the parser hasn't changed, the numbering of the states can be different.

Feedback is welcome.

Happy parsing,

Fran=C3=A7ois Pottier
francois.pottier@inria.fr
http://cambium.inria.fr/~fpo= ttier/

2020/02/11

  • Re-implement Menhir's default algorithm for constructing LR(1) automata= , namely Pager's algorithm. This closes issue #21 (reported by Andrej Bauer= ), a bug that would sometimes cause unexplainable conflicts to appear, beca= use states were merged too aggressively. This also removes an unreported bu= g that would cause the automaton to have too many states, because states we= re not merged aggressively enough. In summary, the old and new const= ruction algorithms differ: in many cases, the resulting automaton is unchan= ged, but in some cases, the automaton produced by the new algorithm may hav= e slightly more or slightly fewer states.
  • Re-implement Menhir's algorithm for constructing automata in --no= -pager mode. In this (undocumented) mode, Menhir does not merge any = states, but allows itself to redirect a transition from a state s to a larger state s'. This method yields an automat= on whose states form a subset of the states of the canonical LR(1) automato= n. It usually has significantly fewer states than the canonical automaton, = and significantly more states than the automaton produced by Pager's algori= thm. The new construction method removes an unreported bug that would cause= the automaton to have too many states. The automaton produced by the new a= lgorithm will usually have significantly fewer states than the automaton pr= oduced by the previous algorithm.
  • Re-implement Menhir's algorithms for constructing automata in --l= alr and --canonical modes. The previous algorithms were= correct, as far as we know, so the output of the new algorithms is the sam= e, up to a possible renumbering of the states. The new algorithms are sligh= tly faster.
  • Increase the maximum length of a production, which used to be 127, up t= o 1023. Display a polite error message if this length is exceeded. (Problem= reported by Andreas Abel.)
  • The new switch --timings-to <filename> causes intern= al timing information to be written to the file <filename>.
  • A version of the library fix is now vendored (included) in= side Menhir. This should have no impact for end users, but implies that dune 2.2.0 or later is required.

First release of data-encoding, JSON and binary serialisation<= /h2>

Rapha=C3=ABl Proust announced

The newly released version (0.2) addresses this. All the binary reading/wri= ting primitives use result by default and have _opt and _exn variants.

The JSON primitives are not yet changed because they rely on an external li= brary that has more idiosyncratic error management. (This will eventually b= e fixed in a future version.)

Opam package popularity?

Chet Murthy asked

Is there someplace a database of opam packages and their popularity? Obvio= usly it'd be inaccurate, but it'd still be interesting to see which package= s are most-often downloaded via opam …..

Levi Roth replied

The listing at https://opam.ocaml.org/packages/index-popularity.html has the dow= nload counts (I think for the latest month, not sure if that means past 30 days or since the start of the current calendar month) as title attributes = on the table rows.

What's the OCaml equivalent for HLint?

Fangyi Zhou asked

I've been using OCaml for quite a while and one thing I've been looking for= is a good linter, ideally something like the Haskell HLint.

I found this which seems qu= ite old - latest release in 2012.

Sorry if this has been raised previously.

"Aaron L. Zeng

Something similar, but not as featureful, is ppx_js_style. It's somewhat opinionated, but = the checks aren't Jane Street-specific.

New release of naboris 0.1.1

Shawn McGinty announced

https://github.com/sha= wn-mcginty/naboris

  • (much) Better performance
  • API improvements

Category theory for Programmers book - OCaml flavor

Anton Kochkov announced

Thanks to @Arul the book was finished, and now is available for download he= re - https://github.com/hmemcpy/milewski-ctfp-pdf/releases/tag/v1.4.0= -rc1

Please, enjoy and report a feedback.

Call for Speakers: Build Meetup New York April 2020

J=C3=A9r=C3=A9mie Dimino announced

On April 7th and 8th, Jane Street, Bloomberg and Google will be hosting a Build Meetup at the Jane Street offices in New York City.

As we begin shaping our schedule, we are reaching out to a number of commun= ities to find people who would like to participate in the event. Speaker si= gn-ups are now live here.

We are excited to announce that the keynote will be presented by the author= s of the research paper =E2=80=9CFrom Laptop to Lambda: Outsourcing Everyday Jobs to Thousands of Transient Functional Containers=E2=80=9D which examines th= e exciting possibilities for build through the use of cloud functions.

The entire event will be themed around all things build and test: Bazel, Bu= ck, BuildStream, CMake, Dune, Goma, Pants, Recc and Remote Execution. In ad= dition to this, we are interested in the growing surrounding ecosystems, such as e= ditor integration and developer build experience as a whole.

The meetup will run as follows: on day one, a series of talks will be prese= nted along with breakfast, lunch and refreshments. This will be followed by= an evening social at a nearby venue to continue the discussions from throughou= t the day.

On the second day there will be an opportunity for broader community collab= oration and discussion during our all day code sprint.

We are looking for insightful and engaging talks and presentations on topic= s focused around build systems. Have you worked tirelessly for the past 6 m= onths on a new feature for project foo you would like to showcase? Have you and y= our team spent the last year integrating the tool bar at your workplace? Do= you have some comparisons to make between qux and quux that the community could= benefit from?

If so, we would love to = hear from you!

We welcome proposals for talks across the entire ecosystem. Each talk shoul= d ideally last 30 minutes, followed by time for questions.

Keep your eyes out for meetup registration information, which will be sent = separately over the next few weeks!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5FFFD7EC77 for ; Tue, 25 Feb 2020 09:51:43 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,483,1574118000"; d="scan'208,217";a="437524387" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 25 Feb 2020 09:51:43 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 25 Feb 2020 09:51:35 +0100 Message-ID: <877e0b6odk.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 18 to 25, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dune 2.3.0 What's the OCaml equivalent for HLint? Training Sessions for "Expert OCaml" in Paris OCaml 4.10 released Old CWN Dune 2.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune team, I'm proud to announce the 2.3.0 release of dune. This release is particularly relevant for users of coq that use dune to build their theories, developers of coq that use dune to build their favorite theorem prover. I'd like to thank @ejgallego for all the hard work to improve dune in this regard. I'd also like to point out the `(strict_package_deps)' option that is now available in project files. This option will now ask dune to validate the package dependencies specified in the `package' stanzas in your dune-project files. Here's the full change list, and as always, happy hacking! 2.3.0 (15/02/2020) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 Improve validation and error handling of arguments to `dune ini= t' (#3103, fixes #3046, @shonfeder) =E2=80=A2 `dune init exec NAME' now uses the `NAME' argument for private modules (#3103, fixes #3088, @shonfeder) =E2=80=A2 Avoid linear walk to detect children, this should greatly impro= ve performance when a target has a large number of dependencies (#2959, @ejgallego, @aalekseyev, @Armael) =E2=80=A2 [coq] Add `(boot)' option to `(coq.theories)' to enable bootstr= ap of Coq's stdlib (#3096, @ejgallego) =E2=80=A2 [coq] Deprecate `public_name' field in favour of `package' (#20= 87, @ejgallego) =E2=80=A2 Better error reporting for "data only" and "vendored" dirs. Usi= ng these with anything else than a strict subdirectory or `*' will raise an error. The previous behavior was to just do nothing (#3056, fixes #3019, @voodoos) =E2=80=A2 Fix bootstrap on bytecode only switches on windows or where `-j= 1' is set. (#3112, @xclerc, @rgrinberg) =E2=80=A2 Allow `enabled_if' fields in `executable(s)' stanzas (#3137, fi= xes #1690 @voodoos) =E2=80=A2 Do not fail if `ocamldep', `ocamlmklib', or `ocaml' are absent.= Wait for them to be used to fail (#3138, @rgrinberg) =E2=80=A2 Introduce a `strict_package_deps' mode that verifies that dependencies between packages in the workspace are specified correctly. (@rgrinberg, #3117) =E2=80=A2 Make sure the `@all' alias is defined when no `dune' file is pr= esent in a directory (#2946, fix #2927, @diml) What's the OCaml equivalent for HLint? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, St=C3=A9phane Lavergne said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Aside from Mascot and `ppx_js_style', it seems that [ocp-lint] is actively maintained by the folks at OcamlPro. I personally only use `ocamlformat' so I can't vouch for it, but it seems promising. [ocp-lint] Training Sessions for "Expert OCaml" in Paris =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Laur=C3=A8ne Gibaud announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCamlPro organizes a cross-company training in French for developers who already use OCaml. The "Expert OCaml" training mixes theory and practice and will allow you to master OCaml's advanced features such as its type-system, OCaml's open source tools and libraries, and how to write compact and efficient code. When? The next session is scheduled for March 3-4, 2020, the second will be on April 7-8, 2020. Where? Paris 14, at our office If interested, contact us at contact@ocamlpro.com or register on: . We can also organize custom and on-site sessions upon request. More info on: OCaml 4.10 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 We have the pleasure of celebrating the birthday of Francis Ronalds by announcing the release of OCaml version 4.10.0. Some of the highlights in this release are: =E2=80=A2 A new best-fit allocator for the major heap which reduces both = GC cost an memory usage. =E2=80=A2 Some preliminary runtime work for OCaml multicore =E2=80=A2 Immutable strings are now enforced at configuration time =E2=80=A2 User-defined indexing operators for multidimensional arrays =E2=80=A2 Coming soon: statmemprof, a new statistical memory profiler. T= he external API will be release next version. =E2=80=A2 Various improvements to the manual =E2=80=A2 More precise exhaustiveness check for GADTs =E2=80=A2 Many bug fixes Merlin, the OCaml editor service, is not yet available for this release. We will publish a follow-up announcement when Merlin is ready. This release is (or soon will be) available as a set of OPAM switches, and as a source download here: Editor note: please follow the archive link for the full changelog Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 18 to 25, 20= 20.

Dune 2.3.0

Rudi Grinberg announced

On behalf of the dune team, I'm proud to announce the 2.3.0 release of dune= . This release is particularly relevant for users of coq that use dune to b= uild their theories, developers of coq that use dune to build their favorit= e theorem prover. I'd like to thank @ejgallego for all the hard work to improve dune = in this regard.

I'd also like to point out the (strict_package_deps) option th= at is now available in project files. This option will now ask dune to vali= date the package dependencies specified in the package stanzas= in your dune-project files.

Here's the full change list, and as always, happy hacking!

2.3.0 (15/02/2020)

  • Improve validation and error handling of arguments to dune init (#3103, fixes #3046, @shonfeder)
  • dune init exec NAME now uses the NAME argumen= t for private modules (#3103, fixes #3088, @shonfeder)
  • Avoid linear walk to detect children, this should greatly improve performance when a target has a large number of dependencies (#2959, @ejgallego, @aalekseyev, @Armael)
  • [coq] Add (boot) option to (coq.theories) to = enable bootstrap of Coq's stdlib (#3096, @ejgallego)
  • [coq] Deprecate public_name field in favour of packa= ge (#2087, @ejgallego)
  • Better error reporting for "data only" and "vendored" dirs. Using these= with anything else than a strict subdirectory or * will raise an er= ror. The previous behavior was to just do nothing (#3056, fixes #3019, @voodoos)
  • Fix bootstrap on bytecode only switches on windows or where -j1 is set. (#3112, @xclerc, @rgrinberg)
  • Allow enabled_if fields in executable(s) stan= zas (#3137, fixes #1690 @voodoos)
  • Do not fail if ocamldep, ocamlmklib, or ocaml are absent. Wait for them to be used to fail (#3138, @rgrinberg)
  • Introduce a strict_package_deps mode that verifies that de= pendencies between packages in the workspace are specified correctly. (@rgrinberg, #3117)
  • Make sure the @all alias is defined when no dune file is present in a directory (#2946, fix #2927, @diml)

What's the OCaml equivalent for HLint?

Continuing this thread, St=C3=A9phane Lavergne said

Aside from Mascot and ppx_js_style, it seems that ocp-lint is actively maintaine= d by the folks at OcamlPro. I personally only use ocamlformat = so I can't vouch for it, but it seems promising.

Training Sessions for "Expert OCaml" in Paris

Laur=C3=A8ne Gibaud announced

OCamlPro organizes a cross-company training in French for developers who already use OCaml. The "Expert OCaml" training mixes theory and practice and will allow you to master OCaml's advanced features such as its type-system, OCaml's open source tools and libraries, and how to write compact and efficient code.

When? The next session is scheduled for March 3-4, 2020, the second will be on April 7-8, 2020.

Where? Paris 14, at our office

If interested, contact us at contact@ocamlpro.com or register on: = http://www.ocamlpro.com/forms/preinscriptions-formation-ocaml/. We can also organize custom and on-site sessions upon request.

More info on: http:/= /www.ocamlpro.com/training-ocamlpro/

OCaml 4.10 released

octachron announced

We have the pleasure of celebrating the birthday of Francis Ronalds by announcing the release of OCaml version 4.10.0.

Some of the highlights in this release are:

  • A new best-fit allocator for the major heap which reduces both GC cost = an memory usage.
  • Some preliminary runtime work for OCaml multicore
  • Immutable strings are now enforced at configuration time
  • User-defined indexing operators for multidimensional arrays
  • Coming soon: statmemprof, a new statistical memory profiler. The external API will be release next version.
  • Various improvements to the manual
  • More precise exhaustiveness check for GADTs
  • Many bug fixes

Merlin, the OCaml editor service, is not yet available for this release. We will publish a follow-up announcement when Merlin is ready.

This release is (or soon will be) available as a set of OPAM switches, and as a source download here:

https://caml.inri= a.fr/pub/distrib/ocaml-4.10/

Editor note: please follow the archive link for the full changelog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 322017F3B1 for ; Tue, 3 Mar 2020 09:00:22 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,510,1574118000"; d="scan'208,217";a="438523030" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/AES256-GCM-SHA384; 03 Mar 2020 09:00:21 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 03 Mar 2020 09:00:21 +0100 Message-ID: <87r1y96f6y.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhl IHdlZWsgb2YgRmVicnVhcnkgMjUgdG8NCk1hcmNoIDAzLCAyMDIwLg0KDQpU YWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9DYW1sIDQuMTAgcmVsZWFz ZWQNClN1bW1hcnkgb2YgdGhlIER1bmUgcmV0cmVhdCAyMDIwDQpNdWx0aWNv cmUgT0NhbWw6IEZlYiAyMDIwIHVwZGF0ZQ0KT3Bsb3QgMC41MA0Kc291cGF1 bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwg cmV3cml0aW5nDQpPbGQgQ1dODQoNCg0KT0NhbWwgNC4xMCByZWxlYXNlZA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9vY2FtbC00LTEwLXJlbGVhc2VkLzUxOTQvND4NCg0KDQpD b250bnVpbmcgdGhpcyB0aHJlYWQsIEFuaWwgTWFkaGF2YXBlZGR5IHNhaWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEluZGVlZCwgbWFueSB0aGFua3MgdG8gZXZlcnlvbmUgd2hvIGxl YXB0IGluIHRvIG1ha2UgNC4xMCByZWFkeSBpbg0KICBvcGFtIGluIHN1Y2gg cmVjb3JkIHRpbWUhICBKdXN0IGEgbm90ZSB0aGF0IHRoZSBDSSBEb2NrZXIg aW1hZ2VzIGFyZQ0KICBub3cgYWxzbyByZWJ1aWx0IGZvciB4ODZfNjQsIGFy bTMyLzY0IGFuZCBwcGM2NGxlIHRvIHJlZmxlY3QgdGhlIDQuMTANCiAgcmVs ZWFzZSwgc28gZmVlbCBmcmVlIHRvIHN0YXJ0IHVzaW5nDQogIHRoZW0uIDxo dHRwczovL2h1Yi5kb2NrZXIuY29tL3Ivb2NhbWwvb3BhbTIvdGFncz4NCg0K DQpTdW1tYXJ5IG9mIHRoZSBEdW5lIHJldHJlYXQgMjAyMA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9z dW1tYXJ5LW9mLXRoZS1kdW5lLXJldHJlYXQtMjAyMC81MjI0LzE+DQoNCg0K SsOpcsOpbWllIERpbWlubyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFdlIHJlY2VudGx5IG9yZ2FuaXNlZCB0aGUgc2Vj b25kIER1bmUgcmV0cmVhdC4gSWYgeW91J2QgbGlrZSB0byBzZWUNCiAgd2hh dCBpcyBoYXBwZW5pbmcgaW4gdGhlIER1bmUgd29ybGQgYXQgdGhlIG1vbWVu dCwgcGxlYXNlIGZpbmQgYQ0KICBzdW1tYXJ5IG9mIHdoYXQgd2UgZGlzY3Vz c2VkIGFuZCB3b3JrIG9uIGluIHRoaXMgYmxvZyBwb3N0IQ0KDQogIDxodHRw czovL2R1bmUuYnVpbGQvYmxvZy9kdW5lLXJldHJlYXQtMjAyMC8+DQoNCg0K TXVsdGljb3JlIE9DYW1sOiBGZWIgMjAyMCB1cGRhdGUNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbXVs dGljb3JlLW9jYW1sLWZlYi0yMDIwLXVwZGF0ZS81MjI3LzE+DQoNCg0KQW5p bCBNYWRoYXZhcGVkZHkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBXZWxjb21lIHRvIHRoZSBGZWJydWFy eSAyMDIwIG5ld3MgdXBkYXRlIGZyb20gdGhlIE11bHRpY29yZSBPQ2FtbA0K ICB0ZWFtLCBzcHJlYWQgYWNyb3NzIHRoZSBVSywgSW5kaWEsIEZyYW5jZSBh bmQgU3dpdHplcmxhbmQhIFRoaXMNCiAgZm9sbG93cyBvbiBmcm9tIFtsYXN0 IG1vbnRoJ3NdIHVwZGF0ZSwgYW5kIGhhcyBiZWVuIHB1dCB0b2dldGhlciBi eQ0KICBAc2hha3RoaW1hYW4gYW5kIEBrYXljZWVzcmsuDQoNCiAgVGhlIFty ZWxlYXNlIG9mIE9DYW1sIDQuMTAuMF0gaGFzIHN1Y2Nlc3NmdWxseSBwdXNo ZWQgb3V0IHNvbWUNCiAgcHJlcmVxdWlzaXRlIGZlYXR1cmVzIGludG8gdGhl IHVwc3RyZWFtIGNvbXBpbGVyLiAgT3VyIHdvcmsgaW4NCiAgRmVicnVhcnkg aGFzIGZvY3Vzc2VkIG9uIGdldHRpbmcgdGhlIG11bHRpY29yZSBPQ2FtbCBi cmFuY2ggImZlYXR1cmUNCiAgY29tcGxldGUiIHdpdGggcmVzcGVjdCB0byB0 aGUgY29tcGxldGUgT0NhbWwgbGFuZ3VhZ2UsIGFuZCBkb2luZw0KICBleHRl bnNpdmUgYmVuY2htYXJraW5nIGFuZCBzdHJlc3MgdGVzdGluZyB0byB0ZXN0 IG91ciB0d28gbWlub3IgaGVhcA0KICBpbXBsZW1lbnRhdGlvbnMuDQoNCiAg VG8gdGhpcyBlbmQsIGEgbnVtYmVyIG9mIHNpZ25pZmljYW50IHBhdGNoZXMg aGF2ZSBiZWVuIG1lcmdlZCBpbnRvIHRoZQ0KICBbTXVsdGljb3JlIE9DYW1s IHRyZWVzXSB0aGF0IGVzc2VudGlhbGx5IHByb3ZpZGUgY29tcGxldGUgY292 ZXJhZ2Ugb2YNCiAgdGhlIGxhbmd1YWdlIGZlYXR1cmVzLiBXZSBlbmNvdXJh Z2UgeW91IHRvIHRlc3QgdGhlIHNhbWUgZm9yDQogIHJlZ3Jlc3Npb25zIGFu ZCBwcm92aWRlIGFueSBpbXByb3ZlbWVudHMgb3IgcmVwb3J0IHNob3J0Y29t aW5ncyB0bw0KICB1cy4gVGhlcmUgYXJlIG9uZ29pbmcgT0NhbWwgUFJzIGFu ZCBpc3N1ZXMgdGhhdCBhcmUgYWxzbyB1bmRlciByZXZpZXcsDQogIGFuZCB3 ZSBob3BlIHRvIGNvbXBsZXRlIHRob3NlIGZvciB0aGUgNC4xMSByZWxlYXNl IGN5Y2xlLiBBIG5ldyBzZXQgb2YNCiAgcGFyYWxsZWwgYmVuY2htYXJrcyBo YXZlIGJlZW4gYWRkZWQgdG8gb3VyIFtTYW5kbWFyayBiZW5jaG1hcmtpbmcN CiAgc3VpdGVdIChsaXZlIGluc3RhbmNlIFtoZXJlXSksIGluY2x1ZGluZyBl bmhhbmNlbWVudHMgdG8gdGhlIGJ1aWxkDQogIHNldHVwLg0KDQoNCltsYXN0 IG1vbnRoJ3NdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRp Y29yZS1vY2FtbC1qYW51YXJ5LTIwMjAtdXBkYXRlLzUwOTA+DQoNCltyZWxl YXNlIG9mIE9DYW1sIDQuMTAuMF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb2NhbWwtNC0xMC1yZWxlYXNlZC81MTk0Pg0KDQpbTXVsdGljb3Jl IE9DYW1sIHRyZWVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0 aWNvcmUvb2NhbWwtbXVsdGljb3JlPg0KDQpbU2FuZG1hcmsgYmVuY2htYXJr aW5nIHN1aXRlXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWJlbmNoL3Nh bmRtYXJrPg0KDQpbaGVyZV0gPGh0dHA6Ly9iZW5jaDIub2NhbWxsYWJzLmlv Pg0KDQpNdWx0aWNvcmUgT0NhbWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogQ29tcGxldGVkDQoNCiAg VGhlIGZvbGxvd2luZyBQUnMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIE11bHRp Y29yZSBPQ2FtbDoNCg0KICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1t dWx0aWNvcmUjMjgxXSBJbnRyb2R1Y2UgYEZvcmNpbmdfdGFnJyB0byBmaXgN CiAgICBjb25jdXJyZW5jeSBidWcgd2l0aCBsYXp5IHZhbHVlcw0KDQogICAg QSBgRm9yY2luZ190YWcnIGlzIHVzZWQgdG8gaW1wbGVtZW50IGxhenkgdmFs dWVzIHRvIGhhbmRsZSBhDQogICAgY29uY3VycmVuY3kgYnVnLiBJdCBiZWhh dmVzIGxpa2UgYSBsb2NrZWQgYml0LCBhbmQgYW55IGNvbmN1cnJlbnQNCiAg ICBhY2Nlc3MgYnkgYSBtdXRhdG9yIHdpbGwgcmFpc2UgYW4gZXhjZXB0aW9u IG9uIHRoYXQgZG9tYWluLg0KDQogIOKAoiBbb2NhbWwtbXVsdGljb3JlL29j YW1sLW11bHRpY29yZSMyODJdIFNhZmVwb2ludHMNCg0KICAgIEEgcHJlbGlt aW5hcnkgdmVyc2lvbiBvZiBzYWZlIHBvaW50cyBoYXMgYmVlbiBtZXJnZWQg aW50byB0aGUNCiAgICBNdWx0aWNvcmUgT0NhbWwgdHJlZXMuIFtvY2FtbC1t dWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlIzE4N10gYWxzbw0KICAgIGNvbnRh aW5zIG1vcmUgZGlzY3Vzc2lvbiBhbmQgYmFja2dyb3VuZCBhYm91dCBob3cg Y292ZXJhZ2UgY2FuIGJlDQogICAgaW1wcm92ZWQgaW4gZnV0dXJlIFBScy4N Cg0KICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMjg1 XSBJbnRyb2R1Y2UgYW4gJ29wcG9ydHVuaXN0aWMnDQogICAgbWFqb3IgY29s bGVjdGlvbiBzbGljZQ0KDQogICAgQW4gIm9wcG9ydHVuaXN0aWMgd29yayBj cmVkaXQiIGlzIGltcGxlbWVudGVkIGluIHRoaXMgUFIgd2hpY2ggZm9ybXMN CiAgICBhIGJhc2lzIGZvciBkb2luZyBtYXJrIGFuZCBzd2VlcCB3b3JrIHdo aWxlIHdhaXRpbmcgdG8gc3luY2hyb25pc2UNCiAgICB3aXRoIG90aGVyIGRv bWFpbnMuDQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGlj b3JlIzI4Nl0gRG8gZmZsdXNoIGFuZCB2YXJpYWJsZSBhcmdzIGluDQogICAg Y2FtbF9nY19sb2cNCg0KICAgIFRoZSBjYW1sX2djX2xvZygpIGZ1bmN0aW9u IGhhcyBiZWVuIHVwZGF0ZWQgdG8gZW5zdXJlIHRoYXQgYGZmbHVzaCcNCiAg ICBpcyBpbnZva2VkIG9ubHkgd2hlbiBHQyBsb2dnaW5nIGlzIGVuYWJsZWQu DQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlIzI4 N10gSW5jcmVhc2UgRVZFTlRfQlVGX1NJWkUNCg0KICAgIER1cmluZyBkZWJ1 Z2dpbmcgd2l0aCBldmVudCB0cmFjZSBkYXRhIGl0IGlzIHVzZWZ1bCB0byBy ZWR1Y2UgdGhlDQogICAgYnVmZmVyIGZsdXNoIHRpbWVzLCBhbmQgaGVuY2Ug dGhlIGBFVkVOVF9CVUZfU0laRScgaGFzIG5vdyBiZWVuDQogICAgaW5jcmVh c2VkLg0KDQogIOKAoiBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29y ZSMyODhdIFdyaXRlIGJhcnJpZXIgb3B0aW1pemF0aW9uDQoNCiAgICBUaGlz IFBSIGNsb3NlcyB0aGUgcmVncmVzc2lvbiBmb3IgdGhlIGBjaGFtZW5lb3Nf cmVkdXhfbHd0Jw0KICAgIGJlbmNobWFya2luZyBpbiBTYW5kbWFyayBieSB1 c2luZyBgaW50bmF0JyB0byBhdm9pZCBzaWduIGV4dGVuc2lvbnMNCiAgICBh bmQgY2xlYW5zIHVwIGB3cml0ZV9iYXJyaWVyJyB0byBpbXByb3ZlIG92ZXJh bGwgcGVyZm9ybWFuY2UuDQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2Nh bWwtbXVsdGljb3JlIzI5MF0gVW5pZnkgc3dlZXAgYnVkZ2V0IHRvIGJlIGlu DQogICAgd29yZCBzaXplDQoNCiAgICBUaGUgUFIgdXBkYXRlcyB0aGUgc3dl ZXAgd29yayB1bml0cyB0byBhbGwgYmUgaW4gd29yZCBzaXplLiBUaGlzIGlz DQogICAgdG8gaGFuZGxlIHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBi dWRnZXQgZm9yIHNldHVwLCBzd2VlcCBhbmQNCiAgICBmb3IgbGFyZ2UgYWxs b2NhdGlvbnMgaW4gYmxvY2tzLg0KDQoNCiAgW29jYW1sLW11bHRpY29yZS9v Y2FtbC1tdWx0aWNvcmUjMjgxXQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUvcHVsbC8yODE+DQoNCiAg W29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMjgyXQ0KICA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNv cmUvcHVsbC8yODI+DQoNCiAgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0 aWNvcmUjMTg3XQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9vY2FtbC1tdWx0aWNvcmUvaXNzdWVzLzE4Nz4NCg0KICBbb2NhbWwt bXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMyODVdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxs LzI4NT4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMy ODZdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29j YW1sLW11bHRpY29yZS9wdWxsLzI4Nj4NCg0KICBbb2NhbWwtbXVsdGljb3Jl L29jYW1sLW11bHRpY29yZSMyODddDQogIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzI4Nz4NCg0K ICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMyODhdDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRp Y29yZS9wdWxsLzI4OD4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11 bHRpY29yZSMyOTBdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzI5MD4NCg0KDQril4ogT25n b2luZw0KDQogIOKAoiBBIGxvdCBvZiB3b3JrIGlzIG9uZ29pbmcgZm9yIHRo ZSBpbXBsZW1lbnRhdGlvbiBvZiBhIHN5bmNocm9uaXNlZA0KICAgIG1pbm9y IGdhcmJhZ2UgY29sbGVjdG9yIGZvciBNdWx0aWNvcmUgT0NhbWwsIGluY2x1 ZGluZyBiZW5jaG1hcmtpbmcNCiAgICBmb3IgdGhlIHN0b3AtdGhlLXdvcmxk IChzdHcpIGJyYW5jaC4gIFdlIHdpbGwgcHVibGlzaCB0aGUgcmVzdWx0cyBv Zg0KICAgIHRoaXMgaW4gYSBmdXR1cmUgdXBkYXRlLCBhcyB3ZSBhcmUgYXNz ZW1ibGluZyBhIGN1cnJlbnRseQ0KICAgIGNvbXByZWhlbnNpdmUgZXZhbHVh dGlvbiBvZiB0aGUgcnVudGltZSBhZ2FpbnN0IHRoZSBtYWluc3RyZWFtDQog ICAgcnVudGltZS4NCg0KDQpCZW5jaG1hcmtpbmcNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFtTYW5kbWFya10gbm93IGhh cyBzdXBwb3J0IHRvIHJ1biBwYXJhbGxlbCBiZW5jaG1hcmtzLiBXZSBjYW4g YWxzbyBub3cNCiAgYWJvdXQgR0MgbGF0ZW5jeSBtZWFzdXJlbWVudHMgZm9y IGJvdGggc3RvY2sgT0NhbWwgYW5kIE11bHRpY29yZSBPQ2FtbA0KICBjb21w aWxlci4NCg0KICDigKIgW29jYW1sLWJlbmNoL3NhbmRtYXJrIzczXSBNb3Jl IHBhcmFsbGVsIGJlbmNobWFya3MNCg0KICAgIEEgbnVtYmVyIG9mIHBhcmFs bGVsIGJlbmNobWFya3Mgc3VjaCBhcyBOLWJvZHksIFF1aWNrIFNvcnQgYW5k DQogICAgbWF0cml4IG11bHRpcGxpY2F0aW9uIGhhdmUgbm93IGJlZW4gYWRk ZWQgdG8gU2FuZG1hcmshDQoNCiAg4oCiIFtvY2FtbC1iZW5jaC9zYW5kbWFy ayM3Nl0gUHJvbW90ZSBwYWNrYWdlcy4gVW5icmVhayBDSS4NCg0KICAgIFRo ZSBDb250aW51b3VzIEludGVncmF0aW9uIGJ1aWxkIGNhbiBub3cgZXhlY3V0 ZSBhZnRlciB1cGRhdGluZyBhbmQNCiAgICBwcm9tb3RpbmcgcGFja2FnZXMg aW4gU2FuZG1hcmsuDQoNCiAg4oCiIFtvY2FtbC1iZW5jaC9zYW5kbWFyayM3 OF0gQWRkIHN1cHBvcnQgZm9yIGNvbGxlY3RpbmcgaW5mb3JtYXRpb24NCiAg ICBhYm91dCBHQyBwYXVzZXRpbWVzIG9uIHRydW5rDQoNCiAgICBUaGUgUFIg bm93IGhlbHBzIHByb2Nlc3MgdGhlIHJ1bnRpbWUgbG9nIGFuZCBwcm9kdWNl cyBhIGAuYmVuY2gnDQogICAgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBHQyBw YXVzZSB0aW1lcy4gVGhpcyB3b3JrcyBvbiBib3RoIHN0b2NrDQogICAgT0Nh bWwgYW5kIGluIE11bHRpY29yZSBPQ2FtbC4NCg0KICDigKIgW29jYW1sLWJl bmNoL3NhbmRtYXJrIzg2XSBSZWFkIGFuZCB3cml0ZSBJcm1pbiBiZW5jaG1h cmsNCg0KICAgIEEgdGVzdCBmb3IgbWVhc3VyaW5nIElybWluJ3MgbWVyZ2Ug Y2FwYWJpbGl0aWVzIHdpdGggR2l0IGFzIGl0cw0KICAgIGZpbGVzeXN0ZW0g aXMgYmVpbmcgdGVzdGVkIHdpdGggZGlmZmVyZW50IHJlYWQgYW5kIHdyaXRl IHJhdGVzLg0KDQogIOKAoiBBIG51bWJlciBvZiBvdGhlciBwYXJhbGxlbCBi ZW5jaG1hcmtzIGxpa2UgTWVyZ2Ugc29ydCwNCiAgICBGbG95ZC1XYXJzaGFs bCBtYXRyaXgsIHByaW1lIG51bWJlciBnZW5lcmF0aW9uLCBwYXJhbGxlbCBt YXAsIGZpbHRlcg0KICAgIGV0LiBhbC4gaGF2ZSBiZWVuIGFkZGVkIHRvIFNh bmRtYXJrLg0KDQoNCltTYW5kbWFya10gPGh0dHA6Ly9iZW5jaDIub2NhbWxs YWJzLmlvLz4NCg0KW29jYW1sLWJlbmNoL3NhbmRtYXJrIzczXQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5jaC9zYW5kbWFyay9wdWxsLzczPg0K DQpbb2NhbWwtYmVuY2gvc2FuZG1hcmsjNzZdDQo8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLWJlbmNoL3NhbmRtYXJrL3B1bGwvNzY+DQoNCltvY2FtbC1i ZW5jaC9zYW5kbWFyayM3OF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt YmVuY2gvc2FuZG1hcmsvcHVsbC83OD4NCg0KW29jYW1sLWJlbmNoL3NhbmRt YXJrIzg2XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5jaC9zYW5k bWFyay9wdWxsLzg2Pg0KDQoNCkRvY3VtZW50YXRpb24NCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBFeGFtcGxl cyB1c2luZyBkb21haW5zbGliIGFuZCBtb2RpZnlpbmcgRG9tYWlucyBhcmUg Y3VycmVudGx5IGJlaW5nDQogICAgd29ya2VkIHVwb24gZm9yIGEgY2hhcHRl ciBvbiBQYXJhbGxlbCBQcm9ncmFtbWluZyBmb3IgTXVsdGljb3JlDQogICAg T0NhbWwuIFdlIHdpbGwgcmVsZWFzZSBhbiBlYXJseSBkcmFmdCB0byB0aGUg Y29tbXVuaXR5IGZvciB5b3VyDQogICAgZmVlZGJhY2suDQoNCg0KT0NhbWwN CuKVjOKVjOKVjOKVjOKVjA0KDQogIE9uZSBQUiBvcGVuZWQgdG8gT0NhbWwg dGhpcyBtb250aCwgd2hpY2ggZml4ZXMgdXAgdGhlIG1hcnNoYWxsaW5nDQog IHNjaGVtZSB0byBiZSBtdWx0aWNvcmUgY29tcGF0aWJsZS4gVGhlIGNvbXBs ZXRlIHNldCBvZiBbdXBzdHJlYW0NCiAgbXVsdGljb3JlIHByZXJlcXVpc2l0 ZXNdIGFyZSBsYWJlbGxlZCBpbiB0aGUgY29tcGlsZXIgaXNzdWUgdHJhY2tl ci4NCg0KICDigKIgW29jYW1sL29jYW1sIzkyOTNdIFVzZSBhZGRybWFwIGhh c2ggdGFibGUgZm9yIG1hcnNoYWxpbmcNCg0KICAgIFRoZSBoYXNoIHRhYmxl IChhZGRybWFwKSBpbXBsZW1lbnRhdGlvbiBmcm9tIE11bHRpY29yZSBPQ2Ft bCBoYXMNCiAgICBiZWVuIHBvcnRlZCB0byB1cHN0cmVhbSBPQ2FtbCB0byBh dm9pZCB1c2luZyBHQyBtYXJrIGJpdHMgdG8NCiAgICByZXByZXNlbnQgdmlz aXRlZG5lc3MuDQoNCg0KW3Vwc3RyZWFtIG11bHRpY29yZSBwcmVyZXF1aXNp dGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9sYWJlbHMv bXVsdGljb3JlLXByZXJlcXVpc2l0ZT4NCg0KW29jYW1sL29jYW1sIzkyOTNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC85MjkzPg0K DQoNCkFjcm9ueW1zDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDi gKIgQ1RGOiBDb21tb24gVHJhY2UgRm9ybWF0DQogIOKAoiBDSTogQ29udGlu dW91cyBJbnRlZ3JhdGlvbg0KICDigKIgR0M6IEdhcmJhZ2UgQ29sbGVjdG9y DQogIOKAoiBQUjogUHVsbCBSZXF1ZXN0DQoNCiAgQXMgYWx3YXlzLCBtYW55 IHRoYW5rcyB0byBvdXIgZmVsbG93IE9DYW1sIGRldmVsb3BlcnMgYW5kIHVz ZXJzIHdobw0KICBoYXZlIHJldmlld2VkIG91ciBjb2RlLCByZXBvcnRlZCBi dWdzIG9yIG90aGVyd2lzZSBhc3Npc3RlZCB0aGlzDQogIG1vbnRoLg0KDQoN Ck9wbG90IDAuNTANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LW9wbG90LTAtNTAvNTIzNS8xPg0KDQoNCnNhbmV0dGUgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VjZSB0aGUgcmV2aXZhbCBv ZiB0aGUgYG9wbG90JyBsaWJyYXJ5Lg0KDQogIElmIHlvdSBldmVyIHdhbnRl ZCB0byBxdWlja2x5IGRyYXcgdGhlIGdyYXBoIG9mIGFuIGludHJpZ3VpbmcN CiAgbWF0aGVtYXRpY2FsIGZ1bmN0aW9uLCBhbmltYXRlIGl0IGJ5IHZhcnlp bmcgYSBwYXJhbWV0ZXIsIG9yIGV4cGxvcmUgYQ0KICAzRCBzdXJmYWNlLCB3 aXRob3V0IGxlYXZpbmcgeW91ciBmYXZvcml0ZSBwcm9ncmFtbWluZyBsYW5n dWFnZSwgdGhlbg0KICBgb3Bsb3QnIGlzIGZvciB5b3UuDQoNCiAgSWYgeW91 J3JlIGZhbWlsaWFyIHdpdGggTGFUZVggYW5kIHdhbnQgdG8gcHJvZHVjZSBu aWNlIG1hdGhlbWF0aWNhbA0KICBncmFwaGljcyBkZWNvcmF0ZWQgd2l0aCBM YVRlWCBmb3JtdWxhcywgdGhhdCB5b3UgY2FuIHZpZXcgb25zY3JlZW4sDQog IGV4cG9ydCB0byBpbWFnZXMgb3IgdmVjdG9yIGdyYXBoaWNzIChwZGYsIGVw cykgdGhlbiBgb3Bsb3QnIGlzIGV2ZW4NCiAgbW9yZSBmb3IgeW91IQ0KDQog IOKAoiBJbnN0YWxsYXRpb246IGBvcGFtIGluc3RhbGwgb3Bsb3QnDQogIOKA oiBkb2N1bWVudGF0aW9uOg0KICAgIDxodHRwczovL3NhbmV0dGUuZ2l0aHVi LmlvL29wbG90L29wbG90L09wbG90L2luZGV4Lmh0bWw+DQogIOKAoiBzb3Vy Y2UgY29kZSwgaXNzdWVzLCBldGM6IDxodHRwczovL2dpdGh1Yi5jb20vc2Fu ZXR0ZS9vcGxvdD4NCg0KICBEcmF3aW5nIGlzIGhhcmR3YXJlIGFjY2VsZXJh dGVkIChvcGVuZ2wpIHRoYW5rcyB0byB0aGUgdmVuZXJhYmxlDQogIGBvY2Ft bHNkbCcgYW5kIGBsYWJsZ2wnIGxpYnJhcmllcy4gSSdtIGdsYWQgdGhleSBz dGlsbCB3b3JrIHBlcmZlY3RseS4NCg0KICBIYXBweSBwbG90dGluZy4NCg0K DQpzb3VwYXVsdDogYSBzdGF0aWMgd2Vic2l0ZSBnZW5lcmF0b3IgYmFzZWQg b24gSFRNTCByZXdyaXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNvdXBhdWx0LWEtc3RhdGljLXdl YnNpdGUtZ2VuZXJhdG9yLWJhc2VkLW9uLWh0bWwtcmV3cml0aW5nLzQxMjYv MTI+DQoNCg0KRGFuaWlsIEJhdHVyaW4gYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBbMS45LjBdIHJlbGVhc2UgaXMgbm93 IGF2YWlsYWJsZS4NCg0KICDigKIgYC0taW5kZXgtb25seScgb3B0aW9uIHRo YXQgbWFrZXMgc291cGF1bHQgZHVtcCB0aGUgc2l0ZSBtZXRhZGF0YSB0bw0K ICAgIEpTT04gYW5kIHN0b3AgYXQgdGhhdA0KICDigKIgTWV0YWRhdGEgZXh0 cmFjdGlvbiBhbmQgaW5kZXggZ2VuZXJhdGlvbiBjYW4gbm93IGJlIGxpbWl0 ZWQgdG8NCiAgICBzcGVjaWZpYyBwYWdlcy9zZWN0aW9uL3BhdGggcmVnZXhl cywganVzdCBsaWtlIHdpZGdldHMNCiAg4oCiIFRoZSBgcHJlcHJvY2Vzc19l bGVtZW50JyB3aWRnZXQgbm93IHN1cHBvcnRzIGEgbGlzdCBvZiBzZWxlY3Rv cnMsDQogICAgZS5nLiBgc2VsZWN0b3IgPSBbImNvZGUiLCAicHJlIGNvZGUi XScuDQogIOKAoiBQbHVnaW4gQVBJIG5vdyBoYXMgZnVuY3Rpb25zIGZvciBy dW5uaW5nIGV4dGVybmFsIHByb2dyYW1zLCBhbmQgc29tZQ0KICAgIG1vcmUg ZWxlbWVudCB0cmVlIGFjY2VzcyBmdW5jdGlvbnMuDQogIOKAoiBDU1Mgc2Vs ZWN0b3IgcGFyc2UgZXJyb3JzIGFyZSBub3cgaGFuZGxlZCBncmFjZWZ1bGx5 IChbbGFtYmRhc291cA0KICAgIFBSIzMxXSkuDQogIOKAoiBUaGUgYHRpdGxl JyB3aWRnZXQgbm93IGNvcnJlY3RseSByZW1vdmVzIEhUTUwgdGFncyBmcm9t IHRoZSBzdXBwb3NlZA0KICAgIHRpdGxlIHN0cmluZyBhbmQgZG9lc24ndCBh ZGQgZXh0cmEgd2hpdGVzcGFjZSAoZml4ZXMgYnkgW1Rob21hcw0KICAgIExl dGFuXSkuDQoNCg0KWzEuOS4wXSA8aHR0cHM6Ly9zb3VwYXVsdC5uZW9jaXRp ZXMub3JnL2Jsb2cvc291cGF1bHQtMS45LjAtcmVsZWFzZS8+DQoNCltsYW1i ZGFzb3VwIFBSIzMxXSA8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRyb24vbGFt YmRhc291cC9wdWxsLzMxPg0KDQpbVGhvbWFzIExldGFuXSA8aHR0cHM6Ly9z b2FwLmNvZmZlZS9+bHRobXMvPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwg eW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAg aXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVd IG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJ ZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBt YWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxh biBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2 ZV0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNT IGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3Rz LmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0Fs YW4gU2NobWl0dF0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 25 to March = 03, 2020.

OCaml 4.10 released

Contnuing this thread, Anil Madhavapeddy said

Indeed, many thanks to everyone who leapt in to make 4.10 ready in opam in = such record time! Just a note that the CI Docker images are now also rebui= lt for x86_64, arm32/64 and ppc64le to reflect the 4.10 release, so feel free to s= tart using them. http= s://hub.docker.com/r/ocaml/opam2/tags

Summary of the Dune retreat 2020

J=C3=A9r=C3=A9mie Dimino announced

We recently organised the second Dune retreat. If you'd like to see what is= happening in the Dune world at the moment, please find a summary of what we discussed and work on in this blog post!

https://dune.build/b= log/dune-retreat-2020/

Multicore OCaml: Feb 2020 update

Anil Madhavapeddy announced

Welcome to the February 2020 news update from the Multicore OCaml team, spr= ead across the UK, India, France and Switzerland! This follows on from last month's update, and has been put together by @shakthimaan and @kayceesr= k.

The releas= e of OCaml 4.10.0 has successfully pushed out some prerequisite feature= s into the upstream compiler. Our work in February has focussed on getting the multicore OCaml= branch "feature complete" with respect to the complete OCaml language, and= doing extensive benchmarking and stress testing to test our two minor heap implem= entations.

To this end, a number of significant patches have been merged into the Multicore OCaml = trees that essentially provide complete coverage of the language features. We encourag= e you to test the same for regressions and provide any improvements or repo= rt shortcomings to us. There are ongoing OCaml PRs and issues that are also un= der review, and we hope to complete those for the 4.11 release cycle. A new= set of parallel benchmarks have been added to our Sandmark benchmarking suite (live instance here), including enhancements to= the build setup.

Multicore OCaml

  • Completed

    The following PRs have been merged into Multicore OCaml:

    • oca= ml-multicore/ocaml-multicore#281 Introduce Forcing_tag to fix concurrency bug with lazy values

      A Forcing_tag is used to implement lazy values to handle a con= currency bug. It behaves like a locked bit, and any concurrent access by a = mutator will raise an exception on that domain.

    • oca= ml-multicore/ocaml-multicore#282 Safepoints

      A preliminary version of safe points has been merged into the Multicore OCa= ml trees. ocaml-multicore/ocaml-multicore#187 also contains more discuss= ion and background about how coverage can be improved in future PRs.

    • oca= ml-multicore/ocaml-multicore#285 Introduce an 'opportunistic' major collection slice

      An "opportunistic work credit" is implemented in this PR which forms a basi= s for doing mark and sweep work while waiting to synchronise with other dom= ains.

    • oca= ml-multicore/ocaml-multicore#286 Do fflush and variable args in caml_gc_log

      The caml_gc_log() function has been updated to ensure that fflush is invoked only when GC logging is enabled.

    • oca= ml-multicore/ocaml-multicore#287 Increase EVENT_BUF_SIZE

      During debugging with event trace data it is useful to reduce the buffer fl= ush times, and hence the EVENT_BUF_SIZE has now been increased.

    • oca= ml-multicore/ocaml-multicore#288 Write barrier optimization

      This PR closes the regression for the chameneos_redux_lwt benc= hmarking in Sandmark by using intnat to avoid sign extensions = and cleans up write_barrier to improve overall performance.

    • oca= ml-multicore/ocaml-multicore#290 Unify sweep budget to be in word size

      The PR updates the sweep work units to all be in word size. This is to hand= le the differences between the budget for setup, sweep and for large alloca= tions in blocks.

  • Ongoing
    • A lot of work is ongoing for the implementation of a synchronised minor= garbage collector for Multicore OCaml, including benchmarking for the stop= -the-world (stw) branch. We will publish the results of this in a future u= pdate, as we are assembling a currently comprehensive evaluation of the run= time against the mainstream runtime.

Benchmarking

Sandmark now has support to run= parallel benchmarks. We can also now about GC latency measurements for bot= h stock OCaml and Multicore OCaml compiler.

  • ocaml-bench/san= dmark#73 More parallel benchmarks

    A number of parallel benchmarks such as N-body, Quick Sort and matrix multi= plication have now been added to Sandmark!

  • ocaml-bench/san= dmark#76 Promote packages. Unbreak CI.

    The Continuous Integration build can now execute after updating and promoti= ng packages in Sandmark.

  • ocaml-bench/san= dmark#78 Add support for collecting information about GC pausetimes on trunk

    The PR now helps process the runtime log and produces a .bench= file that captures the GC pause times. This works on both stock OCaml and = in Multicore OCaml.

  • ocaml-bench/san= dmark#86 Read and write Irmin benchmark

    A test for measuring Irmin's merge capabilities with Git as its filesystem = is being tested with different read and write rates.

  • A number of other parallel benchmarks like Merge sort, Floyd-Warshall m= atrix, prime number generation, parallel map, filter et. al. have been adde= d to Sandmark.

Documentation

  • Examples using domainslib and modifying Domains are currently being wor= ked upon for a chapter on Parallel Programming for Multicore OCaml. We will= release an early draft to the community for your feedback.

OCaml

One PR opened to OCaml this month, which fixes up the marshalling scheme to= be multicore compatible. The complete set of upstream multicore prerequisites are labelled in the compiler issue tracker.

  • ocaml/ocaml#9293 U= se addrmap hash table for marshaling

    The hash table (addrmap) implementation from Multicore OCaml has been porte= d to upstream OCaml to avoid using GC mark bits to represent visitedness.

Acronyms

  • CTF: Common Trace Format
  • CI: Continuous Integration
  • GC: Garbage Collector
  • PR: Pull Request

As always, many thanks to our fellow OCaml developers and users who have re= viewed our code, reported bugs or otherwise assisted this month.

Oplot 0.50

sanette announced

I'm happy to annouce the revival of the oplot library.

If you ever wanted to quickly draw the graph of an intriguing mathematical = function, animate it by varying a parameter, or explore a 3D surface, witho= ut leaving your favorite programming language, then oplot is for = you.

If you're familiar with LaTeX and want to produce nice mathematical graphic= s decorated with LaTeX formulas, that you can view onscreen, export to imag= es or vector graphics (pdf, eps) then oplot is even more for you!

Drawing is hardware accelerated (opengl) thanks to the venerable ocam= lsdl and lablgl libraries. I'm glad they still work per= fectly.

Happy plotting.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

1.9= .0 release is now available.

  • --index-only option that makes soupault dump the site meta= data to JSON and stop at that
  • Metadata extraction and index generation can now be limited to specific= pages/section/path regexes, just like widgets
  • The preprocess_element widget now supports a list of selec= tors, e.g. selector =3D ["code", "pre code"].
  • Plugin API now has functions for running external programs, and some mo= re element tree access functions.
  • CSS selector parse errors are now handled gracefully (lambdasoup PR#31).
  • The title widget now correctly removes HTML tags from the = supposed title string and doesn't add extra whitespace (fixes by Thomas Letan).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0D36E7EEA4 for ; Tue, 10 Mar 2020 15:29:10 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,537,1574118000"; d="scan'208,217";a="341895173" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Mar 2020 15:28:56 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 10 Mar 2020 15:28:56 +0100 Message-ID: <87eeu0i8rb.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 03 to 10, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Non opam workflows First release of metapp OCaml 4.10 released Transept 0.1.0: Generalised Parser Combinators Multicore OCaml: Feb 2020 update owl 0.8.0 and 0.9.0 released Parser combinators vs. parser preprocessors? Dune 2.4.0 Tyxml 4.4.0 first release of oplsr: an OCaml wrapper to the pls R package - Partial Lea= st Squares (PLS) regression Old CWN Non opam workflows =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Manas asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 Very recently, I learnt that there is a significant chunk of users in the OCaml community that does not use opam to install packages. As a small initiative to contribute to tooling, I want to ensure what I build is compatible with these workflows - workflows I'm not familiar with myself. I'd love to learn more - what does it look like? How do you setup your compiler, dune and merlin (and/or soon ocamllsp)? How do you configure your editor to find them and what would make it easier to do so? I'm told of Duniverse as one tool that being used in these non-opam workflows. Are there any more popular ones out there? Th=C3=A9o Zimmermann replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am one of these people. I mostly rely on Nix, whose package repository nixpkgs provides package sets for all (relatively recent) versions of OCaml. These package sets are not generally as complete as what you can find on opam, so it sometimes happens that I open a PR on the nixpkgs repository to add a new package (and in the meantime I use my local updated copy of the nixpkgs repo). You can see the list of available OCaml packages at: (This is for the default OCaml version, currently 4.07 in nixpkgs-unstable. Other package sets are called `ocaml-ng.ocamlPackages_4_0X' but are not shown in this web search.) Most OCaml packages are available at a single version in nixpkgs (even though you can choose your version of OCaml). To gain more flexibility on the exact version I use in one of my project, I am planning to test Duniverse. At that point, I would rely on Duniverse for library dependencies, but I would still rely on Nix to install OCaml, findlib, Dune, Duniverse (I'll have to take care of packaging it), utop, merlin, or ocamlformat. Nix is pretty straightforward to use. You generally provide a `default.nix' at the root of your repository, and it will list the dependencies that you use. When you want to go develop your project, you just enter a special shell (with the `nix-shell' command) and you are in an environment where the tools you need are in `PATH' and the libraries you need are in `OCAMLPATH'. There's just one tool that I needed special configuration for: `ocamlformat' (especially because some projects use it and some do not). When I use it, my `default.nix' contains: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 shellHook =3D '' =E2=94=82 export OCAMLFORMAT_LOCATION=3D${ocamlformat} =E2=94=82 ''; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which will export an environment variable when I enter the shell. And my `.emacs' contains: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (setq ocamlformat-location (getenv "OCAMLFORMAT_LOCATION")) =E2=94=82 (when (> (length ocamlformat-location) 0) =E2=94=82 (add-to-list 'load-path (concat ocamlformat-location "/share/e= macs/site-lisp")) =E2=94=82 (require 'ocamlformat) =E2=94=82 (add-hook 'tuareg-mode-hook =E2=94=82 (lambda () (add-hook 'before-save-hook 'ocamlformat-before-= save)))) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I want to ensure what I build is compatible with these workflows If you mean as a library author, then all you have to ensure is that you use Dune as the build system (makes the Duniverse workflow better, and makes it easier to package your library in nixpkgs, cf. `buildDunePackage' documented at ). Rwmjones also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You might want to check out the Fedora OCaml packages. Unfortunately I don't have a convenient way to link to the whole list, but if you look at all the OCaml packages here: * and then if you substitute the `ocaml-' in two places in this URL: (example showing `ocaml-re' package), you can see how we build and package them in the `%prep', `%build' and `%install' sections. And yes, please make sure your software doesn't depend on opam. Building everything in your home directory is not suitable for enterprise software distribution. First release of metapp =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thierry Martinez announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am happy to announce the first release of `metapp', yet another preprocessor for OCaml. Similarly to [`ppx_optcomp'], `metapp' is a PPX rewriter. But instead of introducing a specific DSL for preprocessor directives, `metapp' provides a `[%meta ...]' extension, where the dots `...' are arbitrary OCaml expressions that are substituted at compile-time by the AST nodes they evaluate into. These expressions build AST nodes either by (anti-)quoting some code directly, or by using `compiler-libs' ([`Parsetree'], [`Ast_helper'], =E2=80=A6). In particular, this preprocessor is easy to use for conditional compilation, and is an alternative to [`cppo'] and [`ppx_optcomp']. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let option_get o =3D =E2=94=82 [%meta if Sys.ocaml_version >=3D "4.08.0" then =E2=94=82 [%e Option.get o] =E2=94=82 else =E2=94=82 [%e match o with =E2=94=82 | None -> invalid_arg "option_get" =E2=94=82 | Some x -> x]] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In this example, the code between `[%e ... ]' is "anti-quoted": it is the code that is inserted (conditionally) in the rewritten module. Of course, the anti-quoted code can contain itself some `[%meta ...]' code. `[%meta ...]' can even itself contain other levels of `[%meta ...]' code for multi-stage programming. An example of usage of `metapp' is the [`metaquot'] package, which implements the same quoters as `ppx_tools.metaquot': `[%expr ...]', `[%type: ...]', etc. These quoters are implemented by meta-programming: the meta-code introspects `Parsetree.cmi' from `compiler-libs' to generate the code matching the current OCaml version. [`ppx_optcomp'] [`Parsetree'] [`Ast_helper'] [`cppo'] [`metaquot'] Rapha=C3=ABl Proust added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 To potentially save a few second to the next readers: seems to be the repo where it is hosted. Thierry Martinez then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Thanks, @raphael-proust! The package is also available via opam: `opam install metapp' (and `metaquot' is available via opam as well). OCaml 4.10 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: octachron continued this thread =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Merlin team has just released a preview version of Merlin which is compatible with 4.10.0 (Merlin is an editor service that provides modern IDE features for OCaml) . This is a preview version: =E2=80=A2 the support for short-path is disabled =E2=80=A2 only OCaml 4.10.0 is supported in this preview It can be installed via opam with the usual =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install merlin =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Transept 0.1.0: Generalised Parser Combinators =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Didier Plaindoux announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I=E2=80=99m happy to announce the first release of Transept an OCaml implementation of generalized parsers combinators. This implementation has been inspired by a 19 years old paper - written by Daan Leijen and Erik Meijer - titled =E2=80=9CParsec: Direct S= tyle Monadic Parser Combinators For The Real World=E2=80=9D [1]. The current implementation provides basic combinators dedicated to char, chars recognition but also conjunction, sequence, repetition and more. Since the current design relies on the abstract definition of manipulated element most of the parsers are generic and can be used with streams of chars or something else. Finally, with this library, I wanted to share my love of OCaml modules =F0=9F=A4=97 Opam: [1] Didier Wenzek then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It good to see yet another parser combinator for OCaml, even if this makes more difficult the choice of one of them. I believe this highlights how well OCaml shines for this kind of applications where both high-level expressiveness and performance matter. [`angstrom'] is one the alternatives and provides a comparison with others. It would be good to position `transept' here. There is also a more recent article with a radically new approach: [A Typed, Algebraic Approach to Parsing] by Neelakantan R. Krishnaswami and Jeremy Yallop - PLDI 2019. This paper proposes a [library of parser combinators] for context-free expressions, an algebraic presentation of the context-free languages. The key points are =E2=80=A2 the use of types to statically reject any language which cannot= be parsed unambiguously and linearly; =E2=80=A2 the use of staging, with OcamlBER, to produce parsers which performance are close to those of hand-written code. [`angstrom'] [A Typed, Algebraic Approach to Parsing] [library of parser combinators] Multicore OCaml: Feb 2020 update =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Rwmjones asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi Anil (or anyone!). Is there a place I can find more about breaking changes that might be made to C extensions? As you may know we have a lot of C code which interfaces with OCaml, both as ordinary extensions written in C, but also embedding OCaml in C programs (although that's much more rare), and I'd like a heads up about what's likely to change. Anil Madhavapeddy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi @rwmjones! In a nutshell: no breaking C changes. The longer version is that we implemented two different minor collectors in order to evaluate various tradeoffs systematically: =E2=80=A2 a concurrent minor collector that requires a read barrier and s= ome C API changes in order to create more safe points =E2=80=A2 a stop-the-world minor collector that doesn't require a read ba= rrier and no extra C API changes, but would probably cause longer pauses The good news is that our STW collector scales up much better than we expected (tested to 24 cores), and so our first domains patchset will almost certainly use that version now. We expect to shift to a concurrent (and possibly pauseless) collection algorithm at some future point, but in terms of upstreaming it looks like we should be able to delay any C API changes until after the first version of multicore has landed. Do you have any nice standalone candidate programs using the C FFI we could add to Sandmark? owl 0.8.0 and 0.9.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Marcello Seri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to announce *two* new releases of `owl': a dedicated system for scientific and engineering computing in OCaml. Since our previous announcement in July last year, there has been an [enormous amount of work] going on to cleanup and extend owl's internals and its interfaces. In this period we have been trying to release often and keep disruption to a minimum. Owl 0.8.0 and 0.9.0 are exceptional in this respect: =E2=80=A2 `owl.0.8.0': =E2=80=A2 the discrepancy between `owl-base' (pure ocaml) and `owl' (li= nks cblas/lapacke) interfaces started becoming a problem in few places. In this release many interfaces have been unified and reused. The algodiff module has undergone a similar refactoring. Although most users should be shielded from these changes, they may break existing code, requiring an upper bound on owl and some localized updates. This should mostly boil down to changes like =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 -module CGraph_D =3D Owl_computation_engine.Make_Graph (Owl= _computation_cpu_device.Make (Dense.Ndarray.D)) =E2=94=82 +module CGraph_D =3D Owl_computation_engine.Make_Graph (Owl= _computation_cpu_device.Make (Owl_algodiff_primal_ops.D)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 this is the last edition supporting OCaml compiler versions < 4.10.0 (more on this later). =E2=80=A2 `owl.0.9.0': the main difference between `0.8.0' and `0.9.0' is= that owl now requires OCaml 4.10.0. This release of OCaml introduces *extended indexing operators*. With them we can now write things like `x.%{0;3}' (for indexing) and `x.${[0:2];[2;4]}' (for slicing) instead of the more cumbersome `x.%{[|0;3|]}' and `x.${[[0:2];[2;4]]}'. The project is thoroughly documented at [ocaml.xyz ] where you can find multiple examples of use. A lot of work has (and is) been going into improving the documentation, you can find the results in the new [owl book]: . This is currently targeting the development version of owl, so using `master' or `0.9.0' is the best bet if you want to try the examples out. One of the issue of the old documentation was that it was getting stale very fast: the book is reusing some of the infrastructure of RWO, so all examples get recompiled and retested continuously to ensure their correctness. As a final note, we would like to send a huge thank to the [OCaml Software Foundation], see also the [announcement made on this forum], which has given us some funding that will support a retreat of the maintainers and a development sprint that will take place at the end of March. We meant to announce the retreat and sprint for some time now, but the size and publicity of the event may depend on updates to the various governmental and institutional recommendation in regards to COVID-19 spreading. If a public event will be possible, we will make a separate announce on this forum. We want to also thank all the contributors for the increasing number of comments, fixes and discussions that are helping us shape the next releases of owl. The Owl Dev Team [enormous amount of work] [ocaml.xyz ] [owl book] [OCaml Software Foundation] [announcement made on this forum] Parser combinators vs. parser preprocessors? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Continuing this thread, yallop said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80 Gasche said: Combinators also describe a grammar; they can build a representation that is then processed. I think it would be perfectly reasonable to provide combinators to describe a L(AL)R grammar, and then a function from such a grammar to a parsing automaton, along with the result of various analyses. This would solve the =E2=80=9Cadditional tooling=E2=80=9D problem of typical parser generators, and also the =E2=80=9Clack of conflict analysis=E2=80=9D problem of typical parser combinator libraries. But it may require support for staging for performance reasons. Readers of this thread may be interested in the [asp] (*algebraic staged parsing*) library (also described in the [Transept post] linked above), which is built on an approach along the lines @gasche describes: =E2=80=A2 combinators that describe a grammar (using context-free express= ions) =E2=80=A2 an analysis (formulated as a type system) that ensures determin= istic parsing =E2=80=A2 staging to eliminate performance overhead The interface is pretty standard, with combinators for alternation, sequencing, etc., and performance is quite good (better than `ocamlyacc' on our benchmarks). There's a paper, [A typed algebraic approach to parsing], that describes the design in more detail. Chet_Murthy said: Also, I=E2=80=99m personally a massive LL(1) (over LALR) bigot Grammars built using `asp' are essentially LL(1). (The weasel word "essentially" isn't hiding much here, but the paper has the details.) [asp] [Transept post] [A typed algebraic approach to parsing] Dune 2.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune team, I'm pleased to announce the release of dune 2.4.0. This releases features support for [mdx], an interesting take on the notebook paradigm by the RWO team. This release also includes a crucial fix to polling mode which makes it usable in environments with finite memory :slight_smile:. Happy hacking! [mdx] 2.4.0 (06/03/2020) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 Add `mdx' extension and stanza version 0.1 (#3094, @NathanReb) =E2=80=A2 Allow to make Odoc warnings fatal. This is configured from the = `(env ...)' stanza. (#3029, @Julow) =E2=80=A2 Fix separate compilation of JS when findlib is not installed. (#3177, @nojb) =E2=80=A2 Add a `dune describe' command to obtain the topology of a dune workspace, for projects such as ROTOR. (#3128, @diml) =E2=80=A2 Add `plugin' linking mode for executables and the `(embed_in_plugin_libraries ...)' field. (#3141, @nojb) =E2=80=A2 Add an `%{ext_plugin}' variable (#3141, @nojb) =E2=80=A2 Dune will no longer build shared objects for stubs if `supports_shared_libraries' is false (#3225, fixes #3222, @rgrinberg) =E2=80=A2 Fix a memory leak in the file-watching mode (`dune build -w') (#3220, @snowleopard and @aalekseyev) Tyxml 4.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Gabriel Radanne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have the pleasure to announce the release of [TyXML 4.4.0], with special Reason support! [TyXML] is a library for building statically correct HTML and SVG documents. TyXML provides a set of combinators which use the OCaml type system to ensure the validity of the HTML. TyXML is now a stable library and this release comes with a few newly supported elements and attributes (such as ARIA elements) and associated bug fixes. However, the main novelty of this release is a long awaited feature: the support for [Reason=E2=80=99s JSX syntax] in the brand new `tyxml-jsx' package. See the complete announcement for code examples and details: [TyXML 4.4.0] [TyXML] [Reason=E2=80=99s JSX syntax] first release of oplsr: an OCaml wrapper to the pls R package - Partial Lea= st Squares (PLS) regression =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: UnixJunkie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 It is my great pleasure to release one more hackish wrapper to use some R package from within OCaml: For some background: Cf. test.ml in the sources for a usage example. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 03 to 10, 2020.

Non opam workflows

Manas asked

Very recently, I learnt that there is a significant chunk of users in the O= Caml community that does not use opam to install packages. As a small initi= ative to contribute to tooling, I want to ensure what I build is compatible with = these workflows - workflows I'm not familiar with myself.

I'd love to learn more - what does it look like? How do you setup your comp= iler, dune and merlin (and/or soon ocamllsp)? How do you configure your edi= tor to find them and what would make it easier to do so?

I'm told of Duniverse as one tool that being used in these non-opam workflo= ws. Are there any more popular ones out there?

Th=C3=A9o Zimmermann replied

I am one of these people. I mostly rely on Nix, whose package repository ni= xpkgs provides package sets for all (relatively recent) versions of OCaml. = These package sets are not generally as complete as what you can find on opam, so= it sometimes happens that I open a PR on the nixpkgs repository to add a n= ew package (and in the meantime I use my local updated copy of the nixpkgs rep= o).

You can see the list of available OCaml packages at: https://nixos.org/nixos/packages.html?channel=3Dnixpkgs-unstable&= query=3DocamlPackages (This is for the default OCaml version, currently 4.07 in nixpkgs-unstable.= Other package sets are called ocaml-ng.ocamlPackages_4_0X but= are not shown in this web search.)

Most OCaml packages are available at a single version in nixpkgs (even thou= gh you can choose your version of OCaml). To gain more flexibility on the e= xact version I use in one of my project, I am planning to test Duniverse. At tha= t point, I would rely on Duniverse for library dependencies, but I would st= ill rely on Nix to install OCaml, findlib, Dune, Duniverse (I'll have to take c= are of packaging it), utop, merlin, or ocamlformat.

Nix is pretty straightforward to use. You generally provide a default= .nix at the root of your repository, and it will list the dependenci= es that you use. When you want to go develop your project, you just enter a special shell (w= ith the nix-shell command) and you are in an environment where= the tools you need are in PATH and the libraries you need are in OCAML= PATH.

There's just one tool that I needed special configuration for: ocamlf= ormat (especially because some projects use it and some do not). Whe= n I use it, my default.nix contains:

shellHook =3D ''
  export OCAMLFORMAT_LOCATION=3D${ocamlformat}
'';

which will export an environment variable when I enter the shell.

And my .emacs contains:

(setq ocamlformat-location (getenv "OCAMLFORM=
AT_LOCATION"))
(when (> (length ocamlformat-loca=
tion) 0)
 (add-to-list 'load-path (concat ocamlformat-location "/share/emacs/site-lisp"))
 (require 'ocamlformat)
 (add-hook 'tuareg-mode-hook
           (lambda () (add-hook 'bef=
ore-save-hook 'ocamlformat-before-save))))

I want to ensure what I build is compatible with these workflows

If you mean as a library author, then all you have to ensure is that you us= e Dune as the build system (makes the Duniverse workflow better, and makes = it easier to package your library in nixpkgs, cf. buildDunePackage documented at https://nixos.org/nixpkgs/manual/#sec-language-ocaml).

Rwmjones also replied

You might want to check out the Fedora OCaml packages.

Unfortunately I don't have a convenient way to link to the whole list, but = if you look at all the OCaml packages here: https://koji.fedoraproject.org/koji/search?ma= tch=3Dglob&type=3Dpackage&terms=3Docaml* and then if you substi= tute the ocaml-<packagename> in two places in this URL: https://src.fedoraproject.org/rpms/ocaml-re/blob/master/f/oca= ml-re.spec (example showing ocaml-re package), you can see= how we build and package them in the %prep, %build and %install se= ctions.

And yes, please make sure your software doesn't depend on opam. Building e= verything in your home directory is not suitable for enterprise software distribution.

First release of metapp

Thierry Martinez announced

I am happy to announce the first release of metapp, yet anothe= r preprocessor for OCaml. Similarly to ppx_optcomp, metapp is a P= PX rewriter. But instead of introducing a specific DSL for preprocessor di= rectives, metapp provides a [%meta ...] extension= , where the dots ... are arbitrary OCaml expressions that are = substituted at compile-time by the AST nodes they evaluate into. These expr= essions build AST nodes either by (anti-)quoting some code directly, or by = using compiler-libs (Parsetree, Ast_helper, …).

In particular, this preprocessor is easy to use for conditional compilation= , and is an alternative to cppo and ppx_optcomp.

let option_get o =3D
  [%meta =
if S=
ys.ocaml_version >=3D "4.08.0" then
     [%e Option.get o]
  else
     [%e match o with
     | None -> invalid_arg "option_get"
     | Some x -> x]]

In this example, the code between [%e ... ] is "anti-quoted": = it is the code that is inserted (conditionally) in the rewritten module. O= f course, the anti-quoted code can contain itself some [%meta ...] code. [%meta ...] can even itself contain other levels of [%meta = ...] code for multi-stage programming.

An example of usage of metapp is the metaquot package, which im= plements the same quoters as ppx_tools.metaquot: [%expr = ...], [%type: ...], etc. These quoters are implemented by meta-programming: the meta-code introspect= s Parsetree.cmi from compiler-libs to generate th= e code matching the current OCaml version.

Rapha=C3=ABl Proust added

To potentially save a few second to the next readers: https://github.com/thierry-martinez/metap= p seems to be the repo where it is hosted.

Thierry Martinez then said

Thanks, @raphael-proust! The package is also available via opam: opam= install metapp (and metaquot is available via opam as = well).

OCaml 4.10 released

octachron continued this thread

The Merlin team has just released a preview version of Merlin which is comp= atible with 4.10.0 (Merlin is an editor service that provides modern IDE features for OCaml) .

This is a preview version:

  • the support for short-path is disabled
  • only OCaml 4.10.0 is supported in this preview

It can be installed via opam with the usual

opam install merlin

Transept 0.1.0: Generalised Parser Combinators

Didier Plaindoux announced

I=E2=80=99m happy to announce the first release of Transept an OCaml implem= entation of generalized parsers combinators.

This implementation has been inspired by a 19 years old paper - written by = Daan Leijen and Erik Meijer - titled =E2=80=9CParsec: Direct Style Monadic = Parser Combinators For The Real World=E2=80=9D [1]. The current implementation pro= vides basic combinators dedicated to char, chars recognition but also conju= nction, sequence, repetition and more. Since the current design relies on the abstr= act definition of manipulated element most of the parsers are generic and c= an be used with streams of chars or something else.

Finally, with this library, I wanted to share my love of OCaml modules =F0= =9F=A4=97

Opam: = https://opam.ocaml.org/packages/transept/transept.0.1.0/

[1] https://www.microsoft.com/en-us/research/w= p-content/uploads/2016/02/parsec-paper-letter.pdf

Didier Wenzek then said

It good to see yet another parser combinator for OCaml, even if this makes = more difficult the choice of one of them. I believe this highlights how wel= l OCaml shines for this kind of applications where both high-level expressiveness a= nd performance matter.

angstrom= is one the alternatives and provides a comparison with others. It woul= d be good to position transept here.

There is also a more recent article with a radically new approach: A Typed, Algebraic Approac= h to Parsing by Neelakantan R. Krishnaswami and Jeremy Yallop - PLDI 2019. This paper propo= ses a library of parser co= mbinators for context-free expressions, an algebraic presentation of the context-free lan= guages. The key points are

  • the use of types to statically reject any language which cannot be pars= ed unambiguously and linearly;
  • the use of staging, with OcamlBER, to produce parsers which performance= are close to those of hand-written code.

Multicore OCaml: Feb 2020 update

Continuing this thread, Rwmjones asked

Hi Anil (or anyone!). Is there a place I can find more about breaking chan= ges that might be made to C extensions? As you may know we have a lot of C= code which interfaces with OCaml, both as ordinary extensions written in C, but = also embedding OCaml in C programs (although that's much more rare), and I'= d like a heads up about what's likely to change.

Anil Madhavapeddy replied

Hi @rwmjones! In a nutshell: no breaking C changes. The longer version is t= hat we implemented two different minor collectors in order to evaluate vari= ous tradeoffs systematically:

  • a concurrent minor collector that requires a read barrier and some C AP= I changes in order to create more safe points
  • a stop-the-world minor collector that doesn't require a read barrier an= d no extra C API changes, but would probably cause longer pauses

The good news is that our STW collector scales up much better than we expec= ted (tested to 24 cores), and so our first domains patchset will almost cer= tainly use that version now. We expect to shift to a concurrent (and possibly pau= seless) collection algorithm at some future point, but in terms of upstream= ing it looks like we should be able to delay any C API changes until after the fir= st version of multicore has landed.

Do you have any nice standalone candidate programs using the C FFI we could= add to Sandmark?

owl 0.8.0 and 0.9.0 released

Marcello Seri announced

We are happy to announce two new releases of owl: a ded= icated system for scientific and engineering computing in OCaml.

Since our previous announcement in July last year, there has been an enormous amount= of work going on to cleanup and extend owl's internals and its interfaces.

In this period we have been trying to release often and keep disruption to = a minimum. Owl 0.8.0 and 0.9.0 are exceptional in this respect:

  • owl.0.8.0:
    • the discrepancy between owl-base (pure ocaml) and owl (links cblas/lapacke) interfaces started becoming a problem in few pla= ces. In this release many interfaces have been unified and reused. The algo= diff module has undergone a similar refactoring. Although most users should= be shielded from these changes, they may break existing code, requiring an= upper bound on owl and some localized updates. This should mostly boil dow= n to changes like

      -module CGraph_D =3D Owl_comp=
      utation_engine.Make_Graph (Owl_computation_cpu_device.Make (Dense.Ndarray.D=
      ))
      +module CGraph_D =3D Owl_computation_engine.Make_Graph (Owl_computation_cpu=
      _device.Make (Owl_algodiff_primal_ops.D))
      
    • this is the last edition supporting OCaml compiler versions < 4.10.0= (more on this later).
  • owl.0.9.0: the main difference between 0.8.0 = and 0.9.0 is that owl now requires OCaml 4.10.0. This release = of OCaml introduces extended indexing operators. With them we can no= w write things like x.%{0;3} (for indexing) and x.${[0:2= ];[2;4]} (for slicing) instead of the more cumbersome x.%{[|0;= 3|]} and x.${[[0:2];[2;4]]}.

The project is thoroughly documented at ocaml.= xyz where you can find multiple examples of use.

A lot of work has (and is) been going into improving the documentation, you= can find the results in the new owl book: https://ocaml.xyz/book/toc.html= . This is currently targeting the development version of owl, so using = master or 0.9.0 is the best bet if you want to try the examples out.

One of the issue of the old documentation was that it was getting stale ver= y fast: the book is reusing some of the infrastructure of RWO, so all examp= les get recompiled and retested continuously to ensure their correctness.

As a final note, we would like to send a huge thank to the OCaml Software Foundation, see also the announceme= nt made on this forum, which has given us some funding that will support a retreat of t= he maintainers and a development sprint that will take place at the end of March.

We meant to announce the retreat and sprint for some time now, but the size= and publicity of the event may depend on updates to the various government= al and institutional recommendation in regards to COVID-19 spreading. If a public event will be possible, we will make a separate announce on thi= s forum.

We want to also thank all the contributors for the increasing number of com= ments, fixes and discussions that are helping us shape the next releases of= owl.

The Owl Dev Team

Parser combinators vs. parser preprocessors?

Continuing this thread, yallop said

Gasche said:

Combinators also describe a grammar; they can build a representation that i= s then processed. I think it would be perfectly reasonable to provide combi= nators to describe a L(AL)R grammar, and then a function from such a grammar to a = parsing automaton, along with the result of various analyses. This would so= lve the =E2=80=9Cadditional tooling=E2=80=9D problem of typical parser generators, = and also the =E2=80=9Clack of conflict analysis=E2=80=9D problem of typical= parser combinator libraries. But it may require support for staging for performance reasons.

Readers of this thread may be interested in the asp (algebraic staged parsing) library (al= so described in the Transept post linked above), which is built on an a= pproach along the lines @gasche describes:

  • combinators that describe a grammar (using context-free expressions)
  • an analysis (formulated as a type system) that ensures deterministic pa= rsing
  • staging to eliminate performance overhead

The interface is pretty standard, with combinators for alternation, sequenc= ing, etc., and performance is quite good (better than ocamlyacc on our benchmarks).

There's a paper, A typed algebraic approach to parsing, that describes the design in more detail.

Chet_Murthy said:

Also, I=E2=80=99m personally a massive LL(1) (over LALR) bigot

Grammars built using asp are essentially LL(1). (The weasel w= ord "essentially" isn't hiding much here, but the paper has the details.)

Dune 2.4.0

Rudi Grinberg announced

On behalf of the dune team, I'm pleased to announce the release of dune 2.4= .0. This releases features support for mdx, an interesting t= ake on the notebook paradigm by the RWO team. This release also includes a = crucial fix to polling mode which makes it usable in environments with finite memory :slig= ht_smile:.

Happy hacking!

2.4.0 (06/03/2020)

  • Add mdx extension and stanza version 0.1 (#3094, @NathanRe= b)
  • Allow to make Odoc warnings fatal. This is configured from the (e= nv ...) stanza. (#3029, @Julow)
  • Fix separate compilation of JS when findlib is not installed. (#3177, @= nojb)
  • Add a dune describe command to obtain the topology of a du= ne workspace, for projects such as ROTOR. (#3128, @diml)
  • Add plugin linking mode for executables and the (emb= ed_in_plugin_libraries ...) field. (#3141, @nojb)
  • Add an %{ext_plugin} variable (#3141, @nojb)
  • Dune will no longer build shared objects for stubs if supports_shared_libraries is false (#3225, fixes #3222, @rgrin= berg)
  • Fix a memory leak in the file-watching mode (dune build -w) (#3220, @snowleopard and @aalekseyev)

Tyxml 4.4.0

Gabriel Radanne announced

I have the pleasure to announce the release of TyXML 4.4.0, with special Reason su= pport!

TyXML is a library for bui= lding statically correct HTML and SVG documents. TyXML provides a set of co= mbinators which use the OCaml type system to ensure the validity of the HTML. TyXML is now a st= able library and this release comes with a few newly supported elements and attributes (such as ARIA elements) and associated bug fixes. However, the m= ain novelty of this release is a long awaited feature: the support for Reason=E2=80=99s JSX syntax in the brand new tyxml-jsx package.

See the complete announcement for code examples and details: https://drup.github.io/2020/03/06= /tyxml440/

first release of oplsr: an OCaml wrapper to the pls R package= - Partial Least Squares (PLS) regression

UnixJunkie announced

It is my great pleasure to release one more hackish wrapper to use some R package from within OCaml:

https://github.com/UnixJunk= ie/oplsr

For some background: = https://en.wikipedia.org/wiki/Partial_least_squares_regression

Cf. test.ml in the sources for a usage example.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5D0197ED20 for ; Tue, 17 Mar 2020 12:04:49 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.70,564,1574118000"; d="scan'208,217";a="440738508" Received: from lil114r.vpn.inria.fr (HELO set) ([128.93.179.114]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Mar 2020 12:04:48 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 17 Mar 2020 12:04:47 +0100 Message-ID: <87imj3tf74.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 10 to 17, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Unicode 13.0.0 update for Uucd, Uucp, Uunf and Uuseg Introducing dune describe Introducing Model_quickcheck. Quickcheck for stateful, imperative code Odig 0.0.5 Suggestions for ocaml documentation Introducing Gopcaml mode - structural OCaml editing Try OCaml 2.0 (beta) jose 0.2.0 Old CWN Unicode 13.0.0 update for Uucd, Uucp, Uunf and Uuseg =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Unicode 13.0.0 was released on the 10th of march. It adds 5390 characters to the standard including graphic symbols for legacy computing. If you were looking for characters representing seven-segment decimal digits, now you [have them]. For the curious, the [encoding proposal] has the motivation and source of these new symbols. For more information about all the other additions, see [this page]. Accordingly the libraries mentioned at the end of this message had to be updated, consult the individual release notes for details. Both Uucd and Uucp are incompatible releases sinces new script and block enumerants had to be added. Uucp has a new Emoji module with the new emoji properties introduced in 13.0.0 which are now used by Uuseg to improve emoji segmentation. The overall compiled size of Uucp shrinked a bit; here uucp.cmxs went from 7.8Mo to 4.6Mo. Further reduction can likely be achieved with more work. Thanks to David Kaloper Mer=C5=A1injak for helpi= ng on this. A periodic reminder, if Unicode still puzzles you, read an absolute minimal Unicode introduction and OCaml Unicode tips on [this page] (also available via `odig doc uucp'). Happy retro computing, Daniel P.S. The OCaml compiler [detected] an obsolete rule in the 13.0.0 update of the Unicode line breaking algorithm. =E2=80=94 Uucd 13.0.0 Unicode character database decoder for OCaml. Uucp 13.0.0 Unicode character properties for OCaml. Uunf 13.0.0 Unicode text normalization for OCaml. Uuseg 13.0.0 Unicode text segmentation for OCaml. [have them] [encoding proposal] [this page] [this page] [detected] Introducing dune describe =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: J=C3=A9r=C3=A9mie Dimino announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Just a quick post to introduce the new `dune describe' command in Dune 2.4.0. If you'd like to write a tool that needs to understand the structure of a dune project, figure out where the cmt files are located, etc=E2=80=A6, this is the command to look at. The command is not production ready yet, but the infrastructure is in place. If you are interested in releasing tools that rely on it, please let us know so that we can discuss what information you need out of dune and also so that we can stabilise it. Introducing Model_quickcheck. Quickcheck for stateful, imperative code =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: suttonshire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm sharing a small project I've been working on that I hope will be interesting or useful to the community. [Model_quickcheck] is a model-based testing system that allows you to validate the "properties" of stateful, imperative OCaml programs. It's built on Jane Street's Base_quickcheck. I just started learning OCaml and one of the first projects I've been working on is a user-space reliable transport protocol. Writing tests for this system became unwieldy because I was trying to validate certain properties of the protocol by thinking up very specific sequences of actions that would invoke behaviors that relied on that property. I got tired of it and got curious if there was a way to generate these interesting sequences. My research turned up frameworks like [QCSTM] and [PropEr] for state machine property-based testing. This seemed to be exactly what I needed so I started building something similar. To use Model_quickcheck you specify a set of actions to apply to your program, a model that describes the state of you program and a set of predicates that define the properties of you system. The model is hopefully a simpler representation of your system e.g. a map instead of a key-value database, or a queue instead of a reliable network protocol. Model_quickcheck then generates a random sequences of actions applies them to your system and verifies the properties. This has been an exciting and useful project. I've learned a bunch about the Base library, Quickcheck, first class modules, and inline tests. I'm just getting started, but I just wanted to share the project with the community since I've learned a lot by lurking here. [Model_quickcheck] [QCSTM] [PropEr] Odig 0.0.5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 `odig' has a new release. See the [release notes] for details. Installation: `opam install ocaml-manual odig' Tutorial: odig is a command line tool to lookup documentation of installed OCaml packages. It shows package metadata, readmes, change logs, licenses, cross-referenced `odoc' API documentation and manuals. [release notes] Suggestions for ocaml documentation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The "OCaml API", which is the documentation for the standard library, is now complete for all versions 4.00=E2=80=934.10, with a quick search f= ield, on the demo site: Introducing Gopcaml mode - structural OCaml editing =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi all, I am pleased to announce the first release of Gopcaml-mode, a new emacs library that aims to extend the existing OCaml editing experience with structural editing capabilities. A picture is worth a thousand words, so I'll cut to the chase, and start with a few demonstrations: Examples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 AST-based code navigation - `C-M-n, C-M-p, C-M-u, C-M-d, C-M-f, C-M-b' =E2=80=A2 AST-based code transformation -`C-M-N, C-M-P, C-M-F, C-M-B' =E2=80=A2 Mark exp - `C-M-SPC' =E2=80=A2 Extract expression into letdef - `C-c C-e' This is just a small sample of the features - a full listing is provided at the project readme, which can be found at the [project page]. [project page] Notes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This plugin is quite faithful to the OCaml specification and doesn't reimplement a separate OCaml parser as some other plugins do - instead I use the Ecaml package (which allows interfacing with Emacs from OCaml code) to allow delegating to the OCaml parser (from Ocaml-compiler-libs) directly. It's in the process of being published to opam, and should be available to download soon. Try OCaml 2.0 (beta) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Louis Gesbert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCamlPro is happy to announce the release of a new version of the venerable [Try OCaml tool]. This tool allows you to quickly test OCaml snippets from anywhere, directly from your browser. It's still in beta, so any issues or comments are welcome below. The new version is a complete refactor and redesign, based on the backend of Learn-OCaml. Original announcement: [Try OCaml tool] jose 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Ulrik Strid announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I recently released a JavaScript Object Signing and Encryption library to opam. The main usecase for JOSE is JWT and JWK and is a comprehensive library for both unlike some other libraries that currently exist in the ecosystem. It uses mirage-crypto and supports RSA and OCT keys currently and will support EC when mirage-crypto does. I have not really implemented the encryption part yet but if anyone needs JWE I'll gladly do the work or accept PRs. The project was initially developed in Reason but I changed over to OCaml at some point because of limitations in Reason at the time but the repo still has the old name. The docs can be found here: The repo can be found here: Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 10 to 17, 2020.

Unicode 13.0.0 update for Uucd, Uucp, Uunf and Uuseg

Daniel B=C3=BCnzli announced

Unicode 13.0.0 was released on the 10th of march.

It adds 5390 characters to the standard including graphic symbols for legac= y computing. If you were looking for characters representing seven-segment = decimal digits, now you have them. For the curious, the encoding proposal has the motivat= ion and source of these new symbols. For more information about all the oth= er additions, see this page.

Accordingly the libraries mentioned at the end of this message had to be up= dated, consult the individual release notes for details. Both Uucd and Uucp= are incompatible releases sinces new script and block enumerants had to be= added.

Uucp has a new Emoji module with the new emoji properties introduced in 13.= 0.0 which are now used by Uuseg to improve emoji segmentation. The overall = compiled size of Uucp shrinked a bit; here uucp.cmxs went from 7.8Mo to 4.6= Mo. Further reduction can likely be achieved with more work. Thanks to Davi= d Kaloper Mer=C5=A1injak for helping on this.

A periodic reminder, if Unicode still puzzles you, read an absolute minimal= Unicode introduction and OCaml Unicode tips on this page (also available via odig doc uucp).

Happy retro computing,

Daniel

P.S. The OCaml compiler detected an obsolete rule in the 13.0.0 updat= e of the Unicode line breaking algorithm.

Uucd 13.0.0 Unicode character database decoder for OCaml.

http://erratique.ch/software/= uucd

Uucp 13.0.0 Unicode character properties for OCaml.

http://erratique.ch/software/= uucp

Uunf 13.0.0 Unicode text normalization for OCaml.

http://erratique.ch/software/= uunf

Uuseg 13.0.0 Unicode text segmentation for OCaml.

http://erratique.ch/software= /uuseg

Introducing dune describe

J=C3=A9r=C3=A9mie Dimino announced

Just a quick post to introduce the new dune describe command i= n Dune 2.4.0. If you'd like to write a tool that needs to understand the st= ructure of a dune project, figure out where the cmt files are located, etc&= #x2026;, this is the command to look at.

The command is not production ready yet, but the infrastructure is in place= . If you are interested in releasing tools that rely on it, please let us k= now so that we can discuss what information you need out of dune and also s= o that we can stabilise it.

https://dune.build/blog/= dune-describe/

Introducing Model_quickcheck. Quickcheck for stateful, imperat= ive code

suttonshire announced

I'm sharing a small project I've been working on that I hope will be intere= sting or useful to the community. Model_quickcheck is a model-based testing system tha= t allows you to validate the "properties" of stateful, imperative OCaml pro= grams. It's built on Jane Street's Base_quickcheck.

I just started learning OCaml and one of the first projects I've been worki= ng on is a user-space reliable transport protocol. Writing tests for this s= ystem became unwieldy because I was trying to validate certain properties o= f the protocol by thinking up very specific sequences of actions that would= invoke behaviors that relied on that property. I got tired of it and got c= urious if there was a way to generate these interesting sequences. My resea= rch turned up frameworks like QCS= TM and PropEr for state machine property-based testing. This seemed t= o be exactly what I needed so I started building something similar.

To use Model_quickcheck you specify a set of actions to apply to your progr= am, a model that describes the state of you program and a set of predicates= that define the properties of you system. The model is hopefully a simpler= representation of your system e.g. a map instead of a key-value database, = or a queue instead of a reliable network protocol. Model_quickcheck then ge= nerates a random sequences of actions applies them to your system and verif= ies the properties.

This has been an exciting and useful project. I've learned a bunch about th= e Base library, Quickcheck, first class modules, and inline tests. I'm just= getting started, but I just wanted to share the project with the community= since I've learned a lot by lurking here.

Odig 0.0.5

Daniel B=C3=BCnzli announced

odig has a new release. See the releas= e notes for details.

Installation: opam install ocaml-manual odig

Tutorial: ht= tps://erratique.ch/software/odig/doc/manual.html

odig is a command line tool to lookup documentation of installed OCaml pack= ages. It shows package metadata, readmes, change logs, licenses, cross-refe= renced odoc API documentation and manuals.

Suggestions for ocaml documentation

sanette announced

The "OCaml API", which is the documentation for the standard library, is no= w complete for all versions 4.00–4.10, with a quick search field, on the demo site:

https://sanette.github.io/= ocaml-api/

Introducing Gopcaml mode - structural OCaml editing

Kiran Gopinathan announced

Hi all, I am pleased to announce the first release of Gopcaml-mode, a new e= macs library that aims to extend the existing OCaml editing experience with structural editing capabilities.

A picture is worth a thousand words, so I'll cut to the chase, and start wi= th a few demonstrations:

Examples

  • AST-based code navigation - C-M-n, C-M-p, C-M-u, C-M-d, C-M-f, C-= M-b

3D"gopcaml_move_expression_exa=

  • AST-based code transformation -C-M-N, C-M-P, C-M-F, C-M-B<= /li>

3D"gopcaml_move_function_example=

  • Mark exp - C-M-SPC

3D"gopcaml_mark_sexp.gif"

  • Extract expression into letdef - C-c C-e

3D"gopcaml_extraction_expressio=

This is just a small sample of the features - a full listing is provided at= the project readme, which can be found at the project page.

Notes

This plugin is quite faithful to the OCaml specification and doesn't reimpl= ement a separate OCaml parser as some other plugins do - instead I use the Ecaml package (which allows interfacin= g with Emacs from OCaml code) to allow delegating to the OCaml parser (from Ocaml-compiler-libs) directly.

It's in the process of being published to opam, and should be available to = download soon.

Try OCaml 2.0 (beta)

Louis Gesbert announced

OCamlPro is happy to announce the release of a new version of the venerable= Try OCaml tool.

This tool allows you to quickly test OCaml snippets from anywhere, directly= from your browser. It's still in beta, so any issues or comments are welco= me below.

The new version is a complete refactor and redesign, based on the backend o= f Learn-OCaml.

Original announcement: http://www.ocamlpro.com/2020/03/16/new-version= -of-try-ocaml-in-beta/

jose 0.2.0

Ulrik Strid announced

I recently released a JavaScript Object Signing and Encryption library to o= pam.

The main usecase for JOSE is JWT and JWK and is a comprehensive library for= both unlike some other libraries that currently exist in the ecosystem. It= uses mirage-crypto and supports RSA and OCT keys currently and will suppor= t EC when mirage-crypto does.

I have not really implemented the encryption part yet but if anyone needs J= WE I'll gladly do the work or accept PRs.

The project was initially developed in Reason but I changed over to OCaml a= t some point because of limitations in Reason at the time but the repo stil= l has the old name.

The docs can be found here: https://ulrikstrid.github.io/reason-jose/

The repo can be found here: https://github.com/ulrikstrid/reason-jose/

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B5B7A7EEE8 for ; Tue, 24 Mar 2020 10:31:28 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.72,299,1580770800"; d="scan'208,217";a="343403774" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Mar 2020 10:31:23 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 24 Mar 2020 10:31:22 +0100 Message-ID: <87a746xfo5.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTWFyY2ggMTcgdG8gMjQsDQoyMDIwLg0KDQpU YWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkx1diAwLjUuMSDigJQgYSBs aWJ1diBiaW5kaW5nIOKAlCBXaW5kb3dzIHN1cHBvcnQNCnJlc3RvIDAuMiBy ZWxlYXNlZA0KQmlzZWN0X3BweCAyLjAuMCDigJQgY29kZSBjb3ZlcmFnZSBm b3IgT0NhbWwgd2l0aCBuaWNlIEhUTUwgcmVwb3J0cw0KT0NhbWwgNC4wOS4x IHJlbGVhc2VkDQpDb29raWUgMC4xLjYNCkZpcnN0IHJlbGVhc2Ugb2YgbHd0 LXBpcGVsaW5lDQpVc2luZyBPY2FtbCBhcyBzY3JpcHRpbmcgbGFuZ3VhZ2Ug LSBwaXBpbmcgc2ggY29tbWFuZHMNCk9sZCBDV04NCg0KDQpMdXYgMC41LjEg 4oCUIGEgbGlidXYgYmluZGluZyDigJQgV2luZG93cyBzdXBwb3J0DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2x1 di0wLTUtMS1hLWxpYnV2LWJpbmRpbmctd2luZG93cy1zdXBwb3J0LzUzMzQv MT4NCg0KDQpBbnRvbiBCYWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgcmVsZWFz ZSBbMC41LjFdIG9mIFsqKkx1dioqXS4gVGhlIG1haW4gY2hhbmdlDQogIGlz IHRoZSBhZGRpdGlvbiBvZiBXaW5kb3dzIHN1cHBvcnQsIHdoaWNoIG1ha2Vz IEx1diBmdWxseQ0KICBjcm9zcy1wbGF0Zm9ybS4NCg0KICBBY2NvcmRpbmds eSwgTHV2IDAuNS4xIGlzIG5vdyBpbnN0YWxsYWJsZSBmcm9tIGJvdGggdGhl IG1haW4gb3BhbQ0KICByZXBvLCBhbmQgZnJvbSBvcGFtLXJlcG9zaXRvcnkt bWluZ3cuDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9hYW50cm9uL2x1dj4N Cg0KICBBbHNvLCBhcyBhIHNpZGUgZWZmZWN0IG9mIHRoZSBidWlsZCBzeXN0 ZW0gcmVmYWN0b3JpbmcgdGhhdCB3YXMgbmVlZGVkDQogIHRvIHN1cHBvcnQg V2luZG93cywgTHV2J3MgYnVpbGQgc3lzdGVtIG5vIGxvbmdlciByZXF1aXJl cyBQeXRob24sIGFuZA0KICBzdXBwb3J0cyBjcm9zcy1jb21waWxhdGlvbi4N Cg0KICBUaGUgb3RoZXIgbm90ZXdvcnRoeSBjaGFuZ2UgaW4gcmVsZWFzZSAw LjUuMSBpcyBhIHJvdXRpbmUgdXBncmFkZSBvZg0KICB0aGUgdmVuZG9yZWQg bGlidXYgdG8gaXRzIGxhdGVzdCB2ZXJzaW9uLCBbMS4zNS4wXS4NCg0KDQpb MC41LjFdIDxodHRwczovL2dpdGh1Yi5jb20vYWFudHJvbi9sdXYvcmVsZWFz ZXMvdGFnLzAuNS4xPg0KDQpbKipMdXYqKl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9hYW50cm9uL2x1dj4NCg0KWzEuMzUuMF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9saWJ1di9saWJ1di9yZWxlYXNlcy90YWcvdjEuMzUuMD4NCg0KDQpyZXN0 byAwLjIgcmVsZWFzZWQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlc3RvLTAtMi1yZWxlYXNl ZC81MDI4LzI+DQoNCg0KUmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClJlbGVhc2VzIG9mIGByZXN0 bycgMC4zIGFuZCAwLjQNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE9uIGJlaGFsZiBvZiBOb21hZGlj IExhYnMsIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZg0K ICB2ZXJzaW9ucyAwLjMgYW5kIDAuNCBvZiBgcmVzdG8nLiBCb3RoIHZlcnNp b25zIGFyZSBhdmFpbGFibGUgdGhyb3VnaA0KICBgb3BhbScgYW5kIGF2YWls YWJsZSBvbiA8aHR0cHM6Ly9naXRsYWIuY29tL25vbWFkaWMtbGFicy9yZXN0 bz4uDQoNCiAgVGhlIG1haW4gY2hhbmdlIGluIDAuMyBpcyB0byBkZXBlbmQg b24gYGpzb24tZGF0YS1lbmNvZGluZycsIHRoZSBmb3JrDQogIG9mIHRoZSB1 bm1haW50YWluZWQgYG9jcGxpYi1qc29uLXR5cGVkJy4NCg0KICBUaGUgY2hh bmdlcyBvZiAwLjQgYXJlIG1vcmUgaW52YXNpdmUgYW5kIHJlcXVpcmUgdXNl cnMgY2hhbmdlczoNCiAg4oCiIGhhbmRsZSB0aGUgbmV3IGBgR29uZScgcmVz cG9uc2UgY29kZSwgYW5kDQogIOKAoiBwYXNzIGBnZXR0aW1lb2ZkYXknIG1h bnVhbGx5Lg0KDQogIFRoaXMgbGFzdCBmZWF0dXJlIHJlbW92ZXMgYSBkZXBl bmRlbmN5IGZyb20gYHJlc3RvLWNvaHR0cCcgdG8gYFVuaXgnLA0KICBhbmQg dGh1cyBoZWxwcyB3aXRoIHVzZSB3aXRoaW4gYSBganNfb2Zfb2NhbWwnIGVu dmlyb25tZW50Lg0KDQoNCkJpc2VjdF9wcHggMi4wLjAg4oCUIGNvZGUgY292 ZXJhZ2UgZm9yIE9DYW1sIHdpdGggbmljZSBIVE1MIHJlcG9ydHMNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYmlzZWN0LXBweC0yLTAtMC1jb2RlLWNvdmVyYWdlLWZv ci1vY2FtbC13aXRoLW5pY2UtaHRtbC1yZXBvcnRzLzUzMzgvMT4NCg0KDQpB bnRvbiBCYWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgW3JlbGVhc2UgMi4wLjBd IG9mIFsqKkJpc2VjdF9wcHgqKl0sIHRoZQ0KICBPQ2FtbCBjb3ZlcmFnZSB0 b29sLCB3aGljaCBoZWxwcyB5b3Ugc2VlIHdoaWNoIHBhcnRzIG9mIHlvdXIg Y29kZSBhcmUNCiAgbm90IGJlaW5nIHRlc3RlZC4NCg0KICA8aHR0cHM6Ly9h d3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fkcy9vY2Ft bC9vcmlnaW5hbC8yWC8xLzE5MTFhZGM2YWY4OThiNmY0ZWZkN2RjNjlkMmMx ZjkwNjk5MDMxYmEuZ2lmPg0KDQogIFRoaXMgcmVsZWFzZSBpcyBhIG1ham9y IHVwZ3JhZGUuIFRoZSBoaWdobGlnaHRzIGFyZToNCg0KICDigKIgU3VwcG9y dCBmb3IgQnVja2xlU2NyaXB0LCBqc19vZl9vY2FtbCwgYW5kIGVzeS4gSW4g b3RoZXIgd29yZHMsDQogICAgQmlzZWN0X3BweCBub3cgY29tcGlsZXMgdG8g Ym90aCBuYXRpdmUgY29kZSBhbmQgSlMsIGFuZCBpcyBwdWJsaXNoZWQNCiAg ICBpbiBib3RoIG9wYW0gYW5kIG5wbS4NCiAg4oCiIFRoZSBhYmlsaXR5IHRv IFtzZW5kIHJlcG9ydHMgYXV0b21hdGljYWxseV0gZnJvbSBUcmF2aXMgYW5k IENpcmNsZUNJDQogICAgdG8gQ292ZXJhbGxzIGFuZCBDb2RlY292LiBNb3Jl IGludGVncmF0aW9ucyBjYW4gYmUgYWRkZWQgb3ZlciB0aW1lLg0KICDigKIg VGhlIGF3a3dhcmQgYCgqQklTRUNULUlHTk9SRSopJyBjb21tZW50cyBmb3Ig ZXhjbHVkaW5nIGNvZGUgZnJvbQ0KICAgIGluc3RydW1lbnRhdGlvbiBoYXZl IGJlZW4gcmVwbGFjZWQgYnkgQVNUIGF0dHJpYnV0ZXMgbGlrZQ0KICAgIGBb QGNvdmVyYWdlIG9mZl0nDQogICAgKDxodHRwczovL2dpdGh1Yi5jb20vYWFu dHJvbi9iaXNlY3RfcHB4I0V4Y2x1c2lvbj4pLg0KICDigKIgQSBuZXcsIG1v cmUgcHJpbmNpcGxlZCBpbnN0cnVtZW50YXRpb24gYWxnb3JpdGhtLg0KICDi gKIgQSBuZXcgcmVwb3J0ZXIgY29tbWFuZCBsaW5lIGJhc2VkIG9uIFtDbWRs aW5lcl0uIFJ1bg0KICAgIGBiaXNlY3QtcHB4LXJlcG9ydCAtLWhlbHAnIHRv IGdldCBzdGFydGVkIHdpdGggaXQuDQogIOKAoiBTeW50YXggaGlnaGxpZ2h0 aW5nLg0KDQogIFlvdSBhcmUgaW52aXRlZCB0byBwZXJ1c2UgdGhlIGFsbC1u ZXcgW1JFQURNRV0gZm9yIGRldGFpbHMgOikNCg0KICBTZXZlcmFsIGZlYXR1 cmVzIGhhdmUgYmVlbiBkZXByZWNhdGVkOyBtb3N0bHkgY29tbWFuZC1saW5l IGZsYWdzLiBZb3UNCiAgY2FuIHNlZSB0aGUgbGlzdCBpbiB0aGUgKkRlcHJl Y2F0aW9ucyogc2VjdGlvbiBvZiB0aGUNCiAgW2NoYW5nZWxvZ10uIEhvd2V2 ZXIsIGl0IG1heSBiZSBlYXNpZXIgdG8gc2ltcGx5IHRyeSB1c2luZyBCaXNl Y3RfcHB4DQogIGFzIGJlZm9yZSDigJMgaXQgd2lsbCB3YXJuIHlvdSBpZiB5 b3UgdXNlIGEgZGVwcmVjYXRlZCBmbGFnLiBUaGUNCiAgZGVwcmVjYXRlZCBm bGFncyB3aWxsIGJlIHJlbW92ZWQgaW4gQmlzZWN0X3BweCAyLjEuMCwgZXhw ZWN0ZWQgYXJvdW5kDQogIEp1bHkgMjAyMC4NCg0KICBIYXBweSB0ZXN0aW5n IQ0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vYWFudHJvbi9iaXNlY3RfcHB4 Pg0KDQoNCltyZWxlYXNlIDIuMC4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9h YW50cm9uL2Jpc2VjdF9wcHgvcmVsZWFzZXMvdGFnLzIuMC4wPg0KDQpbKipC aXNlY3RfcHB4KipdIDxodHRwczovL2dpdGh1Yi5jb20vYWFudHJvbi9iaXNl Y3RfcHB4Pg0KDQpbc2VuZCByZXBvcnRzIGF1dG9tYXRpY2FsbHldDQo8aHR0 cHM6Ly9naXRodWIuY29tL2FhbnRyb24vYmlzZWN0X3BweCNDb3ZlcmFsbHM+ DQoNCltDbWRsaW5lcl0gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJl L2NtZGxpbmVyL2RvYy9DbWRsaW5lcj4NCg0KW1JFQURNRV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9hYW50cm9uL2Jpc2VjdF9wcHgjcmVhZG1lPg0KDQpbY2hh bmdlbG9nXSA8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRyb24vYmlzZWN0X3Bw eC9yZWxlYXNlcy90YWcvMi4wLjA+DQoNCg0KT0NhbWwgNC4wOS4xIHJlbGVh c2VkDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTQtMDktMS1yZWxlYXNlZC81 MzQxLzE+DQoNCg0Kb2N0YWNocm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2UgaGF2ZSB0aGUgcGxlYXN1cmUgb2YgY2VsZWJyYXRpbmcgdGhl IGFubml2ZXJzYXJ5IG9mIHRoZSBmaXJzdA0KICBzcGFjZXdhbGssIGNvbmR1 Y3RlZCBieSBBbGV4ZWkgTGVvbm92LCBieSBhbm5vdW5jaW5nIHRoZSByZWxl YXNlIG9mDQogIE9DYW1sIHZlcnNpb24gNC4wOS4xLiAgVGhpcyBpcyBtYWlu bHkgYSBidWctZml4IHJlbGVhc2UsIHdpdGggYQ0KICBoYW5kZnVsIG9mIGNv bmZpZ3VyYXRpb24gZml4ZXMgYW5kIGEgR0MgZml4IGJhY2twb3J0ZWQgZnJv bSA0LjEwLjANCiAgLiBTZWUgdGhlIGxpc3Qgb2YgY2hhbmdlcyBiZWxvdyBm b3IgbW9yZSBkZXRhaWxzLg0KDQogIEl0IGlzIChvciBzb29uIHdpbGwgYmUp IGF2YWlsYWJsZSBhcyBhIHNldCBvZiBPUEFNIHN3aXRjaGVzLCBhbmQgYXMg YQ0KICBzb3VyY2UgZG93bmxvYWQgaGVyZToNCg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNC4wOS4xLnRhci5nej4NCg0K DQpDaGFuZ2VzIGluIDQuMDkuMToNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBbIzkw NzNdLCBbIzkxMjBdOiBmaXggaW5jb3JyZWN0IEdDIHJhdGlvIG11bHRpcGxp ZXIgd2hlbiBhbGxvY2F0aW5nDQogICAgY3VzdG9tIGJsb2NrcyB3aXRoIGNh bWxfYWxsb2NfY3VzdG9tX21lbSBpbiBydW50aW1lL2N1c3RvbS5jIChNYXJr dXMNCiAgICBNb3R0bCwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlciBhbmQg RGFtaWVuIERvbGlnZXopDQoNCiAg4oCiIFsjODg1NV0sIFsjODg1OF06IExp bmtzIGZvciB0b29scyBub3QgY3JlYXRlZCB3aGVuIGluc3RhbGxpbmcgd2l0 aA0KICAgIOKAk2Rpc2FibGUtaW5zdGFsbGluZy1ieWVjb2RlLXByb2dyYW1z IChlLmcuIG9jYW1sZGVwLm9wdCBpbnN0YWxsZWQsDQogICAgYnV0IG9jYW1s ZGVwIGxpbmsgbm90IGNyZWF0ZWQpIChEYXZpZCBBbGxzb3BwLCByZXBvcnQg YnkgVGhvbWFzDQogICAgTGVvbmFyZCkNCg0KICDigKIgWyM4OTQ3XSwgWyM5 MTM0XSwgWyM5MzAyXTogZml4L2ltcHJvdmUgc3VwcG9ydCBmb3IgdGhlIEJG RCBsaWJyYXJ5DQogICAgKFPDqWJhc3RpZW4gSGluZGVyZXIsIHJldmlldyBi eSBEYW1pZW4gRG9saWdleiBhbmQgRGF2aWQgQWxsc29wcCkNCg0KICDigKIg WyM4OTUzXSwgWyM4OTU0XTogRml4IGVycm9yIHN1Ym1lc3NhZ2VzIGluIHRo ZSB0b3BsZXZlbDogZG8gbm90DQogICAgZGlzcGxheSBkdW1teSBsb2NhdGlv bnMgKEFybWHDq2wgR3XDqW5lYXUsIHJldmlldyBieSBHYWJyaWVsIFNjaGVy ZXIpDQoNCiAg4oCiIFsjODk2NV0sIFsjODk3OV06IEFscGluZSBidWlsZCBm YWlsdXJlIGNhdXNlZCBieQ0KICAgIGNoZWNrLXBhcnNlci11cHRvZGF0ZS1v ci13YXJuLnNoIChHYWJyaWVsIFNjaGVyZXIgYW5kIERhdmlkIEFsbHNvcHAs DQogICAgcmVwb3J0IGJ5IEFudG9uIEtvY2hrb3YpDQoNCiAg4oCiIFsjODk4 NV0sIFsjODk4Nl06IGZpeCBnZW5lcmF0aW9uIG9mIHRoZSBwcmltaXRpdmVz IHdoZW4gdGhlIGxvY2FsZQ0KICAgIGNvbGxhdGlvbiBpcyBpbmNvbXBhdGli bGUgd2l0aCBDLiAoRGF2aWQgQWxsc29wcCwgcmV2aWV3IGJ5IE5pY29sw6Fz DQogICAgT2plZGEgQsOkciwgcmVwb3J0IGJ5IFNlYmFzdGlhbiBSYXNtdXNz ZW4pDQoNCiAg4oCiIFsjOTA1MF0sIFsjOTA3Nl06IGluc3RhbGwgbWlzc2lu ZyBjb21waWxlcmxpYnMvb2NhbWxtaWRkbGVlbmQNCiAgICBhcmNoaXZlcyAo R2FicmllbCBTY2hlcmVyLCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGks IHJlcG9ydCBieQ0KICAgIE9sYWYgSGVyaW5nKQ0KDQogIOKAoiBbIzkxNDRd LCBbIzkxODBdOiBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFy aWFibGVzIGluIHRoZSBDDQogICAgcnVudGltZSwgY2F1c2luZyBwcm9ibGVt cyB3aXRoIEdDQyAxMC4wIGFuZCBwb3NzaWJseSB3aXRoIG90aGVyIEMNCiAg ICBjb21waWxlcnMgKFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IErDvHJnZW4g UmV1dGVyLCByZXZpZXcgYnkgTWFyaw0KICAgIFNoaW53ZWxsKQ0KDQogIOKA oiBbIzkxODBdOiBwYXNzIC1mbm8tY29tbW9uIG9wdGlvbiB0byBDIGNvbXBp bGVyIHdoZW4gYXZhaWxhYmxlLCBzbyBhcw0KICAgIHRvIGRldGVjdCBwcm9i bGVtYXRpYyBtdWx0aXBsZSBkZWZpbml0aW9ucyBvZiBnbG9iYWwgdmFyaWFi bGVzIGluDQogICAgdGhlIEMgcnVudGltZSAoWGF2aWVyIExlcm95LCByZXZp ZXcgYnkgTWFyayBTaGlud2VsbCkNCg0KICDigKIgWyM5MTI4XTogRml4IGEg YnVnIGluIGJ5dGVjb2RlIG1vZGUgd2hpY2ggY291bGQgbGVhZCB0byBhDQog ICAgc2VnbWVudGF0aW9uIGZhdWx0LiBUaGUgYnVnIHdhcyBjYXVzZWQgYnkg dGhlIGZhY3QgdGhhdCB0aGUgYXRvbQ0KICAgIHRhYmxlIHNoYXJlZCBhIHBh Z2Ugd2l0aCBzb21lIGJ5dGVjb2RlLiBUaGUgZml4IG1ha2VzIHN1cmUgYm90 aCB0aGUNCiAgICBhdG9tIHRhYmxlIGFuZCB0aGUgbWlub3IgaGVhcCBoYXZl IHRoZWlyIG93biBwYWdlcy4gKEphY3F1ZXMtSGVucmkNCiAgICBKb3VyZGFu LCByZXZpZXcgYnkgU3RlcGhlbiBEb2xhbiwgWGF2aWVyIExlcm95IGFuZCBH YWJyaWVsIFNjaGVyZXIpDQoNCg0KWyM5MDczXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy85MDczPg0KDQpbIzkxMjBdIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzkxMjA+DQoNClsj ODg1NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv ODg1NT4NCg0KWyM4ODU4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy84ODU4Pg0KDQpbIzg5NDddIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzg5NDc+DQoNClsjOTEzNF0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTEzND4NCg0KWyM5 MzAyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85 MzAyPg0KDQpbIzg5NTNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzg5NTM+DQoNClsjODk1NF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvODk1ND4NCg0KWyM4OTY1XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy84OTY1Pg0KDQpbIzg5 NzldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzg5 Nzk+DQoNClsjODk4NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvODk4NT4NCg0KWyM4OTg2XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy84OTg2Pg0KDQpbIzkwNTBdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzkwNTA+DQoNClsjOTA3 Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTA3 Nj4NCg0KWyM5MTQ0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L2lzc3Vlcy85MTQ0Pg0KDQpbIzkxODBdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzkxODA+DQoNClsjOTEyOF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTEyOD4NCg0KDQpDb29r aWUgMC4xLjYNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWNvb2tpZS0wLTEtNi81MzQ2LzE+DQoNCg0KVWxyaWsgU3RyaWQgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHJlY2VudGx5IHJl bGVhc2VkIGEgY29va2llIGxpYnJhcnkuIEl0IGNhbiBwYXJzZSBhbmQgY3Jl YXRlIGNvb2tpZQ0KICBoZWFkZXJzIChgbGlzdCgoc3RyaW5nLCBzdHJpbmcp JyB3aGljaCBib3RoIENvaHR0cCBhbmQgSHR0cGFmIHVzZXMpLA0KICBib3Ro IGBTZXQtQ29va2llJyBhbmQgYENvb2tpZScgc28gaXQgd29ya3Mgb24gYm90 aCBjbGllbnQgYW5kDQogIHNlcnZlci4gSXQgc2hvdWxkIGJlIGNvbXBsaWFu dCB3aXRoDQogIDxodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjNjI2 NT4gYW5kIEkgaGF2ZSBhIHByZXR0eSBnb29kIHRlc3QNCiAgc3VpdGUgZm9y IHRoZSBwYXJzaW5nIG9mIGNvb2tpZXMgYXQgbGVhc3QuDQoNCiAgSSBjb3Vs ZG7igJl0IGZpbmQgYSBzdGFuZGFsb25lIGxpYnJhcnkgYmVmb3JlIHRoaXMg c28gSSBkZWNpZGVkIHRvDQogIGNyZWF0ZSBvbmUgc2luY2UgSSBuZWVkIGl0 IGZvciBteSB3ZWIgZnJhbWV3b3JrLCBgTW9ycGgnLg0KDQogIFRoZSBuZXh0 IHN0ZXAgaXMgdG8gY3JlYXRlIGFuZCBwdWJsaXNoIGludGVncmF0aW9ucyB3 aXRoDQogIFtgb2NhbWwtc2Vzc2lvbiddIHdoaWNoIEkgaGF2ZSBzdGFydGVk Lg0KDQogIOKAoiBSZXBvOiA8aHR0cHM6Ly9naXRodWIuY29tL3Vscmlrc3Ry aWQvb2NhbWwtY29va2llPg0KICDigKIgRG9jczogPGh0dHBzOi8vdWxyaWtz dHJpZC5naXRodWIuaW8vb2NhbWwtY29va2llPg0KDQoNCltgb2NhbWwtc2Vz c2lvbiddIDxodHRwczovL2dpdGh1Yi5jb20vaW5oYWJpdGVkdHlwZS9vY2Ft bC1zZXNzaW9uPg0KDQoNCkZpcnN0IHJlbGVhc2Ugb2YgbHd0LXBpcGVsaW5l DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1maXJzdC1yZWxlYXNlLW9mLWx3dC1waXBlbGluZS80MjIwLzI+DQoN Cg0KUmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgQSBzZWNvbmQgcmVsZWFzZSBvZiBgbHd0LXBp cGVsaW5lJyAodjAuMikgaXMgYXZhaWxhYmxlIHRocm91Z2gNCiAgYG9wYW0n LiBUaGlzIG5ldyByZWxlYXNlIG1ha2VzIG5vIGNoYW5nZSB0byB0aGUgY29k ZSBhbmQgb25seSBhZmZlY3RzDQogIHRoZSBmb2xsb3dpbmc6DQoNCiAg4oCi IGxvb3NlciBjb25zdHJhaW50cyBvbiB2ZXJzaW9ucyBvZiBgZHVuZScgZGVw ZW5kZW5jeSwNCiAg4oCiIHRlc3RzLA0KICDigKIgdGVzdHMgYXJlIGV4ZWN1 dGVkIGluIENJLA0KICDigKIgbWlub3IgZG9jdW1lbnRhdGlvbiBpbXByb3Zl bWVudHMuDQoNCg0KVXNpbmcgT2NhbWwgYXMgc2NyaXB0aW5nIGxhbmd1YWdl IC0gcGlwaW5nIHNoIGNvbW1hbmRzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3VzaW5nLW9jYW1sLWFzLXNjcmlwdGluZy1sYW5ndWFnZS1waXBp bmctc2gtY29tbWFuZHMvNTM2Ni8xPg0KDQoNCk5pY29sYXMgVG9sbGVuYWVy ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEkgYW0gdHJ5aW5nIHRvIHVzZSBvY2FtbCB0byBwaXBl IHRoZSByZXN1bHQgb2YgYSBjb21tYW5kIHRvIGFub3RoZXIgKEkNCiAgd291 bGQgYWxzbyBiZSBpbnRlcmVzdGVkIGluIGZlZWRpbmcgYSBzdHJpbmcgb3Ig YSBpbyBzdHJlYW0gaW50byBhIHNoDQogIGNvbW1hbmQpLiBGb3IgZXhhbXBs ZSwgSSB3b3VsZCBsaWtlIHRvIGRvIHRoZSBlcXVpdmFsZW50IG9mIGNhdA0K ICBmb28udHh0IHwgZ3JlcCB0aGluZywgb3IgcGlwZSB0aGUgcmVzdWx0IG9m IG9uZSBvZiBteSBvY2FtbCBmdW5jdGlvbg0KICBpbnRvIGdyZXAuDQoNCiAg UXVpdGUgc3VycHJpbnNpbmdseSwgbmVpdGhlciB0aGUgU3RkbGliIG9yIEJh dHRlcmllcyBTeXMgbW9kdWxlcw0KICBleHBvc2UgYW55IHdheSB0byBoYW5k bGUgdGhlIG91dHB1dCBvZiBTeXMuY29tbWFuZCBkaXJlY3RseSAoSSB3b3Vs ZA0KICBoYXZlIHRob3VnaHQgdGhlcmUgd291bGQgYmUgb3B0aW9uYWwgaW5w dXQgYW5kIG91dHB1dCBhcmd1bWVudHMNCiAgZGVmYXVsdGluZyB0byBzdGRp biBhbmQgc3Rkb3V0LCBvciBzb21ldGhpbmcgYWxvbmcgdGhhdCkuIEJhdHRl cmllcyBJTw0KICBtb2R1bGUgZG9lcyBleHBvc2UgYSBwaXBlIGZ1bmN0aW9u IGJ1dCBpdCdzIG5vdCBjbGVhciBmb3IgbWUgaG93IGl0DQogIHdvdWxkIGlu dGVyYWN0IHdpdGggdGhlIFN5cyBtb2R1bGUuIEFueSBpZGVhcyBvciBvdGhl ciBtb2R1bGVzL3BhY2thZ2UNCiAgSSBjb3VsZCB1c2UgPw0KDQoNCk5pY29s w6FzIE9qZWRhIELDpHIgc3VnZ2VzdGVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJIHRoaW5rIHlvdSBtYXkgYmUgaW50 ZXJlc3RlZCBieQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQv c2hleHA+Lg0KDQoNCk5pY29sYXMgVG9sbGVuYWVyZSB0aGVuIHNhaWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEBn cmF5c3dhbmR5ciBAbm9qYiBUaGFua3MgZm9yIHRoZSBzdWdnZXN0aW9uLiBJ IGp1c3QgZm91bmQgc2hjYW1sDQogIDxodHRwOi8vdG92LmdpdGh1Yi5pby9z aGNhbWwvZG9jLz4gYW5kIEkgd2FzIGdvaW5nIHRvIGdpdmUgaXQgYSB0cnks DQogIGRvIHlvdSBrbm93IGhvdyBpdCBjb21wYXJlcyB0byBzaGV4cCA/DQoN Cg0KRGF2aWQgQ2hlbW91aWwgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgQUZBSUsgc2hjYW1sIGlzIHVubWFpbnRhaW5lZCwgYnV0IHRo ZSBhcHByb2FjaCBpcyB2ZXJ5IG5pY2UgaW5kZWVkLg0KDQoNCk9sZCBDV04N CuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8g bWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJ J2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBb dGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hp dmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZl cnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5l XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2Fn ZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoN Clt0aGUgYXJjaGl2ZV0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cDovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8 aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vl a2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 17 to 24, 2020.

Luv 0.5.1 =E2=80=94 a libuv binding =E2=80=94 Windows support<= /h2>

Anton Bachin announced

I am pleased to announce release 0.5.1 of Luv. The main change is the addition of Windows support,= which makes Luv fully cross-platform.

Accordingly, Luv 0.5.1 is now installable from both the main opam repo, and= from opam-repository-mingw.

https://github.com/aantron/luv

Also, as a side effect of the build system refactoring that was needed to s= upport Windows, Luv's build system no longer requires Python, and supports cross-compilation.

The other noteworthy change in release 0.5.1 is a routine upgrade of the ve= ndored libuv to its latest version, 1.35.0.

resto 0.2 released

Rapha=C3=ABl Proust announced

Releases of resto 0.3 and 0.4

On behalf of Nomadic Labs, I'm happy to announce the release of versions 0.= 3 and 0.4 of resto. Both versions are available through opam and available on https://gitlab.com/nomadic-labs/resto.

The main change in 0.3 is to depend on json-data-encoding, the= fork of the unmaintained ocplib-json-typed.

The changes of 0.4 are more invasive and require users changes:

  • handle the new `Gone response code, and
  • pass gettimeofday manually.

This last feature removes a dependency from resto-cohttp to Unix, and thus helps with use within a js_of_ocaml = environment.

Bisect_ppx 2.0.0 =E2=80=94 code coverage for OCaml with nice H= TML reports

Anton Bachin announced

I am pleased to announce release 2.0.0 of Bisect_ppx, the OCaml coverage tool, which= helps you see which parts of your code are not being tested.

3D"1911adc6af89=

This release is a major upgrade. The highlights are:

  • Support for BuckleScript, js_of_ocaml, and esy. In other words, Bisect_= ppx now compiles to both native code and JS, and is published in both opam = and npm.
  • The ability to send reports automatically from Travis and CircleCI to Coveralls an= d Codecov. More integrations can be added over time.
  • The awkward (*BISECT-IGNORE*) comments for excluding code = from instrumentation have been replaced by AST attributes like [@cove= rage off] (https://github.com/aantron/bisect_ppx#Exclusion).
  • A new, more principled instrumentation algorithm.
  • A new reporter command line based on Cmdliner. Run bisect-ppx-report --h= elp to get started with it.
  • Syntax highlighting.

You are invited to peruse the all-new README for details :)

Several features have been deprecated; mostly command-line flags. You can s= ee the list in the Deprecations section of the changelog. However, it = may be easier to simply try using Bisect_ppx as before =E2=80=93 it will wa= rn you if you use a deprecated flag. The deprecated flags will be removed i= n Bisect_ppx 2.1.0, expected around July 2020.

Happy testing!

https://github.com/aantro= n/bisect_ppx

OCaml 4.09.1 released

octachron announced

We have the pleasure of celebrating the anniversary of the first spacewalk, conducted by Alexei Leonov, by announcing the release of OCaml version 4.09= .1. This is mainly a bug-fix release, with a handful of configuration fixes and a GC fix backported from 4.10.0 . See the list of changes below for more de= tails.

It is (or soon will be) available as a set of OPAM switches, and as a source download here:

https://gi= thub.com/ocaml/ocaml/archive/4.09.1.tar.gz

Changes in 4.09.1:

  • #9073, #9120: fix incorrect = GC ratio multiplier when allocating custom blocks with caml_alloc_custom_me= m in runtime/custom.c (Markus Mottl, review by Gabriel Scherer and Damien D= oligez)
  • #8855, #8858: Links for tool= s not created when installing with –disable-installing-byecode-progr= ams (e.g. ocamldep.opt installed, but ocamldep link not created) (David All= sopp, report by Thomas Leonard)
  • #8947, #9134, #9302: fix/improve support for= the BFD library (S=C3=A9bastien Hinderer, review by Damien Doligez and Dav= id Allsopp)
  • #8953, #8954: Fix error subm= essages in the toplevel: do not display dummy locations (Arma=C3=ABl Gu=C3= =A9neau, review by Gabriel Scherer)
  • #8965, #8979: Alpine build f= ailure caused by check-parser-uptodate-or-warn.sh (Gabriel Scherer and Davi= d Allsopp, report by Anton Kochkov)
  • #8985, #8986: fix generation= of the primitives when the locale collation is incompatible with C. (David= Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r, report by Sebastian Rasmus= sen)
  • #9050, #9076: install missin= g compilerlibs/ocamlmiddleend archives (Gabriel Scherer, review by Florian = Angeletti, report by Olaf Hering)
  • #9144, #9180: multiple defin= itions of global variables in the C runtime, causing problems with GCC 10.0= and possibly with other C compilers (Xavier Leroy, report by J=C3=BCrgen R= euter, review by Mark Shinwell)
  • #9180: pass = -fno-common option to C compiler when available, so as to detect problemati= c multiple definitions of global variables in the C runtime (Xavier Leroy, = review by Mark Shinwell)
  • #9128: Fix a= bug in bytecode mode which could lead to a segmentation fault. The bug was= caused by the fact that the atom table shared a page with some bytecode. T= he fix makes sure both the atom table and the minor heap have their own pag= es. (Jacques-Henri Jourdan, review by Stephen Dolan, Xavier Leroy and Gabri= el Scherer)

Cookie 0.1.6

Ulrik Strid announced

I recently released a cookie library. It can parse and create cookie header= s (list((string, string) which both Cohttp and Httpaf uses), both Set-Cookie and Cookie so it works on both client and server. It should be compliant with https://tools.ietf.org/html/rfc6= 265 and I have a pretty good test suite for the parsing of cookies at l= east.

I couldn=E2=80=99t find a standalone library before this so I decided to cr= eate one since I need it for my web framework, Morph.

The next step is to create and publish integrations with ocaml-session whi= ch I have started.

First release of lwt-pipeline

Rapha=C3=ABl Proust announced

A second release of lwt-pipeline (v0.2) is available through <= code>opam. This new release makes no change to the code and only aff= ects the following:

  • looser constraints on versions of dune dependency,
  • tests,
  • tests are executed in CI,
  • minor documentation improvements.

Using Ocaml as scripting language - piping sh commands

Nicolas Tollenaere announced

I am trying to use ocaml to pipe the result of a command to another (I woul= d also be interested in feeding a string or a io stream into a sh command). For example, I would like to do the equi= valent of cat foo.txt | grep thing, or pipe the result of one of my ocaml function into grep.

Quite surprinsingly, neither the Stdlib or Batteries Sys modules expose any= way to handle the output of Sys.command directly (I would have thought there would be optional input and output arg= uments defaulting to stdin and stdout, or something along that). Batteries IO module does expose a pipe function but = it's not clear for me how it would interact with the Sys module. Any ideas or other modules/package I could us= e ?

Nicol=C3=A1s Ojeda B=C3=A4r suggested

I think you may be interested by https://github.com/janestreet/shexp.

Nicolas Tollenaere then said

@grayswandyr @nojb Thanks for the suggestion. I just found shcaml http://tov.github.io/shcaml/doc/ = and I was going to give it a try, do you know how it compares to shexp ?

David Chemouil replied

AFAIK shcaml is unmaintained, but the approach is very nice indeed.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id EE6647EC77 for ; Tue, 31 Mar 2020 11:54:51 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=o1kQ=5Q=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ATCTjiRWlm65MAiYs9kMvgaLdth/V8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYZhKBt8tkgFKBZ4jH8fUM07OQ6P+wHzFYqb+681k8M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aVjT5Kwtu?= =?us-ascii?q?J+7xF8bNiN67zKjyoMWSME10g2/3Zax0Zl3iqRrXns0Jh81kJ7pnjlODqWROMa?= =?us-ascii?q?wekWh3I3qXng3g/YGx8I9n92JXof13s4ZLWKD+OqA5VqBwDTI8Mmlz6tev/RLE?= =?us-ascii?q?SBOn4noHTn5QlQBCAhTM6B/9TtH8r3jUrO14jQCeNMu+drs0XDW+8+8/QRvhjm?= =?us-ascii?q?EcPD488X3LotR3iLNHrRmhoR1m3oOSZ5uaYqktNpjBdM8XEDISFv1aUDZMV9jk?= =?us-ascii?q?NtddP686Je9d6rLFiR4WtxLnVFu0A+f+1jJDhnn3xLA3leM7HlOfhVFyL5c1qH?= =?us-ascii?q?3R6e7NGuISXOSylvKayCWaKetR3Sbh5YPIdBE4vPzKWqh/I5OImBsfUjjdh1DV?= =?us-ascii?q?krTLejac1+ADqW+etrUyX+WyjWUqsEd0/ijpwd0j2NDE?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AdBQALEoNehyIeaIFcCh0BAQEJAREFB?= =?us-ascii?q?QGBe4ElUwWBGFUyKoNaQIFehySFf4Eog3eFJAONKYQBgRADUA4BAwEMGAEOBQE?= =?us-ascii?q?CBAEBgw6BNgIXgh0dBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7B?= =?us-ascii?q?QMEGQuDCgMBCg4BCAo7BQceIwMJCwEGAwIEDQEXARQKAxQBEhQGgkFLAYJ8BAE?= =?us-ascii?q?KkVSbeYEyhDUBAwcJAQIPLgFBg0CBPg0CE38XgiWCfYMWg1MmD4FMP4MnSQdsg?= =?us-ascii?q?k4OCwEBAQEBAYEaGgsBAQgyHAmCUxeCRwSNZQsOAQkDJGeIBId6gV2PBXcHgkB?= =?us-ascii?q?7BIVzb4Vag3CDH4JqgkyBAocvhFmMGCGOeoFRhTcGaYEhhTyNWYE/KoFIAQEZA?= =?us-ascii?q?wwIMxowQw0HAwaCGwEBMgkJVg1Ygz6JYy8BARaBBAEJgWReM4ELgSaBPDk7hUM?= =?us-ascii?q?/MwIBAQ6BEAEBBRMLAYtegWcBAQ?= X-IPAS-Result: =?us-ascii?q?A0AdBQALEoNehyIeaIFcCh0BAQEJAREFBQGBe4ElUwWBGFU?= =?us-ascii?q?yKoNaQIFehySFf4Eog3eFJAONKYQBgRADUA4BAwEMGAEOBQECBAEBgw6BNgIXg?= =?us-ascii?q?h0dBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7BQMEGQuDCgMBCg4?= =?us-ascii?q?BCAo7BQceIwMJCwEGAwIEDQEXARQKAxQBEhQGgkFLAYJ8BAEKkVSbeYEyhDUBA?= =?us-ascii?q?wcJAQIPLgFBg0CBPg0CE38XgiWCfYMWg1MmD4FMP4MnSQdsgk4OCwEBAQEBAYE?= =?us-ascii?q?aGgsBAQgyHAmCUxeCRwSNZQsOAQkDJGeIBId6gV2PBXcHgkB7BIVzb4Vag3CDH?= =?us-ascii?q?4JqgkyBAocvhFmMGCGOeoFRhTcGaYEhhTyNWYE/KoFIAQEZAwwIMxowQw0HAwa?= =?us-ascii?q?CGwEBMgkJVg1Ygz6JYy8BARaBBAEJgWReM4ELgSaBPDk7hUM/MwIBAQ6BEAEBB?= =?us-ascii?q?RMLAYtegWcBAQ?= X-IronPort-AV: E=Sophos;i="5.72,327,1580770800"; d="scan'208,217";a="344435787" X-MGA-submission: =?us-ascii?q?MDEqaMqiq+VPMdE41KFxovZrIUdNa6k94It2e9?= =?us-ascii?q?pIOgB0vGym7LUy6lfwo5SqE0LVSer3t6iFB8hTxyfLNT6hu4cHg29efo?= =?us-ascii?q?bT8qKMaTItERJ0UqG9bczJyJ9KY5bHRLZ8yfQrgdmEQyWdD+Zwzwz247?= =?us-ascii?q?xuh06c/rwmSVAFxt3qKH2WDA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 31 Mar 2020 11:54:49 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C9BD256129C; Tue, 31 Mar 2020 11:54:45 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 31 Mar 2020 11:54:45 +0200 Message-ID: <87blocyhlm.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 31 11:54:46 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000034, queueID=6AACD5612A0 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTWFyY2ggMjQgdG8gMzEsDQoyMDIwLg0KDQpU YWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkFuIEluLURlcHRoIExvb2sg YXQgT0NhbWzigJlzIE5ldyDigJxCZXN0LUZpdOKAnSBHYXJiYWdlIENvbGxl Y3RvciBTdHJhdGVneQ0KRmlyc3QgcmVsZWFzZSBvZiBQcCwgYSBwcmV0dHkt cHJpbnRpbmcgbGlicmFyeQ0Kc291cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUg Z2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwgcmV3cml0aW5nDQpyb3V0ZXM6IHBh dGggYmFzZWQgcm91dGluZyBmb3Igd2ViIGFwcGxpY2F0aW9ucw0KQ29tcGls ZXIgRW5naW5lZXIgYXQgTWl4dGlvbmFsIENvZGUgaW4gRGFybXN0YWR0IG9y IGFueXdoZXJlIGVsc2UgaW4gR2VybWFueQ0KdGlueS1odHRwZCAwLjUNClZp c3VhbCBTdHVkaW8gQ29kZSBwbHVnaW4gZm9yIE9DYW1sDQpEaXNtYXM6IGEg dG9vbCBmb3IgYXV0b21hdGljYWxseSBtYWtpbmcgY3Jvc3MtdmVyc2lvbnMg b2Ygb3BhbSBwYWNrYWdlcw0KTXVsdGljb3JlIE9DYW1sOiBNYXJjaCAyMDIw IHVwZGF0ZQ0KT2xkIENXTg0KDQoNCkFuIEluLURlcHRoIExvb2sgYXQgT0Nh bWzigJlzIE5ldyDigJxCZXN0LUZpdOKAnSBHYXJiYWdlIENvbGxlY3RvciBT dHJhdGVneQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbi1pbi1k ZXB0aC1sb29rLWF0LW9jYW1sLXMtbmV3LWJlc3QtZml0LWdhcmJhZ2UtY29s bGVjdG9yLXN0cmF0ZWd5LzUzNzAvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFRoZSBHYXJiYWdlIENvbGxlY3RvciBpcyBw cm9iYWJseSBPQ2FtbOKAmXMgZ3JlYXRlc3QgdW5zdW5nIGhlcm8uIEl0cw0K ICBwcmFnbWF0aWMgYXBwcm9hY2ggYWxsb3dzIHVzIHRvIGFsbG9jYXRlIHdp dGhvdXQgbXVjaCBmZWFyIG9mDQogIGVmZmljaWVuY3kgbG9zcy4gV2UgbG9v a2VkIGludG8gaXRzIG5ldyAiQmVzdC1maXQiIHN0cmF0ZWd5IGFuZCBoZXJl DQogIGlzIHdoYXQgd2UgbGVhcm5lZCENCiAgW2h0dHA6Ly93d3cub2NhbWxw cm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJlc3QtZml0LWdhcmJhZ2Ut Y29sbGVjdG9yL10NCg0KDQpbaHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAy MC8wMy8yMy9vY2FtbC1uZXctYmVzdC1maXQtZ2FyYmFnZS1jb2xsZWN0b3Iv XQ0KPGh0dHA6Ly93d3cub2NhbWxwcm8uY29tLzIwMjAvMDMvMjMvb2NhbWwt bmV3LWJlc3QtZml0LWdhcmJhZ2UtY29sbGVjdG9yLz4NCg0KDQpGaXJzdCBy ZWxlYXNlIG9mIFBwLCBhIHByZXR0eS1wcmludGluZyBsaWJyYXJ5DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1maXJzdC1yZWxlYXNlLW9mLXBwLWEtcHJldHR5LXByaW50aW5nLWxp YnJhcnkvNTM3MS8xPg0KDQoNCkrDqXLDqW1pZSBEaW1pbm8gYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkg dG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgdGhlIFtwcCBsaWJy YXJ5XSEgVGhpcw0KICBsaWJyYXJ5IHByb3ZpZGVzIGEgbGVhbiBhbHRlcm5h dGl2ZSB0byB0aGUgW0Zvcm1hdCBtb2R1bGVdIG9mIHRoZQ0KICBzdGFuZGFy ZCBsaWJyYXJ5LiBJdCB1c2VzIHRoZSBzYW1lIGNvbWNlcHRzIG9mIGJveGVz IGFuZCBicmVhayBoaW50cywNCiAgaG93ZXZlciBpdCBkZWZpbmVzIGl0cyBv d24gYWxnZWJyYSB3aGljaCBzb21lIG1pZ2h0IGZpbmQgZWFzaWVyIHRvDQog IHdvcmsgd2l0aCBhbmQgcmVhc29uIGFib3V0LiAgSSBwZXJzb25hbGx5IGRv IDopIFRoZSBmaW5hbCByZW5kZXJpbmcgaXMNCiAgc3RpbGwgZG9uZSB2aWEg YSBmb3JtYXR0ZXIgd2hpY2ggbWFrZXMgaXQgZWFzeSB0byBpbnRlZ3JhdGUg YFBwJyBpbg0KICBleGlzdGluZyBwcm9ncmFtcyB1c2luZyBgRm9ybWF0Jy4N Cg0KICBXZSBpbnRyb2R1Y2VkIHRoaXMgbW9kdWxlIGluIFtEdW5lXSB0byBo ZWxwIGltcHJvdmUgdGhlIGZvcm1hdHRpbmcgb2YNCiAgbWVzc2FnZXMgcHJp bnRlZCBpbiB0aGUgdGVybWluYWwgYW5kIGl0IGhhcyBiZWVuIGEgc3VjY2Vz cy4gVGhlIG5ldw0KICBBUEkgaXMgc21hbGxlciwgc2ltcGxlciBhbmQgbWFr ZXMgaXQgZWFzeSBmb3IgZGV2ZWxvcGVycyB0byBkbyB0aGUNCiAgcmlnaHQg dGhpbmcuIE9uY2UgdGhlIGBQcCcgbW9kdWxlIG9mIER1bmUgd2FzIG1hdHVy ZSBlbm91Z2gsIHdlDQogIGRlY2lkZWQgdG8gZXh0cmFjdCBpdCBpbnRvIGEg c2VwYXJhdGUgbGlicmFyeSBzbyB0aGF0IGl0IGNvdWxkIGJlbmVmaXQNCiAg b3RoZXJzLg0KDQogIFRoZSBsaWJyYXJ5IGl0c2VsZiBpcyBjb21wb3NlZCBv ZiBhIHNpbmdsZSBgUHAnIG1vZHVsZSBhbmQgaGFzIG5vDQogIGRlcGVuZGVu Y2llcy4gIEl0cyBkb2N1bWVudGF0aW9uIGlzIHNlbGYtY29udGFpbmVkIGFu ZCBubyBwcmV2aW91cw0KICBrbm93bGVkZ2UgaXMgcmVxdWlyZWQgdG8gc3Rh cnQgdXNpbmcgaXQsIGhvd2V2ZXIgdGhlIHZhcmlvdXMgZ3VpZGVzDQogIGZv ciB0aGUgYEZvcm1hdCcgbW9kdWxlIHN1Y2ggYXMgW3RoaXMgb25lXSBzaG91 bGQgYmUgYXBwbGljYWJsZSB0bw0KICBgUHAnIGFzIHdlbGwuDQoNCiAgSWYg eW91IGhhdmUgdXNlZCBgRm9ybWF0JyBiZWZvcmUgYW5kIGxpa2UgbWUgZm91 bmQgaXRzIEFQSSBjb21wbGljYXRlZA0KICBhbmQgZGlmZmljdWx0IHRvIHVz ZSwgSSBob3BlIHRoYXQgeW91IHdpbGwgZmluZCBgUHAnIG5pY2VyIHRvIHdv cmsNCiAgd2l0aCENCg0KDQpbcHAgbGlicmFyeV0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9kaW1sL3BwPg0KDQpbRm9ybWF0IG1vZHVsZV0NCjxodHRwczovL2Nh bWwuaW5yaWEuZnIvcHViL2RvY3MvbWFudWFsLW9jYW1sL2xpYnJlZi9Gb3Jt YXQuaHRtbD4NCg0KW0R1bmVdIDxodHRwczovL2R1bmUuYnVpbGQ+DQoNClt0 aGlzIG9uZV0gPGh0dHA6Ly9jYW1sLmlucmlhLmZyL3Jlc291cmNlcy9kb2Mv Z3VpZGVzL2Zvcm1hdC5lbi5odG1sPg0KDQoNCkpvc2ggQmVyZGluZSB0aGVu IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFub3RoZXIgZ3Jl YXQgcmVzb3VyY2UgZm9yIHVuZGVyc3RhbmRpbmcgdGhlIGNvcmUgbWVudGFs IG1vZGVsIG9mDQogIEZvcm1hdCBpcyBbRm9ybWF0IFVucmF2ZWxlZF0sIGFs dGhvdWdoIGlmIEkgdW5kZXJzdGFuZCBwcCBjb3JyZWN0bHkNCiAgdGhlIGRp c2N1c3Npb24gYWJvdXQgRm9ybWF0IG5vdCBiZWluZyBkb2N1bWVudC1iYXNl ZCB3b24ndCBhcHBseSB0bw0KICBwcC4NCg0KDQpbRm9ybWF0IFVucmF2ZWxl ZF0NCjxodHRwczovL2hhbC5hcmNoaXZlcy1vdXZlcnRlcy5mci9oYWwtMDE1 MDMwODEvZmlsZS9mb3JtYXQtdW5yYXZlbGVkLnBkZj4NCg0KDQpzb3VwYXVs dDogYSBzdGF0aWMgd2Vic2l0ZSBnZW5lcmF0b3IgYmFzZWQgb24gSFRNTCBy ZXdyaXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLXNvdXBhdWx0LWEtc3RhdGljLXdlYnNpdGUtZ2Vu ZXJhdG9yLWJhc2VkLW9uLWh0bWwtcmV3cml0aW5nLzQxMjYvMTM+DQoNCg0K RGFuaWlsIEJhdHVyaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBbMS4xMC4wXSByZWxlYXNlIGlzIGF2YWlsYWJsZS4N Cg0KICBCdWcgZml4ZXM6DQogIOKAoiBGaWxlcyB3aXRob3V0IGV4dGVuc2lv bnMgYXJlIGhhbmRsZWQgY29ycmVjdGx5Lg0KDQogIE5ldyBmZWF0dXJlczoN CiAg4oCiIFBsdWdpbiBkaXNjb3Zlcnk6IGlmIHlvdSBzYXZlIGEgcGx1Z2lu IHRvIGBwbHVnaW5zL215LXBsdWdpbi5sdWEnLA0KICAgIGl0J3MgYXV0b21h dGljYWxseSBsb2FkZWQgYXMgYSB3aWRnZXQgbmFtZWQNCiAgYG15LXBsdWdp bicuIExpc3Qgb2YgcGx1Z2luIGRpcmVjdG9yaWVzIGlzIGNvbmZpZ3VyYWJs ZS4NCiAg4oCiIE5ldyBwbHVnaW4gQVBJIGZ1bmN0aW9uczogYEhUTUxnZXRf dGFnX25hbWUnLCBgSFRNTC5zZWxlY3RfYW55X29mJywNCiAgICBgSFRNTC5z ZWxlY3RfYWxsX29mJy4NCiAg4oCiIFRoZSBgSFRNTCcgbW9kdWxlIGlzIG5v dyAibW9uYWRpYyI6IGdpdmluZyBhIG5pbCB0byBhIGZ1bmN0aW9uIHRoYXQN CiAgICBleHBlY3RzIGFuIGVsZW1lbnQgZ2l2ZXMgeW91IGEgbmlsIGJhY2ss IHJhdGhlciB0aGFuIGNhdXNlIGEgcnVudGltZQ0KICAgIGVycm9yLg0KDQoN ClsxLjEwLjBdIDxodHRwczovL3NvdXBhdWx0Lm5lb2NpdGllcy5vcmcvYmxv Zy9zb3VwYXVsdC0xLjEwLXJlbGVhc2U+DQoNCg0Kcm91dGVzOiBwYXRoIGJh c2VkIHJvdXRpbmcgZm9yIHdlYiBhcHBsaWNhdGlvbnMNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXJvdXRlcy1wYXRoLWJhc2VkLXJvdXRpbmctZm9yLXdlYi1hcHBsaWNhdGlv bnMvMzYyNC82Pg0KDQoNCkFudXJhZyBTb25pIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgWzAuNy4yXSByZWxlYXNlIGlzIG5vdyBhdmFp bGFibGUgb24gb3BhbS4gVGhlcmUgaGF2ZSBiZWVuIHF1aXRlIGEgZmV3DQog IGNoYW5nZXMgc2luY2UgdGhlIHByZXZpb3VzIHZlcnNpb25zLg0KDQogIOKA oiBSb3V0ZXMgZG9lc24ndCBkZWFsIHdpdGggSFRUUCBtZXRob2RzIGFueW1v cmUNCiAg4oCiIFRoZSBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBpcyBub3cg YmFzZWQgYXJvdW5kIGEgdHJpZSBsaWtlIGRhdGENCiAgICBzdHJ1Y3R1cmUN CiAg4oCiIFJvdXRlcyBoYXZlIHByZXR0eSBwcmludGVycw0KICDigKIgc3By aW50ZiBzdHlsZSByb3V0ZSBwcmludGluZyBpcyBzdXBwb3J0ZWQgYWdhaW4N CiAg4oCiIE1pbmltdW0gc3VwcG9ydGVkIE9DYW1sIHZlcnNpb24gaXMgbm93 IDQuMDUgKGl0IHVzZWQgdG8gYmUgNC4wNikNCiAg4oCiIFRoZXJlIGlzIGEg cmVsZWFzZSBhdmFpbGFibGUgZm9yIGJ1Y2tsZXNjcmlwdCBhcyB3ZWxsIGFu ZCBpdCBpcw0KICAgIGF2YWlsYWJsZSB0byBpbnN0YWxsIHZpYSBbbnBtXS4N Cg0KDQpbMC43LjJdIDxodHRwOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMv cm91dGVzLz4NCg0KW25wbV0gPGh0dHBzOi8vd3d3Lm5wbWpzLmNvbS9wYWNr YWdlL0BhbnVyYWdzb25pL3JvdXRlcz4NCg0KDQpDb21waWxlciBFbmdpbmVl ciBhdCBNaXh0aW9uYWwgQ29kZSBpbiBEYXJtc3RhZHQgb3IgYW55d2hlcmUg ZWxzZSBpbiBHZXJtYW55DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NvbXBpbGVyLWVuZ2luZWVyLWF0LW1p eHRpb25hbC1jb2RlLWluLWRhcm1zdGFkdC1vci1hbnl3aGVyZS1lbHNlLWlu LWdlcm1hbnkvNTM3Ny8xPg0KDQoNCkdlcmQgU3RvbHBtYW5uIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVHlwZSBvZiBw b3NpdGlvbjoNCg0KICDigKIgcmVndWxhciBoaXJlIChubyBmcmVlbGFuY2Vy cykNCiAg4oCiIGZ1bGwgdGltZQ0KICDigKIgd29yayBmcm9tIGhvbWUgYW55 d2hlcmUgaW4gR2VybWFueSwgb3IgaW4gdGhlIG9mZmljZSBpbiBEYXJtc3Rh ZHQNCiAg4oCiIHdvcmsgZm9yIGEgc21hbGwgYW5kIGhpZ2hseSBza2lsbGVk IGludGVybmF0aW9uYWwgdGVhbSwgbG9jYXRlZCBpbg0KICAgIHRoZSBVUyBh bmQgRXVyb3BlDQogIOKAoiB0aGUgdGVhbSBsYW5ndWFnZSBpcyBFbmdsaXNo DQoNCiAgV2UgYXJlIGRldmVsb3BpbmcgYSBjb21waWxlciBmb3IgYSBuby1j b2RlIHBsYXRmb3JtIHRoYXQgdHJhbnNsYXRlcw0KICBvdXIgRFNMIHRvIGJ5 dGVjb2RlIGFuZC9vciBXZWJBc3NlbWJseS4gVGhlIGxhbmd1YWdlIGlzIGxh cmdlbHkgb2YNCiAgZnVuY3Rpb25hbCB0eXBlIGJ1dCBpcyBhbHNvIGFibGUg dG8gbWFuYWdlIHN0YXRlIHdpdGggYSBzcHJlYWRzaGVldA0KICBtb2RlbCwg YWxsb3dpbmcgcmVhY3RpdmUgcHJvZ3JhbW1pbmcgd2l0aG91dCBoYXZpbmcg dG8gcmVzb3J0IHRvDQogIGxpYnJhcmllcy4gVGhlIGxhbmd1YWdlIGlzIHN0 YXRpY2FsbHkgdHlwZWQgdXNpbmcgYSBIaW5kbGV5LU1pbG5lcg0KICB0eXBl IGNoZWNrZXIuIFRoZSBjb21waWxlciBpcyBwcmltYXJpbHkgd3JpdHRlbiBp biBPQ2FtbC4gT3RoZXINCiAgbGFuZ3VhZ2VzIG9mIG91ciBwbGF0Zm9ybSBh cmUgR28sIEVsbSwgYW5kIEphdmFzY3JpcHQuDQoNCiAgV2UgYXJlIGxvb2tp bmcgZm9yIGEgY29tcGlsZXIgZW5naW5lZXIgd2l0aCBzdHJvbmcgc2tpbGxz IGluIGFsbA0KICByZWxldmFudCBhcmVhczoNCg0KICDigKIgZmx1ZW50IGlu IE9DYW1sIG9yIGEgc2ltaWxhciBsYW5ndWFnZSBzdWNoIGFzIEhhc2tlbGwN CiAg4oCiIFVuZGVyc3RhbmRpbmcgb2YgdGhlIHN0cnVjdHVyZSBvZiB0aGUg RFNMLCBpbmNsdWRpbmcgc3ludGF4IGFuZA0KICAgIHNlbWFudGljcw0KICDi gKIgVHJhbnNsYXRpb24gb2YgRlAgbGFuZ3VhZ2VzIHRvIGV4ZWN1dGFibGUg Y29kZQ0KICDigKIgQ29kZSBvcHRpbWl6YXRpb24NCiAg4oCiIEdyYXBoIGFs Z29yaXRobXMNCiAg4oCiIFR5cGUgY2hlY2tpbmcNCg0KICBXZSBhcmUgb3Bl biB0byBib3RoIGp1bmlvcnMgYW5kIHNlbmlvcnMsIGFuZCBwYXltZW50IHdp bGwgYmUNCiAgYWNjb3JkaW5nbHkuIFdlIGFyZSBub3Qgc28gbXVjaCBpbnRl cmVzdGVkIGluIGZvcm1hbCBjZXJ0aWZpY2F0aW9ucw0KICBidXQgcmF0aGVy IGluIHJlYWwgcHJhY3RpY2UsIGVpdGhlciBmcm9tIHByZXZpb3VzIGpvYnMs IHJlc2VhcmNoDQogIHByb2plY3RzLCBvciBjb250cmlidXRpb25zIHRvIG9w ZW4gc291cmNlIHByb2plY3RzLg0KDQogIFRoZSBuby1jb2RlIHBsYXRmb3Jt IGlzIGJlaW5nIGRldmVsb3BlZCBieSBlbmdpbmVlcnMgaW4gRXVyb3BlIGFu ZCB0aGUNCiAgVVMgYXQgdmFyaW91cyBwbGFjZXMsIGFuZCB3ZSB1c3VhbGx5 IGRvIG5vdCBtZWV0IHBoeXNpY2FsbHkgYnV0IGluDQogIHZpZGVvIGNvbmZl cmVuY2VzLiBXb3JraW5nIGZyb20gaG9tZSBpcyB2ZXJ5IHVzdWFsLiBXZSBh bHNvIGdldCB5b3UgYQ0KICBkZXNrIGluIHlvdXIgaG9tZSB0b3duIGlmIHlv dSBwcmVmZXIgdGhpcy4gVGhlIGNvbXBpbGVyIGRldmVsb3BtZW50IGlzDQog IGxlYWQgYnkgR2VyZCBTdG9scG1hbm4gZnJvbSBEYXJtc3RhZHQuDQoNCiAg RHVlIHRvIHRoZSBzdHJvbmcgY29ubmVjdGlvbnMgdG8gdGhlIFVTLCB2aWRl byBjb25mZXJlbmNlcyB3aWxsIG9mdGVuDQogIGhhdmUgdG8gdGFrZSBwbGFj ZSBpbiBldmVuaW5nIGhvdXJzLCB1bnRpbCBhcm91bmQgN3BtIG9yIDhwbS4N Cg0KICBBcHBsaWNhdGlvbnM6IHBsZWFzZSBmb2xsb3cgdGhlICJBcHBseSIg bGluayBhdCB0aGUgb2ZmaWNpYWwgd2ViIHBhZ2UNCiAgZGVzY3JpYmluZyB0 aGUgcG9zaXRpb246IDxodHRwczovL3JteC5taXh0aW9uYWwuZGUvc3RhdGlj LzU0NjU3Y2RhLz4NCg0KICBHZXJkIFN0b2xwbWFubg0KICBDRU8gb2YgTWl4 dGlvbmFsIENvZGUgR21iSCAoYW5kIE9DYW1sIGhhY2tlciBvZiB0aGUgZmly c3QgaG91cikNCiAgQ29udGFjdCBhbmQgY29tcGFueSBkZXRhaWxzOiA8aHR0 cHM6Ly93d3cubWl4dGlvbmFsLmRlL2NvbnRhY3QuaHRtbD4NCg0KDQpTw6li YXN0aWVuIEJlc25pZXIgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEknbSBsaXZpbmcgaW4gRnJhbmNlLCBjYW4gSSBhcHBseSB0byB0 aGUgcG9zaXRpb24gKHdlIGFyZSBuZWlnaGJvcnMhKT8NCg0KDQpHZXJkIFN0 b2xwbWFubiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBX ZWxsLCBJIGNhbiAoYXQgdGhlIG1vbWVudCkgb25seSBtYWtlIGNvbnRyYWN0 cyB1c2luZyBHZXJtYW4gbGF3IGFuZA0KICBmb3IgdGhlIHNvY2lhbCBzZWN1 cml0eSBzeXN0ZW0gaGVyZS4gU28sIGlmIHlvdSBuZWVkIGEgZG9jdG9yIHlv dSdkDQogIGhhdmUgdG8gdHJhdmVs4oCmIElmIG15IGNvbXBhbnkgd2FzIGEg Yml0IGJpZ2dlciB0aGVyZSB3b3VsZCBiZSB0aGUNCiAgb3B0aW9uIG9mIG9w ZW5pbmcgYSBzZWNvbmQgc2l0ZSBpbiBGcmFuY2UgKGV2ZW4gYSB2ZXJ5IG1p bmltYWwgb25lKSwNCiAgYnV0IHRoZSBzZXR1cCBjb3N0cyBhcmUgc28gZmFy IHRvbyBoaWdoIChsYXd5ZXJzIGFuZCBhY2NvdW50YW50cyksIGFuZA0KICBp dCBpcyB0b28gZGlzdHJhY3RpbmcgZm9yIG1lIHRvIGtlZXAgdXAgd2l0aCB0 aGUgZmluZSBwb2ludHMgb2YgdGhlDQogIHN5c3RlbSBpbiBGcmFuY2UuIFVu Zm9ydHVuYXRlbHksIHRoZSBFVSBpcyBub3QgdGhhdCBmYXIgdGhhdCBpdCBp cw0KICBzdXBlciBzaW1wbGUgZm9yIGFuIGVtcGxveWVyIHRvIGhpcmUgYW55 d2hlcmUgaW4gRXVyb3BlLiAtIFRoYW5rcyBmb3INCiAgYXNraW5nLg0KDQoN CnRpbnktaHR0cGQgMC41DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi10aW55LWh0dHBkLTAtNS81MzgxLzE+DQoNCg0K U2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEkganVzdCByZWxlYXNlZCB0aW55LWh0dHBkIDAuNSBhbmQg dGhlIG5ldyB0aW55LWh0dHBkLWNhbWx6aXAsIHdoaWNoDQogIG1ha2VzIGl0 IHBvc3NpYmxlIHRvIHVzZSBgZGVmbGF0ZScgdHJhbnNwYXJlbnRseSBmb3Ig cXVlcmllcyBhbmQNCiAgcmVzcG9uc2VzLiBUaGUgc2VydmVyIGhhcyBldm9s dmVkIHF1aWV0bHkgYW5kIGlzIGdldHRpbmcgc29tZXdoYXQgbW9yZQ0KICBy b2J1c3Q6IEknbSB1c2luZyBpdCBmb3IgYW4gaW50ZXJuYWwgdG9vbCB3aXRo IGJpZyBodG1sIHBhZ2VzICh1cCB0bw0KICBzZXZlcmFsIE1CKSBhbmQgaXQn cyByZWFzb25hYmx5IGZhc3QgYW5kIGRvZXNuJ3Qgc2VlbSB0bw0KICBtZW1s ZWFrLiBUaGVyZSdzIGFsc28gYW4gaW1wcm92ZWQgYGh0dHBfb2ZfZGlyJyB0 byBxdWlja2x5IGFuZCBzaW1wbHkNCiAgc2VydmUgYSBkaXJlY3Rvcnkgb24g YW4gYXJiaXRyYXJ5IHBvcnQuDQoNCiAgUHJldmlvdXMgYW5ub3VuY2VtZW50 IFtoZXJlXQ0KDQoNCltoZXJlXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi10aW55LWh0dHBkLTAtMS80NzI3Pg0KDQoNClZpc3VhbCBTdHVk aW8gQ29kZSBwbHVnaW4gZm9yIE9DYW1sDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1wcmV2aWV3LXZpc3VhbC1zdHVkaW8tY29kZS1wbHVnaW4tZm9yLW9jYW1s LzUzOTUvMT4NCg0KDQpSdWRpIEdyaW5iZXJnIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHByb3VkIHRvIGFubm91bmNl IGEgcHJldmlldyByZWxlYXNlIG9mIGFuIFtWU0MgZXh0ZW5zaW9uIGZvcg0K ICBPQ2FtbF0uIFlvdSBjYW4gZmV0Y2ggYW5kIGluc3RhbGwgdGhpcyBwbHVn aW4gZGlyZWN0bHkgZnJvbSB0aGUNCiAgZXh0ZW5zaW9uIG1hcmtldHBsYWNl IGlmIHlvdSBzZWFyY2ggZm9yICJPQ2FtbCBMYWJzIi4gVGhlIGV4dGVuc2lv bg0KICBpc24ndCB5ZXQgbWF0dXJlLCBidXQgSSBiZWxpZXZlIHRoYXQgaXQg b2ZmZXJzIGEgdXNlciBleHBlcmllbmNlDQogIGNvbXBhcmFibGUgdG8gb3Ro ZXIgVlNDIGV4dGVuc2lvbnMgZm9yIE9DYW1sIGFscmVhZHkuIFRoZSBwbHVn aW4NCiAgc2hvdWxkIGJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBbb2Nh bWwtbHNwXQ0KDQogIFRoZSBleHRlbnNpb24gaXMgZm9yIHRoZSBPQ2FtbCAi cGxhdGZvcm0iLCB3aGljaCBtZWFucyB0aGF0IGl0cyBzY29wZQ0KICBpbmNs dWRlcyBzdXBwb3J0IGZvciB2YXJpb3VzIHRvb2xzIHVzZWQgaW4gT0NhbWwg ZGV2ZWxvcG1lbnQgc3VjaCBhcw0KICBkdW5lLCBvcGFtLg0KDQogIEJ1ZyBy ZXBvcnRzICYgY29udHJpYnV0aW9ucyBhcmUgd2VsY29tZS4gSGFwcHkgaGFj a2luZy4NCg0KDQpbVlNDIGV4dGVuc2lvbiBmb3IgT0NhbWxdDQo8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0+ DQoNCltvY2FtbC1sc3BdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwtbHNwPg0KDQoNCkRpc21hczogYSB0b29sIGZvciBhdXRvbWF0aWNhbGx5 IG1ha2luZyBjcm9zcy12ZXJzaW9ucyBvZiBvcGFtIHBhY2thZ2VzDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcm90b3R5cGUt ZGlzbWFzLWEtdG9vbC1mb3ItYXV0b21hdGljYWxseS1tYWtpbmctY3Jvc3Mt dmVyc2lvbnMtb2Ytb3BhbS1wYWNrYWdlcy81NDA0LzE+DQoNCg0KRGFuaWls IEJhdHVyaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBvcGFtLWNyb3NzLSogYXJlIHNlcmlvdXNseSBsYWdnaW5nIGJl aGluZCB0aGUgb2ZmaWNpYWwgb3BhbSByZXBvc2l0b3J5DQogIGFuZCBmZG9w ZW4ncyBvcGFtLXdpbmRvd3MsIG5vdCBsZWFzdCBiZWNhdXNlIGltcG9ydGlu ZyBwYWNrYWdlcyBieQ0KICBoYW5kIGlzIGEgbG90IG9mIHdvcmsuICBJIHN1 cHBvc2UgYXQgbGVhc3QgYSBzZW1pLWF1dG9tYXRlZCBwcm9jZXNzDQogIGNv dWxkIGhlbHAgdGhvc2UgcmVwb3MgZ3JvdyBhbmQgc3RheSBpbiBzeW5jIHdp dGggdGhlIHVwc3RyZWFtIG11Y2gNCiAgZmFzdGVyLg0KDQogIEkndmUgbWFk ZSBhIHByb3RvdHlwZSBvZiBhIHRvb2wgZm9yICJzdGVhbGluZyIgcGFja2Fn ZXMgaW50bw0KICBjcm9zcy1yZXBvcy4gRm9yIG9idmlvdXMgcmVhc29ucyBp dCdzIGNhbGxlZCBEaXNtYXMuICBZb3UgY2FuIGZpbmQgaXQNCiAgaGVyZTog PGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vc2NyaXB0cy9ibG9iL21h c3Rlci9kaXNtYXMubWw+DQoNCiAgTGltaXRhdGlvbnM6DQoNCiAg4oCiIHRo ZSBjb2RlIGlzIGEgcmVhbCBtZXNzIGZvciBub3cNCiAg4oCiIG9ubHkgZHVu ZSBpcyBzdXBwb3J0ZWQgYnkgYXV0b21hdGljIGJ1aWxkIGNvbW1hbmQgYWRq dXN0bWVudA0KICDigKIgaXQgY2Fubm90IGhhbmRsZSBjYXNlcyB3aGVuIGJv dGggbmF0aXZlIGFuZCBjcm9zcy12ZXJzaW9uIG9mIGENCiAgICBkZXBlbmRl bmN5IGFyZSBuZWVkZWQNCg0KICBIb3dldmVyOg0KDQogIOKAoiBGb3Igc2lt cGxlIHBhY2thZ2VzIHRoYXQgdXNlIGR1bmUgZXhjbHVzaXZlbHksIGl0J3Mg Y29tcGxldGVseQ0KICAgIGF1dG9tYXRlZC4gSSd2ZSBwb3J0ZWQgYmlnc3Ry ZWFtYWYgYW5kIGFuZ3N0cm9tIHRvIHRlc3QgaXQsIGFuZA0KICAgIGNyb3Nz LXZlcnNpb25zIGJ1aWx0IGp1c3QgZmluZSBmcm9tIGl0cyBvdXRwdXQsIG5v IGVkaXRpbmcgd2FzDQogICAgbmVlZGVkLg0KICDigKIgSXQgYXV0b21hdGlj YWxseSBjb252ZXJ0cyBkZXBlbmRlbmNpZXMgZnJvbSBmb28gdG8gdG9vLSR0 b29sY2hhaW4NCiAgICBhbmQgcmVtb3ZlcyBkZXBlbmRlbmNpZXMgYW5kIGJ1 aWxkIHN0ZXBzIG9ubHkNCiAgbmVlZGVkIGZvciBgd2l0aC10ZXN0JyBhbmQg YHdpdGgtZG9jJy4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgLi9k aXNtYXMubWwgd2luZG93cyBjb250YWluZXJzIH4vZGV2ZWwvb3BhbS1yZXBv c2l0b3J5L3BhY2thZ2VzL2NvbnRhaW5lcnMvY29udGFpbmVycy4yLjguMS9v cGFtDQogIOKUgiBvcGFtLXZlcnNpb246ICIyLjAiDQogIOKUgiBtYWludGFp bmVyOiAic2ltb24uY3J1YW5lcy4yMDA3QG00eC5vcmciDQogIOKUgiBzeW5v cHNpczoNCiAg4pSCICAgIkEgbW9kdWxhciwgY2xlYW4gYW5kIHBvd2VyZnVs IGV4dGVuc2lvbiBvZiB0aGUgT0NhbWwgc3RhbmRhcmQgbGlicmFyeSINCiAg 4pSCIGJ1aWxkOiBbDQogIOKUgiAgIFsiZHVuZSIgImJ1aWxkIiAiLXAiICJj b250YWluZXJzIiAiLWoiIGpvYnMgIi14IiAid2luZG93cyJdDQogIOKUgiBd DQogIOKUgiBkZXBlbmRzOiBbDQogIOKUgiAgICJvY2FtbC13aW5kb3dzIiB7 Pj0gIjQuMDMuMCJ9DQogIOKUgiAgICJkdW5lIiB7Pj0gIjEuMSJ9DQogIOKU giAgICJkdW5lLWNvbmZpZ3VyYXRvciINCiAg4pSCICAgInNlcS13aW5kb3dz Ig0KICDilIIgXQ0KICDilIIgZGVwb3B0czogWyJiYXNlLXVuaXgiICJiYXNl LXRocmVhZHMiXQ0KICDilIIgdGFnczogWyJzdGRsaWIiICJjb250YWluZXJz IiAiaXRlcmF0b3JzIiAibGlzdCIgImhlYXAiICJxdWV1ZSJdDQogIOKUgiBo b21lcGFnZTogImh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvb2NhbWwtY29u dGFpbmVycy8iDQogIOKUgiBkb2M6ICJodHRwczovL2MtY3ViZS5naXRodWIu aW8vb2NhbWwtY29udGFpbmVycyINCiAg4pSCIGRldi1yZXBvOiAiZ2l0K2h0 dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvb2NhbWwtY29udGFpbmVycy5naXQi DQogIOKUgiBidWctcmVwb3J0czogImh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1 YmUvb2NhbWwtY29udGFpbmVycy9pc3N1ZXMvIg0KICDilIIgYXV0aG9yczog IlNpbW9uIENydWFuZXMiDQogIOKUgiB1cmwgew0KICDilIIgICBzcmM6ICJo dHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL29jYW1sLWNvbnRhaW5lcnMvYXJj aGl2ZS92Mi44LjEudGFyLmd6Ig0KICDilIIgICBjaGVja3N1bTogWw0KICDi lIIgICAgICJtZDU9ZDg0ZTA5YzVkMGFiYzUwMWFhMTdjZDUwMmUzMWEwMzgi DQogIOKUgiAgICAgInNoYTUxMj04YjgzMmY0YWRhNjAzNWU4MGQ4MWJlMGNm YjdiZGZmYjY5NWVjNjdkNDY1ZWQ2MDk3YTE0NDAxOWUyYjhhOGY5MDkwOTVl NzgwMTljM2RhMmQ4MTgxY2MzY2Q3MzBjZDQ4Zjc1MTllODdkMzE2MjQ0MjU2 MjEwM2I3ZjM2YWFiYiINCiAg4pSCICAgXQ0KICDilIIgfQ0KICDilIINCiAg 4pSCICQgLi9kaXNtYXMubWwgd2luZG93cyBjb250YWluZXJzIH4vZGV2ZWwv b3BhbS1yZXBvc2l0b3J5L3BhY2thZ2VzL2NvbnRhaW5lcnMvY29udGFpbmVy cy4yLjguMS9vcGFtIHwgZGlmZg0KICDilIIgfi9kZXZlbC9vcGFtLXJlcG9z aXRvcnkvcGFja2FnZXMvY29udGFpbmVycy9jb250YWluZXJzLjIuOC4xL29w YW0gLQ0KICDilIIgM2MzLDQNCiAg4pSCIDwgc3lub3BzaXM6ICJBIG1vZHVs YXIsIGNsZWFuIGFuZCBwb3dlcmZ1bCBleHRlbnNpb24gb2YgdGhlIE9DYW1s IHN0YW5kYXJkIGxpYnJhcnkiDQogIOKUgiAtLS0NCiAg4pSCID4gc3lub3Bz aXM6DQogIOKUgiA+ICAgIkEgbW9kdWxhciwgY2xlYW4gYW5kIHBvd2VyZnVs IGV4dGVuc2lvbiBvZiB0aGUgT0NhbWwgc3RhbmRhcmQgbGlicmFyeSINCiAg 4pSCIDUsN2M2DQogIOKUgiA8ICAgWyJkdW5lIiAiYnVpbGQiICItcCIgbmFt ZSAiLWoiIGpvYnNdDQogIOKUgiA8ICAgWyJkdW5lIiAiYnVpbGQiICJAZG9j IiAiLXAiIG5hbWUgXSB7d2l0aC1kb2N9DQogIOKUgiA8ICAgWyJkdW5lIiAi cnVudGVzdCIgIi1wIiBuYW1lICItaiIgam9ic10ge3dpdGgtdGVzdH0NCiAg 4pSCIC0tLQ0KICDilIIgPiAgIFsiZHVuZSIgImJ1aWxkIiAiLXAiICJjb250 YWluZXJzIiAiLWoiIGpvYnMgIi14IiAid2luZG93cyJdDQogIOKUgiAxMCwx MWM5LDEwDQogIOKUgiA8ICAgIm9jYW1sIiB7ID49ICI0LjAzLjAiIH0NCiAg 4pSCIDwgICAiZHVuZSIgeyA+PSAiMS4xIiB9DQogIOKUgiAtLS0NCiAg4pSC ID4gICAib2NhbWwtd2luZG93cyIgez49ICI0LjAzLjAifQ0KICDilIIgPiAg ICJkdW5lIiB7Pj0gIjEuMSJ9DQogIOKUgiAxMywyMWMxMg0KICDilIIgPCAg ICJzZXEiDQogIOKUgiA8ICAgInF0ZXN0IiB7IHdpdGgtdGVzdCB9DQogIOKU giA8ICAgInFjaGVjayIgeyB3aXRoLXRlc3QgfQ0KICDilIIgPCAgICJvdW5p dCIgeyB3aXRoLXRlc3QgfQ0KICDilIIgPCAgICJpdGVyIiB7IHdpdGgtdGVz dCB9DQogIOKUgiA8ICAgImdlbiIgeyB3aXRoLXRlc3QgfQ0KICDilIIgPCAg ICJ1dXRmIiB7IHdpdGgtdGVzdCB9DQogIOKUgiA8ICAgIm1keCIgeyB3aXRo LXRlc3QgJiA+PSAiMS41LjAiICYgPCAiMi4wLjAiIH0NCiAg4pSCIDwgICAi b2RvYyIgeyB3aXRoLWRvYyB9DQogIOKUgiAtLS0NCiAg4pSCID4gICAic2Vx LXdpbmRvd3MiDQogIOKUgiAyMywyN2MxNCwxNQ0KICDilIIgPCBkZXBvcHRz OiBbDQogIOKUgiA8ICAgImJhc2UtdW5peCINCiAg4pSCIDwgICAiYmFzZS10 aHJlYWRzIg0KICDilIIgPCBdDQogIOKUgiA8IHRhZ3M6IFsgInN0ZGxpYiIg ImNvbnRhaW5lcnMiICJpdGVyYXRvcnMiICJsaXN0IiAiaGVhcCIgInF1ZXVl IiBdDQogIOKUgiAtLS0NCiAg4pSCID4gZGVwb3B0czogWyJiYXNlLXVuaXgi ICJiYXNlLXRocmVhZHMiXQ0KICDilIIgPiB0YWdzOiBbInN0ZGxpYiIgImNv bnRhaW5lcnMiICJpdGVyYXRvcnMiICJsaXN0IiAiaGVhcCIgInF1ZXVlIl0N CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpbmdzIHRvIGRvOg0KDQogIOKA oiBpZGVudGlmeSBhbGwgcGFja2FnZXMgdGhhdCBkb24ndCBuZWVkIGNyb3Nz LXZlcnNpb25zLiBJcyBjcHBvIG9uZSBvZg0KICAgIHRoZW0sIGZvciBleGFt cGxlPw0KICDigKIgYWRkIHN1cHBvcnQgZm9yIGNhc2VzIHdoZW4gYm90aCBu YXRpdmUgYW5kIGNyb3NzIHZlcnNpb25zIGFyZQ0KICAgIG5lZWRlZC4gSWYg bWVuaGlyIHRoZSBvbmx5IG9uZT8NCiAg4oCiIGFkZCBzdXBwb3J0IGZvciBv dGhlciBidWlsZCBzeXN0ZW1zLiBEbyBhbGwgb2YgdGhlbSB3b3JrIHdlbGwg d2l0aA0KICAgIGBPQ0FNTEZJTkRfVE9PTENIQUlOPXdpbmRvd3NgIGlmIHRo ZSBidWlsZCBzZXR1cCBpcyB3cml0dGVuDQogICAgY29ycmVjdGx5Pw0KDQog IElucHV0IGZyb20gQHRvb3RzIGFuZCBAcGlyYm8gaXMgd2VsY29tZS4NCg0K DQpSb21haW4gQmVhdXhpcyB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFRoYXQncyBhIGdyZWF0IGluaXRpYXRpdmUhIEhl cmUgYXJlIGEgY291cGxlIG9mIHRob3VnaHRzOg0KICDigKIgRm9yIGR1bmUt YmFzZWQgcGFja2FnZXMsIHRoaW5ncyBhcmUgaW5kZWVkIHByZXR0eQ0KICAg IHN0cmFpZ2h0LWZvcndhcmQuIEZpbmRpbmcgb3V0IHdoaWNoIGRlcGVuZGVu Y2llcyBuZWVkIHRvIGJlIHBvcnRlZA0KICAgIGFzIGNyb3NzLWRlcGVuZGVu Y3kgaXMgaW5kZWVkIHRoZSBwYXJ0IHRoYXQncyBoYXJkIHRvIGF1dG9tYXRp emUNCiAg4oCiIEZvciBvdGhlciBidWlsZCBzeXN0ZW1zLCBpdCdzIGxlc3Mg Y2xlYXIgdG8gbWUgaG93IHRvDQogICAgYXV0b21hdGl6ZS4gTWF5YmUgb3Ro ZXJzIGhhdmUgc29tZSB0aG91Z2h0cyBhYm91dCBpdC4NCiAg4oCiIFRoZSBD SSBzeXN0ZW0gb24gb3BhbS1jcm9zcy13aW5kb3dzIGlzIHByZXR0eSBnb29k IGF0IGJ1aWxkaW5nIGZyb20NCiAgICBzY3JhdGNoIGFuZCBmYWlsaW5nIGlm IHNvbWUgZGVwcyBhcmUgbWlzc2luZyBzbyB0cmlhbCBhbmQgZXJyb3INCiAg ICB0aGVyZSBjYW4gYmUgYSBncmVhdCB0b29sLg0KICDigKIgT25jZSBzb2x2 ZWQgZm9yIG9uZSBjcm9zcyBzaXR1YXRpb24sIHRoZSBwcm9ibGVtIG9mDQog ICAgY3Jvc3MtZGVwZW5kZW5jaWVzIHNob3VsZCBiZSBleGFjdGx5IHRoZSBz YW1lIGZvciBhbGwgb3RoZXIgY3Jvc3MNCiAgICBlbnZpcm9ubWVudCAoYW5k cm9pZCwgaU9TKQ0KDQogIEkgaGF2ZW4ndCBsb29rZWQgYXQgdGhlIHRvb2wg dmVyeSBjbG9zZWx5IHlldCBidXQgSSdkIHNheSBhIGZpcnN0DQogIGltcHJv dmVtZW50IHdvdWxkIGJlIHRvIGJlIGFibGUgdG8gdHJhY2sgY3Jvc3MtZGVw ZW5kZW5jaWVzIHJlc29sdXRpb24NCiAgYW5kIGdlbmVyYXRlIG5ldyB2ZXJz aW9uIG9mIHRoZSBwYWNrYWdlIHVzaW5nIHRoZW0gYW5kL29yIGdlbmVyYXRl DQogIG90aGVyIGNyb3NzLWNvbXBpbGVkIHBhY2thZ2VzIHVzaW5nIHRoZW0u DQoNCg0KQW50b24gS29jaGtvdiBzYWlkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGb3Ig YXV0b21hdGVkIHB1bGwgcmVxdWVzdHMsIHlvdSBtaWdodCBiZSBpbnRlcmVz dGVkIGluDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZGVwZW5k YWJvdC1hbmQtb2NhbWwvNDI4Mj4NCg0KDQpEYW5paWwgQmF0dXJpbiB0aGVu IGFza2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ J20gbm90IHN1cmUgaWYgSSB1bmRlcnN0YW5kIHRoZSBwcmVtaXNlIG9mIGRl cGVuZGFib3QuIFdoeSB3b3VsZA0KICBhbnlvbmUgaGFyZGNvZGUgc3BlY2lm aWMgZGVwZW5kZW5jeSB2ZXJzaW9ucz8gTWF5YmUgaXQgbWFrZXMgc2Vuc2Ug aW4NCiAgY2VydGFpbiBlY29zeXN0ZW1zIHRoYXQgc3VmZmVyIGZyb20gbmV2 ZXItZW5kaW5nIGVjb2xvZ2ljYWwgZGlzYXN0ZXJz4oCmDQogIDspDQoNCiAg SW4gYW55IGNhc2UsIG1vc3Qgb3BhbSBwYWNrYWdlcyBkb24ndCBoYXZlIGEg Y29uc3RyYWludCBvbiB0aGUgdXBwZXINCiAgdmVyc2lvbnMgb2YgdGhlaXIg ZGVwZW5kZW5jaWVzLiBDYW4gZGVwZW5kYWJvdCB1c2UgY3VzdG9tIHRyYWNr aW5nDQogIHJ1bGVzIHRvIGNoZWNrIGZvciBwcmVzZW5zZSBvZiBhIG5ld2Vy IHZlcnNpb24gaW4gdGhlIHJlcG8/ICBNeQ0KICB0aG91Z2h0IHdhcyBtdWNo IHNpbXBsZXIgYWN0dWFsbHk6IHRyYWNrIHRoZSBjb21taXRzIGluDQogIG9w YW0tcmVwb3NpdG9yeSwgcnVuIHJlY2VudGx5IGNoYW5nZWQgZmlsZXMgdGhy b3VnaCBEaXNtYXMgYW5kIHNlbmQNCiAgcHVsbCByZXF1ZXN0cyB0byBvcGFt LWNyb3NzLSoNCg0KDQpZYXdhciBBbWluIHJlcGxpZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEl0J3MgY29tbW9uIHByYWN0aWNlIG5vd2FkYXlzIHRvIHVzZSBzZW1h bnRpYyB2ZXJzaW9uaW5nIGFuZCBoYXZlDQogIGxvY2tmaWxlcyBmb3IgcmVw cm9kdWNpYmxlIGJ1aWxkcy4gRGVwZW5kYWJvdCB1cGRhdGVzIHNlbWFudGlj IHZlcnNpb24NCiAgcmFuZ2VzIGFuZCBsb2NrZmlsZXMuIFNlZSBlLmcuDQoN CiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20vdGhvdWdodGJvdC92ZWx2ZXRl ZW4vcHVsbC8zMS9maWxlcz4NCiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20v bW96aWxsYS9hZHIvcHVsbC83Ny9maWxlcz4NCg0KDQpNdWx0aWNvcmUgT0Nh bWw6IE1hcmNoIDIwMjAgdXBkYXRlDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRpY29y ZS1vY2FtbC1tYXJjaC0yMDIwLXVwZGF0ZS81NDA2LzE+DQoNCg0KQW5pbCBN YWRoYXZhcGVkZHkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBXZWxjb21lIHRvIHRoZSBNYXJjaCAyMDIw IG5ld3MgdXBkYXRlIGZyb20gdGhlIE11bHRpY29yZSBPQ2FtbCB0ZWFtIQ0K ICBUaGlzIHVwZGF0ZSBoYXMgYmVlbiBhc3NlbWJsZWQgd2l0aCBAc2hha3Ro aW1hYW4gYW5kIEBrYXljZWVzcmssIGFzDQogIHdpdGggdGhlIFtGZWJydWFy eV0gYW5kIFtKYW51YXJ5XSBvbmVzLg0KDQogIE91ciB3b3JrIHRoaXMgbW9u dGggd2FzIHByaW1hcmlseSBmb2N1c2VkIG9uIHBlcmZvcm1hbmNlIGltcHJv dmVtZW50cw0KICB0byB0aGUgTXVsdGljb3JlIE9DYW1sIGNvbXBpbGVyIGFu ZCBydW50aW1lLCBhcyBwYXJ0IG9mIGENCiAgY29tcHJlaGVuc2l2ZSBldmFs dWF0aW9uIGV4ZXJjaXNlLiBXZSBjb250aW51ZSB0byBhZGQgYWRkaXRpb25h bA0KICBiZW5jaG1hcmtzIHRvIHRoZSBTYW5kbWFyayB0ZXN0IHN1aXRlLiBU aGUgZXZlbnRsb2cgdHJhY2luZyBzeXN0ZW0gYW5kDQogIHRoZSB1c2Ugb2Yg aGFzaCB0YWJsZXMgZm9yIG1hcnNoYWxpbmcgaW4gdXBzdHJlYW0gT0NhbWwg YXJlIGluDQogIHByb2dyZXNzLCBhbmQgbW9yZSBQUnMgYXJlIGJlaW5nIHF1 ZXVlZCB1cCBmb3IgT0NhbWwgNC4xMS4wLWRldiBhcw0KICB3ZWxsLg0KDQog IFRoZSBiaWdnZXN0IG9ic2VydmFibGUgY2hhbmdlIGZvciB1c2VycyB0cnlp bmcgdGhlIGJyYW5jaCBpcyB0aGF0IGENCiAgbmV3IEdDICh0aGUgInBhcmFs bGVsIG1pbm9yIGdjIikgaGFzIGJlZW4gbWVyZ2VkIGluIHByZWZlcmVuY2Ug dG8gdGhlDQogIHByZXZpb3VzIG9uZSAoInRoZSBjb25jdXJyZW50IG1pbm9y IGdjIikuICBXZSB3aWxsIGhhdmUgdGhlIGRldGFpbHMgaW4NCiAgbG9uZ2Vy IGZvcm0gYXQgYSBsYXRlciBzdGFnZSwgYnV0IHRoZSBlc3NlbnRpYWwgZ2lz dCBpcyB0aGF0ICp0aGUNCiAgcGFyYWxsZWwgbWlub3IgR0Mgbm8gbG9uZ2Vy IHJlcXVpcmVzIGEgcmVhZCBiYXJyaWVyIG9yIGNoYW5nZXMgdG8gdGhlDQog IEMgQVBJKi4gIEl0IG1heSBoYXZlIHNsaWdodGx5IHdvcnNlIHNjYWxhYmls aXR5IHByb3BlcnRpZXMgYXQgYSB2ZXJ5DQogIGhpZ2ggbnVtYmVyIG9mIGNv cmVzLCBidXQgaXMgcm91Z2hseSBlcXVpdmFsZW50IGF0IHVwIHRvIDI0IGNv cmVzIGluDQogIG91ciBldmFsdWF0aW9ucy4gIEdpdmVuIHRoZSB2YXN0IHVz YWJpbGl0eSBpbXByb3ZlbWVudCBmcm9tIG5vdCBoYXZpbmcNCiAgdG8gcG9y dCBleGlzdGluZyBDIEZGSSB1c2VzLCB3ZSBoYXZlIGRlY2lkZWQgdG8gbWFr ZSB0aGUgcGFyYWxsZWwNCiAgbWlub3IgR0MgdGhlIGRlZmF1bHQgb25lIGZv ciBvdXIgZmlyc3QgdXBzdHJlYW0gcnVudGltZSBwYXRjaGVzLiBUaGUNCiAg Y29uY3VycmVudCBtaW5vciBHQyBmb2xsb3cgYXQgYSBsYXRlciBzdGFnZSB3 aGVuIHdlIHJhbXAgdXAgdGVzdGluZyB0bw0KICA2NC1jb3JlKyBtYWNoaW5l cy4gIFRoZSBbbXVsdGljb3JlIG9wYW0gcmVtb3RlXSBoYXMgYmVlbiB1cGRh dGVkIHRvDQogIHJlZmxlY3QgdGhlc2UgY2hhbmdlcywgZm9yIHRob3NlIHdo byB3aXNoIHRvIHRyeSBpdCBvdXQgYXQgaG9tZS4NCg0KICBXZSBhcmUgbm93 IGF0IGEgc3RhZ2Ugd2hlcmUgd2UgYXJlIHBvcnRpbmcgbGFyZ2VyIGFwcGxp Y2F0aW9ucyB0bw0KICBtdWx0aWNvcmUuICBUaGFua3MgZ28gdG86DQogIOKA oiBAVW5peEp1bmtpZSB3aG8gaGVscGVkIHVzIGludGVncmF0ZSB0aGUgR3Jh bSBNYXRyaXggYmVuY2htYXJrIGluDQogICAgPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1iZW5jaC9zYW5kbWFyay9pc3N1ZXMvOTk+DQogIOKAoiBAamh3 IGhhcyBkb25lIGV4dGVuc2l2ZSB3b3JrIHRvd2FyZHMgc3VwcG9ydGluZyBT eXN0aHJlYWRzIGluDQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlL3B1bGwvMjQwPi4gU3lzdGhyZWFk cw0KICAgIGlzIGN1cnJlbnRseSBkaXNhYmxlZCBpbiBtdWx0aWNvcmUsIGxl YWRpbmcgdG8gc29tZSBwb3B1bGFyIHBhY2thZ2VzDQogICAgbm90IGNvbXBp bGluZy4NCiAg4oCiIEBhbnRyb24gaGFzIGJlZW4gYWR2aXNpbmcgdXMgb24g aG93IGJlc3QgdG8gcG9ydCBgTHd0X3ByZWVtcHRpdmVgDQogICAgYW5kIHRo ZSBgTHd0X3VuaXhgIG1vZHVsZXMgdG8gbXVsdGljb3JlLCBnaXZpbmcgdXMg YSB3aWRlbHkgdXNlZCBJTw0KICAgIHN0YWNrIHRvIHRlc3QgbW9yZSBhcHBs aWNhdGlvbnMgYWdhaW5zdC4NCg0KICBJZiB5b3UgZG8gaGF2ZSBvdGhlciBz dWdnZXN0aW9ucyBmb3IgYXBwbGljYXRpb24gdGhhdCB5b3UgdGhpbmsgbWln aHQNCiAgcHJvdmlkZSB1c2VmdWwgYmVuY2htYXJrcywgdGhlbiBwbGVhc2Ug ZG8gZ2V0IGluIHRvdWNoIHdpdGggbXlzZWxmIG9yDQogIEBrYXljZWVzcmsu DQoNCiAgT250byB0aGUgZGV0YWlscyEgVGhlIHZhcmlvdXMgb25nb2luZyBh bmQgY29tcGxldGVkIHRhc2tzIGZvcg0KICBNdWx0aWNvcmUgT0NhbWwgYXJl IGxpc3RlZCBmaXJzdCwgd2hpY2ggaXMgZm9sbG93ZWQgYnkgdGhlIGNoYW5n ZXMgdG8NCiAgdGhlIFNhbmRtYXJrIGJlbmNobWFya2luZyBpbmZyYXN0cnVj dHVyZSBhbmQgb25nb2luZyBQUnMgdG8gdXBzdHJlYW0NCiAgT0NhbWwuDQoN Cg0KW0ZlYnJ1YXJ5XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9t dWx0aWNvcmUtb2NhbWwtZmViLTIwMjAtdXBkYXRlLzUyMjc+DQoNCltKYW51 YXJ5XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0aWNvcmUt b2NhbWwtamFudWFyeS0yMDIwLXVwZGF0ZS81MDkwPg0KDQpbbXVsdGljb3Jl IG9wYW0gcmVtb3RlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0 aWNvcmUvbXVsdGljb3JlLW9wYW0+DQoNCk11bHRpY29yZSBPQ2FtbA0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CuKXiiBPbmdvaW5nDQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwt bXVsdGljb3JlIzI0MF0gUHJvcG9zZWQgaW1wbGVtZW50YXRpb24gb2YNCiAg ICB0aHJlYWRzIGluIHRlcm1zIG9mIERvbWFpbiBhbmQgQXRvbWljDQoNCiAg ICBBIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYFRocmVhZHNgIGxpYnJh cnkgZm9yIHVzZSB3aXRoIHRoZSBuZXcNCiAgICBgRG9tYWluYCBhbmQgYEF0 b21pY2AgbW9kdWxlcyBpbiBNdWx0aWNvcmUgT0NhbWwgaGFzIGJlZW4NCiAg ICBwcm9wb3NlZC4gVGhpcyBidWlsZHMgRHVuZSAyLjQuMCB3aGljaCBpbiB0 dXJuIG1ha2VzIGl0IHVzZWZ1bCB0bw0KICAgIGJ1aWxkIG90aGVyIHBhY2th Z2VzLiBUaGlzIFBSIGlzIG9wZW4gZm9yIHJldmlldy4NCg0KICDigKIgW29j YW1sLW11bHRpY29yZS9zYWZlcG9pbnRzLWNtbS1tYWNoXSBCZXR0ZXIgc2Fm ZSBwb2ludHMgZm9yIE9DYW1sDQoNCiAgICBBIG5ld2VyIGltcGxlbWVudGF0 aW9uIHRvIGluc2VydCBzYWZlIHBvaW50cyBhdCB0aGUgQ21tIGxldmVsIGlz DQogICAgYmVpbmcgd29ya2VkIHVwb24gaW4gdGhpcyBicmFuY2guDQoNCg0K ICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMyNDBdDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRp Y29yZS9wdWxsLzI0MD4NCg0KICBbb2NhbWwtbXVsdGljb3JlL3NhZmVwb2lu dHMtY21tLW1hY2hdDQogIDxodHRwczovL2dpdGh1Yi5jb20vYW5tb2xzYWhv bzI1L29jYW1sLW11bHRpY29yZS90cmVlL3NhZmVwb2ludHMtY21tLW1hY2g+ DQoNCg0K4peKIENvbXBsZXRlZA0KDQogIFRoZSBmb2xsb3dpbmcgUFJzIGhh dmUgYmVlbiBtZXJnZWQgaW50byBNdWx0aWNvcmUgT0NhbWw6DQoNCiAg4oCi IFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlIzMwM10gQWNjb3Vu dCBjb3JyZWN0bHkgZm9yDQogICAgaW5jcmVtZW50YWwgbWFyayBidWRnZXQN Cg0KICAgIFRoZSBwYXRjaCBjb3JyZWN0bHkgbWVhc3VyZXMgdGhlIGluY3Jl bWVudGFsIG1hcmsgYnVkZ2V0IHZhbHVlLCBhbmQNCiAgICBpbXByb3ZlcyB0 aGUgbWF4aW11bSBsYXRlbmN5IGZvciB0aGUgYG1lbmhpci5vY2FtbHlgIGJl bmNobWFyay4NCg0KICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0 aWNvcmUjMzA3XSBQdXQgdGhlIHBoYXNlIGNoYW5nZSBldmVudCBpbg0KICAg IHRoZSBhY3R1YWwgcGhhc2UgY2hhbmdlIGNvZGUuIFRoZSBQUiBpbmNsdWRl cyB0aGUNCiAgICBgbWFqb3JfZ2MvcGhhc2VfY2hhbmdlYCBldmVudCBpbiB0 aGUgYXBwcm9wcmlhdGUgY29udGV4dC4NCg0KICDigKIgW29jYW1sLW11bHRp Y29yZS9vY2FtbC1tdWx0aWNvcmUjMzA5XSBEb24ndCB0YWtlIGFsbCB0aGUg ZnVsbCBwb29scw0KICAgIGluIG9uZSBnby4NCg0KICAgIFRoZSBjb2RlIGNo YW5nZSBzZWxlY3RzIG9uZSBvZiB0aGUgYGdsb2JhbF9mdWxsX3Bvb2xzYCB0 byB0cnkNCiAgICBzd2VlcGluZyBpdCBsYXRlciwgaW5zdGVhZCBvZiBhZG9w dGluZyBhbGwgb2YgdGhlIGZ1bGwgb25lcy4NCg0KICDigKIgW29jYW1sLW11 bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUjMzEwXSBTdGF0aXN0aWNzIGZvciB0 aGUgY3VycmVudA0KICAgIGRvbWFpbiBhcmUgbW9yZSByZWNlbnQgdGhhbiBv dGhlciBkb21haW5zDQoNCiAgICBUaGUgc3RhdGlzdGljcyAoYG1pbm9yX3dv cmRzYCwgYHByb21vdGVkX3dvcmRzYCwgYG1ham9yX3dvcmRzYCwNCiAgICBg bWlub3JfY29sbGVjdGlvbnNgKSBmb3IgdGhlIGN1cnJlbnQgZG9tYWluIGFy ZSBtb3JlIHJlY2VudCwgYW5kIGFyZQ0KICAgIHVzZWQgaW4gdGhlIHJpZ2h0 IGNvbnRleHQuDQoNCiAg4oCiIFtvY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVs dGljb3JlIzMxNV0gV3JpdGVzIGluIGBjYW1sX2JsaXRfZmllbGRzYA0KICAg IHNob3VsZCBhbHdheXMgdXNlIGBjYW1sX21vZGlmeV9maWVsZGAgdG8gcmVj b3JkIGB5b3VuZ190b195b3VuZ2ANCiAgICBwb2ludGVycw0KDQogICAgVGhl IFBSIGVuZm9yY2VzIHRoYXQgYGNhbWxfbW9kaWZ5X2ZpZWxkKClgIGlzIGFs d2F5cyB1c2VkIHRvIHN0b3JlDQogICAgYHlvdW5nX3RvX3lvdW5nYCBwb2lu dGVycy4NCg0KICDigKIgW29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNv cmUjMzE2XSBGaXggYnVnIHdpdGggYFdlYWsuYmxpdGAuDQoNCiAgICBUaGUg ZXBoZW1lcm9ucyBhcmUgYWxsb2NhdGVkIGFzIG1hcmtlZCwgYnV0LCB0aGUg a2V5cyBvciBkYXRhIGNhbiBiZQ0KICAgIHVubWFya2VkLiBUaGUgYmxpdCBv cGVyYXRpb25zIGNvcHkgd2VhayByZWZlcmVuY2VzIGZyb20gb25lDQogICAg ZXBoZW1lcm9uIHRvIGFub3RoZXIgd2l0aG91dCBtYXJraW5nIHRoZW0uIFRo ZSBwYXRjaCBtYXJrcyB0aGUga2V5cw0KICAgIHRoYXQgYXJlIGJsaXR0ZWQg aW4gb3JkZXIgdG8ga2VlcCB0aGUgdW5yZWFjaGFibGUga2V5cyBhbGl2ZSBm b3INCiAgICBhbm90aGVyIG1ham9yIGN5Y2xlLg0KDQogIOKAoiBbb2NhbWwt bXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTddIFJldHVybiBlYXJseSBm b3IgMCBsZW5ndGggYmxpdA0KDQogICAgVGhlIFBSIGZvcmNlcyBhIGBDQU1M cmV0dXJuKClgIGNhbGwgaWYgdGhlIGJsaXQgbGVuZ3RoIGlzIHplcm8gaW4N CiAgICBgYnl0ZXJ1bi93ZWFrLmNgLg0KDQogIOKAoiBbb2NhbWwtbXVsdGlj b3JlL29jYW1sLW11bHRpY29yZSMzMjBdIE1vdmUgYG51bV9kb21haW5zX3J1 bm5pbmdgDQogICAgZGVjcmVtZW50DQoNCiAgICBUaGUgYGNhbWxfZG9tYWlu X2Fsb25lKClgIGludm9jYXRpb24gbmVlZHMgdG8gYmUgdXNlZCBpbiB0aGUg c2hhcmVkDQogICAgaGVhcCB0ZWFyZG93biwgYW5kIGhlbmNlIHRoZSBgbnVt X2RvbWFpbnNfcnVubmluZ2AgZGVjcmVtZW50IGlzDQogICAgbW92ZWQgYXMg dGhlIGxhc3Qgb3BlcmF0aW9uIGZvciBhdCBsZWFzdCB0aGUgYHNoYXJlZF9o ZWFwYCBsb2NrZnJlZQ0KICAgIGZhc3QgcGF0aHMuDQoNCg0KICBbb2NhbWwt bXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMDNdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxs LzMwMz4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMz MDddDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29j YW1sLW11bHRpY29yZS9wdWxsLzMwNz4NCg0KICBbb2NhbWwtbXVsdGljb3Jl L29jYW1sLW11bHRpY29yZSMzMDldDQogIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMwOT4NCg0K ICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTBdDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRp Y29yZS9wdWxsLzMxMD4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11 bHRpY29yZSMzMTVdDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMxNT4NCg0KICBbb2NhbWwt bXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMzMTZdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxs LzMxNj4NCg0KICBbb2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZSMz MTddDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL29j YW1sLW11bHRpY29yZS9wdWxsLzMxNz4NCg0KICBbb2NhbWwtbXVsdGljb3Jl L29jYW1sLW11bHRpY29yZSMzMjBdDQogIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtbXVsdGljb3JlL29jYW1sLW11bHRpY29yZS9wdWxsLzMyMD4NCg0K DQpCZW5jaG1hcmtpbmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFRoZSBbU2FuZG1hcmtdIHBlcmZvcm1hbmNlIGJlbmNo bWFya2luZyB0ZXN0IHN1aXRlIGhhcyBoYWQgbmV3ZXINCiAgYmVuY2htYXJr cyBhZGRlZCwgYW5kIHdvcmsgaXMgdW5kZXJ3YXkgdG8gZW5oYW5jZSBpdHMg ZnVuY3Rpb25hbGl0eS4NCg0KICDigKIgW29jYW1sLWJlbmNoL3NhbmRtYXJr Izg4XSBBZGQgUGluZ1BvbmcgTXVsdGljb3JlIGJlbmNobWFyaw0KDQogICAg VGhlIFBpbmdQb25nIGJlbmNobWFyayB0aGF0IHVzZXMgcHJvZHVjZXIgYW5k IGNvbnN1bWVyIHF1ZXVlcyBoYXMNCiAgICBub3cgYmVlbiBpbmNsdWRlZCBp bnRvIFNhbmRtYXJrLg0KDQogIOKAoiBbb2NhbWwtYmVuY2gvc2FuZG1hcmsj OThdIEFkZCB0aGUgcmVhZC93cml0ZSBJcm1pbiBiZW5jaG1hcmsNCg0KICAg IEEgYmFzaWMgcmVhZC93cml0ZSBmaWxlIHBlcmZvcm1hbmNlIGJlbmNobWFy ayBmb3IgSXJtaW4gaGFzIGJlZW4NCiAgICBhZGRlZCB0byBTYW5kbWFyay4g WW91IGNhbiB2YXJ5IHRoZSBmb2xsb3dpbmcgaW5wdXQgcGFyYW1ldGVyczoN CiAgICBudW1iZXIgb2YgYnJhbmNoZXMsIG51bWJlciBvZiBrZXlzLCBwZXJj ZW50YWdlIG9mIHJlYWRzIGFuZCB3cml0ZXMsDQogICAgbnVtYmVyIG9mIGl0 ZXJhdGlvbnMsIGFuZCB0aGUgbnVtYmVyIG9mIHdyaXRlIG9wZXJhdGlvbnMu DQoNCiAg4oCiIFtvY2FtbC1iZW5jaC9zYW5kbWFyayMxMDBdIEFkZCBHcmFt IE1hdHJpeCBiZW5jaG1hcmsNCg0KICAgICBBIHJlcXVlc3QgW29jYW1sLWJl bmNoL3NhbmRtYXJrIzk5XSB0byBpbmNsdWRlIHRoZSBHcmFtIE1hdHJpeA0K ICAgIGluaXRpYWxpemF0aW9uIG51bWVyaWNhbCBiZW5jaG1hcmsgd2FzIGNy ZWF0ZWQuIFRoaXMgaXMgdXNlZnVsIGZvcg0KICAgIG1hY2hpbmUgbGVhcm5p bmcgYXBwbGljYXRpb25zIGFuZCBpcyBub3cgYXZhaWxhYmxlIGluIHRoZSBT YW5kbWFyaw0KICAgIHBlcmZvcm1hbmNlIGJlbmNobWFyayBzdWl0ZS4gVGhl IHNwZWVkdXANCiAgICAoc2VxdWVudGlhbF90aW1lL211bHRpX3RocmVhZGVk X3RpbWUpIHZlcnN1cyBudW1iZXIgb2YgY29yZXMgZm9yDQogICAgTXVsdGlj b3JlIChDb25jdXJyZW50IE1pbm9yIENvbGxlY3RvciksIFBhcm1hcCBhbmQg UGFyYW55IGlzIHF1aXRlDQogICAgc2lnbmlmaWNhbnQgYW5kIGlsbHVzdHJh dGVkIGluIHRoZSBncmFwaDoNCiAgICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJz ZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8y WC8yLzIwZGM4NjlhOGRkYTFjODE1NzE0YTk3ZTZhODRmNmY4MWM5MTRjZjQu cG5nPg0KDQogIOKAoiBbb2NhbWwtYmVuY2gvc2FuZG1hcmsjMTAzXSBBZGQg ZGVwZW5kIHRhcmdldCBpbiBNYWtlZmlsZQ0KDQogICAgU2FuZG1hcmsgbm93 IGluY2x1ZGVzIGEgYGRlcGVuZGAgdGFyZ2V0IGRlZmluZWQgaW4gdGhlIE1h a2VmaWxlIHRvDQogICAgY2hlY2sgdGhhdCBib3RoIGBsaWJnbXAtZGV2YCBh bmQgYGxpYmR3LWRldmAgcGFja2FnZXMgYXJlIGluc3RhbGxlZA0KICAgIGFu ZCBhdmFpbGFibGUgb24gVWJ1bnR1Lg0KDQogIOKAoiBbb2NhbWwtYmVuY2gv c2FuZG1hcmsjOTBdIE1vcmUgcGFyYWxsZWwgYmVuY2htYXJrcw0KDQogICAg QW4gaXNzdWUgaGFzIGJlZW4gY3JlYXRlZCB0byBhZGQgbW9yZSBwYXJhbGxl bCBiZW5jaG1hcmtzLiBXZSB3aWxsDQogICAgdXNlIHRoaXMgdG8ga2VlcCB0 cmFjayBvZiB0aGUgcmVxdWVzdHMuIFBsZWFzZSBmZWVsIGZyZWUgdG8gYWRk IHlvdXINCiAgICB3aXNoIGxpc3Qgb2YgYmVuY2htYXJrcyENCg0KDQpbU2Fu ZG1hcmtdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1h cms+DQoNCltvY2FtbC1iZW5jaC9zYW5kbWFyayM4OF0NCjxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsvcHVsbC84OD4NCg0KW29j YW1sLWJlbmNoL3NhbmRtYXJrIzk4XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1iZW5jaC9zYW5kbWFyay9wdWxsLzk4Pg0KDQpbb2NhbWwtYmVuY2gv c2FuZG1hcmsjMTAwXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5j aC9zYW5kbWFyay9pc3N1ZXMvMTAwPg0KDQpbb2NhbWwtYmVuY2gvc2FuZG1h cmsjOTldDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWJlbmNoL3NhbmRt YXJrL2lzc3Vlcy85OT4NCg0KW29jYW1sLWJlbmNoL3NhbmRtYXJrIzEwM10N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsvcHVs bC8xMDM+DQoNCltvY2FtbC1iZW5jaC9zYW5kbWFyayM5MF0NCjxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsvaXNzdWVzLzkwPg0K DQoNCk9DYW1sDQrilYzilYzilYzilYzilYwNCg0K4peKIE9uZ29pbmcNCg0K ICDigKIgW29jYW1sL29jYW1sIzkwODJdIEV2ZW50bG9nIHRyYWNpbmcgc3lz dGVtDQoNCiAgICBUaGUgY29uZmlndXJlIHNjcmlwdCBoYXMgbm93IGJlZW4g YmUgdXBkYXRlZCBzbyB0aGF0IGl0IGNhbiBidWlsZCBvbg0KICAgIFdpbmRv d3MuIEFwYXJ0IGZyb20gdGhpcyBtYWpvciBjaGFuZ2UsIGEgbnVtYmVyIG9m IG1pbm9yIGNvbW1pdHMNCiAgICBoYXZlIGJlZW4gbWFkZSBmb3IgdGhlIGJ1 aWxkIGFuZCBzYW5pdHkgY2hlY2tzLiBUaGlzIFBSIGlzIGN1cnJlbnRseQ0K ICAgIHVuZGVyIHJldmlldy4NCg0KICDigKIgW29jYW1sL29jYW1sIzkzNTNd IFJlaW1wbGVtZW50IG91dHB1dF92YWx1ZSB1c2luZyBhIGhhc2ggdGFibGUg dG8NCiAgICBkZXRlY3Qgc2hhcmluZy4NCg0KICAgIFRoZSBbb2NhbWwvb2Nh bWwjOTI5M10gIlVzZSBhZGRybWFwIGhhc2ggdGFibGUgZm9yIG1hcnNoYWxp bmciIFBSDQogICAgaGFzIGJlZW4gcmUtaW1wbGVtZW50ZWQgdXNpbmcgYSBo YXNoIHRhYmxlIGFuZCBiaXQgdmVjdG9yLCB0aGFua3MgdG8NCiAgICBAeGF2 aWVybGVyb3kuIFRoaXMgaXMgYSBwcmUtcmVxdWlzaXRlIGZvciBNdWx0aWNv cmUgT0NhbWwgdGhhdCB1c2VzDQogICAgYSBjb25jdXJyZW50IGdhcmJhZ2Ug Y29sbGVjdG9yLg0KDQogIEFzIGFsd2F5cywgd2UgdGhhbmsgdGhlIE9DYW1s IGRldmVsb3BlcnMgYW5kIHVzZXJzIGluIHRoZSBjb21tdW5pdHkNCiAgZm9y IHRoZWlyIGNvZGUgcmV2aWV3cywgc3VwcG9ydCwgYW5kIGNvbnRyaWJ1dGlv biB0byB0aGUgcHJvamVjdC4gRnJvbQ0KICBPQ2FtbCBMYWJzLCBzdGF5IHNh ZmUgYW5kIGhlYWx0aHkgb3V0IHRoZXJlIQ0KDQoNCiAgW29jYW1sL29jYW1s IzkwODJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC85 MDgyPg0KDQogIFtvY2FtbC9vY2FtbCM5MzUzXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL3B1bGwvOTM1Mz4NCg0KICBbb2NhbWwvb2NhbWwj OTI5M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzky OTM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdv IHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVl ZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2gg dG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0K W3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5 dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cDovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJj aGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3Rp bmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 24 to 31, 2020.

An In-Depth Look at OCaml=E2=80=99s New =E2=80=9CBest-Fit=E2= =80=9D Garbage Collector Strategy

OCamlPro announced

The Garbage Collector is probably OCaml=E2=80=99s greatest unsung hero. Its= pragmatic approach allows us to allocate without much fear of efficiency loss. We looked into its new "Best-fit" strategy an= d here is what we learned! http://www.ocamlpro.com/2020/03/23/ocaml-new-best-fit-garbage-col= lector/

First release of Pp, a pretty-printing library

J=C3=A9r=C3=A9mie Dimino announced

I'm happy to announce the first release of the pp library! This library provides a lean alternative to the = Format module of the standard library. It uses the same comcepts of box= es and break hints, however it defines its own algebra which some might find easier to work with and reaso= n about. I personally do :) The final rendering is still done via a formatter which makes it easy to integrate Pp in existing programs using Format.

We introduced this module in Dune to hel= p improve the formatting of messages printed in the terminal and it has been a success. The new API is smaller, simpler and makes it easy for d= evelopers to do the right thing. Once the Pp module of Dune was mature enough, we decided to extract it = into a separate library so that it could benefit others.

The library itself is composed of a single Pp module and has n= o dependencies. Its documentation is self-contained and no previous knowledge is required to start using it, however the variou= s guides for the Format module such as this o= ne should be applicable to Pp as well.

If you have used Format before and like me found its API compl= icated and difficult to use, I hope that you will find Pp nicer to work with!

Josh Berdine then said

Another great resource for understanding the core mental model of Format is= Format Unraveled, although if I understand pp correctly the discussion about Format not being document-based won't apply = to pp.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

1.10.= 0 release is available.

Bug fixes:

  • Files without extensions are handled correctly.

New features:

  • Plugin discovery: if you save a plugin to plugins/my-plugin.lua, it's automatically loaded as a widget named

my-plugin. List of plugin directories is configurable.

  • New plugin API functions: HTMLget_tag_name, HTML.sel= ect_any_of, HTML.select_all_of.
  • The HTML module is now "monadic": giving a nil to a functi= on that expects an element gives you a nil back, rather than cause a runtim= e error.

routes: path based routing for web applications

Anurag Soni announced

0.7.2 release is now= available on opam. There have been quite a few changes since the previous versions.

  • Routes doesn't deal with HTTP methods anymore
  • The internal implementation is now based around a trie like data struct= ure
  • Routes have pretty printers
  • sprintf style route printing is supported again
  • Minimum supported OCaml version is now 4.05 (it used to be 4.06)
  • There is a release available for bucklescript as well and it is availab= le to install via npm.

Compiler Engineer at Mixtional Code in Darmstadt or anywhere e= lse in Germany

Gerd Stolpmann announced

Type of position:

  • regular hire (no freelancers)
  • full time
  • work from home anywhere in Germany, or in the office in Darmstadt
  • work for a small and highly skilled international team, located in the = US and Europe
  • the team language is English

We are developing a compiler for a no-code platform that translates our DSL= to bytecode and/or WebAssembly. The language is largely of functional type but is also able to manage state wit= h a spreadsheet model, allowing reactive programming without having to resort to libraries. The language is statical= ly typed using a Hindley-Milner type checker. The compiler is primarily written in OCaml. Other languages of our= platform are Go, Elm, and Javascript.

We are looking for a compiler engineer with strong skills in all relevant a= reas:

  • fluent in OCaml or a similar language such as Haskell
  • Understanding of the structure of the DSL, including syntax and semanti= cs
  • Translation of FP languages to executable code
  • Code optimization
  • Graph algorithms
  • Type checking

We are open to both juniors and seniors, and payment will be accordingly. W= e are not so much interested in formal certifications but rather in real practice, either from previous jobs, rese= arch projects, or contributions to open source projects.

The no-code platform is being developed by engineers in Europe and the US a= t various places, and we usually do not meet physically but in video conferences. Working from home is very usual. = We also get you a desk in your home town if you prefer this. The compiler development is lead by Gerd Stolpmann from= Darmstadt.

Due to the strong connections to the US, video conferences will often have = to take place in evening hours, until around 7pm or 8pm.

Applications: please follow the "Apply" link at the official web page descr= ibing the position: https://rmx.mixtional= .de/static/54657cda/

Gerd Stolpmann
CEO of Mixtional Code GmbH (and OCaml hacker of the first hour)
Contact and company details: https://www.mixtional.de/contact.html

S=C3=A9bastien Besnier asked

I'm living in France, can I apply to the position (we are neighbors!)?

Gerd Stolpmann replied

Well, I can (at the moment) only make contracts using German law and for th= e social security system here. So, if you need a doctor you'd have to travel… If my company was a bit bigger t= here would be the option of opening a second site in France (even a very minimal one), but the setup costs are so far to= o high (lawyers and accountants), and it is too distracting for me to keep up with the fine points of the system in = France. Unfortunately, the EU is not that far that it is super simple for an employer to hire anywhere in Europe. - T= hanks for asking.

tiny-httpd 0.5

Simon Cruanes announced

I just released tiny-httpd 0.5 and the new tiny-httpd-camlzip, which makes = it possible to use deflate transparently for queries and responses. The server has evolved quietly and is getting so= mewhat more robust: I'm using it for an internal tool with big html pages (up to several MB) and it's reasonably fa= st and doesn't seem to memleak. There's also an improved http_of_dir to quickly and simply serve a dir= ectory on an arbitrary port.

Previous announcement here

Visual Studio Code plugin for OCaml

Rudi Grinberg announced

I'm proud to announce a preview release of an VSC extension for OCaml. You can fetch and install this plugin directly from the extension marketplace if you search for "OCaml Labs". The extension isn't y= et mature, but I believe that it offers a user experience comparable to other VSC extensions for OCaml already. The p= lugin should be used in conjunction with ocaml-lsp

The extension is for the OCaml "platform", which means that its scope inclu= des support for various tools used in OCaml development such as dune, opam.

Bug reports & contributions are welcome. Happy hacking.

Dismas: a tool for automatically making cross-versions of opam= packages

Daniil Baturin announced

opam-cross-* are seriously lagging behind the official opam repository and = fdopen's opam-windows, not least because importing packages by hand is a lot of work. I suppose at least a semi-automated process could help those repos grow and= stay in sync with the upstream much faster.

I've made a prototype of a tool for "stealing" packages into cross-repos. F= or obvious reasons it's called Dismas. You can find it here: https://github.com/dmbaturin/scripts/blob/master/dismas.m= l

Limitations:

  • the code is a real mess for now
  • only dune is supported by automatic build command adjustment
  • it cannot handle cases when both native and cross-version of a dependen= cy are needed

However:

  • For simple packages that use dune exclusively, it's completely automate= d. I've ported bigstreamaf and angstrom to test it, and cross-versions buil= t just fine from its output, no editing was needed.
  • It automatically converts dependencies from foo to too-$toolchain and r= emoves dependencies and build steps only

needed for with-test and with-doc.

$ ./dismas.ml windows containers ~/devel/opam-repository/packages/container=
s/containers.2.8.1/opam
opam-version: "2.0"
maintainer: "simon.cruanes.2007@m4x.org"
synopsis:
  "A modular, clean and powerful extension of the OCaml standard library"
build: [
  ["dune" "build" "-p" "containers" "-j" jobs "-x" "windows"]
]
depends: [
  "ocaml-windows" {>=3D "4.03.0"}
  "dune" {>=3D "1.1"}
  "dune-configurator"
  "seq-windows"
]
depopts: ["base-unix" "base-threads"]
tags: ["stdlib" "containers" "iterators" "list" "heap" "queue"]
homepage: "https://github.com/c-cube/ocaml-containers/"
doc: "https://c-cube.github.io/ocaml-containers"
dev-repo: "git+https://github.com/c-cube/ocaml-containers.git"
bug-reports: "https://github.com/c-cube/ocaml-containers/issues/"
authors: "Simon Cruanes"
url {
  src: "https://github.com/c-cube/ocaml-containers/archive/v2.8.1.tar.gz"
  checksum: [
    "md5=3Dd84e09c5d0abc501aa17cd502e31a038"
    "sha512=3D8b832f4ada6035e80d81be0cfb7bdffb695ec67d465ed6097a144019e2b8a=
8f909095e78019c3da2d8181cc3cd730cd48f7519e87d3162442562103b7f36aabb"
  ]
}

$ ./dismas.ml windows containers ~/devel/opam-repository/packages/container=
s/containers.2.8.1/opam | diff
~/devel/opam-repository/packages/containers/containers.2.8.1/opam -
3c3,4
< synopsis: "A modular, clean and powerful extension of the OCaml standa=
rd library"
---
> synopsis:
>   "A modular, clean and powerful extension of the OCaml standard libra=
ry"
5,7c6
<   ["dune" "build" "-p" name "-j" jobs]
<   ["dune" "build" "@doc" "-p" name ] {with-doc}
<   ["dune" "runtest" "-p" name "-j" jobs] {with-test}
---
>   ["dune" "build" "-p" "containers" "-j" jobs "-x" "windows"]
10,11c9,10
<   "ocaml" { >=3D "4.03.0" }
<   "dune" { >=3D "1.1" }
---
>   "ocaml-windows" {>=3D "4.03.0"}
>   "dune" {>=3D "1.1"}
13,21c12
<   "seq"
<   "qtest" { with-test }
<   "qcheck" { with-test }
<   "ounit" { with-test }
<   "iter" { with-test }
<   "gen" { with-test }
<   "uutf" { with-test }
<   "mdx" { with-test & >=3D "1.5.0" & < "2.0.0" }
<   "odoc" { with-doc }
---
>   "seq-windows"
23,27c14,15
< depopts: [
<   "base-unix"
<   "base-threads"
< ]
< tags: [ "stdlib" "containers" "iterators" "list" "heap" "queue" ]
---
> depopts: ["base-unix" "base-threads"]
> tags: ["stdlib" "containers" "iterators" "list" "heap" "queue"]

Things to do:

  • identify all packages that don't need cross-versions. Is cppo one of th= em, for example?
  • add support for cases when both native and cross versions are needed. I= f menhir the only one?
  • add support for other build systems. Do all of them work well with `OCA= MLFIND_TOOLCHAIN=3Dwindows` if the build setup is written correctly?

Input from @toots and @pirbo is welcome.

Romain Beauxis then said

That's a great initiative! Here are a couple of thoughts:

  • For dune-based packages, things are indeed pretty straight-forward. Fin= ding out which dependencies need to be ported as cross-dependency is indeed= the part that's hard to automatize
  • For other build systems, it's less clear to me how to automatize. Maybe= others have some thoughts about it.
  • The CI system on opam-cross-windows is pretty good at building from scr= atch and failing if some deps are missing so trial and error there can be a= great tool.
  • Once solved for one cross situation, the problem of cross-dependencies = should be exactly the same for all other cross environment (android, iOS)

I haven't looked at the tool very closely yet but I'd say a first improveme= nt would be to be able to track cross-dependencies resolution and generate new version of the package using= them and/or generate other cross-compiled packages using them.

Anton Kochkov said

For automated pull requests, you might be interested in https://discuss.ocaml.org/t/= dependabot-and-ocaml/4282

Daniil Baturin then asked

I'm not sure if I understand the premise of dependabot. Why would anyone ha= rdcode specific dependency versions? Maybe it makes sense in certain ecosystems that suffer from never-ending ecologic= al disasters… ;)

In any case, most opam packages don't have a constraint on the upper versio= ns of their dependencies. Can dependabot use custom tracking rules to check for presense of a newer version in the r= epo? My thought was much simpler actually: track the commits in opam-repository,= run recently changed files through Dismas and send pull requests to opam-cross-*

Yawar Amin replied

It's common practice nowadays to use semantic versioning and have lockfiles= for reproducible builds. Dependabot updates semantic version ranges and lockfiles. See e.g.

Multicore OCaml: March 2020 update

Anil Madhavapeddy announced

Welcome to the March 2020 news update from the Multicore OCaml team! This = update has been assembled with @shakthimaan and @kayceesrk, as with the February and January ones.

Our work this month was primarily focused on performance improvements to th= e Multicore OCaml compiler and runtime, as part of a comprehensive evaluation exercise. We continue to add additional = benchmarks to the Sandmark test suite. The eventlog tracing system and the use of hash tables for marshaling in upstre= am OCaml are in progress, and more PRs are being queued up for OCaml 4.11.0-dev as well.

The biggest observable change for users trying the branch is that a new GC = (the "parallel minor gc") has been merged in preference to the previous one ("the concurrent minor gc"). We will hav= e the details in longer form at a later stage, but the essential gist is that the parallel minor GC no longer re= quires a read barrier or changes to the C API. It may have slightly worse scalability properties at a very high = number of cores, but is roughly equivalent at up to 24 cores in our evaluations. Given the vast usability improvement= from not having to port existing C FFI uses, we have decided to make the parallel minor GC the default one for our= first upstream runtime patches. The concurrent minor GC follow at a later stage when we ramp up testing to 64-c= ore+ machines. The multicore opam remote has been updated to reflect these changes, for those who wish to try it out at home.

We are now at a stage where we are porting larger applications to multicore= . Thanks go to:

If you do have other suggestions for application that you think might provi= de useful benchmarks, then please do get in touch with myself or @kayceesrk.

Onto the details! The various ongoing and completed tasks for Multicore OCa= ml are listed first, which is followed by the changes to the Sandmark benchmarking infrastructure and ongoing PRs to = upstream OCaml.

Multicore OCaml

  • Ongoing
    • oca= ml-multicore/ocaml-multicore#240 Proposed implementation of threads in = terms of Domain and Atomic

      A new implementation of the `Threads` library for use with the new `Domain`= and `Atomic` modules in Multicore OCaml has been proposed. This builds Dun= e 2.4.0 which in turn makes it useful to build other packages. This PR is o= pen for review.

    • ocaml-multicore/safepoints-cmm-mach Better safe points for OC= aml

      A newer implementation to insert safe points at the Cmm level is being work= ed upon in this branch.

  • Completed

    The following PRs have been merged into Multicore OCaml:

    • oca= ml-multicore/ocaml-multicore#303 Account correctly for incremental mark= budget

      The patch correctly measures the incremental mark budget value, and improve= s the maximum latency for the `menhir.ocamly` benchmark.

    • ocaml-multicore/ocaml-multicore#307 Put the phase change event in the = actual phase change code. The PR includes the `major_gc/phase_change` event= in the appropriate context.
    • oca= ml-multicore/ocaml-multicore#309 Don't take all the full pools in one g= o.

      The code change selects one of the `global_full_pools` to try sweeping it l= ater, instead of adopting all of the full ones.

    • oca= ml-multicore/ocaml-multicore#310 Statistics for the current domain are = more recent than other domains

      The statistics (`minor_words`, `promoted_words`, `major_words`, `minor_coll= ections`) for the current domain are more recent, and are used in the right= context.

    • oca= ml-multicore/ocaml-multicore#315 Writes in `caml_blit_fields` should al= ways use `caml_modify_field` to record `young_to_young` pointers

      The PR enforces that `caml_modify_field()` is always used to store `young_t= o_young` pointers.

    • oca= ml-multicore/ocaml-multicore#316 Fix bug with `Weak.blit`.

      The ephemerons are allocated as marked, but, the keys or data can be unmark= ed. The blit operations copy weak references from one ephemeron to another = without marking them. The patch marks the keys that are blitted in order to= keep the unreachable keys alive for another major cycle.

    • oca= ml-multicore/ocaml-multicore#317 Return early for 0 length blit

      The PR forces a `CAMLreturn()` call if the blit length is zero in `byterun/= weak.c`.

    • oca= ml-multicore/ocaml-multicore#320 Move `num_domains_running` decrement

      The `caml_domain_alone()` invocation needs to be used in the shared heap te= ardown, and hence the `num_domains_running` decrement is moved as the last = operation for at least the `shared_heap` lockfree fast paths.

Benchmarking

The Sandmark perfor= mance benchmarking test suite has had newer benchmarks added, and work is underway to enhance its functionality.

  • ocaml-bench/san= dmark#88 Add PingPong Multicore benchmark

    The PingPong benchmark that uses producer and consumer queues has now been = included into Sandmark.

  • ocaml-bench/san= dmark#98 Add the read/write Irmin benchmark

    A basic read/write file performance benchmark for Irmin has been added to S= andmark. You can vary the following input parameters: number of branches, n= umber of keys, percentage of reads and writes, number of iterations, and th= e number of write operations.

  • ocaml-bench/= sandmark#100 Add Gram Matrix benchmark

    A request oc= aml-bench/sandmark#99 to include the Gram Matrix initialization numeric= al benchmark was created. This is useful for machine learning applications = and is now available in the Sandmark performance benchmark suite. The speed= up (sequential_time/multi_threaded_time) versus number of cores for Multico= re (Concurrent Minor Collector), Parmap and Parany is quite significant and= illustrated in the graph: 3D"20dc869a8dda1c8=

  • ocaml-bench/sa= ndmark#103 Add depend target in Makefile

    Sandmark now includes a `depend` target defined in the Makefile to check th= at both `libgmp-dev` and `libdw-dev` packages are installed and available o= n Ubuntu.

  • ocaml-bench/s= andmark#90 More parallel benchmarks

    An issue has been created to add more parallel benchmarks. We will use this= to keep track of the requests. Please feel free to add your wish list of b= enchmarks!

OCaml

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 20BE97F449 for ; Tue, 7 Apr 2020 09:51:25 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=3SsL=5X=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ArPoK3xKzuYfFtgFQ8dmcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgXKPX4rarrMEGX3/hxlliBBdydt6sZzbOK+Pm6AyRAuc/H7CleNsQUFlcsso?= =?us-ascii?q?Y/oU8JOIa9E0r1LfrnPWQRPf9pcxtbxUy9KlVfA83kZlff8TWY5D8WHQjjZ0Iu?= =?us-ascii?q?frymUoHdgN6q2O+s5pbdfxtHhCanYbN1MR66sRjdutMZjId/Kqs90AbFr3RHd+?= =?us-ascii?q?hL229kO0+YkxLg6sut5pJu/Dlctv07+8JcTan2erkzQKBFAjghL20668rnuAXZ?= =?us-ascii?q?QwCS/HUcSGIWkhRJAwjB8h73W4r6vzX5uORgxiSUJNX6Qr8oVzus6adrUwLohz?= =?us-ascii?q?wcNzEl6mHXi9d/g7xdrRm8uhFw2Y/UYIWSNPpjYqPQeM4RSGRdUspNUSFKH4Sz?= =?us-ascii?q?YZYSD+oaJeZXsZXyp0cAoxu5AAmjHuLvyjlVjXPy0qA31+EtHAfG0AIjGdIOrn?= =?us-ascii?q?XUrM70NKgJVeC60rTDzDvEb/NMxDj985XDfhQvrP2QWL59d9fax0syGAPfllie?= =?us-ascii?q?qZLrMS6b2OoOvGeU8/FtWvizh2M9sQx9viSjy8Uqh4LUhowV0FfE9SBhzYspId?= =?us-ascii?q?23Ukh7asO5HpRMtyGaMop2Qt8+Q2p1vys10LkGtoS9fCQQ05Qo2x7fa/mGc4iU?= =?us-ascii?q?/hLuT/6RITB8hHNlZLKwmQq98Uimyu39T8m0zUhFojBCktnWuXAAzhre4dWJRP?= =?us-ascii?q?t6+0euwzeP1wbL5+FcP080iavbK4I/zb4okZoTtEHDETHslEXwkqCWal0o+u+0?= =?us-ascii?q?5Ov9Z7XmooWQN4huigHxKqgulc2/Afg4MggTRGeX4/iz1Lrm/UHhT7VKj+E2kq?= =?us-ascii?q?nEsJ/BP8gbp6m5DxdU0oYl8Ra/Di2p3M4WnXkdNF5FYxOHj4fxO1HKOv/4C+2z?= =?us-ascii?q?g1O2kDdk3/zGPrrhAonRIXjZiLftZ6py60lZyAYr0d9f54hbCqsOIPLuREDxrs?= =?us-ascii?q?bXDgIkPACuxObnEtp92psRWWKVGKCZKKPSsUGJ5uMuOeWMY5UVuDnlJ/gk+vHv?= =?us-ascii?q?jXs5mVsHcamux5sXZ3a1FellLUWBeXfgn8kNHGMQsgYjUODnh0eOXDBPa3qoUa?= =?us-ascii?q?8x6Sk3BYClAIvZWIygj6KN0D2mEpBZfGxKF1+BHWvueo6ZQfkDcjiSLdVkkjEc?= =?us-ascii?q?VbiuVYsh1Ra2uQ//xLtrM/DY+jUftZLn1Nl1+/Pcmg0y9TxyDsSdynyNQH9ukm?= =?us-ascii?q?MPXT8207hzoU17ylidzah1m+FUGcJX6v9TTws2KZHRw/Z0BtzuQA7McNiERE6j?= =?us-ascii?q?Qtq8ADExStwxw8UJY0Z4A9iskwzN0Te2D7INmbGFGYc0/KTE0nXxJslw027G1K?= =?us-ascii?q?4lj1gmXstAK3Gphq559wjSHo7JjluWm7ytdaQG0y7A7H2MzW6Us0FeSgJwSrnK?= =?us-ascii?q?XXAaZkvXsdT5+ljPQKSpCbQ6NAtO1dCNKrBQZt3sglhHS+3vONPEY2K+g2uwHw?= =?us-ascii?q?qHxquQbIr2fGUQxDnSB1IBkwAX5HqGMQk+Bjy9o2/FFzxvFVfvY1v2/uVkqXO7?= =?us-ascii?q?SFU0zwCQYEF72bq14E1dufvJAfcM2PhM7CM+rR1wA1D72d/KXZ7I7QF+eu8UKY?= =?us-ascii?q?c2/1Fv0WPCqxc7P5CxK6QkgUQRJUA/tErr01BzC55cuckstnIjigRobeqT11ZZ?= =?us-ascii?q?XzeZxozrfLrNIGju9RShbL6Q10yN/syR//Im7P0+427ovASoClZqp3xj2t8TyH?= =?us-ascii?q?Cc45TWECIKVpbgTks89x57vqzXJC4n6NWHhjVXLaCov2qaiJoSD+w/x0P/Lo4C?= =?us-ascii?q?YpPBLxf7FoghP+brKOEunALyPBcUZaZK86olI86td/2HwbOmeuF6k2D/1DgV0M?= =?us-ascii?q?VGykuJshFEZKvQxZ9ckqOA2Q+WSzr3jFGgq93634deamNLRzvt+W3fHIdUI5ZK?= =?us-ascii?q?U8MOAGaqLdeww4wh1ZTqRnhT+UXlAg8WnsizdkjLYg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyK?= =?us-ascii?q?oQbiQGFe4UfhEVjizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBB?= =?us-ascii?q?gMCBA0BFwEUChcBCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0?= =?us-ascii?q?CE38XhSODF4NTJg+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCR?= =?us-ascii?q?wSLT4InGAMkA4hwYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2?= =?us-ascii?q?MHyGPFoFShT5wgSaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBA?= =?us-ascii?q?oJJgT6BJoEkUTuFEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IPAS-Result: =?us-ascii?q?A0DgBQCKMIxehyIeaIFgBhaDUFiBGFUyKoQbiQGFe4UfhEV?= =?us-ascii?q?jizeHBQNQBQkBAwEMGAEOBQECBAEBgVCDDYIzHQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFXQyCOwwMAwODHAMBGAECBgQGOyojAxQBBgMCBA0BFwEUChc?= =?us-ascii?q?BCQkUBgGDCwGCfAQBCpQFm3l/M4Q1AQMDAgsDDy9Bg1CBPw0CE38XhSODF4NTJ?= =?us-ascii?q?g+BTD+BEYISUGyBQYENDgsBAQEBAQGBGBMNBwEBEAGDIReCRwSLT4InGAMkA4h?= =?us-ascii?q?wYIcogTdTjmp6B4JAfASFSjVxhV2Dc0+FOIJOM1GDT4NlhF2MHyGPFoFShT5wg?= =?us-ascii?q?SaFQ4gIgTKEKoE/KoFIHgwHMxowgngBMwlfDVYBjVIXgQQBAoJJgT6BJoEkUTu?= =?us-ascii?q?FEzA/MwIBAQeBFwEBBRMLAYtBAiaCGwEB?= X-IronPort-AV: E=Sophos;i="5.72,353,1580770800"; d="scan'208,217";a="444163936" X-MGA-submission: =?us-ascii?q?MDGLKGXXDn+eRcdTNZtCngUyqltEaA+UchPYLh?= =?us-ascii?q?jUZWyD0IP4VllHIU/cgFR+F3kvgB5b5j0Z9L4Wz2G6YkCKNGsuM7gy4w?= =?us-ascii?q?/dhp3WZHC/jB7vnAjbS03b94BNm9qECYV3CJbhJoXL9mcepIxGjRiFj8?= =?us-ascii?q?Y3LdtLdRf2SLqZR94AVKoKpA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Apr 2020 09:51:17 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 630C75646C9; Tue, 7 Apr 2020 09:51:14 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 07 Apr 2020 09:51:13 +0200 Message-ID: <87y2r7enta.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 7 09:51:15 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001075, queueID=DF58B5646CC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTWFyY2ggMzEgdG8gQXByaWwNCjA3LCAyMDIw Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk1ha2luZyBhIG11 c2ljIHBsYXllciBpbiBPQ2FtbA0KVGhlIGVuZCBvZiBDYW1scDQNCk9DYW1s Zm9ybWF0IDAuMTQuMA0KTUwgRmFtaWx5IFdvcmtzaG9wIDIwMjA6IENhbGwg Zm9yIHByZXNlbnRhdGlvbnMNCkFubm91bmNpbmcgU2VrLCBhbiBlZmZpY2ll bnQgaW1wbGVtZW50YXRpb24gb2Ygc2VxdWVuY2VzDQpBbm5vdW5jaW5nIGR1 bmUtZGVwczogcHJvZHVjZXMgYSBwcm9qZWN0LWNlbnRyaWMgZGVwZW5kZW5j eSBncmFwaA0KT0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgTWVldGluZyAy MDIwDQpPbGQgQ1dODQoNCg0KTWFraW5nIGEgbXVzaWMgcGxheWVyIGluIE9D YW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L21ha2luZy1hLW11c2ljLXBsYXllci1pbi1vY2FtbC81NDEzLzE+ DQoNCg0KRHJhY29zZSBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIGludGVyZXN0ZWQgaW4gbWFraW5n IG15IG93biBtdXNpYyBwbGF5ZXIgaW4gT0NhbWwgc28gSSB3YW50ZWQgdG8N CiAga25vdyB3aGV0aGVyIHRoZXJlIHdlcmUgYW55IGV4aXN0aW5nIG9uZXMg YW5kL29yIGV4YW1wbGVzIG9mIGhvdyB0bw0KICBtYWtlIG9uZS4gQmVhciBp biBtaW5kLCBJIGFtIGludGVyZXN0ZWQgaW4gdGhlIGFjdHVhbCBsb2dpYyBv ZiBob3cgdG8NCiAgcmVhZCBhIG11c2ljIGZpbGUgKG9yIGEgcGxheWxpc3Qp IGFuZCBsaXN0ZW5pbmcgdG8gaXQsIHJhdGhlciB0aGFuIHRoZQ0KICBmcm9u dC1lbmQgcGFydCBvZiBhIG11c2ljIHBsYXllci4gIChNeSBrbm93bGVkZ2Ug b2YgT0NhbWwgaXMNCiAgaW50ZXJtZWRpYXRlKQ0KDQoNClRob21hcyBCbGFu YyBzdWdnZXN0ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFlvdSB3 YW50IHRvIGNoZWNrIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9saXF1 aWRzb2FwPg0KDQoNCllvdGFtIEJhcm5veSB0aGVuIHNhaWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdvdyBAUGF0SiBJIGRpZG4ndCBrbm93IGFi b3V0IGxpcXVpZHNvYXAuIEkgYWRkZWQgaXQgdG8NCiAgb2NhbWx2ZXJzZS4g VGhpcyBpcyB3aGF0IHdlIGhhdmUgZm9yIHRoZSBhdWRpbyBwYWdlIG5vdywg aW4gY2FzZSBpdCdzDQogIGhlbHBmdWwgdG8gdGhlIE9QOiA8aHR0cHM6Ly9v Y2FtbHZlcnNlLmdpdGh1Yi5pby9jb250ZW50L2F1ZGlvLmh0bWw+DQoNCg0K Z25kbCBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZXhwZXJpbWVudGVk IHdpdGggc2V2ZXJhbCBzb2x1dGlvbnMgaW4gdGhlIFtwbGF5b10gcHJvamVj dC4gIE9uZSBvZg0KICB0aGUgcG9zc2libGUgc29sdXRpb25zIGlzIHRvIHVz ZSBbb2NhbWwtZ3N0cmVhbWVyXS4gIElmIHlvdSBmaW5kIHRoYXQNCiAgdGhl IGdzdHJlYW1lciBmcmFtZXdvcmsgaXMgdG9vIGFubm95aW5nICh3aGljaCBJ IGNhbiB1bmRlcnN0YW5kIDotKSwNCiAgeW91IGNhbiB1c2UgW29jYW1sLWZm bXBlZ10uIG5vdGUgaG93ZXZlciB0aGF0LCBpbiB0aGUgbGF0ZXN0IHZlcnNp b24NCiAgb2Ygb2NhbWwtZmZtcGVnLCB0aGUgYXVkaW8gZGV2aWNlIG91dHB1 dCBbbm8gbG9uZ2VyIHdvcmtzXS4gVG8NCiAgb3ZlcmNvbWUgdGhpcyBkcmF3 YmFjaywgeW91IGNhbiB1c2UgW29jYW1sLXBvcnRhdWRpb10uDQoNCg0KW3Bs YXlvXSA8aHR0cHM6Ly9naXRodWIuY29tL2duZGwvcGxheW8+DQoNCltvY2Ft bC1nc3RyZWFtZXJdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2Ft bC1nc3RyZWFtZXI+DQoNCltvY2FtbC1mZm1wZWddIDxodHRwczovL2dpdGh1 Yi5jb20vc2F2b25ldC9vY2FtbC1mZm1wZWc+DQoNCltubyBsb25nZXIgd29y a3NdIDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2FtbC1mZm1wZWcv aXNzdWVzLzMyPg0KDQpbb2NhbWwtcG9ydGF1ZGlvXSA8aHR0cHM6Ly9naXRo dWIuY29tL3Nhdm9uZXQvb2NhbWwtcG9ydGF1ZGlvPg0KDQoNClRoZSBlbmQg b2YgQ2FtbHA0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3RoZS1lbmQtb2YtY2FtbHA0LzQyMTYvOTY+DQoN Cg0KQ29udGludWluZyB0aGlzIG9sZCB0aHJlYWQsIENoZXQgTXVydGh5IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUGVyaGFwcyB3b3J0aCBtZW50 aW9uaW5nIGJyaWVmbHkgdGhhdCBmb3IgYW55Ym9keSB3aG8gLXdhbnRzLSB0 bw0KICBjb250aW51ZSB1c2luZyBjYW1scDQsIEknbSAoYSkgbWFpbnRhaW5p bmcgY2FtbHA1IGFuZCBicmluZ2luZyBpdA0KICB1cC10by1kYXRlIHdpdGgg ZXZlcnl0aGluZyBpbiBvY2FtbCA0LjEwLjAgdGhhdCBJIGNhbiB0aGluayBv ZiwgYW5kDQogIChiKSBJJ2QgYmUgaGFwcHkgdG8gaGVscCB0aGVtIHBvcnQg dGhlaXIgZGVwZW5kZW5jeSBvdmVyIHRvIGNhbWxwNS4NCg0KICBUaGlzIGlz IG5vdCB0byBiZSBjb25zdHJ1ZWQgYXMgYW4gYXJndW1lbnQgZm9yIHVzaW5n IGNhbWxwNC81Lg0KDQoNCk9DYW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMT4NCg0KDQpFdGllbm5lIE1p bGxvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIE9uIGJlaGFsZiBvZiB0aGUgZGV2ZWxvcG1lbnQgdGVhbSwgSSdkIGxp a2UgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb2NhbWxmb3JtYXQg dmVyc2lvbiAwLjE0LjAgOnRhZGE6Lg0KDQogIEhlcmUgYXJlIHRoZSBtYWlu IGhpZ2hsaWdodHMgb2YgdGhpcyByZWxlYXNlOg0KDQoNClN1cHBvcnQgZm9y IE9DYW1sIDQuMTANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaXMg bWVhbnMgYm90aCB0aGF0IGl0IGNvbXBpbGVzIGFuZCBydW5zIHVzaW5nIHRo aXMgdmVyc2lvbiwgYnV0IGFsc28NCiAgdGhhdCBpdCBjYW4gZm9ybWF0IDQu MTAtc3BlY2lmaWMgbGFuZ3VhZ2UgZmVhdHVyZXMgKGBtb2R1bGUgXycgYW5k DQogIG11bHRpLWluZGljZXMgb3BlcmF0b3JzKS4NCg0KDQpQcmVsaW1pbmFy eSBzdXBwb3J0IGZvciBpbnZhbGlkIGZpbGVzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBBcyBPQ2FtbGZvcm1hdCBvcGVyYXRlcyBvbiBBU1RzLCBp dCBub3JtYWxseSByZXF1aXJlcyBhIHZhbGlkIGlucHV0DQogIGZpbGUuIFRo aXMgcmVsZWFzZSBhZGRzIGEgYC0tZm9ybWF0LWludmFsaWQtZmlsZXMnIG9w dGlvbiB0byBkZXRlY3QNCiAgaW52YWxpZCBwYXJ0cyBhbmQgcHJpbnQgdGhl bSB2ZXJiYXRpbS4gVGhpcyBmZWF0dXJlIGlzIHN0aWxsDQogIGV4cGVyaW1l bnRhbC4NCg0KDQpQcmVzZXJ2aW5nIG1vcmUgY29uY3JldGUgc3ludGF4DQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBTdGFydGluZyB3aXRoIHRoaXMgcmVsZWFzZSwgT0NhbWxmb3Jt YXQgaXMgZ29pbmcgdG8gcHJlc2VydmUgbW9yZQ0KICBjb25jcmV0ZSBzeW50 YXguIEZvciBleGFtcGxlLCBgbW9kdWxlIE0gPSBmdW5jdG9yIChLIDogUykg LT4gc3RydWN0DQogIGVuZCcgYW5kIGBtb2R1bGUgTSAoSyA6IFMpID0gc3Ry dWN0IGVuZCcgYXJlIGVxdWl2YWxlbnQuIEluIHRoZSBwYXN0LA0KICBib3Ro IHZhcmlhbnRzIHdvdWxkIGJlIGZvcm1hdHRlZCBhcyB0aGUgbGF0dGVyLiBO b3csIHRoZSBvcmlnaW5hbA0KICBzeW50YXggaXMgcHJlc2VydmVkLiBJbiBz b21lIGNhc2VzLCBwcmVzZXJ2aW5nIHdhcyBwb3NzaWJsZSB0aHJvdWdoDQog IHRoZSBtZWFucyBvZiBhbiBvcHRpb246IGZvciBleGFtcGxlLCB0byBjaG9p Y2UgYmV0d2VlbiBgbGV0JW5hbWUgeCA9IGUNCiAgaW4gYm9keScgYW5kIGBb JW5hbWUgbGV0IHggPSBlIGluIGJvZHldJywgd2FzIGNvbnRyb2xsZWQgYnkg dGhlDQogIGBleHRlbnNpb24tc3VnYXInIG9wdGlvbi4gVGhpcyBvcHRpb24g aXMgbm93IGRlcHJlY2F0ZWQgYW5kDQogIE9DYW1sZm9ybWF0IHdpbGwgbm93 IGFsd2F5cyBwcmVzZXJ2ZSB3aGF0IHdhcyBpbiB0aGUgc291cmNlIGZpbGUg KHRoaXMNCiAgd2FzIHRoZSBkZWZhdWx0IGJlaGF2aW91cikuDQoNCiAgU2lt aWxhcmx5LCBpdCB3YXMgcG9zc2libGUgdG8gY29udHJvbCBob3cgc3BlY2lh bCBjaGFyYWN0ZXJzIGFyZQ0KICBlc2NhcGVkIGluIHN0cmluZyBhbmQgY2hh cmFjdGVyIGxpdGVyYWxzIHRocm91Z2ggdGhlIGBlc2NhcGUtc3RyaW5ncycN CiAgYW5kIGBlc2NhcGUtY2hhcnMnIG9wdGlvbnMuIFRoZXkgYXJlIGJlaW5n IGRlcHJlY2F0ZWQgYW5kIHRoZSBvbmx5DQogIHBvc3NpYmxlIGJlaGF2aW9y IHdpbGwgYmUgcHJlc2VydmluZyB0aGUgY29uY3JldGUgc3ludGF4IChhcyBk b25lIGJ5DQogIGRlZmF1bHQpLg0KDQogIFRoZSByZWFzb24gZm9yIHRoaXMg Y2hhbmdlIGlzIHRoYXQgd2UgZmVlbCB0aGF0IG9jYW1sZm9ybWF0IHNob3Vs ZCBiZQ0KICBqdXN0IGFib3V0IGZvcm1hdHRpbmcuIFRoZSBmYWN0IHRoYXQg dGhpcyBiZWhhdmlvciB3YXMgY29uZmlndXJhYmxlIGlzDQogIGluIHBhcnQg ZHVlIHRvIHRoZSBmYWN0IHRoYXQgaXQgb3BlcmF0ZXMgb24gT0NhbWwgQVNU cywgYnV0IGVuZCB1c2Vycw0KICBzaG91bGQgbm90IGhhdmUgdG8gYmUgc3Vy cHJpc2VkIGJ5IHRoZWlyIGNvZGUgYmVpbmcgdHJhbnNmb3JtZWQgb24NCiAg cmVmb3JtYXR0aW5nLg0KDQogIEluIHRoZSBmdXR1cmUsIHdlIHBsYW4gdG8g ZXh0ZW5kIHRoYXQgdG8gb3RoZXIgc2ltaWxhciBjb25zdHJ1Y3RzLA0KICBz dWNoIGFzIHVzaW5nIGAofi8nKX4gb3IgYGJlZ2lufi9+ZW5kJywgb3Igc3Bh Y2luZyBiZXR3ZWVuIG1vZHVsZQ0KICBpdGVtcy4NCg0KDQpQbGFjZW1lbnQg b2YgZG9jIGNvbW1lbnRzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBQbGFjaW5nIGRvYyBjb21tZW50cyBgKCoqIC4uLiAqKScgaXMg Y29udHJvbGxlZCBieSB0aGUgYGRvYy1jb21tZW50cycNCiAgY29uZmlndXJh dGlvbiBvcHRpb24uIEl0IGlzIGFsd2F5cyBwb3NzaWJsZSB0byBwdXQgdGhl bSBiZWZvcmUgdGhlDQogIGl0ZW0gdGhleSByZWZlciB0bywgYW5kIHRoaXMg aXMgd2hhdCB0aGUgYGRvYy1jb21tZW50cz1iZWZvcmUnIG9wdGlvbg0KICBk b2VzLiBUaGUgYWx0ZXJuYXRpdmUgYGRvYy1jb21tZW50cz1hZnRlcicgd2ls bCB0cnkgdG8gZG8gaXRzIGJlc3QgdG8NCiAgcHV0IHRoZW0gYWZ0ZXIsIGJ1 dCBpbiBzb21lIGNhc2VzIGl0IGlzIG5vdCBwb3NzaWJsZS4gRm9yIGV4YW1w bGUsIGluDQogIGEgdmFyaWFudCB0eXBlIGRlY2xhcmF0aW9uLCBhIGRvYy1j b21tZW50IHB1dCBpbW1lZGlhdGVseSBhZnRlciB3aWxsDQogIGJlIGF0dGFj aGVkIHRvIHRoZSBsYXN0IGNvbnN0cnVjdG9yIGJ5IGRvY3VtZW50YXRpb24N CiAgdG9vbHMuIE9jYW1sZm9ybWF0IG5lZWRzIHRvIHByZXNlcnZlIHRoZSBt ZWFuaW5nIG9mIHByb2dyYW1zLCBzbyBpbg0KICB0aGVzZSBjYXNlcywgaXQg d2lsbCBpbnN0ZWFkIHB1dCB0aGUgY29tbWVudCBiZWZvcmUuIEluIHRoZSBj YXNlIG9mDQogIGBtb2R1bGUnIGRlY2xhcmF0aW9ucywgcHV0dGluZyB0aGUg Y29tbWVudCBhZnRlciBtaWdodCBub3QgYmUgdmVyeQ0KICB1c2VmdWwgaWYg dGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGlzIHZlcnkgbGFyZ2UuDQoNCiAg VGhpcyByZXF1aXJlcyBhIGNvbXBsZXggcnVsZSB0byBkZXRlcm1pbmUgd2hp Y2ggY29tbWVudHMgd2lsbCBiZSBwdXQNCiAgYmVmb3JlIGFuZCB3aGljaCBj b21tZW50cyB3aWxsIGJlIHB1dCBhZnRlci4gU28gaW4gdGhpcyB2ZXJzaW9u LCB3ZQ0KICBhcmUgZGVwcmVjYXRpbmcgdGhpcyBtZWNoYW5pc20gYW5kIHJl cGxhY2luZyBpdCB3aXRoIGEgc2ltcGxlciBvbmUNCiAgY29udHJvbGxlZCBi eSBgZG9jLWNvbW1lbnRzLXZhbCcgdGhhdCBhcHBsaWVzIG9ubHkgdG8gYHZh bCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMuIEZvciB0aGVzZSBpdGVtcywg aXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIGF0dGFjaA0KICBkb2N1bWVudHMg YmVmb3JlIG9yIGFmdGVyIHRoZW0uIEZvciBhbGwgb3RoZXIgaXRlbXMsIGxp a2UgdHlwZSBvcg0KICBtb2R1bGUgZGVjbGFyYXRpb25zLCB0aGUgZG9jIGNv bW1lbnRzIHdpbGwgY29uc2lzdGVubHkgYmUgcHV0IGJlZm9yZS4NCg0KDQpN YW55IGJ1Z3MgZm91bmQgYnkgZnV6emluZw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2UgaG9va2VkIG9jYW1sZm9ybWF0IHRv IEFGTCwgbG9va2luZyBmb3IgcHJvZ3JhbXMgdGhhdCBwYXJzZQ0KICBjb3Jy ZWN0bHkgYnV0IHRyaWdnZXIgZXJyb3JzIGR1cmluZyBmb3JtYXR0aW5nLiBU aGlzIGFwcHJvYWNoIHdvcmtlZA0KICB2ZXJ5IHdlbGwgYW5kIG1vcmUgdGhh biAyMCBsb2dpY2FsIGJ1Z3Mgd2VyZSBmb3VuZCB3aXRoIHRoaXMNCiAgdGVj aG5pcXVlLg0KDQoNClVwZ3JhZGluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgVG8gdXBncmFkZSBmcm9tIG9jYW1sZm9ybWF0IDAuMTMu MCwgb25lIG5lZWRzIHRvIHVwZ3JhZGUgdGhlDQogIG9jYW1sZm9ybWF0IGJp bmFyeSBhbmQgcmVwbGFjZSB0aGUgYHZlcnNpb24nIGZpZWxkIGluIGAub2Nh bWxmb3JtYXQnDQogIGZpbGVzIGJ5IGAwLjE0LjAnIGFuZCB0aGVuOg0KDQog IOKAoiBpZiB5b3UgdXNlZCBgZG9jLWNvbW1lbnRzPWFmdGVyJywgeW91IGNh biByZXBsYWNlIGl0IGJ5DQogICAgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXIn LiAgVGhpcyB3aWxsIG1vdmUgZG9jLWNvbW1lbnRzIG9uIG1vZHVsZQ0KICAg IGl0ZW1zIGV4Y2VwdCBgdmFsJyBhbmQgYGV4dGVybmFsJyBvbmVzLg0KICDi gKIgaWYgeW91IHVzZWQgYGRvYy1jb21tZW50cz1iZWZvcmUnLCB5b3UgY2Fu IHJlbW92ZSBpdCBhcyBpdCBpcyBub3cNCiAgICB0aGUgZGVmYXVsdC4NCiAg 4oCiIGlmIHlvdSBzZXQgYGVzY2FwZS1jaGFycz1wcmVzZXJ2ZScsIGBlc2Nh cGUtc3RyaW5ncz1wcmVzZXJ2ZScsIG9yDQogICAgYGV4dGVuc2lvbi1zdWdh cj1wcmVzZXJ2ZScgZXhwbGljaXRseSwgeW91IGNhbg0KICByZW1vdmUgdGhl bSBzYWZlbHkgKHRoZXkgd2VyZSB0aGUgZGVmYXVsdCkNCiAg4oCiIGlmIHlv dSB1c2VkIGFub3RoZXIgdmFsdWUgZm9yIG9uZSBvZiB0aGVzZSBvcHRpb25z IChzdWNoIGFzDQogICAgYGVzY2FwZS1zdHJpbmdzPWhleGFkZWNpbWFsJyks IHlvdSB3aWxsIG5lZWQgdG8gcmVtb3ZlIHRoZW0gYXMNCiAgICB3ZWxsLiBU aGlzIHdpbGwgbm90IHRyaWdnZXIgYSBkaWZmLCBidXQgb2NhbWxmb3JtYXQg d2lsbCBub3QgZW5mb3JjZQ0KICAgIGEgcGFydGljdWxhciBjb25jcmV0ZSBz eW50YXggZm9yIG5ldyBjb2RlLg0KDQoNCkEgbm90ZSBmb3IgbmV3IHVzZXJz DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBXZSBlbmNvdXJhZ2UgeW91IHRvIHRy eSBvY2FtbGZvcm1hdCwgdGhhdCBjYW4gYmUgaW5zdGFsbGVkIGZyb20gb3Bh bQ0KICBkaXJlY3RseSAoYG9wYW0gaW5zdGFsbCBvY2FtbGZvcm1hdCcpLCBi dXQgcGxlYXNlIHJlbWVtYmVyIHRoYXQgaXQgaXMNCiAgc3RpbGwgYmV0YSBz b2Z0d2FyZS4gV2UgYWRkZWQgYSBbRkFRIGZvciBuZXcgdXNlcnNdIHRoYXQg c2hvdWxkIGhlbHANCiAgeW91IGRlY2lkZSBpZiBvY2FtbGZvcm1hdCBpcyB0 aGUgcmlnaHQgY2hvaWNlIGZvciB5b3UuDQoNCg0KW0ZBUSBmb3IgbmV3IHVz ZXJzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3Jt YXQjZmFxLWZvci1uZXctdXNlcnM+DQoNCg0KRXRpZW5uZSBNaWxsb24gbGF0 ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRoaXMgdXBncmFkZSBpcyBsaWtlbHkgdG8gZ2VuZXJhdGUgYSBodWdl IGRpZmYgb24gcHJvamVjdHMgdGhhdCB1c2UNCiAgdGhlIGRlZmF1bHQgcHJv ZmlsZSwgc28gSSB3b3VsZCBsaWtlIHRvIGV4cGFuZCBhIGJpdCBvbiB0aGUg cmVhc29uLg0KDQogIEFjY29yZGluZyB0byBbdGhlIHN5bnRheCBydWxlcyB1 c2VkIGJ5IHRoZSBvY2FtbCB0b29sc10gKHRoZSBvY2FtbA0KICBjb21waWxl cnMsIG9jYW1sZG9jLCBvZG9jKSwgaXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRv IHB1dCB0aGUNCiAgZG9jLWNvbW1lbnQgYmVmb3JlIGFuIGl0ZW0uDQoNCiAg U29tZSB0ZWFtcyBwcmVmZXIgdG8gcHV0IHRoZSBkb2N1bWVudGF0aW9uIGFm dGVyLiBCdXQgdGhhdCBpcyBub3QNCiAgYWx3YXlzIHBvc3NpYmxlLiBGb3Ig ZXhhbXBsZSwgYHR5cGUgdCA9IEEgfCBCICgqKiBkb2MgKiknIHdpbGwgYXR0 YWNoDQogIHRoZSBkb2MtY29tbWVudCB0byBgQicsIG5vdCB0byBgdCcuIFRo ZSBvbmx5IHdheSB0byBhdHRhY2ggdGhlIGNvbW1lbnQNCiAgdG8gYHQnIGlz IGJ5IHB1dHRpbmcgdGhlIGNvbW1lbnQgYmVmb3JlLg0KDQogIEVudGVyIG9j YW1sZm9ybWF0OiBkb2MtY29tbWVudCBwbGFjZW1lbnQgaXMgY29udHJvbGxl ZCBieSBhbiBvcHRpb24NCiAgd2l0aCB0d28gdmFsdWVzLCBgYmVmb3JlJyBv ciBgYWZ0ZXInLiBgYmVmb3JlJyB3aWxsIGFsd2F5cyBwbGFjZSB0aGUNCiAg Y29tbWVudCBiZWZvcmUuIGBhZnRlcicgZGV0ZXJtaW5lcyBpZiBpdCBpcyBw b3NzaWJsZSB0byBwdXQgdGhlDQogIGNvbW1lbnQgYWZ0ZXIsIGFuZCBpZiBp dCBpcyBub3QsIHdpbGwgcHV0IGl0IGJlZm9yZS4NCg0KICBTb21lIGl0ZW1z IGNhbm5vdCBoYXZlIGNvbW1lbnRzIGFmdGVyLCBsaWtlIHZhcmlhbnQgdHlw ZXMgKGFzDQogIGRlc2NyaWJlZCBhYm92ZSkuIEJ1dCB0aGVyZSBpcyBhbm90 aGVyIHJlYXNvbiBub3QgdG8gcHV0IGNvbW1lbnRzDQogIGFmdGVyLiBJbiBz b21lIGNhc2VzLCB0aGF0IGNhbiBwdXQgdGhlIGNvbW1lbnQgZmFyIGZyb20g dGhlIHRoaW5nIGl0DQogIGlzIGRvY3VtZW50aW5nLiBDb25zaWRlcmluZyBt b2R1bGVzLCB0aGUgZm9sbG93aW5nIGlzIG5pY2U6DQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBtb2R1bGUgTSA9IEwuTQ0KICDilIIgKCoqIGRvYyAq KQ0KICDilJTilIDilIDilIDilIANCg0KICBCdXQgdGhpcyBpcyBub3QgZ3Jl YXQgaXMgdGhlIHN0cnVjdHVyZSBpcyBsYXJnZToNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG1vZHVsZSBNID0gc3RydWN0DQogIOKUgiAgIC4uLg0K ICDilIIgICAuLi4NCiAg4pSCIGVuZA0KICDilIIgKCoqIGRvYyAqKQ0KICDi lJTilIDilIDilIDilIANCg0KICBUbyBzdW1tYXJpemUsIHdoZW4gb2NhbWxm b3JtYXQgaXMgY29uZmlndXJlZCB0byBwdXQgY29tbWVudHMgYWZ0ZXIsIGl0 DQogIGhhcyB0byBmb2xsb3cgYSBjb21wbGV4IGhldXJpc3RpYyB0byBkZXRl cm1pbmUgd2hldGhlciBpdCBoYXMgdG8NCiAgZmFsbGJhY2sgdG8gYmVmb3Jl LiBJbiB0aGUgY2FzZSBvZiBhIG1vZHVsZSwgaXQgZGVwZW5kcyBvbiBpdHMg c2hhcGUsDQogIGhvdyBtYW55IGZ1bmN0b3IgYXJndW1lbnRzIGFyZSB0aGVy ZSwgdGhpcyBraW5kIG9mIHRoaW5ncyAoZm9yIHZhcmlvdXMNCiAgcmVhc29u cywgd2UgZG9uJ3Qga25vdyBob3cgbGFyZ2Ugc29tZXRoaW5nIGlzIGdvaW5n IHRvIGJlIGluIGFkdmFuY2UsDQogIHNvIHdlIGhhdmUgdG8gbG9vayBhdCBp dHMgc2hhcGUpLiBUaGUgcG9pbnQgaXMgdGhhdCBpdCBpcyBjb21wbGljYXRl ZA0KICB0byB1bmRlcnN0YW5kIGFuZCBleHBsYWluLCBhbmQgdGhhdCBmaXhp bmcgaXQgYWx3YXlzIG1ha2VzIGl0IG1vcmUNCiAgY29tcGxleC4gQW5vdGhl ciBhc3BlY3QgaXMgdGhhdCBpbiB0aGUgZW5kLCB3ZSB3YW50IG9jYW1sZm9y bWF0IHRvIGJlDQogIHByZXR0eSBzdGFibGUgd2hlbiBpdCByZWFjaGVzIDEu MC4wLCBhbmQgY29tcGxleCBydWxlcyBhcmUgYXQgb2Rkcw0KICB3aXRoIHRo aXMgZ29hbC4NCg0KICBTbywgd2UgaGF2ZSBkZWNpZGVkIHRvIHNpbXBsaWZ5 IHRoZSBydWxlOiBpbnN0ZWFkIG9mIGxvb2tpbmcgZGVlcCBpbg0KICB0aGUg QVNULCB3ZSBqdXN0IGxvb2sgYXQgdGhlIGtpbmQgb2YgaXRlbSB0aGlzIGlz LiBGb3IgYHZhbCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMsIGl0IGlzIGFs d2F5cyBwb3NzaWJsZSB0byBwdXQgdGhlIGRvYy1jb21tZW50IGFmdGVyLA0K ICBzbyB3ZSBmb2xsb3cgZXhhY3RseSB3aGF0IHRoZSBjb25maWd1cmF0aW9u IG9wdGlvbiBzYXlzLg0KDQogIEFzIGEgdXNlciBvZiB0aGUgZGVmYXVsdCBw cm9maWxlLCB3aGF0IHRoaXMgbWVhbnMgZm9yIHlvdTogZm9yIGl0ZW1zDQog IHRoYXQgYXJlIG5vdCBgdmFsJyBvciBgZXh0ZXJuYWwnLCBhbmQgY29uc2lk ZXJlZCAic2ltcGxlIiBieSB0aGUNCiAgMC4xMy4wIGhldXJpc3RpYywgZG9j LWNvbW1lbnRzIGFyZSBnb2luZyB0byBtb3ZlIGZyb20gYWZ0ZXIgdG8gYmVm b3JlLg0KDQogIEJhc2VkIG9uIHRoZXNlIHJlYXNvbnMsIHlvdSB3aWxsIHVu ZGVyc3RhbmQgdGhhdCBgYmVmb3JlJyBpcyBhbHdheXMNCiAgc2ltcGxlci4g WW91IGNhbiBvcHQgaW50byB0aGlzIGJ5IHNldHRpbmcNCiAgYGRvYy1jb21t ZW50cy12YWw9YmVmb3JlJy4gVGhpcyB3aWxsIGNhdXNlIGFuIGV2ZW4gbGFy Z2VyIGRpZmYgYXMgYWxsDQogIGl0ZW1zIGFyZSBnb2luZyB0byBtb3ZlIGJl Zm9yZSAodGhhdCBpczogYWxsIGl0ZW1zIGRlc2NyaWJlZCBqdXN0DQogIGFi b3ZlLCBwbHVzIGB2YWwnIGFuZCBgZXh0ZXJuYWwnIGl0ZW1zKSwgYnV0IHRo ZSBydWxlIGdldHMgZXh0cmVtZWx5DQogIHNpbXBsZSAoZXZlcnl0aGluZyBp cyBwdXQgYmVmb3JlKS4gSXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIG9wdGlv bg0KICB3aWxsIGJlY29tZSB0aGUgZGVmYXVsdCBpbiB0aGUgZnV0dXJlLCBi dXQgd2UgaGF2ZSBub3QgZGVjaWRlZCB0aGlzDQogIHlldCAoaW4gdGhpcyBj YXNlLCBpZiB5b3UgZGlkIG5vdCBvcHQgaW50byBpdCwgeW91IHdpbGwgc2Vl IGNvbW1lbnRzDQogIG9uIGB2YWwnIGFuZCBgZXh0ZXJuYWwnIGl0ZW1zIG1v dmUgYXQgdGhhdCB0aW1lKS4NCg0KDQpbdGhlIHN5bnRheCBydWxlcyB1c2Vk IGJ5IHRoZSBvY2FtbCB0b29sc10NCjxodHRwczovL2NhbWwuaW5yaWEuZnIv cHViL2RvY3MvbWFudWFsLW9jYW1sL29jYW1sZG9jLmh0bWwjc3M6b2NhbWxk b2MtcGxhY2VtZW50Pg0KDQoNCk1MIEZhbWlseSBXb3Jrc2hvcCAyMDIwOiBD YWxsIGZvciBwcmVzZW50YXRpb25zDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21sLWZhbWlseS13b3Jr c2hvcC0yMDIwLWNhbGwtZm9yLXByZXNlbnRhdGlvbnMvNTQ0MS8xPg0KDQoN CkxlbyBXaGl0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFy ZSBoYXBweSB0byBpbnZpdGUgc3VibWlzc2lvbnMgdG8gdGhlIE1MIEZhbWls eSBXb3Jrc2hvcCAyMDIwLCB0bw0KICBiZSBoZWxkIGR1cmluZyB0aGUgSUNG UCBjb25mZXJlbmNlIHdlZWsgb24gVGh1cnNkYXksIEF1Z3VzdCAyN3RoLg0K DQogIFRoZSBNTCBmYW1pbHkgd29ya3Nob3Agd2FybWx5IHdlbGNvbWVzIHN1 Ym1pc3Npb24gdG91Y2hpbmcgb24gdGhlDQogIHByb2dyYW1taW5nIGxhbmd1 YWdlcyB0cmFkaXRpb25hbGx5IHNlZW4gYXMgcGFydCBvZiB0aGUgIk1MIGZh bWlseSINCiAgKFN0YW5kYXJkIE1MLCBPQ2FtbCwgRiMsIENha2VNTCwgU01M IywgTWFudGljb3JlLCBNZXRhT0NhbWwsDQogIGV0Yy4pLiBUaGUgc2NvcGUg b2YgdGhlIHdvcmtzaG9wIGluY2x1ZGVzIGFsbCBhc3BlY3RzIG9mIHRoZSBk ZXNpZ24sDQogIHNlbWFudGljcywgdGhlb3J5LCBhcHBsaWNhdGlvbiwgaW1w bGVtZW50YXRpb24sIGFuZCB0ZWFjaGluZyBvZiB0aGUNCiAgbWVtYmVycyBv ZiB0aGUgTUwgZmFtaWx5LiBXZSBhbHNvIGVuY291cmFnZSBwcmVzZW50YXRp b25zIGZyb20gcmVsYXRlZA0KICBsYW5ndWFnZXMgKHN1Y2ggYXMgSGFza2Vs bCwgU2NhbGEsIFJ1c3QsIE5lbWVybGUsIExpbmtzLCBLb2thLCBGKiwNCiAg RWZmLCBBVFMsIGV0YyksIHRvIGV4Y2hhbmdlIGV4cGVyaWVuY2Ugb2YgZnVy dGhlciBkZXZlbG9waW5nIE1MIGlkZWFzLg0KDQogIEN1cnJlbnRseSwgdGhl IHdvcmtzaG9wIGlzIHN0aWxsIHNjaGVkdWxlZCB0byBnbyBhaGVhZCBhcyBw bGFubmVkIGluDQogIEplcnNleSBDaXR5LCBob3dldmVyIGl0IGlzIGxpa2Vs eSB0aGF0IHRoZSBNTCB3b3Jrc2hvcCB3aWxsIGVuZCB1cA0KICBiZWluZyBh IHZpcnR1YWwgd29ya3Nob3AgdGhpcyB5ZWFyLiBFaXRoZXIgd2F5IHByb3Zp c2lvbnMgd2lsbCBiZSBtYWRlDQogIHRvIGFsbG93IHNwZWFrZXJzIHRvIHBy ZXNlbnQgdGhlaXIgd29yayByZW1vdGVseS4NCg0KICBTZWUgb3VyIGRldGFp bGVkIENGUCBvbmxpbmUgb24gdGhlIElDRlAgd2Vic2l0ZToNCg0KICA8aHR0 cHM6Ly9pY2ZwMjAuc2lncGxhbi5vcmcvaG9tZS9tbGZhbWlseXdvcmtzaG9w LTIwMjA+DQoNCg0KSW1wb3J0YW50IGRhdGVzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRnJpZGF5 IDE1dGggTWF5IChhbnkgdGltZSB6b25lKTogQWJzdHJhY3Qgc3VibWlzc2lv biBkZWFkbGluZQ0KICDigKIgRnJpZGF5IDI2dGggSnVuZTogQXV0aG9yIG5v dGlmaWNhdGlvbg0KICDigKIgVGh1cnNkYXkgMjd0aCBBdWd1c3Q6IE1MIEZh bWlseSBXb3Jrc2hvcA0KDQoNClByb2dyYW0gY29tbWl0dGVlDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICDigKIgWW91eW91IENvbmcgKFRva3lvIEluc3RpdHV0ZSBvZiBUZWNo bm9sb2d5KQ0KICDigKIgR293dGhhbSBLYWtpIChQdXJkdWUgVW5pdmVyc2l0 eSkNCiAg4oCiIE5lZWwgS3Jpc2huYXN3YW1pIChVbml2ZXJzaXR5IG9mIENh bWJyaWRnZSkNCiAg4oCiIERhYW4gTGVpamVuIChNaWNyb3NvZnQgUmVzZWFy Y2gpDQogIOKAoiBLb2tvIE11cm95YSAoS3lvdG8gVW5pdmVyc2l0eSkNCiAg 4oCiIEF0c3VzaGkgT2hvcmkgKFRvaG9rdSBVbml2ZXJzaXR5KQ0KICDigKIg Sm9uYXRoYW4gUHJvdHplbmtvIChNaWNyb3NvZnQgUmVzZWFyY2gpDQogIOKA oiBHYWJyaWVsIFJhZGFubmUgKElOUklBKQ0KICDigKIgQ2xhdWRpbyBSdXNz byAoRGZpbml0eSkNCiAg4oCiIExlbyBXaGl0ZSAoSmFuZSBTdHJlZXQpIChD aGFpcikNCiAg4oCiIEplcmVteSBZYWxsb3AgKFVuaXZlcnNpdHkgb2YgQ2Ft YnJpZGdlKQ0KDQoNClN1Ym1pc3Npb24gZGV0YWlscw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgU2VlIHRoZSBvbmxpbmUgQ0ZQIGZvciB0aGUgZGV0YWlscyBvbiB0aGUg ZXhwZWN0ZWQgc3VibWlzc2lvbiBmb3JtYXQuDQoNCiAgU3VibWlzc2lvbnMg bXVzdCBiZSB1cGxvYWRlZCB0byB0aGUgd29ya3Nob3Agc3VibWlzc2lvbiB3 ZWJzaXRlDQoNCiAgPGh0dHBzOi8vbWwyMDIwLmhvdGNycC5jb20vPg0KDQog IGJlZm9yZSB0aGUgc3VibWlzc2lvbiBkZWFkbGluZS4NCg0KDQpBbm5vdW5j aW5nIFNlaywgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIHNlcXVl bmNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5v dW5jaW5nLXNlay1hbi1lZmZpY2llbnQtaW1wbGVtZW50YXRpb24tb2Ytc2Vx dWVuY2VzLzU0NDIvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdl IGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9m IFNlaywgYW4gT0NhbWwgbGlicmFyeQ0KICB0aGF0IG9mZmVycyBhbiBlZmZp Y2llbnQgaW1wbGVtZW50YXRpb24gb2Ygc2VxdWVuY2VzLg0KDQogIFRoZSBs aWJyYXJ5IG9mZmVycyBib3RoIGVwaGVtZXJhbCAobXV0YWJsZSkgc2VxdWVu Y2VzIGFuZCBwZXJzaXN0ZW50DQogIChpbW11dGFibGUpIHNlcXVlbmNlcywg YW5kIG9mZmVycyBjb25zdGFudC10aW1lIGNvbnZlcnNpb25zIGJldHdlZW4N CiAgdGhlc2UgZmxhdm9ycy4NCg0KICBJdCBzdXBwb3J0cyBhbGwgb2YgdGhl IHN0YW5kYXJkIG9wZXJhdGlvbnMgb24gc3RhY2tzLCBxdWV1ZXMsIGRlcXVl cw0KICAoZS5nLiAgcHVzaCwgcG9wIGF0IGVpdGhlciBlbmQpLCBjYXRlbmFi bGUgc2VxdWVuY2VzIChjb25jYXQsIHNwbGl0KSwNCiAgYW5kIHJhbmRvbSBh Y2Nlc3Mgc2VxdWVuY2VzIChnZXQsIHNldCkuDQoNCiAgRGF0YSBpcyBzdG9y ZWQgaW50ZXJuYWxseSBpbiBjaHVua3MgKGZpeGVkLWNhcGFjaXR5IGFycmF5 cyksIHdoaWNoIGlzDQogIHdoeSB0aGlzIGRhdGEgc3RydWN0dXJlIGlzIGtu b3duIGFzIGEgY2h1bksgU0VxdWVuY2UuDQoNCiAgSXQgaXMgaW50ZW5kZWQg dG8gYWNoaWV2ZSBleGNlbGxlbnQgdGltZSBjb21wbGV4aXR5IGFuZCBtZW1v cnkgdXNhZ2UuDQoNCiAgVGhpcyBpcyBhbiBpbml0aWFsIHJlbGVhc2UuIFRo ZSBsaWJyYXJ5IGhhcyBub3QgYmVlbiB0ZXN0ZWQgaW4NCiAgcHJvZHVjdGlv biwgYnV0IGhhcyByZWNlaXZlZCBleHRlbnNpdmUgdW5pdCB0ZXN0aW5nLCB2 aWEgYWZsLWZ1enogYW5kDQogIG9jYW1sK2FmbCDigJMgd2hpY2ggYXJlIHJl bWFya2FibHkgZWZmZWN0aXZlIHRvb2xzLCBieSB0aGUgd2F5IQ0KDQogIFRo aXMgaXMgd29yayBpbiBwcm9ncmVzczsgbW9yZSBmZWF0dXJlcywgc3VjaCBh cyBpdGVyYXRvcnMsIHdpbGwgYmUNCiAgYWRkZWQgaW4gdGhlIGZ1dHVyZS4N Cg0KICBUbyBpbnN0YWxsIFNlaywganVzdCB0eXBlDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZSAmJiBvcGFtIGluc3RhbGwgc2Vr DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERvY3VtZW50YXRpb24gaXMgW29u bGluZV0uDQoNCiAgRmVlZGJhY2sgaXMgd2VsY29tZSENCg0KICBBcnRodXIg Q2hhcmd1w6lyYXVkDQogIEZyYW7Dp29pcyBQb3R0aWVyDQogIHdpdGggY29u dHJpYnV0aW9ucyBieSDDiW1pbGllIEd1ZXJtZXVyDQoNCg0KW29ubGluZV0g PGh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9zZWsvZG9jL3Nl ay9TZWsvaW5kZXguaHRtbD4NCg0KDQpZYXJvbiBNaW5za3kgYXNrZWQgYW5k IEZhYmlhbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAg ICAgICBJ4oCZbSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBpbiBob3cgaXQg Y29tcGFyZXMgdG8NCiAgICAgICAgQmFzZS5TZXF1ZW5jZSBhbmQgU2VxIGlu IHRoZSBPQ2FtbCBkaXN0cmlidXRpb24sIGJ1dA0KICAgICAgICBzdXJlbHkg dGhlcmUgYXJlIG90aGVycyBhcyB3ZWxsLg0KDQogIFRoaXMgYWN0dWFsbHkg bG9va3MgbGlrZSBhbiBhcnJheS92ZWN0b3Igc3RydWN0dXJlIChzdXBwb3J0 aW5nLCBhbW9uZw0KICBvdGhlciB0aGluZ3MsIGZhc3QgYWNjZXNzIHRvIHRo ZSBudGggZWxlbWVudCksIHNvIGEgY29tcGFyaXNvbiB3aXRoDQogIGBDQ1Zl Y3RvcicsIGBDQ0Z1bl92ZWMnLCBgQmF0VmVjdCcsIGBDbGFyaXR5LlZlY3Rv cicgZXRjLiB3b3VsZCBiZQ0KICBtb3JlIGFwcHJvcHJpYXRlLiBUaGUgbmFt ZSBpcyBhIGJpdCB1bmZvcnR1bmF0ZSBjb25zaWRlcmluZyB0aGUgbmFtaW5n DQogIHVzZWQgaW4gdGhlIGdlbmVyYWwgZWNvc3lzdGVtLg0KDQogIFNvbWUg dGltZSBhZ28sIEkgYWRkZWQgc29tZSBjcnVkZSBiZW5jaG1hcmtzIHRvIFtj b250YWluZXJzJw0KICBiZW5jaHN1aXRlXS4gIEknbGwgc2VlIGlmIEkgY2Fu IGFkZCBTZWsgd2hlbiBJIGZpbmQgdGltZS4NCg0KDQpbY29udGFpbmVycycg YmVuY2hzdWl0ZV0NCjxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL29jYW1s LWNvbnRhaW5lcnMvYmxvYi9kMzRiNzU4OGIwMjhmMzYxOGNjNDRkM2Y0YzY0 MTcyOTVkYjU4NmM4L2JlbmNocy9ydW5fYmVuY2hzLm1sI0wxMTI+DQoNCg0K Z2FzY2hlIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEkgdGhpbmsgaXQgcmVhbGx5IGlzIGEgc2VxdWVuY2UgbGlicmFy eSBpbiB0aGUgc2Vuc2UgdGhhdCBpbiBtYWludGFpbnMNCiAgYW4gaW4tb3Jk ZXIgc2VxdWVuY2Ugb2YgaXRlbXMsIGFuZCBzZXF1ZW5jZXMgY2FuIGJlIGpv aW5lZC9zcGxpdA0KICBlZmZpY2llbnRseS4gSXQgYWxzbyBwcm92aWRlcyBs b2dhcml0aG1pYyByYW5kb20gYWNjZXNzLCBidXQgdGhpcyBpcw0KICBwcm9i YWJseSBub3QgY29tcGV0aXRpdmUgd2l0aCBmaXhlZC1zaXplIGFycmF5cy4g SXQgd291bGQgYmUNCiAgY29tcGFyYWJsZSB0byAicGVyc2lzdGVudCB2ZWN0 b3IiIGxpYnJhcmllcywgcm9wZXMsIGZpbmdlciB0cmVlcywNCiAgZXRjLiBU aGUgZmFjdCB0aGF0IHRoZSBhdXRob3JzIGV4cG9zZSBhIFN0YWNrL1F1ZXVl IGludGVyZmFjZSBzdWdnZXN0cw0KICB0aGF0IGl0IGhhcyBhbHNvIGJlZW4g dHVuZWQgdG8gcGVyZm9ybSByZWFzb25hYmx5IHdlbGwgaW4gdGhpcyBjYXNl Lg0KDQogIEl0IGRvZXMgbm90IHByb3ZpZGUgYW55IGRlbGF5ZWQgY29tcHV0 YXRpb24gb2YgaXRlbXMsIHNvIGluIHRoYXQNCiAgcmVnYXJkIGl0IGlzIG5v dCBjb21wYXJhYmxlIHRvIFNlcXVlbmNlL1NlcS4NCg0KICBAY2hhcmd1ZXIg aGFzIGRlc2lnbmVkIHNpbWlsYXIgZGF0YXN0cnVjdHVyZXMgaW4gdGhlIHBh c3QgdG8gcmVwcmVzZW50DQogIHRoZSB3b3JrLXF1ZXVlcyBvZiBjb25jdXJy ZW50IHdvcmtlcnMgKHlvdSB3YW50IGF0IGxlYXN0IGEgZmFzdCAicHVzaCIN CiAgdG8gYWRkIGEgbmV3IHRhc2sgYW5kLCB3aGVuIGRvaW5nIHdvcmstc3Rl YWxpbmcsIGhhdmluZyBhIGZhc3QgInNwbGl0Ig0KICBpcyBjb252ZW5pZW50 KS4gU2VlIFtUaGVvcnkgYW5kIFByYWN0aWNlIG9mIENodW5rZWQgU2VxdWVu Y2VzXSwgVW11dA0KICBBY2FyLCBBcnRodXIgQ2hhcmd1w6lyYXVkLCBNaWtl IFJhaW5leSwgMjAxNCwgYW5kIFtBIFdvcmstRWZmaWNpZW50DQogIEFsZ29y aXRobSBmb3IgUGFyYWxsZWwgVW5vcmRlcmVkIERlcHRoLUZpcnN0IFNlYXJj aF0uDQoNCiAgQXMgZmFyIGFzIEkga25vdywgdGhlIE9DYW1sIGltcGxlbWVu dGF0aW9uIGp1c3QgcmVsZWFzZWQgaGFzIG5vdCBiZWVuDQogIHRlc3RlZC9i ZW5jaG1hcmtlZCBmb3IgcGFyYWxsZWwgYWxnb3JpdGhtcy4gSSB3b3VsZCBi ZSBjdXJpb3VzIHRvIHNlZQ0KICBhbiBleHBlcmltZW50IG9mIHBhcmFsbGVs IGdyYXBoIHRyYXZlcnNhbCB3aXRoIHRoaXMgc3RydWN0dXJlIGFuZA0KICBN dWx0aWNvcmUtT0NhbWwuDQoNCg0KW1RoZW9yeSBhbmQgUHJhY3RpY2Ugb2Yg Q2h1bmtlZCBTZXF1ZW5jZXNdDQo8aHR0cHM6Ly93d3cuY2hhcmd1ZXJhdWQu b3JnL3Jlc2VhcmNoLzIwMTQvY2h1bmtlZHNlcS9jaHVua2Vkc2VxLnBkZj4N Cg0KW0EgV29yay1FZmZpY2llbnQgQWxnb3JpdGhtIGZvciBQYXJhbGxlbCBV bm9yZGVyZWQgRGVwdGgtRmlyc3QgU2VhcmNoXQ0KPGh0dHBzOi8vd3d3LmNo YXJndWVyYXVkLm9yZy9yZXNlYXJjaC8yMDE1L3BkZnMvcGRmc19zYzE1LnBk Zj4NCg0KDQpBbm5vdW5jaW5nIGR1bmUtZGVwczogcHJvZHVjZXMgYSBwcm9q ZWN0LWNlbnRyaWMgZGVwZW5kZW5jeSBncmFwaA0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm5vdW5jaW5nLWR1bmUtZGVwcy1wcm9kdWNlcy1hLXByb2plY3QtY2Vu dHJpYy1kZXBlbmRlbmN5LWdyYXBoLzU0NTEvMT4NCg0KDQpNYXJ0aW4gSmFt Ym9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SSdtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YgW2R1 bmUtZGVwc10sIGEgY29tbWFuZC1saW5lDQogIHRvb2wgdGhhdCBzY2FucyBh IGR1bmUgcHJvamVjdCBhbmQgZ2F0aGVycyB0aGUgZGVwZW5kZW5jaWVzIGlu dG8gYQ0KICBncmFwaC4gVGhlIG91dHB1dCBpcyBpbiB0aGUgZG90IGZvcm1h dCwgc3VwcG9ydGVkIGJ5IHRoZSBgZG90JyBjb21tYW5kDQogIGZyb20gW2dy YXBodml6XS4NCg0KICBJdCBzaG93cyB0aGUgZGVwZW5kZW5jaWVzIGJldHdl ZW4gdGhlIGZvbGxvd2luZzoNCg0KICDigKIgbGlicmFyaWVzIGRlZmluZWQg YnkgdGhlIHByb2plY3QsDQogIOKAoiBleGVjdXRhYmxlcyBkZWZpbmVkIGJ5 IHRoZSBwcm9qZWN0LA0KICDigKIgZGlyZWN0IGRlcGVuZGVuY2llcyBvbiBl eHRlcm5hbCBsaWJyYXJpZXMuDQoNCiAgRGVwZW5kZW5jaWVzIGFyZSBleHRy YWN0ZWQgYnkgcGFyc2luZyBgZHVuZScgZmlsZXMuIEFzIGFuIGV4YW1wbGUs DQogIGhlcmUncyB3aGF0IHdlIG9idGFpbiBmb3IgdGhlIFtzb3VyY2VzIG9m IG9wYW1dLCB3aGljaCBoYXMgb3ZlciA1MEsNCiAgbGluZXMgb2YgY29kZToN Cg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJk MTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9mL2Y2MjEzZmE3ZmRhNTI1 MjFjNjc4Mjk4ODE1NWFiMjNiOTk3ZGFmYjgucG5nPg0KDQogIFRoZSBjb21t YW5kcyBmb3IgdGhpcyBhcmU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg IyBvYnRhaW4gdGhlIHByb2plY3QncyBzb3VyY2VzDQogIOKUgiAkIGdpdCBj bG9uZSAtLWRlcHRoPTEgaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0u Z2l0DQogIOKUgg0KICDilIIgIyBleHRyYWN0IGRlcGVuZGVuY2llcyBhbmQg ZWxpbWluYXRlIHN1cGVyZmx1b3VzIGdyYXBoIGVkZ2VzDQogIOKUgiAkIGR1 bmUtZGVwcyBvcGFtIHwgdHJlZCA+IGRlcHMuZG90DQogIOKUgg0KICDilIIg IyByZW5kZXIgdGhlIGdyYXBoDQogIOKUgiAkIGRvdCAtVHBuZyBkZXBzLmRv dCAtbyBkZXBzLnBuZw0KICDilJTilIDilIDilIDilIANCg0KICBBIHN1Z2dl c3Rpb24gaXMgdG8gaW5jbHVkZSBzdWNoIGdyYXBoIGluIHlvdXIgcHJvamVj dCdzIGBSRUFETUUubWQnLg0KDQoNCltkdW5lLWRlcHNdIDxodHRwczovL2dp dGh1Yi5jb20vbWphbWJvbi9kdW5lLWRlcHM+DQoNCltncmFwaHZpel0gPGh0 dHBzOi8vd3d3LmdyYXBodml6Lm9yZy8+DQoNCltzb3VyY2VzIG9mIG9wYW1d IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbT4NCg0KDQpPQ2FtbCBV c2VycyBhbmQgRGV2ZWxvcGVycyBNZWV0aW5nIDIwMjANCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtdXNlcnMtYW5kLWRldmVsb3BlcnMt bWVldGluZy0yMDIwLzU0NTQvMT4NCg0KDQpJdmFuIEdvdG92Y2hpdHMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ dCBpcyBteSBwbGVhc3VyZSB0byBpbnZpdGUgc3VibWlzc2lvbnMgdG8gdGhl IE9DYW1sIFVzZXJzIGFuZA0KICBEZXZlbG9wZXJzIFdvcmtzaG9wIDIwMjAs IHdoaWNoIGlzIGFnYWluIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIGFuZCB3aWxs DQogIGJlIGhlbGQgb24gRnJpZGF5IDI4dGggQXVndXN0IDIwMjAgaW4gSmVy c2V5IENpdHksIE5KLCBVU0EuDQoNCiAgVGhlIE9DYW1sIFVzZXJzIGFuZCBE ZXZlbG9wZXJzIFdvcmtzaG9wIGJyaW5ncyB0b2dldGhlciB0aGUgT0NhbWwN CiAgY29tbXVuaXR5LCBpbmNsdWRpbmcgdXNlcnMgb2YgT0NhbWwgaW4gaW5k dXN0cnksIGFjYWRlbWlhLCBob2JieWlzdHMNCiAgYW5kIHRoZSBmcmVlIHNv ZnR3YXJlIGNvbW11bml0eS4gUHJldmlvdXMgZWRpdGlvbnMgaGF2ZSBiZWVu DQogIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQIHNpbmNlIDIwMTIgaW4gQ29wZW5o YWdlbiwgQm9zdG9uLCBHb3RoZW5idXJnLA0KICBOYXJhLCBPeGZvcmQsIFN0 IExvdWlzIGFuZCBsYXN0IHllYXIgaW4gQmVybGluLCBmb2xsb3dpbmcgT0Nh bWwNCiAgTWVldGluZ3MgaW4gUGFyaXMgaW4gMjAxMCBhbmQgMjAxMS4NCg0K DQpJbXBvcnRhbnQgTGlua3MNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiA8aHR0cHM6Ly9vY2FtbC5v cmcvbWVldGluZ3Mvb2NhbWwvMjAyMC8+DQogIOKAoiA8aHR0cHM6Ly9pY2Zw MjAuc2lncGxhbi5vcmcvaG9tZS9vY2FtbC0yMDIwPg0KICDigKIgPGh0dHBz Oi8vb2NhbWwyMDIwLmhvdGNycC5jb20vPg0KDQoNCkltcG9ydGFudCBEYXRl cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAg4oCiIFRhbGsgcHJvcG9zYWwgc3VibWlzc2lvbiBkZWFkbGlu ZTogTWF5IDh0aCwgMjAyMCwgQW9FDQogIOKAoiBBdXRob3IgTm90aWZpY2F0 aW9uOiBKdW5lIDI2dGgsIDIwMjANCiAg4oCiIE9DYW1sIFdvcmtzaG9wOiBB dWd1c3QgMjh0aCwgMjAyMA0KDQoNClNjb3BlDQrilYzilYzilYzilYzilYwN Cg0KICBQcmVzZW50YXRpb25zIGFuZCBkaXNjdXNzaW9ucyBmb2N1cyBvbiB0 aGUgT0NhbWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UNCiAgYW5kIGl0cyBjb21t dW5pdHkuIFdlIGFpbSB0byBzb2xpY2l0IHRhbGtzIG9uIGFsbCBhc3BlY3Rz IHJlbGF0ZWQgdG8NCiAgaW1wcm92aW5nIHRoZSB1c2Ugb3IgZGV2ZWxvcG1l bnQgb2YgdGhlIGxhbmd1YWdlIGFuZCBpdHMgcHJvZ3JhbW1pbmcNCiAgZW52 aXJvbm1lbnQsIGluY2x1ZGluZywgZm9yIGV4YW1wbGUgKGJ1dCBub3QgbGlt aXRlZCB0byk6DQoNCiAg4oCiIGNvbXBpbGVyIGRldmVsb3BtZW50cywgbmV3 IGJhY2tlbmRzLCBydW50aW1lIGFuZCBhcmNoaXRlY3R1cmVzDQoNCiAg4oCi IHByYWN0aWNhbCB0eXBlIHN5c3RlbSBpbXByb3ZlbWVudHMsIHN1Y2ggYXMg R0FEVHMsIGZpcnN0LWNsYXNzDQogICAgbW9kdWxlcywgZ2VuZXJpYyBwcm9n cmFtbWluZywgb3IgZGVwZW5kZW50IHR5cGVzDQoNCiAg4oCiIG5ldyBsaWJy YXJ5IG9yIGFwcGxpY2F0aW9uIHJlbGVhc2VzLCBhbmQgdGhlaXIgZGVzaWdu IHJhdGlvbmFsZXMNCg0KICDigKIgdG9vbHMgYW5kIGluZnJhc3RydWN0dXJl IHNlcnZpY2VzLCBhbmQgdGhlaXIgZW5oYW5jZW1lbnRzDQoNCiAg4oCiIHBy b21pbmVudCBpbmR1c3RyaWFsIG9yIGV4cGVyaW1lbnRhbCB1c2VzIG9mIE9D YW1sLCBvciBkZXBsb3ltZW50cw0KICAgIGluIHVudXN1YWwgc2l0dWF0aW9u cy4NCg0KDQpQcmVzZW50YXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUaGUgd29ya3Nob3AgaXMgYW4gaW5m b3JtYWwgbWVldGluZyB3aXRoIG5vIGZvcm1hbCBwcm9jZWVkaW5ncy4gVGhl DQogIHByZXNlbnRhdGlvbiBtYXRlcmlhbCB3aWxsIGJlIGF2YWlsYWJsZSBv bmxpbmUgZnJvbSB0aGUgd29ya3Nob3ANCiAgaG9tZXBhZ2UuIFRoZSBwcmVz ZW50YXRpb25zIG1heSBiZSByZWNvcmRlZCBhbmQgbWFkZSBhdmFpbGFibGUg YXQgYQ0KICBsYXRlciBkYXRlLg0KDQogIFRoZSBtYWluIHByZXNlbnRhdGlv biBmb3JtYXQgaXMgYSB3b3Jrc2hvcCB0YWxrLCB0cmFkaXRpb25hbGx5IGFy b3VuZA0KICAyMCBtaW51dGVzIGluIGxlbmd0aCwgcGx1cyBxdWVzdGlvbiB0 aW1lLCBidXQgd2UgYWxzbyBoYXZlIGEgcG9zdGVyDQogIHNlc3Npb24gZHVy aW5nIHRoZSB3b3Jrc2hvcCDigJMgdGhpcyBhbGxvd3MgdG8gcHJlc2VudCBt b3JlIGRpdmVyc2UNCiAgd29yaywgYW5kIGdpdmVzIHRpbWUgZm9yIGRpc2N1 c3Npb24uIFRoZSBwcm9ncmFtIGNvbW1pdHRlZSB3aWxsIGRlY2lkZQ0KICB3 aGljaCBwcmVzZW50YXRpb25zIHNob3VsZCBiZSBkZWxpdmVyZWQgYXMgcG9z dGVycyBvciB0YWxrcy4NCg0KDQpTdWJtaXNzaW9uDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUbyBzdWJtaXQgYSBwcmVzZW50YXRp b24sIHBsZWFzZSByZWdpc3RlciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWxr DQogIChhYm91dCAyIHBhZ2VzIGxvbmcpIGF0DQoNCiAgPGh0dHBzOi8vb2Nh bWwyMDIwLmhvdGNycC5jb20vPg0KDQogIHByb3ZpZGluZyBhIGNsZWFyIHN0 YXRlbWVudCBvZiB3aGF0IHdpbGwgYmUgcHJvdmlkZWQgYnkgdGhlDQogIHBy ZXNlbnRhdGlvbjogdGhlIHByb2JsZW1zIHRoYXQgYXJlIGFkZHJlc3NlZCwg dGhlIHNvbHV0aW9ucyBvcg0KICBtZXRob2RzIHRoYXQgYXJlIHByb3Bvc2Vk Lg0KDQogIExhVGVYLXByb2R1Y2VkIFBERnMgYXJlIGEgY29tbW9uIGFuZCB3 ZWxjb21lIHN1Ym1pc3Npb24gZm9ybWF0LiBGb3INCiAgYWNjZXNzaWJpbGl0 eSBwdXJwb3Nlcywgd2UgYXNrIFBERiBzdWJtaXR0ZXJzIHRvIGFsc28gcHJv dmlkZSB0aGUNCiAgc291cmNlcyBvZiB0aGVpciBzdWJtaXNzaW9uIGluIGEg dGV4dHVhbCBmb3JtYXQsIHN1Y2ggYXMgLnRleA0KICBzb3VyY2VzLiBSZXZp ZXdlcnMgbWF5IHJlYWQgZWl0aGVyIHRoZSBzdWJtaXR0ZWQgUERGIG9yIHRo ZSB0ZXh0DQogIHZlcnNpb24uDQoNCg0KTUwgZmFtaWx5IHdvcmtzaG9wDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBUaGUgTUwgZmFtaWx5IHdvcmtzaG9wLCBoZWxkIG9u IHRoZSBwcmV2aW91cyBkYXksIGRlYWxzIHdpdGggZ2VuZXJhbA0KICBpc3N1 ZXMgb2YgdGhlIE1MLXN0eWxlIHByb2dyYW1taW5nIGFuZCB0eXBlIHN5c3Rl bXMsIGZvY3VzZXMgb24gbW9yZQ0KICByZXNlYXJjaC1vcmllbnRlZCB3b3Jr IHRoYXQgaXMgbGVzcyBzcGVjaWZpYyB0byBhIGxhbmd1YWdlIGluDQogIHBh cnRpY3VsYXIuIFRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGUgdHdv IHdvcmtzaG9wcywgYW5kIHdlIGhhdmUNCiAgb2NjYXNpb25hbGx5IHRyYW5z ZmVycmVkIHByZXNlbnRhdGlvbnMgZnJvbSBvbmUgdG8gdGhlIG90aGVyIGlu IHRoZQ0KICBwYXN0LiBBdXRob3JzIHdobyBmZWVsIHRoZWlyIHN1Ym1pc3Np b24gZml0cyBib3RoIHdvcmtzaG9wcyBhcmUNCiAgZW5jb3VyYWdlZCB0byBt ZW50aW9uIGl0IGF0IHN1Ym1pc3Npb24gdGltZSBhbmQvb3IgY29udGFjdCB0 aGUgUHJvZ3JhbQ0KICBDaGFpcnMuDQoNCg0KUHJvZ3JhbSBDb21taXR0ZWUN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBJdmFuIEdvdG92Y2hpdHMsIENNVSwgVVNBDQog IOKAoiBGbG9yaWFuIEFuZ2VsZXR0aSwgSU5SSUEsIEZyYW5jZQ0KICDigKIg Q2hyaXMgQ2FzaW5naGlubywgRHJhcGVyIExhYm9yYXRvcnksIFVTQQ0KICDi gKIgQ2F0aGVyaW5lIEdhc25pZXIsIEZhY2Vib29rLCBVU0ENCiAg4oCiIFJ1 ZGkgR3JpbmJlcmcsIE9DYW1sIExhYnMsIFVLDQogIOKAoiBPbGVnIEtpc2Vs eW92LCBUb2hva3UgVW5pdmVyc2l0eSwgSmFwYW4NCiAg4oCiIEFuZHJlYXMg Um9zc2JlcmcsIERmaW5pdHkgU3RpZnR1bmcsIEdlcm1hbnkNCiAg4oCiIE1h cmNlbGxvIFNlcmksIFVuaXZlcnNpdHkgb2YgR3JvbmluZ2VuLCBOZXRoZXJs YW5kcw0KICDigKIgRWR3aW4gVG9yb2ssIENpdHJpeCwgVUsNCiAg4oCiIExl byBXaGl0ZSwgSmFuZSBTdHJlZXQsIFVTQQ0KICDigKIgR3JldGEgWW9yc2gs IEphbmUgU3RyZWV0LCBVU0ENCiAg4oCiIFNhcmFoIFplbm5vdSwgQWlyYnVz LCBGcmFuY2UNCg0KDQpDT1ZJRC0xOSBOb3RpY2UNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdoaWxlIElD RlAtMjAgW2lzIHN0aWxsIHNjaGVkdWxlZCB0byBiZSBoZWxkIGFzIHBsYW5u ZWRdLCBjaGFuY2VzIGFyZQ0KICBoaWdoIHRoYXQgaXQgd2lsbCBiZSB0dXJu ZWQgaW50byBhIHZpcnR1YWwgY29uZmVyZW5jZS4gV2hpY2ggbWVhbnMgYQ0K ICB3aWRlciBhdWRpZW5jZSBhbmQgcmVkdWNlZCAoaG9wZWZ1bGx5KSBmZWVz LiBXZSB3aWxsIGtlZXAgeW91IHBvc3RlZC4NCg0KDQpbaXMgc3RpbGwgc2No ZWR1bGVkIHRvIGJlIGhlbGQgYXMgcGxhbm5lZF0NCjxodHRwczovL2ljZnAy MC5zaWdwbGFuLm9yZy9ob21lL2ljZnAtMjAyMD4NCg0KDQpRdWVzdGlvbnMg YW5kIGNvbnRhY3QNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBsZWFzZSBz ZW5kIGFueSBxdWVzdGlvbnMgdG8gdGhlIGNoYWlyOiBJdmFuIEdvdG92Y2hp dHMgKGl2Z0BpZWVlLm9yZykNCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0 IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBv ciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4g U2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVd IDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFu IFNjaG1pdHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 31 to April 07,= 2020.

Making a music player in OCaml

Dracose asked

I'm interested in making my own music player in OCaml so I wanted to know whether there were any existing ones and/or examples of how to make one. Be= ar in mind, I am interested in the actual logic of how to read a music file (or a playlist) and listening to it, rather than the front-end part of a music pl= ayer. (My knowledge of OCaml is intermediate)

Thomas Blanc suggested

Yotam Barnoy then said

Wow @PatJ I didn't know about liquidsoap. I added it to ocamlverse. This is= what we have for the audio page now, in case it's helpful to the OP: https://ocamlverse.github.io/content/audio.html

gndl also replied

I experimented with several solutions in the playo project. One of the possible solutions is to use ocaml-gstreamer. If you find that the gstreamer framework is too annoying (which I can under= stand :-), you can use ocaml-ffmpeg. note = however that, in the latest version of ocaml-ffmpeg, the audio device output no longer works. To overcome this drawback, you can use ocaml-portaudio.

The end of Camlp4

Continuing this old thread, Chet Murthy announced

Perhaps worth mentioning briefly that for anybody who -wants- to continue u= sing camlp4, I'm (a) maintaining camlp5 and bringing it up-to-date with everything in ocaml 4.10.0 that I can think= of, and (b) I'd be happy to help them port their dependency over to camlp5.

This is not to be construed as an argument for using camlp4/5.

OCamlformat 0.14.0

Etienne Millon announced

On behalf of the development team, I'd like to announce the release of ocam= lformat version 0.14.0 :tada:.

Here are the main highlights of this release:

Support for OCaml 4.10

This means both that it compiles and runs using this version, but also that= it can format 4.10-specific language features (module _ and multi-indices operators).

Preliminary support for invalid files

As OCamlformat operates on ASTs, it normally requires a valid input file. T= his release adds a --format-invalid-files option to detect invalid parts and prin= t them verbatim. This feature is still experimental.

Preserving more concrete syntax

Starting with this release, OCamlformat is going to preserve more concrete = syntax. For example, module M =3D functor (K : S) -> struct end and module M (K : S) =3D struct end are equivalent. In the past, both variants would be formatted as the latter. Now, the original syntax is preserved. In some cas= es, preserving was possible through the means of an option: for example, to choice between let%name x =3D e i= n body and [%name let x =3D e in body], was controlled by the extension-sugar option. This option is now d= eprecated and OCamlformat will now always preserve what was in the source file (this was the default behaviour).

Similarly, it was possible to control how special characters are escaped in= string and character literals through the escape-strings and escape-chars options. They are= being deprecated and the only possible behavior will be preserving the concrete syntax (as done by default).

The reason for this change is that we feel that ocamlformat should be just = about formatting. The fact that this behavior was configurable is in part due to the fact that it operates on OC= aml ASTs, but end users should not have to be surprised by their code being transformed on reformatting.

In the future, we plan to extend that to other similar constructs, such as = using (~/)~ or begin~/~end, or spacing between module items.

Placement of doc comments

Placing doc comments (** ... *) is controlled by the doc= -comments configuration option. It is always possible to put them before the item they refer to, and this is what the doc-comm= ents=3Dbefore option does. The alternative doc-comments=3Dafter will try to do its best to put them after= , but in some cases it is not possible. For example, in a variant type declaration, a doc-comment put immediately after will be att= ached to the last constructor by documentation tools. Ocamlformat needs to preserve the meaning of programs,= so in these cases, it will instead put the comment before. In the case of module declarations, putting the comment after might not be ve= ry useful if the corresponding module is very large.

This requires a complex rule to determine which comments will be put before= and which comments will be put after. So in this version, we are deprecating this mechanism and replacing it with a = simpler one controlled by doc-comments-val that applies only to val<= /code> and external items. For these items, it is always possible to attach documents before or after them. For all other items, lik= e type or module declarations, the doc comments will consistenly be put before.

Many bugs found by fuzzing

We hooked ocamlformat to AFL, looking for programs that parse correctly but= trigger errors during formatting. This approach worked very well and more than 20 logical bugs were found with this technique.

Upgrading

To upgrade from ocamlformat 0.13.0, one needs to upgrade the ocamlformat bi= nary and replace the version field in .ocamlformat files by 0.14.0 and then:

  • if you used doc-comments=3Dafter, you can replace it by doc-comments-val=3Dafter. This will move doc-comments on module items except val and external ones.
  • if you used doc-comments=3Dbefore, you can remove it as it= is now the default.
  • if you set escape-chars=3Dpreserve, escape-strings= =3Dpreserve, or extension-sugar=3Dpreserve explicitly, = you can

remove them safely (they were the default)

  • if you used another value for one of these options (such as escap= e-strings=3Dhexadecimal), you will need to remove them as well. This= will not trigger a diff, but ocamlformat will not enforce a particular con= crete syntax for new code.

A note for new users

We encourage you to try ocamlformat, that can be installed from opam direct= ly (opam install ocamlformat), but please remember that it is still beta software. We added a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Etienne Millon later added

This upgrade is likely to generate a huge diff on projects that use the def= ault profile, so I would like to expand a bit on the reason.

According to the syntax rules used by the ocaml tools (the ocaml compilers, ocamldoc, odoc), it is always possible to put the doc-comment before an ite= m.

Some teams prefer to put the documentation after. But that is not always po= ssible. For example, type t =3D A | B (** doc *) will attach t= he doc-comment to B, not to t. The only way to at= tach the comment to t is by putting the comment before.

Enter ocamlformat: doc-comment placement is controlled by an option with tw= o values, before or after. before will always place the comment before. after determines if it i= s possible to put the comment after, and if it is not, will put it before.

Some items cannot have comments after, like variant types (as described abo= ve). But there is another reason not to put comments after. In some cases, that can put the comment far from the th= ing it is documenting. Considering modules, the following is nice:

module M =3D L.M
(** doc *)

But this is not great is the structure is large:

module M =3D struct
  ...
  ...
end
(** doc *)

To summarize, when ocamlformat is configured to put comments after, it has = to follow a complex heuristic to determine whether it has to fallback to before. In the case of a module, it depends o= n its shape, how many functor arguments are there, this kind of things (for various reasons, we don't know how larg= e something is going to be in advance, so we have to look at its shape). The point is that it is complicated to under= stand and explain, and that fixing it always makes it more complex. Another aspect is that in the end, we want oc= amlformat to be pretty stable when it reaches 1.0.0, and complex rules are at odds with this goal.

So, we have decided to simplify the rule: instead of looking deep in the AS= T, we just look at the kind of item this is. For val and external items, it is always poss= ible to put the doc-comment after, so we follow exactly what the configuration option says.

As a user of the default profile, what this means for you: for items that a= re not val or external, and considered "simple" by the 0.13.0 heuristic, doc-comments are going to move from after= to before.

Based on these reasons, you will understand that before is alw= ays simpler. You can opt into this by setting doc-comments-val=3Dbefore. This will cause an even larger diff= as all items are going to move before (that is: all items described just above, plus val and external= items), but the rule gets extremely simple (everything is put before). It is possible that this option will become the default in the fut= ure, but we have not decided this yet (in this case, if you did not opt into it, you will see comments on val and external items move at that time).

ML Family Workshop 2020: Call for presentations

Leo White announced

We are happy to invite submissions to the ML Family Workshop 2020, to be held during the ICFP conference week on Thursday, August 27th.

The ML family workshop warmly welcomes submission touching on the programming languages traditionally seen as part of the "ML family" (Standard ML, OCaml, F#, CakeML, SML#, Manticore, MetaOCaml, etc.). The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of the members of the ML family. We also encourage presentations from related languages (such as Haskell, Scala, Rust, Nemerle, Links, Koka, F*, Eff, ATS, etc), to exchange experience of further developing ML ideas.

Currently, the workshop is still scheduled to go ahead as planned in Jersey City, however it is likely that the ML workshop will end up being a virtual workshop this year. Either way provisions will be made to allow speakers to present their work remotely.

See our detailed CFP online on the ICFP website:

https://i= cfp20.sigplan.org/home/mlfamilyworkshop-2020

Important dates

  • Friday 15th May (any time zone): Abstract submission deadline
  • Friday 26th June: Author notification
  • Thursday 27th August: ML Family Workshop

Program committee

  • Youyou Cong (Tokyo Institute of Technology)
  • Gowtham Kaki (Purdue University)
  • Neel Krishnaswami (University of Cambridge)
  • Daan Leijen (Microsoft Research)
  • Koko Muroya (Kyoto University)
  • Atsushi Ohori (Tohoku University)
  • Jonathan Protzenko (Microsoft Research)
  • Gabriel Radanne (INRIA)
  • Claudio Russo (Dfinity)
  • Leo White (Jane Street) (Chair)
  • Jeremy Yallop (University of Cambridge)

Submission details

See the online CFP for the details on the expected submission format.

Submissions must be uploaded to the workshop submission website

https://ml2020.hotcrp.com/

before the submission deadline.

Announcing Sek, an efficient implementation of sequences

Fran=C3=A7ois Pottier announced

We are pleased to announce the first release of Sek, an OCaml library that offers an efficient implementation of sequences.

The library offers both ephemeral (mutable) sequences and persistent (immutable) sequences, and offers constant-time conversions between these flavors.

It supports all of the standard operations on stacks, queues, deques (e.g. push, pop at either end), catenable sequences (concat, split), and random access sequences (get, set).

Data is stored internally in chunks (fixed-capacity arrays), which is why this data structure is known as a chunK SEquence.

It is intended to achieve excellent time complexity and memory usage.

This is an initial release. The library has not been tested in production, but has received extensive unit testing, via afl-fuzz and ocaml+afl – which are remarkably effective tools, by the way!

This is work in progress; more features, such as iterators, will be added in the future.

To install Sek, just type

opam update && opam install sek

Documentation is online.

Feedback is welcome!

Arthur Chargu=C3=A9raud
Fran=C3=A7ois Pottier
with contributions by =C3=89milie Guermeur

Yaron Minsky asked and Fabian replied

I=E2=80=99m particularly interested in how it compares to Base.Sequence and= Seq in the OCaml distribution, but surely there are others as well.

This actually looks like an array/vector structure (supporting, among other= things, fast access to the nth element), so a comparison with CCVector, CCFun_vec, B= atVect, Clarity.Vector etc. would be more appropriate. = The name is a bit unfortunate considering the naming used in the general ecosystem.

Some time ago, I added some crude benchmarks to containers' benchsuite. I'll see if I can add Sek when I find time.

gasche said

I think it really is a sequence library in the sense that in maintains an i= n-order sequence of items, and sequences can be joined/split efficiently. It also provides logarithmic random access= , but this is probably not competitive with fixed-size arrays. It would be comparable to "persistent vector" libra= ries, ropes, finger trees, etc. The fact that the authors expose a Stack/Queue interface suggests that it has also b= een tuned to perform reasonably well in this case.

It does not provide any delayed computation of items, so in that regard it = is not comparable to Sequence/Seq.

@charguer has designed similar datastructures in the past to represent the = work-queues of concurrent workers (you want at least a fast "push" to add a= new task and, when doing work-stealing, having a fast "split" is convenien= t). See Theory and Practice of Chunked Sequences, Umut Acar, Arthu= r Chargu=C3=A9raud, Mike Rainey, 2014, and A Work-Efficient Algorithm for Par= allel Unordered Depth-First Search.

As far as I know, the OCaml implementation just released has not been teste= d/benchmarked for parallel algorithms. I would be curious to see an experiment of parallel graph traversal with this= structure and Multicore-OCaml.

Announcing dune-deps: produces a project-centric dependency gr= aph

Martin Jambon announced

I'm happy to announce the availability of dune-deps, a command-line tool that scans a dune project and gathers the dependencies into a graph. The output = is in the dot format, supported by the dot command from graphvi= z.

It shows the dependencies between the following:

  • libraries defined by the project,
  • executables defined by the project,
  • direct dependencies on external libraries.

Dependencies are extracted by parsing dune files. As an exampl= e, here's what we obtain for the = sources of opam, which has over 50K lines of code:

3D"f6213fa7fda5=

The commands for this are:

# obtain the project's sources
$ git clone --depth=3D1 https://github.com/ocaml/opam.git

# ex=
tract dependencies and eliminate superfluous graph edges
$ dune-deps opam | tred > deps.dot

# re=
nder the graph
$ dot -Tpng deps.dot -o deps.png

A suggestion is to include such graph in your project's README.md.

OCaml Users and Developers Meeting 2020

Ivan Gotovchits announced

It is my pleasure to invite submissions to the OCaml Users and Developers Workshop 2020, which is again co-located with ICFP and will be held on Friday 28th August 2020 in Jersey City, NJ, USA.

The OCaml Users and Developers Workshop brings together the OCaml community, including users of OCaml in industry, academia, hobbyists and the free software community. Previous editions have been co-located with ICFP since 2012 in Copenhagen, Boston, Gothenburg, Nara, Oxford, St Louis and last year in Berlin, following OCaml Meetings in Paris in 2010 and 2011.

Important Dates

  • Talk proposal submission deadline: May 8th, 2020, AoE
  • Author Notification: June 26th, 2020
  • OCaml Workshop: August 28th, 2020

Scope

Presentations and discussions focus on the OCaml programming language and its community. We aim to solicit talks on all aspects related to improving the use or development of the language and its programming environment, including, for example (but not limited to):

  • compiler developments, new backends, runtime and architectures
  • practical type system improvements, such as GADTs, first-class modules, generic programming, or dependent types
  • new library or application releases, and their design rationales
  • tools and infrastructure services, and their enhancements
  • prominent industrial or experimental uses of OCaml, or deployments in unusual situations.

Presentations

The workshop is an informal meeting with no formal proceedings. The presentation material will be available online from the workshop homepage. The presentations may be recorded and made available at a later date.

The main presentation format is a workshop talk, traditionally around 20 minutes in length, plus question time, but we also have a poster session during the workshop – this allows to present more diverse work, and gives time for discussion. The program committee will decide which presentations should be delivered as posters or talks.

Submission

To submit a presentation, please register a description of the talk (about 2 pages long) at

https://ocaml2020.hotcrp.com/

providing a clear statement of what will be provided by the presentation: the problems that are addressed, the solutions or methods that are proposed.

LaTeX-produced PDFs are a common and welcome submission format. For accessibility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .tex sources. Reviewers may read either the submitted PDF or the text version.

ML family workshop

The ML family workshop, held on the previous day, deals with general issues of the ML-style programming and type systems, focuses on more research-oriented work that is less specific to a language in particular. There is an overlap between the two workshops, and we have occasionally transferred presentations from one to the other in the past. Authors who feel their submission fits both workshops are encouraged to mention it at submission time and/or contact the Program Chairs.

Program Committee

  • Ivan Gotovchits, CMU, USA
  • Florian Angeletti, INRIA, France
  • Chris Casinghino, Draper Laboratory, USA
  • Catherine Gasnier, Facebook, USA
  • Rudi Grinberg, OCaml Labs, UK
  • Oleg Kiselyov, Tohoku University, Japan
  • Andreas Rossberg, Dfinity Stiftung, Germany
  • Marcello Seri, University of Groningen, Netherlands
  • Edwin Torok, Citrix, UK
  • Leo White, Jane Street, USA
  • Greta Yorsh, Jane Street, USA
  • Sarah Zennou, Airbus, France

COVID-19 Notice

While ICFP-20 is stil= l scheduled to be held as planned, chances are high that it will be turned into a virtual conference. Which means a wider audie= nce and reduced (hopefully) fees. We will keep you posted.

Questions and contact

Please send any questions to the chair: Ivan Gotovchits (ivg@ieee.org)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 584CA7F42C for ; Tue, 14 Apr 2020 09:28:15 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=+s2f=56=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3A5rVvJxx8bcwYX53XCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?0ewQIJqq85mqBkHD//Il1AaPBtqLra8cw8Pt8IneGkU4qa6bt34DdJEeHzQksu?= =?us-ascii?q?4x2zIaPcieFEfgJ+TrZSFpVO5LVVti4m3peRMNQJW2K3zUvHyp7DQWF13gMhB5?= =?us-ascii?q?Pay1QdaT3IyL0LX4/4LVKU0cgCW7SbdtKlOwoBmH8oFcipRkYO55nhDWpFNMev?= =?us-ascii?q?9K3iVpKUOXm1D7/MjmuNZo+iFU/vYg7NJoUKPgfq1+Q6YcRD8hNngd4MzwqQKF?= =?us-ascii?q?ShGF52cVVmsRglxFHlvr9hb/C771uy2yjeF93SiGIYWiRLQ9X3K55KduSQP0oD?= =?us-ascii?q?8AMy8l/WrXjM1pka8dpwiu8U8si7XIaZ2YYaItNpjWeskXEDEZB5oDZ2l6Goq5?= =?us-ascii?q?KrA3Ia8ZJ+8B/tvloF8fsRa1BQ+tHf7ijDhSiS2vhPBo46EaCQjDmTcYMZcOvX?= =?us-ascii?q?DT9o6nMbdLF/iyyLjUwD7DafJPxDq775LHIEl48KO8GIloeM+U8nEBUgbMj1Ge?= =?us-ascii?q?s4vgZmzH3OMQtWOW9KxlCfLpjHQo+Vh8?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AhAwBcZZVehyIeaIFmHAEBAQEBBwEBE?= =?us-ascii?q?QEEBAEBgXuBJYFwVTIqhByJAoV8hR+FKpEtgRADXgEDAQwYAQ4FAQIEAQGGVx0?= =?us-ascii?q?GAQUzEwIQAQEFAQEBAgECAwQBEwEBAQoLCQgphV0MgjsFAwQZC4MNASEEBmUjA?= =?us-ascii?q?xQHAwIRARcBFAoXARIagwwBgnwEAQqRYZpPgSp/M4Q4AQMDgQ+DN4FADQITfxe?= =?us-ascii?q?FJIZrJg+BTD+DI1Bsgk4OCwEBAQEBgSMdAQERgyEXgkcEjh4kAgGIf4gWkQJ7B?= =?us-ascii?q?4JFfQSGC3KJXYYSglOBBYdBjDSEXCGPMocYghqFRIplgxeBPyqBeTMaMIMsCV8?= =?us-ascii?q?NmhsXg1CEWTuFQz8zAgEBgR4BAQUTCwGLY1qBaQEB?= X-IPAS-Result: =?us-ascii?q?A0AhAwBcZZVehyIeaIFmHAEBAQEBBwEBEQEEBAEBgXuBJYF?= =?us-ascii?q?wVTIqhByJAoV8hR+FKpEtgRADXgEDAQwYAQ4FAQIEAQGGVx0GAQUzEwIQAQEFA?= =?us-ascii?q?QEBAgECAwQBEwEBAQoLCQgphV0MgjsFAwQZC4MNASEEBmUjAxQHAwIRARcBFAo?= =?us-ascii?q?XARIagwwBgnwEAQqRYZpPgSp/M4Q4AQMDgQ+DN4FADQITfxeFJIZrJg+BTD+DI?= =?us-ascii?q?1Bsgk4OCwEBAQEBgSMdAQERgyEXgkcEjh4kAgGIf4gWkQJ7B4JFfQSGC3KJXYY?= =?us-ascii?q?SglOBBYdBjDSEXCGPMocYghqFRIplgxeBPyqBeTMaMIMsCV8NmhsXg1CEWTuFQ?= =?us-ascii?q?z8zAgEBgR4BAQUTCwGLY1qBaQEB?= X-IronPort-AV: E=Sophos;i="5.72,381,1580770800"; d="scan'208,217";a="345807389" X-MGA-submission: =?us-ascii?q?MDEmKVFyW0oPtUgeaDEs1RRSgXBAjrJTUYZ7Rq?= =?us-ascii?q?nyN5bFIVodZS+5vKmdFT+NbHHz6lJC75JAAcLdfT2fCX8HALt3FxUtGq?= =?us-ascii?q?08iLISvPpOSAyez44IatpF/8I757h95R4NKbGmvj/ETLWiw0a01iVeo7?= =?us-ascii?q?Cacj1ie1UjSLWXdR6XdlN5gg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Apr 2020 09:28:13 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5E44556492E; Tue, 14 Apr 2020 09:28:11 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 14 Apr 2020 09:28:10 +0200 Message-ID: <878siy1q7p.fsf@polytechnique.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 14 09:28:11 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=D4F6E56492F X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 07 to 14, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Announcing dune-deps: produces a project-centric dependency graph OCamlformat 0.14.0 Dune 2.5.0 Old CWN Announcing dune-deps: produces a project-centric dependency graph =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Martin Jambon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Since the original announcement, I received some good feedback from users working on large projects. Thank you! The latest version released today is 1.2.0. It is already available on opam-repository (thank you @kit-ty-kate). The changes since the original release, besides bug fixes, include: =E2=80=A2 Ability to select or ignore dune files and folders to scan. For example, `dune-deps foo bar -x bar/test' uses all the dune files found in folders `foo' and `bar' but will ignore `bar/test'. This is useful for ignoring uninteresting parts of the project and for ignoring parse errors (see bug [#4]). =E2=80=A2 Executable name disambiguation. For example, private executable= s of the same name like `foo/main' and `bar/baz/main' are now rendered as `main' and `main' respectively instead of just `main'. =E2=80=A2 Optional exclusion of all executables or all external libraries= with `--no-exe' and `--no-ext'. =E2=80=A2 Ability to show only the dependencies and/or the reverse dependencies of selected libraries. See below. Whole-project graphs for large projects tend to be unreadable. To deal with that, I added support for an "hourglass view" (=E2=8C=9B) option for showing only the dependencies and reverse dependencies of a component of interest. The following is obtained with `-h opam-client' on the opam project: Please [let us know] if this works for your favorite projects! The source code of dune-deps makes it somewhat easier now to experiment with new strategies for eliminating nodes. See the `Filter' and `Filterable' modules. Check out `dune-deps --help' for detailed documentation on the options. [#4] [let us know] Sean Grove said and Martin Jambon replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 That=E2=80=99s a nice idea - it=E2=80=99d be great to have this ava= ilable as a GitHub action so anyone could do this with just a click or two! So, I made a [generic yaml workflow] that people can stick into their git/github project. This will automatically maintain the dependency graph `.deps/deps.png' which can be included in a readme. [generic yaml workflow] OCamlformat 0.14.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Etienne Millon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 As described in this thread, ocamlformat 0.14.0 introduced a new algorithm to determine how documentation comments are placed. We underestimated the impact of making this the default, and this means that many unwanted diffs were present for 0.13.0 -> 0.14.0 upgrades. We are going to prepare a 0.14.1 release next week reverting this behavior back to the 0.13.0 defaults. Users still on 0.13.0 are encouraged to wait for this and upgrade directly to 0.14.1. Sorry for the inconvenience, and thanks for the feedback! Dune 2.5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The dune team is pleased to announce the release of dune 2.5.0. This release has been brewing for a while and contains a few interesting features. I'll highlight some of the bigger ones: =E2=80=A2 The coq support has been thoroughly extended. There's now suppo= rt for both composition of coq libraries in the same workspace and extraction of coq code to OCaml. =E2=80=A2 There's a new `$ dune upgrade' subcommand to help you upgrade d= une files from 1.x to 2.x =E2=80=A2 `$ dune utop' will now load ppx preprocessors to the toplevel. = Ppx authors might enjoy this style of interactive development. =E2=80=A2 There's a new `(subdir ..)' stanza that can be used to evaluate stanzas in sub directories. This makes it possible to have a single dune file for an entire project (generated or not). I'd like to thank everyone who contributed to dune 2.5.0. Your help is greatly appreciated. Here's the full change log: 2.5.0 (09/04/2020) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 Add a `--release' option meaning the same as `-p' but without t= he package filtering. This is useful for custom `dune' invocation in opam files where we don't want `-p' (#3260, @diml) =E2=80=A2 Fix a bug introduced in 2.4.0 causing `.bc' programs to be built with `-custom' by default (#3269, fixes #3262, @diml) =E2=80=A2 Allow contexts to be defined with local switches in workspace f= iles (#3265, fix #3264, @rgrinberg) =E2=80=A2 Delay expansion errors until the rule is used to build something (#3261, fix #3252, @rgrinberg, @diml) =E2=80=A2 [coq] Support for theory dependencies and compositional builds = using new field `(theories ...)' (#2053, @ejgallego, @rgrinberg) =E2=80=A2 From now on, each version of a syntax extension must be explici= tely tied to a minimum version of the dune language. Inconsistent versions in a `dune-project' will trigger a warning for version <=3D2.4 and an error for versions >2.4 of the dune language. (#3270, fixes #2957, @voodoos) =E2=80=A2 [coq] Bump coq lang version to 0.2. New coq features presented = this release require this version of the coq lang. (#3283, @ejgallego) =E2=80=A2 Prevent installation of public executables disabled using the `enabled_if' field. Installation will now simply skip such executables instead of raising an error. (#3195, @voodoos) =E2=80=A2 `dune upgrade' will now try to upgrade projects using versions = <2.0 to version 2.0 of the dune language. (#3174, @voodoos) =E2=80=A2 Add a `top' command to integrate dune with any toplevel, not ju= st utop. It is meant to be used with the new `#use_output' directive of OCaml 4.11 (#2952, @mbernat, @diml) =E2=80=A2 Allow per-package `version' in generated `opam' files (#3287, @toots) =E2=80=A2 [coq] Introduce the `coq.extraction' stanza. It can be used to extract OCaml sources (#3299, fixes #2178, @rgrinberg) =E2=80=A2 Load ppx rewriters in dune utop and add pps field to toplevel stanza. Ppx extensions will now be usable in the toplevel (#3266, fixes #346, @stephanieyou) =E2=80=A2 Add a `(subdir ..)' stanza to allow evaluating stanzas in sub directories. (#3268, @rgrinberg) =E2=80=A2 Fix a bug preventing one from running inline tests in multiple = modes (#3352, @diml) =E2=80=A2 Allow the use of the `%{profile}' variable in the `enabled_if' = field of the library stanza. (#3344, @mrmr1993) =E2=80=A2 Allow the use of `%{ocaml_version}' variable in `enabled_if' fi= eld of the library stanza. (#3339, @voodoos) =E2=80=A2 Fix dune build freezing on MacOS when cache is enabled. (#3249, fixes ##2973, @artempyanykh) Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 07 to 14, 2020.

Announcing dune-deps: produces a project-centric dependency gr= aph

Martin Jambon announced

Since the original announcement, I received some good feedback from users w= orking on large projects. Thank you!

The latest version released today is 1.2.0. It is already available on opam= -repository (thank you @kit-ty-kate). The changes since the original release, besides bug fixes, include:

  • Ability to select or ignore dune files and folders to scan. For example= , dune-deps foo bar -x bar/test uses all the dune files found = in folders foo and bar but will ignore bar/= test. This is useful for ignoring uninteresting parts of the project= and for ignoring parse errors (see bug #4).
  • Executable name disambiguation. For example, private executables of the= same name like foo/main and bar/baz/main are now= rendered as main<foo> and main<baz> = respectively instead of just main.
  • Optional exclusion of all executables or all external libraries with --no-exe and --no-ext.
  • Ability to show only the dependencies and/or the reverse dependencies o= f selected libraries. See below.

Whole-project graphs for large projects tend to be unreadable. To deal with= that, I added support for an "hourglass view" (=E2=8C=9B) option for showing only the dependencies and reverse depe= ndencies of a component of interest.

The following is obtained with -h opam-client on the opam proj= ect:

3D"66098faac9fd=

Please let us know<= /a> if this works for your favorite projects! The source code of dune-deps makes it somewhat easier now to experiment with ne= w strategies for eliminating nodes. See the Filter and Filterable modules.

Check out dune-deps --help for detailed documentation on the o= ptions.

Sean Grove said and Martin Jambon replied

That=E2=80=99s a nice idea - it=E2=80=99d be great to have this available a= s a GitHub action so anyone could do this with just a click or two!

So, I made a generi= c yaml workflow that people can stick into their git/github project. This will automatically maintain the dependency graph <= code>.deps/deps.png which can be included in a readme.

OCamlformat 0.14.0

Etienne Millon announced

As described in this thread, ocamlformat 0.14.0 introduced a new algorithm = to determine how documentation comments are placed. We underestimated the impact of making t= his the default, and this means that many unwanted diffs were present for 0.13.0 -> 0.14.0 upgrades.

We are going to prepare a 0.14.1 release next week reverting this behavior = back to the 0.13.0 defaults. Users still on 0.13.0 are encouraged to wait for this and upgrade directly to 0.14.1.

Sorry for the inconvenience, and thanks for the feedback!

Dune 2.5.0

Rudi Grinberg announced

The dune team is pleased to announce the release of dune 2.5.0. This releas= e has been brewing for a while and contains a few interesting features. I'll highlight some of the bigger ones:

  • The coq support has been thoroughly extended. There's now support for b= oth composition of coq libraries in the same workspace and extraction of co= q code to OCaml.
  • There's a new $ dune upgrade subcommand to help you upgrad= e dune files from 1.x to 2.x
  • $ dune utop will now load ppx preprocessors to the topleve= l. Ppx authors might enjoy this style of interactive development.
  • There's a new (subdir ..) stanza that can be used to evalu= ate stanzas in sub directories. This makes it possible to have a single dun= e file for an entire project (generated or not).

I'd like to thank everyone who contributed to dune 2.5.0. Your help is grea= tly appreciated.

Here's the full change log:

2.5.0 (09/04/2020)

  • Add a --release option meaning the same as -p= but without the package filtering. This is useful for custom dune invocation i= n opam files where we don't want -p (#3260, @diml)
  • Fix a bug introduced in 2.4.0 causing .bc programs to be b= uilt with -custom by default (#3269, fixes #3262, @diml)
  • Allow contexts to be defined with local switches in workspace files (#3= 265, fix #3264, @rgrinberg)
  • Delay expansion errors until the rule is used to build something (#3261= , fix #3252, @rgrinberg, @diml)
  • [coq] Support for theory dependencies and compositional builds using new field (theories ...) (#2053, @ejgallego, @rgrinberg)
  • From now on, each version of a syntax extension must be explicitely tie= d to a minimum version of the dune language. Inconsistent versions in a dune-project will trigger a warning for version <=3D2.4 and= an error for versions >2.4 of the dune language. (#3270, fixes #2957, @voodoos)
  • [coq] Bump coq lang version to 0.2. New coq features presented this rel= ease require this version of the coq lang. (#3283, @ejgallego)
  • Prevent installation of public executables disabled using the ena= bled_if field. Installation will now simply skip such executables instead of raising an error. (#3195, @voodoos)
  • dune upgrade will now try to upgrade projects using versio= ns <2.0 to version 2.0 of the dune language. (#3174, @voodoos)
  • Add a top command to integrate dune with any toplevel, not= just utop. It is meant to be used with the new #use_output directiv= e of OCaml 4.11 (#2952, @mbernat, @diml)
  • Allow per-package version in generated opam f= iles (#3287, @toots)
  • [coq] Introduce the coq.extraction stanza. It can be used = to extract OCaml sources (#3299, fixes #2178, @rgrinberg)
  • Load ppx rewriters in dune utop and add pps field to toplevel stanza. P= px extensions will now be usable in the toplevel (#3266, fixes #346, @stephanieyou)
  • Add a (subdir ..) stanza to allow evaluating stanzas in su= b directories. (#3268, @rgrinberg)
  • Fix a bug preventing one from running inline tests in multiple modes (#3352, @diml)
  • Allow the use of the %{profile} variable in the enab= led_if field of the library stanza. (#3344, @mrmr1993)
  • Allow the use of %{ocaml_version} variable in enable= d_if field of the library stanza. (#3339, @voodoos)
  • Fix dune build freezing on MacOS when cache is enabled. (#3249, fixes #= #2973, @artempyanykh)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C1C647EEA4 for ; Tue, 21 Apr 2020 10:58:22 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=DX2w=6F=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AgS5B+BE9KCv1kXfqaQq0s51GYnF86YWxBRYc798d?= =?us-ascii?q?s5kLTJ76os+9bnLW6fgltlLVR4KTs6sC17OL9fy9EjRRqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjWwba5yIRmsogjctsYajZdmJ60s1hbHv3xEdv?= =?us-ascii?q?hMy2h1P1yThRH85smx/J5n7Stdvu8q+tBDX6vnYak2VKRUAzs6PW874s3rrgTD?= =?us-ascii?q?QhCU5nQASGUWkwFHDBbD4RrnQ5r+qCr6tu562CmHIc37SK0/VDq+46t3ThLjlS?= =?us-ascii?q?AIOSMk8GHMksx/kr5UoA6vqRx4xo7beoCVNPxjda/Zct4XQW9NU8BRWyJCBIO8?= =?us-ascii?q?cYoPD/EAPelDq4nyuUYFrBW5BQm2Gezv0SJDinv40KEm1ugsFxzN0g49ENIUqH?= =?us-ascii?q?narMv7OrocX+62w6bH0S7OYOlK1Trn8oXEbgwtrPOKULltccTR004vFwbdg1iM?= =?us-ascii?q?rYzqJTWV3fkQvWeH7+pgUOOvi3I7qwpspTWg3MMshZPPho4P0VDL6SV5wIM0Jd?= =?us-ascii?q?2kVE52esakEJxUtyCaK4t5XN8tQ2FuuCY7070GpIC0cDINyJQ9yB7ScvqKeJWG?= =?us-ascii?q?7BLkUeaeOzZ4hHR9dbKnmRmy7UmgyvHiWcms11ZKqy9FncfWunALyRPT9tCLSv?= =?us-ascii?q?xh8Ui73DaP0xrf6uZeIUA7jabbJJ8hwqIwlpoOqkvPBDP5mELzjKOOaEok4PKo?= =?us-ascii?q?5P77YrXnv5+cKpF7hhviPaQugsCwHeE4MhUUU2eF5Ou8yaXv/VblQLpQkvI2ka?= =?us-ascii?q?7ZsI7EKsQBqK65BwhV04g55xmjCDem1cwUnWMALFJeZB2HjpXmO0zVIPziEfi/?= =?us-ascii?q?hFGsnC9kx/DHIr3hAojNIWPZnLfgerZx81VcxxYyzdBc5pJUFqgNIPbtVUDrrt?= =?us-ascii?q?zYCAU1Mwuuw+boENlyy4QeVn6MAqCHKqPeq0OH5uUqI+WUY48apCv9K+I/5/Hw?= =?us-ascii?q?i385hUURfa6z3ZsYcHy4GehpLF+cYXromtcBC2AKshAiQ+ztjV2OSSZTZ22sUK?= =?us-ascii?q?I44jE7D5mmAZ3fSYCqhbyNxCm7HodMaWBDEF+ACGvne5+YVPcLbSKeOs1hnSYC?= =?us-ascii?q?Vbe/UI8hyQuuuxHkxLp7NObb5ioYtZf72NRp/OLTjws99TpoAMSdyW2CU2Z0nm?= =?us-ascii?q?YQSz8z3aB/u1Zyylid3qRigvxYEsRf5/VQUgchLpHQ1e16C9fqVgLAeNeJUlem?= =?us-ascii?q?Tc+8DTE/VNI928UBY0BgFNW4kB/D3TCmDKMSl7yOHJA07rjT32LwJ8lg1XnGz7?= =?us-ascii?q?MtgEUhQstKLWGmh7Nw9gjXB47NiUmZkLyqdasa0SXQ92mD1XKDsFxGXAN0S6nJ?= =?us-ascii?q?QGwTa0TModn3+k/OVbGjBLs/PgZDysOOMLVGZ9L3gVlcWfvuN87Sb3++lmusAx?= =?us-ascii?q?uD26mCY5Dwe2oH2SXQEEgEnB4X/XaBLQU+Ayigr3/EADx2ElLvZ0Pt8fVgp3yn?= =?us-ascii?q?Tk80yQCKb1R817Wr4BIVguacS/wL0rIFvicutSl0EU6g097ID9eMvRdtcLlTbN?= =?us-ascii?q?8n7lpLyXjVugJyM5C4KqBtnF8ecwB5v0P00BV3D51Nn9U2on030AZ/MayW31Jf?= =?us-ascii?q?ezKWxZ39O73ZJ3Hq/BCob67X2k3e38iK9acP7vQ4qkzjvBy3GUY49HVnydZV3m?= =?us-ascii?q?OG6ZXOFgUSV4j9Ul0r+Bh6orHaYzU955/P2HJ3Nqm0rznC1M43C+s+0BqgethS?= =?us-ascii?q?MayeGA/1Cc0aCNCiKPY2lFixchIEIOdS+bYoMMy8cvuG3LenPOJhnDK9kWRK+5?= =?us-ascii?q?t900KJ9ypkUOHExZcFw/eC3guGTTjwllmhstqk0bxDMHsWAWz1gXzgG4h5YrJ0?= =?us-ascii?q?O4AGFTHqa4e82dM0z9a5UGFe3FqiHE8dns6laB6WKVvn0lsUnU8epHjinSqj0x?= =?us-ascii?q?R1lSsop+yRxmiGyOPnbDIDO3VXXy9ll13tPYGwgdcKGkW1PCYzkx7wzELzweBg?= =?us-ascii?q?r6R6LnXPCRNBeyHwaXppUq6xqqaqe8lL+Y8luiVRUf2hbBadULGr8EhS6D/qA2?= =?us-ascii?q?YLnGNzTDqtoJiswE0j1DCtaU1rpX+cQvlegA/F7YWNF+ZW2isaSSJ4jzjOG1X6?= =?us-ascii?q?OMOmr4zNysXz99umXmfkbaV9NCnmyYTa73m+9TQsGRq7juy+kd3hEBEn3Gn8zd?= =?us-ascii?q?Y4DHyZ/ia5WZHi0uGBCcwie0BpAFHm7M8jRdN0lZY2j5wLn31GltOS53VVyGo?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyK?= =?us-ascii?q?oQeiQKFfIUfAoUojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGP?= =?us-ascii?q?gIlIwMUAQYDAgQNARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwI?= =?us-ascii?q?JBQEOCSaELYFADQITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABA?= =?us-ascii?q?QYLRYJcgl8Ei2mCKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4F?= =?us-ascii?q?VhUkHa4EvhUqODYE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoK?= =?us-ascii?q?GpUgSaBdTuFQz8zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IPAS-Result: =?us-ascii?q?A0BqCQCItJ5ehyIeaIFmFoNQUwWBGVUyKoQeiQKFfIUfAoU?= =?us-ascii?q?ojS+DB3mBEANQDgEDAQwYAQ4FAQIEAQGBUIIvRQIXgXkdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAgMEARMBAQEKCwkIKYUxCCQMgjsMDAMDgx0DARgBCAQGPgIlIwMUAQYDAgQ?= =?us-ascii?q?NARcBFAoXARIUBgKCP0sBgnwEAQqVBpo1GjV1fzOEOQEDAwIJBQEOCSaELYFAD?= =?us-ascii?q?QITgRaFJYMZg1UmD4FMP4ERghJQbIJBAwoOCwEBAQEBgUABAQYLRYJcgl8Ei2m?= =?us-ascii?q?CKxskApEwkgIHgkd9BIVdOXOJbYYXglaBBodJhHGMQSGPT4FVhUkHa4EvhUqOD?= =?us-ascii?q?YE/KoFHAR0MBzMaMEMNEoIWAQEBMQkJVg1WAoR+jA0BF4MoKGpUgSaBdTuFQz8?= =?us-ascii?q?zAgEBBweBEAEBBRMLAYsmgkMBAQ?= X-IronPort-AV: E=Sophos;i="5.72,409,1580770800"; d="scan'208,217";a="346515106" X-MGA-submission: =?us-ascii?q?MDFz1NCLecIov2QbFf/rwv+2m+sCBDcVEyuphg?= =?us-ascii?q?EGG+g6rIZTGGs8ZYkVeXgDFKNwfNGhYgpVXq+qJ1fm+lstmloz5OiRlL?= =?us-ascii?q?uZmrJCkdQh+Oxong5B64wiQukGqXHz1fqnxtJKBLcJz8q310So1PEuXy?= =?us-ascii?q?qQJxFHPahzfzKX03dRCpsU3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Apr 2020 10:58:20 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 415915613BD; Tue, 21 Apr 2020 10:58:16 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 21 Apr 2020 10:58:15 +0200 Message-ID: <87h7xdnrko.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 21 10:58:17 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.086842, queueID=E39BF5613BF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgQXByaWwgMTQgdG8gMjEsDQoyMDIwLg0KDQpU YWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkN1cnJlbnRfaW5jcjogYSBz bWFsbCBpbmNyZW1lbnRhbCBsaWJyYXJ5IHdpdGggbm8gZGVwZW5kZW5jaWVz DQpTY2lraXQtbGVhcm4gZm9yIE9DYW1sDQpPQ2FtbCBhbmQgb3BhbSBjb250 YWluZXIgaW1hZ2VzIHVwZGF0ZWQ6IG5ldyBGZWRvcmEvQWxwaW5lL1VidW50 dSBpbWFnZXMNCk9DYW1sZm9ybWF0IDAuMTQuMA0KSGFzaGNvbnNpbmcgYW4g QVNUIHZpYSBQUFgNCkdlbnByaW50IHYwLjQNCk90aGVyIE9DYW1sIE5ld3MN Ck9sZCBDV04NCg0KDQpDdXJyZW50X2luY3I6IGEgc21hbGwgaW5jcmVtZW50 YWwgbGlicmFyeSB3aXRoIG5vIGRlcGVuZGVuY2llcw0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Y3VycmVudC1pbmNyLWEtc21hbGwtaW5jcmVtZW50YWwtbGlicmFyeS13aXRo LW5vLWRlcGVuZGVuY2llcy81NTMxLzE+DQoNCg0KVGhvbWFzIExlb25hcmQg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgcmVjZW50IFtPQ3VycmVudCAwLjJdIHJlbGVhc2UgaW5jbHVkZWQgYSBs aXR0bGUgaW5jcmVtZW50YWwNCiAgbGlicmFyeSB3aGljaCBtaWdodCBiZSBp bnRlcmVzdGluZyB0byBzb21lIHBlb3BsZS4gSXQgaXMgdXNlZnVsIGZvcg0K ICB3cml0aW5nIHByb2dyYW1zIHRoYXQgbmVlZCB0byBrZWVwIHNvbWUgY29t cHV0YXRpb24gdXAtdG8tZGF0ZQ0KICBlZmZpY2llbnRseSBhcyB0aGUgaW5w dXRzIGNoYW5nZS4NCg0KICBJdCBpcyBzaW1pbGFyIHRvIHRoZSBleGlzdGlu ZyBbaW5jcmVtZW50YWxdIGFuZCBbcmVhY3RdIGxpYnJhcmllcw0KICBhbHJl YWR5IGluIG9wYW0uIFVubGlrZSBgaW5jcmVtZW50YWwnICh3aGljaCBwdWxs cyBpbiB0aGUgd2hvbGUgb2YNCiAgYGNvcmVfa2VybmVsJyksIGBjdXJyZW50 X2luY3InIGhhcyBubyBydW50aW1lIGRlcGVuZGVuY2llcyAoYW5kIGJ1aWxk DQogIGRlcGVuZGVuY2llcyBvbmx5IG9uIGBvY2FtbCcgYW5kIGBkdW5lJyku IFVubGlrZSBgcmVhY3QnLA0KICBgY3VycmVudF9pbmNyJyBpbW1lZGlhdGVs eSBzdG9wcyBjb21wdXRhdGlvbnMgd2hlbiB0aGV5IGFyZSBubyBsb25nZXIN CiAgbmVlZGVkIChyYXRoZXIgdGhhbiByZWx5aW5nIG9uIHdlYWsgcmVmZXJl bmNlcyBhbmQgdGhlIGdhcmJhZ2UNCiAgY29sbGVjdG9yKS4NCg0KICBJdCBp cyBhIGZhaXJseSBkaXJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtBZGFw dGl2ZSBGdW5jdGlvbmFsDQogIFByb2dyYW1taW5nXSBwYXBlciwgYW5kIG1p Z2h0IGJlIGEgZ29vZCBzdGFydGluZyBwb2ludCBmb3IgcGVvcGxlDQogIHdh bnRpbmcgdG8gbGVhcm4gYWJvdXQgdGhhdC4NCg0KICBZb3UgY2FuIGdldCB0 aGUgbGlicmFyeSB1c2luZyBgb3BhbSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIGluc3RhbGwgY3VycmVudF9pbmNyDQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIEhlcmUncyBhIHNpbXBsZSBleGFtcGxlIChpbiB1dG9w KToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICNyZXF1aXJlICJjdXJy ZW50X2luY3IiOzsNCiAg4pSCDQogIOKUgiBsZXQgdG90YWwgPSBDdXJyZW50 X2luY3IudmFyIDEwDQogIOKUgiBsZXQgY29tcGxldGUgPSBDdXJyZW50X2lu Y3IudmFyIDUNCiAg4pSCDQogIOKUgiBsZXQgc3RhdHVzID0NCiAg4pSCICAg Q3VycmVudF9pbmNyLm9mX2NjIGJlZ2luDQogIOKUgiAgICAgQ3VycmVudF9p bmNyLnJlYWQgKEN1cnJlbnRfaW5jci5vZl92YXIgdG90YWwpIEBAIGZ1bmN0 aW9uDQogIOKUgiAgICAgfCAwIC0+IEN1cnJlbnRfaW5jci53cml0ZSAiTm8g am9icyINCiAg4pSCICAgICB8IHRvdGFsIC0+DQogIOKUgiAgICAgICBDdXJy ZW50X2luY3IucmVhZCAoQ3VycmVudF9pbmNyLm9mX3ZhciBjb21wbGV0ZSkg QEAgZnVuIGNvbXBsZXRlIC0+DQogIOKUgiAgICAgICBsZXQgZnJhYyA9IGZs b2F0X29mX2ludCBjb21wbGV0ZSAvLiBmbG9hdF9vZl9pbnQgdG90YWwgaW4N CiAg4pSCICAgICAgIFByaW50Zi5zcHJpbnRmICIlZC8lZCBqb2JzIGNvbXBs ZXRlICglLjFmJSUpIg0KICDilIIgCQkgICAgIGNvbXBsZXRlIHRvdGFsICgx MDAuICouIGZyYWMpDQogIOKUgiAgICAgICB8PiBDdXJyZW50X2luY3Iud3Jp dGUNCiAg4pSCICAgZW5kDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg ZGVmaW5lcyB0d28gaW5wdXQgdmFyaWFibGVzIChgdG90YWwnIGFuZCBgY29t cGxldGUnKSBhbmQgYQ0KICAiY2hhbmdlYWJsZSBjb21wdXRhdGlvbiIgKGBz dGF0dXMnKSB3aG9zZSBvdXRwdXQgZGVwZW5kcyBvbiB0aGVtLiBBdA0KICB0 aGUgdG9wLWxldmVsLCB3ZSBjYW4gb2JzZXJ2ZSB0aGUgaW5pdGlhbCBzdGF0 ZSB1c2luZyBgb2JzZXJ2ZSc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giAjIHByaW50X2VuZGxpbmUgQEAgQ3VycmVudF9pbmNyLm9ic2VydmUgc3Rh dHVzOzsNCiAg4pSCIDUvMTAgam9icyBjb21wbGV0ZSAoNTAuMCUpDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIFVubGlrZSBhIHBsYWluIGByZWYnIGNlbGws IGEgYEN1cnJlbnRfaW5jci52YXInIGtlZXBzIHRyYWNrIG9mIHdoaWNoDQog IGNvbXB1dGF0aW9ucyBkZXBlbmQgb24gaXQuIEFmdGVyIGNoYW5naW5nIHRo ZW0sIHlvdSBtdXN0IGNhbGwNCiAgYHByb3BhZ2F0ZScgdG8gdXBkYXRlIHRo ZSByZXN1bHRzOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgIyBDdXJy ZW50X2luY3IuY2hhbmdlIHRvdGFsIDEyOzsNCiAg4pSCICMgQ3VycmVudF9p bmNyLmNoYW5nZSBjb21wbGV0ZSA0OzsNCiAg4pSCICMgcHJpbnRfZW5kbGlu ZSBAQCBDdXJyZW50X2luY3Iub2JzZXJ2ZSBzdGF0dXM7Ow0KICDilIIgNS8x MCBqb2JzIGNvbXBsZXRlICg1MC4wJSkJKCogTm90IHlldCB1cGRhdGVkICop DQogIOKUgg0KICDilIIgIyBDdXJyZW50X2luY3IucHJvcGFnYXRlICgpOw0K ICDilIIgIyBwcmludF9lbmRsaW5lIEBAIEN1cnJlbnRfaW5jci5vYnNlcnZl IHN0YXR1czs7DQogIOKUgiA0LzEyIGpvYnMgY29tcGxldGUgKDMzLjMlKQ0K ICDilJTilIDilIDilIDilIANCg0KICBDb21wdXRhdGlvbnMgY2FuIGhhdmUg c2lkZS1lZmZlY3RzLCBhbmQgeW91IGNhbiB1c2UgYG9uX3JlbGVhc2UnIHRv DQogIHJ1biBzb21lIGNvbXBlbnNhdGluZyBhY3Rpb24gaWYgdGhlIGNvbXB1 dGF0aW9uIG5lZWRzIHRvIGJlIHVuZG9uZQ0KICBsYXRlci4gSGVyZSdzIGEg ZnVuY3Rpb24gdGhhdCBwdWJsaXNoZXMgYSByZXN1bHQsIGFuZCBhbHNvIHJl Z2lzdGVycyBhDQogIGNvbXBlbnNhdGlvbiBmb3IgaXQ6DQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBsZXQgcHVibGlzaCBtc2cgPQ0KICDilIIgICBQ cmludGYucHJpbnRmICJQVUJMSVNIOiAlc1xuJSEiIG1zZzsNCiAg4pSCICAg Q3VycmVudF9pbmNyLm9uX3JlbGVhc2UgQEAgZnVuICgpIC0+DQogIOKUgiAg IFByaW50Zi5wcmludGYgIlJFVFJBQ1Q6ICVzXG4lISIgbXNnDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIEl0IGNhbiBiZSB1c2VkIGxpa2UgdGhpczoNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCICMgbGV0IGRpc3BsYXkgPSBDdXJy ZW50X2luY3IubWFwIHB1Ymxpc2ggc3RhdHVzOzsNCiAg4pSCIFBVQkxJU0g6 IDQvMTIgam9icyBjb21wbGV0ZSAoMzMuMyUpDQogIOKUgg0KICDilIIgIyBD dXJyZW50X2luY3IuY2hhbmdlIHRvdGFsIDA7DQogIOKUgiAjIEN1cnJlbnRf aW5jci5wcm9wYWdhdGUgKCkNCiAg4pSCIFJFVFJBQ1Q6IDQvMTIgam9icyBj b21wbGV0ZSAoMzMuMyUpDQogIOKUgiBQVUJMSVNIOiBObyBqb2JzDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIEEgbWFqb3IgZGlmZmVyZW5jZSBiZXR3ZWVu IHRoaXMgYW5kIHRoZSByZWFjdCBsaWJyYXJ5ICh3aGljaCBJJ3ZlIHVzZWQN CiAgaW4gcHJldmlvdXNseSBpbiBbMGluc3RhbGwncyBwcm9ncmVzcyByZXBv cnRpbmddIGFuZCBbQ3VlS2VlcGVyXSkgaXMNCiAgdGhhdCBgQ3VycmVudF9p bmNyJyBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIGdhcmJhZ2UgY29sbGVjdG9y IHRvIGRlY2lkZQ0KICB3aGVuIHRvIHN0b3AgYSBjb21wdXRhdGlvbi4gSW4g cmVhY3QsIHlvdSdkIGhhdmUgdG8gYmUgY2FyZWZ1bCB0byBtYWtlDQogIHN1 cmUgdGhhdCBgZGlzcGxheScgZGlkbid0IGdldCBHQydkIChldmVuIHRob3Vn aCB5b3UgZG9uJ3QgbmVlZCB0bw0KICByZWZlciB0byBpdCBhZ2FpbikgYmVj YXVzZSBpZiBpdCBkaWQgdGhlbiB0aGUgb3V0cHV0IHdvdWxkIHN0b3ANCiAg Z2V0dGluZyB1cGRhdGVkLiBBbHNvLCBzZXR0aW5nIGB0b3RhbCcgdG8gYDAn IGluIHJlYWN0IG1pZ2h0IGNhdXNlIHRoZQ0KICBwcm9ncmFtIHRvIGNyYXNo IHdpdGggYSBkaXZpc2lvbi1ieS16ZXJvIGV4Y2VwdGlvbiwgYmVjYXVzZSB0 aGUgYGZyYWMnDQogIGNvbXB1dGF0aW9uIHdpbGwgY29udGludWUgcnVubmlu ZyB1bnRpbCBpdCBnZXRzIEdDJ2QsIGV2ZW4gdGhvdWdoIGl0DQogIGlzbid0 IG5lZWRlZCBmb3IgYW55dGhpbmcgbm93Lg0KDQogIFtgQ3VycmVudF9pbmNy JydzIEFQSV0gaXMgcHJldHR5IHNtYWxsLiBZb3UgbWlnaHQgd2FudCB0byB3 cmFwIGl0IHRvDQogIHByb3ZpZGUgZXh0cmEgZmVhdHVyZXMsIGUuZy4NCg0K ICDigKIgVXNlIG9mIGEgYHJlc3VsdCcgdHlwZSB0byBwcm9wYWdhdGUgZXJy b3JzLg0KICDigKIgSW50ZWdyYXRpb24gd2l0aCBgTHd0JyB0byBhbGxvdyBh c3luY2hyb25vdXMgY29tcHV0YXRpb25zLg0KICDigKIgU3RhdGljIGFuYWx5 c2lzIHRvIHJlbmRlciB5b3VyIGNvbXB1dGF0aW9uIHdpdGggZ3JhcGh2aXou DQogIOKAoiBQZXJzaXN0ZW5jZSBvZiBzdGF0ZSB0byBkaXNrLg0KDQogIElm IHlvdSBuZWVkIHRoYXQsIGNvbnNpZGVyIHVzaW5nIHRoZSBtYWluIFtPQ3Vy cmVudF0gbGlicmFyeSwgd2hpY2gNCiAgZXh0ZW5kcyBgY3VycmVudF9pbmNy JyB3aXRoIHRoZXNlIGZlYXR1cmVzLg0KDQoNCltPQ3VycmVudCAwLjJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb2N1cnJlbnQvcmVsZWFzZXMv dGFnL3YwLjI+DQoNCltpbmNyZW1lbnRhbF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9qYW5lc3RyZWV0L2luY3JlbWVudGFsPg0KDQpbcmVhY3RdIDxodHRwczov L2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9yZWFjdD4NCg0KW0FkYXB0aXZlIEZ1 bmN0aW9uYWwgUHJvZ3JhbW1pbmddDQo8aHR0cHM6Ly93d3cuY3MuY211LmVk dS9+Z3V5Yi9wYXBlcnMvcG9wbDAyLnBkZj4NCg0KWzBpbnN0YWxsJ3MgcHJv Z3Jlc3MgcmVwb3J0aW5nXQ0KPGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20v cXVlc3Rpb25zLzE5OTc1MTQwL2hvdy10by1zdG9wLW9jYW1sLWdhcmJhZ2Ut Y29sbGVjdGluZy1teS1yZWFjdGl2ZS1ldmVudC1oYW5kbGVyPg0KDQpbQ3Vl S2VlcGVyXQ0KPGh0dHBzOi8vcm9zY2lkdXMuY29tL2Jsb2cvYmxvZy8yMDE1 LzA2LzIyL2N1ZWtlZXBlci1pbnRlcm5hbHMtaXJtaW4vPg0KDQpbYEN1cnJl bnRfaW5jcicncyBBUEldDQo8aHR0cHM6Ly9vY3VycmVudC5naXRodWIuaW8v b2N1cnJlbnQvY3VycmVudF9pbmNyL0N1cnJlbnRfaW5jci9pbmRleC5odG1s Pg0KDQpbT0N1cnJlbnRdIDxodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQv b2N1cnJlbnQ+DQoNCg0KU2Npa2l0LWxlYXJuIGZvciBPQ2FtbA0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9zY2lraXQtbGVhcm4tZm9yLW9jYW1sLzU1MzYvMT4N Cg0KDQpVbml4SnVua2llIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgUm9uYW4gTGVoeSBqdXN0IGhhY2tlZCB0aGlzOg0KDQogIDxodHRwczov L2dpdGh1Yi5jb20vbGVoeS9vY2FtbC1za2xlYXJuPg0KDQogIFRoaXMgbWln aHQgaW50ZXJlc3QgYSBzaWduaWZpY2FudCBudW1iZXIgb2YgcGVvcGxlIG91 dCB0aGVyZS4gIFdlIGFyZQ0KICBubyBtb3JlIGNvbmRlbW5lZCB0byBsaXZl IGluIGEgd29ybGQgZnVsbCBvZiBzbmFrZXMgdGhhdCB3aWxsIGJpdGUgdXMN CiAgYXQgcnVuLXRpbWUuIDpzbWlsZXk6DQoNCg0KUm9uYW4gTGUgSHkgdGhl biBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBTbyBJIGNhbWUgaGVy ZSB0byBhbm5vdW5jZSBvY2FtbC1za2xlYXJuIGFzIGl0IGp1c3QgZ290IHB1 Ymxpc2hlZCBvbg0KICBPcGFtLCBidXQgSSBzZWUgQFVuaXhKdW5raWUgZGlk IGl0IGZvciBtZSAoYXJpZ2F0byBnb3phaQ0KICBtYXN1KS4gQW55d2F5Og0K ICDigKIgdGhpcyBhbWJpdGlvbnMgdG8gY292ZXIgdGhlIGNvbXBsZXRlIHNj aWtpdC1sZWFybiBBUEkNCiAg4oCiIHRoaXMgYW1iaXRpb24gaXMgY3VycmVu dGx5IG5vdCB0b3RhbGx5IHJlYWxpemVkLCBidXQgSSB3YW50ZWQgdG8NCiAg ICByZWxlYXNlIHNvbWV0aGluZyBpbml0aWFsIHRoYXQgb25lIGNhbiBwbGF5 IHdpdGgNCiAg4oCiIGl0J3MgYWxsIEBVbml4SnVua2llJ3MgZmF1bHQgd2l0 aCBoaXMgZnVubnkgUiB3cmFwcGVycy4NCg0KICBTbzoNCiAg4oCiIG9wYW0g aW5zdGFsbCBza2xlYXJuDQogIOKAoiBnbyBjaGVjayBvdXQgW3NjaWtpdC1s ZWFybiBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gdG8ga25vdw0K ICAgIHdoYXQgaXQgZG9lcw0KICDigKIgbG9vayBhdCBbb2NhbWwtc2tsZWFy bidzIGRvY3VtZW50YXRpb25dIHRvIHNlZSB3aGF0IHRoZSBjdXJyZW50DQog ICAgT0NhbWwgQVBJIGxvb2tzIGxpa2UNCiAg4oCiIGhhdmUgZnVuIHdpdGgg aXQgYW5kIHRlbGwgbWUgd2hhdCB5b3UgdGhpbmsgb2YgaXQuDQoNCg0KW3Nj aWtpdC1sZWFybiBhbmQgaXRzIGF3ZXNvbWUgZG9jdW1lbnRhdGlvbl0gPGh0 dHBzOi8vc2Npa2l0LWxlYXJuLm9yZz4NCg0KW29jYW1sLXNrbGVhcm4ncyBk b2N1bWVudGF0aW9uXSA8aHR0cHM6Ly9sZWh5LmdpdGh1Yi5pby9vY2FtbC1z a2xlYXJuLz4NCg0KDQpBbnRvbiBLb2Noa292IHRoZW4gYWRkZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFByb2JhYmx5IHdvcnRoIHRv IGFkZCBoZXJlOg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1j b21tdW5pdHkvYXdlc29tZS1vY2FtbCNtYWNoaW5lLWxlYXJuaW5nPg0KDQoN Ck9DYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXMgdXBkYXRlZDogbmV3 IEZlZG9yYS9BbHBpbmUvVWJ1bnR1IGltYWdlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1hbmQtb3BhbS1jb250YWlu ZXItaW1hZ2VzLXVwZGF0ZWQtbmV3LWZlZG9yYS1hbHBpbmUtdWJ1bnR1LWlt YWdlcy81NTM5LzE+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgRG9ja2VyIFtvY2FtbCBhbmQgb3BhbSBjb250YWluZXIgaW1hZ2VzXSBo YXZlIGJlZW4gdXBkYXRlZDoNCg0KICDigKIgQWxwaW5lIDMuMTEsIEZlZG9y YSAzMSBhbmQgVWJ1bnR1IDIwLjA0IChiZXRhKSBhcmUgbm93IGluY2x1ZGVk Lg0KICDigKIgVWJ1bnR1IDE5LjA0IGFuZCBGZWRvcmEgMjkgYW5kIDMwIGFy ZSBub3cgZGVwcmVjYXRlZC4NCiAg4oCiIE9DYW1sIDQuMDkuMSBhbmQgNC4x MS4wfmRldiBoYXZlIGJlZW4gcmVmcmVzaGVkLg0KDQogIFlvdSBjYW4gZmlu ZCB0aGUgZnVsbCBkZXRhaWxzIG9mIHRoZSBjb250YWluZXIgaW1hZ2VzIGF2 YWlsYWJsZSBbb24NCiAgdGhlIE9DYW1sIGluZnJhc3RydWN0dXJlIHdpa2ld Lg0KDQogIFRoZSBjb250YWluZXJzIGFyZSBnZW5lcmF0ZWQgZnJvbSBhIHNl dCBvZiBzY3JpcHRzIHVzaW5nDQogIFtvY2FtbC1kb2NrZXJmaWxlXSwgYW5k IHdpbGwgYmUgbWlncmF0aW5nIG92ZXIgdGhlIG5leHQgc2l4IG1vbnRocyB0 bw0KICB1c2UgYW4gW29jdXJyZW50XS1iYXNlZCBpbmZyYXN0cnVjdHVyZS4g VGhlcmUgd2lsbCBiZSBhbiBhbm5vdW5jZW1lbnQNCiAgb24gdGhpcyBmb3J1 bSBhYm91dCBhbnkgdXNlci1mYWNpbmcgY2hhbmdlcyB0aGF0IGludm9sdmVz LCB3aXRoIHBsZW50eQ0KICBvZiB0aW1lIHRvIHRyYW5zaXRpb24geW91ciBv d24gQ0lzIG92ZXIuICBUaGFua3MgZ28gdG8gQHRhbGV4NSBhbmQNCiAgQFhW aWxrYSBmb3IgY29udHJpYnV0aW9ucyB0byB0aGlzIHJvdW5kIG9mIHVwZGF0 ZXMuDQoNCg0KW29jYW1sIGFuZCBvcGFtIGNvbnRhaW5lciBpbWFnZXNdIDxo dHRwczovL2h1Yi5kb2NrZXIuY29tL3Ivb2NhbWwvb3BhbTI+DQoNCltvbiB0 aGUgT0NhbWwgaW5mcmFzdHJ1Y3R1cmUgd2lraV0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvaW5mcmFzdHJ1Y3R1cmUvd2lraS9Db250YWluZXJzPg0K DQpbb2NhbWwtZG9ja2VyZmlsZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hdnNt L29jYW1sLWRvY2tlcmZpbGU+DQoNCltvY3VycmVudF0gPGh0dHBzOi8vb2N1 cnJlbnQub3JnPg0KDQoNCk9DYW1sZm9ybWF0IDAuMTQuMA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0MzUvMjQ+DQoNCg0KSnVsZXMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBBcyBFdGllbm5lIG1lbnRpb25lZCwgd2UgaGF2ZSBy ZWxlYXNlZCBPQ2FtbGZvcm1hdCAwLjE0LjEsIHJldmVydGluZw0KICB0aGUg Y2hhbmdlIHRvIHRoZSBkZWZhdWx0cyBhbmQgb3VyIHBsYW5zIHRvIGRlcHJl Y2F0ZSB0aGUNCiAgYGRvYy1jb21tZW50cycgb3B0aW9uLg0KDQogIEZvciBw cm9qZWN0cyB0aGF0IGFscmVhZHkgdXBncmFkZWQgdG8gMC4xNC4wIChlZy4g Q29xKSwgdGhlDQogIGBkb2MtY29tbWVudHMnIG9wdGlvbiB3aWxsIGNoYW5n ZSBpdHMgbWVhbmluZyBhZ2Fpbi4gSXQgaXMgbmVjZXNzYXJ5DQogIHRvIGFk ZCBgZG9jLWNvbW1lbnRzPWJlZm9yZScgdG8gaGF2ZSB0aGUgZG9jdW1lbnRh dGlvbiBjb21tZW50cyBwbGFjZWQNCiAgYmVmb3JlLiAgTW9yZW92ZXIsIHRo ZSBuZXcgb3B0aW9uIGBkb2MtY29tbWVudHMtdmFsJyBhZGRlZCBpbiAwLjE0 LjANCiAgaGFzIGEgaGlnaGVyIHByZWNlZGVuY2UgdGhhbiBgZG9jLWNvbW1l bnRzJywgZXZlbiB3aGVuIGl0J3Mgbm90DQogIHNldC4gSXQgaXMgdGh1cyBu ZWNlc3NhcnkgdG8gc2V0IHRoZW0gYm90aCB0byBgYmVmb3JlJyB0byBoYXZl IHRoZSBvbGQNCiAgImJlZm9yZSIgYmVoYXZpb3IuICBUaGlzIHdpbGwgYmUg aW1wcm92ZWQgaW4gdGhlIG5leHQgcmVsZWFzZSAoc2VlDQogIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMTM0MD4p Lg0KDQogIFRoYW5rIHlvdSB0byBvdXIgZWFybHkgYWRvcHRlcnMgdG8gYmVh ciB1cy4gV2UgYXJlIGltcHJvdmluZyBvdXINCiAgcmVsZWFzZSBwcm9jZXNz IHRvIHJlZHVjZSBjb25mdXNpb24gZm9yIHRoZSBuZXh0IHVwZGF0ZXMuIEFz IHVzdWFsLCBpZg0KICB5b3UgaGF2ZSBhbnkgZmVlZGJhY2ssIHBsZWFzZSBv cGVuIGFuIGlzc3VlIG9uDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt cHB4L29jYW1sZm9ybWF0PiB0byBkaXNjdXNzIGl0IHdpdGggdXMuDQoNCg0K SGFzaGNvbnNpbmcgYW4gQVNUIHZpYSBQUFgNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvaGFzaGNvbnNpbmctYW4tYXN0LXZpYS1wcHgv NTU1OC8xPg0KDQoNCkNoZXQgTXVydGh5IGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgW3VwLWZyb250IChzbyBub2JvZHkgZ2V0cyB0aGUg d3JvbmcgaWRlYSk6IEknbSBub3QgcHVzaGluZyBDYW1scDUuDQogIFJhdGhl ciwgSSdtIGp1c3Qgbm90aW5nIHRoYXQgdGhpcyBzb3J0IG9mIHRoaW5nIGlz IHJlYWxseSBlYXN5IHRvIGRvLA0KICBhbmQgSSBlbmNvdXJhZ2Ugc29tZW9u ZSB0byBkbyBzb21ldGhpbmcgc2ltaWxhciB1c2luZyB0aGUgUFBYDQogIGlu ZnJhc3RydWN0dXJlLl0NCg0KICBJIGRpZG4ndCB3YW50IHRvIGRlcmFpbCB0 aGUgIkZ1dHVyZSBvZiBQUFgiIHRocmVhZCwgc28gSSB0aG91Z2h0IEknZA0K ICBwb3N0IHNlcGFyYXRlbHkgdG8gYW5zd2VyIGl2Z0AgJ3MgaXNzdWUgYWJv dXQgaGFzaGNvbnNpbmcgb2YgQVNUcw0KICB1c2luZyBQUFguICBJdCdzIGFj dHVhbGx5IFt1aCwgSSB0aGlua10gcmVhbGx5LCByZWFsbHkgZWFzeSB0bw0K ICBpbXBsZW1lbnQgaGFzaGNvbnNpbmcgb2YgQURUcywgdXNpbmcgYSBQUFgg ZXh0ZW5zaW9uLiAgT24gYSBsYXJrLCBJDQogIGRlY2lkZWQgdG8gZG8gaXQg KnRvZGF5KiwgYW5kIHdoaWxlIHRoZSBjb2RlIEkndmUgZ290IGlzbid0IHN1 ZmZpY2llbnQNCiAgdG8gdXNlLCBJIHRoaW5rIGl0J3Mgbm90IHZlcnkgZmFy IGF3YXksIGFuZCBJIGhhdmUgdGhlIHBlcmZlY3QNCiAgdXNlLWNhc2UgYWxy ZWFkeSBpbi1taW5kLiAgSXQgdG9vayBtZSB0d28gaG91cnMgdG8gaW1wbGVt ZW50IHRoZQ0KICByZXdyaXRlciBhbmQgdGhlIHRlc3RjYXNlLCBvbiB0b3Ag b2YgdGhlIG90aGVyIGluZnJhc3RydWN0dXJlLCB3aGljaA0KICBoYXMgbm8g c3VwcG9ydCBmb3IgaGFzaGNvbnNpbmcgb2YgYW55IHNvcnQuDQoNCiAgSGVy ZSBhcmUgc29tZSBleGFtcGxlcyBvZiBkYXRhLXR5cGVzIGFuZCBmdW5jdGlv bnMgdGhhdCBhcmUNCiAgYXV0b21hdGljYWx5IGhhc2gtY29uc2VkLiAgVGhl IGlkZWEgaXMgdGhhdCBpbiB0aGUgcGF0dGVybi1tYXRjaCB0aGUNCiAgcGF0 dGVybiBpcyBhbm5vdGF0ZWQgd2l0aCBhIHZhcmlhYmxlIChpbiB0aGlzIGV4 YW1wbGUsICJ6Iik7IHRoZQ0KICBleHByZXNzaW9uIHRoYXQgaXMgc3VwcG9z ZWQgdG8gYmUgaGFzaC1jb25zZWQgYWdhaW5zdCB0aGF0IHBhdHRlcm4gaXMN CiAgYW5ub3RhdGVkIHdpdGggdGhhdCBzYW1lIHZhcmlhYmxlLiAgW1RoZSBj b2RlIHRoYXQgZGVzY2VuZHMgdG8gdGhlDQogIGV4cHJlc3Npb24gaXMgYSBs aXR0bGUgd2VhayByaWdodCBub3csIGJ1dCBJIHRoaW5rIHRoYXQncyBlYXNp bHkNCiAgZml4YWJsZS5dICBUaGUgYWxnb3JpdGhtIGdvZXMgYXMgZm9sbG93 czoNCg0KICAoMSkgImRlY29yYXRlIiB0aGUgcGF0dGVybiB3aXRoICJhcyB6 XzxpbnRlZ2VyPiIgdmFyaWFibGVzIGV2ZXJ5d2hlcmUNCiAgaW4gY29uc3Ry dWN0b3JzLiAgVGhpcyBhbGxvd3MgdXMgdG8gcmVmZXIgdG8gcGFydHMgb2Yg dGhlIG9yaWdpbmFsDQogIHZhbHVlLg0KDQogICgyKSB0aGVuIGZpbmQgZWFj aCBleHByZXNzaW9uIHRoYXQgaXMgbWFya2VkIHdpdGggdGhhdCBzYW1lIHZh cmFibGUuDQogIFN0cnVjdHVyYWxseSBkZXNjZW5kIHRoZSBwYXR0ZXJuIGFu ZCB0aGUgZXhwcmVzc2lvbiBpbiBwYXJhbGxlbCBhbmQNCiAgZ2VuZXJhdGUg Y29kZSB0byBjb21wYXJlIHN1Yi1zdHJ1Y3R1cmUgYW5kIGhhc2hjb25zIHdo ZXJlIGFwcHJvcHJpYXRlLg0KDQogIEFuZCB0aGF0J3MgcmVhbGx5IGl0LiAg SSdtIHN1cmUgdGhpcyBjYW4gYmUgaW1wbGVtZW50ZWQgdXNpbmcgdGhlIFBQ WA0KICB0b29scy4NCg0KICBTb21lIGNvbW1lbnRzOiAoMSkgd2hhdCdzIG5p Y2UsIGlzIHRoYXQgd2UgY2FuIGp1c3QgdGFrZQ0KICBhbHJlYWR5LXdyaXR0 ZW4gY29kZSBsaWtlIGBMaXN0Lm1hcCcgYW5kIGFubm90YXRlIGl0OyB0aGF0 IGdlbmVyYXRlcyBhDQogIGhhc2gtY29uc2VkIHZlcnNpb24uICBBbmQgc2lu Y2UgdGhlIGdlbmVyYXRlZCBjb2RlIG5ldmVyIHVzZXMgZGVlcA0KICBzdHJ1 Y3R1cmFsIGVxdWFsaXR5IChvbmx5IHBvaW50ZXItZXF1YWxpdHkpIGl0IHNo b3VsZCBiZSBvbmx5DQogIG1hcmdpbmFsbHkgc2xvd2VyIHRoYW4gdGhlIG9y aWdpbmFsIGltcGxlbWVudGF0aW9uLg0KDQogICgyKSBUaGUgdmFyaWFibGUg aW4gdGhlIGFubm90YXRpb24gKCJ6IikgaXMgdXNlZCBhcyB0aGUgYmFzZSBm b3INCiAgZ2VuZXJhdGluZyBhIHdob2xlIHNsZXcgb2YgZnJlc2ggdmFyaWFi bGVzLCBhbmQgSSBkb24ndCBib3RoZXIgKHlldCkNCiAgdG8gY2hlY2sgZm9y IGNsYXNoZXM7IHRoaXMgKGFnYWluKSBpcyBzdHJhaWdodGZvcndhcmQsIGJ1 dCBoZXksIEkNCiAgc3RhcnRlZCB0d28gaG91cnMgYWdvLg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdHlwZSB0ID0gTGVhZiBvZiBpbnQgfCBOb2Rl IG9mIHQgKiBpbnQgKiB0DQogIOKUgg0KICDilIIgbW9kdWxlIEhDTGlzdCA9 IHN0cnVjdA0KICDilIINCiAg4pSCIGxldCByZWMgbWFwIGYgPSBmdW5jdGlv bg0KICDilIIgICAgIFtdW0BoYXNocmVjb25zIHpdIC0+IFtdW0BoYXNocmVj b25zIHpdDQogIOKUgiAgIHwgKGE6OmwpW0BoYXNocmVjb25zIHpdIC0+IGxl dCByID0gZiBhIGluICgociA6OiBtYXAgZiBsKVtAaGFzaHJlY29ucyB6XSkN CiAg4pSCDQogIOKUgiBlbmQNCiAg4pSCDQogIOKUgiBsZXQgZGVlcCA9DQog IOKUgiBsZXQgcmVjIGRlZXAgPSAoZnVuY3Rpb24NCiAg4pSCICAgTGVhZiBu W0BoYXNocmVjb25zIHpdIC0+IExlYWYgbltAaGFzaHJlY29ucyB6XQ0KICDi lIIgfCBOb2RlIChsLCBuLCByKSBbQGhhc2hyZWNvbnMgel0gLT4NCiAg4pSC ICAgTm9kZSAoZGVlcCBsLCBuLCBkZWVwIHIpIFtAaGFzaHJlY29ucyB6XQ0K ICDilIIgICApDQogIOKUgiBbQEBvY2FtbC53YXJuaW5nICItMjYiXQ0KICDi lIIgaW4gZGVlcA0KICDilIINCiAg4pSCIHR5cGUgc2V4cCA9DQogIOKUgiAg IHwgQXRvbSBvZiBzdHJpbmcNCiAg4pSCICAgfCBMaXN0IG9mIHNleHAgbGlz dA0KICDilIINCiAg4pSCIGxldCBzZXhwX2RlZXAgPQ0KICDilIIgICBsZXQg cmVjIGRlZXAgPSBmdW5jdGlvbg0KICDilIIgICAgICAgQXRvbSBzW0BoYXNo cmVjb25zIHpdIC0+IEF0b20gc1tAaGFzaHJlY29ucyB6XQ0KICDilIIgICAg IHwgTGlzdCBsW0BoYXNocmVjb25zIHpdIC0+IExpc3QgKEhDTGlzdC5tYXAg ZGVlcCBsKVtAaGFzaHJlY29ucyB6XQ0KICDilIIgICBpbiBkZWVwDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIExpbmtzOiBGaXJzdCwgYXQgdGhlIGNvbW1p dCwgc28gdGhleSB3b24ndCBjaGFuZ2UNCg0KICB0aGUgdGVzdGNhc2UgZmls ZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9jaGV0bXVydGh5L3BhX3BweC9j b21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBhZDY5NjA3NDIwMDEwMWJkNjYx ZiNkaWZmLWU2ZGZmZTc4ZmM2YzI3YmRmZmE0MTk3MGM0YTdmMWNhPg0KDQog IHRoZSAicHB4IHJld3JpdGVyIjoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9j aGV0bXVydGh5L3BhX3BweC9jb21taXQvNWRkNmIyZWYzY2EzNjc3ZTExYTBh ZDY5NjA3NDIwMDEwMWJkNjYxZiNkaWZmLTI0YWVhZjUxMzY2MDE3OTQ4ZjU3 MzU3MjdmMDAxYzg1Pg0KDQogIFNlY29uZCwgdGhlIGZpbGVzIHdpdGggaHVt YW4tcmVhZGFibGUgbmFtZXMsIGV0Yy46DQoNCiAgdGhlIHRlc3RjYXNlOg0K ICA8aHR0cHM6Ly9naXRodWIuY29tL2NoZXRtdXJ0aHkvcGFfcHB4L2Jsb2Iv bWFzdGVyL3Rlc3RzL3Rlc3RfaGFzaHJlY29ucy5tbD4NCg0KICB0aGUgInBw eCByZXdyaXRlciI6DQogIDxodHRwczovL2dpdGh1Yi5jb20vY2hldG11cnRo eS9wYV9wcHgvYmxvYi9tYXN0ZXIvcGFfaGFzaHJlY29ucy9wYV9oYXNocmVj b25zLm1sPg0KDQogIFRoZSBwcm9qZWN0czoNCg0KICBjaGV0bXVydGh5L3Bh X3BweDogQSByZWltcGxlbWVudGF0aW9uIG9mIHBweF9kZXJpdmluZywgYWxs IGl0cw0KICBwbHVnaW5zLCBwcHhfaW1wb3J0LCBhbmQgYSBmZXcgb3RoZXJz Lg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vY2hldG11cnRoeS9wYV9wcHg+ DQoNCiAgY2hldG11cnRoeS9jYW1scDU6IENhbWxwNSwgdmVyc2lvbiBwcmUt OC4wMCBvbiB3aGljaCB0aGUgYWJvdmUgaXMNCiAgYmFzZWQuICBUaGlzIGlz IG9uIHRoZSBicmFuY2ggMjYuYXR0ZW1wdC1wYS1kZXJpdmluZyAuDQoNCg0K S2FrYWR1IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEkgZXhwZXJpbWVudGVkIHdpdGggdGhpcyBzb21lIHRpbWUgYWdv IGZvciBNTCB3b3Jrc2hvcC4gIFRoZSBpZGVhIHdhcw0KICB0byBwcm92aWRl IGZ1bmN0aW9uOiBgdCAtPiBodGJsIC0+IGh0YmwgKiB0JyB3aGljaCByZXdy aXRlcyB2YWx1ZSBvZg0KICB0eXBlIGB0JyBieSByZW1vdmluZyBlcXVhbCBz dWJ0cmVlcy4gRXNzZW50aWFsbHkgaXQgaXMganVzdCBhIGZvbGQNCiAgb3Zl ciBkYXRhIHR5cGUuDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9rYWthZHUv R1QvYmxvYi9tYXN0ZXIvcmVncmVzc2lvbi90ZXN0ODE2aGFzaC5tbCNMNzQ+ DQoNCg0KQ2hldCBNdXJ0aHkgYXNrZWQgYW5kIEpvc2ggQmVyZGluZSByZXBs aWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICAgICAgICBJZiB5b3Ugd2FubmEgdXNlIGEgaGFzaHRhYmxlIChhbmQsIEkg cHJlc3VtZSwgT2JqLm1hZ2ljKQ0KICAgICAgICB5b3UgY2FuIHdyaXRlIGEg c2luZ2xlIGZ1bmN0aW9uIHRoYXQgZG9lcyB0aGUgdHJpY2sgZm9yDQogICAg ICAgIGFsbCBpbW11dGFibGUgZGF0YS10eXBlcywgcmlnaHQ/DQoNCiAgWWVz LCB3ZSBoYXZlIHNvbWUgbWFnaWMgQG1ib3Vheml6IFtjb2RlXSBpbiBJbmZl ciB0aGF0IGRvZXMgdGhpcyB0bw0KICBjcmVhdGUgYXMgbXVjaCBzaGFyaW5n IGFzIHBvc3NpYmxlIGFzIHZhbHVlcyBhcmUgTWFyc2hhbGVkIG91dC4NCg0K DQpbY29kZV0NCjxodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svaW5mZXIv YmxvYi9tYXN0ZXIvaW5mZXIvc3JjL2lzdGQvTWF4aW11bVNoYXJpbmcubWw+ DQoNCg0KR2VucHJpbnQgdjAuNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZ2VucHJpbnQtdjAtNC81NTc1LzE+DQoNCg0K cHJvZ21hbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgcmUtYW5ub3VuY2Vt ZW50IG9mIEdlbnByaW50LCBhIGdlbmVyYWwgdmFsdWUgcHJpbnRpbmcgbGli cmFyeSwgdGhhdA0KICBhZGRyZXNzZXMgcHJpb3IgbGltaXRhdGlvbnMgdGhh dCBtYWRlIGl0IG5vbmUgdG9vIHVzZWZ1bCENCg0KICAxLiBJdCBkaWRuJ3Qg d29yayBjb3JyZWN0bHkgZm9yIDQuMDguMCwgdGhlIGxhdGVzdCBjb21waWxl ciByZWxlYXNlIGFzDQogICAgIG9mIGZpcnN0IGFubm91bmNlbWVudCAodGhv dWdoIGZpbmUgZm9yIDQuMDIgLi4gNC4wNy4xKQ0KICAyLiBUaGVyZSB3YXMg YW4gYXdrd2FyZCBuZWVkIHRvIHNwZWNpZnkgYSBzZWFyY2ggcGF0aCBmb3Ig LmNtdCBmaWxlcw0KICAgICB3aGVuIHdvcmtpbmcgd2l0aCB0aGUgbGlrZXMg b2YgRHVuZSAod2hpY2ggdXNlcyBzZXBhcmF0ZQ0KICAgICBkaXJlY3Rvcmll cyBmb3Igc291cmNlLCAuY21pIGFuZCAoZm9yIG9wdCkgLmNtdCBmaWxlcykN CiAgMy4gTW9yZSBvZnRlbiB0aGFuIG5vdCB2YWx1ZXMgb2YgaW50ZXJlc3Qg d291bGQgZGlzcGxheSBzaW1wbHkgYXMNCiAgICAgYDxhYnN0cj4nIG93aW5n IHRvIHRoZSBwcmVzZW5jZSBvZiBzaWduYXR1cmUgYWJzdHJhY3Rpb24gb2Yg dGhlDQogICAgIG1vZHVsZSdzIHR5cGUgb2YgaW50ZXJlc3QuDQoNCiAgVGhl c2UgaXNzdWVzIGhhdmUgYmVlbiBhZGRyZXNzZWQ6DQogIDEuIFdvcmtzIHdp dGggdmVyc2lvbnMgNC4wNCAuLiA0LjEwLjAgKGVhcmxpZXIgdmVyc2lvbnMg YmVjYW1lIGludmFsaWQNCiAgICAgYWZ0ZXIgYSBkZXBlbmRlbmN5IGNoYW5n ZSB0byBwcHhsaWIpDQogIDIuIFRoZSBsb2NhdGlvbiBvZiAuY210IGZpbGVz IGlzIGNhcHR1cmVkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIFBQWA0KICAgICBw cmVwcm9jZXNzb3IuDQogIDMuIFNpZ25hdHVyZXMgYXQgdGhlIGltcGxlbWVu dGF0aW9uIGxldmVsICgubWxpIGZpbGVzKSBhbmQgaW50ZXJuYWxseQ0KICAg ICAoZnVuY3RvciBhcHBsaWNhdGlvbiBjb25zdHJhaW50cykgYXJlIHJlbW92 ZWQgdG8gcmV2ZWFsIHRoZSBpbm5lcg0KICAgICBzdHJ1Y3R1cmUgb2Ygb3Ro ZXJ3aXNlIGFic3RyYWN0IHZhbHVlcy4gIEZvciBpbnN0YW5jZSwgdGhlDQog ICAgIEVwaGVtZXJvbiBtb2R1bGU6DQogICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgICDilIIgbW9kdWxlIEVNPUVwaGVtZXJvbi5LMS5NYWtlKHN0cnVjdCB0 eXBlIHQ9aW50IGxldCBlcXVhbD0oPSkgbGV0IGhhc2g9SGFzaHRibC5oYXNo IGVuZCkNCiAgICAg4pSCIG9wZW4gRU0NCiAgICAg4pSCIGxldCBfPQ0KICAg ICDilIIgICBsZXQgdj1FTS5jcmVhdGUgMCBpbg0KICAgICDilIIgICBFTS5h ZGQgdiAxMjM0NTY3OCAnWCc7DQogICAgIOKUgiAgIGxldCBlbXByaW50IHBw ZiAodjogT2JqLkVwaGVtZXJvbi50KSA9DQogICAgIOKUgiAgICAgRm9ybWF0 LmZwcmludGYgcHBmICI8QyB3cmFwcGVyIG9mIGtleS9kYXRhPiIgaW4NCiAg ICAg4pSCICAgWyVpbnN0YWxsX3ByaW50ZXIgZW1wcmludF07DQogICAgIOKU giAgIFslcHIgZXBoZW0gdl07DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KDQog ICAgIFdoaWNoIHByaW50czoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAg IOKUgiBlcGhlbSA9PiB7c2l6ZSA9IDE7DQogICAgIOKUgiAgICAgICAgICAg ZGF0YSA9DQogICAgIOKUgiAgICAgICAgICAgIFt8RW1wdHk7IEVtcHR5OyBF bXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0eTsgRW1wdHk7IEVtcHR5OyBFbXB0 eTsNCiAgICAg4pSCICAgICAgICAgICAgICBFbXB0eTsgRW1wdHk7IENvbnMg KDkyMjM4MTkxNSwgPEMgd3JhcHBlciBvZiBrZXkvZGF0YT4sIEVtcHR5KTsN CiAgICAg4pSCICAgICAgICAgICAgICBFbXB0eTsgRW1wdHk7IEVtcHR5OyBF bXB0eXxdOw0KICAgICDilIIgICAgICAgICAgIHNlZWQgPSAwOyBpbml0aWFs X3NpemUgPSAxNn0NCiAgICAg4pSU4pSA4pSA4pSA4pSADQogICAgIFRoaXMg YWxzbyBkZW1vcyB0aGUgWyVpbnN0YWxsX3ByaW50ZXJdIGZhY2lsaXR5IHdo aWNoIG1pcnJvcnMgdGhlDQogICAgIFJFUEwncy4NCg0KICBJbnN0YWxsYXRp b24gaXMgdmlhIHRoZSBPcGFtIG1haW4gcmVwb3NpdG9yeS4NCg0KICBBZGRp dGlvbmFsbHksIHRoZSBwcm9qZWN0IHJlcG9zaXRvcnkgW2NvbnRhaW5zXSB0 d28gY29tcGlsZXIgdmVyc2lvbnMNCiAgb2YgX29jYW1sZGVidWdfIGludGVn cmF0ZWQgd2l0aCB0aGUgR2VucHJpbnQgbGlicmFyeSB3aGljaCB0aGVyZWJ5 DQogIGJlY29tZXMgaXRzIGRlZmF1bHQgcHJpbnRlci4NCg0KICBBbGwgb2Yg d2hpY2ggbWFrZXMgdGhpcyBsaWJyYXJ5IG11Y2ggbW9yZSB1c2VmdWwgdGhh biBwcmV2aW91c2x5LiAgU2VlDQogIHRoZSBbcHJvamVjdCBwYWdlXSBmb3Ig dGhlIGRldGFpbHMuDQoNCg0KW2NvbnRhaW5zXQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9wcm9nbWFuMS9nZW5wcmludGxpYi90cmVlL21hc3Rlci9kZWJ1Z2dl cj4NCg0KW3Byb2plY3QgcGFnZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9wcm9n bWFuMS9nZW5wcmludGxpYj4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBFZGl0 b3Igbm90ZTogVGhhbmtzIHRvIFtlemN1cmxdLCBJIGNhbiByZXN0b3JlIHRo aXMgc2VjdGlvbi4gSSdtDQogIHB1dHRpbmcgYWxsIHRoZSBsaW5rcyB0aGlz IHdlZWssIEkgd2lsbCBwcnVuZSB0byBvbmx5IHB1dCB0aGUgbmV3IG9uZXMN CiAgbmV4dCB3ZWVrLg0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBP Q2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQog IOKAoiBbQW4gaW4tZGVwdGggTG9vayBhdCBPQ2FtbOKAmXMgbmV3IOKAnEJl c3QtZml04oCdIEdhcmJhZ2UgQ29sbGVjdG9yDQogICAgU3RyYXRlZ3ldDQog IOKAoiBbU2xpZGluZyBUaWxlIFB1enpsZSwgU2VsZi1Db250YWluZWQgT0Nh bWwgV2ViYXBwXQ0KICDigKIgW05ldyB2ZXJzaW9uIG9mIFRyeSBPQ2FtbCBp biBiZXRhIV0NCiAg4oCiIFtGcmFtYS1DbGFuZyAwLjAuOCBpcyBvdXQuIERv d25sb2FkIGl0IGhlcmUuXQ0KICDigKIgW0EgcmVhc29uYWJsZSBUeVhNTCBy ZWxlYXNlIHwgRHJ1cCdzIHRoaW5naWVzXQ0KICDigKIgW0FsdC1FcmdvIFVz ZXJz4oCZIENsdWIgQW5udWFsIE1lZXRpbmddDQogIOKAoiBbT0NhbWwgaU9T IEFwcHMgUG9ydGVkIHRvIEJyb3dzZXJdDQogIOKAoiBbV2F0Y2ggYWxsIG9m IEphbmUgU3RyZWV0J3MgdGVjaCB0YWxrc10NCiAg4oCiIFtNZXJjdXJpYWw6 IHByZXR0eWNvbmZpZyBleHRlbnNpb25dDQogIOKAoiBbTWVyY3VyaWFsIGV4 dGVuc2lvbnMgKHVwZGF0ZSldDQogIOKAoiBbMjAxOSBhdCBPQ2FtbFByb10N CiAg4oCiIFtCaXRidWNrZXQgcmVwb3NpdG9yeSBtaWdyYXRpb25dDQogIOKA oiBbVHJvdWJsZXNob290aW5nIHN5c3RlbWQgd2l0aCBTeXN0ZW1UYXBdDQog IOKAoiBbT2NzaWdlbiBTdGFydCB1cGRhdGVkXQ0KICDigKIgW09jc2lnZW4g U3RhcnQgdXBkYXRlZF0NCiAg4oCiIFtvcGFtIDIuMC42IHJlbGVhc2VdDQog IOKAoiBbb3BhbSAyLjAuNiByZWxlYXNlXQ0KICDigKIgW0hhY2tlcnMgYW5k IGNsaW1hdGUgYWN0aXZpc3RzIGpvaW4gZm9yY2VzIGluIExlaXB6aWddDQog IOKAoiBbRGVwbG95aW5nIGF1dGhvcml0YXRpdmUgT0NhbWwtRE5TIHNlcnZl cnMgYXMgTWlyYWdlT1MgdW5pa2VybmVsc10NCiAg4oCiIFtSZXByb2R1Y2li bGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCiAg4oCiIFtVc2luZyBQ eXRob24gYW5kIE9DYW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJvb2td DQogIOKAoiBbQ29xIDguMTErYmV0YTEgaXMgb3V0XQ0KICDigKIgW0RlZXAt TGVhcm5pbmcgdGhlIEhhcmRlc3QgR28gUHJvYmxlbSBpbiB0aGUgV29ybGRd DQogIOKAoiBbRnJhbWEtQyAyMC4wIChDYWxjaXVtKSBpcyBvdXQuIERvd25s b2FkIGl0IGhlcmUuXQ0KICDigKIgW1Rlc3RpbmcgT0NhbWwgcmVsZWFzZXMg d2l0aCBvcGFtY2hlY2tdDQogIOKAoiBbQ29xIDguMTAuMiBpcyBvdXRdDQog IOKAoiBbQW5ub3VuY2luZyBJcm1pbiAyLjAuMF0NCiAg4oCiIFtCQVAgMi4w IGlzIHJlbGVhc2VkXQ0KICDigKIgW0NJL0NEIHBpcGVsaW5lczogTW9uYWQs IEFycm93IG9yIERhcnQ/XQ0KICDigKIgW09uIGZpeGVkLXBvaW50IHRoZW9y ZW1zIGluIHN5bnRoZXRpYyBjb21wdXRhYmlsaXR5XQ0KICDigKIgW1J1bm5l cnMgaW4gYWN0aW9uXQ0KICDigKIgW0NvcSA4LjEwLjEgaXMgb3V0XQ0KICDi gKIgW0Fubm91bmNpbmcgTWlyYWdlT1MgMy42LjBdDQogIOKAoiBbQ29tbWFz IGluIGJpZyBudW1iZXJzIGV2ZXJ5d2hlcmU6IEFuIE9wZW5UeXBlIGFkdmVu dHVyZV0NCiAg4oCiIFtDb3EgOC4xMC4wIGlzIG91dF0NCiAg4oCiIFtPQ2Ft bCBleHBlcnQgYW5kIGJlZ2lubmVyIHRyYWluaW5nIGJ5IE9DYW1sUHJvIChp biBGcmVuY2gpOg0KICAgIE5vdi4gNS02ICYgNy04XQ0KICDigKIgW01yLiBN SU1FIC0gUGFyc2UgYW5kIGdlbmVyYXRlIGVtYWlsc10NCiAg4oCiIFtBIGxv b2sgYmFjayBvbiBPQ2FtbCBzaW5jZSAyMDExXQ0KICDigKIgW0ZyYW1hLUMg MTkuMSAoUG90YXNzaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0aGVyZS5dDQog IOKAoiBbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0KICDigKIgW1VwZGF0ZWQg Q2hlYXQgU2hlZXRzOiBPQ2FtbCBMYW5ndWFnZSBhbmQgT0NhbWwgU3RhbmRh cmQgTGlicmFyeV0NCiAg4oCiIFtGcmFtYS1DbGFuZyAwLjAuNyBpcyBvdXQu IERvd25sb2FkIGl0aGVyZS5dDQogIOKAoiBbRGVjb21wcmVzczogRXhwZXJp ZW5jZXMgd2l0aCBPQ2FtbCBvcHRpbWl6YXRpb25dDQogIOKAoiBbT24gY29t cGxldGUgb3JkZXJlZCBmaWVsZHNdDQogIOKAoiBbQW4gaW50cm9kdWN0aW9u IHRvIGZ1enppbmcgT0NhbWwgd2l0aCBBRkwsIENyb3diYXIgYW5kIEJ1bl0N CiAg4oCiIFtXaGF0IGlzIGFsZ2VicmFpYyBhYm91dCBhbGdlYnJhaWMgZWZm ZWN0cz9dDQogIOKAoiBbVGhlIGJsb2cgbW92ZWQgZnJvbSBXb3JkcHJlc3Mg dG8gSmVreWxsXQ0KICDigKIgW09DYW1sUHJv4oCZcyBjb21waWxlciB0ZWFt IHdvcmsgdXBkYXRlXQ0KICDigKIgW1doYXQgdGhlIGludGVybnMgaGF2ZSB3 cm91Z2h0LCAyMDE5IGVkaXRpb25dDQogIOKAoiBbRGVjb21wcmVzczogVGhl IE5ldyBEZWNvbXByZXNzIEFQSV0NCg0KDQpbZXpjdXJsXSA8aHR0cHM6Ly9n aXRodWIuY29tL2MtY3ViZS9lemN1cmw+DQoNCltPQ2FtbCBQbGFuZXRdIDxo dHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvPg0KDQpbQW4gaW4t ZGVwdGggTG9vayBhdCBPQ2FtbOKAmXMgbmV3IOKAnEJlc3QtZml04oCdIEdh cmJhZ2UgQ29sbGVjdG9yIFN0cmF0ZWd5XQ0KPGh0dHA6Ly93d3cub2NhbWxw cm8uY29tLzIwMjAvMDMvMjMvb2NhbWwtbmV3LWJlc3QtZml0LWdhcmJhZ2Ut Y29sbGVjdG9yLz4NCg0KW1NsaWRpbmcgVGlsZSBQdXp6bGUsIFNlbGYtQ29u dGFpbmVkIE9DYW1sIFdlYmFwcF0NCjxodHRwOi8vcHNlbGxvcy5jb20vMjAy MC8wMy8yMDIwLjAzLmhvdy1pLXdyb3RlLWVsYXN0aWMtbWFuLmh0bWw+DQoN CltOZXcgdmVyc2lvbiBvZiBUcnkgT0NhbWwgaW4gYmV0YSFdDQo8aHR0cDov L3d3dy5vY2FtbHByby5jb20vMjAyMC8wMy8xNi9uZXctdmVyc2lvbi1vZi10 cnktb2NhbWwtaW4tYmV0YS8+DQoNCltGcmFtYS1DbGFuZyAwLjAuOCBpcyBv dXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1jLmNvbS9p bmRleC5odG1sPg0KDQpbQSByZWFzb25hYmxlIFR5WE1MIHJlbGVhc2UgfCBE cnVwJ3MgdGhpbmdpZXNdDQo8aHR0cHM6Ly9kcnVwLmdpdGh1Yi5pby8yMDIw LzAzLzA2L3R5eG1sNDQwLz4NCg0KW0FsdC1FcmdvIFVzZXJz4oCZIENsdWIg QW5udWFsIE1lZXRpbmddDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAy MC8wMy8wMy9hbHQtZXJnby11c2Vyc3MtY2x1Yi1hbm51YWwtbWVldGluZy8+ DQoNCltPQ2FtbCBpT1MgQXBwcyBQb3J0ZWQgdG8gQnJvd3Nlcl0NCjxodHRw Oi8vcHNlbGxvcy5jb20vMjAyMC8wMi8yMDIwLjAyLmtpZC1jaGFybGVtYWdu ZS5odG1sPg0KDQpbV2F0Y2ggYWxsIG9mIEphbmUgU3RyZWV0J3MgdGVjaCB0 YWxrc10NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vd2F0Y2gtYWxs LW9mLWphbmUtc3RyZWV0cy10ZWNoLXRhbGtzLz4NCg0KW01lcmN1cmlhbDog cHJldHR5Y29uZmlnIGV4dGVuc2lvbl0NCjxodHRwOi8vYmxvZy4wYnJhbmNo LmNvbS9wb3N0cy8yMDIwLTAyLTE1LXByZXR0eWNvbmZpZy1leHRlbnNpb24u aHRtbD4NCg0KW01lcmN1cmlhbCBleHRlbnNpb25zICh1cGRhdGUpXQ0KPGh0 dHA6Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDUtaGctZXh0 ZW5zaW9ucy5odG1sPg0KDQpbMjAxOSBhdCBPQ2FtbFByb10NCjxodHRwOi8v d3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAyLzA0LzIwMTktYXQtb2NhbWxwcm8v Pg0KDQpbQml0YnVja2V0IHJlcG9zaXRvcnkgbWlncmF0aW9uXQ0KPGh0dHA6 Ly9ibG9nLjBicmFuY2guY29tL3Bvc3RzLzIwMjAtMDItMDMtYml0YnVja2V0 LW1pZ3JhdGlvbi5odG1sPg0KDQpbVHJvdWJsZXNob290aW5nIHN5c3RlbWQg d2l0aCBTeXN0ZW1UYXBdDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29t L3Ryb3VibGVzaG9vdGluZy1zeXN0ZW1kLXdpdGgtc3lzdGVtdGFwLz4NCg0K W09jc2lnZW4gU3RhcnQgdXBkYXRlZF0NCjxodHRwczovL29jc2lnZW4uZ2l0 aHViLmlvL2Jsb2cvMjAyMC8wMS8yMC9yZWxlYXNlLz4NCg0KW29wYW0gMi4w LjYgcmVsZWFzZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzAx LzE2L29wYW0tMi0wLTYtcmVsZWFzZS8+DQoNCltvcGFtIDIuMC42IHJlbGVh c2VdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTAtNi8+ DQoNCltIYWNrZXJzIGFuZCBjbGltYXRlIGFjdGl2aXN0cyBqb2luIGZvcmNl cyBpbiBMZWlwemlnXQ0KPGh0dHBzOi8vbWlyYWdlLmlvL2Jsb2cvY2NjLTIw MTktbGVpcHppZz4NCg0KW0RlcGxveWluZyBhdXRob3JpdGF0aXZlIE9DYW1s LUROUyBzZXJ2ZXJzIGFzIE1pcmFnZU9TIHVuaWtlcm5lbHNdDQo8aHR0cHM6 Ly9oYW5uZXMubnFzYi5pby9Qb3N0cy9EbnNTZXJ2ZXI+DQoNCltSZXByb2R1 Y2libGUgTWlyYWdlT1MgdW5pa2VybmVsIGJ1aWxkc10NCjxodHRwczovL2hh bm5lcy5ucXNiLmlvL1Bvc3RzL1JlcHJvZHVjaWJsZU9QQU0+DQoNCltVc2lu ZyBQeXRob24gYW5kIE9DYW1sIGluIHRoZSBzYW1lIEp1cHl0ZXIgbm90ZWJv b2tdDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3VzaW5nLXB5dGhv bi1hbmQtb2NhbWwtaW4tdGhlLXNhbWUtanVweXRlci1ub3RlYm9vay8+DQoN CltDb3EgOC4xMStiZXRhMSBpcyBvdXRdDQo8aHR0cHM6Ly9jb3EuaW5yaWEu ZnIvbmV3cy9jb3EtOC0xMWJldGExLWlzLW91dC5odG1sPg0KDQpbRGVlcC1M ZWFybmluZyB0aGUgSGFyZGVzdCBHbyBQcm9ibGVtIGluIHRoZSBXb3JsZF0N CjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vZGVlcC1sZWFybmluZy10 aGUtaGFyZGVzdC1nby1wcm9ibGVtLWluLXRoZS13b3JsZC8+DQoNCltGcmFt YS1DIDIwLjAgKENhbGNpdW0pIGlzIG91dC4gRG93bmxvYWQgaXQgaGVyZS5d DQo8aHR0cDovL2ZyYW1hLWMuY29tL2luZGV4Lmh0bWw+DQoNCltUZXN0aW5n IE9DYW1sIHJlbGVhc2VzIHdpdGggb3BhbWNoZWNrXQ0KPGh0dHA6Ly9nYWxs aXVtLmlucmlhLmZyL2Jsb2cvYW4tb2NhbWwtcmVsZWFzZS1zdG9yeS0xPg0K DQpbQ29xIDguMTAuMiBpcyBvdXRdIDxodHRwczovL2NvcS5pbnJpYS5mci9u ZXdzL2NvcS04LTEwLTItaXMtb3V0Lmh0bWw+DQoNCltBbm5vdW5jaW5nIEly bWluIDIuMC4wXSA8aHR0cHM6Ly9taXJhZ2UuaW8vYmxvZy9pbnRyb2R1Y2lu Zy1pcm1pbi12Mj4NCg0KW0JBUCAyLjAgaXMgcmVsZWFzZWRdDQo8aHR0cDov L2JpbmFyeWFuYWx5c2lzcGxhdGZvcm0uZ2l0aHViLmlvL2JhcC0yLXJlbGVh c2U+DQoNCltDSS9DRCBwaXBlbGluZXM6IE1vbmFkLCBBcnJvdyBvciBEYXJ0 P10NCjxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAxOS8xMS8x NC9jaWNkLXBpcGVsaW5lcy8+DQoNCltPbiBmaXhlZC1wb2ludCB0aGVvcmVt cyBpbiBzeW50aGV0aWMgY29tcHV0YWJpbGl0eV0NCjxodHRwOi8vbWF0aC5h bmRyZWouY29tLzIwMTkvMTEvMDcvb24tZml4ZWQtcG9pbnQtdGhlb3JlbXMt aW4tc3ludGhldGljLWNvbXB1dGFiaWxpdHkvPg0KDQpbUnVubmVycyBpbiBh Y3Rpb25dDQo8aHR0cDovL21hdGguYW5kcmVqLmNvbS8yMDE5LzEwLzI4L3J1 bm5lcnMtaW4tYWN0aW9uLz4NCg0KW0NvcSA4LjEwLjEgaXMgb3V0XSA8aHR0 cHM6Ly9jb3EuaW5yaWEuZnIvbmV3cy9jb3EtOC0xMC0xLWlzLW91dC5odG1s Pg0KDQpbQW5ub3VuY2luZyBNaXJhZ2VPUyAzLjYuMF0NCjxodHRwczovL21p cmFnZS5pby9ibG9nL2Fubm91bmNpbmctbWlyYWdlLTM2LXJlbGVhc2U+DQoN CltDb21tYXMgaW4gYmlnIG51bWJlcnMgZXZlcnl3aGVyZTogQW4gT3BlblR5 cGUgYWR2ZW50dXJlXQ0KPGh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9j b21tYXMtaW4tYmlnLW51bWJlcnMtZXZlcnl3aGVyZS8+DQoNCltDb3EgOC4x MC4wIGlzIG91dF0gPGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29xLTgt MTAtMC1pcy1vdXQuaHRtbD4NCg0KW09DYW1sIGV4cGVydCBhbmQgYmVnaW5u ZXIgdHJhaW5pbmcgYnkgT0NhbWxQcm8gKGluIEZyZW5jaCk6IE5vdi4gNS02 ICYNCjctOF0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDE5LzA5LzI1 L29jYW1sLWV4cGVydC1hbmQtYmVnaW5uZXItdHJhaW5pbmctYnktb2NhbWxw cm8taW4tZnJlbmNoLW5vdi01LTYtNy04Lz4NCg0KW01yLiBNSU1FIC0gUGFy c2UgYW5kIGdlbmVyYXRlIGVtYWlsc10NCjxodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAxOS0wOS0yNS1tci1taW1lLXBhcnNlLWFuZC1nZW5lcmF0ZS1l bWFpbHMuaHRtbD4NCg0KW0EgbG9vayBiYWNrIG9uIE9DYW1sIHNpbmNlIDIw MTFdDQo8aHR0cDovL3d3dy5vY2FtbHByby5jb20vMjAxOS8wOS8yMC9hLWxv b2stYmFjay1vbi1vY2FtbC8+DQoNCltGcmFtYS1DIDE5LjEgKFBvdGFzc2l1 bSkgaXMgb3V0LiBEb3dubG9hZCBpdGhlcmUuXQ0KPGh0dHA6Ly9mcmFtYS1j LmNvbS9pbmRleC5odG1sPg0KDQpbQ29xIDguMTArYmV0YTMgaXMgb3V0XQ0K PGh0dHBzOi8vY29xLmlucmlhLmZyL25ld3MvY29xLTgtMTBiZXRhMy1pcy1v dXQuaHRtbD4NCg0KW1VwZGF0ZWQgQ2hlYXQgU2hlZXRzOiBPQ2FtbCBMYW5n dWFnZSBhbmQgT0NhbWwgU3RhbmRhcmQgTGlicmFyeV0NCjxodHRwOi8vd3d3 Lm9jYW1scHJvLmNvbS8yMDE5LzA5LzEzL3VwZGF0ZWQtY2hlYXQtc2hlZXRz LW9jYW1sLWxhbmd1YWdlLWFuZC1vY2FtbC1zdGFuZGFyZC1saWJyYXJ5Lz4N Cg0KW0ZyYW1hLUNsYW5nIDAuMC43IGlzIG91dC4gRG93bmxvYWQgaXRoZXJl Ll0NCjxodHRwOi8vZnJhbWEtYy5jb20vaW5kZXguaHRtbD4NCg0KW0RlY29t cHJlc3M6IEV4cGVyaWVuY2VzIHdpdGggT0NhbWwgb3B0aW1pemF0aW9uXQ0K PGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDE5LTA5LTEzLWRlY29tcHJl c3MtZXhwZXJpZW5jZXMtd2l0aC1vY2FtbC1vcHRpbWl6YXRpb24uaHRtbD4N Cg0KW09uIGNvbXBsZXRlIG9yZGVyZWQgZmllbGRzXQ0KPGh0dHA6Ly9tYXRo LmFuZHJlai5jb20vMjAxOS8wOS8wOS9vbi1jb21wbGV0ZS1vcmRlcmVkLWZp ZWxkcy8+DQoNCltBbiBpbnRyb2R1Y3Rpb24gdG8gZnV6emluZyBPQ2FtbCB3 aXRoIEFGTCwgQ3Jvd2JhciBhbmQgQnVuXQ0KPGh0dHBzOi8vdGFyaWRlcy5j b20vYmxvZy8yMDE5LTA5LTA0LWFuLWludHJvZHVjdGlvbi10by1mdXp6aW5n LW9jYW1sLXdpdGgtYWZsLWNyb3diYXItYW5kLWJ1bi5odG1sPg0KDQpbV2hh dCBpcyBhbGdlYnJhaWMgYWJvdXQgYWxnZWJyYWljIGVmZmVjdHM/XQ0KPGh0 dHA6Ly9tYXRoLmFuZHJlai5jb20vMjAxOS8wOS8wMy93aGF0LWlzLWFsZ2Vi cmFpYy1hYm91dC1hbGdlYnJhaWMtZWZmZWN0cy8+DQoNCltUaGUgYmxvZyBt b3ZlZCBmcm9tIFdvcmRwcmVzcyB0byBKZWt5bGxdDQo8aHR0cDovL21hdGgu YW5kcmVqLmNvbS8yMDE5LzA5LzAzL3RoZS1ibG9nLW1vdmVkLWZyb20td29y ZHByZXNzLXRvLWpla3lsbC8+DQoNCltPQ2FtbFByb+KAmXMgY29tcGlsZXIg dGVhbSB3b3JrIHVwZGF0ZV0NCjxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS8y MDE5LzA4LzMwL29jYW1scHJvcy1jb21waWxlci10ZWFtLXdvcmstdXBkYXRl Lz4NCg0KW1doYXQgdGhlIGludGVybnMgaGF2ZSB3cm91Z2h0LCAyMDE5IGVk aXRpb25dDQo8aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3doYXQtdGhl LWludGVybnMtaGF2ZS13cm91Z2h0LTIwMTkvPg0KDQpbRGVjb21wcmVzczog VGhlIE5ldyBEZWNvbXByZXNzIEFQSV0NCjxodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAxOS0wOC0yNi1kZWNvbXByZXNzLXRoZS1uZXctZGVjb21wcmVz cy1hcGkuaHRtbD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDi lZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g W3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlv dSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUg W1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFs c28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0 dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRw Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5v cmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1p dHRdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 14 to 21, 2020.

Current_incr: a small incremental library with no dependencies=

Thomas Leonard announced

The recent OCurrent 0.2 release included a little incremental library which might be interesting to some people. It is useful= for writing programs that need to keep some computation up-to-date efficiently as the inputs change.

It is similar to the existing incremental and react libraries already= in opam. Unlike incremental (which pulls in the whole of core_kernel), current_incr has no runtim= e dependencies (and build dependencies only on ocaml and dune). Unlike react, current_incr im= mediately stops computations when they are no longer needed (rather than relying on weak references and the garbage collector).

It is a fairly direct implementation of the Adaptive Functional Programming paper, and might be a good starting point for people wanting to learn about that.

You can get the library using opam:

opam install current_incr

Here's a simple example (in utop):

#require "current_incr";;

let total =3D Curre=
nt_incr.var 10
let complete =3D Cu=
rrent_incr.var 5

let status =3D
  Current_incr.of_cc begin
    Current_incr.read (Current_incr.of_var total) @@ function
    | 0 -> Current_incr.write "No jobs"
    | total ->
      Current_incr.read (Current_incr.of_var complete) @@ fun complete ->
      let frac =3D float_of_int complete /. float_of_=
int total in
      Printf.sprintf "%d/%d jobs complete (%.1f%%)"
                     complete total (100. *. frac)
      |> Current_incr.write
  end

This defines two input variables (total and complete) and a "changeable computation" (status) whose output depends on them. At the top-level, we can observe the initial state using <= code>observe:

# print_endline Current_incr.observe sta=
tus;;
5/10 jobs complete (50.0%)

Unlike a plain ref cell, a Current_incr.var keeps= track of which computations depend on it. After changing them, you must call propagate to update the results:

# Current_incr=
.change total 12;;
# Current_incr.change complete 4;;
# print_endline @@ Current_incr.observe status;;
5/10 jobs complete (50.0%)      (* Not y=
et updated *)

# Current_incr.propagate ();
# print_endline @@ Current_incr.observe status;;
4/12 jobs complete (33.3%)

Computations can have side-effects, and you can use on_release= to run some compensating action if the computation needs to be undone later. Here's a function that publishes a result, and al= so registers a compensation for it:

let publish msg =3D
  Printf.printf "PUBLISH: %s\n%!" msg;
  Current_incr.on_release @@ fun =
() ->
  Printf.printf "RETRACT: %s\n%!" msg

It can be used like this:

# let display =3D Current_incr.map publish status;;
PUBLISH: =
4/12 jobs complete (33.3%)

# Current_incr.change total 0;
# Current_incr.propagate ()
RETRACT: =
4/12 jobs complete (33.3%)
PUBLISH: =
No jobs

A major difference between this and the react library (which I've used in p= reviously in 0install's progre= ss reporting and CueKeeper) is that Current_incr does not depend on the garbage collector to decide when to stop a computation. I= n react, you'd have to be careful to make sure that display didn't get GC'd (even though you don't need = to refer to it again) because if it did then the output would stop getting updated. Also, setting total to 0 in react might cause the program to crash with a division-by-zero exception, because the frac computation will = continue running until it gets GC'd, even though it isn't needed for anything now.

Current_incr's API is pretty small. You might want to wrap it to provide extra features, e.g.

  • Use of a result type to propagate errors.
  • Integration with Lwt to allow asynchronous computations.
  • Static analysis to render your computation with graphviz.
  • Persistence of state to disk.

If you need that, consider using the main OCurrent library, which extends current_incr with these features.

Scikit-learn for OCaml

UnixJunkie announced

Ronan Lehy just hacked this:

https://github.com/lehy/o= caml-sklearn

This might interest a significant number of people out there. We are no more condemned to live in a world full of snakes that will bite us at run-time. :smiley:

Ronan Le Hy then said

So I came here to announce ocaml-sklearn as it just got published on Opam, = but I see @UnixJunkie did it for me (arigato gozai masu). Anyway:

  • this ambitions to cover the complete scikit-learn API
  • this ambition is currently not totally realized, but I wanted to releas= e something initial that one can play with
  • it's all @UnixJunkie's fault with his funny R wrappers.

So:

Anton Kochkov then added

OCaml and opam container images updated: new Fedora/Alpine/Ubu= ntu images

Anil Madhavapeddy announced

The Docker ocaml and opam = container images have been updated:

  • Alpine 3.11, Fedora 31 and Ubuntu 20.04 (beta) are now included.
  • Ubuntu 19.04 and Fedora 29 and 30 are now deprecated.
  • OCaml 4.09.1 and 4.11.0~dev have been refreshed.

You can find the full details of the container images available on the OCaml infra= structure wiki.

The containers are generated from a set of scripts using ocaml-dockerfile, = and will be migrating over the next six months to use an ocurrent-based infrastructure. Ther= e will be an announcement on this forum about any user-facing changes that involves, with plenty of time to transition your o= wn CIs over. Thanks go to @talex5 and @XVilka for contributions to this round of updates.

OCamlformat 0.14.0

Jules announced

As Etienne mentioned, we have released OCamlformat 0.14.1, reverting the ch= ange to the defaults and our plans to deprecate the doc-comments option.

For projects that already upgraded to 0.14.0 (eg. Coq), the doc-comme= nts option will change its meaning again. It is necessary to add doc-comments=3Dbefore to have the document= ation comments placed before. Moreover, the new option doc-comments-val added in 0.14.0 has = a higher precedence than doc-comments, even when it's not set. It is thus necessary to set them both to before = to have the old "before" behavior. This will be improved in the next release (see https://github.com/ocaml-ppx/ocamlformat= /pull/1340).

Thank you to our early adopters to bear us. We are improving our release pr= ocess to reduce confusion for the next updates. As usual, if you have any feedback, please open an issue on https://github.com/ocaml-ppx= /ocamlformat to discuss it with us.

Hashconsing an AST via PPX

Chet Murthy announced

[up-front (so nobody gets the wrong idea): I'm not pushing Camlp5. Rather, I'm just noting that this sort of thing is really easy to do, and I encourage someone to do something similar using the PPX infrastructure.]

I didn't want to derail the "Future of PPX" thread, so I thought I'd post separately to answer ivg@ 's issue about hashconsing of ASTs using PPX. It's actually [uh, I think] really, really easy to implement hashconsing of ADTs, using a PPX extension. On a lark, I decided to do it today, and while the code I've got isn't sufficient to use, I think it's not very far away, and I have the perfect use-case already in-mind. It took me two hours to implement the rewriter and the testcase, on top of the other infrastructure, which has no support for hashconsing of any sort.

Here are some examples of data-types and functions that are automaticaly hash-consed. The idea is that in the pattern-match the pattern is annotated with a variable (in this example, "z"); the expression that is supposed to be hash-consed against that pattern is annotated with that same variable. [The code that descends to the expression is a little weak right now, but I think that's easily fixable.] The algorithm goes as follows:

(1) "decorate" the pattern with "as z_<integer>" variables everywhere in constructors. This allows us to refer to parts of the original value.

(2) then find each expression that is marked with that same varable. Structurally descend the pattern and the expression in parallel and generate code to compare sub-structure and hashcons where appropriate.

And that's really it. I'm sure this can be implemented using the PPX tools.

Some comments: (1) what's nice, is that we can just take already-written code like List.map and annotate it; that generates a hash-cons= ed version. And since the generated code never uses deep structural equality (only pointer-equality) it should be only marginally slower than the original implementation.

(2) The variable in the annotation ("z") is used as the base for generating a whole slew of fresh variables, and I don't bother (yet) to check for clashes; this (again) is straightforward, but hey, I started two hours ago.

type t =3D Leaf of int | Node of t * =
int * t

module HCList =3D struct

let rec map f =3D function
    [][@hashrecons z] -> [][@hashrecons z]
  | (a::l=
)[@hashrecons z] -> let r =3D f a in ((r :=
: map f l)[@hashrecons z])

end

let deep =3D
let rec deep =3D (function
  Leaf n<=
span style=3D"color: #483d8b;">[@hashrecons z] -> Leaf n[@hashrecons z]
| Node (l=
, n, r) [@hashrecons z] ->
  Node (d=
eep l, n, deep r) [@hashrecons z]
  )
[@@ocaml.warning "-26"]
in deep

type sexp =3D
  | Atom =
of string
  | List =
of sexp list

let sexp_deep =3D
  let rec deep =3D function
      Atom s[@hashrecons z] -> Atom s[@hashrecons z]
    | List l[@hashrecons z] -> List (HCList.map deep l)=
[@hashrecons z]
  in deep

Links: First, at the commit, so they won't change

the testcase file: https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= e6dffe78fc6c27bdffa41970c4a7f1ca

the "ppx rewriter": https://github.= com/chetmurthy/pa_ppx/commit/5dd6b2ef3ca3677e11a0ad696074200101bd661f#diff-= 24aeaf51366017948f5735727f001c85

Second, the files with human-readable names, etc.:

the testcase: https://github.com/chetmurthy/pa_ppx/blob/master/t= ests/test_hashrecons.ml

the "ppx rewriter": https://github.com/chetmurthy/pa_ppx/b= lob/master/pa_hashrecons/pa_hashrecons.ml

The projects:

chetmurthy/pa_ppx: A reimplementation of ppx_deriving, all its plugins, ppx= _import, and a few others.

https://github.com/chetmur= thy/pa_ppx

chetmurthy/camlp5: Camlp5, version pre-8.00 on which the above is based. T= his is on the branch 26.attempt-pa-deriving .

Kakadu said

I experimented with this some time ago for ML workshop. The idea was to provide function: t -> htbl -> htbl * t = which rewrites value of type t by removing equal subtrees. Essentially it is just a fold over data type.

https://github.com/kakadu/GT/blob/master/regression/test816hash.ml#= L74

Chet Murthy asked and Josh Berdine replied

If you wanna use a hashtable (and, I presume, Obj.magic) you can write a si= ngle function that does the trick for all immutable data-types, right?

Yes, we have some magic @mbouaziz code in Infer that does this to create as much sharing as possible as values are Marshaled out.

Genprint v0.4

progman announced

A re-announcement of Genprint, a general value printing library, that addre= sses prior limitations that made it none too useful!

  1. It didn't work correctly for 4.08.0, the latest compiler release as of = first announcement (though fine for 4.02 .. 4.07.1)
  2. There was an awkward need to specify a search path for .cmt files when = working with the likes of Dune (which uses separate directories for source,= .cmi and (for opt) .cmt files)
  3. More often than not values of interest would display simply as &l= t;abstr> owing to the presence of signature abstraction of the mo= dule's type of interest.

These issues have been addressed:

  1. Works with versions 4.04 .. 4.10.0 (earlier versions became invalid af= ter a dependency change to ppxlib)
  2. The location of .cmt files is captured automatically by the PPX preproc= essor.
  3. Signatures at the implementation level (.mli files) and internally (functor= application constraints) are removed to reveal the inner structure of othe= rwise abstract values. For instance, the Ephemeron module:

    module EM=3DEphemeron.K1.Make(struct type t=3Dint let equal=3D(=3D) =
    let hash=3DHashtbl.=
    hash end)
    open EM
    let _=3D
      let v=3DEM.c=
    reate 0 in
      EM.add v 12345678 'X';
      let emprint ppf (v: Obj.Ephemeron.t) =3D
        Format.fprintf ppf "<C wrapper of key/data>" in
      [%install_prin=
    ter emprint[%pr ep=
    hem v];
    

    Which prints:

    ephem =3D> {size =3D 1;
              data =3D
               [|Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty; Empty;
                 Empty; Empty; Cons (922381915, <C wrapper of key/data>, =
    Empty);
                 Empty; Empty; Empty; Empty|];
              seed =3D 0; initial_size =3D 16}
    

    This also demos the [%install_printer] facility which mirrors the REPL's.

Installation is via the Opam main repository.

Additionally, the project repository contains two compiler versions of ocamldebug integrated= with the Genprint library which thereby becomes its default printer.

All of which makes this library much more useful than previously. See the project page for the details.

Other OCaml News

From the ocamlcore planet blog

Editor note: Thanks to ezcurl<= /a>, I can restore this section. I'm putting all the links this week, I wil= l prune to only put the new ones next week.

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id A1D3F7ED20 for ; Tue, 28 Apr 2020 14:44:59 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ehkQ=6M=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3A1ehpKBWhXeOgvq6dN3tUI59aEg3V8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYZRaPuKdThVPEFb/W9+hDw7KP9fy5BCpeuN3c6jgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal9IRmrrQjdrMgbjZZtJqsx1BfCv2dFdf?= =?us-ascii?q?lRyW50P1yYggzy5t23/J5t8iRQv+wu+stdWqjkfKo2UKJVAi0+P286+MPkux/D?= =?us-ascii?q?TRCS5nQHSWUZjgBIAwne4x7kWJr6rzb3ufB82CmeOs32UKw0VDG/5KplVBPklC?= =?us-ascii?q?EKPCM5/G/UjMxwkqNboAmgpxNkx47bfpyeNfR5fqPHYNwaXndKUsJfWiBdB4+x?= =?us-ascii?q?aZYEAegcMuZCt4Tzp0UAowawCwevC+zg1iRFiWXq0aAgyektDR3K0Q4mEtkTsH?= =?us-ascii?q?rUttL1NKIKXO2pyKnH1zPDZO5L1zjh6IjIdxEhoe2QXbltdsfe000vGBnDjlmK?= =?us-ascii?q?sozqIzOV1uEMs2iH8+ptTvqvi2kjqwBxvjig2NsjionPhoIU01DE6Dt2zJwyJd?= =?us-ascii?q?2iR052eNipG4ZeuSGdMot5WMIiQ2dwtSYi1LIGpZ+7fDQUx5Q/wB7fbvmHfJaS?= =?us-ascii?q?7hLlSumRPS90hHV5d72lghay9VKsyurmVsm7yFpKoStFksXMtnAQzBPf8NSISv?= =?us-ascii?q?x4/ku5wTaPzR7c5vhYLkAzkKrbLp8hwqIqmpUPtkTDGzf6mEPsg6CNcUUk4Omo?= =?us-ascii?q?6//9brr7uJCcKZd4ig7/MqQynsywG/83PhISUGic/OSwzKfs/Vf2QbVLkP06iK?= =?us-ascii?q?7ZsIrVJcgDqK+5AgxV0oc76xmhEjim0c4XkWMALFJfdxKLl4/pNE3UL/D9Cfe/?= =?us-ascii?q?h06jnyxwx/zcP73hBY3BLn/fn7f6fLZ95FBTyAwpwdBY/ZJUBakNL+j1WkDsrt?= =?us-ascii?q?zXEB05PxaozObgDdVxzoQeVn6VDa+cNKPSqUWI5uU1L+aQY48VvS7xK/k46P/u?= =?us-ascii?q?iX85nUURfa6z3ZsYbn2zA/doI12BbHbxnNsMFX0GshciQOHlklGPXyJfa2y8Uq?= =?us-ascii?q?8z/j02CoGrAZ3dSo2inrCNxjq3E5JMamxbBV2ADXHlfJieVfgWciKdOMphnyQE?= =?us-ascii?q?Vbe/T48h0gmjtAr1yrZ6NObU4ioYtZbj1dhp+eLciREy9Tp1D8SEzmGCUXt4nm?= =?us-ascii?q?QSRz85xKx/oEp9xUmf0aVgnvBUC9he6+lUXgsmOpPQ1eJ3B8zoVg/PcdqFUFOm?= =?us-ascii?q?Tc+nATE1QNIx2dgOY0NlFtu/kh7NwjamDqcLmLyLB5w66brR0nn2Kctl03bG06?= =?us-ascii?q?0hjlk6QsRRKWKmhqh/9wnKB47UjUqVjaGqdb4T3CPV7miDyXCBvEdCXA5rTarF?= =?us-ascii?q?XXUfZkrKrdTl/U7NVLiuCakhMgRd18GCMbFGatjmgFRJXvvjP87eY22pl2eqGR?= =?us-ascii?q?mI3q+MbJbte2gFwCrSEk0EkwQK8XaCNAg+HTuhrnnFDD1uEFLve1nj/fN/qHO9?= =?us-ascii?q?VE80zhuFY1dv17qvqVYpgqnWT+wVlPpQvDgngzFrGhC70s6AT5LKrBVnNu0UNd?= =?us-ascii?q?gi5n9D1HnFrEp8Mo2kK+ZlnFFIN0x8tkbqkhF2EZlokM4wrXpswhA2Yamf1Utp?= =?us-ascii?q?czKDwYu2PafdK3X7+B6oe+jbxwLwytGTr44L4fJwkF7juQC1CgJ2+nFu1Z9O2H?= =?us-ascii?q?uZ54nWJBIVVYPtX0038RljurycZTMysdCHnUZwOLW552eRk+kiA/Eon034JosN?= =?us-ascii?q?AOa/DAb3VvYiKY22MuVzygqxaRYVIO1Z9Kg1Jt6rMfyc1/zyZbcyrHedlW1Cpb?= =?us-ascii?q?tF/AeJ/it4RPTP2s9akfufww2MWiy6iQux9MftltIdPGxALi+E0SHhQbVpSOhy?= =?us-ascii?q?cIIMUzz8Jt3ugM15g4/xVnVY8l+6Gl5A39WmK0Of?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AZBgABJKhehyIeaIFmHgELHIMogXFVM?= =?us-ascii?q?iqEH4kBhguFH4UujTSEAYFjDwEDAQwYAQwHAQIEAQGBUIJ0AoIoHQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFXQyCOwwZgxYDARgBCAQGPwgeIwMUAQYDA?= =?us-ascii?q?hEBFwEUChcBEhQGgwwBgnwEAQqXGpt5fzOEOQEDAw5AhBeBQA0CE4EWhSqDHIN?= =?us-ascii?q?7D4FMP4NzbIF+UA4LAQEBAQEZgSAHAQEGAgkJDy2CXIJfBI4iCAYNJAJniniFX?= =?us-ascii?q?YINjwN8B4JIfwSGGnOJdYYbgluBB4dRkUwhj12BV4VMB2uBNIVQjhaBPyqBRwE?= =?us-ascii?q?dDAczGjBDDQIOghgBATIJCQFVDYpbh2sBF4NPQYIjgSRRO4VEPzMCAQEOIwIGA?= =?us-ascii?q?QcBAQMJdQEBBRMLAY8KAiYEgT1cAQE?= X-IPAS-Result: =?us-ascii?q?A0AZBgABJKhehyIeaIFmHgELHIMogXFVMiqEH4kBhguFH4U?= =?us-ascii?q?ujTSEAYFjDwEDAQwYAQwHAQIEAQGBUIJ0AoIoHQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFXQyCOwwZgxYDARgBCAQGPwgeIwMUAQYDAhEBFwEUChcBEhQ?= =?us-ascii?q?GgwwBgnwEAQqXGpt5fzOEOQEDAw5AhBeBQA0CE4EWhSqDHIN7D4FMP4NzbIF+U?= =?us-ascii?q?A4LAQEBAQEZgSAHAQEGAgkJDy2CXIJfBI4iCAYNJAJniniFXYINjwN8B4JIfwS?= =?us-ascii?q?GGnOJdYYbgluBB4dRkUwhj12BV4VMB2uBNIVQjhaBPyqBRwEdDAczGjBDDQIOg?= =?us-ascii?q?hgBATIJCQFVDYpbh2sBF4NPQYIjgSRRO4VEPzMCAQEOIwIGAQcBAQMJdQEBBRM?= =?us-ascii?q?LAY8KAiYEgT1cAQE?= X-IronPort-AV: E=Sophos;i="5.73,327,1583190000"; d="scan'208,217";a="447276691" X-MGA-submission: =?us-ascii?q?MDHOD+R9GX2yrtGrtgBgKk0ZnMVL0qSZ1CrlXp?= =?us-ascii?q?e84LNFMJeMMb6L4dX2hNVjsxpePSsOudzKfJwXe+5LxhMlCR6Ilp1CjZ?= =?us-ascii?q?K8Z2MdF1KzYI1BbOorQv0ZilLfi/R8HOmFfYp41XKloW5Y5HP7XVRyAU?= =?us-ascii?q?0O0vyNlUNoEFSYC3Qf2hqbxA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Apr 2020 14:44:57 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B452A5611EE; Tue, 28 Apr 2020 14:44:54 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 28 Apr 2020 14:44:54 +0200 Message-ID: <87a72vhj95.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 28 14:44:55 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000095, queueID=4C8C456120B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 21 to 28, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.0.7 and 2.1.0 alpha OCaml 4.11, release plan ocamlformat pre-commit hook New release of naboris 0.1.2 ANN: Releases of ringo resto 0.2 released Retrofitting Parallelism onto OCaml (research paper) Multicore Update: April 2020, with a preprint paper Why did Core remove polymorphic comparison operators in OCaml 4.10.0? New release of js_of_ocaml 3.6.0 Other OCaml News Old CWN opam 2.0.7 and 2.1.0 alpha =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: R. Boujbel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the release of [opam 2.0.7] and an [2.1.0 alpha]. This 2.0.7 version contains backported fixes, you can find more information in this [blog post]. The 2.1.0~alpha contains many new features (cf. [blog post] or [release note]). If you want to take a look, a few glitches or regressions are expected, please report them to [the bug-tracker]. *opam is a source-based package manager for OCaml. It supports multiple simultaneous compiler installations, flexible package constraints, and a Git-friendly development workflow.* [opam 2.0.7] [2.1.0 alpha] [blog post] [blog post] [release note] [the bug-tracker] Anil Madhavapeddy then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 Thanks for all the hard work that's gone into this release, @rjbou @AltGr and @dra27! To set expectations, this alpha release is for our users to smoke test the new features and let us know if they work for your usecases. In particular, the opam external dependency management and support for recursive pins are both commonly requested features. Please do take this alpha for a spin, and report feedback here on this thread. After this alpha is cut, there will be a sequence of beta releases (the number of which depend on the reported bug tail), and then the final opam 2.1.0 release. Your testing _now_ will greatly help us put a quality release out of the door. OCaml 4.11, release plan =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The new version of OCaml, OCaml 4.11.0, has started its bugfix period: the set of new features is now mostly frozen, and in the three upcoming months, we will focus mostly on fixing bugs. For this release cycle, we will experiment releasing an alpha version of the compiler. This new alpha version is expected to work as a synchronization point for people working on updating the opam ecosystem for the new release. Once the opam ecosystem is in shape for some wider audience testings, we will publish a beta version as usual. This should be happen around June. One of the most notable change in this release is `Statmemprof', a new statistical memory profiler directly integrated into the GC. The provisional Changes list is [here]. At this point of time, it is better to take this list with a grain of salt: there are a handful of new features that are still under integration, problematic features might be removed, and of course the list of bug fixes is incomplete. But one of the most notable feature in this change log, `Statmemprof' which a new statistical memory profiler API, is most probably here to stay. [here] Guillaume Munch-Maccagnoni then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 It should be mentioned that Memprof is documented as =E2=80=9C~EXPERIMENT= AL~=E2=80=9D, and at least one breaking change is being considered in 4.12. This also mean that suggestion for improvement will be welcome (AFAIU). ocamlformat pre-commit hook =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Brendan Long announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is kind of trivial but I figured it might be useful for other people. We created a hook config for using [ocamlformat] with [pre-commit]: pre-commit is a tool that makes it easier to run checks on changed files before commiting them, and this makes it so you can auto-run ocamlformat and ensure no unformatted code gets into your repo. 1. [Install pre-commit] like `pip install pre-commit' 2. In your repo, add a .pre-commit-config.yaml like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 --- =E2=94=82 repos: =E2=94=82 - repo: https://github.com/arenadotio/pre-commit-ocamlform= at =E2=94=82 rev: master # or pick a commit sha I guess =E2=94=82 hooks: =E2=94=82 - id: ocamlformat =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 1. Run `pre-commit install' 2. Now every time you run `git commit' (or `pre-commit run'), it will run every staged OCaml file through ocamlformat and complain if there are any changes: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ pre-commit run ocamlformat =E2=94=82 ocamlformat.....Failed =E2=94=82 - hook id: ocamlformat =E2=94=82 - files were modified by this hook =E2=94=82 $ git add . =E2=94=82 $ pre-commit run ocamlformat =E2=94=82 ocamlformat.....Passed =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [ocamlformat] [pre-commit] [Install pre-commit] New release of naboris 0.1.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Shawn McGinty announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Simple http server for OCaml/ReasonML. [naboris] has been updated to 0.1.2 This release comes with a few improvements to the API but most notably it has much better documentation at [naboris.dev] [naboris] [naboris.dev] ANN: Releases of ringo =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of Nomadic Labs, I am please to announce the first few releases of Ringo: a library for caches. Ringo offers two kinds of caches: Maps for caches of key-value pairs and Sets for caches of simple elements. In addition, each kind of cache can be tweaked to handle their bounds differently. Ringo versions 0.1, 0.2 and 0.3 are available on `opam'. As the version number and the bundled announce suggests, this library is still in early phases of release: additional replacement policies will be added, the interface will probably change somewhat, etc. Suggestions welcome! Even though the interface is still in early phases of release, the implementation is covered by a lot of tests and is already in use in the Tezos project. The code is available at resto 0.2 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Release of `resto 0.5' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C On behalf of Nomadic Labs, I'm happy to announce the release of version 0.5 of `resto'. The main change brought in this release are: =E2=80=A2 relaxing of dependency bounds, =E2=80=A2 documentation! Retrofitting Parallelism onto OCaml (research paper) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Guillaume Munch-Maccagnoni announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 The following paper on the multicore GC design by @kayceesrk and his coauthors has been posted on arXiv today and might interest the community: Multicore Update: April 2020, with a preprint paper =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Welcome to the April 2020 update from the Multicore OCaml team, across the UK, India, France and Switzerland! Although most of us are in lockdown, we continue to march forward. As with [previous updates], thanks to @shakthimaan and @kayceesrk for help assembling it all. [previous updates] =E2=97=8A Preprint: Retrofitting Parallelism onto OCaml We've put up a preprint of a paper titled ["Retrofitting Parallelism onto OCaml" ] for which we would be grateful to receive feedback. The paper lays out the problem space for the multicore extension of OCaml and presents the design choices, implementation and evaluation of the concurrent garbage collector (GC). Note that this is *not a final paper* as it is currently under peer review, so any feedback given now can still be incorporated. Please use the e-mail contact details in the [pdf paper] for @kayceesrk and myself so we can aggregate (and acknowledge!) any such comments. ["Retrofitting Parallelism onto OCaml" ] [pdf paper] =E2=97=8A Rebasing Progress The Multicore OCaml rebase from 4.06.1 has gained momentum. We have successfully rebased the parallel-minor-GC all the way onto the [4.09 OCaml trees]. We will publish updated opam packages when we get to the recently branched 4.11 in the next couple of weeks. Rebasing complex features like this is a "slow and steady" process due to the number of intermediate conflicts and bootstrapping, so we will not be publishing opam packages for every intermediate version =E2=80=93 instead, the 4.11 trees will form the new "stable base" for any PRs. [4.09 OCaml trees] =E2=97=8A Higher-level Domainslib API A thread from [last month's update] on building a parallel raytracer led to some useful advancements in the [domainslib] library to provide async/await-style task support. See the updates below for more details. There is also an interesting discussion on [ocaml-multicore/ocaml-multicore#324] about how to go about profiling and optimising your own small programs. More experiments with parallel algorithms with different scheduling properties would be most useful at this time. [last month's update] [domainslib] [ocaml-multicore/ocaml-multicore#324] =E2=97=8A Upstreamed features in 4.11 The [4.11 release has recently branched] and has the following multicore-relevant changes in it: =E2=80=A2 A concurrency-safe marshalling implementation (originally in [ocaml#9293], then implemented again in [ocaml#9353]). This will have a slight speed hit to marshalling-heavy programs, so feedback on trying this in your projects with 4.11 will be appreciated to the upstream OCaml issue tracker. =E2=80=A2 A runtime eventlog tracing system using the CTF format is on the verge of being merged in 4.11 over in [ocaml#9082]. This will also be of interest to those who need sequential program profiling, and is a generalisation of the infrastructure that was essential to our development of the multicore GC. If anyone is interested in helping with hacking on the OCaml side of CTF support to build clients, please get in touch with me or @kayceesrk. In addition to the above highlights, we have also been making continuous improvements and additions to the Sandmark benchmarking test infrastructure. The various ongoing and completed tasks are provided below for your reference. [4.11 release has recently branched] [ocaml#9293] [ocaml#9353] [ocaml#9082] Multicore OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml-multicore/ocaml-multicore] Promote Multicore OCaml to tr= unk The rebasing of Multicore OCaml from 4.06 to 4.10 is being worked, and we are now at 4.09! In a few weeks, we expect to complete the rebase to the latest trunk release. =E2=80=A2 [ocaml-multicore/eventlog-tools]: OCaml Eventlog Tools A project that provides a set of tools for runtime tracing for OCaml 4.11.0 and higher has been created. This includes a simple OCaml decoder for eventlog's trace and a built-in chrome converter tool. =E2=80=A2 [ocaml-multicore/domainslib#5] Add parallel_scan to domainslib A [parallel_scan] implementation that uses the Task API with prefix_sum and summed_area_table has now been added to the Domain-level Parallel Programming library for Multicore OCaml (domainslib) library. [ocaml-multicore/ocaml-multicore] [ocaml-multicore/eventlog-tools] [ocaml-multicore/domainslib#5] [parallel_scan] =E2=97=8A Completed The following PRs have been merged into Multicore OCaml and its ecosystem projects: =E2=80=A2 [ocaml-multicore/ocaml-multicore#328] Multicore compiler with Flambda Support for Flambda has been merged into the Multicore OCaml project repository. The translation is now performed at cmmgen instead of lambda for clambda conversion. =E2=80=A2 [ocaml-multicore/ocaml-multicore#324] Optimizing a Multicore pr= ogram The following [documentation] provides a detailed example on how to do performance debugging for a Multicore program to improve the runtime performance. =E2=80=A2 [ocaml-multicore/ocaml-multicore#325] Added eventlog_to_latenci= es.py script A script to generate a latency report from an eventlog has now been included in the ocaml-multicore repository. =E2=80=A2 [ocaml-multicore/domainslib#4] Add support for task_pools The domainslib library now has support for work-stealing task pools with async/await parallelism. You are encouraged to try the [examples]. [ocaml-multicore/ocaml-multicore#328] [ocaml-multicore/ocaml-multicore#324] [documentation] [ocaml-multicore/ocaml-multicore#325] [ocaml-multicore/domainslib#4] [examples] Benchmarking =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C A number of new benchmarks are being ported to the [Sandmark] performance benchmarking test suite. =E2=80=A2 [ocaml-bench/sandmark#104] Added python pip3 dependency A check_dependency function has now been defined in the Makefile along with a list of dependencies and pip packages for Ubuntu. You can now run `make depend' prior to building the benchmark suite to ensure that you have the required software. The `python3-pip' package has been added to the list of dependencies. =E2=80=A2 [ocaml-bench/sandmark#96] Sandmark Analyze notebooks The setup, builds and execution scripts for developer branches on bench2.ocamllabs.io have been migrated to winter.ocamllabs.io. A UI and automated script driven notebooks for analyzing sequential bench results is being worked upon. =E2=80=A2 [ocaml-bench/sandmark#108] Porting mergesort and matrix multiplication using Task Pool API library This is an on-going PR to implement merge sort and matrix_multiplication using `parallel_for'. =E2=80=A2 [cubicle] `Cubicle' is a model checker and an automatic SMT theorem prover. At present, it is being ported to Multicore OCaml, and this is a work in progress. =E2=80=A2 [raytracers] Raytracers is a repository that contains ray tracer implementation for different parallel functional programming languages. The OCaml implementation has now been updated to use the new `Domainslib.Task' API. Also, a few [experiments] were performed on flambda parameters for the Multicore raytracer which gives around 25% speedup, but it does not yet remove the boxing of floats. The experiments are to be repeated with a merge against the wip flambda2 trees on 4.11, that removes float boxing. [Sandmark] [ocaml-bench/sandmark#104] [ocaml-bench/sandmark#96] [ocaml-bench/sandmark#108] [cubicle] [raytracers] [experiments] OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml/ocaml#9082] Eventlog tracing system A substantial number of commits have gone into this PR based on reviews and feedback. These include updates to the configure script, handling warnings and exceptions, adding build support for Windows, removing unused code and coding style changes. This patch will be cherry-picked for the 4.11 release. [ocaml/ocaml#9082] =E2=97=8A Completed =E2=80=A2 [ocaml/ocaml#9353] Reimplement `output_value' using a hash tabl= e to detect sharing This PR which implements a hash table and bit vector as required for Multicore OCaml has been merged to 4.11. Our thanks as always go to all the OCaml developers and users in the community for their continued support, and contribution to the project! [ocaml/ocaml#9353] Acronyms =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 API: Application Programming Interface =E2=80=A2 GC: Garbage Collector =E2=80=A2 PIP: Pip Installs Python =E2=80=A2 PR: Pull Request =E2=80=A2 SMT: Satisfiability Modulo Theories =E2=80=A2 UI: User Interface Why did Core remove polymorphic comparison operators in OCaml 4.10.0? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Trung Ta asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm using the Core library in a project, and recently when I upgraded my OCaml from 4.08.1 to 4.10.0, plenty of compilation errors suddenly appears for comparison expressions like: `if (xs =3D []) then ...' or `if (x =3D true) then ...' I saw that this change was discussed in this [thread] about monomorphic comparison operators in Base, but did not expect that Core would make it a default behavior. So I'd like to ask since which version that Core removed such polymorphic comparison operators? (I couldn't find it in release notes of Core) Also, if I defined a sum type like `type ternary =3D True | False | Unkn', what will be a correct way to write `if (x =3D True) then ...' (which is allowed in the new Core)? I can temporarily fix by writing `if (x =3D=3D True) then ...', but using `=3D=3D' doesn't seem correct, since `=3D=3D' is about comparing physical objects=E2=80=A6 Thanks for spending your time to check my question. [thread] Aaron L. Zeng replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The change was announced in , although unfortunately it doesn't look like the CHANGES.md file was updated in the repo. I would consider the thread to be the canonical announcement. Also, if I defined a sum type like `type ternary =3D True | False | Unkn' , what will be a correct way to write `if (x =3D True) then ...' (which is allowed in the new Core)? Here's a few suggestions: 1. Define equality/compare functions using [`ppx_compare'] =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type ternary =3D True | False | Unkn [@@deriving equal] =E2=94=82=20 =E2=94=82 let f x =3D if (equal_ternary x True) then ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 2. Define equality/compare functions manually =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let equal_ternary t1 t2 =3D =E2=94=82 match t1, t2 with =E2=94=82 | True, True | False, False | Unkn, Unkn -> true =E2=94=82 | _ -> false =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 3. Explicitly request polymorphic comparison operators using the `Poly' module: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f x =3D if (Poly.(=3D) x True) then ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [`ppx_compare'] Trung said and Aaron L. Zeng replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 btw, =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type ternary =3D True | False | Unkn [@@deriving equal] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 should be: `[@@deriving eq]' That depends on which preprocessor you are using. `[@@deriving equal]' comes from ppx_compare, whereas `[@@deriving eq]' comes from [ppx_deriving]. Base/Core and the like have better support for the former, which is a Jane Street project, although you can feel free to use the latter=E2=80=94the naming conventions are different, so it may no= t be as convenient. [ppx_deriving] New release of js_of_ocaml 3.6.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hhugo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release [Js_of_ocaml] 3.6.0. Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers and Node.js. Try it [online]. Notable changes: =E2=80=A2 The `js_of_ocaml' compiler now accepts sub-commands (link, build-runtime, build-fs, ..). The plan for future versions is to remove other binary (e.g. jsoo_link) and consolidate everything inside the `js_of_ocaml' binary itself. =E2=80=A2 The standard JavaScript runtime is now embedded in the compiler (findlib is no longer needed to locate it) =E2=80=A2 Add support for the Str library (Regular expressions and high-l= evel string processing) shipped with the OCaml compiler =E2=80=A2 Change memory representation of `Int64.t' (you might need to up= date your JavaScript stubs) =E2=80=A2 Many bug fixes (thanks to many more tests) [Js_of_ocaml] [online] Kirill Alexander Khalitov asked and Hhugo replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 1 Does the project have roadmap? There is no official roadmap, the project evolves based on issues, requests and contributions. You can take a look at some of the [Github issues] 2 Is the project generally exists only for Ocsigen needs? js_of_ocaml is used by various projects, not only Ocsigen. See [Bonsai], [sketch-sh] or [jscoq] for instance. 3 Will it be adopted for modern front-end development (commonjs/esmodules compatibility for working with existing building tools ex. webpack, etc). Being more friendly with the JavaScript ecosystem as been discussed here and there in the past but little has been done, possibly by lack of interest or use cases. 4 Does the project competing with bucklescript? I don't think so. The two projects have different goals and different audience. One of Js_of_ocaml main goal is to stay as close as possible to the official OCaml semantic, allowing to leverage existing OCaml libraries without any modification. 5 Why not to do ocaml to js compiler tools (based on js_of_ocaml and bucklescript experience) that combine possibility of using native ocaml and js libraries across back-end and front-end like implemented in Scala.js/Fable F#? I don't understand this question. I would expect both js_of_ocaml and bucklescript to be like Scala.js/Fable F# in their own way. [Github issues] [Bonsai] [sketch-sh] [jscoq] Kirill Alexander Khalitov then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80 I mean what Scala.js/Fable F# allows to use the most native libraries (not all) and JS ones (from npm registry or from custom JS module) in one project (ex. front-end). But in case of js_of_ocaml we limited to native OCaml libs and "HTML scripts" (not JS compatible modules). For bucklescript case we have whole JS ecosystem but have no access to useful native libs from opam registry. Xavier Van de Woestyne replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In Js_of_OCaml, you can deal with JavaScript's module (and npm/yarn), using for example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* val require : string -> 'a *) =E2=94=82 let require module_name =3D =E2=94=82 let open Js.Unsafe in =E2=94=82 fun_call =E2=94=82 (js_expr "require") =E2=94=82 [|inject (Js.string module_name)|] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Every proof assistant] =E2=80=A2 [opam 2.0.7 release] =E2=80=A2 [opam 2.1.0 alpha is here!] [OCaml Planet] [Every proof assistant] [opam 2.0.7 release] [opam 2.1.0 alpha is here!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 21 to 28, 2020.

opam 2.0.7 and 2.1.0 alpha

R. Boujbel announced

We are pleased to announce the release of opam 2.0.7 and an 2.1.0 al= pha.

This 2.0.7 version contains backported fixes, you can find more information= in this blog post.

The 2.1.0~alpha contains many new features (cf. blog post or release = note). If you want to take a look, a few glitches or regressions are expected, please report them to the bug-tracker.

opam is a source-based package manager for OCaml. It supports multiple s= imultaneous compiler installations, flexible package constraints, and a Git= -friendly development workflow.

Anil Madhavapeddy then added

Thanks for all the hard work that's gone into this release, @rjbou @AltGr a= nd @dra27!

To set expectations, this alpha release is for our users to smoke test the = new features and let us know if they work for your usecases.

In particular, the opam external dependency management and support for recu= rsive pins are both commonly requested features. Please do take this alpha for a spin, and report feedback here on= this thread.

After this alpha is cut, there will be a sequence of beta releases (the num= ber of which depend on the reported bug tail), and then the final opam 2.1.0 release. Your testing now will greatly help us put a quality release out of the door.

OCaml 4.11, release plan

octachron announced

The new version of OCaml, OCaml 4.11.0, has started its bugfix period: the = set of new features is now mostly frozen, and in the three upcoming months, we will focus mostly on fixing bugs.

For this release cycle, we will experiment releasing an alpha version of th= e compiler.

This new alpha version is expected to work as a synchronization point for p= eople working on updating the opam ecosystem for the new release. Once the opam ecosystem is in shape for some= wider audience testings, we will publish a beta version as usual. This should be happen around June.

One of the most notable change in this release is Statmemprof,= a new statistical memory profiler directly integrated into the GC.

The provisional Changes list is here.

At this point of time, it is better to take this list with a grain of salt:= there are a handful of new features that are still under integration, problematic features might be removed, and of = course the list of bug fixes is incomplete.

But one of the most notable feature in this change log, Statmemprof which a new statistical memory profiler API, is most probably here to stay.

Guillaume Munch-Maccagnoni then added

It should be mentioned that Memprof is documented as =E2=80=9C~EXPERIMENTAL= ~=E2=80=9D, and at least one breaking change is being considered in 4.12. This also mean that suggestion for improvement will be = welcome (AFAIU).

ocamlformat pre-commit hook

Brendan Long announced

This is kind of trivial but I figured it might be useful for other people. = We created a hook config for using ocamlforma= t with pre-commit:

https://gi= thub.com/arenadotio/pre-commit-ocamlformat

pre-commit is a tool that makes it easier to run checks on changed files be= fore commiting them, and this makes it so you can auto-run ocamlformat and ensure no unformatted code gets into your = repo.

  1. Install pre-commit like= pip install pre-commit
  2. In your repo, add a .pre-commit-config.yaml like:

    ---
    repos:
      - repo: https://github.com/arenado=
    tio/pre-commit-ocamlformat
        rev: master # or pick a commit sha I=
     guess
        hooks:
         - id: ocamlformat
    
  1. Run pre-commit install
  2. Now every time you run git commit (or pre-commit run), it will run every staged OCaml file through ocamlformat and complain = if there are any changes:

    $ pre-commit run ocamlformat
    ocamlformat.....Failed
    - hook id: ocamlformat
    - files were modified by this hook
    $ git add .
    $ pre-commit run ocamlformat
    ocamlformat.....Passed
    

New release of naboris 0.1.2

Shawn McGinty announced

Simple http server for OCaml/ReasonML.

naboris has been updated to 0.1.2

This release comes with a few improvements to the API but most notably it h= as much better documentation at naboris.dev

ANN: Releases of ringo

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I am please to announce the first few releases o= f Ringo: a library for caches. Ringo offers two kinds of caches: Maps for caches of key-value pairs and Sets for= caches of simple elements. In addition, each kind of cache can be tweaked to handle their bounds differently.

Ringo versions 0.1, 0.2 and 0.3 are available on opam. As the = version number and the bundled announce suggests, this library is still in early phases of release: additional replacement po= licies will be added, the interface will probably change somewhat, etc. Suggestions welcome!

Even though the interface is still in early phases of release, the implemen= tation is covered by a lot of tests and is already in use in the Tezos project.

The code is available at = https://gitlab.com/nomadic-labs/ringo

resto 0.2 released

Rapha=C3=ABl Proust announced

Release of resto 0.5

On behalf of Nomadic Labs, I'm happy to announce the release of version 0.5= of resto.

The main change brought in this release are:

  • relaxing of dependency bounds,
  • documentation!

Retrofitting Parallelism onto OCaml (research paper)

Guillaume Munch-Maccagnoni announced

The following paper on the multicore GC design by @kayceesrk and his coauth= ors has been posted on arXiv today and might interest the community: https://arxiv.org/abs/2004.116= 63

Multicore Update: April 2020, with a preprint paper

Anil Madhavapeddy announced

Welcome to the April 2020 update from the Multicore OCaml team, across the = UK, India, France and Switzerland! Although most of us are in lockdown, we continue to march forward. As with= previous updates, thanks to @shakthimaan and @kayceesrk for help assembling it all.

  • Preprint: Retrofitting Parallelism onto OCaml<= br />

    We've put up a preprint of a paper titled "Retrofitting Parallelism onto OCaml" for which we would b= e grateful to receive feedback. The paper lays out the problem space for t= he multicore extension of OCaml and presents the design choices, implementation and evaluation of= the concurrent garbage collector (GC).

    Note that this is not a final paper as it is currently under peer re= view, so any feedback given now can still be incorporated. Please use the e-mail contact details in the pdf paper for @kayceesrk and myself so we can aggregate (and acknowledge!) any such comme= nts.

  • Rebasing Progress

    The Multicore OCaml rebase from 4.06.1 has gained momentum. We have succes= sfully rebased the parallel-minor-GC all the way onto the 4.09 OCaml trees. We will publish updated opam packages when we get to the recently branched = 4.11 in the next couple of weeks.

    Rebasing complex features like this is a "slow and steady" process due to t= he number of intermediate conflicts and bootstrapping, so we will not be publishing opam packages for every interme= diate version – instead, the 4.11 trees will form the new "stable base" for any PRs.

  • Higher-level Domainslib API

    A thread from last month's update on building a parallel raytracer led to some useful advancements in the domainslib li= brary to provide async/await-style task support. See the updates below for more details.

    There is also an interesting discussion on o= caml-multicore/ocaml-multicore#324 about how to go about profiling and optimising your own small programs. More experiments w= ith parallel algorithms with different scheduling properties would be most useful at this time.

  • Upstreamed features in 4.11

    The 4.= 11 release has recently branched and has the following multicore-relevant changes in it:

    In addition to the above highlights, we have also been making continuous im= provements and additions to the Sandmark benchmarking test infrastructure. The various ongoing and completed tasks a= re provided below for your reference.

Multicore OCaml

  • Ongoing
    • ocaml-multicore/ocaml-multicore Promote Multicore OCaml= to trunk

      The rebasing of Multicore OCaml from 4.06 to 4.10 is being worked, and we a= re now at 4.09! In a few weeks, we expect to complete the rebase to the lat= est trunk release.

    • ocaml-multico= re/eventlog-tools: OCaml Eventlog Tools

      A project that provides a set of tools for runtime tracing for OCaml 4.11.0= and higher has been created. This includes a simple OCaml decoder for even= tlog's trace and a built-in chrome converter tool.

    • ocaml-mult= icore/domainslib#5 Add parallel_scan to domainslib

      A parallel_scan implementation that uses the Task API wit= h prefix_sum and summed_area_table has now been added to the Domain-level P= arallel Programming library for Multicore OCaml (domainslib) library.

  • Completed

    The following PRs have been merged into Multicore OCaml and its ecosystem p= rojects:

    • oca= ml-multicore/ocaml-multicore#328 Multicore compiler with Flambda

      Support for Flambda has been merged into the Multicore OCaml project reposi= tory. The translation is now performed at cmmgen instead of lambda for clam= bda conversion.

    • o= caml-multicore/ocaml-multicore#324 Optimizing a Multicore program

      The following documentation provides a detailed e= xample on how to do performance debugging for a Multicore program to improv= e the runtime performance.

    • oca= ml-multicore/ocaml-multicore#325 Added eventlog_to_latencies.py script

      A script to generate a latency report from an eventlog has now been includ= ed in the ocaml-multicore repository.

    • ocaml-mult= icore/domainslib#4 Add support for task_pools

      The domainslib library now has support for work-stealing task pools with as= ync/await parallelism. You are encouraged to try the examples.

Benchmarking

A number of new benchmarks are being ported to the Sandmark performance benchmarking test suite.

  • ocaml-bench/sa= ndmark#104 Added python pip3 dependency

    A check_dependency function has now been defined in the Makefile along with= a list of dependencies and pip packages for Ubuntu. You can now run = make depend prior to building the benchmark suite to ensure that you= have the required software. The python3-pip package has been = added to the list of dependencies.

  • ocaml-bench/s= andmark#96 Sandmark Analyze notebooks

    The setup, builds and execution scripts for developer branches on bench2.oc= amllabs.io have been migrated to winter.ocamllabs.io.

    A UI and automated script driven notebooks for analyzing sequential bench r= esults is being worked upon.

  • ocaml-bench/sa= ndmark#108 Porting mergesort and matrix multiplication using Task Pool API library

    This is an on-going PR to implement merge sort and matrix_multiplication us= ing parallel_for.

  • cubicle<= /a>

    Cubicle is a model checker and an automatic SMT theorem prover= . At present, it is being ported to Multicore OCaml, and this is a work in = progress.

  • raytracers

    Raytracers is a repository that contains ray tracer implementation for diff= erent parallel functional programming languages. The OCaml implementation h= as now been updated to use the new Domainslib.Task API.

    Also, a few experiments were performed on flambda parameter= s for the Multicore raytracer which gives around 25% speedup, but it does n= ot yet remove the boxing of floats. The experiments are to be repeated with= a merge against the wip flambda2 trees on 4.11, that removes float boxing.

OCaml

  • Ongoing
    • ocaml/ocaml#9082 Eventlog tracing system

      A substantial number of commits have gone into this PR based on reviews and= feedback. These include updates to the configure script, handling warnings= and exceptions, adding build support for Windows, removing unused code and= coding style changes. This patch will be cherry-picked for the 4.11 releas= e.

  • Completed
    • ocaml/ocaml#9353 Reimplement output_value using a hash table to detect sharing

      This PR which implements a hash table and bit vector as required for Multic= ore OCaml has been merged to 4.11.

    Our thanks as always go to all the OCaml developers and users in the commun= ity for their continued support, and contribution to the project!

Acronyms

  • API: Application Programming Interface
  • GC: Garbage Collector
  • PIP: Pip Installs Python
  • PR: Pull Request
  • SMT: Satisfiability Modulo Theories
  • UI: User Interface

Why did Core remove polymorphic comparison operators in OCaml = 4.10.0?

Trung Ta asked

I'm using the Core library in a project, and recently when I upgraded my OC= aml from 4.08.1 to 4.10.0, plenty of compilation errors suddenly appears for comparison expressions like:

if (xs =3D []) then ... or if (x =3D true) then ...

I saw that this change was discussed in this thread about monomorphic comparison operators in Base, but did not expect that Core woul= d make it a default behavior.

So I'd like to ask since which version that Core removed such polymorphic c= omparison operators? (I couldn't find it in release notes of Core)

Also, if I defined a sum type like type ternary =3D True | False | Un= kn, what will be a correct way to write if (x =3D True) then ... (which is allowed in the new Core)?

I can temporarily fix by writing if (x =3D=3D True) then ..., = but using =3D=3D doesn't seem correct, since =3D=3D is about comparing physical objects…

Thanks for spending your time to check my question.

Aaron L. Zeng replied

The change was announced in https://discuss.ocaml.org/t/ann-v0-= 13-release-of-jane-street-packages/4735, although unfortunately it doesn't look like the CHANGES.md file was updated in the r= epo. I would consider the thread to be the canonical announcement.

Also, if I defined a sum type like type ternary =3D True | False | Un= kn , what will be a correct way to write if (x =3D True) then ... (which is allowed in the new Core)?

Here's a few suggestions:

  1. Define equality/compare functions using ppx_compare

    type ternary =3D True | False | Unkn [@@deriving equal]
    
    let f x =3D =
    if (equal_ternary x True) then ...
    
  2. Define equality/compare functions manually

    let equal_ternary t1 t2 =3D
      match t1, t2 with
      | True,=
     True | <=
    span style=3D"color: #000000; background-color: #ffffff;">False, False | Unkn, Unkn -> true
      | _ -> false
    
  3. Explicitly request polymorphic comparison operators using the Poly module:

    let f x =3D if (Poly.(=3D=
    ) x True<=
    /span>) then ...
    

Trung said and Aaron L. Zeng replied

btw,

type ternary =3D True | False | Unkn [@@deriving equal]

should be: [@@deriving eq]

That depends on which preprocessor you are using. [@@deriving equal]= comes from ppx_compare, whereas [@@deriving eq] comes from ppx_deriving. Base/Core and the like have better support for the former, which is a Jane Street project, although you can fe= el free to use the latter—the naming conventions are different, so it may not be as convenient.

New release of js_of_ocaml 3.6.0

Hhugo announced

I'm pleased to announce the release Js_of_ocaml 3.6.0.

Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po= ssible to run pure OCaml programs in JavaScript environment like browsers and Node.js.

Try it online.

Notable changes:

  • The js_of_ocaml compiler now accepts sub-commands (link, b= uild-runtime, build-fs, ..). The plan for future versions is to remove othe= r binary (e.g. jsoo_link) and consolidate everything inside the js_of= _ocaml binary itself.
  • The standard JavaScript runtime is now embedded in the compiler (findli= b is no longer needed to locate it)
  • Add support for the Str library (Regular expressions and high-level str= ing processing) shipped with the OCaml compiler
  • Change memory representation of Int64.t (you might need to= update your JavaScript stubs)
  • Many bug fixes (thanks to many more tests)

Kirill Alexander Khalitov asked and Hhugo replied

1 Does the project have roadmap?

There is no official roadmap, the project evolves based on issues, requests= and contributions. You can take a look at some of the Github issues

2 Is the project generally exists only for Ocsigen needs?

js_of_ocaml is used by various projects, not only Ocsigen. See Bonsai, sketch-sh or jscoq for instance.

3 Will it be adopted for modern front-end development (commonjs/esmodules c= ompatibility for working with existing building tools ex. webpack, etc).

Being more friendly with the JavaScript ecosystem as been discussed here an= d there in the past but little has been done, possibly by lack of interest or use cases.

4 Does the project competing with bucklescript?

I don't think so. The two projects have different goals and different audie= nce. One of Js_of_ocaml main goal is to stay as close as possible to the official OCaml semantic, allowing to lever= age existing OCaml libraries without any modification.

5 Why not to do ocaml to js compiler tools (based on js_of_ocaml and buckle= script experience) that combine possibility of using native ocaml and js li= braries across back-end and front-end like implemented in Scala.js/Fable F#?

I don't understand this question. I would expect both js_of_ocaml and buckl= escript to be like Scala.js/Fable F# in their own way.

Kirill Alexander Khalitov then said

I mean what Scala.js/Fable F# allows to use the most native libraries (not = all) and JS ones (from npm registry or from custom JS module) in one project (ex. front-end). But in case of js_of= _ocaml we limited to native OCaml libs and "HTML scripts" (not JS compatible modules). For bucklescript case we have w= hole JS ecosystem but have no access to useful native libs from opam registry.

Xavier Van de Woestyne replied

In Js_of_OCaml, you can deal with JavaScript's module (and npm/yarn), using= for example:

(* val require : string -> 'a *)
let require module_=
name =3D
  let open Js.Unsafe "require")
    [|inject (Js.string module_name)=
|]

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 017457EC77 for ; Tue, 5 May 2020 09:45:47 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=X8I6=6T=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AY+pYVhxBQaseadzXCy+O+j09IxM/srCxBDY+r6Qd?= =?us-ascii?q?0ukQKvad9pjvdHbS+e9qxAeQG9mCtrQb1qGP6vGocFdDyK7JiGoFfp1IWk1Nou?= =?us-ascii?q?QttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZr?= =?us-ascii?q?KeTpAI7SiNm82/yv95HJbAhEmTqwbalwIRi2ogndq9QajI9/Iast1xXFpWdFdf?= =?us-ascii?q?5Lzm1yP1KTmBj85sa0/JF99ilbpuws+c1dX6jkZqo0VbNXAigoPGAz/83rqALM?= =?us-ascii?q?TRCT6XsGU2UZiQRHDg7Y5xznRJjxsy/6tu1g2CmGOMD9UL45VSi+46ptVRTnjz?= =?us-ascii?q?oJNyMi8GHPlMN/kL5brhympxx62YHUYYeVP+d6cq7Sed4WQGxMUsZSWSxHHIO8?= =?us-ascii?q?bpAPD+saMuZcsYb2ulUPrRykBQaxH+Pk1ztEi3Hq0aE/1ekqDAPI0xE6H98WsH?= =?us-ascii?q?rassj7OqkRX++60KbF1i/MY+9M1Drn9ITEbhIsrPeRVrxwa8rRzkwvGhvZg1WU?= =?us-ascii?q?s4PlOS6e2PkRvGib6upgVP6vi3I6oAx2uDevwt0jio/TioIO1l/E9SB5wIcpJd?= =?us-ascii?q?2kU0N7edmkEJ9QtiGGKYR5XsMiQ2dpuCYj170Jp4S3fC8QyJQo3hPSbeGMfIeU?= =?us-ascii?q?7Bz5TumRPSt4i2x/eLK5nxu8/0ytxOLzWMS231tHrS5In8TDu30TyRDe98aKRP?= =?us-ascii?q?R+80qv1zuC2Rze5+NELE03kafVK54vz78+mJcRsUrNHiD7lUPrh6GYcUUk//Kn?= =?us-ascii?q?6+XhYrj+vp+TKZN0igDiMqswgsy/BuE4Mg0QUGSB/+SzyqHj8VX+QLpWlPI2l6?= =?us-ascii?q?3ZvIrdJcQBqa61GwBV0oc/6xa/Ejepy84UkmUALFJAYB6HgInpO03OIPDlFviz?= =?us-ascii?q?mVWskDBzy/DBIrLuGJDNLnzanLj6erZ97E1cxBAvwtBY4pJYErABIPTpWk/wrt?= =?us-ascii?q?PUFBE5Mxasz+bmDtV9zIIeVniVDqODPqPSq0eE6f4oI+mWYo8apjL9K/w/6/Hw?= =?us-ascii?q?kHA5hEcRcrKo3ZsLc3+4A+hpI0aHbnrwmNsBFn0KvgUmQOP0kl2CSyRcZ2qzX6?= =?us-ascii?q?Il+zE0FpiqApvDRoy1gbyOwSe6HplSZmxcDVCMC3joeoOZUPkPcCKfOtJtniIA?= =?us-ascii?q?WLS7VoMtyR6juBX0xrZ7NObZ9CIVuYrh2dV2/eHfix4/+SJuA8iA3GyBVXx4k2?= =?us-ascii?q?wUSzIwwatxu1Zyyk2Z3qh9m/FYFcJc5/dOUgoiMJ7dwPF2B8rqWgLGeteISEqm?= =?us-ascii?q?Tcu6DjExSNIxwsYOY1tjFNm4iRDDxSWqD6cUl7yNGpM07rrR02XvK8t50XrKyb?= =?us-ascii?q?UtglY8TsZBKWGqnKBy+gfLC47MiUqZlqKqdaoG3C7K8WeO1XeAsl1FXgJsSajK?= =?us-ascii?q?XHMSaEjXoNnh507MUaejCawgMgtFyc+CNrVFZcHpjVVARffjIcnebHyrl2e3Hx?= =?us-ascii?q?aIyauBY5Due2oH2iXRElMEnBwT/XaDNAg+GjuhrnnFAzxpCFLvZV/j/vdlqH+h?= =?us-ascii?q?S085wA6LY1dm17qv9R4ZneacRO8L3rIYpCchrC15E0qn0NLTD9qMvg5hfKRHYd?= =?us-ascii?q?Mh+1pHzmLYtwllPpO6Naxih1gecx52v0z0zRl3BJ9AwoAWqyZgyBV0Y+rM1ExH?= =?us-ascii?q?XzeH29b2N6GBbiG49w+pIeaejlrB1v6S+7wT87I5p0TnuEeuDEV0tz1s2txRln?= =?us-ascii?q?+d/YniDQwIUJu3XFxzvxN9oqnyZigm+5iS0mdmMLW9tjHFy5QkGbgL0BGlKv5b?= =?us-ascii?q?OaXMLwTyFswGG4D6IegjnR6yZRIBPfxO3LYzO9K6evCG3q+yIesmmyip2zcUqL?= =?us-ascii?q?th216BonIvAtXD2IwIlq7Jh1fVZ3LHlF6k9/vPt8VcfzhLTzinziz1GINaZqtz?= =?us-ascii?q?ZJsGT2C0LJ/un4Qst9vWQ3ddsWWbKRYD0c6tdwCVagWijwdXyEIcrGfhnHeoiT?= =?us-ascii?q?tunGNw9/fN7Gn12+3nMSE/FCtLSW1l1wy+JJjtycgdWFm0YgMpkhq8+Eu8wLJU?= =?us-ascii?q?9v1y?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0CeAgCqGLFehyIeaIFmg3VYPgFcVTIqh?= =?us-ascii?q?COBXYckhX6FHwKFL5E4gRADAk4PAQMBDBgBBQ4BAgQBAYFQgT5xQQICAheCHx0?= =?us-ascii?q?GAQUzEwIQAQEFAQEBAgECAwQBEwEBAQoLCQgphTEGJgyCOwwMAwODHQMBIQQGQ?= =?us-ascii?q?CUjAxQBBgMCBA0BFwEUChcBEhQGglY2AYJ8BAEKlxebeX8zhDkBAwQPAQ4JhFi?= =?us-ascii?q?BQA0CE38XhSyDHYNVJg+BTD+BEYISUGyBQYENDgsBAQEBAYEoGAEBVoJcF4JJB?= =?us-ascii?q?I5IgQ2QZ4IPkAYHgkt/BIYgdYl+U4VKglszWYdVhHuMaSGPdocqdAmBLYVUiXi?= =?us-ascii?q?EJIE/KlhvHgwHMxowQ4I1AQEyCV8NVo0yg2ABCIIbKGpUgSaBdTuFFDA/MwIBA?= =?us-ascii?q?QcsAgYBBwEBAwl1AQEFEwsBkE9cAQE?= X-IPAS-Result: =?us-ascii?q?A0CeAgCqGLFehyIeaIFmg3VYPgFcVTIqhCOBXYckhX6FHwK?= =?us-ascii?q?FL5E4gRADAk4PAQMBDBgBBQ4BAgQBAYFQgT5xQQICAheCHx0GAQUzEwIQAQEFA?= =?us-ascii?q?QEBAgECAwQBEwEBAQoLCQgphTEGJgyCOwwMAwODHQMBIQQGQCUjAxQBBgMCBA0?= =?us-ascii?q?BFwEUChcBEhQGglY2AYJ8BAEKlxebeX8zhDkBAwQPAQ4JhFiBQA0CE38XhSyDH?= =?us-ascii?q?YNVJg+BTD+BEYISUGyBQYENDgsBAQEBAYEoGAEBVoJcF4JJBI5IgQ2QZ4IPkAY?= =?us-ascii?q?Hgkt/BIYgdYl+U4VKglszWYdVhHuMaSGPdocqdAmBLYVUiXiEJIE/KlhvHgwHM?= =?us-ascii?q?xowQ4I1AQEyCV8NVo0yg2ABCIIbKGpUgSaBdTuFFDA/MwIBAQcsAgYBBwEBAwl?= =?us-ascii?q?1AQEFEwsBkE9cAQE?= X-IronPort-AV: E=Sophos;i="5.73,354,1583190000"; d="scan'208,217";a="448208304" X-MGA-submission: =?us-ascii?q?MDFUpPpTFQULVlcMogY/N7jIn/rlEJmcK8qzAb?= =?us-ascii?q?e1dGYC3MK7k14Ut5QdVK6adw6RiX0Fi1vSH22ILwr7PhDUcS0buQCWSJ?= =?us-ascii?q?xFle0Tu+9vzCXFQ2XxxiGSDUdcvodeVFV7Wwpio39wLv+wx9x9nQ9s98?= =?us-ascii?q?SK8dZSlKIiZaqBHw3uQt9Z8w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 May 2020 09:45:46 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 16BA6561292; Tue, 5 May 2020 09:45:42 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 05 May 2020 09:45:41 +0200 Message-ID: <87368eddui.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 5 09:45:42 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.030086, queueID=CF38D561296 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgQXByaWwgMjggdG8gTWF5DQowNSwgMjAyMC4N Cg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpMd3Qgbm93IGhhcyBs ZXQqIHN5bnRheA0KSk9TRSAwLjMuMCAtIE5vdyB3aXRoIDEwMCUgbW9yZSBl bmNyeXB0aW9uDQpBcmUgdGhlcmUgbGVhcm5pbmcgbWF0ZXJpYWxzIGZvciBP Q2FtbCBmb3IgdGhvc2Ugd2l0aCBubyBwcm9ncmFtbWluZyBleHBlcmllbmNl Pw0KVGhlIHJlY2VudCBldm9sdXRpb24gb2YgdXRvcCwgbGFtYmRhLXRlcm0s IHplZCBhbmQgdW5kZXJuZWF0aCBwcm9qZWN0cw0KTG9va2luZyBmb3IgImxv dmVseSwgaWRpb21hdGljIiBleGFtcGxlcyBvZiBPY2FtbCB1c2VkIGZvciBz aGVsbC1zY3JpcHRpbmcgaW4gdGhlIG1hbm5lciBvZiBQZXJsL1B5dGhvbiAo YnV0IGVzcC4gUGVybCkNCk9sZCBDV04NCg0KDQpMd3Qgbm93IGhhcyBsZXQq IHN5bnRheA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sd3Qtbm93LWhhcy1s ZXQtc3ludGF4LzU2NTEvMV0NCg0KDQpBbnRvbiBCYWNoaW4gYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbTHd0XSBub3cgaGFzIGBs ZXQqJyBhbmQgYGxldCsnIHN5bnRheCwgd2hpY2ggY2FuIGJlIHVzZWQgbGlr ZSB0aGlzOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BlbiBMd3Qu U3ludGF4DQogIOKUgiANCiAg4pSCIGxldCAoKSA9DQogIOKUgiAgIGxldCBy ZXF1ZXN0ID0NCiAg4pSCICAgICBsZXQqIGFkZHJlc3NlcyA9IEx3dF91bml4 LmdldGFkZHJpbmZvICJnb29nbGUuY29tIiAiODAiIFtdIGluDQogIOKUgiAg ICAgbGV0IGdvb2dsZSA9IEx3dF91bml4LigoTGlzdC5oZCBhZGRyZXNzZXMp LmFpX2FkZHIpIGluDQogIOKUgiANCiAg4pSCICAgICBMd3RfaW8uKHdpdGhf Y29ubmVjdGlvbiBnb29nbGUgKGZ1biAoaW5jb21pbmcsIG91dGdvaW5nKSAt Pg0KICDilIIgICAgICAgbGV0KiAoKSA9IHdyaXRlIG91dGdvaW5nICJHRVQg LyBIVFRQLzEuMVxyXG4iIGluDQogIOKUgiAgICAgICBsZXQqICgpID0gd3Jp dGUgb3V0Z29pbmcgIkNvbm5lY3Rpb246IGNsb3NlXHJcblxyXG4iIGluDQog IOKUgiAgICAgICBsZXQqIHJlc3BvbnNlID0gcmVhZCBpbmNvbWluZyBpbg0K ICDilIIgICAgICAgTHd0LnJldHVybiAoU29tZSByZXNwb25zZSkpKQ0KICDi lIIgICBpbg0KICDilIIgDQogIOKUgiAgIGxldCB0aW1lb3V0ID0NCiAg4pSC ICAgICBsZXQqICgpID0gTHd0X3VuaXguc2xlZXAgNS4gaW4NCiAg4pSCICAg ICBMd3QucmV0dXJuIE5vbmUNCiAg4pSCICAgaW4NCiAg4pSCIA0KICDilIIg ICBtYXRjaCBMd3RfbWFpbi5ydW4gKEx3dC5waWNrIFtyZXF1ZXN0OyB0aW1l b3V0XSkgd2l0aA0KICDilIIgICB8IFNvbWUgcmVzcG9uc2UgLT4gcHJpbnRf c3RyaW5nIHJlc3BvbnNlDQogIOKUgiAgIHwgTm9uZSAtPiBwcmVycl9lbmRs aW5lICJSZXF1ZXN0IHRpbWVkIG91dCI7IGV4aXQgMQ0KICDilJTilIDilIDi lIDilIANCg0KICBUaGlzIGlzIG5vdyByZWxlYXNlZCBpbiBMd3QgWzUuMy4w XS4gVGhhbmtzIHRvIFJhaHVsIEt1bWFyIGZvciBhZGRpbmcNCiAgYGxldCon LCBhbmQgQENyYWlnRmUgZm9yIGFkZGluZyBgbGV0KychDQoNCg0KW0x3dF0g aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0DQoNCls1LjMuMF0gaHR0 cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3JlbGVhc2VzL3RhZy81LjMu MA0KDQoNClRob21hcyBDb29wbWFuIGFza2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBBd2Vzb21lIHRoaXMgbG9va3MgZ3JlYXQuDQoNCiAgMiBxdWljayBx dWVzdGlvbnM6DQoNCiAgMS4gSSBkb24ndCBzZWUgdGhpcyBuZXcgdmVyc2lv biBkb2N1bWVudGVkIG9uIG9jc2lnZW4geWV0PyBJcyB0aGF0IGENCiAgICAg YnVpbGQgdGhhdCBuZWVkcyB0byBiZSBkb25lIG1hbnVhbGx5Pw0KICAyLiBJ cyBgcHB4X2x3dCcgc3RpbGwgcmVjb21tZW5kIGZvciBzb21lIHVzZWNhc2Vz IGxpa2UgYHRyeSUnPyBGb3INCiAgICAgd2hhdCBjYXNlcyBpcyBvbmUgcHJl ZmVycmVkIG92ZXIgdGhlIG90aGVyPw0KDQoNCkFudG9uIEJhY2hpbiByZXBs aWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBHb29kIHF1ZXN0aW9ucyA6c2xp Z2h0X3NtaWxlOg0KDQogIDEuIFRoZSBkb2NzIGdlbmVyYXRpb24gaXMgYmxv Y2tlZCBvbiBhbiBPY3NpZ2VuICJpbnRlcm5hbCIgcGFja2FnZQ0KICAgICBg d2lraWRvYycsIHdoaWNoIGhhcyBub3QgYmVlbiB1cGRhdGVkIHRvIHN1cHBv cnQgNC4wOC4gU28sDQogICAgIGVmZmVjdGl2ZWx5LCBgbGV0KicgaXMgZXhh Y3RseSB3aGF0IGlzIHByZXZlbnRpbmcgZG9jcyBnZW5lcmF0aW9uDQogICAg IGZvciB0aGUgdGltZSBiZWluZy4gSSdsbCBwb3N0IHRoZSBkb2NzIGFzIHNv b24gYXMgdGhhdCBpcyBmaXhlZC4NCiAgMi4gYHBweF9sd3QnIGlzIHByb2Jh Ymx5IHN0aWxsIHRoZSByZWNvbW1lbmRlZCB3YXksIGJlY2F1c2Ugb2YgYmV0 dGVyDQogICAgIGJhY2t0cmFjZXMsIGFuZCB0aGluZ3MgbGlrZSBgdHJ5JWx3 dCcuIGBsZXQqJyBpcyBuaWNlIGZvciBwZW9wbGUNCiAgICAgdGhhdCBkb24n dCB3YW50IHRvIHVzZSB0aGUgUFBYLiBUaGV5IGNhbiBzdGlsbCBiZW5lZml0 IGZyb20gYQ0KICAgICBtb25hZGljIHN5bnRheC4NCg0KDQpKT1NFIDAuMy4w IC0gTm93IHdpdGggMTAwJSBtb3JlIGVuY3J5cHRpb24NCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFto dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpvc2UtMC0zLTAtbm93 LXdpdGgtMTAwLW1vcmUtZW5jcnlwdGlvbi81NjY3LzFdDQoNCg0KVWxyaWsg U3RyaWQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHJl Y2VudGx5IHJlbGVhc2VkIGEgdmVyc2lvbiAwLjMuMCBvZiBKT1NFLg0KDQog IFtodHRwczovL2dpdGh1Yi5jb20vdWxyaWtzdHJpZC9yZWFzb24tam9zZV0N CiAgW2h0dHBzOi8vdWxyaWtzdHJpZC5naXRodWIuaW8vcmVhc29uLWpvc2Vd DQoNCiAgSXQgbm93IGluY2x1ZGVzIHNvbWUgb2YgdGhlIEpXRSAoSlNPTiBX ZWIgRW5jcnlwdGlvbikgc3BlYy4gQSBodWdlDQogIHRoYW5rIHlvdSBnb2Vz IG91dCB0byBAaGFubmVzIGZvciBoZWxwaW5nIG1lIGltcGxlbWVudGluZyBv bmUgb2YgdGhlDQogIGduYXJsaWVyIGNvbWJpbmF0aW9ucyBvZiBkZWNyeXB0 aW9uIHRoYXQgSSBjb3VsZCB0aGVuIHVzZSBhcyBhIGJhc2UNCiAgZm9yIGVu Y3J5cHRpb24gYW5kIG1vcmUgYGFsZycgYW5kIGBlbmMnLg0KDQogIEkgYWxz byByZWZhY3RvcmVkIHRoZSBKV0sgKEpTT04gV2ViIEtleXMpIGltcGxlbWVu dGF0aW9uIHRvIHVuaWZ5IGFuZA0KICBzaW1wbGlmeSB0aGUgcmVwcmVzZW50 YXRpb24uIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgYSBwcml2YXRlIGtl eQ0KICBmb3IgYW55dGhpbmcgYSBwdWJsaWMga2V5IGNhbiBkbyBzaW5jZSBp dCdzIGEgc3VwZXJzZXQuDQoNCiAgQSBzcGVjaWFsIHRoYW5rcyB0byBAYW5t b250ZWlybyBmb3IgaGVscGluZyBtZSB3aXRoIHRoZSBkZXNpZ24gYW5kDQog IHJldmlld2luZyBteSBjb2RlLg0KDQoNCkFyZSB0aGVyZSBsZWFybmluZyBt YXRlcmlhbHMgZm9yIE9DYW1sIGZvciB0aG9zZSB3aXRoIG5vIHByb2dyYW1t aW5nIGV4cGVyaWVuY2U/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FyZS10aGVyZS1s ZWFybmluZy1tYXRlcmlhbHMtZm9yLW9jYW1sLWZvci10aG9zZS13aXRoLW5v LXByb2dyYW1taW5nLWV4cGVyaWVuY2UvNTY4NC8xXQ0KDQoNCkFhcm9uIENo cmlzdGlhbnNvbiBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT0NhbWwgaXMgYSBsYW5ndWFnZSB3aXRoIHNvbWUgYWR2YW5jZWQg ZmVhdHVyZXMsIGJ1dCBhIHZlcnkgZ2VudGxlDQogIGxlYXJuaW5nIGN1cnZl LiBJdCBzZWVtcyBsaWtlIGl0IHdvdWxkIGJlIHdlbGwtc3VpdGVkIHRvIHRl YWNoaW5nDQogIGJlZ2lubmVycyB0byBwcm9ncmFtIChhIGZldyB0cmlja3kg ZXJyb3IgbWVzc2FnZXMgbm90d2l0aHN0YW5kaW5nKSwNCiAgYnV0IEkgaGF2 ZW4ndCBzZWVuIG1hbnkgcmVzb3VyY2VzIHRhcmdldGVkIGF0IHRlYWNoaW5n IHByb2dyYW1taW5nDQogIGZyb20gc2NyYXRjaC4gRG9lcyBhbnlvbmUgaGVy ZSBrbm93IGFueT8NCg0KDQpEYW5pZWwgQsO8bnpsaSByZXBsaWVkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGVyZSBpcyBbKk9DYW1sIGZyb20gdGhl IFZlcnkgQmVnaW5uaW5nKl0gd3JpdHRlbiBieSBASm9obldoaXRpbmd0b24u DQoNCg0KWypPQ2FtbCBmcm9tIHRoZSBWZXJ5IEJlZ2lubmluZypdIGh0dHA6 Ly9vY2FtbC1ib29rLmNvbS8NCg0KDQpOaWNvbMOhcyBPamVkYSBCw6RyIGFs c28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgQW4gZXhjZWxsZW50IChmcmVlKSBib29rIGlz ICJMRSBMQU5HQUdFIENBTUwiDQogIFtodHRwczovL2NhbWwuaW5yaWEuZnIv cHViL2Rpc3RyaWIvYm9va3MvbGxjLnBkZl0uDQoNCg0KUGllcnJlIGFsc28g cmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlcmUncyBhbHNvIFtDUzMx MTBdIGZyb20gQ29ybmVsbCBVbml2ZXJzaXR5LiBIZXJlJ3MgW3RoZQ0KICB0 ZXh0Ym9va10uIEl0J3MgcHJldHR5IGdyZWF0IQ0KDQoNCltDUzMxMTBdIGh0 dHBzOi8vd3d3LmNzLmNvcm5lbGwuZWR1L2NvdXJzZXMvY3MzMTEwLzIwMjBz cC8NCg0KW3RoZSB0ZXh0Ym9va10NCmh0dHBzOi8vd3d3LmNzLmNvcm5lbGwu ZWR1L2NvdXJzZXMvY3MzMTEwLzIwMTlzcC90ZXh0Ym9vay8NCg0KDQpUaGUg cmVjZW50IGV2b2x1dGlvbiBvZiB1dG9wLCBsYW1iZGEtdGVybSwgemVkIGFu ZCB1bmRlcm5lYXRoIHByb2plY3RzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3RoZS1yZWNlbnQtZXZvbHV0aW9uLW9mLXV0b3AtbGFtYmRh LXRlcm0temVkLWFuZC11bmRlcm5lYXRoLXByb2plY3RzLzU2ODcvMV0NCg0K DQpaQU4gRG9ZZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpLCBkZWFy IE9DYW1sIGd1eXMhIFdlJ3ZlIGJlZW4ga2VlcGluZyBxdWlldCBmb3IgbW9y ZSB0aGFuIG9uZSB5ZWFyDQogIHRob3VnaCB1dG9wLCBsYW1iZGEtdGVybSwg emVkIGFuZCBzb21lIHJlbGF0ZWQgcHJvamVjdHMgd2VyZSBzdGlsbA0KICBl dm9sdmluZyBkdXJpbmcgdGhlIHBlcmlvZCBvZiB0aW1lLiBUaGlzIGlzIGJl Y2F1c2Ugb2YgdHdvIHJlYXNvbnM6DQoNCiAgMS4gVGhlIG5ldyBmZWF0dXJl IGhhZCBub3RoaW5nIHRvIGRvIHdpdGggdGhlIGZpZWxkcyB3aGVyZSBtb3N0 IE9DYW1sDQogICAgIGRldmVsb3BlcnMgYXJlIHdvcmtpbmcgb246DQoNCiAg ICAgW2h0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDEx L3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvYS9hMzBkNWZiNmZjMDc1YTUw ODAxYjM4NzI5OWNjODIwOTY1ZDQ4Y2EwLnBuZ10NCg0KICAgICBbaHR0cHM6 Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fkcy9v Y2FtbC9vcmlnaW5hbC8yWC85LzkxYjg4ZjBjNDkyNzAyMjEyZjAwZjE3YWYx YmYwZTE4ZWUxYTQ2M2IucG5nXQ0KDQogICAgIFJlY29nbml6aW5nLCBlZGl0 aW5nLCBmdXp6eSBzZWFyY2hpbmcgZm9yIENoYXJhY3Rlcg0KICAgICBWYXJp YXRpb24obWFpbmx5IGZvciBhbmNpZW50IENKSyBjaGFyYWN0ZXJzKS4NCg0K ICAgICBOZXZlcnRoZWxlc3MsIHRoZSBuZXcgZmVhdHVyZSBicm91Z2h0IHVz IGEgZ29vZCBzaWRlIGVmZmVjdCDigJMgdGhlDQogICAgIGxvbmctZXhpc3Rp bmcgW0lzc3VlIHdpdGggYXNpYW4gY2hhcnNldF0gd2FzIHJlc29sdmVkLiBV VG9wIHVzZXJzDQogICAgIHdpbGwgbm90aWNlIHRoZSByZWZpbmVtZW50IG5h dHVyYWxseSwgc28gbm8gYW5ub3VuY2VtZW50IHdhcw0KICAgICBuZWVkZWQu DQoNCiAgMi4gSSBkaWRuJ3QgZGVlbSB0aGUgZmlyc3QgZmV3IG5ldyBlZGl0 aW9ucyBvZiB6ZWQgMiBhbmQgbGFtYmRhLXRlcm0gMg0KICAgICBzdGFibGUg ZW5vdWdoLg0KDQoNCltJc3N1ZSB3aXRoIGFzaWFuIGNoYXJzZXRdDQpodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtY29tbXVuaXR5L2xhbWJkYS10ZXJtL2lz c3Vlcy8yDQoNCjMuMCBlcmENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IFRoaXMgdGltZSwgd2UgYXJlIGVudGVyaW5nIHplZCAzLCBsYW1iZGEtdGVy bSAzIGVyYS4gVGhlIGZlYXR1cmVzDQogIGludHJvZHVjZWQgc2luY2UgemVk IDIsIGxhbWJkYS10ZXJtIDIgYXJlIHF1aXRlIHN0YWJsZSBub3cgYW5kIHRo ZSBuZXcNCiAgZmVhdHVyZSBjb21pbmcgdG8gdXMgd2lsbCBoYXZlIGEgYml0 IG1vcmUgaW1wYWN0LCBlc3BlY2lhbGx5IHRvIHZpbQ0KICB1c2Vycy4gU28g aXQncyB3b3J0aHdoaWxlIHRvIGRyYWZ0IGFuIGFubm91bmNlbWVudDoNCg0K DQril4ogVkkgRWRpdGluZyBNb2RlDQoNCiAgW2h0dHBzOi8vYXdzMS5kaXNj b3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwvb3JpZ2lu YWwvMlgvYy9jYTExOTI0MDQ2OTc3ZDg5ZDQzNDVhZDEzNTk3N2M2OTYwNDcw ZWRjLmdpZl0NCg0KICBPQ2FtbCBndXlzLCBob3BlIHlvdSBlbmpveSB0aGlz Lg0KDQoNCkxpc3Qgb2Ygbm90YWJsZSBjaGFuZ2VzOg0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIHplZCAyOg0KICAgIOKAoiB3aWRl LCBjb21iaW5lZCBnbHlwaChDaGFyYWN0ZXIgVmFyaWF0aW9uLCBJUEEsIENK SyDigKYpDQogICAg4oCiIGFkZCB3YW50ZWRfY29sdW1uIHN1cHBvcnQgZm9y IHdpZGUgd2lkdGggY2hhcmFjdGVyDQoNCiAg4oCiIGxhbWJkYS10ZXJtIDI6 DQogICAg4oCiIHdpZGUsIGNvbWJpbmVkIGdseXBoKENoYXJhY3RlciBWYXJp YXRpb24sIElQQSwgQ0pLIOKApikNCiAgICDigKIgYWRkIGhvcml6b250YWwg c2Nyb2xsaW5nIHN1cHBvcnQgZm9yIHdpZGUgd2lkdGggY2hhcmFjdGVyDQoN CiAg4oCiIHplZCAzOg0KICAgIOKAoiBhZGQgbmV3IGFjdGlvbnMgZm9yIGNv bnZlbmllbmNlDQoNCiAg4oCiIGxhbWJkYS10ZXJtIDM6DQogICAg4oCiIGBM VGVybV9yZWFkX2xpbmUnOiBhZGQgaW5pdGlhbCBzdXBwb3J0IGZvciB2aSBl ZGl0aW5nIG1vZGU6DQogICAg4oCiIG1vdGlvbnM6DQogICAgICDigKIgaCBs IDAgXiAkDQogICAgICDigKIgaiBrIGdnIEcNCiAgICAgIOKAoiB3IFcgZSBF IGIgQiBnZSBnRQ0KICAgICAg4oCiIGYgRiB0IFQNCiAgICAgIOKAoiBhdyBp dyBhVyBpVw0KICAgICAg4oCiIGluY2x1ZGUgb3IgaW5uZXIgKCApLCBbIF0s IHsgfSwgPCA+LCAnIGFuZCAiDQogICAgICDigKIgZ2VuZXJpYyBxdW90ZTog YXE/IGlxPyB3aGVyZSA/IGNvdWxkIGJlIGFueSBjaGFyYWN0ZXINCiAgICAg IOKAoiBicmFja2V0IG1hdGNoaW5nOiBqdW1wIGJhY2sgYW5kIGZvcnRoIGJl dHdlZW4gbWF0Y2hlZCBicmFja2V0cw0KICAgIOKAoiBkZWxldGUsIGNoYW5n ZSwgeWFuayB3aXRoIG1vdGlvbnMNCiAgICDigKIgcGFzdGU6IHAgUA0KICAg IOKAoiBsaW5lIGpvaW5pbmc6IEoNCg0KICBmb3IgYSBmdWxsIGxpc3Qgb2Yg dGhlIGNoYW5nZXMsIHBsZWFzZSB2aXNpdCB0aGUgaG9tZXBhZ2VzIG9mIGVh Y2gNCiAgcHJvamVjdC4NCg0KDQpQcm9qZWN0cyB1bmRlcm5lYXRoOg0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFtjaGFySW5mb193aWR0aF06IERldGVy bWluZSBjb2x1bW4gd2lkdGggZm9yIGEgY2hhcmFjdGVyDQogIOKAoiBbbWV3 XSAmIFttZXdfdmldOiBNb2RhbCBlZGl0aW5nIHdpdGNoICYgSXRzIFZJIGlu dGVycHJldGVyDQogICAgY29tcGxlbWVudC4gSW4gYSB3b3JkLCBtb2RhbCBl ZGl0aW5nIGVuZ2luZSBnZW5lcmF0b3JzLg0KDQoNCltjaGFySW5mb193aWR0 aF0gaHR0cHM6Ly9iaXRidWNrZXQub3JnL3phbmRveWUvY2hhcmluZm9fd2lk dGgvDQoNClttZXddIGh0dHBzOi8vZ2l0aHViLmNvbS9rYW5kdS9tZXcNCg0K W21ld192aV0gaHR0cHM6Ly9naXRodWIuY29tL2thbmR1L21ld192aQ0KDQoN CldoYXQncyBuZXh0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0K4peKIFZJIEVkaXRpbmcgTW9kZQ0KDQogIDEuIFZpc3VhbCBtb2Rl DQoNCiAgICAgW2h0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFu ZGFyZDExL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNy83Y2M0NTAxMDcx MGFkMjhkOGQxZTg1OWU5YjI4ODA2NDY5ZWY4MDgwLmdpZl0NCiAgMi4gcmVn aXN0ZXIgc3VwcG9ydCBhbmQgbW9yZSB2aSBjb21wYXRpYmxlDQoNCg0K4peK IENKS1YNCg0KICBXZSd2ZSByZWNvcmRlZCBtb3JlIHRoZW4gMTAwIHRob3Vz YW5kIGVudHJpZXMgYWJvdXQgdGhlIHN0cnVjdHVyZSBvZg0KICBDSksgY2hh cmFjdGVycywgd2hhdCBpcyBhIGNoYXJhY3RlciBjb25zaXN0cyBvZiwgaG93 IGFyZSB0aGUNCiAgc3ViLWFzc2VtYmxpZXMgZ2x1ZSB0b2dldGhlciBldGMu IEFuZCBhcyBhIGNvbXBsZW1lbnQgdG8NCiAgY2hhckluZm9fd2lkdGgsIHdl IG1heSByZWxlYXNlIGEgbmV3IHByb2plY3QgY2FsbGVkIGNoYXJJbmZvX3N0 cnVjdHVyZQ0KICA7KQ0KDQoNCkxvb2tpbmcgZm9yICJsb3ZlbHksIGlkaW9t YXRpYyIgZXhhbXBsZXMgb2YgT2NhbWwgdXNlZCBmb3Igc2hlbGwtc2NyaXB0 aW5nIGluIHRoZSBtYW5uZXIgb2YgUGVybC9QeXRob24gKGJ1dCBlc3AuIFBl cmwpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2xvb2tpbmctZm9yLWxvdmVseS1pZGlvbWF0aWMtZXhhbXBsZXMtb2Yt b2NhbWwtdXNlZC1mb3Itc2hlbGwtc2NyaXB0aW5nLWluLXRoZS1tYW5uZXIt b2YtcGVybC1weXRob24tYnV0LWVzcC1wZXJsLzU3MDMvMV0NCg0KDQpDaGV0 IE11cnRoeSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg d29uZGVyIGlmIHRoZXJlIGFyZSBwZW9wbGUgd2hvIGhhdmUgd3JpdHRlbiBu b250cml2aWFsIE9jYW1sIGNvZGUNCiAgZm9yIHNoZWxsLXNjcmlwdGluZywg dGhhdCB0aGV5IHRoaW5rIGV4ZW1wbGlmaWVzIHRoZSByaWdodCB3YXkgdG8g ZG8NCiAgaXQuICBJJ3ZlIGJlZW4gYSBQZXJsIGhhY2tlciBmb3IgMjV5ciwg YW5kIHNvIHdoZW4gSSByZWFjaCBmb3IgT2NhbWwNCiAgdG8gd3JpdGUgc3R1 ZmYgdGhhdCBzaG91bGQgYmUgUGVybCBzaGVsbC1zY3JpcHRzLCBJIGFsd2F5 cyBmaW5kIGl0IGENCiAgYml0IHBhaW5mdWwsIGFuZCB0aGVyZSdzIGEgc2ln bmlmaWNhbnQgb3ZlcmhlYWQgdG8gZ2V0dGluZyB0aGUgam9iDQogIGRvbmUu ICBTb21lIG9mIHRoYXQgaXMgYXBwbHlpbmcgb2NhbWwgdG8gYSBuZXcgZG9t YWluLCBidXQgc29tZSBvZiBpdA0KICBpcyB0aGF0IEknbSBqdXN0IG5vdCB1 c2luZyB0aGUgcmlnaHQgaWRpb21zIGFuZCB0b29scyAoYW5kIHRoZXJlIGFy ZQ0KICBzbyBtYW55IHRvIGNob29zZSBmcm9tKS4NCg0KICBTbyBpZiBhbnli b2R5IGhhcyBnb29kIHBvaW50ZXJzLCBJJ2QgYXBwcmVjaWF0ZSBsZWFybmlu ZyBhYm91dCB0aGVtLg0KDQoNCkJpa2FsIExlbQ0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSGF2ZW4ndCB0cmllZCBpdCBteXNlbGYsIGJ1 dCB0aGlzIGxvb2tzIHByb21pc2luZyDigKYNCiAgW2h0dHBzOi8vZ2l0aHVi LmNvbS9qYW5lc3RyZWV0L3NoZXhwXS4NCg0KICBBdCBsZWFzdCBpdCBoYXMg dGhlIGdyZWF0IFNlYW4gQ29ubmVyeSBpbiBpdHMgUkVBRE1FIHNvIHBvc3Np Ymx5IHdvcnRoDQogIGRlbHZpbmcgYSBiaXQuIDopDQoNCg0KSGV6ZWtpYWgg Q2FydHkNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFtib3NdIHNlZW1zIGxpa2UgaXQgY2FuIGRvIGEgbG90IG9m IHdoYXQgeW91J3JlIGxvb2tpbmcgZm9yLiBJdCdzIGF0DQogIGxlYXN0IHdv cnRoIHRha2luZyBhIGxvb2ssIHRob3VnaCBpdCBtYXkgbm90IGJlIGF0IFBl cmwgbGV2ZWxzIG9mDQogIGNvbmNpc2UgZm9yIHRoaXMga2luZCBvZiB0YXNr Lg0KDQoNCltib3NdIGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2Jv cw0KDQoNCk1hcnRpbiBKYW1ib24NCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgdHJpZWQgdG8gc3VtbWFyaXplIG15 IHRha2Ugb24gdGhlIHN1YmplY3QgaW50byB0aGlzIGdpc3Q6DQogIFtodHRw czovL2dpc3QuZ2l0aHViLmNvbS9tamFtYm9uL2JiMDdiMjRmODlmYTYwYzk3 MzczNTMwN2NlOWM2Y2I5XQ0KDQogIEknbSBub3QgYXdhcmUgb2YgdGhlIGV4 aXN0ZW5jZSBvZiBzdWNoIHRvb2wsIGJ1dCB0aGlzIGlzIGhvdyBJIG1pZ2h0 DQogIGRlc2lnbiBpdC4gVGhpcyBzaG91bGQgYmUgcmVtaW5pc2NlbnQgb2Yg Y2FtbHA0J3MgcXVvdGF0aW9uIGFuZA0KICBhbnRpLXF1b3RhdGlvbiBzeXN0 ZW0sIHdoaWNoIGFsbG93cyBhbHRlcm5hdGluZyBiZXR3ZWVuIHR3byBzeW50 YXhlcw0KICB3aXRoaW4gYSBzb3VyY2UgZmlsZS4NCg0KDQpPbGQgQ1dODQri lZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1p c3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSds bCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3Ro ZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZl c10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5 IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0u DQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2Vd IG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmcNCg0KW3Ro ZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0K DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvY3duL2N3bi5yc3MNCg0KW29ubGluZV0gaHR0cDovL2xp c3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lw0KDQpb QWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvDQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 28 to May 05, 2= 020.

Lwt now has let* syntax

Anton Bachin announced

Lwt now has let* and let+ syntax, which can be used like this:

open Lwt.Syntax

let () =3D
  let request =3D
    let* addresses =3D "google.com"<=
/span> "80" [] in
    let google =3D Lw=
t_unix.((List.hd addresses).a=
i_addr) in

    Lwt_io.(with_connection google (=
fun (incoming, outgoing) ->
      let* () =3D=
 write outgoing "GET / HTTP/1.1\r\n"=
 in
      let* () =3D=
 write outgoing "Connection: close\r\n\r\n"=
 in
      let* response =3D read incoming in
      Lwt.return (Some response)))
  in

  let timeout =3D
    let* () =3D <=
span style=3D"color: #228b22;">Lwt_unix.sleep 5. in
    Lwt.return None
  in

  match Lwt_main.run (Lwt.pick [r=
equest; timeout]) with
  | Some =
response -> print_string response
  | None =
-> prerr_endline "Request timed out"; exit 1

This is now released in Lwt 5.3.0. Thanks to Rahul Kumar for adding let*, and @CraigFe for adding let+!

Thomas Coopman asked

Awesome this looks great.

2 quick questions:

  1. I don't see this new version documented on ocsigen yet? Is that a build= that needs to be done manually?
  2. Is ppx_lwt still recommend for some usecases like tr= y%? For what cases is one preferred over the other?

Anton Bachin replied

Good questions :slight_smile:

  1. The docs generation is blocked on an Ocsigen "internal" package w= ikidoc, which has not been updated to support 4.08. So, effectively,= let* is exactly what is preventing docs generation for the ti= me being. I'll post the docs as soon as that is fixed.
  2. ppx_lwt is probably still the recommended way, because of = better backtraces, and things like try%lwt. let* = is nice for people that don't want to use the PPX. They can still benefit f= rom a monadic syntax.

JOSE 0.3.0 - Now with 100% more encry= ption

Ulrik Strid announced

I recently released a version 0.3.0 of JOSE.

https://github.com/ul= rikstrid/reason-jose
https://ulrikstrid.git= hub.io/reason-jose

It now includes some of the JWE (JSON Web Encryption) spec. A huge thank yo= u goes out to @hannes for helping me implementing one of the gnarlier combinations of decryption that I could th= en use as a base for encryption and more alg and enc.

I also refactored the JWK (JSON Web Keys) implementation to unify and simpl= ify the representation. It is now possible to use a private key for anything a public key can do since it's a superset.

A special thanks to @anmonteiro for helping me with the design and reviewin= g my code.

Are there learning materials for OCam= l for those with no programming experience?

Aaron Christianson asked

OCaml is a language with some advanced features, but a very gentle learning= curve. It seems like it would be well-suited to teaching beginners to program (a few tricky error messages n= otwithstanding), but I haven't seen many resources targeted at teaching programming from scratch. Does anyone here k= now any?

Daniel B=C3=BCnzli replied

There is OCaml from the Very Beginnin= g written by @JohnWhitington.

Nicol=C3=A1s Ojeda B=C3=A4r also replied

An excellent (free) book is "LE LANGAGE CAML" https://caml.inria.fr/pub/distrib/books/llc.= pdf.

Pierre also replied

There's also = CS3110 from Cornell University. Here's the textbook. It's pretty great!

The recent evolution of utop, lambda-= term, zed and underneath projects

ZAN DoYe announced

Hi, dear OCaml guys! We've been keeping quiet for more than one year though= utop, lambda-term, zed and some related projects were still evolving durin= g the period of time. This is because of two reasons:

  1. The new feature had nothing to do with the fields where most OCaml develope= rs are working on:

    3D"a30d5fb6fc07=

    3D"91b88f0c4927=

    Recognizing, editing, fuzzy searching for Character Variation(mainly for an= cient CJK characters).

    Nevertheless, the new feature brought us a good side effect =E2=80=93 the l= ong-existing Issue with asian charset was resolved. UTop users will notice the= refinement naturally, so no announcement was needed.

  2. I didn't deem the first few new editions of zed 2 and lambda-term 2 sta= ble enough.

3.0 era

This time, we are entering zed 3, lambda-term 3 era. The features introduce= d since zed 2, lambda-term 2 are quite stable now and the new feature coming to us will have a bit more impact, es= pecially to vim users. So it's worthwhile to draft an announcement:

  • VI Editing Mode

    3D"ca1192404697=

    OCaml guys, hope you enjoy this.

List of notable changes:

  • zed 2:
    • wide, combined glyph(Character Variation, IPA, CJK …)
    • add wanted_column support for wide width character
  • lambda-term 2:
    • wide, combined glyph(Character Variation, IPA, CJK =E2=80=A6)
    • add horizontal scrolling support for wide width character
  • zed 3:
    • add new actions for convenience
  • lambda-term 3:
    • LTerm_read_line: add initial support for vi editing mode:<= /li>
    • motions:
      • h l 0 ^ $
      • j k gg G
      • w W e E b B ge gE
      • f F t T
      • aw iw aW iW
      • include or inner ( ), [ ], { }, < >, ' and "
      • generic quote: aq? iq? where ? could be any character
      • bracket matching: jump back and forth between matched brackets
    • delete, change, yank with motions
    • paste: p P
    • line joining: J

for a full list of the changes, please visit the homepages of each project.

Projects underneath:

  • charInfo_widt= h: Determine column width for a character
  • mew & mew_vi: Modal editing witch & Its VI in= terpreter complement. In a word, modal editing engine generators.

What's next

  • VI Editing Mode
    1. Visual mode

      3D"7cc45010710a=

    2. register support and more vi compatible
  • CJKV

    We've recorded more then 100 thousand entries about the structure of CJK ch= aracters, what is a character consists of, how are the sub-assemblies glue together etc. And as a complement to charIn= fo_width, we may release a new project called charInfo_structure ;)

Looking for "lovely, idiomatic" examp= les of Ocaml used for shell-scripting in the manner of Perl/Python (but esp= . Perl)

Chet Murthy announced

I wonder if there are people who have written nontrivial Ocaml code for she= ll-scripting, that they think exemplifies the right way to do it. I've been a Perl hacker for 25yr, and so when I re= ach for Ocaml to write stuff that should be Perl shell-scripts, I always find it a bit painful, and there's a signif= icant overhead to getting the job done. Some of that is applying ocaml to a new domain, but some of it is that I'm = just not using the right idioms and tools (and there are so many to choose from).

So if anybody has good pointers, I'd appreciate learning about them.

Bikal Lem

Haven't tried it myself, but this looks promising … https://github.com/janestreet/shexp.

At least it has the great Sean Connery in its README so possibly worth delv= ing a bit. :)

Hezekiah Carty

bos seems like it can do = a lot of what you're looking for. It's at least worth taking a look, though it may not be at Perl levels of concise for this kind= of task.

Martin Jambon

I tried to summarize my take on the subject into this gist: https://gist.github.com/mjambon/bb07b24f89fa60c973735307ce9c6cb9

I'm not aware of the existence of such tool, but this is how I might design= it. This should be reminiscent of camlp4's quotation and anti-quotation system, which allows alternating betw= een two syntaxes within a source file.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 004A87EEE8 for ; Tue, 12 May 2020 09:45:39 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=tH0r=62=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ASTpFXhcT/gwfUmUOxNu2dqiulGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc25ZxyN2/xhgRfzUJnB7Loc0qyK6v2mCDVLuMzY+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi2oAnLssQanIRuJrsvxhfUv3BFZ/?= =?us-ascii?q?lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbD?= =?us-ascii?q?SxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lC?= =?us-ascii?q?sKMSMy/2bKhMxtl6JbuAyuqABjw4DaZ4GVMeBxfqLbfdgHQWZMUcJcWylHD4+8?= =?us-ascii?q?bIUPCfQBPedDr4n8vFQOqQWxDhSiBePo0D9Hm2T21rA+3+kvDQ3K2QotFM8Mvn?= =?us-ascii?q?vJttX4LKccX/6owqfGzjvMYO9Z1Czn54TUaB0su+2AUa5yfMfX1EIhFxnFjlKV?= =?us-ascii?q?qYH9Iz6V0v4Cs26G5OR9Se2vi2snqwBtojiz28whjZPGhoYPxVDC7yl525o6Jd?= =?us-ascii?q?29SE56fd6kDIBdtzmdN4tyQsIiX39ntzo6yr0AuJ67ZTUKx4o9yx7YcfyHfJGF?= =?us-ascii?q?7xT+X+mePTl2nmhqeK6jhxms60igzPXxW8m73VpWrCdIjMXBu24T2hDP6MWKRe?= =?us-ascii?q?Zx8luh1zuT1w3e6P1JLE43mKfaJJAswaA8mJUSvEndAyL6hEX4gq+Ye0gi5+Om?= =?us-ascii?q?5ePnYrD8qZ+dMY95khn+Pboymsy+HeQ3LBAOX2+e+eS5yrLv50v5T6tWjvEula?= =?us-ascii?q?nWrIrVJcEfpqKjBA9VyIkj5w6wDzenzNQYnWQHI0lfdB2biIjpPknCIP/5Dfej?= =?us-ascii?q?h1Sjiixky+raMb3mB5XBNmXDn6vhfbZ890FT0gUzzddF651KF74BPer/Wk73tN?= =?us-ascii?q?zCDx82KRa4w+j9CNll2YMeWH6PAq+EMKzJq1OE/P4gI+6JZIMNpjb9KuMl5+P0?= =?us-ascii?q?gn89gl8dYbSp0oYWaHC/BPhpP0KZYX/0jtcOEGcKogo+TPHxh1GYUD5TYG6+X6?= =?us-ascii?q?Mh6TA7DIKmCZ3PRoe3gLyO2iqwA55YZnheB1yRD3vlc5+IV+oQZC+dOMNsnCAI?= =?us-ascii?q?WaKvRoIuzR2jtgz3x6B5Iufb5CEUr4/v2ddv6+HOmhw+6Tp5BNmH3W6XVWF7hG?= =?us-ascii?q?YISic23K9hpUx9zU+O0a13gvBFD9BT//RJUgM6NJ7A0eN1F9DyWgTAfteQVVap?= =?us-ascii?q?XM+qATYrTtI+29MOYkB9FMu+jh3bwiamHbsYm6aWCJAo/a/QxXb8K9pnx3vI26?= =?us-ascii?q?Qtl1wmTdFONW2iiK5/7Q/TB4vRnkuEi6ikaLgQ0TbR9GmB0WaOpllVXQ9uXajd?= =?us-ascii?q?RXAfYU/WrNTl5kzcU7CuCbInMgpYyc6fNKRGcNrpjU9JRPr7ItveZ3i+m2GqCR?= =?us-ascii?q?aT2ryMbI/qe2QB3CXBE0ULiAcT/WuANQciGCihuHjSDDlhGFPgeU/s9vN+qHyj?= =?us-ascii?q?Qk8u0w6Kd1Fh16ay+hMNmfOTUfYT3rYdtCclqjV0B0q90snNC9uAogphZL9Tbc?= =?us-ascii?q?k84FdBz2LZthZyMoauL6B41RYidFE9u1zonV0jDppGucw1qjUswRYkberS20xH?= =?us-ascii?q?PXvQiZvvPJXTK3Lu51auZ7/S3hfZytnAvu8E4fE87lHipx2BF0w48nwh3cMRm3?= =?us-ascii?q?Cb443iCAsJTYm3VVw99gRzo7/dcm8w+tD6z3ppZICwuzmK4NkpAeo51l70dtNW?= =?us-ascii?q?NuWfHw/3EtEGL9CpLP02llOpaBMdIe0U87Q7aZD1P8Ca0bKmab4z1Amtin5Ktd?= =?us-ascii?q?8sixPex29HUufNmq097bSd1wqDWS37iQ7+4MrwhIZPaCpUGzavjy/+C9wIP/Eg?= =?us-ascii?q?TcMwEW6rZvaP6JBmnZe0CixA81qyG14N2MmoYAefKVvn0l8JjBlFkTmcgSK9ig?= =?us-ascii?q?dMvXQpo66YhnecxvS7MgIAPn9XSWJii1b1PIXyiMoVDhGl?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg?= =?us-ascii?q?2RAgV2HJIV5hR+FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhA?= =?us-ascii?q?BAQUBAQECAQIDBAETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjA?= =?us-ascii?q?wwIAQYDAgQNARcBFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBG?= =?us-ascii?q?BQA0CE4EWhSyDHYN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOI?= =?us-ascii?q?y0kaYgziDyCD5AQB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E?= =?us-ascii?q?/KoFHHgwHMxowIiGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBA?= =?us-ascii?q?TICBgEHAQEDCXUBAQUTCwGLSYIfAQE?= X-IPAS-Result: =?us-ascii?q?A0D8BgCuU7pehyIeaIFmg3WBFgFdVTIsg2RAgV2HJIV5hR+?= =?us-ascii?q?FMpJJA1APAQMBDBgBBQ4BAgQBAYMOgTYCF4F4HQYBBTMTAhABAQUBAQECAQIDB?= =?us-ascii?q?AETAQEBCgsJCCmFMQgkDII7DAwDA4MgAQoOCQQGOwQBCRwjAwwIAQYDAgQNARc?= =?us-ascii?q?BFAoXARIUBoMMAYJ8BAEKkzSbeX8zhDoBAwMCCwMBDgkmhBGBQA0CE4EWhSyDH?= =?us-ascii?q?YN7D4FMP4ERgmJsgk4OCwEBAQEBGYEGIQEBCE4ZgkWCYASOIy0kaYgziDyCD5A?= =?us-ascii?q?QB4JNfwSGI3WFf4QFhiaCXIEOh1mRdyGPfIcudYE3hVWOI4E/KoFHHgwHMxowI?= =?us-ascii?q?iGCNQEBATEJXw1WjGGCXwEFMBeDT2pUgSaBdTuFRD8zAgEBATICBgEHAQEDCXU?= =?us-ascii?q?BAQUTCwGLSYIfAQE?= X-IronPort-AV: E=Sophos;i="5.73,383,1583190000"; d="scan'208,217";a="348368842" X-MGA-submission: =?us-ascii?q?MDHWoUukpS6tm23xTMiglys3FUaZWfIs8B/1Kk?= =?us-ascii?q?FbWrRJAJVfb9ASU2fAuTpfwO0V45Z7uAKhTQ2yhAzvlSSZhKrVNA03VF?= =?us-ascii?q?B6eDfstrajIYUfoHEitbfIAUefmLlwFMowNWsKIs7NNVLjANSyFV3hEi?= =?us-ascii?q?opQ4qmcMWGtgIe+oNKxdsIpg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 May 2020 09:45:29 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 17B3F565712; Tue, 12 May 2020 09:45:27 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 12 May 2020 09:45:26 +0200 Message-ID: <87h7wl38bt.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 12 09:45:27 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.072187, queueID=820F45657A7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdz LCBmb3IgdGhlIHdlZWsgb2YgTWF5IDA1IHRvIDEyLA0KMjAyMC4NCg0KVGFi bGUgb2YgQ29udGVudHMNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpMb29raW5nIGZvciAibG92ZWx5 LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1sIHVzZWQgZm9yIHNoZWxs LXNjcmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChidXQg ZXNwLiBQZXJsKQ0KQXJlIHRoZXJlIGxlYXJuaW5nIG1hdGVyaWFscyBmb3Ig T0NhbWwgZm9yIHRob3NlIHdpdGggbm8gcHJvZ3JhbW1pbmcgZXhwZXJpZW5j ZT8NCkR1bmUgbWVldGluZyBub3Rlcw0KT0NhbWwgNC4xMS4wLCBmaXJzdCBh bHBoYSByZWxlYXNlDQpPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBNZWV0 aW5nIDIwMjANClZTQ29kZSBQbGF0Zm9ybSBQbHVnaW4gMC41LjANCk90aGVy IE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpMb29raW5nIGZvciAibG92ZWx5 LCBpZGlvbWF0aWMiIGV4YW1wbGVzIG9mIE9jYW1sIHVzZWQgZm9yIHNoZWxs LXNjcmlwdGluZyBpbiB0aGUgbWFubmVyIG9mIFBlcmwvUHl0aG9uIChidXQg ZXNwLiBQZXJsKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9sb29raW5nLWZvci1sb3ZlbHktaWRpb21hdGljLWV4YW1w bGVzLW9mLW9jYW1sLXVzZWQtZm9yLXNoZWxsLXNjcmlwdGluZy1pbi10aGUt bWFubmVyLW9mLXBlcmwtcHl0aG9uLWJ1dC1lc3AtcGVybC81NzAzLzEzXQ0K DQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIENoZXQgTXVydGh5IHNhaWQg YW5kIEFhcm9uIEwuIFplbmcgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgICAgICAg4oCiIG5lZWRzIHRvIGJlIE9jYW1sIGNvZGUsIG5vdCBh biBpbnRlcnByZXRlci4gSSBtZWFuLCBpZg0KICAgICAgICAgIEnigJltIG5v dCBnb2luZyB0byB3cml0ZSBpdCBpbiBPY2FtbCwgSSBtaWdodCBhcyB3ZWxs DQogICAgICAgICAgd3JpdGUgaW4gUGVybCwgeWVzPw0KDQogIEkgdGhpbmsg c2hleHAgbWlnaHQgZGVzZXJ2ZSBhbm90aGVyIGxvb2suICBJdCdzIG5vdCBh biBpbnRlcnByZXRlciBmb3INCiAgYSBzZXhwLWJhc2VkIHNoZWxsIGxhbmd1 YWdlLCBhcyBpdHMgbmFtZSBtaWdodCB1bmZvcnR1bmF0ZWx5DQogIGRlY2Vp dmluZ2x5IHN1Z2dlc3QuICBJdCdzIHJlYWxseSBhIERTTCBmb3IgY29uc3Ry dWN0aW5nIHNoZWxsDQogIHBpcGVsaW5lcyB1c2luZyBhIGAnYSBQcm9jZXNz LnQnIG1vbmFkLiAgVGhlIHMtZXhwcmVzc2lvbiBwYXJ0IGlzDQogIGFkdmVy dGlzaW5nIHRoYXQgeW91IGNhbiBkZWJ1ZyBhbmQgdHJhY2UgdGhlIGFjdGlv bnMgcGVyZm9ybWVkIHVzaW5nDQogIHMtZXhwcmVzc2lvbnMuDQoNCiAgICAg ICAgVGhlIHNlY29uZC1tb3N0LWltcG9ydGFudCBwYXJ0IG9mIFBlcmwvQmFz aCBzY3JpcHRpbmcgaXMNCiAgICAgICAgc3RyaW5nLWhhbmRsaW5nLiBBbmQg aXTigJlzIGNlcnRhaW5seSB0aGUgcGFydCBvZiBPY2FtbA0KICAgICAgICB0 aGF04oCZcyBtb3N0IHBhaW5mdWwgd2hlbiB3cml0aW5nIHNjcmlwdHMuIExl dOKAmXMgc3RpcHVsYXRlDQogICAgICAgIHRoYXQgdGhlcmUgYXJlIG5pY2Ug bGlicmFyaWVzIHRvIG1ha2UgdGhpcyBlYXN5LiBJ4oCZbSBhbg0KICAgICAg ICBPY2FtbCBiaWdvdCwgSSBoYXZlIHRvIGJlbGlldmUgdGhpcyBhbnl3YXkg KmdyaW4qIC4gVGhpcw0KICAgICAgICBsaWJyYXJ5IGRvZXNu4oCZdCBzZWVt IHRvIHVzZSAnZW0sIG5vciBjaG9vc2UvcHJvbW90ZSBhDQogICAgICAgIHBh cnRpY3VsYXIgc2V0IG9mIHN1Y2ggbGlicmFyaWVzLg0KDQogIEkndmUgZm91 bmQgW0Jhc2VdIHBsdXMgW1JlXSB0byBiZSBzdWZmaWNpZW50IGZvciBtb3N0 IG9mIG15DQogIHN0cmluZy1tYW5pcHVsYXRpb24gbmVlZHMuICBJdCdzIG5l dmVyIGdvaW5nIHRvIGJlIGFzIGNvbmNpc2UgYXMNCiAgUGVybCdzIGJ1aWx0 LWluICJtYWdpYyIgc3VwcG9ydCBmb3IgcmVnZXhwcywgYnV0IHlvdSBnYWlu IGV4cGxpY2l0bmVzcw0KICBhbmQgY2xhcml0eSwgd2hpY2ggaXMgcGFydCBv ZiB0aGUgYmVuZWZpdCBvZiBPQ2FtbCBhbnl3YXkuDQoNCg0KW0Jhc2VdIGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2UvDQoNCltSZV0gaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLXJlDQoNCg0KQ2hldCBNdXJ0 aHkgc2FpZCBhbmQgRG9ubiBDYXZlIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogICAgICAgIEl04oCZcyBub3QgYXMgdHJpdmlhbCBp biBPY2FtbCwgZm9yIG1hbnkgY29tcGxpY2F0ZWQgcmVhc29ucw0KICAgICAg ICB0aGF0IGJvaWwgZG93biB0byDigJxnZWUsIHN0cmluZy1oYW5kbGluZyBp cyBhIFBJVEHigJ0uDQoNCiAgUmVhbGx5PyAgaGFkbid0IG5vdGljZWQuICBI YSBoYS4NCg0KICBJIGNvdWxkIG5ldmVyIHJlYWxseSBnZXQgdXJnZSBmb3Ig UGVybCwgYnV0IEkgdXNlIGl0cyBhbmNlc3RvciBhd2sgYQ0KICBsb3QsIGFu ZCBJJ20gdHJ5aW5nIG91dCBzb21lIGF3ay1saWtlIHNpbXBsZSBzdHJpbmcg ZnVuY3Rpb25zLCBsaWtlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBs ZXQgc3RybGVuID0gU3RyaW5nLmxlbmd0aA0KICDilIIgbGV0IHN1YiBzIGkg biA9IGxldCBiID0gc3RybGVuIHMNCiAg4pSCICAgICAgaW4gaWYgaSA8IGIN CiAg4pSCIAkgdGhlbiBsZXQgbiA9IG1pbiBuIChiIC0gaSkNCiAg4pSCIAkg aW4gU3RyaW5nLnN1YiBzIGkgbg0KICDilIIgICAgIGVsc2UgIiINCiAg4pSC ICgqIHN1YnN0cmluZyB0byBlbmQgb2YgbGluZSAqKQ0KICDilIIgbGV0IHN1 YnN0ciBhIGkgPSBpZiBpIDwgc3RybGVuIGENCiAg4pSCICAgICAgdGhlbiBT dHJpbmcuc3ViIGEgaSAoKHN0cmxlbiBhKSAtIGkpDQogIOKUgiAgICAgIGVs c2UgIiINCiAg4pSCIGxldCBtYXRjaHJlIHQgcyA9IHRyeQ0KICDilIIgICAg ICBTdHIuc2VhcmNoX2ZvcndhcmQgdCBzIDANCiAg4pSCICAgICAgd2l0aCB8 IE5vdF9mb3VuZCAtPiAtMQ0KICDilJTilIDilIDilIDilIANCg0KICBldGMu DQoNCiAgU28gIm9wZW4gQXdrIiBnZXRzIG1lIGEgaGFuZGZ1bCBvZiBtb3Jl IGJhc2ljIHZhcmlhdGlvbnMgb24gY29tbW9uDQogIHN0cmluZyBmdW5jdGlv bnMsIHdpdGggbGVzcyBlbGFib3JhdGUgcGFyYW1ldGVycywgbm8gbm9ybWFs DQogIGV4Y2VwdGlvbnMsIGV0Yy4gIEluY2x1ZGluZyBhIGxpbmUgYnkgbGlu ZSBmaWxlIHByb2Nlc3NpbmcgZnVuY3Rpb24uDQogIEkgaGF2ZSBqdXN0IG5l d2x5IHN0YXJ0ZWQgb24gdGhpcyBhbmQgaGF2ZW4ndCB1c2VkIGl0IGV4dGVu c2l2ZWx5LCBidXQNCiAgaXQgc2VlbXMgZmFpcmx5IHByb21pc2luZy4gIE5v IHdhY2t5IHN5bnRheCBvciBoeXBlciBpbnRlbGxpZ2VudA0KICBzdHJpbmcg cHJvY2Vzc2luZywgbm8gcGFja2FnZXMsIGp1c3QgYSBmZXcgZG96ZW4gbGlu ZXMgb2YgY2hlYXRlcg0KICBmdW5jdGlvbnMuDQoNCiAgIkF3ayIgaXMgYSBt aXNub21lciwgaW4gdGhhdCB0aGVyZSdzIGxpdHRsZSBjb3JyZXNwb25kZW5j ZSBiZXR3ZWVuDQogIHRoaXMgYW5kIGF3aywgaXQgd2FzIGp1c3Qgd2hhdCBp bnNwaXJlZCBtZSB0byB0cnkgaXQuDQoNCg0KUmFwaGHDq2wgUHJvdXN0IHNh aWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZG9uJ3QgdGhpbmsgaXQncyBsb3Zl bHkgYW5kIEkgaGF2ZSBubyBpZGVhIGlmIGl0IGlzIGlkaW9tYXRpYywgYnV0 IEkNCiAgbWFkZSBhIGZldyBzY3JpcHRzIG9mIG15IG93biBpbiBPQ2FtbCB1 c2luZyB0aGUgc2FtZSBsaWJyYXJ5IHRoYXQNCiAgb3RoZXIgbWVudGlvbmVk OiBgYm9zJw0KDQogIOKAoiBbdHlwZXBhc3NdIHVzZXMgYHhkb3Rvb2wnIHRv IHR5cGUgcGFzc3dvcmRzIGZyb20gdGhlIGBwYXNzd29yZCcNCiAgICBwYXNz d29yZCBtYW5hZ2VyDQogIOKAoiBbY29ubl0gd3JhcHMgYHdwYV9zdXBwbGlj YW50JywgYGRoY3BjZCcsIGBpcCcsIGFuZCBvdGhlciBuZXR3b3JrDQogICAg bWFuYWdlbWVudCBDTEkNCiAg4oCiIFtsYXB0b3Atc3RhdHVzXSBmZXRjaGVz IHN0YXR1cyBpbmZvcm1hdGlvbiBmb3IgbGFwdG9wcyAoZS5nLiwNCiAgICBi YXR0ZXJ5IGxldmVsKSBhbmQgcHJpbnRzIGl0IGluIGEgbmljZWx5IGZvcm1h dHRlZCBmb3JtDQogIOKAoiBbYmFrZWxpdGVdIGluY3JlYXNlcyBvciBkZWNy ZWFzZXMgc2NyZWVuIGJyaWdodG5lc3MNCg0KDQpbdHlwZXBhc3NdIGh0dHBz Oi8vZ2l0bGFiLmNvbS9yYXBoYWVsLXByb3VzdC90eXBlcGFzcw0KDQpbY29u bl0gaHR0cHM6Ly9naXRsYWIuY29tL3JhcGhhZWwtcHJvdXN0L2Nvbm4NCg0K W2xhcHRvcC1zdGF0dXNdIGh0dHBzOi8vZ2l0bGFiLmNvbS9yYXBoYWVsLXBy b3VzdC9sYXB0b3Atc3RhdHVzDQoNCltiYWtlbGl0ZV0gaHR0cHM6Ly9naXRs YWIuY29tL3JhcGhhZWwtcHJvdXN0L2Jha2VsaXRlDQoNCg0KVmFzaWxlIFJv dGFydSBhbHNvIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFtodHRwczovL2dpdGh1Yi5jb20vaGFtbWVybGFiL2dlbnNwaW9dDQoNCg0K R2FicmllbCBSYWRhbm5lIGFsc28gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSSBoYXZlIG5vIHBhcnRpY3VsYXIgb3Bpbmlv biBhYm91dCB0aGUgcmVzdCwgYnV0IGF0IGxlYXN0IG9uIHRoZSByZWdleA0K ICBzaWRlLCB0aGlzIG1pZ2h0IGJlIG9mIGludGVyZXN0Og0KICBbaHR0cHM6 Ly9naXRodWIuY29tL3BhdXJrZWRhbC9wcHhfcmVnZXhwXQ0KDQogIElmIHRo YXQncyBzdGlsbCBub3QgZ29vZCBlbm91Z2gsIEkgd291bGQgYmUgdmVyeSBp bnRlcmVzdGVkIGJ5DQogIHN1Z2dlc3Rpb25zIG9uIGhvdyB0byBtYWtlIGl0 IG1vcmUgY29udmVuaWVudC4gOikNCg0KDQpPQ2FtbFVzZXIgcHJvcG9zZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEknbSBub3Qgc3VyZSBhYm91dCBpZGlvbWF0aWMs IGJ1dCBJIGRvIGhhdmUgYSB1dG9wIGNvbmZpZyB0aGF0IEkgdXNlDQogIHRv IGRvIHNvbWUgb25lLW9mZiBzY3JpcHRpbmcgaW4gT0NhbWwgdGhhdCB1c2Vz IGBzaGV4cCcNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICN1c2UgInRv cGZpbmQiDQogIOKUgiAjd2FybmluZ3MgIithIg0KICDilIIgI3RocmVhZA0K ICDilIIgI3JlcXVpcmUgInBweF9qYW5lLGNvcmUiDQogIOKUgiAjcmVxdWly ZSAic2hleHAucHJvY2VzcyINCiAg4pSCICNyZXF1aXJlICJsYW1iZGFzb3Vw Ig0KICDilIIgbW9kdWxlIExpc3QnID0gTGlzdA0KICDilIIgb3BlbiBTaGV4 cF9wcm9jZXNzDQogIOKUgiBvcGVuIFNoZXhwX3Byb2Nlc3MuSW5maXgNCiAg 4pSCIG9wZW4gQ29yZQ0KICDilIIgDQogIOKUgiBtb2R1bGUgSHRtbCA9IHN0 cnVjdA0KICDilIIgICAgIGluY2x1ZGUgU291cA0KICDilIIgDQogIOKUgiAg ICAgbGV0IG9mX3N0cmluZyA9IHBhcnNlDQogIOKUgiBlbmQNCiAg4pSCIA0K ICDilIIgbGV0IHJlYWRfbGluZXMgY21kID0NCiAg4pSCICAgICBldmFsIChj YWxsIGNtZCB8LSByZWFkX2FsbCkNCiAg4pSCIDs7DQogIOKUgiANCiAg4pSC IGxldCB3Z2V0IHVybCA9DQogIOKUgiAgICAgcmVhZF9saW5lcyBbIndnZXQi OyAiLU8iOyAiLSI7IHVybF0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxl dCBjaHJvbWVfY3VybCB1cmwgPQ0KICDilIIgICAgIHJlYWRfbGluZXMgWyJj dXJsIjsgIi1rIjsgIi1zQSI7ICJDaHJvbWUiOyAiLUwiOyB1cmw7ICItbyI7 ICItIl0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBzcGxpdF9saW5l cyA9IFN0cmluZy5zcGxpdCB+b246J1xuJw0KICDilIIgbGV0IGZpbHRlcl9s aW5lcyBzdWJzdHJpbmcgPSBMaXN0LmZpbHRlciB+ZjpTdHJpbmcuKGlzX3N1 YnN0cmluZyB+c3Vic3RyaW5nKQ0KICDilIIgbGV0IHRvX2h0bWwgPSBIdG1s Lm9mX3N0cmluZw0KICDilIIgbGV0IGZpbmRfaHRtbCBwYXQgaHRtbCA9IEh0 bWwuKGh0bWwgJCQgcGF0KQ0KICDilIIgDQogIOKUgiBsZXQgKCUpID0gRm4u Y29tcG9zZQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGVuIGEgc2ltcGxl IHNjcmlwdCBjYWxsZWQgYHNoZXhwJyBpbiBteSBwYXRoOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIHV0b3AgLWluaXQgfi9iaW4vb2NhbWwtc2hleHAt Y29uZmlnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEkgYWRkIGxpdHRsZSBo ZWxwZXIgZnVuY3Rpb25zIGFzIEkgY29tZSB1cG9uIHRoZW0uIEkgZmluZCBp dCdzIG11Y2gNCiAgZWFzaWVyIHRvIHRyYW5zaXRpb24gdG8gYSBmaWxlLCBv ciBmdWxsIHByb2dyYW0gd2hlbiBJIG5lZWQNCiAgaXQuIEV4YW1wbGUgcHJv Z3JhbToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHV0b3AgIyByZWFk X2xpbmVzIFsic2Vuc29ycyJdIHw+IHNwbGl0X2xpbmVzIHw+IGZpbHRlcl9s aW5lcyAiQ29yZSAwIjs7DQogIOKUgiAtIDogc3RyaW5nIGxpc3QgPQ0KICDi lIIgWyJDb3JlIDA6ICAgICAgICArNjMuMMKwQyAgKGhpZ2ggPSArODQuMMKw QywgY3JpdCA9ICsxMDAuMMKwQykiXQ0KICDilJTilIDilIDilIDilIANCg0K DQpBbnRvbiBLb2Noa292IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdCBleGFj dGx5IE9DYW1sLCBidXQgY2FuIGJlIG1hZGUgd2l0aCB0aGUgT0NhbWwgc3lu dGF4IGFzIHdlbGwgLSBzZWUNCiAgW0JBVFNIXS4NCg0KDQpbQkFUU0hdIGh0 dHBzOi8vZ2l0aHViLmNvbS9iYXRzaC1kZXYtdGVhbS9CYXRzaA0KDQoNCkJp a2FsIExlbSBhbHNvIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCBm b3VuZCB0aGlzIC0gW2h0dHBzOi8vZ2l0aHViLmNvbS9TaGFtb1gvY2FzaF0u IEBDaGV0X011cnRoeQ0KICBUaGlzIG1heSBiZSB0aGUgY2xvc2VzdCB0byBv Y2FtbCBzaGVsbCBzY3JpcHRpbmcgZXhwZXJpZW5jZSByZSBwZXJsLg0KDQoN CkFyZSB0aGVyZSBsZWFybmluZyBtYXRlcmlhbHMgZm9yIE9DYW1sIGZvciB0 aG9zZSB3aXRoIG5vIHByb2dyYW1taW5nIGV4cGVyaWVuY2U/DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2FyZS10aGVyZS1sZWFybmluZy1tYXRlcmlhbHMtZm9yLW9j YW1sLWZvci10aG9zZS13aXRoLW5vLXByb2dyYW1taW5nLWV4cGVyaWVuY2Uv NTY4NC85XQ0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWFkLCBMdWNfTUwg c2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQmVmb3JlIHN0dWR5aW5n IG1vcmUgY29tcGxleCBib29rcywgaXQncyBhIGdvb2QgaWRlYSB0byBmaXJz dCBnZXQgYW4NCiAgb3ZlcnZpZXcuDQoNCiAgW09DYW1sIGZvciB0aGUgU2tl cHRpY2FsIC8gT0NhbWwgaW4gYSBOdXRzaGVsbF0gOiB0aGUgdGl0bGUgaXMg ZnVubnk7DQogIGl0cyBtYWluIGFkdmFudGFnZSBpcyB0aGF0IGl0IGNvdmVy cyBtb3N0IE9DYW1sIGNvbmNlcHRzIGluICoyMSBzaG9ydA0KICBzZWN0aW9u cyogd2hlcmUgeW91IGNhbiBleHBlcmltZW50IGJ5IHlvdXJzZWxmIG9uIHNp bXBsZSBidXQgZXNzZW50aWFsDQogIHRoaW5ncy4NCg0KICBUaGUgYm9va3Mv Y291cnNlcyBhbHJlYWR5IG1lbnRpb25lZCBhcmUgbmljZS4gWW91IGNhbiBh bHNvIGNvbnNpZGVyDQogIHRoaXMgb25lIHRoYXQgb2ZmZXJzIG1hbnkgZXhh bXBsZXMvZXhlcmNpc2VzIGFuZCBhbHNvIGEgZ29vZCBvdmVydmlldzoNCiAg W0RldmVsb3BpbmcgQXBwbGljYXRpb25zIFdpdGggT2JqZWN0aXZlIENhbWxd Lg0KDQogIExFIExBTkdBR0UgQ0FNTCBtZW50aW9uZWQgYnkgQG5vamIgaXMg YW4gZXhjZWxsZW50IGJvb2suIFdyaXR0ZW4gaW4NCiAgQ2FtbCBMaWdodCwg aXQncyBlYXN5IHRvIHR1cm4gaXQgYnkgeW91cnNlbGYgaW50byBPQ2FtbC4g SXQgb2ZmZXJzIGENCiAgZ3JlYXQgY2hhbmNlIHRvIGxlYXJuIGhvdyB0byBk byBhIGxvdCBvZiB0aGluZ3MgaW4gKnB1cmUqIENhbWwgd2l0aA0KICBvbmx5 IHN0ZGxpYiBhbmQgYSBzaW1wbGUgc3ludGF4IGV4dGVuc2lvbiBzeXN0ZW0g KHVzZSBjYW1scDUgKGkuZS4gdGhlDQogICJnZW51aW5lIGNhbWxwNCIpIHRo YXQgaXMgZmluZSBmb3IgdGhhdC4gSXQgd29ya3Mgb3V0IG9mIHRoZSBib3gg dG8NCiAgZGVhbCB3aXRoIHN0cmVhbXMgYW5kIGl0J3MgYSBjaGFuY2UgdG8g dW5kZXJzdGFuZCB3aGF0IGlzIGENCiAgTEwoMSkvcmVjdXJzaXZlIGRlc2Nl bnQgcGFyc2VyKS4NCg0KDQpbT0NhbWwgZm9yIHRoZSBTa2VwdGljYWwgLyBP Q2FtbCBpbiBhIE51dHNoZWxsXQ0KaHR0cHM6Ly93d3cyLmxpYi51Y2hpY2Fn by5lZHUva2VpdGgvb2NhbWwtY2xhc3MvY2xhc3MtMDEuaHRtbA0KDQpbRGV2 ZWxvcGluZyBBcHBsaWNhdGlvbnMgV2l0aCBPYmplY3RpdmUgQ2FtbF0NCmh0 dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZG9jcy9vcmVpbGx5LWJvb2svDQoN Cg0KRHVuZSBtZWV0aW5nIG5vdGVzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl OiBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2R1bmUtbWVldGluZy1u b3Rlcy81NzEwLzFdDQoNCg0KSsOpcsOpbWllIERpbWlubyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCB3YW50 ZWQgdG8gcHVibGljaXNlIHRoYXQgd2UgYXJlIG5vdyBwdWJsaXNoaW5nIHRo ZSBub3RlcyBmcm9tDQogIG91ciBEdW5lIG1lZXRpbmdzIG9uIHRoZSB3aWtp Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtpXQ0K DQogIFRoZXNlIG1lZXRpbmdzIGhhcHBlbiB2aWEgdmlkZW8tY29uZmVyZW5j ZSBldmVyeSB0d28gd2Vla3MuIElmIHlvdSBhcmUNCiAgaW50ZXJlc3RlZCBp biBmb2xsb3dpbmcgdGhlIGRldmVsb3BtZW50IG9mIER1bmUgbW9yZSBjbG9z ZWx5LCB0aGlzIGlzDQogIGdvb2QgcGxhY2UgdG8gbG9vayBhdC4NCg0KDQpP Q2FtbCA0LjExLjAsIGZpcnN0IGFscGhhIHJlbGVhc2UNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv b2NhbWwtNC0xMS0wLWZpcnN0LWFscGhhLXJlbGVhc2UvNTcxNi8xXQ0KDQoN Cm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBz ZXQgb2YgbmV3IGZlYXR1cmVzIGZvciB0aGUgZnV0dXJlIHZlcnNpb24gNC4x MS4wIG9mIE9DYW1sIGhhcw0KICBiZWVuIGZyb3plbi4gIEluIHRoZSBuZXh0 IGZldyBtb250aHMsIHRoZSBPQ2FtbCBjb21waWxlciB0ZWFtIGlzDQogIGZv Y3VzaW5nIG9uIGJ1ZyBodW50aW5nIGFuZCBmaXhpbmcuDQoNCiAgRm9yIHRo aXMgcmVsZWFzZSBjeWNsZSwgd2UgaGF2ZSBkZWNpZGVkIHRvIHRlc3QgcHVi bGlzaGluZyByZWd1bGFybHkNCiAgYWxwaGEgdmVyc2lvbnMgb2YgT0NhbWwg NC4xMS4wIGluIG9yZGVyIHRvIGhlbHAgZmVsbG93IGhhY2tlcnMgam9pbiB1 cw0KICBlYXJseSBpbiBvdXIgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNvc3lz dGVtIGZpeGluZyBmdW4uICBPbmNlIHRoZSBvcGFtDQogIGVjb3N5c3RlbSBp cyBpbiBzaGFwZSwgdGhlc2UgYWxwaGEgcmVsZWFzZXMgd2lsbCBtb3JwaCBp bnRvIHRoZSB1c3VhbA0KICBiZXRhIGFuZCByZWxlYXNlIGNhbmRpZGF0ZSBy ZWxlYXNlcy4NCg0KICBJZiB5b3UgZmluZCBhbnkgYnVncywgcGxlYXNlIHJl cG9ydCB0aGVtIGhlcmU6DQogICBbaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlc10NCg0KICBUaGUgY29tcGlsZXIgY2FuIGJlIGluc3Rh bGxlZCBhcyBhbiBPUEFNIHN3aXRjaCB3aXRoIG9uZSBvZiB0aGUNCiAgZm9s bG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3Bh bSBzd2l0Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCthbHBoYTEg LS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTi lIDilIDilIDilIANCiAgb3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGFtIHN3aXRjaCBjcmVhdGUgb2NhbWwtdmFyaWFudHMuNC4xMS4wK2FscGhh MStWQVJJQU5UIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5n aXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZB UklBTlQgd2l0aCBvbmUgb2YgdGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQog IGZwK2ZsYW1iZGENCg0KICBUaGUgc291cmNlIGNvZGUgZm9yIHRoZSBhbHBo YSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6DQoNCiAg W2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEu MCthbHBoYTEudGFyLmd6XQ0KICBbaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1 Yi9kaXN0cmliL29jYW1sLTQuMTEvb2NhbWwtNC4xMS4wK2FscGhhMS50YXIu Z3pdDQoNCiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGJ5IHRoZSBvbmdvaW5n IGxpc3Qgb2YgbmV3IGZlYXR1cmVzIGFuZCBmaXhlZA0KICBidWdzLCB0aGUg dXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA0LjExLjAgaXMgYXZhaWxh YmxlIGF0Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv YmxvYi80LjExL0NoYW5nZXNdDQoNCg0KT0NhbWwgVXNlcnMgYW5kIERldmVs b3BlcnMgTWVldGluZyAyMDIwDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXVzZXJzLWFuZC1kZXZlbG9wZXJzLW1lZXRpbmctMjAyMC81 NDU0LzJdDQoNCg0KSXZhbiBHb3RvdmNoaXRzIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRHVlIHRvIHRoZSBtdWx0 aXBsZSByZXF1ZXN0cyBhbmQgc2luY2UgSUNGUCB3aWxsIGJlIG5vdyBvZmZp Y2lhbGx5DQogIGhlbGQgb25saW5lIHdpdGggYSBzaWduaWZpY2FudGx5IHJl ZHVjZWQgZmVlLCB3ZSBkZWNpZGVkIHRvIGV4dGVuZCB0aGUNCiAgc3VibWlz c2lvbiBkZWFkbGluZSB0aWxsIHRoZSBlbmQgb2YgdGhpcyBtb250aC4gV2Ug YXJlIGhvcGluZyB0bw0KICBhdHRyYWN0IGEgbGFyZ2VyIGFuZCBtb3JlIGRp dmVyc2UgYXVkaWVuY2UgdGhpcyB5ZWFyLCBnaXZlbiB0aGF0IHRoZQ0KICBu ZXcgZm9ybWF0IGlzIG1vcmUgYWNjZXNzaWJsZSBib3RoIHRyYXZlbC13aXNl IGFuZCBmaW5hbmNpYWxseS4NCg0KICBQbGVhc2UsIHNoYXJlIHRoZSBuZXdz IHdpZGVseSENCg0KDQpJbXBvcnRhbnQgRGF0ZXMgKHVwZGF0ZWQpDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgVGFsayBwcm9w b3NhbCBzdWJtaXNzaW9uIGRlYWRsaW5lOiBNYXkgMjl0aCwgMjAyMCwgQW9F DQogIOKAoiBBdXRob3IgTm90aWZpY2F0aW9uOiBKdWx5IDE3dGgsIDIwMjAN CiAg4oCiIE9DYW1sIFdvcmtzaG9wOiBBdWd1c3QgMjh0aCwgMjAyMA0KDQoN ClZTQ29kZSBQbGF0Zm9ybSBQbHVnaW4gMC41LjANCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFto dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZzY29kZS1wbGF0Zm9y bS1wbHVnaW4tMC01LTAvNTc1Mi8xXQ0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGlzIHJl bGVhc2UgY29udGFpbnMgYSBjb3VwbGUgb2YgbWFqb3IgaW1wcm92ZW1lbnRz Og0KDQogIOKAoiBTeW50YXggaGlnaGxpZ2h0aW5nIGlzIHZhc3RseSBpbXBy b3ZlZC4gVGhlcmUncyBub3cgaGlnaGxpZ2h0aW5nIGZvcg0KICAgIG1hbnkg bW9yZSBmaWxldHlwZXMsIGFuZCB0aGUgY29yZSBoaWdobGlnaHRpbmcgZm9y IE9DYW1sIGlzIGZhciBtb3JlDQogICAgYWNjdXJhdGUuDQogIOKAoiBUaGVy ZSdzIGludGVncmF0aW9uIHdpdGggcGFja2FnZSBtYW5hZ2VycyBzdWNoIGFz IG9wYW0gYW5kIGVzeS4gT25lDQogICAgbWF5IG5vdyBleHBsaWNpdGx5IHVz ZSB0aGVtIHRvIGV4cGxpY2l0bHkgc2VsZWN0IHRoZSBzYW5kYm94IHRoYXQN CiAgICBjb250YWlucyB0aGUgbHNwIHNlcnZlciBhbmQgcmVsYXRlZCB0b29s cy4NCg0KICBVbmRlciB0aGUgaG9vZCwgdGhlIGVudGlyZSBwbHVnaW4gd2Fz IHJld3JpdHRlbiBmcm9tIHR5cGVzY3JpcHQgdG8NCiAgT0NhbWwgKGJ1Y2ts ZXNjcmlwdCkuIFRoaXMgc2hvdWxkIGhvcGVmdWxseSBtYWtlIGNvbnRyaWJ1 dGlvbiBtb3JlDQogIGFjY2Vzc2libGUgdG8gT0NhbWwgaGFja2Vycy4NCg0K ICBJJ2QgbGlrZSB0byB0aGFuayBAcnVzdHlrZXksIEBtbnhuLCBAcHJvbWV0 aGVhbnNhY3JpZmljZSwgYW5kIEBpbWJza3kNCiAgZm9yIHRoZWlyIGNvbnRy aWJ1dGlvbnMgdG8gdGhpcyByZWxlYXNlLiBUaGVpciBoZWxwIGlzIHRoZSBy ZWFzb24gZm9yDQogIHRoaXMgdmFzdGx5IGltcHJvdmVkIHZlcnNpb24gb2Yg dGhlIHBsdWdpbi4NCg0KICBBcyB1c3VhbCwgdGhlIHBsdWdpbiBpcyBhdmFp bGFibGUgZGlyZWN0bHkgdXNpbmcgdnNjb2RlJ3MgZXh0ZW5zaW9uDQogIG1h cmtldCBwbGFjZS4gSSdsbCBsZWF2ZSBhIGxpbmsgdG8gdGhlIHBsdWdpbiBb aGVyZV0gdG8gYXZvaWQNCiAgY29uZnVzaW9uIHdpdGggdGhlIG1hbnkgb3Ro ZXIgT0NhbWwgcGx1Z2lucyBhdmFpbGFibGUuDQoNCiAgUGxlYXNlIHJlcG9y dCBhbnkgaXNzdWVzIG9uIHRoZSBbYnVnIHRyYWNrZXJdDQoNCg0KW2hlcmVd DQpodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/ aXRlbU5hbWU9b2NhbWxsYWJzLm9jYW1sLXBsYXRmb3JtDQoNCltidWcgdHJh Y2tlcl0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2Nh bWwtcGxhdGZvcm0vaXNzdWVzDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCkZyb20gdGhlIG9jYW1sY29yZSBwbGFuZXQgYmxvZw0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVy ZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQg YXQgW09DYW1sIFBsYW5ldF0uDQoNCiAg4oCiIFtPY3NpZ2VuIFN0YXJ0IDIu MTggcmVsZWFzZWRdDQogIOKAoiBbT2NzaWdlbiBUb29sa2l0IDIuNyB3aXRo IG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIGh0 dHA6Ly9vY2FtbC5vcmcvY29tbXVuaXR5L3BsYW5ldC8NCg0KW09jc2lnZW4g U3RhcnQgMi4xOCByZWxlYXNlZF0NCmh0dHBzOi8vb2NzaWdlbi5naXRodWIu aW8vYmxvZy8yMDIwLzA1LzA1L29zLw0KDQpbT2NzaWdlbiBUb29sa2l0IDIu NyB3aXRoIG5ldyB3aWRnZXQgT3RfdG9uZ3VlXQ0KaHR0cHM6Ly9vY3NpZ2Vu LmdpdGh1Yi5pby9ibG9nLzIwMjAvMDUvMDQvb3QvDQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBt aXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEkn bGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVd Lg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdl XSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoNClt0 aGUgYXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8N Cg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzDQoNCltvbmxpbmVdIGh0dHA6Ly9s aXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8NCg0K W0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0K DQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 05 to 12, 2020.

Looking for "lovely, idiomatic" examp= les of Ocaml used for shell-scripting in the manner of Perl/Python (but esp= . Perl)

Continuing this thread, Chet Murthy said and Aaron L.= Zeng replied

  • needs to be Ocaml code, not an interpreter. I mean, if I=E2=80=99m not = going to write it in Ocaml, I might as well write in Perl, yes?

I think shexp might deserve another look. It's not an interpreter for a se= xp-based shell language, as its name might unfortunately deceivingly suggest. It's really a DSL for constructing shel= l pipelines using a 'a Process.t monad. The s-expression part is advertising that you can debug and trace the actio= ns performed using s-expressions.

The second-most-important part of Perl/Bash scripting is string-handling. A= nd it=E2=80=99s certainly the part of Ocaml that=E2=80=99s most painful when writing scripts. Let=E2=80=99s stipulate that there are n= ice libraries to make this easy. I=E2=80=99m an Ocaml bigot, I have to believe this anyway grin . This library doesn=E2=80= =99t seem to use 'em, nor choose/promote a particular set of such libraries.

I've found Base plus Re to be sufficient for most of my string-manipulation needs. It's never going to be as concis= e as Perl's built-in "magic" support for regexps, but you gain explicitness and clarity, which is part of the benefi= t of OCaml anyway.

Chet Murthy said and Donn Cave replied

It=E2=80=99s not as trivial in Ocaml, for many complicated reasons that boi= l down to =E2=80=9Cgee, string-handling is a PITA=E2=80=9D.

Really? hadn't noticed. Ha ha.

I could never really get urge for Perl, but I use its ancestor awk a lot, a= nd I'm trying out some awk-like simple string functions, like

let strlen =3D String.length
let sub s i n =3D let b =3D strlen s
     in if i < b
         then let n =3D min n (b - i)
         in String.sub s i n
    else ""
(* s=
ubstring to end of line *)
let substr a=
 i =3D if i < strlen a
     then String.sub a i ((strlen a) - i)
     else ""
let matchre t s =3D try
     Str.search_forward t s 0
     with | Not_found -> -1

etc.

So "open Awk" gets me a handful of more basic variations on common string f= unctions, with less elaborate parameters, no normal exceptions, etc. Including a line by line file processing functi= on. I have just newly started on this and haven't used it extensively, but it seems fairly promising. No wacky synta= x or hyper intelligent string processing, no packages, just a few dozen lines of cheater functions.

"Awk" is a misnomer, in that there's little correspondence between this and= awk, it was just what inspired me to try it.

Rapha=C3=ABl Proust said

I don't think it's lovely and I have no idea if it is idiomatic, but I made= a few scripts of my own in OCaml using the same library that other mentioned: bos

  • typepass use= s xdotool to type passwords from the password pas= sword manager
  • conn wraps wpa_supplicant, dhcpcd, ip, and other net= work management CLI
  • laptop-stat= us fetches status information for laptops (e.g., battery level) and pri= nts it in a nicely formatted form
  • bakelite inc= reases or decreases screen brightness

Vasile Rotaru also said

Gabriel Radanne also said

I have no particular opinion about the rest, but at least on the regex side= , this might be of interest: https://github.com/paur= kedal/ppx_regexp

If that's still not good enough, I would be very interested by suggestions = on how to make it more convenient. :)

OCamlUser proposed

I'm not sure about idiomatic, but I do have a utop config that I use to do = some one-off scripting in OCaml that uses shexp

#use "topfind"
#warnings "+a"
#thread
#require "ppx_jane,core"
#require "shexp.process"
#require "lambdasoup"
module List' =3D List=

open Shexp_process
open Shexp_process.Infix
open Core

module Html =3D struct
    include Soup

    let of_string =3D parse
end

let read_lines cmd<=
/span> =3D
    eval (call cmd |- read_all)
;;

let wget url=
 =3D
    read_lines ["wget"; "-O"; "-"; url]
;;

let chrome_curl url=
 =3D
    read_lines ["curl"; "-k"; "-sA"; "Chrome"; "-L"; url; "-o"; <=
span style=3D"color: #8b2252;">"-"]
;;

let split_lines =3D String.split ~on:'\n'
let filter_lines su=
bstring =3D List.filter ~f:String=
.(is_substring ~substring)
let to_html =3D Htm=
l.of_string
let find_html pat html =3D Html.(html $$ pat)

let (%) =3D Fn.compose

Then a simple script called shexp in my path:

utop -init ~/bin/ocaml-shexp-config

I add little helper functions as I come upon them. I find it's much easier = to transition to a file, or full program when I need it. Example program:

utop # read_lines ["sensors"] |> split_lines |> filter_lines "Core 0"=
;;
- : string list =3D
["Core 0:        +63.0=C2=B0C  (high =3D +84.0=C2=B0C, crit =3D +100.0=C2=
=B0C)"]

Anton Kochkov said

Not exactly OCaml, but can be made with the OCaml syntax as well - see BATSH.

Bikal Lem also said

I just found this - https://gith= ub.com/ShamoX/cash. @Chet_Murthy This may be the closest to ocaml shell= scripting experience re perl.

Are there learning materials for OCam= l for those with no programming experience?

Continuing this threaad, Luc_ML said

Before studying more complex books, it's a good idea to first get an overvi= ew.

O= Caml for the Skeptical / OCaml in a Nutshell : the title is funny; its main advantage is that it covers most OCaml concepts in= 21 short sections where you can experiment by yourself on simple but essential things.

The books/courses already mentioned are nice. You can also consider this on= e that offers many examples/exercises and also a good overview: Developing Applications With Objective Caml.

LE LANGAGE CAML mentioned by @nojb is an excellent book. Written in Caml Li= ght, it's easy to turn it by yourself into OCaml. It offers a great chance to learn how to do a lot of things in pu= re Caml with only stdlib and a simple syntax extension system (use camlp5 (i.e. the "genuine camlp4") that is fin= e for that. It works out of the box to deal with streams and it's a chance to understand what is a LL(1)/recursive= descent parser).

Dune meeting notes

J=C3=A9r=C3=A9mie Dimino announced

I just wanted to publicise that we are now publishing the notes from our Du= ne meetings on the wiki:

https://github.com/ocaml/dun= e/wiki

These meetings happen via video-conference every two weeks. If you are inte= rested in following the development of Dune more closely, this is good place to look at.

OCaml 4.11.0, first alpha release

octachron announced

The set of new features for the future version 4.11.0 of OCaml has been fro= zen. In the next few months, the OCaml compiler team is focusing on bug hunting = and fixing.

For this release cycle, we have decided to test publishing regularly alpha = versions of OCaml 4.11.0 in order to help fellow hackers join us early in our bug hunting and opam ecosystem fixing f= un. Once the opam ecosystem is in shape, these alpha releases will morph into t= he usual beta and release candidate releases.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

The compiler can be installed as an OPAM switch with one of the following c= ommands

opam switch create ocaml-variants.4.11.0+alpha=
1 --repositories=3Ddefault,beta=3Dgi=
t+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+alpha=
1+VARIANT --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

The source code for the alpha is also available at these addresses:

htt= ps://github.com/ocaml/ocaml/archive/4.11.0+alpha1.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+alpha1.t= ar.gz

If you are interested by the ongoing list of new features and fixed bugs, t= he updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

OCaml Users and Developers Meeting 20= 20

Ivan Gotovchits announced

Due to the multiple requests and since ICFP will be now officially held onl= ine with a significantly reduced fee, we decided to extend the submission deadline till the end of this month. We ar= e hoping to attract a larger and more diverse audience this year, given that the new format is more accessible bo= th travel-wise and financially.

Please, share the news widely!

Important Dates (updated)

  • Talk proposal submission deadline: May 29th, 2020, AoE
  • Author Notification: July 17th, 2020
  • OCaml Workshop: August 28th, 2020

VSCode Platform Plugin 0.5.0

Rudi Grinberg announced

This release contains a couple of major improvements:

  • Syntax highlighting is vastly improved. There's now highlighting for ma= ny more filetypes, and the core highlighting for OCaml is far more accurate= .
  • There's integration with package managers such as opam and esy. One may= now explicitly use them to explicitly select the sandbox that contains the= lsp server and related tools.

Under the hood, the entire plugin was rewritten from typescript to OCaml (b= ucklescript). This should hopefully make contribution more accessible to OCaml hackers.

I'd like to thank @rustykey, @mnxn, @prometheansacrifice, and @imbsky for t= heir contributions to this release. Their help is the reason for this vastly improved version of the plugin.

As usual, the plugin is available directly using vscode's extension market = place. I'll leave a link to the plugin here to avoid confusion with the many other OCaml plugins available.

Please report any issues on the bug tracker

Other OCaml News

From the ocamlcore planet blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 21A4AE1E74 for ; Tue, 19 May 2020 11:52:56 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=/atN=7B=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3Asmx16RCDwvbY9won3bijUyQJP3N1i/DPJgcQr6Af?= =?us-ascii?q?oPdwSP3+pMqwAkXT6L1XgUPTWs2DsrQY0reQ6vi/EjVRqb+681k6OKRWUBEEjc?= =?us-ascii?q?hE1ycBO+WiTXPBEfjxciYhF95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRo?= =?us-ascii?q?LerpBIHSk9631+ev8JHPfglEnjWwba5yIRmssAndqssbjYR/Jqs11xDEvmZGd+?= =?us-ascii?q?NKyG1yOFmdhQz85sC+/J5i9yRfpfcs/NNeXKv5Yqo1U6VWACwpPG4p6sLrswLD?= =?us-ascii?q?TRaU6XsHTmoWiBtIDBPb4xz8Q5z8rzH1tut52CmdIM32UbU5Uims4qt3VBPljj?= =?us-ascii?q?oMODkk/mHKkcxwlLxUrw69pxJxxI7UZZuaNPt4fqjAed8XSm5MUsNXWiBBAY28?= =?us-ascii?q?aZUPD+saPeZZtIb9o0UBpgawBAmrHuPg1yRIjWLy0aA0z+gtFAfL0wI6H9IKrX?= =?us-ascii?q?/astP7OqkPWuyx0aXE0TDPYvVL0jn/9YfIaAgsr/GSU7xtf8TfykYgGB/eg1qK?= =?us-ascii?q?tYDoJSmY2vgRv2WZ6edrSOKhi3QgqwF0ujWi2sMshZPPhokI117L6SV5wIM0Jd?= =?us-ascii?q?2kVE5wfNmpH4FUty6AMYt6WNgiTH1ouCY/y70GpYK7cTMSyJQgwx7ea+CHfJaU?= =?us-ascii?q?7RLjUuaRIC54hG97d76lgBay60egx/T6W8Kp31lEsjBLncPQtnARyRPT8M6HR+?= =?us-ascii?q?Ny8Eu82DuB2Q7d5+9LLE0wkafVJJ4vzqItm5QdvkrOAzP7lUXogaKLdEgp++ml?= =?us-ascii?q?5erob7jluJORNIB6hwPxPKkvnMG0HOo2Mg8LX2eB+OS80qXu/VXnT7VWj/02jr?= =?us-ascii?q?fWsIjdJcQeo662HRVZ0oA95BajFzum18gXkmMCLFJBYh6HiJLpO17WLPD/Efiw?= =?us-ascii?q?mVGskDNxy/zcOb3hGJrNImDMkLfgYbZ971RTxxEpwd9D4JJUD6kNIP3yWk/ttN?= =?us-ascii?q?zYEwQ2Pxa1w+bgENlyzJ8RWWeVDq+eKqPSvkeE5v4xLOiNY48VoyzxJOQi5/7r?= =?us-ascii?q?lXM5ll4dfbWt3ZQNc3+0BPVmI0KBbXrqhdcBFH0FsRc/TOP2kVGCVSRcaG2pX6?= =?us-ascii?q?4m+j47D4emAZ/CRoCrmryB3T20EodYZmBcElyMHnbod5mEW/cRcy2eONVtkj0D?= =?us-ascii?q?VbS5RI8h1A2utA/ny7V8NObb5ioYtZf72Nhy++LcjxQy9ThuA8WS02CMTnl4nn?= =?us-ascii?q?kWSDAs2KB+r0t9yk2H0adlhPxXCcZc5/ZNUgsgMp7c1eN6B8jpWg3bf9eGVlCm?= =?us-ascii?q?Qs67AT0rUt0xxMUCY0RlG9m6jBDMwjCmDKMSl7yOHJA76KTc0GXrJ8ljyXbKzr?= =?us-ascii?q?Uuj14jQsdXNG2pm65+9wzXB4LTlEWZjamqeKIB1yDO7GeO1XeCsF9cXQJqTKnJ?= =?us-ascii?q?QX8SalHYoNjl/E/PQbCjBawlPwZC08KONKRHZsPzgVlbS/rvIsnSbm2tl2q2GB?= =?us-ascii?q?2G3KmDbJDwdGUYxCjdCFYLkwQU/XueMAg/CTqtr3jGDDxpEVLuY1/s/vdip3O7?= =?us-ascii?q?SE80zhiKb1B/2Lav/R4Vn/OcR+sS3rICpighty15EEuj09/SEdaMuhZtcapGbd?= =?us-ascii?q?4z/FtLz2zUugNlMpylNa9ih1oecwptv0Pp0hV6EphOn9Q3on821Ad+MriX0E9Z?= =?us-ascii?q?eT6A3539J6XaKnH1/BCra6/Wxk/R38qW+qcJ6fQ4skjjsx+zGkol6XVn3MFY3G?= =?us-ascii?q?GY5prQCgoeS4nxXVo39xh/prHafjU96pjP2n1rLKm0tCPN1MwyBOc/zxatcNhe?= =?us-ascii?q?PLmDFA/oHM0WH9KuJ/Aym1i1chIEO/hf+7IuMMOjc/uKwaqrPOd7nDK6lmlH+4?= =?us-ascii?q?B80keU9yVmUOLI3pAFw+uZ3gSdTTv8gk2h4YjLntUOYS4UVCLrzTfiLIpOYOt0?= =?us-ascii?q?cJpdTS/kKNKxjJ0205XyXVZc9UW/HBUH1N6tfVyVdVOrmUVb3EET5HimgjeQzj?= =?us-ascii?q?pukjhvoLDblCfJxvzKcBscJnUNQ3NojEvlJYazn5YXQRuGdQ8swTKh7ECy/KNb?= =?us-ascii?q?oaVjMyGHSENBeW7tJGFnU7esnqKFZ99T5ZgotyROTen6ZkqVHO2u6yAG2j/uSj?= =?us-ascii?q?MNjAswcCun78WoxkAouCemNH926UHhV4Ro3x6GtY7EQvpAwjcNRC95kCTaQF+m?= =?us-ascii?q?MIvwpIjGp9L4qum7ElmZeNhTfC3sl9jSsTvio3VtBQyjkvuznNz+DAV81jX0hY?= =?us-ascii?q?AzBHf46S3ka4yu7JyUdOduf01mHlj5spUoEIZjlIA9n9cVhWhcgY+aryMK?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BPFwCLq8NehyIeaIFmg3VYQAFdVTIsh?= =?us-ascii?q?CSBXYckhXiBMIFigg0ChTEmAY0ThAKBEANQAg0BAwEMGAEOBQECBAEBgw6BNgI?= =?us-ascii?q?XgXYdBgEFMxMCEAEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7DAwDAwGDHwEYA?= =?us-ascii?q?QIGCkAlIwMJCwEGAwIEDQEXARQKFwEJCRQGAYMLAYJ8BAEKlSubeYEyhDoBAwI?= =?us-ascii?q?BCwUPL4NzgUANAhN/F4UrhHMEXIExEw+BTD+BEYISSQdsgkENDgsBAQEBARmBA?= =?us-ascii?q?g0SBgEBBlAJglUXgkkEjjEMDgENJANoiDqIQoIRBo8YEWwHglOBAQSFZEd2hgm?= =?us-ascii?q?ECIM6gnOCXYEOh2KFAotKgT0hkA4UgVyFVwIHcAaBOYVciXYFhDmBPyqBRwEdA?= =?us-ascii?q?QsHMxowQ4I1AQEyCQlWDVaPRjABFoEDAQmCQoE+gSYigVM7hGRgPzMBAQEBMwI?= =?us-ascii?q?GAQcBAQMJdQEBBRMLAYs4gWhcAQE?= X-IPAS-Result: =?us-ascii?q?A0BPFwCLq8NehyIeaIFmg3VYQAFdVTIshCSBXYckhXiBMIF?= =?us-ascii?q?igg0ChTEmAY0ThAKBEANQAg0BAwEMGAEOBQECBAEBgw6BNgIXgXYdBgEFMxMCE?= =?us-ascii?q?AEBBQEBAQIBAgMEARMBAQEKCwkIKYVdDII7DAwDAwGDHwEYAQIGCkAlIwMJCwE?= =?us-ascii?q?GAwIEDQEXARQKFwEJCRQGAYMLAYJ8BAEKlSubeYEyhDoBAwIBCwUPL4NzgUANA?= =?us-ascii?q?hN/F4UrhHMEXIExEw+BTD+BEYISSQdsgkENDgsBAQEBARmBAg0SBgEBBlAJglU?= =?us-ascii?q?XgkkEjjEMDgENJANoiDqIQoIRBo8YEWwHglOBAQSFZEd2hgmECIM6gnOCXYEOh?= =?us-ascii?q?2KFAotKgT0hkA4UgVyFVwIHcAaBOYVciXYFhDmBPyqBRwEdAQsHMxowQ4I1AQE?= =?us-ascii?q?yCQlWDVaPRjABFoEDAQmCQoE+gSYigVM7hGRgPzMBAQEBMwIGAQcBAQMJdQEBB?= =?us-ascii?q?RMLAYs4gWhcAQE?= X-IronPort-AV: E=Sophos;i="5.73,409,1583190000"; d="scan'208,217";a="450365001" X-MGA-submission: =?us-ascii?q?MDEjU6ZvAG0Ge2uvC5BWHU7Ywq6CHn/nh8M+q7?= =?us-ascii?q?USc9b7eOFVV/2ggsAlM8Fz1jCmHWI66useuCXm8ZgHyWnhJUbODhlAte?= =?us-ascii?q?KEEFxhpGfpE6dqV7oaq3GUMNjWmgk/t4sy/c40BZfK/uTBNbTn+lb4rx?= =?us-ascii?q?TX1SBsJLnUuEKeU3I9pAQXWA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 May 2020 11:52:41 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 025F3564A3F; Tue, 19 May 2020 11:52:37 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 19 May 2020 11:52:37 +0200 Message-ID: <871rngz1y2.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 19 11:52:38 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.002572, queueID=91A5D564A40 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDEyIHRvIDE5LA0KMjAyMC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpvY2FtbGZvcm1h dCAwLjE0LjINCk1MIEZhbWlseSBXb3Jrc2hvcCAyMDIwOiBDYWxsIGZvciBwcmVzZW50YXRpb25z DQptZW1wcm9mLWxpbWl0cyBwcmV2aWV3IChhbmQgYSBndWlkZSB0byBoYW5kbGUgYXN5bmNocm9u b3VzIGV4Y2VwdGlvbnMpDQpUZXpvcyA3LjAgaXMgbm93IGF2YWlsYWJsZSBvbiBvcGFtDQpPZmZp Y2lhbCBPQ2FtbCBiaW5kaW5ncyBmb3IgdmVyaWZpZWQgRXZlcmVzdCBjcnlwdG9ncmFwaHkNCm5t ZWEgYW5kIHNhaWwtZ2FkZ2V0cw0KSXMgdGhlcmUgc3BlY2lhbGl6ZWQgbWF0aCBsaWJyYXJ5IGZv ciBzdGF0aXN0aWNzPw0KTmV3IE9DYW1sIGJvb2tzPw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENX Tg0KDQoNCm9jYW1sZm9ybWF0IDAuMTQuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0yLzU3NTQvMV0NCg0KDQpHdWlsbGF1bWUg UGV0aW90IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIHBsZWFz ZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgYG9jYW1sZm9ybWF0JyAwLjE0LjIuICBUaGlz DQogIG1pbm9yIHJlbGVhc2UgaW1wcm92ZXMgdGhlIHJlY2VudCAwLjE0LjAgYW5kIDAuMTQuMSBy ZWxlYXNlcyByZWdhcmRpbmcNCiAgdGhlIGBkb2MtY29tbWVudHMnIG9wdGlvbi4NCg0KDQpIb3cg dG8gbWlncmF0ZSBmcm9tIDAuMTMuMA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSGVyZSBh cmUgdGhlIGNoYW5nZXMgb2YgdGhlIGBkb2MtY29tbWVudHMnIG9wdGlvbnMgY29tcGFyZWQgdG8N CiAgb2NhbWxmb3JtYXQgMC4xMy4wOg0KICDigKIgYGFmdGVyJyBoYXMgYmVlbiByZW5hbWVkIHRv IGBhZnRlci13aGVuLXBvc3NpYmxlJyB0byB0YWtlIGludG8NCiAgICBhY2NvdW50IHRoZSB0ZWNo bmljYWwgbGltaXRhdGlvbnMgb2Ygb2NhbWxmb3JtYXQ7DQogIOKAoiBhIG5ldyB2YWx1ZSBgYmVm b3JlLWV4Y2VwdC12YWwnIGhhcyBiZWVuIGFkZGVkLCBwbGFjaW5nIGRvYy1jb21tZW50cw0KICAg IGJlZm9yZSB0aGUgY29ycmVzcG9uZGluZyBjb2RlLCBidXQgcGxhY2luZyBkb2MtY29tbWVudHMg b2YgdmFsIGFuZA0KICAgIGV4dGVybmFsIGRlY2xhcmF0aW9ucyBhZnRlciB0aGUgY29ycmVzcG9u ZGluZyBkZWNsYXJhdGlvbjsNCiAg4oCiIGBiZWZvcmUnIGlzIHVuY2hhbmdlZC4NCg0KICBIZXJl IGlzIHRoZSBmdWxsIGxpc3Qgb2YgY2hhbmdlcyBtYWRlIGJ5IHRoZSAwLjE0LjAgcmVsZWFzZToN CiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xNC0wLzU0 MzVdDQoNCg0KSG93IHRvIG1pZ3JhdGUgZnJvbSAwLjE0LjANCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoZSAwLjE0LjAgcmVsZWFzZSBsZWFkIHRvIHNvbWUgcmVncmVzc2lvbiBvZiB0aGUg YGRvYy1jb21tZW50cycNCiAgYmVoYXZpb3IgdGhhdCAoYWx0aG91Z2ggaW50ZW5kZWQgZm9yIHVz KSBsZWFkIHRvIHNvbWUgc3VycHJpc2UgZnJvbSBhDQogIGxvdCBvZiB1c2Vycy4gIFRoZSBiZWhh dmlvciBvZiBgZG9jLWNvbW1lbnRzJyBoYXMgdGh1cyBiZWVuIHJldmVydGVkDQogIHRvIGl0J3Mg MC4xMy4wIHN0YXRlIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOg0KDQogIFRoZSBgZG9jLWNv bW1lbnRzLXZhbCcgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIG1lcmdlZCB3aXRoDQogIGBk b2MtY29tbWVudHMnLiBUaGUgcGxhY2VtZW50IG9mIGRvY3VtZW50YXRpb24gY29tbWVudHMgb24g YHZhbCcgYW5kDQogIGBleHRlcm5hbCcgaXRlbXMgaXMgbm93IGNvbnRyb2xsZWQgYnkgYGRvYy1j b21tZW50cycgLg0KDQogIOKAoiBgZG9jLWNvbW1lbnRzPWFmdGVyJyBiZWNvbWVzIGBkb2MtY29t bWVudHM9YWZ0ZXItd2hlbi1wb3NzaWJsZScgdG8NCiAgICB0YWtlIGludG8gYWNjb3VudCB0aGUg dGVjaG5pY2FsIGxpbWl0YXRpb25zIG9mIG9jYW1sZm9ybWF0Ow0KICDigKIgYGRvYy1jb21tZW50 cz1iZWZvcmUnIGlzIHVuY2hhbmdlZDsNCiAg4oCiIGBkb2MtY29tbWVudHMtdmFsJyBpcyBub3cg cmVwbGFjZWQgd2l0aCBgZG9jLWNvbW1lbnRzJw0KDQogIFRvIHJlcHJvZHVjZSB0aGUgZm9ybWVy IGJlaGF2aW9ycw0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12 YWw9YmVmb3JlJyA6IG5vdyB1c2UNCiAgICBgZG9jLWNvbW1lbnRzPWJlZm9yZScgOw0KICDigKIg YGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXInIDogbm93IHVz ZQ0KICAgIGBkb2MtY29tbWVudHM9YmVmb3JlLWV4Y2VwdC12YWwnIDsNCiAg4oCiIGBkb2MtY29t bWVudHM9YWZ0ZXInICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3JlJyA6IHRoaXMgYmVoYXZpb3Ig ZGlkDQogICAgbm90IG1ha2UgbXVjaCBzZW5zZSBhbmQgaXMgbm90IGF2YWlsYWJsZSBhbnltb3Jl Ow0KICDigKIgYGRvYy1jb21tZW50cz1hZnRlcicgKyBgZG9jLWNvbW1lbnRzLXZhbD1hZnRlcicg OiBub3cgdXNlDQogICAgYGRvYy1jb21tZW50cz1hZnRlci13aGVuLXBvc3NpYmxlJy4NCg0KDQpI b3cgdG8gbWlncmF0ZSBmcm9tIDAuMTQuMQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhl IDAuMTQuMSByZWxlYXNlIHdhcyBwcmVzZXJ2aW5nIHRoZSBiZWhhdmlvciBvZiAwLjEzLjAgcmVn YXJkaW5nDQogIGBkb2MtY29tbWVudHMnLCBpdCBhZGRlZCBhIGB1bnNldCcgdmFsdWUgdG8gdGhl IGBkb2MtY29tbWVudHMtdmFsJw0KICBvcHRpb24uICBUaGlzIG9wdGlvbiBoYXMgYmVlbiByZW1v dmVkIHdpdGggdGhlIGZvbGxvd2luZyBjaGFuZ2VzOg0KDQogIFRoZSBgZG9jLWNvbW1lbnRzLXZh bCcgb3B0aW9uIGhhcyBiZWVuIHJlbW92ZWQgYW5kIG1lcmdlZCB3aXRoDQogIGBkb2MtY29tbWVu dHMnLiBUaGUgcGxhY2VtZW50IG9mIGRvY3VtZW50YXRpb24gY29tbWVudHMgb24gYHZhbCcgYW5k DQogIGBleHRlcm5hbCcgaXRlbXMgaXMgbm93IGNvbnRyb2xsZWQgYnkgYGRvYy1jb21tZW50cycg Lg0KDQogIOKAoiBgZG9jLWNvbW1lbnRzPWFmdGVyJyBiZWNvbWVzIGBkb2MtY29tbWVudHM9YWZ0 ZXItd2hlbi1wb3NzaWJsZScgdG8NCiAgICB0YWtlIGludG8gYWNjb3VudCB0aGUgdGVjaG5pY2Fs IGxpbWl0YXRpb25zIG9mIG9jYW1sZm9ybWF0Ow0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUn IGlzIHVuY2hhbmdlZDsNCiAg4oCiIGBkb2MtY29tbWVudHMtdmFsJyBpcyBub3cgcmVwbGFjZWQg d2l0aCBgZG9jLWNvbW1lbnRzJw0KDQogIFRvIHJlcHJvZHVjZSB0aGUgZm9ybWVyIGJlaGF2aW9y cw0KICDigKIgYGRvYy1jb21tZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3Jl JyA6IG5vdyB1c2UNCiAgICBgZG9jLWNvbW1lbnRzPWJlZm9yZScgOw0KICDigKIgYGRvYy1jb21t ZW50cz1iZWZvcmUnICsgYGRvYy1jb21tZW50cy12YWw9YWZ0ZXInIDogbm93IHVzZQ0KICAgIGBk b2MtY29tbWVudHM9YmVmb3JlLWV4Y2VwdC12YWwnIDsNCiAg4oCiIGBkb2MtY29tbWVudHM9YWZ0 ZXInICsgYGRvYy1jb21tZW50cy12YWw9YmVmb3JlJyA6IHRoaXMgYmVoYXZpb3IgZGlkDQogICAg bm90IG1ha2UgbXVjaCBzZW5zZSBhbmQgaXMgbm90IGF2YWlsYWJsZSBhbnltb3JlOw0KICDigKIg YGRvYy1jb21tZW50cz1hZnRlcicgKyBgZG9jLWNvbW1lbnRzLXZhbD1hZnRlcicgOiBub3cgdXNl DQogICAgYGRvYy1jb21tZW50cz1hZnRlci13aGVuLXBvc3NpYmxlJy4NCg0KDQpUaGFuayB5b3UN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIHdvdWxkIGxpa2UgdG8gdGhhbmsg b3VyIGVhcmx5IHVzZXJzIHRvIGhlbHAgdXMgb24gdGhlIHJvYWQgb2YgYQ0KICBzdGFibGUgMS4w LjAgcmVsZWFzZSBvZiBvY2FtbGZvcm1hdC4NCg0KDQpNTCBGYW1pbHkgV29ya3Nob3AgMjAyMDog Q2FsbCBmb3IgcHJlc2VudGF0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tbC1mYW1pbHktd29ya3No b3AtMjAyMC1jYWxsLWZvci1wcmVzZW50YXRpb25zLzU0NDEvNF0NCg0KDQpMZW8gV2hpdGUgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJQ0ZQLCBhbmQgYnkgZXh0ZW5zaW9uIHRoZSBNTCB3b3Jrc2hvcCwgd2ls bCBiZSBub3cgb2ZmaWNpYWxseSBiZSBoZWxkDQogIG9ubGluZSB3aXRoIGEgc2lnbmlmaWNhbnRs eSByZWR1Y2VkIGZlZS4gRHVlIHRvIHRoZSBjaGFuZ2UgaW4gb2ZmaWNpYWwNCiAgc3RhdHVzIHdl IGRlY2lkZWQgdG8gZXh0ZW5kIHRoZSBzdWJtaXNzaW9uIGRlYWRsaW5lIHRvIHRoZSBlbmQgb2Yg TWF5Lg0KDQoNCkltcG9ydGFudCBEYXRlcyAodXBkYXRlZCkNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiBGcmlkYXkgMjl0aCBNYXkgKGFueSB0aW1lIHpvbmUpOiBBYnN0cmFjdCBzdWJtaXNz aW9uIGRlYWRsaW5lDQogIOKAoiBGcmlkYXkgMTd0aCBKdWx5OiBBdXRob3Igbm90aWZpY2F0aW9u DQogIOKAoiBUaHVyc2RheSAyN3RoIEF1Z3VzdDogTUwgRmFtaWx5IFdvcmtzaG9wDQoNCg0KbWVt cHJvZi1saW1pdHMgcHJldmlldyAoYW5kIGEgZ3VpZGUgdG8gaGFuZGxlIGFzeW5jaHJvbm91cyBl eGNlcHRpb25zKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWVtcHJvZi1saW1p dHMtcHJldmlldy1hbmQtYS1ndWlkZS10by1oYW5kbGUtYXN5bmNocm9ub3VzLWV4Y2VwdGlvbnMv NTc1Ni8xXQ0KDQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBP Q2FtbGVycywgSSBhbSBoYXBweSB0byBwcmUtYW5ub3VuY2UgW21lbXByb2YtbGltaXRzXSwgYW4N CiAgaW1wbGVtZW50YXRpb24gb2YgcGVyLXRocmVhZCBnbG9iYWwgbWVtb3J5IGxpbWl0cywgYW5k IHBlci10aHJlYWQNCiAgYWxsb2NhdGlvbiBsaW1pdHMgw6AgbGEgSGFza2VsbCwgY29tcGF0aWJs ZSB3aXRoIHN5c3RocmVhZHMuDQoNCiAgTWVtcHJvZi1saW1pdHMgaW50ZXJydXB0cyB0aGUgZXhl Y3V0aW9uIGJ5IHJhaXNpbmcgYW4gX2FzeW5jaHJvbm91cw0KICBleGNlcHRpb25fLCBhbiBleGNl cHRpb24gdGhhdCBjYW4gYXJpc2UgYXQgYWxtb3N0IGFueSBsb2NhdGlvbiBpbiB0aGUNCiAgY29k ZS4gSSBhbHNvIGFubm91bmNlIFthIGd1aWRlIG9uIGhvdyB0byByZWNvdmVyIGZyb20gYXN5bmNo cm9ub3VzDQogIGV4Y2VwdGlvbnMgYW5kIG90aGVyIHVuZXhwZWN0ZWQgZXhjZXB0aW9uc10gdGhh dCB5b3UgZmluZCBpbiB0aGUNCiAgZG9jdW1lbnRhdGlvbi4gSXQgc3VtbWFyaXNlcyBrbm93bGVk Z2UgYWNxdWlyZWQgaW4gT0NhbWwgYnkgdGhlIENvcQ0KICBwcm9vZiBhc3Npc3RhbnQgYXMgd2Vs bCBhcyBpbiBvdGhlciBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIFRvIG15DQogIGtub3dsZWRnZSwg dGhpcyBoYXMgbmV2ZXIgYmVlbiB0b2xkIGluIE9DYW1sIHRleHRib29rcywgc28gSSB0aG91Z2h0 DQogIGl0IG1pZ2h0IGJlIG9mIGdlbmVyYWwgaW50ZXJlc3QgdG8geW91LiBUaGlzIHJlc2VhcmNo IGlzIHBhcnQgb2YgYQ0KICB3aWRlciB3b3JrIGFpbWluZyB0byByZWd1bGF0ZSB0aGUgdXNlIG9m IGFzeW5jaHJvbm91cyBleGNlcHRpb25zIGluDQogIE9DYW1sIGluIGNvb3JkaW5hdGlvbiB3aXRo IG11bHRpY29yZSBsYW5ndWFnZSBkZXNpZ25lcnMuDQoNCiAgX0dsb2JhbCBtZW1vcnkgbGltaXRz XyBsZXQgeW91IGJvdW5kIHRoZSBtZW1vcnkgY29uc3VtcHRpb24gaW5zaWRlDQogIHNwZWNpZmlj IHBhcnRzIG9mIHlvdXIgcHJvZ3JhbSwgaW4gdGVybXMgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHdo b2xlDQogIHByb2dyYW0uIEl0IGlzIGluc3BpcmVkIGJ5IFt0aGlzIG90aGVyIHBvc3RdLCBidXQg aW4gYSBmb3JtIHJlYWRpbHkNCiAgYXZhaWxhYmxlIGZvciB1c2Ugd2l0aCBzeXN0aHJlYWRzLg0K DQogIF9BbGxvY2F0aW9uIGxpbWl0c18gbGV0IHlvdSBib3VuZCB0aGUgZXhlY3V0aW9uIG9mIHBh cnRzIG9mIHRoZQ0KICBwcm9ncmFtIG1lYXN1cmVkIGluIG51bWJlciBvZiBhbGxvY2F0aW9ucywg YW5hbG9nb3VzIHRvIHRoZSBzYW1lDQogIGZlYXR1cmUgaW4gSGFza2VsbCBhZHZvY2F0ZWQgaW4g W2EgbmljZSBwb3N0IGJ5IFNpbW9uDQogIE1hcmxvd10uIEFsbG9jYXRpb24gbGltaXRzIGNvdW50 IGFsbG9jYXRpb25zIGJ1dCBfbm90XyBkZWFsbG9jYXRpb25zLA0KICBhbmQgaXMgdGhlcmVmb3Jl IGEgbWVhc3VyZSBvZiB0aGUgd29yayBkb25lLCB3aGljaCBjYW4gYmUgbW9yZQ0KICBzdWl0YWJs ZSB0aGFuIGV4ZWN1dGlvbiB0aW1lLg0KDQogIE1lbXByb2YtbGltaXRzLCBhcyB0aGUgbmFtZSB0 ZWxscywgdXNlcyB0aGUgdXBjb21pbmcgTWVtcHJvZiBlbmdpbmUNCiAgZnJvbSBPQ2FtbCA0LjEx LCB3aXRoIGEgbG93IHNhbXBsaW5nIHJhdGUgdGhhdCBkb2VzIG5vdCBhZmZlY3QNCiAgcGVyZm9y bWFuY2UuIEEgcmVpbXBsZW1lbnRhdGlvbiBvZiB0aGUgTWVtcHJvZiBpbnRlcmZhY2UgY29tcGF0 aWJsZQ0KICB3aXRoIG1lbXByb2YtbGltaXRzIHJ1bm5pbmcgYXQgdGhlIHNhbWUgdGltZSBpcyBw cm92aWRlZCBmb3IgcHJvZmlsaW5nDQogIG5lZWRzLg0KDQogIE1lbXByb2YtbGltaXRzIGlzIGF2 YWlsYWJsZSBvbiB0aGUgcHVibGljIG9wYW0gcmVwb3NpdG9yeSwgYnV0IGRlcGVuZHMNCiAgb24g T0NhbWwgNC4xMSB3aGljaCBhdCB0aGUgbW9tZW50IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBiZXRh IG9wYW0NCiAgcmVwb3NpdG9yeSBvbmx5LiBJdCBpcyBfZXhwZXJpbWVudGFsXyBmb3IgcmVhc29u cyBleHBsYWluZWQgaW4gdGhlDQogIG1hbnVhbC4NCg0KDQpbbWVtcHJvZi1saW1pdHNdIGh0dHBz Oi8vZ2l0bGFiLmNvbS9nYWRtbS9tZW1wcm9mLWxpbWl0cw0KDQpbYSBndWlkZSBvbiBob3cgdG8g cmVjb3ZlciBmcm9tIGFzeW5jaHJvbm91cyBleGNlcHRpb25zIGFuZCBvdGhlcg0KdW5leHBlY3Rl ZCBleGNlcHRpb25zXSBodHRwczovL2dpdGxhYi5jb20vZ2FkbW0vbWVtcHJvZi1saW1pdHMjcmVj b3Zlcg0KDQpbdGhpcyBvdGhlciBwb3N0XQ0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Rv ZGF5cy10cmljay1tZW1vcnktbGltaXRzLXdpdGgtZ2MtYWxhcm1zLzQ0MzENCg0KW2EgbmljZSBw b3N0IGJ5IFNpbW9uIE1hcmxvd10NCmh0dHBzOi8vc2ltb25tYXIuZ2l0aHViLmlvL3Bvc3RzLzIw MTctMDEtMjQtYXN5bmNocm9ub3VzLWV4Y2VwdGlvbnMuaHRtbA0KDQpGQVENCuKVjOKVjOKVjA0K DQril4og4oCcSXMgaXQgd2lzZSB0byByZWx5IG9uIHRoZSBzdGF0aXN0aWNhbCBuYXR1cmUgb2Yg TWVtcHJvZj8gSWYgSSBzZXQgYW4gYWxsb2NhdGlvbiBsaW1pdCBvZiAxMDAgS0IsIGFuZCBydW4g YSBmdW5jdGlvbiB0aGF0IGFsbG9jYXRlcyBleGFjdGx5IDUwIEtCLCB0aGVuIHRoZSBmdW5jdGlv biBtaWdodCBmYWlsLCBkdWUgdG8gdGhlIHJhbmRvbSBuYXR1cmUgb2YgTWVtcHJvZi7igJ0NCg0K ICBNZW1wcm9mLWxpbWl0cyBpcyBwcm92aWRlZCB3aXRoIGEgW3N0YXRpc3RpY2FsIGFuYWx5c2lz XSBtZWFudCB0byBoZWxwDQogIHlvdSBjaG9zZSBhcHByb3ByaWF0ZSB2YWx1ZXMgZm9yIHRoZSBs aW1pdCBkZXBlbmRpbmcgb24gYSB0YXJnZXQgc2FmZQ0KICBhbGxvY2F0aW9uIHZhbHVlLiAoTmlj ZSBwaWN0dXJlcyBvbWl0dGVkIGJlY2F1c2UgdGhpcyBkaXNjdXNzIGRvZXMgbm90DQogIHN1cHBv cnQgc3ZnLikNCg0KICBMb25nIHN0b3J5IHNob3J0LCBtZW1wcm9mLWxpbWl0cyBzdGFydHMgYmVp bmcgYWNjdXJhdGUtZW5vdWdoIHN0YXJ0aW5nDQogIGFyb3VuZCBhIHNhZmUgYWxsb2NhdGlvbiB2 YWx1ZSBvZiAxMDAgS0Igd2l0aCB0aGUgZGVmYXVsdCBzYW1wbGluZw0KICByYXRlIChtZWFuaW5n IGEgbGltaXQgb2YgMSB0byAzIE1CIGRlcGVuZGluZyBvbiBjaG9zZW4gcHJlY2lzaW9uKSwNCiAg d2l0aCB0aGUgcmF0aW8gYmV0d2VlbiB0aGUgbWF4aW1hbCBzYWZlIGFsbG9jYXRpb24gYW5kIHRo ZSBsaW1pdA0KICBkcm9wcGluZyB2ZXJ5IHF1aWNrbHkgZm9yIGhpZ2hlciB2YWx1ZXMuIENvcnJl Y3RseSwgdGhlIGFuYWx5c2lzIHNob3dzDQogIHRoYXQgbGltaXRzIHVuZGVyIDUwMCBLQiBhcmUg dW5yZWxpYWJsZS4NCg0KICBJIGhhdmUgZm91bmQgdGhhdCB0aGUgc3RhdGlzdGljYWwgbmF0dXJl IG9mIE1lbXByb2YgbWFrZXMgaXQgdmVyeSBlYXN5DQogIHRvIHJlYXNvbiBhYm91dCBpdHMgYXBw bGljYXRpb24gYW5kIG5vdCBoYXZlIHRvIGZhY3RvciBpbiBydW50aW1lDQogIGltcGxlbWVudGF0 aW9uIGRldGFpbHMuIEluIGFkZGl0aW9uLCBNZW1wcm9mIGlzIG5ldmVydGhlbGVzcw0KICBkZXRl cm1pbmlzdGljLCB3aGljaCBpcyAoZXNzZW50aWFsIGFuZCkgdXNlZnVsIGZvciByZXByb2R1Y2lu ZyBydW5zIGluDQogIHRlc3Qgc2NlbmFyaW9zLg0KDQoNCiAgW3N0YXRpc3RpY2FsIGFuYWx5c2lz XQ0KICBodHRwczovL2dpdGxhYi5jb20vZ2FkbW0vbWVtcHJvZi1saW1pdHMjc3RhdGlzdGljYWwN Cg0KDQril4og4oCcQnV0IGNhbiB3ZSByZWFsbHkgcHJvZ3JhbSB3aXRoIG1lbXByb2YtbGltaXRz LCB0aGF0IGlzLCBub3Qgb25seSB3cml0ZSBwcm9ncmFtcyBidXQgYWxzbyByZWFzb24gYWJvdXQg dGhlbSwgZ2l2ZW4gdGhlIHByb2JhYmlsaXN0aWMgbmF0dXJlIG9mIHRoZSBndWFyYW50ZWVzP+KA nQ0KDQogIFllcywgaWYgd2UgbWFrZSB0d28gYWRkaXRpb25hbCBoeXBvdGhlc2VzOg0KDQogIDEu IEFsbG9jYXRpb24gbGltaXRzIChhcyB1c2VkIGluIEhhc2tlbGwpIGFyZSB1c2VkIGJ5IGRldGVy bWluaW5nIHBlYWsNCiAgICAgcmVhc29uYWJsZSBhbGxvY2F0aW9uIHVzYWdlIGVtcGlyaWNhbGx5 IGFuZCBwaWNraW5nIGEgbGltaXQgYXQgYQ0KICAgICBjb21mb3J0YWJsZSBtYXJnaW4gb3ZlciBp dCwgcmF0aGVyIHRoYW4gY29tcHV0aW5nIGEgcHJlY2lzZSBtZW1vcnkNCiAgICAgYm91bmQgdG8g YmUgdXNlZCBhcyBhIGxpbWl0LiBJbiB2ZXJ5IGNvbnRyb2xsZWQgZW52aXJvbm1lbnRzIHdoZXJl DQogICAgIHRoZSBsYXR0ZXIgd291bGQgYmUgcG9zc2libGUsIHRoZXJlIHByb2JhYmx5IHdvdWxk IGJlIGJldHRlcg0KICAgICBzb2x1dGlvbnMsIGFuZCB0aGUgbGFuZ3VhZ2UgdGhpcyBpcyBpbnNw aXJlZCBmcm9tIG1ha2VzIGl0IHZlcnkNCiAgICAgaGFyZCB0byBtYWtlIHByZWRpY3Rpb25zIG9u IG1lbW9yeSB1c2UuDQogIDIuIFRoZSBwcm9ncmFtbWVyIGlzIGZpbmUgd2l0aCBhIHZlcnkgdW5s aWtlbHkgcG9zc2liaWxpdHkgb2YgYSBmYWxzZQ0KICAgICBwb3NpdGl2ZTsgaW5kZWVkIHRoZSBw cm9ncmFtIGlzIGFscmVhZHkgZGVzaWduZWQgdG8gbGV0IHRydWUNCiAgICAgcG9zaXRpdmVzIGZh aWwgd2l0aG91dCBicmluZ2luZyBkb3duIG1pc3Npb24tY3JpdGljYWwgcGFydHMgb2YgdGhlDQog ICAgIHByb2dyYW0uIEZvciBpbnN0YW5jZSB0aGV5IGNhbiBwcmVmZXIgdG8gc2VlIGEgbGVnaXRp bWF0ZSBjbGllbnQNCiAgICAgaGF2aW5nIGEgY29ubmV4aW9uIGNsb3NlZCBvbmNlIGV2ZXJ5IDEw 4oG/IHllYXIgZm9yICpuKiBvZiB0aGVpcg0KICAgICBjaG9vc2luZywgaWYgdGhhdCBpcyB0aGUg cHJpY2UgdG8gcGF5IGZvciBhdm9pZGluZyBiZWluZyBzdWJqZWN0IHRvDQogICAgIERPUyBvbiBt YWxpY2lvdXNseS1jcmFmdGVkIHJlcXVlc3RzLg0KDQogIFVuZGVyIHRoZXNlIGh5cG90aGVzZXMs IHRoZSBzdGF0aXN0aWNhbCBsaW1pdCBpcyBqdXN0IGFzIHJlbGlhYmxlIGFzDQogIHRoZSBwcmVj aXNlIGxpbWl0cyDDoCBsYSBIYXNrZWxsLg0KDQoNCuKXiiDigJxJcyBpdCBwb3NzaWJsZSB0byBh bHNvIGltcGxlbWVudCBfbG9jYWwgbWVtb3J5IGxpbWl0c18sIHRvIGJvdW5kIHRoZSBtZW1vcnkg Y29uc3VtcHRpb24gb2YgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uP+KAnQ0KDQogIFllcyBidXQgcmVh ZCBvbi4NCg0KICBbWWFuZyAmIE1hemnDqHJlcyAoMjAxNCldIGFkdm9jYXRlcyBpbiBmYXZvdXIg b2YgYW4gX2FsbG9jYXRvci1wYXlzXw0KICBtb2RlbCBvZiBjb3N0IGF0dHJpYnV0aW9uLCBhbmQg bm90ZSBpdHMgc2ltaWxhcml0eSB3aXRoIG1lbW9yeQ0KICBwcm9maWxpbmcuIEluIHRoaXMgbW9k ZWwsIGl0IGlzIHBvc3NpYmxlIGZvciBpbnN0YW5jZSB0byBwcm9jZXNzDQogIHVudHJ1c3RlZCB1 c2VyIGlucHV0IHVuZGVyIHNvbWUgbWVtb3J5IGxpbWl0LCBiZWZvcmUgdGhlIHJlc3VsdCBpcw0K ICBkaXN0cmlidXRlZCB0byB0aGUgcmVzdCBvZiB0aGUgcHJvZ3JhbS4NCg0KICBJbXBsZW1lbnRp bmcgbWVtb3J5IGxpbWl0cyBiYXNlZCBvbiB0aGUgYWxsb2NhdG9yLXBheXMgbW9kZWwsIGJ5DQog IGFkYXB0aW5nIGFsbG9jYXRpb24gbGltaXRzIHRvIHRha2UgaW50byBhY2NvdW50IGRlYWxsb2Nh dGlvbnMsIHdvdWxkDQogIGJlIHZlcnkgZWFzeSB0aGFua3MgdG8gdGhlIGZhY2lsaXRpZXMgcHJv dmlkZWQgYnkgTWVtcHJvZi4gTW9yZW92ZXIsDQogIHRoZSBzdGF0aXN0aWNhbCBhbmFseXNpcyBv ZiBhbGxvY2F0aW9uIGxpbWl0cyBjYW4gYmUgdHJhbnNwb3NlZCwgYW5kDQogIGd1YXJhbnRlZXMg c2ltaWxhcmx5IGFjY3VyYWN5IGF0IGEgbG93IHJ1bnRpbWUgY29zdCBmb3IgbGltaXRzIGdyZWF0 ZXINCiAgdGhhbiAxMDBLQi4NCg0KICBUaGVyZSBpcyBvbmUgc3VycHJpc2luZyBkaWZmaWN1bHR5 LCB0aG91Z2gsIHdoaWNoIGhhcyB0byBkbyB3aXRoIHRoZQ0KICB3YXkgdGhlIEdDIHdvcmtzLiBU aGUgR0MgaGFzIGEgc3BhY2Ugb3ZlcmhlYWQ6IG1lbW9yeSB0aGF0IGlzIHdhc3RlZA0KICBiZWNh dXNlIHVucmVhY2hhYmxlIHZhbHVlcyBhcmUgbm90IGNvbGxlY3RlZCBpbW1lZGlhdGVseS4gVGhp cw0KICBvdmVyaGVhZCBoYXMgdG8gYmUgdGFrZW4gaW50byBhY2NvdW50IHdoZW4gY2hvb3Npbmcg dGhlDQogIGxpbWl0LiBIb3dldmVyLCB0aGlzIG92ZXJoZWFkIGlzIG5vbi1sb2NhbCBhbmQgZGVw ZW5kZW50IG9uIHRoZQ0KICBfdG90YWxfIG1ham9yIGhlYXAgc2l6ZTogb25lIGNhbm5vdCBqdXN0 IHNheSDigJx0YWtlIHRoZSBkb3VibGUgb2YgdGhlDQogIGRlc2lyZWQgbGltaXTigJ0uIEluZGVl ZCwgYWN0aXZlIHRocmVhZHMgd2lsbCBwYXkgZm9yIG1lbW9yeSB0aGF0IGhhcw0KICBiZWVuIGFs bG9jYXRlZCBpbiB0aGUgcGFzdCBhbmQga2VwdCBhbGl2ZS4gTW9yZSBleHBlcmltZW50YXRpb24g aXMNCiAgbmVlZGVkIHRvIHByb3ZpZGUgZ3VpZGFuY2Ugb24gaG93IHRvIHRha2UgdGhlIHNwYWNl IG92ZXJoZWFkIGludG8NCiAgYWNjb3VudC4NCg0KDQogIFtZYW5nICYgTWF6acOocmVzICgyMDE0 KV0NCiAgaHR0cHM6Ly9kbC5hY20ub3JnL2RvaS8xMC4xMTQ1LzI1OTQyOTEuMjU5NDM0MQ0KDQoN CuKXiiDigJxDYW4gdGhpcyBiZSB1c2VkIHRvIGJvdW5kIHRoZSBjb25zdW1wdGlvbiBvZiBsaWdo dHdlaWdodCB0aHJlYWRzIGluIEx3dCBhbmQgQXN5bmM/4oCdDQoNCiAgSXQgaXMgc3RyYWlnaHRm b3J3YXJkIHRvIG1ha2UgbWVtcHJvZi1saW1pdHMgcGFyYW1ldHJpYyBpbiB0aGUgbm90aW9uDQog IG9mIF90aHJlYWQgaWRfIHVzZWQgdG8gdHJhY2sgcGVyLXRocmVhZCBsaW1pdHMuICBIb3dldmVy LCB0byB0aGUgYmVzdA0KICBvZiBteSBrbm93bGVkZ2UsIEx3dCBhbmQgQXN5bmMgYXJlIG5vdCBt ZWFudCB0byBwbGF5IHdlbGwgd2hlbiB0aGUNCiAgY29tcHV0YXRpb24gaXMgaW50ZXJydXB0ZWQg YnkgYXN5bmNocm9ub3VzIGV4Y2VwdGlvbnMuIElmIHlvdSBoYXZlDQogIG1vcmUgaW5mb3JtYXRp b24gYWJvdXQgdGhpcyBsaW1pdGF0aW9uIG9yIGFyZSBpbnRlcmVzdGVkIGluDQogIGV4cGVyaW1l bnRpbmcsIHBsZWFzZSBnZXQgaW4gdG91Y2guDQoNCg0KVGhhbmtzDQrilYzilYzilYzilYzilYzi lYwNCg0KICBUaGFuayB5b3UgdG8gSmFjcXVlcy1IZW5yaSBKb3VyZGFuIGZvciBoaXMgZXhwbGFu YXRpb25zIGFib3V0IE1lbXByb2YNCiAgYW5kIFN0ZXBoZW4gRG9sYW4gZm9yIGhpcyBmZWVkYmFj ay4NCg0KDQpUZXpvcyA3LjAgaXMgbm93IGF2YWlsYWJsZSBvbiBvcGFtDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10ZXpvcy03LTAtaXMtbm93LWF2YWlsYWJsZS1vbi1v cGFtLzU3NjQvMV0NCg0KDQpQaWVycmUgQm91dGlsbGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFRlem9zIGV4ZWN1dGFibGVzIGFuZCBsaWJyYXJpZXMgaGF2ZSBq dXN0IGJlZW4gcmVsZWFzZWQgb24gYG9wYW0nLiBZb3UNCiAgY2FuIHRodXMgYnVpbGQgdGhlbSBm cm9tIHNvdXJjZSB3aXRoIGEgc2ltcGxlIGBvcGFtIGluc3RhbGwgdGV6b3MnIGFuZA0KICBidWls ZCB5b3VyIG93biBwcm9qZWN0cyB1cG9uIHRoZW0uDQoNCg0KV2hhdCBpcyBUZXpvcw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGV6b3MgaXMgYSBkaXN0cmli dXRlZCBjb25zZW5zdXMgcGxhdGZvcm0gd2l0aCBtZXRhLWNvbnNlbnN1cw0KICBjYXBhYmlsaXR5 LiBUZXpvcyBub3Qgb25seSBjb21lcyB0byBjb25zZW5zdXMgYWJvdXQgdGhlIHN0YXRlIG9mIGl0 cw0KICBsZWRnZXIsIGxpa2UgQml0Y29pbiBvciBFdGhlcmV1bS4gSXQgYWxzbyBjb21lcyB0byBj b25zZW5zdXMgYWJvdXQgaG93DQogIHRoZSBwcm90b2NvbCBhbmQgdGhlIG5vZGVzIHNob3VsZCBh ZGFwdCBhbmQgdXBncmFkZS4gRm9yIG1vcmUNCiAgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHByb2pl Y3QsIHNlZSBbaHR0cHM6Ly90ZXpvcy5jb21dLg0KDQogIE91ciBpbXBsZW1lbnRhdGlvbiBvZiBU ZXpvcyBpcyB3cml0dGVuIGluIE9DYW1sLiBJdCBpcyBzcGxpdCBpbnRvDQogIHNldmVyYWwgbGli cmFyaWVzIChjb21tYW5kLWxpbmUgaW50ZXJmYWNlIGB0ZXpvcy1jbGljJywgcGVlci10by1wZWVy DQogIGxpYnJhcnkgYHRlem9zLXAycCcsIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyBgdGV6b3Mt Y3J5cHRvfuKApikgYW5kDQogIGV4ZWN1dGFibGVzIChub2RlIH50ZXpvcy1ub2RlJywgY2xpZW50 IH50ZXpvcy1jbGllbnR+4oCmKS4NCg0KDQpVc2VmdWwgTGlua3MNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFNvdXJjZSBjb2RlIGZvciB0aGlzIHBhcnRpY3VsYXIg aW1wbGVtZW50YXRpb24gY2FuIGJlIGZvdW5kIGF0DQogIFtodHRwczovL2dpdGxhYi5jb20vdGV6 b3MvdGV6b3MvXS4gRGV2ZWxvcGVyIGRvY3VtZW50YXRpb24gaXMNCiAgYXZhaWxhYmxlIGF0IFto dHRwczovL3Rlem9zLmdpdGxhYi5pby9dLiBJbiBwYXJ0aWN1bGFyLCBkb2N1bWVudGF0aW9uDQog IGZvciB0aGlzIHNwZWNpZmljIHJlbGVhc2UgKHZlcnNpb24gNy4wKSBpcyBhdmFpbGFibGUgYXQN CiAgW2h0dHA6Ly90ZXpvcy5naXRsYWIuaW8vcmVsZWFzZXMvdmVyc2lvbi03Lmh0bWxdLg0KDQoN Ckluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRlem9z IChpbnRlcm5hbCBjb21waWxlciBpbiBvcmRlciB0byBzZWxmIGFtZW5kIGl0c2VsZikgcmVxdWly ZXMgYQ0KICBzcGVjaWZpYyB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciAoT0NhbWwgNC4wOS4xKToN Cg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIDQuMDkuMQ0KICDilJTilIDi lIDilIDilIANCg0KICBUZXpvcyBhbHNvIHJlcXVpcmVzIHNvbWUgZXh0ZXJuYWwgbGlicmFyaWVz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBkZXBleHQgdGV6b3MNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgRmluYWxseSwgdG8gaW5zdGFsbCBhbGwgYmluYXJpZXM6DQoNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluc3RhbGwgdGV6b3MNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCg0KUmVwbHlpbmcgdG8gTmljayBCZXR0ZXJpZGdlLCBSYXBoYcOrbCBQcm91c3Qgc2FpZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGV6b3MgaGFzIGEgc29mdC11cGRh dGluZyBtZWNoYW5pc20gdGhhdCB3b3JrcyAocm91Z2hseSkgYXMgZm9sbG93czoNCg0KICBUaGUg bmV0d29yayBzdGFydHMgd2l0aCBhIGdlbmVzaXMgcHJvdG9jb2wgKOKAnHByb3RvY29s4oCdIGhl cmUgbWVhbnMNCiAg4oCcZWNvbm9taWMgcHJvdG9jb2zigJ06IHRoZSBydWxlcyBhY2NvcmRpbmcg dG8gd2hpY2ggc21hcnQgY29udHJhY3RzIGFyZQ0KICBpbml0aWF0ZWQgYW5kIGFjdGVkIHVwb24s IHRyYW5zYWN0aW9ucyB0YWtlIHBsYWNlLCBldGMuKSBpbiB3aGljaCBhDQogIHNpbmdsZSBwdWJs aWMga2V5IGlzIHNwZWNpZmllZC4NCg0KICBUaGUgZ2VuZXNpcyBwcm90b2NvbCBoYXMgbm8gbm90 aW9uIG9mIGNvaW4sIGN1cnJlbmN5LCBzbWFydC1jb250cmFjdCwNCiAgZXRjLiBJbnN0ZWFkLCB0 aGUgZ2VuZXNpcyBwcm90b2NvbCBrbm93cyBhIHNpbmdsZSBvcGVyYXRpb246IGENCiAgcHJvdG9j b2wgaW5qZWN0aW9uLg0KDQogIFRoZSBwcm90b2NvbCBpbmplY3Rpb24gZm9yIGdlbmVzaXMgcmVx dWlyZXMgdGhlIG9wZXJhdGlvbiB0byBiZSBzaWduZWQNCiAgYnkgdGhlIHByaXZhdGUga2V5IHRo YXQgbWF0Y2hlcyB0aGUgcHVibGljIGtleSBvZiB0aGUgZ2VuZXNpcw0KICBibG9jay4gQW5kIHRo ZSBwcm90b2NvbCBpbmplY3Rpb24gY2hhbmdlcywgaXJyZXZlcnNpYmx5LCB0aGUgZ2VuZXNpcw0K ICBwcm90b2NvbCB0byBhIG5ldyBwcm90b2NvbC4gVGhpcyBuZXcgcHJvdG9jb2wgc3BlY2lmaWVz IHdoYXQNCiAgY29uc3RpdHV0ZXMgYSB2YWxpZCBibG9jayB0byBhZGQgdG8gdGhlIGNoYWluLg0K DQogIEluIHRoZSBUZXpvcyBibG9ja2NoYWluLCB0aGUgcHJvdG9jb2wgaW5qZWN0ZWQgb24gdG9w IG9mIGdlbmVzaXMNCiAgaW5jbHVkZWQgYSBub3Rpb24gb2YgY29pbnMgYW5kIGFuIGluLXByb3Rv Y29sIHZvdGluZyBzeXN0ZW0gdG8gaW5qZWN0DQogIG5ldyBwcm90b2NvbHMgYmFzZWQgb24gY29u c2Vuc3VzIGFtb25nc3QgY29pbi1ob2xkZXJzLiBUaGVyZSBpcyBldmVuIGENCiAgc3lzdGVtIHRv IG9idGFpbiB0aGUgcHJvdG9jb2wgc291cmNlcyBvdmVyIHRoZSBibG9ja2NoYWluIG5ldHdvcmsg c28NCiAgdGhleSBjYW4gYmUgY29tcGlsZWQgYnkgZWFjaCBub2RlIGFuZCBkeW5saW5rZWQgZGly ZWN0bHkgaW46IHlvdSBkb24ndA0KICBuZWVkIHRvIHVwZGF0ZS9yZXN0YXJ0IHlvdXIgbm9kZSB0 byBnZXQgdGhlIHByb3RvY29sIHVwZGF0ZXMuIEhvd2V2ZXIsDQogIHRoaXMgaXMgYXJiaXRyYXJ5 OiB5b3UgY2FuIHN0YXJ0IGEgbmV3IGJsb2NrLWNoYWluIHdpdGggYSBkaWZmZXJlbnQNCiAgcHJv dG9jb2wuDQoNCiAgRm9yIGV4YW1wbGUsIHlvdSBjb3VsZCByZS1pbXBsZW1lbnQgQml0Y29pbiAo cHJvb2Ytb2Ytd29yaywNCiAgY29pbnMrdHJhbnNmZXIsIGV0Yy4pIGFzIGEgcHJvdG9jb2wgdGhh dCB5b3UgaW5qZWN0IG9uIHRvcCBvZg0KICBnZW5lc2lzLiBZb3VyIGJsb2NrIGNoYWluIHdvdWxk IGhhdmUgYSB0ZXpvcyBnZW5lc2lzIGJsb2NrLCB0aGVuIGENCiAgYmxvY2sgdGhhdCBhY3RpdmF0 ZSB5b3VyIG93biB2ZXJzaW9uIG9mIGJpdGNvaW4sIGFuZCB0aGVuIHRoZSBibG9ja3MNCiAgd291 bGQgYmUgc2ltaWxhciB0byB3aGF0IHlvdSB3b3VsZCBmaW5kIG9uIHRoZSBiaXRjb2luIGJsb2Nr LWNoYWluLg0KDQogIE9mIHBhcnRpY3VsYXIgaW50ZXJlc3QgdG8geW91LCB0aGUgcHJvdG9jb2wg eW91IGluamVjdCBjYW4gaGF2ZQ0KICBlbnRpcmVseSBkaWZmZXJlbnQgb24tY2hhaW4gbm90aW9u cyAoZS5nLiwgYSBUQ0cvQ0NHIHdpdGggbm8gY29pbnMgYXQNCiAgYWxsIGJ1dCBhIG5vdGlvbiBv ZiBvd25lcnNoaXAgb3ZlciBjYXJkcykgYW5kIGRpZmZlcmVudCBzb2Z0LXVwZGF0aW5nDQogIG1l Y2hhbmlzbSAoZS5nLiwgdGhlIG5ldyBwcm90b2NvbCBjYW4gYWNjZXB0IGdlbmVzaXMtc3R5bGUg dXBkYXRlcyAoYQ0KICDigJxkaWN0YXRvcnNoaXDigJ0gd2hlcmUgYSBzaW5nbGUgcGVyc29uIGNv bnRyb2xzIHRoZSBwcm90b2NvbCkgb3IgZXZlbiBubw0KICBzb2Z0LXVwZGF0aW5nIG1lY2hhbmlz bSBhdCBhbGwgKGEg4oCcc3RhbGXigJ0gcHJvdG9jb2wgd2hlcmUgeW91IG5lZWQgdG8NCiAgaGFy ZC1mb3JrIGlmIHlvdSB3YW50IHRvIG1ha2Ugc2lnbmlmaWNhbnQgY2hhbmdlcykpLg0KDQogIEZv ciB0aGlzIHVzZSBjYXNlIChvZiBzdGFydGluZyB5b3VyIG93biBjaGFpbiB3aXRoIGEgZGlmZmVy ZW50DQogIHByb3RvY29sKSwgeW91IG1pZ2h0IGJlIGJldHRlciBvZmYgY2xvbmluZyB0aGUgZ2l0 IHJlcG9zaXRvcnksIGRvaW5nDQogIHNvbWUgbWluaW1hbCBjbGVhbiB1cCwgZXRjLiBUaGlzIGlz IGJlY2F1c2UgdGhlIHRlem9zIGJpbmFyaWVzIGluY2x1ZGUNCiAgdGhlIHNvdXJjZXMgZm9yIGFs bCBwcm90b2NvbHMgdGhhdCBoYXZlIGJlZW4gdXNlZCBvbiB0aGUgY2hhaW4gKHNvIHlvdQ0KICBk b24ndCAqbmVlZCogdG8gZ2V0IHRoZW0gb3ZlciB0aGUgbmV0d29yayBldmVuIGlmIHlvdSBjYW4p Lg0KDQogIFlvdSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0 IGFib3V0IGhvdyB0byB3cml0ZQ0KICB5b3VyIG93biBwcm90b2NvbDoNCiAgW2h0dHBzOi8vYmxv Zy5ub21hZGljLWxhYnMuY29tL2hvdy10by13cml0ZS1hLXRlem9zLXByb3RvY29sLmh0bWxdDQoN Cg0KT2ZmaWNpYWwgT0NhbWwgYmluZGluZ3MgZm9yIHZlcmlmaWVkIEV2ZXJlc3QgY3J5cHRvZ3Jh cGh5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMv Y2FtbC1saXN0LzIwMjAtMDUvbXNnMDAwMTcuaHRtbF0NCg0KDQpKb25hdGhhbiBQcm90emVua28g YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgRXZlcmVzdCB0 ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Ygb2ZmaWNpYWwgT0NhbWwN CiAgYmluZGluZ3MgZm9yIGFsbCBvZiBvdXIgdmVyaWZpZWQgY3J5cHRvZ3JhcGhpYyBhbGdvcml0 aG1zLCBub3cNCiAgYXZhaWxhYmxlIHRocm91Z2ggT1BBTSBhcyBwYWNrYWdlcyBoYWNsLXN0YXIg YW5kIGhhY2wtc3Rhci1yYXcuDQoNCiAgV2UgcHJvdmlkZSBiaW5kaW5ncyBmb3IgdGhlIGZvbGxv d2luZzoNCiAg4oCiIEhBQ0wqLCBhIGxpYnJhcnkgb2YgcHVyZSBDIGFsZ29yaXRobXMNCiAg4oCi IFZhbGUsIGEgY29sbGVjdGlvbiBvZiBvcHRpbWl6ZWQgY29yZSBhc3NlbWJseSByb3V0aW5lcyBm b3IgbWF4aW11bQ0KICAgIHBlcmZvcm1hbmNlDQogIOKAoiBFdmVyQ3J5cHQsIGFuIGFnaWxlLCBt dWx0aXBsZXhpbmcgQVBJIHdpdGggQ1BVIGF1dG8tZGV0ZWN0aW9uIHRoYXQNCiAgICBicmluZ3Mg dG9nZXRoZXIgSEFDTCogYW5kIFZhbGUuDQoNCiAgT3VyIGNvZGUgaXMgY29tcGlsZWQgZnJvbSB0 aGUgRiogcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdG8gQyB2aWEgdGhlDQogIEtSZU1MaW4gY29tcGls ZXIgKCJLJlIgbWVldHMgTUwiKS4gV2Ugb2ZmZXIgdHdvIE9QQU0gcGFja2FnZXM6DQogIOKAoiBo YWNsLXN0YXItcmF3IGNvbnNpc3RzIG9mIGxvdy1sZXZlbCBvY2FtbC1jdHlwZXMgYmluZGluZ3Mg Z2VuZXJhdGVkDQogICAgYnkgS1JlTUxpbg0KICDigKIgaGFjbC1zdGFyIGlzIGEgaGFuZC13cml0 dGVuIE9DYW1sIGlkaW9tYXRpYyBBUEkgdGhhdCB1c2VzIG11Y2ggbW9yZQ0KICAgIHBsZWFzYW50 IHNpZ25hdHVyZXMsIHR5cGVzIGFuZCBhYnN0cmFjdGlvbnMgYW5kIGlzIGFsc28gc2FmZXIsIGFz IGl0DQogICAgY2hlY2tzIGFsbCBzdGF0aWMgcHJlY29uZGl0aW9ucyBhdCBydW4tdGltZQ0KDQog IFdlIHN1cHBvcnQgQUVTezEyOCwyNTZ9LUdDTSwgQ2hhY2hhMjAtUG9seTEzMDUsIEN1cnZlMjU1 MTkgLyBFZDI1NTE5LA0KICBQMjU2LCBNRDUsIFNIQS17MSwyLDN9IChhbGwgdmFyaWFudHMpLCBC bGFrZTIgKHMmYiksIEhNQUMvSEtERiwgYW5kDQogIHRoZSBIUEtFIGFuZCBTZWNyZXRCb3ggaGln aC1sZXZlbCBBUElzLiBTb21lIGFsZ29yaXRobXMgYXJlIG9wdGltaXplZA0KICBmb3IgSW50ZWwg Y2hpcHMsIG5vdGFibHkgQUVTLUdDTSDigJMgc2VlDQogIFtodHRwczovL2hhY2wtc3Rhci5naXRo dWIuaW8vU3VwcG9ydGVkLmh0bWxdIGZvciBmdWxsIGRldGFpbHMuDQoNCiAgR2VuZXJhbCBkb2N1 bWVudGF0aW9uIGFib3V0IHRoZSBwcm9qZWN0IGlzIGF2YWlsYWJsZSBhdA0KICBbaHR0cHM6Ly9o YWNsLXN0YXIuZ2l0aHViLmlvL2luZGV4Lmh0bWxdIOKAkyBzYW1wbGUgY29kZSBmb3IgdGhlIE9D YW1sDQogIEFQSSBpcyBwcm92aWRlZCBhcyBwYXJ0IG9mIHRoZSB0ZXN0IHN1aXRlDQogIFtodHRw czovL2dpdGh1Yi5jb20vcHJvamVjdC1ldmVyZXN0L2hhY2wtc3Rhci90cmVlL21hc3Rlci9iaW5k aW5ncy9vY2FtbC90ZXN0c10NCg0KICBUaGlzIHdvcmsgd2FzIHBlcmZvcm1lZCBieSBWaWN0b3Ig RHVtaXRyZXNjdSBmcm9tIE5vbWFkaWMgTGFicywgb25lIG9mDQogIHRoZSB0ZWFtcyByZXNwb25z aWJsZSBmb3IgdGhlIGNvcmUgZGV2ZWxvcG1lbnQgb2YgdGhlIFRlem9zDQogIGJsb2NrY2hhaW4u DQoNCg0Kbm1lYSBhbmQgc2FpbC1nYWRnZXRzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ubWVhLXNhaWwtZ2FkZ2V0cy81NzczLzFdDQoNCg0K RGF2aWRlIEdlc3NhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQWhveSBkZXZlbG9wZXJzLCBm ZXcgZGF5cyBhZ28gSSBwdWJsaXNoZWQgYSBuZXcgb2NhbWwgbGlicmFyeSBjYWxsZWQNCiAgKm5t ZWEqLCB3aGljaCBpcyBlc3NlbnRpYWxseSBhIHBhcnNlciBmb3IgTk1FQTAxODMgc2VudGVuY2Vz LCBhIGZvcm1hdA0KICBmb3IgZW5jb2RpbmcgaW5zdHJ1bWVudHMgZGF0YSBpbiBib2F0cy4gVGhl cmUgYXJlIG1hbnkgc2VudGVuY2VzLA0KICByZWdhcmRpbmcgR1BTLCBjb21wYXNzIGRhdGEsIHdp bmQsIGFpciBwcmVzc3VyZSwgd2F0ZXIgdGVtcGVyYXR1cmUsDQogIHdheXBvaW50cyBoYW5kbGlu ZywgYWlzLCBhdXRvcGlsb3QgYW5kIG1vcmU7IGF0IHRoZSBtb21lbnQgdGhlIGxpYnJhcnkNCiAg aXMgYWJsZSB0byBkZWNvZGUgR1BTIHNlbnRlbmNlcyBhbmQgY29tcGFzcyBkYXRhLCBidXQgSSds bCBpbXBsZW1lbnQNCiAgbW9yZSBzZW50ZW5jZXMgaW4gdGhlIHNwYXJlIHRpbWUuIEkgdGVzdGVk IGl0IHdpdGggbXkgYm9hdCBHUFMgYW5kDQogIHdpdGggYSBncHMgdXNiIGRvbmdsZS4NCg0KICBB ZnRlciB0aGF0LCBJIHN0YXJ0ZWQgYSBuZXcgdGlueSBleHBlcmltZW50IGNhbGxlZCAqc2FpbC1n YWRnZXRzKiwNCiAgd2hpY2ggaXMgYSBHdGsgcHJvZ3JhbSB0aGF0IGVsYWJvcmF0ZXMgYW5kIGRp c3BsYXlzIE5NRUEgZGF0YSByZWNlaXZlZA0KICBmcm9tIHZhcmlvdXMgYm9hdCBpbnN0cnVtZW50 cyAod2luZCB2YW5lLCBhdXRvcGlsb3QsIGdwcywgcmFkYXIsIGFpcywNCiAgZXRjKS4gU2FpbC1n YWRnZXRzIGNhbiBiZSBleHRlbmRlZCB3aXRoICJnYWRnZXRzIiBtb2R1bGVzLCBlYWNoIG9uZQ0K ICBwcm92aWRpbmcgbmV3IGZ1bmN0aW9uYWxpdGllcyBhbmQgbmV3IHRhYnMgdG8gdGhlIG1haW4g aW50ZXJmYWNlLg0KDQogIERhdGEgZnJvbSBzZW5zb3JzIGFyZSBoYW5kbGVkIHVzaW5nIC9SZWFj dC8gc2lnbmFscywgc28gaW4gZXZlcnkNCiAgZ2FkZ2V0IHdlIGNhbiBjb21wb3NlIGRhdGEgZnJv bSB2YXJpb3VzIHNlbnNvciB0byBvYnRhaW4gbmV3IHJlYWN0aXZlDQogIHZhbHVlcy4NCg0KICBU aGUgZ2FkZ2V0cyBJJ20gcGxhbm5pbmcgdG8gd3JpdGU6DQogIOKAoiBkYXNoYm9hcmQ6IHNob3dz IGN1cnJlbnQgcG9zaXRpb24sIHNwZWVkLCBoZWFkaW5nLCB0cmlwZGlzdCwgY29tcGFzcw0KICDi gKIgc2F0dmlldzogc2hvd3MgY3VycmVudCBjb25uZWN0ZWQgZ3BzIHNhdGVsbGl0ZXMgKHBhcnRp YWxseSBkb25lKQ0KICDigKIgd2luZDogc2hvd3Mgd2luZCBpbmRpY2F0b3Igd2l0aCB0cnVlIC8g YXBwYXJlbnQgc3BlZWQgYW5kIGRpcmVjdGlvbg0KICDigKIgcmFkYXI6IHNob3dzIEFJUyBhbmQg UmFkYXIgdGFyZ2V0cyBpbiByYW5nZQ0KICDigKIgbW9iOiBhbGxvd3MgdG8gZHJvcCBhIG1hcmtl ciBpbiB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIGRyaXZlIHlvdQ0KICAgIHRvIHRoYXQgcG9p bnQNCiAg4oCiIHN0YXJ0bGluZTogaGVscGVyIGZvciByZWdhdHRhIHN0YXJ0DQogIOKAoiB0cmFj azogc2hvd3MgY3VycmVudCB0cmFjayBpbiBhIHZlY3RvciBtYXANCg0KICBUaGUgaGFyZCB0aGlu ZyBpbiBteSBvcGluaW9uIGlzIHdyaXRpbmcgbmV3IGN1c3RvbSB3aWRnZXQgd2l0aCBjYWlybw0K ICAoY29tcGFzcywgcmFkYXIsIGFuZCB0aGluZ3MgbGlrZSB0aGF0KS4NCg0KICBGaW5hbGx5LCB0 aGUgcHJvamVjdCBpcyBpbnRlbmRlZCB0byBydW4gb3ZlciAqZ3RrLWJyb2Fkd2F5Kiwgc28gZXZl cnkNCiAgaHRtbDUgZW5hYmxlZCBkZXZpY2UgY2FuIGFjY2VzcyB0aGUgYXBwbGljYXRpb24uDQoN CiAgW2h0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYWtrL3NhaWwtZ2FkZ2V0cy9t YXN0ZXIvbWVkaWEvYnJvYWR3YXkuanBnXQ0KDQogIEhvcGUgdGhlcmUgYXJlIHNvbWUgc2FpbG9y IGhlcmUgdGhhdCB3YW50IHRvIGpvaW4gd3JpdGluZyBzb21lIGdhZGdldHMNCiAgOikgUmVwb3Mg YXJlOg0KDQogIOKAoiBbaHR0cHM6Ly9naXRodWIuY29tL2Rha2svbm1lYV0NCiAg4oCiIFtodHRw czovL2dpdGh1Yi5jb20vZGFray9zYWlsLWdhZGdldHNdDQoNCg0KSXMgdGhlcmUgc3BlY2lhbGl6 ZWQgbWF0aCBsaWJyYXJ5IGZvciBzdGF0aXN0aWNzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9p cy10aGVyZS1zcGVjaWFsaXplZC1tYXRoLWxpYnJhcnktZm9yLXN0YXRpc3RpY3MvNTc3OC8xXQ0K DQoNCmhzcyBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBzZWFyY2hl ZCB0byBmaW5kIG1hdGggbGlicmFyeSB3aGljaCBpcyB3cml0dGVuIGluIE9DYW1sLCBidXQgdGhl cmUNCiAgYXJlIG9ubHkgZmV3IHJlcG9zaXRvcmllcy4NCg0KICBJJ2QgbGlrZSB0byB1c2Ugc29t ZSBmdW5jdGlvbiBsaWtlIGNvZWZmaWNpZW50IGNvcnJlbGF0aW9uLA0KICBjb3ZhcmlhbmNlLCBl dGMuDQoNCiAgSSBmb3VuZCBMYWNhbWwgYnV0IGl0IHNlZW1zIG5vdCB0byBzdXBwb3J0IHRoZW0u DQoNCiAgQ291bGQgeW91IGdpdmUgc29tZSBsaW5rIGlmIHlvdSBrbm93Pw0KDQoNCmJuZ3V5ZW52 YW55ZW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGksIHlvdSBjYW4gdGFrZSBhIGxvb2sgYXQgT3ds IDogW2h0dHBzOi8vb2NhbWwueHl6L10NCg0KICBUaGVyZSBhcmUgc3RhdCBmdW5jdGlvbnMgYW5k IGFsc28gYSBsb3QgbW9yZQ0KDQoNClVuaXhKdW5raWUgYWxzbyByZXBsaWVkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBUaGVyZSBpcyBhbHNvIHRoaXMgb25lOg0KICBbaHR0cHM6Ly9naXRodWIuY29tL3N1 cGVyYm9icnkvcGFyZXRvXQ0KICBHU0wgcG93ZXJlZCBPQ2FtbCBzdGF0aXN0aWNzIGxpYnJhcnkN CiAgW2h0dHA6Ly9zdXBlcmJvYnJ5LmdpdGh1Yi5pby9wYXJldG8vMC4yXQ0KDQogIEFuZCBwcm9i YWJseSBldmVuIHNvbWUgbW9yZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHNlYXJj aCBzdGF0aXN0aWMNCiAg4pSCICMgUGFja2FnZXMgbWF0Y2hpbmc6IG1hdGNoKCpzdGF0aXN0aWMq KQ0KICDilIIgIyBOYW1lICAgICAgICAgICAgIyBJbnN0YWxsZWQgIyBTeW5vcHNpcw0KICDilIIg Wy4uLl0NCiAg4pSCIGdzbCAgICAgICAgICAgICAgIC0tICAgICAgICAgIEdTTCAtIEJpbmRpbmdz IHRvIHRoZSBHTlUgU2NpZW50aWZpYyBMaWJyYXJ5DQogIOKUgiBvbWwgICAgICAgICAgICAgICAt LSAgICAgICAgICBNYXRoIExpYnJhcnkNCiAg4pSCIG93bCAgICAgICAgICAgICAgIC0tICAgICAg ICAgIE9DYW1sIFNjaWVudGlmaWMgYW5kIEVuZ2luZWVyaW5nIENvbXB1dGluZw0KICDilIIgb3ds LXBscGxvdCAgICAgICAgLS0gICAgICAgICAgT0NhbWwgU2NpZW50aWZpYyBhbmQgRW5naW5lZXJp bmcgQ29tcHV0aW5nDQogIOKUgiBwYXJldG8gICAgICAgICAgICAtLSAgICAgICAgICBHU0wgcG93 ZXJlZCBPQ2FtbCBzdGF0aXN0aWNzIGxpYnJhcnkuDQogIOKUgiBzdGF0c2QtY2xpZW50ICAgICAt LSAgICAgICAgICBTdGF0c0QgY2xpZW50IGxpYnJhcnkNCiAg4pSCIFsuLi5dDQogIOKUlOKUgOKU gOKUgOKUgA0KDQoNCk5ldyBPQ2FtbCBib29rcz8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IFtodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvbmV3LW9jYW1sLWJvb2tzLzU3ODkvMV0NCg0KDQpBeGVsIFdpbnRlcm1hbm4gYXNr ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgd29uZGVyLCB3aHkgdGhlcmUgYXJlIG5vIG5ldyBPQ2FtbCBib29r cyBzaW5jZSAyMDE0IHllYXI/IE1hbnkgYm9va3MNCiAgYXJlIHB1Ymxpc2hlZCBvbiBIYXNrZWxs LCBTY2FsYSwgRiMgdGhlbWVzLCBidXQgbm8gT0NhbWwuIEkgdGhpbmsgd2UNCiAgbmVlZCBuZXcg Ym9va3MgZm9yIGxlYXJuaW5nIGFuZCBmb3IgcmlzaW5nIGludGVyZXN0IGluIG91ciBiZWF1dGlm dWwNCiAgbGFuZ3VhZ2UuDQoNCg0KVGFrdW1hIElzaGlrYXdhIHJlcGxpZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIOKAoiBUaGVyZSBpcyBhbiBvbmdvaW5nIHdvcmsgZm9yIDJuZCBlZGl0aW9uIG9mIFJl YWwgV29ybGQgT0NhbWw6DQogICAgW2h0dHA6Ly9kZXYucmVhbHdvcmxkb2NhbWwub3JnL10uDQog IOKAoiBPQ2FtbCBTY2llbnRpZmljIENvbXB1dGluZyBpcyBhbHNvIG9uZ29pbmc6DQogICAgW2h0 dHBzOi8vb2NhbWwueHl6L2Jvb2svXS4NCiAg4oCiIEEgSmFwYW5lc2UgYm9vayAi44Kz44Oz44OU 44Ol44O844K/44KS5pON44KLIiwgcHVibGlzaGVkIGluIEZlYi4gMjAyMCBmb3INCiAgICBiZWdp bm5lcnMgb2YgcHJvZ3JhbW1pbmcsIHVzZXMgT0NhbWwgQmxvY2tseToNCiAgICBbaHR0cHM6Ly93 d3cuc2FpZW5zdS5jby5qcC9zZWFyY2gvP2lzYm49OTc4LTQtNzgxOS0xNDcwLTEmeT0yMDIwI2Rl dGFpbF0uDQoNCg0KV2VuZyBTaGl3ZWkgYWxzbyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBBIENoaW5lc2UgYm9vayBbT0NhbWzor63oqIDnvJbnqIvln7rnoYDmlZnnqItdIChbYW4gaW50 cm9kdWN0aW9uIHRvIE9DYW1sDQogIGxhbmd1YWdlIHByb2dyYW1taW5nXSkgaXMgcHVibGlzaGVk IGluIDIwMTguDQoNCg0KW09DYW1s6K+t6KiA57yW56iL5Z+656GA5pWZ56iLXSBodHRwczovL2Uu amQuY29tLzMwNDE3NjYyLmh0bWwNCg0KW2FuIGludHJvZHVjdGlvbiB0byBPQ2FtbCBsYW5ndWFn ZSBwcm9ncmFtbWluZ10NCmh0dHBzOi8vY2FtbC5pbnJpYS5mci9hYm91dC9ib29rcy5lbi5odG1s I2lkbTI3Nw0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZy b20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKA oiBbRXZlcnkgcHJvb2YgYXNzaXN0YW50OiBNTVRdDQoNCg0KW09DYW1sIFBsYW5ldF0gaHR0cDov L29jYW1sLm9yZy9jb21tdW5pdHkvcGxhbmV0Lw0KDQpbRXZlcnkgcHJvb2YgYXNzaXN0YW50OiBN TVRdDQpodHRwOi8vbWF0aC5hbmRyZWouY29tLzIwMjAvMDUvMTUvbW10LWEtZm91bmRhdGlvbi1p bmRlcGVuZGVudC1sb2dpY2FsLXN5c3RlbS8NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDi lZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUg YSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sg YXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoN CiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmcNCg0K W3RoZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3MNCg0KW29ubGluZV0gaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mt d2Vla2x5Lw0KDQpbQWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvDQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 12 to 19, 2020.

ocamlformat 0.14.2

Guillaume Petiot announced

We are pleased to announce the release of ocamlformat 0.14.2. This minor release improves the recent 0.14.0 and 0.14.1 releases regarding= the doc-comments option.

How to migrate from 0.13.0

Here are the changes of the doc-comments options compared to o= camlformat 0.13.0:

  • after has been renamed to after-when-possible= to take into account the technical limitations of ocamlformat;
  • a new value before-except-val has been added, placing doc-= comments before the corresponding code, but placing doc-comments of val and= external declarations after the corresponding declaration;
  • before is unchanged.

Here is the full list of changes made by the 0.14.0 release: https://discuss.ocaml= .org/t/ann-ocamlformat-0-14-0/5435

How to migrate from 0.14.0

The 0.14.0 release lead to some regression of the doc-comments= behavior that (although intended for us) lead to some surprise from a lot of users. The behavior of doc-comments has thus been reverted to it's 0.= 13.0 state with the following changes:

The doc-comments-val option has been removed and merged with <= code>doc-comments. The placement of documentation comments on val and external items is now control= led by doc-comments .

  • doc-comments=3Dafter becomes doc-comments=3Dafter-wh= en-possible to take into account the technical limitations of ocamlf= ormat;
  • doc-comments=3Dbefore is unchanged;
  • doc-comments-val is now replaced with doc-comments

To reproduce the former behaviors

  • doc-comments=3Dbefore + doc-comments-val=3Dbefore : now use doc-comments=3Dbefore ;
  • doc-comments=3Dbefore + doc-comments-val=3Dafter : now use doc-comments=3Dbefore-except-val ;
  • doc-comments=3Dafter + doc-comments-val=3Dbefore : this behavior did not make much sense and is not available anymore;
  • doc-comments=3Dafter + doc-comments-val=3Dafter : now use doc-comments=3Dafter-when-possible.

How to migrate from 0.14.1

The 0.14.1 release was preserving the behavior of 0.13.0 regarding do= c-comments, it added a unset value to the doc-comments-val option. This option has been removed with the following changes:

The doc-comments-val option has been removed and merged with <= code>doc-comments. The placement of documentation comments on val and external items is now control= led by doc-comments .

  • doc-comments=3Dafter becomes doc-comments=3Dafter-wh= en-possible to take into account the technical limitations of ocamlf= ormat;
  • doc-comments=3Dbefore is unchanged;
  • doc-comments-val is now replaced with doc-comments

To reproduce the former behaviors

  • doc-comments=3Dbefore + doc-comments-val=3Dbefore : now use doc-comments=3Dbefore ;
  • doc-comments=3Dbefore + doc-comments-val=3Dafter : now use doc-comments=3Dbefore-except-val ;
  • doc-comments=3Dafter + doc-comments-val=3Dbefore : this behavior did not make much sense and is not available anymore;
  • doc-comments=3Dafter + doc-comments-val=3Dafter : now use doc-comments=3Dafter-when-possible.

Thank you

We would like to thank our early users to help us on the road of a stable 1= .0.0 release of ocamlformat.

ML Family Workshop 2020: Call for pre= sentations

Leo White announced

ICFP, and by extension the ML workshop, will be now officially be held onli= ne with a significantly reduced fee. Due to the change in official status we decided to extend the submission deadli= ne to the end of May.

Important Dates (updated)

  • Friday 29th May (any time zone): Abstract submission deadline
  • Friday 17th July: Author notification
  • Thursday 27th August: ML Family Workshop

memprof-limits preview (and a guide t= o handle asynchronous exceptions)

Guillaume Munch-Maccagnoni announced

Dear OCamlers, I am happy to pre-announce memprof-limits, an implementation of per-thread global memory limits, and per-thread allocatio= n limits =C3=A0 la Haskell, compatible with systhreads.

Memprof-limits interrupts the execution by raising an asynchronous exception, an exception that can arise at almost any location in the code. I also announce a guide on how to recover from asynchronous exce= ptions and other unexpected exceptions that you find in the documentation. It summarises knowledge acquired in OCaml by the Coq proof assistant as well a= s in other programming languages. To my knowledge, this has never been told in OCaml textbooks, so I thought it mig= ht be of general interest to you. This research is part of a wider work aiming to regulate the use of asynchronous= exceptions in OCaml in coordination with multicore language designers.

Global memory limits let you bound the mem= ory consumption inside specific parts of your program, in terms of memory used by the whole program. It is inspired by this other post, but in a form readily available for use with systhreads.

Allocation limits let you bound the execut= ion of parts of the program measured in number of allocations, analogous to the same feature in Haskell advocated in a nice post by Simon = Marlow. Allocation limits count allocations but not deallocations, and is = therefore a measure of the work done, which can be more suitable than execution time.

Memprof-limits, as the name tells, uses the upcoming Memprof engine from OC= aml 4.11, with a low sampling rate that does not affect performance. A reimplementation of the Memprof interface co= mpatible with memprof-limits running at the same time is provided for profiling needs.

Memprof-limits is available on the public opam repository, but depends on O= Caml 4.11 which at the moment is available from the beta opam repository only. It is experim= ental for reasons explained in the manual.

FAQ

  • =E2=80=9CIs it wise to rely on the statistical= nature of Memprof? If I set an allocation limit of 100 KB, and run a funct= ion that allocates exactly 50 KB, then the function might fail, due to the = random nature of Memprof.=E2=80=9D

    Memprof-limits is provided with a statistical analysis meant to help you chose appropriate values for the limit depending on a target sa= fe allocation value. (Nice pictures omitted because this discuss does not support svg.)

    Long story short, memprof-limits starts being accurate-enough starting arou= nd a safe allocation value of 100 KB with the default sampling rate (meaning a limit of 1 to 3 MB depending on chosen= precision), with the ratio between the maximal safe allocation and the limit dropping very quickly for higher valu= es. Correctly, the analysis shows that limits under 500 KB are unreliable.

    I have found that the statistical nature of Memprof makes it very easy to r= eason about its application and not have to factor in runtime implementation details. In addition, Memprof is nevert= heless deterministic, which is (essential and) useful for reproducing runs in test scenarios.

  • =E2=80=9CBut can we really program with mempro= f-limits, that is, not only write programs but also reason about them, give= n the probabilistic nature of the guarantees?=E2=80=9D

    Yes, if we make two additional hypotheses:

    1. Allocation limits (as used in Haskell) are used by determining peak rea= sonable allocation usage empirically and picking a limit at a comfortable m= argin over it, rather than computing a precise memory bound to be used as a= limit. In very controlled environments where the latter would be possible,= there probably would be better solutions, and the language this is inspire= d from makes it very hard to make predictions on memory use.
    2. The programmer is fine with a very unlikely possibility of a false posi= tive; indeed the program is already designed to let true positives fail wit= hout bringing down mission-critical parts of the program. For instance they= can prefer to see a legitimate client having a connexion closed once every= 10=E2=81=BF year for n of their choosing, if that is the price to p= ay for avoiding being subject to DOS on maliciously-crafted requests.

    Under these hypotheses, the statistical limit is just as reliable as the pr= ecise limits =C3=A0 la Haskell.

  • =E2=80=9CIs it possible to also implement local memory limits, to bound the memory consu= mption of a particular function?=E2=80=9D

    Yes but read on.

    Yang & Mazi= =C3=A8res (2014) advocates in favour of an al= locator-pays model of cost attribution, and note its similarity with memory profiling. I= n this model, it is possible for instance to process untrusted user input under some memory limit, before the result = is distributed to the rest of the program.

    Implementing memory limits based on the allocator-pays model, by adapting a= llocation limits to take into account deallocations, would be very easy thanks to the facilities provided by Memp= rof. Moreover, the statistical analysis of allocation limits can be transposed, and guarantees similarly accuracy at a= low runtime cost for limits greater than 100KB.

    There is one surprising difficulty, though, which has to do with the way th= e GC works. The GC has a space overhead: memory that is wasted because unreachable values are not collected immediat= ely. This overhead has to be taken into account when choosing the limit. However, this overhead is non-local and de= pendent on the total major heap size: one cannot just say =E2=80=9Ctake the double of the desired limit=E2=80=9D.= Indeed, active threads will pay for memory that has been allocated in the past and kept alive. More experimentation is needed to pro= vide guidance on how to take the space overhead into account.

  • =E2=80=9CCan this be used to bound the consump= tion of lightweight threads in Lwt and Async?=E2=80=9D

    It is straightforward to make memprof-limits parametric in the notion of thread id used to track per-thread limits. However, to the best of my knowledge, Lwt and Async are not meant to play w= ell when the computation is interrupted by asynchronous exceptions. If you have more information about this limitation= or are interested in experimenting, please get in touch.

Thanks

Thank you to Jacques-Henri Jourdan for his explanations about Memprof and S= tephen Dolan for his feedback.

Tezos 7.0 is now available on opam

Pierre Boutillier announced

Tezos executables and libraries have just been released on opam. You can thus build them from source with a simple opam install tezos and build your own projects upon them.

What is Tezos

Tezos is a distributed consensus platform with meta-consensus capability. T= ezos not only comes to consensus about the state of its ledger, like Bitcoin or Ethereum. It also comes to consensus a= bout how the protocol and the nodes should adapt and upgrade. For more information about the project, see https://tezos.com.

Our implementation of Tezos is written in OCaml. It is split into several l= ibraries (command-line interface tezos-clic, peer-to-peer library tezos-p2p, crypt= ographic primitives tezos-crypto~=E2=80=A6) and executables (node ~tezos-node, client ~tezos-client~=E2=80=A6).

Useful Links

Source code for this particular implementation can be found at https://gitlab.com/tezos/tezos/. Develo= per documentation is available at https://= tezos.gitlab.io/. In particular, documentation for this specific release (version 7.0) is available at http://tezos.gitlab.io/releases/version-7.html.

Installation Instructions

Tezos (internal compiler in order to self amend itself) requires a specific= version of the compiler (OCaml 4.09.1):

opam switch 4.09.1

Tezos also requires some external libraries:

opam depext tezos

Finally, to install all binaries:

opam install tezos

Replying to Nick Betteridge, Rapha=C3=ABl Proust said=

Tezos has a soft-updating mechanism that works (roughly) as follows:

The network starts with a genesis protocol (=E2=80=9Cprotocol=E2=80=9D here= means =E2=80=9Ceconomic protocol=E2=80=9D: the rules according to which smart contracts are initiated and acted upon, transactions take place, etc.= ) in which a single public key is specified.

The genesis protocol has no notion of coin, currency, smart-contract, etc. = Instead, the genesis protocol knows a single operation: a protocol injection.

The protocol injection for genesis requires the operation to be signed by t= he private key that matches the public key of the genesis block. And the protocol injection changes, irreversibly, the= genesis protocol to a new protocol. This new protocol specifies what constitutes a valid block to add to the chain.

In the Tezos blockchain, the protocol injected on top of genesis included a= notion of coins and an in-protocol voting system to inject new protocols based on consensus amongst coin-holders. The= re is even a system to obtain the protocol sources over the blockchain network so they can be compiled by each node an= d dynlinked directly in: you don't need to update/restart your node to get the protocol updates. However, this is arbi= trary: you can start a new block-chain with a different protocol.

For example, you could re-implement Bitcoin (proof-of-work, coins+transfer,= etc.) as a protocol that you inject on top of genesis. Your block chain would have a tezos genesis block, then a b= lock that activate your own version of bitcoin, and then the blocks would be similar to what you would find on the= bitcoin block-chain.

Of particular interest to you, the protocol you inject can have entirely di= fferent on-chain notions (e.g., a TCG/CCG with no coins at all but a notion of ownership over cards) and different so= ft-updating mechanism (e.g., the new protocol can accept genesis-style updates (a =E2=80=9Cdictatorship=E2=80=9D= where a single person controls the protocol) or even no soft-updating mechanism at all (a =E2=80=9Cstale=E2=80=9D protocol where yo= u need to hard-fork if you want to make significant changes)).

For this use case (of starting your own chain with a different protocol), y= ou might be better off cloning the git repository, doing some minimal clean up, etc. This is because the tezos bin= aries include the sources for all protocols that have been used on the chain (so you don't need to get= them over the network even if you can).

You might be interested in the following blog post about how to write your = own protocol: https://blog.nomadic-labs.com/how-to-write-a-tezos-protocol.html

Official OCaml bindings for verified = Everest cryptography

Jonathan Protzenko announced

The Everest team is pleased to announce the release of official OCaml bindings for all of our verified cryptographic algorithms, now available through OPAM as packages hacl-star and hacl-star-raw.

We provide bindings for the following:

  • HACL*, a library of pure C algorithms
  • Vale, a collection of optimized core assembly routines for maximum perf= ormance
  • EverCrypt, an agile, multiplexing API with CPU auto-detection that brin= gs together HACL* and Vale.

Our code is compiled from the F* programming language to C via the KReMLin compiler ("K&R meets ML"). We offer two OPAM packages:

  • hacl-star-raw consists of low-level ocaml-ctypes bindings generated by = KReMLin
  • hacl-star is a hand-written OCaml idiomatic API that uses much more ple= asant signatures, types and abstractions and is also safer, as it checks al= l static preconditions at run-time

We support AES{128,256}-GCM, Chacha20-Poly1305, Curve25519 / Ed25519, P256, MD5, SHA-{1,2,3} (all variants), Blake2 (s&b), HMAC/HKDF, and the HPKE and SecretBox high-level APIs. Some algorithms are optimized for Intel chips, notably AES-GCM – see https://hacl-star.gi= thub.io/Supported.html for full details.

General documentation about the project is available at https://hacl-star.github= .io/index.html – sample code for the OCaml API is provided as part of the test suite https://github.com/project-everest/hacl-star/tree/master/bin= dings/ocaml/tests

This work was performed by Victor Dumitrescu from Nomadic Labs, one of the teams responsible for the core development of the Tezos blockchain.

nmea and sail-gadgets

Davide Gessa announced

Ahoy developers, few days ago I published a new ocaml library called nmea, which is e= ssentially a parser for NMEA0183 sentences, a format for encoding instruments data in boats. There are many sentences, re= garding GPS, compass data, wind, air pressure, water temperature, waypoints handling, ais, autopilot and more; a= t the moment the library is able to decode GPS sentences and compass data, but I'll implement more sentences in the sp= are time. I tested it with my boat GPS and with a gps usb dongle.

After that, I started a new tiny experiment called sail-gadgets, whi= ch is a Gtk program that elaborates and displays NMEA data received from various boat instruments (wind vane, autop= ilot, gps, radar, ais, etc). Sail-gadgets can be extended with "gadgets" modules, each one providing new functionalit= ies and new tabs to the main interface.

Data from sensors are handled using React signals, so in every gadge= t we can compose data from various sensor to obtain new reactive values.

The gadgets I'm planning to write:

  • dashboard: shows current position, speed, heading, tripdist, compass
  • satview: shows current connected gps satellites (partially done)
  • wind: shows wind indicator with true / apparent speed and direction
  • radar: shows AIS and Radar targets in range
  • mob: allows to drop a marker in the current position, and drive you to = that point
  • startline: helper for regatta start
  • track: shows current track in a vector map

The hard thing in my opinion is writing new custom widget with cairo (compa= ss, radar, and things like that).

Finally, the project is intended to run over gtk-broadway, so every = html5 enabled device can access the application.

3D"broadway.jpg"

Hope there are some sailor here that want to join writing some gadgets :) R= epos are:

Is there specialized math library for= statistics?

hss asked

I searched to find math library which is written in OCaml, but there are on= ly few repositories.

I'd like to use some function like coefficient correlation, covariance, etc.

I found Lacaml but it seems not to support them.

Could you give some link if you know?

bnguyenvanyen replied

Hi, you can take a look at Owl : https://oca= ml.xyz/

There are stat functions and also a lot more

UnixJunkie also replied

There is also this one:
https://github.com/superbo= bry/pareto
GSL powered OCaml statistics library http://superbobry.github.io/pareto/0.2

And probably even some more:

opam search statistic
# Packages matching: match(*statistic*)
# Name            # Installed # Synopsis
[...]
gsl               --          GSL - Bindings to the GNU Scientific Library
oml               --          Math Library
owl               --          OCaml Scientific and Engineering Computing
owl-plplot        --          OCaml Scientific and Engineering Computing
pareto            --          GSL powered OCaml statistics library.
statsd-client     --          StatsD client library
[...]

New OCaml books?

Axel Wintermann asked

I wonder, why there are no new OCaml books since 2014 year? Many books are = published on Haskell, Scala, F# themes, but no OCaml. I think we need new books for learning and for rising intere= st in our beautiful language.

Takuma Ishikawa replied

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 8036BE1EA0 for ; Tue, 9 Jun 2020 10:28:55 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=IKg/=7W=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AXM24lROG8lCYLSKZI6kl6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K///o8bcNUDSrc9gkEXOFd2Cra4d1qyP7vyrATBIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSizexfLN/IA+roQjRucQajpduJ6kswRbVv3VEfP?= =?us-ascii?q?hby3l1LlyJhRb84cmw/J9n8ytOvv8q6tBNX6bncakmVLJUFDspPXw7683trhnD?= =?us-ascii?q?UBCA5mAAXWUMkxpHGBbK4RfnVZrsqCT6t+592C6HPc3qSL0/RDqv47t3RBLulS?= =?us-ascii?q?wIMCM38HzMisxokq1UvA6hqRJ4w47Reo6VNfx+db7Zcd4VQWdNW8BcWyxCDIO6?= =?us-ascii?q?cYsPDvEBPedDoIn5uVQFsBW/BQ62BOzy0T9Dm3v60KMm3+gkFwzNwQ4uEM8UsH?= =?us-ascii?q?nMrNv7KrocX+62wqbH0TrOdOlZ1Svn5YXSbhwtvfOBULRtesTR00kvEAbFg02M?= =?us-ascii?q?pIzhJTyV0PkGvXWH4OpgUOKvinInqx1sqTWo3MgsjpPGhoQPxlDf6Sp5wIM1Jd?= =?us-ascii?q?ykSE5netOkCJxQtyWaNotqXMwtX2FouCA7yr0fpJ60YjIGyJM9xx7QcvGKdZWD?= =?us-ascii?q?7R3/WuiLOzh4mG5ld6ylhxa06UWuyvDxW8u03VtKridIndnBu3IO2hDO6MWLVv?= =?us-ascii?q?Vz8Emu1zuP1Q3f9uBJL04qmabHKJMs3KI9mJUSvEnAHiH4l1n6gamLfUsq/eio?= =?us-ascii?q?7v7oYrTgppKEL497lB3+MqUymsOhGeQ4NQ0OX22F9uim0r3s41H5TK1NjvIqiK?= =?us-ascii?q?bZtZTaKd4cpq6jDA9Zyokj6xejDzemzdQXhmMLI05CeBKCl4TpNFDOIOz8Dfil?= =?us-ascii?q?mFugiitkx/fDPrH5GJrNNHfCkLb/fbpn7E5c0gUzwche55JSELEBIej8VlX/tN?= =?us-ascii?q?zCFhM5KA20w+n/CNV5zIweX3iDAqiDMKPdqVOI6eMvI/WMZI8IoznxMfkl5/n2?= =?us-ascii?q?gX87g1Ade7em3YALaHCiAPtpPVmZbWDwjdcGFGcGpgs+Q/HqiV2GVT5ffXGyX7?= =?us-ascii?q?gz5j0jE4KmFZ3MRoa3jLyd2ye2GIBdaGNeCl2UDHvkaYGJV+0RZC6OLcJtiDIJ?= =?us-ascii?q?WaS7R4Iv2hyirA33xrl9IubK9SAUq4jv2MV66uHJiB0/+iB4AsKA2G+XVW50hH?= =?us-ascii?q?kHRzou0aB/v0N9zlCD3LB9g/1XCNBf/etJUgA+NZ/c0+x1Fcz9WgLHfteIUVam?= =?us-ascii?q?X8upDSs2TtIrzN8Ce0d9G9O8gRDfxyemHqEZmriRCJAp7q7R0GL9Kshhx3rc2q?= =?us-ascii?q?QsgEEqQs5VOm2ngq5/+RLTB4nMk0iBiqikabkS0DLV+WmAyGSOs1pUXRZyXKrF?= =?us-ascii?q?RX0ffkzWrdD550PeUbChFbQnMg1Ayc6bN6tFdMfljVJcRPfsINnReWaxlH22BR?= =?us-ascii?q?qS3bODcIrqe2Ac3CXBFEgJiBsc/XGbNQg4GiiuvXneACZrFV/gbELg6+5+qGm0?= =?us-ascii?q?TkMs1QGFc1Vh16ap+h4SnfGTV+kc3rcAuCs4rzV0HU29387NBtqbpwtheb1cbs?= =?us-ascii?q?kn7FdG02LZrQ19MYa6I6BsnF5NOzhw6gnqyBM9QtFEjs4CqGwsigx/NfTcmBlK?= =?us-ascii?q?aDXSldikMaLRAm3z5wy0La/ay1XaltGM9fFLoP8xrlGmuACyCmIj9W9m2p9byT?= =?us-ascii?q?/U7ZLPFCIWUIntSQAw7RJ7u7jebC4toY7JhlN2NqzhmzvL3ZoSD+sgywq8N4NW?= =?us-ascii?q?NKqCUhT5E8gbG9SGMOsuikSkZRICPflP+egzJczwJKjO47KiIOs1xGHutm9A+o?= =?us-ascii?q?0ojRPVpnhMD9XQ1pNA+Mm2mw6OVjPyllCk65+lk4dZYzofBSy6lTiiA5ReNPQr?= =?us-ascii?q?INQ7TFy2Ksjy/e1Qwp7gX3kCrwymFwpAwMitaAafZFz73BRN2AIQu3P1wHLknQ?= =?us-ascii?q?wxqCkgq++k5AKL2/7rLUtVImlPVXVvhlfqIJGpgpYdRkf6NgU=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DHAgDvR99efSIeaIEVBksdAQEBAQkBE?= =?us-ascii?q?gEFBQGCCgKBIVIGQQFdVTIshCSJAYkJgg2FOI1MhAKBEANQEAEDAQwYAQwHAQI?= =?us-ascii?q?EAQGBUIJ0AheBfQIdBgEFMxMCEAEBBQEBAQIBAwMEARMBAQkWCIVeASwMgjsMD?= =?us-ascii?q?AMDgyEBGAECBgQGOyoUDwMUAQYDAgQNARcBFAoDFAESFAYBAYMLgnwEAQqJfYp?= =?us-ascii?q?6m3l/M4Q6AQMDEA+EeYFADQITgRYBhTSGdiYPgUw/ZioBghJJB2yCTg4LAQEBA?= =?us-ascii?q?QGBQAEBBgYFRYJegmAEjlkRCBQPgQCLJTuFP5IqKAeCXIEFBAqGLXeKKoZFgmi?= =?us-ascii?q?BFYd9hRWNOyGQGUmBYYVeB4I6hWWKEoRBgUAqgUcBGgMMBzMaMFACgloJYA1Vh?= =?us-ascii?q?muHRIFIF4EDAQILgj6BPoEmgXU7hUEDPzMCAQEBDSUCBgEHAQEDCXUBAQUTCwG?= =?us-ascii?q?MMQIFIYIdAQE?= X-IPAS-Result: =?us-ascii?q?A0DHAgDvR99efSIeaIEVBksdAQEBAQkBEgEFBQGCCgKBIVI?= =?us-ascii?q?GQQFdVTIshCSJAYkJgg2FOI1MhAKBEANQEAEDAQwYAQwHAQIEAQGBUIJ0AheBf?= =?us-ascii?q?QIdBgEFMxMCEAEBBQEBAQIBAwMEARMBAQkWCIVeASwMgjsMDAMDgyEBGAECBgQ?= =?us-ascii?q?GOyoUDwMUAQYDAgQNARcBFAoDFAESFAYBAYMLgnwEAQqJfYp6m3l/M4Q6AQMDE?= =?us-ascii?q?A+EeYFADQITgRYBhTSGdiYPgUw/ZioBghJJB2yCTg4LAQEBAQGBQAEBBgYFRYJ?= =?us-ascii?q?egmAEjlkRCBQPgQCLJTuFP5IqKAeCXIEFBAqGLXeKKoZFgmiBFYd9hRWNOyGQG?= =?us-ascii?q?UmBYYVeB4I6hWWKEoRBgUAqgUcBGgMMBzMaMFACgloJYA1VhmuHRIFIF4EDAQI?= =?us-ascii?q?Lgj6BPoEmgXU7hUEDPzMCAQEBDSUCBgEHAQEDCXUBAQUTCwGMMQIFIYIdAQE?= X-IronPort-AV: E=Sophos;i="5.73,491,1583190000"; d="scan'208,217";a="453715017" X-MGA-submission: =?us-ascii?q?MDFAiiVECq0TA765BIu0/IDOgYVbxqW5bH9DXi?= =?us-ascii?q?kIPdE3XS8hyCkL5wvmt+K5c6qxn/CdbYCQhl1uC+YszFnlMshO7Hw4R4?= =?us-ascii?q?S8PXDeZzMtqjySLXUyyAgjQx6dNyDbtEzXwmjQ8q/eHebdmm+oGFyxko?= =?us-ascii?q?cKL6iz0cFNA9TTu41PayFMLw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Jun 2020 10:28:18 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7D7AF5648D0; Tue, 9 Jun 2020 10:28:15 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 09 Jun 2020 10:28:05 +0200 Message-ID: <87zh9cd4oa.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 9 10:28:16 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.002337, queueID=09ED75648D5 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAwMiB0byAwOSwNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTXVsdGljb3Jl IFVwZGF0ZTogQXByaWwgMjAyMCwgd2l0aCBhIHByZXByaW50IHBhcGVyDQpCQVAgMi4xLjAgUmVs ZWFzZQ0KTWlncmF0aW5nIGFuIEFzeW5jIHByb2plY3QgdG8gTHd0LCBhIHNob3J0IHByaW1lcg0K am9zZSAwLjQuMA0KT0NhbWwgNC4xMS4wLCBzZWNvbmQgYWxwaGEgcmVsZWFzZQ0KT0NhbWwgV29y a3Nob3AgMjAyMDogQ2FsbCBmb3IgVm9sdW50ZWVycw0KSW50cm9kdWN0aW9uIHRvIEx3dA0KT3Ro ZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk11bHRpY29yZSBVcGRhdGU6IEFwcmlsIDIwMjAs IHdpdGggYSBwcmVwcmludCBwYXBlcg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0 aWNvcmUtdXBkYXRlLWFwcmlsLTIwMjAtd2l0aC1hLXByZXByaW50LXBhcGVyLzU2MzAvMjZdDQoN Cg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgRGFuaWVsIELDvG56bGkgYXNrZWQgYW5kIEtDIFNp dmFyYW1ha3Jpc2huYW4gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgT25lIHRoaW5nIHRoYXQgSSBkaWRu4oCZ dCBnZXQgZnJvbSB0aGUgcGFwZXIgaXMgaG93IGV4YWN0bHkNCiAgICAgICAgYENvbmN1ck1pbm9y JyBicmVha3MgdGhlIGN1cnJlbnQgRkZJIGFuZCB0aGUgaW1wYWN0IGl0DQogICAgICAgIHdvdWxk IGhhdmUgb24gdGhlIGV4aXN0aW5nIGVjby1zeXN0ZW0sIG9uIGEgc2NhbGUgZnJvbSDigJxpdA0K ICAgICAgICBhZmZlY3QgYWxsIHByb2plY3Rz4oCdIHRvIOKAnG9ubHkgcGVvcGxlIGRvaW5nICp0 aGF0KiBmYW5jeQ0KICAgICAgICB0aGluZ+KAnSA64oCTKSA/DQoNCiAgQWxsIHRoZSBwcm9qZWN0 cyB0aGF0IHVzZSB0aGUgQyBBUEkuIFRoZSBkZXRhaWxzIGFyZSBoZXJlOg0KICBbaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUvd2lraS9DLUFQSS1jaGFu Z2VzXQ0KDQogICAgICAgIEF0IHRoZSBlbmQgb2YgdGhlIHBhcGVyIGl0IHNlZW1zIHlvdSBtYWtl IHRoZSBwb2ludCB0aGF0DQogICAgICAgIGBQYXJNaW5vcicgaXMgdGhlIHNvbHV0aW9uIHRvIGdv IHdpdGggZm9yIHRoZSB0aW1lDQogICAgICAgIGJlaW5nLiBEb2VzIHRoaXMgbWVhbnMgeW91IGFy ZSBnb2luZyB0byBsZWF2ZSBiZWhpbmQgdGhlDQogICAgICAgIHdvcmsgZG9uZSBvbiBgQ29uY3Vy TWlub3InIG9yIGRvIHlvdSBpbnRlbmQgdG8gY29udGludWUgdG8NCiAgICAgICAgbWFpbnRhaW4g aXQgPw0KDQogIFdlIGRvbid0IGludGVuZCB0byBtYWludGFpbiBpdC4gSXQgaXMgcXVpdGUgYSBi aXQgb2Ygd29yayB0byBtYWludGFpbg0KICBhbmQgcG9ydCB0aGUgY2hhbmdlcyBhY3Jvc3MgdHdv IGRpZmZlcmVudCBHQ3MuICBgUGFyTWlub3InIEdDIGlzIG5vdw0KICBhdCA0LjExIGJyYW5jaCBw b2ludCAodGhlIGRlZmF1bHQgbXVsdGljb3JlIGNvbXBpbGVyIGlzIDQuMTAgKw0KICBQYXJNaW5v ciBub3cpLiBUaGUgYENvbmNNaW5vcicgaXMgYXQgNC4wNi4xLg0KDQogIEdpdmVuIHRoYXQgYENv bmNNaW5vcicgYnJlYWtzIHRoZSBDIEFQSSwgdGhlIGVjb3N5c3RlbSB3b3VsZCBoYXZlIHRvDQog IGJlIGZpeGVkIGZvciBgQ29uY01pbm9yJyB0byBiZSB1c2VmdWwuIFRoZSBjb2RlIGNoYW5nZXMg YXJlIGluZGVlZA0KICBpbnRyaWNhdGU7IHRoZSBkaWZmZXJlbmNlcyBhcmUgbm90IGp1c3QgaW4g dGhlIG1pbm9yIEdDLCBidXQgdGhlDQogIGNvbXBpbGVycyBpbnRlcm5hbCB1c2Ugb2YgdGhlIEMg QVBJLiBJdCB3aWxsIGJlIHF1aXRlIGEgYml0IG9mIHdvcmsgdG8NCiAga2VlcCBib3RoIEdDcyBp biB0aGUgc2FtZSBzb3VyY2UgZGlzdHJpYnV0aW9uLg0KDQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNj YWdub25pIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgICAgICAgR2l2ZW4gdGhhdCBgQ29uY01pbm9yJyBicmVha3MgdGhl IEMgQVBJLCB0aGUgZWNvc3lzdGVtDQogICAgICAgIHdvdWxkIGhhdmUgdG8gYmUgZml4ZWQgZm9y IGBDb25jTWlub3InIHRvIGJlIHVzZWZ1bC4NCg0KICBJIGRvIG5vdCB0aGluayB0aGlzIGlzIG5l Y2Vzc2FyaWx5IHRydWUuDQoNCiAgSGVyZSBpcyB3aHkgSSB0aGluayBzbywgYnV0IGJlIHdhcm5l ZCB0aGF0IHRoaXMgaXMgcHJlbGltaW5hcnkgYXMgSSBkbw0KICBub3QgaGF2ZSB0aW1lIHRvIGV4 cGxvcmUgdGhpcyBpZGVhIGZ1cnRoZXIgb24gbXkgb3duIGF0IHRoZSBtb21lbnQuDQoNCg0KU3Rh dGUgaW4gUnVzdA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg QnJlYWtpbmcgdGhlIEMgQVBJIGlzIGEgY29uc2VxdWVuY2Ugb2YgZGVjaWRpbmcgdGhhdCBhbGwN CiAgc2luZ2xlLXRocmVhZGVkIHNoYXJlZCBtdXRhYmxlIHN0YXRlIG11c3QgYXNzdW1lIHRoZXkg YXJlIGFsc28gc2hhcmVkDQogIGJldHdlZW4gdGhyZWFkcy4gU28gYSBuZXcgcmVhZCBiYXJyaWVy IGlzIHVzZWQgdG8gcHJvbW90ZSB2YWx1ZXMgd2hlbg0KICByZWFkIGZyb20gYW5vdGhlciB0aHJl YWQuIEJ1dCBmb3IgZGF0YSB0eXBlcyB0aGF0IHdlcmUgY29ycmVjdCB1cCB0bw0KICBub3csIHVz ZXJzIG11c3QgYWxzbyBiZSBjYXJlZnVsIHRvIGF2b2lkIHJhY2VzIGZyb20gbm93IG9u4oCmIGZv cg0KICBpbnN0YW5jZSBieSBhdm9pZGluZyBzaGFyaW5nIHZhbHVlcyBvZiBzdWNoIHR5cGVzIGJl dHdlZW4gZG9tYWlucy4NCg0KICBPbmUgbGVzc29uIG9mIFJ1c3QgaXMgdGhhdCB0aGVyZSBhcmUg ZGlmZmVyZW50IGtpbmRzIG9mIG11dGFibGUgc3RhdGUsDQogIGZvciBkaWZmZXJlbnQgdXNhZ2Vz LCB3aXRoIGRpZmZlcmVudCBtZWFucyB0byBhY2hpZXZlIHRocmVhZC1zYWZldHkuDQoNCiAgVGhl IGNsb3Nlc3QgdGhlcmUgaXMgdG8gY3VycmVudCBPQ2FtbCdzIGBtdXRhYmxlJyBpcyB0aGUgbm90 aW9uIG9mDQogIHNpbmdsZS10aHJlYWRlZCBtdWx0aXBsZS13cml0ZXJzIG11dGFibGUgc3RhdGUg KF9gQ2VsbCdfKS4gSXQgaXMgbWFkZQ0KICB0aHJlYWQtc2FmZSBpbiBSdXN0IGJ5IHN0YXRpY2Fs bHkgcHJldmVudGluZyB2YWx1ZXMgY29udGFpbmluZyBgQ2VsbCcNCiAgZnJvbSBjcm9zc2luZyB0 aHJlYWQgYm91bmRhcmllcyAoYnkgdmlydHVlIG9mIG5vdCBoYXZpbmcgdGhlIF9gU2VuZCcNCiAg dHJhaXRfKS4gVGhlIHNhbWUgcmVzdHJpY3Rpb24gaXMgdXNlZCB0byBtYWtlIHNvbWUgZGF0YSBz dHJ1Y3R1cmVzDQogIG1vcmUgZWZmaWNpZW50IGJ5IGF2b2lkaW5nIHRoZSBjb3N0IG9mIHN5bmNo cm9uaXNhdGlvbiAoY2YuIHRoZQ0KICByZWZlcmVuY2UtY291bnRpbmcgcG9pbnRlciBgUmMnIHZz LiB0aGUgYXRvbWljIHJlZmVyZW5jZS1jb3VudGluZw0KICBwb2ludGVyIGBBcmMnKS4NCg0KICBU aGlzIGlzIG5vdCBlbm91Z2ggYnkgaXRzZWxmLCBhbmQgUnVzdCBvZmZlcnMgb3RoZXIga2luZHMg b2Ygc3RhdGUgZm9yDQogIGNvbW11bmljYXRpbmcgYW5kIHNoYXJpbmcgdmFsdWVzIGJldHdlZW4g dGhyZWFkcy4NCg0KICBfYFVuc2FmZUNlbGwnXyBsaWtlIE9jYW1sIG11bHRpY29yZSdzIGBtdXRh YmxlJyAodGhvdWdoIHlvdXJzIGlzIHNhZmUNCiAgdGhhbmtzIHRvIHRoZSB3b3JrIG9uIHRoZSBt ZW1vcnkgbW9kZWwpOiBpdCBoYXMgYWxtb3N0IG5vIHJlc3RyaWN0aW9uDQogIGFuZCBjYW4gYmUg c2VudCBhY3Jvc3MgZG9tYWlucywgYnV0IHRoZSB1c2VyIGlzIGxpa2V3aXNlIHRvbGQgdG8NCiAg 4oCcYXZvaWQgZGF0YSByYWNlc+KAnS4gSXQgaXMgcmFyZWx5IHVzZWQgYWxvbmUsIGJ1dCB0b2dl dGhlciB3aXRoIHR5cGUNCiAgYWJzdHJhY3Rpb24gaXQgY2FuIGJlIHVzZWQgdG8gcHJvZ3JhbSBz YWZlIGNvbmN1cnJlbnQgZGF0YSBzdHJ1Y3R1cmVzLg0KDQogIExhc3RseSwgdGhlIGRlZmF1bHQg bm90aW9uIG9mIHN0YXRlIGluIFJ1c3QgaXMgbGluZWFyIHN0YXRlLCB3aGljaCBjYW4NCiAgYmUg c2VudCBmcmVlbHkgYWNyb3NzIHRocmVhZHMuIFRocmVhZC1zYWZldHkgaXMgZW5zdXJlZCBieSBy ZXN0cmljdGluZw0KICBhbGlhc2luZyB1c2luZyB0aGUgb3duZXJzaGlwIGFuZCBib3Jyb3dpbmcg ZGlzY2lwbGluZS4NCg0KDQpBIGJhY2t3YXJkcy1jb21wYXRpYmxlIGNvbmN1cnJlbnQgY29sbGVj dG9yPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSWYgSSBoYWQgdG8gaW1hZ2luZSBhIGJhY2t3 YXJkcy1jb21wYXRpYmxlIE9DYW1sIHdpdGggc3RhdGljIGNvbnRyb2wNCiAgb2YgaW50ZXJmZXJl bmNlIMOgIGxhIFJ1c3QgYmFzZWQgb24gYENvbmNNaW5vcicsIGl0IHdvdWxkIGRpc3Rpbmd1aXNo DQogIHRoZSB0aHJlZSBraW5kcyBvZiBzdGF0ZSAoY29uY3JldGVseSB3aXRoIG90aGVyIGtleXdv cmRzIGluIGFkZGl0aW9uDQogIHRvIGBtdXRhYmxlJykuIGBtdXRhYmxlJyB3b3VsZCBrZWVwIGl0 cyBjdXJyZW50IG1lYW5pbmcgb2YNCiAgc2luZ2xlLWRvbWFpbiwgbXVsdGlwbGUtd3JpdGVycyBz dGF0ZSBhbmQgbm90IHJlcXVpcmUgYSByZWFkIGJhcnJpZXIsDQogIGFuZCBpbiBwYXJ0aWN1bGFy IHByZXNlcnZlIHRoZSBBUEkuIChJIGNvdW50IHN5c3RocmVhZHMgYXMNCiAgc2luZ2xlLXRocmVh ZGVkIGZvciB0aGlzIHB1cnBvc2UsIHNpbmNlIGhlcmUgaXQgbWVhbnMgInNoYXJpbmcgdGhlDQog IHNhbWUgbWlub3IgaGVhcCIuKQ0KDQogIFByb2dyYW1zIGNvdWxkIHByb2dyZXNzaXZlbHkgdHJh bnNpdGlvbiB0byBvdGhlciBraW5kcyBvZiBzdGF0ZSB3aGVuDQogIHBhcmFsbGVsaXNpbmcgdGhl IHByb2dyYW0uIENvbmNyZXRlbHksIGEgZGF0YSBzdHJ1Y3R1cmUgbGlrZQ0KICBgU3RhY2sudCcs IGluc3RlYWQgb2YgYmVjb21pbmcgcmFjeSwgd291bGQga2VlcCBpdHMgY3VycmVudCBtZWFuaW5n LA0KICBidXQgdXNlcnMgY291bGQgcmVwbGFjZSBpdCB3aXRoIGEgbGluZWFyIHN0YWNrIG9yIGEg Y29uY3VycmVudCBzdGFjaywNCiAgdHdvIGRhdGEgc3RydWN0dXJlcyBkaXN0aW5jdCBmcm9tIHRo ZSBmaXJzdCBvbmUsIHdoZW4gcGFyYWxsZWxpemluZw0KICB0aGVpciBwcm9ncmFtcy4NCg0KICBT byBob3cgY291bGQgdGhpcyBmaXQgd2l0aCB0aGUgY3VycmVudCBwbGFucz8gSXQgaXMgbm90IGVu dGlyZWx5IGNsZWFyDQogIHRvIG1lLiBJZiBwZW9wbGUgc3RhcnQgdG8gcmVseSBvbiBwYXJhbGxl bGlzbSBpbiBhbiB1bnN0cnVjdHVyZWQgd2F5DQogIChlLmcuIG5vIGNsZWFyIGRpc3RpbmN0aW9u IGJldHdlZW4gZGlmZmVyZW50IGtpbmRzIG9mIGRhdGEgdHlwZXMNCiAgYXJpc2luZyBmcm9tIGRp ZmZlcmVudCB3YXlzIG9mIGVuc3VyaW5nIHRocmVhZC1zYWZldHkpIHRoZW4gb25lIHdpbGwNCiAg YWxzbyBsb3NlIHRoZSBhYmlsaXR5IHRvIHJldHJvZml0IGBDb25jTWlub3InIGluIGENCiAgYmFj a3dhcmRzLWNvbXBhdGlibGUgbWFubmVyIChieSBsb3NpbmcgdGhlIGluZm9ybWF0aW9uIHRoYXQg dGhlDQogIGN1cnJlbnQgYG11dGFibGUnIEFQSSBpcyBzaW5nbGUtdGhyZWFkZWQpLiBUaGUgQVBJ IGJyZWFrYWdlIG9mDQogIGBDb25jTWlub3InIHdoaWNoIG1pZ2h0IG9ubHkgYmUgdmlydHVhbCBy aWdodCBub3cgKGlmIEkgdHJ1c3QgdGhpcw0KICBwcmVsaW1pbmFyeSwgbm90IGZ1bGx5LWV4cGxv cmVkIGlkZWEpIHdpbGwgYmVjb21lIHJlYWwuICAoRnVydGhlcg0KICBkaWZmaWN1bHRpZXMgYXJp c2Ugd2l0aCB0aGUgZW11bGF0aW9uIG9mIHRoZSBgVGhyZWFkJyBsaWJyYXJ5IHdpdGgNCiAgZG9t YWlucywgYnV0IHRoaXMgY291bGQgYmUgY2hhbmdlZCBsYXRlci4pDQoNCiAgQnV0IGlmIHVzZXJz IGFyZSBwcm92aWRlZCBpbiBhZHZhbmNlIHdpdGggYSBnZW5lcmFsIGRpcmVjdGlvbiBmb3IgYQ0K ICBtb2RlbCBvZiBjb250cm9sIG9mIGludGVyZmVyZW5jZSB0aGlzIG1pZ2h0IGhhcHBlbiBkaWZm ZXJlbnRseS4gQW5kDQogIGV2ZW50dWFsbHkgaGF2aW5nIHN1Y2ggYSBtb2RlbCBpcyBkZXNpcmFi bGUgaW4gYW55IGNhc2UsIGFzIGl0IGhlbHBzDQogIHBhcmFsbGVsaXppbmcgcHJvZ3JhbXMgKGZv ciBpbnN0YW5jZSB0aGUgRmlyZWZveCBwZW9wbGUgcmVwb3J0ZWQgdGhhdA0KICB0aGV5IGhhZCBh dHRlbXB0ZWQgYW5kIGZhaWxlZCB0d2ljZSB0byBwYXJhbGxlbGlzZSB0aGUgQ1NTIGVuZ2luZSBp bg0KICBDKysgYmVmb3JlIHN1Y2NlZWRpbmcgd2l0aCBSdXN0KS4gRnVydGhlcm1vcmUsIGluIGFu IGltYWdpbmFyeQ0KICByZXRyb2ZpdHRpbmcgb2YgYENvbmNNaW5vcicsIG9uZSBjb3VsZCBpbWFn aW5lIGVuZm9yY2luZyBzb21ldGhpbmcNCiAgbGlrZSB0aGUgYFNlbmQnIHRyYWl0IGF0IHRoZSBs ZXZlbCBvZiB0aGUgcmVhZCBiYXJyaWVyIHVudGlsIHRoZXJlIGlzDQogIGEgYmV0dGVyIHdheSAo dGhlcmUgd291bGQgYmUgdHdvIGtpbmRzIG9mIGJhcnJpZXJzLCBvbmUgb2Ygd2hpY2ggd291bGQN CiAgcmFpc2UgYW4gZXhjZXB0aW9uIGlmIGEgc3RhdGUgaGFwcGVuZWQgdG8gYmUgaW5jb3JyZWN0 bHkgc2hhcmVkIGFjcm9zcw0KICBkb21haW5zLCBhbmQgbm90IGJlIHJlcXVpcmVkIGluIHRoZSBG RkkpLg0KDQogIEkgZmluZCBgQ29uY01pbm9yJyBpbnRlcmVzdGluZyBmcm9tIGEgc3lzdGVtcyBw cm9ncmFtbWluZyBwZXJzcGVjdGl2ZQ0KICBjb21wYXJlZCB0byB0aGUgc3RvcC10aGUtd29ybGQg Y29sbGVjdG9yIGJlY2F1c2UgaXQgY291bGQgKEkgaG9wZSkNCiAgb2ZmZXIgcG9zc2liaWxpdGll cyBzdWNoIGFzIGhhdmluZyBhIGxvdy1sYXRlbmN5IGRvbWFpbiBjb21tdW5pY2F0aW5nDQogIHdp dGggYSBoaWdoZXItbGF0ZW5jeSBkb21haW4uIE1vcmVvdmVyIHRoZSBwZXJmb3JtYW5jZSBjb3N0 IG9mIHRoZQ0KICByZWFkIGJhcnJpZXIgbWlnaHQgYmUgbG93ZXIgaW4gdGhpcyBzY2hlbWUgaWYg aXQgY291bGQgYmUgcmVtb3ZlZCBmb3INCiAgYWxsIGJ1dCB0aGUgY29uY3VycmVudCBkYXRhIHN0 cnVjdHVyZXMuDQoNCg0KQkFQIDIuMS4wIFJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IFtodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWJhcC0yLTEtMC1yZWxlYXNlLzU5MDYvMV0NCg0KDQpJdmFuIEdv dG92Y2hpdHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgQ2FybmVnaWUg TWVsbG9uIFVuaXZlcnNpdHkgQmluYXJ5IEFuYWx5c2lzIFBsYXRmb3JtIChbQ01VIEJBUF0pIGlz DQogIGEgc3VpdGUgb2YgdXRpbGl0aWVzIGFuZCBsaWJyYXJpZXMgdGhhdCBlbmFibGVzIGFuYWx5 c2lzIG9mIHByb2dyYW1zDQogIHRoYXQgYXJlIHJlcHJlc2VudGVkIGFzIG1hY2hpbmUgY29kZSAo YWthIGJpbmFyaWVzKS4gQ01VIEJBUCBpcw0KICB3cml0dGVuIGluIE9DYW1sIGFuZCB1c2VzIHBs dWdpbi1iYXNlZCBhcmNoaXRlY3R1cmUgdG8gZW5hYmxlDQogIGV4dGVuc2liaWxpdHkuIFdlIGFs c28gaGF2ZSBhIGRvbWFpbi1zcGVjaWZpYyBsYW5ndWFnZSwgY2FsbGVkIFByaW11cw0KICBMaXNw LCB0aGF0IHdlIHVzZSB0byB3cml0ZSBhbmFseXNpcywgc3BlY2lmeSB2ZXJpZmljYXRpb24gY29u ZGl0aW9ucywNCiAgaW50ZXJhY3Qgd2l0aCB0aGUgYnVpbHQtaW4gU01UIHNvbHZlciwgYW5kIG1v ZGVsIHRoZSBzZW1hbnRpY3Mgb2YNCiAgbWFjaGluZSBpbnN0cnVjdGlvbnMgYW5kIGZ1bmN0aW9u cy4NCg0KICBUaGUgMi4xLjAgUmVsZWFzZSBpcyB2ZXJ5IHJpY2ggaW4gW25ldyBmZWF0dXJlc10g YnV0IHRoZSBtb3N0DQogIHByb21pbmVudCBhZGRpdGlvbiBpcyB0aGUgbmV3IFtzeW1ib2xpYyBl eGVjdXRvcl0gbW9kZSBmb3IgdGhlIFByaW11cw0KICBmcmFtZXdvcmsuIFdlIGFsc28gc2lnbmlm aWNhbnRseSB1cGRhdGVkIHRoZSBQcmltdXMgZnJhbWV3b3JrLA0KICBpbnRlZ3JhdGVkIGl0IHdp dGggb3VyIG5ldyBLbm93bGVkZ2UgQmFzZSwgd2hpY2ggd2FzIGludHJvZHVjZWQgaW4gdGhlDQog IEJBUCAyLjAgcmVsZWFzZTsgd2UgbWFkZSBvdXIgaW50ZXJwcmV0ZXIgbXVjaCBmYXN0ZXI7IHdl IGFkZGVkIHRoZQ0KICBzeXN0ZW1zIGFuZCBjb21wb25lbnRzIGZhY2lsaXRpZXMsIGluc3BpcmVk IGJ5IENvbW1vbiBMaXNwOyBhbmQgd2UNCiAgaW1wbGVtZW50ZWQgYSBncmFkdWFsIHR5cGUgY2hl Y2tlciBmb3IgUHJpbXVzIExpc3Agd2l0aCB0eXBlDQogIGluZmVyZW5jZS4gV2UgYWxzbyBhZGRl ZCBhbiBhYmlsaXR5IHRvIHJlcHJlc2VudCBtYWNoaW5lIGluc3RydWN0aW9ucw0KICBhcyBpbnRy aW5zaWMgZnVuY3Rpb25zIHNvIG5vdyBpdCBpcyBwb3NzaWJsZSB0byBleHByZXNzIHRoZWlyDQog IHNlbWFudGljcyB1c2luZyBQcmltdXMgTGlzcCBzaW5jZSB3ZSBhZGRlZCBJRUVFNzU0IHByaW1p dGl2ZXMgdG8gdGhlDQogIExpc3AgaW50ZXJwcmV0ZXIuDQoNCiAgQXMgdXN1YWwsIHdlIHVwZ3Jh ZGVkIEJBUCB0byB0aGUgbmV3ZXIgdmVyc2lvbnMgb2YgdGhlIENvcmUgbGlicmFyeQ0KICBhbmQg T0NhbWwgKHdlIG5vdyBzdXBwb3J0IE9DYW1sIHZlcnNpb25zIGZyb20gNC4wNyB0byA0LjA5KS4g V2UgYWxzbw0KICBzaWduaWZpY2FudGx5IGltcHJvdmVkIG91ciBidWlsZCB0aW1lcyBhbmQgYWRk ZWQgYW4gb3B0aW9uYWwgb21ha2UNCiAgYmFja2VuZCwgd2hpY2ggd2UgYXJlIHVzaW5nIGluLWhv dXNlLg0KDQogIEZyb20gdGhlIHVzZXIgcGVyc3BlY3RpdmUsIG9uZSBvZiB0aGUga2V5IGZlYXR1 cmVzIG9mIEJBUCBhcyBhbg0KICBhbmFseXNpcyBwbGF0Zm9ybSBpcyB0aGF0IHlvdSBjYW4gcnVu IEJBUCBvbiBiaW5hcmllcyB0aGF0IHlvdSBjYW4ndA0KICBydW4gb3RoZXJ3aXNlLCBlaXRoZXIg YmVjYXVzZSB0aGV5IG5lZWQgc3BlY2lhbCBoYXJkd2FyZSBvciBzb2Z0d2FyZSwNCiAgb3IgbmVl ZCB0byBpbnRlcmFjdCB3aXRoIHRoZSBvdXRzaWRlIHdvcmxkLiBJbiB0aGUgcGFzdCBjb3VwbGUg b2YNCiAgbW9udGhzLCB3ZSBoYXZlIHJ1biBCQVAgb24gdmFyaW91cyBmaXJtd2FyZSBhbmQgZm91 bmQgbnVtZXJvdXMNCiAgemVyby1kYXkgdnVsbmVyYWJpbGl0aWVzLCBwYXJ0aWN1bGFyLCB3ZSB3 ZXJlIGFibGUgdG8gZmluZCBjcml0aWNhbA0KICB2dWxuZXJhYmlsaXRpZXMgaW4gdGhlIFZ4V29y a3Mgb3BlcmF0aW5nIHN5c3RlbSB0aGF0IHJ1bnMgb24sDQogIHBvdGVudGlhbGx5LCBiaWxsaW9u cyBvZiBkZXZpY2VzIGluY2x1ZGluZyBtaXNzaW9uLWNyaXRpY2FsIGFuZA0KICBtaWxpdGFyeSBh cHBsaWFuY2VzLg0KDQogIEFzIGFsd2F5cywgcXVlc3Rpb25zLCBzdWdnZXN0aW9ucywgYW5kIG9w aW5pb25zIGFyZSB2ZXJ5IHdlbGNvbWUhDQoNCg0KW0NNVSBCQVBdIGh0dHBzOi8vZ2l0aHViLmNv bS9CaW5hcnlBbmFseXNpc1BsYXRmb3JtL2JhcA0KDQpbbmV3IGZlYXR1cmVzXQ0KaHR0cHM6Ly9n aXRodWIuY29tL0JpbmFyeUFuYWx5c2lzUGxhdGZvcm0vYmFwL3JlbGVhc2VzL3RhZy92Mi4xLjAN Cg0KW3N5bWJvbGljIGV4ZWN1dG9yXQ0KaHR0cHM6Ly9naXRodWIuY29tL0JpbmFyeUFuYWx5c2lz UGxhdGZvcm0vYmFwL3B1bGwvMTEwNQ0KDQoNCk1pZ3JhdGluZyBhbiBBc3luYyBwcm9qZWN0IHRv IEx3dCwgYSBzaG9ydCBwcmltZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWlncmF0aW5nLWFu LWFzeW5jLXByb2plY3QtdG8tbHd0LWEtc2hvcnQtcHJpbWVyLzU5MDgvMV0NCg0KDQpNaWNoYWVs IEJhY2FyZWxsYSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIENvbnNp ZGVyIHRoaXMgYSBwb3N0IHdoZXJlIEkgdGhpbmsgYWxvdWQgYWJvdXQgbXkgZXhwZXJpZW5jZSBt aWdyYXRpbmcNCiAgYW4gQXN5bmMgcHJvamVjdCB0byBMd3QuICBJJ3ZlIHNwZW50IGFib3V0IGEg d2Vla2VuZCBkb2luZyBzdWNoIGENCiAgdGhpbmcsIGFuZCBpZiwgaW4gdGhlIHByb2Nlc3Mgb2Yg dGFsa2luZyBhYm91dCBpdCBoZXJlIEkgY2FuIHNhdmUgYQ0KICBmZXcgcGVvcGxlIGFuIGhvdXIg b3IgdHdvIChvciBwZXJoYXBzIGluc3BpcmUgY29uZmlkZW5jZSB0byB0YWtlIHN1Y2gNCiAgYSBw cm9qZWN0IG9uIGluIHRoZSBmaXJzdCBwbGFjZSkgdGhlbiBpdCB3aWxsIGhhdmUgYmVlbiB3b3J0 aHdoaWxlLg0KDQogIFRoaXMgd291bGRuJ3QgYmUgYSBjb21wbGV0ZSBwb3N0IGlmIEkgZGlkbid0 IGFsc28gbWVudGlvbiBAZGtpbSdzDQogIFt0cmFuc2xhdGlvbiBvZiBSZWFsIFdvcmxkIE9DYW1s J3MgQXN5bmMgZXhhbXBsZXMgdG8gTHd0XQ0KDQogIFRoaXMgd2FzIGJvcm4gb3V0IG9mIGEgcHJl dmlvdXMgZWZmb3J0IHdoZXJlIEkgW3RyaWVkIHRvIG1peCBMd3QgYW5kDQogIEFzeW5jIGluIHRo ZSBzYW1lIHByb2plY3RdLiAgVGhpcyBkaWRuJ3QgZ28gc28gd2VsbCwgc28gSSB0cmllZA0KICBj b252ZXJ0aW5nIHRoZSB3aG9sZSB0aGluZyB0byBMd3QsIGFuZCBpdCB0dXJucyBvdXQgYWRhcHRp bmcgdG8gTHd0IGlmDQogIHlvdSdyZSBhbiBBc3luYyBwZXJzb24gaXMgYWN0dWFsbHkgbXVjaCBl YXNpZXIgdGhhbiBJIHRob3VnaHQgaXQgd291bGQNCiAgYmUuDQoNCg0KW3RyYW5zbGF0aW9uIG9m IFJlYWwgV29ybGQgT0NhbWwncyBBc3luYyBleGFtcGxlcyB0byBMd3RdDQpodHRwczovL2dpdGh1 Yi5jb20vZGtpbS9yd28tbHd0DQoNClt0cmllZCB0byBtaXggTHd0IGFuZCBBc3luYyBpbiB0aGUg c2FtZSBwcm9qZWN0XQ0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jlc3QtcHJhY3RpY2Vz LW9uLW1peGluZy1sd3QtYW5kLWFzeW5jLzUzNzINCg0KQmFzaWNzDQrilYzilYzilYzilYzilYzi lYwNCg0KICBCb3RoIGxpYnJhcmllcyBpbnZvbHZlIHByb21pc2VzL2Z1dHVyZXMuICBBc3luYyBj YWxscyBpdHMgcHJvbWlzZXMNCiAgYERlZmVycmVkLnQnLCB3aGVyZWFzIGluIEx3dCB0aGV5J3Jl IGNhbGxlZCBgTHd0LnQnLg0KDQogIEluIEFzeW5jIHlvdSBzdGFydCB5b3VyIHByb2dyYW0gYnkg c2F5aW5nIGBuZXZlcl9yZXR1cm5zIChTY2hlZHVsZXIuZ28NCiAgKCkpJyBvciBgQ29tbWFuZC5h c3luY19zcGVjJyBhZnRlciB5b3Ugc2V0IHVwIHlvdXIgaW5pdGlhbA0KICBgRGVmZXJyZWQudCcu DQoNCiAgSW4gTHd0IHlvdSBzYXkgYEx3dF9tYWluLnJ1bicgb24gYSB0b3AtbGV2ZWwgYEx3dC50 JyBhcmd1bWVudC4gIE5vdGUNCiAgeW91IGNhbiByZS1ydW4gYEx3dF9tYWluLnJ1bicgaW4gYSBz aW5nbGUgcHJvZ3JhbSBhcyBtYW55IHRpbWVzIGFzIHlvdQ0KICB3YW50LCBidXQgcGVyaGFwcyB5 b3Ugc2hvdWxkbid0IHJ1biBtdWx0aXBsZSBgTHd0X21haW4ucnVuJyBpbg0KICBwYXJhbGxlbC4N Cg0KICBUaGVyZSdzIGFuIGVhc3kgY29ycmVzcG9uZGVuY2UgYmV0d2VlbiBiYXNpYyBvcGVyYXRv cnMuDQoNCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQogICBB c3luYyAgICAgICAgICAgICAgICAgICAgICBMd3QgICAgICAgICAgICAgICAgICAgICANCiAg4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQogICBgRGVmZXJyZWQuYmlu ZCcgICAgICAgICAgICBgTHd0LmJpbmQnICAgICAgICAgICAgICANCiAgIGBEZWZlcnJlZC5yZXR1 cm4nICAgICAgICAgIGBMd3QucmV0dXJuJyAgICAgICAgICAgIA0KICAgYD4+PScgICAgICAgICAg ICAgICAgICAgICAgYD4+PScgICAgICAgICAgICAgICAgICAgDQogICBgRGVmZXJyZWQubWFwJyAg ICAgICAgICAgICBgTHd0Lm1hcCcgICAgICAgICAgICAgICANCiAgIGA+PnwnICAgICAgICAgICAg ICAgICAgICAgIGA+fD0nICAgICAgICAgICAgICAgICAgIA0KICAgYERlZmVycmVkLmRvbid0X3dh aXRfZm9yJyAgYEx3dC5hc3luYycgICAgICAgICAgICAgDQogICBgSW5fdGhyZWFkLnJ1bicgICAg ICAgICAgICBgTHd0X3ByZWVtcHRpdmUuZGV0YWNoJyANCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQoNCg0KU3RhcnZhdGlvbiB3b3JyaWVzDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgbW9z dCBpbXBvcnRhbnQgZGlmZmVyZW5jZSBiZXR3ZWVuIEFzeW5jIGFuZCBMd3QgaXMgdGhhdCAqZnVs ZmlsbGVkDQogIHByb21pc2VzIGFyZSBhY3RlZCBvbiBpbW1lZGlhdGVseSosIHdoZXJlYXMgQXN5 bmMga2luZGEgcHVudHMgdGhlbSB0bw0KICB0aGUgZW5kIG9mIGEgd29yayBxdWV1ZSBhbmQgcnVu cyB0aGVpciB0aHVua3MgbGF0ZXIuDQoNCiAgQSByZXR1cm4gbG9vcCBsaWtlIHRoaXMgc3RhcnZl cyB0aGUgcmVzdCBvZiBMd3Q6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIEx3dC5J bmZpeA0KICDilIIgDQogIOKUgiBsZXQgbWFpbiAoKSA9DQogIOKUgiAgIGxldCByZWMgbG9vcCAo KSA9DQogIOKUgiAgICAgTHd0LnJldHVybiAoKQ0KICDilIIgICAgID4+PSBmdW4gKCkgLT4NCiAg 4pSCICAgICBsb29wICgpDQogIOKUgiAgIGluDQogIOKUgiAgIEx3dC5hc3luYyAobG9vcCAoKSk7 DQogIOKUgiAgIEx3dF9pby5wcmludGxmICJ0aGlzIGxpbmUgbmV2ZXIgcHJpbnRzISINCiAg4pSC IDs7DQogIOKUgiANCiAg4pSCIGxldCAoKSA9IEx3dF9tYWluLnJ1biBtYWluIDs7DQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIHdoZXJlYXMgdGhlIGNvcnJlc3BvbmRpbmcgQXN5bmMgbG9vcCBkb2Vz IG5vdCBzdGFydmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuISBBc3luYw0KICDi lIIgDQogIOKUgiBsZXQgbWFpbiAoKSA9DQogIOKUgiAgIGxldCByZWMgbG9vcCAoKSA9DQogIOKU giAgICAgRGVmZXJyZWQucmV0dXJuICgpDQogIOKUgiAgICAgPj49IGZ1biAoKSAtPg0KICDilIIg ICAgIGxvb3AgKCkNCiAg4pSCICAgaW4NCiAg4pSCICAgZG9uJ3Rfd2FpdF9mb3IgKGxvb3AgKCkp Ow0KICDilIIgICBwcmludGYgInRoaXMgbGluZSBkb2VzIHByaW50IVxuIjsNCiAg4pSCICAgcmV0 dXJuICgpDQogIOKUgiA7Ow0KICDilIIgDQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBsZXQgY21k ID0gQ29tbWFuZC5hc3luY19zcGVjIH5zdW1tYXJ5OiIiIENvbW1hbmQuU3BlYy5lbXB0eSBtYWlu IGluDQogIOKUgiAgIENvbW1hbmQucnVuIGNtZA0KICDilIIgOzsNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgRm9ydHVuYXRlbHkgdGhlcmUncyBhIHdvcmthcm91bmQuIFlvdSBjYW4gZ2V0IHNvbWV0 aGluZyBjbG9zZXIgdG8gdGhlDQogIEFzeW5jLXN0eWxlIGJlaGF2aW9yIGluIEx3dCBieSB1c2lu ZyBgTHd0LnlpZWxkICgpJyBpbnN0ZWFkIG9mDQogIGBMd3QucmV0dXJuICgpJy4NCg0KDQpTcGF3 bmluZyB0aHJlYWRzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBGcm9tIHRpbWUgdG8gdGltZSB5b3UgbWF5IG5lZWQgdG8gcnVuIHNvbWV0aGlu ZyBpbiBhIHN5c3RlbSB0aHJlYWQuDQogIEluIEFzeW5jIHlvdSBzYXkgYEluX3RocmVhZC5ydW4n LCB3aGVyZWFzIGluIEx3dCB5b3Ugc2F5DQogIGBMd3RfcHJlZW1wdGl2ZS5kZXRhY2gnLiAgRm9y IHNpbXBsZSB0aGluZ3MgdGhleSdyZSBwcmV0dHkgbXVjaA0KICBpbnRlcmNoYW5nZWFibGUsIGJ1 dCBvbmUgc3R1bWJsaW5nIHBvaW50IGZvciBtZSB3YXMgdGhhdCBpbiBBc3luYyB5b3UNCiAgY2Fu IGNyZWF0ZSBhIG5hbWVkIHRocmVhZCBhbmQgYWx3YXlzIHVzZSB0aGF0IGZvciB0aGUgYEluX3Ro cmVhZC5ydW4nLA0KICB3aXRoIG11bHRpcGxlIHNpbXVsdGFuZW91cyBkaXNwYXRjaGVzIHRvIHRo YXQgdGhyZWFkIGJlY29taW5nDQogIHNlcXVlbmNlZC4NCg0KICBUaGlzIGlzIHJlYWxseSB1c2Vm dWwgZm9yIGludGVyYWN0aW5nIHdpdGggbGlicmFyaWVzIHRoYXQgYXJlbid0IHNvDQogIHRocmVh ZCBmcmllbmRseS4NCg0KICBMd3QncyBkZXRhY2ggZG9lc24ndCBwcm92aWRlIGFuIGVhc3kgd2F5 IHRvIGRvIHRoaXMgb3V0IG9mIHRoZSBib3gsDQogIGJ1dCBJIHRoaW5rIHlvdSBjYW4gc3RpbGwg ZGVhbCB3aXRoIHRocmVhZCB1bmZyaWVuZGx5IGxpYnJhcmllcyBieQ0KICB1c2luZyB0aGUgYEx3 dF9wcmVlbXB0aXZlLnJ1bl9pbl9tYWluJyBjYWxsLg0KDQogIEJhc2ljYWxseSwgbmV2ZXIgZXhp dCB0aGUgZGV0YWNoIHRocmVhZCB5b3Ugc3RhcnRlZCB0byBpbnRlcmFjdCB3aXRoDQogIHlvdXIg bGlicmFyeSwgYW5kIGluc3RlYWQgaGF2ZSBpdCBibG9jayBvbiBwcm9taXNlIHRoYXQgZ2V0cyBm aWxsZWQNCiAgdGhyb3VnaCBydW5faW5fbWFpbi4gIEluIHRoaXMgd2F5IHlvdSBjYW4gc2VxdWVu Y2UgeW91ciBkZXRhY2hlZCBMd3QNCiAgdGhyZWFkIHNpbWlsYXJseSB0byBBc3luYy4NCg0KICBI YXBweSB0byBleHBsYWluIGZ1cnRoZXIgaWYgdGhpcyBpcyB1bmNsZWFyLg0KDQoNCk90aGVyIGxp YnJhcmllcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgYEFzeW5jLlVuaXgnIGhhcyBhIHNvbWV3aGF0IGJ1aWx0LXVwIGNvbmNlcHRpb24gb2YgdGhl IFVOSVggQVBJLA0KICB3aGVyZWFzIGBMd3RfbWFpbicgaXMgbW9yZSBhIGRpcmVjdCBtYXBwaW5n IG9mIG9jYW1sJ3MgYFVuaXgnIG1vZHVsZQ0KICB0byBwcm9taXNlcy4NCg0KICBBc3luYyBgQ2xv Y2suZXZlcnknIGFuZCBgQ2xvY2suYWZ0ZXInIGRvbid0IGhhdmUgZXhhY3QgYW5hbG9ncywgYnV0 DQogIHlvdSBjYW4gbWFrZSBuZXcgdmVyc2lvbnMgcHJldHR5IHNpbXBseS4NCg0KICBFeGFtcGxl IG9mIGEgc2hhbGxvdyBpbWl0YXRpb24gb2YgQXN5bmMgYENsb2NrLmV2ZXJ5Jw0KICDilIzilIDi lIDilIDilIANCiAg4pSCIGxldCBldmVyeSBzcGFuIGYgPQ0KICDilIIgICBMd3QuYXN5bmMgKGZ1 biAoKSAtPg0KICDilIIgICAgIGxldCBzcGFuID0gVGltZS5TcGFuLnRvX3NlYyBzcGFuIGluDQog IOKUgiAgICAgbGV0IHJlYyBsb29wICgpID0NCiAg4pSCICAgICAgIGYgKCk7DQogIOKUgiAgICAg ICBMd3RfdW5peC5zbGVlcCBzcGFuDQogIOKUgiAgICAgICA+Pj0gZnVuICgpIC0+DQogIOKUgiAg ICAgICBsb29wICgpDQogIOKUgiAgICAgaW4NCiAg4pSCICAgICBsb29wICgpKQ0KICDilIIgOzsN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgKk9wZW4gcXVlc3Rpb25zKg0KDQogIEkgaGF2ZW4ndCBz b3J0ZWQgb3V0IGEgZ29vZCBMd3Qgc3Vic3RpdHV0ZSB0aGF0J3MgYXMgY29tZm9ydGFibGUgYXMN CiAgQXN5bmMgUGlwZSB5ZXQuICBUaG91Z2ggc29tZSBjb21iaW5hdGlvbiBvZiBMd3Rfc3RyZWFt LCBMd3Rfc2VxdWVuY2UNCiAgYW5kIGBsd3QtcGlwZScgbWlnaHQgZml0IHRoZSBiaWxsLiAgSWYg eW91IGp1c3QgaGFwcGVuIHRvIGtub3cgYWxyZWFkeQ0KICBmZWVsIGZyZWUgdG8gY2x1ZXBob25l Lg0KDQoNCkNsb3NpbmcgcmVtYXJrcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyBiYXNpY2FsbHkgZXZlcnl0aGluZz8gIEknbSBhbG1v c3Qgc3VzcGljaW91cyB0aGF0IEknbSBub3QNCiAgaGF2aW5nIG1vcmUgcHJvYmxlbXMsIGJ1dCB3 aWxsIGhhcHBpbHkgYWNjZXB0IGdyYWNlIHdoZW4gaXQgYXJpc2VzLg0KDQoNClJhcGhhw6tsIFBy b3VzdCB0aGVuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEkgaGF2ZW7igJl0IHNv cnRlZCBvdXQgYSBnb29kIEx3dCBzdWJzdGl0dXRlIHRoYXTigJlzIGFzDQogICAgICAgIGNvbWZv cnRhYmxlIGFzIEFzeW5jIFBpcGUgeWV0LiBUaG91Z2ggc29tZSBjb21iaW5hdGlvbiBvZg0KICAg ICAgICBMd3Rfc3RyZWFtLCBMd3Rfc2VxdWVuY2UgYW5kIGBsd3QtcGlwZScgbWlnaHQgZml0IHRo ZQ0KICAgICAgICBiaWxsLiBJZiB5b3UganVzdCBoYXBwZW4gdG8ga25vdyBhbHJlYWR5IGZlZWwg ZnJlZSB0bw0KICAgICAgICBjbHVlcGhvbmUuDQoNCiAgVGhlIFRlem9zIHByb2plY3QgaGFzIGEg cGlwZS1saWtlIG1vZHVsZToNCiAgW2h0dHBzOi8vZ2l0bGFiLmNvbS90ZXpvcy90ZXpvcy8tL2Js b2IvbWFzdGVyL3NyYy9saWJfc3RkbGliL2x3dF9waXBlLm1saV0NCiAgSXQgaGFzbid0IGJlZW4g cmVsZWFzZWQgYXMgYSBzdGFuZGFsb25lIGxpYnJhcnkgKHlldCkgYnV0IGl0IGlzDQogIHJlbGVh c2VkIGFzIHBhcnQgb2YgdGhlIGB0ZXpvcy1zdGRsaWInIHBhY2thZ2UuDQoNCiAgSSBoYXZlbid0 IHVzZWQgQXN5bmMncyBwaXBlLCBzbyBJIGRvbid0IGtub3cgaG93IGNsb3NlIG9mIGEgbWF0Y2gg aXQNCiAgaXMuDQoNCg0Kam9zZSAwLjQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tam9zZS0wLTQt MC81OTA5LzFdDQoNCg0KVWxyaWsgU3RyaWQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBIG5ldyBy ZWxlYXNlIG9mIEpPU0UgaGFzIGJlZW4gcHVibGlzaGVkIHRvIG9wYW0NCg0KICBUaGUgZm9sbG93 aW5nIGNoYW5nZXMgaGFzIGJlZW4gbWFkZQ0KICDigKIgUkZDNzYzODogSW1wbGVtZW50IHRodW1i cHJpbnRzIEB1bmR1DQogIOKAoiBNYWtlIGtpZCBvcHRpb25hbCBpbiB0aGUgaGVhZGVyIGFuZCBq d2sgdG8gYWxpZ24gYmV0dGVyIHdpdGggdGhlDQogICAgc3BlYywgdGhpcyBpcyBhIGJyZWFraW5n IGNoYW5nZQ0KDQogIEkgaGF2ZSBzdGFydGVkIGRvZyBmb29kaW5nIHRoZSBsaWJyYXJ5IGZvciBh IE9wZW5JRCBDb25uZWN0IGNsaWVudA0KICB3aGljaCBob3BlZnVsbHkgd2lsbCBoZWxwIHdpdGgg dGhlIGRlc2lnbiBnb2luZyBmb3J3YXJkLg0KDQoNCk9DYW1sIDQuMTEuMCwgc2Vjb25kIGFscGhh IHJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMS0w LXNlY29uZC1hbHBoYS1yZWxlYXNlLzU5MTAvMV0NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBBIG5ldyBhbHBoYSB2ZXJzaW9uIG9mIE9DYW1sIDQuMTEuMCBoYXMgYmVlbiBwdWJsaXNo ZWQuICBDb21wYXJlZCB0bw0KICB0aGUgZmlyc3QgYWxwaGEgdmVyc2lvbiwgdGhpcyB2ZXJzaW9u IGNvbnRhaW5zIHRoZSBmb2xsb3dpbmcgbmV3IGJ1Zw0KICBmaXhlczoNCg0KICDigKIgKmFkZGl0 aW9uYWwgZml4ZXMqIFs2NjczXSwgWzExMzJdLCBbKzk2MTddOiBSZWxheCB0aGUgaGFuZGxpbmcg b2YNCiAgICAgZXhwbGljaXQgcG9seW1vcnBoaWMgdHlwZXMgKExlbyBXaGl0ZSwgcmV2aWV3IGJ5 IEphY3F1ZXMgR2FycmlndWUNCiAgICAgYW5kIEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgKmFk ZGl0aW9uYWwgZml4ZXMqIFs3MzY0XSwgWzIxODhdLCBbKzk1OTJdLCBbKzk2MDldOiBpbXByb3Zl bWVudCBvZg0KICAgICB0aGUgdW5ib3hhYmlsaXR5IGNoZWNrIGZvciB0eXBlcyB3aXRoIGEgc2lu Z2xlDQogICAgIGNvbnN0cnVjdG9yLiBNdXR1YWxseS1yZWN1cnNpdmUgdHlwZSBkZWNsYXJhdGlv bnMgY2FuIG5vdyBjb250YWluDQogICAgIHVuYm94ZWQgdHlwZXMuIFRoaXMgaXMgYmFzZWQgb24g dGhlIHBhcGVyDQogICAgIFtodHRwczovL2FyeGl2Lm9yZy9hYnMvMTgxMS4wMjMwMF0NCg0KICDi gKIgWzc4MTddLCBbOTU0Nl06IFVuc291bmQgaW5jbHVzaW9uIGNoZWNrIGZvciBwb2x5bW9ycGhp YyB2YXJpYW50DQogICAgKEphY3F1ZXMgR2FycmlndWUsIHJlcG9ydCBieSBNaWtoYWlsIE1hbmRy eWtpbiwgcmV2aWV3IGJ5IEdhYnJpZWwNCiAgICBTY2hlcmVyKQ0KDQogIOKAoiBbOTU0OV0sIFs5 NTU3XTogTWFrZSAtZmxhcmdlLXRvYyB0aGUgZGVmYXVsdCBmb3IgUG93ZXJQQyBhbmQNCiAgICBp bnRyb2R1Y2UgLWZzbWFsbC10b2MgdG8gZW5hYmxlIHRoZSBwcmV2aW91cyBiZWhhdmlvdXIuIChE YXZpZA0KICAgIEFsbHNvcHAsIHJlcG9ydCBieSBOYXRoYW5pZWwgV2VzbGV5IEZpbGFyZG8sIHJl dmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFs5MzIwXSwgWzk1NTBdOiB1bmRlciBXaW5k b3dzLCBtYWtlIHN1cmUgdGhhdCB0aGUgVW5peC5leGVjKg0KICAgIGZ1bmN0aW9ucyBwcm9wZXJs eSBxdW90ZSB0aGVpciBhcmd1bWVudCBsaXN0cy4gKFhhdmllciBMZXJveSwgcmVwb3J0DQogICAg YnkgQW5kcsOpIE1hcm9uZXplLCByZXZpZXcgYnkgTmljb2zDoXMgT2plZGEgQsOkciBhbmQgRGF2 aWQgQWxsc29wcCkNCg0KICDigKIgWzk0OTBdLCBbOTUwNV06IGVuc3VyZSBwcm9wZXIgcm91bmRp bmcgb2YgZmlsZSB0aW1lcyByZXR1cm5lZCBieQ0KICAgIFVuaXguc3RhdCwgVW5peC5sc3RhdCwg VW5peC5mc3RhdC4gKFhhdmllciBMZXJveSBhbmQgR3VpbGxhdW1lDQogICAgTWVscXVpb25kLCBy ZXBvcnQgYnkgRGF2aWQgQnJvd24sIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIgYW5kDQogICAg RGF2aWQgQWxsc29wcCkNCg0KICDigKIgWzg2NzZdLCBbOTU5NF06IHR1cm4gZGVidWdnZXIgb2Zm IGluIHByb2dyYW1zIGxhdW5jaGVkIGJ5IHRoZQ0KICAgIHByb2dyYW0gYmVpbmcgZGVidWdnZWQg KFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IE1pY2hhZWwgU29lZ3Ryb3AsDQogICAgcmV2aWV3IGJ5 IEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgWzk1NTJdOiByZXN0b3JlIG9jYW1sb3B0cCBidWls ZCBhbmQgaW5zdGFsbGF0aW9uIChGbG9yaWFuIEFuZ2VsZXR0aSwNCiAgICByZXZpZXcgYnkgRGF2 aWQgQWxsc29wcCBhbmQgWGF2aWVyIExlcm95KQ0KDQogIOKAoiBbNzcwOF0sIFs5NTgwXTogRW5z dXJlIFN0ZGxpYiBkb2N1bWVudGF0aW9uIGluZGV4IHJlZmVycyB0bw0KICAgIFN0ZGxpYi4gKFN0 ZXBoZW4gRG9sYW4sIHJldmlldyBieSBGbG9yaWFuIEFuZ2VsZXR0aSwgcmVwb3J0IGJ5DQogICAg SGFubmVzIE1laG5lcnQpDQoNCiAg4oCiIFs5MTg5XSwgWzkyODFdOiBmaXggYSBjb25mbGljdCB3 aXRoIEdlbnRvbyBidWlsZCBzeXN0ZW0gYnkgcmVtb3ZpbmcNCiAgICBhbiBvbmUtbGV0dGVyIE1h a2VmaWxlIHZhcmlhYmxlLiAoRmxvcmlhbiBBbmdlbGV0dGksIHJlcG9ydCBieSBSYWxwaA0KICAg IFNlaWNodGVyLCByZXZpZXcgYnkgRGF2aWQgQWxsc29wcCBhbmQgRGFtaWVuIERvbGlnZXopDQoN CiAgVGhlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gT1BBTSBzd2l0Y2ggd2l0aCBv bmUgb2YgdGhlDQogIGZvbGxvd2luZyBjb21tYW5kcw0KICDilIzilIDilIDilIDilIANCiAg4pSC IG9wYW0gc3dpdGNoIGNyZWF0ZSBvY2FtbC12YXJpYW50cy40LjExLjArYWxwaGEyIC0tcmVwb3Np dG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJl dGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIG9yDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCthbHBo YTIrPFZBUklBTlQ+IC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSA DQogIHdoZXJlIDxWQVJJQU5UPiBpcyByZXBsYWNlZCB3aXRoIG9uZSBvZiB0aGVzZTogYWZsLCBm bGFtYmRhLCBmcCwNCiAgZnArZmxhbWJkYQ0KDQogIFRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIGFs cGhhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJlc3NlczoNCg0KICDigKIgW2h0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEuMCthbHBoYTIudGFyLmd6XQ0K ICDigKIgW2h0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC00LjExL29jYW1s LTQuMTEuMCthbHBoYTIudGFyLmd6XQ0KDQogIElmIHlvdSBmaW5kIGFueSBidWdzLCBwbGVhc2Ug cmVwb3J0IHRoZW0gaGVyZToNCiAgIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzXQ0KDQoNCls2NjczXSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzY2 NzMNCg0KWzExMzJdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEzMg0K DQpbKzk2MTddIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTYxNw0KDQpb NzM2NF0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy83MzY0DQoNClsyMTg4 XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzIxODgNCg0KWys5NTkyXSBo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1OTINCg0KWys5NjA5XSBodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk2MDkNCg0KWzc4MTddIGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvNzgxNw0KDQpbOTU0Nl0gaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NTQ2DQoNCls5NTQ5XSBodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1NDkNCg0KWzk1NTddIGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvOTU1Nw0KDQpbOTMyMF0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlcy85MzIwDQoNCls5NTUwXSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzk1NTANCg0KWzk0OTBdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvOTQ5MA0KDQpbOTUwNV0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy85NTA1DQoNCls4Njc2XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzg2 NzYNCg0KWzk1OTRdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTU5NA0K DQpbOTU1Ml0gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NTUyDQoNCls3 NzA4XSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzc3MDgNCg0KWzk1ODBd IGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTU4MA0KDQpbOTE4OV0gaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85MTg5DQoNCls5MjgxXSBodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzkyODENCg0KDQpPQ2FtbCBXb3Jrc2hvcCAy MDIwOiBDYWxsIGZvciBWb2x1bnRlZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjAtY2FsbC1mb3Itdm9sdW50 ZWVycy81OTEzLzFdDQoNCg0KSXZhbiBHb3RvdmNoaXRzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgVGhlIE9DYW1sIFdvcmtzaG9wIHdpbGwgYmUgaGVsZCBpbiB0aGUgdmlydHVh bCBmb3JtYXQgdGhpcyB5ZWFyLCB3aGljaA0KICBwb3NlcyBuZXcgY2hhbGxlbmdlcyBhbmQgcmVx dWlyZXMgcGVvcGxlIHdpdGggc3BlY2lhbCB0YWxlbnRzIGFuZA0KICB0cmFpbmluZy4gVGhlIE9y Z2FuaXppbmcgQ29tbWl0dGVlIGlzIHNlZWtpbmcgZm9yIG1lbWJlcnMgd2hvIHdpbGwNCiAgdm9s dW50ZWVyIHRvIGZpbGwgb25lIChvciBtb3JlKSBvZiB0aGUgZm9sbG93aW5nIHJvbGVzOg0KDQog IDEuIEFWIEVkaXRvcg0KICAyLiBTZXNzaW9uIEhvc3QNCiAgMy4gVHJhbnNjcmliZXJzL0ludGVy cHJldGVyDQogIDQuIENvbnRlbnQgTWFuYWdlcg0KICA1LiBBY2Nlc3NpYmlsaXR5IENoYWlyDQoN CiAgVGhlIHJvbGVzIGFyZSBkZXNjcmliZWQgaW4gZGV0YWlscyBiZWxvdy4gV2UgYXJlIGFza2lu ZyBwcm9zcGVjdGl2ZQ0KICBPcmdhbml6aW5nIENvbW1pdHRlZSBtZW1iZXJzIHRvIGNvbnRhY3Qg dGhlIE9yZ2FuaXppbmcgQ29tbWl0dGVlIGNoYWlyDQogIChbaXZnQGllZWUub3JnXShbbWFpbHRv Oml2Z0BpZWVlLm9yZ10pKSwgaW5kaWNhdGluZyB3aGljaCByb2xlKHMpIHRoZXkNCiAgYXJlIHJl YWR5IHRvIHRha2UuDQoNCg0KW0FWIEVkaXRvcl0NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIEFWIChBdWRpby9WaWRlbykgZWRpdG9ycyBhcmUgcmVzcG9uc2libGUgZm9y IHByZXZpZXdpbmcgdGhlDQogIHByZXNlbnRhdGlvbnMgYW5kIHByb3ZpZGluZyBoZWxwIGFuZCBm ZWVkYmFjayB0byB0aGUgYXV0aG9ycy4gSWRlYWxseQ0KICB3ZSB0YXJnZXQgZm9yIG9uZSBlZGl0 b3IgcGVyIHRhbGsuDQoNCg0KW0FWIEVkaXRvcl0gaHR0cHM6Ly9pY2ZwMjAuc2lncGxhbi5vcmcv aG9tZS9vY2FtbC0yMDIwI2F2LWVkaXRvcg0KDQril4ogW0R1dGllc10NCg0KICDigKIgUHJldmll dyBhbmQgKGlmIG5lY2Vzc2FyeSkgcG9zdC1wcm9jZXNzIG9yIChhc2sgdGhlIGF1dGhvciB0byBz aG9vdA0KICAgIGFnYWluKSB0aGUgcHJlLXJlY29yZGVkIHZpZGVvcy4NCiAg4oCiIEFkdmlzZSBh dXRob3JzIGFuZCBoZWxwIGluIGNob2ljZSBvZiBzb2Z0d2FyZSBhbmQgaGFyZHdhcmUsIHRlYWNo DQogICAgaG93IHRvIHNldCB1cCB0aGUgY2FtZXJhLCBsaWdodCwgbWFrZSBzdXJlIHRoYXQgdGhl IGF1ZGlvIGlzIG9mIGdvb2QNCiAgICBxdWFsaXR5IGFuZCwgaW4gZ2VuZXJhbCwgY2hhbm5lbCBv dXIgcXVhbGl0eSBndWlkZWxpbmVzLg0KICDigKIgRW5zdXJlIHRoYXQgYWxsIHZpZGVvcyBhcmUg b2YgdGhlIHNhbWUgcXVhbGl0eSwgdGhlIGF1ZGlvIGxldmVscyBhcmUNCiAgICB0aGUgc2FtZSwg YW5kIHRoYXQgZXZlcnl0aGluZyBpcyBsb3VkIGFuZCBjbGVhci4NCg0KDQogIFtEdXRpZXNdIGh0 dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNkdXRpZXMNCg0KDQpbU2Vz c2lvbiBIb3N0c10NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFNlc3Npb24gaG9zdHMgd2lsbCBhc3Npc3Qgc2Vzc2lvbiBjaGFpcnMgaW4gc3RyZWFt aW5nIHRoZSBwcmUtcmVjb3JkZWQNCiAgdmlkZW9zIGFzIHdlbGwgYXMgaGVscGluZyBhbmQgbW9k ZXJhdGluZyB0aGUgUSZBIHNlc3Npb25zIGFuZCB0aGUNCiAgcGFuZWwgc2Vzc2lvbi4gVGhleSB3 aWxsIGFsc28gYmUgcmVzcG9uc2libGUgZm9yIHNlY3VyaXR5IGFuZCBiZSByZWFkeQ0KICB0byBy ZWFjdCB0byBwb3RlbnRpYWwgdGhyZWF0cyBhbmQgd3Jvbmdkb2Vycy4gU2luY2Ugd2Ugd2lsbCBi cm9hZGNhc3QNCiAgc2Vzc2lvbnMgaW4gc2V2ZXJhbCB0aW1lIHpvbmVzIHdlIG5lZWQgc2V2ZXJh bCBob3N0cyBmb3IgZWFjaCBzZXNzaW9uLg0KDQoNCltTZXNzaW9uIEhvc3RzXSBodHRwczovL2lj ZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjc2Vzc2lvbi1ob3N0cw0KDQril4ogW0R1 dGllc10NCg0KICDigKIgTW9kZXJhdGluZyB0aGUgdGV4dCBjaGF0cw0KICDigKIgQ29udHJvbGxp bmcgbWljcm9waG9uZXMgaW4gdGhlIHZpZGVvLWNvbmZlcmVuY2luZw0KICDigKIgV2F0Y2hpbmcg Zm9yIHRoZSB0aW1lDQogIOKAoiBQZXJmb3JtaW5nIHNvdW5kIGNoZWNrcw0KICDigKIgV2VsY29t aW5nIGFuZCBvdGhlcndpc2UgZ3VpZGluZyBwYXJ0aWNpcGFudHMNCg0KDQogIFtEdXRpZXNdIGh0 dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNkdXRpZXMNCg0KDQpbVHJh bnNjcmliZXJzIC8gSW50ZXJwcmV0ZXJzXQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgV2Ugd291bGQgbGlrZSB0byBoYXZlIGF0IGxlYXN0IEVuZ2xpc2ggdHJhbnNjcmlwdGlv bnMgZm9yIGVhY2ggdGFsaw0KICBhbmQgdHJhbnNsYXRpb25zIHRvIG90aGVyIGxhbmd1YWdlcyBh cmUgdmVyeSB3ZWxjb21lLiBUcmFuc2NyaXB0aW9ucw0KICBlbmFibGUgYWNjZXNzaWJpbGl0eSBh cyB3ZWxsIGFzIHBvdGVudGlhbGx5IGluY3JlYXNlIHRoZSBhdWRpZW5jZSBhbmQNCiAgcHVibGlj aXR5IGFzIHRoZXkgY291bGQgYmUgaW5kZXhlZCBieSB0aGUgc2VhcmNoIGVuZ2luZXMuDQoNCg0K W1RyYW5zY3JpYmVycyAvIEludGVycHJldGVyc10NCmh0dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3Jn L2hvbWUvb2NhbWwtMjAyMCN0cmFuc2NyaWJlcnMtaW50ZXJwcmV0ZXJzDQoNCuKXiiBbRHV0aWVz XQ0KDQogIOKAoiBDcmVhdGUgdHJhbnNjcmlwdGlvbnMgZm9yIHZpZGVvcywgcG90ZW50aWFsbHkg aW4gb3RoZXIgbGFuZ3VhZ2VzLg0KDQoNCiAgW0R1dGllc10gaHR0cHM6Ly9pY2ZwMjAuc2lncGxh bi5vcmcvaG9tZS9vY2FtbC0yMDIwI2R1dGllcw0KDQoNCltDb250ZW50IE1hbmFnZXJdDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUg Y29udGVudCBtYW5hZ2VyIHdpbGwgYmUgcmVzcG9uc2libGUgZm9yIG1haW50YWluaW5nIHRoZSB3 ZWINCiAgcHJlc2VuY2Ugb2YgdGhlIGNvbmZlcmVuY2Ugb24gW2h0dHBzOi8vb2NhbWwub3JnL10u IFdlIHBsYW4gdG8gaGF2ZQ0KICBhbGwgdmlkZW9zIGF2YWlsYWJsZSwgYXMgd2VsbCBhcyBtYWlu dGFpbiBhIHBhZ2UgZm9yIGVhY2ggc3VibWl0dGVkDQogIHdvcmsuDQoNCg0KW0NvbnRlbnQgTWFu YWdlcl0NCmh0dHBzOi8vaWNmcDIwLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMCNjb250ZW50 LW1hbmFnZXINCg0KDQpbQWNjZXNzaWJpbGl0eSBDaGFpcl0NCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIGFyZSBz dHJpdmluZyB0byBtYWtlIHRoZSBjb25mZXJlbmNlIGFjY2Vzc2libGUgdG8gZXZlcnlvbmUgYW5k IHdlDQogIGFyZSBsb29raW5nIGZvciB2b2x1bnRlZXJzIHdobyBoYXZlIGV4cGVyaWVuY2UgaW4g b25saW5lDQogIGFjY2Vzc2liaWxpdHkuDQoNCg0KW0FjY2Vzc2liaWxpdHkgQ2hhaXJdDQpodHRw czovL2ljZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjYWNjZXNzaWJpbGl0eS1jaGFp cg0KDQril4ogW0R1dGllc10NCg0KICDigKIgSGVscGluZyB3aXRoIHRoZSBzZWxlY3Rpb24gb2Yg YWNjZXNzaWJsZSBwbGF0Zm9ybXMgYW5kIHRvb2xzLg0KICDigKIgV29ya2luZyB3aXRoIGF0dGVu ZGVlcyB0byBlbnN1cmUgdGhlIG5lY2Vzc2FyeSBhY2Nlc3Mgc2VydmljZXMgYXJlDQogICAgaW5j bHVkZWQuDQogIOKAoiBFc3RhYmxpc2hpbmcgYmVzdCBwcmFjdGljZXMgZm9yIHByZXBhcmluZyBh bmQgcnVubmluZyBhY2Nlc3NpYmxlDQogICAgc2Vzc2lvbnMuDQoNCg0KICBbRHV0aWVzXSBodHRw czovL2ljZnAyMC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjAjZHV0aWVzDQoNCg0KSW50cm9k dWN0aW9uIHRvIEx3dA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9pbnRyb2R1Y3Rpb24tdG8tbHd0LzU5NDAvMV0NCg0KDQpSYXBoYcOrbCBQcm91c3QgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHB1Ymxpc2hlZA0KICBbaHR0cHM6Ly9yYXBo YWVsLXByb3VzdC5naXRodWIuaW8vY29kZS9sd3QtcGFydC0xLmh0bWxdLCBhIDItcGFydA0KICBp bnRyb2R1Y3Rpb24gdG8gTHd0Lg0KDQogIFRoZSBtYWluIGFpbSBvZiB0aGUgaW50cm9kdWN0aW9u IGlzIHRvIGdpdmUgYSBnb29kIG1lbnRhbCBtb2RlbCBvZg0KICB3aGF0IHByb21pc2VzIGFyZSwg aG93IHRoZXkgYmVoYXZlIGFuZCBob3cgdG8gdXNlIHRoZW0uIEl0IGFzc3VtZXMNCiAgYmFzaWMg ZmFtaWxpYXJpdHkgd2l0aCBPQ2FtbC4NCg0KICBEb24ndCBoZXNpdGF0ZSB0byBhc2sgcXVlc3Rp b25zIG9yIHNoYXJlIGZlZWRiYWNrLg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNv cmUgcGxhbmV0IGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhl cmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQ bGFuZXRdLg0KDQogIOKAoiBbVXNpbmcgQVNDSUkgd2F2ZWZvcm1zIHRvIHRlc3QgaGFyZHdhcmUg ZGVzaWduc10NCg0KDQpbT0NhbWwgUGxhbmV0XSBodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9w bGFuZXQvDQoNCltVc2luZyBBU0NJSSB3YXZlZm9ybXMgdG8gdGVzdCBoYXJkd2FyZSBkZXNpZ25z XQ0KaHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3VzaW5nLWFzY2lpLXdhdmVmb3Jtcy10by10 ZXN0LWhhcmR3YXJlLWRlc2lnbnMvDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVz c2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoNClt0aGUg YXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzDQoN CltvbmxpbmVdIGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWts eS8NCg0KW0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 02 to 09, 2020.

Multicore Update: April 2020, with a = preprint paper

Continuing this thread, Daniel B=C3=BCnzli asked and = KC Sivaramakrishnan replied

One thing that I didn=E2=80=99t get from the paper is how exactly Co= ncurMinor breaks the current FFI and the impact it would have on the existing eco-system, on a scale from =E2=80=9Cit affect a= ll projects=E2=80=9D to =E2=80=9Conly people doing that fancy thing=E2=80=9D :=E2=80=93) ?

All the projects that use the C API. The details are here: https://github.com/ocaml-multicore/ocaml-multicore/wiki/C-API-change= s

At the end of the paper it seems you make the point that ParMinor is the solution to go with for the time being. Does this means you are going to leave behind the work done on ConcurMinor or do you intend to continue to maintain it ?

We don't intend to maintain it. It is quite a bit of work to maintain and p= ort the changes across two different GCs. ParMinor GC is now at 4.11 branch point (the default multicore= compiler is 4.10 + ParMinor now). The ConcMinor is at 4.06.1.

Given that ConcMinor breaks the C API, the ecosystem would hav= e to be fixed for ConcMinor to be useful. The code changes are indeed intricate; the differences are not just in the minor GC,= but the compilers internal use of the C API. It will be quite a bit of work to keep both GCs in the same source dis= tribution.

Guillaume Munch-Maccagnoni then said

Given that ConcMinor breaks the C API, the ecosystem would hav= e to be fixed for ConcMinor to be useful.

I do not think this is necessarily true.

Here is why I think so, but be warned that this is preliminary as I do not = have time to explore this idea further on my own at the moment.

State in Rust

Breaking the C API is a consequence of deciding that all single-threaded sh= ared mutable state must assume they are also shared between threads. So a new read barrier is used to promote value= s when read from another thread. But for data types that were correct up to now, users must also be careful to avoid= races from now on… for instance by avoiding sharing values of such types between domains.

One lesson of Rust is that there are different kinds of mutable state, for = different usages, with different means to achieve thread-safety.

The closest there is to current OCaml's mutable is the notion = of single-threaded multiple-writers mutable state (Cell). It is made thread-saf= e in Rust by statically preventing values containing Cell from= crossing thread boundaries (by virtue of not having the Sen= d trait). The same restriction is used to make some data stru= ctures more efficient by avoiding the cost of synchronisation (cf. the reference-c= ounting pointer Rc vs. the atomic reference-counting pointer Arc).

This is not enough by itself, and Rust offers other kinds of state for comm= unicating and sharing values between threads.

UnsafeCell like Ocaml multico= re's mutable (though yours is safe thanks to the work on the m= emory model): it has almost no restriction and can be sent across domains, but the user is likew= ise told to =E2=80=9Cavoid data races=E2=80=9D. It is rarely used alone, but together with type abstraction it can be used to pro= gram safe concurrent data structures.

Lastly, the default notion of state in Rust is linear state, which can be s= ent freely across threads. Thread-safety is ensured by restricting aliasing using the ownership and borrowing discip= line.

A backwards-compatible concurrent collector?

If I had to imagine a backwards-compatible OCaml with static control of int= erference =C3=A0 la Rust based on ConcMinor, it would distinguish the three kinds of state (concretely with other keywor= ds in addition to mutable). mutable would keep its current meaning of single-domain, multiple-writers state and= not require a read barrier, and in particular preserve the API. (I count systhreads as single-threaded for thi= s purpose, since here it means "sharing the same minor heap".)

Programs could progressively transition to other kinds of state when parall= elising the program. Concretely, a data structure like Stack.t, instead of becoming racy, would keep i= ts current meaning, but users could replace it with a linear stack or a concurrent stack, two data structures distinct from the f= irst one, when parallelizing their programs.

So how could this fit with the current plans? It is not entirely clear to m= e. If people start to rely on parallelism in an unstructured way (e.g. no clear distinction between different kinds o= f data types arising from different ways of ensuring thread-safety) then one will also lose the ability to retrofit = ConcMinor in a backwards-compatible manner (by losing the information that the current mutable API= is single-threaded). The API breakage of ConcMinor which might only be virtual right now (if I trust this preliminary, not ful= ly-explored idea) will become real. (Further difficulties arise with the emulation of the Thread l= ibrary with domains, but this could be changed later.)

But if users are provided in advance with a general direction for a model o= f control of interference this might happen differently. And eventually having such a model is desirable in any = case, as it helps parallelizing programs (for instance the Firefox people reported that they had attempted and faile= d twice to parallelise the CSS engine in C++ before succeeding with Rust). Furthermore, in an imaginary retrofitting= of ConcMinor, one could imagine enforcing something like the Send trait at the level of the re= ad barrier until there is a better way (there would be two kinds of barriers, one of which would raise an exception if a state = happened to be incorrectly shared across domains, and not be required in the FFI).

I find ConcMinor interesting from a systems programming perspe= ctive compared to the stop-the-world collector because it could (I hope) offer possibilities such as having a low-latency = domain communicating with a higher-latency domain. Moreover the performance cost of the read barrier might be lower in= this scheme if it could be removed for all but the concurrent data structures.

BAP 2.1.0 Release

Ivan Gotovchits announced

The Carnegie Mellon University Binary Analysis Platform (CMU BAP) is a suite of utilitie= s and libraries that enables analysis of programs that are represented as machine code (aka bina= ries). CMU BAP is written in OCaml and uses plugin-based architecture to enable extensibility. We also have a doma= in-specific language, called Primus Lisp, that we use to write analysis, specify verification conditions, interact wi= th the built-in SMT solver, and model the semantics of machine instructions and functions.

The 2.1.0 Release is very rich in new features but the most prominen= t addition is the new symbolic executor mode for the Primus framework. We also significantly updated the Primus fra= mework, integrated it with our new Knowledge Base, which was introduced in the BAP 2.0 release; we made our in= terpreter much faster; we added the systems and components facilities, inspired by Common Lisp; and we implemen= ted a gradual type checker for Primus Lisp with type inference. We also added an ability to represent machine instruct= ions as intrinsic functions so now it is possible to express their semantics using Primus Lisp since we added IEEE75= 4 primitives to the Lisp interpreter.

As usual, we upgraded BAP to the newer versions of the Core library and OCa= ml (we now support OCaml versions from 4.07 to 4.09). We also significantly improved our build times and added an = optional omake backend, which we are using in-house.

>>From the user perspective, one of the key features of BAP as an analysis pl= atform is that you can run BAP on binaries that you can't run otherwise, either because they need special hardware or = software, or need to interact with the outside world. In the past couple of months, we have run BAP on various fir= mware and found numerous zero-day vulnerabilities, particular, we were able to find critical vulnerabilities = in the VxWorks operating system that runs on, potentially, billions of devices including mission-critical and militar= y appliances.

As always, questions, suggestions, and opinions are very welcome!

Migrating an Async project to Lwt, a = short primer

Michael Bacarella announced

Consider this a post where I think aloud about my experience migrating an A= sync project to Lwt. I've spent about a weekend doing such a thing, and if, in the process of talking about it here= I can save a few people an hour or two (or perhaps inspire confidence to take such a project on in the first place= ) then it will have been worthwhile.

This wouldn't be a complete post if I didn't also mention @dkim's translation of Real World OCaml's Asyn= c examples to Lwt

This was born out of a previous effort where I tried to mix Lwt an= d Async in the same project. This didn't go so well, so I tried converting the whole thing to Lwt, and it turns out adapting to Lwt i= f you're an Async person is actually much easier than I thought it would be.

Basics

Both libraries involve promises/futures. Async calls its promises Deferred.t, whereas in Lwt they're called Lwt.t.

In Async you start your program by saying never_returns (Scheduler.go= ()) or Command.async_spec after you set up your initial Deferred.t.

In Lwt you say Lwt_main.run on a top-level Lwt.t = argument. Note you can re-run Lwt_main.run in a single program as many times as you w= ant, but perhaps you shouldn't run multiple Lwt_main.run in parallel.

There's an easy correspondence between basic operators.

Async Lwt
Deferred.bind Lwt.bind
Deferred.return Lwt.return
>>=3D >>=3D
Deferred.map Lwt.map
>>| >|=3D
Deferred.don't_wait_for Lwt.async
In_thread.run Lwt_preemptive.detach

Starvation worries

The most important difference between Async and Lwt is that fulfilled pr= omises are acted on immediately, whereas Async kinda punts them to the end of a work queue and runs their thunks lat= er.

A return loop like this starves the rest of Lwt:

open Lwt.Infix

let main () =3D
  let rec loop () =3D
    Lwt.return ()
    >>=3D fun () ->
    loop ()
  in
  Lwt.async (loop ());
  Lwt_io.printlf "this line never prints!"
;;

let () =3D Lwt_main.run main ;;

whereas the corresponding Async loop does not starve:

open! Async

let main () =3D
  let rec loop () =3D
    Deferred.return ()
    >>=3D fun () ->
    loop ()
  in
  don't_wait_for (loop ());
  printf "this line does print!\n";
  return ()
;;

let () =3D
  let cmd =3D Command=
.async_spec ~summary:"" Command.S=
pec.empty main in=

  Command.run cmd
;;

Fortunately there's a workaround. You can get something closer to the Async= -style behavior in Lwt by using Lwt.yield () instead of = Lwt.return ().

Spawning threads

>>From time to time you may need to run something in a system thread. In As= ync you say In_thread.run, whereas in Lwt you say Lwt_preemptive.detach. For simple things they're = pretty much interchangeable, but one stumbling point for me was that in Async you can create a named thread and always use that = for the In_thread.run, with multiple simultaneous dispatches to that thread becoming sequenced.

This is really useful for interacting with libraries that aren't so thread = friendly.

Lwt's detach doesn't provide an easy way to do this out of the box, but I t= hink you can still deal with thread unfriendly libraries by using the Lwt_preemptive.run_in_main c= all.

Basically, never exit the detach thread you started to interact with your l= ibrary, and instead have it block on promise that gets filled through run_in_main. In this way you can sequence= your detached Lwt thread similarly to Async.

Happy to explain further if this is unclear.

Other libraries

Async.Unix has a somewhat built-up conception of the UNIX API,= whereas Lwt_main is more a direct mapping of ocaml's Unix= module to promises.

Async Clock.every and Clock.after don't have exac= t analogs, but you can make new versions pretty simply.

Example of a shallow imitation of Async Clock.every

let every span f =3D
  Lwt.async (fun () ->
    let span =3D Time=
.Span.to_sec span in
    let rec loop () =3D
      f ();
      Lwt_unix.sleep span
      >>=3D fun () ->
      loop ()
    in
    loop ())
;;

Open questions

I haven't sorted out a good Lwt substitute that's as comfortable as Async P= ipe yet. Though some combination of Lwt_stream, Lwt_sequence and lwt-pipe might fit the bill. If= you just happen to know already feel free to cluephone.

Closing remarks

This is basically everything? I'm almost suspicious that I'm not having mo= re problems, but will happily accept grace when it arises.

Rapha=C3=ABl Proust then said

I haven=E2=80=99t sorted out a good Lwt substitute that=E2=80=99s as comfor= table as Async Pipe yet. Though some combination of Lwt_stream, Lwt_sequence and lwt-pipe might fit the bill. If y= ou just happen to know already feel free to cluephone.

The Tezos project has a pipe-like module: https://gitlab.com/tezo= s/tezos/-/blob/master/src/lib_stdlib/lwt_pipe.mli It hasn't been released as a standalone library (yet) but it is released as= part of the tezos-stdlib package.

I haven't used Async's pipe, so I don't know how close of a match it is.

jose 0.4.0

Ulrik Strid announced

A new release of JOSE has been published to opam

The following changes has been made

  • RFC7638: Implement thumbprints @undu
  • Make kid optional in the header and jwk to align better with the spec, = this is a breaking change

I have started dog fooding the library for a OpenID Connect client which ho= pefully will help with the design going forward.

OCaml 4.11.0, second alpha release

octachron announced

A new alpha version of OCaml 4.11.0 has been published. Compared to the first alpha version, this version contains the following ne= w bug fixes:

  • additional fixes 6673, 11= 32, +9617: R= elax the handling of explicit polymorphic types (Leo White, review by Jacqu= es Garrigue and Gabriel Scherer)
  • additional fixes 7364, 21= 88, +9592, <= a href=3D"https://github.com/ocaml/ocaml/issues/9609">+9609: improvemen= t of the unboxability check for types with a single constructor. Mutually-r= ecursive type declarations can now contain unboxed types. This is based on = the paper https://arxiv.org/ab= s/1811.02300
  • 7817, 9546: Unsound inclusio= n check for polymorphic variant (Jacques Garrigue, report by Mikhail Mandry= kin, review by Gabriel Scherer)
  • 9549, 9557: Make -flarge-toc= the default for PowerPC and introduce -fsmall-toc to enable the previous b= ehaviour. (David Allsopp, report by Nathaniel Wesley Filardo, review by Xav= ier Leroy)
  • 9320, 9550: under Windows, m= ake sure that the Unix.exec* functions properly quote their argument lists.= (Xavier Leroy, report by Andr=C3=A9 Maroneze, review by Nicol=C3=A1s Ojeda= B=C3=A4r and David Allsopp)
  • 9490, 9505: ensure proper ro= unding of file times returned by Unix.stat, Unix.lstat, Unix.fstat. (Xavier= Leroy and Guillaume Melquiond, report by David Brown, review by Gabriel Sc= herer and David Allsopp)
  • 8676, 9594: turn debugger of= f in programs launched by the program being debugged (Xavier Leroy, report = by Michael Soegtrop, review by Gabriel Scherer)
  • 9552: restor= e ocamloptp build and installation (Florian Angeletti, review by David Alls= opp and Xavier Leroy)
  • 7708, 9580: Ensure Stdlib do= cumentation index refers to Stdlib. (Stephen Dolan, review by Florian Angel= etti, report by Hannes Mehnert)
  • 9189, 9281: fix a conflict w= ith Gentoo build system by removing an one-letter Makefile variable. (Flori= an Angeletti, report by Ralph Seichter, review by David Allsopp and Damien = Doligez)

The compiler can be installed as an OPAM switch with one of the following c= ommands

opam switch create ocaml-variants.4.11.0+alpha=
2 --repositories=3Ddefault,beta=3Dgi=
t+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+alpha=
2+<VARIANT> --repositories=3Ddefault,=
beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where <VARIANT> is replaced with one of these: afl, flambda, fp, fp+f= lambda

The source code for the alpha is also available at these addresses:

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

OCaml Workshop 2020: Call for Volunte= ers

Ivan Gotovchits announced

The OCaml Workshop will be held in the virtual format this year, which pose= s new challenges and requires people with special talents and training. The Organizing Committee is seeking for membe= rs who will volunteer to fill one (or more) of the following roles:

  1. AV Editor
  2. Session Host
  3. Transcribers/Interpreter
  4. Content Manager
  5. Accessibility Chair

The roles are described in details below. We are asking prospective Organiz= ing Committee members to contact the Organizing Committee chair ([ivg@ieee.org](= mailto:ivg@ieee.org)), indicating which role(s) they are ready to take.

AV Editor

AV (Audio/Video) editors are responsible for previewing the presentations a= nd providing help and feedback to the authors. Ideally we target for one editor per talk.

  • Duties
    • Preview and (if necessary) post-process or (ask the author to shoot aga= in) the pre-recorded videos.
    • Advise authors and help in choice of software and hardware, teach how t= o set up the camera, light, make sure that the audio is of good quality and= , in general, channel our quality guidelines.
    • Ensure that all videos are of the same quality, the audio levels are th= e same, and that everything is loud and clear.

Session Hosts

Session hosts will assist session chairs in streaming the pre-recorded vide= os as well as helping and moderating the Q&A sessions and the panel session. They will also be responsible for s= ecurity and be ready to react to potential threats and wrongdoers. Since we will broadcast sessions in several time zo= nes we need several hosts for each session.

  • Duties
    • Moderating the text chats
    • Controlling microphones in the video-conferencing
    • Watching for the time
    • Performing sound checks
    • Welcoming and otherwise guiding participants

Transcribers / Interpreters

We would like to have at least English transcriptions for each talk and tra= nslations to other languages are very welcome. Transcriptions enable accessibility as well as potentially increas= e the audience and publicity as they could be indexed by the search engines.

  • Duties
    • Create transcriptions for videos, potentially in other languages.

Content Manager

The content manager will be responsible for maintaining the web presence of= the conference on https://ocaml.org/. We plan to have all videos available, as well as maintain a page for each subm= itted work.

Accessibility Chair

We are striving to make the conference accessible to everyone and we are lo= oking for volunteers who have experience in online accessibility.

  • Duties
    • Helping with the selection of accessible platforms and tools.
    • Working with attendees to ensure the necessary access services are incl= uded.
    • Establishing best practices for preparing and running accessible sessio= ns.

Introduction to Lwt

Rapha=C3=ABl Proust announced

I've published https://raphael-proust.github.io/code/lwt-part-1.html, a 2-part i= ntroduction to Lwt.

The main aim of the introduction is to give a good mental model of what pro= mises are, how they behave and how to use them. It assumes basic familiarity with OCaml.

Don't hesitate to ask questions or share feedback.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CC2E8E002A for ; Tue, 16 Jun 2020 10:36:32 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=SZQf=75=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ADdMm0RKN60939wgeF9mcpTZWNBhigK39O0sv0rFi?= =?us-ascii?q?tYgXKfrzrarrMEGX3/hxlliBBdydt6sZzbOJ6+u4BCQp2tWoiDg6aptCVhsI24?= =?us-ascii?q?09vjcLJ4q7M3D9N+PgdCcgHc5PBxdP9nC/NlVJSo6lPwWB6nK94iQPFRrhKAF7?= =?us-ascii?q?Ovr6GpLIj8Swyuu+54Dfbx9HiTagYb5+Ngi6oAfNusUZnYdvKrs6xwfUrHdPZ+?= =?us-ascii?q?lY335jK0iJnxb76Mew/Zpj/DpVtvk86cNOUrj0crohQ7BAAzsoL2465MvwtRne?= =?us-ascii?q?VgSP/WcTUn8XkhVTHQfI6gzxU4rrvSv7sup93zSaPdHzQLspVzmu87tnRRn1gy?= =?us-ascii?q?gAKjA57XrXitRug61HvBKvqRt/w4vOb4GUMvp1Y6fRcNweSGZEWMtdVy9PAoWi?= =?us-ascii?q?b4sOFOoBPP1Xr43jqFAToxq+AhOsC/70yjRVgnP707E23+EnHArb3gIvAsgOvW?= =?us-ascii?q?zUotvrKakcX+O7w6bUwjjYavNaxS3w5ZLUfhw9o/yBW697f8rLyUkoEgPIlkmd?= =?us-ascii?q?qYj/MDOTy+8DrnSU7+plVeKul24ntxx6rz+1yccokIbJgJgZykvY+iV5xYY1JM?= =?us-ascii?q?G4SFJgbN68F5tQsyGbN5doTcw+Q2Fovic6yqQbuZGlZiQKz44nxxHGZvGBboOH?= =?us-ascii?q?7Q7tWvyLLjdkmHJqZqi/hxCq/EWjyODxVdW53VZKoCdLnNTBtnQA2wLT5MaISv?= =?us-ascii?q?Zw4Eev1DeS2w7c9OxJJVw4mbbaJpM8xrM8iocfv0rNECPqmUj7irKdeEsj+uit?= =?us-ascii?q?8evnY7Pmq4eEN4BqlgH+M7guldKnAeQ/NwgOWnaU9f661LL94U31WLJKgeEsna?= =?us-ascii?q?nctJDWP8MbprS2AwNN04Yj7Qy/Dza839gCk3kHNkpJeBWbgIfzPlHOJOj4De24?= =?us-ascii?q?g1i2jDhrwPXGMqXuApXMMnjDkKrhcq1n50FAzwozyMhT551VCrEdIPLzR1T+uM?= =?us-ascii?q?bZDh8+KwC1zefnCNZ81oMGR22AH66ZP7nIvV+P/OIvLPGAZJQJuDnnN/cl5Pnu?= =?us-ascii?q?jWEnll8Hc6mp2ZwXaX6iEvt6JEWZZGLggtkbEWgQuwoxVvXmh0GYXTFPYHayWr?= =?us-ascii?q?ow6Ss9CI27F4fMWIKtjKad0ye8G51afmFGBU2MEHfsc4WIQfAMaDidIsJnjzcK?= =?us-ascii?q?VqChRpc82R2wsAL20adrIvbb9yECu5/vyMJ56uPcmB0q9zF5DN6R33+CQm1qhG?= =?us-ascii?q?8EWjA70LpirUFy1luO17VzjeZCGtxJ/fxJVx83NZ7CwOx+DND/QgfBf9iURFq8?= =?us-ascii?q?WtWmBjUxT9Itw9AQf0l9G9OijhHa3yq3HbAZjbuLBIY78q7E3njxIdhyy2re2a?= =?us-ascii?q?U8kVUrRtFDOXC6iqNw7QTeCZLFn1+Xmqulbagc2TTC9GaHzWqApkFYVwtwXL3Y?= =?us-ascii?q?U34De0Xascz06F7BQLG1B7QqKglMxM6aJ6tSbd3piVVHROv9N9vCY2KxnWawBQ?= =?us-ascii?q?+VxrySdobqfH8d3CrFBUcelwAc53CGORIlBii9o2LeCT1uFU7zY0736uZ+r267?= =?us-ascii?q?TkkowA6UdE1tzb+19xEahPCGTPMTxL0EtD87qzpoBFa9w87WC92YqgV9ZqpcZN?= =?us-ascii?q?c97E5D1WLYrAx9IoetL7tih14bawR4pVni1xRxCoVakMgltmkmzARoKfHQ7FQU?= =?us-ascii?q?PTeH29q4brnILEH24xbpbaPKjBWWmt2J/O1HoKAztFPLuACyClFk8nl2190T1G?= =?us-ascii?q?GTsNGCBwMXVdf1U10r3xl8vbDTJCcno8vf0nh0Ga21qSPZndUzDuo5wxKueMcZ?= =?us-ascii?q?Pb7XOhX1FpgzA8GoYNchm12ocg5MaOlW/ahyJMimcvqaxIazO+JxgD+tjWJG+Z?= =?us-ascii?q?1wlEWW+HwvGabzw58ZzqTAjUO8XDDmgQL+45mqy7ABXikbGy+E8QahBINVYfcp?= =?us-ascii?q?L4MbUCG2JMmm2th1h5jsQmNVslm5CAFfgZP7SV+pd1X4mDZo+wEPu3X+yHmgyD?= =?us-ascii?q?hljzwirqyexTHDheP4e0heYz8ZdCxZlV7pZLOMoZUfVUmsYRIukUL6t0z92q5Q?= =?us-ascii?q?qb85KjXDB0BScHqvIg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BhEwAUhOhefSIeaIFmFgcBAQEBCQESA?= =?us-ascii?q?QUFAYIKAoEhgRgBXVUyLIQkiQGHJYFigg2FOJJeA1AQAQMBBwUYAQwHAQIEAQG?= =?us-ascii?q?BUIIvRQIXgXwCHQYBBTMTAhABAQUBAQECAQMDBAETAQELFAiGCwxCFgGBYgwMA?= =?us-ascii?q?wODIQEYCQQGZSMDFAEGAwIEDQEXARQKFwESFAaDDYJ8BAEKmX2aNhk1dn8zhDo?= =?us-ascii?q?BCwEHQYQNgUANAhOBFgGBUoNchnUmD4FMP4ERghJJB2yBQYEEDAsBAQEBAQGBO?= =?us-ascii?q?QEBVoJegmAEjw0BDSRriXGHQ5I8KAeCXYEGBAuGMHiKN4ZIgnCBFogEhRqNRCG?= =?us-ascii?q?QeoFjhWKCSIVqih+EQ4FAKoF4MxowgngBATIJCVcNkg+BPoEmgXU7gX6DQwM/M?= =?us-ascii?q?wEBAQEzAgYBBwEBAwl1AQEFEwsBjCODJQEB?= X-IPAS-Result: =?us-ascii?q?A0BhEwAUhOhefSIeaIFmFgcBAQEBCQESAQUFAYIKAoEhgRg?= =?us-ascii?q?BXVUyLIQkiQGHJYFigg2FOJJeA1AQAQMBBwUYAQwHAQIEAQGBUIIvRQIXgXwCH?= =?us-ascii?q?QYBBTMTAhABAQUBAQECAQMDBAETAQELFAiGCwxCFgGBYgwMAwODIQEYCQQGZSM?= =?us-ascii?q?DFAEGAwIEDQEXARQKFwESFAaDDYJ8BAEKmX2aNhk1dn8zhDoBCwEHQYQNgUANA?= =?us-ascii?q?hOBFgGBUoNchnUmD4FMP4ERghJJB2yBQYEEDAsBAQEBAQGBOQEBVoJegmAEjw0?= =?us-ascii?q?BDSRriXGHQ5I8KAeCXYEGBAuGMHiKN4ZIgnCBFogEhRqNRCGQeoFjhWKCSIVqi?= =?us-ascii?q?h+EQ4FAKoF4MxowgngBATIJCVcNkg+BPoEmgXU7gX6DQwM/MwEBAQEzAgYBBwE?= =?us-ascii?q?BAwl1AQEFEwsBjCODJQEB?= X-IronPort-AV: E=Sophos;i="5.73,518,1583190000"; d="asc'?scan'208,217";a="454927370" X-MGA-submission: =?us-ascii?q?MDFYTH8QqrHbzjdBym24ma3abT6XSoAOW5xU5r?= =?us-ascii?q?hk5mDpg1jt6W8immNI0agae9vc1xKva8XqpFMzKvN8ZekAdiIVxra+2L?= =?us-ascii?q?PsY55nOQ2hj4OWeSHfLdO2r1X2UX9rzWgTPRknG5ITYrv7m1aMm7/3OM?= =?us-ascii?q?fr/QPZ0dLeR0FKJlvrA4b4jA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Jun 2020 10:36:13 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9144C5649F1; Tue, 16 Jun 2020 10:36:11 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 16 Jun 2020 10:36:10 +0200 Message-ID: <87v9jrpfut.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 16 10:36:12 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=2410B5649F4 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl7ohHoACgkQBA0KO07S 5ccAcQgAwwWcIo+/ICYeuwO6KtX1euoYorzNgUieNbzZl4szlIz4/J3mtRWE+/5o XEFXRTKw1yPbbEIOqcYa32Qbv7dZ75EroHjuke//0GrymWKAXfIGPMtqX7Nb6QuL rz7Ji3wQMyxp82oT95kumuU8Wfxe2tiRy/X4nnuo9Z+EKSLaKL7np4xHUqE1tQ58 ZWSifv3+4sWPnb4wcRB4gIfmydwA15tv6ajRlyO3G+hLTLUlfc/Sqzd7auH4YaED fOGiEwzcnLKtOnYUL0wXPVRZTf6KjkctTV51w1lWn56YmHUi+JCyD7FyhU1VP3t5 v9zWIJHaUZHOpRiLQ3gfQcMtKQgjCg== =B/tn -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAwOSB0byAxNiwNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KRmlyc3QgcmVs ZWFzZSBvZiBtb25vbGl0aA0KU3lsdmFpbiBDb25jaG9uIGpvaW5lZCBPQ2FtbFBybydzIHRlYW0N CkZpcnN0IHJlbGVhc2Ugb2Ygc3RyZWFtaW5nDQpTZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQg QXNlbWlvIGluIFR1bHNhLCBPSw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkZpcnN0 IHJlbGVhc2Ugb2YgbW9ub2xpdGgNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtbW9ub2xp dGgvNTk0Ni8xXQ0KDQoNCkZyYW7Dp29pcyBQb3R0aWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJl bGVhc2Ugb2YgTW9ub2xpdGguDQoNCiAgTW9ub2xpdGggb2ZmZXJzIGZhY2lsaXRpZXMgZm9yIHRl c3RpbmcgYW4gT0NhbWwgbGlicmFyeSAoZm9yIGluc3RhbmNlLA0KICBhIGRhdGEgc3RydWN0dXJl IGltcGxlbWVudGF0aW9uKSBieSBjb21wYXJpbmcgaXQgYWdhaW5zdCBhIHJlZmVyZW5jZQ0KICBp bXBsZW1lbnRhdGlvbi4gIEl0IHVzZXMgYSBmb3JtIG9mIGJsYWNrLWJveCB0ZXN0aW5nLCBhbmQg cmVsaWVzIG9uDQogIGBhZmwtZnV6eicgZm9yIGVmZmljaWVuY3kuDQoNCiAgVGhlIHVzZXIgbXVz dCBkZXNjcmliZSB3aGF0IHR5cGVzIGFuZCBvcGVyYXRpb25zIHRoZSBsaWJyYXJ5DQogIHByb3Zp ZGVzLiBVbmRlciB0aGUgYmVzdCBjaXJjdW1zdGFuY2VzLCB0aGlzIHJlcXVpcmVzIDItMyBsaW5l cyBvZg0KICBjb2RlIHBlciB0eXBlIG9yIG9wZXJhdGlvbi4gIFRoZSB1c2VyIG11c3QgYWxzbyBw cm92aWRlIGEgcmVmZXJlbmNlDQogIGltcGxlbWVudGF0aW9uIG9mIHRoZSBsaWJyYXJ5Lg0KDQog IFRoZW4sIGxpa2UgYSBtb25rZXkgdHlwaW5nIG9uIGEga2V5Ym9hcmQsIE1vbm9saXRoIGF0dGVt cHRzIHRvDQogIGV4ZXJjaXNlIHRoZSBsaWJyYXJ5IGluIGV2ZXJ5IHBvc3NpYmxlIHdheSwgaW4g dGhlIGhvcGUgb2YgZGlzY292ZXJpbmcNCiAgYSBzY2VuYXJpbyB3aGVyZSB0aGUgbGlicmFyeSBi ZWhhdmVzIGluY29ycmVjdGx5LiBJZiBzdWNoIGEgc2NlbmFyaW8NCiAgaXMgZGlzY292ZXJlZCwg aXQgaXMgcHJpbnRlZCBpbiB0aGUgZm9ybSBvZiBhbiBPQ2FtbCBwcm9ncmFtLCBzbyBhcyB0bw0K ICBoZWxwIHRoZSB1c2VyIHJlcHJvZHVjZSB0aGUgcHJvYmxlbS4NCg0KICBBdCB0aGlzIHRpbWUs IGEgdHV0b3JpYWwgaXMgbm90IHlldCBhdmFpbGFibGUuIFRoZXJlIGlzIGhvd2V2ZXIgYW4gQVBJ DQogIGRvY3VtZW50YXRpb24gYW5kIGEgbnVtYmVyIG9mIGRlbW9zLg0KDQogIFJlcG9zaXRvcnk6 IFtodHRwczovL2dpdGxhYi5pbnJpYS5mci9mcG90dGllci9tb25vbGl0aF0NCg0KICBBUEkgRG9j dW1lbnRhdGlvbjoNCiAgICBbaHR0cDovL2NhbWJpdW0uaW5yaWEuZnIvfmZwb3R0aWVyL21vbm9s aXRoL2RvYy9tb25vbGl0aC9Nb25vbGl0aC9pbmRleC5odG1sXQ0KDQogIEluc3RhbGxhdGlvbjoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxs IG1vbm9saXRoDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClN5bHZhaW4gQ29uY2hvbiBqb2luZWQg T0NhbWxQcm8ncyB0ZWFtDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICBbaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3N5bHZhaW4tY29uY2hvbi1qb2luZWQtb2NhbWxwcm9zLXRlYW0vNTk1Ni8xXQ0KDQoN Ck9DYW1sUHJvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU3lsdmFpbiBDb25jaG9uIGpvaW5lZCBPQ2FtbFBybydz IHRlYW0gYXMgRm9ybWFsIE1ldGhvZHMgQ1NPLiBIZQ0KICBjcmVhdGVkIEFsdC1FcmdvIGFuZCBo YXMgYmVlbiB0ZWFjaGluZyBPQ2FtbCBpbiB1bml2ZXJzaXRpZXMgZm9yIGFib3V0DQogIDIwIHll YXJzLiBIZSBzaGFyZXMgdGhvdWdodHMgb24gaW50ZXJhY3Rpb25zIGJldHdlZW4gaW5kdXN0cnkg YW5kDQogIHJlc2VhcmNoIGxhYnMsIGFuZCBoaXMgdmlzaW9uIG9mIEZvcm1hbCBtZXRob2RzIGFu ZCBPQ2FtbCBhcyBsYW5ndWFnZQ0KICBmb3IgdGhlIGluZHVzdHJ5LiBSZWFkIGhpcyBpbnRlcnZp ZXcgb24gb3VyIGJsb2c6DQogIFtodHRwczovL3d3dy5vY2FtbHByby5jb20vMjAyMC8wNi8wNS9p bnRlcnZpZXctc3lsdmFpbi1jb25jaG9uLWNzby1vbi1mb3JtYWwtbWV0aG9kcy9dDQoNCg0KRmly c3QgcmVsZWFzZSBvZiBzdHJlYW1pbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIFtodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2Yt c3RyZWFtaW5nLzU5NjEvMV0NCg0KDQpSaXpvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3Vu Y2UgdGhlIGZpcnN0IHB1YmxpYyByZWxlYXNlIG9mIGBzdHJlYW1pbmcnDQogIOKAkyBhIGxpYnJh cnkgZm9yIGJ1aWxkaW5nIGVmZmljaWVudCwgaW5jcmVtZW50YWwgZGF0YSBwcm9jZXNzaW5nDQog IHBpcGVsaW5lcyB0aGF0IGNvbXBvc2UgYW5kIGRvbid0IGxlYWsgcmVzb3VyY2VzLg0KDQogIEkg YnVpbHQgc3RyZWFtaW5nIGFzIGEgcmVzdWx0IG9mIG1hbnkgZXhwZXJpbWVudHMgd2l0aCBkaWZm ZXJlbnQNCiAgc3RyZWFtaW5nIGFuZCBpdGVyYXRpb24gbW9kZWxzIGZvciBPQ2FtbC4gVGhlcmUg YXJlIG11bHRpcGxlIHBhY2thZ2VzDQogIG9uIE9QQU0gdGhhdCBzaGFyZSBzb21lIG9mIHRoZSBn b2FscyBvZiBgc3RyZWFtaW5nJyAod2UgZXZlbiBoYXZlDQogIGBTdGRsaWIuU2VxJyBub3chKSwg YnV0IG5vbmUgb2YgdGhlbSBjb21iaW5lICgxKSBleGNlbGxlbnQNCiAgcGVyZm9ybWFuY2UsICgy KSBzYWZlIHJlc291cmNlIGhhbmRsaW5nIGFuZCAoMykgcHVyZSBmdW5jdGlvbmFsIHN0eWxlDQog IGZvciBjb21iaW5hdG9ycy4gIFN0cmVhbWluZyBzb2x2ZXMgdGhlc2UgcHJvYmxlbXMgYnkgaW1w bGVtZW50aW5nDQogIHRocmVlIGJhc2ljIGFuZCBpbmRlcGVuZGVudCBtb2RlbHM6IF9zb3VyY2Vz XywgX3NpbmtzXyBhbmQgX2Zsb3dzXyDigJMNCiAgdGhleSByZXByZXNlbnRzIGRpZmZlcmVudCBw YXJ0cyBvZiB0aGUgcGlwZWxpbmUgdGhhdCBjb3JyZXNwb25kIHRvDQogIHByb2R1Y2luZywgY29u c3VtaW5nIGFuZCB0cmFuc2Zvcm1pbmcgZWxlbWVudHMuICBUaGVzZSBtb2RlbHMgY2FuIGJlDQog IGRlZmluZWQgYW5kIGNvbXBvc2VkIGluZGVwZW5kZW50bHkgdG8gcHJvZHVjZSByZXVzYWJsZSAi c3RyZWFtaW5nDQogIGJsb2NrcyIuDQoNCiAgVGhlIGxpYnJhcnkgZGVmaW5lcyBhIGNlbnRyYWwg YFN0cmVhbScgbW9kZWwgdGhhdCByZWxpZXMgb24gc291cmNlcywNCiAgc2lua3MgYW5kIGZsb3dz LiBUaGlzIG1vZGVsIGlzIGEgcHVzaC1iYXNlZCBpdGVyYXRvciB3aXRoIHBlcmZvcm1hbmNlDQog IGNoYXJhY3RlcmlzdGljcyBzaW1pbGFyIHRvIHRoZSBgaXRlcicgaXRlcmF0b3IsIHdoaWNoIGhh cyB0eXBlIGAoJ2EgLT4NCiAgdW5pdCkgLT4gdW5pdCcsIGFuZCBpcyBrbm93biBmb3IgYmVpbmcg dmVyeSBlZmZpY2llbnQuIEJ1dCB1bmxpa2UNCiAgYGl0ZXInLCBpdCBoYXMgYSBwdXJlIGZ1bmN0 aW9uYWwgY29yZSAobm8gbmVlZCB0byB1c2UgbXV0YWJsZSBzdGF0ZQ0KICBhbmQgZXhjZXB0aW9u cyBmb3IgZmxvdyBjb250cm9sISkgYW5kIGNhbiBoYW5kbGUgcmVzb3VyY2UgYWxsb2NhdGlvbg0K ICBhbmQgY2xlYW4gdXAgaW4gYSBsYXp5IGFuZCBkZXRlcm1pbmlzdGljIHdheS4gQWxsIG9mIHRo aXMgd2hpbGUgaGF2aW5nDQogIGEgc2xpZ2h0bHkgYmV0dGVyIHBlcmZvcm1hbmNlIGZvciBjb21t b24gc3RyZWFtIG9wZXJhdGlvbnMuDQoNCiAgRm9yIHRob3NlIHdobyBhcmUgY3VyaW91cyBhYm91 dCB0aGUgcGVyZm9ybWFuY2UgY2hhcmFjdGVyaXN0aWNzIG9mDQogIGBzdHJlYW1pbmcnIGFuZCBv dGhlciBtb2RlbHMsIEkgY3JlYXRlZCBhIGRlZGljYXRlZCByZXBvc2l0b3J5IGZvcg0KICBzdHJl YW0gYmVuY2htYXJrczogW2h0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL3N0cmVhbXMtYmVuY2hdLiBJ bg0KICBwYXJ0aWN1bGFyLCBpdCBpbmNsdWRlcyBhIGZldyBzaW1wbGUgYmVuY2htYXJrcyBmb3Ig YEdlbicsDQogIGBCYXNlLlNlcXVlbmNlJywgYFN0ZGxpYi5TZXEnLCBgSXRlcicsIGBTdHJlYW1p bmcuU3RyZWFtJyBhbmQNCiAgYFN0cmVhbWluZy5Tb3VyY2UnLg0KDQogIFRoZSBsaWJyYXJ5IHNo b3VsZCBzb29uIGJlIHB1Ymxpc2hlZCBvbiBvcGFtLiBJbiB0aGUgbWVhbnRpbWUsIEkNCiAgaW52 aXRlIHlvdSB0byByZWFkIHRoZSBkb2NzIGFuZCBleHBsb3JlIHRoZSBjb2RlOg0KDQogIOKAoiBM aWJyYXJ5IGRvY3VtZW50YXRpb246IFtodHRwczovL29kaXMtbGFicy5naXRodWIuaW8vc3RyZWFt aW5nXQ0KICDigKIgR2l0aHViIHByb2plY3Q6IFtodHRwczovL2dpdGh1Yi5jb20vb2Rpcy1sYWJz L3N0cmVhbWluZ10NCg0KDQpHdWlsbGF1bWUgQnVyeSBhc2tlYw0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhhdCdzIGdy ZWF0ICEgRnJvbSB0aGUgYmVuY2htYXJrcywgaXQgbG9va3MgbGlrZSB5b3UgaGl0IGEgcmVhbGx5 DQogIGdvb2QgaW1wbGVtZW50YXRpb24gIQ0KDQogIEkndmUgbG9va2VkIChtYXliZSBhIGJpdCBm YXN0KSBhdCB0aGUgQVBJIGRvY3VtZW50YXRpb24sIGFuZCBpdCBpcw0KICBhZG1pdHRlZGx5IGEg Yml0IG91dHNpZGUgdGhlIHNjb3BlIG9mIHN0cmVhbXMvaXRlcmF0b3JzLCBidXQgSSB3YXMNCiAg d29uZGVyaW5nIGlmIHRoZXJlIHdhcyBzb21lIHByb3BlciB3YXkgdG86DQogIOKAoiBjb25uZWN0 IGEgc2luayB0byBhIHNvdXJjZSB0byBjcmVhdGUgc29tZSBsb29wDQogIOKAoiBoYXZlIHNvbWUg a2luZCBvZiBmaXhwb2ludCBvbiBzdHJlYW1zDQoNCiAgSSBndWVzcyBpdCB3b3VsZCBhbHdheXMg YmUgcG9zc2libGUgdG8gdXNlIHNvbWUgcmVmZXJlbmNlcyBhbmQvb3Igc29tZQ0KICBjb21wbGV4 IGZ1bmN0aW9ucyB0byBlbmNvZGUgdGhlc2UgaW50byB0aGUgcHJvdmlkZWQgQVBJLCBidXQgSSB3 YXMNCiAgd29uZGVyaW5nIGlmIHRoZXJlIHdhcyBhIGNsZWFuIHdheSB0byBkbyBpdC4NCg0KICBG b3IgYSBiaXQgb2YgY29udGV4dCBhbmQgZXhwbGFuYXRpb24sIHdoYXQgSSBoYXZlIGluIG1pbmQg aXMgdGhlIGNhc2UNCiAgb2YgYSBwcm9ncmFtIChsZXQncyBzYXkgYSB0eXBlLWNoZWNrZXIgb3Ig c29tZXRoaW5nIGNsb3NlIHRvIHRoZSBpZGVhKQ0KICB3aXRoIGEgKnBlcnNpc3RlbnQgc3RhdGUq LCB0aGF0IHNob3VsZCBvcGVyYXRlIG92ZXIgYSBzdHJlYW0gb2YNCiAgaW5wdXRzLCB3aGljaCBh cmUgdG9wLWxldmVsIHBocmFzZXMsIGFuZCBwcm9kdWNlIHNvbWUgb3V0cHV0cywgZm9yDQogIGlu c3RhbmNlIHByaW50IHNvbWUgcmVzdWx0IGZvciBlYWNoIGNvcnJlY3RseSB0eXBlLWNoZWNrZWQg c3RhdGVtZW50DQogIChhbmQgYW4gZXJyb3Igb3RoZXJ3aXNlKS4gIFRoZSB0eXBlLWNoZWNrZXIg d291bGQgYmFzaWNhbGx5IGJlIGENCiAgZnVuY3Rpb24gb2YgdHlwZSBgKGBpbnB1dCAqIGBzdGF0 ZSkgLT4gKGBvdXRwdXQgKiBgc3RhdGUpJywgYW5kDQogIHN0YXJ0aW5nIGZyb20gYW4gaW5pdGlh bCBzdGF0ZSwgaXQgd291bGQgcHJvY2VzcyBhbiBpbnB1dCBlbGVtZW50DQogIChnaXZpbmcgdGhl IG91dHB1dCB0byBzb21lIHNpbmspLCBhbmQgdGhlbiB0aGUgbmV4dCBpbnB1dCBlbGVtZW50DQog IHdvdWxkIGJlIHByb2Nlc3NlZCB3aXRoIHRoZSBzdGF0ZSB0aGF0IHdhcyByZWFjaGVkIGFmdGVy IHByb2Nlc3NpbmcNCiAgdGhlIHByZXZpb3VzIGVsZW1lbnQ6IHRoZSBzdGF0ZSB3b3VsZCByZWFj aCB0aGUgc2luayBvZiB0aGUgZmxvdywgYW5kDQogIHRoZW4gYmUgaW5zZXJ0ZWQgYmFjayBpbnRv IHRoZSBzb3VyY2UuICBTZXBhcmF0ZWx5LCBpbWFnaW5lIHRoZQ0KICBsYW5ndWFnZSBiZWluZyB0 eXBlLWNoZWNrZWQgaGFzIGEgbm90aW9uIG9mIGluY2x1ZGUsIHRoZW4gb25lIG9mIHRoZQ0KICBz dGVwIG9mIHRoZSBmbG93IHdvdWxkIGJlIHRvIGV4cGFuZCBlYWNoIGluY2x1ZGUgaW50byBhIHN0 cmVhbSBvZg0KICBpbnB1dHMvcGhyYXNlcywgYnV0IGVhY2ggb2YgdGhlIHBocmFzZXMgaW4gdGhp cyBzdHJlYW0gd291bGQgbmVlZCB0bw0KICBiZSBleHBhbmRlZCwgc28gYSBzaW1wbGUgYGZsYXRf bWFwfi9+ZmxhdHRlbicgaXMgbm90IGVub3VnaC4NCg0KICBJIGFscmVhZHkgaGF2ZSBhIGN1c3Rv bSBpbXBsZW1lbnRhdGlvbiB0aGF0IGhhbmRsZSB0aGVzZSBmZWF0dXJlcywgYnV0DQogIEkgd2Fz IHdvbmRlcmluZyB3aGV0aGVyIEkgY291bGQgdXNlIGBzdHJlYW1pbmcnIHRvIGhhbmRsZSBtb3N0 IG9mIHRoZQ0KICBjb2RlIGxpbmtpbmcgYWxsIG9mIHRoZSBzdGVwcywgXl4NCg0KDQpSaXpvIHJl cGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIGlm IHRoZXJlIHdhcyBzb21lIHByb3BlciB3YXkgdG86DQogICAgICAgIOKAoiBjb25uZWN0IGEgc2lu ayB0byBhIHNvdXJjZSB0byBjcmVhdGUgc29tZSBsb29wDQogICAgICAgIOKAoiBoYXZlIHNvbWUg a2luZCBvZiBmaXhwb2ludCBvbiBzdHJlYW1zDQoNCiAgUmVnYXJkaW5nIHRoZSBmaXJzdCBwb2lu dDogeWVzISBUaGF0J3MgZXhhY3RseSB0aGUgcG9pbnQgb2YgdGhlDQogIGBTdHJlYW0nIG1vZHVs ZS4gWW91IHNlZSwgc291cmNlcyBhcmUgcHVsbC1iYXNlZCBhYnN0cmFjdGlvbnMsIHdoaWxlDQog IHNpbmtzIGFyZSBwdXNoLWJhc2VkLiBTb3VyY2UncyB0eXBlIGVzc2VudGlhbGx5IHNheXMgc29t ZXRoaW5nIGxpa2UNCiAgXyJJIG1pZ2h0IGdpdmUgeW91IHNvbWUgZGF0YSwgaWYgeW91IGFzayJf LCB3aGlsZSBzaW5rJ3MgdHlwZSBpcyB0aGUNCiAgb3Bwb3NpdGUgXyJJIG1pZ2h0IHRha2Ugc29t ZSBkYXRhLCBpZiB5b3UgZ2l2ZSBpdCB0byBtZSJfLiBUaGV5IGFyZQ0KICBjb21wbGV0ZWx5IGFu ZCBpbnRlbnRpb25hbGx5IGRlY291cGxlZDsgaXQgaXMgU3RyZWFtJ3Mgcm9sZSB0byBkcml2ZQ0K ICB0aGUgY29tcHV0YXRpb24gYnkgcHVsbGluZyBkYXRhIGZyb20gc291cmNlcyBhbmQgcHVzaGlu ZyBpdCBpbnRvDQogIHNpbmtzLiBTbyB0aGUgZWFzaWVzdCB3YXkgdG8gY29ubmVjdCB0aGVtIGlz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgU3RyZWFtLihmcm9tIHNyb3VjZSB8PiBpbnRv IHNpbmspDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIE9mIGNvdXJzZSwgdGhhdCdzIG5vdCB2ZXJ5 IHVzZWZ1bCBwZXIgc2UsIGJ1dCBpdCBpbGx1c3RyYXRlcyBteQ0KICBwb2ludC4gVGFrZSBhIGxv b2sgYXQgdGhlIFtgU3RyZWFtLmZyb20nXSBjb2RlIHRvIHNlZSB0aGUNCiAgaW1wbGVtZW50YXRp b24gb2YgdGhlIGxvb3AgeW91J3JlIGFza2luZyBmb3IuIEl0IGRvZXMgc29tZSBleHRyYSB3b3Jr DQogIHRvIGVuc3VyZSB0aGF0IHJlc291cmNlcyBhcmUgY29ycmVjdGx5IGhhbmRsZWQsIGJ1dCBp dCBzaG91bGQgYmUgY2xlYXINCiAgd2hhdCB0aGUgbG9vcCBpcyBkb2luZy4NCg0KICBUaGUgc3Ry ZWFtIHR5cGVzIGluIHRoZSBsaWJyYXJ5IGFyZSBjdXJyZW50bHkgYWJzdHJhY3QgYmVjYXVzZSBJ DQogIGRpZG4ndCB3YW50IHRvIGNvbW1pdCB0byBhIHBhcnRpY3VsYXIgcmVwcmVzZW50YXRpb24g anVzdCB5ZXQuIElmIHRoaXMNCiAgaXMgYSBwcm9ibGVtIGZvciB5b3VyIHVzZSBjYXNlLCBsZXQg bWUga25vdywgSSdsbCBleHBvc2UgdGhlbSBpbiBhDQogIGBQcml2YXRlJyBtb2R1bGUuDQoNCiAg UmVnYXJkaW5nIHRoZSBzZWNvbmQgcG9pbnQ6IEknbSBub3Qgc3VyZSB3aGF0IHlvdSBtZWFuIGlu IHByYWN0aWNlIGJ5DQogICJmaXhwb2ludCBvbiBzdHJlYW1zIi4gSSBndWVzcyB0aGUgb25lIHRo aW5nIHRoYXQgY291bGQgaGVscCBpbXBsZW1lbnQNCiAgc29tZXRoaW5nIGxpa2UgdGhhdCBpcyB0 aGUgW2BTdHJlYW0ucnVuJ10gZnVuY3Rpb24uIEl0IGFsbG93cyB5b3UgdG8NCiAgY29udGludWUg cmVhZGluZyBlbGVtZW50cyBmcm9tIGEgc291cmNlIGV2ZW4gYWZ0ZXIgYSBzaW5rIGlzIGZpbGxl ZCBieQ0KICByZXR1cm5pbmcgYSBsZWZ0b3ZlciBzdHJlYW0uICBUaGlzIHN0cmVhbSBjYW4gYmUg dXNlZCB3aXRoDQogIGBTdHJlYW0ucnVuJyByZXBlYXRlZGx5Lg0KDQogIEFsdGVybmF0aXZlbHkg dGhlcmUncyBhbHNvIFtgRmxvdy50aHJvdWdoJ10sIHdoaWNoIGNvbnN1bWVzIGlucHV0DQogIHRy eWluZyB0byBmaWxsIHNpbmtzIHJlcGVhdGVkbHkgYW5kIHByb2R1Y2VzIHRoZWlyIGFnZ3JlZ2F0 ZWQgdmFsdWVzDQogIGFzIGEgc3RyZWFtLiBTdXBlciB1c2VmdWwgZm9yIHRoaW5ncyBsaWtlIHN0 cmVhbWluZyBwYXJzaW5nLiBNaWdodA0KICBldmVuIGhlbHAgd2l0aCB5b3VyIHVzZS1jYXNlIGZv ciB0b3AtbGV2ZWwgcGhyYXNlcy4NCg0KICBPbiBhIG1vcmUgZ2VuZXJhbCBub3RlIHRob3VnaCwg dGhlIHR5cGUgYCgnaW5wdXQgKiAnc3RhdGUpIC0+ICgnb3V0cHV0DQogICogJ3N0YXRlKScgbG9v a3MgYSBsb3QgbGlrZSBhIFttZWFseSBtYWNoaW5lXS4gYFN0cmVhbWluZy5TaW5rJyBpcyBhDQog IFttb29yZSBtYWNoaW5lXSwgd2hpY2ggaXMgc2xpZ2h0bHkgbGVzcyBnZW5lcmFsIGJlY2F1c2Ug dGhlIG91dHB1dA0KICB2YWx1ZXMgZG8gbm90IGRlcGVuZCBvbiBpbnB1dCB2YWx1ZXMsIG9ubHkg b24gdGhlIHN0YXRlLg0KDQogIEkgdGhvdWdodCBhYm91dCBleHBvc2luZyBkaWZmZXJlbnQga2lu ZHMgb2Ygc2lua3MgaW4gc3RyZWFtaW5nLCBidXQNCiAgd2FudGVkIHRvIG1ha2Ugc3VyZSB0aGF0 IHRoZSBjb21tb24gdXNlIGNhc2VzIGFyZSBjb3ZlcmVkIGZpcnN0LiBJJ2xsDQogIGtlZXAgeW91 ciBjYXNlIGluIG1pbmQgZm9yIGZ1dHVyZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeS4NCg0KDQpb YFN0cmVhbS5mcm9tJ10NCmh0dHBzOi8vZ2l0aHViLmNvbS9vZGlzLWxhYnMvc3RyZWFtaW5nL2Js b2IvMC44LjAvbGliL1N0cmVhbS5tbCNMNDINCg0KW2BTdHJlYW0ucnVuJ10NCmh0dHBzOi8vb2Rp cy1sYWJzLmdpdGh1Yi5pby9zdHJlYW1pbmcvc3RyZWFtaW5nL1N0cmVhbWluZy9TdHJlYW0vaW5k ZXguaHRtbCN2YWwtcnVuDQoNCltgRmxvdy50aHJvdWdoJ10NCmh0dHBzOi8vb2Rpcy1sYWJzLmdp dGh1Yi5pby9zdHJlYW1pbmcvc3RyZWFtaW5nL1N0cmVhbWluZy9GbG93L2luZGV4Lmh0bWwjdmFs LXRocm91Z2gNCg0KW21lYWx5IG1hY2hpbmVdIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtp L01lYWx5X21hY2hpbmUNCg0KW21vb3JlIG1hY2hpbmVdIGh0dHBzOi8vZW4ud2lraXBlZGlhLm9y Zy93aWtpL01vb3JlX21hY2hpbmUNCg0KDQpTZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQgQXNl bWlvIGluIFR1bHNhLCBPSw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZW5pb3Itc29mdHdhcmUtZW5naW5l ZXItYXQtYXNlbWlvLWluLXR1bHNhLW9rLzU5NzkvMV0NCg0KDQpTaW1vbiBHcm9uZGluIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIEFzZW1pbyBhbmQgb3VyIHRlYW0gb2YgZGF0 YSBzY2llbnRpc3RzLCBzb2Z0d2FyZSBlbmdpbmVlcnMsDQogIGFyY2hpdGVjdHMsIGFuZCBtYW5h Z2VtZW50IGNvbnN1bHRhbnRzIGFyZSB3b3JraW5nIHRvZ2V0aGVyIHRvIGFjaGlldmUNCiAgYSBu YXRpb253aWRlIGRhdGEgZWNvc3lzdGVtIGZvciBzb2NpYWwgZ29vZC4NCg0KICBZb3XigJlsbCBi ZSB3b3JraW5nIG9uIHRoZSBBc2VtaW8gQ29tbXVuaXR5IEludGVncmF0aW9uIFBsYXRmb3JtLiBJ dA0KICBmZWF0dXJlcyBzdGF0ZS1vZi10aGUtYXJ0IHByaXZhY3ktcHJlc2VydmluZywgcHJlLXBy b2Nlc3NpbmcgYW5kDQogIHBpcGVsaW5lIG1hbmFnZW1lbnQsIGFzIHdlbGwgYXMgcmVjb3JkIGxp bmthZ2UgdGVjaG5vbG9neS4NCg0KICBUaGUgYmFjayBlbmQgaXMgd3JpdHRlbiBpbiBPQ2FtbC4g VGhlIGZyb250IGVuZCBpcyBjb21waWxlZCBmcm9tIE9DYW1sDQogIHRvIEphdmFTY3JpcHQgYW5k IHVzZXMgYSBtb2Rlcm4gTVZDIGZyYW1ld29yay4gIFRoZSB3b3JrIHlvdeKAmWxsIGJlDQogIGRv aW5nIHdpbGwgdG91Y2ggbnVtZXJvdXMgdGVjaG5pY2FsIGRpc2NpcGxpbmVzLCBpbmNsdWRpbmcN CiAgY3J5cHRvZ3JhcGh5LCBkaXN0cmlidXRlZCBzeXN0ZW1zLCBsYW5ndWFnZSBkZXNpZ24gYW5k IGltcGxlbWVudGF0aW9uLA0KICBkYXRhIGFuYWx5dGljcywgYW5kIGRhdGEgdmlzdWFsaXphdGlv bnMuDQoNCiAgV2UgcHJlZmVyIGNhbmRpZGF0ZXMgd2lsbGluZyB0byByZWxvY2F0ZSwgYnV0IHdl IGNvdWxkIG1ha2UgYW4NCiAgZXhjZXB0aW9uIGZvciBhbiBleGNlcHRpb25hbCBjYW5kaWRhdGUu DQoNCiAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb3IgdG8gYXBwbHksIHBsZWFzZSByZWZlciB0byBv dXIgU0UgbGlzdGluZzoNCiAgW2h0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vam9icy80MDEzODMv b2NhbWwtc2VuaW9yLXNvZnR3YXJlLWVuZ2luZWVyLWFzZW1pb10NCg0KDQpPdGhlciBPQ2FtbCBO ZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K RnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVn YXRlZCBhdCBbT0NhbWwgUGxhbmV0XS4NCg0KICDigKIgW0ZyYW1hLUMgMjEuMCAoU2NhbmRpdW0p IGlzIG91dC4gRG93bmxvYWQgaXQgaGVyZS5dDQogIOKAoiBbRXZlcnkgcHJvb2YgYXNzaXN0YW50 OiBFcGlncmFtIDIgLSBBdXRvcHN5LCBPYml0dWFyeSwgQXBvbG9neV0NCg0KDQpbT0NhbWwgUGxh bmV0XSBodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvDQoNCltGcmFtYS1DIDIxLjAg KFNjYW5kaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KaHR0cDovL2ZyYW1hLWMuY29t L2luZGV4Lmh0bWwNCg0KW0V2ZXJ5IHByb29mIGFzc2lzdGFudDogRXBpZ3JhbSAyIC0gQXV0b3Bz eSwgT2JpdHVhcnksIEFwb2xvZ3ldDQpodHRwOi8vbWF0aC5hbmRyZWouY29tLzIwMjAvMDYvMDkv ZXBpZ3JhbS0yLWF1dG9wc3ktb2JpdHVhcnktYXBvbG9neS8NCg0KDQpPbGQgQ1dODQrilZDilZDi lZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g W3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNo aXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkg bWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0N Cg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1 ZS5vcmcNCg0KW3RoZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0K DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duL2N3bi5yc3MNCg0KW29ubGluZV0gaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9j YW1sLW5ld3Mtd2Vla2x5Lw0KDQpbQWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvDQoNCg== --===-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 09 to 16, 2020.

First release of monolith

Fran=C3=A7ois Pottier announced

It is my pleasure to announce the first release of Monolith.

Monolith offers facilities for testing an OCaml library (for instance, a da= ta structure implementation) by comparing it against a reference implementatio= n. It uses a form of black-box testing, and relies on afl-fuzz fo= r efficiency.

The user must describe what types and operations the library provides. Under the best circumstances, this requires 2-3 lines of code per type or operati= on. The user must also provide a reference implementation of the library.

Then, like a monkey typing on a keyboard, Monolith attempts to exercise the library in every possible way, in the hope of discovering a scenario where = the library behaves incorrectly. If such a scenario is discovered, it is printed in the form of an OCaml program, so as to help the user reproduce the probl= em.

At this time, a tutorial is not yet available. There is however an API documentation and a number of demos.

Repository: https://gitlab.inri= a.fr/fpottier/monolith

API Documentation: http://cambium.inria.fr/~fpottier/monolith/doc/monolith/Mono= lith/index.html

Installation:

opam update
opam install monolith

Sylvain Conchon joined OCamlPro's tea= m

OCamlPro announced

Sylvain Conchon joined OCamlPro's team as Formal Methods CSO. He created Al= t-Ergo and has been teaching OCaml in universities for about 20 years. He shares thoughts on interactions between= industry and research labs, and his vision of Formal methods and OCaml as language for the industry. Read his i= nterview on our blog: https://www.ocamlpro.com/2020/06/05/interview-sylvain= -conchon-cso-on-formal-methods/

First release of streaming

Rizo announced

It is my pleasure to announce the first public release of streaming =E2=80=93 a library for building efficient, incremental data processing pipelines that compose and don't leak resources.

I built streaming as a result of many experiments with different streaming = and iteration models for OCaml. There are multiple packages on OPAM that share some of the goals of streaming (we even have Stdlib.Seq now!), but none of them combine (1) excellent performance, (2) safe resource handling and (3) = pure functional style for combinators. Streaming solves these problems by implementing three basic and independent= models: sources, sinks and flows =E2=80=93 they represents different parts of the pipeline that correspond to producin= g, consuming and transforming elements. These models can be defined and composed independently to produce reusable = "streaming blocks".

The library defines a central Stream model that relies on sour= ces, sinks and flows. This model is a push-based iterator with performance characteristics similar to the iter = iterator, which has type ('a -> unit) -> unit, and is known for being very efficient. But unlike iter, it has a p= ure functional core (no need to use mutable state and exceptions for flow control!) and can handle resource allocation and clean = up in a lazy and deterministic way. All of this while having a slightly better performance for common stream operation= s.

For those who are curious about the performance characteristics of st= reaming and other models, I created a dedicated repository for stream benchmarks: https://github.com/rizo/streams-bench. In particular= , it includes a few simple benchmarks for Gen, Base.Sequence, S= tdlib.Seq, Iter, Streaming.Stream and Streaming.Source.

The library should soon be published on opam. In the meantime, I invite you= to read the docs and explore the code:

Guillaume Bury askec

That's great ! From the benchmarks, it looks like you hit a really good imp= lementation !

I've looked (maybe a bit fast) at the API documentation, and it is admitted= ly a bit outside the scope of streams/iterators, but I was wondering if there was some proper way to:

  • connect a sink to a source to create some loop
  • have some kind of fixpoint on streams

I guess it would always be possible to use some references and/or some comp= lex functions to encode these into the provided API, but I was wondering if there was a clean way to do it.

For a bit of context and explanation, what I have in mind is the case of a = program (let's say a type-checker or something close to the idea) with a persistent state, that should op= erate over a stream of inputs, which are top-level phrases, and produce some outputs, for instance print some result= for each correctly type-checked statement (and an error otherwise). The type-checker would basically be a function of type (`input * `sta= te) -> (`output * `state), and starting from an initial state, it would process an input element (giving the output= to some sink), and then the next input element would be processed with the state that was reached after processing= the previous element: the state would reach the sink of the flow, and then be inserted back into the source. Separately, imagine the language being type-checked has a notion of include= , then one of the step of the flow would be to expand each include into a stream of inputs/phrases, but each of the = phrases in this stream would need to be expanded, so a simple flat_map~/~flatten is not enough.

I already have a custom implementation that handle these features, but I wa= s wondering whether I could use streaming to handle most of the code linking all of the steps,= ^^

Rizo replied

if there was some proper way to:

  • connect a sink to a source to create some loop
  • have some kind of fixpoint on streams

Regarding the first point: yes! That's exactly the point of the Strea= m module. You see, sources are pull-based abstractions, while sinks are push-based. Source's type essentially says so= mething like "I might give you some data, if you ask", while sink's type is the opposite "I might take some data, if you give it to me". They are comple= tely and intentionally decoupled; it is Stream's role to drive the computation b= y pulling data from sources and pushing it into sinks. So the easiest way to connect them is:

Stream.=
(from srouce |> into sink)

Of course, that's not very useful per se, but it illustrates my point. Take= a look at the Stream.from code to see the implementation of the loop you're asking for. It does some extra work to ensure that resou= rces are correctly handled, but it should be clear what the loop is doing.

The stream types in the library are currently abstract because I didn't wan= t to commit to a particular representation just yet. If this is a problem for your use case, let me know, I'll expose = them in a Private module.

Regarding the second point: I'm not sure what you mean in practice by "fixp= oint on streams". I guess the one thing that could help implement something like that is the Stream.run function. It allows you to continue reading elements from a source even after a sink is = filled by returning a leftover stream. This stream can be used with Stream.run repeatedly.

Alternatively there's also Flow.through, which consumes input trying to fill sinks repeatedly and produces their aggregate= d values as a stream. Super useful for things like streaming parsing. Might even help with your use-case for top-l= evel phrases.

On a more general note though, the type ('input * 'state) -> ('out= put * 'state) looks a lot like a mealy machine. Streaming.Sink is a moore machine, which is slightly less general because the output values do not depend on input values, only on the state.

I thought about exposing different kinds of sinks in streaming, but wanted = to make sure that the common use cases are covered first. I'll keep your case in mind for future versions of the libra= ry.

Senior software engineer at Asemio in= Tulsa, OK

Simon Grondin announced

We are Asemio and our team of data scientists, software engineers, architec= ts, and management consultants are working together to achieve a nationwide data ecosystem for social good.

You=E2=80=99ll be working on the Asemio Community Integration Platform. It = features state-of-the-art privacy-preserving, pre-processing and pipeline management, as well as record linkage technolog= y.

The back end is written in OCaml. The front end is compiled from OCaml to J= avaScript and uses a modern MVC framework. The work you=E2=80=99ll be doing will touch numerous technical disciplines,= including cryptography, distributed systems, language design and implementation, data analytics, and data visualizations.

We prefer candidates willing to relocate, but we could make an exception fo= r an exceptional candidate.

For more information or to apply, please refer to our SE listing: https://stackoverflow.com/jobs/401383/ocaml-senior-software-en= gineer-asemio

Other OCaml News

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--===-=-=-- --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id BDBF3E0129 for ; Tue, 30 Jun 2020 09:00:27 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=ySyJ=AL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3Alu5tgR2u4K+V2vJismDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?sesUKPnxwZ3uMQTl6Ol3ixeRBMOHsq8C0bKO+Pm4CSQp2tWoiDg6aptCVhsI24?= =?us-ascii?q?09vjcLJ4q7M3D9N+PgdCcgHc5PBxdP9nC/NlVJSo6lPwWB6nK94iQPFRrhKAF7?= =?us-ascii?q?Ovr6GpLIj8Swyuu+54Dfbx9HiTagYb5+Ngu6oRnNusUZnIduNqU8wQbVr3VVfO?= =?us-ascii?q?hb2XlmLk+JkRbm4cew8p9j8yBOtP8k6sVNT6b0cbkmQLJBFDgpPHw768PttRnY?= =?us-ascii?q?UAuA/WAcXXkMkhpJGAfK8hf3VYrsvyTgt+p93C6aPdDqTb0xRD+v4btnRAPuhS?= =?us-ascii?q?waNzI382fXitJxjKJAoRKuvBh/zJDJa4CbM/p+ZL7SfcgHTmZFUMtdSylND4Wh?= =?us-ascii?q?ZIUNEuUBJ/5VoYnjqVUToxWwBgajC//0xz9NmnP7x7c33/g9HQzE2gErAtIAsG?= =?us-ascii?q?7TrNXwLKofTeS1w7POzT7ecv1ZxTf96I3JchA9vfGHQLV9ftDVyUY1EQPJlE6Q?= =?us-ascii?q?ppDlPzOQ1+QNr3Sb4vF4VeKoj24mqx1xrSazyccsjInJh5sVyk3a+iljx4Y1P9?= =?us-ascii?q?K4RVd9bNW5H5ReqzuUOJFqQsM+XW5ooiA6x6UYtZC1ciYG1IgqyhzBZvGZbYSF?= =?us-ascii?q?4g7uWfqMLDp7mX5oea6yihSv/EW8xOPyVtW53VZOoydFndTCtnEA2wDc58WDTP?= =?us-ascii?q?Z240mv2TGK1w/J6+FEJ1g5lbLFJJ49w74wioQcsVzEHi/znUX5krWadkM69ei0?= =?us-ascii?q?8+jnZanpqYWZN49wkA3+Nb4umsOnDeQ3MwgOQ2ib+fmn27H54UL5R7BKguU3kq?= =?us-ascii?q?nfqpDaJN4UqrS3Aw9Pyooj5Be/Dyum0NQFhnYLNkhJdw6Aj4jsI13OLur4Au26?= =?us-ascii?q?g1u2iTtk2+rKMaHmApXINnTDkarufLZ5605Y0gYzyspf551SB7ocI/zzQlf8uM?= =?us-ascii?q?HGAhI9KQC43vrrBdpn2o4QRW6DGKGUPazKvVOV6O8jPvOAaJEVtTvyMfQp+uLi?= =?us-ascii?q?gWUklVIfYaWk24YcZmqiEfR8OUqZZGLhgtcfHmcOuQozVOnqiVKfXTJJf3ayWK?= =?us-ascii?q?Y85zEnCI24EYjDRoatgL2Y3CemAJJafGdGCkqDEXvwdoWEXekDaD6KL8N8jDAJ?= =?us-ascii?q?UaKtR5I92RyhrgP3xaZrIvDa9yAXrZ7j0cJ65+zXlRE87zx0CMGd3nmQQW9og2?= =?us-ascii?q?0EWyc73aBir019zlmOybR1jfpAGNxL4PNJVgc7NYLCwONmC9DyXAPBfs6USFm4?= =?us-ascii?q?WNmmBisxTt0pztAUZ0ZyAdOiggrY3yW2A78Vkr2LBIAo8q/HxHfxINt9y3Da26?= =?us-ascii?q?Y/lFkqWM5POGKph6Jl8AjTHYHJn12Dl6m2baQcwDLN9GCbwGWSpk5YVQpwXbzB?= =?us-ascii?q?XXAefUvWsc/05ljCTr+rEbQoKBFNyc+EKqtQa93ml09KRPn5OIeWX2Xk0WOvA1?= =?us-ascii?q?zAkreTaqLuZGNb2ijBXgxM2QsM+zzOfVw1GSGJp2PFECcoFF7+Z0eq9vNx/jfz?= =?us-ascii?q?RUYxy0SOblZ9/7uz4B8cw/KGD7sY2bcckCMgsClvWlGn1dPKAt6OoBoncbgPT8?= =?us-ascii?q?k65QJu0Wvf/zd2PpmhM7wq0lcaegIxpEju0hRrFq1Ylsw7sH4hzAxzML+VllRb?= =?us-ascii?q?eGXLjtjLJrTLJzyqr1iUYKnM1wSFiI/LqJdK0+wxrhDYhC/sFkcm9C88gdxFij?= =?us-ascii?q?2E4ZHbEAcZUZTwS1s6sR9gqOODO3Vv18bvzXRpdJKMnHrawdtwVbk9zRKxY9pU?= =?us-ascii?q?MKWFDRL/VcoACJr3cb14qx2SdhsBedtq2usxNsKieeGB3ff0buxngTStgH8B5d?= =?us-ascii?q?xtlEWW+HglRw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BcAQCc4fpehyIeaIFgHAEBAQEBAQcBA?= =?us-ascii?q?RIBAQQEAQGCCoEjUkYBXVUyLIQxgV2HJIshhTqNUYQDgXMBAwEHBRgBCgkBAgQ?= =?us-ascii?q?BAYFTgT5xXoIUAh0GAQUzEwIQAQEFAQEBAgEDAwQBEwEBAQoLCQgphWIMgjcMG?= =?us-ascii?q?YMaASEKZSMDFAcDAgQNARcBFAoDARMBEhQGgwwBgnwFCpInmjYZNXaBMoQ6AQM?= =?us-ascii?q?DhGyBQA0CE4EWgVODYEaCaoNdJg+BTD+BEYJibIJFDAsBAQEBAYE6AQEGgzCCY?= =?us-ascii?q?ASOfy0dcooBgUqGBYFvkFwoB4JfgQcEC4Y5eopDhlKCc4EaiBOIA4pzIZExh0o?= =?us-ascii?q?HcoFXhXCKLYRHgUAqgXgzGjBDgmkJYA2NeoQUgT6DGzuFRD8zAgEBATICBgEHA?= =?us-ascii?q?QEDCXUBAQUTCwGPVQEB?= X-IPAS-Result: =?us-ascii?q?A0BcAQCc4fpehyIeaIFgHAEBAQEBAQcBARIBAQQEAQGCCoE?= =?us-ascii?q?jUkYBXVUyLIQxgV2HJIshhTqNUYQDgXMBAwEHBRgBCgkBAgQBAYFTgT5xXoIUA?= =?us-ascii?q?h0GAQUzEwIQAQEFAQEBAgEDAwQBEwEBAQoLCQgphWIMgjcMGYMaASEKZSMDFAc?= =?us-ascii?q?DAgQNARcBFAoDARMBEhQGgwwBgnwFCpInmjYZNXaBMoQ6AQMDhGyBQA0CE4EWg?= =?us-ascii?q?VODYEaCaoNdJg+BTD+BEYJibIJFDAsBAQEBAYE6AQEGgzCCYASOfy0dcooBgUq?= =?us-ascii?q?GBYFvkFwoB4JfgQcEC4Y5eopDhlKCc4EaiBOIA4pzIZExh0oHcoFXhXCKLYRHg?= =?us-ascii?q?UAqgXgzGjBDgmkJYA2NeoQUgT6DGzuFRD8zAgEBATICBgEHAQEDCXUBAQUTCwG?= =?us-ascii?q?PVQEB?= X-IronPort-AV: E=Sophos;i="5.75,296,1589234400"; d="asc'?scan'208,217";a="457345893" X-MGA-submission: =?us-ascii?q?MDHiEF6ON0VcrlyPWRSf8+6+Mqs1F/43CiZKLn?= =?us-ascii?q?HONyhWe913V7EKg1c3/hFn5eU7+PqTx4coX38R+6HV8ZzWAzK25PLlz9?= =?us-ascii?q?Hdk/zRZ2GXVOZ0GUkpRhj1qSVOg6spYJg09bpYUBtqAzmY54NZXtIY54?= =?us-ascii?q?xJGZABg8uQM1UJBMw2lg2zBg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Jun 2020 09:00:26 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1A3B5564EFF; Tue, 30 Jun 2020 09:00:23 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 30 Jun 2020 09:00:21 +0200 Message-ID: <874kqtghru.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 30 09:00:23 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=4C8C3564EFA X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl764wUACgkQBA0KO07S 5cdTKAgAipMsMIXIv38P+cy2R4HR7HCUkKLyvQSY+JHZdcq3XToeMivgtXLDWMty R+UNYQUz6eus0aLxxTVupJ5YFQv3YCDq84WMojd2NNiKnNcg7BICXVOPUJBpxQ2B W5Ng2qotc2LgeNJRJsm986M6vnrw85AtnSfKZWDTESzgqsjZuk3vmc9IDGA3e2tC inyNyvA58GCt8m71gqdOjx5ToHMkJV2+eCYe+2IeLbJswqST5F6Lx1zbRfYGpqH2 lLpNcQqY9f5C5eRYzotPZYmdFyGfi9CKzcvKvtSrj76divXYsq+LnrcNPV+PEzMT /dAD76dxlcsamdL8VGDVQ5SS8CRp+g== =dMMv -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyMyB0byAzMCwNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KZmluY2ggLSBz dGF0aWMgc2l0ZSBnZW5lcmF0b3INCkFOTjogUmVsZWFzZXMgb2YgcmluZ28NCk9DYW1sIDQuMTEs IGZpcnN0IGJldGEgcmVsZWFzZQ0KRmxleERMTCAwLjM4IHJlbGVhc2VkDQpPdGhlciBPQ2FtbCBO ZXdzDQpPbGQgQ1dODQoNCg0KZmluY2ggLSBzdGF0aWMgc2l0ZSBnZW5lcmF0b3INCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWZpbmNoLXN0YXRpYy1zaXRlLWdlbmVyYXRvci82MDI2LzFdDQoNCg0K cm9kZHkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBBbm5vdW5jaW5nIFtmaW5jaF0sIGEgc2ltcGxlIHN0YXRpYyBzaXRlIGdlbmVy YXRvci4gSXQgdXNlcyBjb250ZW50DQogIHdyaXR0ZW4gYXMgTWFya2Rvd24gcGx1cyBZQU1MIGZy b250bWF0dGVyIGxpa2UgSmVreWxsL0h1Z28gZXRjLiBhbmQNCiAgcHJvZHVjZXMgb3V0cHV0IHdp dGggW0ppbmdvb10gdGVtcGxhdGVzLiBJdCBhbHNvIGhhcyBzb21lIGludGVncmF0aW9ucw0KICB3 aXRoIFJlYWN0IChhcyBpbiB0aGUgSlMgbGlicmFyeSkgaW4gdGhlIGZvcm0gb2YgSmluZ29vIGZp bHRlcnM6IHRoZQ0KICBtb3RpdmF0aW9uIGJlaGluZCBpdCB3YXMgdG8gbWFrZSBpdCBlYXNpZXIg dG8gZGV2ZWxvcCBzaXRlcyB0aGF0IHVzZQ0KICBSZWFjdCBqdXN0IGZvciBzb21lIGluIHNvbWUg cGFydHMgcmF0aGVyIHRoYW4gc3RydWN0dXJpbmcgdGhlIHdob2xlDQogIHNpdGUgYXMgYSBzaW5n bGUgcGFnZSBhcHBsaWNhdGlvbi4NCg0KDQpbZmluY2hdIGh0dHBzOi8vZ2l0aHViLmNvbS9yb2Rk eXlhZ2EvZmluY2gNCg0KW0ppbmdvb10gaHR0cHM6Ly9naXRodWIuY29tL3RhdGVnYWtpYnVua28v amluZ29vDQoNCg0KQU5OOiBSZWxlYXNlcyBvZiByaW5nbw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZXMtb2YtcmluZ28vNTYw NS8zXQ0KDQoNClJhcGhhw6tsIFByb3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFZlcnNpb24gMC41IG9mIGByaW5nbycgYW5kIGByaW5nby1sd3QnIGFyZSBub3cgYXZhaWxhYmxl IGluDQogIGBvcGFtJy4gQWx0aG91Z2ggdGhpcyB2ZXJzaW9uIGNoYW5nZXMgYHJpbmdvLWx3dCcg b25seSwgYm90aCBwYWNrYWdlcw0KICBhcmUgcmVsZWFzZWQgYW5ldyB0byBrZWVwIHRoZSB2ZXJz aW9uIG51bWJlcnMgaW4gc3luYy4gVGhpcyB2ZXJzaW9uDQogIGluY2x1ZGVzOg0KDQogIOKAoiBJ bXByb3ZlbWVudCBpbiBkb2N1bWVudGF0aW9uLg0KICDigKIgU2ltcGxpZmljYXRpb25zIGFuZCBy ZWR1Y3Rpb24gaW4gdGhlIG1lbW9yeSBmb290cHJpbnQgb2YgbHd0LXdyYXBwZWQNCiAgICBjYWNo ZXMuDQogIOKAoiBGaXggZm9yIGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIGF1dG9tYXRpYyBjbGVh bnVwIChwcmV2aW91c2x5LCBvbg0KICAgIHdlYWsgY2FjaGVzIG9ubHksIGEgcHJvbWlzZSBiZWlu ZyByZWplY3RlZCBjb3VsZCBjYXVzZSBhIGRpZmZlcmVudA0KICAgIHByb21pc2UgdG8gYmUgcmVt b3ZlZCBmcm9tIHRoZSBjYWNoZSkNCiAg4oCiIEZpeCBhIGxlYWsNCiAg4oCiIE1vcmUgdGVzdCwg aW5jbHVkaW5nIGEgdGVzdCBmb3IgbGVha2luZXNzLg0KDQoNCk9DYW1sIDQuMTEsIGZpcnN0IGJl dGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC00LTExLWZpcnN0LWJldGEt cmVsZWFzZS82MDQyLzFdDQoNCg0Kb2N0YWNocm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIHJlbGVh c2Ugb2YgT0NhbWwgNC4xMS4wIGlzIGFwcHJvYWNoaW5nLg0KDQogIEFmdGVyIHRocmVlIGFscGhh IHJlbGVhc2VzLCB3ZSBoYXZlIGNyZWF0ZWQgYSBmaXJzdCBiZXRhIHZlcnNpb24gdG8NCiAgaGVs cCB5b3UgYWRhcHQgeW91ciBzb2Z0d2FyZSB0byB0aGUgbmV3IGZlYXR1cmVzIGFoZWFkIG9mIHRo ZSByZWxlYXNlLg0KDQogIFRoZSBjb21wYXRpYmlsaXR5IG9mIHRoZSBvcGFtIGVjb3N5c3RlbSB3 aXRoIE9DYW1sIDQuMTEuMCBpcyBjdXJyZW50bHkNCiAgcXVpdGUgZ29vZCwgYW5kIGl0IHNob3Vs ZCBiZSBwb3NzaWJsZSB0byB0ZXN0IHRoaXMgYmV0YSB3aXRob3V0IHRvbw0KICBtdWNoIHRyb3Vi bGUuDQoNCiAgVGhlIHNvdXJjZSBjb2RlIGlzIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6 DQoNCiAgW2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTEuMCtiZXRh MS50YXIuZ3pdDQogIFtodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNC4x MS9vY2FtbC00LjExLjArYmV0YTEudGFyLmd6XQ0KDQogIFRoZSBjb21waWxlciBjYW4gYWxzbyBi ZSBpbnN0YWxsZWQgYXMgYW4gT1BBTSBzd2l0Y2ggd2l0aCBvbmUgb2YgdGhlDQogIGZvbGxvd2lu ZyBjb21tYW5kcy4NCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUg b2NhbWwtdmFyaWFudHMuNC4xMS4wK2JldGExIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1n aXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg 4pSU4pSA4pSA4pSA4pSADQogIG9yDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBzd2l0 Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCtiZXRhMStWQVJJQU5UIC0tcmVwb3NpdG9y aWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEt cmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZB UklBTlQgd2l0aCBvbmUgb2YgdGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQogIGZwK2ZsYW1iZGEN Cg0KICBXZSB3YW50IHRvIGtub3cgYWJvdXQgYWxsIGJ1Z3MuIFBsZWFzZSByZXBvcnQgdGhlbSBo ZXJlOg0KICAgW2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXNdDQoNCiAgSWYg eW91IGFyZSBpbnRlcmVzdGVkIGJ5IHRoZSBsaXN0IG9mIG5ldyBmZWF0dXJlcywgYW5kIHRoZSBv bi1nb2luZw0KICBsaXN0IG9mIGJ1ZyBmaXhlcyB0aGUgdXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBP Q2FtbCA0LjExLjAgaXMgYXZhaWxhYmxlDQogIGF0Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvYmxvYi80LjExL0NoYW5nZXNdDQoNCiAgQ29tcGFyZWQgdG8gdGhlIGxhc3Qg YWxwaGEgcmVsZWFzZSwgdGhpcyBmaXJzdCBiZXRhIHJlbGVhc2UgY29udGFpbnMNCiAgdGhlIGZv bGxvd2luZyBuZXcgYnVnIGZpeGVzOg0KDQoNCkRyaXZlcg0K4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAg4oCiIFsjOTAxMV06IEFsbG93IGxpbmtpbmcgLmNteGEgZmlsZXMgd2l0aCBubyB1bml0cyBv biBNU1ZDIGJ5IG5vdA0KICAgIHJlcXVpcmluZyB0aGUgLmxpYiBmaWxlIHRvIGJlIHByZXNlbnQu IChEYXZpZCBBbGxzb3BwLCByZXBvcnQgYnkNCiAgICBEaW1pdHJ5IEJlbHksIHJldmlldyBieSBY YXZpZXIgTGVyb3kpDQoNCg0KWyM5MDExXSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv aXNzdWVzLzkwMTENCg0KDQpUeXBlY2hlY2tlcg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAg4oCiIFsjOTM4NF0sIFsjOTM4NV06IEZpeCBjb3B5IHNjb3BlIGJ1Z3MgaW4g c3Vic3RpdHV0aW9ucyAoTGVvIFdoaXRlLA0KICAgIHJldmlldyBieSBUaG9tYXMgUmVmaXMsIHJl cG9ydCBieSBOaWNrIFJvYmVydHMpDQoNCiAg4oCiIFsjOTY5NV0sIFsjOTcwMl06IG5vIGVycm9y IHdoZW4gb3BlbmluZyBhbiBhbGlhcyB0byBhIG1pc3NpbmcgbW9kdWxlDQogICAgKEphY3F1ZXMg R2FycmlndWUsIHJlcG9ydCBhbmQgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlcikNCg0KDQpbIzkz ODRdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTM4NA0KDQpbIzkzODVd IGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTM4NQ0KDQpbIzk2OTVdIGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTY5NQ0KDQpbIzk3MDJdIGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTcwMg0KDQoNCldhcm5pbmdzDQrilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgWyM3ODk3XSwgWyM5NTM3XTogRml4IHdhcm5p bmcgMzggZm9yIHJlYm91bmQgZXh0ZW5zaW9uIGNvbnN0cnVjdG9ycw0KICAgIChMZW8gV2hpdGUs IHJldmlldyBieSBGbG9yaWFuIEFuZ2VsZXR0aSkNCg0KICDigKIgWyM5MjQ0XTogRml4IHNvbWUg bWlzc2luZyB1c2FnZSB3YXJuaW5ncyAoTGVvIFdoaXRlLCByZXZpZXcgYnkNCiAgICBGbG9yaWFu IEFuZ2VsZXR0aSkNCg0KDQpbIzc4OTddIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvNzg5Nw0KDQpbIzk1MzddIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMvOTUzNw0KDQpbIzkyNDRdIGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv OTI0NA0KDQoNClRvcGxldmVsDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgWyM5 NDE1XTogVHJlYXQgYG9wZW4gc3RydWN0JyBhcyBgaW5jbHVkZSBzdHJ1Y3QnIGluIHRvcGxldmVs IChMZW8NCiAgICBXaGl0ZSwgcmV2aWV3IGJ5IFRob21hcyBSZWZpcykNCg0KICDigKIgWyM5NDE2 XTogQXZvaWQgd2FybmluZyA1OCBpbiBmbGFtYmRhIG9jYW1sbmF0IChMZW8gV2hpdGUsIHJldmll dyBieQ0KICAgIEZsb3JpYW4gQW5nZWxldHRpKQ0KDQoNClsjOTQxNV0gaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy85NDE1DQoNClsjOTQxNl0gaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy85NDE2DQoNCg0KRmxhbWJkYSBiYWNrZW5kDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgWyM5MTYzXTogVHJl YXQgbG9vcHMgcHJvcGVybHkgaW4gdW5fYW5mIChMZW8gV2hpdGUsIHJldmlldyBieSBNYXJrDQog ICAgU2hpbndlbGwsIFBpZXJyZSBDaGFtYmFydCBhbmQgVmluY2VudCBMYXZpcm9uKQ0KDQoNClsj OTE2M10gaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85MTYzDQoNCg0KRmxl eERMTCAwLjM4IHJlbGVhc2VkDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiBbaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2ZsZXhkbGwtMC0zOC1yZWxlYXNlZC82MDQzLzFdDQoNCg0KRGF2aWQgQWxs c29wcCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFyZSBwbGVhc2VkIHRvIGFubm91 bmNlIHRoZSByZWxlYXNlIG9mIEZsZXhETEwgMC4zOCENCg0KICBGbGV4RExMIHByb3ZpZGVzIGEg ZGxvcGVuLWxpa2UgaW50ZXJmYWNlIGZvciBXaW5kb3dzIGFuZCBpcyB1c2VkIHRvDQogIHNpbXBs aWZ5IHRoZSBsaW5raW5nIHByb2Nlc3MgZm9yIHRoZSBuYXRpdmUgV2luZG93cyBwb3J0cyBvZiBP Q2FtbCBhbmQNCiAgdG8gYWxsb3cgZHluYW1pYyBsb2FkaW5nIG9mIEMgY29kZSAoYnl0ZWNvZGUg c3R1YiBsaWJyYXJpZXMgYW5kIG5hdGl2ZQ0KICBEeW5saW5rKS4gSXQgaXMgYWxzbyB1c2VkIGZv ciB0aGUgc2FtZSBwdXJwb3NlIGluIHRoZSBDeWd3aW4gcG9ydHMgb2YNCiAgT0NhbWwsIGV4Y2Vw dCB0aGF0IHRoZXkgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aG91dCBzaGFyZWQgbGlicmFyeQ0KICBz dXBwb3J0Lg0KDQogIFRoZSByZWxlYXNlIGluY2x1ZGVzIHZhcmlvdXMgYnVnZml4ZXMgYXMgd2Vs bCBhcyBwcm9wZXIgc3VwcG9ydCBmb3INCiAgQysrIGxpbmtpbmcgb24gbWluZ3cgYW5kIGxpbmtp bmcgYWdhaW5zdCBkYXRhIHN5bWJvbHMgaW4gaW1wb3J0DQogIGxpYnJhcmllcy4NCg0KICBQbGVh c2Ugc2VlIHRoZSBbcmVsZWFzZSBwYWdlXSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCg0KDQpbcmVs ZWFzZSBwYWdlXSBodHRwczovL2dpdGh1Yi5jb20vYWxhaW5mcmlzY2gvZmxleGRsbC9yZWxlYXNl cy90YWcvMC4zOA0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJs b2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtz IGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQog IOKAoiBbRnJhbWEtQyAyMS4xIChTY2FuZGl1bSkgaXMgb3V0LiBEb3dubG9hZCBpdCBoZXJlLl0N Cg0KDQpbT0NhbWwgUGxhbmV0XSBodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvDQoN CltGcmFtYS1DIDIxLjEgKFNjYW5kaXVtKSBpcyBvdXQuIERvd25sb2FkIGl0IGhlcmUuXQ0KaHR0 cDovL2ZyYW1hLWMuY29tL2luZGV4Lmh0bWwNCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDi lZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUg YSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sg YXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoN CiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmcNCg0K W3RoZSBhcmNoaXZlXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLw0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3MNCg0KW29ubGluZV0gaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mt d2Vla2x5Lw0KDQpbQWxhbiBTY2htaXR0XSBodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvDQoN Cg== --===-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 23 to 30, 2020.

finch - static site generator

roddy announced

Announcing finch, a simp= le static site generator. It uses content written as Markdown plus YAML frontmatter like Jekyll/Hugo etc. and produces output wi= th Jingoo templates. I= t also has some integrations with React (as in the JS library) in the form of Jingoo filters: the motivation behind it was to mak= e it easier to develop sites that use React just for some in some parts rather than structuring the whole site as= a single page application.

ANN: Releases of ringo

Rapha=C3=ABl Proust announced

Version 0.5 of ringo and ringo-lwt are now availa= ble in opam. Although this version changes ringo-lwt only, both packages are released anew to keep the version numbers in sy= nc. This version includes:

  • Improvement in documentation.
  • Simplifications and reduction in the memory footprint of lwt-wrapped ca= ches.
  • Fix for a race condition in the automatic cleanup (previously, on weak = caches only, a promise being rejected could cause a different promise to be= removed from the cache)
  • Fix a leak
  • More test, including a test for leakiness.

OCaml 4.11, first beta release

octachron announced

The release of OCaml 4.11.0 is approaching.

After three alpha releases, we have created a first beta version to help you adapt your software to the new features ahead of the release.

The compatibility of the opam ecosystem with OCaml 4.11.0 is currently quite good, and it should be possible to test this beta without too much trouble.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.11.0+beta1.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+beta1.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands.

opam switch create ocaml-variants.4.11.0+beta1=
 --repositories=3Ddefault,beta=3Dgit=
+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+beta1=
+VARIANT --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

We want to know about all bugs. Please report them here: https://github.com/ocaml= /ocaml/issues

If you are interested by the list of new features, and the on-going list of= bug fixes the updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

Compared to the last alpha release, this first beta release contains the fo= llowing new bug fixes:

Driver

  • #9011: Allow= linking .cmxa files with no units on MSVC by not requiring the .lib file t= o be present. (David Allsopp, report by Dimitry Bely, review by Xavier Lero= y)

Typechecker

  • #9384, #9385: Fix copy scope= bugs in substitutions (Leo White, review by Thomas Refis, report by Nick R= oberts)
  • #9695, #9702: no error when = opening an alias to a missing module (Jacques Garrigue, report and review b= y Gabriel Scherer)

Warnings

  • #7897, #9537: Fix warning 38= for rebound extension constructors (Leo White, review by Florian Angeletti= )
  • #9244: Fix s= ome missing usage warnings (Leo White, review by Florian Angeletti)

Toplevel

  • #9415: Treat= open struct as include struct in toplevel (Leo W= hite, review by Thomas Refis)
  • #9416: Avoid= warning 58 in flambda ocamlnat (Leo White, review by Florian Angeletti)

Flambda backend

  • #9163: Treat= loops properly in un_anf (Leo White, review by Mark Shinwell, Pierre Chamb= art and Vincent Laviron)

FlexDLL 0.38 released

David Allsopp announced

We are pleased to announce the release of FlexDLL 0.38!

FlexDLL provides a dlopen-like interface for Windows and is used to simplif= y the linking process for the native Windows ports of OCaml and to allow dynamic loading of C code (bytecode stu= b libraries and native Dynlink). It is also used for the same purpose in the Cygwin ports of OCaml, except that th= ey can be configured without shared library support.

The release includes various bugfixes as well as proper support for C++ lin= king on mingw and linking against data symbols in import libraries.

Please see the release page for more information.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--===-=-=-- --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 51202E0031 for ; Tue, 7 Jul 2020 12:04:52 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ufv1=AS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3A0ruj1hOUHMrttn/GDgol6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K//+pMbcNUDSrc9gkEXOFd2Cra4d1ayP7uu5ACRAuc/H7ClfNsQUFlcsso?= =?us-ascii?q?Y/p0QYGsmLCEn2frbBThcRO4B8bmJj5GyxKkNPGczzNBX4q3y26iMOSF2kbVIm?= =?us-ascii?q?buv6FZTPgMupyuu854PcYxlShDq6fLh+MAi6oR/eu8ULgIZuMLs9xxvGrndVZu?= =?us-ascii?q?hd2GdkKU6Okxrm6cq84Z5u/z5Mt/498sJLTLn3cbk/QbFEFjotLno75NfstRnN?= =?us-ascii?q?TAuP4mUTX2ALmRdWAAbL8Q/3UI7pviT1quRy1i+aPdbrTb8vQjSt871rSB7zhy?= =?us-ascii?q?gZMTMy7XzahdZxjKJfpxKhugB/zovJa4ybKPZyYqXQds4dSmRcQ8ZRTDRBDZ2g?= =?us-ascii?q?YIsTAeQBOuNYoJP8p1sIsBCyAQahCefqxjJOhnP43qs60/ogEQHd3QwvBNYOv2?= =?us-ascii?q?rJp9T7M6cSS/26zLLVxjnHYf5axTLx5Y7VeR4jvP6MR6p9f8rPx0cyGQ3LjVqf?= =?us-ascii?q?ppD+MjOQyugAqXKW4/Z8We+tjWMstgF/oiKoxscpkoTEmoYVxUrC9S5k3Yg6Od?= =?us-ascii?q?24SEt6Yd64DJtbqiaXOJFyQsw4RWFkoj06xaEGuZ6+fSgK1IgnygXHa/yAd4iJ?= =?us-ascii?q?4g7jW/iNLjd4gnJleau/hwus/kS6ze38TMa03U9MoyFYndbCqmoD2AbP6sibVP?= =?us-ascii?q?R95EGh1C6A2gzP9uxKL0A6m6rFJ5MuwrM+locfvETBEyLqhEn7kbGaelsl9+Wq?= =?us-ascii?q?6+rqfrXrq56BO4J6lgzzMrgjltK7DOk4NAUFQmaV+eO51LL5/E35Rq1HjuUona?= =?us-ascii?q?nFsZDaOdoUpra+Aw9Q14Ys9QyzDzG439QEhXUHK05KdwiCj4jtIV3OJ+r4Dfin?= =?us-ascii?q?j1SjkTdr2/TGMaf6DZnXL3jDl6/tfbl8605AyAoz0MtQ64hIBbEGJfL/QlTxtN?= =?us-ascii?q?3XDh8hNwy72eDnBM961oMEVmKDGrWWMLndsF+J+OIjOe6MZJUauDrlKvgl4eTu?= =?us-ascii?q?jX4jllMHc6mpx4MbaH+5HvR6J0WWe2Hjjs0dHmcNuwoyVOPqiFyeUT5Tena9RL?= =?us-ascii?q?gw5jA8CI6+DIfMW4CsgLiF3CuhGZ1WfG9GB1aRGnnrb4WJQ+oAZDyWL8N7jzAI?= =?us-ascii?q?SbesR5Uv2B2yrgP3xbVqIvLJ9iAWqJ7vzsZ56u3cmB0o6DB4E96R33yPQm1omG?= =?us-ascii?q?4DWiU407ploUNnz1eOyah4jOJcFdxU//5JVwg7OYPGw+xiDNDyXgLAfsuXR1m6?= =?us-ascii?q?QtWmBzAxTsssw9AQeUp9HM+ijh/b0yqrBb8aiaCLCYQp/q7C23X9Pdtxx2rJ2a?= =?us-ascii?q?U7gVQqXtFDOGOpi6Jn8gjcHY/Jk0GXl6awcqQc2TbA+nqfw2SToE1VSBNwUavb?= =?us-ascii?q?XXwCfkbbscn361vaT7+pDbQmMhdBxtCeJatKbN3pjExGROr9N9jEZGKxgWiwCA?= =?us-ascii?q?6SybOIdoXqfX8R3D7BB0gElgAT/GqGNRQlCyi6pGLeETpuGk7xbEP36+V+rXy2?= =?us-ascii?q?T0AuwwGNdU1h2KK5+gQJivyEV/MTwrUEtT89pDpuGVa928vaC96Bpwp6YKVRes?= =?us-ascii?q?g94VdC1WLBrQNxJJ2gL6Z4hl4faQt7pU3u1w8kQrlHxIIus3VghF52NqSw1ExH?= =?us-ascii?q?MTWVwca0cvfcNW+4tFj7YLHQ8lXfy8qNvKYD+fA87VL5s1ftXkEr9nEi19hOz1?= =?us-ascii?q?Od4I/LBUwcS9a5WUEy7zB+pqrGeW86/YnVyXRoP66k9DLfiPwzA+5w4xKpeZ9k?= =?us-ascii?q?O6OBFRPuW5kTA8Gobvchm12ocg4sJOdW5bI5NMOgduKb1eisJuk2z2HutnhO/I?= =?us-ascii?q?0oihHEzCF7UOOdgMdcnqOomzCfXjK5t2+P98D6nYcePmMXDjP50S/gFZJcba10?= =?us-ascii?q?fJ8WBCGpOcLln4wi1a6oYGZR8RuYP31DwNWgIEvAd1v5zBFd3kQRoGW6lG2/1T?= =?us-ascii?q?Mmymh4/Jra5zTHxqHZTDRCP2dKQGd4ilK1ftq+iM0cV0WzKQ11hF2i/0monqU?= =?us-ascii?q?=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BbAQDjRwRfhyIeaIFgFgYBAQEBAQEHA?= =?us-ascii?q?QESAQEEBAEBggqBI1hAAV1VMiyEMokBiROCDYU6jVGEA4EQA1AQAQMBBwUYAQ4?= =?us-ascii?q?FAQIEAQGGbwIdBgEFMxMCEAEBBQEBAQIBAwMEARMBAQEKCwkIKYU1BicMgjcMD?= =?us-ascii?q?AMDgx4DARgBCAQGOyojAxQBBgMCEQEXARQKAwETARIUBgGCQEsBgnwFCo0Km3p?= =?us-ascii?q?/M4Q6AQMFhESBMBANAhN/F4FTg2NGgmoIg1YmD4FMP4ERglsHbIF9SAwLAQEBA?= =?us-ascii?q?QGBFh0BBgEBBgQHgyUXgkkEjyAKBCQDaIoFh1OSTigHgl+BBwQLhjl8hi6EHYN?= =?us-ascii?q?Vgn+Cc4EaiBaFIo1YIZE5gWWFZgd6gVCFcYkngQ2ESIFAKoF4MxowQw0OA4JLC?= =?us-ascii?q?WANi3KCAwEzAReDToEGOIEmgSRRO4VEPzMCAQEOJQIGAQcBAQMJdQEBBRMLAY0?= =?us-ascii?q?AAQEmgh4BAQ?= X-IPAS-Result: =?us-ascii?q?A0BbAQDjRwRfhyIeaIFgFgYBAQEBAQEHAQESAQEEBAEBggq?= =?us-ascii?q?BI1hAAV1VMiyEMokBiROCDYU6jVGEA4EQA1AQAQMBBwUYAQ4FAQIEAQGGbwIdB?= =?us-ascii?q?gEFMxMCEAEBBQEBAQIBAwMEARMBAQEKCwkIKYU1BicMgjcMDAMDgx4DARgBCAQ?= =?us-ascii?q?GOyojAxQBBgMCEQEXARQKAwETARIUBgGCQEsBgnwFCo0Km3p/M4Q6AQMFhESBM?= =?us-ascii?q?BANAhN/F4FTg2NGgmoIg1YmD4FMP4ERglsHbIF9SAwLAQEBAQGBFh0BBgEBBgQ?= =?us-ascii?q?HgyUXgkkEjyAKBCQDaIoFh1OSTigHgl+BBwQLhjl8hi6EHYNVgn+Cc4EaiBaFI?= =?us-ascii?q?o1YIZE5gWWFZgd6gVCFcYkngQ2ESIFAKoF4MxowQw0OA4JLCWANi3KCAwEzARe?= =?us-ascii?q?DToEGOIEmgSRRO4VEPzMCAQEOJQIGAQcBAQMJdQEBBRMLAY0AAQEmgh4BAQ?= X-IronPort-AV: E=Sophos;i="5.75,323,1589234400"; d="asc'?scan'208,217";a="353812284" X-MGA-submission: =?us-ascii?q?MDF7OsUlU+u8wJsrjYTaCICSYf0/+4sIcMK5O7?= =?us-ascii?q?e4jDGsNnuHbFsV+ArokLvupuVdD6yA+2kZmnbKLK/ry3+sypG4DiXv5I?= =?us-ascii?q?GhjaDEi1ne7t5hhPuES0Ujb7n1LEzl76OEVqKC7WX3jWgn5wn+G9Mgbo?= =?us-ascii?q?X7Sf2p6OBDQBR4L86TGXKD+w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Jul 2020 12:04:49 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 00F43565A7D; Tue, 7 Jul 2020 12:04:46 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 07 Jul 2020 12:04:45 +0200 Message-ID: <87o8ormyiq.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 7 12:04:47 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=7852E565A7E X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl8ESL4ACgkQBA0KO07S 5ce/5QgAsTTm481rZPqUq/792kDNaRpPsvGleJGGobwewg4IZsdVIjExmTMrvpuc yet23zXlpL1iijsgcvZHNTmwDy3EM4kGpN2zcP85UcUq0gPY+h6AIKQBDY+eUiR4 RXZIWUX15Hc4DHcUbfhzjzdGhqAbsZa4MGNaZ4cBRaOJpcgdPrkhaaMuwniyh3Of y5T/906oy2vdXFGbBj9PQAfWSkgGlqWXRmseEiCih+98i5AzXs8A8mc4/kDd3Tzr 9YYDtxyg3ED7F1kKSBARyDAAgDVCMko8pGY/2RixIKbJbDEJe3Y1Mrdta8ooR/h8 NcbPAPu6LQvEI39FYlR9dFl7DmRwUA== =01eu -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 30 to July 07, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Releases of ringo Multicore OCaml: June 2020 Time expression demo Interactive OCaml development with utop in Emacs Old CWN Releases of ringo =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: [https://discuss.ocaml.org/t/ann-releases-of-ringo/5605/5] Continuing this thread, Rapha=C3=ABl Proust said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Ringo provides bounded-size key-value stores. More specifically, it provides a functor similar to `Hastbl.Make' except that the number of bindings held by the tables is limited: inserting additional bindings when the limit has been reached causes some previously inserted binding to be removed. More more specifically, Ringo provides a function `map_maker' that takes parameters to customise the policies that determine the behaviour of the cache when supernumerary bindings are inserted, and returns the functor described above. Once a module `Cache' is instantiated using this functor, it can be used as follows: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let cache =3D Cache.create size =E2=94=82 let fetch_data uri =3D =E2=94=82 match Cache.find_opt cache uri with =E2=94=82 | Some data -> data =E2=94=82 | None -> =E2=94=82 let data =3D really_fetch_data uri in =E2=94=82 Cache.replace cache uri data; =E2=94=82 data =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The cache will only hold up to [size] bindings, which avoids leaking memory. Additionally, the parameters for `map_maker' allow you to customise: =E2=80=A2 The replacement policy: which binding is removed when a supernumerary is inserted (currently supports least-recently used and first-in first-out). =E2=80=A2 The overflow policy: whether the cache can weakly hold some supernumerary elements (if so, the cache may hold more but the GC can always collect them if space is lacking). =E2=80=A2 The accounting precision: whether to keep precise track of removed/replaced elements. In addition, Ringo also provide set-caches: i.e., sets (rather than maps) with bounded size and all the same properties as above. Also note Ringo-Lwt (`ringo-lwt') provides Lwt wrappers around Ringo caches. If you have suggestions for a different concise synopsis for `opam', feel free to send them this way. Use cases are, I guess, caches. In particular those that might receive many elements not all of which you can hold in memory. We use it in a few places in the Tezos project to hold resources (blocks, operations, etc.) that are fetched from the P2p layer: it avoids having to fetch them again from the network. I think `anycache', `lru', and `lru-cache' are all alternatives available on opam. Rapha=C3=ABl Proust later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 The documentation is now available online at [https://nomadic-labs.gitlab.io/ringo/index.html] Of particular interest: =E2=80=A2 [The signature for a `ringo' key-value cache] =E2=80=A2 [The entry point for the `ringo' library] (allowing you to instantiate modules with the above signature as well as simple value caches) =E2=80=A2 [The signature for `ringo-lwt' cache] [The signature for a `ringo' key-value cache] https://nomadic-labs.gitlab.io/ringo/ringo/Ringo/module-type-CACHE_MAP/inde= x.html [The entry point for the `ringo' library] https://nomadic-labs.gitlab.io/ringo/ringo/Ringo/index.html [The signature for `ringo-lwt' cache] https://nomadic-labs.gitlab.io/ringo/ringo-lwt/Ringo_lwt/Sigs/module-type-C= ACHE_MAP/index.html Multicore OCaml: June 2020 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: [https://discuss.ocaml.org/t/multicore-ocaml-june-2020/6047/1] Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Welcome to the June 2020 [Multicore OCaml] report! As with [previous updates], many thanks to @shakthimaan and @kayceesrk for collating the updates for the month of June 2020. /This is an incremental update; new readers may find it helpful to flick through the previous posts first./ This month has seen a tremendous surge of activity on the upstream OCaml project to prepare for multicore integration, as @xavierleroy and the core team have driven a number of initiatives to prepare the OCaml project for the full multicore featureset. To reflect this, from next month we will have a status page on the ocaml-multicore wiki with the current status of both our multicore branch and the upstream OCaml project itself. Why not from this month? Well, there's good news and bad news. [Last month], I observed that we are a PR away from most of the opam ecosystem working with the multicore branch. The good news is that we are still a single PR away from it working, but it's a different one :-) The retrofitting of the `Threads' library has brought up [some design complexities], and so rather than putting in a "bandaid" fix, we are integrating a comprehensive solution that will work with system threads, domains and (eventually) fibres. That work has taken some time to get right, and I hope to be able to update you all on an opam-friendly OCaml 4.10.0+multicore in a few weeks. Aside from this, there have been a number of other improvements going into the multicore branches: [mingw Windows support], [callstack improvements], [fixing the Unix module] and so on. The full list is in the detailed report later in this update. [Multicore OCaml] https://github.com/ocaml-multicore/ocaml-multicore [previous updates] https://discuss.ocaml.org/tag/multicore-monthly [Last month] https://discuss.ocaml.org/t/multicore-ocaml-may-2020-update/5898 [some design complexities] https://github.com/ocaml-multicore/ocaml-multicore/pull/342 [mingw Windows support] https://github.com/ocaml-multicore/ocaml-multicore/pull/351 [callstack improvements] https://github.com/ocaml-multicore/ocaml-multicore/pull/363 [fixing the Unix module] https://github.com/ocaml-multicore/ocaml-multicore/pull/346 Sandmark benchmarks =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C A major milestone in this month has been the upgrade to the latest dune.2.6.0 to build Multicore OCaml 4.10.0 for the Sandmark benchmarking project. A number of new OPAM packages have been added, and the existing packages have been upgraded to their latest versions. The Multicore OCaml code base has seen continuous performance improvements and enhancements which can be observed from the various PRs mentioned in the report. We would like to thank: =E2=80=A2 @xavierleroy for working on a number of multicore-prequisite PR= s to make stock OCaml ready for Multicore OCaml. =E2=80=A2 @camlspotter has reviewed and accepted the camlimages changes a= nd made a release of camlimages.5.0.3 required for Sandmark. =E2=80=A2 @dinosaure for updating the decompress test benchmarks for Sand= mark to build and run with dune.2.6.0 for Multicore OCaml 4.10.0. A chapter on Parallel Programming in Multicore OCaml with topics on task pool, channels section, profiling with code examples is being written. We shall provide an early draft version of the document to the community for your valuable feedback. Papers =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Our "Retrofitting Parallism onto OCaml" paper has been officially accepted at [ICFP 2020] which will be held virtually between August 23-28, 2020. A [preprint] of the paper was made available earlier, and will be updated in a few days with the camera-ready version for ICFP. Please do feel free to send on comments and queries even after the paper is published, of course. Excitingly, another multicore-related paper on [Cosmo: A Concurrent Separation Logic for Multicore OCaml] will also be presented at the same conference. The Multicore OCaml updates are first listed in our report, which are followed by improvements to the Sandmark benchmarking project. Finally, the changes made to upstream OCaml which include both the ongoing and completed tasks are mentioned for your reference. [ICFP 2020] https://icfp20.sigplan.org/track/icfp-2020-papers#event-overview [preprint] https://arxiv.org/abs/2004.11663 [Cosmo: A Concurrent Separation Logic for Multicore OCaml] http://gallium.inria.fr/~fpottier/publis/mevel-jourdan-pottier-cosmo-2020.p= df Multicore OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml-multicore/ocaml-multicore#339] Proposal for domain-local storage An RFC proposal to implement a domain-local storage in Multicore OCaml. Kindly review the idea and share your feedback! =E2=80=A2 [ocaml-multicore/ocaml-multicore#342] Implementing the threads library with Domains An effort to rebase @jhwoodyatt's implementation of the Thread library for Domains. =E2=80=A2 [ocaml-multicore/ocaml-multicore#357] Implementation of systhre= ads with pthreads Exploring the possibilty of implementing systhreads with pthreads, while still maintaining compatibility with the existing solution. =E2=80=A2 [ocaml/dune#3548] Dune fails to pick up secondary compiler The `ocaml-secondary-compiler' fails to install with dune.2.6.0. This is required as Multicore OCaml cannot build the latest dune without systhreads support. [ocaml-multicore/ocaml-multicore#339] https://github.com/ocaml-multicore/ocaml-multicore/issues/339 [ocaml-multicore/ocaml-multicore#342] https://github.com/ocaml-multicore/ocaml-multicore/pull/342 [ocaml-multicore/ocaml-multicore#357] https://github.com/ocaml-multicore/ocaml-multicore/issues/357 [ocaml/dune#3548] https://github.com/ocaml/dune/issues/3548 =E2=97=8A Completed =E2=80=A2 [ocaml-multicore/multicore-opam#22] Update dune to 2.6.0 The dune version in the Multicore OPAM repository is now updated to use the latest 2.6.0. =E2=80=A2 [ocaml-multicore/ocaml-multicore#338] Introduce Lazy.try_force = and Lazy.try_force_val An implementation of `Lazy.try_force' and `Lazy.try_force_val' functions to implement concurrent lazy abstractions. =E2=80=A2 [ocaml-multicore/ocaml-multicore#340] Fix Atomic.exchange in concurrent_minor_gc A patch that introduces `Atomic.exchange' through `Atomic.get' that provides the appropriate read barrier for correct exchange semantics for `caml_atomic_exchange' in `memory.c'. =E2=80=A2 [ocaml-multicore/ocaml-multicore#343] Fix extcall noalloc DWARF The DWARF information emitted for `extcall noalloc' had broken backtraces and this PR fixes the same. =E2=80=A2 [ocaml-multicore/ocaml-multicore#345] Absolute exception stack The representation of the exception stack is changed from relative addressing to absolute addressing and the results are promising. The Sandmark serial benchmark results after the change is illustrated in the following graph: [https://aws1.discourse-cdn.com/standard11/uploads/ocaml/optimized/2X/b= /b385409b3f9e44cbfef98de668b0b4d0ed403472_2_1380x436.png] =E2=80=A2 [ocaml-multicore/ocaml-multicore#347] Turn on -Werror by default Adds a `--enable-warn-error' option to `configure' to treat C compiler warnings as errors. =E2=80=A2 [ocaml-multicore/ocaml-multicore#353] Poll for interrupts in cpu_relax without locking Use `Caml_check_gc_interrupt' first to poll for interrupts without locking, and then proceeding to handle the interrupt with the lock. =E2=80=A2 [ocaml-multicore/ocaml-multicore#354] Add Caml_state_field to domain_state.h The `Caml_state_field' macro definition in domain_state.h is required for base-v0.14.0 to build for Multicore OCaml 4.10.0 with dune.2.6.0. =E2=80=A2 [ocaml-multicore/ocaml-multicore#355] One more location to poll= for interrupts without lock Another use of `Caml_check_gc_interrupt' first to poll for interrupts without lock, similar to [ocaml-multicore/ocaml-multicore#353]. =E2=80=A2 [ocaml-multicore/ocaml-multicore#356] Backup threads for domain Introduces `backup threads' to perform GC and handle service interrupts when the domain is blocked in the kernel. =E2=80=A2 [ocaml-multicore/ocaml-multicore#358] Fix up bad CFI informatio= n in amd64.S Add missing `CFI_ADJUST' directives in `runtime/amd64.S' for `caml_call_poll' and `caml_allocN'. =E2=80=A2 [ocaml-multicore/ocaml-multicore#359] Inline caml_domain_alone The PR makes `caml_domain_alone' an inline function to improve performance for `caml_atomic_cas_field' and other atomics in `memory.c'. =E2=80=A2 [ocaml-multicore/ocaml-multicore#360] Parallel minor GC inline = mask rework The inline mask rework for the promotion path to the `parallel_minor_gc' branch gives a 3-5% performance improvement for `test_decompress' sandmark benchmark, and a decrease in the executed instructions for all other benchmarks. =E2=80=A2 [ocaml-multicore/ocaml-multicore#361] Mark stack push work cred= it The PR improves the Multicore mark work accounting to be in line with stock OCaml. =E2=80=A2 [ocaml-multicore/ocaml-multicore#362] Iloadmut does not clobber= rax and rdx when we do not have a read barrier A code clean-up to free the registers `rax' and `rdx' for OCaml code when `Iloadmut' is used. [ocaml-multicore/multicore-opam#22] https://github.com/ocaml-multicore/multicore-opam/pull/22 [ocaml-multicore/ocaml-multicore#338] https://github.com/ocaml-multicore/ocaml-multicore/pull/338 [ocaml-multicore/ocaml-multicore#340] https://github.com/ocaml-multicore/ocaml-multicore/pull/340 [ocaml-multicore/ocaml-multicore#343] https://github.com/ocaml-multicore/ocaml-multicore/pull/343 [ocaml-multicore/ocaml-multicore#345] https://github.com/ocaml-multicore/ocaml-multicore/pull/345 [ocaml-multicore/ocaml-multicore#347] https://github.com/ocaml-multicore/ocaml-multicore/pull/347 [ocaml-multicore/ocaml-multicore#353] https://github.com/ocaml-multicore/ocaml-multicore/pull/353 [ocaml-multicore/ocaml-multicore#354] https://github.com/ocaml-multicore/ocaml-multicore/pull/354 [ocaml-multicore/ocaml-multicore#355] https://github.com/ocaml-multicore/ocaml-multicore/pull/355 [ocaml-multicore/ocaml-multicore#356] https://github.com/ocaml-multicore/ocaml-multicore/pull/356 [ocaml-multicore/ocaml-multicore#358] https://github.com/ocaml-multicore/ocaml-multicore/pull/358 [ocaml-multicore/ocaml-multicore#359] https://github.com/ocaml-multicore/ocaml-multicore/pull/359 [ocaml-multicore/ocaml-multicore#360] https://github.com/ocaml-multicore/ocaml-multicore/pull/360 [ocaml-multicore/ocaml-multicore#361] https://github.com/ocaml-multicore/ocaml-multicore/pull/361 [ocaml-multicore/ocaml-multicore#362] https://github.com/ocaml-multicore/ocaml-multicore/pull/362 Benchmarking =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml-bench/sandmark#8] Ability to run compiler variants in Sandmark A feature to specify configure options when building compiler variants such as `flambda' is useful for development and testing. This feature is being worked upon. =E2=80=A2 [ocaml-bench/sandmark#107] Add Coq benchmarks We are continuing to add more benchmarks to Sandmark for Multicore OCaml and investigating adding the [Coq] benchmarks to our repertoire! =E2=80=A2 [ocaml-bench/sandmark#124] User configurable paramwrapper added= to Makefile A `PARAMWRAPPER' environment variable can be passed as an argument by specifying the `--cpu-list' to be used for parallel benchmark runs. =E2=80=A2 [ocaml-bench/sandmark#131] Update decompress benchmarks Thanks to @dinosaure for updating the decompress benchmarks in order to run them with dune.2.6.0 for Multicore OCaml 4.10.0. =E2=80=A2 [ocaml-bench/sandmark#132] Update dependency packages to use dune.2.6.0 and Multicore OCaml 4.10.0 Sandmark has been running with dune.1.11.4, and we need to move to the latest dune.2.6.0 for using Multicore OCaml 4.10.0 and beyond, as mentioned in [Promote dune to > 2.0]. The PR updates over 30 dependency packages and successfully builds both serial and parallel benchmarks! [ocaml-bench/sandmark#8] https://github.com/ocaml-bench/sandmark/issues/8 [ocaml-bench/sandmark#107] https://github.com/ocaml-bench/sandmark/issues/107 [Coq] https://coq.inria.fr/ [ocaml-bench/sandmark#124] https://github.com/ocaml-bench/sandmark/pull/124 [ocaml-bench/sandmark#131] https://github.com/ocaml-bench/sandmark/pull/131 [ocaml-bench/sandmark#132] https://github.com/ocaml-bench/sandmark/pull/132 [Promote dune to > 2.0] https://github.com/ocaml-bench/sandmark/issues/106 =E2=97=8A Completed =E2=80=A2 [camlspotter/camlimages#1] Use dune-configurator instead of configurator for camlimages A new release of `camlimages.5.0.3' was made by @camlspotter after accepting the changes to camlimages.opam in order to build with dune.2.6.0. =E2=80=A2 [ocaml-bench/sandmark#115] Task API Port: LU-Decomposition, Flo= yd Warshall, Mandelbrot, Nbody The changes to use the `Domainslib.Task' API for the listed benchmarks have been merged. =E2=80=A2 [ocaml-bench/sandmark#121] Mention sudo access for run_all_parallel.sh script The README.md file has been updated with the necessary `sudo' configuration steps to execute the `run_all_parallel.sh' script for nightly builds. =E2=80=A2 [ocaml-bench/sandmark#125] Add cubicle benchmarks The `German PFS' and `Szymanski's mutual exclusion algorithm' cubicle benchmarks have been included in Sandmark. =E2=80=A2 [ocaml-bench/sandmark#126] Update ocaml-versions README to refl= ect 4.10.0+multicore The README has now been updated to reflect the latest 4.10.0 Multicore OCaml compiler and its variants. =E2=80=A2 [ocaml-bench/sandmark#129] Add target to run parallel benchmark= s in the CI The .drone.yml file used by the CI has been updated to run both the serial and parallel benchmarks. =E2=80=A2 [ocaml-bench/sandmark#130] Add missing dependencies in multicore-numerical The `domainslib' library has been added to the dune file for the multicore-numerical benchmark. [camlspotter/camlimages#1] https://gitlab.com/camlspotter/camlimages/-/merge_requests/1 [ocaml-bench/sandmark#115] https://github.com/ocaml-bench/sandmark/pull/115 [ocaml-bench/sandmark#121] https://github.com/ocaml-bench/sandmark/pull/121 [ocaml-bench/sandmark#125] https://github.com/ocaml-bench/sandmark/pull/125 [ocaml-bench/sandmark#126] https://github.com/ocaml-bench/sandmark/pull/126 [ocaml-bench/sandmark#129] https://github.com/ocaml-bench/sandmark/pull/129 [ocaml-bench/sandmark#130] https://github.com/ocaml-bench/sandmark/pull/130 OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ongoing =E2=80=A2 [ocaml/ocaml#9541] Add manual page for the instrumented runtime The [instrumented runtime] has been merged to OCaml 4.11.0. A manual for the same has been created and is under review. =E2=80=A2 [sadigqj/ocaml#1] GC colours change This PR removes the grey colour used in stock OCaml to match the scheme used by the Multicore major collector. The performance and considerations are included for review. [ocaml/ocaml#9541] https://github.com/ocaml/ocaml/pull/9541 [instrumented runtime] https://github.com/ocaml/ocaml/pull/9082 [sadigqj/ocaml#1] https://github.com/sadiqj/ocaml/pull/1 =E2=97=8A Completed =E2=80=A2 [ocaml/ocaml#9619] A self-describing representation for function closures The PR provides a way to record the position of the environment for each entry point for function closures. =E2=80=A2 [ocaml/ocaml#9649] Marshaling for the new closure representation The `output_value' marshaler has been updated to use the new closure representation. There is no change required for the `input_value' unmarshaler. =E2=80=A2 [ocaml/ocaml#9655] Introduce type Obj.raw_data and functions Obj.raw_field, Obj.set_raw_field to manipulate out-of-heap pointers The PR introduces a type `Obj.bits', and functions `Obj.field_bits' and `Obj.set_field_bits' to read and write bit representation of block fields to support the no-naked-pointer operation. =E2=80=A2 [ocaml/ocaml#9678] Reimplement Obj.reachable_word using a hash = table to detect sharing The `caml_obj_reachable_words' now uses a hash table instead of modifying the mark bits of block headers to detect sharing. This is required for compatibility with Multicore OCaml. =E2=80=A2 [ocaml/ocaml#9680] Naked pointers and the bytecode interpreter The bytecode interpreter implementation is updated to support the no-naked-pointers mode operation as required by Multicore OCaml. =E2=80=A2 [ocaml/ocaml#9682] Signal handling in native code without the p= age table The patch uses the code fragment table instead of a page table lookup for signal handlers to know whether the signal came from ocamlopt-generated code. =E2=80=A2 [ocaml/ocaml#9683] globroots.c: adapt to no-naked-pointers mode The patch considers out-of-heap pointers as major-heap pointers in no-naked-pointers mode for global roots management. =E2=80=A2 [ocaml/ocaml#9689] Generic hashing for the new closure representation The hashing functions have been updated to use the latest closure representation from [ocaml/ocaml#9619] for the no-naked-pointers mode. =E2=80=A2 [ocaml/ocaml#9698] The end of the page table is near The PR eliminates some of the use of the page tables in the runtime system when built with no-naked-pointers mode. Our thanks to all the OCaml developers and users in the community for their continued support and contribution to the project. Stay safe! [ocaml/ocaml#9619] https://github.com/ocaml/ocaml/pull/9619 [ocaml/ocaml#9649] https://github.com/ocaml/ocaml/pull/9649 [ocaml/ocaml#9655] https://github.com/ocaml/ocaml/pull/9655 [ocaml/ocaml#9678] https://github.com/ocaml/ocaml/pull/9678 [ocaml/ocaml#9680] https://github.com/ocaml/ocaml/pull/9680 [ocaml/ocaml#9682] https://github.com/ocaml/ocaml/pull/9682 [ocaml/ocaml#9683] https://github.com/ocaml/ocaml/pull/9683 [ocaml/ocaml#9689] https://github.com/ocaml/ocaml/pull/9689 [ocaml/ocaml#9698] https://github.com/ocaml/ocaml/pull/9698 Acronyms =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 API: Application Programming Interface =E2=80=A2 CFI: Call Frame Information =E2=80=A2 CI: Continuous Integration =E2=80=A2 DWARF: Debugging With Attributed Record Formats =E2=80=A2 GC: Garbage Collector =E2=80=A2 ICFP: International Conference on Functional Programming =E2=80=A2 OPAM: OCaml Package Manager =E2=80=A2 PR: Pull Request =E2=80=A2 RFC: Request for Comments Time expression demo =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/time-expression-demo/6052/1] Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 An interactive demo for a small part of our time stuff and schedule handling library is available here: [https://daypack-dev.github.io/time-expr-demo/] Time expression is in essence a language for specifying time points or time slots precisely and concisely, while trying to mimic natural language. The implementation of the demo core itself can be seen here: [https://github.com/daypack-dev/time-expr-demo/blob/master/src/demo.ml] , where the usage of Daypack-lib is shown. Lastly, the library is still a prototype, so expect some faults in the outputs of the demo here and there. Interactive OCaml development with utop in Emacs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/interactive-ocaml-development-with-utop-in-e= macs/6058/1] Samarth Kishor announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I made a [blog post] about REPL driven development with utop in Emacs a few months ago. Please let me know if you found it useful or have anything to add! I'm a bit new to OCaml so any feedback helps. There was a [similar post about REPL driven development] last year and my post addresses a lot of those points. I wish I'd seen that post before I wrote this since there's a ton of useful information in the comments. [blog post] https://samarthkishor.github.io/posts/interactive_ocaml_development/ [similar post about REPL driven development] https://discuss.ocaml.org/t/ocaml-repl-driven-development/4068 Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] mailto:alan.schmitt@polytechnique.org [the archive] http://alan.petitepomme.net/cwn/ [RSS feed of the archives] http://alan.petitepomme.net/cwn/cwn.rss [online] http://lists.idyll.org/listinfo/caml-news-weekly/ [Alan Schmitt] http://alan.petitepomme.net/ --===-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 30 to July 07, 2= 020.

Releases of ringo

Continuing this thread, Rapha=C3=ABl Proust said

Ringo provides bounded-size key-value stores. More specifically, it provide= s a functor similar to Hastbl.Make except that the number of bindings held by the tables is limited: inserting= additional bindings when the limit has been reached causes some previously inserted binding to be removed.

More more specifically, Ringo provides a function map_maker th= at takes parameters to customise the policies that determine the behaviour of the cache when supernumerary bindings are insert= ed, and returns the functor described above. Once a module Cache is instantiated using this functor,= it can be used as follows:

let cache =3D Cache.create size
let fetch_data uri<=
/span> =3D
  match Cache.find_opt cache uri with
  | Some =
data -> data
  | None =
->
    let data =3D really_fetch_data uri in
    Cache.replace cache uri data;
    data

The cache will only hold up to [size] bindings, which avoids leaking memory= . Additionally, the parameters for map_maker allow you to customise:

  • The replacement policy: which binding is removed when a supernumerary i= s inserted (currently supports least-recently used and first-in first-out).=
  • The overflow policy: whether the cache can weakly hold some supernumera= ry elements (if so, the cache may hold more but the GC can always collect t= hem if space is lacking).
  • The accounting precision: whether to keep precise track of removed/repl= aced elements.

In addition, Ringo also provide set-caches: i.e., sets (rather than maps) w= ith bounded size and all the same properties as above.

Also note Ringo-Lwt (ringo-lwt) provides Lwt wrappers around R= ingo caches.

If you have suggestions for a different concise synopsis for opam, feel free to send them this way.

Use cases are, I guess, caches. In particular those that might receive many= elements not all of which you can hold in memory. We use it in a few places in the Tezos project to hold resources (b= locks, operations, etc.) that are fetched from the P2p layer: it avoids having to fetch them again from the network.

I think anycache, lru, and lru-cache= are all alternatives available on opam.

Rapha=C3=ABl Proust later added

The documentation is now available online at https://nomadic-labs.gitlab.io/ringo/index.ht= ml

Of particular interest:

Multicore OCaml: June 2020

Anil Madhavapeddy announced

Welcome to the June 2020 Multicore OCaml report! As with previous update= s, many thanks to @shakthimaan and @kayceesrk for collating the updates for the month of June 2020. This is an incremental= update; new readers may find it helpful to flick through the previous posts first.

This month has seen a tremendous surge of activity on the upstream OCaml pr= oject to prepare for multicore integration, as @xavierleroy and the core team have driven a number of init= iatives to prepare the OCaml project for the full multicore featureset. To reflect this, from next month we will ha= ve a status page on the ocaml-multicore wiki with the current status of both our multicore branch and the upstream = OCaml project itself.

Why not from this month? Well, there's good news and bad news. Last month, I observed that we are a PR away from most of the opam ecosystem working with the multicore branch. The good news is = that we are still a single PR away from it working, but it's a different one :-) The retrofitting of the Threads= library has brought up some design complexities, and so rather than putting in a "bandaid" fix, we are integrating a comprehensive solution that will work with system= threads, domains and (eventually) fibres. That work has taken some time to get right, and I hope to be able to update= you all on an opam-friendly OCaml 4.10.0+multicore in a few weeks.

Aside from this, there have been a number of other improvements going into = the multicore branches: mingw Windows support, callstack improvements, fixing the Unix module and so on. The full list is in the detailed report later in this update.

Sandmark benchmarks

A major milestone in this month has been the upgrade to the latest dune.2.6.0 to build Multicore OCaml 4.10.0 for the Sandmark benchmarking project. A number of new OPAM packages have been added, and the existing packages have been upgraded to their latest versions. The Multicore OCaml code base has seen continuous performance improvements and enhancements which can be observed from the various PRs mentioned in the report.

We would like to thank:

  • @xavierleroy for working on a number of multicore-prequisite PRs to mak= e stock OCaml ready for Multicore OCaml.
  • @camlspotter has reviewed and accepted the camlimages changes and made = a release of camlimages.5.0.3 required for Sandmark.
  • @dinosaure for updating the decompress test benchmarks for Sandmark to = build and run with dune.2.6.0 for Multicore OCaml 4.10.0.

A chapter on Parallel Programming in Multicore OCaml with topics on task pool, channels section, profiling with code examples is being written. We shall provide an early draft version of the document to the community for your valuable feedback.

Papers

Our "Retrofitting Parallism onto OCaml" paper has been officially accepted at ICFP 2020 which will be held virtually between August 23-28, 2020. A preprint of the paper was made available earlier, and will be updated in a few days with the camera-ready version fo= r ICFP. Please do feel free to send on comments and queries even after the paper is published, of course.

Excitingly, another multicore-related paper on Cosmo: A Conc= urrent Separation Logic for Multicore OCaml will also be presented at the same conference.

The Multicore OCaml updates are first listed in our report, which are follo= wed by improvements to the Sandmark benchmarking project. Finally, the changes made to upstream OCaml which inc= lude both the ongoing and completed tasks are mentioned for your reference.

Multicore OCaml

  • Ongoing
    • o= caml-multicore/ocaml-multicore#339 Proposal for domain-local storage

      An RFC proposal to implement a domain-local storage in Multicore OCaml. Kin= dly review the idea and share your feedback!

    • oca= ml-multicore/ocaml-multicore#342 Implementing the threads library with Domains

      An effort to rebase @jhwoodyatt's implementation of the Thread library for Domains.

    • o= caml-multicore/ocaml-multicore#357 Implementation of systhreads with pthreads

      Exploring the possibilty of implementing systhreads with pthreads, while still maintaining compatibility with the existing solution.

    • ocaml/dune#3548 Dune fails to pick up secondary compiler

      The ocaml-secondary-compiler fails to install with dune.2.6.0.= This is required as Multicore OCaml cannot build the latest dune without systhreads support.

  • Completed
    • ocaml= -multicore/multicore-opam#22 Update dune to 2.6.0

      The dune version in the Multicore OPAM repository is now updated to use the latest 2.6.0.

    • oca= ml-multicore/ocaml-multicore#338 Introduce Lazy.try_force and Lazy.try_force_val

      An implementation of Lazy.try_force and Lazy.try_force_v= al functions to implement concurrent lazy abstractions.

    • oca= ml-multicore/ocaml-multicore#340 Fix Atomic.exchange in concurrent_minor_gc

      A patch that introduces Atomic.exchange through Atomic.g= et that provides the appropriate read barrier for correct exchange semantics for caml_atomic_exchange in memory.c.

    • oca= ml-multicore/ocaml-multicore#343 Fix extcall noalloc DWARF

      The DWARF information emitted for extcall noalloc had broken backtraces and this PR fixes the same.

    • oca= ml-multicore/ocaml-multicore#345 Absolute exception stack

      The representation of the exception stack is changed from relative addressing to absolute addressing and the results are promising. The Sandmark serial benchmark results after the change is illustrated in the following graph:

      3D"=

    • oca= ml-multicore/ocaml-multicore#347 Turn on -Werror by default

      Adds a --enable-warn-error option to configure to= treat C compiler warnings as errors.

    • oca= ml-multicore/ocaml-multicore#353 Poll for interrupts in cpu_relax without locking

      Use Caml_check_gc_interrupt first to poll for interrupts witho= ut locking, and then proceeding to handle the interrupt with the lock.

    • oca= ml-multicore/ocaml-multicore#354 Add Caml_state_field to domain_state.h

      The Caml_state_field macro definition in domain_state.h is required for base-v0.14.0 to build for Multicore OCaml 4.10.0 with dune.2.6.0.

    • oca= ml-multicore/ocaml-multicore#355 One more location to poll for interrupts without lock

      Another use of Caml_check_gc_interrupt first to poll for interrupts without lock, similar to oca= ml-multicore/ocaml-multicore#353.

    • oca= ml-multicore/ocaml-multicore#356 Backup threads for domain

      Introduces backup threads to perform GC and handle service interrupts when the domain is blocked in the kernel.

    • oca= ml-multicore/ocaml-multicore#358 Fix up bad CFI information in amd64.S

      Add missing CFI_ADJUST directives in runtime/amd64.S for caml_call_poll and caml_allocN.

    • oca= ml-multicore/ocaml-multicore#359 Inline caml_domain_alone

      The PR makes caml_domain_alone an inline function to improve performance for caml_atomic_cas_field and other atomics in memory.c.

    • oca= ml-multicore/ocaml-multicore#360 Parallel minor GC inline mask rework

      The inline mask rework for the promotion path to the parallel_minor_gc branch gives a 3-5% performance improvement = for test_decompress sandmark benchmark, and a decrease in the exec= uted instructions for all other benchmarks.

    • oca= ml-multicore/ocaml-multicore#361 Mark stack push work credit

      The PR improves the Multicore mark work accounting to be in line with stock OCaml.

    • oca= ml-multicore/ocaml-multicore#362 Iloadmut does not clobber rax and rdx when we do not have a read barrier

      A code clean-up to free the registers rax and rdx= for OCaml code when Iloadmut is used.

Benchmarking

  • Ongoing
    • ocaml-bench/sa= ndmark#8 Ability to run compiler variants in Sandmark

      A feature to specify configure options when building compiler variants such as flambda is useful for development and testing. This feature is being worked upon.

    • ocaml-bench/= sandmark#107 Add Coq benchmarks

      We are continuing to add more benchmarks to Sandmark for Multicore OCaml and investigating adding the Coq benchmarks to our repertoire!

    • ocaml-bench/sa= ndmark#124 User configurable paramwrapper added to Makefile

      A PARAMWRAPPER environment variable can be passed as an argume= nt by specifying the --cpu-list to be used for parallel benchmark runs.

    • ocaml-bench/sa= ndmark#131 Update decompress benchmarks

      Thanks to @dinosaure for updating the decompress benchmarks in order to run them with dune.2.6.0 for Multicore OCaml 4.10.0.

    • ocaml-bench/sa= ndmark#132 Update dependency packages to use dune.2.6.0 and Multicore OCaml 4.10.0

      Sandmark has been running with dune.1.11.4, and we need to move to the latest dune.2.6.0 for using Multicore OCaml 4.10.0 and beyond, as mentioned in Promote dune to > 2.0. The PR updates over 30 dependency packages and successfully builds both serial and parallel benchmarks!

  • Completed
    • ca= mlspotter/camlimages#1 Use dune-configurator instead of configurator for camlimages

      A new release of camlimages.5.0.3 was made by @camlspotter aft= er accepting the changes to camlimages.opam in order to build with dune.2.6.0.

    • ocaml-bench/sa= ndmark#115 Task API Port: LU-Decomposition, Floyd Warshall, Mandelbrot, Nbody

      The changes to use the Domainslib.Task API for the listed benc= hmarks have been merged.

    • ocaml-bench/sa= ndmark#121 Mention sudo access for run_all_parallel.sh script

      The README.md file has been updated with the necessary sudo configuration steps to execute the run_all_parallel.sh script = for nightly builds.

    • ocaml-bench/sa= ndmark#125 Add cubicle benchmarks

      The German PFS and Szymanski's mutual exclusion algorith= m cubicle benchmarks have been included in Sandmark.

    • ocaml-bench/sa= ndmark#126 Update ocaml-versions README to reflect 4.10.0+multicore

      The README has now been updated to reflect the latest 4.10.0 Multicore OCaml compiler and its variants.

    • ocaml-bench/sa= ndmark#129 Add target to run parallel benchmarks in the CI

      The .drone.yml file used by the CI has been updated to run both the serial and parallel benchmarks.

    • ocaml-bench/sa= ndmark#130 Add missing dependencies in multicore-numerical

      The domainslib library has been added to the dune file for the multicore-numerical benchmark.

OCaml

  • Ongoing
    • ocaml/ocaml#9541 Add manual page for the instrumented runtime

      The instrumented runti= me has been merged to OCaml 4.11.0. A manual for the same has been created and is under review.

    • sadigqj/ocaml#1 GC colours change

      This PR removes the grey colour used in stock OCaml to match the scheme used by the Multicore major collector. The performance and considerations are included for review.

  • Completed
    • ocaml/ocaml#9619 A self-describing representation for function closures

      The PR provides a way to record the position of the environment for each entry point for function closures.

    • ocaml/ocaml#9649 Marshaling for the new closure representation

      The output_value marshaler has been updated to use the new clo= sure representation. There is no change required for the input_value unmarshaler.

    • ocaml/ocaml#9655 Introduce type Obj.raw_data and functions Obj.raw_field, Obj.set_raw_field to manipulate out-of-heap pointers

      The PR introduces a type Obj.bits, and functions Obj.fie= ld_bits and Obj.set_field_bits to read and write bit representation of block fields to support the no-naked-pointer operation.

    • ocaml/ocaml#9678 Reimplement Obj.reachable_word using a hash table to detect sharing

      The caml_obj_reachable_words now uses a hash table instead of modifying the mark bits of block headers to detect sharing. This is required for compatibility with Multicore OCaml.

    • ocaml/ocaml#9680 Naked pointers and the bytecode interpreter

      The bytecode interpreter implementation is updated to support the no-naked-pointers mode operation as required by Multicore OCaml.

    • ocaml/ocaml#9682 Signal handling in native code without the page table

      The patch uses the code fragment table instead of a page table lookup for signal handlers to know whether the signal came from ocamlopt-generated code.

    • ocaml/ocaml#9683 globroots.c: adapt to no-naked-pointers mode

      The patch considers out-of-heap pointers as major-heap pointers in no-naked-pointers mode for global roots management.

    • ocaml/ocaml#9689 Generic hashing for the new closure representation

      The hashing functions have been updated to use the latest closure representation from ocaml/ocaml#9619 f= or the no-naked-pointers mode.

    • ocaml/ocaml#9698 The end of the page table is near

      The PR eliminates some of the use of the page tables in the runtime system when built with no-naked-pointers mode.

    Our thanks to all the OCaml developers and users in the community for their continued support and contribution to the project. Stay safe!

Acronyms

  • API: Application Programming Interface
  • CFI: Call Frame Information
  • CI: Continuous Integration
  • DWARF: Debugging With Attributed Record Formats
  • GC: Garbage Collector
  • ICFP: International Conference on Functional Programming
  • OPAM: OCaml Package Manager
  • PR: Pull Request
  • RFC: Request for Comments

Time expression demo

Darren announced

An interactive demo for a small part of our time stuff and schedule handlin= g library is available here: https://daypack-d= ev.github.io/time-expr-demo/

Time expression is in essence a language for specifying time points or time= slots precisely and concisely, while trying to mimic natural language.

The implementation of the demo core itself can be seen here: https://github.com/daypack-dev/time-expr-demo/blob/master/src/demo.m= l , where the usage of Daypack-lib is shown.

Lastly, the library is still a prototype, so expect some faults in the outp= uts of the demo here and there.

Interactive OCaml development with ut= op in Emacs

Samarth Kishor announced

I made a blog post about REPL driven development with utop in Emacs a few months ago. Please let me know if you = found it useful or have anything to add! I'm a bit new to OCaml so any feedback helps.

There was a similar post about REPL driven development last year and my post addresses a lot of those points. I wish I'd seen that post before I wrote this since there's a= ton of useful information in the comments.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--===-=-=-- --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C0F56E259C for ; Tue, 14 Jul 2020 11:55:11 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=peff=AZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AxA7J1x3pIs0MGDe/smDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?sesULfvxwZ3uMQTl6Ol3ixeRBMOHsqwC0LKd6fiocFdDyK7JiGoFfp1IWk1Nou?= =?us-ascii?q?QttCtkPvS4D1bmJuXhdS0wEZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZr?= =?us-ascii?q?KeTpAI7SiNm82/yv95HJbAhEmTuwbal8IRmqogndqNUaipZ+J6gszRfEvmFGcP?= =?us-ascii?q?lMy2NyIlKTkRf85sOu85Nm7i9dpfEv+dNeXKvjZ6g3QqBWAzogM2Au+c3krgLD?= =?us-ascii?q?QheV5nsdSWoZjBxFCBXY4R7gX5fxtiz6tvdh2CSfIMb7Q6w4VSik4qx2SBPmiy?= =?us-ascii?q?EHNyA48GHMi8x/l6Zbrwy8rB1xxI7UepyaNOFjda/Zc94WWW9NU8BMXCJDH4y8?= =?us-ascii?q?dZMCAeofM+hFoYfzpFQBogelCAa2GO/i0CVFimPq0aA41ekqDAHI3BYnH9ILqH?= =?us-ascii?q?nZsNH1O70UUeuo0afH0TXDb/ZX2Tfh9IjDbxcsruuIXb1qd8rd01IvGB/FjlWV?= =?us-ascii?q?qIzlIy+V2/8Vs2ic6+phVf6vhHA7pAFxpDivx94sipTXiY4PzVDE7yp5zZ8zKN?= =?us-ascii?q?alR0F1fcSqH4FMtyGGKYR2WMUiTnl1tCs5yLALuIO3cicXxZg72xPRZPyKfoaI?= =?us-ascii?q?7BztVeucPzd2iW9ldr+wiRu/8UytxvPzWMSw0ltHsytIn8TOu3wR0RHY98aJSv?= =?us-ascii?q?x4/ki72DaP0Rje6vlaLkAolKrbN4AuwqY3lpoWtETMADX6mEPog6+Kbkkk/fSn?= =?us-ascii?q?5P7iYrXivJOcMJV0ig7mPqQhm8y/HeQ4MhUVUGSB5eu807jj8VX4QLVMlP02k7?= =?us-ascii?q?PWvIrUJcQBvqK5DA5V0poj6xaiFDiqys4UkmUALFJAYB6Hl5LpNEvBIPDgF/e/?= =?us-ascii?q?hFusnC13yPDBO73tGo/NIWbZn7f6erZ97UtcyA4zzdBC/J1YEK0OIPX2WkPprN?= =?us-ascii?q?zXFAM2Mw+ow+b/FdVyzZkSVn6IAq+cKK/SsEKH5+IrI+mIfoMVvyz9K/cj6vXz?= =?us-ascii?q?jnE5gUcQcbS30ZYTcny0A+hqLkqDbXfintsNC2kHswUmQOHoi1COSyBfanmsU6?= =?us-ascii?q?4m+z02B5iqAZrMS4yxhrGKwT21EYdMZm9cD1CBCXfoeJuAW/cLcC+SJ8BgniEe?= =?us-ascii?q?Wbi5TI8h0RGvtBPkxLV7LurU/CwYtYv+1Ndr/eHTkgsy9TNsA8Sc1WGCUX10k3?= =?us-ascii?q?sVSzMo2K1zu1FxxkuM3KRijfFUCcZf6v1GXwsiMJ7T1e16C9T8WgLbedeJTU6r?= =?us-ascii?q?TMi6Dz8sUt4828cObFhzG9Wslh3OwymlDqcNl7yMAJw18r7c0GbtKMZ9zXbG1b?= =?us-ascii?q?Ahj0Q4TcdVMm2mnKF/+hDJCI7NiUqZkbymdb8A0y7N8WeDzHaOvF1DXQFrVqXF?= =?us-ascii?q?QHYfaVfIotTi/E/CSrCjCLs9PgtG086CJbNGasf1glVeWPfjJNPebnqtlGiqAB?= =?us-ascii?q?aIwqqAbI7re2UGwCXQE1MEkgAW/XaeLwcyHCaho2TEDDxvD13jeU3s8fMt4E+8?= =?us-ascii?q?GwUw0AfAJxllyLyd/gETw/qRV6VXlvgPpyFr430gF0m799bXEMab4QttbaFYJ9?= =?us-ascii?q?Qn7wEDnWnQsgg4Op27M4hjgEQfekJ5pQem3BJyEq1EkNM2tzUt1gBzNauc3lRR?= =?us-ascii?q?MT6Fjr7qPbiCA237+liUYK7T203CmIKf/q4Jru8zq1DioB2BDk0m4mlq2NlT0m?= =?us-ascii?q?KB69PNFgVEAsG5aVo+6xUv/+KSWSI6/Y6BjiU1bPuE9wTa0tdsP9MLjxate9AF?= =?us-ascii?q?a/GBBFa0C8oeFtSjI+wsmkG0Y1QDJu8ArfdobfPjTOOP3euQBMglhCiv1DUV+I?= =?us-ascii?q?d5w16B/Cp6S/fV0tAC2f7Kh1LWBQe5t0+ot4XMoa4BYDgTGmSlzi29W9xbYbB0?= =?us-ascii?q?dosQT2LyM4uw3Nos3pM=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AXAgC0gA1fcyIeaIFgHQEBAQEJARIBB?= =?us-ascii?q?QUBggqBI1hAAV1VMiyEM4FdhySLJwKFOY1UhRQDYAEDAQwYAQ4FAQIEAQGDF4N?= =?us-ascii?q?TAh0GAQUzEwIQAQEFAQEBAgEDAwQBEwEMCwkIhgsMgjcMGYMbASEKRx4jAxQHA?= =?us-ascii?q?wIRARcBFAoXARIagw2CfAQBCoxwm3qBMoQ6AQMDEAEOCYRGgUANAhN/F4U5R4J?= =?us-ascii?q?uCINWJg+BTD+BEYJibIJFDAsBAQEBAYE6AQGDNheCSQSPOiZpkWGSUygHgmCBB?= =?us-ascii?q?wQLhkF8ilGGV4J1gR6IG5MFIZFQgWaFbAdygVmFdIo9hEmBQCqBejMaMEOCaQl?= =?us-ascii?q?gDY17LxeBAgEJgkKBPoMbO4VEPzMCAQEBMgIGAQcBAQMJdQEBBRMLAY84BQEB?= X-IPAS-Result: =?us-ascii?q?A0AXAgC0gA1fcyIeaIFgHQEBAQEJARIBBQUBggqBI1hAAV1?= =?us-ascii?q?VMiyEM4FdhySLJwKFOY1UhRQDYAEDAQwYAQ4FAQIEAQGDF4NTAh0GAQUzEwIQA?= =?us-ascii?q?QEFAQEBAgEDAwQBEwEMCwkIhgsMgjcMGYMbASEKRx4jAxQHAwIRARcBFAoXARI?= =?us-ascii?q?agw2CfAQBCoxwm3qBMoQ6AQMDEAEOCYRGgUANAhN/F4U5R4JuCINWJg+BTD+BE?= =?us-ascii?q?YJibIJFDAsBAQEBAYE6AQGDNheCSQSPOiZpkWGSUygHgmCBBwQLhkF8ilGGV4J?= =?us-ascii?q?1gR6IG5MFIZFQgWaFbAdygVmFdIo9hEmBQCqBejMaMEOCaQlgDY17LxeBAgEJg?= =?us-ascii?q?kKBPoMbO4VEPzMCAQEBMgIGAQcBAQMJdQEBBRMLAY84BQEB?= X-IronPort-AV: E=Sophos;i="5.75,350,1589234400"; d="scan'208,217";a="459675857" X-MGA-submission: =?us-ascii?q?MDG1ifjcHCrz7PjA7m6iaRhEU/gii/O8W+lrMU?= =?us-ascii?q?JAJVCFzpELlLfHo9JcqY/prpsZ/1YRmCESk3qrcHbTKnalT60gW7lqOp?= =?us-ascii?q?IqQwMYXssJPBaI9K/AAQNeZmJ4RZ5LI4JfFYHzpK4VPKGN2FfyVPHAce?= =?us-ascii?q?dYeDKIIKUyg1kigNraOgD/ew=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Jul 2020 11:54:21 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B3E1A5654BC; Tue, 14 Jul 2020 11:54:19 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 14 Jul 2020 11:54:19 +0200 Message-ID: <87a702l8vo.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 14 11:54:20 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=40A675654BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 07 to 14, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml 4.11.0, second beta release letters - simple client abstractions for sending emails over SMTP A question about Ocaml Alcotest 1.2.0 Set up OCaml 1.1.0 Old CWN OCaml 4.11.0, second beta release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/ocaml-4-11-0-second-beta-release/6063/1] octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml 4.11.0 is approaching. As one step further in this direction, we have published a second beta release. This new release fixes an MSVC-specific runtime issue. The compatibility of the opam ecosystem with OCaml 4.11.0 is currently quite good with only 7 packages not currently available, and it should be possible to test this beta without too much trouble. The source code is available at these addresses: [https://github.com/ocaml/ocaml/archive/4.11.0+beta2.tar.gz] [https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+beta2.tar.gz] The compiler can also be installed as an OPAM switch with one of the following commands: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create ocaml-variants.4.11.0+beta2 --repositories= =3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create ocaml-variants.4.11.0+beta2+ --repo= sitories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repositor= y.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where you replace with one of these: afl, flambda, fp, fp+flambda We would love to hear about any bugs. Please report them here: [https://github.com/ocaml/ocaml/issues] If you are interested by the list of new features, and the on-going list of bug fixes the updated change log for OCaml 4.11.0 is available at: [https://github.com/ocaml/ocaml/blob/4.11/Changes] Compared to the previous beta release, the exhaustive list of changes is as follows: Runtime =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [#9714], [#9724]: Use the C++ alignas keyword when compiling in C++. Fixes a bug with MSVC C++ 2015/2017. Add a terminator to the `caml_domain_state' structure to better ensure that members are correctly spaced. (Antonin D=C3=A9cimo, review by David Allsopp and Xavier Leroy) [#9714] https://github.com/ocaml/ocaml/issues/9714 [#9724] https://github.com/ocaml/ocaml/issues/9724 Manual and documentation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [#8644]: fix formatting comment about @raise in stdlib's mli fi= les (=C3=89lie Brami, review by David Allsopp) =E2=80=A2 [#9712]: Update the version format to allow "`". The new format= is "major.minor[.patchlevel][(+|')additional-info]", for instance "4.12.0~beta1+flambda". This is a documentation-only change for the 4.11 branch, the new format will be used starting with the 4.12 branch. (Florian Angeletti, review by Damien Doligez and Xavier Leroy) [#8644] https://github.com/ocaml/ocaml/issues/8644 [#9712] https://github.com/ocaml/ocaml/issues/9712 letters - simple client abstractions for sending emails over SMTP =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/ann-letters-simple-client-abstractions-for-s= ending-emails-over-smtp/6071/1] Miko announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Earlier today I've published the first release of [letters]. This library aims to provide simple to use client library for sending emails over SMTP using _lwt_ for async execution. It is build on top of _mrmime_ and _colombe_. While these libraries are very capable, they aren't that simple to use, _letters_ is trying to fill that gap. Anyway, big thanks for the authors of these projects for doing the heavy lifting. As this library is still in its early stage, I believe I will break the API with first few releases. Luckily the API is quite simple so following these changes should be quite easy. To make this library awesome, any feedback or feature request is welcome. I'll try to address them as quickly as I can. I hope I've managed to scratch someone else's itch too, enjoy. [letters] https://github.com/oxidizing/letters A question about Ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/a-question-about-ocaml/6075/21] Deep in this theard, Yawar Amin said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 A few ReasonML books: =E2=80=A2 [Web Development With ReasonML] =E2=80=A2 [Exploring ReasonML] (free online) =E2=80=A2 [Learn Type-Driven Development] (co-authored by me) [Web Development With ReasonML] https://pragprog.com/titles/reasonml/ [Exploring ReasonML] http://reasonmlhub.com/exploring-reasonml/toc.html [Learn Type-Driven Development] https://www.packtpub.com/application-development/learn-type-driven-developm= ent Alcotest 1.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/ann-alcotest-1-2-0/6089/1] Craig Ferguson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of [Alcotest] 1.2.0, now available on Opam. This release includes: =E2=80=A2 a new `alcotest-mirage' package for running tests on MirageOS; =E2=80=A2 full UTF-8 support; =E2=80=A2 default coloured output in Dune (without needing to pass `--no-buffer'); =E2=80=A2 an improved output format. The full changelog is available [here]. [https://aws1.discourse-cdn.com/standard11/uploads/ocaml/original/2X/a/ac= 89cfe4dfeed063560212136c9e2b690a888b6c.png] Thanks to our many contributors in this release cycle. [Alcotest] https://github.com/mirage/alcotest/ [here] https://github.com/mirage/alcotest/blob/1.2.0/CHANGES.md Set up OCaml 1.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: [https://discuss.ocaml.org/t/ann-set-up-ocaml-1-1-0/6093/1] Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release contains these changes: =E2=80=A2 The default opam repository can now be set via input. =E2=80=A2 Linux VMs now use opam 2.0.7. [https://github.com/avsm/setup-ocaml/releases/tag/v1.1.0] Sora Morimoto then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In fact, this release was a long time ago, but I completely forgot to post this. By the way, we have made significant improvements to some of the documentation. In particular, the action versioning section is applicable to other GitHub Actions and definitely worth reading! [https://github.com/avsm/setup-ocaml#how-to-specify-the-version] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] mailto:alan.schmitt@polytechnique.org [the archive] http://alan.petitepomme.net/cwn/ [RSS feed of the archives] http://alan.petitepomme.net/cwn/cwn.rss [online] http://lists.idyll.org/listinfo/caml-news-weekly/ [Alan Schmitt] http://alan.petitepomme.net/ --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 07 to 14, 2020.

OCaml 4.11.0, second beta release

octachron announced

The release of OCaml 4.11.0 is approaching. As one step further in this direction, we have published a second beta release. This new release fixes an MSVC-specific runtime issue.

The compatibility of the opam ecosystem with OCaml 4.11.0 is currently quite good with only 7 packages not currently available, and it should be possibl= e to test this beta without too much trouble.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.11.0+beta2.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+beta2.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands:

opam switch create ocaml-variants.4.11.0+beta2=
 --repositories=3Ddefault,beta=3Dgit=
+https://github.com/ocaml/ocaml-beta-repository.git

or

opam switch create ocaml-variants.4.11.0+beta2=
+<VARIANT> --repositories=3Ddefault,b=
eta=3Dgit+https://github.com/ocaml/ocaml-beta-repository.git

where you replace <VARIANT> with one of these: afl, flambda, fp, fp+f= lambda

We would love to hear about any bugs. Please report them here: https://github.com/ocaml= /ocaml/issues

If you are interested by the list of new features, and the on-going list of bug fixes the updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

Compared to the previous beta release, the exhaustive list of changes is as follows:

Runtime

  • #9714, #9724: Use the C++ al= ignas keyword when compiling in C++. Fixes a bug with MSVC C++ 2015/2017. A= dd a terminator to the caml_domain_state structure to better e= nsure that members are correctly spaced. (Antonin D=C3=A9cimo, review by Da= vid Allsopp and Xavier Leroy)

Manual and documentation

  • #8644: fix f= ormatting comment about @raise in stdlib's mli files (=C3=89lie Brami, revi= ew by David Allsopp)
  • #9712: Updat= e the version format to allow "". The new format is "major.minor[.pat= chlevel][(+|)additional-info]", for instance "4.12.0~beta1+flambda".= This is a documentation-only change for the 4.11 branch, the new format wi= ll be used starting with the 4.12 branch. (Florian Angeletti, review by Dam= ien Doligez and Xavier Leroy)

letters - simple client abstractions = for sending emails over SMTP

Miko announced

Earlier today I've published the first release of letters. This library aims to provide simple to use client library for sending emails ove= r SMTP using lwt for async execution.

It is build on top of mrmime and colombe. While these libraries are very capable, th= ey aren't that simple to use, letters is trying to fill t= hat gap. Anyway, big thanks for the authors of these projects for doing the heavy lifting.

As this library is still in its early stage, I believe I will break the API= with first few releases. Luckily the API is quite simple so following these changes should be quite = easy.

To make this library awesome, any feedback or feature request is welcome. I= 'll try to address them as quickly as I can.

I hope I've managed to scratch someone else's itch too, enjoy.

A question about Ocaml

Deep in this theard, Yawar Amin said

A few ReasonML books:

Alcotest 1.2.0

Craig Ferguson announced

I'm pleased to announce the release of Alcotest 1.2.0, now available on Opam.

This release includes:

  • a new alcotest-mirage package for running tests on MirageO= S;
  • full UTF-8 support;
  • default coloured output in Dune (without needing to pass --no-buf= fer);
  • an improved output format.

The full changelog is available here.

3D"ac89cfe4dfee=

Thanks to our many contributors in this release cycle.

Set up OCaml 1.1.0

Sora Morimoto announced

This release contains these changes:

  • The default opam repository can now be set via input.
  • Linux VMs now use opam 2.0.7.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.0

Sora Morimoto then added

In fact, this release was a long time ago, but I completely forgot to post = this. By the way, we have made significant improvements to some of the documentation. In particular, = the action versioning section is applicable to other GitHub Actions and definitely worth reading! = https://github.com/avsm/setup-ocaml#how-to-specify-the-version

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 3F574E004D for ; Tue, 21 Jul 2020 16:43:10 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=VY8U=BA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AgeVGqRT7sZp9HRtGeImTV91t9tpsv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa67ZheGt8tkgFKBZ4jH8fUM07OQ7/m+HzBeqsvd+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi3oAnLucQbgIRuJ6Y+xxDUvnZGZu?= =?us-ascii?q?NayH9yK1mOhRj8/MCw/JBi8yRUpf0s8tNLXLv5caolU7FWFSwqPG8p6sLlsxnD?= =?us-ascii?q?VhaP6WAHUmoKiBpIAhPK4w/8U5zsryb1rOt92C2dPc3rUbA5XCmp4ql3RBP0ji?= =?us-ascii?q?oMKjk2/nzKisxrlKJUvg6upwBxzY7TZYGaLvt+fqXAdt8eSmdMWsNdWipBDo2/?= =?us-ascii?q?aYsPEesBPf1Zr4bmo1sBswa1BAerBOP11zBInWL90ak03ug9FA3L2hErEdATv3?= =?us-ascii?q?TOtNj7NLkcX/27wqfLwjrMc+hb1i3h5IXSaB0tve2AULB2fMHMyUcvDQTFjlCI?= =?us-ascii?q?pIH5OzOazOINuHWG4eV8VeKvjm8nqx1tojOywcojkI3JiZgTylze7iV23IY1Jd?= =?us-ascii?q?i5SE5nfd6pC4NQtyaeN4p2XsMtXX1nuCY8yr0HoJ67YTYFxI4gxx7FZPyKao6F?= =?us-ascii?q?6Q/sW+iNOzl3nm5leK6hiBao90it0u3xWMe03lpUriRInNnCuH8M2hHR7sWKV/?= =?us-ascii?q?tz80av1zuNyw3f9vxJL04omafFNZIs3KI9moYdv0rDHyL7hEv4gqGQe0459Oao?= =?us-ascii?q?7OHnba/npp+aL4J0kh/xMrgvmsyjH+s4Kg8OX22e+euizrHj+1P2QKlSgv0xjq?= =?us-ascii?q?bWqpXaJcABqq6+GQ9V3Z4v6xm+Dze60NQYgGIIIEhZdxKAiojlI17OIPHkDfe/?= =?us-ascii?q?nlSjiy1nx/HBPrH5A5XNKGLDkLb7crpn5U5c0hI/zdFC6JNUDrEBJOj/WkjrtN?= =?us-ascii?q?zXCBIyLg+6w/7/BdlgyI8TXXiDDrKFPK7dq1OF6P4jL/OCaYIaoDrwKPko6+Tw?= =?us-ascii?q?gXI2llIRZ7Sl0JgJZHyiA/hqPliVbHzxidkbC2gKpBAxTOnyhV2CTzFTY3GyUr?= =?us-ascii?q?o55jA0FY6qF5/DRoepgL2BwCe0AIFZZmBAClCNCHfoapuLV+0LaCKILc9tij0E?= =?us-ascii?q?Vb6/RI89zRyiqRH2xr59IubJ5iEVuojv2dZp6+HJmxw/+iR4D8GH3GGMS2F0kH?= =?us-ascii?q?kIRzgz3K1nvEJz1kqN3bRgjvNXF9Ne5P1GXx8nOJPA1+F6E9fyWgbBf9eVVlmp?= =?us-ascii?q?XtWmATcwTtIo3t8BfVxxG9K4jhDMxyelGbsVmKaNBJAu6aLTw3jxJ8N8y3bayK?= =?us-ascii?q?kslEIpQsxSNW2gmqFw6RPTC5TMk0iWmKemb6Mc3DTC9Gub12qBoFlYUBJsUaXC?= =?us-ascii?q?RX0QelHZrdH95k/bS7+uCK8nMhdaxM6ZKqpKb8Xpgk9cSPfiPtTeeWOxlH2qCR?= =?us-ascii?q?aG3LPfJLbtLi8ZwyOXQBwAjAY7+WmAcw4zGnHl6yjVEzokXRq7aFzq2e1/s2+g?= =?us-ascii?q?CE443gWOKUp72OzxshUcgPjZT/IIwpoFvj0gonN6BhL11NXTE/KEphF9Z+Nbe9?= =?us-ascii?q?k8/F5D22XJ8QFgbbK6KKU3r1oXdUxMtEPr1glrQtFJlcEs6mghzA9zNb6wyFRF?= =?us-ascii?q?Zi+V1pD2O6TKJy/15h/5OP2e4U3XzNvDovRH0/8/sVi241DwRxgStk5/2twQ6E?= =?us-ascii?q?Oyo5DDDQ4cS5X0Cxll/R9nobrXeW84u5OS0mdjY/Dt723ynukxDe5g8S6OOtdS?= =?us-ascii?q?NKTeT133A5RcH8+qOfAnkFivbwsZMaZV7qFmZpr6JcvD47aiOaNbpBzjlX5Oud?= =?us-ascii?q?EvykWI5jZxQe7O3o8YzrefxATVDjo=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DaBACK/hZffSIeaIFgHQEBAQEJARIBB?= =?us-ascii?q?QUBggoCgSGBGAFdVTIshDOJAYsjhTuNVIUUA2ABAwEMGAEMBwECBAEBhAiCTwI?= =?us-ascii?q?dBgEFMxMCEAEBBQEBAQIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDAwDA4MkASEKZ?= =?us-ascii?q?SMDFAcDAhEBFwEUChcBEhqDDYJ8BAEKkFabeoEyhDsBAwIOAw8vg3mBQA0CE4E?= =?us-ascii?q?WAYU4R4Jug14mD4FMP4ERgmJsgkUMCwEBAQEBAYETIAYBAYM2gmAEj0Uka5F1g?= =?us-ascii?q?iKPWFwoB4JggQgEC4ZDfIpWhliEGZsvIZFgh1MHcoFbhXeKOwWESYFAKoFJHgw?= =?us-ascii?q?HMxowgngBAQExCWANkg+BPoEmgXU7hUEDPzMCAQEzAgYBBwEBAwl1AQEFEwsBX?= =?us-ascii?q?oJ+iHcQF4IeAQE?= X-IPAS-Result: =?us-ascii?q?A0DaBACK/hZffSIeaIFgHQEBAQEJARIBBQUBggoCgSGBGAF?= =?us-ascii?q?dVTIshDOJAYsjhTuNVIUUA2ABAwEMGAEMBwECBAEBhAiCTwIdBgEFMxMCEAEBB?= =?us-ascii?q?QEBAQIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDAwDA4MkASEKZSMDFAcDAhEBFwE?= =?us-ascii?q?UChcBEhqDDYJ8BAEKkFabeoEyhDsBAwIOAw8vg3mBQA0CE4EWAYU4R4Jug14mD?= =?us-ascii?q?4FMP4ERgmJsgkUMCwEBAQEBAYETIAYBAYM2gmAEj0Uka5F1giKPWFwoB4JggQg?= =?us-ascii?q?EC4ZDfIpWhliEGZsvIZFgh1MHcoFbhXeKOwWESYFAKoFJHgwHMxowgngBAQExC?= =?us-ascii?q?WANkg+BPoEmgXU7hUEDPzMCAQEzAgYBBwEBAwl1AQEFEwsBXoJ+iHcQF4IeAQE?= X-IronPort-AV: E=Sophos;i="5.75,379,1589234400"; d="scan'208,217";a="460693886" X-MGA-submission: =?us-ascii?q?MDHMzo+Gt1M/0smT6i4/49mjNJVrxmwHmpncpA?= =?us-ascii?q?tnnM0H5HeA+XlqK+5zVLAO1fBLp2fLSi2C0Y7kZdoYuXTXHsDI+oKbK/?= =?us-ascii?q?iHUw0rXdDFAqI1StKJpAgcGF2Kizj+TNyONQhhqnGgoG5SqfXqM6NRlr?= =?us-ascii?q?eTRwwRFa7INh9PvhmyJafeyw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Jul 2020 16:42:21 +0200 Received: from set (lfbn-orl-1-1118-111.w86-244.abo.wanadoo.fr [86.244.182.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 44CF5561218; Tue, 21 Jul 2020 16:42:17 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 21 Jul 2020 16:42:16 +0200 Message-ID: <871rl5aq0n.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 21 16:42:20 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000002, queueID=6694956122A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 14 to 21, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dune-release: version 1.4.0 released Using AF_XDP sockets for high-performance packet processing in OCaml Ubase 0.03 clangml 4.2.0: OCaml bindings for Clang API (for C and C++ parsing) Old CWN Dune-release: version 1.4.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/dune-release-version-1-4-0-released/6103/1] Sonja Heinze announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This post is about [dune-release], a tool that helps users release their packages to Opam in a fast and organized manner. You can install it via `opam install dune-release'. On behalf of the dune-release team at Tarides, I'm happy to announce the new dune-release [1.4.0 release]. The release includes two new subcommands described below and a variety of bug fixes and user experience improvements. In particular, we've put some work into improving the error handling and reporting. One of the new subcommands is `dune-release config' , which inspects and edits dune-release's global configuration, such as git related, opam related and github related data. For example, if you insert a typo when being asked for your github id during your first release with dune-release, you can correct it comfortably with that new subcommand. The other new subcommand is `dune-release delegate-info', which helps users with an alternative release workflow to integrate dune-release into it: imagine you want to use dune-release only for a couple of things, such as tagging the distribution and creating the distribution tarball and the documentation. In that case, now you can integrate the work done by dune-release into your individual release workflow by accessing the path to the created tarball etc via `dune-release delegate-info'. It forms part of the broader change in progress described in the following post: [https://discuss.ocaml.org/t/replacing-dune-release-delegates/4767] [dune-release] https://github.com/ocamllabs/dune-release/#readme [1.4.0 release] https://github.com/ocamllabs/dune-release/releases/tag/1.4.0 Using AF_XDP sockets for high-performance packet processing in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: [https://discuss.ocaml.org/t/using-af-xdp-sockets-for-high-performance-pa= cket-processing-in-ocaml/6106/1] suttonshire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I just wanted to share a fun result from a project I've been hacking on. [ocaml-xsk] is a binding to AF_XDP interface of libbpf. AF_XDP is an address family in Linux for high-performance packet processing. With an AF_XDP socket a packet bypasses most of the kernel networking stack and is passed directly to userspace program. Depending on the configuration packets can be passed from the NIC without any data copies on either Rx or Tx. If you're interested in this kind of stuff here are a couple very useful resources: =E2=80=A2 [https://github.com/torvalds/linux/blob/master/Documentation/ne= tworking/af_xdp.rst] =E2=80=A2 [https://github.com/xdp-project/xdp-tutorial/tree/master/advanc= ed03-AF_XDP] The cool part is that without installing large dependencies like DPDK you can get packets into your program basically as fast as your NIC can provide them! It turns out this is true even if your program is written in OCaml. Using ocaml-xsk I could receive or transmit 64 byte UDP packets at 14.8M packets per second. This is the limit for a 10Gb/s NIC. I'm still trying to figure out the best interface for AF_XDP. There are several resources to manage, and simple receive and transmit operations actually require a few steps. But it's encouraging know OCaml doesn't get in the way of packet throughput. [ocaml-xsk] https://github.com/suttonshire/ocaml-xsk Ubase 0.03 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: [https://discuss.ocaml.org/t/ann-ubase-0-03/6115/1] sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I'm happy to announce the release of [ubase], a tiny library whose only purpose is to remove diacritics (accents, etc.) from utf8-encoded strings using the latin alphabet. It was created after the discussion: [https://discuss.ocaml.org/t/simplify-roman-utf8/4398]. It's now available from `opam': `opam install ubase' This also installs an executable that you may use in a shell, for instance: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ubase "et gr=C3=B8nt tr=C3=A6" =E2=94=82 et gront trae =E2=94=82=20 =E2=94=82 $ ubase Anh xin l=E1=BB=97i c=C3=A1c em b=C3=A9 v=C3=AC =C4=91= =C3=A3 =C4=91=E1=BB=81 t=E1=BA=B7ng cu=E1=BB=91n s=C3=A1ch n=C3=A0y cho m= =E1=BB=99t =C3=B4ng ng=C6=B0=E1=BB=9Di l=E1=BB=9Bn. =E2=94=82 Anh xin loi cac em be vi da de tang cuon sach nay cho mot ong n= guoi lon. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 More info [here]. [ubase] https://github.com/sanette/ubase [here] https://sanette.github.io/ubase/ clangml 4.2.0: OCaml bindings for Clang API (for C and C++ parsing) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: [https://discuss.ocaml.org/t/ann-clangml-4-2-0-ocaml-bindings-for-clang-a= pi-for-c-and-c-parsing/6123/1] Thierry Martinez announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 We are happy to announce the new clangml 4.2.0 release. Clangml provides bindings for all versions of Clang, from 3.4 to the not yet released 10.0.1. The library can be installed via opam: `opam install clangml' The documentation is online: [https://memcad.gitlabpages.inria.fr/clangml/] This new release improves C++ support, including C++20 specific constructs. All Clang C/C++ attributes should now be supported. You may have a look to the interface of the new auto-generated module [`Attributes']. There is now a lazy version of the AST (`Clang.Lazy.Ast'): this is useful to explore large ASTs efficiently (note that Clang parsing itself can still be slow; the lazy part only concerns the conversion into the `Clang.Lazy.Ast' datatypes). [`Attributes'] https://memcad.gitlabpages.inria.fr/clangml/doc/clangml/Clang__/Attributes/ Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] mailto:alan.schmitt@polytechnique.org [the archive] http://alan.petitepomme.net/cwn/ [RSS feed of the archives] http://alan.petitepomme.net/cwn/cwn.rss [online] http://lists.idyll.org/listinfo/caml-news-weekly/ [Alan Schmitt] http://alan.petitepomme.net/ --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 14 to 21, 2020.

Dune-release: version 1.4.0 released<= /h2>

Sonja Heinze announced

This post is about dune-release, a tool that helps users release their packages to Opam in a fast and organized manner. You ca= n install it via opam install dune-release.

On behalf of the dune-release team at Tarides, I'm happy to announce the ne= w dune-release 1.4.0 release. The release includes two new subcommands described below and a variety of bug fixes and user experience = improvements. In particular, we've put some work into improving the error handling and reporting.

One of the new subcommands is dune-release config , which insp= ects and edits dune-release's global configuration, such as git related, opam related and github related data. F= or example, if you insert a typo when being asked for your github id during your first release with dun= e-release, you can correct it comfortably with that new subcommand.

The other new subcommand is dune-release delegate-info, which = helps users with an alternative release workflow to integrate dune-release into it: imagine you want to use dune-re= lease only for a couple of things, such as tagging the distribution and creating the distribution tarb= all and the documentation. In that case, now you can integrate the work done by dune-release into your= individual release workflow by accessing the path to the created tarball etc via dune-release del= egate-info. It forms part of the broader change in progress described in the following post: https://discuss.ocaml.org/t/replacing-dune-release-delegates/4767<= /a>

Using AF_XDP sockets for high-perform= ance packet processing in OCaml

suttonshire announced

I just wanted to share a fun result from a project I've been hacking on. ocaml-xsk is a bi= nding to AF_XDP interface of libbpf.

AF_XDP is an address family in Linux for high-performance packet processing= . With an AF_XDP socket a packet bypasses most of the kernel networking stack and is passed directly = to userspace program. Depending on the configuration packets can be passed from the NIC without a= ny data copies on either Rx or Tx. If you're interested in this kind of stuff here are a couple very us= eful resources:

The cool part is that without installing large dependencies like DPDK you c= an get packets into your program basically as fast as your NIC can provide them! It turns out this i= s true even if your program is written in OCaml. Using ocaml-xsk I could receive or transmit 64 byte UD= P packets at 14.8M packets per second. This is the limit for a 10Gb/s NIC.

I'm still trying to figure out the best interface for AF_XDP. There are sev= eral resources to manage, and simple receive and transmit operations actually require a few steps. Bu= t it's encouraging know OCaml doesn't get in the way of packet throughput.

Ubase 0.03

sanette announced

I'm happy to announce the release of ubase, a tiny library whose only purpose is to remove diacritics (accents, etc.) from utf8-encoded stri= ngs using the latin alphabet.

It was created after the discussion: https://discuss.ocaml.org/t/simplify-roman-utf8/= 4398.

It's now available from opam:

opam install ubase

This also installs an executable that you may use in a shell, for instance:

$ ubase "et gr=C3=B8nt tr=C3=A6"
et gront trae

$ ubase Anh xin l=E1=BB=97i c=C3=A1c em b=C3=A9 v=C3=AC =C4=91=C3=A3 =C4=91=
=E1=BB=81 t=E1=BA=B7ng cu=E1=BB=91n s=C3=A1ch n=C3=A0y cho m=E1=BB=99t =C3=
=B4ng ng=C6=B0=E1=BB=9Di l=E1=BB=9Bn.
Anh xin loi cac em be vi da de tang cuon sach nay cho mot ong nguoi lon.

More info here.

clangml 4.2.0: OCaml bindings for Cla= ng API (for C and C++ parsing)

Thierry Martinez announced

We are happy to announce the new clangml 4.2.0 release. Clangml provides b= indings for all versions of Clang, from 3.4 to the not yet released 10.0.1.

The library can be installed via opam: opam install clangml The documentation is online: https://memcad.gitlabpages.inria.fr/clangml/

This new release improves C++ support, including C++20 specific constructs.

All Clang C/C++ attributes should now be supported. You may have a look to= the interface of the new auto-generated module Attributes.

There is now a lazy version of the AST (Clang.Lazy.Ast): this = is useful to explore large ASTs efficiently (note that Clang parsing itself can still be slow; the lazy par= t only concerns the conversion into the Clang.Lazy.Ast datatypes).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 35A21E016E for ; Tue, 28 Jul 2020 18:57:56 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=sJ0C=BH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3A2A9UXh0/bjVayjIUsmDT+DRfVm0co7zxezQtwd8Z?= =?us-ascii?q?sesUL/7xwZ3uMQTl6Ol3ixeRBMOHsqwC1bCd6vi7EUU7or+5+EgYd5JNUxJXwe?= =?us-ascii?q?43pCcHRPC/NEvgMfTxZDY7FskRHHVs/nW8LFQHUJ2mPw6arXK99yMdFQviPgRp?= =?us-ascii?q?OOv1BpTSj8Oq3Oyu5pHfeQpFiCe8bL9oLRi6swrdutQKjYZsN6081gbHrnxUdu?= =?us-ascii?q?pM2GhmP0iTnxHy5sex+J5s7SFdsO8/+sBDTKv3Yb02QaRXAzo6PW814tbrtQTY?= =?us-ascii?q?QguU+nQcSGQWnQFWDAXD8Rr3Q43+sir+tup6xSmaIcj7Rq06VDi+86tmTgLjhC?= =?us-ascii?q?cEOT4/7mHXi9dwjKNArxKluRN03oDVYIaPNPVjZaPWYNcWSGRdUspUUSFKH4Gy?= =?us-ascii?q?YJYVD+cZPehWsZTzqVUNoxSxGQahH+bvxiNSi3LswaE2z+YsHAfb1wIgBdIOt3?= =?us-ascii?q?HUoc3pOacWS++1yrTDwyjfYPNW3Df96ZTIcgw8qvyLR71wddDeyU81GwPeklqQ?= =?us-ascii?q?qYnlPzKJ1uQRqGWb9+1gVeavim47tQ5+vjivxsEtionQm4Ia1ErI9SJjwIY6PN?= =?us-ascii?q?C1TlNwbtG4HpVKrS6aK5d2Td04Q2FuoCs0xb8LtIC6cSYE1pgr2h7SZvyZfoWW?= =?us-ascii?q?/B7uSvidLzdliH9leb+xhxi//0a8x+HgSsW50ktHoyhbntXRqn0D2AHf586aQf?= =?us-ascii?q?Vz+Ueh3CyA1wHV6uxcOUA7i7bbK589wrEujpoTtkHDHirol0nsiq+ZaFkk9vCv?= =?us-ascii?q?6+v7eLrmo5ucO5VzigHkPaQigsO/AeUkMggOQmiU4v6w26Hk/U38WLlKgfw2kr?= =?us-ascii?q?XZsJDHPssXvLS1DBNS0oYm8xq/FSmp384FknkbLFJKZg+Ij4/1NFHVOvz4DPC/?= =?us-ascii?q?j0ytkDdt3fDGP6fuDo/DLnjZiLvhc6x95FRZyAUp1NxQ+4hYBa0GIPL2QkPxtc?= =?us-ascii?q?HXDx89Mwyw2ernD8991owYVGmSAaGZKLvfvUKW6u8rOeWAeZMZtTnnJ/Ur+/Li?= =?us-ascii?q?l3E0lFAFcaSq3JYbcm60E/tpLkmDfHbhgckNHX0XsgYjUeDnjkCJXyRJaHaoRa?= =?us-ascii?q?084yk2CIK4AofHQYCgmLmB3SimEpFMfmBGDVSMEHf0d4qaR/gMaCSSIs54kjwZ?= =?us-ascii?q?S7etUYgh1QuhtAPiyrpnKPTb+jEAuJ7+ytR44/ffmQwu+TF7FciQ3X2BQ3t6k2?= =?us-ascii?q?4HXzM22bpwoU15yleNy6h4hPlYGMRO6f1VTwk2KYbRz/d+BdzuRA/MZsqERlS+?= =?us-ascii?q?T9W+BjExStIww8MQbElhG9WiiBHD3zO3A7ALjbCLA4Y08q3E0nfrI8Zy0XDG2L?= =?us-ascii?q?M6j1Y6QstPMGymhrJj9wXIHIHJlFiZl6C2eqsCxy7B7mKDwGWBvU1CVw5wS6rF?= =?us-ascii?q?UWgFZkTKtdT5+l/CT7i2BLs7KARBzMqCJrJOat3ollVGWOzuOM/eYmK0g2e/Hw?= =?us-ascii?q?yExrKKbIrwemUSxj/RCEYek1NbwXHTfwwhAG3p92bBChRqClSpZU7wp6024nik?= =?us-ascii?q?SAV8h1WBcEtJ07uu5gVThPCNT/dV2agL7mNpoDxxGBO53snKI9uGvQtoOqtGJZ?= =?us-ascii?q?s251Jf/WbYrBBmeJu6JaF+j1oQdBQxsl69+Q9wD9BplcEs5EghzA9zNb7QhFpF?= =?us-ascii?q?fjXexpvwP7zLNkHq+xS+d6Pd2lffycubvKAV56Jr+B3YoAi1Gx96oD1c2N5P3i?= =?us-ascii?q?7HvsyWXjpXaor4VwMMzzY/v6vTO3hv/4TQxGFhOqmysybf1pQuHuR3k0/9Leca?= =?us-ascii?q?C7uNEUrJK+NfB8WqL7ZxyV25N1QcO+RD6KM/P8WnbuaLnqmxM7Q5xWP0vSF8+I?= =?us-ascii?q?l4l3m02W95Q+/M0YwCxqjHjAGASjH3gUznt5zn34deamNLEw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0APBgB1WCBffSIeaIFgglWBIYEYAV1VM?= =?us-ascii?q?iyENIFdhySJIIINhTuNV4VnEAEDAQcFGAEMBwECBAEBgVaBQYE1AheCCQIdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDBmDHQEYAQgEBmUjA?= =?us-ascii?q?xQBBgMCBA0BFwEUChcBEhQGAYMMgnwEAQqTW5o2GTV2fzOEOwEDAgGEZoEwEA0?= =?us-ascii?q?CE4EWAYFSg2tIgnMIgXWBYSYPgUw/gRGCEkkHbIJFDAsBAQEBAYEzBwEBVoJgg?= =?us-ascii?q?mAEj0YLAx0Ha4h/gSWBUoYTgiOPX1wpB4JigQgEC4ZFfIY6hCKGXYJ7gSKIJ5I?= =?us-ascii?q?GgR8hkXaBaIVtB3SBXoV8ikuETYFAKoFnDAczGjBDgmkJYA1ZjSIMIxeDToE+g?= =?us-ascii?q?SaBPDk7hUQ/MwIBAQEGLAIGAQcBAQMJdQEBBRMLAWODHYkXLIE+XAEB?= X-IPAS-Result: =?us-ascii?q?A0APBgB1WCBffSIeaIFgglWBIYEYAV1VMiyENIFdhySJIII?= =?us-ascii?q?NhTuNV4VnEAEDAQcFGAEMBwECBAEBgVaBQYE1AheCCQIdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQsUCIYMDEMBAQQLAYFiDBmDHQEYAQgEBmUjAxQBBgMCBA0BFwE?= =?us-ascii?q?UChcBEhQGAYMMgnwEAQqTW5o2GTV2fzOEOwEDAgGEZoEwEA0CE4EWAYFSg2tIg?= =?us-ascii?q?nMIgXWBYSYPgUw/gRGCEkkHbIJFDAsBAQEBAYEzBwEBVoJggmAEj0YLAx0Ha4h?= =?us-ascii?q?/gSWBUoYTgiOPX1wpB4JigQgEC4ZFfIY6hCKGXYJ7gSKIJ5IGgR8hkXaBaIVtB?= =?us-ascii?q?3SBXoV8ikuETYFAKoFnDAczGjBDgmkJYA1ZjSIMIxeDToE+gSaBPDk7hUQ/MwI?= =?us-ascii?q?BAQEGLAIGAQcBAQMJdQEBBRMLAWODHYkXLIE+XAEB?= X-IronPort-AV: E=Sophos;i="5.75,406,1589234400"; d="asc'?scan'208,217";a="461678643" X-MGA-submission: =?us-ascii?q?MDF/EoAjXwHeTlnKR4a4vV3jY7HY7VI/LmNuWa?= =?us-ascii?q?+zi24Y66iOUXlT+F1bwQQuuw4efykCISFlDAiKhe01taV6JyvrCtYUPj?= =?us-ascii?q?zMo6PcR+fqXzsVuBSMIV5PWAkhp+/SxmtlFl3ixWQLxyj7YzEL2gbT+d?= =?us-ascii?q?fEhFwWSkIaoAPWKlsCnZou3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Jul 2020 18:57:54 +0200 Received: from set (lfbn-orl-1-1118-111.w86-244.abo.wanadoo.fr [86.244.182.111]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 49154564E5E; Tue, 28 Jul 2020 18:57:48 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 28 Jul 2020 18:57:16 +0200 Message-ID: <87a6zj37df.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 28 18:57:53 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=626F0564E82 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/signed; boundary="==-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" --==-=-= Content-Type: text/plain --==-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQEzBAEBCAAdFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAl8gWO0ACgkQBA0KO07S 5cdQFQf/bU+ly9mHCxvTgJS4I00rs+xK8N8ZC7m+b552QNQtv1i/xFRCk+IBdYEX sqBugQGK477DH6MQWzRte7Ghsy/GTVObzHTfdL/ppgYXTH3Ui58hEKo+PkUsLXGu XBZInuOlz0BuBppaju5NB1uxSuTpLofRJjP7iVn8ELm3Eq+2eQQrXqK+oFTaKbB2 xcN5x08VGPWx2Gg+31wdaiv8snrRWv0uZlz13c4DOcWMXoeplOV2IwRckclSyEYV OMvwzvG7EL+mIh4NVltLjrnaQg5/JFb3kPVcIQx1HFlh8UjGZdSLAUj93Pdl02Cr gfpIOhS+LY4WHPUQJnDjMHQLcfRyWw== =3eZm -----END PGP SIGNATURE----- --==-=-=-- --=-=-= Content-Type: multipart/alternative; boundary="===-=-=" --===-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAyMSB0byAyOCwNCjIwMjAuDQoNCkFzIEkgd2lsbCBiZSBhd2F5IHdpdGggbm8g aW50ZXJuZXQgbmV4dCB3ZWVrLCB0aGUgbmV4dCBDV04gd2lsbCBiZSBvbg0KQXVndXN0IDExLg0K DQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCkVtYmVkZGVkIG9jYW1sIHRlbXBsYXRlcw0KUHJvcG9zYWw6IEFu b3RoZXIgd2F5IHRvIGRlYnVnIG1lbW9yeSBsZWFrcw0KQ2FtbHA1ICg4LjAwfmFscGhhMDEpIGFu ZCBwYV9wcHggKDAuMDEpDQpPQ2FtbCA0LjExLjAsIHRoaXJkIChhbmQgbGFzdD8pIGJldGEgcmVs ZWFzZQ0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkVtYmVkZGVkIG9jYW1sIHRlbXBs YXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogW2h0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9lbWJlZGRlZC1vY2FtbC10ZW1wbGF0ZXMvNjEyNC8xXQ0KDQoNCkVtaWxlIFRyb3Rp Z25vbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gdmVyeSBoYXBweSB0 byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBvY2FtbC1lbWJlZGRlZC10ZW1wbGF0ZXMuDQoNCiAg VGhpcyBpcyBhIHRvb2wgc2ltaWxhciB0byBjYW1sbWl4LCBidXQgY2FtbG1peCB3YXMgbm90IHVw ZGF0ZWQgZm9yIDcNCiAgeWVhcnMsIGFuZCB0aGVyZSBpcyBubyBlYXN5IHdheSB0byBoYW5kbGUg YSBsb3Qgb2YgdGVtcGxhdGVzIChteQ0KICBjb21tYW5kIHRha2VzIGEgZGlyZWN0b3J5IGFzIGFu IGFyZ3VtZW50IGFuZCBnZW5lcmF0ZSBhbiBvY2FtbCBtb2R1bGUNCiAgYnkgZ29pbmcgdGhyb3Vn aCB0aGUgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5KSBJIGFsc28gY2hvb3NlZCB0byB1c2UgYQ0KICBz eW50YXggc2ltaWxhciB0byBFSlMsIGFuZCB0aGVyZSBpcyBhIHBweCBmb3IgaW5saW5lIEVNTC4N Cg0KICBZb3UgY2FuIGNoZWNrIGl0IG91dCBoZXJlIDoNCiAgW2h0dHBzOi8vZ2l0aHViLmNvbS9F bWlsZVRyb3RpZ25vbi9lbWJlZGRlZF9vY2FtbF90ZW1wbGF0ZXNdDQoNCiAgSGVyZSBpcyBhIG1v cmUgZXh0ZW5zaXZlIGV4ZW1wbGUgb2Ygd2hhdCBjYW4gYmUgZG9uZSB3aXRoIHRoaXMgOg0KICBb aHR0cHM6Ly9naXRodWIuY29tL0VtaWxlVHJvdGlnbm9uL3Jlc3VtZV9vZl9vY2FtbF0gKFRoaXMg cHJvamVjdA0KICBnZW5lcmF0ZSBteSByZXN1bWUvd2Vic2l0ZSBpbiBib3RoIGxhdGV4IGFuZCBo dG1sKS4NCg0KICBUaGlzIGlzIG15IGZpcnN0IG9wYW0gcGFja2FnZSA6IGZlZWRiYWNrIGlzIHZl cnkgbXVjaCB3ZWxjb21lLg0KDQoNClByb3Bvc2FsOiBBbm90aGVyIHdheSB0byBkZWJ1ZyBtZW1v cnkgbGVha3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIFtodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcHJvcG9zYWwtYW5vdGhlci13YXktdG8tZGVidWctbWVtb3J5LWxlYWtz LzYxMzQvMV0NCg0KDQpKaW0gRmVocmxlIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIGBtZW1wcm9mJyBoZWxwcyB5b3UgZGlzY292ZXIgd2hl cmUgbWVtb3J5IHdhcyBhbGxvY2F0ZWQsIHdoaWNoIGlzDQogIGNlcnRhaW5seSB1c2VmdWwuICBI b3dldmVyLCB0aGF0IG1heSBub3QgYmUgZW5vdWdoIGluZm9ybWF0aW9uIHRvDQogIGlzb2xhdGUg YSBsZWFrLiAgU29tZXRpbWVzIHlvdSdkIGxpa2UgdG8ga25vdyB3aGF0IHZhcmlhYmxlcyByZWZl ciB0bw0KICBleGNlc3NpdmUgYW1vdW50cyBvZiBtZW1vcnkuDQoNCiAgRm9yIHRoaXMsIHlvdSdk IHdhbnQgdG8gZXhhbWluZSBhbGwgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiByb290cyBhbmQNCiAg cmVwb3J0IGhvdyBtdWNoIG1lbW9yeSBpcyB1c2VkIGJ5IGVhY2guICBUaGlzIGlzIHVzZWZ1bCBp bmZvcm1hdGlvbiBpZg0KICB5b3UgY2FuIG1hcCBhIEdDIHJvb3QgYmFjayB0byBhIHNvdXJjZSBm aWxlIGFuZCB2YXJpYWJsZS4NCg0KICBJIHByb3RvdHlwZWQgY29kZSB0byBkbyB0aGF0IHRvIGhl bHAgd2l0aCBDb3EgYnVnDQogIFtodHRwczovL2dpdGh1Yi5jb20vY29xL2NvcS9pc3N1ZXMvMTI0 ODddLiAgSXQgbG9jYWxpemVkIHNldmVyYWwgbGVha3MNCiAgZW5vdWdoIGFjcm9zcyBvdmVyIDUw MCBzb3VyY2UgZmlsZXMgc28gdGhhdCB3ZSBjb3VsZCBmaW5kIGFuZCBmaXgNCiAgdGhlbS4gIEJ1 dCBteSBwcm90b3R5cGUgY29kZSBpcyBhIGJpdCBjcnVkZS4gIEknZCBsaWtlIHRvIGNsZWFuIGl0 IHVwDQogIGFuZCBzdWJtaXQgaXQgYXMgYSBQUi4gIFNpbmNlIHRoaXMgY291bGQgYmUgZG9uZSBp biB2YXJpb3VzIHdheXMsIEkNCiAgd2FudGVkIHRvIGdldCBzb21lIGRlc2lnbi9BUEkgZmVlZGJh Y2sgdXAgZnJvbnQgcmF0aGVyIHRoYW4gbWF5YmUNCiAgZG9pbmcgc29tZSBvZiBpdCB0d2ljZS4g IEFsc28gSSdkIGxpa2UgdG8gY29uZmlkZW50IHRoYXQgc3VjaCBhIFBSDQogIHdvdWxkIGJlIGFj Y2VwdGVkIGFuZCBtZXJnZWQgaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1l4oCTb3RoZXJ3 aXNlDQogIHdoeSBib3RoZXIuDQoNCiAgW2NhbWxfZG9fcm9vdHNdIHNob3dzIGhvdyB0byBhY2Nl c3MgdGhlIEdDIHJvb3RzLiAgVGhlcmUgYXJlIHNldmVyYWwNCiAgdHlwZXMgb2Ygcm9vdHM6DQog IOKAoiBnbG9iYWwgcm9vdHMsIGNvcnJlc3BvbmRpbmcgdG8gdG9wLWxldmVsIHZhcmlhYmxlcyBp biBzb3VyY2UgZmlsZXMNCiAg4oCiIGR5bmFtaWMgZ2xvYmFsIHJvb3RzDQogIOKAoiBzdGFjayBh bmQgbG9jYWwgcm9vdHMNCiAg4oCiIGdsb2JhbCBDIHJvb3RzDQogIOKAoiBmaW5hbGl6ZWQgdmFs dWVzDQogIOKAoiBtZW1wcm9mDQogIOKAoiBob29rDQoNCiAgKkFQSSAoaW4gR2MpOioNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIHZhbCBwcmludF9nbG9iYWxfcmVhY2hhYmxlIDogb3V0X2No YW5uZWwgLT4gaW50IC0+IHVuaXQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgUHJpbnRzIGEgbGlz dCB0byBgb3V0X2NoYW5uZWwnIG9mIHRoZSBnbG9iYWwgcm9vdHMgdGhhdCByZWFjaCBtb3JlDQog IHRoYW4gdGhlIHNwZWNpZmllZCBudW1iZXIgb2Ygd29yZHMuICBFYWNoIGl0ZW0gc2hvd3MgdGhl IG51bWJlciBvZg0KICByZWFjaGFibGUgd29yZHMsIHRoZSBhc3NvY2lhdGVkIGluZGV4IG9mIHRo ZSByb290IGluIHRoZSBgKmdsb2InIGZvcg0KICB0aGF0IGZpbGUgYW5kIHRoZSBuYW1lIG9mIHRo ZSBzb3VyY2UgZmlsZS4NCg0KICBTb21ldGhpbmcgbGlrZSB0aGlzIChidXQgd2l0aCBvbmx5IGZp bGVuYW1lcyByYXRoZXIgdGhhbiBwYXRobmFtZXMpOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgICAxMDI2NzggZmllbGQgIDE3IHBsdWdpbnMvbHRhYy9wbHRhYy5tbA0KICDilIIgICAxMDI3 MzAgZmllbGQgIDE4IHBsdWdpbnMvbHRhYy9wbHRhYy5tbA0KICDilIIgICAxNjQ4MjQgZmllbGQg IDIwIHBsdWdpbnMvbHRhYy90YWNlbnYubWwNCiAg4pSCICAxNTQyODU3IGZpZWxkICAyNiBwbHVn aW5zL2x0YWMvdGFjZW52Lm1sDQogIOKUgiAzNTI1Mzc0MyBmaWVsZCAgNjUgc3RtL3N0bS5tbA0K ICDilIIgMzUyMDE5MTMgZmllbGQgICA4IHZlcm5hYy92ZXJuYWNzdGF0ZS5tbA0KICDilIIgIDg5 OTE4NjQgZmllbGQgIDI0IHZlcm5hYy9saWJyYXJ5Lm1sDQogIOKUgiAgIDExMjAzNSBmaWVsZCAg IDggdmVybmFjL2VncmFtbWwubWwNCiAg4pSCICA2MTQ1NDU0IGZpZWxkICA4NCB2ZXJuYWMvZGVj bGFyZW1vZHMubWwNCiAg4pSCICA2NDM1ODc4IGZpZWxkICA4OSB2ZXJuYWMvZGVjbGFyZW1vZHMu bWwNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSSB3b3VsZCB1c2UgRUxGIGluZm9ybWF0aW9uIGlu IHRoZSBiaW5hcnkgZmlsZSB0byBtYXAgZnJvbSBgKmdsb2InDQogIGJhY2sgdG8gYSBmaWxlbmFt ZS4gIEZvciBleGFtcGxlLCB0aGUgYWRkcmVzcyBzeW1ib2wgb2YgdGhlIGVudHJ5DQogIGBjYW1s VGVzdCcgY29ycmVzcG9uZHMgdG8gYHRlc3QubWwnLiAgVGhpcyB3b3VsZCBvbmx5IHdvcmsgZm9y IGJpbmFyeQ0KICBleGVjdXRhYmxlcyBjb21waWxlZCB3aXRoIHRoZSBgLWcnIG9wdGlvbi4gIEl0 IHdvdWxkbid0IHdvcmsgZm9yDQogIGJ5dGUtY29tcGlsZWQgY29kZS4gIEl0IHdvdWxkIHByaW50 IGFuIGVycm9yIG1lc3NhZ2UgaWYgaXQncyBub3QgRUxGDQogIG9yIG5vdCBgLWcnLiAgQWxzbywg YmVpbmcgYSBsaXR0bGUgbGF6eSwgaG93IGVzc2VudGlhbCBpcyBpdCB0bw0KICBzdXBwb3J0IDMy LWJpdCBiaW5hcmllcz8gIChROiBXaGF0IGhhcHBlbnMgaWYgeW91IGhhdmUgMiBzb3VyY2UgZmls ZXMNCiAgd2l0aCB0aGUgc2FtZSBuYW1lIHRob3VnaCBpbiBkaWZmZXJlbnQgZGlyZWN0b3JpZXM/ ICBXb3VsZCB0aGUgc3ltYm9sDQogIHRhYmxlIGRpc3Rpbmd1aXNoIHRoZW0/KQ0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdmFsIGdldF9maWVsZF9pbmRleCA6IE9iai50IC0+IGludA0KICDi lJTilIDilIDilIDilIANCg0KICBSZXR1cm5zIHRoZSBgKmdsb2InIGluZGV4IG51bWJlciBmb3Ig dGhlIHRvcC1sZXZlbCB2YXJpYWJsZSAocGFzc2VkIGFzDQogIGBPYmoucmVwciB2YXInKS4gIEkg ZXhwZWN0IHRoZXJlJ3Mgbm8gd2F5IHRvIHJlY292ZXIgdmFyaWFibGUgbmFtZXMNCiAgZnJvbSB0 aGUgYCpnbG9iJyBpbmRleC4gIEluIG15IGV4cGVyaW1lbnRzLCBpdCBhcHBlYXJlZCB0aGF0IHRo ZQ0KICBlbnRyaWVzIGluIGAqZ2xvYicgd2VyZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBhcyB0aGUg dmFyaWFibGUgYW5kDQogIGZ1bmN0aW9uIGRlY2xhcmF0aW9ucy4gIFRoaXMgd291bGQgbGV0IGEg ZGV2ZWxvcGVyIGRvIGEgYmluYXJ5IHNlYXJjaA0KICBpbiB0aGUgY29kZSB0byBsb2NhdGUgdGhl IHZhcmlhYmxlIHdoaWNoIGl0IHByb2JhYmx5IGEgbmVjZXNzaXR5IGZvcg0KICBsYXJnZSwgY29t cGxleCBmaWxlcyBzdWNoIGFzIENvcSdzIGBzdG0ubWwn4oCTMzMwMCBsaW5lcywgMTArIG1vZHVs ZXMNCiAgZGVmaW5lZCB3aXRoaW4gdGhlIGZpbGUuICAoSSBub3RpY2VkIHRoYXQgdmFyaWFibGVz IGRlZmluZWQgaW4gbW9kdWxlcw0KICBkZWZpbmVkIHdpdGhpbiB0aGUgc291cmNlIGZpbGUgd2Vy ZSBub3QgaW4gYCpnbG9iJy4gIEkgZXhwZWN0IHRoZXJlIGlzDQogIGEgcm9vdCBmb3IgdGhlIG1v ZHVsZSBhcyBhIHdob2xlIGFuZCB0aGF0IHRob3NlIHZhcmlhYmxlcyBjYW4gYmUNCiAgcmVhZGls eSBmb3VuZCB3aXRoaW4gdGhhdCByb290LikNCg0KICBUaGlzIHdvdWxkIG5lZWQgYW4gZXh0ZW5k ZWQgZXhwbGFuYXRpb24gaW4gYGdjLm1saScuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2 YWwgcHJpbnRfc3RhY2tfcmVhY2hhYmxlIDogb3V0X2NoYW5uZWwgLT4gaW50IC0+IHVuaXQNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgUHJpbnRzIGEgYmFja3RyYWNlIHRvIGBvdXRfY2hhbm5lbCcg dGhhdCBhbHNvIHNob3dzIHdoaWNoIHJvb3RzIGZvcg0KICBlYWNoIGZyYW1lIHJlYWNoIG1vcmUg dGhhbiB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB3b3Jkcy4gIChJJ2Qga2VlcA0KICB0aGUgIml0 ZW0gbnVtYmVycyIgc2luY2UgdGhlcmUncyBubyB3YXkgdG8gdHJhbnNsYXRlIHRoZW0gdG8gdmFy aWFibGVzDQogIGFuZCB0aGV5IG1pZ2h0IGdpdmUgc29tZSBjbHVlcy4pDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBDYWxsZWQgZnJvbSBmaWxlICJ0YWN0aWNzL3JlZGV4cHIubWwiIChpbmxp bmVkKSwgbGluZSAyMDcsIGNoYXJhY3RlcnMgMjktNDANCiAg4pSCICAzNTY3NTgxNTQgaXRlbSAg ICAwIChzdGFjaykNCiAg4pSCIENhbGxlZCBmcm9tIGZpbGUgInBsdWdpbnMvbHRhYy90YWNpbnRl cnAubWwiLCBsaW5lIDc1MiwgY2hhcmFjdGVycyA2LTUxDQogIOKUgiAgIDE3NjQ2NzE5IGl0ZW0g ICAgMCAoc3RhY2spDQogIOKUgiAgICAgMTE5MDQxIGl0ZW0gICAgMSAoc3RhY2spDQogIOKUgiBD YWxsZWQgZnJvbSBmaWxlICJlbmdpbmUvbG9naWNfbW9uYWQubWwiLCBsaW5lIDE5NSwgY2hhcmFj dGVycyAzOC00Mw0KICDilIIgICAgIDExOTEzMCBpdGVtICAgIDAgKHN0YWNrKQ0KICDilIIgIDM3 MzM3ODIzNyBpdGVtICAgIDEgKHN0YWNrKQ0KICDilJTilIDilIDilIDilIANCg0KICBBcyBpdCB0 dXJucyBvdXQsIDkwJSBvZiB0aGUgbWVtb3J5IGluIENvcSBpc3N1ZSBtZW50aW9uZWQgYWJvdmUg aXMNCiAgcmVhY2hhYmxlIG9ubHkgZnJvbSB0aGUgc3RhY2suDQoNCiAgSSBkaWRuJ3QgY29uc2lk ZXIgdGhlIG90aGVyIHR5cGVzIG9mIHJvb3RzIHlldCwgd2hpY2ggSSBkb24ndCBmdWxseQ0KICB1 bmRlcnN0YW5kLCBzdWNoIGFzIGxvY2FsIHJvb3RzLiAgSnVzdCBjb3ZlcmluZyBnbG9iYWwgYW5k IHN0YWNrIHJvb3RzDQogIHNlZW1zIGxpa2UgYSBnb29kIGNvbnRyaWJ1dGlvbi4gIER5bmFtaWMg Z2xvYmFsIHJvb3RzIG1heSBiZSBlYXN5IHRvDQogIGFkZCBpZiB0aGV5IGFyZSBvdGhlcndpc2Ug c2ltaWxhciB0byBnbG9iYWwgcm9vdHMuICBGb3IgdGhlIG90aGVycyBJDQogIGNvdWxkIHByaW50 IHRoZSByZWFjaGFibGUgd29yZHMsIGJ1dCBJIGRvbid0IGtub3cgaG93IHRvIGRpcmVjdCB0aGUN CiAgZGV2ZWxvcGVyIHRvIGxvb2sgYXQgdGhlIHJlbGV2YW50IHBhcnQgb2YgdGhlIGNvZGUsIGVz cGVjaWFsbHkgaWYgaXQncw0KICBpbiBDIGNvZGUuICBJIHN1cHBvc2UgYHByaW50X2dsb2JhbF9y ZWFjaGFibGUnIGFuZA0KICBgcHJpbnRfc3RhY2tfcmVhY2hhYmxlJyBjb3VsZCBiZSBhIHNpbmds ZSByb3V0aW5lIGFzIHdlbGwuICBUaGF0J3MNCiAgcHJvYmFibHkgYmV0dGVyLg0KDQogIExldCBt ZSBrbm93IHlvdXIgdGhvdWdodHMuDQoNCg0KW2NhbWxfZG9fcm9vdHNdDQpodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi84MDMyNjAzM2NiZWRmZTU5YzA2NjRlMzkxMmYyMTAxN2U5 NjhhMWU1L3J1bnRpbWUvcm9vdHNfbmF0LmMjTDM5OQ0KDQoNCkNhbWxwNSAoOC4wMH5hbHBoYTAx KSBhbmQgcGFfcHB4ICgwLjAxKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tY2FtbHA1LTgtMDAtYWxwaGEwMS1hbmQtcGEtcHB4LTAtMDEvNjE0 NC8xXQ0KDQoNCkNoZXQgTXVydGh5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmBDYW1scDUgKDguMDB+ YWxwaGEwMSknIGFuZCBgcGFfcHB4ICgwLjAxKScNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEknbSBw bGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHR3byByZWxhdGVkIHByb2plY3RzOg0K DQogIDEuIFtDYW1scDVdOiB2ZXJzaW9uIDguMDB+YWxwaGEwMSBpcyBhbiBhbHBoYSByZWxlYXNl IG9mIENhbWxwNSwgd2l0aA0KICAgICBmdWxsIHN1cHBvcnQgZm9yIE9DYW1sIHN5bnRheCB1cCB0 byB2ZXJzaW9uIDQuMTAuMCwgYXMgd2VsbCBhcw0KICAgICBtaW5pbWFsIGNvbXBhdGliaWxpdHkg d2l0aCB2ZXJzaW9uIDQuMTEuMC4gSW4gcGFydGljdWxhciB0aGVyZSBpcw0KICAgICBmdWxsIHN1 cHBvcnQgZm9yIFBQWCBhdHRyaWJ1dGVzIGFuZCBleHRlbnNpb25zLg0KDQogIDIuIFtwYV9wcHhd OiB2ZXJzaW9uIDAuMDEgaXMgYSByZS1pbXBsZW1lbnRhdGlvbiBvZiBhIGxhcmdlIG51bWJlciBv Zg0KICAgICBQUFggcmV3cml0ZXJzIChlLmcuIHBweF9kZXJpdmluZyAoc3RkIChzaG93LCBlcSwg bWFwLCBldGMpLCB5b2pzb24sDQogICAgIHNleHAsIGV0YyksIHBweF9pbXBvcnQsIHBweF9hc3Nl cnQsIG90aGVycykgb24gdG9wIG9mIENhbWxwNSwgYWxvbmcNCiAgICAgd2l0aCBhbiBpbmZyYXN0 cnVjdHVyZSBmb3IgZGV2ZWxvcGluZyBuZXcgb25lcy4NCg0KICBUaGlzIGFsbG93cyBwcm9qZWN0 cyB0byBjb21iaW5lIHRoZSBleGlzdGluZyBzdHlsZSBvZiBDYW1scDUgc3ludGF4DQogIGV4dGVu c2lvbiwgd2l0aCBQUFggcmV3cml0aW5nLCB3aXRob3V0IGhhdmluZyB0byBqdW1wIHRocnUgaG9v cHMgdG8NCiAgaW52b2tlIGNhbWxwNSBvbiBzb21lIGZpbGVzLCBhbmQgUFBYIHByb2Nlc3NvcnMg b24gb3RoZXJzLg0KDQogIENhbWxwNSBhbG9uZSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIGV4aXN0 aW5nIFBQWCByZXdyaXRlcnM6IENhbWxwNQ0KICBzeW50YXgtZXh0ZW5zaW9ucyAoZS5nLiAic3Ry ZWFtIHBhcnNlcnMiKSB3b3VsZCBiZSByZWplY3RlZCBieSB0aGUNCiAgT0NhbWwgcGFyc2VyLCBh bmQgUFBYIGV4dGVuc2lvbnMvYXR0cmlidXRlcyBhcmUgaWdub3JlZCBieSBDYW1scDUNCiAgKGFn YWluLCB3aXRob3V0IGBwYV9wcHgnKS4gIGBwYV9wcHgnIHByb3ZpZGVzIENhbWxwNS1jb21wYXRp YmxlDQogIHZlcnNpb25zIG9mIG1hbnkgZXhpc3RpbmcgUFBYIHJld3JpdGVycywgYXMgd2VsbCBh cyBuZXcgb25lcywgc28gdGhhdA0KICBvbmUgY2FuIHVzZSBDYW1scDUgc3ludGF4IGV4dGVuc2lv bnMgYXMgd2VsbCBhcyBQUFggcmV3cml0ZXJzLiAgSW4NCiAgYWRkaXRpb24sIHNvbWUgb2YgdGhl IHJlLWltcGxlbWVudGVkIHJld3JpdGVycyBhcmUgbW9yZS1wb3dlcmZ1bCB0aGFuDQogIHRoZWly IG9yaWdpbmFsIG5hbWVzYWtlcywgYW5kIHRoZXJlIGFyZSBuZXcgb25lcyB0aGF0IGFkZCBpbnRl cmVzdGluZw0KICBmdW5jdGlvbmFsaXR5Lg0KDQoNCltDYW1scDVdIGh0dHBzOi8vZ2l0aHViLmNv bS9jYW1scDUvY2FtbHA1DQoNCltwYV9wcHhdIGh0dHBzOi8vZ2l0aHViLmNvbS9jaGV0bXVydGh5 L3BhX3BweA0KDQoNCkZvciBkZW1vY3JhdGl6aW5nIG1hY3JvLWV4dGVuc2lvbi1hdXRob3Jpbmcg aW4gT0NhbWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IFRMO0RSIFdyaXRpbmcgT0NhbWwgUFBYIHJld3JpdGVycyBpcyAqaGFyZCB3b3JrKi4gIFRoZXJl IGlzIGENCiAgY29tcGxpY2F0ZWQgaW5mcmFzdHJ1Y3R1cmUgdGhhdCBpcyBoYXJkIHRvIGV4cGxh aW4sIHRoZXJlIGFyZSBtdWx0aXBsZQ0KICBzdWNoIGluY29tcGF0aWJsZSBpbmZyYXN0cnVjdHVy ZXMgKG1heWJlIHRoZXNlIGFyZSBtZXJnaW5nPykgYW5kIGl0IGlzDQogIGhhcmQgZW5vdWdoIHRo YXQgbW9zdCBPY2FtbCBwcm9ncmFtbWVycyBkbyBub3Qgd3JpdGUgbWFjcm8tZXh0ZW5zaW9ucw0K ICBhcyBhIHBhcnQgb2YgdGhlaXIgcHJvamVjdHMuICBJIGJlbGlldmUgdGhhdCB1c2luZyBDYW1s cDUgYW5kIHBhX3BweA0KICBjYW4gbWFrZSBpdCBlYXNpZXIgdG8gd3JpdGUgbWFjcm8tZXh0ZW5z aW9ucywgdmlhOg0KDQogIDEuIHByb3ZpZGluZyBhIHNpbXBsZSB3YXkgb2YgdGhpbmtpbmcgYWJv dXQgYWRkaW5nIHlvdXIgZXh0ZW5zaW9uIHRvDQogICAgIHRoZSBwYXJzaW5nIHByb2Nlc3MuDQoN CiAgMi4gcHJvdmlkaW5nIHRyYW5zcGFyZW50IHRvb2xzIChlLmcuIHF1b3RhdGlvbnMpIGZvcg0K ICAgICBwYXR0ZXJuLW1hdGNoaW5nL2NvbnN0cnVjdGluZyBBU1QgZnJhZ21lbnRzDQoNCiAgRXhw bGFpbmVkIGJlbG93IGluIFtNYWNybyBFeHRlbnNpb25zIHdpdGgNCiAgUGFfcHB4XSgjbWFjcm8t ZXh0ZW5zaW9ucy13aXRoLXBhX3BweCkuDQoNCg0K4peKIFRoZSBvcmlnaW5hbCBhcmd1bWVudHMg YWdhaW5zdCBDYW1scDQNCg0KICBUaGUgb3JpZ2luYWwgYXJndW1lbnQgYWdhaW5zdCB1c2luZyBD YW1scDQgYXMgYSBiYXNpcyBmb3INCiAgbWFjcm8tcHJlcHJvY2Vzc2luZyBpbiBPY2FtbCwgaGFk IHNldmVyYWwgcG9pbnRzIChJIGNhbid0IGZpbmQgdGhlDQogIG9yaWdpbmFsIGRvY3VtZW50LCBi dXQgZnJvbSBtZW1vcnkpOg0KDQogIDEuICpzeW50YXgtZXh0ZW5zaW9uKiBhcyB0aGUgYmFzaXMg b2YgbWFjcm8tZXh0ZW5zaW9uIGxlYWRzIHRvIGJyaXR0bGUNCiAgICAgIHN5bnRheDogbXVsdGlw bGUgc3ludGF4IGV4dGVuc2lvbnMgb2Z0ZW4gZG8gbm90IGNvbWJpbmUgd2VsbC4NCg0KICAyLiBh IGRpZmZlcmVudCBBU1QgdHlwZSB0aGFuIHRoZSBPY2FtbCBBU1QNCg0KICAzLiBhIGRpZmZlcmVu dCBwYXJzaW5nL3ByZXR0eS1wcmludGluZyBpbmZyYXN0cnVjdHVyZSwgd2hpY2ggbXVzdCBiZQ0K ICAgICBtYWludGFpbmVkIGFsb25nc2lkZSBvZiBPY2FtbCdzIG93biBwYXJzZXIvcHJldHR5LXBy aW50ZXIuDQoNCiAgNC4gQSBuZXcgYW5kIGNvbXBsaWNhdGVkIHNldCBvZiBBUElzIGFyZSByZXF1 aXJlZCB0byB3cml0ZSBzeW50YXgNCiAgICAgZXh0ZW5zaW9ucy4NCg0KICBUbyB0aGlzLCBJJ2xs IGFkZA0KDQogIDEuIENhbWxwNCB3YXMgKmZvcmtlZCogZnJvbSBDYW1scDUsIHRoaW5ncyB3ZXJl IGNoYW5nZWQsIGFuZCBoZW5jZSwNCiAgICAgQ2FtbHA0IGxvc3QgdGhlIGNvbnRyaWJ1dGlvbiBv ZiBpdHMgb3JpZ2luYWwgYXV0aG9yLiAgSGVuY2UsDQogICAgIG1haW50YWluaW5nIENhbWxwNCB3 YXMgYWx3YXlzIGxhYm9yIHRoYXQgZmVsbCBvbiB0aGUgT2NhbWwNCiAgICAgdGVhbS4gW01heWJl IHRoaXMgZG9lc24ndCBtYXR0ZXIsIGJ1dCBpdCBjb3VudHMgZm9yIHNvbWV0aGluZy5dDQoNCg0K 4peKIEFzc2Vzc2luZyB0aGUgYXJndW1lbnRzLCB3aXRoIHNvbWUgaGluZHNpZ2h0DQoNCiAgMS4g KnN5bnRheC1leHRlbnNpb24qIGFzIHRoZSBiYXNpcyBvZiBtYWNyby1leHRlbnNpb24gbGVhZHMg dG8gYnJpdHRsZQ0KICAgICAgc3ludGF4OiBtdWx0aXBsZSBzeW50YXggZXh0ZW5zaW9ucyBvZnRl biBkbyBub3QgY29tYmluZSB3ZWxsLg0KDQogICAgIEluIHJldHJvc3BlY3QsIHRoaXMgaXMgcXVp dGUgdmFsaWQ6IGV2ZW4gaWYgb25lIHByZWZlcnMgYW5kIGVuam95cw0KICAgICBMTCgxKSBncmFt bWFycyBhbmQgcGFyc2luZywgd2hlbiBtdWx0aXBsZSBhdXRob3JzIHdyaXRlDQogICAgIGdyYW1t YXItZXh0ZW5zaW9ucyB3aGljaCBhcmUgb25seSBjb21iaW5lZCBieSB0aGlyZC1wYXJ0eSBwcm9q ZWN0cywNCiAgICAgdGhlIGNvbmRpdGlvbnMgYXJlIHBlcmZlY3QgZm9yIGNoYW9zLCBhbmQgb2Yg YSBzb3J0IHRoYXQNCiAgICAgcHJvamVjdC1hdXRob3JzIHNpbXBseSBzaG91bGRuJ3QgaGF2ZSB0 byBzb3J0IG91dC4gIEFuZCB0aGlzIGNoYW9zDQogICAgIGlzIG9mIGEgZGlmZmVyZW50IGZvcm0s IHRoYW4gbWVyZWx5IGhhdmluZyB0d28gUFBYIHJld3JpdGVycyB1c2UNCiAgICAgdGhlIHNhbWUg YXR0cmlidXRlL2V4dGVuc2lvbi1uYW1lcyAod2hpY2ggaXMsIGFyZ3VhYmx5LCBlYXNpbHkNCiAg ICAgZGV0ZWN0YWJsZSB3aXRoIHNvbWUgc3RyYWlnaHRmb3J3YXJkIHByZWRlY2xhcmF0aW9uKS4N Cg0KICAyLiBDYW1scDQvNSBoYXMgYSBkaWZmZXJlbnQgQVNUIHR5cGUgdGhhbiB0aGUgT2NhbWwg QVNUDQoNCiAgICAgT3ZlciB0aW1lLCB0aGUgUFBYIGF1dGhvcnMgdGhlbXNlbHZlcyBoYXZlIHNs b3dseSBzdGFydGVkIHRvDQogICAgIGNvbmNsdWRlIHRoYXQgdGhlIGN1cnJlbnQgcmVsaWFuY2Ug b24gdGhlIE9jYW1sIEFTVCBpcyBmcmF1Z2h0IHdpdGgNCiAgICAgcHJvYmxlbXMuICBUaGUgIkZ1 dHVyZSBvZiBQUFgiIGRpc2N1c3Npb24gdGhyZWFkIHRhbGtzIGFib3V0IHVzaW5nDQogICAgIHNv bWV0aGluZyBsaWtlIHMtZXhwcmVzc2lvbnMsIGFuZCBtb3JlIGdlbmVyYWxseSBhYm91dCBhDQog ICAgIG1vcmUtZmxleGlibGUgQVNUIHR5cGUuDQoNCiAgMy4gYSBkaWZmZXJlbnQgcGFyc2luZy9w cmV0dHktcHJpbnRpbmcgaW5mcmFzdHJ1Y3R1cmUsIHdoaWNoIG11c3QgYmUNCiAgICAgbWFpbnRh aW5lZCBhbG9uZ3NpZGUgb2YgT2NhbWwncyBvd24gcGFyc2VyL3ByZXR0eS1wcmludGVyLg0KDQog ICAgIEEgZGlmZmVyZW50IEFTVCB0eXBlIG5lY2Vzc2FyaWx5IG1lYW5zIGEgZGlmZmVyZW50DQog ICAgIHBhcnNlci9wcmV0dHktcHJpbnRlci4gIE9mIGNvdXJzZSwgb25lIGNvdWxkIG1vZGlmeSBP Y2FtbCdzIFlBQ0MNCiAgICAgcGFyc2VyIHRvIHByb2R1Y2UgQ2FtbHA1IEFTVHMsIGJ1dCB0aGlz IGlzIGEgbWlub3IgcG9pbnQuDQoNCiAgNC4gQSBuZXcgYW5kIGNvbXBsaWNhdGVkIHNldCBvZiBB UElzIGFyZSByZXF1aXJlZCB0byB3cml0ZSBzeW50YXgNCiAgICAgZXh0ZW5zaW9ucy4NCg0KICAg ICBXaXRoIHRpbWUsIGl0J3MgY2xlYXIgdGhhdCBQUFggaGFzIHByb2R1Y2VkIHRoZSBzYW1lIHRo aW5nLg0KDQogIDUuIE1haW50YWluaW5nIENhbWxwNCB3YXMgYWx3YXlzIGxhYm9yIHRoYXQgZmVs bCBvbiB0aGUgT2NhbWwgdGVhbS4NCg0KICAgICBUaGUgc2FtZSBhcmd1bWVudCAodGhhdCBlYWNo IGNoYW5nZSB0byB0aGUgT2NhbWwgQVNUIHJlcXVpcmVzIHdvcmsNCiAgICAgdG8gdXBkYXRlIENh bWxwNSkgY2FuIGJlIG1hZGUgZm9yIFBQWCAoc3BlY2lmaWNhbGx5LCB0aGlzIGlzIHRoZQ0KICAg ICByYWlzb24gZCdldHJlIG9mIG9jYW1sLW1pZ3JhdGUtcGFyc2V0cmVlKS4gIEFtdXNpbmdseSwg b25lIGNvdWxkDQogICAgIGltYWdpbmUgdXNpbmcgb2NhbWwtbWlncmF0ZS1wYXJzZXRyZWUgYXMg dGhlIGJhc2lzIGZvciBtYWtpbmcNCiAgICAgQ2FtbHA1IE9DYW1sLXZlcnNpb24taW5kZXBlbmRl bnQsIHRvby4gIFRoYXQgaXMsIHRoZSAiYmFja2VuZCIgb2YNCiAgICAgQ2FtbHA1IGNvdWxkIHVz ZSBvY2FtbC1taWdyYXRlLXBhcnNldHJlZSB0byBwcm9kdWNlIEFTVHMgZm9yIGENCiAgICAgdmVy c2lvbiBvZiBPQ2FtbCBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIG9uIHdoaWNoIGl0IHdhcyBjb21w aWxlZC4NCg0KDQpBcmd1bWVudHMgYWdhaW5zdCB0aGUgY3VycmVudCBBUEkocykgb2YgUFBYIHJl d3JpdGluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgVGhlIG92ZXJhbGwgYXJndW1lbnQgaXMgdGhhdCBpdCdzIHRvbyBjb21wbGljYXRlZCBmb3Ig bW9zdCBPQ2FtbA0KICBwcm9ncmFtbWVycyB0byB3cml0ZSB0aGVpciBvd24gZXh0ZW5zaW9uczsg d2hhdCB3ZSBzZWUgaW5zdGVhZCBvZiBhDQogIGhlYWx0aHkgZWNvc3lzdGVtIG9mIG1hbnkgYXV0 aG9ycyB3cml0aW5nIGFuZCBoZWxwaW5nLWltcHJvdmUgUFBYDQogIHJld3JpdGVycywgaXMgYSBz bWFsbCBudW1iZXIgb2YgcmV3cml0ZXJzLCBtb3N0bHkgd3JpdHRlbiBieSBKYW5lDQogIFN0cmVl dCBhbmQgcGVyaGFwcyBvbmUgb3IgdHdvIG90aGVyIHNob3BzLiAgVGhlcmUgYXJlIGEgZmV3IGJp Zw0KICByZWFzb25zIHdoeSB0aGlzIGlzIHRoZSBjYXNlICh3aGljaCBjb3JyZXNwb25kIHRvIHRo ZSByZXNwb25zZXMNCiAgYWJvdmUpLCBidXQgb25lIHRoYXQgaXNuJ3QgbWVudGlvbmVkIGlzOg0K DQogIDEuIFdoZW4gdGhlICJleHRyYSBkYXRhIiBvZiBhIFBQWCBleHRlbnNpb24gb3IgYXR0cmli dXRlIGlzDQogICAgIGVhc2lseS1leHByZXNzZWQgd2l0aCB0aGUgZml4ZWQgc3ludGF4IG9mIFBQ WCBwYXlsb2FkcywgYWxsIGlzDQogICAgIGB+d2VsbH4nIG9rLCBidXQgY2VydGFpbmx5IG5vdCBp biBncmVhdCBzaGFwZS4gIEhlcmUncyBhbiBleGFtcGxlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdHlwZSBwYWNrYWdlX3R5cGUgPQ0KICDilIIgWyVpbXBvcnQ6IFBhcnNldHJlZS5wYWNr YWdlX3R5cGUNCiAg4pSCIAkgIFtAd2l0aCBjb3JlX3R5cGUgICAgOj0gUGFyc2V0cmVlLmNvcmVf dHlwZSBbQHByaW50ZXIgUHByaW50YXN0LmNvcmVfdHlwZV07DQogIOKUgiAJCSBBc3R0eXBlcy5s b2MgOj0gQXN0dHlwZXMubG9jIFtAcG9seXByaW50ZXIgZnVuIHBwIGZtdCB4IC0+IHBwIGZtdCB4 LkFzdHR5cGVzLnR4dF07DQogIOKUgiAJCSBMb25naWRlbnQudCAgOj0gTG9uZ2lkZW50LnQgW0Bw cmludGVyIHBwX2xvbmdpZGVudF1dXQ0KICDilIIgW0BAZGVyaXZpbmcgc2hvd10NCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgVGhlIGV4cHJlc3Npb24tc3ludGF4IG9mIGFzc2lnbm1lbnQgaXMgdXNl ZCB0byBleHByZXNzIHR5cGUtZXhwcmVzc2lvbg0KICByZXdyaXRlcy4gIEFuZCB0aGlzIGlzIG5l Y2VzYXJpbHkgbGltaXRlZCwgYmVjYXVzZSB3ZSBjYW5ub3QgKGZvcg0KICBleGFtcGxlKSBzcGVj aWZ5IGxlZnQtaGFuZC1zaXplcyB0aGF0IGFyZSB0eXBlLWV4cHJlc3Npb25zIHdpdGgNCiAgdmFy aWFibGVzLiAgSXQncyBhIHBlcnZlcnNpb24gb2YgdGhlIHN5bnRheCwgd2hlbiB3aGF0IHdlIHJl YWxseSB3YW50DQogIHRvIGhhdmUgaXMgc29tZXRoaW5nIHRoYXQgaXMgcHJlY2lzZTogIm1hcCB0 aGlzIHR5cGUtZXhwcmVzc2lvbiB0bw0KICB0aGF0IHR5cGUtZXhwcmVzc2lvbiIuDQoNCiAgTm93 LCB3aXRoIHRoZSBuZXcgT2NhbWwgNC4xMS4wIHN5bnRheCwgdGhlcmUncyBhIChwYXJ0aWFsKSBz b2x1dGlvbjoNCiAgdXNlICJyYXctc3RyaW5nLWV4dGVuc2lvbnMiIGxpa2UgYHslZm9vfGFyZ2xl fH0nLiAgVGhpcyBpcyB0aGUgc2FtZSBhcw0KICBgWyVmb28ge3xhcmdsZXx9XScuICBUaGlzIHJl bGllcyBvbiB0aGUgUFBYIGV4dGVuc2lvbiB0byBwYXJzZSB0aGUNCiAgcGF5bG9hZC4gIEJ1dCB0 aGVyZSBhcmUgcHJvYmxlbXM6DQoNCiAgMS4gT2YgY291cnNlLCB0aGVyZSdzIG5vIGVxdWl2YWxl bnQgYHtAZm9vfGFyZ2xlfH0nIChhbmQgIkBAIiwgIkBAQCINCiAgICAgb2YgY291cnNlKSBmb3Ig YXR0cmlidXRlcy4NCg0KICAyLiBJZiB0aGUgcGF5bG9hZCBpbiB0aGF0IHN0cmluZyBkb2Vzbid0 ICppdHNlbGYqIGNvcnJlc3BvbmQgdG8gc29tZQ0KICAgICBwYXJzZWFibGUgT2NhbWwgQVNUIHR5 cGUsIHRoZW4gYWdhaW4sIHdlJ3JlIHN0dWNrOiB3ZSBoYXZlIHRvDQogICAgIGNvYmJsZSB0b2dl dGhlciBhIHBhcnNlciBpbnN0ZWFkIG9mIGJlaW5nIGFibGUgdG8gbWVyZWx5IGV4dGVuZCB0aGUN CiAgICAgcGFyc2VyIG9mIE9jYW1sIHRvIGRlYWwgd2l0aCB0aGUgY2FzZS4NCg0KICBOb3RlIHdl bGwgdGhhdCBJJ20gbm90IHNheWluZyB0aGF0IHdlIHNob3VsZCBleHRlbmQgdGhlIHBhcnNpbmcg cnVsZXMNCiAgb2YgdGhlIE9jYW1sIGxhbmd1YWdlLiAgUmF0aGVyLCB0aGF0IHdpdGggYW4gKmV4 dGVuc2libGUgcGFyc2VyKg0KICAoaGVuY2UsIExMKDEpKSB3ZSBjYW4gYWRkIG5ldyBub250ZXJt aW5hbHMsIGFkZCBydWxlcyB0aGF0IHJlZmVyZW5jZQ0KICBleGlzdGluZyBub250ZXJtaW5hbHMs IGFuZCB0aGVyZWJ5IGdldCBhbiBleGFjdCBzeW50YXggKGUuZy4pIGZvciB0aGUNCiAgYHBweF9p bXBvcnQnIGV4YW1wbGUgYWJvdmUuICBUaGF0IG5ldyBub250ZXJtaW5hbCBpcyB1c2VkICpvbmx5 KiBpbg0KICBwYXJzaW5nIHRoZSBwYXlsb2FkIOKAkyBub3doZXJlIGVsc2Ug4oCTIHNvIHdlIGhh dmVuJ3QgaW50cm9kdWNlZCBleGFtcGxlcw0KICBvZiBvYmplY3Rpb24gIzEgYWJvdmUuDQoNCiAg QW5kIGl0J3Mgbm90IGV2ZW4gdmVyeSBoYXJkLg0KDQoNCk1hY3JvIEV4dGVuc2lvbnMgd2l0aCBQ YV9wcHgNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBiYXNpYyB0aGVzaXMg b2YgYHBhX3BweCcgaXMgImxldCdzIG5vdCB0aHJvdyB0aGUgYmFieSBvdXQgd2l0aCB0aGUNCiAg YmF0aHdhdGVyIi4gIENhbWxwNSBoYXMgYSBsb3Qgb2YgdmVyeSB2YWx1YWJsZSBpbmZyYXN0cnVj dHVyZSB0aGF0IGNhbg0KICBiZSB1c2VkIHRvIG1ha2Ugd3JpdGluZyBtYWNyby1wcmVwcm9jZXNz b3JzIG11Y2ggZWFzaWVyLiAgYHBhX3BweCcNCiAgYWRkcyBhIGZldyBtb3JlLg0KDQogIDEuIFF1 b3RhdGlvbnMgZm9yIHBhdHRlcm5zIGFuZCBleHByZXNzaW9ucyBvdmVyIGFsbCBpbXBvcnRhbnQg T0NhbWwNCiAgICAgQVNUIHR5cGVzLg0KDQogIDIuICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIgdG8g bWFrZSB0aGUgcHJvY2VzcyBvZiByZWN1cnNpbmcgZG93biB0aGUNCiAgICAgQVNUIHRyYW5zcGFy ZW50LCBhbmQgdGhlIG1lYW5pbmcgb2YgYWRkaW5nIGNvZGUgdG8gdGhhdCBwcm9jZXNzDQogICAg IGVxdWFsbHkgdHJhbnNwYXJlbnQuDQoNCiAgMy4gYHBhX3BweCcgaW50cm9kdWNlcyAicGFzc2Vz IiBhbmQgYWxsb3dzIGVhY2ggZXh0ZW5zaW9uIHRvIHJlZ2lzdGVyDQogICAgIHdoaWNoIG90aGVy IGV4dGVuc2lvbnMgaXQgbXVzdCBmb2xsb3csIGFuZCB3aGljaCBtYXkgZm9sbG93IGl0Ow0KICAg ICB0aGVuIGBwYV9wcHgnIHRvcG9sb2dpY2FsbHkgc29ydHMgdGhlbSwgc28gdGhlcmUncyBubyBu ZWVkIGZvcg0KICAgICBwcm9qZWN0LWF1dGhvcnMgdG8gZmlndXJlIG91dCBob3cgdG8gb3JkZXIg dGhlaXIgUFBYIGV4dGVuc2lvbg0KICAgICBpbnZvY2F0aW9ucy4NCg0KICBBcyBhbiBleGFtcGxl IG9mIGEgUFBYIHJld3JpdGVyIGJhc2VkIG9uIGBwYV9wcHgnLCBoZXJlJ3MNCiAgW3BhX3BweC5o ZXJlXSBmcm9tIHRoZSBgcGFfcHB4JyB0dXRvcmlhbC4gIEluIHRoYXQgZXhhbXBsZSwgeW91J2xs IHNlZQ0KICB0aGF0IENhbWxwNSBpbmZyYXN0cnVjdHVyZSBpcyB1c2VkIHRvIG1ha2UgdGhpbmdz IGVhc3k6DQoNCiAgMS4gcXVvdGF0aW9ucyBhcmUgdXNlZCB0byBib3RoIGJ1aWxkIHRoZSBvdXRw dXQgQVNUIGZyYWdtZW50LCBhbmQgdG8NCiAgICAgcGF0dGVybi1tYXRjaCBvbiBpbnB1dHMuDQoN CiAgMi4gdGhlICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIgYXJlIHVzZWQgdG8gYWRkIG91ciBsaXR0 bGUgYml0IG9mDQogICAgIHJld3JpdGVyIHRvIHRoZSB0b3AtZG93biByZWN1cnNpb24uDQoNCiAg My4gYW5kIHdlIGRlY2xhcmUgb3VyIHJld3JpdGVyIHRvIHRoZSBpbmZyYXN0cnVjdHVyZSAod2Ug ZG9uJ3Qgc3BlY2lmeQ0KICAgICB3aGF0IHBhc3NlcyBpdCBtdXN0IGNvbWUgYmVmb3JlIG9yIGFm dGVyLCBzaW5jZSBgcGFfcHB4LmhlcmUnIGlzIHNvDQogICAgIHNpbXBsZSkuDQoNCg0KW3BhX3Bw eC5oZXJlXQ0KaHR0cHM6Ly9wYS1wcHgucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3R1dG9yaWFs Lmh0bWwjYW4tZXhhbXBsZS1wcHgtcmV3cml0ZXItYmFzZWQtb24tcGEtcHB4DQoNCg0KQ29uY2x1 c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSdtIG5vdCB0cnlpbmcg dG8gY29udmluY2UgeW91IHRvIHN3aXRjaCBhd2F5IGZyb20gUFBYIHRvIENhbWxwNS4NCiAgUGVy aGFwcywgSSdtIG5vdCBldmVuIG1lcmVseSBhcmd1aW5nIHRoYXQgeW91IHNob3VsZCB1c2UgYHBh X3BweCcgYW5kDQogIGF1dGhvciBuZXcgbWFjcm8tZXh0ZW5zaW9ucyBvbiBpdC4gIEJ1dCBJICph bSogYXJndWluZyB0aGF0IHRoZQ0KICBmZWF0dXJlcyBvZg0KDQogIDEuIHF1b3RhdGlvbnMsIHdp dGggYW50aXF1b3RhdGlvbnMgaW4gYXMgbWFueSBwbGFjZXMgYXMgcG9zc2libGUsIGFuZA0KICAg ICBoZW5jZSwgKmluIHBsYWNlcyB3aGVyZSBPY2FtbCBpZGVudGlmaWVycyBhcmUgbm90IHBlcm1p dHRlZCouDQoNCiAgMi4gZmFjaWxpdGllcyBsaWtlICJleHRlbnNpYmxlIGZ1bmN0aW9ucyIsIHdp dGggc3ludGF4IHN1cHBvcnQgZm9yDQogICAgIHRoZW0NCg0KICAzLiBhIG5ldyBBU1QgdHlwZSwg dGhhdCBpcyBzdWl0YWJsZSBmb3IgbWFjcm8tcHJlcHJvY2Vzc2luZywgYnV0IGlzbid0DQogICAg IG1lcmVseSAicy1leHByZXNzaW9ucyIgKGFmdGVyIGFsbCwgdGhlcmUncyBhIHJlYXNvbiB3ZSBh bGwgdXNlDQogICAgIHN0cm9uZ2x5LXR5cGVkIGxhbmd1YWdlcykNCg0KICA0LiBhbiBleHRlbnNp YmxlIHBhcnNlciBmb3IgdGhlIE9jYW1sIGxhbmd1YWdlLCB1c2FibGUgaW4gUFBYDQogICAgIGF0 dHJpYnV0ZS9leHRlbnNpb24gcGF5bG9hZHMNCg0KICBhcmUgaW1wb3J0YW50IGFuZCB2YWx1YWJs ZSwgYW5kIGEgUFBYIHJld3JpdGVyIGluZnJhc3RydWN0dXJlIHRoYXQNCiAgbWFrZXMgaXQgcG9z c2libGUgZm9yIHRoZSBtYXNzZXMgdG8gd3JpdGUgdGhlaXIgb3duIG1hY3JvLWV4dGVuc2lvbnMs DQogIGlzIGdvaW5nIHRvIGluY29ycG9yYXRlIHRoZXNlIHRoaW5ncy4NCg0KDQpPQ2FtbCA0LjEx LjAsIHRoaXJkIChhbmQgbGFzdD8pIGJldGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgW2h0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC00LTExLTAt dGhpcmQtYW5kLWxhc3QtYmV0YS1yZWxlYXNlLzYxNDkvMV0NCg0KDQpvY3RhY2hyb24gYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGUgcmVsZWFzZSBvZiBPQ2FtbCA0LjExLjAgaXMgbmVhci4gIEFzIG9uZSBz dGVwIGZ1cnRoZXIgaW4gdGhpcw0KICBkaXJlY3Rpb24sIHdlIGhhdmUgcHVibGlzaGVkIGEgdGhp cmQgYW5kIHBvdGVudGlhbGx5IGxhc3QgYmV0YQ0KICByZWxlYXNlLg0KDQogIFRoaXMgbmV3IHJl bGVhc2UgZml4ZXMgYW4gaW5mcmVxdWVudCBiZXN0LWZpdCBhbGxvY2F0b3IgYnVnIGFuZCBhbg0K ICBpc3N1ZSB3aXRoIGZsb2F0aW5nLXBvaW50IHNvZnR3YXJlIGVtdWxhdGlvbiBpbiB0aGUgQVJN IEVBQkkgcG9ydC4gIE9uDQogIHRoZSBlY29zeXN0ZW0gc2lkZSwgbWVybGluIGlzIG5vdyBhdmFp bGFibGUgZm9yIHRoaXMgbmV3IHZlcnNpb24gb2YNCiAgT0NhbWwuICBUaGUgY29tcGF0aWJpbGl0 eSBvZiB0aGUgb3BhbSBlY29zeXN0ZW0gd2l0aCBPQ2FtbCA0LjExLjAgaXMNCiAgY3VycmVudGx5 IGdvb2QsIGFuZCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gdGVzdCB0aGlzIGJldGEgd2l0aG91 dA0KICB0b28gbXVjaCB0cm91YmxlLg0KDQogIFRoZSBzb3VyY2UgY29kZSBpcyBhdmFpbGFibGUg YXQgdGhlc2UgYWRkcmVzc2VzOg0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv YXJjaGl2ZS80LjExLjArYmV0YTMudGFyLmd6XQ0KICBbaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1 Yi9kaXN0cmliL29jYW1sLTQuMTEvb2NhbWwtNC4xMS4wK2JldGEzLnRhci5nel0NCg0KICBUaGUg Y29tcGlsZXIgY2FuIGFsc28gYmUgaW5zdGFsbGVkIGFzIGFuIE9QQU0gc3dpdGNoIHdpdGggb25l IG9mIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHM6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg b3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSBvY2FtbC12YXJpYW50cy40LjEx LjArYmV0YTMgLS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAg b3INCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0 Y2ggY3JlYXRlIG9jYW1sLXZhcmlhbnRzLjQuMTEuMCtiZXRhMytWQVJJQU5UIC0tcmVwb3NpdG9y aWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEt cmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIHlvdSByZXBsYWNlIFZB UklBTlQgd2l0aCBvbmUgb2YgdGhlc2U6IGFmbCwgZmxhbWJkYSwgZnAsDQogIGZwK2ZsYW1iZGEN Cg0KICBXZSB3b3VsZCBsb3ZlIHRvIGhlYXIgYWJvdXQgYW55IGJ1Z3MuIFBsZWFzZSByZXBvcnQg dGhlbSBoZXJlOg0KICAgW2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXNdDQoN CiAgQ29tcGFyZWQgdG8gdGhlIHByZXZpb3VzIGJldGEgcmVsZWFzZSwgdGhlIGV4aGF1c3RpdmUg bGlzdCBvZiBjaGFuZ2VzDQogIGlzIGFzIGZvbGxvd3M6DQoNCg0KUnVudGltZToNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBbIzk3MzZdLCBbIzk3NDldOiBDb21wYWN0aW9uIG11 c3Qgc3RhcnQgaW4gYSBoZWFwIHdoZXJlIGFsbCBmcmVlDQogICAgYmxvY2tzIGFyZSBibHVlLCB3 aGljaCB3YXMgbm90IHRoZSBjYXNlIHdpdGggdGhlIGJlc3QtZml0DQogICAgYWxsb2NhdG9yLiAo RGFtaWVuIERvbGlnZXosIHJlcG9ydCBhbmQgcmV2aWV3IGJ5IExlbyBXaGl0ZSkNCg0KICDigKIg KyBbKm5ldyBidWcgZml4ZXMqXSBbIzkzMTZdLCBbIzk0NDNdLCBbIzk0NjNdLCBbIzk3ODJdOiBV c2UgdHlwaW5nDQogICAgaW5mb3JtYXRpb24gZnJvbSBDbGFtYmRhIG9yIG11dGFibGUgQ21tIHZh cmlhYmxlcy4gKFN0ZXBoZW4gRG9sYW4sDQogICAgcmV2aWV3IGJ5IFZpbmNlbnQgTGF2aXJvbiwg R3VpbGxhdW1lIEJ1cnksIFhhdmllciBMZXJveSwgYW5kIEdhYnJpZWwNCiAgICBTY2hlcmVyOyB0 ZW1wb3JhcnkgYnVnIHJlcG9ydCBieSBSaWNoYXJkIEpvbmVzKQ0KDQoNClsjOTczNl0gaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NzM2DQoNClsjOTc0OV0gaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NzQ5DQoNClsjOTMxNl0gaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85MzE2DQoNClsjOTQ0M10gaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy85NDQzDQoNClsjOTQ2M10gaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy85NDYzDQoNClsjOTc4Ml0gaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy85NzgyDQoNCg0KTWFudWFsIGFuZCBkb2N1bWVudGF0aW9uOg0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFsjOTU0MV06IEFkZCBhIGRvY3VtZW50YXRpb24gcGFn ZSBmb3IgdGhlIGluc3RydW1lbnRlZCBydW50aW1lOw0KICAgIGFkZGl0aW9uYWwgY2hhbmdlcyB0 byBvcHRpb24gbmFtZXMgaW4gdGhlIGluc3RydW1lbnRlZA0KICAgIHJ1bnRpbWUuIChFbmd1ZXJy YW5kIERlY29ybmUsIHJldmlldyBieSBBbmlsIE1hZGhhdmFwZWRkeSwgR2FicmllbA0KICAgIFNj aGVyZXIsIERhbmllbCBCw7xuemxpLCBEYXZpZCBBbGxzb3BwLCBGbG9yaWFuIEFuZ2VsZXR0aSwg YW5kDQogICAgU8OpYmFzdGllbiBIaW5kZXJlcikNCg0KICBFbnRyaWVzIG1hcmtlZCB3aXRoICIr IiB3ZXJlIGFscmVhZHkgcHJlc2VudCBpbiBwcmV2aW91cyBhbHBoYXMsIGJ1dA0KICB0aGV5IGhh dmUgYmVlbiBjb21wbGVtZW50ZWQgYnkgbmV3IGJ1ZyBmaXhlcy4NCg0KICBJZiB5b3UgYXJlIGlu dGVyZXN0ZWQgYnkgdGhlIGxpc3Qgb2YgbmV3IGZlYXR1cmVzLCBhbmQgdGhlIG5lYXJseQ0KICBm aW5hbCBsaXN0IG9mIGJ1ZyBmaXhlcyB0aGUgdXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA0 LjExLjAgaXMNCiAgYXZhaWxhYmxlIGF0Og0KDQogIFtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvYmxvYi80LjExL0NoYW5nZXNdDQoNCg0KWyM5NTQxXSBodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzk1NDENCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWxj b3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbT0NhbWwg UGxhbmV0XS4NCg0KICDigKIgW0ZyYW1hLUNsYW5nIDAuMC45IGlzIG91dC4gRG93bmxvYWQgaXQg aGVyZS5dDQoNCg0KW09DYW1sIFBsYW5ldF0gaHR0cDovL29jYW1sLm9yZy9jb21tdW5pdHkvcGxh bmV0Lw0KDQpbRnJhbWEtQ2xhbmcgMC4wLjkgaXMgb3V0LiBEb3dubG9hZCBpdCBoZXJlLl0NCmh0 dHA6Ly9mcmFtYS1jLmNvbS9pbmRleC5odG1sDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3Nl bmQgbWUgYSBtZXNzYWdlXSBtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnDQoN Clt0aGUgYXJjaGl2ZV0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24u cnNzDQoNCltvbmxpbmVdIGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdz LXdlZWtseS8NCg0KW0FsYW4gU2NobWl0dF0gaHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lw0K DQo= --===-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 21 to 28, 2020.

As I will be away with no internet next week, the next CWN will be on Augus= t 11.

Embedded ocaml templates

Emile Trotignon announced

I am very happy to announce the release of ocaml-embedded-templates.

This is a tool similar to camlmix, but camlmix was not updated for 7 years,= and there is no easy way to handle a lot of templates (my command takes a directory as an argument and = generate an ocaml module by going through the directory recursively) I also choosed to use a syntax similar to EJS, and there is a ppx for inlin= e EML.

You can check it out here : https://github.com/EmileTrotignon/embedded_ocaml_te= mplates

Here is a more extensive exemple of what can be done with this : https://githu= b.com/EmileTrotignon/resume_of_ocaml (This project generate my resume/w= ebsite in both latex and html).

This is my first opam package : feedback is very much welcome.

Proposal: Another way to debug memory= leaks

Jim Fehrle said

memprof helps you discover where memory was allocated, which i= s certainly useful. However, that may not be enough information to isolate a leak. Sometimes you'd like to know = what variables refer to excessive amounts of memory.

For this, you'd want to examine all the garbage collection roots and report= how much memory is used by each. This is useful information if you can map a GC root back to a source= file and variable.

I prototyped code to do that to help with Coq bug https://github.com/coq/coq/issues/12487. It localized several leaks enough across over 500 source files so that we coul= d find and fix them. But my prototype code is a bit crude. I'd like to clean it up and submit it as a = PR. Since this could be done in various ways, I wanted to get some design/API feedback up front rat= her than maybe doing some of it twice. Also I'd like to confident that such a PR would be accepted and = merged in a reasonable amount of time–otherwise why bother.

caml_do_roots shows how to access the GC roots. There are several types of roots:

  • global roots, corresponding to top-level variables in source files
  • dynamic global roots
  • stack and local roots
  • global C roots
  • finalized values
  • memprof
  • hook

API (in Gc):

val print_global_reachable : out_channel -> int -> unit

Prints a list to out_channel of the global roots that reach mo= re than the specified number of words. Each item shows the number of reachable words, the associated index of the = root in the *glob for that file and the name of the source file.

Something like this (but with only filenames rather than pathnames):

  102678 field  17 plugins/ltac/pltac.ml
  102730 field  18 plugins/ltac/pltac.ml
  164824 field  20 plugins/ltac/tacenv.ml
 1542857 field  26 plugins/ltac/tacenv.ml
35253743 field  65 stm/stm.ml
35201913 field   8 vernac/vernacstate.ml
 8991864 field  24 vernac/library.ml
  112035 field   8 vernac/egramml.ml
 6145454 field  84 vernac/declaremods.ml
 6435878 field  89 vernac/declaremods.ml

I would use ELF information in the binary file to map from *glob back to a filename. For example, the address symbol of the entry camlTest corresponds to = test.ml. This would only work for binary executables compiled with the -g option. It wouldn't work for= byte-compiled code. It would print an error message if it's not ELF or not -g. Also, being a little= lazy, how essential is it to support 32-bit binaries? (Q: What happens if you have 2 source files with the same= name though in different directories? Would the symbol table distinguish them?)

val get_field_index : Obj.t -> int

Returns the *glob index number for the top-level variable (pas= sed as Obj.repr var). I expect there's no way to recover variable names from the *glob index.= In my experiments, it appeared that the entries in *glob were in the same order as as the variable= and function declarations. This would let a developer do a binary search in the code to locate the variable which= it probably a necessity for large, complex files such as Coq's stm.ml–3300 lines, 1= 0+ modules defined within the file. (I noticed that variables defined in modules defined within the source file we= re not in *glob. I expect there is a root for the module as a whole and that those variables can be r= eadily found within that root.)

This would need an extended explanation in gc.mli.

val print_stack_reachable : out_channel -> int -> unit

Prints a backtrace to out_channel that also shows which roots = for each frame reach more than the specified number of words. (I'd keep the "item numbers" since there's no w= ay to translate them to variables and they might give some clues.)

Called from file "tactics/redexpr.ml" (inlined), line 207, characters 29-40
 356758154 item    0 (stack)
Called from file "plugins/ltac/tacinterp.ml", line 752, characters 6-51
  17646719 item    0 (stack)
    119041 item    1 (stack)
Called from file "engine/logic_monad.ml", line 195, characters 38-43
    119130 item    0 (stack)
 373378237 item    1 (stack)

As it turns out, 90% of the memory in Coq issue mentioned above is reachabl= e only from the stack.

I didn't consider the other types of roots yet, which I don't fully underst= and, such as local roots. Just covering global and stack roots seems like a good contribution. Dynam= ic global roots may be easy to add if they are otherwise similar to global roots. For the others I cou= ld print the reachable words, but I don't know how to direct the developer to look at the relevant= part of the code, especially if it's in C code. I suppose print_global_reachable and print_stack_reachable could be a single routine as well. That's probably better.

Let me know your thoughts.

Camlp5 (8.00~alpha01) and pa_ppx (0.0= 1)

Chet Murthy announced

Camlp5 (8.00~alpha01) and pa_ppx (= 0.01)

I'm pleased to announce the release of two related projects:

  1. Camlp5: version 8.00~a= lpha01 is an alpha release of Camlp5, with full support for OCaml syntax up= to version 4.10.0, as well as minimal compatibility with version 4.11.0. I= n particular there is full support for PPX attributes and extensions.
  2. pa_ppx: version 0.= 01 is a re-implementation of a large number of PPX rewriters (e.g. ppx_deri= ving (std (show, eq, map, etc), yojson, sexp, etc), ppx_import, ppx_assert,= others) on top of Camlp5, along with an infrastructure for developing new = ones.

This allows projects to combine the existing style of Camlp5 syntax extension, with PPX rewriting, without having to jump thru hoops to invoke camlp5 on some files, and PPX processors on others.

Camlp5 alone is not compatible with existing PPX rewriters: Camlp5 syntax-extensions (e.g. "stream parsers") would be rejected by the OCaml parser, and PPX extensions/attributes are ignored by Camlp5 (again, without pa_ppx). pa_ppx provides Camlp5-= compatible versions of many existing PPX rewriters, as well as new ones, so that one can use Camlp5 syntax extensions as well as PPX rewriters. In addition, some of the re-implemented rewriters are more-powerful than their original namesakes, and there are new ones that add interesting functionality.

For democratizing macro-extension-authoring in OCaml<= /h4>

TL;DR Writing OCaml PPX rewriters is hard work. There is a complicated infrastructure that is hard to explain, there are multiple such incompatible infrastructures (maybe these are merging?) and it is hard enough that most Ocaml programmers do not write macro-extensions as a part of their projects. I believe that using Camlp5 and pa_ppx can make it easier to write macro-extensions, via:

  1. providing a simple way of thinking about adding your extension to the p= arsing process.
  2. providing transparent tools (e.g. quotations) for pattern-matching/cons= tructing AST fragments

Explained below in [Macro Extensions with Pa_ppx](#macro-extensions-with-pa= _ppx).

  • The original arguments against Camlp4

    The original argument against using Camlp4 as a basis for macro-preprocessing in Ocaml, had several points (I can't find the original document, but from memory):

    1. syntax-extension as the basis of macro-extension leads to brittl= e syntax: multiple syntax extensions often do not combine well.
    2. a different AST type than the Ocaml AST
    3. a different parsing/pretty-printing infrastructure, which must be maint= ained alongside of Ocaml's own parser/pretty-printer.
    4. A new and complicated set of APIs are required to write syntax extensio= ns.

    To this, I'll add

    1. Camlp4 was forked from Camlp5, things were changed, and hence, C= amlp4 lost the contribution of its original author. Hence, maintaining Cam= lp4 was always labor that fell on the Ocaml team. [Maybe this doesn't matte= r, but it counts for something.]
  • Assessing the arguments, with some hindsight
    1. syntax-extension as the basis of macro-extension leads to brittle sy= ntax: multiple syntax extensions often do not combine well.

      In retrospect, this is quite valid: even if one prefers and enjoys LL(1) grammars and parsing, when multiple authors write grammar-extensions which are only combined by third-party projects, the conditions are perfect for chaos, and of a sort that project-authors simply shouldn't have to sort out. And this chaos is of a different form, than merely having two PPX rewriters use the same attribute/extension-names (which is, arguably, easily detectable with some straightforward predeclaration).

    2. Camlp4/5 has a different AST type than the Ocaml AST

      Over time, the PPX authors themselves have slowly started to conclude that the current reliance on the Ocaml AST is fraught with problems. The "Future of PPX" discussion thread talks about using something like s-expressions, and more generally about a more-flexible AST type.

    3. a different parsing/pretty-printing infrastructure, which must be maintaine= d alongside of Ocaml's own parser/pretty-printer.

      A different AST type necessarily means a different parser/pretty-printer. Of course, one could modify Ocaml's YACC parser to produce Camlp5 ASTs, but this is a minor point.

    4. A new and complicated set of APIs are required to write syntax extensions.

      With time, it's clear that PPX has produced the same thing.

    5. Maintaining Camlp4 was always labor that fell on the Ocaml team.

      The same argument (that each change to the Ocaml AST requires work to update Camlp5) can be made for PPX (specifically, this is the raison d'etre of ocaml-migrate-parsetree). Amusingly, one could imagine using ocaml-migrate-parsetree as the basis for making Camlp5 OCaml-version-independent, too. That is, the "backend" of Camlp5 could use ocaml-migrate-parsetree to produce ASTs for a version of OCaml different from the one on which it was compiled.

Arguments against the current API(s) of PPX rewriting=

The overall argument is that it's too complicated for most OCaml programmers to write their own extensions; what we see instead of a healthy ecosystem of many authors writing and helping-improve PPX rewriters, is a small number of rewriters, mostly written by Jane Street and perhaps one or two other shops. There are a few big reasons why this is the case (which correspond to the responses above), but one that isn't mentioned is:

  1. When the "extra data" of a PPX extension or attribute is easily-express= ed with the fixed syntax of PPX payloads, all is ~well~ ok, bu= t certainly not in great shape. Here's an example:
type package_type =3D
[%import:=
 Parsetree.package_type
          [@with core_type    :=3D Parsetre=
e.core_type [@printer Pprintast.core_type];
                 Asttypes.loc :=3D Asttypes=
.loc [@polyprinter fun pp fmt x -> pp fmt x.Asttypes.txt];
                 Longident.t  :=3D Longiden=
t.t [@printer pp_longident]]]
[@@deriving show]

The expression-syntax of assignment is used to express type-expression rewrites. And this is necesarily limited, because we cannot (for example) specify left-hand-sizes that are type-expressions with variables. It's a perversion of the syntax, when what we really want to have is something that is precise: "map this type-expression to that type-expression".

Now, with the new Ocaml 4.11.0 syntax, there's a (partial) solution: use "raw-string-extensions" like {%foo|argle|}. This is the s= ame as [%foo {|argle|}]. This relies on the PPX extension to parse t= he payload. But there are problems:

  1. Of course, there's no equivalent {@foo|argle|} (and "@@", = "@@@" of course) for attributes.
  2. If the payload in that string doesn't itself correspond to some = parseable Ocaml AST type, then again, we're stuck: we have to cobble togeth= er a parser instead of being able to merely extend the parser of Ocaml to d= eal with the case.

Note well that I'm not saying that we should extend the parsing rules of the Ocaml language. Rather, that with an extensible parser (hence, LL(1)) we can add new nonterminals, add rules that reference existing nonterminals, and thereby get an exact syntax (e.g.) for the ppx_import example above. That new nonterminal is used onl= y in parsing the payload – nowhere else – so we haven't introduced examples of objection #1 above.

And it's not even very hard.

Macro Extensions with Pa_ppx

The basic thesis of pa_ppx is "let's not throw the baby out wi= th the bathwater". Camlp5 has a lot of very valuable infrastructure that can be used to make writing macro-preprocessors much easier. pa_ppx adds a few more.

  1. Quotations for patterns and expressions over all important OCaml AST ty= pes.
  2. "extensible functions" to make the process of recursing down the AST tr= ansparent, and the meaning of adding code to that process equally transpare= nt.
  3. pa_ppx introduces "passes" and allows each extension to re= gister which other extensions it must follow, and which may follow it; then= pa_ppx topologically sorts them, so there's no need for proje= ct-authors to figure out how to order their PPX extension invocations.

As an example of a PPX rewriter based on pa_ppx, here's pa_ppx.here from the pa_ppx tutorial. In that example, you'll see that Ca= mlp5 infrastructure is used to make things easy:

  1. quotations are used to both build the output AST fragment, and to patte= rn-match on inputs.
  2. the "extensible functions" are used to add our little bit of rewriter t= o the top-down recursion.
  3. and we declare our rewriter to the infrastructure (we don't specify wha= t passes it must come before or after, since pa_ppx.here is so= simple).

Conclusion

I'm not trying to convince you to switch away from PPX to Camlp5. Perhaps, I'm not even merely arguing that you should use pa_ppx and author new macro-extensions on it. But I am arguing that the featur= es of

  1. quotations, with antiquotations in as many places as possible, and henc= e, in places where Ocaml identifiers are not permitted.
  2. facilities like "extensible functions", with syntax support for them
  3. a new AST type, that is suitable for macro-preprocessing, but isn't mer= ely "s-expressions" (after all, there's a reason we all use strongly-typed = languages)
  4. an extensible parser for the Ocaml language, usable in PPX attribute/ex= tension payloads

are important and valuable, and a PPX rewriter infrastructure that makes it possible for the masses to write their own macro-extensions, is going to incorporate these things.

OCaml 4.11.0, third (and last?) beta = release

octachron announced

The release of OCaml 4.11.0 is near. As one step further in this direction, we have published a third and potentially last beta release.

This new release fixes an infrequent best-fit allocator bug and an issue with floating-point software emulation in the ARM EABI port. On the ecosystem side, merlin is now available for this new version of OCam= l. The compatibility of the opam ecosystem with OCaml 4.11.0 is currently good, and it should be possible to test this beta without too much trouble.

The source code is available at these addresses:

http= s://github.com/ocaml/ocaml/archive/4.11.0+beta3.tar.gz
https://caml.inria.fr/pub/distrib/ocaml-4.11/ocaml-4.11.0+beta3.tar= .gz

The compiler can also be installed as an OPAM switch with one of the following commands:

opam update
opam switch create ocaml-variants.4.11.0+beta3 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oca=
ml-beta-repository.git

or

opam update
opam switch create ocaml-variants.4.11.0+beta3+VARIANT --repositories=3Ddef=
ault,beta=3Dgit+https://github.com/o=
caml/ocaml-beta-repository.git

where you replace VARIANT with one of these: afl, flambda, fp, fp+flambda

We would love to hear about any bugs. Please report them here: https://github.com/ocaml= /ocaml/issues

Compared to the previous beta release, the exhaustive list of changes is as follows:

Runtime:

  • #9736, #9749: Compaction mus= t start in a heap where all free blocks are blue, which was not the case wi= th the best-fit allocator. (Damien Doligez, report and review by Leo White)=
  • + [*new bug fixes*] #9316, #9443= , #9463, #9782: Use typing i= nformation from Clambda or mutable Cmm variables. (Stephen Dolan, review by= Vincent Laviron, Guillaume Bury, Xavier Leroy, and Gabriel Scherer; tempor= ary bug report by Richard Jones)

Manual and documentation:

  • #9541: Add a= documentation page for the instrumented runtime; additional changes to opt= ion names in the instrumented runtime. (Enguerrand Decorne, review by Anil = Madhavapeddy, Gabriel Scherer, Daniel B=C3=BCnzli, David Allsopp, Florian A= ngeletti, and S=C3=A9bastien Hinderer)

Entries marked with "+" were already present in previous alphas, but they have been complemented by new bug fixes.

If you are interested by the list of new features, and the nearly final list of bug fixes the updated change log for OCaml 4.11.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.11/Changes

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--===-=-=-- --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B05CBE000F for ; Tue, 18 Aug 2020 09:26:01 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=bxsj=B4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AzKID7Rewjel3ioYBHtwKV48IlGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc27YR2N2/xhgRfzUJnB7Loc0qyK6v6mADRdqs/Y6zgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal9IRmrrAjdrNQajZdiJ6o+1xfFv3VFcP?= =?us-ascii?q?lKyG11Il6egwzy7dqq8p559CRQtfMh98peXqj/Yq81U79WAik4Pm4s/MHkugXN?= =?us-ascii?q?QgWJ5nsHT2UZiQFIDBTf7BH7RZj+rC33vfdg1SaAPM32Sbc0WSm+76puVRTlhj?= =?us-ascii?q?sLOyI//WrKisB+j6RboAygpxxkwo7be4WVO+RjdaLTetMaX3dOXt1MXCBFDI6w?= =?us-ascii?q?c44DAuwcNuhasob9vUMDoxugCwexCu3hyTBHiWPt0KIgz+gsCxvL0BA8E98Mtn?= =?us-ascii?q?nfsdX7NL0VUeCw1KTF0THDYOlQ2Tzg9YbHbhAhofSNXbJsbcra1E4iGBnBjlqK?= =?us-ascii?q?r4zpJSiV2fgNs2ie7upgSf6vhnU/qwF2pjiuxtsshZfViYIVzFDE9Dx5wJsrKt?= =?us-ascii?q?GiT057e9GkHYJWuiqHOIR4XtksTHt0uCYm1LIGo5i7cTAXxJg7yRDSduKKf5SV?= =?us-ascii?q?7hzjW+ucICp1iG57db+imhu8/0itx+78WMWqzVtHqihIn9nQu3wQ1BHf99aKRu?= =?us-ascii?q?Zz8Eqv3zuEyg7d6uZBIU8ulKrbLYYswqYumZoPsETDAjH5mF3xjK+Tc0Ur5PKk?= =?us-ascii?q?6+L5bbX6vpOcMJN7hRv7MqQqgMC/Bv44MgcWU2iU+OS8yL3j/VDiT7lQkvI2la?= =?us-ascii?q?zZvIjbJcsGpq+5BwtV3pwk6xalADer1skTk3ofLF9dZR6LkYzkN0vTLPzkAvqz?= =?us-ascii?q?mVqhnCtxy/3IMbDtGojBI3benLv7Y7pw60FRxBAuwdxD/Z5YF7MMLO71V0Tsrt?= =?us-ascii?q?LXFAU5PBaxw+v/CNVyyIceWWWXD6+cP6LerEWE5vooI+mIZI4VpCjyJOQl5/7o?= =?us-ascii?q?jH85gEIdcrez0ZsQcnC4EexqI0SfYXXyntcMCXoGshQ6QeDwlVGOTTFea2y8Uq?= =?us-ascii?q?4g/D02Bo2rAZ/GRo+3gbyB2Cm7HodRZmBDEl2CDGvmeZiYV/oUcy2TLdRhkj4c?= =?us-ascii?q?WLW8RIIszQmutAj+y7tnMurb5DEXtZLl1Nh0/u3TiA89+SZzD8SH3GGAV3t7nm?= =?us-ascii?q?cSSD8wxqx/ulByyleG0ah5n/xYCcde6OhOUgcnM57T0/J1C8voVgLEcdqIR0yq?= =?us-ascii?q?QtK8ATE+Vt4x2cMBY15hG9W+iRDOxzalDKUQl7yPHZA09qPc32PtJ8tm0HbH1K?= =?us-ascii?q?whj0E8TcdVNG2mgLR/9wnJCILTnUWZjfXiSaNJlirS8i3LmW6RumlcTwg2V6jZ?= =?us-ascii?q?CzRXLEDJq56xrhfJULmGDbU8LhAHyMKTLq8Mbcfm2xEOT/7mPJHaYnmts2a2Hx?= =?us-ascii?q?eBgL2WKMLhfGAF9CHcE1Qf1QcJ93eaPAwwATfnrn+NIiZpEAfGZ0rqudJ1qHa6?= =?us-ascii?q?UlN8mwiOZksnzLG1/x8JmdSETPcCwr8PuCEgsih5WlGn0ISFWJK7uwN9cfAEMp?= =?us-ascii?q?sG61Bd2DeC71UgbKzlFLhrgxslSyoyv07q0E8sWIBQyI4yq3c70Ad5KaSZyU5M?= =?us-ascii?q?MTSC0sKpY+GFGizJ5BmqLpXu9BTGyt/Pq/UX7/Apt1jovAeoD1cvtXJ93IsMii?= =?us-ascii?q?rO1tDxFAMXFKnJfAMy/hl+qavdZ3BitYnTyHtnPLLyt2PSndUzC7l8xw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0B7AgAdgjtffSIeaIFfHgEBCxIMgy1YQ?= =?us-ascii?q?AFeVTIsg3dAiQGLM4U/jVmFdwEDAQwYAQoJAQIEAQGETAKCPQIdBgEFMxMCEAE?= =?us-ascii?q?BBQEBAQIBAwMEARMBAQsUCIYMDII3DBmDHQEKFwplIwMUBwMCEQEXARQKFwESF?= =?us-ascii?q?AYBgwyCfAUKlAubeoEyhDsBhHaBQA0CE4EWhUNLgwEIg2AmD4FNP4NsB2yCRQw?= =?us-ascii?q?LAQEBAQGBNAYBAQ5IgmGCYASPbiYBkwSSbCoHgmWBCQQLhkuBAIZMhCmGaYMAg?= =?us-ascii?q?SOIOZNFIZIZgWyFegeCVoYAilWET4FAKoFnDAczGjCDLAlgDYgfhVcBgU0BCIJ?= =?us-ascii?q?DhFk7hUQ/MwIBATMCBgEJAQEDCXUBAQUTCwGNdIJFAQE?= X-IPAS-Result: =?us-ascii?q?A0B7AgAdgjtffSIeaIFfHgEBCxIMgy1YQAFeVTIsg3dAiQG?= =?us-ascii?q?LM4U/jVmFdwEDAQwYAQoJAQIEAQGETAKCPQIdBgEFMxMCEAEBBQEBAQIBAwMEA?= =?us-ascii?q?RMBAQsUCIYMDII3DBmDHQEKFwplIwMUBwMCEQEXARQKFwESFAYBgwyCfAUKlAu?= =?us-ascii?q?beoEyhDsBhHaBQA0CE4EWhUNLgwEIg2AmD4FNP4NsB2yCRQwLAQEBAQGBNAYBA?= =?us-ascii?q?Q5IgmGCYASPbiYBkwSSbCoHgmWBCQQLhkuBAIZMhCmGaYMAgSOIOZNFIZIZgWy?= =?us-ascii?q?FegeCVoYAilWET4FAKoFnDAczGjCDLAlgDYgfhVcBgU0BCIJDhFk7hUQ/MwIBA?= =?us-ascii?q?TMCBgEJAQEDCXUBAQUTCwGNdIJFAQE?= X-IronPort-AV: E=Sophos;i="5.76,326,1592863200"; d="scan'208,217";a="356749250" X-MGA-submission: =?us-ascii?q?MDHUwjKu5RXZcFCS6PGqg7G52huSZQoCbNK/tN?= =?us-ascii?q?ZoouGNCSlpGEas3r7/QAkZUA44uegvL33h2JjGUy4p+8i4s8n2cn0Kd5?= =?us-ascii?q?1sV/Sf8olq8wOZ2ZzRl680X2MHiBcWdNjuivjqxjho1TZaVaRjClSBju?= =?us-ascii?q?BlMXUUwUAaXhxqXteQRJHfKQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 18 Aug 2020 09:25:29 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 520E9564E82; Tue, 18 Aug 2020 09:25:27 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 18 Aug 2020 09:25:27 +0200 Message-ID: <87eeo4mn4o.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 18 09:25:27 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000273, queueID=9A816564E84 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 11 to 18, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Ppx: omp 2.0.0 and next steps Old CWN Ppx: omp 2.0.0 and next steps =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: J=C3=A9r=C3=A9mie Dimino announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 quick summary: =E2=80=A2 ocaml-migrate-parsetree 2.0.0 release =E2=80=A2 you should add a upper bound in your dev repos =E2=80=A2 ppxlib compatible version coming soon =E2=80=A2 ppxlib is now the official ppx library supported by the OCaml platform Hi everyone, As [previously announced], we are [releasing the version 2.0.0 of ocaml-migrate-parsetree]. At the moment nothing is compatible with the new version and we will soon release a version of ppxlib that is compatible with it. If your project depends on ocaml-migrate-parsetree, you should add a upper bound to your development repository. If you plan to use ocaml-migrate-parsetree 2.0.0 directly, please note however that this is a transitory package. The technology implemented by ocaml-migrate-parsetree will live on and hopefully find a new home in the compiler repository proper. However, ocaml-migrate-parsetree as a standalone project will eventually stop being maintained. I am also taking the opportunity to announce that *ppxlib is the first ppx library officially supported by the OCaml platform*, and the one we recommend all ppx authors to use. It is the library that we plan to maintain for the long term. Other libraries such as `ppx_tools' or `ppx_tools_versioned' may continue to be maintained by open source contributors, however they will not be maintained by the OCaml platform and will not receive updates from the platform when new compilers are released. Only ppxlib will receive updates from the platform. If you would like to port your project to use ppxlib and are experiencing difficulties or have any question, please get in touch by replying to this post or opening a ticket on . The overall plan described in this post is the result of various discussions and/or collaborative effort between the following people: @avsm, @ceastlund, @Drup, @gasche, @jeremiedimino, @kit-ty-kate, @let-def, @NathanReb and @pitag. [previously announced] [releasing the version 2.0.0 of ocaml-migrate-parsetree] Next steps =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C As soon as the new version of ppxlib is released, we will work towards our next milestone. As a reminder, our current goal is to setup a ppx ecosystem that is continously compatible with the trunk of OCaml. To achieve that goal, we plan to add a stable API called "Astlib" on top of the compiler libraries. To keep things sustainable on the compiler side and increase flexibility, Astlib will be minimal and will be targeted at ppxlib only rather than be a general API aimed at ppx authors. The difficulty of this API is that it must expose a stable interface to the OCaml AST, which is composed of a large collection of data types. To make it work, we plan to use the technology developed in ocaml-migrate-parsetree; i.e. whole AST migration functions. While we eventually want Astlib to live in the compiler repository, we will initially develop it inside the ppxlib repository. Once it is ready, we will submit it for inclusion in the compiler. Although, we will keep a copy inside ppxlib for older versions of the compiler. We also plan to setup a smooth workflow for compiler developers to update Astlib when they change the development AST. Once this is all done, we will be in a situation where the ppx ecosystem is compatible with the trunk of OCaml at all time. And as a result, new releases of the compiler will no longer break ppx packages as long as they limit themselves to the ppxlib API. Future =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C While this work will make the ecosystem compatible with the trunk of OCaml at all times, it will essentially move the backward compatibility issue from the compiler to ppxlib.[1] This will already give us a lot more flexibility as for instance a single version of ppxlib can be compatible with a wide range of OCaml versions. However, we recognise that it is not usual to ask a community to rely on an unstable API. We made this choice as a trade-off between sustainability and complexity. Indeed, we want to maintain Astlib and Ppxlib over the long term and the best way to make things sustainable is to use simple and clear designs. While we do have solutions in our sleeves that would provide a fully stable ppx API, these are much more complicated to maintain and work with. To mitigate this, we are setting up a Dune based workflow to upgrade all ppx rewriters at once. So once the system is rolling and if your ppx rewriters are up to date and using Dune, you should expect to receive pull requests as we update ppxlib. This last part will take some time to be fully rolling, so please bear with us :) In any case, about a year after this new world is fully setup, we will review the situation and decide whether it is sustainable or whether we need to go all the way and mint a fully stable ppx API. Timeline =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 today: ocaml-migrate-parsetree 2.0.0 is being released =E2=80=A2 next week: a ppxlib compatible version is released =E2=80=A2 December 2020: astlib is ready inside the ppxlib repository =E2=80=A2 next OCaml release after that: astlib lives in the compiler =E2=80=A2 September 2021: we review the situation and decide what to do n= ext [1]: At any given time the API of ppxlib refer to a single version of the OCaml AST. In order to allow OCaml users to enjoy both ppx rewriters and new language features, the version of the AST selected by ppxlib needs to be bumped after each release of the compiler, which is a breaking change that has the potential to break several ppx packages. As a result, ppx packages will still need to be regularly updated in order to stay compatible with the latest version of ppxlib. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 11 to 18, 2020.

Ppx: omp 2.0.0 and next steps

J=C3=A9r=C3=A9mie Dimino announced

quick summary:

  • ocaml-migrate-parsetree 2.0.0 release
  • you should add a upper bound in your dev repos
  • ppxlib compatible version coming soon
  • ppxlib is now the official ppx library supported by the OCaml platform<= /li>

Hi everyone,

As previously announced, we are releasing the version 2.0.0 of ocaml-migrate-parsetree. At the moment nothing is compatible with the n= ew version and we will soon release a version of ppxlib that is compatible with it. If your projec= t depends on ocaml-migrate-parsetree, you should add a upper bound to your development r= epository.

If you plan to use ocaml-migrate-parsetree 2.0.0 directly, please note howe= ver that this is a transitory package. The technology implemented by ocaml-migrate-parsetree w= ill live on and hopefully find a new home in the compiler repository proper. However, ocaml-migrate-p= arsetree as a standalone project will eventually stop being maintained.

I am also taking the opportunity to announce that ppxlib is the first pp= x library officially supported by the OCaml platform, and the one we recommend all ppx autho= rs to use. It is the library that we plan to maintain for the long term.

Other libraries such as ppx_tools or ppx_tools_versioned= may continue to be maintained by open source contributors, however they will not be maintained by the OCaml platf= orm and will not receive updates from the platform when new compilers are released. Only ppxlib will= receive updates from the platform.

If you would like to port your project to use ppxlib and are experiencing d= ifficulties or have any question, please get in touch by replying to this post or opening a ticket = on https://github.com/ocaml-pp= x/ppxlib.

The overall plan described in this post is the result of various discussion= s and/or collaborative effort between the following people: @avsm, @ceastlund, @Drup, @gasche, @je= remiedimino, @kit-ty-kate, @let-def, @NathanReb and @pitag.

Next steps

As soon as the new version of ppxlib is released, we will work towards our = next milestone. As a reminder, our current goal is to setup a ppx ecosystem that is continously = compatible with the trunk of OCaml. To achieve that goal, we plan to add a stable API called "Astlib" on= top of the compiler libraries. To keep things sustainable on the compiler side and increase fle= xibility, Astlib will be minimal and will be targeted at ppxlib only rather than be a general API ai= med at ppx authors.

The difficulty of this API is that it must expose a stable interface to the= OCaml AST, which is composed of a large collection of data types. To make it work, we plan to u= se the technology developed in ocaml-migrate-parsetree; i.e. whole AST migration functions.

While we eventually want Astlib to live in the compiler repository, we will= initially develop it inside the ppxlib repository. Once it is ready, we will submit it for inclusion in= the compiler. Although, we will keep a copy inside ppxlib for older versions of the compiler.

We also plan to setup a smooth workflow for compiler developers to update A= stlib when they change the development AST.

Once this is all done, we will be in a situation where the ppx ecosystem is= compatible with the trunk of OCaml at all time. And as a result, new releases of the compiler will no= longer break ppx packages as long as they limit themselves to the ppxlib API.

Future

While this work will make the ecosystem compatible with the trunk of OCaml = at all times, it will essentially move the backward compatibility issue from the compiler to ppxl= ib.[1] This will already give us a lot more flexibility as for instance a single version of ppxlib c= an be compatible with a wide range of OCaml versions. However, we recognise that it is not usual to ask = a community to rely on an unstable API.

We made this choice as a trade-off between sustainability and complexity. I= ndeed, we want to maintain Astlib and Ppxlib over the long term and the best way to make things sustai= nable is to use simple and clear designs. While we do have solutions in our sleeves that would provide= a fully stable ppx API, these are much more complicated to maintain and work with.

To mitigate this, we are setting up a Dune based workflow to upgrade all pp= x rewriters at once. So once the system is rolling and if your ppx rewriters are up to date and using Du= ne, you should expect to receive pull requests as we update ppxlib. This last part will take some ti= me to be fully rolling, so please bear with us :)

In any case, about a year after this new world is fully setup, we will revi= ew the situation and decide whether it is sustainable or whether we need to go all the way and mint a f= ully stable ppx API.

Timeline

  • today: ocaml-migrate-parsetree 2.0.0 is being released
  • next week: a ppxlib compatible version is released
  • December 2020: astlib is ready inside the ppxlib repository
  • next OCaml release after that: astlib lives in the compiler
  • September 2021: we review the situation and decide what to do next

[1]: At any given time the API of ppxlib refer to a single version of the O= Caml AST. In order to allow OCaml users to enjoy both ppx rewriters and new language features, the vers= ion of the AST selected by ppxlib needs to be bumped after each release of the compiler, which is a br= eaking change that has the potential to break several ppx packages. As a result, ppx packages will st= ill need to be regularly updated in order to stay compatible with the latest version of ppxlib.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4601BE016E for ; Tue, 1 Sep 2020 09:55:54 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=pURB=CK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ASqHyvRb1OnMD/8UESuF0lJ3/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZps+9YB7h7PlgxGXEQZ/co6odzbaP7ea5AzBLsc/JmUtBWaQEbwUCh8?= =?us-ascii?q?QSkl5oK+++Imq/EsTXaTcnFt9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6?= =?us-ascii?q?OPn+FJLMgMSrzeCy/IDYbxlViDanbr5+MRS7oR/MusUIjoZuJaU8xgbUqXZUZu?= =?us-ascii?q?pawn9lK0iOlBjm/Mew+5Bj8yVUu/0/8sNLTLv3caclQ7FGFToqK2866tHluhnF?= =?us-ascii?q?VguP+2ATUn4KnRpSAgjK9w/1U5HsuSbnrOV92S2aPcrrTbAoXDmp8qlmRAP0hC?= =?us-ascii?q?oBKjU18GLZispujKJauxKhpgdww4rKb4qIOvt+ebndcs4BRWFcWspcWTBNDoa6?= =?us-ascii?q?YoASDeQOIPxYopH9qVUQsBWwCwqiC+zzxTJTnHD6wbc33v49HQ3a3gEtGc8Fvn?= =?us-ascii?q?TOrNXyMacfSfy4zK3SwjXFcvhYxCvy6IjNchAgvfGMQa97fM3LxkkrDQzFiE+c?= =?us-ascii?q?qZf5MDOV0+QNsnSb7/Z7WOK3jG4nrwFwoiSxycgwionJgIMVyknZ9Spn2oo1Is?= =?us-ascii?q?e4SEFibNOiDZBfuD2UOZFsTcM+X2Fnpjw6yrsetJKlYCQEyJopyhrBZ/GIfYWF?= =?us-ascii?q?4hPuWeWQLDp8mX9rdq+yigqy/EW81ODyVte43lZEoydZndTBtW4B2RzQ58aHVP?= =?us-ascii?q?dw+Fqq1ziI1wDW8O5EIEY0mLLDK5E/3r4wl4YTvlrbHi/xnUX2ibGZel8i+ue2?= =?us-ascii?q?9+TrerLmqYOGOI9xjgHyKKMumtawAeggPQgOWG+b+eu41LL950H2XLJKjvgunq?= =?us-ascii?q?nWsZDaOcQbprOiDANPzokj7BO/Ay+739QFhnYHMV1Fdwybj4TzNVHOOuj0De2h?= =?us-ascii?q?jFS3jDhr3fHGPqX9ApnUKnjMirHhfbln505b0gozwshT55BOBbEHPv3zQVPxtM?= =?us-ascii?q?bGARAnLwy42froCNJ41o8GWGKPBLWZMKLIvlOS6OIvOfGAZIgWuDb4Kvgl5eTi?= =?us-ascii?q?jXgjmV8SZaWpx4EYaXC8HvRnOEqVe2bjgtAEEWsSvgs+S/HqiEGfUTFIeXm+Rb?= =?us-ascii?q?4z5jY+CI6+FYfDXZ6igLiF3Ce8BZ1afHxJCleJEXvwdoWLRvcNaCaWIsN7lTwE?= =?us-ascii?q?T7ehRok83h+trA/306drIvTQ9yECqJ7vyNd46/fdmB0u7zB5AcuQ33mQQ2x6g2?= =?us-ascii?q?8EXSE60aBwrEBn11uPzbJ0j+FaGNBP4f5CTx00OoTGz+NgDtD/QgLBccmNSFah?= =?us-ascii?q?WtimBD4wQs8rz98WZEZ9H9Wjjgzd0CW2A78Vkb2LBIUp8q3CxXTxINx9y3ne2K?= =?us-ascii?q?kgiVkpXNdPOHW7iqJh8wXfHZPFn1mWmqqwe6kQwDTB+WmMwGaWuUFXSg9wUaHL?= =?us-ascii?q?XXAFYUvWqMz06F7eQbGzFbgqKhNBxsCeJKZXctDkk1BISe/7ONTZZ2Kwm3uwCg?= =?us-ascii?q?iUybOMaorqenwd3DjDB0QelAAT53mGOBAkCSeluW3eCiZiFUnzbEPs9Ol+qW+7?= =?us-ascii?q?TlMvwg6RaE1hyry19QILivyHUf8T270JuSg7pzVzBla90MraC8CcqAp5YKVcfd?= =?us-ascii?q?Q97U9b2m3Dsgx9OoWsL6Rjhl4FbwR6pFju1hVyCoVYi8cmtnIqzAxoKaKZylxN?= =?us-ascii?q?bT2Y3YqjcoHQfyP24xblI/rSxVf21MmQvKEC9KJ84x/oowfjXgJ2+Gph+91UyG?= =?us-ascii?q?eHoJTGHQ4WF5XrXRBzvxNzorWfZigm+6vV02dtOO+6qHuK0NUsHMMhyw28ZJFY?= =?us-ascii?q?KqmFCAb2HcoKQcWze8IwnF38RxYNOqhp/64xPt+6P6+P3Ketev1rnDenkXhv+I?= =?us-ascii?q?d5w16B/Cp6S/fV0tAC2f7OjVjPbCv1kFr06pO/ootDfzxHRTLmlHrUQbVJb6g3?= =?us-ascii?q?Rr4lTGejJ8rtnYd7l8erQ3lc5UKuDFMA2da0dFyVdVOvhFQMh3RSmmSunG6D9x?= =?us-ascii?q?Ixiysg9/vNxCvK0vjvfxoBO3dWSS9ll1i+eNHl3eBfZ1Chak0SrDXg4E/7w6ZB?= =?us-ascii?q?o6EmcDvZRlpOdCXtaWQ+Qu23rLXQOsM=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BEAgAtzUdffSIeaIFgg3ZSBkABXlUyL?= =?us-ascii?q?IQ3iQGJPYIQhT+RYoERA1AQAQMBDBgBDAcBAgQBAYN3gyACHQYBBTMTAhABAQU?= =?us-ascii?q?BAQECAQMDBAETAQELFAiGDAyCNwwZgx4BGAkEBjsqIwMUAQYDAhEBFwEUChcBE?= =?us-ascii?q?hQFAYMNgnwFCgOXMpt6fzOEOwEDAgECDgEOCYRCgUINAhOBFoVIS4MBhBEPgU0?= =?us-ascii?q?/gRGCWwdsgkUMCwEBAQEBFoEDBRwBAYM3gmAEj3qKIokdkhdeKgeCZoEKBAuGT?= =?us-ascii?q?YEAhhCEa4ZtgweBJohChTOOIyGSK4dpfYFlhgGGBIRThFCBQSpaDYETMxowQ4J?= =?us-ascii?q?pCQlXDY4qAReBAgEIgkOBPoJiOTuFRD8zAgEBMwIGAQkBAQMJdQEBBRMLAY5qX?= =?us-ascii?q?AEB?= X-IPAS-Result: =?us-ascii?q?A0BEAgAtzUdffSIeaIFgg3ZSBkABXlUyLIQ3iQGJPYIQhT+?= =?us-ascii?q?RYoERA1AQAQMBDBgBDAcBAgQBAYN3gyACHQYBBTMTAhABAQUBAQECAQMDBAETA?= =?us-ascii?q?QELFAiGDAyCNwwZgx4BGAkEBjsqIwMUAQYDAhEBFwEUChcBEhQFAYMNgnwFCgO?= =?us-ascii?q?XMpt6fzOEOwEDAgECDgEOCYRCgUINAhOBFoVIS4MBhBEPgU0/gRGCWwdsgkUMC?= =?us-ascii?q?wEBAQEBFoEDBRwBAYM3gmAEj3qKIokdkhdeKgeCZoEKBAuGTYEAhhCEa4Ztgwe?= =?us-ascii?q?BJohChTOOIyGSK4dpfYFlhgGGBIRThFCBQSpaDYETMxowQ4JpCQlXDY4qAReBA?= =?us-ascii?q?gEIgkOBPoJiOTuFRD8zAgEBMwIGAQkBAQMJdQEBBRMLAY5qXAEB?= X-IronPort-AV: E=Sophos;i="5.76,359,1592863200"; d="scan'208,217";a="465495024" X-MGA-submission: =?us-ascii?q?MDHqW4LVz5IbccmigY+BjSZBo2mSR2LerQDdCO?= =?us-ascii?q?8hF9Ou3JH6setP2DvVXyNDlLfFnPKi5AVJQBbsxSzGBWueKDrE1nZTQL?= =?us-ascii?q?1Dy4spkmhlmhHa3YJHMd8OGGt2grfWIUKF1gWdO6hx3ymu0Ymt5wrlgf?= =?us-ascii?q?IojsqGYioIy231y+PiCV4EXA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Sep 2020 09:55:52 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 43493564DD4; Tue, 1 Sep 2020 09:55:51 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 01 Sep 2020 09:55:51 +0200 Message-ID: <87imcy9bi0.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 1 09:55:51 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000024, queueID=7F1D1564DDC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 25 to September 01, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Writing bindings for Google Apps Script (GAS) What the Jane Street interns have wrought a small library for shell/AWK/Perl-like scripting letters 0.2.0 raylib-ocaml 0.1.0 OCaml Workshop 2020 Online Conference is live now Other OCaml News Old CWN Writing bindings for Google Apps Script (GAS) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Danielo Rodr=C3=ADguez announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Thanks to the help of this community I successfully completed a crazy idea: To write some ocaml functions to use inside [Google Apps Script] for a small stupid spreadsheet that I had. The way it works now is by having a main index.js file that calls the Ocaml functions that are available under a global Lib namespace. Everything is bundled using parcel and the Idea was to use as few JS code as possible. Because it was easier than I expected I decided to go one step further and write some bindings for the GAS functions I was using and reduce the glue JS code even more. This are the bindings that I wrote so far. They work, but are not usable inside Ocaml yet. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type spreadsheet =E2=94=82 type sheet =E2=94=82 type range =E2=94=82 external getActiveSpreadsheet : unit -> spreadsheet =3D "getAct= iveSpreadsheet" [@@bs.val][@@bs.scope =E2=94=82 "SpreadsheetApp"] =E2=94=82 external getSheets : spreadsheet -> sheet array =3D "getSheets"= [@@bs.send] =E2=94=82 external getSheetByName : spreadsheet -> string -> sheet =3D "g= etSheetByName" [@@bs.send] =E2=94=82 external getDataRange : sheet -> range =3D "getDataRange" [@@b= s.send] =E2=94=82 external getValues : range -> 'a array array =3D "getValues" [= @@bs.send] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 My doubt are on the edges. When it is just obscure GAS stuff I have no doubt, abstract types and functions to interact with them. Is when a GAS function returns data where I have doubts. Usually they are just arrays of arrays of Numbers or Strings. In the example above, the last definition says that you will get an array of arrays of `'a', but that is not true because it will be an array of "stuff" (strings, numbers, floats). How should I type it in a way that it's flexible but not cumbersome? For example, I don't think using a functor will help because you will need to create a functor for every possible return type, in my case if you have 3 sheets with 3 different shapes, you will need 3 functors. An alternative that I have used was to provide some helper functions to convert from JS to Ocaml types and then unwrap the Ocaml types, like the example I'm doing with Number_or_string. This is nothing serious and I will just add the bindings that I may need for now, but I want to hear what the community (and potential users) thinks. If anyone is interested in taking a look on the project, it is here: [Google Apps Script] Matthieu Dubuget said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Not answering directly to your question, sorry. But here is a binding I have been using for around 4 years: . Hongbo Zhang also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For return type polymorphism, you can use GADT with bs.ignore, the rough idea: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a t =3D Int : int t | String : string t =E2=94=82 external f : ('a t [@bs.ignore]) -> ... -> 'a =3D "xx" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I read discuss.ocaml.org from time to time, but checks daily where you can get a quick answer What the Jane Street interns have wrought =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yaron Minsky announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I thought folks here might find this interesting: The post summarizes three of the intern projects that happened this summer at Jane Street. It might be interesting if you're looking for an internship (or know someone who is), or if you're interested in any of the underlying tech. For example, if there's significant interest in a library for writing OCaml, we'd be more likely to open-source it. a small library for shell/AWK/Perl-like scripting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Oleg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Some time ago Chet Murthy asked about writing shell-like scripts in OCaml. Prompted by it, I also want to report on my experience and announce a small library that made it pleasant to do shell/AWK/Perl-like scripting in OCaml. The library is available at and consists of two small ML files, myawk.ml and strings.ml. The latter collects general-purpose string operations, more convenient than those in Stdlib.String. The rest of that web directory contains half a dozen sample scripts with comments. Here is the first example: a typical AWK script, but written in OCaml: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/bin/env -S ocaml =E2=94=82=20 =E2=94=82 #load "myawk.cma" =E2=94=82 open Myawk open Strings =E2=94=82 let hash =3D string_of_int <|> Hashtbl.hash =E2=94=82 ;; =E2=94=82 (* Sanitize the files originally used by join1.ml and join2.ml =E2=94=82 The files are made of space-separated fields; the first fiel= d is the =E2=94=82 key. It is sensitive; but because it is a key it can't be re= placed with =E2=94=82 meaningless garbage. We obfuscate it beyond recognition. The= third field =E2=94=82 is obfuscated as well. The second and fourth can be left as = they are, =E2=94=82 and the fifth, if present, is replaced with XXX =E2=94=82=20 =E2=94=82 The script is a proper filter: reads from stdin, writes to s= tdout =E2=94=82 *) =E2=94=82=20 =E2=94=82 for_each_line @@ map words @@ function (f1::f2::f3::f4::rest) -> =E2=94=82 print [hash f1; f2; hash f3; f4; if rest =3D [] then "" else = "XXX"] =E2=94=82 ;; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here <|> is a function composition. I wish it were in Stdlib. The real example, used in real life, was performing a database join =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 SELECT T2.* from Table1 as T1, Table2 as T2 where T1.f1 =3D T2.= f1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where Table1 and Table2 are text files with space-separated column values. Table1 is supposed to be fed to stdin: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D =E2=94=82 for_each_line @@ map words @@ =E2=94=82 map_option (function (x::_) -> Some x | _ -> None) @@ =E2=94=82 (ignore <|> shell "grep %s table1.txt") =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is a typical rough-and-dirty script. Alas, it was too rough: I was so excited that it typechecked and worked the first time, that I didn't look carefully at the output and overlooked what I was looking for (resulting in an unneeded hassle and apology). I should have queried exactly for what I wanted: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 SELECT T1.f1, T1.f4 FROM Table1 as T1, Table2 as T2 =E2=94=82 WHERE T1.f1 =3D T2.f1 AND T1.f3 <> "3" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which is actually easy to write in myawk (probably not so in AWK though) =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D =E2=94=82 for_each_line ~fname:"table2.txt" @@ map words @@ =E2=94=82 map_option (function (w::_) -> Some w | _ -> None) @@ =E2=94=82 fun w -> =E2=94=82 for_each_line ~fname:"table1.txt" @@ map words @@ =E2=94=82 map_option (function =E2=94=82 (x::f2::f3::f4::_) when x =3D w && f4 <> "3" -> Some [x;f4= ] | _ -> None) @@ =E2=94=82 print =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is the classical nested loop join. Chet Murthy might be pleased to see the extensive use of the continuation-passing style. I was apprehensive at first, but it turned out not to be a hassle. The library has a few other examples, including case-branching and rewriting a real AWK script from the OCaml distribution. Finally, let's compare with shell scripts. The example below doesn't show off the library, but it does show the benefits of OCaml for scripting. The original shell script is a sample GIT commit hook, quoted in the comments: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* =E2=94=82 From GIT's sample hooks: =E2=94=82 ANY-GIT-REPO/.git/hooks/commit-msg.sample =E2=94=82=20 =E2=94=82 # Called by "git commit" with one argument, the name of the f= ile =E2=94=82 # that has the commit message. The hook should exit with non= -zero =E2=94=82 # status after issuing an appropriate message if it wants to = stop the =E2=94=82 # commit. The hook is allowed to edit the commit message fil= e. =E2=94=82=20 =E2=94=82 # This example catches duplicate Signed-off-by lines. =E2=94=82=20 =E2=94=82 test "" =3D "$(grep '^Signed-off-by: ' "$1" | =E2=94=82 sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { =E2=94=82 echo >&2 Duplicate Signed-off-by lines. =E2=94=82 exit 1 =E2=94=82 } =E2=94=82=20 =E2=94=82 *) =E2=94=82 module H =3D Hashtbl =E2=94=82=20 =E2=94=82 let commit_msg =3D Sys.argv.(1) =E2=94=82 let ht =3D H.create 5 =E2=94=82 let () =3D =E2=94=82 for_each_line ~fname:commit_msg @@ fun l -> =E2=94=82 if is_prefix "Signed-off-by: " l <> None then begin =E2=94=82 if H.find_opt ht l <> None then begin =E2=94=82 prerr_endline "Duplicate Signed-off-by lines."; =E2=94=82 exit 1 =E2=94=82 end else =E2=94=82 H.add ht l () =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Although the OCaml script seems to have more characters, one doesn't need to type them all. Scripts like that are meant to be entered in an editor; even ancient editors have completion facilities. Looking at the original shell script brings despair, and drives me right towards Unix Haters. Not only the script is algorithmically ugly: if a duplicate signed-off line occurs near the beginning, we can report it right away and stop. We don't need to read the rest of the commit message, filter it, sort it, precisely count all duplicates and filter again. Not only the script gratuitously wastes system resources (read: the laptop battery) by launching many processes and allocating communication buffers. Mainly, the script isn't good at its primary purpose: it isn't easy to write and read. Pipeline composition of small stream processors is generally a good thing =E2=80=93 but not when = each stream processor is written in its own idiosyncratic language. Incidentally, I have doubts about the script: I think that quotes around $1 are meant to be embedded; but why they are not escaped then? Probably it is some edge case of bash, out of several 0thousands. In contrast, OCaml script does exactly what is required, with no extra work. Everything is written in only one language. letters 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Miko announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Getting this release done took a bit longer than expected due to some real life factors, but finally here it is. This one mainly focuses on the most requested features and improvements like simplifying configuration around CA certificates, provides some basic documentation and additionally adds support for `multipart/alternative' emails with combined HTML and plain text content. jerben then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Link to Github: raylib-ocaml 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Tobias Mock announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce the first version of [raylib-ocaml], a binding to the awesome [raylib] game development library. The release can be found on opam as ["raylib"]. The bindings are nearly complete, as far as functions and types go, but only a subset was tested so far. I will work on bringing more of the numerous examples of the C version to OCaml in the future. Currently, raylib-ocaml only works on Linux, but I plan to support Windows (and possibly other targets) in the future. Feel free to give it a spin and please report any issues you run into. [raylib-ocaml] [raylib] ["raylib"] OCaml Workshop 2020 Online Conference is live now =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this thread, Didier Wenzek announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 [OCaml 2020 All Videos] [OCaml 2020 All Videos] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [BuckleScript Good and Bad News] =E2=80=A2 [What the interns have wrought, 2020 edition] =E2=80=A2 [Coq 8.12.0 is out] [OCaml Planet] [BuckleScript Good and Bad News] [What the interns have wrought, 2020 edition] [Coq 8.12.0 is out] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 25 to Septembe= r 01, 2020.

Writing bindings for Google Apps Script (GAS)

Danielo Rodr=C3=ADguez announced

Thanks to the help of this community I successfully completed a crazy idea:= To write some ocaml functions to use inside Google Apps Script for a small stupid spreadsheet that I had.

The way it works now is by having a main index.js file that calls the Ocaml= functions that are available under a global Lib namespace. Everything is bundled using parcel = and the Idea was to use as few JS code as possible. Because it was easier than I expected I decided to= go one step further and write some bindings for the GAS functions I was using and reduce the glue J= S code even more.

This are the bindings that I wrote so far. They work, but are not usable in= side Ocaml yet.

type spreadsheet
type sheet
type range
external getActiveSpreadsheet : unit -> spreadshee=
t =3D "getActiveSpreadsheet" [@@bs.val][@@bs.scope
"SpreadsheetApp"]
external getSheets : spreadsheet -> sheet array =
=3D "getSheets" [@@bs.send]
external getSheetByName : spreadsheet -> string -&=
gt; sheet =3D "getSheetByName" [@@bs.send]
external getDataRange : sheet -> range =3D "getDataRange"  [@@bs.send]
external getValues : range -> 'a array array =3D <=
span style=3D"color: #8b2252;">"getValues"  [@@bs.send]

My doubt are on the edges. When it is just obscure GAS stuff I have no doub= t, abstract types and functions to interact with them. Is when a GAS function returns data where = I have doubts. Usually they are just arrays of arrays of Numbers or Strings. In the example above, the = last definition says that you will get an array of arrays of 'a, but that is not true be= cause it will be an array of "stuff" (strings, numbers, floats). How should I type it in a way that it's flexible but not cumbersome? For ex= ample, I don't think using a functor will help because you will need to create a functor for every possi= ble return type, in my case if you have 3 sheets with 3 different shapes, you will need 3 functors. An alternative that I have used was to provide some helper functions to con= vert from JS to Ocaml types and then unwrap the Ocaml types, like the example I'm doing with Number_or_= string. This is nothing serious and I will just add the bindings that I may need fo= r now, but I want to hear what the community (and potential users) thinks.

If anyone is interested in taking a look on the project, it is here: htt= ps://github.com/danielo515/ElectronicProjectsSpreadsheet

Matthieu Dubuget said

Not answering directly to your question, sorry.

But here is a binding I have been using for around 4 years: https://= dubuget.fr/gitea/matthieu/ocaml-google-app.git.

Hongbo Zhang also replied

For return type polymorphism, you can use GADT with bs.ignore, the rough id= ea:

type 'a t =3D  Int : int t | String : stri=
ng t
external f : ('a t [@=
bs.ignore]) -> ... -> 'a =3D "=
xx"

I read discuss.ocaml.org from time to time, but checks https://forum.rescript-lang.org/ daily where y= ou can get a quick answer

What the Jane Street interns have wrought

Yaron Minsky announced

I thought folks here might find this interesting:

https://blog.janestreet.com/what-the-interns-have-wrought-2020/

The post summarizes three of the intern projects that happened this summer = at Jane Street. It might be interesting if you're looking for an internship (or know someone who is), o= r if you're interested in any of the underlying tech. For example, if there's significant interest in= a library for writing OCaml, we'd be more likely to open-source it.

a small library for shell/AWK/Perl-like scripting

Oleg announced

Some time ago Chet Murthy asked about writing shell-like scripts in OCaml. Prompted by it, I also want to report on my experience and announce a small library that made it pleasant to do shell/AWK/Perl-like scripting in OCaml.

The library is available at
http://okmij.o= rg/ftp/ML/myawk/0README.dr
and consists of two small ML files, myawk.ml and strings.ml. The latter collects general-purpose string operations, more convenient than those in Stdlib.String. The rest of that web directory contains half a dozen sample scripts with comments.

Here is the first example: a typical AWK script, but written in OCaml:

#!/bin/=
env -S oc=
aml

#load 
open Myawk open Strings
let hash =3D string_of_int <|> Hashtbl.hash
;;
(* S=
anitize the files originally used by join1.ml and join2.ml
   The files are made of space-separated fi=
elds; the first field is the
   key. It is sensitive; but because it is =
a key it can't be replaced with
   meaningless garbage. We obfuscate it bey=
ond recognition. The third field
   is obfuscated as well. The second and fo=
urth can be left as they are,
   and the fifth, if present, is replaced w=
ith XXX

   The script is a proper filter: reads fro=
m stdin, writes to stdout
 *)<=
/span>

for_each_line @@ map words @@ function (f1::f2::f3<=
span style=3D"color: #000000; background-color: #ffffff;">::f4::rest) ->
  print [hash f1; f2; hash f3; f4; if rest =3D [] then "" else "XXX"]
;;

Here <|> is a function composition. I wish it were in Stdlib. The real example, used in real life, was performing a database join

SELECT T2.* from Table1 as T1, Table2 as T2 where T1.f1 =3D T2.f1

where Table1 and Table2 are text files with space-separated column values. Table1 is supposed to be fed to stdin:

let () =3D
  for_each_line @@ map words @@
  map_option (function (x::_) -> =
Some x | =
_ -> None) @@
  (ignore <|> shell "grep %s table=
1.txt")

It is a typical rough-and-dirty script. Alas, it was too rough: I was so excited that it typechecked and worked the first time, that I didn't look carefully at the output and overlooked what I was looking for (resulting in an unneeded hassle and apology). I should have queried exactly for what I wanted:

SELECT T1.f1, T1.f4 FROM Table1 as T1, Table2 as T2
WHERE T1.f1 =3D T2.f1 AND T1.f3 <> "3"

which is actually easy to write in myawk (probably not so in AWK though)

let () =3D
  for_each_line ~fname:"table2.txt" @@=
 map words @@
  map_option (function (w::_) -> =
Some w | =
_ -> None) @@
  fun ~fname:"table1.txt" @@=
  map words @@
    map_option (function
     (x::=
f2::f3::f4::_) when x =3D w && f4 <> "3" -> Some [x;f4] | _ -> None) @@
    print

This is the classical nested loop join. Chet Murthy might be pleased to see the extensive use of the continuation-passing style. I was apprehensive at first, but it turned out not to be a hassle.

The library has a few other examples, including case-branching and rewriting a real AWK script from the OCaml distribution.

Finally, let's compare with shell scripts. The example below doesn't show off the library, but it does show the benefits of OCaml for scripting. The original shell script is a sample GIT commit hook, quoted in the comments:

(*
From GIT's sample hooks:
  ANY-GIT-REPO/.git/hooks/commit-msg.sample=


  # Called by "git commit" with one argumen=
t, the name of the file
  # that has the commit message.  The hook =
should exit with non-zero
  # status after issuing an appropriate mes=
sage if it wants to stop the
  # commit.  The hook is allowed to edit th=
e commit message file.

  # This example catches duplicate Signed-o=
ff-by lines.

test "" =3D "$(grep '^Signed-off-by: ' "$1"=
 |
         sort | uniq -c | sed -e '/^[   ]*1=
[    ]/d')" || {
        echo >&2 Duplicate Signed-of=
f-by lines.
        exit 1
}

*)
module H =3D Hashtbl<=
/span>

let commit_msg =3D =
Sys.argv.(1)
let ht =3D H.create 5
let () =3D
  for_each_line ~fname:commit_msg @@ fun=
 l ->
  if is_prefix "Signed-off-by: " l <> None =
then begin
    if H.find_opt ht l <> None then =
begin
      prerr_endline "Duplicate Signed-off-b=
y lines.";
      exit 1
    end else
      H.add ht l ()
  end

Although the OCaml script seems to have more characters, one doesn't need to type them all. Scripts like that are meant to be entered in an editor; even ancient editors have completion facilities.

Looking at the original shell script brings despair, and drives me right towards Unix Haters. Not only the script is algorithmically ugly: if a duplicate signed-off line occurs near the beginning, we can report it right away and stop. We don't need to read the rest of the commit message, filter it, sort it, precisely count all duplicates and filter again. Not only the script gratuitously wastes system resources (read: the laptop battery) by launching many processes and allocating communication buffers. Mainly, the script isn't good at its primary purpose: it isn't easy to write and read. Pipeline composition of small stream processors is generally a good thing – but not when = each stream processor is written in its own idiosyncratic language. Incidentally, I have doubts about the script: I think that quotes around $1 are meant to be embedded; but why they are not escaped then? Probably it is some edge case of bash, out of several 0thousands.

In contrast, OCaml script does exactly what is required, with no extra work. Everything is written in only one language.

letters 0.2.0

Miko announced

Getting this release done took a bit longer than expected due to some real = life factors, but finally here it is.

This one mainly focuses on the most requested features and improvements lik= e simplifying configuration around CA certificates, provides some basic documentation and additionally = adds support for multipart/alternative emails with combined HTML and plain text= content.

jerben then added

raylib-ocaml 0.1.0

Tobias Mock announced

I'd like to announce the first version of raylib-ocaml, a binding to the awesome raylib game = development library. The release can be found on opam as "rayli= b".

The bindings are nearly complete, as far as functions and types go, but onl= y a subset was tested so far. I will work on bringing more of the numerous examples of the C version= to OCaml in the future.

Currently, raylib-ocaml only works on Linux, but I plan to support Windows = (and possibly other targets) in the future.

Feel free to give it a spin and please report any issues you run into.

OCaml Workshop 2020 Online Conference is live now

Deep in this thread, Didier Wenzek announced

Other OCaml News

From the ocamlcore planet blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C9EBDE00D5 for ; Tue, 8 Sep 2020 15:11:21 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=B7Tq=CR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AgWePLxUwcxmeDH5R565lOtSlfOTV8LGtZVwlr6E/?= =?us-ascii?q?grcLSJyIuqrYZRaPu6dThVPEFb/W9+hDw7KP9fy5BypZu8rK4ClKWacPfidNsd?= =?us-ascii?q?8RkQ0kDZzNImzAB9muURYHGt9fXkRu5XCxPBsdMs//Y1rPvi/6tmZKSV3wOgVv?= =?us-ascii?q?O+v6BJPZgdip2OCu4Z3TZBhDiCagbb9oIxi6sATcutMLjYd8Jas9xRjErmZVcO?= =?us-ascii?q?lK2G1kIk6ekQzh7cmq5p5j9CpQu/Ml98FeVKjxYro1Q79FAjk4Km45/MLkuwXN?= =?us-ascii?q?QguJ/XscT34ZkgFUDAjf7RH1RYn+vy3nvedgwiaaPMn2TbcpWTS+6qpgVRHlhD?= =?us-ascii?q?sbOzM/7WrYjdF+jL9AoBK5uRNw35LUbo+SNPp7ZKzdfNUaTndFUsteUyFNB4Wx?= =?us-ascii?q?Y4sMAeoHI+ZYrpL9p1oVohu6GwanGe3uyjhShnDrxq0xzuAtHA/a0AAlGd8FrX?= =?us-ascii?q?bao8jvNKoKUe670rTGwzvAYfxZxTjw85LHfgw7rPyWQb58bcjcxE8yHA3FlFWQ?= =?us-ascii?q?ronlMiuJ2+QJqWeb6fdrW/+zhG4nrgFxoySvxtsxgYTOnI0VzkrL9SNjzIYuOd?= =?us-ascii?q?K4SEt7Yd+4EJtMrCyaL4x2QsciQmF0pik11r0GuZi6fCgT1ZQo2QTTa/udc4iH?= =?us-ascii?q?+x/uUvuaLjhkinx/Yr2/mwqy/la6yu36TsS51FJHozdFnNTPuH0A2R7e5tSHR/?= =?us-ascii?q?Zy/kms1jSC2QDd5O9LJU05l7fWJ4IhzLIukpcfr0rNEzL4lkj3gqKaaFkp9+61?= =?us-ascii?q?4OrpZbXmo4WTN45yigzmKqQhhNC/AeUkMgcQR2ib/uG81Lj98kHjRrVFkOE2nr?= =?us-ascii?q?HesJ/GP8sbo6q5DxVS0oY55BazFzam0NICnXkGNl1JYhyHj5LxN1HBIfD4Efe/?= =?us-ascii?q?g0m3nztx2//GObjhDo3CLnjCjLfhfat95FVGxAoyytBT/51UCrAdIPLzR0/+r8?= =?us-ascii?q?bUAgU4Mwyz2+rnCs9y1oUAVmKUHq+ZKr3dvkGU5u41P+aMY4oVtC78K/c45//u?= =?us-ascii?q?iXs5lUUafamz0psabm2zEPd+I0iBfHbgnNMMHX0XsgYiQ+HmklOPXSJJa3u8UK?= =?us-ascii?q?8w/iw3BYy7AYvZWIyggLOM0D2mEpFKfGxKF1KBHWvueo6ZQfkDcjiSLdVkkjEc?= =?us-ascii?q?VbiuVYsh1Ra2uQ//xLtrM/DY+jUftZLn1Nl1+/Pcmg0y9TxyDsSdynyNQH9ukm?= =?us-ascii?q?MPXT8207hzoU17ylidzah1m+FUGcJX6v9TTws2KZHRw/Z0BtzuQA7McNiERE6j?= =?us-ascii?q?Qtq8ADExStwxw8UJY0Z4A9iskwzN0Te2D7INirGGBoI68rvE0nXvO8hw027G1K?= =?us-ascii?q?4lj1gmXstAK3Gphq559wjSHo7JjluWm7ytdaQG0y7A7H2MzW6Us0FeSgJwSrnK?= =?us-ascii?q?XXAaZkvXsdT5+ljPQKSpCbQ6NAtO1dCNKrBQZt3sglhHS+3vONPEY2K+g2uwHw?= =?us-ascii?q?qHxquQbIr2fGUQxDnSB1IBkwAX5HqGMQk+Bjy9o2/FFzxvFVfvY1v2/uVkqXO7?= =?us-ascii?q?SFU0zwCQYEF72bq14E1dufvJAfcM2PhM7CM+rR1wA1D72d/KXZ7I7QF+eu8UKY?= =?us-ascii?q?c2/1Fv0WPCqxc7P5CxK6QkgUQRJUA/tErr01BzC55cuckstnIjigRobeqT11ZZ?= =?us-ascii?q?XzeZxozrfLrNIGju9RShbL6Q10yN/syR//Im7P0+427ovASoClZqp3xj2t8TyH?= =?us-ascii?q?Cc45TWECIKVpbgTks89x57vqzXJC4n6NWHhjVXLaCov2qaiJoSD+w/x0P/Lo4O?= =?us-ascii?q?YpPBLxf7FoghP+brLeUrn1azaRddY7JY87MyNM69Mf7ayOisJukyxWv731QC25?= =?us-ascii?q?h01we3zwQ5SuPM2MxekfSIh02fUDPtkFqqssb2gJ1JIzYIETjmkHS2NMtqfqR3?= =?us-ascii?q?OL0zJyK2OcTul4dmgJr8R3NT9FiiHk4LnsizdkjLYg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BPBAAtzUdffSIeaIFgHgEBCxIMggyBI?= =?us-ascii?q?YEYAV5VMiyEN4kBiT2CEIU/jV+EA4FkEAEDAQwYAQ4FAQIEAQGETAKCSQIdBgE?= =?us-ascii?q?FMxMCEAEBBQEBAQIBAwMEARMBAQsUCIVfCCUMQxYBgV0MDAMDgyUBGAEIBAY6K?= =?us-ascii?q?yMDFAEGAwIRARcBFAoXARIUBoMNgnwFCpc1mjYZNXZ/M4Q7AQMDhGqBQg0CE4E?= =?us-ascii?q?WAYVHS4MBgnOBHg+BTT+BEYISSQdsgkUMCwEBAQEBgRkOARECAQghLYJhgmAEj?= =?us-ascii?q?00pBCQCAZMYknUqB4JmgQoEC4ZNgQCGKySELIZtgweBJoQbhCeTViGQAIIrh2k?= =?us-ascii?q?HdgiBXYYBileEUIFBKoEKPwEbAgwHMxowQ4I1ATMJYA1YgmaKagMXg06BPoEmg?= =?us-ascii?q?XU7hUEDPzMCAQEHLAIGAQkBAQMJdQEBBRMLAYsihCQBAQ?= X-IPAS-Result: =?us-ascii?q?A0BPBAAtzUdffSIeaIFgHgEBCxIMggyBIYEYAV5VMiyEN4k?= =?us-ascii?q?BiT2CEIU/jV+EA4FkEAEDAQwYAQ4FAQIEAQGETAKCSQIdBgEFMxMCEAEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQsUCIVfCCUMQxYBgV0MDAMDgyUBGAEIBAY6KyMDFAEGAwIRARc?= =?us-ascii?q?BFAoXARIUBoMNgnwFCpc1mjYZNXZ/M4Q7AQMDhGqBQg0CE4EWAYVHS4MBgnOBH?= =?us-ascii?q?g+BTT+BEYISSQdsgkUMCwEBAQEBgRkOARECAQghLYJhgmAEj00pBCQCAZMYknU?= =?us-ascii?q?qB4JmgQoEC4ZNgQCGKySELIZtgweBJoQbhCeTViGQAIIrh2kHdgiBXYYBileEU?= =?us-ascii?q?IFBKoEKPwEbAgwHMxowQ4I1ATMJYA1YgmaKagMXg06BPoEmgXU7hUEDPzMCAQE?= =?us-ascii?q?HLAIGAQkBAQMJdQEBBRMLAYsihCQBAQ?= X-IronPort-AV: E=Sophos;i="5.76,359,1592863200"; d="scan'208,217";a="466611667" X-MGA-submission: =?us-ascii?q?MDH7XDFDOxRx/OmgHE8bqDTpDmfwWw38crCuHG?= =?us-ascii?q?jSq2LcRWu4kkFZw1mniIrdRh7BlLGOt0KpPORwyM+ui3+ontOEa6jc4B?= =?us-ascii?q?unC8zumDp8EoL6bGZoBiiNhixKubfAOkAjWTZU/W8LfZ1A1qkkGATKgq?= =?us-ascii?q?ZgqI0VEaGZwiV0mwDbYkpjlw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 08 Sep 2020 15:11:19 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 18B2C5605E0; Tue, 8 Sep 2020 15:11:18 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 08 Sep 2020 15:11:17 +0200 Message-ID: <877dt4xvka.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 8 15:11:18 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000367, queueID=6965F5611D7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 01 to 08, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml 4.11.1: early bugfix release textmate-language 0.1.0 Batteries v3.1.0 Job offer in Paris - Be Sport Some SIMD in your OCaml A PPX Rewriter approach to ocaml-migrate-parsetree telltime - when is when exactly? Ocamlunit emacs minor-mode Sihl 0.1.0 promise_jsoo 0.1.0 Other OCaml News Old CWN OCaml 4.11.1: early bugfix release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 A serious bug has been discovered last week in OCaml 4.11.0: explicit polymorphic annotations are checked too permissively. Some incorrect programs (possibly segfaulting) are accepted by the compiler in 4.11.0. Programs accepted by OCaml 4.10 are unchanged. We are thus releasing OCaml 4.11.1 as an early bugfix version. You are advised to upgrade to this new version if you were using OCaml 4.11.0. It is (or soon will be) available as a set of OPAM switches with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 4.11.1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and as a source download here: This bug was introduced when making polymorphic recursion easier to use. We are working on making the typechecker more robust and more exhaustively tested to avoid such issues in the future. Bug fixes: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 [#9856], [#9857]: Prevent polymorphic type annotations from generalizing weak polymorphic variables. (Leo White, report by Thierry Martinez, review by Jacques Garrigue) =E2=80=A2 [#9859], [#9862]: Remove an erroneous assertion when inferred function types appear in the right hand side of an explicit :> coercion (Florian Angeletti, report by Jerry James, review by Thomas Refis) [#9856] [#9857] [#9859] [#9862] Rwmjones then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 We've now got 4.11.1 in Fedora 33 & Fedora 34. No apparent problems so far. textmate-language 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: dosaylazy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am pleased to announce [textmate-language 0.1.0]. Textmate-language is a library for tokenizing code using TextMate grammars. Therefore, it may be useful for implementing syntax highlighters. Please report any bugs or API inconveniences you find. [textmate-language 0.1.0] Batteries v3.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: UnixJunkie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 OCaml Batteries Included is a community-maintained extended standard library for OCaml. The latest API can be found here: This minor release adds support for OCaml 4.11. It has been available in opam for some days. Special thanks to all the contributors! The changelog follows: =E2=80=A2 Compatibility fixes for OCaml-4.11 [#962] (Jerome Vouillon) =E2=80=A2 BatEnum: added combination [#518] (Chimrod, review by hcarty) =E2=80=A2 fix benchmarks [#956] (Cedric Cellier) =E2=80=A2 BatFile: added count_lines [#953] (Francois Berenger, review by Cedric Cellier) =E2=80=A2 BatArray: use unsafe_get and unsafe_set more often [#947] (Fran= cois Berenger, review by Cedric Cellier) =E2=80=A2 fix some tests for ocaml-4.10.0 [#944] (kit-ty-kate) =E2=80=A2 BatResult: BatPervasives.result is now equal to Stdlib.result instead of sharing constructors without being the same type [#939], [#957] (Cl=C3=A9ment Busschaert, Cedric Cellier). [#962] [#518] [#956] [#953] [#947] [#944] [#939] [#957] Job offer in Paris - Be Sport =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Vincent Balat announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Be Sport is looking to hire an OCaml developer with skills in =E2=80=A2 Mobile/web feature design =E2=80=A2 Team management =E2=80=A2 Use of Social networks She/he will take part in the development of our Web and mobile apps, entirely written in OCaml with Ocsigen, and participate in reflections on features. Please contact me for more information or send an email to jobs@besport.com. Some SIMD in your OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anmol Sahoo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Fresh from a weekend of hacking, I would like to share some results of an experiment I conducted of creating a library for exposing Intel AVX2 intrinsics to OCaml code. AVX2 is an instruction set subset that adds data-parallel operations in hardware. I chose to fork the amazing [bigstringaf] library and modified it. You can find the additions to the code here - [bigstringaf_simd]. [bigstringaf] [bigstringaf_simd] Overview =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Given a type `Bigstring.t' (1 dimensional byte arrays) there now exist functions such as - =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val cmpeq_i8 : (t * int) -> (t * int) -> (t * int) -> unit =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 So `cmpeq_i8 (x,o1) (y,o2) (z,03)' will compare 32 bytes starting at `o1' and `o2' from `x' and `y' respectively and store the result in `z' at `o3'. Why? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This was mainly an exercise in curiosity. I just wanted to learn whether something like this is viable. I also want to see if adding some type-directed magic + ppx spells can let us write data parallel code much more naturally similar to what `lwt / async' did for async code. At the same time, you might ask - why not use something like Owl (which already has good support for data-parallel operations)? Apart from the fact that such libraries are oriented towards numerical code, I would also like to explore if we can operate directly on OCaml types and cast them into data parallel algorithms. Like how `simdjson' pushed the boundaries of JSON parsing, it would be nice to port idiomatic code to data-parallel versions in OCaml. Can we, at some point, have generic traversals of data-types, which are actually carried out in a data-parallel fashion? Does it work? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Given the limitation of the current implementation (due to foreign function calls into C), I still found some preliminary results to be interesting! Implementing the `String.index' function, which returns the first occurence of a char, the runtime for finding an element at the `n-1' position in an array with `320000000' elements is - =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 serial: 1.12 seconds =E2=94=82 simd: 0.72 seconds (1.5x) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I still have to do the analysis what the overhead of the function call into C is (even with `[@@noalloc]'! Future directions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C It would be interesting to see, if we can create a representation which encapsulates the various SIMD ISA's such as AVX2, AVX512, NEON, SVE etc. Further more, it would be really interesting to see if we can use ppx to automatically widen `map` functions to operate on blocks of code, or automatically cast data types in a data parallel representation. Disclaimer =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C This was mostly a hobby project, so I cannot promise completing any milestones or taking feature requests etc. I definitely do not recommend using this in production, because of the lack of testing etc. A PPX Rewriter approach to ocaml-migrate-parsetree =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Chet Murthy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 TL;DR =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Based on `camlp5' and the `pa_ppx' PPX rewriters, I've written a new one, `pa_deriving_plugins.rewrite', that automates almost all the work of writing a migration from one version of OCaml's AST to another. 1. It took a few days (b/c of laziness) to write the initial PPX rewriter 2. A day to get 4.02->4.03 AST migration working 3. a couple of hours to get 4.03->4.02 working 4. and a few more hours to get 4.03<->4.04 and 4.04<->4.05 working At this point, I fully expect that the other version-pairs will not be difficult. You can find this code [warning: very much a work-in-progress] at The file `pa_deriving.plugins/pa_deriving_rewrite.ml' contains the source for the PPX rewriter. The directory `pa_omp' contains the migrations, typically named `rewrite_NNN_MMM.ml'. A slightly longer-winded explanation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C If you think about it, `ppx_deriving.map' isn't so different from what we need for `ocaml-migrate-parsetree'. `ppx_deriving.map', from a type definition for ~ 'a t~, will automatically generate a function =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 map_t : ('a -> 'b) -> 'a t -> 'b t =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you think about it, if we could just substitute our own type for the second occurrence of `t' (somehow =E2=80=A6. yeah *grin*) then it wou= ld be almost like what we want for o-m-p, yes? With 11 versions of the Ocaml AST so far, maybe it's worth thinking about how to automate more of the migration task. Also, since so much of it is type-structure-driven, one would think that it would be an excellent opportunity to apply PPX rewriting technology. *Indeed, one might think that a good test of PPX rewriting, is the ability to automate precisely such tasks.* So what's hard about this migration task? Here are some issues (maybe there are more): 1. the types are slightly differently-organized in different versions of the AST. Types might move from one module to another. 2. sometimes new types are introduced and old ones disappear 3. constructor data-types may get new branches, or lose them 4. record-types may get new fields, or lose them 5. sometimes the analogous types in two consecutive versions are just really, really different [but this is rare]: we need to supply the code directly 6. when mapping from one version to another, sometimes features are simply not mappable, and an error needs to be raised; that error ought to contain an indication of where in the source that offending feature was found 7. And finally, when all else fails, we might need to hack on the migration code directly But morally, the task is really straightforward (with problems listed in-line): 1. use `ppx_import' to copy over types from each of the AST times of each Ocaml version =E2=80=A2 `ppx_import' works on `.cmi' files, and those have different formats in different versions of Ocaml. Wouldn't it be nice if it worked on `.mli' files, whose syntax (b/c OCaml is well-managed) doesn't change much? 2. build a single OCaml module that has all the AST types in it (from all the versions of OCaml) =E2=80=A2 but without the form =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type t =3D M.t =3D A of .. | B of .... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 that is, without the "type equation" that allows for a new type-definition to precisely repeat a previous one. 3. Then use `ppx_import' against this single module to construct a recursive type-declaration list of all the AST types for a particular version of OCaml, and apply a "souped-up" version of ppx_deriving.map to it, to map the types to *another* version of the AST types. =E2=80=A2 but `ppx_deriving.map' doesn't do this today, and besides, it would have to provide a bunch of "escape hatches" for all the special-cases I mentioned above. But this is in principle doable, and it has the nice feature that all the tedious boilerplate is mechanically-generated from type-definitions, hence likely to not contain errors (assuming the PPX rewriter isn't buggy). So I decided to do it, and this little post is a result. Discussion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C I think this is a quite viable approach to writing `ocaml-migrate-parsetree', and I would encourage the PPX community to consider it. One of the nice things about this approach, is that it relies *heavily* on PPX rewriting itself, to get the job done. I think one of the important things we've learned in programming languages research, is that our tools need to be largely sufficient to allow us to comfortably implement those same tools. It's a good test of the PPX infrastructure, to see if you can take tedious tasks and automate them away. I'm not going to describe anymore of how this works, b/c I'd rather get the rest of the migrations working, start figuring out how to test, and get this code integrated with camlp5. But for anybody who's interested, I'd be happy to interactively describe the code and walk them thru how it works. Louis Roch=C3=A9 then asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For a person who hasn't digged into OMP, can you explain how it is different from what is done currently? Because the idea I had of OMP is basically what you describe, a set of functions transformation an AST from vX to vX-1 and vX+1. So I am obviously missing something. Chet Murthy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Yes, you're right: imagine a series of modules M2=E2=80=A6M11. Each decl= ares the same set of types, but with different definitions, yes? Then you'd have migration modules, `migrate_i_j' (j=3Di+1 or j=3Di-1) that have functions that convert between the analogously-named types. The entire question is: how are these functions implemented? By hand? With significant mechanized support? They can't be implemented fully-mechanically, because there are decisions to be made about how to bridge differences in type-definitions. For instance, look at the 4.02 type `label' and the 4.03 type `arg_label'. Sometimes these are analogous (and sometimes they're not). When they're analogous, the code that converts between -cannot- be automatically inferred: a human has to write it. But -most- of the code of these migration functions can be inferred automatically from the type-definitions themselves. And that's really all that my little experiment does: automatically infer the migration code (most of the time) with some hints for those cases where it's not possible to automatically infer. Now, why would one do this? Well, two reasons: 1. it should be more maintainable to automatically generate most of the code from types, and it should be quicker to bring online a migration for a new version of the Ocaml AST. 2. this should be a good test of PPX rewriting. That is, if we're going to build a macro-preprocessing support system, shouldn't it be able to make solving such straightforward, but very tedious, problems much, much easier? Chet Murthy then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I forgot to add a third reason why this PPX-rewriter-based approach is better: 1. If you look at ocaml-migrate-parsetree "migrations", you'll find that they're almost all boilerplate code. But sprinkled here-and-there, is actual logic, actual decisions about how to come up with values for new fields, about which fields, when non-trivial (e.g. not "[]") should lead to migration-failure, etc. It is this code, that is the actual meat of the migration, and it's not at all obvious, when sprinkled thru the mass of mechanically-produclble boilerplate. A mechanized production of that boilerplate would mean that we retained explicitly only this nontrivial code, and hence for maintenance we could focus on it, and make sure it does the right thing. Josh Berdine asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Figuring out ways to make maintaining this stuff more efficient would be great! One aspect that isn't clear to me is how this approach compares to the process currently used to generate the omp code. I haven't done it myself, but at first glance the tools to generate the omp code (e.g. gencopy) seem to also accurately be describable as heavily using ppx infrastructure in order to implement the map code from one version to another. Is there an executive summary that compares and contrasts that and this proposal? Chet Murthy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 From the README, gencopy is used to generate a prototype file for each migration, and then a human goes in and fixes up the code. A way to put my point is: gencopy should be provided the fixups in some compact form, and apply them itself. telltime - when is when exactly? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce release of [telltime] 0.0.1, a small cli tool for interacting with Daypack-lib (a schedule, time, time slots handling library) components. It primarily answers time related queries, with support for union (`||'), intersect (`&&') and "ordered select" (`>>', explanation of this is at the bottom). The query language, time expression, aims to mimic natural language, but without ambiguity. The grammar is only documented in the online demo [here] at the moment. Some examples copied from the README are as follows. [telltime] [here] Search for time slots matching Daypack time expression =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C "Hm, I wonder what years have Febuary 29th?" =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ telltime search --time-slots 5 --years 100 "feb 29 00:00" =E2=94=82 Searching in time zone offset (seconds) : 36000 =E2=94=82 Search by default starts from (in above time zone) : 2020 Sep 0= 3 19:24:15 =E2=94=82=20 =E2=94=82 Matching time slots (in above time zone): =E2=94=82 [2024 Feb 29 00:00:00, 2024 Feb 29 00:00:01) =E2=94=82 [2028 Feb 29 00:00:00, 2028 Feb 29 00:00:01) =E2=94=82 [2032 Feb 29 00:00:00, 2032 Feb 29 00:00:01) =E2=94=82 [2036 Feb 29 00:00:00, 2036 Feb 29 00:00:01) =E2=94=82 [2040 Feb 29 00:00:00, 2040 Feb 29 00:00:01) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 "Would be handy to know what this cron expression refers to" =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ telltime search --time-slots 5 "0 4 8-14 * *" =E2=94=82 Searching in time zone offset (seconds) : 36000 =E2=94=82 Search by default starts from (in above time zone) : 2020 Sep 0= 6 17:39:56 =E2=94=82=20 =E2=94=82 Matching time slots (in above time zone): =E2=94=82 [2020 Sep 08 04:00:00, 2020 Sep 08 04:01:00) =E2=94=82 [2020 Sep 09 04:00:00, 2020 Sep 09 04:01:00) =E2=94=82 [2020 Sep 10 04:00:00, 2020 Sep 10 04:01:00) =E2=94=82 [2020 Sep 11 04:00:00, 2020 Sep 11 04:01:00) =E2=94=82 [2020 Sep 12 04:00:00, 2020 Sep 12 04:01:00) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 "I have a bunch of time ranges, but some of them overlap, and they are not in the right order. If only there is a way to combine and sort them easily." =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ telltime search --time-slots 1000 "2020 . jan . 1, 10, 20 . 1= 3:00 to 14:00 \ =E2=94=82 || 2019 dec 25 13:00 \ =E2=94=82 || 2019 dec 25 10am to 17:00 \ =E2=94=82 || 2020 jan 5 10am to 1:30pm \ =E2=94=82 || 2020 . jan . 7 to 12 . 9:15am to 2:45pm" =E2=94=82 Searching in time zone offset (seconds) : 36000 =E2=94=82 Search by default starts from (in above time zone) : 2020 Sep 0= 6 18:01:12 =E2=94=82=20 =E2=94=82 Matching time slots (in above time zone): =E2=94=82 [2019 Dec 25 10:00:00, 2019 Dec 25 17:00:00) =E2=94=82 [2020 Jan 01 13:00:00, 2020 Jan 01 14:00:00) =E2=94=82 [2020 Jan 05 10:00:00, 2020 Jan 05 13:30:00) =E2=94=82 [2020 Jan 07 09:15:00, 2020 Jan 07 14:45:00) =E2=94=82 [2020 Jan 08 09:15:00, 2020 Jan 08 14:45:00) =E2=94=82 [2020 Jan 09 09:15:00, 2020 Jan 09 14:45:00) =E2=94=82 [2020 Jan 10 09:15:00, 2020 Jan 10 14:45:00) =E2=94=82 [2020 Jan 11 09:15:00, 2020 Jan 11 14:45:00) =E2=94=82 [2020 Jan 12 09:15:00, 2020 Jan 12 14:45:00) =E2=94=82 [2020 Jan 20 13:00:00, 2020 Jan 20 14:00:00) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Get exact time after some duration from now =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ telltime from-now "1 hour" =E2=94=82 Now : 2020-09-03 15:53:29 =E2=94=82 Duration (original) : 1 hour =E2=94=82 Duration (normalized) : 1 hours 0 mins 0 secs =E2=94=82 Now + duration : 2020-09-03 16:53:29 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ telltime from-now "1.5 days 2.7 hours 0.5 minutes" =E2=94=82 Now : 2020-09-03 15:55:43 =E2=94=82 Duration (original) : 1.5 days 2.7 hours 0.5 minutes =E2=94=82 Duration (normalized) : 1 days 14 hours 42 mins 30 secs =E2=94=82 Now + duration : 2020-09-05 06:38:13 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Difference between ordered select and union =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C `s1 >> s2' is similar to `s1 || s2', but `>>' picks between s1 and s2 in a round robin fashion, instead of just picking the smallest between two. One specific differing case would be when the search starts at 4pm today, `3pm || 5pm' would return 5pm today and 3pm tomorrow, and so on, while `3pm >> 5pm' would return 3pm tomorrow and 5pm tomorrow (a 5pm is only picked after a 3pm has been picked already). Ocamlunit emacs minor-mode =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Manfred Bergmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Here is a first version of this plugin that allows running `dune test' with an Emacs key stroke. It shows the test result in a separate buffer and a simple colorized status 'message'. While it is possible to run `dune' in 'watch' mode I'd like to manually run tests. I didn't find a way to specify individual test modules in `dune'. Is that possible? Sihl 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: jerben announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce this milestone release of Sihl, a web framework for OCaml. Github: opam: Sihl is really just a collection of services that can be plugged into each other and a tiny core that knows how to start them. The goal is to take care of infrastructure concerns so you can focus on the domain. After many iterations, the API is in a shape where we dare to show it to you :slight_smile: It is still under heavy development so expect breakage without a major version bump. However, we just finished migrating a project from Reason on NodeJS to OCaml on Sihl, so we use it in production. We provide service implementations that were useful to us so far. In the future we want to provide many more to cover all kinds of needs. (PRs are always welcome!) Any feedback is greatly appreciated, thanks! :) jerben then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Here is an example of a tiny Sihl app: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Service =3D struct =E2=94=82 module Random =3D Sihl.Utils.Random.Service =E2=94=82 module Log =3D Sihl.Log.Service =E2=94=82 module Config =3D Sihl.Config.Service =E2=94=82 module Db =3D Sihl.Data.Db.Service =E2=94=82 module MigrationRepo =3D Sihl.Data.Migration.Service.Repo.Mar= iaDb =E2=94=82 module Cmd =3D Sihl.Cmd.Service =E2=94=82 module Migration =3D Sihl.Data.Migration.Service.Make (Cmd) (= Db) (MigrationRepo) =E2=94=82 module WebServer =3D Sihl.Web.Server.Service.Make (Cmd) =E2=94=82 module Schedule =3D Sihl.Schedule.Service.Make (Log) =E2=94=82 end =E2=94=82=20 =E2=94=82 let services : (module Sihl.Core.Container.SERVICE) list =3D =E2=94=82 [ (module Service.WebServer) ] =E2=94=82=20 =E2=94=82 let hello_page =3D =E2=94=82 Sihl.Web.Route.get "/hello/" (fun _ -> =E2=94=82 Sihl.Web.Res.(html |> set_body "Hello!") |> Lwt.return) =E2=94=82=20 =E2=94=82 let routes =3D [ ("/page", [ hello_page ], []) ] =E2=94=82=20 =E2=94=82 module App =3D Sihl.App.Make (Service) =E2=94=82=20 =E2=94=82 let _ =3D App.(empty |> with_services services |> with_routes r= outes |> run) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 promise_jsoo 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Max LANTAS announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Hello! I am announcing the first release of `promise_jsoo', a library for JS promises in Js_of_ocaml. The library has bindings to the core `Promise' methods as well as helper functions that make it easier to deal with a `Promise' of an `option' or `result'. It is also possible to use this library with [gen_js_api] to make for an easier JavaScript binding experience Inspired by [aantron/promise], this library also uses indirection internally when handling nested promises in order to ensure that the bindings are type safe. This project is part of ongoing work to port [vscode-ocaml-platform] to Js_of_ocaml. Generated documentation can be found [here]. [gen_js_api] [aantron/promise] [vscode-ocaml-platform] [here] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Announcing Signals and Threads, a new podcast from Jane Street] [OCaml Planet] [Announcing Signals and Threads, a new podcast from Jane Street] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 01 to 08, 2= 020.

OCaml 4.11.1: early bugfix release

octachron announced

A serious bug has been discovered last week in OCaml 4.11.0: explicit polymorphic annotations are checked too permissively. Some incorrect programs (possibly segfaulting) are accepted by the compiler in 4.11.0.

Programs accepted by OCaml 4.10 are unchanged.

We are thus releasing OCaml 4.11.1 as an early bugfix version. You are advised to upgrade to this new version if you were using OCaml 4.11.0.

It is (or soon will be) available as a set of OPAM switches with

opam switch create 4.11.1

and as a source download here: https://caml.in= ria.fr/pub/distrib/ocaml-4.11/

This bug was introduced when making polymorphic recursion easier to use. We are working on making the typechecker more robust and more exhaustively tested to avoid such issues in the future.

Bug fixes:

  • #9856, #9857: Prevent polymo= rphic type annotations from generalizing weak polymorphic variables. (Leo W= hite, report by Thierry Martinez, review by Jacques Garrigue)
  • #9859, #9862: Remove an erro= neous assertion when inferred function types appear in the right hand side = of an explicit :> coercion (Florian Angeletti, report by Jerry James, re= view by Thomas Refis)

Rwmjones then said

We've now got 4.11.1 in Fedora 33 & Fedora 34. No apparent problems so= far.

textmate-language 0.1.0

dosaylazy announced

I am pleased to announce textmate-language 0.1.0. Textmate-language is a library for tokenizing code using TextMate grammars. Therefore, it may= be useful for implementing syntax highlighters. Please report any bugs or API inconveniences you find.

Batteries v3.1.0

UnixJunkie announced

OCaml Batteries Included is a community-maintained extended standard librar= y for OCaml.

The latest API can be found here: https://ocaml-batteries-team.github.io/batteries-included/hdoc2/

This minor release adds support for OCaml 4.11. It has been available in opam for some days.

Special thanks to all the contributors!

The changelog follows:

  • Compatibility fixes for OCaml-4.11 #962 (Jerome Vouillon)
  • BatEnum: added combination #518 (Chimrod, review by hcarty)
  • fix benchmarks #956 (Cedric Cellier)
  • BatFile: added count_lines #953 (Francois Berenger, review by = Cedric Cellier)
  • BatArray: use unsafe_get and unsafe_set more often #947 (Franc= ois Berenger, review by Cedric Cellier)
  • fix some tests for ocaml-4.10.0 #944 (kit-ty-kate)
  • BatResult: BatPervasives.result is now equal to Stdlib.result instead o= f sharing constructors without being the same type #939, #9= 57 (Cl=C3=A9ment Busschaert, Cedric Cellier).

Job offer in Paris - Be Sport

Vincent Balat announced

Be Sport is looking to hire an OCaml developer with skills in

  • Mobile/web feature design
  • Team management
  • Use of Social networks

She/he will take part in the development of our Web and mobile apps, entire= ly written in OCaml with Ocsigen, and participate in reflections on features.

Please contact me for more information or send an email to jobs@besport.com.

Some SIMD in your OCaml

Anmol Sahoo announced

Fresh from a weekend of hacking, I would like to share some results of an e= xperiment I conducted of creating a library for exposing Intel AVX2 intrinsics to OCaml code. AVX2 i= s an instruction set subset that adds data-parallel operations in hardware.

I chose to fork the amazing bigstringaf library and modified it. You can find the additions to the code here - bigstringaf_simd.

Overview

Given a type Bigstring.t (1 dimensional byte arrays) there now= exist functions such as -

val cmpeq_i8 : (t * int)=
 -> (t * int) -> (t * int) -> unit

So cmpeq_i8 (x,o1) (y,o2) (z,03) will compare 32 bytes startin= g at o1 and o2 from x and y respectively and store the result in z at o3.

Why?

This was mainly an exercise in curiosity. I just wanted to learn whether so= mething like this is viable. I also want to see if adding some type-directed magic + ppx spells can let = us write data parallel code much more naturally similar to what lwt / async did for async = code.

At the same time, you might ask - why not use something like Owl (which alr= eady has good support for data-parallel operations)? Apart from the fact that such libraries are orie= nted towards numerical code, I would also like to explore if we can operate directly on OCaml types and = cast them into data parallel algorithms. Like how simdjson pushed the boundaries of JSON pa= rsing, it would be nice to port idiomatic code to data-parallel versions in OCaml. Can we, at some point, h= ave generic traversals of data-types, which are actually carried out in a data-parallel fashion?

Does it work?

Given the limitation of the current implementation (due to foreign function= calls into C), I still found some preliminary results to be interesting! Implementing the St= ring.index function, which returns the first occurence of a char, the runtime for finding an element a= t the n-1 position in an array with 320000000 elements is -

serial: 1.12 seconds
simd: 0.72 seconds (1.5x)

I still have to do the analysis what the overhead of the function call into= C is (even with [@@noalloc]!

Future directions

It would be interesting to see, if we can create a representation which enc= apsulates the various SIMD ISA's such as AVX2, AVX512, NEON, SVE etc. Further more, it would be really= interesting to see if we can use ppx to automatically widen `map` functions to operate on blocks of = code, or automatically cast data types in a data parallel representation.

Disclaimer

This was mostly a hobby project, so I cannot promise completing any milesto= nes or taking feature requests etc. I definitely do not recommend using this in production, becau= se of the lack of testing etc.

A PPX Rewriter approach to ocaml-migrate-parsetree

Chet Murthy announced

TL;DR

Based on camlp5 and the pa_ppx PPX rewriters, I'v= e written a new one, pa_deriving_plugins.rewrite, that automates almost all the wor= k of writing a migration from one version of OCaml's AST to another.

  1. It took a few days (b/c of laziness) to write the initial PPX rewriter<= /li>
  2. A day to get 4.02->4.03 AST migration working
  3. a couple of hours to get 4.03->4.02 working
  4. and a few more hours to get 4.03<->4.04 and 4.04<->4.05 wor= king

At this point, I fully expect that the other version-pairs will not be diff= icult.

You can find this code [warning: very much a work-in-progress] at https://github.com/chetmurthy/pa_ppx/tree/migrate-parsetree-hacking

The file pa_deriving.plugins/pa_deriving_rewrite.ml contains t= he source for the PPX rewriter.

The directory pa_omp contains the migrations, typically named = rewrite_NNN_MMM.ml.

A slightly longer-winded explanation

If you think about it, ppx_deriving.map isn't so different fro= m what we need for ocaml-migrate-parsetree. ppx_deriving.map, from a type definition for ~ 'a t~, will automatically generate a function

map_t : ('a -> 'b) -> 'a t -> 'b t

If you think about it, if we could just substitute our own type for the sec= ond occurrence of t (somehow …. yeah grin) then it would be almost like what we w= ant for o-m-p, yes?

With 11 versions of the Ocaml AST so far, maybe it's worth thinking about h= ow to automate more of the migration task. Also, since so much of it is type-structure-driven, one wo= uld think that it would be an excellent opportunity to apply PPX rewriting technology. Indeed, one= might think that a good test of PPX rewriting, is the ability to automate = precisely such tasks.

So what's hard about this migration task? Here are some issues (maybe ther= e are more):

  1. the types are slightly differently-organized in different versions of t= he AST. Types might move from one module to another.
  2. sometimes new types are introduced and old ones disappear
  3. constructor data-types may get new branches, or lose them
  4. record-types may get new fields, or lose them
  5. sometimes the analogous types in two consecutive versions are just real= ly, really different [but this is rare]: we need to supply the code directl= y
  6. when mapping from one version to another, sometimes features are simply= not mappable, and an error needs to be raised; that error ought to contain= an indication of where in the source that offending feature was found
  7. And finally, when all else fails, we might need to hack on the migratio= n code directly

But morally, the task is really straightforward (with problems listed in-li= ne):

  1. use ppx_import to copy over types from each of the AST tim= es of each Ocaml version
    • ppx_import works on .cmi files, and those hav= e different formats in different versions of Ocaml. Wouldn't it be nice if= it worked on .mli files, whose syntax (b/c OCaml is well-mana= ged) doesn't change much?
  2. build a single OCaml module that has all the AST types in it (from all = the versions of OCaml)
    • but without the form

      type t =3D M.t =3D A of .. |=
       B of ....
      

      that is, without the "type equation" that allows for a new type-definition = to precisely repeat a previous one.

  3. Then use ppx_import against this single module to construc= t a recursive type-declaration list of all the AST types for a particular v= ersion of OCaml, and apply a "souped-up" version of ppx_deriving.map to it,= to map the types to another version of the AST types.
    • but ppx_deriving.map doesn't do this today, and besides, i= t would have to provide a bunch of "escape hatches" for all the special-cas= es I mentioned above.

But this is in principle doable, and it has the nice feature that all the t= edious boilerplate is mechanically-generated from type-definitions, hence likely to not contain e= rrors (assuming the PPX rewriter isn't buggy).

So I decided to do it, and this little post is a result.

Discussion

I think this is a quite viable approach to writing ocaml-migrate-pars= etree, and I would encourage the PPX community to consider it. One of the nice things about this approach, = is that it relies heavily on PPX rewriting itself, to get the job done. I think one of the important= things we've learned in programming languages research, is that our tools need to be largely suffic= ient to allow us to comfortably implement those same tools. It's a good test of the PPX infras= tructure, to see if you can take tedious tasks and automate them away.

I'm not going to describe anymore of how this works, b/c I'd rather get the rest of the migrations working, start figuring out how to test, and get this code integrated with camlp5.

But for anybody who's interested, I'd be happy to interactively describe the code and walk them thru how it works.

Louis Roch=C3=A9 then asked

For a person who hasn't digged into OMP, can you explain how it is differen= t from what is done currently? Because the idea I had of OMP is basically what you describe, a = set of functions transformation an AST from vX to vX-1 and vX+1. So I am obviously missing s= omething.

Chet Murthy replied

Yes, you're right: imagine a series of modules M2…M11. Each declare= s the same set of types, but with different definitions, yes? Then you'd have migration modules, migra= te_i_j (j=3Di+1 or j=3Di-1) that have functions that convert between the analogously-named types. The entir= e question is: how are these functions implemented? By hand? With significant mechanized support? The= y can't be implemented fully-mechanically, because there are decisions to be made about how to bri= dge differences in type-definitions. For instance, look at the 4.02 type label a= nd the 4.03 type arg_label. Sometimes these are analogous (and sometimes they're not). When they're an= alogous, the code that converts between -cannot- be automatically inferred: a human has to write i= t. But -most- of the code of these migration functions can be inferred automatically from the type-de= finitions themselves.

And that's really all that my little experiment does: automatically infer t= he migration code (most of the time) with some hints for those cases where it's not possible to automa= tically infer.

Now, why would one do this? Well, two reasons:

  1. it should be more maintainable to automatically generate most of the co= de from types, and it should be quicker to bring online a migration for a n= ew version of the Ocaml AST.
  2. this should be a good test of PPX rewriting. That is, if we're going t= o build a macro-preprocessing support system, shouldn't it be able to make = solving such straightforward, but very tedious, problems much, much easier?=

Chet Murthy then added

I forgot to add a third reason why this PPX-rewriter-based approach is bett= er:

  1. If you look at ocaml-migrate-parsetree "migrations", you'll find that t= hey're almost all boilerplate code. But sprinkled here-and-there, is actua= l logic, actual decisions about how to come up with values for new fields, = about which fields, when non-trivial (e.g. not "[]") should lead to migrati= on-failure, etc. It is this code, that is the actual meat of the migration= , and it's not at all obvious, when sprinkled thru the mass of mechanically= -produclble boilerplate.

A mechanized production of that boilerplate would mean that we retained exp= licitly only this nontrivial code, and hence for maintenance we could focus= on it, and make sure it does the right thing.

Josh Berdine asked

Figuring out ways to make maintaining this stuff more efficient would be gr= eat! One aspect that isn't clear to me is how this approach compares to the process currently used to = generate the omp code. I haven't done it myself, but at first glance the tools to generate the omp c= ode (e.g. gencopy) seem to also accurately be describable as heavily using ppx infrastructure in order= to implement the map code from one version to another. Is there an executive summary that compares an= d contrasts that and this proposal?

Chet Murthy replied

>>From the README, gencopy is used to generate a prototype file for each migr= ation, and then a human goes in and fixes up the code. A way to put my point is: gencopy should be prov= ided the fixups in some compact form, and apply them itself.

telltime - when is when exactly?

Darren announced

I'm happy to announce release of telltime 0.0.1, a small cli tool for interacting with Daypack-lib (a schedule, time, time slots handlin= g library) components.

It primarily answers time related queries, with support for union (||= ), intersect (&&) and "ordered select" (>>, explanation of this is at the bottom).

The query language, time expression, aims to mimic natural language, but wi= thout ambiguity. The grammar is only documented in the online demo here at the moment.

Some examples copied from the README are as follows.

Search for time slots matching Daypack time expressio= n

"Hm, I wonder what years have Febuary 29th?"

$ telltime search --time-slots 5 --years 100 "feb 29 00:00"
Searching in time zone offset (seconds)            : 36000
Search by default starts from (in above time zone) : 2020 Sep 03 19:24:15

Matching time slots (in above time zone):
[2024 Feb 29 00:00:00, 2024 Feb 29 00:00:01)
[2028 Feb 29 00:00:00, 2028 Feb 29 00:00:01)
[2032 Feb 29 00:00:00, 2032 Feb 29 00:00:01)
[2036 Feb 29 00:00:00, 2036 Feb 29 00:00:01)
[2040 Feb 29 00:00:00, 2040 Feb 29 00:00:01)

"Would be handy to know what this cron expression refers to"

$ telltime search --time-slots 5 "0 4 8-14 * *"
Searching in time zone offset (seconds)            : 36000
Search by default starts from (in above time zone) : 2020 Sep 06 17:39:56

Matching time slots (in above time zone):
[2020 Sep 08 04:00:00, 2020 Sep 08 04:01:00)
[2020 Sep 09 04:00:00, 2020 Sep 09 04:01:00)
[2020 Sep 10 04:00:00, 2020 Sep 10 04:01:00)
[2020 Sep 11 04:00:00, 2020 Sep 11 04:01:00)
[2020 Sep 12 04:00:00, 2020 Sep 12 04:01:00)

"I have a bunch of time ranges, but some of them overlap, and they are not = in the right order. If only there is a way to combine and sort them easily."

$ telltime search --time-slots 1000 "2020 . jan . 1, 10, 20 . 13:00 to 14:0=
0 \
  || 2019 dec 25 13:00 \
  || 2019 dec 25 10am to 17:00 \
  || 2020 jan 5 10am to 1:30pm \
  || 2020 . jan . 7 to 12 . 9:15am to 2:45pm"
Searching in time zone offset (seconds)            : 36000
Search by default starts from (in above time zone) : 2020 Sep 06 18:01:12

Matching time slots (in above time zone):
[2019 Dec 25 10:00:00, 2019 Dec 25 17:00:00)
[2020 Jan 01 13:00:00, 2020 Jan 01 14:00:00)
[2020 Jan 05 10:00:00, 2020 Jan 05 13:30:00)
[2020 Jan 07 09:15:00, 2020 Jan 07 14:45:00)
[2020 Jan 08 09:15:00, 2020 Jan 08 14:45:00)
[2020 Jan 09 09:15:00, 2020 Jan 09 14:45:00)
[2020 Jan 10 09:15:00, 2020 Jan 10 14:45:00)
[2020 Jan 11 09:15:00, 2020 Jan 11 14:45:00)
[2020 Jan 12 09:15:00, 2020 Jan 12 14:45:00)
[2020 Jan 20 13:00:00, 2020 Jan 20 14:00:00)

Get exact time after some duration from now

$ telltime from-now "1 hour"
Now                   : 2020-09-03 15:53:29
Duration (original)   : 1 hour
Duration (normalized) : 1 hours 0 mins 0 secs
Now + duration        : 2020-09-03 16:53:29
$ telltime from-now "1.5 days 2.7 hours 0.5 minutes"
Now                   : 2020-09-03 15:55:43
Duration (original)   : 1.5 days 2.7 hours 0.5 minutes
Duration (normalized) : 1 days 14 hours 42 mins 30 secs
Now + duration        : 2020-09-05 06:38:13

Difference between ordered select and union

s1 >> s2 is similar to s1 || s2, but = >> picks between s1 and s2 in a round robin fashion, instead of just picking the smallest between two.

One specific differing case would be when the search starts at 4pm today, <= code>3pm || 5pm would return 5pm today and 3pm tomorrow, and so on, while 3pm >> 5pm woul= d return 3pm tomorrow and 5pm tomorrow (a 5pm is only picked after a 3pm has been picked already).

Ocamlunit emacs minor-mode

Manfred Bergmann announced

Here is a first version of this plugin that allows running dune test<= /code> with an Emacs key stroke. It shows the test result in a separate buffer and a simple colorized status= 'message'.

https://github.co= m/mdbergmann/emacs-ocamlunit

While it is possible to run dune in 'watch' mode I'd like to m= anually run tests.

I didn't find a way to specify individual test modules in dune= . Is that possible?

Sihl 0.1.0

jerben announced

I am happy to announce this milestone release of Sihl, a web framework for = OCaml.

Github: https://github.com/ox= idizing/sihl
opam: http://opam.ocaml.or= g/packages/sihl/

Sihl is really just a collection of services that can be plugged into each = other and a tiny core that knows how to start them. The goal is to take care of infrastructure concern= s so you can focus on the domain.

After many iterations, the API is in a shape where we dare to show it to yo= u :slight_smile: It is still under heavy development so expect breakage without a major vers= ion bump. However, we just finished migrating a project from Reason on NodeJS to OCaml on Sihl, so we = use it in production.

We provide service implementations that were useful to us so far. In the fu= ture we want to provide many more to cover all kinds of needs. (PRs are always welcome!)

Any feedback is greatly appreciated, thanks! :)

jerben then added

Here is an example of a tiny Sihl app:

module Service =3D struct
  module Random =3D S=
ihl.Utils.Random.Service
  module Log =3D Sihl=
.Log.Service
  module Config =3D S=
ihl.Config.Service
  module Db =3D Sihl.=
Data.Db.Service
  module MigrationRepo =3D Sihl.Data.Migration.Service.Repo.MariaDb
  module Cmd =3D Sihl=
.Cmd.Service
  module Migration =3D module WebServer =3D module Schedule =3D Sihl.Schedule.Service.Make (Log)
end

let services : (module Sihl.Core.Container.SERVICE) list =3D
  [ (module Service.WebServer) ]

let hello_page =3D
  Sihl.Web.Route.get "/hello/" (fun _ ->
      Sihl.Web.Res.(html |> set_body =
"Hello!") |> Lwt.return)

let routes =3D [ ("=
/page", [ hello_page ], []) ]

module App =3D Sihl.A=
pp.Make (Service)

let _ =3D App.(empty |> with_services service=
s |> with_routes routes |> run)

promise_jsoo 0.1.0

Max LANTAS announced

Hello! I am announcing the first release of promise_jsoo, a li= brary for JS promises in Js_of_ocaml.

https://github.com/mnxn/pr= omise_jsoo
https://opam.ocam= l.org/packages/promise_jsoo/

The library has bindings to the core Promise methods as well a= s helper functions that make it easier to deal with a Promise of an option or resu= lt. It is also possible to use this library with gen_js_api to make for= an easier JavaScript binding experience

Inspired by aantron/promise, this library also uses indirection internally when handling nested promises= in order to ensure that the bindings are type safe.

This project is part of ongoing work to port vscode-ocaml= -platform to Js_of_ocaml.

Generated documentation can be found here.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 4F60BE67F2 for ; Tue, 22 Sep 2020 09:27:28 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=90hC=C7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AzyfsdRMeL/X3tA6EcF0l6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K/j5o8bcNUDSrc9gkEXOFd2Cra4d1KyP6Ou5AzRIoc7Y9ixbLtoUD15NoP?= =?us-ascii?q?5VtjRoONSCB0z/IayiRA0BN+MGamVY+WqmO1NeAsf0ag6aiHSz6TkPBke3blIt?= =?us-ascii?q?daz6FYHIksu4yf259YHNbAVUnjq9Zq55IAmroQnLucQanIlvJrwsxhbHrXdEZv?= =?us-ascii?q?payX91Ll6Xgxrw+9288ZF+/ylRof4t69JMXaDndKkkULJUCygrPXoo78PxrxnD?= =?us-ascii?q?SgWP5noYUmoIlxdDHhbI4hLnUJrvqyX2ruVy1jWUMs3wVrA0RC+t77x3Rx/yiS?= =?us-ascii?q?cILCA2/WfKgcFtlq1boRahpxtiw47IZYyeKfRzcr/Bcd4cWGFOWdtfVzFaAoOk?= =?us-ascii?q?cYQAE/YBM+hfr4n4vVQOrB2+DhSoCO7gzjJEg3n70a053eQnDwHG3RcgH9MVv3?= =?us-ascii?q?TQstr+KakTUeevzKbV1jXIcvda1Dnh5ITNdB0qvPOCUq9qccfJyUchCR7LgFuT?= =?us-ascii?q?p4PqIzyYzf4Cv3SB4ud6Se6jl2wqpgdsqTav3McsjYzJi5oJx1DA7yp5xps+K8?= =?us-ascii?q?CkR057ZN6kEYdQtz2HPIZxWMwiR3tnuCAgxr0dpZG7fC0KyJU7xx7DcPGHa4+I?= =?us-ascii?q?4hbjVeaNPzh3mHJleLS+hxar7Eiv1PfwVs6u0FZFtydIlMTHuX8R2RLJ8MeHVu?= =?us-ascii?q?d98Vm72TaJzw3e5eVJLEQ7m6fGJJMszb09m5oXvErDACL7mUv7gqCWe0k69Oal?= =?us-ascii?q?6ebqb6jiq5KBNIJ5hQ/zP6oyl8GiAOk1PBUDUm6G8uqy073j+Ff2QLRMjvAuiq?= =?us-ascii?q?nWrozaJcUHpqGnGw9V1YMj6xOhADu81tQXg2UHIEpCeB2blYfpPlXOLOr/Dfel?= =?us-ascii?q?jFSgiDhrx/HaPr3hH5XCNWLPn6vmfbZ480JT1Q0zwsxc551KELENOu78Wkj0tN?= =?us-ascii?q?DAAR85MhC0w+b6CNpmzI8eWGWPDreCP6PTrV+I/f4vI/ONZI8TtzbxMeMl5/ng?= =?us-ascii?q?jX8ll14SZ7Op0oUPZHC5A/tnI0GZYX72jtcGC2cKsRIyTOz2iF2eST5feXOyX7?= =?us-ascii?q?845jEnCYKpEYDDRpqzj7Ob2ie0A5hWaXpGC1+XD3jnbYOEVO0QaCKTPM9ujDsE?= =?us-ascii?q?WqS7RI8k0RGutQr6y6JjLuXK/y0Xq5Tj1MRv6O3PlBEy8jp0D8CH3GGRUW50hH?= =?us-ascii?q?kERz4z3K15vEdzyU+D3LBlj/BGEdFf/e5FXhs1OJLGweF2F8r+VwzOc9uRSlur?= =?us-ascii?q?Qc+qDS8+Q94v2dMCfklwF8+/gh3MwyanBaIemaaRC5wu6K3c2mD8J8ZjxHbC06?= =?us-ascii?q?ksl1wmQ8RSOWG8nq5/8AzTBo7Vk0qHi6mqdaIc3C/U9Gee02WCpkZYUBR/Uand?= =?us-ascii?q?XHAfYFXZrcjh60/fUbOjDa4rPhZdxcONMKdHZMHlgU9ISfrsINjeZni+m2a0BR?= =?us-ascii?q?aG3LOMa4/qdn0A0ivBFUYIjxge8HKaOQg+GCqsu3zTAT52GFL3ZEPs9el/qG+l?= =?us-ascii?q?QUAozwGKaUxh16Oo+hELn/CcTOkT3r0ctSg7rzV7BlC908jNC9WcpwpheaRcYc?= =?us-ascii?q?8h4Fpczm3ZsBF9Ppq8IK98nV4SaQF3skzh1hltDYVAi8cqoGswzAVuMaKYzE9B?= =?us-ascii?q?dzSA0J/sILLXL23y8Amra67XwVHezM2b+rwP6fQ9s1XsphulFksk83V90tlayW?= =?us-ascii?q?GQ5pvQDFlabZWkGEIo8VIy87XFZAE5+IWS03BwZ+38+DTd3ZhhTL8u1RCIe9ZE?= =?us-ascii?q?LLjCFQPjF8lcANKhfqhikFGsalcAPftO3K8yJcKvMfWcnOagO+N4tDanlnhcpo?= =?us-ascii?q?dn2EOQ/i5yTf6O0otW7euf216uUz76xGyqssX2hZwMMTgWF2z50iPkAY9NeoVq?= =?us-ascii?q?eoIaFWqlI8u238hzwZn3VCgLpxaYG1oa1ZrxKlKpZFvn0FgPhB1K80ziojOxyn?= =?us-ascii?q?lPqx9srqeb23aVkeHyLVwfPWpaWGRpjVHtOJW5ydcAUxrxNlR7pF6e/U//gpNj?= =?us-ascii?q?iuFnNWCKEBVQeCznM2xpUq2xr6ePJclV58Fx6HQFYKGHeVmfD4XFjV4f2iLnEX?= =?us-ascii?q?FZwWlkJTutp5Pykgc8jT6NanFpoyiAdA=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BqBQCupmlffSIeaIFfg3tSRgFeVjIsh?= =?us-ascii?q?DqBXYcli1OFQpFjgWQQAQMBDRgBDAcBAgQBAYFWgUBxRAKCJQIdBgEFMxMCEAE?= =?us-ascii?q?BBQEBAQIBAwMEARMBAQsUCIYMDII3DAwDA4MlAQwMCQo4LSMDFAEGAwIRARcBF?= =?us-ascii?q?AoXARIaAYMMgnwEAQqZdJt7gTKEOwETAwEOCSaEG4FCDQITgRaFTUuDA4NrJg+?= =?us-ascii?q?BTT+Dc2yCRQwLAQEBAQGBHhwBAQhOgmGCYASPfQ4BCgICJQKKE4kpkisTSyoHg?= =?us-ascii?q?mqBDQQLhlqBAYsChnaDDIEniFKTfSGSXIF3hgN9gWqGCIpnhFSBQSqBZwwHMxo?= =?us-ascii?q?wgywJYA2NfCwag06CZIF1O4Fhg2M/MwIBATMCBgEJAQEDCXUBAQUTCwGNRAEB?= X-IPAS-Result: =?us-ascii?q?A0BqBQCupmlffSIeaIFfg3tSRgFeVjIshDqBXYcli1OFQpF?= =?us-ascii?q?jgWQQAQMBDRgBDAcBAgQBAYFWgUBxRAKCJQIdBgEFMxMCEAEBBQEBAQIBAwMEA?= =?us-ascii?q?RMBAQsUCIYMDII3DAwDA4MlAQwMCQo4LSMDFAEGAwIRARcBFAoXARIaAYMMgnw?= =?us-ascii?q?EAQqZdJt7gTKEOwETAwEOCSaEG4FCDQITgRaFTUuDA4NrJg+BTT+Dc2yCRQwLA?= =?us-ascii?q?QEBAQGBHhwBAQhOgmGCYASPfQ4BCgICJQKKE4kpkisTSyoHgmqBDQQLhlqBAYs?= =?us-ascii?q?ChnaDDIEniFKTfSGSXIF3hgN9gWqGCIpnhFSBQSqBZwwHMxowgywJYA2NfCwag?= =?us-ascii?q?06CZIF1O4Fhg2M/MwIBATMCBgEJAQEDCXUBAQUTCwGNRAEB?= X-IronPort-AV: E=Sophos;i="5.77,289,1596492000"; d="scan'208,217";a="359675856" X-MGA-submission: =?us-ascii?q?MDHXqI8ZAr38RhPIiHdpGy5oRGfKslbepju+9o?= =?us-ascii?q?EcldQRISgth5cERLUonKp7eF3ilXsNVeC8slzkRZa4w8+/YuHazu3GBj?= =?us-ascii?q?v+UqdTXADdvsxxYmTYAsGlLpaitCOrcjQBx2YcvwCoBmV4hppReY40+x?= =?us-ascii?q?3QCS/OAqOrxHGGqGOhykc1Mw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Sep 2020 09:27:26 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B87F5564F0A; Tue, 22 Sep 2020 09:27:24 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 22 Sep 2020 09:27:24 +0200 Message-ID: <87mu1i6zkz.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 22 09:27:25 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=4F422564F54 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 15 to 22, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Liquidsoap 1.4.3 Simple63 v1: compression of integer sequences bentov v1: streaming estimation of 1D histograms opam-compiler 0.1.0 lua_parser 1.0.0 Merlin 3.4.0 : introducing external configuration readers gRPC server and client in OCaml Bitstring (and ppx_bitstring) 4.0.0 Old CWN Liquidsoap 1.4.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Romain Beauxis announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that liquidsoap `1.4.3' is out at: This is the 3rd bugfix release for the `1.4.x' branch. It contains important fixes and a couple of new minor features. Update is recommended and should be fairly safe. Along we this release, we have now added builds for `arm64' debian packages and docker-ready production images for `amd64' and `arm64' architectures available at: Again, we would like to warmly thank all users, contributors and reporters for helping us bring liquidsoap to the next step! Also, please note that a couple of issues had to be left out to make sure that the release comes out on time. These are listed [here] and will be tackled as soon as possible. Next for liquidsoap, we will focus on getting the current `2.x' branch finalized and polished. We already have support for encoded content and ffmpeg raw frames. We need to write a couple of inline encoders and decoders and we'll have 90% of the features ready. This will be a major update for us! [here] Simple63 v1: compression of integer sequences =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Mika Illouz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is to announce Simple63, an opam package for compression of integer sequences; similar to Anh and Moffat's Simple-8b. More details found in: =E2=80=A2 github: [https://github.com/barko/simple63] =E2=80=A2 documentation: [https://barko.github.io/simple63/] Feedback and bug reports welcome. [https://github.com/barko/simple63] [https://barko.github.io/simple63/] bentov v1: streaming estimation of 1D histograms =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mika Illouz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is to announce bentov, a opam package that implements a 1D histogram-sketching algorithm. For more details: =E2=80=A2 github: [https://github.com/barko/bentov] =E2=80=A2 documentation: [https://barko.github.io/bentov] Feedback and bug reports welcome. [https://github.com/barko/bentov] [https://barko.github.io/bentov] opam-compiler 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Etienne Millon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the opam maintainers, I'd like to announce the first release of opam-compiler, a plugin to work with compiler variants, branches and forks. This can cover a pretty wide range of use cases, so the first version is starting small with a single command to create a switch from a branch or github PR: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 % opam compiler create '#9921' =E2=94=82 Opam plugin "compiler" is not installed. Install it on the curr= ent switch? [Y/n] y =E2=94=82=20 =E2=94=82 ... =E2=94=82=20 =E2=94=82 <><> Carrying on to "opam compiler create #9921" ><><><><><><><= ><><><><><><><><> =E2=94=82=20 =E2=94=82 [ocaml-variants.4.12.0+trunk+no-flat-float-array] synchronised = from =E2=94=82 git+https://github.com/gasche/ocaml#Atomic.create =E2=94=82 ocaml-variants is now pinned to git+https://github.com/gasche/o= caml#Atomic.create (version =E2=94=82 4.12.0+trunk) =E2=94=82 % opam switch =E2=94=82 ... =E2=94=82 =E2=86=92 ocaml-ocaml-9921 =E2=94=82 [opam-compiler] ocaml/ocaml#9921 - stdlib: rename Ato= mic.make into Atomic.create =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You can also override the arguments passed to `--configure'. As you can see in the above snippet, it's an opam plugin so it will auto-install if needed (assuming you ran `opam update' recently) and will be available across all switches. Its sources and issue tracker are available [here]. For the next releases, our plan is to add a user-friendly way to setup a switch based on a local git clone, so that it's easy to test your compiler fork with opam packages. You can find the other features we'd like to add in the future in [the relevant part of the opam roadmap]. Thanks and have fun compiling compilers! [here] [the relevant part of the opam roadmap] lua_parser 1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jason Nielsen announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've release [lua_parser] which is now up on opam. It is a parser and pretty-printer for lua 5.2. Actually it was developed with luajit in mind which is lua 5.1 plus goto/labels (which syntactically for the purposes of parsing and pretty-printing is lua 5.2). [lua_parser] Merlin 3.4.0 : introducing external configuration readers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am glad to announce, on behalf of the Merlin team, the release of Merlin `3.4.0' which brings some major changes in the way configuration is handled. As you might know, Merlin reads its configuration from the closest `.merlin' file to the source file being edited. These files tell merlin where to find other source files and build artifacts, but also which flags should be passed to the compiler, which syntax extensions are enabled and which packages are used by the project. In this setting the configuration is the same for all the source files of a folder, regardless of their specificities. In other words, the configuration loaded for a single source file contains the union of the dependencies of this file and of all its siblings which is not an optimal behavior. Starting with version `3.4.0' merlin will ship with two packages: `merlin' and `dot-merlin-reader' which, as the name suggests, reads configuration from `.merlin' files. Both are necessary for proper function. When a `.merlin' file is present in the source folder the Merlin server will start a `dot-merlin-reader' process and communicate with it via standard input and output following a simple protocol. These processes are halted with the server. *This change should not have any visible impact on users' workflows as long as the `dot-merlin-reader' binary is correctly installed and in the path*. (which should be the case in opam-based setups) This change in itself will not solve the granularity problem mentioned earlier, but it paves the way for such improvements: in a near-future Dune will stop generating `.merlin' files and Merlin will obtain file-based configuration directly from the build system using the same protocol as the one used by `dot-merlin-reader'. Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=81=83 merlin binary =E2=80=A2 fix completion of pattern matchings with exception patterns (#1169) =E2=80=A2 delegate configuration reading to external programs via a sim= ple protocol and create a new package `dot-merlin-reader' with a binary that reads `.merlin' files. (#1123, #1152) gRPC server and client in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: blandinw announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 TL;DR Hey, I'm new to OCaml after writing some Clojure, C++ and Haskell in various contexts, including working at FB (relevant below). After browsing this forum and Reddit for a bit, the assumption seems to be that OCaml is not a good fit for gRPC, since there's no pure implementation today. Now, this is something I have experience with, so I thought I'd try and challenge this assumption. As you may know, services inside FB use Thrift (both the format and protocol) to communicate. The Thrift team worked primarily in C++ (for good reasons), causing support for other languages to lag behind despite their best efforts. Now, the interchange format (equivalent to Protobuf) does not change very often so it's fine to have a per-language implementation, but the client and server (equivalent to HTTP2 + gRPC) frequently receive new features, optimizations and fixes. After a valiant and continued effort to support most languages used internally, the Thrift team came up with an idea. Instead of maintaining multiple implementations and dealing with obscure FFI bugs, ~FingerprintTrustManagerFactory~s and whatnot, they would focus solely on the C++ implementation and provide a daemon to be ran alongside whatever code you were trying to run. You could then use simple IPC to exchange Thrift (the format) messages with that daemon, and it would handle all the nitty-gritty of running a service at scale (load balancing, connection pooling, service discovery, security, retries, timeouts, network stats, hot restarts, etc.). Needless to say, it worked remarkably well even at very high scale and everybody was much happier. I wanted to replicate this idea with OCaml and gRPC. We already have support for protobuf thanks to the excellent `ocaml-protoc'. All we need is a way to exchange protobuf messages reliably on the wire. Instead of having an OCaml implementation that will have to stay up-to-date and have its own set of bugs (the official `grpc/grpc-java' repo has 4450 commits and 2400 issues at the moment), can we reuse existing infra with already massive support and production time? Fortunately, the people at Lyft built just that, open-sourced it and contributed it to the Cloud Native Computing Foundation in late 2017. It is called Envoy and it is bliss. I demonstrate how to fit these pieces together at [blandinw/ocaml-grpc-envoy] to build a simple KV store, including a gRPC client and server in 200 lines of OCaml code. The idea is to spawn an Envoy process that will handle all gRPC communication for our OCaml code. We use HTTP/1.1 to exchange Protobuf messages with it, using for example `httpaf' and `Lwt'. This solution has the added benefit that it is highly scalable from the start, allowing you for instance to spawn one OCaml process per core and load balance between them. You can also use Envoy (with proper config!) as your web reverse proxy instead of say, nginx. At the very least, this solution allows us to start writing gRPC code today, and gracefully evolve towards HTTP/2, Multicore and maybe a native OCaml implementation later. I'm curious to hear your perspective on the future of building services with OCaml, or your past experience like what went well, what was missing, etc. [blandinw/ocaml-grpc-envoy] Yawar Amin asked and blandinw replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 Fantastic idea. So if I understand correctly, the only thing that Envoy (server-side) is doing is translating the Protobuf from gRPC HTTP2 transport to HTTP1, and forwarding these Protobuf objects over HTTP1 to the OCaml server? Envoy doesn't know to know about the actual gRPC schema, because it doesn't touch the Protobuf objects themselves, right? That's correct. Envoy is only concerned with transporting bytes (along with load balancing, routing, etc, etc). Only OCaml knows about the Protobuf schemas. In the OCaml server case, Envoy listens for HTTP/2 gRPC requests, accesses the bytes payload with no knowledge of the actual schema/layout and repackages these same bytes in a HTTP/1.1 request that OCaml can process. OCaml then responds with bytes (an encoded Protobuf response message) that Envoy sends back on the original HTTP2 connection. Bitstring (and ppx_bitstring) 4.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: xrguerin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Features =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Add support for let bindings introduced in 4.08 =E2=80=A2 Switch to PPXLIB Deprecations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C As PPXLIB requires `ocaml >=3D 4.04' support for earlier versions has been dropped. Breaking changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This release splits the library from the PPX to reduce runtime dependencies. Projects using the PPX from bitstring will need to also depends on ppx_bitstring from now on. Rudi Grinberg added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The project is hosted [here] for those who are interested.There's also some excellent [docs] [here] [docs] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 15 to 22, 2= 020.

Liquidsoap 1.4.3

Romain Beauxis announced

I'm happy to announce that liquidsoap 1.4.3 is out at: https= ://github.com/savonet/liquidsoap/releases/tag/v1.4.3

This is the 3rd bugfix release for the 1.4.x branch. It cont= ains important fixes and a couple of new minor features. Update is recommended and should be fairly safe.

Along we this release, we have now added builds for arm64 de= bian packages and docker-ready production images for amd64 and arm64 archite= ctures available at: htt= ps://hub.docker.com/repository/docker/savonet/liquidsoap

Again, we would like to warmly thank all users, contributors and reporters = for helping us bring liquidsoap to the next step!

Also, please note that a couple of issues had to be left out to make sure t= hat the release comes out on time. These are listed here and will be tackled as soon as possible.

Next for liquidsoap, we will focus on getting the current 2.x= branch finalized and polished. We already have support for encoded content and ffmpeg raw frames. We need to = write a couple of inline encoders and decoders and we'll have 90% of the features ready. This will b= e a major update for us!

Simple63 v1: compression of integer sequences

Mika Illouz announced

This is to announce Simple63, an opam package for compression of integer se= quences; similar to Anh and Moffat's Simple-8b. More details found in:

Feedback and bug reports welcome.

bentov v1: streaming estimation of 1D histograms

Mika Illouz announced

This is to announce bentov, a opam package that implements a 1D histogram-s= ketching algorithm. For more details:

Feedback and bug reports welcome.

opam-compiler 0.1.0

Etienne Millon announced

On behalf of the opam maintainers, I'd like to announce the first release o= f opam-compiler, a plugin to work with compiler variants, branches and forks.

This can cover a pretty wide range of use cases, so the first version is st= arting small with a single command to create a switch from a branch or github PR:

% opam compiler create '#9921'
Opam plugin "compiler" is not installed. Install it on the current switch? =
[Y/n] y

...

<><> Carrying on to "opam compiler create #9921" ><>&l=
t;><><><><><><><><><&=
gt;<><><><>

[ocaml-variants.4.12.0+trunk+no-flat-float-array] synchronised from
git+https://github.com/gasche/ocaml#Atomic.create
ocaml-variants is now pinned to git+https://github.com/gasche/ocaml#Atomic.=
create (version
4.12.0+trunk)
% opam switch
...
=E2=86=92  ocaml-ocaml-9921
          [opam-compiler] ocaml/ocaml#9921 - stdlib: rename Atomic.make int=
o Atomic.create

You can also override the arguments passed to --configure.

As you can see in the above snippet, it's an opam plugin so it will auto-in= stall if needed (assuming you ran opam update recently) and will be available across all= switches. Its sources and issue tracker are available here.

For the next releases, our plan is to add a user-friendly way to setup a sw= itch based on a local git clone, so that it's easy to test your compiler fork with opam packages. You= can find the other features we'd like to add in the future in the relevant part of the opam roadmap.

Thanks and have fun compiling compilers!

lua_parser 1.0.0

Jason Nielsen announced

I've release lua_pars= er which is now up on opam. It is a parser and pretty-printer for lua 5.2. Actually it was developed with luaj= it in mind which is lua 5.1 plus goto/labels (which syntactically for the purposes of parsing and prett= y-printing is lua 5.2).

Merlin 3.4.0 : introducing external configuration readers

vds announced

I am glad to announce, on behalf of the Merlin team, the release of Merlin 3.4.0 which brings some major changes in the way configuration= is handled.

As you might know, Merlin reads its configuration from the closest .m= erlin file to the source file being edited. These files tell merlin where to find other source files and build artifacts, but also which flags should be pass= ed to the compiler, which syntax extensions are enabled and which packages are us= ed by the project.

In this setting the configuration is the same for all the source files of a folder, regardless of their specificities. In other words, the configuration loaded for a single source file contains the union of the dependencies of t= his file and of all its siblings which is not an optimal behavior.

Starting with version 3.4.0 merlin will ship with two packages= : merlin and dot-merlin-reader which, as the name suggests, reads confi= guration from .merlin files. Both are necessary for proper function.

When a .merlin file is present in the source folder the Merlin= server will start a dot-merlin-reader process and communicate with it via = standard input and output following a simple protocol. These processes are halted with the= server.

This change should not have any visible impact on users' workflows as lo= ng as the dot-merlin-reader binary is correctly installed and in the= path. (which should be the case in opam-based setups)

This change in itself will not solve the granularity problem mentioned earl= ier, but it paves the way for such improvements: in a near-future Dune will stop generating .merlin files and Merlin will obtain file-based con= figuration directly from the build system using the same protocol as the one used by dot-merlin-reader.

Changelog

  • merlin binary
    • fix completion of pattern matchings with exception patterns (#1169)
    • delegate configuration reading to external programs via a simple protoc= ol and create a new package dot-merlin-reader with a binary th= at reads .merlin files. (#1123, #1152)

gRPC server and client in OCaml

blandinw announced

TL;DR https://git= hub.com/blandinw/ocaml-grpc-envoy/

Hey, I'm new to OCaml after writing some Clojure, C++ and Haskell in variou= s contexts, including working at FB (relevant below).

After browsing this forum and Reddit for a bit, the assumption seems to be = that OCaml is not a good fit for gRPC, since there's no pure implementation today. Now, this is somethin= g I have experience with, so I thought I'd try and challenge this assumption.

As you may know, services inside FB use Thrift (both the format and protoco= l) to communicate. The Thrift team worked primarily in C++ (for good reasons), causing support for= other languages to lag behind despite their best efforts. Now, the interchange format (equivalent = to Protobuf) does not change very often so it's fine to have a per-language implementation, but the clie= nt and server (equivalent to HTTP2 + gRPC) frequently receive new features, optimizations and fixes. Aft= er a valiant and continued effort to support most languages used internally, the Thrift team came up w= ith an idea. Instead of maintaining multiple implementations and dealing with obscure FFI bugs, ~FingerprintTrustManagerFactory~s and whatnot, they would focus solely on t= he C++ implementation and provide a daemon to be ran alongside whatever code you were trying to run. = You could then use simple IPC to exchange Thrift (the format) messages with that daemon, and it would= handle all the nitty-gritty of running a service at scale (load balancing, connection pooling, service = discovery, security, retries, timeouts, network stats, hot restarts, etc.). Needless to say, it = worked remarkably well even at very high scale and everybody was much happier.

I wanted to replicate this idea with OCaml and gRPC. We already have suppor= t for protobuf thanks to the excellent ocaml-protoc. All we need is a way to exchange proto= buf messages reliably on the wire. Instead of having an OCaml implementation that will have to stay up-to-date= and have its own set of bugs (the official grpc/grpc-java repo has 4450 commits and 24= 00 issues at the moment), can we reuse existing infra with already massive support and production time?

Fortunately, the people at Lyft built just that, open-sourced it and contri= buted it to the Cloud Native Computing Foundation in late 2017. It is called Envoy and it is bliss.

I demonstrate how to fit these pieces together at blandinw/ocaml-gr= pc-envoy to build a simple KV store, including a gRPC client and server in 200 lines of OCaml code. The idea is = to spawn an Envoy process that will handle all gRPC communication for our OCaml code. We use HTTP/1.1= to exchange Protobuf messages with it, using for example httpaf and Lwt. This solution has the added benefit that it is highly scalable from the start, allowing you for instance to spawn one OCam= l process per core and load balance between them. You can also use Envoy (with proper config!) as your = web reverse proxy instead of say, nginx.

At the very least, this solution allows us to start writing gRPC code today= , and gracefully evolve towards HTTP/2, Multicore and maybe a native OCaml implementation later.

I'm curious to hear your perspective on the future of building services wit= h OCaml, or your past experience like what went well, what was missing, etc.

Yawar Amin asked and blandinw replied

Fantastic idea. So if I understand correctly, the only thing that Envoy (se= rver-side) is doing is translating the Protobuf from gRPC HTTP2 transport to HTTP1, and forwarding= these Protobuf objects over HTTP1 to the OCaml server? Envoy doesn't know to know about the actual gRPC= schema, because it doesn't touch the Protobuf objects themselves, right?

That's correct. Envoy is only concerned with transporting bytes (along with= load balancing, routing, etc, etc). Only OCaml knows about the Protobuf schemas.

In the OCaml server case, Envoy listens for HTTP/2 gRPC requests, accesses = the bytes payload with no knowledge of the actual schema/layout and repackages these same bytes in a = HTTP/1.1 request that OCaml can process. OCaml then responds with bytes (an encoded Protobuf response m= essage) that Envoy sends back on the original HTTP2 connection.

Bitstring (and ppx_bitstring) 4.0.0

xrguerin announced

Features

  • Add support for let bindings introduced in 4.08
  • Switch to PPXLIB

Deprecations

As PPXLIB requires ocaml >=3D 4.04 support for earlier vers= ions has been dropped.

Breaking changes

This release splits the library from the PPX to reduce runtime dependencies= . Projects using the PPX from bitstring will need to also depends on ppx_bitstring from now on.

Rudi Grinberg added

The project is hosted here= for those who are interested.There's also some excellent d= ocs

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B6AE2E00E5 for ; Tue, 29 Sep 2020 09:02:42 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=mcYN=DG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3ALPi8lxcgXvcWKTGul0RQIs6glGMj4u6mDksu8pMi?= =?us-ascii?q?zoh2WeGdxc25ZhKN2/xhgRfzUJnB7Loc0qyK6v+mAzNLuM/c+Fk5M7V0Hycfjs?= =?us-ascii?q?sXmwFySOWkMmbcaMDQUiohAc5ZX0Vk9XzoeWJcGcL5ekGA6ibqtW1aFRrwLxd6?= =?us-ascii?q?KfroEYDOkcu3y/qy+5rOaAlUmTaxe7x/IAi0oAnLqMUbg4RuJrssxhbJv3BFZ/?= =?us-ascii?q?lYyWR0KFyJgh3y/N2w/Jlt8yRRv/Iu6ctNWrjkcqo7ULJVEi0oP3g668P3uxbD?= =?us-ascii?q?SxCP5mYHXWUNjhVIGQnF4wrkUZr3ryD3q/By2CiePc3xULA0RTGv5LplRRP0lC?= =?us-ascii?q?sKMSMy/2bKhMxtl6JbuAyuqABjw4DaZ4GVMeBxfqLbfdgHQWZMUcJcWylHD4+8?= =?us-ascii?q?bIUPCfQBPedDr4n8vFQOqQWxDhSiBePo0D9Hm2T21rA+3+kvDQ3K2QotFM8Mvn?= =?us-ascii?q?vJttX4LKccX/6owqfGzjvMYO9Z1Czn54TUaB0su+2AUa5yfMfX1EIhFxnFjlKV?= =?us-ascii?q?qYH9Iz6V0v4Cs26G5OR9Se2vi2snqwBtojiz28whjZPGhoYPxVDC7yl525o6Jd?= =?us-ascii?q?29SE56fd6kDIBdtzmdN4tyQsIiX39ntzo6yr0AuJ67ZTUKx4o9yx7YcfyHfJGF?= =?us-ascii?q?7xT+X+mePTl2nmhqeK6jhxms60igzPXxW9W33VpWoCRIltfCum0C2hHX9sSKV/?= =?us-ascii?q?9w80i91DqS1w3e6fxILFwomaTUNpIvwrA9moQNvEnNACL4lln6gayUe0gi5+Om?= =?us-ascii?q?5ePnYrD8qZ+dMY95khn+Pboymsy+HeQ3LBAOX2+e+eS5yrLv50v5T6tWjvEula?= =?us-ascii?q?nWrIrVJcEfpqKjBA9VyIkj5w6wDzenzNQYnWQHI0lfdB2biIjpPknCIP/5Dfej?= =?us-ascii?q?g1SsjSxky+rHPr3mGpnCM2LMkK3ifbZ58UFczgUzwcpD6JJTD7ENOPXzVVPru9?= =?us-ascii?q?zdCh85Kxa0w+H9BNph0YMeXHqDAqiFP6zItF+I4vsjLPKLZI8SuzbxMeQq5/nr?= =?us-ascii?q?jXMhnl8dYLWp3YEJZ3+iAvtmI0WYbWDrgtcbHmcGpgs+Q/HqiV2GVT5ffXGyX7?= =?us-ascii?q?gz5jw9FYmoDp/DS5iwjLCf2Cq3BIBaanxJB1yWH3rka5+IVvkDZS6KP8NsnCEI?= =?us-ascii?q?WaK/R4Ih2hyirhL2x6Z9IubJ+CAUqZTu38Vv6eLJjxE97zl0Atyd026TS2F0mX?= =?us-ascii?q?sFRzo53axiu0B90lCD0ax4gvxEC9Nc+/NJUgE7NZ7F0ux1Fcr+WgXbfteGUFqm?= =?us-ascii?q?Q9OmDi8tTt8p3tMCfUJwF8+/ghzf0CemGbEYm6CRCJE6/a/Qx33xKNx8y3bC2q?= =?us-ascii?q?khlV4mQs5XOGO7mqBx6hTfCpbMk0qFlamkbbwR0iDM+mqb1WqOu0VYUQ5sUarb?= =?us-ascii?q?QX8fZk3WrdXg5kPfUbCiE7MnMhFOycOaMKRKbsfmjVNcSPf4JNveY2exm2asBR?= =?us-ascii?q?aU3b6Dd43qe3gb3CrBFkcEiBof/XOJOAkxHCuhpHjeDDN2GVL1f0zs6fV+qG+8?= =?us-ascii?q?TkIs0w6FdUhh176s9h4RhPycUO8T06kfuCYhrjV0BEyy08jXC9qGvQphfb9Tbc?= =?us-ascii?q?kz4FddhirlsFk3OoOmZeg2gkEYWwBouQXo2gkhTs0Kmtcs5jtimAFtL4qc0Uhd?= =?us-ascii?q?bHWZ0YH0PvvQMGakuFikYqvSn1Xfy8q++6EV6f1+pU+n9AquE1IK93R8z8IT1G?= =?us-ascii?q?GW54nDCAQVQdT8TxUZ7R9/8pjeay913IjU0HxwLeHguzvL3ZQyD+sgywq8V89Y?= =?us-ascii?q?NLKYGQTyFcwDGsXoL/YlzQv6JikYNfxfofZnd/itcOGLjfH6ZbsyrHedlW1Cpb?= =?us-ascii?q?tF/AeM+i57ELWa2oZchemf2hqbWjz8ila4r82xnppLN2hLTziPjBP8DYsUXZVc?= =?us-ascii?q?OIMCCGOgOcqyn4osjZnwXXVV7ximW0NA39WmK0PLMw7NmDZI3EFSmkSJ3DOixm?= =?us-ascii?q?UlwSkuqruD0SfOxeX7aRdBPXREFjBv?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AfAQCs2nJflyIeaIFgHgEBCxIMgzJSR?= =?us-ascii?q?gFeVjIshD2JAotWAoVBjWGFZxABAwENGAEOBQECBAEBgVaCMYJ0Ah4GAQUzEwI?= =?us-ascii?q?QAQEFAQEBAgEDAwQBEwEBAQEBCBYGhV8HJgyCNwwMAwODJQEYCQQGZSMDFAEGA?= =?us-ascii?q?wIRARcBFAoXARIUBkyCQAGCfAUKmVube38zhDsBFgEOCYQXgUINAhOBFoVOS4M?= =?us-ascii?q?DCIQKD4FNP4NzbIJFDAsBAQEBARaBJAEBgzeCYASQHgUik0SSMBRLKgeCaoEOB?= =?us-ascii?q?AuGXYEBiweGd4MNgSiOEY5NIZJogXiGCAd3CIFlhgiKboRVgUEqgWcMBzMaMEO?= =?us-ascii?q?CaQlgDYRUiVYBARaDToJkgXU7hUQ/MwIBAQkFJQIGAQkBAQMJdQEBBRMLAYsBL?= =?us-ascii?q?YIXAQE?= X-IPAS-Result: =?us-ascii?q?A0AfAQCs2nJflyIeaIFgHgEBCxIMgzJSRgFeVjIshD2JAot?= =?us-ascii?q?WAoVBjWGFZxABAwENGAEOBQECBAEBgVaCMYJ0Ah4GAQUzEwIQAQEFAQEBAgEDA?= =?us-ascii?q?wQBEwEBAQEBCBYGhV8HJgyCNwwMAwODJQEYCQQGZSMDFAEGAwIRARcBFAoXARI?= =?us-ascii?q?UBkyCQAGCfAUKmVube38zhDsBFgEOCYQXgUINAhOBFoVOS4MDCIQKD4FNP4Nzb?= =?us-ascii?q?IJFDAsBAQEBARaBJAEBgzeCYASQHgUik0SSMBRLKgeCaoEOBAuGXYEBiweGd4M?= =?us-ascii?q?NgSiOEY5NIZJogXiGCAd3CIFlhgiKboRVgUEqgWcMBzMaMEOCaQlgDYRUiVYBA?= =?us-ascii?q?RaDToJkgXU7hUQ/MwIBAQkFJQIGAQkBAQMJdQEBBRMLAYsBLYIXAQE?= X-IronPort-AV: E=Sophos;i="5.77,317,1596492000"; d="scan'208,217";a="469976078" X-MGA-submission: =?us-ascii?q?MDGAiY5n/27dtEsI7Rjz3fIWh2ciQ+X1p40J8w?= =?us-ascii?q?CL98ndSd5X5RiZ7XPr+h7cvTdtCdhAnqhWlDgScsvpEXI6L9cWqNEMHb?= =?us-ascii?q?sVQICq+UPzLg0GOK/lKPFpmSMYL1PQKmluDrHrXDBtgirwkMNvUiq5fL?= =?us-ascii?q?oMwAlePFQ+mdoeFuZ1b88J+A=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Sep 2020 09:02:40 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 403C9564F04; Tue, 29 Sep 2020 09:02:38 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 29 Sep 2020 09:02:38 +0200 Message-ID: <878sct9ib5.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 29 09:02:39 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=ED0C4564F05 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 22 to 29, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Opam-repository: security and data integrity posture jsonoo 0.1.0 Interesting OCaml Articles Rehabilitating Packs using Functors and Recursivity the OCaml Software Foundation dual 0.1.0 Old CWN Opam-repository: security and data integrity posture =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Chas Emerick said, spawning a huge thread =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In connection with [another thread] discussing the fact that Bitbucket's closure of mercurial support had affected the availability of around 60+ projects' published versions, I learned of a number of facts about how the opam repository is arranged, and how it is managed that are concerning. In summary, it seems that opam / opam-repository: 1. Never retains "published" artifacts, only links to them as provided by library authors. 2. Allows very weak hashes (even md5). 3. Allows authors to _update_ artifact URLs and hashes of previously "published" versions. 4. Offers scant support for individually signing artifacts or metadata. All of these are quite dangerous. As a point of reference, the ecosystems I am most familiar with using prior to OCaml (JVM and Javascript) each had very serious documented failures and exploits (and many many more quiet ones) until their respective package managers (Maven Central et al., and npm) plugged the above vulnerabilities that opam-repository suffers from. To make things concrete, without plugging the above (and especially items 1-3): =E2=80=A2 the availability and integrity of published libraries can be impacted by third-party hosting services changing or going offline (as in the case of the Bitbucket closure) =E2=80=A2 the integrity of libraries can be impacted by authors non-maliciously publishing updates to already-released versions, affecting functionality, platform compatibility, build reproducibility, or all of the above (anecdotes of which were shared with me when talking about this issue earlier today) =E2=80=A2 the integrity of libraries can be impacted by malicious authors publishing updates to already-released versions =E2=80=A2 the integrity of libraries can be impacted by malicious non-aut= hors changing the contents at tarball URLs to include changed code that could e.g. exfiltrate sensitive data from within the organizations that use those libraries. This is definitely the nuclear nightmare scenario, and unfortunately opam is wide open to it thanks to artifacts not being retained authoritatively and [essential community libraries] continuing to use md5 in 2020. Seeing that this has been well-established policy for years was honestly quite shocking (again, in comparison to other languages' package managers that have had these problems licked for a very very long time). I understand that opam and its repository probably have human-decades of work put into them, and that these topics have been discussed here and there (in somewhat piecemeal fashion AFAICT), so I'm certain I have not found (nevermind read) all of the prior art, but I thought it reasonable to open a thread to gauge what the projects' posture is in general. [another thread] [essential community libraries] Hannes Mehnert replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 first of all thanks for your post raising this issue, which is important for me as well. I've been evaluating and working on improving the security of the opam-repository over the years, including to not use `curl =E2=80=93insec= ure` (i.e. properly validate TLS certificates) - the WIP result is [conex], which aims at cryptographically signed community repositories without single points of failures (threshold signatures for delegations, built-in key rollover, =E2=80=A6) - feel free to read the blog posts or O= Caml meeting presentations. Unfortunately it still has not enough traction to be deployed and mandatory for the main opam repository. Without cryptopgraphic signatures (and an established public key infrastructure), the hashes used in opam-repository and opam are more checksums (i.e. integrity protection) than for security. Threat models - I recommend to read section [1.5.2 "goals to protect against specific attacks"] - that's what conex above is based on and attempts to mitigate. I'll most likely spend some time on improving conex over the next year, and finally deploying it on non-toy repositories. In the meantime, what you're mentioning: 1. "Never retains 'published' artifacts" <- this is not true, the opam.ocaml.org host serves as an artifact cache, and is used by opam when you use the default repository. This also means that the checksums and the tarballs are usually taken from the same host -> the one who has access there may change anything arbitrarily for all opam users. 2. "Weak hashes" <- this is true, I'd appreciate if (a) opam would warn (configurable to error out) if a package which uses weak checksum algorithms, and (b) Camelus or some other CI step would warn when md5/sha1 are used 3. "Authors can modify URLs and hashes" <- sometimes (when a repository is renamed or moved on GitHub) the GitHub auto-generated tarball has a different checksum. I'd appreciate to, instead of updating that meta-data in the opam-repository to add new patch-versions (1.2.3-1 etc.) with the new URL & hash - there could as well be a CI job / Camelus check what is allowed to be modified in an edit of a package (I think with the current state of the opam-repository, "adding upper bounds" on dependencies needs to be allowed, but not really anything else). 4. I'm not sure I understand what you mean - is it about cryptographic signatures and setting up a public key infrastructure? [conex] [1.5.2 "goals to protect against specific attacks"] Anton Kochkov said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Closely related issue is , since the integrity checks and verification will become even more important if there will be multiple mirrors in the future. jsonoo 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Max LANTAS announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Hello! I am announcing the first release of `jsonoo', a JSON library for Js_of_ocaml. This library provides a very similar API to the excellent BuckleScript library, [bs-json] by [glennsl]. Unlike bs-json, this port of the library tries to follow OCaml naming conventions and be easier to interface with other OCaml types like `Hashtbl.t' . This library passes a nearly equivalent test suite. This project is part of ongoing work to port [vscode-ocaml-platform] to Js_of_ocaml. Generated documentation can be found [here]. [bs-json] [glennsl] [vscode-ocaml-platform] [here] Interesting OCaml Articles =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Ryan Slade announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Rehabilitating Packs using Functors and Recursivity =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Our new blogpost is about the redemption of packs in the OCaml ecosystem. This first part shows our work to generate functor units and functor packs : [Rehabilitating Packs using Functors and Recursivity, part 1.] Packs in the OCaml ecosystem are kind of an outdated concept (options `-pack' and `-for-pack' the OCaml manual, and their main utility has been overtaken by the introduction of module aliases in OCaml 4.02. What if we tried to redeem them and give them a new youth and utility by adding the possibility to generate functors or recursive packs? This blog post covers the functor units and functor packs, while the next one will be centered around recursive packs. Both RFCs are currently developed by JaneStreet and OCamlPro. This idea was initially introduced by functor packs (Fabrice Le Fessant) and later generalized by functorized namespaces (Pierrick Couderc /et al/.). [Rehabilitating Packs using Functors and Recursivity, part 1.] the OCaml Software Foundation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We were all very busy during the last semester, and have been mostly quiet on the foundation activities, but of course our actions were running in the background. Some highlights: =E2=80=A2 Kate @kit-ty-kate Deplaix has worked on opam-repository QA for = the OCaml 4.11 release, and the work and results are just as superb as for 4.10. We will fund Kate to work again on the upcoming 4.12 release. =E2=80=A2 We are funding ongoing maintenance work on [ocaml-rs] (a port o= f the OCaml FFI library from C to Rust) by its author and maintainer, Zach @zshipko Shipko. Zach did a big round of cleanup changes this summer, improving the overall design of the library and completing its feature set. =E2=80=A2 We are funding @JohnWhitington (the author of [OCaml from the V= ery Beginning]) to do some technical writing work for OCaml documentation. His contributions so far have been very diverse, from a script to harmonize the documentation of List and ListLabels (and Array and ArrayLabels, etc.) in the standard library, to small cleanups and improvement to ocaml.org web pages. One focus of his work is the upcoming documentation page "Up and running with OCaml", taking complete newcomers through the basic setup, using the toplevel and building and running a Hello World. ([ocaml.org#1165], [rendered current state]) =E2=80=A2 Two [Outreachy] internships were supervised this summer, focusi= ng on the compiler codebase. Florian @Octachron Angeletti (INRIA) supervised an intern on adding a JSON format for some compiler messages (we expect PRs to be submitted soon). Vincent @vlaviron Laviron and Guillaume @zozozo Bury (OCamlPro) supervised an intern on reducing mutable state in the internal implementation. =E2=80=A2 Inspired by [this Discuss thread], we are funding experimental = work by @sanette on the HTML rendering of the OCaml manual. This work is in the process of being reviewed for upstreaming in the OCaml compiler distribution. ([#9755].) This is a better end-result than I had initially expected. (We also had a couple non-highlights. For example, we funded a sprint (physical development meeting) for the [Owl] contributors, with Marcello @mseri Seri doing all the organization work; it was planned for the end of March, and had to be postponed due to the pandemic.) [ocaml-rs] [OCaml from the Very Beginning] [ocaml.org#1165] [rendered current state] [Outreachy] [this Discuss thread] [#9755] [Owl] dual 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Jason Nielsen announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99ve released [dual] which is now up on opam. It is a dual numbe= rs library which includes a one dimensional root finder (via Newton's method). [dual] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 22 to 29, 2= 020.

Opam-repository: security and data integrity posture

Chas Emerick said, spawning a huge thread

In connection with another thread discussing the fact that Bitbucket's closure of mercurial support had affec= ted the availability of around 60+ projects' published versions, I learned of a number of facts abo= ut how the opam repository is arranged, and how it is managed that are concerning.

In summary, it seems that opam / opam-repository:

  1. Never retains "published" artifacts, only links to them as provided by = library authors.
  2. Allows very weak hashes (even md5).
  3. Allows authors to update artifact URLs= and hashes of previously "published" versions.
  4. Offers scant support for individually signing artifacts or metadata.

All of these are quite dangerous. As a point of reference, the ecosystems I= am most familiar with using prior to OCaml (JVM and Javascript) each had very serious documented failur= es and exploits (and many many more quiet ones) until their respective package managers (Maven Centra= l et al., and npm) plugged the above vulnerabilities that opam-repository suffers from.

To make things concrete, without plugging the above (and especially items 1= -3):

  • the availability and integrity of published libraries can be impacted b= y third-party hosting services changing or going offline (as in the case of= the Bitbucket closure)
  • the integrity of libraries can be impacted by authors non-maliciously p= ublishing updates to already-released versions, affecting functionality, pl= atform compatibility, build reproducibility, or all of the above (anecdotes= of which were shared with me when talking about this issue earlier today)<= /li>
  • the integrity of libraries can be impacted by malicious authors publish= ing updates to already-released versions
  • the integrity of libraries can be impacted by malicious non-authors cha= nging the contents at tarball URLs to include changed code that could e.g. = exfiltrate sensitive data from within the organizations that use those libr= aries. This is definitely the nuclear nightmare scenario, and unfortunately= opam is wide open to it thanks to artifacts not being retained authoritati= vely and essential community libraries continuing= to use md5 in 2020.

Seeing that this has been well-established policy for years was honestly qu= ite shocking (again, in comparison to other languages' package managers that have had these problem= s licked for a very very long time). I understand that opam and its repository probably have human-d= ecades of work put into them, and that these topics have been discussed here and there (in somewhat= piecemeal fashion AFAICT), so I'm certain I have not found (nevermind read) all of the prior art, but = I thought it reasonable to open a thread to gauge what the projects' posture is in general.

Hannes Mehnert replied

first of all thanks for your post raising this issue, which is important fo= r me as well.

I've been evaluating and working on improving the security of the opam-repo= sitory over the years, including to not use `curl –insecure` (i.e. properly validate TLS ce= rtificates) - the WIP result is conex, which aims at crypt= ographically signed community repositories without single points of failures (threshold signatures for de= legations, built-in key rollover, …) - feel free to read the blog posts or OCaml meeting pre= sentations. Unfortunately it still has not enough traction to be deployed and mandatory for the main opa= m repository. Without cryptopgraphic signatures (and an established public key infrastructure), t= he hashes used in opam-repository and opam are more checksums (i.e. integrity protection) tha= n for security. Threat models - I recommend to read section 1.5.2 "goals to protect against specific attacks" - that's wh= at conex above is based on and attempts to mitigate. I'll most likely spend= some time on improving conex over the next year, and finally deploying it on non-toy rep= ositories.

In the meantime, what you're mentioning:

  1. "Never retains 'published' artifacts" <- this is not true, the opam.= ocaml.org host serves as an artifact cache, and is used by opam when you us= e the default repository. This also means that the checksums and the tarbal= ls are usually taken from the same host -> the one who has access there = may change anything arbitrarily for all opam users.
  2. "Weak hashes" <- this is true, I'd appreciate if (a) opam would warn= (configurable to error out) if a package which uses weak checksum algorith= ms, and (b) Camelus or some other CI step would warn when md5/sha1 are used=
  3. "Authors can modify URLs and hashes" <- sometimes (when a repository= is renamed or moved on GitHub) the GitHub auto-generated tarball has a dif= ferent checksum. I'd appreciate to, instead of updating that meta-data in t= he opam-repository to add new patch-versions (1.2.3-1 etc.) with the new UR= L & hash - there could as well be a CI job / Camelus check what is allo= wed to be modified in an edit of a package (I think with the current state = of the opam-repository, "adding upper bounds" on dependencies needs to be a= llowed, but not really anything else).
  4. I'm not sure I understand what you mean - is it about cryptographic sig= natures and setting up a public key infrastructure?

Anton Kochkov said

Closely related issue is https://discuss.ocaml.org/t/how-to-setup-local-op= am-mirror/4423, since the integrity checks and verification will become even more important if there = will be multiple mirrors in the future.

jsonoo 0.1.0

Max LANTAS announced

Hello! I am announcing the first release of jsonoo, a JSON lib= rary for Js_of_ocaml.

https://github.com/mnxn/jsonoo https://opam.ocaml.org/p= ackages/jsonoo

This library provides a very similar API to the excellent BuckleScript libr= ary, bs-json by glennsl. Unlike bs-json, this port of the library tries to follow OCaml naming conventions and be ea= sier to interface with other OCaml types like Hashtbl.t . This library passes a nearly equi= valent test suite.

This project is part of ongoing work to port vscode-ocaml= -platform to Js_of_ocaml.

Generated documentation can be found here.

Rehabilitating Packs using Functors and Recursivity

OCamlPro announced

Our new blogpost is about the redemption of packs in the OCaml ecosystem. T= his first part shows our work to generate functor units and functor packs : Rehabilitating Packs using Functors and Recursivity, part 1.

Packs in the OCaml ecosystem are kind of an outdated concept (options -pack and -for-pack the OCaml manual, and their main utility has been overtaken by the introduction= of module aliases in OCaml 4.02. What if we tried to redeem them and give them a new youth and u= tility by adding the possibility to generate functors or recursive packs?

This blog post covers the functor units and functor packs, while the next o= ne will be centered around recursive packs. Both RFCs are currently developed by JaneStreet and OCamlP= ro. This idea was initially introduced by functor packs (Fabrice Le Fessant) and later genera= lized by functorized namespaces (Pierrick Couderc et al.).

the OCaml Software Foundation

gasche announced

We were all very busy during the last semester, and have been mostly quiet = on the foundation activities, but of course our actions were running in the background. Some = highlights:

  • Kate @kit-ty-kate Deplaix has worked on opam-repository QA for the OCam= l 4.11 release, and the work and results are just as superb as for 4.10. We= will fund Kate to work again on the upcoming 4.12 release.
  • We are funding ongoing maintenance work on ocaml-rs (a port of the OCaml FFI library from C t= o Rust) by its author and maintainer, Zach @zshipko Shipko. Zach did a big = round of cleanup changes this summer, improving the overall design of the l= ibrary and completing its feature set.
  • We are funding @JohnWhitington (the author of OCaml from the Very Beginning) to do some technical writing w= ork for OCaml documentation. His contributions so far have been very divers= e, from a script to harmonize the documentation of List and ListLabels (and= Array and ArrayLabels, etc.) in the standard library, to small cleanups an= d improvement to ocaml.org web pages. One focus of his work is the upcoming= documentation page "Up and running with OCaml", taking complete newcomers = through the basic setup, using the toplevel and building and running a Hell= o World. (ocaml.or= g#1165, rendered current state<= /a>)
  • Two Outreachy internships were su= pervised this summer, focusing on the compiler codebase. Florian @Octachron= Angeletti (INRIA) supervised an intern on adding a JSON format for some co= mpiler messages (we expect PRs to be submitted soon). Vincent @vlaviron Lav= iron and Guillaume @zozozo Bury (OCamlPro) supervised an intern on reducing= mutable state in the internal implementation.
  • Inspired by this Discuss thread, we are funding experimental = work by @sanette on the HTML rendering of the OCaml manual. This work is in= the process of being reviewed for upstreaming in the OCaml compiler distri= bution. (#9755.) T= his is a better end-result than I had initially expected.

(We also had a couple non-highlights. For example, we funded a sprint (phys= ical development meeting) for the Owl contributors, with M= arcello @mseri Seri doing all the organization work; it was planned for the end of March, and had to be postp= oned due to the pandemic.)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id A5682E00E5 for ; Tue, 6 Oct 2020 09:22:49 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=1E/0=DN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3APC8KQxSQxX2C/vVGjzzuWQXo5tpsv+yvbD5Q0YIu?= =?us-ascii?q?jvd0So/mwa67ZhSFt8tkgFKBZ4jH8fUM07OQ7/m/HzBbqs/Y6jgrS99lb1c9k8?= =?us-ascii?q?IYnggtUoauKHbQC7rUVRE8B9lIT1R//nu2YgB/Ecf6YEDO8DXptWZBUhrwOhBo?= =?us-ascii?q?KevrB4Xck9q41/yo+53Ufg5EmCexbal9IRmrrwjdrMYbjIVtJqos1xfFvGZDdv?= =?us-ascii?q?hLy29vOV+dhQv36N2q/J5k/SRQuvYh+NBFXK7nYak2TqFWASo/PWwt68LlqRfM?= =?us-ascii?q?TQ2U5nsBSWoWiQZHAxLE7B7hQJj8tDbxu/dn1ymbOc32Sq00WSin4qx2RhLklD?= =?us-ascii?q?sLOjgk+23XicJwirxboBO6pxx+2IHUZJ+aP+dwf6PaZ9MVWHFBVdtVWyFPHo+w?= =?us-ascii?q?ao0CBPcDM+lFtYnwv1sAowWjCweiB+3gxSNHi2Ts0qEmyeksCx3K0BAiEt8IrX?= =?us-ascii?q?/arM/1NKAXUe2t0KTIyS/Mb/VL0jng9IfIchUhofCQXbJsbMHczlMgFwffgVWW?= =?us-ascii?q?s4DlJC+a1uQIs2ia8+pgSfmii3YgqwF1ojmv2tkjhZXJhoITy1DE7Dh5z5gvKd?= =?us-ascii?q?2/Uk57bsepHZ1NvC6VK4V4WNktQ310uCkk0L0Gv4a2cDQLxZk6xxPSb+GKfoyI?= =?us-ascii?q?7x/sVeucIyt0in1ldr+hhxu/71WtxvHiW8S30FhHoSVIn8fDu34DyRHe6cmKR/?= =?us-ascii?q?ph80qnxD2B2QfT6uReLkA1k6rWM4YhzaAslpoSrUTMADf2mELzjK+TaEoo4O6o?= =?us-ascii?q?5Pr7Yrn+oZ+TK5V7igT6Mqg0ncy/G+s4PhABX2ia5eS80Kfs8lbjTLpWif02l7?= =?us-ascii?q?HVsJfGKssBo665BxdV0pwk6xqlEzim19EYkWEILFJEZBKHj5XpNErULP/kCve/?= =?us-ascii?q?hkygkDZ2yPHGOr3hBo/BLn/ZkLfue7t29k1SyBIrwNxC+Z5ZDqsNLO/vVkL+rt?= =?us-ascii?q?DVAAM1Pxa6zuvoENlw1IATVXiRDqKWLq/eq0KE6+01L+WRa4IZpDDwIOU/6fH0?= =?us-ascii?q?l382g1odcLGp3ZQJbHC4GexrI0CWYHbxmNsBCWAKvg4+Tez2llKNTT5TZ3CzX6?= =?us-ascii?q?Il+zE0FpiqDYDZRoCimLCB3SG7EYNKZm1eF1yAD3Ple5+ZV/sQZy+eOMFsniAe?= =?us-ascii?q?WbWvRIItzRSuuxX7y7pjIOrU4CoYtZf72dZo++PdiA0++CRpA8qSyG2BU3l5kG?= =?us-ascii?q?0QSTIuxKB/pkh9y1ef0admn/NYFdpT5/JQUgcnK5HQ1et6C8r9Wg/ZZNiJTEyp?= =?us-ascii?q?QtO8DTEqUt0xw9oOY0dhG9W+lR3MxC2qA6ITl7OXGpM06bjQ333+Ksdy0XrG07?= =?us-ascii?q?Mhj1Y+TstVKWKmnrJ/9xTUB4PRj0qWjaOqdaAF0C7J9WeD1naOsVpDUA9wVKXF?= =?us-ascii?q?RWoQalHXrdT//EPCTqWhBa4pMgtbmoa+Lf4AbsLvxx0SQOjlENDBZSS3lnvmQV?= =?us-ascii?q?7CzayKJsKiL24C2g3ZCVMYiEYS8WeCMU45HCj35yrVBTlqUFbueF/E8O9kqXr9?= =?us-ascii?q?QFVwhwqNalVJ07uu5gVTguaWSu8a2rwDqGEstmZaBlG4ivvSAtzInAFheaRAfZ?= =?us-ascii?q?tp6VNO0yTCvAx4P4C8B7hlgk8Cfg93uUL3yhgxDZ9Px5t55Eg2xRZ/fPrLmGhK?= =?us-ascii?q?cCmViMuoY+GFGizJ5BmqLpXu9BTGyt/Pq/UX7/Apt1jovAeoD1cvtXJ93IsMii?= =?us-ascii?q?rO1tDxFAMXFKnJfAMy/hl+qavdZ3BitYnTyHtnPLLyt2PSndUzC7l8k0vyT5Jk?= =?us-ascii?q?KKqBUTTKPYgaCsypcrd4nkjwKAoDOPFO+aU0OcK/avbA37Skbr9t?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0B3AAB+GnxflyIeaIFgHQEBAQEJARIBB?= =?us-ascii?q?QUBgg+BI4EYAV5WMiyEPYkCi0mFRZNaAQMBDRgBDAcBAgQBAYRjggoCHgYBBTM?= =?us-ascii?q?TAhABAQUBAQECAQMDBAETAQEBAQEIFgaGDAyCNwwZgx4BIQplIwMUBwMCBA0BF?= =?us-ascii?q?wEUChcBEhqDDAGCfAQBCowmm3uBMoQ7AYRcgUINAhOBFoVOS4MGg2wmD4FNP4N?= =?us-ascii?q?zbIJFDAsBAQEBAYEzBwEBgzeCYASQIpNxkxErB4JqgQ4EC4ZggQKLDYZ6hDeca?= =?us-ascii?q?iGSdIgAfoFwhgmKcYRXgUEqgWcMBzMaMIMsCWANjXYBhBmEWTuFRD8zAgEBMwI?= =?us-ascii?q?GAQkBAQMJdQEBBRMLAYpngkYBAQ?= X-IPAS-Result: =?us-ascii?q?A0B3AAB+GnxflyIeaIFgHQEBAQEJARIBBQUBgg+BI4EYAV5?= =?us-ascii?q?WMiyEPYkCi0mFRZNaAQMBDRgBDAcBAgQBAYRjggoCHgYBBTMTAhABAQUBAQECA?= =?us-ascii?q?QMDBAETAQEBAQEIFgaGDAyCNwwZgx4BIQplIwMUBwMCBA0BFwEUChcBEhqDDAG?= =?us-ascii?q?CfAQBCowmm3uBMoQ7AYRcgUINAhOBFoVOS4MGg2wmD4FNP4NzbIJFDAsBAQEBA?= =?us-ascii?q?YEzBwEBgzeCYASQIpNxkxErB4JqgQ4EC4ZggQKLDYZ6hDecaiGSdIgAfoFwhgm?= =?us-ascii?q?KcYRXgUEqgWcMBzMaMIMsCWANjXYBhBmEWTuFRD8zAgEBMwIGAQkBAQMJdQEBB?= =?us-ascii?q?RMLAYpngkYBAQ?= X-IronPort-AV: E=Sophos;i="5.77,342,1596492000"; d="scan'208,217";a="471129598" X-MGA-submission: =?us-ascii?q?MDESDWTXMz3gZRY3MsvRKJDFcJjK8FAmUX9auB?= =?us-ascii?q?RqKT50aguvEUC8fSUAPQhxhxd4lQlJd6dvtkrdXQxc7mOx/fK9daRojS?= =?us-ascii?q?PDA4IdlValc8rF62TaqPbfkPYZXCQmlOwyZvosMqs/GHlxxtKdndWm4E?= =?us-ascii?q?icdxEPY7jkjcZpWYB45hiSpw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Oct 2020 09:22:48 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 66741564C45; Tue, 6 Oct 2020 09:22:47 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 06 Oct 2020 09:22:46 +0200 Message-ID: <87362rn7i1.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 6 09:22:47 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.005117, queueID=D72B8564C4A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgU2VwdGVtYmVyIDI5IHRvDQpPY3RvYmVyIDA2LCAyMDIwLg0KDQpUYWJsZSBvZiBDb250 ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCnZ1ZS1qc29vIDAuMg0KUmVoYWJpbGl0YXRpbmcgcGFja3MgdXNpbmcgZnVuY3RvcnMgYW5k IHJlY3Vyc2l2aXR5LCBwYXJ0IDINCkNsYXAgMC4xLjAgKENvbW1hbmQtTGluZSBBcmd1bWVudCBQ YXJzaW5nKQ0KT2xkIENXTg0KDQoNCnZ1ZS1qc29vIDAuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tdnVlLWpzb28tMC0yLzY1MjIvMT4NCg0KDQpsZXZpbGxhaW4ubWF4aW1lIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdkIGxpa2UgdG8gYW5ub3VuY2UgdGhlIHNl Y29uZCByZWxlYXNlIG9mIHZ1ZS1qc29vICh2dWUtanNvby4wLjIpLiBBDQogIGpzX29mX29jYW1s IGJpbmRpbmcgYW5kIGhlbHBlcnMgdG8gdXNlIHRoZSB2dWUtanMgZnJhbWV3b3JrIHdpdGgNCiAg anNfb2Zfb2NhbWwuDQoNCg0KWGF2aWVyIFZhbiBkZSBXb2VzdHluZSBhZGRlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBpcyB0aGUgbGluazogPGh0dHBzOi8vZ2l0bGFi LmNvbS9vLWxhYnMvdnVlLWpzb28+DQoNCiAgKENvbmdyYXR1bGF0aW9uISkNCg0KDQpSZWhhYmls aXRhdGluZyBwYWNrcyB1c2luZyBmdW5jdG9ycyBhbmQgcmVjdXJzaXZpdHksIHBhcnQgMg0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9yZWhhYmls aXRhdGluZy1wYWNrcy11c2luZy1mdW5jdG9ycy1hbmQtcmVjdXJzaXZpdHktcGFydC0yLzY1MjUv MT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvbGxvd2luZyB0aGUgcHVibGljYXRpb24g b2YgW3RoZSBmaXJzdCBwYXJ0XSBvZiBvdXIgYmxvZ3Bvc3QgYWJvdXQNCiAgdGhlIHJlZGVtcHRp b24gb2YgcGFja3MgaW4gdGhlIE9DYW1sIGVjb3N5c3RlbSwgd2UgYXJlIHBsZWFzZWQgdG8NCiAg c2hhcmUgIltSZWhhYmlsaXRhdGluZyBwYWNrcyB1c2luZyBmdW5jdG9ycyBhbmQgcmVjdXJzaXZp dHksIHBhcnQgMi5dIg0KDQogICAgICAgIFRoaXMgYmxvZyBwb3N0IGFuZCB0aGUgcHJldmlvdXMg b25lIGFib3V0IGZ1bmN0b3IgcGFja3MNCiAgICAgICAgY292ZXJzIHR3byBSRkNzIGN1cnJlbnRs eSBkZXZlbG9wZWQgYnkgT0NhbWxQcm8gYW5kIEphbmUNCiAgICAgICAgU3RyZWV0LiBXZSBwcmV2 aW91c2x5IGludHJvZHVjZWQgZnVuY3RvciBwYWNrcywgYSBuZXcNCiAgICAgICAgZmVhdHVyZSBh ZGRpbmcgdGhlIHBvc3NpYmxpdHkgdG8gY29tcGlsZSBwYWNrcyBhcw0KICAgICAgICBmdW5jdG9y cywgYWxsb3dpbmcgdGhlIHVzZXIgdG8gaW1wbGVtZW50IGZ1bmN0b3JzIGFzDQogICAgICAgIG11 bHRpcGxlIHNvdXJjZSBmaWxlcyBvciBldmVuIHBhcmFtZXRlcml6ZWQgbGlicmFyaWVzLg0KDQog ICAgICAgIEluIHRoaXMgYmxvZyBwb3N0LCB3ZSB3aWxsIGNvdmVyIHRoZSBvdGhlciBhc3BlY3Qg b2YgdGhlDQogICAgICAgIHBhY2tzIHJlaGFiaWxpdGF0aW9uOiBhbGxvd2luZyBhbnlvbmUgdG8g aW1wbGVtZW50DQogICAgICAgIHJlY3Vyc2l2ZSBjb21waWxhdGlvbiB1bml0cyB1c2luZyBwYWNr cyAoYXMgZGVzY3JpYmVkDQogICAgICAgIGZvcm1hbGx5IGluIHRoZSBSRkMjMjApLiBPdXIgcHJl dmlvdXMgcG9zdCBpbnRyb2R1Y2VkDQogICAgICAgIGJyaWVmbHkgaG93IHBhY2tzIHdlcmUgY29t cGlsZWQgYW5kIHdoeSB3ZSBuZWVkZWQgc29tZQ0KICAgICAgICBiaXRzIG9mIGNsb3N1cmUgY29u dmVyc2lvbiB0byBlZmZlY3RpdmVseSBpbXBsZW1lbnQgYmlnDQogICAgICAgIGZ1bmN0b3JzLiBP bmNlIGFnYWluLCB0byBpbXBsZW1lbnQgcmVjdXJzaXZlIHBhY2tzIHdlIHdpbGwNCiAgICAgICAg bmVlZCB0byBlbmNvZGUgbW9kdWxlcyB0aHJvdWdoIHRoaXMgdGVjaG5pcXVlLCBhcyBzdWNoIHdl DQogICAgICAgIGFkdmlzZSB0aGUgcmVhZGVyIHRvIGNoZWNrIGF0IGxlYXN0IHRoZSBpbnRyb2R1 Y3Rpb24gYW5kDQogICAgICAgIHRoZSBjb21waWxhdGlvbiBwYXJ0IG9mIGZ1bmN0b3IgcGFja3Mu DQoNCg0KW3RoZSBmaXJzdCBwYXJ0XQ0KPGh0dHBzOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzA5 LzI0L3JlaGFiaWxpdGF0aW5nLXBhY2tzLXVzaW5nLWZ1bmN0b3JzLWFuZC1yZWN1cnNpdml0eS1w YXJ0LTEvPg0KDQpbUmVoYWJpbGl0YXRpbmcgcGFja3MgdXNpbmcgZnVuY3RvcnMgYW5kIHJlY3Vy c2l2aXR5LCBwYXJ0IDIuXQ0KPGh0dHBzOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIwLzA5LzMwL3Jl aGFiaWxpdGF0aW5nLXBhY2tzLXVzaW5nLWZ1bmN0b3JzLWFuZC1yZWN1cnNpdml0eS1wYXJ0LTIv Pg0KDQoNCkNsYXAgMC4xLjAgKENvbW1hbmQtTGluZSBBcmd1bWVudCBQYXJzaW5nKQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Y2xhcC0wLTEtMC1jb21tYW5kLWxpbmUtYXJndW1lbnQtcGFyc2luZy82NTQ0LzE+DQoNCg0KcmJh cmRvdSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ug b2YgQ2xhcC4NCg0KICBDbGFwIGlzIGEgbGlicmFyeSBmb3IgY29tbWFuZC1saW5lIGFyZ3VtZW50 IHBhcnNpbmcuIENsYXAgd29ya3MgYnkNCiAgZGlyZWN0bHkgY29uc3VtaW5nIGFyZ3VtZW50cyBp biBhbiBpbXBlcmF0aXZlIHdheS4gVHJhZGl0aW9uYWxseSwNCiAgYXJndW1lbnQgcGFyc2luZyBp biBPQ2FtbCBpcyBkb25lIGJ5IGZpcnN0IGRlZmluaW5nIGEgc3BlY2lmaWNhdGlvbg0KICAoYW4g T0NhbWwgdmFsdWUgZGVmaW5pbmcgdGhlIHR5cGVzIG9mIGFyZ3VtZW50cyksIGFuZCB0aGVuIHBh cnNpbmcNCiAgZnJvbSB0aGlzIHNwZWNpZmljYXRpb24uIFRoZSAiaW1wdXJlIiBhcHByb2FjaCBv ZiBDbGFwIHNraXBzIHRoZSBuZWVkDQogIHRvIGRlZmluZSBhIHNwZWNpZmljYXRpb24gYW5kIHJl c3VsdHMgaW4gY29kZSB3aGljaCBpcyBxdWl0ZSBzaW1wbGUgaW4NCiAgcHJhY3RpY2UsIHdpdGgg bGltaXRlZCBib2lsZXJwbGF0ZS4NCg0KICBDbGFwIGlzIGF2YWlsYWJsZSBhcyBhbiBvcGFtIHBh Y2thZ2UgKGBvcGFtIGluc3RhbGwgY2xhcCcpLg0KDQogIFNvdXJjZSBjb2RlLCBBUEkgZG9jdW1l bnRhdGlvbiBhbmQgYSBmdWxsIGNvbW1lbnRlZCBleGFtcGxlIGFyZQ0KICBhdmFpbGFibGUgYXQ6 IDxodHRwczovL2dpdGh1Yi5jb20vcmJhcmRvdS9jbGFwLz4NCg0KDQpPbGQgQ1dODQrilZDilZDi lZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g W3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNo aXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkg bWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0N Cg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlx dWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3du Lz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlz dGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 29 to October 06, 2020.

vue-jsoo 0.2

levillain.maxime announced

I'd like to announce the second release of vue-jsoo (vue-jsoo.0.2). A js_of_ocaml binding and helpers to use the vue-js framework with js_of_ocaml.

Xavier Van de Woestyne added

Here is the link: https://gitlab.com/o-labs/vue-jsoo

(Congratulation!)

Rehabilitating packs using functors and recursivity, part 2

OCamlPro announced

Following the publication of the first part of our blogpost about the redemption of packs in the OCaml ecosystem, we are pleased to share "Rehabilitating packs using functors and recursivity, part 2."

This blog post and the previous one about functor packs covers two RFCs currently developed by OCamlPro and Jane Street. We previously introduced functor packs, a new feature adding the possiblity to compile packs as functors, allowing the user to implement functors as multiple source files or even parameterized libraries.

In this blog post, we will cover the other aspect of the packs rehabilitation: allowing anyone to implement recursive compilation units using packs (as described formally in the RFC#20). Our previous post introduced briefly how packs were compiled and why we needed some bits of closure conversion to effectively implement big functors. Once again, to implement recursive packs we will need to encode modules through this technique, as such we advise the reader to check at least the introduction and the compilation part of functor packs.

Clap 0.1.0 (Command-Line Argument Parsing)

rbardou announced

I am happy to announce the first release of Clap.

Clap is a library for command-line argument parsing. Clap works by directly consuming arguments in an imperative way. Traditionally, argument parsing in OCaml is done by first defining a specification (an OCaml value defining the types of arguments), and then parsing from this specification. The "impure" approach of Clap skips the need to define a specification and results in code which is quite simple in practice, with limited boilerplate.

Clap is available as an opam package (opam install clap).

Source code, API documentation and a full commented example are available at: https://github.com/rbardou/clap/

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6B4A0E02D5 for ; Tue, 20 Oct 2020 10:15:58 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=rYP5=D3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AijpIahbD5m1CKTf2eRGkMVb/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZpsi9Zh7h7PlgxGXEQZ/co6odzbaP7Oa/AydZvM/JmUtBWaQEbwUCh8?= =?us-ascii?q?QSkl5oK+++Imq/EsTXaTcnFt9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6?= =?us-ascii?q?OPn+FJLMgMSrzeCy/IDYbxlViDanbr5+MRe7oR/Tu8UIjoduN6Y8xgbUqXZUZu?= =?us-ascii?q?pawn9lK0iOlBjm/Mew+5Bj8yVUu/0/8sNLTLv3caclQ7FGFToqK2866tHluhnF?= =?us-ascii?q?VguP+2ATUn4KnRpSAgjK9w/1U5HsuSbnrOV92S2aPcrrTbAoXDmp8qlmRAP0hC?= =?us-ascii?q?oBKjU293zZitFrjKJDvh2uuwB/zYDTYIGQLvV+f6Xdds4eSWdOWstdUipMDoO/?= =?us-ascii?q?YYsJEeoBPP1Yr4jmqFsKsxS1GAetBOT1yjBVnX/9wKk23uo9HQ3D2gErAtAAv2?= =?us-ascii?q?nOrNjtNKkcT/27wqfLwzrMc/xbwi3y5JTSfx07vf2AQbB9fMzMwkcvDQPFiVCQ?= =?us-ascii?q?pJT5MjORzOsNtXWQ4fd8WuKvjm4nqh1xoiSyzcorkIbJgpgaylbe+SVi3Ik1Jd?= =?us-ascii?q?i4SE9nYd64C5ZQryaaN492Q8M+XW5npCY6yrsHuZ6iYSgF1o4rxxnFa/yIaoWF?= =?us-ascii?q?5A/oW+mNLzlinn1lZK6/iAio8Uim0uDyWNe53VhKoydFk9TBqHIA2RPR58WaSf?= =?us-ascii?q?Zz8Eas1ziN2gzO6+xKIV45mKrVJZMgzbM8ipodv0vHEyL0lkv4gq+be0M58eam?= =?us-ascii?q?7OTnZ6/ppp6aN4JskgHxLLgums2jAesmKggOWG2b+eGi27H5+032XqlKguUxkq?= =?us-ascii?q?bFqp/aIMAbqrS+Aw9P3YYv8wuwDza839QcmnkLNkhKeBOfg4jzJV7BPOr4Deq+?= =?us-ascii?q?g1Swjjhk2erKMaHmApXINnTDn7bhfap9605B0wU/18xQ55VRCr0ZL/LzW1PxtN?= =?us-ascii?q?zFDhAiKQC0wuHnBM1j2YMEQ2KAGLOZMKLLsV+V+O0jOfWDZI8NtDb6N/cl/P/u?= =?us-ascii?q?jXAnll8bZ6Wp2oEXaH+gEvt9OUWZZnTtgtEbHWgUowU+UfTmiFiFUT9SZnayW6?= =?us-ascii?q?Y86SshBIKhF4fDSZihgLKG3CehG51WfXpKCl+IEXj2b4mEXOsDZziXIs9lizAE?= =?us-ascii?q?TrahR5Um1RG0uw/207VnLu3Q+iICs5Lj28J55+rJlRE97TB0Ad6S03yWT25unW?= =?us-ascii?q?MEXTo2075nrUxn11eDyrR4j+VcFdNJ4fNJXR02NZnGz+x1E9zyWx/Of9eNSFai?= =?us-ascii?q?WNmmBisxTt03ztQTYEh9A82vgg3d0yeuGbMZiqCHCZMu/q/Sw3T9Pchwxnne2K?= =?us-ascii?q?U8gVQqX9FDOXOmi6Nw7QTfGpLFn1+Em6uoaagR2jPG+n2ZwmqUpk5YVRZ9UaXb?= =?us-ascii?q?UnAbYUvbtdH550zfQ7O0EbQnNQ9ByM6eKqRUdtLpjVNGRPb6ONTDfW29gWCwBQ?= =?us-ascii?q?yHxr+UbYrqfXsS3DnFBUQZjQwe+WyKORUiCiquuW7TAiBiGUjhbk7j6eV+rWm0?= =?us-ascii?q?Tk4wzwGEdU1h0L+19wYIi/KAVv0fwqoJuD0jpDtuHFuwx9zYBtSYqgp5e6VcZd?= =?us-ascii?q?M84EtZ2m3Ftwx9OJ2gL7l/hlEAaQh3uFnu1xpvB4palcgltnUqwBBpKa2E0FNB?= =?us-ascii?q?cjKY3YzsOrDMMWby+w2va6jK1V7Ay9aa4KIP5fs3qln5uwGpDEUi/21909ZJy3?= =?us-ascii?q?uc+onKDA0KXJ3tSEk38hx6q6jeYik8/IPUyWZhMbK0sz/Hw9ImHvEpyhemf9dF?= =?us-ascii?q?MaOLDhX+E8MAB5vmFOt/0Vy2aFhMaORN8oYwIMXgcfaajurjdu1/mnjuxTBM/4?= =?us-ascii?q?ZV1kOX6zE6S+LZ25JDxOuXiE/PXD75iBKls9vrsYFCfzAbWGSljWDvA4tJTqlz?= =?us-ascii?q?ZpoQT2C0Kcyrz9FwgI6rVmML2kSkAgYv3MavMSGZb1n8wREYgU0TqHrhgiC4yj?= =?us-ascii?q?1ojxkxqa6OwCHFw+LjbQcKfGlRSz8x3h/XPYGogoVCDwCTZA8zmU76tB+nlZge?= =?us-ascii?q?n7x2KizoeWkNfyXyKDs5AK6g7/yaZMpe9J4jsSNWSfmxJ1eAReyk+kdI42bYB2?= =?us-ascii?q?JbgQsDWXSyoJygzk5ij2aMMHt4rHzYYNx9gxDF646FHK8D7n89XCB9zALvKB25?= =?us-ascii?q?Ntit88+Tks6c4Oq5SmSqW4YVdHX7i4Sau3ni6A=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BcAgCmm45ffSIeaIFgEwEBCAEBAQEJA?= =?us-ascii?q?RIBBQUBgg8CgSFSBkABXlYyLIQ9iQWLLIVEkWaBEQNQEAEDAQ0YAQwHAQIEAQG?= =?us-ascii?q?BVYIxRAKCBAIeBgEFMxMCEAEBBQEBAQIBAwMEARMBAQsUCIVkAQUCJQxDARABg?= =?us-ascii?q?WIMDAMDgyIDARYCAQgEBkAFAh4jAxQBBgMCEQEXARQKFwEJCRQGAYMMgnwFCpM?= =?us-ascii?q?ynAJ/M4Q+AQMFCwECDy4BhBSBQg0CE38XAYVRToMGgk+BHSYPgU0/EoMRSQdsg?= =?us-ascii?q?kUMCwEBAQEBAYEmARECAQgSDy2CYReCSASLaYQfBwsZBAYfA2uJPIk1giqOM4F?= =?us-ascii?q?aFE0rB4JtgQ8EC4ZkgQKLFGODDoMMgxaBKohjhUeOayGTFYF8hgp+CIFohguBd?= =?us-ascii?q?4kMhFaBQSqBCj8eDAczGjBDgjUBATIJYA2EdIc4gXwDF4ECAQcCSoFQKGqBAXm?= =?us-ascii?q?BJVA7hUQ/MwIBATQCBgEJAQEDCXUBAQUTCwGCMIodYAEB?= X-IPAS-Result: =?us-ascii?q?A0BcAgCmm45ffSIeaIFgEwEBCAEBAQEJARIBBQUBgg8CgSF?= =?us-ascii?q?SBkABXlYyLIQ9iQWLLIVEkWaBEQNQEAEDAQ0YAQwHAQIEAQGBVYIxRAKCBAIeB?= =?us-ascii?q?gEFMxMCEAEBBQEBAQIBAwMEARMBAQsUCIVkAQUCJQxDARABgWIMDAMDgyIDARY?= =?us-ascii?q?CAQgEBkAFAh4jAxQBBgMCEQEXARQKFwEJCRQGAYMMgnwFCpMynAJ/M4Q+AQMFC?= =?us-ascii?q?wECDy4BhBSBQg0CE38XAYVRToMGgk+BHSYPgU0/EoMRSQdsgkUMCwEBAQEBAYE?= =?us-ascii?q?mARECAQgSDy2CYReCSASLaYQfBwsZBAYfA2uJPIk1giqOM4FaFE0rB4JtgQ8EC?= =?us-ascii?q?4ZkgQKLFGODDoMMgxaBKohjhUeOayGTFYF8hgp+CIFohguBd4kMhFaBQSqBCj8?= =?us-ascii?q?eDAczGjBDgjUBATIJYA2EdIc4gXwDF4ECAQcCSoFQKGqBAXmBJVA7hUQ/MwIBA?= =?us-ascii?q?TQCBgEJAQEDCXUBAQUTCwGCMIodYAEB?= X-IronPort-AV: E=Sophos;i="5.77,396,1596492000"; d="scan'208,217";a="362259572" X-MGA-submission: =?us-ascii?q?MDFgoLBs82VW5V0WU606IPm07coOeCJOYUp4rF?= =?us-ascii?q?KNA0X3ojIt0JFbVVBpYKdAtX4G3asBt0A3DiU6OKjidMmfUp0RRd8y7Y?= =?us-ascii?q?8RnVHNestOrNFj4E+x+NWkXcx9hzg+s19UrB3bebo9bic+IXzPaXAZVi?= =?us-ascii?q?QtSgSEzc9nXxs6X2OeDjKgYg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Oct 2020 10:15:55 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5CA51561286; Tue, 20 Oct 2020 10:15:54 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 20 Oct 2020 10:15:54 +0200 Message-ID: <878sc12tz9.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 20 10:15:54 2020 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000688, queueID=A1877561288 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 13 to 20, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dialo is hiring frontend and backend OCaml developers (Remote) Progress 0.1.0 Brr 0.0.1, a toolkit for programming browsers New release of Conduit Easy cross compilation using esy OCaml User Survey 2020 Old CWN Dialo is hiring frontend and backend OCaml developers (Remote) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Wojtek Czekalski announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 [Dialo] is an early stage company with an experienced founding team. Assembling a team that consists of the best and brightest is our top priority. In the immediate term we are building a visual programming language for conversational AI. Our long term vision is that personalized contact we are enabling will cause deeper relationships between users and businesses and turn all interactions into a unified long term customer journey. The work is quite demanding when it comes to both ideation and implementation. We are aiming to provide a room for growth both technically and/or as a leader. For current open source maintainers we are willing to sponsor your work on OSS for 20% of time. We use OCaml for frontend and backend (along with Python for machine learning, natural language processing). We are hiring people for different positions. Both people with extensive experience and newcomers are encouraged to apply. We try to find the sharpest people rather than checking boxes with particular skills. The official job posting: We are also hiring for two other (related) positions: =E2=80=A2 =E2=80=A2 [Dialo] Progress 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Craig Ferguson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the first release of [`Progress'], now available on Opam. `Progress' is a small library for quickly defining and using progress bars in OCaml programs. It aims to provide the following: =E2=80=A2 support for rendering multiple progress bars simultaneously; =E2=80=A2 responds dynamically to changes in terminal size; =E2=80=A2 allows user-defined progress bar layouts. [`Progress'] Defining your own progress bars =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The example animation above uses a pre-provided progress bar layout that should meet many needs ([`Progress_unix.counter']), but it's fairly easy to re-define it ourselves using the low-level [`Progress.Segment'] API: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let counter filename =3D =E2=94=82 let proportion i =3D Int64.to_float i /. 1_000_000. in =E2=94=82 let open Progress in =E2=94=82 Segment.( =E2=94=82 list =E2=94=82 [ =E2=94=82 const filename; =E2=94=82 Units.bytes of_pp; =E2=94=82 Progress_unix.stopwatch (); =E2=94=82 bar ~mode:`ASCII proportion; =E2=94=82 using proportion (Units.percentage of_pp); =E2=94=82 ] =E2=94=82 |> box_winsize ~fallback:80 (* Dynamically scale to window= size *) =E2=94=82 |> periodic 100 (* Re-render once every 100 up= dates *) =E2=94=82 |> accumulator Int64.add 0L (* Accumulate progress updates= *)) =E2=94=82 |> make ~init:0L =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The `Segment' combinators are similar to those of general-purpose pretty-printing libraries (e.g. [`pp'] and [`fmt']), but are equipped with extra logic for "stateful" segments and segments that can have dynamic width. Together, these make for a convenient way to express common patterns when pretty-printing progress bars. For instance, the stateful segment `periodic' seen above can be used to ensure that very frequent updates from a hot-loop do not result in too much time spent re-rendering the output. The library is not yet feature-complete, but should still be reasonably useful :slightly_smiling_face: Happy hacking! [`Progress_unix.counter'] [`Progress.Segment'] [`pp'] [`fmt'] Brr 0.0.1, a toolkit for programming browsers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce the first release of Brr. The TL; DR is: If you are looking for a productive way to program browsers with js_of_ocaml but without ppx and ghost OCaml objects, give Brr a try. The details: Brr is a toolkit for programming browsers in OCaml with the [`js_of_ocaml'] compiler. It provides: =E2=80=A2 Interfaces to a [selection] of browser APIs. =E2=80=A2 Note based reactive support (optional and experimental). =E2=80=A2 An [OCaml console] developer tool for live interaction with programs running in web pages. =E2=80=A2 A JavaScript FFI for idiomatic OCaml programming. Brr is distributed under the ISC license. It depends on [Note] and on the `js_of_ocaml' compiler and runtime =E2=80=93 but not on its libraries or syntax extension. =E2=80=A2 Homepage: =E2=80=A2 API Docs & manuals: or `odig doc brr' =E2=80=A2 Install: `opam install brr' Brr is essentially what I need to be productive for browser programming with js_of_ocaml: an obvious FFI with JavaScript objects as abstract data types without OCaml object phantom types and binding documentation precisely linking into MDN. The OCaml console is the hack on the cake. In the past I often found it frustrating to have OCaml programs running in my webpages and be greeted with a JavaScript prompt in the browser dev tools. Quite a bit of polishing could be done on that though. Some of which should likely directly be done upstream in the toplevel machinery (e.g. identifier completion, a better toploop API and support for easy pretty printer installation). It would also be nice if we could cut down on `js_of_ocaml''s toplevel compilation times ;=E2=80=93) Parts of Brr have been seriously dogfooded in the past but that new incarnation is largely untested for now and certain APIs might need adjustements. Early adopters should study actual binding coverage, expect glitches and little breakages in the future. The Note reactive functionality was also seriously used in the past but Note itself needs a new design round and I don't have the ressources to do it right now, expect breakage, don't pay too much attention to it for now. My thanks to the `js_of_ocaml' developers for the nice ocaml to javascript compiler and a special shootout to Hugo Heuzard for not getting mad at me when pinging him directly for questions. Happy browser compatibility bug hunting, [`js_of_ocaml'] [selection] [OCaml console] [Note] gasche asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 It's not really released, but I'm curious about [Note] now: this is a new FRP library from you, the author of [React] (the FRP library for OCaml, not the Javascript framework of the same name). Would you say a few words on why you went for a different library? My guess would be that React depends on runtime mechanisms (weak pointers) that are not well-supported in Javascript-lang; but even if the guess is right, I'm not sure what would be the impact on the API or properties of the library. [Note] [React] Daniel B=C3=BCnzli replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Would you say a few words on why you went for a different library? `Note' is the result from seeing people (and myself) struggling to use ~React~/FRP "correctly" over the years. Some of this, I largely attribute to ergonomic problems with the API. It's my hope for `Note' to address most of these points (one thing that still needs to be done is replace fix points by a simple lazy infinitesimal delay combinator). I don't think I could have made all these changes in `React' itself so I found it better to start a new library. Also I lost the trademark on the name :=E2=80=93) `Note' also tries to provide a much simpler implementation. `React''s implementation was based on the [FrTime Phd thesis]. It's quite subtle and involved and, as you suggested, uses weak pointer. `Note' tries to avoid them since those are not available in the browser (but you have things like [MutationObservers] which I use as gc in Brr's Note-based [reactive dom support]). However not using weak pointers has a semantic uncleanness cost whose impact I'm unsure yet =E2=80=93 without discipline from the programmer it= may lead to subtle and hard to track bugs when the reactive graph changes dynamically, which I'm a bit wary of. When my brain dumped `Note' I wrote a few more technical points in the readme you can read them [here]. [FrTime Phd thesis] [MutationObservers] [reactive dom support] [here] New release of Conduit =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 *Conduit 3.0.0* Hello everyone, We're glad to announce the new release of [`conduit'], a framework that allows to _abstract_ over transfer protocols. One of its main advantages is allowing the implemententation of _free-dependencies_ protocols. [`conduit'] Introduction =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C There are several ways to abstract over an implementation in OCaml. However, those solutions are often lost deep in the stack of protocols and allowing the user to choose the implementations of the sub-procotols implies growing complexity as we move up through the stack. (For example, allowing to abstract over the implementation of the TLS protocol from the implementation of the HTTP protocol) One of those solutions, the _functors_, can rapidly become a hellish nightmare for the end-user. This is especially true in the case of MirageOS, which literally wants to abstract over everything! This is why Conduit was implemented: it aims to provide to the user a cleaner abstraction mechanism which would allow the protocol developers to get rid of most of the responsibilities concerning the choice of sub-protocols (Like which TLS implementation use between OpenSSL or our great [ocaml-tls] library), while giving the end-users an easy way to compose the protocols of their choice and inject them in the stack via conduit. [ocaml-tls] Usage of Conduit =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Such a framework allows us to separate the logic of a protocol from underlying implementation needed to communicate with a peer. The distribution of Conduit comes with [a simple tutorial] which explains step by step how to implement a _ping-pong_ client & server and, most importantly, how to upgrade them with TLS. With Conduit, we ensure the compatibility with MirageOS (and specially [mirage-tcpip]) while being useful for others. Of course, Conduit is not mandatory to ensure this compatibility, but it helps us for _higher_ libraries such as [ocaml-git]/[Irmin] or [Cohttp]. [a simple tutorial] [mirage-tcpip] [ocaml-git] [Irmin] [Cohttp] Specific improvements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Abstract and destruct it! The most requested feature on the new version of Conduit is the ability to _destruct_ the [Conduit.flow][conduit-flow]. The ability to abstract the protocol comes with the _abstract_ type `Conduit.flow'. The new version permits to _destruct_ it to a well-known value (such as an UNIX socket): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let handler flow =3D match flow with =E2=94=82 | Conduit_lwt.TCP.T (Value file_descr) -> =E2=94=82 let peer =3D Lwt_unix.getpeername file_descr in =E2=94=82 ... =E2=94=82 | flow -> ... (* other kind of protocol *) =E2=94=82=20 =E2=94=82 let run =3D =E2=94=82 Cohttp_lwt_unix.serve ~handler =E2=94=82 { sockaddr=3D Unix.inet_addr_loopback } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=97=8A The dispatch of the protocol The second most interesting feature of Conduit is the full control over the dispatch between protocols by the end-user. From a concrete information such as an `Uri.t', the end-user is able to describe how Conduit should choose the protocol (and with which value it should try to initiate the connection): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let my_tls_config =3D Tls.Config.client ... =E2=94=82=20 =E2=94=82 let connect uri =3D =E2=94=82 let edn =3D Conduit.Endpoint.of_string =E2=94=82 (Uri.host_with_default ~default:"localhost" uri) in =E2=94=82 let resolvers =3D match Uri.scheme uri with =E2=94=82 | Some "https" -> =E2=94=82 let port =3D Option.value ~default:443 (Uri.port uri) in =E2=94=82 Conduit_lwt.add =E2=94=82 Conduit_lwt_tls.TCP.protocol =E2=94=82 (Conduit_lwt_tls.TCP.resolve ~port ~config:my_tls_config) =E2=94=82 Conduit.empty =E2=94=82 | Some "http" | None -> =E2=94=82 let port =3D Option.value ~default:80 (Uri.port uri) in =E2=94=82 Conduit_lwt.add =E2=94=82 Conduit_lwt.TCP.protocol =E2=94=82 (Conduit_lwt.TCP.resolve ~port) =E2=94=82 Conduit.empty in =E2=94=82 Conduit_lwt.resolve ~resolvers edn >>=3D fun flow -> =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=97=8A An explicit way to launch a server Conduit comes with a new API for the server-side, where everything becomes explicit: no dispatch, no hidden choice. It proposes now a simple function to start the usual server loop: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let run handler =3D =E2=94=82 Conduit_lwt.serve ~handler =E2=94=82 Conduit_lwt.TCP.service =E2=94=82 { Conduit_lwt.TCP.sockaddr=3D Unix.(ADDR_INET (inet_addr_lo= opback, 8080) =E2=94=82 ; capacity=3D 40 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Reverse-dependencies =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C Conduit is used by many libraries (~150 packages) and we spend 2 months to track this breaking-change. Currently, it's mostly about [Cohttp] and [Irmin] and both have a PR according the new version of Conduit. These packages will be released as soon as we can with the new version of Conduit. [Cohttp] [Irmin] Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Conduit is a piece required by many libraries but nobody really uses it. This new version wants to replace and redefine more concretely what Conduit is. The update is [huge] for us but small for people where we tried to keep the same global idea of the abstraction. I would like to thank many people (MirageOS core team, Cohttp peoples, some not so famous guys of the Reason/OCaml eco-system) who followed us on this deep development (and tried and iterated on our version). It does not change too much our world, but it paves the way for a better MirageOS/OCaml eco-system. As a french guy, I just would like to say: Conduit est mort, Vive Conduit! [huge] Easy cross compilation using esy =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: EduardoRFS announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 I've been working on this for a couple of months now, and now it is ready for an initial announcement of my tools to cross compiling OCaml and ReasonML Native. What it can do =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Out of box it can cross compile most dune and topkg, packages available on opam for a couple of platforms, there is also patches for popular packages. You can also compile opam packages by making an wrapper, like Limitations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C Your package should build with OCaml 4.10, and all the packages that are built for the `host' will also be build for the `target', so sometimes you need to fix a package that you will not use directly. Some packages you will need to pin to a `dune-universe' fork version How to use it =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ## compile your project =E2=94=82 esy =E2=94=82=20 =E2=94=82 ## generate the wrapper =E2=94=82 esy add -D generate@EduardoRFS/reason-mobile:generate.json =E2=94=82 esy generate android.arm64 =E2=94=82=20 =E2=94=82 ## build for android.arm64 =E2=94=82 esy @android.arm64 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Platforms =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C All of the following are tested from Linux and macOS, but I would suppose that FreeBSD should be also working as a build system. =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 Targets=20=20=20=20=20=20=20=20=20=20=20=20=20=20 =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 android.arm64=20=20=20=20=20=20=20=20 android.x86_64=20=20=20=20=20=20=20 ios.arm64=20=20=20=20=20=20=20=20=20=20=20=20 ios.simulator.x86_64=20 linux.musl.arm64=20=20=20=20=20 linux.musl.x86_64=20=20=20=20 =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 What I tested =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In the past I was able to build `Revery' the UI framework for `Android' and `iOS' But recently I did compile `esy' the package manager itself for all of the following platforms above from an `Arch Linux x86_64' and `macOS Catalina x86_64'. Including `iOS', with the right version of OCaml it will run inside of the new `macOS ARM64' and inside of a jailbroken iPhone. OCaml User Survey 2020 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to announce the [OCaml User Survey 2020]. We are trying to get a better picture of the OCaml community and its needs. It would be very useful if you could fill the survey (10-15 minutes), and share it widely with other OCaml programmers! The survey is run by the [OCaml Software Foundation]. Thanks in particular to our sponsors OCamlPro (@MuSSF) for preparing many of the questions, Jane Street (@Yaron_Minsky) for excellent feedback, and to Kim @K_N Nguy=E1=BB=85n for his technical help. This is our first year running the survey, we hope to continue in following years. There are many things to improve; please feel free to give us feedback! (There is a feedback question at the end of the survey, or you can post here, or send me a message/email.) The survey was inspired by programming-language surveys ran by other communities. See for example past survey results for [Go], [Haskell], [Rust], and [Scala]. [OCaml User Survey 2020] [OCaml Software Foundation] [Go] [Haskell] [Rust] [Scala] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 13 to 20, 202= 0.

Dialo is hiring frontend and backend OCaml developers (Remote)=

Wojtek Czekalski announced

Dialo is an early stage company with an ex= perienced founding team. Assembling a team that consists of the best and brightest is our top priority. In the im= mediate term we are building a visual programming language for conversational AI. Our long term vision i= s that personalized contact we are enabling will cause deeper relationships between users and businesse= s and turn all interactions into a unified long term customer journey.

The work is quite demanding when it comes to both ideation and implementati= on. We are aiming to provide a room for growth both technically and/or as a leader. For current open sou= rce maintainers we are willing to sponsor your work on OSS for 20% of time.

We use OCaml for frontend and backend (along with Python for machine learni= ng, natural language processing). We are hiring people for different positions. Both people with= extensive experience and newcomers are encouraged to apply. We try to find the sharpest people rathe= r than checking boxes with particular skills.

The official job posting: ht= tps://dialo.recruitee.com/o/software-developer-ocamlreason We are also hiring for two other (related) positions:

Progress 0.1.0

Craig Ferguson announced

I'm pleased to announce the first release of Progress, now available on Opam.

Progress is a small library for quickly defining and using pro= gress bars in OCaml programs. It aims to provide the following:

  • support for rendering multiple progress bars simultaneously;
  • responds dynamically to changes in terminal size;
  • allows user-defined progress bar layouts.

Defining your own progress bars

The example animation above uses a pre-provided progress bar layout that sh= ould meet many needs (Progress_unix.counter), but it's fairly easy to re-define it ourselves using the low-level Progress.Segment API:

let counter filename =3D
  let proportion i =3D Int64.to_float i /. 1_000_0=
00. in
  let open Progress in
  Segment.(
    list
      [
        const filename;
        Units.bytes of_pp;
        Progress_unix.stopwatch ();
        bar ~mode:`ASCII proportion;
        using proportion (Units.perc=
entage of_pp);
      ]
    |> box_winsize ~fallback:80  (* <=
/span>Dynamically scale to window size *)
    |> periodic 100              =
(* R=
e-render once every 100 updates *)
    |> accumulator Int64.add 0L  (* <=
/span>Accumulate progress updates *))
  |> make ~init:0L

The Segment combinators are similar to those of general-purpos= e pretty-printing libraries (e.g. pp and fmt), but are equipped with extra logic for "stateful" segments and segments that can hav= e dynamic width. Together, these make for a convenient way to express common patterns when pretty-prin= ting progress bars. For instance, the stateful segment periodic seen above can be used= to ensure that very frequent updates from a hot-loop do not result in too much time spent re-rendering the outpu= t.

The library is not yet feature-complete, but should still be reasonably use= ful :slightly_smiling_face: Happy hacking!

Brr 0.0.1, a toolkit for programming browsers

Daniel B=C3=BCnzli announced

I'd like to announce the first release of Brr.

The TL; DR is:

If you are looking for a productive way to program browsers with js_of_ocam= l but without ppx and ghost OCaml objects, give Brr a try.

The details:

Brr is a toolkit for programming browsers in OCaml with the js_of_ocaml compiler. It prov= ides:

  • Interfaces to a selection of browser APIs.
  • Note based reactive support (optional and experimental).
  • An OCaml console developer tool for live interaction with programs runnin= g in web pages.
  • A JavaScript FFI for idiomatic OCaml programming.

Brr is distributed under the ISC license. It depends on Note and on the js_of_ocaml compiler and runtime =E2=80=93 but not on its libraries or syntax extension.

Brr is essentially what I need to be productive for browser programming wit= h js_of_ocaml: an obvious FFI with JavaScript objects as abstract data types without OCaml object pha= ntom types and binding documentation precisely linking into MDN.

The OCaml console is the hack on the cake. In the past I often found it fru= strating to have OCaml programs running in my webpages and be greeted with a JavaScript prompt in= the browser dev tools. Quite a bit of polishing could be done on that though. Some of which shoul= d likely directly be done upstream in the toplevel machinery (e.g. identifier completion, a better t= oploop API and support for easy pretty printer installation). It would also be nice if we could cut do= wn on js_of_ocaml's toplevel compilation times ;–)

Parts of Brr have been seriously dogfooded in the past but that new incarna= tion is largely untested for now and certain APIs might need adjustements. Early adopters should study a= ctual binding coverage, expect glitches and little breakages in the future.

The Note reactive functionality was also seriously used in the past but Not= e itself needs a new design round and I don't have the ressources to do it right now, expect breakage, = don't pay too much attention to it for now.

My thanks to the js_of_ocaml developers for the nice ocaml to = javascript compiler and a special shootout to Hugo Heuzard for not getting mad at me when pinging him directl= y for questions.

Happy browser compatibility bug hunting,

gasche asked

It's not really released, but I'm curious about Note now: this is a new FRP library from you, the author of React (the FRP library for OCaml, not the Javascript framework of the same name).

Would you say a few words on why you went for a different library? My guess= would be that React depends on runtime mechanisms (weak pointers) that are not well-supported in Javasc= ript-lang; but even if the guess is right, I'm not sure what would be the impact on the API or propert= ies of the library.

Daniel B=C3=BCnzli replied

Would you say a few words on why you went for a different library?

Note is the result from seeing people (and myself) struggling = to use ~React~/FRP "correctly" over the years.

Some of this, I largely attribute to ergonomic problems with the API. It's = my hope for Note to address most of these points (one thing that still needs to be done is repl= ace fix points by a simple lazy infinitesimal delay combinator).

I don't think I could have made all these changes in React its= elf so I found it better to start a new library. Also I lost the trademark on the name :–)

Note also tries to provide a much simpler implementation. React's implementation was based on the FrTime Phd thesi= s. It's quite subtle and involved and, as you suggested, uses weak pointer. Note tries to avoid = them since those are not available in the browser (but you have things like MutationObservers which I use as gc in Brr's Note-based reactive dom support).

However not using weak pointers has a semantic uncleanness cost whose impac= t I'm unsure yet =E2=80=93 without discipline from the programmer it may lead to subtle and hard to track bugs= when the reactive graph changes dynamically, which I'm a bit wary of.

When my brain dumped Note I wrote a few more technical points = in the readme you can read them here.

New release of Conduit

Calascibetta Romain announced

Conduit 3.0.0

Hello everyone,

We're glad to announce the new release of conduit, a framework that allows to abstract over transfer protocols. One of its main advantages is allowing the implem= ententation of free-dependencies protocols.

Introduction

There are several ways to abstract over an implementation in OCaml. However= , those solutions are often lost deep in the stack of protocols and allowing the user to choose the imp= lementations of the sub-procotols implies growing complexity as we move up through the stack. (= For example, allowing to abstract over the implementation of the TLS protocol from the implementatio= n of the HTTP protocol)

One of those solutions, the functors, can = rapidly become a hellish nightmare for the end-user. This is especially true in the case of MirageOS, which literally wants to abstra= ct over everything!

This is why Conduit was implemented: it aims to provide to the user a clean= er abstraction mechanism which would allow the protocol developers to get rid of most of the respons= ibilities concerning the choice of sub-protocols (Like which TLS implementation use between OpenSSL = or our great ocaml-tls library), wh= ile giving the end-users an easy way to compose the protocols of their choice and inject them in the stack via conduit.

Usage of Conduit

Such a framework allows us to separate the logic of a protocol from underly= ing implementation needed to communicate with a peer. The distribution of Conduit comes with a simple tutoria= l which explains step by step how to implement a ping-pon= g client & server and, most importantly, how to upgrade them with TLS.

With Conduit, we ensure the compatibility with MirageOS (and specially mirage-tcpip) while being useful for others. Of course, Conduit is not mandatory to ensur= e this compatibility, but it helps us for higher libraries such as ocaml-git/Irmin or Cohttp.

Specific improvements

  • Abstract and destruct it!

    The most requested feature on the new version of Conduit is the ability to = destruct the [Conduit.flow][conduit-flow]. The ability to abstract the protocol comes wi= th the abstract type Conduit.flow. The new version permits to destruct it to a well-known value (such as an UNIX socket):

    let handler flow =3D match<=
    /span> flow with
      | Conduit_lwt.TCP.T (Value file_descr) ->
        let peer =3D Lwt_=
    unix.getpeername file_descr in
        ...
      | flow -> ... (* other kind of protocol *)
    
    let run =3D
      Cohttp_lwt_unix.serve ~handler
        { sockaddr=3D Unix.inet_addr_loo=
    pback }
    
  • The dispatch of the protocol

    The second most interesting feature of Conduit is the full control over the= dispatch between protocols by the end-user. From a concrete information such as an Uri.t,= the end-user is able to describe how Conduit should choose the protocol (and with which value it should try to i= nitiate the connection):

    let my_tls_config =3D Tls.Config.client ...
    
    let connect uri =3D
      let edn =3D Conduit=
    .Endpoint.of_string
        (Uri.host_with_default ~default:"loc=
    alhost" uri) in
      let resolvers =3D m=
    atch Uri.scheme uri with
        | Some "https" ->
          let port =3D Op=
    tion.value ~default:443 (Uri.port uri) in
          Conduit_lwt.add
            Conduit_lwt_tls.TCP.protocol
            (Conduit_lwt_tls.TCP.resolve=
     ~port ~config:my_tls_config)
            Conduit.empty
        | Some "http" | None ->
          let port =3D Op=
    tion.value ~default:80 (Uri.port uri) in
          Conduit_lwt.add
            Conduit_lwt.TCP.protocol
            (Conduit_lwt.TCP.resolve ~po=
    rt)
            Conduit.empty in
      Conduit_lwt.resolve ~resolvers edn=
     >>=3D fun flow ->
      ...
    
  • An explicit way to launch a server

    Conduit comes with a new API for the server-side, where everything becomes = explicit: no dispatch, no hidden choice. It proposes now a simple function to start the usual server = loop:

    let run handler =3D
      Conduit_lwt.serve ~handler
        Conduit_lwt.TCP.service
        { Conduit_lwt.TCP.sockaddr=3D Unix.(ADDR_INET (inet_addr_loopback, 8080)
        ; capacity=3D 40 }
    

Reverse-dependencies

Conduit is used by many libraries (~150 packages) and we spend 2 months to = track this breaking-change. Currently, it's mostly about Cohttp and Irmin a= nd both have a PR according the new version of Conduit. These packages will be released as soon as we can with = the new version of Conduit.

Conclusion

Conduit is a piece required by many libraries but nobody really uses it. Th= is new version wants to replace and redefine more concretely what Conduit is. The update is huge for us but s= mall for people where we tried to keep the same global idea of the abstraction.

I would like to thank many people (MirageOS core team, Cohttp peoples, some= not so famous guys of the Reason/OCaml eco-system) who followed us on this deep development (and trie= d and iterated on our version). It does not change too much our world, but it paves the way for a= better MirageOS/OCaml eco-system.

As a french guy, I just would like to say: Conduit est mort, Vive Conduit!

Easy cross compilation using esy

EduardoRFS announced

I've been working on this for a couple of months now, and now it is ready f= or an initial announcement of my tools to cross compiling OCaml and ReasonML Native.

https://github.com/= EduardoRFS/reason-mobile

What it can do

Out of box it can cross compile most dune and topkg, packages available on = opam for a couple of platforms, there is also patches for popular packages.

You can also compile opam packages by making an wrapper, like

https://g= ithub.com/mirage/mirage-crypto/pull/84/files

Limitations

Your package should build with OCaml 4.10, and all the packages that are bu= ilt for the host will also be build for the target, so sometimes you need to fix a packag= e that you will not use directly.

Some packages you will need to pin to a dune-universe fork ver= sion

How to use it

## compile your project
esy

## g=
enerate the wrapper
esy add -D generate@EduardoRFS/reason-mobile:generate.json
esy generate android.arm64

## b=
uild for android.arm64
esy @android.arm64

Platforms

All of the following are tested from Linux and macOS, but I would suppose t= hat FreeBSD should be also working as a build system.

Targets
android.arm64
android.x86_64
ios.arm64
ios.simulator.x86_64
linux.musl.arm64
linux.musl.x86_64

What I tested

In the past I was able to build Revery the UI framework for Android and iOS

But recently I did compile esy the package manager itself for = all of the following platforms above from an Arch Linux x86_64 and macOS Catalina x86_64. Including iOS, with the right version of OCaml it will run inside of the new macOS ARM64 and inside of = a jailbroken iPhone.

OCaml User Survey 2020

gasche announced

We are happy to announce the OCaml User Survey 2020. We are trying to get a better picture of the OCaml community and its needs. It would be very useful if you could fill th= e survey (10-15 minutes), and share it widely with other OCaml programmers!

The survey is run by the OCaml Software F= oundation. Thanks in particular to our sponsors OCamlPro (@MuSSF) for preparing many of the questions, Jane St= reet (@Yaron_Minsky) for excellent feedback, and to Kim @K_N Nguy=E1=BB=85n for his technical help.

This is our first year running the survey, we hope to continue in following= years. There are many things to improve; please feel free to give us feedback! (There is a feedba= ck question at the end of the survey, or you can post here, or send me a message/email.)

The survey was inspired by programming-language surveys ran by other commun= ities. See for example past survey results for G= o, Haskell, Rust, and Scala.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id E3058E020B for ; Tue, 27 Oct 2020 09:44:42 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=3Ij9=EC=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3AtrF3UhZuoQzvGtWYZfC8hNv/LSx+4OfEezUN459i?= =?us-ascii?q?sYplN5qZps++Yh7h7PlgxGXEQZ/co6odzbaP7OawCSdZuMbJmUtBWaQEbwUCh8?= =?us-ascii?q?QSkl5oK+++Imq/EsTXaTcnFt9JTl5v8iLzG0FUHMHjew+a+SXqvnYdFRrlKAV6?= =?us-ascii?q?OPn+FJLMgMSrzeCy/IDYbxlViDanbr5+MRe7oR/Su8QVjoduN7s9xxjUqXZUZu?= =?us-ascii?q?pawn9lK0iOlBjm/Mew+5Bj8yVUu/0/8sNLTLv3caclQ7FGFToqK2866tHluhnF?= =?us-ascii?q?VguP+2ATUn4KnRpSAgjK9w/1U5HsuSbnrOV92S2aPcrrTbAoXDmp8qlmRAP0hC?= =?us-ascii?q?oBKjU293zZitFrjKJDvh2uuwB/zYDTYIGQLvV+f6Xdds4eSWdOWstdUipMDoO/?= =?us-ascii?q?YYsJEeoBPP1Yr4jmqFsKsxS1GAetBOT1yjBVnX/9wKk23uo9HQ3D2gErAtAAv2?= =?us-ascii?q?nOrNjtNKkcT/27wqfLwzrMc/xbwi3y5JTSfx07vf2AQbB9fMzMwkcvDQPFiVCQ?= =?us-ascii?q?pJT5MjORzOsNtXWQ4fd8WuKvjm4nqh1xoiSyzcorkIbJgpgaylbe+SVi3Ik1Jd?= =?us-ascii?q?i4SE9nYd64C5ZQryaaN492Q8M+XW5npCY6yrsHuZ6iYSgF1o4rxxnFa/yIaoWF?= =?us-ascii?q?5A/oW+mNLzlinn1lZK6/iAio8Uim0uDxWde53VJJoydYltTBuHAD2hjT58WJVv?= =?us-ascii?q?dw/kev1CqA2g3d5OxJIkM5mLTGJ5M/w7M9lJUevEDHEyH5lkv7gq+Ye0M58eam?= =?us-ascii?q?7OTnZ6/ppp6aN4JskgHxLLgums2jAesmKggOWG2b+eGi27H5+032XqlKguUxkq?= =?us-ascii?q?bFqp/aIMAbqrS+Aw9P3YYv8xm/Dza60NQYgHkIN0hJdw6Aj4jsI13OOu73Au2i?= =?us-ascii?q?jFSwkDdk2e3JPrr9DZXWNHTDkbDhca5y605d1Aozzc1f6IlOBrEAJ/L/Qk7xtN?= =?us-ascii?q?rCDh84KQO42ejnCM9l2oMZRW2AGKqZMKfKsV+S4eIjOfWDZIgQuDrlMPgl4OPu?= =?us-ascii?q?jWUlllADc6mp2oEXaH+mEfh8JUWWf2bsjs8fHmcQpAoxVvDqiFybUT5OeXm+Rb?= =?us-ascii?q?4z5jEjBIKnEIjCRoStgLib0Ce8BJ1WaWZLAU2PH3fwb4iIRukAZSaILsN8jjAJ?= =?us-ascii?q?WqKtRoE92R20ugL3xKJrIvfa9yAbr57u0Nl46/fcmBwx7zB4EsuQ33yLQmpphG?= =?us-ascii?q?0HXSU207p6oUFlyleMz6x4g/tAGNxW6PJFTx02NYbbz+x+C9HyRhzOccuJSFag?= =?us-ascii?q?Q9WmGCwxQcwrz98JeUZ9FM2ujhHF3yW0H78Yj6GHCIIw/67GwnT9O8lwx2zI2a?= =?us-ascii?q?U9lVUrTMRCOXWjhqFl9gjTA4DJk1+el6avbakSwTLD+nqfwWeWskxWUwxwXKHd?= =?us-ascii?q?UH4QeEbbtcz55kTGT76uFbQoLBdOyc6EKqtLc93pkEtJSO3kONTEbGK8g32/BR?= =?us-ascii?q?KSybOKdobqYHkS3CXYCEgFjwAT4W2LOhM5Bie8pWLRECJhFUn1b0Pp/uR/p2m3?= =?us-ascii?q?TkguzwGFd0Fhzaa6+gYJhfyATPMexq4Ltz0kqzVwBVq929PWC8Gcpwd6Z6VdYd?= =?us-ascii?q?Y94E9d2m7Dtgx9OIagL6F4iVIEfQR3pRCm6xIiQIFfl4Ji+Hc1yiJ2NqTe1l5d?= =?us-ascii?q?IXfQl5vvPPefYj354xaHb6/NxkqY0dqH/qNJ7+43/RGrtwisEg8m8m57+9hTyX?= =?us-ascii?q?qVoJvQSEIZVpfpekI27ARh4bbAaCgh7ofa0m0qPLTnnCXF3ocAAOIjgi2rf9Je?= =?us-ascii?q?LL/MQAb2GstcHMOuLe02h3CxaRYVIO1Z9Kg1Jt6rMfyc1/j4b65bgDu6gDEfs8?= =?us-ascii?q?hG2UWW+n8jG7eVjaZA+OmR2068bxm5jFqltZqsy4VUPHcKGW6u1SXvBIhQf7B/?= =?us-ascii?q?O4ERBjX3epHl9pBFn5foHkVg2hu7HVpfiZ2xfh6Dc1H23QtRzFka53u9lnnhlm?= =?us-ascii?q?0mo3QStqOamRf27aHnfRsDNHRMQTA9313rPI6/gstcWRS4KQ8zm0n86A=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AkAwCw3ZdffSIeaIFgAR0BAQsSDIIRg?= =?us-ascii?q?SFSBkABXlYyLIQ8iQWLIIVEkWaBEQNQEAEDAQ0YAQ4FAQIEAQGBVYJ1AheBdQI?= =?us-ascii?q?eBgEFMxMCEAEBBQEBAQIBAwMEARMBAQsUCIYRDEMBEAGBYgwMAwODJQEYCQQGP?= =?us-ascii?q?gIlIwMUAQYDAgQNARcBFAoXARIaAoI/FTeCfAUKiiCcBX8zhD4BAwIOAwEOCSa?= =?us-ascii?q?BIoJagUINAhN/FwGFUU6BDoF4BoQND4FNP4ERgmJsgkUMCwEBAQEBARWBEQERA?= =?us-ascii?q?gEGFA8tgmEXgkgEkBELGQQlii6JN4IqkG4rB4JugRAEC4ZlgQKLF4N1gwyDF4E?= =?us-ascii?q?qhDGYbCGTHoF9hgt+CIFohgyLCIRXgUEqgQpwMxowQ4I1ATMJYA2RaCiBPoEmg?= =?us-ascii?q?XU7hRQtAkAzAgEBBy0CBgEJAQEDCXUBAQUTCwGCMIohXAEB?= X-IPAS-Result: =?us-ascii?q?A0AkAwCw3ZdffSIeaIFgAR0BAQsSDIIRgSFSBkABXlYyLIQ?= =?us-ascii?q?8iQWLIIVEkWaBEQNQEAEDAQ0YAQ4FAQIEAQGBVYJ1AheBdQIeBgEFMxMCEAEBB?= =?us-ascii?q?QEBAQIBAwMEARMBAQsUCIYRDEMBEAGBYgwMAwODJQEYCQQGPgIlIwMUAQYDAgQ?= =?us-ascii?q?NARcBFAoXARIaAoI/FTeCfAUKiiCcBX8zhD4BAwIOAwEOCSaBIoJagUINAhN/F?= =?us-ascii?q?wGFUU6BDoF4BoQND4FNP4ERgmJsgkUMCwEBAQEBARWBEQERAgEGFA8tgmEXgkg?= =?us-ascii?q?EkBELGQQlii6JN4IqkG4rB4JugRAEC4ZlgQKLF4N1gwyDF4EqhDGYbCGTHoF9h?= =?us-ascii?q?gt+CIFohgyLCIRXgUEqgQpwMxowQ4I1ATMJYA2RaCiBPoEmgXU7hRQtAkAzAgE?= =?us-ascii?q?BBy0CBgEJAQEDCXUBAQUTCwGCMIohXAEB?= X-IronPort-AV: E=Sophos;i="5.77,423,1596492000"; d="scan'208,217";a="362850419" X-MGA-submission: =?us-ascii?q?MDGCgCHXQbBg2If+LuX8Rfk0u2uHUjFvVe4Re3?= =?us-ascii?q?abSsQWWiDhY7zXur64IOVO4IUJuvaMR6azqTEV1VSTjOoTrZe2pH1oJI?= =?us-ascii?q?4sGwa0ut8pS/BJKS6k+UbIA/SYDnv/dNmdtgY9rH2wR+17p4uyWB9tgE?= =?us-ascii?q?Cm1bpnoqCbMDdDunuiae2XDw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Oct 2020 09:43:52 +0100 Received: from set (eduroam-141b.sophia.inria.fr [138.96.48.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5369D561236; Tue, 27 Oct 2020 09:43:51 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 27 Oct 2020 09:43:50 +0100 Message-ID: <87wnzchxdl.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 27 09:43:52 2020 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.018736, queueID=CCE7F56123D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAyMCB0byAyNywNCjIwMjAuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KQmlzZWN0 X3BweCwgdGhlIGNvdmVyYWdlIHRvb2wsIG5vdyBoYXMgZXhjZWxsZW50IGludGVncmF0aW9uIHdp dGggRHVuZQ0KSnNfb2Zfb2NhbWwgaW4gdGhlIFZTQ29kZSBPQ2FtbCBQbGF0Zm9ybQ0KVHJhaW5p bmcgU2Vzc2lvbnMgZm9yICJGYXN0IFRyYWNrIHRvIE9DYW1sIiBhbmQgIkV4cGVydCBPQ2FtbCIg aW4gUGFyaXMgKDIzLTI2IE5vdmVtYmVyIDIwMjApDQpTZXQgdXAgT0NhbWwgMS4xLjINClNldCB1 cCBPQ2FtbCAxLjEuMw0KRmlyc3QgcmVsZWFzZSBvZiBGU01MDQpRcmMgMC4xLjAsIGEgUVIgY29k ZSBlbmNvZGVyDQpjdW11bHVzIDAuMC4xDQpCcnIgMC4wLjEsIGEgdG9vbGtpdCBmb3IgcHJvZ3Jh bW1pbmcgYnJvd3NlcnMNCk9sZCBDV04NCg0KDQpCaXNlY3RfcHB4LCB0aGUgY292ZXJhZ2UgdG9v bCwgbm93IGhhcyBleGNlbGxlbnQgaW50ZWdyYXRpb24gd2l0aCBEdW5lDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Jpc2VjdC1wcHgtdGhlLWNvdmVyYWdlLXRvb2wtbm93LWhhcy1leGNl bGxlbnQtaW50ZWdyYXRpb24td2l0aC1kdW5lLzY2MzQvMT4NCg0KDQpBbnRvbiBCYWNoaW4gYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBbKkJpc2VjdF9wcHgqXSwgdGhlIGNvdmVyYWdlIHRvb2ws IGhhcyBqdXN0IGhhZCBpdHMgWzIuNS4wXSByZWxlYXNlLA0KICBpbiB3aGljaCB0aGUgbWFpbiBh ZGRpdGlvbiBpcyBhIHZlcnkgbmVhdCBpbnRlZ3JhdGlvbiB3aXRoIER1bmU6DQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBkdW5lIHJ1bnRlc3QgLS1pbnN0cnVtZW50LXdpdGggYmlzZWN0X3Bw eCAtLWZvcmNlDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgdXNlcyB0aGUgbmV3IFtpbnN0 cnVtZW50YXRpb24gc3VwcG9ydF0gYWRkZWQgaW4gRHVuZSAyLjcuMCwgYW5kDQogIGlzIGEgY29u c2lkZXJhYmxlIGltcHJvdmVtZW50IG92ZXIgdGhlIGR1YmlvdXMgbWV0aG9kcyBCaXNlY3QgYW5k IGl0cw0KICB1c2VycyB3ZXJlIHByZXZpb3VzbHkgZm9yY2VkIHRvIHJlbHkgb24gOikNCg0KICBJ dCBpcyBubyBsb25nZXIgbmVjZXNzYXJ5IHRvIGVkaXQgYGR1bmUnIGZpbGVzIGZvciBhIHJlbGVh c2UsIGFzDQogIEJpc2VjdCBvbmx5IGJlY29tZXMgYSBkZXBlbmRlbmN5IG9mIHlvdXIgcHJvamVj dCB3aGVuDQogIGAtLWluc3RydW1lbnQtd2l0aCBiaXNlY3RfcHB4JyBpcyBzdXBwbGllZCBvbiB0 aGUgRHVuZSBjb21tYW5kIGxpbmUsDQogIHdoaWNoIGlzIG9ubHkgZHVyaW5nIGRldmVsb3BtZW50 IGFuZCBpbiBDSS4gVGhpcyBtYWtlcyBwcm9qZWN0cyByZWFkeQ0KICBmb3IgcmVsZWFzZSBmcm9t IGFueSBjb21taXQuIER1bmUgYWxzbyBub3cga25vd3MgdG8gcmVidWlsZCBhZmZlY3RlZA0KICBm aWxlcyB3aGVuIGluc3RydW1lbnRhdGlvbiBpcyB0dXJuZWQgb24gb3Igb2ZmLCBzbyB5b3UgZG9u J3QgaGF2ZSB0bw0KICBtYW51YWxseSBydW4gYGR1bmUgY2xlYW4nIGluIGJldHdlZW4uIEV2ZXJ5 dGhpbmcganVzdCB3b3JrcyB0aGUgd2F5IGl0DQogIHNob3VsZC4NCg0KICBTZWUgdGhlIHVwZGF0 ZWQgW2luc3RydWN0aW9uc10gZm9yIGFsbCB0aGUgZGV0YWlscyBvbiBob3cgdG8gdXNlIHRoaXMN CiAgaW50ZWdyYXRpb24uDQoNCiAgSSd2ZSBhbHNvIGFkYXB0ZWQgW0xhbWJkYSBTb3VwXSBhcyBh IHNpbXBsZSBmdWxsLXByb2plY3QgZXhhbXBsZS4gU2VlDQogIGl0cyBbYG9wYW0nXSwgW2BkdW5l LXByb2plY3QnXSwgW2BkdW5lJ10sIGFuZCBbYE1ha2VmaWxlJ10uDQoNCiAgQmlzZWN0X3BweCBz dGlsbCBzdXBwb3J0cyBhbGwgdGhlIG9sZGVyIGludGVncmF0aW9ucywgc28gaWYgeW91IGhhdmUN CiAgYW4gZXhpc3Rpbmcgc2V0dXAsIHlvdSBkb24ndCBoYXZlIHRvIGVkaXQgaXQuIFN1cHBvcnQg bWF5IGV2ZW50dWFsbHkNCiAgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLCBob3dldmVyLCBzbyBJ IGVuY291cmFnZSB1c2VycyB0byBncmFkdWFsbHkNCiAgdXBkYXRlLg0KDQogIFNlZSB0aGUgZnVs bCBbY2hhbmdlbG9nXSBmb3IgaW5mb3JtYXRpb24gb24gYnVncyBmaXhlZCBieSB0aGUgcmVsZWFz ZS4NCg0KICBUaGFua3MgdG8gdGhlIER1bmUgdGVhbSBmb3IgYWRkaW5nIGAtLWluc3RydW1lbnQt d2l0aCcsIHRvIEB1bmR1IGZvcg0KICBzdXBwb3J0aW5nIGl0IG9uIHRoZSBCaXNlY3Qgc2lkZSwg YW5kIHRvIGFsbCB0aGUgQmlzZWN0X3BweCB1c2VycyBhbmQNCiAgY29udHJpYnV0b3JzIQ0KDQog IEhhcHB5IHRlc3RpbmchDQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFu ZGFyZDExL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvMS8xOTExYWRjNmFmODk4YjZmNGVmZDdk YzY5ZDJjMWY5MDY5OTAzMWJhLmdpZj4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRyb24v YmlzZWN0X3BweD4NCg0KDQpbKkJpc2VjdF9wcHgqXSA8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRy b24vYmlzZWN0X3BweD4NCg0KWzIuNS4wXSA8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRyb24vYmlz ZWN0X3BweC9yZWxlYXNlcy90YWcvMi41LjA+DQoNCltpbnN0cnVtZW50YXRpb24gc3VwcG9ydF0N CjxodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luc3RydW1lbnRhdGlvbi5o dG1sP2hpZ2hsaWdodD1pbnN0cnVtZW50LXdpdGg+DQoNCltpbnN0cnVjdGlvbnNdIDxodHRwczov L2dpdGh1Yi5jb20vYWFudHJvbi9iaXNlY3RfcHB4I0R1bmU+DQoNCltMYW1iZGEgU291cF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9hYW50cm9uL2xhbWJkYXNvdXA+DQoNCltgb3BhbSddDQo8aHR0cHM6 Ly9naXRodWIuY29tL2FhbnRyb24vbGFtYmRhc291cC9ibG9iL2EwY2JmNTRiZjlhZmZkYTAwNDU1 YzU0MzY5ZTQ3M2I5MDU0NTgxMTQvbGFtYmRhc291cC5vcGFtI0wxNy1MMjI+DQoNCltgZHVuZS1w cm9qZWN0J10NCjxodHRwczovL2dpdGh1Yi5jb20vYWFudHJvbi9sYW1iZGFzb3VwL2Jsb2IvbWFz dGVyL2R1bmUtcHJvamVjdCNMMT4NCg0KW2BkdW5lJ10NCjxodHRwczovL2dpdGh1Yi5jb20vYWFu dHJvbi9sYW1iZGFzb3VwL2Jsb2IvYTBjYmY1NGJmOWFmZmRhMDA0NTVjNTQzNjllNDczYjkwNTQ1 ODExNC9zcmMvZHVuZSNMNz4NCg0KW2BNYWtlZmlsZSddDQo8aHR0cHM6Ly9naXRodWIuY29tL2Fh bnRyb24vbGFtYmRhc291cC9ibG9iL2EwY2JmNTRiZjlhZmZkYTAwNDU1YzU0MzY5ZTQ3M2I5MDU0 NTgxMTQvTWFrZWZpbGUjTDE1Pg0KDQpbY2hhbmdlbG9nXSA8aHR0cHM6Ly9naXRodWIuY29tL2Fh bnRyb24vYmlzZWN0X3BweC9yZWxlYXNlcy90YWcvMi41LjA+DQoNCg0KSnNfb2Zfb2NhbWwgaW4g dGhlIFZTQ29kZSBPQ2FtbCBQbGF0Zm9ybQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qcy1vZi1vY2FtbC1pbi10aGUtdnNjb2RlLW9jYW1sLXBs YXRmb3JtLzY2MzUvMT4NCg0KDQpNYXggTEFOVEFTIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBqdXN0 IGZpbmlzaGVkIGEgd3JpdGUtdXAgYWJvdXQgW3ZzY29kZS1vY2FtbC1wbGF0Zm9ybV0ncyByZWNl bnQNCiAgdHJhbnNpdGlvbiB0byBKc19vZl9vY2FtbDoNCiAgPGh0dHBzOi8vbW54bi5naXRodWIu aW8vYmxvZy9vY2FtbC92c2NvZGUtanNvby8+DQoNCiAgSSBjYW4gYW5zd2VyIGFueSBxdWVzdGlv bnMgaGVyZS4NCg0KICBUaGlzIGlzIGFsc28gbXkgZmlyc3QgdGVjaG5pY2FsIGJsb2cgcG9zdCwg c28gYW55IGNvbnN0cnVjdGl2ZQ0KICBjcml0aWNpc20gb3IgY29tbWVudHMgYWJvdXQgbXkgd3Jp dGluZyB3b3VsZCBiZSB2ZXJ5IGhlbHBmdWwuDQoNCg0KW3ZzY29kZS1vY2FtbC1wbGF0Zm9ybV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL3ZzY29kZS1vY2FtbC1wbGF0Zm9ybS8+DQoN Cg0KVHJhaW5pbmcgU2Vzc2lvbnMgZm9yICJGYXN0IFRyYWNrIHRvIE9DYW1sIiBhbmQgIkV4cGVy dCBPQ2FtbCIgaW4gUGFyaXMgKDIzLTI2IE5vdmVtYmVyIDIwMjApDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjAtMTAvbXNnMDAwMTgu aHRtbD4NCg0KDQpMYXVyw6huZSBHaWJhdWQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBBdCBPQ2FtbFBybywgd2Ugd2lsbCBiZSBvcmdhbml6aW5nIDIgY3Jvc3MtY29tcGFueSB0cmFp bmluZyBzZXNzaW9ucw0KICBpbiBGcmVuY2guIEJvdGggc2Vzc2lvbnMgaW50ZXJsZWF2ZSB0aGVv cnkgYW5kIHByYWN0aWNlLiBZb3UnbGwgaGF2ZQ0KICB0aW1lIHRvIGFzayB5b3VyIHNwZWNpZmlj IHF1ZXN0aW9ucyBhbmQgZ2V0IHBlcnNvbmFsaXplZCBmZWVkYmFjayBvbg0KICB5b3VyIHByb2dy YW1zLg0KDQogIOKAoiBPdXIgQmVnaW5uZXIgc2Vzc2lvbiB3aWxsIGFsbG93IGRldmVsb3BlcnMg dG8gYnVpbGQgdXBvbiB0aGVpcg0KICAgIGV4cGVyaWVuY2Ugb2Ygb3RoZXIgcHJvZ3JhbW1pbmcg bGFuZ3VhZ2VzIChzdWNoIGFzIEMsIEMrKywgUHl0aG9uLA0KICAgIEMjIG9yIEphdmEpIHRvIHBy b2dyYW0gY29uZmlkZW50bHkgaW4gT0NhbWwuIEZlZWwgZnJlZSB0byBzaGFyZSB0aGUNCiAgICBp bmZvIHdpdGggeW91ciBjb3dvcmtlcnMgb3IgeW91ciBuZXR3b3JrIQ0KICDigKIgT3VyIOKAnEV4 cGVydCBPQ2FtbOKAnSB0cmFpbmluZyB3aWxsIGFsbG93IHlvdSB0byBtYXN0ZXIgT0NhbWzigJlz DQogICAgYWR2YW5jZWQgZmVhdHVyZXMgc3VjaCBhcyBpdHMgdHlwZS1zeXN0ZW0sIE9DYW1s4oCZ cyBvcGVuIHNvdXJjZSB0b29scw0KICAgIGFuZCBsaWJyYXJpZXMsIGFuZCBob3cgdG8gd3JpdGUg Y29tcGFjdCBhbmQgZWZmaWNpZW50IGNvZGUuDQoNCiAgTW9yZSBpbmZvIG9uIHRoZSBwcm9ncmFt IGFuZCBwcmVyZXF1aXNpdGVzIG9uDQogIDxodHRwOi8vd3d3Lm9jYW1scHJvLmNvbS90cmFpbmlu Zy1vY2FtbHByby8+IG9yIGFzayBhd2F5IChhbnN3ZXIgdGhpcw0KICBlbWFpbCBvciB3cml0ZSBh dCBjb250YWN0QG9jYW1scHJvLmNvbSkuDQoNCiAgV2hlbj8gVGhlIEJlZ2lubmVyIHNlc3Npb24g aXMgc2NoZWR1bGVkIGZvciBOb3ZlbWJlciAyMy0yNCwgMjAyMC4gVGhlDQogIEV4cGVydCBzZXNz aW9uIHdpbGwgYmUgb24gTm92ZW1iZXIgMjUtMjYsIDIwMjAuDQoNCiAgV2hlcmU/IFBhcmlzIDE0 LCBpbiBPQ2FtbFBybydzIG9mZmljZS4NCg0KICBIb3c/IFJlZ2lzdGVyIG9uOg0KICA8aHR0cHM6 Ly93d3cub2NhbWxwcm8uY29tL3ByZS1pbnNjcmlwdGlvbi1hLXVuZS1zZXNzaW9uLWRlLWZvcm1h dGlvbi1pbnRlci1lbnRyZXByaXNlcy8+DQoNCiAgV2UgY2FuIGFsc28gb3JnYW5pemUgY3VzdG9t IGFuZCBvbi1zaXRlIHNlc3Npb25zIHVwb24gcmVxdWVzdC4NCg0KDQpTZXQgdXAgT0NhbWwgMS4x LjINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldC11cC1v Y2FtbC0xLTEtMi82NjQzLzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFRoaXMgcmVsZWFzZSBjb250YWlucyB0aGVzZSBjaGFuZ2VzOg0KDQogIOKAoiBB ZGQgdGhlIEN5Z3dpbiBzZXR1cCB0byBhIGtub3duIGxvY2F0aW9uIGZvciBsYXRlciBzdGVwcw0K ICDigKIgQ2hlY2sgaWYgdGhlIHN3aXRjaCBleGlzdHMgYmVmb3JlIGNyZWF0aW5nIHRoZSBzd2l0 Y2gNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL2F2c20vc2V0dXAtb2NhbWwvcmVsZWFzZXMvdGFn L3YxLjEuMj4NCg0KDQpTZXQgdXAgT0NhbWwgMS4xLjMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldC11cC1vY2FtbC0xLTEtMy82NjQ0LzE+DQoNCg0KU29y YSBNb3JpbW90byBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgcmVsZWFzZSBjb250 YWlucyB0aGVzZSBjaGFuZ2VzOg0KDQogIOKAoiBVcGRhdGUgdGhlIGBAYWN0aW9ucy9jb3JlJyBw YWNrYWdlIHRvIGFkZHJlc3MgW0NWRS0yMDIwLTE1MjI4XQ0KDQogIDxodHRwczovL2dpdGh1Yi5j b20vYXZzbS9zZXR1cC1vY2FtbC9yZWxlYXNlcy90YWcvdjEuMS4zPg0KDQoNCltDVkUtMjAyMC0x NTIyOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hZHZpc29yaWVzL0dIU0EtbWZ3aC01bTIzLWo0Nnc+ DQoNCg0KRmlyc3QgcmVsZWFzZSBvZiBGU01MDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLWZzbWwvNjY0NS8x Pg0KDQoNCmpzZXJvdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHB1Ymxp YyByZWxlYXNlIG9mIEZTTUwsIGFuIE9DYW1sIGxpYnJhcnkNCiAgZm9yIGRlc2NyaWJpbmcgYW5k IGRlc2NyaWJpbmcgc3luY2hyb25vdXMgZmluaXRlIHN0YXRlIG1hY2hpbmVzLg0KDQogIEZTTUwg aXMgYSBzaW1wbGlmaWVkIHZlcnNpb24gb2YgdGhlIGxpYnJhcnkgcHJvdmlkZWQgaW4gdGhlIFtS ZnNtXQ0KICBwYWNrYWdlIGZvciB3aGljaA0KDQogIOKAoiB0aGUgc3lzdGVtIGlzIGNvbXBvc2Vk IG9mIGEgc2luZ2xlIEZTTQ0KDQogIOKAoiB0aGlzIEZTTSBoYXMgYSBzaW5nbGUsIGltcGxpY2l0 LCB0cmlnZ2VyaW5nIGV2ZW50ICh0eXBpY2FsbHkgY2FsbGVkDQogICAgdGhlICpjbG9jayogLCBo ZW5jZSB0aGUgdGVybSAqc3luY2hyb25vdXMqIHVzZWQgaW4gdGhlIGRlc2NyaXB0aW9uKQ0KDQog IFRoZSBGU01MIGxpYnJhcnkgcHJvdmlkZXMNCg0KICDigKIgYSB0eXBlIGBGc20udCcgZm9yIGRl c2NyaWJpbmcgRlNNcw0KICAgIOKAoiBwb3NzaWJseSBoYXZpbmcgKmxvY2FsIHZhcmlhYmxlcyoN CiAgICDigKIgZm9yIHdoaWNoICp0cmFuc2l0aW9ucyogLCBpbXBsaWNpdGVseSB0cmlnZ2VyZWQg YnkgYSBjbG9jaywgYXJlDQogICAgICBkZWZpbmVkIGJ5IGEgc2V0IG9mICpib29sZWFuIGd1YXJk cyogYW5kIGEgc2V0IG9mICphY3Rpb25zKg0KDQogIOKAoiBhIHNldCBvZiBQUFggZXh0ZW5zaW9u cyBmb3IgYnVpbGRpbmcgdmFsdWVzIG9mIHR5cGUgYEZzbS50Jw0KDQogIOKAoiBmdW5jdGlvbnMg Zm9yIHByb2R1Y2luZyBhbmQgdmlld2luZyBncmFwaGljYWwgcmVwcmVzZW50YXRpb25zIG9mDQog ICAgRlNNcyBpbiB0aGUgYC5kb3QnIGZvcm1hdA0KDQogIOKAoiBmdW5jdGlvbnMgZm9yIHNhdmlu ZyBhbmQgcmVhZGluZyBGU00gcmVwcmVzZW50YXRpb25zIGluIGZpbGVzIHVzaW5nDQogICAgdGhl IEpTT04gZm9ybWF0DQoNCiAg4oCiIGZ1bmN0aW9ucyBmb3IgcGVyZm9ybWluZyBzaW5nbGUgb3Ig bXVsdGktc3RlcCBzaW11bGF0aW9ucyBvZiBGU01zDQogICAgYW5kIGdlbmVyYXRpbmcgdHJhY2Ug ZmlsZXMgaW4gdGhlIGAudmNkJyBmb3JtYXQgdG8gYmUgdmlld2VkIGJ5IFZDRA0KICAgIHZpZXdl cnMgc3VjaCBhcyBbZ3Rrd2F2ZV0NCg0KICDigKIgZnVuY3Rpb25zIGZvciBnZW5lcmF0aW5nIEMg b3IgVkhETCBjb2RlIGZyb20gYSBGU00gcmVwcmVzZW50YXRpb24NCiAgICAoZm9yIGludGVncmF0 aW9uIGludG8gZXhpc3RpbmcNCiAgY29kZSBhbmQvb3Igc2ltdWxhdGlvbikNCg0KICBGU01MIGlz IGF2YWlsYWJsZSBmcm9tIFtHaXRodWJdIG9yIGFzIGFuIFtPUEFNIHBhY2thZ2VdLg0KDQoNCltS ZnNtXSA8aHR0cDovL2dpdGh1Yi5jb20vanNlcm90L3Jmc20+DQoNCltndGt3YXZlXSA8aHR0cDov L2d0a3dhdmUuc291cmNlZm9yZ2UubmV0Lz4NCg0KW0dpdGh1Yl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9qc2Vyb3QvZnNtbD4NCg0KW09QQU0gcGFja2FnZV0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcv cGFja2FnZXMvZnNtbD4NCg0KDQpRcmMgMC4xLjAsIGEgUVIgY29kZSBlbmNvZGVyDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1xcmMtMC0xLTAtYS1xci1jb2RlLWVuY29kZXIvNjY0Ny8xPg0KDQoNCkRh bmllbCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUVIgY29kZXMgYXJlIHVu c2lnaHRseSDigJMgYSBtaXJyb3Igb2YgdGhlaXIgc3BlY2lmaWNhdGlvbi4gQnV0IHRoZXkNCiAg ZW5hYmxlIGFsbCBzb3J0cyBvZiBuZWF0IHRyaWNrcyBub3cgdGhhdCBzY2FubmVycyBmb3IgdGhl bSBhcmUgaW4gbWFueQ0KICBwb2NrZXRzLg0KDQogIFFyYyBnZW5lcmF0ZSB0aGVtOg0KDQogICAg ICAgIFFyYyBlbmNvZGVzIHlvdXIgZGF0YSBpbnRvIFFSIGNvZGVzLiBJdCBoYXMgYnVpbHQtaW4g UVINCiAgICAgICAgbWF0cml4IHJlbmRlcmVycyBmb3IgU1ZHLCBBTlNJIHRlcm1pbmFsIGFuZCB0 ZXh0Lg0KDQogICAgICAgIFFyYyBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2Uu IEl0IGhhcyBubw0KICAgICAgICBkZXBlbmRlbmNpZXMuDQoNCiAgSG9tZXBhZ2U6IDxodHRwczov L2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9xcmM+DQogIEFQSSBkb2NzOiA8aHR0cHM6Ly9lcnJhdGlx dWUuY2gvc29mdHdhcmUvcXJjL2RvYy8+IG9yIGBvZGlnIGRvYyBxcmMnDQogIEluc3RhbGw6IGBv cGFtIGluc3RhbGwgcXJjJw0KDQoNCmN1bXVsdXMgMC4wLjENCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWN1bXVsdXMtMC0wLTEvNjY1NS8xPg0KDQoNClBldHRlciBBLiBVcmtlZGFsIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSB3b3VsZCBsaWtlIHRvIGFu bm91bmNlIGEgbmV3IEZSUCBsaWJyYXJ5IGJ1aWx0IG9uIHRoZSBSZWFjdCBsaWJyYXJ5Lg0KICBU aGUgcHVycG9zZSBvZiBbY3VtdWx1c10gaXMgdG8gaGVscCBvcmdhbml6ZSBjb2RlIHdoaWNoIHdv cmsgb24NCiAgZGlmZmVyZW50aWFsIHVwZGF0ZXMuICBUaGUgbWFpbiB0eXBlIGlzIHRoZSAqY3Vt dWx1cyBzaWduYWwqLCB3aGljaCBpcw0KICBhbmFsb2dvdXMgdG8gYSByZWFjdCBzaWduYWwsIGV4 Y2VwdCB0aGF0IGluZm9ybWF0aW9uIGFib3V0IHRoZQ0KICBkaWZmZXJlbmNlIGZyb20gdGhlIHBy ZXZpb3VzIHZhbHVlIGlzIHByb3ZpZGVkIHRvIGNvbnN1bWVycyBhbG9uZyB3aXRoDQogIHRoZSBu ZXcgdmFsdWUsIHdoZW4gdGhlIGN1bXVsdXMgc2lnbmFsIGNoYW5nZXMuDQoNCiAgU28sIHdoeSBk b2VzIGEgY3VtdWx1cyBzaWduYWwgcHJvdmlkZSBib3RoIHRoZSBzdGF0ZSBhbmQgdGhlDQogIGRp ZmZlcmVuY2UgdG8gZG93bnN0cmVhbSBzaWduYWxzPyAgVGhhdCBpcywgd2hhdCBpcyB0aGUgZGlm ZmVyZW5jZQ0KICBiZXR3ZWVuIHRoZSBmb2xsb3dpbmc6Pw0KICDilIzilIDilIDilIDilIANCiAg 4pSCIHR5cGUgdDEgPSBzdGF0ZSAqIGNoYW5nZSBSZWFjdC5FICAgICAoKiBpbml0aWFsIHZhbHVl IGFuZCBldmVuIG9mIGNoYW5nZXMgKikNCiAg4pSCIHR5cGUgdDIgPSAoc3RhdGUsIGNoYW5nZSkg Q3VtdWx1cy50ICAoKiB0aGUgY3VtdWx1cyBzaWduYWwgKikNCiAg4pSU4pSA4pSA4pSA4pSADQog IFRoZSBmb3JtZXIgdHlwZSBwcmVzdW1lcyB0aGF0IGFmdGVyIHRoZSBjb25zdW1lciBoYXMgcmVj ZWl2ZWQgdGhlDQogIGluaXRpYWwgc3RhdGUsIGl0IHdpbGwgb25seSBuZWVkIHRvIGtub3cgd2hh dCBjaGFuZ2VzIG9uIHN1Y2Nlc3NpdmUNCiAgdXBkYXRlcy4gIFRoaXMgc2VlbXMgcXVpdGUgbmF0 dXJhbC4gIEl0IHdvcmtzIHdlbGwgaWYsIGZvciBpbnN0YW5jZSwNCiAgd2Ugd2FudCB0byByZWNv bnN0cnVjdCBhIHNpZ25hbCBob2xkaW5nIGEgc2V0IG9mIHN0cmluZ3MsIGdpdmVuIGFuDQogIGlu aXRpYWwgc2V0IGFuZCBhIHNlcmllcyBvZiBhZGRpdGlvbnMgYW5kIHJlbW92YWxzOg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG1vZHVsZSBTdHJpbmdfc2V0ID0gU2V0Lk1ha2UgKFN0cmluZykN CiAg4pSCIA0KICDilIIgdHlwZSAnYSBzZXRfcGF0Y2ggPSBbYEFkZCBvZiBzdHJpbmcgfCBgUmVt b3ZlIG9mIHN0cmluZ10NCiAg4pSCIHR5cGUgJ2EgdXBkYXRlID0gJ2EgLT4gJ2ENCiAg4pSCIA0K ICDilIIgbGV0IHBhdGNoX3N0cmluZ19zZXQgOiBzdHJpbmcgc2V0X3BhdGNoIC0+IFN0cmluZ19z ZXQudCB1cGRhdGUgPSBmdW5jdGlvbg0KICDilIIgIHwgYEFkZCB4IC0+IFN0cmluZ19zZXQuYWRk IHgNCiAg4pSCICB8IGBSZW1vdmUgeCAtPiBTdHJpbmdfc2V0LnJlbW92ZSB4DQogIOKUgiANCiAg 4pSCIGxldCBpbnRlZ3JhdGVfc3RyaW5ncyAoaW5pdCwgY2hhbmdlcykgPQ0KICDilIIgICBSZWFj dC5FLmZvbGQgKGZ1biBsIHAgLT4gcGF0Y2hfc3RyaW5nX3NldCBwIGwpIGluaXQgY2hhbmdlcw0K ICDilJTilIDilIDilIDilIANCiAgQnV0IHdoYXQgaWYgd2Ugd2FudCB0byBtYWludGFpbiBhIHNp Z25hbCBob2xkaW5nIHRoZSBpbnRlcnNlY3Rpb24gb2YNCiAgdHdvIHNldHMgb2Ygc3RyaW5ncz8g IElmIHdlIHRyeSB0byBsaWZ0IHRoZSBpbnRlcnNlY3Rpb24gb3BlcmF0aW9uIHRvDQogIHdvcmsg b24gcGF0Y2hlcywgd2UgZGlzY292ZXIgdGhhdCBsZWFybmluZyBhYm91dCB0aGUgYWRkaXRpb24g b2YgYW4NCiAgZWxlbWVudCB0byBsZWZ0LWhhbmQgc2V0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGRl dGVybWluZSB3aGV0aGVyIHRoZQ0KICBlbGVtZW50IHNoYWxsIHRoZSBhZGRlZCB0byB0aGUgcmVz dWx0aW5nIHNldDsgd2UgYWxzbyBuZWVkIHRvIGtub3cNCiAgd2hldGhlciB0aGUgZWxlbWVudCBp cyBhIG1lbWJlciBvZiB0aGUgcmlnaHQtaGFuZCBzZXQuICBTbywgaW4gdGhpcw0KICBjYXNlIHdl IHdvdWxkIGluc3RlYWQgdXNlIGN1bXVsdXMgc2lnbmFsczoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBsZXQgY3UgOiAoU3RyaW5nX3NldC50LCBzdHJpbmcgc2V0X3BhdGNoKSBDdW11bHVzLnQg PSAuLi4NCiAg4pSCIGxldCBjdiA6IChTdHJpbmdfc2V0LnQsIHN0cmluZyBzZXRfcGF0Y2gpIEN1 bXVsdXMudCA9IC4uLg0KICDilIIgbGV0IGN1diA9DQogIOKUgiAgIGxldCBpbml0IHUgdiA9IFN0 cmluZ19zZXQuaW50ZXIgdSB2IGluDQogIOKUgiAgIGxldCBwYXRjaCAodSwgZHUpICh2LCBkdikg cicgPQ0KICDilIIgICAgIChtYXRjaCBkdSwgZHYgd2l0aA0KICDilIIgICAgICB8IE5vbmUsIFNv bWUgeCB3aGVuIFN0cmluZ19zZXQubWVtIHggdSAtPg0KICDilIIgCUN1bXVsdXMuUGF0Y2ggKFN0 cmluZ19zZXQuYWRkIHggcicsIGBBZGQxIHgpDQogIOKUgiAgICAgIC4uLikNCiAg4pSCICAgaW4N CiAg4pSCICAgQ3VtdWx1cy5sMiB+aW5pdCB+cGF0Y2ggY3UgY3YNCiAg4pSU4pSA4pSA4pSA4pSA DQogIEZvciB0aGUgY29tcGxldGUgZXhhbXBsZSwgdXNpbmcgaW50ZWdlcnMgaW5zdGVhZCBvZiBz dHJpbmdzLCBzZWUNCiAgW2B0ZXN0X2lzZWNuLm1sJ10gZnJvbSB0aGUgdGVzdHN1aXRlLg0KDQog IChGb290bm90ZTogSWYgY29uc3VtZXJzIGtub3cgaG93IHRvIGludGVncmF0ZSB0aGUgc3RhdGVz IHRoZXkgZGVwZW5kDQogIG9uLCB0aGV5IGNvdWxkIGluIHByaW5jaXBsZSBrZWVwIHRoZWlyIG93 biByZWNvcmQgb2YgdGhlIGZ1bGwgc3RhdGVzDQogIG9mIHRoZSBhcmd1bWVudHMuICBCdXQgdGhp cyB3b3VsZCBiZSBpbmVmZmljaWVudCBpZiB0aGVyZSBhcmUgbWFueQ0KICBjb25zdW1lcnMsIGFu ZCB0aGVyZSBpcyBhbHNvIGEgc2ltcGxpZmljYXRpb24gb2YgY29kZSBhbmQgcG9zc2libHkNCiAg aW1wcm92ZWQgYWJzdHJhY3Rpb24gaW4gbGV0dGluZyB0aGUgcHJvZHVjZXIgbWFpbnRhaW4gaXRz IG93biBzdGF0ZS4pDQoNCiAgRm9ybWFsbHksIHdlIGNhbiB1bmRlcnN0YW5kIHRoZSBkaWZmZXJl bmNlIGJldHdlZW4gYHQxJyBhbmQgYHQyJyBpbg0KICB0ZXJtcyBvZiBjYWxjdWx1cy4gIEZvciBp bnN0YW5jZSwgdGhlIGRpZmZlcmVudGlhbCBvZiBhIHByb2R1Y3QNCiAgYGQoeMK3eSkgPSBkeMK3 eSArIHjCt2R5JyBjb250YWlucyBhIG1peCBvZiBib3RoIHRoZSBkaWZmZXJlbnRpYWxzIGFuZA0K ICB2YWx1ZXMgb2YgdGhlIHR3byB2YXJpYWJsZXMuICBCdXQgaWYgdGhlIGV4cHJlc3Npb24gaXMg bGluZWFyLCBvbmx5DQogIGRpZmZlcmVudGlhbHMgd2lsbCB3aWxsIG9jY3VyOiBgZChhwrd4ICsg YsK3eSArIGMpID0gYcK3ZHggKyBiwrdkeScuICBTbywNCiAgd2hlbiBgdDEnIGlzIHN1ZmZpY2ll bnQsIHdlIGFyZSBkZWFsaW5nIHdpdGggdGhlIGFuYWxvZ3VlIG9mIGEgbGluZWFyDQogIGZ1bmN0 aW9uLiAgVGhlIGFib3ZlIGV4YW1wbGUgY291bGQgYmUgdHVybmVkIGludG8gYSBsaW5lYXIgb25l IGJ5DQogIG1ha2luZyBgTGFiZWxzLnQnIGEgbXVsdGlzZXQgdHlwZSBhbmQgY29uc2lkZXJpbmcg dGhlIG11bHRpc2V0IHVuaW9uDQogIG9wZXJhdGlvbi4NCg0KICBUaHVzIGZhciB3ZSBvbmx5IGNv bnNpZGVyZWQgcHVyZWx5IGZ1bmN0aW9uYWwgY29kZSwgYnV0IGEgY3VtdWx1cw0KICBzaWduYWwg bWF5IGNob3NlIHRvIG1vZGlmeSBhbmQgcmV0dXJuIHRoZSBzYW1lIHBoeXNpY2FsIHN0YXRlIGR1 cmluZw0KICBhbiB1cGRhdGUuICBBbHNvIG5vdGUgd2hlbiBkZXNpZ25pbmcgdGhlIGRpZmZlcmVu dGlhbCBjb21wb25lbnQgb2YgdGhlDQogIGN1bXVsdXMgc2lnbmFsLCB0aGF0IHdlIG1heSBleHBs b2l0IHRoZSBmYWN0IHRoZSBjb25zdW1lcnMgYWxzbyBtYXkNCiAgaW5zcGVjdCB0aGUgY29ycmVz cG9uZGluZyBuZXcgc3RhdGUuICBDb21iaW5pbmcgdGhlc2UgdHdvIHBvaW50cywgYQ0KICBjdW11 bHVzIHNpZ25hbCBob2xkaW5nIGFuIGFycmF5IG1pZ2h0IGhhdmUgdGhlIHR5cGUgYCgnYSBhcnJh eSwgW2BTZXQNCiAgb2YgaW50IHwgYFJlc2l6ZSBvZiBpbnRdKScuIEhlcmUgdGhlIHN0YXRlIG1h eSBiZSByZXVzZWQgZm9yIGBgU2V0Jw0KICBhbmQgcmVwbGFjZWQgZm9yIGBgUmVzaXplJy4NCg0K ICBPbiBhIHJlbGF0ZWQgbm90LCB0aGVyZSBpcyBhbHNvIHRoZSBbcmVhY3RpdmVEYXRhXSBsaWJy YXJ5IHdoaWNoIGRlYWxzDQogIHdpdGggKGxpbmVhcikgcGF0Y2hpbmcgb2YgY29udGFpbmVycy4N Cg0KICBJIG11c3QgYWxzbyBtZW50aW9uIHRoYXQgdGhlcmUgdGhlcmUgaXMgYW4gW09DYW1sIHBy b2plY3Qgd2l0aCB0aGUNCiAgc2FtZSBuYW1lXSAoZXhjZXB0IGNhc2luZykuIFNvcnJ5IGZvciBu b3QgY2hlY2tpbmcgdGhvcm91Z2hseSBpbg0KICBhZHZhbmNlLiBJIGhvcGUgaXQgaXMgbm90IGFu IGlzc3VlIGluIHByYWN0aXNlLCBvdGhlcndpc2UgdGhlcmUgaXMNCiAgc3RpbGwgdGltZSB0byBy ZW5hbWUgd2hpbGUgdGhlIGxpYnJhcnkgaXMgZnJlc2guDQoNCg0KW2N1bXVsdXNdIDxodHRwczov L2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWN1bXVsdXMvPg0KDQpbYHRlc3RfaXNlY24ubWwn XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9wYXVya2VkYWwvb2NhbWwtY3VtdWx1cy9ibG9iL21hc3Rl ci90ZXN0cy90ZXN0X2lzZWNuLm1sPg0KDQpbcmVhY3RpdmVEYXRhXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jc2lnZW4vcmVhY3RpdmVEYXRhPg0KDQpbT0NhbWwgcHJvamVjdCB3aXRoIHRoZSBzYW1l IG5hbWVdIDxodHRwczovL2dpdGh1Yi5jb20vQ3VtdWx1cy9DdW11bHVzPg0KDQoNCkJyciAwLjAu MSwgYSB0b29sa2l0IGZvciBwcm9ncmFtbWluZyBicm93c2Vycw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYnJy LTAtMC0xLWEtdG9vbGtpdC1mb3ItcHJvZ3JhbW1pbmctYnJvd3NlcnMvNjYwOC81Pg0KDQoNCkNv bnRpbnVpbmcgdGhpcyB0aHJlYWQsIFlvYW5uIFBhZGlvbGVhdSBhc2tlZCBEYW5pZWwgQsO8bnps aSByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBXaGF0 IGFyZSB0aGUgZGlmZmVyZW5jZXMgd2l0aCB0aGUgZGVmYXVsdCBiaW5kaW5ncw0KICAgICAgICBw cm92aWRlZCBpbiBqc19vZl9vY2FtbCB0byB0aGUgYnJvd3NlciBBUElzIChlLmcuLCBqcy5tbGks DQogICAgICAgIGRvbS5tbGksIGV0Yy4pPw0KDQogIEknbSBub3Qgc3VyZSBleGFjdGx5IHdoYXQg eW91IGFyZSBhc2tpbmcgYnV0Og0KDQogIDEuIElmIHlvdSBhcmUgYXNraW5nIGFib3V0IHRoZSB3 YXkgQVBJIGFyZSBleHBvc2VkOiBgYnJyJyBkb2VzIG5vdA0KICAgICB0eXBlIEphdmFTY3JpcHQn cyBvYmplY3RzIGFzIHBoYW50b20gdHlwZXMuIEl0IHNpbXBseSByZWxpZXMgb24NCiAgICAgT0Nh bWwncyBhYnN0cmFjdCBkYXRhIHR5cGVzIGFuZCBwbGFpbiBmdW5jdGlvbnMuIE1vcmUgYWJvdXQg dGhpcw0KICAgICBjYW4gYmUgZm91bmQgaW4gYnJyJ3MgW0ZGSSBtYW51YWxdIGFuZCBbRkZJIGNv b2tib29rXS4NCiAgMi4gSWYgeW91IGFyZSBhc2tpbmcgYWJvdXQgYmluZGluZyBjb3ZlcmFnZSwg eW91IHNob3VsZCBiZSBhYmxlIHRvIGdldA0KICAgICBhIHNlbnNlIG9mIHdoYXQgaXMgYm91bmQg aW4gYGJycicgW2hlcmVdLg0KDQogIFJlZ2FyZGluZyAyLiBgYnJyJydzIGNvdmVyYWdlIG9mIG1v cmUgcmVjZW50IGJyb3dzZXIgQVBJcyBpcyBicm9hZGVyDQogIGFuZCBtb3JlIGNvbnNpc3RlbnQg dGhhbiBpbiBganNfb2Zfb2NhbWwnIOKAkyBQcm9taXNlIHN1cHBvcnQsIEZldGNoLA0KICBTZXJ2 aWNlIHdvcmtlcnMsIE1lZGlhIGNhcHR1cmUgQVBJcywgV2ViR0wyLCBXZWJjcnlwdG8sIFdlYkF1 ZGlvLA0KICBldGMuIENvbnZlcnNseSBvbGRlciBBUElzIHN1cHBvcnRlZCBpbiBganNfb2Zfb2Nh bWwnIG1heSBub3Qgc3VwcG9ydGVkDQogIGluIGBicnInIChlLmcuICBYTUxIVFRQUmVxdWVzdCku IEJlc2lkZXMgYGJycicncyBjb3ZlcmFnZSBvZiBzb21lIG9mDQogIHRoZSBET00gKmVsZW1lbnQt c3BlY2lmaWMqIGludGVyZmFjZXMgbWF5IGJlIHNoYWxsb3dlciB0aGFuIGluDQogIGBqc19vZl9v Y2FtbCcuIFRoZXJlIGlzIGhvd2V2ZXIgZ29vZCBjb3ZlcmFnZSBmb3IgdGhlDQogIFtgSFRNTE1l ZGlhRWxlbWVudCddLCBbYEhUTUxDYW52YXNFbGVtZW50J10sIFtgSFRNTEZvcm1FbGVtZW50J10g YW5kDQogIFtgSFRNTElucHV0RWxlbWVudCddIGludGVyZmFjZXMuIEZvciB0aGUgcmVzdCB0aGUg W2F0dHJpYnV0ZSBhbmQNCiAgcHJvcGVydHkgQVBJXSBhbmQgdGhlIG9jY2FzaW9uYWwgdHJpdmlh bCBGRkkgbWV0aG9kIGJpbmRpbmcgc2hvdWxkIGJlDQogIGFibGUgdG8gZ2V0IHlvdSBhIGxvbmcg d2F5Lg0KDQoNCltGRkkgbWFudWFsXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJy L2RvYy9mZmlfbWFudWFsLmh0bWw+DQoNCltGRkkgY29va2Jvb2tdIDxodHRwczovL2VycmF0aXF1 ZS5jaC9zb2Z0d2FyZS9icnIvZG9jL2ZmaV9jb29rYm9vay5odG1sPg0KDQpbaGVyZV0gPGh0dHBz Oi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2Jyci9kb2MvaW5kZXguaHRtbCNzdXBwb3J0ZWRfYXBp cz4NCg0KW2BIVE1MTWVkaWFFbGVtZW50J10NCjxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2Fy ZS9icnIvZG9jL0Jycl9pby9NZWRpYS9pbmRleC5odG1sI2VsPg0KDQpbYEhUTUxDYW52YXNFbGVt ZW50J10NCjxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jL0Jycl9jYW52YXMv Q2FudmFzL2luZGV4Lmh0bWw+DQoNCltgSFRNTEZvcm1FbGVtZW50J10NCjxodHRwczovL2VycmF0 aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jL0Jycl9pby9Gb3JtL2luZGV4Lmh0bWw+DQoNCltgSFRN TElucHV0RWxlbWVudCddDQo8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyL2RvYy9C cnIvRWwvaW5kZXguaHRtbCNpZmFjZXM+DQoNClthdHRyaWJ1dGUgYW5kIHByb3BlcnR5IEFQSV0N CjxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jL0Jyci9FbC9pbmRleC5odG1s I2F0c19hbmRfcHJvcHM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0g YW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJj aGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBh bHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2Ny aWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNz YWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNo aXZlXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0 aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoN CltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVr bHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 20 to 27, 202= 0.

Bisect_ppx, the coverage tool, now has excellent integration w= ith Dune

Anton Bachin announced

Bisect_ppx, th= e coverage tool, has just had its 2.5.0 release, in which the main addition is a very neat integration with Dune:

dune runtest --instrument-with bisect_ppx --fo=
rce

This uses the new instrumentation support added= in Dune 2.7.0, and is a considerable improvement over the dubious methods Bisect and its users were previously f= orced to rely on :)

It is no longer necessary to edit dune files for a release, as= Bisect only becomes a dependency of your project when --instrument-with bisect_ppx is supplied on = the Dune command line, which is only during development and in CI. This makes projects ready for release from an= y commit. Dune also now knows to rebuild affected files when instrumentation is turned on or off, s= o you don't have to manually run dune clean in between. Everything just works the way it sh= ould.

See the updated inst= ructions for all the details on how to use this integration.

I've also adapted Lambda = Soup as a simple full-project example. See its opam, dune-project, dune, and Makefile.

Bisect_ppx still supports all the older integrations, so if you have an exi= sting setup, you don't have to edit it. Support may eventually be removed in the future, however, so I = encourage users to gradually update.

See the full changelog for information on bugs fixed by the release.

Thanks to the Dune team for adding --instrument-with, to @undu= for supporting it on the Bisect side, and to all the Bisect_ppx users and contributors!

Happy testing!

3D"1911adc6af89=

https://github.com/aantro= n/bisect_ppx

Js_of_ocaml in the VSCode OCaml Platform

Max LANTAS announced

I just finished a write-up about vscode-ocam= l-platform's recent transition to Js_of_ocaml: https://mnxn.git= hub.io/blog/ocaml/vscode-jsoo/

I can answer any questions here.

This is also my first technical blog post, so any constructive criticism or= comments about my writing would be very helpful.

Training Sessions for "Fast Track to OCaml" and "Expert OCaml"= in Paris (23-26 November 2020)

Laur=C3=A8ne Gibaud announced

At OCamlPro, we will be organizing 2 cross-company training sessions in Fre= nch. Both sessions interleave theory and practice. You'll have time to ask your specific quest= ions and get personalized feedback on your programs.

  • Our Beginner session will allow developers to build upon their experien= ce of other programming languages (such as C, C++, Python, C# or Java) to p= rogram confidently in OCaml. Feel free to share the info with your coworker= s or your network!
  • Our =E2=80=9CExpert OCaml=E2=80=9D training will allow you to master OC= aml=E2=80=99s advanced features such as its type-system, OCaml=E2=80=99s op= en source tools and libraries, and how to write compact and efficient code.=

More info on the program and prerequisites on http://www.ocamlpro.com/training-ocamlpro/ or= ask away (answer this email or write at contact@ocamlpro.com).

When? The Beginner session is scheduled for November 23-24, 2020. The Exper= t session will be on November 25-26, 2020.

Where? Paris 14, in OCamlPro's office.

How? Register on: https://www.ocamlpro.com/pre-inscription-a-une-sess= ion-de-formation-inter-entreprises/

We can also organize custom and on-site sessions upon request.

Set up OCaml 1.1.2

Sora Morimoto announced

This release contains these changes:

  • Add the Cygwin setup to a known location for later steps
  • Check if the switch exists before creating the switch

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.2

Set up OCaml 1.1.3

Sora Morimoto announced

This release contains these changes:

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.3

First release of FSML

jserot announced

This is to announce the first public release of FSML, an OCaml library for = describing and describing synchronous finite state machines.

FSML is a simplified version of the library provided in the Rfsm package for which

  • the system is composed of a single FSM
  • this FSM has a single, implicit, triggering event (typically called the= clock , hence the term synchronous used in the description= )

The FSML library provides

  • a type Fsm.t for describing FSMs
    • possibly having local variables
    • for which transitions , implicitely triggered by a clock, are d= efined by a set of boolean guards and a set of actions
  • a set of PPX extensions for building values of type Fsm.t=
  • functions for producing and viewing graphical representations of FSMs i= n the .dot format
  • functions for saving and reading FSM representations in files using the= JSON format
  • functions for performing single or multi-step simulations of FSMs and g= enerating trace files in the .vcd format to be viewed by VCD = viewers such as gtkwave
  • functions for generating C or VHDL code from a FSM representation (for = integration into existing

code and/or simulation)

FSML is available from Github or as an OPAM package.

Qrc 0.1.0, a QR code encoder

Daniel B=C3=BCnzli announced

QR codes are unsightly =E2=80=93 a mirror of their specification. But they = enable all sorts of neat tricks now that scanners for them are in many pockets.

Qrc generate them:

Qrc encodes your data into QR codes. It has built-in QR matrix renderers for SVG, ANSI terminal and text.

Qrc is distributed under the ISC license. It has no dependencies.

Homepage: https://erratique.c= h/software/qrc
API docs: https://errati= que.ch/software/qrc/doc/ or odig doc qrc
Install: opam install qrc

cumulus 0.0.1

Petter A. Urkedal announced

I would like to announce a new FRP library built on the React library. The= purpose of cumulus is to h= elp organize code which work on differential updates. The main type is the cumulus signal, which is= analogous to a react signal, except that information about the difference from the previous value is pro= vided to consumers along with the new value, when the cumulus signal changes.

So, why does a cumulus signal provide both the state and the difference to = downstream signals? That is, what is the difference between the following:?

type t1 =3D state * chan=
ge React.E     initial value and even of chang=
es *)
type t2 =3D (state, change) Cumulus.t  (* the cumulus signal *)

The former type presumes that after the consumer has received the initial s= tate, it will only need to know what changes on successive updates. This seems quite natural. It wor= ks well if, for instance, we want to reconstruct a signal holding a set of strings, given an initial set= and a series of additions and removals:

module String_set =3D Set.Make (String)

type 'a set_patch =3D [`Add o=
f string | of string]
type 'a update =3D 'a -> 'a

let patch_string_set : string set_patch -> String_se=
t.t update =3D function
 | `Add x=
 -> String_set.add x
 | `Remove x -> String_set.remove x

let integrate_strings (init, changes) =3D
  React.E.fold (fun l p -> patch_string_set p l) init changes

But what if we want to maintain a signal holding the intersection of two se= ts of strings? If we try to lift the intersection operation to work on patches, we discover that learni= ng about the addition of an element to left-hand set is not sufficient to determine whether the element= shall the added to the resulting set; we also need to know whether the element is a member of the = right-hand set. So, in this case we would instead use cumulus signals:

let cu : (String_set.=
t, string set_patch) Cumulus.t =
=3D ...
let cv : (String_set.t, string set_patch) Cumulus.t =3D ...
let cuv =3D
  let init u <=
span style=3D"color: #a0522d;">v =3D String_set.inter u v in
  let patch (u=
, du) (v, dv) r' =3D
    (match du, dv with
     | None, Some =
x when String_set.mem x u ->
        Cumulus.Patch (String_set.add x r', `Add1 x)
     ...)
  in
  Cumulus.l2 ~init ~patch cu cv

For the complete example, using integers instead of strings, see reactiveData library which deals with (linear) patching of containers.

I must also mention that there there is an OCaml project with the same name (except casing). Sorry for not checking thoroughly in advance. I hope it is not an issue in practi= se, otherwise there is still time to rename while the library is fresh.

Brr 0.0.1, a toolkit for programming browsers

Continuing this thread, Yoann Padioleau asked Daniel = B=C3=BCnzli replied

What are the differences with the default bindings provided in js_of_ocaml = to the browser APIs (e.g., js.mli, dom.mli, etc.)?

I'm not sure exactly what you are asking but:

  1. If you are asking about the way API are exposed: brr does = not type JavaScript's objects as phantom types. It simply relies on OCaml's= abstract data types and plain functions. More about this can be found in b= rr's FFI = manual and FFI cookbook.
  2. If you are asking about binding coverage, you should be able to get a s= ense of what is bound in brr here.

Regarding 2. brr's coverage of more recent browser APIs is bro= ader and more consistent than in js_of_ocaml =E2=80=93 Promise support, Fetch, Service workers,= Media capture APIs, WebGL2, Webcrypto, WebAudio, etc. Conversly older APIs supported in js_of_ocaml m= ay not supported in brr (e.g. XMLHTTPRequest). Besides brr's coverage of some of the DOM = element-specific interfaces may be shallower than in js_of_ocaml. There is however good coverage = for the HTMLMediaElement, HTMLCanvasElement, HTMLFormElement and = HTMLInputElement interfaces. For the rest the attribute and property API and the occasional trivial FFI method binding should be able to get you a long way.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C4F75E02DA for ; Tue, 3 Nov 2020 16:15:57 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=aBmF=EJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?9a23=3A58WB+hMa2mziwU7vb9sl6mtUPXoX/o7sNwtQ0KIM?= =?us-ascii?q?zox0K/jyr8bcNUDSrc9gkEXOFd2Cra4d1KyP6/urBTZIyK3CmUhKSIZLWR4BhJ?= =?us-ascii?q?detC0bK+nBN3fGKuX3ZTcxBsVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+?= =?us-ascii?q?KPjrFY7OlcS30P2594HObwlSizexfLF/IA+roQnNuMQajoRvJrgswRbVv3VEfP?= =?us-ascii?q?hby3l1LlyJhRb84cmw/J9n8ytOvv8q6tBNX6bncakmVLJUFDspPXw7683trhnD?= =?us-ascii?q?UBCA5mAAXWUMkxpHGBbK4RfnVZrsqCT6t+592C6HPc3qSL0/RDqv47t3RBLulS?= =?us-ascii?q?wIMCM38HzMisxokq1UvA6hqRJ4w47Reo6VNfx+db7Zcd4VQWdNW8BcWyxCDIO6?= =?us-ascii?q?cYsPDvEBPedDoIn5uVQFsBW/BQ62BOzy0T9Dm3v60KMm3+gkFwzNwQ4uEM8UsH?= =?us-ascii?q?nMrNv7KrocX+62wqbH0TrOdOlZ1Svn5YXSbhwtvfOBULRtesTR00kvEAbFg02M?= =?us-ascii?q?pIzhJTyV0PkGvXWH4OpgUOKvinInqx1sqTWo3MgsjpPGhoQPxlDf6Sp5wIM1Jd?= =?us-ascii?q?ykSE5netOkCJxQtyWaNotqXMwtX2FouCA7yr0fpJ60YjIGyJM9xx7QcvGKdZWD?= =?us-ascii?q?7R3/WuiLOzh4mG5ld6ylhxa06UWtyvHwWMmo3VtUsCZInNbCuH8O2hLc68WKVP?= =?us-ascii?q?Rz8lq/1DuAywzd6v1IL0AomKfVKJMswr49moYNvUnHECH7m1j7gamLfUsq/eio?= =?us-ascii?q?7v7oYrTgppKEL497lB3+MqUymsOhGeQ4NQ0OX22F9uim0r3s41H5TK1NjvIqiK?= =?us-ascii?q?bZtZTaKd4cpq6jDA9Zypoj6xGiADeh1dQYg2UIIEhZdxKAiojlI17OIPHkDfe/?= =?us-ascii?q?nlSjiy1nyOzBPr3kGpnCMGLDkK37crZh6k5c0Rczws5F651ICrENOOz8Wkv0tN?= =?us-ascii?q?DBCh82KQq0w+n9BNV6zIMeVnqDDbODP6PXq1OH/P4gL/ORZI8WoDr9KeIq5/jw?= =?us-ascii?q?gn8ihV8dZ7em0oULaHyiAvtmJECZbWLtgtcHC2cKvxAxQPbkiF2YSTJTYneyX7?= =?us-ascii?q?gm6TE0Fo2qF4bDRoe1jLObwCe7AodWZmFdBVCRDXfnaZiLV+0WZyKOOsNhnT0E?= =?us-ascii?q?VaShS488zh6irg76y71/IurT4C0YtJ3j1Nlz5+HKkRE97yd7D9+H322XU250mW?= =?us-ascii?q?YISycx3KBloEx9xVaD0a5hj/xcD9Nc/OhJXh0mOp7byux2E839VRjbfteKTFap?= =?us-ascii?q?WNOmAT4rQt0txN8OZl5xG9S/gRHD2yqqB6UZl7uRBJw79K/Xwnv/J95lxnrbyq?= =?us-ascii?q?Usi0MqTtZTOWCpnKJy+RTfC5THnkiWj6qnd6cR0DTT+GqM02aCplxUXQFqXanY?= =?us-ascii?q?Un0Tek3bpsnj6EzYVb+hE7EnPxNBycGcLqtKbcXkjVBJRfv+Itjee2Wxm2OwBB?= =?us-ascii?q?aU2LyDcIrqe2Mc3CXEFUgLjRof/XGcNQgxHiuhomTeAyJyFV/3fk/g7+1zpGmm?= =?us-ascii?q?QkMowAyGdUNs26av9hMbivGQU/YT0agFuCclpTV0BlG939fOBtSduwRvYblQbM?= =?us-ascii?q?sn71pa0GLXtxRwMJOkIa16nl4edAB3vkPy1xppFopAkc4qrHIzzApvN62UylRB?= =?us-ascii?q?dymX3Z3oILLXLnP9/Ba1Z67Nxl7e0NOW+qYT6PQksFjspwapFlck83p7zdZVyG?= =?us-ascii?q?GQ5pDFAQsdS57xVVw39xdiq7HAfiY9/5/U1WFrMaSsrjDNwdcpBO88xhakftdf?= =?us-ascii?q?K7+EGRTpE8waAsiuMPYll0KobhICJuBS9bQ7M9mod/uci+aXO7MqmC2gxywT5J?= =?us-ascii?q?97+kaT8Wx6R/Kem95PyO6elEPPAzzjin+ls9vrgsZFaSAWGiy40yeyQMZab6h2?= =?us-ascii?q?OIIKEnuGIsutx9w4iYSpE3Vf8UaLA1IdxNTvfgCYbkD02QNXxQIavC+Jgyy9mh?= =?us-ascii?q?VwmjdhlaGf2S3S36y2fR4OPChQT2lnjEvwCZCzi8EGUUOoaQkwiRbj4lz1kfsI?= =?us-ascii?q?7J9jJnXeFB8bNxP9KHtvB/Th7+vQU4t08Jot9B5vfqG5aFGeRKT6pkJFgSnkAm?= =?us-ascii?q?1VySt9cm26/JLjkE4j0T7PHDNItHPcPPpI61LH/tWFFKxJ2T4XWCRziT/WH0Wx?= =?us-ascii?q?ed6z8ofNzsqRgqWFT2ukE6ZrX2zrwIeH7nDp4H0zRwW4m+Gvl9bnFwkjzCK90M?= =?us-ascii?q?NlB3zF?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BKAwDbc6FffSIeaIFYAQkWgkSBIVIGQ?= =?us-ascii?q?AFeUQUyLoQ9gWCHJYkaAYIQhUSNZYQEgREDTxABAwENGAEOBQECBAEBgVWBQHF?= =?us-ascii?q?EAoIKAh4GAQUzEwIQAQEFAQEBAgEDAwQBEwEBDxQIhhEMQwEQAYFiDAwDA4MiA?= =?us-ascii?q?wEYAQgEBj8GBBwUDwMUAQYDAhEBFwEUCgMUARIaAYJATIJ8BAEKlCacBX8zhD4?= =?us-ascii?q?BAwMEBwIDDy4Bg2uBQg0CE4EWAYVSToMGCIQLD4FNP4ERghRJB2yCQAYMCwEBA?= =?us-ascii?q?QEBARWBEAkBCgEBAgQETIJhgl8EkBQSHQWKWYk4giyQcCsHgnCBEAQLhmmBAoZ?= =?us-ascii?q?fhDqHCIMYgSqIaIVMjnYhkyyBfoIrg2AHdwiBaYIfg2+BcokbhFmBQSqBejMaM?= =?us-ascii?q?EOCNQEBMglgDY18LxeBAgEJghoogT6BJoF1O4Jmgl9AMwIBAQctAgYBCQEBAwl?= =?us-ascii?q?1AQEFEwsBgjCIOIJFAQE?= X-IPAS-Result: =?us-ascii?q?A0BKAwDbc6FffSIeaIFYAQkWgkSBIVIGQAFeUQUyLoQ9gWC?= =?us-ascii?q?HJYkaAYIQhUSNZYQEgREDTxABAwENGAEOBQECBAEBgVWBQHFEAoIKAh4GAQUzE?= =?us-ascii?q?wIQAQEFAQEBAgEDAwQBEwEBDxQIhhEMQwEQAYFiDAwDA4MiAwEYAQgEBj8GBBw?= =?us-ascii?q?UDwMUAQYDAhEBFwEUCgMUARIaAYJATIJ8BAEKlCacBX8zhD4BAwMEBwIDDy4Bg?= =?us-ascii?q?2uBQg0CE4EWAYVSToMGCIQLD4FNP4ERghRJB2yCQAYMCwEBAQEBARWBEAkBCgE?= =?us-ascii?q?BAgQETIJhgl8EkBQSHQWKWYk4giyQcCsHgnCBEAQLhmmBAoZfhDqHCIMYgSqIa?= =?us-ascii?q?IVMjnYhkyyBfoIrg2AHdwiBaYIfg2+BcokbhFmBQSqBejMaMEOCNQEBMglgDY1?= =?us-ascii?q?8LxeBAgEJghoogT6BJoF1O4Jmgl9AMwIBAQctAgYBCQEBAwl1AQEFEwsBgjCIO?= =?us-ascii?q?IJFAQE?= X-IronPort-AV: E=Sophos;i="5.77,448,1596492000"; d="scan'208,217";a="475661380" X-MGA-submission: =?us-ascii?q?MDGXfViTv0GjDQH5IdH1cJ3jG1Xe4rsHG2kg7/?= =?us-ascii?q?4z2eLRpcLVEhWi6mqaFtjGHs7N/HOY021v8pj9J+ZIUxO1MSQvvfzctd?= =?us-ascii?q?CeduuRvELWEXnPqDA1uwfVU3vPmu9PdU9u4TCd0sWApSpXWDPrX0trM9?= =?us-ascii?q?wPQ6d2DQ5YvQfX7E7LFneEqw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 03 Nov 2020 16:15:48 +0100 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C584F5613BA; Tue, 3 Nov 2020 16:15:46 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 03 Nov 2020 16:15:46 +0100 Message-ID: <87pn4ujwt9.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 3 16:15:47 2020 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.008323, queueID=771C05613BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 27 to November 03, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Brr 0.0.1, a toolkit for programming browsers New release of Monolith (20201026) MirageOS 3.9.0 released An AST typing problem erlang 0.0.14, a toolkit to manipulate Erlang sources opam-bin.1.0.0: binary packages for opam Interesting OCaml Articles Old CWN Brr 0.0.1, a toolkit for programming browsers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Daniel B=C3=BCnzli said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 One thing I forgot, is that there is a [todomvc] example in the repo, see `todomvc.{html,ml}' in [this directory]. It doesn't use the UI toolkit you mentioned, just the basic reactive DOM support provided by [`Brr_note'] and [`Brr_note_kit']. But you can see how quickly you get reusable and composable components like [`bool_editor'] and [`string_editor']. The program structure in that example is quite similar to the one I had in the drawing app. You define a purely functional, non reactive [data model], [actions] over the data model, create small UI fragments that renders parts of your data model and generate actions events for it, gradually glue them together using note combinators and finally define a [fixed point signal] that holds the data model as massaged by the actions events of your UI (as mentioned I'd like to replace fix points by direct `let rec' and a lazy infinitesimal delay combinator). There are a few pitfalls like you should avoid retaining parts of your data model in the UI otherwise you could get outdated data come back in your model (makes for very fun and spooky bugs though). Identity in the data model is also a bit tricky, it seems in todomvc I [used] `=3D=3D'. That didn't work in the drawing app where my surfaces had properties that could be updated but they could also be linked toghether (that window belongs to that wall etc.) so I needed stable identifiers for which I introduced a little abstraction to identify values and define relations between them. One thing I remember fondly when doing the drawing app is that I would still get the odd interaction glitches you get when coding direct mouse manipulation interactions (surface definition/selection/move/transform) however thanks to the ability to denotationally reason and act (left leaning [`E.select']) on the simultaneity of events, they were easy to understand and fix in an explicit way (that is via a defining *expression*). Also if you get into [`Note'] the denotational semantics notation is not yet explained there, refer to the [one of react] it's the same. [todomvc] [this directory] [`Brr_note'] [`Brr_note_kit'] [`bool_editor'] [`string_editor'] [data model] [actions] [fixed point signal] [used] [`E.select'] [`Note'] [one of react] Yoann Padioleau asked and Daniel B=C3=BCnzli replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 How hard would it be to build on top of Brr_note something like an Elm Architecture-style toolkit? I know there's a TEA-Bucklescript library, but I'd rather use something relying on dune/jsoo. I've read somewhere else that you were a bit skeptical about the advantage of MVU (movel-view-update) over MVC, but I personnaly find the counter UI example in ELM at far simpler than the corresponding one in Brr at I don't know. I didn't look into MVU too much, but to me it's largely a remix of MVC =E2=80=93 despite what its proponents try to tell you. Sin= ce we now live in an age of software adverstising it's a bit hard to get frank assessments. As far as I'm concerned the compositionality story of MVU doesn't look great. Basically it enforces state machines on you, and composing state machines is a bit meh. In FRP state machines become signals (via `S.accum') which are highly composable entities with *fine granularity* (and bonus point, a well defined denotational semantics for equational reasoning). If you are looking for MVU I think you can simply jump on [LexiFI's vdom]. But when I see how you get to [compose two models] in that paradigm, I'm not convinced. There=E2=80=99s no need for those E.select. The UI is IMHO more declarative in ELM. That example could be rewritten (I didn't write the examples in this repo) to be more like the ELM one in it's declarations. But I think the ELM example is also more rigid. You may not like that `E.select' on this toy example, but you may get to enjoy it you when you start composing larger systems from smaller components. [LexiFI's vdom] [compose two models] Yaron Minsky then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You might be interested in Bonsai! At some level, you can think of it as a library for building composable state machines. It uses [Incremental] as its engine for incrementalizing the computation of views, with a virtual-dom implementation underneath. It's the primary tool we use for building UIs inside of Jane Street. In some ways, Bonsai is like Elm, but it has its own interesting ideas. Some of the concepts are borrowed from this paper: though I won't pretend to understand this paper myself! Bonsai doesn't yet have enough public-facing documentation, and really the bleeding edge version on github is considerably better and more usable than the one released into opam. But there's at least one public-facing UI that's built with it, if you want a real-world example. [Incremental] Yoann Padioleau replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thx for the links! The memtrace viewer example is pretty cool, but Bonsai looks far more complicated than ELM. If you look at the counter example (the hello world of UI), here: and you compare it to the one in ocaml-vdom (thx @dbuenzli for the link) at there's a huge difference in simplicity. Ty Overby then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Hi Aryx, I wrote the Bonsai example that you linked, and it certainly isn't the most concise, but that's because it was built for a tutorial on building small components (one counter is a single component), how to use more advanced combinators (Bonsai.assoc), and how to move data from one component to another (the add_counter_component into the associated counters component.) I think it's a great example of the power of structuring an UI as a DAG rather than a tree, but it definitely doesn't make for the most concise code! In the example, the comments that look like "CODE_EXCERPT_BEGIN" are actually preprocessor definitions that are used in the (honestly, kinda out of date) [tutorial here]. A bonsai app that wasn't written for such a tutorial would look more like [this]. [tutorial here] [this] New release of Monolith (20201026) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 It is my pleasure to announce a major new release of Monolith. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update && opam install monolith =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Monolith offers facilities for testing an OCaml library (for instance, a data structure implementation) by comparing it against a reference implementation. It can be used to perform either random testing or fuzz testing. Fuzz testing relies on the external tool afl-fuzz. More information on Monolith is available [here] and in the draft paper [Strong Automated Testing of OCaml Libraries]. [here] [Strong Automated Testing of OCaml Libraries] MirageOS 3.9.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Martin Lucina announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the release of MirageOS 3.9.0. Our last release announcement was for [MirageOS 3.6.0], so we will also cover changes since 3.7.x and 3.8.x in this announcement. New features: =E2=80=A2 The Xen backend has been [re-written from scratch] to be based = on Solo5, and now supports PVHv2 on Xen 4.10 or higher, and QubesOS 4.0. =E2=80=A2 As part of this re-write, the existing Mini-OS based implementa= tion has been retired, and all non-UNIX backends now use a unified OCaml runtime based on `ocaml-freestanding'. =E2=80=A2 OCaml runtime settings settable via the `OCAMLRUNPARAM' environ= ment variable are now exposed as unikernel boot parameters. For details, refer to [#1180]. Security posture improvements: =E2=80=A2 With the move to a unified Solo5 and ocaml-freestanding base MirageOS unikernels on Xen gain several notable improvements to their overall security posture such as SSP for all C code, W^X, and malloc heap canaries. For details, refer to the mirage-xen 6.0.0 release [announcement]. API breaking changes: =E2=80=A2 Several Xen-specific APIs have been removed or replaced, uniker= nels using these may need to be updated. For details, refer to the mirage-xen 6.0.0 release [announcement]. Other notable changes: =E2=80=A2 `Mirage_runtime' provides event loop enter and exit hook registration ([#1010]). =E2=80=A2 All MirageOS backends now behave similarly on a successful exit= of the unikernel: they call `exit' with the return value 0, thus `at_exit' handlers are now executed ([#1011]). =E2=80=A2 The unix backend used a toplevel exception handler, which has b= een removed. All backends now behave equally with respect to exceptions. =E2=80=A2 Please note that the `Mirage_net.listen' function still install= s an exception handler, which will be removed in a future release. The out of memory exception is no longer caught by `Mirage_net.listen' ([#1036]). =E2=80=A2 To reduce the number of OPAM packages, the `mirage-*-lwt' packa= ges are now deprecated. `Mirage_net' (and others) now use `Lwt.t' directly, and their `buffer' type is `Cstruct.t' ([#1004]). =E2=80=A2 OPAM files generated by `mirage configure' now include opam bui= ld and installation instructions, and also an URL to the Git `origin' ([#1022]). Known issues: =E2=80=A2 `mirage configure' fails if the unikernel is under version cont= rol and no `origin' remote is present ([#1188]). =E2=80=A2 The Xen backend has issues with event delivery if built with an Alpine Linux GCC toolchain. As a work-around, please use a Fedora or Debian based toolchain. Acknowledgements: =E2=80=A2 Thanks to Roger Pau Monn=C3=A9, Andrew Cooper and other core Xen developers for help with understanding the specifics of how Xen PVHv2 works, and how to write an implementation from scratch. =E2=80=A2 Thanks to Marek Marczykowski-G=C3=B3recki for help with the Qub= esOS specifics, and for forward-porting some missing parts of PVHv2 to QubesOS version of Xen. =E2=80=A2 Thanks to @palainp on Github for help with testing on QubesOS. [MirageOS 3.6.0] [re-written from scratch] [#1180] [announcement] [#1010] [#1011] [#1036] [#1004] [#1022] [#1188] An AST typing problem =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Chet Murthy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This note discusses the beginnings of an OCaml attribute-grammar evaluator generator. You can find this code on github at `camlp5/pa_ppx_ag'. All of this code is implemented using `camlp5' and the `pa_ppx' suite of PPX rewriters. Caveat: this code is less than a week old, so it's changing fast. In the unlkely event that anybody out there is actually interested in using this code, I'm happy to help in any way I can. But just be aware that it's changing -really- fast. Attribute Grammars for the multipass AST analysis problem =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A year-and-a-half ago, the OP "An AST Typing Problem" () raised the problem of how to deal with ASTs, in the presence of multiple passes of program-analysis, each of which will want to hang various bits of data off nodes. The author of the OP pointed also at a couple of posts on Lambda-the-Ultimate (LtU), discussing related problems. The author notes: There=E2=80=99s a lot of passes, many of which depend on the previous ones, each one making some slight change to the AST which might or might not result in having to walk through the whole AST to catch all occurrences of that particular node. Clearly you=E2=80=99ll want to encode semantic errors in the types, so each pass ends up having its own unique AST, each depending on the previous one. To change a single node deep in the AST I have to write about a hundred lines of types and mapping functions=E2=80=99 worth of boilerplate. Any change in the lower levels of the AST bubbles up to the higher ones, and refactoring becomes a nightmare. I've been thinking about this problem ever since, and at the time, had suggested that while it seemed like attribute-grammars might be a workable solution, they were a pretty heavy hammer. It doesn't help (of course) that there exist no attribute-grammar evaluator generators, for OCaml. Also, at least in the LtU threads, there was discussion of modifying the AST, and having the analyses automatically be updated for the modified AST. Obviously this would require an incremental re-attribution algorithm: more complexity and again, something that isn't implemented for OCaml. But imagine that there existed an attribute-grammar evaluator generator for OCaml. So for a simple language of expressions, with an assignment-operator, we could write an evaluator as an attribute-grammar. Imagine that you could write an ast like this (test1_ast.ml): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type expr =3D =E2=94=82 INT of int =E2=94=82 | BINOP of binop * expr * expr =E2=94=82 | UNOP of unop * expr =E2=94=82 | REF of string =E2=94=82 | ASSIGN of string * expr =E2=94=82 | SEQ of expr * expr =E2=94=82 and unop =3D UPLUS | UMINUS =E2=94=82 and binop =3D PLUS | MINUS | STAR | SLASH | PERCENT =E2=94=82 and prog =3D expr =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and then (having elsewhere written parser/pretty-printer) declare attributes on those types (test1_variants.ml): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Attributed =3D struct =E2=94=82 [%%import: Test1_ast.expr] =E2=94=82 [@@deriving attributed { =E2=94=82 attributed_module_name =3D AT =E2=94=82 ; normal_module_name =3D OK =E2=94=82 ; attributes =3D { =E2=94=82 expr =3D { =E2=94=82 inh_env =3D [%typ: (string * int) list] =E2=94=82 ; syn_env =3D [%typ: (string * int) list] =E2=94=82 ; value_ =3D [%typ: int] =E2=94=82 } =E2=94=82 ; prog =3D { =E2=94=82 value_ =3D [%typ: int] =E2=94=82 } =E2=94=82 ; binop =3D { =E2=94=82 oper =3D [%typ: int -> int -> int] =E2=94=82 } =E2=94=82 ; unop =3D { =E2=94=82 oper =3D [%typ: int -> int] =E2=94=82 } =E2=94=82 } =E2=94=82 }] =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and then declare attribute equations (test1_ag.ml): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module REC =3D struct =E2=94=82 [%%import: Test1_variants.Attributed.AT.expr] =E2=94=82 [@@deriving ag { =E2=94=82 module_name =3D AG =E2=94=82 ; storage_mode =3D Records =E2=94=82 ; axiom =3D prog =E2=94=82 ; attributes =3D { =E2=94=82 expr =3D { =E2=94=82 inh_env =3D [%typ: (string * int) list] =E2=94=82 ; syn_env =3D [%typ: (string * int) list] =E2=94=82 ; value_ =3D [%typ: int] =E2=94=82 } =E2=94=82 ; prog =3D { =E2=94=82 value_ =3D [%typ: int] =E2=94=82 } =E2=94=82 ; binop =3D { =E2=94=82 oper =3D [%typ: int -> int -> int] =E2=94=82 } =E2=94=82 ; unop =3D { =E2=94=82 oper =3D [%typ: int -> int] =E2=94=82 } =E2=94=82 } =E2=94=82 ; attribution =3D { =E2=94=82 expr__INT =3D ( =E2=94=82 [%nterm 0].syn_env :=3D [%nterm 0].inh_env ; =E2=94=82 [%nterm 0].value_ :=3D [%prim 1].intval =E2=94=82 ) =E2=94=82 ; expr__BINOP =3D ( =E2=94=82 [%nterm expr.(1)].inh_env :=3D [%nterm expr].inh_env ; =E2=94=82 [%nterm expr.(2)].inh_env :=3D [%nterm expr.(1)].syn_env ; =E2=94=82 [%nterm expr].syn_env :=3D [%nterm expr.(2)].syn_env ; =E2=94=82 [%nterm expr].value_ :=3D [%nterm binop.(1)].oper [%nterm expr= .(1)].value_ [%nterm =E2=94=82 expr.(2)].value_ =E2=94=82 ) =E2=94=82 ; expr__UNOP =3D ( =E2=94=82 [%nterm expr.(1)].inh_env :=3D [%nterm expr].inh_env ; =E2=94=82 [%nterm expr].syn_env :=3D [%nterm expr.(1)].syn_env ; =E2=94=82 [%nterm expr].value_ :=3D [%nterm unop.(1)].oper [%nterm expr.= (1)].value_ =E2=94=82 ) =E2=94=82 ; expr__REF =3D ( =E2=94=82 [%nterm 0].syn_env :=3D [%nterm 0].inh_env ; =E2=94=82 [%nterm 0].value_ :=3D List.assoc [%prim 1].stringval [%nterm = 0].inh_env =E2=94=82 ) =E2=94=82 ; expr__ASSIGN =3D ( =E2=94=82 [%nterm 0].syn_env :=3D ([%prim 1].stringval, [%nterm expr.(1)= ].value_) :: [%nterm =E2=94=82 expr.(1)].syn_env ; =E2=94=82 [%nterm expr.(1)].inh_env :=3D [%nterm 0].inh_env ; =E2=94=82 [%nterm 0].value_ :=3D [%nterm expr.(1)].value_ =E2=94=82 ) =E2=94=82 ; expr__SEQ =3D ( =E2=94=82 [%nterm 1].inh_env :=3D [%nterm 0].inh_env ; =E2=94=82 [%nterm 2].inh_env :=3D [%nterm 1].syn_env ; =E2=94=82 [%nterm 0].syn_env :=3D [%nterm 2].syn_env ; =E2=94=82 [%nterm 0].value_ :=3D [%nterm 2].value_ =E2=94=82 ) =E2=94=82 ; prog =3D ( =E2=94=82 [%nterm 1].inh_env :=3D [] ; =E2=94=82 [%nterm 0].value_ :=3D [%nterm 1].value_ ; =E2=94=82 assert True =E2=94=82 ) =E2=94=82 ; unop__UPLUS =3D ( =E2=94=82 [%nterm unop].oper :=3D fun x -> x =E2=94=82 ) =E2=94=82 ; unop__UMINUS =3D ( =E2=94=82 [%nterm unop].oper :=3D fun x -> (- x) =E2=94=82 ) =E2=94=82 ; binop__PLUS =3D ( =E2=94=82 [%nterm binop].oper :=3D (+) =E2=94=82 ) =E2=94=82 ; binop__MINUS =3D ( =E2=94=82 [%nterm binop].oper :=3D (-) =E2=94=82 ) =E2=94=82 ; binop__STAR =3D ( =E2=94=82 [%nterm binop].oper :=3D fun a b -> a*b =E2=94=82 ) =E2=94=82 ; binop__SLASH =3D ( =E2=94=82 [%nterm binop].oper :=3D (/) =E2=94=82 ) =E2=94=82 ; binop__PERCENT =3D ( =E2=94=82 [%nterm binop].oper :=3D (mod) =E2=94=82 ) =E2=94=82 } =E2=94=82 }] =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and then, turning a crank, you would get an evaluator: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let test_records ctxt =3D =E2=94=82 assert_equal 3 ({| x :=3D 1 ; x ; y :=3D 2 ; x + y |} |> pa_p= rog_attributed |> REC.AG.evaluate) =E2=94=82 ; assert_equal 0 ({| x :=3D 1 ; y :=3D 2 ; x / y |} |> pa_prog_= attributed |> REC.AG.evaluate) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `pa_prog_attributed' is a parser that parses the surface syntax into an AST, which has empty slots for all attributes, and `REC.AG.evaluate' evaluates attributes in its argument AST, and then returns a tuple of all the synthesized attributes of the root node. Retaining familiar surface syntax for pattern-matching and constructing ASTs =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C Now, we don't want to give up easy pattern-matching and construction of the AST, just because the AST has attributes strewn throughout it. But we don't have to: with Camlp5's "quotations", once we define a surface syntax parser for the basic AST (unadorned with attributes =E2=80= =93 viz. `test1_ast.ml'), we can use that to bootstrap ourselves to a surface syntax parser for expressions and patterns over that AST, and then in a similar manner we can get them for the AST adorned with attributes. This has already been done for hashconsed ASTs, and ASTs with built-in unique-IDs, and and doing it for "attributed ASTs" isn't any harder. Those examples can be found in the github project `camlp5/pa_ppx_q_ast'. Limitations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C There are still limitations. 1. The current code only implements topological-order evaluation. That is, it builds the entire dependency-graph, topologically-sorts it, and then evaluates attributes. This is =E2=80=A6. suboptimal, whe= n we well know that almost all interesting AGs are already in the class of ordered attribute-grammars (OAGs). I plan to implement the OAG evaluation strategy next. 2. Traditionally AGs are defined over "productions" which are sequences of nonterminals and terminals. This doesn't correspond to the way we define OCaml constructor data-types. So instead of a constructor like =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type expr =3D =E2=94=82 ... | Call of name * arg_list =E2=94=82 and arg_list =3D NoArgs | SomeArgs of expr * arg_list =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 we might want to use ~ 'a list~ =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type expr =3D =E2=94=82 ... | Call of name * expr list =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Problem is: defining attribute-equations for (effectively) an array of nodes, is not part of the standard lingo of AGs. But I believe we can invent new syntax and make this succinct. 3. Storage optimization. A naive implementation of AGs can store all attributes ever computed, at all the nodes in the AST. This can use a lot of memory. But there are well-known techniques to discard attributes once they'll never more be needed in the rest of the attribute-evaluation, and I plan to implement these techniques. There's an entire literature on things like remote-references in attribute grammars, aggregates, and other things, all of which can probably be usefully employed. Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C I think that attribute-grammars could be a useful way to structure complex multipass program-analysis, just as they used to do back in the good ol' days. Maybe worth a look-see! erlang 0.0.14, a toolkit to manipulate Erlang sources =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: ostera announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hej, hope you're staying safe :raised_hands: I'm excited to share with you the first release of `erlang'. *tl;dr*: _parser/lexer/ast/printer for Erlang_ Description =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C `erlang' is a toolkit for manipulating Standard Erlang and Core Erlang sources and their abstract syntax trees according to the Erlang specifications. Version 0.0.14 provides: =E2=80=A2 A lexer/parser written in Menhir for Standard Erlang =E2=80=A2 ASTs for Core Erlang and Standard Erlang =E2=80=A2 An AST helper module for constructing Standard Erlang programs =E2=80=A2 A printer for the Standard Erlang AST (of highly volatile prettiness) =E2=80=A2 Support to turn ASTs to S-expressions =E2=80=A2 `erldump', a binary tool for reading Erlang sources and printing their concrete syntax trees as S-expressions. It is distributed under Apache-2.0 license, depends on Menhir and Cmdliner, and it is being developed as part of the Caramel project. =E2=80=A2 *PR*: =E2= =80=93 should be on opam.ocaml.org sometime tomorrow :) =E2=80=A2 *Homepage*: =E2=80=A2 *Install*: `opam install erlang' =E2=80=A2 *API Docs & manuals*: maybe on next release, but _follow the ty= pes_, and the `Erlang.Ast_helper' module is modeled after the `Parsing.Ast_helper' so it should feel familiar. I started writing `erlang' to let Caramel do an entirely symbolic compilation from the OCaml typedtree that would still allow for other passes/checks to be made cleanly. It's come with a decent number of tests, and it can parse some OTP modules with small modifications. There's [a few outstanding issues] regarding the parsing for the next release, but it should be a starting point for anyone wanting to read sources and _do something_ with them. I plan on cover these issues in the rest of the year, but as with all open source, it may take longer. I'd like to add a few other things, like an AST invariants module to check that ASTs are actually valid Erlang programs, and transformations more suitable for static analyses of the sources. My thanks go to @antron, @c-cube, @Drup, @rgrinberg, and @mseri for helping me get around the OCaml compiler, Menhir, and eventually to get this version split from Caramel and released independently. Also a shoutout to the Js_of_ocaml project that served as a starting point for the parser/lexer work here. If you can give me some feedback on the design and implementation, I'd very much like to hear your thoughts :slight_smile: For those of you hoping to start using it, _do not_ let it crash. [a few outstanding issues] opam-bin.1.0.0: binary packages for opam =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fabrice Le Fessant announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 I am happy to announce the first stable release of `opam-bin', version 1.0.0, a framework to CREATE, USE and SHARE binary relocatable packages with opam, to speed-up installation of packages. It is easily installable from opam-repository, and available on Github: With opam-bin, you can : =E2=80=A2 build binary packages while installing their source counterpart= with opam =E2=80=A2 automatically reuse previously created binary packages instead = of compiling them again =E2=80=A2 export and share your binary packages as part of opam repositor= ies for other users/computers to use `opam-bin' is a framework in 3 parts : =E2=80=A2 a tool `opam-bin' to create binary packages: =E2=80=A2 a set of patches to make some packages relocatable (`opam-bin' = will apply them automatically when building packages), including patches to make the OCaml distribution relocatable from version 4.02.0 to 4.11.1: =E2=80=A2 a set of contributed repositories of binary packages. For now, = there is only one contribution, during the summer, by Origin Labs : containing 5 repos, among which the "4.10.0" repo contains more than 1800 packages. These repos can be used DIRECTLY WITH opam, WITHOUT USING opam-bin. This is the first stable release: =E2=80=A2 Specific support has been added in the current `master' branch = of `opam' to make working with this version more convenient, by printing pre- and post- installation messages. Yet, it will still work with previous version of opam, but with no output on the terminal when calling opam. =E2=80=A2 The `sharing' option can be enabled to share files with hard-li= nks between switches, making the creation of new local switches almost costless in time and disk space. `opam-bin' is a collaborative work between OCamlPro and Origin Labs. `opam-bin' is particularly useful if you create many local switches, as they become unexpensive. Tools like Drom (an OCaml project scaffolder, ) can take advantage of that to provide a cargo-like experience. Interesting OCaml Articles =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Ryan Slade announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Anyone who's been following this blog probably saw this coming: It's an interesting read and hopefully can be used as constructive criticism in order to improve the state of the OCaml ecosystem. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 27 to Novembe= r 03, 2020.

Brr 0.0.1, a toolkit for programming browsers

Continuing this thread, Daniel B=C3=BCnzli said

One thing I forgot, is that there is a todo= mvc example in the repo, see todomvc.{html,ml} in this directory.

It doesn't use the UI toolkit you mentioned, just the basic reactive DOM su= pport provided by Brr_note and <= code>Brr_note_kit. But you can see how quickly you get reusable and composable components like bool_editor and string_editor.

The program structure in that example is quite similar to the one I had in = the drawing app. You define a purely functional, non reactive data model, actions over the data model, create small UI fragments that renders parts of your d= ata model and generate actions events for it, gradually glue them together using note combinators = and finally define a fixed point signal that holds the data model as massaged by the actions events of your UI (as = mentioned I'd like to replace fix points by direct let rec and a lazy infinitesimal = delay combinator).

There are a few pitfalls like you should avoid retaining parts of your data= model in the UI otherwise you could get outdated data come back in your model (makes for very fun and= spooky bugs though). Identity in the data model is also a bit tricky, it seems in todomvc I used =3D=3D. That didn't work in the drawing app where my surfaces = had properties that could be updated but they could also be linked toghether (that window belongs to that wall etc.)= so I needed stable identifiers for which I introduced a little abstraction to identify values = and define relations between them.

One thing I remember fondly when doing the drawing app is that I would stil= l get the odd interaction glitches you get when coding direct mouse manipulation interactions (surface definition/selection/move/transform) however thanks to the ability to denot= ationally reason and act (left leaning E.select) on the simultaneity of events, they were easy to understand and fix in an explicit= way (that is via a defining expression).

Also if you get into Note the denotational semantics notation is not yet explained there, refer to the one of react it's the same.

Yoann Padioleau asked and Daniel B=C3=BCnzli replied<= /h3>

How hard would it be to build on top of Brr_note something like an Elm Arch= itecture-style toolkit? I know there's a TEA-Bucklescript library, but I'd rather use something relyi= ng on dune/jsoo.

I've read somewhere else that you were a bit skeptical about the advantage = of MVU (movel-view-update) over MVC, but I personnaly find the counter UI example in ELM at https://gu= ide.elm-lang.org/architecture/buttons.html far simpler than the corresponding one in Brr at = https://github.com/barko/brr-eg/blob/master/counter/counter.ml

I don't know. I didn't look into MVU too much, but to me it's largely a rem= ix of MVC =E2=80=93 despite what its proponents try to tell you. Since we now live in an age of software adverst= ising it's a bit hard to get frank assessments.

As far as I'm concerned the compositionality story of MVU doesn't look grea= t. Basically it enforces state machines on you, and composing state machines is a bit meh. In FRP st= ate machines become signals (via S.accum) which are highly composable entities with fin= e granularity (and bonus point, a well defined denotational semantics for equational reasoning).

If you are looking for MVU I think you can simply jump on LexiFI's vdom. But when I see how you get to compose two models in that paradigm, I'm not convinced.

There=E2=80=99s no need for those E.select. The UI is IMHO more declarative= in ELM.

That example could be rewritten (I didn't write the examples in this repo) = to be more like the ELM one in it's declarations.

But I think the ELM example is also more rigid. You may not like that E.select on this toy example, but you may get to enjoy it you when you start composing larger systems fro= m smaller components.

Yaron Minsky then said

You might be interested in Bonsai! At some level, you can think of it as a = library for building composable state machines. It uses Incremental as its engine for incrementalizing the computation of views, with a virtual-dom im= plementation underneath.

https://github.com/janestr= eet/bonsai

It's the primary tool we use for building UIs inside of Jane Street.

In some ways, Bonsai is like Elm, but it has its own interesting ideas. Som= e of the concepts are borrowed from this paper:

h= ttps://www.cl.cam.ac.uk/~jdy22/papers/the-arrow-calculus.pdf

though I won't pretend to understand this paper myself!

Bonsai doesn't yet have enough public-facing documentation, and really the = bleeding edge version on github is considerably better and more usable than the one released into op= am. But there's at least one public-facing UI that's built with it, if you want a real-world example.

https://blog.janestreet.com/finding-memory-leaks-with-memtrace/

Yoann Padioleau replied

Thx for the links!

The memtrace viewer example is pretty cool, but Bonsai looks far more compl= icated than ELM. If you look at the counter example (the hello world of UI), here: https://github.com/janestreet/bonsai= /blob/master/examples/counters/lib/bonsai_web_counters_example.ml

and you compare it to the one in ocaml-vdom (thx @dbuenzli for the link) at https://github.com/LexiFi/ocaml-vdom/blob/master/examples/c= ounters/counters.ml

there's a huge difference in simplicity.

Ty Overby then said

Hi Aryx, I wrote the Bonsai example that you linked, and it certainly isn't= the most concise, but that's because it was built for a tutorial on building small components (on= e counter is a single component), how to use more advanced combinators (Bonsai.assoc), and how to= move data from one component to another (the add_counter_component into the associated counter= s component.) I think it's a great example of the power of structuring an UI as a DAG rather than a tr= ee, but it definitely doesn't make for the most concise code!

In the example, the comments that look like "CODE_EXCERPT_BEGIN" are actual= ly preprocessor definitions that are used in the (honestly, kinda out of date) tutorial here. A bonsai app that wasn't written for such a tutorial would look more like this.

New release of Monolith (20201026)

Fran=C3=A7ois Pottier announced

It is my pleasure to announce a major new release of Monolith.

opam update && opam install monolith

Monolith offers facilities for testing an OCaml library (for instance, a da= ta structure implementation) by comparing it against a reference implementation. It can be used to perfo= rm either random testing or fuzz testing. Fuzz testing relies on the external tool afl-fuzz.

More information on Monolith is available here and in the draft paper Strong Automated Testing of OCaml Libraries.

MirageOS 3.9.0 released

Martin Lucina announced

We are pleased to announce the release of MirageOS 3.9.0.

Our last release announcement was for MirageOS 3.6.0, so we will also cover changes since 3.7.x and 3.8.x in this announcement.

New features:

  • The Xen backend has been re-written from scratch to be based on Solo5, and now suppor= ts PVHv2 on Xen 4.10 or higher, and QubesOS 4.0.
  • As part of this re-write, the existing Mini-OS based implementation has= been retired, and all non-UNIX backends now use a unified OCaml runtime ba= sed on ocaml-freestanding.
  • OCaml runtime settings settable via the OCAMLRUNPARAM envi= ronment variable are now exposed as unikernel boot parameters. For details,= refer to #1180.=

Security posture improvements:

  • With the move to a unified Solo5 and ocaml-freestanding base MirageOS u= nikernels on Xen gain several notable improvements to their overall securit= y posture such as SSP for all C code, W^X, and malloc heap canaries. For de= tails, refer to the mirage-xen 6.0.0 release announcement.

API breaking changes:

  • Several Xen-specific APIs have been removed or replaced, unikernels usi= ng these may need to be updated. For details, refer to the mirage-xen 6.0.0= release announcement.

Other notable changes:

  • Mirage_runtime provides event loop enter and exit hook reg= istration (#1010= ).
  • All MirageOS backends now behave similarly on a successful exit of the = unikernel: they call exit with the return value 0, thus = at_exit handlers are now executed (#1011).
  • The unix backend used a toplevel exception handler, which has been remo= ved. All backends now behave equally with respect to exceptions.
  • Please note that the Mirage_net.listen function still inst= alls an exception handler, which will be removed in a future release. The o= ut of memory exception is no longer caught by Mirage_net.listen (#1036).
  • To reduce the number of OPAM packages, the mirage-*-lwt pa= ckages are now deprecated. Mirage_net (and others) now use Lwt.t directly, and their buffer type is Cstru= ct.t (#1004= ).
  • OPAM files generated by mirage configure now include opam = build and installation instructions, and also an URL to the Git origi= n (#1022)= .

Known issues:

  • mirage configure fails if the unikernel is under version c= ontrol and no origin remote is present (#1188).
  • The Xen backend has issues with event delivery if built with an Alpine = Linux GCC toolchain. As a work-around, please use a Fedora or Debian based = toolchain.

Acknowledgements:

  • Thanks to Roger Pau Monn=C3=A9, Andrew Cooper and other core Xen develo= pers for help with understanding the specifics of how Xen PVHv2 works, and = how to write an implementation from scratch.
  • Thanks to Marek Marczykowski-G=C3=B3recki for help with the QubesOS spe= cifics, and for forward-porting some missing parts of PVHv2 to QubesOS vers= ion of Xen.
  • Thanks to @palainp on Github for help with testing on QubesOS.

An AST typing problem

Chet Murthy announced

This note discusses the beginnings of an OCaml attribute-grammar evaluator generator. You can find this code on github at camlp5/pa_p= px_ag.

All of this code is implemented using camlp5 and the pa_= ppx suite of PPX rewriters.

Caveat: this code is less than a week old, so it's changing fast. In the unlkely event that anybody out there is actually interested in using this code, I'm happy to help in any way I can. But just be aware that it's changing -really- fast.

Attribute Grammars for the multipass AST analysis pro= blem

A year-and-a-half ago, the OP "An AST Typing Problem" (https:/= /discuss.ocaml.org/t/an-ast-typing-problem/3677) raised the problem of how to deal with ASTs, in the presence of multiple passes of program-analysis, each of which will want to hang various bits of data off nodes. The author of the OP pointed also at a couple of posts on Lambda-the-Ultimate (LtU), discussing related problems.

The author notes:

There=E2=80=99s a lot of passes, many of which depend on the previous ones, each one making some slight change to the AST which might or might not result in having to walk through the whole AST to catch all occurrences of that particular node. Clearly you=E2=80=99ll want to encode semantic errors in the types, so each pass ends up having its own unique AST, each depending on the previous one. To change a single node deep in the AST I have to write about a hundred lines of types and mapping functions=E2=80=99 worth of boilerplate. Any change in the lower levels of the AST bubbles up to the higher ones, and refactoring becomes a nightmare.

I've been thinking about this problem ever since, and at the time, had suggested that while it seemed like attribute-grammars might be a workable solution, they were a pretty heavy hammer. It doesn't help (of course) that there exist no attribute-grammar evaluator generators, for OCaml. Also, at least in the LtU threads, there was discussion of modifying the AST, and having the analyses automatically be updated for the modified AST. Obviously this would require an incremental re-attribution algorithm: more complexity and again, something that isn't implemented for OCaml.

But imagine that there existed an attribute-grammar evaluator generator for OCaml. So for a simple language of expressions, with an assi= gnment-operator, we could write an evaluator as an attribute-grammar. Imagine that you could write an ast like this (test1_ast.ml):

type expr =3D
    INT <=
span style=3D"color: #a020f0;">of int
  | BINOP=
 of binop * expr * expr
  | UNOP =
of unop * expr
  | REF <=
span style=3D"color: #a020f0;">of string
  | ASSIGN of string * expr
  | SEQ <=
span style=3D"color: #a020f0;">of expr * expr
and unop =3D UPLUS | UMINUS
and binop =3D PLUS | MINUS | STAR | SLASH | PERCENT
and prog =3D expr

and then (having elsewhere written parser/pretty-printer) declare attributes on those types (test1_variants.ml):

module Attributed =3D struct
  [%%import: Test1_ast.expr]
  [@@deriving attributed {
    attributed_module_name =3D AT
  ; normal_module_name =3D OK
  ; attributes =3D {
      expr =3D {
        inh_env =3D [%typ: (string * int) l=
ist]
      ; syn_env =3D [%typ: (string * int) l=
ist]
      ; value_ =3D [%typ: int]
      }
    ; prog =3D {
        value_ =3D [%typ: int]
      }
    ; binop =3D {
        oper =3D [%typ: int -> int ->=
 int]
      }
    ; unop =3D {
        oper =3D [%typ: int -> int]
      }
    }
  }]
end

and then declare attribute equations (test1_ag.ml):

module REC =3D struct
[%%import=
: Test1_variants.Attributed.AT.expr<=
span style=3D"color: #483d8b; background-color: #ebebeb;">]
  [@@deriving ag {
    module_name =3D AG
  ; storage_mode =3D Records
  ; axiom =3D prog
  ; attributes =3D {
      expr =3D {
        inh_env =3D [%typ: (string * int) l=
ist]
      ; syn_env =3D [%typ: (string * int) l=
ist]
      ; value_ =3D [%typ: int]
      }
    ; prog =3D {
        value_ =3D [%typ: int]
      }
    ; binop =3D {
        oper =3D [%typ: int -> int ->=
 int]
      }
    ; unop =3D {
        oper =3D [%typ: int -> int]
      }
    }
  ; attribution =3D {
      expr__INT =3D (
        [%nterm 0].syn_env :=3D [%nterm 0].=
inh_env ;
        [%nterm 0].value_ :=3D [%prim 1].in=
tval
      )
    ; expr__BINOP =3D (
        [%nterm expr.(1)].inh_env :=3D [%nt=
erm expr].inh_env ;
        [%nterm expr.(2)].inh_env :=3D [%nt=
erm expr.(1)].syn_env ;
        [%nterm expr].syn_env :=3D [%nterm =
expr.(2)].syn_env ;
        [%nterm expr].value_ :=3D [%nterm b=
inop.(1)].oper [%nterm expr.(1)].value_ [%nterm
expr.(2)].value_
      )
    ; expr__UNOP =3D (
        [%nterm expr.(1)].inh_env :=3D [%nt=
erm expr].inh_env ;
        [%nterm expr].syn_env :=3D [%nterm =
expr.(1)].syn_env ;
        [%nterm expr].value_ :=3D [%nterm u=
nop.(1)].oper [%nterm expr.(1)].value_
      )
    ; expr__REF =3D (
        [%nterm 0].syn_env :=3D [%nterm 0].=
inh_env ;
        [%nterm 0].value_ :=3D List.assoc [=
%prim 1].stringval [%nterm 0].inh_env
      )
    ; expr__ASSIGN =3D (
        [%nterm 0].syn_env :=3D ([%prim 1].=
stringval, [%nterm expr.(1)].value_) :: [%nterm
expr.(1)].syn_env ;
        [%nterm expr.(1)].inh_env :=3D [%nt=
erm 0].inh_env ;
        [%nterm 0].value_ :=3D [%nterm expr=
.(1)].value_
      )
    ; expr__SEQ =3D (
        [%nterm 1].inh_env :=3D [%nterm 0].=
inh_env ;
        [%nterm 2].inh_env :=3D [%nterm 1].=
syn_env ;
        [%nterm 0].syn_env :=3D [%nterm 2].=
syn_env ;
        [%nterm 0].value_ :=3D [%nterm 2].v=
alue_
      )
    ; prog =3D (
        [%nterm 1].inh_env :=3D [] ;
        [%nterm 0].value_ :=3D [%nterm 1].v=
alue_ ;
        assert True
      )
    ; unop__UPLUS =3D (
        [%nterm unop].oper :=3D fun x ->=
 x
      )
    ; unop__UMINUS =3D (
        [%nterm unop].oper :=3D fun x ->=
 (- x)
      )
    ; binop__PLUS =3D (
        [%nterm binop].oper :=3D (+)
      )
    ; binop__MINUS =3D (
        [%nterm binop].oper :=3D (-)
      )
    ; binop__STAR =3D (
        [%nterm binop].oper :=3D fun a b -&=
gt; a*b
      )
    ; binop__SLASH =3D (
        [%nterm binop].oper :=3D (/)
      )
    ; binop__PERCENT =3D (
        [%nterm binop].oper :=3D (mod)
      )
    }
  }]
end

and then, turning a crank, you would get an evaluator:

let test_records ctxt =3D
  assert_equal 3 ({| x :=3D 1 ; x ; y :=3D =
2 ; x + y |} |> pa_prog_at=
tributed |> REC.AG.evaluate)
; assert_equal 0 ({| x :=3D 1 ; y :=3D 2 ; =
x / y |} |> pa_prog_attrib=
uted |> REC.AG.evaluate)

where pa_prog_attributed is a parser that parses the surface s= yntax into an AST, which has empty slots for all attributes, and REC.AG.evaluate evaluates attributes in its argument AST, and = then returns a tuple of all the synthesized attributes of the root node.

Retaining familiar surface syntax for pattern-matchin= g and constructing ASTs

Now, we don't want to give up easy pattern-matching and construction of the AST, just because the AST has attributes strewn throughout it. But we don't have to: with Camlp5's "quotations", once we define a surface syntax parser for the basic AST (unadorned with attributes – viz. test1_ast.ml), we can use that to bootstrap ourselves to a surface syntax parser for expressions and patterns over that AST, and then in a similar manner we can get them for the AST adorned with attributes.

This has already been done for hashconsed ASTs, and ASTs with built-in unique-IDs, and and doing it for "attributed ASTs" isn't any harder. Those examples can be found in the github project camlp5/pa_ppx_q_ast.

Limitations

There are still limitations.

  1. The current code only implements topological-order evaluation. That is, it builds the entire dependency-graph, topologically-sorts it, and then evaluates attributes. This is …. suboptimal, when we well know that almost all interesting AGs are already in the class of ordered attribute-grammars (OAGs). I plan to implement the OAG evaluation strategy next.
  2. Traditionally AGs are defined over "productions" which are sequences of nonterminals and terminals. This doesn't correspond to the way we define OCaml constructor data-types. So instead of a constru= ctor like

    type expr =3D
      ... | Call of name * arg_list
    and arg_list =3D NoArgs | SomeArgs of=
     expr * arg_list
    

    we might want to use ~ 'a list~

    type expr =3D
      ... | Call of name * expr list
    

    Problem is: defining attribute-equations for (effectively) an array of nodes, is not part of the standard lingo of AGs. But I believe we can invent new syntax and make this succinct.

  3. Storage optimization. A naive implementation of AGs can store all attributes ever computed, at all the nodes in the AST. This can use a lot of memory. But there are well-known techniques to discard attributes once they'll never more be needed in the rest of the attribute-evaluation, and I plan to implement these techniques.

There's an entire literature on things like remote-references in attribute grammars, aggregates, and other things, all of which can probably be usefully employed.

Conclusion

I think that attribute-grammars could be a useful way to structure complex multipass program-analysis, just as they used to do back in the good ol' days.

Maybe worth a look-see!

erlang 0.0.14, a toolkit to manipulate Erlang sources

ostera announced

Hej, hope you're staying safe :raised_hands:

I'm excited to share with you the first release of erlang.

tl;dr: parser/lexer/ast/printer for Erlang=

Description

erlang is a toolkit for manipulating Standard Erlang and Core = Erlang sources and their abstract syntax trees according to the Erlang specifications.

Version 0.0.14 provides:

  • A lexer/parser written in Menhir for Standard Erlang
  • ASTs for Core Erlang and Standard Erlang
  • An AST helper module for constructing Standard Erlang programs
  • A printer for the Standard Erlang AST (of highly volatile prettiness)
  • Support to turn ASTs to S-expressions
  • erldump, a binary tool for reading Erlang sources and prin= ting their concrete syntax trees as S-expressions.

It is distributed under Apache-2.0 license, depends on Menhir and Cmdliner,= and it is being developed as part of the Caramel project.

I started writing erlang to let Caramel do an entirely symboli= c compilation from the OCaml typedtree that would still allow for other passes/checks to be made cleanly. It's com= e with a decent number of tests, and it can parse some OTP modules with small modifications.

There's a few outstanding issues regarding the parsing for the next release, but it should be a starting poi= nt for anyone wanting to read sources and do something with them. I= plan on cover these issues in the rest of the year, but as with all open source, it may take longer.

I'd like to add a few other things, like an AST invariants module to check = that ASTs are actually valid Erlang programs, and transformations more suitable for static analyses of t= he sources.

My thanks go to @antron, @c-cube, @Drup, @rgrinberg, and @mseri for helping= me get around the OCaml compiler, Menhir, and eventually to get this version split from Caramel and= released independently. Also a shoutout to the Js_of_ocaml project that served as a starting point = for the parser/lexer work here.

If you can give me some feedback on the design and implementation, I'd very= much like to hear your thoughts :slight_smile:

For those of you hoping to start using it, do not= let it crash.

opam-bin.1.0.0: binary packages for opam

Fabrice Le Fessant announced

I am happy to announce the first stable release of opam-bin, version 1.0.0, a framework to CREATE, USE and SHARE binary relocatable packages with opam, to speed-up installation of packages. It is easily installable from opam-repository, and available on Github:

https://ocamlpro.github.io/= opam-bin

With opam-bin, you can :

  • build binary packages while installing their source counterpart with op= am
  • automatically reuse previously created binary packages instead of compi= ling them again
  • export and share your binary packages as part of opam repositories for = other users/computers to use

opam-bin is a framework in 3 parts :

This is the first stable release:

  • Specific support has been added in the current master bran= ch of opam to make working with this version more convenient, = by printing pre- and post- installation messages. Yet, it will still work w= ith previous version of opam, but with no output on the terminal when calli= ng opam.
  • The sharing option can be enabled to share files with hard= -links between switches, making the creation of new local switches almost c= ostless in time and disk space.

opam-bin is a collaborative work between OCamlPro and Origin L= abs.

opam-bin is particularly useful if you create many local switc= hes, as they become unexpensive. Tools like Drom (an OCaml project scaffolder, https://ocamlpro.gi= thub.io/drom) can take advantage of that to provide a cargo-like experience.

Interesting OCaml Articles

Ryan Slade announced

Anyone who's been following this blog probably saw this coming:

https://blog.darklang.= com/leaving-ocaml/

It's an interesting read and hopefully can be used as constructive criticis= m in order to improve the state of the OCaml ecosystem.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 670C5E00C7 for ; Tue, 1 Dec 2020 09:55:08 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.78,384,1599516000"; d="scan'208,217";a="366157847" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Dec 2020 09:55:07 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 01 Dec 2020 09:54:57 +0100 Message-ID: <87mtyxaota.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 24 to December 01, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 drom.0.2.0: OCaml Project Manager, beta release OCaml on the BEAM webinar ocaml-lsp-server 1.3.0 OCaml User Survey 2020 http-cookie 2.0.0 reparse 2.0.0 VSCode OCaml Platform v1.5.0 Database modelling Opium 0.19.0 Operator lookup tool for OCaml Other OCaml News Old CWN drom.0.2.0: OCaml Project Manager, beta release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fabrice Le Fessant announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 I am happy to announce the first release of `drom', version 0.2.0, a tool to create and manage OCaml projects. `drom' is a simple layer on top of `opam' and `dune', with project and package descriptions written in TOML syntax. It is an attempt at providing a `cargo'-like experience for developers, with builtin support for standard OCaml tools (`opam', `dune', `odoc', etc.) and source managers (Github for now, with Github Actions and Github Pages). There are mainly 2 use-cases of `drom': =E2=80=A2 Scafolding tool: `drom' makes it easy to create OCaml projects = by generating all the files needed for a standard OCaml project. It creates files for `opam' and `dune', formatters (`ocp-index' and `ocamlformat'), documentation (`sphinx' and `odoc'), testing directories and Github CI. Once these files have been created, `drom' is not needed anymore and you can keep using your preferred tools. =E2=80=A2 Management tool: `drom' can also be used to keep managing the project afterwards. It has commands like `drom build' to build the project, automatically installing a local switch with all needed dependencies, `drom doc' to generate the documentation and `drom test' to execute tests. `drom' works as a simple interface over `opam' and `dune' so you almost never need to use them directly. (this site and the documentation was mostly generated by `drom' itself) `drom' is available in the official opam repository. Examples: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ drom new mylib --skeleton library // generate library project =E2=94=82 // or =E2=94=82 $ drom new hello // generate program project =E2=94=82=20 =E2=94=82 $ cd hello =E2=94=82 $ emacs drom.toml // edit the project description =E2=94=82 $ drom project // update files =E2=94=82 $ drom build // create local switch and build =E2=94=82 // or =E2=94=82 $ drom build --switch 4.10.0 // use global switch and build =E2=94=82 $ ./hello // run the executable =E2=94=82 $ drom test // run tests =E2=94=82 $ drom install // install in opam switch =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is an early release to get feedback from users. `drom' has been tested on several of our internal projects, like `opam-bin' and `ez_file'. Since `drom' creates local `opam' switches for every project by default (though it is possible to use global switches too), it is advised to use it with `opam-bin' to speed up switch creation and upgrades. `drom' works by creating projects using "skeletons", i.e. project and package templates. `drom' comes with a few predefined skeletons (`program' or `library'), and allows users to add their own skeletons. We will of course extend the substitution language to help users develop such new skeletons. `drom' is a collaborative work between OCamlPro and Origin Labs. Fran=C3=A7ois Bobot asked and Fabrice Le Fessant replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I'm very happy to see work in the OCaml world in that direction. I was currently looking for duniverse for that kind of need. Do they fullfil different needs or how do they compare? My understanding is that `duniverse' tackles the problem of the "mono-repo", i.e. when you want to manage many different projects as just one project, using `dune' capacity to build them all at once. I would say that `drom' tackles an orthogonal problem, which is to simplify the creation of simple OCaml projects (generating all the standard files you need, like Makefile, dune-project, dune, .ocamlformat, .github CI, documentation, license, etc.) and day-to-day management (changing dependencies, having a copy of headers that you can insert in new files, etc.). It also provides a single interface over basic opam/dune commands. It would probably be possible to use `duninverse' on a set of projects containing projects generated by `dune', but I don't know enough about `duniverse' to be sure. Of course, `drom' can manage projects composed of multiple libraries and executables (called `packages' because `drom' generates one `opam' file for every one of them), but I wouldn't call that a mono-repo, it's just frequent to have more than one package in a small project. OCaml on the BEAM webinar =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Erlang Solutions is going to do a webinar on Leandro Ostera's new BEAM backend for OCaml: Should be exciting! ocaml-lsp-server 1.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the ocaml-lsp team, I=E2=80=99d like to announce version 1.3= .0. This release an improvement in keyword completion and a new code action. Keywords are now filtered by the context the user requested the completion, and there's a new code action to quickly populate .mli files with the the inferred types from the .ml file. OCaml User Survey 2020 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Leroy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here is a summary and analysis of the survey results I wrote on behalf of the OCaml Software Foundation: Enjoy! http-cookie 2.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Bikal Lem announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 A new version of `cookies' package - now named `http-cookie'- has been released to opam. This version has been rewritten to remove all its external and ppx dependencies and now only depends on stock ocaml and its stdlib. `http-cookie' is a [RFC 6265] compliant HTTP cookie library. RFC 6265 is a HTTP cookie standard specifying cookie data validity requirements. Additionally, I have also removed the use of `Result.t' from the previous version and have used plain old exceptions to denote any cookie data validation errors. =E2=80=A2 [Github - http-cookie] =E2=80=A2 [Docs - http-cookie] [RFC 6265] [Github - http-cookie] [Docs - http-cookie] reparse 2.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Bikal Lem announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 A new version of `reparse' 2.0.0 has been released to opam. Reparse is a monadic, recursive descent based, comprehensive, parser construction library for ocaml. CHANGES for version 2.0.0: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C =E2=80=A2 Rewrite the whole package to use exceptions rather than `result' type =E2=80=A2 Adds many more parsing combinators =E2=80=A2 Adds comprehensive unit tests =E2=80=A2 Adds comprehensive documentation, host documentation and add li= nks in repo home page =E2=80=A2 Adds abstraction for input source =E2=80=A2 Provides unix file source and string input source =E2=80=A2 Adds separate package `reparse-unix' for unix file input =E2=80=A2 Adds calc.ml and json.ml in examples. Additionally, the API is now comprehensively documented with at least an example for each API call. =E2=80=A2 [Github Reparse] =E2=80=A2 [API Docs] [Github Reparse] [API Docs] VSCode OCaml Platform v1.5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Max Lantas announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 We are happy to announce the v1.5.0 release of [VSCode OCaml Platform], a Visual Studio Code extension for OCaml. It is available on the [VSCode Marketplace] and [Open VSX Registry]. This release has the following changes: =E2=80=A2 Highlight `rec' keyword in OCaml mli files for recursive modules ([#434]) =E2=80=A2 Highlight `cram' stanza in dune-project files ([#441]) =E2=80=A2 Fix reason highlighting of let extensions ([#447]) =E2=80=A2 Improve highlighting of Menhir new syntax ([#450]) =E2=80=A2 Improve Menhir syntax highlighting ([#455]) =E2=80=A2 Add `Alt + P' keyboard shortcut for infer interface code action ([#448]) =E2=80=A2 Infer interface when switching to a non-existing interface file ([#437]) This is the first release to be automatically published to Open VSX, which will benefit users of [VSCodium] and other editors. Please feel free to share feedback. [VSCode OCaml Platform] [VSCode Marketplace] [Open VSX Registry] [#434] [#441] [#447] [#450] [#455] [#448] [#437] [VSCodium] Database modelling =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Reviving this very old thread, paul announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 And a version for postgresql: Opium 0.19.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the Opium team, I am pleased to announce a new version of Opium (`0.19.0') is available on Opam. This release comes with a complete rewrite of Opium's internals to switch from Cohttp to Httpaf (work done by @anuragsoni). As demonstrated in several benchmarks, Httpaf's latency is much lower than Cohttp's in stress tests, so it is expected that Opium will perform better in these high-pressure situations. The underlying HTTP server implementation is now contained in a `rock' package, that provides a Service and Filter implementation, inspired by Finagle's. The architecture is similar to Ruby's Rack library (hence the name), so one can compose complex web applications by combining Rock applications. The `rock' package offers a very slim API, with very few dependencies, so it should be an attractive option for other Web frameworks to build on, which would allow the re-usability of middlewares and handlers, independently of the framework used (e.g. one could use Sihl middlewares with Opium, and vice versa). Apart from the architectural changes, this release comes with a lot of additional utilities and middlewares which should make Opium a better candidate for complex web applications, without having to re-write a lot of common Web server functionalities. The Request and Response modules now provide: =E2=80=A2 JSON encoders/decoders with `Yojson' =E2=80=A2 HTML encoders/decoders with `Tyxml' =E2=80=A2 XML encoders/decoders with `Tyxml' =E2=80=A2 SVG encoders/decoders with `Tyxml' =E2=80=A2 multipart/form encoders/decoders with `multipart_form_data' =E2=80=A2 urlencoded encoders/decoders with `Uri' And the following middlewares are now built-in: =E2=80=A2 `debugger' to display an HTML page with the errors in case of failures =E2=80=A2 `logger' to log requests and responses, with a timer =E2=80=A2 `allow_cors' to add CORS headers =E2=80=A2 `static' to serve static content given a custom read function (e.g. read from S3) =E2=80=A2 `static_unix' to serve static content from the local filesystem =E2=80=A2 `content_length' to add the `Content-Length' header to responses =E2=80=A2 `method_override' to replace the HTTP method with the one found= in the `_method' field of `application/x-www-form-urlencoded' encoded `POST' requests. =E2=80=A2 `etag' to add `ETag' header to the responses and send an HTTP c= ode `304' when the computed ETag matches the one specified in the request. =E2=80=A2 `method_required' to filter the requests by the HTTP method and respond with an HTTP code `405' if the method is not allowed. =E2=80=A2 `head' to add supports for `HEAD' request for handlers that rec= eive `GET' requests. Lastly, this release also adds a package `opium-testing' that can be used to test Opium applications with Alcotest. It provides `Testable' modules for every Opium types, and implements helper functions to easily get an `Opium.Response' from an `Opium.Request'. As this release changes the API drastically, we will keep maintaining the `0.18.0' branch for bug fixes, for users who don't want to (or can't) migrate to `0.19.0'. What's next? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Recent discussions have shown that building optimized applications was not trivial. This is partly due to the lack of documentation, and probably because some configurations that should come by default, are left to the user to optimize. Therefore, we will keep performance in mind for the next release and investigate the current bottlenecks in Opium. We will also continue adding higher-level functionalities to Opium to make users productive with real-world applications. This includes: =E2=80=A2 Sessions support (with signed cookies) =E2=80=A2 Handlers for authentication =E2=80=A2 Adding more middlewares (compression, flash messages, caching, = etc.) Your feedback is welcome, don't hesitate to open Issues on Github! Andreas Poisel asked and Anurag Soni replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Does Opium + Httpaf support TLS? It doesn't at the moment. Calascibetta Romain then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 According the interface of `opium', it's possible to have the support of TLS (with `ocaml-tls') with the [new version of Conduit] and [`paf'] (which is a MirageOS compatible layer of HTTP/AF - unreleased): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let stack ip =3D =E2=94=82 Tcpip_stack_socket.UDPV4.connect (Some ip) >>=3D fun udpv4 -> =E2=94=82 Tcpip_stack_socket.TCPV4.connect (Some ip) >>=3D fun tcpv4 -> =E2=94=82 Tcpip_stack_socket.connect [ ip ] udpv4 tcpv4 =E2=94=82=20 =E2=94=82 let http_with_conduit (ip, port) error_handler request_handler = =3D =E2=94=82 Paf.https httpaf_config ~error_handler ~request_handler:(fun = _ -> request_handler) =E2=94=82 ({ Paf.TCP.stack=3D stack ip =E2=94=82 ; keepalive=3D None =E2=94=82 ; nodelay=3D false =E2=94=82 ; port=3D port}, Tls.Config.server ~certificates ()) =E2=94=82=20 =E2=94=82 let () =3D match Lwt_main.run (Opium.run (https_with_conduit (I= paddr.V4.localhost, 4343)) opium_app) with =E2=94=82 | Ok () -> () =E2=94=82 | Error err -> Fmt.epr "%a.\n%!" Conduit_mirage.pp_error err =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I used it for a long time on my personal unikernels and did some tests to ensure that [it does fails when it handles many requests]. Note that you are able to use OpenSSL too if you want. [new version of Conduit] [`paf'] [it does fails when it handles many requests] Robin Bj=C3=B6rklin also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 If you want to use this new version of Opium there are ways around this problem. You could have Haproxy (or similar) terminate your TLS connections externally and if your environment requires TLS for your internal network something like [Consul Connect] can cover that use-case for you. [Consul Connect] Operator lookup tool for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Craig Ferguson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the initial release of craigfe.io/operator-lookup/, a search tool for OCaml operators and syntax elements: For each operator, the tool provides a short explanation of its behaviour, examples of usage and warnings of common misuses and misunderstandings: The intent of writing this tool was to give OCaml beginners a quick way to find the standard / conventional operators in the language and to disambiguate "operator-like" syntax that can be hard to search for otherwise. It currently supports: =E2=80=A2 all standard library operators, =E2=80=A2 conventional infix operators (`>>=3D', `>>|', `>|=3D'), =E2=80=A2 binding operators (`let+', `let*', `and+', etc.), =E2=80=A2 syntax that is often confused for an operator (`#', `;;'). Please let me know if you have any suggestions for improvements. I hope you find it useful! Acknowledgements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This tool is heavily based on the [JavaScript operator lookup] utility by [Josh Comeau]. Thanks to him for the initial idea and for allowing me to re-use his design elements. [JavaScript operator lookup] [Josh Comeau] Kakadu asked and Craig Ferguson replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's not obvious for me are these operators hardcoded or do you scan opam packages from time to time? They're hardcoded. The operators fall into three classes: =E2=80=A2 The vast majority of them are from the `Stdlib' module, so I do= n't expect those to change very regularly. =E2=80=A2 A small number of "conventional" operators used in the community (`>>=3D', `let*', etc.). Even for that small set there is some divergence in Opam =E2=80=93 c.f. `>>|' vs `>|=3D' for a _map_ operator= =E2=80=93 so I suspect there are not many other candidates for this group. =E2=80=A2 There are a few regexes behind the scenes for catching valid operator names that don't fall into the first two categories. e.g. many search terms are classified as "_a left-associative operator_" with a correspondingly vague description. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [=E2=80=9CUniversal=E2=80=9D Dune Tip: Rebuild Stuff, Sometimes] [OCaml Planet] [=E2=80=9CUniversal=E2=80=9D Dune Tip: Rebuild Stuff, Sometimes] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 24 to Decemb= er 01, 2020.

drom.0.2.0: OCaml Project Manager, beta release

Fabrice Le Fessant announced

I am happy to announce the first release of drom, version 0.2.= 0, a tool to create and manage OCaml projects. drom is a simple lay= er on top of opam and dune, with project and package de= scriptions written in TOML syntax. It is an attempt at providing a cargo-= like experience for developers, with builtin support for standard OCaml tools (opam, dune, odoc, etc.) and s= ource managers (Github for now, with Github Actions and Github Pages).

There are mainly 2 use-cases of drom:

  • Scafolding tool: drom makes it easy to create OCaml projec= ts by generating all the files needed for a standard OCaml project. It creates files for opam and dune, formatters (ocp-index and ocamlformat), documentation (sphinx and odo= c), testing directories and Github CI. Once these files have been created, drom is not needed anymore and you can keep using your preferr= ed tools.
  • Management tool: drom can also be used to keep managing the project afterwards. It has commands like drom build to build t= he project, automatically installing a local switch with all needed dependencies, drom doc to generate the documentation and drom test to execute tests. drom works as a simple interfa= ce over opam and dune so you almost never need to use the= m directly.

https://ocamlpro.github.io/drom=

(this site and the documentation was mostly generated by drom = itself)

drom is available in the official opam repository.

Examples:

$ drom new mylib --skeleton library // generate library project
                                    //           or
$ drom new hello                    // generate program project

$ cd hello
$ emacs drom.toml // edit the project description
$ drom project    // update files
$ drom build                  // create local switch and build
                              //      or
$ drom build --switch 4.10.0  // use global switch and build
$ ./hello         // run the executable
$ drom test       // run tests
$ drom install    // install in opam switch

This is an early release to get feedback from users. drom has = been tested on several of our internal projects, like opam-bin and ez_file.

Since drom creates local opam switches for every = project by default (though it is possible to use global switches too), it is advised to use it with opam-bin to speed up switch creation and upgrades.

drom works by creating projects using "skeletons", i.e. projec= t and package templates. drom comes with a few predefined skeletons (program or library), and allows users to add the= ir own skeletons. We will of course extend the substitution language to help users develop such new skeletons.

drom is a collaborative work between OCamlPro and Origin Labs.

Fran=C3=A7ois Bobot asked and Fabrice Le Fessant repl= ied

I'm very happy to see work in the OCaml world in that direction. I was curr= ently looking for duniverse for that kind of need. Do they fullfil different needs or how do = they compare?

My understanding is that duniverse tackles the problem of the "mono-repo", i.e. when you want to manage many different projects as just one project, using dune capacity to build them all at onc= e. I would say that drom tackles an orthogonal problem, which is to simplify the creation of simple OCaml projects (generating all the standard files you need, like Makefile, dune-project, dune, .ocamlformat, .github CI, documentation, license, etc.) and day-to-day management (changing dependencies, having a copy of headers that you can insert in new files, etc.). It also provides a single interface over basic opam/dune commands.

It would probably be possible to use duninverse on a set of pr= ojects containing projects generated by dune, but I don't know enough= about duniverse to be sure.

Of course, drom can manage projects composed of multiple libra= ries and executables (called packages because drom gen= erates one opam file for every one of them), but I wouldn't call that a mono-repo, it's just frequent to have more than one package in a small project.

OCaml on the BEAM webinar

Yawar Amin announced

Erlang Solutions is going to do a webinar on Leandro Ostera's new BEAM back= end for OCaml: https:= //www2.erlang-solutions.com/webinar-registration-2

Should be exciting!

ocaml-lsp-server 1.3.0

Rudi Grinberg announced

On behalf of the ocaml-lsp team, I=E2=80=99d like to announce version 1.3.0.

This release an improvement in keyword completion and a new code action. Ke= ywords are now filtered by the context the user requested the completion, and there's a new code actio= n to quickly populate .mli files with the the inferred types from the .ml file.

OCaml User Survey 2020

Xavier Leroy announced

Here is a summary and analysis of the survey results I wrote on behalf of t= he OCaml Software Foundation: https://www.dropbox.com/s/omba1d8vhljnrcn/OCaml-us= er-survey-2020.pdf?dl=3D0 Enjoy!

http-cookie 2.0.0

Bikal Lem announced

A new version of cookies package - now named http-cookie= - has been released to opam. This version has been rewritten to remove all its external and ppx dependencies = and now only depends on stock ocaml and its stdlib.

http-cookie is a RFC 6265 compliant HTTP cookie library. RFC 6265 is a HTTP cookie standard specifying cookie data validity requirem= ents.

Additionally, I have also removed the use of Result.t from the= previous version and have used plain old exceptions to denote any cookie data validation errors.

reparse 2.0.0

Bikal Lem announced

A new version of reparse 2.0.0 has been released to opam.

Reparse is a monadic, recursive descent based, comprehensive, parser constr= uction library for ocaml.

CHANGES for version 2.0.0:

  • Rewrite the whole package to use exceptions rather than result type
  • Adds many more parsing combinators
  • Adds comprehensive unit tests
  • Adds comprehensive documentation, host documentation and add links in r= epo home page
  • Adds abstraction for input source
  • Provides unix file source and string input source
  • Adds separate package reparse-unix for unix file input
  • Adds calc.ml and json.ml in examples.

Additionally, the API is now comprehensively documented with at least an ex= ample for each API call.

VSCode OCaml Platform v1.5.0

Max Lantas announced

We are happy to announce the v1.5.0 release of VSCode OCaml Platform, a Visual Studio Code extension for OCaml. It is available on the VSCode Marketplace and Open VSX Registry.

This release has the following changes:

  • Highlight rec keyword in OCaml mli files for recursive mod= ules (#434)
  • Highlight cram stanza in dune-project files (#441)
  • Fix reason highlighting of let extensions (#447)
  • Improve highlighting of Menhir new syntax (#450)
  • Improve Menhir syntax highlighting (#455)
  • Add Alt + P keyboard shortcut for infer interface code act= ion (#448)
  • Infer interface when switching to a non-existing interface file (#437)=

This is the first release to be automatically published to Open VSX, which = will benefit users of VSCodium and other edi= tors.

Please feel free to share feedback.

Database modelling

Reviving this very old thread, paul announced

Opium 0.19.0

Thibaut Mattio announced

On behalf of the Opium team, I am pleased to announce a new version of Opiu= m (0.19.0) is available on Opam.

This release comes with a complete rewrite of Opium's internals to switch f= rom Cohttp to Httpaf (work done by @anuragsoni).

As demonstrated in several benchmarks, Httpaf's latency is much lower than = Cohttp's in stress tests, so it is expected that Opium will perform better in these high-pressure situat= ions.

The underlying HTTP server implementation is now contained in a rock<= /code> package, that provides a Service and Filter implementation, inspired by Finagle's. The architecture is simil= ar to Ruby's Rack library (hence the name), so one can compose complex web applications by combining = Rock applications.

The rock package offers a very slim API, with very few depende= ncies, so it should be an attractive option for other Web frameworks to build on, which would allow the re-usabi= lity of middlewares and handlers, independently of the framework used (e.g. one could use Sihl midd= lewares with Opium, and vice versa).

Apart from the architectural changes, this release comes with a lot of addi= tional utilities and middlewares which should make Opium a better candidate for complex web appl= ications, without having to re-write a lot of common Web server functionalities.

The Request and Response modules now provide:

  • JSON encoders/decoders with Yojson
  • HTML encoders/decoders with Tyxml
  • XML encoders/decoders with Tyxml
  • SVG encoders/decoders with Tyxml
  • multipart/form encoders/decoders with multipart_form_data<= /li>
  • urlencoded encoders/decoders with Uri

And the following middlewares are now built-in:

  • debugger to display an HTML page with the errors in case o= f failures
  • logger to log requests and responses, with a timer
  • allow_cors to add CORS headers
  • static to serve static content given a custom read functio= n (e.g. read from S3)
  • static_unix to serve static content from the local filesys= tem
  • content_length to add the Content-Length head= er to responses
  • method_override to replace the HTTP method with the one fo= und in the _method field of application/x-www-form-urlen= coded encoded POST requests.
  • etag to add ETag header to the responses and = send an HTTP code 304 when the computed ETag matches the one s= pecified in the request.
  • method_required to filter the requests by the HTTP method = and respond with an HTTP code 405 if the method is not allowed= .
  • head to add supports for HEAD request for han= dlers that receive GET requests.

Lastly, this release also adds a package opium-testing that ca= n be used to test Opium applications with Alcotest. It provides Testable modules for every Opium ty= pes, and implements helper functions to easily get an Opium.Response from an Opium.Request.

As this release changes the API drastically, we will keep maintaining the <= code>0.18.0 branch for bug fixes, for users who don't want to (or can't) migrate to 0.19.0.

What's next?

Recent discussions have shown that building optimized applications was not = trivial. This is partly due to the lack of documentation, and probably because some configurations that= should come by default, are left to the user to optimize. Therefore, we will keep performance in mind f= or the next release and investigate the current bottlenecks in Opium.

We will also continue adding higher-level functionalities to Opium to make = users productive with real-world applications. This includes:

  • Sessions support (with signed cookies)
  • Handlers for authentication
  • Adding more middlewares (compression, flash messages, caching, etc.)

Your feedback is welcome, don't hesitate to open Issues on Github!

Andreas Poisel asked and Anurag Soni replied

Does Opium + Httpaf support TLS?

It doesn't at the moment.

Calascibetta Romain then said

According the interface of opium, it's possible to have the su= pport of TLS (with ocaml-tls) with the new version of Conduit and paf= (which is a MirageOS compatible layer of HTTP/AF - unreleased):

let stack ip =3D
  Tcpip_stack_socket.UDPV4.connect (=
Some ip) =
>>=3D fun udpv4 ->
  Tcpip_stack_socket.TCPV4.connect (=
Some ip) =
>>=3D fun tcpv4 ->
  Tcpip_stack_socket.connect [ ip ] =
udpv4 tcpv4

let http_with_conduit (ip, port) error_handler reque=
st_handler =3D
  Paf.https httpaf_config ~error_han=
dler ~request_handler:(fun _ -&=
gt; request_handler)
    ({ Paf.TCP.stack=3D stack ip
     ; keepalive=3D None
     ; nodelay=3D false
     ; port=3D port}, Tls.Config.ser=
ver ~certificates ())

let () =3D match Lwt_=
main.run (Opium.run (https_wi=
th_conduit (Ipaddr.V4.localhost, 434=
3)) opium_app) with
  | Ok ()=
 -> ()
  | Error=
 err -> Fmt.epr "%a.\n%!" Conduit_mir=
age.pp_error err

I used it for a long time on my personal unikernels and did some tests to e= nsure that it= does fails when it handles many requests. Note that you are able to use OpenSSL too if you want.

Robin Bj=C3=B6rklin also replied

If you want to use this new version of Opium there are ways around this pro= blem. You could have Haproxy (or similar) terminate your TLS connections externally and if your environm= ent requires TLS for your internal network something like Co= nsul Connect can cover that use-case for you.

Operator lookup tool for OCaml

Craig Ferguson announced

I'm pleased to announce the initial release of craigfe.io/operator-lookup/,= a search tool for OCaml operators and syntax elements:

3D"=

For each operator, the tool provides a short explanation of its behaviour, = examples of usage and warnings of common misuses and misunderstandings:

3D"=

The intent of writing this tool was to give OCaml beginners a quick way to = find the standard / conventional operators in the language and to disambiguate "operator-like" = syntax that can be hard to search for otherwise. It currently supports:

  • all standard library operators,
  • conventional infix operators (>>=3D, >>|= , >|=3D),
  • binding operators (let+, let*, and+, etc.),
  • syntax that is often confused for an operator (#, ;;= ).

Please let me know if you have any suggestions for improvements. I hope you= find it useful!

Acknowledgements

This tool is heavily based on the JavaScript operator lookup utility by Josh Comeau. Thanks to him for the initial idea and for allowing me to re-use his design elements.

Kakadu asked and Craig Ferguson replied

It's not obvious for me are these operators hardcoded or do you scan opam p= ackages from time to time?

They're hardcoded. The operators fall into three classes:

  • The vast majority of them are from the Stdlib module, so I= don't expect those to change very regularly.
  • A small number of "conventional" operators used in the community (>>=3D, let*, etc.). Even for that small set the= re is some divergence in Opam =E2=80=93 c.f. >>| vs >|=3D for a map operator =E2= =80=93 so I suspect there are not many other candidates for this group.
  • There are a few regexes behind the scenes for catching valid operator n= ames that don't fall into the first two categories. e.g. many search terms = are classified as "_a left-associative operator_" with a correspondingly va= gue description.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B796FE00BA for ; Tue, 15 Dec 2020 10:51:48 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.78,420,1599516000"; d="scan'208,217";a="483026468" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 15 Dec 2020 10:51:48 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 15 Dec 2020 10:51:47 +0100 Message-ID: <87tusnflcc.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 08 to 15, 2020. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 MirageOS 3.10 released Exception vs Result Release: scikit-learn, Numpy, Scipy for OCaml, 0.3.1 OCaml 4.10.2 BAP 2.2.0 Release Liquidshop 1.0, Jan. 17th and 18th, 2021 Opium 0.20.0 Set up OCaml 1.1.5 Other OCaml News Old CWN MirageOS 3.10 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 we're pleased to announce MirageOS 3.10: IPv6 and dual (IPv4 and IPv6) stack support Since a long time, IPv6 code was around in our TCP/IP stack (thanks to @nojb who developed it in 2014). Some months ago, @hannesm and @MagnusS got excited to use it. After we managed to fix some bugs and add some test cases, and writing more code to setup IPv6-only and dual stacks, we are eager to share this support for MirageOS in a released version. We expect there to be bugs lingering around, but duplicate address detection (neighbour solicitation and advertisements) has been implemented, and (unless "=E2=80=93accept-router-advertisement=3Dfalse") = router advertisements are decoded and used to configure the IPv6 part of the stack. Configuring a static IPv6 address is also possible (with "=E2=80=93ipv6=3D2001::42/64"). While at it, we unified the boot arguments between the different targets: namely, on Unix (when using the socket stack), you can now pass "=E2=80=93ipv4=3D127.0.0.1/24" to the same effect as the direct stac= k: only listen on 127.0.0.1 (the subnet mask is ignored for the Unix socket stack). A dual stack unikernel has "=E2=80=93ipv4-only=3DBOOL" and "=E2=80=93ipv6= -only=3DBOOL" parameters, so a unikernel binary could support both Internet Protocol versions, while the operator can decide which protocol version to use. I.e. now there are both development-time (stackv4 vs stackv6 vs stackv4v6) choices, as well as the run-time choice (via boot parameter). I'm keen to remove the stackv4 & stackv6 in future versions, and always develop with dual stack (leaving it to configuration & startup time to decide whether to enable ipv4 and ipv6). Please also note that the default IPv4 network configuration no longer uses 10.0.0.1 as default gateway (since there was no way to unset the default gateway ). For unikernel developers, there are some API changes in the Mirage module =E2=80=A2 New "v4v6" types for IP protocols and stacks =E2=80=A2 The ipv6_config record was adjusted in the same fashion as the ipv4_config type: it is now a record of a network (V6.Prefix.t) and gateway (V6.t option) Some parts of the Mirage_key module were unified as well: =E2=80=A2 Arp.ip_address is available (for a dual Ipaddr.t) =E2=80=A2 Arg.ipv6_address replaces Arg.ipv6 (for an Ipaddr.V6.t) =E2=80=A2 Arg.ipv6 replaces Arg.ipv6_prefix (for a Ipaddr.V6.Prefix.t) =E2=80=A2 V6.network and V6.gateway are available, mirroring the V4 submo= dule If you're ready to experiment with the dual stack: below is a diff for our basic network example (from mirage-skeleton/device-usage/network) replacing IPv4 with a dual stack, and the tlstunnel unikernel commit changed tlstunnel from IPv4 stack to dual stack. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 diff --git a/device-usage/network/config.ml b/device-usage/netw= ork/config.ml =E2=94=82 index c425edb..eabc9d6 100644 =E2=94=82 --- a/device-usage/network/config.ml =E2=94=82 +++ b/device-usage/network/config.ml =E2=94=82 @@ -4,9 +4,9 @@ let port =3D =E2=94=82 let doc =3D Key.Arg.info ~doc:"The TCP port on which to list= en for =E2=94=82 incoming connections." ["port"] in =E2=94=82 Key.(create "port" Arg.(opt int 8080 doc)) =E2=94=82=20 =E2=94=82 -let main =3D foreign ~keys:[Key.abstract port] "Unikernel.Main= " (stackv4 =E2=94=82 @-> job) =E2=94=82 +let main =3D foreign ~keys:[Key.abstract port] "Unikernel.Main" =E2=94=82 (stackv4v6 @-> job) =E2=94=82=20 =E2=94=82 -let stack =3D generic_stackv4 default_network =E2=94=82 +let stack =3D generic_stackv4v6 default_network =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 register "network" [ =E2=94=82 diff --git a/device-usage/network/unikernel.ml =E2=94=82 b/device-usage/network/unikernel.ml =E2=94=82 index 5d29111..1bf1228 100644 =E2=94=82 --- a/device-usage/network/unikernel.ml =E2=94=82 +++ b/device-usage/network/unikernel.ml =E2=94=82 @@ -1,19 +1,19 @@ =E2=94=82 open Lwt.Infix =E2=94=82=20 =E2=94=82 -module Main (S: Mirage_stack.V4) =3D struct =E2=94=82 +module Main (S: Mirage_stack.V4V6) =3D struct =E2=94=82=20 =E2=94=82 let start s =3D =E2=94=82 let port =3D Key_gen.port () in =E2=94=82 - S.listen_tcpv4 s ~port (fun flow -> =E2=94=82 - let dst, dst_port =3D S.TCPV4.dst flow in =E2=94=82 + S.listen_tcp s ~port (fun flow -> =E2=94=82 + let dst, dst_port =3D S.TCP.dst flow in =E2=94=82 Logs.info (fun f -> f "new tcp connection from IP %s on port = %d" =E2=94=82 - (Ipaddr.V4.to_string dst) dst_port); =E2=94=82 - S.TCPV4.read flow >>=3D function =E2=94=82 + (Ipaddr.to_string dst) dst_port); =E2=94=82 + S.TCP.read flow >>=3D function =E2=94=82 | Ok `Eof -> Logs.info (fun f -> f "Closing connection!"); =E2=94=82 Lwt.return_unit =E2=94=82 - | Error e -> Logs.warn (fun f -> f "Error reading data= from =E2=94=82 established connection: %a" S.TCPV4.pp_error e); Lwt.return_unit =E2=94=82 + | Error e -> Logs.warn (fun f -> f "Error reading data= from =E2=94=82 established connection: %a" S.TCP.pp_error e); Lwt.return_unit =E2=94=82 | Ok (`Data b) -> =E2=94=82 Logs.debug (fun f -> f "read: %d bytes:\n%s" (Cstruct.len b) =E2=94=82 (Cstruct.to_string b)); =E2=94=82 - S.TCPV4.close flow =E2=94=82 + S.TCP.close flow =E2=94=82 ); =E2=94=82=20 =E2=94=82 S.listen s =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Other bug fixes include (in ) and adapt to charrua 1.3.0 and arp 2.3.0 changes (). Exception vs Result =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Continuing this thread, Vladimir Keleshev announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 A bit late to the party, but here's an overview of error handling methods that I did a while ago: [Composable Error Handling in OCaml (keleshev.com)] It compares the following approaches: =E2=80=A2 Exceptions =E2=80=A2 Result type with strings for errors =E2=80=A2 Result type with custom variants for errors =E2=80=A2 Result type with polymorphic variants for errors [Composable Error Handling in OCaml (keleshev.com)] Release: scikit-learn, Numpy, Scipy for OCaml, 0.3.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Ronan Le Hy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've just released an update of OCaml wrappers for scikit-learn: =E2=80=A2 documentation: =E2=80=A2 code: =E2=80=A2 `opam install sklearn' These bindings also come with bindings for Numpy (`opam install np') and Scipy (`opam install scipy'). Scikit-learn is all of these things: =E2=80=A2 Simple and efficient tools for predictive data analysis =E2=80=A2 Accessible to everybody, and reusable in various contexts =E2=80=A2 Built on NumPy, SciPy, and matplotlib =E2=80=A2 Open source, commercially usable - BSD license Scikit-learn is robust, well-engineered and covers most basic machine learning use cases. As a professional data scientist I use it extensively from Python. I built these wrappers because I felt challenged by my friend @UnixJunkie's funny R wrappers. I don't depend personally on these packages and maintain/improve them without any guarantees. They have many unpolished corners. However, they have tests and I don't expect them to add too many bugs to scikit-learn. Contributions and bug reports are welcome (but be aware that the bindings are generated from a big hairy Python script). Many thanks to everybody involved in opam! OCaml 4.10.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The OCaml team has the pleasure of celebrating the birthday of Grace Hopper by announcing the release of OCaml version 4.10.2. This exceptional release makes OCaml 4.10 available on the new macOS/arm64 platform, and fixes some compatibility issues for the mingw64 and FreeBSD/amd64 platform. If OCaml 4.10.1 already works on your platform of choice, this release should be completely transparent to you (and can be safely ignored). Note that those fixes were backported from OCaml 4.12: further improvement to the support of the macOS/arm64 platform will happen on the 4.12 branch. The release is available as a set of OPAM switches, and as a source download here: OCaml 4.10.2 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [9938], [9939]: Define __USE_MINGW_ANSI_STDIO=3D0 for the mingw= -w64 ports to prevent their C99-compliant snprintf conflicting with ours. (David Allsopp, report by Michael Soegtrop, review by Xavier Leroy) [9938] [9939] =E2=97=8A Supported platforms: =E2=80=A2 [9699], [10026]: add support for iOS and macOS on ARM 64 bits Backported from OCaml 4.12.0 (GitHub user @EduardoRFS, review by Xavier Leroy, Nicol=C3=A1s Ojeda B=C3=A4r and Anil Madhavapeddy, additi= onal testing by Michael Schmidt) [9699] [10026] =E2=97=8A Code generation and optimization =E2=80=A2 [9752], [10026]: Revised handling of calling conventions for external C functions. Provide a more precise description of the types of unboxed arguments, so that the ARM64 iOS/macOS calling conventions can be honored. Backported from OCaml 4.12.0 (Xavier Leroy, review by Mark Shinwell and Github user @EduardoRFS) =E2=80=A2 [9969], [9981]: Added mergeable flag tqo ELF sections containing mergeable constants. Fixes compatibility with the integrated assembler in clang 11.0.0. Backported from OCaml 4.12.0 (Jacob Young, review by Nicol=C3=A1s Ojeda B=C3=A4r) [9752] [10026] [9969] [9981] Anil Madhavapeddy =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 There is also a [macos/arm64 binary of opam] available from the releases page for your convenience, and opam repository has been updated to understand the new tier-1 constraints imposed by macos/arm (i.e. the only working compilers there are 4.10.2 and 4.12.0~dev, and `opam init' will now do the right thing). There will be a number of packages that are broken due to the shift to `/opt/homebrew' from `/usr/local' for Homebrew/ARM (due to the need to keep them simultaneously installed on the same Mac), so please feel free to submit PRs to opam-repository to fix this stuff. We'll shortly have Mac (both Intel and ARM) testing up and running on opam-repository, so CI will catch up with reality once more, thanks to furious hacking by @patricoferris to extend our ocurrent-based CI infrastructure to support the unique vagaries of the Mac environment (notably, a total lack of native containers). We have it working locally, and are just upstreaming it now. [macos/arm64 binary of opam] BAP 2.2.0 Release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Ivan Gotovchits announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are proud to announce the 2.2.0 release of the Carnegie Mellon University [Binary Analysis Platform]. BAP is the framework and toolkit for analyzing programs in their machine code representation. This update has a lot of [new features] despite that originally it was more as a maintenance version. Special thanks to @XVilka and [@Phosphorus15] for contributing Thumb/ThumbV2 lifter and radare2 integration. We would also like to thank [ForAllSecure] for open-sourcing and contributing to us their x86 floating-point lifter. The new version of BAP is also much more efficient and we now have a much better symbolization facility (so we're no longer really dependent on the presence of external tools). Another nice addition is a new REPL powered by [ocaml-linenoise], see the demo below. [Binary Analysis Platform] [new features] [@Phosphorus15] [ForAllSecure] [ocaml-linenoise] Liquidshop 1.0, Jan. 17th and 18th, 2021 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Romain Beauxis announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to announce that we'll be holding Liquidshop 1.0 these coming Jan. 17th & 18th, our first ever (online) conference and workshops on liquidsoap and other related technologies and projects! Liquidsoap is a statically typed scripting language with specialized primitives and operators for creating media streams used for media processing, online streaming and a lot more. It is written in OCaml and has been maintained for over a decade now. We will have 3 different tracks for the event, namely: =E2=80=A2 Showcases: short presentations about a website / radio / art installation that you built using Liquidsoap or other related tools =E2=80=A2 Tech talks: in-depth presentation of a technology related to Liquidsoap and streaming in general =E2=80=A2 Workshops: user-centered freeform discussions about your projec= t or issues around Liquidsoap and streaming If you're interested to participate, wether as an attendee or a presenter, make sure to register via our website at: or directly via the form available at: We are super excited for this event. We have already secured a couple of interesting speakers and we would love to get to know the community better, see what y'all are doing with liquidsoap and other releated projects, community radios, live video, weird installations, etc. and meet with everyone. Also, if you have any suggestion about the best technical solutions to organize such an event, we'd be happy to hear about them. Finally, if any of y'all have some specific topics to discuss and would like to learn more about liquidsoap, this will be a great place to connect! Opium 0.20.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce a new version of [Opium] web framework (0.20.0) is available on Opam. Here's the changelog: [Opium] Added =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 New `Auth' module to work with `Authorization' header ([#238]) =E2=80=A2 New `basic_auth' middleware to protect handlers with a `Basic' authentication method ([#238]) =E2=80=A2 New `Response.of_file' API for conveniently creating a response= of a file ([#244]) =E2=80=A2 Add a package `opium-graphql' to easily create GraphQL server w= ith Opium ([#235]) =E2=80=A2 Add a function `App.run_multicore' that uses pre-forking and sp= awns multiple processes that will handle incoming requests ([#239]) [#238] [#244] [#235] [#239] Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Fix reading cookie values when multiple cookies are present in `Cookie' header ([#246]) Happy hacking :slight_smile: [#246] Set up OCaml 1.1.5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release reduces build time by up to 2 minutes by exporting modified `OPAMJOBS' environment variable. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Memthol: exploring program profiling] =E2=80=A2 [Growing the Hardcaml toolset] =E2=80=A2 [ Editor Plugin for VSCode and Vim Officially Released!] =E2=80=A2 [Announcing Our Market Prediction Kaggle Competition] =E2=80=A2 [Every proof assistant: introducing homotopy.io =E2=80=93 a pro= of assistant for geometrical higher category theory] [OCaml Planet] [Memthol: exploring program profiling] [Growing the Hardcaml toolset] [ Editor Plugin for VSCode and Vim Officially Released!] [Announcing Our Market Prediction Kaggle Competition] [Every proof assistant: introducing homotopy.io =E2=80=93 a proof assistant= for geometrical higher category theory] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 08 to 15, 20= 20.

MirageOS 3.10 released

Hannes Mehnert announced

we're pleased to announce MirageOS 3.10:

IPv6 and dual (IPv4 and IPv6) stack support https://github.com/mirage/mirage/pull/1187 https://github.com= /mirage/mirage/issues/1190

Since a long time, IPv6 code was around in our TCP/IP stack (thanks to @noj= b who developed it in 2014). Some months ago, @hannesm and @MagnusS got excited to use it. After we mana= ged to fix some bugs and add some test cases, and writing more code to setup IPv6-only and dual stacks, = we are eager to share this support for MirageOS in a released version. We expect there to be bugs ling= ering around, but duplicate address detection (neighbour solicitation and advertisements) has been impl= emented, and (unless "–accept-router-advertisement=3Dfalse") router advertisements are de= coded and used to configure the IPv6 part of the stack. Configuring a static IPv6 address is also possible (with "–ipv6=3D2001::42/64").

While at it, we unified the boot arguments between the different targets: n= amely, on Unix (when using the socket stack), you can now pass "–ipv4=3D127.0.0.1/24" to the sa= me effect as the direct stack: only listen on 127.0.0.1 (the subnet mask is ignored for the Unix socket stack).

A dual stack unikernel has "–ipv4-only=3DBOOL" and "–ipv6-onl= y=3DBOOL" parameters, so a unikernel binary could support both Internet Protocol versions, while the operator can decid= e which protocol version to use. I.e. now there are both development-time (stackv4 vs stackv6 vs stackv= 4v6) choices, as well as the run-time choice (via boot parameter).

I'm keen to remove the stackv4 & stackv6 in future versions, and always= develop with dual stack (leaving it to configuration & startup time to decide whether to enable= ipv4 and ipv6).

Please also note that the default IPv4 network configuration no longer uses= 10.0.0.1 as default gateway (since there was no way to unset the default gateway https://github.com/mirage/mirage/issues/= 1147).

For unikernel developers, there are some API changes in the Mirage module

  • New "v4v6" types for IP protocols and stacks
  • The ipv6_config record was adjusted in the same fashion as the ipv4_con= fig type: it is now a record of a network (V6.Prefix.t) and gateway (V6.t o= ption)

Some parts of the Mirage_key module were unified as well:

  • Arp.ip_address is available (for a dual Ipaddr.t)
  • Arg.ipv6_address replaces Arg.ipv6 (for an Ipaddr.V6.t)
  • Arg.ipv6 replaces Arg.ipv6_prefix (for a Ipaddr.V6.Prefix.t)
  • V6.network and V6.gateway are available, mirroring the V4 submodule

If you're ready to experiment with the dual stack: below is a diff for our = basic network example (from mirage-skeleton/device-usage/network) replacing IPv4 with a dual stack, and= the tlstunnel unikernel commit https://github.com/roburio/tlstunnel/commit/2cb3e5aa1= 1fca4b48bb524f3c0dbb754a6c8739b changed tlstunnel from IPv4 stack to dual stack.

diff=
 --git a/device-usage/network/config.ml b/device-usage/network/config.ml
index c425edb..eabc9d6 100644
--- a/device-usage/network/config.ml
+++ b/device-usage/network/config.ml
@@ -4,9 +4,9 @@ let port =3D
   let doc =3D Key.Arg.info ~doc:"The TCP port on which to listen for
incoming connections." ["port"] in
   Key.(create "port" Arg.(opt int 8080 doc))

-let main =3D foreign ~keys:[Key.abstract=
 port] "Unikernel.Main" (stackv4
@-> job)
+let main =3D foreign ~keys:[Key.abstract=
 port] "Unikernel.Main"
(stackv4v6 @-> job)

-let stack =3D generic_stackv4 default_ne=
twork
+let stack =3D generic_stackv4v6 default_network

 let () =3D
   register "network" [
diff --git a/device-usage/networ=
k/unikernel.ml
b/device-usage/network/unikernel.ml
index 5d29111..1bf1228 100644
--- a/device-usage/network/unikernel.m=
l
+++ b/device-usage/network/unikernel.m=
l
@@ -1,19 +1,19 @@
 open Lwt.Infix

-module Main (S: Mirage_stack.V4) =3D str=
uct
+module Main (S: Mirage_stack.V4V6) =3D s=
truct

   let start s =3D
     let port =3D Key_gen.port () in
-    S.listen_tcpv4 s ~port (fun flow -&g=
t;
-        let dst, dst_port =3D S.TCPV4.ds=
t flow in
+    S.listen_tcp s ~port (fun flow ->=

+        let dst, dst_port =3D S.TCP.dst =
flow in
         Logs.info (fun f -> f "new tcp connection from IP %s on port %d"
-                  (Ipaddr.V4.to_string d=
st) dst_port);
-        S.TCPV4.read flow >>=3D fu=
nction
+                  (Ipaddr.to_string dst)=
 dst_port);
+        S.TCP.read flow >>=3D func=
tion
         | Ok `Eof -> Logs.info (fun f -> f "Closing connection!");
Lwt.return_unit
-        | Error e -> Logs.warn (fun f=
 -> f "Error reading data from
established connection: %a" S.TCPV4.pp_error e); Lwt.return_unit
+        | Error e -> Logs.warn (fun f=
 -> f "Error reading data from
established connection: %a" S.TCP.pp_error e); Lwt.return_unit
         | Ok (`Data b) ->
           Logs.debug (fun f -> f "read: %d bytes:\n%s" (Cstruct.len b)
(Cstruct.to_string b));
-          S.TCPV4.close flow
+          S.TCP.close flow
       );

     S.listen s

Other bug fixes include https://github.com/mirage/mirage/issues/1188 (in https://github.com/m= irage/mirage/pull/1201) and adapt to charrua 1.3.0 and arp 2.3.0 changes (https://github.com/= mirage/mirage/pull/1199).

Exception vs Result

Continuing this thread, Vladimir Keleshev announced

A bit late to the party, but here's an overview of error handling methods t= hat I did a while ago:

Composa= ble Error Handling in OCaml (keleshev.com)

It compares the following approaches:

  • Exceptions
  • Result type with strings for errors
  • Result type with custom variants for errors
  • Result type with polymorphic variants for errors

Release: scikit-learn, Numpy, Scipy for OCaml, 0.3.1

Ronan Le Hy announced

I've just released an update of OCaml wrappers for scikit-learn:

These bindings also come with bindings for Numpy (opam install np) and Scipy (opam install scipy).

Scikit-learn is all of these things:

  • Simple and efficient tools for predictive data analysis
  • Accessible to everybody, and reusable in various contexts
  • Built on NumPy, SciPy, and matplotlib
  • Open source, commercially usable - BSD license

Scikit-learn is robust, well-engineered and covers most basic machine learn= ing use cases. As a professional data scientist I use it extensively from Python. I built these= wrappers because I felt challenged by my friend @UnixJunkie's funny R wrappers.

I don't depend personally on these packages and maintain/improve them witho= ut any guarantees. They have many unpolished corners. However, they have tests and I don't expect them t= o add too many bugs to scikit-learn. Contributions and bug reports are welcome (but be aware that = the bindings are generated from a big hairy Python script).

Many thanks to everybody involved in opam!

OCaml 4.10.2

octachron announced

The OCaml team has the pleasure of celebrating the birthday of Grace Hopper= by announcing the release of OCaml version 4.10.2.

This exceptional release makes OCaml 4.10 available on the new macOS/arm64 = platform, and fixes some compatibility issues for the mingw64 and FreeBSD/amd64 platf= orm.

If OCaml 4.10.1 already works on your platform of choice, this release shou= ld be completely transparent to you (and can be safely ignored).

Note that those fixes were backported from OCaml 4.12: further improvement = to the support of the macOS/arm64 platform will happen on the 4.12 branch.

The release is available as a set of OPAM switches, and as a source download here:

https://gi= thub.com/ocaml/ocaml/archive/4.10.2.tar.gz
https://caml.inri= a.fr/pub/distrib/ocaml-4.10/

OCaml 4.10.2

  • 9938, 9939: Define __USE_MIN= GW_ANSI_STDIO=3D0 for the mingw-w64 ports to prevent their C99-compliant sn= printf conflicting with ours. (David Allsopp, report by Michael Soegtrop, r= eview by Xavier Leroy)
  • Supported platforms:
    • 9699, 10026: add support fo= r iOS and macOS on ARM 64 bits Backported from OCaml 4.12.0 (GitHub user @E= duardoRFS, review by Xavier Leroy, Nicol=C3=A1s Ojeda B=C3=A4r and Anil Mad= havapeddy, additional testing by Michael Schmidt)
  • Code generation and optimization
    • 9752, 10026: Revised handli= ng of calling conventions for external C functions. Provide a more precise = description of the types of unboxed arguments, so that the ARM64 iOS/macOS = calling conventions can be honored. Backported from OCaml 4.12.0 (Xavier Le= roy, review by Mark Shinwell and Github user @EduardoRFS)
    • 9969, 9981: Added mergeable = flag tqo ELF sections containing mergeable constants. Fixes compatibility = with the integrated assembler in clang 11.0.0. Backported from OCaml 4.12.0= (Jacob Young, review by Nicol=C3=A1s Ojeda B=C3=A4r)

Anil Madhavapeddy

There is also a macos/arm64 binary of opam available from the releases page for your convenience, and opam repository = has been updated to understand the new tier-1 constraints imposed by macos/arm (i.e. the only w= orking compilers there are 4.10.2 and 4.12.0~dev, and opam init will now do the right thi= ng).

There will be a number of packages that are broken due to the shift to /opt/homebrew from /usr/local for Homebrew/ARM (due to the need to keep them simu= ltaneously installed on the same Mac), so please feel free to submit PRs to opam-repository to fix this stuff.

We'll shortly have Mac (both Intel and ARM) testing up and running on opam-= repository, so CI will catch up with reality once more, thanks to furious hacking by @patricoferris to e= xtend our ocurrent-based CI infrastructure to support the unique vagaries of the Mac environment (notab= ly, a total lack of native containers). We have it working locally, and are just upstreaming it now.

BAP 2.2.0 Release

Ivan Gotovchits announced

We are proud to announce the 2.2.0 release of the Carnegie Mellon Universit= y Binary Analysis Platform. BAP is the framework and toolkit for analyzing programs in th= eir machine code representation. This update has a lot of new features despite that o= riginally it was more as a maintenance version. Special thanks to @XVilka and @Phosphorus15 for contributing Thumb/ThumbV2 lifter and radare2 integration. We would also like to thank ForAllSecure for open-sourcing and contributing to us their x86 floating-point lifter. The new version of BAP = is also much more efficient and we now have a much better symbolization facility (so we're no longer re= ally dependent on the presence of external tools). Another nice addition is a new REPL powered by= ocaml-linen= oise, see the demo below.

https://asciinema.org/a/358996

Liquidshop 1.0, Jan. 17th and 18th, 2021

Romain Beauxis announced

We are happy to announce that we'll be holding Liquidshop 1.0 these coming = Jan. 17th & 18th, our first ever (online) conference and workshops on liquidsoap and other related tech= nologies and projects!

Liquidsoap is a statically typed scripting language with specialized primit= ives and operators for creating media streams used for media processing, online streaming and a lo= t more. It is written in OCaml and has been maintained for over a decade now.

We will have 3 different tracks for the event, namely:

  • Showcases: short presentations about a website / radio / art installati= on that you built using Liquidsoap or other related tools
  • Tech talks: in-depth presentation of a technology related to Liquidsoap= and streaming in general
  • Workshops: user-centered freeform discussions about your project or iss= ues around Liquidsoap and streaming

If you're interested to participate, wether as an attendee or a presenter, = make sure to register via our website at: http://w= ww.liquidsoap.info/liquidshop/ or directly via the form available at: https://forms.gle/HdGNLz5qM= 3HVU1ub7

We are super excited for this event. We have already secured a couple of in= teresting speakers and we would love to get to know the community better, see what y'all are doing wi= th liquidsoap and other releated projects, community radios, live video, weird installations, etc. = and meet with everyone.

Also, if you have any suggestion about the best technical solutions to orga= nize such an event, we'd be happy to hear about them.

Finally, if any of y'all have some specific topics to discuss and would lik= e to learn more about liquidsoap, this will be a great place to connect!

Opium 0.20.0

Thibaut Mattio announced

I'm pleased to announce a new version of Opium web framework (0.20.0) is available on Opam.

Here's the changelog:

Added

Fixed

  • Fix reading cookie values when multiple cookies are present in Co= okie header (#246)

Happy hacking :slight_smile:

Set up OCaml 1.1.5

Sora Morimoto announced

This release reduces build time by up to 2 minutes by exporting modified OPAMJOBS environment variable.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.5

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 108D8E020B for ; Tue, 22 Dec 2020 09:48:58 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.78,438,1599516000"; d="scan'208,217";a="368319284" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Dec 2020 09:48:57 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 22 Dec 2020 09:48:56 +0100 Message-ID: <87czz21b0n.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMTUgdG8gMjIsDQoyMDIwLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCm9jYW1s LWxzcC1zZXJ2ZXIgMS40LjANCk9DYW1sIDQuMTIuMCwgdGhpcmQgYWxwaGEgcmVsZWFzZQ0KTHd0 IDUuNC4wLCBMd3RfcHB4IDIuMC4yLCBMd3RfcmVhY3QgMS4xLjQgcmVsZWFzZXMNClNlbmlvciBz b2Z0d2FyZSBlbmdpbmVlciBhdCBEb2NlbnQsIEZyYW5jZSAtIFJlbW90ZSBPSw0KT2xkIENXTg0K DQoNCm9jYW1sLWxzcC1zZXJ2ZXIgMS40LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLWxzcC1zZXJ2ZXItMS00LTAvNjk5 Ni8xPg0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBi ZWhhbGYgb2YgdGhlIG9jYW1sLWxzcCB0ZWFtLCBpdCBpcyBteSBwbGVhc3VyZSB0byBhbm5vdW5j ZSB2ZXJzaW9uDQogIDEuNC4wLiBUaGlzIHJlbGVhc2UgaW50cm9kdWNlcyBzdXBwb3J0IGZvciBb YXV0b21hdGljIHNpZ25hdHVyZSBoZWxwXS4NCiAgU2lnbmF0dXJlIGhlbHAgaXMgbm90IHlldCBw cmVzZW50IGluIGFsbCBwb3NzaWJsZSBjb250ZXh0cy4gV2UgaW50ZW5kDQogIHRvIGltcHJvdmUg dG8gc3VwcG9ydCBhcyBtYW55IHJlbGV2YW50IGxhbmd1YWdlIGNvbnN0cnVjdHMgYXMgcG9zc2li bGUNCiAgaW4gdGhlIGZ1dHVyZS4gTWFueSB0aGFua3MgdG8gQG1ueG4gZm9yIGltcGxlbWVudGlu ZyB0aGlzIGZlYXR1cmUuDQoNCiAgVGhlIGZ1bGwgY2hhbmdlIGxvZyBpcyByZXBsaWNhdGVkIGF0 IHRoZSBlbmQgb2YgdGhpcyBwb3N0IGZvciB5b3VyDQogIGNvbnZlbmllbmNlLg0KDQogIEhhcHB5 IEhvbGlkYXlzIQ0KDQogIOKAoiBTdXBwb3J0IGNhbmNlbGxhdGlvbiBub3RpZmljYXRpb25zIHdo ZW4gcG9zc2libGUuICgjMzIzKQ0KDQogIOKAoiBJbXBsZW1lbnQgc2lnbmF0dXJlIGhlbHAgcmVx dWVzdCBmb3IgZnVuY3Rpb25zICgjMzI0KQ0KDQogIOKAoiBTZXJ2ZXIgTFNQIHJlcXVlc3RzICYg bm90aWZpY2F0aW9ucyBjb25jdXJyZW50bHkuIFJlcXVlc3RzIHRoYXQNCiAgICByZXF1aXJlIG1l cmxpbiBhcmUgc3RpbGwgc2VyaWFsaXplZC4gKCMzMzApDQoNCg0KW2F1dG9tYXRpYyBzaWduYXR1 cmUgaGVscF0NCjxodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS9hcGkvbGFuZ3VhZ2UtZXh0 ZW5zaW9ucy9wcm9ncmFtbWF0aWMtbGFuZ3VhZ2UtZmVhdHVyZXMjaGVscC13aXRoLWZ1bmN0aW9u LWFuZC1tZXRob2Qtc2lnbmF0dXJlcz4NCg0KDQpPQ2FtbCA0LjEyLjAsIHRoaXJkIGFscGhhIHJl bGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMi0wLXRoaXJk LWFscGhhLXJlbGVhc2UvNjk5Ny8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRo ZSByZWxlYXNlIG9mIE9DYW1sIDQuMTIuMCBpcyBhcHByb2FjaGluZy4gV2UgaGF2ZSByZWxlYXNl ZCBhIHRoaXJkDQogIGFscGhhIHZlcnNpb24gdG8gaGVscCBmZWxsb3cgaGFja2VycyBqb2luIHVz IGVhcmx5IGluIG91ciBidWcgaHVudGluZw0KICBhbmQgb3BhbSBlY29zeXN0ZW0gZml4aW5nIGZ1 bi4NCg0KICBCZXlvbmQgdGhlIHVzdWFsIGJ1ZyBmaXhlcywgdGhpcyBuZXcgYWxwaGEgdmVyc2lv biBjb250YWlucyB0d28gc21hbGwNCiAgQVBJIGZpeGVzIGZvciBzdGF0bWVtcHJvZiBhbmQgdGhl IFVuaXggbW9kdWxlLiAoS2Vlbi1leWVkIHJlYWRlcnMNCiAgbWlnaHQgbm90aWNlIGEgYnJlYWtp bmcgY2hhbmdlIGluIHRoZSBjaGFuZ2UgbG9nIGJlbG93IGJ1dCB0aGlzDQogIGNvbmNlcm5zIGEg Y29ybmVyIGNhc2Ugb2YgYSBjb3JuZXIgY2FzZSBvZiB0aGUgdHlwZSBzeXN0ZW0gdGhhdCBzaG91 bGQNCiAgbm90IGFmZmVjdCBhbnlvbmUuKQ0KDQogIFRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBp bnN0YWxsZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRz DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNo IGNyZWF0ZSA0LjEyLjB+YWxwaGEzDQogIOKUgiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJldGE9 Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQog IOKUlOKUgOKUgOKUgOKUgA0KICBJZiB5b3Ugd2FudCB0byB0d2VhayB0aGUgY29uZmlndXJhdGlv biBvZiB0aGUgY29tcGlsZXIsIHlvdSBjYW4gcGljaw0KICBjb25maWd1cmF0aW9uIG9wdGlvbnMg d2l0aA0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3 aXRjaCBjcmVhdGUgPHN3aXRjaF9uYW1lPiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTIu MH5hbHBoYTMrb3B0aW9ucyw8b3B0aW9uX2xpc3Q+DQogIOKUgiAtLXJlcG9zaXRvcmllcz1kZWZh dWx0LGJldGE9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRv cnkuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KICB3aGVyZSA8b3B0aW9uX2xpc3Q+IGlzIGEgY29t bWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb2NhbWwtb3B0aW9uLSoNCiAgcGFja2FnZXMuIEZvciBpbnN0 YW5jZSwgZm9yIGEgZmxhbWJkYSBhbmQgYWZsIGVuYWJsZWQgc3dpdGNoOg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjEyLjB+YWxwaGEzK2ZsYW1iZGErYWZs DQogIOKUgiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTIuMH5hbHBoYTMrb3B0aW9ucyxv Y2FtbC1vcHRpb24tZmxhbWJkYSxvY2FtbC1vcHRpb24tYWZsDQogIOKUgiAtLXJlcG9zaXRvcmll cz1kZWZhdWx0LGJldGE9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJl cG9zaXRvcnkuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KICBBbGwgYXZhaWxhYmxlIG9wdGlvbnMg Y2FuIGJlIGxpc3RlZCB3aXRoICJvcGFtIHNlYXJjaCBvY2FtbC1vcHRpb24iLg0KDQogIFRoZSBz b3VyY2UgY29kZSBmb3IgdGhlIGFscGhhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJl c3NlczoNCg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQu MTIuMC1hbHBoYTMudGFyLmd6Pg0KICDigKIgPGh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlz dHJpYi9vY2FtbC00LjEyL29jYW1sLTQuMTIuMH5hbHBoYTMudGFyLmd6Pg0KDQogIElmIHlvdSB3 YW50IHRvIHRlc3QgdGhpcyB2ZXJzaW9uLCBpdCBpcyBhZHZpc2VkIHRvIGluc3RhbGwgdGhlIGFs cGhhDQogIG9wYW0gcmVwb3NpdG9yeQ0KDQogIDxodHRwczovL2dpdGh1Yi5jb20va2l0LXR5LWth dGUvb3BhbS1hbHBoYS1yZXBvc2l0b3J5Pg0KDQogIHdpdGgNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBvcGFtIHJlcG8gYWRkIGFscGhhIGdpdDovL2dpdGh1Yi5jb20va2l0LXR5LWthdGUvb3Bh bS1hbHBoYS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgVGhpcyBhbHBoYSBy ZXBvc2l0b3J5IGNvbnRhaW5zIHZhcmlvdXMgcGFja2FnZXMgcGF0Y2hlZCB3aXRoIGZpeGVzIGlu DQogIHRoZSBwcm9jZXNzIG9mIGJlaW5nIHVwc3RyZWFtZWQuIE9uY2UgdGhlIHJlcG9zaXRvcnkg aW5zdGFsbGVkLCB0aGVzZQ0KICBwYXRjaGVkIHBhY2thZ2VzIHdpbGwgdGFrZSBwcmVjZWRlbmNl IG92ZXIgdGhlIG5vbi1wYXRjaGVkIHZlcnNpb24uDQoNCiAgSWYgeW91IGZpbmQgYW55IGJ1Z3Ms IHBsZWFzZSByZXBvcnQgdGhlbSBoZXJlOg0KICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9pc3N1ZXM+DQoNCg0KQ2hhbmdlcyBmcm9tIHRoZSBzZWNvbmQgYWxwaGE6DQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgKmFkZGl0aW9uYWwgZml4ZXMqIFsx MTI4XSwgWzc1MDNdLCBbOTAzNl0sIFs5NzIyXSwgK1sxMDA2OV06DQogICAgIEVJTlRSLWJhc2Vk IHNpZ25hbCBoYW5kbGluZy4gV2hlbiBhIHNpZ25hbCBhcnJpdmVzLCBhdm9pZCBydW5uaW5nDQog ICAgIGl0cyBPQ2FtbCBoYW5kbGVyIGluIHRoZSBtaWRkbGUgb2YgYSBibG9ja2luZyBzZWN0aW9u LiBJbnN0ZWFkLA0KICAgICBhbGxvdyBjb250cm9sIHRvIHJldHVybiBxdWlja2x5IHRvIGEgcG9s bGluZyBwb2ludCB3aGVyZSB0aGUgc2lnbmFsDQogICAgIGhhbmRsZXIgY2FuIHNhZmVseSBydW4s IGVuc3VyaW5nIHRoYXQNCg0KICDigKIgWzk5MDddOiBGaXggbmF0aXZlIHRvcGxldmVsIG9uIG5h dGl2ZSBXaW5kb3dzLiAoRGF2aWQgQWxsc29wcCwNCiAgICByZXZpZXcgYnkgRmxvcmlhbiBBbmdl bGV0dGkpDQoNCiAg4oCiIFsxMDA1Nl06IE1lbXByb2Y6IGVuc3VyZSB5b3VuZ190cmlnZ2VyIGlz IHdpdGhpbiB0aGUgYm91bmRzIG9mIHRoZQ0KICAgIG1pbm9yIGhlYXAgaW4gY2FtbF9tZW1wcm9m X3JlbmV3X21pbm9yX3NhbXBsZSAocmVncmVzc2lvbiBmcm9tDQogICAgWzg2ODRdKSAoRGF2aWQg QWxsc29wcCwgcmV2aWV3IGJ5IEd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pIGFuZA0KICAgIEph Y3F1ZXMtSGVucmkgSm91cmRhbikNCg0KICDigKIgWzEwMDYyXTogc2V0IEFSQ0hfSU5UNjRfUFJJ TlRGX0ZPUk1BVCBjb3JyZWN0bHkgZm9yIGJvdGggbW9kZXMgb2YNCiAgICBtaW5ndy13NjQgKERh dmlkIEFsbHNvcHAsIHJldmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFsxMDAyNV06IFRy YWNrIGN1c3RvbSBibG9ja3MgKGUuZy4gQmlnYXJyYXkpIHdpdGggU3RhdG1lbXByb2YNCiAgICAo U3RlcGhlbiBEb2xhbiwgcmV2aWV3IGJ5IExlbyBXaGl0ZSwgR2FicmllbCBTY2hlcmVyIGFuZA0K ICAgIEphY3F1ZXMtSGVucmkgSm91cmRhbikNCg0KICDigKIgWzEwMDcwXTogRml4IEZsb2F0LkFy cmF5LmJsaXQgd2hlbiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGFycmF5cw0KICAgIGNvaW5jaWRl LiAoTmljb2zDoXMgT2plZGEgQsOkciwgcmV2aWV3IGJ5IEFsYWluIEZyaXNjaCBhbmQgWGF2aWVy DQogICAgTGVyb3kpDQoNCiAg4oCiICphZGRpdGlvbmFsIGZpeGVzKiBbOTg2OV0sICtbMTAwNzNd OiBBZGQgVW5peC5TT19SRVVTRVBPUlQgKFlpc2h1YWkNCiAgICAgTGksIHJldmlldyBieSBYYXZp ZXIgTGVyb3ksIGFtZW5kZWQgYnkgRGF2aWQgQWxsc29wcCkNCg0KICDigKIgWzk4NzddOiBtYW51 YWwsIHdhcm4gdGhhdCBtdWx0aS1pbmRleCBpbmRleGluZyBvcGVyYXRvcnMgc2hvdWxkIGJlDQog ICAgZGVmaW5lZCBpbiBjb25qdW5jdGlvbiBvZiBzaW5nbGUtaW5kZXggb25lcy4gKEZsb3JpYW4g QW5nZWxldHRpLA0KICAgIHJldmlldyBieSBIZXpla2lhaCBNLiBDYXJ0eSwgR2FicmllbCBTY2hl cmVyLCBhbmQgTWFyY2VsbG8gU2VyaSkNCg0KICDigKIgWzEwMDQ2XTogTGluayBhbGwgRExMcyB3 aXRoIC1zdGF0aWMtbGliZ2NjIG9uIG1pbmd3MzIgdG8gcHJldmVudA0KICAgIGRlcGVuZGVuY3kg b24gbGliZ2NjX3Nfc2psai0xLmRsbCB3aXRoIG1pbmd3LXc2NCBydW50aW1lIDguMC4wDQogICAg KHByZXZpb3VzbHkgdGhpcyB3YXMgb25seSBuZWVkZWQgZm9yIGRsbHVuaXguZGxsKS4gKERhdmlk IEFsbHNvcHAsDQogICAgcmVwb3J0IGJ5IEFuZHJlYXMgSGF1cHRtYW5uLCByZXZpZXcgYnkgWGF2 aWVyIExlcm95KQ0KDQogIOKAoiBbOTg5Nl06IFNoYXJlIHRoZSBzdHJpbmdzIHJlcHJlc2VudGlu ZyBzY29wZXMsIGZpeGluZyBzb21lDQogICAgcmVncmVzc2lvbiBvbiAuY21vLy5jbWEgc2l6ZXMg KEFsYWluIEZyaXNjaCBhbmQgWGF2aWVyIENsZXJjLCByZXZpZXcNCiAgICBieSBHYWJyaWVsIFNj aGVyZXIpDQoNCiAg4oCiIFsxMDA0NF06IEFsd2F5cyByZXBvcnQgdGhlIGRldGVjdGVkIEFSQ0gs IE1PREVMIGFuZCBTWVNURU0sIGV2ZW4gZm9yDQogICAgYnl0ZWNvZGUtIG9ubHkgYnVpbGRzIChm aXhlcyBhICJjb25maWd1cmF0aW9uIHJlZ3Jlc3Npb24iIGZyb20gNC4wOA0KICAgIGZvciB0aGUg V2luZG93cyBidWlsZHMpIChEYXZpZCBBbGxzb3BwLCByZXZpZXcgYnkgWGF2aWVyIExlcm95KQ0K DQogIOKAoiBbMTAwNzFdOiBGaXggYnVnIGluIHRlc3RzL21pc2Mvd2Vha2xpZmV0aW1lLm1sIHRo YXQgd2FzIHJlcG9ydGVkIGluDQogICAgWzEwMDU1XSAoRGFtaWVuIERvbGlnZXogYW5kIEdhYnJp ZWwgU2NoZXJlciwgcmVwb3J0IGJ5IERhdmlkDQogICAgQWxsc29wcCkNCg0KICDigKIgKmJyZWFr aW5nIGNoYW5nZSogWzg5MDddLCBbOTg3OF06IGBUeXBlbW9kLm5vcm1hbGl6ZV9zaWduYXR1cmUn IHVzZXMNCiAgICAgd3JvbmcgZW52aXJvbm1lbnQgRG9lcyBub3QgdHJlYXQgc3VibW9kdWxlcyBk aWZmZXJlbnRseSB3aGVuDQogICAgIG5vcm1hbGl6aW5nIGNvbmp1bmN0aXZlIHR5cGVzIGluIHBv bHltb3JwaGljIHZhcmlhbnRzLiBUaGlzIG1heQ0KICAgICBicmVhayBjb2RlIHRoYXQgZXhwb3Nl IGNvbmp1bmN0aXZlIHR5cGVzIGluIGluZmVycmVkDQogICAgIGludGVyZmFjZS4gKEphY3F1ZXMg R2FycmlndWUsIHJlcG9ydCBhbmQgcmV2aWV3IGJ5IExlbyBXaGl0ZSkNCg0KICDigKIgWzk3Mzld LCBbOTc0N106IEF2b2lkIGNhbGxpbmcgdHlwZSB2YXJpYWJsZXMsIHR5cGVzIHRoYXQgYXJlIG5v dA0KICAgIHZhcmlhYmxlcyBpbiByZWN1cnNpdmUgb2NjdXJlbmNlIGVycm9yIG1lc3NhZ2VzIChm b3IgaW5zdGFuY2UsICJUeXBlDQogICAgdmFyaWFibGUgaW50IG9jY3VycyBpbnNpZGUgaW50IGxp c3QiKSAoRmxvcmlhbiBBbmdlbGV0dGksIHJlcG9ydCBieQ0KICAgIFN0ZXBoZW4gRG9sYW4sIHJl dmlldyBieSBBcm1hw6tsIEd1w6luZWF1KQ0KDQogIOKAoiBbMTAwNDhdOiBGaXggYnVnIHdpdGgg Z2VuZXJhbGl6ZWQgbG9jYWwgb3BlbnMuIChMZW8gV2hpdGUsIHJldmlldyBieQ0KICAgIFRob21h cyBSZWZpcykNCg0KDQpbMTEyOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMvMTEyOD4NCg0KWzc1MDNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVz Lzc1MDM+DQoNCls5MDM2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85 MDM2Pg0KDQpbOTcyMl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTcy Mj4NCg0KWzEwMDY5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDA2 OT4NCg0KWzk5MDddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk5MDc+ DQoNClsxMDA1Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAwNTY+ DQoNCls4Njg0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy84Njg0Pg0K DQpbMTAwNjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDYyPg0K DQpbMTAwMjVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDI1Pg0K DQpbMTAwNzBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDcwPg0K DQpbOTg2OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTg2OT4NCg0K WzEwMDczXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDA3Mz4NCg0K Wzk4NzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk4Nzc+DQoNClsx MDA0Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAwNDY+DQoNCls5 ODk2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85ODk2Pg0KDQpbMTAw NDRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDQ0Pg0KDQpbMTAw NzFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDcxPg0KDQpbMTAw NTVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwMDU1Pg0KDQpbODkw N10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvODkwNz4NCg0KWzk4Nzhd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk4Nzg+DQoNCls5NzM5XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85NzM5Pg0KDQpbOTc0N10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTc0Nz4NCg0KWzEwMDQ4XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDA0OD4NCg0KDQpMd3QgNS40LjAs IEx3dF9wcHggMi4wLjIsIEx3dF9yZWFjdCAxLjEuNCByZWxlYXNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tbHd0LTUtNC0wLWx3dC1wcHgtMi0wLTItbHd0LXJlYWN0LTEtMS00LXJl bGVhc2VzLzcwMDEvMT4NCg0KDQpSYXBoYcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBXZSBhcmUgZ2xhZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiB2ZXJzaW9u IDUuNC4wIG9mIEx3dCwgdmVyc2lvbg0KICAyLjAuMiBvZiBMd3RfcHB4LCBhbmQgdmVyc2lvbiAx LjEuNCBvZiBMd3RfcmVhY3QuDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9y ZWxlYXNlcy90YWcvNS40LjA+DQoNCiAgSXQgY2FuIGJlIGluc3RhbGxlZCBmcm9tIG9wYW0gYXMg dXN1YWw6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3Bh bSB1cGdyYWRlIGx3dCBsd3RfcHB4IGx3dF9yZWFjdA0KICDilJTilIDilIDilIDilIANCg0KDQpP Q2FtbCA0LjEyIGNvbXBhdGliaWxpdHkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdpdGggdGhpcyBy ZWxlYXNlLCBMd3QgaXMgbm93IGNvbXBhdGlibGUgd2l0aCBPQ2FtbCA0LjEyLiBUaGFua3MNCiAg QGtpdC10eS1rYXRlIGZvciB0aGUgY29udHJpYnV0aW9uIHRvd2FyZHMgdGhpcyBzdXBwb3J0Lg0K DQogIFRoYW5rcyBhcyB3ZWxsIHRvIGFsbCB0aGUgb3RoZXIgY29udHJpYnV0b3JzIGZvciBhbGwg dGhlIG90aGVyDQogIGltcHJvdmVtZW50cyB0aGF0IG1hZGUgaXQgaW50byB0aGlzIHJlbGVhc2Uu IENoZWNrLW91dCB0aGUgcmVsZWFzZSdzDQogIGNoYW5nZWxvZyAobGluayBhYm92ZSkgZm9yIGEg ZnVsbCBsaXN0IG9mIGJ1Z2ZpeGVzIGFuZCBhZGRpdGlvbnMuDQoNCg0KTWFpbnRhaW5lcnMnIG5v dGVzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBBcyBwZXIgW2EgcHJldmlvdXMgYW5ub3VuY2VdIEkgYW0gYSBjby1tYWludGFpbmVy IG9mIEx3dC4gV2l0aCB0aGlzDQogIHJlbGVhc2UgSSdtIHRha2luZyBvbiBhIG1vcmUgYW5kIG1v cmUgY2VudHJhbCByb2xlIGluIHRoZSBtYWludGVuYW5jZQ0KICBlZmZvcnQuIFdoaWxzdCBJJ3Zl IHJlY2VpdmVkIGEgbG90IG9mIGhlbHAgZ2V0dGluZyB0aGlzIHJlbGVhc2UNCiAgdG9nZXRoZXIs IEknbSBtb3N0IGxpa2VseSB0aGUgb25lIHJlc3BvbnNpYmxlIGZvciBhbnkgaXNzdWVzIGluIHRo ZQ0KICBwcm9jZXNzLg0KDQogIEknZCBsaWtlIHRvIHRoYW5rIEBhbnRyb24gd2hvIGlzIGFzIHN0 ZWxsYXIgd2l0aCBtYWludGVuYW5jZSBvZiB0aGUNCiAgcHJvamVjdCBhcyBoZSBpcyB3aXRoIGd1 aWRpbmcgbWUgdGhyb3VnaCB0aGUgbGVhcm5pbmcgcHJvY2Vzcy4gSSdkDQogIGFsc28gbGlrZSB0 byB0aGFuayB0aGUgb3BhbS1yZXBvc2l0b3J5IHRlYW0gd2hvIHN0ZXBwZWQgdXAgdmVyeQ0KICBx dWlja2x5IHRvIGZpeCBzb21lIENJLXJlbGF0ZWQgYnVpbGQtaXNzdWVzLiBBbmQgSSdkIGxpa2Ug dG8gdGhhbmsgbXkNCiAgZW1wbG95ZXIsIFtOb21hZGljIExhYnNdLCB3aG8gYWdyZWVkIHRvIG1h a2UgTHd0IG1haW50ZW5hbmNlIHBhcnQgb2YNCiAgbXkgZGF5IGpvYi4NCg0KICBJJ20gbG9va2lu ZyBmb3J3YXJkIHRvIGFsbCB5b3VyIGJ1ZyByZXBvcnRzLCBwdWxsIHJlcXVlc3RzLCBjb21tZW50 cywNCiAgaWRlYXMsIHF1ZXN0aW9ucywgcmVtYXJrcywgYXMgd2VsbCBhcyBhbnkgc29ydCBvZiBm ZWVkYmFjay4gRG9uJ3QNCiAgaGVzaXRhdGUgdG8gZ2V0IGluIHRvdWNoIQ0KDQoNClthIHByZXZp b3VzIGFubm91bmNlXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5nLWEt bmV3LW1haW50YWluZXItZm9yLWx3dC82MTkyPg0KDQpbTm9tYWRpYyBMYWJzXSA8aHR0cHM6Ly9u b21hZGljLWxhYnMuY29tLz4NCg0KDQpTZW5pb3Igc29mdHdhcmUgZW5naW5lZXIgYXQgRG9jZW50 LCBGcmFuY2UgLSBSZW1vdGUgT0sNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvc2VuaW9yLXNvZnR3YXJlLWVuZ2luZWVyLWF0LWRvY2VudC1mcmFuY2UtcmVtb3RlLW9rLzcw MDIvMT4NCg0KDQpUaGliYXV0IE1hdHRpbyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IERvY2VudCwgYSBjb21wYW55IEknbSB3b3JraW5nIHdpdGgsIGlzIHJlY3J1aXRpbmcgYW4gT0Nh bWwNCiAgZGV2ZWxvcGVyLiBZb3UgY2FuIHNlZSB0aGUgam9iIHBvc3QgW2hlcmVdDQoNCiAgVGhl IHRlYW0gYW5kIHByb2plY3QgYXJlIHJlYWxseSBuaWNlLCBJIHdvdWxkIGRlZmluaXRlbHkgcmVj b21tZW5kIGl0IQ0KDQogIEkndmUgYnVpbHQgdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUgYmFj a2VuZCwgc28gZG9uJ3QgaGVzaXRhdGUgdG8NCiAgcmVhY2ggb3V0ICh0aGliYXV0Lm1hdHRpb0Bn bWFpbC5jb20pIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb24gdGhlDQogIHRlY2ggKG9yIG90 aGVyKS4NCg0KDQpbaGVyZV0NCjxodHRwczovL3d3dy5ub3Rpb24uc28vZG9jZW50YXJ0L09DYW1s LURldmVsb3Blci1iYzA0N2ZmNmM4MGI0NDhlODE0OTQzZjcxMTZmYTE0Yj4NCg0KDQpPbGQgQ1dO DQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04s IHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwg b3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRo ZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5 IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4g U2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBv bHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHA6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHls bC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRw Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 15 to 22, 20= 20.

ocaml-lsp-server 1.4.0

Rudi Grinberg announced

On behalf of the ocaml-lsp team, it is my pleasure to announce version 1.4.= 0. This release introduces support for = automatic signature help. Signature help is not yet present in all possible contexts. We intend to im= prove to support as many relevant language constructs as possible in the future. Many thanks to @mnx= n for implementing this feature.

The full change log is replicated at the end of this post for your convenie= nce.

Happy Holidays!

  • Support cancellation notifications when possible. (#323)
  • Implement signature help request for functions (#324)
  • Server LSP requests & notifications concurrently. Requests that req= uire merlin are still serialized. (#330)

OCaml 4.12.0, third alpha release

octachron announced

The release of OCaml 4.12.0 is approaching. We have released a third alpha version to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun.

Beyond the usual bug fixes, this new alpha version contains two small API f= ixes for statmemprof and the Unix module. (Keen-eyed readers might notice a brea= king change in the change log below but this concerns a corner case of a corner = case of the type system that should not affect anyone.)

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.12.0~alpha3
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

If you want to tweak the configuration of the compiler, you can pick config= uration options with

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.12.0~a=
lpha3+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and afl enabled switch:

opam switch create 4.12.0~alpha3+flambda+afl
--packages=3Docaml-variants.4.12.0~alpha3+options,ocaml-option-flambda,ocam=
l-option-afl
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

All available options can be listed with "opam search ocaml-option".

The source code for the alpha is also available at these addresses:

If you want to test this version, it is advised to install the alpha opam r= epository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-ka=
te/opam-alpha-repository.git

This alpha repository contains various packages patched with fixes in the process of being upstreamed. Once the repository installed, these patched packages will take precedence over the non-patched version.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

Changes from the second alpha:

  • additional fixes 1128, 75= 03, 9036, 9722, +10069: EINTR-based signal = handling. When a signal arrives, avoid running its OCaml handler in the mid= dle of a blocking section. Instead, allow control to return quickly to a po= lling point where the signal handler can safely run, ensuring that
  • 9907: Fix na= tive toplevel on native Windows. (David Allsopp, review by Florian Angelett= i)
  • 10056: Memp= rof: ensure young_trigger is within the bounds of the minor heap in caml_me= mprof_renew_minor_sample (regression from 8684) (David Allsopp, review by Guillaume Munch-M= accagnoni and Jacques-Henri Jourdan)
  • 10062: set = ARCH_INT64_PRINTF_FORMAT correctly for both modes of mingw-w64 (David Allso= pp, review by Xavier Leroy)
  • 10025: Trac= k custom blocks (e.g. Bigarray) with Statmemprof (Stephen Dolan, review by = Leo White, Gabriel Scherer and Jacques-Henri Jourdan)
  • 10070: Fix = Float.Array.blit when source and destination arrays coincide. (Nicol=C3=A1s= Ojeda B=C3=A4r, review by Alain Frisch and Xavier Leroy)
  • additional fixes 9869, += 10073: Add Unix.SO_REUSEPORT (Yishuai Li, review by Xavier Leroy, amend= ed by David Allsopp)
  • 9877: manual= , warn that multi-index indexing operators should be defined in conjunction= of single-index ones. (Florian Angeletti, review by Hezekiah M. Carty, Gab= riel Scherer, and Marcello Seri)
  • 10046: Link= all DLLs with -static-libgcc on mingw32 to prevent dependency on libgcc_s_= sjlj-1.dll with mingw-w64 runtime 8.0.0 (previously this was only needed fo= r dllunix.dll). (David Allsopp, report by Andreas Hauptmann, review by Xavi= er Leroy)
  • 9896: Share = the strings representing scopes, fixing some regression on .cmo/.cma sizes = (Alain Frisch and Xavier Clerc, review by Gabriel Scherer)
  • 10044: Alwa= ys report the detected ARCH, MODEL and SYSTEM, even for bytecode- only buil= ds (fixes a "configuration regression" from 4.08 for the Windows builds) (D= avid Allsopp, review by Xavier Leroy)
  • 10071: Fix = bug in tests/misc/weaklifetime.ml that was reported in 10055 (Damien Doligez and Gabriel S= cherer, report by David Allsopp)
  • breaking change 8907, 987= 8: Typemod.normalize_signature uses wrong environment Does= not treat submodules differently when normalizing conjunctive types in pol= ymorphic variants. This may break code that expose conjunctive types in inf= erred interface. (Jacques Garrigue, report and review by Leo White)
  • 9739, 9747: Avoid calling ty= pe variables, types that are not variables in recursive occurence error mes= sages (for instance, "Type variable int occurs inside int list") (Florian A= ngeletti, report by Stephen Dolan, review by Arma=C3=ABl Gu=C3=A9neau)
  • 10048: Fix = bug with generalized local opens. (Leo White, review by Thomas Refis)

Lwt 5.4.0, Lwt_ppx 2.0.2, Lwt_react 1.1.4 releases

Rapha=C3=ABl Proust announced

We are glad to announce the release of version 5.4.0 of Lwt, version 2.0.2 = of Lwt_ppx, and version 1.1.4 of Lwt_react.

https://githu= b.com/ocsigen/lwt/releases/tag/5.4.0

It can be installed from opam as usual:

opam update
opam upgrade lwt lwt_ppx lwt_react

OCaml 4.12 compatibility

With this release, Lwt is now compatible with OCaml 4.12. Thanks @kit-ty-ka= te for the contribution towards this support.

Thanks as well to all the other contributors for all the other improvements= that made it into this release. Check-out the release's changelog (link above) for a full list of = bugfixes and additions.

Maintainers' notes

As per a previous announce I am a co-maintainer of Lwt. With this release I'm taking on a more and more cen= tral role in the maintenance effort. Whilst I've received a lot of help getting this release together, I= 'm most likely the one responsible for any issues in the process.

I'd like to thank @antron who is as stellar with maintenance of the project= as he is with guiding me through the learning process. I'd also like to thank the opam-repository te= am who stepped up very quickly to fix some CI-related build-issues. And I'd like to thank my emplo= yer, Nomadic Labs, who agreed to make Lwt maintenance part of my day job.

I'm looking forward to all your bug reports, pull requests, comments, ideas= , questions, remarks, as well as any sort of feedback. Don't hesitate to get in touch!

Senior software engineer at Docent, France - Remote OK

Thibaut Mattio announced

Docent, a company I'm working with, is recruiting an OCaml developer. You c= an see the job post here

The team and project are really nice, I would definitely recommend it!

I've built the current version of the backend, so don't hesitate to reach o= ut (thibaut.mattio@gmail.com) if you have any questions on the tech (or other).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id A0078E020C for ; Tue, 29 Dec 2020 11:00:32 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.78,457,1599516000"; d="scan'208,217";a="484769690" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Dec 2020 11:00:06 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 29 Dec 2020 10:59:57 +0100 Message-ID: <8735zpnd9e.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMjIgdG8gMjksDQoyMDIwLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnBweF9k ZXJpdmluZ195YW1sIDAuMS4wDQpBIEhlcm9rdSBidWlsZHBhY2sgZm9yIE9DYW1sDQpvcGFtLWR1 bmUtbGludCAtIGtlZXAgb3BhbSBhbmQgZHVuZSBkZXBlbmRlbmNpZXMgaW4gc3luYw0KU2NpcmVw LCBhIHV0aWxpdHkgZm9yIGxpdGVyYXRlIHByb2dyYW1taW5nDQpDYW1lbCBDYWxlbmRhciBmb3Ig MjAyMQ0KT2xkIENXTg0KDQoNCnBweF9kZXJpdmluZ195YW1sIDAuMS4wDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtZGVy aXZpbmcteWFtbC0wLTEtMC83MDA3LzE+DQoNCg0KUGF0cmljayBGZXJyaXMgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJJ20gcHJvdWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVh c2UgKGFuZCBteSBmaXJzdCByZWxlYXNlKSBvZg0KICBbcHB4X2Rlcml2aW5nX3lhbWxdLiBJZiB5 b3UgYXJlIGZhbWlsaWFyIHdpdGggdGhlIGV4Y2VsbGVudA0KICBbcHB4X2Rlcml2aW5nX3lvanNv bl0gdGhlbiB0aGlzIGxpYnJhcnkgc2hvdWxkIGNvbWUgYXMgbm8gc3VycHJpc2UuIEluDQogIGZh Y3QgaXQgaGVscGVkIG1lIGEgbG90IGluIHdyaXRpbmcgdGhpcyBwcHgsIHNvIHRoYW5rIHlvdSB0 byBpdHMNCiAgY3JlYXRvcnMvbWFpbnRhaW5lcnMuDQoNCg0KW3BweF9kZXJpdmluZ195YW1sXSA8 aHR0cHM6Ly9naXRodWIuY29tL3BhdHJpY29mZXJyaXMvcHB4X2Rlcml2aW5nX3lhbWw+DQoNCltw cHhfZGVyaXZpbmdfeW9qc29uXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9wcHhfZGVy aXZpbmdfeW9qc29uPg0KDQpJbnN0YWxsYXRpb24NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIHVwZGF0ZQ0KICDi lIIgJCBvcGFtIGluc3RhbGwgcHB4X2Rlcml2aW5nX3lhbWwNCiAg4pSU4pSA4pSA4pSA4pSADQoN Cg0KVXNhZ2UNCuKVjOKVjOKVjOKVjOKVjA0KDQogIFBweF9kZXJpdmluZ195YW1sIGNvbnZlcnRz IHlvdXIgT0NhbWwgdHlwZXMgdG8gdGhlICJiYXNpYyIgW09DYW1sIFlhbWwNCiAgdmFsdWUgdHlw ZV0gKHRoZSBvbmUgdGhhdCBpcyBjdXJyZW50bHkgY29tcGF0aWJsZSB3aXRoIGV6anNvbm0pLiBT bw0KICBmb3IgZXhhbXBsZSB5b3UgY2FuIGhhdmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giB0eXBlIHQgPSB7IHRpdGxlOiBzdHJpbmc7IGF1dGhvcnM6IHN0cmluZyBsaXN0IH0gW0BAZGVy aXZpbmcgeWFtbF0NCiAg4pSCIA0KICDilIIgbGV0ICgpID0NCiAg4pSCICAgbGV0IHYgPSB7IHRp dGxlID0gIllhbWwgUFBYISI7IGF1dGhvcnMgPSBbICJQYXRyaWNrIEZlcnJpcyIgXSB9IGluDQog IOKUgiAgIGxldCB5YW1sID0gdG9feWFtbCB2IGluDQogIOKUgiAgIFlhbWwucHAgRm9ybWF0LnN0 ZF9mb3JtYXR0ZXIgeWFtbDsNCiAg4pSCICAgbWF0Y2ggb2ZfeWFtbCB5YW1sIHdpdGgNCiAg4pSC ICAgICB8IE9rIHQgLT4gRm9ybWF0LnByaW50X3N0cmluZyB0LnRpdGxlDQogIOKUgiAgICAgfCBF cnJvciAoYE1zZyBtKSAtPiBmYWlsd2l0aCBtDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBw cHggZ2VuZXJhdGVzIHR3byBmdW5jdGlvbnM6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2 YWwgb2ZfeWFtbCA6IFlhbWwudmFsdWUgLT4gdCBZYW1sLnJlcw0KICDilIIgdmFsIHRvX3lhbWwg OiB0IC0+IFlhbWwudmFsdWUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgQW5kIHdoZW4gYnVpbHQg d2l0aCB0aGlzIGR1bmUgZmlsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIChleGVjdXRh YmxlDQogIOKUgiAgKG5hbWUgbWFpbikNCiAg4pSCICAobGlicmFyaWVzIHlhbWwpDQogIOKUgiAg KHByZXByb2Nlc3MNCiAg4pSCICAgKHBwcyBwcHhfZGVyaXZpbmdfeWFtbCkpKQ0KICDilJTilIDi lIDilIDilIANCg0KICBUaGUgZm9sbG93aW5nIG91dHB1dCBpcyBnZW5lcmF0ZWQ6DQoNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiB0aXRsZTogWWFtbCBQUFghDQogIOKUgiBhdXRob3JzOg0KICDi lIIgLSBQYXRyaWNrIEZlcnJpcw0KICDilIIgWWFtbCBQUFghDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFRoZSBbUkVBRE1FXSBjb250YWlucyBzb21lIG1vcmUgaW5mb3JtYXRpb24gYW5kIHRoZSBs aWJyYXJ5IGlzIHN0aWxsIGENCiAgbGl0dGxlIHJvdWdoIGFyb3VuZCB0aGUgZWRnZXMsIGVzcGVj aWFsbHkgd2l0aCBlcnJvciByZXBvcnRpbmcsIGJ1dA0KICBJJ20gY3VycmVudGx5IHVzaW5nIGl0 IGluIGEgZmV3IHBsYWNlcyBzdWNoIGFzIGFuICJvY2FtbC1pZmllZCINCiAgW2dpdGh1YiBhY3Rp b25zXSBsaWJyYXJ5IChwcHhfZGVyaXZpbmdfeWFtbCdzIFt0ZXN0IHdvcmtmbG93XSB3YXMNCiAg YXV0b21hdGljYWxseSBnZW5lcmF0ZWQgd2l0aCBpdCA6c3BhcmtsZXM6KS4gVGhpcyBpcyBhIG5p Y2UgZXhhbXBsZSBvZg0KICBob3cgaXQgY2FuIGJlIHVzZWQgaW4gYSBmYWlybHkgc3RyYWlnaHRm b3J3YXJkIHdheSB0byBnZW5lcmF0ZSBPQ2FtbA0KICB2ZXJzaW9ucyBvZiB0aGUgbWFueSBwcm9q ZWN0cyB0aGF0IHVzZSBZYW1sIGZvciBjb25maWd1cmF0aW9uIGZpbGVzLg0KDQogIEhhcHB5IHlh bWwtaW5nIDopDQoNCg0KW09DYW1sIFlhbWwgdmFsdWUgdHlwZV0NCjxodHRwczovL2dpdGh1Yi5j b20vYXZzbS9vY2FtbC15YW1sL2Jsb2IvNmRlOGZhNjkyNmQzOTEzMzRiOTQ1NzU0NjE5YTY0ODU3 ZDM1MmU1ZC9saWIvdHlwZXMubWwjTDQ0Pg0KDQpbUkVBRE1FXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9wYXRyaWNvZmVycmlzL3BweF9kZXJpdmluZ195YW1sI2ltcGxlbWVudGF0aW9uLWRldGFpbHM+ DQoNCltnaXRodWIgYWN0aW9uc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9wYXRyaWNvZmVycmlzL29w YW0tZ2l0aHViLXdvcmtmbG93Pg0KDQpbdGVzdCB3b3JrZmxvd10NCjxodHRwczovL2dpdGh1Yi5j b20vcGF0cmljb2ZlcnJpcy9wcHhfZGVyaXZpbmdfeWFtbC9ibG9iL21haW4vLmdpdGh1Yi93b3Jr Zmxvd3MvdGVzdC55bWw+DQoNCg0KQSBIZXJva3UgYnVpbGRwYWNrIGZvciBPQ2FtbA0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tYS1oZXJva3UtYnVpbGRwYWNrLWZvci1vY2FtbC83MDEyLzE+DQoNCg0K cm9kZHkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBJIHdyb3RlIFthIEhlcm9rdSBidWlsZHBhY2tdIGZvciBPQ2FtbCB3ZWIgYXBw cyB0aGF0IHVzZSBvcGFtL2R1bmUuDQoNCg0KW2EgSGVyb2t1IGJ1aWxkcGFja10NCjxodHRwczov L2dpdGh1Yi5jb20vcm9kZHl5YWdhL2hlcm9rdS1idWlsZHBhY2stb2NhbWw+DQoNCg0Kb3BhbS1k dW5lLWxpbnQgLSBrZWVwIG9wYW0gYW5kIGR1bmUgZGVwZW5kZW5jaWVzIGluIHN5bmMNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tZHVuZS1saW50 LWtlZXAtb3BhbS1hbmQtZHVuZS1kZXBlbmRlbmNpZXMtaW4tc3luYy83MDE0LzE+DQoNCg0KVGhv bWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSdyZSBwbGVhc2Vk IHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIFtvcGFtLWR1bmUtbGludF0uIFRoaXMN CiAgbGl0dGxlIHRvb2wgY2hlY2tzIHRoYXQgZXZlcnkgb2NhbWxmaW5kIGRlcGVuZGVuY3kgbGlz dGVkIGluIHlvdXINCiAgYGR1bmUnIGZpbGVzIGhhcyB0aGUgY29ycmVzcG9uZGluZyBvcGFtIHBh Y2thZ2UgbGlzdGVkIGFzIGEgZGVwZW5kZW5jeQ0KICBpbiB5b3VyIGAqLm9wYW0nIGZpbGUocyku DQoNCiAgZS5nLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBjZCBjaGFycnVhDQogIOKU giAkIG9wYW0gZHVuZS1saW50DQogIOKUgiBjaGFycnVhLWNsaWVudC5vcGFtOiBjaGFuZ2VzIG5l ZWRlZDoNCiAg4pSCICAgInRjcGlwIiB7d2l0aC10ZXN0ICYgPj0gNi4wLjB9ICAgICAgICAgICBb ZnJvbSB0ZXN0L2NsaWVudCwgdGVzdC9jbGllbnQvbHd0XQ0KICDilIIgY2hhcnJ1YS1zZXJ2ZXIu b3BhbTogY2hhbmdlcyBuZWVkZWQ6DQogIOKUgiAgICJwcHhfY3N0cnVjdCIge3dpdGgtdGVzdCAm ID49IDYuMC4wfSAgICAgW2Zyb20gKHBweCksIHRlc3RdDQogIOKUgiAgICJ0Y3BpcCIge3dpdGgt dGVzdCAmID49IDYuMC4wfSAgICAgICAgICAgW2Zyb20gdGVzdF0NCiAg4pSCIGNoYXJydWEtdW5p eC5vcGFtOiBjaGFuZ2VzIG5lZWRlZDoNCiAg4pSCICAgImNzdHJ1Y3QtbHd0IiB7Pj0gNi4wLjB9 ICAgICAgICAgICAgICAgICBbZnJvbSB1bml4XQ0KICDilIIgICAiaXBhZGRyIiB7Pj0gNS4wLjF9 ICAgICAgICAgICAgICAgICAgICAgIFtmcm9tIHVuaXhdDQogIOKUgiAgICJ0Y3BpcCIgez49IDYu MC4wfSAgICAgICAgICAgICAgICAgICAgICAgW2Zyb20gdW5peF0NCiAg4pSCIGNoYXJydWEub3Bh bTogT0sNCiAg4pSCIE5vdGU6IHZlcnNpb24gbnVtYmVycyBhcmUganVzdCBzdWdnZXN0aW9ucyBi YXNlZCBvbiB0aGUgY3VycmVudGx5IGluc3RhbGxlZCB2ZXJzaW9uLg0KICDilIIgV3JpdGUgY2hh bmdlcz8gW3ldIHkNCiAg4pSCIFdyb3RlICIuL2NoYXJydWEtY2xpZW50Lm9wYW0iDQogIOKUgiBX cm90ZSAiLi9jaGFycnVhLXNlcnZlci5vcGFtIg0KICDilIIgV3JvdGUgIi4vY2hhcnJ1YS11bml4 Lm9wYW0iDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIElmIHlvdXIgcHJvamVjdCBnZW5lcmF0ZXMg dGhlIG9wYW0gZmlsZXMgZnJvbSBgZHVuZS1wcm9qZWN0JywgdGhlbiBpdA0KICB3aWxsIHVwZGF0 ZSB5b3VyIGBkdW5lLXByb2plY3QnIGluc3RlYWQuDQoNCiAgSXQgY2FuIGFsc28gYmUgdXNlZnVs IHRvIHJ1biB0aGlzIGluIENJLiBJdCB3aWxsIGV4aXQgd2l0aCBhIG5vbi16ZXJvDQogIGV4aXQg c3RhdHVzIGlmIGFueXRoaW5nIG5lZWRzIHRvIGJlIGNoYW5nZWQuIFtvY2FtbC1jaV0gcnVucyB0 aGlzDQogIGF1dG9tYXRpY2FsbHkgYXMgcGFydCBvZiB0aGUgImxpbnQtb3BhbSIgY2hlY2suDQoN Cg0KW29wYW0tZHVuZS1saW50XSA8aHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L29wYW0tZHVu ZS1saW50Pg0KDQpbb2NhbWwtY2ldIDxodHRwczovL2NpLm9jYW1sbGFicy5pby8+DQoNCg0KU2Np cmVwLCBhIHV0aWxpdHkgZm9yIGxpdGVyYXRlIHByb2dyYW1taW5nDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NjaXJlcC1hLXV0aWxp dHktZm9yLWxpdGVyYXRlLXByb2dyYW1taW5nLzcwMTYvMT4NCg0KDQpQaGlsaXBwZSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEkgd3JvdGUgYSB1dGlsaXR5IGNhbGxlZCBbc2NpcmVwXSB0byByZW5kZXIgYSBtYXJr ZG93biBmaWxlIHdpdGggT0NhbWwNCiAgY29kZSBibG9ja3MgYXMgYW4gSFRNTCBkb2N1bWVudCwg d2hpY2ggcHJvdmlkZXMgc29tZSBzdXBwb3J0IGZvcg0KICBncmFwaGljcy4gSGVyZSBhcmUgc29t ZSBleGFtcGxlcyBvZiBnZW5lcmF0ZWQgZG9jdW1lbnRzOiBbb25lIGJhc2VkIG9uDQogIHZnXSwg YW5kIFthbm90aGVyIHVzaW5nIG93bC1wbHBsb3RdLg0KDQogIEl0IGNhbiBhbHNvIGJlIHVzZWQg ZG93bnN0cmVhbSBvZiBbbWR4XSBhcyBhIG1hcmtkb3duLXRvLWh0bWwNCiAgY29udmVydGVyIHRo YXQgZGV0ZWN0cyBwaWN0dXJlcyBpbiB0aGUgdG9wbGV2ZWwncyBzdGFuZGFyZCBvdXRwdXQgYW5k DQogIHJlbmRlcnMgdGhlbSBpbiB0aGUgZmluYWwgZG9jdW1lbnQuDQoNCiAgSXQgaXMgcmVhbGx5 IGEgaGFjaywgYW5kIGl0IGlzIHBvb3JseSBkb2N1bWVudGVkLCBidXQgSSdtIGFkdmVydGlzaW5n DQogIGl0IGluIGNhc2UgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIG90aGVycy4NCg0KDQpbc2NpcmVw XSA8aHR0cHM6Ly9naXRodWIuY29tL3B2ZWJlci9zY2lyZXA+DQoNCltvbmUgYmFzZWQgb24gdmdd IDxodHRwOi8vcHZlYmVyLmdpdGh1Yi5pby9zY2lyZXAvZm9sZC5odG1sPg0KDQpbYW5vdGhlciB1 c2luZyBvd2wtcGxwbG90XSA8aHR0cDovL3B2ZWJlci5naXRodWIuaW8vc2NpcmVwL2RhbXBlZC5o dG1sPg0KDQpbbWR4XSA8aHR0cHM6Ly9naXRodWIuY29tL3JlYWx3b3JsZG9jYW1sL21keD4NCg0K DQpDYW1lbCBDYWxlbmRhciBmb3IgMjAyMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYW1lbC1jYWxlbmRhci1mb3ItMjAyMS83MDIwLzE+ DQoNCg0KRmxvcmVudCBNb25uaWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SSB3b3VsZCBsaWtlIHRvIHNoYXJlIHdpdGggeW91IGEgW2NhbWVsIGNhbGVuZGFyIGZvciAyMDIx IGluIHBkZl0gd2l0aA0KICB0aGUgbmljZSB0aGVtZSBmcm9tIG9jYW1sIGRvdCBvcmcuDQoNCiAg SXQgd2FzIGdlbmVyYXRlZCBmcm9tIGFuIG9jYW1sIHNjcmlwdCB0aGF0IHlvdSBjYW4gZmluZCBp biB0aGlzIHJlcG86DQogIFtzdmcgY2FsZW5kYXIgZ2VuZXJhdG9yXS4NCg0KICBTZXZlcmFsIHNj cmlwdHMgYXJlIGF2YWlsYWJsZSwgeW91IGNhbiBmaW5kIHNvbWUgcmVzdWx0cyBvbiB0aGlzIFt3 ZWINCiAgcGFnZV0uDQoNCiAgQXQgdGhlIGJlZ2lubmluZyBvZiAyMDIwIEkgd2FzIHNlYXJjaGlu ZyBmb3IgYSBmcmVlIHNvZnR3YXJlIHRvDQogIGdlbmVyYXRlIGNhbGVuZGFycyBpbiBTVkcgdGhh dCBJIGNvdWxkIGN1c3RvbWlzZSBmb3IgbXkgb3duIHVzZSwgYnV0IEkNCiAgd2FzIHVuYWJsZSB0 byBpbnN0YWxsIHRoZSBQZXJsIHNjcmlwdCB0aGF0IGV4aXN0cyAoaXQgaGFzIGEgbG90IG9mDQog IGRlcGVuZGVuY2llcyBhbmQgdGhlIGVycm9yIG1lc3NhZ2Ugd2hlbiBJIHRyeSB0byBpbnN0YWxs IGl0IGRpZG4ndA0KICBoZWxwIHVzIHRvIGZpbmQgd2hhdCdzIHdyb25nIHdpdGggaXQpLg0KDQog IFRoaXMgZXhwbGFpbnMgdGhlIGRlc2lnbiBvZiB0aGVzZSBzY3JpcHRzLCB0aGF0IGFyZSBtYWRl IHRvIHdvcmsNCiAgd2l0aG91dCBhbnkgZGVwZW5kZW5jaWVzIGFuZCB3aXRob3V0IGFueSBjb21w aWxhdGlvbi4gVGhlcmUncyBjb2RlDQogIGR1cGxpY2F0aW9uLCBidXQgZXZlcnkgc2NyaXB0IG9u bHkgbmVlZCB0aGUgb2NhbWwgaW50ZXJwcmV0ZXIgdG8gYmUNCiAgcnVuLCBzbyBtb3N0IHBlb3Bs ZSBjb21mb3J0YWJsZSB3aXRoIHRoZSBjb21tYW5kIGxpbmUgc2hvdWxkIGJlIGFibGUNCiAgdG8g dXNlIGl0Lg0KDQogIChJIGFsc28gdHJpZWQgdG8gc2VsbCBzb21lIFtvbiBFdHN5XSBidXQgZGlk bid0IHNvbGQgYSBzaW5nbGUgb25lLikNCg0KICBCeSBkZWZhdWx0IDEyIGxhbmd1YWdlcyBhcmUg aW5jbHVkZWQgaW4gZXZlcnkgc2NyaXB0LCBidXQgeW91IGNhbg0KICBnZW5lcmF0ZSB0aGUgY2Fs ZW5kYXJzIGZvciBtb3JlIHRoYW4gMjAwIGxhbmd1YWdlcyBpZiB5b3UgdXNlIFt0aGVzZQ0KICBk YXRlcyBsb2NhbGVzXSB0aGF0IGNvbWUgZnJvbSB0aGUgQ0xEUiByZXBvc2l0b3J5Lg0KDQogIFlv dSBjYW4gYWxzbyBzd2l0Y2ggbW9uZGF5IGZpcnN0IG9yIHN1bmRheSBmaXJzdC4NCg0KICBUaGVz ZSBnZW5lcmF0b3JzIGFyZSBwcm92aWRlZCB1bmRlciBabGliIGxpY2Vuc2UuDQoNCiAgSSBob3Bl IHNvbWUgd2lsbCBlbmpveSENCg0KDQpbY2FtZWwgY2FsZW5kYXIgZm9yIDIwMjEgaW4gcGRmXQ0K PGh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL2NhbC9jYWwtY2FtZWwvY2FsLWNhbWVsLTIwMjEt ZW4ucGRmPg0KDQpbc3ZnIGNhbGVuZGFyIGdlbmVyYXRvcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9m Y2NtL29jYW1sLWNhbC1zdmc+DQoNClt3ZWIgcGFnZV0gPGh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVl LmZyL2NhbC8+DQoNCltvbiBFdHN5XSA8aHR0cHM6Ly93d3cuZXRzeS5jb20vZnIvc2hvcC9EZWNh cG9kZT4NCg0KW3RoZXNlIGRhdGVzIGxvY2FsZXNdIDxodHRwczovL2dpdGh1Yi5jb20vZmNjbS9E YXRlTG9jYWxlLW9jYW1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2Vd IGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFy Y2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3Ug YWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNj cmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVz c2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJj aGl2ZV0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2Yg dGhlIGFyY2hpdmVzXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0K DQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vl a2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 22 to 29, 2020.

ppx_deriving_yaml 0.1.0

Patrick Ferris announced

I'm proud to announce the first release (and my first release) of ppx_deriving_yaml. If you are familiar with the excellent ppx_deriving_yojson then this library should come as no surprise. In fact it helped me a lot in writing this ppx, so thank you to its creators/maintainers.

Installation

$ opam update
$ opam install ppx_deriving_yaml

Usage

Ppx_deriving_yaml converts your OCaml types to the "basic" OCaml Yaml value type (the one that is currently compatible with ezjsonm). So for example you can have:

type t = { title: string; authors: string list } [@@deriving yaml]

let () =
  let v = { title = "Yaml PPX!"; authors = [ "Patrick Ferris" ] } in
  let yaml = to_yaml v in
  Yaml.pp Format.std_formatter yaml;
  match of_yaml yaml with
    | Ok t -> Format.print_string t.title
    | Error (`Msg m) -> failwith m

The ppx generates two functions:

val of_yaml : Yaml.value -> t Yaml.res
val to_yaml : t -> Yaml.value

And when built with this dune file:

(executable
 (name main)
 (libraries yaml)
 (preprocess
  (pps ppx_deriving_yaml)))

The following output is generated:

title: Yaml PPX!
authors:
- Patrick Ferris
Yaml PPX!

The README contains some more information and the library is still a little rough around the edges, especially with error reporting, but I'm currently using it in a few places such as an "ocaml-ified" github actions library (ppx_deriving_yaml's test workflow was automatically generated with it :sparkles:). This is a nice example of how it can be used in a fairly straightforward way to generate OCaml versions of the many projects that use Yaml for configuration files.

Happy yaml-ing :)

A Heroku buildpack for OCaml

roddy announced

I wrote a Heroku buildpack for OCaml web apps that use opam/dune.

opam-dune-lint - keep opam and dune dependencies in sync

Thomas Leonard announced

We're pleased to announce the first release of opam-dune-lint. This little tool checks that every ocamlfind dependency listed in your dune files has the corresponding opam package listed as a dependency in your *.opam file(s).

e.g.

$ cd charrua
$ opam dune-lint
charrua-client.opam: changes needed:
  "tcpip" {with-test & >= 6.0.0}           [from test/client, test/client/lwt]
charrua-server.opam: changes needed:
  "ppx_cstruct" {with-test & >= 6.0.0}     [from (ppx), test]
  "tcpip" {with-test & >= 6.0.0}           [from test]
charrua-unix.opam: changes needed:
  "cstruct-lwt" {>= 6.0.0}                 [from unix]
  "ipaddr" {>= 5.0.1}                      [from unix]
  "tcpip" {>= 6.0.0}                       [from unix]
charrua.opam: OK
Note: version numbers are just suggestions based on the currently installed version.
Write changes? [y] y
Wrote "./charrua-client.opam"
Wrote "./charrua-server.opam"
Wrote "./charrua-unix.opam"

If your project generates the opam files from dune-project, then it will update your dune-project instead.

It can also be useful to run this in CI. It will exit with a non-zero exit status if anything needs to be changed. ocaml-ci runs this automatically as part of the "lint-opam" check.

Scirep, a utility for literate programming

Philippe announced

I wrote a utility called scirep to render a markdown file with OCaml code blocks as an HTML document, which provides some support for graphics. Here are some examples of generated documents: one based on vg, and another using owl-plplot.

It can also be used downstream of mdx as a markdown-to-html converter that detects pictures in the toplevel's standard output and renders them in the final document.

It is really a hack, and it is poorly documented, but I'm advertising it in case it might be useful to others.

Camel Calendar for 2021

Florent Monnier announced

I would like to share with you a camel calendar for 2021 in pdf with the nice theme from ocaml dot org.

It was generated from an ocaml script that you can find in this repo: svg calendar generator.

Several scripts are available, you can find some results on this web page.

At the beginning of 2020 I was searching for a free software to generate calendars in SVG that I could customise for my own use, but I was unable to install the Perl script that exists (it has a lot of dependencies and the error message when I try to install it didn't help us to find what's wrong with it).

This explains the design of these scripts, that are made to work without any dependencies and without any compilation. There's code duplication, but every script only need the ocaml interpreter to be run, so most people comfortable with the command line should be able to use it.

(I also tried to sell some on Etsy but didn't sold a single one.)

By default 12 languages are included in every script, but you can generate the calendars for more than 200 languages if you use these dates locales that come from the CLDR repository.

You can also switch monday first or sunday first.

These generators are provided under Zlib license.

I hope some will enjoy!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id AF509E6255 for ; Tue, 5 Jan 2021 12:22:06 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.78,476,1599516000"; d="scan'208,217";a="369081454" Received: from clt-128-93-178-153.vpn.inria.fr (HELO set) ([128.93.178.153]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 05 Jan 2021 12:22:05 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 05 Jan 2021 12:22:05 +0100 Message-ID: <877dord3xe.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMjksIDIwMjANCnRvIEphbnVhcnkgMDUsIDIwMjEuDQoNClRhYmxlIG9m IENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KRmlyc3QgcmVsZWFzZSBvZiBGZWF0DQpPQ2x1c3RlciBhbmQgT0J1aWxkZXINClBs b3R0aW5nIDNEIHZlY3RvcnMNCk1hcnNoYWwgZGV0ZXJtaW5pc20gYW5kIHN0YWJpbGl0eQ0KSXQg dGhlcmUgYSB0dXRvcmlhbCBmb3IgYGpzX29mX29jYW1sJyB3aXRoIHNpbXBsZSBncmFwaGljcz8N CkludGVyZXN0aW5nIE9DYW1sIGV4ZXJjaXNlcyBmcm9tIEZyYW7Dp29pcyBQb3R0aWVyIGF2YWls YWJsZSBvbmxpbmUNCk9sZCBDV04NCg0KDQpGaXJzdCByZWxlYXNlIG9mIEZlYXQNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJl bGVhc2Utb2YtZmVhdC83MDMzLzE+DQoNCg0KRnJhbsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBBIGJyaWVmIG5vdGUgdG8gYW5ub3VuY2UgdGhlIGZp cnN0IHJlbGVhc2Ugb2YgRmVhdDoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBk YXRlDQogIOKUgiBvcGFtIGluc3RhbGwgZmVhdA0KICDilJTilIDilIDilIDilIANCg0KICBGZWF0 IGlzIGEgbGlicmFyeSB0aGF0IG9mZmVycyBzdXBwb3J0IGZvciBjb3VudGluZywgZW51bWVyYXRp bmcsIGFuZA0KICBzYW1wbGluZyBvYmplY3RzIG9mIGEgY2VydGFpbiBraW5kLCBzdWNoIGFzIChz YXkpIHRoZSBpbmhhYml0YW50cyBvZg0KICBhbiBhbGdlYnJhaWMgZGF0YSB0eXBlLg0KDQogIEZl YXQgd2FzIGluc3BpcmVkIGJ5IHRoZSBwYXBlciAiRmVhdDogRnVuY3Rpb25hbCBFbnVtZXJhdGlv biBvZg0KICBBbGdlYnJhaWMgVHlwZXMiIGJ5IEpvbmFzIER1cmVnw6VyZCwgUGF0cmlrIEphbnNz b24gYW5kIE1lbmcgV2FuZw0KICAoMjAxMikuDQoNCiAgTW9yZSBkZXRhaWxzIGNhbiBiZSBmb3Vu ZCBoZXJlOg0KDQogIDxodHRwczovL2dpdGxhYi5pbnJpYS5mci9mcG90dGllci9mZWF0Lz4NCg0K DQpPQ2x1c3RlciBhbmQgT0J1aWxkZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jbHVzdGVyLWFuZC1vYnVpbGRlci83MDM1LzE+DQoN Cg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gcGxl YXNlZCB0byBhbm5vdW5jZSB0aGUgZmlyc3QgcmVsZWFzZSBvZiBbT0NsdXN0ZXJdLiBBIHVzZXIg Y2FuDQogIHN1Ym1pdCBhIGJ1aWxkIGpvYiAoZWl0aGVyIGEgRG9ja2VyZmlsZSBvciBhbiBPQnVp bGRlciBzcGVjKSB0byB0aGUNCiAgc2NoZWR1bGVyLCB3aGljaCB0aGVuIHJ1bnMgdGhlIGJ1aWxk IG9uIGEgd29ya2VyIG1hY2hpbmUsIHN0cmVhbWluZw0KICB0aGUgbG9ncyBiYWNrIHRvIHRoZSBj bGllbnQuDQoNCiAgVGhpcyBpcyB0aGUgYnVpbGQgc2NoZWR1bGVyIC8gY2x1c3RlciBtYW5hZ2Vy IHRoYXQgd2UgdXNlIGZvciBlLmcuDQogIFtvcGFtLXJlcG8tY2ldICh3aGljaCB5b3UgbWF5IGhh dmUgc2VlbiBpbiBhY3Rpb24gaWYgeW91IHN1Ym1pdHRlZCBhDQogIHBhY2thZ2UgdG8gb3BhbS1y ZXBvc2l0b3J5IHJlY2VudGx5KS4NCg0KICBTZWUgW29jdXJyZW50L292ZXJ2aWV3XSBmb3IgYSBx dWljayBvdmVydmlldyBvZiB0aGUgdmFyaW91cyBvdGhlciBDSQ0KICBzZXJ2aWNlcyB1c2luZyBp dCB0b28uDQoNCiAgVG8gaW5zdGFsbCBhbmQgcnVuIHRoZSBzY2hlZHVsZXIgdXNlIGUuZy4NCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gZGVwZXh0IC1pIG9jbHVzdGVyDQogIOKUgiBt a2RpciBjYXBucC1zZWNyZXRzDQogIOKUgiBvY2x1c3Rlci1zY2hlZHVsZXIgXA0KICDilIIgICAt LWNhcG5wLXNlY3JldC1rZXktZmlsZT0uL2NhcG5wLXNlY3JldHMva2V5LnBlbSBcDQogIOKUgiAg IC0tY2FwbnAtbGlzdGVuLWFkZHJlc3M9dGNwOjAuMC4wLjA6OTAwMCBcDQogIOKUgiAgIC0tY2Fw bnAtcHVibGljLWFkZHJlc3M9dGNwOjEyNy4wLjAuMTo5MDAwIFwNCiAg4pSCICAgLS1zdGF0ZS1k aXI9L3Zhci9saWIvb2NsdXN0ZXItc2NoZWR1bGVyIFwNCiAg4pSCICAgLS1wb29scz1saW51eC1h cm0zMixsaW51eC14ODZfNjQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSXQgd2lsbCBnZW5lcmF0 ZSBga2V5LnBlbScgb24gdGhlIGZpcnN0IHJ1biwgYXMgd2VsbCBhcyB2YXJpb3VzDQogIGNhcGFi aWxpdHkgZmlsZXMgZ3JhbnRpbmcgYWNjZXNzIGZvciB3b3JrZXJzIGFuZCBjbGllbnRzLiBZb3Ug dGhlbg0KICBjb3B5IGVhY2ggZ2VuZXJhdGVkIHBvb2wgY2FwYWJpbGl0eSAoZS5nLiBgcG9vbC1s aW51eC14ODZfNjQuY2FwJykgdG8NCiAgZWFjaCBtYWNoaW5lIHlvdSB3YW50IGluIHRoYXQgcG9v bCwgYW5kIHJ1biBgb2NsdXN0ZXItd29ya2VyDQogIHBvb2wtbGludXgteDg2XzY0LmNhcCcgdG8g c3RhcnQgdGhlIHdvcmtlciBhZ2VudC4gU2VlIHRoZSBbUkVBRE1FXSBmb3INCiAgZnVsbCBkZXRh aWxzLg0KDQogIFtPQnVpbGRlcl0gaXMgYW4gYWx0ZXJuYXRpdmUgdG8gYGRvY2tlciBidWlsZCcu IFRoZSBtYWluIGRpZmZlcmVuY2VzDQogIGFyZSB0aGF0IGl0IHRha2VzIGEgc3BlYyBpbiBTLWV4 cHJlc3Npb24gZm9ybWF0LCB3aGljaCBpcyBlYXNpZXIgdG8NCiAgZ2VuZXJhdGUgdGhhbiBhIERv Y2tlcmZpbGUsIGhhbmRsZXMgY29uY3VycmVudCBidWlsZHMgcmVsaWFibHksIGFuZA0KICBrZWVw cyBjb3BpZXMgb2YgdGhlIGxvZ3Mgc28gdGhhdCB5b3Ugc3RpbGwgc2VlIHRoZSBvdXRwdXQgZXZl biBpZg0KICBzb21lb25lIGVsc2UgcGVyZm9ybWVkIHRoZSBzYW1lIGJ1aWxkIHN0ZXAgZWFybGll ciBhbmQgdGhlIHJlc3VsdCBpcw0KICB0aGVyZWZvcmUgdGFrZW4gZnJvbSB0aGUgY2FjaGUuDQoN CiAgSXQgY3VycmVudGx5IHN1cHBvcnRzIFpGUyBhbmQgQnRyZnMgZm9yIHN0b3JhZ2UgKGl0IG5l ZWRzIGNoZWFwDQogIHNuYXBzaG90cykgYW5kIGBydW5jJyBmb3Igc2FuZGJveGluZyBidWlsZHMu IFttYWNvcyBzdXBwb3J0XSBpcyB1bmRlcg0KICBkZXZlbG9wbWVudCwgYnV0IG5vdCB5ZXQgdXBz dHJlYW1lZC4gSXQgc2hvdWxkIGJlIGZhaXJseSBlYXN5IHRvIGFkZA0KICBzdXBwb3J0IGZvciBh bnkgcGxhdGZvcm0gdGhhdCBoYXMgc29tZSBmb3JtIG9mIHNlY3VyZSBjaHJvb3QuDQoNCiAgT0Ns dXN0ZXIgc3VwcG9ydHMgbW9uaXRvcmluZyB3aXRoIFByb21ldGhldXMsIHNvIHlvdSBjYW4gc2Vl IHdoYXQgdGhlDQogIGNsdXN0ZXIgaXMgZG9pbmc6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vy c2UtY2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2QvZDVmZjVh YWEwMjU5ZDdiNTk0NDViMTU2ZTZiNjQyYTQyMTA0MGI2NF8yXzkyMHg3NTAucG5nPg0KDQoNCltP Q2x1c3Rlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVudC9vY2x1c3Rlcj4NCg0KW29wYW0t cmVwby1jaV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVudC9vcGFtLXJlcG8tY2k+DQoNCltv Y3VycmVudC9vdmVydmlld10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVudC9vdmVydmlldz4N Cg0KW1JFQURNRV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVudC9vY2x1c3Rlci9ibG9iL21h c3Rlci9SRUFETUUubWQ+DQoNCltPQnVpbGRlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVu dC9vYnVpbGRlcj4NCg0KW21hY29zIHN1cHBvcnRdIDxodHRwczovL2dpdGh1Yi5jb20vb2N1cnJl bnQvb2J1aWxkZXIvaXNzdWVzLzU3Pg0KDQoNClBsb3R0aW5nIDNEIHZlY3RvcnMNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcGxvdHRpbmctM2QtdmVjdG9ycy83 MDM4LzE+DQoNCg0KQW5kcmVhcyBQb2lzZWwgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBkb2luZyBsaW5l YXIgYWxnZWJyYSB3aXRoIE93bC4gIE93bC1wbHBsb3Qgd29ya3MgZ3JlYXQgZm9yDQogIHZpc3Vh bGl6aW5nIDJEIHZlY3RvcnMsIGJ1dCBpdCBkb2Vzbid0IHNlZW0gdG8gY2FwYWJsZSBvZiBwbG90 dGluZyAzRA0KICB2ZWN0b3JzLg0KDQogIEkgdG9vayBhIChmYXN0KSBsb29rIGF0IHZhbmlsbGEg W1BscGxvdF0sIFtPcGxvdF0sIGFuZCB0aGUgW0dOVXBsb3QNCiAgYmluZGluZ3NdLCBidXQgSSBk aWRuJ3QgZmluZCBhIHNpbXBsZSB3YXkgdG8gcGxvdCAzRCB2ZWN0b3JzLg0KDQogIEkgZG9uJ3Qg bmVlZCBoaWdoIHF1YWxpdHkgcGxvdHMsIDNEIHN1cmZhY2VzLCBhIGxvdCBvZiBjb250cm9sIG9y DQogIGZhbmN5IGZlYXR1cmVzLCBqdXN0IGEgY29vcmRpbmF0ZSBzeXN0ZW0gYW5kIHNvbWUgZnVu Y3Rpb24gdG8gZHJhdw0KICBnZW9tZXRyaWMgcHJpbWl0aXZlcyAocG9pbnRzLCBsaW5lcywgY2ly Y2xlcywgZXRjLikuDQoNCiAgRGlkIEkgbWlzcyBhbnl0aGluZyBvciBkbyBJIGhhdmUgdG8gYnVp bGQgdGhpcyBteXNlbGYgd2l0aCB0aGUgZ29vZA0KICBvbGQgR3JhcGhpY3MgbW9kdWxlPw0KDQoN CltQbHBsb3RdIDxodHRwOi8vcGxwbG90Lm9yZy8+DQoNCltPcGxvdF0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9zYW5ldHRlL29wbG90Pg0KDQpbR05VcGxvdCBiaW5kaW5nc10gPGh0dHBzOi8vZ2l0aHVi LmNvbS9jLWN1YmUvb2NhbWwtZ251cGxvdD4NCg0KDQpNYXJzaGFsbCBBYnJhbXMgcmVwbGllZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgV2hhdCBraW5kIG9mIHZlY3RvciByZXByZXNlbnRhdGlvbiBkbyB5 b3Ugd2FudD8gIEp1c3QgbGluZXMvYXJyb3dzIGluDQogIDNEPyAgVGhhdCdzIGp1c3QgYSBjdXJ2 ZSBpbiAzRCwgc28gaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHdpdGggT3dsIGFuZA0KICBwbHBsb3Qs IGF0IGxlYXN0LiAgTG9va3MgbGlrZSBpdCBzaG91bGQgYmUgZWFzeSB3aXRoIG9wbG90LCB0b28g KGJ1dCBJDQogIGhhdmVuJ3QgdXNlZCBvcGxvdCkuICBUaGVyZSBhcmUgc29tZSAzRCBPd2wgcGxw bG90IGV4YW1wbGVzLCB3aXRoDQogIHNvdXJjZSBjb2RlLCBvbiB0aGVzZSBwYWdlczoNCg0KICA8 aHR0cHM6Ly9vY2FtbC54eXovYm9vay92aXN1YWxpc2F0aW9uLmh0bWw+DQoNCiAgPGh0dHBzOi8v Z2l0aHViLmNvbS9vd2xiYXJuL293bC93aWtpL1R1dG9yaWFsOi1Ib3ctdG8tUGxvdC1pbi1Pd2wl M0Y+DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vd2xiYXJuL293bC93aWtpL1Bsb3QtR2FsbGVy eT4NCg0KICBJIGRvbid0IGtub3cgd2hldGhlciBpdCB3aWxsIGJlIGVhc3kgdG8gYWRhcHQgdGhl bSB0byB5b3VyIG5lZWRzLiAgSQ0KICB3cm90ZSB0aGUgbGFzdCBleGFtcGxlIG9uIHRoZSBsYXN0 IHBhZ2UgYWJvdmUuICBJdCdzIGEgcGxvdCBvZiBhDQogIHNlcmllcyAyRCBjdXJ2ZXMgaW4gM0Qu ICBNYXliZSBzb21lIG9mIHRoZSB0ZWNobmlxdWVzIGNhbiBiZSBhZGFwdGVkDQogIHRvIHlvdXIg bmVlZHMuICAoVGhlIGNvZGUgaXMgYSBmZXcgeWVhcnMgb2xkLiAgSSdtIG5vdCBzdXJlIHdoZXRo ZXIgaXQNCiAgd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIE93bC4pDQoNCiAgKElm IHlvdSBlbmQgdXAgaGF2aW5nIHRvIHVzZSBsb3ctbGV2ZWwgYmluZGluZ3MgdG8gcGxwbG90LCBv cGxvdCwNCiAgZXRjLiBmcm9tIE93bCwgeW91IG1pZ2h0IGNvbnNpZGVyIGNvbnRyaWJ1dGluZyBh IHdyYXBwZXIgbW9kdWxlIHRoYXQNCiAgbWFrZXMgaXQgZWFzeSB0byBkbyB0aGUga2luZCBvZiBw bG90IHlvdSB3YW50LikNCg0KDQpBbmRyZWFzIFBvaXNlbCB0aGVuIHNhaWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFRoYW5rIHlvdSBmb3IgeW91ciBhbnN3ZXIuDQoNCiAgSSdkIGp1c3QgbGlrZSB0 byBkcmF3IDNEIHZlY3RvcnMgaW4gYSBjYXJ0ZXNpYW4gY29vcmRpbmF0ZSBzeXN0ZW0uICBBDQog IHBsb3Qgc2hvdWxkIGxvb2sgc2ltaWxhciB0byB0aGlzOg0KDQogIDxodHRwczovL3VwbG9hZC53 aWtpbWVkaWEub3JnL3dpa2lwZWRpYS9jb21tb25zL3RodW1iL2YvZmQvM0RfVmVjdG9yLnN2Zy84 MDBweC0zRF9WZWN0b3Iuc3ZnLnBuZz4NCg0KICBJIHdvdWxkbid0IGV2ZW4gbmVlZCBhcnJvd3Ms IHNpbXBsZSBsaW5lcyB3b3VsZCBiZSBvay4NCg0KICBNYXliZSB0aGVyZSBpcyBhIHdheSB0byB1 c2Ugb25lIG9mIHRoZSAzRCBmdW5jdGlvbnMgKGBQbG90LnN1cmYnLA0KICBgUGxvdC5tZXNoJywg YFBsb3QuY29udG91cicpLCBidXQgSSBjYW4ndCBmaWd1cmUgaXQgb3V0Lg0KDQoNCkhlemVraWFo IENhcnR5IHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEl0J3MgYmVlbiBhIHdoaWxlIHNpbmNlIEkg d29ya2VkIHdpdGggcGxwbG90IGJ1dCB3aGF0IHlvdSBzaG93ZWQNCiAgc2hvdWxkIGJlIHBvc3Np YmxlLiBUaGUgW3BsbGluZTNdIGZ1bmN0aW9uIGFsbG93cyB5b3UgdG8gcGxvdCBsaW5lDQogIHNl Z21lbnRzIGluIDNkIHNwYWNlLiBUaGUgZnVuY3Rpb24gaXMgc2V0dXAgdG8gdGFrZSBtdWx0aXBs ZSBzZWdtZW50cw0KICBpbiBhIHNpbmdsZSBjYWxsLiBGb3IgYSBzaW5nbGUgc2VnbWVudCBlYWNo IGFycmF5IHdvdWxkIGhvbGQgYSBzaW5nbGUNCiAgdmFsdWUuIENvbG9ycyBjYW4gYmUgc2V0IGJl dHdlZW4gZHJhdyBjYWxscy4NCg0KDQpbcGxsaW5lM10NCjxodHRwOi8vcGxwbG90Lm9yZy9kb2Ni b29rLW1hbnVhbC9wbHBsb3QtaHRtbC01LjE1LjAvcGxsaW5lMy5odG1sPg0KDQoNCnNhbmV0dGUg YWxzbyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBpbiBvcGxvdCwgdGhlcmUgaXMgdGhlIEN1cnZlM2Qgb2Jq ZWN0IHRoYXQgc2hvdWxkIGRvIGl0LA0KICA8aHR0cHM6Ly9zYW5ldHRlLmdpdGh1Yi5pby9vcGxv dC9vcGxvdC9PcGxvdC9QbHQvaW5kZXguaHRtbCN0eXBlLXBsb3Rfb2JqZWN0LkN1cnZlM2Q+DQog IGFsdGhvdWdoIGl0IGlzIHF1aXRlIHJ1ZGltZW50YXJ5DQoNCg0KTWFyc2hhbCBkZXRlcm1pbmlz bSBhbmQgc3RhYmlsaXR5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21hcnNoYWwt ZGV0ZXJtaW5pc20tYW5kLXN0YWJpbGl0eS83MDQxLzI1Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJl YWQsIEJpa2FsIExlbSBtZW50aW9uZWQgYW5kIFJhcGhhw6tsIFByb3VzdCBkZXNjcmliZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIFtCaW5hcnkgbW9k dWxlIG9mIGRhdGEtZW5jb2RpbmddDQoNCiAgUXVpY2sgbm90ZXMgYWJvdXQgdGhpcyBhcHByb2Fj aDoNCg0KICDigKIgSXQgaXMgdXNlZCBleHRlbnNpdmVseSBpbiB0aGUgVGV6b3MgY29kZWJhc2Uu IEZvciBkYXRhIGV4Y2hhbmdlIChpbg0KICAgIHRoZSBwMnAgbGF5ZXIpLCBmb3IgZGF0YSBhdCBy ZXN0IChjb25maWd1cmF0aW9uIGZpbGVzKSwgYW5kIGZvciBhDQogICAgbWl4IG9mIHRoZSB0d28g KHNlcmlhbGlzYXRpb24gb2YgZWNvbm9taWMgcHJvdG9jb2wgZGF0YSB3aGljaCBpcw0KICAgIGJv dGggZXhjaGFuZ2VkIGJ5IHBlZXJzIGFuZCBzdG9yZWQgb24gZGlzaykuDQogIOKAoiBJdCBpcyBm bGV4aWJsZSBpbiB0aGF0IHlvdSBoYXZlIGdyZWF0IGNvbnRyb2wgb3ZlciB0aGUNCiAgICByZXBy ZXNlbnRhdGlvbiBvZiBkYXRhIGFuZCB0aGUgc2VyaWFsaXNhdGlvbi9kZXNlcmlhbGlzYXRpb24N CiAgICBwcm9jZWR1cmUuIFRoZXJlIGlzIGEgbWVkaXVtLXRlcm0gcGxhbiB0byBhbGxvdyBldmVu IG1vcmUNCiAgICBjb250cm9sLiBGb3Igbm93IHlvdSBjYW4gZGVjaWRlLCBzYXksIGlmIDggYm9v bGVhbnMgYXJlIHJlcHJlc2VudGVkDQogICAgYXMgb25lIGJ5dGUsIDggYnl0ZXMsIG9yIDggd29y ZHMgKG9yIHNvbWV0aGluZyBlbHNlIGFsdG9nZXRoZXIpIChzZWUNCiAgICBjb2RlIGJlbG93KS4N CiAg4oCiIFNvbWUgb2YgdGhlIHJlc3BvbnNpYmlsaXR5IGZvciBjb3JyZWN0bmVzcyByZXN0cyB1 cG9uIHlvdXIgc2hvdWxkZXJzDQogICAgYXMgYSB1c2VyLiBFLmcuLCB3aGVuIHlvdSBlbmNvZGUg YSB0dXBsZSwgdGhlIGxlZnQgZWxlbWVudCBtdXN0IGhhdmUNCiAgICBlaXRoZXIgYSBmaXhlZCBs ZW5ndGggKGUuZy4sIGJlIGFuIGludDgsIGludDMyLCBldGMuLCBiZSBhDQogICAgZml4ZWQtbGVu Z3RoIHN0cmluZywgb3IgYmUgYSB0dXBsZSBvZiBmaXhlZC1sZW5ndGggdmFsdWVzKSBvciBiZQ0K ICAgIHByZWZpeGVkIGJ5IGEgbGVuZ3RoIG1hcmtlciAod2hpY2ggdGhlIGxpYnJhcnkgcHJvdmlk ZXMgYSBjb21iaW5hdG9yDQogICAgZm9yKS4gTW9zdCBvZiB0aGUgZXJyb3JzIGZvciB0aGlzIGFy ZSByYWlzZWQgd2hlbiB5b3UgZGVjbGFyZSB0aGUNCiAgICBlbmNvZGluZyBhbmQgYSBmZXcgYXJl IHJhaXNlZCB3aGVuIHlvdSB1c2UgdGhlIGVuY29kaW5nLiBJIHJlY29tbWVuZA0KICAgIHdyaXRp bmcgc29tZSB0ZXN0cyB0byBjaGVjayB0aGF0IHlvdXIgZW5jb2RpbmdzIGFjY2VwdCB0aGUgcmFu Z2Ugb2YNCiAgICB2YWx1ZXMgdGhhdCB5b3UgYXJlIGdvaW5nIHRvIHRocm93IGF0IHRoZW0uDQog IOKAoiBUaGUgbGlicmFyeSBpcyB3ZWxsIHRlc3RlZDogdGhlcmUgYXJlIHRlc3RzIHVzaW5nIGNy b3diYXIgdG8gY2hlY2sNCiAgICB0aGF0IGVuY29kaW5nIGFuZCBkZWNvZGluZyBhcmUgYWN0dWFs IGludmVyc2Ugb2YgZWFjaCBvdGhlcnMuDQoNCiAgTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgbW9y ZSBxdWVzdGlvbnMuIEFuZCBpbiB0aGUgbWVhbnRpbWUsIGhlcmUncw0KICB0d28gZGlmZmVyZW50 IGVuY29kaW5ncyBmb3IgYSB0dXBsZSBvZiA4IGJvb2xlYW5zOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgKCogZWFzeS1lbmNvZGluZywgcHJvZHVjZXMgOCBieXRlcyAqKQ0KICDilIIgbGV0 IGJvb2xzYXM4Ynl0ZXMgPQ0KICDilIIgICAgdHVwOCBib29sIGJvb2wgYm9vbCBib29sIGJvb2wg Ym9vbCBib29sIGJvb2wNCiAg4pSCIA0KICDilIIgKCogdmVyeS1jb21wYWN0IGVuY29kaW5nLCBw cm9kdWNlcyAxIGJ5dGUgKikNCiAg4pSCIGxldCBib29sc2FzMWJ5dGUgPQ0KICDilIIgICAgY29u dg0KICDilIIgICAgICAgKGZ1biAoYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KSAtPg0K ICDilIIgCSBsZXQgYWNjID0gMCBpbg0KICDilIIgCSBsZXQgYWNjID0gaWYgYjEgdGhlbiBhY2Mg bG9yIDBiMTAwMDAwMDAgZWxzZSBhY2MgaW4NCiAg4pSCIAkgbGV0IGFjYyA9IGlmIGIyIHRoZW4g YWNjIGxvciAwYjAxMDAwMDAwIGVsc2UgYWNjIGluDQogIOKUgiAJIGxldCBhY2MgPSBpZiBiMyB0 aGVuIGFjYyBsb3IgMGIwMDEwMDAwMCBlbHNlIGFjYyBpbg0KICDilIIgCSDigKYNCiAg4pSCIAkg YWNjKQ0KICDilIIgICAgICAgKGZ1biBpIC0+DQogIOKUgiAJIGxldCBiMSA9IGkgbGFuZCAwYjEw MDAwMDAwIDw+IDAgaW4NCiAg4pSCIAkgbGV0IGIxID0gaSBsYW5kIDBiMDEwMDAwMDAgPD4gMCBp bg0KICDilIIgCSBsZXQgYjEgPSBpIGxhbmQgMGIwMDEwMDAwMCA8PiAwIGluDQogIOKUgiAJIOKA pg0KICDilIIgCSAoYjEsIGIyLCBiMywgYjQsIGI1LCBiNiwgYjcsIGI4KSkNCiAg4pSCICAgICAg IHVpbnQ4DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEluIGdlbmVyYWwsIGRhdGEtZW5jb2Rpbmcg aXMgcHJvYmFibHkgc2xvd2VyIHRoYW4gbWFyc2hhbCwgYnV0IGl0cw0KICBzdHJvbmcgcG9pbnRz IGFyZToNCiAg4oCiIGl0IG9mZmVycyBzb21lIHR5cGUgZ3VhcmFudGVlcywNCiAg4oCiIGl0IGdp dmVzIHlvdSBzb21lIGNvbnRyb2wgb3ZlciB0aGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIGRhdGEs DQogIOKAoiBpdCBhbGxvd3MgeW91IHRvIGRlZmluZSByZXByZXNlbnRhdGlvbnMgdGhhdCBhcmUg ZWFzeSB0byBwYXJzZSBpbg0KICAgIG90aGVyIGxhbmd1YWdlcyBvciBpbiBvdGhlciB2ZXJzaW9u cyBvZiB0aGUgc2FtZSBsYW5ndWFnZSwNCiAg4oCiIGl0IGdlbmVyYXRlcyBkb2N1bWVudGF0aW9u IGFib3V0IHRoZSBkYXRhLXJlcHJlc2VudGF0aW9uLg0KDQoNCltCaW5hcnkgbW9kdWxlIG9mIGRh dGEtZW5jb2RpbmddDQo8aHR0cHM6Ly9naXRsYWIuY29tL25vbWFkaWMtbGFicy9kYXRhLWVuY29k aW5nPg0KDQoNCkl0IHRoZXJlIGEgdHV0b3JpYWwgZm9yIGBqc19vZl9vY2FtbCcgd2l0aCBzaW1w bGUgZ3JhcGhpY3M/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2l0LXRoZXJlLWEtdHV0b3JpYWwtZm9yLWpzLW9mLW9jYW1sLXdpdGgtc2ltcGxl LWdyYXBoaWNzLzQ2MzYvNz4NCg0KDQpEZWVwIGluIHRoaXMgdGhyZWFkLCBQaGF0IEt5IHNhaWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMg YSByZWFsbHksIHJlYWxseSBsYXRlIHJlcGx5IGJ1dCB0aGlzIHlvdXR1YmUgdmlkZW8gd2FzIHZl cnkNCiAgaGVscGZ1bCB0byBtZSDigKYgIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92 PWhfZTVwUEtJMEs0Pg0KDQoNCkludGVyZXN0aW5nIE9DYW1sIGV4ZXJjaXNlcyBmcm9tIEZyYW7D p29pcyBQb3R0aWVyIGF2YWlsYWJsZSBvbmxpbmUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50ZXJlc3Rp bmctb2NhbWwtZXhlcmNpc2VzLWZyb20tZnJhbmNvaXMtcG90dGllci1hdmFpbGFibGUtb25saW5l LzcwNTAvMT4NCg0KDQpnYXNjaGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgcmVjZW50IFVSTA0KICA8aHR0cHM6Ly9v Y2FtbC1zZi5vcmcvbGVhcm4tb2NhbWwtcHVibGljLyNhY3Rpdml0eSUzRGV4ZXJjaXNlcz4NCiAg Y29udGFpbnMgYXV0by1ncmFkZWQgT0NhbWwgZXhlcmNpc2VzLCBpbiBwYXJ0aWN1bGFyIGEgYnVu Y2ggb2YNCiAgYWR2YW5jZWQgYW5kIGZhaXJseSBpbnRlcmVzdGluZyBleGVyY2ljZXMgd3JpdHRl biBieSBGcmFuw6dvaXMgUG90dGllciwNCiAgd2hpY2ggSSB3b3VsZCByZWNvbW1lbmQgZm9yIGFu eW9uZSBrbm93bGVkZ2VhYmxlIGluIE9DYW1sIGFuZCBjdXJpb3VzDQogIGFib3V0IGFsZ29yaXRo bXMgYW5kIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcuIChZb3UgaGF2ZSB0byBzY3JvbGwgZG93bg0K ICB0byBzZWUgdGhvc2UsIHRoZSBleGVyY2lzZXMgYXQgdGhlIHRvcCBjb21lIGZyb20gdGhlIE9D YW1sIE1PT0MuKQ0KDQogIFNlZSBmb3IgZXhhbXBsZSBGcmFuw6dvaXMnIGV4ZXJjaXNlcyBvbjoN CiAg4oCiIFtBbHBoYS1CZXRhIFNlYXJjaF0sDQogIOKAoiBbUGFyc2VyIGNvbWJpbmF0b3JzXSwN CiAg4oCiIFtIdWZmbWFuIENvbXByZXNzaW9uXSwNCiAg4oCiIFtJbXBsZW1lbnRpbmcgYmFja3Ry YWNraW5nIHdpdGggY29udGludWF0aW9uc10sIG9yDQogIOKAoiBteSBwZXJzb25hbCBmYXZvcml0 ZSwgW3JlaW1wbGVtZW50aW5nIHRoZSBjb3JlIG9mIGEgcHJldHR5LXByaW50ZXJdLg0KDQogIENv bnRleHQ6IHRoZSBleGVyY2lzZSBwbGF0Zm9ybSBpcyBbTGVhcm5PQ2FtbF0sIGluaXRpYWxseSB3 cml0dGVuIGJ5DQogIE9DYW1sUHJvIGZvciB0aGUgT0NhbWwgTU9PQyBhbmQgbWFpbnRhaW5nIGJ5 IFlhbm4gUsOpZ2lzLUdpYW5hcw0KICAoQHl1cnVnKSBvbiBiZWhhbGYgb2YgdGhlIFtPQ2FtbCBT b2Z0d2FyZSBGb3VuZGF0aW9uXS4gV2UgKGF0IHRoZQ0KICBGb3VuZGF0aW9uKSBhcmUgdHJ5aW5n IHRvIGFzc2VtYmxlIGEgY29ycHVzIG9mIG5pY2UgT0NhbWwgZXhlcmNpc2VzDQogIGZvciB0ZWFj aGVycyBhbmQgcGVvcGxlIHNlbGYtc3R1ZHlpbmcsIGFuZCB0aGUgbmljZSBleGVyY2lzZXMgYnkN CiAgRnJhbsOnb2lzIFBvdHRpZXIgKEBmcG90dGllcikgd2VyZSB3cml0dGVuIGFzIHBhcnQgb2Yg dGhpcyBpbml0aWF0aXZlLg0KDQoNCltBbHBoYS1CZXRhIFNlYXJjaF0NCjxodHRwczovL29jYW1s LXNmLm9yZy9sZWFybi1vY2FtbC1wdWJsaWMvZXhlcmNpc2UuaHRtbCNpZCUzRGZwb3R0aWVyL2Fs cGhhX2JldGElMjZ0YWIlM0R0ZXh0JTI2cHJlbHVkZSUzRHNob3duPg0KDQpbUGFyc2VyIGNvbWJp bmF0b3JzXQ0KPGh0dHBzOi8vb2NhbWwtc2Yub3JnL2xlYXJuLW9jYW1sLXB1YmxpYy9leGVyY2lz ZS5odG1sI2lkJTNEZnBvdHRpZXIvcGFyc2VyX2NvbWJpbmF0b3JzJTI2dGFiJTNEdGV4dD4NCg0K W0h1ZmZtYW4gQ29tcHJlc3Npb25dDQo8aHR0cHM6Ly9vY2FtbC1zZi5vcmcvbGVhcm4tb2NhbWwt cHVibGljL2V4ZXJjaXNlLmh0bWwjaWQlM0RmcG90dGllci9odWZmbWFuJTI2dGFiJTNEdGV4dCUy NnByZWx1ZGUlM0RzaG93bj4NCg0KW0ltcGxlbWVudGluZyBiYWNrdHJhY2tpbmcgd2l0aCBjb250 aW51YXRpb25zXQ0KPGh0dHBzOi8vb2NhbWwtc2Yub3JnL2xlYXJuLW9jYW1sLXB1YmxpYy9leGVy Y2lzZS5odG1sI2lkJTNEZnBvdHRpZXIvbm9uZGV0X21vbmFkX2NvbnQlMjZ0YWIlM0R0ZXh0JTI2 cHJlbHVkZSUzRHNob3duPg0KDQpbcmVpbXBsZW1lbnRpbmcgdGhlIGNvcmUgb2YgYSBwcmV0dHkt cHJpbnRlcl0NCjxodHRwczovL29jYW1sLXNmLm9yZy9sZWFybi1vY2FtbC1wdWJsaWMvZXhlcmNp c2UuaHRtbCNpZCUzRGZwb3R0aWVyL3BwcmludCUyNnRhYiUzRHRleHQlMjZwcmVsdWRlJTNEc2hv d24+DQoNCltMZWFybk9DYW1sXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9j YW1sPg0KDQpbT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbl0gPGh0dHA6Ly9vY2FtbC1zZi5vcmcv Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwN CiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBb UlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5l XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHA6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8 aHR0cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0 cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4g U2NobWl0dF0gPGh0dHA6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 29, 2020 to = January 05, 2021.

First release of Feat

Fran=C3=A7ois Pottier announced

A brief note to announce the first release of Feat:

opam update
opam install feat

Feat is a library that offers support for counting, enumerating, and sampli= ng objects of a certain kind, such as (say) the inhabitants of an algebraic da= ta type.

Feat was inspired by the paper "Feat: Functional Enumeration of Algebraic T= ypes" by Jonas Dureg=C3=A5rd, Patrik Jansson and Meng Wang (2012).

More details can be found here:

https://gitlab.inria.fr/= fpottier/feat/

OCluster and OBuilder

Thomas Leonard announced

I'm pleased to announce the first release of OCluster. A user can submit a build job (either a Dockerfile or an OBuilder spec) to the sch= eduler, which then runs the build on a worker machine, streaming the logs back to the client.

This is the build scheduler / cluster manager that we use for e.g. opam-repo-ci (whic= h you may have seen in action if you submitted a package to opam-repository recently).

See ocurrent/overview = for a quick overview of the various other CI services using it too.

To install and run the scheduler use e.g.

opam depext -i ocluster
mkdir capnp-secrets
ocluster-scheduler \
  --capnp-secret-key-file=3D./capnp-secrets/key.pem \
  --capnp-listen-address=3Dtcp:0.0.0.0:9000 \
  --capnp-public-address=3Dtcp:127.0.0.1:9000 \
  --state-dir=3D/var/lib/ocluster-scheduler \
  --pools=3Dlinux-arm32,linux-x86_64

It will generate key.pem on the first run, as well as various = capability files granting access for workers and clients. You then copy each generated pool capability (e.g. pool-linux-x86_64.cap) to each machine you want in that pool, and run ocluster-worker pool-linu= x-x86_64.cap to start the worker agent. See the README for full details.

OBuilder is an alterna= tive to docker build. The main differences are that it takes a spec in S-expression format, which is easie= r to generate than a Dockerfile, handles concurrent builds reliably, and keeps copies of the log= s so that you still see the output even if someone else performed the same build step earlier and the r= esult is therefore taken from the cache.

It currently supports ZFS and Btrfs for storage (it needs cheap snapshots) = and runc for sandboxing builds. macos su= pport is under development, but not yet upstreamed. It should be fairly easy to add support for any platform th= at has some form of secure chroot.

OCluster supports monitoring with Prometheus, so you can see what the clust= er is doing:

3D"d=

Plotting 3D vectors

Andreas Poisel asked

I'm doing linear algebra with Owl. Owl-plplot works great for visualizing = 2D vectors, but it doesn't seem to capable of plotting 3D vectors.

I took a (fast) look at vanilla Plplot, Oplot, and the GNUplot bindings, but I didn't find a simple way to plot 3D vectors.

I don't need high quality plots, 3D surfaces, a lot of control or fancy fea= tures, just a coordinate system and some function to draw geometric primitives (points, lines, circl= es, etc.).

Did I miss anything or do I have to build this myself with the good old Gra= phics module?

Marshall Abrams replied

What kind of vector representation do you want? Just lines/arrows in 3D? = That's just a curve in 3D, so it should be possible with Owl and plplot, at least. Looks like it shou= ld be easy with oplot, too (but I haven't used oplot). There are some 3D Owl plplot examples, with so= urce code, on these pages:

https://ocaml.xyz/boo= k/visualisation.html

https://github.com/owlbarn/owl/wiki/Tutorial:-How-to-Plot-in-Owl%3F

https://github= .com/owlbarn/owl/wiki/Plot-Gallery

I don't know whether it will be easy to adapt them to your needs. I wrote = the last example on the last page above. It's a plot of a series 2D curves in 3D. Maybe some of the te= chniques can be adapted to your needs. (The code is a few years old. I'm not sure whether it works w= ith the current version of Owl.)

(If you end up having to use low-level bindings to plplot, oplot, etc. from= Owl, you might consider contributing a wrapper module that makes it easy to do the kind of plot you= want.)

Andreas Poisel then said

Thank you for your answer.

I'd just like to draw 3D vectors in a cartesian coordinate system. A plot = should look similar to this:

3D"800px-3D_Vector.svg.png"

I wouldn't even need arrows, simple lines would be ok.

Maybe there is a way to use one of the 3D functions (Plot.surf= , Plot.mesh, Plot.contour), but I can't figure it out.

Hezekiah Carty replied

It's been a while since I worked with plplot but what you showed should be = possible. The plline3 function allows you to plot line segments in 3d space. The function is setup to take multiple segments = in a single call. For a single segment each array would hold a single value. Colors can be set betw= een draw calls.

sanette also replied

in oplot, there is the Curve3d object that should do it, https://sanette.github.io/oplot/oplot/Oplot/Plt/index.= html#type-plot_object.Curve3d although it is quite rudimentary

Marshal determinism and stability

Deep in this thread, Bikal Lem mentioned and Rapha=C3= =ABl Proust described

Binary module of = data-encoding

Quick notes about this approach:

  • It is used extensively in the Tezos codebase. For data exchange (in the= p2p layer), for data at rest (configuration files), and for a mix of the t= wo (serialisation of economic protocol data which is both exchanged by peer= s and stored on disk).
  • It is flexible in that you have great control over the representation o= f data and the serialisation/deserialisation procedure. There is a medium-t= erm plan to allow even more control. For now you can decide, say, if 8 bool= eans are represented as one byte, 8 bytes, or 8 words (or something else al= together) (see code below).
  • Some of the responsibility for correctness rests upon your shoulders as= a user. E.g., when you encode a tuple, the left element must have either a= fixed length (e.g., be an int8, int32, etc., be a fixed-length string, or = be a tuple of fixed-length values) or be prefixed by a length marker (which= the library provides a combinator for). Most of the errors for this are ra= ised when you declare the encoding and a few are raised when you use the en= coding. I recommend writing some tests to check that your encodings accept = the range of values that you are going to throw at them.
  • The library is well tested: there are tests using crowbar to check that= encoding and decoding are actual inverse of each others.

Let me know if you have more questions. And in the meantime, here's two dif= ferent encodings for a tuple of 8 booleans:

(* easy-encoding, produces 8 bytes *)
let boolsas8bytes =3D
   tup8 bool bool bool bool bool bool bool bool

(* v=
ery-compact encoding, produces 1 byte let boolsas1byte =3D
   conv
      (fun (b1, b2, b3, b4, =
b5, =
b6, b7, b8) ->
         let acc =3D 0 in
         let acc =3D =
if b1 then acc lor 0b10000000 els=
e acc in
         let acc =3D =
if b2 then acc lor 0b01000000 els=
e acc in
         let acc =3D =
if b3 then acc lor 0b00100000 els=
e acc in
         …
         acc)
      (fun i ->
         let b1 =3D i land 0b10000000 <> 0 in
         let b1 =3D i land 0b01000000 <> 0 in
         let b1 =3D i land 0b00100000 <> 0 in
         …
         (b1, b2, b3, b4, b5, b6, b7, b8))
      uint8

In general, data-encoding is probably slower than marshal, but its strong p= oints are:

  • it offers some type guarantees,
  • it gives you some control over the representation of the data,
  • it allows you to define representations that are easy to parse in other= languages or in other versions of the same language,
  • it generates documentation about the data-representation.

It there a tutorial for js_of_ocaml with simple g= raphics?

Deep in this thread, Phat Ky said

This is a really, really late reply but this youtube video was very helpful= to me … https://www.youtu= be.com/watch?v=3Dh_e5pPKI0K4

Interesting OCaml exercises from Fran=C3=A7ois Pottier availab= le online

gasche announced

The recent URL https://ocaml-sf.org/learn-ocaml-public/#activity%3Dexercises= contains auto-graded OCaml exercises, in particular a bunch of advanced and= fairly interesting exercices written by Fran=C3=A7ois Pottier, which I would recommend for any= one knowledgeable in OCaml and curious about algorithms and functional programming. (You have to scroll do= wn to see those, the exercises at the top come from the OCaml MOOC.)

See for example Fran=C3=A7ois' exercises on:

Context: the exercise platform is LearnOCaml, initially written by OCamlPro for the OCaml MOOC and maintaing by Yann R=C3=A9gis-Gia= nas (@yurug) on behalf of the OCaml Software Foundation. We (at the = Foundation) are trying to assemble a corpus of nice OCaml exercises for teachers and people self-studying, and t= he nice exercises by Fran=C3=A7ois Pottier (@fpottier) were written as part of this initiative.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 540C8E03B4 for ; Tue, 12 Jan 2021 10:47:37 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.79,341,1602540000"; d="scan'208,217";a="486605220" Received: from clt-128-93-180-71.vpn.inria.fr (HELO set) ([128.93.180.71]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 12 Jan 2021 10:47:36 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 12 Jan 2021 10:47:26 +0100 Message-ID: <87o8huxz9t.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 05 to 12, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Marshal determinism and stability Sedlex + Menhir parser for both tty and file parsing First release of awa-ssh Introducing Feather: A lightweight shell-scripting library for OCaml postdoc researcher and research engineer positions for CHERI and Arm verifi= cation First ocb (OCaml Badgen) release Release of OCaml-Git v3.0 and co Other OCaml News Old CWN Marshal determinism and stability =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, David Allsopp said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 A couple of notes on `Marshal', which I don't think have been covered =E2=80=A2 Although the guarantee is only between identical versions of OC= aml, the implementation actually goes to considerable lengths to maintain backwards compatibility (so a value _written_ by older OCaml remains _readable_ in newer OCaml). Our own testsuite, for example, indirectly [includes a test which unmarshals a 3.12.1 value]. I don't know exactly how far back the support goes. =E2=80=A2 As it happens, the change which affected Unison in 4.08 was the first breaking change to Marshal since either 4.00 or 4.01. The fact that it doesn't break often (and that the two code paths - at least at present - are small) meant I have suggested a few months back that we could in future add an additional flag in the style of `Compat_32' to allow values to be written in a way which should be readable on older versions of OCaml. Indeed, it's small enough that flags could be added for the changes in 4.08 ([PR#1683]) and in 4.11 ([PR#8791]). =E2=80=A2 Neither point undermines using alternative formats either for network serialisation or persistent storage, for the many reasons discussed above! [includes a test which unmarshals a 3.12.1 value] [PR#1683] [PR#8791] Sedlex + Menhir parser for both tty and file parsing =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Bernard Sufrin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am a great fan of Menhir, and have used it in several private language projects, using the ulexing scanner generator to provide Unicode-capable scanners. Alarmed by the obsolescence of ulexing, and needing a utf8-capable scanner in a hurry I decided to (teach myself to) use Sedlex. On the whole the experience was very satisfactory, and I found it straightforward to produce a variant of the sedlexing library which supports buffers with variable chunk sizes, thereby enabling efficient lexing on channels connected to files as well as immediately responsive lexing on channels connected to terminals. I also wanted to teach myself how to use the error-reporting, incremental, interfaces to Menhir-generated parsers. In the hope that it might be useful to others facing the same learning task, or the problem of adapting Sedlex for efficient interactive use, I have placed the example mock-S-Expression parser that resulted from this excursion in: [Git Repository: github.com/sufrin/InteractiveSedlexMenhirExample] [Git Repository: github.com/sufrin/InteractiveSedlexMenhirExample] First release of awa-ssh =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that `awa-ssh' () has just been merged into opam-repository. It is a pure OCaml implementation of the ssh (secure shell, ) protocol. This is the initial release, please report issues you encounter. It was initially developed by Christiano Haesbaert in 2016, and revived mid-2019 by myself and in 2020 it was migrated to the MirageOS organization on GitHub for further development and maintenance. Both client and server code are present in the library (pure code in the main awa package), though the awa-lwt package implements only a server, and the awa-mirage package implements only a client. Tests and examples are in the test subdirectory. The MirageOS client has been successfully used to clone git repositories (on private servers, on GitHub, etc.). It supports apart from RSA keys also ED25519 keys (and key exchanges). Introducing Feather: A lightweight shell-scripting library for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Charles announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I wrote a shell scripting library called [Feather]. I like idea of writing bash-like code quickly, later being able to intersperse OCaml to add more typeful components as needed. It's kind of like [Shexp] but without the monadic interface and with Async support. ([Feather_async]) There's a tutorial and some examples in the link above but here's a quick taste: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Feather =E2=94=82=20 =E2=94=82 let lines =3D find "." ~name:"*.ml" =E2=94=82 |. tr "/" "\n" =E2=94=82 |. map_lines ~f:String.capitalize =E2=94=82 |. sort =E2=94=82 |. process "uniq" [ "-c" ] =E2=94=82 |. process "sort" [ "-n" ] =E2=94=82 |. tail 4 =E2=94=82 |> collect_lines =E2=94=82 in =E2=94=82 String.concat ~sep:", " lines |> print_endline =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Let me know if you have any feedback! And feel free to file bug reports [here]. Hope it ends up being useful, entertaining, or both! [Feather] [Shexp] [Feather_async] [here] postdoc researcher and research engineer positions for CHERI and Arm verifi= cation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Peter Sewell announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are looking for postdoctoral researchers and postdoctoral or postgraduate research engineers to help develop semantics and verification to improve the foundations and security of mainstream computer systems, for CHERI and Arm system software verification, at the University of Cambridge. OCaml expertise to help develop verification tools will be especially welcome. Closing date 13 January 2021 - see the advert . First ocb (OCaml Badgen) release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: zapashcanon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A few days ago, I released [ocb]. It's a library and a command-line tool to generate SVG badges. To get started quickly: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ocb --label Hello --color green --style flat --labelcolor white= --status Goodbye =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Will gives this result: [SVG example]. My first use case was [To.ml] where I'm using [bisect_ppx] to generate and deploy a [coverage report]. I wanted to display the coverage percentage in the README and tried existing tools but wasn't fully satisfied as they didn't work or were failing randomly. Now, [I'm generating the badge directly in a GitHub action]. The project was inspired by [badgen]. I still have to add support for icons and to improve the documentation but it's usable. [ocb] [SVG example] [To.ml] [bisect_ppx] [coverage report] [I'm generating the badge directly in a GitHub action] [badgen] Release of OCaml-Git v3.0 and co =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Ulugbek Abdullaev announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 We, the [`ocaml-git'] team, are happy to announce a new major release of `ocaml-git v3.0' and related libraries. [`ocaml-git'] Release Notes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C OCaml-Git v3.0 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 [*OCaml-Git*] is a library that implements `git' format and protocol implementation in pure OCaml. The library is used by libraries such as [`irmin'], a git-like distributed database, or [`pasteur'], a MirageOS unikernel-based snippet storage service. [*OCaml-Git*] [`irmin'] [`pasteur'] Changes =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88 The main goal behind this major release was to get better compatibility with various platforms, including [~MirageOS~](mirage.io), 32-bit platforms, and `js_of_ocaml'. In order to achieve that, we broke down `ocaml-git' into several components, which are represented as sub-libraries. We will describe some of those components later in this post. Along with better support for various platforms, `ocaml-git 3.0' also comes with SSH support for `fetch/push' and various bug fixes. The rest of the changes are mostly internal and pave a way for interesting features such as a full-blown `git' [garbage collector] and wire protocol v2 ([announcment] and [spec]). *References:* =E2=80=A2 Full [changes list] =E2=80=A2 [PR] that introduced the major rewrite of `ocaml-git' =E2=80=94 In the new version of `ocaml-git', we try to have better separation of concerns by breaking some of the `ocaml-git' components into sub-libraries, which do not contain `git'-specific logic and can be reused for other purposes. [garbage collector] [announcment] [spec] [changes list] [PR] Carton =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 Git uses [PACK files] to store old git objects such as commits and transfer objects over wire using git's wire protocols (`git-nss' library mentioned below implements [v1] of the protocol; [v2] implementation is in progress). [*Carton*] is a library to work with PACK files. The library does not contain git-specific code, so one can easily reuse the library and PACK format for non-git objects. One can see how `ocaml-git' uses `carton' for its purposes [here]. *References:* =E2=80=A2 [PR] that introduces `carton' [PACK files] [v1] [v2] [*Carton*] [here] [PR] Git-NSS (Not So Smart) =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 When one wants to synchronize with a remote repository using git, they need to use `git fetch/push'. Communication and synchronization/negotiation is defined by git *wire protocol*, which has two versions: older version 1 and newer leaner version 2. The protocols are defined for four wire transports: HTTP(S), SSH, and `git://' (TCP). [`Not-So-Smart'] library is a library that allows for such synchronization based on the git wire protocols but without git-specific code, meaning that files being fetched do not need to be git objects or that there is no assumptions on the "repository" that one is synchronizing with. So, as well as `carton', the library aims to be reusable for other purposes. This release features support for SSH using [awa-ssh] by @hannesm (see [the release]), support for [partial-clone] (of various `depth'), and memory consumption fixes for unikernels. *Note 1:* The library's name "Not so smart" is a play on the git's "smart" protocol, a part of wire protocol v1 over HTTP(S) transport. *Note 2:* only client side logic is implemented for wire protocols. The server-side is planned but not yet implemented. One can use `git' as the server for now. [`Not-So-Smart'] [awa-ssh] [the release] [partial-clone] Mimic =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 [*Mimic*] is a small reimplementation of [`conduit'], a library that helps to abstract over a transport protocol such as HTTP(S) or SSH. In other words, the code using `mimic' can deal not with different types that represent an HTTP or SSH connection, but just deal, e.g., read from or write to, with a `flow' value, which hides protocol-specific details under its hood. =E2=80=94 There are several independent libraries that were upgraded along with `ocaml-git 3.0'. [*Mimic*] [`conduit'] Duff v0.3 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84 [*Duff*] is a library that implements git's [`libXdiff'] (`xdiff' algorithm) in OCaml. PACK files use a binary diff algorithm, `xdiff', to compress binary data. More on the project [page] and release [notes] for `ocaml-git 2.0'. [*Duff*] [`libXdiff'] [page] [notes] Changes =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88 This release fixes the support for 32-bit architecture platforms. Encore v0.7 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84 [*Encore*] is a library that can create an encoder/decoder based on the format given. It also ensures isomorphism by construction. [*Encore*] Changes =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88 Extensive changes to the API. See the project page. Decompress v1.2.0 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84 [*Decompress*] is an OCaml implementation of certain decompression algorithms such as `Zlib', `Gzip', etc. [*Decompress*] Changes =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88 `ocaml-git 3.0' uses new version of `decompress' with extensive performance improvements documented in *Tarides's* blog [API changes] and [performance improvements]. We'd be happy to get your feedback or questions! :-) [API changes] [performance improvements] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [How We Lost at The Delphi Oracle Challenge] =E2=80=A2 [Tarides sponsors the Oxbridge Women in Computer Science Confer= ence 2020] =E2=80=A2 [Coq 8.12.2 is out] =E2=80=A2 [First release of MetAcsl plugin] =E2=80=A2 [Announcing MirageOS 3.10] =E2=80=A2 [ ReScript 8.4] =E2=80=A2 [Coq 8.13+beta1 is out] [OCaml Planet] [How We Lost at The Delphi Oracle Challenge] [Tarides sponsors the Oxbridge Women in Computer Science Conference 2020] [Coq 8.12.2 is out] [First release of MetAcsl plugin] [Announcing MirageOS 3.10] [ ReScript 8.4] [Coq 8.13+beta1 is out] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 05 to 12, 2021.

Marshal determinism and stability

Continuing this thread, David Allsopp said

A couple of notes on Marshal, which I don't think have been covered

  • Although the guarantee is only between identical versions of OCaml, the implementation actually goes to considerable lengths to maintain backwards compatibility (so a value written by older OCaml remains readable in newer OCaml). Our own testsuite, for example, indirectly includes a test which unmarshals a 3.12.1 value. I don't know exactly how far back the support goes.
  • As it happens, the change which affected Unison in 4.08 was the first breaking change to Marshal since either 4.00 or 4.01. The fact that it doesn't break often (and that the two code paths - at least at present - are small) meant I have suggested a few months back that we could in future add an additional flag in the style of Compat_32 to allow values to be written in a way which should be readable on older versions of OCaml. Indeed, it's small enough that flags could be added for the changes in 4.08 (PR#1683) and in 4.11 (PR#8791).
  • Neither point undermines using alternative formats either for network serialisation or persistent storage, for the many reasons discussed above!

Sedlex + Menhir parser for both tty and file parsing

Bernard Sufrin announced

I am a great fan of Menhir, and have used it in several private language projects, using the ulexing scanner generator to provide Unicode-capable scanners.

Alarmed by the obsolescence of ulexing, and needing a utf8-capable scanner in a hurry I decided to (teach myself to) use Sedlex. On the whole the experience was very satisfactory, and I found it straightforward to produce a variant of the sedlexing library which supports buffers with variable chunk sizes, thereby enabling efficient lexing on channels connected to files as well as immediately responsive lexing on channels connected to terminals.

I also wanted to teach myself how to use the error-reporting, incremental, interfaces to Menhir-generated parsers. In the hope that it might be useful to others facing the same learning task, or the problem of adapting Sedlex for efficient interactive use, I have placed the example mock-S-Expression parser that resulted from this excursion in:

Git Repository: github.com/sufrin/InteractiveSedlexMenhirExample

First release of awa-ssh

Hannes Mehnert announced

I'm happy to announce that awa-ssh (https://github.com/mirage/awa-ssh) has just been merged into opam-repository. It is a pure OCaml implementation of the ssh (secure shell, https://en.wikipedia.org/wiki/SSH_(Secure_Shell)) protocol.

This is the initial release, please report issues you encounter.

It was initially developed by Christiano Haesbaert in 2016, and revived mid-2019 by myself and in 2020 it was migrated to the MirageOS organization on GitHub for further development and maintenance.

Both client and server code are present in the library (pure code in the main awa package), though the awa-lwt package implements only a server, and the awa-mirage package implements only a client. Tests and examples are in the test subdirectory.

The MirageOS client has been successfully used to clone git repositories (on private servers, on GitHub, etc.). It supports apart from RSA keys also ED25519 keys (and key exchanges).

Introducing Feather: A lightweight shell-scripting library for OCaml

Charles announced

I wrote a shell scripting library called Feather. I like idea of writing bash-like code quickly, later being able to intersperse OCaml to add more typeful components as needed. It's kind of like Shexp but without the monadic interface and with Async support. (Feather_async)

There's a tutorial and some examples in the link above but here's a quick taste:

open Feather

let lines = find "." ~name:"*.ml"
  |. tr "/" "\n"
  |. map_lines ~f:String.capitalize
  |. sort
  |. process "uniq" [ "-c" ]
  |. process "sort" [ "-n" ]
  |. tail 4
  |> collect_lines
in
String.concat ~sep:", " lines |> print_endline

Let me know if you have any feedback! And feel free to file bug reports here. Hope it ends up being useful, entertaining, or both!

postdoc researcher and research engineer positions for CHERI and Arm verification

Peter Sewell announced

We are looking for postdoctoral researchers and postdoctoral or postgraduate research engineers to help develop semantics and verification to improve the foundations and security of mainstream computer systems, for CHERI and Arm system software verification, at the University of Cambridge. OCaml expertise to help develop verification tools will be especially welcome. Closing date 13 January 2021 - see the advert http://www.jobs.cam.ac.uk/job/28012/.

First ocb (OCaml Badgen) release

zapashcanon announced

A few days ago, I released ocb. It's a library and a command-line tool to generate SVG badges.

To get started quickly:

ocb --label Hello --color green --style flat --labelcolor white --status Goodbye

Will gives this result: SVG example.

My first use case was To.ml where I'm using bisect_ppx to generate and deploy a coverage report. I wanted to display the coverage percentage in the README and tried existing tools but wasn't fully satisfied as they didn't work or were failing randomly. Now, I'm generating the badge directly in a GitHub action.

The project was inspired by badgen. I still have to add support for icons and to improve the documentation but it's usable.

Release of OCaml-Git v3.0 and co

Ulugbek Abdullaev announced

We, the ocaml-git team, are happy to announce a new major release of ocaml-git v3.0 and related libraries.

Release Notes

OCaml-Git v3.0

OCaml-Git is a library that implements git format and protocol implementation in pure OCaml. The library is used by libraries such as irmin, a git-like distributed database, or pasteur, a MirageOS unikernel-based snippet storage service.

Changes

The main goal behind this major release was to get better compatibility with various platforms, including [~MirageOS~](mirage.io), 32-bit platforms, and js_of_ocaml. In order to achieve that, we broke down ocaml-git into several components, which are represented as sub-libraries. We will describe some of those components later in this post.

Along with better support for various platforms, ocaml-git 3.0 also comes with SSH support for fetch/push and various bug fixes.

The rest of the changes are mostly internal and pave a way for interesting features such as a full-blown git garbage collector and wire protocol v2 (announcment and spec).

References:

In the new version of ocaml-git, we try to have better separation of concerns by breaking some of the ocaml-git components into sub-libraries, which do not contain git-specific logic and can be reused for other purposes.

Carton

Git uses PACK files to store old git objects such as commits and transfer objects over wire using git's wire protocols (git-nss library mentioned below implements v1 of the protocol; v2 implementation is in progress).

Carton is a library to work with PACK files. The library does not contain git-specific code, so one can easily reuse the library and PACK format for non-git objects. One can see how ocaml-git uses carton for its purposes here.

References:

  • PR that introduces carton
Git-NSS (Not So Smart)

When one wants to synchronize with a remote repository using git, they need to use git fetch/push. Communication and synchronization/negotiation is defined by git wire protocol, which has two versions: older version 1 and newer leaner version 2. The protocols are defined for four wire transports: HTTP(S), SSH, and git:// (TCP).

Not-So-Smart library is a library that allows for such synchronization based on the git wire protocols but without git-specific code, meaning that files being fetched do not need to be git objects or that there is no assumptions on the "repository" that one is synchronizing with. So, as well as carton, the library aims to be reusable for other purposes.

This release features support for SSH using awa-ssh by @hannesm (see the release), support for partial-clone (of various depth), and memory consumption fixes for unikernels.

Note 1: The library's name "Not so smart" is a play on the git's "smart" protocol, a part of wire protocol v1 over HTTP(S) transport.

Note 2: only client side logic is implemented for wire protocols. The server-side is planned but not yet implemented. One can use git as the server for now.

Mimic

Mimic is a small reimplementation of conduit, a library that helps to abstract over a transport protocol such as HTTP(S) or SSH. In other words, the code using mimic can deal not with different types that represent an HTTP or SSH connection, but just deal, e.g., read from or write to, with a flow value, which hides protocol-specific details under its hood.

There are several independent libraries that were upgraded along with ocaml-git 3.0.

Duff v0.3

Duff is a library that implements git's libXdiff (xdiff algorithm) in OCaml. PACK files use a binary diff algorithm, xdiff, to compress binary data. More on the project page and release notes for ocaml-git 2.0.

Changes

This release fixes the support for 32-bit architecture platforms.

Encore v0.7

Encore is a library that can create an encoder/decoder based on the format given. It also ensures isomorphism by construction.

Changes

Extensive changes to the API. See the project page.

Decompress v1.2.0

Decompress is an OCaml implementation of certain decompression algorithms such as Zlib, Gzip, etc.

Changes

ocaml-git 3.0 uses new version of decompress with extensive performance improvements documented in Tarides's blog API changes and performance improvements.

We'd be happy to get your feedback or questions! :-)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D0A45E0264 for ; Tue, 19 Jan 2021 15:28:26 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.79,359,1602540000"; d="scan'208,217";a="370466372" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Jan 2021 15:28:24 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 19 Jan 2021 15:28:23 +0100 Message-ID: <87mtx5ypa0.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 12 to 19, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Irmin 2.3.0 Dune 2.8.0 lwt-canceler.0.3 Interesting OCaml Articles OCaml 4.12.0, first beta release OCaml for ARM MacOS Talk on OCaml Batteries at Houston Functional Programmers Other OCaml News Old CWN Irmin 2.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Craig Ferguson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm very happy to announce the release of the Irmin 2.3.0 family of packages, including: =E2=80=A2 [`irmin-pack.2.3.0'], a storage backend for Irmin designed for = and used by Tezos. This release contains a host of performance improvements as well as offline CLI features such as integrity checking. It also contains a number of high-level design changes, which were discussed in a recent [Tarides blog post]. Finally, `irmin-pack.2.3.0' also contains a prototype of the [_layered_] `irmin-pack' store, which provides an [OverlayFS]-esque mode of operation for `irmin-pack' in which the causal history of the store can be chunked into independently-accessable substores. This feature will eventually be deployed in a [future version of Tezos]. =E2=80=A2 [`irmin-containers'], a collection of pre-defined mergeable data structures built using Irmin and compatible with any backend. These were originally provided by @kayceesrk as part of [`ezirmin'], and has since been modernised and upstreamed by Anirudh S. =E2=80=A2 `irmin-bench', a suite of benchmarks for Irmin for use with [`current-bench'], an experimental continuous benchmarking infrastructure for OCaml projects. Lots of work has been going on behind the scenes to make this a general benchmarking infrastructure for the Mirage ecosystem, including a recent [fancy UI overhaul] by new contributor @rizo. =E2=80=A2 [`repr'], an extraction of the `Irmin.Type' type representation library for use in other packages. This package contains a set of combinators for building run-time representations of types, along with various generic operations defined over those representations, including: equality, comparison, pretty-printing, JSON / binary codecs, etc. The API of this library is currently a work-in-progress, but we hope to use it more widely in the Mirage ecosystem soon. =E2=80=A2 [`semaphore-compat'], an extraction of the `Semaphore' library = in OCaml 4.12, for libraries that want to maintain compatibility with earlier versions of OCaml. The full list of changes to Irmin can be found [here]. Many thanks to our open-source contributors and collaborators. Happy hacking! [`irmin-pack.2.3.0'] [Tarides blog post] [_layered_] [OverlayFS] [future version of Tezos] [`irmin-containers'] [`ezirmin'] [`current-bench'] [fancy UI overhaul] [`repr'] [`semaphore-compat'] [here] Dune 2.8.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune, I'm pleased to announce the release of dune 2.8.0. This release contains many bug fixes, performance improvements, and interesting new features. I'll point out two new features that I'm most excited about. First is the experimental `dune_site' extension that makes it possible to register and load plugins at runtime. This feature is quite involved, but we've documented it extensively [in the manual]. Another cool feature is that we've eliminated the need for .merlin files and all the caveats that came with them. Now, merlin talks to dune directly to get precise configuration for every module. Say goodbye to all those "approximate .merlin file" warnings! I encourage everyone to upgrade as soon as possible, as earlier versions are not compatible with OCaml 4.12. Happy Hacking. Full change log: [in the manual] 2.8.0 (13/01/2021) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 `dune rules' accepts aliases and other non-path rules (#4063, @mrmr1993) =E2=80=A2 Action `(diff reference test_result)' now accept `reference' to= be absent and in that case consider that the reference is empty. Then running `dune promote' will create the reference file. (#3795, @bobot) =E2=80=A2 Ignore special files (BLK, CHR, FIFO, SOCKET), (#3570, fixes #3= 124, #3546, @ejgallego) =E2=80=A2 Experimental: Simplify loading of additional files (data or cod= e) at runtime in programs by introducing specific installation sites. In particular it allow to define plugins to be installed in these sites. (#3104, #3794, fixes #1185, @bobot) =E2=80=A2 Move all temporary files created by dune to run actions to a si= ngle directory and make sure that actions executed by dune also use this directory by setting `TMPDIR' (or `TEMP' on Windows). (#3691, fixes #3422, @rgrinberg) =E2=80=A2 Fix bootstrap script with custom configuration. (#3757, fixes #= 3774, @marsam) =E2=80=A2 Add the `executable' field to `inline_tests' to customize the compilation flags of the test runner executable (#3747, fixes #3679, @lubegasimon) =E2=80=A2 Add `(enabled_if ...)' to `(copy_files ...)' (#3756, @nojb) =E2=80=A2 Make sure Dune cleans up the status line before exiting (#3767, fixes #3737, @alan-j-hu) =E2=80=A2 Add `{gitlab,bitbucket}' as options for defining project sources with `source' stanza `(source ( user/repo))' in the `dune-project' file. (#3813, @rgrinberg) =E2=80=A2 Fix generation of `META' and `dune-package' files when some tar= gets (byte, native, dynlink) are disabled. Previously, dune would generate all archives for regardless of settings. (#3829, #4041, @rgrinberg) =E2=80=A2 Do not run ocamldep to for single module executables & libraries. The dependency graph for such artifacts is trivial (#3847, @rgrinberg) =E2=80=A2 Fix cram tests inside vendored directories not being interpreted correctly. (#3860, fixes #3843, @rgrinberg) =E2=80=A2 Add `package' field to private libraries. This allows such libr= aries to be installed and to be usable by other public libraries in the same project (#3655, fixes #1017, @rgrinberg) =E2=80=A2 Fix the `%{make}' variable on Windows by only checking for a `g= make' binary on UNIX-like systems as a unrelated `gmake' binary might exist on Windows. (#3853, @kit-ty-kate) =E2=80=A2 Fix `$ dune install' modifying the build directory. This made t= he build directory unusable when `$ sudo dune install' modified permissions. (fix #3857, @rgrinberg) =E2=80=A2 Fix handling of aliases given on the command line (using the `@= ' and `@@' syntax) so as to correctly handle relative paths. (#3874, fixes #3850, @nojb) =E2=80=A2 Allow link time code generation to be used in preprocessing executable. This makes it possible to use the build info module inside the preprocessor. (#3848, fix #3848, @rgrinberg) =E2=80=A2 Correctly call `git ls-tree' so unicode files are not quoted, t= his fixes problems with `dune subst' in the presence of unicode files. Fixes #3219 (#3879, @ejgallego) =E2=80=A2 `dune subst' now accepts common command-line arguments such as `--debug-backtraces' (#3878, @ejgallego) =E2=80=A2 `dune describe' now also includes information about executables= in addition to that of libraries. (#3892, #3895, @nojb) =E2=80=A2 instrumentation backends can now receive arguments via `(instrumentation (backend ))'. (#3906, #3932, @nojb) =E2=80=A2 Tweak auto-formatting of `dune' files to improve readability. (#3928, @nojb) =E2=80=A2 Add a switch argument to opam when context is not default. (#39= 51, @tmattio) =E2=80=A2 Avoid pager when running `$ git diff' (#3912, @AltGr) =E2=80=A2 Add `(root_module ..)' field to libraries & executables. This m= akes it possible to use library dependencies shadowed by local modules (#3825, @rgrinberg) =E2=80=A2 Allow `(formatting ...)' field in `(env ...)' stanza to set per-directory formatting specification. (#3942, @nojb) =E2=80=A2 [coq] In `coq.theory', `:standard' for the `flags' field now us= es the flags set in `env' profile flags (#3931 , @ejgallego @rgrinberg) =E2=80=A2 [coq] Add `-q' flag to `:standard' `coqc' flags , fixes #3924, (#3931 , @ejgallego) =E2=80=A2 Add support for Coq's native compute compilation mode (@ejgalle= go, #3210) =E2=80=A2 Add a `SUFFIX' directive in `.merlin' files for each dialect wi= th no preprocessing, to let merlin know of additional file extensions (#3977, @vouillon) =E2=80=A2 Stop promoting `.merlin' files. Write per-stanza Merlin configurations in binary form. Add a new subcommand `dune ocaml-merlin' that Merlin can use to query the configuration files. The `allow_approximate_merlin' option is now useless and deprecated. Dune now conflicts with `merlin < 3.4.0' and `ocaml-lsp-server < 1.3.0' (#3554, @voodoos) =E2=80=A2 Configurator: fix a bug introduced in 2.6.0 where the configura= tor V1 API doesn't work at all when used outside of dune. (#4046, @aalekseyev) =E2=80=A2 Fix `libexec' and `libexec-private' variables. In cross-compila= tion settings, they now point to the file in the host context. (#4058, fixes #4057, @TheLortex) =E2=80=A2 When running `$ dune subst', use project metadata as a fallback= when package metadata is missing. We also generate a warning when `(name ..)' is missing in `dune-project' files to avoid failures in production builds. =E2=80=A2 Remove support for passing `-nodynlink' for executables. It was bypassed in most cases and not correct in other cases in particular on arm32. (#4085, fixes #4069, fixes #2527, @emillon) =E2=80=A2 Generate archive rules compatible with 4.12. Dune longer attemp= t to generate an archive file if it's unnecessary (#3973, fixes #3766, @rgrinberg) =E2=80=A2 Fix generated Merlin configurations when multiple preprocessors= are defined for different modules in the same folder. (#4092, fixes #2596, #1212 and #3409, @voodoos) =E2=80=A2 Add the option `use_standard_c_and_cxx_flags' to `dune-project'= that 1. disables the unconditional use of the `ocamlc_cflags' and `ocamlc_cppflags' from `ocamlc -config' in C compiler calls, these flags will be present in the `:standard' set instead; and 2. enables the detection of the C compiler family and populates the `:standard' set of flags with common default values when building CXX stubs. (#3875, #3802, fix #3718 and #3528, @voodoos) lwt-canceler.0.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of [Nomadic Labs], I'm happy to announce the release of Lwt-canceler version 0.3. Lwt-canceler is a small library to help programs written using Lwt to synchronise promises around resource clean-up. This library was developed as part of the [Tezos codebase] before being released. With this version, the code has matured significantly (including tests, documentation and some refactoring); the next release will probably be a version 1.0 at which point a more robust versioning scheme will be used. The documentation is available online: The code is released under MIT License and hosted on Gitlab: The new version is available on opam: `opam install lwt-canceler' Happy hacking! [Nomadic Labs] [Tezos codebase] Interesting OCaml Articles =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Weng Shiwei announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Let me share my new blog post on understanding `format6' with examples. It's almost my reading note for the paper Format Unraveled (on module Format) and experiments on utop. I tried not to be too verbose though. Weng Shiwei later said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Well, I made a sequel of `format6' post, *Understanding `format6' in OCaml by diagrams* This time I just use four examples with four diagrams e.g. it's the one for `Scanf.sscanf' p.s. It's a pity that I missed Gabriel's post [The 6 parameters of (=E2=80=99a, =E2=80=99b, =E2=80=99c, =E2=80=99d, =E2=80=99e, =E2=80=99f) = format6] after writing that one. [The 6 parameters of (=E2=80=99a, =E2=80=99b, =E2=80=99c, =E2=80=99d, =E2= =80=99e, =E2=80=99f) format6] OCaml 4.12.0, first beta release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml 4.12.0 is close. The set of new features has been stabilized, and core opam packages already work with this release. After three alpha releases, we have created a first beta version to help you adapt your software to the new features ahead of the release. Compared to the last alpha, this beta contains only three new bug fixes and one change to the standard library. The base compiler can be installed as an opam switch with the following commands =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 4.12.0~beta1 --repositories=3Ddefault,beta= =3Dgit+https://github.com/ocaml/ocaml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you want to tweak the configuration of the compiler, you can pick configuration options with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create --packages=3Docaml-variants.4.= 12.0~beta1+options, =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where is a comma separated list of ocaml-option-* packages. For instance, for a flambda and afl enabled switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 4.12.0~beta1+flambda+afl =E2=94=82 --packages=3Docaml-variants.4.12.0~beta1+options,ocaml-option-f= lambda,ocaml-option-afl =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with "opam search ocaml-option". The source code is available at these addresses: =E2=80=A2 =E2=80=A2 If you want to test this version, you may want to install the alpha opam repository with opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-repository.git This alpha repository contains various packages patched with fixes in the process of being upstreamed. Once the repository installed, these patched packages will take precedence over the non-patched version. If you find any bugs, please report them here: Changes from the third alpha release =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C Postponed features =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84 =E2=80=A2 [9533], [10105], [10127] : Added String.starts_with and String.ends_with. (Bernhard Schommer, review by Daniel B=C3=BCnzli, Gabriel Scherer and Alain Frisch) [9533] [10105] [10127] Additional bug fixes =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84 =E2=80=A2 [9096], [10096]: fix a 4.11.0 performance regression in classes/objects declared within a function (Gabriel Scherer, review by Leo White, report by Sacha Ayoun) =E2=80=A2 [10106], [10112]: some expected-type explanations where forgott= en after some let-bindings (Gabriel Scherer, review by Thomas Refis and Florian Angeletti, report by Daniil Baturin) =E2=80=A2 [9326], [10125]: Gc.set incorrectly handles the three `custom_*' fields, causing a performance regression (report by Emilio Jes=C3=BAs Gallego Arias, analysis and fix by Stephen Dolan, code by Xavier Leroy, review by Hugo Heuzard and Gabriel Scherer) [9096] [10096] [10106] [10112] [9326] [10125] OCaml for ARM MacOS =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Deep in this thread, Xavier Leroy said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's quite easy to get up to speed using the precompiled OPAM binary for macOS/ARM64. =E2=80=A2 Download [opam-2.0.7-arm64-macos]. =E2=80=A2 Move it to some directory in your PATH, rename it to `opam', and make it executable. From a Terminal window: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 mv ~/Downloads/opam-2.0.7-arm64-macos /usr/local/bin/opam =E2=94=82 chmod +x /usr/local/bin/opam =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Try to execute it: `opam init'. You will be blocked by the mac= OS security checks, as the binary is not signed. =E2=80=A2 Open Preferences / Security and Privacy. There should be a not= ice "opam was blocked because=E2=80=A6" and an "Allow Anyway" button. Clic= k on that button. =E2=80=A2 Try again to execute `opam init'. You will be blocked again, b= ut now there is an "Open" button. Click on that button. `opam init' should run and install the OCaml 4.10.2 compiler. =E2=80=A2 From now on, you can run `opam' without being blocked. Use this freedom to `opam install' the packages you need. =E2=80=A2 Some packages that depend on external C libraries may fail to install because these C libraries are not available. Normally we would rely on Homebrew or MacPorts to provide these C libraries, but these package collections are still being ported to macOS/ARM64. As a reward for these minor inconveniences, you'll get excellent performance running OCaml software such as Coq. Single-core performance on a MacBook Air M1 is 20% better than the best x86 workstation I have access to. [opam-2.0.7-arm64-macos] Talk on OCaml Batteries at Houston Functional Programmers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Claude Jager-Rubinson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 @UnixJunkie will be speaking (virtually, of course) on *OCaml Batteries Included* at Houston Functional Programmers, this coming Wednesday, Jan 20 at 7pm (U.S. Central time). His talk will cover Batteries' history, place within the OCaml ecosystem, and comparisons with OCaml's other alternative standard libraries. All are welcome to join us, even if you're not from Houston. Complete details and Zoom info are at [hfpug.org]. [hfpug.org] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Coq 8.13.0 is out] [OCaml Planet] [Coq 8.13.0 is out] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 12 to 19, 202= 1.

Irmin 2.3.0

Craig Ferguson announced

I'm very happy to announce the release of the Irmin 2.3.0 family of package= s, including:

  • irmin-pack.= 2.3.0, a storage backend for Irmin designed for and used by Tezo= s. This release contains a host of performance improvements as well as offl= ine CLI features such as integrity checking. It also contains a number of h= igh-level design changes, which were discussed in a recent Tarides blog po= st.

    Finally, irmin-pack.2.3.0 also contains a prototype of the layered irmin-pack stor= e, which provides an Ov= erlayFS-esque mode of operation for irmin-pack in which th= e causal history of the store can be chunked into independently-accessable = substores. This feature will eventually be deployed in a future version of Tezos.

  • irmin-containers, a collection of pre-def= ined mergeable data structures built using Irmin and compatible with any ba= ckend. These were originally provided by @kayceesrk as part of ezirmin, and has sinc= e been modernised and upstreamed by Anirudh S.
  • irmin-bench, a suite of benchmarks for Irmin for use with = current-bench<= /code>, an experimental continuous benchmarking infrastructure for OCam= l projects. Lots of work has been going on behind the scenes to make this a= general benchmarking infrastructure for the Mirage ecosystem, including a = recent fancy = UI overhaul by new contributor @rizo.
  • repr, an ex= traction of the Irmin.Type type representation library for use= in other packages. This package contains a set of combinators for building= run-time representations of types, along with various generic operations d= efined over those representations, including: equality, comparison, pretty-= printing, JSON / binary codecs, etc. The API of this library is currently a= work-in-progress, but we hope to use it more widely in the Mirage ecosyste= m soon.
  • semaphore-= compat, an extraction of the Semaphore library in O= Caml 4.12, for libraries that want to maintain compatibility with earlier v= ersions of OCaml.

The full list of changes to Irmin can be found here.

Many thanks to our open-source contributors and collaborators. Happy hackin= g!

Dune 2.8.0

Rudi Grinberg announced

On behalf of the dune, I'm pleased to announce the release of dune 2.8.0. T= his release contains many bug fixes, performance improvements, and interesting new features. I'll point out two = new features that I'm most excited about.

First is the experimental dune_site extension that makes it po= ssible to register and load plugins at runtime. This feature is quite involved, but we've documented it extensively in the manual.

Another cool feature is that we've eliminated the need for .merlin files an= d all the caveats that came with them. Now, merlin talks to dune directly to get precise configuration for every m= odule. Say goodbye to all those "approximate .merlin file" warnings!

I encourage everyone to upgrade as soon as possible, as earlier versions ar= e not compatible with OCaml 4.12. Happy Hacking.

Full change log:

2.8.0 (13/01/2021)

  • dune rules accepts aliases and other non-path rules (#4063= , @mrmr1993)
  • Action (diff reference test_result) now accept refer= ence to be absent and in that case consider that the reference is empty. Then running dune = promote will create the reference file. (#3795, @bobot)
  • Ignore special files (BLK, CHR, FIFO, SOCKET), (#3570, fixes #3124, #35= 46, @ejgallego)
  • Experimental: Simplify loading of additional files (data or code) at ru= ntime in programs by introducing specific installation sites. In particular it al= low to define plugins to be installed in these sites. (#3104, #3794, fixes #118= 5, @bobot)
  • Move all temporary files created by dune to run actions to a single dir= ectory and make sure that actions executed by dune also use this directory by sett= ing TMPDIR (or TEMP on Windows). (#3691, fixes #3422,= @rgrinberg)
  • Fix bootstrap script with custom configuration. (#3757, fixes #3774, @m= arsam)
  • Add the executable field to inline_tests to c= ustomize the compilation flags of the test runner executable (#3747, fixes #3679, @lubegasimon)
  • Add (enabled_if ...) to (copy_files ...) (#37= 56, @nojb)
  • Make sure Dune cleans up the status line before exiting (#3767, fixes #3737, @alan-j-hu)
  • Add {gitlab,bitbucket} as options for defining project sou= rces with source stanza (source (<host> user/repo)) in the dune-pro= ject file. (#3813, @rgrinberg)
  • Fix generation of META and dune-package files= when some targets (byte, native, dynlink) are disabled. Previously, dune would generate all archives for regardless of settings. (#3829, #4041, @rgrinberg)
  • Do not run ocamldep to for single module executables & libraries. T= he dependency graph for such artifacts is trivial (#3847, @rgrinberg)
  • Fix cram tests inside vendored directories not being interpreted correc= tly. (#3860, fixes #3843, @rgrinberg)
  • Add package field to private libraries. This allows such l= ibraries to be installed and to be usable by other public libraries in the same project (#3655, fixes #1017, @rgrinberg)
  • Fix the %{make} variable on Windows by only checking for a= gmake binary on UNIX-like systems as a unrelated gmake binary might exist o= n Windows. (#3853, @kit-ty-kate)
  • Fix $ dune install modifying the build directory. This mad= e the build directory unusable when $ sudo dune install modified permissio= ns. (fix #3857, @rgrinberg)
  • Fix handling of aliases given on the command line (using the @ and @@ syntax) so as to correctly handle relative paths. (#3874, fixes #3850, @noj= b)
  • Allow link time code generation to be used in preprocessing executable.= This makes it possible to use the build info module inside the preprocessor. (#3848, fix #3848, @rgrinberg)
  • Correctly call git ls-tree so unicode files are not quoted= , this fixes problems with dune subst in the presence of unicode files. Fix= es #3219 (#3879, @ejgallego)
  • dune subst now accepts common command-line arguments such = as --debug-backtraces (#3878, @ejgallego)
  • dune describe now also includes information about executab= les in addition to that of libraries. (#3892, #3895, @nojb)
  • instrumentation backends can now receive arguments via (instrumen= tation (backend <name> <args>)). (#3906, #3932, @nojb)
  • Tweak auto-formatting of dune files to improve readability= . (#3928, @nojb)
  • Add a switch argument to opam when context is not default. (#3951, @tma= ttio)
  • Avoid pager when running $ git diff (#3912, @AltGr)
  • Add (root_module ..) field to libraries & executables.= This makes it possible to use library dependencies shadowed by local modules (#3825, @rgrinberg)
  • Allow (formatting ...) field in (env ...) sta= nza to set per-directory formatting specification. (#3942, @nojb)
  • [coq] In coq.theory, :standard for the = flags field now uses the flags set in env profile flags (#3931 , @ejgallego @rgrinberg)=
  • [coq] Add -q flag to :standard coqc flags , fixes #3924, (#3931 , @ejgallego)
  • Add support for Coq's native compute compilation mode (@ejgallego, #321= 0)
  • Add a SUFFIX directive in .merlin files for e= ach dialect with no preprocessing, to let merlin know of additional file extensions (#3977, @vouillon)
  • Stop promoting .merlin files. Write per-stanza Merlin conf= igurations in binary form. Add a new subcommand dune ocaml-merlin that Merli= n can use to query the configuration files. The allow_approximate_merlin op= tion is now useless and deprecated. Dune now conflicts with merlin < 3.4.0 and ocaml-lsp-server < 1.3.0 (#3554, @voodoos)
  • Configurator: fix a bug introduced in 2.6.0 where the configurator V1 A= PI doesn't work at all when used outside of dune. (#4046, @aalekseyev)
  • Fix libexec and libexec-private variables. In= cross-compilation settings, they now point to the file in the host context. (#4058, fixes #4057, @TheLortex)
  • When running $ dune subst, use project metadata as a fallb= ack when package metadata is missing. We also generate a warning when (name ..)= is missing in dune-project files to avoid failures in production builds.
  • Remove support for passing -nodynlink for executables. It = was bypassed in most cases and not correct in other cases in particular on arm32. (#4085, fixes #4069, fixes #2527, @emillon)
  • Generate archive rules compatible with 4.12. Dune longer attempt to gen= erate an archive file if it's unnecessary (#3973, fixes #3766, @rgrinberg)
  • Fix generated Merlin configurations when multiple preprocessors are def= ined for different modules in the same folder. (#4092, fixes #2596, #1212 and #3409, @voodoos)
  • Add the option use_standard_c_and_cxx_flags to dune-= project that 1. disables the unconditional use of the ocamlc_cflags and = ocamlc_cppflags from ocamlc -config in C compiler calls, these flags will be p= resent in the :standard set instead; and 2. enables the detection of the C c= ompiler family and populates the :standard set of flags with common default v= alues when building CXX stubs. (#3875, #3802, fix #3718 and #3528, @voodoos)

lwt-canceler.0.3

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I'm ha= ppy to announce the release of Lwt-canceler version 0.3. Lwt-canceler is a small library to help programs written using Lwt to = synchronise promises around resource clean-up. This library was developed as part of the Tezos codebase before being released.

With this version, the code has matured significantly (including tests, doc= umentation and some refactoring); the next release will probably be a version 1.0 at which point a more robust version= ing scheme will be used.

The documentation is available online: https://nomadic-labs.gitlab.io/lwt-canceler/lwt-canceler/= Lwt_canceler/index.html The code is released under MIT License and hosted on Gitlab: https://gitlab.com/nomadic-labs/= lwt-canceler The new version is available on opam: opam install lwt-canceler

Happy hacking!

Interesting OCaml Articles

Weng Shiwei announced

Let me share my new blog post on understanding format6 with ex= amples. https://blog.tail= .moe/2021/01/13/format6.html

It's almost my reading note for the paper Format Unraveled (on module Forma= t) and experiments on utop. I tried not to be too verbose though.

Weng Shiwei later said

Well, I made a sequel of format6 post, Understanding format6 in OCaml by diagrams https://b= log.tail.moe/2021/01/15/format6-diagram.html

This time I just use four examples with four diagrams e.g. it's the one for= Scanf.sscanf

3D"=

p.s. It's a pity that I missed Gabriel's post The 6 parameters of (=E2=80=99a, =E2=80=99b, =E2=80=99= c, =E2=80=99d, =E2=80=99e, =E2=80=99f) format6 after writing that one.

OCaml 4.12.0, first beta release

octachron announced

The release of OCaml 4.12.0 is close.

The set of new features has been stabilized, and core opam packages already work with this release. After three alpha releases, we have created a first beta version to help you adapt your software to the new features ahead of t= he release. Compared to the last alpha, this beta contains only three new bug = fixes and one change to the standard library.

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.12.0~beta1 --repositories=3Ddefault,beta=3Dgit+https:/=
/github.com/ocaml/ocaml-beta-repository.git

If you want to tweak the configuration of the compiler, you can pick config= uration options with

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.12.0~b=
eta1+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and afl enabled switch:

opam switch create 4.12.0~beta1+flambda+afl
--packages=3Docaml-variants.4.12.0~beta1+options,ocaml-option-flambda,ocaml=
-option-afl
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

All available options can be listed with "opam search ocaml-option".

The source code is available at these addresses:

If you want to test this version, you may want to install the alpha opam re= pository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-repository.git

This alpha repository contains various packages patched with fixes in the process of being upstreamed. Once the repository installed, these patched packages will take precedence over the non-patched version.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

Changes from the third alpha release

Postponed features
  • 9533, 10105, 10127 : Added String.starts_w= ith and String.ends_with. (Bernhard Schommer, review by Daniel B=C3=BCnzli,= Gabriel Scherer and Alain Frisch)
Additional bug fixes
  • 9096, 10096: fix a 4.11.0 p= erformance regression in classes/objects declared within a function (Gabrie= l Scherer, review by Leo White, report by Sacha Ayoun)
  • 10106, 10112: some expecte= d-type explanations where forgotten after some let-bindings (Gabriel Schere= r, review by Thomas Refis and Florian Angeletti, report by Daniil Baturin)<= /li>
  • 9326, 10125: Gc.set incorre= ctly handles the three custom_* fields, causing a performance = regression (report by Emilio Jes=C3=BAs Gallego Arias, analysis and fix by = Stephen Dolan, code by Xavier Leroy, review by Hugo Heuzard and Gabriel Sch= erer)

OCaml for ARM MacOS

Deep in this thread, Xavier Leroy said

It's quite easy to get up to speed using the precompiled OPAM binary for ma= cOS/ARM64.

  • Download opam-2.0.7-arm64-macos.
  • Move it to some directory in your PATH, rename it to opam,= and make it executable. From a Terminal window:
mv ~/Downloads/opam-2.0.7-arm64-macos /usr/local/bin/opam
chmod +x /usr/local/bin/opam
  • Try to execute it: opam init. You will be blocked by the = macOS security checks, as the binary is not signed.
  • Open Preferences / Security and Privacy. There should be a notice "opa= m was blocked because…" and an "Allow Anyway" button. Click on that= button.
  • Try again to execute opam init. You will be blocked again= , but now there is an "Open" button. Click on that button. opam init= should run and install the OCaml 4.10.2 compiler.
  • From now on, you can run opam without being blocked. Use = this freedom to opam install the packages you need.
  • Some packages that depend on external C libraries may fail to install b= ecause these C libraries are not available. Normally we would rely on Homeb= rew or MacPorts to provide these C libraries, but these package collections= are still being ported to macOS/ARM64.

As a reward for these minor inconveniences, you'll get excellent performanc= e running OCaml software such as Coq. Single-core performance on a MacBook Air M1 is 20% better than the best x86= workstation I have access to.

Talk on OCaml Batteries at Houston Functional Programmers

Claude Jager-Rubinson announced

@UnixJunkie will be speaking (virtually, of course) on OCaml Batteries I= ncluded at Houston Functional Programmers, this coming Wednesday, Jan 20 at 7pm (U.S. Central time). His talk will co= ver Batteries' history, place within the OCaml ecosystem, and comparisons with OCaml's other alternative standard li= braries. All are welcome to join us, even if you're not from Houston. Complete details and Zoom info are at hfpug.org.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D57C4E0029 for ; Tue, 26 Jan 2021 14:25:09 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.79,375,1602540000"; d="scan'208,217";a="371166371" Received: from clt-128-93-181-24.vpn.inria.fr (HELO set) ([128.93.181.24]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 26 Jan 2021 14:25:08 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 26 Jan 2021 14:25:08 +0100 Message-ID: <87wnvz96ff.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAxOSB0byAyNiwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSG93IHRv IGdldCBwbGVhc2FudCBkb2N1bWVudGF0aW9uIGZvciBhIGxpYnJhcnkgdXNpbmcgRHVuZT8NCkFs dC1FcmdvIDIuNC4wIHJlbGVhc2UNCkZpcnN0IHJlbGVhc2Ugb2YgQXJ0IC0gQWRhcHRpdmUgUmFk aXggVHJlZSBpbiBPQ2FtbA0KcGVyZiBkZW1hbmdsaW5nIG9mIE9DYW1sIHN5bWJvbHMgKGFuZCBh IHNob3J0IGludHJvZHVjdGlvbiB0byBwZXJmKQ0KRGVjaW1hbCAwLjIuMSAtIGFyYml0cmFyeS1w cmVjaXNpb24gZGVjaW1hbCBmbG9hdGluZyBwb2ludA0KQmFzaWMgR2l0TGFiIENJIGNvbmZpZ3Vy YXRpb24NCk9DYW1sIE9mZmljZSBIb3Vycz8NCmpzb24tZGF0YS1lbmNvZGluZyAwLjkNClZTQ29k ZSBPQ2FtbCBQbGF0Zm9ybSB2MS42LjANCnJlbGVhc2UgMC4zLjAgb2YgZHJvbSwgdGhlIE9DYW1s IHByb2plY3QgY3JlYXRvcg0KT2xkIENXTg0KDQoNCkhvdyB0byBnZXQgcGxlYXNhbnQgZG9jdW1l bnRhdGlvbiBmb3IgYSBsaWJyYXJ5IHVzaW5nIER1bmU/DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy10by1nZXQtcGxlYXNhbnQtZG9jdW1l bnRhdGlvbi1mb3ItYS1saWJyYXJ5LXVzaW5nLWR1bmUvNzEyMS8xPg0KDQoNCmdhc2NoZSBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknbSB3b3JraW5nIHRvIHB1Ymxpc2ggYSBzbWFsbCBsaWJyYXJ5IHVzaW5nIER1bmUuIFRo ZSBkb2N1bWVudGF0aW9uDQogIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIGJ5IGBkdW5lIGJ1aWxk IEBkb2MnIGxvb2tzIGZhaXJseSB1bnBsZWFzYW50DQogIHRvIG1lLCBhcyBJIGRvbid0IHNlZSBh biBlYXN5IHdheSB0byBleHBsYWluIHdoYXQgdGhlIGxpYnJhcnkgaXMNCiAgYWJvdXQuIEknbSBj cmVhdGluZyB0aGlzIHRvcGljIGluIGNhc2UgSSBhbSBtaXNzaW5nIHNvbWV0aGluZyBzaW1wbGUs DQogIGFuZCB0byBnZXQgb3RoZXIgcGVvcGxlIHRvIHNoYXJlIHRoZWlyIGxpYnJhcnktZG9jdW1l bnRhdGlvbiBwcmFjdGljZXMNCiAgb3IgZXhhbXBsZXMuDQoNCg0KUHJvYmxlbSBkZXNjcmlwdGlv bg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgRm9yIHRoZSBzYWtlIG9mIHRoZSBleGFtcGxlIGxldCdzIGltYWdpbmUgdGhhdCB0 aGUgbGlicmFyeSBpcyBjYWxsZWQNCiAgYEZvbycgYW5kIGNvbnRhaW5zIHRocmVlIG1vZHVsZXMg YEEnLCBgQicgYW5kIGBDJy4gSSdtIHVzaW5nIHRoZQ0KICBzdGFuZGFyZCBkdW5lIGFwcHJvYWNo IG9mIHdyYXBwZWQgbW9kdWxlcywgc28gSSBnZXQgdGhyZWUgY29tcGlsYXRpb24NCiAgdW5pdHMg YEZvby5BJywgYEZvby5CJywgYEZvby5DJy4gRWFjaCBtb2R1bGUgaGFzIGEgYC5tbGknIGZpbGUg d2l0aA0KICBkb2N1bWVudGF0aW9uIGNvbW1lbnRzLg0KDQogIFdoZW4gSSBydW4gYGR1bmUgYnVp bGQgQGRvYycsIGR1bmUgZ2VuZXJhdGVzIGFuIGBpbmRleC5odG1sJyBmaWxlIHdpdGgNCiAgYmFz aWNhbGx5IG5vIGNvbnRlbnQsIHBvaW50aW5nIHRvIGEgYGZvby9pbmRleC5odG1sJyBmaWxlIHdp dGgNCiAgYmFzaWNhbGx5IG5vIGNvbnRlbnQsIHBvaW50aW5nIHRvIGEgYGZvby9Gb28vaW5kZXgu aHRtbCcgbG9va2luZyBsaWtlDQogIHRoaXM6DQoNCiAgICAgICAgVXAg4oCTIGZvbyDCuyBGb28N Cg0KICAgICAgICAqTW9kdWxlIGBGb28nKg0KDQogICAgICAgIGBtb2R1bGUgQSA6IHNpZyAuLi4g ZW5kJw0KDQogICAgICAgIGBtb2R1bGUgQiA6IHNpZyAuLi4gZW5kJw0KDQogICAgICAgIGBtb2R1 bGUgQyA6IHNpZyAuLi4gZW5kJw0KDQogIEl0J3MgZWFzeSB0byBza2lwIHRoZSBmaXJzdCB0d28g cGFnZXMsIGFuZCB1c2UgdGhlIHRoaXJkIHBhZ2UgYXMgYQ0KICBsYW5kaW5nIHBhZ2UgZm9yIHRo ZSBkb2N1bWVudGF0aW9uIG9mIG15IGxpYnJhcnkuICBIb3dldmVyLCB0aGlzDQogIGxhbmRpbmcg cGFnZSBpcyBub3QgdmVyeSBwbGVhc2FudDoNCiAgMS4gSXQgc2hvdWxkIGV4cGxhaW4gd2hhdCB0 aGUgbGlicmFyeSBpcyBhYm91dC4NCiAgMi4gSXQgc2hvdWxkIGJyaWVmbHkgZGVzY3JpYmUgd2hh dCBlYWNoIG1vZHVsZSBkb2VzLCBzbyB0aGF0IHVzZXJzDQogICAgIGtub3cgd2hpY2ggbW9kdWxl IHRoZXkgd2FudCB0byBsb29rIGF0IGZpcnN0Lg0KDQogIChQb2ludCAyIGlzIGVzcGVjaWFsbHkg aW1wb3J0YW50IHdpdGggIndyYXBwZWQgbGlicmFyaWVzIiwgd2hlcmUgaXQncw0KICBub3QgbmVj ZXNzYXJpbHkgb2J2aW91cyB3aGljaCBvZiB0aGUgc2V2ZXJhbCBtb2R1bGVzIGlzIHRoZSBtYWlu IGVudHJ5DQogIHBvaW50IHdpdGggdGhlIGltcG9ydGFudCBmdW5jdGlvbnMgdG8gbG9vayBhdCBm aXJzdC4gSW4gY29tcGFyaXNvbiwgaW4NCiAgYSBkZXNpZ24gd2hlcmUgdGhlICJlbnRyeSBwb2lu dCIgaXMgaW4gdGhlIGBGb28nIG1vZHVsZSwgd2l0aCBgRm9vLkEnDQogIGFuZCBgRm9vLkInIGFz IG1vcmUgYWR2YW5jZWQgc3VibW9kdWxlcyAob3IgYEZvb19BJyBhbmQgYEZvb19CJyBpbiB0aGUN CiAgb2xkIGRheXMpIHRoZSB1c2VyIGlzIGd1aWRlZCB0byBsb29rIGF0IGBGb28nIGZpcnN0LikN Cg0KICBNeSBwcm9ibGVtIGlzOiB3aGF0IHNob3VsZCBJIGNoYW5nZSBpbiBteSBEdW5lIHNldHVw IHRvIGJlIGFibGUgdG8gZG8NCiAgdGhpcz8NCg0KICBJIGhhdmUgcmVhZCB0aGUgW2R1bmUgZG9j dW1lbnRhdGlvbiBvbiBkb2N1bWVudGF0aW9uXSwgYnV0IEkgY291bGQgbm90DQogIGZpbmQgYW4g YW5zd2VyIHRvIHRoaXMgcXVlc3Rpb24uDQoNCg0KW2R1bmUgZG9jdW1lbnRhdGlvbiBvbiBkb2N1 bWVudGF0aW9uXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvZG9jdW1l bnRhdGlvbi5odG1sPg0KDQoNClJvdWdoIGlkZWFzDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBSb3VnaGx5IEkgc2VlIHR3byB3YXlzIHRvIGdldCB3aGF0IEkgd2FudCwg dGhhdCBJIGhhdmUgbm90IHRyaWVkIHlldDoNCiAgMS4gSSBjb3VsZCB3cml0ZSBteSBvd24gbGFu ZGluZyBwYWdlIGZvciB0aGUgbGlicmFyeSBhcyBhIHNlcGFyYXRlDQogICAgIGBkb2MubWxkJyBm aWxlLCB1c2UgdGhlIGAoZG9jdW1lbnRhdGlvbiknIHN0YW56YSB0byBnZXQgaXQgaW5jbHVkZWQN CiAgICAgaW4gdGhlIGJ1aWx0IGRvY3VtZW50YXRpb24sIGFuZCB1c2UgdGhpcyBhcyB0aGUgZW50 cnkgcG9pbnQgaW50byBteQ0KICAgICBsaWJyYXJ5Lg0KICAyLiBJbiBjb3VsZCB3cml0ZSBteSBv d24gYGZvby5tbCcgbW9kdWxlIGluc3RlYWQgb2YgdXNpbmcgRHVuZSdzDQogICAgIGRlZmF1bHQg d3JhcHBlZC1tb2R1bGUgc2NhZmZvbGRpbmcsIGluc2VydGluZyBteSBvd24gYG1vZHVsZSBBID0N CiAgICAgRm9vX19BJyBhbGlhc2VzLCB3aXRoIGRvY3VtZW50YXRpb24gY29tbWVudHMgaW4gdGhl IHN0YW5kYXJkDQogICAgIHN0eWxlLiBUaGVuIEkgc3VwcG9zZSB0aGF0IGBmb28vRm9vL2luZGV4 Lmh0bWwnIHdvdWxkIGdldCB0aGlzDQogICAgIGNvbnRlbnQgaW4gdGhlIHdheSBJIGV4cGVjdC4N Cg0KICBUaGV5IGZlZWwgYSBiaXQgY29tcGxleCB0byBtZSwgYW5kICgyKSBpbnZvbHZlcyB0aGUg dGVkaW91cyB3b3JrIG9mDQogIHJlZG9pbmcgdGhlIHdyYXBwaW5nIGxvZ2ljIG15c2VsZi4gSSBn dWVzcyB0aGF0ICgxKSBpcyBub3Qgc28gYmFkLCBhbmQNCiAgSSB3b3VsZCBiZSBpbmNsaW5lZCB0 byBkbyB0aGlzIGlmIGl0IHdhcyBkb2N1bWVudGVkIHNvbWV3aGVyZSBhcyB0aGUNCiAgcmVjb21t ZW5kZWQgYXBwcm9hY2guDQoNCiAgKE1heWJlIHRoZXJlIGlzIHNvbWUgb2RvYyBvcHRpb24gdGhh dCB3b3VsZCBoZWxwIHNvbHZlIHRoaXMgcHJvYmxlbT8pDQoNCg0KRXhhbXBsZXMgZnJvbSBvdGhl ciBwZW9wbGU/DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBEbyB5b3UgaGF2ZSBhIGxp YnJhcnkgYnVpbHQgdXNpbmcgZHVuZSB3aXRoIG5pY2UgZG9jdW1lbnRhdGlvbj8gSWYgc28sDQog IGNhbiB5b3Ugc2hvdyB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgc291 cmNlcyAoaW4NCiAgcGFydGljdWxhciBkdW5lIHNldHVwKT8NCg0KDQpUaGliYXV0IE1hdHRpbyBy ZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJIHRoaW5rIHRoZSBkb2N1bWVudGF0aW9uIG9mIFtTdHJl YW1pbmddIGlzIGEgZ3JlYXQgZXhhbXBsZSBvZiB0aGUNCiAgb3B0aW9uIDEgeW91IGRlc2NyaWJl Lg0KDQogIFRoZSBjb3JyZXNwb25kaW5nIER1bmUgc2V0dXAgY2FuIGJlIGZvdW5kIFtoZXJlXQ0K DQogIFRoYXQncyBhbHNvIHRoZSBhcHByb2FjaCB3ZSB0b29rIGZvciBbT3BpdW0ncyBkb2N1bWVu dGF0aW9uXSwgYWx0aG91Z2gNCiAgdGhlIGluZGV4IHBhZ2UgaXMgY2VydGFpbmx5IG5vdCBhcyBp bXByZXNzaXZlIGFzIFN0cmVhbWluZydzLg0KDQoNCltTdHJlYW1pbmddIDxodHRwczovL29kaXMt bGFicy5naXRodWIuaW8vc3RyZWFtaW5nL3N0cmVhbWluZy9pbmRleC5odG1sPg0KDQpbaGVyZV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL21hc3Rlci9zdHJl YW1pbmcvZHVuZT4NCg0KW09waXVtJ3MgZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL3JncmluYmVy Zy5naXRodWIuaW8vb3BpdW0vb3BpdW0vaW5kZXguaHRtbD4NCg0KDQpnYXNjaGUgdGhlbiBzYWlk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGFua3MhIEl0IGxvb2tzIGxpa2UgdGhlc2Ugc3lzdGVtcyByZWx5IG9uIGFuIHVuZG9jdW1lbnRl ZCBmZWF0dXJlIG9mDQogIHRoZSBgKGRvY3VtZW50YXRpb24pJyBzdGFuemEgKG9yIG9kb2MpLCB3 aGljaCBpcyB0aGF0IGEgdXNlci1wcm92aWRlZA0KICBgaW5kZXgubWxkJyBmaWxlIHdpbGwgaW1w bGljaXRseSByZXBsYWNlIHRoZSBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZA0KICBgaW5kZXgubWxk JyBmaWxlLCBnaXZpbmcgYSByZWFzb25hYmx5IG5hdHVyYWwgcmVzdWx0Lg0KDQogIFRoZSBvcGl1 bSBkb2N1bWVudGF0aW9uIGFsc28gW3VzZXNdIHRoZSBgeyFtb2R1bGVzOiBtb2R1bGVuYW1lIC4u Ln0nDQogIG1hcmt1cCBkaXJlY3RpdmUsIHdoaWNoIGlzIGEgd2F5IHRvIGluY2x1ZGUgdGhlIG1v ZHVsZSBpbmRleCB3aXRoaW4NCiAgdGhpcyBtYW51YWxseS13cml0dGVuIGxhbmRpbmcgcGFnZSB3 aXRob3V0IGhhdmluZyB0byBkdXBsaWNhdGUgdGhlDQogIG1hcmt1cC4gU3RyZWFtaW5nwrkgdXNl cyBbaW5saW5lIGh0bWxdIGluc3RlYWQgdG8gZ2V0IGEgbmljZXItbG9va2luZw0KICByZXN1bHQs IGJ1dCBpdCBpcyB0b28gbXVjaCBlZmZvcnQuIE1heWJlIHRoZXJlIGlzIGEgYmV0dGVyIHdheSwg b3IgdGhlDQogIHRvb2xzIGNvdWxkIGJlIGltcHJvdmVkIHRvIG1ha2UgdGhpcyBlYXNpZXIuDQoN CiAgwrk6IEknbSBhc2hhbWVkIHRvIGFkbWl0IHRoYXQgSSB3YXNuJ3QgYXdhcmUgb2YgdGhpcyB2 ZXJ5IG5pY2UgbGlicmFyeQ0KICBbU3RyZWFtaW5nXSwgYW0gSSBjb25zdW1pbmcgdGhlIHdyb25n IHNvdXJjZXMgb2YgaW5mb3JtYXRpb24gb24gdGhlDQogIE9DYW1sIGVjb3N5c3RlbT8NCg0KICBG aW5hbGx5LCB0aGUgT3BpdW0gZG9jdW1lbnRhdGlvbiBtYW5pZmVzdGx5IGhhcyBhIHNob3J0IHN5 bm9wc2lzIGZvcg0KICBlYWNoIG1vZHVsZSBpbiBpdHMgbGlzdGluZywgd2hpY2ggY29ycmVzcG9u ZHMgdG8gbXkgIkl0IHNob3VsZCBicmllZmx5DQogIGRlc2NyaWJlIHdoYXQgZWFjaCBtb2R1bGUg ZG9lcyIgcmVxdWlyZW1lbnQuIEkgYmVsaWV2ZSB0aGF0IHRoaXMgY29tZXMNCiAgZnJvbSB0aGUg Zmlyc3QgbGluZSBvZiB0aGUgZmlyc3QgZG9jdW1lbnRhdGlvbiBjb21tZW50IG9mIHRoZQ0KICBt b2R1bGUuIFRoZXJlIGFyZSBtb2R1bGUtZ2xvYmFsIGRvY3VtZW50YXRpb24gY29tbWVudHMgaW4g dGhlIGxpYnJhcnkNCiAgSSdtIHdvcmtpbmcgb24sIGJ1dCB0aGV5IGRvIG5vdCBpbmNsdWRlIHN1 Y2ggZmlyc3QtbGluZSBoZWFkZXJzLg0KDQogIE9uY2UgSSBoYXZlIHRoZSBpbXByZXNzaW9uIG9m IHVuZGVyc3RhbmRpbmcgd2hhdCBpcyBhIGdvb2Qgd2F5IHRvIGRvDQogIHRoaXMsIEkgbWF5IHRy eSB0byBjb250cmlidXRlIGJldHRlciBkb2N1bWVudGF0aW9uIGluIGBkdW5lJy4NCg0KDQpbdXNl c10NCjxodHRwczovL2dpdGh1Yi5jb20vcmdyaW5iZXJnL29waXVtL2Jsb2IvMmE4OWUzNS9vcGl1 bS9kb2MvaW5kZXgubWxkI0w3Mi1MNzQ+DQoNCltpbmxpbmUgaHRtbF0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL2VlNWQ4MmEvc3RyZWFtaW5nL2luZGV4Lm1s ZCNMMzItTDY4Pg0KDQpbU3RyZWFtaW5nXSA8aHR0cHM6Ly9vZGlzLWxhYnMuZ2l0aHViLmlvL3N0 cmVhbWluZy9zdHJlYW1pbmcvaW5kZXguaHRtbD4NCg0KDQpHYWJyaWVsIFJhZGFubmUgcmVwbGll ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgSXQgbG9va3MgbGlrZSB0aGVzZSBzeXN0ZW1zIHJl bHkgb24gYW4gdW5kb2N1bWVudGVkDQogICAgICAgIGZlYXR1cmUgb2YgdGhlIGAoZG9jdW1lbnRh dGlvbiknIHN0YW56YSAob3Igb2RvYyksIHdoaWNoDQogICAgICAgIGlzIHRoYXQgYSB1c2VyLXBy b3ZpZGVkIGBpbmRleC5tbGQnIGZpbGUgd2lsbCBpbXBsaWNpdGx5DQogICAgICAgIHJlcGxhY2Ug dGhlIGF1dG9tYXRpY2FsbHktZ2VuZXJhdGVkIGBpbmRleC5tbGQnIGZpbGUsDQogICAgICAgIGdp dmluZyBhIHJlYXNvbmFibHkgbmF0dXJhbCByZXN1bHQuDQoNCiAgSSBjb25maXJtIHRoaXMgZmVh dHVyZSBpcyBoZXJlIHRvIHN0YXksIGlzIHRoZSByaWdodCBvbmUgdG8gY3VzdG9taXplDQogIHlv dXIgaW5kZXggcGFnZSwgYW5kIGluIHRoZSBmdXR1cmUgd2lsbCBiZW5lZml0IGZyb20gZ29vZCBz dXBwb3J0IGZyb20NCiAgb2RvYyBkaXJlY3RseS4NCg0KICAgICAgICBUaGUgb3BpdW0gZG9jdW1l bnRhdGlvbiBhbHNvIFt1c2VzXSB0aGUgYHshbW9kdWxlczoNCiAgICAgICAgbW9kdWxlbmFtZSAu Li59JyBtYXJrdXAgZGlyZWN0aXZlLCB3aGljaCBpcyBhIHdheSB0bw0KICAgICAgICBpbmNsdWRl IHRoZSBtb2R1bGUgaW5kZXggd2l0aGluIHRoaXMgbWFudWFsbHktd3JpdHRlbg0KICAgICAgICBs YW5kaW5nIHBhZ2Ugd2l0aG91dCBoYXZpbmcgdG8gZHVwbGljYXRlIHRoZQ0KICAgICAgICBtYXJr dXAuIFN0cmVhbWluZ8K5IHVzZXMgW2lubGluZSBodG1sXSBpbnN0ZWFkIHRvIGdldCBhDQogICAg ICAgIG5pY2VyLWxvb2tpbmcgcmVzdWx0LCBidXQgaXQgaXMgdG9vIG11Y2ggZWZmb3J0LiBNYXli ZQ0KICAgICAgICB0aGVyZSBpcyBhIGJldHRlciB3YXksIG9yIHRoZSB0b29scyBjb3VsZCBiZSBp bXByb3ZlZCB0bw0KICAgICAgICBtYWtlIHRoaXMgZWFzaWVyLg0KDQogIEkgd291bGQgc3Ryb25n bHkgYWR2aXNlIHRvIHVzZSB0aGUgYG1vZHVsZXMnIG1hcmt1cCBkaXJlY3RpdmUsIGFuZCB0bw0K ICBzdWdnZXN0cyBvdXRwdXQgaW1wcm92ZW1lbnRzIG9uIG9kb2MncyBidWcgaW5zdGVhZCBvZiBo YWNraW5nIEhUTUwNCiAgdG9nZXRoZXIuIFdlIGNvdWxkIGFic29sdXRlbHkgYWRkIHRoZSBzeW5v cHNpcyBvZiB0aGUgbW9kdWxlIGhlcmUsIGZvcg0KICBpbnN0YW5jZS4NCg0KDQpbdXNlc10NCjxo dHRwczovL2dpdGh1Yi5jb20vcmdyaW5iZXJnL29waXVtL2Jsb2IvMmE4OWUzNS9vcGl1bS9kb2Mv aW5kZXgubWxkI0w3Mi1MNzQ+DQoNCltpbmxpbmUgaHRtbF0NCjxodHRwczovL2dpdGh1Yi5jb20v b2Rpcy1sYWJzL3N0cmVhbWluZy9ibG9iL2VlNWQ4MmEvc3RyZWFtaW5nL2luZGV4Lm1sZCNMMzIt TDY4Pg0KDQoNCkRhbmllbCBCw7xuemxpIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAg ICAgd2hpY2ggaXMgdGhhdCBhIHVzZXItcHJvdmlkZWQgYGluZGV4Lm1sZCcgZmlsZSB3aWxsDQog ICAgICAgIGltcGxpY2l0bHkgcmVwbGFjZSB0aGUgYXV0b21hdGljYWxseS1nZW5lcmF0ZWQgYGlu ZGV4Lm1sZCcNCiAgICAgICAgZmlsZSwgZ2l2aW5nIGEgcmVhc29uYWJseSBuYXR1cmFsIHJlc3Vs dC4NCg0KICBUaGlzIGlzIGFsc28gdGhlIGNvcnJlY3Qgd2F5IHRvIGN1c3RvbWl6ZSB0aGUgbGFu ZGluZyBwYWdlIG9mIHlvdXINCiAgcGFja2FnZSBmb3IgYG9kaWcnIGdlbmVyYXRlZCBkb2Mgc2V0 cywgc2VlIFtoZXJlXSBmb3IgbW9yZQ0KICBpbmZvcm1hdGlvbi4NCg0KICAgICAgICBJIGNvbmZp cm0gdGhpcyBmZWF0dXJlIGlzIGhlcmUgdG8gc3RheSwgaXMgdGhlIHJpZ2h0IG9uZQ0KICAgICAg ICB0byBjdXN0b21pemUgeW91ciBpbmRleCBwYWdlLCBhbmQgaW4gdGhlIGZ1dHVyZSB3aWxsDQog ICAgICAgIGJlbmVmaXQgZnJvbSBnb29kIHN1cHBvcnQgZnJvbSBvZG9jIGRpcmVjdGx5Lg0KDQog IFRoZXJlJ3MgYW4gb3BlbiBpc3N1ZSBhYm91dCB0aGF0IFtoZXJlXS4NCg0KDQpbaGVyZV0NCjxo dHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9vZGlnL2RvYy9wYWNrYWdpbmcuaHRtbCNvZG9j X2FwaV9hbmRfbWFudWFsPg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9j L2lzc3Vlcy8yOTc+DQoNCg0KQWx0LUVyZ28gMi40LjAgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYWx0LWVyZ28tMi00 LTAtcmVsZWFzZS83MTM0LzE+DQoNCg0KT0NhbWxQcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxl YXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIEFsdC1FcmdvIQ0KDQogIEFsdC1Fcmdv IDIuNC4wIGlzIG5vdyBhdmFpbGFibGUgZnJvbSBbQWx0LUVyZ2/igJlzIHdlYnNpdGVdLiBBbg0K ICBhc3NvY2lhdGVkIG9wYW0gcGFja2FnZSB3aWxsIGJlIHB1Ymxpc2hlZCBpbiB0aGUgbmV4dCBm ZXcgZGF5cy4NCg0KICBUaGlzIHJlbGVhc2UgY29udGFpbnMgc29tZSBtYWpvciBub3ZlbHRpZXM6 DQoNCiAg4oCiIEFsdC1FcmdvIHN1cHBvcnRzIGluY3JlbWVudGFsIGNvbW1hbmRzIChwdXNoL3Bv cCkgZnJvbSB0aGVbIHNtdC1saWJdDQogICAgc3RhbmRhcmQuDQogIOKAoiBXZSBzd2l0Y2hlZCBj b21tYW5kIGxpbmUgcGFyc2luZyB0byB1c2VbIGNtZGxpbmVyXS4gWW91IHdpbGwgbmVlZCB0bw0K ICAgIHVzZSDigJM8b3B0aW9uIG5hbWU+IGluc3RlYWQgb2YgLTxvcHRpb24gbmFtZT4uIFNvbWUg b3B0aW9ucyBoYXZlIGFsc28NCiAgICBiZWVuIHJlbmFtZWQsIHNlZSB0aGUgbWFucGFnZSBvciB0 aGUgZG9jdW1lbnRhdGlvbi4NCiAg4oCiIFdlIGltcHJvdmVkIHRoZSBvbmxpbmUgZG9jdW1lbnRh dGlvbiBvZiB5b3VyIHNvbHZlciwgYXZhaWxhYmxlWw0KICAgIGhlcmVdLg0KDQogIFRoaXMgcmVs ZWFzZSBhbHNvIGNvbnRhaW5zIHNvbWUgbWlub3Igbm92ZWx0aWVzOg0KDQogIOKAoiAubWx3IGFu ZCAud2h5IGV4dGVuc2lvbiBhcmUgZGVwcmVjaWF0ZWQsIHRoZSB1c2Ugb2YgLmFlIGV4dGVuc2lv biBpcw0KICAgIGFkdmlzZWQuDQogIOKAoiBBZGQg4oCTaW5wdXQgKHJlc3Ag4oCTb3V0cHV0KSBv cHRpb24gdG8gbWFudWFsbHkgc2V0IHRoZSBpbnB1dCAocmVzcA0KICAgIG91dHB1dCkgZmlsZSBm b3JtYXQNCiAg4oCiIEFkZCDigJNwcmV0dHktb3V0cHV0IG9wdGlvbiB0byBhZGQgYmV0dGVyIGRl YnVnIGZvcm1hdHRpbmcgYW5kIHRvIGFkZA0KICAgIGNvbG9ycw0KICDigKIgQWRkIGV4cG9uZW50 aWF0aW9uIG9wZXJhdGlvbiwgKiogaW4gbmF0aXZlIEFsdC1FcmdvIHN5bnRheC4gVGhlDQogICAg b3BlcmF0b3IgaXMgZnVsbHkgaW50ZXJwcmV0ZWQgd2hlbiBhcHBsaWVkIHRvIGNvbnN0YW50cw0K ICDigKIgRml4IOKAk3N0ZXBzLWNvdW50IGFuZCBpbXByb3ZlIHRoZSB3YXkgc3RlcHMgYXJlIGNv dW50ZWQgKEFkYUNvcmUNCiAgICBjb250cmlidXRpb24pDQogIOKAoiBBZGQg4oCTaW5zdGFudGlh dGlvbi1oZXVyaXN0aWMgb3B0aW9uIHRoYXQgY2FuIGVuYWJsZSBsaWdodGVyIG9yDQogICAgaGVh dmllciBpbnN0YW50aWF0aW9uDQogIOKAoiBSZWR1Y2UgdGhlIGluc3RhbnRpYXRpb24gY29udGV4 dCAoY29uc2lkZXJlZCBmb3JhbGxzIC8gZXhpc3RzKSBpbg0KICAgIENEQ0wtVGFibGVhdXggdG8g YmV0dGVyIG1pbWljIHRoZSBUYWJsZWF1eC1saWtlIFNBVCBzb2x2ZXINCiAg4oCiIE11bHRpcGxl IGJ1Z2ZpeGVzDQoNCiAgVGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIGlzIGF2YWlsYWJsZSBbaGVy ZV0uIEFzIHVzdWFsLCBkbyBub3QNCiAgaGVzaXRhdGUgdG8gcmVwb3J0IGJ1Z3MsIHRvIGFzayBx dWVzdGlvbnMsIG9yIHRvIGdpdmUgeW91ciBmZWVkYmFjayENCg0KDQpbQWx0LUVyZ2/igJlzIHdl YnNpdGVdIDxodHRwczovL2FsdC1lcmdvLm9jYW1scHJvLmNvbS8+DQoNClsgc210LWxpYl0gPGh0 dHBzOi8vc210bGliLmNzLnVpb3dhLmVkdS8+DQoNClsgY21kbGluZXJdIDxodHRwczovL2VycmF0 aXF1ZS5jaC9zb2Z0d2FyZS9jbWRsaW5lcj4NCg0KWyBoZXJlXSA8aHR0cHM6Ly9vY2FtbHByby5n aXRodWIuaW8vYWx0LWVyZ28vPg0KDQpbaGVyZV0gPGh0dHBzOi8vb2NhbWxwcm8uZ2l0aHViLmlv L2FsdC1lcmdvL0Fib3V0L2NoYW5nZXMuaHRtbD4NCg0KDQpGaXJzdCByZWxlYXNlIG9mIEFydCAt IEFkYXB0aXZlIFJhZGl4IFRyZWUgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtYXJ0LWFkYXB0aXZlLXJhZGl4LXRyZWUtaW4tb2NhbWwv NzE0Mi8xPg0KDQoNCkNhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJJ20gZ2xhZCB0byBhbm5vdW5jZSB0aGUgZmlyc3QgcmVs ZWFzZSBvZiBbYGFydCddLCBhbiBpbXBsZW1lbnRhdGlvbg0KICBvZiBbdGhlIEFkYXB0aXZlIFJh ZGl4IFRyZWVdIGluIE9DYW1sLiBUaGUgZ29hbCBvZiB0aGlzIGxpYnJhcnkgaXMgdG8NCiAgcHJv dmlkZSBhIGRhdGEtc3RydWN0dXJlIHN1Y2ggYXMgYE1hcC5TJyAoYW5kIGtlZXAgdGhlIG9yZGVy KSB3aXRoDQogIHBlcmZvcm1hbmNlcyBvZiBgSGFzaHRibC50Jy4NCg0KDQpbYGFydCddIDxodHRw czovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydD4NCg0KW3RoZSBBZGFwdGl2ZSBSYWRpeCBUcmVl XSA8aHR0cHM6Ly9kYi5pbi50dW0uZGUvfmxlaXMvcGFwZXJzL0FSVC5wZGY+DQoNClBlcmZvcm1h bmNlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgYGFydCcgdXNl cyBbQmVjaGFtZWxdIGFzIGEgdG9vbCBmb3IgbWljcm8tYmVuY2htYXJraW5nIGFuZCBpdCBjb21w YXJlcw0KICBwZXJmb3JtYW5jZXMgYWJvdXQgW2luc2VydGlvbl0gYW5kIFtsb29rdXBdLiBBcyB5 b3UgY2FuIHNlZSwgYWJvdXQNCiAgaW5zZXJ0aW9uLCBgYXJ0JyBpcyBkZWZpbml0ZWx5IG1vcmUg ZmFzdCB0aGFuIGBIYXNodGJsLnQnLg0KDQogIEZvciB0aGUgX2xvb2t1cF8gb3BlcmF0aW9uLCB3 ZSBhcmUgc2xpZ2h0bHkgbW9yZSBmYXN0IHRoYW4gdGhlDQogIGBIYXNodGJsLnQnLiBUaGUgbWFp biBhZHZhbnRhZ2UgY29tcGFyaW5nIHRvIGBIYXNodGJsLnQnIGlzIHRoZQ0KICBhYmlsaXR5IHRv IHVzZSBgbWF4aW11bX4vfm1pbmltdW0nIG9yIHRvIGBpdGVyJyBvdmVyIHRoZSB3aG9sZQ0KICBk YXRhLXN0cnVjdHVyZSB3aXRoIGEgY2VydGFpbiBvcmRlci4NCg0KICBPbiBkZXRhaWxzLCBiZW5j aG1hcmtzIHVzZSBhIG5vcm1hbCBkaXN0cmlidXRpb24gb2YgYHN0cmluZ3MnIGFib3V0DQogIHRo ZWlyIGxlbmd0aHMuIEFzIGEgcHJhY3RpY2FsIGV4YW1wbGUgd2hlcmUgYGFydCcgd2lsbCBiZSBi ZXR0ZXIgdGhhbg0KICBgSGFzaHRibC50JyBpcyB3aGVuIHlvdSB3YW50IHRvIF9pbmRleF8gc2V2 ZXJhbCB3b3JkcyAoc3VjaCBhcyBlbWFpbA0KICBhZGRyZXNzZXMpLg0KDQoNCltCZWNoYW1lbF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvYmVjaGFtZWw+DQoNCltpbnNlcnRpb25dIDxodHRw czovL2Rpbm9zYXVyZS5naXRodWIuaW8vYXJ0L2JlbmNoL2luc2VydC5odG1sPg0KDQpbbG9va3Vw XSA8aHR0cHM6Ly9kaW5vc2F1cmUuZ2l0aHViLmlvL2FydC9iZW5jaC9maW5kLmh0bWw+DQoNCg0K VGVzdHMNCuKVjOKVjOKVjOKVjOKVjA0KDQogIE9mIGNvdXJzZSwgdGhlIGxpYnJhcnkgcHJvdmlk ZSBbYSBmdXp6ZXJdIGFuZCB0ZXN0cyBoYXZlIGEgY292ZXJhZ2UNCiAgb2Y6IDkxLjkzICUNCg0K DQpbYSBmdXp6ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydC9ibG9iL21hc3Rl ci9mdXp6L2Z1enoubWw+DQoNCg0KUmVhZCBPcHRpbWl6ZWQgV3JpdGUgRXhjbHVzaW9uIC0gUk9X RVgNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIEV2ZW4gaWYgaXQncyBub3QgYSBwYXJ0IG9mIHRoZSBwYWNrYWdlLCB0aGUgZGlz dHJpYnV0aW9uIGNvbWVzIHdpdGgNCiAgX2xvY2stZnJlZV8gaW1wbGVtZW50YXRpb24gb2YgYGFy dCc6IGByb3dleCcuICBUaGlzIGltcGxlbWVudGF0aW9uDQogIGNvbWVzIGZyb20gW2EgcmVzZWFy Y2ggcGFwZXJdIGFib3V0IGRhdGEtc3RydWN0dXJlIGFuZCBhdG9taWMNCiAgb3BlcmF0aW9ucy4N Cg0KICBST1dFWCBwcm92aWRlcyBhIF9wZXJzaXN0ZW50XyBpbXBsZW1lbnRhdGlvbiB3aGljaCBt YW5pcHVsYXRlcyBhIGZpbGUNCiAgdG8gc3RvcmUgdGhlIHdob2xlIGRhdGEtc3RydWN0dXJlLiBU aGUgZ29hbCBpcyB0byBwcm92aWRlIGFuIF9pbmRleGVyXw0KICBmcmVlIHRvIGJlIG1hbmlwdWxh dGVkIGJ5IHNldmVyYWwgcHJvY2Vzc2VzIGluIHBhcmFsbGVsLg0KDQogIEN1cnJlbnRseSwgdGhl IGltcGxlbWVudGF0aW9uIG9mIFJPV0VYIGluIE9DYW1sIGlzIG5vdCB3ZWxsLXRlc3RlZCBhbmQN CiAgaXQgaXMgbm8gZGlzdHJpYnV0ZWQuIEl0IGRvZXMgbm90IHRha2UgdGhlIGFkdmFudGFnZSBv Zg0KICBbb2NhbWwtbXVsdGljb3JlXSAoYnV0IGl0IHNob3VsZCkgYnV0IG91dGNvbWVzIGFyZSBn b29kIGFuZCB0aGUNCiAgZGV2ZWxvcG1lbnQgd2lsbCBiZSBtb3JlIGZvY3VzIG9uIHRoaXMgcGFy dC4NCg0KICBTbyBmZWVsIGZyZWUgdG8gcGxheSB3aXRoIGl0IGEgYml0IDorMTouDQoNCg0KW2Eg cmVzZWFyY2ggcGFwZXJdIDxodHRwczovL2RiLmluLnR1bS5kZS9+bGVpcy9wYXBlcnMvYXJ0c3lu Yy5wZGY+DQoNCltvY2FtbC1tdWx0aWNvcmVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL29jYW1sLW11bHRpY29yZT4NCg0KDQpwZXJmIGRlbWFuZ2xpbmcgb2YgT0NhbWwgc3lt Ym9scyAoYW5kIGEgc2hvcnQgaW50cm9kdWN0aW9uIHRvIHBlcmYpDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1wZXJmLWRlbWFuZ2xpbmctb2Ytb2NhbWwtc3ltYm9scy1hLXNob3J0LWludHJvZHVj dGlvbi10by1wZXJmLzcxNDMvMT4NCg0KDQpGYWJpYW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBcyBhIHByb2plY3Qgc3Bv bnNvcmVkIGJ5IHRoZSBbT0NhbWwgc29mdHdhcmUgZm91bmRhdGlvbl0sIEkndmUgd29ya2VkDQog IG9uIGRlbWFuZ2xpbmcgT0NhbWwgc3ltYm9scyBpbiBbcGVyZl0uIFNvbWUgc2NyZWVuc2hvdHMg YXJlIGJlbG93LiBUaGUNCiAgd29yayBpcyBjdXJyZW50bHkgYmVpbmcgdXBzdHJlYW1lZC4gSW4g dGhlIG1lYW50aW1lLCBpdCBjYW4gYmUgdXNlZCBhcw0KICBmb2xsb3dzOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgZ2l0IGNsb25lIC0tZGVwdGg9MSBodHRwczovL2dpdGh1Yi5jb20vY29w eS9saW51eC5naXQNCiAg4pSCICMgb3I6DQogIOKUgiAjIHdnZXQgaHR0cHM6Ly9naXRodWIuY29t L2NvcHkvbGludXgvYXJjaGl2ZS9tYXN0ZXIudGFyLmd6ICYmIHRhciB4ZnYgbWFzdGVyLnRhci5n eg0KICDilIIgY2QgbGludXgvdG9vbHMvcGVyZg0KICDilIIgbWFrZQ0KICDilIIgYWxpYXMgcGVy Zj0kUFdEL3BlcmYNCiAg4pSCICMgb3IgY29weSBwZXJmIHRvIHNvbWV3aGVyZSBpbiB5b3VyIFBB VEgNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgWW91ciBkaXN0cmlidXRpb24ncyB2ZXJzaW9uIG9m IHBlcmYgd2lsbCBhbHNvIHdvcmsgZm9yIHRoZSBleGFtcGxlcw0KICBiZWxvdywgYnV0IHdpbGwg aGF2ZSBsZXNzIHJlYWRhYmxlIHN5bWJvbHMgOi0pDQoNCg0KW09DYW1sIHNvZnR3YXJlIGZvdW5k YXRpb25dIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNCltwZXJmXSA8aHR0cHM6Ly9wZXJmLndp a2kua2VybmVsLm9yZy9pbmRleC5waHAvTWFpbl9QYWdlPg0KDQpTaG9ydCBpbnRydWN0aW9uIHRv IHBlcmYNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBlcmYgaXMgYSBMaW51eC1vbmx5IHNhbXBsaW5n IHByb2ZpbGVyIChhbmQgbW9yZSksIHdoaWNoIGNhbiBiZSB1c2VkDQogIHRvIGFuYWx5c2UgdGhl IHBlcmZvcm1hbmNlIHByb2ZpbGUgb2YgT0NhbWwgYW5kIG90aGVyDQogIGV4ZWN1dGFibGVzLiBX aGVuIGNvbXBpbGluZyB3aXRoIG9jYW1sb3B0LCBhZGQgYC1nJyB0byBpbmNsdWRlIGRlYnVnDQog IGluZm9ybWF0aW9uIGluIHRoZSBleGVjdXRhYmxlLiBkdW5lIGRvZXMgdGhpcyBhdXRvbWF0aWNh bGx5LCBldmVuIGluDQogIHRoZSByZWxlYXNlIHByb2ZpbGUuIFRvIHN0YXJ0IGEgcHJvZ3JhbSBh bmQgcmVjb3JkIGl0cyBwcm9maWxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHBlcmYgcmVj b3JkIC0tY2FsbC1ncmFwaCBkd2FyZiBwcm9ncmFtLmV4ZQ0KICDilJTilIDilIDilIDilIANCiAg T3IgcmVjb3JkIGEgcnVubmluZyBwcm9ncmFtOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHBl cmYgcmVjb3JkIC0tY2FsbC1ncmFwaCBkd2FyZiAtcCBgcGlkb2YgcHJvZ3JhbS5leGVgDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIFRoZW4sIHZpZXcgYSBwcm9maWxlIHVzaW5nOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIHBlcmYgcmVwb3J0ICMgdG9wLWRvd24NCiAg4pSCIHBlcmYgcmVwb3J0 IC0tbm8tY2hpbGRyZW4gIyBib3R0b20tdXANCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgV2l0aGlu IHRoZSByZXBvcnQgdmlldywgdGhlIGZvbGxvd2luZyBrZXliaW5kaW5ncyBhcmUgdXNlZnVsOg0K DQogIOKAoiBgKyc6IG9wZW4vY2xvc2Ugb25lIGNhbGxjaGFpbiBsZXZlbA0KICDigKIgYGUnOiBv cGVuL2Nsb3NlIGVudGlyZSBjYWxsY2hhaW4NCiAg4oCiIGB0JzogVG9nZ2xlIGJld2VlbiBjdXJy ZW50IHRocmVhZCBhbmQgYWxsIHRocmVhZHMgKGUuZy4sIG9ubHkNCiAgICBgZHVuZScsIGBvY2Ft bG9wdCcsIGV0Yy4pDQoNCiAgT3IgZ2VuZXJhdGUgYSBmbGFtZWdyYXBoOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgZ2l0IGNsb25lIGh0dHBzOi8vZ2l0aHViLmNvbS9icmVuZGFuZ3JlZ2cv RmxhbWVHcmFwaA0KICDilIIgY2QgRmxhbWVHcmFwaA0KICDilIIgcGVyZiBzY3JpcHQgLWkgcGF0 aC90by9wZXJmLmRhdGEgfCAuL3N0YWNrY29sbGFwc2UtcGVyZi5wbCB8IC4vZmxhbWVncmFwaC5w bCA+IHBlcmYtZmxhbWVncmFwaC5zdmcNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgWW91IG1heSBu ZWVkIHRvIHJ1biB0aGUgZm9sbG93aW5nIGNvbW1hbmQgdG8gYWxsb3cgcmVjb3JkaW5nIGJ5DQog IG5vbi1yb290IHVzZXJzIChbbW9yZSBpbmZvc10pOg0KICDilIzilIDilIDilIDilIANCiAg4pSC IGVjaG8gMCB8IHN1ZG8gdGVlIC9wcm9jL3N5cy9rZXJuZWwvcGVyZl9ldmVudF9wYXJhbm9pZA0K ICDilJTilIDilIDilIDilIANCg0KDQpbbW9yZSBpbmZvc10NCjxodHRwczovL3d3dy5rZXJuZWwu b3JnL2RvYy9odG1sL2xhdGVzdC9hZG1pbi1ndWlkZS9wZXJmLXNlY3VyaXR5Lmh0bWwjdW5wcml2 aWxlZ2VkLXVzZXJzPg0KDQoNClNvdXJjZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKA oiBbUHJvZmlsaW5nIE9DYW1sIGNvZGVdDQogIOKAoiA8aHR0cHM6Ly9wZXJmLndpa2kua2VybmVs Lm9yZy9pbmRleC5waHAvVHV0b3JpYWwjU2FtcGxpbmdfd2l0aF9wZXJmX3JlY29yZD4NCiAg4oCi IDxodHRwOi8vd3d3LmJyZW5kYW5ncmVnZy5jb20vcGVyZi5odG1sI0ZsYW1lR3JhcGhzPg0KDQog IEJlZm9yZToNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEv dXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvOS85NTQzMzg2OWU0ZDU1YzZjODIyYTA5NmE5MDE0 ODMzMDRkNDQzMzhkXzJfMTM4MHg2MDIucG5nPg0KDQogIEFmdGVyOg0KDQogIDxodHRwczovL2F3 czEuZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8y WC8zLzNiZjg0N2VhMjM2MDg5NzM2NDQxNzU5MjdlMDlkNGQwMzlhYjcyMGVfMl8xMzgweDYwMi5w bmc+DQoNCiAgQm90dG9tLXVwOg0KDQogIDxodHRwczovL2F3czEuZGlzY291cnNlLWNkbi5jb20v c3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC8wLzAxMDQyNjYzY2NmNjZlOGI5 NTU3MjNmYWUzY2QxYzZmZjllMGIwMjlfMl8xMzgweDYwMi5wbmc+DQoNCiAgRmxhbWVncmFwaCAo Y3JvcHBlZCk6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDEx L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2MvYzhlM2UwZjViOWUxZDg3OTE5ODg5MjM5NTUy OWViYjNjMzM5Yzc5MV8yXzEzODB4NjAyLnBuZz4NCg0KDQpbUHJvZmlsaW5nIE9DYW1sIGNvZGVd DQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWJlbmNoL25vdGVzL2Jsb2IvbWFzdGVyL3Byb2Zp bGluZ19ub3Rlcy5tZD4NCg0KDQpEZWNpbWFsIDAuMi4xIC0gYXJiaXRyYXJ5LXByZWNpc2lvbiBk ZWNpbWFsIGZsb2F0aW5nIHBvaW50DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2RlY2ltYWwtMC0yLTEtYXJiaXRyYXJ5LXByZWNpc2lvbi1kZWNpbWFs LWZsb2F0aW5nLXBvaW50LzcxNDQvMT4NCg0KDQpZYXdhciBBbWluIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSGFwcHkgdG8gYW5ub3VuY2UgdGhhdCBgZGVjaW1hbCcgMC4yLjEgaGFzIGJlZW4gW3B1Ymlz aGVkIG9uIG9wYW1dLg0KDQogIGBkZWNpbWFsJyBpcyBhIHBvcnQgb2YgW1B5dGhvbidzIGBkZWNp bWFsJyBtb2R1bGVdIHRvIE9DYW1sIGFuZA0KICBpbXBsZW1lbnRzIHRoZSBbR2VuZXJhbCBEZWNp bWFsIEFyaXRobWV0aWMgU3BlY2lmaWNhdGlvbl0uIEhvd2V2ZXINCiAgbm90ZSB0aGF0IGl0IGlz IGEgcG9ydCBpbiBwcm9ncmVzc+KAk2Jhc2ljIGFyaXRobWV0aWMgYW5kIHJvdW5kaW5nDQogIGZ1 bmN0aW9ucyBoYXZlIGJlZW4gcG9ydGVkLCBidXQgSSBhbSBzdGlsbCB3b3JraW5nIG9uIHBvd2Vy cyBhbmQNCiAgbG9ncy4gVGhlIHBvcnRlZCBmdW5jdGlvbnMgcGFzcyB0aGUgc2FtZSB1bml0IHRl c3Qgc3VpdGUgdGhhdCB0aGUNCiAgUHl0aG9uIHZlcnNpb24gZG9lcyAod2l0aCBzb21lIG1pbm9y IG1vZGlmaWNhdGlvbnMpLg0KDQogIEFub3RoZXIgY2F2ZWF0OiBjdXJyZW50bHkgdGhlIGxpYnJh cnkgaXMgb25seSBzdXBwb3J0ZWQgb24gNjQtYml0DQogIGFyY2hpdGVjdHVyZXMgZHVlIHRvIChl eHBvbmVudCkgb3ZlcmZsb3cgaXNzdWVzIG9uIDMyLWJpdC4gSWYgYW55b25lDQogIGlzIHdpbGxp bmcgdG8gdGVzdCBhbmQgZml4IG92ZXJmbG93cyBvbiAzMi1iaXQsIEkgYW0gbW9yZSB0aGFuIGhh cHB5DQogIHRvIGFjY2VwdCBQUnMuDQoNCiAgSGVyZSdzIGFuIGV4YW1wbGUgb2YgdXNpbmcgdGhl IG1vZHVsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICgqIFJvc2V0dGEgQ29kZSBDdXJy ZW5jeSBFeGFtcGxlICopDQogIOKUgiANCiAg4pSCICgqIERlbW8gcHVycG9zZXMsIG5vcm1hbGx5 IHlvdSdkIHByZWZpeCBtb2R1bGUgbmFtZSBvciBsb2NhbCBvcGVuICopDQogIOKUgiBvcGVuIERl Y2ltYWwNCiAg4pSCIA0KICDilIIgbGV0IGhhbWJ1cmdlcl9xdHkgPSBvZl9zdHJpbmcgIjRfMDAw XzAwMF8wMDBfMDAwXzAwMCINCiAg4pSCIGxldCBoYW1idXJnZXJfYW10ID0gb2Zfc3RyaW5nICI1 LjUwIg0KICDilIIgbGV0IG1pbGtzaGFrZV9xdHkgPSBvZl9pbnQgMg0KICDilIIgbGV0IG1pbGtz aGFrZV9hbXQgPSBvZl9zdHJpbmcgIjIuODYiDQogIOKUgiANCiAg4pSCICgqIFNob3J0Y3V0IHRv IGRpdmlkZSA3LjY1IGJ5IDEwMCAqKQ0KICDilIIgbGV0IHRheF9yYXRlID0gb2Zfc3RyaW5nICI3 LjY1ZS0yIg0KICDilIIgDQogIOKUgiBsZXQgc3VidG90YWwgPSBoYW1idXJnZXJfcXR5ICogaGFt YnVyZ2VyX2FtdCArIG1pbGtzaGFrZV9xdHkgKiBtaWxrc2hha2VfYW10DQogIOKUgiBsZXQgdGF4 ID0gcm91bmQgfm46MiAoc3VidG90YWwgKiB0YXhfcmF0ZSkNCiAg4pSCIGxldCB0b3RhbCA9IHN1 YnRvdGFsICsgdGF4DQogIOKUgiANCiAg4pSCIGxldCAoKSA9IEZvcm1hdC5wcmludGYgIlN1YnRv dGFsOiAlYQ0KICDilIIgICAgICBUYXg6ICAlYQ0KICDilIIgICAgVG90YWw6ICVhXG4iIHBwIHN1 YnRvdGFsIHBwIHRheCBwcCB0b3RhbA0KICDilJTilIDilIDilIDilIANCg0KICBZb3UgY2FuIGdl dCB0aGUgcGFja2FnZSB3aXRoOiBgb3BhbSBpbnN0YWxsIGRlY2ltYWwnLiBNaW5pbXVtIE9DYW1s DQogIHZlcnNpb24gNC4wOC4NCg0KDQpbcHViaXNoZWQgb24gb3BhbV0gPGh0dHA6Ly9vcGFtLm9j YW1sLm9yZy9wYWNrYWdlcy9kZWNpbWFsLz4NCg0KW1B5dGhvbidzIGBkZWNpbWFsJyBtb2R1bGVd DQo8aHR0cHM6Ly9kb2NzLnB5dGhvbi5vcmcvMy9saWJyYXJ5L2RlY2ltYWwuaHRtbD4NCg0KW0dl bmVyYWwgRGVjaW1hbCBBcml0aG1ldGljIFNwZWNpZmljYXRpb25dDQo8aHR0cDovL3NwZWxlb3Ry b3ZlLmNvbS9kZWNpbWFsL2RlY2FyaXRoLmh0bWw+DQoNCg0KQmFzaWMgR2l0TGFiIENJIGNvbmZp Z3VyYXRpb24NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmFzaWMtZ2l0bGFiLWNpLWNvbmZpZ3VyYXRp b24vMzMyNy8yNT4NCg0KDQpnYXNjaGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBZnRlciBhIGxvbmcgY2ktZ29sZmluZyBh ZHZlbnR1cmUgKDgzIHRlc3RzKSwgSSBnb3QgYSBgLmdpdGxhYi1jaS55bWwnDQogIGZpbGUgdGhh dCBJIHRoaW5rIGlzIHJldXNhYmxlIGFuZCB1c2VmdWwgZm9yIHNtYWxsIHByb2plY3RzIC8NCiAg bGlicmFyaWVzOg0KICDigKIgcHJvamVjdDogPGh0dHBzOi8vZ2l0bGFiLmNvbS9nYXNjaGUvZ2l0 bGFiLW9jYW1sLWNpLWV4YW1wbGU+DQogIOKAoiBjb25maWd1cmF0aW9uIGZpbGU6DQogICAgPGh0 dHBzOi8vZ2l0bGFiLmNvbS9nYXNjaGUvZ2l0bGFiLW9jYW1sLWNpLWV4YW1wbGUvLS9ibG9iL21h aW4vLmdpdGxhYi1jaS55bWw+DQoNCiAgRmVhdHVyZXM6DQogIOKAoiBJdCBpcyBwcm9qZWN0LWFn bm9zdGljLCBzbyBpdCBzaG91bGQgd29yayB1bmNoYW5nZWQgZm9yIHlvdXIgb3duDQogICAgKHNp bXBsZSkgcHJvamVjdHMuDQogIOKAoiBJdCBjYWNoZXMgdGhlIG9wYW0gZGVwZW5kZW5jaWVzLg0K ICDigKIgSXQgYnVpbGRzIHRoZSBwcm9qZWN0LCBydW5zIHRoZSB0ZXN0cyBhbmQgYnVpbGRzIHRo ZSBkb2N1bWVudGF0aW9uLg0KICDigKIgU2V2ZXJhbCBjb21waWxlciB2ZXJzaW9ucyBjYW4gYmUg dGVzdGVkIGluIHBhcmFsbGVsLg0KICDigKIgSXQgcHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gdXBs b2FkIHRoZSBkb2N1bWVudGF0aW9uIGFzICJHaXRsYWINCiAgICBwcm9qZWN0IFBhZ2VzIi4NCg0K ICBDSSB0aW1lcyBhcmUgc2F0aXNmeWluZzogb24gdmVyeSBzbWFsbCBsaWJyYXJpZXMgSSBvYnNl cnZlIGEgMTFtbiBqb2INCiAgdGltZSBvbiB0aGUgZmlyc3QgcnVuIChvciB3aGVuIGNsZWFuaW5n IHRoZSBvcGFtIGNhY2hlKSwgYW5kIDJtbiBqb2INCiAgdGltZSBvbiBmb2xsb3dpbmcgcnVucy4N Cg0KICBUaGUgZXhwZWN0ZWQgdXNhZ2UtbW9kZSBvZiB0aGlzIENJIGNvbmZpZ3VyYXRpb24gaXMg dGhhdCB5b3UgY29weSBpdA0KICBpbiB5b3VyIG93biBwcm9qZWN0LiBJZiB5b3UgZmluZCB0aGF0 IHlvdSBuZWVkL3dhbnQgYWRkaXRpb25hbA0KICBmZWF0dXJlcywgaWRlYWxseSB5b3Ugd291bGQg dHJ5IHRvIHdyaXRlIHRoZW0gaW4gYSBwcm9qZWN0LWFnb25pc3RpYw0KICB3YXkgYW5kIGNvbnRy aWJ1dGUgdGhlbSBiYWNrIHRvIHRoZSBleGFtcGxlIHJlcG9zaXRvcnkuDQoNCiAgVGhpcyBjb25m aWd1cmF0aW9uIGRvZXMgbm90IHVzZSBAc21vbmRldCdzIHRyaWNrIG9mIGdlbmVyYXRpbmcgYQ0K ICBkb2NrZXIgaW1hZ2Ugb24gdGhlIGZseS4gSSB0aGluayB0aGlzIHdvdWxkIGJlIGFuIGV4Y2Vs bGVudCBpZGVhIHRvDQogIGdldCBtb3JlIHJlbGlhYmxlIGNhY2hpbmcsIGJ1dCBpdCBpcyB0b28g Y29tcGxleCBmb3IgbWUgYW5kIEkgZG9uJ3QNCiAgc2VlIGhvdyB0byBkbyBpdCBpbiBhIG1haW50 YWluYWJsZSBhbmQgcHJvamVjdC1hZ25vc3RpYyB3YXkuDQoNCg0KQ3VycmVudCBzdGF0dXMNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkgd3JvdGUgdGhp cyBDSSBjb25maWd1cmF0aW9uIG92ZXIgdGhlIHdlZWstZW5kLCBhbmQgaGF2ZSBub3QgdXNlZCBp dA0KICBtdWNoLiBJIGV4cGVjdCBpdCB0byBrZWVwIGV2b2x2aW5nIHNvbWV3aGF0IGJlZm9yZSBp dA0KICBzdGFiaWxpemVzLiBGZWVkYmFjayBmcm9tIG90aGVyIHBlb3BsZSB0cnlpbmcgdG8gdXNl IHRoZSBjb25maWd1cmF0aW9uDQogIHdvdWxkIGJlIHdhcm1seSB3ZWxjb21lLg0KDQoNCkFzaWRl IG9uIGBfYnVpbGQnIGNhY2hpbmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkgYWxzbyBpbXBs ZW1lbnRlZCBjYWNoaW5nIG9mIGR1bmUncyBgX2J1aWxkJyBkYXRhLCBpbnNwaXJlZCBieSB0aGUN CiAgW2RhdGEtZW5jb2RpbmddIGV4YW1wbGUgb2YgQHJhcGhhZWwtcHJvdXN0LiBJIGRvbid0IG5l ZWQgaXQgZm9yIG15DQogIHNtYWxsIHByb2plY3RzIChkdW5lIGJ1aWxkIGlzIDNzLCBjb21wYXJl ZCB0byAxbSBzZXR0aW5nIHVwIHRoZSBEb2NrZXINCiAgaW1hZ2UpLCBidXQgSSB0aG91Z2h0IGl0 IHdvdWxkIG1ha2UgdGhlIENJIGNvbmZpZ3VyYXRpb24gc2NhbGUgYmV0dGVyDQogIHRvIGxhcmdl ciBwcm9qZWN0cy4NCg0KICBXaGVuIEkgdGVzdGVkIHRoaXMgQ0kgY29uZmlndXJhdGlvbiwgSSBk aXNjb3ZlcmVkIHRoYXQgY2FjaGluZyB0aGUNCiAgZHVuZSBgX2J1aWxkJyBkYXRhIGRvZXMgbm90 IHdvcmsgYXMgd2VsbCBhcyBJIGhhZCBleHBlY3RlZC4gKFRyYWNraW5nDQogIGlzc3VlOiBbZHVu ZSM0MTUwXSkuDQoNCiAgSSBjYW4gdGVsbCBiZWNhdXNlIEkgYW0gYXNraW5nIGR1bmUgdG8gdGVs bCBtZSBhYm91dCB3aGF0IGl0IGlzDQogIHJlYnVpbGRpbmcgKGBkdW5lIGJ1aWxkIC0tZGlzcGxh eSBzaG9ydCcpLiBJIHN1c3BlY3QgdGhhdCBwcm9qZWN0cw0KICB0aGF0IGNhY2hlIHRoZSBgX2J1 aWxkJyBkYXRhICp3aXRob3V0KiBsb2dnaW5nIHdoYXQgZHVuZSAocmUpYnVpbGRzDQogIGFyZSBh bHNvIG5vdCBjYWNoaW5nIGFzIG11Y2ggYXMgdGhleSB0aGluayB0aGV5IGFyZS4NCg0KICAoQnV0 IHRoZW4gbWF5YmUgdGhlIHVzZSBvZiBhIGZpeGVkLWNvbXBpbGVyIE9QQU0gaW1hZ2UsIGFzDQog IGRhdGEtZW5jb2RpbmcgaXMgdXNpbmcsIHNvbHZlcyB0aGUgaXNzdWUuKQ0KDQoNCltkYXRhLWVu Y29kaW5nXQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxhYnMvZGF0YS1lbmNvZGluZy8t L2Jsb2IvbWFzdGVyLy5naXRsYWItY2kueW1sPg0KDQpbZHVuZSM0MTUwXSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvaXNzdWVzLzQxNTA+DQoNCg0Kb2ZmaWNpYWwgQ0kgdGVtcGxhdGU/ DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBJIGNvbnNpZGVyZWQgc3VibWl0dGluZyB0aGlzIENJIGNvbmZpZ3VyYXRp b24gYXMgYW4gIk9DYW1sIEdpdGxhYiBDSQ0KICB0ZW1wbGF0ZSIgdG8gZ28gd2l0aCB0aGUgb2Zm aWNpYWwgbGlzdCBvZiAiYmxlc3NlZCIgQ0kgdGVtcGxhdGVzIGluDQogIFt0aGUgZG9jdW1lbnRh dGlvbl0uIEJ1dCByZWFkaW5nIHRoZSBbRGV2ZWxvcG1lbnQgZ3VpZGUgZm9yIEdpdGxhYg0KICBD SS9DRCB0ZW1wbGF0ZXNdIGNvbnZpbmNlZCBtZSB0aGF0IG15IENJIGNvbmZpZ3VyYXRpb24gaXMg bm93aGVyZQ0KICByZWFkeSB0byBzZXJ2ZSB0aGlzIHJvbGUuDQoNCiAgR2l0bGFiIGRldmVsb3Bl cnMgYXBwYXJlbnRseSBleHBlY3QgdGhhdCB1c2VycyB3aWxsIGJlIGFibGUgdG8NCiAgImluY2x1 ZGUiIHRob3NlIENJIHRlbXBsYXRlcyBieSBwb2ludGluZyB0byB0aGVpciBVUkwsIGFuZCB0aGVu IHR1bmUNCiAgaXQgZm9yIHRoZWlyIG93biB1c2UtY2FzZSAod2l0aG91dCBtb2RpZnlpbmcgaXQp IGJ5IHBlcmZvcm1pbmcgc29tZQ0KICAodW5yZWFzb25hYmxlPykgaW5oZXJpdGFuY2UgdHJpY2tz IHVzaW5nIHdoYXRldmVyIHRob3NlIGNvbmZpZ3VyYXRpb25zDQogIG9mZmVycyBhcyBhYnN0cmFj dGlvbi9pbmhlcml0YW5jZS9leHRlbnNpb24vb3ZlcnJpZGluZw0KICBtZWNoYW5pc20uIExldCdz IGp1c3Qgc2F5IHRoYXQgdGhpcyBpcyBuZXh0LWxldmVsIENJIGNvbmZpZ3VyYXRpb24NCiAgd3Jp dGluZywgYW5kIHRoYXQgbXkgc2NyaXB0IGlzIG5vdCByZWFkeSBmb3IgdGhpcy4NCg0KDQpbdGhl IGRvY3VtZW50YXRpb25dDQo8aHR0cHM6Ly9kb2NzLmdpdGxhYi5jb20vZWUvY2kvZXhhbXBsZXMv UkVBRE1FLmh0bWwjY2ljZC10ZW1wbGF0ZXM+DQoNCltEZXZlbG9wbWVudCBndWlkZSBmb3IgR2l0 bGFiIENJL0NEIHRlbXBsYXRlc10NCjxodHRwczovL2dpdGxhYi5jb20vZ2l0bGFiLW9yZy9naXRs YWIvLS9ibG9iL21hc3Rlci9kb2MvZGV2ZWxvcG1lbnQvY2ljZC90ZW1wbGF0ZXMubWQ+DQoNCg0K T0NhbWwgT2ZmaWNlIEhvdXJzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1vZmZpY2UtaG91cnMvNzEzMi80Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJl YWQsIFVuaXhKdW5raWUgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSW4gYWRkaXRpb24gdG8gbWFpbGluZyBsaXN0cyBhbmQgZGlz Y3VzcywgdGhlcmUgaXMgYWxzbyBhbiBJUkMgY2hhbm5lbA0KICB3aGVyZSBwZW9wbGUgY2FuIGlu dGVyYWN0IHdpdGggc29tZSBvY2FtbCBleHBlcnRzIGluIGEgbW9yZQ0KICAiaW50ZXJhY3RpdmUi IG1hbm5lciAoPGlyYzovL2lyYy5mcmVlbm9kZS5uZXQvI29jYW1sPikNCg0KDQpqc29uLWRhdGEt ZW5jb2RpbmcgMC45DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1qc29uLWRhdGEtZW5jb2RpbmctMC05LzcxNTcvMT4NCg0KDQpSYXBo YcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2Yg W05vbWFkaWMgTGFic10sIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZg0KICBq c29uLWRhdGEtZW5jb2RpbmcgdmVyc2lvbiAwLjkuDQoNCiAgVGhlIGNvZGUgaXMgaG9zdGVkIG9u IEdpdGxhYjoNCiAgPGh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxhYnMvanNvbi1kYXRhLWVu Y29kaW5nPiBJdCBpcyBkaXN0cmlidXRlZA0KICB1bmRlciBHTlUgTEdQTCB3aXRoIGxpbmtpbmcg ZXhjZXB0aW9uLiAgVGhlIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlDQogIG9ubGluZTogPGh0 dHBzOi8vbm9tYWRpYy1sYWJzLmdpdGxhYi5pby9qc29uLWRhdGEtZW5jb2RpbmcvPiBUaGUNCiAg cGFja2FnZSBpcyBhdmFpbGFibGUgdW5kZXIgb3BhbTogYG9wYW0gaW5zdGFsbCBqc29uLWRhdGEt ZW5jb2RpbmcnDQoNCiAganNvbi1kYXRhLWVuY29kaW5nIGlzIGEgbGlicmFyeSB0byBkZWZpbmUg ZW5jb2Rlci9kZWNvZGVyIHZhbHVlcyB0bw0KICB0cmFuc2xhdGUgT0NhbWwgdmFsdWVzIHRvIEpT T04gYW5kIGJhY2suIEl0IGFsc28gZ2VuZXJhdGVzIEpTT04NCiAgc2NoZW1hcyBzbyB5b3UgY2Fu IGRvY3VtZW50IHRoZSB2YWx1ZSByZXByZXNlbnRhdGlvbi4gSXQgY2FuIHVzZQ0KICBlaXRoZXIg RXpqc29ubSBvciBZb2pzb24gYXMgYmFja2VuZHMuDQoNCiAgVGhlIHZlcnNpb24gMC45IGhhcyB0 aGUgZm9sbG93aW5nIG5ldyBmZWF0dXJlczoNCiAg4oCiIG1vcmUgdGVzdHMNCiAg4oCiIG1lbW9p c2F0aW9uIG9mIGZpeHBvaW50IGVuY29kaW5nIHRvIGF2b2lkIHJlcGVhdGVkIGNvbXB1dGF0aW9u cw0KICDigKIgc3VwcG9ydCBmb3IgYGZvcm1hdCcgZmllbGQgZm9yIHN0cmluZyBzY2hlbWFzIChz ZWUNCiAgICA8aHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvdW5kZXJzdGFuZGluZy1qc29uLXNjaGVt YS9yZWZlcmVuY2Uvc3RyaW5nLmh0bWwjZm9ybWF0PikNCiAgICAoY29udHJpYnV0ZWQgYnkgQGxl dmlsbGFpbi5tYXhpbWUpDQogIOKAoiBmaXhlZCBpbnRlZ2VyIGJvdW5kIHByaW50aW5nIGluIHNj aGVtYXMgKGJ1ZyByZXBvcnQgYnkgQHB3Mzc0KQ0KICDigKIgc3VwcG9ydCBmb3IganNvbi1sZXhl bWUgc3RyZWFtaW5nIChzZWUgZGV0YWlscyBiZWxvdykNCiAg4oCiIHN1cHBvcnQgZm9yIGluY2x1 c2lvbi9leGNsdXNpb24gb2YgZGVmYXVsdC12YWx1ZSBmaWVsZHMgZHVyaW5nDQogICAgc2VyaWFs aXNhdGlvbiAoY29udHJpYnV0ZWQgYnkgQGxldmlsbGFpbi5tYXhpbWUpDQogIOKAoiBpbXByb3Zl ZCB1bmlvbi1vZi1vYmplY3Qgc2NoZW1hcyAoY29udHJpYnV0ZWQgYnkgQGxldmlsbGFpbi5tYXhp bWUpDQoNCiAgT25lIG1ham9yIGRpZmZlcmVuY2Ugd2l0aCB0aGUgcHJldmlvdXMgcmVsZWFzZSBp cyB0aGUgaW5jbHVzaW9uIG9mIGENCiAgbGV4ZW1lLXN0cmVhbWluZyBKU09OIGNvbnN0cnVjdG9y LiBTcGVjaWZpY2FsbHksIHRoZSBmdW5jdGlvbg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg dmFsIGNvbnN0cnVjdF9zZXEgOiAndCBlbmNvZGluZyAtPiAndCAtPiBqc29ubV9sZXhlbWUgU3Rk bGliLlNlcS50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGdlbmVyYXRlcyBhIHNlcXVlbmNlIG9m IGBKc29ubS5sZXhlbWUnICh0aGUgLiBUaGlzIHNlcXVlbmNlIGlzIGxhenkNCiAgKGluIHRoZSBz ZW5zZSBvZiBgU3RkbGliLlNlcScgbm90IG9mIGBTdGRsaWIuTGF6eScpIGFuZCBpdCBwYXZlcyB0 aGUNCiAgd2F5IHRvIGEgc2ltaWxhciBmZWF0dXJlIGluIGBkYXRhLWVuY29kaW5nJy4gQW4gaW50 ZXJlc3RpbmcgZmVhdHVyZSBvZg0KICBzZXF1ZW5jZXMgaXMgdGhhdCB0aGV5IGNhbiBiZSB1c2Vk IGluIFZhbmlsbGEgT0NhbWwgc2V0dGluZ3MgYXMgd2VsbA0KICBhcyBMd3QvQXN5bmMgc2V0dGlu Z3Mgd2hlcmUgdGhleSBhbGxvdyB1c2VyLWRyaXZlbiB5aWVsZGluZyBpbiBiZXR3ZWVuDQogIGVs ZW1lbnRzLg0KDQoNCltOb21hZGljIExhYnNdIDxodHRwczovL25vbWFkaWMtbGFicy5jb20vPg0K DQoNClZTQ29kZSBPQ2FtbCBQbGF0Zm9ybSB2MS42LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZz Y29kZS1vY2FtbC1wbGF0Zm9ybS12MS02LTAvNzE2NC8xPg0KDQoNClJ1ZGkgR3JpbmJlcmcgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIHZzY29kZS1vY2FtbC1w bGF0Zm9ybSB0ZWFtLCBJJ20gcGxlYXNlZCB0byBhbm5vdW5jZQ0KICAxLjYuMC4gVGhpcyByZWxl YXNlIGNvbnRhaW5zIGEgbmV3IGFjdGl2aXR5IHRhYiBmb3IgbWFuYWdpbmcgb3BhbQ0KICBzd2l0 Y2hlcyBkZXZlbG9wZWQgYnkgQHRtYXR0aW8uIFdlIGhvcGUgeW91IGZpbmQgaXQgdXNlZnVsLg0K DQogIENoYW5nZSBsb2c6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAtIEhpZ2hsaWdodCB0 b2tlbiBhbGlhc2VzIGluIE1lbmhpciBhc3NvY2lhdGl2aXR5IGRlY2xhcmF0aW9ucyAoIzQ3MykN CiAg4pSCIA0KICDilIIgLSBBY3RpdmF0ZSB0aGUgZXh0ZW5zaW9uIHdoZW4gd29ya3NwYWNlIGNv bnRhaW5zIE9DYW1sLCBSZWFzb24gc291cmNlcyBvcg0KICDilIIgICBwcm9qZWN0IG1hcmtlciBm aWxlcy4gKCM0ODIpDQogIOKUgiANCiAg4pSCIC0gQWRkIGBvY2FtbC51c2VPY2FtbEVudmAgc2V0 dGluZyB0byBkZXRlcm1pbmUgd2hldGhlciB0byB1c2UgYG9jYW1sLWVudmAgZm9yDQogIOKUgiAg IG9wYW0gY29tbWFuZHMgZnJvbSBPQ2FtbCBmb3IgV2luZG93cyAoIzQ4MSkNCiAg4pSCIA0KICDi lIIgLSBGaXggdGVybWluYWwgY3JlYXRpb24gd2hlbiB1c2luZyBkZWZhdWx0IHNoZWxsIGFuZCBh cmd1bWVudHMgKCM0ODQpDQogIOKUgiANCiAg4pSCIC0gQWRkIGFuIE9DYW1sIGFjdGl2aXR5IHRh Yi4NCiAg4pSCIA0KICDilIIgICBUaGUgYWN0aXZpdHkgdGFiIHByb3ZpZGVzIHRocmVlIHZpZXdz OiB0aGUgYXZhaWxhYmxlIHN3aXRjaGVzLCB0aGUgYnVpbGQNCiAg4pSCICAgY29tbWFuZHMgYW5k IGFuIEhlbHAgYW5kIEZlZWRiYWNrIHNlY3Rpb24gd2l0aCBsaW5rcyB0byBjb21tdW5pdHkgY2hh bm5lbHMuDQogIOKUgiANCiAg4pSCIC0gU3VwcG9ydCBgZWxpb21gIGFuZCBgZWxpb21pYCBmaWxl IGV4dGVuc2lvbnMgKCM0ODcpDQogIOKUgiANCiAg4pSCIC0gRml4IG9jYW1sL29jYW1sLWxzcCMz NTg6IGF1dG9tYXRpYyBpbnNlcnRpb24gb2YgYW4gaW5mZXJyZWQgaW50ZXJmYWNlIHdhcw0KICDi lIIgICBpbnNlcnRpbmcgY29kZSBpbmNvcnJlY3RseSBvbiB0aGUgc2Vjb25kIHN3aXRjaCB0byB0 aGUgbmV3bHkgY3JlYXRlZCAodW5zYXZlZCkNCiAg4pSCICAgYG1saWAgZmlsZS4gSWYgdGhlIG5l dyBgbWxpYCBmaWxlIGlzbid0IGVtcHR5LCB3ZSBkb24ndCBpbnNlcnQgaW5mZXJyZWQNCiAg4pSC ICAgaW50ZXJmYWNlICgjNDk4KQ0KICDilJTilIDilIDilIDilIANCg0KDQpyZWxlYXNlIDAuMy4w IG9mIGRyb20sIHRoZSBPQ2FtbCBwcm9qZWN0IGNyZWF0b3INCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXJlbGVhc2UtMC0zLTAtb2YtZHJvbS10aGUtb2NhbWwtcHJvamVjdC1jcmVhdG9yLzcxNjYv MT4NCg0KDQpGYWJyaWNlIExlIEZlc3NhbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byByZWxlYXNlIHZlcnNpb24gMC4zLjAgb2Yg YGRyb20nLCB0aGUgT0NhbWwgcHJvamVjdA0KICBjcmVhdG9yLg0KDQogIGBkcm9tJyBpcyBib3Ju IGZyb20gYSBzaW1wbGUgb2JzZXJ2YXRpb246IGV2ZXJ5IHRpbWUgeW91IGNyZWF0ZSBhIG5ldw0K ICBPQ2FtbCBwcm9qZWN0LCB5b3Ugc3BlbmQgdGltZSBzZWFyY2hpbmcgYW5kIGNvcHktcGFzdGlu ZyBmaWxlcyBmcm9tDQogIG90aGVyIHByb2plY3RzLCBhZGFwdGluZyB0aGVtIHRvIHRoZSBuZXcg b25lLiBgZHJvbScgZG9lcyB0aGF0IGZvcg0KICB5b3U6IGl0IGNvbWVzIHdpdGggYSBzZXQgb2Yg cHJlZGVmaW5lZCBza2VsZXRvbiBwcm9qZWN0cywgdGhhdCB5b3UgY2FuDQogIGVhc2lseSBjb25m aWd1cmUgYW5kIGFkYXB0IHRvIHlvdXIgZ29hbC4NCg0KICBJdCdzIGFzIGVhc3kgYXM6DQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBkcm9tIG5ldw0KICDilIIgICAjIGNoZWNrIHRoZSBsaXN0 IG9mIHNrZWxldG9ucw0KICDilIIgJCBkcm9tIG5ldyBQUk9KRUNUX05BTUUgLS1za2VsZXRvbiBT S0VMRVRPTl9OQU1FDQogIOKUgiAkIGNkIFBST0pFQ1RfTkFNRQ0KICDilIIgJCBlbWFjcyBkcm9t LnRvbWwNCiAg4pSCICAgICMgLi4uIGVkaXQgYmFzaWMgZGVzY3JpcHRpb24sIGRlcGVuZGVuY2ll cywgZXRjLiAuLi4NCiAg4pSCICQgZHJvbSBwcm9qZWN0DQogIOKUgiAkIGRyb20gYnVpbGQNCiAg 4pSU4pSA4pSA4pSA4pSADQogIFRoYW5rcyB0byBjb250cmlidXRvcnMgKE1heGltZSBMZXZpbGxh aW4gYW5kIERhdmlkIERlY2xlcmNrKSwgdGhlIGxpc3QNCiAgb2YgcHJvamVjdCBza2VsZXRvbnMg Zm9yIGRyb20gMC4zLjAgaGFzIGdyb3duOg0KICDigKIgT0NhbWwgcHJvamVjdHM6IGxpYnJhcnkg bWVuaGlyIG1pbmlfbGliIG1pbmlfcHJnIHBweF9kZXJpdmVyDQogICAgcHB4X3Jld3JpdGVyIHBy b2dyYW0NCiAg4oCiIEMgQmluZGluZ3M6IGNfYmluZGluZyBjdHlwZXNfZm9yZWlnbiBjdHlwZXNf c3R1YnMNCiAg4oCiIEphdmFzY3JpcHQgcHJvamVjdHM6IGpzX2xpYiBqc19wcmcgdnVlIHdhc21f YmluZGluZw0KDQogIGFuZCB5b3UgY2FuIGVhc2lseSBjb250cmlidXRlIHlvdXIgb3duOiBmb3Ig ZXhhbXBsZSwNCiAgYGdoOlVTRVIvU0tFTEVUT04nIHdpbGwgdHJpZ2dlciB0aGUgZG93bmxvYWQg b2YgdGhlIGBVU0VSL1NLRUxFVE9OJw0KICBwcm9qZWN0IGZyb20gR2l0aHViIGFzIGEgdGVtcGxh dGUgZm9yIHlvdXIgbmV3IHByb2plY3QuDQoNCiAgYGRyb20nIGlzIGF2YWlsYWJsZSBmcm9tIGBv cGFtJzogYG9wYW0gdXBkYXRlICYmIG9wYW0gaW5zdGFsbA0KICBkcm9tLjAuMy4wJw0KDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWxwcm8vZHJvbT4NCg0KICBFbmpveSAhDQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cDovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5 bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cDovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 19 to 26, 202= 1.

How to get pleasant documentation for a library using Dune?

gasche announced

I'm working to publish a small library using Dune. The documentation automa= tically generated by dune build @doc looks fairly unpleasant to me, as I don't see an easy way to explain what t= he library is about. I'm creating this topic in case I am missing something simple, and to get other people to sha= re their library-documentation practices or examples.

Problem description

For the sake of the example let's imagine that the library is called = Foo and contains three modules A, B and C. I'm using the standard dune approach of wrapped modules, so= I get three compilation units Foo.A, Foo.B, Foo.C. Each module has a .mli file with documenta= tion comments.

When I run dune build @doc, dune generates an index.html= file with basically no content, pointing to a foo/index.html file with basically no content, pointing to a <= code>foo/Foo/index.html looking like this:

Up =E2=80=93 foo =C2=BB Foo

Module Foo

module A : sig ... end

module B : sig ... end

module C : sig ... end

It's easy to skip the first two pages, and use the third page as a landing = page for the documentation of my library. However, this landing page is not very pleasant:

  1. It should explain what the library is about.
  2. It should briefly describe what each module does, so that users know wh= ich module they want to look at first.

(Point 2 is especially important with "wrapped libraries", where it's not n= ecessarily obvious which of the several modules is the main entry point with the important functions to look at fir= st. In comparison, in a design where the "entry point" is in the Foo module, with Foo.A an= d Foo.B as more advanced submodules (or Foo_A and= Foo_B in the old days) the user is guided to look at Foo first.)

My problem is: what should I change in my Dune setup to be able to do this?

I have read the dune documentation on documentation, but I could not find an answer to this question.

Rough ideas

Roughly I see two ways to get what I want, that I have not tried yet:

  1. I could write my own landing page for the library as a separate d= oc.mld file, use the (documentation) stanza to get it i= ncluded in the built documentation, and use this as the entry point into my= library.
  2. In could write my own foo.ml module instead of using Dune'= s default wrapped-module scaffolding, inserting my own module A =3D F= oo__A aliases, with documentation comments in the standard style. Th= en I suppose that foo/Foo/index.html would get this content in= the way I expect.

They feel a bit complex to me, and (2) involves the tedious work of redoing= the wrapping logic myself. I guess that (1) is not so bad, and I would be inclined to do this if it was documented = somewhere as the recommended approach.

(Maybe there is some odoc option that would help solve this problem?)

Examples from other people?

Do you have a library built using dune with nice documentation? If so, can = you show the documentation and the corresponding sources (in particular dune setup)?

Thibaut Mattio replied

I think the documentation of Streaming is a great example of the option 1 you describe.

The corresponding Dune setup can be found here

That's also the approach we took for Opium's documentation, although the index page is certainly not as impressive as Streaming's.

gasche then said

Thanks! It looks like these systems rely on an undocumented feature of the = (documentation) stanza (or odoc), which is that a user-provided index.mld file will implicitly replace= the automatically-generated index.mld file, giving a reasonably natural result.

The opium documentation also uses the {!modules: modulename ...} markup directive, which is a way to= include the module index within this manually-written landing page without having to duplicate the markup. Strea= ming=C2=B9 uses inline html instead to get a nicer-looking result, but it is too much effort. Maybe there is a better way, or the tool= s could be improved to make this easier.

=C2=B9: I'm ashamed to admit that I wasn't aware of this very nice library Stre= aming, am I consuming the wrong sources of information on the OCaml ecosystem?

Finally, the Opium documentation manifestly has a short synopsis for each m= odule in its listing, which corresponds to my "It should briefly describe what each module does" requirement. I believ= e that this comes from the first line of the first documentation comment of the module. There are module-global docu= mentation comments in the library I'm working on, but they do not include such first-line headers.

Once I have the impression of understanding what is a good way to do this, = I may try to contribute better documentation in dune.

Gabriel Radanne replied

It looks like these systems rely on an undocumented feature of the (d= ocumentation) stanza (or odoc), which is that a user-provided index.mld file will implicitly replace the aut= omatically-generated index.mld file, giving a reasonably natural result.

I confirm this feature is here to stay, is the right one to customize your = index page, and in the future will benefit from good support from odoc directly.

The opium documentation also uses the {!modules: modulename ...} markup directive, which is a way to= include the module index within this manually-written landing page without having to duplicate the markup. Strea= ming=C2=B9 uses inline html instead to get a nicer-looking result, but it is too much effort. Maybe there is a better way, or the tool= s could be improved to make this easier.

I would strongly advise to use the modules markup directive, a= nd to suggests output improvements on odoc's bug instead of hacking HTML together. We could absolutely add the synopsis of t= he module here, for instance.

Daniel B=C3=BCnzli then said

which is that a user-provided index.mld file will implicitly r= eplace the automatically-generated index.mld file, giving a reasonably natural result.

This is also the correct way to customize the landing page of your package = for odig generated doc sets, see here for more information.

I confirm this feature is here to stay, is the right one to customize your = index page, and in the future will benefit from good support from odoc directly.

There's an open issue about that here.

Alt-Ergo 2.4.0 release

OCamlPro announced

We are pleased to announce a new release of Alt-Ergo!

Alt-Ergo 2.4.0 is now available from Alt-Ergo=E2=80=99s website. An associated opam package will be published in the next few days.

This release contains some major novelties:

  • Alt-Ergo supports incremental commands (push/pop) from the smt-lib standard.
  • We switched command line parsing to use cmdliner. You will need to use –<option n= ame> instead of -<option name>. Some options have also been rename= d, see the manpage or the documentation.
  • We improved the online documentation of your solver, available here.

This release also contains some minor novelties:

  • .mlw and .why extension are depreciated, the use of .ae extension is ad= vised.
  • Add –input (resp –output) option to manually set the inpu= t (resp output) file format
  • Add –pretty-output option to add better debug formatting and to = add colors
  • Add exponentiation operation, ** in native Alt-Ergo syntax. The operato= r is fully interpreted when applied to constants
  • Fix –steps-count and improve the way steps are counted (AdaCore = contribution)
  • Add –instantiation-heuristic option that can enable lighter or h= eavier instantiation
  • Reduce the instantiation context (considered foralls / exists) in CDCL-= Tableaux to better mimic the Tableaux-like SAT solver
  • Multiple bugfixes

The full list of changes is available here. As usual, do not hesitate to report bugs, to ask questions, or to give your feedback!

First release of Art - Adaptive Radix Tree in OCaml

Calascibetta Romain announced

I'm glad to announce the first release of art, an implementation of the Adaptive Radix Tree in OCaml. The goal of this library is to provide a = data-structure such as Map.S (and keep the order) with performances of Hashtbl.t.

Performances

art uses Becham= el as a tool for micro-benchmarking and it compares performances about insertion= and lookup= . As you can see, about insertion, art is definitely more fast than Hashtbl.t.

For the lookup operation, we are slightly = more fast than the Hashtbl.t. The main advantage comparing to Hashtbl.t is the ability to use maximum~/~minimum= or to iter over the whole data-structure with a certain order.

On details, benchmarks use a normal distribution of strings ab= out their lengths. As a practical example where art will be better than Hashtbl.t is when you want to index several words (such as email addresses).

Tests

Of course, the library provide a fuzzer and tests have a coverage of: 91.93 %

Read Optimized Write Exclusion - ROWEX

Even if it's not a part of the package, the distribution comes with lock-free implementation of art: rowex. This implementation comes from a research paper about data-structure and atomic operatio= ns.

ROWEX provides a persistent implementation= which manipulates a file to store the whole data-structure. The goal is to provide an indexer free to be manipulat= ed by several processes in parallel.

Currently, the implementation of ROWEX in OCaml is not well-tested and it i= s no distributed. It does not take the advantage of ocaml-multicore (but it should) but outcomes are good and the developm= ent will be more focus on this part.

So feel free to play with it a bit :+1:.

perf demangling of OCaml symbols (and a short introduction to = perf)

Fabian announced

As a project sponsored by the OCaml softw= are foundation, I've worked on demangling OCaml symbols in per= f. Some screenshots are below. The work is currently being upstreamed. In the meantime, it can be used as follows:

git clone --depth=3D1 https://github.com/copy/=
linux.git
# or=
:
# wg=
et https://github.com/copy/linux/archive/master.tar.gz && tar xfv m=
aster.tar.gz
cd linux/tools/perf
make
alias PWD/perf
# or=
 copy perf to somewhere in your PATH

Your distribution's version of perf will also work for the examples below, = but will have less readable symbols :-)

Short intruction to perf

Perf is a Linux-only sampling profiler (and more), which can be used to ana= lyse the performance profile of OCaml and other executables. When compiling with ocamlopt, add -g to inc= lude debug information in the executable. dune does this automatically, even in the release profile. To start a program and rec= ord its profile:

perf record --call-graph dwarf program.exe

Or record a running program:

perf record --call-graph dwarf -p `pidof program.exe`

Then, view a profile using:

perf report # top-down
perf report --no-children # bottom-up

Within the report view, the following keybindings are useful:

  • +: open/close one callchain level
  • e: open/close entire callchain
  • t: Toggle beween current thread and all threads (e.g., onl= y dune, ocamlopt, etc.)

Or generate a flamegraph:

git clone https://github.com/brendangregg/Flam=
eGraph
cd FlameGraph
perf script -i path/to/perf.data | ./stackcollapse-perf.pl | ./flamegraph.p=
l > perf-flamegraph.svg

You may need to run the following command to allow recording by non-root us= ers (more infos):

echo 0 | sudo tee /proc/sys/kernel/perf_event_paranoid

Decimal 0.2.1 - arbitrary-precision decimal floating point

Yawar Amin announced

Happy to announce that decimal 0.2.1 has been pubished on opam.

decimal is a port of Python's decimal module to OCaml and implements the Gen= eral Decimal Arithmetic Specification. However note that it is a port in progress–basic arithmetic and rounding function= s have been ported, but I am still working on powers and logs. The ported functions pass the same unit test suite that th= e Python version does (with some minor modifications).

Another caveat: currently the library is only supported on 64-bit architect= ures due to (exponent) overflow issues on 32-bit. If anyone is willing to test and fix overflows on 32-bit, I am more= than happy to accept PRs.

Here's an example of using the module:

(* Rosetta Code Currency Example *)

(* D=
emo purposes, normally you'd prefix module name or local open *)
open Decimal

let hamburger_qty =3D of_string "4_000_000_000_000_000"
let hamburger_amt =3D of_string "5.50"
let milkshake_qty =3D of_int 2
let milkshake_amt =3D of_string "2.86"

(* S=
hortcut to divide 7.65 by 100 *)
let tax_rate =3D of_string "7.65e-2"

let subtotal =3D hamburger_qty * hamburger_amt + mi=
lkshake_qty * milkshake_amt
let tax =3D round ~=
n:2 (subtotal * tax_rate)
let total =3D subtotal + tax

let () =3D Format.printf "Subtotal: %a
     Tax:  %a
   Total: %a\n" pp subtotal pp tax p=
p total

You can get the package with: opam install decimal. Minimum OC= aml version 4.08.

Basic GitLab CI configuration

gasche announced

After a long ci-golfing adventure (83 tests), I got a .gitlab-ci.yml<= /code> file that I think is reusable and useful for small projects / libraries:

Features:

  • It is project-agnostic, so it should work unchanged for your own (simpl= e) projects.
  • It caches the opam dependencies.
  • It builds the project, runs the tests and builds the documentation.
  • Several compiler versions can be tested in parallel.
  • It provides an easy way to upload the documentation as "Gitlab project = Pages".

CI times are satisfying: on very small libraries I observe a 11mn job time = on the first run (or when cleaning the opam cache), and 2mn job time on following runs.

The expected usage-mode of this CI configuration is that you copy it in you= r own project. If you find that you need/want additional features, ideally you would try to write them in a pro= ject-agonistic way and contribute them back to the example repository.

This configuration does not use @smondet's trick of generating a docker ima= ge on the fly. I think this would be an excellent idea to get more reliable caching, but it is too complex for me a= nd I don't see how to do it in a maintainable and project-agnostic way.

Current status

I wrote this CI configuration over the week-end, and have not used it much.= I expect it to keep evolving somewhat before it stabilizes. Feedback from other people trying to use the configur= ation would be warmly welcome.

Aside on _build caching

I also implemented caching of dune's _build data, inspired by = the data-encoding example of @raphael-proust. I don't need it for my small projects (dune build is 3s, c= ompared to 1m setting up the Docker image), but I thought it would make the CI configuration scale better to la= rger projects.

When I tested this CI configuration, I discovered that caching the dune _build data does not work as well as I had expected. (Tracking issue: dune#4150).

I can tell because I am asking dune to tell me about what it is rebuilding = (dune build --display short). I suspect that projects that cache the _build data without loggin= g what dune (re)builds are also not caching as much as they think they are.

(But then maybe the use of a fixed-compiler OPAM image, as data-encoding is= using, solves the issue.)

official CI template?

I considered submitting this CI configuration as an "OCaml Gitlab CI templa= te" to go with the official list of "blessed" CI templates in the documentation. But reading the Development guide for Gitlab CI/CD templates convinced me that my CI configuration is nowhere ready to serve this role.

Gitlab developers apparently expect that users will be able to "include" th= ose CI templates by pointing to their URL, and then tune it for their own use-case (without modifying it) by performin= g some (unreasonable?) inheritance tricks using whatever those configurations offers as abstraction/inheritance/exten= sion/overriding mechanism. Let's just say that this is next-level CI configuration writing, and that my script is not= ready for this.

OCaml Office Hours?

Deep in this thread, UnixJunkie said

In addition to mailing lists and discuss, there is also an IRC channel wher= e people can interact with some ocaml experts in a more "interactive" manner (//irc.freenode.net/#ocaml)

json-data-encoding 0.9

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I'm ha= ppy to announce the release of json-data-encoding version 0.9.

The code is hosted on Gitlab: https://gitlab.com/nomadic-labs/json-data-encoding It is distributed under GNU LGPL with linking exception. The documentation is available online: https://nomadic-labs.gitlab.io/json-data-encodin= g/ The package is available under opam: opam install json-data-encoding<= /code>

json-data-encoding is a library to define encoder/decoder values to transla= te OCaml values to JSON and back. It also generates JSON schemas so you can document the value representation. It can= use either Ezjsonm or Yojson as backends.

The version 0.9 has the following new features:

  • more tests
  • memoisation of fixpoint encoding to avoid repeated computations
  • support for format field for string schemas (see https://json-schema.org/understanding-json-schema/reference/string= .html#format) (contributed by @levillain.maxime)
  • fixed integer bound printing in schemas (bug report by @pw374)
  • support for json-lexeme streaming (see details below)
  • support for inclusion/exclusion of default-value fields during serialis= ation (contributed by @levillain.maxime)
  • improved union-of-object schemas (contributed by @levillain.maxime)

One major difference with the previous release is the inclusion of a lexeme= -streaming JSON constructor. Specifically, the function

val construct_seq : 't e=
ncoding -> 't -> jsonm_lexeme Stdlib.=
Seq.t

generates a sequence of Jsonm.lexeme (the . This sequence is l= azy (in the sense of Stdlib.Seq not of Stdlib.Lazy) and it paves the way to a similar feature in data-encoding. An interesting feature of sequences is that they can be used in Vanilla OCaml settings as well as Lwt/Async settin= gs where they allow user-driven yielding in between elements.

VSCode OCaml Platform v1.6.0

Rudi Grinberg announced

On behalf of the vscode-ocaml-platform team, I'm pleased to announce 1.6.0.= This release contains a new activity tab for managing opam switches developed by @tmattio. We hope you find it usefu= l.

Change log:

- Highlight token aliases in Menhir associativity=
 declarations (#473)

- Activate the extension when workspace contains OCaml, Reason sources or
  project marker files. (#482)

- Add `ocaml.useOcamlEnv` setting to determine whether to use `ocaml-env` f=
or
  opam commands from OCaml for Windows (#481)

- Fix terminal creation when using default shell and arguments (#484)

- Add an OCaml activity tab.

  The activity tab provides three views: the available switches, the build
  commands and an Help and Feedback section with links to community channel=
s.

- Support `eliom` and `eliomi` file extensions (#487)

- Fix ocaml/ocaml-lsp#358: automatic insertion of an inferred interface was
  inserting code incorrectly on the second switch to the newly created (uns=
aved)
  `mli` file. If the new `mli` file isn't empty, we don't insert inferred
  interface (#498)

release 0.3.0 of drom, the OCaml project creator

Fabrice Le Fessant announced

We are pleased to release version 0.3.0 of drom, the OCaml pro= ject creator.

drom is born from a simple observation: every time you create = a new OCaml project, you spend time searching and copy-pasting files from other projects, adapting them to the new one. drom does that for you: it comes with a set of predefined skeleton projects, that you can easily configure and adapt to= your goal.

It's as easy as:

$ drom new
  # check the list of skeletons
$ drom new PROJECT_NAME --skeleton SKELETON_NAME
$ cd PROJECT_NAME
$ emacs drom.toml
   # ... edit basic description, dependencies, etc. ...
$ drom project
$ drom build

Thanks to contributors (Maxime Levillain and David Declerck), the list of p= roject skeletons for drom 0.3.0 has grown:

  • OCaml projects: library menhir mini_lib mini_prg ppx_deriver ppx_rewrit= er program
  • C Bindings: c_binding ctypes_foreign ctypes_stubs
  • Javascript projects: js_lib js_prg vue wasm_binding

and you can easily contribute your own: for example, gh:USER/SKELETON= will trigger the download of the USER/SKELETON project from Github as a template for your new p= roject.

drom is available from opam: opam update &a= mp;& opam install drom.0.3.0

https://github.com/ocamlpro/dr= om

Enjoy !

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the RSS feed of the archives<= /a>.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E9229E00BF for ; Tue, 2 Feb 2021 14:56:17 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.79,395,1602540000"; d="scan'208,217";a="490417540" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 Feb 2021 14:56:17 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 02 Feb 2021 14:56:17 +0100 Message-ID: <87sg6evaim.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAyNiB0bw0KRmVicnVhcnkgMDIsIDIwMjEuDQoNClRhYmxlIG9mIENvbnRl bnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KcmVsZWFzZSAwLjIuMiBvZiBwcHhfZGVyaXZpbmdfZW5jb2RpbmcNCk9DYW1sIDQuMTIuMCwg c2Vjb25kIGJldGEgcmVsZWFzZQ0KT0NhbWwgT2ZmaWNlIEhvdXJzPw0KVGltZXJlIDAuMS4zIC0g RGVhbGluZyB3aXRoIHRpbWUgYW5kIHRpbWUgem9uZXMgaGF2ZSBuZXZlciBiZWVuIGVhc2llcg0K SW50ZXJlc3RpbmcgT0NhbWwgQXJ0aWNsZXMNCmpzb24tZGF0YS1lbmNvZGluZyAwLjkNCm9jYW1s ZWFybHliaXJkIDEuMC4wIGJldGExDQpDbWRsaW5lciBjaGVhdHNoZWV0DQpjb250YWluZXJzIDMu Mg0KT0NhbWwgQ2Fmw6k6IFRodSwgRmViIDExIEAgN3BtIChVLlMuIENlbnRyYWwpDQpEZXBlbmRl bmN5IGdyYXBoIG9mIHNvbWUgT0NhbWwgc291cmNlIGZpbGVzDQpPdGhlciBPQ2FtbCBOZXdzDQpP bGQgQ1dODQoNCg0KcmVsZWFzZSAwLjIuMiBvZiBwcHhfZGVyaXZpbmdfZW5jb2RpbmcNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2UtMC0y LTItb2YtcHB4LWRlcml2aW5nLWVuY29kaW5nLzcxNjkvMT4NCg0KDQpsZXZpbGxhaW4ubWF4aW1l IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRm9sbG93aW5nIHRoZSByZWxl YXNlIG9mIFtqc29uLWRhdGEtZW5jb2RpbmcuMC45XSwgSSBhbSBoYXBweSB0bw0KICBhbm5vdW5j ZSB0aGUgcmVsZWFzZSBvZiBwcHhfZGVyaXZpbmdfZW5jb2RpbmcuMC4yLjIuDQoNCiAgVGhlIGNv ZGUgc291cmNlIGFuZCBzb21lIGRvY3VtZW50YXRpb24gaXMgYXZhaWxhYmxlIG9uIFtnaXRsYWJd LCBhbmQNCiAgdGhlIHBhY2thZ2UgY2FuIGJlIGluc3RhbGxlZCB3aXRoIG9wYW0gKGBvcGFtIGlu c3RhbGwNCiAgcHB4X2Rlcml2aW5nX2VuY29kaW5nJykuDQoNCiAgVGhpcyBwcHggYWxsb3dzIHRv IGRlcml2ZSBlbmNvZGluZyBvZiBqc29uLWRhdGEtZW5jb2RpbmcgbGlicmFyeSBmcm9tDQogIG1v c3Qgb2Ygb2NhbWwgdHlwZXMuDQoNCiAgSGF2ZSBmdW4hDQoNCg0KW2pzb24tZGF0YS1lbmNvZGlu Zy4wLjldDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1qc29uLWRhdGEtZW5jb2Rp bmctMC05LzcxNTc+DQoNCltnaXRsYWJdIDxodHRwczovL2dpdGxhYi5jb20vby1sYWJzL3BweF9k ZXJpdmluZ19lbmNvZGluZz4NCg0KDQpPQ2FtbCA0LjEyLjAsIHNlY29uZCBiZXRhIHJlbGVhc2UN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMi0wLXNlY29uZC1iZXRh LXJlbGVhc2UvNzE3MS8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxl YXNlIG9mIE9DYW1sIDQuMTIuMCBpcyBvbiB0aGUgaG9yaXpvbi4gV2UgaGF2ZSBjcmVhdGVkIGEg bmV3DQogIGJldGEgdmVyc2lvbiB0byBoZWxwIHlvdSBhZGFwdCB5b3VyIHNvZnR3YXJlIHRvIHRo ZSBuZXcgZmVhdHVyZXMgYWhlYWQNCiAgb2YgdGhlIHJlbGVhc2UuDQoNCiAgQ29tcGFyZWQgdG8g dGhlIGZpcnN0IGJldGEgcmVsZWFzZSwgdGhpcyBuZXcgcmVsZWFzZSBjb250YWlucyBvbmUgZml4 DQogIGZvciB0aGUgVGhyZWFkIGxpYnJhcnkgKGZvciBhIHJhY2UgY29uZGl0aW9uIG9uIFdpbmRv d3MpLCBhbmQNCiAgZXhwZXJpbWVudGFsbHkgcmUtZW5hYmxlcyBidWlsZGluZyB0aGUgY29tcGls ZXIgb24gaWxsdW1vcyBhbmQgT3JhY2xlDQogIFNvbGFyaXMuDQoNCiAgV2UgYXJlIGV4cGVjdGlu ZyB0aGlzIGJldGEgdG8gYmUgdGhlIGxhc3Qgb25lIGJlZm9yZSB0aGUgcmVsZWFzZS4NCg0KICBJ ZiB5b3UgZmluZCBhbnkgYnVncywgcGxlYXNlIHJlcG9ydCB0aGVtIGhlcmU6DQogICA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcz4NCg0KICBIYXBweSBoYWNraW5nLA0KDQog IOKAkyBGbG9yaWFuIEFuZ2VsZXR0aSBmb3IgdGhlIE9DYW1sIHRlYW0uDQoNCg0KSW5zdGFsbGF0 aW9uIGluc3RydWN0aW9ucw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGJhc2UgY29tcGls ZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dp bmcgY29tbWFuZHMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIg b3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTIuMH5iZXRhMiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJl dGE9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0 DQogIOKUlOKUgOKUgOKUgOKUgA0KICBJZiB5b3Ugd2FudCB0byB0d2VhayB0aGUgY29uZmlndXJh dGlvbiBvZiB0aGUgY29tcGlsZXIsIHlvdSBjYW4gcGljaw0KICBjb25maWd1cmF0aW9uIG9wdGlv bnMgd2l0aA0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFt IHN3aXRjaCBjcmVhdGUgPHN3aXRjaF9uYW1lPiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQu MTIuMH5iZXRhMitvcHRpb25zLDxvcHRpb25fbGlzdD4NCiAg4pSCIC0tcmVwb3NpdG9yaWVzPWRl ZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3Np dG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIDxvcHRpb25fbGlzdD4gaXMgYSBj b21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBvY2FtbC1vcHRpb24tKg0KICBwYWNrYWdlcy4gRm9yIGlu c3RhbmNlLCBmb3IgYSBmbGFtYmRhIGFuZCBhZmwgZW5hYmxlZCBzd2l0Y2g6DQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTIuMH5iZXRhMitmbGFtYmRhK2Fm bA0KICDilIIgLS1wYWNrYWdlcz1vY2FtbC12YXJpYW50cy40LjEyLjB+YmV0YTIrb3B0aW9ucyxv Y2FtbC1vcHRpb24tZmxhbWJkYSxvY2FtbC1vcHRpb24tYWZsDQogIOKUgiAtLXJlcG9zaXRvcmll cz1kZWZhdWx0LGJldGE9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJl cG9zaXRvcnkuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KICBBbGwgYXZhaWxhYmxlIG9wdGlvbnMg Y2FuIGJlIGxpc3RlZCB3aXRoICJvcGFtIHNlYXJjaCBvY2FtbC1vcHRpb24iLg0KDQogIFRoZSBz b3VyY2UgY29kZSBpcyBhdmFpbGFibGUgYXQgdGhlc2UgYWRkcmVzc2VzOg0KDQogIOKAoiA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNC4xMi4wLWJldGEyLnRhci5nej4N CiAg4oCiIDxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNC4xMi9vY2Ft bC00LjEyLjB+YmV0YTIudGFyLmd6Pg0KDQogIElmIHlvdSB3YW50IHRvIHRlc3QgdGhpcyB2ZXJz aW9uLCB5b3UgbWF5IHdhbnQgdG8gaW5zdGFsbCB0aGUgYWxwaGENCiAgb3BhbSByZXBvc2l0b3J5 DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZS9vcGFtLWFscGhhLXJlcG9zaXRv cnk+DQoNCiAgd2l0aA0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gcmVwbyBhZGQgYWxw aGEgZ2l0Oi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZS9vcGFtLWFscGhhLXJlcG9zaXRvcnkuZ2l0 DQogIOKUlOKUgOKUgOKUgOKUgA0KICBUaGlzIGFscGhhIHJlcG9zaXRvcnkgY29udGFpbnMgdmFy aW91cyBwYWNrYWdlcyBwYXRjaGVkIHdpdGggZml4ZXMgaW4NCiAgdGhlIHByb2Nlc3Mgb2YgYmVp bmcgdXBzdHJlYW1lZC4gT25jZSB0aGUgcmVwb3NpdG9yeSBpbnN0YWxsZWQsIHRoZXNlDQogIHBh dGNoZWQgcGFja2FnZXMgd2lsbCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgbm9uLXBhdGNoZWQg dmVyc2lvbi4NCg0KDQpDaGFuZ2VzIGZyb20gdGhlIGZpcnN0IGJldGENCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQpUaHJlYWQgbGlicmFyeQ0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiICphZGRpdGlvbmFsIGZpeGVzKiBbOTc1N10sIFs5ODQ2 XSwgK1sxMDE2MV06IGNoZWNrIHByb3BlciBvd25lcnNoaXANCiAgICAgd2hlbiBvcGVyYXRpbmcg b3ZlciBtdXRleGVzLiBOb3csIHVubG9ja2luZyBhIG11dGV4IGhlbGQgYnkgYW5vdGhlcg0KICAg ICB0aHJlYWQgb3Igbm90IGxvY2tlZCBhdCBhbGwgcmVsaWFibHkgcmFpc2VzIGEgU3lzX2Vycm9y IGV4Y2VwdGlvbi4NCiAgICAgQmVmb3JlLCBpdCB3YXMgdW5kZWZpbmVkIGJlaGF2aW9yLCBidXQg dGhlIGRvY3VtZW50YXRpb24gZGlkIG5vdA0KICAgICBzYXkgc28uIExpa2V3aXNlLCBsb2NraW5n IGEgbXV0ZXggYWxyZWFkeSBsb2NrZWQgYnkgdGhlIGN1cnJlbnQNCiAgICAgdGhyZWFkIHJlbGlh Ymx5IHJhaXNlcyBhIFN5c19lcnJvciBleGNlcHRpb24uICBCZWZvcmUsIGl0IGNvdWxkDQogICAg IGRlYWRsb2NrIG9yIHN1Y2NlZWQgKGFuZCBkbyByZWN1cnNpdmUgbG9ja2luZyksIGRlcGVuZGlu ZyBvbiB0aGUNCiAgICAgT1MuIChYYXZpZXIgTGVyb3ksIHJlcG9ydCBieSBHdWlsbGF1bWUgTXVu Y2gtTWFjY2Fnbm9uaSwgcmV2aWV3IGJ5DQogICAgIEd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25p LCBEYXZpZCBBbGxzb3BwLCBhbmQgU3RlcGhlbiBEb2xhbikNCg0KDQpbOTc1N10gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTc1Nz4NCg0KWzk4NDZdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk4NDY+DQoNClsxMDE2MV0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAxNjE+DQoNCg0KQnVpbGQgc3lzdGVtDQrilITi lITilITilITilITilITilITilITilITilITilITilIQNCg0KICDigKIgWzEwMDYzXTogKFJlLSll bmFibGUgYnVpbGRpbmcgb24gaWxsdW1vcyAoU21hcnRPUywgT21uaU9TLCDigKYpIGFuZA0KICAg IE9yYWNsZSBTb2xhcmlzOyB4ODZfNjQvR0NDIGFuZCA2NC1iaXQgU1BBUkMvU3VuIFBSTyBDDQog ICAgY29tcGlsZXJzLiAocGFydGlhbGx5IHJldmVydCBbMjAyNF0pLiAoVMO1aXZvIExlZWRqw6Ry diBhbmQgS29uc3RhbnRpbg0KICAgIFJvbWFub3YsIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIs IFPDqWJhc3RpZW4gSGluZGVyZXIgYW5kIFhhdmllcg0KICAgIExlcm95KQ0KDQoNClsxMDA2M10g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAwNjM+DQoNClsyMDI0XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8yMDI0Pg0KDQoNCkRvY3VtZW50 YXRpb24NCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBb OTc1NV06IE1hbnVhbDogcG9zdC1wcm9jZXNzaW5nIHRoZSBodG1sIGdlbmVyYXRlZCBieSBvY2Ft bGRvYyBhbmQNCiAgICBoZXZlYS4gSW1wcm92ZW1lbnRzIG9uIGRlc2lnbiBhbmQgbmF2aWdhdGlv biwgaW5jbHVkaW5nIGEgbW9iaWxlDQogICAgdmVyc2lvbiwgYW5kIGEgcXVpY2stc2VhcmNoIGZ1 bmN0aW9uYWxpdHkgZm9yIHRoZSBBUEkuIChTYW4gVsWpIE5n4buNYywNCiAgICByZXZpZXcgYnkg RGF2aWQgQWxsc29wcCBhbmQgRmxvcmlhbiBBbmdlbGV0dGkpDQoNCiAg4oCiIFsxMDE0Ml0sIFsx MDE1NF06IGltcHJvdmVkIHJlbmRlcmluZyBhbmQgbGF0ZXggY29kZSBmb3IgdG9wbGV2ZWwNCiAg ICBjb2RlIGV4YW1wbGVzLiAoRmxvcmlhbiBBbmdlbGV0dGksIHJlcG9ydCBieSBKb2huIFdoaXRp bmd0b24sIHJldmlldw0KICAgIGJ5IEdhYnJpZWwgU2NoZXJlcikNCg0KDQpbOTc1NV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvOTc1NT4NCg0KWzEwMTQyXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDE0Mj4NCg0KWzEwMTU0XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDE1ND4NCg0KDQpPQ2FtbCBPZmZpY2Ug SG91cnM/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1s LW9mZmljZS1ob3Vycy83MTMyLzk+DQoNCg0KRGVlcCBpbiB0aGlzIHRocmVhZCwgT3JiaWZ4IHNh aWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFuZCB0aGVy ZSBpcyBYTVBQOiA8eG1wcDpvY2FtbEBjb25mZXJlbmNlLm9yYml0YWxmb3guZXU/am9pbj4NCg0K DQpUaW1lcmUgMC4xLjMgLSBEZWFsaW5nIHdpdGggdGltZSBhbmQgdGltZSB6b25lcyBoYXZlIG5l dmVyIGJlZW4gZWFzaWVyDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10aW1lcmUt MC0xLTMtZGVhbGluZy13aXRoLXRpbWUtYW5kLXRpbWUtem9uZXMtaGF2ZS1uZXZlci1iZWVuLWVh c2llci83MTczLzE+DQoNCg0KRGFycmVuIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBoYXBweSB0byBhbm5vdW5jZSBm aXJzdCByZWxlYXNlIG9mIFtUaW1lcmVdLCBhIHRpbWUgaGFuZGxpbmcgYW5kDQogIHJlYXNvbmlu ZyBsaWJyYXJ5LCB3aGljaCBARHJ1cCBhbmQgSSBoYXZlIGJlZW4gd29ya2luZyBvbiByZWNlbnRs eS4NCg0KDQpbVGltZXJlXSA8aHR0cHM6Ly9naXRodWIuY29tL2RheXBhY2stZGV2L3RpbWVyZT4N Cg0KRXhhbXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIENocmlzdG1hc2VzIHdo aWNoIGZhbGwgb24gV2VkbmVzZGF5IGZyb20gbm93DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg bGV0ICgpID0NCiAg4pSCICAgbGV0IG9wZW4gVGltZXJlIGluDQogIOKUgiAgIG1hdGNoDQogIOKU giAgICAgcmVzb2x2ZSAoDQogIOKUgiAgICAgICBhZnRlciAoRGF0ZV90aW1lLm5vdyAoKSkNCiAg 4pSCICAgICAgICYgbW9udGhzIFtgRGVjXQ0KICDilIIgICAgICAgJiBkYXlzIFsyNV0NCiAg4pSC ICAgICAgICYgd2Vla2RheXMgW2BXZWRdDQogIOKUgiAgICAgKQ0KICDilIIgICB3aXRoDQogIOKU giAgIHwgRXJyb3IgbXNnIC0+IGZhaWx3aXRoIG1zZw0KICDilIIgICB8IE9rIHMgLT4NCiAg4pSC ICAgICBGbXQucHIgIiVhQC4iIChwcF9pbnRlcnZhbHMgfnNlcDooRm10LmFueSAiQC4iKSAoKSkg cw0KICDilJTilIDilIDilIDilIANCiAgZ2l2ZXMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBb MjAyNCBEZWMgMjUgMDA6MDA6MDAgKzAwOjAwOjAwLCAyMDI0IERlYyAyNiAwMDowMDowMCArMDA6 MDA6MDApDQogIOKUgiBbMjAzMCBEZWMgMjUgMDA6MDA6MDAgKzAwOjAwOjAwLCAyMDMwIERlYyAy NiAwMDowMDowMCArMDA6MDA6MDApDQogIOKUgiBbMjA0MSBEZWMgMjUgMDA6MDA6MDAgKzAwOjAw OjAwLCAyMDQxIERlYyAyNiAwMDowMDowMCArMDA6MDA6MDApDQogIOKUgiBbMjA0NyBEZWMgMjUg MDA6MDA6MDAgKzAwOjAwOjAwLCAyMDQ3IERlYyAyNiAwMDowMDowMCArMDA6MDA6MDApDQogIOKU giBbMjA1MiBEZWMgMjUgMDA6MDA6MDAgKzAwOjAwOjAwLCAyMDUyIERlYyAyNiAwMDowMDowMCAr MDA6MDA6MDApDQogIOKUgiBbMjA1OCBEZWMgMjUgMDA6MDA6MDAgKzAwOjAwOjAwLCAyMDU4IERl YyAyNiAwMDowMDowMCArMDA6MDA6MDApDQogIOKUgiAuLi4NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgU2VlIFtoZXJlXSBmb3IgbW9yZSBleGFtcGxlcw0KDQoNCltoZXJlXSA8aHR0cHM6Ly9naXRo dWIuY29tL2RheXBhY2stZGV2L3RpbWVyZS90cmVlL21haW4vZXhhbXBsZXM+DQoNCg0KRmVhdHVy ZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBUaW1lc3RhbXAgYW5kIGRhdGUg dGltZSBoYW5kbGluZyB3aXRoIHBsYXRmb3JtIGluZGVwZW5kZW50IHRpbWUgem9uZQ0KICAgIHN1 cHBvcnQNCiAgICDigKIgU3Vic2V0IG9mIHRoZSBJQU5BIHRpbWUgem9uZSBkYXRhYmFzZSBpcyBi dWlsdCBpbnRvIHRoaXMgbGlicmFyeQ0KICDigKIgUmVhc29uaW5nIG92ZXIgdGltZSBpbnRlcnZh bHMgdmlhIHRpbWVyZSBvYmplY3RzL2V4cHJlc3Npb25zLA0KICAgIGV4YW1wbGVzOg0KICAgIOKA oiBQYXR0ZXJuIG1hdGNoaW5nIHRpbWUgYW5kIGludGVydmFscy4gVGhlc2Ugd29yayBhY3Jvc3Mg RFNUDQogICAgICBib3VuZGFyaWVzLg0KICAgIOKAoiBJbnRlcnNlY3Rpb24gYW5kIHVuaW9uDQog ICAg4oCiIENodW5raW5nIGF0IHllYXIgb3IgbW9udGggYm91bmRhcnksIG9yIGluIGZpeGVkIHNp emVzDQogICAg4oCiIEV2YWx1YXRlIChzdWIpZXhwcmVzc2lvbnMgd2l0aCBhIGRpZmZlcmVudCB0 aW1lIHpvbmUNCiAgICAgIChlLmcuIGludGVyc2VjdGlvbiBvZiA5YW0gdG8gNXBtIG9mIFN5ZG5l eSBhbmQgOWFtIHRvIDVwbSBvZiBOZXcNCiAgICAgIFlvcmspDQoNCg0KTGlua3MNCuKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBSZXBvOiA8aHR0cHM6Ly9naXRodWIuY29tL2RheXBhY2stZGV2L3Rp bWVyZT4NCiAg4oCiIEFQSSBkb2M6DQogICAgPGh0dHBzOi8vZGF5cGFjay1kZXYuZ2l0aHViLmlv L3RpbWVyZS90aW1lcmUvVGltZXJlL2luZGV4Lmh0bWw+DQoNCg0KSW50ZXJlc3RpbmcgT0NhbWwg QXJ0aWNsZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50ZXJlc3Rpbmctb2NhbWwtYXJ0aWNsZXMvMTg2Ny85Mj4N Cg0KDQpZYXdhciBBbWluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTm90IHByaW1hcmlseSBhIHByb2dy YW1taW5nIGFydGljbGUgYnV0IEkgdGhvdWdodCB0aGlzIGlzIGFuDQogIGludGVyZXN0aW5nIGV4 Y2VwdGlvbiBiZWNhdXNlIGl0IG1heSBiZSB0aGUgZmlyc3QgdGltZSBPQ2FtbCBoYXMgYmVlbg0K ICBtZW50aW9uZWQgaW4gdGhlIEZpbmFuY2lhbCBUaW1lczoNCiAgPGh0dHBzOi8vd3d3LmZ0LmNv bS9jb250ZW50LzgxODExZjI3LTRhOGYtNDk0MS05OWIzLTI3NjJjYWU3NjU0Mj4NCg0KDQpqc29u LWRhdGEtZW5jb2RpbmcgMC45DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1qc29uLWRhdGEtZW5jb2RpbmctMC05LzcxNTcvMj4NCg0K DQpSYXBoYcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhh bGYgb2YgTm9tYWRpYyBMYWJzLCBpdCBpcyBteSBwbGVhc3VyZSB0byByZWxlYXNlDQogIGpzb24t ZGF0YS1lbmNvZGluZy4wLjkuMS4gVGhlIGNvZGUgb2YgdGhpcyBwYWNrYWdpbmctZml4IHJlbGVh c2UgaXMNCiAgaWRlbnRpY2FsIHRvIHRoZSByZWNlbnQganNvbi1kYXRhLWVuY29kaW5nLjAuOSBi dXQgdGhlIGxpY2Vuc2UNCiAgaW5mb3JtYXRpb24gaGFzIGJlZW4gY29ycmVjdGVkLg0KDQogIFRo ZSBwcmV2aW91cyByZWxlYXNlIGhhZCBfTEdQTCB3aXRoIGxpbmtpbmcgZXhjZXB0aW9uXyBoZWFk ZXJzIGluIHRoZQ0KICBzb3VyY2UgZmlsZXMsIExJQ0VOU0UgZmlsZSBpbiB0aGUgcmVwb3NpdG9y eSwgYW5kIGxpY2Vuc2UgZmllbGQgaW4gdGhlDQogIG9wYW0gZmlsZS4gSG93ZXZlciwgdGhlIGNv ZGUgd2FzIGFjdHVhbGx5IHVuZGVyIE1JVCBhcyBwZXIgYWdyZWVtZW50DQogIG9mIHRoZSBjb3B5 cmlnaHQgaG9sZGVycy4gUmVsZWFzZSAwLjkuMSBoYXMgdGhlIGNvcnJlY3QgbGljZW5zZQ0KICBo ZWFkZXJzLCBMSUNFTlNFIGZpbGUgYW5kIGxpY2Vuc2UgZmllbGQgaW4gdGhlIG9wYW0gZmlsZXMu DQoNCiAgVGhlIGNvZGUgb2YgMC45LzAuOS4xIGlzIGluIGR1YWwgbGljZW5zZS4gRnV0dXJlIHJl bGVhc2VzIHdpbGwgYmUNCiAgdW5kZXIgTUlUIGxpY2Vuc2Ugb25seS4NCg0KDQpvY2FtbGVhcmx5 YmlyZCAxLjAuMCBiZXRhMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxlYXJseWJpcmQtMS0wLTAtYmV0 YTEvNzE4MC8xPg0KDQoNCuaWh+Wuh+elpSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBwbGVhc2VkIHRvIGFubm9uY2Ug dGhhdCBbb2NhbWxlYXJseWJpcmRdIDEuMC4wfmJldGExIGp1c3QNCiAgcmVsZWFzZWQuICBXaWxs IHNvb24gYmUgYXZhaWxhYmxlIG9uIG9wYW0uDQoNCiAgVGhpcyBpcyBhIGJpZyBzdGVwIHRoYXQg d2UgdG93YXJkIDEuMC4wLiBXZSBzb2x2ZWQgbG90cyBvZiBpc3N1ZXMgYW5kDQogIHRlc3RlZCB3 aXRoIHJlYWx5IG9jYW1sIHByb2plY3RzIHN1Y2ggYXMgdXRvcCwgb2NhbWxmb3JtYXQsIGFuZCBz bw0KICBvbi4gQW5kIGNlcnRhaW5seSwgaXQgY2FuIGRlYnVnIG9jYW1sZWFybHliaXJkIGl0c2Vs Zi4NCg0KICBUcnkgeW91cnNlbGYhDQoNCg0KW29jYW1sZWFybHliaXJkXSA8aHR0cHM6Ly9naXRo dWIuY29tL2hhY2t3YWx5L29jYW1sZWFybHliaXJkPg0KDQpOT1RFUy4NCuKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBOZXcgdmVyc2lvbiBvbmx5IHN1cHBvcnQgT0NhbWwgNC4xMS4gSWYgeW91 IG5lZWQgb3RoZXIgdmVyc2lvbnMNCiAgICBzdXBwb3J0LCBwbGVhc2UgbGV0IG1lIGtub3cuDQog IOKAoiBEdW5lLXJlbGVhc2UgZG8gbm90IHN1cHBvcnQgYDEuMC4wfmJldGExJyB2ZXJzaW9uIHN0 cmluZy4gU28gd2UNCiAgICByZWxlYXNlZCAxLjAuMCBhcyAxLjAuMH5iZXRhMSBvbiBvcGFtLg0K DQoNCktOT1dOIElTU1VFUzoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIOKAoiBDb250aW51ZSBydW4gY29tbWFuZCBtYXkgaGl0IG9uIGxhc3QgcmVtb3ZlZCBi cmVha3BvaW50IG9uY2Ugd2hlbg0KICAgIGRlYnVnIHV0b3AuDQoNCg0K5paH5a6H56WlDQrilIDi lIDilIDilIDilIDilIANCg0KICBTaW5jZSB0aGUgcG9zdCBoYXMgZWRpdGVkIG92ZXIgMyB0aW1l cy4gSSBjYW4ndCBlZGl0IGl0IGFueXdheS4gSQ0KICB1cGxvYWRlZCBkZW1vIHZpZGVvIGhlcmU6 DQoNCiAgW0RlYnVnIHV0b3BdDQoNCg0KW0RlYnVnIHV0b3BdDQo8aHR0cHM6Ly9tZWRpYS5naXRo dWJ1c2VyY29udGVudC5jb20vbWVkaWEvaGFja3dhbHkvb2NhbWxlYXJseWJpcmQvbWFzdGVyL19h c3NldHMvdXRvcC53ZWJwPg0KDQoNCkNtZGxpbmVyIGNoZWF0c2hlZXQNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY21kbGluZXItY2hlYXRzaGVldC83MTg1LzE+ DQoNCg0KTWFydGluIEphbWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFzIGEgZm9s bG93LXVwIHRvIFthbiBlYXJsaWVyIGNvbnZlcnNhdGlvbl0sIEkgbWFkZSBhIFtjaGVhdHNoZWV0 IGFuZA0KICBhIHRlbXBsYXRlXSBmb3IgdXNpbmcgY21kbGluZXIgYnkgQGRidWVuemxpLiBJdCB3 YXMgZG9uZSBxdWlja2x5IGFuZCBJDQogIGRvbid0IGtub3cgZXZlcnl0aGluZyBhYm91dCBjbWRs aW5lciwgc28gcGxlYXNlIGxldCBtZSBrbm93IGlmIHlvdSBzZWUNCiAgbWlzdGFrZXMuDQoNCg0K W2FuIGVhcmxpZXIgY29udmVyc2F0aW9uXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93 aGF0LWFyZS1zb21lLWxpYnJhcmllcy15b3UtYWxtb3N0LWFsd2F5cy11c2UvNzE2NS8xNz91PW1q YW1ib24+DQoNCltjaGVhdHNoZWV0IGFuZCBhIHRlbXBsYXRlXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9tamFtYm9uL2NtZGxpbmVyLWNoZWF0c2hlZXQ+DQoNCg0KQ2hyaXN0aWFuIExpbmRpZyB0aGVu IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEdvb2QgdG8gc2VlIHRoaXMuIEkgYmVs aWV2ZSBhIGNvbW1vbiB1c2UgY2FzZSBpcyB0byBhZGQgYXJlIHN1Yg0KICBjb21tYW5kcyBhcyBw b3B1bGFyaXNlZCBieSBgZ2l0Jy4gSXQgbG9va3MgbGlrZSB0aGlzIGluIG15IGNvZGU6DQoNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgQyA9IENtZGxpbmVyDQogIOKUgiANCiAg4pSC IGxldCByZXBvcnQgPQ0KICDilIIgICBsZXQgZG9jID0gImdlbmVyYXRlIEhUTUwgb3IgSlNPTiBy ZXBvcnQgZm9yIGFuIG91dGluZyIgaW4NCiAg4pSCICAgbGV0IG1hbiA9IC4uICAgaW4NCiAg4pSC ICAgQy5UZXJtLg0KICDilIIgICAgIChyZXQgKGNvbnN0IG1ha2UgJCBjb21tb25fb3B0aW9ucyAk IGpzb24gJCBwYXRoKSwgaW5mbyAicmVwb3J0IiB+ZG9jIH5tYW4pDQogIOKUgiANCiAg4pSCIGxl dCBkZWZhdWx0ID0NCiAg4pSCICAgbGV0IGhlbHAgPSBgSGVscCAoYFBhZ2VyLCBOb25lKSBpbg0K ICDilIIgICBsZXQgZG9jID0gIkdQUyBhbmFseXNpcyBmb3Igcm93ZXJzIiBpbg0KICDilIIgIEMu VGVybS4ocmV0IEBAIGNvbnN0IGhlbHAsIGluZm8gImVpZ2h0cGx1cyIgfmRvYyB+bWFuKQ0KICDi lIIgDQogIOKUgiBsZXQgY21kcyA9IFsgZXhwb3J0OyByZXBvcnQ7IHRvcHNwZWVkOyBkZWJ1Zzsg c3VtbWFyeTsgaGVscCBdDQogIOKUgiBsZXQgbWFpbiAoKSA9IEMuVGVybS4oZXZhbF9jaG9pY2Ug ZGVmYXVsdCBjbWRzIHw+IGV4aXQpDQogIOKUgiBsZXQgKCkgPSBpZiAhU3lzLmludGVyYWN0aXZl IHRoZW4gKCkgZWxzZSBtYWluICgpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCk1hcnRpbiBKYW1i b24gbGF0ZXIgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBqdXN0IGFkZGVkIGEgZGVtby90 ZW1wbGF0ZSBmb3Igc3ViY29tbWFuZCBoYW5kbGluZy4gVGhlcmUgYXJlIG5vdw0KICBbdHdvIGRl bW8gcHJvZ3JhbXNdLiBPbmUgaXMgZm9jdXNlZCBvbiB0aGUgZGlmZmVyZW50IGtpbmRzIG9mDQog IGFyZ3VtZW50cyBhbmQgdGhlIG90aGVyIG9uZSBvbiBzdWJjb21tYW5kcy4NCg0KDQpbdHdvIGRl bW8gcHJvZ3JhbXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL21qYW1ib24vY21kbGluZXItY2hlYXRz aGVldC90cmVlL21haW4vc3JjPg0KDQoNClNob24gYWxzbyByZXBsaWVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbiB0aGlzIHNhbWUg dmVpbiwgSSd2ZSBiZWVuIGNvbXBpbGluZyAiZXhlY3V0YWJsZSBub3RlcyIgd2hlbmV2ZXIgSQ0K ICBmaW5kIG15c2VsZiBuZWVkaW5nIGEgY2VydGFpbiBDbWRsbmVyIHJlY2lwZS4gSSB0b29rIHRv b2sgdGhlc2UgcmVjZW50DQogIGRpc2N1c3Npb24gYXMgYW4gb2NjYXNpb24gdG8gZG9jdW1lbnQg dGhlIG1vZHVsZSBhIGJpdDoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9zaG9uZmVkZXIva3dkY21k Pg0KDQogIFRoZSBhaW0gaXMgdG8gcHJvdmlkZSAic2VsZi1kb2N1bWVudGluZyIgY29uc3RydWN0 b3JzIHRoYXQgZW5jb2RlIHRoZQ0KICBjb21wb3NpdGlvbiBvZiBjb21tb24gQ0xJIHRlcm1zIGlu dG8gbW9kdWxlIG5hbWVzcGFjZXMsIGxhYmVsZWQgYXJncywNCiAgYW5kIHR5cGUgYWxpYXNlcy4g VGhlIGhvcGUgYmVpbmcgdGhhdCBJIGNhbiBoYXZlIHRoZSB0eXBlIHNpZ25hdHVyZSBvZg0KICBh IGNvbWJpbmF0b3IgZ2l2ZSBtZSBhbGwgdGhlIGhpbnRzIEkgbmVlZCB0byBhdm9pZCBoYXZpbmcg dG8gbG9vayB1cA0KICB0aGUgZG9jdW1lbnRhdGlvbiBldmVyeSB0aW1lIDpsYXVnaGluZzoNCg0K ICBJdCdzIGp1c3QgYSB2ZXJ5IHJvdWdoIChhbmQgcXVpdGUgaW1wZXJmZWN0KSBjb2xsZWN0aW9u IG9mIGlkaW9tcyBJJ3ZlDQogIGZvdW5kIHVzZWZ1bCwgYnV0IGl0IGNvdWxkIGJlIHdvcnRoIGEg bG9vayEgIFdoZW4gaSBnZXQgYSBjaGFuY2UsIEkNCiAgaG9wZSB0byBsb29rIHRocm91Z2ggeW91 ciBjaGVhdCBzaGVldCB0byBtYWtlIHN1cmUgSSBoYXZlIGENCiAgcmVwcmVzZW50YXRpdmUgY29u c3RydWN0b3IgZm9yIGVhY2ggaWRpb20geW91J3ZlIGRvY3VtZW50ZWQuDQoNCg0KY29udGFpbmVy cyAzLjINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0yLzcx OTYvMT4NCg0KDQpTaW1vbiBDcnVhbmVzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdt IGhhcHB5IHRvIGFubm91bmNlIHRoYXQgY29udGFpbmVycyAzLjIgaGFzIGp1c3QgYmVlbiBbcmVs ZWFzZWRdLiBJdA0KICBzaG91bGQgYXJyaXZlIG9uIG9wYW0gc29vbi4gSXQgbm90YWJseSBjb250 YWlucyBhbiBgRWl0aGVyJw0KICBjb21wYXRpYmlsaXR5IHdyYXBwZXIsIG1vcmUgZm9ybWF0dGlu ZyBmdW5jdGlvbnMsIGxpc3QgZnVuY3Rpb25zLCBhbmQNCiAgYSBidW5jaCBvZiBmaXhlcy4gTWFu eSB0aGFua3MgdG8gQGRhcnJlbmxkbCBmb3IgY29udHJpYnV0aW5nIHNvbWUNCiAgaW5pdGlhbCBm dXp6aW5nIHN1cHBvcnQuDQoNCg0KW3JlbGVhc2VkXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1 YmUvb2NhbWwtY29udGFpbmVycy9yZWxlYXNlcy90YWcvdjMuMj4NCg0KDQpPQ2FtbCBDYWbDqTog VGh1LCBGZWIgMTEgQCA3cG0gKFUuUy4gQ2VudHJhbCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY2FmZS10aHUt ZmViLTExLTdwbS11LXMtY2VudHJhbC83MTk3LzE+DQoNCg0KQ2xhdWRlIEphZ2VyLVJ1Ymluc29u IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSm9p biB1cyB3aXRoIHlvdXIgcXVlc3Rpb25zIGFib3V0IHRoZSBPQ2FtbCBsYW5ndWFnZSwgb3IganVz dCB0byBoYW5nDQogIG91dCB3aXRoIHRoZSBPQ2FtbCBjb21tdW5pdHkuIEVzcGVjaWFsbHkgZ2Vh cmVkIHRvd2FyZCBuZXcgYW5kDQogIGludGVybWVkaWF0ZSB1c2VycywgZXhwZXJpZW5jZWQgT0Nh bWwgZGV2ZWxvcGVycyB3aWxsIGJlIGF2YWlsYWJsZSB0bw0KICBhbnN3ZXIgeW91ciBxdWVzdGlv bnMgYWJvdXQgdGhlIGxhbmd1YWdlIGFuZCBlY29zeXN0ZW0uDQoNCiAgV2hldGhlciB5b3XigJly ZSBzdGlsbCB0cnlpbmcgdG8gbWFrZSBzZW5zZSBvZiBjdXJyeWluZyBvciBjYW4gc3BvdA0KICBu b24tdGFpbC1yZWN1cnNpdmUgY29kZSBmcm9tIGFjcm9zcyB0aGUgcm9vbSwgd2UgaG9wZSB0aGF0 IHlvdeKAmWxsIGpvaW4NCiAgdXMgb24gVGh1cnNkYXksIEZlYnJ1YXJ5IDExIGF0IDdwbSAoVS5T LiBDZW50cmFsIHRpbWUpLiBNZWV0aW5nIGluZm8NCiAgYW5kIGFkZGl0aW9uYWwgZGV0YWlscyBj YW4gYmUgZm91bmQgYXQgW2h0dHBzOi8vaGZwdWcub3JnXS4NCg0KDQpbaHR0cHM6Ly9oZnB1Zy5v cmddIDxodHRwczovL2hmcHVnLm9yZz4NCg0KDQpEZXBlbmRlbmN5IGdyYXBoIG9mIHNvbWUgT0Nh bWwgc291cmNlIGZpbGVzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2RlcGVuZGVuY3ktZ3JhcGgtb2Ytc29tZS1vY2FtbC1zb3Vy Y2UtZmlsZXMvNzE5OC82Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIEp1biBGVVJVU0Ugc2Fp ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgWW91IG1heSBiZSBpbnRlcmVzdGVkIGluIFtjbWdyYXBoXSB3aGljaCBzY3JhcGVzIHRoZSBj b21waWxlZCBtb2R1bGVzDQogIChgKi5jbWkvKi5jbW8vKi5jbXgnKSBpbnN0ZWFkIG9mIHRoZSBz b3VyY2UgY29kZS4gIEl0IG5lZWRzIG5vDQogIGNvbXBpbGF0aW9uIHN3aXRjaCBvcHRpb25zIHNp bmNlIGl0IGRvZXMgbm90IHNjcmFwZSBzb3VyY2UgY29kZS4NCg0KDQpbY21ncmFwaF0gPGh0dHBz Oi8vZ2l0bGFiLmNvbS9jYW1sc3BvdHRlci9jbWdyYXBoPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9t IHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVk IGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKAoiBbUmVjZW50IGFuZCB1cGNvbWluZyBjaGFuZ2Vz IHRvIE1lcmxpbl0NCiAg4oCiIFtUaGUgcm9hZCBhaGVhZCBmb3IgTWlyYWdlT1MgaW4gMjAyMV0N CiAg4oCiIFtSZWxlYXNlIG9mIEFsdC1FcmdvIDIuNC4wXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIDxo dHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvPg0KDQpbUmVjZW50IGFuZCB1cGNvbWlu ZyBjaGFuZ2VzIHRvIE1lcmxpbl0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyMS0wMS0y Ni1yZWNlbnQtYW5kLXVwY29taW5nLWNoYW5nZXMtdG8tbWVybGluPg0KDQpbVGhlIHJvYWQgYWhl YWQgZm9yIE1pcmFnZU9TIGluIDIwMjFdIDxodHRwczovL2hhbm5lcy5ucXNiLmlvL1Bvc3RzL05H ST4NCg0KW1JlbGVhc2Ugb2YgQWx0LUVyZ28gMi40LjBdDQo8aHR0cHM6Ly93d3cub2NhbWxwcm8u Y29tLzIwMjEvMDEvMjIvcmVsZWFzZS1vZi1hbHQtZXJnby0yLTQtMC8+DQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUN CiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3 ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNj aG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5 dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHls bC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 26 to Februar= y 02, 2021.

release 0.2.2 of ppx_deriving_encoding

levillain.maxime announced

Following the release of json-data-encoding.0.9, I am happy to announce the release of ppx_deriving_encoding.0.2.2.

The code source and some documentation is available on gitlab, and the package can be installed with opam (opam install ppx_deriving_enc= oding).

This ppx allows to derive encoding of json-data-encoding library from most = of ocaml types.

Have fun!

OCaml 4.12.0, second beta release

octachron announced

The release of OCaml 4.12.0 is on the horizon. We have created a new beta version to help you adapt your software to the new features ahead of the re= lease.

Compared to the first beta release, this new release contains one fix for t= he Thread library (for a race condition on Windows), and experimentally re-ena= bles building the compiler on illumos and Oracle Solaris.

We are expecting this beta to be the last one before the release.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

Happy hacking,

– Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.12.0~beta2 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-reposit=
ory.git

If you want to tweak the configuration of the compiler, you can pick config= uration options with

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.12.0~b=
eta2+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and afl enabled switch:

opam switch create 4.12.0~beta2+flambda+afl
--packages=3Docaml-variants.4.12.0~beta2+options,ocaml-option-flambda,ocaml=
-option-afl
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

All available options can be listed with "opam search ocaml-option".

The source code is available at these addresses:

If you want to test this version, you may want to install the alpha opam re= pository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-ka=
te/opam-alpha-repository.git

This alpha repository contains various packages patched with fixes in the process of being upstreamed. Once the repository installed, these patched packages will take precedence over the non-patched version.

Changes from the first beta

Thread library
  • additional fixes 9757, 98= 46, +10161:= check proper ownership when operating over mutexes. Now, unlocking a mutex= held by another thread or not locked at all reliably raises a Sys_error ex= ception. Before, it was undefined behavior, but the documentation did not = say so. Likewise, locking a mutex already locked by the current thread reli= ably raises a Sys_error exception. Before, it could deadlock or succeed (a= nd do recursive locking), depending on the OS. (Xavier Leroy, report by Gui= llaume Munch-Maccagnoni, review by Guillaume Munch-Maccagnoni, David Allsop= p, and Stephen Dolan)
Build system
  • 10063: (Re-= )enable building on illumos (SmartOS, OmniOS, …) and Oracle Solaris;= x86_64/GCC and 64-bit SPARC/Sun PRO C compilers. (partially revert 2024). (T=C3=B5ivo Leed= j=C3=A4rv and Konstantin Romanov, review by Gabriel Scherer, S=C3=A9bastien= Hinderer and Xavier Leroy)
Documentation
  • 9755: Manual= : post-processing the html generated by ocamldoc and hevea. Improvements on= design and navigation, including a mobile version, and a quick-search func= tionality for the API. (San V=C5=A9 Ng=E1=BB=8Dc, review by David Allsopp a= nd Florian Angeletti)
  • 10142, 10154: improved ren= dering and latex code for toplevel code examples. (Florian Angeletti, repor= t by John Whitington, review by Gabriel Scherer)

OCaml Office Hours?

Deep in this thread, Orbifx said

And there is XMPP: <xmpp:ocaml@conference.orbitalfox.eu?join>

Timere 0.1.3 - Dealing with time and time zones have never bee= n easier

Darren announced

I am happy to announce first release of Timere, a time handling and reasoning library, which @Drup and I have been working on recently.

Examples

Christmases which fall on Wednesday from now

let () =3D
  let open Timere i=
n
  match
    resolve (
      after (Date_time.now ())
      & months [`Dec]
      & days [25]
      & weekdays [`Wed]
    )
  with
  | Error=
 msg -> failwith msg
  | Ok s =
->
    Fmt.pr "%a@." (pp_intervals ~sep:(Fmt.any "@.") ()) s

gives

[2024 Dec 25 00:00:00 +00:00:00, 2024 Dec 26 00:00:00 +00:00:00)
[2030 Dec 25 00:00:00 +00:00:00, 2030 Dec 26 00:00:00 +00:00:00)
[2041 Dec 25 00:00:00 +00:00:00, 2041 Dec 26 00:00:00 +00:00:00)
[2047 Dec 25 00:00:00 +00:00:00, 2047 Dec 26 00:00:00 +00:00:00)
[2052 Dec 25 00:00:00 +00:00:00, 2052 Dec 26 00:00:00 +00:00:00)
[2058 Dec 25 00:00:00 +00:00:00, 2058 Dec 26 00:00:00 +00:00:00)
...

See he= re for more examples

Features

  • Timestamp and date time handling with platform independent time zone su= pport
    • Subset of the IANA time zone database is built into this library
  • Reasoning over time intervals via timere objects/expressions, examples:
    • Pattern matching time and intervals. These work across DST boundaries.<= /li>
    • Intersection and union
    • Chunking at year or month boundary, or in fixed sizes
    • Evaluate (sub)expressions with a different time zone (e.g. intersection= of 9am to 5pm of Sydney and 9am to 5pm of New York)

Interesting OCaml Articles

Yawar Amin announced

Not primarily a programming article but I thought this is an interesting ex= ception because it may be the first time OCaml has been mentioned in the Financial Times: https://www.ft.com/conten= t/81811f27-4a8f-4941-99b3-2762cae76542

json-data-encoding 0.9

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, it is my pleasure to release json-data-encoding.= 0.9.1. The code of this packaging-fix release is identical to the recent json-data-encoding.0.9 but the license i= nformation has been corrected.

The previous release had LGPL with linking except= ion headers in the source files, LICENSE file in the repository, and license field in the opam file. However, the code was actually under MI= T as per agreement of the copyright holders. Release 0.9.1 has the correct license headers, LICENSE file and li= cense field in the opam files.

The code of 0.9/0.9.1 is in dual license. Future releases will be under MIT= license only.

ocamlearlybird 1.0.0 beta1

=E6=96=87=E5=AE=87=E7=A5=A5 announced

I'm pleased to annonce that ocamlearlybird 1.0.0~beta1 just released. Will soon be available on opam.

This is a big step that we toward 1.0.0. We solved lots of issues and teste= d with realy ocaml projects such as utop, ocamlformat, and so on. And certainly, it can debug ocamlearlybird itself.

Try yourself!

NOTES.

  • New version only support OCaml 4.11. If you need other versions support= , please let me know.
  • Dune-release do not support 1.0.0~beta1 version string. So= we released 1.0.0 as 1.0.0~beta1 on opam.

KNOWN ISSUES:

  • Continue run command may hit on last removed breakpoint once when debug= utop.

=E6=96=87=E5=AE=87=E7=A5=A5

Since the post has edited over 3 times. I can't edit it anyway. I uploaded = demo video here:

Debug utop

Cmdliner cheatsheet

Martin Jambon announced

As a follow-up to an earlier conversation, I made a cheatsheet and a= template for using cmdliner by @dbuenzli. It was done quickly and I don't know everything about cmdliner, so please let me k= now if you see mistakes.

Christian Lindig then said

Good to see this. I believe a common use case is to add are sub commands as= popularised by git. It looks like this in my code:

module C =3D Cmdliner

let report =3D
  let doc =3D "genera=
te HTML or JSON report for an outing" in
  let man =3D ..   in
  C.Term.
    (ret (const make $ common_option=
s $ json $ path), info "report" ~=
doc ~man)

let default =3D
  let help =3D `Help (`Pager, None) in
  let doc =3D "GPS an=
alysis for rowers" C.Term.(ret @@ const help, info "eightp=
lus" ~doc ~man)

let cmds =3D [ export; report; topspeed; debug; sum=
mary; help ]
let main () =3D C.T=
erm.(eval_choice default cmds |><=
/span> exit)
let () =3D if !Sys.interactive then () else mai=
n ()

Martin Jambon later said

I just added a demo/template for subcommand handling. There are now two demo programs. One is focused on the different kinds of arguments and the other one on subcommands.

Shon also replied

In this same vein, I've been compiling "executable notes" whenever I find m= yself needing a certain Cmdlner recipe. I took took these recent discussion as an occasion to document the module a b= it: https://github.com/shon= feder/kwdcmd

The aim is to provide "self-documenting" constructors that encode the compo= sition of common CLI terms into module namespaces, labeled args, and type aliases. The hope being that I can have = the type signature of a combinator give me all the hints I need to avoid having to look up the documentation every tim= e :laughing:

It's just a very rough (and quite imperfect) collection of idioms I've foun= d useful, but it could be worth a look! When i get a chance, I hope to look through your cheat sheet to make sure I= have a representative constructor for each idiom you've documented.

containers 3.2

Simon Cruanes announced

I'm happy to announce that containers 3.2 has just been re= leased. It should arrive on opam soon. It notably contains an Either compatibility wrapper, more formatting func= tions, list functions, and a bunch of fixes. Many thanks to @darrenldl for contributing some initial fuzzing support.

OCaml Caf=C3=A9: Thu, Feb 11 @ 7pm (U.S. Central)

Claude Jager-Rubinson announced

Join us with your questions about the OCaml language, or just to hang out w= ith the OCaml community. Especially geared toward new and intermediate users, experienced OCaml developers will be ava= ilable to answer your questions about the language and ecosystem.

Whether you=E2=80=99re still trying to make sense of currying or can spot n= on-tail-recursive code from across the room, we hope that you=E2=80=99ll join us on Thursday, February 11 at 7pm (U.S. Cent= ral time). Meeting info and additional details can be found at https://hfpug.org.

Dependency graph of some OCaml source files

Deep in this thread, Jun FURUSE said

You may be interested in cmgraph which scrapes the compiled modules (*.cmi/*.cmo/*.cmx) instead of the source code. It needs no c= ompilation switch options since it does not scrape source code.

Other OCaml News

From the ocamlcore planet blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 914B4E0210 for ; Tue, 16 Feb 2021 14:53:47 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.81,183,1610406000"; d="scan'208,217";a="373225640" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Feb 2021 14:53:46 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 16 Feb 2021 14:53:46 +0100 Message-ID: <87sg5wt8yd.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 09 to 16, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.0.8 release opam 2.1.0~beta4 Set up OCaml 1.1.6 Set up OCaml 1.1.7 Old CWN opam 2.0.8 release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: R. Boujbel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the minor release of [opam 2.0.8]. This new version contains some fixes, mainly for sandbox and fish scripts. You can find more information in this [blog post], and more detailed in the [release note]. /opam is a source-based package manager for OCaml. It supports multiple simultaneous compiler installations, flexible package constraints, and a Git-friendly development workflow./ [opam 2.0.8] [blog post] [release note] opam 2.1.0~beta4 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David Allsopp announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the opam team, it gives me great pleasure to announce the third beta release of opam 2.1. Don=E2=80=99t worry, you didn=E2=80=99t m= iss beta3 - we had an issue with a configure script that caused beta2 to report as beta3 in some instances, so we skipped to beta4 to avoid any further confusion! We encourage you to try out this new beta release: there are instructions for doing so in [our wiki]. The instructions include taking a backup of your `~/.opam' root as part of the process, which can be restored in order to wind back. _Please note that local switches which are written to by opam 2.1 are upgraded and will need to be rebuilt if you go back to opam 2.0_. This can either be done by removing `_opam' and repeating whatever you use in your build process to create the switch, or you can use `opam switch export switch.export' to backup the switch to a file before installing new packages. Note that opam 2.1 _shouldn=E2=80=99t_ upgrade a local switch u= nless you upgrade the base packages (i.e. the compiler). [our wiki] What=E2=80=99s new in opam 2.1? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Switch invariants =E2=80=A2 Improved options configuration (see the new `option' and expand= ed `var' sub-commands) =E2=80=A2 Integration of system dependencies (formerly the opam-depext plugin), increasing their reliability as it integrates the solving step =E2=80=A2 Creation of lock files for reproducible installations (formerly= the opam-lock plugin) =E2=80=A2 CLI versioning, allowing cleaner deprecations for opam now and = also improvements to semantics in future without breaking backwards-compatibility =E2=80=A2 Performance improvements to opam-update, conflict messages, and= many other areas =E2=80=A2 New plugins: opam-compiler and opam-monorepo Switch invariants =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84 In opam 2.0, when a switch is created the packages selected are put into the =E2=80=9Cbase=E2=80=9D of the switch. These packages are not nor= mally considered for upgrade, in order to ease pressure on opam=E2=80=99s solver. This was a much bigger concern early on in opam 2.0=E2=80=99s development, but is less of a problem with the default mccs solver. However, it=E2=80=99s a problem for system compilers. opam would detect t= hat your system compiler version had changed, but be unable to upgrade the ocaml-system package unless you went through a slightly convoluted process with `--unlock-base'. In opam 2.1, base packages have been replaced by switch invariants. The switch invariant is a package formula which must be satisfied on every upgrade and install. All existing switches=E2=80=99 ba= se packages could just be expressed as `package1 & package2 & package3' etc. but opam 2.1 recognises many existing patterns and simplifies them, so in most cases the invariant will be `"ocaml-base-compiler" {=3D 4.11.1}', etc. This means that `opam switch create my_switch ocaml-system' now creates a _switch invariant_ of `"ocaml-system"' rather than a specific version of the `ocaml-system' package. If your system OCaml package is updated, `opam upgrade' will seamlessly switch to the new package. This also allows you to have switches which automatically install new point releases of OCaml. For example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create ocaml-4.11 --formula=3D'"ocaml-base-compiler= " {>=3D "4.11.0" & < "4.12.0~"}' =E2=94=82 --repos=3Dold=3Dgit+https://github.com/ocaml/opam-repository#a1= 1299d81591 =E2=94=82 opam install utop =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Creates a switch with OCaml 4.11.0 (the `--repos=3D' was just to select a version of opam-repository from before 4.11.1 was released). Now issue: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam repo set-url old git+https://github.com/ocaml/opam-reposit= ory =E2=94=82 opam upgrade =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and opam 2.1 will automatically offer to upgrade OCaml 4.11.1 along with a rebuild of the switch. There=E2=80=99s not yet a clean CLI for specifying the formula, but we intend to iterate further on this with future opam releases so that there is an easier way of saying =E2=80=9Cin= stall OCaml 4.11.x=E2=80=9D. opam depext integration =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 opam has long included the ability to install system dependencies automatically via the [depext plugin]. This plugin has been promoted to a native feature of opam 2.1.0 onwards, giving the following benefits: =E2=80=A2 You no longer have to remember to run `opam depext', opam always checks depexts (there are options to disable this or automate it for CI use). Installation of an opam package in a CI system is now as easy as `opam install .', without having to do the dance of `opam pin add -n/depext/install'. Just one command now for the common case! =E2=80=A2 The solver is only called once, which both saves time and also stabilises the behaviour of opam in cases where the solver result is not stable. It was possible to get one package solution for the `opam depext' stage and a different solution for the `opam install' stage, resulting in some depexts missing. =E2=80=A2 opam now has full knowledge of depexts, which means that packag= es can be automatically selected based on whether a system package is already installed. For example, if you have *neither* MariaDB nor MySQL dev libraries installed, `opam install mysql' will offer to install `conf-mysql' and `mysql', but if you have the MariaDB dev libraries installed, opam will offer to install `conf-mariadb' and `mysql'. [depext plugin] opam lock files and reproducibility =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84 When opam was first released, it had the mission of gathering together scattered OCaml source code to build a [community repository]. As time marches on, the size of the opam repository has grown tremendously, to over 3000 unique packages with over 18000 unique versions. opam looks at all these packages and is designed to solve for the best constraints for a given package, so that your project can keep up with releases of your dependencies. While this works well for libraries, we need a different strategy for projects that need to test and ship using a fixed set of dependencies. To satisfy this use-case, opam 2.0.0 shipped with support for _using_ `project.opam.locked' files. These are normal opam files but with exact versions of dependencies. The lock file can be used as simply as `opam install . --locked' to have a reproducible package installation. With opam 2.1.0, the creation of lock files is also now integrated into the client: =E2=80=A2 `opam lock' will create a `.locked' file for your current switc= h and project, that you can check into the repository. =E2=80=A2 `opam switch create . --locked' can be used by users to reprodu= ce your dependencies in a fresh switch. This lets a project simultaneously keep up with the latest dependencies (without lock files) while providing a stricter set for projects that need it (with lock files). [community repository] CLI Versioning =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 A new `--cli' switch was added to the first beta release, but it=E2=80=99s only now that it=E2=80=99s being widely used. opam is a complex enough sy= stem that sometimes bug fixes need to change the semantics of some commands. For example: =E2=80=A2 `opam show --file' needed to change behaviour =E2=80=A2 The addition of new controls for setting global variables means= that the `opam config' was becoming cluttered and some things want to move to `opam var' =E2=80=A2 `opam switch create 4.11.1' still works in opam 2.0, but it=E2= =80=99s really an OPAM 1.2.2 syntax. Changing the CLI is exceptionally painful since it can break scripts and tools which themselves need to drive `opam'. CLI versioning is our attempt to solve this. The feature is inspired by the `(lang dune ...)' stanza in `dune-project' files which has allowed the Dune project to rename variables and alter semantics without requiring every single package using Dune to upgrade their `dune' files on each release. Now you can specify which version of opam you expected the command to be run against. In day-to-day use of opam at the terminal, you wouldn=E2=80=99t specify it, and you=E2=80=99ll get the latest version of= the CLI. For example: `opam var --global' is the same as `opam var --cli=3D2.1 --global'. However, if you issue `opam var --cli=3D2.0 --global', you will told that `--global' was added in 2.1 and so is not available to you. You can see similar things with the renaming of `opam upgrade --unlock-base' to `opam upgrade --update-invariant'. The intention is that `--cli' should be used in scripts, user guides (e.g. blog posts), and in software which calls opam. The only decision you have to take is the _oldest_ version of opam which you need to support. If your script is using a new opam 2.1 feature (for example `opam switch create --formula=3D') then you simply don=E2=80=99t support = opam 2.0. If you need to support opam 2.0, then you can=E2=80=99t use `--formu= la' and should use `--packages' instead. opam 2.0 does not have the `--cli' option, so for opam 2.0 instead of `--cli=3D2.0' you should set the environment variable `OPAMCLI' to `2.0'. As with _all_ opam command line switches, `OPAMCLI' is simply the equivalent of `--cli' which opam 2.1 will pick-up but opam 2.0 will quietly ignore (and, as with other options, the command line takes precedence over the environment). Note that opam 2.1 sets `OPAMCLI=3D2.0' when building packages, so on the rare instances where you need to use the `opam' command in a _package_ `build:' command (or in your build system), you _must_ specify `--cli=3D2.1' if you=E2=80=99re using new features. There=E2=80=99s even more detail on this feature [in our wiki]. We=E2=80= =99re still finalising some details on exactly how `opam' behaves when `--cli' is not given, but we=E2=80=99re hoping that this feature will make it much e= asier in future releases for opam to make required changes and improvements to the CLI without breaking existing set-ups and tools. [in our wiki] What=E2=80=99s new since the last beta? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 opam now uses CLI versioning ([#4385]) =E2=80=A2 opam now exits with code 31 if all failures were during fetch operations ([#4214]) =E2=80=A2 `opam install' now has a `--download-only' flag ([#4036]), allo= wing opam=E2=80=99s caches to be primed =E2=80=A2 `opam init' now advises the correct shell-specific command for = `eval $(opam env)' ([#4427]) =E2=80=A2 `post-install' hooks are now allowed to modify or remove instal= led files ([#4388]) =E2=80=A2 New package variable `opamfile-loc' with the location of the installed package opam file ([#4402]) =E2=80=A2 `opam update' now has `--depexts' flag ([#4355]), allowing the system package manager to update too =E2=80=A2 depext support NetBSD and DragonFlyBSD added ([#4396]) =E2=80=A2 The format-preserving opam file printer has been overhauled ([#3993], [#4298] and [#4302]) =E2=80=A2 pins are now fetched in parallel ([#4315]) =E2=80=A2 `os-family=3Dubuntu' is now treated as `os-family=3Ddebian' ([#= 4441]) =E2=80=A2 `opam lint' now checks that strings in filtered package formula= e are booleans or variables ([#4439]) and many other bug fixes as listed [on the release page]. [#4385] [#4214] [#4036] [#4427] [#4388] [#4402] [#4355] [#4396] [#3993] [#4298] [#4302] [#4315] [#4441] [#4439] [on the release page] New Plugins =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C Several features that were formerly plugins have been integrated into opam 2.1.0. We have also developed some _new_ plugins that satisfy emerging workflows from the community and the core OCaml team. They are available for use with the opam 2.1 beta as well, and feedback on them should be directed to the respective GitHub trackers for those plugins. opam compiler =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 The [`opam compiler'] plugin can be used to create switches from various sources such as the main opam repository, the ocaml-multicore fork, or a local development directory. It can use Git tag names, branch names, or PR numbers to specify what to install. Once installed, these are normal opam switches, and one can install packages in them. To iterate on a compiler feature and try opam packages at the same time, it supports two ways to reinstall the compiler: either a safe and slow technique that will reinstall all packages, or a quick way that will just overwrite the compiler in place. [`opam compiler'] opam monorepo =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 The [`opam monorepo'] plugin lets you assemble standalone dune workspaces with your projects and all of their opam dependencies, letting you build it all from scratch using only Dune and OCaml. This satisfies the =E2=80=9Cmonorepo=E2=80=9D workflow which is commonly reque= sted by large projects that need all of their dependencies in one place. It is also being used by projects that need global cross-compilation for all aspects of a codebase (including C stubs in packages), such as the MirageOS unikernel framework. [`opam monorepo'] Next Steps =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C This is anticipated to be the final beta in the 2.1 series, and we will be moving to release candidate status after this. We could really use your help with testing this release in your infrastructure and projects and let us know if you run into any blockers. If you have feature requests, please also report them on [our issue tracker] =E2=80= =93 we will be planning the next release cycle once we ship opam 2.1.0 shortly. [our issue tracker] Set up OCaml 1.1.6 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release includes a change to make the OCaml CI workflow on Windows faster! I tested this on one of my repos where the build itself is mere seconds. Before this change, setup-ocaml needed an average of 5:39 to install OCaml+opam and 1:53 to build the dependencies of the library. After this change, it needs an average of 3:15 for the installation and 1:27 for the deps. Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Windows installs Cygwin to `D:\cygwin', using faster Azure temp= orary storage. Set up OCaml 1.1.7 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Ubuntu and macOS runners no longer display "No switch is curren= tly installed." before building the compiler. =E2=80=A2 Ubuntu no longer installs the system ocaml packages. =E2=80=A2 macOS no longer builds two compilers on every run. =E2=80=A2 Upgrade opam to 2.0.8 for Linux VMs. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 09 to 16, 20= 21.

opam 2.0.8 release

R. Boujbel announced

We are pleased to announce the minor release of opam 2.0.8.

This new version contains some fixes, mainly for sandbox and fish scripts. = You can find more information in this blog post, and more = detailed in the release note.

opam is a source-based package manager for OCaml. It supports multiple s= imultaneous compiler installations, flexible package constraints, and a Git= -friendly development workflow.

opam 2.1.0~beta4

David Allsopp announced

On behalf of the opam team, it gives me great pleasure to announce the thir= d beta release of opam 2.1. Don=E2=80=99t worry, you didn=E2=80=99t miss beta3 - we had an issue with a configure script tha= t caused beta2 to report as beta3 in some instances, so we skipped to beta4 to avoid any further confusion!

We encourage you to try out this new beta release: there are instructions f= or doing so in our wiki. The instructions include taking a backup of your ~/.opam root as part of the process, which can be restore= d in order to wind back. Please note that local switches which are written to by opam 2.1 are upgraded and will need to be = rebuilt if you go back to opam 2.0. This can either be done by removing _opam and repeating whatever yo= u use in your build process to create the switch, or you can use opam switch export switch.export to backup the swi= tch to a file before installing new packages. Note that opam 2.1 shouldn=E2=80=99t upgrade a = local switch unless you upgrade the base packages (i.e. the compiler).

What=E2=80=99s new in opam 2.1?

  • Switch invariants
  • Improved options configuration (see the new option and exp= anded var sub-commands)
  • Integration of system dependencies (formerly the opam-depext plugin), i= ncreasing their reliability as it integrates the solving step
  • Creation of lock files for reproducible installations (formerly the opa= m-lock plugin)
  • CLI versioning, allowing cleaner deprecations for opam now and also imp= rovements to semantics in future without breaking backwards-compatibility
  • Performance improvements to opam-update, conflict messages, and many ot= her areas
  • New plugins: opam-compiler and opam-monorepo
Switch invariants

In opam 2.0, when a switch is created the packages selected are put into th= e =E2=80=9Cbase=E2=80=9D of the switch. These packages are not normally considered for upgrade, in order to ease pressure on opam=E2= =80=99s solver. This was a much bigger concern early on in opam 2.0=E2=80=99s development, but is less of a problem with the def= ault mccs solver.

However, it=E2=80=99s a problem for system compilers. opam would detect tha= t your system compiler version had changed, but be unable to upgrade the ocaml-system package unless you went through a slight= ly convoluted process with --unlock-base.

In opam 2.1, base packages have been replaced by switch invariants. The swi= tch invariant is a package formula which must be satisfied on every upgrade and install. All existing switches=E2=80= =99 base packages could just be expressed as package1 & package2 & package3 etc. but opam 2.1 recog= nises many existing patterns and simplifies them, so in most cases the invariant will be "ocaml-base-compiler" {=3D 4.11.1}= , etc. This means that opam switch create my_switch ocaml-system now creates a switch invarian= t of "ocaml-system" rather than a specific version of t= he ocaml-system package. If your system OCaml package is updated,= opam upgrade will seamlessly switch to the new package.

This also allows you to have switches which automatically install new point= releases of OCaml. For example:

opam switch create ocaml-4.11 --formula=3D'"ocaml-base-compiler" {>=3D "=
4.11.0" & < "4.12.0~"}'
--repos=3Dold=3Dgit+https://github.com/ocaml/opam-repository#a11299d81591
opam install utop

Creates a switch with OCaml 4.11.0 (the --repos=3D was just to= select a version of opam-repository from before 4.11.1 was released). Now issue:

opam repo set-url old git+https://github.com/ocaml/opam-repository
opam upgrade

and opam 2.1 will automatically offer to upgrade OCaml 4.11.1 along with a = rebuild of the switch. There=E2=80=99s not yet a clean CLI for specifying the formula, but we intend to iterate further on t= his with future opam releases so that there is an easier way of saying =E2=80=9Cinstall OCaml 4.11.x=E2=80=9D.

opam depext integration

opam has long included the ability to install system dependencies automatic= ally via the depext plugin. This plugin has been promoted to a native feature of opam 2.1.0 onwards, giving the following benefits:

  • You no longer have to remember to run opam depext, opam al= ways checks depexts (there are options to disable this or automate it for C= I use). Installation of an opam package in a CI system is now as easy as opam install ., without having to do the dance of opam pin= add -n/depext/install. Just one command now for the common case!
  • The solver is only called once, which both saves time and also stabilis= es the behaviour of opam in cases where the solver result is not stable. It= was possible to get one package solution for the opam depext = stage and a different solution for the opam install stage, res= ulting in some depexts missing.
  • opam now has full knowledge of depexts, which means that packages can b= e automatically selected based on whether a system package is already insta= lled. For example, if you have neither MariaDB nor MySQL dev librari= es installed, opam install mysql will offer to install c= onf-mysql and mysql, but if you have the MariaDB dev li= braries installed, opam will offer to install conf-mariadb and= mysql.
CLI Versioning

A new --cli switch was added to the first beta release, but it= =E2=80=99s only now that it=E2=80=99s being widely used. opam is a complex enough system that sometimes bug fixes need to change the semantics= of some commands. For example:

  • opam show --file needed to change behaviour
  • The addition of new controls for setting global variables means that th= e opam config was becoming cluttered and some things want to m= ove to opam var
  • opam switch create 4.11.1 still works in opam 2.0, but it= =E2=80=99s really an OPAM 1.2.2 syntax.

Changing the CLI is exceptionally painful since it can break scripts and to= ols which themselves need to drive opam. CLI versioning is our attempt to solve this. The feature is inspired by the= (lang dune ...) stanza in dune-project files which has allowed the Dune project to renam= e variables and alter semantics without requiring every single package using Dune to upgrade their dune files on= each release.

Now you can specify which version of opam you expected the command to be ru= n against. In day-to-day use of opam at the terminal, you wouldn=E2=80=99t specify it, and you=E2=80=99ll get the l= atest version of the CLI. For example: opam var --global is the same as opam var --cli=3D2.1 --global. However, if you = issue opam var --cli=3D2.0 --global, you will told that --global was added in 2.1 and so is not available to you. You = can see similar things with the renaming of opam upgrade --unlock-base to opam upgrade --update-invariant.

The intention is that --cli should be used in scripts, user gu= ides (e.g. blog posts), and in software which calls opam. The only decision you have to take is the o= ldest version of opam which you need to support. If your script is using a new opam 2.1 feature (for example opam switch create --formul= a=3D) then you simply don=E2=80=99t support opam 2.0. If you need to support opam 2.0, then you can=E2=80=99t use --formula and should use --packages instead. opam 2.0 does not have the --cli option, so for opam 2.0 instead of --cli= =3D2.0 you should set the environment variable OPAMCLI = to 2.0. As with all opam command= line switches, OPAMCLI is simply the equivalent of --cl= i which opam 2.1 will pick-up but opam 2.0 will quietly ignore (and, as with other options, the c= ommand line takes precedence over the environment).

Note that opam 2.1 sets OPAMCLI=3D2.0 when building packages, = so on the rare instances where you need to use the opam command in a package build: command (or in your build system), you must specify --cli=3D2.1 if you=E2=80=99re using new features.

There=E2=80=99s even more detail on this feature in our wiki. We=E2=80=99re still finalising some details on exactly how opam behaves when --cli is not given,= but we=E2=80=99re hoping that this feature will make it much easier in future releases for opam to make required changes and improvements to the C= LI without breaking existing set-ups and tools.

What=E2=80=99s new since the last beta?

  • opam now uses CLI versioning (#4385)
  • opam now exits with code 31 if all failures were during fetch operation= s (#4214)
  • opam install now has a --download-only flag (= #4036), allowing = opam=E2=80=99s caches to be primed
  • opam init now advises the correct shell-specific command f= or eval $(opam env) (#4427)
  • post-install hooks are now allowed to modify or remove ins= talled files (#4388= )
  • New package variable opamfile-loc with the location of the= installed package opam file (#4402)
  • opam update now has --depexts flag (#4355), allowing the sys= tem package manager to update too
  • depext support NetBSD and DragonFlyBSD added (#4396)
  • The format-preserving opam file printer has been overhauled (#3993, #4298 and #4302)
  • pins are now fetched in parallel (#4315)
  • os-family=3Dubuntu is now treated as os-family=3Ddeb= ian (#4441)<= /li>
  • opam lint now checks that strings in filtered package form= ulae are booleans or variables (#4439)

and many other bug fixes as listed on the release page.

New Plugins

Several features that were formerly plugins have been integrated into opam = 2.1.0. We have also developed some new plugins that satisfy emerging workflows from the community and the core OCa= ml team. They are available for use with the opam 2.1 beta as well, and feedback on them should be directed to the r= espective GitHub trackers for those plugins.

opam compiler

The opam comp= iler plugin can be used to create switches from various sources such as the main opam repository, the ocaml-multicore fork, or a lo= cal development directory. It can use Git tag names, branch names, or PR numbers to specify what to install.

Once installed, these are normal opam switches, and one can install package= s in them. To iterate on a compiler feature and try opam packages at the same time, it supports two ways to rei= nstall the compiler: either a safe and slow technique that will reinstall all packages, or a quick way that will j= ust overwrite the compiler in place.

opam monorepo

The opam monor= epo plugin lets you assemble standalone dune workspaces with your projects and all of their opam dependencies, letting you build it= all from scratch using only Dune and OCaml. This satisfies the =E2=80=9Cmonorepo=E2=80=9D workflow which is comm= only requested by large projects that need all of their dependencies in one place. It is also being used by projects that need glob= al cross-compilation for all aspects of a codebase (including C stubs in packages), such as the MirageOS unikernel fr= amework.

Next Steps

This is anticipated to be the final beta in the 2.1 series, and we will be = moving to release candidate status after this. We could really use your help with testing this release in your infra= structure and projects and let us know if you run into any blockers. If you have feature requests, please also report= them on our issue tracker – we will be planning the next release cycle once we shi= p opam 2.1.0 shortly.

Set up OCaml 1.1.6

Sora Morimoto announced

This release includes a change to make the OCaml CI workflow on Windows fas= ter!

I tested this on one of my repos where the build itself is mere seconds. Be= fore this change, setup-ocaml needed an average of 5:39 to install OCaml+opam and 1:53 to build the dependencies of= the library. After this change, it needs an average of 3:15 for the installation and 1:27 for the deps.

Changed

  • Windows installs Cygwin to D:\cygwin, using faster Azure t= emporary storage.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.6

Set up OCaml 1.1.7

Sora Morimoto announced

Changed

  • Ubuntu and macOS runners no longer display "No switch is currently inst= alled." before building the compiler.
  • Ubuntu no longer installs the system ocaml packages.
  • macOS no longer builds two compilers on every run.
  • Upgrade opam to 2.0.8 for Linux VMs.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.7

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id A0B44E01C3 for ; Tue, 23 Feb 2021 10:51:55 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.81,199,1610406000"; d="scan'208,217";a="373853812" Received: from clt-128-93-178-93.vpn.inria.fr (HELO set) ([128.93.178.93]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Feb 2021 10:51:18 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 23 Feb 2021 10:51:17 +0100 Message-ID: <87tuq3nmcq.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 16 to 23, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCamlFormat 0.17.0 Set up OCaml 1.1.8 Set up OCaml 1.1.9 OCaml 4.12.0, first release candidate Ppxlib.0.22: an update on the state of ppx OCaml-based trading firm is hiring remote devs ocamlearlybird 1.0.0 beta1 OCaml for ARM MacOS Old CWN OCamlFormat 0.17.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Guillaume Petiot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 On behalf of the OCamlFormat development team I am pleased to announce the release of [ocamlformat.0.17.0] :tada:. OCamlformat is an auto-formatter for OCaml code, writing the parse tree and comments in a consistent style, so that you do not have to worry about formatting it by hand, and to speed up code review by focusing on the important parts. OCamlFormat is beta software. We expect the program to change considerably before we reach version 1.0.0. In particular, upgrading the `ocamlformat' package will cause your program to get reformatted. Sometimes it is relatively pain-free, but sometimes it will make a diff in almost every file. We are working towards having a tool that pleases most usecases in the OCaml community, please bear with us! To make sure your project uses the last version of ocamlformat, please set =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 version=3D0.17.0 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 in your `.ocamlformat' file. Main changes in `ocamlformat.0.17.0' are: =E2=80=A2 the `let-open' option, deprecated since 0.16.0, has been removed =E2=80=A2 support for OCaml 4.06 and 4.07 has been removed, minimal versi= on requirement bumped to OCaml 4.08 =E2=80=A2 the `extension-sugar' option, deprecated since 0.14.0, has been removed =E2=80=A2 the syntax of infix set/get operators is now preserved (`String= .get' and similar calls used to be automatically rewritten to their corresponding infix form `.()', that was incorrect when using the `-unsafe' compilation flag. Now the concrete syntax of these calls is preserved) =E2=80=A2 all sugared extension points are now preserved =E2=80=A2 injectivity type annotations (OCaml 4.12 feature) are now suppo= rted =E2=80=A2 various fixes about comments positions We encourage you to try ocamlformat, that can be installed from opam directly ( `opam install ocamlformat' ), but please remember that it is still beta software. We have a [FAQ for new users ] that should help you decide if ocamlformat is the right choice for you. [ocamlformat.0.17.0] [FAQ for new users ] Set up OCaml 1.1.8 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 The Windows opam wrapper is fractionally less-archaically named opam.cmd, with no loss in arcaneness. =E2=80=A2 Export `CYGWIN_ROOT' on the Windows runners, allowing bash to be invoked as `%CYGWIN_ROOT%\bin\bash~/~$env:CYGWIN_ROOT\bin\bash' (and similarly for Cygwin `setup-x86_64.exe'). =E2=80=A2 The Windows runner no longer prepends `%CYGWIN_ROOT%\bin' to `P= ATH'. Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Switches in Unix are now properly initialized before running de= pext. Set up OCaml 1.1.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Further fix to switch initialisation. OCaml 4.12.0, first release candidate =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml 4.12.0 is expected next week. We have created a release candidate that you can test. Most opam packages should work with this release candidate (without the need for an alpha repository). Compared to the last beta, this new release only contains one fix for Solaris and illumos. If you find any bugs, please report them here: Happy hacking, =E2=80=93 Florian Angeletti for the OCaml team. Installation instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 4.12.0~rc1 --repositories=3Ddefault,beta=3Dg= it+https://github.com/ocaml/ocaml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you want to tweak the configuration of the compiler, you can pick configuration options with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create --packages=3Docaml-variants.4.= 12.0~rc1+options, =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a comma separated list of ocaml-option-* packages. For instance, for a flambda and afl enabled switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 4.12.0~rc1+flambda+afl --packages=3Docaml-va= riants.4.12.0~rc1+options,ocaml-option-flambda,ocaml-option-afl =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. The source code is available at these addresses: =E2=80=A2 =E2=80=A2 Ppxlib.0.22: an update on the state of ppx =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce the release of ppxlib.0.22.0, the fist release of ppxlib fully compatible with OCaml 4.12. The main and only feature of this release is the bump of the internal OCaml AST used by ppxlib from 4.11 to 4.12, allowing you to use 4.12 language features with ppxlib and any ppxlib-based ppx. Note that ppxlib was compatible with the 4.12 compiler since 0.19.0 but that you couldn't use 4.12 language features until now. This is the third such AST bump release since we announced our plan to improve the state of the PPX ecosystem [here] and we though it'd be a good time to report back to you and tell you how things are going on this front. For those of you who aren't familiar with this plan, the goal is to upstream a minimal, stable, ocaml-migrate-parsetree-like API on top of the compiler-libs called `Astlib'. It will allow us to keep ppxlib and any ppx based on ppxlib compatible with OCaml trunk at all time. To allow better performances and a clear compisition semantic, all the ppxlib-based ppx-es need to use the same AST (as opposed to ocaml-migrate-parsetree based ppx-es) so from a certain perspective, this plan simply moves the breaking API up one step, from compiler-libs to ppxlib. In order to greatly ease the maintainenance of ppx-es and to prevent opam-universe splits we decided that everytime we cut a breaking ppxlib release, we will send patches to keep the existing ppx-es compatible with the latest version and therefore with the latest OCaml compilers and language features. While this seems like a tremendous task and a huge amount of work, dune and other tools that raised in its wake such as [opam-monorepo] incredibly simplified this kind of work. Ahead of OCaml releases, we prepare a branch of ppxlib with the upgraded AST. We then fetch opam-repository to gather a list of sensible reverse dependencies (i.e. packages whose latest version depends on ppxlib and is compatible with ppxlib's latest version) and assemble a dune workspace with a clone of each of those reverse dependencies, our ppxlib branch and all of their dependencies thanks to opam-monorepo. We then use dune to build all the packages we're interested in and simply follow the compilation errors until everything builds successfully with the new ppxlib. What remains is to create PRs on the relevant repositories to upstream those changes, after which maintainers have everything they need to cut a new compatible release. Most of this process is automated using scripts but it still requires a bit of handiwork. We aim at extracting tools to further improve this workflow and reduce the time and effort required but it has been surprisingly smooth. Our experience with the 4.10, 4.11 and 4.12 upgrades so far is that most reverse dependencies don't need an upgrade and that it's far less demanding for one person to upgrade all the packages that need it than it would be for each individual maintainers to understand the changes in the AST and do the upgrade themselves. It's worth noting that for this to work well, the ppx-es and all their dependencies have to build with dune. We do maitain a separate opam-repository with dune ports of commonly used packages so in practice most projects fall into this category but a few exceptions remain and they are therefore not taken into account for this upgrade process. We're also trying to improve the tracking of the upgrade's progress and for the 4.12 compatible release we created a [github project] to have a list of all the packages we considered and see where they are. We also keep track of the packages we had to exclude and why. During this upgrade, we considered 80 opam packages, out of which only 4 needed to be patched and 6 had to be excluded from the process as we couldn't reasonably get them to build in our workspace. Once we have a better idea of what makes a package easy to upgrade we plan on releasing a set of reasonable rules to follow to benefit from those upgrades, we'll keep you updated on this! All in all we're pretty happy with this new process and although it needs to be refined, we're confident it can grow into something sustainable by creating tools and CI to support it. Hopefully these will also benefit the wider community and help grow a healthier Opam universe. [here] [opam-monorepo] [github project] Jason Nielsen asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Curious about the current status of `Astlib'. I was closely following [ppx] at one point but it hasn't seen much activity recently. Thanks for all your hard work. [ppx] J=C3=A9r=C3=A9mie Dimino =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's in progress. Not much happened in the past couple of months while we were finishing the port of a few projects to ppxlib and doing the 4.12 upgrade. But @pitag re-started working `Astlib' as of a week ago. You can follow our progression via [the public meeting notes]. Note however that the [ppx] project was for our original goal or providing a "forever stable" API for ppx rewriters. It has been in pause since August 2020 while were trying the "upgrade the world" method, which as @NathanReb pointed out is working pretty well practice. At this point, it's looking more and more likely that we won't resurect the ppx project. [the public meeting notes] [ppx] OCaml-based trading firm is hiring remote devs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Michael Bacarella announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 BTG is a trading firm founded by ex-Jane Street devs looking to hire some more devs. The role is primarily remote, working with the rest of our mostly remote team, though we hope to resume regular on-sites in Puerto Rico. We operate 24/7 and will consider employees anywhere in the world. Prior experience with OCaml is a plus, though any solid programming experience with an interest in functional programming and strong static types is also fine. Comfort navigating Linux is essential. Shoot me a message with a copy of your r=C3=A9sum=C3=A9 or C.V. to discus= s the opportunity further: [michael.bacarella@gmail.com] Feel free to re-post this elsewhere. [michael.bacarella@gmail.com] ocamlearlybird 1.0.0 beta1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: =E6=96=87=E5=AE=87=E7=A5=A5 announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi, all. All the issues of beta1 have been fixed. Beta2 will be released soon. OCaml for ARM MacOS =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Aaron L. Zeng announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I noticed that opam 2.08 is now available for ARM Macs using [Homebrew], and I was able to confirm on my machine. `brew install opam' away :) [Homebrew] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 16 to 23, 20= 21.

OCamlFormat 0.17.0

Guillaume Petiot announced

On behalf of the OCamlFormat development team I am pleased to announce the = release of ocamlformat.0.17.0= :tada:.

OCamlformat is an auto-formatter for OCaml code, writing the parse tree and= comments in a consistent style, so that you do not have to worry about formatting it by hand, and to speed up code = review by focusing on the important parts.

OCamlFormat is beta software. We expect the program to change considerably = before we reach version 1.0.0. In particular, upgrading the ocamlformat package will cause your = program to get reformatted. Sometimes it is relatively pain-free, but sometimes it will make a diff in almost every fil= e. We are working towards having a tool that pleases most usecases in the OCaml community, please bear with us!

To make sure your project uses the last version of ocamlformat, please set

version=3D0.17.0

in your .ocamlformat file.

Main changes in ocamlformat.0.17.0 are:

  • the let-open option, deprecated since 0.16.0, has been rem= oved
  • support for OCaml 4.06 and 4.07 has been removed, minimal version requi= rement bumped to OCaml 4.08
  • the extension-sugar option, deprecated since 0.14.0, has b= een removed
  • the syntax of infix set/get operators is now preserved (String.ge= t and similar calls used to be automatically rewritten to their corr= esponding infix form .(), that was incorrect when using the -unsafe compilation flag. Now the concrete syntax of these calls= is preserved)
  • all sugared extension points are now preserved
  • injectivity type annotations (OCaml 4.12 feature) are now supported
  • various fixes about comments positions

We encourage you to try ocamlformat, that can be installed from opam direct= ly ( opam install ocamlformat ), but please remember that it is still beta software. We have a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Set up OCaml 1.1.8

Sora Morimoto announced

Changed

  • The Windows opam wrapper is fractionally less-archaically named opam.cm= d, with no loss in arcaneness.
  • Export CYGWIN_ROOT on the Windows runners, allowing bash t= o be invoked as %CYGWIN_ROOT%\bin\bash~/~$env:CYGWIN_ROOT\bin\bash (and similarly for Cygwin setup-x86_64.exe).
  • The Windows runner no longer prepends %CYGWIN_ROOT%\bin to= PATH.

Fixed

  • Switches in Unix are now properly initialized before running depext.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.8

Set up OCaml 1.1.9

Sora Morimoto announced

Fixed

  • Further fix to switch initialisation.

https:/= /github.com/avsm/setup-ocaml/releases/tag/v1.1.9

OCaml 4.12.0, first release candidate

octachron announced

The release of OCaml 4.12.0 is expected next week. We have created a release candidate that you can test. Most opam packages should work with this relea= se candidate (without the need for an alpha repository).

Compared to the last beta, this new release only contains one fix for Solar= is and illumos.

If you find any bugs, please report them here: https://github.com/ocaml= /ocaml/issues

Happy hacking,

– Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.12.0~rc1 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-repositor=
y.git

If you want to tweak the configuration of the compiler, you can pick config= uration options with

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.12.0~r=
c1+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

where <option_list> is a comma separated list of ocaml-o= ption-* packages. For instance, for a flambda and afl enabled switch:

opam switch create 4.12.0~rc1+flambda+afl --pa=
ckages=3Docaml-variants.4.12.0~rc1+options,ocaml-option-flambda,ocaml-optio=
n-afl
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

All available options can be listed with opam search ocaml-option.

The source code is available at these addresses:

Ppxlib.0.22: an update on the state of ppx

Nathan Rebours announced

We're happy to announce the release of ppxlib.0.22.0, the fist release of p= pxlib fully compatible with OCaml 4.12. The main and only feature of this release is the bump of the internal OCaml= AST used by ppxlib from 4.11 to 4.12, allowing you to use 4.12 language features with ppxlib and an= y ppxlib-based ppx. Note that ppxlib was compatible with the 4.12 compiler since 0.19.0 but tha= t you couldn't use 4.12 language features until now.

This is the third such AST bump release since we announced our plan to impr= ove the state of the PPX ecosystem here and we though it'd be a good time to report back to you a= nd tell you how things are going on this front.

For those of you who aren't familiar with this plan, the goal is to upstrea= m a minimal, stable, ocaml-migrate-parsetree-like API on top of the compiler-libs called A= stlib. It will allow us to keep ppxlib and any ppx based on ppxlib compatible with OCaml trunk at a= ll time. To allow better performances and a clear compisition semantic, all the ppxl= ib-based ppx-es need to use the same AST (as opposed to ocaml-migrate-parsetree based ppx-es) so from a= certain perspective, this plan simply moves the breaking API up one step, from compiler-libs to ppxli= b. In order to greatly ease the maintainenance of ppx-es and to prevent opam-u= niverse splits we decided that everytime we cut a breaking ppxlib release, we will send patches to ke= ep the existing ppx-es compatible with the latest version and therefore with the latest OCaml compilers and language f= eatures.

While this seems like a tremendous task and a huge amount of work, dune and= other tools that raised in its wake such as = opam-monorepo incredibly simplified this kind of work.

Ahead of OCaml releases, we prepare a branch of ppxlib with the upgraded AS= T. We then fetch opam-repository to gather a list of sensible reverse dependencies (i.e. pac= kages whose latest version depends on ppxlib and is compatible with ppxlib's latest version) and assem= ble a dune workspace with a clone of each of those reverse dependencies, our ppxlib branch and all of= their dependencies thanks to opam-monorepo. We then use dune to build all the packages we're interested in and simply f= ollow the compilation errors until everything builds successfully with the new ppxlib. What remains is to create PRs on the relevant repositories to upstream thos= e changes, after which maintainers have everything they need to cut a new compatible release.

Most of this process is automated using scripts but it still requires a bit= of handiwork. We aim at extracting tools to further improve this workflow and reduce the time and e= ffort required but it has been surprisingly smooth. Our experience with the 4.10, 4.11 and 4.12 upgra= des so far is that most reverse dependencies don't need an upgrade and that it's far less dema= nding for one person to upgrade all the packages that need it than it would be for each individu= al maintainers to understand the changes in the AST and do the upgrade themselves.

It's worth noting that for this to work well, the ppx-es and all their depe= ndencies have to build with dune. We do maitain a separate opam-repository with dune ports of comm= only used packages so in practice most projects fall into this category but a few exceptions remain = and they are therefore not taken into account for this upgrade process.

We're also trying to improve the tracking of the upgrade's progress and for= the 4.12 compatible release we created a github project to have a list of all the packages we considered and see where they are. We also keep track of the packages we ha= d to exclude and why. During this upgrade, we considered 80 opam packages, out of which only 4 ne= eded to be patched and 6 had to be excluded from the process as we couldn't reasonably get them to b= uild in our workspace.

Once we have a better idea of what makes a package easy to upgrade we plan = on releasing a set of reasonable rules to follow to benefit from those upgrades, we'll keep you u= pdated on this!

All in all we're pretty happy with this new process and although it needs t= o be refined, we're confident it can grow into something sustainable by creating tools and CI t= o support it. Hopefully these will also benefit the wider community and help grow a healthier Opam = universe.

Jason Nielsen asked

Curious about the current status of Astlib. I was closely fol= lowing ppx at one point but it hasn't seen much activity recently. Thanks for all your hard = work.

J=C3=A9r=C3=A9mie Dimino

It's in progress. Not much happened in the past couple of months while we w= ere finishing the port of a few projects to ppxlib and doing the 4.12 upgrade. But @pitag re-started working A= stlib as of a week ago. You can follow our progression via the pu= blic meeting notes.

Note however that the ppx = project was for our original goal or providing a "forever stable" API for ppx rewriters. It has been in pause since August 2= 020 while were trying the "upgrade the world" method, which as @NathanReb pointed out is working pretty well pract= ice. At this point, it's looking more and more likely that we won't resurect the ppx project.

OCaml-based trading firm is hiring remote devs

Michael Bacarella announced

BTG is a trading firm founded by ex-Jane Street devs looking to hire some m= ore devs.

The role is primarily remote, working with the rest of our mostly remote te= am, though we hope to resume regular on-sites in Puerto Rico.

We operate 24/7 and will consider employees anywhere in the world.

Prior experience with OCaml is a plus, though any solid programming experie= nce with an interest in functional programming and strong static types is also fine.

Comfort navigating Linux is essential.

Shoot me a message with a copy of your r=C3=A9sum=C3=A9 or C.V. to discuss = the opportunity further: michael.bacarella@gmail.com<= /a>

Feel free to re-post this elsewhere.

ocamlearlybird 1.0.0 beta1

=E6=96=87=E5=AE=87=E7=A5=A5 announced

Hi, all. All the issues of beta1 have been fixed. Beta2 will be released so= on.

https://git= hub.com/ocaml/opam-repository/pull/18191

OCaml for ARM MacOS

Aaron L. Zeng announced

I noticed that opam 2.08 is now available for ARM Macs using Homebrew, and I was able to confirm on my machine.

brew install opam away :)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CA8EBE0171 for ; Tue, 9 Mar 2021 11:58:47 +0100 (CET) X-IronPort-AV: E=Sophos;i="5.81,234,1610406000"; d="scan'208,217";a="496918876" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Mar 2021 11:58:47 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 09 Mar 2021 11:58:45 +0100 Message-ID: <87wnugd256.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMDIgdG8gMDksDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCldvcmtpbmcg b24gYW4gYXBwIHRvIGxlYXJuIGFuZCBleGVjdXRlIE9DYW1sIG9uIGlQaG9uZS9pUGFkL01hYyBm b3IgYmVnaW5uZXJzDQpFUmljIChFbnRpdHktUmVsYXRpb24gaW50ZXJhY3RpdmUgY2FsY3VsYXRv cikgdmVyc2lvbiAwLjMNCk9DYW1sIENhZsOpOiBUdWUsIE1hcmNoIDkgQCA3LTlwbSAoQ1NUKQ0K RnVuY3Rpb25hbCBQcm9ncmFtbWluZyBVc2VyIFN0dWR5IChTcGVjaWZpY2FsbHkgaW4gT0NhbWwp DQpPQ2FtbCA0LjEyLjAgcmVsZWFzZWQgKHdpdGggNC4xMS4yIHRvbykNCk90aGVyIE9DYW1sIE5l d3MNCk9sZCBDV04NCg0KDQpXb3JraW5nIG9uIGFuIGFwcCB0byBsZWFybiBhbmQgZXhlY3V0ZSBP Q2FtbCBvbiBpUGhvbmUvaVBhZC9NYWMgZm9yIGJlZ2lubmVycw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93b3JraW5nLW9uLWFuLWFwcC10by1sZWFy bi1hbmQtZXhlY3V0ZS1vY2FtbC1vbi1pcGhvbmUtaXBhZC1tYWMtZm9yLWJlZ2lubmVycy83Mzky LzE+DQoNCg0KTmF0aGFuIEZhbGxldCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgc3Rh cnRlZCB0byB3b3JrIG9uIGEgbmV3IHByb2plY3QgcmVjZW50bHk6IE15IGdvYWwgaXMgdG8gcHJv dmlkZSBhbg0KICBpT1MgYXBwIGZvciBiZWdpbm5lcnMgdG8gbGVhcm4gT0NhbWwgYW5kIHByYWN0 aWNlIG9uIHRoZWlyIGRldmljZS4gIEkNCiAgdGhpbmsgaXQgaXMgYSBnb29kIGlkZWEgdG8gZ2V0 IHN0YXJ0ZWQgZWFzaWx5Lg0KDQogIEhlcmUgYXJlIHNvbWUgc2NyZWVuc2hvdHMgb2Ygd2hhdCBJ 4oCZdmUgZG9uZSBzbyBmYXI6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9z dGFuZGFyZDExL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2UvZWY2NmNmNjJkMWFiNjA1NTQy MDMzZjA5MDQwY2M5NjQ3ODdjYmI2NV8yXzQ2MngxMDAwLmpwZWc+DQoNCiAgSeKAmW0gb3BlbiB0 byBmZWVkYmFjayBhbmQgb3BpbmlvbiBhYm91dCB0aGlzIHByb2plY3QgaWRlYQ0KDQoNCk5hdGhh biBGYWxsZXQgdGhlbiBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBtYWRlIGl0IGF2YWls YWJsZSBmb3IgcHJlIG9yZGVyIG9uIHRoZSBBcHAgU3RvcmUgLSBJIHdpbGwga2VlcA0KICBpbXBy b3ZpbmcgaXQgd2l0aCB0aW1lLCBhbmQgSSB0aGluayBpdCBjYW4gYmUgYSBncmVhdCB0b29sIGZv cg0KICBiZWdpbm5lcnMNCg0KICBbaHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS9hcHAvb2NhbWwtbGVh cm4tY29kZS9pZDE1NDc1MDY4MjZdDQoNCg0KW2h0dHBzOi8vYXBwcy5hcHBsZS5jb20vYXBwL29j YW1sLWxlYXJuLWNvZGUvaWQxNTQ3NTA2ODI2XQ0KPGh0dHBzOi8vYXBwcy5hcHBsZS5jb20vYXBw L29jYW1sLWxlYXJuLWNvZGUvaWQxNTQ3NTA2ODI2Pg0KDQoNCllhd2FyIEFtaW4gcmVwbGllZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgVGhpcyBpcyByZWFsbHkgY29vbC4gSSBqdXN0IHdhbnQgdG8gcG9pbnQgb3V0IHRoYXQgeW91 ciBhcHAgaXMgdGhlDQogIHNvbGUgc2VhcmNoIHJlc3VsdCBmb3IgJ09DYW1sJyBpbiB0aGUgQXBw IFN0b3JlLiAgU28gdGhhdCdzIGEgZmlyc3QNCiAgOi0pDQoNCiAgSW5jaWRlbnRhbGx5LCB0aGVy ZSBpcyBhbiAnT0NhbWwgVG9wbGV2ZWwnIGFwcCBvbiB0aGUgQW5kcm9pZCBQbGF5DQogIFN0b3Jl Og0KICA8aHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRhaWxzP2lkPWZyLnZl cm5vdXgub2NhbWw+DQoNCiAgWW91ciBhcHAgbG9va3MgbW9yZSBzb3BoaXN0aWNhdGVkIHRob3Vn aC4gSG9wZWZ1bGx5IG9uZSBkYXkgd2UgaGF2ZQ0KICBzb21ldGhpbmcgbGlrZSBbU3dpZnQgUGxh eWdyb3VuZHNdIGFuZCBwZW9wbGUgY2FuIHN0YXJ0IGxlYXJuaW5nIE9DYW1sDQogIGludGVyYWN0 aXZlbHkgb24gdGhlaXIgZGV2aWNlcyBkaXJlY3RseS4NCg0KDQpbU3dpZnQgUGxheWdyb3VuZHNd IDxodHRwczovL3d3dy5hcHBsZS5jb20vY2Evc3dpZnQvcGxheWdyb3VuZHMvPg0KDQoNCkVSaWMg KEVudGl0eS1SZWxhdGlvbiBpbnRlcmFjdGl2ZSBjYWxjdWxhdG9yKSB2ZXJzaW9uIDAuMw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZXJpYy1lbnRp dHktcmVsYXRpb24taW50ZXJhY3RpdmUtY2FsY3VsYXRvci12ZXJzaW9uLTAtMy83NDA4LzE+DQoN Cg0KRGFtaWVuIEd1aWNoYXJkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhl IFtwcm9ncmFtbWluZyBsYW5ndWFnZXMgem9vXSBpcyBhIGdyZWF0IHJlc291cmNlIGZvciB3YW5u YS1iZQ0KICBpbnRlcnByZXRlci9jb21waWxlciB3cml0ZXJzLiBUaGUgW0lDRlAgMjAwMCBwcm9n cmFtbWluZyBjb250ZXN0XSBpcw0KICBhbm90aGVyIGdyZWF0IHJlc291cmNlIGZvciB3YW5uYS1i ZSByYXkgdHJhY2Vycy4gSG93ZXZlciB1bnRpbCBub3cNCiAgdGhlcmUgaGFzIGJlZW4gbm8gT0Nh bWwgcmVzb3VyY2UgZm9yIHdhbm5hLWJlIEtub3dsZWRnZSBSZXByZXNlbnRhdGlvbg0KICB0b29s LWVycy4gVGhpcyBtYWtlcyBzb3VuZCBsaWtlIEtSIHRvb2wgaXMgYSBtb3JlIGRpZmZpY3VsdCBh cmVhIHRoYW4NCiAgb3RoZXIgcHJvamVjdHMuIEVSaWMgdjAuMyBkZW1vbnN0cmF0ZXMgdGhlIG9w cG9zaXRlIGFzIGl0J3MgYWJvdXQgMTIwMA0KICBsaW5lcyBzaXplIChsZXhlciAmIGhhbmQtd3Jp dHRlbiBwYXJzZXIgaW5jbHVkZWQpIGFuZCByZWFkcy93cml0ZXMgYQ0KICBbQ29uY2VwdHVhbCBH cmFwaF0gSW50ZXJjaGFuZ2UgRm9ybWF0IChDR0lGKSBub3RhdGlvbi4NCg0KICDigKIgRVJpYyB2 MC4zIFtaaXAgYXJjaGl2ZV0NCiAg4oCiIEVSaWMgdjAuMyBbU1ZOIHJlcG9zaXRvcnldDQoNCg0K W3Byb2dyYW1taW5nIGxhbmd1YWdlcyB6b29dIDxodHRwOi8vcGx6b28uYW5kcmVqLmNvbS8+DQoN CltJQ0ZQIDIwMDAgcHJvZ3JhbW1pbmcgY29udGVzdF0NCjxodHRwczovL3d3dy5jcy5jb3JuZWxs LmVkdS9pY2ZwL2NvbnRlc3RfcmVzdWx0cy5odG0+DQoNCltDb25jZXB0dWFsIEdyYXBoXSA8aHR0 cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ29uY2VwdHVhbF9ncmFwaD4NCg0KW1ppcCBhcmNo aXZlXQ0KPGh0dHA6Ly9kYW1pZW4tZ3VpY2hhcmQuZGV2ZWxvcHBlei5jb20vZG93bmxvYWRzL0VS aWMtMC4zLnppcD4NCg0KW1NWTiByZXBvc2l0b3J5XSA8aHR0cDovL3N1YnZlcnNpb24uZGV2ZWxv cHBlei5jb20vcHJvamV0cy9FUmljL3RydW5rLz4NCg0KDQpPQ2FtbCBDYWbDqTogVHVlLCBNYXJj aCA5IEAgNy05cG0gKENTVCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3Qvb2NhbWwtY2FmZS10dWUtbWFyY2gtOS03LTlwbS1jc3QvNzQwOS8xPg0KDQoNCkNs YXVkZSBKYWdlci1SdWJpbnNvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFBsZWFzZSBqb2luIHVzIG5leHQgVHVlc2RheSBhdCA3cG0gQ2VudHJh bCB0aW1lIGZvciB0aGUgc2Vjb25kIG1lZXRpbmcNCiAgb2YgT0NhbWwgQ2Fmw6kuICBab29tIGNv bm5lY3Rpb24gaW5mbyBpcyBhdmFpbGFibGUgYXQgW0hvdXN0b24NCiAgRnVuY3Rpb25hbCBQcm9n cmFtbWVyc10uDQoNCiAgT0NhbWwgQ2Fmw6kgb2ZmZXJzIGEgZnJpZW5kbHksIGxvdyBzdGFrZXMg b3Bwb3J0dW5pdHkgdG8gYXNrIHF1ZXN0aW9ucw0KICBhYm91dCB0aGUgT0NhbWwgbGFuZ3VhZ2Ug YW5kIGVjb3N5c3RlbSwgd29yayB0aHJvdWdoIHByb2dyYW1taW5nDQogIHByb2JsZW1zIHRoYXQg eW914oCZcmUgc3R1Y2sgb24sIGFuZCBnZXQgZmVlZGJhY2sgb24geW91ciBjb2RlLg0KICBFc3Bl Y2lhbGx5IGdlYXJlZCB0b3dhcmQgbmV3IGFuZCBpbnRlcm1lZGlhdGUgdXNlcnMsIGV4cGVyaWVu Y2VkIE9DYW1sDQogIGRldmVsb3BlcnMgd2lsbCBiZSBhdmFpbGFibGUgdG8gYW5zd2VyIHlvdXIg cXVlc3Rpb25zLg0KDQogIFdoZXRoZXIgeW914oCZcmUgc3RpbGwgdHJ5aW5nIHRvIG1ha2Ugc2Vu c2Ugb2YgY3Vycnlpbmcgb3IgY2FuIHNwb3QNCiAgbm9uLXRhaWwtcmVjdXJzaXZlIGNvZGUgZnJv bSBhY3Jvc3MgdGhlIHJvb20sIHdlIGhvcGUgdGhhdCB5b3XigJlsbCBqb2luDQogIHVzIHdpdGgg eW91ciBxdWVzdGlvbnMgYWJvdXQgT0NhbWwsIG9yIGp1c3QgdG8gaGFuZyBvdXQgd2l0aCB0aGUg T0NhbWwNCiAgY29tbXVuaXR5Lg0KDQoNCltIb3VzdG9uIEZ1bmN0aW9uYWwgUHJvZ3JhbW1lcnNd IDxodHRwczovL2hmcHVnLm9yZz4NCg0KDQpGdW5jdGlvbmFsIFByb2dyYW1taW5nIFVzZXIgU3R1 ZHkgKFNwZWNpZmljYWxseSBpbiBPQ2FtbCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvZnVuY3Rpb25hbC1wcm9ncmFtbWluZy11c2VyLXN0dWR5LXNwZWNp ZmljYWxseS1pbi1vY2FtbC83NDEwLzE+DQoNCg0KQWhhbiBNYWxob3RyYSBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFdlIGFyZSBkb2luZyB1c2VyIHN0dWRpZXMgdG8gaGVscCB1cyB1bmRl cnN0YW5kIGhvdyB0byBoZWxwIHBlb3BsZQ0KICB1bmRlcnN0YW5kIGFuZCBuYXZpZ2F0ZSBjb21w bGV4IGluZm9ybWF0aW9uIGFib3V0IHByb2dyYW1taW5nDQogIGRvY3VtZW50YXRpb24sICpzcGVj aWZpY2FsbHkgaW4gT0NhbWwqLiBZb3Ugd2lsbCBjb21wbGV0ZSBhIHNlcmllcw0KICB0YXNrcyB0 aGF0IGhlbHAgdXMgdW5kZXJzdGFuZCB3b3JraW5nIG1lbW9yeSBhbmQgaG93IHlvdSBuYXZpZ2F0 ZSBhDQogIG5ldyBpbnRlcmZhY2UuIEFmdGVyIGV4YW1pbmluZyBhIGxheW91dCBvZiB0aGUgZGF0 YSAoaW50ZXJmYWNlKSBmb3IgYQ0KICBzaG9ydCwgcHJlZGV0ZXJtaW5lZCBhbW91bnQgb2YgdGlt ZSwgeW91IHdpbGwgYmUgYXNrZWQgYSBzZXQgb2YNCiAgY29tcHJlaGVuc2lvbiBhbmQvb3IgcXVh bGl0YXRpdmUgcXVlc3Rpb25zIHRvIG1lYXN1cmUgd2hldGhlciB0aGUNCiAgbWV0aG9kcyBvZiBw cmVzZW50aW5nIHRoaXMgaW5mb3JtYXRpb24gaGFzIGFueSBpbXBhY3Qgb24geW91cg0KICBwZXJm b3JtYW5jZS4NCg0KICAqVGhlIHN0dWR5IHdpbGwgdGFrZSBhcm91bmQgNTUgbWludXRlcywgYW5k IHlvdSB3aWxsIGJlIGVudGVyZWQgaW50byBhDQogIGxvdHRlcnkgZm9yIGEgJDE1MCBBbWF6b24g Z2lmdCBjYXJkIGFzIGNvbXBlbnNhdGlvbiBmb3IgeW91ciB0aW1lLioNCg0KICAqQSBiaXQgbW9y ZSBhYm91dCB0aGlzIHN0dWR5Kg0KDQogIFRoZSB1c2VyIHN0dWR5IHdpbGwgYmUgZG9uZSB2aXJ0 dWFsbHkgb24gWm9vbS4gWW91IHdpbGwgYmUgYXNrZWQgdG8NCiAgdmFyaW91cyB0YXNrcyB3aXRo IHRoZSBpbnRlcmZhY2UuIFRoZSBpbnRlcmZhY2UgaXMgZGVwbG95ZWQgYXMgYQ0KICBwdWJsaWMg d2ViIGFwcGxpY2F0aW9uIHNvIHlvdSBkb27igJl0IGhhdmUgdG8gaW5zdGFsbCBhbnl0aGluZy4g VGhpcw0KICByZXNlYXJjaCBpcyBnb3Zlcm5lZCBieSBIYXJ2YXJkIFVuaXZlcnNpdHkncyBDb21t aXR0ZWUgb24gdGhlIFVzZSBvZg0KICBIdW1hbiBTdWJqZWN0cy4NCg0KICAqRWxpZ2liaWxpdHkq DQoNCiAgWW91IGFsc28gZG9u4oCZdCBoYXZlIHRvIGJlIGFuIGV4cGVydCBpbiBhbnl0aGluZyB0 byBwYXJ0aWNpcGF0ZS4gWW91DQogIGp1c3QgbmVlZCB0byBiZSBmbHVlbnQgaW4gRW5nbGlzaCBh bmQgb3ZlciAxOCB5ZWFycyBvZiBhZ2UuDQoNCiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkLCBwbGVh c2UgZmlsbCBvdXQgdGhpcyBzdXJ2ZXkgdG8gY29uZmlybSB5b3VyDQogIGVsaWdpYmlsaXR5LCBh bmQgd2Ugd2lsbCBmb2xsb3cgdXAgdG8gc2NoZWR1bGUgdGhlIHN0dWR5IHNlc3Npb246DQogIDxo dHRwczovL2Zvcm1zLmdsZS9xNnZreUVFMnRTampab2lTQT4NCg0KICBJZiB5b3UgaGF2ZSBhbnkg cXVlc3Rpb25zLCBwbGVhc2UgZW1haWwNCiAgYWhhbm1hbGhvdHJhQGNvbGxlZ2UuaGFydmFyZC5l ZHUuDQoNCg0KT0NhbWwgNC4xMi4wIHJlbGVhc2VkICh3aXRoIDQuMTEuMiB0b28pDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTQtMTItMC1y ZWxlYXNlZC13aXRoLTQtMTEtMi10b28vNzM1OC8xMz4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhy ZWFkIGZyb20gbGFzdCB3ZWVrLCBIYW5uZXMgTWVobmVydCBzYWlkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBDb25ncmF0 dWxhdGlvbnMgdG8gdGhlIG5ldyByZWxlYXNlLiBGb3IgdGhlIGN1cmlvdXMgd2hvIGludGVuZCB0 bw0KICBpbnN0YWxsIGEgZmxhbWJkYSB2ZXJzaW9uIG9mIDQuMTIgYW5kIGFyZSBzdXJwcmlzZWQg dGhhdA0KICBgb2NhbWwtdmFyaWFudHMuNC4xMi4wK2ZsYW1iZGEnIGRvZXMgbm90IGV4aXN0LCBm cm9tIFt0aGlzIHRocmVhZF0gdGhlDQogIG9wYW0gbGF5b3V0IGhhcyBjaGFuZ2VkLCBhbmQgbm93 IHRoZSBmb2xsb3dpbmcgd29ya3M6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0g c3cgY3JlYXRlIDxteS1zd2l0Y2gtbmFtZT4gLS1wYWNrYWdlcz1vY2FtbC12YXJpYW50cy40LjEy LjArb3B0aW9ucyxvY2FtbC1vcHRpb25zLW9ubHktZmxhbWJkYQ0KICDilJTilIDilIDilIDilIAN Cg0KICBUaGVyZSBhcmUgbW9yZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgYXZhaWxhYmxlLCB0YWtl IGEgbG9vayBhdCB0aGUNCiAgb3V0cHV0IG9mIGBvcGFtIHNlYXJjaCBvY2FtbC1vcHRpb24nIGZv ciBhbGwgb3B0aW9ucy4gKEkndmUgbm90IGJlZW4NCiAgaW52b2x2ZWQgd2l0aCB0aGlzIGRldmVs b3BtZW50LiBJIGRvbid0IHF1aXRlIHVuZGVyc3RhbmQgd2h5IHRoZXJlIGlzDQogIGZvciBlYWNo IGBZJyBhIGBvY2FtbC1vcHRpb24tWScgYW5kIGEgYG9jYW1sLW9wdGlvbnMtb25seS1ZJy4pIEkg YWxzbw0KICBoYXZlIG5vdCBmaWd1cmVkIG91dCB3aGV0aGVyIHRoZXJlJ3MgYSB3YXkgdG8gcGFz cyBgLU8zJyBpbiB0aGUganVzdA0KICBjcmVhdGVkIHN3aXRjaC4NCg0KICBNYXliZSBpdCBpcyB3 b3J0aCB0byBlbWJlZCBzdWNoIGluZm9ybWF0aW9uIGluIHRoZSB2ZXJ5IG5pY2VseSBzdHlsZWQN CiAgT0NhbWwgbWFudWFsIChjb25zaWRlcmluZyB0aGF0IG9wYW0gZ290IHF1aXRlIHNvbWUgdHJh Y3Rpb24gb3ZlciB0aGUNCiAgeWVhcnMgYW5kIGlzIHJlY29tbWVuZGVkIGZvciBPQ2FtbCBkZXZl bG9wZXJzKT8NCg0KDQpbdGhpcyB0aHJlYWRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L29jYW1sLTQtMTItMC1maXJzdC1yZWxlYXNlLWNhbmRpZGF0ZS83Mjk0Pg0KDQoNCk90aGVyIE9D YW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQpGcm9tIHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBh Z2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKAoiBbUmVsZWFzZSBvZiBGcmFtYS1D bGFuZyAwLjAuMTBdDQogIOKAoiBbUXViZXMtbGl0ZSB3aXRoIEtWTSBhbmQgV2F5bGFuZF0NCiAg 4oCiIFtGbG9yZW5jZSBhbmQgYmV5b25kOiB0aGUgZnV0dXJlIG9mIFRlem9zIHN0b3JhZ2VdDQog IOKAoiBbVGhlIFJlU2NyaXB0IEFzc29jaWF0aW9uXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIDxodHRw Oi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQvPg0KDQpbUmVsZWFzZSBvZiBGcmFtYS1DbGFu ZyAwLjAuMTBdDQo8aHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy1wbHVnaW5zL2ZyYW1hLWNsYW5nLmh0 bWw+DQoNCltRdWJlcy1saXRlIHdpdGggS1ZNIGFuZCBXYXlsYW5kXQ0KPGh0dHBzOi8vcm9zY2lk dXMuY29tL2Jsb2cvYmxvZy8yMDIxLzAzLzA3L3F1YmVzLWxpdGUtd2l0aC1rdm0tYW5kLXdheWxh bmQvPg0KDQpbRmxvcmVuY2UgYW5kIGJleW9uZDogdGhlIGZ1dHVyZSBvZiBUZXpvcyBzdG9yYWdl XQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIxLTAzLTA0LWZsb3JlbmNlLWFuZC1iZXlv bmQtdGhlLWZ1dHVyZS1vZi10ZXpvcy1zdG9yYWdlPg0KDQpbVGhlIFJlU2NyaXB0IEFzc29jaWF0 aW9uXQ0KPGh0dHBzOi8vcmVzY3JpcHQtbGFuZy5vcmcvYmxvZy9yZXNjcmlwdC1hc3NvY2lhdGlv bi1yZWJyYW5kaW5nPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElm IHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hp dmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2Fn ZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2 ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRo ZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoN CltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVr bHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 02 to 09, 2021.

Working on an app to learn and execute OCaml on iPhone/iPad/Ma= c for beginners

Nathan Fallet announced

I started to work on a new project recently: My goal is to provide an iOS app for beginners to learn OCaml and practice = on their device. I think it is a good idea to get started easily.

Here are some screenshots of what I=E2=80=99ve done so far:

3D=

I=E2=80=99m open to feedback and opinion about this project idea

Nathan Fallet then added

I made it available for pre order on the App Store - I will keep improving = it with time, and I think it can be a great tool for beginners

https:= //apps.apple.com/app/ocaml-learn-code/id1547506826

Yawar Amin replied

This is really cool. I just want to point out that your app is the sole sea= rch result for 'OCaml' in the App Store. So that's a first :-)

Incidentally, there is an 'OCaml Toplevel' app on the Android Play Store: https://play.google.com/store/apps/details?id=3Dfr.vernoux.ocaml

Your app looks more sophisticated though. Hopefully one day we have somethi= ng like Swift Playgrounds and people can start learning OCaml interactively on their devices directly.

ERic (Entity-Relation interactive calculator) version 0.3

Damien Guichard announced

The programming languages zoo is a= great resource for wanna-be interpreter/compiler writers. The ICFP 2000 programming contest is another great resource for wanna-be ray tracers. However until now there has been no OCam= l resource for wanna-be Knowledge Representation tool-ers. This makes sound like KR tool is a more difficult = area than other projects. ERic v0.3 demonstrates the opposite as it's about 1200 lines size (lexer & hand-w= ritten parser included) and reads/writes a Conceptual Graph= Interchange Format (CGIF) notation.

Functional Programming User Study (Specifically in OCaml)

Ahan Malhotra announced

We are doing user studies to help us understand how to help people understa= nd and navigate complex information about programming documentation, specifically in OCaml. You will complete = a series tasks that help us understand working memory and how you navigate a new interface. After examining a layo= ut of the data (interface) for a short, predetermined amount of time, you will be asked a set of comprehension and/= or qualitative questions to measure whether the methods of presenting this information has any impact on your p= erformance.

The study will take around 55 minutes, and you will be entered into a lo= ttery for a $150 Amazon gift card as compensation for your time.

A bit more about this study

The user study will be done virtually on Zoom. You will be asked to various= tasks with the interface. The interface is deployed as a public web application so you don=E2=80=99t have to instal= l anything. This research is governed by Harvard University's Committee on the Use of Human Subjects.

Eligibility

You also don=E2=80=99t have to be an expert in anything to participate. You= just need to be fluent in English and over 18 years of age.

If you are interested, please fill out this survey to confirm your eligibil= ity, and we will follow up to schedule the study session: https://form= s.gle/q6vkyEE2tSjjZoiSA

If you have any questions, please email ahanmalhotra@college.harvard.edu.

OCaml 4.12.0 released (with 4.11.2 too)

Continuing this thread from last week, Hannes Mehnert= said

Congratulations to the new release. For the curious who intend to install a= flambda version of 4.12 and are surprised that ocaml-variants.4.12.0+flambda does not exist, from this thread the opam layout has changed, and now the following works:

$ opam sw create <my-switch-name> --pack=
ages=3Docaml-variants.4.12.0+options,ocaml-options-only-flambda

There are more configuration options available, take a look at the output o= f opam search ocaml-option for all options. (I've not been involved with this development. I don't quite under= stand why there is for each Y a ocaml-option-Y and a ocaml-options-only-Y.) I als= o have not figured out whether there's a way to pass -O3 in the just created switch.

Maybe it is worth to embed such information in the very nicely styled OCaml= manual (considering that opam got quite some traction over the years and is recommended for OCaml developers)?

Other OCaml News

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5D46CE703F for ; Tue, 16 Mar 2021 11:31:44 +0100 (CET) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ABlU9ZqsGUA0TEPlHp+/ahePC7skDX9V00zAX?= =?us-ascii?q?/kB9WHVpW+afkN2jm+le6A/shF8qOU0ItNicNMC7LU/02oVy5eAqVouKeCnDlC?= =?us-ascii?q?+WIJp57Y3kqgePJwTb+vRG3altN4hSYeeeMXFAgcz34Ba1Hr8bqbG62Zq1juTT?= =?us-ascii?q?xWoFd2xXQpxnhj0SNjqm?= X-IronPort-AV: E=Sophos;i="5.81,251,1610406000"; d="scan'208,217";a="498187050" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Mar 2021 11:31:12 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 16 Mar 2021 11:31:11 +0100 Message-ID: <87zgz3pez4.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 09 to 16, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Links from the OCaml Discourse findlib-1.9 Compiler Explorer now supports OCaml 4.12.0 Old CWN Links from the OCaml Discourse =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 The editor says =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Due to a [global Discourse change] that disabled the mailing list mode, I was no able to collect the bodies of the news from the OCaml Discourse for several days. This has now been fixed and next week=E2=80= =99s OCaml Weekly News should be as usual. In the meantime, here are links to the main announcements. Do not hesitate to [contact me] if you want to give feedback about this newsletter. =E2=80=A2 [Release 1.0.0 of bag] =E2=80=A2 [Plan for Dune 3.0] =E2=80=A2 [lascar 0.7.0 - a library for manipulating Labeled Transition Systems in OCaml] =E2=80=A2 [dirsift 0.0.3 - Search for directories by type] =E2=80=A2 [FSML 0.3.0 - an OCaml library for describing and describing synchronous finite state machines] =E2=80=A2 [Multicore OCaml: February 2021] =E2=80=A2 [VSCode OCaml Platform v1.7.0 - v1.8.0] =E2=80=A2 [ca-certs and ca-certs-nss] =E2=80=A2 [Js_of_Ocaml position at TrustInSoft] =E2=80=A2 [Senior Developer vacancy at Cryptosense, France (or remote)] =E2=80=A2 [hxd.0.3.1 - A simple hexdump tool in OCaml] =E2=80=A2 [Release of Gopcaml-mode (0.0.2) - Unicode & Compatibility Upda= te] [global Discourse change] [contact me] [Release 1.0.0 of bag] [Plan for Dune 3.0] [lascar 0.7.0 - a library for manipulating Labeled Transition Systems in OCaml] [dirsift 0.0.3 - Search for directories by type] [FSML 0.3.0 - an OCaml library for describing and describing synchronous finite state machines] [Multicore OCaml: February 2021] [VSCode OCaml Platform v1.7.0 - v1.8.0] [ca-certs and ca-certs-nss] [Js_of_Ocaml position at TrustInSoft] [Senior Developer vacancy at Cryptosense, France (or remote)] [hxd.0.3.1 - A simple hexdump tool in OCaml] [Release of Gopcaml-mode (0.0.2) - Unicode & Compatibility Update] findlib-1.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 findlib-1.9 is out. Changes: =E2=80=A2 Overhaul how separately installed packages (e.g. num) are handl= ed (by David Allsopp). =E2=80=A2 Switch to opam-2.0 file format (by David Allsopp). =E2=80=A2 Fix an incomaptibility with ocaml-4.13 (by David Allsopp). =E2=80=A2 Expose the native toplevel (by Louis Gesbert). =E2=80=A2 Fix an incompatibility with "Jane Street Style" (by Mark Laws). =E2=80=A2 Switch from m4 to sed (by kit-ty-kate). For manual, download, manuals, etc. see here: An updated OPAM package will follow soon. Compiler Explorer now supports OCaml 4.12.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Sorry to the OCaml hacker using Compiler Explorer for the late update (it took some time to deploy the infrastructure, etc.), but it now supports OCaml 4.12.0, but also 4.10.2 and 4.11.2! Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 09 to 16, 2021.

Links from the OCaml Discourse

findlib-1.9

Gerd Stolpmann announced

findlib-1.9 is out. Changes:

  • Overhaul how separately installed packages (e.g. num) are handled (by = David Allsopp).
  • Switch to opam-2.0 file format (by David Allsopp).
  • Fix an incomaptibility with ocaml-4.13 (by David Allsopp).
  • Expose the native toplevel (by Louis Gesbert).
  • Fix an incompatibility with "Jane Street Style" (by Mark Laws).
  • Switch from m4 to sed (by kit-ty-kate).

For manual, download, manuals, etc. see here:

http://proje= cts.camlcity.org/projects/findlib.html

An updated OPAM package will follow soon.

Compiler Explorer now supports OCaml 4.12.0

Sora Morimoto announced

Sorry to the OCaml hacker using Compiler Explorer for the late update (it t= ook some time to deploy the infrastructure, etc.), but it now supports OCaml 4.12.0, but also 4.10.2 an= d 4.11.2!

https://godbolt.org

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E8034E01C3 for ; Tue, 23 Mar 2021 10:05:36 +0100 (CET) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AK6J+SqF60Xlhq1uPpLqEU8eALOonbusQ8zAX?= =?us-ascii?q?/mp2TgFYddHdqtC2kJ0gpGbJoRsyeFVlo9CPP6GcXWjRnKQf3aA9NaqvNTOW31?= =?us-ascii?q?eAA5pl6eLZsl7dMgj/7PMY6aB7b6NlAsbxBlQSt6bHyS2ZN/pl/9Wd6qCvgo7l?= =?us-ascii?q?vhFQZCVncbtp4Qs8KivzKCBLbTJLD5Y4C5aQj/Avz1CdUE8ad8GqQkQCNtKzxe?= =?us-ascii?q?Hjro7sYhINGnccmW2zpA6vgYSKdiSw71M0UzRDwbAtmFKoryXJoq+ivpiAqyP0?= =?us-ascii?q?5ive6oxuntaJ8LV+Lf3Jhs0MEDXwhiaEDb4PZ4G/?= X-IronPort-AV: E=Sophos;i="5.81,271,1610406000"; d="scan'208,217";a="499446043" Received: from clt-128-93-181-133.vpn.inria.fr (HELO set) ([128.93.181.133]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 23 Mar 2021 10:05:35 +0100 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 23 Mar 2021 10:05:35 +0100 Message-ID: <87k0pyutnk.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMTYgdG8gMjMsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmZpbmRsaWIt MS45LjENCkNvbmZvcm1pc3QgMC4yLjENCkNvbXBpbGVyIEV4cGxvcmVyIG5vdyBzdXBwb3J0cyBP Q2FtbCA0LjEyLjANCkFubm91Y2VtZW50IG9mIE9GTEFULCBhIHdlYi1iYXNlZCBwbGF0Zm9ybSB0 byBzdXBwb3J0IGNvdXJzZXMgb24gRm9ybWFsIExhbmd1YWdlcyBhbmQgQXV0b21hdGEgVGhlb3J5 DQpPbGQgQ1dODQoNCg0KZmluZGxpYi0xLjkuMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3lt cGEvYXJjL2NhbWwtbGlzdC8yMDIxLTAzL21zZzAwMDE0Lmh0bWw+DQoNCg0KR2VyZCBTdG9scG1h bm4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBhIGNvdXBsZSBvZiBpbnN0YWxsYXRp b24gcHJvYmxlbXMgc2xpcHBlZCBpbnRvIGZpbmRsaWItMS45LCBtb3N0bHkNCiAgbWlzc2luZyBm aWxlcyBpbiB0aGUgcmVsZWFzZSB0YXJiYWxsLCBidXQgYWxzbyBhIEZyZWVCU0QNCiAgaW5jb21w YXRpYmlsaXR5LiBGb3IgdGhhdCByZWFzb24sIHRoZXJlIGlzIG5vdyBmaW5kbGliLTEuOS4xIGZp eGluZw0KICB0aGUgcHJvYmxlbXMgKHNvIGZhciBrbm93biwgYW5kIEkgaG9wZSB3ZSBjYXVnaHQg dGhlbSBhbGwpLg0KDQogIFNhbWUgbGluayBhcyBiZWZvcmU6DQoNCiAgPGh0dHA6Ly9wcm9qZWN0 cy5jYW1sY2l0eS5vcmcvcHJvamVjdHMvZmluZGxpYi5odG1sPg0KDQoNCkNvbmZvcm1pc3QgMC4y LjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbmZvcm1pc3QtMC0y LTEvNzQ4Mi8xPg0KDQoNCmplcmJlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhl IHJlbGVhc2Ugb2YgY29uZm9ybWlzdCAwLjIuMS4NCg0KICBbQ29uZm9ybWlzdF0gZGVhbHMgd2l0 aCBzY2hlbWEgZGVmaW5pdGlvbiBhbmQgdmFsaWRhdGlvbi4gSXQgc3VwcG9ydHMNCiAgZGVjb2Rp bmcgdG8gYnJpZGdlIHRoZSBnYXAgYmV0d2VlbiBydW50aW1lIHR5cGVzIGFuZCBzdGF0aWMgdHlw ZXMNCiAgd2l0aG91dCBwcHguDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlIG9jY3Vw YXRpb24gPQ0KICDilIIgICB8IE1hdGhlbWF0aWNpYW4NCiAg4pSCICAgfCBFbmdpbmVlcg0KICDi lIIgDQogIOKUgiB0eXBlIHVzZXIgPQ0KICDilIIgICB7IG9jY3VwYXRpb24gOiBvY2N1cGF0aW9u DQogIOKUgiAgIDsgZW1haWwgOiBzdHJpbmcNCiAg4pSCICAgOyBiaXJ0aGRheSA6IGludCAqIGlu dCAqIGludA0KICDilIIgICA7IG5yX29mX3NpYmxpbmdzIDogaW50DQogIOKUgiAgIDsgY29tbWVu dCA6IHN0cmluZyBvcHRpb24NCiAg4pSCICAgOyB3YW50c19wcmVtaXVtIDogYm9vbA0KICDilIIg ICB9DQogIOKUgiANCiAg4pSCIGxldCB1c2VyIG9jY3VwYXRpb24gZW1haWwgYmlydGhkYXkgbnJf b2Zfc2libGluZ3MgY29tbWVudCB3YW50c19wcmVtaXVtID0NCiAg4pSCICAgeyBvY2N1cGF0aW9u OyBlbWFpbDsgYmlydGhkYXk7IG5yX29mX3NpYmxpbmdzOyBjb21tZW50OyB3YW50c19wcmVtaXVt IH0NCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBvY2N1cGF0aW9uX2RlY29kZXIgPSBmdW5j dGlvbg0KICDilIIgICB8ICJtYXRoZW1hdGljaWFuIiAtPiBPayBNYXRoZW1hdGljaWFuDQogIOKU giAgIHwgImVuZ2luZWVyIiAtPiBPayBFbmdpbmVlcg0KICDilIIgICB8IF8gLT4gRXJyb3IgIlVu a25vd24gb2NjdXBhdGlvbiBwcm92aWRlZCINCiAg4pSCIDs7DQogIOKUgiANCiAg4pSCIGxldCBv Y2N1cGF0aW9uX2VuY29kZXIgPSBmdW5jdGlvbg0KICDilIIgICB8IE1hdGhlbWF0aWNpYW4gLT4g Im1hdGhlbWF0aWNpYW4iDQogIOKUgiAgIHwgRW5naW5lZXIgLT4gImVuZ2luZWVyIg0KICDilIIg OzsNCiAg4pSCIA0KICDilIIgbGV0IHVzZXJfc2NoZW1hID0NCiAg4pSCICAgQ29uZm9ybWlzdC4o DQogIOKUgiAgICAgbWFrZQ0KICDilIIgICAgICAgRmllbGQuDQogIOKUgiAJWyBjdXN0b20NCiAg 4pSCIAkgICAgb2NjdXBhdGlvbl9kZWNvZGVyDQogIOKUgiAJICAgIG9jY3VwYXRpb25fZW5jb2Rl cg0KICDilIIgCSAgICAib2NjdXBhdGlvbiINCiAg4pSCIAkgICAgfm1ldGE6KCkNCiAg4pSCIAk7 IHN0cmluZyAiZW1haWwiDQogIOKUgiAJOyBkYXRlICJiaXJ0aGRheSINCiAg4pSCIAk7IGludCB+ ZGVmYXVsdDowICJucl9vZl9zaWJsaW5ncyINCiAg4pSCIAk7IG9wdGlvbmFsIChzdHJpbmcgImNv bW1lbnQiKQ0KICDilIIgCTsgYm9vbCAid2FudHNfcHJlbWl1bSINCiAg4pSCIAldDQogIOKUgiAg ICAgICB1c2VyKQ0KICDilIIgOzsNCiAg4pSCIA0KICDilIIgICBsZXQgaW5wdXQgPQ0KICDilIIg ICAgIFsgIm9jY3VwYXRpb24iLCBbICJlbmdpbmVlciIgXQ0KICDilIIgICAgIDsgImVtYWlsIiwg WyAidGVzdEBleGFtcGxlLmNvbSIgXQ0KICDilIIgICAgIDsgImJpcnRoZGF5IiwgWyAiMjAyMC0x Mi0wMSIgXQ0KICDilIIgICAgIDsgIm5yX29mX3NpYmxpbmdzIiwgWyAiMyIgXQ0KICDilIIgICAg IDsgImNvbW1lbnQiLCBbICJoZWxsbyIgXQ0KICDilIIgICAgIDsgIndhbnRzX3ByZW1pdW0iLCBb ICJ0cnVlIiBdDQogIOKUgiAgICAgXQ0KICDilIIgDQogIOKUgiBsZXQgdXNlciA9DQogIOKUgiAg IENvbmZvcm1pc3QuZGVjb2RlIFNjaGVtYS51c2VyX3NjaGVtYSBpbnB1dA0KICDilIIgDQogIOKU giBsZXQgdmFsaWRhdGlvbl9lcnJvcnMgPQ0KICDilIIgICBDb25mb3JtaXN0LnZhbGlkYXRlIFNj aGVtYS51c2VyX3NjaGVtYSBpbnB1dA0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgYHVzZXJf c2NoZW1hJyBhbmQgdGhlIGB1c2VyJyBjcmVhdGUgZnVuY3Rpb24gYXJlIGd1YXJhbnRlZWQgdG8g YmUNCiAgaW4gc3luYyBhdCBjb21waWxlIHRpbWUuDQoNCg0KW0NvbmZvcm1pc3RdIDxodHRwczov L2dpdGh1Yi5jb20vb3hpZGl6aW5nL2NvbmZvcm1pc3Q+DQoNCg0KQ29tcGlsZXIgRXhwbG9yZXIg bm93IHN1cHBvcnRzIE9DYW1sIDQuMTIuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY29tcGlsZXItZXhwbG9yZXItbm93 LXN1cHBvcnRzLW9jYW1sLTQtMTItMC83NDc5LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVh ZCwgU29yYSBNb3JpbW90byBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRvZGF5IHdlIGRlcGxveWVkIDQuMTIuMCBmbGFtYmRhLiBJdCBtdXN0IGFscmVhZHkgYmUg YXZhaWxhYmxlIQ0KDQoNCkFubm91Y2VtZW50IG9mIE9GTEFULCBhIHdlYi1iYXNlZCBwbGF0Zm9y bSB0byBzdXBwb3J0IGNvdXJzZXMgb24gRm9ybWFsIExhbmd1YWdlcyBhbmQgQXV0b21hdGEgVGhl b3J5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9zeW1wYS5p bnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjEtMDMvbXNnMDAwMjYuaHRtbD4NCg0KDQpB bnRvbmlvIFJhdmFyYSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIDxodHRwOi8vY3Rw LmRpLmZjdC51bmwucHQvRkFDVE9SL09GTEFULz4NCg0KICBUbyBzdXBwb3J0IHN0dWRlbnRz4oCZ IGF1dG9ub21vdXMgd29yayBvbiB0b3BpY3MgcmVsYXRlZCB3aXRoIEZvcm1hbA0KICBMYW5ndWFn ZXMgYW5kIEF1dG9tYXRhIFRoZW9yeSAoRkxBVCksIGludGVyYWN0aXZlIHRvb2xzIHRoYXQgYWxs b3cNCiAgdGhlbSB0byBleHBlcmltZW50IHdpdGggZXhhbXBsZXMgYW5kIHNvbHZlIGV4ZXJjaXNl cyBhcmUgdmVyeQ0KICBpbXBvcnRhbnQgLSBzZXZlcmFsIHN0dWRpZXMgZGVtb25zdHJhdGUgdGhp cy4NCg0KICBUaGVyZSBhcmUgYXBwbGljYXRpb25zIHdpdGggdGhpcyBhaW0uIFdoaWxlIHNvbWUg YXJlIGltcHJlc3NpdmVseQ0KICBjb21wbGV0ZSwgYnV0IGFyZSBtYWlubHkgRGVza3RvcCBhcHBs aWNhdGlvbnMgKGxpa2UgSkZMQVApLCBvdGhlcnMNCiAgdGhhdCBjYW4gYmUgdXNlZCB2aWEgYSB3 ZWIgYnJvd3NlciBhcmUgdW5kZXItZGV2ZWxvcGVkLiBNb3Jlb3ZlciwNCiAgdGhlc2UgYXBwbGlj YXRpb25zIGFyZSBvZnRlbiBub3QgZnVsbHkgaW50ZXJhY3RpdmUgLSBpbGx1c3RyYXRpb25zIG9y DQogIGV2ZW4gc3RlcC1ieS1zdGVwIGV4ZWN1dGlvbiBpcyBrZXkgdG8gdW5kZXJzdGFuZCB0aGUg YWxnb3JpdGhtcyAtIGFuZCwNCiAgZHVlIHRvIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdXNl ZCwgaW1wbGVtZW50IHRoZSBjb25jZXB0cyBpbiBhIHdheQ0KICBxdWl0ZSBkaXN0YW50IGZyb20g dGhlIHRleHRib29rIE1hdGhlbWF0aWNhbCBkZWZpbml0aW9ucy4gQ29kZSB0aGF0DQogIGltcGxl bWVudHMgY2xvc2VseSB0aGUgZGVmaW5pdGlvbnMgaXMgYWxzbyBhIHJlbGV2YW50IHBlZGFnb2dp Y2FsDQogIHRvb2wuDQoNCiAgV2l0aCB0aHJlZSBjb25jZXJucyBpbiBtaW5kIC0gYXZhaWxhYmls aXR5IGluIG1vYmlsZSBkZXZpY2VzLA0KICBpbnRlcmFjdGl2ZSBydW4gb2YgdGhlIGFsZ29yaXRo bXMgKG9yIGF0IGxlYXN0IHByZXNlbnRpbmcgY2xlYXINCiAgZXhwbGFuYXRpb25zKSwgYW5kIGNv ZGUgZm9sbG93aW5nIGNsb3NlbHkgdGhlIGRlZmluaXRpb25zIC0gd2UNCiAgZGV2ZWxvcGVkIE9G TEFULCBhIHdlYi1iYXNlZCB0b29sIHRvIHJlcHJlc2VudCBhbmQgaWxsdXN0cmF0ZQ0KICBncmFw aGljYWxseSBjbGFzc2ljYWwgbWVjaGFuaXNtcyBhbmQgYWxnb3JpdGhtcyBvZiBGb3JtYWwgTGFu Z3VhZ2VzDQogIGFuZCBBdXRvbWF0YSBUaGVvcnkuIEl0IGluY2x1ZGVzIG5vdCBvbmx5IGV4ZXJj aXNlcyBldmFsdWF0ZWQNCiAgYXV0b21hdGljYWxseSBhbmQgcHJvdmlkaW5nIGZlZWRiYWNrLCBi dXQgYWxzbyBhbGxvd3Mgc3R1ZGVudHMgdG8NCiAgY3JlYXRlIHRoZWlyIG93biBleGVyY2lzZXMu IEFuIGludGVncmF0aW9uIHdpdGggYSBncmFkaW5nIHBsYXRmb3JtDQogIGxpa2UgTGVhcm4tT0Nh bWwgaXMgdW5kZXJ3YXkuDQoNCiAgVGhlIHRvb2wgaXMgaW1wbGVtZW50ZWQgaW4gT0NhbWwgYW5k IGlzIG9yZ2FuaXNlZCBpbiB0d28gcGFydHM6IGENCiAgbGlicmFyeSAtIE9DYW1sRkxBVCAtIHdo aWNoIGNvbmNlbnRyYXRlcyB0aGUgbG9naWMgb2YgRkxBVCBjb25jZXB0cywNCiAgYW5kIHRoZSBp bnRlcmFjdGl2ZSBhcHBsaWNhdGlvbmFsIHBhcnQgLSBPRkxBVC4gVG8gcnVuIG9uIGJyb3dzZXJz LA0KICB0aGUgYXBwbGljYXRpb24gdXNlcyB0aGUgT0NhbWwgdG8gSmF2YXNjcmlwdCB0cmFuc2xh dG9yDQogIEpzX29mX09DYW1sLiBUbyBpbXBsZW1lbnQgdGhlIGludGVyYWN0aXZlIGdyYXBoaWNz LCBpdCB1c2VzIEN5dG9zY2FwZSwNCiAgYSBKYXZhc2NyaXB0IGxpYnJhcnkgZm9yIGdyYXBocy4g QWxsIGNvZGUgaXMgYXZhaWxhYmxlIGluIHRoZSBHaXQgb2YNCiAgdGhlIHByb2plY3Q6IDxodHRw czovL2dpdGxhYi5jb20vcmVsZWFzZWxhYi9sZWFmL09DYW1sRmxhdD4sDQogIDxodHRwczovL2dp dGxhYi5jb20vcmVsZWFzZWxhYi9sZWFmL09GTEFUPi4NCg0KICBUaGUgZGV2ZWxvcG1lbnQgb2Yg bmV3IGZ1bmN0aW9uYWxpdGllcyBpcyBvbmdvaW5nICh3ZSdyZSBub3cgd29ya2luZw0KICBtb3Jl IGFuaW1hdGlvbnMgYW5kIG9uIENvbnRleHQtRnJlZSBHcmFtbWFyIGFuZCBQdXNoZG93biBBdXRv bWF0YSkuDQogIENvbW1lbnRzIG1vc3Qgd2VsY29tZS4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDi lZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3Nl bmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBh IGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZl c10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0K DQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+ DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0 aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 16 to 23, 2021.

findlib-1.9.1

Gerd Stolpmann announced

a couple of installation problems slipped into findlib-1.9, mostly missing files in the release tarball, but also a FreeBSD incompatibility. For that reason, there is now findlib-1.9.1 fixing the problems (so far known, and I hope we caught them all).

Same link as before:

http://proje= cts.camlcity.org/projects/findlib.html

Conformist 0.2.1

jerben announced

I am happy to announce the release of conformist 0.2.1.

Conformist deals wi= th schema definition and validation. It supports decoding to bridge the gap between runtime types and static types without p= px.

type occupation =3D
  | Mathematicia=
n
  | Engineer

type user =3D
  { occupation : occupation
  ; email : string
  ; birthday : int * int * int
  ; nr_of_siblings : int
  ; comment : string option
  ; wants_premium : bool
  }

let user occupation=
 email birthday nr_of_siblings comment wants_premium =3D
  { occupation; email; birthday; nr_of_siblings; comment; wants_premium }
;;

let occupation_decoder =3D function
  | "mathematician" -> Ok Mathematician
  | "engineer" -> Ok Engineer
  | _ -> Erro=
r "Unknown occupation provided"
;;

let occupation_encoder =3D function
  | Mathematicia=
n -> "mathematician"
  | Engineer -> "engineer"
;;

let user_schema =3D
  Conformist.(
    make
      Field.
        [ custom
            occupation_decoder
            occupation_encoder
            "occupation"
            ~meta:()
        ; string "email"
        ; date "birthday"
        ; int ~default:0 "nr_of_siblings"
        ; optional (string "comment")
        ; bool "wants_premium"
        ]
      user)
;;

  let input =3D
    [ "occupation", [ "engineer" ]
    ; "email", [ "test@example.com" ]
    ; "birthday", [ "2020-12-01" ]
    ; "nr_of_siblings", [ "3" ]
    ; "comment", [ "hello" ]
    ; "wants_premium", [ "true" ]
    ]

let user =3D
  Conformist.decode Schema.user_schema input

let validation_errors =3D
  Conformist.validate Schema.user_schema input

The user_schema and the user create function are = guaranteed to be in sync at compile time.

Compiler Explorer now supports OCaml 4.12.0

Continuing this thread, Sora Morimoto announced

Today we deployed 4.12.0 flambda. It must already be available!

Annoucement of OFLAT, a web-based platform to support courses = on Formal Languages and Automata Theory

Antonio Ravara announced

http://ctp.di.fct.unl.pt= /FACTOR/OFLAT/

To support students=E2=80=99 autonomous work on topics related with Formal Languages and Automata Theory (FLAT), interactive tools that allow them to experiment with examples and solve exercises are very important - several studies demonstrate this.

There are applications with this aim. While some are impressively complete, but are mainly Desktop applications (like JFLAP), others that can be used via a web browser are under-developed. Moreover, these applications are often not fully interactive - illustrations or even step-by-step execution is key to understand the algorithms - and, due to the programming languages used, implement the concepts in a way quite distant from the textbook Mathematical definitions. Code that implements closely the definitions is also a relevant pedagogical tool.

With three concerns in mind - availability in mobile devices, interactive run of the algorithms (or at least presenting clear explanations), and code following closely the definitions - we developed OFLAT, a web-based tool to represent and illustrate graphically classical mechanisms and algorithms of Formal Languages and Automata Theory. It includes not only exercises evaluated automatically and providing feedback, but also allows students to create their own exercises. An integration with a grading platform like Learn-OCaml is underway.

The tool is implemented in OCaml and is organised in two parts: a library - OCamlFLAT - which concentrates the logic of FLAT concepts, and the interactive applicational part - OFLAT. To run on browsers, the application uses the OCaml to Javascript translator Js_of_OCaml. To implement the interactive graphics, it uses Cytoscape, a Javascript library for graphs. All code is available in the Git of the project: https://gitlab.com= /releaselab/leaf/OCamlFlat, https://gitlab.com/releaselab/leaf/OFLAT.

The development of new functionalities is ongoing (we're now working more animations and on Context-Free Grammar and Pushdown Automata). Comments most welcome.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 63B09E0171 for ; Tue, 30 Mar 2021 16:55:57 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AAPFzH6zURVlGhfkkRXaiKrPwBb1zdoIgy1kn?= =?us-ascii?q?xilNYDZSddGVkN3roeQD2XbP6Qo5dXk8lbm7VJWobmjb8fdOirU5GZeHcE3YtH?= =?us-ascii?q?CzLIdkhLGN/xTFFzfl/uBQkYdMGpIQNPTKAVJ3jdn37WCDer4d6eOa+6Olj/q2?= =?us-ascii?q?9RpQZDxtApsL0ztE?= X-IronPort-AV: E=Sophos;i="5.81,291,1610406000"; d="scan'208,217";a="377302492" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Mar 2021 16:55:56 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 30 Mar 2021 16:55:55 +0200 Message-ID: <87v998wv0k.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 23 to 30, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Theorem Proving with Coq and Ocaml ocaml-aws 1.2 Release of `fmlib.0.2.0' soupault: a static website generator based on HTML rewriting Timere-parse 0.0.2, natural language parsing of date, time and duration ocamlnet-4.1.9 Release of cohttp 4.0.0 New Try-Alt-Ergo website Other OCaml News Old CWN Theorem Proving with Coq and Ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Gregory Malecha announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I lead the formal methods team at Bedrock Systems () and we are looking to hire a full-time engineer working on automation in the Coq proof assistant (which is written in Ocaml). We're very interested in candidates with strong Ocaml background especially in topics related to automated theorem proving, e.g. SAT/SMT solvers, datalog, superposition, resolution, etc. While Coq experience is great, you do not need to be a Coq expert to apply to this position, we're happy to marry your Ocaml expertise with our Coq expertise. Formal methods are at the core of BedRock's business and we are deeply committed to solving problems of system verification at industrial scale. We get FM techniques and insights into the code early on and use them to build, maintain, and evolve code. This includes developing more agile techniques to keep evolving verified systems once they're built. We have eight folks on the formal methods team today, hailing from MPI-SWS, MIT CSAIL, Princeton, and other leading research groups. If you're interested, send me an email or you can inquire more broadly at jobs@bedrocksystems.com. *Company overview:* BedRock is building a *trustworthy compute base for mission-critical applications* . The foundation of the platform is an open source, multi-core, capability-based micro-hypervisor that we are developing and verifying. On top of these deep specifications we are writing and verifying applications to provide an extensible and configurable core. Our contention is that the *time is ripe for verifiably trustworthy systems*, for everything from secure phones and industrial IoT to autonomous systems and financial infrastructure. With significant seed funding, great investors, and commercial projects underway, we are growing our team in Boston, the Bay Area, DC, and Germany. ocaml-aws 1.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Tim Mc Gilchrist announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I'm pleased to announce the release of [ocaml-aws] 1.2. ocaml-aws aims to provide generated bindings to many AWS services using the botocore specifications. In this version we've bumped version bounds on a bunch of depedencies and also added new bindings for: =E2=80=A2 RDS =E2=80=A2 Route53 =E2=80=A2 SDB =E2=80=A2 SQS Please check it out and report any issues. [ocaml-aws] Release of `fmlib.0.2.0' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hbr announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce the second release (0.2.0) of fmlib, a functional library with managed effects. The library has up to now 4 components: =E2=80=A2 [Some standard datatypes] =E2=80=A2 [Pretty printing functions] =E2=80=A2 [Parsing combinator library] =E2=80=A2 [Primitives to compile to javascript] The last component is the new one in version 0.2.0. Internally it uses `js_of_ocaml' to compile to javascript. It is an easy to use library of primitive functions to access mainly browser functionality from ocaml and some rudimentary functions to access nodejs functionality. It can be installed via opam by =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam install fmlib =E2=94=82 opam install fmlib_js =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is located at [github] [Some standard datatypes] [Pretty printing functions] [Parsing combinator library] [Primitives to compile to javascript] [github] Hbr added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80 Hint: `fmlib' is still a bundle of three libraries i.e. three toplevel modules `Fmlib_std', `Fmlib_pretty' and `Fmlib_parse'. Therefore they have to be used in a `dune' file with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (libraries fmlib.fmlib_std fmlib.fmlib_pretty fmlib.fmlib_parse= ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 while the new library can be used with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (libraries fmlib_js ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This inconvenience will be corrected in the next release. soupault: a static website generator based on HTML rewriting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Daniil Baturin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [soupault 2.5.0] offers some features that are unique among SSGs. There are two new built-in widgets for rewriting internal links, which is useful if you don't host your website at the server root. For example, if you host it at `example.com/~user', you cannot just write `': it will point to `example.com/header.png' while you want `example.com/~user/header.png' instead. The `relative_links' widget will convert all internal links to relative links according to their depth in the directory tree. For example, suppose you have `' in your page template. Then in `about/index.html' that link will become `'; in `books/magnetic-fields/index.html' it will be `' and so on. This way you can move the website to a subdirectory and it will still work. The `absolute_links' widget prepends a prefix to every internal link. Conceptually similar to the site URL option in other SSGs and CMSes, but works for all links, not only links generated by the SSG itself. [soupault 2.5.0] Timere-parse 0.0.2, natural language parsing of date, time and duration =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the release of Timere-parse 0.0.2, the natural language parsing component of Timere, a date time handling and reasoning library. Both packages are under the [Timere repo]. Timere-parse allows interpretation of common descriptions of date, time and duration. [Timere repo] Date time examples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C Input strings are in `""', indented lines are pretty printed output. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 "2020 jun 6 10am" =E2=94=82 Ok 2020-06-06T10:00:00Z =E2=94=82 "2020 jun 6th 10:15" =E2=94=82 Ok 2020-06-06T10:15:00Z =E2=94=82 "Australia/Sydney 2020 jun 6 10am" =E2=94=82 Ok 2020-06-06T10:00:00+10:00 =E2=94=82 "01-06-2020 10:10" =E2=94=82 Ok 2020-06-01T10:10:00Z =E2=94=82 "2020/06/01 10am" =E2=94=82 Ok 2020-06-01T10:00:00Z =E2=94=82 "jul 6 2021 9:15am" =E2=94=82 Ok 2021-07-06T09:15:00Z =E2=94=82 "2020/06/01" =E2=94=82 Ok 2020-06-01T00:00:00Z =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Duration examples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 "24h" =E2=94=82 Ok 1 days 0 hours 0 mins 0 secs =E2=94=82 "16.5 hours" =E2=94=82 Ok 16 hours 30 mins 0 secs =E2=94=82 "1h20min" =E2=94=82 Ok 1 hours 20 mins 0 secs =E2=94=82 "1 hour 2.5 minutes" =E2=94=82 Ok 1 hours 2 mins 30 secs =E2=94=82 "100 seconds" =E2=94=82 Ok 1 mins 40 secs =E2=94=82 "2.25 minutes 1 seconds" =E2=94=82 Ok 2 mins 16 secs =E2=94=82 "5 days 6.5 hours" =E2=94=82 Ok 5 days 6 hours 30 mins 0 secs =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Timere object examples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 "2020 jun" =E2=94=82 Ok (pattern (years 2020) (months Jun)) =E2=94=82 "jan" =E2=94=82 Ok (pattern (months Jan)) =E2=94=82 jan 6 12pm to 2pm" =E2=94=82 Ok (bounded_intervals whole (duration 366 0 0 0) (points (pic= k mdhms Jan 6 12 0 0)) (points (pick hms 14 0 0))) =E2=94=82 "12th, 13 to 15, 20" =E2=94=82 Ok (pattern (month_days 12 13 14 15 20)) =E2=94=82 "16th 7:30am" =E2=94=82 Ok (pattern (month_days 16) (hours 7) (minutes 30) (seconds 0= )) =E2=94=82 "16th 8am to 10am, 11am to 12pm" =E2=94=82 Ok (inter (pattern (month_days 16)) (union (bounded_intervals= whole (duration 1 0 0 0) (points (pick hms 8 0 0)) =E2=94=82 (points (pick hms 10 0 0))) (bounded_intervals whole (duration = 1 0 0 0) (points (pick hms 11 0 0)) (points (pick hms =E2=94=82 12 0 0))))) =E2=94=82 "2020 jun 16th 10am to jul 1 12pm" =E2=94=82 Ok (bounded_intervals whole (duration 366 0 0 0) (points (pic= k ymdhms 2020 Jun 16 10 0 0)) (points (pick mdhms Jul =E2=94=82 1 12 0 0))) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Corpus =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C For the full corpus/examples, see [corpus/] for code and [corpus-outputs/] for generated outputs. [corpus/] [corpus-outputs/] ocamlnet-4.1.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 there is now ocamlnet-4.1.9 available: =E2=80=A2 compatibility with upcoming OCaml-4.12 =E2=80=A2 some fixes regarding TLS (https) =E2=80=A2 a few build-related details See the project page for download, documentation, a detailed changelog, and the mailing list: The repository is at opam follows soon. Release of cohttp 4.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Marcello Seri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are glad to announce the [upcoming release] of [`cohttp 4.0.0'], a low-level OCaml library for HTTP clients and servers. This release comes with a big update of the documentation and the examples, both in the [README] and in the codebase, and improvements and bug fixes from many contributors =F0=9F=99=87 which you will find lis= ted below. A huge thank you to all the people that helped to get this release ready by raising issues, participating in discussions, sending PRs, and otherwise using our library. [upcoming release] [`cohttp 4.0.0'] [README] The future of cohttp =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C To quote @avsm from [another post] The development process [=E2=80=A6] is driven by a simple principle that is inspired by OCaml itself: don't needlessly break backwards compatibility without good reason, and when it is necessary, justify it. Our tools are embedded in projects that have lifespans measured in the decades, and we take compatibility seriously. That=E2=80=99s why we take pains to provide migration paths [=E2=80=A6] that are as invisible as possible. Since in this release we have decided to include a number of fixes and improvements which modified Cohttp module signatures, we decided to signal the potential breackage by bumping the major version of the library. In most cases, however, you don't need to do anything and your code will keep working with the latest cohttp. Moving forward, we have agreed to start working on the API and the internals of cohttp to modernize it and get it ready for multicore support and also for eventual unification with the h2 stack that offers HTTP2/3 support. To be able to move forward and avoid stalling improvements for months, we will be less shy of major releases. However, to remain true to the principle above, we will be careful to introduce one breakage at a time, carefully justify its need and provide a clear upgrade path in the changelog. The version history is: =E2=80=A2 cohttp 2.5.5: security backports (changelog below) =E2=80=A2 cohttp 3.0.0: skipped (explained below) =E2=80=A2 cohttp 4.0.0: the next release (changelog below) =E2=80=A2 cohttp 5.0.0: will include a long-awaited change in [how header= s are treated]: which fixes a multitude of past issues and simplifies the internals of the module. For the people that need stability, *we have decided to keep backporting important security fixes to the `2.5.x' branch of the project*. In fact, `cohttp 2.5.5', released just a few days ago was the first release with the backport of a security issue. [another post] [how headers are treated] What happened to 3.0.0? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The release of `cohttp 3.0.0' has been long awaited, and we are extremely grateful to @dinosaure for the enormous work that went into designing and implementing `conduit 3.0.0' and `cohttp 3.0.0' (part of which remained in `4.0.0' as bug fixes and API improvements). However, a discussion started soon after the release pointing out that there could be further room of improvement also with the new design, particularly with respect to backwards compatibility. Since the design discussion did not reach consensus, these changes were reverted to preserve better compatibility with existing cohttp users and `cohttp 3.0.0' was [marked as unavailable] on the opam repository. As maintainers, our "lesson learnt" is to not do releases incrementally when they span multiple libraries: we were caught in an awkward spot when conduit 3 was released, but without cohttp 3. The work on the new conduit is steadily progressing and will be integrated in a new major release of cohttp in the future, once we will be confident that the API is settled. If you want to try using it immediately, then it is available as the [mimic] library in ocaml-git. [marked as unavailable] [mimic] Change Log =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C v4.0.0 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 =E2=80=A2 cohttp.response: fix malformed status header for custom status = codes (@mseri @aalekseyev #752) =E2=80=A2 remove dependency to base (@samoht #745) =E2=80=A2 add GitHub Actions workflow (@smorimoto #739) =E2=80=A2 `cohttp-lwt-jsoo': Forward exceptions to caller when response is null (@mefyl #738) =E2=80=A2 Use implicit executable dependency for generate.exe (@TheLortex #735) =E2=80=A2 cohttp: update HTTP codes (@emillon #711) =E2=80=A2 cohttp: fix chunked encoding of empty body (@mefyl #715) =E2=80=A2 cohttp-async: fix body not being uploaded with unchunked Async.= Pipe (@mefyl #706) =E2=80=A2 cohttp-{async, lwt}: fix suprising behaviours of Body.is_empty (@anuragsoni #714 #712 #713) =E2=80=A2 refactoring of tests (@mseri #709, @dinosaure #692) =E2=80=A2 update documentation (@dinosaure #716, @mseri #720) =E2=80=A2 fix deadlock in logging (@dinosaure #722) =E2=80=A2 improve media type parsing (@seliopou #542, @dinosaure #725) =E2=80=A2 [reverted] breaking changes to client and server API to use con= duit 3.0.0 (@dinosaure #692). However, as the design discussion did not reach consensus, these changes were reverted to preserve better compatibility with existing cohttp users. (#741, @samoht) *Potentially breaking changes* =E2=80=A2 remove `wrapped false' from the codebase (@rgrinberg #734) =E2=80=A2 cohttp: add Uti.t to uri scheme (@brendanlong #707) =E2=80=A2 cohttp-lwt-jsoo: rename Cohttp_lwt_xhr to Cohttp_lwt_jsoo for consistency (@mseri #717) =E2=80=A2 cohttp: fix transfer-encoding ordering in headers (@mseri #721) =E2=80=A2 lower-level support for long-running cohttp-async connections (@brendanlong #704) =E2=80=A2 add of_form and to_form functions to body (@seliopou #440, @mse= ri #723) =E2=80=A2 cohttp-lwt: partly inline read_response, fix body stream leak (@madroach @dinosaure #696). Note: there is a new warning that may show up in your logs when bodies are leaked, see also [#730]. =E2=80=A2 add comparison functions for Request.t and Response.t via ppx_compare (@msaffer-js @dinosaure #686) [#730] v2.5.5 =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 =E2=80=A2 `Cohttp_async.resolve_local_file', `Cohttp_lwt.resolve_local_fi= le' and `Cohttp_lwt_unix.resolve_file' are now the same code under the hood (`Cohttp.Path.resolve_local_file'). The old names have been preserved for compatibility, but will be marked as deprecated in the next release. This changes the behavior of `Cohttp_lwt_unix.resolve_file': it now percent-decodes the paths and blocks escaping from the docroot correctly. This also fixes and tests the corner cases in these methods when the docroot is empty. (@ewanmellor #755) *Double check your code base for uses of `Cohttp_lwt_unix.resolve_file': it is unsafe with respect to path handling*. If you cannot upgrade to `cohttp 2.5.5', you should modify your code to call `Cohttp_lwt.resolve_local_file' instead. New Try-Alt-Ergo website =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 We are pleased to announce the new version of the [Try Alt-Ergo website]! As a reminder, Try Alt-Ergo allows you to write and run your problems in your browser without any server computation. It was designed to be a powerful and simple tool to use. Updates concern these parts of the site: =E2=80=A2 A new back end in JavaScript =E2=80=A2 Front end with news features (Ace editor, top panel, right pane= l, etc.) Take a look at [our blogpost] to read how we have updated the Try Alt-Ergo website and what's new! You can also visit the [Try Alt-Ergo website] directly. As usual, do not hesitate to report bugs, to ask questions, or to give your feedback. [Try Alt-Ergo website] [our blogpost] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [New Try-Alt-Ergo] =E2=80=A2 [TZComet's New Token Viewer] [OCaml Planet] [New Try-Alt-Ergo] [TZComet's New Token Viewer] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 23 to 30, 2021.

Theorem Proving with Coq and Ocaml

Gregory Malecha announced

I lead the formal methods team at Bedrock Systems (https://bedrocksystems.com) and we are looking to hire a= full-time engineer working on automation in the Coq proof assistant (which is written= in Ocaml). We're very interested in candidates with strong Ocaml background especially in topics related to aut= omated theorem proving, e.g. SAT/SMT solvers, datalog, superposition, resolution, etc. While Coq experience is g= reat, you do not need to be a Coq expert to apply to this position, we're happy to marry your Ocaml expertise with o= ur Coq expertise.

Formal methods are at the core of BedRock's business and we are deeply comm= itted to solving problems of system verification at industrial scale. We get FM techniques and insights into th= e code early on and use them to build, maintain, and evolve code. This includes developing more agile techniques t= o keep evolving verified systems once they're built.

We have eight folks on the formal methods team today, hailing from MPI-SWS,= MIT CSAIL, Princeton, and other leading research groups. If you're interested, send me an email or you can inquire = more broadly at jobs@bedrocksystems.com.

Company overview:

BedRock is building a trustworthy compute base for mission-critical appl= ications . The foundation of the platform is an open source, multi-core, capability-based micro-hypervisor that we ar= e developing and verifying. On top of these deep specifications we are writing and verifying applications to prov= ide an extensible and configurable core.

Our contention is that the time is ripe for verifiably trustworthy syste= ms, for everything from secure phones and industrial IoT to autonomous systems and financial infrastructure. With= significant seed funding, great investors, and commercial projects underway, we are growing our team in Bos= ton, the Bay Area, DC, and Germany.

ocaml-aws 1.2

Tim Mc Gilchrist announced

I'm pleased to announce the release of ocaml-aws 1.2.

ocaml-aws aims to provide generated bindings to many AWS services using the= botocore specifications. In this version we've bumped version bounds on a bunch of depedencies and also added new bi= ndings for:

  • RDS
  • Route53
  • SDB
  • SQS

Please check it out and report any issues.

Release of fmlib.0.2.0

Hbr announced

I am pleased to announce the second release (0.2.0) of fmlib, a functional library with managed effects.

The library has up to now 4 components:

The last component is the new one in version 0.2.0. Internally it uses js_of_ocaml to compile to javascript. It is an easy to use lib= rary of primitive functions to access mainly browser functionality from ocaml and s= ome rudimentary functions to access nodejs functionality.

It can be installed via opam by

opam update
opam install fmlib
opam install fmlib_js

It is located at github

Hbr added

Hint: fmlib is still a bundle of three libraries i.e. three to= plevel modules Fmlib_std, Fmlib_pretty and Fmlib_parse. Therefore they have to be used in a dune file with

(libraries fmlib.fmlib_std fmlib.fmlib_pretty fmlib.fmlib_parse ...)

while the new library can be used with

(libraries fmlib_js ...)

This inconvenience will be corrected in the next release.

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

soupault 2.5.= 0 offers some features that are unique among SSGs.

There are two new built-in widgets for rewriting internal links, which is u= seful if you don't host your website at the server root. For example, if you host it at example.com/~user, you cannot just write <img src=3D"/header.png">: it will point to example.com/header.png while you want e= xample.com/~user/header.png instead.

The relative_links widget will convert all internal links to r= elative links according to their depth in the directory tree. For example, suppose you have <img src=3D"/header.= png"> in your page template. Then in about/index.html that link will become <img src=3D"..= /header.png">; in books/magnetic-fields/index.html i= t will be <img src=3D"../../header.png"> and so on. This way yo= u can move the website to a subdirectory and it will still work.

The absolute_links widget prepends a prefix to every internal = link. Conceptually similar to the site URL option in other SSGs and CMSes, but works for all links, not only links generated by = the SSG itself.

Timere-parse 0.0.2, natural language parsing of date, time and= duration

Darren announced

I'm happy to announce the release of Timere-parse 0.0.2, the natural langua= ge parsing component of Timere, a date time handling and reasoning library. Both packages are under the Timere repo.

Timere-parse allows interpretation of common descriptions of date, time and= duration.

Date time examples

Input strings are in "", indented lines are pretty printed out= put.

"2020 jun 6 10am"
  Ok 2020-06-06T10:00:00Z
"2020 jun 6th 10:15"
  Ok 2020-06-06T10:15:00Z
"Australia/Sydney 2020 jun 6 10am"
  Ok 2020-06-06T10:00:00+10:00
"01-06-2020 10:10"
  Ok 2020-06-01T10:10:00Z
"2020/06/01 10am"
  Ok 2020-06-01T10:00:00Z
"jul 6 2021 9:15am"
  Ok 2021-07-06T09:15:00Z
"2020/06/01"
  Ok 2020-06-01T00:00:00Z

Duration examples

"24h"
  Ok 1 days 0 hours 0 mins 0 secs
"16.5 hours"
  Ok 16 hours 30 mins 0 secs
"1h20min"
  Ok 1 hours 20 mins 0 secs
"1 hour 2.5 minutes"
  Ok 1 hours 2 mins 30 secs
"100 seconds"
  Ok 1 mins 40 secs
"2.25 minutes 1 seconds"
  Ok 2 mins 16 secs
"5 days 6.5 hours"
  Ok 5 days 6 hours 30 mins 0 secs

Timere object examples

"2020 jun"
  Ok (pattern (years 2020) (months Jun))
"jan"
  Ok (pattern (months Jan))
jan 6 12pm to 2pm"
  Ok (bounded_intervals whole (duration 366 0 0 0) (points (pick mdhms Jan =
6 12 0 0)) (points (pick hms 14 0 0)))
"12th, 13 to 15, 20"
  Ok (pattern (month_days 12 13 14 15 20))
"16th 7:30am"
  Ok (pattern (month_days 16) (hours 7) (minutes 30) (seconds 0))
"16th 8am to 10am, 11am to 12pm"
  Ok (inter (pattern (month_days 16)) (union (bounded_intervals whole (dura=
tion 1 0 0 0) (points (pick hms 8 0 0))
(points (pick hms 10 0 0))) (bounded_intervals whole (duration 1 0 0 0) (po=
ints (pick hms 11 0 0)) (points (pick hms
12 0 0)))))
"2020 jun 16th 10am to jul 1 12pm"
  Ok (bounded_intervals whole (duration 366 0 0 0) (points (pick ymdhms 202=
0 Jun 16 10 0 0)) (points (pick mdhms Jul
1 12 0 0)))

Corpus

For the full corpus/examples, see corpus/ for code and = corpus-outputs/ for generated outputs.

ocamlnet-4.1.9

Gerd Stolpmann announced

there is now ocamlnet-4.1.9 available:

  • compatibility with upcoming OCaml-4.12
  • some fixes regarding TLS (https)
  • a few build-related details

See the project page for download, documentation, a detailed changelog, and the mailing list: http://proj= ects.camlcity.org/projects/ocamlnet.html

The repository is at

https://gitlab.= com/gerdstolpmann/lib-ocamlnet3/

opam follows soon.

Release of cohttp 4.0.0

Marcello Seri announced

We are glad to announce the upcoming release of cohttp 4.0.0, a low-level OCaml library for HTTP clients and servers.

This release comes with a big update of the documentation and the examples,= both in the README and in the co= debase, and improvements and bug fixes from many contributors =F0=9F=99=87 which you will find listed below.

A huge thank you to all the people that helped to get this release ready by= raising issues, participating in discussions, sending PRs, and otherwise using our library.

The future of cohttp

To quote @avsm from another post

The development process […] is driven by a simple principle that is = inspired by OCaml itself: don't needlessly break backwards compatibility without good reason, and when it is necessary= , justify it. Our tools are embedded in projects that have lifespans measured in the decades, and we take compatibi= lity seriously. That=E2=80=99s why we take pains to provide migration paths […] that are as invisible as possible.

Since in this release we have decided to include a number of fixes and impr= ovements which modified Cohttp module signatures, we decided to signal the potential breackage by bumping the maj= or version of the library. In most cases, however, you don't need to do anything and your code will keep working with= the latest cohttp.

Moving forward, we have agreed to start working on the API and the internal= s of cohttp to modernize it and get it ready for multicore support and also for eventual unification with the h2 s= tack that offers HTTP2/3 support.

To be able to move forward and avoid stalling improvements for months, we w= ill be less shy of major releases. However, to remain true to the principle above, we will be careful to intro= duce one breakage at a time, carefully justify its need and provide a clear upgrade path in the changelog.

The version history is:

  • cohttp 2.5.5: security backports (changelog below)
  • cohttp 3.0.0: skipped (explained below)
  • cohttp 4.0.0: the next release (changelog below)
  • cohttp 5.0.0: will include a long-awaited change in how headers are treated: which= fixes a multitude of past issues and simplifies the internals of the modul= e.

For the people that need stability, we have decided to keep backporting = important security fixes to the 2.5.x branch of the project. In fact, cohttp 2.5.5, released jus= t a few days ago was the first release with the backport of a security issue.

What happened to 3.0.0?

The release of cohttp 3.0.0 has been long awaited, and we are = extremely grateful to @dinosaure for the enormous work that went into designing and implementing conduit 3.0.0 a= nd cohttp 3.0.0 (part of which remained in 4.0.0 as bug fixes and API improvements).

However, a discussion started soon after the release pointing out that ther= e could be further room of improvement also with the new design, particularly with respect to backwards compatibil= ity. Since the design discussion did not reach consensus, these changes were reverted to preserve better compatibili= ty with existing cohttp users and cohttp 3.0.0 was marked as unavailable on the opam repository. As maintainers, our "lesson learnt" is to not do releases incrementally when t= hey span multiple libraries: we were caught in an awkward spot when conduit 3 was released, but without cohttp 3.

The work on the new conduit is steadily progressing and will be integrated = in a new major release of cohttp in the future, once we will be confident that the API is settled. If you want to t= ry using it immediately, then it is available as the mimic library in ocaml-git.

Change Log

v4.0.0
  • cohttp.response: fix malformed status header for custom status codes (@= mseri @aalekseyev #752)
  • remove dependency to base (@samoht #745)
  • add GitHub Actions workflow (@smorimoto #739)
  • cohttp-lwt-jsoo: Forward exceptions to caller when respons= e is null (@mefyl #738)
  • Use implicit executable dependency for generate.exe (@TheLortex #735)
  • cohttp: update HTTP codes (@emillon #711)
  • cohttp: fix chunked encoding of empty body (@mefyl #715)
  • cohttp-async: fix body not being uploaded with unchunked Async.Pipe (@m= efyl #706)
  • cohttp-{async, lwt}: fix suprising behaviours of Body.is_empty (@anurag= soni #714 #712 #713)
  • refactoring of tests (@mseri #709, @dinosaure #692)
  • update documentation (@dinosaure #716, @mseri #720)
  • fix deadlock in logging (@dinosaure #722)
  • improve media type parsing (@seliopou #542, @dinosaure #725)
  • [reverted] breaking changes to client and server API to use conduit 3.0= .0 (@dinosaure #692). However, as the design discussion did not reach conse= nsus, these changes were reverted to preserve better compatibility with exi= sting cohttp users. (#741, @samoht)

Potentially breaking changes

  • remove wrapped false from the codebase (@rgrinberg #734)
  • cohttp: add Uti.t to uri scheme (@brendanlong #707)
  • cohttp-lwt-jsoo: rename Cohttp_lwt_xhr to Cohttp_lwt_jsoo for consisten= cy (@mseri #717)
  • cohttp: fix transfer-encoding ordering in headers (@mseri #721)
  • lower-level support for long-running cohttp-async connections (@brendan= long #704)
  • add of_form and to_form functions to body (@seliopou #440, @mseri #723)=
  • cohttp-lwt: partly inline read_response, fix body stream leak (@madroac= h @dinosaure #696). Note: there is a new warning that may show up in your logs when bodies are = leaked, see also #730.
  • add comparison functions for Request.t and Response.t via ppx_compare (= @msaffer-js @dinosaure #686)
v2.5.5
  • Cohttp_async.resolve_local_file, Cohttp_lwt.resolve_loca= l_file and Cohttp_lwt_unix.resolve_file are now the sam= e code under the hood (Cohttp.Path.resolve_local_file). The ol= d names have been preserved for compatibility, but will be marked as deprec= ated in the next release. This changes the behavior of Cohttp_lwt_uni= x.resolve_file: it now percent-decodes the paths and blocks escaping= from the docroot correctly. This also fixes and tests the corner cases in = these methods when the docroot is empty. (@ewanmellor #755)

    Double check your code base for uses of Cohttp_lwt_unix.resolve_fi= le: it is unsafe with respect to path handling. If you cannot up= grade to cohttp 2.5.5, you should modify your code to call Cohttp_lwt.resolve_local_file instead.

New Try-Alt-Ergo website

OCamlPro announced

We are pleased to announce the new version of the Try Alt-Ergo website!

As a reminder, Try Alt-Ergo allows you to write and run your problems in yo= ur browser without any server computation. It was designed to be a powerful and simple tool to use.

Updates concern these parts of the site:

  • A new back end in JavaScript
  • Front end with news features (Ace editor, top panel, right panel, etc.)=

Take a look at our blogpost to read how we have updated the Try Alt-Ergo website and what's new! You can also visit the Try Alt-Ergo website directly. As usual, do not hesitate to report bugs, to ask ques= tions, or to give your feedback.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CA785E0171 for ; Tue, 6 Apr 2021 11:42:20 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AE4HCDa1e55x69JvFDKHsUgqjBHIkLtp033Aq?= =?us-ascii?q?2lEZdDV+dMuEm8ey2NES0hHpgDgcMUtQ++yoEq+GXH/a6NpJ8ZAcVI3SPzXOlW?= =?us-ascii?q?O0IOhZg7fK7CbnH0TFm9J18YdFX+xABMbrDV585Pyb3CCdH8w7yNeKtICE7N2w?= =?us-ascii?q?815XQQtna75t4m5CY27xLmRNWAJECZAlfaDx2uN7oVObE0g/Ut62HT0sUeTFur?= =?us-ascii?q?Tw9a7bXQ=3D=3D?= X-IronPort-AV: E=Sophos;i="5.81,309,1610406000"; d="scan'208,217";a="501732405" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Apr 2021 11:42:02 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr, comp@lists.orbitalfox.eu Date: Tue, 06 Apr 2021 11:42:02 +0200 Message-ID: <87wntfwxzp.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMzAgdG8gQXByaWwNCjA2LCAyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkVj b3N5c3RlbSBFbmdpbmVlciBhbmQgVGVjaG5pY2FsIFdyaXRlciBwb3NpdGlvbnMNClJlbGVhc2Ug b2YgY29odHRwIDQuMC4wDQpUaW1lcmUtcGFyc2UgMC4wLjIsIG5hdHVyYWwgbGFuZ3VhZ2UgcGFy c2luZyBvZiBkYXRlLCB0aW1lIGFuZCBkdXJhdGlvbg0KYWdyaWQgMC4xDQpTdGF0ZSBvZiBPQ2Ft bCBhbmQgd2ViIGFzc2VtYmx5DQpjb250YWluZXJzIDMuMw0KTmV3IE9DYW1sIGJvb2tzPw0KT2xk IENXTg0KDQoNCkVjb3N5c3RlbSBFbmdpbmVlciBhbmQgVGVjaG5pY2FsIFdyaXRlciBwb3NpdGlv bnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvam9iLWVjb3N5c3RlbS1lbmdpbmVlci1hbmQtdGVj aG5pY2FsLXdyaXRlci1wb3NpdGlvbnMvNzU3MS8xPg0KDQoNCkNlbGluZSBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtUYXJp ZGVzXSBpcyBoaXJpbmcgYW4gW0Vjb3N5c3RlbSBFbmdpbmVlcl0gYW5kIGEgW1RlY2huaWNhbCBX cml0ZXJdLg0KDQogIFRhcmlkZXMgaXMgYSB0ZWNoIHN0YXJ0dXAgYmFzZWQgaW4gUGFyaXMgYW5k IGZvdW5kZWQgaW4gMjAxOC4gV2UNCiAgZGV2ZWxvcCBhIHNvZnR3YXJlIGluZnJhc3RydWN0dXJl IHBsYXRmb3JtIHRvIGRlcGxveSBzZWN1cmUsDQogIGRpc3RyaWJ1dGVkIGFwcGxpY2F0aW9ucyB3 aXRoIHN0cmljdCByZXNvdXJjZSBjb250cmFpbnRzIGFuZA0KICBsb3ctbGF0ZW5jeSBwZXJmb3Jt YW5jZSByZXF1aXJlbWVudHMuDQoNCiAgV2Ugd2VsY29tZSBhcHBsaWNhdGlvbnMgZnJvbSBwZW9w bGUgb2YgYWxsIGJhY2tncm91bmRzLiBXZSBhcmUgd29ya2luZw0KICBoYXJkIHRvIGNyZWF0ZSBh IHJlcHJlc2VudGF0aXZlLCBpbmNsdXNpdmUgYW5kIGZyaWVuZGx5IHRlYW0sIGJlY2F1c2UNCiAg d2Uga25vdyB0aGF0IGRpZmZlcmVudCBleHBlcmllbmNlcywgcGVyc3BlY3RpdmVzIGFuZCBiYWNr Z3JvdW5kcyBtYWtlDQogIGZvciBhIGJldHRlciBwbGFjZS4NCg0KICBQbGVhc2UsIGRvbid0IGhl c2l0YXRlIHRvIGNvbnRhY3QgbWUgaWYgeW91IGhhdmUgYW55IHF1ZXN0aW9uLCBJJ2xsIGJlDQog IG1vcmUgdGhhbiBoYXBweSB0byByZXBseSEgOikNCg0KDQpbVGFyaWRlc10gPGh0dHBzOi8vdGFy aWRlcy5jb20vPg0KDQpbRWNvc3lzdGVtIEVuZ2luZWVyXSA8aHR0cHM6Ly90YXJpZGVzLmNvbS9q b2JzL2Vjb3N5c3RlbS1lbmdpbmVlcj4NCg0KW1RlY2huaWNhbCBXcml0ZXJdIDxodHRwczovL3Rh cmlkZXMuY29tL2pvYnMvdGVjaG5pY2FsLXdyaXRlcj4NCg0KDQpSZWxlYXNlIG9mIGNvaHR0cCA0 LjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1jb2h0dHAtNC0wLTAvNzUzNy8yPg0KDQoNCkNvbnRpbnVp bmcgdGhpcyB0aHJlYWQsIENhbGFzY2liZXR0YSBSb21haW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgVGhlIHdvcmsgb24gdGhlIG5ldyBjb25kdWl0IGlz IHN0ZWFkaWx5IHByb2dyZXNzaW5nIGFuZA0KICAgICAgICB3aWxsIGJlIGludGVncmF0ZWQgaW4g YSBuZXcgbWFqb3IgcmVsZWFzZSBvZiBjb2h0dHAgaW4gdGhlDQogICAgICAgIGZ1dHVyZSwgb25j ZSB3ZSB3aWxsIGJlIGNvbmZpZGVudCB0aGF0IHRoZSBBUEkgaXMNCiAgICAgICAgc2V0dGxlZC4g SWYgeW91IHdhbnQgdG8gdHJ5IHVzaW5nIGl0IGltbWVkaWF0ZWx5LCB0aGVuIGl0DQogICAgICAg IGlzIGF2YWlsYWJsZSBhcyB0aGUgW21pbWljIF0gbGlicmFyeSBpbiBvY2FtbC1naXQuDQoNCiAg SSBqdXN0IHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIHNob3cgdXAgYSB0dXRvcmlhbCBhYm91dCBg bWltaWMnIHdoaWNoDQogIGlzIG5vdyBhdmFpbGFibGUgaW50byB0aGUgZGlzdHJpYnV0aW9uIG9m IGl0OiBzZWUgW2hlcmVdLiBUaGFua3MgZm9yDQogIHlvdXIgd29yayBhYm91dCB0aGUgcmVsZWFz ZSBwcm9jZXNzLg0KDQoNClttaW1pYyBdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL29jYW1s LWdpdC90cmVlL21hc3Rlci9zcmMvbWltaWM+DQoNCltoZXJlXSA8aHR0cHM6Ly9taXJhZ2UuZ2l0 aHViLmlvL29jYW1sLWdpdC9taW1pYy9pbmRleC5odG1sPg0KDQoNClRpbWVyZS1wYXJzZSAwLjAu MiwgbmF0dXJhbCBsYW5ndWFnZSBwYXJzaW5nIG9mIGRhdGUsIHRpbWUgYW5kIGR1cmF0aW9uDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10aW1lcmUtcGFyc2UtMC0wLTItbmF0 dXJhbC1sYW5ndWFnZS1wYXJzaW5nLW9mLWRhdGUtdGltZS1hbmQtZHVyYXRpb24vNzUzMi8yPg0K DQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIERhcnJlbiBzYWlkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgZGVtbyBzaXRlIGhhcyBi ZWVuIHVwZGF0ZWQgdG8gdXNlIFRpbWVyZS1wYXJzZSwgeW91IGNhbiBub3cgdHJ5DQogIGludGVy YWN0aW5nIHdpdGggYFRpbWVyZV9wYXJzZS50aW1lcmUnIGluIHdlYiBicm93c2VyIGF0DQogIDxo dHRwczovL2RheXBhY2stZGV2LmdpdGh1Yi5pby90aW1lcmUtcGFyc2UtZGVtby8+DQoNCg0KYWdy aWQgMC4xDQrilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1hZ3JpZC0wLTEvNzU4Ny8xPg0KDQoNCnphcGFzaGNh bm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZp cnN0IHJlbGVhc2Ugb2YgW2FncmlkXS4NCg0KICBBZ3JpZCBzdGFuZHMgZm9yICpBZGp1c3RhYmxl IEdyaWQqLiBBZGp1c3RhYmxlIGdyaWRzIGFyZSBiYXNpY2FsbHkgdHdvDQogIGRpbWVuc2lvbmFs IGFycmF5cyB3aG9zZSB3aWR0aC9oZWlnaHQgY2FuIGJlIGNoYW5nZWQgYnkgYWRkaW5nIG9yDQog IHJlbW92aW5nIHJvdy9jb2x1bW4gYXQgZWl0aGVyIGVuZCAob25lIGF0IGEgdGltZSkuDQoNCiAg SGVyZSdzIGEgdmVyeSBzaG9ydCBleGFtcGxlIDoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IGxldCAoKSA9DQogIOKUgiAgIGxldCBncmlkID0gQWdyaWQub2ZfbGlzdCBbWzE7IDJdOyBbMzsg NF1dIGluDQogIOKUgiAgIGxldCBncmlkID0gQWdyaWQuc25vY19yb3cgZ3JpZCAoRmxleF9hcnJh eS5vZl9saXN0IFs1OyA2XSkgaW4NCiAg4pSCICAgQWdyaWQucHAgRm9ybWF0LnBwX3ByaW50X2lu dCBGb3JtYXQuc3RkX2Zvcm1hdHRlciBncmlkDQogIOKUgiAgICgqIHByaW50czoNCiAg4pSCICAg ICogMTsgMg0KICDilIIgICAgKiAzOyA0DQogIOKUgiAgICAqIDU7IDYNCiAg4pSCICAgICopDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIEl0J3MgYmFzZWQgb24gdGhlIGdyZWF0IFtmbGV4LWFycmF5 XSBsaWJyYXJ5IGJ5IFtKZWFuLUNocmlzdG9waGUNCiAgRmlsbGnDonRyZV0gYW5kIGlzIG1haW5s eSBhIHdyYXBwZXIgYXJvdW5kIGl0IHRvIG1ha2UgaXQgZWFzaWVyIGZvciB0aGUNCiAgc3BlY2lh bCBjYXNlIG9mIHR3byBkaW1lbnNpb25hbCBhcnJheXMuDQoNCiAgSXQncyBiZWVuIGRldmVsb3Bw ZWQgYXQgW09DYW1sUHJvXSB3aGlsZSB3b3JraW5nIG9uIFttb3NhaWNdIHdoZW4gd2UNCiAgd2Fu dGVkIHRvIGVhc2UgdGhlIGRhdGFzZXQgaW5wdXQgcHJvY2Vzcywgc3dpdGNoaW5nIGZyb20gYSBi YXNpYw0KICB0ZXh0YXJlYSBiYXNlZCBpbnB1dCB0byBzb21ldGhpbmcgd2hpY2ggbG9va3MgbGlr ZSBhIHNwcmVhZHNoZWV0ICh0aGlzDQogIHdvcmsgaXMgbm90IHlldCBwdWJsaXNoZWQgb24gdGhl IG9ubGluZSB2ZXJzaW9uKS4NCg0KDQpbYWdyaWRdIDxodHRwczovL29jYW1scHJvLmdpdGh1Yi5p by9hZ3JpZD4NCg0KW2ZsZXgtYXJyYXldIDxodHRwczovL2dpdGh1Yi5jb20vYmFja3RyYWNraW5n L2ZsZXgtYXJyYXk+DQoNCltKZWFuLUNocmlzdG9waGUgRmlsbGnDonRyZV0gPGh0dHBzOi8vd3d3 LmxyaS5mci9+ZmlsbGlhdHIvPg0KDQpbT0NhbWxQcm9dIDxodHRwczovL3d3dy5vY2FtbHByby5j b20vPg0KDQpbbW9zYWljXSA8aHR0cHM6Ly9tb3NhaWMudW5pdi1seW9uMS5mci8+DQoNCg0KZ2Fz Y2hlIGFza2VkIGFuZCB6YXBhc2hjYW5vbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBPdXQgb2YgY3VyaW9zaXR5 OiBJbiBhIHNwcmVhZHNoZWV0LCBJIHdvdWxkIGFzc3VtZSB0aGF0DQogICAgICAgIGluc2VydGlu Zy9yZW1vdmluZyByb3dzIG9yIGNvbHVtbnMgaW4gdGhlIG1pZGRsZSBpcyBhbHNvIGENCiAgICAg ICAgdXNlZnVsIG9wZXJhdGlvbi4gV291bGQgeW91IGJlIGFibGUgdG8gYWRkIHRoaXMgb3BlcmF0 aW9uPw0KDQogIEl0J3Mgbm90IHJlYWxseSBhIHNwcmVhZHNoZWV0LCBpdCdzIG1vcmUgc29tZXRo aW5nIFtsaWtlIHRoaXNdLiBJDQogIGRvbid0IHRoaW5rIGl0IHdvdWxkIGJlIHJlYWxseSB1c2Vm dWwgaW4gdGhlIGNhc2Ugb2YgbW9zYWljIGJlY2F1c2UNCiAgZm9yIGJpZyBpbnB1dHMsIHVzZXJz IGFyZSBtb3JlIGxpa2VseSB0byBpbXBvcnQgdGhlIGRhdGEgZnJvbSBhIGZpbGUuDQoNCiAgQW55 d2F5LCBpdCdzIHBvc3NpYmxlIHRvIGFkZCB0aGlzIG9wZXJhdGlvbiwgYnV0IEkgY2FuJ3QgdGhp bmsgb2YgYW4NCiAgZWZmaWNpZW50IHdheSB0byBkbyBpdC4gSSdsbCB0aGluayBhYm91dCBpdCBh bmQgbWF5IGFkZCBzdWNoIGFuDQogIG9wZXJhdGlvbi4gQWN0dWFsbHksIGlmIGl0J3MgYWRkZWQg dG8gZmxleC1hcnJheSwgaXQgd291bGQgYmUgdHJpdmlhbA0KICB0byBhZGQgaXQgdG8gYWdyaWQs IHNvIEknbGwgcHJvYmFibHkgdHJ5IHRvIGFkZCBpdCB0aGVyZS4NCg0KDQpbbGlrZSB0aGlzXSA8 aHR0cHM6Ly93d3cuemFwYXNoY2Fub24uZnIvfmxlby9hdGFibGUvPg0KDQoNClN0YXRlIG9mIE9D YW1sIGFuZCB3ZWIgYXNzZW1ibHkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RhdGUtb2Yt b2NhbWwtYW5kLXdlYi1hc3NlbWJseS8yNzI1LzE1Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQs IEVtaWxpbyBKZXPDunMgR2FsbGVnbyBBcmlhcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFl1cCwgd2UgZGlk bid0IG1ha2UgaXQgeWV0IHRoZSAib2ZmaWNpYWwiIHJlbGVhc2UsIGJ1dCBpdCBoYXMgYmVlbg0K ICB1c2VkIGJ5IHF1aXRlIGEgZmV3IHBlb3BsZSB0byBhdm9pZCBsYWNrIG9mIHRhaWwtY2FsbCBv cHRpbWl6YXRpb24gaW4NCiAganNvbywgbGl2ZSB2ZXJzaW9uczoNCiAg4oCiIDxodHRwczovL2pz Y29xLmdpdGh1Yi5pby93YS8+DQogIOKAoiA8aHR0cHM6Ly9qc2NvcS5naXRodWIuaW8vd2Evc2Ny YXRjaHBhZC5odG1sPg0KDQogIEl0IGxpdGVyYWxseSBmbGllcy4NCg0KICBJIGd1ZXNzIEBjb3J3 aW4tb2YtYW1iZXIgaXMgdGhlIHJpZ2h0IHBlcnNvbiB0byBjb21tZW50IG1vcmUgb24gaGlzDQog IHN1cGVyYiBlZmZvcnRzLg0KDQoNClNoYWNoYXIgSXR6aGFreSB0aGVuIGFkZGVkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBIaSB0aGVyZSBAY2FtYXJpY2s7IG9jYW1sLXdhc20gaXMgdmVy eSBtdWNoIGJsZWVkaW5nLWVkZ2UgYnV0IGl0DQogIGFscmVhZHkgd29ya3Mgc3VycHJpc2luZ2x5 IHdlbGwgYW5kIEkgaGF2ZSB1c2VkIGl0IHRvIHJ1biBDb3EsDQogIGVzcC4gZm9yIHRoZSBwdXJw b3NlIG9mIG1ha2luZyB0aGUgaW50ZXJhY3RpdmUgdmVyc2lvbiBvZiBWb2xzLiBJLElJDQogIGZy b20gdGhlIFNvZnR3YXJlIEZvdW5kYXRpb25zIHRleHRib29rIChzZWUNCiAgPGh0dHBzOi8vanNj b3EuZ2l0aHViLmlvL2V4dC9zZj4gYW5kDQogIDxodHRwczovL2pzY29xLmdpdGh1Yi5pby9leHQv c2YvdG9vbHMvanNjb3EtdGVzdGVyLmh0bWw+KS4NCg0KICBPZiBjb3Vyc2UgQGVqZ2FsbGVnbyBp cyBleGFnZ2VyYXRpbmcgd2hlbiBoZSBzYXlzIHRoYXQgaXQgZmxpZXMsIGl0DQogIHN0aWxsIHJ1 bnMgT0NhbWwgYnl0ZWNvZGUgaW4gaW50ZXJwcmV0ZWQgbW9kZSBvbiB0b3Agb2YgdGhlIFdBU00N CiAgSklULiBQZXJmb3JtYW5jZSBpcyBwcmV0dHkgcmVhc29uYWJsZSBzdGlsbCwgZXhjZXB0IGlu IHRoZSBjYXNlIHNvbWUNCiAgaW50ZW5zaXZlIENvcSB0YWN0aWNzIChpbiB3aGljaCBjYXNlIHRo aXMgaXMgYSB0aGlyZCBsZXZlbCBvZg0KICBpbnRlcnByZXRlcuKApiA6bWFuX2ZhY2VwYWxtaW5n OiApLiBUaGUgbWFpbiBnYXAgcmlnaHQgbm93IGlzIHRoZQ0KICBzdGFuZGFyZCBsaWJyYXJpZXMg YHN0cicsIGB1bml4JywgYW5kIGB0aHJlYWRzJywgZm9yIHdoaWNoIEkgaGF2ZQ0KICBjb21waWxl ZCBlbXB0eSBzdHVicywgYmVjYXVzZSBkeW5hbWljIGxvYWRpbmcgb2YgbGlicmFyaWVzIGluIFdB U0kgaXMNCiAgc3RpbGwgaW1tYXR1cmUuIEkgKmhhdmUqIGJlZW4gYWJsZSB0byBjb21waWxlIGBu dW0nIGFuZCBpdCB3b3Jrcw0KICBjb3JyZWN0bHkgYmVjYXVzZSBpdCBkb2VzIG5vdCBkZXBlbmQg b24gYW55dGhpbmcgZWxzZS4gSSBhbSBjdXJyZW50bHkNCiAgaW52ZXN0aWdhdGluZyBob3cgdG8g YnVpbGQgYHphcml0aCcgKHdoaWNoIHJlcXVpcmVzIGBnbXAnKSBiZWNhdXNlIENvcQ0KICA4LjEz IGRlcGVuZHMgb24gaXQuDQoNCiAgU28geWVhaCwgdGhpcyBpcyBub3QgYXQgYWxsIHRoZSBjb3Zl dGVkIFdBU00gYmFja2VuZCBmb3IgYG9jYW1sYycsIGJ1dA0KICBpdCdzIG9uZSBleGlzdGluZyBz b2x1dGlvbiBhbmQgeW91IGNhbiBoYWNrIG9uIGl0IHJpZ2h0IG5vdy4gQW55IGhlbHANCiAgb3Ig Y29tbWVudHMgYXJlIHdlbGNvbWUhDQoNCg0KY29udGFpbmVycyAzLjMNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0zLzc1OTQvMT4NCg0KDQpTaW1vbiBDcnVh bmVzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIGdsYWQgdG8gYW5ub3VuY2UgdGhl IHJlbGVhc2Ugb2YgY29udGFpbmVycyAzLjMuIENvbnRhaW5lcnMgaXMgYW4NCiAgZXh0ZW5zaW9u IHRvIE9DYW1sJ3Mgc3RhbmRhcmQgbGlicmFyeSB0aGF0IHN0cml2ZXMgdG8gYmUgY29tcGF0aWJs ZQ0KICB3aXRoIGl0LCB3aXRoIG1vcmUgZmVhdHVyZXMgYW5kIGEgZmV3IGFkZGl0aW9uYWwgbW9k dWxlcyB0byBnZXQNCiAgZHluYW1pYyBhcnJheXMsIGhlYXBzLCBTLWV4cHJlc3Npb24gcGFyc2Vy L3ByaW50ZXIsIGV0Yy4NCg0KICBJbiB0aGlzIHJlbGVhc2UsIHdlIGhhdmUgbmV3IHN1cHBvcnQg Zm9yIHBhcnNpbmcvcHJpbnRpbmcgY2Fub25pY2FsDQogIFMtZXhwcmVzc2lvbnMgKGEgc2ltcGxl IGJpbmFyeS1zYWZlIGZvcm1hdCksIGEgY29kZS1nZW5lcmF0aW9uIG1vZHVsZQ0KICBmb3IgYml0 ZmllbGRzLCBhbmQgbWFueSBpbXByb3ZlbWVudHMgdG8gZXhpc3RpbmcgbW9kdWxlcyBpbiBwYXJ0 aWN1bGFyDQogIGluIHRoZSBpbnRlcmZhY2UgYmV0d2VlbiBtYXBzL3NldC9oYXNodGJsIGFuZCBp dGVyYXRvcnMuDQoNCiAgTW9yZSBkZXRhaWxzIFtpbiB0aGUgZ2l0aHViIHJlbGVhc2VdLg0KDQog IE1hbnkgdGhhbmtzIHRvIHRoZSBjb250cmlidXRvcnMsIGluIHBhcnRpY3VsYXIgQEZhcmRhbGUg Zm9yIGhpcyB3b3JrDQogIG9uIENJIGFuZCBhdXRvLWRvYy1nZW5lcmF0aW9uLg0KDQoNCltpbiB0 aGUgZ2l0aHViIHJlbGVhc2VdDQo8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9vY2FtbC1jb250 YWluZXJzL3JlbGVhc2VzL3RhZy92My4zPg0KDQoNCk5ldyBPQ2FtbCBib29rcz8NCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbmV3LW9jYW1sLWJvb2tzLzU3ODkvNj4NCg0KDQpE ZWVwIGluIHRoaXMgdGhyZWFkLCBEYW1pZW4gR3VpY2hhcmQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJ4oCZbSBhbHNvIHdvcmtpbmcgb24gYSBmcmVlIGN1bHR1cmUg Ym9vay4gVGhlIHByZXZpZXcgaXMgYXQNCiAgPGh0dHBzOi8vZGFtaWVuLWd1aWNoYXJkLmRldmVs b3BwZXouY29tL2Rvd25sb2Fkcy9BbGdvcml0aG1pYy13aXRoLU9DYW1sLnBkZj4NCg0KICBJdOKA mXMgdW5kZXIgQ0MtQlktU0EuDQoNCiAgUGxhbm5lZCBjaGFwdGVycyBpbmNsdWRlIDogUmVjb3Jk cywgVHlwZSBwb2x5bW9ycGhpc20sIE1vZHVsZXMgYXMNCiAgZnVuY3Rpb25zLCBDb25jZXB0dWFs IGdyYXBocy4NCg0KICBUaGUgcmVhc29uIHdoeSBpIGRvbid0IGNvbnRyaWJ1dGUgdG8gQGRtYmF0 dXJpbidzIGVmZm9ydCBpcyB0aGF0IG15DQogIG1haW4gdG9waWMgaXMgYWxnb3JpdGhtaWMsIG9j YW1sIGlzIG1vcmUgYSBnb29kIHdheSB0aGFuIGEgZ29hbC4NCg0KDQpEYW1pZW4gR3VpY2hhcmQg bGF0ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFNvcnJ5LCB5b3UgaGF2 ZSB0byBiZSBhIG1lbWJlciBvZiA8aHR0cHM6Ly93d3cuZGV2ZWxvcHBlei5jb20vPiB0bw0KICBh Y2Nlc3MgdGhpcyBsaW5rLg0KDQogIEhlcmUgaXMgbXkgMm5kIHRyeS4gSSBob3BlIHlvdSBkb24n dCBuZWVkIHRvIGJlIGEgbWVtYmVyIG9mDQogIDxodHRwczovL3d3dy5hZXJpZXNndWFyZC5jb20v PiB0aGlzIHRpbWUuDQogIDxodHRwczovL3d3dy5hZXJpZXNndWFyZC5jb20vbWVkaWEvZ2V0LzUw NGJmYmUzNGQzZjUxN2M4YWNmMzdmZmJlMjAwZjg0Njk4YWNhMGMvQWxnb3JpdGhtaWMtd2l0aC1f T0NhbWwucGRmPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlv dSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJ J2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVd IG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3 aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0K ICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0g PG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBh cmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltv bmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkv Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 30 to April 06,= 2021.

Ecosystem Engineer and Technical Writer positions

Celine announced

Tarides is hiring an Ecosystem Engineer and a Technical Writer.

Tarides is a tech startup based in Paris and founded in 2018. We develop a = software infrastructure platform to deploy secure, distributed applications with strict resource contraints and low-la= tency performance requirements.

We welcome applications from people of all backgrounds. We are working hard= to create a representative, inclusive and friendly team, because we know that different experiences, perspectives and= backgrounds make for a better place.

Please, don't hesitate to contact me if you have any question, I'll be more= than happy to reply! :)

Release of cohttp 4.0.0

Continuing this thread, Calascibetta Romain said

The work on the new conduit is steadily progressing and will be integrated = in a new major release of cohttp in the future, once we will be confident that the API is settled. If you want to t= ry using it immediately, then it is available as the mimic library in ocaml-git.

I just take the opportunity to show up a tutorial about mimic = which is now available into the distribution of it: see here. Thanks for your work about the release process.

agrid 0.1

zapashcanon announced

I'm pleased to announce the first release of agrid.

Agrid stands for Adjustable Grid. Adjustable grids are basically two= dimensional arrays whose width/height can be changed by adding or removing row/column at either end (one at a time).

Here's a very short example :

let () =3D
  let grid =3D Agrid.=
of_list [[1; 2]; [3; 4]] in
  let grid =3D Agrid.=
snoc_row grid (Flex_array.of_=
list [5; 6]) in
  Agrid.pp Format.pp_print_int Format.std_formatter grid
  (* prints:
   * 1; 2
   * 3; 4
   * 5; 6
   *=
)

It's based on the great flex-array library by Jea= n-Christophe Filli=C3=A2tre and is mainly a wrapper around it to make it easier for = the special case of two dimensional arrays.

It's been developped at OCamlPro = while working on mosaic when we wanted to ease= the dataset input process, switching from a basic textarea based input to something which looks like a spreadsheet (this work= is not yet published on the online version).

gasche asked and zapashcanon replied

Out of curiosity: In a spreadsheet, I would assume that inserting/removing = rows or columns in the middle is also a useful operation. Would you be able to add this operation?

It's not really a spreadsheet, it's more something like this. I don't think it would be really useful in the case of mosaic because for big input= s, users are more likely to import the data from a file.

Anyway, it's possible to add this operation, but I can't think of an effici= ent way to do it. I'll think about it and may add such an operation. Actually, if it's added to flex-array, it would = be trivial to add it to agrid, so I'll probably try to add it there.

State of OCaml and web assembly

Deep in this thread, Emilio Jes=C3=BAs Gallego Arias = announced

Yup, we didn't make it yet the "official" release, but it has been used by = quite a few people to avoid lack of tail-call optimization in jsoo, live versions:

It literally flies.

I guess @corwin-of-amber is the right person to comment more on his superb = efforts.

Shachar Itzhaky then added

Hi there @camarick; ocaml-wasm is very much bleeding-edge but it already wo= rks surprisingly well and I have used it to run Coq, esp. for the purpose of making the interactive version of Vols.= I,II from the Software Foundations textbook (see https://jscoq.gith= ub.io/ext/sf and https://jscoq.github.io/ext/sf/tools/jscoq-tester.html).

Of course @ejgallego is exaggerating when he says that it flies, it still r= uns OCaml bytecode in interpreted mode on top of the WASM JIT. Performance is pretty reasonable still, except in the = case some intensive Coq tactics (in which case this is a third level of interpreter… :man_facepalming: ). The = main gap right now is the standard libraries str, unix, and threads, for which I = have compiled empty stubs, because dynamic loading of libraries in WASI is still immature. I have been able to compile num and it = works correctly because it does not depend on anything else. I am currently investigating how to build zarith (which = requires gmp) because Coq 8.13 depends on it.

So yeah, this is not at all the coveted WASM backend for ocamlc, but it's one existing solution and you can hack on it right now. Any help or comments are welcome!

containers 3.3

Simon Cruanes announced

I'm glad to announce the release of containers 3.3. Containers is an extens= ion to OCaml's standard library that strives to be compatible with it, with more features and a few additional m= odules to get dynamic arrays, heaps, S-expression parser/printer, etc.

In this release, we have new support for parsing/printing canonical S-expre= ssions (a simple binary-safe format), a code-generation module for bitfields, and many improvements to existing mod= ules in particular in the interface between maps/set/hashtbl and iterators.

More details in the github release.

Many thanks to the contributors, in particular @Fardale for his work on CI = and auto-doc-generation.

New OCaml books?

Deep in this thread, Damien Guichard announced

I=E2=80=99m also working on a free culture book. The preview is at https://damien-guichard.developpez.com/downloads/Algorithmic-w= ith-OCaml.pdf

It=E2=80=99s under CC-BY-SA.

Planned chapters include : Records, Type polymorphism, Modules as functions= , Conceptual graphs.

The reason why i don't contribute to @dmbaturin's effort is that my main to= pic is algorithmic, ocaml is more a good way than a goal.

Damien Guichard later added

Sorry, you have to be a member of h= ttps://www.developpez.com/ to access this link.

Here is my 2nd try. I hope you don't need to be a member of https://www.aeriesguard.com/ this time. https://www.aeriesguard.com/med= ia/get/504bfbe34d3f517c8acf37ffbe200f84698aca0c/Algorithmic-with-_OCaml.pdf=

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 95168E00B8 for ; Tue, 20 Apr 2021 11:07:41 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AmV9cHKDB3U3lXAvlHelX55DYdL4zR+YMi2QD?= =?us-ascii?q?/UZ3VBBTb4ikh9mj9c5rsCPcpT4NVBgb9uyoF7KHRRrnm6JdxYUKJ7+tUE3HlQ?= =?us-ascii?q?KTQL1KyYvnz3neFzbl9uhbvJ0QEZRWM9H7AVhkgcuS2mDRfuoI+9Wf9bDtuOG2?= =?us-ascii?q?9RZQZDt3YKJt5RoRMHf5LmRKQmB9ZaYRJd69/cxBnjy6ZDA+Ua2AbUUtTqzDr9?= =?us-ascii?q?bKkZL6O3c9bSIa1A=3D=3D?= X-IronPort-AV: E=Sophos;i="5.82,236,1613430000"; d="scan'208,217";a="504083555" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Apr 2021 11:07:41 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 20 Apr 2021 11:07:40 +0200 Message-ID: <878s5dxr1f.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 13 to 20, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Preface (initial release) OCaml Users and Developers Workshop 2021 Timere 0.1.3 - Dealing with time and time zones has never been easier Release of `multipart_form.0.2.0' Engineer position for the development of the Squirrel prover Martin Jambon presentation on Semgrep, Wed April 21 @ 7pm Central Old CWN Preface (initial release) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, @d-plaindoux and @pytre and I are very happy to present *Preface*, a project that has occupied part of our free time for almost 2 years. We received a lot of help from various people (as mentioned in the [CREDITS] page), including some present on this forum (@gasche, @octachron and @snowleopard) Preface is an opinionated library designed to facilitate the handling of recurring functional programming idioms in [OCaml]. Many of the design decisions were made in an attempt to calibrate, as best as possible, to the OCaml language. Trying to get the most out of the module language. *The name "preface" is a nod to "Prelude"* . =E2=80=A2 [Github repository] =E2=80=A2 [Online documentation] [CREDITS] [OCaml] [Github repository] [Online documentation] About the project, and motivation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C When learning functional programming, one is often confronted with constructs derived (or not) from category theory. Languages such as Haskell offer very complete libraries to use them, and thus, facilitate their learning. In OCaml, it often happens that these abstractions are buried in the heart of certain libraries/projects ([Lwt], [Cmdliner], [Bonsai], [Dune] etc.). This is why one of the objectives of Preface is to propose tools for concretising these abstractions, at least as a pedagogical tool. [Lwt] [Cmdliner] [Bonsai] [Dune] Is Preface useful =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C Since OCaml allows for efficient imperative programming, Preface is probably not really useful for building software. However, we (the maintainers) think that Preface can be useful for a few things: =E2=80=A2 technical experimentation with abstractions (especially those f= rom the Haskell world) that allow programming in a fun style. =E2=80=A2 As an educational tool. Many teaching aids generally only offer= the minimal interfaces to these abstractions. Preface tries to be as complete as possible. =E2=80=A2 It was a lot of fun to make. The last point is obviously the lightest but building Preface was really fun! So even if some people won't see the point=E2=80=A6 *we had fun making it*! Let's imagine this scenario! Oh, there's this article that seems to describe quite precisely how to solve `this complex problem', elegantly, using this `collection of abstractions'. After reading, the article is clear and I know how to use this `collection of abstractions' in practice. I would like to test it. Not having enough RAM to install Cabal, I decided to do it in OCaml. But as one abstraction leads to another, I am obliged to build an armada of things and I abandon my experimentation. So now, rather than doing it, locally, for the understanding of an article, I add it in Preface. Additional links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The [README] is quite expansive on motivations and some design choices, but we have tried to add some concrete guides: =E2=80=A2 [ Understanding the module breakdown of Preface] =E2=80=A2 [Effect handling using Freer] =E2=80=A2 [Error handling with Result/Validation and a Free Applicative] And in addition here is a project, by a friend of ours, that uses Preface, to build static blog generators (very original isn't it :P), the code is highly documented and can be an entry point into how to use it: [Github repository of the project] [README] [ Understanding the module breakdown of Preface] [Effect handling using Freer] [Error handling with Result/Validation and a Free Applicative] [Github repository of the project] Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Preface does not offer much that is new, but we have tried to make it user-friendly and to document as much as possible the code and design choices. It's a lot of fun to build=E2=80=A6 and it will probably be just= as much fun to maintain. *We are extremely open to contributions and feedback.* And my last words will be a warm thank you to the OCaml ecosystem that has facilitated so much of our development: Testing with [Alcotest] and [QCheck] is a pleasure. [Dune] is a fast and pleasant build system. [ODoc] has allowed us to have more control over the generation of documentation, especially with the `@inline' comment (on includes) which allows signatures from different modules to be merged. And [MDX] which I did not know at all and which is used extensively for guides. I hope you can find interest in this project! Good luck with the rest of the containment (for those concerned). [Alcotest] [QCheck] [Dune] [ODoc] [MDX] OCaml Users and Developers Workshop 2021 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fr=C3=A9d=C3=A9ric Bour announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my pleasure to invite submissions to the OCaml Users and Developers Workshop 2021, which is again co-located with ICFP and will be held virtually this year. The OCaml Users and Developers Workshop brings together industrial users of OCaml with academics and hackers who are working on extending the language, type system, and tools. Previous editions have been co-located with ICFP 2012 in Copenhagen, ICFP 2013 in Boston, ICFP 2014 in Gothenburg, ICFP 2015 in Vancouver, ICFP 2016 in Nara, ICFP 2017 in Oxford, ICFP 2018 in St Louis, ICFP 2019 in Berlin, and was virtual for ICFP 2020, following the OCaml Meetings in Paris in 2010 and 2011. Important Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [https://icfp21.sigplan.org/home/ocaml-2021 ] =E2=80=A2 [https://ocaml2021.hotcrp.com ] [https://icfp21.sigplan.org/home/ocaml-2021 ] [https://ocaml2021.hotcrp.com ] Important dates =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Thursday 20th May (any time zone): Abstract submission deadline =E2=80=A2 Friday 18th July: Author notification =E2=80=A2 Friday 27th August: OCaml Workshop Scope =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Presentations and discussions focus on the OCaml programming language and its community. We aim to solicit talks on all aspects related to improving the use or development of the language and its programming environment, including, for example (but not limited to): =E2=80=A2 compiler developments, new backends, runtime and architectures =E2=80=A2 practical type system improvements, such as GADTs, first-class modules, generic programming, or dependent types =E2=80=A2 new library or application releases, and their design rationales =E2=80=A2 tools and infrastructure services, and their enhancements =E2=80=A2 prominent industrial or experimental uses of OCaml, or deployme= nts in unusual situations. Presentations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Presentations will be held in the online format. Each presentation comprise a prerecorded presentation and an interactive live Q&A session after the talk. Each talk will be re-translated three times in different time zones. Session chairs and volunteers will assist the authors in preparing and casting the presentation. Each presentation will be made available through the ocaml.org website. Submission =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C To submit a presentation, please register a description of the talk (about 2 pages long) at providing a clear statement of what will be provided by the presentation: the problems that are addressed, the solutions or methods that are proposed. LaTeX-produced PDFs are a common and welcome submission format. For accessibility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .tex sources. Reviewers may read either the submitted PDF or the text version. Camera ready presentations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C A pre-recorded versions of accepted presentation shall be provided before August, 13th. Volunteers will provide technical assistance to authors as well as provide necessary feedback and ensure that all videos match our quality standards. ML family workshop =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C The ML family workshop, held on the previous day, deals with general issues of the ML-style programming and type systems, focuses on more research-oriented work that is less specific to a language in particular. There is an overlap between the two workshops, and we have occasionally transferred presentations from one to the other in the past. Authors who feel their submission fits both workshops are encouraged to mention it at submission time and/or contact the Program Chairs. Program Commitee =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Fr=C3=A9d=C3=A9ric Bour, Tarides, France =E2=80=A2 Cristina Rosu, Janestreet, UK =E2=80=A2 Hakjoo Oh, Korea University, Korea =E2=80=A2 Hugo Heuzard, Janestreet, UK =E2=80=A2 Jeffrey A. Scofield, Formalsim, USA =E2=80=A2 Jonathan Protzenko, MSR, USA =E2=80=A2 Joris Giovanangeli, Ahrefs, Singapore =E2=80=A2 Jun Furuse, Dailambda, Japan =E2=80=A2 Kihong Heo, KAIST, Korea =E2=80=A2 Kate Deplaix, OCaml Labs, UK =E2=80=A2 Medhi Bouaziz, Nomadic Labs, France =E2=80=A2 Simon Castellan, INRIA, France =E2=80=A2 Ryohei Tokuda, Idein, Japan =E2=80=A2 Vaivaswatha Nagaraj, Zilliqa, India =E2=80=A2 Youyou Cong, Tokyo Institute of Technology, Japan Questions and contact =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Please contact the PC Chair ([Fr=C3=A9d=C3=A9ric Bour]) for any questions. [Fr=C3=A9d=C3=A9ric Bour] Timere 0.1.3 - Dealing with time and time zones has never been easier =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Timere 0.2.1 has landed! This release adds nanosecond precision support to timere (and fractional second support at various places), along with other small improvements. Release of `multipart_form.0.2.0' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce the release of [`multipart_form']. Throughout the development of [mrmime], we have gained a thorough knowledge of the RFCs about email. However, these RFCs also describe mechanisms that are found in HTTP/1.1. [`multipart_form'] [mrmime] Genesis =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C More specifically, a lot of work has been done on [RFC 2045] & [RFC 2046] (see [RFC 7578 =C2=A7 4]) which describe the `multipart' format (found in emails and in `HTTP/1.{0,1}' requests when serializing a `
'). From this work (~ 2 years), we decided to extract the parts allowing to manipulate a `multipart/form-data' content for `HTTP/1.{0,1}' responses (plus [RFC 2183]). This resulted in the creation of `multipart_form'. This project is a cross between what many users have been waiting for (for [CoHTTP] and [http/af]), a knowledge of what exists and its limitations, and finally a development in the spirit of MirageOS. The result is an API that is _"full stream"_. Indeed. a question arose from the beginning, how to manipulate this format while: =E2=80=A2 not having access to a file system (MirageOS) =E2=80=A2 not exploding memory usage for file uploads [RFC 2045] [RFC 2046] [RFC 7578 =C2=A7 4] [RFC 2183] [CoHTTP] [http/af] Memory bound implementation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C With the help of @Armael and the [`memtrace'] tool, we were able to implement and extend `multipart_form' so that it is easier to use and really ensures our original assumption about memory consumption. So we experimented with use cases like uploading very large files. Here is the result that `memtrace' gives us with a 100Mb file: The application tries to save the games in files. We use [opium] (and thus http/af) but tests were also done with CoHTTP. The code is available [here] for people who want to reproduce. [`memtrace'] [opium] [here] Documentation & encoding =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Finally, a major effort has been made in the documentation to explain in detail how to use `multipart_form'. Version `0.2.0' also adds a way to produce a `multipart/form-data' document (experimental) with the same constraints on memory usage. I hope this work will be useful to a lot of people. The documentation is available [here]. [here] Engineer position for the development of the Squirrel prover =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: David Baelde announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are looking for an engineer to support the development of Squirrel, an interactive theorem prover for security protocols. The position will be funded by ERC POPSTAR. You may find more details here: Skilled OCaml developers would be most welcome! Martin Jambon presentation on Semgrep, Wed April 21 @ 7pm Central =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Claude Jager-Rubinson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please join us this coming Wednesday at 7pm Central when @mjambon will talk about Semgrep, an open-source ployglot static analysis tool written in OCaml. Details and connection info are available at [Houston Functional Programmers]. [Houston Functional Programmers] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 13 to 20, 2021.

Preface (initial release)

Xavier Van de Woestyne announced

Hello, @d-plaindoux and @pytre and I are very happy to present Preface= , a project that has occupied part of our free time for almost 2 years. We received a lot of help from various people= (as mentioned in the CREDITS page), including some present on this forum (@gasche, @octachron and @snowleopard)

Preface is an opinionated library designed to facilitate the handling of re= curring functional programming idioms in OCaml. Many of the design decisions were = made in an attempt to calibrate, as best as possible, to the OCaml language. Trying to get the most out of the module language. <= b>The name "preface" is a nod to "Prelude" .

About the project, and motivation

When learning functional programming, one is often confronted with construc= ts derived (or not) from category theory. Languages such as Haskell offer very complete libraries to use them, and th= us, facilitate their learning. In OCaml, it often happens that these abstractions are buried in the heart of certain= libraries/projects (Lwt, Cmdliner, Bonsai, Dune etc.). This is why one of the objectives of Preface is to propose tools for concretising these abstractions, at leas= t as a pedagogical tool.

Is Preface useful

Since OCaml allows for efficient imperative programming, Preface is probabl= y not really useful for building software. However, we (the maintainers) think that Preface can be useful for a few th= ings:

  • technical experimentation with abstractions (especially those from the = Haskell world) that allow programming in a fun style.
  • As an educational tool. Many teaching aids generally only offer the min= imal interfaces to these abstractions. Preface tries to be as complete as p= ossible.
  • It was a lot of fun to make. The last point is obviously the lightest b= ut building Preface was really fun! So even if some people won't see the po= int… we had fun making it!

Let's imagine this scenario! Oh, there's this article that seems to describ= e quite precisely how to solve this complex problem, elegantly, using this collection of abstracti= ons. After reading, the article is clear and I know how to use this collection of abstractions in practice. I woul= d like to test it. Not having enough RAM to install Cabal, I decided to do it in OCaml. But as one abstraction leads to another= , I am obliged to build an armada of things and I abandon my experimentation.

So now, rather than doing it, locally, for the understanding of an article,= I add it in Preface.

Additional links

The README is quite = expansive on motivations and some design choices, but we have tried to add some concrete guides:

And in addition here is a project, by a friend of ours, that uses Preface, = to build static blog generators (very original isn't it :P), the code is highly documented and can be an entry po= int into how to use it: G= ithub repository of the project

Conclusion

Preface does not offer much that is new, but we have tried to make it user-= friendly and to document as much as possible the code and design choices. It's a lot of fun to build… an= d it will probably be just as much fun to maintain.

We are extremely open to contributions and feedback.

And my last words will be a warm thank you to the OCaml ecosystem that has = facilitated so much of our development: Testing with Alcotest an= d QCheck is a pleasure. Dune is a fast and pleasant b= uild system. ODoc has allowed us to have more control over the generation of documentation, espec= ially with the @inline comment (on includes) which allows signatures from different modules to be merged. And MDX which I did not k= now at all and which is used extensively for guides.

I hope you can find interest in this project! Good luck with the rest of th= e containment (for those concerned).

OCaml Users and Developers Workshop 2021

Fr=C3=A9d=C3=A9ric Bour announced

It is my pleasure to invite submissions to the OCaml Users and Developers W= orkshop 2021, which is again co-located with ICFP and will be held virtually this year.

The OCaml Users and Developers Workshop brings together industrial users of= OCaml with academics and hackers who are working on extending the language, type system, and tools. Previous edition= s have been co-located with ICFP 2012 in Copenhagen, ICFP 2013 in Boston, ICFP 2014 in Gothenburg, ICFP 2015 in Vanc= ouver, ICFP 2016 in Nara, ICFP 2017 in Oxford, ICFP 2018 in St Louis, ICFP 2019 in Berlin, and was virtual for ICF= P 2020, following the OCaml Meetings in Paris in 2010 and 2011.

Important dates

  • Thursday 20th May (any time zone): Abstract submission deadline
  • Friday 18th July: Author notification
  • Friday 27th August: OCaml Workshop

Scope

Presentations and discussions focus on the OCaml programming language and i= ts community. We aim to solicit talks on all aspects related to improving the use or development of the language and= its programming environment, including, for example (but not limited to):

  • compiler developments, new backends, runtime and architectures
  • practical type system improvements, such as GADTs, first-class modules,= generic programming, or dependent types
  • new library or application releases, and their design rationales
  • tools and infrastructure services, and their enhancements
  • prominent industrial or experimental uses of OCaml, or deployments in u= nusual situations.

Presentations

Presentations will be held in the online format. Each presentation comprise= a prerecorded presentation and an interactive live Q&A session after the talk. Each talk will be re-trans= lated three times in different time zones. Session chairs and volunteers will assist the authors in preparing and cast= ing the presentation. Each presentation will be made available through the ocaml.org website.

Submission

To submit a presentation, please register a description of the talk (about = 2 pages long) at https://ocaml2021.hotcrp.com/= providing a clear statement of what will be provided by the presentation: = the problems that are addressed, the solutions or methods that are proposed.

LaTeX-produced PDFs are a common and welcome submission format. For accessi= bility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .= tex sources. Reviewers may read either the submitted PDF or the text version.

Camera ready presentations

A pre-recorded versions of accepted presentation shall be provided before A= ugust, 13th. Volunteers will provide technical assistance to authors as well as provide necessary feedback and e= nsure that all videos match our quality standards.

ML family workshop

The ML family workshop, held on the previous day, deals with general issues= of the ML-style programming and type systems, focuses on more research-oriented work that is less specific to a = language in particular. There is an overlap between the two workshops, and we have occasionally transferred pre= sentations from one to the other in the past. Authors who feel their submission fits both workshops are encouraged = to mention it at submission time and/or contact the Program Chairs.

Program Commitee

  • Fr=C3=A9d=C3=A9ric Bour, Tarides, France
  • Cristina Rosu, Janestreet, UK
  • Hakjoo Oh, Korea University, Korea
  • Hugo Heuzard, Janestreet, UK
  • Jeffrey A. Scofield, Formalsim, USA
  • Jonathan Protzenko, MSR, USA
  • Joris Giovanangeli, Ahrefs, Singapore
  • Jun Furuse, Dailambda, Japan
  • Kihong Heo, KAIST, Korea
  • Kate Deplaix, OCaml Labs, UK
  • Medhi Bouaziz, Nomadic Labs, France
  • Simon Castellan, INRIA, France
  • Ryohei Tokuda, Idein, Japan
  • Vaivaswatha Nagaraj, Zilliqa, India
  • Youyou Cong, Tokyo Institute of Technology, Japan

Questions and contact

Please contact the PC Chair (F= r=C3=A9d=C3=A9ric Bour) for any questions.

Timere 0.1.3 - Dealing with time and time zones has never been= easier

Darren announced

Timere 0.2.1 has landed!

This release adds nanosecond precision support to timere (and fractional se= cond support at various places), along with other small improvements.

Release of multipart_form.0.2.0

Calascibetta Romain announced

I am pleased to announce the release of multipart_form. Throughout the development of mrmime,= we have gained a thorough knowledge of the RFCs about email. However, these RFCs also describe mechanisms that are found in HTTP/= 1.1.

Genesis

More specifically, a lot of work has been done on RFC 2045 & RFC 2046 (see RFC= 7578 =C2=A7 4) which describe the multipart format (found in emails and in HT= TP/1.{0,1} requests when serializing a <form>).

>From this work (~ 2 years), we decided to extract the parts allowing to man= ipulate a multipart/form-data content for HTTP/1.{0,1} responses (plus RFC 2183). This resulted in the creation of multipart_form.

This project is a cross between what many users have been waiting for (for CoHTTP and http/af), a knowledge of what exists and its limitations, and finally a development in the spirit= of MirageOS.

The result is an API that is "full stream"= . Indeed. a question arose from the beginning, how to manipulate this format while:

  • not having access to a file system (MirageOS)
  • not exploding memory usage for file uploads

Memory bound implementation

With the help of @Armael and the memtrace tool, we were able to implement and extend multipart_form so that it= is easier to use and really ensures our original assumption about memory consumption.

So we experimented with use cases like uploading very large files. Here is = the result that memtrace gives us with a 100Mb file:

3D"=

The application tries to save the games in files. We use opium (and thus http/af) but tests were also done with CoHTTP. The code is available here for people who want to reproduce.

Documentation & encoding

Finally, a major effort has been made in the documentation to explain in de= tail how to use multipart_form. Version 0.2.0 also adds a way to produce a multipart/form-data document (experimental) with the same constraints on memory usage.

I hope this work will be useful to a lot of people. The documentation is av= ailable here.

Engineer position for the development of the Squirrel prover

David Baelde announced

We are looking for an engineer to support the development of Squirrel, an interactive theorem prover for security protocols. The position will be funded by ERC POPSTAR. You may find more details here:

https://people.irisa.fr/Stephanie.Delaune/internship/suje= t-engineer-squirrel.pdf

Skilled OCaml developers would be most welcome!

Martin Jambon presentation on Semgrep, Wed April 21 @ 7pm Cent= ral

Claude Jager-Rubinson announced

Please join us this coming Wednesday at 7pm Central when @mjambon will tal= k about Semgrep, an open-source ployglot static analysis tool written in OCaml.

Details and connection info are available at = Houston Functional Programmers.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id E77F7E020F for ; Tue, 27 Apr 2021 16:26:24 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AQc1H7aNe21o4p8BcT47155DYdL4zR+YMi2QD?= =?us-ascii?q?/UoZc3xoW+afkN2jm+le8BfyhioYVn1Io6H5BICrR3TA+ZlppbQAJLvKZniehE?= =?us-ascii?q?KEJJxvhLGSpwHINDb58odmpMRdWoxfLPG1MlRgl8b952CDYrAd6f2K6rqhi+ub?= =?us-ascii?q?71oFd3AOV4ha4w10ChmWHyRNLWEsb/dXeqa03NZNpDarZB0sH6aGL0QCNtKjm/?= =?us-ascii?q?T2jp78JTYJCxk7gTP+6g+A2frAHx+RwxsEFwpTz7tny3HMlybw+r+u2svLtyP0?= =?us-ascii?q?5ivp45Nfhdf7juJfCsDJsNEcLg/njB2lDb4RIYGqjXQPrOam9Vow1ODQrRtlBd?= =?us-ascii?q?1670nNdny4yCGdoDXI4XIQ62T/0xuji3PlpsD1LQhXN/Z8?= X-IronPort-AV: E=Sophos;i="5.82,254,1613430000"; d="scan'208,217";a="379820373" Received: from clt-128-93-177-151.vpn.inria.fr (HELO set) ([128.93.177.151]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Apr 2021 16:26:21 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 27 Apr 2021 16:26:12 +0200 Message-ID: <87h7jrregr.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjAgdG8gMjcsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmRvY3Mub2Nh bWwucHJvIDogYW4gT0NhbWwgRG9jdW1lbnRhdGlvbiBIdWINCkRlY29tcHJlc3MgMS40LjANCmVs bGlwdGljIGN1cnZlcyAtIG1haW50YWluYWJsZSBhbmQgdmVyaWZpZWQgKGZ1bGwgc3RhY2ssIGZy b20gcHJpbWl0aXZlcyB0byBUTFMpDQpGaXJzdCByZWxlYXNlIG9mIERvY3RldXIsIGFuIG9waW5p YXRlZCByZWFkLW9ubHkgZmlsZS1zeXN0ZW0gZm9yIE1pcmFnZU9TDQpPY2FtbC1zb2xpZGl0eSwg YSBuZXcgT0NhbWwgbGlicmFyeSBmb3IgU29saWRpdHkNCk1pZ3JhdGluZyB0byBmbG9hdGFycmF5 IChibG9nIHBvc3QpDQpPbGQgQ1dODQoNCg0KZG9jcy5vY2FtbC5wcm8gOiBhbiBPQ2FtbCBEb2N1 bWVudGF0aW9uIEh1Yg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZG9jcy1vY2FtbC1wcm8tYW4tb2NhbWwtZG9jdW1lbnRh dGlvbi1odWIvNzcxOC8xPg0KDQoNCkZhYnJpY2UgTGUgRmVzc2FudCBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRo YXQgd2UganVzdCBwdWJsaXNoZWQgdGhlIGZpcnN0IHZlcnNpb24gb2YNCiAgdGhlIE9DYW1sIERv Y3VtZW50YXRpb24gSHViIG9uOg0KDQogIDxodHRwczovL2RvY3Mub2NhbWwucHJvPg0KDQogIFRo ZSBPQ2FtbCBEb2N1bWVudGF0aW9uIEh1YiBjYW4gYmUgdXNlZCB0byBicm93c2UgdGhlIHNvdXJj ZXMgYW5kIHRoZQ0KICBkb2N1bWVudGF0aW9ucyBvZiBtb3JlIHRoYW4gMjAwMCBvcGFtIHBhY2th Z2VzLCBmb2xsb3dpbmcgbGlua3MNCiAgYmV0d2VlbiB0aGVtIHdoZW4gdXNlZnVsLiBUaGlzIGlz IGEgd29yay1pbi1wcm9ncmVzcywgYW5kIHdlIGFyZQ0KICB3b3JraW5nIG9uIGltcHJvdmluZyBp dCB3aXRoIG1hbnkgbW9yZSBmZWF0dXJlcywgc3VjaCBhcyBzb3VyY2UNCiAgYW5ub3RhdGlvbnMg d2l0aCB0eXBlcywgZnVsbC10ZXh0IGFuZCB0eXBlLWRyaXZlbiBzZWFyY2hlcywNCiAgaW1wcm92 ZW1lbnRzIGluIHRoZSBnZW5lcmFsIHJlYWRhYmlsaXR5IG9mIGRvY3VtZW50YXRpb24sIGV0Yy4N Cg0KICBUaGUgc2l0ZSBpcyBnZW5lcmF0ZWQgdXNpbmcgYW4gb3Blbi1zb3VyY2UgdG9vbCBjYWxs ZWQgZGlnb2RvYywNCiAgYXZhaWxhYmxlIG9uOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vT0Nh bWxQcm8vZGlnb2RvYz4NCg0KICBEaWdvZG9jIGlzIGFibGUgdG8gYnVpbGQgYSBtYXAgb2YgYW4g b3BhbSBzd2l0Y2gsIHdpdGggbGlua3MgYmV0d2Vlbg0KICBmaWxlcywgb3BhbSBwYWNrYWdlcywg b2NhbWwgbGlicmFyaWVzLCBtZXRhIHBhY2thZ2VzIGFuZCBvY2FtbA0KICBtb2R1bGVzLiBJdCBp cyBhbHNvIGFibGUgdG8gZ2VuZXJhdGUgZG9jdW1lbnRhdGlvbiB1c2luZyBvZG9jIHdpdGgNCiAg Y3Jvc3MtaW5kZXhlcyBiZXR3ZWVuIGFsbCB0aGVzZSBraW5kcyBvZiBwYWNrYWdlcy4NCg0KICBX ZSB3ZWxjb21lIGZlZWRiYWNrIGFuZCBjb250cmlidXRpb25zISAgRW5qb3kgIQ0KDQoNClNpbW9u IENydWFuZXMgc2FpZCBhbmQgQW5pbCBNYWRoYXZhcGVkZHkgYWRkZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEdyZWF0IHdvcmsgb24gdGhpcyBzaXRlLCBhbmQgSSBsb3ZlIHRoZSBk b21haW4gbmFtZSBhcyB3ZWxsIDstKQ0KDQogICAgICAgIFRoZSBjcm9zcyBsaW5raW5nIGJldHdl ZW4gcGFja2FnZXMgaXMgZmFudGFzdGljLg0KDQogIEFzIGEgYml0IG9mIGJhY2tncm91bmQgb24g d2h5IGRvY3VtZW50YXRpb24gY3Jvc3MtbGlua2luZyBoYXMgdGFrZW4gc28NCiAgbG9uZywgdGhl cmUgaXMgYSBsb25ubmdnZyBoaXN0b3J5IGludGVydHdpbmVkIHdpdGggbWFueSBwZW9wbGUncw0K ICBjb250cmlidXRpb25zIHRvIG9wYW0sIGJ1aWxkIHN5c3RlbXMgKG9jYW1sYnVpbGQgYW5kIGR1 bmUpLA0KICBjb252ZW50aW9ucyAoZmluZGxpYiBhbmQgb2RpZykgYW5kIG9mIGNvdXJzZSBbb2Rv Y10gaXRzZWxmLiAgVGhlIG1ham9yDQogIG1pbGVzdG9uZXMgYWxvbmcgdGhlIHdheSBoYXZlIGJl ZW46DQoNCiAg4oCiIFtvZG9jIDEuMF0sIGZpcnN0IGJlZ2FuIGluIDIwMTQgYXMgYSBxdWljayBw cm9qZWN0IHRvIHB1bGwgdG9nZXRoZXINCiAgICB0eXBpbmcgaW5mb3JtYXRpb24gZnJvbSBjbXRb aV0gZmlsZXMsIGJ1dCB3aGljaCByYW4gaW50byB0aGUgcHJvYmxlbQ0KICAgIHRoYXQgaXQgbmVl ZHMgYSBjb25zaXN0ZW50IHNldCBvZiBjb21waWxlZCBjbXQgZmlsZXMgdG8gYWN0dWFsbHkNCiAg ICB3b3JrLCBhbmQgc28gbmVlZHMgaGVscCBmcm9tIGV4dGVybmFsIHRvb2xzIHRvIHB1bGwgdGhh dCBzZXQgb2YNCiAgICBjb21waWxlZCBsaWJyYXJpZXMgdG9nZXRoZXIuDQogIOKAoiBbb2RpZ10s IHdoaWNoIHB1bGxzIHRvZ2V0aGVyIG11bHRpcGxlIG9wYW0gcGFja2FnZXMgKGFuZCBhDQogICAg ZmlsZXN5c3RlbSBsYXlvdXQgZm9yIG1ldGFkYXRhKSBhbmQgcnVucyBvZG9jIG9uIHRoZW4uIFRo aXMgYWxsb3dlZA0KICAgIGZvciB0aGUgY3JlYXRpb24gb2YgPGh0dHBzOi8vZG9jcy5taXJhZ2Uu aW8+IGEgZmV3IHllYXJzIGFnbyB3aGljaA0KICAgIGNyb3NzLXJlZmVyZW5jZXMgYSBzbWFsbGVy IG51bWJlciBvZiBwYWNrYWdlcw0KICDigKIgb3BhbS1yZXBvIGl0c2VsZiBoYXMgaGFkIGJldHRl ciBhbmQgYmV0dGVyIGJ1bGsgYnVpbGRzIG92ZXIgdGhlDQogICAgeWVhcnMgdG8gZW5zdXJlIHRo YXQgd2UgY2FuIGFjdHVhbGx5IGF1dG9tYXRpY2FsbHkgY29tcGlsZSBhbGwgdGhlDQogICAgYXJ0 ZWZhY3RzIG5lZWRlZCBmb3IgZG9jcyBidWlsZHMsIHRoYW5rcyB0byBlZmZvcnRzIGxpa2UgW2hl YWx0aA0KICAgIGNoZWNrXSBhbmQgW29jdXJyZW50XS4NCiAg4oCiIG9kb2MgMi4wLCB3aGljaCBm ZWF0dXJlZCBhIG11bHRpLXllYXIgW3Jld3JpdGVdIG9mIHRoZSBPQ2FtbCBtb2R1bGUNCiAgICBy ZXNvbHZlciBhbmQgaW50cm9kdWNlZCBhIG5ldyBbb3V0cHV0IElSXS4gIFRoaXMgZm9ydGhjb21p bmcgcmVsZWFzZQ0KICAgIHdhcyBwcmVzZW50ZWQgaW4gdGhpcyBbT0NhbWwgMjAyMCB0YWxrXSBi eSBAam9ubHVkbGFtLg0KDQogIEFuZCBub3cgd2l0aCBhbGwgdGhlc2UgcGllY2VzIGluIHBsYWNl LCB0aGUgT0NhbWwgZG9jdW1lbnRhdGlvbiBzcHJpbmcNCiAgaGFzIGFycml2ZWQhIFRoZSBPQ2Ft bFBybyBvbmUgcG9zdGVkIGhlcmUgYXMgdGhlIGZpcnN0IG9mIHRoZSAibmV3DQogIGJhdGNoIiBv ZiBtYXNzIGRvY3VtZW50YXRpb24gaW5kZXhlcnMsIGFuZCBJJ20gYXdhcmUgb2YgY29uY3VycmVu dA0KICBlZmZvcnRzIGJ5IHRoZSBvZG9jL29jYW1sLm9yZyBtYWludGFpbmVyIHRlYW1zIHRvIHB1 c2ggYSBjZW50cmFsIG9uZQ0KICBvdXQgdG8gb2NhbWwub3JnLCBhcyB3ZWxsIGFzIGJ5IHRoZSBN aXJhZ2VPUyB0ZWFtIHdobyBhcmUgcmVmcmVzaGluZw0KICBkb2NzLm1pcmFnZS5pbyB3aXRoIHRo ZSBsYXRlc3QgYW5kIGdyZWF0ZXN0LiAgSSdtIHN1cmUgd2hlbiB0aGUgZHVzdA0KICBoYXMgc2V0 dGxlZCBvbiBhbGwgdGhlc2UgaW5kZXhlcnMgd2UgY2FuIGxvb2sgZm9yIGNvbW1vbiBwaWVjZXMs IGJ1dA0KICBmb3Igbm93IGl0J3MgbG92ZWx5IHRvIHNlZSBzbyBtdWNoIGlubm92YXRpb24gaGFw cGVuaW5nIGF0IHBhY2UuDQoNCiAgRm9yIHRoZSBjb21tdW5pdHk6IG5vdyBpcyB0aGUgdGltZSB0 byBmaXggeW91ciBkb2NzdHJpbmdzIGluIHlvdXINCiAgbGlicmFyaWVzLCBhcyB0aGVyZSB3aWxs IG1hbnkgY29vbCB0b29scyBwYXJzaW5nIGFuZCBwcm9jZXNzaW5nIHRoZW0sDQogIGFuZCByZW5k ZXJpbmcgdGhlbSBpbnRvIGFsbCBraW5kcyBvZiBvdXRwdXQgZm9ybWF0cyENCg0KICBUbyB0aGUg W29kb2MgY29udHJpYnV0b3JzXSwgdGhhbmsgeW91ISBUaGUgam91cm5leSB0byBnZXQgdG8gdGhp cw0KICBkb2N1bWVudGF0aW9uIHNpdGUgc3RhcnRlZCBoZXJlIHNldmVuIHllYXJzIGFnbzoNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGNvbW1pdCBlZjkxNTcxY2FiMzFkOWVjZTdhZjk2NWVk NTJlYWFmZjU3YTEyZWZjDQogIOKUgiBBdXRob3I6IExlbyBXaGl0ZSA8bHB3MjVAY2wuY2FtLmFj LnVrPg0KICDilIIgRGF0ZTogICBUaHUgT2N0IDE2IDE5OjIwOjE4IDIwMTQgKzAxMDANCiAg4pSC IA0KICDilIIgICAgIEluaXRpYWwgY29tbWl0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEBsZWZl c3NhbiBvbmUgdGhpbmcgSSdtIG5vdCBzdXJlIGFib3V0IGluIHlvdXIgc2l0ZSBpcyB0aGUgImNv cHlyaWdodA0KICBsaWJyYXJ5IGF1dGhvcnMiIGNsYWltLiBUaGF0J3MgbXVya3kgbGVnYWwgZ3Jv dW5kIOKAkyBpdCdzIHdvcnRoDQogIGVzdGFibGlzaGluZyBpZiB0aGUgb2RvYyBIVE1MIGhhcyBn b25lIHRocm91Z2ggYSBjb21waWxhdGlvbiBwcm9jZXNzDQogIGFuZCBzbyBpcyBubyBsb25nZXIg Y29weXJpZ2h0IHRoZSBhdXRob3JzIChqdXN0IGFzIGEgYmluYXJ5IG91dHB1dCBpcw0KICBub3Qg Y29weXJpZ2h0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZSkuIElmIHRoZSBvdXRwdXQgX2lzXyBj b3B5cmlnaHQNCiAgdGhlIGF1dGhvcnMsIHRoZW4gdGhleSBoYXZlIHJlYXNvbmFibGUgZ3JvdW5k cyB0byBjbGFpbSB0aGF0IHlvdQ0KICBzaG91bGQgYWxzbyByZXByb2R1Y2UgdGhlIGNvcHlyaWdo dCBub3RpY2UgYW5kIG90aGVyIGxpY2Vuc2UNCiAgcmVzdHJpY3Rpb25zLiBQZXJzb25hbGx5LCBJ IHByZWZlciB0byBjbGFpbSB0aGF0IHRoZXJlIGlzIG5vIGNvcHlyaWdodA0KICB0byB0aGUgb3Jp Z2luYWwgYXV0aG9ycyBpbiBvZG9jIG91dHB1dCwgYW5kIHNpZGVzdGVwIHRoaXMgaXNzdWUuDQoN Cg0KW29kb2NdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYz4NCg0KW29kb2MgMS4wXSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2M+DQoNCltvZGlnXSA8aHR0cHM6Ly9naXRodWIu Y29tL2RidWVuemxpL29kaWc+DQoNCltoZWFsdGggY2hlY2tdIDxodHRwczovL2dpdGh1Yi5jb20v b2N1cnJlbnQvb3BhbS1oZWFsdGgtY2hlY2s+DQoNCltvY3VycmVudF0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY3VycmVudC9vdmVydmlldz4NCg0KW3Jld3JpdGVdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2RvYy9wdWxsLzQzOT4NCg0KW291dHB1dCBJUl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vZG9jL3B1bGwvNDIzPg0KDQpbT0NhbWwgMjAyMCB0YWxrXSA8aHR0cHM6Ly93d3cueW91 dHViZS5jb20vd2F0Y2g/dj13VnlaLUt2ZU4tdyZ0PTNzPg0KDQpbb2RvYyBjb250cmlidXRvcnNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9ncmFwaHMvY29udHJpYnV0b3JzPg0KDQoN CkZhYnJpY2UgTGUgRmVzc2FudCByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGFua3MgQGF2c20gLCBhbGwgdGhlc2UgcHJvamVjdHMgd2VyZSBpbmRlZWQgaW1wb3J0YW50IG1p bGVzdG9uZXMNCiAgdG93YXJkcyB0aGUgY3JlYXRpb24gb2YgdGhpcyBzaXRlLiBIb3dldmVyLCBJ IHdvdWxkbid0IHdhbnQgdGhpcw0KICBoaXN0b3J5IHBlcnNwZWN0aXZlIHRvIGdpdmUgdGhlIHdy b25nIGZlZWxpbmcgdGhhdCBidWlsZGluZyB0aGlzIHNpdGUNCiAgd2FzIGVhc3ksIGl0IGlzIHRo ZSByZXN1bHQgb2YgYSB2ZXJ5IGdvb2QsIGxvbmcgYW5kIGhhcmQgd29yayBieSB0aGUNCiAgdGVh bSBhdCBPQ2FtbFBybyB0byBtYWtlIGl0IHdvcmsgZGVzcGl0ZSBhIHJvYWQgcGF2ZWQgd2l0aCBt YW55DQogIG9ic3RhY2xlcy4gSXQgYWxzbyBiZW5lZml0ZWQgZnJvbSBPQ2FtbFBybydzIGxvbmcg aGlzdG9yeSBvZg0KICBpbm5vdmF0aXZlIHByb2plY3RzIGZvciB0aGUgT0NhbWwgY29tbXVuaXR5 LCB0aGF0IGxlYWQgZm9yIGV4YW1wbGUgaW4NCiAgdGhlIHBhc3QgdG8gT3BhbSwgW1RyeS1PQ2Ft bF0sIE1lbXByb2YvW01lbXRob2wsXSBbT3BhbS1idWlsZGVyXSwNCiAgW0xlYXJuLU9DYW1sXSwg dGhlIFR5cGVyZXggdG9vbHMgKG9jcC1pbmRlbnQsIG9jcC1pbmRleCwgb2NwLWJ1aWxkLA0KICBl dGMuKSBhbmQgbW9yZSByZWNlbnRseSBbb3BhbS1iaW5dIGFuZCBbZHJvbV0uDQoNCiAgQXMgSSBz YWlkLCB0aGlzIGlzIGEgd29yay1pbi1wcm9ncmVzcywgYW5kIHRoZXJlIGFyZSBtYW55IGZlYXR1 cmVzDQogIHRoYXQgd2Ugd2lsbCBiZSBhZGRpbmcgaW4gdGhlIG5leHQgbW9udGhzIHRvIG1ha2Ug dGhpcyB3ZWJzaXRlIG11Y2gNCiAgZWFzaWVyIHRvIG5hdmlnYXRlLCBmb3IgdXNlcnMgdG8gcmFw aWRlbHkgcmVhY2ggdGhlIGluZm9ybWF0aW9uIHRoYXQNCiAgbWF0dGVycyBmb3IgdGhlbS4gV2Ug aG9wZSBpdCB3aWxsIGJlIGluc3BpcmF0aW9uYWwgZm9yIGFsbCB0aGUgb3RoZXINCiAgZGV2ZWxv cGVycyB3aG8gYXJlIHdvcmtpbmcgb24gc2ltaWxhciBwcm9qZWN0cywgYW5kIHdlIGFyZSBsb29r aW5nDQogIGZvcndhcmQgdG8gdXNpbmcgdGhlaXIgcHJvamVjdHMgc29vbiB0b28hDQoNCg0KW1Ry eS1PQ2FtbF0gPGh0dHBzOi8vdHJ5Lm9jYW1scHJvLmNvbS8+DQoNCltNZW10aG9sLF0NCjxodHRw czovL3d3dy5vY2FtbHByby5jb20vMjAyMC8xMi8wMS9tZW10aG9sLWV4cGxvcmluZy1wcm9ncmFt LXByb2ZpbGluZy8+DQoNCltPcGFtLWJ1aWxkZXJdIDxodHRwczovL2hhbC5pbnJpYS5mci9oYWwt MDEzNTIwMDg+DQoNCltMZWFybi1PQ2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9s ZWFybi1vY2FtbD4NCg0KW29wYW0tYmluXSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29w YW0tYmluPg0KDQpbZHJvbV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFByby9kcm9tLz4NCg0K DQpEYW5pZWwgQsO8bnpsaSBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBJJ2QganVzdCBsaWtlIHRvIHN0cmVzcyB0aGF0IGBv ZGlnJyBkb2N1bWVudHMgT0NhbWwgcGFja2FnZSBpbnN0YWxscw0KICByZWdhcmRsZXNzIG9mIHRo ZSBwYWNrYWdlIG1hbmFnZXIgdXNlZCBhcyBsb25nIHRoZSBpbnN0YWxsIHN0cnVjdHVyZQ0KICBm b2xsb3dzIFt0aGVzZSBjb252ZW50aW9uc10gKHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGZvbGxv d2VkIGJ5IFtkdW5lDQogIGluc3RhbGxzXSkgLg0KDQogIEFsc28gZm9yIHBlb3BsZSB1c2luZyBt eSBwYWNrYWdlcywgSSdkIGp1c3QgbGlrZSB0byBtZW50aW9uIHRoZXkgbWF5DQogIG1pc3MgaW1w b3J0YW50IGRvY3VtZW50YXRpb24gYml0cyBvbiBbaHR0cHM6Ly9kb2NzLm9jYW1sLnByb10gdW50 aWwNCiAgW3RoYXQgaXNzdWVdIGlzIHJlc29sdmVkLg0KDQoNClt0aGVzZSBjb252ZW50aW9uc10N CjxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9vZGlnL2RvYy9wYWNrYWdpbmcuaHRtbD4N Cg0KW2R1bmUgaW5zdGFsbHNdDQo8aHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJs ZS9vcGFtLmh0bWwjb2RpZy1jb252ZW50aW9ucz4NCg0KW2h0dHBzOi8vZG9jcy5vY2FtbC5wcm9d IDxodHRwczovL2RvY3Mub2NhbWwucHJvLz4NCg0KW3RoYXQgaXNzdWVdIDxodHRwczovL2dpdGh1 Yi5jb20vT0NhbWxQcm8vZGlnb2RvYy9pc3N1ZXMvMzM+DQoNCg0KTXVjaCBsYXRlciBpbiB0aGUg dGhyZWFkLCBLaXJhbiBHb3BpbmF0aGFuIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEl0J3Mgbm90IHF1aXRlIHRoZSBzYW1lIGFzIGhvb2dsZSwgYnV0IG1lcmxpbiBoYXMg YSBmdW5jdGlvbmFsaXR5IHRvDQogIHNlYXJjaCBmb3IgZnVuY3Rpb25zIGJ5IHR5cGUgc2lnbmF0 dXJlIC0gdGhlIGZlYXR1cmUgZG9lc24ndCBzZWVtIHRvDQogIGdldCBtdWNoIGF0dGVudGlvbiBh cHBhcmVudGx5IC0gcHJvYmFibHkgdGhlIGludGVyZmFjZSBpcyBhIGxpdHRsZQ0KICBsYWNraW5n LCBidXQgd2l0aCBzb21lIGV4dHJhIGVsaXNwIHR1bmluZywgaXQgY2FuIHdvcmsgcXVpdGUgc21v b3RobHk6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3Vw bG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvMy8zYzJkMWM2M2ZhYzdjYmQ3ZGQxYmI1YjlhNDA2NTg5 ZTAzMWNiNzk1LmdpZj4NCg0KDQpZYXdhciBBbWluIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBjb21tYW5kIGxpbmUgZm9yIHRoaXM6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvY2Ft bG1lcmxpbiBzaW5nbGUgc2VhcmNoLWJ5LXBvbGFyaXR5IC1wb3NpdGlvbiAwIC1xdWVyeSAnLWlu dCArc3RyaW5nJw0KICDilJTilIDilIDilIDilIANCg0KICAoVG8gc2VhcmNoIGZvciB2YWx1ZXMg b2YgdHlwZSBgaW50IC0+IHN0cmluZycuKQ0KDQoNCkRlY29tcHJlc3MgMS40LjANCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRlY29tcHJlc3MtMS00LTAvNzcyNC8xPg0K DQoNCkNoYXJsZXMgRWRvdWFyZCBMZWNhdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQpHcmVldGluZ3MgZXZlcnlvbmUsDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGFtIGhhcHB5 IHRvIGFubm91bmNlIHRoZSBuZXcgcmVsZWFzZSBvZiBbZGVjb21wcmVzcyAxLjQuMF0sDQogIGF2 YWlsYWJsZSBmb3IgaW5zdGFsbGF0aW9uIHZpYSBPUEFNLiBEZWNvbXByZXNzIGlzIGEgbGlicmFy eQ0KICBjb250YWluaW5nIGEgcHVyZSBPQ2FtbCBpbXBsZW1lbnRhdGlvbiBvZiBzZXZlcmFsIGNv bXByZXNzaW9uDQogIGFsZ29yaXRobXM6DQogIOKAoiBSRkMxOTUxDQogIOKAoiBabGliDQogIOKA oiBHemlwDQogIOKAoiBMWk8NCg0KICBJdCdzIGdvYWwgaXMgdG8gcHJvdmlkZSBzZXZlcmFsIGFs Z29yaXRobXMgZm9yIGJvdGggdGhlIGluZmxhdGlvbiBhbmQNCiAgdGhlIGRlZmxhdGlvbiBvZiBv YmplY3RzLCBpbiB0aGUgZm9ybSBvZiBhIHN0cmVhbSBBUEkgYWxsb3dpbmcgdG8gY2FsbA0KICB0 aGUgY2hvc2VuIGFsZ29yaXRobSBvbmUgYml0IGF0IGEgdGltZS4gU3VjaCBiZWhhdmlvciBhbGxv d3MgZm9yIGFuDQogIGVhc3kgdXNlIG9mIGRlY29tcHJlc3MgaW4gc2l0dWF0aW9ucyB3aGVyZSB3 ZSB3b3VsZCBub3QgYmUgYWJsZSB0bw0KICBoYXZlIHRoZSBpbnB1dCBpbiBvbmUgZ28sIG9yIHdo ZXJlIHdlIHdvdWxkIGxpa2UgdG8gb3V0cHV0IHRoZSByZXN1bHQNCiAgaW4gYSBub24gYmxvY2tp bmcgd2F5LiBUaGlzIG5ldyByZWxlYXNlIGNvbWVzIHdpdGggc2V2ZXJhbA0KICBpbXByb3ZlbWVu dHMgdG8gdGhlIGRvY3VtZW50YXRpb24gYW5kIGJ1ZyBmaXhlcywgYnV0IGV2ZW4gbW9yZSwgd2l0 aCBhDQogIHdob2xlIG5ldyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIHJmYyAxOTUxIGFuZCB6bGli IGFsZ29yaXRobXMuDQoNCg0KW2RlY29tcHJlc3MgMS40LjBdDQo8aHR0cHM6Ly9naXRodWIuY29t L21pcmFnZS9kZWNvbXByZXNzL3JlbGVhc2VzL3RhZy92MS40LjA+DQoNCg0KTm9uLXN0cmVhbSBp bXBsZW1lbnRhdGlvbiBmb3IgcmZjIDE5NTEgYW5kIHpsaWINCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFVwIHRvIHRoaXMgZGF5LCBkZWNvbXByZXNzIHdhcyB1c2VkIGluIHNldmVy YWwgcHJvamVjdHMgbGlrZQ0KICBvY2FtbC1naXQuIEhvd2V2ZXIsIGFzIHRpbWUgcGFzc2VkIGJ5 LCBpdCBhcHBlYXJlZCB0aGF0IGluIHNvbWUgY2FzZXMsDQogIHRoZSBjdXJyZW50IGltcGxlbWVu dGF0aW9uIG9mIGRlY29tcHJlc3Mgd2FzIG5vdCB0aGUgb3B0aW1hbCBzb2x1dGlvbjoNCiAgQXMg dXNlZnVsIGFzIGEgc3RyZWFtIGltcGxlbWVudGF0aW9uIGlzLCBpdCByZXF1aXJlcyB0byBzYXZl IGEgbG90IG9mDQogIGluZm9ybWF0aW9uIGFib3V0IHRoZSBzdGF0ZSBvZiB0aGUgY29tcHJlc3Np b24sIGluIG9yZGVyIHRvIHJlc3VtZSBpdA0KICBvbmNlIHdlIGhhdmUgZW5vdWdoIGlucHV0Lg0K DQogIFRoaXMgaXMgd2h5LCBpbiBzb21lIGNhc2VzIHdoZXJlIHdlIHdvdWxkIGJlIHN1cmUgdGhh dCB3ZSBoYXZlIG91cg0KICB3aG9sZSBpbnB1dCBpbiBvbmUgZ28sIHdlIG1pZ2h0IHdhbnQgdG8g YXZvaWQgYWxsIG9mIHRoZXNlIHNpZGUtY29zdHMsDQogIGFuZCBkaXJlY3RseSBnbyB0byB0aGUg cG9pbnQuDQoNCg0KU3RhdGUgb2YgdGhlIGFydDogbGliZGVmbGF0ZQ0K4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSEDQoNCiAgVGhpcyBuZXcgcHJvYmxlbWF0aWMgaW4gbWluZCwgd2UgaGF2ZSBz dGFydGVkIHRoaW5raW5nIGFib3V0IHRoZQ0KICBleGlzdGluZyBpbXBsZW1lbnRhdGlvbnMgb2Yg dGhlc2UgYWxnb3JpdGhtcyB3aGljaCB3ZXJlIGFsc28gYnlwYXNzaW5nDQogIHRoZSBzdHJlYW0g YmVoYXZpb3IuIE9uZSBpbXBsZW1lbnRhdGlvbiB0aGF0IHByb3ZlZCB0byBiZSBhIHN1aXRhYmxl DQogIGV4YW1wbGUgZm9yIG91ciBwcm9ibGVtLCB3YXMgdGhlIGxpYnJhcnkgYGxpYmRlZmxhdGUn LCBhbg0KICBpbXBsZW1lbnRhdGlvbiBpbiBDLiBJdCdzIG1haW4gYWR2YW50YWdlcyBiZWluZzog YSBiZXR0ZXIgY29tcHJlc3Npb24NCiAgcmF0aW8gdGhhbiB6bGliIGFuZCB3aXRoIGZhc3RlciBy dW50aW1lLg0KDQogIEl0IHdhcyB1c2VkIGFzIHRoZSBzb2xpZCBiYXNlIGZvciB0aGUgT0NhbWwg aW1wbGVtZW50YXRpb24gcHJvdmlkZWQgYnkNCiAgdGhpcyBuZXcgcmVsZWFzZS4NCg0KDQpPQ2Ft bCB2ZXJzaW9uIG9mIGxpYmRlZmxhdGUsIHBlcmZvcm1hbmNlcyBhbmQgdXNlIGNhc2VzDQrilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICBJbmhl cml0aW5nIHRoZSBsb2dpYyBvZiBsaWJkZWZsYXRlLCB0aGUgbmV3IGltcGxlbWVudGF0aW9uIG5v dyBoYXMgYQ0KICBiZXR0ZXIgY29tcHJlc3Npb24gcmF0aW8sIHdoaWxlIGJlaW5nIHNsaWdodGx5 IGZhc3RlciBhdCBpdC4gT24gdGhlDQogIG90aGVyIHNpZGUsIHRoZSBkZWNvbXByZXNzaW9uIGlz IHdheSBmYXN0ZXIsIHdpdGggYDMzJSBvZiBzcGVlZA0KICBpbmNyZWFzZSBpbiBtb3N0IHRlc3Rl ZCBjYXNlczogT24gdGhlIH5ib29rMicgKGZyb20gdGhlIENhbGdhcnkNCiAgY29ycHVzKSBmaWxl Og0KICDigKIgYGRlY29tcHJlc3MnIChzdHJlYW0pOiAxNSBNYi9zIChkZWZsYXRpb24pLCA3NiBN Yi9zIChpbmZsYXRpb24pLA0KICAgIHJhdGlvOiA0Mi40NiAlDQogIOKAoiBgZGVjb21wcmVzcycg KG5vbi1zdHJlYW0pOiAxNyBNYi9zIChkZWZsYXRpb24pLCAxMDUgTWIvcw0KICAgIChpbmZsYXRp b24pLCByYXRpbzogMzQuNjYgJQ0KDQogIE5vdyB0aGF0IHRoaXMgaXMgaW4gcGxhY2UsIHRoZSB1 c2VycyBvZiBkZWNvbXByZXNzIHdpbGwgYmUgYWJsZSB0bw0KICBjaG9vc2UgYmV0d2VlbiB0aGUg dHdvIHZlcnNpb25zLCBhY2NvcmRpbmcgdG8gdGhlaXIgbmVlZHMuIEluIHRoZSBjYXNlDQogIG9m IG9jYW1sLWdpdCwgdGhlIHZhc3QgbWFqb3JpdHkgb2YgdGhlIGdpdCBvYmplY3RzIGFyZSBzbWFs bCBhbmQgd2lsbA0KICBiZSBjb21wcmVzc2VkIGluIG9uZSBnby4gVGhpcyBpcyB3aHkgd2UgdXBk YXRlZCB3aXRoIHRoZSBuZXcNCiAgaW1wbGVtZW50YXRpb24gd2hlbiBwb3NzaWJsZS4NCg0KDQpX cml0aW5nIG9wdGltaXplZCBjb2RlIGFuZCBwcm9maWxpbmcgaXQNCuKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIE9uZSBvZiB0 aGUgYmlnZ2VzdCBjb25jZXJucyBvZiB0aGlzIHJlbGVhc2Ugd2FzIHRvIGJlIGFibGUgdG8gcHJv ZHVjZQ0KICBvcHRpbWl6ZWQgY29kZS4gVGhlIGJhc2UgY29kZSBiZWluZyBjb2RlZCBpbiBDLCBh IGxvdCBvZiBzdWItb3B0aW1hbA0KICBiZWhhdmlvciB3aGVyZSBwb3J0ZWQgaW4gdGhlIE9DYW1s IHZlcnNpb246IGBmb3InIGFuZCBgd2hpbGUnIGxvb3BzLA0KICByZWZlcmVuY2VzIGV2ZXJ5d2hl cmUsIG1peGVzIG9mIGBzdHJ1Y3QnIGFuZCBgdW5pb24uJywgaXQgbmVlZGVkIGEgbG90DQogIG9m IGNsZWFuIHVwLg0KDQogIFRoaXMgaXMgd2h5IG9uY2UgdGhlIG1haW4gaXRlcmF0aW9uIHdhcyBk b25lLCB3ZSBoYXZlIHNwZW50IHNldmVyYWwNCiAgd2Vla3MgcHJvZmlsaW5nIHRoZSBjb2RlIGJh c2UsIHVzaW5nIHRoZSBPQ2FtbCBsaWJyYXJ5IGBsYW5kbWFya3MnLA0KICBgZmxhbWVncmFwaCcg b3Igc2ltcGx5IHRoZSBsaW51eCBiaW5hcnkgYHBlcmYnLiBUaGlzIHdvcmssIHNvbWV0aW1lcw0K ICB0ZWRpb3VzLCBwcm92ZWQgdG8gYmUgaGVscGZ1bCBhbmQgaGVhbHRoeSBmb3IgYm90aCB0aGUg aGFybW9uaXphdGlvbg0KICBvZiB0aGUgY29kZSBhbmQgaXQncyBwZXJmb3JtYW5jZXMuDQoNCg0K RGVjb21wcmVzcyAmIE1pcmFnZU9TDQrilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilIQNCg0KICBDb21wcmVzc2lvbiBhbGdvcml0aG1z IGFyZSBhIHJlYWxseSBpbXBvcnRhbnQgcGllY2UgaW4gbWFueSBwcm9qZWN0cywNCiAgYW5kIG9w ZXJhdGluZyBzeXN0ZW1zIGRvIG5vdCBhdm9pZCB0aGlzLiAgYGRlY29tcHJlc3MnIHdhcyBjb2Rl ZCBmcm9tDQogIHRoZSBzdGFydCB3aXRoIHRoZSBpZGVhIG9mIGJlaW5nIHVzZWQgaW4gdGhlIG11 Y2ggbGFyZ2VyIHByb2plY3QNCiAgTWlyYWdlT1MuDQoNCiAgVGhpcyByZWxlYXNlIGlzIGFub3Ro ZXIgb3Bwb3J0dW5pdHkgdG8gYnJvYWRlbiBNaXJhZ2VPU+KAmXMgcmVhY2gsIGJ5DQogIHByb3Zp ZGluZyBvbmUgbW9yZSBhbGdvcml0aG0gdG8gaXTigJlzIHN0YWNrLCBhbGxvd2luZyB1cyB0byBz cGVjaWFsaXNlDQogIGV2ZW4gbW9yZSB0aGUgdW5pa2VybmVscyB0aGF0IHdvdWxkIGhhdmUgYSBu ZWVkIGZvcg0KICBpbmZsYXRpb24vZGVmbGF0aW9uIGFsZ29yaXRobXMuIFRoaXMgbW9yZSByZXN0 cmljdGl2ZSBpbXBsZW1lbnRhdGlvbiwNCiAgYXMgd2UgbmVlZCB0byBoYXZlIHRoZSB3aG9sZSBp bnB1dCBpbiBvbmUgZ28sIHdpbGwgYWxsb3cgdXMgdG8gdGFrZQ0KICBhZHZhbnRhZ2Ugb2YgdGhl IHNpdHVhdGlvbiBhbmQgZ2l2ZSBtb3JlIGZsZXhpYmlsaXR5IGZvciB0aGUgdXNlci4NCg0KICBU aGUgcG9zaXRpdmUgYXNwZWN0cyBvZiB0aGlzIHJlbGVhc2Ugd2lsbCBtb3N0IGxpa2VseSBzaG93 IHVwIHNvb24NCiAgZW5vdWdoLCBhcyB3ZSBtYWtlIHVzZSBvZiBkZWNvbXByZXNzIHRvIGl0cyBm dWxsIHBvdGVudGlhbA0KDQoNCmVsbGlwdGljIGN1cnZlcyAtIG1haW50YWluYWJsZSBhbmQgdmVy aWZpZWQgKGZ1bGwgc3RhY2ssIGZyb20gcHJpbWl0aXZlcyB0byBUTFMpDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lbGxpcHRp Yy1jdXJ2ZXMtbWFpbnRhaW5hYmxlLWFuZC12ZXJpZmllZC1mdWxsLXN0YWNrLWZyb20tcHJpbWl0 aXZlcy10by10bHMvNzcyOS8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgb3ZlciB0aGUgbGFzdCBtb250aCBJIHdvcmtlZCBvbiB1cGdyYWRpbmcg dGhlIGNyeXB0b2dyYXBoeSBzdGFjayBmb3INCiAgT0NhbWwgYW5kIE1pcmFnZU9TLiBJIGp1c3Qg cHVibGlzaGVkIGEgW2Jsb2cgcG9zdF0uIEVuaGFuY21lbnRzIG9mDQogIFtPQ2FtbC1UTFNdIChb dXNlbml4IHNlY3VyaXR5IHBhcGVyIGZyb20gMjAxNV0pIGFuZCBbWC41MDldIGFyZSBpbg0KICBw bGFjZS4NCg0KICBUaGUgbWFpbiBhY2hpZXZlbWVudCBhZnRlciBUTFMgMS4zIHN1cHBvcnQgKHNp bmNlIE1heSAyMDIwLCAwLjEyLjApIGlzDQogIHRoYXQgZWxsaXB0aWMgY3VydmUgY2VydGlmaWNh dGVzIGFyZSBub3cgc3VwcG9ydGVkLiBFbGxpcHRpYyBjdXJ2ZQ0KICBjcnlwdG9ncmFwaHkgdXNl cyBbZmlhdF0uIFRoZSBYNTA5IGltcGxlbWVudGF0aW9uIG5vdyBzdXBwb3J0cyBQS0NTIDEyDQog ICh1c2VkIGJ5IGJyb3dzZXJzIGFuZCBvdGhlciBzb2Z0d2FyZSAoZS5nLiBPcGVuVlBOKSB0byBi dW5kbGUNCiAgY2VydGlmaWNhdGVzIGFuZCBwcml2YXRlIGtleXMpLg0KDQogIEdldCBtaXJhZ2Ut Y3J5cHRvLWVjLCB4NTA5IDAuMTMuMCBhbmQgdGxzIDAuMTMuMSAoYWxsIGF2YWlsYWJsZSBpbiB0 aGUNCiAgb3BhbS1yZXBvc2l0b3J5KS4gRGlzY3Vzc2lvbiBhbmQgZmVlZGJhY2sgYXBwcmVjaWF0 ZWQuDQoNCg0KW2Jsb2cgcG9zdF0gPGh0dHBzOi8vaGFubmVzLnJvYnVyLmNvb3AvUG9zdHMvRUM+ DQoNCltPQ2FtbC1UTFNdIDxodHRwczovL2dpdGh1Yi5jb20vbWlybGVmdC9vY2FtbC10bHM+DQoN Clt1c2VuaXggc2VjdXJpdHkgcGFwZXIgZnJvbSAyMDE1XSA8aHR0cHM6Ly91c2VuaXgxNS5ucXNi LmlvPg0KDQpbWC41MDldIDxodHRwczovL2dpdGh1Yi5jb20vbWlybGVmdC9vY2FtbC14NTA5Pg0K DQpbZmlhdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXQtcGx2L2ZpYXQtY3J5cHRvPg0KDQoNCkZp cnN0IHJlbGVhc2Ugb2YgRG9jdGV1ciwgYW4gb3BpbmlhdGVkIHJlYWQtb25seSBmaWxlLXN5c3Rl bSBmb3IgTWlyYWdlT1MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWZpcnN0LXJlbGVhc2Utb2YtZG9jdGV1ci1hbi1vcGluaWF0ZWQtcmVhZC1vbmx5LWZpbGUtc3lz dGVtLWZvci1taXJhZ2Vvcy83NzQzLzE+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBnbGFkIHRvIGFubm91 bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIFtgZG9jdGV1ciddLCBhIHNpbXBsZSB0b29sDQogIHRv IG1ha2UgYW5kIHVzZSAoaW4gcmVhZC1vbmx5KSBhICJmaWxlLXN5c3RlbSIgZm9yIFtNaXJhZ2VP U10uIEFzIHlvdQ0KICBrbm93LCB3aXRoIE1pcmFnZU9TLCB3ZSBkb24ndCBoYXZlIF9zb2NrZXRz XywgX2tlcm5lbCBzcGFjZV8gb3IgZXZlbg0KICBfZmlsZS1kZXNjcmlwdG9yXy4gSXQncyBub3Qg cG9zc2libGUgdG8gbWFuaXB1bGF0ZSBmaWxlcw0KICBfc3RhbmRhbG9uZWx5XyBhbmQgbWFueSBf cHJpbWl0aXZlc18gY29tbW9ubHkgYXZhaWxhYmxlIHdpdGggdGhlDQogIGB1bml4JyBtb2R1bGUg ZG9uJ3QgZXhpc3RzIGluIG91ciBzcGFjZS4NCg0KICBUaGVyZWZvcmUsIGl0IGlzIGRpZmZpY3Vs dCB0byBpbWFnaW5lIG1ha2luZyBhIHdlYnNpdGUgdGhhdCBkaXNwbGF5cw0KICBsb2NhbCBmaWxl cyBvciBhIGRhdGFiYXNlIHN5c3RlbS4gQnV0IGluIG91ciBzcGlyaXQgb2Ygc2VwYXJhdGlvbiBv Zg0KICBzZXJ2aWNlcywgaXQgYmVjb21lcyBwb3NzaWJsZSBmb3IgeW91ciB1bmlrZXJuZWwgdG8g Y29tbXVuaWNhdGUgb3Zlcg0KICB0aGUgbmV0d29yayB0byBhICJmaWxlIHN5c3RlbSIgb3IgYSBk YXRhYmFzZS4NCg0KICBGb3IgcXVpdGUgc29tZSB0aW1lIHdlIGhhdmUgYmVlbiBleHBlcmltZW50 aW5nIHdpdGggYSBmaWxlIHN5c3RlbQ0KICBleHRlcm5hbCB0byBvdXIgdW5pa2VybmVsIGNhbGxl ZCBHaXQuIFRoaXMgaXMgdGhlIGNhc2Ugb2YgW2BwYXN0ZXVyJ10NCiAgd2hpY2ggc2F2ZXMgdGhl IHBhc3RlcyBpbiBhIEdpdCByZXBvc2l0b3J5LiBJdCBpcyBhbHNvIHRoZSBjYXNlIG9mDQogIFtg dW5pcGknXSBvciBbQ2Fub3B5XSB3aGljaCBkaXNwbGF5IHRoZSBjb250ZW50IG9mIGEgR2l0IHJl cG9zaXRvcnkNCiAgYW5kIGNhbiByZXN5bmNocm9uaXplIHdpdGggaXQgdXNpbmcgYSBob29rLiBP ciB0aGUgY2FzZSBvZiBbb3VyDQogIHByaW1hcnkgRE5TIHNlcnZlcl0gd2hvc2Ugem9uZSBmaWxl IGNvbWVzIGZyb20gYSBHaXQgcmVwb3NpdG9yeSAtIHdlDQogIGNhbiB0aGVuIHRyYWNlIGFsbCB0 aGUgY2hhbmdlcyBvbiB0aGlzIGZpbGUuDQoNCiAgSG93ZXZlciwgd2UgaGF2ZSBzZXZlcmFsIGxp bWl0YXRpb25zOg0KICAxKSBpdCByZXF1aXJlcyB0aGUgR2l0IHJlcG9zaXRvcnkgdG8gbG9hZCBp bnRvIG1lbW9yeSBpbiB5b3VyDQogICAgIHVuaWtlcm5lbA0KICAyKSBpdCByZXF1aXJlcyBhIGNv bW11bmljYXRpb24gKGV4dGVybmFsIHdpdGggR2l0SHViIG9yIGludGVybmFsIGluIGENCiAgICAg cHJpdmF0ZSBuZXR3b3JrKQ0KDQogIFRoZSBwZXJzaXN0ZW50IGFzcGVjdCBpcyB2ZXJ5IGltcG9y dGFudC4gV2Ugc2hvdWxkIGFsd2F5cyBiZSBhYmxlIHRvDQogIGxhdW5jaCBhIHVuaWtlcm5lbCBh bmQgbm90IGxvc2UgdGhlIGRhdGEgaWYgb3VyIHN5c3RlbSBzaHV0cyBkb3duLg0KDQogIFRoZSBt dXRhYmxlIGFzcGVjdCAobW9kaWZ5IGEgZmlsZSkgaXMgdXNlZnVsIGluIHNvbWUgY2FzZXMgYnV0 IG5vdCBpbg0KICBvdGhlcnMuIEFzIGZvciBgdW5pcGknIGZvciBleGFtcGxlIChhIHNpbXBsZSBz dGF0aWMgd2ViIHNpdGUpLCB0aGUNCiAgZGlmZmVyZW5jZSBiZXR3ZWVuIHJlc3luY2hyb25pemlu ZyB3aXRoIGEgaG9vayBvciByZXN0YXJ0aW5nIHRoZQ0KICB1bmlrZXJuZWwgd2l0aCBhIG5ldyB2 ZXJzaW9uIG9mIHlvdXIgZmlsZXN5c3RlbSBpcyBtaW5vci4NCg0KDQpbYGRvY3RldXInXSA8aHR0 cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9kb2N0ZXVyPg0KDQpbTWlyYWdlT1NdIDxodHRwczov L21pcmFnZS5pby8+DQoNCltgcGFzdGV1ciddIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJl L3Bhc3RldXI+DQoNCltgdW5pcGknXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyaW8vdW5pcGk+ DQoNCltDYW5vcHldIDxodHRwczovL2dpdGh1Yi5jb20vRW5naWwvQ2Fub3B5Pg0KDQpbb3VyIHBy aW1hcnkgRE5TIHNlcnZlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1cmlvL2Rucy1wcmltYXJ5 LWdpdD4NCg0KRG9jdGV1ciBhcyBhIHNlY29uZCBzb2x1dGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyB3aGVyZSBEb2N0b3IgY29tZXMgaW4uIEl0IHNvbHZlcyBi b3RoIG9mIG91ciBwcm9ibGVtcyBieQ0KICBvZmZlcmluZyB0aGUgZ2VuZXJhdGlvbiBvZiBhIGZp bGUgc3lzdGVtIGZyb20gc2NyYXRjaDoNCiAg4oCiIGEgR2l0IHJlcG9zaXRvcnkgKGxvY2FsIG9y IGF2YWlsYWJsZSBvbiBhIHNlcnZpY2UpDQogIOKAoiBhIHNwZWNpZmljIGZvbGRlcg0KDQogIERv Y3RvciBpcyBhYmxlIHRvIGNyZWF0ZSBhIGNvbXBsZXRlIHJlcHJlc2VudGF0aW9uIG9mIGEgZm9s ZGVyIGFuZCB0bw0KICBjb21wcmVzcyBpdCBhdCBzdWNoIGEgcmF0aW8gdGhhdCBhIGdlbmVyYXRp b24gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YNCiAgc2V2ZXJhbCBPUEFNIHBhY2thZ2VzIHdpdGgg YWxsIHRoZWlyIHZlcnNpb25zIG1ha2luZyAxNCBHYiBpcyByZWR1Y2VkDQogIHRvIGFuIGltYWdl IG9mIG9ubHkgMjgwIE1iIQ0KDQogIFN1Y2ggYSBoaWdoIGNvbXByZXNzaW9uIHJhdGlvIGlzIGlu IHBhcnRpY3VsYXIgZHVlIHRvIGEgZG91YmxlIGxldmVsDQogIG9mIGNvbXByZXNzaW9uIGJ5IFtg ZGVjb21wcmVzcyddIGFuZCBbYGR1ZmYnXS4gRm9yIG1vcmUgZGV0YWlscywNCiAgRG9jdGV1ciBq dXN0IGdlbmVyYXRlcyBhIHNsaWdodGx5IG1vZGlmaWVkIFBBQ0sgZmlsZSB3aXRoIFtjYXJ0b25d Lg0KDQogIFRoZW4sIERvY3RldXIgcHJvcG9zZXMgYSBzaW1wbGUgbGlicmFyeSB3aGljaCBtYWtl cyBhdmFpbGFibGUgMiB3YXlzDQogIHRvIG1hbmlwdWxhdGUgdGhpcyBpbWFnZSBmb3IgeW91ciB1 bmlrZXJuZWw6DQogIDEpIGEgd2F5IHRoYXQgaXMgZmFzdCBidXQgd2l0aCBhIGNvbnNlcXVlbnQg Ym9vdCB0aW1lDQogIDIpIGEgc2xvd2VyIHdheSBidXQgd2l0aCBubyBjb3N0IHRvIHRoZSBib290 IHRpbWUNCg0KICBUaGUgZmlyc3Qgd2F5IHdpbGwgc2ltcGx5ICJhbmFseXplIiB0aGUgaW1hZ2Ug dG8gcmUtZXh0cmFjdCB0aGUgbGF5b3V0DQogIG9mIHlvdXIgZmlsZSBzeXN0ZW0uIFRoZW4gaXQg dXNlcyB0aGUgW0FSVCBkYXRhLXN0cnVjdHVyZV0gdG8gc2F2ZQ0KICB0aGlzIGxheW91dC4gU28s IHdoZW5ldmVyIHlvdSB3YW50IGEgc3BlY2lmaWMgZmlsZSBhbmQgYWNjb3JkaW5nIHRvDQogIFtB UlQgYmVuY2htYXJrc10sIHlvdSBoYXZlIGFjY2VzcyB0byB0aGUgY29udGVudCB2ZXJ5IHF1aWNr bHkuDQoNCiAgVGhlIHByb2JsZW0gcmVtYWlucyB0aGUgYW5hbHlzaXMgd2hpY2ggdGFrZXMgcGxh Y2UgYXQgYm9vdCB0aW1lIGFuZA0KICB3aGljaCBjYW4gdGFrZSBhIHZlcnkgbG9uZyB0aW1lIChp dCBkZXBlbmRzIGVzc2VudGlhbGx5IG9uIHRoZSBudW1iZXINCiAgb2YgZmlsZXMgeW91IGhhdmUp LiBUaGVyZSBjYW4gYWxzbyBiZSBhbiBpbXBhY3Qgb24gbWVtb3J5IHVzYWdlIGFzIHRoZQ0KICBB UlQgZGF0YSBzdHJ1Y3R1cmUgaXMgaW4gbWVtb3J5IC0gdGhlIG1vcmUgZmlsZXMgdGhlcmUgYXJl LCB0aGUgYmlnZ2VyDQogIHRoZSBzdHJ1Y3R1cmUgaXMuDQoNCiAgVGhlIHNlY29uZCBtZXRob2Qg aXMgbW9yZSAic2lsbHkiLiBFYWNoIHRpbWUgeW91IHJlcXVlc3QgYSBmaWxlLCB3ZQ0KICB3aWxs IGhhdmUgdG8gcmVidWlsZCB0aGUgZW50aXJlIHBhdGggYW5kIHRoZXJlZm9yZSBkZXNlcmlhbGl6 ZSBzZXZlcmFsDQogIG9iamVjdHMgKGxpa2UgZm9sZGVycykuIFRoZSBhZHZhbnRhZ2UgaXMgdGhh dCB3ZSBkb24ndCBhbmFseXplIHRoZQ0KICBpbWFnZSBhbmQgd2UgZG9uJ3QgdHJ5IHRvIG1haW50 YWluIGEgbGF5b3V0IG9mIHlvdXIgZmlsZSBzeXN0ZW0uDQoNCg0KW2BkZWNvbXByZXNzJ10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvZGVjb21wcmVzcz4NCg0KW2BkdWZmJ10gPGh0dHBzOi8v Z2l0aHViLmNvbS9taXJhZ2UvZHVmZj4NCg0KW2NhcnRvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9t aXJhZ2Uvb2NhbWwtZ2l0L3RyZWUvbWFzdGVyL3NyYy9jYXJ0b24+DQoNCltBUlQgZGF0YS1zdHJ1 Y3R1cmVdIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2FydD4NCg0KW0FSVCBiZW5jaG1h cmtzXSA8aHR0cHM6Ly9kaW5vc2F1cmUuZ2l0aHViLmlvL2FydC9iZW5jaC9maW5kLmh0bWw+DQoN Cg0KRXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRG9jdGV1ciBpcyBtZWFudCB0 byBiZSBzaW1wbGUuIFRoZSBnZW5lcmF0aW9uIG9mIHRoZSBpbWFnZSBpcyBkb25lDQogIHZlcnkg c2ltcGx5IGJ5IHRoZSBjb21tYW5kIGBtYWtlJzoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAk IGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRzL21haW4gaHR0cHM6Ly9naXRodWIuY29tL2Rpbm9z YXVyZS9kb2N0ZXVyIGRpc2suaW1nDQogIOKUgiAkIGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRz L21haW4gZ2l0QGdpdGh1Yi5jb206ZGlub3NhdXJlL2RvY3RldXIgZGlzay5pbWcNCiAg4pSCICQg ZG9jdGV1ci5tYWtlIC1iIHJlZnMvaGVhZHMvbWFpbiBnaXQ6Ly9naXRodWIuY29tL2Rpbm9zYXVy ZS9kb2N0ZXVyIGRpc2suaW1nDQogIOKUgiAkIGRvY3RldXIubWFrZSAtYiByZWZzL2hlYWRzL21h aW4gZmlsZTovLyQocHdkKS9kZXYvZG9jdGV1ciBkaXNrLmltZw0KICDilJTilIDilIDilIDilIAN Cg0KICBUaGVuLCBEb2N0ZXVyIHByb3Bvc2VzIDIgc3VwcG9ydHM6IFVuaXggJiBbU29sbzVdLiBG b3IgVW5peCwgeW91IGp1c3QNCiAgaGF2ZSB0byBuYW1lIGV4cGxpY2l0bHkgdGhlIGltYWdlIGZp bGUgdG8gdXNlLiBGb3IgdGhlIGNhc2Ugb2YgU29sbzUNCiAgKGFuZCB0aHVzIG9mIHZpcnR1YWxp emF0aW9uKS4gWW91IGp1c3QgaGF2ZSB0byBmaW5kIGEgbmFtZSBmb3IgYQ0KICAiYmxvY2sgZGV2 aWNlIiBhbmQgdG8gcmV1c2UgdGhpcyBuYW1lIHdpdGggdGhlIFNvbG81ICJ0ZW5kZXIiDQogIHNw ZWNpZnlpbmcgd2hlcmUgdGhlIGltYWdlIGlzLg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQg Y2QgdW5pa2VybmVsDQogIOKUgiAkIG1pcmFnZSBjb25maWd1cmUgLXQgdW5peCAtLWRpc2sgZGlz ay5pbWcNCiAg4pSCICQgbWFrZSBkZXBlbmRzDQogIOKUgiAkIG1pcmFnZSBidWlsZA0KICDilIIg JCAuL3NpbXBsZSAtLWZpbGVuYW1lIFJFQURNRS5tZA0KICDilJTilIDilIDilIDilIANCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCICQgY2QgdW5pa2VybmVsDQogIOKUgiAkIG1pcmFnZSBjb25m aWd1cmUgLXQgaHZ0IC0tZGlzayBkb2N0ZXVyDQogIOKUgiAkIG1ha2UgZGVwZW5kcw0KICDilIIg JCBtaXJhZ2UgYnVpbGQNCiAg4pSCICQgc29sbzUtaHZ0IC0tYmxvY2s6ZG9jdGV1cj1kaXNrLmlt ZyAtLSBzaW1wbGUuaHZ0IC0tZmlsZW5hbWUgUkVBRE1FLm1kDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIEZpbmFsbHksIERvY3RldXIgcHJvcG9zZXMgYW5vdGhlciB0b29sIHRoYXQgY2hlY2tzIChh bmQgYW5hbHl6ZXMpIGFuDQogIGltYWdlIHRvIGdpdmUgeW91IHRoZSB2ZXJzaW9uIG9mIHRoZSBj b21taXQgdXNlZCAoaWYgdGhlIGltYWdlIGNvbWVzDQogIGZyb20gYSBHaXQgcmVwb3NpdG9yeSkg b3IgdGhlIGhhc2ggb2YgeW91ciBmaWxlIHN5c3RlbSBwcm9kdWNlZCBieSB0aGUNCiAgY2FsY3Vs YXRpb24gb2YgYSBbTWVya2xlIHRyZWVdLg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgZG9j dGV1ci52ZXJpZnkgZGlzay5pbWcNCiAg4pSCIGNvbW1pdAk6IGFkOGM0MTg2MzVjYTY2ODMxNzdj N2ZmM2I1ODNlMWVhNWFmZWE3OGYNCiAg4pSCIGF1dGhvcgk6ICJDYWxhc2NpYmV0dGEgUm9tYWlu IiA8cm9tYWluLmNhbGFzY2liZXR0YUBnbWFpbC5jb20+DQogIOKUgiByb290CTogYmVhMTBiNjg3 NGY1MWUzZjZmZWIxZjliY2YzOTM5OTMzYjJjNDU0MA0KICDilIIgDQogIOKUgiBNZXJnZSBwdWxs IHJlcXVlc3QgIzExIGZyb20gZGlub3NhdXJlL2ZpeC10cmVlLWV4cGFuZGluZw0KICDilIIgDQog IOKUgiBGaXggaG93IHdlIGV4cGFuZCBvdXIgZmlsZS1zeXN0ZW0NCiAg4pSU4pSA4pSA4pSA4pSA DQoNCg0KW1NvbG81XSA8aHR0cHM6Ly9naXRodWIuY29tL1NvbG81L3NvbG81Pg0KDQpbTWVya2xl IHRyZWVdIDxodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9NZXJrbGVfdHJlZT4NCg0KDQpD b25jbHVzaW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNYW55IHRpbWVz IHBlb3BsZSBhc2sgbWUgZm9yIGEgcHVycG9zZSBpbiBNaXJhZ2VPUyBzdWNoIGFzIGEgd2Vic2l0 ZQ0KICBvciBhIHBhcnRpY3VsYXIgc2VydmljZS4gSSB0aGluayB0aGF0IERvY3RldXIgc2hvd3Mg b25lIGVzc2VudGlhbA0KICB0aGluZyBhYm91dCBNaXJhZ2VPUywgaXQgaXMgYSB0b29sIGFuZCBh biBlY29zeXN0ZW0uIEJ1dCBpdCdzIG5vdCBhbg0KICBlbmRwb2ludCB0aGF0IGlzIGNvbmNyZXRp emVkIGluIGEgc3BlY2lmaWMgYXBwbGljYXRpb24uDQoNCiAgRG9jdGV1ciBpcyBub3QgVEhFIHNv bHV0aW9uIHRvIG91ciBwcm9ibGVtcyBhbmQgYW5zd2VycyBhIHNwZWNpZmljIHVzZQ0KICBjYXNl LiBXaGF0IGlzIGltcG9ydGFudCB0byBub3RlIGlzIG5vdCB3aGF0IERvY3RldXIgZG9lcyBidXQg dGhlDQogIHBvc3NpYmlsaXR5IGZvciBvdXIgZWNvc3lzdGVtIGFuZCBvdXIgdG9vbHMgdG8gYWxs b3cgdGhlIGRldmVsb3BtZW50DQogIG9mIERvY3RldXIuIEFzIGl0IGFsbG93cyB0aGUgZGV2ZWxv cG1lbnQgb2YgYSB0cmlsbGlvbiBhcHBsaWNhdGlvbnMhDQoNCiAgQXMgc3VjaCwgSSBzYXkgdG8g dGhvc2UgcGVvcGxlIHRvICJwbGF5IiB3aXRoIE1pcmFnZU9TIGlmIHRoZXkgd2FudCB0bw0KICBs ZWFybiBtb3JlLiBPdXIgZ29hbCBpcyBub3QgdG8gc2hvdyB5b3UgYXBwbGljYXRpb25zIHRoYXQg eW91IGNvdWxkDQogIHRoZW4gZGVwbG95IGVhc2lseSAoZXZlbiBpZiB3ZSBhcmUgd29ya2luZyBv biB0aGlzIGFzcGVjdCB0b28pIGJ1dCB0bw0KICBnaXZlIHlvdSB0aGUgcG9zc2liaWxpdHkgdG8g aW1hZ2luZSB5b3VyIE9TIChpbmRlcGVuZGVudGx5IGZyb20gb3VyDQogIHZpc2lvbikhDQoNCiAg QW5kIGlmIHlvdSB0cnksIHdlJ2xsIGJlIGhhcHB5IHRvIGhlbHAgeW91IQ0KDQoNCk9jYW1sLXNv bGlkaXR5LCBhIG5ldyBPQ2FtbCBsaWJyYXJ5IGZvciBTb2xpZGl0eQ0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vY2FtbC1zb2xpZGl0eS1hLW5ldy1vY2FtbC1saWJyYXJ5LWZvci1zb2xpZGl0eS83NzQ2 LzE+DQoNCg0KT0NhbWxQcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5j ZSBvdXIgbmV3IE9DYW1sIGxpYnJhcnksIG9jYW1sLXNvbGlkaXR5ICENCiAgW09jYW1sLXNvbGlk aXR5XSBpcyBhIHByb2dyYW0gbWFuaXB1bGF0aW9uIGxpYnJhcnkgdGhhdCBwcm92aWRlcyBhDQog IFNvbGlkaXR5IHBhcnNlciBhbmQgdHlwZWNoZWNrZXIuDQoNCiAgT3VyIGxpYnJhcnkgaXMgbWFk ZSBmb3IgZGV2ZWxvcGVycyBvbiBTb2xpZGl0eSBjb2RlIGFuYWx5c2lzLCBpdA0KICBidWlsZHMg YSB0eXBlY2hlY2tlZCBBU1QgdGhhdCBjYW4gYmUgYW5hbHl6ZWQgd2l0aCBhIHByb3ZpZGVkDQog IHZpc2l0b3IuIFBsZWFzZSBub3RlIHRoYXQgb3VyIHBhcnNlciBhbmQgdHlwZWNoZWNrIGNvbmZv cm1zIG1vc3RseSB0bw0KICBTb2xpZGl0eSAwLjcsIGlubGluZSBhc3NlbWJseSBpcyBub3Qgc3Vw cG9ydGVkLiBUYWtlIGEgbG9vayBhdCBbb3VyDQogIGRvY3VtZW50YXRpb25dLg0KDQogIFlvdSBj YW4gdGVzdCBpdCBhbmQgcmVwb3J0IGJ1Z3MganVzdCBbaGVyZV0hDQoNCg0KW09jYW1sLXNvbGlk aXR5XSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29jYW1sLXNvbGlkaXR5Pg0KDQpbb3Vy IGRvY3VtZW50YXRpb25dIDxodHRwczovL29jYW1scHJvLmdpdGh1Yi5pby9vY2FtbC1zb2xpZGl0 eS8+DQoNCltoZXJlXSA8aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL29jYW1sLXNvbGlkaXR5 L2lzc3Vlcz4NCg0KDQpNaWdyYXRpbmcgdG8gZmxvYXRhcnJheSAoYmxvZyBwb3N0KQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9taWdyYXRpbmctdG8tZmxvYXRhcnJheS1i bG9nLXBvc3QvNzc0OS8xPg0KDQoNCk5pY29sw6FzIE9qZWRhIELDpHIgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBBdCBMZXhpRmkgd2UgcmVjZW50bHkgbWlncmF0ZWQg b3VyIGNvZGViYXNlIHRvIHVzZSBgZmxvYXRhcnJheScgaW4NCiAgcGxhY2Ugb2YgYGZsb2F0IGFy cmF5JyBpbiBvcmRlciB0byBkaXNhYmxlIHRoZSAiZmxhdCBmbG9hdCBhcnJheSIgbW9kZQ0KICBp biB0aGUgY29tcGlsZXIuIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBmaW5kaW5nIG91dCBtb3Jl IGFib3V0IGhvdw0KICB3ZSBkaWQgaXQsIHdlIHdyb3RlIGEgYmxvZyBwb3N0IGFib3V0IGl0DQog IDxodHRwczovL3d3dy5sZXhpZmkuY29tL2Jsb2cvb2NhbWwvZmxvYXRhcnJheS1taWdyYXRpb24v Pi4gRW5qb3khDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEkn bGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0g b3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdp c2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQog IFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8 bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8 aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFy Y2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29u bGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+ DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 20 to 27, 2021.

docs.ocaml.pro : an OCaml Documentation Hub

Fabrice Le Fessant announced

We are pleased to announce that we just published the first version of the OCaml Documentation Hub on:

https://docs.ocaml.pro

The OCaml Documentation Hub can be used to browse the sources and the documentations of more than 2000 opam packages, following links between them when useful. This is a work-in-progress, and we are working on improving it with many more features, such as source annotations with types, full-text and type-driven searches, improvements in the general readability of documentation, etc.

The site is generated using an open-source tool called digodoc, available on:

https://github.com/OCamlPro= /digodoc

Digodoc is able to build a map of an opam switch, with links between files, opam packages, ocaml libraries, meta packages and ocaml modules. It is also able to generate documentation using odoc with cross-indexes between all these kinds of packages.

We welcome feedback and contributions! Enjoy !

Simon Cruanes said and Anil Madhavapeddy added

Great work on this site, and I love the domain name as well ;-)

The cross linking between packages is fantastic.

As a bit of background on why documentation cross-linking has taken so long= , there is a lonnnggg history intertwined with many people's contributions to opam, build systems (ocamlbuild and dun= e), conventions (findlib and odig) and of course odoc itself. The majo= r milestones along the way have been:

  • odoc 1.0, first began in = 2014 as a quick project to pull together typing information from cmt[i] fil= es, but which ran into the problem that it needs a consistent set of compil= ed cmt files to actually work, and so needs help from external tools to pul= l that set of compiled libraries together.
  • odig, which pulls toge= ther multiple opam packages (and a filesystem layout for metadata) and runs= odoc on then. This allowed for the creation of https://docs.mirage.io a few years ago which cross-references a= smaller number of packages
  • opam-repo itself has had better and better bulk builds over the years t= o ensure that we can actually automatically compile all the artefacts neede= d for docs builds, thanks to efforts like health check and ocurrent.
  • odoc 2.0, which featured a multi-year rewrite of the OCaml module resolver and introduced a= new output IR. Thi= s forthcoming release was presented in this OCaml 2020 talk by @jonludlam.

And now with all these pieces in place, the OCaml documentation spring has = arrived! The OCamlPro one posted here as the first of the "new batch" of mass documentation indexers, and I'm aware = of concurrent efforts by the odoc/ocaml.org maintainer teams to push a central one out to ocaml.org, as = well as by the MirageOS team who are refreshing docs.mirage.io with the latest and greatest. I'm sure when the = dust has settled on all these indexers we can look for common pieces, but for now it's lovely to see so much innovati= on happening at pace.

For the community: now is the time to fix your docstrings in your libraries= , as there will many cool tools parsing and processing them, and rendering them into all kinds of output formats!

To the odoc c= ontributors, thank you! The journey to get to this documentation site started here seven years ago:

commit ef91571cab31d9ece7af965ed52eaaff57a12efc
Author: Leo White <lpw25@cl.cam.ac.uk>
Date:   Thu Oct 16 19:20:18 2014 +0100

    Initial commit

@lefessan one thing I'm not sure about in your site is the "copyright libra= ry authors" claim. That's murky legal ground – it's worth establishing if the odoc HTML has gone through a= compilation process and so is no longer copyright the authors (just as a binary output is not copyright the origina= l source code). If the output is copyright the authors, then they have reasonable grounds to claim that you = should also reproduce the copyright notice and other license restrictions. Personally, I prefer to claim that there is= no copyright to the original authors in odoc output, and sidestep this issue.

Fabrice Le Fessant replied

Thanks @avsm , all these projects were indeed important milestones towards = the creation of this site. However, I wouldn't want this history perspective to give the wrong feeling that build= ing this site was easy, it is the result of a very good, long and hard work by the team a= t OCamlPro to make it work despite a road paved with many obstacles. It also benefited from OCamlPro's long history of innovative projects for the OCaml community, that lead for example in the p= ast to Opam, Try-OCaml, Memprof/Memthol, Opam-builder, Learn-OCaml, the Typerex tools (ocp-indent, ocp-index, ocp-build, etc.) and more recently opam-bin and drom.

As I said, this is a work-in-progress, and there are many features that we = will be adding in the next months to make this website much easier to navigate, for users to rapidely reach the infor= mation that matters for them. We hope it will be inspirational for all the other develo= pers who are working on similar projects, and we are looking forward to using their projects soon too!

Daniel B=C3=BCnzli said

I'd just like to stress that odig documents OCaml package inst= alls regardless of the package manager used as long the install structure follows these conventions (which are automatically followed by dune installs) .

Also for people using my packages, I'd just like to mention they may miss i= mportant documentation bits on https://docs.ocaml.pro until that issue is resolved.

Much later in the thread, Kiran Gopinathan said

It's not quite the same as hoogle, but merlin has a functionality to search= for functions by type signature - the feature doesn't seem to get much attention apparently - probably the interf= ace is a little lacking, but with some extra elisp tuning, it can work quite smoothly:

3D"3c2d1c63fac7=

Yawar Amin then added

The command line for this:

ocamlmerlin single search-by-polarity -position 0 -query '-int +string'

(To search for values of type int -> string.)

Decompress 1.4.0

Charles Edouard Lecat announced

Greetings everyone,

I am happy to announce the new release of decompress 1.4.0, available for installation via OPAM. Decompress is a library containing a pure OCaml implementation of several compression alg= orithms:

  • RFC1951
  • Zlib
  • Gzip
  • LZO

It's goal is to provide several algorithms for both the inflation and the d= eflation of objects, in the form of a stream API allowing to call the chosen algorithm one bit at a time. Such be= havior allows for an easy use of decompress in situations where we would not be able to have the input in on= e go, or where we would like to output the result in a non blocking way. This new release comes with several improveme= nts to the documentation and bug fixes, but even more, with a whole new implementation for the rfc 1951 and zlib al= gorithms.

Non-stream implementation for rfc 1951 and zlib

Up to this day, decompress was used in several projects like ocaml-git. How= ever, as time passed by, it appeared that in some cases, the current implementation of decompress was not the optimal= solution: As useful as a stream implementation is, it requires to save a lot of infor= mation about the state of the compression, in order to resume it once we have enough input.

This is why, in some cases where we would be sure that we have our whole in= put in one go, we might want to avoid all of these side-costs, and directly go to the point.

State of the art: libdeflate

This new problematic in mind, we have started thinking about the existing i= mplementations of these algorithms which were also bypassing the stream behavior. One implementation that proved to = be a suitable example for our problem, was the library libdeflate, an implementation in C. It's main adva= ntages being: a better compression ratio than zlib and with faster runtime.

It was used as the solid base for the OCaml implementation provided by this= new release.

OCaml version of libdeflate, performances and use cas= es

Inheriting the logic of libdeflate, the new implementation now has a better= compression ratio, while being slightly faster at it. On the other side, the decompression is way faster, with 33% of speed increase in most tested cases: On the ~book2 (from the Calgary corpus) file:

  • decompress (stream): 15 Mb/s (deflation), 76 Mb/s (inflati= on), ratio: 42.46 %
  • decompress (non-stream): 17 Mb/s (deflation), 105 Mb/s (in= flation), ratio: 34.66 %

Now that this is in place, the users of decompress will be able to choose b= etween the two versions, according to their needs. In the case of ocaml-git, the vast majority of the git objects= are small and will be compressed in one go. This is why we updated with the new implementation when possible.

Writing optimized code and profiling it

One of the biggest concerns of this release was to be able to produce optim= ized code. The base code being coded in C, a lot of sub-optimal behavior where ported in the OCaml version: for<= /code> and while loops, references everywhere, mixes of struct and union., it needed a lot of cl= ean up.

This is why once the main iteration was done, we have spent several weeks p= rofiling the code base, using the OCaml library landmarks, flamegraph or simply the linux= binary perf. This work, sometimes tedious, proved to be helpful and healthy for both the harmonization of the code and it's perform= ances.

Decompress & MirageOS

Compression algorithms are a really important piece in many projects, and o= perating systems do not avoid this. decompress was coded from the start with the idea of being use= d in the much larger project MirageOS.

This release is another opportunity to broaden MirageOS=E2=80=99s reach, by= providing one more algorithm to it=E2=80=99s stack, allowing us to specialise even more the unikernels that would have a need f= or inflation/deflation algorithms. This more restrictive implementation, as we need to have the whole input in one = go, will allow us to take advantage of the situation and give more flexibility for the user.

The positive aspects of this release will most likely show up soon enough, = as we make use of decompress to its full potential

elliptic curves - maintainable and verified (full stack, from = primitives to TLS)

Hannes Mehnert announced

over the last month I worked on upgrading the cryptography stack for OCaml = and MirageOS. I just published a blog post. Enhancments of O= Caml-TLS (usenix security paper from 2015) and X.509 are in place.

The main achievement after TLS 1.3 support (since May 2020, 0.12.0) is that= elliptic curve certificates are now supported. Elliptic curve cryptography uses fiat. The X509 implementation now supports PKCS 12 (used by browsers and other software (e.g. OpenVPN) to= bundle certificates and private keys).

Get mirage-crypto-ec, x509 0.13.0 and tls 0.13.1 (all available in the opam= -repository). Discussion and feedback appreciated.

First release of Docteur, an opiniated read-only file-system f= or MirageOS

Calascibetta Romain announced

I'm glad to announce the first release of docteur, a simple tool to make and use (in= read-only) a "file-system" for MirageOS. As you know,= with MirageOS, we don't have sockets, kernel space or even file-descriptor. It's not possible to mani= pulate files standalonely and many primitives commonly available with the unix module don't exists in our space.

Therefore, it is difficult to imagine making a website that displays local = files or a database system. But in our spirit of separation of services, it becomes possible for your unikernel to= communicate over the network to a "file system" or a database.

For quite some time we have been experimenting with a file system external = to our unikernel called Git. This is the case of pasteur which saves the pastes in a Git repository. It is also the case of <= a href=3D"https://github.com/roburio/unipi">unipi or Canopy which display the co= ntent of a Git repository and can resynchronize with it using a hook. Or the case of our primary = DNS server whose zone file comes from a Git repository - we can then tr= ace all the changes on this file.

However, we have several limitations:

  1. it requires the Git repository to load into memory in your unikernel
  2. it requires a communication (external with GitHub or internal in a priv= ate network)

The persistent aspect is very important. We should always be able to launch= a unikernel and not lose the data if our system shuts down.

The mutable aspect (modify a file) is useful in some cases but not in other= s. As for unipi for example (a simple static web site), the difference between resynchronizing with a hook or res= tarting the unikernel with a new version of your filesystem is minor.

Docteur as a second solution

This is where Doctor comes in. It solves both of our problems by offering t= he generation of a file system from scratch:

  • a Git repository (local or available on a service)
  • a specific folder

Doctor is able to create a complete representation of a folder and to compr= ess it at such a ratio that a generation of the documentation of several OPAM packages with all their versions makin= g 14 Gb is reduced to an image of only 280 Mb!

Such a high compression ratio is in particular due to a double level of com= pression by decompre= ss and duff. For more = details, Docteur just generates a slightly modified PACK file with carton.

Then, Docteur proposes a simple library which makes available 2 ways to man= ipulate this image for your unikernel:

  1. a way that is fast but with a consequent boot time
  2. a slower way but with no cost to the boot time

The first way will simply "analyze" the image to re-extract the layout of y= our file system. Then it uses the ART data-structure to save this layout. So, whenever you want a specific fi= le and according to ART benchmarks, you have access to the content very quickly.

The problem remains the analysis which takes place at boot time and which c= an take a very long time (it depends essentially on the number of files you have). There can also be an impact o= n memory usage as the ART data structure is in memory - the more files there are, the bigger the structure is.

The second method is more "silly". Each time you request a file, we will ha= ve to rebuild the entire path and therefore deserialize several objects (like folders). The advantage is that= we don't analyze the image and we don't try to maintain a layout of your file system.

Example

Docteur is meant to be simple. The generation of the image is done very sim= ply by the command make:

$ docteur.make -b refs/heads/main https://gith=
ub.com/dinosaure/docteur disk.img
$ docteur.make -b refs/heads/main git@github.com:dinosaure/docteur disk.img
$ docteur.make -b refs/heads/main git://github.com/dinosaure/docteur disk.i=
mg
$ docteur.make -b refs/heads/main file://$(=
pwd)/dev/docteur disk.img

Then, Docteur proposes 2 supports: Unix & Solo5. For Unix, you just have to name explicitly the ima= ge file to use. For the case of Solo5 (and thus of virtualization). You just have t= o find a name for a "block device" and to reuse this name with the Solo5 "tender" specifying where the image is.

$ cd unikernel
$ mirage configure -t unix --disk disk.img
$ make depends
$ mirage build
$ ./simple --filename README.md
$ cd unikernel
$ mirage configure -t hvt --disk docteur
$ make depends
$ mirage build
$ solo5-hvt --block:docteur=3Ddisk.i=
mg -- simple.hvt --filename README.md

Finally, Docteur proposes another tool that checks (and analyzes) an image = to give you the version of the commit used (if the image comes from a Git repository) or the hash of your file system = produced by the calculation of a Merkle tree.

$ docteur.verify disk.img
commit  : ad8c418635ca6683177c7ff3b583e1ea5afea78f
author  : "Calascibetta Romain" <romain.calascibetta@gmai=
l.com>
root    : bea10b6874f51e3f6feb1f9bcf3939933b2c4540

Merge pull request #11 from dinosaure/fix-tree-expanding

Fix how we expand our file-system

Conclusion

Many times people ask me for a purpose in MirageOS such as a website or a p= articular service. I think that Docteur shows one essential thing about MirageOS, it is a tool and an ecosystem. Bu= t it's not an endpoint that is concretized in a specific application.

Docteur is not THE solution to our problems and answers a specific use case= . What is important to note is not what Docteur does but the possibility for our ecosystem and our tools to allow t= he development of Docteur. As it allows the development of a trillion applications!

As such, I say to those people to "play" with MirageOS if they want to lear= n more. Our goal is not to show you applications that you could then deploy easily (even if we are working on t= his aspect too) but to give you the possibility to imagine your OS (independently from our vision)!

And if you try, we'll be happy to help you!

Ocaml-solidity, a new OCaml library for Solidity

OCamlPro announced

We are pleased to announce our new OCaml library, ocaml-solidity ! Ocaml-solidity i= s a program manipulation library that provides a Solidity parser and typechecker.

Our library is made for developers on Solidity code analysis, it builds a t= ypechecked AST that can be analyzed with a provided visitor. Please note that our parser and typecheck conforms mostly= to Solidity 0.7, inline assembly is not supported. Take a look at our documentation.

You can test it and report bugs just here!

Migrating to floatarray (blog post)

Nicol=C3=A1s Ojeda B=C3=A4r announced

At LexiFi we recently migrated our codebase to use floatarray = in place of float array in order to disable the "flat float array" mode in the compiler. If you are interested in finding o= ut more about how we did it, we wrote a blog post about it https://www.lexifi.com/blog/ocaml/floatarray-migration/. En= joy!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 951EEE0073 for ; Tue, 4 May 2021 10:58:08 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ACYpydanNvBdSn4FFWKZGqcOKPSLpDfLV3DAb?= =?us-ascii?q?vn1ZSRFFG/GwvcaogfgdyFvIkz4XQn4tgpStP6OHTHPa+/dOgbU5F7GkQQXgpS?= =?us-ascii?q?+UPJhvhLGC/xTMEzDzn9Q26Y5OaK57YeeAb2RSqebfzE2GH807wN+BmZrHuc77?= =?us-ascii?q?w212RQ9nL4Fshj0JaTqzKUF9SAlYCZdRLvP1jfZvnSaqengcc62AakUtYu6rnb?= =?us-ascii?q?D2va79bQVDLxAq7xTmt1yV1II=3D?= X-IronPort-AV: E=Sophos;i="5.82,271,1613430000"; d="scan'208,217";a="506461081" Received: from clt-128-93-181-230.vpn.inria.fr (HELO set) ([128.93.181.230]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 May 2021 10:57:31 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 04 May 2021 10:57:31 +0200 Message-ID: <87bl9qvptw.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjcgdG8gTWF5DQowNCwgMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPY2Ft bC1zb2xpZGl0eSwgYSBuZXcgT0NhbWwgbGlicmFyeSBmb3IgU29saWRpdHkNClJlbGVhc2Ugb2Yg b2NhbWwtcGFuZG9jIDAuMS4wDQpTdGRsaWIgdnMgQ29udGFpbmVycyB2cyBCYXR0ZXJpZXMgdnMg QmFzZSA6IENvcmUgZnVuY3Rpb25zIGNvbXBhcmlzb24NCk1hcnRpbiBKYW1ib24gcHJlc2VudGF0 aW9uIG9uIFNlbWdyZXAsIFdlZCBBcHJpbCAyMSBAIDdwbSBDZW50cmFsDQpvY2FtbC1sc3Atc2Vy dmVyIDEuNi4wDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KT2NhbWwtc29saWRpdHks IGEgbmV3IE9DYW1sIGxpYnJhcnkgZm9yIFNvbGlkaXR5DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1vY2FtbC1zb2xpZGl0eS1hLW5ldy1vY2FtbC1saWJyYXJ5LWZvci1zb2xpZGl0eS83NzQ2LzI+ DQoNCg0KQ29udGludWluZyB0aGUgdGhyZWFkIGZyb20gbGFzdCB3ZWVrLCBGYWJyaWNlIExlIEZl c3NhbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHNob3Vs ZCBhZGQgdGhhdCB0aGUgcHJvamVjdCBpcyBub3cgYXZhaWxhYmxlIGluIHRoZSBvcGFtLXJlcG9z aXRvcnksDQogIHNlZSBbc29saWRpdHktcGFyc2VyXSBhbmQgW3NvbGlkaXR5LXR5cGVjaGVja2Vy XS4NCg0KDQpbc29saWRpdHktcGFyc2VyXSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdl cy9zb2xpZGl0eS1wYXJzZXIvPg0KDQpbc29saWRpdHktdHlwZWNoZWNrZXJdDQo8aHR0cHM6Ly9v cGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9zb2xpZGl0eS10eXBlY2hlY2tlci8+DQoNCg0KUmVsZWFz ZSBvZiBvY2FtbC1wYW5kb2MgMC4xLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Ut b2Ytb2NhbWwtcGFuZG9jLTAtMS0wLzc3NTkvMT4NCg0KDQpTYW11ZWwgTWltcmFtIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBoYXZlIGp1c3QgcmVsZWFzZWQgW29jYW1sLXBhbmRvY10s IGEgbmF0aXZlIE9DYW1sIGxpYnJhcnkgdG8gd3JpdGUNCiAgZmlsdGVycyBmb3IgW3BhbmRvY10s IHdoaWNoIGlzIGEgbWFya2Rvd24tdG8tYW55dGhpbmcgY29udmVydGVyLiBJdA0KICBoYXMgYWxs b3dlZCBtZSB0byB3cml0ZSBzb21lIHNpbXBsZSBmaWx0ZXJzIEkgbmVlZGVkIChzdWNoIGFzIGZv cg0KICBpbmNsdWRpbmcgY29kZSBzbmlwcGV0cywgd2hpY2ggaXMgbm90IHN1cHBvcnRlZCBuYXRp dmVseSkuDQoNCiAgVGhlIHN1cHBvcnQgaXMgbm90IGNvbXBsZXRlIHlldCBob3dldmVyLCBJIG1p Z2h0IGFkZCBtb3JlIGlmIG5lZWRlZA0KICAoYW5kIHB1bGwtcmVxdWVzdHMgYXJlIG9mIGNvdXJz ZSBhY2NlcHRlZCA6c2xpZ2h0X3NtaWxlOikuDQoNCg0KW29jYW1sLXBhbmRvY10gPGh0dHBzOi8v Z2l0aHViLmNvbS9zbWltcmFtL29jYW1sLXBhbmRvYz4NCg0KW3BhbmRvY10gPGh0dHBzOi8vcGFu ZG9jLm9yZy8+DQoNCg0KU3RkbGliIHZzIENvbnRhaW5lcnMgdnMgQmF0dGVyaWVzIHZzIEJhc2Ug OiBDb3JlIGZ1bmN0aW9ucyBjb21wYXJpc29uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3N0 ZGxpYi12cy1jb250YWluZXJzLXZzLWJhdHRlcmllcy12cy1iYXNlLWNvcmUtZnVuY3Rpb25zLWNv bXBhcmlzb24vNzc2Ni8xPg0KDQoNCkpwIFIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBZb3Ugd2FudCB0byBjb21wYXJlIHRoZSBtYWlu IGNvcmUgZnVuY3Rpb25zIGZvdW5kIGluIHRoZSBPQ2FtbCBTdGRsaWINCiAgKHY0LjEyLjApLCBD b250YWluZXJzICh2My4zKSwgQmF0dGVyaWVzICh2My4zLjApIGFuZCBCYXNlICh2MC4xNC4xKQ0K ICBsaWJyYXJpZXMgPw0KDQogIENoZWNrIGl0IG91dCAhDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS9Gb3VyY2hhdXgvb2NhbWwtc3RkbGliLWNvbnRhaW5lcnMtYmF0dGVyaWVzLWJhc2UtY29tcGFy aXNvbnM+DQoNCg0KVmxhZGltaXIgS2VsZXNoZXYgdGhlbiBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgU29tZW9uZSByZWFkaW5nIHRoaXMgbWlnaHQgYmUgYWxzbyBpbnRl cmVzdGVkIGluIG15IChsZXNzIGZvcm1hbCkNCiAgY29tcGFyaXNvbiBiZXR3ZWVuIE9DYW1sIFN0 ZGxpYiBhbmQgQmFzZToNCiAgPGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2tlbGVzaGV2Lzc2NGVk YWQwMTFhNmE3YTQwZGExMTcxNmIxOWRkYjc1Pg0KDQoNCk1hcnRpbiBKYW1ib24gcHJlc2VudGF0 aW9uIG9uIFNlbWdyZXAsIFdlZCBBcHJpbCAyMSBAIDdwbSBDZW50cmFsDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L21hcnRpbi1qYW1ib24tcHJlc2VudGF0aW9uLW9uLXNlbWdyZXAtd2VkLWFwcmlsLTIxLTdwbS1j ZW50cmFsLzc3MDkvNT4NCg0KDQpDbGF1ZGUgSmFnZXItUnViaW5zb24gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgcmVjb3JkaW5nIG9mIE1h cnRpbidzIHRhbGsgaXMgbm93IGF2YWlsYWJsZToNCiAgPGh0dHBzOi8vaGZwdWcub3JnLzIwMjEv MDUvMDEvbWFydGluLWphbWJvbi05LWxhbmd1YWdlcy1ob3ctd2UtYnVpbHQtc2VtZ3JlcC1hLXBv bHlnbG90LXN0YXRpYy1hbmFseXNpcy10b29sLz4NCg0KDQpNYXJ0aW4gSmFtYm9uIHRoZW4gYWRk ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcyBDbGF1ZGUhIFRoZSB0YWxrIFtzdGFydHMg YXQgMTo0NV0uDQoNCg0KW3N0YXJ0cyBhdCAxOjQ1XSA8aHR0cHM6Ly93d3cueW91dHViZS5jb20v d2F0Y2g/dj1INlRnSy1MTUE0WSZ0PTEwNXM+DQoNCg0KUnlhbiBTbGFkZSB0aGVuIHNhaWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIFtDb21ieV0gbWF5IGFsc28gYmUgb2YgaW50ZXJlc3QsIGl0J3MgYSBzaW1pbGFyIHBy b2plY3QgYWxzbyB3cml0dGVuDQogIGluIE9DYW1sLg0KDQoNCltDb21ieV0gPGh0dHBzOi8vY29t YnkuZGV2Lz4NCg0KDQpvY2FtbC1sc3Atc2VydmVyIDEuNi4wDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1sc3Atc2VydmVy LTEtNi0wLzc3NzQvMT4NCg0KDQpSdWRpIEdyaW5iZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT24gYmVoYWxmIG9mIHRoZSBvY2FtbC1sc3AgdGVhbSwgSSdkIGxpa2UgdG8gYW5ub3Vu Y2UgdmVyc2lvbiAxLjYuMCBvZg0KICBvY2FtbC1sc3Atc2VydmVyLiBUaGUgaGlnaGxpZ2h0IG9m IHRoaXMgcmVsZWFzZSBpcyB0aGUgdXBkYXRlZCB2ZXJzaW9uDQogIG9mIG1lcmxpbiB3aGljaCBi cmluZ3MgbG90cyBvZiBuZXcgYnVnIGZpeGVzLg0KDQoNCjEuNi4wICgwNC8zMC8yMDIwKQ0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCkZl YXR1cmVzDQrilITilITilITilITilITilITilITilIQNCg0KICDigKIgQ29kZSBhY3Rpb24gdG8g YW5ub3RhdGUgYSB2YWx1ZSB3aXRoIGl0cyB0eXBlICgjMzk3KQ0KDQoNCkZpeGVzDQrilITilITi lITilITilIQNCg0KICDigKIgRml4IGludGVyZmFjZS9pbXBsZW1lbnRhdGlvbiBzd2l0Y2hpbmcg b24gV2luZG93cyAoIzQyNykNCg0KICDigKIgQ29ycmVjdGx5IHBhcnNlIHByb2plY3QgcGF0aHMg d2l0aCBzcGFjZXMgYW5kIG90aGVyIHNwZWNpYWwNCiAgICBjaGFyYWN0ZXJzIHRoYXQgbXVzdCBi ZSBlc2NhcGVkLg0KDQogIOKAoiBQcmludCB0eXBlcyB3aXRoIGAtc2hvcnQtcGF0aHMnIGV2ZW4g aWYgdGhlIHByb2plY3Qgd2Fzbid0IGJ1aWx0IHlldA0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRo ZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0 IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKAoiBbQ3J5cHRvZ3JhcGh5IHVwZGF0ZXMgaW4gT0NhbWwg YW5kIE1pcmFnZU9TXQ0KDQoNCltPQ2FtbCBQbGFuZXRdIDxodHRwOi8vb2NhbWwub3JnL2NvbW11 bml0eS9wbGFuZXQvPg0KDQpbQ3J5cHRvZ3JhcGh5IHVwZGF0ZXMgaW4gT0NhbWwgYW5kIE1pcmFn ZU9TXQ0KPGh0dHBzOi8vaGFubmVzLm5xc2IuaW8vUG9zdHMvRUM+DQoNCg0KT2xkIENXTg0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3Ug Y2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdv IHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAg YXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVr IGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1p dHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVj aG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5v cmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of April 27 to May 04, 2021.

Ocaml-solidity, a new OCaml library for Solidity

Continuing the thread from last week, Fabrice Le Fessant announced

I should add that the project is now available in the opam-repository, see solidity-parser and solidity-typechecker.

Release of ocaml-pandoc 0.1.0

Samuel Mimram announced

I have just released ocaml-pandoc, a native OCaml library to write filters for pandoc, which is a markdown-to-anything converter. It has allowed me to write some simple filters I needed (such as for including code snippets, which is not supported natively).

The support is not complete yet however, I might add more if needed (and pull-requests are of course accepted :slight_smile:).

Stdlib vs Containers vs Batteries vs Base : Core functions comparison

Jp R announced

You want to compare the main core functions found in the OCaml Stdlib (v4.12.0), Containers (v3.3), Batteries (v3.3.0) and Base (v0.14.1) libraries ?

Check it out !

https://github.com/Fourchaux/ocaml-stdlib-containers-batteries-base-comparisons

Vladimir Keleshev then added

Someone reading this might be also interested in my (less formal) comparison between OCaml Stdlib and Base: https://gist.github.com/keleshev/764edad011a6a7a40da11716b19ddb75

Martin Jambon presentation on Semgrep, Wed April 21 @ 7pm Central

Claude Jager-Rubinson announced

Martin Jambon then added

Thanks Claude! The talk starts at 1:45.

Ryan Slade then said

Comby may also be of interest, it's a similar project also written in OCaml.

ocaml-lsp-server 1.6.0

Rudi Grinberg announced

On behalf of the ocaml-lsp team, I'd like to announce version 1.6.0 of ocaml-lsp-server. The highlight of this release is the updated version of merlin which brings lots of new bug fixes.

1.6.0 (04/30/2020)

Features
  • Code action to annotate a value with its type (#397)
Fixes
  • Fix interface/implementation switching on Windows (#427)
  • Correctly parse project paths with spaces and other special characters that must be escaped.
  • Print types with -short-paths even if the project wasn't built yet

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 96528E0143 for ; Tue, 11 May 2021 16:48:02 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A8gfXxKBum39kclTlHela55DYdb4zR+YMi2TD?= =?us-ascii?q?sHoBLyC9E/bo8PxG885rsCMc5Ax+ZJhCo6HiBED/ewK5yXcd2+B4AV7IZmnbUQ?= =?us-ascii?q?WTTb2KobGSoQHICmn19fBb0ON6f6JzCML9FjFB5/rS8U2zEMgmxZ2c/KekhfrT?= =?us-ascii?q?yx5WIT1CeuVr7Bl/D0KADkZtThJHHIc4Ep303KV6jivlc3cIacH+GmMIRIH4yu?= =?us-ascii?q?HjhdbtYgAAAlo55BKVjTWugYSQLySl?= X-IronPort-AV: E=Sophos;i="5.82,291,1613430000"; d="scan'208,217";a="507772783" Received: from cbg35-2-78-242-14-140.fbx.proxad.net (HELO set) ([78.242.14.140]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 May 2021 16:48:01 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 11 May 2021 16:47:52 +0200 Message-ID: <871rad499j.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDA0IHRvIDExLA0KMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTb2Z0d2FyZSBl bmdpbmVlciBwb3NpdGlvbiBhdCBMZXhpRmkgKFBhcmlzKQ0KT3BlbiBzb3VyY2UgZWRpdG9yIGZv ciBpT1MsIGlQYWRPUyBhbmQgbWFjT1MNCkJhY2tlbmQgZGV2ZWxvcGVyIHBvc2l0aW9uIGF0IElz c3V1IChDb3BlbmhhZ2VuKQ0KMjUgeWVhcnMgb2YgT0NhbWwNCk9DYW1sIGNvbXBpbGVyIGRldmVs b3BtZW50IG5ld3NsZXR0ZXIsIGlzc3VlIDE6IGJlZm9yZSBNYXkgMjAyMQ0KQWZ0ZXIgc28gbWFu eSB5ZWFycywgSSBkaXNjb3ZlciAnU3RyLmJvdW5kZWRfZnVsbF9zcGxpdCByZWdleHAgc3RyIG4n DQpQYXJzZXIgZm9yIHRoZSBTY2FsYSBwcm9ncmFtbWluZyBsYW5ndWFnZT8NCk9sZCBDV04NCg0K DQpTb2Z0d2FyZSBlbmdpbmVlciBwb3NpdGlvbiBhdCBMZXhpRmkgKFBhcmlzKQ0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9q b2Itc29mdHdhcmUtZW5naW5lZXItcG9zaXRpb24tYXQtbGV4aWZpLXBhcmlzLzc3ODIvMT4NCg0K DQpBbGFpbiBGcmlzY2ggYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbTGV4aUZpXSBpcyBoaXJp bmchIFdlIGFyZSBsb29raW5nIGZvciBhIGZ1bGx5LXRpbWUgc29mdHdhcmUgZW5naW5lZXINCiAg dG8gam9pbiBvdXIgY29yZSBkZXZlbG9wbWVudCB0ZWFtLiBUaGUgdmFzdCBtYWpvcml0eSBvZiBv dXIgc3RhY2sgaXMNCiAgaW1wbGVtZW50ZWQgaW4gT0NhbWwsIGFuZCB3ZSBoYXZlIHBsZW50eSBv ZiBleGNpdGluZyBwcm9qZWN0cyBvbiBhDQogIHdpZGUgcmFuZ2Ugb2YgdG9waWNzLg0KDQogIE1v cmUgaW5mbyBvbiA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbS9jYXJlZXJzL3NvZnR3YXJlX2VuZ2lu ZWVyLz4NCg0KDQpbTGV4aUZpXSA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbT4NCg0KDQpPcGVuIHNv dXJjZSBlZGl0b3IgZm9yIGlPUywgaVBhZE9TIGFuZCBtYWNPUw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNvdXJj ZS1lZGl0b3ItZm9yLWlvcy1pcGFkb3MtYW5kLW1hY29zLzc2MjQvMTU+DQoNCg0KQ29udGludWlu ZyB0aGlzIHRocmVhZCwgTmF0aGFuIEZhbGxldCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEp1c3QgdXBkYXRlZCB0aGUgZWRpdG9yLCBJIHJlZGVzaWduZWQgdGhl IG1hY09TIHZlcnNpb24sIGFuZCBpdCBqdXN0DQogIGxvb2tzIGJldHRlciBhbmQgbW9yZSBuYXRp dmUNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fk cy9vY2FtbC9vcHRpbWl6ZWQvMlgvNi82YjAzYzQ2Mjc1NWZiMzdhMmQ1MDE4MDEzYzNkMWM4YmQ0 NWY1M2JmXzJfMTM4MHg3NjYuanBlZz4NCg0KICBXaGF0IGFyZSB5b3VyIGZpcnN0IGltcHJlc3Np b25zIG9uIGl0Pw0KDQoNCkJhY2tlbmQgZGV2ZWxvcGVyIHBvc2l0aW9uIGF0IElzc3V1IChDb3Bl bmhhZ2VuKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2ItYmFja2VuZC1kZXZlbG9wZXItcG9zaXRp b24tYXQtaXNzdXUtY29wZW5oYWdlbi83NzkzLzE+DQoNCg0KRGFyaW8gVGVpeGVpcmEgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgbG9va2luZyBmb3IgYSBCYWNrZW5kIERl dmVsb3BlciB3aXRoIGV4cGVyaWVuY2UgaW4gbWFjaGluZQ0KICBsZWFybmluZyDigJMgYW5kIHBy ZWZlcmFibHkgYWxzbyBPQ2FtbCEg4oCTIHRvIGpvaW4gb3VyIFJlc2VhcmNoICYNCiAgRGV2ZWxv cG1lbnQgdGVhbS4gWW91IHdpbGwgaGVscCBidWlsZCBtYWNoaW5lIGxlYXJuaW5nIHJlc2VhcmNo DQogIHByb3RvdHlwZXMgYW5kIGJlIHJlc3BvbnNpYmxlIGZvciBpbnRlZ3JhdGluZyB0aGVtIGlu dG8gbmV3IGFuZA0KICBleGlzdGluZyBwcm9kdWN0cy4NCg0KICBBdCBJc3N1dSwgd2UgdXNlIE9D YW1sIGV4dGVuc2l2ZWx5IGluIG91ciBwcm9kdWN0aW9uIHN5c3RlbXMuIElmIHlvdQ0KICBsb3Zl IE9DYW1sIGFuZCBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGluIGdlbmVyYWwsIElzc3V1IGlzIGEg Z3JlYXQNCiAgcGxhY2UgdG8gcHV0IHlvdXIgcGFzc2lvbiBpbnRvIHJlYWwtd29ybGQgcHJvZHVj dHMhDQoNCiAgUGxlYXNlIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHBvc2l0aW9u IGF0IHRoZSBmb2xsb3dpbmcNCiAgbGluazoNCiAgPGh0dHBzOi8vam9icy5sZXZlci5jby9pc3N1 dS9mNTAyY2IyMC1iMjE2LTRjNjctODM1Ny1kNzQ4ZTFiMzUxNzg+DQoNCg0KQW5lbnRyb3BpYyBh c2tlZCBhbmQgRGFyaW8gVGVpeGVpcmEgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAg ICAgSSB3b3VsZCBsb3ZlIHRvIGhlYXIgbW9yZSBhYm91dCB5b3VyIE9DYW1sIGJhY2tlbmQgc3Rh Y2sNCg0KICBXZWxsLCB3ZSBsb3ZlIHRvIHRhbGsgYWJvdXQgb3VyIE9DYW1sIHN0YWNrISA6c2xp Z2h0bHlfc21pbGluZ19mYWNlOg0KDQogIFdlIHJlbHkgb24gdGhlIEphbmUgU3RyZWV0IGVjb3N5 c3RlbSBhIGxvdCwgdXNpbmcgQ29yZSBhcyBhIFN0ZGxpYg0KICByZXBsYWNlbWVudCBhbmQgQXN5 bmMgZm9yIG1vbmFkaWMgY29uY3VycmVuY3kuDQoNCiAgQU1RUCBmb3JtcyB0aGUgYmFja2JvbmUg b2Ygb3VyIG1lc3NhZ2luZyBzeXN0ZW0sIGFuZCB0aGVyZWZvcmUgd2UgdXNlDQogIFthbXFwLWNs aWVudF0gZXh0ZW5zaXZlbHkuDQoNCiAgV2UgdXNlIGJvdGggTXlTUUwgYW5kIFBvc3RncmVzcWwg ZGF0YWJhc2VzIGluIHByb2R1Y3Rpb24uIEZvciB0aGUNCiAgZm9ybWVyIHdlIHVzZSBbcHB4X215 c3FsXSwgYW5kIGZvciB0aGUgbGF0dGVyLCBbUEdPQ2FtbF0uIChUaGFua3MgdG8NCiAgRG9ja2Vy LCB3ZSBjYW4gZ2l2ZSBQR09DYW1sIGNvbXBpbGUtdGltZSBhY2Nlc3MgdG8gdGhlIERCIHdpdGhv dXQNCiAgaGF2aW5nIHRvIGRlcGVuZCBvbiB0aGUgYWN0dWFsIHByb2R1Y3Rpb24gREIuKQ0KDQog IFdlIGN1cnJlbnRseSB1c2UgUHJvdG9idWYgZm9yIHNlcmlhbGlzYXRpb24sIGJ1dCBzcGVuZCBh IGdyZWF0IGFtb3VudA0KICBvZiB0aW1lIGNvbXBsYWluaW5nIGFib3V0IGl0LiBXZSByZWx5IG9u IFtvY2FtbC1wcm90b2MtcGx1Z2luXSB0bw0KICBnZW5lcmF0ZSB0aGUgT0NhbWwgY29kZSBmcm9t IFByb3RvYnVmIGRlZmluaXRpb25zLg0KDQogIEFueXdheSwgdGhhdCdzIGp1c3QgdGhlIGJhc2lj cyBvZiBvdXIgc3RhY2suIERvIGxldCBtZSBrbm93IGlmIHRoZXJlJ3MNCiAgc29tZXRoaW5nIGVs c2UgeW91J2QgbGlrZSB0byBrbm93IGluIG1vcmUgZGV0YWlsIQ0KDQoNClthbXFwLWNsaWVudF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRlcnNmdWdtYW5uL2FtcXAtY2xpZW50Pg0KDQpbcHB4X215 c3FsXSA8aHR0cHM6Ly9naXRodWIuY29tL2lzc3V1L3BweF9teXNxbD4NCg0KW1BHT0NhbWxdIDxo dHRwczovL2dpdGh1Yi5jb20vZGFyaW90ZWl4ZWlyYS9wZ29jYW1sPg0KDQpbb2NhbWwtcHJvdG9j LXBsdWdpbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9pc3N1dS9vY2FtbC1wcm90b2MtcGx1Z2luPg0K DQoNCnJvZGR5IGFza2VkIGFuZCBEYXJpbyBUZWl4ZWlyYSByZXBsaWVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBE byB5b3UgdXNlIFByb3RvYnVmIGZvciBpbnRlcm9wIHdpdGggbm9uLU9DYW1sIHN5c3RlbXM/IElm DQogICAgICAgIG5vdCwgSSdtIGN1cmlvdXMgYWJvdXQgd2hldGhlciB5b3UndmUgY29uc2lkZXJl ZA0KICAgICAgICBbYmluX3Byb3RdIGFzIGFuIGFsdGVybmF0aXZlOyBpdCBzZWVtcyBsaWtlIGFu IG9idmlvdXMNCiAgICAgICAgY2hvaWNlIGlmIHlvdSdyZSB1c2luZyBDb3JlL0FzeW5jLg0KDQog IFllcywgd2UgdXNlIFByb3RvYnVmIG1haW5seSBiZWNhdXNlIHdlIGhhdmUgYSBoZXRlcm9nZW5l b3VzIHN0YWNrLA0KICB3aGVyZSBiZXNpZGVzIE9DYW1sIHdlIGFsc28gaGF2ZSBzZXJ2aWNlcyBy dW5uaW5nIFB5dGhvbiwgS290bGluLCBvcg0KICBFbGl4aXIuDQoNCg0KW2Jpbl9wcm90XQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jpbl9wcm90L2Jsb2IvbWFzdGVyL1JFQURNRS5t ZD4NCg0KDQpUaW0gTWNHaWxjaHJpc3QgYXNrZWQgYW5kIERhcmlvIFRlaXhlaXJhDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICAgICAgICBJJ20gY3VyaW91cyBhYm91dCBob3cgeW91IHN0cnVjdHVyZSB0aGUgYnVzaW5l c3MgY29kZSAoZm9yDQogICAgICAgIHdhbnQgb2YgYSBiZXR0ZXIgd29yZCksIGluIGJldHdlZW4g dGhlIHRlY2huaWNhbCBsYXllcnMgb2YNCiAgICAgICAgdGFsa2luZyB0byBBTVFQIG9yIGFuIFNR TCBzdG9yZS4gQXJlIHRoZXJlIGxhcmdlciBzY2FsZQ0KICAgICAgICBwYXR0ZXJucyBsaWtlIENR UlMgb3IgREREIHRoYXQgeW91IHVzZSB0byBvcmdhbmlzZSBjb2RlPw0KDQogIEhvdyBkbyB5b3Ug cGFja2FnZSB1cCBjb2RlIGZvciBkZXBsb3ltZW50PyBEb2NrZXIgLyBBV1Mgc29tZXRoaW5nLg0K ICBXZSdyZSBzbG93bHkgbWlncmF0aW5nIHRvIGEgbWljcm8tc2VydmljZSBhcmNoaXRlY3R1cmUg KHRoZSBwcm9zIGFuZA0KICBjb25zIG9mIHdoaWNoIGFyZSBvdXRzaWRlIHRoZSBzY29wZSBvZiB0 aGlzIHRocmVhZDsgdGhhdCdzIGEgY2FuIG9mDQogIHdvcm1zIEknZCByYXRoZXIgbm90IG9wZW7i gKYpIHdob3NlIGNhc3Qgb2YgY2hhcmFjdGVycyBpbmNsdWRlcw0KICAiZW50aXRpZXMiIChyZXNw b25zaWJsZSBmb3Igc3RvcmluZy9yZXRyaWV2aW5nIGRhdGEgZnJvbSBEQnMpLCBnZW5lcmljDQog IGJhY2tlbmQgc2VydmljZXMgdGhhdCBlbmNhcHN1bGF0ZSBidXNpbmVzcyBsb2dpYywgZnJvbnRl bmQgc2VydmljZXMsDQogIGFuZCBiYWNrZW5kLWZvci1mcm9udGVuZCBzZXJ2aWNlcy4NCg0KICBX ZSdyZSB1c2luZyBEb2NrZXIgZm9yIGRlcGxveW1lbnQgb24gQVdTIChtb3N0bHkpLCBhbmQgc2xv d2x5DQogIG1pZ3JhdGluZyBmcm9tIERvY2tlciBTd2FybSB0byBLdWJlcm5ldGVzLg0KDQoNCjI1 IHllYXJzIG9mIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzI1 LXllYXJzLW9mLW9jYW1sLzc4MTMvMT4NCg0KDQpYYXZpZXIgTGVyb3kgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICAyNSB5ZWFycyBhZ28sIG9uIE1heSA5dGggMTk5NiwgcmVsZWFzZSAxLjAwIG9m IHRoZSBPYmplY3RpdmUgQ2FtbA0KICBsYW5ndWFnZSBhbmQgc3lzdGVtIHdhcyBhbm5vdW5jZWQ6 DQogIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMTk5Ni0wNS9t c2cwMDAwMy5odG1sPg0KDQogIEl0IHdhcyBhbHJlYWR5IHRoZSBjb25zb2xpZGF0aW9uIG9mIG1h bnkgeWVhcnMgb2Ygd29yaywgaW50ZWdyYXRpbmcNCiAgSsOpcsO0bWUgVm91aWxsb24gYW5kIERp ZGllciBSw6lteSdzIHdvcmsgb24gb2JqZWN0cyBhbmQgY2xhc3NlcyB3aXRoaW4NCiAgQ2FtbCBT cGVjaWFsIExpZ2h0LCBpdHNlbGYgYSBjb21iaW5hdGlvbiBvZiBteSB3b3JrIG9uIG1vZHVsZXMg YW5kDQogIG5hdGl2ZS1jb2RlIGNvbXBpbGF0aW9uIHdpdGggZWFybGllciBjb2RlIHRha2VuIGZy b20gQ2FtbCBMaWdodCwNCiAgZXNwZWNpYWxseSBEYW1pZW4gRG9saWdleidzIEdDLg0KDQogIExp dHRsZSBkaWQgSSBrbm93IHRoYXQgTyhiamVjdGl2ZSkgQ2FtbCB3b3VsZCBzdGlsbCBiZSB0aGVy ZSAyNSB5ZWFycw0KICBsYXRlciENCg0KICBBIGxvdCBoYXBwZW5lZCBkdXJpbmcgdGhpcyB0aW1l LCBpbmNsdWRpbmcgc2V2ZXJhbCBtYWpvciBldm9sdXRpb25zIG9mDQogIHRoZSBsYW5ndWFnZSwg YW5kLCBtdWNoIG1vcmUgaW1wb3J0YW50bHksIHRoZSBlbWVyZ2VuY2Ugb2YgYSBjb21tdW5pdHkN CiAgb2YgdXNlcnMgYW5kIGFuIGVjb3N5c3RlbSBvZiB0b29scyBhbmQgbGlicmFyaWVzLiAgQnV0 IG1heWJlIHRoaXMgd2FzDQogIGp1c3QgdGhlIGJlZ2lubmluZyBmb3Igc29tZXRoaW5nIGV2ZW4g YmlnZ2VyPyAgV2UnbGwgc2Vl4oCmDQoNCiAgSGFwcHkgYmlydGhkYXksIE9DYW1sIQ0KDQoNCkRh dmlkIEFsbHNvcHAgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTW9zdCBwbGVhc2luZ2x5LCB3aXRoIGEg W3Zlcnkgc21hbGwgbnVtYmVyIG9mIHBhdGNoZXNdLCB0aGUgV2luZG93cw0KICBwb3J0IHN0aWxs IHdvcmtzIGluIFZpc3VhbCBTdHVkaW8gMjAxOToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IEM6XEJpcnRoZGF5Pm9jYW1sLmV4ZQ0KICDilIIgCU9iamVjdGl2ZSBDYW1sIHZlcnNpb24gMS4w MA0KICDilIIgDQogIOKUgiAjcHJpbnRfZW5kbGluZSAiSGFwcHkgMjV0aCBCaXJ0aGRheSwgT0Nh bWwhIjs7DQogIOKUgiBIYXBweSAyNXRoIEJpcnRoZGF5LCBPQ2FtbCENCiAg4pSCIC0gOiB1bml0 ID0gKCkNCiAg4pSCICMjcXVpdDs7DQogIOKUgiANCiAg4pSCIEM6XEJpcnRoZGF5PnR5cGUgaG9v cmF5Lm1sDQogIOKUgiBsZXQgcmVjIGhpcF9oaXAgbiA9DQogIOKUgiAgIGlmIG4gPiAwIHRoZW4N CiAg4pSCICAgICBsZXQgKCkgPSBwcmludF9lbmRsaW5lICJoaXAgaGlwISBob29yYXkhIiBpbg0K ICDilIIgICAgIGhpcF9oaXAgKHByZWQgbikNCiAg4pSCIA0KICDilIIgbGV0ICgpID0gaGlwX2hp cCAyNQ0KICDilIIgQzpcQmlydGhkYXk+b2NhbWxvcHQgLW8gaG9vcmF5LmV4ZSBob29yYXkubWwN CiAg4pSCIA0KICDilIIgQzpcQmlydGhkYXk+aG9vcmF5DQogIOKUgiBoaXAgaGlwISBob29yYXkh DQogIOKUgiAuLi4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW3Zlcnkgc21hbGwgbnVtYmVyIG9m IHBhdGNoZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RyYTI3L29jYW1sL2NvbW1pdHMvMjUteWVh cnMtb2Ytb2NhbWw+DQoNCg0KT24gdGhlIE9DYW1sIE1hbGluZyBMaXN0LCBSb2JlcnRvIERpIENv c21vIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgTG9uZyBsaXZlIE9DYW1sIQ0KDQogIFRoYW5rcyBYYXZpZXIsIGFu ZCB0byBhbGwgdGhlIGJyaWxsaWFudCBtaW5kcyB0aGF0IGNvbnRyaWJ1dGVkIHRvIHRoZQ0KICBl dm9sdXRpb24gYW5kIGFkb3B0aW9uIG9mIHRoaXMgYmVhdXRpZnVsIGxhbmd1YWdlLCBhbmQgc3lz dGVtLCBpbiB0aGlzDQogIHBhc3QgcXVhcnRlciBvZiBhIGNlbnR1cnkuDQoNCiAgSWYgSSBtYXkg YWRkIGEgcGVyc29uYWwgbm90ZSwgb25lIHRydWx5IHJlbWFya2FibGUgZmFjdCBpcyB0aGF0IHNv bWUNCiAgcmF0aGVyIGNvbXBsZXggY29kZSB3cml0dGVuIGluIDE5OTggdXNpbmcgT0NhbWwgMS4w NyBbMV0gY291bGQgYmUNCiAgY29tcGlsZWQgYW5kIHJ1biBsYXN0IHllYXIgdXNpbmcgT0NhbWwg NC54ICp3aXRob3V0IG1vZGlmaWNhdGlvbnMqOg0KICB0aGUgb25seSB2aXNpYmxlIGNoYW5nZXMg d2VyZSB0aGUgbmV3IHdhcm5pbmdzIHNwb3R0aW5nIHBvdGVudGlhbA0KICBpc3N1ZXMgaW4gdGhl IGNvZGUsIHRoYW5rcyB0byB0aGUgbWFueSBpbXByb3ZlbWVudHMgdG8gdGhlIGNvbXBpbGVyDQog IG92ZXIgdGltZS4NCg0KICBGb3IgdGhlIGN1cmlvdXMsIGFsbCB0aGUgZGV0YWlscyBhcmUgaGVy ZToNCiAgPGh0dHBzOi8vd3d3LmRpY29zbW8ub3JnL0FydGljbGVzLzIwMjAtUmVTY2llbmNlQy5w ZGY+DQoNCiAgQ2hlZXJzDQoNCiAgUm9iZXJ0bw0KDQogIFsxXSB0aGF0IHdhcyB0aGUgZmlyc3Qg dmVyc2lvbiBpbmNsdWRpbmcgc3VwcG9ydCBmb3IgbWFyc2hhbGxpbmcNCiAgY2xvc3VyZXMsIGFk ZGVkIGluIGEgZmFudGFzdGljIG9uZSB3ZWVrLXNwcmluZyBpbiBQaXNhIGV4YWN0bHkgZm9yDQog IHRoaXMgY29kZSA6LSkNCg0KDQpPQ2FtbCBjb21waWxlciBkZXZlbG9wbWVudCBuZXdzbGV0dGVy LCBpc3N1ZSAxOiBiZWZvcmUgTWF5IDIwMjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY29tcGlsZXItZGV2ZWxv cG1lbnQtbmV3c2xldHRlci1pc3N1ZS0xLWJlZm9yZS1tYXktMjAyMS83ODMxLzE+DQoNCg0KZ2Fz Y2hlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSSdtIGhhcHB5IHRvIGludHJvZHVjZSB0aGUgZmlyc3QgaXNzdWUgb2YgdGhl ICJPQ2FtbCBjb21waWxlcg0KICBkZXZlbG9wbWVudCBuZXdzbGV0dGVyIi4gSSBhc2tlZCBmcmVx dWVudCBjb250cmlidXRvcnMgdG8gdGhlIE9DYW1sDQogIGNvbXBpbGVyIGNvZGViYXNlIHRvIHdy aXRlIGEgc21hbGwgYnVyYiBvbiB3aGF0IHRoZXkgaGF2ZSBiZWVuIGRvaW5nDQogIHJlY2VudGx5 LCBpbiB0aGUgaW50ZXJlc3Qgb2Ygc2hhcmluZyBtb3JlIGluZm9ybWF0aW9uIG9uIHdoYXQgcGVv cGxlDQogIGFyZSBpbnRlcmVzdGVkIGluLCBsb29raW5nIGF0IGFuZCB3b3JraW5nIG9uLg0KDQog IFRoaXMgaXMgYnkgbm8gbWVhbnMgZXhoYXVzdGl2ZTogbWFueSBwZW9wbGUgZGlkbid0IGVuZCB1 cCBoYXZpbmcgdGhlDQogIHRpbWUgdG8gd3JpdGUgc29tZXRoaW5nLCBhbmQgaXQncyBmaW5lLiBC dXQgaG9wZWZ1bGx5IHRoaXMgY2FuIGdpdmUgYQ0KICBzbWFsbCB3aW5kb3cgb24gZGV2ZWxvcG1l bnQgYWN0aXZpdHkgcmVsYXRlZCB0byB0aGUgT0NhbWwgY29tcGlsZXIsDQogIHN0cnVjdHVyZWQg ZGlmZmVyZW50bHkgZnJvbSB0aGUgZW5kbGVzcyBzdHJlYW0gb2YgW1B1bGwgUmVxdWVzdHNdIG9u DQogIHRoZSBjb21waWxlciBjb2RlYmFzZS4NCg0KICAoVGhpcyBpbml0aWF0aXZlIGlzIGluc3Bp cmVkIGJ5IHRoZSBleGNlbGxlbnQgTXVsdGljb3JlDQogIG5ld3NsZXR0ZXIuIFBsZWFzZSBkb24n dCBleHBlY3QgdGhhdCBpdCB3aWxsIGJlIGFzIHBvbGlzaGVkIG9yDQogIGNvbnNpc3RlbnQgOnlv LXlvOiAuKQ0KDQogIE5vdGU6DQoNCiAg4oCiIEZlZWwgZnJlZSBvZiBjb3Vyc2UgdG8gY29tbWVu dCBvciBhc2sgcXVlc3Rpb25zLCBidXQgSSBkb24ndCBrbm93IGlmDQogICAgdGhlIHBlb3BsZSB3 aG8gd3JvdGUgYSBzbWFsbCBibHVyYiB3aWxsIGJlIGxvb2tpbmcgYXQgdGhlIHRocmVhZCwgc28N CiAgICBubyBwcm9taXNlcy4NCg0KICDigKIgSWYgeW91IGhhdmUgYmVlbiB3b3JraW5nIG9uIHRo ZSBPQ2FtbCBjb21waWxlciBhbmQgd2FudCB0byBzYXkNCiAgICBzb21ldGhpbmcsIHBsZWFzZSBm ZWVsIGZyZWUgdG8gcG9zdCEgSWYgeW91IHdvdWxkIGxpa2UgbWUgdG8gZ2V0IGluDQogICAgdG91 Y2ggbmV4dCB0aW1lIEkgcHJlcGFyZSBhIG5ld3NsZXR0ZXIgaXNzdWUgKHNvbWUgcmFuZG9tIHBv aW50IGluDQogICAgdGhlIGZ1dHVyZSksIHBsZWFzZSBsZXQgbWUga25vdyBieSBlbWFpbCBhdCAo Z2FicmllbC5zY2hlcmVyIGF0DQogICAgZ21haWwpLg0KDQoNCltQdWxsIFJlcXVlc3RzXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGxzPg0KDQpAZHJhMjcgKERhdmlkIEFsbHNv cHApDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYwNCg0KICBDb21waWxlciByZWxvY2F0aW9uIHBhdGNoZXMgbm93IGV4aXN0 LiBUaGVyZSdzIHN0aWxsIGEgZmV3IGxlZnQgdG8NCiAgd3JpdGUsIGFuZCB0aGV5IG5lZWQgc3Bs aXR0aW5nIGludG8gcmV2aWV3YWJsZSBQUnMsIGJ1dCB0aGUgY29yZQ0KICBmZWF0dXJlcyBhcmUg d29ya2luZy4gQSBjb21waWxlciBpbnN0YWxsYXRpb24gY2FuIGJlIGNvcGllZCB0byBhIG5ldw0K ICBsb2NhdGlvbiBhbmQgc3RpbGwgd29yaywgbWVhbmluZyB0aGF0IGxvY2FsIHN3aXRjaGVzIGlu IG9wYW0gbWF5IGluDQogIHRoZW9yeSBiZSByZW5hbWVkIGFuZCwgbW9yZSBpbXBvcnRhbnRseSwg d2UgY2FuIGNhY2hlIHByZXZpb3VzbHktYnVpbHQNCiAgY29tcGlsZXJzIGluIGFuIG9wYW0gcm9v dCB0byBhbGxvdyBhIG5ldyBzd2l0Y2gncyBjb21waWxlciB0byBiZSBhDQogIGNvcHkuIFRoaXMg cHJvYmFibHkgd29uJ3QgYmUgcmV2aWV3ZWQgaW4gdGltZSBmb3IgNC4xMywgYWx0aG91Z2ggaXQn cw0KICBpbnRlbmRlZCB0aGF0IG9uY2UgbWVyZ2VkIG9wYW0tcmVwb3NpdG9yeSB3aWxsIGNhcnJ5 IGJhY2stcG9ydHMgdG8NCiAgZWFybGllciBjb21waWxlcnMuDQoNCiAgQSB3aG9sZSBzbGV3IG9m IHNjcmlwdGluZyBwYWluIGhhcyBsZWFkIHRvIHNvbWUgcG9zc2libGUgcGF0Y2hlcyB0bw0KICBy ZWR1Y2UgdGhlIHVzZSBvZiBzY3JpcHRzIGluIHRoZSBjb21waWxlciBidWlsZCB0byBzb21ld2hh dCBjbG9zZXIgdG8NCiAgbm9uZS4NCg0KICBGbGV4RExMIGJvb3RzdHJhcCBoYXMgYmVlbiBjb21w bGV0ZWx5IG92ZXJoYXVsZWQsIHJlZHVjaW5nIGJ1aWxkIHRpbWUNCiAgY29uc2lkZXJhYmx5LiBU aGlzIHdpbGwgYmUgaW4gNC4xMyAoI1sxMDEzNV0pDQoNCg0KWzEwMTM1XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTAxMzU+DQoNCg0KQG5vamIgKE5pY29sw6FzIE9qZWRh IELDpHIpDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGFtIHdvcmtpbmcgb24gI1sxMDE1OV0s IHdoaWNoIGVuYWJsZXMgZGVidWcgaW5mb3JtYXRpb24gaW4NCiAgYC1vdXRwdXQtY29tcGxldGUt ZXhlJyBiaW5hcmllcy4gSXQgdXNlcyBbaW5jYmluXSB1bmRlciBVbml4LWxpa2UNCiAgc3lzdGVt IGFuZCBzb21lIG90aGVyIG1ldGhvZCB1bmRlciBXaW5kb3dzLg0KDQoNClsxMDE1OV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwMTU5Pg0KDQpbaW5jYmluXSA8aHR0cHM6 Ly9naXRodWIuY29tL2dyYXBoaXRlbWFzdGVyL2luY2Jpbj4NCg0KDQpAZ2FzY2hlIChHYWJyaWVs IFNjaGVyZXIpDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIHdvcmtlZCBvbiBicmluZ2luZyBt b3JlIFBScyB0byBhIGRlY2lzaW9uIChtZXJnZSBvciBjbG9zZSkuIFRoZQ0KICBudW1iZXIgb2Yg b3BlbiBQUnMgaGFzIGdvbmUgZnJvbSAyMjAtaXNoIHRvIDE4MCwgd2hpY2ggZmVlbHMgbmljZS4N Cg0KICBJIGhhdmUgYWxzbyBjb250cmlidXRlZCB0byBARWtkb2hpYnMnIHByb2plY3QgW2NhbWxi b290XSwgd2hpY2ggaXMgYQ0KICAiYm9vdHN0cmFwLWZyZWUiIGltcGxlbWVudGF0aW9uIG9mIE9D YW1sIGFibGUgdG8gY29tcGlsZSB0aGUgT0NhbWwNCiAgY29tcGlsZXIgaXRzZWxmLiBJdCBjdXJy ZW50bHkgdGFyZ2V0cyBPQ2FtbCA0LjA3IGZvciB2YXJpb3VzDQogIHJlYXNvbnMuIFdlIHdlcmUg YWJsZSB0byBkbyBhIGZ1bGwgYnVpbGQgb2YgdGhlIE9DYW1sIGNvbXBpbGVyLCBhbmQNCiAgY2hl Y2sgdGhhdCB0aGUgcmVzdWx0IHByb2R1Y2VzIGJvb3RzdHJhcCBiaW5hcmllcyB0aGF0IGNvaW5j aWRlIHdpdGgNCiAgdXBzdHJlYW0gYm9vdHN0cmFwcy4gVGhpcyBnaXZlcyBleHRyZW1lbHkgc3Ry b25nIGNvbmZpZGVuY2UgdGhhdCB0aGUNCiAgT0NhbWwgYm9vdHN0cmFwIGlzIGZyZWUgZnJvbSAi dHJ1c3RpbmcgdHJ1c3QiIGF0dGFja3MuIEZvciBtb3JlDQogIGRldGFpbHMsIHNlZSBvdXIgW2Ry YWZ0IHBhcGVyXS4NCg0KDQpbY2FtbGJvb3RdIDxodHRwczovL2dpdGh1Yi5jb20vRWtkb2hpYnMv Y2FtbGJvb3Q+DQoNCltkcmFmdCBwYXBlcl0gPGh0dHA6Ly9nYWxsaXVtLmlucmlhLmZyL35zY2hl cmVyL2RyYWZ0cy9jYW1sYm9vdC5wZGY+DQoNCndpdGggQE9jdGFjaHJvbiAoRmxvcmlhbiBBbmdl bGV0dGkpDQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQN Cg0KICBJIHdvcmtlZCB3aXRoIEZsb3JpYW4gQW5nZWxldHRpIG9uIGRlcHJlY2F0aW5nIGNlcnRh aW4gY29tbWFuZC1saW5lDQogIHdhcm5pbmctc3BlY2lmaWVyIHNlcXVlbmNlcywgdG8gYXZvaWQg dXNhYmlsaXR5IGlzc3VlcyB3aXRoIChuZXcgaW4NCiAgNC4xMikgd2FybmluZyBuYW1lcy4gQmVm b3JlIGAtdyAtcGFydGlhbC1tYXRjaCcgZGlzYWJsZXMgd2FybmluZyA0LA0KICBidXQgYC13IC1w YXJ0aWFsJyBpcyBpbnRlcnByZXRlZCBhcyB0aGUgc2VxdWVuY2UgYHcgLXAgLXcgYSAtdyByIC13 IHQNCiAgLXcgaSAtdyBhIC13IGwnLCBtb3N0IG9mIHdoaWNoIGFyZSBpZ25vcmVkIGJ1dCBgLXcg YScgc2lsZW5jZXMgYWxsDQogIHdhcm5pbmdzLiBOb3cgbXVsdGktbGV0dGVyIHNlcXVlbmNlcyBv ZiAidW5zaWduZWQiIHNwZWNpZmllcnMgKGAtcCcgaXMNCiAgc2lnbmVkLCBgYScgaXMgdW5zaWdu ZWQpIGFyZSBkZXByZWNhdGVkLiAoV2UgZmlyc3QgZGVwcmVjYXRlZCBhbGwNCiAgdW5zaWduZWQg c3BlY2lmaWVycywgYnV0IExlbyBXaGl0ZSB0ZXN0ZWQgdGhlIHJlc3VsdCBhbmQgcmVtYXJrZWQg dGhhdA0KICBgLXcgQScgaXMgY29tbW9uLCBzbyBub3cgd2Ugb25seSB3YXJuIG9uIG11bHRpLWxl dHRlciBzZXF1ZW5jZXMgb2YNCiAgdW5zaWduZWQgc3BlY2lmaWVycy4NCg0KICBJIGFtIHdvcmtp bmcgd2l0aCBAT2N0YWNocm9uIChGbG9yaWFuIEFuZ2VsZXR0aSkgb24gZ3JvdXBpbmcgc2lnbmF0 dXJlDQogIGl0ZW1zIHdoZW4gdHJhdmVyc2luZyBtb2R1bGUgc2lnbmF0dXJlcy4gU29tZSBpdGVt cyBhcmUgImdob3N0IGl0ZW1zIg0KICB0aGF0IGFyZSBtb3JhbGx5IGF0dGFjaGVkIGluIGEgIm1h aW4gaXRlbSI7IHRoZSBjb2RlIG1vc3RseSBpZ25vcmVzDQogIHRoaXMgYW5kIHRoaXMgY3JlYXRl cyB2YXJpb3VzIGJ1Z3MgaW4gY29ybmVyIGNhc2VzLiBUaGlzIGlzIHdvcmsgdGhhdA0KICBGbG9y aWFuIHN0YXJ0ZWQgaW4gU2VwdGVtYmVyIDIwMTkgd2l0aCAjWzg5MjldLCB0byBmaXggYSBidWcg aW4gdGhlDQogIHJlcHJpbnRpbmcgb2Ygc2lnbmF0dXJlcy4gSSBvbmx5IHN0YXJ0ZWQgcmV2aWV3 aW5nIGluIE1heS1TZXB0ZW1iZXINCiAgMjAyMCBhbmQgd2UgZGVjaWRlZCB0byBkbyBzaXplYWJs ZSBjaGFuZ2VzLCBoZSBzcGxpdCBpdCBpbiBzZXZlcmFsDQogIHNtYWxsZXIgY2hhbmdlcyBpbiBK YW51YXJ5IDIwMjEgYW5kIHdlIG1lcmdlZCBpdCBpbiBBcHJpbCAyMDIxLiBOb3cgd2UNCiAgYXJl IGxvb2tpbmcgYXJlIGZpeGluZyBvdGhlciBidWdzIHdpdGggaGlzIGNvZGUgKCNbOTc3NF0sDQog ICNbMTAzODVdKS4gSnVzdCB0aGlzIHdlZWsgRmxvcmlhbiBsYW5kZWQgYSBuaWNlIFBSIGZpeGlu ZyBzZXZlcmFsDQogIGRpc3RpbmN0IGlzc3VlcyByZWxhdGVkIHRvIHNpZ25hdHVyZSBpdGVtIGdy b3VwaW5nOiAjWzEwNDAxXS4NCg0KDQpbODkyOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9wdWxsLzg5Mjk+DQoNCls5Nzc0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvOTc3ND4NCg0KWzEwMzg1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1 bGwvMTAzODU+DQoNClsxMDQwMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxs LzEwNDAxPg0KDQoNCkB4YXZpZXJsZXJveSAoWGF2aWVyIExlcm95KQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgSSBmaXhlZCAjWzEwMzM5XSwgYSBteXN0ZXJpb3VzIGNyYXNoIG9uIHRo ZSBuZXcgTWFjcyB3aXRoICJBcHBsZQ0KICBzaWxpY29uIi4gIFRoaXMgd2FzIGR1ZSB0byBhIEFS TSAoMzIgYW5kIDY0IGJpdHMpLXNwZWNpZmljDQogIG9wdGltaXphdGlvbiBvZiBhcnJheSBib3Vu ZCBjaGVja2luZywgd2hpY2ggd2FzIG5vdCB0YWtlbiBpbnRvIGFjY291bnQNCiAgYnkgdGhlIHBs YXRmb3JtLWluZGVwZW5kZW50IHBhcnRzIG9mIHRoZSBiYWNrLWVuZCwgbGVhZGluZyB0bw0KICBp bmNvcnJlY3QgbGl2ZW5lc3MgYW5hbHlzaXMgYW5kIHdyb25nIHJlZ2lzdGVyIGFsbG9jYXRpb24u ICAjWzEwMzU0XQ0KICBmaXhlcyB0aGlzIGJ5IGluZm9ybWluZyB0aGUgcGxhdGZvcm0taW5kZXBl bmRlbnQgcGFydHMgb2YgdGhlIGJhY2stZW5kDQogIHRoYXQgc29tZSBwbGF0Zm9ybS1zcGVjaWZp YyBpbnN0cnVjdGlvbnMgY2FuIHJhaXNlLiAgSW4gcGFzc2luZywgaXQNCiAgcmVmYWN0b3JzIHNp bWlsYXIgY29kZSB0aGF0IHdhcyBkdXBsaWNhdGluZyBwbGF0Zm9ybS1pbmRlcGVuZGVudA0KICBj YWxjdWxhdGlvbnMgKG9mIHdoaWNoIGluc3RydWN0aW9ucyBhcmUgcHVyZSkgaW4gcGxhdGZvcm0t ZGVwZW5kZW50DQogIGZpbGVzLg0KDQogIEkgc3BlbnQgcXVhbGl0eSB0aW1lIHdpdGggdGhlIEpl bmtpbnMgY29udGludW91cyBpbnRlZ3JhdGlvbiBzeXN0ZW0gYXQNCiAgSW5yaWEsIGludGVncmF0 aW5nIGEgbmV3IE1hYyBNaW5pIE0xLiAgRm9yIHVua25vd24gcmVhc29ucywgSmVua2lucw0KICBy YW4gdGhlIENJIHNjcmlwdCBpbiB4ODYtNjQgZW11bGF0aW9uIG1vZGUsIHNvIHdlIHdlcmUgYnVp bGRpbmcgYW5kDQogIHRlc3RpbmcgYW4geDg2LTY0IHZlcnNpb24gb2YgT0NhbWwgaW5zdGVhZCBv ZiB0aGUgaW50ZW5kZWQgQVJNNjQNCiAgdmVyc2lvbi4gIEEgYml0IG9mIHNjcmlwdGluZyBsYXRl ciAoOGIxYmMwMWMzKSBhbmQgdm9pbMOgLCBhcm02NC1tYWNvcw0KICBpcyBwcm9wZXJseSB0ZXN0 ZWQgYXMgcGFydCBvZiBvdXIgQ0kuDQoNCiAgQ3VycmVudGx5LCBJJ20gcmVhZGluZyB0aGUgInNh ZmUgcG9pbnRzIiBwcm9wb3NhbCBieSBTYWRpcSBKYWZmZXINCiAgKCNbMTAwMzldKSBhbmQgdGhl IGNoYW5nZXMgb24gdG9wIG9mIHRoaXMgcHJvcG9zZWQgYnkgRGFtaWVuIERvbGlnZXouDQogIEl0 J3MgYSBuZWNlc3Nhcnkgc3RlcCB0b3dhcmRzIE11bHRpY29yZSBPQ2FtbCwgc28gd2UgcmVhbGx5 IG5lZWQgdG8NCiAgbW92ZSBmb3J3YXJkIG9uIHRoaXMgb25lLiAgSXQncyBhIG5vbnRyaXZpYWwg Y2hhbmdlIGludm9sdmluZyBhIG5ldw0KICBzdGF0aWMgYW5hbHlzaXMgYW5kIGEgbnVtYmVyIG9m IHR3ZWFrcyBpbiBldmVyeSBjb2RlIGVtaXR0ZXIsIGJ1dA0KICB0aGluZ3MgYXJlIHN0YXJ0aW5n IHRvIGxvb2sgZ29vZCBoZXJlLg0KDQoNClsxMDMzOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9wdWxsLzEwMzM5Pg0KDQpbMTAzNTRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvcHVsbC8xMDM1ND4NCg0KWzEwMDM5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL3B1bGwvMTAwMzk+DQoNCg0KQG1zaGlud2VsbCAoTWFyayBTaGlud2VsbCkNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIEkgZGlkIGEgZmlyc3QgcGFzcyBvZiByZXZpZXcgb24gdGhlIHNh ZmUgcG9pbnRzIFBSICgjWzEwMDM5XSkgYW5kDQogIHNpZ25pZmljYW50bHkgc2ltcGxpZmllZCB0 aGUgcHJvcG9zZWQgYmFja2VuZCBjaGFuZ2VzLiAgSSd2ZSBhbHNvIGJlZW4NCiAgaW52b2x2ZWQg aW4gZGlzY3Vzc2lvbnMgYWJvdXQgYSBuZXcgZnVuY3Rpb24tbGV2ZWwgYXR0cmlidXRlIHRvIGNh dXNlDQogIGFuIGVycm9yIGlmIHNhZmUgcG9pbnRzIChpbmNsdWRpbmcgYWxsb2NhdGlvbnMpIG1p Z2h0IGV4aXN0IHdpdGhpbiBhDQogIGZ1bmN0aW9uJ3MgYm9keSwgdG8gbWFrZSBjb2RlIHRoYXQg Y3VycmVudGx5IGFzc3VtZXMgdGhpcyByb2J1c3QuDQogIFRoZXJlIHdpbGwgYmUgYSBkZXNpZ24g ZG9jdW1lbnQgZm9yIHRoaXMgY29taW5nIGluIGR1ZSBjb3Vyc2UuDQoNCiAgSSBmaXhlZCB0aGUg cmFuZG9tIHNlZ2ZhdWx0cyB0aGF0IHdlcmUgb2NjdXJyaW5nIG9uIHRoZSBSSVNDLVYgSW5yaWEN CiAgQ0kgd29ya2VyICgjWzEwMzQ5XSkuDQoNCiAgSW4gRmxhbWJkYSAyIGxhbmQgd2Ugc3BlbnQg dHdvIHBlcnNvbi1kYXlzIGRlYnVnZ2luZyBhIHByb2JsZW0NCiAgcmVsYXRpbmcgdG8gSW5maXhf dGFnISAgV2UgZGlzY292ZXJlZCB0aGF0IHRoZSBjb2RlIGluIE9DYW1sIDQuMTINCiAgb253YXJk cyBmb3IgdHJhdmVyc2luZyBHQyByb290cyBpbiBzdGF0aWMgZGF0YSAoImNhbWxfZ2xvYmFscyIp IGlzIG5vdA0KICBjb3JyZWN0IGlmIGFueSBvZiB0aGUgcm9vdHMgYXJlIGNsb3N1cmVzLiAgVGhp cyBhcmlzZXMgaW4gcGFydCBiZWNhdXNlDQogIHRoZSBuZXcgY29tcGFjdGlvbiBjb2RlICgjWzk3 MjhdKSBoYXMgYSBoaWRkZW4gaW52YXJpYW50OiBpdCBtdXN0IG5vdA0KICBzZWUgYW55IGZpZWxk IG9mIGEgc3RhdGljIGRhdGEgcm9vdCBtb3JlIHRoYW4gb25jZSAobm90IGV2ZW4gdmlhIGFuDQog IEluZml4X3RhZykuICBBcyBmYXIgYXMgd2Uga25vdywgdGhlc2Ugc2l0dWF0aW9ucyBkbyBub3Qg YXJpc2UgaW4gdGhlDQogIGV4aXN0aW5nIGNvbXBpbGVyLCBhbHRob3VnaCB3ZSBtYXkgcHJvcG9z ZSBhIHBhdGNoIHRvIGd1YXJkIGFnYWluc3QNCiAgdGhlbS4gIFRoZXkgYXJpc2Ugd2l0aCBGbGFt YmRhIDIgYmVjYXVzZSBpbiBvcmRlciB0byBjb21waWxlDQogIHN0YXRpY2FsbHktYWxsb2NhdGVk IGluY29uc3RhbnQgY2xvc3VyZXMgKG9uZXMgd2hvc2UgZW52aXJvbm1lbnQgaXMNCiAgcGFydGlh bGx5IG9yIHdob2xseSBjb21wdXRlZCBhdCBydW50aW1lKSB3ZSByZWdpc3RlciBjbG9zdXJlcyBk aXJlY3RseQ0KICBhcyBnbG9iYWwgcm9vdHMsIHNvIHdlIGNhbiBwYXRjaCB0aGVpciBlbnZpcm9u bWVudHMgbGF0ZXIuDQoNCg0KWzEwMDM5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTAwMzk+DQoNClsxMDM0OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9w dWxsLzEwMzQ5Pg0KDQpbOTcyOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxs Lzk3Mjg+DQoNCg0KQGdhcnJpZ3VlIChKYWNxdWVzIEdhcnJpZ3VlKQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgSSBoYXZlIGJlZW4gd29ya2luZyBvbiBhIG51bWJlciBvZiBQUnMg Zml4aW5nIGJ1Z3MgaW4gdGhlIHR5cGUgc3lzdGVtLA0KICB3aGljaCBhcmUgbm93IG1lcmdlZDoN CiAg4oCiICNbMTAyNzddIGZpeGVzIGEgdGhlb3JldGljYWwgYnVnIGluIHRoZSBwcmluY2lwYWxp dHkgb2YgR0FEVCB0eXBlDQogICAgIGluZmVyZW5jZSAoI1sxMDM4M10gYXBwbGllcyBvbmx5IGlu IC1wcmluY2lwYWwgbW9kZSkNCiAg4oCiICNbMTAzMDhdIGZpeGVzIGFuIGludGVyYWN0aW9uIGJl dHdlZW4gbG9jYWwgb3BlbiBpbiBwYXR0ZXJucyBhbmQgdGhlDQogICAgIG5ldyBzeW50YXggZm9y IGludHJvZHVjaW5nIGV4aXN0ZW50aWFsIHR5cGUgdmFyaWFibGVzDQogIOKAoiAjWzEwMzIyXSBp cyBhbiBpbnRlcm5hbCBjaGFuZ2UgdXNpbmcgYSBub3JtYWwgcmVmZXJlbmNlIGluc2lkZSBvZiBh DQogICAgIHdlYWsgb25lIGZvciBiYWNrdHJhY2tpbmc7IHRoZSB3ZWFrIHJlZmVyZW5jZSB3YXMg YW4gb3B0aW1pemF0aW9uDQogICAgIHdoZW4gYmFja3RyYWNraW5nIHdhcyBhIHNlbGRvbSB1c2Vk IGZlYXR1cmUsIGFuZCB3YXMgbm90IHVzZWZ1bA0KICAgICBhbnltb3JlDQogIOKAoiAjWzEwMzQ0 XSBmaXhlcyBhIGJ1ZyBpbiB0aGUgZGVsYXlpbmcgb2YgdGhlIGV2YWx1YXRpb24gb2Ygb3B0aW9u YWwNCiAgICAgYXJndW1lbnRzDQogIOKAoiAjWzEwMzQ3XSBjbGVhbnMgdXAgc29tZSBjb2RlIGlu IHRoZSB1bmlmaWNhdGlvbiBhbGdvcml0aG0sIGFmdGVyIGENCiAgICAgc3RyZW5ndGhlbmluZyBv ZiB1bml2ZXJzYWwgdmFyaWFibGUgc2NvcGluZw0KICDigKIgI1sxMDM2Ml0gZml4ZXMgYSBmb3Jn b3R0ZW4gbm9ybWFsaXphdGlvbiBpbiB0aGUgdHlwZSBjaGVja2luZw0KICAgICBhbGdvcml0aG0N Cg0KICBTb21lIGFyZSBzdGlsbCBpbiBwcm9ncmVzczoNCiAg4oCiICNbMTAzNDhdIGltcHJvdmVz IHRoZSB3YXkgZXhwYW5zaW9uIGlzIGRvbmUgZHVyaW5nIHVuaWZpY2F0aW9uLCB0bw0KICAgICBh dm9pZCBzb21lIHNwdXJpb3VzIEdBRFQgcmVsYXRlZCBhbWJpZ3VpdHkgZXJyb3JzDQogIOKAoiAj WzEwMzY0XSBjaGFuZ2VzIHRoZSB0eXBpbmcgb2YgdGhlIGJvZHkgb2YgdGhlIGNhc2VzIG9mDQog ICAgIHBhdHRlcm4tbWF0Y2hpbmdzLCBhbGxvd2luZyB0byB3YXJuIGluIHNvbWUgbm9uLXByaW5j aXBhbA0KICAgICBzaXR1YXRpb25zOyBpdCBhbHNvIHVuY292ZXJlZCBhIG51bWJlciBvZiBwcmlu Y2lwYWxpdHkgcmVsYXRlZCBidWdzDQogICAgIGluc2lkZSB0aGUgdGhlIHR5cGUtY2hlY2tlcg0K DQogIEZpbmFsbHksIEkgaGF2ZSB3b3JrZWQgd2l0aCBUYWthZnVtaSBTYWlrYXdhIChAdDZzKSBv biBtYWtpbmcgdGhlDQogIHJlcHJlc2VudGF0aW9uIG9mIHR5cGVzIGNsb3NlciB0byBpdHMgbG9n aWNhbCBtZWFuaW5nLCBieSBlbnN1cmluZw0KICB0aGF0IG9uZSBhbHdheXMgbWFuaXB1bGF0ZSBh IG5vcm1hbGl6ZWQgdmlldyBpbiAjWzEwMzM3XSAobGFyZ2UNCiAgY2hhbmdlLCBldmFsdWF0aW9u IGluIHByb2dyZXNzKS4NCg0KDQpbMTAyNzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvcHVsbC8xMDI3Nz4NCg0KWzEwMzgzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTAzODM+DQoNClsxMDMwOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9w dWxsLzEwMzA4Pg0KDQpbMTAzMjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVs bC8xMDMyMj4NCg0KWzEwMzQ0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwv MTAzNDQ+DQoNClsxMDM0N10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEw MzQ3Pg0KDQpbMTAzNjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDM2 Mj4NCg0KWzEwMzQ4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTAzNDg+ DQoNClsxMDM2NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwMzY0Pg0K DQpbMTAzMzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDMzNz4NCg0K DQpAbGV0LWRlZiAoRnLDqWTDqXJpYyBCb3VyKQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRm9yIHNv bWUgdGltZSwgSSBoYXZlIGJlZW4gd29ya2luZyBvbiBuZXcgYXBwcm9hY2hlcyB0byBnZW5lcmF0 ZSBlcnJvcg0KICBtZXNzYWdlcyBmcm9tIGEgTWVuaGlyIHBhcnNlci4NCg0KICBNeSBnb2FsIGF0 IHRoZSBiZWdpbm5pbmcgd2FzIHRvIGRldGVjdCBhbmQgcHJvZHVjZSBhIHByZWNpc2UgbWVzc2Fn ZQ0KICBmb3IgdGhlIOKAmGxldCA74oCZIHNpdHVhdGlvbjoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBsZXQgeCA9IDU7DQogIOKUgiBsZXQgeSA9IDYNCiAg4pSCIGxldCB6ID0gNw0KICDilJTi lIDilIDilIDilIANCiAgTFIgZGV0ZWN0cyBhbiBlcnJvciBhdCB0aGUgdGhpcmQg4oCYbGV04oCZ IHdoaWNoIGlzIHRlY2huaWNhbGx5IGNvcnJlY3QsDQogIGFsdGhvdWdoIHdlIHdvdWxkIGxpa2Ug dG8gcG9pbnQgdGhlIHVzZXIgYXQgdGhlIOKAmDvigJkgd2hpY2ggbWlnaHQgYmUgdGhlDQogIHJv b3QgY2F1c2Ugb2YgdGhlIGVycm9yLiBUaGlzIGdvYWwgaGFzIGJlZW4gYWNoaWV2ZWQsIGJ1dCB0 aGUNCiAgcHJvdG90eXBlIGlzIGZhciBmcm9tIGJlaW5nIHJlYWR5IGZvciBwcm9kdWN0aW9uLg0K DQogIFRoZSBtYWluIGlkZWEgdG8gaW5jcmVhc2UgdGhlIGV4cHJlc3NpdmVuZXNzIGFuZCBtYWlu dGFpbmFiaWxpdHkgb2YNCiAgZXJyb3IgY29udGV4dCBpZGVudGlmaWNhdGlvbiBpcyB0byB1c2Ug YSBmbGF2b3Igb2YgcmVndWxhcg0KICBleHByZXNzaW9ucy4gIFRoZSBzdGFjayBvZiBhIHBhcnNl ciBkZWZpbmVzIGEgcHJlZml4IG9mIGEgc2VudGVudGlhbA0KICBmb3JtLiBPdXIgcmVndWxhciBl eHByZXNzaW9ucyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IGl0LiBJbnRlcm5hbCBkZXRhaWxzDQogIG9m IHRoZSBhdXRvbWF0b24gZG9lcyBub3QgbGVhayAobm8gcmVmZXJlbmNlIHRvIHN0YXRlcyksIHRo ZSByZWd1bGFyDQogIGxhbmd1YWdlIGlzIGRlZmluZWQgYnkgdGhlIGdyYW1tYXIgYWxvbmUuICBX aXRoIGFwcHJvcHJpYXRlIHRvb2xpbmcsDQogIHNwZWNpZmljIHNpdHVhdGlvbnMgY2FuIGJlIGNh cHR1cmVkIGJ5IHN0YXJ0aW5nIGZyb20gYSBjb2Fyc2UNCiAgZXhwcmVzc2lvbiBhbmQgcmVmaW5p bmcgaXQgdG8gbmFycm93IGRvd24gdGhlIGludGVyZXN0aW5nIGNhc2VzLg0KDQogIE5vdyBJIGFt IGZvY3VzaW5nIG9uIG9uZSBzcGVjaWZpYyBwb2ludCBvZiB0aGUg4oCYZXJyb3IgbWVzc2FnZeKA mQ0KICBkZXZlbG9wbWVudCBwaXBlbGluZTogaW1wcm92aW5nIHRoZSBlZmZpY2llbmN5IG9mIOKA mG1lbmhpcg0KICDigJNsaXN0LWVycm9yc+KAmS4gIFRoaXMgY29tbWFuZCBpcyB1c2VkIHRvIGVu dW1lcmF0ZSBzZW50ZW5jZXMgdGhhdCBjb3Zlcg0KICBhbGwgZXJyb25lb3VzIHNpdHVhdGlvbnMg KGFzIGRlZmluZWQgYnkgdGhlIExSIGdyYW1tYXIpLiBPbiBteQ0KICBjb21wdXRlciBhbmQgd2l0 aCB0aGUgT0NhbWwgZ3JhbW1hciwgaXQgdGFrZXMgYSBmZXcgbWludXRlcyBhbmQgcXVpdGUNCiAg YSBsb3Qgb2YgUkFNLiBFYXJseSByZXN1bHRzIGFyZSBlbmNvdXJhZ2luZyBhbmQgSSBob3BlIHRv IGhhdmUgYSBQUg0KICBmb3IgTWVuaGlyIHNvb24uIFRoZSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVu dCB3ZSBhcmUgYWltaW5nIGZvciBpcyB0bw0KICBtYWtlIHRoZSBjb21tYW5kIGFsbW9zdCByZWFs IHRpbWUgZm9yIGNvbW1vbiBncmFtbWFycyBhbmQgdG8gdGFja2xlDQogIGJpZ2dlciBncmFtbWFy cyBieSByZWR1Y2luZyB0aGUgbWVtb3J5IG5lZWRzLiAgRm9yIGluc3RhbmNlLCBpbiB0aGUNCiAg T0NhbWwgY2FzZSwgdGhlIHJ1bnRpbWUgaXMgZG93biBmcm9tIDMgbWludXRlcyB0byAy4oCTMyBz ZWNvbmRzIGFuZA0KICBtZW1vcnkgY29uc3VtcHRpb24gZ29lcyBmcm9tIGEgZmV3IEdpQiBkb3du IHRvIDIwMCBNaUIuDQoNCg0KRGFuaWVsIELDvG56bGkgYXNrZWQgYW5kIGdhc2NoZSByZXBsaWVk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICAgICAgICA+IFvigKZdIEBFa2RvaGlic+KAmSBwcm9qZWN0IFtjYW1sYm9vdCBdLCB3 aGljaCBpcyBhDQogICAgICAgICAg4oCcYm9vdHN0cmFwLWZyZWXigJ0NCiAgICAgICAgPiBpbXBs ZW1lbnRhdGlvbiBvZiBPQ2FtbCBhYmxlIHRvIGNvbXBpbGUgdGhlIE9DYW1sDQogICAgICAgICAg Y29tcGlsZXIgaXRzZWxmLiBJdCBjdXJyZW50bHkgdGFyZ2V0cyBPQ2FtbCA0LjA3IGZvcg0KICAg ICAgICAgIHZhcmlvdXMNCiAgICAgICAgPiByZWFzb25zLiBXZSB3ZXJlIGFibGUgdG8gZG8gYSBm dWxsIGJ1aWxkIG9mIHRoZSBPQ2FtbA0KICAgICAgICAgIGNvbXBpbGVyLCBhbmQgY2hlY2sgdGhh dCB0aGUgcmVzdWx0IHByb2R1Y2VzIGJvb3RzdHJhcA0KICAgICAgICA+IGJpbmFyaWVzIHRoYXQg Y29pbmNpZGUgd2l0aCB1cHN0cmVhbSBib290c3RyYXBzLiBUaGlzDQogICAgICAgICAgZ2l2ZXMg ZXh0cmVtZWx5IHN0cm9uZyBjb25maWRlbmNlIHRoYXQgdGhlIE9DYW1sDQogICAgICAgICAgYm9v dHN0cmFwIGlzDQogICAgICAgID4gZnJlZSBmcm9tIOKAnHRydXN0aW5nIHRydXN04oCdIGF0dGFj a3MuIEZvciBtb3JlIGRldGFpbHMsDQogICAgICAgICAgc2VlIG91ciBbZHJhZnQgcGFwZXJdLg0K DQogICAgICAgIFNvbWV0aGluZyB0aGF0IGlzIG5vdCBjbGVhciB0byBtZSAoYnV0IEkgcmVhZCBx dWlja2x5KSBpcw0KICAgICAgICB0aGUgaW1wYWN0IG9mIGBndWlsZWAgaXRzZWxmIGJlaW5nIG5v dCBib290c3RyYXBwZWQgeWV0Lg0KICAgICAgICBDb3VsZCB0aGVyZSBiZSBhICp2ZXJ5KiBlbGFi b3JhdGUgYXR0YWNrICh3aXRoIHByb2JhYmlsaXR5DQogICAgICAgIDAgb2YgZXhpc3RpbmcpIG9u IGJvdGggdGhlIGd1aWxlIGFuZCBvY2FtbCBib290c3RyYXAgb3IgaXMNCiAgICAgICAgdGhlcmUg c29tZXRoaW5nIGluIHRoZSB3aG9sZSBzY2hlbWUgdGhhdCBwcmV2ZW50cyBpdCA/DQoNCiAgWWVz LCBjdXJyZW50bHkgR3VpbGUgbmVlZHMgdG8gYmUgdHJ1c3RlZCwgYW5kIGl0IHdvdWxkIGJlIHBv c3NpYmxlDQogIHRoYXQgYSBib290c3RyYXBwaW5nIHZpcnVzIGluIEd1aWxlIHdvdWxkIGJyZWFr IG91ciBjb3JyZWN0bmVzcw0KICByZXN1bHQuIChJdCB3b3VsZCBuZWVkIHRvIHJlcHJvZHVjZSBp dHNlbGYgdGhyb3VnaCBvdXIgY29tcGlsZXIgYW5kDQogIGludGVycHJldGVyIHRoYXQgd2VyZSB3 cml0dGVuIGFmdGVyIEd1aWxlIGl0c2VsZiwgYnV0IEkgdGhpbmsgaW4NCiAgdGhlb3J5IHRoaXMg Y291bGQgYmUgZG9uZSB3aXRoIGFuIGFsbW9zdC1pbmZpbml0ZWx5IGNsZXZlciBwcm9ncmFtDQog IGFuYWx5c2lzLikgT2YgY291cnNlLCBhbiBhdHRhY2sgYXQgdGhlIHNvdXJjZSBsZXZlbCAoaW5z ZXJ0aW5nDQogIG1hbGljaW91cyBzb3VyY2UsIGluc3RlYWQgb2YgbWFsaWNpb3VzIGJpbmFyaWVz KSBpcyBhbHNvIHBvc3NpYmxlDQogIGFueXdoZXJlIGluIHRoZSBjaGFpbi4gIE91ciBtYWluIHJl YXNvbiBmb3IgdXNpbmcgR3VpbGUgaXMgdGhhdCB0aGlzDQogIGlzIHRoZSBoaWdoLWxldmVsIGxh bmd1YWdlIGNvbW11bml0eSBtb3N0IGFjdGl2ZSBvbg0KICBkZWJvb3RzdHJhcHBpbmctdG93YXJk cy10aGUtbWV0YWwgKHRocm91Z2ggdGhlIEd1aXggY29ubmVjdGlvbiksIHNvIHdlDQogIGJlbGll dmUgaXQgaXMgbW9yZSBsaWtlbHkgdG8gbWFuYWdlIGRlYm9vdHN0cmFwcGluZyBhbmQgbWFpbnRh aW4gaXQgaW4NCiAgdGhlIGxvbmdlciBydW4uDQoNCiAgKFRoZSBzZWVkIHRoYXQgR3VpbGUgZGVw ZW5kcyBvbiBpcyBpdHMgbWFjcm8tZXhwYW5kZXIsIHdoaWNoIGlzDQogIHdyaXR0ZW4gdXNpbmcg bWFjcm9zIGl0c2VsZi4gSW4gdGhlb3J5IG9uZSBtYXkgcGVyZm9ybSB0aGUNCiAgbWFjcm8tZXhw YW5zaW9uIG9mIHRoZSBleHBhbmRlciwgYW5kIHRoZW4gbWFudWFsbHkgcmV2aWV3IHRoZSB0d28N CiAgdmVyc2lvbnMgdG8gdmVyaWZ5IHRoZSBhYnNlbmNlIG9mIGF0dGFjayB0aGVyZS4pDQoNCg0K W2NhbWxib290IF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9Fa2RvaGlicy9jYW1sYm9vdD4NCg0KW2Ry YWZ0IHBhcGVyXSA8aHR0cDovL2dhbGxpdW0uaW5yaWEuZnIvfnNjaGVyZXIvZHJhZnRzL2NhbWxi b290LnBkZj4NCg0KDQpBZnRlciBzbyBtYW55IHllYXJzLCBJIGRpc2NvdmVyICdTdHIuYm91bmRl ZF9mdWxsX3NwbGl0IHJlZ2V4cCBzdHIgbicNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWZ0 ZXItc28tbWFueS15ZWFycy1pLWRpc2NvdmVyLXN0ci1ib3VuZGVkLWZ1bGwtc3BsaXQtcmVnZXhw LXN0ci1uLzc4MzgvMT4NCg0KDQpVbml4SnVua2llIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMgc28gdXNlZnVsIGFuZCBwb3dl cmZ1bDoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjcmVxdWlyZSAic3RyIjs7DQogIOKUgiBT dHIuYm91bmRlZF9mdWxsX3NwbGl0IChTdHIucmVnZXhwICJbKCldIikgInRvdG8gKHRpdGksIHRh dGEgKGV0IHR1dHUpKSB2b250IGF1IHBhcmMgKGVuIGNvdXJhbnQpIiAxMDI0OzsNCiAg4pSCIC0g OiBTdHIuc3BsaXRfcmVzdWx0IGxpc3QgPQ0KICDilIIgW1N0ci5UZXh0ICJ0b3RvICI7IFN0ci5E ZWxpbSAiKCI7IFN0ci5UZXh0ICJ0aXRpLCB0YXRhICI7IFN0ci5EZWxpbSAiKCI7DQogIOKUgiAg U3RyLlRleHQgImV0IHR1dHUiOyBTdHIuRGVsaW0gIikiOyBTdHIuRGVsaW0gIikiOyBTdHIuVGV4 dCAiIHZvbnQgYXUgcGFyYyAiOw0KICDilIIgIFN0ci5EZWxpbSAiKCI7IFN0ci5UZXh0ICJlbiBj b3VyYW50IjsgU3RyLkRlbGltICIpIl0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgU3RpbGwgZmlu ZGluZyBoaWRkZW4gcGVhcmxzIGluIHRoZSBzdGRsaWIgYWZ0ZXIgc28gbWFueSB5ZWFycyENCiAg OnNsaWdodF9zbWlsZToNCg0KDQpQYXJzZXIgZm9yIHRoZSBTY2FsYSBwcm9ncmFtbWluZyBsYW5n dWFnZT8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcGFyc2VyLWZvci10aGUtc2NhbGEtcHJvZ3JhbW1pbmctbGFuZ3VhZ2UvNzU0MS8x OD4NCg0KDQpEZWVwIGluIHRoaXMgdGhyZWFkLCBZb2FubiBQYWRpb2xlYXUgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGVuZGVkIHVwIHBvcnRpbmcgdGhlIHJlY3Vy c2l2ZSBkZXNjZW50IHBhcnNlciBpbiB0aGUgU2NhbGEgY29tcGlsZXINCiAgdG8gT0NhbWwg4oCm ICBJIHRoaW5rIGl0IHdhcyB0aGUgZmFzdGVzdCB3YXkgdG8gZ2V0IGEgd29ya2luZyBwYXJzZXIN CiAgZnJvbSBPQ2FtbCDigKYNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL3JldHVybnRvY29ycC9w ZmZmL2Jsb2IvZGV2ZWxvcC9sYW5nX3NjYWxhL3BhcnNpbmcvUGFyc2VyX3NjYWxhX3JlY3Vyc2l2 ZV9kZXNjZW50Lm1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElm IHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hp dmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2Fn ZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2 ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRo ZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoN CltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVr bHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 04 to 11, 2021.

Software engineer position at LexiFi (Paris)

Alain Frisch announced

LexiFi is hiring! We are looking for= a fully-time software engineer to join our core development team. The vast majority of our stack is implemented in OCaml, a= nd we have plenty of exciting projects on a wide range of topics.

More info on = https://www.lexifi.com/careers/software_engineer/

Open source editor for iOS, iPadOS and macOS

Continuing this thread, Nathan Fallet announced

Just updated the editor, I redesigned the macOS version, and it just looks = better and more native

3D=

What are your first impressions on it?

Backend developer position at Issuu (Copenhagen)

Dario Teixeira announced

We are looking for a Backend Developer with experience in machine learning = – and preferably also OCaml! – to join our Research & Development team. You will help build machine learning r= esearch prototypes and be responsible for integrating them into new and existing products.

At Issuu, we use OCaml extensively in our production systems. If you love O= Caml and functional programming in general, Issuu is a great place to put your passion into real-world product= s!

Please find more information about this position at the following link: https://jobs.lever.co/issuu/f502cb20-b216-4c67-8357-d748e1b35178

Anentropic asked and Dario Teixeira replied

I would love to hear more about your OCaml backend stack

Well, we love to talk about our OCaml stack! :slightly_smiling_face:

We rely on the Jane Street ecosystem a lot, using Core as a Stdlib replacem= ent and Async for monadic concurrency.

AMQP forms the backbone of our messaging system, and therefore we use amqp-client ex= tensively.

We use both MySQL and Postgresql databases in production. For the former we= use ppx_mysql, and for the l= atter, PGOCaml. (Thanks t= o Docker, we can give PGOCaml compile-time access to the DB without having to depend on the actual production DB.)

We currently use Protobuf for serialisation, but spend a great amount of ti= me complaining about it. We rely on ocaml-protoc-plugi= n to generate the OCaml code from Protobuf definitions.

Anyway, that's just the basics of our stack. Do let me know if there's some= thing else you'd like to know in more detail!

roddy asked and Dario Teixeira replied

Do you use Protobuf for interop with non-OCaml systems? If not, I'm curious= about whether you've considered bi= n_prot as an alternative; it seems like an obvious choice if you're using Core/Async.

Yes, we use Protobuf mainly because we have a heterogeneous stack, where be= sides OCaml we also have services running Python, Kotlin, or Elixir.

Tim McGilchrist asked and Dario Teixeira

I'm curious about how you structure the business code (for want of a better= word), in between the technical layers of talking to AMQP or an SQL store. Are there larger scale patterns like CQRS = or DDD that you use to organise code?

How do you package up code for deployment? Docker / AWS something. We're slowly migrating to a micro-service architecture (the pros and cons o= f which are outside the scope of this thread; that's a can of worms I'd rather not open…) whose cast of ch= aracters includes "entities" (responsible for storing/retrieving data from DBs), generic backend services that encapsulat= e business logic, frontend services, and backend-for-frontend services.

We're using Docker for deployment on AWS (mostly), and slowly migrating fro= m Docker Swarm to Kubernetes.

25 years of OCaml

Xavier Leroy announced

25 years ago, on May 9th 1996, release 1.00 of the Objective Caml language = and system was announced: https://sympa.inria.fr/sympa/arc/caml-list/1996-05/msg00003.html

It was already the consolidation of many years of work, integrating J=C3=A9= r=C3=B4me Vouillon and Didier R=C3=A9my's work on objects and classes within Caml Special Light, itself a combination of my work on m= odules and native-code compilation with earlier code taken from Caml Light, especially Damien Doligez's GC.

Little did I know that O(bjective) Caml would still be there 25 years later!

A lot happened during this time, including several major evolutions of the = language, and, much more importantly, the emergence of a community of users and an ecosystem of tools and libraries. = But maybe this was just the beginning for something even bigger? We'll see…

Happy birthday, OCaml!

David Allsopp replied

Most pleasingly, with a very small number of patches, the Windows port still = works in Visual Studio 2019:

C:\Birthday>ocaml.exe
        Objectiv=
e Caml version 1.00

#print_endline "Happy 25th Birthday, OCaml!";;
Happy 25t=
h Birthday, OCaml<=
span style=3D"color: #a52a2a;">!
- : unit =3D ()
##quit;;

C:\Birthday>type hooray.ml
let rec hip_hip n =3D
  if n > 0 then
    let () =3D pr=
int_endline "hip hip! hooray!" in
    hip_hip (pred n)

let () =3D hip_hi=
p 25
C:\Birthday>oca=
mlopt -o hooray.exe hooray.ml

C:\Birthday>hoo=
ray
hip hip! hooray!
...

On the OCaml Maling List, Roberto Di Cosmo also repli= ed

Long live OCaml!

Thanks Xavier, and to all the brilliant minds that contributed to the evolu= tion and adoption of this beautiful language, and system, in this past quarter o= f a century.

If I may add a personal note, one truly remarkable fact is that some rather complex code written in 1998 using OCaml 1.07 [1] could be compiled and run= last year using OCaml 4.x without modifications: the only visible changes= were the new warnings spotting potential issues in the code, thanks to the many improvements to the compiler over time.

For the curious, all the details are here: https://www.dicosmo.org/Articles/2020-ReSc= ienceC.pdf

Cheers

Roberto

[1] that was the first version including support for marshalling closures, added in a fantastic one week-spring in Pisa exactly for this code :-)

OCaml compiler development newsletter, issue 1: before May 202= 1

gasche announced

I'm happy to introduce the first issue of the "OCaml compiler development n= ewsletter". I asked frequent contributors to the OCaml compiler codebase to write a small burb on what they have been= doing recently, in the interest of sharing more information on what people are interested in, looking at and w= orking on.

This is by no means exhaustive: many people didn't end up having the time t= o write something, and it's fine. But hopefully this can give a small window on development activity related to t= he OCaml compiler, structured differently from the endless stream of Pull Requests on the compiler codebase.

(This initiative is inspired by the excellent Multicore newsletter. Please = don't expect that it will be as polished or consistent :yo-yo: .)

Note:

  • Feel free of course to comment or ask questions, but I don't know if th= e people who wrote a small blurb will be looking at the thread, so no promi= ses.
  • If you have been working on the OCaml compiler and want to say somethin= g, please feel free to post! If you would like me to get in touch next time= I prepare a newsletter issue (some random point in the future), please let= me know by email at (gabriel.scherer at gmail).

@dra27 (David Allsopp)

Compiler relocation patches now exist. There's still a few left to write, a= nd they need splitting into reviewable PRs, but the core features are working. A compiler installation can be copi= ed to a new location and still work, meaning that local switches in opam may in theory be renamed and, more impo= rtantly, we can cache previously-built compilers in an opam root to allow a new switch's compiler to be a copy. Th= is probably won't be reviewed in time for 4.13, although it's intended that once merged opam-repository will carry ba= ck-ports to earlier compilers.

A whole slew of scripting pain has lead to some possible patches to reduce = the use of scripts in the compiler build to somewhat closer to none.

FlexDLL bootstrap has been completely overhauled, reducing build time consi= derably. This will be in 4.13 (#10135)

@nojb (Nicol=C3=A1s Ojeda B=C3=A4r)

I am working on #1015= 9, which enables debug information in -output-complete-exe binaries. It uses incbin under Unix-like system and some other method under Windows.

@gasche (Gabriel Scherer)

I worked on bringing more PRs to a decision (merge or close). The number of= open PRs has gone from 220-ish to 180, which feels nice.

I have also contributed to @Ekdohibs' project camlboot, which is a "bootstrap-free" implementation of OCaml able to compile the OCaml compiler= itself. It currently targets OCaml 4.07 for various reasons. We were able to do a full build of the OCaml compiler,= and check that the result produces bootstrap binaries that coincide with upstream bootstraps. This gives extre= mely strong confidence that the OCaml bootstrap is free from "trusting trust" attacks. For more details, see our = draft paper.

with @Octachron (Florian Angeletti)

I worked with Florian Angeletti on deprecating certain command-line warning= -specifier sequences, to avoid usability issues with (new in 4.12) warning names. Before -w -partial-match disables warning 4, but -w -partial is interpreted as the sequence w -p -w a -w r -w t -w i -w a -w l= , most of which are ignored but -w a silences all warnings. Now multi-letter sequences of "unsigned" specifiers (-p is signed, a is unsigned) are deprecated. (We first deprecated all unsigned specifiers, but Leo White tested the result a= nd remarked that -w A is common, so now we only warn on multi-letter sequences of unsigned specifiers.

I am working with @Octachron (Florian Angeletti) on grouping signature item= s when traversing module signatures. Some items are "ghost items" that are morally attached in a "main item"; the cod= e mostly ignores this and this creates various bugs in corner cases. This is work that Florian started in Septembe= r 2019 with #8929, to fix a bu= g in the reprinting of signatures. I only started reviewing in May-September 2020 and we decided to do sizeable changes, he s= plit it in several smaller changes in January 2021 and we merged it in April 2021. Now we are looking are fixing = other bugs with his code (#9774, #10385). Just this week Florian landed a nice PR fixing several distinct issues related to sig= nature item grouping: #10401.

@xavierleroy (Xavier Leroy)

I fixed #10339, a= mysterious crash on the new Macs with "Apple silicon". This was due to a ARM (32 and 64 bits)-specific optimization of array bound= checking, which was not taken into account by the platform-independent parts of the back-end, leading to incor= rect liveness analysis and wrong register allocation. #10354 fixes this by informing the platform-independent parts of the back-end that some platform-specific instructions can raise. = In passing, it refactors similar code that was duplicating platform-independent calculations (of which instructions ar= e pure) in platform-dependent files.

I spent quality time with the Jenkins continuous integration system at Inri= a, integrating a new Mac Mini M1. For unknown reasons, Jenkins ran the CI script in x86-64 emulation mode, so we = were building and testing an x86-64 version of OCaml instead of the intended ARM64 version. A bit of scripting= later (8b1bc01c3) and voil=C3=A0, arm64-macos is properly tested as part of our CI.

Currently, I'm reading the "safe points" proposal by Sadiq Jaffer (#10039) and the = changes on top of this proposed by Damien Doligez. It's a necessary step towards Multicore OCaml, so we really need to move fo= rward on this one. It's a nontrivial change involving a new static analysis and a number of tweaks in every code= emitter, but things are starting to look good here.

@mshinwell (Mark Shinwell)

I did a first pass of review on the safe points PR (#10039) and significantly simplified the proposed backend changes. I've also been invo= lved in discussions about a new function-level attribute to cause an error if safe points (including alloca= tions) might exist within a function's body, to make code that currently assumes this robust. There will be a des= ign document for this coming in due course.

I fixed the random segfaults that were occurring on the RISC-V Inria CI wor= ker (#10349).

In Flambda 2 land we spent two person-days debugging a problem relating to = Infix_tag! We discovered that the code in OCaml 4.12 onwards for traversing GC roots in static data ("caml_globals") = is not correct if any of the roots are closures. This arises in part because the new compaction code (#9728) has a hidden invariant: it must not see any field of a static data root mor= e than once (not even via an Infix_tag). As far as we know, these situations do not arise in the existing compiler, = although we may propose a patch to guard against them. They arise with Flambda 2 because in order to compile static= ally-allocated inconstant closures (ones whose environment is partially or wholly computed at runtime) we register c= losures directly as global roots, so we can patch their environments later.

@garrigue (Jacques Garrigue)

I have been working on a number of PRs fixing bugs in the type system, whic= h are now merged:

  • #10277 fixes = a theoretical bug in the principality of GADT type inference (#10383 applies only in -princi= pal mode)
  • #10308 fixes = an interaction between local open in patterns and the new syntax for introd= ucing existential type variables
  • #10322 is an = internal change using a normal reference inside of a weak one for backtrack= ing; the weak reference was an optimization when backtracking was a seldom = used feature, and was not useful anymore
  • #10344 fixes = a bug in the delaying of the evaluation of optional arguments
  • #10347 cleans= up some code in the unification algorithm, after a strengthening of univer= sal variable scoping
  • #10362 fixes = a forgotten normalization in the type checking algorithm

Some are still in progress:

  • #10348 improv= es the way expansion is done during unification, to avoid some spurious GAD= T related ambiguity errors
  • #10364 change= s the typing of the body of the cases of pattern-matchings, allowing to war= n in some non-principal situations; it also uncovered a number of principal= ity related bugs inside the the type-checker

Finally, I have worked with Takafumi Saikawa (@t6s) on making the represent= ation of types closer to its logical meaning, by ensuring that one always manipulate a normalized view in #10337 (large cha= nge, evaluation in progress).

@let-def (Fr=C3=A9d=C3=A9ric Bour)

For some time, I have been working on new approaches to generate error mess= ages from a Menhir parser.

My goal at the beginning was to detect and produce a precise message for th= e =E2=80=98let ;=E2=80=99 situation:

let x =3D 5;
let y =3D 6
let z =3D 7

LR detects an error at the third =E2=80=98let=E2=80=99 which is technically= correct, although we would like to point the user at the =E2=80=98;=E2=80=99 which might be the root cause of the error. This goal h= as been achieved, but the prototype is far from being ready for production.

The main idea to increase the expressiveness and maintainability of error c= ontext identification is to use a flavor of regular expressions. The stack of a parser defines a prefix of a sentential form. Our regular ex= pressions are matched against it. Internal details of the automaton does not leak (no reference to states), the regula= r language is defined by the grammar alone. With appropriate tooling, specific situations can be captured by starting f= rom a coarse expression and refining it to narrow down the interesting cases.

Now I am focusing on one specific point of the =E2=80=98error message=E2=80= =99 development pipeline: improving the efficiency of =E2=80=98menhir –list-errors=E2=80=99. This command is used to enumerate sentences that cover all erroneous situat= ions (as defined by the LR grammar). On my computer and with the OCaml grammar, it takes a few minutes and quite a lot= of RAM. Early results are encouraging and I hope to have a PR for Menhir soon. The performance improvement we are aim= ing for is to make the command almost real time for common grammars and to tackle bigger grammars by reducing the memo= ry needs. For instance, in the OCaml case, the runtime is down from 3 minutes to 2=E2= =80=933 seconds and memory consumption goes from a few GiB down to 200 MiB.

Daniel B=C3=BCnzli asked and gasche replied

> […] @Ekdohibs=E2=80=99 project camlboot , which is a =E2=80=9Cbootstrap-free=E2=80=9D=
> implementation of OCaml able to compile the OCaml compiler itself. It = currently targets OCaml 4.07 for various
> reasons. We were able to do a full build of the OCaml compiler, and ch= eck that the result produces bootstrap
> binaries that coincide with upstream bootstraps. This gives extremely = strong confidence that the OCaml bootstrap is
> free from =E2=80=9Ctrusting trust=E2=80=9D attacks. For more details, = see our dr= aft paper.

Something that is not clear to me (but I read quickly) is the impact of `gu= ile` itself being not bootstrapped yet. Could there be a very elaborate attack (with probability 0 of existi= ng) on both the guile and ocaml bootstrap or is there something in the whole scheme that prevents it ?

Yes, currently Guile needs to be trusted, and it would be possible that a b= ootstrapping virus in Guile would break our correctness result. (It would need to reproduce itself through our comp= iler and interpreter that were written after Guile itself, but I think in theory this could be done with an almost= -infinitely clever program analysis.) Of course, an attack at the source level (inserting malicious source, instead = of malicious binaries) is also possible anywhere in the chain. Our main reason for using Guile is that this is the high-level language com= munity most active on debootstrapping-towards-the-metal (through the Guix connection), so we beli= eve it is more likely to manage debootstrapping and maintain it in the longer run.

(The seed that Guile depends on is its macro-expander, which is written usi= ng macros itself. In theory one may perform the macro-expansion of the expander, and then manually review the t= wo versions to verify the absence of attack there.)

Parser for the Scala programming language?

Deep in this thread, Yoann Padioleau announced

I ended up porting the recursive descent parser in the Scala compiler to OC= aml … I think it was the fastest way to get a working parser from OCaml …

https://github.com/returntocorp/pff= f/blob/develop/lang_scala/parsing/Parser_scala_recursive_descent.ml

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B8F37E002C for ; Tue, 25 May 2021 09:30:29 +0200 (CEST) IronPort-Data: =?us-ascii?q?A9a23=3AcNDYnqDyKyu6yRVW//7hw5YqxClBgxIJ4g17XOL?= =?us-ascii?q?fB1W7gDgjhDZTzGUWXj+DOq3fYzGkfN1ybYm19hlQuZ6Ax9UxeLYW3SE0HigS8?= =?us-ascii?q?aIpJvzAcxyuZ3vKRiH7ofMOA/w2MrEsF+hpCC+GzvuRGuK59yAkiPvUHuGU5NP?= =?us-ascii?q?sYUideyc1EU/Ntjozw4bVsqYw6TSIK1vlVeHa+6UzC3f5s9JACV/43orYwP9ZU?= =?us-ascii?q?FsejxtD1rA2TagjUFYzDBD5BrpHTU26ByOQroW5goeHq+j/ILGRpgs1/j82B8/?= =?us-ascii?q?NfrTTKxdaBO+Je1He0zwPAfnKbhtq/0Te1o4yMPMaL1xcizCIg8xZ0NJJpIC9Q?= =?us-ascii?q?gcvP7TRlaIaSRYw/yRWYPUXp+Kaeijm2SCU5wicG5f2+N1lBUQyeIkZ4fpfGnB?= =?us-ascii?q?L7fVeKTYXbxnFifje6LmkTMFoh98/N4/qMJIbvjdn1z6xJfI5R7jHXKOM49JEt?= =?us-ascii?q?ArcLOgm8e32bM4FLGM1PFGROFgWag5SUchv2vmwgD/+dSdZoRSbv8IKD6Ho5FQ?= =?us-ascii?q?Z+NDQ3BD9II3iqR1po3ul?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AJPSjJqkAO0yiYGKIJTWSiTy6uljpDfKX3DAb?= =?us-ascii?q?v31ZSRFFG/FwWfrOoB19726TtN9xYgBGpTnkAsO9qBznmKKdjbN8AV7mZniEhI?= =?us-ascii?q?NHRLsSkbcKgAeQZhEXz4ZmpNhdmtFFeaPN5DpB7foSkTPId+rIm+P3iZxA7N22?= =?us-ascii?q?pxxQpENRGsNdBmFCZTpzeXcGITWua6BWKHO03Ls3mxOQPVoWc+WmDT0/U+DYod?= =?us-ascii?q?qjruOdXTc2QzAm9SiThneS5LT7ChiV2Qp2aUI1/Z4StUbEji3k7eGZv/u60x/R?= =?us-ascii?q?0HKWx5lag9f60LJ4dbyxo/lQBDXwqxqiIL5sXLCPp1kO0ZmS1Go=3D?= X-IronPort-AV: E=Sophos;i="5.82,327,1613430000"; d="scan'208,217";a="509755381" Received: from clt-128-93-181-129.vpn.inria.fr (HELO set) ([128.93.181.129]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 25 May 2021 09:30:24 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 25 May 2021 09:30:14 +0200 Message-ID: <87sg2bgtix.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 18 to 25, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Applied PL research at Jane Street IRC channels available on libera.chat B Trees in Ocaml via Fmlib 0.3.0 GitHub Actions for OCaml: now stable and on the ocaml org Set up OCaml 2.0.0-alpha FrontC 4.1.0 (Vingt ans apr=C3=A8s) Old CWN Applied PL research at Jane Street =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Yaron Minsky announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This isn't exactly news, but we're (still) actively looking to hire people to do applied PL research, with a particular focus on type-level work. Follow this link if you want to see how to apply. Please share it around with anyone who you think might be on the market! *About the job* Part of our ambition is to grow OCaml into a language that does an ever better job of being convenient and expressive by default, while allowing for the kind of precise control you need when building high performance systems, where it's needed. That's led us to do research on stack-allocation, unboxed types, algebraic effects, type-level resource tracking, and more. We think it's an exciting direction for the language, and there's a lot of challenging and novel work to be done, and the main thing that could speed us up is having more of the right people to work on it! Jane Street is an excellent laboratory for this kind of work: big enough to have serious and demanding use-cases, but small and nimble enough to be able to try out new language features, and then back out of them or change them in incompatible ways if need be. And all the work we do on the compiler is in the open, with the goal of getting the final results into a state where they can be upstreamed. Also, it's a great team! Full of serious experts who have collectively contributed a lot to OCaml and PL research over the years, and also a really nice set of people to work with. And I think the team has a good balance of the practical and theoretical: working hard to do the right thing, but also finding practical ideas that can make forward progress in the near term. *Who are we looking for* We're looking for people with a good balance of theoretical and engineering backgrounds, since the work is demanding on both fronts. We're happy to hire people at a range of experience levels: people who have just finished a post-doc or PhD, up to experienced academics and people in industry. The team has a presence in New York and London, and we're hiring in both offices. No remote work, I'm afraid. IRC channels available on libera.chat =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Adrien Nader announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Due to the recent troubles on freenode[1][2], I've connected to irc.libera.chat early in order to create and register the same channels that I know and take care ofa on freenode (i.e. #ocaml and #ocaml-fr). I am not stating libera.chat is better than freenode.net although the amount of staffers moving makes me think freenode.net will not be running fine for a much longer time. At the moment I believe it is better to keep both channels running and to encourage people to connect on libera.chat too. In the future, I might force migration by progressively silencing the channel that should be abandoned. If you maintain a relay bot, can you please add it on libera.chat too? As far as I know, there is no Matrix bridge available currently. It seems the discussion/process for bridge additions occurs at [3]. A good news is that I've gotten the full rights on the channel, something which was requiring paperwork on freenode (which I had already mentioned but never got around to doing and for which I never even remotely got time for). [1] (this still constantly changes) [2] [3] B Trees in Ocaml via Fmlib 0.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hbr announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce the release (0.3.0) of fmlib, a functional library with managed effects. The main new feature of release 0.3.0 are B trees. B trees can be used to implement finite sets and finite maps. Fmlib's B trees have functionality similar to the modules `Set' and `Map' of the standard library. The modules `Set' and `Map' of the standard library are based on AVL trees. B trees offer the same functionality but have on modern processors a better cache performance and have better data locality. The current B tree implementation in `Fmlib' implements B trees by using arrays which are guaranteed to fit into a cache line. The design of B trees is described [here]. The API can be found [here]. The library `Fmlib' has four main components: =E2=80=A2 [Standard Datatypes]: This component offers some modules from `Stdlib' with additional functionality. E.g. `Fmlib_std.Array' offers functions to insert elements into arrays, remove elements from an array and binary search in a sorted array. It has the modules `Result' and `Option' which can be used to avoid exceptions and use exceptions in a more structured way. The modules `Result' and `Option' in `Fmlib' offer a complete monadic interface and offer the `let*' operator to write well readable monadic code. =E2=80=A2 [Pretty Printing]: Print tree like structures in a nice way and= use the library completely functional. The library does not assume a specific IO method. The pretty printer generates a lazy stream of characteres which can be written by all io functions. =E2=80=A2 [Combinator Parsing]: Easily parse textual input by the use of combinators. The library supports indentation sensitivity and can therefore be used to parse yaml files, haskell, python, etc. Furthermore no input method is assumed. The generated parsers are sink of tokens (or characters). You can choose any input method and push the tokens/characters into the parsers. The generated parsers are fully incremental. Parser can be stored at any position of the input stream and in case of interactive editing, parsing can be resumed from any point of the stream. =E2=80=A2 [Interface to Javascript]: This components contains primitives = to interface to javascript via `js_of_ocaml'. `Fmlib' can be installed via opam: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam install fmlib =E2=94=82 opam install fmlib_std =E2=94=82 opam install fmlib_pretty =E2=94=82 opam install fmlib_parse =E2=94=82 opam install fmlib_js =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code of the library is located at [github] [here] [here] [Standard Datatypes] [Pretty Printing] [Combinator Parsing] [Interface to Javascript] [github] GitHub Actions for OCaml: now stable and on the ocaml org =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 I [announced a beta] of OCaml/opam support for GitHub Actions back in Nov 2019, and the functionality has turned out to be popular. A number of projects in our community have been using the Action, and it can be found in the [GitHub Marketplace]. It has been sufficiently popular that it's definitely time to get it off my personal GitHub account, and so I have transferred it to its new home at . I am also very pleased to announce that @smorimoto and @dra27 are also now maintainers =E2=80=93 they have both made significant improvements to it,= and @smorimoto in particular has been working with the GitHub ecosystem to further improve the efficiency of the Action (such as by adding reliable caching). Thank you to them both and [all the other contributors] for your help improving the CI experience around OCaml. If anyone else wishes to contribute to improving the action, please do get involved on [the issue tracker]. And of course, if you are still referencing `avsm/setup-ocaml' in your own workflow definition, this is a good time to change it to `ocaml/setup-ocaml'. This is probably a good time to note that the other [ci-scripts] repository on the ocaml/ GitHub organisation is in sore need of either new maintainers (for the Travis CI), or being retired due to lack of support (primarily due to the shift to GitHub Actions). I'm immensely grateful to Travis CI for the decade of mostly free builds they have provided our community to date. [announced a beta] [GitHub Marketplace] [all the other contributors] [the issue tracker] [ci-scripts] Set up OCaml 2.0.0-alpha =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is the announcement of the first alpha release of setup-ocaml v2. This includes quite a few changes, including reliable cache, as described in a recent [post]. There are so many changes, so I would like to list only the notable changes. (The full changelog can be found at the bottom of the post.) [post] The "ocaml-version" input is now named "ocaml-compiler" =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This was changed because calling it "OCaml Version" is not appropriate enough, e.g. to use the new variant naming convention introduced from 4.12. 32 bits compiler support =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Semver-style version matching support =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C With the naughty exception of `4.02.2' , point releases are meant to be strictly compatible, so once OCaml dev team release a new point release, upgrading should be a no-brainer. With that in mind, it's obviously not smart to rewrite every workflow every time a new point release is released, so you can now specify versions in the style like `4.12.x'. Reliable cache feature =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The action supports not only the compiler cache, but also the [dune cache]. However, note that it is not available on the macOS runners until opam 2.0.9 is released. The dune cache is actually quite powerful for large projects, if you're interested in it, check out the comparison section of [ocaml/setup-ocaml#66]. The reliable cache feature uses the [@actions/cache] package internally, and I worked with the GitHub team to make it fast enough for setup-ocaml to be up to 4x faster. For the Ubuntu runners, you can set up your environment with cache in about 30~40 seconds at the fastest. [dune cache] [ocaml/setup-ocaml#66] [@actions/cache] Automatic pinning and depext handling of local packages =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C For example, if you have a very large number of local packages, like the [Irmin] project, it can be quite a pain for a human to have to write a script to pin them all in your workflow. The action pins and depext the local packages if they exist in the repository by default. You can also use the glob pattern to select which local packages to handle, as described [here]. [Irmin] [here] FrontC 4.1.0 (Vingt ans apr=C3=A8s) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Ivan Gotovchits announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 More than twenty years after its original release [FrontC] is still alive and getting new updates. Mostly it started with my frustration with its Makefiles that ended up in switching to menhir and dune and adding cram tests that finally enabled us to safely touch the grammar definitions and introduce a few c99 =E2=80=A6 c11 language features as we= ll as more GNU extensions. Our end goal is to get a robust and easy-to-use C parser that is capable of taking a C program on a modern Linux distribution and get it parsed into a C abstract tree. It is not that trivial as it may sound as modern C library headers (especially GNU libc) use non-standard or standard but very modern C features, and most of the OCaml parsers that I have seen are still unable to parse them, including parsers from FramaC, C11parser, and even compcert parser (mostly they do not handle complex floating-point types and various extension types and some GCC attributes). Therefore, FrontC is still useful, especially if all that you want is to start doing program analysis with minimal initial effort, just do (but wait until it is [merged]) =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install FrontC =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and start hacking! With that said, FrontC is mostly maintained at leisure time by volunteers, so the pull requests are very welcome. [FrontC] [merged] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 18 to 25, 2021.

Applied PL research at Jane Street

Yaron Minsky announced

This isn't exactly news, but we're (still) actively looking to hire people = to do applied PL research, with a particular focus on type-level work. Follow this link if you want to see ho= w to apply.

https://blog.j= anestreet.com/applied-PL-research/

Please share it around with anyone who you think might be on the market!

About the job

Part of our ambition is to grow OCaml into a language that does an ever bet= ter job of being convenient and expressive by default, while allowing for the kind of precise control you need when bu= ilding high performance systems, where it's needed.

That's led us to do research on stack-allocation, unboxed types, algebraic = effects, type-level resource tracking, and more. We think it's an exciting direction for the language, and there's a l= ot of challenging and novel work to be done, and the main thing that could speed us up is having more of the right= people to work on it!

Jane Street is an excellent laboratory for this kind of work: big enough to= have serious and demanding use-cases, but small and nimble enough to be able to try out new language features, and th= en back out of them or change them in incompatible ways if need be.

And all the work we do on the compiler is in the open, with the goal of get= ting the final results into a state where they can be upstreamed.

Also, it's a great team! Full of serious experts who have collectively cont= ributed a lot to OCaml and PL research over the years, and also a really nice set of people to work with. And I th= ink the team has a good balance of the practical and theoretical: working hard to do the right thing, but also fin= ding practical ideas that can make forward progress in the near term.

Who are we looking for

We're looking for people with a good balance of theoretical and engineering= backgrounds, since the work is demanding on both fronts.

We're happy to hire people at a range of experience levels: people who have= just finished a post-doc or PhD, up to experienced academics and people in industry.

The team has a presence in New York and London, and we're hiring in both of= fices. No remote work, I'm afraid.

IRC channels available on libera.chat

Adrien Nader announced

Due to the recent troubles on freenode[1][2], I've connected to irc.libera.chat early in order to create and register the same channels that I know and take care ofa on freenode (i.e. #ocaml and #ocaml-fr).

I am not stating libera.chat is better than freenode.net although the amount of staffers moving makes me think freenode.net will not be running fine for a much longer time.

At the moment I believe it is better to keep both channels running and to encourage people to connect on libera.chat too. In the future, I might force migration by progressively silencing the channel that should be abandoned.

If you maintain a relay bot, can you please add it on libera.chat too?

As far as I know, there is no Matrix bridge available currently. It seems the discussion/process for bridge additions occurs at [3].

A good news is that I've gotten the full rights on the channel, something which was requiring paperwork on freenode (which I had already mentioned but never got around to doing and for which I never even remotely got time for).

[1] https://lwn.net/Articles/8= 56543/ (this still constantly changes)
[2] https://en.wikipedia.org/wiki/Freenode#2021_ownership_change= _and_conflict
[3] https://github.com/matrix-org/matrix-appservice-irc/issues/208

B Trees in Ocaml via Fmlib 0.3.0

Hbr announced

I am pleased to announce the release (0.3.0) of fmlib, a functional library with managed effects.

The main new feature of release 0.3.0 are B trees. B trees can be used to implement finite sets and finite maps. Fmlib's B trees have functionality similar to the modules Set and Map of the standar= d library.

The modules Set and Map of the standard library a= re based on AVL trees. B trees offer the same functionality but have on modern processors a better c= ache performance and have better data locality.

The current B tree implementation in Fmlib implements B trees = by using arrays which are guaranteed to fit into a cache line. The design of B trees is described here. The API = can be found here.

The library Fmlib has four main components:

  • Standard Datatyp= es: This component offers some modules from Stdlib with additional functionality. E.g. Fmlib_std.Array offers fun= ctions to insert elements into arrays, remove elements from an array and binary search in a sorted array. It has the modules Result and Option<= /code> which can be used to avoid exceptions and use exceptions in a more structured way. The modules Result and Option in Fmlib offer a c= omplete monadic interface and offer the let* operator to write well readable monadic code.
  • Pretty Printi= ng: Print tree like structures in a nice way and use the library completely functional. The library does not assume a specific IO method. The pretty printer generates a lazy stream of characteres which can= be written by all io functions.
  • Combinator Par= sing: Easily parse textual input by the use of combinators. The library supports indentation sensitivity and can therefore= be used to parse yaml files, haskell, python, etc. Furthermore no input method= is assumed. The generated parsers are sink of tokens (or characters). You can choose any input method and push the tokens/characters into the parsers. The generated parsers are fully incremental. Parser can be stored at any positi= on of the input stream and in case of interactive editing, parsing can be resu= med from any point of the stream.
  • Interface to Java= script: This components contains primitives to interface to javascript via js_of_ocaml.

Fmlib can be installed via opam:

opam update
opam install fmlib
opam install fmlib_std
opam install fmlib_pretty
opam install fmlib_parse
opam install fmlib_js

The source code of the library is located at github

GitHub Actions for OCaml: now stable and on the ocaml org

Anil Madhavapeddy announced

I announced a beta of OCaml/opam support for GitHub Actions back in Nov 2019, and the functionality has turn= ed out to be popular. A number of projects in our community have been using the Action, and it can be found in the GitHub Marketplace.

It has been sufficiently popular that it's definitely time to get it off my= personal GitHub account, and so I have transferred it to its new home at https://github.com/ocaml/setup-ocaml. I am also very pleased t= o announce that @smorimoto and @dra27 are also now maintainers – they have both made= significant improvements to it, and @smorimoto in particular has been working with the GitHub ecosystem to further improve= the efficiency of the Action (such as by adding reliable caching). Thank you to them both and all the other contributors for your help improving the CI experience around OCaml.

If anyone else wishes to contribute to improving the action, please do get = involved on the iss= ue tracker. And of course, if you are still referencing avsm/setup-ocaml in your own workflow definition, this is a go= od time to change it to ocaml/setup-ocaml.

This is probably a good time to note that the other ci-scripts repository on the ocaml/ GitHub organisation is in sore need of either new = maintainers (for the Travis CI), or being retired due to lack of support (primarily due to the shift to GitHub Action= s). I'm immensely grateful to Travis CI for the decade of mostly free builds they have provided our community to da= te.

Set up OCaml 2.0.0-alpha

Sora Morimoto announced

This is the announcement of the first alpha release of setup-ocaml v2. This= includes quite a few changes, including reliable cache, as described in a recent post.

There are so many changes, so I would like to list only the notable changes= . (The full changelog can be found at the bottom of the post.)

The "ocaml-version" input is now named "ocaml-compile= r"

This was changed because calling it "OCaml Version" is not appropriate enou= gh, e.g. to use the new variant naming convention introduced from 4.12.

32 bits compiler support

Semver-style version matching support

With the naughty exception of 4.02.2 , point releases are mean= t to be strictly compatible, so once OCaml dev team release a new point release, upgrading should be a no-brainer. With that in= mind, it's obviously not smart to rewrite every workflow every time a new point release is released, so you can now s= pecify versions in the style like 4.12.x.

Reliable cache feature

The action supports not only the compiler cache, but also the dune cache. However, note that it is not available on the macOS runners until opam 2.0.9 is released. The dune cache is actually quite powe= rful for large projects, if you're interested in it, check out the comparison section of ocaml/setup-ocaml#= 66. The reliable cache feature uses the @ac= tions/cache package internally, and I worked with the GitHub team to make it fast enough for setup-ocaml to be up to 4x faste= r. For the Ubuntu runners, you can set up your environment with cache in about 30~40 seconds at the fastest.

Automatic pinning and depext handling of local packag= es

For example, if you have a very large number of local packages, like the Irmin project, it can be quite a pain for a human to have to write a script to pi= n them all in your workflow. The action pins and depext the local packages if they exist in the repository by defau= lt. You can also use the glob pattern to select which local packages to handle, as described here.

= https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-alpha

FrontC 4.1.0 (Vingt ans apr=C3=A8s)

Ivan Gotovchits announced

More than twenty years after its original release FrontC is still alive and getting n= ew updates. Mostly it started with my frustration with its Makefiles that ended up in switching t= o menhir and dune and adding cram tests that finally enabled us to safely touch the grammar definitions and introdu= ce a few c99 … c11 language features as well as more GNU extensions. Our end goal is to get a robust and easy-to-us= e C parser that is capable of taking a C program on a modern Linux distribution and get it parsed into a C abstract = tree. It is not that trivial as it may sound as modern C library headers (especially GNU libc) use non-standard or= standard but very modern C features, and most of the OCaml parsers that I have seen are still unable to parse them, = including parsers from FramaC, C11parser, and even compcert parser (mostly they do not handle complex floating-point = types and various extension types and some GCC attributes).

Therefore, FrontC is still useful, especially if all that you want is to st= art doing program analysis with minimal initial effort, just do (but wait until it is merged)

opam install FrontC

and start hacking!

With that said, FrontC is mostly maintained at leisure time by volunteers, = so the pull requests are very welcome.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 31285E0B0B for ; Tue, 1 Jun 2021 11:23:38 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Am3zj9KBCiAFldAnlHem555DYdb4zR+YMi2TD?= =?us-ascii?q?pHoBLCC9E/bo9fxG88506faZslossTQb6LO90cq7IU80l6Qb3WB5B97LYOClgg?= =?us-ascii?q?aVxepZhrcKrQeLJ8SzzI9g6Zs=3D?= X-IronPort-AV: E=Sophos;i="5.83,239,1616454000"; d="scan'208,217";a="511007073" Received: from clt-128-93-181-7.vpn.inria.fr (HELO set) ([128.93.181.7]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 01 Jun 2021 11:23:37 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 01 Jun 2021 11:23:36 +0200 Message-ID: <87bl8qos4n.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 25 to June 01, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dream =E2=80=94 a simple, yet feature-complete Web framework Ocaml developer at Routine, Paris, Remote OK Feather 0.2.0 BAP 2.3.0 Release Building Ahrefs codebase with Melange Lwt 5.4.1 Other OCaml News Old CWN Dream =E2=80=94 a simple, yet feature-complete Web framework =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Anton Bachin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce [*Dream*], a very easy-to-use Web framework with high performance, secure defaults, and thorough documentation! It is available now from opam, with `opam install dream'. Dream offers: =E2=80=A2 [WebSockets] and [GraphQL]. =E2=80=A2 A [template syntax], which you can see in the image above. =E2=80=A2 Trivial [HTTPS and HTTP/2 support], allowing simple deployments without a proxy. =E2=80=A2 [Sessions] with pluggable [back ends]. =E2=80=A2 Easy [secure cookies] and [CSRF-safe forms]. =E2=80=A6and more, yet Dream sticks to a simple programming model: =E2=80=A2 Web apps are just [bare functions] from requests to responses. =E2=80=A2 [Middlewares] are just higher-order wrapper functions. =E2=80=A2 [Routes] tell the [router] which of these functions to call. Indeed, for those who like algebra, there is a certain [structure] to Dream. However, that's not the point of this post! Dream is meant to be very easy to understand. It sticks to base types, introducing only a few types of its own, and uses existing languages, such as HTML for templates, and URLs for routes. Dream itself is one module in one opam package, which lives in a monorepo. The [docs] are on one page. Dream is loosely coupled. Even though Dream offers many defaults, it is unopinionated, and you can quickly configure or replace anything. For example, it is easy to [use TyXML] for templates, and Dream happily supports such usage with examples. Security-sensitive features, such as cookies, are arranged so that simple and obvious usage is automatically secure. Wherever security still depends on the Dream app, the docs [highlight] it. Dream has selected a modern [cipher] as a default, supports [key rotation], and offers suggestions for other purposes, such as password hashing. It implements and abstracts away all of the [OWASP] security guidelines that are relevant to its level. Dream is designed for full internationalization. It has a centralized [error handler] that intercepts even lower-level HTTP errors, so that you can decorate them with your app's own error template, and leak no hardcoded strings. Dream's URL encoders [favor] internationalized (UTF-8) URIs, and the router accepts them. Finally, Dream is designed for a wide range of applications, including with or without a proxy, standalone or embedded in larger binaries, and with external static assets or [assets compiled in]. [*Dream*] [WebSockets] [GraphQL] [template syntax] [HTTPS and HTTP/2 support] [Sessions] [back ends] [secure cookies] [CSRF-safe forms] [bare functions] [Middlewares] [Routes] [router] [structure] [docs] [use TyXML] [highlight] [cipher] [key rotation] [OWASP] [error handler] [favor] [assets compiled in] Documentation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Dream is very extensively documented. See=E2=80=A6 =E2=80=A2 [*Examples*], the first several of which make up a tutorial. Ea= ch example is a complete project. =E2=80=A2 The online [*playground*], which features many of the examples,= and is itself a [Dream app]! =E2=80=A2 The [*API docs*]. In particular, see =E2=80=A2 Deployment examples for [Heroku], Digital Ocean [with Docker], = and Digital Ocean [with systemd], all of which include GitHub Actions scripts and instructions. =E2=80=A2 Full-stack examples with [js_of_ocaml], [ReScript], and [Melang= e]. =E2=80=A2 Examples in [Reason syntax]. =E2=80=A2 Development [watching] and [live reloading]. [*Examples*] [*playground*] [Dream app] [*API docs*] [Heroku] [with Docker] [with systemd] [js_of_ocaml] [ReScript] [Melange] [Reason syntax] [watching] [live reloading] Contributing =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Dream has already received several very helpful [contributions], and more are very welcome! See [`CONTRIBUTING.md']. I must also acknowledge all the people working on Dream's [dependecies] and [prior art]. In particular, Dream relies heavily on the HTTP and WebSocket [servers] primarily by Spiros Eliopoulos (@seliopou) and Antonio Nuno Monteiro (@anmonteiro). Apart from accepting code, docs, and examples, Dream will happily link to: =E2=80=A2 Blogs and articles, as different people learn best from differe= nt presentations. =E2=80=A2 "Downstream" libraries to use with Dream. For example, Thibaut Mattio (@tmattio) is working on [dream-livereload], a live-reloading middleware for Dream, similar to the [example], which he also contributed! Once dream-livereload is slightly more mature, Dream will link to it from its README. There is also [dream-serve], a live-reloading static site server based on Dream and libuv, which was used to develop the docs. [contributions] [`CONTRIBUTING.md'] [dependecies] [prior art] [servers] [dream-livereload] [example] [dream-serve] Roadmap =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Dream is currently in an alpha state. It is thought (by me) to be internally quite stable. However, there will probably be various API tweaks before release 1.0.0. My current, rough plan is to release several alphas of Dream over six months or so. The releases will address: 1. Flow control for very large responses, and getting the "advanced" part of the I/O API to be as close to zero-copy and non-allocating as possible (or reasonable). 2. Remaining (optional) [security enhancements], such as a [default content security policy]. 3. Remaining [session improvements], such as re-keying. 4. Friction in handling of JSON, database access, etc. This is not properly part of or due to Dream, but it should be addressed for a better Web development experience. 5. Multicore and effects support. That's all. Let's bring OCaml to the Web! Happy Web programming! [security enhancements] [default content security policy] [session improvements] Anton Bachin then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For readers who saw the repo during the earlier ["leak,"] the main updates are: =E2=80=A2 A large number of new examples, including [deployment]. =E2=80=A2 The [playground], which runs the examples, and itself served as= a test. =E2=80=A2 An esy-based [quick start] script. There have also been very many smaller changes to the code, API, and the rest of the docs, but the above changes are the biggest "chunks." The rest is too much to detail :) ["leak,"] [deployment] [playground] [quick start] Ivan Gotovchits asked and Anton Bachin replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I was always wondering how does the source code that uses [templates] work with OCaml tooling, in particular with merlin, ocp-indent, ocaml-format, tuareg and other editor modes? It doesn't work well in practice with anything other than syntax highlighting. Note that you control the syntax mode with the extension. If your template is mostly HTML, you can name it `foo.eml.html'. The intent is that the templates should contain mostly HTML in a large project, and most of them would be in their own `template/' subdirectory. OCaml tooling wouldn't be needed for these mostly-HTML files. For a still-small, but real example of this, see the Playground's [`client.eml.html']. The one-file `.ml' projects with templates, where tooling is a problem, are mostly good for the very first steps of getting started, and examples. There is also an issue about this in the repo, [#55 " how to apply ocamlformat"]. Note that, as in the announcement text, you can use Dream with other templaters, including [TyXML], which has an [HTML PPX]. In addition, if you are using Reason, you can use [TyXML JSX]. Either of these options interacts well with tooling, as far as I know. I didn't make TyXML the default because it considerably increases the Dream learning curve for getting basic tasks done. However, Dream still supports the choice of using TyXML with examples and links. [templates] [`client.eml.html'] [#55 " how to apply ocamlformat"] [TyXML] [HTML PPX] [TyXML JSX] Ocaml developer at Routine, Paris, Remote OK =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: mefyl announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Routine () is looking for an OCaml developer. Routine is a personal productivity assistant. The technological revolves heavily around OCaml which represents 90% of the codebase, the remaining 10% being the UI in Typescript and Vue.js. We target both the browser and desktop through electron, using Js_of_ocaml. While the product is "just" a web app, our technological and academic background leads us to use designs that, I think, can pique the interest of seasoned Ocaml developer. Amongst other things : =E2=80=A2 Type-driven programming based on ppx derivers that produces typescript declaration for frontend bindings, JSON schema to expose and consume external REST APIs (Google, Notion, =E2=80=A6), automatic S= QL bindings, etc. =E2=80=A2 Angstrom based parsing for the interactive console with highlig= hting and completion. =E2=80=A2 Incremental based state updates to refresh minimal subsets of t= he app. =E2=80=A2 Highly concurrent implementation through Lwt, exception-free de= sign. We use state of the art CI/CD and development processes. We plan on distributing open sources packages of these utilities (type-driven system, Google API bindings, Notion API bindings, =E2=80=A6). Future exci= ting subjects could be extending Angstrom with manual rollback to implement generic completions or binding Vue in OCaml directly using melange or rescript to achieve rock solid typing down to the very frontend code (highly prospective teases, don't quote me on this yet :). The company is very much a startup, having just completed YC batch W21 and closed its first round of investment. Salary is up to market standard depending on the profile, plus usual options package, to be discussed. While we expect great OCaml and general computer science proficiency, we're open to most levels of experience. Thoroughness and a love for well rounded, robust and beautiful software design is a must have - but that comes bundled with OCaml love, right ? Do not hesitate to reach out for any question here, at quentin.hocquet@routine.co or refer this to someone who may be interested. Thanks for your time and happy camel riding ! Feather 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charles announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I'm happy to announce feather version 0.2.0! Feather is a minimal library for bash-like scripting and process execution. ([github], [opam]) This release fixes some bugs and adds three new functions =E2=80=A2 `val and_ : cmd -> cmd -> cmd' =E2=80=94 chain two commands, sh= ort circuiting if the first fails, akin to bash's `&&' operator. =E2=80=A2 `val or_ : cmd -> cmd -> cmd' =E2=80=94 chain two commands, sho= rt circuiting if the first succeeds, akin to bash's `||' operator. =E2=80=A2 `val sequence : cmd -> cmd -> cmd' =E2=80=94 chain two commands= regardless of exit status. We include two new operators `&&.' and `||.' which correspond to `and_' and `or_' respectively. They'll be found in the `Feather.Infix' module, which has been renamed from `Feather.File_redirection_infix'. Many thanks to new contributors @Firobe @juxd and @tmarti2 for making this release possible! [github] [opam] BAP 2.3.0 Release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Ivan Gotovchits announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're proud to release the next stable version of Carnegie Mellon University Binary Analysis Platform ([BAP]). The full list of changes can be found on the [release page] but the most interesting new features are highlighted below. [BAP] [release page] The Primus Lisp Frontend =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Now BAP is able to understand not only binary programs but sources written in Primus Lisp. In case if you don't know, [Primus Lisp] is our DSL for writing analysis and library stubs (e.g., to specify semantics of missing library functions). Now, it is possible to reify Primus Lisp programs into static representation. For example, we can translate the following Lisp program =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ;; file demo.lisp =E2=94=82=20 =E2=94=82 (defun example1 (x) =E2=94=82 (set R0 1) =E2=94=82 (set R1 2) =E2=94=82 (set R3 (+ R1 R2 (* R1 R2 3))) =E2=94=82 (memory-write R4 (+ R3 R1)) =E2=94=82 (if (> R0 (* R0 R0)) =E2=94=82 (exec-addr 0xDEADBEEF) =E2=94=82 (set R0 (* R0 R2 R3)))) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 into the BIL (BAP Instruction Language) AST and then pretty print it, =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ bap show --primus-lisp-load=3Ddemo --target=3Darmv7+le -obap:= bil example1 =E2=94=82 example1: =E2=94=82 "{ =E2=94=82 R0 :=3D 1 =E2=94=82 R1 :=3D 2 =E2=94=82 R3 :=3D R1 + R2 + R1 * R2 * 3 =E2=94=82 mem :=3D mem with [R4] <- low:8[R3 + R1] =E2=94=82 #1 :=3D R0 * R0 < R0 =E2=94=82 if (#1) { =E2=94=82 jmp 0xDEADBEEF =E2=94=82 } =E2=94=82 else { =E2=94=82 R0 :=3D R0 * R2 * R3 =E2=94=82 } =E2=94=82 }" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This new feature not only allows us to reify our Lisp stubs into static form but also enables the main killer feature. It is now possible to specify the semantics of machine instructions in Primus Lisp. This feature enables rapid development and experimentation with CPU semantics. And this brings us to the next new feature. [Primus Lisp] New Target: RISC-V =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C The first application of the Primus Lisp Frontend was writing the RISC-V semantics. It took me only one day to write the semantic of the [minimal subset] of RISC-V instruction. Well, partially it is because RISCV-V is truly RISC, like the `add' instruction just adds, =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (defun ADDI (dst rm rn) =E2=94=82 (set$ dst (+ rm rn))) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [minimal subset] New Target: ARMv8 (Aarch64) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C The next target that we tried was Aarch64, the 64-bit ARM architecture. It was a little bit [harder] but still definitely more readable than the official ARM semantics. [harder] Adds namespaces (packages) to Primus Lisp =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Since now we have much more code in Primus Lisp we found ourselves struggling with name clashes. The Primus Lisp program model is a set of mututally recursive overloaded definitions, so naming things is crucial for us. Therefore we implemented namespaces (which are, following Common Lisp trandition, named packages). We ended up in a very Common Lisp look and fill but without inheriting CL problems, like the dependency on the order of inclusion and package redefinitions, and so on. Given our model, and that Primus Lisp features type inference and Haskell-style type classes for overloading, it wasn't that easy to implement :) Adds the `bap dependencies' command =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C The [command] outputs program dependencies such as libraries and symbols. The information is collected recursively with various output options, including dependency graph, YAML, JSON, and SEXP. Much like `nm~+~ldd' on steroids and cross-platform (works on PE/ELF/COFF, and on binaries that are not native to the host). So it could be quite useful even if you're not doing program analysis, but just want to solve a nasty missing library feature or figure our what programs use what libraries, e.g., =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ bap dependencies `which ping` --recursive --ldconfig -ograph = | graph-easy --as boxart =E2=94=82 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 =E2=94=82 libresolv.so.2 =E2=94=82 =E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=90 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 = =E2=94=82 =E2=94=82 =E2=96=B2 = =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=90 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=8C=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 =E2=94=82 =E2=94=82 libidn.so.11 =E2=94=82 =E2=97=80=E2=94=80=E2=94=80 = =E2=94=82 ping =E2=94=82 =E2=94=80=E2=94=80=E2=96=B6 = =E2=94=82 libnettle.so.6 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=98 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2=94=94=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94= =82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94= =82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=96=BC =E2=94= =82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=8C=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 libcap.so.2 =E2=94=82= =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2=94=82 = =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94= =82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94= =82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=96=BC =E2=96= =BC =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=8C=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 = =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=96=B6 =E2=94=82 libc.so.6 =E2=94=82 = =E2=97=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 = =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 = =E2=94=82 =E2=94=82 =E2=94=82 =E2=96=B2= =E2=94=82 =E2=94=82 =E2=94=82 =E2=94=94= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=98 =E2=94=82 =E2=96=BC =E2=94=82 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90 =E2=94=82 =E2=94=82 ld-linux.so.2 =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [command] What's Next? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C We are working on decompilation and integrating with Ghidra, so in 2.4.0 you should expect that bap will output C code for binaries. But it is not all, we're even working into turning BAP into a program analysis framework that enables analysis of source code programs. And even crazier, we're working on adding compilation capabilities to BAP, i.e., an ability to compile/recompile the input sources. So soon BAP will outlive its name, or we will need to find a new interpretation for the BAP acronym, something like the Best Analysis Platform ;) We also plan to make BAP more available for non-seasoned OCaml users and want to push bap into mainstream Linux distributions and overall lower the entrance barrier. Of course, with the end goal to lure users into installing opam)) Questions and Suggestions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Please, do not hesitate to ask questions and provide your suggestions and, ideally, join our [community]. Even if you don't plan to work on binary analysis, BAP offers lots of opportunities for writing your toy programs for learning the language, or maybe even student projects. [community] Building Ahrefs codebase with Melange =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Javier Ch=C3=A1varri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 At Ahrefs, we make extensive use of OCaml and ReScript =E2=80=94previously [known as BuckleScript]. So we have been following the latest developments in the ReScript ecosystem with great interest. A few months ago, [Ant=C3=B3nio Monteiro] released [Melange], a fork of ReScript with an emphasis of keeping compatibility with OCaml ecosystem. One of the key features of Melange is that it uses OCaml 4.12, with all the upsides that that entails (ppxlib, let syntax, better errors, =E2=80=A6). Besides that, Melange has been modeled recentl= y [as just a `compiler-libs' library], so it can be integrated with other OCaml code in a single opam switch. We decided to give Melange a try recently at Ahrefs, and shared the results of this experiment in a blog post: We are currently looking into how a deeper integration with Dune would look like. If your team or company has tried Melange, or is interested on doing so, we would be very interested to hear your use cases and share experiences. [known as BuckleScript] [Ant=C3=B3nio Monteiro] [Melange] [as just a `compiler-libs' library] Lwt 5.4.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are glad to announce the release of version 5.4.1 of Lwt: a bugfix-only release. You can update to this version in `opam': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam upgrade lwt =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thanks to the contributors for finding and fixing the bugs, leading to this release. Check out the release notes (link above) for a full list. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Beta release of Frama-C 23.0~rc1 (Vanadium)] =E2=80=A2 [Building Ahrefs codebase with Melange] =E2=80=A2 [Computing an integer using a Grothendieck topos] =E2=80=A2 [ ReScript 9.1] =E2=80=A2 [Tutorial: Format Module of OCaml] =E2=80=A2 [Tarides project SCoP is selected as one of the brightest Data Portability projects in Europe!] =E2=80=A2 [Alt-Ergo Users=E2=80=99 Club Annual Meeting (2021)] [OCaml Planet] [Beta release of Frama-C 23.0~rc1 (Vanadium)] [Building Ahrefs codebase with Melange] [Computing an integer using a Grothendieck topos] [ ReScript 9.1] [Tutorial: Format Module of OCaml] [Tarides project SCoP is selected as one of the brightest Data Portability projects in Europe!] [Alt-Ergo Users=E2=80=99 Club Annual Meeting (2021)] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of May 25 to June 01, 20= 21.

Dream =E2=80=94 a simple, yet feature-complete Web framework

Anton Bachin announced

I am pleased to announce Dr= eam, a very easy-to-use Web framework with high performance, secure defaults, and thorough documentation!

3D"3384d2a4557f=

It is available now from opam, with opam install dream.

Dream offers:

…and more, yet Dream sticks to a simple programming model:

Indeed, for those who like algebra, there is a certain structure to Dream. However, that's not the point of this post!

Dream is meant to be very easy to understand. It sticks to base types, intr= oducing only a few types of its own, and uses existing languages, such as HTML for templates, and URLs for routes. D= ream itself is one module in one opam package, which lives in a monorepo. The docs are on one page.

Dream is loosely coupled. Even though Dream offers many defaults, it is uno= pinionated, and you can quickly configure or replace anything. For example, it is easy to use TyXML for templ= ates, and Dream happily supports such usage with examples.

Security-sensitive features, such as cookies, are arranged so that simple a= nd obvious usage is automatically secure. Wherever security still depends on the Dream app, the docs highlight it. Dream has selected a modern cipher as a d= efault, supports key rotation, and offers suggestions for other purposes, such as password hashing. It implements and abstracts away all of the OWASP security guidelines that are relevant to its level.

Dream is designed for full internationalization. It has a centralized e= rror handler that intercepts even lower-level HTTP errors, so that you can decorate them with your app's own error template, a= nd leak no hardcoded strings. Dream's URL encoders favor internationalized (UTF-8) URIs, and the router accepts them.

Finally, Dream is designed for a wide range of applications, including with= or without a proxy, standalone or embedded in larger binaries, and with external static assets or as= sets compiled in.

Documentation

Dream is very extensively documented. See…

  • Examples, the first several of which make up a tutorial. Each e= xample is a complete project.
  • The online playground, whi= ch features many of the examples, and is itself a Dream app!
  • The API docs.

In particular, see

Contributing

Dream has already received several very helpful contributi= ons, and more are very welcome! See CONTRIBUTING.md. I must also acknowledge all the people working on Dream's dependecies and prior art= . In particular, Dream relies heavily on the HTTP and WebSocket servers primarily by Spiros Eliopoulos (@seliopou) and Antonio Nuno Monteiro (@anmo= nteiro).

Apart from accepting code, docs, and examples, Dream will happily link to:

  • Blogs and articles, as different people learn best from different prese= ntations.
  • "Downstream" libraries to use with Dream.

For example, Thibaut Mattio (@tmattio) is working on dream-livereload, a live-reloading middleware for Dream, similar to the example, which he also contributed! Once dream-livereload is slightly more mature, Dream will link to it from its RE= ADME.

There is also dream-serv= e, a live-reloading static site server based on Dream and libuv, which was used to develop the docs.

Roadmap

Dream is currently in an alpha state. It is thought (by me) to be internall= y quite stable. However, there will probably be various API tweaks before release 1.0.0.

My current, rough plan is to release several alphas of Dream over six month= s or so. The releases will address:

  1. Flow control for very large responses, and getting the "advanced" part = of the I/O API to be as close to zero-copy and non-allocating as possible (= or reasonable).
  2. Remaining (optional) security enhancements, such= as a default conten= t security policy.
  3. Remaining sessio= n improvements, such as re-keying.
  4. Friction in handling of JSON, database access, etc. This is not properl= y part of or due to Dream, but it should be addressed for a better Web deve= lopment experience.
  5. Multicore and effects support.

That's all. Let's bring OCaml to the Web! Happy Web programming!

https://github.com/aantron/dre= am

Anton Bachin then added

For readers who saw the repo during the earlier "leak," the main updates are:

There have also been very many smaller changes to the code, API, and the re= st of the docs, but the above changes are the biggest "chunks." The rest is too much to detail :)

Ivan Gotovchits asked and Anton Bachin replied

I was always wondering how does the source code that uses templates work with OCaml tooling= , in particular with merlin, ocp-indent, ocaml-format, tuareg and other editor modes?

It doesn't work well in practice with anything other than syntax highlighti= ng. Note that you control the syntax mode with the extension. If your template is mostly HTML, you can name it = foo.eml.html.

The intent is that the templates should contain mostly HTML in a large proj= ect, and most of them would be in their own template/ subdirectory. OCaml tooling wouldn't be needed f= or these mostly-HTML files. For a still-small, but real example of this, see the Playground's client.em= l.html.

The one-file .ml projects with templates, where tooling is a p= roblem, are mostly good for the very first steps of getting started, and examples.

There is also an issue about this in the repo, #55 " how to apply ocamlformat".

Note that, as in the announcement text, you can use Dream with other templa= ters, including TyXML, which has an HTML PPX. In addition, if you are using Reason, you can use TyXML JSX. Either of these options interacts well with tooling, as far as I know.

I didn't make TyXML the default because it considerably increases the Dream= learning curve for getting basic tasks done. However, Dream still supports the choice of using TyXML with examples= and links.

Ocaml developer at Routine, Paris, Remote OK

mefyl announced

Routine (https://routine.co) is looking = for an OCaml developer.

Routine is a personal productivity assistant. The technological revolves he= avily around OCaml which represents 90% of the codebase, the remaining 10% being the UI in Typescript and Vue.js. We t= arget both the browser and desktop through electron, using Js_of_ocaml.

While the product is "just" a web app, our technological and academic backg= round leads us to use designs that, I think, can pique the interest of seasoned Ocaml developer. Amongst other th= ings :

  • Type-driven programming based on ppx derivers that produces typescript = declaration for frontend bindings, JSON schema to expose and consume extern= al REST APIs (Google, Notion, …), automatic SQL bindings, etc.
  • Angstrom based parsing for the interactive console with highlighting an= d completion.
  • Incremental based state updates to refresh minimal subsets of the app.<= /li>
  • Highly concurrent implementation through Lwt, exception-free design.

We use state of the art CI/CD and development processes. We plan on distrib= uting open sources packages of these utilities (type-driven system, Google API bindings, Notion API bindings, &#= x2026;). Future exciting subjects could be extending Angstrom with manual rollback to implement generic completions or= binding Vue in OCaml directly using melange or rescript to achieve rock solid typing down to the very frontend = code (highly prospective teases, don't quote me on this yet :).

The company is very much a startup, having just completed YC batch W21 and = closed its first round of investment. Salary is up to market standard depending on the profile, plus usual option= s package, to be discussed.

While we expect great OCaml and general computer science proficiency, we're= open to most levels of experience. Thoroughness and a love for well rounded, robust and beautiful software des= ign is a must have - but that comes bundled with OCaml love, right ?

Do not hesitate to reach out for any question here, at quentin.hocquet@rout= ine.co or refer this to someone who may be interested.

Thanks for your time and happy camel riding !

Feather 0.2.0

Charles announced

I'm happy to announce feather version 0.2.0! Feather is a minimal library f= or bash-like scripting and process execution. (github, = opam)

This release fixes some bugs and adds three new functions

  • val and_ : cmd -> cmd -> cmd =E2=80=94 chain two com= mands, short circuiting if the first fails, akin to bash's &&= operator.
  • val or_ : cmd -> cmd -> cmd =E2=80=94 chain two comm= ands, short circuiting if the first succeeds, akin to bash's || operator.
  • val sequence : cmd -> cmd -> cmd =E2=80=94 chain two= commands regardless of exit status.

We include two new operators &&. and ||. = which correspond to and_ and or_ respectively. Th= ey'll be found in the Feather.Infix module, which has been renamed from Fe= ather.File_redirection_infix.

Many thanks to new contributors @Firobe @juxd and @tmarti2 for making this = release possible!

BAP 2.3.0 Release

Ivan Gotovchits announced

We're proud to release the next stable version of Carnegie Mellon Universit= y Binary Analysis Platform (BAP). The full list of changes can be found on the release page but the most i= nteresting new features are highlighted below.

The Primus Lisp Frontend

Now BAP is able to understand not only binary programs but sources written = in Primus Lisp. In case if you don't know, Primus Lisp is our DSL for wr= iting analysis and library stubs (e.g., to specify semantics of missing lib= rary functions). Now, it is possible to reify Primus Lisp programs into static r= epresentation. For example, we can translate the following Lisp program

;; file demo.lisp

(defun example1 (x)
  (set R0 1)
  (set R1 2)
  (set R3 (+ R1 R2 (* R1 R2 3)))
  (memory-write R4 (+ R3 R1))
  (if (> R0 (* R0 R0))
      (exec-addr 0xDEADBEEF)
    (set R0 (* R0 R2 R3))))

into the BIL (BAP Instruction Language) AST and then pretty print it,

$ bap show --primus-lisp-load=3Ddemo --target=3Darmv7+le -obap:bil example1
example1:
"{
   R0 :=3D 1
   R1 :=3D 2
   R3 :=3D R1 + R2 + R1 * R2 * 3
   mem :=3D mem with [R4] <- low:8[R3 + R1]
   #1 :=3D R0 * R0 < R0
   if (#1) {
     jmp 0xDEADBEEF
   }
   else {
     R0 :=3D R0 * R2 * R3
   }
 }"

This new feature not only allows us to reify our Lisp stubs into static for= m but also enables the main killer feature. It is now possible to specify the semantics of machine instruction= s in Primus Lisp. This feature enables rapid development and experimentation with CPU semantics. And this brings u= s to the next new feature.

New Target: RISC-V

The first application of the Primus Lisp Frontend was writing the RISC-V se= mantics. It took me only one day to write the semantic of the minimal subset of RISC-V instruction. Well, partially it i= s because RISCV-V is truly RISC, like the add instruction just adds,

(defun ADDI (dst rm rn)
  (set$ dst (+ rm rn)))

New Target: ARMv8 (Aarch64)

The next target that we tried was Aarch64, the 64-bit ARM architecture. It = was a little bit harder but still definitely more readable than the official ARM semantics.

Adds namespaces (packages) to Primus Lisp

Since now we have much more code in Primus Lisp we found ourselves struggli= ng with name clashes. The Primus Lisp program model is a set of mututally recursive overloaded definitions, so na= ming things is crucial for us. Therefore we implemented namespaces (which are, following Common Lisp trandition, nam= ed packages). We ended up in a very Common Lisp look and fill but without inheriting CL problems, like the dependency = on the order of inclusion and package redefinitions, and so on. Given our model, and that Primus Lisp features ty= pe inference and Haskell-style type classes for overloading, it wasn't that easy to implement :)

Adds the bap dependencies command

The com= mand outputs program dependencies such as libraries and symbols. The in= formation is collected recursively with various output options, including dependency graph, YAML, JSON, and SE= XP.

Much like nm~+~ldd on steroids and cross-platform (works on PE= /ELF/COFF, and on binaries that are not native to the host). So it could be quite useful even if you're not doing program analysi= s, but just want to solve a nasty missing library feature or figure our what programs use what libraries, e.g.,

$ bap dependencies `which ping` --recursive --ldconfig -ograph | graph-easy=
 --as boxart
                     =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=90
                     =E2=94=82 libresolv.so.2 =E2=94=82 =E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90
                     =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=98                                   =E2=94=
=82
                       =E2=96=B2                                           =
       =E2=94=82
                       =E2=94=82                                           =
       =E2=94=82
                       =E2=94=82                                           =
       =E2=94=82
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90     =
=E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=90     =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90  =E2=94=82
=E2=94=82 libidn.so.11 =E2=94=82 =E2=97=80=E2=94=80=E2=94=80 =E2=94=82     =
      ping           =E2=94=82 =E2=94=80=E2=94=80=E2=96=B6 =E2=94=82 libnet=
tle.so.6 =E2=94=82  =E2=94=82
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98     =
=E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=98     =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98  =E2=94=82
  =E2=94=82                    =E2=94=82                 =E2=94=82         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                    =E2=94=82                 =E2=94=82         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                    =E2=96=BC                 =E2=94=82         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90  =E2=94=82              =E2=94=
=82                 =E2=94=82
  =E2=94=82                  =E2=94=82  libcap.so.2   =E2=94=82  =E2=94=82 =
             =E2=94=82                 =E2=94=82
  =E2=94=82                  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98  =E2=94=82              =E2=94=
=82                 =E2=94=82
  =E2=94=82                    =E2=94=82                 =E2=94=82         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                    =E2=94=82                 =E2=94=82         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                    =E2=96=BC                 =E2=96=BC         =
     =E2=94=82                 =E2=94=82
  =E2=94=82                  =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=90       =E2=94=82  =
               =E2=94=82
  =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=96=B6 =E2=94=82        libc.so.6         =E2=94=82 =E2=97=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98                 =E2=94=
=82
                     =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=98                         =
=E2=94=82
                       =E2=94=82                      =E2=96=B2            =
               =E2=94=82
                       =E2=94=82                      =E2=94=94=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=
=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=98
                       =E2=96=BC
                     =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=90
                     =E2=94=82 ld-linux.so.2  =E2=94=82
                     =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=
=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=
=94=80=E2=94=80=E2=94=80=E2=94=98

What's Next?

We are working on decompilation and integrating with Ghidra, so in 2.4.0 yo= u should expect that bap will output C code for binaries. But it is not all, we're even working into turning BAP i= nto a program analysis framework that enables analysis of source code programs. And even crazier, we're working o= n adding compilation capabilities to BAP, i.e., an ability to compile/recompile the input sources. So soon BAP will o= utlive its name, or we will need to find a new interpretation for the BAP acronym, something like the Best Analysis Pl= atform ;)

We also plan to make BAP more available for non-seasoned OCaml users and wa= nt to push bap into mainstream Linux distributions and overall lower the entrance barrier. Of course, with the = end goal to lure users into installing opam))

Questions and Suggestions

Please, do not hesitate to ask questions and provide your suggestions and, = ideally, join our = community. Even if you don't plan to work on binary analysis, BAP offers lots of opportunities= for writing your toy programs for learning the language, or maybe even student projects.

Building Ahrefs codebase with Melange

Javier Ch=C3=A1varri announced

At Ahrefs, we make extensive use of OCaml and ReScript =E2=80=94previously = known= as BuckleScript. So we have been following the latest developments in the ReScript ecosystem with great interest.

A few months ago, Ant=C3=B3nio Monteiro released Melange, a fork of Re= Script with an emphasis of keeping compatibility with OCaml ecosystem. One of the key features of Melange is that it uses OCaml 4= .12, with all the upsides that that entails (ppxlib, let syntax, better errors, …). Besides that, Melang= e has been modeled recently as just a compiler-libs library, so it can be integrated with other = OCaml code in a single opam switch.

We decided to give Melange a try recently at Ahrefs, and shared the results= of this experiment in a blog post:

https://tech.ahrefs.com/building-ahrefs-codebase-with-melange-9= f881f6d022b

We are currently looking into how a deeper integration with Dune would look= like. If your team or company has tried Melange, or is interested on doing so, we would be very interested to hear = your use cases and share experiences.

Lwt 5.4.1

Rapha=C3=ABl Proust announced

We are glad to announce the release of version 5.4.1 of Lwt: a bugfix-only = release.

https://githu= b.com/ocsigen/lwt/releases/tag/5.4.1

You can update to this version in opam:

opam update
opam upgrade lwt

Thanks to the contributors for finding and fixing the bugs, leading to this= release. Check out the release notes (link above) for a full list.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id D34E3E034D for ; Tue, 22 Jun 2021 11:05:19 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ANVMlh6AxoPm8uKrlHekK55DYdb4zR+YMi2TD?= =?us-ascii?q?GXoBKiC9Ffbo7/xG/c5rrCMc7Qx7ZJhOo7+90cW7L080sKQFhLX409+ZLXfbUS?= =?us-ascii?q?iTXf5fBbKL+UyQJ8SGzJ8s6U4DSdkdNDSANykdsS+g2njCLz9I+rDums3FuQ6d?= =?us-ascii?q?9QYIcegNUcBdBmxCe2Gm+yNNJDWuLKBJZ6a0145qoCehZGRSTunTPAhwY8Hz4/?= =?us-ascii?q?PKibP7alo8CxY87g7mt0LV1JfKVzaZwzYDWHd1zb0j6GjIlBGR3NTfj9iLjjHd?= =?us-ascii?q?yk7O5NBslNHg09tOA9HJosUZMTn3kG+TFfZccozHkjApgf2lrGwnl9TBuH4bTr?= =?us-ascii?q?5OAqrqDxSInSc=3D?= X-IronPort-AV: E=Sophos;i="5.83,291,1616454000"; d="scan'208,217";a="515983172" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 22 Jun 2021 11:05:00 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 22 Jun 2021 11:04:51 +0200 Message-ID: <877dimb77w.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAxNSB0byAyMiwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KRmlyc3QgcmVs ZWFzZXMgb2YgZGlyc3AtZXhjaGFuZ2U6IGF1ZGl0YWJsZSB2YXJpYW50IG9mIFNpZ25hbCBQcm90 b2NvbCBhbmQgUHJvU2NyaXB0LXRvLU9DYW1sIHRyYW5zbGF0b3INCkpvYiBvZmZlcjogMyB5ZWFy IHJlc2VhcmNoIGVuZ2luZWVyIGluIHN0YXRpYyBhbmFseXNpcyBvZiBPQ2FtbCBwcm9ncmFtcyBh dCBJbnJpYSBSZW5uZXMNCklSQyBjaGFubmVscyBhdmFpbGFibGUgb24gbGliZXJhLmNoYXQNClNl dCB1cCBPQ2FtbCAyLjAuMC1iZXRhDQpGaXJzdCByZWxlYXNlIG9mIEpzb254dCAtIGEgc2V0IG9m IEpTT04gcGFyc2VycyBhbmQgd3JpdGVycw0KbXVsYSAwLjEuMCwgTUwncyByYWRpc2hhbCBVbml2 ZXJzYWwgTGV2ZW5zaHRlaW4gQXV0b21hdGEgbGlicmFyeQ0KTmV3IHJlbGVhc2Ugb2YgbWxjdWRk aWRsLCB0aGUgT0NhbWwgaW50ZXJmYWNlIHRvIHRoZSBDVUREIEJERCBsaWJyYXJ5DQpmaXJzdCBy ZWxlYXNlIG9mIG9yZjogT0NhbWwgUmFuZG9tIEZvcmVzdHMNCk9sZCBDV04NCg0KDQpGaXJzdCBy ZWxlYXNlcyBvZiBkaXJzcC1leGNoYW5nZTogYXVkaXRhYmxlIHZhcmlhbnQgb2YgU2lnbmFsIFBy b3RvY29sIGFuZCBQcm9TY3JpcHQtdG8tT0NhbWwgdHJhbnNsYXRvcg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tZmlyc3QtcmVsZWFzZXMtb2YtZGlyc3AtZXhjaGFuZ2UtYXVkaXRhYmxlLXZhcmlhbnQt b2Ytc2lnbmFsLXByb3RvY29sLWFuZC1wcm9zY3JpcHQtdG8tb2NhbWwtdHJhbnNsYXRvci84MDA4 LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHBsZWFzZWQgdG8gYW5ub3Vu Y2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgW2RpcnNwLWV4Y2hhbmdlXSwNCiAgYXZhaWxhYmxlIHRv ZGF5IGZyb20gdGhlIE9wYW0gcmVwb3NpdG9yaWVzLg0KDQogIFRoZSBpbnRlbnQgb2YgdGhlICpb ZGlyc3BdKiBsaWJyYXJpZXMgaXMgdG8gcHJvdmlkZSBzb2Z0d2FyZSBlbmdpbmVlcnMNCiAgd2l0 aCBhdWRpdGFibGUgc291cmNlIGNvZGUgdGhhdCBoYXMgc29tZSBsZXZlbCBvZiBzYWZldHkgYXNz dXJhbmNlDQogICh0eXBpY2FsbHkgcHJvb2ZzKSBmcm9tIHNlY3VyaXR5IHJlc2VhcmNoZXJzLg0K DQogIFRoZSBmaXJzdCBsaWJyYXJpZXMgYXJlOg0KDQogIOKAoiBkaXJzcC1leGNoYW5nZS1rYmIy MDE3IDAuMS4wIC0gVGhlIEtCQjIwMTcgcHJvdG9jb2wgZm9yIHNlY3VyaW5nIGENCiAgICB0d28t cGFydHkgY29udmVyc2F0aW9uLiBTaW1pbGFyIHRvIFNpZ25hbCBQcm90b2NvbCB2MyBhbmQgT2xt DQogICAgQ3J5cHRvZ3JhcGhpYyBSYXRjaGV0Lg0KICDigKIgZGlyc3AtcHMyb2NhbWwgMC4xLjAg LSBBIFByb1NjcmlwdCB0byBPQ2FtbCB0cmFuc2xhdG9yLiBQcm9TY3JpcHQgaXMNCiAgICBhbiBl eGVjdXRhYmxlIHN1YnNldCBvZiBKYXZhU2NyaXB0IHRoYXQgY2FuIGJlIGZvcm1hbGx5IHZlcmlm aWVkLg0KDQogIGFuZCBhIGNvdXBsZSBtb3JlIHN1cHBvcnRpbmcgbGlicmFyaWVzLg0KDQogIGBk aXJzcC1leGNoYW5nZS1rYmIyMDE3JyBoYXMgYSBidWlsZCBwcm9jZXNzIHRoYXQgZ2VuZXJhdGVz IGl0cyBvd24NCiAgT0NhbWwgY29kZSB1c2luZyBgZGlyc3AtcHMyb2NhbWwnIG9uIGZvcm1hbGx5 IHZlcmlmaWVkIFByb1NjcmlwdA0KICBzb3VyY2UgY29kZS4NCg0KICBUaGUgY2Fub25pY2FsIGV4 YW1wbGUgZm9yIGBkaXJzcC1leGNoYW5nZS1rYmIyMDE3JyBpczoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIG1vZHVsZSBQICAgICAgID0gRGlyc3BfcHJvc2NyaXB0X21pcmFnZS5NYWtlKCkN CiAg4pSCIG1vZHVsZSBFRDI1NTE5ID0gUC5DcnlwdG8uRUQyNTUxOQ0KICDilIIgbW9kdWxlIEsg ICAgICAgPSBEaXJzcF9leGNoYW5nZV9rYmIyMDE3Lk1ha2UoUCkNCiAg4pSCIG1vZHVsZSBVICAg ICAgID0gSy5VVElMDQogIOKUgiANCiAg4pSCICgqIEFsaWNlIHNlbmRzIGEgbWVzc2FnZSB0byBC b2IgKikNCiAg4pSCIGxldCBhbGljZVNlc3Npb25XaXRoQm9iID0gVC5uZXdTZXNzaW9uICgqIC4u LiBzdXBwbHkgc29tZSBrZXlzIHlvdSBjcmVhdGUgd2l0aCBFRDI1NTE5IGFuZCBVIC4uLiAqKSA7 Ow0KICDilIIgbGV0IGFsaWNlVG9Cb2JTZW5kT3V0cHV0ID0gVC5zZW5kDQogIOKUgiAgIGFsaWNl SWRlbnRpdHlLZXkNCiAg4pSCICAgYWxpY2VTZXNzaW9uV2l0aEJvYg0KICDilIIgICAoUC5vZl9z dHJpbmcgIkhpIEJvYiEiKQ0KICDilIIgDQogIOKUgiAoKiBOb3cgeW91IGNhbiBzZW5kIHRoZSBv dXRwdXQgImFsaWNlVG9Cb2JTZW5kT3V0cHV0IiBmcm9tIEFsaWNlIHRvIEJvYi4NCiAg4pSCICAg IExldCdzIHN3aXRjaCB0byBCb2IncyBjb21wdXRlci4gSGUgZ2V0cyBub3RpZmllZCBvZiBhIG5l dyBtZXNzYWdlIHVzaW5nIGEgbm90aWZpY2F0aW9uIGxpYnJhcnkgb2YNCiAg4pSCIHlvdXIgY2hv b3NpbmcsIGFuZCB0aGVuIGRvZXMgLi4uICAqKQ0KICDilIIgDQogIOKUgiBsZXQgYm9iU2Vzc2lv bldpdGhBbGljZSA9IFQubmV3U2Vzc2lvbiAoKiAuLi4gc3VwcGx5IHNvbWUga2V5cyAuLi4gKik7 Ow0KICDilIIgbGV0IGJvYkZyb21BbGljZVJlY2VpdmVPdXRwdXQgPSBULnJlY3YNCiAg4pSCICAg Ym9iSWRlbnRpdHlLZXkNCiAg4pSCICAgYm9iU2lnbmVkUHJlS2V5DQogIOKUgiAgIGJvYlNlc3Np b25XaXRoQWxpY2UNCiAg4pSCICAgdGhlRW5jcnlwdGVkTWVzc2FnZUJvYlJlY2VpdmVkRnJvbUFs aWNlDQogIOKUgiBhc3NlcnQgKGJvYkZyb21BbGljZVJlY2VpdmVPdXRwdXQub3V0cHV0LnZhbGlk KQ0KICDilIIgRm9ybWF0LnByaW50ZiAiQm9iIGp1c3QgcmVjZWl2ZWQgYSBuZXcgbWVzc2FnZTog JXNcbiINCiAg4pSCICAgKGJvYkZyb21BbGljZVJlY2VpdmVPdXRwdXQucGxhaW50ZXh0IHw+IFAu dG9fYnl0ZXMgfD4gQnl0ZXMudG9fc3RyaW5nKQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGVz ZSBhcmUgZWFybHkgcmVsZWFzZXMsIGVzcGVjaWFsbHkgYGRpcnNwLXBzMm9jYW1sJy4NCg0KICBP bmxpbmUgZG9jcyBhcmUgYXQgPGh0dHBzOi8vZGlza3V2LmdpdGh1Yi5pby9kaXJzcC1leGNoYW5n ZT4NCg0KICBGZWVkYmFjaywgY29udHJpYnV0aW9ucyBhbmQgZG93bmxvYWRzIGFyZSB2ZXJ5IHdl bGNvbWUhDQoNCg0KW2RpcnNwLWV4Y2hhbmdlXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9k aXJzcC1leGNoYW5nZSNyZWFkbWU+DQoNCg0KSm9iIG9mZmVyOiAzIHllYXIgcmVzZWFyY2ggZW5n aW5lZXIgaW4gc3RhdGljIGFuYWx5c2lzIG9mIE9DYW1sIHByb2dyYW1zIGF0IElucmlhIFJlbm5l cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2Itb2ZmZXItMy15ZWFyLXJlc2VhcmNoLWVu Z2luZWVyLWluLXN0YXRpYy1hbmFseXNpcy1vZi1vY2FtbC1wcm9ncmFtcy1hdC1pbnJpYS1yZW5u ZXMvODAxMi8xPg0KDQoNCkJlbm9pdCBNb250YWd1IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgYXMgcGFydCBvZiBhIHByb2plY3QgYmV0d2VlbiBJbnJpYSBhbmQgTm9tYWRpYyBMYWJz LCB3ZSBhcmUgb2ZmZXJpbmcgYQ0KICAzIHllYXIgcmVzZWFyY2ggZW5naW5lZXIgcG9zaXRpb24s IHRvIHdvcmsgb24gc3RhdGljIGFuYWx5c2lzIGZvcg0KICBPQ2FtbCBwcm9ncmFtcy4gIFRoZSBw b3NpdGlvbiB3aWxsIHN0YXJ0IGluIE9jdG9iZXIgaW4gdGhlIENlbHRpcXVlDQogIElucmlhIHJl c2VhcmNoIHRlYW0sIGluIHRoZSB2aWJyYW50IGNpdHkgb2YgUmVubmVzLCBGcmFuY2UuICBJZiB5 b3UNCiAgYXJlIGEgdGFsZW50ZWQgT0NhbWwgcHJvZ3JhbW1lciwgaWYgeW91IGFyZSBpbnRlcmVz dGVkIGluIHN0YXRpYw0KICBhbmFseXNpcywgb3IgaWYgeW91IHNpbXBseSB3YW50IHRvIGtub3cg bW9yZSBhYm91dCB0aGlzIHByb2plY3QsDQogIHBsZWFzZSBjb250YWN0IG1lIQ0KDQogIFRoZSBk ZXRhaWxlZCBqb2IgZGVzY3JpcHRpb24gaXMgaGVyZToNCiAgPGh0dHBzOi8vam9icy5pbnJpYS5m ci9wdWJsaWMvY2xhc3NpYy9mci9vZmZyZXMvMjAyMS0wMzgyMT4NCg0KICBQbGVhc2UgZmVlbCBm cmVlIHRvIHRyYW5zZmVyIHRoaXMgYW5ub3VuY2UgdG8gcGVvcGxlIHRoYXQgeW91IHRoaW5rDQog IGNvdWxkIGJlIGludGVyZXN0ZWQuDQoNCg0KSVJDIGNoYW5uZWxzIGF2YWlsYWJsZSBvbiBsaWJl cmEuY2hhdA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJj L2NhbWwtbGlzdC8yMDIxLTA2L21zZzAwMDE0Lmh0bWw+DQoNCg0KRGVlcCBpbiB0aGlzIHRocmVh ZCwgUm9tYWluIENhbGFzY2liZXR0YSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEp1c3QgdG8gbGV0IHlvdSBrbm93IHRoYXQgSSBzcGVudCBhIHRp bWUgdG8gcmUtaW1wbGVtZW50IHRoZSBJUkMNCiAgcHJvdG9jb2wgaW4gT0NhbWwgYW5kIHRvIGRl cGxveSBhIHNpbXBsZSBNaXJhZ2VPUyBhcyBhIGxvZ2dlciB0byBzYXZlDQogIGRpc2N1c3Npb25z IGludG8gYSBHaXQgcmVwb3NpdG9yeS4gVGhlIGJvdCBpcyBjdXJyZW50bHkgZGVwbG95ZWQsIHRo ZQ0KICBleHBsYW5hdGlvbiBpcyBhdmFpbGFibGUgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS9kaW5vc2F1cmUvY3JpL3RyZWUvbWFzdGVyL3VuaWtlcm5lbD4gQW5kIHVzZWQgZm9yDQogICNt aXJhZ2VAaXJjLmxpYmVyYS5jaGF0DQoNCiAgSXQncyBhIG5pY2UgZXhhbXBsZSBhYm91dCBNaXJh Z2VPUy91bmlrZXJuZWwgYW5kIEkgbWF5IGRlcGxveSBvbmUgdG8NCiAgc2F2ZSAjb2NhbWxAaXJj LmxpYmVyYS5jaGF0IGFzIHdoaXRlcXVhcmsgYWxyZWFkeSBkb2VzIHdpdGggaGVyIGJvdC4NCg0K DQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc2V0LXVwLW9jYW1sLTItMC0wLWJldGEv ODAxNi8xPg0KDQoNClNvcmEgTW9yaW1vdG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI b3BlZnVsbHksIHRoaXMgd2lsbCBiZSB0aGUgbGFzdCByZWxlYXNlIGJlZm9yZSBzdGFibGUgMi4w LjAuIFRoaXMNCiAgcmVsZWFzZSBhbGxvd3MgeW91IHRvIGFkZCBtdWx0aXBsZSBjdXN0b20gcmVw b3NpdG9yaWVzLCB3aGljaCBlbmFibGVzDQogIHRlc3Rpbmcgd2l0aCBtdWx0aWNvcmUgYW5kIGJl dGEgcmVwb3NpdG9yeS4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIC0gbmFtZTogVXNlIE11 bHRpY29yZSBPQ2FtbA0KICDilIIgICB1c2VzOiBvY2FtbC9zZXR1cC1vY2FtbEB2Mg0KICDilIIg ICB3aXRoOg0KICDilIIgICAgIG9jYW1sLWNvbXBpbGVyOiBvY2FtbC12YXJpYW50cy40LjEyLjAr ZG9tYWlucytlZmZlY3RzDQogIOKUgiAgICAgb3BhbS1yZXBvc2l0b3JpZXM6IHwNCiAg4pSCICAg ICAgIG11bHRpY29yZTogaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9tdWx0aWNv cmUtb3BhbS5naXQNCiAg4pSCICAgICAgIGRlZmF1bHQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vcGFtLXJlcG9zaXRvcnkuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCkZpcnN0IHJlbGVh c2Ugb2YgSnNvbnh0IC0gYSBzZXQgb2YgSlNPTiBwYXJzZXJzIGFuZCB3cml0ZXJzDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJzdC1y ZWxlYXNlLW9mLWpzb254dC1hLXNldC1vZi1qc29uLXBhcnNlcnMtYW5kLXdyaXRlcnMvODAxOC8x Pg0KDQoNClN0ZXBoZW4gQmxlYXphcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBKc29ueHQgcHJvdmlkZXMgYSBudW1iZXIgb2YgSlNPTiBwYXJzZXJzIGFuZCB3cml0ZXJz IGZvciBSRkMgODI1OQ0KICBjb21wbGlhbnQgSlNPTiBhcyB3ZWxsIGFzIG5vbi1zdGFuZGFyZCBl eHRlbnNpb25zIHN1cHBvcnRlZCBieSBZb2pzb24uDQogIEZlYXR1cmVzIGluY2x1ZGUNCiAg4oCi IFJGQyA4MjU5IGNvbXBsaWFudCB3aGVuIGluIHN0cmljdCBhbmQgYmFzaWMgbW9kZQ0KICDigKIg UGVyZm9ybWFuY2UgZm9jdXNlZCBlc3BlY2lhbGx5IGZvciBmaWxlcyBhbmQgc3RyaW5ncw0KICDi gKIgU3VwcG9ydCBmb3Igc3RhbmRhcmQgYW5kIGV4dGVuZGVkIEpTT04gdHJlZSB0eXBlczoNCiAg ICDigKIgU3RyaWN0IGZvbGxvd3MgYSBzdHJpY3QgaW50ZXJwcmV0YXRpb24gb2YgUkZDIDgyNTkg d2l0aCBhbGwNCiAgICAgIG51bWJlcnMgcmVwcmVzZW50ZWQgYXMgZmxvYXRzLg0KICAgIOKAoiBC YXNpYyBleHRlbmRzIHRoZSBzdHJpY3QgdHlwZSB0byBpbmNsdWRlIGNvbnZlbmllbmNlIHR5cGVz IHdoaWxlDQogICAgICBtYWludGFpbmluZyBSRkMgY29tcGxpYW5jZS4gIFRoaXMgaXMgY29tcGF0 aWJsZSB3aXRoIFlvanNvbidzDQogICAgICBCYXNpYyB0eXBlDQogICAg4oCiIEV4dGVuZGVkIGFk ZHMgYWRkaXRpb25hbCBub24tc3RhbmRhcmQgdHlwZXMgaW5jbHVkaW5nIHR1cGxlcyBhbmQNCiAg ICAgIHZhcmlhbnRzIGFuZCBpcyBub3QgUkZDIGNvbXBsaWFudC4gVGhpcyBpcyBjb21wYXRpYmxl IHdpdGgNCiAgICAgIFlvanNvbidzIFNhZmUgdHlwZQ0KICDigKIgQSBudW1iZXIgb2YgZGlmZmVy ZW50IHBhcnNlcnMgaW5jbHVkaW5nDQogICAg4oCiIEEgc3RhbmRhcmQgSlNPTiB0cmVlIHBhcnNl ciBmb3IgdmFyaW91cyBzb3VyY2VzIGluY2x1ZGluZyBzdHJpbmcsDQogICAgICBmaWxlIGFuZCBj aGFubmVsDQogICAg4oCiIEEgU3RyZWFtIHBhcnNlciB0aGF0IHJldHVybnMgYSBzdHJlYW0gb2Yg cmF3IEpTT04gdG9rZW5zLg0KICAgIOKAoiBBIG1vbmFkIGJhc2VkIHBhcnNlciBjb21wYXRpYmxl IHdpdGggYXN5bmMNCiAg4oCiIFdyaXRlcnMgaW5jbHVkaW5nDQogICAg4oCiIEZpbGUgYW5kIHN0 cmluZyB3cml0ZXJzDQogICAg4oCiIEEgbW9uYWQgYmFzZWQgd3JpdGVyIHRoYXQgaXMgY29tcGF0 aWJsZSB3aXRoIGFzeW5jDQogICAg4oCiIEEgc3RyZWFtIHdyaXRlciB0aGF0IGNvbnZlcnRzIGEg c3RyZWFtIG9mIEpTT04gdG9rZW5zDQogIOKAoiBTdXBwb3J0IGZvciBzdHJlYW1pbmcgSlNPTiB2 aWEgdGhlIFtTdHJlYW1dIG1vZHVsZQ0KICDigKIgU3RhbmRhcmQgaW50ZXJmYWNlcyBpbmNsdWRp bmcgWW9qc29uIGNvbXBhdGliaWxpdHkNCiAg4oCiIFN1cHBvcnQgZm9yIGBwcHhfZGVyaXZpbmdf eW9qc29uJyBhbmQgYHBweF95b2pzb25fY29udicgdmlhIFlvanNvbg0KICAgIGNvbXBhdGliaWxp dHkNCg0KICBUaGUgcGFja2FnZSBpcyBhdmFpbGFibGUgdmlhIG9wYW0sIHdpdGggZG9jdW1lbnRh dGlvbiBvbiBbZ2l0aHViLmlvXS4NCiAgVGhlIHNvdXJjZSBjYW4gYmUgZm91bmQgYXQgW2dpdGh1 Yi9qc29ueHRdDQoNCg0KW1N0cmVhbV0gPGh0dHBzOi8vb2NhbWwub3JnL2FwaS9TdHJlYW0uaHRt bD4NCg0KW2dpdGh1Yi5pb10NCjxodHRwczovL3N0ZXZlYmxlYXphcmQuZ2l0aHViLmlvL29jYW1s LWpzb254dC9qc29ueHQvaW5kZXguaHRtbD4NCg0KW2dpdGh1Yi9qc29ueHRdIDxodHRwczovL2dp dGh1Yi5jb20vc3RldmVibGVhemFyZC9vY2FtbC1qc29ueHQ+DQoNCg0KbXVsYSAwLjEuMCwgTUwn cyByYWRpc2hhbCBVbml2ZXJzYWwgTGV2ZW5zaHRlaW4gQXV0b21hdGEgbGlicmFyeQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tbXVsYS0wLTEtMC1tbHMtcmFkaXNoYWwtdW5pdmVyc2FsLWxldmVuc2h0ZWluLWF1 dG9tYXRhLWxpYnJhcnkvODAyMS8xPg0KDQoNCklmYXogS2FiaXIgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgbXkgbGlicmFyeSBgbXVsYScu IFRoZSBwYWNrYWdlDQogIHVzZXMgVW5pdmVyc2FsIExldmVuc2h0ZWluIEF1dG9tYXRhIChVTEEp IHRvIG5vdCBvbmx5IGNoZWNrIGlmIGEgd29yZA0KICBpcyB3aXRoaW4gYSBjZXJ0YWluIGVkaXQg ZGlzdGFuY2Ugb2YgYW5vdGhlciwgYnV0IHRvIGFsc28gb3V0cHV0IHdoYXQNCiAgdGhlIGVkaXQg ZGlzdGFuY2UgaXMhIEl0IHVzZXMgdGhlIGF1dG9tYXRhIHRoZW1zZWx2ZXMgdG8gY2FsY3VsYXRl DQogIGVkaXQgZGlzdGFuY2VzLiBBIGZ1biB1c2UgY2FzZSBmb3IgdGhpcyBpcyB0aGF0IHdlIGNh biBmZWVkIGEgc2V0IG9mDQogIHdvcmRzIHRvIHRoZSBhdXRvbWF0b24gYW5kIGltbWVkaWF0ZWx5 IHJhbmsgdGhlIHdvcmRzIGJ5IHRoZWlyIGVkaXQNCiAgZGlzdGFuY2UuDQoNCiAgYE11bGEnIHN1 cHBvcnRzIGJvdGggdGhlIHN0YW5kYXJkIExldmVuc2h0ZWluIGVkaXQgZGlzdGFuY2UgYXMgd2Vs bCBhcw0KICB0aGUgRGVtYXJhdS1MZXZlbnNodGVpbiBkaXN0YW5jZSB3aGljaCBjb3VudHMgdHJh bnNwb3NpdGlvbnMgb2YgdHdvDQogIGFkamFjZW50IGNoYXJhY3RlcnMgYXMgYSBzaW5nbGUgZWRp dC4gSSBhbHNvIHN1cHBvcnQgZ2V0dGluZyBsaXZlDQogIGVycm9yIGNvdW50cywgc28geW91IGNh biBmZWVkIHBhcnQgb2YgYSBzdHJpbmcgaW50byBhbiBhdXRvbWF0b24sIGFuZA0KICBnZXQgdGhl IG1pbmltdW0gbnVtYmVyIG9mIGVycm9ycyB0aGF0IGhhdmUgb2NjdXJyZWQgc28gZmFyLg0KDQog IEkgY3VycmVudGx5IGhhdmUgbWF0Y2hpbmcgd29ya2luZyB1c2luZyBub24tZGV0ZXJtaW5pc3Rp YyBVTEEsIGJ1dCBJDQogIGhhdmUgcGFydGlhbGx5IHN0YXJ0ZWQgdGhlIHdvcmsgdG93YXJkIHRo ZSBkZXRlcm1pbmlzdGljIHZlcnNpb25zLiBJdA0KICBzaG91bGQgYmUgcG9zc2libGUgdG8gcHJl LWNvbXB1dGUgdGhlIERGQXMgZm9yIHVwIHRvIGVkaXQgZGlzdGFuY2UgMw0KICBhbmQgcGFjayBp dCB3aXRoIHRoZSBsaWJyYXJ5LCBuZXZlciBuZWVkaW5nIHRvIGJlIHJlY29tcHV0ZWQgYmVjYXVz ZQ0KICB0aGUgVW5pdmVyc2FsIEF1dG9tYXRhIGFyZSBpbmRlcGVuZGVudCBvZiB0aGUgaW5wdXQg c3RyaW5ncy4gQnV0IHRoZQ0KICBub24tZGV0ZXJtaW5pc3RpYyBhdXRvbWF0YSBzdXBwb3J0IHZl cnkgbGFyZ2UgZWRpdCBkaXN0YW5jZXM6DQogIChTeXMuaW50X3NpemUgLSAxKS8yLCBzbyB0aGV5 IGhhdmUgdmFsdWUgb24gdGhlaXIgb3duLg0KDQogIFRoaXMgbGlicmFyeSBjYW1lIGFib3V0IGZy b20gYSBkZXNpcmUgdG8gYWRkIGEgImRpZCB5b3UgbWVhbiIgZmVhdHVyZQ0KICB0byBhIHRveSBj b21waWxlciwgYnV0IG5vdCB3YW50aW5nIHRvIHdyaXRlIHRoZSBraW5kIG9mIGR5bmFtaWMNCiAg cHJvZ3JhbW1pbmcgY29kZSB0aGF0IHlvdSBjYW4gZmluZCBpbiB0aGUgT0NhbWwgY29tcGlsZXIg WzFdIG9yDQogIG1lcmxpbi9zcGVsbGwgWzIsM10uDQoNCiAgWW91IGNhbiBmaW5kIHRoZSBsaWJy YXJ5IFtoZXJlXSBhbmQgdGhlIGRvY3VtZW50YXRpb24gW2hlcmVdLiAgSXQncw0KICBub3Qgb24g YG9wYW0nIHlldCwgYnV0IEkgaGF2ZSBzdWJtaXR0ZWQgYSBbcHVsbCByZXF1ZXN0XS4NCg0KICBI YXBweSBPQ2FtbGluZyENCg0KICBSZWZlcmVuY2VzOg0KICAxLiBFZGl0IGRpc3RhbmNlIGluIHRo ZSBPQ2FtbA0KICAgICBjb21waWxlci4gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9i bG9iL2U1ZTljNWZlZDU2ZWZkZDY3NjAxZTRkYmJhZWJlYjEzNGFlZTM2MWMvdXRpbHMvbWlzYy5t bCNMNTE2Pi4NCiAgMi4gRWRpdCBkaXN0YW5jZSBpbg0KICAgICBtZXJsaW4uIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvbWVybGluL2Jsb2IvNDQ0ZjZlMDAwZjZiN2RjNThkYWM0NGQ2YWMwOTZm YzBlMDk4OTRjYy9zcmMvdXRpbHMvbWlzYy5tbCNMNTI3Pg0KICAzLiBFZGl0IGRpc3RhbmNlIGlu DQogICAgIHNwZWxsbC4gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvc3BlbGxsL2Jsb2IvM2Rh MTE4MjI1NmZmMjUwN2EwYmU4MTJmOTQ1YTdmZTFhMTlhZGY5Yi9zcmMvU3BlbGxsLm1sI0wyNj4N Cg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9pZmF6ay9tdWxhLz4NCg0KW2hlcmVdIDxo dHRwczovL2lmYXprLmdpdGh1Yi5pby9tdWxhL211bGEvaW5kZXguaHRtbD4NCg0KW3B1bGwgcmVx dWVzdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8xODg5 NT4NCg0KDQpJZmF6IEthYmlyIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTb21lIGRldGFpbHM6DQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGZvbGxvd2VkIHRo ZSBwYXBlciBieSBUb3V6ZXQgWzFdIGFzIG11Y2ggYXMgcG9zc2libGUuIElmIHlvdSB0YWtlIGEN CiAgbG9vayBhdCB0aGUgY29kZSwgeW91J2xsIHNlZSBhIGEgbG90IG9mICsxJ3MgZm9yIDEtaW5k ZXhpbmcuIFRoaXMgd2FzDQogIHRvIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGFzIGNsb3NlIHRv IHRoZSBwYXBlciBhcyBwb3NzaWJsZSEgKElmIHlvdQ0KICBkbyB3YW50IHRvIGNoZWNrIHRoZSBp bXBsZW1lbnRhdGlvbiBhZ2FpbnN0IHRoZSBwYXBlciwgbm90ZSB0aGF0IHRoZQ0KICBwYXBlciBo YXMgYSB0eXBvIGluIERlZmluaXRpb24gMikuIEZvciB0aGUgRGVtYXJhdS1MZXZlbnNodGVpbg0K ICBhdXRvbWF0b24sIEkgYWRhcHRlZCBGaWd1cmUgOSBmcm9tIE1pdGFua2luJ3MgdGhlc2lzIFsy XS4gSSdtDQogIGNvbnZpbmNlZCB0aGF0IG15IGFkYXB0YXRpb24gd29ya3MsIGJ1dCBteSBhZGFw dGF0aW9uIG9mIFRvdXpldCdzDQogIHN1YnN1bXB0aW9uIHJlbGF0aW9uIGZvciBEZW1hcmF1LUxl dmVuc2h0ZWluIG1pZ2h0IGJlIHNsaWdodGx5DQogIHN1Yi1vcHRpbWFsLiBJZiB5b3UgaGF2ZSBx dWVzdGlvbiBhYm91dCB0aGUgYWRhcHRhdGlvbiwgZmVlbCBmcmVlIHRvDQogIGFzayENCg0KICBg bXVsYScgZG9lcyBub3QgY29tcGxldGVseSByZXBsYWNlIGMtY3ViZSdzIGBzcGVsbGwnIHBhY2th Z2UuIEluDQogIHBhcnRpY3VsYXIgSSBkb24ndCBzdXBwb3J0IGFueSBpbmRleHMsIGV0Yy4gQnV0 IHRoZXJlIGFyZSBzb21lDQogIGludGVyZXN0aW5nIGRpZmZlcmVuY2VzIGluIHRoZSBhdXRvbWF0 YSB0aGV5IHVzZS4gKGB3JyBzdGFuZHMgZm9yIHRoZQ0KICBiYXNlIHdvcmQgaGVyZSkNCiAgMS4g VGhlIGBzcGVsbGwnIHBhY2thZ2UgY3JlYXRlcyB0aGUgTGV2ZW5zaHRlaW4gQXV0b21hdG9uIGZv ciBhIHNpbmdsZQ0KICAgICBzdHJpbmcvd29yZCAoTEFfdyksIGBtdWxhJyB1c2VzIFVuaXZlcnNh bCBMZXZlbnNodGVpbiBBdXRvbWF0YQ0KICAgICAoVUxBKS4NCiAgMi4gYFNwZWxsbCcgY29tcHV0 ZXMgYSBERkEgZnJvbSBhIG5vbi1kZXRlcm1pbmlzdGljIGF1dG9tYXRvbiB0aGF0DQogICAgIHVz ZXMgZXBsaXNvbiB0cmFuc2l0aW9ucy4gVUxBIGRvIG5vdCBoYXZlIGVwc2lsb24gdHJhbnNpdGlv bnMsIGJ1dA0KICAgICBmb3IgdHJhbnNpdGlvbnMgaXQgbG9va3MgYWhlYWQgaW50byB0aGUgYmFz ZSB3b3JkIGB3Jy4gQWRkaXRpb25hbGx5DQogICAgIHRoZSBORkEncyBzdGF0ZXMvdHJhbnNpdGlv bnMgYXJlIGNvbXB1dGFibGUgb24gdGhlIGZseSwgc28gdGhlcmUgaXMNCiAgICAgbm8gbmVlZCB0 byBzdG9yZSB0aGUgTkZBIGluIG1lbW9yeS4NCiAgMy4gYFNwZWxsbCcncyBhdXRvbWF0YSB0cmFu c2l0aW9ucyB1c2luZyBjaGFyYWN0ZXJzLiBgbXVsYScgY29tcHV0ZXMgYQ0KICAgICBiaXR2ZWN0 b3IgZnJvbSBhbiBpbnB1dCBjaGFyYWN0ZXIgdG8gdHJhbnNpdGlvbiBmcm9tIHN0YXRlcyB0bw0K ICAgICBzdGF0ZXMuIChDb21wdXRpbmcgdGhlIGJpdHZlY3RvciBpcyB3aGVyZSB0aGUgbG9vayBh aGVhZCBjb21lcyBpbikuDQogIDQuIGBTcGVsbGwnJ3MgYXV0b21hdGEgcmV0dXJuIGB0cnVlfi9+ ZmFsc2UnLCBhbmQgdXNlcyBhIHNlcGFyYXRlDQogICAgIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBl ZGl0IGRpc3RhbmNlcy4gYE11bGEnIHVzZXMgdGhlIGF1dG9tYXRvbg0KICAgICBpdHNlbGYgdG8g Y2FsY3VsYXRlIGVkaXQgZGlzdGFuY2VzLCB0aGUgb3V0cHV0cyBoYXZlIHR5cGUgYGludA0KICAg ICBvcHRpb24nLiAoTEFfdyBjYW4gYmUgbW9kaWZpZWQgdG8gc3VwcG9ydCB0aGlzIHRob3VnaCEp DQoNCiAgUmVmZXJlbmNlczoNCiAgMS4gT24gdGhlIExldmVuc2h0ZWluIEF1dG9tYXRvbiBhbmQg dGhlIFNpemUgb2YgdGhlIE5laWdoYm9yaG9vZCBvZiBhDQogICAgIFdvcmQuIEjDqWzDqG5lIFRv dXpldA0KICAgICA8aHR0cHM6Ly9oYWwuYXJjaGl2ZXMtb3V2ZXJ0ZXMuZnIvaGFsLTAxMzYwNDgy L2ZpbGUvTEFUQTIwMTYucGRmPg0KICAyLiBVbml2ZXJzYWwgTGV2ZW5zdGVpbiBBdXRvbWF0YTog QnVpbGRpbmcgYW5kIFByb3BlcnRpZXMuIFBldGFyDQogICAgIE5pa29sYWV2DQogICAgIE1pdGFu a2luLiA8aHR0cHM6Ly9zdG9yZS5mbWkudW5pLXNvZmlhLmJnL2ZtaS9sb2dpYy90aGVzZXMvbWl0 YW5raW4tZW4ucGRmPg0KDQoNCk5ldyByZWxlYXNlIG9mIG1sY3VkZGlkbCwgdGhlIE9DYW1sIGlu dGVyZmFjZSB0byB0aGUgQ1VERCBCREQgbGlicmFyeQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tbmV3LXJlbGVhc2Utb2YtbWxjdWRkaWRsLXRoZS1vY2FtbC1pbnRlcmZhY2UtdG8tdGhl LWN1ZGQtYmRkLWxpYnJhcnkvODAyOC8xPg0KDQoNCm5iZXJ0aCBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBwbGVhc2Vk IHRvIHdyaXRlIHRoaXMgZmlyc3QgcmVsZWFzZSBhbm5vdW5jZW1lbnQgZm9yIHRoZQ0KICBbbWxj dWRkaWRsXSBwYWNrYWdlLg0KDQogIFRoZXNlIGJpbmRpbmdzIHRvIHRoZSBDVUREIEJERCBsaWJy YXJ5IHdlcmUgaW5pdGlhbGx5IHdyaXR0ZW4gYnkNCiAgQmVydHJhbmQgSmVhbm5ldCBhbmQgaGF2 ZSBiZWVuIGFyb3VuZCBhcyBhbiBPUEFNIHBhY2thZ2UgZm9yIHF1aXRlDQogIHNvbWUgdGltZSBu b3cuICBUaGUgc291cmNlIGNvZGUgaXMgbm93IGhvc3RlZCBvbiBbZnJhbWFnaXRdLg0KDQogIFRo aXMgcmVsZWFzZSBvZiB2ZXJzaW9uIDMuMC43IG1vc3RseSBwb3J0cyB0aGUgcGFja2FnZSB0byBP Q2FtbA0KICB2ZXJzaW9ucyDiiaUgNC4xMC4NCg0KDQpbbWxjdWRkaWRsXSA8aHR0cHM6Ly9vcGFt Lm9jYW1sLm9yZy9wYWNrYWdlcy9tbGN1ZGRpZGw+DQoNCltmcmFtYWdpdF0gPGh0dHBzOi8vZnJh bWFnaXQub3JnL25iZXJ0aC9tbGN1ZGRpZGw+DQoNCg0KZmlyc3QgcmVsZWFzZSBvZiBvcmY6IE9D YW1sIFJhbmRvbSBGb3Jlc3RzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLW9yZi1vY2FtbC1yYW5k b20tZm9yZXN0cy84MDM0LzE+DQoNCg0KVW5peEp1bmtpZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg ZmluaXNoZWQgaW1wbGVtZW50aW5nIGEgY2xhc3NpZmllciBhbmQgcmVncmVzc29yIHVzaW5nIFJh bmRvbQ0KICBGb3Jlc3RzIChzZW1pbmFsIHBhcGVyOg0KICA8aHR0cHM6Ly9saW5rLnNwcmluZ2Vy LmNvbS9hcnRpY2xlLzEwLjEwMjMvQToxMDEwOTMzNDA0MzI0Pik6DQoNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9Vbml4SnVua2llL29yZj4NCg0KICBTb21lIGNhdmVhdHM6DQogIOKAoiB0aGlzIGlz IHNvbWV3aGF0IHNsb3c7IGVzcGVjaWFsbHkgdGhlIGNsYXNzaWZpZXIgKGFuZCBJIGRvbuKAmXQg a25vdw0KICAgIHNvIG11Y2ggaG93IHRvIGFjY2VsZXJhdGUgaXQ7IHByb2JhYmx5IHR3byBvcmRl cnMgb2YgbWFnbml0dWRlDQogICAgc2xvd2VyIHRoYW4gc2tsZWFybikuDQogIOKAoiB0aGlzIGlz IG5vdCBzdXBlciBnZW5lcmljIChpbnQgSW50TWFwIHNwYXJzZSBmZWF0dXJlcyBvbmx5OyBpLmUu IGENCiAgICBzcGFyc2UgdmVjdG9yIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzYW1wbGUpLg0K DQogIFRoZSBwYWNrYWdlIGlzIG5vdyBhdmFpbGFibGUgaW4gb3BhbSAob3BhbSBpbnN0YWxsIG9y ZikuDQoNCiAgVHdvIGludGVyZmFjZXMgYXJlIGV4cG9zZWQ6DQoNCiAgUkZDIChmb3IgY2xhc3Np ZmljYXRpb24pDQogIDxodHRwczovL2dpdGh1Yi5jb20vVW5peEp1bmtpZS9vcmYvYmxvYi9tYXN0 ZXIvc3JjL1JGQy5tbGk+DQoNCiAgUkZSIChmb3IgcmVncmVzc2lvbikNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9Vbml4SnVua2llL29yZi9ibG9iL21hc3Rlci9zcmMvUkZSLm1saT4NCg0KICBUaGUg dGVzdCBmaWxlIHNob3dzIHNvbWUgdXNhZ2UgZXhhbXBsZXM6DQogIDxodHRwczovL2dpdGh1Yi5j b20vVW5peEp1bmtpZS9vcmYvYmxvYi9tYXN0ZXIvc3JjL3Rlc3QubWw+DQoNCiAgSWYgeW91IHdh bnQgdG8gaGVscCwgSSB0cmllZCB0byBmbGFnIGEgZmV3IHRoaW5ncyBmb3IgdGhlIG5lYXIgZnV0 dXJlOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL1VuaXhKdW5raWUvb3JmL2lzc3Vlcz4NCg0KICBJ ZiB5b3UgdXNlIGl0IGFuZCBpZiBpdCBpcyB1c2VmdWwgdG8geW91LCBJIHdvdWxkIGJlIGhhcHB5 IHRvIGtub3cuDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEkn bGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0g b3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdp c2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQog IFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8 bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8 aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFy Y2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29u bGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+ DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 15 to 22, 2021.

First releases of dirsp-exchange: auditable variant of Signal = Protocol and ProScript-to-OCaml translator

jbeckford announced

I'm pleased to announce the first release of dirsp-exchange<= /a>, available today from the Opam repositories.

The intent of the [dirsp] libraries is to provide software engineers= with auditable source code that has some level of safety assurance (typically proofs) from security re= searchers.

The first libraries are:

  • dirsp-exchange-kbb2017 0.1.0 - The KBB2017 protocol for securing a two-= party conversation. Similar to Signal Protocol v3 and Olm Cryptographic Rat= chet.
  • dirsp-ps2ocaml 0.1.0 - A ProScript to OCaml translator. ProScript is an= executable subset of JavaScript that can be formally verified.

and a couple more supporting libraries.

dirsp-exchange-kbb2017 has a build process that generates its = own OCaml code using dirsp-ps2ocaml on formally verified ProScript source code.

The canonical example for dirsp-exchange-kbb2017 is:

module P       =3D Dirsp_proscript_mirage.Make()
module ED25519 =3D P.=
Crypto.ED25519
module K       =3D Di=
rsp_exchange_kbb2017.Make(P)
module U       =3D K.=
UTIL

(* A=
lice sends a message to Bob *)
let aliceSessionWithBob =3D T.newSession (* ... supply some keys you create with ED25519 an=
d U ... *) ;;
let aliceToBobSendOutput =3D T.send
  aliceIdentityKey
  aliceSessionWithBob
  (P.of_string "Hi Bob!")

(* N=
ow you can send the output "aliceToBobSendOutput" from Alice to Bob.
   Let's switch to Bob's computer. He gets =
notified of a new message using a notification library of
your choosing, and then does ...  *)

let bobSessionWithAlice =3D T.newSession (* ... supply some keys ... *);;
let bobFromAliceReceiveOutput =3D T.recv
  bobIdentityKey
  bobSignedPreKey
  bobSessionWithAlice
  theEncryptedMessageBobReceivedFromAlice
assert (bobFromAliceReceiveOutput.ou=
tput.valid)
Format.printf "Bob just received a new message: %s\n"
  (bobFromAliceReceiveOutput.plaintext |>=
; P.to_bytes |> Bytes.t=
o_string)

These are early releases, especially dirsp-ps2ocaml.

Online docs are at http= s://diskuv.github.io/dirsp-exchange

Feedback, contributions and downloads are very welcome!

Job offer: 3 year research engineer in static analysis of OCam= l programs at Inria Rennes

Benoit Montagu announced

as part of a project between Inria and Nomadic Labs, we are offering a 3 ye= ar research engineer position, to work on static analysis for OCaml programs. The position will start in October in the Celtique Inria research team, in = the vibrant city of Rennes, France. If you are a talented OCaml programmer, if you are interested in static ana= lysis, or if you simply want to know more about this project, please contact me!

The detailed job description is here: https://jobs.inria.fr/public/classic/fr/of= fres/2021-03821

Please feel free to transfer this announce to people that you think could b= e interested.

IRC channels available on libera.chat

Deep in this thread, Romain Calascibetta announced

Just to let you know that I spent a time to re-implement the IRC protocol in OCaml and to deploy a simple MirageOS as a logger to save discussions into a Git repository. The bot is currently deployed, the explanation is available here: https://= github.com/dinosaure/cri/tree/master/unikernel And used for #mirage@irc.libera.chat

It's a nice example about MirageOS/unikernel and I may deploy one to save #ocaml@irc.libera.chat as whitequark already does with her bot.

Set up OCaml 2.0.0-beta

Sora Morimoto announced

Hopefully, this will be the last release before stable 2.0.0. This release = allows you to add multiple custom repositories, which enables testing with multicore and beta reposito= ry.

- name: Use Multicore OCaml
  uses: ocaml/setup-ocaml@v2
  with:
    ocaml-compiler: ocaml-variants.4.12.0+domains+effects
    opam-repositories: |
      multicore: https://github.com/ocaml-multicore/multicore-opam.git
      default: https://github.com/ocaml/opam-repository.git

First release of Jsonxt - a set of JSON parsers and writers

Stephen Bleazard announced

Jsonxt provides a number of JSON parsers and writers for RFC 8259 compliant= JSON as well as non-standard extensions supported by Yojson. Features include

  • RFC 8259 compliant when in strict and basic mode
  • Performance focused especially for files and strings
  • Support for standard and extended JSON tree types:
    • Strict follows a strict interpretation of RFC 8259 with all numbers rep= resented as floats.
    • Basic extends the strict type to include convenience types while mainta= ining RFC compliance. This is compatible with Yojson's Basic type
    • Extended adds additional non-standard types including tuples and varian= ts and is not RFC compliant. This is compatible with Yojson's Safe type
  • A number of different parsers including
    • A standard JSON tree parser for various sources including string, file = and channel
    • A Stream parser that returns a stream of raw JSON tokens.
    • A monad based parser compatible with async
  • Writers including
    • File and string writers
    • A monad based writer that is compatible with async
    • A stream writer that converts a stream of JSON tokens
  • Support for streaming JSON via the Stream module
  • Standard interfaces including Yojson compatibility
  • Support for ppx_deriving_yojson and ppx_yojson_conv<= /code> via Yojson compatibility

The package is available via opam, with documentation on = github.io. The source can be found at github/jsonxt<= /a>

mula 0.1.0, ML's radishal Universal Levenshtein Automata libra= ry

Ifaz Kabir announced

I'm happy to announce the release of my library mula. The pack= age uses Universal Levenshtein Automata (ULA) to not only check if a word is within a certain edit distance of anot= her, but to also output what the edit distance is! It uses the automata themselves to calculate edit dis= tances. A fun use case for this is that we can feed a set of words to the automaton and immediately ra= nk the words by their edit distance.

Mula supports both the standard Levenshtein edit distance as w= ell as the Demarau-Levenshtein distance which counts transpositions of two adjacent characters as a single edit. I = also support getting live error counts, so you can feed part of a string into an automaton, and get t= he minimum number of errors that have occurred so far.

I currently have matching working using non-deterministic ULA, but I have p= artially started the work toward the deterministic versions. It should be possible to pre-compute the= DFAs for up to edit distance 3 and pack it with the library, never needing to be recomputed bec= ause the Universal Automata are independent of the input strings. But the non-deterministic automata su= pport very large edit distances: (Sys.int_size - 1)/2, so they have value on their own.

This library came about from a desire to add a "did you mean" feature to a = toy compiler, but not wanting to write the kind of dynamic programming code that you can find in = the OCaml compiler [1] or merlin/spelll [2,3].

You can find the library here and the documentation here. It's not on opam yet, but I have submitted a pull request.

Happy OCamling!

References:

  1. Edit distance in the OCaml compiler. h= ttps://github.com/ocaml/ocaml/blob/e5e9c5fed56efdd67601e4dbbaebeb134aee361c= /utils/misc.ml#L516.
  2. Edit distance in merlin. https://= github.com/ocaml/merlin/blob/444f6e000f6b7dc58dac44d6ac096fc0e09894cc/src/u= tils/misc.ml#L527
  3. Edit distance in spelll. https://gith= ub.com/c-cube/spelll/blob/3da1182256ff2507a0be812f945a7fe1a19adf9b/src/Spel= ll.ml#L26

Ifaz Kabir then added

Some details:

I followed the paper by Touzet [1] as much as possible. If you take a look = at the code, you'll see a a lot of +1's for 1-indexing. This was to keep the implementation as close to= the paper as possible! (If you do want to check the implementation against the paper, note that the pa= per has a typo in Definition 2). For the Demarau-Levenshtein automaton, I a= dapted Figure 9 from Mitankin's thesis [2]. I'm convinced that my adaptation works, but my adaptation of Touzet's subsumption relatio= n for Demarau-Levenshtein might be slightly sub-optimal. If you have question about the adaptation, f= eel free to ask!

mula does not completely replace c-cube's spelll = package. In particular I don't support any indexs, etc. But there are some interesting differences in the automata they use. (= w stands for the base word here)

  1. The spelll package creates the Levenshtein Automaton for a= single string/word (LA_w), mula uses Universal Levenshtein Au= tomata (ULA).
  2. Spelll computes a DFA from a non-deterministic automaton t= hat uses eplison transitions. ULA do not have epsilon transitions, but for = transitions it looks ahead into the base word w. Additionally = the NFA's states/transitions are computable on the fly, so there is no need= to store the NFA in memory.
  3. Spelll's automata transitions using characters. mula= computes a bitvector from an input character to transition from sta= tes to states. (Computing the bitvector is where the look ahead comes in).<= /li>
  4. Spelll's automata return true~/~false, and us= es a separate function to calculate edit distances. Mula uses = the automaton itself to calculate edit distances, the outputs have type int option. (LA_w can be modified to support this though!)

References:

  1. On the Levenshtein Automaton and the Size of the Neighborhood of a Word= . H=C3=A9l=C3=A8ne Touzet https://hal.archives-ouvertes.fr/hal-01360482/fi= le/LATA2016.pdf
  2. Universal Levenstein Automata: Building and Properties. Petar Nikolaev = Mitankin. https://store.fmi.uni-sofia.bg/fmi/logic/theses/mitankin-en.pdf<= /a>

New release of mlcuddidl, the OCaml interface to the CUDD BDD = library

nberth announced

I'm pleased to write this first release announcement for the mlcuddidl package.

These bindings to the CUDD BDD library were initially written by Bertrand J= eannet and have been around as an OPAM package for quite some time now. The source code is now hosted = on framagit.

This release of version 3.0.7 mostly ports the package to OCaml versions = =E2=89=A5 4.10.

first release of orf: OCaml Random Forests

UnixJunkie announced

I finished implementing a classifier and regressor using Random Forests (seminal paper: https://link.springer.com/article/10.1023/A:1010933404324):

https://github.com/UnixJunkie= /orf

Some caveats:

  • this is somewhat slow; especially the classifier (and I don=E2=80=99t k= now so much how to accelerate it; probably two orders of magnitude slower t= han sklearn).
  • this is not super generic (int IntMap sparse features only; i.e. a spar= se vector of integers represents a sample).

The package is now available in opam (opam install orf).

Two interfaces are exposed:

RFC (for classification) https= ://github.com/UnixJunkie/orf/blob/master/src/RFC.mli

RFR (for regression) https= ://github.com/UnixJunkie/orf/blob/master/src/RFR.mli

The test file shows some usage examples: https= ://github.com/UnixJunkie/orf/blob/master/src/test.ml

If you want to help, I tried to flag a few things for the near future: https://github.com/Uni= xJunkie/orf/issues

If you use it and if it is useful to you, I would be happy to know.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 2075AE0B0B for ; Tue, 29 Jun 2021 14:24:27 +0200 (CEST) IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AXer9caGPCaJZ5o4PpLqFOJHXdLJyesId70hD?= =?us-ascii?q?6qkoc20rTuWxjMqunOsW2FvdlV8qKS8dcdDpAtjmfZquz+8K3WBxB8bpYOCIgh?= =?us-ascii?q?rSEGgJ1+ffKgPbam/DH4JmpMJdmu1FeaHN5bYTt7ek3OGXe+xQmOVv2prY3Ns3?= =?us-ascii?q?VxxWPF1Xg5gJ1XYlNu5wencGHzWufKBJTqZ0hfA36gZIG05nFPhTXUN1GpmGmz?= =?us-ascii?q?SjrvuPCnRoaX5Xi3jtsdrr0s+GL/H/5GZeb9ph+8ZkzYGvqX2e2kzXiYDC9vaq?= =?us-ascii?q?7R6r0305oqqE9jJrPr3BtiAqQA+cyjpAL74RKoFq9ApF0N1HhWxGrPD85y4FDo?= =?us-ascii?q?BI8nvUF1vF7yfF6k3Y9Adr1HP401+fhhLY0IPErDlRMbsDuWuHSHrkwntlu9c5?= =?us-ascii?q?2LlA3mKHu/NsfFX9dQrGlqv1v0sGrDvHnZIA/NRj+kC2EeYlGchsRcJzxjIiLH?= =?us-ascii?q?9PdhiKo7zOooRVfbXhzecTbFeTdXycpWV03NmwN05DVyuuUwwevsSO33xIkGti?= =?us-ascii?q?z00erfZv1ks9yA=3D=3D?= X-IronPort-AV: E=Sophos;i="5.83,308,1616454000"; d="scan'208,217";a="386504117" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 29 Jun 2021 14:24:26 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 29 Jun 2021 14:24:25 +0200 Message-ID: <87a6n8g8p2.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 22 to 29, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 wasicaml - a code emitter for OCaml targeting WebAssembly opam 2.1.0~rc2 Set up OCaml 2.0.0-beta2 Any OCaml bindings to Apache Arrow? Compiler engineer for OCaml and WebAssembly, Germany v3.0.0 release of reparse, reparse-lwt, reparse-lwt-unix Progress 0.2.0 http-multipart-formdata v2.0.0 Old CWN wasicaml - a code emitter for OCaml targeting WebAssembly =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce a new project to develop a code generator that emits WebAssembly: With the support of RemixLabs I could already create a very first version that takes the OCaml bytecode as input and translates it to WebAssembly. While this approach probably doesn't lead to the fastest code, it is easy to accomplish, and it demonstrates the challenge (and already shows how to solve many of the part problems along the road). To be precisely, the target of the translator is wasm32-unknown-wasi, i.e. the WASI ABI. This ABI is still in early development, but provides already the syscalls (or better, host calls) to access files, to get the current time, and to read the environment. This is almost enough to run a compiler - I only had to add system() so that ocamlc can start external preprocessors. Also, due to the fact that the current wasm implementations still lack exception handling, I had to assume the presence of a host emulation of exceptions (which is easy to provide if the host environment is Javascript, but not necessarily for other environments). The translator takes the OCaml bytecode as input, i.e. you first create an excecutable =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ocamlc -o myexec ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and then make wasm out of it: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wasicaml -o myexec.wasm myexec =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you omit the .wasm suffix, wasicaml will put a preamble in front of the wasm code that starts the execution: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wasicaml -o myexec_wasm myexec =E2=94=82 $ ./myexec_wasm =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Because of this trick, many problems of cross-compiling can be avoided. You may ask what the benefits of yet another "Web" language are. We already have two emitters targeting Javascript - isn't that enough? Well, two answers here. First, WASI is a proper LLVM target. Because of this, you can link code from other languages with your executable (e.g. C or Rust). So you are not limited to OCaml but can use any language that also targets the WASI ABI. E.g. you can do =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wasicaml -o myexec.wasm myexec -ccopt -lfoo =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 to also link in libfoo.a (which must also be compiled to wasm). So it is multi-lingual from the beginning. Second, WebAssembly can be used outside the web, too. WASI targets more the command-line, and server plugins, and generally any OS-independent environments. For example, imagine you have an Electron app with a great UI, but for some special functionality you need to include some OCaml code, too. You don't want to give up the OS-independence, and WASI gives you now a natural option to add the OCaml code. And you still have access to the filesystem without hassle. - Another example is edge computing, i.e. when the cloud is extended by computers outside the data center, and the code should be in a form so that it can be run on as many platforms as possible. - All in all, WASI plays well when you need to combine OS-independence with a classic way of organizing the code as command or as server function, and you also need predictable performance. The challenge of translating OCaml to wasm is mainly the garbage collector. Wasm doesn't permit many of the tricks ocamlopt is using to know in which memory (or register) locations OCaml values are stored. In wasm, there are no registers but the closest vehicle are local variables. Now, it is not possible to scan these variables from the GC function, making it practically impossible to put OCaml values there while a function is called that might trigger a GC. There is also no really cheap way of obtaining a stack descriptor. Wasicaml inherits the stack from the bytecode interpreter and uses it as its own shadow stack for OCaml values. As wasicaml bases on the bytecode representation of the code, the bytecode instructions already ensure that values always live in this stack when the GC might run. Wasicaml additionally tries to identify values that don't need this special treatment (like ints and bools) and that are preferably stored in local variables, giving the wasm executor freedom to put these into registers or other high-speed locations. (Unfortunately, most of the type information is already erased in the bytecode, and this is definitely one of the deficiencies of the bytecode approach.) In order to maximize the performance, it is probably best to avoid the stack whenever possible. The current approach of transforming the bytecode hasn't brought to an end yet with respect to such optimizations. For example, there could be more analyses that figure out when GC runs are actually possible and when it is safe to use local variables. Another problem of the bytecode basis is that all function calls are indirect, preventing the wasm executor from inlining functions. As a project, I'd like to see wasicaml progressing in two directions. First, make the current approach as good as possible - although basing it on the bytecode representation has its downsides, it is easy to understand and it is possible to figure out what the necessary ingredients for fast code are. Second, get an idea where a possible real wasm backend would fit into the OCaml compiler (maybe it is c=E2=80= =93 but maybe this doesn't give us much and you start better with lambda). Anyway, welcome to the new world of WebAssembly! Gerd PS. If you are interested in WebAssembly and like to work with me on another Wasm port for some time, there is a position: PPS. Wasicaml is a project of Figly, Inc., commonly known as RemixLabs, developing a reactive low-code and code collaboration platform. opam 2.1.0~rc2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David Allsopp announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The opam team has great pleasure in announcing opam 2.1.0~rc2! The focus since beta4 has been preparing for a world with more than one released version of opam (i.e. 2.0.x and 2.1.x). The release candidate extends CLI versioning further and, under the hood, includes a big change to the opam root format which allows new versions of opam to indicate that the root may still be read by older versions of the opam libraries. A plugin compiled against the 2.0.9 opam libraries will therefore be able to read information about an opam 2.1 root (plugins and tools compiled against 2.0.8 are unable to load opam 2.1.0 roots). Please do take this release candidate for a spin! It is available in the Docker images at ocaml/opam on [Docker Hub] as the opam-2.1 command (or you can `sudo ln -f /usr/bin/opam-2.1 /usr/bin/opam' in your `Dockerfile' to switch to it permanently). The release candidate can also be tested via our installation script (see the [wiki] for more information). Thank you to anyone who noticed the unannounced first release candidate and tried it out. Between tagging and what would have been announcing it, we discovered an issue with upgrading local switches from earlier alpha/beta releases, and so fixed that for this second release candidate. Assuming no showstoppers, we plan to release opam 2.1.0 next week. The improvements made in 2.1.0 will allow for a much faster release cycle, and we look forward to posting about the 2.2.0 plans soon! [Docker Hub] [wiki] Set up OCaml 2.0.0-beta2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release includes changes to address a corner case primarily related to multicore OCaml. Any OCaml bindings to Apache Arrow? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: UnixJunkie asked and Laurent Mazare announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Looks interesting: I've put together some simple [ocaml-arrow] library. It works reasonably well and is quite battle tested but definitely needs a bit of cleanup as the bits under src/ are deprecated in favor of the ones under c_api/. There is also a ppx to automatically convert ocaml records to/from arrow. Some examples using this can be seen in the [tests directory]. If there is some interest, I can certainly push up on cleaning this and make an actual opam package. [ocaml-arrow] [tests directory] Compiler engineer for OCaml and WebAssembly, Germany =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are developing a compiler for a no-code platform that translates our DSL to bytecode and/or WebAssembly. The language is largely of functional type but is also able to manage state with a spreadsheet model, allowing reactive programming without having to resort to libraries. The language is statically typed using a Hindley-Milner type checker. The compiler is primarily written in OCaml. Other languages of our platform are Go, C, Elm, and Javascript. We are looking for a compiler engineer with skills in code generation for WebAssembly: =E2=80=A2 Translation of an intermediate representation to WebAssembly =E2=80=A2 Writing runtimes and SDKs targeting WebAssembly =E2=80=A2 Code optimization See the full ad here: v3.0.0 release of reparse, reparse-lwt, reparse-lwt-unix =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Bikal Lem announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am happy to announce v3.0.0 of `reparse' - an OCaml library for constructing various types of parsers in OCaml. The release follows a complete overhaul of the internal working of the library to achieve the following goals: 1. Allow construction of efficient, zero-copy parsers. See [String parser for example]. The library provides a [Make functor] parametrised over a `Promise' and a `Input' type allowing you control over both parser memory allocation and copying. 2. Support usage of async libraries - lwt and async. Following the first point the library can now be used together with `lwt' and/or `async'. A lwt parse - for example - can now be used seamlessly with your other lwt code. The integration is seamless. 3. Provide `Make_buffered' functor to produce parsers where the input type natively doesn't allow random read, for example sockets, lwt streams and channels. There is now two new supporting packages `reparse-lwt' which provides parsing from `char Lwt_stream.t' input type and `reparse-lwt-unix' which provides parsing from `Lwt_unix.file_descr' and ~Lwt_unix.input_channel' respectively. 4. Provide `Make_unbuffered' functor to produce parsers where the input type natively supports random read, for example strings, bigstrings, bytes. 5. Introduce function `unsafe_any_char' to allow efficient (zero-copy?) parsing. 6. Prune dependencies by removing `base'. P.S. The documentation is bit behind in this release so please bear with me while work through the issues in the coming days. [Reparse repo] [String parser for example] [Make functor] [Reparse repo] Progress 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Craig Ferguson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the 0.2.0 release of [`Progress'], now available via Opam. `Progress' is an OCaml library for defining and using progress bars. It has the following features: =E2=80=A2 allows user-defined progress bar layouts; =E2=80=A2 supports rendering multiple progress bars simultaneously; =E2=80=A2 dynamically responds to changes in terminal size; =E2=80=A2 supports interleaving logging with progress bar rendering. This second release contains a much-improved DSL for specifying progress bars, alongside improvements and extensions to the rendering logic. The bars in the screenshot above are defined as follows: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let bar ~color ~total =3D =E2=94=82 let open Progress.Line in =E2=94=82 list =E2=94=82 [ spinner ~color:(Progress.Color.ansi ~green) () =E2=94=82 ; brackets (elapsed ()) =E2=94=82 ; bar ~color total =E2=94=82 ; bytes =E2=94=82 ; parens (const "eta: " ++ eta total) =E2=94=82 ] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It also comes with more complete [documentation] and many more [examples], including: =E2=80=A2 a Cargo-like progress bar w/ logging of intermediate results: =E2=80=A2 a Yarn-like stack of spinners: =E2=80=A2 a showcase of various progress bar styles: The changelog is [here] and the API documentation is [here]. The library is not yet feature-complete, but should still be reasonably useful :-) Happy hacking! [`Progress'] [documentation] [examples] [here] [here] http-multipart-formdata v2.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Bikal Lem announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am pleased to announce v2.0.0 release of `http-multpart-formdata'. This release departs from previous in-memory representation of http multipart forms to a streaming, memory efficient representation. The new streaming mechanism should help when processing larg file uploads in your OCaml web applications. 1. [httpaf sample web app] 2. [http-multipart-formdata repo] [httpaf sample web app] [http-multipart-formdata repo] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 22 to 29, 2021.

wasicaml - a code emitter for OCaml targeting WebAssembly

Gerd Stolpmann announced

I'd like to announce a new project to develop a code generator that emits WebAssembly:

https://github.com/remixlabs/wasicaml

With the support of RemixLabs I could already create a very first version that takes the OCaml bytecode as input and translates it to WebAssembly. While this approach probably doesn't lead to the fastest code, it is easy to accomplish, and it demonstrates the challenge (and already shows how to solve many of the part problems along the road).

To be precisely, the target of the translator is wasm32-unknown-wasi, i.e. the WASI ABI. This ABI is still in early development, but provides already the syscalls (or better, host calls) to access files, to get the current time, and to read the environment. This is almost enough to run a compiler - I only had to add system() so that ocamlc can start external preprocessors. Also, due to the fact that the current wasm implementations still lack exception handling, I had to assume the presence of a host emulation of exceptions (which is easy to provide if the host environment is Javascript, but not necessarily for other environments).

The translator takes the OCaml bytecode as input, i.e. you first create an excecutable

$ ocamlc -o myexec ...

and then make wasm out of it:

$ wasicaml -o myexec.wasm myexec

If you omit the .wasm suffix, wasicaml will put a preamble in front of the wasm code that starts the execution:

$ wasicaml -o myexec_wasm myexec
$ ./myexec_wasm

Because of this trick, many problems of cross-compiling can be avoided.

You may ask what the benefits of yet another "Web" language are. We already have two emitters targeting Javascript - isn't that enough? Well, two answers here.

First, WASI is a proper LLVM target. Because of this, you can link code from other languages with your executable (e.g. C or Rust). So you are not limited to OCaml but can use any language that also targets the WASI ABI. E.g. you can do

$ wasicaml -o myexec.wasm myexec -ccopt -lfoo

to also link in libfoo.a (which must also be compiled to wasm). So it is multi-lingual from the beginning.

Second, WebAssembly can be used outside the web, too. WASI targets more the command-line, and server plugins, and generally any OS-independent environments. For example, imagine you have an Electron app with a great UI, but for some special functionality you need to include some OCaml code, too. You don't want to give up the OS-independence, and WASI gives you now a natural option to add the OCaml code. And you still have access to the filesystem without hassle. - Another example is edge computing, i.e. when the cloud is extended by computers outside the data center, and the code should be in a form so that it can be run on as many platforms as possible. - All in all, WASI plays well when you need to combine OS-independence with a classic way of organizing the code as command or as server function, and you also need predictable performance.

The challenge of translating OCaml to wasm is mainly the garbage collector. Wasm doesn't permit many of the tricks ocamlopt is using to know in which memory (or register) locations OCaml values are stored. In wasm, there are no registers but the closest vehicle are local variables. Now, it is not possible to scan these variables from the GC function, making it practically impossible to put OCaml values there while a function is called that might trigger a GC. There is also no really cheap way of obtaining a stack descriptor.

Wasicaml inherits the stack from the bytecode interpreter and uses it as its own shadow stack for OCaml values. As wasicaml bases on the bytecode representation of the code, the bytecode instructions already ensure that values always live in this stack when the GC might run. Wasicaml additionally tries to identify values that don't need this special treatment (like ints and bools) and that are preferably stored in local variables, giving the wasm executor freedom to put these into registers or other high-speed locations. (Unfortunately, most of the type information is already erased in the bytecode, and this is definitely one of the deficiencies of the bytecode approach.)

In order to maximize the performance, it is probably best to avoid the stack whenever possible. The current approach of transforming the bytecode hasn't brought to an end yet with respect to such optimizations. For example, there could be more analyses that figure out when GC runs are actually possible and when it is safe to use local variables.

Another problem of the bytecode basis is that all function calls are indirect, preventing the wasm executor from inlining functions.

As a project, I'd like to see wasicaml progressing in two directions. First, make the current approach as good as possible - although basing it on the bytecode representation has its downsides, it is easy to understand and it is possible to figure out what the necessary ingredients for fast code are. Second, get an idea where a possible real wasm backend would fit into the OCaml compiler (maybe it is c– but maybe this doesn't give us much and you start better with lambda).

Anyway, welcome to the new world of WebAssembly!

Gerd

PS. If you are interested in WebAssembly and like to work with me on another Wasm port for some time, there is a position: https://www.mixtional.de/recruiting/2021-01/index.html

PPS. Wasicaml is a project of Figly, Inc., commonly known as RemixLabs, developing a reactive low-code and code collaboration platform. https://remixlabs.com/

opam 2.1.0~rc2

David Allsopp announced

The opam team has great pleasure in announcing opam 2.1.0~rc2!

The focus since beta4 has been preparing for a world with more than one released version of opam (i.e. 2.0.x and 2.1.x). The release candidate extends CLI versioning further and, under the hood, includes a big change to the opam root format which allows new versions of opam to indicate that the root may still be read by older versions of the opam libraries. A plugin compiled against the 2.0.9 opam libraries will therefore be able to read information about an opam 2.1 root (plugins and tools compiled against 2.0.8 are unable to load opam 2.1.0 roots).

Please do take this release candidate for a spin! It is available in the Docker images at ocaml/opam on Docker Hub as the opam-2.1 command (or you can sudo ln -f /usr/bin/opam-2.1 /usr/bin/opam in your Dockerfile to switch to it permanently). The release candidate can also be tested via our installation script (see the wiki for more information).

Thank you to anyone who noticed the unannounced first release candidate and tried it out. Between tagging and what would have been announcing it, we discovered an issue with upgrading local switches from earlier alpha/beta releases, and so fixed that for this second release candidate.

Assuming no showstoppers, we plan to release opam 2.1.0 next week. The improvements made in 2.1.0 will allow for a much faster release cycle, and we look forward to posting about the 2.2.0 plans soon!

Set up OCaml 2.0.0-beta2

Sora Morimoto announced

This release includes changes to address a corner case primarily related to multicore OCaml.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta2

Any OCaml bindings to Apache Arrow?

UnixJunkie asked and Laurent Mazare announced

Looks interesting:

https://arrow.apache.org/

https://arrow.apache.org/overview/

I've put together some simple ocaml-arrow library. It works reasonably well and is quite battle tested but definitely needs a bit of cleanup as the bits under src/ are deprecated in favor of the ones under c_api/. There is also a ppx to automatically convert ocaml records to/from arrow. Some examples using this can be seen in the tests directory.

If there is some interest, I can certainly push up on cleaning this and make an actual opam package.

Compiler engineer for OCaml and WebAssembly, Germany

Gerd Stolpmann announced

We are developing a compiler for a no-code platform that translates our DSL to bytecode and/or WebAssembly. The language is largely of functional type but is also able to manage state with a spreadsheet model, allowing reactive programming without having to resort to libraries. The language is statically typed using a Hindley-Milner type checker. The compiler is primarily written in OCaml. Other languages of our platform are Go, C, Elm, and Javascript.

We are looking for a compiler engineer with skills in code generation for WebAssembly:

  • Translation of an intermediate representation to WebAssembly
  • Writing runtimes and SDKs targeting WebAssembly
  • Code optimization

See the full ad here: https://www.mixtional.de/recruiting/2021-01/index.html

v3.0.0 release of reparse, reparse-lwt, reparse-lwt-unix

Bikal Lem announced

I am happy to announce v3.0.0 of reparse - an OCaml library for constructing various types of parsers in OCaml.

The release follows a complete overhaul of the internal working of the library to achieve the following goals:

  1. Allow construction of efficient, zero-copy parsers. See String parser for example. The library provides a Make functor parametrised over a Promise and a Input type allowing you control over both parser memory allocation and copying.
  2. Support usage of async libraries - lwt and async. Following the first point the library can now be used together with lwt and/or async. A lwt parse - for example - can now be used seamlessly with your other lwt code. The integration is seamless.
  3. Provide Make_buffered functor to produce parsers where the input type natively doesn't allow random read, for example sockets, lwt streams and channels. There is now two new supporting packages reparse-lwt which provides parsing from char Lwt_stream.t input type and reparse-lwt-unix which provides parsing from Lwt_unix.file_descr and ~Lwt_unix.input_channel' respectively.
  4. Provide Make_unbuffered functor to produce parsers where the input type natively supports random read, for example strings, bigstrings, bytes.
  5. Introduce function unsafe_any_char to allow efficient (zero-copy?) parsing.
  6. Prune dependencies by removing base.

P.S. The documentation is bit behind in this release so please bear with me while work through the issues in the coming days.

Reparse repo

Progress 0.2.0

Craig Ferguson announced

I'm pleased to announce the 0.2.0 release of Progress, now available via Opam.

727d878b6d17f3c48e6946f4df424bcc59938da3.png

Progress is an OCaml library for defining and using progress bars. It has the following features:

  • allows user-defined progress bar layouts;
  • supports rendering multiple progress bars simultaneously;
  • dynamically responds to changes in terminal size;
  • supports interleaving logging with progress bar rendering.

This second release contains a much-improved DSL for specifying progress bars, alongside improvements and extensions to the rendering logic. The bars in the screenshot above are defined as follows:

let bar ~color ~total =
  let open Progress.Line in
  list
    [ spinner ~color:(Progress.Color.ansi ~green) ()
    ; brackets (elapsed ())
    ; bar ~color total
    ; bytes
    ; parens (const "eta: " ++ eta total)
    ]

It also comes with more complete documentation and many more examples, including:

  • a Cargo-like progress bar w/ logging of intermediate results:

    4b148999f7b6029ac0155b049b6a7cf1fa8b40f1_2_1380x500.png

  • a Yarn-like stack of spinners:

    67ccf011a403a4c082829f69d5a609b4c0c23f6e.png

  • a showcase of various progress bar styles:

    d4df4a2df07fd161982243251fbee56d52a4afbf_2_1034x538.png

The changelog is here and the API documentation is here. The library is not yet feature-complete, but should still be reasonably useful :-) Happy hacking!

http-multipart-formdata v2.0.0

Bikal Lem announced

I am pleased to announce v2.0.0 release of http-multpart-formdata. This release departs from previous in-memory representation of http multipart forms to a streaming, memory efficient representation. The new streaming mechanism should help when processing larg file uploads in your OCaml web applications.

  1. httpaf sample web app
  2. http-multipart-formdata repo

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 67EAAE0035 for ; Tue, 6 Jul 2021 14:33:54 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/xfW=L6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3A1jgrVx1CqchMmF1NsmDOGwIyDhhOgF0UFjAc5pd?= =?us-ascii?q?vsb9SaKPrp82kYBaHo601xweXFcWDsrQY0ruQ6/ihEUU7or+5+EgYd5JNUxJXw?= =?us-ascii?q?e43pCcHRPC/NEvgMfTxZDY7FskRHHVs/nW8LFQHUJ2mPw6arXK99yMdFQviPgR?= =?us-ascii?q?pOOv1BpTSj8Oq3Oyu5pHfeQpFiCShbb9oMBm6sQrdutUXjIB/Lqo91gbFrmFHd?= =?us-ascii?q?uhLwW5kP06fkwr56syt4JNt7iNctu47+cVdS6v6ZaM4TbJZDDQiLW844dDguAf?= =?us-ascii?q?AQwWS+HYSS30anRVUDQfL6hH6RYrxvTDhtuVhwimaPNb5Qq4yVD+/8qpkUh7oi?= =?us-ascii?q?CMANz4k7GHaj9F7gaxHrB69oRF03onbbpyINPplZqPSY88VRXZCUMZUWCxPDIS?= =?us-ascii?q?8b44VAOoAO+ZTso3xqlUSoRe7AwSgBODhyjlWhn/3xq060v8uEQXY0wc9EdMOt?= =?us-ascii?q?27Uo8juNKwPVey4wrXEwTDFYvhL2zny9ZLIfwghr/+SQLx+f8nfxkYzGA7elFq?= =?us-ascii?q?ctZboMimJ2ugRsWWW6fdrW+K1i24grgF8uiSixsM2hYnPm4kb10zL9SV8wIY0O?= =?us-ascii?q?d24VFNwbNm+H5tUrS6aMZF6Qtg+TGFovSY6y6EGuYKgcSgSz5Qnwx7ea+CZfIe?= =?us-ascii?q?U4hLjUueRIS5lhH17Yr6/gAyy8Ue5x+D6S8K730pEoDBfndnQqnACyQbT6s6fR?= =?us-ascii?q?/dj8Uqs1zaC2h7O5+xLLk45lKjWJpEuzLMsipYeslrPEjH4lkj1kaObeUUp9+u?= =?us-ascii?q?s5urpbbvquJ+SOpJ3hw3gMqkjnNG0D+o/MggLRWeb+OK82aX7/ULnXLVKj+E2n?= =?us-ascii?q?bfBsJDdIMQbo7C2DxVT0ok99xazFzCm38gCknkCKFJJYhWHj5LmO13WL/D4DOu?= =?us-ascii?q?/g1C2nzhw3fzJIrrhApDVInjMkbfhYbZ961NHxwYp0d9f4JdUBqkbIPL0QUDxq?= =?us-ascii?q?cbYAgUlPAyzxObnEM1x1pkZWW2UH6+ZKrnesV6P5u43JemMa44VtCzjJPg4//L?= =?us-ascii?q?ugn45mUMdfam0xpQbcmq0EehhI0WceXbjnskOEX0QsQo7TezllF2CXiRPaHaxQ?= =?us-ascii?q?a08/Cs3B56hDYfGXoytm72B3Ci9HpJMYmBGEUqDEXH1eIWYW/cMcjydLdV8nTw?= =?us-ascii?q?fT7SuV4gh1RS2uADg0bpmIevU+jMCuZLkzth16PXflRAv+j10C8Sd13uBT2Zun?= =?us-ascii?q?mMHQTI9waNxoVRlx1uez6R1h+ZUGcFP6/5GSAs3O4LQw/Z0Bt39Qg7NY9mEREu?= =?us-ascii?q?8Ttm4ATw8Qcg9z8ISb0pnBtmvjAzP0iy3CLEPjbOLHoY78qfE0njxOcl9z3HG2?= =?us-ascii?q?bEkj1gpX8dDL3Wmhql79wnTG47GjVmWl6asdaQdxS7N6XmMwXCJvEFCXw58SaT?= =?us-ascii?q?FXXYBaUvKtdn1+13OQru0Bbg6LgdMxtSOJ6VWZtHzg1hLS+/vONHEbGKwn2ewC?= =?us-ascii?q?wyIxrSJbIfyZmsTwDjTBFQcngwI8neGOwgxCz+nrW/fFDFuDVXvY0fs8Olitny?= =?us-ascii?q?0Uk80zweLb014yrq65AQZhfuGS/Mcxr8LoiMhpC9yHFqnxNLZF9qApw9gfKVAf?= =?us-ascii?q?dMw+0xI1WXEtwx7IpOvMbtiikQbcwl4sELizRJ3Cp9PkcQytnMl0BJyKb6E0FN?= =?us-ascii?q?Gbz6XwYr/OrjTKmXr+BCvarXW2k3F3daN+qYP7ew4pE/5sAGoEEoi6XRn3MNP3?= =?us-ascii?q?3uS/JWZRDYVBNj1TUB9v0x+uLfyZjY7oYXZySsoeeO/rTmIk5p9D/Qj4hKhZMt?= =?us-ascii?q?EdqKIBQv2VcoACJ7qYOcjnlzsahMfIMhT8rQ1NoWobaiowqmuac9klTTutm9H5?= =?us-ascii?q?YFhzgrY/i51TKjT1JYAwu2E9hOAUybggVyhtMHuhI0CYisdSDnsgRP4DZJcM/U?= =?us-ascii?q?hNb0ADn2jdpPvrj2br4bqX29E+VWjAVIfxcLvfgCdPQWVNeJ430MKp3eqgm29k?= =?us-ascii?q?ywylCsm/PP3NM3mxvS7MgIAPn9XSWJii1b1PIXyiMoVDhHAUg=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AEitPMa4Rzs9RXJVXbgPXwM/XdLJyesId70hD?= =?us-ascii?q?6qkRc3xom6Oj+PxG8M5w6faWslcssRMb9+xoUZPoKRjhHPVOjbX5U43OYCDW/E?= =?us-ascii?q?OWaKti4YHhzzCIIVycysdtkYF6fexbAN30ZGIK6PoSDTPIceod/A=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0CAAgByTORgfSIeaIFahAVTRwFkVzoxh?= =?us-ascii?q?EiBX4cliFGBE4IUhW6GUod1hBCBEQNPEAEDAQ0qAQ4FAQIEAQGDHoQnAh4GAQU?= =?us-ascii?q?zEwIEFQEBBQEBAQIBAwMEARMBAQ8UCEOFaA2COAwMA4N3AwEYAQgKQAceIwMUA?= =?us-ascii?q?QYDAhEBFwEUChcBEhqCITeDBwUKinucCoEygQGDTAGETYFjDQIUgQAXhWxTOg4?= =?us-ascii?q?BgmgIg3ACJxCBVUSBFYIkSgduggNfAQEBAQGBIwQUAQEIgy8Xgk0Egh0vDjgIL?= =?us-ascii?q?B8LAgEGBxsMARMIDwEEEAwCNiMIDQEHAxkZBA0KFgYuCwsCLQORHA8li2+KK5Q?= =?us-ascii?q?yLAeDJIEsBguHFAU6gRWHN4MugVGHdoEXgkuBRooAlwMhlVeCGoZPCH0FCYIvh?= =?us-ascii?q?DiOZycEHBGEfoIUKoFqDAczGjBDgmkJYA6IIIYLFoNOEHGBY4F1O4Ijgyk/MgI?= =?us-ascii?q?BATQCBgEJAQEDCXUBAQUTCwGIJV4BAQ?= X-IPAS-Result: =?us-ascii?q?A0CAAgByTORgfSIeaIFahAVTRwFkVzoxhEiBX4cliFGBE4I?= =?us-ascii?q?UhW6GUod1hBCBEQNPEAEDAQ0qAQ4FAQIEAQGDHoQnAh4GAQUzEwIEFQEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQ8UCEOFaA2COAwMA4N3AwEYAQgKQAceIwMUAQYDAhEBFwEUChc?= =?us-ascii?q?BEhqCITeDBwUKinucCoEygQGDTAGETYFjDQIUgQAXhWxTOg4BgmgIg3ACJxCBV?= =?us-ascii?q?USBFYIkSgduggNfAQEBAQGBIwQUAQEIgy8Xgk0Egh0vDjgILB8LAgEGBxsMARM?= =?us-ascii?q?IDwEEEAwCNiMIDQEHAxkZBA0KFgYuCwsCLQORHA8li2+KK5QyLAeDJIEsBguHF?= =?us-ascii?q?AU6gRWHN4MugVGHdoEXgkuBRooAlwMhlVeCGoZPCH0FCYIvhDiOZycEHBGEfoI?= =?us-ascii?q?UKoFqDAczGjBDgmkJYA6IIIYLFoNOEHGBY4F1O4Ijgyk/MgIBATQCBgEJAQEDC?= =?us-ascii?q?XUBAQUTCwGIJV4BAQ?= X-IronPort-AV: E=Sophos;i="5.83,328,1616454000"; d="scan'208,217";a="387260667" X-MGA-submission: =?us-ascii?q?MDGyf/dGTL4rwcxW5+OFEfnD1qbab46DFQ7Gde?= =?us-ascii?q?Ej7YQQZkbJDYwkqzDR7IKf7045YGv3Lc3Y2CRKg3nUFLs1HimJf7XNZi?= =?us-ascii?q?bwLZD7hT+7KHusA7e8vwaQfyU6R+XHPo6z5gyr6e9fNvSeASmiZz6r/Q?= =?us-ascii?q?2azNf0D1XPrkMDJnl4bhNVnA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 06 Jul 2021 14:33:50 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D652556482D; Tue, 6 Jul 2021 14:33:48 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 06 Jul 2021 14:33:43 +0200 Message-ID: <878s2j8vvc.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 6 14:33:49 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.003375, queueID=3BBA956482E X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 29 to July 06, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 LibreRef - LablGtk-based Digital Reference Tool Application u2f - universal second factor Reproducible OPAM packages / MirageOS Dune 2.9.0 Hardcaml MIPS CPU Learning Project and Blog dune-release 1.5.0 anders 0.7.1 Old CWN LibreRef - LablGtk-based Digital Reference Tool Application =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I'm not sure if this is that close to the typical uses of OCaml, but posting this here just in case anyone was interested in another end-user facing application using LablGtk. LibreRef is a free as in freedom digital referencing tool for artists. It's written in OCaml using LablGtk and Cairo to implement the GUI. You can find the source code at: [gitlab] ([github mirror]) A picture is worth a thousand words, so before I continue, here are a few examples of it in action: Overall, getting LablGtk to work was fairly straightforward, although the documentation was a bit lacking (although the same might be said of Gtk itself). I was able to piece together the correct uses of most of the API calls by relying on either the examples from the repository or by translating snippets of code from online back into LablGtk. As for deploying it as an application, I found the AppImage & LinuxDeploy toolchain to work well with the resulting binary (admittedly I've only tested it with two devices so far), and it meant that I could publish the program without having to ask people to setup the full OCaml & Opam toolchain, which would probably be a large ask. As for the implementation, I think it was fairly elegant (if I say so myself :slight_smile:), although I may have gone overboard with functors (see this higher-order functor in the GUI interface: ) and some aspects of the separation of concerns weren't so well established. [gitlab] [github mirror] u2f - universal second factor =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 it is our pleasure to announce the just released opam package u2f, which is a server side implementation of the FIDO standard for two-factor authentication using a special device (yubikey etc.). The device does challenge-response authentication with the server using public key cryptography. The implementation is stateless and does not use a specific IO library, but only achieves the logic for constructing a registration request, verifying a response thereof, and authorization requests with responses thereof. Please have a look at if you're interested. It is licensed under the permissive 2-clause BSD license. We use this library in an example server (in the `bin' directory) that uses dream. The live server is online at =E2=80=93 please let us know if you run into any trouble, or open an issu= e on the GitHub repository. One question though: we're unable to generate the documentation from the mli =E2=80=93 already asked on discord with no result. Anyone with a better understanding of odoc etc. can take a look why `dune build @doc' outputs a nearly empty file? Thanks a lot :) The development was sponsored by skolem.tech. Reproducible OPAM packages / MirageOS =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 we are pleased to announce reproducible binary images for MirageOS unikernels (see the blog post at ). The binaries are located at (all components are open source and linked from the page). Additionally, the required tools to achieve reproducible builds are released as binary packages for various operating systems as well on the same site. They are used by the infrastructure to run daily builds (always with the HEAD of opam-repository to not loose any updates / new releases). The custom overlay is used that adds some development packages. Happy to hear your thoughts and feedback here. (Earlier post ) This work was funded by the [NGI Pointer] project "Funding The Next Generation Ecosystem of Internet Architects". [NGI Pointer] Dune 2.9.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Emilio Jes=C3=BAs Gallego Arias announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 Dear all, on behalf of the Dune team I'm pleased to announce the release of Dune 2.9.0. This is the last release on the Dune 2.x series and could be considered a maintenance release as it mostly consists on bug fixes and miscellaneous tweaks and features for sites, instrumentation, and mdx support. Please find the full list of changes below: =E2=80=A2 Add `(enabled_if ...)' to `(mdx ...)' (, @emillon) =E2=80=A2 Add support for instrumentation dependencies (, fixes , @nojb) =E2=80=A2 Add the possibility to use `locks' with the cram tests stanza (, @voodoos) =E2=80=A2 Allow to set up merlin in a variant of the default context (, @TheLortex, @voodoos) =E2=80=A2 Add `(package ...)' to `(mdx ...)' (, fixes , @emillon) =E2=80=A2 Handle renaming of `coq.kernel' library to `coq-core.kernel' in= Coq 8.14 (, @proux01) =E2=80=A2 Fix generation of merlin configuration when using `(include_sub= dirs unqualified)' on Windows (, @nojb) =E2=80=A2 Fix bug for the install of Coq native files when using `(include_subdirs qualified)' (, @ejgallego) =E2=80=A2 Allow users to specify install target directories for `doc' and `etc' sections. We add new options `--docdir' and `--etcdir' to both Dune's configure and `dune install' command. (, fixes , @ejgallego, thanks to @JasonGross for reporting this issue) =E2=80=A2 Fix issue where Dune would ignore `(env ... (coq (flags ...)))' declarations appearing in `dune' files (, fixes , @ejgallego @rgrinberg) =E2=80=A2 Disable some warnings on Coq 8.14 and `(lang coq (>=3D 0.3))' d= ue to the rework of the Coq "native" compilation system (, @ejgallego) =E2=80=A2 Fix a bug where instrumentation flags would be added even if the instrumentatation was disabled (@nojb, ) =E2=80=A2 Fix : option `-p' ta= kes now precedence on environement variable `DUNE_PROFILE' (, , @bobot, reported by @dra27 ) =E2=80=A2 Fix installation with opam of package with dune sites. The `.install' file is now produced by a local `dune install' during the build phase (, , @bobot, reported by @kit-ty-kate ) =E2=80=A2 Fix multiple issues in the sites feature (, @bobot, reported by @Lelio-Brun , by @Kakadu , by @toots ) Hardcaml MIPS CPU Learning Project and Blog =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: "Alexander (Sasha) Skvortsov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Tl;dr: I=E2=80=99m [writing a blog] about making a MIPS CPU in Hardcaml. Hi! My name is Sasha, and I=E2=80=99m a student at Penn State majoring in= CS and Math. Last semester, I took a computer engineering class where we built a pipelined MIPS CPU in Verilog as a semester-long project. I enjoyed the class, but a lot of frustration came from Verilog itself. A few months ago, I came across the [Signals and Threads Programmable Hardware episode]. I really liked the idea of [Hardcaml]: a library to write and test hardware designs in OCaml. Representing circuits as functions felt like a good abstraction, and I=E2=80=99ve been wanting to = learn OCaml for a while. So this summer, a friend and I are rewriting the Verilog MIPS CPU we made last semester into Hardcaml. We=E2=80=99re still working on the pro= ject, but have made some good progress and wanted to share it in case anyone finds it interesting / useful. If anyone wants to take a look, it=E2=80= =99s [up on GitHub]. We=E2=80=99ve written some blog posts about our project: 1. [Some more background on what we=E2=80=99re doing and why] 2. [An ELI5 overview of how hardware, and pipelined CPUs in particular, work] 3. [Another high-level overview of Verilog, hardware design, FPGAs, and why I think OCaml might be a great fit for hardware design] 4. [How to set up a Hardcaml project, including testing and Verilog generation] 5. [How to split Hardcaml circuits into multiple modules] There=E2=80=99s also a few more that we=E2=80=99ve written code for, but = are still drafting blog posts about: =E2=80=A2 How to work with memory in Hardcaml =E2=80=A2 How to design stateful, sequential circuits in Hardcaml =E2=80=A2 A safer design pattern for Hardcaml circuits I=E2=80=99m new to both OCaml and blogging, and this has definitely been = a fun experience so far! Would love to hear any feedback / comments. [writing a blog] [Signals and Threads Programmable Hardware episode] [Hardcaml] [up on GitHub] [Some more background on what we=E2=80=99re doing and why] [An ELI5 overview of how hardware, and pipelined CPUs in particular, work] [Another high-level overview of Verilog, hardware design, FPGAs, and why I think OCaml might be a great fit for hardware design] [How to set up a Hardcaml project, including testing and Verilog generation] [How to split Hardcaml circuits into multiple modules] dune-release 1.5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune-release team I'm pleased to announce that we're releasing dune-release.1.5.0. It has been quite a while since the last release so there are numerous changes and improvements in this one, along with a lot of bug fixes. The two main new features in 1.5.0 are: =E2=80=A2 A draft release mode that creates a draft Github release and a = draft PR to opam-repository. It comes with an `undraft' command that will undraft both and update the opam file's `url.src' field accordingly. We believe this feature will prove helpful to maintainers of tools such as `dune' which releases are often watched by distribution maintainers. Draft releases allow you to wait until you have opam-repository's CI approval to actually create a GH release that will notify anyone watching the repository. This feature is still a bit experimental, we have ideas on how to improve it but we wanted to get a first version out to collect feedback on how it is used and what you folks expect from it. =E2=80=A2 A `check' command that you can run ahead of a release to know if dune-release has all the information it needs in the repository, along with running the lint, build and test checks it normally runs after building the tarball. We're aware that it can be frustrating to see dune-release fail right in the middle of the release process. We're trying to improve this situation and this is a first step in that direction. You can see the full changelog [here] You'll note we also deprecated a few features such as delegates (as we announced in [this post]), opam 1.x and the `--user' option and corresponding config file field. This release is likely to be the last 1.x release of `dune-release' except for important bug fixes as we'll start working on 2.0 soon. Our main goals for 2.0 are to make the experience for github users as seemless as possible. We want the tool to do the right thing for those users without them having to configure anything. Delegates got in the way there and that's why we're removing them. We do care about our non github users and we've worked on making it as configurable as possible so that you can integrate it in your release workflow. The situation should already have improved quite a bit with this release as we fixed several bugs for non github hosted repositories. We want to make sure that these users will be happy with dune-release 2.0 as well. Hopefully in the future dune-release will support other release workflows such as handling gitlab hosted repositories but we want to make sure our main user base is happy with the tool before adding this. We'll communicate a bit more on our plans for 2.0 in the next few months. Our hope is that it will hit opam before the end of this year. We hope that you'll like this new version and wish you all successful and happy releases! [here] [this post] anders 0.7.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Namdak Tonpa announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The HTS language proposed by Voevodsky exposes two different presheaf models of type theory: the inner one is homotopy type system presheaf that models HoTT and the outer one is traditional Martin-L=C3=B6f type system presheaf that models set theory with UIP. The motivation behind this doubling is to have an ability to express semisemplicial types. Theoretical work on merging meta-theoretical and homotopical languages was continued in [2LTT] [Anenkov, Capriotti, Kraus, Sattler]. While we are on our road to HTS with Lean-like tactic language, currently we are at the stage of regular cubical (HoTT) type checker with CHM-style primitives, or more general CCHM type checker. You may try it at Github: [groupoid/anders]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install anders =E2=94=82 $ anders =E2=94=82 Anders theorem prover [PTS][MLTT][CCHM-4][HTS]. =E2=94=82=20 =E2=94=82 invoke =3D anders | anders list =E2=94=82 list =3D [] | command list =E2=94=82 command =3D check filename | lex filename =E2=94=82 | parse filename | help =E2=94=82 | cubicaltt filename | girard =E2=94=82 | trace =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Anders is idiomatic and educational. We carefully draw the favourite Lean-compatible syntax to fit 130 LOC in Menhir, the MLTT core (based on Mini-TT) is 500 LOC and pretypes presheaf is another 500 LOC. [2LTT] [groupoid/anders] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of June 29 to July 06, 2= 021.

LibreRef - LablGtk-based Digital Reference Tool Application

Kiran Gopinathan announced

I'm not sure if this is that close to the typical uses of OCaml, but postin= g this here just in case anyone was interested in another end-user facing application using LablGtk.

3D"b=

LibreRef is a free as in freedom digital referencing tool for artists.

It's written in OCaml using LablGtk and Cairo to implement the GUI.

You can find the source code at: gitlab (= github mirror)

A picture is worth a thousand words, so before I continue, here are a few e= xamples of it in action:

3D"126997c61b83=

3D"49b11ef943e4=

Overall, getting LablGtk to work was fairly straightforward, although the d= ocumentation was a bit lacking (although the same might be said of Gtk itself).

I was able to piece together the correct uses of most of the API calls by r= elying on either the examples from the repository or by translating snippets of code from online= back into LablGtk.

As for deploying it as an application, I found the AppImage & LinuxDepl= oy toolchain to work well with the resulting binary (admittedly I've only tested it with two devices so fa= r), and it meant that I could publish the program without having to ask people to setup the full OC= aml & Opam toolchain, which would probably be a large ask.

As for the implementation, I think it was fairly elegant (if I say so mysel= f :slight_smile:), although I may have gone overboard with functors (see this higher-order functor in t= he GUI interface: https://gitlab.com/gopiandcode/libre-ref/-/blob/master/gui.mli#L175) and some aspects of the separation of concerns weren't so well established.

u2f - universal second factor

Hannes Mehnert announced

it is our pleasure to announce the just released opam package u2f, which is= a server side implementation of the FIDO standard for two-factor authentication using a s= pecial device (yubikey etc.). The device does challenge-response authentication with the server us= ing public key cryptography.

The implementation is stateless and does not use a specific IO library, but= only achieves the logic for constructing a registration request, verifying a response thereof, and auth= orization requests with responses thereof. Please have a look at https://github.com/roburio/u2f if you're interested. It is licensed under the permissive 2-clause BSD license.

We use this library in an example server (in the bin directory= ) that uses dream. The live server is online at https://u2f-demo.robur.co= op – please let us know if you run into any trouble, or open an issue on the GitHub repository.

One question though: we're unable to generate the documentation from the ml= i – already asked on discord with no result. Anyone with a better understanding of odoc etc. can= take a look why dune build @doc outputs a nearly empty file? = Thanks a lot :)

The development was sponsored by skolem.tech.

Reproducible OPAM packages / MirageOS

Hannes Mehnert announced

we are pleased to announce reproducible binary images for MirageOS unikerne= ls (see the blog post at https://hannes.robur.coo= p/Posts/Deploy). The binaries are located at https://builds.robur.coop (all components are open source and linked from the page).

Additionally, the required tools to achieve reproducible builds are release= d as binary packages for various operating systems as well on the same site. They are used by the in= frastructure to run daily builds (always with the HEAD of opam-repository to not loose any updates / = new releases). The custom overlay https://git.r= obur.io/robur/unikernel-repo is used that adds some development package= s.

Happy to hear your thoughts and feedback here. (Earlier post https://discuss.ocaml.org/t/reproducible-builds-with-oca= ml-opam-and-mirageos/4877)

This work was funded by the NGI Pointer<= /a> project "Funding The Next Generation Ecosystem of Internet Architects".

Dune 2.9.0

Emilio Jes=C3=BAs Gallego Arias announced

Dear all, on behalf of the Dune team I'm pleased to announce the release of= Dune 2.9.0. This is the last release on the Dune 2.x series and could be considered a maintenance r= elease as it mostly consists on bug fixes and miscellaneous tweaks and features for sites, instrumentation, and mdx support.

Please find the full list of changes below:

Hardcaml MIPS CPU Learning Project and Blog

"Alexander (Sasha) Skvortsov announced

Tl;dr: I=E2=80=99m writing a blog about making a MIPS CPU in Hardcaml.

Hi! My name is Sasha, and I=E2=80=99m a student at Penn State majoring in C= S and Math. Last semester, I took a computer engineering class where we built a pipelined MIPS CPU in Verilog a= s a semester-long project. I enjoyed the class, but a lot of frustration came from Verilog itself.

A few months ago, I came across the Signals and Threads Programmable Hardware episode. I really liked the idea of Hardcaml: a library = to write and test hardware designs in OCaml. Representing circuits as functions felt like a good abstraction, and= I=E2=80=99ve been wanting to learn OCaml for a while.

So this summer, a friend and I are rewriting the Verilog MIPS CPU we made l= ast semester into Hardcaml. We=E2=80=99re still working on the project, but have made some good progres= s and wanted to share it in case anyone finds it interesting / useful. If anyone wants to take a look, it=E2= =80=99s up on GitHub.

We=E2=80=99ve written some blog posts about our project:

  1. Some more background on what we=E2=80=99re doing and why
  2. An ELI5 overview of how hardware, and pipelined CPUs in parti= cular, work
  3. Another high-level overview of Verilog, hardware design, FPGAs, and wh= y I think OCaml might be a great fit for hardware design
  4. How to set up a Hardcaml project, including testing a= nd Verilog generation
  5. How to split Hardcaml circuits into multiple modules

There=E2=80=99s also a few more that we=E2=80=99ve written code for, but ar= e still drafting blog posts about:

  • How to work with memory in Hardcaml
  • How to design stateful, sequential circuits in Hardcaml
  • A safer design pattern for Hardcaml circuits

I=E2=80=99m new to both OCaml and blogging, and this has definitely been a = fun experience so far! Would love to hear any feedback / comments.

dune-release 1.5.0

Nathan Rebours announced

On behalf of the dune-release team I'm pleased to announce that we're relea= sing dune-release.1.5.0.

It has been quite a while since the last release so there are numerous chan= ges and improvements in this one, along with a lot of bug fixes.

The two main new features in 1.5.0 are:

  • A draft release mode that creates a draft Github release and a draft PR= to opam-repository. It comes with an undraft command that wil= l undraft both and update the opam file's url.src field accord= ingly. We believe this feature will prove helpful to maintainers of tools s= uch as dune which releases are often watched by distribution m= aintainers. Draft releases allow you to wait until you have opam-repository= 's CI approval to actually create a GH release that will notify anyone watc= hing the repository. This feature is still a bit experimental, we have idea= s on how to improve it but we wanted to get a first version out to collect = feedback on how it is used and what you folks expect from it.
  • A check command that you can run ahead of a release to kno= w if dune-release has all the information it needs in the repository, along= with running the lint, build and test checks it normally runs after buildi= ng the tarball. We're aware that it can be frustrating to see dune-release = fail right in the middle of the release process. We're trying to improve th= is situation and this is a first step in that direction.

You can see the full changelog here

You'll note we also deprecated a few features such as delegates (as we anno= unced in this post), opam 1.x and the --user option and corresponding config file field. This release is likely to be the last 1.x release of dune-release except for important bug fixes as we'll start working on 2.0 soon.

Our main goals for 2.0 are to make the experience for github users as seeml= ess as possible. We want the tool to do the right thing for those users without them having to configure= anything. Delegates got in the way there and that's why we're removing them. We do care about our non github users and we've worked on making it as conf= igurable as possible so that you can integrate it in your release workflow. The situation should already= have improved quite a bit with this release as we fixed several bugs for non github hosted repositori= es. We want to make sure that these users will be happy with dune-release 2.0 as well. Hopefully in the future dune-release will support other release workflows s= uch as handling gitlab hosted repositories but we want to make sure our main user base is happy wi= th the tool before adding this.

We'll communicate a bit more on our plans for 2.0 in the next few months. O= ur hope is that it will hit opam before the end of this year.

We hope that you'll like this new version and wish you all successful and h= appy releases!

anders 0.7.1

Namdak Tonpa announced

The HTS language proposed by Voevodsky exposes two different presheaf model= s of type theory: the inner one is homotopy type system presheaf that models HoTT and the outer one is = traditional Martin-L=C3=B6f type system presheaf that models set theory with UIP. The motivation behind this= doubling is to have an ability to express semisemplicial types. Theoretical work on merging meta-t= heoretical and homotopical languages was continued in 2LTT [Anenkov, Capriotti, Kraus, Sattler].

While we are on our road to HTS with Lean-like tactic language, currently w= e are at the stage of regular cubical (HoTT) type checker with CHM-style primitives, or more gene= ral CCHM type checker. You may try it at Github: groupo= id/anders.

$ opam install anders
$ anders
Anders theorem prover [PTS][MLTT][CCHM-4][HTS].

   invoke =3D anders | anders list
     list =3D [] | command list
  command =3D check filename     | lex filename
          | parse filename     | help
          | cubicaltt filename | girard
          | trace

Anders is idiomatic and educational. We carefully draw the favourite Lean-c= ompatible syntax to fit 130 LOC in Menhir, the MLTT core (based on Mini-TT) is 500 LOC and pretypes pre= sheaf is another 500 LOC.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E0A6BE0011 for ; Tue, 20 Jul 2021 14:58:51 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=6stZ=MM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3Az0PO1xWeeEtQu07f+7pO67QoIZfV8KxyUzF92vM?= =?us-ascii?q?cY1JmTK2v8tzYMVDF4r011RmVB92dsKgP1ree8/i5HzBZsNDZ6DFKWacPfidNs?= =?us-ascii?q?d8RkQ0kDZzNImzAB9muURYHGt9fXkRu5XCxPBsdMs//Y1rPvi/6tmZKSV3wOgV?= =?us-ascii?q?vO+v6BJPZgdip2OCu4Z3TZBhDiCagbb9oIxi6sxndutMYjId8Jao8yhvEqWZMd?= =?us-ascii?q?+hK2G9kP12ekwv468uq4JJv7yFcsO89+sBdVqn3Y742RqFCAjQ8NGA16szrtR3?= =?us-ascii?q?dQgaK+3ARTGYYnAdWDgbc9B31UYv/vSX8tupmxSmVJtb2QqwuWTSj9KhkVhnlg?= =?us-ascii?q?zoaOjEj8WHXjstwjL9HoB+kuhdyzZLYbJ2TOfFjeazTYM4aRXFZXslPSyNBHo2?= =?us-ascii?q?yb4wKD+UbPOZYqZT2q18BoBa6AAWhAuPjxDxOhn/o3K06yOUhHhrC3AM+AtkPv?= =?us-ascii?q?nPUrM/oO6cJTOu5yKfFwSnGY/5QxDzz6pXHcgo5rP+MQ7x+bMTfx0ogGAzZlVi?= =?us-ascii?q?fs5DpMimP2+gRr2SW7extXv+vhW49rAFxpyCiy9soiobTgIIe103K+jl5wIYwJ?= =?us-ascii?q?N24VFJ7asOjHZRKsyGVLY12Ttk5Q250uCY6z7wGuYKnfCUR0JQnwBrfavybc4e?= =?us-ascii?q?W/h3jVOCRITZhhHJ4Zr2znRGy8VKvyuDlUMS/zVlFoDZfnNbWqnANywLc6tKBS?= =?us-ascii?q?vZl8Eqv1iuD2gPN5u1YIU05lqrVJ4Ihz7Mul5cdvlrPECDrlEjojqKbaFso9Oa?= =?us-ascii?q?o5uroZrjrpJ6ROpF0hAzgMqkgmsqyCvk2PAgJWmiU4+W81Lv78E3hXrpKkvw2k?= =?us-ascii?q?rXHv5DCIsQbo6u5DBFP3oYl9Rm/Ey+q0NMEknYdKVJFfAiLj4/zO1HBOPz4Ava?= =?us-ascii?q?/g0iskDd23P/KJLzhApLVInjMkbfhYbZ961NHxwYp0d9f4JdUBqkdIPL0X0/xs?= =?us-ascii?q?MbUDh4+MwCsxOboFM9y1oYaWW6VGKOZN7nSsVCQ6uI0JOmMeZcVtyzgK/gh+/7?= =?us-ascii?q?il2U2mUcFfaWx3JsXbmq4HvV8LEmDb3rsmM8NEWAWsQUkSezqjFmCXiRIaHapR?= =?us-ascii?q?a485zY7BJq7AofeQICinqaN0zymHp1XYmBJF0iAEXfmd4WcRvcMZzieIsh7kjw?= =?us-ascii?q?LTbShRIgh1RahtA/+1bVrNPbb+iodtZ771dh6+u3SlRU29TBuCMSdyW6NQ3lsn?= =?us-ascii?q?mMSRj822rx/rlJnyluZzah4hORUFdhN6PNPSQc1K4Xcw/Z7C9D0XA/KY9SHSE6?= =?us-ascii?q?+T9m7Hz08Ssg9z8ISb0tyAdmvgAzP0zCkDrIaj7CHGZI5/r/G03TvJ8twxGzK2?= =?us-ascii?q?LQ9g1U8X8dCN3Gqi6hi/AbJHYHJiV+Wl6OyeKQcwiHN8GCDwHKLvEBXTQJ8S73?= =?us-ascii?q?FXXcbZkrWsdT2+F/NT7+oCbQmKwtB1NCNJrFNat3zglVKXPbjONLAbGKtg2q8G?= =?us-ascii?q?AiEy7eWYIb3Z2kQ0z/RBUYYnwwJ83uLOhAyBiK7rGLfCDxuG0jvY0Tp8eRmtX2?= =?us-ascii?q?1UlI6wx2SYkBgzLq15h0aiOSbRf0Uxr8EoCAhqzF0HVahwd3ZF9qApwxgfKVFf?= =?us-ascii?q?NMy/k1L1WXDtwxyJpGvNaRiiUQYcwhtpEPhyxV3CoBBkcg2sHMn1xF9KaWF0FN?= =?us-ascii?q?HazyXw4vwNqfSKmT98xGjcanW2kvR0NqO4KcA9Ow4q0n/vAGuDkct729o09xR0?= =?us-ascii?q?3eF4pXKDRESUY7qX0Ys9xl6oqnabTMn64PV031sK6i0vSXY19InHut2giqnKp1?= =?us-ascii?q?bL6XOXFv2DMsyA9eobuonhw7tJlgPI+YYvOZgNNygX/+Hw7KweudsjTaiy2Nd7?= =?us-ascii?q?9Y5mkmF8i45Tu/Tw74ExeuZ102JTWTSllCk5+nzkIYMXjoSG2uj1WCwDYpYYOt?= =?us-ascii?q?pdoYOCHuyC9WwwsRiipXtXX9B6VPlAEkJjpz6MSGOZkDwiFUDnX8cpmaqzHTpp?= =?us-ascii?q?9Sbuzsus6yU0TeIxrjyMh0dNTwSLIGDpVL8eM6siNQLQEWjbw4ojQaoo0HgyPo?= =?us-ascii?q?CzEyaB3HURVZUciP2KWB7T6b2saCNMZcn1Q=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Aq79ODKgWLGGao6oBOWADJrtDYHBQXjQji2hC?= =?us-ascii?q?6mlwRA09TyW9rbHMoB1773/JYVMqM03I9ursBEDtex/hHP1OgLX5X43NYOCOgg?= =?us-ascii?q?LBRr2KhrGSugEIdReQysdtkZ1JN4RuCNm1J158isrx/U2ZKr8bsbu62ZHtv8+b?= =?us-ascii?q?42ZsSUVPY6FkqyhjDALzKDwSeCB2QaAQULaM5s4CnTCpfnMaY62AdwI4dtmGnf?= =?us-ascii?q?WOuIPnZVo4CwU86A+I5AnYkIISCyLouiv2SQk/povK71K19TDE2g=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AgAwA/x/ZgfSIeaIFaFoNvWUEBZFcWJ?= =?us-ascii?q?DGESIFfhyWIXIETghWFcoZVh3aEEIERA08QAQMBDSoBAwEPAQIEAQGBY4E/gTU?= =?us-ascii?q?CF4JdAh4GAQUzEwIEFQEBBQEBAQIBAwMEARMBAQ8ZCEiFaA2COAwMAwODdwEYA?= =?us-ascii?q?QgKZSMDFAEGAwIEDQEXARQKAwETARIUBoIMTIMHBQqLdZwKgTKBAYNNAQMDEA+?= =?us-ascii?q?ENIFjDQIUgReFbVNIAYJpg3gCJxCBVUSBFYIkSgdugU8BexcBAQEBAReBEQERA?= =?us-ascii?q?gEGCwkPLYJhgmQEghsTHA46BAEBWQkHEQQPAQcCCggOAQEiNg4qAQoZGQQJBAE?= =?us-ascii?q?JFRYfCwcEAi2RGxsDJYt+ijKCTpB+aiwHgyeBMAYLh1+BFYc3hQGHd4NjgUeKF?= =?us-ascii?q?4Y+iiyGMyGVZ4IchlEIgQIJBoIsiACLUQQECySEeYFIKl0wPwEdAwkHMxowQw0?= =?us-ascii?q?DglkJYA6NfYI6KlFegT6BJoEkGDkyCYVMPzIBAQEBATMCBgEKAQEDCXUBAQUTC?= =?us-ascii?q?wGIPYFqVQYBAQ?= X-IPAS-Result: =?us-ascii?q?A0AgAwA/x/ZgfSIeaIFaFoNvWUEBZFcWJDGESIFfhyWIXIE?= =?us-ascii?q?TghWFcoZVh3aEEIERA08QAQMBDSoBAwEPAQIEAQGBY4E/gTUCF4JdAh4GAQUzE?= =?us-ascii?q?wIEFQEBBQEBAQIBAwMEARMBAQ8ZCEiFaA2COAwMAwODdwEYAQgKZSMDFAEGAwI?= =?us-ascii?q?EDQEXARQKAwETARIUBoIMTIMHBQqLdZwKgTKBAYNNAQMDEA+ENIFjDQIUgReFb?= =?us-ascii?q?VNIAYJpg3gCJxCBVUSBFYIkSgdugU8BexcBAQEBAReBEQERAgEGCwkPLYJhgmQ?= =?us-ascii?q?EghsTHA46BAEBWQkHEQQPAQcCCggOAQEiNg4qAQoZGQQJBAEJFRYfCwcEAi2RG?= =?us-ascii?q?xsDJYt+ijKCTpB+aiwHgyeBMAYLh1+BFYc3hQGHd4NjgUeKF4Y+iiyGMyGVZ4I?= =?us-ascii?q?chlEIgQIJBoIsiACLUQQECySEeYFIKl0wPwEdAwkHMxowQw0DglkJYA6NfYI6K?= =?us-ascii?q?lFegT6BJoEkGDkyCYVMPzIBAQEBATMCBgEKAQEDCXUBAQUTCwGIPYFqVQYBAQ?= X-IronPort-AV: E=Sophos;i="5.84,254,1620684000"; d="scan'208,217";a="520731700" X-MGA-submission: =?us-ascii?q?MDGjLXXa3KlN9OOYXLZByVSgDyN2jN3UElJdEb?= =?us-ascii?q?FIRQXRkm6RZSKvAxrWlFHpzPGe6wgqb6Ujs7uWseFevFOHwzRQYHKU+Z?= =?us-ascii?q?vGlXNnYLDU+V7CV2AAJanYIerl4tFYxISg2tJ5NtfirhOuF4j94d/mC5?= =?us-ascii?q?hwSnWRPSY5lujiZbo/UWsoMg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 20 Jul 2021 14:58:48 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9BDC1561285; Tue, 20 Jul 2021 14:58:47 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 20 Jul 2021 14:58:28 +0200 Message-ID: <87bl6xw39n.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 20 14:58:48 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000000, queueID=EF172561294 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxMyB0byAyMCwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KV3JpdGluZyBh IFJFU1QgQVBJIHdpdGggRHJlYW0NCk9UT01MIDAuOS4wIOKAlCBhIGNvbXBsaWFudCBhbmQgZmxl eGlibGUgVE9NTCBwYXJzaW5nLCBtYW5pcHVsYXRpb24sIGFuZCBwcmV0dHktcHJpbnRpbmcgbGli cmFyeQ0Kc291cGF1bHQ6IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwg cmV3cml0aW5nDQpPQ2FtbCA0LjEzLjAsIHNlY29uZCBhbHBoYSByZWxlYXNlDQpPQ2FtbEZvcm1h dCAwLjE5LjANCk9DYW1sIENhZsOpOiBXZWQsIEF1ZyA0IEAgN3BtIChVLlMuIENlbnRyYWwpDQpP bGQgQ1dODQoNCg0KV3JpdGluZyBhIFJFU1QgQVBJIHdpdGggRHJlYW0NCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvd3JpdGluZy1hLXJlc3QtYXBpLXdpdGgtZHJlYW0vODE1MC8xPg0KDQoNCkpvZSBUaG9t YXMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHdyaXR0ZW4gYSBzaG9ydCBbYmxvZyBwb3N0XSBh Ym91dCB0aGUgcG9zaXRpdmUgZXhwZXJpZW5jZSBJIGhhZA0KICB1c2luZyBEcmVhbSB0byBidWls ZCBhIFJFU1QgQVBJLiBUaGUgYWNjb21wYW55aW5nIHNvdXJjZSBjb2RlIGlzDQogIGF2YWlsYWJs ZSBoZXJlOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vanN0aG9tYXMvc2Vuc29ycz4NCg0KICBJ J20gaW50ZXJlc3RlZCBpbiBhZGRpbmcgbW9yZSBleGFtcGxlcyBhbmQgdHV0b3JpYWxzIHRvIHRo ZSBPQ2FtbA0KICBlY29zeXN0ZW0gYW5kIHdvdWxkIGJlIGhhcHB5IHRvIGdldCB5b3VyIGZlZWRi YWNrIG9uIHRoaXMgd3JpdGV1cA0KICAoaGVyZSBvciB2aWEgZW1haWwvZ2l0aHViKS4NCg0KDQpb YmxvZyBwb3N0XSA8aHR0cHM6Ly9qc3Rob21hcy5naXRodWIuaW8vb2NhbWwtZHJlYW0tYXBpLmh0 bWw+DQoNCg0KT1RPTUwgMC45LjAg4oCUIGEgY29tcGxpYW50IGFuZCBmbGV4aWJsZSBUT01MIHBh cnNpbmcsIG1hbmlwdWxhdGlvbiwgYW5kIHByZXR0eS1wcmludGluZyBsaWJyYXJ5DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vdG9tbC0wLTktMC1hLWNv bXBsaWFudC1hbmQtZmxleGlibGUtdG9tbC1wYXJzaW5nLW1hbmlwdWxhdGlvbi1hbmQtcHJldHR5 LXByaW50aW5nLWxpYnJhcnkvODE1Mi8xPg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBkb24ndCByZWFsbHkgbGlrZSB0byBiYXNlIGEgcmVsZWFz ZSBhbm5vdW5jZW1lbnQgb24gYmFzaGluZyBhbm90aGVyDQogIHByb2plY3QsIGJ1dCB0aGlzIHdo b2xlIHByb2plY3QgaXMgbW90aXZhdGVkIGJ5IG15IGRpc3NhdGlzZmFjdGlvbg0KICB3aXRoIFtU by5tbF3igJR0aGUgb25seSBUT01MIGxpYnJhcnkgZm9yIE9DYW1sLCBzbyBoZXJlIHdlIGdvLiBP VE9NTCBpcw0KICBhIFRPTUwgbGlicmFyeSB0aGF0IHlvdSAoaG9wZWZ1bGx5KSBjYW4gdXNlIHdp dGhvdXQgd3JpdGluZyBsb25nIHJhbnRzDQogIGFmdGVyd2FyZHMuIDspDQoNCiAgSW4gc2hvcnQ6 DQoNCiAg4oCiIFtUT01MIDEuMC1jb21wbGlhbnRdIChUby5tbCBpcyBub3QpLg0KICDigKIgR29v ZCBlcnJvciByZXBvcnRpbmcuDQogIOKAoiBNYWtlcyBpdCBlYXN5IHRvIGxvb2sgdXAgbmVzdGVk IHZhbHVlcy4NCiAg4oCiIEJpZ251bSBhbmQgY2FsZW5kYXIgbGlicmFyaWVzIGFyZSBwbHVnZ2Fi bGUgdmlhIGZ1bmN0b3JzLg0KICDigKIgRmxleGlibGUgcHJldHR5LXByaW50ZXIgd2l0aCBpbmRl bnRhdGlvbi4NCg0KICBPUEFNOiA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9vdG9t bC8+IEdpdEh1YjoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vb3RvbWw+DQoNCiAg Tm93IGxldCdzIGdldCB0byBkZXRhaWxzLg0KDQogIFRPTUwgaXMgc3VwcG9zZWQgdG8gYmUgaHVt YW4tZnJpZW5kbHkgc28gdGhhdCBwZW9wbGUgY2FuIHVzZSBpdCBhcyBhDQogIGNvbmZpZ3VyYXRp b24gZmlsZSBmb3JtYXQuIEZvciB0aGF0LCBib3RoIGRldmVsb3BlciBhbmQgZW5kLXVzZXINCiAg ZXhwZXJpZW5jZSBtdXN0IGJlIGdyZWF0LiBUby5tbCBwcm92aWRlcyBuZWl0aGVyLiBJJ3ZlIGJl ZW4gdXNpbmcNCiAgVG8ubWwgaW4gbXkgcHJvamVjdHMgZm9yIGEgbG9uZyB0aW1lLCBhbmQNCg0K DQpbVG8ubWxdIDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL3RvbWwvPg0KDQpbVE9N TCAxLjAtY29tcGxpYW50XSA8aHR0cHM6Ly90b21sLmlvL2VuL3YxLjAuMD4NCg0KU3RhbmRhcmQg Y29tcGxpYW5jZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVE9NTCBpcyBuZWl0aGVyIG1pbmltYWwgbm9yIG9idmlvdXMgcmVh bGx5LCBpdCdzIG11Y2ggbGFyZ2VyIHRoYW4gdGhlDQogIGNvbW1vbmx5IHVzZWQgc3Vic2V0IGFu ZCB0aGUgc3BlYyBpcyBub3QgY29uc2lzdGVudCBhbmQgbm90IGVhc3kgdG8NCiAgcmVhZCwgYnV0 IFRvLm1sIGZhaWxzIGF0IHJhdGhlciB3ZWxsLWtub3duIHRoaW5ncywgbGlrZSBkb3R0ZWQga2V5 cywNCiAgYXJyYXlzIG9mIHRhYmxlcyBhbmQgaGV0ZXJvZ2VuZW91cyBhcnJheXMuDQoNCiAgT1RP TUwgcGFzc2VzIGFsbCB0ZXN0cyBpbiB0aGUgW3Rlc3Qgc3VpdGVdLCBleGNlcHQgdGhlIHRlc3Rz IHJlbGF0ZWQNCiAgdG8gYmlnbnVtIHN1cHBvcnQuIFRob3NlIHRlc3RzIGZhaWwgYmVjYXVzZSB0 aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbg0KICBtYXBzIGludGVnZXJzIGFuZCBmbG9hdHMgdG8g dGhlIG5hdGl2ZSAzMS82My1iaXQgT0NhbWwgdHlwZXMuIE1vcmUgb24NCiAgdGhhdCBsYXRlci4N Cg0KDQpbdGVzdCBzdWl0ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9CdXJudFN1c2hpL3RvbWwtdGVz dD4NCg0KDQpFcnJvciByZXBvcnRpbmcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIExldCdzIGxvb2sgYXQgZXJyb3IgcmVwb3J0aW5nLiBUby5tbCdz IHJlc3BvbnNlIHRvIGFueSBwYXJzZSBlcnJvciBpcw0KICBhIGdlbmVyaWMgZXJyb3Igd2l0aCBq dXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg dXRvcCAjIFRvbWwuUGFyc2VyLmZyb21fc3RyaW5nICJmb28gPSBbIiA7Ow0KICDilIIgLSA6IFRv bWwuUGFyc2VyLnJlc3VsdCA9DQogIOKUgiBgRXJyb3INCiAg4pSCICAgKCJFcnJvciBpbiA8c3Ry aW5nPiBhdCBsaW5lIDEgYXQgY29sdW1uIDcgKHBvc2l0aW9uIDcpIiwNCiAg4pSCICAgIHtUb21s LlBhcnNlci5zb3VyY2UgPSAiPHN0cmluZz4iOyBsaW5lID0gMTsgY29sdW1uID0gNzsgcG9zaXRp b24gPSA3fSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTWVuaGlyIG9mZmVycyBleGNlbGxlbnQg dG9vbHMgZm9yIGVycm9yIHJlcG9ydGluZywgc28gSSB0b29rIHRpbWUgdG8NCiAgbWFrZSBkZXNj cmlwdGl2ZSBtZXNzYWdlcyBmb3IgbWFueSBlcnJvciBjb25kaXRpb25zICh0aGVyZSBfYXJlXw0K ICBnZW5lcmljICJzeW50YXggZXJyb3IiIG1lc3NhZ2VzIHN0aWxsLCBidXQgdGhhdCdzIGJldHRl ciB0aGFuIG5vdGhpbmcNCiAgYXQgYWxsKS4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHV0 b3AgIyBPdG9tbC5QYXJzZXIuZnJvbV9zdHJpbmdfcmVzdWx0ICJmb28gPSBbIiA7Ow0KICDilIIg LSA6IChPdG9tbC50LCBzdHJpbmcpIHJlc3VsdCA9DQogIOKUgiBFcnJvcg0KICDilIIgICJTeW50 YXggZXJyb3Igb24gbGluZSAxLCBjaGFyYWN0ZXIgODogTWFsZm9ybWVkIGFycmF5IChtaXNzaW5n IGNsb3Npbmcgc3F1YXJlIGJyYWNrZXQ/KVxuIg0KICDilIIgDQogIOKUgiB1dG9wICMgT3RvbWwu UGFyc2VyLmZyb21fc3RyaW5nX3Jlc3VsdCAiZm9vID0ge2JhciAiIDs7DQogIOKUgiAtIDogKE90 b21sLnQsIHN0cmluZykgcmVzdWx0ID0NCiAg4pSCIEVycm9yDQogIOKUgiAgIlN5bnRheCBlcnJv ciBvbiBsaW5lIDEsIGNoYXJhY3RlciAxMjogS2V5IGlzIGZvbGxvd2VkIGJ5IGVuZCBvZiBmaWxl IG9yIGEgbWFsZm9ybWVkIFRPTUwgY29uc3RydWN0LlxuIg0KICDilJTilIDilIDilIDilIANCg0K DQpMb29raW5nIHVwIG5lc3RlZCB2YWx1ZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE5lc3RlZCBz ZWN0aW9ucyBhcmUgY29tbW9uIGluIGNvbmZpZ3MgYW5kIHNob3VsZCBiZSBlYXN5IHRvIHdvcmsN CiAgd2l0aC4gVGhpcyBpcyBob3cgeW91IGRvIGl0IGluIE9UT01MOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwuUGFyc2VyLmZyb21fc3RyaW5nICJbdGhp cy5pcy5hLmRlZXBseS5uZXN0ZWQudGFibGVdDQogIOKUgiBhbnN3ZXI9NDIiOzsNCiAg4pSCIHZh bCB0IDogT3RvbWwudCA9DQogIOKUgiAgIE90b21sLlRvbWxUYWJsZQ0KICDilIIgICAgWygidGhp cyIsDQogIOKUgiAgICAgIE90b21sLlRvbWxUYWJsZS4uLg0KICDilIIgDQogIOKUgiB1dG9wICMg T3RvbWwuZmluZCB0IE90b21sLmdldF9pbnRlZ2VyIFsidGhpcyI7ICJpcyI7ICJhIjsgImRlZXBs eSI7ICJuZXN0ZWQiOyAidGFibGUiOyAiYW5zd2VyIl0gOzsNCiAg4pSCIC0gOiBpbnQgPSA0Mg0K ICDilJTilIDilIDilIDilIANCg0KICBGb3IgY29tcGFyaXNvbiwgdGhpcyBpcyBob3cgaXQgd2Fz IGRvbmUgaW4gVG8ubWw6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB1dG9wICMgbGV0IHRv bWxfZGF0YSA9IFRvbWwuUGFyc2VyLihmcm9tX3N0cmluZyAiDQogIOKUgiBbdGhpcy5pcy5hLmRl ZXBseS5uZXN0ZWQudGFibGVdDQogIOKUgiBhbnN3ZXI9NDIiIHw+IHVuc2FmZSk7Ow0KICDilIIg dmFsIHRvbWxfZGF0YSA6IFR5cGVzLnRhYmxlID0gPGFic3RyPg0KICDilIIgDQogIOKUgiB1dG9w ICMgVG9tbC5MZW5zZXMuKGdldCB0b21sX2RhdGEgKA0KICDilIIgICBrZXkgInRoaXMiIHwtLSB0 YWJsZQ0KICDilIIgICB8LS0ga2V5ICJpcyIgfC0tIHRhYmxlDQogIOKUgiAgIHwtLSBrZXkgImEi IHwtLSB0YWJsZQ0KICDilIIgICB8LS0ga2V5ICJkZWVwbHkiIHwtLSB0YWJsZQ0KICDilIIgICB8 LS0ga2V5ICJuZXN0ZWQiIHwtLSB0YWJsZQ0KICDilIIgICB8LS0ga2V5ICJ0YWJsZSIgfC0tIHRh YmxlDQogIOKUgiAgIHwtLSBrZXkgImFuc3dlciJ8LS0gaW50ICkpOzsNCiAg4pSCIC0gOiBpbnQg b3B0aW9uID0gU29tZSA0Mg0KICDilJTilIDilIDilIDilIANCg0KDQpFeHRyYSBkZXBlbmRlbmNp ZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoZSBUT01MIHNwZWMgaW5jbHVkZXMgZmlyc3QtY2xhc3MgUkZDMzMzOSBkYXRlcywg Zm9yIGJldHRlciBvcg0KICB3b3JzZS4gVGhlIGlyb255IGlzIHRoYXQgbW9zdCB1c2VzIG9mIFRP TUwgKGFuZCwgaW5kZWVkLCBtb3N0DQogIGNvbmZpZ3VyYXRpb24gZmlsZXMgaW4gdGhlIHdvcmxk KSBkb24ndCBuZWVkIHRoYXQsIHNvIGl0J3MgYXJndWFibHkgYQ0KICBmZWF0dXJlIGJsb2F04oCU YnV0IGlmIHdlIHNldCBvdXQgdG8gc3VwcG9ydCBUT01MIGFzIGl0J3MgZGVmaW5lZCwgdGhhdA0K ICBxdWVzdGlvbiBpcyBhY2FkZW1pYy4NCg0KICBUaGUgcHJhY3RpY2FsIGltcGxpY2F0aW9uIGlz IHRoYXQgaWYgdGhlIHN0YW5kYXJkIGxpYnJhcnkgb2YgYQ0KICBsYW5ndWFnZSBkb2Vzbid0IGlu Y2x1ZGUgYSBkYXRldGltZSB0eXBlLCBhIFRPTUwgbGlicmFyeSBoYXMgdG8gZGVjaWRlDQogIGhv dyB0byByZXByZXNlbnQgdGhvc2UgdmFsdWVzLiBUby5tbCBtYWtlcyBJU084NjAxIGEgaGFyZCBk ZXBlbmRlbmN5LA0KICBzbyBpZiB5b3UgZG9uJ3QgdXNlIGRhdGVzLCB5b3UgZW5kIHVwIHdpdGgg YSB1c2VsZXNzIGRlcGVuZGVuY3kuIEFuZA0KICBpZiB5b3UgcHJlZmVyIGFub3RoZXIgbGlicmFy eSAob3IgbmVlZCBmdW5jdGlvbmFsaXR5IG5vIHByZXNlbnQgaW4NCiAgSVNPODYwMSksIHlvdSBl bmQgdXAgd2l0aCB0d28gbGlicmFyaWVzOiBvbmUgeW91IGNob3NlIHRvIHVzZSwgYW5kIG9uZQ0K ICBtb3JlIGZvcmNlZCBvbiB5b3UuDQoNCiAgU2FtZSBnb2VzIGZvciB0aGUgYXJiaXRyYXJ5IHBy ZWNpc2lvbiBhcml0aG1ldGljLiBNb3N0IGNvbmZpZ3Mgd29uJ3QNCiAgbmVlZCBpdCwgYnV0IHRo ZSBzdGFuZGFyZCBkZW1hbmRzIGl0LCBzbyBzb21ldGhpbmcgbmVlZHMgdG8gYmUgZG9uZS4NCg0K ICBMdWNraWx5LCBpbiB0aGUgT0NhbWwgbGFuZCB3ZSBoYXZlIGZ1bmN0b3JzLCBzbyBpdCdzIGVh c3kgdG8gbWFrZSBhbGwNCiAgdGhlc2UgZGVwZW5kZW5jaWVzIHBsdWdnYWJsZS4gU28gSSBtYWRl IGl0IGEgZnVuY3RvciB0aGF0IHRha2VzIHRocmVlDQogIG1vZHVsZXMuDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBtb2R1bGUgTWFrZSAoSSA6IFRvbWxJbnRlZ2VyKSAoRiA6IFRvbWxGbG9h dCkgKEQgOiBUb21sRGF0ZSkgOg0KICDilIIgICBUb21sSW1wbGVtZW50YXRpb24gd2l0aCB0eXBl IHRvbWxfaW50ZWdlciA9IEkudCBhbmQgdHlwZSB0b21sX2Zsb2F0ID0gRi50IGFuZCB0eXBlIHRv bWxfZGF0ZSA9IEQudA0KICDilJTilIDilIDilIDilIANCg0KICBUaGlzIGlzIGhvdyB0byB1c2Ug WmFyaXRoIGZvciBiaWcgaW50ZWdlcnMgYW5kIGtlZXAgdGhlIHJlc3QNCiAgdW5jaGFuZ2VkOg0K DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogTm8gc2lnbmF0dXJlIGFzY3JpcHRpb246DQog IOKUgiAgICBgbW9kdWxlIEJpZ0ludGVnZXIgOiBPdG9tbC5CYXNlLlRvbWxJbnRlZ2VyYCB3b3Vs ZCBtYWtlIHRoZSB0eXBlIHQgYWJzdHJhY3QsDQogIOKUgiAgICB3aGljaCBpcyBpbmNvbnZlbmll bnQuDQogIOKUgiAgKikNCiAg4pSCIG1vZHVsZSBCaWdJbnRlZ2VyID0gc3RydWN0DQogIOKUgiAg IHR5cGUgdCA9IFoudA0KICDilIIgICBsZXQgb2Zfc3RyaW5nID0gWi5vZl9zdHJpbmcNCiAg4pSC ICAgbGV0IHRvX3N0cmluZyA9IFoudG9fc3RyaW5nDQogIOKUgiAgIGxldCBvZl9ib29sZWFuIGIg PSBpZiBiIHRoZW4gWi5vbmUgZWxzZSBaLnplcm8NCiAg4pSCICAgbGV0IHRvX2Jvb2xlYW4gbiA9 IChuIDw+IFouemVybykNCiAg4pSCIGVuZA0KICDilIIgDQogIOKUgiBtb2R1bGUgTXlUb21sID0g T3RvbWwuQmFzZS5NYWtlIChCaWdJbnRlZ2VyKSAoT3RvbWwuQmFzZS5PQ2FtbEZsb2F0KSAoT3Rv bWwuQmFzZS5TdHJpbmdEYXRlKQ0KICDilJTilIDilIDilIDilIANCg0KDQpQcmludGluZw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVG8ubWwncyBwcmludGVyIGNhbiBwcmludCBUT01M IGF0IHlvdSwgdGhhdCdzIGZvciBjZXJ0YWluLiBObw0KICBpbmRlbnRhdGlvbiwgbm90aGluZyB0 byBoZWxwIHlvdSBuYXZpZ2F0ZSBuZXN0ZWQgdmFsdWVzLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdXRvcCAjIGxldCB0b21sX2RhdGEgPSBUb21sLlBhcnNlci4oZnJvbV9zdHJpbmcgIltm b28uYmFyXVxuYmF6PWZhbHNlXG4gW2Zvby5xdXV4XVxuIHh5enp5ID0gWzEsMl0iIHw+IHVuc2Fm ZSkgfD4NCiAg4pSCIFRvbWwuUHJpbnRlci5zdHJpbmdfb2ZfdGFibGUgfD4gcHJpbnRfZW5kbGlu ZTs7DQogIOKUgiBbZm9vLmJhcl0NCiAg4pSCIGJheiA9IGZhbHNlDQogIOKUgiBbZm9vLnF1dXhd DQogIOKUgiB4eXp6eSA9IFsxLCAyXQ0KICDilJTilIDilIDilIDilIANCg0KICBXZSBjYW4gZG8g YmV0dGVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwu UGFyc2VyLmZyb21fc3RyaW5nICJbZm9vLmJhcl1cbmJhej1mYWxzZVxuIFtmb28ucXV1eF1cbiB4 eXp6eSA9IFsxLDJdIiB8Pg0KICDilIIgT3RvbWwuUHJpbnRlci50b19jaGFubmVsIH5pbmRlbnRf d2lkdGg6NCB+Y29sbGFwc2VfdGFibGVzOmZhbHNlIHN0ZG91dDs7DQogIOKUgiANCiAg4pSCIFtm b29dDQogIOKUgiANCiAg4pSCIFtmb28uYmFyXQ0KICDilIIgICAgIGJheiA9IGZhbHNlDQogIOKU giANCiAg4pSCIFtmb28ucXV1eF0NCiAg4pSCICAgICB4eXp6eSA9IFsxLCAyXQ0KICDilIIgdmFs IHQgOiB1bml0ID0gKCkNCiAg4pSCIA0KICDilIIgdXRvcCAjIGxldCB0ID0gT3RvbWwuUGFyc2Vy LmZyb21fc3RyaW5nICJbZm9vLmJhcl1cbmJhej1mYWxzZVxuIFtmb28ucXV1eF1cbiB4eXp6eSA9 IFsxLDJdIiB8Pg0KICDilIIgT3RvbWwuUHJpbnRlci50b19jaGFubmVsIH5pbmRlbnRfd2lkdGg6 NCB+Y29sbGFwc2VfdGFibGVzOmZhbHNlIH5pbmRlbnRfc3VidGFibGVzOnRydWUgc3Rkb3V0OzsN CiAg4pSCIA0KICDilIIgW2Zvb10NCiAg4pSCIA0KICDilIIgICAgIFtmb28uYmFyXQ0KICDilIIg CWJheiA9IGZhbHNlDQogIOKUgiANCiAg4pSCICAgICBbZm9vLnF1dXhdDQogIOKUgiAJeHl6enkg PSBbMSwgMl0NCiAg4pSCIHZhbCB0IDogdW5pdCA9ICgpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoN Ck1haW50ZW5hbmNlIHByYWN0aWNlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTGFzdCBidXQgbm90IGxlYXN0LCBn b29kIG1haW50ZW5hbmNlIHByYWN0aWNlcyBhcmUgYWxzbyBpbXBvcnRhbnQsIG5vdA0KICBqdXN0 IGdvb2QgY29kZS4gVG8ubWwgaXMgYXQgNy4wLjAgbm93LiBJdCBoYXMgYSBbQ0hBTkdFUy5tZF0g ZmlsZSwgYnV0DQogIEknbSBzdGlsbCB0byBzZWUgdGhlIG1haW50YWluZXJzIGRvY3VtZW50IHdo YXQgdGhlIGJyZWFraW5nIGNoYW5nZSBpcywNCiAgd2hvJ3MgYWZmZWN0ZWQsIGFuZCB3aGF0IHRo ZXkgc2hvdWxkIGRvIHRvIG1ha2UgdGhlaXIgY29kZSBjb21wYXRpYmxlLg0KDQogIEZvciBleGFt cGxlLCBpbiA2LjAuMCB0aGUgYnJlYWtpbmcgY2hhbmdlIHdhcyBhIHJlbmFtZSBmcm9tDQogIGBU b21sTGVuc2VzJyB0byBgVG9tbC5MZW5zZXMnLiBJbiBhbiBlYXJsaWVyIHJlbGVhc2UsIEkgcmVt ZW1iZXIgdGhlDQogIG9wcG9zaXRlIHJlbmFtZS4gR2l2ZW4gdGhlIHN0YW5kYXJkIGNvbXBhdGli aWxpdHkgcHJvYmxlbXMgZ29pbmcNCiAgdW5maXhlZCBmb3IgeWVhcnMsIHRoYXQncyBsaWtlIHJl YXJyYW5naW5nIGZ1cm5pdHVyZSB3aGVuIHRoZSByb29mIGlzDQogIGxlYWtpbmcuDQoNCiAgSSBw cm9taXNlIG5vdCB0byBkbyB0aGF0Lg0KDQoNCltDSEFOR0VTLm1kXQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC10b21sL1RvLm1sL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNCg0KQ29uY2x1 c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSBob3BlIHRoaXMgbGli cmFyeSB3aWxsIGhlbHAgbWFrZSBUT01MIGEgdmlhYmxlIGNvbmZpZ3VyYXRpb24gZmlsZQ0KICBm b3JtYXQgZm9yIE9DYW1sIHByb2dyYW1zLg0KDQogIEl0J3MganVzdCB0aGUgZmlyc3QgdmVyc2lv biBvZiBjb3Vyc2UsIHNvIHRoZXJlJ3Mgc3RpbGwgcm9vbSBmb3INCiAgaW1wcm92ZW1lbnQuIEZv ciBleGFtcGxlLCB0aGUgbGV4ZXIgaXMgZXNwZWNpYWxseSB1Z2x5OiBkdWUgdG8gVE9NTA0KICBi ZWluZyBoaWdobHkgY29udGV4dC1zZW5zaXRpdmUsIGl0IGludm9sdmVzIG1hc3NpdmUgYW1vdW50 cyBvZiBsZXhlcg0KICBoYWNrcyBmb3IgY29udGV4dCB0cmFja2luZy4gIE1heWJlIG9jYW1sbGV4 IGlzIGEgd3JvbmcgdG9vbCBmb3IgdGhlDQogIGpvYiBhYmQgaXQgc2hvdWxkIGJlIHJlcGxhY2Vk IHdpdGggc29tZXRoaW5nIGVsc2UgKHNpbmNlIEknbSB1c2luZw0KICBNZW5oaXIncyBpbmNyZW1l bnRhbCBBUEkgYW55d2F5LCBpdCdzIG5vdCB0aWVkIHRvIGFueSBsZXhlciBBUEkpLg0KDQogIFRo ZSBwcmludGVyIGlzIGFsc28gbGVzcyB0ZXN0ZWQgdGhhbiB0aGUgcGFyc2VyLCBzbyB0aGVyZSBt YXkgYmUNCiAgdW5oYW5kbGVkIGVkZ2UgY2FzZXMuIEl0IGFsc28gaGFzIHNvbWUgY29zbWV0aWMg aXNzdWVzIGxpa2UgbmV3bGluZXMNCiAgYmV0d2VlbiBwYXJlbnQgYW5kIGNoaWxkIHRhYmxlcy4N Cg0KICBBbnkgZmVlZGJhY2sgYW5kIHBhdGNoZXMgYXJlIHdlbGNvbWUhDQoNCg0Kc291cGF1bHQ6 IGEgc3RhdGljIHdlYnNpdGUgZ2VuZXJhdG9yIGJhc2VkIG9uIEhUTUwgcmV3cml0aW5nDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1z b3VwYXVsdC1hLXN0YXRpYy13ZWJzaXRlLWdlbmVyYXRvci1iYXNlZC1vbi1odG1sLXJld3JpdGlu Zy80MTI2LzE1Pg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgW3NvdXBhdWx0IDMuMC4wXSBpcyBub3cgYXZhaWxhYmxlLg0KDQogIEl0IG5vdyB1c2Vz IHRoZSBuZXcgW09UT01MXSBsaWJyYXJ5IGZvciBsb2FkaW5nIHRoZSBjb25maWdzLCB3aGljaCBo YXMNCiAgc29tZSBwb3NpdGl2ZSBzaWRlIGVmZmVjdHMsIGUuZy4ga2V5cyBpbiB0aGUgb3V0cHV0 IG9mIGBzb3VwYXVsdA0KICAtLXNob3ctZWZmZWN0aXZlLWNvbmZpZycgKHRoYXQgc2hvd3MgeW91 ciBjb25maWcgcGx1cyBkZWZhdWx0IHZhbHVlcw0KICB5b3UgZGlkbid0IHNldCBleHBsaWNpdGx5 KSBub3cgY29tZSBpbiB0aGUgc2FtZSBvcmRlciBhcyBpbiB5b3VyDQogIGNvbmZpZyBmaWxlLg0K DQogIEl0IGFsc28gcHJvdmlkZXMgVE9NTCBhbmQgWUFNTCBwYXJzaW5nIGZ1bmN0aW9ucyB0byBM dWEgcGx1Z2lucyBhbmQNCiAgaGFzIGNvbG9yZWQgbG9nIGhlYWRlcnMgKGNhbiBiZSBkaXNhYmxl ZCB3aXRoIE5PX0NPTE9SIGVudmlyb25tZW50DQogIHZhcmlhYmxlcykuDQoNCg0KW3NvdXBhdWx0 IDMuMC4wXSA8aHR0cHM6Ly9zb3VwYXVsdC5hcHAvYmxvZy9zb3VwYXVsdC0zLjAuMC1yZWxlYXNl Lz4NCg0KW09UT01MXSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9vdG9tbC8+DQoN Cg0KT0NhbWwgNC4xMy4wLCBzZWNvbmQgYWxwaGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC00LTEzLTAtc2Vjb25kLWFscGhhLXJlbGVhc2UvODE2NC8x Pg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxlYXNlIG9mIE9DYW1sIDQu MTMuMCBpcyBhcHByb2FjaGluZy4gV2UgaGF2ZSByZWxlYXNlZCBhIHNlY29uZA0KICBhbHBoYSB2 ZXJzaW9uIHRvIGhlbHAgZmVsbG93IGhhY2tlcnMgam9pbiB1cyBlYXJseSBpbiBvdXIgYnVnIGh1 bnRpbmcNCiAgYW5kIG9wYW0gZWNvc3lzdGVtIGZpeGluZyBmdW4gKHNlZSBiZWxvdyBmb3IgdGhl IGluc3RhbGxhdGlvbg0KICBpbnN0cnVjdGlvbnMpLiBZb3UgY2FuIHNlZSB0aGUgcHJvZ3Jlc3Mg b24gdGhpcyBmcm9udCBhdA0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3Np dG9yeS9pc3N1ZXMvMTg3OTE+IC4NCg0KICBCZXlvbmQgdGhlIHVzdWFsIGJ1ZyBmaXhlcyAoc2Vl IHRoZSBmdWxsIGxpc3QgYmVsb3cpLCB0aGlzIHNlY29uZA0KICBhbHBoYSBpbnRlZ3JhdGVzIGEg bmV3IGZlYXR1cmUgZm9yIG5hdGl2ZSBjb2RlOiBwb2xsIHBvaW50cy4gVGhvc2UNCiAgcG9sbCBw b2ludHMgY3VycmVudGx5IGZpeGVzIHNvbWUgaXNzdWVzIHdpdGggc2lnbmFscyBpbiBub24tYWxs b2NhdGluZw0KICBsb29wcyBpbiBuYXRpdmUgY29kZS4gTW9yZSBpbXBvcnRhbnRseSwgdGhleSBh cmUgcHJlcmVxdWlzaXRlIGZvciB0aGUNCiAgbXVsdGljb3JlIHJ1bnRpbWUuDQoNCiAgQW5vdGhl ciBjaGFuZ2UgaXMgdGhlIHJlbW92YWwgb2YgdGhlIHJlbW92YWwgb2YgaW50ZXJicmFuY2gNCiAg cHJvcGFnYXRpb24gb2YgdHlwZSBpbmZvcm1hdGlvbi4gIFRoZSBmZWF0dXJlLCBhbHJlYWR5IHBv c3Rwb25lZCBmcm9tDQogIDQuMTIsIGhhcyBiZWVuIHJlbW92ZWQgdG8gZm9jdXMgZm9yIG5vdyBv biBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBpbiB0aGUNCiAgYC1wcmluY2lwYWwnIG1vZGUuDQoNCiAg SWYgeW91IGZpbmQgYW55IGJ1Z3MsIHBsZWFzZSByZXBvcnQgdGhlbSBoZXJlOg0KDQogIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzPg0KDQogIFRoZSBmaXJzdCBiZXRhIHJl bGVhc2UgbWF5IGZvbGxvdyBzb29uIHNpbmNlIHRoZSBvcGFtIGVjb3N5c3RlbSBpcyBpbg0KICBx dWl0ZSBnb29kIHNoYXBlOyBhbmQgd2UgYXJlIG9uIHRyYWNrIGZvciBhIGZ1bGwgcmVsZWFzZSBp biBTZXB0ZW1iZXIuDQoNCiAgSGFwcHkgaGFja2luZywgRmxvcmlhbiBBbmdlbGV0dGkgZm9yIHRo ZSBPQ2FtbCB0ZWFtLg0KDQoNCkluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3Bh bSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjEzLjB+YWxw aGEyIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSWYg eW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5b3Ug Y2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3aXRj aF9uYW1lPiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTMuMH5hbHBoYTIrb3B0aW9ucyw8 b3B0aW9uX2xpc3Q+DQogIOKUgiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJldGE9Z2l0K2h0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQogIOKUlOKUgOKU gOKUgOKUgA0KICB3aGVyZSA8b3B0aW9uX2xpc3Q+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qg b2Ygb2NhbWwtb3B0aW9uLSoNCiAgcGFja2FnZXMuIEZvciBpbnN0YW5jZSwgZm9yIGEgZmxhbWJk YSBhbmQgbm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0Y2g6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTMuMH5hbHBoYTIrZmxhbWJkYStuZmZhDQogIOKUgiAt LXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTMuMH5hbHBoYTIrb3B0aW9ucyxvY2FtbC1vcHRp b24tZmxhbWJkYSxvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KICDilIIgLS1yZXBv c2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwt YmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgQWxsIGF2YWlsYWJsZSBv cHRpb25zIGNhbiBiZSBsaXN0ZWQgd2l0aCAib3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9uIi4NCg0K ICBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoaXMgdmVyc2lvbiwgaXQgaXMgYWR2aXNlZCB0byBpbnN0 YWxsIHRoZSBhbHBoYQ0KICBvcGFtIHJlcG9zaXRvcnkNCg0KICA8aHR0cHM6Ly9naXRodWIuY29t L2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeT4NCg0KICB3aXRoDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgb3BhbSByZXBvIGFkZCBhbHBoYSBnaXQ6Ly9naXRodWIuY29tL2tpdC10 eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIFRo aXMgYWxwaGEgcmVwb3NpdG9yeSBjb250YWlucyB2YXJpb3VzIGZpeGVzIGluIHRoZSBwcm9jZXNz IG9mIGJlaW5nDQogIHVwc3RyZWFtZWQuDQoNCiAgVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgYWxw aGEgaXMgYWxzbyBhdmFpbGFibGUgYXQgdGhlc2UgYWRkcmVzc2VzOg0KDQogIOKAoiA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNC4xMy4wLWFscGhhMi50YXIuZ3o+DQog IOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTQuMTMvb2NhbWwt NC4xMy4wfmFscGhhMi50YXIuZ3o+DQoNCg0KQ2hhbmdlcyBzaW5jZSB0aGUgZmlyc3QgYWxwaGEg cmVsZWFzZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCk5ldyBmZWF0dXJlDQrilITilITilITilITilITilITilITilITilITilITilIQN Cg0KICDigKIgWzEwMDM5XTogU2FmZXBvaW50cyBBZGQgcG9sbCBwb2ludHMgdG8gbmF0aXZlIGdl bmVyYXRlZCBjb2RlLiBUaGVzZQ0KICAgIGFyZSBlZmZlY3RpdmVseSB6ZXJvLXNpemVkIGFsbG9j YXRpb25zIGFuZCBmaXggc29tZSBzaWduYWwgYW5kDQogICAgcmVtZW1iZXJlZCBzZXQgaXNzdWVz LiBBbHNvIG11bHRpY29yZSBwcmVyZXF1aXNpdGUuICAoU2FkaXEgSmFmZmVyLA0KICAgIFN0ZXBo ZW4gRG9sYW4sIERhbWllbiBEb2xpZ2V6LCBYYXZpZXIgTGVyb3ksIEFubW9sIFNhaG9vLCBNYXJr DQogICAgU2hpbndlbGwsIHJldmlldyBieSBEYW1pZW4gRG9saWdleiwgWGF2aWVyIExlcm95LCBh bmQgTWFyayBTaGlud2VsbCkNCg0KDQpbMTAwMzldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEwMDM5Pg0KDQoNCk5ldyBidWcgZml4ZXMNCuKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbMTA0NDldOiBGaXggbWFqb3IgR0Mgd29y ayBhY2NvdW50aW5nICh0aGUgR0Mgd2FzIHJ1bm5pbmcgdG9vDQogICAgZmFzdCkuIChEYW1pZW4g RG9saWdleiwgcmVwb3J0IGJ5IFN0ZXBoZW4gRG9sYW4sIHJldmlldyBieSBOaWNvbMOhcw0KICAg IE9qZWRhIELDpHIgYW5kIFNhZGlxIEphZmZlcikNCg0KICDigKIgWzEwNDU0XTogQ2hlY2sgcm93 X21vcmUgaW4gbm9uZGVwX3R5cGVfcmVjLiAgKExlbyBXaGl0ZSwgcmV2aWV3IGJ5DQogICAgVGhv bWFzIFJlZmlzKQ0KDQogIOKAoiBbMTA0NjhdOiBDb3JyZWN0bHkgcHJldHR5IHByaW50IGxvY2Fs IHR5cGUgc3Vic3RpdHV0aW9uLCBlLmcuIHR5cGUgdA0KICAgIDo9IOKApiwgd2l0aCAtZHNvdXJj ZSAoTWF0dCBFbHNlLCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGkpDQoNCiAg4oCiIFsxMDQ2 MV0sIFsxMDQ5OF06IGBjYW1sX3NlbmQqJyBoZWxwZXIgZnVuY3Rpb25zIHRha2UgZGVyaXZlZA0K ICAgIHBvaW50ZXJzIGFzIGFyZ3VtZW50cy4gIFRob3NlIG11c3QgYmUgZGVjbGFyZWQgd2l0aCB0 eXBlIEFkZHINCiAgICBpbnN0ZWFkIG9mIFZhbC4gTW9yZW92ZXIsIHBvbGwgcG9pbnQgaW5zZXJ0 aW9uIG11c3QgYmUgZGlzYWJsZWQgZm9yDQogICAgYGNhbWxfc2VuZConLCBvdGhlcndpc2UgdGhl IGRlcml2ZWQgcG9pbnRlciBpcyBsaXZlIGFjcm9zcyBhIHBvbGwNCiAgICBwb2ludC4gKFZpbmNl bnQgTGF2aXJvbiBhbmQgWGF2aWVyIExlcm95LCByZXZpZXcgYnkgWGF2aWVyIExlcm95IGFuZA0K ICAgIFNhZGlxIEphZmZlcikNCg0KICDigKIgWzEwNDc4XTogRml4IHNlZ2ZhdWx0IHVuZGVyIFdp bmRvd3MgZHVlIHRvIGEgbWlzdGFrZW4gaW5pdGlhbGl6YXRpb24NCiAgICBvZiB0aHJlYWQgSUQg d2hlbiBhIHRocmVhZCBzdGFydHMuIChEYXZpZCBBbGxzb3BwLCBOaWNvbMOhcyBPamVkYQ0KICAg IELDpHIsIHJldmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFs5NTI1XSwgWzEwNDAyXTog b2NhbWxkb2Mgb25seSBjcmVhdGUgcGFyYWdyYXBocSBhdCB0aGUgdG9wbGV2ZWwgb2YNCiAgICBk b2N1bWVudGF0aW9uIGNvbW1lbnRzIChGbG9yaWFuIEFuZ2VsZXR0aSwgcmVwb3J0IGJ5IEhlbmRy aWsgVGV3cywNCiAgICByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KDQogIOKAoiBbMTAyMDZd OiBTcGxpdCBsYWJlbHMgYW5kIHBvbHltb3JwaGljIHZhcmlhbnRzIHR1dG9yaWFscyBTcGxpdHMg dGhlDQogICAgbGFiZWxzIGFuZCBwb2x5bW9ycGhpYyB2YXJpYW50cyB0dXRvcmlhbCBpbnRvIHR3 by4gTW92ZXMgdGhlIEdBRFRzDQogICAgdHV0b3JpYWwgZnJvbSB0aGUgTGFuZ3VhZ2UgRXh0ZW5z aW9ucyBjaGFwdGVyIHRvIHRoZSB0dXRvcmlhbHMuDQogICAgKEpvaG4gV2hpdGluZ3RvbiwgcmV2 aWV3IGJ5IEZsb3JpYW4gQW5nZWxldHRpIGFuZCBYYXZpZXIgTGVyb3kpDQoNCg0KWzEwNDQ5XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ0OT4NCg0KWzEwNDU0XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ1ND4NCg0KWzEwNDY4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ2OD4NCg0KWzEwNDYxXSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ2MT4NCg0KWzEwNDk4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ5OD4NCg0KWzEwNDc4XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDQ3OD4NCg0KWzk1MjVdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk1MjU+DQoNClsxMDQwMl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA0MDI+DQoNClsxMDIwNl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTAyMDY+DQoNCg0KUmVtb3ZlZCBm ZWF0dXJlDQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0K ICDigKIgWyAqYnJlYWtpbmcgY2hhbmdlKiBdIFs5ODExXTogcmVtb3ZlIHByb3BhZ2F0aW9uIGZy b20gcHJldmlvdXMNCiAgICBicmFuY2hlcyBUeXBlIGluZm9ybWF0aW9uIGluZmVycmVkIGZyb20g cHJldmlvdXMgYnJhbmNoZXMgd2FzDQogICAgcHJvcGFnYXRlZCBpbiBub24tcHJpbmNpcGFsIG1v ZGUuIFJldmVydCB0aGlzIGZvciBiZXR0ZXINCiAgICBjb21wYXRpYmlsaXR5IHdpdGggLXByaW5j aXBhbCBtb2RlLiBGb3IgdGhlIHRpbWUgYmVpbmcsIGluZnJpbmdpbmcNCiAgICBjb2RlIHNob3Vs ZCByZXN1bHQgaW4gYSBwcmluY2lwYWxpdHkgd2FybmluZy4gKEphY3F1ZXMgR2FycmlndWUsDQog ICAgcmV2aWV3IGJ5IFRob21hcyBSZWZpcyBhbmQgR2FicmllbCBTY2hlcmVyKQ0KDQogIFRoZSB1 cC10by1kYXRlIGxpc3Qgb2YgY2hhbmdlcyBmb3IgT0NhbWwgNC4xMyBpcyBhdmFpbGFibGUgYXQN CiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iLzQuMTMvQ2hhbmdlcz4gLg0K DQoNCls5ODExXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy85ODExPg0K DQoNCk9DYW1sRm9ybWF0IDAuMTkuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tb2NhbWxmb3JtYXQtMC0xOS0wLzgxNjcvMT4NCg0KDQpHdWlsbGF1bWUgUGV0 aW90IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGhhcHB5IHRv IGFubm91bmNlIHRoZSByZWxlYXNlIG9mIFtPQ2FtbEZvcm1hdCAwLjE5LjBdLg0KDQogIE9DYW1s Zm9ybWF0IGlzIGFuIGF1dG8tZm9ybWF0dGVyIGZvciBPQ2FtbCBjb2RlLCB3cml0aW5nIHRoZSBw YXJzZQ0KICB0cmVlIGFuZCBjb21tZW50cyBpbiBhIGNvbnNpc3RlbnQgc3R5bGUsIHNvIHRoYXQg eW91IGRvIG5vdCBoYXZlIHRvDQogIHdvcnJ5IGFib3V0IGZvcm1hdHRpbmcgaXQgYnkgaGFuZCwg YW5kIHRvIHNwZWVkIHVwIGNvZGUgcmV2aWV3IGJ5DQogIGZvY3VzaW5nIG9uIHRoZSBpbXBvcnRh bnQgcGFydHMuDQoNCiAgT0NhbWxGb3JtYXQgaXMgYmV0YSBzb2Z0d2FyZS4gV2UgZXhwZWN0IHRo ZSBwcm9ncmFtIHRvIGNoYW5nZQ0KICBjb25zaWRlcmFibHkgYmVmb3JlIHdlIHJlYWNoIHZlcnNp b24gMS4wLjAuIEluIHBhcnRpY3VsYXIsIHVwZ3JhZGluZw0KICB0aGUgYG9jYW1sZm9ybWF0YCBw YWNrYWdlIHdpbGwgY2F1c2UgeW91ciBwcm9ncmFtIHRvIGdldA0KICByZWZvcm1hdHRlZC4gU29t ZXRpbWVzIGl0IGlzIHJlbGF0aXZlbHkgcGFpbi1mcmVlLCBidXQgc29tZXRpbWVzIGl0DQogIHdp bGwgbWFrZSBhIGRpZmYgaW4gYWxtb3N0IGV2ZXJ5IGZpbGUuIFdlIGFyZSB3b3JraW5nIHRvd2Fy ZHMgaGF2aW5nIGENCiAgdG9vbCB0aGF0IHBsZWFzZXMgbW9zdCB1c2VjYXNlcyBpbiB0aGUgT0Nh bWwgY29tbXVuaXR5LCBwbGVhc2UgYmVhcg0KICB3aXRoIHVzIQ0KDQogIFRvIG1ha2Ugc3VyZSB5 b3VyIHByb2plY3QgdXNlcyB0aGUgbGFzdCB2ZXJzaW9uIG9mIG9jYW1sZm9ybWF0LCBwbGVhc2UN CiAgc2V0DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2ZXJzaW9uPTAuMTkuMA0KICDilJTi lIDilIDilIDilIANCg0KICBpbiB5b3VyIGAub2NhbWxmb3JtYXQnIGZpbGUuDQoNCiAgTWFpbiBj aGFuZ2VzIGluIGBvY2FtbGZvcm1hdC4wLjE5LjAnIGFyZToNCiAg4oCiIE9DYW1sIDQuMTMgZmVh dHVyZXMgYXJlIHN1cHBvcnRlZA0KICDigKIgYHBweGxpYicgZGVwZW5kZW5jeSBoYXMgYmVlbiBk cm9wcGVkDQogIOKAoiBBIG5ldyBgbGluZS1lbmRpbmdzPXtsZixjcmxmfScgb3B0aW9uIGhhcyBi ZWVuIGFkZGVkIGZvciB3aW5kb3dzDQogICAgY29tcGF0aWJpbGl0eQ0KDQogIEhlcmUgaXMgdGhl IFtmdWxsIGxpc3Qgb2YgY2hhbmdlc10uDQoNCiAgV2UgZW5jb3VyYWdlIHlvdSB0byB0cnkgb2Nh bWxmb3JtYXQsIHRoYXQgY2FuIGJlIGluc3RhbGxlZCBmcm9tIG9wYW0NCiAgZGlyZWN0bHkgKCBg b3BhbSBpbnN0YWxsIG9jYW1sZm9ybWF0JyApLCBidXQgcGxlYXNlIHJlbWVtYmVyIHRoYXQgaXQN CiAgaXMgc3RpbGwgYmV0YSBzb2Z0d2FyZS4gV2UgaGF2ZSBhIFtGQVEgZm9yIG5ldyB1c2VycyBd IHRoYXQgc2hvdWxkDQogIGhlbHAgeW91IGRlY2lkZSBpZiBvY2FtbGZvcm1hdCBpcyB0aGUgcmln aHQgY2hvaWNlIGZvciB5b3UuDQoNCg0KW09DYW1sRm9ybWF0IDAuMTkuMF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQ+DQoNCltmdWxsIGxpc3Qgb2YgY2hhbmdlc10N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3JlbGVhc2VzL3RhZy8w LjE5LjA+DQoNCltGQVEgZm9yIG5ldyB1c2VycyBdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LXBweC9vY2FtbGZvcm1hdCNmYXEtZm9yLW5ldy11c2Vycz4NCg0KDQpOaWNvbMOhcyBPamVkYSBC w6RyIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEEg bmV3IGBsaW5lLWVuZGluZ3M9e2xmLGNybGZ9JyBvcHRpb24gaGFzIGJlZW4gYWRkZWQgZm9yDQog ICAgICAgIHdpbmRvd3MgY29tcGF0aWJpbGl0eQ0KDQogIEp1c3QgdG8gZXhwYW5kIGEgYml0IG9u IHRoaXMgZmVhdHVyZTogcHJldmlvdXNseSwgYG9jYW1sZm9ybWF0JyB3b3VsZA0KICB1c2UgdGhl IHN5c3RlbSBFT0wgY29udmVudGlvbiAoaWUgTEYgb24gVW5peC1saWtlIE9TcyBhbmQgQ1JMRiBv bg0KICBXaW5kb3dzKS4gVGhpcyBtZWFudCB0aGF0IGlmIHlvdSBhcHBsaWVkIGBvY2FtbGZvcm1h dCcgb24gc3lzdGVtcyB3aXRoDQogIGRpZmZlcmVudCBFT0wgY29udmVudGlvbnMsIHlvdSB3b3Vs ZCBnZXQgYSBkaWZmIG9uIGV2ZXJ5IGxpbmUgb24gZXZlcnkNCiAgZmlsZSBwdXJlbHkgZHVlIHRv IHRoZSBjaGFuZ2VkIG5ld2xpbmVzLiBGdXJ0aGVybW9yZSwgdGhpcyBtZWFudA0KICBgb2NhbWxm b3JtYXQnIHdhcyBoYXJkIHRvIHVzZSBpZiB5b3VyIHByb2plY3QgdXNlZCBMRiBvbiBXaW5kb3dz IChhDQogIGNvbW1vbiB1c2FnZSkuDQoNCiAgV2l0aCB0aGUgbmV3IG9wdGlvbiwgYG9jYW1sZm9y bWF0JyBlbmZvcmNlcyBhIGdpdmVuIEVPTA0KICBjb252ZW50aW9uLiBUaGUgc3lzdGVtIEVPTCBj b252ZW50aW9uIGlzIG5vIGxvbmdlciB1c2VkIGZvciBhbnkNCiAgcHVycG9zZSBhbmQgdGhlIEVP TCBjb252ZW50aW9uIHVzZWQgaXMgdGhlIG9uZSBzcGVjaWZpZWQgaW4NCiAgYG9jYW1sZm9ybWF0 JydzIGNvbmZpZyAoTEYgYnkgZGVmYXVsdCkuDQoNCg0KT0NhbWwgQ2Fmw6k6IFdlZCwgQXVnIDQg QCA3cG0gKFUuUy4gQ2VudHJhbCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY2FmZS13ZWQtYXVnLTQtN3BtLXUtcy1j ZW50cmFsLzgxNjkvMT4NCg0KDQpNaWNoYWVsIEJhY2FyZWxsYSBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFBsZWFzZSBqb2luIHVzIGF0IHRoZSBuZXh0IE9DYW1sIENh ZmUsIGEgZnJpZW5kbHksIGxvdyBzdGFrZXMNCiAgb3Bwb3J0dW5pdHkgdG8gYXNrIHF1ZXN0aW9u cyBhYm91dCB0aGUgT0NhbWwgbGFuZ3VhZ2UgYW5kIGVjb3N5c3RlbSwNCiAgd29yayB0aHJvdWdo IHByb2dyYW1taW5nIHByb2JsZW1zIHRoYXQgeW914oCZcmUgc3R1Y2sgb24sIGFuZCBnZXQNCiAg ZmVlZGJhY2sgb24geW91ciBjb2RlLiBFc3BlY2lhbGx5IGdlYXJlZCB0b3dhcmQgbmV3IGFuZCBp bnRlcm1lZGlhdGUNCiAgdXNlcnMsIGV4cGVyaWVuY2VkIE9DYW1sIGRldmVsb3BlcnMgd2lsbCBi ZSBhdmFpbGFibGUgdG8gYW5zd2VyIHlvdXINCiAgcXVlc3Rpb25zLiAgQnJpbmcgeW91ciBjb2Rl IGFuZCB3ZeKAmWxsIGJlIGhhcHB5IHRvIHJldmlldyBpdCwgYXNzaXN0DQogIHdpdGggZGVidWdn aW5nLCBhbmQgcHJvdmlkZSByZWNvbW1lbmRhdGlvbnMgZm9yIGltcHJvdmVtZW50Lg0KDQogIFRo aXMgbW9udGgsIE9DYW1sIENhZsOpIHdpbGwgY29uc2lzdCBvZiB0d28gcGFydHMuIEZpcnN0LCBS dWRpIEdyaW5iZXJnDQogIG9mIFtPQ2FtbCBMYWJzXSB3aWxsIHByZXNlbnQgYW4gaW5mb3JtYWwg aW50cm9kdWN0aW9uIHRvIFtEdW5lXSwgdGhlDQogIE9DYW1sIGJ1aWxkIHN5c3RlbS4gTGVhcm4g YWJvdXQgRHVuZSBmcm9tIG9uZSB0aGUgcGVvcGxlIGRldmVsb3BpbmcNCiAgaXQuIEZvbGxvd2lu ZyBSdWRp4oCZcyBwcmVzZW50YXRpb24sIHdlIHdpbGwgb3BlbiB0aGUgZGlzY3Vzc2lvbiB0byBh bGwNCiAgdGhpbmdzIE9DYW1sLXJlbGF0ZWQuDQoNCiAgRnVsbCBbWm9vbSBtZWV0aW5nIGRldGFp bHMgaGVyZV0uDQogIOKAoiBBZGQgdG8geW91ciBbR29vZ2xlIENhbGVuZGFyXQ0KICDigKIgQWRk IHRvIHlvdXIgW2lDYWxdDQoNCg0KW09DYW1sIExhYnNdIDxodHRwczovL29jYW1sbGFicy5pby8+ DQoNCltEdW5lXSA8aHR0cHM6Ly9kdW5lLmJ1aWxkLz4NCg0KW1pvb20gbWVldGluZyBkZXRhaWxz IGhlcmVdDQo8aHR0cHM6Ly9oZnB1Zy5vcmcvZXZlbnQvb2NhbWwtY2FmZS1pbnRyb2R1Y3Rpb24t dG8tZHVuZS1hbmQtb3Blbi1mb3J1bS8+DQoNCltHb29nbGUgQ2FsZW5kYXJdDQo8aHR0cHM6Ly93 d3cuZ29vZ2xlLmNvbS9jYWxlbmRhci9ldmVudD9hY3Rpb249VEVNUExBVEUmdGV4dD1PQ2FtbCtD YWYlQzMlQTklM0ErSW50cm9kdWN0aW9uK3RvK0R1bmUrYW5kK09wZW4rRm9ydW0mZGF0ZXM9MjAy MTA4MDRUMTkwMDAwLzIwMjEwODA0VDIxMDAwMCZkZXRhaWxzPU9DYW1sK0NhZiVDMyVBOStvZmZl cnMrYStmcmllbmRseSUyQytsb3crc3Rha2VzK29wcG9ydHVuaXR5K3RvK2FzaytxdWVzdGlvbnMr YWJvdXQrdGhlK09DYW1sK2xhbmd1YWdlK2FuZCtlY29zeXN0ZW0lMkMrd29yayt0aHJvdWdoK3By b2dyYW1taW5nK3Byb2JsZW1zK3RoYXQreW91JUUyJTgwJTk5cmUrc3R1Y2srb24lMkMrYW5kK2dl dCtmZWVkYmFjaytvbit5b3VyK2NvZGUuK0VzcGVjaWFsbHkrZ2VhcmVkK3Rvd2FyZCtuZXcrYW5k K2ludGVybWVkaWF0ZSt1c2VycyUyQytleHBlcmllbmNlZCtPQ2FtbCtkZXZlbG9wZXJzK3dpbGwr YmUrYXZhaWxhYmxlK3RvK2Fuc3dlcit5b3VyK3F1ZXN0aW9ucy4lQzIlQTArQnJpbmcreW91citj b2RlK2FuZCt3ZSUyNiUyMzgyMTclM0JsbCtiZStoYXBweSt0bytyZXZpZXcraXQlMkMrYXNzaXN0 K3dpdGgrZGVidWdnaW5nJTJDK2FuZCtwcm92aWRlK3JlY29tbWVuZGF0aW9ucytmb3IraW1wcm92 ZW1lbnQuKyUwQVRoaXMrbW9udGglMkMrT0NhbWwrQ2FmJUMzJUE5K3dpbGwrY29uc2lzdCtvZit0 d28rcGFydHMuJUMyJUEwK0ZpcnN0JTJDK1J1ZGkrR3JpbmJlcmcrb2YrT0NhbWwrTGFicyt3aWxs K3ByZXNlbnQrYW4raW5mb3JtYWwraW50cm9kdWN0aW9uK3RvK0R1bmUlMkMrdGhlK09DYW1sK2J1 aWxkK3N5c3RlbS4lQzIlQTArTGVhcm4rYWJvdXQrRHVuZStmcm9tK29uZSt0aGUrcGVvcGxlK2Rl dmVsb3BpbmcraXQuJUMyJUEwK0ZvbGxvd2luZytSdWRpJTI2JTIzODIxNyUzQnMrcHJlc2VudGF0 aW9uJTJDK3dlK3dpbGwrb3Blbit0aGUrZGlzY3Vzc2lvbit0bythbGwrdGhpbmdzK09DYW1sLXJl bGF0ZWQuKyUwQVdoZXRoZXIreW91JUUyJTgwJTk5cmUrc3RpbGwrdHJ5aW5nK3RvK21ha2Urc2Vu c2Urb2YrY3Vycnlpbmcrb3IrY2FuK3Nwb3Qrbm9uLXRhaWwtcmVjdXJzaXZlK2NvZGUrZnJvbSth Y3Jvc3MrdGhlK3Jvb20lMkMrd2UraG9wZSt0aGF0K3lvdSVFMiU4MCU5OWxsK2pvaW4rdXMrd2l0 aCt5b3VyK3F1ZXN0aW9ucythYm91dCtPQ2FtbCUyQytvcitqdXN0K3RvK2hhbmcrb3V0K3dpdGgr dGhlK09DYW1sK2NvbW11bml0eS4rJTBBJTBBQ2xhdWRlK1J1KyUyOFZpZXcrRnVsbCtFdmVudCtE ZXNjcmlwdGlvbitIZXJlJTNBK2h0dHBzJTNBJTJGJTJGaGZwdWcub3JnJTJGZXZlbnQlMkZvY2Ft bC1jYWZlLWludHJvZHVjdGlvbi10by1kdW5lLWFuZC1vcGVuLWZvcnVtJTJGJTI5JmxvY2F0aW9u PVpvb20mdHJwPWZhbHNlJnNwcm9wPXdlYnNpdGU6aHR0cHM6Ly9oZnB1Zy5vcmcmY3R6PUFtZXJp Y2ElMkZDaGljYWdvPg0KDQpbaUNhbF0NCjxodHRwczovL2hmcHVnLm9yZy9ldmVudC9vY2FtbC1j YWZlLWludHJvZHVjdGlvbi10by1kdW5lLWFuZC1vcGVuLWZvcnVtLz9pY2FsPTE+DQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0 dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0 cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 13 to 20, 2021.

Writing a REST API with Dream

Joe Thomas announced

I've written a short blog post about the positive experience I had using Dream to build a REST API. The accompanying source code is available = here:

https://github.com/jsthomas= /sensors

I'm interested in adding more examples and tutorials to the OCaml ecosystem= and would be happy to get your feedback on this writeup (here or via email/github).

OTOML 0.9.0 =E2=80=94 a compliant and flexible TOML parsing, m= anipulation, and pretty-printing library

Daniil Baturin announced

I don't really like to base a release announcement on bashing another proje= ct, but this whole project is motivated by my dissatisfaction with T= o.ml=E2=80=94the only TOML library for OCaml, so here we go. OTOML is a TOML library that you (hopefully) can use without writing lo= ng rants afterwards. ;)

In short:

  • TOML 1.0-compliant (To.ml is = not).
  • Good error reporting.
  • Makes it easy to look up nested values.
  • Bignum and calendar libraries are pluggable via functors.
  • Flexible pretty-printer with indentation.

OPAM: https://opam.ocaml= .org/packages/otoml/ GitHub: https://github.com/d= mbaturin/otoml

Now let's get to details.

TOML is supposed to be human-friendly so that people can use it as a config= uration file format. For that, both developer and end-user experience must be great. To.ml provides neither. I'= ve been using To.ml in my projects for a long time, and

Standard compliance

TOML is neither minimal nor obvious really, it's much larger than the commo= nly used subset and the spec is not consistent and not easy to read, but To.ml fails at rather well-known thing= s, like dotted keys, arrays of tables and heterogeneous arrays.

OTOML passes all tests in the test suite, except the tests related to bignum support. Those tests fail because the default implementation maps in= tegers and floats to the native 31/63-bit OCaml types. More on that later.

Error reporting

Let's look at error reporting. To.ml's response to any parse error is a gen= eric error with just line and column numbers.

utop # Toml.Pa=
rser.from_string "foo =3D [" =
;;
- : Toml.Parser.result =3D
`Error
  ("Error in <string> at line 1 at co=
lumn 7 (position 7)",
   {Toml.Parser.source =3D "<string>"; line =3D 1; column =3D 7; p=
osition =3D 7})

Menhir offers excellent tools for error reporting, so I took time to make d= escriptive messages for many error conditions (there are generic "syntax erro= r" messages still, but that's better than nothing at all).

utop # Otoml.P=
arser.from_string_result "foo =3D ["=
 ;;
- : (Otoml.t, string) result =3D
Error
 "Syntax error on line 1, character 8: Malf=
ormed array (missing closing square bracket?)\n"

utop # Otoml.Parser.from_string_resu=
lt "foo =3D {bar " ;;
- : (Otoml.t, string) result =3D
Error
 "Syntax error on line 1, character 12: Key=
 is followed by end of file or a malformed TOML construct.\n"

Looking up nested values

Nested sections are common in configs and should be easy to work with. This= is how you do it in OTOML:

utop # let t =3D Otoml.Parser.from_string "[this.is.a.deeply.nested.table]
answer=3D42";;
val t : Otoml.t =3D
  Otoml.TomlTable
   [("this",
     Otoml.TomlTable...

utop # Otoml.find t Otoml.get_integer ["=
this"; "is"; "a"; "deeply"=
; "nested"; "table"; "answer"] ;;
- : int =3D 42

For comparison, this is how it was done in To.ml:

utop # let toml_data =3D=
 Toml.Parser.(from_string "
[this.is.a.deeply.nested.table]
answer=3D42" |> unsafe);;
val toml_data : Typ=
es.table =3D <abstr>

utop # Toml.Lenses.(get toml_data (
  key "this" |-- table
  |-- key "is" |-- table
  |-- key "a" |-- table
  |-- key "deeply" |-- table
  |-- key "nested" |-- table
  |-- key "table" |-- table
  |-- key "answer"|-- int ));;
- : int option =3D Some 42

Extra dependencies

The TOML spec includes first-class RFC3339 dates, for better or worse. The = irony is that most uses of TOML (and, indeed, most configuration files in the world) don't need that, so it's arg= uably a feature bloat=E2=80=94but if we set out to support TOML as it's defined, that question is academic.

The practical implication is that if the standard library of a language doe= sn't include a datetime type, a TOML library has to decide how to represent those values. To.ml makes ISO8601 a = hard dependency, so if you don't use dates, you end up with a useless dependency. And if you prefer another libr= ary (or need functionality no present in ISO8601), you end up with two libraries: one you chose to use, and one more= forced on you.

Same goes for the arbitrary precision arithmetic. Most configs won't need i= t, but the standard demands it, so something needs to be done.

Luckily, in the OCaml land we have functors, so it's easy to make all these= dependencies pluggable. So I made it a functor that takes three modules.

module Make (I : TomlIntege=
r) (F : TomlFloat) (D : TomlDateTomlImplementation with type toml_integer =3D I.=
t and type toml_float =3D F.t and type=
 toml_date =3D D.t

This is how to use Zarith for big integers and keep the rest unchanged:

(* No signature ascription:
   `module BigInteger : Otoml.Base.TomlInte=
ger` would make the type t abstract,
   which is inconvenient.
 *)<=
/span>
module BigInteger =3D struct
  type t =3D Z.t
  let of_string =3D Z=
.of_string
  let to_string =3D Z=
.to_string
  let of_boolean b =3D if b then Z.one else Z.zero
  let to_boolean n =3D (n <> Z.zero)
end

module MyToml =3D Oto=
ml.Base.Make (BigInteger) (Otoml.Base.OCamlFloat) (Otoml.Base.StringDate)

Printing

To.ml's printer can print TOML at you, that's for certain. No indentation, = nothing to help you navigate nested values.

utop # let toml_data =3D=
 Toml.Parser.(from_string "[foo.bar]\nbaz=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2=
]" |> unsafe) |>
Toml.Printer.string_of_table |> print_endline;;
[foo.bar]
baz =3D false
[foo.quux]
xyzzy =3D [1, 2]

We can do better:

utop # let t =3D Otoml.Parser.from_string "[foo.bar]\nbaz=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2]" |>
Otoml.Printer.to_channel ~indent_width:4 ~collapse_tables:false stdou=
t;;

[foo]

[foo.bar]
    baz =3D false

[foo.quux]
    xyzzy =3D [1, 2]
val t : unit =3D ()

utop # let t =3D Otom=
l.Parser.from_string "[foo.bar]\nbaz=
=3Dfalse\n [foo.quux]\n xyzzy =3D [1,2]" |>
Otoml.Printer.to_channel ~indent_width:4 ~collapse_tables:false ~indent_subtables:true stdout;;

[foo]

    [foo.bar]
        baz =3D false

    [foo.quux]
        xyzzy =3D [1, 2]
val t : unit =3D ()

Maintenance practices

Last but not least, good maintenance practices are also important, not just= good code. To.ml is at 7.0.0 now. It has a CH= ANGES.md file, but I'm still to see the maintainers document what the breaking change is, who's affected, and what they should = do to make their code compatible.

For example, in 6.0.0 the breaking change was a rename from TomlLense= s to Toml.Lenses. In an earlier release, I remember the opposite rename. Given the standard compatibility problems goi= ng unfixed for years, that's like rearranging furniture when the roof is leaking.

I promise not to do that.

Conclusion

I hope this library will help make TOML a viable configuration file format = for OCaml programs.

It's just the first version of course, so there's still room for improvemen= t. For example, the lexer is especially ugly: due to TOML being highly context-sensitive, it involves massive amoun= ts of lexer hacks for context tracking. Maybe ocamllex is a wrong tool for the job abd it should be replaced with s= omething else (since I'm using Menhir's incremental API anyway, it's not tied to any lexer API).

The printer is also less tested than the parser, so there may be unhandled = edge cases. It also has some cosmetic issues like newlines between parent and child tables.

Any feedback and patches are welcome!

soupault: a static website generator based on HTML rewriting

Daniil Baturin announced

soupault 3.0.= 0 is now available.

It now uses the new OTOM= L library for loading the configs, which has some positive side effects, e.g. keys in the output of soupault --show-eff= ective-config (that shows your config plus default values you didn't set explicitly) now come in the same order as in = your config file.

It also provides TOML and YAML parsing functions to Lua plugins and has col= ored log headers (can be disabled with NO_COLOR environment variables).

OCaml 4.13.0, second alpha release

octachron announced

The release of OCaml 4.13.0 is approaching. We have released a second alpha= version to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the i= nstallation instructions). You can see the progress on this front at https://github.com/ocaml/opam-repository/issues/18791 .

Beyond the usual bug fixes (see the full list below), this second alpha int= egrates a new feature for native code: poll points. Those poll points currently fixes some issues with signals in = non-allocating loops in native code. More importantly, they are prerequisite for the multicore r= untime.

Another change is the removal of the removal of interbranch propagation of = type information. The feature, already postponed from 4.12, has been removed to focus for now= on better error message in the -principal mode.

If you find any bugs, please report them here:

https://github.com/ocaml/= ocaml/issues

The first beta release may follow soon since the opam ecosystem is in quite= good shape; and we are on track for a full release in September.

Happy hacking, Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.13.0~alpha2 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-reposi=
tory.git

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.13.0~a=
lpha2+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.13.0~alpha2+flambda+nffa
--packages=3Docaml-variants.4.13.0~alpha2+options,ocaml-option-flambda,ocam=
l-option-no-flat-float-array
--repositories=3Ddefault,beta=3Dgit+=
https://github.com/ocaml/ocaml-beta-repository.git

All available options can be listed with "opam search ocaml-option".

If you want to test this version, it is advised to install the alpha opam r= epository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-ka=
te/opam-alpha-repository.git

This alpha repository contains various fixes in the process of being upstre= amed.

The source code for the alpha is also available at these addresses:

Changes since the first alpha release

New feature
  • 10039: Safe= points Add poll points to native generated code. These are effectively zero-sized allocations and fix some signal and remembered set issues. Also multicore prerequisite. (Sadiq Jaffer, Stephen Dolan, Damien Doligez, Xavier Leroy, Anmol Sahoo, Mark Shinwell, review by Damien Doligez, Xavier Leroy, and Mark Shinwell)
New bug fixes
  • 10449: Fix = major GC work accounting (the GC was running too fast). (Damien Doligez, re= port by Stephen Dolan, review by Nicol=C3=A1s Ojeda B=C3=A4r and Sadiq Jaff= er)
  • 10454: Chec= k row_more in nondep_type_rec. (Leo White, review by Thomas Refis)
  • 10468: Corr= ectly pretty print local type substitution, e.g. type t :=3D …, with= -dsource (Matt Else, review by Florian Angeletti)
  • 10461, 10498: caml_s= end* helper functions take derived pointers as arguments. Those mus= t be declared with type Addr instead of Val. Moreover, poll point insertion= must be disabled for caml_send*, otherwise the derived pointe= r is live across a poll point. (Vincent Laviron and Xavier Leroy, review by= Xavier Leroy and Sadiq Jaffer)
  • 10478: Fix = segfault under Windows due to a mistaken initialization of thread ID when a= thread starts. (David Allsopp, Nicol=C3=A1s Ojeda B=C3=A4r, review by Xavi= er Leroy)
  • 9525, 10402: ocamldoc only = create paragraphq at the toplevel of documentation comments (Florian Angele= tti, report by Hendrik Tews, review by Gabriel Scherer)
  • 10206: Spli= t labels and polymorphic variants tutorials Splits the labels and polymorphic variants tutorial into two. Moves the GAD= Ts tutorial from the Language Extensions chapter to the tutorials. (John Whitington, review by Florian Angeletti and Xavier Leroy)
Removed feature
  • [ breaking change ] 9811: remove propagation from previous branches Type informa= tion inferred from previous branches was propagated in non-principal mode. = Revert this for better compatibility with -principal mode. For the time bei= ng, infringing code should result in a principality warning. (Jacques Garri= gue, review by Thomas Refis and Gabriel Scherer)

The up-to-date list of changes for OCaml 4.13 is available at https://github.com/ocaml/oc= aml/blob/4.13/Changes .

OCamlFormat 0.19.0

Guillaume Petiot announced

We are happy to announce the release of OCamlFormat 0.19.0.

OCamlformat is an auto-formatter for OCaml code, writing the parse tree and= comments in a consistent style, so that you do not have to worry about formatting it by hand, and to speed up code = review by focusing on the important parts.

OCamlFormat is beta software. We expect the program to change considerably = before we reach version 1.0.0. In particular, upgrading the `ocamlformat` package will cause your program to = get reformatted. Sometimes it is relatively pain-free, but sometimes it will make a diff in almost every fil= e. We are working towards having a tool that pleases most usecases in the OCaml community, please bear with us!

To make sure your project uses the last version of ocamlformat, please set

version=3D0.19.0

in your .ocamlformat file.

Main changes in ocamlformat.0.19.0 are:

  • OCaml 4.13 features are supported
  • ppxlib dependency has been dropped
  • A new line-endings=3D{lf,crlf} option has been added for w= indows compatibility

Here is the full list of changes.

We encourage you to try ocamlformat, that can be installed from opam direct= ly ( opam install ocamlformat ), but please remember that it is still beta software. We have a FAQ for new users that should help you decide if ocamlformat is the right choice for you.

Nicol=C3=A1s Ojeda B=C3=A4r then added

A new line-endings=3D{lf,crlf} option has been added for windo= ws compatibility

Just to expand a bit on this feature: previously, ocamlformat = would use the system EOL convention (ie LF on Unix-like OSs and CRLF on Windows). This meant that if you applied oc= amlformat on systems with different EOL conventions, you would get a diff on every line on every file purely due to= the changed newlines. Furthermore, this meant ocamlformat was hard to use if your project used LF on W= indows (a common usage).

With the new option, ocamlformat enforces a given EOL conventi= on. The system EOL convention is no longer used for any purpose and the EOL convention used is the one specified in ocaml= format's config (LF by default).

OCaml Caf=C3=A9: Wed, Aug 4 @ 7pm (U.S. Central)

Michael Bacarella announced

Please join us at the next OCaml Cafe, a friendly, low stakes opportunity t= o ask questions about the OCaml language and ecosystem, work through programming problems that you=E2=80=99re stuck = on, and get feedback on your code. Especially geared toward new and intermediate users, experienced OCaml developers will= be available to answer your questions. Bring your code and we=E2=80=99ll be happy to review it, assist with debugg= ing, and provide recommendations for improvement.

This month, OCaml Caf=C3=A9 will consist of two parts. First, Rudi Grinberg= of OCaml Labs will present an informal introduction to Dune, the OCaml build system. Learn about Dune from one the people developing it. Following Rudi=E2=80=99s presentation, we will op= en the discussion to all things OCaml-related.

Full Zoom meeting details here.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B5924E006A for ; Tue, 27 Jul 2021 10:54:47 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=qUU4=MT=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3Ayq/aaxSM/tzeyD1/kHO5kuMF7tpsoueZAWYlg6H?= =?us-ascii?q?Pa5pwe6iut67vIFbYra00ygOTBcOHtbkV2qL/iOPJYSQ4+5GPsXQPItRndiQur?= =?us-ascii?q?oEopTEmG9OPEkbhLfTnPGQQFcVGU0J5rTngaRAGUMnxaEfPrXKs8DUcBgvwNRZ?= =?us-ascii?q?vJuTyB4Xek9m72/q99pHNfwlEnjWwbLJ9IBiyqQjaq9Ubj5ZlJqst0BXCv2FGe?= =?us-ascii?q?/5RxWNmJFKTmwjz68Kt95N98Cpepuws+ddYXar1Y6o3Q7pYDC87M28u/83kqQP?= =?us-ascii?q?DTQqU6XQCVGgdjwdFDBLE7BH+WZfxrzf6u+9g0ySUIcH6UbY5Uiml4Kl2VR/ok?= =?us-ascii?q?z8HOCAl/2HLhMJwi6dbrwigpxx53oXYZI6YOf57cq7bfd8URmxBXthQVyxaA4O?= =?us-ascii?q?zdI8PAPQcNudWqIn9vUYBrQCjDgWoCu7j1jpEi3nr1qM4zushCxnL0gw+EdwTv?= =?us-ascii?q?nrar9r6O7sJXO+v0KXF1y/OY+9K1Tr/7oXDbxAvoeuLXbJ1acfc1U0vGBnDjl6?= =?us-ascii?q?NtILqIzOV1uEMs2iH8+prSOWihHQjqw5rpDij3NwshZXJhoIQy1DE6Tl5zZ0tJ?= =?us-ascii?q?d2/TE56YcKkH4VMuCGaMYt2Q9oiQ3x2tyogzb0Go5G7cTEMxZ86yBHRd+aJfJK?= =?us-ascii?q?U4hL/SumROzF4iWprdb+jhBu8/1WtxOPhW8So0VtHoC5In9jQun0T2RLd5ceKR?= =?us-ascii?q?/ph80u91zuDyRze5O5aLUwpm6TWN5EszqIsm5cdt0nIAyH4mELzjKCMd0Uk/PC?= =?us-ascii?q?l6/z5bbX6p5+cK5F7ihn5MqQrn8ywH/40Mg4QUGiH4ei806Hs8lf8QLVOlPE2l?= =?us-ascii?q?bPZsJ/CKcQUp665Hw9V0ps45BqlEzim19EYkWEILFJEZBKHj5XpNErULPD5Cve?= =?us-ascii?q?zm1OsnytxyPDDOr3hBo/CIWPYkLv7fLZ97FZQyBY9zNBe+5JUFq8OIOjpVkDts?= =?us-ascii?q?9zYCwc1MxC6wubmFNVyyoMeVXiTAq+HKK/SsEKH5+IrI+mIfoMVvyz9K/cj6vX?= =?us-ascii?q?zjnE5gUcQcbS30ZYTcny0A+hqLkqDbXfintsNC2kHswUmQOHulVGOSyNfanSsU?= =?us-ascii?q?64m+z02Cp6qAZ3dSo2jjrGM2jqwEIdMaWBcEF+MFG/ld4WaVPcIbyKfOsphkzM?= =?us-ascii?q?ZWbS7U48h0hWutQ/my7V5MuXU+isYtZP61Nho+eLfjxYy9SZ7D8iF0mGNSX97n?= =?us-ascii?q?n8QSjMrwqxypVZxxkqf3aV3mfBVG8Bf6+lHXwo1LZLcyvZ1C9H2WgLPZNeJT1O?= =?us-ascii?q?mT827Dz8tU9w938cDY19zFNqsgR3Oxy2kDaENmryTA5w09qLd32TvKMlhy3bG0?= =?us-ascii?q?qghj0A7QsRRL2GmgbR/9wfLCoHTl0WWjaCqeb4H3CHR9GeDyGuOvF1EUANrSqr?= =?us-ascii?q?FWm0fZk3Kotvn/UPOVbquBLsoMwdbzs6CMKRKZsXzjVpaXPfjJMjeY2WplmisH?= =?us-ascii?q?xmIw7eMYJPue2UcxyXdFFMJkxsT/HaDLQgxHD2to2PYDDx0FFLgeVng8edkqCD?= =?us-ascii?q?zckhhhQWVaQcpg76q/DYRmvraTf4PiPZM8iw+rX88VAK2wNT+D9ubuxEnfalNZ?= =?us-ascii?q?dd7501IgyaRvAV4OtmkLrt+rl8YaQV++U30hDttDYAVuMwjqjsRxwp3KL6EmAd?= =?us-ascii?q?Iczqem4v7OrjWNnXa5BererLb0VHY0c+L9+EI8vtu+Aarhx2gCkd3qyYv6NJSy?= =?us-ascii?q?XbJucSi5OU6W5XsVE067F5/+6GcZTMytdq8PZhEKa6woyPP0NIvBfI4x1CnZdg?= =?us-ascii?q?Nacts9Sf3A5RcH8+qOfAnkFivbwsZMaZV7qFmZqub?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Ap+Qmy6GESFIfnDMkpLqEwceALOsnbusQ8zAX?= =?us-ascii?q?PhhKOHlomszxra+TdYcgpHvJYVcqKQodcL+7Scq9qB/nmKKdgrNhR4tKPjOW2l?= =?us-ascii?q?dARbsKheCJ/9SKIUPDH5tmtZuIBJIeNDSfNzRHZI3BkW6F+p4bsb+6GLbBv5am?= =?us-ascii?q?855Cd3ATV51d?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BpAgA9yf9gfSIeaIFaEwEBg3BTRwFfB?= =?us-ascii?q?VcWJCcKAoRFiQSIX4MohXOGVYd3hBCBEQNPEAEDAQ0qAQUOAQIEAQGEBFQCgn0?= =?us-ascii?q?CHgYBBTMTAgQVAQEFAQEBAgEDAwQBEwEBDxkISIVoDYI1DAwDA4N3ARgBCAplI?= =?us-ascii?q?wMUAQYDAhEBFwEUCgMBEwESFAYBgleDBwQBAweMY5wKgTKBAYNNAQMDDQMBDgk?= =?us-ascii?q?mhCOBEVINAhSBABeFblNIAYJqCINwAicQgVVEgRWCJFFugVIxSAwLAQEBAQEXg?= =?us-ascii?q?REBEQIBCBQNLYJhF4JNBIJNDgszAQEGKgwjLgsfAQEFGwIkEi0HBAEKGREVCgQ?= =?us-ascii?q?sHgEKOAIDjhSCdDEeB4wDgy+HBYJPkWosB4MpgTEGC4dggRWHOoUDboVsgR2DY?= =?us-ascii?q?0GBBooYlyEhlWqCHIZSCIECCYIzgz2DKIxnBwQEDoUagU0qgQ0/HgwHMxowQ4I?= =?us-ascii?q?1ATMJYA6OCSIWg0+CZIF1O4Jdgm8/MgIBAQENJgIGAQoBAQMJdQEBBRMLAYl0A?= =?us-ascii?q?QE?= X-IPAS-Result: =?us-ascii?q?A0BpAgA9yf9gfSIeaIFaEwEBg3BTRwFfBVcWJCcKAoRFiQS?= =?us-ascii?q?IX4MohXOGVYd3hBCBEQNPEAEDAQ0qAQUOAQIEAQGEBFQCgn0CHgYBBTMTAgQVA?= =?us-ascii?q?QEFAQEBAgEDAwQBEwEBDxkISIVoDYI1DAwDA4N3ARgBCAplIwMUAQYDAhEBFwE?= =?us-ascii?q?UCgMBEwESFAYBgleDBwQBAweMY5wKgTKBAYNNAQMDDQMBDgkmhCOBEVINAhSBA?= =?us-ascii?q?BeFblNIAYJqCINwAicQgVVEgRWCJFFugVIxSAwLAQEBAQEXgREBEQIBCBQNLYJ?= =?us-ascii?q?hF4JNBIJNDgszAQEGKgwjLgsfAQEFGwIkEi0HBAEKGREVCgQsHgEKOAIDjhSCd?= =?us-ascii?q?DEeB4wDgy+HBYJPkWosB4MpgTEGC4dggRWHOoUDboVsgR2DY0GBBooYlyEhlWq?= =?us-ascii?q?CHIZSCIECCYIzgz2DKIxnBwQEDoUagU0qgQ0/HgwHMxowQ4I1ATMJYA6OCSIWg?= =?us-ascii?q?0+CZIF1O4Jdgm8/MgIBAQENJgIGAQoBAQMJdQEBBRMLAYl0AQE?= X-IronPort-AV: E=Sophos;i="5.84,272,1620684000"; d="scan'208,217";a="389065180" X-MGA-submission: =?us-ascii?q?MDF7uu7H81lpCsyrSOrgV2d/o++yqY3EZKUOLV?= =?us-ascii?q?G4SttsUCI1B9Nn5/JaGqxodCATD+Sb9q921jVubkXMNycaQW75M7nIvn?= =?us-ascii?q?iR4iKEWzgf6dhig0ONXC7OXsr9VyNZs6FRVSEikvmaOwBIayPczRqRpL?= =?us-ascii?q?xQYzEZcfAAEHWzcahCavy48w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 27 Jul 2021 10:54:45 +0200 Received: from set (91-172-170-233.subs.proxad.net [91.172.170.233]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1AA7E564825; Tue, 27 Jul 2021 10:54:42 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 27 Jul 2021 10:54:41 +0200 Message-ID: <87fsw06sry.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 27 10:54:44 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.312683, queueID=0CDC156486C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 20 to 27, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 pyre-ast: full-fidelity Python parser in OCaml OCaml+Opam Images for Docker for Windows Borns a stream talking about OCaml/Reason & ReScript language An Update on the State of the PPX Ecosystem and `ppxlib''s Transition How to send email from Dream Old CWN pyre-ast: full-fidelity Python parser in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jia Chen announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 I am happy to announce the initial opam release of [`pyre-ast'], a Python parsing library. The library features its full-fidelity to the official Python spec. Apart from a few technical edge cases, as long as a given file can be parsed/rejected by the CPython interpreter, `pyre-ast' will be able to parse/reject it as well. Furthermore, abstract syntax trees obtained from `pyre-ast' is guaranteed to 100% match the results obtained by Python's own `ast.parse' API, down to every AST node and every line/column number. Another notable feature of this library is that it represents the Python syntax using the *tagless-final style*. This style typically offers more flexibility and extensibility for the downstream consumers of the syntax, and allow them to build up their analysis without explicitly constructing a syntax tree. That said, for developers who are less familiar with the tagless-final approach, we also offer alternative interfaces that operates on traditional syntax tree represented as algebraic data types. Documentation of the library can be found [here]. The reason why we can can claim full-conformance with CPython is really simple: the library is, under the hood, merely an OCaml wrapper around the parsing logic in CPython source code. The project was initially motivated to replace the custom `menhir'-based parser currently used in the Pyre type checker (hence the name), but I figured that it would be useful to release this as a standalone `opam' package to the community so other static Python analyzers or other DSLs with Python-based syntax can leverage it as well. The library has yet to be put into production for Pyre (I'm working on it though) so please do expect bugs/jankiness at times. Feedback and bug reports are very welcomed. Happy parsing! [`pyre-ast'] [here] OCaml+Opam Images for Docker for Windows =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Antonin D=C3=A9cimo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm glad to announce the availability of OCaml and opam [native Windows Container][windows-containers] images for Docker for Windows. This is the result of my hard work at Tarides, with precious help from @dra27, @talex5, @avsm, and the rest of the team. They can be found under the [ocaml/opam][hub] repository in the Docker Hub. Try them with [Docker for Windows][docker-for-windows]! Be sure to [switch Docker to Native Windows Containers][enable-native]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 docker run -it ocaml/opam:windows-mingw =E2=94=82 docker run -it ocaml/opam:windows-msvc =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We provide images for the mingw-w64 (from OCaml 4.02 to 4.12) and the MSVC (from OCaml 4.06 to 4.12) ports. They are based on each release of Windows 10 amd64 currently supported by [Microsoft on the Docker Hub][mcr]. The images use opam 2.0, and we plan to update to opam 2.1 when it's released. The images also ship a [Cygwin][cygwin] installation, [Git for Windows][git-for-windows], and the [winget package manager][winget]. We use @fdopen's [OCaml for Windows][ocaml-for-windows] distribution and opam-repository fork. As it is getting deprecated at the end of August 2021, we'll transition to opam 2.1 and the standard opam-repository when that happens. In order to get the correct environment for any `RUN' command involving OCaml or opam, prefix the command with =E2=80=A2 `ocaml-env exec --64 --' if based on mingw-w64; or =E2=80=A2 `ocaml-env exec --64 --ms=3Dvs2019 --' if based on MSVC. The images are built at , using an [OCurrent][ocurrent] pipeline that [builds Docker images][docker-base-images]. You can rebuild them yourself using the [OCluster][ocluster] set of tools that I have ported to Windows. We provide a comprehensive set of tags (replace _port_ with either _mingw_ or _msvc_): =E2=80=A2 `windows-port': the latest version of OCaml for each Windows version; =E2=80=A2 `windows-port-winver': the latest version of OCaml for Windows = 10 _winver_; =E2=80=A2 `windows-port-ocaml-mlver': OCaml version _mlver_ for each Wind= ows version; =E2=80=A2 `windows-port-winver-ocaml-mlver': OCaml version _mlver_ for Wi= ndow 10 _winver_. When the Windows version is not specified in the tag, the image is a multiarch image that will work on every supported version of Windows 10. Docker automatically selects the appropriate one based on the host version. We will be using these images in the upcoming `ocaml-ci' and `opam-repo-ci' for Windows. Further work on these include the transition to opam 2.1, and we'll provide the Cygwin port of OCaml when it's fixed upstream and available in the Cygwin package repository. Happy hacking! Borns a stream talking about OCaml/Reason & ReScript language =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: David Sancho announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm very excited to announce starting a new show in Twitch to bring OCaml, Reason and ReScript community best brains to casually talk. It's called emelleTV It's made by [@fakenickels] and myself [@davesnx], and we will try to do our best! Our first guest is [@___zth___] We go live on [http://twitch.tv/emelletv] next Wednesday. Subscribe to not miss it! Thanks for reading, hope to see you there! [@fakenickels] [@davesnx] [@___zth___] [http://twitch.tv/emelletv] An Update on the State of the PPX Ecosystem and `ppxlib''s Transition =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Sonja Heinze announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I hope you're all having a nice summer (or a nice whichever season you're in, of course)! We've set up a new [wiki page on the ppxlib repository] containing a status overview of the current `ppxlib' transition, which aims at keeping the PPX ecosystem always up-to-date. We'll keep that wiki page up-to-date, as well. @jeremiedimino and @NathanReb have already explained our three-part plan for this transition in different posts here on discuss. Nothing has changed in that plan, but it has been a while since we [last posted about the overall transition] and even longer since we [last posted about the `Astlib' transition in detail]. So if you want, you can refresh your memory about that transition and get updated about its current state (in more detail than the new wiki page) by reading this post. [wiki page on the ppxlib repository] [last posted about the overall transition] [last posted about the `Astlib' transition in detail] Which Issues `ppxlib' was Facing =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C With `ocaml-migrate-parsetree' (`OMP'), the PPX ecosystem became cross-compiler-compatible. With `ppxlib', the latest compiler features were supported more easily and broadly within the PPX ecosystem, while `ppxlib' also brought along other improvements such as the one in performance and the clear composition semantics when using several PPXs. With that, both `OMP' and `ppxlib' have taken away several maintenance burdens from the PPX maintainers and have created a more homogeneous and up-to-date PPX ecosystem. However, we were facing the following issues: 1. To keep the PPX ecosystem cross-compiler compatible 1. `ppxlib' was handling parts of the unstable `compiler-libs' API to abstracting them away; 2. the `OMP~/~ppxlib' maintainers needed to keep the AST migration information up-to-date by coordination with the compiler devs. 2. To guarantee new feature support, `ppxlib' needed to bump the `ppxlib' AST to the newest version. 3. Bumping the AST implies a breaking change. That was an issue for a homogeneous and up-to-date PPX ecosystem. 4. Not all PPXs migrated from `OMP' to `ppxlib'. That was also an issue for a homogeneous and up-to-date PPX ecosystem. Some time ago, there was the very ambitious plan of tackling Issues 1, 2, and 3 all at once by writing a stable AST abstraction and upstreaming it to the compiler. That plan has been put on ice for now. Instead we're currently on track with a more down-to-earth plan, outlined below. Tackling the Issues in Three Parts =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C The plan we're currently following contains three simultaneous parts. It approaches three of the four issues I've pointed out above. However, it leaves the need to bump the AST (Issue 2) untouched. Part One: `Astlib' as an Interface between `ppxlib' and the Compiler =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84 The first part works towards continuous cross-compiler compatibility (Issue 1 above) while making the situation of still having PPXs based on `OMP' (Issue 4 above) even more of a problem. It consists of implementing an interface module called `Astlib' between `ppxlib' and the compiler, then upstreaming it to the compiler. As long as `Astlib' is stable and up-to-date, the rest of `ppxlib' won't be affected by any compiler changes=E2=80=94neither by new AST versions nor by compiler library changes. The first step of this part of the plan was moving the `OMP' driver and other `OMP' features from `OMP' to `ppxlib'. That was done in August 2020, and it introduced `OMP2'. Since the PPX driver has to be unique, this was the start of having the PPX ecosystem split into the two incompatible worlds of `OMP1' PPXs on one hand and `ppxlib' PPXs on the other hand. By now, we have written [`Astlib' as an internal `ppxlib' library] and have reduced `ppxlib''s compiler library usage as much as possible to keep `Astlib' minimal. As you can see, it contains a minimal compiler library sub-API in addition to the former `OMP' modules of our supported ASTs and the migration information between them. We will upstream `Astlib' to the compiler asking for it to be kept stable and up-to-date, while also keeping our local copy for old compiler support. [`Astlib' as an internal `ppxlib' library] Part Two: Sending Patch PRs when Bumping the AST =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 So, thanks to Part One of the plan, `ppxlib' will always be compatible with the development compiler _OCaml trunk_ and the newest compiler version. However, to also support the newest compiler features, we need to bump the internal `ppxlib' AST to the newest version. That modifies some of the AST nodes and so it breaks any PPX that rewrites one of those nodes (Issue 3 above). Usually just a handful of PPXs are affected, but we still want them to be up-to-date. Our current plan doesn't provide a solution for that problem, but it does make handling the problem more efficient and, once again, it takes away the burden from the PPX maintainers. Since the AST bump to `4.10', whenever we bump the AST, we send patch PRs to the PPXs we break. Not much has changed since February, when @NathanReb last [explained our workflow of sending patch PRs] in detail. To some it up: we create a workspace with all `ppxlib' reverse dependencies on opam fulfilling a certain standard, which we call the _ppx-universe_. We then fix the PPXs that break all at once and open the PRs. Lately, the _ppx-universe_ has also proven very useful to make well-founded decisions regarding our API by having an easy look at our reverse dependencies. You can find a [_ppx-universe_ snapshot], currently from March, on our repo. In our experience, once the _ppx-universe_ is created and "builds up to the expected breakages," writing a couple of patches takes very little time, so we plan to make the tooling that creates and interacts with the workspace more sophisticated. [explained our workflow of sending patch PRs] [_ppx-universe_ snapshot] Part Three: Porting PPXs to Put an End to the "Split-World Situation" =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84 As explained above, Part One split the PPXs into the two incompatible worlds of `OMP1' PPXs on one hand and `ppxlib' PPXs on the other hand. That made the fact that some PPXs were still based on `OMP' (Issue 4 above) even more of a problem. For some PPX maintainers, the reason to avoid porting their PPXs to `ppxlib' was that `ppxlib' depended on `base' and `stdio', so we decided to tackle this situation by three means: =E2=80=A2 Dropping the `base' and the `stdio' dependencies, which was don= e in August last year. Now, all dependencies are the very basic `ocaml', `dune', `ocaml-compiler-libs', `stdlib-shims', `sexplib0' and `ppx_derivers'. =E2=80=A2 Porting and reviewing some of the most important PPXs ourselves= . So far we've ported `js_of_ocaml', `bisect_ppx', and `tyxml' with the help of the respective maintainers, and we've also reviewed several ports. =E2=80=A2 Spreading the word about the need to port PPXs and asking for h= elp. About a year ago, we made a non-exhaustive [list of PPXs that needed to be ported]. Since then, this community has proven to be awesome and there has been an amazing porting effort by a lot of people. So by now, all packages on that list have been ported with the exception of one(*). So hopefully the "split world" situation can soon be considered past. :tada: By the way, thanks to all involved in porting PPXs to `ppxlib'! It has been a great joint effort so far. :heart: And if anyone still has or comes across a project somewhere that needs porting and wants to port it, that's awesome! You can find the full list of opam packages that are still stuck in the `OMP1' world by [filtering for them in opam's health check pipeline]. However, notice that that's a generated list, so it also contains libraries that intrinsically form part of the `OMP1' ecosystem (such as `ppx_tools_versioned'), PPXs that have already been ported but haven't relesed their port on opam yet (such as `graphql_ppx'), deprecated PPXs that aren't marked as deprecated yet (such as `mirage-dns'), and several PPXs that only transitively depend on `OMP1'. (*) `ppx_import' has a PR for a port to `ppxlib', but it's not quite ready to be merged just yet. [list of PPXs that needed to be ported] [filtering for them in opam's health check pipeline] How to send email from Dream =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Joe Thomas announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99ve written a short [blog post ] about what I learned building s= imple email features for a web server written in the Dream framework. The accompanying source code is available here: I=E2=80=99m interested in adding more examples and tutorials to the OCaml ecosystem and would be happy to get your feedback, positive or negative, on this write-up (here or via email/github/discord). [blog post ] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of July 20 to 27, 2021.

pyre-ast: full-fidelity Python parser in OCaml

Jia Chen announced

I am happy to announce the initial opam release of pyre-ast= , a Python parsing library.

The library features its full-fidelity to the official Python spec. Apart f= rom a few technical edge cases, as long as a given file can be parsed/rejected by the= CPython interpreter, pyre-ast will be able to parse/reject it as well.= Furthermore, abstract syntax trees obtained from pyre-ast is guaranteed to 100% match the r= esults obtained by Python's own ast.parse API, down to every AST node and every line/colum= n number.

Another notable feature of this library is that it represents the Python sy= ntax using the tagless-final style. This style typically offers more flexibility an= d extensibility for the downstream consumers of the syntax, and allow them to build up their analys= is without explicitly constructing a syntax tree. That said, for developers who are le= ss familiar with the tagless-final approach, we also offer alternative interfaces that opera= tes on traditional syntax tree represented as algebraic data types.

Documentation of the library can be found here.

The reason why we can can claim full-conformance with CPython is really sim= ple: the library is, under the hood, merely an OCaml wrapper around the parsing logic in CPy= thon source code. The project was initially motivated to replace the custom menhir-based parser currently used in the Pyre type checker (hence the name), but I figured that it would= be useful to release this as a standalone opam package to the community so = other static Python analyzers or other DSLs with Python-based syntax can leverage it as well.

The library has yet to be put into production for Pyre (I'm working on it t= hough) so please do expect bugs/jankiness at times. Feedback and bug reports are very welcom= ed.

Happy parsing!

OCaml+Opam Images for Docker for Windows

Antonin D=C3=A9cimo announced

I'm glad to announce the availability of OCaml and opam [native Windows Container][windows-containers] images for Docker for Windows. This is the r= esult of my hard work at Tarides, with precious help from @dra27, @talex5, @avsm, and the re= st of the team.

They can be found under the [ocaml/opam][hub] repository in the Docker Hub.= Try them with [Docker for Windows][docker-for-windows]! Be sure to [switch Docker to Nati= ve Windows Containers][enable-native].

docker run -it ocaml/opam:windows-mingw
docker run -it ocaml/opam:windows-msvc

We provide images for the mingw-w64 (from OCaml 4.02 to 4.12) and the MSVC = (from OCaml 4.06 to 4.12) ports. They are based on each release of Windows 10 amd64 currentl= y supported by [Microsoft on the Docker Hub][mcr]. The images use opam 2.0, and we plan to= update to opam 2.1 when it's released. The images also ship a [Cygwin][cygwin] installatio= n, [Git for Windows][git-for-windows], and the [winget package manager][winget].

We use @fdopen's [OCaml for Windows][ocaml-for-windows] distribution and op= am-repository fork. As it is getting deprecated at the end of August 2021, we'll transiti= on to opam 2.1 and the standard opam-repository when that happens.

In order to get the correct environment for any RUN command in= volving OCaml or opam, prefix the command with

  • ocaml-env exec --64 -- if based on mingw-w64; or
  • ocaml-env exec --64 --ms=3Dvs2019 -- if based on MSVC.

The images are built at https= ://base-images.ocamllabs.io/, using an [OCurrent][ocurrent] pipeline that [builds Docker images][docker-base-images]. You can rebuild t= hem yourself using the [OCluster][ocluster] set of tools that I have ported to Windows.

We provide a comprehensive set of tags (replace p= ort with either mingw or msvc):

  • windows-port: the latest version of OCaml for each Windows= version;
  • windows-port-winver: the latest version of OCaml for Windo= ws 10 winver;
  • windows-port-ocaml-mlver: OCaml version mlver for each Windows version;
  • windows-port-winver-ocaml-mlver: OCaml version mlver for Window 10 winver<= /span>.

When the Windows version is not specified in the tag, the image is a multia= rch image that will work on every supported version of Windows 10. Docker automatically se= lects the appropriate one based on the host version.

We will be using these images in the upcoming ocaml-ci and opam-repo-ci for Windows.

Further work on these include the transition to opam 2.1, and we'll provide= the Cygwin port of OCaml when it's fixed upstream and available in the Cygwin package repos= itory.

Happy hacking!

Borns a stream talking about OCaml/Reason & ReScript langu= age

David Sancho announced

I'm very excited to announce starting a new show in Twitch to bring OCaml, = Reason and ReScript community best brains to casually talk. It's called emelleTV

It's made by @fakenickels a= nd myself @davesnx, and we will try to do= our best!

Our first guest is @___zth___

3D=

We go live on http://twitch.tv/emelle= tv next Wednesday. Subscribe to not miss it!

Thanks for reading, hope to see you there!

An Update on the State of the PPX Ecosystem and ppxlib's Transition

Sonja Heinze announced

I hope you're all having a nice summer (or a nice whichever season you're i= n, of course)! We've set up a new wiki page on the ppxlib repository containing a status overview of the current ppxlib transition,= which aims at keeping the PPX ecosystem always up-to-date. We'll keep that wiki page up-to-date, as w= ell.

@jeremiedimino and @NathanReb have already explained our three-part plan fo= r this transition in different posts here on discuss. Nothing has changed in that plan, but i= t has been a while since we last posted about the overall transition and even longer since we last posted about the Astlib transition in detail. So if you want, you can refresh your memory about that transition and get updated about its cur= rent state (in more detail than the new wiki page) by reading this post.

Which Issues ppxlib was Facing

With ocaml-migrate-parsetree (OMP), the PPX ecosy= stem became cross-compiler-compatible. With ppxlib, the latest compiler features were supported more = easily and broadly within the PPX ecosystem, while ppxlib also brought along other improveme= nts such as the one in performance and the clear composition semantics when using several PPXs. Wi= th that, both OMP and ppxlib have taken away several maintenanc= e burdens from the PPX maintainers and have created a more homogeneous and up-to-date PPX ecosystem. However, we w= ere facing the following issues:

  1. To keep the PPX ecosystem cross-compiler compatible
    1. ppxlib was handling parts of the unstable compiler-l= ibs API to abstracting them away;
    2. the OMP~/~ppxlib maintainers needed to keep the AST migrat= ion information up-to-date by coordination with the compiler devs.
  2. To guarantee new feature support, ppxlib needed to bump th= e ppxlib AST to the newest version.
  3. Bumping the AST implies a breaking change. That was an issue for a homo= geneous and up-to-date PPX ecosystem.
  4. Not all PPXs migrated from OMP to ppxlib. Tha= t was also an issue for a homogeneous and up-to-date PPX ecosystem.

Some time ago, there was the very ambitious plan of tackling Issues 1, 2, a= nd 3 all at once by writing a stable AST abstraction and upstreaming it to the compiler. Tha= t plan has been put on ice for now. Instead we're currently on track with a more down-to-ea= rth plan, outlined below.

Tackling the Issues in Three Parts

The plan we're currently following contains three simultaneous parts. It ap= proaches three of the four issues I've pointed out above. However, it leaves the need to bump= the AST (Issue 2) untouched.

Part One: Astlib as an Interface between= ppxlib and the Compiler

The first part works towards continuous cross-compiler compatibility (Issue= 1 above) while making the situation of still having PPXs based on OMP (Issue = 4 above) even more of a problem. It consists of implementing an interface module called Astli= b between ppxlib and the compiler, then upstreaming it to the compiler. As long as Astlib<= /code> is stable and up-to-date, the rest of ppxlib won't be affected by any compil= er changes=E2=80=94neither by new AST versions nor by compiler library changes.

The first step of this part of the plan was moving the OMP dri= ver and other OMP features from OMP to ppxlib. That was done in August 2020,= and it introduced OMP2. Since the PPX driver has to be unique, this was the start of having the PPX ecosystem spl= it into the two incompatible worlds of OMP1 PPXs on one hand and ppxlib<= /code> PPXs on the other hand.

By now, we have written Astlib as an internal ppxlib library and have reduced ppxlib's compiler library usage as much as possible to keep Astlib mini= mal. As you can see, it contains a minimal compiler library sub-API in addition to the former OMP modules of our supported ASTs and the migration information between them. We will upstream= Astlib to the compiler asking for it to be kept stable and up-to-date, while also keeping= our local copy for old compiler support.

Part Two: Sending Patch PRs when Bumping the AST

So, thanks to Part One of the plan, ppxlib will always be comp= atible with the development compiler OCaml trunk and the newest compil= er version. However, to also support the newest compiler features, we need to bump the internal ppxlib AST to = the newest version. That modifies some of the AST nodes and so it breaks any PPX that rewrites one o= f those nodes (Issue 3 above). Usually just a handful of PPXs are affected, but we still = want them to be up-to-date.

Our current plan doesn't provide a solution for that problem, but it does m= ake handling the problem more efficient and, once again, it takes away the burden from the P= PX maintainers. Since the AST bump to 4.10, whenever we bump the AST, we send = patch PRs to the PPXs we break. Not much has changed since February, when @NathanReb last = ppx-universe. We then fix the PPXs that break all at once and open the PRs.

Lately, the ppx-universe has also proven v= ery useful to make well-founded decisions regarding our API by having an easy look at our reverse dependencies. You c= an find a ppx-universe snapshot, currently from March, on our repo.

In our experience, once the ppx-universe i= s created and "builds up to the expected breakages," writing a couple of patches takes very little time, so we plan = to make the tooling that creates and interacts with the workspace more sophisticated.

Part Three: Porting PPXs to Put an End to the "Split-= World Situation"

As explained above, Part One split the PPXs into the two incompatible world= s of OMP1 PPXs on one hand and ppxlib PPXs on the other hand. That made the f= act that some PPXs were still based on OMP (Issue 4 above) even more of a problem. For some = PPX maintainers, the reason to avoid porting their PPXs to ppxlib was that ppxlib depended on base and stdio, so we decided to tackle this situation by three means:

  • Dropping the base and the stdio dependencies,= which was done in August last year. Now, all dependencies are the very bas= ic ocaml, dune, ocaml-compiler-libs,= stdlib-shims, sexplib0 and ppx_derivers.
  • Porting and reviewing some of the most important PPXs ourselves. So far= we've ported js_of_ocaml, bisect_ppx, and = tyxml with the help of the respective maintainers, and we've also re= viewed several ports.
  • Spreading the word about the need to port PPXs and asking for help.

About a year ago, we made a non-exhaustive list of PPXs = that needed to be ported. Since then, this community has proven to be awesome and there has been an a= mazing porting effort by a lot of people. So by now, all packages on that list have been p= orted with the exception of one(*). So hopefully the "split world" situation can soon be c= onsidered past. :tada:

By the way, thanks to all involved in porting PPXs to ppxlib! = It has been a great joint effort so far. :heart: And if anyone still has or comes across a project so= mewhere that needs porting and wants to port it, that's awesome!

You can find the full list of opam packages that are still stuck in the OMP1 world by filtering for them in opam's health check pipeline. However, notice that that's a generated list, so it also contains libraries= that intrinsically form part of the OMP1 ecosystem (such as p= px_tools_versioned), PPXs that have already been ported but haven't relesed their port on opam yet (such a= s graphql_ppx), deprecated PPXs that aren't marked as deprecated yet (such as mirage-= dns), and several PPXs that only transitively depend on OMP1.

(*) ppx_import has a PR for a port to ppxlib, but= it's not quite ready to be merged just yet.

How to send email from Dream

Joe Thomas announced

I=E2=80=99ve written a short blog post about what I learned building simple email features for a web server written in the Drea= m framework. The accompanying source code is available here:

https://github.= com/jsthomas/dream-email-example

I=E2=80=99m interested in adding more examples and tutorials to the OCaml e= cosystem and would be happy to get your feedback, positive or negative, on this write-up (here or= via email/github/discord).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 28970E034C for ; Tue, 10 Aug 2021 18:47:47 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zH2E=NB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AxkZgsxE91jDddKVjMhRe351Gf8hKhN3EVzX9CrI?= =?us-ascii?q?Zgr5DOp6u447ldBSGo6k31BmWDM6Hu7ptsKn/i+jYQ2sO4JKM4jgpUadncFs7s?= =?us-ascii?q?/gQhBEqG8WfCEf2f7bAZi0+G9leBhc+pynoeUdaF9zjaFLMv3a88SAdGgnlNQp?= =?us-ascii?q?yO+/5BpPeg9642uys55HfeQdFiT6ybb59Lxi9sBncuNQRjYZ+MKg61wHHomFPe?= =?us-ascii?q?+RYxGNoIUyckhPh7cqu/5Bt7jpdtes5+8FPTav1caI4TadFDDs9KGA6+NfrtRj?= =?us-ascii?q?YQgSR4HYXT3gbnQBJAwjB6xH6Q4vxvy7nvedzxCWWIcv7Rq00VTqh6adrVh7oi?= =?us-ascii?q?DwGNzEi9GHYlNF7jaxcoBK7uhN/2JPfbIWbOfZie6/Qe84RS2hcUcZLTyFPAp2?= =?us-ascii?q?yYZYBAeQCMulXs5LwqEESoRakHwSgGP/jxz1Oi3Tr3aM6yeMhEQTe0QE8G9IBq?= =?us-ascii?q?nLUp8joOqgOUeC1yajIzSnfb/hL3jry8ozIfQonof2WRrJ/bcrRyUwuFwPZklW?= =?us-ascii?q?dspTlPzSR1uUNr2iU8fZvVeKpi24msgFxvyagyt0rionTiYIY01bJ/jh2z4gpP?= =?us-ascii?q?9O3UlJ7YcK6H5tKsSGXL5V7TMwjTmxqpCo0yqAKtJ67ciUWxpoqxgPSZfKJfYW?= =?us-ascii?q?M/B7vSeecLDZ2iX57Zb6zmhS//FSkx+HiSMS63khHoyRDn9LRuH4N0BnT5dKGS?= =?us-ascii?q?vt75kqhwSiA1xzS6uFYP080ja3bK5skwrEujJYTt1rMHjPulEXxkKCZbEAk+uy?= =?us-ascii?q?y5+TgeLXmqYeQN4B1igHiMqQuh9ewDf4kPQgJWmiX4f+81Lzs/U3hRLVFlPs2n?= =?us-ascii?q?rPesJDAKsQXvqq5DBFQ0ok59Rm/Eymp38gYnXUdMF1FfwiLj5XqO13WIPD4Eeu?= =?us-ascii?q?/g0ypkDh12/DGPrrhDYjWLnjClrfuZ6x960lByAov099f/YhYCqoGIP7rRkDxs?= =?us-ascii?q?9zYDgMlMwys2ernDdF92psDVm2RB6+ZN7nesVqM5u43P+aMZJUauDDyK/c7/P7?= =?us-ascii?q?il3o5lkIFcaip2psXdWy4Hul9LEqHe3bjntABEWISsgo5UOPlkliCUTpLZ3aoW?= =?us-ascii?q?KIw/C00CIWjDYvbR4CinbyA3CO/HpFMYWBGEF+MHHH1fIuHQ/cBcD+eLtFlnzA?= =?us-ascii?q?eSLStV4As2QuguQPm0bZqIOXZ9jUauJ/nztR44/PfmQsv+TF6EciRyWCAQ39yk?= =?us-ascii?q?2gVXTE5xrp/rlZ4ylqb0ah3nfhYFdtL6vNMXQY2KITQz/R9C9D2WgPBYsmGR0q?= =?us-ascii?q?mQtWgADExV88xzMEUb0Z6AdWigQjP3yusA7ALi7yGHIE4/rzY0nTrOspx13nL2?= =?us-ascii?q?LMvglU6WMdCO2KrirZ69wfJBo7Jl0uZl7ytdaQZxCPD6XuNw3eSsExAUQ9+U7v?= =?us-ascii?q?JU38Ha0XOsNn0/lvCT7iqCbUnLgtO19KNKqtMat3olFVGWensNM7ZY2KrlGe9H?= =?us-ascii?q?QyHxreWY4rsYWkdxznSCEgBkwAS4XaGKRMzCTymo2LDCjxhCUzgY1j2/el7p36?= =?us-ascii?q?6QVU4zwaQb01uz7a14AIaheSAS/MP2bIJoDsupC9xHFa5xt7WD9uApxF9fKhHe?= =?us-ascii?q?tM84FJH1XrDuABnP5ygKbpihl8EfAhtsUPuzUY/NoIV28w1qjlimA5tL4qcz1U?= =?us-ascii?q?HcT6Ei9S4cLbILCO6tESkdKj+3lDFzM3Q+6se7PB+rE/s6kXhHUMn9zBj0sJJ+?= =?us-ascii?q?3qa/JTDSgQIArzrVUNi3hxzofnhaSk45p/InSllNaCy9CTJ29coGPcN0hGkbst?= =?us-ascii?q?SO6OCFRbvHosdHcf4e79ioESgch9RZLMaz6UzJc7zLKPuME+DOfY52iqhiXVb7?= =?us-ascii?q?Yt91EOV6ic6TfTHjc9tKx6w1AyaUTzxlxGk7tCxnppLN2h69o+X0S/gFZJcba1?= =?us-ascii?q?0fJ8WBCGpOcLln71D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AYPw1lKyEdBnvdcJrw1iBKrPxkOskLtp133Aq?= =?us-ascii?q?2lEZdPULSKGlfpGV9sjziyWetN9IYgBapTiBUJPwIk80hqQFm7X5XI3SETUO3V?= =?us-ascii?q?HFEGgM1/qE/9SNIUzDH6tmpN9dmstFeZHN5DpB/KDHCWCDer5OruVvsprY/Ns2?= =?us-ascii?q?pE0dLz2CHpsQizuRfTzrd3GeKjMnObMJUL6nouZXrTupfnoaKu6hAGMeYuTFr9?= =?us-ascii?q?rX0Lr7fB8vHXccmUezpALtzIS/PwmT3x8YXT8K66wl63L5nwvw4bjmm+2nyyXb?= =?us-ascii?q?y3TY4/1t6ZrcI5p4dYyxY/ouW3fRYzWTFcFcsnq5zXQISdSUmRUXeR/30lAd1o?= =?us-ascii?q?pImjXslyqO0GbQMkHboUoTAjnZuBClaDLY0LPEbSN/BMxbiY1DdBzFr0ImodFn?= =?us-ascii?q?yapOm3mUrpxNEHr77W3ADvXzJmZXf3CP0AwfeC8o/g9ieJpbbKUUoZ0U/UtTHp?= =?us-ascii?q?tFFCXm6Jo/GO0rCM3H/v5ZfV6Tcnic5wBUsZeRd2V2Gg3DTlkJu8ST3TQTlHdl?= =?us-ascii?q?z1EAzMhamnsb7poyR5RN+uyBOKV1k7NFSNMQcMtGda88aNryDnaITQPHMWqUL1?= =?us-ascii?q?iiHKYbO2jVo5qy+7kx7PHCQu198HLzouW1bLp8jx95R6vDM7z+4HR7yGG+fIzm?= =?us-ascii?q?Z0WS9ih33ekIhoHB?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DUAADzrBJhlyIeaIFahAWBGgFkVzoxh?= =?us-ascii?q?Ak+iQSIZoMohXWGVY1rEAEDAQ0qAQ4FAQIEAQGEWAIXgksCHgYBBTMTAQIEFQE?= =?us-ascii?q?BBQEBAQIBAwMEARMBAQEBAQEBAQkbBl6FaA2CNQwZg3ABChEGCmUjAxQBBgMCB?= =?us-ascii?q?A0BFwEUChcBEhQGglcBgwcEAQqNSZwKgTGBAYNNAQMCARAPhCqBYw0CFIEXhW5?= =?us-ascii?q?TSAGCa4N4AicQgVVEgRWCdW6CSwwLAQEBAQEXgSQBARFFgmGCZASDBA4/ARUZH?= =?us-ascii?q?UIBKQEBIi4EBCMVIwEwBBUSHQYIAwYHLZFEJQOWRJRALAeDK4ExBguHYoEVjES?= =?us-ascii?q?HeYNlgUeKGZcqIZUWWIIehlaBFII1k1cChS6BTSqBfTMaMEOCNQEBMglgDlWNI?= =?us-ascii?q?gEFhBOEWTuCZoJjAz8yAgEBNAIGAQoBAQMJdQEBBRMLAYUYgkUBAQ?= X-IPAS-Result: =?us-ascii?q?A0DUAADzrBJhlyIeaIFahAWBGgFkVzoxhAk+iQSIZoMohXW?= =?us-ascii?q?GVY1rEAEDAQ0qAQ4FAQIEAQGEWAIXgksCHgYBBTMTAQIEFQEBBQEBAQIBAwMEA?= =?us-ascii?q?RMBAQEBAQEBAQkbBl6FaA2CNQwZg3ABChEGCmUjAxQBBgMCBA0BFwEUChcBEhQ?= =?us-ascii?q?GglcBgwcEAQqNSZwKgTGBAYNNAQMCARAPhCqBYw0CFIEXhW5TSAGCa4N4AicQg?= =?us-ascii?q?VVEgRWCdW6CSwwLAQEBAQEXgSQBARFFgmGCZASDBA4/ARUZHUIBKQEBIi4EBCM?= =?us-ascii?q?VIwEwBBUSHQYIAwYHLZFEJQOWRJRALAeDK4ExBguHYoEVjESHeYNlgUeKGZcqI?= =?us-ascii?q?ZUWWIIehlaBFII1k1cChS6BTSqBfTMaMEOCNQEBMglgDlWNIgEFhBOEWTuCZoJ?= =?us-ascii?q?jAz8yAgEBNAIGAQoBAQMJdQEBBRMLAYUYgkUBAQ?= X-IronPort-AV: E=Sophos;i="5.84,310,1620684000"; d="scan'208,217";a="523416374" X-MGA-submission: =?us-ascii?q?MDFo/VcbEg1px1Fh+oewIwwE4nWRCb1+lJFcbD?= =?us-ascii?q?CBGNfpm9teHfXBj8siB5QjRhS1zYFzU80HLBpNOas1WPDMlFsuJA1lak?= =?us-ascii?q?emHx2srnoJ5eT4KUp2/KXWy8uweDhElA7iPEizsIVhxUBY3DrjOxEVnc?= =?us-ascii?q?9O7e3X62BqVr/FVAXEUCeJgw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 10 Aug 2021 18:47:45 +0200 Received: from set (62.132.92.79.rev.sfr.net [79.92.132.62]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2FD2B5605D7; Tue, 10 Aug 2021 18:47:43 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 10 Aug 2021 18:47:33 +0200 Message-ID: <87bl65457e.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 10 18:47:44 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.055059, queueID=5EEBF5605D8 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDAzIHRvIDEwLA0KMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpMd3QgNS40 LjINCk9DYW1sIFdvcmtzaG9wIDIwMjE6IENhbGwgZm9yIFZvbHVudGVlcnMNCm9wYW0gMi4xLjAh DQpjb250YWluZXJzIDMuNQ0KU2hvcnQgY29udHJhY3Qgam9iIGZvciBPQ2FtbC9DKysgcHJvZ3Jh bW1lcg0KaHR0cC1tdWx0aXBhcnQtZm9ybWRhdGEgdjMuMC4xIHJlbGVhc2VkDQp3dHIgKFdlbGwg VHlwZWQgUm91dGVyKSB2Mi4wLjAgcmVsZWFzZWQNCk5ldyBwbGF5bGlzdCBqdXN0IGRyb3BwZWQN Ck90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpMd3QgNS40LjINCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWx3dC01LTQtMi84MjQ4LzE+DQoNCg0KUmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGdsYWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Yg dmVyc2lvbiA1LjQuMiBvZiBMd3Q6IGENCiAgYnVnZml4LW9ubHkgcmVsZWFzZS4NCg0KICA8aHR0 cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3JlbGVhc2VzL3RhZy81LjQuMj4NCg0KICBZb3Ug Y2FuIHVwZGF0ZSB0byB0aGlzIHZlcnNpb24gaW4gYG9wYW0nIDoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHVwZ3JhZGUgbHd0DQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIFRoYW5rcyB0byB0aGUgY29udHJpYnV0b3JzIGZvciBmaW5kaW5nIGFuZCBm aXhpbmcgdGhlIGJ1Z3MsIGxlYWRpbmcgdG8NCiAgdGhpcyByZWxlYXNlLiBDaGVjayBvdXQgdGhl IHJlbGVhc2Ugbm90ZXMgKGxpbmsgYWJvdmUpIGZvciBhIGZ1bGwNCiAgbGlzdC4NCg0KDQpPQ2Ft bCBXb3Jrc2hvcCAyMDIxOiBDYWxsIGZvciBWb2x1bnRlZXJzDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjEtY2Fs bC1mb3Itdm9sdW50ZWVycy84MjUzLzE+DQoNCg0KRnLDqWTDqXJpYyBCb3VyIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgVGhlIE9DYW1sIFdvcmtzaG9wIHdpbGwgYmUgaGVsZCB2aXJ0dWFs bHksIGp1c3QgbGlrZSBsYXN0IHllYXIuIFdlIGFyZQ0KICBsb29raW5nIGZvciB2b2x1bnRlZXJz IHRvIGZpbGwgdGhlIHJvbGUgb2Ygc2Vzc2lvbiBob3N0Lg0KDQoNCltTZXNzaW9uIEhvc3RzXQ0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgT24gQXVn dXN0IDI3LCB0aGUgc2Vzc2lvbiBob3N0cyB3aWxsIGFzc2lzdCBzZXNzaW9uIGNoYWlycyBpbg0K ICBzdHJlYW1pbmcgdGhlIHByZS1yZWNvcmRlZCB2aWRlb3MgYXMgd2VsbCBhcyBoZWxwaW5nIGFu ZCBtb2RlcmF0aW5nDQogIHRoZSBRJkEgc2Vzc2lvbnMuIFRoZXkgd2lsbCBhbHNvIGJlIHJlc3Bv bnNpYmxlIGZvciBzZWN1cml0eSBhbmQgYmUNCiAgcmVhZHkgdG8gcmVhY3QgdG8gcG90ZW50aWFs IHRocmVhdHMgYW5kIHdyb25nZG9lcnMuDQoNCiAgVGhpcyB5ZWFyIHRoZXJlIHdpbGwgYmUgb25s eSBvbmUgYnJvYWRjYXN0IGZvciBlYWNoIHNlc3Npb24sIGJ1dCB0aGUNCiAgd29ya3Nob3AgZGF5 IHdpbGwgYmUgcXVpdGUgbG9uZy4gVGhlcmUgd2lsbCBiZSBzaXggc2Vzc2lvbnMsIGxhc3RpbmcN CiAgb25lIGhvdXIgYW5kIGEgaGFsZiwgYXMgd2VsbCBhcyBhIG9uZSBob3VyIGtleW5vdGUuDQoN Cg0KW1Nlc3Npb24gSG9zdHNdDQo8aHR0cHM6Ly9pY2ZwMjAuc2lncGxhbi5vcmcvaG9tZS9vY2Ft bC0yMDIwI3Nlc3Npb24taG9zdHM+DQoNCltEdXRpZXNdDQrilITilITilITilITilITilITilITi lIQNCg0KICDigKIgTW9kZXJhdGluZyB0aGUgdGV4dCBjaGF0cw0KICDigKIgQ29udHJvbGxpbmcg bWljcm9waG9uZXMgaW4gdGhlIHZpZGVvLWNvbmZlcmVuY2luZw0KICDigKIgV2F0Y2hpbmcgZm9y IHRoZSB0aW1lDQogIOKAoiBQZXJmb3JtaW5nIHNvdW5kIGNoZWNrcw0KICDigKIgV2VsY29taW5n IGFuZCBvdGhlcndpc2UgZ3VpZGluZyBwYXJ0aWNpcGFudHMNCg0KDQpbRHV0aWVzXSA8aHR0cHM6 Ly9pY2ZwMjAuc2lncGxhbi5vcmcvaG9tZS9vY2FtbC0yMDIwI2R1dGllcz4NCg0KDQpvcGFtIDIu MS4wIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS0yLTEtMC84MjU1LzE+DQoNCg0KUi4g Qm91amJlbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGFyZSBoYXBweSB0byBhbm5vdW5jZSB0d28g b3BhbSByZWxlYXNlczogdGhlIGZyZXNobHkgbmV3IFsyLjEuMF0gJg0KICB0aGUgTFRTIHN1cHBv cnQgWzIuMC45XS4NCg0KDQpbMi4xLjBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9y ZWxlYXNlcy90YWcvMi4xLjA+DQoNClsyLjAuOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v cGFtL3JlbGVhc2VzL3RhZy8yLjAuOT4NCg0KV2hhdCdzIG5ldyBpbiBvcGFtIDIuMS4wPw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIEludGVncmF0aW9uIG9mIHN5c3RlbSBkZXBlbmRlbmNp ZXMgKGZvcm1lcmx5IHRoZSBgb3BhbS1kZXBleHRgDQogICAgcGx1Z2luKSwgaW5jcmVhc2luZyB0 aGVpciByZWxpYWJpbGl0eSBhcyBpdCBpbnRlZ3JhdGVzIHRoZSBzb2x2aW5nDQogICAgc3RlcA0K ICDigKIgQ3JlYXRpb24gb2YgbG9jayBmaWxlcyBmb3IgcmVwcm9kdWNpYmxlIGluc3RhbGxhdGlv bnMgKGZvcm1lcmx5IHRoZQ0KICAgIGBvcGFtLWxvY2tgIHBsdWdpbikNCiAg4oCiIFN3aXRjaCBp bnZhcmlhbnRzLCByZXBsYWNpbmcgdGhlIF8iYmFzZSBwYWNrYWdlcyJfIGluIG9wYW0gMi4wIGFu ZA0KICAgIGFsbG93aW5nIGZvciBlYXNpZXIgY29tcGlsZXIgdXBncmFkZXMNCiAg4oCiIEltcHJv dmVkIG9wdGlvbnMgY29uZmlndXJhdGlvbiAoc2VlIHRoZSBuZXcgYG9wdGlvbmAgYW5kIGV4cGFu ZGVkDQogICAgYHZhcmAgc3ViLWNvbW1hbmRzKQ0KICDigKIgQ0xJIHZlcnNpb25pbmcsIGFsbG93 aW5nIGNsZWFuZXIgZGVwcmVjYXRpb25zIGZvciBvcGFtIG5vdyBhbmQgYWxzbw0KICAgIGltcHJv dmVtZW50cyB0byBzZW1hbnRpY3MgaW4gZnV0dXJlIHdpdGhvdXQgYnJlYWtpbmcNCiAgICBiYWNr d2FyZHMtY29tcGF0aWJpbGl0eQ0KICDigKIgb3BhbSByb290IHJlYWRhYmlsaXR5IGJ5IG5ld2Vy IGFuZCBvbGRlciB2ZXJzaW9ucywgZXZlbiBpZiB0aGUNCiAgICBmb3JtYXQgY2hhbmdlZA0KICDi gKIgUGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIHRvIG9wYW0tdXBkYXRlLCBjb25mbGljdCBtZXNz YWdlcywgYW5kIG1hbnkNCiAgICBvdGhlciBhcmVhcw0KDQogIFlvdSdsbCBmaW5kIHRoZXNlIGZl YXR1cmVzIHByZXNlbnRhdGlvbiBpbiB0aGUgW2Jsb2cgcG9zdF0gOyBhbmQgZm9yIGENCiAgZnVs bCBjb21wbGV0ZSB5b3UgY2FuIHRha2UgYSBsb29rIFtwcmUtcmVsZWFzZXMgY2hhbmdlbG9nc10u DQoNCg0KW2Jsb2cgcG9zdF0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItMS0w Pg0KDQpbcHJlLXJlbGVhc2VzIGNoYW5nZWxvZ3NdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b3BhbS9yZWxlYXNlcz4NCg0KDQpXaGF0J3MgaW4gMi4wLjkNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaXMgMi4wLjkgdmVyc2lvbiBjb250YWlu cyBiYWNrLXBvcnRlZCBmaXhlcywgeW91IGNhbiBmaW5kIG1vcmUNCiAgaW5mb3JtYXRpb24gaW4g dGhpcyBbYmxvZyBwb3N0XSwgZXNwZWNpYWxseSBmb3IgZmlzaCB1c2VycyAmIHNhbmRib3gNCiAg dXBkYXRlcy4NCg0KICAqVHJlbWVuZG91cyB0aGFua3MgdG8gYWxsIGludm9sdmVkIHBlb3BsZSwg YWxsIHRob3NlIHdobyd2ZSB0ZXN0ZWQsDQogICByZS10ZXN0ZWQsIHRlc3RlZCBhZ2FpbiwgZ2l2 ZW4gZmVlZGJhY2ssIGNvbW1lbnRlZCBvbiBpc3N1ZXMsIHRlc3RlZCwNCiAgIHRlc3RlZCwgdGVz dGVkIGFnYWlu4oCmISoNCg0KICAvVGhlIG9wYW0gdGVhbS8g8J+Qqg0KDQoNCltibG9nIHBvc3Rd IDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTAtOT4NCg0KDQpjb250YWluZXJz IDMuNQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY29udGFpbmVycy0zLTUvODI1 Ny8xPg0KDQoNClNpbW9uIENydWFuZXMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20g Z2xhZCB0byBhbm5vdW5jZSB0aGF0IHZlcnNpb24gMy41IG9mIFtjb250YWluZXJzXSBoYXMganVz dCBiZWVuDQogIHJlbGVhc2VkLiBUaGVyZSdzIGEgYnVnZml4IGZvciBiaXR2ZWN0b3JzLCBhbmQg YSB0YXN0ZWZ1bCBhc3NvcnRtZW50DQogIG9mIG5ldyBmdW5jdGlvbnMgKHNlZSBjaGFuZ2Vsb2cp LiBJIHdhbnQgdG8gdGhhbmsgYWxsIHRoZQ0KICBjb250cmlidXRvcnMsIGFtb25nIHdob20gZmly c3QgdGltZSBjb250cmlidXRvciBAZmF2b25pYS4NCg0KICBUaGUgcmVsZWFzZSBhbmQgY2hhbmdl bG9nIGNhbiBiZSBmb3VuZCBbaGVyZV0NCg0KDQpbY29udGFpbmVyc10gPGh0dHBzOi8vZ2l0aHVi LmNvbS9jLWN1YmUvb2NhbWwtY29udGFpbmVycz4NCg0KW2hlcmVdIDxodHRwczovL2dpdGh1Yi5j b20vYy1jdWJlL29jYW1sLWNvbnRhaW5lcnMvcmVsZWFzZXMvdGFnL3YzLjU+DQoNCg0KU2hvcnQg Y29udHJhY3Qgam9iIGZvciBPQ2FtbC9DKysgcHJvZ3JhbW1lcg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zaG9ydC1jb250cmFj dC1qb2ItZm9yLW9jYW1sLWMtcHJvZ3JhbW1lci84MjYwLzE+DQoNCg0KQXNoaXNoIEFnYXJ3YWwg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBoYXZlIGEgc21hbGwgcHJvamVjdCAo cG9zc2libHkgb25seSBkYXlzIG9mIHdvcmspIGZvciBhbg0KICBleHBlcmllbmNlZCBPQ2FtbCBh bmQgQysrIHByb2dyYW1tZXIuIElmIHlvdSBhcmUgYXZhaWxhYmxlIGZvciBhIHNob3J0DQogIGVu Z2FnZW1lbnQgYXMgYSBjb250cmFjdG9yLCBwbGVhc2UgRE0gbWUuIFRoYW5rIHlvdS4NCg0KDQpo dHRwLW11bHRpcGFydC1mb3JtZGF0YSB2My4wLjEgcmVsZWFzZWQNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWh0dHAtbXVsdGlwYXJ0LWZvcm1k YXRhLXYzLTAtMS1yZWxlYXNlZC84MjYxLzE+DQoNCg0KQmlrYWwgTGVtIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSSBhbSBwbGVhc2VkIHRvIGFubm91bmNlIHYzLjAuMSBvZiBgaHR0cC1tdWx0aXBhcnQtZm9y bWRhdGEnLiBUaGlzDQogIHJlbGVhc2UgZm9sbG93cyBhIG1ham9yIG92ZXJoYXVsIG9mIHRoZSBw YXJzZXIgYXMgd2VsbCBhcyB0aGUgZGVzaWduDQogIG9mIHRoZSBsaWJyYXJ5LiBIZXJlIGlzIHRo ZSBzdW1tYXJ5IG9mIGNoYW5nZXM6DQoNCiAgMS4gRmxhdHRlbiBtb2R1bGUgYFBhcnRfaGVhZGVy JyB0byBgcGFydF9oZWFkZXInDQogIDIuIEltcGxlbWVudCByZWFkZXIvcHVsbCBiYXNlZCBwYXJz ZXIgdG8gcmV0cmlldmUgbXVsdGlwYXJ0IHBhcnRzLA0KICAgICBpLmUuIGltcGxlbWVudCBhIGBz dHJlYW1pbmcnIGRlc2lnbi4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBpZiB0aGUNCiAgICAgSFRUUCBm aWxlIHVwbG9hZCBpcyBsYXJnZS4NCiAgMy4gSW1wbGVtZW50IHB1c2gtYmFzZWQgaW5jcmVtZW50 YWwgaW5wdXQgbW9kZWwsIGkuZS4gdGhlIGxpYnJhcnkgaXMNCiAgICAgbm93IGEgbm9uLWJsb2Nr aW5nIG11bHRpcGFydCBwYXJzZXINCiAgNC4gUmVtb3ZlIGRlcGVuZGVuY3kgb24gSU8gYmFzZWQg bGlicyBzdWNoIGFzIGBsd3QsIGFzeW5jJyBzaW5jZSBpdCBpcw0KICAgICBubyBsb25nZXIgbmVl ZGVkIGR1ZSB0byBwb2ludCAzIGFib3ZlLg0KDQogIEdpdGh1YiByZXBvOiBbaHR0cC1tdWx0aXBh cnQtZm9ybWRhdGFdDQoNCiAgQVBJIGRvYyA6IFtBUEkgbWFudWFsXQ0KDQoNCltodHRwLW11bHRp cGFydC1mb3JtZGF0YV0NCjxodHRwczovL2dpdGh1Yi5jb20vbGVtYWV0ZWNoL2h0dHAtbXVsdGlw YXJ0LWZvcm1kYXRhPg0KDQpbQVBJIG1hbnVhbF0NCjxodHRwczovL2xlbWFldGVjaC5jby51ay9o dHRwLW11bHRpcGFydC1mb3JtZGF0YS9odHRwLW11bHRpcGFydC1mb3JtZGF0YS9IdHRwX211bHRp cGFydF9mb3JtZGF0YS9pbmRleC5odG1sPg0KDQoNCnd0ciAoV2VsbCBUeXBlZCBSb3V0ZXIpIHYy LjAuMCByZWxlYXNlZA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4td3RyLXdlbGwtdHlwZWQtcm91dGVyLXYyLTAtMC1yZWxlYXNlZC84MjYyLzE+ DQoNCg0KQmlrYWwgTGVtIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBwbGVhc2VkIHRvIGFubm91bmNl IHYyLjAuMCByZWxlYXNlIG9mIGB3dHIgKFdlbGwgVHlwZWQNCiAgUm91dGVyKScuIGB3dHInIGlz IGEgdHJpZS1iYXNlZCByb3V0ZXIgZm9yIE9DYW1sIEhUVFAgd2ViDQogIGFwcGxpY2F0aW9ucy4N Cg0KICB2Mi4wLjAgcmVsZWFzZSBhZGRzIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgYW5kIG1hdGNo aW5nIEhUVFAgbWV0aG9kcw0KICBpbiBhIHJvdXRlci4gU28gbm93IHdlIGNhbiBkbyB0aGUgZm9s bG93aW5nOw0KICDilIzilIDilIDilIDilIANCiAg4pSCIFd0ci4oDQogIOKUgiAgICAgY3JlYXRl DQogIOKUgiAgICAgICBbIHsld3RyfCBnZXQscG9zdCxoZWFkLGRlbGV0ZSAgOyAvaG9tZS9hYm91 dC8gIHx9IGFib3V0X3BhZ2UNCiAg4pSCICAgICAgIDsgeyV3dHJ8IGhlYWQgICAgICAgICAgICAg ICAgICA7IC9ob21lLzppbnQvICAgfH0gcHJvZF9wYWdlDQogIOKUgiAgICAgICBdDQogIOKUlOKU gOKUgOKUgOKUgA0KICBOb3RlOiB3ZSBjYW4gc3BlY2lmeSBzaW5nbGUgb3IgbXVsdGlwbGUgSFRU UCBtZXRob2RzIHN1cHBvcnRlZCBieSBhDQogIHJvdXRlLg0KDQogIFRoZSByZWxlYXNlIGFsc28g ZmVhdHVyZXMgYSBwcmV0dHktcHJpbnRlciAtIGBXdHIucHAnIC0gZm9yIGEgYFd0ci50Jw0KICB0 eXBlLiBUaGlzIGhhcyBwcm92ZW4gdG8gYmUgdmVyeSB1c2VmdWwgd2hlbiBkaWFnbm9zaW5nL3Vu ZGVyc3RhbmRpbmcNCiAgcm91dGluZyBpc3N1ZXMuIFNhbXBsZSBvdXRwdXQgYmVsb3csDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgUE9TVA0KICDilIIgICAvaG9tZQ0KICDilIIgICAgIC9hYm91 dA0KICDilIIgICAgICAgLw0KICDilIIgICAgIC86ZmxvYXQNCiAg4pSCICAgICAgIC8NCiAg4pSC IEhFQUQNCiAg4pSCICAgL2hvbWUNCiAg4pSCICAgICAvYWJvdXQNCiAg4pSCICAgICAgIC8NCiAg 4pSCICAgICAvOmludA0KICDilIIgICAgICAgLw0KICDilJTilIDilIDilIDilIANCg0KICBUaGUg bWFudWFsIGhhcyBhbHNvIGJlZW4gaW1wcm92ZWQgaW4gdGhpcyByZWxlYXNlLg0KDQogIOKAoiBb d3RyIEFQSV0NCiAg4oCiIFtDb0hUVFAgZGVtb10NCiAg4oCiIFtDTEkgZGVtb10NCiAg4oCiIFtD aGFuZ2VzIHYyLjAuMF0NCg0KDQpbd3RyIEFQSV0gPGh0dHBzOi8vbGVtYWV0ZWNoLmNvLnVrL3d0 ci93dHIvV3RyL2luZGV4Lmh0bWw+DQoNCltDb0hUVFAgZGVtb10NCjxodHRwczovL2dpdGh1Yi5j b20vbGVtYWV0ZWNoL3d0ci9ibG9iL21haW4vZXhhbXBsZXMvY29odHRwLm1sPg0KDQpbQ0xJIGRl bW9dIDxodHRwczovL2dpdGh1Yi5jb20vbGVtYWV0ZWNoL3d0ci9ibG9iL21haW4vZXhhbXBsZXMv ZGVtby5tbD4NCg0KW0NoYW5nZXMgdjIuMC4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9sZW1hZXRl Y2gvd3RyL2Jsb2IvbWFpbi9DSEFOR0VTLm1kI3YyMDAtMjAyMS0wOC0wMj4NCg0KDQpOZXcgcGxh eWxpc3QganVzdCBkcm9wcGVkDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy1wbGF5bGlzdC1qdXN0LWRyb3BwZWQvODI3 Mi8xPg0KDQoNClJhaHVsIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGF2ZW4ndCB3YXRjaGVkIHRoZW0gYWxsIHlldCwgYnV0IHRo ZXNlIGxvb2sgbGlrZSB0aGV5J2QgYmUgYSBncmVhdA0KICByZXNvdXJjZSBmb3IgYW55b25lIHdh bnRpbmcgdG8gbGVhcm4gT0NhbWw6DQogIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92 PU1VY2thX1N2aEx3Jmxpc3Q9UExyZTVBVDlKbktTaEJPUGV1aUQ5Yi1JNFhST0lKaGtJVT4NCg0K DQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0Nh bWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbT0NhbWwgUGxhbmV0XS4NCg0KICDigKIgW29wYW0gMi4x LjAgaXMgcmVsZWFzZWQhXQ0KICDigKIgW29wYW0gMi4wLjkgcmVsZWFzZV0NCg0KDQpbT0NhbWwg UGxhbmV0XSA8aHR0cDovL29jYW1sLm9yZy9jb21tdW5pdHkvcGxhbmV0Lz4NCg0KW29wYW0gMi4x LjAgaXMgcmVsZWFzZWQhXQ0KPGh0dHBzOi8vd3d3Lm9jYW1scHJvLmNvbS8yMDIxLzA4LzA1L29w YW0tMi0xLTAtaXMtcmVsZWFzZWQvPg0KDQpbb3BhbSAyLjAuOSByZWxlYXNlXQ0KPGh0dHBzOi8v d3d3Lm9jYW1scHJvLmNvbS8yMDIxLzA4LzA1L29wYW0tMi0wLTktcmVsZWFzZS8+DQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0 dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0 cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 03 to 10, 2021.

Lwt 5.4.2

Rapha=C3=ABl Proust announced

We are glad to announce the release of version 5.4.2 of Lwt: a bugfix-only = release.

https://githu= b.com/ocsigen/lwt/releases/tag/5.4.2

You can update to this version in opam :

opam update
opam upgrade lwt

Thanks to the contributors for finding and fixing the bugs, leading to this= release. Check out the release notes (link above) for a full list.

OCaml Workshop 2021: Call for Volunteers

Fr=C3=A9d=C3=A9ric Bour announced

The OCaml Workshop will be held virtually, just like last year. We are look= ing for volunteers to fill the role of session host.

Session Hosts

On August 27, the session hosts will assist session chairs in streaming the= pre-recorded videos as well as helping and moderating the Q&A sessions. They will al= so be responsible for security and be ready to react to potential threats and wrongdoers.

This year there will be only one broadcast for each session, but the worksh= op day will be quite long. There will be six sessions, lasting one hour and a half, as wel= l as a one hour keynote.

Duties
  • Moderating the text chats
  • Controlling microphones in the video-conferencing
  • Watching for the time
  • Performing sound checks
  • Welcoming and otherwise guiding participants

opam 2.1.0!

R. Boujbel announced

We are happy to announce two opam releases: the freshly new 2.1.0 &= ; the LTS support 2.0.9.

What's new in opam 2.1.0?

  • Integration of system dependencies (formerly the `opam-depext` plugin),= increasing their reliability as it integrates the solving step
  • Creation of lock files for reproducible installations (formerly the `op= am-lock` plugin)
  • Switch invariants, replacing the "base packag= es" in opam 2.0 and allowing for easier compiler upgrades
  • Improved options configuration (see the new `option` and expanded `var`= sub-commands)
  • CLI versioning, allowing cleaner deprecations for opam now and also imp= rovements to semantics in future without breaking backwards-compatibility
  • opam root readability by newer and older versions, even if the format c= hanged
  • Performance improvements to opam-update, conflict messages, and many ot= her areas

You'll find these features presentation in the blog post ; and for a full complete you can take a look pre-releases changelogs<= /a>.

What's in 2.0.9

This 2.0.9 version contains back-ported fixes, you can find more informatio= n in this blog post, especially for fish users & sandbox updates.

Tremendous thanks to all involved people, all those who've tested, re-te= sted, tested again, given feedback, commented on issues, tested, tested, te= sted again…!

The opam team =F0=9F=90=AA

containers 3.5

Simon Cruanes announced

I'm glad to announce that version 3.5 of containers has j= ust been released. There's a bugfix for bitvectors, and a tasteful assortment of new functions (see chan= gelog). I want to thank all the contributors, among whom first time contributor @favonia.

The release and changelog can be found he= re

Short contract job for OCaml/C++ programmer

Ashish Agarwal announced

We have a small project (possibly only days of work) for an experienced OCa= ml and C++ programmer. If you are available for a short engagement as a contractor, pl= ease DM me. Thank you.

http-multipart-formdata v3.0.1 released

Bikal Lem announced

I am pleased to announce v3.0.1 of http-multipart-formdata. Th= is release follows a major overhaul of the parser as well as the design of the library. Here is the su= mmary of changes:

  1. Flatten module Part_header to part_header
  2. Implement reader/pull based parser to retrieve multipart parts, i.e. im= plement a streaming design. This is very useful if the HTTP fi= le upload is large.
  3. Implement push-based incremental input model, i.e. the library is now a= non-blocking multipart parser
  4. Remove dependency on IO based libs such as lwt, async sinc= e it is no longer needed due to point 3 above.

Github repo: http-multipart-formdata

API doc : API manual

wtr (Well Typed Router) v2.0.0 released

Bikal Lem announced

I am pleased to announce v2.0.0 release of wtr (Well Typed Router). wtr is a trie-based router for OCaml HTTP web applications.

v2.0.0 release adds support for specifying and matching HTTP methods in a r= outer. So now we can do the following;

Wtr.(
    create
      [ {%wtr| get,post,head,delete =
 ; /home/about/  |} about_page
      ; {%wtr| head                 =
 ; /home/:int/   |} prod_page
      ]

Note: we can specify single or multiple HTTP methods supported by a route.

The release also features a pretty-printer - Wtr.pp - for a Wtr.t type. This has proven to be very useful when diagnosing/understanding routing issues. Sample outp= ut below,

POST
  /home
    /about
      /
    /:float
      /
HEAD
  /home
    /about
      /
    /:int
      /

The manual has also been improved in this release.

New playlist just dropped

Rahul announced

Haven't watched them all yet, but these look like they'd be a great resourc= e for anyone wanting to learn OCaml: https://www.youtube.com/watch?v=3DMUcka_SvhLw&= amp;list=3DPLre5AT9JnKShBOPeuiD9b-I4XROIJhkIU

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id BA71CE0018 for ; Tue, 17 Aug 2021 08:24:41 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=W8//=NI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AykCnaxC/cPyYWV2gkr0uUyQUUEUY04WdBeb1wqQ?= =?us-ascii?q?uh78GSKm/5ZOqZBWZua81yg6QFtiEo9t/yMPu+5j6XmIB5ZvT+FsjS7drEyE/t?= =?us-ascii?q?MMNggY7C9SEA0CoZNTjbig9AdgQHAQ9pyLzPkdaAtvxaEPPqXOu8zESBg//NQ1?= =?us-ascii?q?oLejpB4Lelcu62/6u95HJZwhEmTWxbLNwIR6rsQjfq84ajJd4JK0s0BXJuHxIe?= =?us-ascii?q?+pXxWNsO12emgv369mz8pB+7Sleouot+MFcX6r0eaQ4VqFYAy89M28p/s3rtAL?= =?us-ascii?q?MQhWJ63ABT2gZiBtIAwzC7BHnQpf8tzbxu+Rh1CWGO8D9ULc7Vym/76dwUB/nl?= =?us-ascii?q?jsINyI3/mHQj8x/lqNboBS8rBB7zIPZZISZOfx+cq3ee9MaW2tBXt1QVyNaBoO?= =?us-ascii?q?zcZYEDuQGPeZCsob9vEYFoR+wCAWwAe/izCJDiH3r0q0gy+kvER/I0hEuEdwNv?= =?us-ascii?q?3vbsM74O70OXe2v1qTE0SnPYvFQ1Dzg6IbIaBchofSUUL9sdcre008vHB7YgFq?= =?us-ascii?q?MqYzlOjKV1vgRs2OG6OdvT+avhHQhqw1ruTig2scsiozIhoIJ1lDJ7j15wIExJ?= =?us-ascii?q?dy4VE50f8KrEJtWtyGbLot2X90tT3tvuCYgxb0LoJi2dzUFx5o73RDQceCHc5S?= =?us-ascii?q?W7RL5UuacOTh1iGxqdb6jiBu+7Uqtx+3yWMe71FtEoDdIn8fOu30DyxHf99SKR?= =?us-ascii?q?Pt880qv1jiC1AHe5vxaLE47kafWNoAsz6I2m5EOv0rDGSr2l1/3jK+Qbkgk4va?= =?us-ascii?q?n6/jmYrX6uJCcL4h0igT7MqswgMC/B/o3MhQWU2ic5euzzrjj/UnjTLVNlP02n?= =?us-ascii?q?bHVsJ/bJcQHpq65HhRa3pw/5Ba4CjeqyNUYnX8dLFJEYh2LlYbpO0vWLPDjDPe?= =?us-ascii?q?/jEyskDNxyPDAJLHhBY/NLnfbnLfufLZ9905cyBcowtxF5pJUDakNIP3yWk/ts?= =?us-ascii?q?NzXFAQ2Pxa1w+bgENl92YIeWX6LAqCDK6zeq0OH5uUqI+WUeI8apjf8K/8+5/L?= =?us-ascii?q?0kXA5nlodcbGo3ZQKaHG4GvBmL1+eYXr2jdcMF3oBsAkmTOHylVGOTzpea2yvU?= =?us-ascii?q?64g6Tw3EoyrAZvZSo2jj7GNxDq3E5lYa2xcFFyBHnTle5+ZV/oIbC+eONJtnz4?= =?us-ascii?q?FWLWnVoQvzwuhtBXgxLpiNufU+jMXtZbk1NVt4u3Smgw++SZsD8Sa12GMT310k?= =?us-ascii?q?X0USD822qB/oFV9ykqd3qRihPxYD9NT6+tIUgc8K5Hc0/R3B83sVg/FZNuFVUq?= =?us-ascii?q?qT9q8DTw/Ut492dEDbkllF9WnlB/D3i6qA7EPl7yMAZw56r/S0WTsKcph03vJ1?= =?us-ascii?q?Kosg0I9TsZXLWOohbZy9xDUB47Nk0SZi7ilergc3C7L9WeD1HeOs19CXA53S6X?= =?us-ascii?q?FUmgSaVHSrdvj4EPOVaSuBqgnMgtEyM6CNrdKZ8byglVBWffjPsjRbHyqm2uqA?= =?us-ascii?q?BaFybyNYJDte2UH0yXREFIEnBwL/XaaKQg+AT+srH7EAzxrEVLjekfs8ehlqHO?= =?us-ascii?q?nVUI01AGLb0h517Wv4BIVhPqcS+kS3r0eoishpS90Tx6B2IecD8WG7UI1eLpaS?= =?us-ascii?q?dci5hFB2H6P80Q3NYOmZegq0lUBdSxzvljyzFN2BpRElY4ttnx8iEJ5IKeclVd?= =?us-ascii?q?AbC+w3JbqO7SRJHOh0gqobvv/3ljYmO2d+qIO9Ohw/1zntQfvDUEi9nR7z/FN1?= =?us-ascii?q?H+N+pjBDAwTSI/8FEEt+E4p9PnhfiAh6taMhjVXOq6uv2qdirrB68MvzQumdNp?= =?us-ascii?q?EdqbYBEn1CcJIXqBGycQviwHvdhUALfxf/64yPtq7er2BwqH5ZY6IeRq+imBW/?= =?us-ascii?q?I120kSN7jdxDOnS0MRcq8w=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AMoW6W6h49ymxk6VCSA4S4CYPIHBQXsYji2hC?= =?us-ascii?q?6mlwRA09TyX4rbHNoB1173DJYVoqNk3I+urwW5VoI0m8yXcd2+B4VotKNzOKhI?= =?us-ascii?q?LHFutfBPPZowEJzUXFmtJg6Q=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DAAwCYahphlyIeaIFaHAEBASsBAQcBA?= =?us-ascii?q?QEFAQEEBAEBgX2BIRsCfQFkVzoxhAk+iQSGIAEkgiSDKIV1hleNHANfAQMBDRI?= =?us-ascii?q?CFgEOBQECBAEBhHo6AQQEghECHgYBBTMTAQIEFQEBBQEBAQIBAwMEARMBAQEBA?= =?us-ascii?q?QEBAQkbBl6FaA2CIhMMDAMDg3cBChEGBAY7KiMDFAcDAgQNARcBFAoXARIaglc?= =?us-ascii?q?BgwcEAQqLYpwKfzKBAYNNAQMCDkGEFYFjDQIUgRUCAQGFblNIAYJtCINwKRCBV?= =?us-ascii?q?USBFYJ1boJLDAsBAQEBAYE4AwEBgzeCZASDRw4gGDQEMC0BCgkWAQEgCS8jFQg?= =?us-ascii?q?5FwUWLwspEY4TgwQTHpZ7k1drLQeDK4ExBguHElSBFYxFh3uDZYFIhQeFFIZEk?= =?us-ascii?q?GkhlXCIdYELCYI1hmiCDYpcBgICBC+EeYFNKoFMHgMJBzMaMEOCaQlgDlaNIgE?= =?us-ascii?q?FhBSBPoEmgXU7hUw/MgIBATQCBgEKAQEDCYEIAQEFEwsBiEcBAQ?= X-IPAS-Result: =?us-ascii?q?A0DAAwCYahphlyIeaIFaHAEBASsBAQcBAQEFAQEEBAEBgX2?= =?us-ascii?q?BIRsCfQFkVzoxhAk+iQSGIAEkgiSDKIV1hleNHANfAQMBDRICFgEOBQECBAEBh?= =?us-ascii?q?Ho6AQQEghECHgYBBTMTAQIEFQEBBQEBAQIBAwMEARMBAQEBAQEBAQkbBl6FaA2?= =?us-ascii?q?CIhMMDAMDg3cBChEGBAY7KiMDFAcDAgQNARcBFAoXARIaglcBgwcEAQqLYpwKf?= =?us-ascii?q?zKBAYNNAQMCDkGEFYFjDQIUgRUCAQGFblNIAYJtCINwKRCBVUSBFYJ1boJLDAs?= =?us-ascii?q?BAQEBAYE4AwEBgzeCZASDRw4gGDQEMC0BCgkWAQEgCS8jFQg5FwUWLwspEY4Tg?= =?us-ascii?q?wQTHpZ7k1drLQeDK4ExBguHElSBFYxFh3uDZYFIhQeFFIZEkGkhlXCIdYELCYI?= =?us-ascii?q?1hmiCDYpcBgICBC+EeYFNKoFMHgMJBzMaMEOCaQlgDlaNIgEFhBSBPoEmgXU7h?= =?us-ascii?q?Uw/MgIBATQCBgEKAQEDCYEIAQEFEwsBiEcBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="524136051" X-MGA-submission: =?us-ascii?q?MDFNIc6pyLFtWwqrsCvTK4GOeVDO3wTKbthmBR?= =?us-ascii?q?/qhQ+v7JwwKCpxQ0tZSBXEVxM8gYe8rTJdmyM6NAnNmGMvmQ+MbwDE+v?= =?us-ascii?q?IVnmsToVgoLXqZbYfHj0Ueol+QQYrro/tLIY/7IeRWCjVtW0L1jS85wm?= =?us-ascii?q?8j/orUxht0WumoeLG6aqQHrw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 17 Aug 2021 08:24:40 +0200 Received: from set (lputeaux-657-1-140-176.w193-248.abo.wanadoo.fr [193.248.199.176]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F334B5646C9; Tue, 17 Aug 2021 08:24:34 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 17 Aug 2021 08:24:33 +0200 Message-ID: <8735r8io66.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 17 08:24:38 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000068, queueID=2900C564780 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDEwIHRvIDE3LA0KMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpodHRwLW11 bHRpcGFydC1mb3JtZGF0YSB2My4wLjEgcmVsZWFzZWQNCkNhbGwgZm9yIHBhcnRpY2lwYXRpb246 IE1MIEZhbWlseSBXb3Jrc2hvcCAyMDIxDQpDb3Etb2Ytb2NhbWwgdG8gdHJhbnNsYXRlIE9DYW1s IHRvIENvcQ0KT2xkIENXTg0KDQoNCmh0dHAtbXVsdGlwYXJ0LWZvcm1kYXRhIHYzLjAuMSByZWxl YXNlZA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4taHR0cC1tdWx0aXBhcnQtZm9ybWRhdGEtdjMtMC0xLXJlbGVhc2VkLzgyNjEvMj4NCg0KDQpD b250aW51aW5nIHRoZSB0aHJlYWQgZnJvbSBsYXN0IHdlZWssIEhhbm5lcyBNZWhuZXJ0IGFza2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGFua3MgZm9yIHlvdXIgd29yayBvbiB0aGF0LiBJJ20gY3VyaW91cyBhYm91 dCB0aGUgZGlmZmVyZW50DQogICJtdWx0aXBhcnQiIGxpYnJhcmllcyBub3cgYXZhaWxhYmxlIGZv ciBPQ2FtbCDigJMgYW55b25lIGhhcyBhIGJyaWVmDQogIGNvbXBhcmlzb24gb2YgdGhlbT8NCg0K ICDigKIgW2h0dHAtbXVsdGlwYXJ0LWZvcm1kYXRhXSBhcyBhbm5vdW5jZWQgYWJvdmUNCiAg4oCi IFttdWx0aXBhcnRfZm9ybV0gYnkgQGRpbm9zYXVyZQ0KICDigKIgW211bHRpcGFydC1mb3JtLWRh dGFdIGJ5IGNyeXB0b3NlbnNlDQoNCiAgQXJlIHRoZXJlIGZ1bmN0aW9uYWwgZGlmZmVyZW5jZXM/ IENvcnJlY3RuZXNzPyBQZXJmb3JtYW5jZT8gT3IganVzdCBhDQogIG1hdHRlciBvZiBzdHlsZSBh bmQgY28tZGV2ZWxvcG1lbnQ/DQoNCg0KW2h0dHAtbXVsdGlwYXJ0LWZvcm1kYXRhXQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9sZW1hZXRlY2gvaHR0cC1tdWx0aXBhcnQtZm9ybWRhdGE+DQoNClttdWx0 aXBhcnRfZm9ybV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmUvbXVsdGlwYXJ0X2Zvcm0v Pg0KDQpbbXVsdGlwYXJ0LWZvcm0tZGF0YV0NCjxodHRwczovL2dpdGh1Yi5jb20vY3J5cHRvc2Vu c2UvbXVsdGlwYXJ0LWZvcm0tZGF0YT4NCg0KDQpCaWthbCBMZW0gcmVwbGllZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT25lIG9idmlv dXMgZGlmZmVyZW5jZSBhbW9uZyB0aGUgdGhyZWUgaXMgYGh0dHAtbXVsdGlwYXJ0LWZvcm1kYXRh Jw0KICBkb2Vzbid0IGRlcGVuZCBvbiBhbnkgSU8vUHJvbWlzZSBsaWJyYXJpZXMsIHN1Y2ggYXMg bHd0IG9yIGFzeW5jLiBzbw0KICB5b3UgbWF5IGZpbmQgaXQgZWFzaWVyIHRvIGludGVncmF0ZSBp biB5b3VyIHByb2plY3QuDQoNCiAgYG11bGl0cGFydC1mb3JtLWRhdGEnIGV4cG9zZXMgYSBjYWxs YmFjayBiYXNlZCBzdHJlYW1pbmcgYXBpLCB3aGVyZWFzDQogIGh0dHAtbXVsdGlwYXJ0LWZvcm1k YXRhIGV4cG9zZXMgYSBub24tY2FsbGJhY2ssIG5vbi1ibG9ja2luZyBiYXNlZCBBUEkNCiAgc3Ry ZWFtaW5nIGFwaS4NCg0KICBUaGUgQVBJIHN1cmZhY2Ugb2YgYGh0dHAtbXVsdGlwYXJ0LWZvcm1k YXRhJyBpcyBrZXB0IGFzIGxvdyBhcw0KICBwb3NzaWJsZSwgcHJpbWFyaWx5IDMgQVBJIGNhbGxz IC0gYGJvdW5kYXJ5LCByZWFkZXInIGFuZCBgcmVhZCcgY2FsbC4NCg0KICBUaGUgZGVwZW5kZW5j eSBsaXN0IG9mIGBodHRwLW11bHRpcGFydC1mb3JtZGF0YScgaXMgdGhlIHRoaW5uZXN0LiBUaGlz DQogIG1heSBvciBtYXkgbm90IGJlIGFuIGlzc3VlIGRlcGVuZGluZyBvbiB5b3VyIGFlc3RoZXRp Y3MuIEhvd2V2ZXIsDQogIHJlbGF0aXZlbHkvY29tcGFyYXRpdmVseSB0aGUgbGVzcyB5b3VyIGRl cGVuZGVuY2llcywgdGhlIGVhc2llciBpdCBpcw0KICB0byBpbnRlZ3JhdGUgdGhlIGxpYiB3aXRo IG90aGVyIE9DYW1sIGxpYnMgYW5kIGVudmlyb25tZW50cyBzdWNoIGFzDQogIHZhcmlvdXMgT1Nl cy4NCg0KDQpCaWthbCBMZW0gYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEkgc2hvdWxkIGFsc28gYWRkIGBodHRwLW11bHRpcGFydC1mb3Jt ZGF0YScgaGFzIGJlZW4gaW1wbGVtZW50ZWQgd2l0aA0KICB6ZXJvLWNvcHkgc3RyZWFtaW5nIGFu ZCBtaW5pbWFsIGFsbG9jYXRpb24gaW4gbWluZC4NCg0KDQpDYWxsIGZvciBwYXJ0aWNpcGF0aW9u OiBNTCBGYW1pbHkgV29ya3Nob3AgMjAyMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlz dC8yMDIxLTA4L21zZzAwMDA1Lmh0bWw+DQoNCg0KSm9uYXRoYW4gUHJvdHplbmtvIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGhhcHB5IHRvIGFubm91 bmNlIHRoYXQgdGhlIE1MIEZhbWlseSBXb3Jrc2hvcCBpcyBiYWNrIGZvciBpdHMNCiAgMjAyMSBl ZGl0aW9uLCB3aGljaCB3ZSB3aWxsIGJlIGhlbGQgb25saW5lIG9uIFRodXJzZGF5IEF1Z3VzdCAy NnRoLCBpbg0KICBjb25qdW5jdGlvbiB3aXRoIElDRlAgMjAyMS4gV2UgaW52aXRlIHlvdSB0byBz dWJzY3JpYmUgdG8sIGFuZCBhdHRlbmQNCiAgdGhlIHdvcmtzaG9wLCBpbiBhZGRpdGlvbiB0byB0 aGUgbWFpbiBJQ0ZQIGNvbmZlcmVuY2UuDQoNCiAgV2UgYXJlIHRocmlsbGVkIHRvIGFubm91bmNl IHRoYXQgRG9uIFN5bWUgd2lsbCBnaXZlIHRoaXMgeWVhcidzDQogIGtleW5vdGU6ICJOYXJyYXRp dmVzIGFuZCBMZXNzb25zIGZyb20gVGhlIEVhcmx5IEhpc3Rvcnkgb2YgRiMiLiBQbGVhc2UNCiAg am9pbiB1cyENCg0KICBUaGUgcHJvZ3JhbSBmZWF0dXJlcyAxNCBleGNpdGluZyBzdWJtaXNzaW9u cywgaW5jbHVkaW5nIDQgc2hvcnQgdGFsa3MuDQogIFRoZSB3b3Jrc2hvcCB3aWxsIGJlIGhlbGQg b25saW5lIGluIHRoZSA2cG0tM2FtIHRpbWUgYmFuZCAoU2VvdWwNCiAgVGltZSkuICBUYWxrcyB3 aWxsIGJlIHByZS1yZWNvcmRlZCBhbmQgdXBsb2FkZWQgb25saW5lIGZvciB0aG9zZSB3aG8NCiAg Y2Fubm90IGF0dGVuZC4NCg0KICDigKIgUHJvZ3JhbToNCiAgICA8aHR0cHM6Ly9pY2ZwMjEuc2ln cGxhbi5vcmcvaG9tZS9tbGZhbWlseXdvcmtzaG9wLTIwMjEjcHJvZ3JhbT4NCiAg4oCiIEtleW5v dGU6DQogICAgPGh0dHBzOi8vaWNmcDIxLnNpZ3BsYW4ub3JnL2RldGFpbHMvbWxmYW1pbHl3b3Jr c2hvcC0yMDIxLXBhcGVycy8xNS9LZXlub3RlLU5hcnJhdGl2ZXMtYW5kLUxlc3NvbnMtZnJvbS1U aGUtRWFybHktSGlzdG9yeS1vZi1GPi0NCiAg4oCiIElDRlAgaG9tZTogPGh0dHA6Ly9pY2ZwMjEu c2lncGxhbi5vcmcvaG9tZT4NCg0KDQpQcm9ncmFtIGNvbW1pdHRlZQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIERhbmVsIEFobWFu IChVbml2ZXJzaXR5IG9mIExqdWJsamFuYSkNCiAg4oCiIFJvYmVydCBBdGtleSAoVW5pdmVyc2l0 eSBvZiBTdHJhdGhjbHlkZSkNCiAg4oCiIEZyw6lkw6lyaWMgQm91ciAoVGFyaWRlcykNCiAg4oCi IEV6Z2kgw4dpw6dlayAoRmFjZWJvb2sgTG9uZG9uKQ0KICDigKIgWW91eW91IENvbmcgKFRva3lv IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5KQ0KICDigKIgUmljaGFyZCBBLiBFaXNlbmJlcmcgKFR3 ZWFnIEkvTykNCiAg4oCiIE1hcnRpbiBFbHNtYW4gKFVuaXZlcnNpdHkgb2YgQ29wZW5oYWdlbiwg RGVubWFyaykNCiAg4oCiIE9oYWQgS2FtbWFyIChVbml2ZXJzaXR5IG9mIEVkaW5idXJnaCkNCiAg 4oCiIE5hb2tpIEtvYmF5YXNoaSAoVW5pdmVyc2l0eSBvZiBUb2t5bywgSmFwYW4pDQogIOKAoiBC ZW5vw650IE1vbnRhZ3UgKElucmlhKQ0KICDigKIgSm9uYXRoYW4gUHJvdHplbmtvIChNaWNyb3Nv ZnQgUmVzZWFyY2gpIChDaGFpcikNCiAg4oCiIEtyaXN0aW5hIFNvamFrb3ZhIChJTlJJQSBQYXJp cykNCiAg4oCiIERvbiBTeW1lIChNaWNyb3NvZnQpDQogIOKAoiBNYXTDrWFzIFRvcm8gKFVuaXZl cnNpdHkgb2YgQ2hpbGUpDQogIOKAoiBLYXRzdWhpcm8gVWVubyAoVG9ob2t1IFVuaXZlcnNpdHkp DQoNCg0KQ29xLW9mLW9jYW1sIHRvIHRyYW5zbGF0ZSBPQ2FtbCB0byBDb3ENCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY29xLW9mLW9jYW1sLXRvLXRyYW5z bGF0ZS1vY2FtbC10by1jb3EvODI4OC8xPg0KDQoNCkd1aWxsYXVtZSBDbGFyZXQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gcHJlc2VudCB0aGUg W2NvcS1vZi1vY2FtbF0gcHJvamVjdCwgdG8gdHJhbnNsYXRlIGENCiAgc3Vic2V0IG9mIE9DYW1s IHRvIHRoZSBbQ29xXSBwcm9vZiBhc3Npc3RhbnQuIFRoZSBhaW0gaXMgdG8gZG8gZm9ybWFsDQog IHZlcmlmaWNhdGlvbiBvbiBPQ2FtbCBwcm9ncmFtcy4gVGhlIGlkZWEgaXMgdG8gZ2VuZXJhdGUg YSBDb3ENCiAgdHJhbnNsYXRpb24gYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlIG9yaWdpbmFs IGNvZGUgaW4gdGVybXMgb2YNCiAgaW50ZW50IGJ1dCB1c2luZyB0aGUgQ29xIHN5bnRheC4gQXMg YSBzaG9ydCBleGFtcGxlLCBpZiB3ZSB0YWtlIHRoZQ0KICBmb2xsb3dpbmcgT0NhbWwgY29kZSBh bmQgcnVuIGBjb3Etb2Ytb2NhbWwnOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgJ2Eg dHJlZSA9DQogIOKUgiB8IExlYWYgb2YgJ2ENCiAg4pSCIHwgTm9kZSBvZiAnYSB0cmVlICogJ2Eg dHJlZQ0KICDilIIgDQogIOKUgiBsZXQgcmVjIHN1bSB0cmVlID0NCiAg4pSCICAgbWF0Y2ggdHJl ZSB3aXRoDQogIOKUgiAgIHwgTGVhZiBuIC0+IG4NCiAg4pSCICAgfCBOb2RlICh0cmVlMSwgdHJl ZTIpIC0+IHN1bSB0cmVlMSArIHN1bSB0cmVlMg0KICDilJTilIDilIDilIDilIANCiAgd2UgZ2V0 IHRoZSBmb2xsb3dpbmcgQ29xIGZpbGU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgUmVxdWly ZSBJbXBvcnQgQ29xT2ZPQ2FtbC5Db3FPZk9DYW1sLg0KICDilIIgUmVxdWlyZSBJbXBvcnQgQ29x T2ZPQ2FtbC5TZXR0aW5ncy4NCiAg4pSCIA0KICDilIIgSW5kdWN0aXZlIHRyZWUgKGEgOiBTZXQp IDogU2V0IDo9DQogIOKUgiB8IExlYWYgOiBhIC0+IHRyZWUgYQ0KICDilIIgfCBOb2RlIDogdHJl ZSBhIC0+IHRyZWUgYSAtPiB0cmVlIGEuDQogIOKUgiANCiAg4pSCIEFyZ3VtZW50cyBMZWFmIHtf fS4NCiAg4pSCIEFyZ3VtZW50cyBOb2RlIHtffS4NCiAg4pSCIA0KICDilIIgRml4cG9pbnQgc3Vt ICh0cmVlIDogdHJlZSBpbnQpIDogaW50IDo9DQogIOKUgiAgIG1hdGNoIHRyZWUgd2l0aA0KICDi lIIgICB8IExlYWYgbiA9PiBuDQogIOKUgiAgIHwgTm9kZSB0cmVlMSB0cmVlMiA9PiBaLmFkZCAo c3VtIHRyZWUxKSAoc3VtIHRyZWUyKQ0KICDilIIgICBlbmQuDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFdlIHN1cHBvcnQgdGhlIGZvbGxvd2luZyBPQ2FtbCBmZWF0dXJlczoNCiAg4oCiIHRoZSBj b3JlIG9mIE9DYW1sIChmdW5jdGlvbnMsIGxldCBiaW5kaW5ncywgcGF0dGVybi1tYXRjaGluZyzi gKYpDQogIOKAoiB0eXBlIGRlZmluaXRpb25zIChyZWNvcmRzLCBpbmR1Y3RpdmUgdHlwZXMsIHN5 bm9ueW1zLCBtdXR1YWwgdHlwZXMpDQogIOKAoiBtb25hZGljIHByb2dyYW1zDQogIOKAoiBtb2R1 bGVzIGFzIG5hbWVzcGFjZXMNCiAg4oCiIG1vZHVsZXMgYXMgcG9seW1vcnBoaWMgcmVjb3JkcyAo c2lnbmF0dXJlcywgZnVuY3RvcnMsIGZpcnN0LWNsYXNzDQogICAgbW9kdWxlcykNCiAg4oCiIG11 bHRpcGxlLWZpbGUgcHJvamVjdHMgKHRoYW5rcyB0byBNZXJsaW4pDQogIOKAoiBib3RoIGAubWwn IGFuZCBgLm1saScgZmlsZXMNCiAg4oCiIGV4aXN0ZW50aWFsIHR5cGVzICh3ZSB1c2UgaW1wcmVk aWNhdGl2ZSBzZXRzIG9wdGlvbiBpbiBDb3EpDQoNCiAgV2UgYWxzbyBoYXZlIHNvbWUgc3VwcG9y dCBmb3IgdGhlIEdBRFRzLCB0aGUgcG9seW1vcnBoaWMgdmFyaWFudHMsIGFuZA0KICB0aGUgZXh0 ZW5zaWJsZSB0eXBlcy4gIFdlIGFyZSBpbiBwYXJ0aWN1bGFyIHdvcmtpbmcgb24gaGF2aW5nIGFu DQogIGF4aW9tLWZyZWUgdHJhbnNsYXRpb24gb2YgdGhlIEdBRFRzIHRvIENvcS4gV2UgZG8gbm90 IHN1cHBvcnQ6DQogIOKAoiBzaWRlLWVmZmVjdHMgb3V0c2lkZSBvZiBhIG1vbmFkIChyZWZlcmVu Y2VzLCBleGNlcHRpb25zLCDigKYpOw0KICDigKIgb2JqZWN0LW9yaWVudGVkIHByb2dyYW1taW5n Ow0KICDigKIgdmFyaW91cyBjb21iaW5hdGlvbnMgb2YgT0NhbWwgZmVhdHVyZXMgZm9yIHdoaWNo IGBjb3Etb2Ytb2NhbWwnDQogICAgc2hvdWxkIGdlbmVyYXRlIGEgd2FybmluZy4NCg0KICBPdXIg bWFpbiBleGFtcGxlIGFuZCB1c2UgY2FzZSBpcyB0aGUgW2NvcS10ZXpvcy1vZi1vY2FtbF0NCiAg cHJvamVjdC4gVGhpcyBjb250YWlucyBhIHRyYW5zbGF0aW9uIG9mIG1vc3Qgb2YgdGhlIFtlY29u b21pYw0KICBwcm90b2NvbF0gb2YgdGhlIFtUZXpvc10gYmxvY2tjaGFpbiAoYXJvdW5kIDMwLjAw MCBsaW5lcyBvZiBPQ2FtbA0KICB0cmFuc2xhdGVkIHRvIDQwLjAwMCBsaW5lcyBvZiBDb3EpLiBG b3IgZXhhbXBsZSwgd2UgdmVyaWZ5IHRoZQ0KICBjb21wYXJpc29uIGZ1bmN0aW9ucyBkZWZpbmVk IGluDQogIFtzcmMvcHJvdG9fYWxwaGEvbGliX3Byb3RvY29sL3NjcmlwdF9jb21wYXJhYmxlLm1s XSB3aXRoDQogIFtzcmMvUHJvdG9fYWxwaGEvUHJvb2ZzL1NjcmlwdF9jb21wYXJhYmxlLnZdLg0K DQogIFdlIGFyZSBsb29raW5nIGZvciB0aGUgYXBwbGljYXRpb24gdG8gb3RoZXIgcHJvamVjdHMg dG9vLg0KDQogIFdlIHRoaW5rIHRoZSBiZXN0IHdheSB0byB1c2UgYGNvcS1vZi1vY2FtbCcgaXMg dG8gY29udGludWUgZGV2ZWxvcGluZw0KICBpbiBPQ2FtbCBhbmQgcnVuIGBjb3Etb2Ytb2NhbWwn IHRvIGtlZXAgYSBzeW5jaHJvbml6ZWQgdHJhbnNsYXRpb24gaW4NCiAgQ29xLiBIYXZpbmcgYSB3 b3JraW5nIENvcSB0cmFuc2xhdGlvbiAoYXMgY29tcGlsaW5nIGluIENvcSkgZm9yY2VzIHVzDQog IHRvIGF2b2lkIHNvbWUgT0NhbWwgY29uc3RydWN0cy4gV2UgYmVsaWV2ZSB0aGVzZSBjb25zdHJ1 Y3RzIHdvdWxkDQogIHByb2JhYmx5IGJlIGhhcmQgdG8gdmVyaWZ5IGFueXdheS4gVGhlbiwgb24g dGhlIENvcSBzaWRlLCB3ZSBjYW4NCiAgdmVyaWZ5IHNvbWUgaW1wb3J0YW50IG9yIGVhc3kgdG8g Y2F0Y2ggcHJvcGVydGllcy4gSWYgdGhlcmUgaXMgYQ0KICByZWdyZXNzaW9uIGluIHRoZSBPQ2Ft bCBjb2RlLCByZS1ydW5uaW5nIGBjb3Etb2Ytb2NhbWwnIHNob3VsZCBtYWtlDQogIHRoZSBwcm9v ZnMgYnJlYWsuDQoNCg0KW2NvcS1vZi1vY2FtbF0gPGh0dHBzOi8vY2xhcnVzLmdpdGh1Yi5pby9j b3Etb2Ytb2NhbWwvPg0KDQpbQ29xXSA8aHR0cHM6Ly9jb3EuaW5yaWEuZnIvPg0KDQpbY29xLXRl em9zLW9mLW9jYW1sXQ0KPGh0dHBzOi8vbm9tYWRpYy1sYWJzLmdpdGxhYi5pby9jb3EtdGV6b3Mt b2Ytb2NhbWwvPg0KDQpbZWNvbm9taWMgcHJvdG9jb2xdDQo8aHR0cHM6Ly9naXRsYWIuY29tL3Rl em9zL3Rlem9zLy0vdHJlZS9tYXN0ZXIvc3JjL3Byb3RvX2FscGhhL2xpYl9wcm90b2NvbD4NCg0K W1Rlem9zXSA8aHR0cHM6Ly90ZXpvcy5jb20vPg0KDQpbc3JjL3Byb3RvX2FscGhhL2xpYl9wcm90 b2NvbC9zY3JpcHRfY29tcGFyYWJsZS5tbF0NCjxodHRwczovL2dpdGxhYi5jb20vdGV6b3MvdGV6 b3MvLS9ibG9iL21hc3Rlci9zcmMvcHJvdG9fYWxwaGEvbGliX3Byb3RvY29sL3NjcmlwdF9jb21w YXJhYmxlLm1sPg0KDQpbc3JjL1Byb3RvX2FscGhhL1Byb29mcy9TY3JpcHRfY29tcGFyYWJsZS52 XQ0KPGh0dHBzOi8vbm9tYWRpYy1sYWJzLmdpdGxhYi5pby9jb3EtdGV6b3Mtb2Ytb2NhbWwvZG9j cy9wcm9vZnMvc2NyaXB0X2NvbXBhcmFibGU+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3Nl bmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4N Cg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpb UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8v Y2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 10 to 17, 2021.

http-multipart-formdata v3.0.1 released

Continuing the thread from last week, Hannes Mehnert = asked

Thanks for your work on that. I'm curious about the different "multipart" l= ibraries now available for OCaml – anyone has a brief comparison of them?

Are there functional differences? Correctness? Performance? Or just a matte= r of style and co-development?

Bikal Lem replied

One obvious difference among the three is http-multipart-formdata doesn't depend on any IO/Promise libraries, such as lwt or async. so you may find it easier to in= tegrate in your project.

mulitpart-form-data exposes a callback based streaming api, wh= ereas http-multipart-formdata exposes a non-callback, non-blocking based API streaming api.

The API surface of http-multipart-formdata is kept as low as p= ossible, primarily 3 API calls - boundary, reader and read call.

The dependency list of http-multipart-formdata is the thinnest= . This may or may not be an issue depending on your aesthetics. However, relatively/comparatively the l= ess your dependencies, the easier it is to integrate the lib with other OCaml libs a= nd environments such as various OSes.

Bikal Lem added

I should also add http-multipart-formdata has been implemented= with zero-copy streaming and minimal allocation in mind.

Call for participation: ML Family Workshop 2021

Jonathan Protzenko announced

We are happy to announce that the ML Family Workshop is back for its 2021 edition, which we will be held online on Thursday August 26th, in conjunction with ICFP 2021. We invite you to subscribe to, and attend the workshop, in addition to the main ICFP conference.

We are thrilled to announce that Don Syme will give this year's keynote: "Narratives and Lessons from The Early History of F#". Please join us!

The program features 14 exciting submissions, including 4 short talks. The workshop will be held online in the 6pm-3am time band (Seoul Time). Talks will be pre-recorded and uploaded online for those who cannot attend.

Program committee

  • Danel Ahman (University of Ljubljana)
  • Robert Atkey (University of Strathclyde)
  • Fr=C3=A9d=C3=A9ric Bour (Tarides)
  • Ezgi =C3=87i=C3=A7ek (Facebook London)
  • Youyou Cong (Tokyo Institute of Technology)
  • Richard A. Eisenberg (Tweag I/O)
  • Martin Elsman (University of Copenhagen, Denmark)
  • Ohad Kammar (University of Edinburgh)
  • Naoki Kobayashi (University of Tokyo, Japan)
  • Beno=C3=AEt Montagu (Inria)
  • Jonathan Protzenko (Microsoft Research) (Chair)
  • Kristina Sojakova (INRIA Paris)
  • Don Syme (Microsoft)
  • Mat=C3=ADas Toro (University of Chile)
  • Katsuhiro Ueno (Tohoku University)

Coq-of-ocaml to translate OCaml to Coq

Guillaume Claret announced

I am pleased to present the coq-of-ocaml project, to translate a subset of OCaml to the Coq= proof assistant. The aim is to do formal verification on OCaml programs. The idea is to generate a C= oq translation as close as possible to the original code in terms of intent but using the Coq= syntax. As a short example, if we take the following OCaml code and run coq-of-oca= ml:

type 'a tree =3D
| Leaf of 'a
| Node of 'a tree * 'a tree

let rec sum tree =3D
  match tree with
  | Leaf =
n -> n
  | Node =
(tree1, tree2) -> sum tree1 + sum tree2

we get the following Coq file:

Require Import CoqOfOCaml.CoqOfOCaml.
Require Import CoqOfOCaml.Settings.

Inductive tree (a : Set) : Set :=3D
| Leaf : a -> tree a
| Node : tree a -> tree a -> tree a.

Arguments Leaf {_}.
Arguments Node {_}.

Fixpoint sum (tree : tree int) : int :=3D
  match tree with
  | Leaf n =3D> n
  | Node tree1 tree2 =3D> Z.add (sum tree1) (sum tree2)
  end.

We support the following OCaml features:

  • the core of OCaml (functions, let bindings, pattern-matching,…)<= /li>
  • type definitions (records, inductive types, synonyms, mutual types)
  • monadic programs
  • modules as namespaces
  • modules as polymorphic records (signatures, functors, first-class modul= es)
  • multiple-file projects (thanks to Merlin)
  • both .ml and .mli files
  • existential types (we use impredicative sets option in Coq)

We also have some support for the GADTs, the polymorphic variants, and the = extensible types. We are in particular working on having an axiom-free translation of the GAD= Ts to Coq. We do not support:

  • side-effects outside of a monad (references, exceptions, …);
  • object-oriented programming;
  • various combinations of OCaml features for which coq-of-ocaml should generate a warning.

Our main example and use case is the coq-tezos-of= -ocaml project. This contains a translation of most of the economic protocol of the Tezos blockchain (around 30.000 lines of= OCaml translated to 40.000 lines of Coq). For example, we verify the comparison functions defined in src/proto_alpha/lib_protocol/script_compara= ble.ml with src/Proto_alpha/Proofs/Script_comparable.v.

We are looking for the application to other projects too.

We think the best way to use coq-of-ocaml is to continue devel= oping in OCaml and run coq-of-ocaml to keep a synchronized translation in Coq. Having= a working Coq translation (as compiling in Coq) forces us to avoid some OCaml constructs. We believe = these constructs would probably be hard to verify anyway. Then, on the Coq side, we can veri= fy some important or easy to catch properties. If there is a regression in the OCaml code, re= -running coq-of-ocaml should make the proofs break.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B0AA6E002F for ; Tue, 24 Aug 2021 15:44:28 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=AtLG=NP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3A16vl4xLXfmy0bn1c/dmcuDlgWUAX0o4c3iYr45Y?= =?us-ascii?q?qw4hDbr6kt8y7ehCFvbM81RSUAs3y0LFts6LuqafuWGgNs96qkUspV9hybSIDk?= =?us-ascii?q?tgchAc6AcSIWgXRJf/uaDEmTowZDAc2t360PlJIF8ngelbcvmO97SIIGhX4KAF?= =?us-ascii?q?5Ovn5FpTdgsipy+y+4ZnebxhHiDe9Y755MQm7oxjWusQKm4VpN7w/ygHOontGe?= =?us-ascii?q?uRWwX1nKFeOlBvi5cm+4YBu/T1It/0u68BPX6P6f78lTbNDFzQpL3o15Mzwuhb?= =?us-ascii?q?dSwaE+2YRXX8XkhpMBAjF8Q36U5LsuSb0quZxxC+XNtDxQr4pRDSi9L9rRwH0h?= =?us-ascii?q?ycbOTA592TXhdZxjKJdvRmtoxNyzorRbIyTNPZwfaXdfc0bRWpaX8ZeTChBDZ2?= =?us-ascii?q?hZIoBCOoBJ/tXr5LgrFcKoxayGQygCeXywTFKm3D2x7U33eQ/Hw/b0gIuHN0Bv?= =?us-ascii?q?2jPodrvKKsfS/q4wLXUwTjBaf5dxDfz6JLPchAkufyBQbZwftDXyUIyCg3KklW?= =?us-ascii?q?QqYnkPzOJyuQGrm+W4PBkVe21jW4rsRpxrSSvxscpi4nJmp4Vx0vc9SV+xIY0J?= =?us-ascii?q?cG4R1Bnbt6kFptQtjiaN5ZoTc84RGFooik6x6QAtJWmcycE1I4pyATDa/ybbYe?= =?us-ascii?q?I+BTjWf6RLzp6mH9oerGyihK8/0WuyeDxUsu53VlFoyRLjtTBtG0A2h3Q58WDS?= =?us-ascii?q?/Zw+lus1SuS2w3Q7uxKL0E5m6rGJpAhxLM7i5QdsUPGHiDsmUX2irebdl069ei?= =?us-ascii?q?06uTnfqvppoebN49xjwHxLL4imsqhDuQkKgQOWHSU9v651L3n50H5R69KjvIun?= =?us-ascii?q?qnWsZDaOcQbprOiDANPzokj7BO/Ay+p0NQZgXkHLE9Fdwmdg4joPFHCOOz3Dfe?= =?us-ascii?q?ljFS2lDdk2evGMaP9AprRNHTMjLDhfbNl505TyQoz0dRf6IhPBb0bPP3zXUrxu?= =?us-ascii?q?MTdDhAnLgO0wvvnCNBn2owCXmKPB7eVMKLPvl6I4uIvJ/OAZIgPuDbyLfUu+v3?= =?us-ascii?q?gjWchlFMAY6Wk2YEbZG2kEvlpOUmUb2bgjs0PHGoFpgYyUeLnhECYXTJNZ3u/U?= =?us-ascii?q?Lgw6iwnBI68EIvORJyhjbqc1ymhBJJWfHpJClWUHHfoaYqEX/AMZTqXIs5ujzA?= =?us-ascii?q?IT6ChS4gl1RCuqA/11aZoLurS+i0ZrJLjycZ66/fUlREo+jx4F8Wd02eTQGFoh?= =?us-ascii?q?m4EWiE60aRlrUBg1luO3rJ0jvJEGdBJ6f5EXR82NZvGwOx7D9DyVBjBftCMSFu?= =?us-ascii?q?+X9uoHSw/Qs4pztISf0ZzHdSsgwjb0SSwG7IVj7uLBJg086LAwXf+O8Z9y3DH1?= =?us-ascii?q?Kk4klkpXNFDNWq8hq5w7wXcHYrJnF+fl6qwbqQTwC7N9GKCzWqSoEFVSxV/UaL?= =?us-ascii?q?YXXAZekTZs8/56lnHT7KhBrUrKAxBydSNKqdScN3mkU1GROv/ONTZe2++h32/B?= =?us-ascii?q?ROMxr+VaIrqen4d3DnGBUgfkwET+G6GOhIkCiegpWLeFj1uGkj1b0Pi6+kt4E+?= =?us-ascii?q?8GwUw0AfAJxllyLyd/gETw/qRV6VXlvgPpyFr430gF0m799bXEMab4QttbaFYJ?= =?us-ascii?q?9Qn7wEDnWnQsgg4Op27M4hjgEQfekJ5pRDAzRJyX6xEmM5il3gqyQtuNerM2Vd?= =?us-ascii?q?IcXWD1pD1O6HLAnH1+AGzZqXW3FDHzdvQ/b0Avqdr427/tR2kQxJxu05s1MNYh?= =?us-ascii?q?iTNjn0rJA8CCNTpVUIm6xVxp7fbezQwoYTO2i81WUFRmifF38M1CeAlzBe5Yto?= =?us-ascii?q?ZN7mLRlaa+yIyDc+zLucngB6sMgJCO/pdpvdcAg=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AcrBht61iJfTZVe4pnp/LyQqjBTByeYIsimQD?= =?us-ascii?q?101hICG9JPbo4/xG+85rpyMc6QxhK03I9urvBEDtex7hHNtOkPgs1NSZLX7bUQ?= =?us-ascii?q?mTXf9fBOLZqlWKcREWtNQtpZuIGJIQNDSfNzRHpPe/yxW3ANYkxdHC2LqzhenY?= =?us-ascii?q?w3oocAcCUdAc0y5JTi2GHF53QQxPQbA5HJ2T6scCiDqtfHkMB/7LeUUtbqzpu9?= =?us-ascii?q?PZlJfiaVotARo/7g6Dii7A0s+eLzGomjwDXSBOxLIrtUfBmwLij5/Tz82T+1v2?= =?us-ascii?q?y2HB75FSkJ/CxstcAteAkKEuW1LRozftT5huSL2GuThwmfqu7k0rjcmkmWZbA+?= =?us-ascii?q?1Dr1jMcHK0pB7knzD61jsz4WKK8y77vVLT5efkSiE7Ds9IwblUegHe7CMb3e1U?= =?us-ascii?q?4eZhw2yLt59TBVf6kD764sTUVxds/3DE2kYKoKo5k3JNUY4aYPtqoZMS50NJAP?= =?us-ascii?q?47bUTHwbFiO/VhH8HY4f4TS06TcmzC11MfuOCEbzAZAhmUQk0GsoipwyFb9UoY?= =?us-ascii?q?82IogOcCkGQB8Zc0D6V+wo3/Q9FVvYALZdMZfqJ5Ae9EfsetEGzKRnv3QQavCG?= =?us-ascii?q?WiP70IKHLJrpay3r0p7uDvQ5AB1p008a6xM29whCoYZ0z8CciK1Nl08xalehTF?= =?us-ascii?q?YQjQ?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AAAQASaxphlyIeaIFahAVZQQFkVzoxA?= =?us-ascii?q?oRFiQSGIAEkgiSDKIV1hleNHANPEAEDAQ0qAQ4FAQIEAQGEHD8EAgJRAQSCFQI?= =?us-ascii?q?eBgEFMxMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBCRsGXoVoDYIiEwwMAwODd?= =?us-ascii?q?wEhBAY/BAYcIwMUAQYDAhEBFwEUChcBEhqCITYBgwcFCotimwCBCn8ygQGDTQE?= =?us-ascii?q?WGIQ7gWMNAhSBABeFcFNIAYJtCINwKRCBVUSECm6CSxcBAQEBAYE7AQEIToJhF?= =?us-ascii?q?4JNBIMhJg4LMxcbGwwBGwcECgUqAQEEE0ESBiABBwMZGRsCSAsRKZEXEwgWjEO?= =?us-ascii?q?DMocGk1drLQeDK4ExBguHZoEVjEWHe4NlgUihSCGVcIIehleBCwmBdEGTV4Uwg?= =?us-ascii?q?U0qgUwBGwIMBzMaMEOCNQEzCWAOj0YBAoJJgmSBdTuFGjI/MgIBAQcHJgIGAQo?= =?us-ascii?q?BAQMJgQgBAQUTCwGIRwEB?= X-IPAS-Result: =?us-ascii?q?A0AAAQASaxphlyIeaIFahAVZQQFkVzoxAoRFiQSGIAEkgiS?= =?us-ascii?q?DKIV1hleNHANPEAEDAQ0qAQ4FAQIEAQGEHD8EAgJRAQSCFQIeBgEFMxMBAgQVA?= =?us-ascii?q?QEFAQEBAgEDAwQBEwEBAQEBAQEBCRsGXoVoDYIiEwwMAwODdwEhBAY/BAYcIwM?= =?us-ascii?q?UAQYDAhEBFwEUChcBEhqCITYBgwcFCotimwCBCn8ygQGDTQEWGIQ7gWMNAhSBA?= =?us-ascii?q?BeFcFNIAYJtCINwKRCBVUSECm6CSxcBAQEBAYE7AQEIToJhF4JNBIMhJg4LMxc?= =?us-ascii?q?bGwwBGwcECgUqAQEEE0ESBiABBwMZGRsCSAsRKZEXEwgWjEODMocGk1drLQeDK?= =?us-ascii?q?4ExBguHZoEVjEWHe4NlgUihSCGVcIIehleBCwmBdEGTV4UwgU0qgUwBGwIMBzM?= =?us-ascii?q?aMEOCNQEzCWAOj0YBAoJJgmSBdTuFGjI/MgIBAQcHJgIGAQoBAQMJgQgBAQUTC?= =?us-ascii?q?wGIRwEB?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="391005435" X-MGA-submission: =?us-ascii?q?MDH/9kkb7DlEQu4jVioUv+TjRCODyfJvRGZ3/+?= =?us-ascii?q?J7yLeLMBPjZ9FK+CUkQPSr3O1s3K6sBue8vMJO0Z+nL9MDS/JNTB4xP8?= =?us-ascii?q?XWyJV0spafvx3msMklo2UIMX8dbkTlmZfl9J7z5ItEcoZTB2TqKPO30R?= =?us-ascii?q?qP1v3Dhd5bSHunSEe601IdKQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 24 Aug 2021 15:44:26 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5DF6F5605BC; Tue, 24 Aug 2021 15:44:25 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 24 Aug 2021 15:44:25 +0200 Message-ID: <87o89nez46.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 24 15:44:25 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.040932, queueID=A5ECB5605BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 17 to 24, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 routes v1.0.0 released Feather 0.3.0 Release of GopCaml-mode (0.0.3) and GopCaml-mode-Merlin (0.0.4) - Wizardry = release Share my experience about running OCaml on WebAssembly Old CWN routes v1.0.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anurag Soni announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce release of version 1.0.0 of [routes]. The PR to opam repository has been merged, and the new release should be available via opam once the package cache refreshes. *Routes* provides a DSL for bi-directional URI dispatch. It allows writing route definitions that can be used for both matching, and printing URI paths. Changes since the last opam release: =E2=80=A2 Support for merging two routers by adding a union operation ([#= 115], [@Chattered]) =E2=80=A2 Support for wildcard parameters ([#118], [#129], [@Lupus]) -> Compile time checks ensure that wildcard parameters can only be defined at the end of a route =E2=80=A2 Support `map' operation for path parameter definitions, and sup= port defining path prefixes that can be pre-prended to other routes ([#121], [@Chattered]) =E2=80=A2 Addition of a `ksprintf' style function for routes. ([#123], [@Chattered]) Examples of how to use the library are available in the [tests] and in a [small demo] Documentation can be found [here] *Edit* 1.0.0 is available via opam now - [routes] [#115] [@Chattered] [#118] [#129] [@Lupus] [#121] [#123] [tests] [small demo] [here] Feather 0.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charles announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I'm happy to announce Feather 0.3.0! Feather is a minimal library for bash-like scripting and process execution. ([github/tutorial], [documentation]) This release adds two major features: [github/tutorial] [documentation] 1. A new interface for collecting the exit status, stdout, and stderr of a = Feather command. =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C For example, you can easily print a process's stderr if it exits non-zero: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Feather;; =E2=94=82 let stderr, status =3D =E2=94=82 process "ls" [ "/tmp/does-not-exist" ] |> collect stderr_and_= status =E2=94=82 in =E2=94=82 if status <> 0 then failwith ("ls failed with stderr:\n" ^ stde= rr) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where the types are =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val process : string -> string list -> cmd =E2=94=82=20 =E2=94=82 type 'a what_to_collect =E2=94=82 val stderr_and_status : (string * int) what_to_collect =E2=94=82=20 =E2=94=82 val collect : =E2=94=82 ?cwd:string -> =E2=94=82 ?env:(string * string) -> =E2=94=82 'a what_to_collect -> =E2=94=82 cmd -> =E2=94=82 'a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 as you can imagine, we expose several of these `what_to_collect''s. Here's the full set: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val stdout : string what_to_collect =E2=94=82 val stderr : string what_to_collect =E2=94=82 val status : int what_to_collect =E2=94=82=20 =E2=94=82 val stdout_and_stderr : (string * string) what_to_collect =E2=94=82 val stdout_and_status : (string * int) what_to_collect =E2=94=82 val stderr_and_status : (string * int) what_to_collect =E2=94=82=20 =E2=94=82 type everything =3D { stdout : string; stderr : string; status = : int } =E2=94=82 val everything : everything what_to_collect =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We considered different design approaches here. I think what we landed on keeps the call site readable and the types of the interface simple. It should be noted: the simplest way to run a command without collecting anything is to use [Feather.run]. [Feather.run] 2. The ability to wait on background processes and collect their output. =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Starting with Feather 0.1.0, you were able to start processes in the background, but the only way to wait for them to complete was to use Feather's [async wrapper]. For those wanting an async-less, direct-style interface, we now expose new methods to do this properly: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a background_process =E2=94=82=20 =E2=94=82 val run_in_background : =E2=94=82 ?=E2=81=A0cwd:string -> =E2=94=82 ?=E2=81=A0env:(string * string) Base.list -> =E2=94=82 cmd -> =E2=94=82 unit background_process =E2=94=82=20 =E2=94=82 val collect_in_background : =E2=94=82 ?cwd:string -> =E2=94=82 ?env:(string * string) list -> =E2=94=82 'a what_to_collect -> =E2=94=82 cmd -> =E2=94=82 'a background_process =E2=94=82=20 =E2=94=82 val wait : 'a background_process -> 'a =E2=94=82 val wait_all : unit -> unit =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where an example use might be =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let server_process =3D =E2=94=82 process "my-server.exe" [] |> collect_in_background stdout_a= nd_status =E2=94=82 in =E2=94=82 ... do other things ... =E2=94=82 match Feather.wait server_process with =E2=94=82 | (stdout, 0) -> ... =E2=94=82 | (_, 1) -> ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thanks again to @Firobe and @tmarti2 for their contributions to this release! I think we've made a lot of progress here and I'm excited to see where things go :slight_smile: [async wrapper] Release of GopCaml-mode (0.0.3) and GopCaml-mode-Merlin (0.0.4) - Wizardry = release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I'm pleased to announce the latest version of *GopCaml-mode* (0.0.3), and the new release of *GopCaml-mode-Merlin* (0.0.4). GopCaml-mode-Merlin is a brand *new!* variant of GopCaml-mode that uses the Merlin parser rather than the OCaml compiler-libs one, and thus has some level of robustness to invalid syntax: If that's piqued your interest, I'd recommend checking out the release posts for the previous versions for more details on what GopCaml can do, and how to get it: [0.0.2 release], [0.0.1 release] The Merlin parser seems to assign text-regions for syntactic constructs slightly more liberally than the standard OCaml parser, so the overlays can feel a bit weird if you're used to the normal GopCaml overlays, but the benefit is that all your favorite structural movement/transformation operations work even when you're dealing with ill-formed programs, allowing for a more fluid editing experience: [0.0.2 release] [0.0.1 release] Detailed Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 *new!* [for GopCaml-mode-Merlin] *Robustness to ill-formated sy= ntax* =E2=80=A2 Vendored a copy of Merlin to reuse its parser and thereby gain it's robustness to invalid syntax. =E2=80=A2 *new!* *Added support for customisable verbosity* =E2=80=A2 Customise the Emacs variable `gopcaml-messaging-level` to cha= nge the level of messages that are output by GopCaml. Set it to `'none` to disable messages entirely. =E2=80=A2 *new!* *Fixed bug when starting zipper mode at the start of a f= ile.* =E2=80=A2 Zipper mode selects the immediately prior byte position to av= oid inconsistencies when the cursor is just on the edge of an expression, but when the cursor is at position 1, this causes an error as 0 is not a valid point. =E2=80=A2 *new!* *Special casing of shebangs* =E2=80=A2 Added support for handling shebangs at the start of a buffer. =E2=80=A2 Implemented as part of a larger library for preprocessing buffertext before running the parser on it - could be extended to support additional preprocessing in the future. =E2=80=A2 Another possible direction for extension is to use an Emacs callback to modify the text, although this may not be ideal, as the parsing has to be as fast as possible. Get Gopcaml-mode =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Its as easy as 1, 2, 3! 1. Install from opam (either `gopcaml-mode` xor `gopcaml-mode-merlin`): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install gopcaml-mode =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install gopcaml-mode-merlin =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 2. Compile your emacs with support for dynamic modules 3. Load gopcaml-mode in your init.el: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (let ((opam-share (ignore-errors (car (process-lines "opam" = "var" "share"))))) =E2=94=82 (when (and opam-share (file-directory-p opam-share)) =E2=94=82 ;; Register Gopcaml mode =E2=94=82 (add-to-list 'load-path (expand-file-name "emacs/site-= lisp" opam-share)) =E2=94=82 (autoload 'gopcaml-mode "gopcaml-mode" nil t nil) =E2=94=82 (autoload 'tuareg-mode "tuareg" nil t nil) =E2=94=82 (autoload 'merlin-mode "merlin" "Merlin mode" t) =E2=94=82 ;; Automatically start it in OCaml buffers =E2=94=82 (setq auto-mode-alist =E2=94=82 (append '(("\\.ml[ily]?$" . gopcaml-mode) =E2=94=82 ("\\.topml$" . gopcaml-mode)) =E2=94=82 auto-mode-alist)) =E2=94=82 )) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 See the [release post ] for version 0.0.1 for detailed instructions on how you can install it. [release post ] Contribute =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 Github: [GitHub - Gopiandcode/gopcaml-mode: [MIRROR] Ultimate O= caml Editing Mode] =E2=80=A2 Gitlab: [Kiran Gopinathan / gopcaml-mode =C2=B7 GitLab ] [GitHub - Gopiandcode/gopcaml-mode: [MIRROR] Ultimate Ocaml Editing Mode] [Kiran Gopinathan / gopcaml-mode =C2=B7 GitLab ] Share my experience about running OCaml on WebAssembly =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Vincent Chan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In the last two weeks, I was working on migrating OCaml to WebAssembly. I wrote an article to share my experience. [Run OCaml in the browser by WebAssembly | by Vincent Chan | Aug, 2021 | Medium] [Run OCaml in the browser by WebAssembly | by Vincent Chan | Aug, 2021 | Medium] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 17 to 24, 2021.

routes v1.0.0 released

Anurag Soni announced

I'd like to announce release of version 1.0.0 of routes. The PR to opam repository has been merged, and the new release should be available via opa= m once the package cache refreshes.

Routes provides a DSL for bi-directional URI dispatch. It allows wri= ting route definitions that can be used for both matching, and printing URI paths.

Changes since the last opam release:

  • Support for merging two routers by adding a union operation (#115, @Chattered)
  • Support for wildcard parameters (#118, #129, @Lupus) -&g= t; Compile time checks ensure that wildcard parameters can only be defined = at the end of a route
  • Support map operation for path parameter definitions, and = support defining path prefixes that can be pre-prended to other routes (#121, @Chattered)
  • Addition of a ksprintf style function for routes. (#123, @Chattered)

Examples of how to use the library are available in the tests and in a small demo

Documentation can be found here

Edit

1.0.0 is available via opam now - http://opam.ocaml.org/packages/routes/routes.1.0.0/=

Feather 0.3.0

Charles announced

I'm happy to announce Feather 0.3.0! Feather is a minimal library for bash-= like scripting and process execution. (github/tutorial, d= ocumentation) This release adds two major features:

1. A new interface for collecting the exit status, st= dout, and stderr of a Feather command.

For example, you can easily print a process's stderr if it exits non-zero:

open Feather;;
let stderr, status<=
/span> =3D
  process "ls" [ "/tmp/does-not-exist" ] |> collect stderr_and_status
in
if status <> 0 then failwith ("ls failed with stderr:\n" ^ stderr)

where the types are

val process : string -&g=
t; string list -> cmd

type 'a what_to_collect
val stderr_and_status : (string * int) what_to_coll=
ect

val collect :
  ?cwd:string ->
  ?env:(string * string) ->
  'a what_to_collect ->
  cmd ->
  'a

as you can imagine, we expose several of these what_to_collect= 's. Here's the full set:

val stdout : string what=
_to_collect
val stderr : string what_to_collect
val status : int what_to_collect

val stdout_and_stderr : (string * string) what_to_c=
ollect
val stdout_and_status : (string * int) what_to_coll=
ect
val stderr_and_status : (string * int) what_to_coll=
ect

type everything =3D { stdout : string; stderr : stri=
ng; status : int }
val everything : everything what_to_collect

We considered different design approaches here. I think what we landed on k= eeps the call site readable and the types of the interface simple.

It should be noted: the simplest way to run a command without collecting an= ything is to use Feather.run.

2. The ability to wait on background processes and co= llect their output.

Starting with Feather 0.1.0, you were able to start processes in the backgr= ound, but the only way to wait for them to complete was to use Feather's async wrapper. For those wanting an async-less, direct-style interface, we now expose new methods to do this pr= operly:

type 'a background_process

val run_in_background :
  ?⁠cwd:string ->
  ?⁠env:(string * string) Base.list ->
  cmd ->
  unit background_process

val collect_in_background :
  ?cwd:string ->
  ?env:(string * string) list ->
  'a what_to_collect ->
  cmd ->
  'a background_process

val wait : 'a background_process -> 'a
val wait_all : unit -> unit

where an example use might be

let server_process =3D
   process "my-server.exe" [] |> collect_in_background stdout_and_status
in
... do other things ...
match with
| (stdout, 0) -> ...
| (_, 1) -> ...

Thanks again to @Firobe and @tmarti2 for their contributions to this releas= e! I think we've made a lot of progress here and I'm excited to see where things go :slight_smile:

Release of GopCaml-mode (0.0.3) and GopCaml-mode-Merlin (0.0.4= ) - Wizardry release

Kiran Gopinathan announced

I'm pleased to announce the latest version of GopCaml-mode (0.0.3), = and the new release of GopCaml-mode-Merlin (0.0.4).

GopCaml-mode-Merlin is a brand new! variant of GopCaml-mode that use= s the Merlin parser rather than the OCaml compiler-libs one, and thus has some level of robustness to invalid syntax:

3D"a09586b9db3b=

If that's piqued your interest, I'd recommend checking out the release post= s for the previous versions for more details on what GopCaml can do, and how to get it: 0.0.2 release, 0.0.1 release

The Merlin parser seems to assign text-regions for syntactic constructs sli= ghtly more liberally than the standard OCaml parser, so the overlays can feel a bit weird if you're used to the no= rmal GopCaml overlays, but the benefit is that all your favorite structural movement/transformation operations work e= ven when you're dealing with ill-formed programs, allowing for a more fluid editing experience:

3D"9f2976b47018=

Detailed Changelog

  • new! [for GopCaml-mode-Merlin] Robustness to ill-formated syn= tax
    • Vendored a copy of Merlin to reuse its parser and thereby gain it's rob= ustness to invalid syntax.
  • new! Added support for customisable verbosity
    • Customise the Emacs variable `gopcaml-messaging-level` to change the le= vel of messages that are output by GopCaml. Set it to `'none` to disable me= ssages entirely.
  • new! Fixed bug when starting zipper mode at the start of a fi= le.
    • Zipper mode selects the immediately prior byte position to avoid incons= istencies when the cursor is just on the edge of an expression, but when th= e cursor is at position 1, this causes an error as 0 is not a valid point.<= /li>
  • new! Special casing of shebangs
    • Added support for handling shebangs at the start of a buffer.
    • Implemented as part of a larger library for preprocessing buffertext be= fore running the parser on it - could be extended to support additional pre= processing in the future.
    • Another possible direction for extension is to use an Emacs callback to= modify the text, although this may not be ideal, as the parsing has to be = as fast as possible.

Get Gopcaml-mode

Its as easy as 1, 2, 3!

  1. Install from opam (either `gopcaml-mode` xor `gopcaml-mode-merlin`):

    opam install gopcaml-mode
    

    or

    opam install gopcaml-mode-merlin
    
  2. Compile your emacs with support for dynamic modules
  3. Load gopcaml-mode in your init.el:

    (let ((opam-share (ignore-errors (car =
    (process-lines "opam" "var" "share")))))
        (when (and opam-share (file-directory-p opam-share))
          ;; Register Gopcaml mode
          (add-to-list 'load-path (expand-file-name "emacs/site-lisp" opam-share))
            (autoload 'gopcaml-mode "gopcaml-mo=
    de" nil t nil)
            (autoload 'tuareg-mode "tuareg" nil t nil)
            (autoload 'merlin-mode "merlin" "Merlin mode" t)
          ;; Automatically start it in OCaml buffers
          (setq auto-mode-alist
          (append '(("\\.ml[ily]?$" . go=
    pcaml-mode)
              ("\\.topml$" . gopcaml-mod=
    e))
            auto-mode-alist))
          ))
    

See the release post for version 0.0.1 for detailed instructions on how you can install it.

Share my experience about running OCaml on WebAssembly

Vincent Chan announced

In the last two weeks, I was working on migrating OCaml to WebAssembly. I w= rote an article to share my experience.

Run OCaml in the browser by WebAssembly | by Vincent Chan | = Aug, 2021 | Medium

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 91B65E010C for ; Tue, 7 Sep 2021 15:24:08 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=pOv4=N5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AfluM7RIiZMqBOFmTG9mcuJtgWUAX0o4c3iYr45Y?= =?us-ascii?q?qw4hDbr6kt8y7ehCFvbM81RSUAs3y0LFts6LuqafuWGgNs96qkUspV9hybSIDk?= =?us-ascii?q?tgchAc6AcSIWgXRJf/uaDEmTowZDAc2t360PlJIF8ngelbcvmO97SIIGhX4KAF?= =?us-ascii?q?5Ovn5FpTdgsipy+y+4ZnebxhHiDe9Y755MQm7oxjWusQKm4VpN7w/ygHOontGe?= =?us-ascii?q?uRWwX1nKFeOlBvi5cm+4YBu/T1It/0u68BPX6P6f78lTbNDFzQpL3o15Mzwuhb?= =?us-ascii?q?dSwaE+2YRXX8XkhpMBAjF8Q36U5LsuSb0quZxxC+XNtDxQr4pRDSi9L9rRwH0h?= =?us-ascii?q?ycbOTA592TXhdZxjKJdvRmtoxNyzorRbIyTNPZwfaXdfc0bRWpaX8ZeTChBDZ2?= =?us-ascii?q?hZIoBCOoBJ/tXr5LgrFcKoxayGQygCeXywTFKm3D2x7U33eQ/Hw/b0gIuHN0Bv?= =?us-ascii?q?2jPodrvKKsfS/q4wLXUwTjBaf5dxDfz6JLPchAkufyBQbZwftDXyUIyCg3KklW?= =?us-ascii?q?QqYnkPzOJyuQGrm+W4PBkVe21jW4rsRpxrSSvxscpi4nJmp4Vx0vc9SV+xIY0J?= =?us-ascii?q?cG4R1Bnbt6kFptQtjiaN5ZoTc84RGFooik6x6QAtJWmcycE1I4pyATDa/ybbYe?= =?us-ascii?q?I+BTjWf6QLDp7hH9oe6+yihas/EWjxOPyWcm53VZXoyZYjtXBt34D2RzP58SZV?= =?us-ascii?q?vdw4kev1CqT2g3d5OxJIUI5mLbaJpM/xLM7i5QdsUPGHiDsmUX2irebdl069ei?= =?us-ascii?q?06uTnfqvppoebN49xjwHxLL4imsqhDuQkKgQOWHSU9v651L3n50H5R69KjvIun?= =?us-ascii?q?qnWsZDaOcQbprOiDANPzokj7BO/Ay+p0NsGm3kIMkhFeBObgITzPlHOJOj0Dfi?= =?us-ascii?q?+g1SwkDdr2uvJMqfgApXKNnTDl6vucqx4605Y0Aoz19df64hIBbEGJfL/QlT+t?= =?us-ascii?q?NjfDh8+Ngy72PjoCM9y1o8ERW2PBaqZPLvTsVCW+uIvLfOAZIgPuDbyM/Ql5+L?= =?us-ascii?q?ujWMhmVMDZ6Wp25wXaX6gEvRkOUqZZ2TjgswdEWcQoAUxUvDqhEeeXj5UYna+R?= =?us-ascii?q?7486SshCIKnEIjMWJutjKad0ye8G51afmFGBU2MEHfsc4WIQfAMaDidIsJnjzc?= =?us-ascii?q?KVqChRpc82R2wsAL20adrIvbb9yECu5/vyMJ56uPcmB0q6DB5AdmR33uTQ2x0k?= =?us-ascii?q?W4EXSI60LxlrUBgyFqPza51iOFCG9NJ/fNGSAI6OIbcz+NkD9DyXRrMftKGSVq?= =?us-ascii?q?7WNmmGTYxTtYxwt8SfUlyB9WijhbC3yqzHr8aiaaHBJsu8qLTx3TxJsB9xGja1?= =?us-ascii?q?KQ5klUqXM9COXe7iqJj+AXfHYDEn1mDm6ukeqkQxCvN+32CzWqKskFYSglwUaD?= =?us-ascii?q?dUH4CekXYsMj161vaT7G3F7QqPRNMx9aCJ6ZSct3pilFGRff/ONvAf22xm2GwB?= =?us-ascii?q?ReRxrORcoXmYWId3D/SCEUciQ8T+WyJNQ4kCie6v23eDDluFVPzY0Pw6uRxs3S?= =?us-ascii?q?7TlIyzw6WcUJhzKC5+hsaiP2TUf8T2agEuCg5pzVuAFm9x87WC8aHpwd5YKpTe?= =?us-ascii?q?9Y94FNe2WLdtgx9JYCgIrt5hl8edgR3p1nh2w92CoVGi8gqrWklwBB8KaKCgxt?= =?us-ascii?q?9cGbS2Y/2cPWDLnb01BSwbejQ102IlJ7c8bgJorxw/178uimtF1E+6DNm38hR1?= =?us-ascii?q?z2b/JqcSEIZWJf1F0I27ARSprfAYyB76ZmH+2drNPydtjbEk+kiBO4k1groK95?= =?us-ascii?q?bOaXCDwTyFswGG+C2L+g7h1WibhQFJf1fsqkuMJX1JLO9xKe3MbM4z3qdhmNd7?= =?us-ascii?q?dUigypkGAJ2TfPO1JsehfTEzk2ATTiu1T9JV+jvnoRVeTwZHmy+0DXpQolLaf8?= =?us-ascii?q?rFW7qIWK+eouvwdFvm5PmW3hZ7UOuQVQc153wESc=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ADQAWQa6uMT7qUhvjAAPXwM/XdLJyesId70hD?= =?us-ascii?q?6qkRc3xom6Oj+PxG8M5w6faWslcssRMb9+xoUZPoKRjhHPVOjbX5U43OYCDW/E?= =?us-ascii?q?OWaKti4YHhzzCIIVycysdtkYF6fexbAN30ZGIK6PoSDTPIceod/A=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DpAAASaxphlyIeaIFahAVTRwFkVzoxh?= =?us-ascii?q?EeJBIZFgiSDKIV1hleMC4ERA08QAQMBDSoBDgUBAgQBAYFsgnUCF4JUAh4GAQU?= =?us-ascii?q?zEwECBBUBAQUBAQECAQMDBAETAQEBAQEBAQEJGwZehTsGJw2CNQwMAwODdwEYA?= =?us-ascii?q?wYEBkMiIwMJCwEGAwIEDQEXARQKFwESFAaCVwGDBwUKi2KcCn8ygQGDTQEDAwI?= =?us-ascii?q?OAQ4JhDuBYw0CFIEXhXBTSAGCbQiDcAInEIFVRIEVgiRRboJAFwsBAQEBARd/H?= =?us-ascii?q?gQDAQEITgmCWIJkBIMnIA44BT8jKQgZDgEBCRcCDSAJCBsRBAEHAyoVBAEFBAQ?= =?us-ascii?q?YAS0JAg0UGQORJwYVA4xDgzKHBpNXay0HgyuBMQYLh2aBFYxFh3uDZYFIihuXL?= =?us-ascii?q?SGVcIh1gQsJgjWHcYs9KQIGCySEeYFNKoFMAR0BCwczGjBDgjUBMwkJVw6KC4N?= =?us-ascii?q?zLhaDUIJkgXU7hUw/MgIBAQctAgYBCgEBAwmBCAEBBRMLAYYALIE9XgEB?= X-IPAS-Result: =?us-ascii?q?A0DpAAASaxphlyIeaIFahAVTRwFkVzoxhEeJBIZFgiSDKIV?= =?us-ascii?q?1hleMC4ERA08QAQMBDSoBDgUBAgQBAYFsgnUCF4JUAh4GAQUzEwECBBUBAQUBA?= =?us-ascii?q?QECAQMDBAETAQEBAQEBAQEJGwZehTsGJw2CNQwMAwODdwEYAwYEBkMiIwMJCwE?= =?us-ascii?q?GAwIEDQEXARQKFwESFAaCVwGDBwUKi2KcCn8ygQGDTQEDAwIOAQ4JhDuBYw0CF?= =?us-ascii?q?IEXhXBTSAGCbQiDcAInEIFVRIEVgiRRboJAFwsBAQEBARd/HgQDAQEITgmCWIJ?= =?us-ascii?q?kBIMnIA44BT8jKQgZDgEBCRcCDSAJCBsRBAEHAyoVBAEFBAQYAS0JAg0UGQORJ?= =?us-ascii?q?wYVA4xDgzKHBpNXay0HgyuBMQYLh2aBFYxFh3uDZYFIihuXLSGVcIh1gQsJgjW?= =?us-ascii?q?HcYs9KQIGCySEeYFNKoFMAR0BCwczGjBDgjUBMwkJVw6KC4NzLhaDUIJkgXU7h?= =?us-ascii?q?Uw/MgIBAQctAgYBCgEBAwmBCAEBBRMLAYYALIE9XgEB?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="392272748" X-MGA-submission: =?us-ascii?q?MDEqXKE3SjBBa6kpI9Fdzpcj2Sq4KosFPJBpWh?= =?us-ascii?q?+Ayo8MoLMpbXUx5q5FI4aDUrU/hh0P6eT6BCDcRjKh7FVtSkgV2M6yGc?= =?us-ascii?q?SrWpIUDZz3C9Y8+YePDvxu3P0dsUchoJyzuJhXRivtLHk2DCGRwm53Rl?= =?us-ascii?q?YSiF9rXbkgeOD10PEuLiJkOg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 07 Sep 2021 15:24:06 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BF28C5647CF; Tue, 7 Sep 2021 15:24:04 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 07 Sep 2021 15:23:55 +0200 Message-ID: <87eea08qok.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 7 15:24:05 2021 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.489620, queueID=251B75647D0 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDMxIHRvDQpTZXB0ZW1iZXIgMDcsIDIwMjEuDQoNClRhYmxlIG9mIENvbnRl bnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KSnVzdCByZWludmVudGVkIE9PUA0KdjMuT0NhbWwub3JnOiBBIHJvYWRtYXAgZm9yIE9DYW1s J3Mgb25saW5lIHByZXNlbmNlDQpCZWNvbWUgYW4gT3V0cmVhY2h5IE1lbnRvcjogc3VwcG9ydCB0 aGUgZ3Jvd3RoIGFuZCBkaXZlcnNpdHkgb2YgdGhlIE9DYW1sIGNvbW11bml0eQ0KR2VuZXJhdGlu ZyBzdGF0aWMgYW5kIHBvcnRhYmxlIGV4ZWN1dGFibGVzIHdpdGggT0NhbWwNCk9DYW1sIHF1YW50 LWRldmVsb3BlciBhdCBCbG9vbWJlcmcuIExvbmRvbiBvciBOZXcgWW9yaw0KSFRUUCBjbGllbnQg bGlicmFyeQ0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkp1c3QgcmVpbnZlbnRlZCBP T1ANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvanVzdC1yZWlu dmVudGVkLW9vcC84Mzk5LzE+DQoNCg0KWWF3YXIgQW1pbiBzYWlkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IGxldCAoIC4hW10gKSBvYmogZiA9IGYgb2JqDQogIOKUgiANCiAg4pSCIHR5cGUgcGVyc29uID0g eyBpZCA6IGludDsgbmFtZSA6IHN0cmluZyB9DQogIOKUgiANCiAg4pSCIGxldCBpZCB7IGlkOyBf IH0gPSBpZA0KICDilIIgDQogIOKUgiBsZXQgYm9iID0geyBpZCA9IDE7IG5hbWUgPSAiQm9iIiB9 DQogIOKUgiBsZXQgbmV4dF9pZCA9IGJvYi4hW2lkXS4hW3N1Y2NdDQogIOKUlOKUgOKUgOKUgOKU gA0KDQogID09PiAyDQoNCg0KS2lyYW4gR29waW5hdGhhbiByZXBsaWVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIYWhhLCB3aGF0IGEgY29pbmNpZGVuY2UsIGp1c3QgZGlkIHRoZSBzYW1lIHZlcnkg cmVjZW50bHkgd2hpbGUNCiAgdHJhbnNsYXRpbmcgYSBydXN0IGxpYnJhcnkgdG8gT0NhbWw6DQog IDxodHRwczovL2dpdGh1Yi5jb20vR29waWFuZGNvZGUvZWdvL2Jsb2IvNWRhZjMxMmY4YTQ0NGY5 YWJjZGU1OTk2YzY3MWI5MjgyNzI3YTk3Mi9saWIvZ2VuZXJpYy5tbCNMMjExPg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIGxldCBlY2xhc3NlcyA9IGVnLkBbZWNsYXNzZXNdIGluDQogIOKUgiBs ZXQgY29zdF9tYXAgPSBJZC5NYXAuY3JlYXRlIDEwIGluDQogIOKUgiBsZXQgbm9kZV90b3RhbF9j b3N0IG5vZGUgPQ0KICDilIIgICBsZXQgaGFzX2Nvc3QgaWQgPSBJZC5NYXAubWVtIGNvc3RfbWFw IChlZy5AW2ZpbmRdIGlkKSBpbg0KICDilIIgICBpZiBMaXN0LmZvcl9hbGwgaGFzX2Nvc3QgKEwu Y2hpbGRyZW4gbm9kZSkNCiAg4pSCICAgdGhlbiBsZXQgY29zdF9mIGlkID0gZnN0IEBAIElkLk1h cC5maW5kIGNvc3RfbWFwIChlZy5AW2ZpbmRdIGlkKSBpbiBTb21lIChFLmNvc3QgY29zdF9mDQog IOKUgiBub2RlKQ0KICDilIIgICBlbHNlIE5vbmUgaW4NCiAg4pSCICAgKCogLi4uICopDQogIOKU lOKUgOKUgOKUgOKUgA0KICB3aXRoIGAuQFtdJyBkZWZpbmVkIGFzOg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIGxldCAoLkBbXSkgc2VsZiBmbiA9IGZuIHNlbGYgW0BAaW5saW5lIGFsd2F5c10N CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgZm9yIGJvbnVzKD8pIHBvaW50cywgeW91IGNhbiBuYW1l IHRoZSBmaXJzdCBwYXJhbWV0ZXIgc2VsZjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQg YWRkX2Vub2RlIHNlbGYgKG5vZGU6IElkLnQgTC5zaGFwZSkgPQ0KICDilIIgICBsZXQgbm9kZSA9 IHNlbGYuQFtjYW5vbmljYWxpc2VdIG5vZGUgaW4NCiAg4pSCICAgKCogLi4uICopDQogIOKUlOKU gOKUgOKUgOKUgA0KICBJIGRvbid0IG5vcm1hbGx5IHdyaXRlIGNvZGUgbGlrZSB0aGlzIGluIE9D YW1sLCBidXQgaW4gdGhpcyBjYXNlLCBpdA0KICBtYWRlIHBvcnRpbmcgZnJvbSBydXN0IGVhc2ll ciwgYmVjYXVzZSB0aGUgY29kZSBtb3N0bHkgbG9va2VkIHRoZQ0KICBzYW1lLg0KDQoNCmh5cGhl bnJmIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgWW91IGNhbiB1c2UgdGhlIG11bHRpcGxlLWlu ZGV4aW5nIHN5bnRheCB0byBpbXBsZW1lbnQgc2xpY2luZyAod2VsbCwNCiAgdGVjaG5pY2FsbHkg c3Vicykgc3VnYXI6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0ICguOls7Li5dKSBzID0g ZnVuY3Rpb24NCiAg4pSCICAgfCBbfHN0YXJ0OyBmaW5pc2h8XSAtPiBTdHJpbmcuc3ViIHMgc3Rh cnQgKGZpbmlzaCAtIHN0YXJ0KQ0KICDilIIgICB8IF8gLT4gcmFpc2UgKEludmFsaWRfYXJndW1l bnQgInNsaWNlIHRha2VzIGV4YWN0bHkgdHdvIGluZGV4ZXMiKQ0KICDilJTilIDilIDilIDilIAN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjICJoZWxsbyB3b3JsZCIuOlsxOzVdOzsNCiAg4pSC IC0gOiBzdHJpbmcgPSAiZWxsbyINCiAg4pSU4pSA4pSA4pSA4pSADQogIFRoZSBuZXcgaW5kZXhp bmcgc3ludGF4IGlzIHF1aXRlIHZlcnNhdGlsZSA6Pg0KDQoNCktpcmFuIEdvcGluYXRoYW4gYWRk ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIE9oIHdvdywgdGhpcyBpcyBwZXJmZWN0ISBicmIsIG9mZiB0byBy ZWltcGxlbWVudCB0aGUgcHl0aG9uIHNsaWNpbmcNCiAgc2VtYW50aWNzIGluIE9DYW1sOg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIGxldCAoLkBbOy4uXSkgbHMgPSBmdW5jdGlvbltAd2Fybmlu ZyAiLTgiXQ0KICDilIIgICB8IFt8IHN0YXJ0OyAtMSB8XSAtPg0KICDilIIgICAgIExpc3QudG9f aXRlciBscw0KICDilIIgICAgIHw+IEl0ZXIuemlwX2kNCiAg4pSCICAgICB8PiBJdGVyLmRyb3Bf d2hpbGUgKFBhaXIuZnN0X21hcCAoKD4pIHN0YXJ0KSkNCiAg4pSCICAgICB8PiBJdGVyLm1hcCBz bmQNCiAg4pSCICAgfCBbfCBzdGFydDsgZmluaXNoIHxdIC0+DQogIOKUgiAgICAgTGlzdC50b19p dGVyIGxzDQogIOKUgiAgICAgfD4gSXRlci56aXBfaQ0KICDilIIgICAgIHw+IEl0ZXIuZHJvcF93 aGlsZSAoUGFpci5mc3RfbWFwICgoPikgc3RhcnQpKQ0KICDilIIgICAgIHw+IEl0ZXIudGFrZV93 aGlsZSAoUGFpci5mc3RfbWFwICgoPikgZmluaXNoKSkNCiAg4pSCICAgICB8PiBJdGVyLm1hcCBz bmQNCiAg4pSCICAgfCBbfCBzdGFydDsgZmluaXNoOyBzdGVwIHxdIC0+DQogIOKUgiAgICAgTGlz dC50b19pdGVyIGxzDQogIOKUgiAgICAgfD4gSXRlci56aXBfaQ0KICDilIIgICAgIHw+IEl0ZXIu ZHJvcF93aGlsZSAoUGFpci5mc3RfbWFwICgoPikgc3RhcnQpKQ0KICDilIIgICAgIHw+IEl0ZXIu dGFrZV93aGlsZSAoUGFpci5mc3RfbWFwICgoPikgZmluaXNoKSkNCiAg4pSCICAgICB8PiBJdGVy LmZpbHRlciAoUGFpci5mc3RfbWFwIChmdW4gaW5kIC0+IChpbmQgLSBzdGFydCkgbW9kIHN0ZXAg PSAwKSkNCiAg4pSCICAgICB8PiBJdGVyLm1hcCBzbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0K djMuT0NhbWwub3JnOiBBIHJvYWRtYXAgZm9yIE9DYW1sJ3Mgb25saW5lIHByZXNlbmNlDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3YzLW9jYW1sLW9yZy1hLXJvYWRtYXAtZm9yLW9jYW1s cy1vbmxpbmUtcHJlc2VuY2UvODM2OC8xOT4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBB bmlsIE1hZGhhdmFwZWRkeSByZXBsaWVkIHRvIG1hbnkgY29tbWVudHMNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIE1hbnkgdGhhbmtzIGZvciBhbGwgdGhlIGNvbnN0cnVjdGl2ZSBj b21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgc28gZmFyLA0KICBhbmQgYWxzbyBmb3IgdGhvc2Ugd2hv IGhhdmUgZ290dGVuIGluIHRvdWNoIHRvIGNvbnRyaWJ1dGUuIFBsZWFzZSBkbw0KICBrZWVwIHRo ZW0gY29taW5nIChlaXRoZXIgb24gdGhpcyB0aHJlYWQgb3Igb24gdGhlIHZhcmlvdXMgaXNzdWUN CiAgdHJhY2tlcnMgdGhhdCBAam9ubHVkbGFtIGFuZCBAcGF0cmljb2ZlcnJpcyBoYXZlIHBvaW50 ZWQgdG8pLiAgSSdsbA0KICBhbnN3ZXIgc29tZSBlYXJsaWVyIHF1ZXN0aW9ucyBoZXJlOg0KDQog ICAgICAgIEhhdmluZyBzYWlkIHRoYXQsIHRoZSBjb2xvcnMgb24gdGhlIFtwYWNrYWdlcyBsYW5k aW5nIHBhZ2UNCiAgICAgICAgXSBmZWVsIHZlcnkgYWdncmVzc2l2ZSB0byBtZS4gTWlnaHQgYmUg bXkgc2V0dXAgaGVyZSwgYnV0DQogICAgICAgIEkgd291bGQgbGlrZSB0byBoYXZlIGEgc2xpZ2h0 bHkgbGVzcyBoYXJzaCBjb250cmFzdC4NCg0KICAgICAgICBBbHNvLCB0aGVyZSBpcyBhIGJpdCBv ZiBhbiBvdmVybGFwIGluIGNvbnRlbnQgd2l0aA0KICAgICAgICBbaHR0cHM6Ly9vY2FtbHZlcnNl LmdpdGh1Yi5pby8gXSBmb3Igc29tZSB0aGluZ3MgKGVnIGJlc3QNCiAgICAgICAgcHJhY3RpY2Vz LCBjb21tdW5pdHkpIGJ1dCB0aGUgKHRvIG1lKSBtb3N0IHZhbHVhYmxlDQogICAgICAgIGZlYXR1 cmUgaXMgbWlzc2luZzogVGhlIGVjb3N5c3RlbXMgb3ZlcnZpZXcsIHdoZXJlIEkgY2FuDQogICAg ICAgIGZpbmQgcGFja2FnZXMgc29ydGVkIHRoZW1hdGljYWxseS4gQ291bGQgc3VjaCBhIHNlY3Rp b24NCiAgICAgICAgYWxzbyBoYXZlIGEgcGxhY2UgaW4gdGhlIHBhY2thZ2VzIHN1YnBhZ2Ugc29t ZXdoZXJlPw0KICAgICAgICBBbHRlcm5hdGl2ZWx5LCBtYXliZSBvcGFtIGNhbiBhbGxvdyB0byDi gJx0YWfigJ0gcGFja2FnZXMgaW4NCiAgICAgICAgdGhlIGZ1dHVyZSBzbyBvbmUgY291bGQgc2Vl IGFsbCBwYWNrYWdlcyBmb3IgZ3JhcGhpY3MsDQogICAgICAgIGRhdGFiYXNlcyBldGMuDQoNCiAg VGhlIHN0eWxpbmcgb2YgdGhlIC9wYWNrYWdlcyBzdWItVVJMIGRvZXMgaW5kZWVkIGRpZmZlciBm cm9tIHRoZSBtYWluDQogIGRlc2lnbiwgYnV0IHRoaXMgaXMgc2ltcGx5IGR1ZSB0byBhIHRlbXBv cmFyeSB0ZWNobmljYWwgZGV0YWlsLiBUaGUNCiAgbWFqb3JpdHkgb2YgdGhlIHNpdGUgdXNlcyBS ZWFjdC9OZXh0SlMgdG8gZ2VuZXJhdGUgdGhlIGZyb250ZW5kLCBhbmQNCiAgdGhpcyB1c2VzIHRo ZSBub3ctdHJlbmR5IG1lZGl1bS1jb250cmFzdCBjb2xvdXJzIGFuZCBhbHNvIGZlYXR1cmVzDQog IGxpa2UgZmFzdC1wYWdlLXN3aXRjaGluZyB0aGF0IE5leHRKUyBvZmZlcnMuICBIb3dldmVyLCB0 aGUNCiAgZG9jdW1lbnRhdGlvbiBwb3J0aW9uIGdlbmVyYXRlZCBhcm91bmQgMi43IG1pbGxpb24g aW5kaXZpZHVhbCBwYWdlcw0KICB3aGVuIHJ1biBhY3Jvc3MgdGhlIGZ1bGwgb3BhbSByZXBvc2l0 b3J5LCBhbmQgc28gd2UgcmVzdG9yZWQgdG8NCiAgZHluYW1pYyBnZW5lcmF0aW9uIG9mIHRoZSBj b250ZW50IGZvciB0aGF0LiBXaGF0J3MgZ29pbmcgdG8gaGFwcGVuDQogIG5leHQgaXMgYSByYXRp b25hbGlzYXRpb24gb2YgdGhlIGNvZGUgYWNyb3NzIHRoZSBSZVNjcmlwdCBhbmQgT0NhbWwNCiAg ZnJvbnRlbmRzIHNvIHRoYXQgdGhlcmUgd2lsbCBiZSBubyBvYnNlcnZhYmxlIGRpZmZlcmVuY2Ug aW4gdGhlIGNvbG91cg0KICBzY2hlbWVzIGFjcm9zcyB0aGUgZnVsbCBzaXRlLg0KDQogIFJlZ2Fy ZGluZyBjcmVhdGluZyBhIGNhdGVnb3Jpc2VkIGxpc3Qgb2YgcmVjb21tZW5kYXRpb25zLCB0aGF0 IGlzDQogIGFic29sdXRlbHkgaW4gc2NvcGUgZm9yIHRoZSB2MyBpdGVyYXRpb24gb2YgdGhlIHNp dGUuIEhvd2V2ZXIsIHRoaXMNCiAgbWV0YWRhdGEgc2hvdWxkIGlkZWFsbHkgbGl2ZSBpbiB0aGUg b3BhbS1yZXBvc2l0b3J5IChmb3IgZXhhbXBsZSwNCiAgdXNpbmcgYHRhZ3MnIGFzIHlvdSBzdWdn ZXN0LCB3aGljaCBvcGFtIGFscmVhZHkgc3VwcG9ydHMpLiBJZiBhbnlvbmUNCiAgd291bGQgbGlr ZSB0byBoYXZlIGEgZ28gYXQgdGhpcywgSSdkIGVuY291cmFnZSBQUnMgdG8gdGhlDQogIG9wYW0t cmVwb3NpdG9yeSB0byBhZGQgdGhlIHJlbGV2YW50IHRhZyBtZXRhZGF0YSBmb3IgYQ0KICBjb2Rl eC4gTWVhbndoaWxlLCBAbGFtYmRhX2ZvbyBAdG1hdHRpbyBhbmQgQHBhdHJpY29mZXJyaXMgYXJl IHdvcmtpbmcNCiAgb24gdGhlIGNvcmUgT0NhbWwgUGxhdGZvcm0gd29ya2Zsb3cgaW5mb3JtYXRp b24gZm9yIHRoZSBndWlkZXMgc2VjdGlvbg0KICBvZiB0aGUgd2Vic2l0ZSB3aGljaCB3aWxsIGNv dmVyIG9wYW0sIG1lcmxpbiwgbHNwLXNlcnZlciwgZHVuZSBhbmQgc28NCiAgb24uDQoNCiAgICAg ICAgRG8gd2UgaGF2ZSBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBwcmV2aW91cyB5ZWFyc+KAmSB3b3Jr c2hvcHMNCiAgICAgICAgdG8gYWRkIHRvIFt3YXRjaC5vY2FtbC5vcmddPyAgSSBjYW4gc2VlIHBp ZWNlcyBvZiAyMDE1LA0KICAgICAgICAyMDE3LCAyMDIwIGFuZCB0aGlzIHllYXIuIEBhdnNtDQoN CiAgICAgICAgSXMgaXQgcG9zc2libGUgdG8gYWRkIHRoZSBNTCBXb3Jrc2hvcCBhcyB3ZWxsPw0K DQogIEFic29sdXRlbHkuIFRoZSB3YXRjaC5vY2FtbC5vcmcgaGFzIGhlbGQgdXAgbmljZWx5IGFm dGVyIHRoZSBPQ2FtbA0KICBXb3Jrc2hvcCwgc28gSSB0aGluayBpdCdzIGluIGdvb2Qgc2hhcGUg dG8gcG9wdWxhdGUgd2l0aCBtb3JlDQogIHZpZGVvcy4gVGhpcyBuZWVkcyBhIHZvbHVudGVlciB0 byBoZWxwIHVzIHVwbG9hZCB0aGUgcGFzdCBbbmluZSB5ZWFyc10NCiAgb2YgdmlkZW9zIGZyb20g WW91VHViZSB0byB3YXRjaC5vY2FtbC5vcmcuIElmIGFueW9uZSB3YW50cyB0byBoYXZlIGENCiAg Z28sIHBsZWFzZSBtZXNzYWdlIG1lIGFuZCBJJ2xsIGNyZWF0ZSB5b3UgYW4gYWNjb3VudC4NCg0K ICAgICAgICBJdOKAmXMgYSBiaXQgdW5jbGVhciB3aGF0IHlvdSBtZWFudCBpbiB0aGlzIHBhcmFn cmFwaC4gRG9lcw0KICAgICAgICB0aGF0IG1lYW4gdGhhdCB5b3UgcGxhbiB0byBraWxsIHRoZSBv Y2FtbCBwbGFuZXQgPyBJIHdvdWxkDQogICAgICAgIGZpbmQgaXQgYSBsaXR0bGUgYml0IHNhZC4N Cg0KICAgICAgICBPbmUgb2YgdGhlIHJlYXNvbiB3aHkgeW91IG1heSBmZWVsIGl0IGRvZXNu4oCZ dCB3b3JrIHdlbGwNCiAgICAgICAgbWF5IGJlIHRoYXQgaXQgaGFzIGJlZW4gY29uc3RhbnRseSBi cm9rZW4gaW4gdGhlIGN1cnJlbnQNCiAgICAgICAgdmVyc2lvbiBvZiB0aGUgc2l0ZeKApg0KDQog IEknbSBub3Qgc3VyZSB3aHkgeW91IHRoaW5rIHRoZSBjdXJyZW50IG9jYW1sLm9yZyBuZXcgZmVl ZCBoYXMgYmVlbg0KICBicm9rZW4g4oCTIGl0J3MgYmVlbiB3b3JraW5nIGZhaXJseSByZWxpYWJs eSBmb3IgdGhlIHBhc3QgZGVjYWRlLiBUaGUNCiAgb25seSByZWFsIHByb2JsZW0gY2FtZSB1cCBh IGZldyB0aW1lcyB3aGVuIGEgZmVlZCdzIGRvbWFpbiBleHBpcmVkIGFuZA0KICBnb3QgdGFrZW4g b3ZlciBieSBkb21haW4gc3F1YXR0ZXJzLCBhdCB3aGljaCBwb2ludCB3ZSBnb3Qgc3BhbSBpbnRv DQogIHRoZSBtYWluIHBhZ2Ugb2Ygb2NhbWwub3JnLg0KDQogIFdoYXQgSSBtZWFudCB3aXRoIHRo YXQgcGFydCBvZiB0aGUgYW5ub3VuY2VtZW50IGlzIHRoYXQgdGhlDQogIHN5bmRpY2F0aW9uIGZl ZWQgc2hvdWxkIG5vdCBiZSBtaXN0YWtlbiB3aXRoIG9yaWdpbmFsIG5ld3Mgb24gdGhlDQogIHdl YnNpdGUuIFJpZ2h0IG5vdyBpdCdzIGRpZmZpY3VsdCB0byBkaXN0aW5ndWlzaCBvZmZpY2lhbA0K ICBhbm5vdW5jZW1lbnRzIChzdWNoIGFzIGNvbXBpbGVyIG9yIG9wYW0gcmVsZWFzZXMpIGFzIHRo ZXkgYXJlIGEgbGl0dGxlDQogIHNjYXR0ZXJlZCAoZS5nLiBvbiBvcGFtLm9jYW1sLm9yZykuIFRo ZSBwbGFuIGlzIHRvIGNvbWJpbmUgdGhlDQogIFtwbGF0Zm9ybS1ibG9nXSB3aXRoIHRoZSBuZXcg d2Vic2l0ZSBkaXJlY3RseS4gSSd2ZSBhbHNvIGJlZW4NCiAgY29uc2lkZXJpbmcganVzdCBoYXZp bmcgYSBzcGVjaWFsIHRhZyBvbiB0aGlzIGZvcnVtIHNvIHRoYXQgbmljZQ0KICBhbm5vdW5jZW1l bnQgcG9zdHMgY291bGQgYWxzbyBiZSBzeW5kaWNhdGVkIHRvIHRoZSB3ZWJzaXRlIGVhc2lseSAo Zm9yDQogIGV4YW1wbGUsIEBnYXNjaGUncyBjb21waWxlciBuZXdzbGV0dGVycykuDQoNCiAgTXkg Z2VuZXJhbCBkZXNpcmUgaXMgdG8gX2dyb3dfIHRoZSBwbGFuZXQgZmVlZCBhbmQgc3luZGljYXRp b24gc3lzdGVtLA0KICBidXQgdG8gY2xlYXJseSBkZW1hcmNhdGUgdGhlbSBhcyBub3QgYmVpbmcg cHVibGlzaGVkIGJ5IG9jYW1sLm9yZyBhbmQNCiAgdG8gbWFuYWdlIHRoZW0gdmlhIG1vcmUgbW9k ZXJuIGRlY2VudHJhbGlzZWQgdGVjaG5pcXVlcyB0aGF0IGZlYXR1cmUNCiAgc3BhbSwgbW9kZXJh dGlvbiBhbmQgYXJjaGl2YWwuIFBlZXJUdWJlIGlzIGEgZ29vZCBleGFtcGxlIG9mIHRoaXMgZm9y DQogIHZpZGVvcyB0aGF0IGlzIHdvcmtpbmcgd2VsbCwgYW5kIEknZCB3ZWxjb21lIHN1Z2dlc3Rp b25zIGZvciBBdG9tL1JTUw0KICAodGhlcmUgbXVzdCBiZSBzb21ldGhpbmcgaW4gdGhpcyBzcGFj ZSwgaWRlYWxseSBBY3Rpdml0eVB1Yi1iYXNlZCkuDQoNCiAgRGVwZW5kaW5nIG9uIGhvdyB0aGUg ZXhwZXJpbWVudHMgZ28sIGl0J3MgdmVyeSBsaWtlbHkgdGhhdCB3ZSdsbCBoYXZlDQogIGEgTWF0 cml4IGhvbWVzZXJ2ZXIgZm9yIG9jYW1sLm9yZyB3aGVyZSBDSSBib3RzIGNhbiByZXBvcnQgc3Rh dHVzDQogIGluZm9ybWF0aW9uIChzZWUgdGhpcyBbcHJvdG90eXBlIFBSXSkgZm9yIG9jYW1sLWNp IHRoYXQgd2lsbCBhbHNvDQogIGFwcGx5IHRvIG9wYW0tcmVwb3NpdG9yeS4gVGhlIGdvYWwgaGVy ZSBpcyB0byBmb3Igb2NhbWwub3JnIHRvIHB1Ymxpc2gNCiAgaXRzIGRhdGEgdXNpbmcgYW4gb3Bl biBwcm90b2NvbCwgd2hpY2ggY2FuIHRoZW4gYmUgc3luZGljYXRlZCBpbnRvDQogIHdoYXRldmVy IHRlY2hub2xvZ2llcyBhcmUgaW4gdm9ndWUgKGUuZy4gRGlzY29yZCwgU2xhY2ssIFRlYW1zLCDi gKYpLg0KDQogIFNvIGlmIHlvdSBzcG90IHNvbWUgZGVjZW50cmFsaXNlZCBzeW5kaWNhdGlvbiBz eXN0ZW0gdGhhdCB5b3UgdGhpbmsNCiAgbWlnaHQgYmUgaW50ZXJlc3RpbmcgZm9yIE9DYW1sLCBw bGVhc2UgZG8gbGV0IG1lIGtub3cuICBFdmVuIGJldHRlciwNCiAgaWYgeW91J2QgbGlrZSB0byBk ZXZlbG9wIG9uZSB0byB0YWlsb3IgaXQgdG8gb3VyIG5lZWRzLCBsZXQgbWUga25vdw0KICBldmVu IHNvb25lciA7LSkNCg0KDQpbcGFja2FnZXMgbGFuZGluZyBwYWdlIF0gPGh0dHBzOi8vdjMub2Nh bWwub3JnL3BhY2thZ2VzPg0KDQpbaHR0cHM6Ly9vY2FtbHZlcnNlLmdpdGh1Yi5pby8gXSA8aHR0 cHM6Ly9vY2FtbHZlcnNlLmdpdGh1Yi5pby8+DQoNClt3YXRjaC5vY2FtbC5vcmddIDxodHRwOi8v d2F0Y2gub2NhbWwub3JnPg0KDQpbbmluZSB5ZWFyc10gPGh0dHBzOi8vb2NhbWwub3JnL21lZXRp bmdzL29jYW1sLzIwMTIvPg0KDQpbcGxhdGZvcm0tYmxvZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9wbGF0Zm9ybS1ibG9nPg0KDQpbcHJvdG90eXBlIFBSXSA8aHR0cHM6Ly9naXRodWIuY29t L29jdXJyZW50L29jYW1sLWNpL3B1bGwvMzYyPg0KDQoNCkJlY29tZSBhbiBPdXRyZWFjaHkgTWVu dG9yOiBzdXBwb3J0IHRoZSBncm93dGggYW5kIGRpdmVyc2l0eSBvZiB0aGUgT0NhbWwgY29tbXVu aXR5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2JlY29tZS1hbi1vdXRyZWFjaHktbWVudG9yLXN1cHBvcnQtdGhlLWdy b3d0aC1hbmQtZGl2ZXJzaXR5LW9mLXRoZS1vY2FtbC1jb21tdW5pdHkvODIxMy8zPg0KDQoNCkFu aWwgTWFkaGF2YXBlZGR5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg VGhlcmUncyBiZWVuIGEgdmVyeSBkaXNhcHBvaW50aW5nIHJlc3BvbnNlIHRvIHRoaXMgY2FsbCBm b3IgbWVudG9ycyB0bw0KICBpbmNyZWFzZSB0aGUgZGl2ZXJzaXR5IG9mIG91ciBjb21tdW5pdHku IFByZWNpc2VseSAqbm9vbmUqIGhhcyBiZWVuIGluDQogIHRvdWNoIGZvciB0aGUgd2ludGVyIGNh bGwsIGxlYXZpbmcgdGhlIGJ1cmRlbiBvZiBtZW50b3JzaGlwIG9uIHRoZQ0KICBzYW1lIHBlb3Bs ZSB0aGF0IGRpZCBhbGwgdGhlIHdvcmsgdGhpcyBzdW1tZXIuDQoNCiAgQmVmb3JlIG1ha2luZyBb bmV3IGNhbGxzIGZvciBwcm9ncmFtcyBsaWtlIEdTb0NdLCBsZXQncyBnZXQgT3V0cmVhY2h5DQog IG9udG8gbW9yZSBzdXN0YWluYWJsZSBncm91bmQgcGxlYXNlLiBXZSBhcmUgcHVyZWx5IGxpbWl0 ZWQgYnkNCiAgbWVudG9yc2hpcCB0aW1lIGF0IHByZXNlbnQuIFRoaXMgY2FuIGJlIGFzIHNpbXBs ZSBhcyBvcmdhbmlzaW5nIG5ldw0KICBmaXJzdCBpc3N1ZXMgZm9yIHByb2plY3RzIGluIHRoZSBl Y29zeXN0ZW0sIGFuZCBhbGwgdGhlIHdheSB0byBwYWlyDQogIHByb2dyYW1taW5nIHdpdGggYSBt ZW50ZWUuIFlvdSBjYW4gY2hvc2UgaG93IHRvIGJlIGludm9sdmVkLg0KDQoNCltuZXcgY2FsbHMg Zm9yIHByb2dyYW1zIGxpa2UgR1NvQ10NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdjMt b2NhbWwtb3JnLWEtcm9hZG1hcC1mb3Itb2NhbWxzLW9ubGluZS1wcmVzZW5jZS84MzY4LzE2P3U9 YXZzbT4NCg0KDQpHZW5lcmF0aW5nIHN0YXRpYyBhbmQgcG9ydGFibGUgZXhlY3V0YWJsZXMgd2l0 aCBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9nZW5lcmF0aW5nLXN0 YXRpYy1hbmQtcG9ydGFibGUtZXhlY3V0YWJsZXMtd2l0aC1vY2FtbC84NDA1LzE+DQoNCg0KT0Nh bWxQcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJdCBoYXMgYmVlbiBhIGZldyB0aW1lcyBub3cgdGhhdCB3ZSBo YXZlIGJlZW4gdGFza2VkIHRvIGdlbmVyYXRlDQogIHBvcnRhYmxlIGJpbmFyaWVzIGZvciBkaWZm ZXJlbnQgcHJvamVjdHMuIE92ZXIgdGltZSwgd2UgaGF2ZSBnYXRoZXJlZA0KICBxdWl0ZSBzb21l IGtub3ctaG93IGFuZCwgc2VlaW5nIHRoZSBxdWVzdGlvbiBmcmVxdWVudGx5IGFyaXNlIGluIHRo ZQ0KICBjb21tdW5pdHksIHdlIGRlY2lkZWQgdG8gc2hhcmUgdGhpcyBleHBlcmllbmNlLg0KDQog IFlvdSBjYW4gZmluZCB0aGUgYXJ0aWNsZSB3cml0dGVuIGJ5IExvdWlzIEdlc2JlcnQgb25bIHRo ZSBPQ2FtbFBybw0KICBibG9nXQ0KDQoNCiAgICAgICAgRGlzdHJpYnV0aW5nIE9DYW1sIHNvZnR3 YXJlIG9uIG9wYW0gaXMgZ3JlYXQgKGlmIEkgZGFyZQ0KICAgICAgICBzYXkgc28gbXlzZWxmKSwg YnV0IHNvbWV0aW1lcyB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXINCiAgICAgICAgdG9vbHMgdG8g YW4gYXVkaWVuY2Ugb3V0c2lkZSBvZiB0aGUgT0NhbWwgY29tbXVuaXR5LCBvcg0KICAgICAgICBq dXN0IHdpdGhvdXQgcmVjb21waWxhdGlvbnMgb3IgaW4gYSBzaW1wbGVyIHdheS4NCg0KICAgICAg ICBIb3dldmVyLCBqdXN0IGRpc3RyaWJ1dGluZyB0aGUgbG9jYWxseSBnZW5lcmF0ZWQgYmluYXJp ZXMNCiAgICAgICAgcmVxdWlyZXMgdGhhdCB0aGUgdXNlcnMgaGF2ZSBhbGwgdGhlIHJlcXVpcmVk IHNoYXJlZA0KICAgICAgICBsaWJyYXJpZXMgaW5zdGFsbGVkLCBhbmQgYSBjb21wYXRpYmxlIGxp YmMuIEl0J3Mgbm90DQogICAgICAgIHNvbWV0aGluZyB5b3UgY2FuIGFzc3VtZSBpbiBnZW5lcmFs LCBhbmQgZXZlbiBpZiB5b3UgZG9uJ3QNCiAgICAgICAgbmVlZCBhbnkgQyBzaGFyZWQgbGlicmFy eSBvciBhcmUgY29uZmlkZW50IGVub3VnaCBpdCB3aWxsDQogICAgICAgIGJlIGluc3RhbGxlZCBl dmVyeXdoZXJlLCB0aGUgbGliYyBpc3N1ZSB3aWxsIGFyaXNlIGZvcg0KICAgICAgICBhbnlvbmUg dXNpbmcgYSBkaXN0cmlidXRpb24gYmFzZWQgb24gYSBkaWZmZXJlbnQga2luZCwgb3INCiAgICAg ICAgYSBsaXR0bGUgb2xkZXIgdGhhbiB0aGUgb25lIHlvdSB1c2VkIHRvIGJ1aWxkLg0KDQogICAg ICAgIFRoZXJlIGlzIG5vIGJ1aWx0LWluIHN1cHBvcnQgZm9yIGdlbmVyYXRpbmcgc3RhdGljDQog ICAgICAgIGV4ZWN1dGFibGVzIGluIHRoZSBPQ2FtbCBjb21waWxlciwgYW5kIGl0IG1heSBzZWVt IGEgYml0DQogICAgICAgIHRyaWNreSwgYnV0IGl0J3Mgbm90IGluIGZhY3QgdG9vIGNvbXBsZXgg dG8gZG8gYnkgaGFuZCwNCiAgICAgICAgc29tZXRoaW5nIHlvdSBtYXkgYmUgcmVhZHkgdG8gZG8g Zm9yIGEgcmVsZWFzZSB0aGF0IHdpbGwNCiAgICAgICAgYmUgcHVibGlzaGVkLiBTbyBoZXJlIGFy ZSBhIGZldyB0cmlja3MsIHJlY2lwZXMgYW5kIGFkdmljZQ0KICAgICAgICB0aGF0IHNob3VsZCBl bmFibGUgeW91IHRvIGdlbmVyYXRlIHRydWx5IHBvcnRhYmxlDQogICAgICAgIGV4ZWN1dGFibGVz IHdpdGggbm8gZXh0ZXJuYWwgZGVwZW5kZW5jeSB3aGF0c29ldmVyLiBCb3RoDQogICAgICAgIExp bnV4IGFuZCBtYWNPUyB3aWxsIGJlIHRyZWF0ZWQsIGJ1dCB0aGUgZXhhbXBsZXMgd2lsbCBiZQ0K ICAgICAgICBiYXNlZCBvbiBMaW51eCB1bmxlc3Mgb3RoZXJ3aXNlIHNwZWNpZmllZC4NCg0KICBE b24ndCBoZXNpdGF0ZSB0byBzaGFyZSB5b3VyIHRob3VnaHRzIHdpdGggdXMsIGhhdmUgYSBnb29k IHJlYWRpbmchDQoNCg0KWyB0aGUgT0NhbWxQcm8gYmxvZ10NCjxodHRwczovL3d3dy5vY2FtbHBy by5jb20vMjAyMS8wOS8wMi9nZW5lcmF0aW5nLXN0YXRpYy1hbmQtcG9ydGFibGUtZXhlY3V0YWJs ZXMtd2l0aC1vY2FtbC8+DQoNCg0KT0NhbWwgcXVhbnQtZGV2ZWxvcGVyIGF0IEJsb29tYmVyZy4g TG9uZG9uIG9yIE5ldyBZb3JrDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L29jYW1sLXF1YW50LWRldmVsb3Blci1hdC1ibG9vbWJlcmctbG9uZG9uLW9yLW5ldy15b3JrLzg0 MDkvMT4NCg0KDQpQaGlsaXAgQ3JhaWcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBFeHRlbmQg YSBmaW5hbmNpYWwgY29udHJhY3RzIERTTCB0aGF0IGlzIGltcGxlbWVudGVkIGluIE9DYW1sLg0K DQogIEl0J3MgTG9uZG9uIG9yIE5ldyBZb3JrIGJhc2VkLiBJdCdzIG5vdCBhIHJlbW90ZSBwb3Np dGlvbi4NCg0KICBQbGVhc2Ugc2VlIGRldGFpbHMgYW5kL29yIGFwcGx5IGF0DQogICg8aHR0cHM6 Ly9jYXJlZXJzLmJsb29tYmVyZy5jb20vam9iL2RldGFpbC85MzgyNT4pDQoNCg0KSFRUUCBjbGll bnQgbGlicmFyeQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4taHR0cC1jbGllbnQtbGlicmFyeS84NDI4LzE+DQoNCg0KSGFubmVzIE1laG5lcnQgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICB3ZSBqdXN0IHJlbGVhc2VkIHRvIHRoZSBvcGFtLXJl cG9zaXRvcnkgdGhlIFtgaHR0cC1sd3QtY2xpZW50J10NCiAgcGFja2FnZSwgd2hpY2ggY29uc2lz dHMgb2YgYm90aCBhIGxpYnJhcnkgZG9pbmcgSFRUUCByZXF1ZXN0cyBhbmQgYQ0KICBiaW5hcnkg KGBodXJsJykgdGhhdCBkb2VzIEhUVFAgcmVxdWVzdHMuDQoNCiAgVGhlIGNvZGUgaXMgYmFzZWQg b24gW0hUVFAvQUZdIGFuZCBbSDJdLCBhbmQgdXNlcyBbdGxzXSBmb3IgSFRUUFMNCiAgY29ubmVj dGlvbnMuIEJvdGggSFRUUC8xKC4xKSBhbmQgSFRUUC8yIHByb3RvY29scyBhcmUgc3VwcG9ydGVk LiBUaGUNCiAgbW90aXZhdGlvbiBiZWhpbmQgdGhpcyBwYWNrYWdlIGlzIHRvIGhhdmUgYSBodHRw IGNsaWVudCB0aGF0IGhhcyBhDQogIHJlYXNvbmFibHkgc21hbGwgZGVwZW5kZW5jeSBjb25lLCBp cyBwdXJlbHkgaW1wbGVtZW50ZWQgaW4gT0NhbWwsIGFuZA0KICB1c2VzIHRoZSBhc3luY2hyb25v dXMgdGFzayBsaWJyYXJ5IGx3dC4NCg0KICBUaGlzIHBhY2thZ2UgdXNlcyBbaGFwcHktZXllYmFs bHNdIHRvIGNvbm5lY3QgdG8gYSByZW1vdGUgaG9zdCB2aWENCiAgSVB2NCBhbmQgSVB2NiwgYXMg cHJvcG9zZWQgYnkgSUVURiBbUkZDIDgzMDVdOiBvbiBhbnkgY29tcHV0ZXIgd2l0aA0KICBlaXRo ZXIgSVB2NCBvciBJUHY2IGNvbm5lY3Rpdml0eSwgYSByZW1vdGUgSVB2NiBvciBJUHY0IHNlcnZl ciB3aWxsIGJlDQogIGNvbm5lY3RlZC4gUHJlZmVyZW5jZSBpcyBnaXZlbiB0byBJUHY2Lg0KDQog IElmIGEgaHR0cHMgdXJsIGlzIHByb3ZpZGVkLCB0aGUgc2VydmVyIGNlcnRpZmljYXRlIGlzIHZl cmlmaWVkIHVzaW5nDQogIHRoZSBbY2EtY2VydHNdIHBhY2thZ2UuDQoNCiAgSWYgeW91IGV4cGVy aWVuY2UgYW55IGlzc3VlcyBvciBoYXZlIGZ1cnRoZXIgbmVlZHMgZm9yIHRoaXMgcGFja2FnZSwN CiAgcGxlYXNlIHJlcG9ydCBhbiBpc3N1ZSBvbiB0aGUgR2l0SHViIGlzc3VlIHRyYWNrZXIuDQoN CiAgVGhlIGluc3RhbGxhdGlvbiBpcyBqdXN0IGFuIGBvcGFtIGluc3RhbGwgaHR0cC1sd3QtY2xp ZW50JyBhd2F5IDopDQoNCg0KW2BodHRwLWx3dC1jbGllbnQnXSA8aHR0cHM6Ly9naXRodWIuY29t L3JvYnVyaW8vaHR0cC1sd3QtY2xpZW50Pg0KDQpbSFRUUC9BRl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9pbmhhYml0ZWR0eXBlL2h0dHBhZj4NCg0KW0gyXSA8aHR0cHM6Ly9naXRodWIuY29tL2FubW9u dGVpcm8vb2NhbWwtaDI+DQoNClt0bHNdIDxodHRwczovL2dpdGh1Yi5jb20vbWlybGVmdC9vY2Ft bC10bHM+DQoNCltoYXBweS1leWViYWxsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1cmlvL2hh cHB5LWV5ZWJhbGxzPg0KDQpbUkZDIDgzMDVdIDxodHRwczovL3Rvb2xzLmlldGYub3JnL2h0bWwv cmZjODMwNT4NCg0KW2NhLWNlcnRzXSA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9jYS1jZXJ0 cz4NCg0KDQpIYW5uZXMgTWVobmVydCBsYXRlciBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgbm93IFswLjAuMl0gaXMgcmVsZWFzZWQgdGhhdCB1bmlmaWVzIHRoZSByZXNwb25zZSB0 eXBlIGFuZCBBUEkNCiAgKHByZXZpb3VzbHkgaXQgd2FzIGEgdmFyaWFudCBhbmQgY2xpZW50cyBo YWQgdG8gd3JpdGUgY29kZSBmb3IgYm90aA0KICBIVFRQMSBhbmQgSFRUUDIpLiBOb3csIGEgc2lu Z2xlIHJlY29yZCBhbmQgU3RhdHVzL0hlYWRlcnMvVmVyc2lvbg0KICBtb2R1bGUgYWxpYXNlcyBh cmUgcHJvdmlkZWQgKHZlcnkgY2xvc2UgdG8gSFRUUC9BRikuIEVuam95Lg0KDQoNClswLjAuMl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8xOTQxMD4NCg0K DQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0Nh bWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbT0NhbWwgUGxhbmV0XS4NCg0KICDigKIgW0dvb2RieWUg Q29yZV9rZXJuZWxdDQogIOKAoiBbVGFyaWRlcyBFbmdpbmVlcnMgdG8gUHJlc2VudCBhdCBJQ0ZQ IDIwMjFdDQogIOKAoiBbQmVuY2htYXJraW5nIE9DYW1sIHByb2plY3RzIHdpdGggY3VycmVudC1i ZW5jaF0NCiAg4oCiIFtXaGF0IHRoZSBpbnRlcm5zIGhhdmUgd3JvdWdodCwgMjAyMSBlZGl0aW9u XQ0KDQoNCltPQ2FtbCBQbGFuZXRdIDxodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQv Pg0KDQpbR29vZGJ5ZSBDb3JlX2tlcm5lbF0gPGh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9n b29kYnllLUNvcmVfa2VybmVsLz4NCg0KW1RhcmlkZXMgRW5naW5lZXJzIHRvIFByZXNlbnQgYXQg SUNGUCAyMDIxXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIxLTA4LTI2LXRhcmlkZXMt ZW5naW5lZXJzLXRvLXByZXNlbnQtYXQtaWNmcC0yMDIxPg0KDQpbQmVuY2htYXJraW5nIE9DYW1s IHByb2plY3RzIHdpdGggY3VycmVudC1iZW5jaF0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyMS0wOC0yNi1iZW5jaG1hcmtpbmctb2NhbWwtcHJvamVjdHMtd2l0aC1jdXJyZW50LWJlbmNo Pg0KDQpbV2hhdCB0aGUgaW50ZXJucyBoYXZlIHdyb3VnaHQsIDIwMjEgZWRpdGlvbl0NCjxodHRw czovL2Jsb2cuamFuZXN0cmVldC5jb20vd2hhdC10aGUtaW50ZXJucy1oYXZlLXdyb3VnaHQtMjAy MS8+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBl biB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFp bA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhl IFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8g cmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxp bmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0g PGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltB bGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of August 31 to Septembe= r 07, 2021.

Just reinvented OOP

Yawar Amin said

let ( .![] ) obj f =3D f obj

type person =3D { id : int; name : string }

let id { id;=
 _ } =3D id

let bob =3D { id =3D 1; name =3D "Bob" }
let next_id =3D bob.![id].![succ]

=3D=3D> 2

Kiran Gopinathan replied

Haha, what a coincidence, just did the same very recently while translating= a rust library to OCaml: https://github.com/Gopiandcode/ego/bl= ob/5daf312f8a444f9abcde5996c671b9282727a972/lib/generic.ml#L211

let eclasses =3D eg.@[eclasses] in
let cost_map =3D Id=
.Map.create 10 in=

let node_total_cost node =3D
  let has_cost id =3D Id.Map.mem cost_map (eg.@[find] id) in
  if List.for_all has_cost (L.chi=
ldren node)
  then let cost_f id =3D fst @@ Id.Map.find cos=
t_map (eg.@[find] id) in Some (E.cost cost_f
node)
  else None in
  (* ... *)

with .@[] defined as:

let (.@[]) self fn =3D fn self=
 [@@inline always]

for bonus(?) points, you can name the first parameter self:

let add_enode self (node: Id.t L.shape) =3D
  let node =3D self.@=
[canonicalise] node in
  (* ... *)

I don't normally write code like this in OCaml, but in this case, it made p= orting from rust easier, because the code mostly looked the same.

hyphenrf also replied

You can use the multiple-indexing syntax to implement slicing (well, techni= cally subs) sugar:

let (.:[;..]) s =3D function
  | [|start; finish|] -> String.s=
ub s start (finish - start)
  | _ -> raise (Invalid_argument "sli=
ce takes exactly two indexes")
# "hello world".:[1;5];;
- : string =3D "ello"

The new indexing syntax is quite versatile :>

Kiran Gopinathan added

Oh wow, this is perfect! brb, off to reimplement the python slicing semanti= cs in OCaml:

let (.@[;..]) ls =3D functio=
n[@warning "-8"]
  | [| start; -1 |] ->
    List.to_iter ls
    |> Iter.zip_i
    |> Iter.drop_while (Pair.f=
st_map ((>) start))
    |> Iter.map snd
  | [| start; finish |] ->
    List.to_iter ls
    |> Iter.zip_i
    |> Iter.drop_while (Pair.f=
st_map ((>) start))
    |> Iter.take_while (Pair.f=
st_map ((>) finish))
    |> Iter.map snd
  | [| start; finish; step |] ->
    List.to_iter ls
    |> Iter.zip_i
    |> Iter.drop_while (Pair.f=
st_map ((>) start))
    |> Iter.take_while (Pair.f=
st_map ((>) finish))
    |> Iter.filter (Pair.fst_m=
ap (fun ind -> (ind - start) mod step =3D 0))
    |> Iter.map snd

v3.OCaml.org: A roadmap for OCaml's online presence

Continuing this thread, Anil Madhavapeddy replied to = many comments

Many thanks for all the constructive comments and suggestions so far, and a= lso for those who have gotten in touch to contribute. Please do keep them coming (either on t= his thread or on the various issue trackers that @jonludlam and @patricoferris have pointed = to). I'll answer some earlier questions here:

Having said that, the colors on the packages landing page feel very aggressive to me. Might be my setup here, but I would like to hav= e a slightly less harsh contrast.

Also, there is a bit of an overlap in content with https://ocamlverse.github.io/ for some things (eg best practices, community) but the (to me) most valuable feature is missing: The ecosystems overview, where I can = find packages sorted thematically. Could such a section also have a place in the packages= subpage somewhere? Alternatively, maybe opam can allow to =E2=80=9Ctag=E2=80=9D packages in th= e future so one could see all packages for graphics, databases etc.

The styling of the /packages sub-URL does indeed differ from the main desig= n, but this is simply due to a temporary technical detail. The majority of the site uses R= eact/NextJS to generate the frontend, and this uses the now-trendy medium-contrast colours= and also features like fast-page-switching that NextJS offers. However, the documentation po= rtion generated around 2.7 million individual pages when run across the full opam repositor= y, and so we restored to dynamic generation of the content for that. What's going to hap= pen next is a rationalisation of the code across the ReScript and OCaml frontends so that= there will be no observable difference in the colour schemes across the full site.

Regarding creating a categorised list of recommendations, that is absolutel= y in scope for the v3 iteration of the site. However, this metadata should ideally live in the= opam-repository (for example, using tags as you suggest, which opam already su= pports). If anyone would like to have a go at this, I'd encourage PRs to the opam-repository to add the r= elevant tag metadata for a codex. Meanwhile, @lambda_foo @tmattio and @patricoferris ar= e working on the core OCaml Platform workflow information for the guides section of the webs= ite which will cover opam, merlin, lsp-server, dune and so on.

Do we have access to all of the previous years=E2=80=99 workshops to add to= watch.ocaml.org? I can see pieces of 2015, 2017, 2020 and this year. @avsm

Is it possible to add the ML Workshop as well?

Absolutely. The watch.ocaml.org has held up nicely after the OCaml Workshop= , so I think it's in good shape to populate with more videos. This needs a volunteer to help = us upload the past nine years of videos= from YouTube to watch.ocaml.org. If anyone wants to have a go, please message me and I'll c= reate you an account.

It=E2=80=99s a bit unclear what you meant in this paragraph. Does that mean= that you plan to kill the ocaml planet ? I would find it a little bit sad.

One of the reason why you may feel it doesn=E2=80=99t work well may be that= it has been constantly broken in the current version of the site=E2=80=A6

I'm not sure why you think the current ocaml.org new feed has been broken &= #x2013; it's been working fairly reliably for the past decade. The only real problem came up = a few times when a feed's domain expired and got taken over by domain squatters, at which poin= t we got spam into the main page of ocaml.org.

What I meant with that part of the announcement is that the syndication fee= d should not be mistaken with original news on the website. Right now it's difficult to dis= tinguish official announcements (such as compiler or opam releases) as they are a little scat= tered (e.g. on opam.ocaml.org). The plan is to combine the platform-blog with t= he new website directly. I've also been considering just having a special tag on this forum so that nice = announcement posts could also be syndicated to the website easily (for example, @gasche's comp= iler newsletters).

My general desire is to grow the planet fe= ed and syndication system, but to clearly demarcate them as not being published by ocaml.org and to manage them via m= ore modern decentralised techniques that feature spam, moderation and archival. PeerTu= be is a good example of this for videos that is working well, and I'd welcome suggestion= s for Atom/RSS (there must be something in this space, ideally ActivityPub-based).

Depending on how the experiments go, it's very likely that we'll have a Mat= rix homeserver for ocaml.org where CI bots can report status information (see this prototype PR) for ocaml-ci that will also apply to opam-repository. The goal here is to for ocaml.org to publish its data usin= g an open protocol, which can then be syndicated into whatever technologies are in vo= gue (e.g. Discord, Slack, Teams, …).

So if you spot some decentralised syndication system that you think might b= e interesting for OCaml, please do let me know. Even better, if you'd like to develop one to= tailor it to our needs, let me know even sooner ;-)

Become an Outreachy Mentor: support the growth and diversity o= f the OCaml community

Anil Madhavapeddy announced

There's been a very disappointing response to this call for mentors to incr= ease the diversity of our community. Precisely noone has been in touch for the winter c= all, leaving the burden of mentorship on the same people that did all the work this summer.

Before making new calls for programs like GSoC, let's get Outreachy onto more sustainable ground please. We are purely limi= ted by mentorship time at present. This can be as simple as organising new first issues for p= rojects in the ecosystem, and all the way to pair programming with a mentee. You can chose= how to be involved.

Generating static and portable executables with OCaml

OCamlPro announced

It has been a few times now that we have been tasked to generate portable b= inaries for different projects. Over time, we have gathered quite some know-how and, se= eing the question frequently arise in the community, we decided to share this experience.

You can find the article written by Louis Gesbert on the OCamlPro blog

Distributing OCaml software on opam is great (if I dare say so myself), but= sometimes you need to provide your tools to an audience outside of the OCaml community, o= r just without recompilations or in a simpler way.

However, just distributing the locally generated binaries requires that the= users have all the required shared libraries installed, and a compatible libc. It's not so= mething you can assume in general, and even if you don't need any C shared library or are c= onfident enough it will be installed everywhere, the libc issue will arise for anyone using= a distribution based on a different kind, or a little older than the one you used to build.

There is no built-in support for generating static executables in the OCaml= compiler, and it may seem a bit tricky, but it's not in fact too complex to do by hand, s= omething you may be ready to do for a release that will be published. So here are a few tric= ks, recipes and advice that should enable you to generate truly portable executables with n= o external dependency whatsoever. Both Linux and macOS will be treated, but the exampl= es will be based on Linux unless otherwise specified.

Don't hesitate to share your thoughts with us, have a good reading!

OCaml quant-developer at Bloomberg. London or New York

Philip Craig announced

Extend a financial contracts DSL that is implemented in OCaml.

It's London or New York based. It's not a remote position.

Please see details and/or apply at (https://careers.bloomberg.com/job/detail/93825)

HTTP client library

Hannes Mehnert announced

we just released to the opam-repository the http-lwt-clien= t package, which consists of both a library doing HTTP requests and a binary (hurl) that do= es HTTP requests.

The code is based on HT= TP/AF and H2, and uses tls for HTTPS connecti= ons. Both HTTP/1(.1) and HTTP/2 protocols are supported. The motivation behind this package is to have a ht= tp client that has a reasonably small dependency cone, is purely implemented in OCaml, and use= s the asynchronous task library lwt.

This package uses hap= py-eyeballs to connect to a remote host via IPv4 and IPv6, as proposed by IETF RFC 8305: on any computer with either IPv4 or IPv6 connectivity, a remote IPv6 or IPv4 server will be connected. Preference is= given to IPv6.

If a https url is provided, the server certificate is verified using the ca-certs package.

If you experience any issues or have further needs for this package, please= report an issue on the GitHub issue tracker.

The installation is just an opam install http-lwt-client away = :)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id BC087E0015 for ; Tue, 21 Sep 2021 11:09:53 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=6r45=OL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3ANlzlmhfs3GqDYRB5wOEjnO0zlGM+zdjLVj580XL?= =?us-ascii?q?Ho4xHfqnrxZn+JkuXvawr0AWRG9SCoK8bw8Pt8InYEVQa5piAtH1QOLdtbDQiz?= =?us-ascii?q?fssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBBr/KRB?= =?us-ascii?q?1JuPoEYLOksi7ze+/94PPbwlSgDexfLx+IRW0oA7MqsQYnIxuJ7orxBDUuHVIY?= =?us-ascii?q?eNWxW1pJVKXgRnx49q78YBg/SpNpf8v7tZMXqrmcas2S7xYFykmPHsu5ML3rxn?= =?us-ascii?q?DTBCA6WUaX24LjxdHGQnF7BX9Xpfsriv3s/d21SeGMcHqS70/RDSu4aRtSB/2i?= =?us-ascii?q?ScHLD85/3rTisNukalarhWhpwZizI7PfYqZMPRzcr/Ycd4cWGFPXNteVzZZD42?= =?us-ascii?q?8cYUBEuQPM+VXoIbhvFYBtweyCBO2Ce/z1jNFhHn71rA63eQ7FgHG2RQtEs4Ks?= =?us-ascii?q?HvOqtX+KbocXvy1zKnNzDXDc+9W0ir65YfSdhAuu/eMUahrccXNyUkvEgLFjkm?= =?us-ascii?q?MqYH+JzOV0eANsmiH7+V+Se2vi2gnqwBoojiy2MggkI7Jhpgayl3d8yhy3Yk6K?= =?us-ascii?q?8GiRkFhfd6kDIVftzucN4ZuX84uXnxktTsnxrMIuZC1cigHxIgoyRPCdvCKd4a?= =?us-ascii?q?F7xH/WeuNPDt1hnBodbOjihu29UWt1O7xW8263ltOrSdIj9/BvW0D2RzU78iIU?= =?us-ascii?q?Pp9/kG51DaXyQ/T9uBEIVwqmqrDLJ4hx7swmYQJvUTFACD2hF36jKiKeUo+/+i?= =?us-ascii?q?o7/7rYrL8pp+TL4N0hQD+MrgumsyiGus0KBQBX2+e+eikyLLj/Vf2QLNFjvIoi?= =?us-ascii?q?anVqpXaKtkDqqGlHQBVyJws6xO+Dzi60NQXh2UILFFbdxKdlYTmJ1bOIPXgAfe?= =?us-ascii?q?+hVSsijZryOrcMr3vGJXBNmXDkLHgfblh7E5T1RQ8wcpY55JOBbENOPPzVVLxt?= =?us-ascii?q?dzcCh81KQu0w/zoCNh7y4gQWnqPD7eEPK/MtVKE/P8jL/WDaYMPtjvxN+Ip6vD?= =?us-ascii?q?hgHMhhFMQc7Sl0YEJZH24EflqOVuVbHryjtsbD2sHsRQyQer3g1OYSzFTfWy9X?= =?us-ascii?q?6ck6zE7Fo2mCYDDS5iogL2OwSu3BIVWZmdCClGMDXfnaZmLW/cKaCKTO89hjyI?= =?us-ascii?q?LWaKmS4872hGirA76y7x5IerI4iAUqIzv2dxv6+HOiR0/+iZ4AsqB322XQWx5k?= =?us-ascii?q?XsERzos06B+pUx9xE2D0a99g/FACNJd++5HXhsiOJPd1ex3BND/VxrYcNmPUFu?= =?us-ascii?q?mWtKmATUxT9It3dABf0Z9G9OjjhDawiqlHaUZl7uRBJw76q/TxXzxKNx7y3rcz?= =?us-ascii?q?6kuk1kmQs5ONW26mq5y7BPcB4nUk0Wfi6mla78c0DTI9GqMwmuCpkZYUBR/Uan?= =?us-ascii?q?dR3AQelPWrcjl5kPFV7KhFa4oMg5FycKbLqtKa8bpjUldSff4ONXeZnqxlH2qC?= =?us-ascii?q?RaJwLOMdovqdH8H0CXTEkhX2zwUqDyCKg50TnOlvGT2CCNoU1TifxWouaN1t3X?= =?us-ascii?q?xBgdgxB6MR0lgzKauvB8ZlPiYDfQJ0eRA8CworjExGFemw/rXDcCBrkxvZvZye?= =?us-ascii?q?9Q4tX5D3GSRjAd9O528M+g2j1oXdUJstEPr1glrIp1Hldk2oXgqygtrNK/e10l?= =?us-ascii?q?OIWDLlavsM6HafzGhtCukbLTbjwqGuD5z0r8I7OUkpl7jugCwC0dk9G9ogYA9O?= =?us-ascii?q?5q044WTShIVVYPtX0038RljurycZTMytdq8PZJEO66ptDTPwJQsWPtjzQyvLY4?= =?us-ascii?q?3DQ=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ARs3E6KN1eql8aMBcTgOjsMiBIKoaSvp037BL?= =?us-ascii?q?7TENdfUxSKelfq+V/MjyqXTP+UwssR0b9uxoEpPwIk80jKQFhLX5ZI3SPjUO21?= =?us-ascii?q?HFEGgd1+bfKmbbaknDH4dmvM9dmsBFYuEYZmIasS+V2meF+pkbsb+6GLfBv5a4?= =?us-ascii?q?815dCSVIL4VByytcBhyAGkN7fhRcGZAlCIGRj/A33wZJ4h8sH72G7uNvZZm5m+?= =?us-ascii?q?H2?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0A3AgASaxphhyIeaIFaFoNvgRoBZFc6M?= =?us-ascii?q?QKERY8kASSCJIMohXWSYoFjEAEDAQ0qAQ4FAQIEAQGEYQIXOgEEghUCHgYBBTM?= =?us-ascii?q?TAQIEFQEBBQEBAQIBAwMEARMBAQEBDQsOCDokhWgNgiITDBmDbQMBGAkKQAYfI?= =?us-ascii?q?wMJCwEGAwIEDQEXARQKAwETARIUBoJXAYMHBQpCiyCcCoExgQGDTQEDAxABDgm?= =?us-ascii?q?EO4FjDQIUgReFcFNIAYJtCINwKRCBVUSBFYIkUW6CSxcBAQEBAYEWJQEBCE4Jg?= =?us-ascii?q?liCZASDRw4fGwQBFhFiGRYBAQkZNjgkNAMgCB8LOgORFBMeJZZWlEItB4MrgTE?= =?us-ascii?q?GC4dmgRWMRYd7g2WBSIobly0hlXCCHoZXgQsJgjWHcYtmhTCBTSqBagwHMxowQ?= =?us-ascii?q?4JpCQlXDleNVRaDUIE+gxs7hUw/MgIBAQENJgIGAQoBAQMJgQgBAQUTCwGHbFs?= =?us-ascii?q?BAQ?= X-IPAS-Result: =?us-ascii?q?A0A3AgASaxphhyIeaIFaFoNvgRoBZFc6MQKERY8kASSCJIM?= =?us-ascii?q?ohXWSYoFjEAEDAQ0qAQ4FAQIEAQGEYQIXOgEEghUCHgYBBTMTAQIEFQEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQEBDQsOCDokhWgNgiITDBmDbQMBGAkKQAYfIwMJCwEGAwIEDQE?= =?us-ascii?q?XARQKAwETARIUBoJXAYMHBQpCiyCcCoExgQGDTQEDAxABDgmEO4FjDQIUgReFc?= =?us-ascii?q?FNIAYJtCINwKRCBVUSBFYIkUW6CSxcBAQEBAYEWJQEBCE4JgliCZASDRw4fGwQ?= =?us-ascii?q?BFhFiGRYBAQkZNjgkNAMgCB8LOgORFBMeJZZWlEItB4MrgTEGC4dmgRWMRYd7g?= =?us-ascii?q?2WBSIobly0hlXCCHoZXgQsJgjWHcYtmhTCBTSqBagwHMxowQ4JpCQlXDleNVRa?= =?us-ascii?q?DUIE+gxs7hUw/MgIBAQENJgIGAQoBAQMJgQgBAQUTCwGHbFsBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="393563054" X-MGA-submission: =?us-ascii?q?MDH/xz4JvmXC3JDm3AKnZFW96PQQb0SBZO16IE?= =?us-ascii?q?WJyYwc7d2Tjf8ujHVnu46/kJvwGUJXk85N9X7VfXxtIQrD8ldggRWx68?= =?us-ascii?q?XnKw5qlJ5RuWt1zQ64J6IGTOdnpC3gNko6qW1T4gOnGtKmO0jTj0xXCo?= =?us-ascii?q?XsVMR/n+hAwPwPkmZNewRaKg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Sep 2021 11:09:51 +0200 Received: from set (unknown [131.254.252.242]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id DA2C25605AA; Tue, 21 Sep 2021 11:09:49 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 21 Sep 2021 11:09:48 +0200 Message-ID: <87tuieuwf7.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 21 11:09:50 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000985, queueID=55F8C5605AB X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgU2VwdGVtYmVyIDE0IHRvDQoyMSwgMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpvcGFt LWdyZXA6IHNlYXJjaCB0aHJvdWdoIHRoZSBzb3VyY2VzIG9mIGFsbCB0aGUgcGFja2FnZXMgaW4g b3BhbS1yZXBvc2l0b3J5DQpIYXJkY2FtbCBNSVBTIENQVSBMZWFybmluZyBQcm9qZWN0IGFuZCBC bG9nDQpQdXp6bGluZyB0aHJvdWdoIHNvbWUgR0FEVCBlcnJvcnMNClBhcmFueSBmb3IgbXVsdGlj b3JlIE9DYW1sDQpPQ2FtbCA0LjEzLjAsIHNlY29uZCByZWxlYXNlIGNhbmRpZGF0ZQ0KVW5pY29k ZSAxNC4wLjAgdXBkYXRlIGZvciBVdWNkLCBVdWNwLCBVdW5mIGFuZCBVdXNlZw0KU2V0IHVwIE9D YW1sIDIuMC4wLWJldGE0DQpCZWNvbWUgYW4gT3V0cmVhY2h5IE1lbnRvcjogc3VwcG9ydCB0aGUg Z3Jvd3RoIGFuZCBkaXZlcnNpdHkgb2YgdGhlIE9DYW1sIGNvbW11bml0eQ0KVGhlIE9DYW1sIDQu MTMgcHJldmlldyBmb3IgTWVybGluIGlzIG5vdyBhdmFpbGFibGUNCk9sZCBDV04NCg0KDQpvcGFt LWdyZXA6IHNlYXJjaCB0aHJvdWdoIHRoZSBzb3VyY2VzIG9mIGFsbCB0aGUgcGFja2FnZXMgaW4g b3BhbS1yZXBvc2l0b3J5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1vcGFtLWdyZXAtc2VhcmNoLXRocm91Z2gtdGhlLXNvdXJjZXMtb2YtYWxsLXRo ZS1wYWNrYWdlcy1pbi1vcGFtLXJlcG9zaXRvcnkvODQzNC8zPg0KDQoNCkthdGUgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIGp1 c3QgcmVsZWFzZWQgb3BhbS1ncmVwLjAuMi4wIHdpdGggcXVpdGUgYSBiaXQgb2YgY2hhbmdlIGNv bXBhcmVkDQogIHRvIHRoZSBwcmV2aW91cyB2ZXJzaW9uLiBIZXJlIGlzIHRoZSBoaWdobGlnaHQ6 DQogIOKAoiBDb21wbGV0ZSByZXdyaXRlIGZyb20gc2hlbGwgc2NyaXB0IHRvIE9DYW1sLCBtYWtp bmcgaXQgbW9yZSBwb3J0YWJsZQ0KICDigKIgVXNlIHRoZSBmYXN0ZXIgYHJpcGdyZXAnIGFuZCBg dWdyZXAnIG92ZXIgYGdyZXAnIHdoZW4gYXZhaWxhYmxlDQogICAgKHN1Z2dlc3Rpb24gYnkgQEVu Z2lsKQ0KICDigKIgVXNlIHRoZSBgcHJvZ3Jlc3MnIGxpYnJhcnkgdG8gc2hvdyBwcm9ncmVzcyBp bnN0ZWFkIG9mIGENCiAgICBub24tcG9ydGFibGUvRElZIHNwaW5uZXINCg0KICBTZWUgdGhlIFtj aGFuZ2Vsb2ddIGZvciB0aGUgZnVsbCBsaXN0IG9mIHJlbGV2YW50IGNoYW5nZXMuDQoNCiAgKkJp ZyB0aGFua3MgdG8gQENyYWlnRmUgZm9yIHRoZSBgcHJvZ3Jlc3MnIGxpYnJhcnkgKHN1Y2ggYSB0 cmVhdCEpIGFuZA0KICB0byBAZGJ1ZW56bGkgZm9yIGBib3MnIGFuZCBgY21kbGluZXInIGluIHBh cnRpY3VsYXIsIG1ha2luZyBpdCBlYXN5IHRvDQogIGRvIHN1Y2ggcmV3cml0ZSogOnJlbGF4ZWQ6 DQoNCg0KW2NoYW5nZWxvZ10NCjxodHRwczovL2dpdGh1Yi5jb20va2l0LXR5LWthdGUvb3BhbS1n cmVwL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNCg0KSGFyZGNhbWwgTUlQUyBDUFUgTGVhcm5p bmcgUHJvamVjdCBhbmQgQmxvZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9oYXJkY2FtbC1taXBzLWNwdS1sZWFybmluZy1wcm9q ZWN0LWFuZC1ibG9nLzgwODgvMTA+DQoNCg0KQWxleGFuZGVyIChTYXNoYSkgU2t2b3J0c292IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhIFdlIGFyZSBleGNpdGVkIHRvIGFubm91bmNlIHRoYXQg d2UgaGF2ZSBjb21wbGV0ZWQgdGhpcw0KICBwcm9qZWN0IGFuZCBibG9nLiBQcm9ncmVzcyBoYXMg YmVlbiBzbG93IHRoZXNlIHBhc3QgZmV3IG1vbnRocyBkdWUgdG8NCiAgd29yaywgaW50ZXJuc2hp cHMsIGFuZCBjb2xsZWdlLCBidXQgd2XigJl2ZSBub3cgcmVsZWFzZWQgW3YxLjAuMCBvbg0KICBH aXRIdWJdLiBXZSBhbHNvIHB1Ymxpc2hlZCBwb3N0cyBvbjoNCg0KICDigKIgW0Rlc2lnbiBwYXR0 ZXJucywgY29udmVudGlvbnMsIGFuZCB0ZXN0aW5nXQ0KICDigKIgW0hvdyB0aGUgQWx3YXlzIERT TCBjYW4gYmUgdXNlZCB0byB3cml0ZSBzYWZlIOKAnHBzZXVkby1pbXBlcmF0aXZl4oCdDQogICAg Y29kZSBpbiBIYXJkY2FtbF0NCiAg4oCiIFtIYXJkY2FtbOKAmXMgdGVzdGluZyBhbmQgaW50ZXJh Y3RpdmUgc2ltdWxhdGlvbiB0b29sc10NCiAg4oCiIFtBIHJlY2FwIG9mIHNvbWUgaW50ZXJlc3Rp bmcgaGFyZHdhcmUvQ1BVIGZlYXR1cmVzIGluIG91ciBkZXNpZ25dDQoNCiAgRmluYWxseSwgd2Ug cHVibGlzaGVkIGEgW2NvbmNsdXNpb24gYmxvZyBwb3N0XSwgd2hpY2ggd3JhcHMgdXAgc29tZQ0K ICBzdHJlbmd0aHMvd2Vha25lc3NlcyBvZiBIYXJkY2FtbCwgYXMgd2VsbCBhcyBzb21lIHRha2Vh d2F5cyBvbiBPQ2FtbA0KICBhbmQgYmxvZ2dpbmcgbW9yZSBnZW5lcmFsbHkuDQoNCiAgVGhhbmsg eW91IHRvIEBhbmR5bWFuIGFuZCBAZnlxdWFoOTUgZm9yIGJ1aWxkaW5nIEhhcmRjYW1sLCBhbmQg Zm9yDQogIGhlbHBpbmcgdXMgb3V0IG9uIEdpdEh1YiBpc3N1ZXMhIFdlIHJlYWxseSBhcHByZWNp YXRlIHlvdXIgdGltZSBhbmQNCiAgc3VnZ2VzdGlvbnMuDQoNCiAgT3ZlcmFsbCwgd2XigJl2ZSBj b21lIHRvIHRoZSBjb25jbHVzaW9uIHRoYXQgSGFyZGNhbWwgaXMgYSBtdWNoIGJldHRlcg0KICB0 b29sIGZvciBoYXJkd2FyZSBkZXNpZ24gdGhhbiBWZXJpbG9nLiBUaGlzIGhhcyBiZWVuIGEgZ3Jl YXQNCiAgZXhwZXJpZW5jZSwgYW5kIHdlIHdhbGsgYXdheSB3aXRoIGEgYmV0dGVyIHVuZGVyc3Rh bmRpbmcgb2YgaGFyZHdhcmUsDQogIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcsIGFuZCB0ZWNobmlj YWwgd3JpdGluZy4NCg0KDQpbdjEuMC4wIG9uIEdpdEh1Yl0NCjxodHRwczovL2dpdGh1Yi5jb20v YXNrdm9ydHNvdjEvaGFyZGNhbWwtbWlwcy9yZWxlYXNlcy90YWcvdjEuMC4wPg0KDQpbRGVzaWdu IHBhdHRlcm5zLCBjb252ZW50aW9ucywgYW5kIHRlc3RpbmddDQo8aHR0cHM6Ly9jZXJhbWljaGFj a2VyLmNvbS9ibG9nLzE0LTh4LWRlc2lnbi1wYXR0ZXJucy1jb252ZW50aW9ucy1hbmQtdGVzdGlu Zz4NCg0KW0hvdyB0aGUgQWx3YXlzIERTTCBjYW4gYmUgdXNlZCB0byB3cml0ZSBzYWZlIOKAnHBz ZXVkby1pbXBlcmF0aXZl4oCdIGNvZGUNCmluIEhhcmRjYW1sXQ0KPGh0dHBzOi8vY2VyYW1pY2hh Y2tlci5jb20vYmxvZy8xNS05eC1hbHdheXMtZHNsLWFuZC10aGUtY29udHJvbC11bml0Pg0KDQpb SGFyZGNhbWzigJlzIHRlc3RpbmcgYW5kIGludGVyYWN0aXZlIHNpbXVsYXRpb24gdG9vbHNdDQo8 aHR0cHM6Ly9jZXJhbWljaGFja2VyLmNvbS9ibG9nLzE2LTEweC10ZXN0aW5nLWFuZC1kZWJ1Z2dp bmctaGFyZGNhbWw+DQoNCltBIHJlY2FwIG9mIHNvbWUgaW50ZXJlc3RpbmcgaGFyZHdhcmUvQ1BV IGZlYXR1cmVzIGluIG91ciBkZXNpZ25dDQo8aHR0cHM6Ly9jZXJhbWljaGFja2VyLmNvbS9ibG9n LzE4LTExeC1jcHUtZnVuY3Rpb25hbGl0eS13cmFwLXVwPg0KDQpbY29uY2x1c2lvbiBibG9nIHBv c3RdDQo8aHR0cHM6Ly9jZXJhbWljaGFja2VyLmNvbS9ibG9nLzIwLTEyMTItcHJvamVjdC1jb25j bHVzaW9uPg0KDQoNClB1enpsaW5nIHRocm91Z2ggc29tZSBHQURUIGVycm9ycw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wdXp6bGluZy10aHJvdWdoLXNvbWUtZ2FkdC1lcnJvcnMv ODQ3OC84Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIGdhc2NoZSBzYWlkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBOb3QgZXhhY3RseSB3aGF0IHlvdSBh cmUgYXNraW5nIGZvciwgYnV0IEBPY3RhY2hyb24gd3JvdGUgYW4gZXhjZWxsZW50DQogIFtjaGFw dGVyIG9uIEdBRFRzXSBpbiB0aGUgT0NhbWwgbWFudWFsLCB3aGljaCBjb3VsZCBiZSByZWNvbW1l bmRlZCB0bw0KICBwZW9wbGUgc3RhcnRpbmcgR0FEVCBwcm9ncmFtbWluZy4gSXQgZXhwbGFpbnMg d2h5IHJlY3Vyc2l2ZSBmdW5jdGlvbnMNCiAgb24gR0FEVCBuZWVkICJleHBsaWNpdCBwb2x5bW9y cGhpYyBhbm5vdGF0aW9ucyIgaW4gbGVzcw0KICAiaW1wbGVtZW50YXRpb24gZHJpdmVuIiB0ZXJt cy4NCg0KICAoVGhlIGNoYXB0ZXIgYWxzbyBkZW1vbnN0cmF0ZXMgdGhlIG5ldyBuYW1pbmcgc2No ZW1lIGZvciBleGlzdGVudGlhbA0KICB0eXBlIHZhcmlhYmxlcyBpbnRyb2R1Y2VkIGJ5IEdBRFQg Y29uc3RydWN0b3JzLCB3aGljaCBjYW4gaGVscCBhIGxvdA0KICB3b3JraW5nIHRocm91Z2ggdHlw ZSBlcnJvcnMsIGJ1dCBhcmUgc3RpbGwgYSBiaXQgaGVhdnkgYW5kIGRlc2VydmUgYQ0KICBnZW50 bGUgaW50cm9kdWN0aW9uLikNCg0KDQpbY2hhcHRlciBvbiBHQURUc10gPGh0dHBzOi8vb2NhbWwu b3JnL3JlbGVhc2VzLzQuMTIvbWFudWFsL2dhZHRzLmh0bWw+DQoNCg0Kb2N0YWNocm9uIHRoZW4g YWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgaGF2ZSBvbmx5IHdyaXR0ZW4gdGhlIG5vbWVuY2xhdHVyZSBwYXJ0 IGFuZCBhIGJpdCBvZiB0aGUgZXhwbGFuYXRpb24NCiAgZm9yIHJlY3Vyc2l2ZSBmdW5jdGlvbnMg aW4gdGhpcyBjaGFwdGVyLCBAZ2FycmlndWUgaXMgdGhlIGF1dGhvciBvZg0KICBtb3N0IG9mIHRo aXMgY2hhcHRlci4NCg0KDQpQYXJhbnkgZm9yIG11bHRpY29yZSBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9w YXJhbnktZm9yLW11bHRpY29yZS1vY2FtbC84NDk1LzE+DQoNCg0KVW5peEp1bmtpZSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFRoZXJlIGlzIG5vdyBhbiBpbXBsZW1lbnRhdGlvbiB1c2luZyBtdWx0aWNv cmUtT0NhbWwgaW4gdGhlICdkb21haW5zJw0KICBicmFuY2guDQoNCiAgPGh0dHBzOi8vZ2l0aHVi LmNvbS9Vbml4SnVua2llL3BhcmFueS90cmVlL2RvbWFpbnM+DQoNCiAgUGVvcGxlIGFyZSB2ZXJ5 IHdlbGNvbWUgdG8gZ2l2ZSBpdCBhIHRyeSBhbmQgc2hhcmUgdGhlIHNwZWVkdXAgdGhleQ0KICBv YnNlcnZlLCBlc3BlY2lhbGx5IGNvbXBhcmVkIHRvIGZvcmstYmFzZWQgcGFyYWxsZWxpc20uDQoN CiAgVGhhbmtzIHRvIEBuaWxzYmVja2VyIGZvciBoYXZpbmcgbW90aXZhdGVkIG1lLg0KDQoNClVu aXhKdW5raWUgbGF0ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIElmIHlvdSBkb24ndCB1c2UgdGhl IGRvbWFpbnMgYnJhbmNoLCB0aGVuIHBhcmFueSBpcyB1c2luZyBmb3JrLWJhc2VkDQogIHBhcmFs bGVsaXNtLiAgSWYgeW91IHdhbnQgdG8gdXNlIHRoZSBkb21haW5zIGJyYW5jaCwgeW91IG5lZWQg dG8NCiAgaW5zdGFsbCBtdWx0aWNvcmUtb2NhbWwgZmlyc3Q6DQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTIuMCtkb21haW5zDQogIOKUgiBldmFsIGBvcGFt IGNvbmZpZyBlbnZgDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCk9DYW1sIDQuMTMuMCwgc2Vjb25k IHJlbGVhc2UgY2FuZGlkYXRlDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L29jYW1sLTQtMTMtMC1zZWNvbmQtcmVsZWFzZS1jYW5kaWRhdGUvODQ5Ni8xPg0K DQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxlYXNlIG9mIE9DYW1sIDQuMTMu MCBpcyBleHBlY3RlZCBmb3IgbmV4dCB3ZWVrLg0KDQogIFNpbmNlIHdlIGhhZCBhIG5hdGl2ZSBj b2RlIGdlbmVyYXRpb24gYnVnIGZpeCBhbmQgdHdvIG1pbm9yDQogIGNvbmZpZ3VyYXRpb24gdHdl YWtzIHNpbmNlIHRoZSBmaXJzdCByZWxlYXNlIGNhbmRpZGF0ZSwgd2UgYXJlDQogIHB1Ymxpc2hp bmcgYSBzZWNvbmQgcmVsZWFzZSBjYW5kaWRhdGUuICBJZiB5b3UgZmluZCBhbnkgYnVncywgcGxl YXNlDQogIHJlcG9ydCB0aGVtIGhlcmU6DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9pc3N1ZXM+DQoNCiAgSGFwcHkgaGFja2luZywgRmxvcmlhbiBBbmdlbGV0dGkgZm9yIHRo ZSBPQ2FtbCB0ZWFtLg0KDQoNCkluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3Bh bSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjEzLjB+cmMy IC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIElmIHlvdSB3 YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBz d2l0Y2gNCiAgdG8gdGhlIG9wdGlvbiB2YXJpYW50IHdpdGg6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDxzd2l0Y2hfbmFt ZT4gLS1wYWNrYWdlcz1vY2FtbC12YXJpYW50cy40LjEzLjB+cmMyK29wdGlvbnMsPG9wdGlvbl9s aXN0Pg0KICDilIIgLS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIAN Cg0KICB3aGVyZSA8b3B0aW9uX2xpc3Q+IGlzIGEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2Ygb2Nh bWwtb3B0aW9uLSoNCiAgcGFja2FnZXMuIEZvciBpbnN0YW5jZSwgZm9yIGEgZmxhbWJkYSBhbmQg bm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0Y2g6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3Bh bSBzd2l0Y2ggY3JlYXRlIDQuMTMuMH5yYzIrZmxhbWJkYStuZmZhDQogIOKUgiAtLXBhY2thZ2Vz PW9jYW1sLXZhcmlhbnRzLjQuMTMuMH5yYzIrb3B0aW9ucyxvY2FtbC1vcHRpb24tZmxhbWJkYSxv Y2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KICDilIIgLS1yZXBvc2l0b3JpZXM9ZGVm YXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0 b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgQWxsIGF2YWlsYWJsZSBvcHRpb25zIGNhbiBi ZSBsaXN0ZWQgd2l0aCAib3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9uIi4NCg0KICBUaGUgc291cmNl IGNvZGUgZm9yIHRoZSByZWxlYXNlIGNhbmRpZGF0ZSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVz ZQ0KICBhZGRyZXNzZXM6DQoNCiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv YXJjaGl2ZS80LjEzLjAtcmMyLnRhci5nej4NCiAg4oCiIDxodHRwczovL2NhbWwuaW5yaWEuZnIv cHViL2Rpc3RyaWIvb2NhbWwtNC4xMy9vY2FtbC00LjEzLjB+cmMyLnRhci5nej4NCg0KDQpDaGFu Z2VzIHNpbmNlIHRoZSBmaXJzdCByZWxlYXNlIGNhbmRpZGF0ZQ0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCi IFsjMTA2MjZdLCBbIzEwNjI4XTogV3JvbmcgcmVsb2FkaW5nIG9mIHRoZSB4ODYtNjQgaW5zdHJ1 Y3Rpb24gZm9yDQogICAgaW50ZWdlciBtdWx0aXBsaWNhdGlvbiBieSBhIGNvbnN0YW50LCBjYXVz aW5nIHRoZSBhc3NlbWJsZXIgdG8NCiAgICByZWplY3QgdGhlIG9jYW1sb3B0LWdlbmVyYXRlZCBj b2RlLiAoWGF2aWVyIExlcm95LCByZXBvcnQgYnkgRGF2ZQ0KICAgIEFpdGtlbiwgcmV2aWV3IGJ5 IFZpbmNlbnQgTGF2aXJvbikNCg0KICDigKIgWyMxMDE3Nl0sIFsjMTA2MzIobmV3IGluIHJjMild OiBCeSBkZWZhdWx0LCBjYWxsIHRoZSBhc3NlbWJsZXINCiAgICB0aHJvdWdoIHRoZSBDIGNvbXBp bGVyIGRyaXZlciAoU8OpYmFzdGllbiBIaW5kZXJlciwgcmV2aWV3IGJ5IEdhYnJpZWwNCiAgICBT Y2hlcmVyLCBEYXZpZCBBbGxzb3BwIGFuZCBYYXZpZXIgTGVyb3kpDQoNCiAg4oCiIFsjMTA0NTFd LCBbIzEwNjM1KG5ldyBpbiByYzIpXTogUmVwbGFjZSB0aGUgdXNlIG9mIGljb252IHdpdGggYSBD DQogICAgdXRpbGl0eSB0byBjb252ZXJ0ICQoTElCRElSKSB0byBhIEMgc3RyaW5nIGNvbnN0YW50 IG9uIFdpbmRvd3Mgd2hlbg0KICAgIGJ1aWxkaW5nIHRoZSBydW50aW1lLiBIYXJkZW5zIHRoZSBn ZW5lcmF0aW9uIG9mIHRoZSBjb25zdGFudCBvbiBVbml4DQogICAgZm9yIHBhdGhzIHdpdGggYmFj a3NsYXNoZXMsIGRvdWJsZS1xdW90ZXMgYW5kIG5ld2xpbmVzLiAoRGF2aWQNCiAgICBBbGxzb3Bw LCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGkgYW5kIFPDqWJhc3RpZW4gSGluZGVyZXIpDQoN Cg0KWyMxMDYyNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA2MjY+ DQoNClsjMTA2MjhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwNjI4 Pg0KDQpbIzEwMTc2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDE3 Nj4NCg0KWyMxMDYzMihuZXcgaW4gcmMyKV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTA2MzI+DQoNClsjMTA0NTFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEwNDUxPg0KDQpbIzEwNjM1KG5ldyBpbiByYzIpXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDYzNT4NCg0KDQpVbmljb2RlIDE0LjAuMCB1cGRhdGUg Zm9yIFV1Y2QsIFV1Y3AsIFV1bmYgYW5kIFV1c2VnDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi11bmljb2RlLTE0LTAtMC11cGRhdGUtZm9yLXV1Y2QtdXVjcC11dW5mLWFuZC11 dXNlZy84NDk3LzE+DQoNCg0KRGFuaWVsIELDvG56bGkgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBVbmljb2RlIDE0LjAuMCB3YXMgcmVsZWFzZWQgb24gdGhlIDE0dGggb2Ygc2VwdGVtYmVy Lg0KDQogIEl0IGFkZHMgODM4IG5ldyBjaGFyYWN0ZXJzIHRvIHRoZSBzdGFuZGFyZCBpbmNsdWRp bmcsIGZvciBvdXIgZnJpZW5kcw0KICBmcm9tIENlbnRyYWwgQXNpYSwgc3VwcG9ydCBmb3IgW09s ZCBVeWdodXJdLiAgRm9yIGluZm9ybWF0aW9uIGFib3V0DQogIGFsbCB0aGUgb3RoZXIgYWRkaXRp b25zLCBzZWUgW3RoZSBhbm5vdW5jZW1lbnQgcGFnZV0uDQoNCiAgQWNjb3JkaW5nbHkgdGhlIGxp YnJhcmllcyBtZW50aW9uZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1lc3NhZ2UgaGFkIHRvDQogIGJl IHVwZGF0ZWQsIGNvbnN1bHQgdGhlIGluZGl2aWR1YWwgcmVsZWFzZSBub3RlcyBmb3IgZGV0YWls cy4gQm90aA0KICBVdWNkIGFuZCBVdWNwIGFyZSBpbmNvbXBhdGlibGUgcmVsZWFzZXMgc2luY2Vz IG5ldyBzY3JpcHQgYW5kIGJsb2NrDQogIGVudW1lcmFudHMgaGFkIHRvIGJlIGFkZGVkLg0KDQog IEJlc3QsDQoNCiAgRGFuaWVsDQoNCiAgUC5TLiBUaG91Z2ggSSdtIG5vdCB2ZXJ5IGZvbmQgb2Yg dGhlIGNvbmNlcHQsIEkgcmVjZW50bHkgZW5hYmxlZA0KICBzcG9uc29ycyBvbiBteSBnaXRodWIg YWNjb3VudCBhcyBhbiBleHBlcmltZW50LiBTbyBJJ2QgbGlrZSB0byB0aGFua3MNCiAgbXkgW2dp dGh1YiBzcG9uc29yc10sIEBkYXZlc254IGJlY2FtZSB0aGUgZmlyc3Qgb25lIG1vbmRheS4NCg0K DQpbT2xkIFV5Z2h1cl0NCjxodHRwczovL3VuaWNvZGUub3JnL2NoYXJ0cy9QREYvVW5pY29kZS0x NC4wL1UxNDAtMTBGNzAucGRmPg0KDQpbdGhlIGFubm91bmNlbWVudCBwYWdlXQ0KPGh0dHA6Ly9i bG9nLnVuaWNvZGUub3JnLzIwMjEvMDkvYW5ub3VuY2luZy11bmljb2RlLXN0YW5kYXJkLXZlcnNp b24tMTQwLmh0bWw+DQoNCltnaXRodWIgc3BvbnNvcnNdIDxodHRwczovL2dpdGh1Yi5jb20vc3Bv bnNvcnMvZGJ1ZW56bGkvPg0KDQoNClNldCB1cCBPQ2FtbCAyLjAuMC1iZXRhNA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t c2V0LXVwLW9jYW1sLTItMC0wLWJldGE0Lzg1MDEvMT4NCg0KDQpTb3JhIE1vcmltb3RvIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNoYW5nZWQNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IOKAoiBTZXQgYE9QQU1TT0xWRVJUSU1FT1VUJyB0byBgMTAwMCcgdG8gYXZvaWQgYSB0aW1lb3V0 IGV2ZW4gaWYgdGhlDQogICAgb3BhbSBzb2x2ZXIgaXMgc2xvdy4NCiAg4oCiIEluY3JlYXNlIGNh Y2hlIGhpdCByYXRpbyBieSBsb29zZW5pbmcgcmVzdG9yZSBrZXlzIG9mIG9wYW0gY2FjaGUuDQoN CiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9zZXR1cC1vY2FtbC9yZWxlYXNlcy90YWcvdjIu MC4wLWJldGE0Pg0KDQoNCkJlY29tZSBhbiBPdXRyZWFjaHkgTWVudG9yOiBzdXBwb3J0IHRoZSBn cm93dGggYW5kIGRpdmVyc2l0eSBvZiB0aGUgT0NhbWwgY29tbXVuaXR5DQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jl Y29tZS1hbi1vdXRyZWFjaHktbWVudG9yLXN1cHBvcnQtdGhlLWdyb3d0aC1hbmQtZGl2ZXJzaXR5 LW9mLXRoZS1vY2FtbC1jb21tdW5pdHkvODIxMy84Pg0KDQoNClNvbmphIEhlaW56ZSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEhleSBhbGwsIEkndmUganVzdCBzdWJtaXR0ZWQgYW4gT3V0cmVh Y2h5IHByb2plY3QgZm9yIHRoZSB3aW50ZXINCiAgcm91bmQuIFRoZSBwcm9qZWN0IGlzIHRvIHdy aXRlIHRoZSBiYXNpYyBwcHhfZGVyaXZpbmcgcGx1Z2lucyBpbg0KICBwcHhsaWI7IHRoYXQgaXMs IHRoZSBvbmVzIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIGEgdmVyc2lvbiBiYXNlZCBvbg0KICBw cHhsaWIuIEkgdGhpbmsgYm90aCwgaGF2aW5nIHRoZW0gYXZhaWxhYmxlIHRvIHVzZSwgYW5kIGhh dmluZyB0aGVpcg0KICBjb2RlIGF2YWlsYWJsZSBhcyBzaW1wbGUgZXhhbXBsZXMgb2YgaG93IHRv IHVzZSBQcHhsaWIuRGVyaXZpbmcgd291bGQNCiAgYmUgdmVyeSBuaWNlISBBbmQgaW1wcm92aW5n IHBweGxpYidzIGRvY3VtZW50YXRpb24gYW5kIGZpbmRpbmcgc2ltcGxlDQogIGlzc3VlcyBvbiBh bHJlYWR5IGV4aXN0aW5nIFBQWHMgdG8gcHJlcGFyZSBmb3IgT3V0cmVhY2h5LCB3aWxsIGJlDQog IGJlbmVmaWNpYWwgYXMgd2VsbC4NCg0KICBPZiBjb3Vyc2UsIGl0J3Mgbm90IGNsZWFyIGlmIHNv bWVvbmUgd2l0aCB0aGUgcmlnaHQgaW50ZXJlc3QgY29tZXMNCiAgYWxvbmcgZm9yIHRoaXMgcHJv amVjdCwgYnV0IGlmIHdlIGRvbid0IGZpbmQgYW4gaW50ZXJuIGZvciBpdCB0aGlzDQogIHJvdW5k LCBJIGNhbiBqdXN0IHJlLXN1Ym1pdCB0aGUgc2FtZSBwcm9qZWN0IG5leHQgcm91bmQuDQoNCg0K U29uamEgSGVpbnplDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBC dHcsIHRoZSBkZWFkbGluZSB0byBzdWJtaXQgcHJvamVjdHMgd2FzIGV4dGVuZGVkIGFuZCBpcyBu b3cgU2VwdA0KICAyM3JkLiBTbyB0aGUgdGltZWxpbmUgaW4gb3VyIHBvc3QgYWJvdmUgaXMgc2xp Z2h0bHkgb3V0ZGF0ZWQuDQoNCg0KVGhlIE9DYW1sIDQuMTMgcHJldmlldyBmb3IgTWVybGluIGlz IG5vdyBhdmFpbGFibGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRoZS1vY2FtbC00 LTEzLXByZXZpZXctZm9yLW1lcmxpbi1pcy1ub3ctYXZhaWxhYmxlLzg0MzYvNj4NCg0KDQpDb250 aW51aW5nIHRoaXMgdGhyZWFkLCBLYXRlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIE9DYW1sIDQuMTMg cHJldmlldyBmb3Igb2NhbWwtbHNwLXNlcnZlciBpcyBub3cgYXZhaWxhYmxlIGFzIHdlbGwuDQoN CiAgVG8gaW5zdGFsbCBpdCBhbG9uZyB3aXRoIHRoZSBPQ2FtbCA0LjEzIHJjLCBwbGVhc2UgcmVm ZXIgdG8gdGhlIGZpcnN0DQogIHBvc3QuDQoNCiAgSWYgeW91IGVuY291bnRlciBhbnkgcHJvYmxl bXMgd2hpbGUgdXNpbmcgb2NhbWwtbHNwLXNlcnZlciwgcGxlYXNlDQogIGZlZWwgZnJlZSB0byBy ZXBvcnQgaXQgZGlyZWN0bHkgaW4NCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1s c3AvcHVsbC81MDY+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5k IEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2 ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl DQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdl XSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZl XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhl IGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0K W29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWts eS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 14 to 21, 2= 021.

opam-grep: search through the sources of all the packages in o= pam-repository

Kate announced

I've just released opam-grep.0.2.0 with quite a bit of change compared to t= he previous version. Here is the highlight:

  • Complete rewrite from shell script to OCaml, making it more portable
  • Use the faster ripgrep and ugrep over g= rep when available (suggestion by @Engil)
  • Use the progress library to show progress instead of a non= -portable/DIY spinner

See the changelog for the full list of relevant changes.

Big thanks to @CraigFe for the progress library (such a tre= at!) and to @dbuenzli for bos and cmdliner in particular, making it easy to do such rewrite :relaxed:

Hardcaml MIPS CPU Learning Project and Blog

Alexander (Sasha) Skvortsov announced

Hi everyone! We are excited to announce that we have completed this project= and blog. Progress has been slow these past few months due to work, internships, and college, but we=E2=80=99ve no= w released v1.0.0 on GitHub. We also published posts on:

Finally, we published a conclusion blog post, which wraps up some strengths/weaknesses of Hardcaml, as well as some takeaways o= n OCaml and blogging more generally.

Thank you to @andyman and @fyquah95 for building Hardcaml, and for helping = us out on GitHub issues! We really appreciate your time and suggestions.

Overall, we=E2=80=99ve come to the conclusion that Hardcaml is a much bette= r tool for hardware design than Verilog. This has been a great experience, and we walk away with a better understanding of ha= rdware, functional programming, and technical writing.

Puzzling through some GADT errors

Deep in this thread, gasche said

Not exactly what you are asking for, but @Octachron wrote an excellent chapter on GADTs in the OCaml manual, which could be recommended to people starting GADT programming. It explains why recursive functions on GADT need= "explicit polymorphic annotations" in less "implementation driven" terms.

(The chapter also demonstrates the new naming scheme for existential type v= ariables introduced by GADT constructors, which can help a lot working through type errors, but are still a bit heavy= and deserve a gentle introduction.)

octachron then added

I have only written the nomenclature part and a bit of the explanation for = recursive functions in this chapter, @garrigue is the author of most of this chapter.

Parany for multicore OCaml

UnixJunkie announced

There is now an implementation using multicore-OCaml in the 'domains' branc= h.

https://githu= b.com/UnixJunkie/parany/tree/domains

People are very welcome to give it a try and share the speedup they observe, especially compared to fork-based parallelism.

Thanks to @nilsbecker for having motivated me.

UnixJunkie later added

If you don't use the domains branch, then parany is using fork-based parall= elism. If you want to use the domains branch, you need to install multicore-ocaml = first:

opam switch create 4.12.0+domains
eval `opam config env`

OCaml 4.13.0, second release candidate

octachron announced

The release of OCaml 4.13.0 is expected for next week.

Since we had a native code generation bug fix and two minor configuration t= weaks since the first release candidate, we are publishing a second release candi= date. If you find any bugs, please report them here:

https://github.com/ocaml/= ocaml/issues

Happy hacking, Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.13.0~rc2 --repositories=3Ddefault,beta=3Dgit+https://g=
ithub.com/ocaml/ocaml-beta-repository.git

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.13.0~r=
c2+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

where <option_list> is a comma separated list of ocaml-option-* packa= ges. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.13.0~rc2+flambda+nffa
--packages=3Docaml-variants.4.13.0~rc2+options,ocaml-option-flambda,ocaml-o=
ption-no-flat-float-array
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

All available options can be listed with "opam search ocaml-option".

The source code for the release candidate is also available at these addres= ses:

Changes since the first release candidate

  • #10626, #10628: Wrong relo= ading of the x86-64 instruction for integer multiplication by a constant, c= ausing the assembler to reject the ocamlopt-generated code. (Xavier Leroy, = report by Dave Aitken, review by Vincent Laviron)
  • #10176, #10632(new in rc2)= : By default, call the assembler through the C compiler driver (S=C3=A9bast= ien Hinderer, review by Gabriel Scherer, David Allsopp and Xavier Leroy)
  • #10451, #10635(new in rc2)= : Replace the use of iconv with a C utility to convert $(LIBDIR) to a C str= ing constant on Windows when building the runtime. Hardens the generation o= f the constant on Unix for paths with backslashes, double-quotes and newlin= es. (David Allsopp, review by Florian Angeletti and S=C3=A9bastien Hinderer= )

Unicode 14.0.0 update for Uucd, Uucp, Uunf and Uuseg

Daniel B=C3=BCnzli announced

Unicode 14.0.0 was released on the 14th of september.

It adds 838 new characters to the standard including, for our friends from = Central Asia, support for Old Uyghur. For information about all the other additions, see the announ= cement page.

Accordingly the libraries mentioned at the end of this message had to be up= dated, consult the individual release notes for details. Both Uucd and Uucp are incompatible releases sinces new = script and block enumerants had to be added.

Best,

Daniel

P.S. Though I'm not very fond of the concept, I recently enabled sponsors o= n my github account as an experiment. So I'd like to thanks my git= hub sponsors, @davesnx became the first one monday.

Become an Outreachy Mentor: support the growth and diversity o= f the OCaml community

Sonja Heinze announced

Hey all, I've just submitted an Outreachy project for the winter round. The= project is to write the basic ppx_deriving plugins in ppxlib; that is, the ones that don't already have a= version based on ppxlib. I think both, having them available to use, and having their code available as simple exa= mples of how to use Ppxlib.Deriving would be very nice! And improving ppxlib's documentation and finding simple issue= s on already existing PPXs to prepare for Outreachy, will be beneficial as well.

Of course, it's not clear if someone with the right interest comes along fo= r this project, but if we don't find an intern for it this round, I can just re-submit the same project next round.

Sonja Heinze

Btw, the deadline to submit projects was extended and is now Sept 23rd. So = the timeline in our post above is slightly outdated.

The OCaml 4.13 preview for Merlin is now available

Continuing this thread, Kate announced

The OCaml 4.13 preview for ocaml-lsp-server is now available as well.

To install it along with the OCaml 4.13 rc, please refer to the first post.

If you encounter any problems while using ocaml-lsp-server, please feel fre= e to report it directly in https://github.com/= ocaml/ocaml-lsp/pull/506

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 774A5E003C for ; Tue, 28 Sep 2021 08:37:49 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=F0Wp=OS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AAl+N6hwSNN6ST7rXCzILzFBlVkEcU1XcAAcZ59I?= =?us-ascii?q?dhq5Udez7ptK+ZhSZtKwm0QCBdL6YwsoMs/DRvaHkVD5Iyre6m1dGTqZxUQQYg?= =?us-ascii?q?94dhQ0qDZ3NI0T6KPn3c35yR5waBxdq8H6hLEdaBtv1aUHMrX2u9z4SHQj0ORZ?= =?us-ascii?q?oKujvFYPekdi72/q29pHObAlFhDiwaq5uIRurqgncqtMYipZ4JKYrzRvJrHpIe?= =?us-ascii?q?+BIym5tOFmegRXy6Nqu8ZB66yhftO4v+MBGUaXhYqQ3VqdYAyg8M2A0/8Lkqx/?= =?us-ascii?q?ORhaS63QGU2UWlh1IAxXZ7Bz/Q5z8vDf2uvZ71SKHOsL4UK00WS+676h1VBDol?= =?us-ascii?q?CkJNzk88G7Ni8xwir9QrBauqhF7xoLZZoGZOvl4fqPDfNMaXmtBUd1VVyNfH4i?= =?us-ascii?q?9YYwPD/AcMuZDsoLxo1UDoQe7CQSqGejhyCJHhmXu0KM6zeovDA/I0g8vEN0Sq?= =?us-ascii?q?3nbtsn5Ob0IXOyp0KXFzzPOZO5W1zfn74jIdwgsrO2IXb1qd8ra1FQhGB/FjlW?= =?us-ascii?q?VqIzlIy+V3fkKvmeB6+pvT+Svh3Q8qw5tojivw8YsipXVho8O0lDE8iF5wYYpJ?= =?us-ascii?q?dKmVEF7YdikEJpJtyGHKYR6WMQiQ3tnuCsjzLANpJG0cjQQxps92x7fd+KIc5K?= =?us-ascii?q?O4h/7WuufLjl1iX1kdby/mRu8/1Wtx/D8WMWp3ltHrypInsTDu30T2RLf9smKR?= =?us-ascii?q?/Vz80qixTqC2QTe5+9FLE0qi6bWNpgsyaM+mJoUtETMBC72mEPuga+OaEok5um?= =?us-ascii?q?o6/j5bbX+oZ+cMop0hR/kPqQohMO/Hfw0Mg8SUGeB/OS80Kfv/UrjQLVFlvE5j?= =?us-ascii?q?LPZsIrAKsQHp665GhJV3Zg55xmjDzeqyNMYkmUcLFJEdxKIkY7pN0vJIPDiAve?= =?us-ascii?q?zm1uskDZ3x/DGI73uGY/BIWTEkLfkZbpy905cxxA1zdBQ+Z1UEasNIPfuVUPps?= =?us-ascii?q?9zXEgU2Mwmww+bjEtpyzZgeVXiOAq+eKK/SsFmI5vguI+aWfoMVtiz9J+Ag5/H?= =?us-ascii?q?0l385mFAdfa6t3ZQKcny3A+ppI1uBbXrjg9cBDWcKvhclQ+DwiV2CViZfZ2qoU?= =?us-ascii?q?KIm5zE0FZypDZzZSo+xh7yB2T+3HppKaW9cD1CMFW/od5+DW/sWdC2SJcphniQ?= =?us-ascii?q?FVbe8S44h0RWuuBX9y7p9IerZ/DATu5H71NVt+uHfixU/+SZpA8iB3GyBVW95k?= =?us-ascii?q?n8SSzI4061zuUNwx1aZ3aRlgfFUCMZf6+1XXgo1L5LQ0vB2BtT0VwncZNmGUky?= =?us-ascii?q?mTc+jATwpTtI+3dsOY0FlFtWngRHPwjCmA6cSl7yPBJ007rzT0GTxJ8Z7ynbGz?= =?us-ascii?q?bQhgEc8TstIL22mibZz9wnVB4HXj0WUj7umeboY0SLX6WuP0WWDsFtWXQJsS6n?= =?us-ascii?q?IU38SalPTrdvj50PCS7GuCa4gMgtE0cOMN7dEZMD1gVheRPnvJNTRY3qplmmpG?= =?us-ascii?q?BiF3quMbI3ue2QdwCXSFlQLkwAV/XaHLAg+Gzmur3jZDDx0GlLie1nj8e1kp3O?= =?us-ascii?q?9VEM01B2Fb01k17q05h4VmeeRROgU3rIZvicutyt7HE2n09LTBNeBqBBtfKJGY?= =?us-ascii?q?dMy+FtHz37WtxRhPpy8KKBvnkIRfB5yv0Pqzhl3DoRAkdM2rH4x1wpzKaeY0Et?= =?us-ascii?q?beD+C3JDwPKfXKmjo8xy1Za7WwAKW7NHDsKMQ7r5w/1H8uimtCUxk9Xh7hZ0dm?= =?us-ascii?q?XCD4N+CRF4ZTpTZVkcs6wM8pr3LZi174JnbgzkkOqCxtnrG2sk1LOoj0BepOdl?= =?us-ascii?q?FY42eEwqnOskTAYCVI+wvmkS1JkYNOOlUsrU/P8ana+euwKmvLfptlzKgjH1a7?= =?us-ascii?q?cZ6yE3apHk0cfLBw5tQm6LQ5QCATTqp0wbJWi/fk4dZYzofBSy6lTiiA5ReNPQ?= =?us-ascii?q?alWcjDHf3ZdWwwsRiipXtXX9B6VPlAEkJipbBkf+6d1v5zBFd3kQRoGW6lG2/1?= =?us-ascii?q?TMmylkU?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A+oeKsKCwxRn+f2flHelP55DYdb4zR+YMi2QD?= =?us-ascii?q?/1lpUhpLfsHdvNDGppt06faUskdqZJhEo7290ca7MA/hHPJOkPgs1VnLZnivhI?= =?us-ascii?q?OHRLsSmbcLW1bbamTDHgQ079YXT0EGMqyGMbEYt7eA3ODbKadc/DDdytHcuQ62?= =?us-ascii?q?9R4EJ20KC9ADnmIJbjpzdHcGOzWubaBTKHOy3Ls4m9PKQwVmUi3UPAh2YwEBna?= =?us-ascii?q?ysqHslW29gO/fq0nj2sdpg0s+DL/Dysy1uIA+nHo1SklT4rw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AaCACYahphhyIeaIFQChwBAQErAQEHA?= =?us-ascii?q?QEBBQEBBAQBAYF9gSEbAn0BZFc6MYRHiQSGRYIkgROCFQKFc5FpggoDXwEDAQ0?= =?us-ascii?q?SAhYBDgUBAgQBAYFsgnUCFzoJghECHgYBBTMTAQIEFQEBBQEBAQIBAwMEARMBA?= =?us-ascii?q?QEBDQsOCDokhTsHJg2CNQwMAwODdwEhBAZlIwMUBwMCBA0BFwEUChcBEhQFAYJ?= =?us-ascii?q?XAYMHBAEKi2KaQRo1en8ygQGDTQEDAwILAwEOCSaEFYFjDQIUgRUCAQGFblNIA?= =?us-ascii?q?YJtg3gCJxCBVUSBFYJuB26CBDwLDAsBAQEBAYEwCwEBCE6CYYJkBINHDkAmOgI?= =?us-ascii?q?YFAcUDwEVDS4IOAgDTUoIAw2RVx4lA5ZTlEItB4MrgTEGC4dmgRWMRYd7g2WBS?= =?us-ascii?q?IobhkSQaSGVcIh1gQsJgjWTV4UwgU0qgUweDAczGjBDgjUBATIJYA6DKI5CKEF?= =?us-ascii?q?9gSaBdTuFTD8yAgEBEiICBgEKAQEDCYEIAQEFEwsBiEcBAQ?= X-IPAS-Result: =?us-ascii?q?A0AaCACYahphhyIeaIFQChwBAQErAQEHAQEBBQEBBAQBAYF?= =?us-ascii?q?9gSEbAn0BZFc6MYRHiQSGRYIkgROCFQKFc5FpggoDXwEDAQ0SAhYBDgUBAgQBA?= =?us-ascii?q?YFsgnUCFzoJghECHgYBBTMTAQIEFQEBBQEBAQIBAwMEARMBAQEBDQsOCDokhTs?= =?us-ascii?q?HJg2CNQwMAwODdwEhBAZlIwMUBwMCBA0BFwEUChcBEhQFAYJXAYMHBAEKi2KaQ?= =?us-ascii?q?Ro1en8ygQGDTQEDAwILAwEOCSaEFYFjDQIUgRUCAQGFblNIAYJtg3gCJxCBVUS?= =?us-ascii?q?BFYJuB26CBDwLDAsBAQEBAYEwCwEBCE6CYYJkBINHDkAmOgIYFAcUDwEVDS4IO?= =?us-ascii?q?AgDTUoIAw2RVx4lA5ZTlEItB4MrgTEGC4dmgRWMRYd7g2WBSIobhkSQaSGVcIh?= =?us-ascii?q?1gQsJgjWTV4UwgU0qgUweDAczGjBDgjUBATIJYA6DKI5CKEF9gSaBdTuFTD8yA?= =?us-ascii?q?gEBEiICBgEKAQEDCYEIAQEFEwsBiEcBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="530724234" X-MGA-submission: =?us-ascii?q?MDFMJSMPwSwrFMOF0MhfNWwqEemnArxu3bCL4P?= =?us-ascii?q?z182FZ3/wx5f3CE4TyYZxyFMLti9V3zqY+ZK502B/SWiTdPvN3vknemu?= =?us-ascii?q?ac4C670ICWIkCrf1ifWhb7VyyjS9VtW3NNdr6OIYpVcLp0EFZhmwfE2z?= =?us-ascii?q?ASckz5GHnkGrOEq8IwsgfOJg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Sep 2021 08:37:48 +0200 Received: from set (piq109.internetdsl.tpnet.pl [46.171.224.109]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5B8045648FF; Tue, 28 Sep 2021 08:37:46 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 28 Sep 2021 08:37:40 +0200 Message-ID: <87wnn1kxxn.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 28 08:37:47 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001083, queueID=4117456491D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgU2VwdGVtYmVyIDIxIHRvDQoyOCwgMjAyMS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpCcnIg MC4wLjIsIGEgdG9vbGtpdCBmb3IgcHJvZ3JhbW1pbmcgYnJvd3NlcnMNCkJlY29tZSBhbiBPdXRy ZWFjaHkgTWVudG9yOiBzdXBwb3J0IHRoZSBncm93dGggYW5kIGRpdmVyc2l0eSBvZiB0aGUgT0Nh bWwgY29tbXVuaXR5DQpPQ2FtbCA0LjEzLjAgKGFuZCA0LjEyLjEpDQpPdGhlciBPQ2FtbCBOZXdz DQpPbGQgQ1dODQoNCg0KQnJyIDAuMC4yLCBhIHRvb2xraXQgZm9yIHByb2dyYW1taW5nIGJyb3dz ZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1icnItMC0wLTItYS10b29sa2l0LWZvci1wcm9ncmFtbWluZy1i cm93c2Vycy84NTIxLzE+DQoNCg0KRGFuaWVsIELDvG56bGkgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIGAwLjAuMicg b2YgW2BCcnInXSwgYSB0b29sa2l0DQogIGZvciBwcm9ncmFtbWluZyBicm93c2VycyBpbiBPQ2Ft bCB3aXRoIHRoZSBbYGpzX29mX29jYW1sJ10gY29tcGlsZXIuDQoNCiAgT25jZSBpdCBoYXMgbWFk ZSBpdCB0byB0aGUgcmVwbywgaW5zdGFsbCB3aXRoIGBvcGFtIGluc3RhbGwgYnJyJyBhbmQNCiAg Y29uc3VsdCB0aGUgW0FQSSBkb2NzIGFuZCBtYW51YWxzXSAob3IgdmlhIGBvZGlnIGRvYyBicnIn KS4NCg0KICBUaGlzIHJlbGVhc2UgZml4ZXMgYmluZGluZyBidWdzLCBhZGRzIGEgZmV3IG5ldyBi aW5kaW5ncyBhbmQgdHdlYWtzDQogIHNvbWUgZXhpc3Rpbmcgc2lnbmF0dXJlcy4gVGhhbmtzIHRv IGFsbCBvZiB0aG9zZSB3aG8gcHJvdmlkZWQgYnVnDQogIHJlcG9ydHMsIHN1Z2dlc3Rpb25zIGFu ZCBjb2RlLg0KDQogIFRoZSBbcmVsZWFzZSBub3Rlc10gaGF2ZSBhbGwgdGhlIGRldGFpbHMuDQoN Cg0KW2BCcnInXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyPg0KDQpbYGpzX29m X29jYW1sJ10gPGh0dHBzOi8vb2NzaWdlbi5vcmcvanNfb2Zfb2NhbWw+DQoNCltBUEkgZG9jcyBh bmQgbWFudWFsc10gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2Jyci9kb2MvPg0KDQpb cmVsZWFzZSBub3Rlc10NCjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYnJyL2Jsb2IvbWFz dGVyL0NIQU5HRVMubWQjdjAwMi0yMDIwLTA5LTIzLXphZ3JlYj4NCg0KDQpCZWNvbWUgYW4gT3V0 cmVhY2h5IE1lbnRvcjogc3VwcG9ydCB0aGUgZ3Jvd3RoIGFuZCBkaXZlcnNpdHkgb2YgdGhlIE9D YW1sIGNvbW11bml0eQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9iZWNvbWUtYW4tb3V0cmVhY2h5LW1lbnRvci1zdXBw b3J0LXRoZS1ncm93dGgtYW5kLWRpdmVyc2l0eS1vZi10aGUtb2NhbWwtY29tbXVuaXR5LzgyMTMv MTM+DQoNCg0KVGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ J3ZlIHN1Ym1pdHRlZCB0d28gcHJvamVjdHMgZm9yIHRoZSB3aW50ZXIgc2Vzc2lvbjoNCg0KICDi gKIgSW50ZWdyYXRlIGEgcGFja2FnZSBoZWFsdGggY2hlY2sgaW4gb2NhbWwub3JnDQoNCiAgVG8g ZXNzZW50aWFsbHkgaW50ZWdyYXRlIGEgdmVyc2lvbiBvZiBjaGVjay5vY2FtbGxhYnMuaW8gdGhh dCBjYW4gYmUNCiAgdXNlZCBieSBvcGFtLXJlcG9zaXRvcnkgbWFpbnRhaW5lcnMgYW5kIG9wYW0g dXNlcnMgaW50byB0aGUgbmV4dA0KICB2ZXJzaW9uIG9mIG9jYW1sLm9yZyAoPGh0dHBzOi8vdjMu b2NhbWwub3JnPikuDQoNCiAg4oCiIFN1cHBvcnQgYC5lbWwnIGZpbGVzIGluIE9DYW1sJ3MgVlND b2RlIGV4dGVuc2lvbg0KDQogIFRvIGFkZCBzdXBwb3J0IGZvciBEcmVhbSdzIFtgLmVtbCcgZmls ZXNdIHN5bnRheCBpbiB0aGUgZXh0ZW5zaW9uLCBhbmQNCiAgZXZlbnR1YWxseSBoYXZlIGVycm9y IHJlcG9ydGluZyBmb3IgdGhlc2UgZmlsZXMgZnJvbSBPQ2FtbCBMU1AgU2VydmVyLg0KDQogIEkn bSBtb3JlIHRoYW4gaW50ZXJlc3RlZCBpbiBoYXZpbmcgY28tbWVudG9ycyBmb3IgdGhlc2UgdHdv IHByb2plY3RzLA0KICBzbyBpZiB5b3Ugd2FudGVkIHRvIG1lbnRvciBPdXRyZWFjaHkgaW50ZXJu cyBidXQgZGlkbid0IGhhdmUgYW55DQogIHByb2plY3QgaWRlYXMsIGRvbid0IGhlc2l0YXRlIHRv IHJlYWNoIG91dCA6c2xpZ2h0X3NtaWxlOg0KDQogIEFub3RoZXIgd2F5IHRvIGhlbHAgdGhhdCBk b2VzIG5vdCBpbnZvbHZlIG1lbnRvcmluZyBpcyB0byBmaW5kIGdvb2QNCiAgZmlyc3QgaXNzdWVz IHRoYXQgd2lsbCBoZWxwIG9uYm9hcmQgYW5kIHNlbGVjdCBjYW5kaWRhdGVzIGZvciB0aGUNCiAg cHJvamVjdHMuIEFueSBoZWxwIG9uIHRoaXMgZWZmb3J0IHRvIGlkZW50aWZ5LCBjcmVhdGUgYW5k IGRvY3VtZW50DQogIGdvb2QgZmlyc3QgaXNzdWVzIGZvciB0aGUgZGlmZmVyZW50IHByb2plY3Rz IGlzIG1vcmUgdGhhbiB3ZWxjb21lIQ0KDQoNCltgLmVtbCcgZmlsZXNdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2FhbnRyb24vZHJlYW0vdHJlZS9tYXN0ZXIvZXhhbXBsZS83LXRlbXBsYXRlPg0KDQoN Ck9DYW1sIDQuMTMuMCAoYW5kIDQuMTIuMSkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0xMy0wLWFuZC00LTEyLTEv ODUyOS8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBPQ2FtbCB0ZWFtIGhh IHRoZSBwbGVhc3VyZSBvZiBjZWxlYnJhdGluZyB0aGUgMTc1dGggYW5uaXZlcnNhcnkgb2YNCiAg dGhlIGRpc2NvdmVyeSBvZiBOZXB0dW5lIGJ5IGFubm91bmNpbmcgdGhlIGpvaW50IHJlbGVhc2Vz IG9mIE9DYW1sDQogIHZlcnNpb24gNC4xMy4wIGFuZCA0LjEyLjEgLg0KDQogIFNvbWUgb2YgdGhl IGhpZ2hsaWdodHMgaW4gdGhlIDQuMTMuMCByZWxlYXNlIGFyZToNCg0KICDigKIgU2FmZSBwb2lu dHM6IGEgbXVsdGljb3JlIHByZXJlcXVpc2l0ZSB0aGF0IGVuc3VyZXMgdGhhdA0KICAgIG9jYW1s b3B0LWdlbmVyYXRlZCBjb2RlIGNhbiBhbHdheXMgYmUgaW50ZXJydXB0ZWQuDQogIOKAoiBUaGUg YmVzdC1maXQgR0MgYWxsb2NhdGlvbiBwb2xpY3kgaXMgbm93IHRoZSBkZWZhdWx0IHBvbGljeSAo YW5kDQogICAgbWFueSBvdGhlciBHQyBpbXByb3ZlbWVudHMpLg0KICDigKIgTmFtZWQgZXhpc3Rl bnRpYWwgdHlwZSB2YXJpYWJsZXMgaW4gcGF0dGVybiBtYXRjaGluZzogYFNob3dhYmxlDQogICAg KHR5cGUgYSkgKHgsIHNob3cgOiBhICogKGEgLT4gc3RyaW5nKSknLg0KDQogIOKAoiBJbXByb3Zl ZCBlcnJvciBtZXNzYWdlcyBmb3IgZnVuY3RvciBhcHBsaWNhdGlvbiBhbmQgZnVuY3RvciB0eXBl cy4NCiAg4oCiIExldC1wdW5uaW5nIGZvciBtb25hZGljIGxldDogYGxldCogeCA9IHggaW4nIGNh biBiZSBzaG9ydGVuZWQgdG8NCiAgICBgbGV0KiB4IGluJy4NCiAg4oCiIE1vZHVsZSB0eXBlIHN1 YnN0aXR1dGlvbnM6IGBTSUcgd2l0aCBtb2R1bGUgdHlwZSBUID0gRihYKS5TJy4NCg0KICDigKIg TWFueSBvdGhlciBxdWFsaXR5IG9mIGxpZmUgaW1wcm92ZW1lbnRzDQogIOKAoiBNYW55IGJ1ZyBm aXhlcw0KDQogIFRoZSA0LjEyLjEgcmVsZWFzZSBpcyBhIGNvbGxlY3Rpb24gb2Ygc2FmZSBidWcg Zml4ZXMsIGNoZXJyeS1waWNrZWQNCiAgZnJvbSB0aGUgNC4xMy4wIGRldmVsb3BtZW50IGN5Y2xl LiBJZiB5b3Ugd2VyZSB1c2luZyBPQ2FtbCA0LjEyLjAgYW5kDQogIGNhbm5vdCB5ZXQgdXBncmFk ZSB0byA0LjEzLjAsIHRoaXMgcmVsZWFzZSBpcyBmb3IgeW91Lg0KDQogIFRoZSBmdWxsIGxpc3Qg b2YgY2hhbmdlcyBjYW4gYmUgZm91bmQgaW4gdGhlIGNoYW5nZWxvZ3MNCiAgYmVsb3cuICgqRWRp dG9yIG5vdGUqOiBhcyBpdOKAmXMgcXVpdGUgbG9uZywgaXQgaXMgbm90IGluY2x1ZGVkDQogIGhl cmUuIFBsZWFzZSBmb2xsb3cgdGhlIGxpbmsgdG8gdGhlIG9yaWdpbmFsIGFydGljbGUgdG8gcmVh ZCBpdC4pDQoNCiAgVGhvc2UgcmVsZWFzZXMgYXJlIGF2YWlsYWJsZSBhcyBPUEFNIHN3aXRjaGVz LCBhbmQgYXMgYSBzb3VyY2UNCiAgZG93bmxvYWQgaGVyZToNCg0KICDigKIgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTMuMC50YXIuZ3o+DQogIOKAoiA8aHR0cHM6 Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTQuMTMvPg0KDQogIGFuZCB0aGVyZToN Cg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTIuMS50 YXIuZ3o+DQogIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTQu MTIvPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbGNvcmUgcGxhbmV0IGJsb2cNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20g bWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFtPQ2FtbCBQbGFuZXRdLg0KDQogIOKAoiBb QW5ub3VuY2luZyBUZXpvc+KAmSA4dGggcHJvdG9jb2wgdXBncmFkZSBwcm9wb3NhbDogSGFuZ3po b3VdDQogIOKAoiBbTWVhc3VyaW5nIE9DYW1sIGNvbXBpbGF0aW9uIHNwZWVkIGFmdGVyIGEgcmVm YWN0b3JpbmddDQogIOKAoiBbV3JpdGluZyBMaWZ0ZXJzIFVzaW5nIFByaW11cyBMaXNwXQ0KICDi gKIgW1RhcmlkZXMgUmV0dXJucyB0byBGSUMgMjAyMV0NCiAg4oCiIFtHZW5lcmF0aW5nIHN0YXRp YyBhbmQgcG9ydGFibGUgZXhlY3V0YWJsZXMgd2l0aCBPQ2FtbF0NCg0KDQpbT0NhbWwgUGxhbmV0 XSA8aHR0cDovL29jYW1sLm9yZy9jb21tdW5pdHkvcGxhbmV0Lz4NCg0KW0Fubm91bmNpbmcgVGV6 b3PigJkgOHRoIHByb3RvY29sIHVwZ3JhZGUgcHJvcG9zYWw6IEhhbmd6aG91XQ0KPGh0dHBzOi8v bWFyaWdvbGQuZGV2L2Jsb2cvYW5ub3VuY2luZy1oYW5nemhvdS8+DQoNCltNZWFzdXJpbmcgT0Nh bWwgY29tcGlsYXRpb24gc3BlZWQgYWZ0ZXIgYSByZWZhY3RvcmluZ10NCjxodHRwOi8vZ2FsbGl1 bS5pbnJpYS5mci9ibG9nL21lYXN1cmluZy1jb21waWxhdGlvbi10aW1lLz4NCg0KW1dyaXRpbmcg TGlmdGVycyBVc2luZyBQcmltdXMgTGlzcF0NCjxodHRwOi8vYmluYXJ5YW5hbHlzaXNwbGF0Zm9y bS5naXRodWIuaW8vMjAyMS8wOS8xNS93cml0aW5nLWxpZnRlcnMtdXNpbmctcHJpbXVzLWxpc3Av Pg0KDQpbVGFyaWRlcyBSZXR1cm5zIHRvIEZJQyAyMDIxXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20v YmxvZy8yMDIxLTA5LTA2LXRhcmlkZXMtcmV0dXJucy10by1maWMtMjAyMT4NCg0KW0dlbmVyYXRp bmcgc3RhdGljIGFuZCBwb3J0YWJsZSBleGVjdXRhYmxlcyB3aXRoIE9DYW1sXQ0KPGh0dHBzOi8v d3d3Lm9jYW1scHJvLmNvbS8yMDIxLzA5LzAyL2dlbmVyYXRpbmctc3RhdGljLWFuZC1wb3J0YWJs ZS1leGVjdXRhYmxlcy13aXRoLW9jYW1sLz4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDi lZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUg YSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sg YXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoN CiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0K DQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltS U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3 bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9j YW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of September 21 to 28, 2= 021.

Brr 0.0.2, a toolkit for programming browsers

Daniel B=C3=BCnzli announced

It's my pleasure to announce the release 0.0.2 of Brr, a toolkit for programming browsers in OCaml with the js_of_ocaml compiler.

Once it has made it to the repo, install with opam install brr= and consult the API doc= s and manuals (or via odig doc brr).

This release fixes binding bugs, adds a few new bindings and tweaks some ex= isting signatures. Thanks to all of those who provided bug reports, suggestions and code.

The release notes have all the details.

Become an Outreachy Mentor: support the growth and diversity o= f the OCaml community

Thibaut Mattio announced

I've submitted two projects for the winter session:

  • Integrate a package health check in ocaml.org

To essentially integrate a version of check.ocamllabs.io that can be used b= y opam-repository maintainers and opam users into the next version of ocaml.org (= https://v3.ocaml.org).

  • Support .eml files in OCaml's VSCode extension

To add support for Dream's .eml files syntax in the extension, and eventually have error reporting for these files from OCa= ml LSP Server.

I'm more than interested in having co-mentors for these two projects, so if= you wanted to mentor Outreachy interns but didn't have any project ideas, don't hesitate to reach out :slight_smil= e:

Another way to help that does not involve mentoring is to find good first i= ssues that will help onboard and select candidates for the projects. Any help on this effort to identify, create an= d document good first issues for the different projects is more than welcome!

OCaml 4.13.0 (and 4.12.1)

octachron announced

The OCaml team ha the pleasure of celebrating the 175th anniversary of the = discovery of Neptune by announcing the joint releases of OCaml version 4.13.0 and 4.12.1 .

Some of the highlights in the 4.13.0 release are:

  • Safe points: a multicore prerequisite that ensures that ocamlopt-genera= ted code can always be interrupted.
  • The best-fit GC allocation policy is now the default policy (and many o= ther GC improvements).
  • Named existential type variables in pattern matching: Showable (t= ype a) (x, show : a * (a -> string)).
  • Improved error messages for functor application and functor types.
  • Let-punning for monadic let: let* x =3D x in can be shorte= ned to let* x in.
  • Module type substitutions: SIG with module type T =3D F(X).S.
  • Many other quality of life improvements
  • Many bug fixes

The 4.12.1 release is a collection of safe bug fixes, cherry-picked from th= e 4.13.0 development cycle. If you were using OCaml 4.12.0 and cannot yet upgrade to 4.13.0, thi= s release is for you.

The full list of changes can be found in the changelogs below. (Editor n= ote: as it=E2=80=99s quite long, it is not included here. Please follow= the link to the original article to read it.)

Those releases are available as OPAM switches, and as a source download her= e:

and there:

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id F161DE0163 for ; Tue, 19 Oct 2021 10:23:11 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=gTh0=PH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3ACrPqyR/J6W11L/9uWWe6ngc9DxPPW53KNwIYoqA?= =?us-ascii?q?ql6hJOvz6uci4ZAqOvL4w0xfgZsby07p8ke3YsqTtCyQrwK2qlzQ8SqFKTAIPk?= =?us-ascii?q?s4MngYtU4avAEz/K+P2PWRhRJwRHFBq8GumPkdLBc3we0PdomGo7T4VBx7zKRd?= =?us-ascii?q?5Kv76F4LMk8i7zeS/94DcbwhIhje2fK9/IgixoQjNrMcdnJFsKrw2yhvHo3tIf?= =?us-ascii?q?/pZyGZ1Ll+NnBjy+9m98od7/ytfp/wu+chAUb7nf6sjVrxXEC4mM2Eu68L1sxT?= =?us-ascii?q?IUBaC6WEdUmUSlRpIHhTF4RTnVZr/rif2quxw0zSaMcP1S7A0RzWi77xqSBDzj?= =?us-ascii?q?CcIKSMy8W/Qisxqka1buw+qqxhxzoLIZY2YMud1cKHActMAXWdPXthfWTFPDI2?= =?us-ascii?q?/YIQAE/EMMvxEo4TnvVYCsQeyCAuqCejyyjFInHj23agi3uk9FQHJxgogFM8Tv?= =?us-ascii?q?nvIrNX1MaYSUfypzKLVyjjMdfdW1i376ITSaRAuvfGMXbdxccrN1UkiDBvFjlK?= =?us-ascii?q?UqY3lIzOayPgCs2id7+phTOKvlnAopxt2oji1ycchk4/EjZ8axV7Y7yt22po1J?= =?us-ascii?q?cGmR05hZ96pCJVduS6EOoV5XM8vR39ltTo1xLMGpJO2YSgExZY5yhLDdfCLb4m?= =?us-ascii?q?F7xP9WeuRIjp1mnBodryjihu88EWt1vDwW8uy3V1XoCRFldzMuWoM1xzV8sWHU?= =?us-ascii?q?uVy/lug2TaTyQ/T8uZEIUUxlaXFMZIhxKA/loYLvUTEAiD5gkD2jKuMekUj4Oi?= =?us-ascii?q?o5PzrYrL6qZCGMo90jhn+Mr4pmsClHes4NQ0OU3Cb+OS7yb3j4VD5TK9RgfIoi?= =?us-ascii?q?qXZv5HaJdgfpqGjGABZyIcj6xGnAzep0dQYgX0HI0hedx6dk4fpPFTOLOj3Dfe?= =?us-ascii?q?+n1SskCpryOvcMrL9BZXNK2DPn6rmfblh6E5T1hAzwcpD6JJTD7ENOPPzVVLxt?= =?us-ascii?q?dzcCh81KQu0w/zoCNh7y4gQWnqPD7eEPK/MtVKE/P8jL/WDaYMPtjvxN+Ip6vD?= =?us-ascii?q?hgHMhhFMQc7Sl0YEJZH24EflqOViVbWb2jtscE2oGogwzR/HwhlKYSz5cfXOyU?= =?us-ascii?q?ro85j4lDIKmCp/ORoWigbCcxiu7BppWZmRGC1CQD3jna4WEW/ENaCKLP89ujCY?= =?us-ascii?q?IVb+7S48uzR2utQn6xKR7LufM5yEUq5bu2MJo6+HPmhw+7zJ5A9iH32yDQGx4h?= =?us-ascii?q?mYISCU33KB7r0x90FCD0a1gjvJFCdJd+u9FXx81NZDCz+x2F8j/VBjDcNqRUFa?= =?us-ascii?q?mRdGmADEtTt0v39AOY0B9G9S7jhDewSWmGbgVl6aEBJEs6K3c22L+J8Bnx3bdy?= =?us-ascii?q?KYhj1wmQspTNW26naNw7A/TB5PPk0qFiamqbr4Q3CvC+WaM12aOu1tYUAFoXaX?= =?us-ascii?q?fQX8fflfWrcj+5k7aU7ChE7EnMg9Yxc6GK6tKccHpgE5dRPbjPdTee3i+l32xB?= =?us-ascii?q?RaO3LOMbZDld38T3CXHWwA4lFVZ+WmAf0BqAjini2bBCnpoGE65Jwum+vZ44jv?= =?us-ascii?q?zGkQrySmOblZ9zPy09g8RgbqbUfxFmvoPsSIl7jF1B0qV3tTMCtPGqRAyUr9bZ?= =?us-ascii?q?IYU5F5BnVnStwl8IoDoe6lmj1hYaA93ukLyyz1vDYFRjcUhrHUr1Rd/b6WC3wU?= =?us-ascii?q?SJHujwZnsN+iPeSHJ9xe1ZvuNgjk2P/6c/boJ4/kj7VC/rEeuDEVwqh2PNvFN1?= =?us-ascii?q?H+N+pjBDAwTSI/8FEEt+Eojz1k7SiwtvsXM0nl9LaS/sjnDws8kQuw/xUT5F+o?= =?us-ascii?q?=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AyLOczKg/ULA0r6boyd7eV92jEnBQX7h23DAb?= =?us-ascii?q?v31ZSRFFG/FwyPrAoB1L73PJYWgqNU3IwerwRZVpQRvnhPtICPoqTMuftWjdyS?= =?us-ascii?q?qVxeRZg7cKrAeQYBEWmtQttpuIUpIOceEYbmIKzfoSgjPIaerIqePvmMvD5Ifj?= =?us-ascii?q?Jh9WPFtXgspbnmNE43OgYytLrX59dP0E/fSnl6h6jgvlXU5SQtWwB3EDUeSGjc?= =?us-ascii?q?bMjojabRkPAANiwBWSjBuzgYSKUCSw71M7aXdi0L0i+W/Kn0jS/aO4qcy2zRfa?= =?us-ascii?q?yiv684lWot380dFObfb8yPT9aw+czzpAVr4RHIFqjwpF5t1HL2xayeUkli1Qe/?= =?us-ascii?q?ibLUmhJl1d7yGdgDUImwxelEMKgWXo/0cL5/aJGQ7ScPAx/b6wNnDimhYdVZhH?= =?us-ascii?q?odJ29nPcvIBMSR7Bhi7579jNWwoCrDvDnVMy1eEUlHBRSo0YdftYqpEe5lpcFN?= =?us-ascii?q?MaEDv9851PKpgjMCjw3ocdTbqhVQGVgoCv+q3aYl0jWhOdBkQSsM2c1DZb2Hh/?= =?us-ascii?q?0ksD3cQa2nMN7og0RZVI7/nNdv0ArsABcuYGKaZmQOsRS8q+DWLABRrKLWKJOF?= =?us-ascii?q?ziUKUKIWjEpZL76Kg8oOuqZJsLxp0vn4mpaiIWiUciP0b1TcGe1pxC9R7ABG27?= =?us-ascii?q?QDT208lbo4N0v7XtLYCbehGrWRQriY+tsv8fCsrUV7K4MJdbBPLqNi/1FZ1I0x?= =?us-ascii?q?e7W55JNHEYWsFQuttTYSP8nisKEPyjigX/SoemGFPAK0dXZorPOApLYNGoHrQw?= =?us-ascii?q?0qmCYA6MvCTs?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0D9AACYahphlyIeaIFahAWBGgFkVzoxh?= =?us-ascii?q?EeJBIYgASSCJIMohXWUVQEDAQ0qAQ4FAQIEAQGEYQIXOgEEghUCHgYBBTMTAQI?= =?us-ascii?q?EFQEBBQEBAQIBAwMEARMBAQEBAQEBAQkbBl6FaA2CIhMMGYNwASEKZSMDFAcDA?= =?us-ascii?q?gQNARcBFAoDARMBEhqCVwGDBwUKQosgnAqBMYEBg00BAwMQD4REgWMNAhSBF4V?= =?us-ascii?q?wU0gBgm0Ig3ApEIFVRIEVggprboJLFwEBAQEBgTsBAVaCYYJkBINHDjobSlgBA?= =?us-ascii?q?VgOCxsEIzUdLRYvkUiWe5RCLQeDK4ExBguHZoEVjEWHe4NlgUiKG5ctIZUYWIh?= =?us-ascii?q?1gQsJgjWTLimFMIFNKoFMAR0MBzMaMFAUghQBATIJYA6NeAGCe4EegmSBdTuFT?= =?us-ascii?q?D8yAgEBNAIGAQoBAQMJgQgBAQUTCwGGAi2BPVsBAQ?= X-IPAS-Result: =?us-ascii?q?A0D9AACYahphlyIeaIFahAWBGgFkVzoxhEeJBIYgASSCJIM?= =?us-ascii?q?ohXWUVQEDAQ0qAQ4FAQIEAQGEYQIXOgEEghUCHgYBBTMTAQIEFQEBBQEBAQIBA?= =?us-ascii?q?wMEARMBAQEBAQEBAQkbBl6FaA2CIhMMGYNwASEKZSMDFAcDAgQNARcBFAoDARM?= =?us-ascii?q?BEhqCVwGDBwUKQosgnAqBMYEBg00BAwMQD4REgWMNAhSBF4VwU0gBgm0Ig3ApE?= =?us-ascii?q?IFVRIEVggprboJLFwEBAQEBgTsBAVaCYYJkBINHDjobSlgBAVgOCxsEIzUdLRY?= =?us-ascii?q?vkUiWe5RCLQeDK4ExBguHZoEVjEWHe4NlgUiKG5ctIZUYWIh1gQsJgjWTLimFM?= =?us-ascii?q?IFNKoFMAR0MBzMaMFAUghQBATIJYA6NeAGCe4EegmSBdTuFTD8yAgEBNAIGAQo?= =?us-ascii?q?BAQMJgQgBAQUTCwGGAi2BPVsBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="534693229" X-MGA-submission: =?us-ascii?q?MDFd/Io8fDo4ZQdJsTRe4UEN7HJNE9oAge3P2Q?= =?us-ascii?q?AF4JYpiwt8Jrt00zwuCIVKaltHQtLSHoFnE9ZpE77jFFTSEPECWLiNfL?= =?us-ascii?q?x+0urdK1rmZyj6kgyz4obuv9VPSbG9aVdmA3MTSLUhD7Re6lXqxpYB+y?= =?us-ascii?q?rDDx6vH0HLP0jBhJrGEu7PnQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 19 Oct 2021 10:23:10 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D11A9564807; Tue, 19 Oct 2021 10:23:09 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 19 Oct 2021 10:23:09 +0200 Message-ID: <877de9fmoi.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 19 10:23:10 2021 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.072968, queueID=290EB564808 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAxMiB0byAxOSwNCjIwMjEuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KVmVyaWZp Y2F0aW9uIGZvciBEdW1taWVzOiBTTVQgYW5kIEluZHVjdGlvbg0KT0NhbWwgQ2Fmw6k6IFdlZCwg T2N0IDEzIEAgMXBtIChVLlMuIENlbnRyYWwpDQpXaW5kb3dzLWZyaWVuZGx5IE9DYW1sIDQuMTIg ZGlzdHJpYnV0aW9uIDJuZCBwcmV2aWV3IHJlbGVhc2UgKDAuMi4wKQ0KUmVsZWFzZSBvZiBvY2Ft bC1zZi9sZWFybi1vY2FtbDowLjEzLjANCk9sZCBDV04NCg0KDQpWZXJpZmljYXRpb24gZm9yIER1 bW1pZXM6IFNNVCBhbmQgSW5kdWN0aW9uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3ZlcmlmaWNhdGlvbi1mb3ItZHVtbWllcy1z bXQtYW5kLWluZHVjdGlvbi84NjMxLzE+DQoNCg0KT0NhbWxQcm8gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBh cmUgcGxlYXNlZCB0byBzaGFyZSB3aXRoIHlvdSBbVmVyaWZpY2F0aW9uIGZvciBEdW1taWVzOiBT TVQgYW5kDQogIEluZHVjdGlvbl0sIGEgY29tcGxldGUgYW5kIGRldGFpbGVkIHNlcmllcyBvZiBi bG9ncG9zdHMgd3JpdHRlbiBieQ0KICBBZHJpZW4gQ2hhbXBpb24gYWJvdXQgSW5kdWN0aW9uIGFz IGEgZm9ybWFsIHZlcmlmaWNhdGlvbiB0ZWNobmlxdWUuDQoNCiAgVGhlIHN1YmplY3QgaXMgdHJl YXRlZCB3aXRoIG1hbnkgY29uY3JldGUgYW5kIGV4ZWN1dGFibGUgZXhhbXBsZXMuIEFsbA0KICBl eGFtcGxlcyBjYW4gYmUgKGFuZCBzaG91bGQgYmUpIGxhdW5jaGVkIGxvY2FsbHkgYnkgcmVhZGVy cyB0aGFua3MgdG8NCiAgc21hbGwgYW5kIGVhc3kgdG8gZmluZCB0b29scy4gTW9kaWZpY2F0aW9u IGFuZCBleHBlcmltZW50YXRpb24gYXJlDQogIHN0cm9uZ2x5IGVuY291cmFnZWQhDQoNCiAgVGFr ZSBhIGxvb2sgYXQgYWxsIHRoZSBub3Rpb25zIGNvdmVyZWQ6DQoNCiAg4oCiIGludHJvZHVjdGlv biB0byBmb3JtYWwgbG9naWNzIGFuZCBmb3JtYWwgZnJhbWV3b3JrczsNCiAg4oCiIFNNVC1zb2x2 aW5nOiBtb2Rlcm4sIGxvdy1sZXZlbCB2ZXJpZmljYXRpb24gYnVpbGRpbmcgYmxvY2tzOw0KICDi gKIgZGVjbGFyYXRpdmUgdHJhbnNpdGlvbiBzeXN0ZW1zOw0KICDigKIgdHJhbnNpdGlvbiBzeXN0 ZW0gdW5yb2xsaW5nOw0KICDigKIgQk1DIGFuZCBpbmR1Y3Rpb24gcHJvb2ZzIG92ZXIgdHJhbnNp dGlvbiBzeXN0ZW1zOw0KICDigKIgY2FuZGlkYXRlIHN0cmVuZ3RoZW5pbmcuDQoNCiAgV2UgaG9w ZSB5b3UgZW5qb3kgcmVhZGluZyBhbmQgd2UgbG9vayBmb3J3YXJkIHRvIHlvdXIgZmVlZGJhY2sh DQoNCg0KW1ZlcmlmaWNhdGlvbiBmb3IgRHVtbWllczogU01UIGFuZCBJbmR1Y3Rpb25dDQo8aHR0 cHM6Ly93d3cub2NhbWxwcm8uY29tLzIwMjEvMTAvMTQvdmVyaWZpY2F0aW9uLWZvci1kdW1taWVz LXNtdC1hbmQtaW5kdWN0aW9uLz4NCg0KDQpPQ2FtbCBDYWbDqTogV2VkLCBPY3QgMTMgQCAxcG0g KFUuUy4gQ2VudHJhbCkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY2FmZS13ZWQtb2N0LTEzLTFwbS11LXMtY2Vu dHJhbC84NjEwLzE0Pg0KDQoNCkNsYXVkZSBKYWdlci1SdWJpbnNvbiBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSB2aWRlbyBvZiBAZHJhMjcn cyB0YWxrIG9uIE9QQU0gaXMgbm93IGF2YWlsYWJsZToNCiAgPGh0dHBzOi8veW91dHUuYmUvUkhT ZGxINGVsMGc+LiBUaGFua3Mgc28gbXVjaCBmb3IgdGhlIGdyZWF0IHRhbGssDQogIERhdmlkISAg QW5kIHRoYW5rcyB0byBldmVyeWJvZHkgd2hvIGF0dGVuZGVkISAgKFRoZSB2aWRlbyBzdGFydHMg YQ0KICBjb3VwbGUgb2YgbWludXRlcyBpbnRvIHRoZSB0YWxrIGJlY2F1c2UgeW91cnMgdHJ1bHkg Zm9yZ290IHRvIHN0YXJ0DQogIHJlY29yZGluZy4gIEQnb2ghKQ0KDQogIFdlIGFscmVhZHkgaGF2 ZSBzb21lIGlkZWFzIGZvciB0aGUgbmV4dCBtZWV0aW5nIGJ1dCBpZiB0aGVyZSdzIGEgdG9waWMN CiAgdGhhdCB5b3UnZCBsaWtlIHRvIGhlYXIgYWJvdXQgb3IgYXJlIGludGVyZXN0ZWQgb24gcHJl c2VudGluZyBvbiwNCiAgcGxlYXNlIG1lc3NhZ2UgbWUuDQoNCg0KV2luZG93cy1mcmllbmRseSBP Q2FtbCA0LjEyIGRpc3RyaWJ1dGlvbiAybmQgcHJldmlldyByZWxlYXNlICgwLjIuMCkNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXdpbmRvd3MtZnJpZW5kbHktb2NhbWwtNC0xMi1kaXN0cmli dXRpb24tMm5kLXByZXZpZXctcmVsZWFzZS0wLTItMC84NDg4LzM+DQoNCg0KamJlY2tmb3JkIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgMC4yLjUgaXMgYXZhaWxhYmxlLiBUaGlzIHJlbGVhc2UgYnJpbmdzIHNp Z25pZmljYW50IHVzZXIgZnJpZW5kbHkNCiAgaW1wcm92ZW1lbnRzLg0KDQogIFRoZXJlIGlzIGEg bmV3IGJpbmFyeSBjYWxsZWQgYHdpdGgtZGttbC5leGUnLiBKdXN0IHBsb3AgYHdpdGgtZGttbCcg aW4NCiAgZnJvbnQgb2YgYSBXaW5kb3dzIGNvbW1hbmQgdGhhdCByZXF1aXJlcyBhY2Nlc3MgdG8g VW5peCBzY3JpcHRzDQogIChpZS4gYHdpdGgtZGttbCBvcGFtIGluc3RhbGwnKSBhbmQgaXQgc2hv dWxkIGp1c3Qgd29yay4NCg0KICBUaGVyZSBpcyBub3cgYSBzZWN0aW9uIGNhbGxlZCAqKkJleW9u ZCBCYXNpY3MqKiBpbiBbdGhlIERpc2t1diBPQ2FtbA0KICB1c2VyIGRvY3VtZW50YXRpb25dIHRo YXQgd2Fsa3MgdGhyb3VnaDoNCiAg4oCiIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHR1dG9yaWFscyBv ZiBbR2V0dGluZyBTdGFydGVkIC0gTGVhcm4gT0NhbWxdDQogIOKAoiB0aGUgYmFyZSBPcGFtIGVz c2VudGlhbHMgeW91IG5lZWQgYXMgYSBiZWdpbm5lciAoaG93IHRvIGZpbmQgYW5kDQogICAgc2Vs ZWN0IGFuIE9wYW0gc3dpdGNoLCBhbmQgaG93IHRvIGZpbmQgYW5kIGluc3RhbGwgcGFja2FnZXMg dXNpbmcNCiAgICBgd2l0aC1ka21sIG9wYW0gaW5zdGFsbCcpLCBhbGwgd2l0aG91dCBsZWF2aW5n IHRoZSBDb21tYW5kIFByb21wdA0KICDigKIgaW5zdGFsbGluZyBWaXN1YWwgU3R1ZGlvIENvZGUg d2l0aCB0aGUgT0NhbWwgcGx1Z2luDQoNCiAgSHVnZSB0aGFua3MgdG8gQEJ1dGFuaXVtIHdobyBs ZW50IG1lIG11Y2ggb2YgaGlzIHRpbWUgdG8gdmFsaWRhdGUNCiAgdXNhYmlsaXR5IGZyb20gdGhl IHBlcnNwZWN0aXZlIG9mIGEgbmV3Y29tZXIuIE1vcmUgZmVlZGJhY2sgaXMgYWx3YXlzDQogIHdl bGNvbWUuDQoNCiAgTGlua3M6DQogIOKAoiBbSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBmb3Ig dGhlIGxhdGVzdCB2ZXJzaW9uXQ0KICDigKIgW1JlbGVhc2Ugbm90ZXMgZm9yIGFsbCB2ZXJzaW9u c10NCg0KICBQUy4gWW91IHdvbid0IG5lZWQgYHdpdGgtZGttbCcgbW9zdCBvZiB0aGUgdGltZS4g VGhlIEJleW9uZCBCYXNpY3MNCiAgZG9jdW1lbnRhdGlvbiBzaG93cyBob3cgdG8gcnVuIER1bmUg YW5kIHRoZSBPQ2FtbCBuYXRpdmUgY29tcGlsZXINCiAgZGlyZWN0bHkgZnJvbSB0aGUgVmlzdWFs IFN0dWRpbyBDb21tYW5kIFByb21wdC4NCg0KDQpbdGhlIERpc2t1diBPQ2FtbCB1c2VyIGRvY3Vt ZW50YXRpb25dDQo8aHR0cHM6Ly9kaXNrdXYuZ2l0bGFiLmlvL2Rpc2t1di1vY2FtbC9pbmRleC5o dG1sPg0KDQpbR2V0dGluZyBTdGFydGVkIC0gTGVhcm4gT0NhbWxdIDxodHRwczovL29jYW1sLm9y Zy9sZWFybi90dXRvcmlhbHMvPg0KDQpbSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucyBmb3IgdGhl IGxhdGVzdCB2ZXJzaW9uXQ0KPGh0dHBzOi8vZGlza3V2LmdpdGxhYi5pby9kaXNrdXYtb2NhbWwv aW5kZXguaHRtbCN0d28tc3RlcC1pbnN0YWxsYXRpb24taW5zdHJ1Y3Rpb25zPg0KDQpbUmVsZWFz ZSBub3RlcyBmb3IgYWxsIHZlcnNpb25zXQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYvZGlz a3V2LW9jYW1sLy0vcmVsZWFzZXM+DQoNCg0KUmVsZWFzZSBvZiBvY2FtbC1zZi9sZWFybi1vY2Ft bDowLjEzLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXJlbGVhc2Utb2Ytb2NhbWwtc2YtbGVhcm4tb2NhbWwtMC0xMy0wLzg1NzcvNj4NCg0KDQpF cmlrIE1hcnRpbi1Eb3JlbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEp1c3QgRllJLCBhIGJ1Z2ZpeCByZWxlYXNlIGxlYXJuLW9jYW1sIGAwLjEzLjEnIGhhcyBqdXN0 IGJlZW4gdGFnZ2VkDQogIGFuZDoNCg0KICDigKIgW3JlbGVhc2VkIGluIEdpdEh1Yl0g4oaQIHNl ZSB0aGUgUmVsZWFzZSBOb3RlcyBhbmQgYmluYXJpZXMtYXNzZXRzDQogIOKAoiBbcHVzaGVkIHRv IERvY2tlciBIdWJdIOKGkCBgb2NhbWxzZi9sZWFybi1vY2FtbCcgYmVpbmcgdGhlIG9mZmljaWFs DQogICAgZGlzdHJpYnV0aW9uIG9mIExlYXJuLU9DYW1sDQogIOKAoiBbc3VibWl0dGVkIHRvIE9Q QU0gZGVmYXVsdCByZXBvc2l0b3J5XQ0KDQoNCltyZWxlYXNlZCBpbiBHaXRIdWJdDQo8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9jYW1sL3JlbGVhc2VzL3RhZy92MC4xMy4xPg0K DQpbcHVzaGVkIHRvIERvY2tlciBIdWJdDQo8aHR0cHM6Ly9odWIuZG9ja2VyLmNvbS9yL29jYW1s c2YvbGVhcm4tb2NhbWwvdGFncz4NCg0KW3N1Ym1pdHRlZCB0byBPUEFNIGRlZmF1bHQgcmVwb3Np dG9yeV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMTk3 ODc+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBl biB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFp bA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhl IFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8g cmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxp bmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0g PGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltB bGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 12 to 19, 202= 1.

Verification for Dummies: SMT and Induction

OCamlPro announced

We are pleased to share with you Verification for Dummies:= SMT and Induction, a complete and detailed series of blogposts written by Adrien Champion about Induction as a formal = verification technique.

The subject is treated with many concrete and executable examples. All exam= ples can be (and should be) launched locally by readers thanks to small and easy to find tools. Modification and= experimentation are strongly encouraged!

Take a look at all the notions covered:

  • introduction to formal logics and formal frameworks;
  • SMT-solving: modern, low-level verification building blocks;
  • declarative transition systems;
  • transition system unrolling;
  • BMC and induction proofs over transition systems;
  • candidate strengthening.

We hope you enjoy reading and we look forward to your feedback!

OCaml Caf=C3=A9: Wed, Oct 13 @ 1pm (U.S. Central)

Claude Jager-Rubinson announced

The video of @dra27's talk on OPAM is now available: https://youtu.be/RHSdlH4el0g. Thanks so much for the= great talk, David! And thanks to everybody who attended! (The video starts a couple o= f minutes into the talk because yours truly forgot to start recording. D'oh!)

We already have some ideas for the next meeting but if there's a topic that= you'd like to hear about or are interested on presenting on, please message me.

Windows-friendly OCaml 4.12 distribution 2nd preview release (= 0.2.0)

jbeckford announced

0.2.5 is available. This release brings significant user friendly improveme= nts.

There is a new binary called with-dkml.exe. Just plop wi= th-dkml in front of a Windows command that requires access to Unix scripts (ie. with-dkml opam install) and it sho= uld just work.

There is now a section called Beyond Basics in the Diskuv OCaml user documentation that walks through:

  • the first and second tutorials of Getting Started - Learn OCaml
  • the bare Opam essentials you need as a beginner (how to find and select= an Opam switch, and how to find and install packages using with-dkml= opam install), all without leaving the Command Prompt
  • installing Visual Studio Code with the OCaml plugin

Huge thanks to @Butanium who lent me much of his time to validate usability= from the perspective of a newcomer. More feedback is always welcome.

Links:

PS. You won't need with-dkml most of the time. The Beyond Basi= cs documentation shows how to run Dune and the OCaml native compiler directly from the Visual Studio Command Prompt.

Release of ocaml-sf/learn-ocaml:0.13.0

Erik Martin-Dorel announced

Just FYI, a bugfix release learn-ocaml 0.13.1 has just been ta= gged and:

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id AF4B9E0072 for ; Tue, 2 Nov 2021 09:50:38 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=35Um=PV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3A1kw6ahdUtUgXe6T/WSKAqco+lGM+q9jLVj580XL?= =?us-ascii?q?Ho4xHfqnrxZn+JkuXvawr0AWRG9SCoK8bw8Pt8InYEVQa5piAtH1QOLdtbDQiz?= =?us-ascii?q?fssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBBr/KRB?= =?us-ascii?q?1JuPoEYLOksi7ze+/94PPbwlSgDexfLx+IRW0oA7MqsQYnIxuJ7orxBDUuHVIY?= =?us-ascii?q?eNWxW1pJVKXgRnx49q78YBg/SpNpf8v7tZMXqrmcas2S7xYFykmPHsu5ML3rxn?= =?us-ascii?q?DTBCA6WUaX24LjxdHGQnF7BX9Xpfsriv3s/d21SeGMcHqS70/RDSu4aRtSB/2i?= =?us-ascii?q?ScHLD85/3rTisNukalarhWhpwZizI7PfYqZMPRzcr/Ycd4cWGFPXNteVzZZD42?= =?us-ascii?q?8cYUBEuQPM+VXoIbhvFYBtweyCBO2Ce/z1jNFhHn71rA63eQ7FgHG2RQtEs4Ks?= =?us-ascii?q?HvOqtX+KbocXvy1zKnNzDXDc+9W0ir65YfSdhAuu/eMUahrccXNyUkvEgLFjkm?= =?us-ascii?q?MqYH+JzOV0eANsmiH7+V+Se2vi2gnqwBoojiy2MggkI7Jhpgayl3d8yhy3Yk6K?= =?us-ascii?q?8GiRkFhfd6kDIVftzucN4ZuQs0sTW9mtTokxrAGpZO2fCgExIg7yhPdaPGKc4i?= =?us-ascii?q?G7wztWeqMPDp1hHJodayxihiy80WtzuPyW8uo3FpXqidInd/BvW0D2RzU78iIU?= =?us-ascii?q?Pp9/kG51DaXyQ/T9uBEIVwqmqrDLJ4hx7swmYQJvUTFACD2hF36jKiKeUo+/+i?= =?us-ascii?q?o7/7rYrL8pp+TL4N0iwf+Mr4vmsOlG+g4PBIOU3Cb+OS7yb3j4VD5TK9RgfIoi?= =?us-ascii?q?qXYvpfaJcAVpq6jGQBV15wv5Aq4DzejyNgYgGIHLEhLeBKGi4jmJUrOLOrkAve?= =?us-ascii?q?4hlSgiDhrx/HaPr3hH5XCNWLPn6vmfbZ480JczxIzws5Z55JPFr4OOu/8VlX2t?= =?us-ascii?q?NzCAR81Kw60zPzhCNpjzYMeRXiPDbGHP6POq1OH+uUvI+yUaI8SpDnyMf0l5/r?= =?us-ascii?q?2jX8jnl8RZ7Wm3ZwSaHygAvRpOV+ZYXvxjdgfCmcGpBYxTOvviFGaUD5cenazX?= =?us-ascii?q?6Y45j0hD4KmF4jDS4awi7KCxCe2BoBaan5CB1yWDHvka4qJV+0CZS6OOMNsnDM?= =?us-ascii?q?JWaC8R4IvyB2irhH2xrpoI+bO5yEUqYjv2MV36uHPkxw56CZ6AN6H026XSmF5h?= =?us-ascii?q?mMISCEy3KB4uUF9z1iC3bVij/xAEtxT4/NIUhskOpHAz+x6DdHyWhvcftiXUlq?= =?us-ascii?q?mRc+mAT4pQtIwxd8BfVp9Fs2/ghzd2yemGaIZm6CECZAu/K/Qw2L9Kshyxnre0?= =?us-ascii?q?akulVgmQs9BNW28ga5/8hDeCZPVnUuEi6qnbaoR0S7D+2eG1WeApk5XXRZoUaX?= =?us-ascii?q?CWXAeZlfWosrl6UPCSb+uCK0nMhZfxsKYLatKcNLpgE1cS/fnItveZXi9m3ysC?= =?us-ascii?q?haIw7OMbZbqe3kG0SrGD0gEjgYT8mqYOgglHCuhpm3TDTN0GVLoeUPs/vFyqGm?= =?us-ascii?q?nQU8s0wGKc0ph2qKp9REPgPycT+of3rYFuCc6tzV5B0293tLTC9qYvQVtZqRcY?= =?us-ascii?q?dUn4FdGz23VrQJ9PobzZ5xl0xQabAI99xfqyBNfDppG184nsCVuhEB5NqTSmBs?= =?us-ascii?q?VfCye9ZTxIaHMbGj+7RSrLanM1QeamN2f/6NK7PUjt33iuhuoHwws6SZJyd5Qh?= =?us-ascii?q?lKY75OCNwESVJPtTg5j/hxzoffBaSk45p/I/WVrNbiovzTC3dMwGeZjzQyvKYQ?= =?us-ascii?q?MeJiYHRP/RpVJT/OlL/YnzgPxBvrhFPhV8L8oMsimcfqfxaPtO/xvzmvOZYVv5?= =?us-ascii?q?ZAklFqL8ztgR+XI2Zcc3vze2RGIBW6UZLiJuMfqn4tJfncXQnr5zjLrVtc5Ww?= =?us-ascii?q?=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A6mKBda9hcPC8v8xfu6luk+ALI+orL9Y04lQ7?= =?us-ascii?q?vn2ZKCYlCPBw8vrEoB1173HJYVoqNU3I2urwXZVoOEm8yXct2+ks1NSZLWvbUQ?= =?us-ascii?q?mTXflfBOLZqlWLJ8SZzJ8l6U4KScdD4bPLYWSSwvyKhDVRsr0bsaK6GQ2T9IDj?= =?us-ascii?q?5mYoZztDL4tn6x59Cg6dGEEzfg9bHpA0faDshfav4wDQH0gqUg=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DmAAASaxphlyIeaIFahAWBGgFkVzoxh?= =?us-ascii?q?EeJBIZFgiSDKIV1hleMC4FzAQMBDSoBDgUBAgQBAYRhAoJrAh4GAQUzEwECBBU?= =?us-ascii?q?BAQUBAQECAQMDBAETAQEBAQEBAQEJGwZehWgNgjUMGYNtAwEhCkABAiIjAxQHA?= =?us-ascii?q?wIRARcBFAoXARIUBgGCVgGDBwUKi2KcCoExgQGDTQEDAgELBQ8vhBWBYw0CFIE?= =?us-ascii?q?XhXBTSIJuCINwAicQgVVEgRWCdW6CQAsMCwEBAQEBgRQLCQERAgEIIS2CYYJkB?= =?us-ascii?q?IMhAiQOPi4tPCIBAVAIAQI1PRsECA8uARYvA5FBAQMollOTV2stB4MrgTEGC4d?= =?us-ascii?q?mgRWMRYd7g2WBSJBfkGkhlXCIdYELCYI1h3GLUhQEBIUogU0qgQ0/HgwHMxowQ?= =?us-ascii?q?4I1AQEyCWAOjXgBMxaCMoEegT6DGzuFS0AyAgEBNAIGAQoBAQMJgQgBAQUTCwG?= =?us-ascii?q?GACyBQFsBAQ?= X-IPAS-Result: =?us-ascii?q?A0DmAAASaxphlyIeaIFahAWBGgFkVzoxhEeJBIZFgiSDKIV?= =?us-ascii?q?1hleMC4FzAQMBDSoBDgUBAgQBAYRhAoJrAh4GAQUzEwECBBUBAQUBAQECAQMDB?= =?us-ascii?q?AETAQEBAQEBAQEJGwZehWgNgjUMGYNtAwEhCkABAiIjAxQHAwIRARcBFAoXARI?= =?us-ascii?q?UBgGCVgGDBwUKi2KcCoExgQGDTQEDAgELBQ8vhBWBYw0CFIEXhXBTSIJuCINwA?= =?us-ascii?q?icQgVVEgRWCdW6CQAsMCwEBAQEBgRQLCQERAgEIIS2CYYJkBIMhAiQOPi4tPCI?= =?us-ascii?q?BAVAIAQI1PRsECA8uARYvA5FBAQMollOTV2stB4MrgTEGC4dmgRWMRYd7g2WBS?= =?us-ascii?q?JBfkGkhlXCIdYELCYI1h3GLUhQEBIUogU0qgQ0/HgwHMxowQ4I1AQEyCWAOjXg?= =?us-ascii?q?BMxaCMoEegT6DGzuFS0AyAgEBNAIGAQoBAQMJgQgBAQUTCwGGACyBQFsBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="397984850" X-MGA-submission: =?us-ascii?q?MDFJF2g/Xxz+zRcD5OxZy9B31XLAAUQfZhGUZw?= =?us-ascii?q?EFK/2JgiMkPNBxaZyy8MYfPF1JPE9Iaixemlz8qvm5nSRXATLOH5EsT0?= =?us-ascii?q?kO4cJqK/8PZ6gXWprgLgxdEv3W6Yhpgca15Tz8ixp5GHZjqxF6eUU+A3?= =?us-ascii?q?fZUg52u+1qKLBMoav1WUzekA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 02 Nov 2021 09:50:37 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7D03B5647C2; Tue, 2 Nov 2021 09:50:35 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 02 Nov 2021 09:50:21 +0100 Message-ID: <87sfwfaqlu.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 2 09:50:36 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.300195, queueID=050435647C5 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 26 to November 02, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Lists.ocaml.org: service temporarily sunsetted Talk at Func Prog Sweden First OPAM releases of Scad_ml and [@@deriving scad] Other OCaml News Old CWN Lists.ocaml.org: service temporarily sunsetted =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 *This note does not concern the main OCaml email list, which continues to be available through * The lists.ocaml.org e-mail service has been going through a rough time in the past few years, with vast swathes of spam regularly hitting our ingress email server and require manual unblocking every time. It was set up [back in 2012] as an augmentation of the main OCaml mailing list and really helped with some big projects in the early days (the design of and migration to ppx from camlp4, for example). However, in the intervening years e-mail has reduced in importance as a primary community communication mechanism (as evidenced, for example, in this forum). With the latest spam surge, I've moved the service into read-only mode with all the mailboxes and archives still available on the website, but with mail delivery and list creation/admin disabled. All existing links should continue to work to historical links online without change. The only mailing list on there that was still active to my knowledge is the opam-commits cron list, which will be replaced by an ocurrent-based deployer for that website shortly. I hope to bring e-mail back to ocaml.org sometime in 2022, as it's an important communications medium that is highly accessible. One challenge is spam, and another is the inflexibility of GNU Mailman and its upgrade mechanism (essentially a manual process from 2 to 3). Therefore, if there is anyone in the community interested in building a simple e-mail list manager in OCaml, that would be of interest :slight_smile: [back in 2012] Talk at Func Prog Sweden =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Leonardo Laguna Ruiz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here's a link for the talk I gave at the Func Prog Sweden meetup. In that talk I show the process we follow some years ago in order to move all our code base to OCaml and why it was an excellent decision. [Wolfram System Modeler] is a simulation environment that can be used to model multi-domain systems. For example systems composed of electrical, thermal, hydraulic, mechanical, etc, components. One of the main parts of System Modeler is the model compiler (Kernel) which takes models written in the Modelica language and compiles them into efficient simulation executables. This compiler was ported to OCaml by using custom tool that performed the code to code translation of our old code base. Slides [Wolfram System Modeler] First OPAM releases of Scad_ml and [@@deriving scad] =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: geoffder announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 I'd like to announce the first release onto opam of [Scad_ml] and [ppx_deriving_scad]. The former being a DSL front-end to the [OpenSCAD] solid modelling language, and the latter providing transformation function generation for custom types (a pattern that I have found useful during my time using `Scad_ml'. When I decided I wanted to pick up OpenScad, I was pleasantly surprised to discover that the `Scad_ml' library already existed on GitHub, credits to . Over time I filled out the rest of the OpenSCAD language coverage, as well as some additional helpful math, and reorganized things to try and keep it from getting too messy as more and more was tacked on. Finally, after some help in the ocaml discord (from NULL and octachron), we also now can track whether shapes are 2D or 3D with minimal changes to the user interface, preventing misapplications of operations that would otherwise only appear in the OpenSCAD console. The `[@@deriving scad]' ppx is my solution to make a habit I developed to get around the otherwise fully declarative nature of working in OpenSCAD more ergonomic. Shapes in OpenSCAD cannot be queried in any way, so upon creation, the locations of it's vertices or it's origin are not available. Of course, since you created it, you know exactly it's dimensions, and where you have moved it, but what if you want to use the location of one of it's vertices, wherever that ends up after a series of transformations? What I did for some time before learning how to write a ppx, was put the coordinates I cared about into a record with the shape, and mapped over the type (by hand (and regex)) with the relevant functions (typically transform and rotate). Turns out writing a ppx with `Ppxlib' and `metaquot' isn't so bad, and I really wish I did it sooner! Anyway, to the few of you out there that might use OpenSCAD, I hope that these tools might come in handy! [Scad_ml] [ppx_deriving_scad] [OpenSCAD] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Hiring a Developer Educator] =E2=80=A2 [Verification for Dummies: SMT and Induction] =E2=80=A2 [SCoP Passed Phase 1 of the DAPSI Initiative!] [OCaml Planet] [Hiring a Developer Educator] [Verification for Dummies: SMT and Induction] [SCoP Passed Phase 1 of the DAPSI Initiative!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of October 26 to November 02, 2021.

Lists.ocaml.org: service temporarily sunsetted

Anil Madhavapeddy announced

This note does not concern the main OCaml email list, which continues to be available through https://sympa.inria.fr/sympa/arc/caml-list/

The lists.ocaml.org e-mail service has been going through a rough time in the past few years, with vast swathes of spam regularly hitting our ingress email server and require manual unblocking every time. It was set up back in 2012 as an augmentation of the main OCaml mailing list and really helped with some big projects in the early days (the design of and migration to ppx from camlp4, for example). However, in the intervening years e-mail has reduced in importance as a primary community communication mechanism (as evidenced, for example, in this forum).

With the latest spam surge, I've moved the service into read-only mode with all the mailboxes and archives still available on the website, but with mail delivery and list creation/admin disabled. All existing links should continue to work to historical links online without change. The only mailing list on there that was still active to my knowledge is the opam-commits cron list, which will be replaced by an ocurrent-based deployer for that website shortly.

I hope to bring e-mail back to ocaml.org sometime in 2022, as it's an important communications medium that is highly accessible. One challenge is spam, and another is the inflexibility of GNU Mailman and its upgrade mechanism (essentially a manual process from 2 to 3). Therefore, if there is anyone in the community interested in building a simple e-mail list manager in OCaml, that would be of interest :slight_smile:

Talk at Func Prog Sweden

Leonardo Laguna Ruiz announced

Here's a link for the talk I gave at the Func Prog Sweden meetup. In that talk I show the process we follow some years ago in order to move all our code base to OCaml and why it was an excellent decision.

https://youtu.be/FGXiAARXE2M

Wolfram System Modeler is a simulation environment that can be used to model multi-domain systems. For example systems composed of electrical, thermal, hydraulic, mechanical, etc, components.

One of the main parts of System Modeler is the model compiler (Kernel) which takes models written in the Modelica language and compiles them into efficient simulation executables. This compiler was ported to OCaml by using custom tool that performed the code to code translation of our old code base.

Slides https://a2076202-c90b-450e-901b-cb56c346913c.usrfiles.com/ugd/a20762_adfa899586c7413a8c17f7b708dbc177.pdf

First OPAM releases of Scad_ml and [@@deriving scad]

geoffder announced

I'd like to announce the first release onto opam of Scad_ml and ppx_deriving_scad. The former being a DSL front-end to the OpenSCAD solid modelling language, and the latter providing transformation function generation for custom types (a pattern that I have found useful during my time using Scad_ml.

When I decided I wanted to pick up OpenScad, I was pleasantly surprised to discover that the Scad_ml library already existed on GitHub, credits to https://github.com/namachan10777. Over time I filled out the rest of the OpenSCAD language coverage, as well as some additional helpful math, and reorganized things to try and keep it from getting too messy as more and more was tacked on. Finally, after some help in the ocaml discord (from NULL and octachron), we also now can track whether shapes are 2D or 3D with minimal changes to the user interface, preventing misapplications of operations that would otherwise only appear in the OpenSCAD console.

The [@@deriving scad] ppx is my solution to make a habit I developed to get around the otherwise fully declarative nature of working in OpenSCAD more ergonomic. Shapes in OpenSCAD cannot be queried in any way, so upon creation, the locations of it's vertices or it's origin are not available. Of course, since you created it, you know exactly it's dimensions, and where you have moved it, but what if you want to use the location of one of it's vertices, wherever that ends up after a series of transformations? What I did for some time before learning how to write a ppx, was put the coordinates I cared about into a record with the shape, and mapped over the type (by hand (and regex)) with the relevant functions (typically transform and rotate). Turns out writing a ppx with Ppxlib and metaquot isn't so bad, and I really wish I did it sooner!

Anyway, to the few of you out there that might use OpenSCAD, I hope that these tools might come in handy!

Other OCaml News

From the ocamlcore planet blog

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 32661E03AE for ; Tue, 9 Nov 2021 11:08:44 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=edY8=P4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3ALxTrTRVaBF943l8UL0ZXn+u6jLTV8KxyUDF92vM?= =?us-ascii?q?cY1JmTK2v8tzYMVDF4r011RmVB9ydsq4P07Ce8/i5HzBaudDZ6DFKWacPfidNs?= =?us-ascii?q?d8RkQ0kDZzNImzAB9muURYHGt9fXkRu5XCxPBsdMs//Y1rPvi/6tmZKSV3wOgV?= =?us-ascii?q?vO+v6BJPZgdip2OCu4Z3TZBhDiCagbb9oIxi6sxjdutMLjYZtJao91gXFqWZMd?= =?us-ascii?q?+hK2G9kP12ekwjg6suq4JJv7yFcsO89+sBdVqn3Y742RqFCAjQ8NGA16szrtR3?= =?us-ascii?q?dQgaK+3ARTGYYnAdWDgbc9B31UYv/vSX8tupmxSmVJtb2QqwuWTSj9KhkVhnlg?= =?us-ascii?q?zoaOjEj8WHXjstwjL9HoB+kuhdyzZLYbJ2TOfFjfq/TftUaRXRAXsZKVixOGYe?= =?us-ascii?q?8YJUSBOsPOuZYtZTyp0ATphe6CwSgGObjxzlVjXH0wKI6yfwsHwHY0gI9EdwAs?= =?us-ascii?q?3vbo8nuOagITey41rPFwSnfY/5U3zr29YjGcgomofGJRb99bc7RxlMpFwjYk1u?= =?us-ascii?q?ftYzlPzaU1uQRr2iQ8u1tWviri2E9rQF9uCOvydssionMh4IV1kzE+D5hwIYyI?= =?us-ascii?q?d25SFJ7bsC4H5tQsSGaNpJ2Qt48TG1yvyY60LIGtIe9cSMXx5sp2wTRZOabc4i?= =?us-ascii?q?U/B3jTuCRLC93inxler+zmgu+/VWhx+DhVcS50FZEoypbn9XQqHwD2QLe59aFR?= =?us-ascii?q?/dj4Eqs1zaB2Q/d5O9EIk04iLTXJZ49z7MtkJcYrErNHijzmErsja+WcF0p+vC?= =?us-ascii?q?25OT7Y7XmuoGTN5dzigH7N6QhhNazAeImPQgSR2Sb/viz26fm/U39WrlKiec2k?= =?us-ascii?q?qbBvJDCP8Qbp6i5AxNL3YY58Rq/EzCm3MwXnXkGMFJFeA+HgJPzN17SJ/D4CO+?= =?us-ascii?q?zg1a2nzdt2f/GJaHhAo/TIXfdjLftZ6py60lZyAYr1tBf5p1UCrcbL/L3QU/+r?= =?us-ascii?q?trYAQIlMwy02eboFs9y2Z4FWW6VHqCZN6bSvUeN5u0xPeaMeJIVuC7nJ/c54P7?= =?us-ascii?q?uiGc1mV4Hfamo2ZsXbGq0HvN8I0WWeXbshc8BHnkMvgolUOzqkkONXiBPZ3a3R?= =?us-ascii?q?a08/is3CIW8DYfMXoysgaGB3CO6Hp1Oem9GCkqDEWvye4qYXPcMbTqeIsF7kjM?= =?us-ascii?q?eULiuUYAh1RCytAPgzLpnNOXU9jUctZLiz9d6+ffTmgso+TNoD8SSyX2NQ3lxn?= =?us-ascii?q?mwSWz82xqF/oENnxlef1qh0m+RYFcdX5/9TTAg6KIbQwPJ8C9DpQA7BcM2JRE6?= =?us-ascii?q?7Qtm/GTE+VMgxw94VY0pnFdWilAjP3yuwA78UmbyHHpI08rjE03j3IMZ9zmzJ2?= =?us-ascii?q?7Qgj1Y6W8dPMXepibVk9wTJG4HJlECZm763daQa3S7N6nmMzXCVvEFZTA5/T7z?= =?us-ascii?q?JXWgFaUvMrNT5/VrOT6S0Brs7NgtO086DJrFEat3zlVlJWPHjOM7FY26rlWewH?= =?us-ascii?q?w6ExrSQY4XwfmUd2D3dCFIDkwwJ4XmGMg0+Cj+6o2LZFjxhDlXvY0Xq8eZgsX+?= =?us-ascii?q?7U0k0zwCUb0J/zbq14R8VheCCRP8J0LIEoj8tqzF1HFal3t/aEdSApxB5cKVdf?= =?us-ascii?q?Nw84FNH1WbDuwx6JJygIKZvjUMdfQRvp07iygt7B4FancQ3sH8nwxB+JKyE3F9?= =?us-ascii?q?beT6V0oj8NqDZJ2Xv5hyjda7b117E3NqI+qoD9u40plrjsQyvC0Es6W9o08NP3?= =?us-ascii?q?HuZ/pjKDBQdUZb2Uksv8hh7qKzWbjMl54PT0X1tMbW0vSHe1NIpAuslyw+gf8p?= =?us-ascii?q?BP6+eEw/yCcIaC9CvKOwshVepcgoJMP1M+KMwJc+qaueK1aGxMOtugD6ql2pK7?= =?us-ascii?q?Y9l3kKJ7SV8S+rI35gfw/Gf2wuKTyrygku8vMzrgY1LeywdEWi8xCX8HoBcabV?= =?us-ascii?q?/fZ4MCWeqI8y32stxiILtW35e9V6jHk4G19GzdRqVdVz90hVd2l4ToXO9nyu01?= =?us-ascii?q?Sd0nC0prqqa3SzO3/jieQEcNW5MWWlii0vjLpavj9wAWUilYAcomAGi5UbgyKh?= =?us-ascii?q?XvL5/IHXLQUdUYyj2KHlvXbequbqHZ85D8ZcosSRMUOSgel2aUb78ox4C0yz5B?= =?us-ascii?q?WdexTY7dyuruprjhRB6hnidfz5Pqy+Tfd52j1+L4MPabfpO2HwASTUuzXGdDUe?= =?us-ascii?q?6dZHhqd6Lkb/Hs/uiTCSgWoxXdW/s14zW8GOw7GhuRBm+hOybm9v9EAF83zWo+?= =?us-ascii?q?cNtUHDhqB/6KrLg16G7Lf4vKkBsDVm68MF6H4BijqMog5UBxXURhpOU5GcK12D?= =?us-ascii?q?pPoMIiurFcHMRSGtTkJbu6w//1Rg4dhphKKrzUWibycZ6IdzmciURwC1vtqii7?= =?us-ascii?q?Y+M67hVgSZ+oly5tB/cJ/9nkWVEoRPPwHsK2qcRvw480iiWArYTBFRVeyv2mEb?= =?us-ascii?q?Rh+0=3D?= IronPort-Data: =?us-ascii?q?A9a23=3AI0JGm6jNPDnSOPvaSeU/KPixX161fxEKZh0ujC4?= =?us-ascii?q?5NGQNrF6WrkUGn2EaXD/TP/3cNGT2Kt9xO4ri8R9T65SDyoQ1SgNuqFhgHilAw?= =?us-ascii?q?SbnLYTAfx2oZ0t+DeWaERk5t51GAjX4wXFdokb0/n9BCZC86ykjvU20buCkUre?= =?us-ascii?q?dY3ggHVYMpBoJ0HqPpcZp2uaEvvDiW2thifuqyyHuEAfNNwxcagr42IrfwP9bh?= =?us-ascii?q?8kejRtD1rAIiV+ni3eF/5UdJMp3yahctBIUSKEMdgKxb76rIL1UYgrkExkR5tO?= =?us-ascii?q?Nyt4Xc2UPUueUJQ+Km2ZbUKikgwFfq2o1yKlT2Pg0MB0GzWzRw5YqkJMW6fRcS?= =?us-ascii?q?i9xVkHIsN8naEENHi1Pbfh+pOrfJnyurcGYz0vHambhhfJ0AxQ/OYQevP18AWR?= =?us-ascii?q?P6eAwIjcQaBuOnKSznKL9TfNj7igmBJO0Y9lH5CgIITbxV698HsCSGc0m/+Rw1?= =?us-ascii?q?z41goVKHO3CT9EIbCJmKhXGeRxGfFkNYK/SNs+83iylNWBM8QfN4/IjuT2Lilc?= =?us-ascii?q?rieb5a4+NPIGeGpB8gGC0pkbn9kLtW0lPbJjH3VJp6VqplraJhST/SZ4fH72+9?= =?us-ascii?q?+d3jRuU3GN7NfHfbnPjydHRt6J0c4s3x40oFisSQWwa8VzyCMH6WwykrXWEuB8?= =?us-ascii?q?FRtcWFPc1gO1I4rSB+B6XXwDoURYYAOHKdudvLdDp6rNNt9nuGDpkvabTTC6Ns?= =?us-ascii?q?LCOolte/AAONWFYI3dsoRQturHeTUJasv4LZs5kFL+pg9b1HzDp3j3MqzIx71n?= =?us-ascii?q?WpdUT2f/9pTgrnBr1zqX0osUJCsk7k45rAs6VpGJoWmBw1WXm0A=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AX41St6/VTG+F15sUpB9uk+AyI+orL9Y04lQ7?= =?us-ascii?q?vn2ZHyYlC/Bw8Pre/8jztCWVtN9/YhodcLy7UpVoa0mskqKdg7N/AV7SZmjbUQ?= =?us-ascii?q?KTRelfBO3ZrgEIcBeRygcy78tdmoFFeaXNJGk/o8bmxQGyV/493diA68mT9IHj?= =?us-ascii?q?5kYoYwF2Tqlqqz5jDAWWGFAefnglObMJULSd++9OrH6YYnIVYs6nQlkJNtKzwu?= =?us-ascii?q?HjpdbJYQMiDxVi0RKJjj+j9frCGwWYty1uNw9y/Q=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0A+AgAqSIphfSIeaIE+EgqEA1pBAWRXO?= =?us-ascii?q?jGER45vgiWBFoIVhhKUGwFREAEDAQ0qAQ4FAQIEAQGFG4I/Ah4GAQUzEwECBBU?= =?us-ascii?q?BAQUBAQECAQMDBAETAQEPGQhehTsIJQ2CNQwZg3ABDBUEBjgtIwMUAQYDAgQNA?= =?us-ascii?q?RcBFAoXARIUBoJYgwcFCkSPE5wMfzKBAYNOAYRGgWMNAhSBABeGBVRKAYJ/CYN?= =?us-ascii?q?7AicQgVVEgRWCKUoHboIESBcBAQEBAReBGQsBAYM4F4JOBI5aDgszEVMmBQEHD?= =?us-ascii?q?AgPASAPIQg4AQo/BQkdCiMWAi0DkWUlApclk2VxMweDO4EzBguHdYEVjFqICIN?= =?us-ascii?q?sgUmFD4UZhkqRASGVbx+JBoEMCQaCNIkQinaFMoFOKoFMAR0MBzMaMEMNAYInA?= =?us-ascii?q?TMJClcPjC6BexmBBAEJgh4kgQE9gxs7gkGDCkAzAgEBNAIGAQoBAQMJhWMBAQU?= =?us-ascii?q?TCwGKbAEB?= X-IPAS-Result: =?us-ascii?q?A0A+AgAqSIphfSIeaIE+EgqEA1pBAWRXOjGER45vgiWBFoI?= =?us-ascii?q?VhhKUGwFREAEDAQ0qAQ4FAQIEAQGFG4I/Ah4GAQUzEwECBBUBAQUBAQECAQMDB?= =?us-ascii?q?AETAQEPGQhehTsIJQ2CNQwZg3ABDBUEBjgtIwMUAQYDAgQNARcBFAoXARIUBoJ?= =?us-ascii?q?YgwcFCkSPE5wMfzKBAYNOAYRGgWMNAhSBABeGBVRKAYJ/CYN7AicQgVVEgRWCK?= =?us-ascii?q?UoHboIESBcBAQEBAReBGQsBAYM4F4JOBI5aDgszEVMmBQEHDAgPASAPIQg4AQo?= =?us-ascii?q?/BQkdCiMWAi0DkWUlApclk2VxMweDO4EzBguHdYEVjFqICINsgUmFD4UZhkqRA?= =?us-ascii?q?SGVbx+JBoEMCQaCNIkQinaFMoFOKoFMAR0MBzMaMEMNAYInATMJClcPjC6Bexm?= =?us-ascii?q?BBAEJgh4kgQE9gxs7gkGDCkAzAgEBNAIGAQoBAQMJhWMBAQUTCwGKbAEB?= X-IronPort-AV: E=Sophos;i="5.87,219,1631570400"; d="scan'208,217";a="2772061" X-MGA-submission: =?us-ascii?q?MDGMfnwt4J+Psi5cG+2WH0N/UqfHNUTNbwFxCz?= =?us-ascii?q?eAn05BunrfC7gjQSH+3spVvgBy3v3Nqgl/vsu3fhdR6HSj+CQzzfsdWs?= =?us-ascii?q?47aBg8VN3+yRfJTMNlTSXPJaQI42GcYfCdeSzLnaUFA14oOrGH0nxWee?= =?us-ascii?q?o3hs69pFYA5ZvYOIeSBxNP9Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 09 Nov 2021 11:08:43 +0100 Received: from set (unknown [131.254.252.45]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 541A0564F02; Tue, 9 Nov 2021 11:08:42 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 09 Nov 2021 11:08:24 +0100 Message-ID: <871r3ppron.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 9 11:08:42 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.017296, queueID=C135A564F04 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMDIgdG8gMDksDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9UT01M IDAuOS4wIOKAlCBhIGNvbXBsaWFudCBhbmQgZmxleGlibGUgVE9NTCBwYXJzaW5nLCBtYW5pcHVs YXRpb24sIGFuZCBwcmV0dHktcHJpbnRpbmcgbGlicmFyeQ0KQnVpbGQgU3lzdGVtIEVuZ2luZWVy IGF0IEphbmUgU3RyZWV0DQpSZWFsLXdvcmxkIHVzZSBleGFtcGxlIG9mIHRzMm9jYW1sDQpGaXJz dCByZWxlYXNlIG9mIGB0czJvY2FtbCcgLSBnZW5lcmF0ZXMgT0NhbWwgYmluZGluZ3MgZnJvbSAu ZC50cyBmaWxlcyENCk9VUFMgbWVldHVwcyBhcmUgYmFjayENCk9sZCBDV04NCg0KDQpPVE9NTCAw LjkuMCDigJQgYSBjb21wbGlhbnQgYW5kIGZsZXhpYmxlIFRPTUwgcGFyc2luZywgbWFuaXB1bGF0 aW9uLCBhbmQgcHJldHR5LXByaW50aW5nIGxpYnJhcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW90b21sLTAtOS0wLWEtY29tcGxpYW50LWFuZC1mbGV4 aWJsZS10b21sLXBhcnNpbmctbWFuaXB1bGF0aW9uLWFuZC1wcmV0dHktcHJpbnRpbmctbGlicmFy eS84MTUyLzk+DQoNCg0KRGFuaWlsIEJhdHVyaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBPVE9NTCAwLjkuMiBpcyBub3cgYXZhaWxhYmxlIGZyb20gdGhlIE9QQU0gcmVwb3NpdG9y eS4NCg0KDQpCcmVha2luZyBjaGFuZ2VzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBJdCBtYWtlcyBhIGJyZWFraW5nIGNoYW5nZSB0byB0aGUg YGdldF9hcnJheScgYWNjZXNzb3I6IGl0IG5vdyBoYXMNCiAgdHlwZSBgT3RvbWwuZ2V0X2FycmF5 JyBub3cgaGFzIHR5cGUgYD9zdHJpY3Q6Ym9vbCAtPiAodCAtPiAnYSkgLT4gdCAtPg0KICAnYSBs aXN0JyAsIHRoYXQgaXMsIGl0IHJlcXVpcmVzIGFuIGFjY2Vzc29yIGZ1bmN0aW9uIHRoYXQgd2ls bCBiZQ0KICBhcHBsaWVkIHRvIGV2ZXJ5IGl0ZW0gb2YgdGhlIGFycmF5Lg0KDQogIEZvciBleGFt cGxlLCB5b3UgY2FuIHVzZSBgT3RvbWwuZmluZCB0IChPdG9tbC5nZXRfYXJyYXkNCiAgT3RvbWwu Z2V0X3N0cmluZykgWyJmb28iXScgdG8gcmV0cmlldmUgYW4gYXJyYXkgb2Ygc3RyaW5ncyBmcm9t IGEgVE9NTA0KICBkb2N1bWVudCdzIGtleSBgZm9vJyAuDQoNCiAgVGhlIG1vdGl2YXRpb24gZm9y IHRoZSBjaGFuZ2UgaXMgdGhhdCBpdCBhbGxvd3MgcmV0cmlldmluZyBhcnJheXMgb2YNCiAgdW53 cmFwcGVkIE9DYW1sIHZhbHVlcyBpbiBvbmUgc3RlcC4gVGhlIG9sZCBiZWhhdmlvdXIgY2FuIHN0 aWxsIGJlDQogIGVtdWxhdGVkIHVzaW5nIGFuIGlkZW50aWZ5IGZ1bmN0aW9uIGZvciB0aGUgYWNj ZXNzb3IsIGZvciBleGFtcGxlIHRoZQ0KICBidWlsdC1pbiBgT3RvbWwuZ2V0X3ZhbHVlIDogJ2Eg LT4gJ2EnIC4NCg0KDQpOZXcgZmVhdHVyZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIE5ldyBgT3RvbWwucGF0aF9leGlzdHMgdCBbInNvbWUiOyAidGFibGUiOyAi a2V5Il0nIGFsbG93cyBjaGVja2luZyBpZg0KICBhIGtleSBwYXRoIGV4aXN0cyBpbiBhIFRPTUwg ZG9jdW1lbnQuDQoNCiAgYE90b21sLlByaW50ZXIudG9fc3RyaW5nL3RvX2NoYW5uZWwnIGZ1bmN0 aW9ucyBub3cgcHJvdmlkZQ0KICBgfmZvcmNlX3RhYmxlX2FycmF5JyBvcHRpb24uIFdoZW4gc2V0 IHRvIHRydWUsIGl0IGZvcmNlcyBldmVyeSBhcnJheQ0KICB0aGF0IGNvbnRhaW5zIG5vdGhpbmcg YnV0IHRhYmxlcyB0byBiZSByZW5kZXJlZCB1c2luZyB0aGUgYFtbLi4uXV1+Jw0KICB0YWJsZSBh cnJheSBzeW50YXguDQoNCg0KQnVnIGZpeGVzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZXMgYXJlIG5vdyBwcmludGVkIGNvcnJlY3RseS4N Cg0KICBJZiBhIHRhYmxlIGhhcyBzdWJ0YWJsZXMgYW5kIG5vbi10YWJsZSBpdGVtcywgdGhlIG5v bi10YWJsZSBpdGVtcyBhcmUNCiAgZm9yY2libHkgbW92ZWQgYmVmb3JlIHRoZSBmaXJzdCBzdWJ0 YWJsZSBmb3IgcHJpbnRpbmcuIFRoaXMgd2F5IHRoZQ0KICBvdXRwdXQgcGFyc2VzIGNvcnJlY3Rs eSwgb3RoZXJ3aXNlIHRoZSBub24tdGFibGUgaXRlbXMgd291bGQgYmUNCiAgbWlzdGFrZW5seSB0 cmVhdGVkIGFzIHN1YnRhYmxlIG1lbWJlcnMuIFRoaXMgd2F5IGhhbmQtY29uc3RydWN0ZWQgVE9N TA0KICB0YWJsZXMgYXJlIGFsd2F5cyBmb3JtYXR0ZWQgY29ycmVjdGx5IGV2ZW4gaWYgdGhlIHVz ZXIgaW5zZXJ0cw0KICBub24tdGFibGUgaXRlbXMgYWZ0ZXIgYSBzdWJ0YWJsZS4NCg0KDQpUZXN0 aW5nDQrilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIGFkZGVkIGEgbWluaW1hbCB0ZXN0IHN1 aXRlIGZvciB0aGUgcmVhZC13cml0ZSBpbnRlcmZhY2UuIElmIGFueW9uZQ0KICB3YW50cyB0byBj b250cmlidXRlIHRvIGl0LCB0aGF0IHdpbGwgYmUgbXVjaCBhcHByZWNpYXRlZC4gSWRlYWxseSwg YWxsDQogIGxvb2t1cCBmdW5jdGlvbnMgYW5kIGFsbCBhY2Nlc3NvcnMvY29uc3RydWN0b3JzIHNo b3VsZCBiZSB0ZXN0ZWQgdG8NCiAgd29yayBhcyBleHBlY3RlZC4NCg0KICBCb3RoIHBhcnNlciBh bmQgZm9ybWF0dGVyIGFyZSBub3cgdGVzdGVkIHdpdGggdGhlDQogIFtnaXRodWIuY29tL0J1cm50 U3VzaGkvdG9tbC10ZXN0XSBhbmQgYXJlIGZ1bGx5IGNvbXBsaWFudCAob25lDQogIGZvcm1hdHRl ciB0ZXN0IGlzIHNraXBwZWQgYmVjYXVzZSB0aGUgdGVzdCBpdHNlbGYgaXMgbWFsZm9ybWVkKS4N Cg0KDQpbZ2l0aHViLmNvbS9CdXJudFN1c2hpL3RvbWwtdGVzdF0NCjxodHRwczovL2dpdGh1Yi5j b20vQnVybnRTdXNoaS90b21sLXRlc3Q+DQoNCg0KRnV0dXJlIHBsYW4NCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE15IGlkZWEgd2FzIHRvIGNhbGwgaXQgMS4wLjAgd2hl biBpdCBwYXNzZXMgYm90aCBwYXJzaW5nIGFuZCBmb3JtYXR0ZXINCiAgdGVzdHMuIFRoYXQgZ29h bCBpcyByZWFjaGVkIG5vdywgYnV0IEknZCBsaWtlIHRvIHNlZSBpZiBhbnlvbmUgaGFzIGFueQ0K ICBtb3JlIGlkZWFzIGZvciB0aGUgQVBJIHRoYXQgY2Fubm90IGJlIGltcGxlbWVudGVkIHdpdGhv dXQgYnJlYWtpbmcNCiAgY2hhbmdlcy4gSWYgbm90LCBJJ2xsIGNhbGwgaXQgMS4wLjAgaW4gdGhl IG5leHQgcmVsZWFzZS4NCg0KDQpCdWlsZCBTeXN0ZW0gRW5naW5lZXIgYXQgSmFuZSBTdHJlZXQN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvam9iLWJ1aWxkLXN5c3Rl bS1lbmdpbmVlci1hdC1qYW5lLXN0cmVldC84NzM3LzE+DQoNCg0KQW5kcmV5IE1va2hvdiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEphbmUgU3RyZWV0IGlzIGxvb2tpbmcgZm9yIG5ldyBi dWlsZCBzeXN0ZW0gZW5naW5lZXJzISBJJ3ZlIHdvcmtlZCBpbg0KICB0aGlzIHRlYW0gZm9yIHR3 byB5ZWFycyBhbmQgSSBsb3ZlIHRoZSBqb2IuICBIZXJlIGlzIHdoeToNCg0KICDigKIgWW91IGZy ZXF1ZW50bHkgY2hhbmdlIGZvY3VzIGZyb20gbG93LWxldmVsIHdvcmssIGxpa2UgZGVidWdnaW5n IGENCiAgICB3ZWlyZCBmaWxlLXN5c3RlbSBpc3N1ZSwgdG8gaGlnaC1sZXZlbCB3b3JrLCBsaWtl IGRlc2lnbmluZyBhIGNsb3VkDQogICAgYnVpbGQgY2FjaGUuDQoNCiAg4oCiIFlvdXIgY29sbGVh Z3VlcyBhcmUgYW1hemluZy4gSWYgeW91J3JlIGxpa2UgbWUsIHlvdSdsbCBmZWVsIGxpa2UgYW4N CiAgICBpbXBvc3RlciBpbiBtb3N0IGNvbnZlcnNhdGlvbnMgYnV0IGl0J3MgT0sgc2luY2UgZXZl cnlvbmUgaXMga2luZA0KICAgIGFuZCBoZWxwZnVsLCBzbyB5b3UnbGwgbGVhcm4gc29tZXRoaW5n IG5ldyBldmVyeSBkYXkuDQoNCiAg4oCiIE1vc3Qgb2YgeW91ciB3b3JrIGlzIG9wZW4tc291cmNl IGFuZCBiZW5lZml0cyB0aGUgd2lkZXIgT0NhbWwNCiAgICBjb21tdW5pdHkuDQoNCiAgRm9yIGJh bGFuY2UsIGxldCBtZSBhbHNvIHNheSBhIGZldyB3b3JkcyBhYm91dCBjaGFsbGVuZ2VzLg0KDQog IOKAoiBCdWlsZCBzeXN0ZW1zIGFjY3VtdWxhdGUgeWVhcnMgb2Yga25vd2xlZGdlIG9mIG1hbnkg cGVvcGxlIG9uIGhvdyB0bw0KICAgIGdldCB0aGluZ3MgZG9uZS4gV2hlbiB0aGlzIGtub3dsZWRn ZSBnb2VzIG91dCBvZiBkYXRlLCB5b3UgYXJlIG9mdGVuDQogICAgdGhlIG9ubHkgcGVyc29uIHRv IGZpeCBpdC4gRm9yIHRoaXMgcmVhc29uLCBidWlsZCBzeXN0ZW1zIHdvcmsgY2FuDQogICAgYmUg ZGF1bnRpbmcuDQoNCiAg4oCiIEl0J3MgZmFyIGZyb20gb3VyIGNvcmUgYnVzaW5lc3MsIHNvIHlv dSBkb24ndCBnZXQgdG8gd29yayBvbiBhbnkgb2YNCiAgICBvdXIgY29vbCB0cmFkaW5nIHN5c3Rl bXMuIFlvdXIgcm9sZSBpcyB0byBlbXBvd2VyIG90aGVycy4NCg0KICDigKIgT3VyIHRlYW0gaXMg c21hbGwsIHNvIHdlIG1heSBoYXZlIHRvIHR1cm4gZG93biBzb21lIGdvb2QNCiAgICBjYW5kaWRh dGVzLiBIb3dldmVyLCBwbGVhc2UgZG9uJ3QgZ2V0IGRpc2NvdXJhZ2VkIGJ5IHRoaXMhIElmIGlu DQogICAgZG91YnQsIHNlbmQgbWUgYSBtZXNzYWdlIGFuZCB3ZSdsbCBjaGF0Lg0KDQogIOKAoiBU aGVyZSBpcyBubyByZW1vdGUgd29yayBmb3Igbm93Lg0KDQogIFRvIGFwcGx5LCBmb2xsb3cgW3Ro aXMgbGlua10gYW5kIG1lbnRpb24gdGhlIGJ1aWxkIHN5c3RlbXMgcm9sZSBpbg0KICB5b3VyIGFw cGxpY2F0aW9uLg0KDQogIE91ciBwbGFucyBmb3IgMjAyMiBpbmNsdWRlOiBpbXBsZW1lbnRpbmcg Y2xvdWQgYnVpbGRzIGluIER1bmUsIGJldHRlcg0KICBpbnRlZ3JhdGlvbiB3aXRoIG90aGVyIHRv b2xzIGxpa2UgSURFcyBhbmQgdGhlIE9DYW1sIGNvbXBpbGVyLCBhbmQNCiAgbWFraW5nIER1bmUg ZXZlbiBmYXN0ZXIgdGhhbiBpdCBpcyB0b2RheS4gVG8gbGVhcm4gbW9yZSBhYm91dCBvdXINCiAg d29yaywgbGlzdGVuIHRvIFt0aGlzIHBvZGNhc3RdLg0KDQogIEFuZCBmZWVsIGZyZWUgdG8gbWVz c2FnZSBtZSBvciBAamVyZW1pZWRpbWlubyBpZiB5b3UgaGF2ZSBhbnkNCiAgcXVlc3Rpb25zIQ0K DQoNClt0aGlzIGxpbmtdDQo8aHR0cHM6Ly9qYW5lc3RyZWV0LmNvbS9qb2luLWphbmUtc3RyZWV0 L3Bvc2l0aW9uLzQyNzQ4MTQwMDIvPg0KDQpbdGhpcyBwb2RjYXN0XSA8aHR0cHM6Ly9zaWduYWxz YW5kdGhyZWFkcy5jb20vYnVpbGQtc3lzdGVtcy8+DQoNCg0KUmVhbC13b3JsZCB1c2UgZXhhbXBs ZSBvZiB0czJvY2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9yZWFsLXdv cmxkLXVzZS1leGFtcGxlLW9mLXRzMm9jYW1sLzg3NDUvMT4NCg0KDQpTb3JhIE1vcmltb3RvIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU29tZSBPQ2FtbC9KYXZhU2NyaXB0IGVudGh1c2lh c3RzIG1heSBrbm93IHRoYXQgd2Ugc3BlbnQgYWxtb3N0IHR3bw0KICB5ZWFycyB3b3JraW5nIG9u IGEgdG9vbCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpbmcgT0NhbWwgYmluZGluZ3MgZnJvbQ0KICBU eXBlU2NyaXB0J3MgdHlwZSBkZWZpbml0aW9uIGZpbGVzLiBUbyBwcmVwYXJlIGZvciBpdHMgcmVs ZWFzZSwgd2UNCiAganVzdCBwdWJsaXNoZWQgYSByZXBvc2l0b3J5IHRvIHNob3cgYW4gZXhhbXBs ZSB1c2Ugb2YgaXQuDQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFy ZDExL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYLzMvMzQ3M2ZjMTFkYTBjNTYzMzVlOGRlMmI5 MWJkN2Q5MTcyNDQ0OTEzYV8yXzEzODB4Mzc0LnBuZz4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29t L29jc2lnZW4vdHMyb2NhbWwtZXhhbXBsZT4NCg0KICBUaGlzIGV4YW1wbGUgZ2VuZXJhdGVzIGFu ZCBhY3R1YWxseSB1c2VzIGEgYmluZGluZyB0byBhIHNtYWxsDQogIEphdmFTY3JpcHQgbGlicmFy eSBjYWxsZWQgW3ByZXR0eS1ieXRlc10sIGFuZCBpdCBkb2Vzbid0IG9ubHkgZ2VuZXJhdGUNCiAg dGhlIGJpbmRpbmcsIGJ1dCBhbHNvIGNvbnZlcnRzIEpTRG9jIGNvbW1lbnRzIHRvIG9kb2Mgb25l cy4NCg0KICBXZSBiZWxpZXZlIHdlIGNhbiByZWxlYXNlIHRzMm9jYW1sIGFzIGVhcmx5IGFzIHRo aXMgbW9udGgsIHBsZWFzZSBsb29rDQogIGZvcndhcmQgdG8gdGhlIG5ldyBhbm5vdW5jZW1lbnQh DQoNCg0KW3ByZXR0eS1ieXRlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9zaW5kcmVzb3JodXMvcHJl dHR5LWJ5dGVzPg0KDQoNCkZpcnN0IHJlbGVhc2Ugb2YgYHRzMm9jYW1sJyAtIGdlbmVyYXRlcyBP Q2FtbCBiaW5kaW5ncyBmcm9tIC5kLnRzIGZpbGVzIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi10czJvY2FtbC1nZW5lcmF0ZXMtb2NhbWwt YmluZGluZ3MtZnJvbS1kLXRzLWZpbGVzLzg3NzIvMT4NCg0KDQpDYW5ub3JpbiBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFdlJ3JlIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhhdCB0czJvY2FtbCBpcyBub3cgcHVibGlj IQ0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi90czJvY2FtbD4NCg0KICBUaGlzIGlz IGEgdG9vbCB3aGljaCBwYXJzZXMgVHlwZVNjcmlwdCBkZWZpbml0aW9uIGZpbGVzIChgLmQudHMn KSBvZiBhDQogIEpTIHBhY2thZ2UgYW5kIHRoZW4gZ2VuZXJhdGVzIGFuIE9DYW1sIGJpbmRpbmcg Zm9yIHRoZSBwYWNrYWdlLg0KDQogIHRzMm9jYW1sIGN1cnJlbnRseSBzdXBwb3J0cyBqc19vZl9v Y2FtbCBhcyBhIHRhcmdldCB2aWENCiAgW0xleGlGaS9nZW5fanNfYXBpXSwgYW5kIFJlU2NyaXB0 IGlzIGFsc28gZ29pbmcgdG8gYmUgc3VwcG9ydGVkIHRvbyENCg0KICBZb3UgY2FuIGluc3RhbGwg dHMyb2NhbWwgZnJvbSBOUE06IGBucG0gaW5zdGFsbCAtZyBAb2NzaWdlbi90czJvY2FtbCcuDQog IFBsZWFzZSB0YWtlIGEgbG9vayBhdCB0aGUgZG9jdW1lbnRhdGlvbiBvbiBvdXIgR2l0SHViIHJl cG9zaXRvcnkNCiAgYmVmb3JlIHVzaW5nIGl0Lg0KDQogIEFsc28sIHdlIGFwcHJlY2lhdGUgYW55 IGZlZWRiYWNrIG9yIGJ1ZyByZXBvcnRzLCBlc3BlY2lhbGx5IHNpbmNlIHRoaXMNCiAgaXMgdGhl IGZpcnN0IHJlbGVhc2Ugb2YgdHMyb2NhbWwhDQoNCiAgVGhpcyB0b29sIGlzIGhlYXZpbHkgaW5z cGlyZWQgYnkgdHMyZmFibGUsIHdoaWNoIGdlbmVyYXRlcyBGYWJsZSAoRiMNCiAgQWx0SlMpIGJp bmRpbmdzIGZyb20gYC5kLnRzJyBmaWxlcy4gVGhpcyB0b29sIGlzIGFsc28gd3JpdHRlbiBpbg0K ICBGYWJsZS4gVGhhbmsgeW91IHZlcnkgbXVjaCBmb3IgdGhlIGdyZWF0IGxhbmd1YWdlIGFuZCBh biBhd2Vzb21lDQogIGVjb3N5c3RlbSwgRmFibGUgdGVhbSENCg0KDQpbTGV4aUZpL2dlbl9qc19h cGldIDxodHRwczovL2dpdGh1Yi5jb20vTGV4aUZpL2dlbl9qc19hcGk+DQoNCg0KT1VQUyBtZWV0 dXBzIGFyZSBiYWNrIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9vdXBzLW1lZXR1cHMtYXJlLWJhY2svODc3Ni8xPg0KDQoNCnphcGFzaGNhbm9u IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgKEBWZXJ0bW8sIEBsc3lsdmVzdHJlLCBDb2xpbiBH b256w6FsZXogYW5kIG15c2VsZikgYXJlIGhhcHB5IHRvDQogIGFubm91bmNlIHRoYXQgdGhlIFtP VVBTIChPQ2FtbCBVc2VycyBpbiBQYXJpUykgbWVldHVwc10gYXJlIGJhY2suDQoNCiAgSWYgeW91 J3JlIG5vdCBmYW1pbGlhciB3aXRoIE9VUFMsIHRoZSBpZGVhIGlzIHRvIGhhdmUgcGVvcGxlIHVz aW5nDQogIE9DYW1sIChkZXZlbG9wZXJzLCBhcHBsaWNhdGlvbnMnIHVzZXJzLCByZXNlYXJjaGVy cywg4oCmKSB0byBtZWV0IGluDQogIFBhcmlzIHdoZXJlIGEgdGFsayBpcyBnaXZlbiwgZm9sbG93 ZWQgYnkgc29tZSBkaXNjdXNzaW9ucyB3aGlsZSBlYXRpbmcNCiAgcGl6emEgYW5kIGRyaW5raW5n IGJlZXIuDQoNCiAgV2UncmUgcGxhbm5pbmcgdG8gaGF2ZSB0aGUgZmlyc3QgbWVldHVwIGhhcHBl bmluZyB0aGlzIHllYXIgaW4NCiAgRGVjZW1iZXIuDQoNCiAgVGh1cyB3ZSdyZSBsb29raW5nIGZv ciBzcGVha2VycyB3aWxsaW5nIHRvIGdpdmUgYSB0YWxrIGZvciB0aGUgZmlyc3QNCiAgbWVldHVw cyBvciB0aGUgZm9sbG93aW5nIG9uZXMuDQoNCiAgVGhlIHRhbGtzIHVzdWFsbHkgaGFwcGVuIGF0 IFtJUklMTF0ncyBvZmZpY2VzLCBbNCBQbGFjZSBKdXNzaWV1LCA3NTAwNQ0KICBQYXJpc10uIFdl J2xsIHByZWZlciB0YWxrcyBpbiBmcmVuY2ggYW5kIHdpdGggc29tZW9uZSBhYmxlIHRvIGJlDQog IHBoeXNpY2FsbHkgcHJlc2VudCwgYnV0IHdlJ3JlIG9wZW4gYWJvdXQgZW5nbGlzaCBhbmQgcmVt b3RlIHRhbGtzLg0KDQogIElmIHlvdSB3YW50IHRvIGdpdmUgYSB0YWxrIGluIERlY2VtYmVyIG9y IGluIHRoZSBmdXR1cmUsIHlvdSBjYW4gbGV0DQogIHVzIGtub3cgaGVyZSBvciBbb24genVsaXBd IHdoZXJlIHdlIHBsYW4gdG8gaGF2ZSBvdXIgbWFpbiBkaXNjdXNzaW9ucy4NCiAgV2UgYWxzbyBo YXZlIFthIGdyb3VwIG9uIEZyYW1hZ2l0XSB3aGVyZSB3ZSdsbCBzdG9yZSBzb21lIHN0dWZmLiBJ Zg0KICB5b3UgZG9uJ3QgbGlrZSBadWxpcCwgSSdtIGFsc28gb24gSVJDICgjb3VwcyBpbiBbbGli ZXJhLmNoYXRdKSBhbmQNCiAgW21hdHJpeF0gYnV0IG5vdCBldmVyeW9uZSBpcy4NCg0KICBUaGUg Zm91ciBvZiB1cyBhcmUgZG9pbmcgYSBQaEQgaW4gdGhlIGZvbGxvd2luZyBwbGFjZXM6IFtFTlNd IChbUGFya2FzDQogIHRlYW1dKSwgW1VuaXZlcnNpdMOpIGRlIFBhcmlzXSAoW0lyaWZdKSArIFtO b21hZGljIExhYnNdLCBbVW5pdmVyc2l0w6kNCiAgUGFyaXMtU2FjbGF5XSAoW0xNRl0pICsgW09D YW1sUHJvXSwgW1NvcmJvbm5lIFVuaXZlcnNpdMOpXSAoW0FQUiB0ZWFtIC0NCiAgTElQNl0pIDsg c28gd2UgaGF2ZSBhIGdvb2QgY292ZXJhZ2Ugb2YgdGhlIE9DYW1sIHVzZXJzIGluIFBhcmlzIGJ1 dCB3ZQ0KICBkb24ndCBrbm93IGV2ZXJ5b25lLiBFdmVuIGlmIHlvdSBkb24ndCB3YW50IHRvIGdp dmUgYSB0YWxrLCBpZiB5b3UNCiAga25vdyBzb21lb25lIHRoYXQgbWF5IGJlIGludGVyZXN0ZWQs IHBsZWFzZSB0YWxrIHRvIGhpbSBhYm91dCBPVVBTICENCiAgOikNCg0KICBBbHNvLCBpZiB0aGVy ZSdzIGEgc3ViamVjdCB5b3UnZCBsaWtlIHRvIGhlYXIgYWJvdXQgYXQgT1VQUywgeW91IGNhbg0K ICB0ZWxsIHVzIGFuZCB3ZSdsbCB0cnkgdG8gZmluZCBhIHNwZWFrZXIgdG8gZ2l2ZSBhIHRhbGsg YWJvdXQgaXQuDQoNCiAgV2UnbGwgY29tZSBiYWNrIHRvIHlvdSB2ZXJ5IHF1aWNrbHkgYWJvdXQg dGhlIERlY2VtYmVyIG1lZXR1cC4NCg0KDQpbT1VQUyAoT0NhbWwgVXNlcnMgaW4gUGFyaVMpIG1l ZXR1cHNdDQo8aHR0cHM6Ly93d3cubWVldHVwLmNvbS9mci1GUi9vY2FtbC1wYXJpcy8+DQoNCltJ UklMTF0gPGh0dHBzOi8vd3d3LmlyaWxsLm9yZy8+DQoNCls0IFBsYWNlIEp1c3NpZXUsIDc1MDA1 IFBhcmlzXQ0KPGh0dHBzOi8vd3d3Lm9wZW5zdHJlZXRtYXAub3JnLyNtYXA9MTkvNDguODQ2NTAv Mi4zNTQ1Nz4NCg0KW29uIHp1bGlwXSA8aHR0cHM6Ly9vdXBzLnp1bGlwY2hhdC5jb20+DQoNClth IGdyb3VwIG9uIEZyYW1hZ2l0XSA8aHR0cHM6Ly9mcmFtYWdpdC5vcmcvb3Vwcz4NCg0KW2xpYmVy YS5jaGF0XSA8aHR0cHM6Ly9saWJlcmEuY2hhdC8+DQoNClttYXRyaXhdIDxodHRwczovL21hdHJp eC50by8jLyNvdXBzOm1hdHJpeC5vcmc+DQoNCltFTlNdIDxodHRwczovL3d3dy5lbnMucHNsLmV1 Lz4NCg0KW1BhcmthcyB0ZWFtXSA8aHR0cHM6Ly9wYXJrYXMuZGkuZW5zLmZyLz4NCg0KW1VuaXZl cnNpdMOpIGRlIFBhcmlzXSA8aHR0cHM6Ly91LXBhcmlzLmZyLz4NCg0KW0lyaWZdIDxodHRwczov L3d3dy5pcmlmLmZyLz4NCg0KW05vbWFkaWMgTGFic10gPGh0dHBzOi8vd3d3Lm5vbWFkaWMtbGFi cy5jb20vPg0KDQpbVW5pdmVyc2l0w6kgUGFyaXMtU2FjbGF5XSA8aHR0cHM6Ly93d3cudW5pdmVy c2l0ZS1wYXJpcy1zYWNsYXkuZnIvPg0KDQpbTE1GXSA8aHR0cHM6Ly9sbWYuY25ycy5mci8+DQoN CltPQ2FtbFByb10gPGh0dHBzOi8vd3d3Lm9jYW1scHJvLmNvbS8+DQoNCltTb3Jib25uZSBVbml2 ZXJzaXTDqV0gPGh0dHBzOi8vd3d3LnNvcmJvbm5lLXVuaXZlcnNpdGUuZnIvPg0KDQpbQVBSIHRl YW0gLSBMSVA2XSA8aHR0cHM6Ly93d3cubGlwNi5mci9yZWNoZXJjaGUvdGVhbS5waHA/YWNyb255 bWU9QVBSPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBo YXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xs IG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9y IHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNo IHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBb b25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1h aWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNo aXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxp bmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0K DQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 02 to 09, 20= 21.

OTOML 0.9.0 =E2=80=94 a compliant and flexible TOML parsing, m= anipulation, and pretty-printing library

Daniil Baturin announced

OTOML 0.9.2 is now available from the OPAM repository.

Breaking changes

It makes a breaking change to the get_array accessor: it now h= as type Otoml.get_array now has type ?strict:bool -> (t -> 'a) -> t -> 'a list , that is, it requires an a= ccessor function that will be applied to every item of the array.

For example, you can use Otoml.find t (Otoml.get_array Otoml.get_stri= ng) ["foo"] to retrieve an array of strings from a TOML document's key foo .

The motivation for the change is that it allows retrieving arrays of unwrap= ped OCaml values in one step. The old behaviour can still be emulated using an identify function for the accessor= , for example the built-in Otoml.get_value : 'a -> 'a .

New features

New Otoml.path_exists t ["some"; "table"; "key"] allows checki= ng if a key path exists in a TOML document.

Otoml.Printer.to_string/to_channel functions now provide ~force_table_array option. When set to true, it forces every array that contains nothing but tables to be rendered using the [[...]]~ table array syntax.

Bug fixes

Unicode escape sequences are now printed correctly.

If a table has subtables and non-table items, the non-table items are forci= bly moved before the first subtable for printing. This way the output parses correctly, otherwise the non-table ite= ms would be mistakenly treated as subtable members. This way hand-constructed TOML tables are always formatted correct= ly even if the user inserts non-table items after a subtable.

Testing

I added a minimal test suite for the read-write interface. If anyone wants = to contribute to it, that will be much appreciated. Ideally, all lookup functions and all accessors/constructors s= hould be tested to work as expected.

Both parser and formatter are now tested with the github.com/BurntSushi/t= oml-test and are fully compliant (one formatter test is skipped because the test itself is malformed).

Future plan

My idea was to call it 1.0.0 when it passes both parsing and formatter test= s. That goal is reached now, but I'd like to see if anyone has any more ideas for the API that cannot be implemented = without breaking changes. If not, I'll call it 1.0.0 in the next release.

Build System Engineer at Jane Street

Andrey Mokhov announced

Jane Street is looking for new build system engineers! I've worked in this = team for two years and I love the job. Here is why:

  • You frequently change focus from low-level work, like debugging a weird= file-system issue, to high-level work, like designing a cloud build cache.=
  • Your colleagues are amazing. If you're like me, you'll feel like an imp= oster in most conversations but it's OK since everyone is kind and helpful,= so you'll learn something new every day.
  • Most of your work is open-source and benefits the wider OCaml community= .

For balance, let me also say a few words about challenges.

  • Build systems accumulate years of knowledge of many people on how to ge= t things done. When this knowledge goes out of date, you are often the only= person to fix it. For this reason, build systems work can be daunting.
  • It's far from our core business, so you don't get to work on any of our= cool trading systems. Your role is to empower others.
  • Our team is small, so we may have to turn down some good candidates. Ho= wever, please don't get discouraged by this! If in doubt, send me a message= and we'll chat.
  • There is no remote work for now.

To apply, follow this link and mention the build systems role in your application.

Our plans for 2022 include: implementing cloud builds in Dune, better integ= ration with other tools like IDEs and the OCaml compiler, and making Dune even faster than it is today. To learn more= about our work, listen to this podcast.

And feel free to message me or @jeremiedimino if you have any questions!

Real-world use example of ts2ocaml

Sora Morimoto announced

Some OCaml/JavaScript enthusiasts may know that we spent almost two years w= orking on a tool automatically generating OCaml bindings from TypeScript's type definition files. To prepare for its = release, we just published a repository to show an example use of it.

3D"=

https://github.com/= ocsigen/ts2ocaml-example

This example generates and actually uses a binding to a small JavaScript li= brary called pretty-bytes, = and it doesn't only generate the binding, but also converts JSDoc comments to odoc ones.

We believe we can release ts2ocaml as early as this month, please look forw= ard to the new announcement!

First release of ts2ocaml - generates OCaml bindi= ngs from .d.ts files!

Cannorin announced

We're pleased to announce that ts2ocaml is now public!

https://github.com/ocsigen/= ts2ocaml

This is a tool which parses TypeScript definition files (.d.ts= ) of a JS package and then generates an OCaml binding for the package.

ts2ocaml currently supports js_of_ocaml as a target via LexiFi/gen_js_api, and ReScript is also going to be supported too!

You can install ts2ocaml from NPM: npm install -g @ocsigen/ts2ocaml. Please take a look at the documentation on our GitHub repository before usi= ng it.

Also, we appreciate any feedback or bug reports, especially since this is t= he first release of ts2ocaml!

This tool is heavily inspired by ts2fable, which generates Fable (F# AltJS)= bindings from .d.ts files. This tool is also written in Fable. Thank you very much for the great language and an aw= esome ecosystem, Fable team!

OUPS meetups are back!

zapashcanon announced

We (@Vertmo, @lsylvestre, Colin Gonz=C3=A1lez and myself) are happy to anno= unce that the OUPS (O= Caml Users in PariS) meetups are back.

If you're not familiar with OUPS, the idea is to have people using OCaml (d= evelopers, applications' users, researchers, …) to meet in Paris where a talk is given, followed by = some discussions while eating pizza and drinking beer.

We're planning to have the first meetup happening this year in December.

Thus we're looking for speakers willing to give a talk for the first meetup= s or the following ones.

The talks usually happen at IRILL's = offices, 4 Place Jussieu, 75005 Paris. We'll prefer talks in french and with someone able to be physically present, but we're open about english and remote talks.

If you want to give a talk in December or in the future, you can let us kno= w here or on zulip where we plan to have our main discussions. We also have a group on Framagit where we'll store some stuff. If you don't like Zulip, I'm als= o on IRC (#oups in libera.chat) and matrix but not everyone is.

The four of us are doing a PhD in the following places: ENS (Parkas team), Universit=C3=A9 de Paris (Irif) + Nomadic Labs, Universit=C3=A9 Paris-Saclay (LMF) + OCamlPro, Sorbo= nne Universit=C3=A9 (APR team - LIP6) ; so we have a good coverage of the OCaml users in Paris but we don't know everyone. Even if you don't want to give a talk, if you k= now someone that may be interested, please talk to him about OUPS ! :)

Also, if there's a subject you'd like to hear about at OUPS, you can tell u= s and we'll try to find a speaker to give a talk about it.

We'll come back to you very quickly about the December meetup.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5CA14E0092 for ; Tue, 16 Nov 2021 09:41:18 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=ahyI=QD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AE4qIcB1CPmRuuxJgsmDO6wEyDhhOgF0UFjAc5pd?= =?us-ascii?q?vsb9SaKPrp82kYBaHo6Q0xwKWFazgqNt8w9LMtK7hXWFSqb2gi1slNKJ2ahkel?= =?us-ascii?q?M8NlBYhCsPWQWfyLfrtcjBoVJ8aDAwt8H60K1VaF9jjbFPOvHKy8SQSGhLiPgZ?= =?us-ascii?q?pO+j5AIHfg9qr2+yo/5DffgpEiTq/bLhvMBi4sALdu9UMj4B/MKgx0BzJonVJe?= =?us-ascii?q?+RS22xlIE+Ykgj/6Mmt4pNt6jxctP09+cFOV6X6ZLk4QqdDDDs6KWA15dbkugf?= =?us-ascii?q?FQACS+3YTSGQWkh5PAwjY8BH3W4r6vyXmuuZh3iSRIMr5Q60pWTS596dkVgPni?= =?us-ascii?q?DsJOT4+9WHYkM1wjKRGqx6lqBFyx4vYbYeVOPR9eKPdY9IaRXFAXslKUyxOHJ6?= =?us-ascii?q?3boUID+obIOlYtJT2q18AoBeiAAWhAv7kxD1ViX/sxaA00/ovHxzI0gIjEN0Br?= =?us-ascii?q?G/Zo8/pOKoIS+250LXEwDfFYvhL2Tn98o/IchU5rPyQWbJ/a8zRwlQyGQzZjlW?= =?us-ascii?q?QrI3lPy+J1u8QtGWU9e5gWvipi2I9sAF+vjivxsItionVmoIY0UjE9SJ9wIc1O?= =?us-ascii?q?d23VlJ0Yd6iEJtRriGaKpV5TtklQ2FytyY307sLsoO0cyYW0poo3QLfa+CZfIi?= =?us-ascii?q?S5BLuTOecLCt6iX9meL+yhxm//FWhx+HhWMe500tHojdEn9XSqH0Ayx3e5MeDR?= =?us-ascii?q?/Zg8UqtxSuD2gDT5+1YPEw5ka7WJ4Anz7UtmJQTtkHDETX3mEXwlKKWblsr+vS?= =?us-ascii?q?p6+T7fLrmvpicN4pxig7gKKgunNKwAfggPggJQ2eU4+G81Ln58U3+WrVKgeU6n?= =?us-ascii?q?bXbsJDdJMQboLK5DxVJ3YYk7hazFzim0NUEnXkHMVJKYwiLgJTuO1HLOPz4Ava?= =?us-ascii?q?/g0iskDd23P/KJLzhApLVInjZl7fhZqpy609Bxwou1tBT/Y5bCrYEIP7rVE7xt?= =?us-ascii?q?d/YDh4hMwOq3unnCc9y2pkZWWKVDa+VKKTSsUeW6eIpPeaMYoAVuDfnJPc45v7?= =?us-ascii?q?ui2U2lUUbfaa3wZsbcGy3HvN7LEqHenXjnM0BEWgQsgo5Vuzqh0WOUT9VZ3arW?= =?us-ascii?q?6Iz/Co0BJigDYjdWoChmKeB3DuhHp1RfmBGCk6DHW3pd4WBQ/sNZyeSItd5kjA?= =?us-ascii?q?eUrihUYAh2QmotA/j0LpoNfDY+iwftZ77ytd14+jTmQg29TNuCcSd3HuBT2Zun?= =?us-ascii?q?mMHXzM22bpwoU17yluZ1Kh4h+RUFdhN6PxTXAc6MYDTz/B4C9DpQA7OYtCJSFO?= =?us-ascii?q?+TtWpBzExU8g9w9gUY0ZyA9mijw3M3iquA78RjbCLA4Y08q3a0nPsJMh9027L2?= =?us-ascii?q?LQ/g1QiWMdDKHGqi6Fl+wXdG4LFiUuUmqmyeagB0iPB6X2PwXSOsUxXSgJ8TLn?= =?us-ascii?q?JUWoCakbUsdj04F7JQaW0BrQ9KARBzNaPKqtUZd3tilVLXPLjOdvDb26rg2ewA?= =?us-ascii?q?hKIx7OQbIX0Z2od3CPdCEkdkwAO43mKLw8+Bj2uo27GDTxuE0zgY1/0/OVjtn+?= =?us-ascii?q?2SlU4wxyWY0Buzba49AIZieaSRv4cxr4EvT0uqzRwHFazxdLWDN+AqhJ8cqtAf?= =?us-ascii?q?N0x/E9K2njZtw19PZKtN7tsiFAGfgRvuEPu0xV2Cplensc2rHMqygtyKbuF0Fx?= =?us-ascii?q?fbT+Y2orwOrLPJ2bo+BCgcajW1kvF0NmK+qcP7fU4q0n/vAyyDUUi9Ghn099J3?= =?us-ascii?q?HSC/ZXGFg8SXJ3+U0ot8Bh6vb7abjEn54zIzX1sLbW0sjja1t01HuQlzxKgc85?= =?us-ascii?q?bMKOFDw/yD9YXB9OuKewvg1imdAgIPOFU9K4uPsOpbeGK2KCxPLUooDXzx2BY5?= =?us-ascii?q?so1hkaT8QJ4VeiO2ZsZlbXQlACYUX20xAOqrcbfnYFfeSpUH2auzSyiA5ReMOk?= =?us-ascii?q?6do8ODSKqItar7tR4nZ/kHXBCp3C5AFZT8cugf1KpZFz43BFMnRAepXWh3zCzz?= =?us-ascii?q?zl1jy0Btq2bzTDDyOTkdQMaNyhMXmY03gSkGpS9k91PBBvgVAMujhbwuheSL0d?= =?us-ascii?q?zrqNiKWLeWgFNIziwKHttAPLYXluqZt4WrosvtTRLXe+8Z1GDV7O7pAEVgXqL9?= =?us-ascii?q?4523Dc/Zi2nsZX/ngVnhSSaNnkh9RLk?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3Av2vkqqNRNCgHT8BcTsajsMiBIKoaSvp037BL?= =?us-ascii?q?7SBMoHNuHfBw+/rFoB15737JYVQqNk3I8OroUMK9qBjnmaKdj7N9AZ6SGCHY/E?= =?us-ascii?q?GoIIth4YaK+UyCJwTOsshH2+NFe6h6YeeAaGSSYPyKgjWFLw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DnAAASaxphmCIeaIFahAVZQQFkVzoxh?= =?us-ascii?q?EeJBIZFgiSDKIV1hleNHANPEAEDAQ0qAQ4FAQIEAQGEeoJUAh4GAQUzEwECBBU?= =?us-ascii?q?BAQUBAQECAQMDBAETAQEBAQEBAQEJCxAGOiSFaA2CNQwMAwODdwEYAQgEBmUUD?= =?us-ascii?q?wMUAQYDAgQNARcBFAoDFAESGgKCCksBgwcFCkKLIJwKfzKBAYNNARYBDgmEO4F?= =?us-ascii?q?jDQIUgReFcFNIgm4Ig3ACJxCBVUSBFYIkUW6BT3wXAQEBAQGBOwEBCIMvgmQEg?= =?us-ascii?q?yEmDj4BAQ0+FQIYCQoBKQEBFwk3AQkJEQoLAQoZKwUBA0oLEScCA5EUIw6MQ4o?= =?us-ascii?q?4k1drLQeDK4ExBguHZoEVjEWHe4NlgUiKG4ZEkGkhlXCCHoVbfIEGBQmBdEGFf?= =?us-ascii?q?I00JxOFHYFNKoFMGw8HMxowgngBAQExCRZKDleNIQEzFoEEAQgBgkKCUROBPDk?= =?us-ascii?q?7hUtAMgIBATQCBgEKAQEDCYEIAQEFEwsBhgItghgBAQ?= X-IPAS-Result: =?us-ascii?q?A0DnAAASaxphmCIeaIFahAVZQQFkVzoxhEeJBIZFgiSDKIV?= =?us-ascii?q?1hleNHANPEAEDAQ0qAQ4FAQIEAQGEeoJUAh4GAQUzEwECBBUBAQUBAQECAQMDB?= =?us-ascii?q?AETAQEBAQEBAQEJCxAGOiSFaA2CNQwMAwODdwEYAQgEBmUUDwMUAQYDAgQNARc?= =?us-ascii?q?BFAoDFAESGgKCCksBgwcFCkKLIJwKfzKBAYNNARYBDgmEO4FjDQIUgReFcFNIg?= =?us-ascii?q?m4Ig3ACJxCBVUSBFYIkUW6BT3wXAQEBAQGBOwEBCIMvgmQEgyEmDj4BAQ0+FQI?= =?us-ascii?q?YCQoBKQEBFwk3AQkJEQoLAQoZKwUBA0oLEScCA5EUIw6MQ4o4k1drLQeDK4ExB?= =?us-ascii?q?guHZoEVjEWHe4NlgUiKG4ZEkGkhlXCCHoVbfIEGBQmBdEGFfI00JxOFHYFNKoF?= =?us-ascii?q?MGw8HMxowgngBAQExCRZKDleNIQEzFoEEAQgBgkKCUROBPDk7hUtAMgIBATQCB?= =?us-ascii?q?gEKAQEDCYEIAQEFEwsBhgItghgBAQ?= X-IronPort-AV: E=Sophos;i="5.84,326,1620684000"; d="scan'208,217";a="399489866" X-MGA-submission: =?us-ascii?q?MDFcUtFfUVA4lcM+O+GkbzVyCFG47uNcO2c8eN?= =?us-ascii?q?Arq7Lgm8EUs5+CGMXxcdUgs/TjL5AeHbn8Ovp0/k3kLGLnw1dPEQYinH?= =?us-ascii?q?jTrlwF/lkoUzDB3aXgP9MUWyNgfuMlwEzDIAFoCcv+f07k0VegPTq2fX?= =?us-ascii?q?WeXMBSBhyiNbqMOabnvQNUAg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 16 Nov 2021 09:41:15 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9F7C35605C2; Tue, 16 Nov 2021 09:41:14 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 16 Nov 2021 09:41:02 +0100 Message-ID: <875yssze5d.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 16 09:41:15 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.001810, queueID=E0C1F5605C3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMDkgdG8gMTYsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkVhcmx5 IHByZXZpZXcgb2YgdGhlIEFsZ29yaXRobWljIHdpdGggT0NhbWwgQm9vaw0KcHltbF9iaW5kZ2Vu OiBhIENMSSBhcHAgdG8gZ2VuZXJhdGUgUHl0aG9uIGJpbmRpbmdzIGRpcmVjdGx5IGZyb20gT0Nh bWwgdmFsdWUgc3BlY2lmaWNhdGlvbnMNCm9jYW1sLXdheWxhbmQgKHB1cmUgT0NhbWwgd2F5bGFu ZCBwcm90b2NvbCBsaWJyYXJ5KQ0KU2V0IHVwIE9DYW1sIDIuMC4wLWJldGE2DQpTZXQgdXAgT0Nh bWwgMi4wLjAtYmV0YTcNClNldCB1cCBPQ2FtbCAyLjAuMC1iZXRhOA0KcGh5bG9nZW5ldGljcywg YSBsaWJyYXJ5IGZvciBtb2xlY3VsYXIgZXZvbHV0aW9uDQpyZWxlYXNlIG9mIHN2bXdyYXA6IGEg d3JhcHBlciBhcm91bmQgbGlic3ZtLXRvb2xzDQpHZW9QdWIgLSBBIFhNUFAgd2ViIGNsaWVudA0K T2xkIENXTg0KDQoNCkVhcmx5IHByZXZpZXcgb2YgdGhlIEFsZ29yaXRobWljIHdpdGggT0NhbWwg Qm9vaw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9lYXJseS1wcmV2aWV3LW9mLXRoZS1hbGdvcml0aG1p Yy13aXRoLW9jYW1sLWJvb2svODc4NS8xPg0KDQoNCkRhbWllbiBHdWljaGFyZCBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFBsZWFzZSByZXBvcnQgYnVncywgYmFkIEVuZ2xpc2gg JiBub25zZW5zZXMuICBCdXQgZG8gbm90IHJlcG9ydA0KICBvbWlzc2lvbnMgKGl0IGlzIHdvcmst aW4tcHJvZ3Jlc3MgcGx1cyBpdCdzIG5vdCBhbiBvY2FtbCBiaWJsZSkuDQoNCiAgPGh0dHBzOi8v d3d3LmNqb2ludC5jb20vYy9LS2p1bEkxRHgwMz4NCg0KICBXaHkgdGhlIGJvb2sgaXMgbm90IGJv dHRvbSB1cCwgaW5zdGVhZCBzb21lIGNvbmNlcHRzIGFyZSB1c2VkIHdpdGhvdXQNCiAgZXhwbGFp bmVkID8NCg0KICDigKIgQmVjYXVzZSBzb21lIG5vdGlvbnMgKHdoYXQgaXMgdGhlIGB1bml0JyB0 eXBlID8gd2hhdCBpcyBhIHF1ZXVlID8pDQogICAgYXJlIGNvbnNpZGVyZWQgZWFzeS1lbm91Z2gg dG8gZ28gd2l0aG91dCBzYXlpbmcuDQoNCiAgV2hhdCB3aWxsIGJlIGluIHRoZSBtaXNzaW5nIGNo YXB0ZXIgNiA/DQoNCiAg4oCiIFR5cGUgcG9seW1vcnBoaXNtLCB1bml2ZXJzYWwgcXVhbnRpZmlj YXRpb24sIGBTdGRsaWIuY29tcGFyZScsIHdlYWsNCiAgICBwb2x5bW9ycGhpc20sIGNvbnN0cmFp bmVkIHBvbHltb3JwaGlzbSwgcGhhbnRvbSB0eXBlcywgdHlwZQ0KICAgIHZhcmlhbmNlLg0KDQog IFdoYXQgd2lsbCBiZSBpbiB0aGUgY2hhcHRlcnMgMTIgYW5kIG1vcmUgPw0KICDigKIgSGlnaCBw ZXJmb3JtYW5jZSBsZXhpbmcNCiAg4oCiIFJlY3Vyc2l2ZS1kZXNjZW50IHBhcnNpbmcNCiAg4oCi IFRoZSBhcnQgb2Ygc2VhcmNoaW5nDQogIOKAoiBEZXRhaWxlZCBjb25zdHJ1Y3Rpb24gb2YgdGhl IEVSaWMgMC4zIGFwcGxpY2F0aW9uDQoNCiAgV2lsbCB0aGUgc291cmNlIGZpbGVzIGdvIHRvIGEg cmVwb3NpdG9yeSA/DQoNCiAg4oCiIE5vLiBUaGUgc291cmNlIGZpbGVzIGFyZSBhbHJlYWR5IGlu Y2x1ZGVkIGluIHRoZSB6aXAgYXJjaGl2ZS4NCg0KDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0 byBnZW5lcmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVj aWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHlt bC1iaW5kZ2VuLWEtY2xpLWFwcC10by1nZW5lcmF0ZS1weXRob24tYmluZGluZ3MtZGlyZWN0bHkt ZnJvbS1vY2FtbC12YWx1ZS1zcGVjaWZpY2F0aW9ucy84Nzg2LzE+DQoNCg0KUnlhbiBNb29yZSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEkgd2FudGVkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNl IG9mIFtweW1sX2JpbmRnZW5dLCBhIENMSSBhcHANCiAgZm9yIGdlbmVyYXRpbmcgUHl0aG9uIGJp bmRpbmdzIHVzaW5nIFtweW1sXSBkaXJlY3RseSBmcm9tIE9DYW1sIHZhbHVlDQogIHNwZWNpZmlj YXRpb25zLg0KDQogIE1hbnVhbGx5IHdyaXRpbmcgYmluZGluZ3MgdG8gUHl0aG9uIGxpYnJhcmll cyBjYW4gZ2V0IHRlZGlvdXMgcHJldHR5DQogIHF1aWNrbHkuICBgcHltbF9iaW5kZ2VuJyBhaW1z IHRvIGhlbHAgeW91IGF2b2lkIGEgbG90IG9mIHRoZQ0KICByZXBldGl0aXZlIHdvcmsgd2hlbiBi aW5kaW5nIFB5dGhvbiBsaWJyYXJpZXMgYnkgbGV0dGluZyB5b3UgZm9jdXMgb24NCiAgdGhlIE9D YW1sIHNpZGUgb2YgdGhpbmdzIGFuZCAobW9zdGx5KSBub3Qgd29ycnlpbmcgYWJvdXQgdGhlDQog IGltcGxlbWVudGF0aW9uIG9mIHRoZSBweW1sIGJpbmRpbmdzLg0KDQoNCltweW1sX2JpbmRnZW5d IDxodHRwczovL2dpdGh1Yi5jb20vbW9vcmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuPg0KDQpb cHltbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS90aGllcnJ5LW1hcnRpbmV6L3B5bWwvPg0KDQpRdWlj ayBzdGFydA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRmlyc3QsIGlu c3RhbGwgYHB5bWxfYmluZGdlbicuICBJdCBpcyBhdmFpbGFibGUgb24gW09wYW1dLg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIGluc3RhbGwgcHltbF9iaW5kZ2VuDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIFNheSB5b3UgaGF2ZSBhIFB5dGhvbiBjbGFzcyB5b3Ugd2FudCB0byBi aW5kIGFuZCB1c2UgaW4gT0NhbWwuDQogIChGaWxlbmFtZTogYGFkZGVyLnB5JykNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIGNsYXNzIEFkZGVyOg0KICDilIIgICAgIEBzdGF0aWNtZXRob2QN CiAg4pSCICAgICBkZWYgYWRkKHgsIHkpOg0KICDilIIgCXJldHVybiB4ICsgeQ0KICDilJTilIDi lIDilIDilIANCg0KICBUbyBkbyBzbywgeW91IHdyaXRlIE9DYW1sIHZhbHVlIHNwZWNpZmljYXRp b25zIGZvciB0aGUgY2xhc3MgYW5kDQogIG1ldGhvZHMgeW91IHdhbnQgdG8gYmluZC4gIChGaWxl bmFtZTogYHZhbF9zcGVjcy50eHQnKQ0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdmFsIGFk ZCA6IHg6aW50IC0+IHk6aW50IC0+IHVuaXQgLT4gaW50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IFRoZW4sIHlvdSBydW4gYHB5bWxfYmluZGdlbicuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giAkIHB5bWxfYmluZGdlbiB2YWxfc3BlY3MudHh0IGFkZGVyIEFkZGVyIC0tY2FtbC1tb2R1bGUg QWRkZXIgPiBsaWIubWwNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTm93IHlvdSBjYW4gdXNlIHlv dXIgZ2VuZXJhdGVkIGZ1bmN0aW9ucyBpbiB5b3VyIE9DYW1sIGNvZGUuDQogIChGaWxlbmFtZTog YHJ1bi5tbCcpDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIExpYg0KICDilIIgDQog IOKUgiBsZXQgKCkgPSBQeS5pbml0aWFsaXplICgpDQogIOKUgiANCiAg4pSCIGxldCByZXN1bHQg PSBBZGRlci5hZGQgfng6MSB+eToyICgpDQogIOKUgiANCiAg4pSCIGxldCAoKSA9IGFzc2VydCAo cmVzdWx0ID0gMykNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRmluYWxseSwgc2V0IHVwIGEgZHVu ZSBmaWxlIGFuZCBydW4gaXQuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoZXhlY3V0YWJs ZQ0KICDilIIgIChuYW1lIHJ1bikNCiAg4pSCICAobGlicmFyaWVzIHB5bWwpKQ0KICDilJTilIDi lIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgZHVuZSBleGVjIC4vcnVuLmV4 ZQ0KICDilJTilIDilIDilIDilIANCg0KDQpbT3BhbV0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcv cGFja2FnZXMvcHltbF9iaW5kZ2VuLz4NCg0KDQpEb2N1bWVudGF0aW9uDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBp bnN0YWxsaW5nIGFuZCB1c2luZyBgcHltbF9iaW5kZ2VuJywgY2hlY2sgb3V0DQogIHRoZSBbZG9j c10uICBUaGVyZSB5b3Ugd2lsbCBmaW5kIGxvdHMgb2YgdGlwcyBhbmQgZXhhbXBsZXMgdG8gaGVs cCB5b3UNCiAgZ2V0IHN0YXJ0ZWQhDQoNCg0KW2RvY3NdIDxodHRwczovL21vb3Jlcnlhbi5naXRo dWIuaW8vb2NhbWxfcHl0aG9uX2JpbmRnZW4vPg0KDQoNCm9jYW1sLXdheWxhbmQgKHB1cmUgT0Nh bWwgd2F5bGFuZCBwcm90b2NvbCBsaWJyYXJ5KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb2NhbWwtd2F5bGFuZC1wdXJlLW9jYW1sLXdheWxhbmQtcHJvdG9jb2wtbGlicmFyeS83 NjE2LzI+DQoNCg0KVGhvbWFzIExlb25hcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBvY2FtbC13YXlsYW5kIGhhcyBiZWVuIHZlcnkgc3RhYmxlIG92ZXIgdGhlIGxhc3QgZmV3IG1v bnRocyBhbmQgc28NCiAgSSd2ZSBub3cgcmVsZWFzZWQgW3ZlcnNpb24gMS4wXS4gVGhlIG1haW4g Y2hhbmdlcyBhcmUgaW1wcm92ZWQgZXJyb3INCiAgaGFuZGxpbmcgYW5kIGRpYWdub3N0aWNzLg0K DQogIEkndmUgYmVlbiB1c2luZyB0aGlzIHRvIHdyaXRlIGFuIFh3YXlsYW5kIGFkYXB0b3IsIHdo aWNoIGFjdHMgYXMgYW4NCiAgWDExIHdpbmRvdyBtYW5hZ2VyIHRvIFh3YXlsYW5kLCBjb252ZXJ0 aW5nIGJldHdlZW4gdGhlIHR3bw0KICBwcm90b2NvbHMuIFRoaXMgYWxsb3dzIHJ1bm5pbmcgWDEx IGFwcHMgaW4gVk1zIGFuZCBoYXZpbmcgdGhlbSBhcHBlYXINCiAgYWxvbmdzaWRlIG90aGVyIGFw cGxpY2F0aW9uIHdpbmRvd3Mgb24gdGhlIGhvc3QuIEl0IGNhbiBhbHNvIGJlIHVzZWQNCiAgdG8g Zml4IG90aGVyIHByb2JsZW1zLCBzdWNoIGFzIHN1cHBvcnQgZm9yIEhpRFBJIHNjcmVlbnMgYW5k IFN3YXkncw0KICBidWdneSBjbGlwYm9hcmQgc3VwcG9ydDoNCg0KICA8aHR0cHM6Ly9yb3NjaWR1 cy5jb20vYmxvZy9ibG9nLzIwMjEvMTAvMzAveHdheWxhbmQvPg0KDQoNClt2ZXJzaW9uIDEuMF0N CjxodHRwczovL2dpdGh1Yi5jb20vdGFsZXg1L29jYW1sLXdheWxhbmQvcmVsZWFzZXMvdGFnL3Yx LjA+DQoNCg0KU2V0IHVwIE9DYW1sIDIuMC4wLWJldGE2DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zZXQtdXAtb2NhbWwt Mi0wLTAtYmV0YTYvODc5NS8xPg0KDQoNClNvcmEgTW9yaW1vdG8gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KQ2hhbmdlZA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFVubG9jayBv cGFtIDIuMSBvbiB0aGUgVWJ1bnR1IGFuZCBtYWNPUyBydW5uZXJzLg0KDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcmVsZWFzZXMvdGFnL3YyLjAuMC1iZXRhNj4NCg0K DQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YTcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldC11cC1vY2FtbC0yLTAtMC1i ZXRhNy84Nzk2LzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQpGaXhlZA0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFJldHVybiBhbiBlbXB0eSBhcnJheSB0 byBhdm9pZCBkZXBleHQgZmFpbHVyZSB3aGVuIGRlcGV4dCBmbGFncyBhcmUNCiAgICBub3QgcGFz c2VkLg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcmVsZWFzZXMv dGFnL3YyLjAuMC1iZXRhNz4NCg0KDQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YTgNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXNldC11cC1vY2FtbC0yLTAtMC1iZXRhOC84ODIxLzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpDaGFuZ2VkDQrilYzilYzilYzilYzilYzilYzilYwNCg0K ICDigKIgVXNlIDIuMSBtb2RlIGluc3RlYWQgb2YgMi4wIG1vZGUgb24gdGhlIFVidW50dSBhbmQg bWFjT1MgcnVubmVycy4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL3NldHVwLW9jYW1s L3JlbGVhc2VzL3RhZy92Mi4wLjAtYmV0YTg+DQoNCg0KcGh5bG9nZW5ldGljcywgYSBsaWJyYXJ5 IGZvciBtb2xlY3VsYXIgZXZvbHV0aW9uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1waHlsb2dl bmV0aWNzLWEtbGlicmFyeS1mb3ItbW9sZWN1bGFyLWV2b2x1dGlvbi84ODEyLzE+DQoNCg0KUGhp bGlwcGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0 eSBvbiBvcGFtIG9mIFtwaHlsb2dlbmV0aWNzXSwgYQ0KICBiaW9pbmZvcm1hdGljcyBsaWJyYXJ5 IGRlZGljYXRlZCB0byBbbW9sZWN1bGFyIGV2b2x1dGlvbl0gYW5kDQogIHBoeWxvZ2VueS4gSXQg cHJvdmlkZXMgYSBmZXcgYWxnb3JpdGhtcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgY2FuDQog IGJlIHVzZWZ1bCB0byBzdHVkeSBob3cgYmlvbG9naWNhbCBzZXF1ZW5jZXMgbGlrZSBwcm90ZWlu cyBvciBnZW5lcw0KICBoYXZlIGV2b2x2ZWQsIG9yIHRvIHNpbXVsYXRlIGRhdGFzZXRzIHVuZGVy IHZhcmlvdXMgZXZvbHV0aW9uYXJ5DQogIG1vZGVscy4NCg0KICBDb21tZW50cy9xdWVzdGlvbnMg d2VsY29tZWQgb24gdGhlIHJlcG8ncyBpc3N1ZSB0cmFja2VyIQ0KDQoNCltwaHlsb2dlbmV0aWNz XSA8aHR0cHM6Ly9naXRodWIuY29tL2Jpb2NhbWwvcGh5bG9nZW5ldGljcz4NCg0KW21vbGVjdWxh ciBldm9sdXRpb25dDQo8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTW9sZWN1bGFyX2V2 b2x1dGlvbj4NCg0KDQpyZWxlYXNlIG9mIHN2bXdyYXA6IGEgd3JhcHBlciBhcm91bmQgbGlic3Zt LXRvb2xzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLW9mLXN2bXdyYXAtYS13 cmFwcGVyLWFyb3VuZC1saWJzdm0tdG9vbHMvODgxOC8xPg0KDQoNClVuaXhKdW5raWUgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0eSBp biBvcGFtIG9mIHRoZSBzdm13cmFwDQogIHBhY2thZ2UuICBBIHdyYXBwZXIgYXJvdW5kIGxpYnN2 bSdzIHN2bS10cmFpbiBhbmQgc3ZtLXByZWRpY3QNCiAgZXhlY3V0YWJsZXMuICBDdXJyZW50bHks IG9ubHkgcmVncmVzc2lvbiBtb2RlbGluZyBpcyBzdXBwb3J0ZWQsIHVzaW5nDQogIHRoZSBsaW5l YXIsIFJCRiwgc2lnbW9pZCBvciBwb2x5bm9taWFsIGtlcm5lbC4NCg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL1VuaXhKdW5raWUvc3Ztd3JhcD4NCg0KICBUaGUgcXVpdGUgc2NhcnkgdXNhZ2UgbG9v a3MgbGlrZSB0aGlzOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHVzYWdlOiBzdm13cmFwDQog IOKUgiAgIC1pIDxmaWxlbmFtZT46IHRyYWluaW5nIHNldCBvciBEQiB0byBzY3JlZW4NCiAg4pSC ICAgLS1mZWF0cyA8aW50PjogbnVtYmVyIG9mIGZlYXR1cmVzDQogIOKUgiAgIFstbyA8ZmlsZW5h bWU+XTogcHJlZGljdGlvbnMgb3V0cHV0IGZpbGUNCiAg4pSCICAgWy1ucCA8aW50Pl06IG5jb3Jl cw0KICDilIIgICBbLS1rZXJuZWwgPHN0cmluZz5dIGNob29zZSBrZXJuZWwgdHlwZSB7TGlufFJC RnxTaWd8UG9sfQ0KICDilIIgICBbLWMgPGZsb2F0Pl06IGZpeCBDDQogIOKUgiAgIFstZSA8Zmxv YXQ+XTogZXBzaWxvbiBpbiB0aGUgbG9zcyBmdW5jdGlvbiBvZiBlcHNpbG9uLVNWUjsNCiAg4pSC ICAgKDAgPD0gZXBzaWxvbiA8PSBtYXhfaSh8eV9pfCkpDQogIOKUgiAgIFstZyA8ZmxvYXQ+XTog Zml4IGdhbW1hIChmb3IgUkJGIGFuZCBTaWcga2VybmVscykNCiAg4pSCICAgWy1yIDxmbG9hdD5d OiBmaXggciBmb3IgdGhlIFNpZyBrZXJuZWwNCiAg4pSCICAgWy0taXduXTogdHVybiBPTiBpbnN0 YW5jZS13aXNlLW5vcm1hbGl6YXRpb24NCiAg4pSCICAgWy0tc2NhbGVdOiB0dXJuIE9OIFswOjFd IHNjYWxpbmcgKE5PVCBQUk9EVUNUSU9OIFJFQURZKQ0KICDilIIgICBbLS1uby1wbG90XTogbm8g Z251cGxvdA0KICDilIIgICBbey1ufC0tTnhDVn0gPGludD5dOiBmb2xkcyBvZiBjcm9zcyB2YWxp ZGF0aW9uDQogIOKUgiAgIFstcV06IHF1aWV0DQogIOKUgiAgIFstdnwtLXZlcmJvc2VdOiBlcXVp dmFsZW50IHRvIG5vdCBzcGVjaWZ5aW5nIC1xDQogIOKUgiAgIFstLXNlZWQgPGludD5dOiBmaXgg cmFuZG9tIHNlZWQNCiAg4pSCICAgWy1wIDxmbG9hdD5dOiB0cmFpbmluZyBzZXQgcG9ydGlvbiAo aW4gWzAuMDoxLjBdKQ0KICDilIIgICBbLS1wYWlyc106IHJlYWQgZnJvbSAuQVAgZmlsZXMgKGF0 b20gcGFpcnM7IHdpbGwgb2Zmc2V0IGZlYXQuIGluZGV4ZXMgYnkgMSkNCiAg4pSCICAgWy0tdHJh aW4gPHRyYWluLmxpYmxpbj5dOiB0cmFpbmluZyBzZXQgKG92ZXJyaWRlcyAtcCkNCiAg4pSCICAg Wy0tdmFsaWQgPHZhbGlkLmxpYmxpbj5dOiB2YWxpZGF0aW9uIHNldCAob3ZlcnJpZGVzIC1wKQ0K ICDilIIgICBbLS10ZXN0IDx0ZXN0LmxpYmxpbj5dOiB0ZXN0IHNldCAob3ZlcnJpZGVzIC1wKQ0K ICDilIIgICBbey1sfC0tbG9hZH0gPGZpbGVuYW1lPl06IHByb2QuIG1vZGU7IHVzZSB0cmFpbmVk IG1vZGVscw0KICDilIIgICBbey1zfC0tc2F2ZX0gPGZpbGVuYW1lPl06IHRyYWluLiBtb2RlOyBz YXZlIHRyYWluZWQgbW9kZWxzDQogIOKUgiAgIFstZl06IGZvcmNlIG92ZXJ3cml0aW5nIGV4aXN0 aW5nIG1vZGVsIGZpbGUNCiAg4pSCICAgWy0tc2Nhbi1jXTogc2NhbiBmb3IgYmVzdCBDDQogIOKU giAgIFstLXNjYW4tZSA8aW50Pl06IGVwc2lsb24gc2NhbiAjc3RlcHMgZm9yIFNWUg0KICDilIIg ICBbLS1zY2FuLWddOiBzY2FuIGZvciBiZXN0IGdhbW1hDQogIOKUgiAgIFstLXJlZ3JdOiByZWdy ZXNzaW9uIChTVlIpOyBhbHNvLCBpbXBsaWVkIGJ5IC1lIGFuZCAtLXNjYW4tZQ0KICDilIIgICBb LS1lLXJhbmdlIDxmbG9hdD46PGludD46PGZsb2F0Pl06IHNwZWNpZmljIHJhbmdlIGZvciBlDQog IOKUgiAgIChzZW1hbnRpYz1zdGFydDpuc3RlcHM6c3RvcCkNCiAg4pSCICAgWy0tYy1yYW5nZSA8 ZmxvYXQsZmxvYXQsLi4uPl0gZXhwbGljaXQgc2NhbiByYW5nZSBmb3IgQw0KICDilIIgICAoZXhh bXBsZT0nMC4wMSwwLjAyLDAuMDMnKQ0KICDilIIgICBbLS1nLXJhbmdlIDxmbG9hdCxmbG9hdCwu Li4+XSBleHBsaWNpdCByYW5nZSBmb3IgZ2FtbWENCiAg4pSCICAgKGV4YW1wbGU9JzAuMDEsMC4w MiwwLjAzJykNCiAg4pSCICAgWy0tci1yYW5nZSA8ZmxvYXQsZmxvYXQsLi4uPl0gZXhwbGljaXQg cmFuZ2UgZm9yIHINCiAg4pSCICAgKGV4YW1wbGU9JzAuMDEsMC4wMiwwLjAzJykNCiAg4pSU4pSA 4pSA4pSA4pSADQoNCiAgRm9yIHBlb3BsZSB3aG8ga25vdyBteSBsaW53cmFwIG9wYW0gcGFja2Fn ZSAoYSB3cmFwcGVyIGFyb3VuZA0KICBsaWJsaW5lYXIgdG9vbHMpLCB0aGlzIGlzIHF1aXRlIHNp bWlsYXIuDQogIDxodHRwczovL2dpdGh1Yi5jb20vVW5peEp1bmtpZS9saW53cmFwPg0KDQoNCkdl b1B1YiAtIEEgWE1QUCB3ZWIgY2xpZW50DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1nZW9wdWItYS14bXBwLXdl Yi1jbGllbnQvODgxOS8xPg0KDQoNCnB1a2thbXVzdGFyZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknZCBsaWtlIHRvIGFubm91bmNlIGFuIGluaXRpYWwsIHByb29mLW9mLWNvbmNlcHQgcmVs ZWFzZSBvZiBHZW9QdWIgLQ0KICBhbiBYTVBQIHdlYiBjbGllbnQuIFVubGlrZSBtYW55IFhNUFAg Y2xpZW50cyB0aGUgZm9jdXMgaXMgbm90IG9uDQogIGluc3RhbnQgbWVzc2FnaW5nIGJ1dCBvbiBj cmVhdGluZywgZGlzcGxheWluZyBhbmQgbWFuYWdpbmcgdGhpbmdzIHN1Y2gNCiAgYXMgZXZlbnRz LCBtYXBzLCBpbmZvcm1hdGlvbiBvbiBsb2NhbCBvcmdhbml6YXRpb25zIGFuZCBvdGhlciBsb2Nh bA0KICBrbm93bGVkZ2UgKHNlZSBbdGhlIG9wZW5FbmdpYWRpbmFdIHByb2plY3QgZm9yIHRoZSBj b250ZXh0KS4NCg0KICBUaGlzIGluaXRpYWwgcmVsZWFzZSBpcyBub3QgcmVhbGx5IGFueXRoaW5n IHVzZWZ1bCBidXQgYQ0KICBwcm9vZi1vZi1jb25jZXB0IGhvdyBzdWNoIGFuIGFwcGxpY2F0aW9u IGNhbiBiZSBkZXZlbG9wZWQgdXNpbmcgWE1QUA0KICBhbmQgT0NhbWwuIFRoZXJlIGFyZSBtYW55 IHJvdWdoIGVkZ2VzIGFuZCBicm9rZW4gaGFja3MgdGhhdCBuZWVkDQogIGZpeGluZy4gSSdkIGJl IHZlcnkgZ3JhdGVmdWwgZm9yIHlvdXIgZmVlZGJhY2ssIHRob3VnaHRzIGFuZCBpZGVhcy4NCg0K ICBUaGUgc291cmNlIGNvZGUgb2YgdGhlIGFwcCBpcyBvbiBbY29kZWJlcmddIGFuZCBhIHByZS1i dWlsdCBob3N0ZWQNCiAgdmVyc2lvbiBpcyBhdmFpbGFibGUgW2hlcmVdLg0KDQogIFRoZSBhcHBs aWNhdGlvbiBjb25zaXN0cyBvZiBzb21lIHBhcnRzIGFuZCBpZGVhcyB0aGF0IEknZCBsaWtlIHRv DQogIGlsbHVzdHJhdGUgc2VwYXJhdGVseToNCg0KDQpbdGhlIG9wZW5FbmdpYWRpbmFdIDxodHRw czovL29wZW5lbmdpYWRpbmEubmV0Pg0KDQpbY29kZWJlcmddIDxodHRwczovL2NvZGViZXJnLm9y Zy9vcGVuRW5naWFkaW5hL2dlb3B1Yj4NCg0KW2hlcmVdIDxodHRwczovL2dlb3B1Yi5vcGVuZW5n aWFkaW5hLm5ldC8+DQoNCm9jYW1sLXhtcHANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFtvY2FtbC14bXBwXSBpcyBhIFhNUFAgY2xpZW50IGxpYnJhcnkgZm9yIE9DYW1sIChk b2N1bWVudGF0aW9uDQogIGF2YWlsYWJsZSBbb25saW5lXS4NCg0KDQpbb2NhbWwteG1wcF0gPGh0 dHBzOi8vY29kZWJlcmcub3JnL29wZW5FbmdpYWRpbmEvb2NhbWwteG1wcD4NCg0KW29ubGluZV0g PGh0dHBzOi8vaW5xbGFiLm5ldC9wcm9qZWN0cy9vY2FtbC14bXBwLz4NCg0KUmVhY3RpdmUNCuKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIG9jYW1sLXhtcHAgaXMgcmVhY3RpdmUgaW4gdGhl IHNlbnNlIHRoYXQgdGhlIFhNUFAgY29ubmVjdGlvbiBpcw0KICBhYnN0cmFjdGVkIGFzIGEgUmVh Y3QgZXZlbnQgb2YgU3RhbnphcyAoc21hbGwgcGllY2VzIG9mIGluZm9ybWF0aW9uDQogIHRoYXQg ZmxvdyBvdmVyIFhNUFApOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdmFsIHN0YW56YXMg OiB0IC0+IFN0YW56YS50IFJlYWN0LmV2ZW50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg UmVhY3QgZXZlbnQgY2FuIGJlIGZpbHRlcmVkIGZvciBtZXNzYWdlcyBpbiBhIHNwZWNpZmljDQog IGNvbnZlcnNhdGlvbiwgZm9yIGV4YW1wbGUuDQoNCg0KVHJhbnNwb3J0cw0K4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgWE1QUCB3b3JrcyB3aXRoIGRpZmZlcmVudCB0cmFuc3Bv cnQgbWVjaGFuaXNtcyBhbmQgb2NhbWwteG1wcCBzdXBwb3J0cw0KICB0aGlzLiBDdXJyZW50bHkg b2NhbWwteG1wcCBjYW4gYmUgdXNlZCBmcm9tIFVuaXggd2l0aCBhIFRDUC9TU0wNCiAgY29ubmVj dGlvbiB0byBhIFhNUFAgc2VydmVyIGFuZCBmcm9tIHdlYiBicm93c2VycyB3aXRoIGEgV2ViU29j a2V0DQogIGNvbm5lY3Rpb24uIFRoaXMgaXMgaW1wbGVtZW50ZWQgYnkgYWJzdHJhY3RpbmcgdGhl IFhNUFAgdHJhbnNwb3J0Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIHR5cGUg VFJBTlNQT1JUID0gc2lnDQogIOKUgiAgICgqKiB7MiBDb25uZWN0aW9ufSAqKQ0KICDilIIgDQog IOKUgiAgIHR5cGUgb3B0aW9ucw0KICDilIIgICAoKiogQWRkaXRpb25hbCBvcHRpb25zIHRoYXQg bWF5IGJlIHBhc3NlZCB0byB0aGUgdHJhbnNwb3J0ICopDQogIOKUgiANCiAg4pSCICAgdHlwZSB0 DQogIOKUgiAgICgqKiBUeXBlIG9mIGFuIGluc3RhbnRpYXRlZCBjb25uZWN0aW9uIHRvIGFuIFhN UFAgc2VydmVyICopDQogIOKUgiANCiAg4pSCICAgdmFsIGNvbm5lY3QgOiBob3N0OnN0cmluZyAt PiBvcHRpb25zIC0+IHQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgY2xvc2UgOiB0IC0+IHVu aXQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgY2xvc2VkIDogdCAtPiB1bml0IEx3dC50DQog IOKUgiANCiAg4pSCICAgKCoqIHsyIFhNTCBTdHJlYW19ICopDQogIOKUgiANCiAg4pSCICAgdHlw ZSBzdHJlYW0NCiAg4pSCIA0KICDilIIgICB2YWwgb3Blbl9zdHJlYW0gOiB0IC0+IHRvJzpzdHJp bmcgLT4gc3RyZWFtIEx3dC50DQogIOKUgiANCiAg4pSCICAgdmFsIHN0cmVhbV9pZCA6IHN0cmVh bSAtPiBzdHJpbmcgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgc2VuZF94bWwgOiBzdHJlYW0g LT4gWG1sYy50IC0+IHVuaXQgTHd0LnQNCiAg4pSCIA0KICDilIIgICB2YWwgc2lnbmFscyA6IHN0 cmVhbSAtPiBYbWxjLnNpZ25hbCBMd3Rfc3RyZWFtLnQNCiAg4pSCIA0KICDilIIgICB2YWwgc3Rv cF9zdHJlYW0gOiBzdHJlYW0gLT4gdW5pdCBMd3QudA0KICDilIIgZW5kDQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEEgdHJhbnNwb3J0IGVzdGFibGlzaGVzIHRoZSB1bmRlcmx5aW5nIGNvbm5lY3Rp b24gdG8gYSBzZXJ2ZXIgYW5kIGNhbg0KICBjcmVhdGUgWE1MIHN0cmVhbXMgKGluIFhNUFAgYSBj b25uZWN0aW9uIGlzIGJ5IG11bHRpcGxlIFhNTCBzdHJlYW1zDQogIHNlcXVlbnRpYWxseSkuIEZv ciB0ZWNobmljYWwgcmVhc29ucyBYTUwgcGFyc2luZyBpcyBhbHNvIGhhbmRsZWQgYnkNCiAgdGhl IHRyYW5zcG9ydCBhbmQgYSBzdHJlYW0gb2YgWE1MIHNpZ25hbHMgKGVsZW1lbnQgc3RhcnQsIGRh dGEsDQogIGVsZW1lbnQgZW5kKSBpcyByZXR1cm5lZC4gVGhpcyBpcyBkdWUgdG8gdGhlIGZhY3Qg dGhhdCBYTUwgcGFyc2luZyBpbg0KICBYTVBQIG5lZWRzIHRvIGJlIGRvbmUgc2xpZ2h0bHkgZGlm ZmVyZW50bHkgd2hlbiB1c2luZyBUQ1AgKGEgc2luZ2xlDQogIFhNTCBkb2N1bWVudCBvdmVyIHRo ZSBlbnRpcmUgc3RyZWFtKSBvciBXZWJTb2NrZXRzIChldmVyeSBXZWJTb2NrZXQNCiAgZnJhbWUg aXMgYSBwYXJzZS1hYmxlIFhNTCBkb2N1bWVudCkuDQoNCiAgVGhlIFVuaXgvVENQL1NTTCB0cmFu c3BvcnQgdXNlcyBNYXJrdXAubWwgYW5kIHdoZXJlYXMgdGhlIFdlYlNvY2tldA0KICB0cmFuc3Bv cnQgdXNlcyBYbWxtIChhbmQgQnJycikuDQoNCg0KUGFyc2VyIGNvbWJpbmF0b3JzIGZvciBYTUwN CuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIEZvciBwYXJzaW5nIHN0cmVhbXMgb2YgWE1MIHNp Z25hbHMgdG8gT0NhbWwgdHlwZXMgb2NhbWwteG1wcCBjb250YWlucw0KICBhIHBhcnNlciBjb21i aW5hdG9yIGhlbHBlciBsaWJyYXJ5OiBbWG1sY10uIFRoaXMgYWxsb3dzIHBhcnNlciBmb3IgWE1M DQogIHN1Y2ggYXMgdGhpczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIDxiaW5kIHhtbG5z PSd1cm46aWV0ZjpwYXJhbXM6eG1sOm5zOnhtcHAtYmluZCc+PGppZD53NGl1NGNrbjNramJxdmNk QGRlbW8ub3BlbmVuZ2lhZGluYS5uZXQvejhQa3pmYTg8L2ppZD48L2JpbmQ+DQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIHRvIGJlIHBhcnNlcyBsaWtlIHRoaXM6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBYbWxjLlBhcnNlci4oDQogIOKUgiAgIGVsZW1lbnQgKE5zLmJpbmQgImJpbmQiKSAo ZnVuIF8gLT4NCiAg4pSCICAgICBlbGVtZW50IChOcy5iaW5kICJqaWQiKSAoZnVuIF8gLT4NCiAg 4pSCICAgICAgIHRleHQgPj58IFN0cmluZy5jb25jYXQgIiIgPj49IGZ1biBqaWRfcyAtPg0KICDi lIIgICAgICAgbWF0Y2ggSmlkLm9mX3N0cmluZyBqaWRfcyB3aXRoDQogIOKUgiAgICAgICB8IFNv bWUgamlkIC0+IHJldHVybiBqaWQNCiAg4pSCICAgICAgIHwgTm9uZSAtPiBmYWlsX3dpdGggImlu dmFsaWQgSklEIikpKQ0KICDilJTilIDilIDilIDilIANCg0KDQpbWG1sY10gPGh0dHBzOi8vaW5x bGFiLm5ldC9wcm9qZWN0cy9vY2FtbC14bXBwL3htbGMvWG1sYy9pbmRleC5odG1sPg0KDQoNClhN UFAgZXh0ZW5zaW9ucw0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSEDQoNCiAgSW5zcGlyYXRpb24gZm9yIHRoZSBzY29wZSBvZiB0aGUgY29yZSBsaWJyYXJ5IGlz IHRha2VuIGZyb20gdGhlDQogIFtTdHJvcGhlXSBYTVBQIGxpYnJhcmllcyAtIGV2ZXJ5dGhpbmcg dGhhdCBkb2VzIG5vdCBoYXZlIGRpcmVjdGx5IHRvDQogIGRvIHdpdGggWE1QUCB0cmFuc3BvcnQs IGF1dGhlbnRpY2F0aW9uIG9yIHN0cmVhbSBtYW5hZ2VtZW50IGlzIGtlcHQNCiAgb3V0c2lkZSBv ZiB0aGUgY29yZSBsaWJyYXJ5Lg0KDQogIFRoZXJlIGFyZSBhbHJlYWR5IHNvbWUgImV4dGVuc2lv biIgbGlicmFyaWVzIG91dHNpZGUgb2YgdGhlIGNvcmUgZm9yDQogIHVzZWZ1bCBYTVBQIGZlYXR1 cmVzIChlLmcuIFtSb3N0ZXIgbWFuYWdlbWVudF0sIFtQdWJTdWJdIGFuZA0KICBbcGluZ2luZ10p Lg0KDQogIE9uZSB0aGluZyB0aGF0IEkgZG8gd2FudCB0byBhZGQgdG8gdGhlIGNvcmUgbGlicmFy eSBpcyBzdHJlYW0NCiAgbWFuYWdlbWVudCBhY2NvcmRpbmcgdG8gW1hFUC0wMTk4XS4gSSBleHBl Y3QgdGhpcyBhZGRpdGlvbiB0byBjaGFuZ2UNCiAgdGhlIGNvcmUgbGlicmFyeSBBUEkgLSB0aGUg QVBJIGlzIG5vdCBzdGFibGUgeWV0IQ0KDQogIE11Y2ggaW5zcGlyYXRpb24gd2FzIHRha2VuIGZy b20gW0phY2tsaW5lXSAtIGFuIE9DYW1sIFhNUFAgY2xpZW50IC0NCiAgYW5kIGluIHBhcnRpY3Vs YXIgW3RoaXMgcG9zdF0gb24gSmFja2xpbmUuIE1hbnkgdGhhbmtzIHRvIEBoYW5uZXMuDQoNCg0K W1N0cm9waGVdIDxodHRwOi8vc3Ryb3BoZS5pbS8+DQoNCltSb3N0ZXIgbWFuYWdlbWVudF0NCjxo dHRwczovL2lucWxhYi5uZXQvcHJvamVjdHMvb2NhbWwteG1wcC94bXBwL1htcHBfcm9zdGVyL2lu ZGV4Lmh0bWw+DQoNCltQdWJTdWJdDQo8aHR0cHM6Ly9pbnFsYWIubmV0L3Byb2plY3RzL29jYW1s LXhtcHAveG1wcC9YbXBwX3B1YnN1Yi9pbmRleC5odG1sPg0KDQpbcGluZ2luZ10NCjxodHRwczov L2lucWxhYi5uZXQvcHJvamVjdHMvb2NhbWwteG1wcC94bXBwL1htcHBfcGluZy9pbmRleC5odG1s Pg0KDQpbWEVQLTAxOThdIDxodHRwczovL3htcHAub3JnL2V4dGVuc2lvbnMveGVwLTAxOTguaHRt bD4NCg0KW0phY2tsaW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL2hhbm5lc20vamFja2xpbmU+DQoN Clt0aGlzIHBvc3RdIDxodHRwczovL2hhbm5lcy5ucXNiLmlvL1Bvc3RzL0phY2tsaW5lPg0KDQoN CnJlYWN0b3INCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEdlb1B1YiB1c2VzIEJyci4gSSBo YWQgc29tZSB0cm91YmxlIGZpZ3VyaW5nIG91dCBhIHN1aXRhYmxlDQogICJhcmNoaXRlY3R1cmUi IGZvciBtYW5hZ2luZyBjb21wbGV4IGxvZ2ljIGFuZCBlbmRlZCB1cCBoYWNraW5nIGFuDQogIFtF bG1dIGluc3BpcmVkIGhlbHBlciBsaWJyYXJ5OiBbcmVhY3Rvci5tbGldLiBTdGF0ZSB1cGRhdGVz IGZvciB0aGUNCiAgZW50aXJlIGFwcGxpY2F0aW9uIGFyZSB0aGVuIGhhbmRsZWQgaW4gYSBzaW5n bGUgW3VwZGF0ZSBmdW5jdGlvbl0uDQoNCiAgSSdtIG5vdCB5ZXQgdmVyeSBoYXBweSB3aXRoIHRo aXMgbWFjaGluZXJ5IGFuZCBJJ20gcHJldHR5IHN1cmUgSSdtDQogIHVzaW5nIHJlYWN0IGluIHdy b25nIGFuZCBkYW5nZXJvdXMgd2F5cy4gSSdkIGJlIHZlcnkgZ3JhdGVmdWwgZm9yDQogIGlkZWFz IG9uIGhvdyB0byBpbXByb3ZlIHRoaXMuIFRIaXMgbWlnaHQgYmUgcmVsYXRlZCB0byB0aGlzDQog IGRpc2N1c3Npb246DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RydWN0dXJpbmct ZnJwLXNwZWNpZmljYWxseS1ub3RlLWFwcGxpY2F0aW9ucy84NjQ1LzE3Pi4NCg0KICBUaGUgcmVh c29uIGZvciB1c2luZyBSZWFjdCBvdmVyIE5vdGUgaXMgYmVjYXVzZSBvY2FtbC14bXBwIHVzZXMg YSBsb3QNCiAgb2YgTHd0IGFuZCBgTHd0X3JlYWN0JyBwcm92aWRlcyBuaWNlIGJpbmRpbmdzIGZv ciB3b3JraW5nIHdpdGggYm90aC4gSQ0KICBndWVzcyBzb21ldGhpbmcgc2ltaWxhciBjb3VsZCBi ZSBjcmVhdGVkIGZvciBOb3RlIChlLmcuIGBMd3Rfbm90ZScpDQogIGFuZCBJJ20gb3BlbiB0byB1 c2luZyBOb3RlIChhbHNvIGluIG9jYW1sLXhtcHApLg0KDQoNCltFbG1dIDxodHRwczovL2VsbS1s YW5nLm9yZy8+DQoNCltyZWFjdG9yLm1saV0NCjxodHRwczovL2NvZGViZXJnLm9yZy9vcGVuRW5n aWFkaW5hL2dlb3B1Yi9zcmMvYnJhbmNoL21haW4vc3JjL3JlYWN0b3IvcmVhY3Rvci5tbGk+DQoN Clt1cGRhdGUgZnVuY3Rpb25dDQo8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvb3BlbkVuZ2lhZGluYS9n ZW9wdWIvc3JjL2JyYW5jaC9tYWluL3NyYy9nZW9wdWIvbWFpbi5tbCNMMjg+DQoNCg0KTGVhZmxl dA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgR2VvUHViIGRpc3BsYXlzIGEgbWFwIHVzaW5n IHRoZSBbTGVhZmxldC5qc10gSmF2YVNjcmlwdA0KICBsaWJyYXJ5LiBHZW9QdWIgY29udGFpbnMg T0NhbWwgYmluZGluZ3MgdG8gTGVhZmxldCB1c2luZyBCcnI6DQogIFtsZWFmbGV0Lm1saV0uIFdy aXRpbmcgdGhpcyB3YXMgdmVyeSBzdHJhaWdodGZvcndhcmQgYW5kIHBsZWFzYW50IChJDQogIGxp a2UgQnJyISkuDQoNCiAgT25lIGlzc3VlIEkgaGF2ZSBpcyB0aGF0IHRoZSBMZWFmbGV0IG1hcCBu ZWVkcyB0byBiZSBtYW5pcHVsYXRlZCB2ZXJ5DQogIGltcGVyYXRpdmVseSwgd2hlcmVhcyB0aGUg cmVzdCBvZiB0aGUgYXBwbGljYXRpb24gaXMgbXVjaCBtb3JlDQogIGZ1bmN0aW9uYWwuIFRoaXMg Y2F1c2VzIHNvbWUgbWlzbWF0Y2hlcy4gSSBndWVzcyBvbmUgbmVlZHMgdG8gZmluZCBhDQogIHdh eSBvZiBoaWRpbmcgdGhlIGltcHJlc3NpdmVuZXNzIG9mIExlYWZsZXQgKGUuZy4gbGlrZQ0KICBb cmVhY3QtbGVhZmxldF0pLg0KDQoNCltMZWFmbGV0LmpzXSA8aHR0cHM6Ly9sZWFmbGV0anMuY29t Lz4NCg0KW2xlYWZsZXQubWxpXQ0KPGh0dHBzOi8vY29kZWJlcmcub3JnL29wZW5FbmdpYWRpbmEv Z2VvcHViL3NyYy9icmFuY2gvbWFpbi9zcmMvbGVhZmxldC9sZWFmbGV0Lm1saT4NCg0KW3JlYWN0 LWxlYWZsZXRdIDxodHRwczovL2dpdGh1Yi5jb20vUGF1bExlQ2FtL3JlYWN0LWxlYWZsZXQ+DQoN Cg0KR3VpeCBmb3IgYnVpbGQgYW5kIGRldmVsb3BtZW50IGVudmlyb25tZW50cw0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgSSB1c2UgW0d1aXhdIGZvciBwcm92aWRpbmcgYSBidWlsZCBhbmQgZGV2ZWxv cG1lbnQgZW52aXJvbm1lbnQuIFdpdGgNCiAgZ3VpeCBpbnN0YWxsZWQgb25lIGNhbiBydW4gYGd1 aXggc2hlbGwnIGluIHRoZSBHZW9QdWIgcmVwb3NpdG9yeSB0bw0KICBnZXQgYSByZXByb2R1Y2li bGUgYnVpbGQgZW52aXJvbm1lbnQuIEFsbCBkZXBlbmRlbmNpZXMgYXJlIGZldGNoZWQgYW5kDQog IG1hZGUgYXZhaWxhYmxlIGJ5IEd1aXggaW4gdGhpcyBlbnZpcm9ubWVudCAoZS5nLiBgb2NhbWwt eG1wcCcgb3IgdGhlDQogIE9DYW1sIGNvbXBpbGVyKS4NCg0KICBJIHdpbGwgcHVibGlzaCBgb2Nh bWwteG1wcCcgb24gT1BBTSBvbmNlIHRoZSBBUEkgaXMgbW9yZSBzdGFibGUgYW5kIGFuDQogIGlu aXRpYWwgcmVsZWFzZSBjYW4gYmUgbWFkZS4NCg0KDQpbR3VpeF0gPGh0dHBzOi8vZ3VpeC5nbnUu b3JnLz4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFw cGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBt YWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0 aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0 byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29u bGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWls dG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2 ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5l XSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0K W0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 09 to 16, 2021.

Early preview of the Algorithmic with OCaml Book

Damien Guichard announced

Please report bugs, bad English & nonsenses. But do not report omissions (it is work-in-progress plus it's not an ocaml bible).

https://www.cjoint.com/c/KKjulI1Dx03

Why the book is not bottom up, instead some concepts are used without explained ?

  • Because some notions (what is the unit type ? what is a queue ?) are considered easy-enough to go without saying.

What will be in the missing chapter 6 ?

  • Type polymorphism, universal quantification, Stdlib.compare, weak polymorphism, constrained polymorphism, phantom types, type variance.

What will be in the chapters 12 and more ?

  • High performance lexing
  • Recursive-descent parsing
  • The art of searching
  • Detailed construction of the ERic 0.3 application

Will the source files go to a repository ?

  • No. The source files are already included in the zip archive.

pyml_bindgen: a CLI app to generate Python bindings directly from OCaml value specifications

Ryan Moore announced

I wanted to announce the first release of pyml_bindgen, a CLI app for generating Python bindings using pyml directly from OCaml value specifications.

Manually writing bindings to Python libraries can get tedious pretty quickly. pyml_bindgen aims to help you avoid a lot of the repetitive work when binding Python libraries by letting you focus on the OCaml side of things and (mostly) not worrying about the implementation of the pyml bindings.

Quick start

First, install pyml_bindgen. It is available on Opam.

$ opam install pyml_bindgen

Say you have a Python class you want to bind and use in OCaml. (Filename: adder.py)

class Adder:
    @staticmethod
    def add(x, y):
        return x + y

To do so, you write OCaml value specifications for the class and methods you want to bind. (Filename: val_specs.txt)

val add : x:int -> y:int -> unit -> int

Then, you run pyml_bindgen.

$ pyml_bindgen val_specs.txt adder Adder --caml-module Adder > lib.ml

Now you can use your generated functions in your OCaml code. (Filename: run.ml)

open Lib

let () = Py.initialize ()

let result = Adder.add ~x:1 ~y:2 ()

let () = assert (result = 3)

Finally, set up a dune file and run it.

(executable
 (name run)
 (libraries pyml))
$ dune exec ./run.exe

Documentation

For more information on installing and using pyml_bindgen, check out the docs. There you will find lots of tips and examples to help you get started!

ocaml-wayland (pure OCaml wayland protocol library)

Thomas Leonard announced

ocaml-wayland has been very stable over the last few months and so I've now released version 1.0. The main changes are improved error handling and diagnostics.

I've been using this to write an Xwayland adaptor, which acts as an X11 window manager to Xwayland, converting between the two protocols. This allows running X11 apps in VMs and having them appear alongside other application windows on the host. It can also be used to fix other problems, such as support for HiDPI screens and Sway's buggy clipboard support:

https://roscidus.com/blog/blog/2021/10/30/xwayland/

Set up OCaml 2.0.0-beta6

Sora Morimoto announced

Changed

  • Unlock opam 2.1 on the Ubuntu and macOS runners.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta6

Set up OCaml 2.0.0-beta7

Sora Morimoto announced

Fixed

  • Return an empty array to avoid depext failure when depext flags are not passed.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta7

Set up OCaml 2.0.0-beta8

Sora Morimoto announced

Changed

  • Use 2.1 mode instead of 2.0 mode on the Ubuntu and macOS runners.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta8

phylogenetics, a library for molecular evolution

Philippe announced

I'm happy to announce the availability on opam of phylogenetics, a bioinformatics library dedicated to molecular evolution and phylogeny. It provides a few algorithms and data structures that can be useful to study how biological sequences like proteins or genes have evolved, or to simulate datasets under various evolutionary models.

Comments/questions welcomed on the repo's issue tracker!

release of svmwrap: a wrapper around libsvm-tools

UnixJunkie announced

I am pleased to announce the availability in opam of the svmwrap package. A wrapper around libsvm's svm-train and svm-predict executables. Currently, only regression modeling is supported, using the linear, RBF, sigmoid or polynomial kernel.

https://github.com/UnixJunkie/svmwrap

The quite scary usage looks like this:

usage: svmwrap
  -i <filename>: training set or DB to screen
  --feats <int>: number of features
  [-o <filename>]: predictions output file
  [-np <int>]: ncores
  [--kernel <string>] choose kernel type {Lin|RBF|Sig|Pol}
  [-c <float>]: fix C
  [-e <float>]: epsilon in the loss function of epsilon-SVR;
  (0 <= epsilon <= max_i(|y_i|))
  [-g <float>]: fix gamma (for RBF and Sig kernels)
  [-r <float>]: fix r for the Sig kernel
  [--iwn]: turn ON instance-wise-normalization
  [--scale]: turn ON [0:1] scaling (NOT PRODUCTION READY)
  [--no-plot]: no gnuplot
  [{-n|--NxCV} <int>]: folds of cross validation
  [-q]: quiet
  [-v|--verbose]: equivalent to not specifying -q
  [--seed <int>]: fix random seed
  [-p <float>]: training set portion (in [0.0:1.0])
  [--pairs]: read from .AP files (atom pairs; will offset feat. indexes by 1)
  [--train <train.liblin>]: training set (overrides -p)
  [--valid <valid.liblin>]: validation set (overrides -p)
  [--test <test.liblin>]: test set (overrides -p)
  [{-l|--load} <filename>]: prod. mode; use trained models
  [{-s|--save} <filename>]: train. mode; save trained models
  [-f]: force overwriting existing model file
  [--scan-c]: scan for best C
  [--scan-e <int>]: epsilon scan #steps for SVR
  [--scan-g]: scan for best gamma
  [--regr]: regression (SVR); also, implied by -e and --scan-e
  [--e-range <float>:<int>:<float>]: specific range for e
  (semantic=start:nsteps:stop)
  [--c-range <float,float,...>] explicit scan range for C
  (example='0.01,0.02,0.03')
  [--g-range <float,float,...>] explicit range for gamma
  (example='0.01,0.02,0.03')
  [--r-range <float,float,...>] explicit range for r
  (example='0.01,0.02,0.03')

For people who know my linwrap opam package (a wrapper around liblinear tools), this is quite similar. https://github.com/UnixJunkie/linwrap

GeoPub - A XMPP web client

pukkamustard announced

I'd like to announce an initial, proof-of-concept release of GeoPub - an XMPP web client. Unlike many XMPP clients the focus is not on instant messaging but on creating, displaying and managing things such as events, maps, information on local organizations and other local knowledge (see the openEngiadina project for the context).

This initial release is not really anything useful but a proof-of-concept how such an application can be developed using XMPP and OCaml. There are many rough edges and broken hacks that need fixing. I'd be very grateful for your feedback, thoughts and ideas.

The source code of the app is on codeberg and a pre-built hosted version is available here.

The application consists of some parts and ideas that I'd like to illustrate separately:

ocaml-xmpp

ocaml-xmpp is a XMPP client library for OCaml (documentation available online.

Reactive

ocaml-xmpp is reactive in the sense that the XMPP connection is abstracted as a React event of Stanzas (small pieces of information that flow over XMPP):

val stanzas : t -> Stanza.t React.event

This React event can be filtered for messages in a specific conversation, for example.

Transports

XMPP works with different transport mechanisms and ocaml-xmpp supports this. Currently ocaml-xmpp can be used from Unix with a TCP/SSL connection to a XMPP server and from web browsers with a WebSocket connection. This is implemented by abstracting the XMPP transport:

module type TRANSPORT = sig
  (** {2 Connection} *)

  type options
  (** Additional options that may be passed to the transport *)

  type t
  (** Type of an instantiated connection to an XMPP server *)

  val connect : host:string -> options -> t Lwt.t

  val close : t -> unit Lwt.t

  val closed : t -> unit Lwt.t

  (** {2 XML Stream} *)

  type stream

  val open_stream : t -> to':string -> stream Lwt.t

  val stream_id : stream -> string Lwt.t

  val send_xml : stream -> Xmlc.t -> unit Lwt.t

  val signals : stream -> Xmlc.signal Lwt_stream.t

  val stop_stream : stream -> unit Lwt.t
end

A transport establishes the underlying connection to a server and can create XML streams (in XMPP a connection is by multiple XML streams sequentially). For technical reasons XML parsing is also handled by the transport and a stream of XML signals (element start, data, element end) is returned. This is due to the fact that XML parsing in XMPP needs to be done slightly differently when using TCP (a single XML document over the entire stream) or WebSockets (every WebSocket frame is a parse-able XML document).

The Unix/TCP/SSL transport uses Markup.ml and whereas the WebSocket transport uses Xmlm (and Brrr).

Parser combinators for XML

For parsing streams of XML signals to OCaml types ocaml-xmpp contains a parser combinator helper library: Xmlc. This allows parser for XML such as this:

<bind xmlns='urn:ietf:params:xml:ns:xmpp-bind'><jid>w4iu4ckn3kjbqvcd@demo.openengiadina.net/z8Pkzfa8</jid></bind>

to be parses like this:

Xmlc.Parser.(
  element (Ns.bind "bind") (fun _ ->
    element (Ns.bind "jid") (fun _ ->
      text >>| String.concat "" >>= fun jid_s ->
      match Jid.of_string jid_s with
      | Some jid -> return jid
      | None -> fail_with "invalid JID")))
XMPP extensions

Inspiration for the scope of the core library is taken from the Strophe XMPP libraries - everything that does not have directly to do with XMPP transport, authentication or stream management is kept outside of the core library.

There are already some "extension" libraries outside of the core for useful XMPP features (e.g. Roster management, PubSub and pinging).

One thing that I do want to add to the core library is stream management according to XEP-0198. I expect this addition to change the core library API - the API is not stable yet!

Much inspiration was taken from Jackline - an OCaml XMPP client - and in particular this post on Jackline. Many thanks to @hannes.

reactor

GeoPub uses Brr. I had some trouble figuring out a suitable "architecture" for managing complex logic and ended up hacking an Elm inspired helper library: reactor.mli. State updates for the entire application are then handled in a single update function.

I'm not yet very happy with this machinery and I'm pretty sure I'm using react in wrong and dangerous ways. I'd be very grateful for ideas on how to improve this. THis might be related to this discussion: https://discuss.ocaml.org/t/structuring-frp-specifically-note-applications/8645/17.

The reason for using React over Note is because ocaml-xmpp uses a lot of Lwt and Lwt_react provides nice bindings for working with both. I guess something similar could be created for Note (e.g. Lwt_note) and I'm open to using Note (also in ocaml-xmpp).

Leaflet

GeoPub displays a map using the Leaflet.js JavaScript library. GeoPub contains OCaml bindings to Leaflet using Brr: leaflet.mli. Writing this was very straightforward and pleasant (I like Brr!).

One issue I have is that the Leaflet map needs to be manipulated very imperatively, whereas the rest of the application is much more functional. This causes some mismatches. I guess one needs to find a way of hiding the impressiveness of Leaflet (e.g. like react-leaflet).

Guix for build and development environments

I use Guix for providing a build and development environment. With guix installed one can run guix shell in the GeoPub repository to get a reproducible build environment. All dependencies are fetched and made available by Guix in this environment (e.g. ocaml-xmpp or the OCaml compiler).

I will publish ocaml-xmpp on OPAM once the API is more stable and an initial release can be made.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 96D82E7A96 for ; Tue, 30 Nov 2021 11:52:00 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=L1VU=QR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AL5F8ZxyGNTkxY9rXCzIzzFBlVkEcU1XcAAcZ59I?= =?us-ascii?q?dhq5Udez7ptK+ZhWZu6wm1geBdL6YwsoMs/DRvaHkVD5Iyre6m1dGTqZxUQQYg?= =?us-ascii?q?94dhQ0qDZ3NI0T6KPn3c35yR5waBxdq8H6hLEdaBtv1aUHMrX2u9z4SHQj0ORZ?= =?us-ascii?q?oKujvFYPekdm72/qz9pHObAlEmiaxaq5uIRurqgncqtMYipZ4JKYrzRvJrHpIe?= =?us-ascii?q?+BIym5tOFmegRXy6Nqu8ZB66yhftO4v+MBGUaXhYqQ3VqdYAyg8M2A0/8Lkqx/?= =?us-ascii?q?ORhaS63QGU2UWlh1IAxXZ7Bz/Q5z8vDf2uvZ71SKHOsL4UK00WS+676h1VBDol?= =?us-ascii?q?CkJNzk88G7Ni8xwir9QrBauqhF7xoLZZoGZOvl4fqPDfNMaXmtBUd1VVyNfH4i?= =?us-ascii?q?9YYwPD/AcMuZDsoLxo1UDoQe7CQSqGejhyCJHhmXu0KM6zeovDA/I0g8vEN0Sq?= =?us-ascii?q?3nbtsn5Ob0IXOyp0KXFzzPOZO5W1zfn74jIdwgsrO2IXb1qd8ra1FQhGB/FjlW?= =?us-ascii?q?VqIzlIy+V3fkKvmeB6+pvT+Svh3Q8qw5tojivw8YsipXVho8O0lDE8iF5wYYpJ?= =?us-ascii?q?dKmVEF7YdikEJpJtyGHKYR6WMQiQ3tnuCsjzLANpJG0cjQQxps92x7fd+KIc5K?= =?us-ascii?q?O4h/7SuufISt0iGxrdb+7mxu/71Wsx+L9W8So31tGsjZJn8XOu30OyhHd6saKR?= =?us-ascii?q?/p/80qv3TuB2R3f5+9EL002l6fVJZgsyaM+mJoUtETMBC72mEPuga+OaEok5um?= =?us-ascii?q?o6/j5bbX+oZ+cMop0hR/kPqQohMO/Hfw0Mg8SUGeB/OS80Kfv/UrjQLVFlvE2n?= =?us-ascii?q?ajZsIzaJcQGvaG1GRNa0oEm6xqnEjipzsgXnXgCLF1ffBKLlZTpO1bWLPD5C/e?= =?us-ascii?q?/mVWsny1xy/DIJL3tGo/NIWbZn7j8eLZy9VRQyA8uwtxH6JJUC60BIPLuWkDqr?= =?us-ascii?q?tDYDxg5PxS6wubmC9V915seVnySDa+YKqzeq1iI5vggI+WUa48VuSr9K/g45/H?= =?us-ascii?q?1l3M1g14dfa6x0ZsWdX+5HvBmI0GDbXrrmNcBHn8Gvwo/TOP0jF2NTCRfZ3euX?= =?us-ascii?q?64k+D47EpimDYDZRoy3jryOxia7HplQa2tbCV6MCW/le5iaV/oIci6eP9NtnzM?= =?us-ascii?q?eWbWvV4Mtzx+juQDix7Z6IOfY5zcUuYzj2dV6/eHfixE/+SJuA8iA0myAT2d5l?= =?us-ascii?q?X4SSTAsxqBwu0l9x0+D0admh/xYEsRe5/ZGUwsnL5Lc1+t6C9TyWwLdYNiGVFa?= =?us-ascii?q?mQtOnATEoU9I+3cUCY0FnG9WtlhzD3iyqDKEJl7GTGZA47KbR02LsK8phxHvKz?= =?us-ascii?q?qcsg0U8TsZBOmCqnqt/+BLSB47NnUWZjaGqdaEE0SDQ6GmN0HaCsVleXgJtXqr?= =?us-ascii?q?KU2gSaFDKo9nh/kPCSLuuCLQ7MgRf1cGCKq1KatzwjVVbWvjvItPeY3i+m2qoH?= =?us-ascii?q?xmIwqmDbIzwd2UGwCrdCE0EkwEP/XaaLgUxHSCho3/YDDNyC13veFng8exxpXK?= =?us-ascii?q?0VEM0yBuKb0J527qv5hEVneCcS+8U3r8cpCgusTB0HFKk09LSCtqAvBZhcb5HY?= =?us-ascii?q?dI95VdHzXjWuxZ8PpymNaBih0QRfx55v0P0hF1LDdAKldcs5jt+yBV0AaaH1hV?= =?us-ascii?q?Hei/Omdi6MaLRYCG6qBuwbYbS20rCy5CX9rYL7LI/sVq1+EmiH08mtnFmyMV90?= =?us-ascii?q?n2G55yMAhBBf4j2VxMe8xF874rRYiw8+5+cgXRoOK/yqTTC3tM1GMM9zRKxY9p?= =?us-ascii?q?UMKWFDRL/VcoACJ79e6QRh1G1Y0dcb6hp/6kuMpb5JpNuOYauLL8mhDWinHhK6?= =?us-ascii?q?4B701uR+mx7UOGahv7tJtmA2Q+WSzr3jFGgq93634deamNLdoJQ4SLjGYhaa7Y?= =?us-ascii?q?0eNobT2C0LJ/urug=3D?= IronPort-Data: =?us-ascii?q?A9a23=3AK4T9xa0Kd8W/lMg+JvbD5fZwkn2cJEfYwER7XOP?= =?us-ascii?q?LsXnJgT501mNUnWEWDGyOOq2CYmr0KNp/YY/loB9TsZTVm4ISHQtv/xmBbVoa8?= =?us-ascii?q?JufXYzxwmTYZn7JcJWbFCqL1yivAzX5BJhcokT0+1H9bdANkVEmjfvRH+OnULa?= =?us-ascii?q?dUsxMbVYMpBkJ2UoLd9ER2dYAbeiRW2thiPuqyyHtEAfNNw1cbgr435m+RCZH5?= =?us-ascii?q?5wejt+3UmsWPpintHeG/5Uc4Ql2yauZdxMUSaEMdgK2qnqq8V23wo/Z109F5tK?= =?us-ascii?q?Nl6aiNFUNRq/OMAOOjHtPRqXkhQJNzsAw+v9hZbxFMRsR0G3PxIwZJNZl7fRcT?= =?us-ascii?q?S8SBJaUzcBEbSQNKhsrJapC6aPKKni5sNWOwgvBaXS5yvFnCgctNo0d+/prKWt?= =?us-ascii?q?J6PoTJStLa0yTweWsz9pXT8Ez35p6dJG6VG8Ykis5l26JXKxOrYr4a67D4Nsd2?= =?us-ascii?q?DYrmuhVDPPGbowYbyBuZVLOeXVy1v0/HMprx6H1kiCqK3sAvAjA/extvjaN2Fc?= =?us-ascii?q?kiP6wJIWAU8KsbsBzska8h2vgw37fFkhCYYTbkS7tHmmEg/+W2zv8XJMOGba48?= =?us-ascii?q?P9znVDVwXYcYCD6nGCT+ZGR4nNSkfoFQ6DVxsYvkUT23Em7F5/lWBmpvHOPvhg?= =?us-ascii?q?dQsddVeog52lhD4LKth2BCDFsoiFpMbQbWA0eHFTGFWNlW/vjAiFpu7COD3fB5?= =?us-ascii?q?vGTtzza1e09NncMP2lcJecay4CLnWzw5y4jiv57F6qkktD+GTfx2i2H6i8kiN3?= =?us-ascii?q?/SOYQz6vhuwivby2E//D0c+L+2ukbsq9JIO+0iE5JqrFEMWTm0Ms=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AeJBr36ke8o+tMjtXX2S/2i8DvwTpDfIn3DAb?= =?us-ascii?q?v31ZSRFFG/FwWfrOoB19726RtN9xYgBEpTnuAsO9qB/nhP1ICMwqTNWftWrd1V?= =?us-ascii?q?dATrsI0WKK+VSJJ8S9zI5gPMxbHJSWZuefMbE3t6rH3DU=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BkBAAuAaZhhyIeaIFaFoJOgR8bAjdHA?= =?us-ascii?q?WRXOjEChAc+jm6CJYEWghWGFoZsiBGEFYEPVBABAwENKgEOBQECBAEBhD9egmc?= =?us-ascii?q?CHgYBBTMTAQIEFQEBBQEBAQIBAwMEARMBAQEBDQsOCDQihWgNQAEQAYFjDAwDA?= =?us-ascii?q?4N0AwEKDgEICkAlIwMJCwEGAwIEDQEXARQKFwESFAUBAYJWAYMHBQqTcJwMgTG?= =?us-ascii?q?BAYNOAQMDBAlBg3KBYw0CFIEVAgEBhgpUSgGCfwmDBHkCJxCBVUSBFYIpSgdug?= =?us-ascii?q?kwMCwEBAQEBgRYlAQEGWYJZgmUEkDAOGR8GFyccCAIYEwsJEAYBAQQFRwgFIwU?= =?us-ascii?q?HBAsCFw8CIwMaCAcBHQUGOgORTB8YDQOMaopGglmREhReMweDPoE0BguHe4EVj?= =?us-ascii?q?FqICYNtgUqQepEDIZV1H4IjhmcIgQ2CO5NgKggwhHuBTiqBagwHMxowQ4JpCWE?= =?us-ascii?q?PjiwWg1CBDDKBJoF1MgmCQYMKQDMCAQEDMQIGAQoBAQMJhWMBAQUTCwGCKIsEA?= =?us-ascii?q?QE?= X-IPAS-Result: =?us-ascii?q?A0BkBAAuAaZhhyIeaIFaFoJOgR8bAjdHAWRXOjEChAc+jm6?= =?us-ascii?q?CJYEWghWGFoZsiBGEFYEPVBABAwENKgEOBQECBAEBhD9egmcCHgYBBTMTAQIEF?= =?us-ascii?q?QEBBQEBAQIBAwMEARMBAQEBDQsOCDQihWgNQAEQAYFjDAwDA4N0AwEKDgEICkA?= =?us-ascii?q?lIwMJCwEGAwIEDQEXARQKFwESFAUBAYJWAYMHBQqTcJwMgTGBAYNOAQMDBAlBg?= =?us-ascii?q?3KBYw0CFIEVAgEBhgpUSgGCfwmDBHkCJxCBVUSBFYIpSgdugkwMCwEBAQEBgRY?= =?us-ascii?q?lAQEGWYJZgmUEkDAOGR8GFyccCAIYEwsJEAYBAQQFRwgFIwUHBAsCFw8CIwMaC?= =?us-ascii?q?AcBHQUGOgORTB8YDQOMaopGglmREhReMweDPoE0BguHe4EVjFqICYNtgUqQepE?= =?us-ascii?q?DIZV1H4IjhmcIgQ2CO5NgKggwhHuBTiqBagwHMxowQ4JpCWEPjiwWg1CBDDKBJ?= =?us-ascii?q?oF1MgmCQYMKQDMCAQEDMQIGAQoBAQMJhWMBAQUTCwGCKIsEAQE?= X-IronPort-AV: E=Sophos;i="5.87,275,1631570400"; d="scan'208,217";a="7161009" X-MGA-submission: =?us-ascii?q?MDEheqosdqd58UkWJXHMWKAnt7ZFXU/PgYbKDp?= =?us-ascii?q?q62U0FqUWkKu7V5dsOrtHMeWrEhidw/yIAtrhEDyG8SFXUv6a5HST5V4?= =?us-ascii?q?Ic6jpRCrRwqNJuH0Al6KL5IGfrsiExBoxCwaA0umlwqvvjLtpSbGUZ2f?= =?us-ascii?q?wt31NVcQrB8RBoosePqJJn9A=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 30 Nov 2021 11:52:00 +0100 Received: from set (unknown [131.254.252.165]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5E6DF564C4A; Tue, 30 Nov 2021 11:51:57 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 30 Nov 2021 11:51:47 +0100 Message-ID: <87o8613oho.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 30 11:51:57 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.217355, queueID=BF82B564C4C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMjMgdG8gMzAsDQoyMDIxLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCm9wYW0g Mi4xLjEsIG9wYW0gMi4wLjEwLCBhbmQgb3BhbS1kZXBleHQgMS4yDQpPVE9NTCAwLjkuMCDigJQg YSBjb21wbGlhbnQgYW5kIGZsZXhpYmxlIFRPTUwgcGFyc2luZywgbWFuaXB1bGF0aW9uLCBhbmQg cHJldHR5LXByaW50aW5nIGxpYnJhcnkNCk5ldyByZWxlYXNlIG9mIEZpeA0KTmV3IHJlbGVhc2Ug b2YgTWVuaGlyICgyMDIxMTEyNSkNCkx3dCA1LjUuMCwgTHd0X2RvbWFpbiAwLjEuMCwgTHd0X3Jl YWN0LjEuMS41DQpPQ2FtbCdzIENJIGlzIGdyYWR1YWxseSBtb3ZpbmcgdG8gR2l0SHViIEFjdGlv bnMNCkhvdyB0byBjb21iaW5lIDMgbW9uYWRzOiBBc3luYy9Md3QsIEVycm9yIGFuZCBTdGF0ZT8N Ck9sZCBDV04NCg0KDQpvcGFtIDIuMS4xLCBvcGFtIDIuMC4xMCwgYW5kIG9wYW0tZGVwZXh0IDEu Mg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tb3BhbS0yLTEtMS1vcGFtLTItMC0xMC1vcGFtLWRlcGV4dC0xLTIvODg3 Mi8xPg0KDQoNClIuIEJvdWpiZWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0 byBhbm5vdW5jZSBzZXZlcmFsIG1pbm9yIHJlbGVhc2VzOiBbb3BhbSAyLjAuMTBdLA0KICBbb3Bh bSAyLjEuMV0sIGFuZCBbb3BhbS1kZXBleHQgMS4yXS4NCg0KICBUaGUgb3BhbSByZWxlYXNlcyBj b25zaXN0IG9mIGJhY2twb3J0ZWQgZml4ZXMsIHdoaWxlIGBvcGFtLWRlcGV4dCcgaGFzDQogIGJl ZW4gYWRhcHRlZCB0byBiZSBjb21wYXRpYmxlIHdpdGggb3BhbSAyLjEsIHRvIGFsbG93IGZvciB3 b3JrZmxvd3MNCiAgd2hpY2ggbmVlZCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5IHdpdGggb3Bh bSAyLjAuIFdpdGggb3BhbSAyLjEuMSwNCiAgaWYgeW91IGV4cG9ydCBgT1BBTUNMST0yLjAnIGlu dG8geW91ciBlbnZpcm9ubWVudCB0aGVuIHdvcmtmbG93cw0KICBleHBlY3Rpbmcgb3BhbSAyLjAg c2hvdWxkIG5vdyBiZWhhdmUgZXZlbiBtb3JlIGVxdWl2YWxlbnRseS4NCg0KICBZb3UnbGwgZmlu ZCBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSBbYmxvZyBwb3N0IF0uDQoNCg0KW29wYW0gMi4wLjEw XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcmVsZWFzZXMvdGFnLzIuMC4xMD4NCg0K W29wYW0gMi4xLjFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcv Mi4xLjE+DQoNCltvcGFtLWRlcGV4dCAxLjJdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW9w YW0vb3BhbS1kZXBleHQvcmVsZWFzZXMvdGFnLzEuMj4NCg0KW2Jsb2cgcG9zdCBdIDxodHRwczov L29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTAtMTAtMi0xLTEtZGVwZXh0Lz4NCg0KDQpPVE9N TCAwLjkuMCDigJQgYSBjb21wbGlhbnQgYW5kIGZsZXhpYmxlIFRPTUwgcGFyc2luZywgbWFuaXB1 bGF0aW9uLCBhbmQgcHJldHR5LXByaW50aW5nIGxpYnJhcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW90b21sLTAtOS0wLWEtY29tcGxpYW50LWFuZC1m bGV4aWJsZS10b21sLXBhcnNpbmctbWFuaXB1bGF0aW9uLWFuZC1wcmV0dHktcHJpbnRpbmctbGli cmFyeS84MTUyLzEwPg0KDQoNCkRhbmlpbCBCYXR1cmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgQSBuZXcgMC45LjMgcmVsYXNlIGlzIGF2YWlsYWJsZS4gU3RpbGwgbm90IDEuMC4w IGp1c3QgaW4gY2FzZS4gVGhlDQogIGNoYW5nZSBJJ20gbW9zdCBnbGFkIEkgbWFuYWdlZCB0byBt YWtlIGlzIHRoYXQgdGhlIGxleGVyIGlzIG5vdw0KICByZS1lbnRyYW50IGFuZCBkb2Vzbid0IHVz ZSBhbnkgbXV0YWJsZSBzdGF0ZS4gV2hlcmUgY2FuIEkgYXBwbHkgZm9yDQogIHRoZSAiRGVzaWdu ZWQgZm9yIG11bHRpY29yZSBPQ2FtbCIgY2VydGlmaWNhdGlvbiBzdGlja2VyPyA7KQ0KDQoNCkJy ZWFraW5nIGNoYW5nZSBpbiB0aGUgZnVuY3RvciBpbnRlcmZhY2UNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkgZm91 bmQgYW4gb3ZlcnNpZ2h0IHRoYXQgdG9vayBhIGJyZWFraW5nIGNoYW5nZSB0byBmaXguIEl0IGRp ZG4ndA0KICBicmVhayBhbnkgcGFja2FnZSB0aGF0IHdhcyBhbHJlYWR5IGluIHRoZSBPUEFNIHJl cG9zaXRvcnksIHNvIEknbSBnbGFkDQogIEkgbm90aWNlZCBpdCBiZWZvcmUgaXQgY2F1c2VkIGFu eW9uZSB0cm91YmxlLg0KDQogIE15IGlkZWEgdG8gbWFrZSB0aGUgZnVuY3RvciB0YWtlIHNlcGFy YXRlIGludGVnZXIgYW5kIGZsb2F0IG1vZHVsZXMNCiAgdHVybmVkIG91dCB0byBiZSBtaXNndWlk ZWQ6IGl0IHdvdWxkbid0IGNvbXBvc2Ugd2l0aCBgT3RvbWwuZ2V0X2Zsb2F0DQogIH5zdHJpY3Q6 ZmFsc2UnIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyB0aGF0IGFwcGx5IHR5cGUgY29udmVyc2lvbnMu DQoNCiAgTG9naWNhbGx5LCBgT3RvbWwuZ2V0X2Zsb2F0IH5zdHJpY3Q6ZmFsc2UgKE90b21sLmlu dGVnZXIgNSknIHNob3VsZA0KICBwcm9kdWNlIGBPdG9tbC5Ub21sRmxvYXQgNS4wJy4gSG93ZXZl ciwgaXQgbWVhbnMgdGhhdCBgZ2V0X2Zsb2F0Jw0KICBuZWVkcyB0byBrbm93IGhvdyB0byBjb252 ZXJ0IGludGVnZXJzIHRvIGZsb2F0LiBJZiBpbnRlZ2VyIGFuZCBmbG9hdA0KICB0eXBlcyBhcmUg aW4gc2VwYXJhdGUgbW9kdWxlcywgdGhhdCBpc24ndCBwb3NzaWJsZS4NCg0KICBTbyBJIGNvbWJp bmVkIGJvdGggaW50ZWdlcnMgYW5kIGZsb2F0cyBpbiBhIHNpbmdsZSBgVG9tbE51bWJlcicuIFRo YXQNCiAgd2F5IHBlb3BsZSB3aG8gd2FudCB0byBicmluZyB0aGVpciBvd24gYmlnbnVtIGxpYnJh cmllcyB3aWxsIGhhdmUgdG8NCiAgd3JpdGUgbW9yZSBjb2RlLCBidXQgbnVtYmVycyB3aWxsIGJl aGF2ZSBhcyB0aGV5IGFyZSBleHBlY3RlZCB0byBpbiBhDQogIGR5bmFtaWNhbGx5IHR5cGVkIGZv cm1hdC4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG1vZHVsZSBCaWdOdW1iZXIgPSBzdHJ1 Y3QNCiAg4pSCICAgdHlwZSBpbnQgPSBaLnQNCiAg4pSCICAgdHlwZSBmbG9hdCA9IERlY2ltYWwu dA0KICDilIIgDQogIOKUgiAgIGxldCBpbnRfb2Zfc3RyaW5nID0gWi5vZl9zdHJpbmcNCiAg4pSC ICAgbGV0IGludF90b19zdHJpbmcgPSBaLnRvX3N0cmluZw0KICDilIIgICBsZXQgaW50X29mX2Jv b2xlYW4gYiA9IGlmIGIgdGhlbiBaLm9uZSBlbHNlIFouemVybw0KICDilIIgICBsZXQgaW50X3Rv X2Jvb2xlYW4gbiA9IChuIDw+IFouemVybykNCiAg4pSCIA0KICDilIIgICAoKiBDYW4ndCBqdXN0 IHJldXNlIERlY2ltYWwudG8vb2Zfc3RyaW5nIGJlY2F1c2UgdGhlaXIgb3B0aW9uYWwgYXJndW1l bnRzDQogIOKUgiAgICAgIHdvdWxkIGNhdXNlIGEgc2lnbmF0dXJlIG1pc21hdGNoLiAqKQ0KICDi lIIgICBsZXQgZmxvYXRfb2Zfc3RyaW5nIHMgPSBEZWNpbWFsLm9mX3N0cmluZyBzDQogIOKUgiAN CiAg4pSCICAgKCogRGVjaW1hbC50b19zdHJpbmcgdXNlcyAiTmFOIiBzcGVsbGluZw0KICDilIIg ICAgICB3aGlsZSBUT01MIHJlcXVpcmVzIGFsbCBzcGVjaWFsIGZsb2F0IHZhbHVlcyB0byBiZSBs b3dlcmNhc2UuICopDQogIOKUgiAgIGxldCBmbG9hdF90b19zdHJpbmcgeCA9IERlY2ltYWwudG9f c3RyaW5nIHggfD4gU3RyaW5nLmxvd2VyY2FzZV9hc2NpaQ0KICDilIIgICBsZXQgZmxvYXRfb2Zf Ym9vbGVhbiBiID0gaWYgYiB0aGVuIERlY2ltYWwub25lIGVsc2UgRGVjaW1hbC56ZXJvDQogIOKU giAgIGxldCBmbG9hdF90b19ib29sZWFuIHggPSAoeCA8PiBEZWNpbWFsLnplcm8pDQogIOKUgiAN CiAg4pSCICAgbGV0IGZsb2F0X29mX2ludCA9IERlY2ltYWwub2ZfYmlnaW50DQogIOKUgiAgIGxl dCBpbnRfb2ZfZmxvYXQgPSBEZWNpbWFsLnRvX2JpZ2ludA0KICDilIIgZW5kDQogIOKUgiANCiAg 4pSCIG1vZHVsZSBPdG9tbCA9IE90b21sLkJhc2UuTWFrZSAoQmlnTnVtYmVyKSAoT3RvbWwuQmFz ZS5TdHJpbmdEYXRlKQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgbmV4dCByZWxlYXNlIHdp bGwgbGlrZWx5IGJlIDEuMC4wIGZvciByZWFsLg0KDQoNCk5ldyByZWxlYXNlIG9mIEZpeA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2Yt Zml4Lzg4OTUvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9m IEZpeCwgd2l0aCBzZXZlcmFsIG5ldw0KICBtb2R1bGVzIGNvbnRyaWJ1ZWQgYnkgRnLDqWTDqXJp YyBCb3VyICh0aGFua3MhKS4NCg0KICBJbiBzaG9ydCwgRml4IGlzIGEgdG9vbGtpdCB0aGF0IGhl bHBzIHBlcmZvcm0gbWVtb2l6YXRpb24gYW5kIGZpeGVkDQogIHBvaW50IGNvbXB1dGF0aW9ucyAo aW5jbHVkaW5nIGRhdGEgZmxvdyBhbmFseXNlcykuIE1vcmUgZ2VuZXJhbGx5LCBpdA0KICBvZmZl cnMgYSBudW1iZXIgb2YgYmFzaWMgYWxnb3JpdGhtaWMgYnVpbGRpbmcgYmxvY2tzIHRoYXQgY2Fu IGJlDQogIHVzZWZ1bCBpbiBtYW55IGNpcmN1bXN0YW5jZXMuDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxsIGZpeC4yMDIxMTEyNQ0KICDi lJTilIDilIDilIDilIANCg0KICBEb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBoZXJlOg0KDQog IOKAoiA8aHR0cHM6Ly9naXRsYWIuaW5yaWEuZnIvZnBvdHRpZXIvZml4Ly0vYmxvYi9tYXN0ZXIv UkVBRE1FLm1kPg0KICDigKIgPGh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9maXgv ZG9jL2ZpeC9GaXgvaW5kZXguaHRtbD4NCg0KICBFbmpveSwNCg0KICBGcmFuw6dvaXMgUG90dGll cg0KICBmcmFuY29pcy5wb3R0aWVyQGlucmlhLmZyDQogIDxodHRwOi8vY2FtYml1bS5pbnJpYS5m ci9+ZnBvdHRpZXIvPg0KDQoNCjIwMjEvMTEvMjUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBUaGUgbmV3IG1vZHVsZSBgQ29tcGFjdFF1ZXVlJyBvZmZlcnMgYSBtaW5p bWFsaXN0IG11dGFibGUgRklGTw0KICAgIHF1ZXVlLiBJdCBpcyBjb21wYXJhYmxlIHdpdGggT0Nh bWwncyBgUXVldWUnIG1vZHVsZS4gSW4gY29tcGFyaXNvbg0KICAgIHdpdGggYFF1ZXVlJywgaXQg dXNlcyBhIG1vcmUgY29tcGFjdCBpbnRlcm5hbCByZXByZXNlbnRhdGlvbjoNCiAgICBlbGVtZW50 cyBhcmUgc3RvcmVkIGNvbnRpZ3VvdXNseSBpbiBhIGNpcmN1bGFyIGFycmF5LiBUaGlzIGhhcyBh DQogICAgcG9zaXRpdmUgaW1wYWN0IG9uIHBlcmZvcm1hbmNlOiBib3RoIHRpbWUgYW5kIG1lbW9y eSBjb25zdW1wdGlvbiBhcmUNCiAgICByZWR1Y2VkLiBUaGlzIGRhdGEgc3RydWN0dXJlIGlzIG9w dGltaXplZCBmb3IgbWF4aW11bQ0KICAgIHRocm91Z2hwdXQuIChDb250cmlidXRlZCBieSBGcsOp ZMOpcmljIEJvdXIsIHJldmlld2VkIGJ5IEZyYW7Dp29pcw0KICAgIFBvdHRpZXIuKQ0KDQogIOKA oiBUaGUgbmV3IGZ1bmN0b3IgYERhdGFGbG93LkZvckN1c3RvbU1hcHMnIG9mZmVycyBhIGZvcndh cmQgZGF0YSBmbG93DQogICAgYW5hbHlzaXMgdGhhdCBpcyB0dW5lZCBmb3IgZ3JlYXRlciBwZXJm b3JtYW5jZS4gKENvbnRyaWJ1dGVkIGJ5DQogICAgRnLDqWTDqXJpYyBCb3VyLCByZXZpZXdlZCBi eSBGcmFuw6dvaXMgUG90dGllci4pDQoNCiAg4oCiIFRoZSBuZXcgbW9kdWxlIGBJbmRleGluZycg b2ZmZXJzIGEgc2FmZSBBUEkgZm9yIG1hbmlwdWxhdGluZyBpbmRpY2VzDQogICAgaW50byBmaXhl ZC1zaXplIGFycmF5cy4gVGhpcyBBUEkgaW52b2x2ZXMgc29tZSBkeW5hbWljIGNoZWNrcyBhcw0K ICAgIHdlbGwgYXMgc3RhdGljIHR5cGUgY2hlY2tzLCB0aGVyZWJ5IChob3BlZnVsbHkpIGdyZWF0 bHkgcmVkdWNpbmcgdGhlDQogICAgcmlzayBvZiBjb25mdXNpb24gaW4gY29kZSB0aGF0IHVzZXMg bWFueSBhcnJheXMgYW5kIG1hbnkgaW5kaWNlcw0KICAgIGludG8gdGhlc2UgYXJyYXlzLiAoQ29u dHJpYnV0ZWQgYnkgRnLDqWTDqXJpYyBCb3VyLCByZXZpZXdlZCBieQ0KICAgIEZyYW7Dp29pcyBQ b3R0aWVyLikNCg0KICDigKIgSW4gYERhdGFGbG93JywgYWxsb3cgdGhlIGZ1bmN0aW9uIGBmb3Jl YWNoX3Jvb3QnICh3aGljaCBpcyBwYXJ0IG9mDQogICAgdGhlIHNpZ25hdHVyZSBgREFUQV9GTE9X X0dSQVBIJykgdG8gY2FsbCBgY29udHJpYnV0ZSB4IF8nIHNldmVyYWwNCiAgICB0aW1lcyBhdCBh IHNpbmdsZSByb290IGB4Jy4NCg0KDQpOZXcgcmVsZWFzZSBvZiBNZW5oaXIgKDIwMjExMTI1KQ0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtbWVuaGlyLTIw MjExMTI1Lzg4OTYvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNl IG9mIE1lbmhpciwgd2l0aCBhbiBleGNpdGluZw0KICBjb250cmlidXRpb24gYnkgRnLDqWTDqXJp YyBCb3VyOiBhIGdyb3VuZGJyZWFraW5nIHBlcmZvcm1hbmNlDQogIGltcHJvdmVtZW50IGluIGBt ZW5oaXIgLS1saXN0LWVycm9ycycuIFRoaXMgaXMgbWFkZSBwb3NzaWJsZSBieSBhbg0KICBlbnRp cmVseSBuZXcgcmVhY2hhYmlsaXR5IGFsZ29yaXRobSwgd2hpY2ggaGFzIGJlZW4gZGVzaWduZWQg YW5kDQogIGltcGxlbWVudGVkIGJ5IEZyw6lkw6lyaWMsIGFuZCB3aGljaCBpcyBkZXNjcmliZWQg aW4gb3VyIHBhcGVyICJGYXN0ZXINCiAgUmVhY2hhYmlsaXR5IEFuYWx5c2lzIGZvciBMUigxKSBQ YXJzZXJzIi4gVGhpcyBpcyB0aGUgbGluayB0byB0aGUNCiAgcGFwZXI6DQoNCiAgPGh0dHA6Ly9j YW1iaXVtLmlucmlhLmZyL35mcG90dGllci9wdWJsaXMvYm91ci1wb3R0aWVyLXJlYWNoYWJpbGl0 eS5wZGY+DQoNCiAgVG8gaW5zdGFsbCB0aGUgbmV3IHJlbGVhc2UsIGp1c3QgdHlwZQ0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gaW5zdGFsbCBtZW5o aXIuMjAyMTExMjUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRW5qb3khDQoNCiAgRnJhbsOnb2lz IFBvdHRpZXINCiAgRnJhbmNvaXMuUG90dGllckBpbnJpYS5mcg0KICA8aHR0cDovL2NhbWJpdW0u aW5yaWEuZnIvfmZwb3R0aWVyLz4NCg0KICDigKIgVGhlIGNvbW1hbmQgYG1lbmhpciAtLWxpc3Qt ZXJyb3JzJyBoYXMgYmVlbiBzcGVkIHVwIGJ5IGEgZmFjdG9yIG9mDQogICAgdXAgdG8geDEwMCwg YW5kIHJlcXVpcmVzIHVwIHRvIHgxMDAwIGxlc3MgbWVtb3J5LCB0aGFua3MgdG8gYSBuZXcNCiAg ICBMUigxKSByZWFjaGFiaWxpdHkgYWxnb3JpdGhtLCB3aGljaCBoYXMgYmVlbiBkZXNpZ25lZCBh bmQNCiAgICBpbXBsZW1lbnRlZCBieSBGcsOpZMOpcmljIEJvdXIuDQoNCiAg4oCiIEJldHRlciBk b2N1bWVudCB0aGUgcmVzdHJpY3RlZCB3YXkgaW4gd2hpY2ggdGhlIGBlcnJvcicgdG9rZW4gbXVz dA0KICAgIGJlIHVzZWQgd2hlbiB1c2luZyBgLS1zdHJhdGVneSBzaW1wbGlmaWVkJy4gTWVuaGly IG5vdyBjaGVja3MgdGhhdA0KICAgIHRoaXMgdG9rZW4gaXMgdXNlZCBvbmx5IGF0IHRoZSBlbmQg b2YgYSBwcm9kdWN0aW9uLCBhbmQgd2FybnMgaWYNCiAgICB0aGlzIGlzIG5vdCB0aGUgY2FzZS4g KEJldHRlciB5ZXQsIG91ciBzdWdnZXN0aW9uIGlzIHRvIG5vdCB1c2UgdGhlDQogICAgYGVycm9y JyB0b2tlbiBhdCBhbGwhKQ0KDQogIOKAoiBUaGUgYCRzeW50YXhlcnJvcicga2V5d29yZCBpcyBu b3cgZm9yYmlkZGVuIHdoZW4gdXNpbmcgYC0tc3RyYXRlZ3kNCiAgICBzaW1wbGlmaWVkJy4gVGhp cyBrZXl3b3JkIHdpbGwgYmUgZW50aXJlbHkgcmVtb3ZlZCBpbiB0aGUgbmV4dA0KICAgIHJlbGVh c2UuIEluY2lkZW50YWxseSwgd2UgaGF2ZSBqdXN0IGZvdW5kIG91dCB0aGF0IGl0IGJlaGF2ZXMN CiAgICBkaWZmZXJlbnRseSB1bmRlciB0aGUgY29kZSBiYWNrLWVuZCBhbmQgdW5kZXIgdGhlIHRh YmxlIGJhY2stZW5kLg0KDQogIOKAoiBEaXNhYmxlIE9DYW1sIHdhcm5pbmcgMzkgKHVudXNlZCBy ZWMgZmxhZykgaW4gdGhlIE9DYW1sIGNvZGUNCiAgICBwcm9kdWNlZCBieSBNZW5oaXIncyBjb2Rl IGJhY2stZW5kLiBUaGlzIGRvZXMgbm90IGFmZmVjdCB0aGUgdGFibGUNCiAgICBiYWNrLWVuZC4g IChSZXBvcnRlZCBieSBBcm1hw6tsIEd1w6luZWF1LikNCg0KICDigKIgRml4IGEgYnVnIGluIGAt LXJhbmRvbS0qJyB3aGljaCBjb3VsZCBjYXVzZSBNZW5oaXIgdG8gZGl2ZXJnZSBpZiB0aGUNCiAg ICBncmFtbWFyIHVzZXMgdGhlIGBlcnJvcicgdG9rZW4uDQoNCiAg4oCiIFdhcm4gaWYgYSB0ZXJt aW5hbCBzeW1ib2wgaXMgbmFtZWQgYEVycm9yJy4gVGhpcyBjcmVhdGVzIGEgbmFtZQ0KICAgIGNs YXNoIGluIHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIHRoZSBnZW5lcmF0ZWQgcGFyc2VyLg0KDQog IOKAoiBNZW5oaXIgbm93IHJlcXVpcmVzIE9DYW1sIDQuMDMuMCAoaW5zdGVhZCBvZiA0LjAyLjMp IGFuZCBEdW5lIDIuOC4wDQogICAgKGluc3RlYWQgb2YgMi4wLjApLg0KDQoNCkx3dCA1LjUuMCwg THd0X2RvbWFpbiAwLjEuMCwgTHd0X3JlYWN0LjEuMS41DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1sd3QtNS01LTAt bHd0LWRvbWFpbi0wLTEtMC1sd3QtcmVhY3QtMS0xLTUvODg5Ny8xPg0KDQoNClJhcGhhw6tsIFBy b3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEl0IGlzIG15IHBsZWFzdXJlIHRv IGFubm91bmNlIHRoZSByZWxlYXNlIG9mIEx3dCB2ZXJzaW9uIDUuNS4wLA0KICBMd3RfZG9tYWlu IHZlcnNpb24gMC4xLjAsIEx3dF9yZWFjdCB2ZXJzaW9uIDEuMS41LCBMd3RfcHB4IHZlcnNpb24N CiAgMi4wLjMgYW5kIEx3dF9wcHhfbGV0IHZlcnNpb24gNS41LjAuDQoNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY3NpZ2VuL2x3dC9yZWxlYXNlcy90YWcvNS41LjA+DQoNCiAgQWxsIHRob3NlIHBh Y2thZ2VzIGNhbiBiZSBpbnN0YWxsZWQgdmlhIG9wYW0gYXMgdXN1YWwuDQoNCg0KOnJvdGF0aW5n X2xpZ2h0OiAgRGVwcmVjYXRpb24NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IE9uZSBub3RhYmxlIGNoYW5nZSBpcyB0aGUgZGVwcmVjYXRpb24gb2YgYEx3dF9tYWluLnlpZWxk JyBhbmQNCiAgYEx3dF91bml4LnlpZWxkJy4gSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIGBMd3Qu cGF1c2UnIGluc3RlYWQuDQoNCg0KOnJvY2tldDogIEx3dF9kb21haW46IGFuIGludGVyZmFjZSB0 byBtdWx0aWNvcmUgcGFyYWxsZWxpc20NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEFub3RoZXIgbm90YWJsZSBjaGFu Z2UgaXMgdGhlIGFkZGl0aW9uIG9mIHRoZSBMd3RfZG9tYWluIHBhY2thZ2UuIFRoaXMNCiAgcGFj a2FnZSBpbmNsdWRlcyBhIHNpbmdsZSBtb2R1bGUgYEx3dF9kb21haW4nIHdpdGggZnVuY3Rpb25z IHRvDQogIGV4ZWN1dGUgc29tZSBjb21wdXRhdGlvbnMgaW4gcGFyYWxsZWwsIHVzaW5nIHRoZSBm ZWF0dXJlcyBvZiBNdWx0aWNvcmUNCiAgT0NhbWwuIFRoZSBwYWNrYWdlIHJlcXVpcmVzIGFuIE9D YW1sIGNvbXBpbGVyIHdpdGggZG9tYWlucyBzdXBwb3J0IHRvDQogIGluc3RhbGwuDQoNCiAgQ29k ZSBmb3IgdGhpcyBwYWNrYWdlIGlzIHRoZSB3b3JrIG9mIEBzdWRoYSB3aXRoIHJldmlld3MgYW5k IHBhY2thZ2luZw0KICBmcm9tIEx3dCBjb250cmlidXRvcnMuDQoNCg0KT3RoZXIgY2hhbmdlcw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGZ1bGwgbGlz dCBvZiBjaGFuZ2VzIGlzIGF2YWlsYWJsZSBpbiB0aGUgW0NIQU5HRVMgZmlsZV0uDQoNCg0KW0NI QU5HRVMgZmlsZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9ibG9iLzUuNS4wL0NI QU5HRVM+DQoNCg0KT0NhbWwncyBDSSBpcyBncmFkdWFsbHkgbW92aW5nIHRvIEdpdEh1YiBBY3Rp b25zDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbHMtY2ktaXMtZ3JhZHVhbGx5LW1vdmlu Zy10by1naXRodWItYWN0aW9ucy84OTAyLzE+DQoNCg0KU29yYSBNb3JpbW90byBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFRoZSBPQ2FtbCB0ZWFtIHN0YXJ0ZWQgc3dpdGNoaW5nIHRvIEdp dEh1YiBBY3Rpb25zIGxhc3QgeWVhciBmb3Igc29tZQ0KICBvZiB0aGUgb2ZmaWNpYWwgT0NhbWwg cmVwb3NpdG9yaWVzLiBBbHNvLCB3ZSBoYXZlIHJlbGVhc2VkIHNvbWUgQ0kNCiAgcmVsYXRlZCBz dHVmZiwgc3VjaCBhcyBzZXR1cC1vY2FtbCwgdG8gdGhlIGNvbW11bml0eS4gU29tZSBPQ2FtbA0K ICBoYWNrZXJzIGFsc28ga25vdyB0aGF0IENJIGluIHRoZSBPQ2FtbCBjb21tdW5pdHkgaXMgZ3Jh ZHVhbGx5DQogIHN3aXRjaGluZyB0byBHaXRIdWIgQWN0aW9ucyBub3dhZGF5cy4NCg0KICBIb3dl dmVyLCB3aGF0IGdyYWR1YWxseSBiZWNhbWUgYSBwcm9ibGVtIHdoZW4gd2Ugc3RhcnRlZCBzd2l0 Y2hpbmcgd2FzDQogIHRoYXQgdGhlIG51bWJlciBvZiBjb25jdXJyZW50IGpvYnMgdGhhdCBjb3Vs ZCBydW4gaW4gYSBmcmVlIGFjY291bnQgb24NCiAgR2l0SHViIHdhcyBub3QgZW5vdWdoIGZvciBv dXIgYWN0aXZlbmVzcy4NCg0KICBPbmUgb2YgdGhlIG1ham9yIHBhaW4gcG9pbnRzIGZvciBjb21w aWxlciBjb250cmlidXRvcnMgaXMgdGhhdCB0aGUNCiAgd2FpdCB0aW1lIGZvciBDSSB0byBjb21w bGV0ZSwgd2hpY2ggaXMgdW5yZWxhdGVkIHRvIHRoZSBhY3R1YWwgYnVpbGQsDQogIGlzIHRvbyBs b25nLiBIb3dldmVyLCB0aGlzIGhhcyBiZWVuIGEgcGFpbiBwb2ludCBpbiBhbGwgc2VydmljZXMs IGV2ZW4NCiAgYmVmb3JlIEdpdEh1YiBBY3Rpb25zLg0KDQogIFRoZSBHaXRIdWIgdGVhbSBkaWQg dGhlaXIgYmVzdCB0byBoZWxwIHVzIG1ha2UgaXQgYmV0dGVyLiBBcyBhIHJlc3VsdCwNCiAgdGhl eSBvZmZlcmVkIHRvIHVwZ3JhZGUgdGhlIE9DYW1sIG9yZ2FuaXphdGlvbidzIHBsYW4gdG8gdGhl IHRlYW0gcGxhbg0KICBmb3IgZnJlZSwgd2hpY2ggbWVhbnMgdGhhdCB3ZSBjYW4gbm93IGJlbmVm aXQgZnJvbSBhIHJhbmdlIG9mDQogIGZlYXR1cmVzLCBpbmNsdWRpbmcgYWNjZXNzIHRvIDN4IG1v cmUgY29uY3VycmVudCBydW5uZXJzIHRoYW4gYmVmb3JlLg0KDQogIOKAoiBBYm91dCB0ZWFtIHBs YW46DQogICAgPGh0dHBzOi8vZG9jcy5naXRodWIuY29tL2VuL2FjdGlvbnMvbGVhcm4tZ2l0aHVi LWFjdGlvbnMvdXNhZ2UtbGltaXRzLWJpbGxpbmctYW5kLWFkbWluaXN0cmF0aW9uPg0KICDigKIg Q29uY3VycmVuY3kvcGxhbjoNCiAgICA8aHR0cHM6Ly9kb2NzLmdpdGh1Yi5jb20vZW4vZ2V0LXN0 YXJ0ZWQvbGVhcm5pbmctYWJvdXQtZ2l0aHViL2dpdGh1YnMtcHJvZHVjdHMjZ2l0aHViLXRlYW0+ DQoNCiAgV2Ugd291bGQgbGlrZSB0byB0aGFuayBHaXRIdWIgZm9yIHN1cHBvcnRpbmcgb3VyIHRl YW0gYW5kIEFobWVkIEJpbGFsLA0KICB3aG8gc3VwcG9ydGVkIHRoaXMgZWZmb3J0Lg0KDQoNCkhv dyB0byBjb21iaW5lIDMgbW9uYWRzOiBBc3luYy9Md3QsIEVycm9yIGFuZCBTdGF0ZT8NCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93LXRvLWNvbWJpbmUtMy1tb25hZHMtYXN5bmMt bHd0LWVycm9yLWFuZC1zdGF0ZS84OTA2Lzk+DQoNCg0KRGVlcCBpbiB0aGlzIHRocmVhZCwgSXZh biBHb3RvdmNoaXRzIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBtb25hZHMgbGlicmFyeSBwcm92 aWRlcyB0aGUgdHJhbnNmb3JtZXJzIGZvciBzb21lIHdlbGwta25vd24NCiAgbW9uYWRzLiBBbGwg dGhlc2UgbW9uYWRzIGhhdmUgYSBtb3JlIG9yIGxlc3Mgc3RhbmRhcmQgaW1wbGVtZW50YXRpb24s DQogIG9mZmVyaW5nIHRoZSBzYW1lIHBlcmZvcm1hbmNlIGFzIGFueSBvdGhlciBtb25hZGljIGxp YnJhcnkgY2FuDQogIG9mZmVyLiBMaWtlIHRoZXJlIGlzIG5vIGJldHRlciB3YXkgb2YgaW1wbGVt ZW50aW5nIHRoZSBzdGF0ZSBtb25hZA0KICBvdGhlciB0aGFuIGEgZnVuY3Rpb24uIFdlIGhhdmUg ZXhwZXJpbWVudGVkIGEgbG90IHdpdGggZGlmZmVyZW50DQogIHBlcmZvcm1hbmNlIG9wdGltaXph dGlvbnMsIHN1Y2ggYXMgYm94aW5nIGFuZCB1bmJveGluZyBpdCBhbmQgaW5saW5pbmcNCiAgdmFy aW91cyBvcGVyYXRvcnMsIGFuZCBrZWVwIGV4cGVyaW1lbnRpbmcgdG8gZ2V0IHRoZSBtYXhpbXVt IGZyb20gdGhlDQogIGN1cnJlbnQgY29tcGlsZXIuIEluIEJBUCwgd2UgaGVhdmlseSB1c2UgdGhl IG1vbmFkcyBsaWJyYXJ5LCBmaXJzdCBvZg0KICBhbGwgZm9yIG91ciBba25vd2xlZGdlIHJlcHJl c2VudGF0aW9uIGFuZCByZWFzb25pbmcgZW5naW5lXSwgd2hpY2ggaXMNCiAgdGhlIGZvdW5kYXRp b24gZm9yIGFsbCBCQVAgYW5hbHlzZXMuIFdlIGFsc28gdXNlIGl0IGZvciBbZW11bGF0aW5nDQog IGJpbmFyeSBwcm9ncmFtc10uICBUaGUgcmljaCBpbnRlcmZhY2UgaXMgaGVyZSB0byBtYWtlIG91 ciBsaWZlIGVhc2llcg0KICBhbmQgbW9yZSBjb21mb3J0YWJsZSB3aGVuIHdlIHVzZSBtb25hZHMu IEl0IGRlZmluaXRlbHkgY29tZXMgZm9yIGZyZWXCuQ0KICBhcyB0aGUgbnVtYmVyIG9mIGZ1bmN0 aW9ucyBkb2Vzbid0IGFmZmVjdCB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlDQogIHVuZGVybHlpbmcg bW9uYWQuDQoNCiAgQnV04oCmIHRoZXJlIGlzIGFsd2F5cyBhIGJ1dCA6KSBTdGFja2luZyBtb25h ZHMgdXNpbmcgYSB0cmFuc2Zvcm1lciBkb2VzDQogIGhhdmUgYSBwcmljZS4gRXZlbiB3aXRoIHRo ZSBmbGFtYmRhIGNvbXBpbGVyLiBUaGUgbGF0dGVyIGlzIGRvaW5nIGFuDQogIGV4Y2VsbGVudCBq b2Igb2YgdW5zdGFja2luZyB0aGVtIGFuZCBlbGltaW5hdGluZyB0aGUgb3ZlcmhlYWQgb2YNCiAg aGF2aW5nIGEgY2hhaW4gb2YgbW9uYWRzLiBCdXQgb3VyIGxhdGVzdCBleHBlcmltZW50cyBzaG93 IHRoYXQgYQ0KICBjdXN0b20tbWFkZSBtb25hZCAoc3RpbGwgd2l0aCB0aGUgbW9uYWRzIGxpYnJh cnkpIHBlcmZvcm1zIGJldHRlcg0KICB1bmRlciBlaXRoZXIgYnJhbmNoIG9mIHRoZSBjb21waWxl ci4gV2UgW2hhdmUgcmV3cml0dGVuIG91ciBtYWluDQogIG1vbmFkc10gdGhhdCB3ZXJlIHJlbHlp bmcgb24gdHJhbnNmb3JtZXJzIGFuZCBnb3QgZnJvbSAyMCUgdG8gNTAlDQogIHBlcmZvcm1hbmNl IGltcHJvdmVtZW50LiBCdXQgdGhhdCBpcyBub3QgdG8gc2F5IHRoYXQgdGhlIG1vbmFkcw0KICBs aWJyYXJ5IGl0c2VsZiBpcyBzbG93IG9yIHRoYXQgd2UncmUgbm90IHVzaW5nIGl0LCBpdCBpcyB0 byBzYXkgdGhhdA0KICB0aGVyZSBhcmUgb3RoZXIgb3B0aW9ucyB0byB0cmFuc2Zvcm1lcnMgdGhh dCBtaWdodCB3b3JrIGluIHNvbWUgY2FzZXMuDQogIFNlZSB0aGUgbGlua2VkIFBSIGlmIHlvdSB3 YW50IHRvIGxlYXJuIHRoZSB0cmljay4NCg0KICDCueKBviBQcm92aWRlZCB0aGF0IHdlIGlnbm9y ZSB0aGUgc2l6ZSBvZiB0aGUgZXhlY3V0YWJsZSwgZS5nLiwgbGlua2luZw0KICB0aGUgY29yZV9r ZXJuZWwgbGlicmFyeSByZXN1bHRzIGluIGEgcXVpdGUgbGFyZ2UgYmluYXJ5LCB3aGljaCBtYXkN CiAgaW5jcmVhc2UgdGhlIHN0YXJ0dXAgdGltZS4gSW5zaWduaWZpY2FudGx5LCBidXQgaW4gc29t ZSB1c2UgY2FzZXMsIGl0DQogIG1pZ2h0IGJlIGEgc2lnbmlmaWNhbnQgZmFjdG9yLg0KDQoNCltr bm93bGVkZ2UgcmVwcmVzZW50YXRpb24gYW5kIHJlYXNvbmluZyBlbmdpbmVdDQo8aHR0cHM6Ly9i aW5hcnlhbmFseXNpc3BsYXRmb3JtLmdpdGh1Yi5pby9iYXAvYXBpL21hc3Rlci9iYXAta25vd2xl ZGdlL0JhcF9rbm93bGVkZ2UvS25vd2xlZGdlL2luZGV4Lmh0bWw+DQoNCltlbXVsYXRpbmcgYmlu YXJ5IHByb2dyYW1zXQ0KPGh0dHBzOi8vYmluYXJ5YW5hbHlzaXNwbGF0Zm9ybS5naXRodWIuaW8v YmFwL2FwaS9tYXN0ZXIvYmFwLXByaW11cy9CYXBfcHJpbXVzL1N0ZC9pbmRleC5odG1sPg0KDQpb aGF2ZSByZXdyaXR0ZW4gb3VyIG1haW4gbW9uYWRzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9CaW5h cnlBbmFseXNpc1BsYXRmb3JtL2JhcC9wdWxsLzEzNjE+DQoNCg0KSXZhbiBHb3RvdmNoaXRzIHRo ZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQXMgaXQgd2FzIGFscmVhZHkgc3VnZ2Vz dGVkLCB5b3UgY2FuIHVzZSBbbW9uYWQgdHJhbnNmb3JtZXJzXSwgdG8NCiAgY29tcG9zZSBzZXZl cmFsIG1vbmFkcyBpbnRvIGEgc2luZ2xlIG1vbmFkLiBBcyBhIHNob3ctY2FzZSwgd2Ugd2lsbA0K ICB1c2UgdGhlIFttb25hZHNdIGxpYnJhcnkgKGRpc2NsYWltZXIsIEkgYW0gYW4gYXV0aG9yIG9m IHRoaXMgbGlicmFyeSksDQogIHdoaWNoIHlvdSBjYW4gaW5zdGFsbCB3aXRoDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBvcGFtIGluc3RhbGwgbW9uYWRzDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIEl0IG9mZmVycyBtb3N0IG9mIHRoZSB3ZWxsLWtub3duIG1vbmFkcyBpbiBhIGZvcm0gb2Yg YSBtb25hZA0KICB0cmFuc2Zvcm1lciwgd2hpY2ggaW4gdGVybXMgb2YgT0NhbWwsIGlzIGEgZnVu Y3RvciB0aGF0IHRha2VzIGEgbW9uYWQNCiAgYW5kIHJldHVybnMgYSBuZXcgbW9uYWQgdGhhdCBl bnJpY2hlcyBpdCB3aXRoIHNvbWUgbmV3IGJlaGF2aW9yLiBGb3INCiAgZXhhbXBsZSwgdG8gbWFr ZSBhIG5vbi1kZXRlcm1pbmlzdGljIGVycm9yIG1vbmFkLCB3ZSBjYW4gZG8NCiAgYE1vbmFkLkxp c3QuTWFrZShNb25hZC5SZXN1bHQuRXJyb3IpJyBhbmQgZ2V0IGEgbW9uYWRpYyBzdHJ1Y3R1cmUN CiAgKGkuZS4sIGEgbW9kdWxlIHRoYXQgaW1wbGVtZW50cyB0aGUgW01vbmFkLlNdIGludGVyZmFj ZSkgdGhhdCBpcyBib3RoDQogIGEgbGlzdCBtb25hZCBhbmQgYW4gZXJyb3IgbW9uYWQuICBUaGUg c21hbGwgY2F2ZWF0IGlzIHRoYXQgdGhlDQogIG9wZXJhdGlvbnMgb2YgdGhlIHdyYXBwZWQgbW9u YWQsIHRoZSBlcnJvciBtb25hZCBpbiBvdXIgY2FzZSwgYXJlIG5vdA0KICBhdmFpbGFibGUgZGly ZWN0bHksIHNvIHdlIGhhdmUgdG8gX2xpZnRfIHRoZW0sIGUuZy4sDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgbGV0IGZhaWwgcCA9IGxpZnQgQEAgTW9uYWQuUmVzdWx0LkVycm9yLmZhaWwgcA0K ICDilJTilIDilIDilIDilIANCiAgU28gdGhhdCBpbiB0aGUgZW5kLCB0aGUgZnVsbCBpbXBsZW1l bnRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtZWQgbW9uYWQNCiAgc3RpbGwgcmVxdWlyZXMgc29tZSBi b2lsZXJwbGF0ZSBjb2RlLA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIExpc3RF ID0gc3RydWN0DQogIOKUgiAgIHR5cGUgJ2EgdCA9ICdhIGxpc3QgTW9uYWQuUmVzdWx0LkVycm9y LnQNCiAg4pSCICAgaW5jbHVkZSBNb25hZC5MaXN0Lk1ha2UoTW9uYWQuUmVzdWx0LkVycm9yKQ0K ICDilIIgICBsZXQgZmFpbCBwID0gbGlmdEBATW9uYWQuUmVzdWx0LkVycm9yLmZhaWwgcA0KICDi lIIgICAoKiBhbmQgc28gb24gZm9yIGVhY2ggb3BlcmF0aW9uIHRoYXQgaXMgc3BlY2lmaWMgdG8g dGhlIHdyYXBwZWQgbW9uYWQgKikNCiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0KICBO b3csIGxldCdzIHRyeSB3cmFwcGluZyB0aGUgTHd0IG1vbmFkIGludG8gdGhlIHN0YXRlLiBXZSBk b24ndCB3YW50IHRvDQogIGFkZCB0aGUgRXJyb3IgbW9uYWQgYmVjYXVzZSBMd3QgaXMgYWxyZWFk eSB0aGUgZXJyb3IgbW9uYWQgYW5kIGFkZGluZw0KICBhbiBleHRyYSBsYXllciBvZiBlcnJvcnMg bW9uYWQgaXMgbm90IHdoYXQgd2Ugd2FudC4gRmlyc3Qgb2YgYWxsLCB3ZQ0KICBuZWVkIHRvIGFk YXB0IHRoZSBgTHd0JyBtb25hZCB0byB0aGUgYE1vbmFkLlMnIGludGVyZmFjZSwgZS5nLiwNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgTHd0TSA9IHN0cnVjdA0KICDilIIgICB0eXBl ICdhIHQgPSAnYSBMd3QudA0KICDilIIgICBpbmNsdWRlIE1vbmFkLk1ha2Uoc3RydWN0DQogIOKU giAgICAgICB0eXBlICdhIHQgPSAnYSBMd3QudA0KICDilIIgICAgICAgbGV0IHJldHVybiA9IEx3 dC5yZXR1cm4NCiAg4pSCICAgICAgIGxldCBiaW5kID0gTHd0LmJpbmQNCiAg4pSCICAgICAgIGxl dCBtYXAgeCB+ZiA9IEx3dC5tYXAgZiB4DQogIOKUgiAgICAgICBsZXQgbWFwID0gYEN1c3RvbSBt YXANCiAg4pSCICAgICBlbmQpDQogIOKUgiBlbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSWYg d2Ugd2FudCB0byBrZWVwIHRoZSBzdGF0ZSB0eXBlIG1vbm9tb3JwaGljLCB0aGVuIHdlIHdpbGwg bmVlZCBhDQogIG1vZHVsZSBmb3IgaXQuIFN1cHBvc2UgeW91ciBzdGF0ZSBpcyByZXByZXNlbnRl ZCBhcywNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgU3RhdGUgPSBzdHJ1Y3QNCiAg 4pSCICAgdHlwZSB0ID0gc3RyaW5nIE1hcC5NKFN0cmluZykudA0KICDilIIgZW5kDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIE5vdywgd2UgY2FuIHVzZSBpdCB0byBidWlsZCBvdXIgYFN0YXRlKEx3 dCknIFJ1c3NpYW4gZG9sbCwNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgSU8gPSBz dHJ1Y3QNCiAg4pSCICAgaW5jbHVkZSBNb25hZC5TdGF0ZS5UMShTdGF0ZSkoTHd0TSkNCiAg4pSC ICAgaW5jbHVkZSBNb25hZC5TdGF0ZS5NYWtlKFN0YXRlKShMd3RNKQ0KICDilIIgDQogIOKUgiAg ICgqIGxldCdzIGxpZnQgW3JlYWRdIGFzIGFuIGV4YW1wbGUgKikNCiAg4pSCICAgbGV0IHJlYWQg ZmQgYnVmIG9mcyBsZW4gPQ0KICDilIIgICAgIGxpZnQgKEx3dF91bml4LnJlYWQgZmQgYnVmIG9m cyBsZW4pDQogIOKUgiBlbmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGBNb25hZC5TdGF0 ZS5UMScgZnVuY3RvciBpcyB1c2VkIHRvIGNyZWF0ZSB0aGUgdHlwZXMgZm9yIHRoZQ0KICBnZW5l cmF0ZWQgbW9uYWQuIFlvdSBjYW4gd3JpdGUgdGhlbSBtYW51YWxseSwgb2YgY291cnNlLCBsaWtl IGFzIHdlDQogIGRpZCBpbiB0aGUgTGlzdChFcnJvcikgZXhhbXBsZSwgYnV0IHRoZSB0eXBlIGdl bmVyYXRpbmcgbW9kdWxlcyBhcmUNCiAgaGVyZSBmb3IgdGhlIGNvbnZlbmllbmNlwrkNCg0KICBO b3csIGxldCdzIGdldCBiYWNrIHRvIHRoZSBwcm9ibGVtIG9mIHRoZSBsaWZ0aW5nLiBJdCBsb29r cyB0ZWRpb3VzIHRvDQogIGltcG9zc2libGUgdG8gbGlmdCBldmVyeSBvcGVyYXRpb24gZnJvbSBM d3QuICBDb21tb25seSwgd2UgdHJ5IHRvIHB1dA0KICB0aGUgc21hbGxlciBtb25hZCBpbnNpZGUs IHRvIG1pbmltaXplIHRoZSB3b3JrLCBidXQgaXQgZG9lc24ndCB3b3JrDQogIHdpdGggTHd0IGFz IHRoZSBsYXR0ZXIgaXMgbm90IGEgdHJhbnNmb3JtZXIuIFNvIHdoYXQgaXMgdGhlIHNvbHV0aW9u Pw0KICBGb3IgbWUsIHRoZSBzb2x1dGlvbiBpcyB0byBub3QgbGlmdCB0aGUgb3BlcmF0aW9ucyBh dCBhbGwsIGJ1dA0KICBpbnN0ZWFkLCBkZWZpbmUgeW91ciBJTyBhYnN0cmFjdGlvbiBhbmQgaGlk ZSB0aGF0IGl0IGlzIHVzaW5nIEx3dA0KICB1bmRlcm5lYXRoIHRoZSBob29kLiBUaGlzIHdpbGwg bWFrZSB0aGUgY29kZSB0aGF0IHVzZXMgdGhpcyBuZXcNCiAgYWJzdHJhY3Rpb24gbW9yZSBnZW5l cmljIGFuZCBsZXNzIGVycm9yLXByb25lIHNvIHRoYXQgaXQgY2FuIGZvY3VzIG9uDQogIHRoZSBi dXNpbmVzcyBsb2dpYyBhbmQgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgY291bGQgYmUgaGlk ZGVuDQogIGluc2lkZSB0aGUgbW9uYWQgaW1wbGVtZW50YXRpb24uIFRoaXMgaXMgd2hhdCB0aGUg bW9uYWRzIGFyZSBmb3IsDQogIGFueXdheS4NCg0KICDCueKBviBXZSBvbWl0IHRoZSB0eXBlcyBm cm9tIHRoZSBvdXRwdXQgb2YgdGhlIGBNYWtlJyBmdW5jdG9yIHNpbmNlIGZvciBhDQogIGxvbmcg dGltZSBPQ2FtbCBkaWRuJ3QgYWxsb3cgdGhlIHJlcGV0aXRpb24gb2YgdHlwZXMgaW4gYSBzdHJ1 Y3R1cmUgc28NCiAgaGF2aW5nIHRoZSB0eXBlcyBpbiBpdCB3aWxsIHByZXZlbnQgdXMgZnJvbSBj b21wb3NpbmcgdmFyaW91cyBmbGF2b3JzDQogIG9mIG1vbmFkcyB1c2luZyBgaW5jbHVkZScuIEl0 IGlzIGFsc28gYSBsb25nLXRpbWUgY29udmVudGlvbiB3aWRlbHkNCiAgdXNlZCBpbiBtYW55IE9D YW1sIGxpYnJhcmllcywgaW5jbHVkaW5nIENvcmUgYW5kIEFzeW5jLiBBIGNvbnZlbnRpb24NCiAg dGhhdCB3ZSBwcm9iYWJseSBkb24ndCBuZWVkIGFueW1vcmUuDQoNCg0KW21vbmFkIHRyYW5zZm9y bWVyc10gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL01vbmFkX3RyYW5zZm9ybWVyPg0K DQpbbW9uYWRzXQ0KPGh0dHBzOi8vYmluYXJ5YW5hbHlzaXNwbGF0Zm9ybS5naXRodWIuaW8vYmFw L2FwaS9tYXN0ZXIvbW9uYWRzL01vbmFkcy9TdGQvaW5kZXguaHRtbD4NCg0KW01vbmFkLlNdDQo8 aHR0cHM6Ly9iaW5hcnlhbmFseXNpc3BsYXRmb3JtLmdpdGh1Yi5pby9iYXAvYXBpL21hc3Rlci9t b25hZHMvTW9uYWRzL1N0ZC9Nb25hZC9pbmRleC5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBb c2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hp dmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBt YWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0K DQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1 ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3du Lz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xp c3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of November 23 to 30, 20= 21.

opam 2.1.1, opam 2.0.10, and opam-depext 1.2

R. Boujbel announced

We are pleased to announce several minor releases: opam 2.0.10, opam 2.1.1= , and opam-depext 1.2.

The opam releases consist of backported fixes, while opam-depext has been adapted to be compatible with opam 2.1, to allow for workflows which need to maintain compatibility with opam 2.0. = With opam 2.1.1, if you export OPAMCLI=3D2.0 into your environment then workflows expecting o= pam 2.0 should now behave even more equivalently.

You'll find more information in the blog post .

OTOML 0.9.0 =E2=80=94 a compliant and flexible TOML parsing, m= anipulation, and pretty-printing library

Archive:

Daniil Baturin announced

A new 0.9.3 relase is available. Still not 1.0.0 just in case. The change I= 'm most glad I managed to make is that the lexer is now re-entrant and doesn't use any mutable state. Where can I appl= y for the "Designed for multicore OCaml" certification sticker? ;)

Breaking change in the functor interface

I found an oversight that took a breaking change to fix. It didn't break an= y package that was already in the OPAM repository, so I'm glad I noticed it before it caused anyone trouble.

My idea to make the functor take separate integer and float modules turned = out to be misguided: it wouldn't compose with Otoml.get_float ~strict:false and similar functions that = apply type conversions.

Logically, Otoml.get_float ~strict:false (Otoml.integer 5) sho= uld produce Otoml.TomlFloat 5.0. However, it means that get_float needs to know how to convert integers to float.= If integer and float types are in separate modules, that isn't possible.

So I combined both integers and floats in a single TomlNumber.= That way people who want to bring their own bignum libraries will have to write more code, but numbers will behave as they are= expected to in a dynamically typed format.

module BigNumber =3D struct
  type int =3D Z.t
  type float =3D Deci=
mal.t

  let int_of_string =3D Z.of_string
  let int_to_string =3D Z.to_string
  let int_of_boolean =
b =3D if b then Z.one else Z.<=
/span>zero
  let int_to_boolean =
n =3D (n <> Z.zero)

  (* Can't just reuse Decimal.to/of_string because their optional arguments
     would cause a signature mismatch. *)
  let float_of_string s =3D Decimal.of_string s

  (* Decimal.to_string uses "NaN" spelling
     while TOML requires all special float =
values to be lowercase. *)
  let float_to_string x =3D Decimal.to_string x |> =
String.lowercase_ascii
  let float_of_boolean if b then Decimal.=
one else Decimal.zero
  let float_to_boolean Decimal.z=
ero)

  let float_of_int =3D let int_of_float =3D end

module Otoml =3D Otom=
l.Base.Make (BigNumber) (Otoml.Base.StringDate)

The next release will likely be 1.0.0 for real.

New release of Fix

Fran=C3=A7ois Pottier announced

I am pleased to announce a new release of Fix, with several new modules contribued by Fr=C3=A9d=C3=A9ric Bour (thanks!).

In short, Fix is a toolkit that helps perform memoization and fixed point computations (including data flow analyses). More generally, it offers a number of basic algorithmic building blocks that can be useful in many circumstances.

opam update
opam install fix.20211125

Documentation can be found here:

Enjoy,

Fran=C3=A7ois Pottier
francois.pottier@inria.fr
http://cambium.inria.fr/~fpo= ttier/

2021/11/25

  • The new module CompactQueue offers a minimalist mutable FI= FO queue. It is comparable with OCaml's Queue module. In comparison with Queue, it uses a more compact internal representation: elements are stored contiguously in a circular array. This has a positive impact on performance: both time and memory consumption are reduced. This data structure is optimized for maximum throughput. (Contributed by Fr=C3=A9d=C3=A9ric Bour, reviewed by Fran=C3=A7= ois Pottier.)
  • The new functor DataFlow.ForCustomMaps offers a forward da= ta flow analysis that is tuned for greater performance. (Contributed by Fr=C3=A9d=C3=A9ric B= our, reviewed by Fran=C3=A7ois Pottier.)
  • The new module Indexing offers a safe API for manipulating= indices into fixed-size arrays. This API involves some dynamic checks as well as static type checks, thereby (hopefully) greatly reducing the risk of confusion in code that uses many arrays and many indices into these arrays. (Contributed by Fr=C3=A9d=C3=A9ric Bour, reviewed by Fran=C3=A7ois Pottier.)
  • In DataFlow, allow the function foreach_root (which is part of the signature DATA_FLOW_GRAPH) to call contribute x _ several times at a single root x<= /code>.

New release of Menhir (20211125)

Fran=C3=A7ois Pottier announced

I am pleased to announce a new release of Menhir, with an exciting contribution by Fr=C3=A9d=C3=A9ric Bour: a groundbreaking performance impro= vement in menhir --list-errors. This is made possible by an entirely new= reachability algorithm, which has been designed and implemented by Fr=C3=A9d=C3=A9ric, a= nd which is described in our paper "Faster Reachability Analysis for LR(1) Parsers". Th= is is the link to the paper:

http://cambium.inria.fr/~fpottier/publis/bour-pottier-reachability.= pdf

To install the new release, just type

opam update
opam install menhir.20211125

Enjoy!

Fran=C3=A7ois Pottier
Francois.Pottier@inria.fr
http://cambium.inria.fr/~fpo= ttier/

  • The command menhir --list-errors has been sped up by a fac= tor of up to x100, and requires up to x1000 less memory, thanks to a new LR(1) reachability algorithm, which has been designed and implemented by Fr=C3=A9d=C3=A9ric Bour.
  • Better document the restricted way in which the error toke= n must be used when using --strategy simplified. Menhir now checks that = this token is used only at the end of a production, and warns if this is not the case. (Better yet, our suggestion is to not use the error token at all!)
  • The $syntaxerror keyword is now forbidden when using --strategy simplified. This keyword will be entirely removed in the next release. Incidentally, we have just found out that it behaves differently under the code back-end and under the table back-end.
  • Disable OCaml warning 39 (unused rec flag) in the OCaml code produced by Menhir's code back-end. This does not affect the table back-end. (Reported by Arma=C3=ABl Gu=C3=A9neau.)
  • Fix a bug in --random-* which could cause Menhir to diverg= e if the grammar uses the error token.
  • Warn if a terminal symbol is named Error. This creates a n= ame clash in the public interface of the generated parser.
  • Menhir now requires OCaml 4.03.0 (instead of 4.02.3) and Dune 2.8.0 (instead of 2.0.0).

Lwt 5.5.0, Lwt_domain 0.1.0, Lwt_react.1.1.5

Rapha=C3=ABl Proust announced

It is my pleasure to announce the release of Lwt version 5.5.0, Lwt_domain = version 0.1.0, Lwt_react version 1.1.5, Lwt_ppx version 2.0.3 and Lwt_ppx_let version 5.5.0.

https://githu= b.com/ocsigen/lwt/releases/tag/5.5.0

All those packages can be installed via opam as usual.

:rotating_light: Deprecation

One notable change is the deprecation of Lwt_main.yield and Lwt_unix.yield. It is recommended to use Lwt.pause instead.

:rocket: Lwt_domain: an interface to multicore paral= lelism

Another notable change is the addition of the Lwt_domain package. This pack= age includes a single module Lwt_domain with functions to execute some computations in parallel, using the features= of Multicore OCaml. The package requires an OCaml compiler with domains support to install.

Code for this package is the work of @sudha with reviews and packaging from= Lwt contributors.

Other changes

The full list of changes is available in the CHANGES file.

OCaml's CI is gradually moving to GitHub Actions

Sora Morimoto announced

The OCaml team started switching to GitHub Actions last year for some of th= e official OCaml repositories. Also, we have released some CI related stuff, such as setup-ocaml, to the community.= Some OCaml hackers also know that CI in the OCaml community is gradually switching to GitHub Actions nowadays.

However, what gradually became a problem when we started switching was that= the number of concurrent jobs that could run in a free account on GitHub was not enough for our activeness.

One of the major pain points for compiler contributors is that the wait tim= e for CI to complete, which is unrelated to the actual build, is too long. However, this has been a pain point in al= l services, even before GitHub Actions.

The GitHub team did their best to help us make it better. As a result, they= offered to upgrade the OCaml organization's plan to the team plan for free, which means that we can now = benefit from a range of features, including access to 3x more concurrent runners than before.

We would like to thank GitHub for supporting our team and Ahmed Bilal, who = supported this effort.

How to combine 3 monads: Async/Lwt, Error and State?

Deep in this thread, Ivan Gotovchits said

The monads library provides the transformers for some well-known monads. Al= l these monads have a more or less standard implementation, offering the same performance as any other monadic= library can offer. Like there is no better way of implementing the state monad other than a function. We have e= xperimented a lot with different performance optimizations, such as boxing and unboxing it and inlining vari= ous operators, and keep experimenting to get the maximum from the current compiler. In BAP, we heavily use the monad= s library, first of all for our k= nowledge representation and reasoning engine, which is the foundation for all BA= P analyses. We also use it for emulating binary programs. The rich interface is here to make our life easier an= d more comfortable when we use monads. It definitely comes for free=C2=B9 as the number of functions doesn't affect t= he performance of the underlying monad.

But… there is always a but :) Stacking monads using a transformer do= es have a price. Even with the flambda compiler. The latter is doing an excellent job of unstacking them and elimi= nating the overhead of having a chain of monads. But our latest experiments show that a custom-made monad (still wit= h the monads library) performs better under either branch of the compiler. We have rewritten our main monads that we= re relying on transformers and got from 20% to 50% performance improvement. But that is not to say that the mo= nads library itself is slow or that we're not using it, it is to say that there are other options to transformers tha= t might work in some cases. See the linked PR if you want to learn the trick.

=C2=B9=E2=81=BE Provided that we ignore the size of the executable, e.g., l= inking the core_kernel library results in a quite large binary, which may increase the startup time. Insignificantly, b= ut in some use cases, it might be a significant factor.

Ivan Gotovchits then said

As it was already suggested, you can use monad transformers, to compose several monads= into a single monad. As a show-case, we will use the monads library (discla= imer, I am an author of this library), which you can install with

opam install monads

It offers most of the well-known monads in a form of a monad transformer, w= hich in terms of OCaml, is a functor that takes a monad and returns a new monad that enriches it with some new behavi= or. For example, to make a non-deterministic error monad, we can do Monad.List.Make(Monad.Result= .Error) and get a monadic structure (i.e., a module that implements the Monad.S interfac= e) that is both a list monad and an error monad. The small caveat is that the operations of the wrapped monad, the error monad in our case, are= not available directly, so we have to lift them, e.g.,

let fail p =3D lift @@ Monad.Result.Error.fail p

So that in the end, the full implementation of the transformed monad still = requires some boilerplate code,

module ListE =3D struct
  type 'a t =3D 'a list Monad.Result.Error.t
  include Monad.List.Make(Monad.Result.Error)
  let fail p =
=3D lift@@Monad.Result.Error.fail p
  (* and so on for each operation that is specific to the wrapped monad =
*)
end

Now, let's try wrapping the Lwt monad into the state. We don't want to add = the Error monad because Lwt is already the error monad and adding an extra layer of errors monad is not what we want. = First of all, we need to adapt the Lwt monad to the Monad.S interface, e.g.,

module LwtM =3D struct
  type 'a t =3D 'a Lw=
t.t
  include Monad.Make(struct
      type 'a t =3D 'a let return =3D =
Lwt.return
      let bind =3D Lw=
t.bind
      let map x ~f =3D Lwt.map f x
      let map =3D `Custom map
    end)
end

If we want to keep the state type monomorphic, then we will need a module f= or it. Suppose your state is represented as,

module State =3D struct
  type t =3D string M=
ap.M(String=
).t
end

Now, we can use it to build our State(Lwt) Russian doll,

module IO =3D struct
  include Monad.State.T1(State)(LwtM)
  include Monad.State.Make(State)(LwtM)

  (* let's lift [read] as an example *)<=
/span>
  let read fd =
buf =
ofs len =3D
    lift (Lwt_unix.read fd buf ofs l=
en)
end

The Monad.State.T1 functor is used to create the types for the= generated monad. You can write them manually, of course, like as we did in the List(Error) example, but the type generating = modules are here for the convenience=C2=B9

Now, let's get back to the problem of the lifting. It looks tedious to impo= ssible to lift every operation from Lwt. Commonly, we try to put the smaller monad inside, to minimize the work, but= it doesn't work with Lwt as the latter is not a transformer. So what is the solution? For me, the solution is to not = lift the operations at all, but instead, define your IO abstraction and hide that it is using Lwt underneath the hoo= d. This will make the code that uses this new abstraction more generic and less error-prone so that it can focus on t= he business logic and the implementation details could be hidden inside the monad implementation. This is what the m= onads are for, anyway.

=C2=B9=E2=81=BE We omit the types from the output of the Make = functor since for a long time OCaml didn't allow the repetition of types in a structure so having the types in it will prevent u= s from composing various flavors of monads using include. It is also a long-time convention widely used i= n many OCaml libraries, including Core and Async. A convention that we probably don't need anymore.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 1CBD2E00D1 for ; Tue, 14 Dec 2021 12:02:29 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=THyk=Q7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AiEMP1xMbLZ+wyziy+y0l6nb1CxdPi9zP1u491JM?= =?us-ascii?q?rhvp0f7i5+Ny6ZQqDv6wr3ACCBNyTwskHotKei7rnV20E7MTJm1E5W7sIaSU4j?= =?us-ascii?q?94LlRcrGs+PBB6zBvfraysnAJYKDwc9rDm0PkdPBcnxeUDZrGGs4j4OABX/Mhd?= =?us-ascii?q?+KvjoFoLIgMm7yf2+94fQbghKizaxfK5+JwiqoAvMscUbnZFsIbsrxBvTpXtId?= =?us-ascii?q?eVWxWd2Kl+Wgh3x+MS+8oN9/ipJo/4u+NJOXqv8f6QjULxXFy8mPHwv5M3qrhb?= =?us-ascii?q?MUw2C7WYBX2oMkxpIBw/F7AzmXpr0ryD3uPZx1DWcMMbrSr86RCmi77xzSBD2l?= =?us-ascii?q?CgHKzA38GbSisNqjaJbpg+qqxhwzoPQZY2YMvpycKDbfdMERGpBRcdRWDdFAoy?= =?us-ascii?q?icoAOAe0BPfxFoInmulACqRWzCRWpCO7p1zRGhGL53bci3uohDw/IwQIuEdEBv?= =?us-ascii?q?3vIt9j6LrseXPqvwaXU0TnObfVb0ir95ojSdRAhpOmBUK50ccXLz0kkCh7LgUm?= =?us-ascii?q?QqYzgPjOVyvgNuHWc4uV6UeKgkWgnpxtqojezxscsj4jJhp4Jyl3f7SV5x4I1J?= =?us-ascii?q?N2kSEFlfdGkEJ1QtyCDN4trXMwuWWZouDw1yrAfv5OwYScFxog9yRHFd/yHb5a?= =?us-ascii?q?H4gjlVOuJLjl0mHxodK6iixiy80Wt1O/xWMm23VpXrCdIlsTBuHAQ2hDP6saKR?= =?us-ascii?q?OZx80ig1DuSyQze6eBJLF0qmKfHJZMt3rg9nYcdv0TEGy/5gkT2jKmOe0U85Oe?= =?us-ascii?q?o9+XnYqn4qZ+EMI90jwT+Pbo0lsy5H+s4LhACX2+H9uum0b3j+Vf1QLJQjv05i?= =?us-ascii?q?qXZv5HaJdgbpq6kGABZyJos6xG6Dzu+39QYnGUHLFZfdx2clYTmJ1bOIPXgAfe?= =?us-ascii?q?wglSsjDdrx+3dMbH7A5XNKWDPkbngfbZ+6k5c0BQ8ws1e551OEL0BJ+jzWkDpu?= =?us-ascii?q?NzXDx85Lwy0w/v8B9VgzYMRR3iPDbOeMKPUrV+H+OQvI/WWaIAJvzb9LuAp5//?= =?us-ascii?q?ojX8ihV8SZ62p3Z8NZHCjHvRqO1+ZbmT2jdgcFGcFoBAyTOn3h1GaSzFTZ2yyU?= =?us-ascii?q?Lwy5jEgEo6pEYDDRoW1jLyAwSi6HplWZmRcBlCLC3foeIOJUOoPZiKKOsJtjyI?= =?us-ascii?q?IWLy7R4M8yR2juxX2xrR7IubO9CAVuorv2dp26uHJix0/+iJ4A96A32yCVW14g?= =?us-ascii?q?2wFSyMw0atiu0Jy0E2D3rJ9g/FAFdxc+fdJUgAiOJ7ZwO12Fsr+WhrGfteNSFe?= =?us-ascii?q?mXsupDi0xTtI3wt8Oelt9FMu4ghDExSqqDKcZl72NBJMq7qLRx2X9K9h5xnrcy?= =?us-ascii?q?aUtk1YrTtFBOGG6nKJy+QfeC5bMk0qDlqaqcaoc3DTK9GeG1WeAoV1WXhNsXaj?= =?us-ascii?q?dQ34RZEvXrdfh603ZTbKjEawnMgxFyc+CNqtFdMHmjVVARPfiIdTefny+l323B?= =?us-ascii?q?RaSybOBdJDle2EH0yXbEkQEiBwc/XaDNQg/Giehv3nTAydpFVLyZUPj7fdxqGi?= =?us-ascii?q?hQk8xwAyLYFdt172v+h4anfCcUe8c3qoYuCc9rDV5BEqy0MjTC9qEvgZheKRcY?= =?us-ascii?q?cgh4FpczmLYtwl9PoS6IKx4h14edR53v0L02BltBIVAi5tikHR/hg5tL+jQhFd?= =?us-ascii?q?ecRucwpa2PLDLfC26thuwbeSekgXVz9C+/qYU9O9+qlnyuAXvEVAtpTEv2NBQ1?= =?us-ascii?q?z6Y547WJAsUS5P4FEgtpDZgoLSPSy004cvv3n1pMLWo+mvL39svQvAuyhOhY8t?= =?us-ascii?q?3KKSABRP/GM0cBtGzJaotgVf/PUFMB/xb6KNhZ5DuTPCBwqP+Y7cIdNOOiHQep?= =?us-ascii?q?ph61lOQ+iF8TO/RwptDxOuXjFLvv9LUlFClo9z6koBCZCgPEyy40ye2Xea5iYV?= =?us-ascii?q?4epsNAmq1Zcjr1pN5nZG/AhZl?= IronPort-Data: =?us-ascii?q?A9a23=3AyxKkMaJN0gIZfKDxFE+RypQlxSXFcZb7ZxGrkP8?= =?us-ascii?q?bfHC71Tor12YCmGFLUGuEa/iOZ2r3c9lwbIS0/UwDucfcyKc2QQE+nZ1PZyIT+?= =?us-ascii?q?JCdXbx1DW+pYnjMdpWbJK5fAnR3huDodKjYdVeB4Ef9WlTdhSMkj/jRHOOgULS?= =?us-ascii?q?s1h1ZHGeIdg9x0XqPpMZi2uaEsfDha++8kYuaT//3YDdJ6BYoWo4g0J9vnTs01?= =?us-ascii?q?BjEVJz0iXRlDRxDlAe2e3D4l/vzL4npR5fzatE88uJX24/+IL+FEmPxp3/BC/u?= =?us-ascii?q?ggu+9akoOU6LfNgiIi2NLVu6lmBcqSi4ai/xqcqNENQEM03PSw7idy/0V3XC0Y?= =?us-ascii?q?TwTBfWZpMQMUExhTHRmOqlX5LLMIX6+qNGeiUrcfC7lx/xoSlo9PYgZ5vpfC2Z?= =?us-ascii?q?T8/cVM3YIMgDFgPi5qF6+YrYx2Z59RCXsFNlG4C4wnGux4ewdaZvKRqGP4d5Dw?= =?us-ascii?q?B8rl8VWFLDfYdAYYHxhdnz9j7dnLg9CU9RjiL793j+nZ2cN8BTP+PRp9zOGlEo?= =?us-ascii?q?sxOe4GcTzUdmsacVxv0++mnjg6z2hV0lebMj3JSGt92L1wPfImTLnVYkSEryh6?= =?us-ascii?q?/Msh0ecrlH/wSY+DTOTycRVQGbnMz6eF6AVxsbqha0irQqzSd3sQxCzoHiFpwM?= =?us-ascii?q?RHd1KHIXWLSmTn7HM7V/x6ncsF1Z8hB4O7afahgDGEneDmM7vDjF09rjJWTSa7?= =?us-ascii?q?Lj8QfaaIjAbdylaDcMbZVJt3jQgyb3fSjrXSdJyDKO+jtv0ACz9hTeQo0DSQp0?= =?us-ascii?q?IlcBRkf3TEU/v2lqRm3QCcuL5Csg7kI5oAsOVqbNJv7CV1GU=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AFl7k/ahcJ795jb4pMVJw6VSOv3BQXrQji2hC?= =?us-ascii?q?6mlwRA09TyX4rauTdZsguyMc5Ax8ZJhCo7q90cu7IE80nKQdibX5Vo3OYOCJgg?= =?us-ascii?q?SVEL0=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0DdAQAcebhhhyIeaIFahANeQQFfBlc6M?= =?us-ascii?q?YRHiQOIEIMrhhmPBoQVgREBAk8QAQMBDSoBDgUBAgQBAYIRgnUCgycCHgYBBTM?= =?us-ascii?q?TAQIEFQEBBQEBAQIBAwMEARMBAQEBDQsOCDQihTsBLA2CNQwMAwODdwEYCQQGP?= =?us-ascii?q?wocIwMUAQYDAhEBFwEUCgMBEwESFAaCDE4BgxcEAQqTfJpdgS9/MoEBg04BFgE?= =?us-ascii?q?OCYQZgRFSDQIUgQAXhgxUSgGCf4QGAicQgVVEgRWCem6CTAwLAQEBAQEXgQcXB?= =?us-ascii?q?gEBVoJiF4JOBJIJLw4fGQYBAYEIBQETFgEBIAI2Kg4BBwMyDQoBAxUHAScGCws?= =?us-ascii?q?CLQORWh8FI5dSk3x4MweDQ4E1BguICIEXjGVwhyWDb0OBB4o6hlKRDiGWDB+JD?= =?us-ascii?q?AiBBAmCPZQYFgGFHYFOKmpiHgwHMxowQ4I1ATMJYQ+GZoE7hVcBMxaBBAEIBoI?= =?us-ascii?q?9gmSBdTuFS0AzAgEBNAIGAQoBAQMJhWMBAQUTCwGIIoJFAQE?= X-IPAS-Result: =?us-ascii?q?A0DdAQAcebhhhyIeaIFahANeQQFfBlc6MYRHiQOIEIMrhhm?= =?us-ascii?q?PBoQVgREBAk8QAQMBDSoBDgUBAgQBAYIRgnUCgycCHgYBBTMTAQIEFQEBBQEBA?= =?us-ascii?q?QIBAwMEARMBAQEBDQsOCDQihTsBLA2CNQwMAwODdwEYCQQGPwocIwMUAQYDAhE?= =?us-ascii?q?BFwEUCgMBEwESFAaCDE4BgxcEAQqTfJpdgS9/MoEBg04BFgEOCYQZgRFSDQIUg?= =?us-ascii?q?QAXhgxUSgGCf4QGAicQgVVEgRWCem6CTAwLAQEBAQEXgQcXBgEBVoJiF4JOBJI?= =?us-ascii?q?JLw4fGQYBAYEIBQETFgEBIAI2Kg4BBwMyDQoBAxUHAScGCwsCLQORWh8FI5dSk?= =?us-ascii?q?3x4MweDQ4E1BguICIEXjGVwhyWDb0OBB4o6hlKRDiGWDB+JDAiBBAmCPZQYFgG?= =?us-ascii?q?FHYFOKmpiHgwHMxowQ4I1ATMJYQ+GZoE7hVcBMxaBBAEIBoI9gmSBdTuFS0AzA?= =?us-ascii?q?gEBNAIGAQoBAQMJhWMBAQUTCwGIIoJFAQE?= X-IronPort-AV: E=Sophos;i="5.88,205,1635199200"; d="scan'208,217";a="75726" X-MGA-submission: =?us-ascii?q?MDF8H6JEw89f7xDGuxzNT9dXGlajfa0Ua7zdX3?= =?us-ascii?q?S+WLomkv7xrYGxhYqrh9TjpoXdSbKobBwdh4Niy6L3Y6K6IvIi7dT/jQ?= =?us-ascii?q?0GCPPb1OVBPo3zX7jjPefzXrW4FEDO0V53B8GgDAFqOH3DNp/msV6DRB?= =?us-ascii?q?9Fz0A9O5KWKnX6LxhMGsYlrg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 14 Dec 2021 12:02:28 +0100 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7798B564EDD; Tue, 14 Dec 2021 12:02:26 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 14 Dec 2021 12:02:26 +0100 Message-ID: <87a6h3a1q5.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 14 12:02:27 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.368074, queueID=DEB38564EDE X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 07 to 14, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 kqueue-ml 0.2.0 and poll 0.1.0 SWIPl-OCaml v0.5 - Never write your own unification algorithms again! opam 2.1.2 Set up OCaml 2.0.0-beta10 A hassle-free setup to release binaries for different platforms: the opam r= elease process experiment Set up OCaml 2.0.0-beta11 What's the best way to save an huge amount of data in a file p5scm 0.1.0 nanoid 1.0.0 Other OCaml News Old CWN kqueue-ml 0.2.0 and poll 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anurag Soni announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce new releases for [kqueue-ml] (version 0.2.0) and an initial release of [poll] (version 0.1.0). *Kqueue-ml*: Thin bindings to the kqueue event notification system. Changes since the last release: =E2=80=A2 Remove dependency on ctypes =E2=80=A2 Limit support to 64 bit systems =E2=80=A2 Adds constant values to be used as filter flags in the public A= PI Installation: [opam install kqueue] Caveat: This is again mostly tested on macOS, but I plan to work on testing and fixing bugs for getting the library to work well on the various BSD systems, so please open issues if you use it on a BSD system and notice problems (Thanks!). *Poll*: Portable OCaml interface to macOS/Linux/Windows native IO event notification mechanisms Installation: [opam install poll] This is the first release of poll, which builds on top of `kqueue-ml' and adds bindings to the system IO event notifications on linux and windows to provide a portable polling interface. It uses kqueue on macOS, epoll on linux, and uses [wepoll] on windows so it can leverage IOCP on windows instead of select. All io events will be level triggered, i.e. there will be a notification as long as the file descriptor being watched is ready to read/write. If you experience any problems, please open an issue on the Github Issue tracker :slightly_smiling_face: [kqueue-ml] [poll] [opam install kqueue] [opam install poll] [wepoll] SWIPl-OCaml v0.5 - Never write your own unification algorithms again! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hey all! I am just posting to announce a new package I've been working on: OCaml bindings to SWI-Prolog (ver 8.5 or higher)! It's currently in the process of being submitted to OPAM, but it's my first time writing a package with bindings to C (using ctypes), so some further changes might be needed? maybe?, but you can find the source code repository here: [repo]/[github mirror]. As a sneak peek of what the API looks like, here's a hello world: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* initialise SWIProlog *) =E2=94=82 let () =3D Swipl.initialise () =E2=94=82 (* setup the prolog database with some facts *) =E2=94=82 let () =3D Swipl.load_source "hello :- writeln('hello world')." =E2=94=82 (* construct a Swipl term in OCaml *) =E2=94=82 let hello =3D Swipl.Syntax.(!"hello") =E2=94=82 (* send the term to the Prolog engine *) =E2=94=82 let () =3D Swipl.with_ctx @@ fun ctx -> Swipl.call ctx hello =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've taken care to provide some detailed documentation + quick start guide using odoc (see ) - the quick start guide shows a step by step walkthrough on using the library to write a type inference algorithm for lambda calculus using OCaml+Prolog (no need to write your own UF). Anyway, hope this might be useful for others - I have spent way too long racking my brains on writing dumb custom unification algorithms, but now, no more! [repo] [github mirror] Kiran Gopinathan later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 Here's another example that might be interesting for those who have experience with SWI-Prolog. You can even get native interaction with CHR: is a very elegant framework which comes bundled with SWI Prolog that allows users to write complex domain specific constraint solving engines in a concise declaritive way. Here's a CHR system that models the interaction between `salt' and `water' (basic I know, but look up CHR to see some more powerful examples): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D Swipl.load_source " =E2=94=82 :- use_module(library(chr)). =E2=94=82=20 =E2=94=82 :- chr_constraint salt/0, water/0, salt_water/0. =E2=94=82=20 =E2=94=82 salt, water <=3D> salt_water. =E2=94=82=20 =E2=94=82 reducesTo_(Goal, C) :- =E2=94=82 call(Goal), =E2=94=82 call(user:'$enumerate_constraints'(C)). =E2=94=82 reducesTo(Goal, Constraints) :- =E2=94=82 findall(Constraint, reducesTo_(Goal, Constraint), Constraints). =E2=94=82 " =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Which we can then embed into OCaml using the following code: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let solve_constraints ls =3D =E2=94=82 (* Create a new term variable context *) =E2=94=82 Swipl.with_ctx (fun ctx -> =E2=94=82 (* create a term for the result *) =E2=94=82 let result =3D Swipl.fresh ctx in =E2=94=82 (* encode the constraint store *) =E2=94=82 let goal =3D encode ls in =E2=94=82 (* send the query to the Prolog engine *) =E2=94=82 Swipl.call ctx (reducesTo goal result); =E2=94=82 (* extract the result *) =E2=94=82 decode ctx result =E2=94=82 ) =E2=94=82 (* val solve_constraints: t list -> t list *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 (Again, some steps have been omitted for brevity, and you should check out the quick start guide for a step by step walkthrough). opam 2.1.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the minor release of [opam 2.1.2]. This opam release consists of [backported] fixes, including: =E2=80=A2 Fallback on `dnf' if `yum' does not exist on RHEL-based systems ([#4825]) =E2=80=A2 Use `--no-depexts' in CLI 2.0 mode. This further improves the u= se of opam 2.1 as a drop-in replacement for opam 2.0 in CI, for example with setup-ocaml in GitHub Actions. ([#4908]) To upgrade simply run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocam= l/opam/master/shell/install.sh) --version 2.1.2" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [opam 2.1.2] [backported] [#4825] [#4908] Set up OCaml 2.0.0-beta10 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Added =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Added "extends" experimentally. Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Remove some hacks as `--no-depexts' is now used in CLI 2.0 mode= from opam 2.1.2. A hassle-free setup to release binaries for different platforms: the opam r= elease process experiment =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On top of the [opam 2.1.2 announcement], I=E2=80=99d like share an experi= ment with the opam release script used for this release. As you might know, for each releases of opam we provide pre-compiled binaries for ease of use. We=E2=80=99ve had a release script which up to= this point required a specific setup to get it running correctly. For instance we had to setup a local OpenBSD machine (possibliy virtualised), a macOS/x86_64 machine and a macOS/arm64. This setup is rather tedious to reproduce. To improve this situation I=E2=80=99ve experimented over the past week wi= th [QEMU] and [Rosetta 2] to make it a "one click script": This change makes so that the script now only requires a macOS/arm64. From there you can: =E2=80=A2 compile locally for macOS/arm64 binaries =E2=80=A2 compile locally for macOS/x86_64 binaries (using Rosetta 2) =E2=80=A2 compile for BSDs (using QEMU) =E2=80=A2 compile for Linux (using Docker) With this, the [binaries] for this release have been compiled with this more reproducible setup, and now include FreeBSD/x86_64 binaries as well :sparkles: If someone wants to have a similar setup to distribute binaries here is the git repository (using Git LFS to store the large files). Feel free to use and experiment with it: For now it only has OpenBSD/x86_64 and FreeBSD/x86_64 images but it could theoretically have more. Although I=E2=80=99m not accepting PRs for= now (for obvious security reasons), I=E2=80=99m open to suggestions to add mo= re platforms. See the [README] for high level details about the setup. [opam 2.1.2 announcement] [QEMU] [Rosetta 2] [binaries] [README] Set up OCaml 2.0.0-beta11 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Add support for more styles for the ocamlformat configuration in lint-fmt action. What's the best way to save an huge amount of data in a file =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Deep in this thread, Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 What a coincidence, I wrote an [Avro library] very recently. The paint is still fresh. However, it might be worth giving it a try as it's exactly the targeted use case: many rows of relatively simple data, encoded as binary; it also supports gzip compression (per "block" of N many rows, with N configurable). And there's no need to worry about endianess. It typically uses code generation from a schema (a json file). There's libraries for Avro in java (with all the Spark ecosystem) and also python (see "fastavro"). [Avro library] p5scm 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Jason Nielsen announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99ve released [p5scm] which is now up on `opam'. It is a scheme-= like implementation on top of `camlp5''s [pa_schemer.ml] extension. I know that `camlp5' isn't the cool kid on the block these days but it is a powerful tool and pretty cool in my estimation ;-). [p5scm] [pa_schemer.ml] nanoid 1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: mefyl announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of [nanoid 1.0.0]. NanoID are [popular unique ids] amongst the javascript ecosystem. This library brings an equivalent native implementation and a virtual library to transparently branch between the native implementation and the original javascript one. The intent is to enable pieces of code generating such ids to be moved transparently between frontend and backend of a web stack. This is an humble first contribution to gain some experience and will hopefully be followed by more of our internal developments. [nanoid 1.0.0] [popular unique ids] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocamlcore planet blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [OCaml Planet]. =E2=80=A2 [Monorobot: a Slack bot for monorepos] =E2=80=A2 [opam 2.1.2 release] [OCaml Planet] [Monorobot: a Slack bot for monorepos] [opam 2.1.2 release] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 07 to 14, 20= 21.

kqueue-ml 0.2.0 and poll 0.1.0

Anurag Soni announced

I'd like to announce new releases for kqueue-ml (version 0.2.0) and an initial release of poll = (version 0.1.0).

Kqueue-ml: Thin bindings to the kqueue event notification system. Ch= anges since the last release:

  • Remove dependency on ctypes
  • Limit support to 64 bit systems
  • Adds constant values to be used as filter flags in the public API

Installation: opam inst= all kqueue

Caveat: This is again mostly tested on macOS, but I plan to work on testing= and fixing bugs for getting the library to work well on the various BSD systems, so please open issues if you use i= t on a BSD system and notice problems (Thanks!).

Poll: Portable OCaml interface to macOS/Linux/Windows native IO even= t notification mechanisms

Installation: = opam install poll

This is the first release of poll, which builds on top of kqueue-ml and adds bindings to the system IO event notifications on linux and windows to provide a portable polling interface.= It uses kqueue on macOS, epoll on linux, and uses wepoll on w= indows so it can leverage IOCP on windows instead of select. All io events will be level triggered, i.e. there will be a notific= ation as long as the file descriptor being watched is ready to read/write.

If you experience any problems, please open an issue on the Github Issue tr= acker :slightly_smiling_face:

SWIPl-OCaml v0.5 - Never write your own unification algorithms= again!

Kiran Gopinathan announced

Hey all! I am just posting to announce a new package I've been working on: = OCaml bindings to SWI-Prolog (ver 8.5 or higher)!

3D"b5a466fc6bc9=

It's currently in the process of being submitted to OPAM, but it's my first= time writing a package with bindings to C (using ctypes), so some further changes might be needed? maybe?, but you ca= n find the source code repository here: repo/github mirror.

As a sneak peek of what the API looks like, here's a hello world:

(* initialise SWIProlog *)
let () =3D Swipl.initialise ()
(* s=
etup the prolog database with some facts *)
let () =3D Swipl.load_source "hello :- writeln('hello world')."
(* c=
onstruct a Swipl term in OCaml *)
let hello =3D Swipl=
.Syntax.(!"hello")
(* s=
end the term to the Prolog engine *)=

let () =3D Swipl.with_ctx @@ fun ctx -> Swipl.call ctx hello

I've taken care to provide some detailed documentation + quick start guide = using odoc (see http= s://gopiandcode.github.io/SWIPL-OCaml/swipl/index.html) - the quick sta= rt guide shows a step by step walkthrough on using the library to write a type inference algorithm for lambda calculu= s using OCaml+Prolog (no need to write your own UF).

Anyway, hope this might be useful for others - I have spent way too long ra= cking my brains on writing dumb custom unification algorithms, but now, no more!

Kiran Gopinathan later added

Here's another example that might be interesting for those who have experie= nce with SWI-Prolog.

You can even get native interaction with CHR: https://en.wikipedia.org/wiki/Constr= aint_Handling_Rules is a very elegant framework which comes bundled with SWI Prolog that allows users to = write complex domain specific constraint solving engines in a concise declaritive way.

Here's a CHR system that models the interaction between salt a= nd water (basic I know, but look up CHR to see some more powerful examples):

let () =3D Swipl.load_so=
urce "
:- use_module(library(chr)).

:- chr_constraint salt/0, water/0, salt_wat=
er/0.

salt, water <=3D> salt_water.

reducesTo_(Goal, C) :-
        call(Goal),
        call(user:'$enumerate_constraints'(=
C)).
reducesTo(Goal, Constraints) :-
        findall(Constraint, reducesTo_(Goal=
, Constraint), Constraints).
"

Which we can then embed into OCaml using the following code:

let solve_constraints ls =3D
  (* Create a new term variable context =
*)
  Swipl.with_ctx (fun ctx ->
    (* create a term for the result *)
    let result =3D Sw=
ipl.fresh ctx in<=
/span>
    (* encode the constraint store *)
    let goal =3D encode ls in
    (* send the query to the Prolog engine *)
    Swipl.call ctx (reducesTo goal r=
esult);
    (* extract the result *)
    decode ctx result
  )
(* v=
al solve_constraints: t list -> t list *)

(Again, some steps have been omitted for brevity, and you should check out = the quick start guide for a step by step walkthrough).

opam 2.1.2

Kate announced

We are pleased to announce the minor release of opam 2.1.2.

This opam release consists of backported fixes, including:

To upgrade simply run:

bash -c "sh &l=
t;(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/master/shell/ins=
tall.sh) --version 2.1.2"

Set up OCaml 2.0.0-beta10

Sora Morimoto announced

Added

  • Added "extends" experimentally.

Changed

  • Remove some hacks as --no-depexts is now used in CLI 2.0 m= ode from opam 2.1.2.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta10

A hassle-free setup to release binaries for different platform= s: the opam release process experiment

Kate announced

On top of the o= pam 2.1.2 announcement, I=E2=80=99d like share an experiment with the opam release script used for this release.

As you might know, for each releases of opam we provide pre-compiled binari= es for ease of use. We=E2=80=99ve had a release script which up to this point required a specif= ic setup to get it running correctly. For instance we had to setup a local OpenBSD machine (possibliy virtualised), a macOS/x8= 6_64 machine and a macOS/arm64. This setup is rather tedious to reproduce.

To improve this situation I=E2=80=99ve experimented over the past week with= QEMU and Rose= tta 2 to make it a "one click script":

https://github.com/ocam= l/opam/pull/4947

This change makes so that the script now only requires a macOS/arm64. From = there you can:

  • compile locally for macOS/arm64 binaries
  • compile locally for macOS/x86_64 binaries (using Rosetta 2)
  • compile for BSDs (using QEMU)
  • compile for Linux (using Docker)

With this, the binaries for this release have been compiled with this more reproducible setup, and now include FreeBSD/x86_64 binaries as we= ll :sparkles:

If someone wants to have a similar setup to distribute binaries here is the= git repository (using Git LFS to store the large files). Feel free to use and experiment with it:

https://gitlab.= com/kit-ty-kate/qemu-base-images

For now it only has OpenBSD/x86_64 and FreeBSD/x86_64 images but it could t= heoretically have more. Although I=E2=80=99m not accepting PRs for now (for obvious security reasons), I=E2=80=99m open to s= uggestions to add more platforms. See the README for high level details about the setup.

Set up OCaml 2.0.0-beta11

Sora Morimoto announced

Fixed

  • Add support for more styles for the ocamlformat configuration in lint-f= mt action.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta11

What's the best way to save an huge amount of data in a file

Deep in this thread, Simon Cruanes announced

What a coincidence, I wrote an Avro library very rece= ntly. The paint is still fresh. However, it might be worth giving it a try as it's exactly the targeted use case: many rows of relatively simple data, encoded as binary; it also supports gzip compression (per "block" of N many rows, with N configurable). And there's no need to worry about endianess.

It typically uses code generation from a schema (a json file).

There's libraries for Avro in java (with all the Spark ecosystem) and also python (see "fastavro").

p5scm 0.1.0

Jason Nielsen announced

I=E2=80=99ve released p5scm = which is now up on opam. It is a scheme-like implementation on top of camlp5's pa_schemer.ml extension. I know that camlp5 isn't the cool kid on the block these days bu= t it is a powerful tool and pretty cool in my estimation ;-).

nanoid 1.0.0

mefyl announced

I'm pleased to announce the release of nanoid 1.0.0. NanoID are popular unique ids amongst the= javascript ecosystem. This library brings an equivalent native implementation and a virtual library to transparently bra= nch between the native implementation and the original javascript one. The intent is to enable pieces of code generat= ing such ids to be moved transparently between frontend and backend of a web stack.

This is an humble first contribution to gain some experience and will hopef= ully be followed by more of our internal developments.

Other OCaml News

From the ocamlcore planet blog

Here are links from many OCaml blogs aggregated at OCaml Planet.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 3A0BFE01A7 for ; Tue, 21 Dec 2021 10:12:12 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=lmaG=RG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AIJnQGR+PnfWPEf9uWZ+7ngc9DxPPW53KNwIYoqA?= =?us-ascii?q?ql6hJOvz6uci4ZQqGvaklpWSKdL2T0+hDhevSvvKock07yrHFjko/dodRXQQOk?= =?us-ascii?q?8Qckl9oKseEDUrmMKyiNHRiT4xNW1B/4n60L1VeFtrgaF3OuH2y6iMZFgniOQZ?= =?us-ascii?q?vKen5BJPeg96q2+yu9JDYfhlFiie6bb5uNhu9sB/fttMRgYtsK6YxzgXGr35Vc?= =?us-ascii?q?OlIxm1mOEyekQ/k6si/4JBs/SJQu+k898FbSqX1Y744Tb1DAzs4NW0++dDmugP?= =?us-ascii?q?CTQuL4XscT3kWnx9VCAXL8B32QpH8uTb6uuR+3imaI8z2Tas1WTu566dkVgLji?= =?us-ascii?q?SkANz4j7W7XkdF7gKZVrR69ohByxZPfboOIO/pkZq7Tfc0US3dPUMhSWCNOHpi?= =?us-ascii?q?xYJETA+cbJ+tUs5XxqlkIoBCjBQesHuTvyjpQi3Lq2a01yeIhGhzb0gM8H9IOt?= =?us-ascii?q?XXUrMnpNKwPVu261q3Iwi/Fb/9Mwjfy9IjIchUgofGQQbJ9atLRyU4rFwLFklW?= =?us-ascii?q?ft5DqPzOT1uQMqmib8vRvWfioi249pAF8uz6izdojhYfVnIwa0EzE9Tlnz4YvI?= =?us-ascii?q?921UE51bcKgHZZOuS+XNJV7TMwsTm10vCs0xbIItJ+lcSUI1Zkq2wLTZviZfoW?= =?us-ascii?q?K4x/uV+icLSt6iX95e7+yhxi//VSmx+bhWMe011NKoTBEktnKrn0NzwLc6tSGS?= =?us-ascii?q?vth4EihwTGP1wXW6u5aO0w0k7TUK4I5zr4xkJoTq0XDETXslEX4lq+abkIk9fS?= =?us-ascii?q?y5OTiZrXqv4ScN4FuhgH5KKQuldSzAeMkPQcUWmib/f6w1Lr5/U32WLlKgfw2k?= =?us-ascii?q?rXZsJDHPssXvLK2AwhQ0oo76hawEjen0NAcnXUdK1JFYh2Hgo70MF/NOPD1Feq?= =?us-ascii?q?zj0qonTtx2vzKIrLsDo/DI3Tfirvsc7lw51ZYxQYu19xT+pBZBqwbLP7tVEL9q?= =?us-ascii?q?MbUAx04PgGy3u3pEs9y1pkEVmKKGqKZML3dsVuP5u83JumNa5IZtCzlK/gi4/7?= =?us-ascii?q?vjWM5lkEBcqmp25sXaWm4Hul4LEmDZnrsmNgBHX8Lvgo4UuPqlEWPXSNNa3u2R?= =?us-ascii?q?a4w+y03BY28AYrNWoyhmrKM0SijEp1TfG9GC1SMEXnyd4WDXvcBcD+cLNN8nDA?= =?us-ascii?q?YTbWhT4oh2guvugLi17RpL/LZ+jUftZLn1Nl1+/Pcmg0y9TxyDsSdynyNQH9uk?= =?us-ascii?q?mMPXT8207hyrlZ5yliZ16h0medYGsBT5/NMUwc6KYLcwvdhBND1RwLBeMuGR0i?= =?us-ascii?q?9Qtm8BDE8Qd0wz8UJY0ZnFNWulgrD0DayA78Ji7yLA4Q5/b7G0Hj0I8Zx0nLG1?= =?us-ascii?q?Kg6j1k6WcZPLm2nhqtn9wfJHYLJkkOZl7yrdasGxiLN+n2DniKyuxQSVBF2G+2?= =?us-ascii?q?RWW8ZTk/Jq5L/61+UC/fkAqsheEMJncWdLINOa8b1lhNHSObnPJLZeW3n3y+7D?= =?us-ascii?q?BOMg7eNd5bCemMH3SybBlJXvRoU+COvMQE4Thyqo2ffECAmQVvrakWq6uJ+rXK?= =?us-ascii?q?nUmcsyAWbc0Bq17y04wMYw/uGRKVAjfo/pC49pmAsTx6G1NXMBo/b/2KJmY1EZ?= =?us-ascii?q?tcs/FpM1WTYrhFweJu6IPI77rb/WwFn5gX20BFmFohLkc4rtW4nig1oJvDBuLu?= =?us-ascii?q?uXzmfwJb7N6aRLzXiuhe1ZPyPsmw=3D?= IronPort-Data: =?us-ascii?q?A9a23=3AUrn646u+irIcM8SSscwoFZpi+OfnVHFfMUV32f8?= =?us-ascii?q?akzHdYEJGY0x3n2cdX2yBaa2IZWH1f4txYYyy8BwPvZ/Umt5kTAA9qXtEQiMRo?= =?us-ascii?q?6IpJ/zJdxaqZ3v6wu7rFR88sZ1GMrEsFC2FJ5Pljk/F3oPJ8D8shclkepKmULS?= =?us-ascii?q?dY3orHFc+IMscoUsLd9AR0tYAbeeRWFvlVePa+6UzCXf9s9JGGjp8B5Gr9HuDi?= =?us-ascii?q?M/PVAYw5TTSUxzkUGj2zBH5BLpHTU24wuCRroN8RoZWTM6bpF21E/+wwvsjNj+?= =?us-ascii?q?luu6TnkwiR66LexCJjmtKVqOihBlbuyF01bw0XBYeQR4N2nPQx4w3k40L7sDYp?= =?us-ascii?q?QQBZsUgnMwmaSIARiV7NIITwpCSOX+7oNCexE3AcmLxzrNpFk5jNIkR/KBsCmF?= =?us-ascii?q?L9OAEADoKcxaIivnwxe6rDO52iazPKeGyZttD5C8+kVk1Ct58GMqcE/SQjTNC5?= =?us-ascii?q?x87j8VKWPLffNYxcitqdB2GYhtVO15RBohWoQsCrm2nJmAe8kbM8PJxu3yJmVQ?= =?us-ascii?q?3ieizbs6OL4TMGNEKy2+GgEnD2Uj5JDATEuCF7y7cqif0wrfb9c/gcIcCTfug8?= =?us-ascii?q?fp7nFCYxmoSEQAbE1yhrpGEZoeFc4o3AyQpFuAG9PVaGI2XotjBs9mQpW7d+AY?= =?us-ascii?q?bX8tMHuY67gCU16eS5ByWboTBZiAUc8Qo7afaWhRzvmJlXfuwbdCsjFFRYXia6?= =?us-ascii?q?7GfoCj0PHQFa2gYakfoiCMe+9e55tlbYg3nF75e/W3csjExMSn3xyGWoSM+gbQ?= =?us-ascii?q?KkMNN0L+0lbwCqym0qMKPFmbZ+S2ONl+YAshFiEJJqmBmBZU3LRqNEWpBcmS8g?= =?us-ascii?q?Q=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3ASc3Zoaj67ct8kQcAELJgF6vwfnBQXt0ji2hC?= =?us-ascii?q?6mlwRA09TyX4raCTdZsguiMc5Ax6ZJhCo7G90cu7L080nKQdieIs1NyZMDUO1l?= =?us-ascii?q?HEEKhSqaPchxfgFyf9+uM179YCT4FOTPvqAxxfhcb+iTPIdurILeP3kpyVuQ?= =?us-ascii?q?=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AQAQAImsFhmCIeaIFahAOBHwFfBlc6M?= =?us-ascii?q?YRHiQOFRQElgiWDK4YcgUeRVYFzAQMBDSoBDAcBAgQBAYIRg0gBBIJfAh4GAQU?= =?us-ascii?q?zEwECBBUBAQUBAQECAQMDBAETAQEBAQEBAQEJCxAGNCKFaA2CIhMMGYNwASEKQ?= =?us-ascii?q?CUjAxsDAhEBEQYBFAoXARIUBoJkAYJlAy8EAQqTO5wMgTGBAYNOAQMCARAPgy8?= =?us-ascii?q?NZoERUg0CFIEXhgxUSgGBH4FghAYpEIFVRIEVgilPAm6BQAEBXysXAQEBAQGBK?= =?us-ascii?q?AERAgGDOIJlBJFIDlVzGRYBASACNjhOCkoWAh6RZSuXGmmUAxcpODQHg0WBNQY?= =?us-ascii?q?LiAyBGYxogXCCXINLhTmiKiGWESCJDYEVgj2DS5BPCIUtgU4qgQ1wMxowQ4JpC?= =?us-ascii?q?WEPjXgBhBmBPoMbO4VLQDMCAQE0AgYBCgEBAwmFYwEBBRMLAYowAQE?= X-IPAS-Result: =?us-ascii?q?A0AQAQAImsFhmCIeaIFahAOBHwFfBlc6MYRHiQOFRQElgiW?= =?us-ascii?q?DK4YcgUeRVYFzAQMBDSoBDAcBAgQBAYIRg0gBBIJfAh4GAQUzEwECBBUBAQUBA?= =?us-ascii?q?QECAQMDBAETAQEBAQEBAQEJCxAGNCKFaA2CIhMMGYNwASEKQCUjAxsDAhEBEQY?= =?us-ascii?q?BFAoXARIUBoJkAYJlAy8EAQqTO5wMgTGBAYNOAQMCARAPgy8NZoERUg0CFIEXh?= =?us-ascii?q?gxUSgGBH4FghAYpEIFVRIEVgilPAm6BQAEBXysXAQEBAQGBKAERAgGDOIJlBJF?= =?us-ascii?q?IDlVzGRYBASACNjhOCkoWAh6RZSuXGmmUAxcpODQHg0WBNQYLiAyBGYxogXCCX?= =?us-ascii?q?INLhTmiKiGWESCJDYEVgj2DS5BPCIUtgU4qgQ1wMxowQ4JpCWEPjXgBhBmBPoM?= =?us-ascii?q?bO4VLQDMCAQE0AgYBCgEBAwmFYwEBBRMLAYowAQE?= X-IronPort-AV: E=Sophos;i="5.88,223,1635199200"; d="scan'208,217";a="12046664" X-MGA-submission: =?us-ascii?q?MDHOzaVyHs2h/ZOC7D9R9bFHjZmRP5vRqv1i8x?= =?us-ascii?q?MYK/QG2vv6LNGy9JFVTypC2y0w0fPO5Fq7SS5pmGoTrWJIRVq4zLax+M?= =?us-ascii?q?t7BukviGgQQkoeSQw0kLpy3/d9hiPSmFBRG5OfyZub7BilQ6xP4f4Exc?= =?us-ascii?q?jOft+o1jzFPD30JuJ2FO/iqg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 21 Dec 2021 10:11:57 +0100 Received: from set (91-171-230-76.subs.proxad.net [91.171.230.76]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5CC4D5605C2; Tue, 21 Dec 2021 10:11:55 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 21 Dec 2021 10:11:54 +0100 Message-ID: <874k728gpx.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 21 10:11:56 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.003070, queueID=4167E5605C3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 14 to 21, 2021. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Are you teaching using the Learn-OCaml platform? A SOCKS implementation for OCaml Old CWN Are you teaching using the Learn-OCaml platform? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Erik Martin-Dorel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 The OCaml Software Foundation is developing the teaching platform Learn-OCaml that provides auto-graded exercises for OCaml, and was initially authored by OCamlPro for the OCaml MOOC: The platform is free software and easy to deploy; this is great, but as a result we keep learning of users/deployments that we had no idea of. We would be interested in having a better view of our user-base. If you use Learn-OCaml as a teacher, could you answer this email (To: e.mdorel@gmail.com) and let us know? Ideally we would like to know: =E2=80=A2 Where are you using Learn-OCaml? =E2=86=92 in which university= (in a specific course?), or in which company, online community or =E2=80=A6 ? =E2=80=A2 How many students/learners use your deployment in a year? Also FYI: =E2=80=A2 For an example of Learn-OCaml instance, see =E2=80=A2 Last October we had a 0.13.0 release, full of new features: =E2=80=A2 For any question related to Learn-OCaml, feel free to create a discussion topic on , category Community, tag /learn-ocaml/. =E2=80=A2 And if need be, opening an issue in if of course warmly welcome as well. A SOCKS implementation for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Renato Alencar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have been working on a SOCKS implementation for OCaml and specially for MirageOS. It's not really complete or stable yet (not even published), it only has a couple of proof of concepts on the examples directory and it doesn't integrate with the well known libraries of the ecosystem. I would like to ask for feedback, and some thoughts about how could we have that in Conduit and Cohttp for example, so It'd be just plugged in into those libraries without having to directly depending on it. I plan to implement that for those libraries and have it submitted upstream, but not without some clear thoughts about how to make a clear interface for that. Besides being sloppy, I have a few issues described on GitHub, and it should be addressed on the next few days. Anyone is welcome to discuss those issues as some of them are still foggy for me, and having some other views on that would be great. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 14 to 21, 20= 21.

Are you teaching using the Learn-OCaml platform?

Erik Martin-Dorel announced

The OCaml Software Foundation is developing the teaching platform Learn-OCaml that provides auto-graded exercises for OCaml, and was initially authored by OCamlPro for the OCaml MOOC: https://ocaml-sf.org/learn-oc= aml/

The platform is free software and easy to deploy; this is great, but as a result we keep learning of users/deployments that we had no idea of. We would be interested in having a better view of our user-base. If you use Learn-OCaml as a teacher, could you answer this email (To: e.mdorel@gmail.com) and let us know?

Ideally we would like to know:

  • Where are you using Learn-OCaml? =E2=86=92 in which university (in a specific course?), or in which company,= online community or =E2=80=A6 ?
  • How many students/learners use your deployment in a year?

Also FYI:

A SOCKS implementation for OCaml

Renato Alencar announced

I have been working on a SOCKS implementation for OCaml and specially for M= irageOS. It's not really complete or stable yet (not even published), it only has a couple of= proof of concepts on the examples directory and it doesn't integrate with the well known libr= aries of the ecosystem.

I would like to ask for feedback, and some thoughts about how could we have= that in Conduit and Cohttp for example, so It'd be just plugged in into those libraries wit= hout having to directly depending on it. I plan to implement that for those libraries and = have it submitted upstream, but not without some clear thoughts about how to make a clear int= erface for that.

Besides being sloppy, I have a few issues described on GitHub, and it shoul= d be addressed on the next few days. Anyone is welcome to discuss those issues as some of the= m are still foggy for me, and having some other views on that would be great.

https://git= hub.com/renatoalencar/ocaml-socks-client

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C2A17E0120 for ; Tue, 28 Dec 2021 10:00:01 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=eoal=RN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3AOgC9chLfer7/DLjRntmcuABgWUAX0o4c3iYr45Y?= =?us-ascii?q?qw4hDbr6kt8y7ehCFvLM01Q+CDN+TwskHotKei7rnV20E7MTJm1E5W7sIaSU4j?= =?us-ascii?q?94LlRcrGs+PBB6zBvfraysnAJYKDwc9rDm0PkdPBcnxeUDZrGGs4j4OABX/Mhd?= =?us-ascii?q?+KvjoFoLIgMm7yf2+94fObwlVhzexbrd/IAurpgjNq8cahpdvJLwswRXTuHtIf?= =?us-ascii?q?OpWxWJsJV2Nmhv3+9m98p1+/SlOovwt78FPX7n0cKQ+VrxYES8pM3sp683xtBn?= =?us-ascii?q?MVhWA630BWWgLiBVIAgzF7BbnXpfttybxq+Rw1DWGMcDwULs7Xims77pwSB/wl?= =?us-ascii?q?igIKyI5/m/Qisx1lq1boRShrAF7z4PbZIyZMfxzcqPec9McW2pBX91RVy1aDYO?= =?us-ascii?q?4cYQEEuQAPeFCr4bgvFsFsB+yCAewCO/qzDJDm3340rAg0+k5EQ/IwhEuEdwNv?= =?us-ascii?q?nvbsNr4L70dXfyvwaTS0TnPc/Fb1DHg44bIaBAhpvSMUKpsfMrV00YvER7OgEi?= =?us-ascii?q?MpozlOjOV1/gNs3SG5OdnT+2vj3Qoqwdrrji02sgsiozJhoMJylDY7ih52IE1J?= =?us-ascii?q?dm4SU5nf9GrDJtQtyebN4tvX8MtXXtkuCEgyr0JoJO2ejUBx5s7yRDFcfOHb5S?= =?us-ascii?q?I7Qz5VOaXOTp1hXJodr2/ihqs8UWs1uPyW9S23VpUoCdLndnBu38D2hDN6sWJR?= =?us-ascii?q?P9w80m91DuP2Q3e9P9JLE86mKfaJZAt3rE9m5wOukrNGS/2nV/5jK6Qdkg84ui?= =?us-ascii?q?n9fjnYrT6ppCCL490jQT+MqEwlcClB+Q3LBQOU3Ca+eS6zr3j/Ff2TK9Ejv0si?= =?us-ascii?q?qXZt4zVKt4epq69GQNV1Zwj6xmnAzep0dQYgXkHLE9edx6dk4fpPFTOLOj5Dfe?= =?us-ascii?q?6jFSsjS1ry+raMb3mB5XBNnnDn6rhfLZ5705Q0g0zzcpQ559SF7oPI+rzV1fsu?= =?us-ascii?q?NDGChI1KRG4z/roBdln2I4SRXiDD6GWPa/Ks1KF5fgjL/eDaYMLojrxNvco6+T?= =?us-ascii?q?zgXI2hVMQe7Si04ENZ3CiBPtmJl2UYXryjdcFFmcHpg8+TeP3hFGYST5TYHKyX?= =?us-ascii?q?qIg5j4lFI2mDYHDRoG0gLycwii3BJpWZnpJClyUEHfocZuLW+sUZS6PPMNsliY?= =?us-ascii?q?IWaW9R4Iuzx2juhP2x6BpI+fb4iEYsIjs1Nlx5+3djxEy8jl0AtyA3W+RUm94g?= =?us-ascii?q?nsFSCEx3K9lpUxw0kuN37BgjvxAEtxT4/NIUhskOpHAz+x6DdHyWhvcftiXUlq?= =?us-ascii?q?mRc+mAT4pQ90rx98BeUB9F8+5jh/f3yqqBr4Vl6CXBJEv6a3c2GXxJ8BhxHnYz?= =?us-ascii?q?6ktlVwmT8RANGG8ga5/7QfTC5bTk0qFj6aqabgc3CnV+Wif12WOuUVYXBd0UaX?= =?us-ascii?q?ERnAfelDbrc/550PHV7+hE64rMgpHyc6YK6tFcMfljVtcRKSrBNOLKWaunS34U?= =?us-ascii?q?RKXwJuIc4ysfWgBimGVQkMblUpbtSKNKg4WAia6v3mYDTB/EVapZFnjp602o3q?= =?us-ascii?q?+SgowzhqWR0xnzbu8vBAP1tKGTPZG97YNvm8aoDVxHUqhl4bfD9OG4RFqfKBdf?= =?us-ascii?q?c8V+FBDxH7UvAx7P4W9IuZlnFFIIFc/hF/nyxgiUtYIqsMttn5/k1sawUewyFR?= =?us-ascii?q?FZi+V1pD2O6TKJy/15h/9MsY+NXnU18uQ8aoUrvFkuxPkpg77TyLKEl1iw4ATy?= =?us-ascii?q?3yY94nHBwoUUIvsXwAw7Rco/tnn?= IronPort-Data: =?us-ascii?q?A9a23=3AAZm4WqzJelCmo0ecHxV6t+cTxyrEfRIJ4+MujC/?= =?us-ascii?q?XYbTApDNxgjwAzTdLD2vTaPrZN2SgKt9xO4W+9kxUu5eHz4cyOVdlrnsFo1Bi+?= =?us-ascii?q?ZOUX4zBRqvTF3rPdZObFBoPA/3z27AsFehsJpPnjkrrYuiJQUVUj/nSH+OmUr6?= =?us-ascii?q?cYEideCc9IMsfoUI78wIGqtUw6TSJK1vlVeLa+6UzCnf9s9JHGj58B5a4lf9al?= =?us-ascii?q?K+aVAX0EbAJTasjUFf2zxH5BX+ETE27ByOQroJ8RoZWSwtfpYxV8F81/z91Yj+?= =?us-ascii?q?kurPrKwsSRbrDIQWFinxXQrWvxB9YqUTe0I5ibqtaMB8LzW7R2YstoDlOncTYp?= =?us-ascii?q?QMBBZf3wLEQVBBcRhtYaLVB/K7bLHO/t82K0kCAdGHjlvxqBUdwJoYY/+drHUl?= =?us-ascii?q?E8uEeIz0WKBXfl6Sx2r3TpuxE3558fJaxYdN3VnZIl2iDUqZ3G/gvWZ7i7tZd2?= =?us-ascii?q?HI0h9tSNe3PYtIQLztpdhXJJRNVUmr7oroqxLLzwCTrKmgA7gqB//9vpTKOklJ?= =?us-ascii?q?li+21dofBJYmjW+N+m2C0pkbn9kLFGDcObYTKkX7d5hpAncfKjXq9QIUWBaG1/?= =?us-ascii?q?f5sgUSOyyoUEhJ+aLdymtHh4mbWZj6VAxV8FusSQakOGIiDS8mkGQW/pG+YsxU?= =?us-ascii?q?cXdtJDuB87xuCokYRyxjMHXAKF1atd/R/3PLahxRzvrNKoz8tLTZorbueRGnb8?= =?us-ascii?q?+uE6zSoNkD56EcZfSFeC1NtD8bL+ekOY9GmcjqnOLayiszpFDrwxTGTsSV4gK8?= =?us-ascii?q?c5SLO/76j8wqB21pAubCQJjMICs7rsq5JI++3iENJp2Bl1LQD0ct9EQ=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A63LCAq4/6+Vf0FBY0wPXwArXdLJyesId70hD?= =?us-ascii?q?6qkRc202TiX8ravFoB1173LJYUkqKQ8dcLy7VJVoOEmsiqKdgrNhXotKPjOGhI?= =?us-ascii?q?LyFvAH0WKK+VSJJ8TQzIFgPMxbE5SWZuefMbAZ4PyKhzVRdrsbsaS6GMTEv5an?= =?us-ascii?q?8587JTsaEp2JlmpCe2Cm+isafng9OXMxLuvs2iItygDQHEj+DqmAdwU4t4+vna?= =?us-ascii?q?yxqK7b?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0BuAgD60MphhyIeaIFahAOBHwFfBlc6M?= =?us-ascii?q?YRHiQOFRQElgiWDKYYdjweGCAEDAQ0qAQwHAQIEAQGFHzoBBIJiAh4GAQUzEwE?= =?us-ascii?q?CBBUBAQUBAQECAQMDBAETAQEBAQ0LDgg0IoVoDYIiEwwMAwODdwEhCmUjAxsDA?= =?us-ascii?q?gQNARcBFAoXARIagmQBgxcEAQqSKZwMgTGBAYNOAQMCEQ+EIoESUg0CFIEXhgx?= =?us-ascii?q?USgGCf4QGKRCBVUSBFYJ6boJMFwEBAQEBgTsBAYM4gmUEjzEVCAY4NBAPPRAfA?= =?us-ascii?q?QEvKThBF0oLOpFnHyeXYYJbkSd5NAeDRYE1BguIEoEajGqIG4NwgUqiLSGWFSC?= =?us-ascii?q?CJIZqCIEECYI9ggKSGoU0gU4qgX0zGjBDDRqCQglhD44sFoNQgT6DGzuFS0AzA?= =?us-ascii?q?gEBNAIGAQoBAQMJhWMBAQUTCwGLGgEB?= X-IPAS-Result: =?us-ascii?q?A0BuAgD60MphhyIeaIFahAOBHwFfBlc6MYRHiQOFRQElgiW?= =?us-ascii?q?DKYYdjweGCAEDAQ0qAQwHAQIEAQGFHzoBBIJiAh4GAQUzEwECBBUBAQUBAQECA?= =?us-ascii?q?QMDBAETAQEBAQ0LDgg0IoVoDYIiEwwMAwODdwEhCmUjAxsDAgQNARcBFAoXARI?= =?us-ascii?q?agmQBgxcEAQqSKZwMgTGBAYNOAQMCEQ+EIoESUg0CFIEXhgxUSgGCf4QGKRCBV?= =?us-ascii?q?USBFYJ6boJMFwEBAQEBgTsBAYM4gmUEjzEVCAY4NBAPPRAfAQEvKThBF0oLOpF?= =?us-ascii?q?nHyeXYYJbkSd5NAeDRYE1BguIEoEajGqIG4NwgUqiLSGWFSCCJIZqCIEECYI9g?= =?us-ascii?q?gKSGoU0gU4qgX0zGjBDDRqCQglhD44sFoNQgT6DGzuFS0AzAgEBNAIGAQoBAQM?= =?us-ascii?q?JhWMBAQUTCwGLGgEB?= X-IronPort-AV: E=Sophos;i="5.88,242,1635199200"; d="scan'208,217";a="12787258" X-MGA-submission: =?us-ascii?q?MDHQkG/HtufMkISSIUwc/bAyVqfKjDm4c/KpUC?= =?us-ascii?q?96vFlDbY4oDrRKN4XViOrwoVb1T9t89v1qKeOTcm7nYEq1UckzdL58uJ?= =?us-ascii?q?2MTl+6MbOUI0DJDFfLaTmDNficbLbDGQ6vtdxCVoCQErshFw+te+a5YW?= =?us-ascii?q?xc1ATLOWcfDKn0yIh8w8lc8w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 28 Dec 2021 10:00:01 +0100 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 998E056481F; Tue, 28 Dec 2021 09:59:59 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 28 Dec 2021 09:59:58 +0100 Message-ID: <8735md5ckx.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 28 10:00:00 2021 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.094633, queueID=422BA564821 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMjEgdG8gMjgsDQoyMDIxLg0KDQpIYXBweSBXaW50ZXIgU29sc3RpY2Uh DQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KTmV3IHJlbGVhc2Ugb2YgRmVhdA0KRGVidWdnZXIgc3VwcG9y dCBmb3IgT0NhbWwNCk9sZCBDV04NCg0KDQpOZXcgcmVsZWFzZSBvZiBGZWF0DQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjEt MTIvbXNnMDAwMTAuaHRtbD4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFz ZSBvZiBGZWF0LCBhIGxpYnJhcnkgdGhhdCBvZmZlcnMNCiAgc3VwcG9ydCBmb3IgY291bnRpbmcs IGVudW1lcmF0aW5nLCBhbmQgc2FtcGxpbmcgb2JqZWN0cyBvZiBhIGNlcnRhaW4NCiAga2luZCwg c3VjaCBhcyAoc2F5KSB0aGUgaW5oYWJpdGFudHMgb2YgYW4gYWxnZWJyYWljIGRhdGEgdHlwZS4N Cg0KICBUaGlzIG5ldyByZWxlYXNlIGludGVncmF0ZXMgYSBjb250cmlidXRpb24gYnkgSm9uYWgg QmVja2ZvcmQuIFRoZQ0KICBsaWJyYXJ5IGlzIG5vdyBzcGxpdCBpbiB0aHJlZSBwYWNrYWdlczog YGZlYXQtY29yZScgaXMgcGFyYW1ldGVyaXplZA0KICBvdmVyIGFuIGltcGxlbWVudGF0aW9uIG9m IGJpZyBpbnRlZ2VyczsgYGZlYXQnIGluc3RhbnRpYXRlcw0KICBgZmVhdC1jb3JlJyB3aXRoIGJp ZyBpbnRlZ2VycyBwcm92aWRlZCBieSBgemFyaXRoJzsgYGZlYXQtbnVtJw0KICBpbnN0YW50aWF0 ZXMgaXQgd2l0aCBiaWcgaW50ZWdlcnMgcHJvdmlkZWQgYnkgYG51bScuDQoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBpbnN0YWxsIGZlYXQNCiAg4pSC ICMgb3I6IG9wYW0gaW5zdGFsbCBmZWF0LW51bQ0KICDilJTilIDilIDilIDilIANCg0KICBNb3Jl IGRldGFpbHMgY2FuIGJlIGZvdW5kIGhlcmU6DQoNCiAgPGh0dHBzOi8vZ2l0bGFiLmlucmlhLmZy L2Zwb3R0aWVyL2ZlYXQvPg0KDQoNCkRlYnVnZ2VyIHN1cHBvcnQgZm9yIE9DYW1sDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2RlYnVnZ2VyLXN1cHBvcnQtZm9yLW9jYW1sLzkwNTcvMT4NCg0KDQpDaHJpc3RpYW4gTGlu ZGlnIGFza2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXaGF0IGlzIHRoZSBjdXJyZW50IHN0YXRlIG9mIGRl YnVnZ2VyIHN1cHBvcnQgZm9yIE9DYW1sPyBJIGFtIGF3YXJlIG9mDQogIG9jYW1sZGVidWcgYnV0 IGV2ZXJ5IHRpbWUgSSdtIHRyeWluZyB0byB1c2UgaXQgSSBmZWVsIHRocm93biBiYWNrIHRvDQog IDIwMDAgd2hlcmUgaXQgZXNzZW50aWFsbHkgZXhpc3RlZCBpbiB0aGUgc2FtZSBmb3JtIChhbmQg c3RpbGwgaGFzIG5vDQogIGNvbW1hbmQgbGluZSBlZGl0aW5nIGJ1aWx0IGluKS4gRGVzcGl0ZSB0 aGUgcG93ZXJmdWwgY29uY2VwdCBvZiB0aW1lDQogIHRyYXZlbGluZywgaXQgZG9lcyBub3Qgc2Vl bSB2ZXJ5IHVzZWZ1bCB0b2RheS4gRm9yIGV4YW1wbGUsIGl0IGNhbid0DQogIGJlIGF0dGFjaGVk IHRvIGEgcnVubmluZyBwcm9ncmFtIGFuZCBpdCBkb2VzIG5vdCB3b3JrIHdpdGggbmF0aXZlDQog IGNvZGUuIFdoYXQgaXMgdGhlIHN0YXRlIG9mIEdEQiBzdXBwb3J0PyBXaGF0IGRlYnVnZ2VyIHdv dWxkIG9uZSB1c2Ugb24NCiAgbWFjT1M/DQoNCg0KbGlub3Njb3BlIHJlcGxpZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhhdmUgeW91 IHRha2VuIGEgbG9vayBhdCBvY2FtbGVhcmx5YmlyZCAoW2dpdGh1Yl0sIFthbm5vdW5jZW1lbnRd KT8gSQ0KICBoYXZlIG5ldmVyIHVzZWQgaXQgbXlzZWxmLCBidXQgYmFzZWQgb24gW3RoZSBkZW1v XSBpdCBzZWVtcyBwcmV0dHkNCiAgbmljZS4NCg0KDQpbZ2l0aHViXSA8aHR0cHM6Ly9naXRodWIu Y29tL2hhY2t3YWx5L29jYW1sZWFybHliaXJkPg0KDQpbYW5ub3VuY2VtZW50XQ0KPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxlYXJseWJpcmQtMS0wLTAtYmV0YTEvNzE4MD4N Cg0KW3RoZSBkZW1vXSA8aHR0cHM6Ly9pbWd1ci5jb20vVTNHREhYTT4NCg0KDQpTaWQgS3NoYXRy aXlhIGFsc28gcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhZ3JlZSB0aGF0 IGRlYnVnZ2luZyBpbiBPQ2FtbCBzZWVtcyB0byBiZSBzdHVjayBpbiB0aW1lLg0KDQogIFRoaXMg aXMgZXh0cmVtZWx5IHVuZm9ydHVuYXRlIGJlY2F1c2UgaXQgaXMgYWJsZSB0byBkbyB0aW1lIHRy YXZlbGluZw0KICAoYXMgeW91IG1lbnRpb24pIHdoaWNoIGlzIHNvbWV0aGluZyB0aGF0IG1hbnkg b3RoZXIgbGFuZ3VhZ2VzIHN0aWxsDQogIGNhbm5vdCBib2FzdC4NCg0KICDigKIgYG9jYW1sZGVi dWcnIGRvZXMgbm90IHdvcmsgcHJvcGVybHkgd2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gMSBPUw0K ICAgIHRocmVhZA0KICDigKIgQXMgdHlwZXMgYXJlIGVyYXNlZCBkdXJpbmcgY29tcGlsZSB0aW1l IGluIE9DYW1sLCBpdCBjYW4gYmUNCiAgICBkaWZmaWN1bHQgdG8gZGVidWcgcG9seW1vcnBoaWMg ZnVuY3Rpb25zLiBSdXN0IGFuZCBDL0MrKw0KICAgIG1vbm9tb3JwaGlzZSBhbGwgY29kZSBzbyB0 aGVyZSBpcyBuZXZlciBhbnkgY29uZnVzaW9uIGFib3V0IHRoZSB0eXBlDQogICAgb2YgYW55dGhp bmcgaW4gdGhlIGRlYnVnZ2VyLiBHb2xhbmcgYW5kIEphdmEgaGF2ZSB0eXBlIGluZm9ybWF0aW9u DQogICAgYXZhaWxhYmxlIGR1cmluZyBydW50aW1lIHNvIGFnYWluLCBkZWJ1Z2dpbmcgaXMgZWFz eS4gSW4gdGhpcw0KICAgIHJlc3BlY3QgT0NhbWwgaXMgc2ltaWxhciB0byBIYXNrZWxsIHdoaWxl IHVzaW5nIHRoZSBieXRlLWNvZGUNCiAgICBkZWJ1Z2dlci4NCiAg4oCiIFRoZSBmdXR1cmUgb2Yg b2NhbWxkZWJ1ZyBpcyB1bmtub3duIG9uIG11bHRpY29yZQ0KDQogIEFzIGZhciBhcyBHREIgc3Vw cG9ydCBpcyBjb25jZXJuZWQsIHRoZXJlIHdhcyBhIHByb2plY3QgdG8gaW1wcm92ZSBHREINCiAg c3VwcG9ydCAoc28geW91IGNvdWxkIHByaW50IG91dCB2YXJpYWJsZXMgbGlrZSBpbiBvY2FtbGRl YnVnIElJVUMpIGJ1dA0KICBpdCBuZXZlciBnb3QgbWVyZ2VkIGludG8gdHJ1bmsuDQoNCiAgSG93 ZXZlciwgaWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIGxvdyBsZXZlbCBkZWJ1Z2dpbmcgaW4gZ2Ri LCBoZXJlIGlzDQogIGEgW3JlY2VudF0gYW5zd2VyIHJlbGF0ZWQgdG8gdGhpcy4NCg0KICBNeSBn dWVzcyBpcyB0aGF0IGBvY2FtbGRlYnVnJyB3aWxsIGNvbnRpbnVlIHRvIHdvcmsgZm9yIHRoZSBz aW5nbGUNCiAgZG9tYWluLCBzaW5nbGUgdGhyZWFkIGNhc2UgaW4gT0NhbWwgNS4wMCBidXQgb2Nh bWxkZWJ1ZyBpcyBjdXJyZW50bHkNCiAgYnJva2VuIGluIG11bHRpY29yZSB0aGVyZSAoQUZBSUsp Lg0KDQoNCltyZWNlbnRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRpY29yZS1v Y2FtbC1zZXB0ZW1iZXItMjAyMS1lZmZlY3QtaGFuZGxlcnMtd2lsbC1iZS1pbi1vY2FtbC01LTAv ODU1NC85Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBo YXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xs IG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9y IHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNo IHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBb b25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1h aWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNo aXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxp bmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0K DQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 21 to 28, 20= 21.

Happy Winter Solstice!

New release of Feat

Fran=C3=A7ois Pottier announced

I am happy to announce a new release of Feat, a library that offers support for counting, enumerating, and sampling objects of a certain kind, such as (say) the inhabitants of an algebraic data type.

This new release integrates a contribution by Jonah Beckford. The library is now split in three packages: feat-core is parameterized over an implementation of big integers; feat instantiates feat-c= ore with big integers provided by zarith; feat-num instantiate= s it with big integers provided by num.

opam update
opam install feat
# or=
: opam install feat-num

More details can be found here:

https://gitlab.inria.fr/= fpottier/feat/

Debugger support for OCaml

Christian Lindig asked

What is the current state of debugger support for OCaml? I am aware of ocam= ldebug but every time I'm trying to use it I feel thrown back to 2000 where it essentially existed in the same form (a= nd still has no command line editing built in). Despite the powerful concept of time traveling, it does not seem very = useful today. For example, it can't be attached to a running program and it does not work with native code. What i= s the state of GDB support? What debugger would one use on macOS?

linoscope replied

Have you taken a look at ocamlearlybird (github, announcement)? I have never used it myself, but based on the demo it seems pretty= nice.

Sid Kshatriya also replied

I agree that debugging in OCaml seems to be stuck in time.

This is extremely unfortunate because it is able to do time traveling (as y= ou mention) which is something that many other languages still cannot boast.

  • ocamldebug does not work properly when there is more than = 1 OS thread
  • As types are erased during compile time in OCaml, it can be difficult t= o debug polymorphic functions. Rust and C/C++ monomorphise all code so ther= e is never any confusion about the type of anything in the debugger. Golang= and Java have type information available during runtime so again, debuggin= g is easy. In this respect OCaml is similar to Haskell while using the byte= -code debugger.
  • The future of ocamldebug is unknown on multicore

As far as GDB support is concerned, there was a project to improve GDB supp= ort (so you could print out variables like in ocamldebug IIUC) but it never got merged into trunk.

However, if you are interested in low level debugging in gdb, here is a recent answer related to this.

My guess is that ocamldebug will continue to work for the sing= le domain, single thread case in OCaml 5.00 but ocamldebug is currently broken in multicore there (AFAIK).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E55D9E0120 for ; Tue, 4 Jan 2022 08:56:45 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=h25N=RU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3Ao/miWxGA6jvxyiThNUSKRJ1GfxRKhN3EVzX9CrI?= =?us-ascii?q?Zgr5DOp6u447ldBSGo6k31RmQBt+Qsqoaw8Pt8InYEVQa5piAtH1QOLdtbDQiz?= =?us-ascii?q?fssogo7HcSeAlf6JvO5JwYzHcBFSUM3tyrjaRsdF8nxfUDdrWOv5jAOBBr/KRB?= =?us-ascii?q?1JuPoEYLOksi7ze+/94PObwlSmTawb61+IBqroQnNt8QdnJdvJLs2xhbVuHVDZ?= =?us-ascii?q?v5YxXlvJVKdnhb84tm/8Zt++ClOuPwv6tBNX7zic6s3UbJXAjImM3so5MLwrhn?= =?us-ascii?q?MURGP5noHXWoIlBdDHhXI4wv7Xpf1tSv6q/Z91SyHNsD4Ubw4RTKv5LpsRxH1l?= =?us-ascii?q?ScHLCY5/3/LhcxsgqxbpxehqAZ+w47SfYqZMPVzc6fYcd4cRWZPXcBRVzJAAoO?= =?us-ascii?q?nbosAFO4BMvhFpIjzoFsOtwaxBRKxD+/rxDJEmnr60Ksn2OojDA7GxhQtEdIQv?= =?us-ascii?q?nrJotv7N6gdXvyuwabS0TnOdelb1Svh5IXKdB0qvPGCXah3ccrU0UQiCwfFgU+?= =?us-ascii?q?WqYf4Ij2ayuQNs22a7+p8SeKklmkqpBt1oje1wMcgkJLJiZ4VylDB9CV53Jo1K?= =?us-ascii?q?MagSE58Zd6lEIdQuD+GOIt2RMMiQnhouDskxbEcvp67ZicKxY0hyhXCZPOJb5K?= =?us-ascii?q?G7Qj/VOaNPzh4nnRldaq+ihqv7ESs1O7xW8q13VtOqidJj9bBu2wC2hHX5MWKV?= =?us-ascii?q?uVx80Sv1ziB2Q7d5f1IL04omafZN5Ms3rA+m4cOvEnBGCL9hUv4jKiTdko+++i?= =?us-ascii?q?o7fzqYq34qZ+ANo90lh/xMrwpmsy6BOQ3LBICX26F9uSgzLHj+lH2T69Pjv0yi?= =?us-ascii?q?KXZt4raJcsDqq62Ag9VzoYj6wukADu8zNsYmnwHIEpDeB2ZkojlIU/BL+3lDfu?= =?us-ascii?q?nmVujjDJry+rBPr37DZXBNmXMn6nlfbZ87k5T1BY8wcpa55JQEr0OOujzW0Dwt?= =?us-ascii?q?NzGFBM5NBa0w+n/BNV80IMeQ2OPDbWDPKPcq1+E/u0vI+iQZI8VpTbyMOIp5//?= =?us-ascii?q?pjXMhmF8SYKmo3Z8TaHyiGfRmOUqZbHzxidkCCWcHphcyQPLuhVGYTDJfe3m/U?= =?us-ascii?q?7gy6z0nEo6rA4jOSpivjbGCxiu3AJJban5cBlyRHnrkbZiIVvgQZC+UP8RviCY?= =?us-ascii?q?LVaK7RI8kzRyutBH1y75gLufM/y0Zuo/v2MJt5+3UkREz9SB0ANqB3GGNSWF0n?= =?us-ascii?q?3oIRyIo06xlpkx90FiD3bB5g/xeC9NT++tEXhokOZPY1eB2Fsz+Vw3bctqHVFq?= =?us-ascii?q?qWNurDD4pQtI02dAOYkJ9G9u4jhDE2iqnG6IbmaCWCpAo6q/c32b9KsZlxXvey?= =?us-ascii?q?KcugUErQtNINW2ihq9/6xbcCJLJk0WflqaqbLkc0zDX+GeE12qOs1lVXxR0Uar?= =?us-ascii?q?fW3ATfFDWosj55kPHTr+uFagnPxBaxs6FN6tKbMHmgktdRPv5PdTTbG2wl323B?= =?us-ascii?q?RaSybOAdJDqdHkF3CXBFEgElBge8mqcOgg7AietumbeDD11FVLzeE7s6ul/qHa?= =?us-ascii?q?jTkAu1Q2Kbkth16C0+hEPn/CcRekTjfo4v3JrrypyVh7p283QI96foUxncbkKJ?= =?us-ascii?q?Zt360hBnyqR4wdiOLSkLrt+nRgffxVzuwXpzRohTs1LmM0u6Xcr1xZaKKSC0Vo?= =?us-ascii?q?HeSnL84r3P+j+LmD0tCuka6vXxk2WhN+S86FJ8/84rlT/oCmxEU4z73hs099Uy?= =?us-ascii?q?maRoJLQA1xBAtrKTk8r+k0i9PnhaS4n6taLhBWE0IGxomaEw9UtFfcowRamfs5?= =?us-ascii?q?CPeWDDgCgSqXy4uC2L+g7h1WibhQFJf1fsqkuMJH/HxNp8KSsIeBrkSngiDhXp?= =?us-ascii?q?odn3RDVnxc=3D?= IronPort-Data: =?us-ascii?q?A9a23=3APrVVQK48bzdO4mm+Fp0lywxRtBzGchMFZxGqfqr?= =?us-ascii?q?LsXjdYENShmZTzGQYW2mFPquLZjSjKYx2YIznp0pVucXWztEyHlAd+CA2RRqmi?= =?us-ascii?q?+KVXIXDdh+Y0wC6d5CYEho/t63yUjRxRSwNZie0SiyFb/6x/RGQ6YnSHuCmULe?= =?us-ascii?q?cZngoLeNZYH5JZSxLy7ZRbrFA2oDR7zOl4bsekuWHULOX82Yc3lE8t8pvnChSU?= =?us-ascii?q?MHa41v0iLCRicdj5zcyn1FNZH4WyDrYw3HQGuG4FcbiLwrPIS3Qw4/Xw/stIov?= =?us-ascii?q?NfrfTd11TBKbVORmSh3FWXam7nxUEoTY9uko5HKNGOAEO02nPxIg3k4klWZ+YE?= =?us-ascii?q?W/FOoX3ot9FBhkCTgcrB5AT4LjDMGSyusyVzlTbfj3r2fo7BUU/O8sD8eZyAH1?= =?us-ascii?q?S3fYfNTYGYwvFgr6mhrWhRYGAg+x6d5W6Yd5O6xmMyhmAUad3HsCcK0nQ3vdT1?= =?us-ascii?q?TI0w8RPBur2fNsccTMpbRLaYhQJNE1/NX6UtPPw0yS5KSkB/QrT/b5ttjCVlVw?= =?us-ascii?q?vjqy2ZYKTJ8jVEOxLuG2dgE7G2UXwJC0AEsjGkW/dtiq47gPUtSbrAcQKE7mp6?= =?us-ascii?q?vNhgFuS33EeThoMWjOGTTCCohbWc7pix4Y8o0LCbJTe9XBHivH4T0T+uHmArwI?= =?us-ascii?q?RUNpWEvQn5UeK0KW8D8OxGD0fVjAYADA5nJZeeNDo/gbhcxDV6fhHurqIT3mQ7?= =?us-ascii?q?fGR8SP0PjIaRYPHTTQcQ1FDu7EPv6lq5i8ijb9f/GqdltrxCC39yDCMrTEjivM?= =?us-ascii?q?Ul8FjO2CT5kjJ2XT0znTWZldd2zg7lV5JIu+0iEBJqmBoBZXmAS58Ebuk?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3A8z4ZUKrpAmKlYesid/hbYrgaV5oCeYIsimQD?= =?us-ascii?q?101hICG9Kvbo8vxHnJwguiMc+wxhPE3I+OrwQ5VoLkmslqKdjbN9AV7AZnidhI?= =?us-ascii?q?LLFvAB0WKK+VSJcEfDH4Vmu5uIBpIfNDSGNzlHZKjBjDVQWOxQp+VvuJrY49s3?= =?us-ascii?q?2R9WPHhXgo9bnn9ENjo=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0AbAQAf/dNhmCIeaIFXAxaDbV5BAV8GV?= =?us-ascii?q?zoxhAk+iQOFRQElgiWBFoIThh6Gb4wtgREBAk8QAQMBDSoBDgUBAgQBAYUGAhc?= =?us-ascii?q?6AQSCZgIeBgEFMxMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBCQsQBjQihWgNg?= =?us-ascii?q?iITDAwDA4N0AwEKDgEIBAY6BCcjAxQBBgMCBA0BFwEUChcBEhoBBIJfAYMXBAE?= =?us-ascii?q?KkgecDH8ygQGDTgEDBwkDDy+Dc4ESUg0CFIEAF4YMVEoBgn8Jg30pEIFVRIEVg?= =?us-ascii?q?TxtSgduglgLAQEBAQGBIxEHAQEGUBGCUReCTgSPDi8OLQIJBgEBDR8EDCYRBxM?= =?us-ascii?q?cCAYBASAvBAUtCwEHBSgMCQQHAwITBgEBCB8GCwsCHg+RVAExBo0vgz6HFIJbk?= =?us-ascii?q?iA0B4NFgTUGC4gSgRqMaogbg3CBSqItIZYVIIIkhmqBDAmBe0KTciqFNIFOKoF?= =?us-ascii?q?9MxowgngBATIJYQ+NeAEzFoEEAQGCSmpUgSaBdTuFSQJAMwIBATQCBgEKAQEDC?= =?us-ascii?q?YVjAQEFEwsBhk8EKIIaAQE?= X-IPAS-Result: =?us-ascii?q?A0AbAQAf/dNhmCIeaIFXAxaDbV5BAV8GVzoxhAk+iQOFRQE?= =?us-ascii?q?lgiWBFoIThh6Gb4wtgREBAk8QAQMBDSoBDgUBAgQBAYUGAhc6AQSCZgIeBgEFM?= =?us-ascii?q?xMBAgQVAQEFAQEBAgEDAwQBEwEBAQEBAQEBCQsQBjQihWgNgiITDAwDA4N0AwE?= =?us-ascii?q?KDgEIBAY6BCcjAxQBBgMCBA0BFwEUChcBEhoBBIJfAYMXBAEKkgecDH8ygQGDT?= =?us-ascii?q?gEDBwkDDy+Dc4ESUg0CFIEAF4YMVEoBgn8Jg30pEIFVRIEVgTxtSgduglgLAQE?= =?us-ascii?q?BAQGBIxEHAQEGUBGCUReCTgSPDi8OLQIJBgEBDR8EDCYRBxMcCAYBASAvBAUtC?= =?us-ascii?q?wEHBSgMCQQHAwITBgEBCB8GCwsCHg+RVAExBo0vgz6HFIJbkiA0B4NFgTUGC4g?= =?us-ascii?q?SgRqMaogbg3CBSqItIZYVIIIkhmqBDAmBe0KTciqFNIFOKoF9MxowgngBATIJY?= =?us-ascii?q?Q+NeAEzFoEEAQGCSmpUgSaBdTuFSQJAMwIBATQCBgEKAQEDCYVjAQEFEwsBhk8?= =?us-ascii?q?EKIIaAQE?= X-IronPort-AV: E=Sophos;i="5.88,260,1635199200"; d="scan'208,217";a="13495599" X-MGA-submission: =?us-ascii?q?MDFchPHiG4HF0OWg1ch5TRCDqZ64SmvatXvSk5?= =?us-ascii?q?DZXWgCkE0swPTnc/HftxCVPQdTx3ULOgBRXsGe1b0+GqYzcmHsaAdr3U?= =?us-ascii?q?imp2CZaNsbcLcVcRfAvL+7ktl9KhB824A9TTOPQCTN6wgfoo0nVwjWX8?= =?us-ascii?q?RJ44R8y16lCdurDOy9MjX4LA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 04 Jan 2022 08:56:46 +0100 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F0DA85646C1; Tue, 4 Jan 2022 08:56:42 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 04 Jan 2022 08:56:30 +0100 Message-ID: <87bl0sc4sx.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 4 08:56:43 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.000003, queueID=6B7855646C3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMjgsIDIwMjENCnRvIEphbnVhcnkgMDQsIDIwMjIuDQoNClRhYmxlIG9m IENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KQSBoYWNrIGZvciB0b3BsZXZlbCBicmVha3BvaW50cyB1c2luZyBlZmZlY3QgaGFu ZGxlcnMNCk11bHRpLXNob3QgY29udGludWF0aW9ucyBnb25lIGZvcmV2ZXI/DQpOZXcgcmVsZWFz ZSBvZiBNZW5oaXIgKDIwMjExMjMwKQ0KSW1wcm92ZWQgZG9jdW1lbnRhdGlvbiBmb3IgRml4DQpw cC1iaW5hcnktaW50cyAwLjEuMQ0KT2xkIENXTg0KDQoNCkEgaGFjayBmb3IgdG9wbGV2ZWwgYnJl YWtwb2ludHMgdXNpbmcgZWZmZWN0IGhhbmRsZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2EtaGFjay1mb3ItdG9wbGV2ZWwtYnJlYWtwb2ludHMtdXNpbmctZWZmZWN0LWhh bmRsZXJzLzkwNjUvMT4NCg0KDQp3aWt0b3IgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHN0YXJ0ZWQgcGxheWluZyB3aXRo IGVmZmVjdCBoYW5kbGVycyBhbmQgd29uZGVyZWQgaWYgdGhleSBjb3VsZCBiZQ0KICB1c2VkIHRv IGltcGxlbWVudCB0b3BsZXZlbCBicmVha3BvaW50cy4gSXQncyBhIGJpZyBoYWNrIGFuZCBwcm9i YWJseQ0KICB1bnNvdW5kIGF0IHRoZSBtb21lbnQsIGJ1dCBpdCB3b3JrcyBhbmQgaGVyZSdzIGFu IGV4YW1wbGUgaW50ZXJhY3Rpb246DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgYXJy ID0NCiAg4pSCICAgbGV0IGZhY3QgbiA9DQogIOKUgiAgICAgbGV0IGFyciA9IEFycmF5Lm1ha2Ug KG4rMSkgMSBpbg0KICDilIIgICAgIGxldCByZWMgbG9vcCBpID0NCiAg4pSCICAgICAgIGlmIGkg PD0gbiB0aGVuIGJlZ2luDQogIOKUgiAJQnJlYWsuYnJlYWsgWyJpIiwgaTsgImFyciIsIGFycl07 DQogIOKUgiAJYXJyLihpKSA8LSBhcnIuKGktMSkgKiBpOw0KICDilIIgCWxvb3AgKGkrMSkNCiAg 4pSCICAgICAgIGVuZA0KICDilIIgICAgIGluDQogIOKUgiAgICAgKGxvb3AgMTsgYXJyKQ0KICDi lIIgICBpbg0KICDilIIgICAgIGZhY3QgNTs7DQogIOKUgiAjICgqIFdlIGhpdCBhIGJyZWFrcG9p bnQgYW5kIG9idGFpbiB0aGUgY29udGludWF0aW9uIGsgKikNCiAg4pSCICAgayAoKTs7DQogIOKU giAtIDogYm9vbCA9IHRydWUNCiAg4pSCICMgKCogdGhlIGJvb2xzIGFyZSBsZWFraW5nIGZyb20g dGhlIGV4ZWN1dGVfcGhyYXNlIGZ1bmN0aW9uDQogIOKUgiAgICAqIGluc2lkZSB0aGUgdG9wbGV2 ZWwgKikNCiAg4pSCICAgayAoKTs7DQogIOKUgiAtIDogYm9vbCA9IHRydWUNCiAg4pSCICMgaTs7 DQogIOKUgiAtIDogaW50ID0gMw0KICDilIIgIyBhcnI7Ow0KICDilIIgLSA6IGludCBhcnJheSA9 IFt8MTsgMTsgMjsgMTsgMTsgMXxdDQogIOKUgiAjICgqIGxldCdzIGRpc3R1cmIgdGhlIGNvbXB1 dGF0aW9uIG9mIGZhY3RvcmlhbHMgKikNCiAg4pSCICAgYXJyLihpLTEpIDwtIDQyOzsNCiAg4pSC IC0gOiB1bml0ID0gKCkNCiAg4pSCICMgayAoKTs7DQogIOKUgiAtIDogYm9vbCA9IHRydWUNCiAg 4pSCICMgKCogYnR3OiBoZXJlIHRoZSB1c2VyIGlzIGxpa2UgYSBzY2hlZHVsZXIgZm9yIHlpZWxk LWJhc2VkIGFzeW5jICopDQogIOKUgiAgIGsgKCk7Ow0KICDilIIgLSA6IGJvb2wgPSB0cnVlDQog IOKUgiAjIGsgKCk7Ow0KICDilIIgdmFsIGFyciA6IGludCBhcnJheSA9IFt8MTsgMTsgNDI7IDEy NjsgNTA0OyAyNTIwfF0NCiAg4pSCIC0gOiBib29sID0gdHJ1ZQ0KICDilJTilIDilIDilIDilIAN Cg0KICBDdXJyZW50bHkgSSBkb24ndCB0cnkgdG8gY2xlYW4gdXAgYmluZGluZ3Mgb3IgdmFsdWVz LCB3aGljaCBpcyBhDQogIHNvdXJjZSBvZiB1bnNvdW5kbmVzcy4gQWZ0ZXIgdGhlIGxhc3QgYGsg KCknIHdlIGdvdCB0d28gcmVzdWx0czogRmlyc3QNCiAgdGhlIGNvbXB1dGF0aW9uIG9mIGBsZXQg YXJyIC4uLicgZmluaXNoZWQsIGFuZCB0aGVuIHRoZSBjb21wdXRhdGlvbiBvZg0KICBgayAoKScg ZmluaXNoZWQuIEJ1dCBgaycgaXMgYSBwYXJ0IG9mIHRoZSBleGVjdXRpb24gb2YgYGxldCBhcnIg Li4uJywNCiAgc28gdGhlc2UgdHdvIGV4ZWN1dGlvbnMgImludGVyc2VjdCIgd2l0aG91dCBvbmUg YmVpbmcgY29udGFpbmVkIGluIHRoZQ0KICBvdGhlci4gVGhpcyBtYWtlcyB0aGUgcXVlc3Rpb24g b2Ygd2hhdCBzaG91bGQgdGhlIGN1cnJlbnQgdmFyaWFibGUNCiAgYmluZGluZ3MgYmUgY29tcGxp Y2F0ZWQuIFNldHRpbmcgdGhlIGJpbmRpbmdzIGF0IGVuZCBvZiBleGVjdXRpb24gaXMNCiAgZnV0 aWxlLCB3aGVuIGEgY29udGludWF0aW9uIG1heSBpbiBzdWNoIGEgd2F5IGxlYWsgYmluZGluZ3Mg ZnJvbQ0KICBicmVha3BvaW50IHRpbWUuDQoNCiAgUG9zc2libHkgYSBzdGFjayBkaXNjaXBsaW5l IGZvciB0aGUgZXhlY3V0aW9uIG9mIHBocmFzZXMgaXMgcmVxdWlyZWQNCiAgdG8gbWFrZSB0aGUg ZW52aXJvbm1lbnRzIGJlaGF2ZSBwcm9wZXJseTogYXQgdGhlIGVuZCBvZiBleGVjdXRpbmcgYQ0K ICBwaHJhc2Ugd2UgY2FuY2VsICh3aXRoIGFub3RoZXIgZWZmZWN0LCBtYXliZSkgb3RoZXIgZXhl Y3V0aW9ucyB3aGljaA0KICAiZGVwZW5kIiBvbiB0aGUgY3VycmVudCBleGVjdXRpb24gKGV2YWx1 YXRlIHRoZSBgaycgb2J0YWluZWQgZnJvbSBhDQogIGJyZWFrcG9pbnQgaW4gdGhlIGN1cnJlbnQg ZXhlY3V0aW9uKS4gVGhpcyBzaG91bGQgZWxpbWluYXRlIHRoZXNlDQogICJpbnRlcnNlY3Rpb25z IiBhbmQgd2UgY291bGQgdGhyb3cgb3V0IHRoZSBiaW5kaW5ncyBhZGRlZCBieSB0aGUNCiAgY2Fu Y2VsbGVkIGV4ZWN1dGlvbnMuDQoNCiAgSSBoYXZlbid0IHRyaWVkIGFueXRoaW5nIHdpdGggcG9s eW1vcnBoaXNtIHlldCwgYnV0IHR5cGUgdmFyaWFibGVzDQogIHNob3VsZCBwcm9iYWJseSBiZSBj aGFuZ2VkIGludG8gYWJzdHJhY3QgdHlwZXMgaW5zaWRlIHRoZSBiaW5kZXJzLg0KDQogIEhlcmUn cyB0aGUgY29kZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvb2NhbWwv Y29tcGFyZS9tdWx0aWNvcmUtcHIuLi53aWt0b3JrdWNodGE6dG9wbGV2ZWwtYnJlYWs+DQoNCg0K d2lrdG9yIGxhdGVyIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdlbGwsIHRoaXMgbWlnaHQgaGF2ZSBiZWVuIHVubmVjZXNzYXJ5 LCBhcyBtb3N0IG9mIGl0IGNhbiBiZSBkb25lDQogIHByb3Blcmx5IGluIHVzZXJzcGFjZSAod2l0 aCBtb3JlIHN5bnRhY3RpYyBvdmVyaGVhZCkuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGVuIEVmZmVjdEhhbmRsZXJzDQogIOKUgiBvcGVuIERlZXANCiAg4pSCIA0KICDilIIgdHlwZSAo J2EsICdiKSByZXMgPQ0KICDilIIgICB8IEJwIG9mICdhICogKCh1bml0LCAoJ2EsICdiKSByZXMp IGNvbnRpbnVhdGlvbikNCiAg4pSCICAgfCBGaW4gb2YgJ2INCiAg4pSCIA0KICDilIIgbW9kdWxl IHR5cGUgUDEgPSBzaWcgIHZhbCBpIDogaW50ICB2YWwgYXJyIDogaW50IGFycmF5IGVuZA0KICDi lIIgdHlwZSBwYXlsb2FkID0gUDEgb2YgKG1vZHVsZSBQMSkNCiAg4pSCIHR5cGUgXyBlZmYgKz0g QnJlYWsgOiBwYXlsb2FkIC0+IHVuaXQgZWZmDQogIOKUgiANCiAg4pSCIGxldCBhcnIgKCkgPQ0K ICDilIIgICBsZXQgZmFjdCBuID0NCiAg4pSCICAgICBsZXQgYXJyID0gQXJyYXkubWFrZSAobisx KSAxIGluDQogIOKUgiAgICAgbGV0IHJlYyBsb29wIGkgPQ0KICDilIIgICAgICAgaWYgaSA8PSBu IHRoZW4gYmVnaW4NCiAg4pSCIAlwZXJmb3JtIChCcmVhayAoUDEgKG1vZHVsZSBzdHJ1Y3QgbGV0 IGkgPSBpIGxldCBhcnIgPSBhcnIgZW5kKSkpOw0KICDilIIgCWFyci4oaSkgPC0gYXJyLihpLTEp ICogaTsNCiAg4pSCIAlsb29wIChpKzEpDQogIOKUgiAgICAgICBlbmQNCiAg4pSCICAgICBpbg0K ICDilIIgICAgIChsb29wIDE7IGFycikNCiAg4pSCICAgaW4NCiAg4pSCICAgICBmYWN0IDU7Ow0K ICDilIIgDQogIOKUgiBsZXQgd2l0aF9icmVhayB0aCA9DQogIOKUgiAgIHRyeV93aXRoIChmdW4g KCkgLT4gRmluICh0aCAoKSkpICgpDQogIOKUgiAgIHsgZWZmYyA9IGZ1biAodHlwZSBhKSAoZSA6 IGEgZWZmKSAtPg0KICDilIIgICAgICAgbWF0Y2ggZSB3aXRoDQogIOKUgiAgICAgICB8IEJyZWFr IHAgLT4gU29tZSAoZnVuIChrIDogKGEsXykgY29udGludWF0aW9uKSAtPiBCcCAocCwgaykpDQog IOKUgiAgICAgICB8IF8gLT4gTm9uZSB9DQogIOKUgiANCiAg4pSCIGxldCBjb250ID0gZnVuY3Rp b24NCiAg4pSCICAgfCBCcCAoXywgaykgLT4gY29udGludWUgayAoKQ0KICDilIIgICB8IEZpbiBf IC0+IGZhaWx3aXRoICJjb21wdXRhdGlvbiBmaW5pc2hlZCwgY2Fubm90IGNvbnRpbnVlIg0KICDi lIIgDQogIOKUgiBsZXQgZ2V0ID0gZnVuY3Rpb24NCiAg4pSCICAgfCBCcCAociwgXykgLT4gcg0K ICDilIIgICB8IEZpbiBfIC0+IGZhaWx3aXRoICJjb21wdXRhdGlvbiBmaW5pc2hlZCwgbm8gYnJl YWtwb2ludCBwYXlsb2FkIg0KICDilIIgDQogIOKUgiBsZXQgZ2V0MSByID0gbWF0Y2ggZ2V0IHIg d2l0aCBQMSBtIC0+IG0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAjIGxldCByID0gd2l0aF9icmVhayBhcnI7Ow0KICDilIIgdmFsIHIgOiAocGF5bG9hZCwg aW50IGFycmF5KSByZXMgPSBCcCAoUDEgPG1vZHVsZT4sIDxhYnN0cj4pDQogIOKUgiAjIG9wZW4g KHZhbCBnZXQxIHIpOzsNCiAg4pSCIHZhbCBpIDogaW50ID0gMQ0KICDilIIgdmFsIGFyciA6IGlu dCBhcnJheSA9IFt8MTsgMTsgMTsgMTsgMTsgMXxdDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBtYWluIHBhaW4gcG9pbnQgaXMgaGF2aW5nIHRvIGRlZmluZSB0aGUgcGF5bG9hZCB0eXBlcy4g SW4gYmFzaWMNCiAgY2FzZXMgdGhlIHBheWxvYWQgdHlwZSBjb3VsZCBiZSBqdXN0IGEgc2ltcGxl IHBvbHltb3JwaGljIHZhcmlhbnQuIEl0DQogIHdvdWxkIGJlIG5pY2UgaWYgaXQgY291bGQgYmUg Y29tcGxldGVseSBpbmZlcnJlZCwgYnV0IGl0J3MgdW5saWtlbHkgYXMNCiAgYEJyZWFrYCBoYXMg dG8gaGF2ZSBhIHN0YXRpY2FsbHkga25vd24gYXJndW1lbnQuDQoNCiAgV2l0aCBhIGJpdCBvZiBo ZWxwIGZyb20gdG9vbGluZyAocHB4ZXMgZm9yIGNvZGUgZ2VuZXJhdGlvbiBhbmQNCiAgc2hvcnRo YW5kcyBpbiB0aGUgdG9wbGV2ZWwpLCB0aGlzIGNvdWxkIGJlIGJldHRlciB0aGFuIHByaW50Zg0K ICBkZWJ1Z2dpbmcuDQoNCg0KR3VpbGxhdW1lIE11bmNoLU1hY2NhZ25vbmkgdGhlbiBzYWlkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGlzIGlzIGFuIGludGVyZXN0aW5nIGV4cGVyaW1lbnQuDQogIOKAoiBUaGlzIHJlbWluZHMgbWUg b2YgdGhlIGlkZWEgb2YgaGlnaC1sZXZlbCBzdGFjayBpbnNwZWN0aW9uIGZvcg0KICAgIGRlYnVn Z2luZyBhbmQgc2VjdXJpdHkgKGFydGljdWxhdGVkIGZvciBpbnN0YW5jZSBpbiBDbGVtZW50cycg UGhEDQogICAgdGhlc2lzIF9bUG9ydGFibGUgYW5kIGhpZ2gtbGV2ZWwgYWNjZXNzIHRvIHRoZSBz dGFjayB3aXRoDQogICAgQ29udGludWF0aW9uIE1hcmtzXV87IGhlcmUncyBbYW5vdGhlciBtb3Jl IHJlY2VudCBwYXBlcl0gZnJvbSB0aGUNCiAgICBSYWNrZXQgcGVvcGxlIHRoYXQgbWlnaHQgYmUg cmVsZXZhbnQpLiBPbmUgY2FuIGFzayB3aGV0aGVyIGEgUFBYIGNhbg0KICAgIHByb3ZpZGUgaGln aC1sZXZlbCBzdGFjayBpbnNwZWN0aW9uIG9yIGlmIG9uZSBuZWVkcyBzdXBwb3J0IGZyb20gdGhl DQogICAgY29tcGlsZXIgZm9yIHRoYXQuIEl0J3MgbmljZSB0byBleHBlcmltZW50Lg0KICDigKIg QSBmZXcgeWVhcnMgYWdvIHNvbWVvbmUgYXNrZWQgd2hldGhlciB0aGVyZSBjb3VsZCBiZSBhIHVz ZSB0bw0KICAgIHVudHlwZWQgYWxnZWJyYWljIGVmZmVjdHMgaW4gT0NhbWwgKGluIHRoZSBzZW5z ZSB0aGF0IHRoZXkgZG8gbm90DQogICAgYXBwZWFyIGluIHRoZSBlZmZlY3QgYW5ub3RhdGlvbiBp biBmdW5jdGlvbiB0eXBlcykuIEkgcHJvcG9zZWQNCiAgICBkZWJ1Z2dpbmcgYXMgYW4gZXhhbXBs ZS4gU29tZW9uZSBzdWdnZXN0ZWQgdGhhdCBpdCBpcyBub3QgdG9vIGhhcmQNCiAgICB0byBhZGFw dCB0aGUgaW50ZXJmYWNlIHR5cGVzIG9mIGFsbCBmdW5jdGlvbnMgaW4gdGhlIGNhbGwgY2hhaW4g dG8NCiAgICBhZGQgdGhlIGFwcHJvcHJpYXRlIGVmZmVjdCBhbm5vdGF0aW9uIChhbmQgcmVtb3Zl IGl0IGFmdGVyd2FyZHMpLA0KICAgIGJ1dCBJIHdhcyBub3QgY29udmluY2VkLg0KDQoNCltQb3J0 YWJsZSBhbmQgaGlnaC1sZXZlbCBhY2Nlc3MgdG8gdGhlIHN0YWNrIHdpdGggQ29udGludWF0aW9u IE1hcmtzXQ0KPGh0dHBzOi8vd3d3Mi5jY3MubmV1LmVkdS9yYWNrZXQvcHVicy9kaXNzZXJ0YXRp b24tY2xlbWVudHMucGRmPg0KDQpbYW5vdGhlciBtb3JlIHJlY2VudCBwYXBlcl0NCjxodHRwczov L2RsLmFjbS5vcmcvZG9pLzEwLjExNDUvMzM4NTQxMi4zMzg1OTgxPg0KDQoNCk11bHRpLXNob3Qg Y29udGludWF0aW9ucyBnb25lIGZvcmV2ZXI/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L211bHRpLXNob3QtY29udGludWF0aW9ucy1nb25lLWZvcmV2ZXIv OTA3Mi8xPg0KDQoNCmN5YmVycGluayBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2hhdCBoYXBwZW5zIHdpdGggbXVsdGktc2hvdCBjb250 aW51YXRpb25zIG5vdyB0aGF0DQogIE9iai5jbG9uZV9jb250aW51YXRpb24gd2FzIHJlbW92ZWQ/ DQogIChbaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmUv cHVsbC82NTFdKQ0KDQogIEFueXRoaW5nIHRoYXQgcmVxdWlyZXMgYSAiZm9yayIgb3BlcmF0aW9u LCBsaWtlIHNheSwgYSBwcm9iYWJpbGlzdGljDQogIHByb2dyYW1taW5nIEVEU0wsIG5lZWRzIHRo aXMuIE5vbmUgb2YgdGhlIG9sZCBleGFtcGxlcyBJJ3ZlIGxvb2tlZCBhdA0KICBsaWtlIFtEZWxp bWNjIG9uIHRvcCBvZiBlZmZlY3RzXSBoYXZlIGJlZW4gdXBkYXRlZCB0byB1c2UgYSBuZXcNCiAg bWV0aG9kLCBhbmQgSSBoYXZlbid0IGJlZW4gYWJsZSB0byBmaW5kIGFueSBoaW50cyBvZiBvbmUu DQoNCiAgQXJlIG11bHRpLXNob3QgY29udGludWF0aW9ucyBqdXN0IG5vdCBwb3NzaWJsZSBub3c/ IEFyZSB0aGVyZSBwbGFucyB0bw0KICBhZGQgc29tZXRoaW5nIGVxdWl2YWxlbnQgYmFjayBpbiBs YXRlcj8NCg0KDQpbaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0 aWNvcmUvcHVsbC82NTFdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9vY2Ft bC1tdWx0aWNvcmUvcHVsbC82NTE+DQoNCltEZWxpbWNjIG9uIHRvcCBvZiBlZmZlY3RzXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWZmZWN0cy1leGFtcGxlcy9ibG9iL21h c3Rlci9kZWxpbWNjLm1sPg0KDQoNCk5pY29sw6FzIE9qZWRhIELDpHIgcmVwbGllZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgWWVzLCBtdWx0aS1zaG90IGNvbnRpbnVhdGlvbnMgYXJlIGdvbmUg YW5kIGlzIHVubGlrZWx5IHRoYXQgdGhleSB3aWxsDQogIGZpbmQgdGhlaXIgd2F5IGJhY2sgYW55 IHRpbWUgc29vbi4gT25lIChnb29kKSByZWFzb24gaXMgZXhwbGFpbmVkIGluDQogIDxodHRwczov L2RsLmFjbS5vcmcvZG9pLzEwLjExNDUvMzQzNDMxND4gOg0KDQogIDxodHRwczovL2F3czEuZGlz Y291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzgvOGQy NjUyMGVmMGY3OTBmZDNkYzQ0MDc0NThkOTI1YzFhMjhmZGJjYS5wbmc+DQoNCiAgYW5kDQoNCiAg PGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwv b3JpZ2luYWwvMlgvYi9iMjhmYTE0Zjk2NzM2NDc0MzI3N2MwMTMyYTgwNGM0MzBkMmQ2NmQxLnBu Zz4NCg0KDQpHdWlsbGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSB0aGVuIHNhaWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgdGhpbmsgdGhl IHF1ZXN0aW9uIHN0aWxsIHN0YW5kcy4gWW91IGN1dCB0aGUgc2VudGVuY2Ug4oCcX0V4dGVuZGlu Zw0KICBvdXIgc3lzdGVtIHdpdGggbXVsdGktc2hvdCBjb250aW51YXRpb25zIGlzIGZ1dHVyZSB3 b3JrICjCpzgpX+KAnS4gQWxzbw0KICB0aGUgcGFwZXIgaXMgYWJvdXQgYSBwYXJ0aWN1bGFyIG1v ZGVsIGJhc2VkIG9uIHNlcGFyYXRpb24gbG9naWMgcmF0aGVyDQogIHRoYW4gT0NhbWwgaXRzZWxm IChmb3IgaW5zdGFuY2UgdGhlIGF1dGhvcnMgYWxzbyBtZW50aW9uIHRoYXQgdGhlaXINCiAgY29u dGludWF0aW9ucyBhcmUgYWZmaW5lIGluc3RlYWQgb2YgbGluZWFyIHVubGlrZSBpbiBPQ2FtbCBt dWx0aWNvcmUpLg0KDQogIE5ldmVydGhlbGVzcywgdGhlIG11bHRpY29yZSBkZXNpZ25lcnMgd2Vy ZSBhd2FyZSB0aGF0IGR1cGxpY2F0aW5nDQogIGNvbnRpbnVhdGlvbnMgbWFrZXMgaXQgY29tcGxp Y2F0ZWQgdG8gcmVhc29uIGFib3V0IHJlc291cmNlcy4gVGhlDQogIHRvcGljIG9mIG1peGluZyBj b250aW51YXRpb25zIGFuZCBsaW5lYXJpdHkgaGFzIGJlZW4gYmV0dGVyIHN0dWRpZWQNCiAgZnJv bSB0aGUgYW5nbGUgb2YgYWxnZWJyYWljIG1vZGVscyBvZiBjb21wdXRhdGlvbiBhbmQgcHJvb2YN CiAgdGhlb3J5LiBFc3NlbnRpYWxseSwgd2l0aCBhbiBlZmZlY3Qgc3lzdGVtIHlvdSBjb3VsZCBl bnN1cmUgdGhhdA0KICBjZXJ0YWluIGtpbmRzIG9mIGVmZmVjdHMgZG8gbm90IGhhcHBlbiBpbiB0 aGUgZGVsaW1pdGVkIHBhcnQgb2YgdGhlDQogIHByb2dyYW0gKGluY2x1ZGluZyBhbGxvY2F0aW5n IGEgcmVzb3VyY2UpLCB3aGljaCBjb250cm9scyBjb3BpYWJpbGl0eQ0KICBvZiB0aGUgc3RhY2sg ZnJvbSB0aGUgcG9pbnQgb2YgdmlldyBvZiByZWFzb25pbmcgYWJvdXQgdGhlDQogIHByb2dyYW0u IFRoaXMgaXMgaW5zcGlyZWQgYnkgc29tZSBsb2dpY3MgdGhhdCBtaXggY2xhc3NpY2FsIGFuZA0K ICBpbnR1aXRpb25pc3RpYyBvciBsaW5lYXIgbG9naWMuIEZyb20gdGhpcyBhbmdsZSB0aGUgYWJp bGl0eSB0byBjb3B5IGENCiAgY29udGludWF0aW9uIHdvdWxkIGJlIHJlc3RyaWN0ZWQgdG8gYSBz dWItcGFydCBvZiB0aGUgbGFuZ3VhZ2Ugd2hpY2gNCiAgaXMgcHVyZSB0byBzb21lIGRlZ3JlZS4g VGhpcyBzaG91bGQgYWxzbyBiZSBhIHN1aXRhYmxlIHN0YXJ0aW5nIHBvaW50DQogIGlmIG9uZSB3 YW50ZWQgdG8gZGV2ZWxvcCBhIHByb2dyYW0gbG9naWMgdG8gZm9ybWFsaXNlIHRoZSByZWFzb25p bmcNCiAgYWJvdXQgc3VjaCBwcm9ncmFtcy4NCg0KICBIb3dldmVyIGFjY29yZGluZyB0byBbIzY1 MV0gdGhlcmUgd2VyZSBtb3JlIHRlY2huaWNhbCByZWFzb25zIHRvIGRyb3ANCiAgYGNsb25lX2Nv bnRpbnVhdGlvbicsIHN1Y2ggYXMgYnJlYWtpbmcgY29tcGlsZXIgb3B0aW1pemF0aW9ucy4gSSBh bQ0KICBjdXJpb3VzIGFzIHdlbGwgdG8ga25vdyB3aGV0aGVyIHRoZXJlIGFyZSBwbGFucyB0byBy ZWludHJvZHVjZQ0KICBgY2xvbmVfY29udGludWF0aW9uJyBhdCBzb21lIHBvaW50LCBidXQgb2J2 aW91c2x5IHRoaXMgd291bGQgcmVxdWlyZQ0KICBzb21lIGVmZm9ydC4NCg0KDQpbIzY1MV0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlL3B1bGwvNjUx Pg0KDQoNCktDIFNpdmFyYW1ha3Jpc2huYW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQG5v amIgYW5kIEBnYWRtbSBoYXZlIGFscmVhZHkgYW5zd2VyZWQgd2h5IHdlJ3ZlIGRyb3BwZWQgc3Vw cG9ydCBmb3INCiAgYGNsb25lX2NvbnRpbnVhdGlvbicgbm93LiBXZSB3aWxsIG5lZWQgdG8gdHJh Y2sgdGhlIGNvcGlhYmlsaXR5IG9mIHRoZQ0KICBjb250aW51YXRpb24gaW4gdGhlIGNvbnRpbnVh dGlvbiB0eXBlIGFuZCBjb21waWxlciBvcHRpbWlzYXRpb25zIGFsc28NCiAgbmVlZCB0byBiZSBt YWRlIGF3YXJlIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBjb3B5aW5nLiBHaXZlbiB0aGUNCiAgcGVy dmFzaXZlIG5hdHVyZSBvZiBpdHMgZWZmZWN0cywgdGhlcmUgYXJlIG5vIGltbWVkaWF0ZSBwbGFu cyB0byBicmluZw0KICB0aGUgZmVhdHVyZSBiYWNrLiBXZSB3aWxsIGhhdmUgdG8gY29tZSBiYWNr IHRvIHRoaXMgYWZ0ZXIgd2UgaGF2ZQ0KICB0eXBlZCBlZmZlY3RzLg0KDQogICAgICAgIEFueXRo aW5nIHRoYXQgcmVxdWlyZXMgYSDigJxmb3Jr4oCdIG9wZXJhdGlvbiwgbGlrZSBzYXksIGENCiAg ICAgICAgcHJvYmFiaWxpc3RpYyBwcm9ncmFtbWluZyBFRFNMDQoNCiAgT25lIGNhbiBnZXQgcHJl dHR5IGZhciB3aXRoIFBQTCB3aXRoIGp1c3Qgb25lLXNob3QgY29udGludWF0aW9ucy4gTXkNCiAg c3R1ZGVudCBhbmQgSSBkaWQgc29tZSBleHBlcmltZW50cyBidWlsZGluZyBhIERTTCBmb3IgYSBQ UEwgdG8gbGVhcm4NCiAgYWJvdXQgdGhlIHNwYWNlOiA8aHR0cHM6Ly9naXRodWIuY29tL0Fybmhh di1EYXRhci9FZmZQUEw+LiBIYXZpbmcNCiAgc3Bva2VuIHRvIFBQTCBleHBlcnRzIHRoZXJlIGFy ZSBpbmRlZWQgc29tZSB1c2VjYXNlcyB3aGVyZSBtdWx0aS1zaG90DQogIGNvbnRpbnVhdGlvbnMg YXJlIHVzZWZ1bCwgYnV0IGZyb20gd2hhdCBJIHVuZGVyc3RhbmQsIHRoZSBvbmUtc2hvdG5lc3MN CiAgaXNuJ3QgYSBibG9ja2VyIGZvciBQUEwuDQoNCiAgSSB3b3VsZCBiZSBpbnRlcmVzdGVkIGlu IGNvbGxlY3RpbmcgdXNlY2FzZXMgd2hlcmUgbXVsdGktc2hvdA0KICBjb250aW51YXRpb25zIGFy ZSBhYnNvbHV0ZWx5IG5lY2Vzc2FyeS4NCg0KDQpnYXNjaGUgdGhlbiBzYWlkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbnRlcmVzdGluZyEN Cg0KICBNeSAocHJvYmFibHkgbmFpdmUpIG1lbnRhbCBtb2RlbCBvZiBIQU5TRUktc3R5bGUgbGli cmFyaWVzLCB1c2luZw0KICBtdWx0aXNob3QgY29udGludWF0aW9ucywgaXMgdGhhdCB0aGV5IGFy ZSBleHRlbnNpb25zL2dlbmVyYWxpemF0aW9uIG9mDQogIGEgbm9uLXByb2JhYmlsaXN0aWMgImxv Z2ljL25vbi1kZXRlcm1pbmlzdGljIG1vbmFkIiB0aGF0IHNlYXJjaGVzIGZvcg0KICB0aGUgc2V0 IG9mIHNvbHV0aW9ucyB0byBhIHByb2JsZW0uIE11bHRpc2hvdCBjb250aW51YXRpb25zIGFyZQ0K ICBuYXR1cmFsbHkgdXNlZCBpbiBub24tZGV0ZXJtaW5pc3RpYyBjb21wdXRhdGlvbnMgYXQgYmFj a3RyYWNraW5nDQogIHBvaW50cywgdG8gZXhwbG9yZSBkaWZmZXJlbnQgc2VhcmNoIGRpcmVjdGlv bnMgYW5kIGNvbGxlY3QgdGhlDQogIHJlc3VsdC4gSXQgaXMgcG9zc2libGUgdG8gYXZvaWQgbXVs dGlzaG90IGNvbnRpbnVhdGlvbnMgYnkgcmVwbGF5aW5nDQogIHRoZSB3aG9sZSBzZWFyY2ggZnJv bSB0aGUgc3RhcnQgZWFjaCB0aW1lIChyZWZlcmVuY2U6IFtDYXB0dXJpbmcgdGhlDQogIGZ1dHVy ZSBieSByZXBsYXlpbmcgdGhlIHBhc3RdKSwgYnV0IHRoaXMgaW52b2x2ZXMgZHVwbGljYXRlZA0K ICBjb21wdXRhdGlvbnMgc28gaXQgaXMgbGVzcyBlZmZpY2llbnQgKHJlZmVyZW5jZTogW0FzeW1w dG90aWMgc3BlZWR1cA0KICB3aXRoIGZpcnN0LWNsYXNzIGNvbnRyb2xdKS4NCg0KICBDYW4geW91 IGdpdmUgc29tZSBpbnR1aXRpb24gb2YgaG93IG90aGVyIGFwcHJvYWNoZXMgdG8gcHJvYmFsaXN0 aWMNCiAgaW5mZXJlbmNlIHdvcmssIHRoYXQgZG8gbm90IHJlcXVpcmUgbXVsdGlzaG90IGNvbnRp bnVhdGlvbnM/IEFyZSB0aGV5DQogIGFsc28gZHVwbGljYXRpbmcgY29tcHV0YXRpb25zLCBvciBh cmUgdGhleSB1c2luZyBhIG1hZ2ljIHRyaWNrIHRvDQogIGF2b2lkIHRoaXMgaXNzdWUgd2l0aCBh IGRpZmZlcmVudCBpbmZlcmVuY2UgYWxnb3JpdGhtPw0KDQogIEkgdHJpZWQgdG8gZmluZCBhbiBh bnN3ZXIgdG8gdGhpcyBxdWVzdGlvbiBieSByZWFkaW5nIHRoZSBbaW50ZXJuc2hpcA0KICByZXBv cnRdLCBidXQgSSBjb3VsZG4ndCBsb2NhdGUgYW4gYW5zd2VyLiAoVGhlIHJlcG9ydCBtZW50aW9u cyBIQU5TRUkNCiAgaW4gdGhlIHJlbGF0ZWQgd29yaywgYnV0IGl0IGRvZXMgbm90IGRpc2N1c3Mg dGhpcyBxdWVzdGlvbi4pIFRoZQ0KICByZXBvcnQgZXhwbGFpbnMgdGhhdCB0aGUgaW5mZXJlbmNl IGFsZ29yaXRobSwgY2FsbGVkIEhNQyAoSGFtaWx0b25pYW4NCiAgTW9udGUgQ2FybG8pLCB1c2Vz IGF1dG9tYXRpYyBkaWZmZXJlbmNpYXRpb247IHNvIGl0IHVzZXMgYSBzb3J0IG9mDQogIHN5bWJv bGljIG1hbmlwdWxhdGlvbiAvIGFuYWx5c2lzIG9mIHRoZSBwcm9iYWJpbGlzdGljIHByb2dyYW0g dG8NCiAgc2FtcGxlLiBCdXQgZG9lcyB0aGlzIGF2b2lkIHJlcGVhdGVkIGNvbXB1dGF0aW9ucz8g IEl0IG1heSBiZSB0aGUgY2FzZQ0KICBpbnN0ZWFkIHRoYXQgdGhlIGRpZmZlcmVudGlhbCBpcyBh cyBsYXJnZSBvciBsYXJnZXIgdGhhbiB0aGUgcHJvZ3JhbQ0KICBpdHNlbGYsIGFuZCB0aGF0IHRo ZSBzZWFyY2ggYWxnb3JpdGhtIHVzaW5nIHRoaXMgZGlmZmVyZW50aWFsIGluDQogIGVmZmVjdCBw ZXJmb3JtIGEgcHJvZ3JhbS1zaXplZCBjb21wdXRhdGlvbiBhdCBlYWNoIHNlYXJjaCBzdGVwLA0K ICBkdXBsaWNhdGluZyBjb21wdXRhdGlvbnMuDQoNCg0KW0NhcHR1cmluZyB0aGUgZnV0dXJlIGJ5 IHJlcGxheWluZyB0aGUgcGFzdF0NCjxodHRwczovL2FyeGl2Lm9yZy9wZGYvMTcxMC4xMDM4NT4N Cg0KW0FzeW1wdG90aWMgc3BlZWR1cCB3aXRoIGZpcnN0LWNsYXNzIGNvbnRyb2xdDQo8aHR0cHM6 Ly9hcnhpdi5vcmcvYWJzLzIwMDcuMDA2MDU+DQoNCltpbnRlcm5zaGlwIHJlcG9ydF0NCjxodHRw czovL2dpdGh1Yi5jb20vQXJuaGF2LURhdGFyL0VmZlBQTC9ibG9iL21haW4vRWZmUFBMX1JlcG9y dC5wZGY+DQoNCg0KU2FkaXEgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgTm90IGEgUFBMIGJ1dCBJJ3ZlIGJlZW4gaGFja2luZyBvbiBhIGxpdHRsZSBlZmZlY3RzLWJh c2VkIG1vZGVsDQogIGNoZWNrZXIgZm9yIGNvbmN1cnJlbnQgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQg aW1wbGVtZW50cyBkeW5hbWljIHBhcnRpYWwNCiAgb3JkZXIgcmVkdWN0aW9uICg8aHR0cHM6Ly9n aXRodWIuY29tL3NhZGlxai9kc2NoZWNrLz4gLSBhDQogIFdJUCEpLiBNdWx0aS1zaG90IGNvbnRp bnVhdGlvbnMgd291bGQgaGF2ZSBiZWVuIHZlcnkgdXNlZnVsLg0KDQogIEkgZW5kZWQgdXAgaW1w bGVtZW50aW5nIHNvbWV0aGluZyB0aGF0IGludm9sdmVzIG1haW50YWluaW5nIGEgc2NoZWR1bGUN CiAgYW5kIHJlcGVhdGVkbHkgcmVwbGF5aW5nIHRoZSBjb21wdXRhdGlvbi4gSXQgbG9va3MgdmVy eSBzaW1pbGFyIHRvDQogIHdoYXQgW0NhcHR1cmluZyB0aGUgZnV0dXJlLi5dIHByb3Bvc2VzLg0K DQoNCltDYXB0dXJpbmcgdGhlIGZ1dHVyZS4uXSA8aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzE3MTAu MTAzODU+DQoNCg0KTmV3IHJlbGVhc2Ugb2YgTWVuaGlyICgyMDIxMTIzMCkNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxlYXNlLW9mLW1lbmhpci0yMDIxMTIzMC85MDc3 LzE+DQoNCg0KRnJhbsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBEZWFyIE9DYW1sICYgTWVuaGlyIHVzZXJzLA0KDQogIEkgYW0gcGxlYXNlZCB0byBh bm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIE1lbmhpciwgd2l0aCBhIG1ham9yDQogIGltcHJvdmVt ZW50Lg0KDQogIFRoZSBjb2RlIGJhY2stZW5kIGhhcyBiZWVuIHJld3JpdHRlbiBmcm9tIHRoZSBn cm91bmQgdXAgYnkgw4ltaWxlDQogIFRyb3RpZ25vbiBhbmQgYnkgbXlzZWxmLCBhbmQgbm93IHBy b2R1Y2VzIGVmZmljaWVudCBhbmQgd2VsbC10eXBlZA0KICBPQ2FtbCBjb2RlLiBUaGUgaW5mYW1v dXMgT2JqLm1hZ2ljIGlzIG5vdCB1c2VkIGFueSBtb3JlLg0KDQogIEZ1cnRoZXJtb3JlLCB0aGUg bmV3IGNvZGUgYmFjay1lbmQgcHJvZHVjZXMgY29kZSB0aGF0IGlzIG1vcmUNCiAgYWdncmVzc2l2 ZWx5IG9wdGltaXplZCwgbGVhZGluZyB0byBhIHNpZ25pZmljYW50IHJlZHVjdGlvbiBpbiBtZW1v cnkNCiAgYWxsb2NhdGlvbiBhbmQgYSB0eXBpY2FsIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50IG9m IHVwIHRvIDIwJSBjb21wYXJlZA0KICB0byB0aGUgcHJldmlvdXMgY29kZSBiYWNrLWVuZC4NCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwg bWVuaGlyLjIwMjExMjMwDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEhhcHB5IHdlbGwtdHlwZWQg cGFyc2luZyBpbiAyMDIyIQ0KDQoNCjIwMjEvMTIvMzANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBUaGUgY29kZSBiYWNrLWVuZCBoYXMgYmVlbiByZXdyaXR0ZW4gZnJv bSB0aGUgZ3JvdW5kIHVwIGJ5IMOJbWlsZQ0KICAgIFRyb3RpZ25vbiBhbmQgRnJhbsOnb2lzIFBv dHRpZXIsIGFuZCBub3cgcHJvZHVjZXMgZWZmaWNpZW50IGFuZA0KICAgICp3ZWxsLXR5cGVkKiBP Q2FtbCBjb2RlLiBUaGUgaW5mYW1vdXMgYE9iai5tYWdpYycgaXMgbm90IHVzZWQgYW55DQogICAg bW9yZS4NCg0KICAgIFRoZSB0YWJsZSBiYWNrLWVuZCBhbmQgdGhlIENvcSBiYWNrLWVuZCBhcmUg dW5hZmZlY3RlZCBieSB0aGlzDQogICAgY2hhbmdlLg0KDQogICAgVGhlIG1haW4gc2lkZSBlZmZl Y3RzIG9mIHRoaXMgY2hhbmdlIGFyZSBhcyBmb2xsb3dzOg0KDQogICAg4oCiIFRoZSBjb2RlIGJh Y2stZW5kIG5vdyBuZWVkcyB0eXBlIGluZm9ybWF0aW9uLiBUaGlzIG1lYW5zIHRoYXQNCiAgICAg IC9laXRoZXIvIE1lbmhpcidzIHR5cGUgaW5mZXJlbmNlIG1lY2hhbmlzbSBtdXN0IGJlIGVuYWJs ZWQgKHRoZQ0KICAgICAgCSBlYXNpZXN0IHdheSBvZiBlbmFibGluZyBpdCBpcyB0byB1c2UgTWVu aGlyIHZpYSBgZHVuZScNCiAgICAgIAkgYW5kIHRvIGNoZWNrIHRoYXQgdGhlIGBkdW5lLXByb2pl Y3QnIGZpbGUgc2F5cyBgKHVzaW5nDQogICAgICAJIG1lbmhpciAyLjApJyBvciBsYXRlcikNCiAg ICAgIC9vci8gdGhlIHR5cGUgb2YgZXZlcnkgbm9udGVybWluYWwgc3ltYm9sIG11c3QgYmUgZXhw bGljaXRseSBnaXZlbg0KICAgICAgICAgICB2aWEgYSBgJXR5cGUnIGRlY2xhcmF0aW9uLg0KDQog ICAg4oCiIFRoZSBjb2RlIGJhY2stZW5kIG5vIGxvbmdlciBhbGxvd3MgdGhlIHR5cGUgb2YgYW55 IHN5bWJvbCB0byBiZSBhbg0KICAgICAgb3BlbiBwb2x5bW9ycGhpYyB2YXJpYW50IHR5cGUsIHN1 Y2ggYXMgYFs+IGBBIF0nLiBBcyBhIHdvcmthcm91bmQsDQogICAgICB3ZSBzdWdnZXN0IHVzaW5n IGEgY2xvc2VkIHBvbHltb3JwaGljIHZhcmlhbnQgaW5zdGVhZC4NCg0KICAgIOKAoiBUaGUgY29k ZSBiYWNrLWVuZCBub3cgYWRoZXJlcyB0byB0aGUgL3NpbXBsaWZpZWQvIGVycm9yLWhhbmRsaW5n DQogICAgICBzdHJhdGVneSwgYXMgb3Bwb3NlZCB0byB0aGUgL2xlZ2FjeS8gc3RyYXRlZ3kuDQoN CiAgICAgIEZvciBncmFtbWFycyB0aGF0IGRvIC9ub3QvIHVzZSB0aGUgYGVycm9yJyB0b2tlbiwg dGhpcyBtYWtlcyBubw0KICAgICAgZGlmZmVyZW5jZS4NCg0KICAgICAgRm9yIGdyYW1tYXJzIHRo YXQgdXNlIHRoZSBgZXJyb3InIHRva2VuIGluIHRoZSBsaW1pdGVkIHdheQ0KICAgICAgcGVybWl0 dGVkIGJ5IHRoZSBzaW1wbGlmaWVkIHN0cmF0ZWd5LCB0aGlzIG1ha2VzIG5vIGRpZmZlcmVuY2UN CiAgICAgIGVpdGhlci4gVGhlIHNpbXBsaWZpZWQgc3RyYXRlZ3kgbWFrZXMgdGhlIGZvbGxvd2lu ZyByZXF1aXJlbWVudDoNCiAgICAgIHRoZSBgZXJyb3InIHRva2VuIHNob3VsZCBhbHdheXMgYXBw ZWFyIGF0IHRoZSBlbmQgb2YgYSBwcm9kdWN0aW9uLA0KICAgICAgd2hvc2Ugc2VtYW50aWMgYWN0 aW9uIHNob3VsZCBhYm9ydCB0aGUgcGFyc2VyIGJ5IHJhaXNpbmcgYW4NCiAgICAgIGV4Y2VwdGlv bi4NCg0KICAgICAgR3JhbW1hcnMgdGhhdCBtYWtlIG1vcmUgY29tcGxleCB1c2Ugb2YgdGhlIGBl cnJvcicgdG9rZW4sIGFuZA0KICAgICAgdGhlcmVmb3JlIG5lZWQgdGhlIGBsZWdhY3knIHN0cmF0 ZWd5LCBjYW5ub3QgYmUgY29tcGlsZWQgYnkgdGhlDQogICAgICBuZXcgY29kZSBiYWNrLWVuZC4g IEFzIGEgd29ya2Fyb3VuZCwgaXQgaXMgcG9zc2libGUgdG8gc3dpdGNoIHRvDQogICAgICB0aGUg dGFibGUgYmFjay1lbmQgKHVzaW5nIGAtLXRhYmxlIC0tc3RyYXRlZ3kgbGVnYWN5Jykgb3IgdG8g dGhlDQogICAgICBhbmNpZW50IGNvZGUgYmFjay1lbmQgKHVzaW5nIGAtLWNvZGUtYW5jaWVudCcp LiAqSW4gdGhlIGxvbmcgcnVuLA0KICAgICAgd2UgcmVjb21tZW5kIGFiYW5kb25pbmcgdGhlIHVz ZSBvZiB0aGUgYGVycm9yJyB0b2tlbiouIFN1cHBvcnQgZm9yDQogICAgICB0aGUgYGVycm9yJyB0 b2tlbiBtYXkgYmUgcmVtb3ZlZCBlbnRpcmVseSBhdCBzb21lIHBvaW50IGluIHRoZQ0KICAgICAg ZnV0dXJlLg0KDQogICAgVGhlIG9yaWdpbmFsIGNvZGUgYmFjay1lbmQsIHdoaWNoIGhhcyBiZWVu IGFyb3VuZCBzaW5jZSB0aGUgZWFybHkNCiAgICBkYXlzIG9mIE1lbmhpciAoMjAwNSksIHRlbXBv cmFyaWx5IHJlbWFpbnMgYXZhaWxhYmxlICh1c2luZw0KICAgIGAtLWNvZGUtYW5jaWVudCcpLiBJ dCB3aWxsIGJlIHJlbW92ZWQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLg0KDQogICAgVGhl IG5ldyBjb2RlIGJhY2stZW5kIG9mZmVycyBzZXZlcmFsIGxldmVscyBvZiBvcHRpbWl6YXRpb24s IHdoaWNoDQogICAgcmVtYWluIHVuZG9jdW1lbnRlZCBhbmQgYXJlIHN1YmplY3QgdG8gY2hhbmdl IGluIHRoZSBmdXR1cmUuIEF0DQogICAgcHJlc2VudCwgdGhlIG1haW4gbGV2ZWxzIGFyZSByb3Vn aGx5IGFzIGZvbGxvd3M6DQoNCiAgICDigKIgYC1PIDAgLS1yZXByZXNlbnQtZXZlcnl0aGluZycg dXNlcyBhIHVuaWZvcm0gcmVwcmVzZW50YXRpb24gb2YgdGhlDQogICAgICBzdGFjayBhbmQgcHJv ZHVjZXMgc3RyYWlnaHRmb3J3YXJkIGNvZGUuDQogICAg4oCiIGAtTyAwJyB1c2VzIGEgbm9uLXVu aWZvcm0gcmVwcmVzZW50YXRpb24gb2YgdGhlIHN0YWNrOyBzb21lIHN0YWNrDQogICAgICBjZWxs cyBoYXZlIGZld2VyIGZpZWxkczsgc29tZSBzdGFjayBjZWxscyBkaXNhcHBlYXIgYWx0b2dldGhl ci4NCiAgICDigKIgYC1PIDEnIHJlZHVjZXMgbWVtb3J5IHRyYWZmaWMgYnkgbW92aW5nIGBQVVNI JyBvcGVyYXRpb25zIHNvIHRoYXQNCiAgICAgIHRoZXkgbWVldCBgUE9QJyBvcGVyYXRpb25zIGFu ZCBjYW5jZWwgb3V0Lg0KICAgIOKAoiBgLU8gMicgb3B0aW1pemVzIHRoZSByZWR1Y3Rpb24gb2Yg dW5pdCBwcm9kdWN0aW9ucyAodGhhdCBpcywNCiAgICAgIHByb2R1Y3Rpb25zIHdob3NlIHJpZ2h0 LWhhbmQgc2lkZSBoYXMgbGVuZ3RoIDEpIGJ5IHBlcmZvcm1pbmcgYQ0KICAgICAgbGltaXRlZCBh bW91bnQgb2YgY29kZSBzcGVjaWFsaXphdGlvbi4NCg0KICAgIFRoZSBkZWZhdWx0IGxldmVsIG9m IG9wdGltaXphdGlvbiBpcyB0aGUgbWF4aW11bSBsZXZlbCwgYC1PIDInLg0KDQogIOKAoiBUaGUg bmV3IGNvbW1hbmQgbGluZSBzd2l0Y2ggYC0tZXhuLWNhcnJpZXMtc3RhdGUnIGNhdXNlcyB0aGUN CiAgICBleGNlcHRpb24gYEVycm9yJyB0byBjYXJyeSBhbiBpbnRlZ2VyIHBhcmFtZXRlcjogYGV4 Y2VwdGlvbiBFcnJvciBvZg0KICAgIGludCcuIFdoZW4gdGhlIHBhcnNlciBkZXRlY3RzIGEgc3lu dGF4IGVycm9yLCB0aGUgbnVtYmVyIG9mIHRoZQ0KICAgIGN1cnJlbnQgc3RhdGUgaXMgcmVwb3J0 ZWQgaW4gdGhpcyB3YXkuIFRoaXMgYWxsb3dzIHRoZSBjYWxsZXIgdG8NCiAgICBzZWxlY3QgYSBz dWl0YWJsZSBzeW50YXggZXJyb3IgbWVzc2FnZSwgYWxvbmcgdGhlIGxpbmVzIGRlc2NyaWJlZCBp bg0KICAgIFtTZWN0aW9uIDExXSBvZiB0aGUgbWFudWFsLiBUaGlzIGNvbW1hbmQgbGluZSBzd2l0 Y2ggaXMgY3VycmVudGx5DQogICAgc3VwcG9ydGVkIGJ5IHRoZSBjb2RlIGJhY2stZW5kIG9ubHku DQoNCiAg4oCiIFRoZSBgJHN5bnRheGVycm9yJyBrZXl3b3JkIGlzIG5vIGxvbmdlciBzdXBwb3J0 ZWQuDQoNCiAg4oCiIERvY3VtZW50IHRoZSB0cmljayBvZiB3cmFwcGluZyBtb2R1bGUgYWxpYXNl cyBpbiBgb3BlbiBzdHJ1Y3QNCiAgICAuLi4gZW5kJywgbGlrZSB0aGlzOiBgJXsgb3BlbiBzdHJ1 Y3QgbW9kdWxlIGFsaWFzIE0gPQ0KICAgIE15TG9uZ01vZHVsZU5hbWUgZW5kICV9Jy4gIFRoaXMg YWxsb3dzIHlvdSB0byB1c2UgdGhlIHNob3J0IG5hbWUgYE0nDQogICAgaW4geW91ciBncmFtbWFy LCBidXQgZm9yY2VzIE9DYW1sIHRvIGluZmVyIHR5cGVzIHRoYXQgcmVmZXIgdG8gdGhlDQogICAg bG9uZyBuYW1lIGBNeUxvbmdNb2R1bGVOYW1lJy4gIChTdWdnZXN0ZWQgYnkgRnLDqWTDqXJpYyBC b3VyLikNCg0KDQpbU2VjdGlvbiAxMV0NCjxodHRwOi8vY2FtYml1bS5pbnJpYS5mci9+ZnBvdHRp ZXIvbWVuaGlyL21hbnVhbC5odG1sI3NlYzY4Pg0KDQoNCkltcHJvdmVkIGRvY3VtZW50YXRpb24g Zm9yIEZpeA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taW1wcm92ZWQtZG9jdW1lbnRhdGlv bi1mb3ItZml4LzkwNzkvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIE15IGxhc3QgY29udHJpYnV0aW9uIGZvciAyMDIxIGlzIGFu IGltcHJvdmVkIGRvY3VtZW50YXRpb24gZm9yIEZpeCwgYQ0KICBsaWJyYXJ5IHRoYXQgaGVscHMg d2l0aCB2YXJpb3VzIGFsZ29yaXRobWljIGNvbnN0cnVjdGlvbnMgdGhhdCBpbnZvbHZlDQogIG1l bW9pemF0aW9uLCByZWN1cnNpb24sIGFuZCBudW1iZXJpbmcuDQoNCiAgVGhlIGRvY3VtZW50YXRp b24gY2FuIGJlIFt2aWV3ZWQgb25saW5lXS4NCg0KICBJdCBjYW4gYWxzbyBiZSB2aWV3ZWQgbG9j YWxseSAob24geW91ciBvd24gbWFjaGluZSkgYXMgZm9sbG93czoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwgZml4LjIwMjExMjMxDQog IOKUgiBvcGFtIGluc3RhbGwgb2RpZw0KICDilIIgb2RpZyBvZG9jICAgICAgICAgICAgICAgICAj IHRoaXMgbWF5IHRha2Ugc29tZSB0aW1lDQogIOKUgiBvZGlnIGRvYyBmaXggICAgICAgICAgICAg ICMgdGhpcyBvcGVucyB0aGUgZG9jIGluIHlvdXIgYnJvd3Nlcg0KICDilJTilIDilIDilIDilIAN Cg0KICBIYXBweSBmaXgnaW4nIGluIDIwMjIhDQoNCg0KW3ZpZXdlZCBvbmxpbmVdIDxodHRwOi8v Y2FtYml1bS5pbnJpYS5mci9+ZnBvdHRpZXIvZml4L2RvYy9maXgvPg0KDQoNCnBwLWJpbmFyeS1p bnRzIDAuMS4xDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1wcC1iaW5hcnktaW50cy0wLTEtMS85MDgwLzE+DQoNCg0KSWZheiBLYWJpciBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFRpcmVkIG9mIHByaW50aW5nIG9jdGFscyBhbmQgaGV4YWRlY2ltYWxzIGFu ZCB0aGVuIG1lbnRhbGx5IGNvbnZlcnRpbmcNCiAgdGhlbSB0byBiaXRzLiBFdmVyIHdhbnRlZCB0 byBqdXN0IHNlZSB0aGUgYml0cyBpbiBhbiBpbnQ/IE5vdyB5b3UgY2FuIQ0KDQogIEp1c3QgcnVu IGBvcGFtIGluc3RhbGwgcHAtYmluYXJ5LWludHMnIGFuZCBvZmYgeW91IGdvOg0KICDilIzilIDi lIDilIDilIANCiAg4pSCICMgUHBfYmluYXJ5X2ludHMuSW50LnRvX3N0cmluZyAwYjEwMTAxMDAx OzsNCiAg4pSCIC0gOiBzdHJpbmcgPSAiMTAxMDEwMDEiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IFlvdSBjYW4gZmluZCB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlIHByb2plY3QgYW5kIG1vcmUg ZXhhbXBsZXMgb2YNCiAgaG93IHRvIHVzZSBpdCBbaGVyZV0uDQoNCiAgVGhlIGxpYnJhcnkgaXMg dmVyeSBjdXN0b21pemFibGUuDQoNCiAg4oCiIFlvdSBjYW4gY2hvb3NlIHRvIHByaW50IHdpdGgg YDBiJyBwcmVmaXhlcyBhbmQgYF8nIHNlcGFyYXRvcnMuDQogIOKAoiBZb3UgY2FuIGNob29zZSB0 byBwcmludCB6ZXJvcyBqdXN0IGxpa2UgdGhlIG5vbi16ZXJvcywgd2l0aCBwcmVmaXhlcw0KICAg IGFuZCBzZXBhcmF0b3JzLg0KICDigKIgSWYgeW91IHVzZSB6ZXJvIHBhZGRpbmcsIHlvdSBjYW4g Y29udHJvbCBob3cgbWFueSBsZWFkaW5nIHplcm9zIHNob3cNCiAgICB1cCB3aXRoIHRoZSBgfm1p bl93aWR0aCcgYXJndW1lbnQuDQogIOKAoiBJdCBjb3JyZWN0bHkgaGFuZGxlcyB0aGUgZWRnZSBj YXNlcyB3aGVuIGFkZGluZyBgXycgc2VwYXJhdG9yczogeW91DQogICAgd29u4oCZdCBnZXQgbGVh ZGluZyB1bmRlcnNjb3Jlcy4NCiAg4oCiIEl0IGluY2x1ZGVzIHByZXR0eSBwcmludGVycyB0aGF0 IHdvcmsgd2l0aCBgRm9ybWF0JyBhbmQgYEZtdCcgLCBub3QNCiAgICBqdXN0IGB0b19zdHJpbmcn IGZ1bmN0aW9ucy4NCiAg4oCiIFN1cHBvcnRzIGBpbnQnLCBgaW50MzInLCBgaW50NjQnLCBhbmQg YG5hdGl2ZWludCcuDQogIOKAoiBEb24ndCBsaWtlIHRoZSBkZWZhdWx0IHByZWZpeGVzIGFuZCBz dWZmaXhlcz8gQ3VzdG9taXplIHRoZSBwcmVmaXhlcw0KICAgIGFuZCBzdWZmaXhlcyB3aXRoIHRo ZSBwcm92aWRlZCBmdW5jdG9yLg0KDQoNCltoZXJlXQ0KPGh0dHBzOi8vaWZhemsuZ2l0aHViLmlv L3BwLWJpbmFyeS1pbnRzL3BwLWJpbmFyeS1pbnRzL2luZGV4Lmh0bWw+DQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUN CiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3 ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNj aG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5 dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHls bC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of December 28, 2021 to = January 04, 2022.

A hack for toplevel breakpoints using effect handlers

wiktor announced

I started playing with effect handlers and wondered if they could be used t= o implement toplevel breakpoints. It's a big hack and probably unsound at the moment, but it works and here's an exa= mple interaction:

let arr =3D
  let fact n =
=3D
    let arr =3D Array=
.make (n+1) 1 in<=
/span>
    let rec loop i =3D
      if i <=3D n then begin
        Break.break ["i", i; "arr", arr];
        arr.(i) <- arr.(i-1) * i;
        loop (i+1)
      end
    in
    (loop 1; arr)
  in
    fact 5;;
# (* We hit a breakpoint and obtain the continuation k *)
  k ();;
- : bool =3D true
# (* the bools are leaking from the execute_phrase function
   * inside the toplevel *)
  k ();;
- : bool =3D true
# i;;
- : int =3D 3
# arr;;
- : int array =3D [|1; 1; 2; 1; 1; 1|]
# (* let's disturb the computation of factorials *)
  arr.(i-1) <- 42;;
- : unit =3D ()
# k ();;
- : bool =3D true
# (* btw: here the user is like a scheduler for yield-based async *)
  k ();;
- : bool =3D true
# k ();;
val arr : int array =3D [|1; 1; 42; 126; 504; 2520|]
- : bool =3D true

Currently I don't try to clean up bindings or values, which is a source of = unsoundness. After the last k () we got two results: First the computation of let arr ... finished, an= d then the computation of k () finished. But k is a part of the execution of let arr ..., so these two execution= s "intersect" without one being contained in the other. This makes the question of what should the current variable bindings= be complicated. Setting the bindings at end of execution is futile, when a continuation may in such a way leak bind= ings from breakpoint time.

Possibly a stack discipline for the execution of phrases is required to mak= e the environments behave properly: at the end of executing a phrase we cancel (with another effect, maybe) other exec= utions which "depend" on the current execution (evaluate the k obtained from a breakpoint in the cu= rrent execution). This should eliminate these "intersections" and we could throw out the bindings added by the cancelled = executions.

I haven't tried anything with polymorphism yet, but type variables should p= robably be changed into abstract types inside the binders.

Here's the code: https://github.com/ocaml-multicore/ocaml/compa= re/multicore-pr...wiktorkuchta:toplevel-break

wiktor later said

Well, this might have been unnecessary, as most of it can be done properly = in userspace (with more syntactic overhead).

open EffectHandlers
open Deep

type ('a, 'b) res =3D
  | Bp of 'a * ((unit, ('a, 'b) res) continua=
tion)
  | Fin <=
span style=3D"color: #a020f0;">of 'b

module type P1 =3D sig  val i : int  val arr : int array end
type payload =3D P1 of=
 (module P1)
type _ eff +=3D Break : payload -> unit eff

let arr () =3D
  let fact n =
=3D
    let arr =3D Array=
.make (n+1) 1 in<=
/span>
    let rec loop i =3D
      if i <=3D n then begin
        perform (Break (P=
1 (module =
struct let i =3D i =
let arr =3D arr end)));
        arr.(i) <- arr.(i-1) * i;
        loop (i+1)
      end
    in
    (loop 1; arr)
  in
    fact 5;;

let with_break th =3D
  try_with (fun () -> Fin (th ())) ()
  { effc =3D fun (type a) (e : a eff<=
/span>) ->
      match e with
      | Break p -> Som=
e (fun (k : (a,_) continuation) -> Bp (p, k))
      | _ -> =
None }

let cont =3D functi=
on
  | Bp (_=
, k) -> continue k ()
  | Fin _=
 -> failwith "computation finished, cannot continue"

let get =3D functio=
n
  | Bp (r=
, _) -> r
  | Fin _=
 -> failwith "computation finished, no breakpoint payload"

let get1 r =
=3D match get r with P1 m -> m
# let r =3D with_break a=
rr;;
val r : (payload, int array) res =3D Bp (P1 <module>, <abstr>)
# open (val get1 r);;
val i : int =3D 1
val arr : int array =3D [|1; 1; 1; 1; 1; 1|]

The main pain point is having to define the payload types. In basic cases t= he payload type could be just a simple polymorphic variant. It would be nice if it could be completely inferred, b= ut it's unlikely as `Break` has to have a statically known argument.

With a bit of help from tooling (ppxes for code generation and shorthands i= n the toplevel), this could be better than printf debugging.

Guillaume Munch-Maccagnoni then said

This is an interesting experiment.

  • This reminds me of the idea of high-level stack inspection for debuggin= g and security (articulated for instance in Clements' PhD thesis Portable and high-level access to the stack with Continuati= on Marks; here's another more recent paper from the Racket people that might= be relevant). One can ask whether a PPX can provide high-level stack inspe= ction or if one needs support from the compiler for that. It's nice to expe= riment.
  • A few years ago someone asked whether there could be a use to untyped a= lgebraic effects in OCaml (in the sense that they do not appear in the effe= ct annotation in function types). I proposed debugging as an example. Someo= ne suggested that it is not too hard to adapt the interface types of all fu= nctions in the call chain to add the appropriate effect annotation (and rem= ove it afterwards), but I was not convinced.

Multi-shot continuations gone forever?

cyberpink asked

What happens with multi-shot continuations now that Obj.clone_continuation = was removed? (ht= tps://github.com/ocaml-multicore/ocaml-multicore/pull/651)

Anything that requires a "fork" operation, like say, a probabilistic progra= mming EDSL, needs this. None of the old examples I've looked at like Delimcc on top of effects have been updated to use a new method, and I haven't been able to find any hints of one.

Are multi-shot continuations just not possible now? Are there plans to add = something equivalent back in later?

Nicol=C3=A1s Ojeda B=C3=A4r replied

Yes, multi-shot continuations are gone and is unlikely that they will find = their way back any time soon. One (good) reason is explained in h= ttps://dl.acm.org/doi/10.1145/3434314 :

3D"8d26520ef0f7=

and

3D"b28fa14f9673=

Guillaume Munch-Maccagnoni then said

I think the question still stands. You cut the sentence =E2=80=9C_Extending= our system with multi-shot continuations is future work (=C2=A78)_=E2=80=9D. Also the paper is about a particular model= based on separation logic rather than OCaml itself (for instance the authors also mention that their continuations are affine = instead of linear unlike in OCaml multicore).

Nevertheless, the multicore designers were aware that duplicating continuat= ions makes it complicated to reason about resources. The topic of mixing continuations and linearity has been better = studied from the angle of algebraic models of computation and proof theory. Essentially, with an effect system you cou= ld ensure that certain kinds of effects do not happen in the delimited part of the program (including allocating a res= ource), which controls copiability of the stack from the point of view of reasoning about the program. This is inspir= ed by some logics that mix classical and intuitionistic or linear logic. From this angle the ability to copy a conti= nuation would be restricted to a sub-part of the language which is pure to some degree. This should also be a suitabl= e starting point if one wanted to develop a program logic to formalise the reasoning about such programs.

However according to #651 there were more technical reasons to drop clone_continuation, such as breaking compiler = optimizations. I am curious as well to know whether there are plans to reintroduce clone_continuation at some poin= t, but obviously this would require some effort.

KC Sivaramakrishnan said

@nojb and @gadmm have already answered why we've dropped support for = clone_continuation now. We will need to track the copiability of the continuation in the continuation type and compiler o= ptimisations also need to be made aware of the possibility of copying. Given the pervasive nature of its effects, ther= e are no immediate plans to bring the feature back. We will have to come back to this after we have typed effects.

Anything that requires a =E2=80=9Cfork=E2=80=9D operation, like say, a prob= abilistic programming EDSL

One can get pretty far with PPL with just one-shot continuations. My studen= t and I did some experiments building a DSL for a PPL to learn about the space: https://github.com/Arnhav-Datar/EffPPL. Having spoken t= o PPL experts there are indeed some usecases where multi-shot continuations are useful, but fro= m what I understand, the one-shotness isn't a blocker for PPL.

I would be interested in collecting usecases where multi-shot continuations= are absolutely necessary.

gasche then said

Interesting!

My (probably naive) mental model of HANSEI-style libraries, using multishot= continuations, is that they are extensions/generalization of a non-probabilistic "logic/non-deterministic m= onad" that searches for the set of solutions to a problem. Multishot continuations are naturally used in non-d= eterministic computations at backtracking points, to explore different search directions and collect the result. It i= s possible to avoid multishot continuations by replaying the whole search from the start each time (refer= ence: Capturing the future by = replaying the past), but this involves duplicated computations so it is less effi= cient (reference: Asymptotic speedup= with first-class control).

Can you give some intuition of how other approaches to probalistic inferenc= e work, that do not require multishot continuations? Are they also duplicating computations, or are they using a = magic trick to avoid this issue with a different inference algorithm?

I tried to find an answer to this question by reading the internship report, but I couldn't locate an answer. (The report mentions HANSEI in the related work, but it does not discuss this qu= estion.) The report explains that the inference algorithm, called HMC (Hamiltonian Monte Carlo), uses automatic d= ifferenciation; so it uses a sort of symbolic manipulation / analysis of the probabilistic program to sample. Bu= t does this avoid repeated computations? It may be the case instead that the differential is as large or larger than= the program itself, and that the search algorithm using this differential in effect perform a program-sized computa= tion at each search step, duplicating computations.

Sadiq said

Not a PPL but I've been hacking on a little effects-based model checker for= concurrent data structures that implements dynamic partial order reduction (https://github.com/sadiqj/dscheck/ - a WIP!). Multi-sho= t continuations would have been very useful.

I ended up implementing something that involves maintaining a schedule and = repeatedly replaying the computation. It looks very similar to what Cap= turing the future.. proposes.

New release of Menhir (20211230)

Fran=C3=A7ois Pottier announced

Dear OCaml & Menhir users,

I am pleased to announce a new release of Menhir, with a major improvement.

The code back-end has been rewritten from the ground up by =C3=89mile Troti= gnon and by myself, and now produces efficient and well-typed OCaml code. The infamous Obj.magic is not used any more.

Furthermore, the new code back-end produces code that is more aggressively optimized, leading to a significant reduction in memory allocation and a typical performance improvement of up to 20% compared to the previous code back-end.

opam update
opam install menhir.20211230

Happy well-typed parsing in 2022!

2021/12/30

  • The code back-end has been rewritten from the ground up by =C3=89mile Troti= gnon and Fran=C3=A7ois Pottier, and now produces efficient and well-typed= OCaml code. The infamous Obj.magic is not used any more.

    The table back-end and the Coq back-end are unaffected by this change.

    The main side effects of this change are as follows:

    • The code back-end now needs type information. This means that
      either Menhir's type inference mechanism must be enabled (the easiest way of enabling it is to use Menhir via dune and to check that the dune-project file says (using menhir 2.0) or later)
      or the type of every nonterminal symbol must be explicitly given via a %type declaration.
    • The code back-end no longer allows the type of any symbol to be an open polymorphic variant type, such as [> `A ]. As a workar= ound, we suggest using a closed polymorphic variant instead.
    • The code back-end now adheres to the simplified error-handling strat= egy, as opposed to the legacy strategy.

      For grammars that do not use the error token, this make= s no difference.

      For grammars that use the error token in the limited way permi= tted by the simplified strategy, this makes no difference either. The simplified strategy makes the following requirement: the error token shou= ld always appear at the end of a production, whose semantic action should abort the parser by raising an exception.

      Grammars that make more complex use of the error token, and th= erefore need the legacy strategy, cannot be compiled by the new code b= ack-end. As a workaround, it is possible to switch to the table back-end (using --table --strategy legacy) or to the ancient code back-end (us= ing --code-ancient). In the long run, we recommend abandoning t= he use of the error token. Support for the error token = may be removed entirely at some point in the future.

    The original code back-end, which has been around since the early days of Menhir (2005), temporarily remains available (using --code-ancient). It will be removed at some point in the future.

    The new code back-end offers several levels of optimization, which remain undocumented and are subject to change in the future. At present, the main levels are roughly as follows:

    • -O 0 --represent-everything uses a uniform representation = of the stack and produces straightforward code.
    • -O 0 uses a non-uniform representation of the stack; some = stack cells have fewer fields; some stack cells disappear altogether.
    • -O 1 reduces memory traffic by moving PUSH op= erations so that they meet POP operations and cancel out.
    • -O 2 optimizes the reduction of unit productions (that is,= productions whose right-hand side has length 1) by performing a limited amount of code specialization.

    The default level of optimization is the maximum level, -O 2.

  • The new command line switch --exn-carries-state causes the= exception Error to carry an integer parameter: exception Error of = int. When the parser detects a syntax error, the number of the current state is reported in this way. This allows the caller to select a suitable syntax error message, along the lines described in Sect= ion 11 of the manual. This command line switch is currently supported by the code back-end only.
  • The $syntaxerror keyword is no longer supported.
  • Document the trick of wrapping module aliases in open struct ... = end, like this: %{ open struct module alias M =3D MyLongModuleName end %}<= /code>. This allows you to use the short name M in your grammar, but f= orces OCaml to infer types that refer to the long name MyLongModuleName. (Suggested by Fr=C3=A9d=C3=A9ric Bour.)

Improved documentation for Fix

Fran=C3=A7ois Pottier announced

My last contribution for 2021 is an improved documentation for Fix, a libra= ry that helps with various algorithmic constructions that involve memoization, recursion, and numbering.

The documentation can be viewed online.

It can also be viewed locally (on your own machine) as follows:

opam update
opam install fix.20211231
opam install odig
odig odoc                 # this may take some time
odig doc fix              # this opens the doc in your browser

Happy fix'in' in 2022!

pp-binary-ints 0.1.1

Ifaz Kabir announced

Tired of printing octals and hexadecimals and then mentally converting them= to bits. Ever wanted to just see the bits in an int? Now you can!

Just run opam install pp-binary-ints and off you go:

# Pp_binary_in=
ts.Int.to_string 0b10101001;;
- : string =3D "10101001"

You can find the documentation for the project and more examples of how to = use it here.

The library is very customizable.

  • You can choose to print with 0b prefixes and _ separators.
  • You can choose to print zeros just like the non-zeros, with prefixes an= d separators.
  • If you use zero padding, you can control how many leading zeros show up= with the ~min_width argument.
  • It correctly handles the edge cases when adding _ separato= rs: you won=E2=80=99t get leading underscores.
  • It includes pretty printers that work with Format and Fmt , not just to_string functions.
  • Supports int, int32, int64, and = nativeint.
  • Don't like the default prefixes and suffixes? Customize the prefixes an= d suffixes with the provided functor.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 1D9B1E008D for ; Tue, 11 Jan 2022 09:21:08 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=2ij7=R3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1" IronPort-PHdr: =?us-ascii?q?A9a23=3ASaXoIhwy1r3omizXCzKkzFBlVkEcU1XcAAcZ59I?= =?us-ascii?q?dhq5Udez7ptK+ZhWZvKg0xw6RFazgqNt8w9LMtK7hXWFSqb2gi1slNKJ2ahkel?= =?us-ascii?q?M8NlBYhCsPWQWfyLfrtcjBoVJ8aDAwt8H60K1VaF9jjbFPOvHKy8SQSGhLiPgZ?= =?us-ascii?q?pO+j5AIHfg9qq2+yo5pHeYxhEiDW5bL9uMR67sRjfus4KjIV4N60/0AHJonxGe?= =?us-ascii?q?+RXwWNnO1eelAvi68mz4ZBu7T1et+ou+MBcX6r6eb84TaFDAzQ9L281/szrugL?= =?us-ascii?q?dQgaJ+3ART38ZkhtMAwjC8RH6QpL8uTb0u+ZhxCWXO9D9QrcpVzS/9KdrUAHnh?= =?us-ascii?q?zsbNzA392HXj9Z/jKNdoBm8oxByzIrZbISTOfZ+fa3de80aRWtaXsZQTCNBBp2?= =?us-ascii?q?zZJYBDuoGJ+ZXspL9rEYKoRawGQWgAeXiwSJKiHDrx603y+QvHx/b0gIuHNwBv?= =?us-ascii?q?2jboc7vO6sOS+241rXEwSnBYv5QxDzz6JLIchckofyUQb9wddDeyU8yHA3Yklq?= =?us-ascii?q?QqYnlPzKJ1uQRrmOW6PBvVea1hG4hsQ1xuSSgxscpionImoIV1kvJ9T1+wIYxJ?= =?us-ascii?q?dy4VFB0bsKkEJtWtiGaLpZ2Td04T2FvoiY6xaQLtJimdycF1Jop3QTQa+Cbc4e?= =?us-ascii?q?W+BLjUv6cLzhkiH54d7yzmgi//FauxOD8WcS50lhEojdbn9fMqH0A2ALe58qZR?= =?us-ascii?q?/Zg/Eqs2TWC2gTd5+9LPE06laTVJ4I9zrM2i5Edv0PDHirsl0X3iq+bbl0k9fa?= =?us-ascii?q?06+TmfrXpuIecN4hxigH7LKsigMq/DvokMgQWWGiU5f6z1Ljn/UHjR7VKlPI2n?= =?us-ascii?q?rHYsJDcP8Qbp7S2DxVb0oY58xq/ADam0MgYnXkaN11JYg6Ij4/sO13WL/D4DOu?= =?us-ascii?q?/g1SxkDhw3fzGP7rhDo3MLnfdjLfhc6xx60lGyAo81dxf5o9bC7EFIPL3QEPxs?= =?us-ascii?q?8bYDhA/PgepwOjnEM1w2p4AVW+LGKOVLb/evFCS6u8hP+WAfoEYtTnlJ/Q46fP?= =?us-ascii?q?ikGU1lUEdcKSmx5cbdWy0Eu57L0ibfXbhhMoKH30QsQokVuPqjUWPUT5NaHa2W?= =?us-ascii?q?KIx/jQ7CY27AYvZXoCth7iB3SenHpJIem9GClaMEXbxd4WZRfgAciWSItVukjA?= =?us-ascii?q?cVLihTZEu1Q22uQPn1bZqKvDY9jAEuZ/sztR46fHfmQs8+DF7F8id1nuCT2Bwn?= =?us-ascii?q?mMGXT8226V/rFRgxFmfzKZ0n+RVGcJS5/NLUAo3LYLSwuJiBtDqXQLBeteISEq?= =?us-ascii?q?4Tdq6ATExSNMxw8YTY0ljAdmiiQrD3yWyDrAPk7yEHpo0/rjH33ftJ8Z9znfG1?= =?us-ascii?q?LU9j1Q9WcRPMnCmhqhj+AfNHI7FiUCZmqmldKgG2y7N7miDwXKUvE5ESA5wTbn?= =?us-ascii?q?FXXcHa0TKt9v540fCQ6aqCbQmKQtB1dWPKrBKa93slVVJXu3vONXYY2Krmme/H?= =?us-ascii?q?wyExr2WbNmiR2JIliHCDgJMxwQM+16CKg54ACq99SaWRjdxExinKxfn7u9WrHK?= =?us-ascii?q?gUlRyzg2ba0kn0KC6rFpdjvWZT7YX36kYkCYnsTR9WlinjPzMDN/Vjg5oeu1na?= =?us-ascii?q?tM44UtbnTbQswV7eIerL6VjmkI2awNzrl/j3BVxC5xdnI4ttnx8n1k6Er6RzF4?= =?us-ascii?q?UL2DQ5pv3ILCCdTiaFPWHc6nSy03T29aQ+74S5bI/sVqx5WlB+WIo9Ghh2NROl?= =?us-ascii?q?X7A9tPNFgVACPoZs24y50E8v7beczUw7IPS1GRxPO+zqDCQgroU?= IronPort-Data: =?us-ascii?q?A9a23=3APhiau6qpbyJCO75k+ZFNn/dpENleBmI8ZBIvgKr?= =?us-ascii?q?LsJaIsI5as4F+vmAaX2zQPP2OYWL3fN9/bYyzph8OsZfdm9YxHFA+pC02Zn8b8?= =?us-ascii?q?sCt6faxfh6hZXvKRiHgZBs6tJtGMoGowPjZ/xYwnz/1WlTahSQ6hfHgqobUUra?= =?us-ascii?q?eYHgoHFY8EU/NtDo68wIHqt4w6TSGK1jV0T/Ci5W31G6Ng1aYAEpMg06wgE8HU?= =?us-ascii?q?MDJhd8tlgdWicanE7PpvyJ94Jo3fcldJpZjK2VeNrbSq+3rlNlV8o5FlirBBO9?= =?us-ascii?q?Jkp6jGqELarvCZE6WjX5HR6Wpgh5DvzE/lKEhO5Lwa28O0WTPxogtjo4V88fsI?= =?us-ascii?q?esqFvWkdOA1aCNjS3QkPK8ZrYWcdGC4td2PwkbGdXr13vgoC1s5aIQc8+AxGmp?= =?us-ascii?q?O8P0ENBgHaQ2FjO+thrfnWq9rnMtLwMzDZd9O5ygwkW6x4fEOG8mZHPWbv7e0x?= =?us-ascii?q?gwYjclLGbPaZtEFQSF+aQzJJRxJIFYeTpwk9NpELFHrK2gD7g+B/P9vpTDHllk?= =?us-ascii?q?pluKwboTBIYnSA5hBwROxuETt+kLVAjU7Pfqj0xyRqyr53quXiUsXQ6oXBOT+7?= =?us-ascii?q?vlukUGezWwVCQQLWB28u/bRt6J3YPoHQ2R8x8bkhfFaGI2XotjBs9mQpW7d+AY?= =?us-ascii?q?bX8tMHuY67gCU16eS5ByWboTBZiAUc8Qo7afaWhRzvmJlXfuwbdCsjFFRYXia6?= =?us-ascii?q?7GfoCj0PHQFa2gYakfoiCMe+9e55tlbYg3nF75e/W3csjExMSn3xyGWoSM+gbQ?= =?us-ascii?q?KkMNN0L+0lbwCqym0qMKPFmbZ+S2ONl+YAshFiEJJqmBmBZU3LRqNEWpBcmS8g?= =?us-ascii?q?Q=3D=3D?= IronPort-HdrOrdr: =?us-ascii?q?A9a23=3AOiGPd6tWbb6nEw29vuPpoy9n7skDcdV00zEX?= =?us-ascii?q?/kB9WHVpm62j9/xG88516faZslwssRIb+OxoWpPvfZq0z/ccirX5Vo3PYOCJgg?= =?us-ascii?q?aVBbAnxbSn6TztES/z+4dmpMRdWpk7Lsb/SXxzjcOS2njcLz/M+qjkzJyV?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: =?us-ascii?q?A0CdAgAoPd1hhyIeaIFaFoNtgR8BZFc6M?= =?us-ascii?q?YRHiQOFRQElgiWDKYYgjwaFJgECTw0DAQMBDSoBDgUBAgQBAYUABAICFzoBBIJ?= =?us-ascii?q?sAh4GAQUzEwECBBUBAQUBAQECAQMDBAETAQEBAQ0LDgg0IoVoDYIiEwwMAwODd?= =?us-ascii?q?wEYCQplIwMUAQYDAgQNARcBFAoXARIagmQBgxYFCkKQV5pBBTyBCoExgQGDTgE?= =?us-ascii?q?DBwcCAxglAYNzgWQNAhQVaxeGDFRKAYJ/CYN9KRCBVUSECAduglgLAQEBAQGBO?= =?us-ascii?q?wEBVoJiF4JOBJAFDjgGLhAPDAszIgEBIDAIIwoLCBwZGwMNBQYCDgwTFgItkWg?= =?us-ascii?q?fJZdolAN6NAeDRoE2BguIFYEcjGuIHINwgUqKP5Ejhk8hlhkggiSGaQIIgQQJg?= =?us-ascii?q?j+UIASFMIFOKoFMAR0MBzMaMEMNBg2CFQEBMgkKVw+SEYE+gSaBdTuFS0AzAgE?= =?us-ascii?q?BNAIGAQoBAQMJhWMBAQUTCwGHMAEB?= X-IPAS-Result: =?us-ascii?q?A0CdAgAoPd1hhyIeaIFaFoNtgR8BZFc6MYRHiQOFRQElgiW?= =?us-ascii?q?DKYYgjwaFJgECTw0DAQMBDSoBDgUBAgQBAYUABAICFzoBBIJsAh4GAQUzEwECB?= =?us-ascii?q?BUBAQUBAQECAQMDBAETAQEBAQ0LDgg0IoVoDYIiEwwMAwODdwEYCQplIwMUAQY?= =?us-ascii?q?DAgQNARcBFAoXARIagmQBgxYFCkKQV5pBBTyBCoExgQGDTgEDBwcCAxglAYNzg?= =?us-ascii?q?WQNAhQVaxeGDFRKAYJ/CYN9KRCBVUSECAduglgLAQEBAQGBOwEBVoJiF4JOBJA?= =?us-ascii?q?FDjgGLhAPDAszIgEBIDAIIwoLCBwZGwMNBQYCDgwTFgItkWgfJZdolAN6NAeDR?= =?us-ascii?q?oE2BguIFYEcjGuIHINwgUqKP5Ejhk8hlhkggiSGaQIIgQQJgj+UIASFMIFOKoF?= =?us-ascii?q?MAR0MBzMaMEMNBg2CFQEBMgkKVw+SEYE+gSaBdTuFS0AzAgEBNAIGAQoBAQMJh?= =?us-ascii?q?WMBAQUTCwGHMAEB?= X-IronPort-AV: E=Sophos;i="5.88,279,1635199200"; d="scan'208,217";a="14951847" X-MGA-submission: =?us-ascii?q?MDGhE1g42UelZFLLWmIMRhnAnOnJyi7yZPY2Nn?= =?us-ascii?q?rmYlwBvWFzoLWQXYVBOINPRwt8VNn57M+3ZiSjtJzGW/sy430xvPALXw?= =?us-ascii?q?jAuH4baJM1h8pScJ8RdMQtz/YXxDCn2br8VmAXM9yTjiFYLwnyx+Y+3q?= =?us-ascii?q?pFP1L/x0Ty2gN5vvvT8D1dBA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/DHE-RSA-AES256-GCM-SHA384; 11 Jan 2022 09:21:05 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BED98564770; Tue, 11 Jan 2022 09:21:03 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 11 Jan 2022 09:20:43 +0100 Message-ID: <87a6g2el9g.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 11 09:21:04 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.002054, queueID=130F7564771 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAwNCB0byAxMSwNCjIwMjIuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTmV3IHJl bGVhc2Ugb2YgUFByaW50ICgyMDIyMDEwMykNCkJvZ3VlLCB0aGUgT0NhbWwgR1VJDQpDb2h0dHAg NS4wLjAgYW5kIDIuNS42DQpNdWx0aWNvcmUgT0NhbWw6IERlY2VtYmVyIDIwMjEgYW5kIHRoZSBC aWcgUFINClNldCB1cCBPQ2FtbCAyLjAuMC1iZXRhMTINCk9sZCBDV04NCg0KDQpOZXcgcmVsZWFz ZSBvZiBQUHJpbnQgKDIwMjIwMTAzKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t bmV3LXJlbGVhc2Utb2YtcHByaW50LTIwMjIwMTAzLzkwOTcvMT4NCg0KDQpGcmFuw6dvaXMgUG90 dGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0 byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIFBQcmludCwgdGhlIHByZXR0eS1wcmludGluZw0K ICBsaWJyYXJ5LCB3aXRoIFtpbXByb3ZlZCBkb2N1bWVudGF0aW9uXS4NCg0KICBUaGUgZG9jdW1l bnRhdGlvbiBjYW4gYWxzbyBiZSB2aWV3ZWQgb2ZmbGluZToNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwgcHByaW50LjIwMjIwMTAzDQog IOKUgiBvcGFtIGluc3RhbGwgb2RpZw0KICDilIIgb2RpZyBvZG9jICAgICAgICAgICAgICAgICAj IHRoaXMgbWF5IHRha2Ugc29tZSB0aW1lDQogIOKUgiBvZGlnIGRvYyBwcHJpbnQgICAgICAgICAg ICMgdGhpcyBvcGVucyB0aGUgZG9jIGluIHlvdXIgYnJvd3Nlcg0KICDilJTilIDilIDilIDilIAN Cg0KICBIYXBweSBwcmV0dHktcHJpbnRpbmchDQoNCg0KW2ltcHJvdmVkIGRvY3VtZW50YXRpb25d DQo8aHR0cDovL2NhbWJpdW0uaW5yaWEuZnIvfmZwb3R0aWVyL3BwcmludC9kb2MvcHByaW50Lz4N Cg0KDQpCb2d1ZSwgdGhlIE9DYW1sIEdVSQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tYm9ndWUtdGhlLW9jYW1sLWd1aS85MDk5LzE+DQoNCg0Kc2Fu ZXR0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEknbSBoYXBweSB0byBhbm5vdW5jZSBhIGJyYW5kIG5ldyB2ZXJzaW9u IG9mIFtCb2d1ZV0sIGEgR1VJIChHcmFwaGljYWwNCiAgVXNlciBJbnRlcmZhY2UpIGxpYnJhcnkg ZW50aXJlbHkgd3JpdHRlbiBpbiBgb2NhbWwnLCB1c2luZyBTREwyIGZvcg0KICBoYXJkd2FyZSBh Y2NlbGVyYXRlZCBncmFwaGljcy4NCg0KICBUaGUgZG9jIGNhbiBiZSBmb3VuZCBbaGVyZV0sIGl0 IHdpbGwgYmUgZW5yaWNoZWQgb3ZlciB0aW1lLg0KDQogIEluc3RhbGwgd2l0aCBgb3BhbSBpbnN0 YWxsIGJvZ3VlJw0KDQogIEluIGFkZGl0aW9uIHRvIHRoZSBsaWJyYXJ5LCB0aGlzIGluc3RhbGxz IGFuIGV4ZWN1dGFibGUgYGJvZ3VleCcgdG8NCiAgc2hvd2Nhc2UgYWJvdXQgNTAgdXNlZnVsIGNv bnN0cnVjdGlvbnMsIHNlZSBgYm9ndWV4IC1oJyBmb3IgdGhlIGxpc3QuDQoNCiAgU29tZSBzY3Jl ZW5zaG90cyBvZiBhIGRlbW8gY29tcGlsZWQgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb246DQoNCiAg PGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwv b3JpZ2luYWwvMlgvNi82MTlhNmIzYzVkN2E5ODYwZTRjMjRkZjdkOGI5MzE4MTVlOWI5NWExLnBu Zz4NCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fk cy9vY2FtbC9vcmlnaW5hbC8yWC8zLzNlNWUwNGQxZGIwMDIyZDQwNzBiN2ZkM2RhYjQ1ZjQzOTk4 MjhlOTAucG5nPg0KDQogIE5vdGUgdGhhdCBtYW55IHdpZGdldHMgYXJlIG5vdCBzaG93biBpbiB0 aGlzIGRlbW86IHRhYmxlcywgbWVudXMsDQogIGRyb3AtZG93biBzZWxlY3QgbGlzdHMsIGtub2Ig YnV0dG9ucyzigKYgSSB3aWxsIGFkZCBtb3JlIGltYWdlcyB0byB0aGUNCiAgZG9jIHdoZW4gSSBo YXZlIHNvbWUgdGltZSENCg0KDQpbQm9ndWVdIDxodHRwczovL2dpdGh1Yi5jb20vc2FuZXR0ZS9i b2d1ZT4NCg0KW2hlcmVdIDxodHRwOi8vc2FuZXR0ZS5naXRodWIuaW8vYm9ndWUvUHJpbmNpcGxl cy5odG1sPg0KDQoNCkNvaHR0cCA1LjAuMCBhbmQgMi41LjYNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvaHR0cC01LTAtMC1hbmQt Mi01LTYvOTEwOS8xPg0KDQoNCk1hcmNlbGxvIFNlcmkgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBXZSBhcmUgZ2xhZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiB2ZXJzaW9uIFs1LjAu MF0gYW5kIFsyLjUuNl0gb2YNCiAgY29odHRwIGFuZCBpdHMgZGVwZW5kZW50IHBhY2thZ2VzLg0K DQogIFRoZSBsYXR0ZXIgaXMgYSBidWcgZml4IHJlbGVhc2UgdGhhdCBpbiBwYXJ0aWN1bGFyIGJh Y2twb3J0cyB0aGUNCiAgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSB1cGNvbWluZyByZWxlYXNlIDAu MTUgb2YgY29yZSBhbmQgYXN5bmMuDQoNCiAgVGhlIGZpcnN0IGludHJvZHVjZXMgdGhlIGJyZWFr aW5nIGNoYW5nZXMgW2Fubm91bmNlZCBpbiB0aGUgcHJldmlvdXMNCiAgcmVsZWFzZV0uIEkgYXBw ZW5kIHRoZSBjaGFuZ2Vsb2cgYmVsb3csIHdoaWNoIGV4cGxhaW5zIGluIGRldGFpbHMgdGhlDQog IGNoYW5nZXMgYW5kIGVtcGhhc2l6ZXMgdGhlIGJyZWFraW5nIGNoYW5nZXM6DQoNCg0KWzUuMC4w XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yMDI0NiNp c3N1ZS0xMDgwOTg2NTEwPg0KDQpbMi41LjZdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0tcmVwb3NpdG9yeS9wdWxsLzIwMjQ1I2lzc3VlLTEwODA4MjIyMTU+DQoNClthbm5vdW5jZWQg aW4gdGhlIHByZXZpb3VzIHJlbGVhc2VdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1yZWxlYXNlLW9mLWNvaHR0cC00LTAtMC83NTM3Pg0KDQpDb2h0dHAuSGVhZGVyOiBuZXcgaW1w bGVtZW50YXRpb24gKGx5cm0gIzc0NykNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBO ZXcgaW1wbGVtZW50YXRpb24gb2YgSGVhZGVyIG1vZHVsZXMgdXNpbmcgYW4gYXNzb2NpYXRpdmUg bGlzdA0KICAgIGluc3RlYWQgb2YgYSBtYXAsIHdpdGggb25lIG1ham9yIHNlbWFudGljIGNoYW5n ZSAoZnVuY3Rpb24gYGdldCcsDQogICAgc2VlIGJlbG93KSwgYW5kIHNvbWUgbmV3IGZ1bmN0aW9u cyAoYGNsZWFuX2R1cCcsIGBnZXRfbXVsdGlfY29uY2F0JykNCiAg4oCiIE1vcmUgQWxjb3Rlc3Qg dGVzdHMgYXMgd2VsbCBhcyBmdXp6aW5nIHRlc3RzIGZvciB0aGlzIHBhcnRpY3VsYXINCiAgICBt b2R1bGUuDQoNCg0KUHVycG9zZQ0K4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgVGhlIG5ldyBo ZWFkZXIgaW1wbGVtZW50YXRpb24gdXNlcyBhbiBhc3NvY2lhdGl2ZSBsaXN0IGluc3RlYWQgb2Yg YQ0KICBtYXAgdG8gcmVwcmVzZW50IGhlYWRlcnMgYW5kIGlzIGZvY3VzZWQgb24gcHJlZGljdGFi aWxpdHkgYW5kDQogIGludHVpdGl2aXR5OiBleGNlcHQgZm9yIHNvbWUgc3BlY2lmaWMgYW5kIGRv Y3VtZW50ZWQgZnVuY3Rpb25zLCB0aGUNCiAgaGVhZGVycyBhcmUgYWx3YXlzIGtlcHQgaW4gdHJh bnNtaXNzaW9uIG9yZGVyLCB3aGljaCBtYWtlcyBkZWJ1Z2dpbmcNCiAgZWFzaWVyIGFuZCBpcyBh bHNvIGltcG9ydGFudCBmb3IgW1JGQzcyMzDCpzMuMi4yXSB0aGF0IHN0YXRlcyB0aGF0DQogIG11 bHRpcGxlIHZhbHVlcyBvZiBhIGhlYWRlciBtdXN0IGJlIGtlcHQgaW4gb3JkZXIuDQoNCiAgQWxz bywgdG8gZ2V0IGFuIGludHVpdGl2ZSBmdW5jdGlvbiBiZWhhdmlvdXIsIG5vIGV4dHJhIHdvcmsg dG8gZW5mb3JjZQ0KICBSRkNzIGlzIGRvbmUgYnkgdGhlIGJhc2ljIGZ1bmN0aW9ucy4gRm9yIGV4 YW1wbGUsIFJGQzcyMzDCpzMuMi4yDQogIHJlcXVpcmVzIHRoYXQgYSBzZW5kZXIgZG9lcyBub3Qg c2VuZCBtdWx0aXBsZSB2YWx1ZXMgZm9yIGEgbm9uDQogIGxpc3QtdmFsdWUgaGVhZGVyLiBUaGlz IHBhcnRpY3VsYXIgcnVsZSBjb3VsZCByZXF1aXJlIHRoZSBgSGVhZGVyLmFkZCcNCiAgZnVuY3Rp b24gdG8gcmVtb3ZlIHByZXZpb3VzIHZhbHVlcyBvZiBub24tbGlzdC12YWx1ZSBoZWFkZXJzLCB3 aGljaA0KICBtZWFucyBzb21lIGNoYW5nZXMgb2YgdGhlIGhlYWRlcnMgd291bGQgYmUgb3V0IG9m IGNvbnRyb2wgb2YgdGhlDQogIHVzZXIuIFdpdGggdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24s IGFuIHVzZXIgaGFzIHRvIGFjdGl2ZWx5IGNhbGwNCiAgZGVkaWNhdGVkIGZ1bmN0aW9ucyB0byBl bmZvcmNlIHN1Y2ggUkZDcyAoaGVyZSBgSGVhZGVyLmNsZWFuX2R1cCcpLg0KDQoNCltSRkM3MjMw wqczLjIuMl0gPGh0dHBzOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmM3MjMwI3NlY3Rpb24tMy4y LjI+DQoNCg0KU2VtYW50aWMgY2hhbmdlcw0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgVHdvIGZ1bmN0aW9ucyBoYXZlIGEgc2VtYW50aWMgY2hh bmdlIDogYGdldCcgYW5kIGB1cGRhdGUnLg0KDQoNCmdldA0K4pSI4pSI4pSIDQoNCiAgICBgZ2V0 JyB3YXMgcHJldmlvdXNseSBkb2luZyBtb3JlIHRoYW4ganVzdCByZXR1cm5zIHRoZSB2YWx1ZQ0K ICBhc3NvY2lhdGVkIHRvIGEga2V5OyBpdCB3YXMgYWxzbyBjaGVja2luZyBpZiB0aGUgc2VhcmNo ZWQgaGVhZGVyIGNvdWxkDQogIGhhdmUgbXVsdGlwbGUgdmFsdWVzOiBpZiBub3QsIHRoZSBsYXN0 IHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhlIGhlYWRlcg0KICB3YXMgcmV0dXJuZWQ7IG90aGVyd2lz ZSwgYWxsIHRoZSBhc3NvY2lhdGVkIHZhbHVlcyB3ZXJlIGNvbmNhdGVuYXRlZA0KICBhbmQgcmV0 dXJuZWQuIFRoaXMgc2VtYW50aWNzIGRvZXMgbm90IG1hdGNoIHRoZSBnbG9iYWwgaWRlYSBiZWhp bmQgdGhlDQogIG5ldyBoZWFkZXIgaW1wbGVtZW50YXRpb24sIGFuZCB3b3VsZCBhbHNvIGJlIHZl cnkgaW5lZmZpY2llbnQuDQoNCiAg4oGDIFRoZSBuZXcgYGdldCcgZnVuY3Rpb24gb25seSByZXR1 cm5zIHRoZSBsYXN0IHZhbHVlIGFzc29jaWF0ZWQgdG8gdGhlDQogICAgc2VhcmNoZWQgaGVhZGVy Lg0KICDigYMgYGdldF9tdWx0aV9jb25jYXQnIGZ1bmN0aW9uIGhhcyBiZWVuIGFkZGVkIHRvIGdl dCBhIHJlc3VsdCBzaW1pbGFyDQogICAgdG8gdGhlIHByZXZpb3VzIGBnZXQnIGZ1bmN0aW9uLg0K DQoNCnVwZGF0ZQ0K4pSI4pSI4pSI4pSI4pSI4pSIDQoNCiAgYHVwZGF0ZScgaXMgYSBwcmV0dHkg bmV3IGZ1bmN0aW9uICgjNzAzKSBhbmQgY2hhbmdlcyBhcmUgbWlub3IgYW5kDQogIHJlbGF0ZWQg dG8gYGdldCcgc2VtYW50aWMgY2hhbmdlcy4NCg0KICDigYMgYHVwZGF0ZSBoIGsgZicgaXMgbm93 IG1vZGlmeWluZyBvbmx5IHRoZSBsYXN0IG9jY3VycmVuY2VzIG9mIHRoZQ0KICAgIGhlYWRlciBg aycgaW5zdGVhZCBvZiBhbGwgaXRzIG9jY3VycmVuY2VzLg0KICDigYMgYSBuZXcgZnVuY3Rpb24g YHVwZGF0ZV9hbGwnIGZ1bmN0aW9uIGhhcyBiZWVuIGFkZGVkIGFuZCB3b3JrIG9uIGFsbA0KICAg IHRoZSBvY2N1cnJlbmNlcyBvZiB0aGUgdXBkYXRlZCBoZWFkZXIuDQoNCg0KTmV3IGZ1bmN0aW9u cyA6DQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICDi gYMgYGNsZWFuX2R1cCcgZW5hYmxlcyB0aGUgdXNlciB0byBjbGVhbiBoZWFkZXJzIHRoYXQgZm9s bG93cyB0aGUNCiAgICBbUkZDNzIzMMKnMy4yLjJdIChubyBkdXBsaWNhdGUsIGV4Y2VwdCBgc2V0 LWNvb2tpZScpDQogIOKBgyBgZ2V0X211bHRpX2NvbmNhdCcgaGFzIGJlZW4gYWRkZWQgdG8gZ2V0 IGEgcmVzdWx0IHNpbWlsYXIgdG8gdGhlDQogICAgcHJldmlvdXMgYGdldCcgZnVuY3Rpb24uDQoN Cg0KW1JGQzcyMzDCpzMuMi4yXSA8aHR0cHM6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzcyMzAj c2VjdGlvbi0zLjIuMj4NCg0KDQpDb2h0dHAuSGVhZGVyOiBwZXJmb3JtYW5jZSBpbXByb3ZlbWVu dCAobXNlcmksIGFudXJhZ3NvbmkgIzc3OCkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICAgKkJy ZWFraW5nKiB0aGUgaGVhZGVycyBhcmUgbm8tbG9uZ2VyIGxvd2VyY2FzZWQgd2hlbiBwYXJzZWQs IHRoZQ0KICBoZWFkZXJzIGtleSBjb21wYXJpc29uIGlzIGNhc2UgaW5zZW5zaXRpdmUgaW5zdGVh ZC4NCg0KDQpjb2h0dHAtbHd0LXVuaXg6IEFkb3B0IG9jYW1sLWNvbmR1aXQgNS4wLjAgKHNtb3Jp bW90byAjNzg3KQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgKkJyZWFraW5nKiBgQ29uZHVpdF9sd3RfdW5peC5jb25u ZWN0JydzIGBjdHgnIHBhcmFtIHR5cGUgY2hhZ2VkIGZyb20NCiAgIGBjdHgnIHRvIGBjdHggTGF6 eS50Jw0KDQoNCm90aGVyIGNoYW5nZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIOKAoiBjb2h0dHAtbWlyYWdlOiBmaXggZGVwcmVjYXRlZCBmbXQgdXNhZ2Ug KHRtY2dpbGNocmlzdCAjNzgzKQ0KICDigKIgbHd0X2pzb286IFVzZSBsb2dzIGZvciB0aGUgd2Fy bmluZ3MgYW5kIGRvY3VtZW50IGl0IChtc2VyaSAjNzc2KQ0KICDigKIgbHd0OiBVc2UgbG9ncyB0 byB3YXJuIHVzZXJzIGFib3V0IGxlYWtlZCBib2RpZXMgYW5kIGRvY3VtZW50IGl0DQogICAgKG1z ZXJpICM3NzEpDQogIOKAoiBsd3QsIGx3dF91bml4OiBJbXByb3ZlIHVzZSBvZiBsb2dzIGFuZCB0 aGUgZG9jdW1lbnRhdGlvbiwgZml4IGJ1ZyBpbg0KICAgIHRoZSBEZWJ1Zy5lbmFibGVfZGVidWcg ZnVuY3Rpb24gKG1zZXJpICM3NzIpDQogIOKAoiBsd3RfanNvbzogRml4IGV4Y2VwdGlvbiBvbiBj b25uZWN0aW9uIGVycm9ycyBpbiBjaHJvbWUgKG1lZnlsICM3NjEpDQogIOKAoiBsd3RfanNvbzog Rml4IGBMd3Qud2FrZXVwX2V4bicgYEludmFsaWRfYXJnJyBleGNlcHRpb24gd2hlbiBhIGpzDQog ICAgc3RhY2sgb3ZlcmZsb3cgaGFwcGVucyBpbiB0aGUgWEhSIGNvbXBsZXRpb24gaGFuZGxlciAo bWVmeWwgIzc2MikuDQogIOKAoiBsd3RfanNvbzogQWRkIHRlc3Qgc3VpdGUgKG1lZnlsICM3NjQp Lg0KDQogIFdlIHdpc2ggdG8gdGhhbmsgdG8gYWxsIHRoZSB1c2VycyBhbmQgdGhlIGNvbnRyaWJ1 dG9ycyBmb3IgdGhlaXIgaGVscA0KICBsZWFkaW5nIHRvIHRoaXMgcmVsZWFzZS4NCg0KDQpNdWx0 aWNvcmUgT0NhbWw6IERlY2VtYmVyIDIwMjEgYW5kIHRoZSBCaWcgUFINCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbXVs dGljb3JlLW9jYW1sLWRlY2VtYmVyLTIwMjEtYW5kLXRoZS1iaWctcHIvOTExNS8xPg0KDQoNCkFu aWwgTWFkaGF2YXBlZGR5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V2VsY29tZSB0byB0aGUgRGVjZW1iZXIgMjAyMSBbTXVsdGljb3JlIE9DYW1sXSBtb250aGx5IHJl cG9ydCEgIFRoZQ0KICBbcHJldmlvdXMgdXBkYXRlc10gYWxvbmcgd2l0aCB0aGlzIHVwZGF0ZSBo YXZlIGJlZW4gY29tcGlsZWQgYnkNCiAgbXlzZWxmLCBAY3RrMjEsIEBrYXljZWVzcmsgYW5kIEBz aGFrdGhpbWFhbi4NCg0KICBXZWxsLCBpdCdzIGZpbmFsbHkgaGVyZSEgQGtheWNlZXNyayBvcGVu ZWQgdGhlIFtNdWx0aWNvcmUgT0NhbWwNCiAgUFIjMTA4MzFdIHRvIHRoZSBtYWluIE9DYW1sIGRl dmVsb3BtZW50IHJlcG9zaXRvcnkgdGhhdCByZXByZXNlbnRzIHRoZQ0KICAibWluaW11bSB2aWFi bGUiIGltcGxlbWVudGF0aW9uIG9mIG11bHRpY29yZSBPQ2FtbCB0aGF0IHdlIGRlY2lkZWQgb24N CiAgaW4gW05vdmVtYmVyJ3MgY29yZSB0ZWFtIHJldmlld10uICBUaGUgYnJhbmNoIHB1c2hlcyB0 aGUgbGltaXRzIG9mDQogIEdpdEh1YidzIHJlbmRlcmluZyBjYXBhYmlsaXR5LCB3aXRoIGFyb3Vu ZCA0MDAwIGNvbW1pdHMuDQoNCiAgT25jZSB0aGUgUFIgd2FzIG9wZW5lZCBqdXN0IGJlZm9yZSBD aHJpc3RtYXMsIHRoZSByZW1haW5pbmcgZWZmb3J0IGhhcw0KICBiZWVuIGZvciBhIG51bWJlciBv ZiBkZXZlbG9wZXJzIHRvIHBvcmUgb3ZlciBbdGhlIGRpZmZdIGFuZCBsb29rIGZvcg0KICBhbnkg dW5leHBlY3RlZCBjaGFuZ2VzIHRoYXQgY3JlcHQgaW4gZHVyaW5nIG11bHRpY29yZSBkZXZlbG9w bWVudC4gQQ0KICBsYXJnZSBudW1iZXIgb2YgY29kZSBjaGFuZ2VzLCBpbXByb3ZlbWVudHMgYW5k IGZpeGVzIGhhdmUgYmVlbiBtZXJnZWQNCiAgaW50byB0aGUgb2NhbWwtbXVsdGljb3JlIHRyZWVz IHNpbmNlIHRoZSBQUiB3YXMgb3BlbmVkIHRvIGZhY2lsaXRhdGUNCiAgdGhpcyB1cHN0cmVhbWlu ZyBwcm9jZXNzLiBXZSdyZSBleHBlY3RpbmcgdG8gaGF2ZSB0aGUgUFIgbWVyZ2VkIGR1cmluZw0K ICBKYW51YXJ5LCBhbmQgdGhlbiB3aWxsIGNvbnRpbnVlIG9udG8gdGhlICJwb3N0LU1WUCIgdGFz a3MgZGVzY3JpYmVkDQogIGxhc3QgbW9udGgsIGJ1dCB3b3JraW5nIGRpcmVjdGx5IGZyb20gb2Nh bWwvb2NhbWwgZnJvbSBub3cgb24uICBXZQ0KICB0aGVyZWZvcmUgcmVtYWluIG9uIHRyYWNrIHRv IHJlbGVhc2UgT0NhbWwgNS4wMCBpbiAyMDIyLg0KDQogIEluIHRoZSBtdWx0aWNvcmUgZWNvc3lz dGVtLCBwcm9ncmVzcyBhbHNvIGNvbnRpbnVlZDoNCiAg4oCiIGBFaW8nIGNvbnRpbnVlcyB0byBp bXByb3ZlIGFzIHRoZSByZWNvbW1lbmRlZCBlZmZlY3RzLWJhc2VkDQogICAgZGlyZWN0LXN0eWxl IElPIGxpYnJhcnkgdG8gdXNlIHdpdGggTXVsdGljb3JlIE9DYW1sLg0KICDigKIgQSBuZXdlciBg ZG9tYWluc2xpYi4wLjQuMCcgaGFzIGJlZW4gcmVsZWFzZWQgdGhhdCBpbmNsdWRlcyBidWcgZml4 ZXMNCiAgICBhbmQgQVBJIGNoYW5nZXMuDQogIOKAoiBUaGUgY29udGludW91cyBiZW5jaG1hcmtp bmcgcGlwZWxpbmUgd2l0aCBmdXJ0aGVyIGludGVncmF0aW9uDQogICAgZW5oYW5jZW1lbnRzIGJl dHdlZW4gU2FuZG1hcmsgYW5kIGN1cnJlbnQtYmVuY2ggaXMgbWFraW5nIHByb2dyZXNzLg0KDQog IFdlIHdvdWxkIGxpa2UgdG8gYWNrbm93bGVkZ2UgdGhlIGZvbGxvd2luZyBleHRlcm5hbCBjb250 cmlidXRvcnMgYXMNCiAgd2VsbDo6DQoNCiAg4oCiIERhbm55IFdpbGxlbXMgKEBkYW5ueXdpbGxl bXMpIGZvciBhbiBPQ2FtbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUNCiAgICBQaXBwZW5nZXIgYmVu Y2htYXJrIGFuZCByZXBvcnRpbmcgYW4gdW5kZWZpbmVkIGJlaGF2aW91ci4NCiAg4oCiIE1hdHQg UGFsbGlzc2FyZCAoQG1hdHRwYWxsaXNzYXJkKSByZXBvcnRlZCBhbiBpbnN0YWxsYXRpb24gaXNz dWUNCiAgICB3aXRoIGBFaW8nIHdpdGggdmVuZG9yZWQgdXJpbmcuDQogIOKAoiBFZHdpbiBUb3Jv ayAoQGVkd2ludG9yb2spIGZvciBjb250cmlidXRpbmcgYSBQUiB0byBgZG9tYWluc2xpYicgdG8N CiAgICBhbGxvdyB1c2Ugb2YgYSBwZXItY2hhbm5lbCBrZXkuDQoNCiAgQXMgYWx3YXlzLCB0aGUg TXVsdGljb3JlIE9DYW1sIHVwZGF0ZXMgYXJlIGxpc3RlZCBmaXJzdCwgd2hpY2ggY29udGFpbg0K ICB0aGUgdXBzdHJlYW0gZWZmb3J0cywgaW1wcm92ZW1lbnRzLCBmaXhlcywgdGVzdCBzdWl0ZSwg YW5kDQogIGRvY3VtZW50YXRpb24gY2hhbmdlcy4gVGhpcyBpcyBmb2xsb3dlZCBieSB0aGUgZWNv c3lzdGVtIHVwZGF0ZXMgdG8NCiAgYEVpbycsIGBUZXpvcycsIGFuZCBgRG9tYWluc2xpYicuICBU aGUgU2FuZG1hcmssIHNhbmRtYXJrLW5pZ2h0bHkgYW5kDQogIGN1cnJlbnQtYmVuY2ggdGFza3Mg YXJlIGZpbmFsbHkgbGlzdGVkIGZvciB5b3VyIHJlZmVyZW5jZS4NCg0KICAvZWRpdG9y4oCZcyBu b3RlOiBwbGVhc2UgZm9sbG93IHRoZSBhcmNoaXZlIGxpbmsgYWJvdmUgZm9yIHRoZSBmdWxsDQog IGNoYW5nZWxvZy4vDQoNCg0KW011bHRpY29yZSBPQ2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1tdWx0aWNvcmUvb2NhbWwtbXVsdGljb3JlPg0KDQpbcHJldmlvdXMgdXBkYXRlc10gPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL211bHRpY29yZS1tb250aGx5Pg0KDQpbTXVsdGlj b3JlIE9DYW1sIFBSIzEwODMxXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwv MTA4MzE+DQoNCltOb3ZlbWJlcidzIGNvcmUgdGVhbSByZXZpZXddDQo8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L211bHRpY29yZS1vY2FtbC1ub3ZlbWJlci0yMDIxLXdpdGgtcmVzdWx0cy1v Zi1jb2RlLXJldmlldy84OTM0I2NvcmUtdGVhbS1jb2RlLXJldmlldy0xPg0KDQpbdGhlIGRpZmZd IDxodHRwOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwODMxLmRpZmY+DQoNCg0KU3TD qXBoYW5lIExhdmVyZ25lIGFza2VkIGFuZCBSb2JpbiBCasO2cmtsaW4gcmVwbGllZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgVG8gY2xhcmlmeSBmb3Ig cmVsYXRpdmUgbmV3YmllcyBsaWtlIG15c2VsZjogdGhpcyB3b3VsZCBiZQ0KICAgICAgICBhIG5l dyB3YXkgdG8gZG8gY29uY3VycmVudCBJL08sIGxpa2UgQXN5bmMgYW5kIEx3dCwgYnV0DQogICAg ICAgIHVubGlrZSB0aG9zZSwgaXQgd291bGRuJ3QgcmVxdWlyZSB0aGUgdXNlIG9mIGEgcHJvbWlz ZQ0KICAgICAgICBtb25hZD8gSW4gb3RoZXIgd29yZHMsIGRvZXMgdGhpcyBtZWFuIHRoYXQgd2Un bGwgaGF2ZSB0aGUNCiAgICAgICAgY2hvaWNlIGJldHdlZW4gQXN5bmMsIEx3dCBhbmQgRWlvIGlu IHRoZSBuZWFyIGZ1dHVyZSBmb3INCiAgICAgICAgb3VyIGNvbmN1cnJlbnQgSS9PIG5lZWRzPw0K DQogIFRoYXQncyBjb3JyZWN0IGFzIGZhciBhcyBJIGNhbiB0ZWxsLiBUaGlzIHByZXNlbnRhdGlv biBwcm92aWRlcyBhbg0KICBpbnRyb2R1Y3Rpb24gdG8gdGhlIGN1cnJlbnQgc3RhdGUgb2YgZWlv Og0KICA8aHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdmlkZW9zL3dhdGNoLzc0ZWNlMGE4LTM4MGYt NGUyYS1iZWY1LWM2YmI5MDkyYmU4OT4NCg0KDQpTZXQgdXAgT0NhbWwgMi4wLjAtYmV0YTEyDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1zZXQtdXAtb2NhbWwtMi0wLTAtYmV0YTEyLzkxMjMvMT4NCg0KDQpTb3JhIE1v cmltb3RvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkZpeGVkDQrilYzilYzilYzilYzilYwN Cg0KICDigKIgRmFsbGJhY2sgdG8gdGhlIHZlcnNpb24gaW4gd2hpY2ggdGhlIGFzc2V0cyBleGlz dCBpZiBubyBhc3NldHMgZXhpc3QNCiAgICBpbiB0aGUgbGF0ZXN0IG9wYW0gcmVsZWFzZS4NCiAg 4oCiIEluc3RydWN0IEN5Z3dpbiBzZXR1cCB0byB1c2UgInN5cyIgc3ltbGlua3MgZHVyaW5nIHNl dHVwIChwYXJ0aWFsDQogICAgd29ya2Fyb3VuZCBmb3IgYnVnIHdpdGggbmF0aXZlIHN5bWxpbmtz IGluIEN5Z3dpbiBzZXR1cCAtIHNvbWUNCiAgICBkZXBleHRzIG1heSBzdGlsbCBiZSBhZmZlY3Rl ZCkNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL3NldHVwLW9jYW1sL3JlbGVhc2VzL3Rh Zy92Mi4wLjAtYmV0YTEyPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2Vd IGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFy Y2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3Ug YWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNj cmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVz c2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJj aGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+ DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13 ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+ DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 04 to 11, 202= 2.

New release of PPrint (20220103)

Fran=C3=A7ois Pottier announced

I am pleased to announce a new release of PPrint, the pretty-printing libra= ry, with i= mproved documentation.

The documentation can also be viewed offline:

opam update
opam install pprint.20220103
opam install odig
odig odoc                 # this may take some time
odig doc pprint           # this opens the doc in your browser

Happy pretty-printing!

Bogue, the OCaml GUI

sanette announced

I'm happy to announce a brand new version of Bogue, a GUI (Graphical User Interface) library entirely written in ocaml, using SDL2 for h= ardware accelerated graphics.

The doc can be found here, it will be enriched over time.

Install with opam install bogue

In addition to the library, this installs an executable boguex= to showcase about 50 useful constructions, see boguex -h for the list.

Some screenshots of a demo compiled with the latest version:

3D"619a6b3c5d7a=

3D"3e5e04d1db00=

Note that many widgets are not shown in this demo: tables, menus, drop-down= select lists, knob buttons,… I will add more images to the doc when I have some time!

Cohttp 5.0.0 and 2.5.6

Marcello Seri announced

We are glad to announce the release of version 5.0.0 and 2.5.6 of cohttp and its dependent packages.

The latter is a bug fix release that in particular backports the compatibil= ity with the upcoming release 0.15 of core and async.

The first introduces the breaking changes announced in the previous release. I append the changelog below, which explains in details the changes and emphasizes the breaking changes:

Cohttp.Header: new implementation (lyrm #747)

  • New implementation of Header modules using an associative list instead = of a map, with one major semantic change (function get, see be= low), and some new functions (clean_dup, get_multi_conca= t)
  • More Alcotest tests as well as fuzzing tests for this particular module= .
Purpose

The new header implementation uses an associative list instead of a map to = represent headers and is focused on predictability and intuitivity: except = for some specific and documented functions, the headers are always kept in = transmission order, which makes debugging easier and is also important for = RFC7230=C2=A7= 3.2.2 that states that multiple values of a header must be kept in orde= r.

Also, to get an intuitive function behaviour, no extra work to enforce RFCs= is done by the basic functions. For example, RFC7230=C2=A73.2.2 requires t= hat a sender does not send multiple values for a non list-value header. Thi= s particular rule could require the Header.add function to rem= ove previous values of non-list-value headers, which means some changes of = the headers would be out of control of the user. With the current implement= ation, an user has to actively call dedicated functions to enforce such RFC= s (here Header.clean_dup).

Semantic changes

Two functions have a semantic change : get and update.

get

get was previously doing more than just returns the value as= sociated to a key; it was also checking if the searched header could have multiple values: if not, the last value associat= ed to the header was returned; otherwise, all the associated values were concatenated and returned. This semantics do= es not match the global idea behind the new header implementation, and would also be very inefficient.

  • The new get function only returns the last value associate= d to the searched header.
  • get_multi_concat function has been added to get a result s= imilar to the previous get function.
update

update is a pretty new function (#703) and changes are minor a= nd related to get semantic changes.

  • update h k f is now modifying only the last occurrences of= the header k instead of all its occurrences.
  • a new function update_all function has been added and work= on all the occurrences of the updated header.
New functions :
  • clean_dup enables the user to clean headers that follows = the RFC7230= =C2=A73.2.2 (no duplicate, except set-cookie)
  • get_multi_concat has been added to get a result similar to= the previous get function.

Cohttp.Header: performance improvement (mseri, anurag= soni #778)

Breaking the headers are no-longer lowercased when parsed, the hea= ders key comparison is case insensitive instead.

cohttp-lwt-unix: Adopt ocaml-conduit 5.0.0 (smorimoto= #787)

Breaking Conduit_lwt_unix.connect's ctx pa= ram type chaged from ctx to ctx Lazy.t

other changes

  • cohttp-mirage: fix deprecated fmt usage (tmcgilchrist #783)
  • lwt_jsoo: Use logs for the warnings and document it (mseri #776)
  • lwt: Use logs to warn users about leaked bodies and document it (mseri = #771)
  • lwt, lwt_unix: Improve use of logs and the documentation, fix bug in th= e Debug.enable_debug function (mseri #772)
  • lwt_jsoo: Fix exception on connection errors in chrome (mefyl #761)
  • lwt_jsoo: Fix Lwt.wakeup_exn Invalid_arg exce= ption when a js stack overflow happens in the XHR completion handler (mefyl #762).
  • lwt_jsoo: Add test suite (mefyl #764).

We wish to thank to all the users and the contributors for their help leadi= ng to this release.

Multicore OCaml: December 2021 and the Big PR

Anil Madhavapeddy announced

Welcome to the December 2021 Multicore OCaml monthly report! The previous up= dates along with this update have been compiled by myself, @ctk21, @kayceesrk and @shakthimaan.

Well, it's finally here! @kayceesrk opened the Multicore OCaml PR#10831 to the main OCaml development repository that represents the "minimum viabl= e" implementation of multicore OCaml that we decided on in Novemb= er's core team review. The branch pushes the limits of GitHub's rendering capability, with around = 4000 commits.

Once the PR was opened just before Christmas, the remaining effort has been= for a number of developers to pore over the diff and = look for any unexpected changes that crept in during multicore development. A large number of code changes, improvements and fix= es have been merged into the ocaml-multicore trees since the PR was opened to facilitate this upstreamin= g process. We're expecting to have the PR merged during January, and then will continue onto the "post-MVP" tasks des= cribed last month, but working directly from ocaml/ocaml from now on. We therefore remain on track to release OCam= l 5.00 in 2022.

In the multicore ecosystem, progress also continued:

  • Eio continues to improve as the recommended effects-based = direct-style IO library to use with Multicore OCaml.
  • A newer domainslib.0.4.0 has been released that includes b= ug fixes and API changes.
  • The continuous benchmarking pipeline with further integration enhanceme= nts between Sandmark and current-bench is making progress.

We would like to acknowledge the following external contributors as well::

  • Danny Willems (@dannywillems) for an OCaml implementation of the Pippen= ger benchmark and reporting an undefined behaviour.
  • Matt Pallissard (@mattpallissard) reported an installation issue with <= code>Eio with vendored uring.
  • Edwin Torok (@edwintorok) for contributing a PR to domainslib to allow use of a per-channel key.

As always, the Multicore OCaml updates are listed first, which contain the = upstream efforts, improvements, fixes, test suite, and documentation changes. This is followed by the ecosystem up= dates to Eio, Tezos, and Domainslib. The Sandmark, sandmark-nightly and current-bench tasks are finally listed f= or your reference.

editor=E2=80=99s note: please follow the archive link above for the full= changelog.

St=C3=A9phane Lavergne asked and Robin Bj=C3=B6rklin = replied

To clarify for relative newbies like myself: this would be a new way to do = concurrent I/O, like Async and Lwt, but unlike those, it wouldn't require the use of a promise monad? In other word= s, does this mean that we'll have the choice between Async, Lwt and Eio in the near future for our concurrent I/O= needs?

That's correct as far as I can tell. This presentation provides an introduc= tion to the current state of eio: https://watch.ocaml.org/videos/watch/74ece0a8-380f-4e2a-bef5-c6b= b9092be89

Set up OCaml 2.0.0-beta12

Sora Morimoto announced

Fixed

  • Fallback to the version in which the assets exist if no assets exist in= the latest opam release.
  • Instruct Cygwin setup to use "sys" symlinks during setup (partial worka= round for bug with native symlinks in Cygwin setup - some depexts may still= be affected)

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta12

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id EECE5E00CE for ; Tue, 25 Jan 2022 13:44:55 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=QE2E=SJ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: dJYfAIwgSe6lMKXiwaFeLHlIg7NDc2CT5F8MVhrEPU6LpkbgT9Yuwuxr4rKo7K2v1nr9GQTsL2 5/I1/dPtO6ZFzHCi7DYMGJwya9IpZvOtZKS0Gq5vkH1buZRn3qPeqdjz8Y1P1PJYjq0N3sD33L 20Icwll7PRb23eH5IIuNDvFcd+OuWPrnaWjkYpXTmAM1RDu7bMkcic17Y9ZdvGrryigwfTo72f 9EaXQeFrdry2k8HxlQHeMF1gRudN1FVI54O5DFXNnOQFEb7JyNcC7+90aMjW0IgmH5zEHqGnJ2 o31GjeRlOjeU7PKXRyDee408 X-IPAS-Result: =?us-ascii?q?A0AaAgCL7+9hhyIeaIFaFoNugQcZAWRXKwcIMYRJgV6HJ?= =?us-ascii?q?YgQiUqULgNPEAEDAQ0qAQwHAQIEAQGCEIE/gTYCg1sCHgYBBTMTAQIEAQEBA?= =?us-ascii?q?QMCAwEBAQEBAQMBAQUBAQECAQECAwQBEwEBAQENCw4ICgcQEzxkZASBSwSBd?= =?us-ascii?q?AsHBicNgjUMDAMDg3cBFgIJCkAlIwMUAQYDAhEBFwEUChcBEhQGgmoBgxYFC?= =?us-ascii?q?pEsmkMaNXqBMYEBg04BAwIBEA+EJYFkDQIUgReGDFRKAYMAhAYCJxCBVUSBF?= =?us-ascii?q?YIpTwJugUABAYEKDAsBAQEBAYE0BwEBVoJigmUEkGscDj4PLz4ODQwWAQEEH?= =?us-ascii?q?AINIAEILQsBChkRCA0EAQkCGy0LCwIeD5FhKyWXfpQoYTQHg0iBOAYLiBuBH?= =?us-ascii?q?IxthFGDTINygUqKR5ElhlEhliYggiWGawKBFgaCPIgVDIwECIUtgU4qgWsMB?= =?us-ascii?q?zMaMEOCaQlFAQMCDQECAgMBAgECCQEBAowLgWoBBS4Wg0+BPoEmgXU7hUtAM?= =?us-ascii?q?wIBAQEzAgYBCgEBAwmFYwEBBRMLAYdcgkYBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:mkfQu67EZ1j45Zd5FAPXwM/XdLJyesId70hD6qkRc3xom6Oj+P xG8M5w6faWslcssRMb9+xoUZPoKRjhHPVOjbX5U43OYCDW/EOWaKti4YHhzzCIIVycysdtkY F6fexbAN30ZGIK6PoSDTPIceod/A== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.88,314,1635199200"; d="scan'208,217";a="4023244" X-MGA-submission: =?us-ascii?q?MDGacxbPr2iYZ+3f7P1Rj11dIqxELIzxrhqGs+?= =?us-ascii?q?ZG20nwneW5WfiCNdbjtF+5LiISmV+/EMabnIbCywlVVrihHfkzKAsEs5?= =?us-ascii?q?enw1CwOuXHhW03rMfYv49wAJWSWtdzG1UKW086JuPVMDvl7i2CXxHTRr?= =?us-ascii?q?ALmIuPi6s3o8bYDRDx9ZFksg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jan 2022 13:44:54 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4925A564671; Tue, 25 Jan 2022 13:44:53 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 25 Jan 2022 13:44:52 +0100 Message-ID: <87a6fk56ij.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 25 13:44:53 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.048017, queueID=96544564673 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 18 to 25, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 wu-manber-fuzzy-search 0.1.0 (new library) findlib-1.9.2 Signals and Threads on Memory Management OCaml 4.14.0, first alpha release A brief survey for Learn-OCaml Community Blog post: Js_of_ocaml, a bundle size study Interesting OCaml Articles Old CWN wu-manber-fuzzy-search 0.1.0 (new library) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Ifaz Kabir announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 I'm happy to introduce wu-manber-fuzzy-seach, my library for doing fuzzy searches using the Wu and Manber fuzzy search algorithm. The novel part of this library particularly, when compared to `agrep/ocamlagrep', is that I additionally provide a right-leaning variant of the algorithm. The variant reports better matches and error counts when looking at the first match. Here's an example of the differences. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # open Wu_Manber;; =E2=94=82 # StringSearch.(search ~k:2 ~pattern:"brown" ~text:"quick brown= fox" |> report);; =E2=94=82 - : string =3D "Pattern matched with 2 errors at character 9 of= text" =E2=94=82 # StringSearch.(search_right_leaning ~k:2 ~pattern:"brown" ~tex= t:"quick brown fox" |> report);; =E2=94=82 - : string =3D "Pattern matched with 0 errors at character 11 o= f text" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's a pure OCaml implementation, using `Optint.Int63.t' as bit-vectors. I don't current support all the extensions that `agrep/ocamlagrep' supports, and will definitely not match the performance: OCaml+C vs pure OCaml. The documentation for the library can be found [here]. It's not on `opam' yet, but there is a [PR]. Expect more bitvector, Levenshtein distance, and fuzzy search shenanigans in the near future! [here] [PR] findlib-1.9.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 findlib-1.9.2 is out. The only change is a fix for a build problem regarding the OCaml-5 trunk. For manual, download, manuals, etc. see here: An updated OPAM package will follow soon. Signals and Threads on Memory Management =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 I just had an excellent time listening to the last Signals and Threads podcast episode on [Memory Management], with Stephen Dolan (@stedolan) as the guest and Yaron Minsky (@Yaron_Minsky) as the host discussing: =E2=80=A2 memory management in programming languages in general =E2=80=A2 memory management in OCaml =E2=80=A2 ongoing research by Stephen and Leo White (@lpw25) on memory-management and data-representation features for OCaml (unboxed types, local values on the stack). The link contains both the audio and a full text transcript. I would warmly recommend giving it a try if you are interested in programming language implementation. There is new stuff to learn for everyone, and I also liked the presentation of the parts I was already familiar with. [Memory Management] Yaron Minsky replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Thanks for the nice words. Interviewing Dolan was fun and I learned a lot. Local types are still very new: we're hoping to start rolling it out in a limited way internally in the next few weeks, and I expect we'll learn a lot from that. We plan on discussing it more publicly as well, but that's a bit farther out. In the meantime, the source is all available [on Github] if anyone wants to poke around. The approach to stack allocation is different and simpler than the one in Rust, as Dolan explained in the episode. Instead of having implicit, polymorphic lifetime variables, function arguments can be marked as local, which prevents the function in question from stashing a reference to those types. This avoids the need to deal with higher-rank polymorphism, which Rust's lifetime approach requires, and as a result makes inference work nicely. Another neat trick is that you can create functions that can allocate on the parent stack frame (by dint of not having their own stack frame). This lets you build smart constructors for stack-allocated values. Local types are apparently an example of modal types, though I don't really know enough type theory to have a deep sense of what that means. But it's a powerful thing, and local types appear to be useful for more than just stack allocation, as we're just starting to discover. [on Github] Yaron Minsky then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And, I suppose as I should always mention: we're looking for people to come and work with Dolan and Leo and the rest of the team on this kind of stuff. More here: OCaml 4.14.0, first alpha release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The set of new features for the future version 4.14.0 of OCaml has been (finally) stabilized, three months after the release of OCaml 4.13.1. I am thus happy to announce the first alpha release for OCaml 4.14.0 . This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions). You can see the progress on this front at . If you find any bugs, please report them here: Most major OCaml developer tools are already supported with this alpha (from odoc to merlin), thus I expect us to switch to beta releases in the beginning of February. The full release is expected to happen in late February. This early release will give us time to focus on the release of OCaml 5.0. If you are interested by the list of new features and the ongoing list of bug fixes, the updated change log for OCaml 4.14.0 is available at: Happy hacking, Florian Angeletti for the OCaml team. Installation instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 4.14.0~alpha1 --repositories=3Ddefault,beta= =3Dgit+https://github.com/ocaml/ocaml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With opam 2.1, the previous command line can be simplified to =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 4.14.0~alpha1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create --packages=3Docaml-variants.4.= 14.0~alpha1+options, =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or with opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.4.14.0~alpha1+o= ptions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a comma separated list of ocaml-option-* packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 4.14.0~alpha1+flambda+nffa ocaml-variants.4.= 14.0~alpha1+options ocaml-option-flambda =E2=94=82 ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. If you want to test this version, it is advised to install the alpha opam repository with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-rep= ository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This alpha repository contains various fixes in the process of being upstreamed. The source code for the alpha is also available at these addresses: =E2=80=A2 =E2=80=A2 A brief survey for Learn-OCaml Community =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Erik Martin-Dorel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 [This post is just a follow-up of an earlier message on [caml-list], intended to reach more learn-ocaml instructors, so you can ignore this one if you already replied!] The OCaml Software Foundation is developing the teaching platform Learn-OCaml that provides auto-graded exercises for OCaml, and was initially authored by OCamlPro for the OCaml MOOC: . The platform is free software and easy to deploy; this is great, but as a result we keep learning of users/deployments that we had no idea of. We would be interested in having a better view of our user-base. If you use Learn-OCaml as a teacher, could you fill *[this Evento survey]* to let us know? (the survey will be closed on 2022-02-07) =E2=86=92 It contains these questions: =E2=80=A2 Where are you using Learn-OCaml? (in which university (a specif= ic course?), which company, online community or=E2=80=A6?) =E2=80=A2 Would you like to see your university/company added in [github.com/ocaml-sf/learn-ocaml-places]? =E2=80=A2 How many students/learners use your deployment in a year? And just to recall, a few links: =E2=80=A2 For an example of Learn-OCaml instance, see =E2=80=A2 Last October we had a 0.13.0 release with several new features: =E2=80=A2 For any question related to Learn-OCaml, feel free to create a discussion topic on , category *`Community'*, tag *`learn-ocaml'* (/similarly to this discussion topic!/ :slight_smile:) =E2=80=A2 And if need be, opening an issue in if of course warmly welcome as well. [caml-list] [this Evento survey] [github.com/ocaml-sf/learn-ocaml-places] Blog post: Js_of_ocaml, a bundle size study =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Javier Ch=C3=A1varri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi all, I hope your Monday is going great. :slight_smile: I wanted to analyze bundle size performance in Js_of_ocaml, so I rewrote an existing ReScript web app to compare both outputs. Here is the blog post with all the data, conclusions, and takeaways: It has been a very interesting experiment, that helped me learn more about Js_of_ocaml and the way it generates JavaScript code, and also improve some small things along the way in the libraries I was using for the project. The conclusions, while maybe already known by others, are also quite exciting to me, as the experiment confirms my suspicion that Js_of_ocaml bundle size scales just fine as applications get more complex, so it is suitable for a quite significant number of real world scenarios. I hope you find it interesting and exciting as well. Please share any feedback you might have! Or any questions if anything is unclear. Interesting OCaml Articles =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Yotam Barnoy said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 18 to 25, 202= 2.

wu-manber-fuzzy-search 0.1.0 (new library)

Ifaz Kabir announced

I'm happy to introduce wu-manber-fuzzy-seach, my library for doing fuzzy se= arches using the Wu and Manber fuzzy search algorithm.

The novel part of this library particularly, when compared to agrep/o= camlagrep, is that I additionally provide a right-leaning variant of the algorithm. The variant reports better matches = and error counts when looking at the first match. Here's an example of the differences.

# open Wu_Manber;;
# StringSearch.(search ~k:2 ~pattern:"brown" ~text:"quick brown fox" |> report);;
- : string =3D "Pattern matched with 2 erro=
rs at character 9 of text"
# StringSearch.(search_right_leaning=
 ~k:2 "brown" ~text:"quick b=
rown fox" |> report);;
- : string =3D "Pattern matched with 0 erro=
rs at character 11 of text"

It's a pure OCaml implementation, using Optint.Int63.t as bit-= vectors. I don't current support all the extensions that agrep/ocamlagrep supports, and will definitely not match = the performance: OCaml+C vs pure OCaml.

The documentation for the library can be found here.

It's not on opam yet, but there is a PR.

Expect more bitvector, Levenshtein distance, and fuzzy search shenanigans i= n the near future!

findlib-1.9.2

Gerd Stolpmann announced

findlib-1.9.2 is out. The only change is a fix for a build problem regarding the OCaml-5 trunk.

For manual, download, manuals, etc. see here:

http://proje= cts.camlcity.org/projects/findlib.html

An updated OPAM package will follow soon.

Signals and Threads on Memory Management

gasche said

I just had an excellent time listening to the last Signals and Threads podc= ast episode on Memory Management, with Stephen Dolan (@stedolan) as the guest and Yaron Minsky (@Yaron_Minsky) as the host discussing:

  • memory management in programming languages in general
  • memory management in OCaml
  • ongoing research by Stephen and Leo White (@lpw25) on memory-management= and data-representation features for OCaml (unboxed types, local values on= the stack).

The link https= ://signalsandthreads.com/memory-management/ contains both the audio and= a full text transcript.

I would warmly recommend giving it a try if you are interested in programmi= ng language implementation. There is new stuff to learn for everyone, and I also liked the presentation of the parts= I was already familiar with.

Yaron Minsky replied

Thanks for the nice words. Interviewing Dolan was fun and I learned a lot.

Local types are still very new: we're hoping to start rolling it out in a l= imited way internally in the next few weeks, and I expect we'll learn a lot from that. We plan on discussing it m= ore publicly as well, but that's a bit farther out. In the meantime, the source is all available on Github if anyone wants to poke around.

The approach to stack allocation is different and simpler than the one in R= ust, as Dolan explained in the episode. Instead of having implicit, polymorphic lifetime variables, function argume= nts can be marked as local, which prevents the function in question from stashing a reference to those types. This avo= ids the need to deal with higher-rank polymorphism, which Rust's lifetime approach requires, and as a result make= s inference work nicely.

Another neat trick is that you can create functions that can allocate on th= e parent stack frame (by dint of not having their own stack frame). This lets you build smart constructors for s= tack-allocated values.

Local types are apparently an example of modal types, though I don't really= know enough type theory to have a deep sense of what that means. But it's a powerful thing, and local types appear= to be useful for more than just stack allocation, as we're just starting to discover.

Yaron Minsky then added

And, I suppose as I should always mention: we're looking for people to come= and work with Dolan and Leo and the rest of the team on this kind of stuff.

More here:

https://blog.j= anestreet.com/applied-PL-research/

OCaml 4.14.0, first alpha release

octachron announced

The set of new features for the future version 4.14.0 of OCaml has been (fi= nally) stabilized, three months after the release of OCaml 4.13.1. I am thus happy to announce the first alpha releas= e for OCaml 4.14.0 .

This alpha version is here to help fellow hackers join us early in our bug = hunting and opam ecosystem fixing fun (see below for the installation instructions). You can see the progress on this = front at https://g= ithub.com/ocaml/opam-repository/issues/20501 .

If you find any bugs, please report them here:

https://github.com/ocaml/= ocaml/issues

Most major OCaml developer tools are already supported with this alpha (fro= m odoc to merlin), thus I expect us to switch to beta releases in the beginning of February. The full release is e= xpected to happen in late February.

This early release will give us time to focus on the release of OCaml 5.0.

If you are interested by the list of new features and the ongoing list of b= ug fixes, the updated change log for OCaml 4.14.0 is available at:

https://github= .com/ocaml/ocaml/blob/4.14/Changes

Happy hacking, Florian Angeletti for the OCaml team.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.14.0~alpha1 --repositories=3Ddefault,beta=3Dgit+https:=
//github.com/ocaml/ocaml-beta-repository.git

With opam 2.1, the previous command line can be simplified to

opam update
opam switch create 4.14.0~alpha1

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.14.0~a=
lpha1+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

or with opam 2.1:

opam update
opam switch create <switch_name> ocaml-variants.4.14.0~alpha1+options=
 <option_list>

where <option_list> is a comma separated list of ocaml-o= ption-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.14.0~alpha1+flambda+nffa ocaml-variants.4.14.0~alpha1+=
options ocaml-option-flambda
ocaml-option-no-flat-float-array

All available options can be listed with opam search ocaml-option.

If you want to test this version, it is advised to install the alpha opam r= epository

https://gi= thub.com/kit-ty-kate/opam-alpha-repository

with

opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-repository.git

This alpha repository contains various fixes in the process of being upstre= amed.

The source code for the alpha is also available at these addresses:

A brief survey for Learn-OCaml Community

Erik Martin-Dorel announced

[This post is just a follow-up of an earlier message on caml-list, intended to reach more learn-ocaml instructors, so you can ignore this one if you already replied!]

The OCaml Software Foundation is developing the teaching platform Learn-OCa= ml that provides auto-graded exercises for OCaml, and was initially authored by OCamlPro for the OCaml MOOC: https://ocaml-sf.org/learn-ocaml.

The platform is free software and easy to deploy; this is great, but as a r= esult we keep learning of users/deployments that we had no idea of. We would be interested in having = a better view of our user-base.

If you use Learn-OCaml as a teacher, could you fill this Evento survey to let us know? (the survey will be closed on 2022-02-07)

=E2=86=92 It contains these questions:

  • Where are you using Learn-OCaml? (in which university (a specific cours= e?), which company, online community or=E2=80=A6?)
  • Would you like to see your university/company added in github.com/ocaml-sf/learn= -ocaml-places?
  • How many students/learners use your deployment in a year?

And just to recall, a few links:

Blog post: Js_of_ocaml, a bundle size study

Javier Ch=C3=A1varri announced

Hi all, I hope your Monday is going great. :slight_smile:

I wanted to analyze bundle size performance in Js_of_ocaml, so I rewrote an= existing ReScript web app to compare both outputs.

Here is the blog post with all the data, conclusions, and takeaways:

h= ttps://www.javierchavarri.com/js_of_ocaml-bundle-size-study/

It has been a very interesting experiment, that helped me learn more about = Js_of_ocaml and the way it generates JavaScript code, and also improve some small things along the way in the li= braries I was using for the project.

The conclusions, while maybe already known by others, are also quite exciti= ng to me, as the experiment confirms my suspicion that Js_of_ocaml bundle size scales just fine as applications get= more complex, so it is suitable for a quite significant number of real world scenarios.

I hope you find it interesting and exciting as well. Please share any feedb= ack you might have! Or any questions if anything is unclear.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C2394E0C27 for ; Tue, 1 Feb 2022 14:07:20 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=flst=SQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: nLTU2yFf/9jFSP48UlCsuOY/DKT3s/uteeUYmIYa4uQrhPEN11wEWTw+OpXUsi4veTcJnKSnN+ qZLrcItQXWrocWEd4BnKBy8xJXjBytEulNk2AN+q8q2Ty9QqBfrzFXuqGInOwfTkRIXSVRv+mf jFc9TdXcEcUK+yoFRwYQxyjh4uRERdbUusA4ZKDlaAPU4kWfkvlmoVMIsvxx7hqMY/fpF/CG/6 2Tv+jy/kULwdgU/sX5eJ374kncsVygoDE9jS85BARalZ2jQzfr/oZCBywV4+1k+Ce/zHX3RzN5 J3IQLZ+7L2/UcQNCR0vsVQTE X-IPAS-Result: =?us-ascii?q?A0ApBQARMPlhhyIeaIFaFoNuWS4ZAWRSBRYVBwgxhEmJA?= =?us-ascii?q?4gQgRUBghWGIYZxiBeFeBABAwENKgEFDgECBAEBghCGVgIeBgEFMxMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBAwEBBQEBAQIBAQIDBAETAQEBAQ0LDggMBRATPGRkBIFLB?= =?us-ascii?q?IF0CzQNgjUMDAODdwMBGAECBgQGOwMnIwMUAQYDAhEBFwEUChcBEhQGAQGCa?= =?us-ascii?q?AGDFgUKkmScDH8ygQGDTgEDAgECCwMBDgkmg3aBZA0CFIEAF4JCg0pUSgGDA?= =?us-ascii?q?AmDBHkCJxCBVUSBFYIpSgdugkYGFwEBAQEBF4EkAQGDOBeCTgSRVw4+AQEmB?= =?us-ascii?q?hAkGg4FCAwICAYBARMDCgINIQgFHhUBHx0EDgUEBAEQFg0HBQYFBAILL5FaB?= =?us-ascii?q?wwfJY0rileVCTQHg0mBOAYLh1wFO4Echn2Fc4RTg0yDcoFLhReFOoZakR8hl?= =?us-ascii?q?ikggieFcnwIgQcJgkKCA5IQFAQEhS2BTiqBTR4MBzMaMEOCNQEzCUUBAwINA?= =?us-ascii?q?QICAwECAQIJAQEChRqIYS4WgycogT6BAgqCDzuFSQJAMwIBATQCBgEKAQEDC?= =?us-ascii?q?YVjAQEFEwsBhH8tghcBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:d2lfJ6x3F2clhOv8KuJ6t+ezwCrEfRIJ4+MujC+fZmUNrF6WrkVVy DFOD2qBb//fZzbweNt0Pd6y8koG75SEzd9iTQFk+VhgHilAwSbnLYTAfx2oZ0t+DeWaERk5t 51GAjXkBJppJpMJjk71atANlVEliefQAOOU5NfsYkidfyc9IMsaoU8ly75RbrJA24DjWVvX4 Yqq+qUzBXf8s9JKGjJMg068gEg31BjCkGtwUosWOJinFHeH/5UkJMp3yZOZdxMUcaEIdgKOf Nsv+Znilo/vE7jBPfv++lrzWhVirrc/pmFigFIOM0SpqkAqSiDfTs/XOdJEAXq7hQllkPgom YlWuIWXbj4IZPKTxuAPaTBmIzBHaPguFL/veRBTsOSW3xSAa3zo0uljB0EwPJQF96BwG24mG f4wcWpcKEnb26TtmPTgFoGAhex7RCXvFLglgSk1wzXCEaMdeMXbRKHb+dJT3DExn91DW/HEa J8QbTNpKg/LYxhOJks/ApUjmuylnT/6Ly0er0iazUYyyzSNnVIti+iF3Nz9Reeae95zg02ip yHY7VXbDAMoNvu8xm/Qmp6rrraTzHKkCN16+KeD3vVjhVnWwm0IFDUNRF6jqL+4jFS/UpRRM SQpFjEGqLhrslSsSsjhUha4pn+doxNaXMBfewEn1O2T4vOFvx2UH08jdx8bN4N4sN0MbAIax 2bcyrsFGgdTmLGSTHuc8JKdojWzJTUZIAc+icksEVZtDz7L/N9bs/7fcjpwOPLl0ICoSFkc1 xjQ8HJm393/mOZSj82GEUb7byWEiKKhouQd3ATMG0W/5wV2ZZXNi2eAuAGCtq4owGqx5b+Fs T0Ilo2w9ukIBpzlqcBgaOAdRfex4PKULDDXgVhuBoQssTO39BZPnLy8AhkjdS+F0e5dJ1cFh XM/XysKvfe/21PxNsdKj3qZUZhC8EQZPY2NugroRtRPeINtUwSM4TtjY0Wdt0i0zhR3zPFhZ 8vKLpfyZZr/NUiB5GfnLwv6+eFwrh3SOUuIHMuTI+mPjOLCNS7IF9/pznPXNbhpvMtoXzk5A /4Ga5rblEUAOAEPSjPa94cPIEpiEJTILc6eliCjTcbaelAOMDh4U5f5mOpxE6Q4wfg9vrqWr xmVBx8JoHKi1CavAVjbOhhehEbHBssXQYQTZnB3Yj5FGhELPe6S0UvoX8BmIOB6pLE/lqMco jtsU5zoP8mjgw/vo1w1BaQRZqQ4HPhyrQ7RbSejfhYleJtsG17A9tP+J1a9/i4TCCG6ro07/ 63m0RnUGMJRSwNnBcfQSfSu01Lg5ilGwLspBRLFcotJZUHh0Il2MCit3PU5FMcBdEfYzTyA2 gfKXBoV/LGfo4I8/NTTq7qDqoOlT7l3EkZARjaJ9bGyJDXX9WqlwJZdXaCPZz+EDDH4/6CrZ ON0yfDgMaxezAYa6dIkS7sylPAw/driobNe3z9IJnSTYgT5EK5kL1mHwdJL6v9HyIhftFbkQ UmI4NRbZeiENc65Ql4cIA0pMraK2f0OwGCA6ORsZl394D5r8bGHV0RLIhTKjzZSdeMnPIQgy OYnmcgX9w3u00p6Yoze1nhZpzaWM3gNc6Q7rZVEUoXlvQoczA0Qa5LrDCKrsoqEbM9BMxVxL zLI1rDOga9QmhjLf3YpTyGf2PoEw4wJvAFWwVQCIVWQh9eDgeU4hUUD/TMyRwVT7xNGz+MiY zg7Zxctff2Dr2VymcxOf2GwAAUfVheXzUzGzQdbnmPuSUT1BHfGK3cwOLrW8U0Um46GkuO3I F1FJKfZvTfWkAXZ2ztrH1Zir+3/QNdx8Azbhc3hGN6Kd3X/SSSwmbegPALktDO+af7dRmWez QWpwAq0Qaf8KCgbrrZ9DtWKk7MKR3ho4URZWf87uvth8X70IVmPNPvnF6x1UttKI+3W/ES4D c13O88JUA6xvMpLhisDC/RKe9eYg9ZwjOc/lnjXyaLqfldRQveFcH4dy8QmuFIWfg== IronPort-HdrOrdr: A9a23:R4hk6amfwsktl9b4+6q4EiEgOALpDfIr3DAbv31ZSRFFG/Fw9v rPoB1173DJYVoqMk3I+urgBEDjex3hHPdOiOF7AV7IZmXbUQWTQb1K3M/L/HnLGiH19OJRvJ 0QEJRWOZnXFlY/qc775WCDYrMdKTS8gcKVuds= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.88,333,1635199200"; d="scan'208,217";a="4696438" X-MGA-submission: =?us-ascii?q?MDHDf9AiSj5sk+YrK6iPsV5iMDNiCUXuwUED1E?= =?us-ascii?q?q/a7ByW45FeYe86x0GLYSwi+z5RQ0krPi/MC3PIIiV9cQEiZwSNSN/n+?= =?us-ascii?q?elwSFDZ/K6nh75/S7rJ4XQcewqWY5DcdAT8GxWdAgqr5txEy7hfESBDE?= =?us-ascii?q?BFTjlOuAU05z82ebAdW7DTAw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Feb 2022 14:07:19 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 40461566487; Tue, 1 Feb 2022 14:01:00 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 01 Feb 2022 14:00:57 +0100 Message-ID: <875ypykagm.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 1 14:01:01 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.332265, queueID=D6F3856648A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 25 to February 01, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ppx_seq v0.1.1 OCaml Labs Joins Tarides For Diversity and the OCaml Community: Get Involved in Outreachy Summer 2022 Set up OCaml 2.0.0-beta13 First release of scfg Brr 0.0.3, a toolkit for programming browsers (anonymous?) polymorphic records 2 postdoc positions on Runtime Verification at CEA LIST, Universit=C3=A9 Pa= ris-Saclay, France Old CWN ppx_seq v0.1.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: hyphenrf announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Hello everyone, my first contribution to opam-repository has just been merged and is waiting to hit the caches of [opam.ocaml.org]. [ppx_seq] is a cute un-intrusive literal syntax for `Seq'. The rewriter is simple and has very small surface area: just `[%seq x; y; z; ...]' and `[%seq.empty]'. It tries to be maximally compatible with all OCaml releases from 4.07 (when `Seq' was introduced) to 4.14 and beyond The reason I created this rewriter is to make it an easier choice to reach first for `Seq' as a general data structure (instead of e.g. list). That wasn't quite attractive before because of how minimal the `Seq' module was, it was mostly used as an intermediate step between two types of collections, but now with 4.14 about to be released, `Seq' is becoming a first-class data structure with a very versatile API. I hope my little rewriter helps make it even more attractive to use. Check it out and maybe leave me some feedback. Thanks <3 [opam.ocaml.org] [ppx_seq] OCaml Labs Joins Tarides =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Gazagnaire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Gemma Gordon (@gemmag) and I are delighted to announce that OCaml Labs, a spinout from the University of Cambridge, is joining Tarides. After successfully collaborating on many OCaml projects over the last four years, this alliance will formally combine the expertise of both groups. Joining forces will accelerate OCaml development and its broader adoption, and enable us to continue with our shared goal of bringing OCaml into mainstream use. Furthermore, it will bring the security, portability and performance of OCaml to a large spectrum of use-cases: from academic endeavours such as formal methods and existing threats within cyber security, to real-world applications for climate change, sustainable agriculture, and even space exploration! All of OCaml Labs=E2=80=99 existing responsibilities and open source commitments will migrate over to Tarides, and thanks to how closely the teams already work, business will continue without interruption to continuity or delivery. Gemma Gordon will step up as CEO of Tarides, and I will lead the technological vision and strategy as CTO. The OCaml 5.0 release will support multicore and effects handlers, influencing every aspect of the language and its ecosystem. The update will significantly improve both performance and user experience, whilst maintaining existing features that the community loves. Using the teams=E2=80=99 combined experience and zest for innovation, Tarides is looking to the future of the OCaml language and community with excitement. Since Tarides=E2=80=99 inception we have envisioned a future = where all OCaml applications are easily deployable as specialised, secure and energy-efficient MirageOS unikernels. We believe that this alliance is a step further in that direction. _This alliance will complement the commercial offerings of Tarides and contribute to Tarides' mission: empowering developers, communities and organisations to adopt OCaml as their primary programming experience by providing training, expertise and development services around the OCaml language._ Read the full announcement [here], including details of our goals and the focus for 2022. This alliance brings the headcount of Tarides up to 60+ people, all working towards making OCaml the best language for any, and every project. Join our team and reach out for commercial services at: [https://tarides.com/] [here] [https://tarides.com/] For Diversity and the OCaml Community: Get Involved in Outreachy Summer 2022 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Sonja Heinze announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 As @patricoferris [has mentioned] previously, the Outreachy call for open-source communities and project submissions has started. As a reminder, [Outreachy] is an initiative that provides a framework through which open-source communities can offer three month internships directed at people from any kind of under-represented background in open source. With that, Outreachy helps open-source communities grow on several levels: diversity, experience, size, and popularity. The OCaml community participated in Outreachy in summer 2019, summer 2020, [summer 2021], and currently in [winter 2021/22]. All our interns have done and are doing really amazing jobs, and summer 2022 is just around the corner! The following timeline illustrates the process: So let's start getting involved! [has mentioned] [Outreachy] [summer 2021] [winter 2021/22] Ways to Get Involved =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C Community members can take on different roles in the Outreachy effort, and all of them are very important! Maybe the most important (and most involved) role is being a mentor. Mentoring =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84 Mentors have two responsibilities: leading the project and guiding the interns/applicants. Leading the Project =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2= =94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94= =88=E2=94=88=E2=94=88 One responsability is leading the project. Concretely, that means outlining an internship project, submitting a project description to Outreachy, making sure that the context repo for that project gets ready for the application/"contribution" phase, and guiding the project throughout the internship, including reacting to changes. All of that must match the Outreachy framework, which we [explained in detail] last round, based on the timeline structure shown above. [explained in detail] Guiding the Intern and the Applicants =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2= =94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94= =88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88= =E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2=94=88=E2= =94=88=E2=94=88=E2=94=88=E2=94=88 Their other responsibility is personal guidance. During the application/"contribution" period, mentors answer questions and review code for multiple applicants. During the internship, they also offer pair-programming sessions and facilitate more specific guidance, and general support for their interns. All of that is usually quite time-intensive, so it's important to have some support from other community members and strong support from a concrete co-mentor. Co-mentoring =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84 A co-mentor does the same job as described in the "Guiding the Intern and the Applicants" tasks above, so having a co-mentor is very important! Of course, if a co-mentor also wants to take part in the project's direction, that's great as well! This means that the line between co-mentoring and mentoring isn't always clear. Volunteering (aka "Acting as a Joker :bat:") =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84 Mentors and co-mentors receive a lot of general questions related to OCaml and programming in addition to specific questions about the project. That's where Outreachy volunteers can be very helpful! They help all applicants and interns across projects with (usually) project-unspecific questions and give a very important technical base support. Point Out Potential Project Ideas =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84= =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 Apart from not having enough time, the main reason that stops folks from becoming a mentor is the lack of project ideas. So if you have potential project ideas, please point them out, even if you don't have time to mentor! Generally, a self-contained, uncontroversial, and incremental project makes the most suitable project for Outreachy. It's also important for a project to be associated with a repo that can serve as a basis for easy contributions during the application phase. When in doubt, don't keep your ideas to yourself. Any idea can be helpful! Prepare Your Repos =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94= =84=E2=94=84 In general, if you maintain a repo, it's really nice to be welcoming to new contributors. Concretely, that means having clear contributing guidelines, good newcomer issues, and well-labeled issues. As a nice side-effect, this also makes your project a better target for future Outreachy projects. Ready to Get Involved? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you've gotten interested in any of those roles or have any other comments, please just answer here in the thread. It would be super nice to get a discussion going and start our Outreachy efforts early! Sudha Parimala then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I along with @shakthimaan @gs0510 are submitting a project: =E2=80=A2 Extend OCaml 5's parallel benchmark suite. The idea is to gather parallel benchmarks available elsewhere and make them available in our benchmark suite, to aid the development of the OCaml compiler and parallel programming libraries. Relevant repos: [sandmark] and [current-bench]. [sandmark] [current-bench] Set up OCaml 2.0.0-beta13 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sora Morimoto announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Do not install opam-depext if it's not enabled. Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Print a proper error if the version not found in the `.ocamlfor= mat' file. First release of scfg =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: zapashcanon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the first release of [scfg] on opam. It provides a library and an executable to work with the [scfg configuration file format]. (disclaimer: scfg has been created by my good friend @emersion) Here's an example of an scfg file taken from the specification: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 train "Shinkansen" { =E2=94=82 model "E5" { =E2=94=82 max-speed 320km/h =E2=94=82 weight 453.5t =E2=94=82=20 =E2=94=82 lines-served "T=C5=8Dhoku" "Hokkaido" =E2=94=82 } =E2=94=82=20 =E2=94=82 model "E7" { =E2=94=82 max-speed 275km/h =E2=94=82 weight 540t =E2=94=82=20 =E2=94=82 lines-served "Hokuriku" "J=C5=8Detsu" =E2=94=82 } =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Scfg is a file format designed to be simple and indeed the implementation was really straightforward. I'm planning to use it in small tools I wrote (mostly [sway] tools written in OCaml) but never released because I couldn't stand having to use TOML, YAML or JSON for them=E2=80=A6 The library provides an executable to validate and pretty-print an scfg file. It'll indent it properly, remove useless quoting and whitespaces: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ scfg spec.scfg =E2=94=82 train Shinkansen { =E2=94=82 model E5 { =E2=94=82 max-speed 320km/h =E2=94=82 weight 453.5t =E2=94=82 lines-served T=C5=8Dhoku Hokkaido =E2=94=82 } =E2=94=82 model E7 { =E2=94=82 max-speed 275km/h =E2=94=82 weight 540t =E2=94=82 lines-served Hokuriku J=C5=8Detsu =E2=94=82 } =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The library is made of four modules : `Types', `Parse', `Pp' and `Query'. The `Types' module simply defines the following types, which are all you need to deal with scfg: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (** A directive has a name, a list of parameters and children (= a list of directive). *) =E2=94=82 type directive =3D =E2=94=82 { name : string =E2=94=82 ; params : string list =E2=94=82 ; children : directive list =E2=94=82 } =E2=94=82=20 =E2=94=82 (** A config is a list of directives. *) =E2=94=82 type config =3D directive list =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The others modules can be used as follow: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let file =3D {| =E2=94=82 train A-Train { =E2=94=82 bla bla bla =E2=94=82 } =E2=94=82 train "John Col Train" { =E2=94=82 tut tut tut =E2=94=82 } =E2=94=82 |} =E2=94=82=20 =E2=94=82 (* parsing the file *) =E2=94=82 let config =3D =E2=94=82 (* there's also a `Parse.from_file` function that should be m= ore useful *) =E2=94=82 match Scfg.Parse.from_string file with =E2=94=82 | Error e -> =E2=94=82 Format.eprintf "error: %s@." e; =E2=94=82 exit 1 =E2=94=82 | Ok config -> config =E2=94=82=20 =E2=94=82 (* printing the file *) =E2=94=82 let () =3D =E2=94=82 Format.printf "```scfg@.%a@.```@." Scfg.Pp.config config =E2=94=82=20 =E2=94=82 (* querying the file *) =E2=94=82 let () =3D =E2=94=82 (* gets the first directive with the name `train` *) =E2=94=82 match Scfg.Query.get_dir "train" config with =E2=94=82 | None -> Format.printf "No train found.@." =E2=94=82 | Some train -> ( =E2=94=82 (* get the parameter at index 0 in the `train` directive *) =E2=94=82 match Scfg.Query.get_param 0 train with =E2=94=82 | Error _e -> Format.printf "Train has no name.@." =E2=94=82 | Ok name -> Format.printf "The first train is `%s`.@." nam= e ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For more have a look at the [project's README], the [documentation] or feel free to ask here ! :partying_face: [scfg] [scfg configuration file format] [sway] [project's README] [documentation] Brr 0.0.3, a toolkit for programming browsers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's my pleasure to announce the release `0.0.3' of [`Brr'], a toolkit for programming browsers in OCaml with the [`js_of_ocaml'] compiler. Once it has made it to the repo, install with `opam install brr' and consult the [API docs and manuals] (or via `odig doc brr'). Among small additions and fixes, this release brings support for `js_of_ocaml' 4.0.0. Thanks to Hugo Heuzard (@hhugo) who has made the ground work in `js_of_ocaml' this means that: 1. `Brr', `js_of_ocaml' and ([soon]) `gen_js_api' JavaScript bindings can now all be used in the same program without problems (issue [#2]). 2. You no longer need to specify the `-no-check-prim' flag at bytecode link time. Linking against the `brr' library is sufficient, see the [build instructions]. The [release notes] have all the details. [`Brr'] [`js_of_ocaml'] [API docs and manuals] [soon] [#2] [build instructions] [release notes] (anonymous?) polymorphic records =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: nrolland asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Is there a way to avoid to create records only to preserve polymorphism ? Say, for this, in haskell style =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 h :: (forall r. (r -> a) -> (f r -> f b)) -> f a -> f b =E2=94=82 h malg =3D malg id =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 octachron replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 You can use objects, they can have polymorphic methods: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f (id: 'a>) =3D id#f 0, id#f "zero" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Ma=C3=ABlan also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The following doesn=E2=80=99t help reducing the syntactic noise, but note= that when using a record for non-prenex polymorphism like this, your record has only one field and is immutable, so (with a recent enough OCaml) you can unbox it and get rid of the runtime overhead: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type ('a, 'b) fwrap =3D { f : 'r. ('r -> 'a) -> 'r list -> 'b l= ist } [@@unboxed] =E2=94=82=20 =E2=94=82 let apply_id : type a b. (a, b) fwrap -> a list -> b list =3D =E2=94=82 fun w xs -> w.f Fun.id xs =E2=94=82 (* is compiled the same as just: *) =E2=94=82 let apply_id_magic : type a b. (a, b) fwrap -> a list -> b list= =3D =E2=94=82 fun w xs -> (Obj.magic w) Fun.id xs =E2=94=82=20 =E2=94=82 let mwrap : type a. (a, a) fwrap =3D { f =3D List.map } =E2=94=82 (* is compiled to nothing at all (alias of List.map). *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 2 postdoc positions on Runtime Verification at CEA LIST, Universit=C3=A9 Pa= ris-Saclay, France =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Julien Signoles announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Software Safety and Security Lab at CEA LIST, Universit=C3=A9 Paris-Saclay, France has 2 open postdoc positions in the area of runtime verification for code safety and security: =E2=80=A2 Designing Compilation Techniques for Improving Efficiency of E-= ACSL, a Runtime Assertion Checker for C Programs =E2=80=A2 Control Flow Integrity for Remote Attestation The candidates will: =E2=80=A2 solve challenging research problems; =E2=80=A2 implement their results in Frama-C, an industrial-strength open-source framework for analyses of C code; =E2=80=A2 evaluate their solutions on concrete benchmarks or/and use case= s; =E2=80=A2 publish their results in international conferences and journals. Strong knowledge in at least one of the following areas is welcome: =E2=80=A2 programming =E2=80=A2 OCaml and C =E2=80=A2 formal semantics =E2=80=A2 formal verification =E2=80=A2 runtime verification, static analysis, formal specification languages, =E2=80=A6 =E2=80=A2 compilation =E2=80=A2 code generation, program transformation, type system, =E2=80= =A6 Interested applicants should send a CV and a motivation letter to Julien Signoles (julien dot signoles at cea dot fr). Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of January 25 to Februar= y 01, 2022.

ppx_seq v0.1.1

hyphenrf announced

Hello everyone, my first contribution to opam-repository has just been merg= ed and is waiting to hit the caches of opam.ocaml.org.

ppx_seq is a cute un-in= trusive literal syntax for Seq. The rewriter is simple and has very small surface area: just [%seq x; y; z; ...] and [%seq.empty]. It tries to be maximally compatible with all OCaml releases from 4.07 (when= Seq was introduced) to 4.14 and beyond

The reason I created this rewriter is to make it an easier choice to reach = first for Seq as a general data structure (instead of e.g. list). That wasn't quite attractive before becau= se of how minimal the Seq module was, it was mostly used as an intermediate step between two types of collections, b= ut now with 4.14 about to be released, Seq is becoming a first-class data structure with a very versa= tile API.

I hope my little rewriter helps make it even more attractive to use. Check = it out and maybe leave me some feedback. Thanks <3

OCaml Labs Joins Tarides

Thomas Gazagnaire announced

Gemma Gordon (@gemmag) and I are delighted to announce that OCaml Labs, a s= pinout from the University of Cambridge, is joining Tarides. After successfully collaborating on many OCaml projects= over the last four years, this alliance will formally combine the expertise of both groups. Joining forces will acc= elerate OCaml development and its broader adoption, and enable us to continue with our shared goal of bringing OCaml = into mainstream use. Furthermore, it will bring the security, portability and performance of OCaml to a large spectru= m of use-cases: from academic endeavours such as formal methods and existing threats within cyber security, to real-= world applications for climate change, sustainable agriculture, and even space exploration!

All of OCaml Labs=E2=80=99 existing responsibilities and open source commit= ments will migrate over to Tarides, and thanks to how closely the teams already work, business will continue without interrup= tion to continuity or delivery. Gemma Gordon will step up as CEO of Tarides, and I will lead the technological vi= sion and strategy as CTO.

The OCaml 5.0 release will support multicore and effects handlers, influenc= ing every aspect of the language and its ecosystem. The update will significantly improve both performance and user = experience, whilst maintaining existing features that the community loves. Using the teams=E2=80=99 combined experi= ence and zest for innovation, Tarides is looking to the future of the OCaml language and community with excitement. Since Ta= rides=E2=80=99 inception we have envisioned a future where all OCaml applications are easily deployable as specialised, s= ecure and energy-efficient MirageOS unikernels. We believe that this alliance is a step further in that directi= on.

_This alliance will complement the commercial offerings of Tarides and cont= ribute to Tarides' mission: empowering developers, communities and organisations to adopt OCaml as their primary p= rogramming experience by providing training, expertise and development services around the OCaml language._

Read the full announcement here, i= ncluding details of our goals and the focus for 2022. This alliance brings the headcount of Tarides up to 60+ people, all working= towards making OCaml the best language for any, and every project. Join our team and reach out for commercial serv= ices at: https://tarides.com/

For Diversity and the OCaml Community: Get Involved in Outreac= hy Summer 2022

Sonja Heinze announced

As @patricoferris has mentioned previously, the Outreachy call for open-source communities and project subm= issions has started. As a reminder, Outreachy is an initiative that p= rovides a framework through which open-source communities can offer three month internships directed at people from any k= ind of under-represented background in open source. With that, Outreachy helps open-source communities grow on sev= eral levels: diversity, experience, size, and popularity.

The OCaml community participated in Outreachy in summer 2019, summer 2020, = summer 2021, and currently in winter 2021/22. All our interns have done and are doing really amazing jobs, and summer 2022 is just around the corner! The f= ollowing timeline illustrates the process:

3D"DbzeiMO.png"

So let's start getting involved!

Ways to Get Involved

Community members can take on different roles in the Outreachy effort, and = all of them are very important! Maybe the most important (and most involved) role is being a mentor.

Mentoring

Mentors have two responsibilities: leading the project and guiding the inte= rns/applicants.

Leading the Project

One responsability is leading the project. Concretely, that means outlining= an internship project, submitting a project description to Outreachy, making sure that the context repo for tha= t project gets ready for the application/"contribution" phase, and guiding the project throughout the in= ternship, including reacting to changes. All of that must match the Outreachy framework, which we explained in detail last round, based on the timeline structure shown above.

Guiding the Intern and the Applicants

Their other responsibility is personal guidance. During the application/"co= ntribution" period, mentors answer questions and review code for multiple applicants. During the internship, t= hey also offer pair-programming sessions and facilitate more specific guidance, and general support for their intern= s.

All of that is usually quite time-intensive, so it's important to have some= support from other community members and strong support from a concrete co-mentor.

Co-mentoring

A co-mentor does the same job as described in the "Guiding the Intern and t= he Applicants" tasks above, so having a co-mentor is very important! Of course, if a co-mentor also wants to take p= art in the project's direction, that's great as well! This means that the line between co-mentoring and mentoring = isn't always clear.

Volunteering (aka "Acting as a Joker :bat:")

Mentors and co-mentors receive a lot of general questions related to OCaml = and programming in addition to specific questions about the project. That's where Outreachy volunteers can be very = helpful! They help all applicants and interns across projects with (usually) project-unspecific questions and giv= e a very important technical base support.

Point Out Potential Project Ideas

Apart from not having enough time, the main reason that stops folks from be= coming a mentor is the lack of project ideas. So if you have potential project ideas, please point them out, even = if you don't have time to mentor! Generally, a self-contained, uncontroversial, and incremental project makes= the most suitable project for Outreachy. It's also important for a project to be associated with a repo that can ser= ve as a basis for easy contributions during the application phase. When in doubt, don't keep your ideas to yours= elf. Any idea can be helpful!

Prepare Your Repos

In general, if you maintain a repo, it's really nice to be welcoming to new= contributors. Concretely, that means having clear contributing guidelines, good newcomer issues, and well-labele= d issues. As a nice side-effect, this also makes your project a better target for future Outreachy projects.

Ready to Get Involved?

If you've gotten interested in any of those roles or have any other comment= s, please just answer here in the thread. It would be super nice to get a discussion going and start our Outreachy ef= forts early!

Sudha Parimala then said

I along with @shakthimaan @gs0510 are submitting a project:

  • Extend OCaml 5's parallel benchmark suite.

The idea is to gather parallel benchmarks available elsewhere and make them= available in our benchmark suite, to aid the development of the OCaml compiler and parallel programming libraries. R= elevant repos: sandmark and current-bench.

Set up OCaml 2.0.0-beta13

Sora Morimoto announced

Changed

  • Do not install opam-depext if it's not enabled.

Fixed

  • Print a proper error if the version not found in the .ocamlformat= file.

https://github.com/ocaml/setup-ocaml/releases/tag/v2.0.0-beta13

First release of scfg

zapashcanon announced

I'm pleased to announce the first release of scfg on opam.

It provides a library and an executable to work with the scfg configuration file format. (disclaimer: scfg has been created by my good friend @emersion)

Here's an example of an scfg file taken from the specification:

train "Shinkansen" {
	model "E5" {
		max-speed 320km/h
		weight 453.5t

		lines-served "T=C5=8Dhoku" "Hokkaido"
	}

	model "E7" {
		max-speed 275km/h
		weight 540t

		lines-served "Hokuriku" "J=C5=8Detsu"
	}
}

Scfg is a file format designed to be simple and indeed the implementation w= as really straightforward. I'm planning to use it in small tools I wrote (mostly sway<= /a> tools written in OCaml) but never released because I couldn't stand having to use TOML, YAML or JSON for them…

The library provides an executable to validate and pretty-print an scfg fil= e. It'll indent it properly, remove useless quoting and whitespaces:

$ scfg spec.scfg
train Shinkansen {
  model E5 {
    max-speed 320km/h
    weight 453.5t
    lines-served T=C5=8Dhoku Hokkaido
  }
  model E7 {
    max-speed 275km/h
    weight 540t
    lines-served Hokuriku J=C5=8Detsu
  }
}

The library is made of four modules : Types, Parse, Pp and Query.

The Types module simply defines the following types, which are= all you need to deal with scfg:

(** A directiv=
e has a name, a list of parameters and children (a list of directive). *)
type directive =3D
  { name : string
  ; params : string list
  ; children : directive list
  }

(** A config is a list of directives. *)
type config =3D directive list

The others modules can be used as follow:

let file =3D {|
  train A-Train {
    bla bla bla
  }
  train "John Col Train" {
    tut tut tut
  }
|}

(* p=
arsing the file *)
let config =3D
  (* there's also a `Parse.from_file` function that should be more useful *)
  match Scfg.Parse.from_string file with=

  | Error=
 e ->
    Format.eprintf "error: %s@." e;
    exit 1
  | Ok co=
nfig -> config

(* p=
rinting the file *)
let () =3D
  Format.printf "```scfg@.%a@.```@." Scf=
g.Pp.config config

(* q=
uerying the file *)
let () =3D
  (* gets the first directive with the name `train` *)
  match Scfg.Query.get_dir "train" config with
  | None =
-> Format.printf "No train found.@."
  | Some =
train -> (
    (* get the parameter at index 0 in the `train` directive *)
    match Scfg.Query.get_param 0 train w=
ith
    | Error _e -> Format.printf "Train has no name.@."
    | Ok =
name -> Format.printf "The first train is `%s`.@." name )

For more have a look at the project's README, the documentation or feel = free to ask here ! :partying_face:

Brr 0.0.3, a toolkit for programming browsers

Daniel B=C3=BCnzli announced

It's my pleasure to announce the release 0.0.3 of Brr, a toolkit for programming browsers in OCaml with the js_of_ocaml compiler.

Once it has made it to the repo, install with opam install brr= and consult the API doc= s and manuals (or via odig doc brr).

Among small additions and fixes, this release brings support for js_o= f_ocaml 4.0.0. Thanks to Hugo Heuzard (@hhugo) who has made the ground work in js_of_ocaml this means that:

  1. Brr, js_of_ocaml and (soon) gen_js_api JavaSc= ript bindings can now all be used in the same program without problems (iss= ue #2).
  2. You no longer need to specify the -no-check-prim flag at b= ytecode link time. Linking against the brr library is sufficie= nt, see the build instructions.

The release notes have all the details.

(anonymous?) polymorphic records

nrolland asked

Is there a way to avoid to create records only to preserve polymorphism ?

Say, for this, in haskell style

h :: (forall r. (r -> a) -> (f r ->=
 f b)) -> f a -> f b
h malg =3D malg id

octachron replied

You can use objects, they can have polymorphic methods:

let f (id:<f:'a. 'a ->=
 'a>) =3D id#f 0, id#f "zero"

Ma=C3=ABlan also replied

The following doesn=E2=80=99t help reducing the syntactic noise, but note t= hat when using a record for non-prenex polymorphism like this, your record has only one field and is immutable, so= (with a recent enough OCaml) you can unbox it and get rid of the runtime overhead:

type ('a, 'b) fwrap =3D =
{ f : 'r. ('r -> 'a) -> 'r list -> 'b list } [@@unboxed]

let apply_id : type a b. (a, b) fwrap -> a list -> b list =3D
  fun xs -> w.f Fun.id xs
(* i=
s compiled the same as just: *)
let apply_id_magic : type a b. (a, b) fwrap -> a list -> b list =3D
  fun xs -> (Obj.magic w) Fun.id xs

let mwrap : =
type=
 a. (a, a) fwrap =3D { f =3D List.map }
(* i=
s compiled to nothing at all (alias of List.map). *)

2 postdoc positions on Runtime Verification at CEA LIST, Unive= rsit=C3=A9 Paris-Saclay, France

Julien Signoles announced

The Software Safety and Security Lab at CEA LIST, Universit=C3=A9 Paris-Sac= lay, France has 2 open postdoc positions in the area of runtime verification for code safety and security:

The candidates will:

  • solve challenging research problems;
  • implement their results in Frama-C, an industrial-strength open-source = framework for analyses of C code;
  • evaluate their solutions on concrete benchmarks or/and use cases;
  • publish their results in international conferences and journals.

Strong knowledge in at least one of the following areas is welcome:

  • programming
    • OCaml and C
    • formal semantics
  • formal verification
    • runtime verification, static analysis, formal specification languages, = …
  • compilation
    • code generation, program transformation, type system, …

Interested applicants should send a CV and a motivation letter to Julien Signoles (julien dot signoles at cea dot fr).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 13DAEE037F for ; Tue, 8 Feb 2022 14:16:28 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=uK63=SX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: IOziLJDlQWE1Z0w+nFHQPi10/3LQR8s/j29Q0h3TjnKYSmXAuM153W+uCbsNhTUFFOk4UJNarp Dx+o8b9ZngDO6lBfk+b8Fvz6eUOc9UQKHaI4Y8Lf+SJjGNtlHldBNf0+aOkT8nPhG3AcO6BOa0 r/iaz1FXtGx+TfJEv9jnSUcUAS2H8+G9qodEpibi/v/nUN8aQ8WpKtb0L2Dd8y3TgNGuZlfVSF JLtRKRo8BDkVUlLdqmIxfKmUUXqvkb1XDEXHfDv3jGm2w5v25MtZSQRRnccifhUCUaZtcKRcJh uYb7UvMZ/dnAH0kU6+mabZ2o X-IPAS-Result: =?us-ascii?q?A0AmBwDPbAJihyIeaIFaHAEBATwBAQQEAQECAQEHAQGBc?= =?us-ascii?q?YEfGwIBOy4ZAWRXKwcIQgKEUokGhUUBgkqJTJURAQMBDRICFgEOBQECBAEBh?= =?us-ascii?q?R46AQSDEQIeBgEFMxMBAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIDBAETA?= =?us-ascii?q?QEBAQ0LCQUICgcQDgU8ZGQEgUsEgXQLNA2CIhMMGYNtAwEhCmUjAxsDAgQNA?= =?us-ascii?q?RcBFAoXARIagmoBgxYFCpAOnAyBMYEBg04BAwIBhESBZA0CFIEVAgEBAYYJV?= =?us-ascii?q?EqDAYQGKRCBVUSECAdugkELFwEBAQEBgTsBAYM4gmUEkjkOCzOBAAoGExYBA?= =?us-ascii?q?VgQKFhEBhgtkWEMISWYCJUMNAeDSYE4BguIHYEcjHGEU4NMg3KBTIUXhT2Xe?= =?us-ascii?q?yGWKSCJF4EYgkOUEhYghRaBTiqBfjMaMEOCaQlFAQMCDQECAgMBAgECCQEBA?= =?us-ascii?q?o11AYQYgT6DGzuFS0AzAgEBCSsCBgEKAQEDCYVjAQEFEwsBigtaAQE?= IronPort-PHdr: A9a23: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 icvYlc= IronPort-Data: A9a23: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 kM9ug9uylCtuEY= IronPort-HdrOrdr: A9a23:Pw+SvKiM9tDls4kdhKbW/tsdaHBQXt0ji2hC6mlwRA09TyX4ra CTdZsguiMc5Ax6ZJhCo7G90cu7L080nKQdieIs1NyZMDUO1lHEEKhSqaPchxfgFyf9+uM179 YCT4FOTPvqAxxfhcb+iTPIdurILeP3kpyVuQ== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.88,352,1635199200"; d="scan'208,217";a="5330908" X-MGA-submission: =?us-ascii?q?MDEX8YPRAPS0AqaOlFefodLJJiWHFtmGokqB7/?= =?us-ascii?q?LNFTqw56XA40HLo/f6l+l8hryPNnLfs8Qj9cWTtFQEu9K/TOJgXhI5y3?= =?us-ascii?q?/TgZmL8/HfSkQzjEwPpJ7khuOnYHtYv86bVT5ttEOU/nC4T38x0Qz6+/?= =?us-ascii?q?Dmut2mLcBl8PUun8blbIu8CA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Feb 2022 14:16:27 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C9A09566C4F; Tue, 8 Feb 2022 14:16:25 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 08 Feb 2022 14:16:25 +0100 Message-ID: <87mtj1bis6.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 8 14:16:26 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.111422, queueID=45DC6566C8C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMDEgdG8gMDgsDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkZ1bmN0 b3JpIGlzIGhpcmluZyBmdWxsLXRpbWUgZW5naW5lZXJzIGFuZCBJbnRlcm5zDQpQZXJtYW5lbnQg cG9zaXRpb24gZm9yIENvbXB1dGVyIFNjaWVudGlzdCBpbiBjeWJlcnNlY3VyaXR5IHZlcmlmaWNh dGlvbiBhdCBDRUEgTGlzdCwgRnJhbmNlDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0byBnZW5l cmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVjaWZpY2F0 aW9ucw0KT2xkIENXTg0KDQoNCkZ1bmN0b3JpIGlzIGhpcmluZyBmdWxsLXRpbWUgZW5naW5lZXJz IGFuZCBJbnRlcm5zDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Z1bmN0b3JpLWlzLWhpcmlu Zy1mdWxsLXRpbWUtZW5naW5lZXJzLWludGVybnMvOTI2Ni8xPg0KDQoNCk1vaGFtZWQgSWd1ZXJu bGFsYSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZ1bmN0b3Jp LCBhIHlvdW5nIGFuZCBkeW5hbWljIGNvbXBhbnkgYmFzZWQgaW4gUGFyaXMsIGlzIGhpcmluZw0K ICB0YWxlbnRlZCBlbmdpbmVlcnMvUGhEcyB0byBleHBhbmQgaXRzIHRlYW0uIFBsZWFzZSBmaW5k IG1vcmUgZGV0YWlscw0KICBpbiB0aGUgYW5ub3VuY2VtZW50IChpbiBGcmVuY2gpOg0KICA8aHR0 cHM6Ly9mdW5jdG9yaS5jb20vYW5ub25jZS1yZWNydXRlbWVudC5wZGY+DQoNCiAgV2UgYXJlIGFs c28gbG9va2luZyBmb3IgaW50ZXJucyBpbiB0aGUgZmllbGRzIG9mIHByb2dyYW1taW5nDQogIGxh bmd1YWdlcywgZm9ybWFsIG1ldGhvZHMsIGFuZCBibG9ja2NoYWlucyAoZGV0YWlscyBhdmFpbGFi bGUgb24NCiAgcmVxdWVzdCkuDQoNCiAgRmVlbCBmcmVlIHRvIHNoYXJlIHdpdGggYW55b25lIHdo byBtYXkgYmUgaW50ZXJlc3RlZC4NCg0KDQpQZXJtYW5lbnQgcG9zaXRpb24gZm9yIENvbXB1dGVy IFNjaWVudGlzdCBpbiBjeWJlcnNlY3VyaXR5IHZlcmlmaWNhdGlvbiBhdCBDRUEgTGlzdCwgRnJh bmNlDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIw MjItMDIvbXNnMDAwMDQuaHRtbD4NCg0KDQpBTlRJR05BQyBUaGliYXVkIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2Ugd291bGQgbGlrZSB0byBzaGFyZSB3aXRoIHlvdSBh biBleGNpdGluZyBvcHBvcnR1bml0eSB0byBqb2luIHRoZQ0KICBGcmFtYS1DIHRlYW0gYXQgQ0VB IExpc3QgKGEgRnJlbmNoIHB1YmxpYyByZXNlYXJjaCBpbnN0aXR1dGUpLiBXZSBhcmUNCiAgb3Bl bmluZyBhIHBlcm1hbmVudCBjb21wdXRlciBzY2llbnRpc3QgcG9zaXRpb24gdG8gd29yayBvbiBm b3JtYWwNCiAgdmVyaWZpY2F0aW9uIG9mIGN5YmVyc2VjdXJpdHkgcHJvcGVydGllcy4gTW9yZSBk ZXRhaWxzIGFib3V0IHRoZQ0KICBwb3NpdGlvbiBhbmQgdGhlIHF1YWxpZmljYXRpb25zIGV4cGVj dGVkIGFyZSBhdmFpbGFibGUgaGVyZToNCiAgPGh0dHBzOi8vZnJhbWEtYy5jb20vam9icy8yMDIy LTAyLTAxLXBlcm1hbmVudC1jb21wdXRlci1zY2llbnRpc3QtY3liZXItc2VjdXJpdHktdmVyaWZp Y2F0aW9uLmh0bWw+DQoNCiAgUGxlYXNlIGRvIG5vdCBoZXNpdGF0ZSB0byByZWFjaCBvdXQgb3Ig dG8gc2hhcmUgd2l0aCBwb3RlbnRpYWxseQ0KICBpbnRlcmVzdGVkIHBlb3BsZSENCg0KDQpweW1s X2JpbmRnZW46IGEgQ0xJIGFwcCB0byBnZW5lcmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkg ZnJvbSBPQ2FtbCB2YWx1ZSBzcGVjaWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tcHltbC1iaW5kZ2VuLWEtY2xpLWFwcC10by1nZW5lcmF0ZS1weXRo b24tYmluZGluZ3MtZGlyZWN0bHktZnJvbS1vY2FtbC12YWx1ZS1zcGVjaWZpY2F0aW9ucy84Nzg2 LzU+DQoNCg0KUnlhbiBNb29yZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpOZXcgdmVyc2lvbg0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSB3YW50ZWQgdG8gYW5ub3VuY2UgYSBu ZXcgdmVyc2lvbiBvZiBgcHltbF9iaW5kZ2VuJyBoYXMgYmVlbiBtZXJnZWQNCiAgaW50byB0aGUg b3BhbSByZXBvc2l0b3J5LCB2ZXJzaW9uIDAuMi4wLiAgV2hlbmV2ZXIgaXQgaGl0cywgZmVlbCBm cmVlDQogIHRvIHRyeSBpdCBvdXQhDQoNCiAgVGhlIG1haW4gYWRkaXRpb24gaXMgbm93IHlvdSBj YW4gZW1iZWQgUHl0aG9uIGZpbGVzIGRpcmVjdGx5IGludG8gdGhlDQogIGdlbmVyYXRlZCBPQ2Ft bCBtb2R1bGUgYW5kIGl0IHdpbGwgYmUgZXZhbHVhdGVkIGF0IHJ1biB0aW1lLiAgSW4gdGhpcw0K ICB3YXksIHlvdSBkb24ndCBuZWVkIHlvdXIgdXNlcnMgdG8gbWVzcyB3aXRoIHRoZSBgUFlUSE9O UEFUSCcNCiAgZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgbmVlZCB0aGVtIHRvIGluc3RhbGwgYSBw YXJ0aWN1bGFyIFB5dGhvbg0KICBtb2R1bGUgd2hlbiB1c2luZyB0aGUgZ2VuZXJhdGVkIE9DYW1s IGNvZGUuIChBbm90aGVyIHRoYW5rcyB0bw0KICBVbml4SnVua2llIGFuZCBUaGllcnJ5IE1hcnRp bmV6IGZvciB0aGVpciBoZWxwIHdpdGggdGhpcyEpDQoNCiAgVGhlcmUgd2VyZSBhbHNvIGEgZmV3 IGJ1Z2ZpeGVzIGFuZCBzb21lIG5pY2UgbmV3IFtleGFtcGxlc10gYWRkZWQgdG8NCiAgdGhlIEdp dEh1YiByZXBvc2l0b3J5LiAgT25lIGNvb2wgdGhpbmcgYWJvdXQgdGhlIGV4YW1wbGVzIGlzIHRo YXQgdGhleQ0KICBzaG93IHlvdSBob3cgdG8gc2V0IHVwIHlvdXIgcHJvamVjdCB0byB1c2UgRHVu ZSBydWxlcyB0byBhdXRvbWF0aWNhbGx5DQogIGdlbmVyYXRlIFB5dGhvbiBiaW5kaW5ncyB3aGVu ZXZlciB0aGUgdmFsdWUgc3BlY2lmaWNhdGlvbiBmaWxlcw0KICBjaGFuZ2UhDQoNCg0KW2V4YW1w bGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9tb29yZXJ5YW4vb2NhbWxfcHl0aG9uX2JpbmRnZW4v dHJlZS9tYWluL2V4YW1wbGVzPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3Nh Z2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhl IGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5 b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1 YnNjcmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEg bWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUg YXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVk IG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5y c3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3 cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC8+DQoNCg== --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 01 to 08, 2022.

Functori is hiring full-time engineers and Interns

Mohamed Iguernlala announced

Functori, a young and dynamic company based in Paris, is hiring talented engineers/PhDs to expand its team. Please find more details in the announcement (in French): https://functori.com/annonce-recrutement.pdf

We are also looking for interns in the fields of programming languages, formal methods, and blockchains (details available on request).

Feel free to share with anyone who may be interested.

Permanent position for Computer Scientist in cybersecurity verification at CEA List, France

ANTIGNAC Thibaud announced

We would like to share with you an exciting opportunity to join the Frama-C team at CEA List (a French public research institute). We are opening a permanent computer scientist position to work on formal verification of cybersecurity properties. More details about the position and the qualifications expected are available here: https://frama-c.com/jobs/2022-02-01-permanent-computer-scientist-cyber-security-verification.html

Please do not hesitate to reach out or to share with potentially interested people!

pyml_bindgen: a CLI app to generate Python bindings directly from OCaml value specifications

Ryan Moore announced

New version

I wanted to announce a new version of pyml_bindgen has been merged into the opam repository, version 0.2.0. Whenever it hits, feel free to try it out!

The main addition is now you can embed Python files directly into the generated OCaml module and it will be evaluated at run time. In this way, you don't need your users to mess with the PYTHONPATH environment variable or need them to install a particular Python module when using the generated OCaml code. (Another thanks to UnixJunkie and Thierry Martinez for their help with this!)

There were also a few bugfixes and some nice new examples added to the GitHub repository. One cool thing about the examples is that they show you how to set up your project to use Dune rules to automatically generate Python bindings whenever the value specification files change!

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id A9CAEE6E66 for ; Tue, 22 Feb 2022 13:43:17 +0100 (CET) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=JN+1=TF=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 5ENZk4TkamVVCxWEivXA8HFDxFg4/8viAz9ilUYUI2c20Wn5SQyrdbsdYPg6UWYVWa8uzUJZOs qs7q8OhgaMNOFLE5YB4CjHj0CEqvEl0vDuC3g4zxYjyPdRvKW87HcMaV0VOJy9DhpeU/0VvLrN hhus5pKz/iaRj/+be42ZIvt0umek0qsSiwHrOI85G1MXLTkFIfhlRbFgleTlgH00Gc+h4EThVE 6QI9HBUlV00uSxtqExvppPiZcyf23qVTNnfISo8TWc7h6Cnt0eTdVqA7a+8RYqn8vVJXcB2L/y K2zMYJizkrI0pL+7HnE9odo+ X-IPAS-Result: =?us-ascii?q?A0DYAAD22RRimCIeaIFaFoJNgSFZBigZAWRXFhUHCEKEV?= =?us-ascii?q?IkGhUYBgkqJTIZziByEFoERA08QAQMBDSoBDAcBAgQBAYISgnUCFzoBBIMyA?= =?us-ascii?q?h4GAQUyBg4BAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIDBAETAQEBAQEBA?= =?us-ascii?q?QEJCwkHBgwFEA4FPGRkBIFLBIF0CzQNgiITDAwDA4N0AwEYAQgKZRQPAxQBB?= =?us-ascii?q?gMCBA0BFwEUCgMBEwESGQGCagGDFgUKj1icDIExgQGDTwEDAw0DAQ4JJoNzg?= =?us-ascii?q?WQNAhSBGYYRVUoBgwEJhAYpEIFVRIEVgTyBPm6CWAsBAQEBAYE0BwEBBgIJR?= =?us-ascii?q?YJigmUEk08fBw4fGQYCKQMsBwECDwIHBwwBBwMJCAgGAQEiDRcJAQgtCwsEF?= =?us-ascii?q?SYKBAIODg0fCwcELwOReAcRJpB3hxqCXJFQYTQHg0qBOQYLiB6BHIZ9hXWII?= =?us-ascii?q?INygU6KWJd9IZYtIIIphm4IgQcJgX9ElCkEDyWFAIFOKWxiHAIMBzMaMEOCa?= =?us-ascii?q?QkWLwEDAg0BAgIDAQIBAgkBAQKIHoYLFoEEAQKBdSwogT6BJoF1O4VLQDQCA?= =?us-ascii?q?QEBMwIGAQoBAQMJhWMBAQUTCwGJHAImgURaAQE?= IronPort-PHdr: A9a23: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 FUMQote1HzUFZITihd0LqExqwcVSL0= IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:gvYfrqjcKcG+C0LZwWDfbSm3oXBQXt0ji2hC6mlwRA09TyX4ra CTdZsguiMc5Ax6ZJhCo7G90cu7L080nKQdieIs1NyZMDUO1lHEEKhSqaPchxfgFyf9+uM179 YCT4FOTPvqAxxfhcb+iTPIdurILeP3kpyVuQ== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.88,387,1635199200"; d="scan'208,217";a="6652372" X-MGA-submission: =?us-ascii?q?MDE4zPV0AoB38SkKhdtLoXZFIz9ZyZceTBZkZh?= =?us-ascii?q?QJqG/Fkq3/1h2jt+9sSy3x1rYPc1TzmBub6rgRHLmZQEyRulzUCG050r?= =?us-ascii?q?bLsfq3sBsKcQBfh8+klTiSVvlJ/TyF6J6UVmAfvggbUA6hsNj58hDSHK?= =?us-ascii?q?h3qSh07kZ76CJJYZgq4mZb9g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Feb 2022 13:43:16 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 655CE566737; Tue, 22 Feb 2022 13:43:14 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 22 Feb 2022 13:43:14 +0100 Message-ID: <87o82z9in1.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 22 13:43:14 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.042300, queueID=A4A22566785 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMTUgdG8gMjIsDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9DQU1M IGdvZXMgUXVhbnR1bSBjb21wdXRpbmcNCkxheW91dCBQYXJzaW5nIGFuZCBOaWNlbHkgRm9ybWF0 dGVkIEVycm9yIE1lc3NhZ2VzDQpwdGltZSAxLjAuMCBhbmQgbXRpbWUgMS40LjANClRpbWVkZXNj IDAuNi4wDQpPQ2FtbCBmcm9tIHRoZSBWZXJ5IEJlZ2lubmluZyBub3cgZnJlZSBpbiBQREYgYW5k IEhUTUwgZm9ybWF0cw0KRHVuZSAzLjAuMA0KQmxvZyBQb3N0ICIyMDIxIGF0IE9DYW1sUHJvIg0K UGFja3N0cmVhbSAwLjENCk9DYW1sIDQuMTQuMCwgZmlyc3QgYmV0YSByZWxlYXNlDQpPbGQgQ1dO DQoNCg0KT0NBTUwgZ29lcyBRdWFudHVtIGNvbXB1dGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2Ft bC1nb2VzLXF1YW50dW0tY29tcHV0aW5nLzkzMzMvMT4NCg0KDQpGbG9yaWFuIHNhaWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEl0IHNlZW1zIHRoYXQgc2lsZW50 bHkgT0NBTUwgaXMgbm93IGVudGVyaW5nIHRoZSBRdWFudHVtIHdvcmxkLiAgSXQNCiAgbG9va3Mg dGhhdCB0aGUgSW50ZXJwcmV0ZXIgZm9yICJUd2lzdCIgW05ldyBwcm9ncmFtbWluZyBsYW5ndWFn ZSBmb3INCiAgUXVhbnR1bSBjb21wdXRpbmddIGlzIG1hZGUgd2l0aCBPQ0FNTDogW0dpdEh1YiBm b3IgVHdpc3RdDQoNCg0KW05ldyBwcm9ncmFtbWluZyBsYW5ndWFnZSBmb3IgUXVhbnR1bSBjb21w dXRpbmddDQo8aHR0cHM6Ly9zY2l0ZWNoZGFpbHkuY29tL3R3aXN0LW1pdHMtbmV3LXByb2dyYW1t aW5nLWxhbmd1YWdlLWZvci1xdWFudHVtLWNvbXB1dGluZy8+DQoNCltHaXRIdWIgZm9yIFR3aXN0 XSA8aHR0cHM6Ly9naXRodWIuY29tL3BzZy1taXQvdHdpc3QtcG9wbDIyPg0KDQoNCkFudG9uIEtv Y2hrb3YgdGhlbiBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGFza2VsbCBoYXMgYSBuaWNl IHBhY2thZ2UgZm9yIHF1YW50dW0gY29tcHV0aW5nIC0gUXVpcHBlci4gSQ0KICByZWNvbW1lbmQg dG8gdGFrZSBhIGxvb2sgdG8gaXQgZm9yIGluc3BpcmF0aW9uIGFzIHdlbGw6DQogIOKAoiA8aHR0 cHM6Ly9oYWNrYWdlLmhhc2tlbGwub3JnL3BhY2thZ2UvcXVpcHBlci1sYW5ndWFnZT4NCiAg4oCi IDxodHRwOi8vd3d3Lm1hdGhzdGF0LmRhbC5jYS9+c2VsaW5nZXIvcXVpcHBlci8+DQogIOKAoiA8 aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzEzMDQuMzM5MC5wZGY+DQogIOKAoiA8aHR0cHM6Ly9hcnhp di5vcmcvcGRmLzIxMDUuMDM1MjIucGRmPiAoYSBuZXcgbGFuZ3VhZ2UgdGhhdCByZXVzZXMNCiAg ICBsaW5lYXIgdHlwZXMgaW4gdGhlIEhhc2tlbGwgdG8gcmVwcmVzZW50IHF1YW50dW0gc3BlY2lm aWNzIGR1cmluZw0KICAgIHRoZSBRdWlwcGVyIHR5cGUgY2hlY2spDQoNCg0KTGF5b3V0IFBhcnNp bmcgYW5kIE5pY2VseSBGb3JtYXR0ZWQgRXJyb3IgTWVzc2FnZXMNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWxheW91dC1wYXJzaW5nLWFuZC1uaWNlbHktZm9ybWF0dGVkLWVycm9yLW1l c3NhZ2VzLzkzNDMvMT4NCg0KDQpIYnIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJbiBhIHByZXZpb3VzIFtwb3N0XSBJIGhhdmUgZGVzY3Jp YmVkIG15IHdheSBmcm9tIExBTFIgcGFyc2luZyB0bw0KICBjb21iaW5hdG9yIHBhcnNpbmcuIE5v dyBJIGFtIG1vcmUgYW5kIG1vcmUgY29udmluY2VkIHRoYXQgY29tYmluYXRvcg0KICBwYXJzaW5n IGlzIHJlYWxseSBhIGdvb2QgYW5kIGZsZXhpYmxlIHdheSB0byB3cml0ZSBwYXJzZXJzLiBUaGUg bmV3DQogIHJlbGVhc2UgMC41LjAgb2YgYEZtbGliYCBmb2N1c2VzIG9uIGxheW91dCBwYXJzaW5n IGFuZCBuaWNlbHkNCiAgZm9ybWF0dGVkIGVycm9yIG1lc3NhZ2VzIGJ5IHVzaW5nIGNvbWJpbmF0 b3IgcGFyc2luZy4NCg0KICBUaGUgbGlicmFyeSBjYW4gYmUgaW5zdGFsbGVkIHZpYSBvcGFtIGJ5 IGBvcGFtIGluc3RhbGwgZm1saWInLiBUaGVyZQ0KICBpcyBhIFtnaXRodWIgcmVwb3NpdG9yeV0g aG9zdGluZyB0aGUgc291cmNlIGNvZGUuIFRoZSBbQVBJXSBjYW4gYmUNCiAgZm91bmQgb25saW5l LiBTZWUgYWxzbyBhIFt0dXRvcmlhbF0gb24gY29tYmluYXRvciBwYXJzaW5nLg0KDQoNCltwb3N0 XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9teS13YXktZnJvbS1sYWxyLXBhcnNpbmct dG8tY29tYmluYXRvci1wYXJzaW5nLzczNzc+DQoNCltnaXRodWIgcmVwb3NpdG9yeV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9oYnIvZm1saWI+DQoNCltBUEldIDxodHRwczovL2hici5naXRodWIuaW8v Zm1saWIvb2RvYy9pbmRleC5odG1sPg0KDQpbdHV0b3JpYWxdIDxodHRwczovL2hici5naXRodWIu aW8vZm1saWIvb2RvYy9mbWxpYl9wYXJzZS9wYXJzZS5odG1sPg0KDQpMYXlvdXQgUGFyc2luZw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTW9zdCBwcm9n cmFtbWluZyBsYW5ndWFnZXMgZXhwcmVzcyBoaWVyYXJjaGljYWwgc3RydWN0dXJlcyBieSBzb21l DQogIGtpbmQgb2YgcGFyZW50aGVzZXMuIEFsZ29sIGxpa2UgbGFuZ3VhZ2VzIHVzZSBgYmVnaW4n IGBlbmQnLCBDIGxpa2UNCiAgbGFuZ3VhZ2VzIHVzZSBjdXJseSBicmFjZXMgYHsnLCBgfScgdG8g ZW5jbG9zZSBibG9ja3Mgb2YgY29kZS4gU2luY2UNCiAgYmxvY2tzIGNhbiBiZSBuZXN0ZWQgaW5z aWRlIGJsb2NrcywgdGhlIGhpZXJhcmNoaWNhbCBvciB0cmVlIHN0cnVjdHVyZQ0KICBpcyB3ZWxs IGV4cHJlc3NlZCBieSB0aGUgc3ludGF4Lg0KDQogIEZvciB0aGUgaHVtYW4gcmVhZGVyIGJsb2Nr cyBhcmUgdXN1YWxseSBpbmRlbnRlZCB0byBtYWtlIHRoZQ0KICBoaWVyYXJjaGljYWwgc3RydWN0 dXJlIGdyYXBoaWNhbGx5IHZpc2libGUuIFByb2dyYW1taW5nIGxhbmd1YWdlcyBsaWtlDQogICpI YXNrZWxsKiBhbmQgKlB5dGhvbiogb21taXQgdGhlIHBhcmVudGhlc2VzIGFuZCBleHByZXNzIHRo ZQ0KICBoaWVyYXJjaGljYWwgc3RydWN0dXJlIGJ5IGluZGVudGF0aW9uLiBJLmUuIHRoZSBpbmRl bnRhdGlvbiBpcyBwYXJ0IG9mDQogIHRoZSBncmFtbWFyLiBUaGlzIGlzIHBsZWFzaW5nIHRvIHRo ZSBleWUsIGJlY2F1c2UgbWFueSBwYXJlbnRoZXNlcyBjYW4NCiAgYmUgb21taXR0ZWQuDQoNCiAg VGhlIGhpZXJhcmNoaWNhbCBzdHJ1Y3R1cmUgaW4gdGhlIGZvbGxvd2luZyBzY2hlbWF0aWNhbCBz b3VyY2UgZmlsZSBpcw0KICBpbW1lZGlhdGVseSB2aXNpYmxlIHdpdGhvdXQgdGhlIG5lZWQgb2Yg cGFyZW50aGVzZXMuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB4eHh4eHh4eHh4eA0KICDi lIIgICAgIHh4eA0KICDilIIgICAgIHh4eA0KICDilIIgICAgICAgICB4eHh4eHh4DQogIOKUgiB4 eHh4eHh4eA0KICDilIIgICAgIHh4eA0KICDilJTilIDilIDilIDilIANCg0KICBMb3dlciBsZXZl bCBibG9ja3MgYXJlIGluZGVudGVkIHdpdGggcmVzcGVjdCB0byB0aGVpciBwYXJlbnQgYmxvY2sg YW5kDQogIHNpYmxpbmdzIGF0IHRoZSBzYW1lIGxldmVsIGFyZSB2ZXJ0aWNhbGx5IGFsaWduZWQu DQoNCiAgQmVjYXVzZSBvZiB0aGlzIGdvb2QgcmVhZGFiaWxpdHkgY29uZmlndXJhdGlvbiBsYW5n dWFnZXMgbGlrZSB5YW1sDQogIGhhdmUgYmVjb21lIHZlcnkgcG9wdWxhci4NCg0KICBVbmZvcnR1 bmF0ZWx5IHRoZXJlIGFyZSBub3QgbWFueSBwYXJzZXJzIGF2YWlsYWJsZSB3aGljaCBzdXBwb3J0 DQogIGluZGVudGF0aW9uIHNlbnNpdGl2aXR5LiBUaGUgbGlicmFyeSBbRm1saWJdIGhhcyBzdXBw b3J0IHRvIHBhcnNlDQogIGxhbmd1YWdlcyB3aG9zZSBncmFtbWFyIHVzZXMgaW5kZW50YXRpb24g dG8gc3RydWN0dXJlIGJsb2Nrcw0KICBoaWVyYXJjaGljYWxseS4NCg0KICBUaGVyZSBhcmUgb25s eSAzIGNvbWJpbmF0b3JzIG5lZWRlZCB0byBpbnRyb2R1Y2UgbGF5b3V0IHBhcnNpbmcgaW4NCiAg Y29tYmluYXRvciBwYXJzaW5nLiBTdXBwb3NlIHRoYXQgYHAnIGlzIGEgY29tYmluYXRvciBwYXJz aW5nIGEgY2VydGFpbg0KICBjb250cnVjdC4gVGhlbiB3ZSBoYXZlDQoNCiAg4oCiIGBpbmRlbnQg NCBwJzogUGFyc2UgdGhlIGNvbnN0cnVjdCBkZXNjcmliZWQgYnkgYHAnIGluZGVudGVkIGF0IGxl YXN0DQogICAgNCBjb2x1bW5zIHJlbGF0aXZlIHRvIGl0cyBlbnZpcm9ubWVudA0KDQogIOKAoiBg YWxpZ24gcCc6IFBhcnNlIHRoZSBjb25zdHJ1Y3QgZGVzcmliZWQgYnkgYHAnIGFsaWduZWQgdmVy dGljYWxseQ0KICAgIHdpdGggaXRzIHNpYmxpbmdzDQoNCiAg4oCiIGBkZXRhY2ggcCc6IFBhcnNl IHRoZSBjb25zdHJ1Y3QgZGVzY3JpYmVkIGJ5IGBwJyB3aXRob3V0IGFueQ0KICAgIGluZGVudGF0 aW9uIG9yIGFsaWdubWVudCByZXN0cmljdGlvbnMNCg0KICBJbiBvcmRlciB0byBwYXJzZSBhIGxp c3Qgb2YgfnB+cyB2ZXJ0aWNhbGx5IGFsaWduZWQgYW5kIGluZGVudGVkDQogIHJlbGF0aXZlIHRv IGl0cyBlbnZpcm9ubWVudCBieSBhdCBsZWFzdCBvbmUgY29sdW1uIHdlIGp1c3Qgd3JpdGUNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIG9uZV9vcl9tb3JlIChhbGlnbiBwKSB8PiBpbmRlbnQg MQ0KICDilJTilIDilIDilIDilIANCg0KICBhbmQgcGFyc2UgYSBzdHJ1Y3R1cmUgd2l0aCB0aGUg c2NoZW1hdGljIGxheW91dA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgeHh4eHh4eHgNCiAg 4pSCIA0KICDilIIgICAgIHBwcHBwcHBwDQogIOKUgiANCiAg4pSCICAgICBwcHBwcHANCiAg4pSC IA0KICDilIIgICAgIHBwcHANCiAg4pSCIA0KICDilIIgeHh4eHgNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCg0KW0ZtbGliXQ0KPGh0dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi9vZG9jL2ZtbGliX3Bh cnNlL0ZtbGliX3BhcnNlL2luZGV4Lmh0bWw+DQoNCg0KVXNlciBGcmllbmx5IEVycm9yIE1lc3Nh Z2VzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJdCBpcyBpbXBvcnRhbnQgdG8gZm9y IGEgcGFyc2VyIHdyaXRlciB0byBtYWtlIHN5bnRheCBlcnJvciBtZXNzYWdlcw0KICB1c2VyIGZy aWVuZGx5LiBbRm1saWJdIGhhcyBzb21lIHN1cHBvcnQgdG8gd3JpdGUgZnJpZW5kbHkgZXJyb3IN CiAgbWVzc2FnZXMuIFRoZXJlIGlzIHRoZSBvcGVyYXRvciBgPD8+JyBjb3BpZWQgZnJvbSB0aGUg SGFza2VsbCBsaWJyYXJ5DQogIGBwYXJzZWMnIHdoaWNoIGhlbHBzIHRvIGVxdWlwIGNvbWJpbmF0 b3JzIHdpdGggZGVzY3JpcHRpdmUgZXJyb3INCiAgbWVzc2FnZSBpbiBjYXNlIHRoZXkgZmFpbCB0 byBwYXJzZSB0aGUgY29uc3RydWN0IHN1Y2Nlc3NmdWxseS4NCg0KICBBdCB0aGUgZW5kIG9mIGEg ZmFpbGVkIHBhcnNpbmcsIHRoZSBzeW50YXggKG9yIHNlbWFudGljKSBlcnJvcnMgaGF2ZQ0KICB0 byBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIuIFN1cHBvc2UgdGhlcmUgaXMgYSBjb21iaW5hdG9y IHBhcnNlciBmb3INCiAgYSB5YW1sIGxpa2Ugc3RydWN0dXJlLiBUaGUgbGlicmFyeSB3cml0ZXMg YnkgZGVmYXVsdCBmb3IgeW91IGVycm9yDQogIG1lc3NhZ2VzIGluIHRoZSBmb3JtDQoNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiAxIHwNCiAg4pSCIDIgfCBuYW1lczoNCiAg4pSCIDMgfCAgICAg IC0gQWxpY2UNCiAg4pSCIDMgfCAgICAgIC0gQm9iDQogIOKUgiA0IHwNCiAg4pSCIDUgfCAgIGNh dGVnb3J5OiBlbmNyeXB0aW9uDQogIOKUgiAgICAgICBeDQogIOKUgiANCiAg4pSCIEkgaGF2ZSBl bmNvdW50ZXJlZCBzb21ldGhpbmcgdW5leHBlY3RlZC4gSSB3YXMNCiAg4pSCIGV4cGVjdGluZyBv bmUgb2YNCiAg4pSCIA0KICDilIIgICAgIC0gYXQgMyBjb2x1bW5zIGFmdGVyDQogIOKUgiANCiAg 4pSCICAgICAgICAgLSBzZXF1ZW5jZSBlbGVtZW50OiAiLSA8eWFtbCB2YWx1ZT4iDQogIOKUgiAN CiAg4pSCICAgICAtIGF0IDIgY29sdW1ucyBiZWZvcmUNCiAg4pSCIA0KICDilIIgICAgICAgICAt IGtleSB2YWx1ZSBwYWlyOiAiPGtleT46IDx5YW1sIHZhbHVlPiINCiAg4pSCIA0KICDilIIgICAg IC0gZW5kIG9mIGlucHV0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSByYXcgaW5mb3JtYXRp b24gKGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLCBpbmRpdmlkdWFsIGV4cGVjdGF0aW9ucywNCiAg ZmFpbGVkIGluZGVudGF0aW9uIG9yIGFsaWdubWVudCBleHBlY3RhdGlvbikgaXMgYXZhaWxhYmxl IGFzIHdlbGwgc28NCiAgdGhhdCB5b3UgY2FuIHByZXNlbnQgdGhlIGVycm9yIG1lc3NhZ2VzIHRv IHRoZSB1c2VyIGluIGFueSBkaWZmZXJlbnQNCiAgZm9ybS4NCg0KICBUaGVyZSBpcyBhbHNvIGEg Y29tcG9uZW50IFtGbWxpYl9wcmV0dHldIGluIHRoZSBsaWJyYXJ5IGZvciBwcmV0dHkNCiAgcHJp bnRpbmcgYW55IGFzY2lpIHRleHQuDQoNCg0KW0ZtbGliXQ0KPGh0dHBzOi8vaGJyLmdpdGh1Yi5p by9mbWxpYi9vZG9jL2ZtbGliX3ByZXR0eS9GbWxpYl9wcmV0dHkvaW5kZXguaHRtbD4NCg0KW0Zt bGliX3ByZXR0eV0NCjxodHRwczovL2hici5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxpYl9wcmV0 dHkvRm1saWJfcHJldHR5L2luZGV4Lmh0bWw+DQoNCg0KcHRpbWUgMS4wLjAgYW5kIG10aW1lIDEu NC4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wdGltZS0xLTAtMC1hbmQtbXRpbWUtMS00LTAvOTM0NC8x Pg0KDQoNCkRhbmllbCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQncyBt eSBwbGVhc3VyZSB0byBhbm5vdW5jZSBuZXcgcmVsZWFzZXMgb2YgcHRpbWUgYW5kIG10aW1lLiBQ dGltZQ0KICBhbmQgbXRpbWUgcHJvdmlkZSB0eXBlcyBhbmQgY2xvY2tzIGZvciBQT1NJWCBhbmQg bW9ub3RvbmljIHRpbWUuDQoNCiAgVGhlc2UgcmVsZWFzZXMgY2hhbmdlIHRoZSBKYXZhU2NyaXB0 IHN1cHBvcnQgc3RyYXRlZ3kgZm9yIGNsb2NrcyBieQ0KICBpbXBsZW1lbnRpbmcgdGhlIHByaW1p dGl2ZXMgaW4gcHVyZSBKYXZhU2NyaXB0IGFuZCBsaW5raW5nIHRoZW0gdmlhDQogIGBqc19vZl9v Y2FtbCcuDQoNCiAgVGhpcyBtZWFucyB0aGF0IGJvdGggdGhlIGBwdGltZS5jbG9jay5qc29vJyBh bmQgYG10aW1lLmNsb2NrLmpzb28nDQogIGxpYnJhcmllcyBubyBsb25nZXIgZXhpc3RbXjFdLiBJ bnN0ZWFkIHNpbXBseSB1c2UgdGhlIGBwdGltZS5jbG9jay5vcycNCiAgb3IgYG10aW1lLmNsb2Nr Lm9zJyBsaWJyYXJpZXMgbGlrZSB5b3Ugd291bGQgZG8gZm9yIHlvdXIgcmVndWxhcg0KICBwcm9n cmFtcy4NCg0KICBCeSBzaWRlIGVmZmVjdCwgdGhlIHBhY2thZ2VzIGFsc28gbm8gbG9uZ2VyIGRl cGVuZCBvbiBhbnkgb2YNCiAgYGpzX29mX29jYW1sJydzIHBhY2thZ2VzLg0KDQogIFRoYW5rcyB0 byBIdWdvIEhldXphcmQgKEBoaHVnbykgZm9yIHN1Z2dlc3RpbmcgYW5kIGltcGxlbWVudGluZyB0 aGVzZQ0KICBjaGFuZ2VzLiBUaGFua3MgYWxzbyB0byBKb25haCBCZWNrZm9yZCBmb3IgaGlzIFdp bmRvd3MgYnVpbGQgcGF0Y2hlcy4NCg0KICBPdGhlciBjaGFuZ2VzIGFyZSBkZXNjcmliZWQgaW4g dGhlIHJlbGVhc2Ugbm90ZXMgZm9yIFtgcHRpbWUnXSBhbmQNCiAgW2BtdGltZSddLg0KDQogIEhv bWUgcGFnZXM6IFtwdGltZV0sIFttdGltZV0NCg0KICBEb2NzICYgbWFudWFsczogW3B0aW1lXSwg W210aW1lXSBvciBgb2RpZyBkb2MgcHRpbWUgbXRpbWUnDQoNCiAgSW5zdGFsbDogYG9wYW0gaW5z dGFsbCBwdGltZSBtdGltZScNCg0KICBbXjFdOiBJIGhhZCBpbnRlbmRlZCB0byBvbmx5IGRlcHJl Y2F0ZSB0aGVzZSBsaWJyYXJpZXMgYnkgYHdhcm5pbmcnIGluDQogIHRoZSBgTUVUQScgZmlsZXMg YW5kIHJlcXVpcmluZyB0aGUgcmVwbGFjZW1lbnQgbGlicmFyeSBidXQgaXQgc2VlbXMNCiAgdGhl IHdhcm5pbmcgd29uJ3Qgc2hvdyB1cCBpbiBtYW55IGNvbnRleHRzIGluY2x1ZGluZyBgZHVuZScg YnVpbGRzLiBTbw0KICBhIGJyZWFraW5nIGNoYW5nZSBpdCBpcy4NCg0KDQpbYHB0aW1lJ10NCjxo dHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvcHRpbWUvYmxvYi9tYXN0ZXIvQ0hBTkdFUy5tZCN2 MTAwLTIwMjItMDItMTYtbGEtZm9yY2xhej4NCg0KW2BtdGltZSddDQo8aHR0cHM6Ly9naXRodWIu Y29tL2RidWVuemxpL210aW1lL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQjdjE0MC0yMDIyLTAyLTE3 LWxhLWZvcmNsYXotdnM+DQoNCltwdGltZV0gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJl L3B0aW1lPg0KDQpbbXRpbWVdIDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9tdGltZT4N Cg0KW3B0aW1lXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvcHRpbWUvZG9jPg0KDQpb bXRpbWVdIDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9tdGltZS9kb2M+DQoNCg0KVGlt ZWRlc2MgMC42LjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRpbWVkZXNjLTAt Ni0wLzkzNDkvMT4NCg0KDQpEYXJyZW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2Ug dGhlIHJlbGVhc2Ugb2YgW1RpbWVkZXNjXSAwLjYuMC4NCg0KICBUaW1lZGVzYyBpcyBhIHZlcnkg Y29tcHJlaGVuc2l2ZSBkYXRlIHRpbWUgaGFuZGxpbmcgbGlicmFyeSB3aXRoIGdvb2QNCiAgc3Vw cG9ydCBvZiB0aW1lIHpvbmUuDQoNCg0KW1RpbWVkZXNjXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rh eXBhY2stZGV2L3RpbWVyZT4NCg0KRmVhdHVyZXM6DQrilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICDigKIgVGltZXN0YW1wIGFuZCBkYXRlIHRpbWUgaGFuZGxpbmcgd2l0aCBwbGF0Zm9y bSBpbmRlcGVuZGVudCB0aW1lIHpvbmUNCiAgICBzdXBwb3J0DQogICAg4oCiIFN1YnNldCBvZiB0 aGUgSUFOQSB0aW1lIHpvbmUgZGF0YWJhc2UgaXMgYnVpbHQgaW50byB0aGlzIGxpYnJhcnkNCiAg 4oCiIFN1cHBvcnRzIEdyZWdvcmlhbiBjYWxlbmRhciBkYXRlLCBJU08gd2VlayBkYXRlLCBhbmQg SVNPIG9yZGluYWwNCiAgICBkYXRlDQogIOKAoiBTdXBwb3J0cyBuYW5vc2Vjb25kIHByZWNpc2lv bg0KICDigKIgSVNPODYwMSBwYXJzaW5nIGFuZCBSRkMzMzM5IHByaW50aW5nDQoNCg0KQ2hhbmdl cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyByZWxlYXNlIGFkZHMgYSBmYWlyIG51 bWJlciBvZiBxdWFsaXR5IG9mIGxpZmUgaW1wcm92ZW1lbnRzIGFuZA0KICBhZGRpdGlvbmFsIGZl YXR1cmVzLiBNYW55IHRoYW5rcyB0byBAZ2xlbm5zbCBmb3IgdGhlIHN1Z2dlc3Rpb25zIGFuZA0K ICBmZWVkYmFjayENCg0KICBUaGUgbW9zdCBpbXBvcnRhbnQgc2VjdGlvbnMgb2YgdGhlIGNoYW5n ZWxvZyBhcmUgYXMgZm9sbG93czoNCg0KICDigKIgTWFpbiBicmVha2luZyBjaGFuZ2VzOg0KICAg IOKAoiBDaGFuZ2VzIGluIElTTyB3ZWVrIGRhdGUgZnVuY3Rpb25zIChzaG9ydGluZyBsYWJlbCBm b3IgYXJndW1lbnRzLA0KICAgICAgcXVhbGl0eSBvZiBsaWZlIGNoYW5nZXMpDQogICAg4oCiIFJl bW92ZWQgYF9kYXRlJyBzdWZmaXggaW4gbmFtZXMgb2YgYERhdGUuWW1kX2RhdGUnIGFuZA0KICAg ICAgYERhdGUuSVNPX29yZF9kYXRlJw0KICDigKIgQWRkZWQgInBhcnRpYWwgZGF0ZSIgbW9kdWxl cyB3aXRoIElTTzg2MDEgcGFyc2luZyBhbmQgcHJpbnRpbmcNCiAgICBmYWNpbGl0aWVzDQogICAg 4oCiIGBJU09fd2VlaycNCiAgICDigKIgYFltJw0KICDigKIgQWRkZWQgYWRkaXRpb25hbCBJU084 NjAxIHByaW50aW5nIGZhY2lsaXRpZXMgZm9yIGFsbCB0aHJlZSBjYWxlbmRhcg0KICAgIHN5c3Rl bXMNCiAgICDigKIgYERhdGUuWW1kLnBwL3RvX2lzbzg2MDEnICh0aGVzZSBhcmUganVzdCBhbGlh c2VzIHRvIHRoZSBSRkMzMzM5DQogICAgICBwcmludGVycykNCiAgICDigKIgYERhdGUuSVNPX3dl ZWtfZGF0ZS5wcC90b19pc284NjAxJw0KICAgIOKAoiBgRGF0ZS5JU09fb3JkLnBwL3RvX2lzbzg2 MDEnDQogIOKAoiBBZGRlZCBhZGRpdGlvbmFsIElTTzg2MDEgcGFyc2luZyBmYWNpbGl0aWVzIGZv ciBhbGwgdGhyZWUgY2FsZW5kYXINCiAgICBzeXN0ZW1zDQogICAg4oCiIGBEYXRlLlltZC5vZl9p c284NjAxW19leG5dJw0KICAgIOKAoiBgRGF0ZS5JU09fd2Vla19kYXRlLm9mX2lzbzg2MDFbX2V4 bl0nDQogICAg4oCiIGBEYXRlLklTT19vcmQub2ZfaXNvODYwMVtfZXhuXScNCiAg4oCiIEFkZGVk IGFkZGl0aW9uYWwgY29tcGFyaXNvbiBmdW5jdGlvbnMgdG8gYERhdGUnDQogICAg4oCiIGBsdCcs IGBsZScsIGBndCcsIGBnZScsIGBjb21wYXJlJw0KICDigKIgQWRkZWQgYXJpdGhlbXRpYyBmdW5j dGlvbnMgdG8gYERhdGUnDQogIOKAoiBBZGRlZCBgcHAvdG9faXNvODYwMScgZnVuY3Rpb25zIGFz IGFsaWFzZXMgdG8gdGhlIHJmYzMzMzkgZnVuY3Rpb25zDQogICAgdG8gYFRpbWVkZXNjJw0KICDi gKIgUGF0Y2hlZCBJU084NjAxIHBhcnNlcnMgYW5kIFJGQzMzMzkvSVNPODYwMSBwcmludGVycyB0 byBoYW5kbGUNCiAgICBzZWNvbmQgbGV2ZWwgdGltZSB6b25lIG9mZnNldA0KICAgIOKAoiBSYXJl IG9jY3VycmVuY2UgaW4gdHpkYiBidXQgcGlja2VkIHVwIGJ5IHNvbWUgbmV3IHRlc3RzDQoNCg0K T0NhbWwgZnJvbSB0aGUgVmVyeSBCZWdpbm5pbmcgbm93IGZyZWUgaW4gUERGIGFuZCBIVE1MIGZv cm1hdHMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3Qvb2NhbWwtZnJvbS10aGUtdmVyeS1iZWdpbm5pbmctbm93LWZyZWUtaW4tcGRm LWFuZC1odG1sLWZvcm1hdHMvOTM2MS8xPg0KDQoNCkpvaG4gV2hpdGluZ3RvbiBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcyB0byBhIGdyYW50IGZyb20gdGhlIFtPQ2Ft bCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSwgSSBhbSBhYmxlIHRvDQogIHJlbGVhc2UgbXkgYm9vayBb T0NhbWwgZnJvbSB0aGUgVmVyeSBCZWdpbm5pbmddIGF0IG5vIGNvc3QgaW4gaXRzDQogIGV4aXN0 aW5nIFBERiBmb3JtYXQsIGFuZCBpbiBhIG5ldyBIVE1MIGZvcm1hdCB0b28uDQoNCiAgWW91IGNh biBmaW5kIGl0IGhlcmU6DQogIFtodHRwczovL2pvaG53aGl0aW5ndG9uLm5ldC9vY2FtbGZyb210 aGV2ZXJ5YmVnaW5uaW5nL10uDQoNCiAgVGhlIHBhcGVyYmFjayBhbmQgS2luZGxlIHZlcnNpb25z IGNvbnRpbnVlIHRvIGJlIGF2YWlsYWJsZSBmcm9tIEFtYXpvbg0KICBhcyBiZWZvcmUuDQoNCiAg VGhlIGJvb2sgaGFzIHJlY2VudGx5IGJlZW4gdXBkYXRlZCB0byBtYWtlIGl0IHJlYWR5IGZvciBP Q2FtbCA0LjE0DQogIHdoaWNoIGludm9sdmVkIG9ubHkgbWlub3IgY2hhbmdlcyB0byBlcnJvciBo YW5kbGluZyBhbmQgd2FybmluZ3MuIEkNCiAgaGF2ZSBhbHNvIG9wZW5lZCB0aGUgW3NvdXJjZV0u DQoNCg0KW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb25dIDxodHRwczovL29jYW1sLXNmLm9yZy8+ DQoNCltPQ2FtbCBmcm9tIHRoZSBWZXJ5IEJlZ2lubmluZ10gPGh0dHBzOi8vb2NhbWwtYm9vay5j b20+DQoNCltodHRwczovL2pvaG53aGl0aW5ndG9uLm5ldC9vY2FtbGZyb210aGV2ZXJ5YmVnaW5u aW5nL10NCjxodHRwczovL2pvaG53aGl0aW5ndG9uLm5ldC9vY2FtbGZyb210aGV2ZXJ5YmVnaW5u aW5nLz4NCg0KW3NvdXJjZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hud2hpdGluZ3Rvbi9tbGJv b2s+DQoNCg0KRHVuZSAzLjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTAtMC85Mzc0 LzE+DQoNCg0KUnVkaSBHcmluYmVyZyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE9uIGJl aGFsZiBvZiB0aGUgZHVuZSB0ZWFtLCBJ4oCZbSBkZWxpZ2h0ZWQgdG8gYW5ub3VuY2UgdGhlIGF2 YWlsYWJpbGl0eQ0KICBvZiBkdW5lIDMuMC4NCg0KICBUaGUgdGVhbSBoYXMgYmVlbiB3b3JraW5n IG9uIHRoaXMgcmVsZWFzZSBmb3Igb3ZlciA2IG1vbnRocywgYW5kDQogIHRoZXJl4oCZcyBhIGJ1 bmNoIG9mIG5ldyB3b3JrIHRvIHJlcG9ydC4gSeKAmWxsIG9ubHkgaGlnaGxpZ2h0IHRoZSBzb21l IG9mDQogIHRoZSBpbnRlcmVzdGluZyBuZXcgZGV2ZWxvcG1lbnRzOg0KDQogIOKAoiBUaGUgd2F0 Y2ggbW9kZSBoYXMgYmVlbiByZXdyaXR0ZW4gZnJvbSBzY3JhdGNoIHRvIGJlIGZhc3RlciBhbmQg bW9yZQ0KICAgIHNjYWxhYmxlLiBXZSBhbHNvIG5vIGxvbmdlciByZWx5IG9uIGFueSAzcmQgcGFy dHkgdG9vbHMgc3VjaCBhcw0KICAgIGZzd2F0Y2guIElmIGFueSBvZiB5b3Ugc3RpbGwgaGF2ZSBh IGR1bmUgd29ya3NwYWNlIGR1bmUgaXMgc3RpbGwNCiAgICBzdHJ1Z2dsaW5nIHdpdGgsIHdlIGNh bm5vdCB3YWl0IHRvIGhlYXIgZnJvbSB5b3UuDQoNCiAg4oCiIFRoZSB3YXRjaCBtb2RlIG5vdyBh bHNvIHN0YXJ0cyBhbiBSUEMgc2VydmVyIGluIHRoZSBiYWNrZ3JvdW5kLiBUaGlzDQogICAgUlBD IHByb3RvY29sIGlzIGdvaW5nIHRvIGJlIHRoZSBiYXNpcyBmb3Igb3RoZXIgdG9vbHMgdG8gaW50 ZXJhY3QNCiAgICB3aXRoIGR1bmUuIFdhdGNoIG91dCBmb3IgYW5ub3VuY2VtZW50IG9uIHRoZSBM U1Agc2lkZSB0byBzZWUgaG93DQogICAgd2XigJlsbCBiZSBtYWtpbmcgdXNlIG9mIGl0IHRvIGlt cHJvdmUgdGhlIGVkaXRpbmcgZXhwZXJpZW5jZS4NCg0KICDigKIgVGhlIGR1bmUgY2FjaGUgaGFz IGJlZW4gcmV3cml0dGVuIGFzIHdlbGwuIEl0IGlzIG5vdyBzaW1wbGVyIGFuZA0KICAgIG1vcmUg cmVsaWFibGUuIFRoZXJlIGFyZSBzdGlsbCBzb21lIGNvbXBvbmVudHMgbWlzc2luZywgc3VjaCBh cw0KICAgIGRpc3RyaWJ1dGlvbiBvZiB0aGUgYXJ0aWZhY3RzIG9uIHRoZSBuZXR3b3JrLiBOZXZl cnRoZWxlc3MsIHdlDQogICAgd2VsY29tZSB5b3UgYWxsIHRvIGV4cGVyaW1lbnQgd2l0aCB0aGlz IGZlYXR1cmUgYW5kIGdpdmUgdXMNCiAgICBmZWVkYmFjay4NCg0KICDigKIgV2XigJl2ZSBhZGRy ZXNzZWQgb25lIG9mIG91ciBvbGRlc3QgZmVhdHVyZSByZXF1ZXN0czogaGlnaCBsZXZlbCBydWxl cw0KICAgIGZvciBjdHlwZXMgcHJvamVjdHMuIFRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmlt ZW50YWwsIHNvIHdlIG5lZWQNCiAgICBmZWVkYmFjayBmcm9tIHJlYWwgd29ybGQgcHJvamVjdHMg YmVmb3JlIGRlY2xhcmluZyBpdCBhcyBtYXR1cmUuDQoNCiAgT2YgY291cnNlLCB0aGVyZSBhcmUg bWFueSBvdGhlciBmaXhlcywgZW5oYW5jZW1lbnRzLCBhbmQgb25seSBhIGZldw0KICBicmVha2lu ZyBjaGFuZ2VzIGluIHRoaXMgcmVsZWFzZS4gV2UgaG9wZSB5b3UgaGF2ZSBhbiBlYXN5IHRpbWUN CiAgdXBncmFkaW5nLg0KDQogIEhhcHB5IEhhY2tpbmcuDQoNCiAgL0VkaXRvcuKAmXMgbm90ZTog Zm9yIHRoZSBmdWxsIGNoYW5nZWxvZywgcGxlYXNlIGZvbGxvdyB0aGUgYXJjaGl2ZSBsaW5rDQog IGFib3ZlLi8NCg0KDQpCbG9nIFBvc3QgIjIwMjEgYXQgT0NhbWxQcm8iDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Jsb2ctcG9zdC0yMDIxLWF0LW9jYW1scHJvLzkzOTAvMT4NCg0KDQpGYWJyaWNlIExlIEZl c3NhbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBqdXN0 IHB1Ymxpc2hlZCBhIHJldmlldyBvZiB3aGF0IE9DYW1sUHJvIGRpZCBpbiAyMDIxOg0KDQogIDxo dHRwczovL3d3dy5vY2FtbHByby5jb20vYmxvZy8yMDIyXzAxXzMxXzIwMjFfYXRfb2NhbWxwcm8+ DQoNCiAgQSBsb3Qgb2YgT0NhbWwsIGJ1dCBhbHNvIHNvbWUgUnVzdCwgQ29ib2wsIFNvbGlkaXR5 LCBhbmQgYSBsb3Qgb2YNCiAgRm9ybWFsIFZlcmlmaWNhdGlvbiEgT0NhbWxQcm8gaXMgYWx3YXlz IGxvb2tpbmcgZm9yIHNraWxsZWQgT0NhbWwNCiAgZGV2ZWxvcGVycyB0byBoaXJlLCBzbyBpZiB5 b3UgYXJlIGludGVyZXN0ZWQsIGNvbnRhY3QgdXMgYXQNCiAgY29udGFjdEBvY2FtbHByby5jb20N Cg0KDQpQYWNrc3RyZWFtIDAuMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcGFj a3N0cmVhbS0wLTEvOTM5Mi8xPg0KDQoNClRvbWFzeiBCYXJhxYRza2kgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBJIGhhdmUgYSBwbGVhc3VyZSB0byBhbm5vdW5jZSB0aGUgcmVs ZWFzZSBvZiBbUGFja3N0cmVhbV0gMC4xLg0KDQogIFBhY2tzdHJlYW0gaXMgYSBsaWJyYXJ5IHRv IHBhcnNlL3NlcmlhbGl6ZSBbUGFja3N0cmVhbSBiaW5hcnkgZm9ybWF0XS4NCg0KICBUaGlzIGlz IHRoZSBpbml0aWFsIHJlbGVhc2UuIEl0IGlzIGZ1bmN0aW9uYWwgYnV0IHZlcnkgdmVyeSBsaW1p dGVkIGluDQogIHNjb3BlLiBJdCBhbGxvd3MgcGFyc2luZyBhIGJpbmFyeSBzdHJlYW0gaW50byBh IFBhY2tzdHJlYW0gZGF0YXR5cGUNCiAgYW5kIHNlcmlhbGl6aW5nIHRoZSBkYXRhdHlwZSBpbnRv IGEgYmluYXJ5IHN0cmVhbS4NCg0KDQpbUGFja3N0cmVhbV0gPGh0dHBzOi8vZ2l0aHViLmNvbS90 b21vYi9wYWNrc3RyZWFtPg0KDQpbUGFja3N0cmVhbSBiaW5hcnkgZm9ybWF0XQ0KPGh0dHBzOi8v NzY4Ny5vcmcvcGFja3N0cmVhbS9wYWNrc3RyZWFtLXNwZWNpZmljYXRpb24tMS5odG1sPg0KDQoN Ck9DYW1sIDQuMTQuMCwgZmlyc3QgYmV0YSByZWxlYXNlDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L29jYW1sLTQtMTQtMC1maXJzdC1iZXRhLXJlbGVhc2UvOTM5Ni8xPg0KDQoNCm9jdGFj aHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWxlYXNlIG9mIE9DYW1sIDQuMTQuMCBpcyBjbG9z ZS4NCg0KICBUaGUgc2V0IG9mIG5ldyBmZWF0dXJlcyBoYXMgYmVlbiBzdGFiaWxpemVkLCBhbmQg bW9zdCBvcGFtIHBhY2thZ2VzDQogIGFscmVhZHkgd29yayB3aXRoIHRoaXMgcmVsZWFzZS4gQWZ0 ZXIgdHdvIGFscGhhIHJlbGVhc2VzLCB3ZSBoYXZlDQogIGNyZWF0ZWQgYSBmaXJzdCBiZXRhIHZl cnNpb24gdG8gaGVscCB5b3UgdXBkYXRlIHlvdXIgc29mdHdhcmVzIGFuZA0KICBsaWJyYXJpZXMg YWhlYWQgb2YgdGhlIHJlbGVhc2UuDQoNCiAgSWYgeW91IGZpbmQgYW55IGJ1Z3MsIHBsZWFzZSBy ZXBvcnQgdGhlbSBhdDoNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cz4NCg0KICBUaGUgZnVsbCByZWxlYXNlIG9mIE9DYW1sIDQuMTQuMCBpcyBjdXJyZW50bHkgZXhw ZWN0ZWQgZm9yIHRoZSBtaWRkbGUNCiAgb2YgTWFyY2guDQoNCiAgQ29tcGFyZWQgdG8gdGhlIGxh c3QgYWxwaGEsIHdlIGhhdmUgYSBsYXN0IG1pbnV0ZSBjb3JyZWN0aW9uIGZvciBvbmUNCiAgb2Yg dGhlIG5ldyBmdW5jdGlvbiBpbiB0aGUgU2VxIG1vZHVsZSwgc29tZSBkb2N1bWVudGF0aW9uDQog IGltcHJvdmVtZW50cywgZmV3IGNvbmZpZ3VyYXRpb24gYW5kIGludGVybmFsIHR3ZWFrcy4NCg0K DQpJbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUg YmFzZSBjb21waWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dpdGNoIHdpdGggdGhl DQogIGZvbGxvd2luZyBjb21tYW5kcw0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1 cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjE0LjB+YmV0YTEgLS1yZXBvc2l0b3Jp ZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1y ZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgV2l0aCBvcGFtIDIuMSwgdGhlIHBy ZXZpb3VzIGNvbW1hbmQgbGluZSBjYW4gYmUgc2ltcGxpZmllZCB0bw0KICDilIzilIDilIDilIDi lIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNC4xNC4wfmJl dGExDQogIOKUlOKUgOKUgOKUgOKUgA0KICBJZiB5b3Ugd2FudCB0byB0d2VhayB0aGUgY29uZmln dXJhdGlvbiBvZiB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc3dpdGNoDQogIHRvIHRoZSBvcHRpb24g dmFyaWFudCB3aXRoOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg 4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA8c3dpdGNoX25hbWU+IC0tcGFja2FnZXM9b2NhbWwtdmFy aWFudHMuNC4xNC4wfmJldGExK29wdGlvbnMsPG9wdGlvbl9saXN0Pg0KICDilIIgLS1yZXBvc2l0 b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtYmV0 YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDilIANCiAgb3Igd2l0aCBvcGFtIDIuMToN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0Y2gg Y3JlYXRlIDxzd2l0Y2hfbmFtZT4gb2NhbWwtdmFyaWFudHMuNC4xNC4wfmJldGExK29wdGlvbnMg PG9wdGlvbl9saXN0Pg0KICDilJTilIDilIDilIDilIANCg0KICB3aGVyZSBgPG9wdGlvbl9saXN0 PicgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9uLSonDQogIHBhY2th Z2VzLiBGb3IgaW5zdGFuY2UsIGZvciBhIGZsYW1iZGEgYW5kIG5vLWZsYXQtZmxvYXQtYXJyYXkg c3dpdGNoOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjE0 LjB+YmV0YTErZmxhbWJkYStuZmZhIG9jYW1sLXZhcmlhbnRzLjQuMTQuMH5iZXRhMStvcHRpb25z IG9jYW1sLW9wdGlvbi1mbGFtYmRhDQogIOKUgiBvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1h cnJheQ0KICDilJTilIDilIDilIDilIANCiAgQWxsIGF2YWlsYWJsZSBvcHRpb25zIGNhbiBiZSBs aXN0ZWQgd2l0aCBgb3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9uJy4NCg0KICBUaGUgc291cmNlIGNv ZGUgZm9yIHRoZSBiZXRhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJlc3NlczoNCg0K ICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQuMTQuMC1iZXRh MS50YXIuZ3o+DQogIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1s LTQuMTQvb2NhbWwtNC4xNC4wfmJldGExLnRhci5nej4NCg0KDQpDaGFuZ2VzIGNvbXBhcmVkIHRv IHRoZSBsYXN0IGFscGhhDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgZm9yIE9DYW1sIDQuMTQgaXMgYXZh aWxhYmxlIGF0DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi80LjE0L0No YW5nZXM+DQoNCg0KU3RhbmRhcmQgbGlicmFyeQ0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiICphZGRpdGlvbmFsIGZpeGVzKiBbMTA1ODNd LCArWzEwOTk4XTogQWRkIG92ZXIgNDAgbmV3IGZ1bmN0aW9ucyBpbg0KICAgICBTZXEuIChGcmFu w6dvaXMgUG90dGllciBhbmQgU2ltb24gQ3J1YW5lcywgcmV2aWV3IGJ5IE5pY29sw6FzIE9qZWRh DQogICAgIELDpHIsIERhbmllbCBCw7xuemxpLCBOYcOrbGEgQ291cmFudCwgQ3JhaWcgRmVyZ3Vz b24sIFdpa3RvciBLdWNodGEsDQogICAgIFhhdmllciBMZXJveSwgR3VpbGxhdW1lIE11bmNoLU1h Y2NhZ25vbmksIFJhcGhhw6tsIFByb3VzdCwgR2FicmllbA0KICAgICBTY2hlcmVyIGFuZCBUaGll cnJ5IE1hcnRpbmV6KQ0KDQoNClsxMDU4M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTA1ODM+DQoNClsxMDk5OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTA5OTg+DQoNCg0KRG9jdW1lbnRhdGlvbg0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiIFsxMDM5N106IERvY3VtZW50IGV4Y2VwdGlvbnMg cmFpc2VkIGJ5IFVuaXggbW9kdWxlIGZ1bmN0aW9ucyBvbg0KICAgIFdpbmRvd3MgKE1hcnRpbiBK YW1ib24sIHJldmlldyBieSBEYW5pZWwgQsO8bnpsaSwgRGF2aWQgQWxzb3BwLA0KICAgIERhbWll biBEb2xpZ2V6LCBYYXZpZXIgTGVyb3ksIGFuZCBGbG9yaWFuIEFuZ2VsZXR0aSkNCg0KICDigKIg WzEwNzk0XTogQ2xhcmlmeSB3YXJuaW5nIDU3IChBbWJpZ3VvdXMgb3ItcGF0dGVybiB2YXJpYWJs ZXMgdW5kZXINCiAgICBndWFyZCkgKFdpa3RvciBLdWNodGEsIHJldmlldyBieSBHYWJyaWVsIFNj aGVyZXIpDQoNCg0KWzEwMzk3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMDM5Nz4NCg0KWzEwNzk0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMDc5ND4NCg0KDQpCdWlsZCBzeXN0ZW0NCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhA0KDQogIOKAoiBbMTA4MjhdIEJ1aWxkIG5hdGl2ZS1jb2RlIGNvbXBpbGVycyBvbiBP cGVuQlNEL2FhcmNoNjQgKENocmlzdG9waGVyDQogICAgWmltbWVybWFubikNCg0KICDigKIgWzEw ODM1XSBEaXNhYmxlIERUX1RFWFRSRUwgd2FybmluZ3Mgb24geDg2IDMyIGJpdCBhcmNoaXRlY3R1 cmUgYnkNCiAgICBwYXNzaW5nIC1XbCwteixub3RleHQgaW4gbWtzaGFyZWRsaWIgYW5kIG1rbWFp bmRsbC4gRml4ZXMgcmVsb2NhdGlvbg0KICAgIGlzc3VlcywgcmVwb3J0ZWQgaW4gWzk4MDBdLCBt YWtpbmcgbG9jYWwgcGF0Y2hlcyBpbiBEZWJpYW4sIEFscGluZSwNCiAgICBhbmQgRnJlZUJTRCBz dXBlcmZsdW91cy4gKEhhbm5lcyBNZWhuZXJ0IHdpdGggS2F0ZSBEZXBsYWl4IGFuZA0KICAgIFN0 w6lwaGFuZSBHbG9uZHUsIHJldmlldyBieSBYYXZpZXIgTGVyb3kpDQoNCg0KWzEwODI4XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDgyOD4NCg0KWzEwODM1XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDgzNT4NCg0KWzk4MDBdIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk4MDA+DQoNCg0KQ29kZSBnZW5lcmF0 aW9uDQrilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICDi gKIgWzEwNzE5XTogRW5zdXJlIHRoYXQgYnVpbGRfYXBwbHkgcmVzcGVjdHMgTGFtYmRhLm1heF9h cml0eSAoU3RlcGhlbg0KICAgIERvbGFuLCByZXZpZXcgYnkgWGF2aWVyIExlcm95KQ0KDQoNClsx MDcxOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA3MTk+DQoNCg0K SW50ZXJuYWwvY29tcGlsZXItbGlicw0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiICphZGRpdGlvbmFsIGZp eGVzKiBbMTA3MThdLCArWzExMDEyXTogQWRkICJTaGFwZSIgaW5mb3JtYXRpb24gdG8gdGhlDQog ICAgIGNtdCBmaWxlcy4gU2hhcGVzIGFyZSBhbiBhYnN0cmFjdGlvbiBvZiBtb2R1bGVzIHRoYXQg Y2FuIGJlIHVzZWQgYnkNCiAgICAgZXh0ZXJuYWwgdG9vbGluZyB0byBwZXJmb3JtIGRlZmluaXRp b24tYXdhcmUgb3BlcmF0aW9ucy4gKFVseXNzZQ0KICAgICBHw6lyYXJkLCBUaG9tYXMgUmVmaXMg YW5kIExlbyBXaGl0ZSwgcmV2aWV3IGJ5IEZsb3JpYW4gQW5nZWxldHRpKQ0KDQoNClsxMDcxOF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA3MTg+DQoNClsxMTAxMl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEwMTI+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 15 to 22, 20= 22.

OCAML goes Quantum computing

Anton Kochkov then added

Haskell has a nice package for quantum computing - Quipper. I recommend to = take a look to it for inspiration as well:

Layout Parsing and Nicely Formatted Error Messages

Hbr announced

In a previous post I have described my way from LALR parsing to combinator parsing. Now I am more and more convinced that combinator parsing is really= a good and flexible way to write parsers. The new release 0.5.0 of `Fmlib` fo= cuses on layout parsing and nicely formatted error messages by using combinator parsing.

The library can be installed via opam by opam install fmlib. T= here is a github repository hosting the source code. The API can be foun= d online. See also a tutor= ial on combinator parsing.

Layout Parsing

Most programming languages express hierarchical structures by some kind of parentheses. Algol like languages use begin end, = C like languages use curly braces {, } to enclose blocks of code. Since bloc= ks can be nested inside blocks, the hierarchical or tree structure is well expressed by the syntax.

For the human reader blocks are usually indented to make the hierarchical structure graphically visible. Programming languages like Haskell and Python ommit the parentheses and express the hierarchical structure = by indentation. I.e. the indentation is part of the grammar. This is pleasing = to the eye, because many parentheses can be ommitted.

The hierarchical structure in the following schematical source file is immediately visible without the need of parentheses.

xxxxxxxxxxx
    xxx
    xxx
        xxxxxxx
xxxxxxxx
    xxx

Lower level blocks are indented with respect to their parent block and sibl= ings at the same level are vertically aligned.

Because of this good readability configuration languages like yaml have become very popular.

Unfortunately there are not many parsers available which support indentation sensitivity. The library Fmlib has support to parse languages whose grammar uses indentation to structure blocks hierarch= ically.

There are only 3 combinators needed to introduce layout parsing in combinat= or parsing. Suppose that p is a combinator parsing a certain cont= ruct. Then we have

  • indent 4 p: Parse the construct described by p indented at least 4 columns relative to its environment
  • align p: Parse the construct desribed by p al= igned vertically with its siblings
  • detach p: Parse the construct described by p = without any indentation or alignment restrictions

In order to parse a list of ~p~s vertically aligned and indented relative t= o its environment by at least one column we just write

one_or_more (align p) |> indent 1

and parse a structure with the schematic layout

xxxxxxxx

    pppppppp

    pppppp

    pppp

xxxxx

User Frienly Error Messages

It is important to for a parser writer to make syntax error messages user friendly. Fmlib has some support to write friendly error messages. There is the operator <?> copie= d from the Haskell library parsec which helps to equip combinators with descriptive error message in case they fail to parse the c= onstruct successfully.

At the end of a failed parsing, the syntax (or semantic) errors have to be presented to the user. Suppose there is a combinator parser for a yaml like structure. The library writes by default for you error messages in the form

1 |
2 | names:
3 |      - Alice
3 |      - Bob
4 |
5 |   category: encryption
      ^

I have encountered something unexpected. I was
expecting one of

    - at 3 columns after

        - sequence element: "- <yaml value>"

    - at 2 columns before

        - key value pair: "<key>: <yaml value>"

    - end of input

The raw information (line and column numbers, individual expectations, fail= ed indentation or alignment expectation) is available as well so that you can present the error messages to the user in any different form.

There is also a component Fmlib_pretty in the library for pretty printing any ascii text.

ptime 1.0.0 and mtime 1.4.0

Daniel B=C3=BCnzli announced

It's my pleasure to announce new releases of ptime and mtime. Ptime and mti= me provide types and clocks for POSIX and monotonic time.

These releases change the JavaScript support strategy for clocks by impleme= nting the primitives in pure JavaScript and linking them via js_of_ocaml.

This means that both the ptime.clock.jsoo and mtime.cloc= k.jsoo libraries no longer exist[^1]. Instead simply use the ptime.clock.os or mtime.clock.os libraries li= ke you would do for your regular programs.

By side effect, the packages also no longer depend on any of js_of_o= caml's packages.

Thanks to Hugo Heuzard (@hhugo) for suggesting and implementing these chang= es. Thanks also to Jonah Beckford for his Windows build patches.

Other changes are described in the release notes for <= code>ptime and mtime.

Home pages: ptime, mtime

Docs & manuals: pti= me, mtime or odig doc ptime mtime

Install: opam install ptime mtime

[^1]: I had intended to only deprecate these libraries by warning in the META files and requiring the replacement library bu= t it seems the warning won't show up in many contexts including dune<= /code> builds. So a breaking change it is.

Timedesc 0.6.0

Darren announced

I am pleased to announce the release of Timedesc 0.6.0.

Timedesc is a very comprehensive date time handling library with good suppo= rt of time zone.

Features:

  • Timestamp and date time handling with platform independent time zone su= pport
    • Subset of the IANA time zone database is built into this library
  • Supports Gregorian calendar date, ISO week date, and ISO ordinal date
  • Supports nanosecond precision
  • ISO8601 parsing and RFC3339 printing

Changes

This release adds a fair number of quality of life improvements and additio= nal features. Many thanks to @glennsl for the suggestions and feedback!

The most important sections of the changelog are as follows:

  • Main breaking changes:
    • Changes in ISO week date functions (shorting label for arguments, quali= ty of life changes)
    • Removed _date suffix in names of Date.Ymd_date and Date.ISO_ord_date
  • Added "partial date" modules with ISO8601 parsing and printing faciliti= es
    • ISO_week
    • Ym
  • Added additional ISO8601 printing facilities for all three calendar sys= tems
    • Date.Ymd.pp/to_iso8601 (these are just aliases to the RFC3= 339 printers)
    • Date.ISO_week_date.pp/to_iso8601
    • Date.ISO_ord.pp/to_iso8601
  • Added additional ISO8601 parsing facilities for all three calendar syst= ems
    • Date.Ymd.of_iso8601[_exn]
    • Date.ISO_week_date.of_iso8601[_exn]
    • Date.ISO_ord.of_iso8601[_exn]
  • Added additional comparison functions to Date
    • lt, le, gt, ge, compare
  • Added arithemtic functions to Date
  • Added pp/to_iso8601 functions as aliases to the rfc3339 fu= nctions to Timedesc
  • Patched ISO8601 parsers and RFC3339/ISO8601 printers to handle second l= evel time zone offset
    • Rare occurrence in tzdb but picked up by some new tests

OCaml from the Very Beginning now free in PDF and HTML formats=

John Whitington announced

Thanks to a grant from the OCaml Software= Foundation, I am able to release my book OCaml from the Very Beginning at no cost in its existing PDF format, and in a= new HTML format too.

You can find it here: https://j= ohnwhitington.net/ocamlfromtheverybeginning/.

The paperback and Kindle versions continue to be available from Amazon as b= efore.

The book has recently been updated to make it ready for OCaml 4.14 which in= volved only minor changes to error handling and warnings. I have also opened the source.

Dune 3.0.0

Rudi Grinberg announced

On behalf of the dune team, I=E2=80=99m delighted to announce the availabil= ity of dune 3.0.

The team has been working on this release for over 6 months, and there=E2= =80=99s a bunch of new work to report. I=E2=80=99ll only highlight the some of the interesting new developments:

  • The watch mode has been rewritten from scratch to be faster and more sc= alable. We also no longer rely on any 3rd party tools such as fswatch. If a= ny of you still have a dune workspace dune is still struggling with, we can= not wait to hear from you.
  • The watch mode now also starts an RPC server in the background. This RP= C protocol is going to be the basis for other tools to interact with dune. = Watch out for announcement on the LSP side to see how we=E2=80=99ll be maki= ng use of it to improve the editing experience.
  • The dune cache has been rewritten as well. It is now simpler and more r= eliable. There are still some components missing, such as distribution of t= he artifacts on the network. Nevertheless, we welcome you all to experiment= with this feature and give us feedback.
  • We=E2=80=99ve addressed one of our oldest feature requests: high level = rules for ctypes projects. This feature is still experimental, so we need f= eedback from real world projects before declaring it as mature.

Of course, there are many other fixes, enhancements, and only a few breakin= g changes in this release. We hope you have an easy time upgrading.

Happy Hacking.

Editor=E2=80=99s note: for the full changelog, please follow the archive= link above.

Blog Post "2021 at OCamlPro"

Fabrice Le Fessant announced

We just published a review of what OCamlPro did in 2021:

https= ://www.ocamlpro.com/blog/2022_01_31_2021_at_ocamlpro

A lot of OCaml, but also some Rust, Cobol, Solidity, and a lot of Formal Ve= rification! OCamlPro is always looking for skilled OCaml developers to hire, so if you are interested, contact us at c= ontact@ocamlpro.com

Packstream 0.1

Tomasz Bara=C5=84ski announced

I have a pleasure to announce the release of Packstream 0.1.

Packstream is a library to parse/serialize Packstream binary format.

This is the initial release. It is functional but very very limited in scop= e. It allows parsing a binary stream into a Packstream datatype and serializing the datatype into a binary stream.

OCaml 4.14.0, first beta release

octachron announced

The release of OCaml 4.14.0 is close.

The set of new features has been stabilized, and most opam packages already work with this release. After two alpha releases, we have created a first beta version to help you update your softwares and libraries ahead of the release.

If you find any bugs, please report them at:

https://github.com/ocaml/= ocaml/issues

The full release of OCaml 4.14.0 is currently expected for the middle of Ma= rch.

Compared to the last alpha, we have a last minute correction for one of th= e new function in the Seq module, some documentation improvements, few configurat= ion and internal tweaks.

Installation instructions

The base compiler can be installed as an opam switch with the following com= mands

opam update
opam switch create 4.14.0~beta1 --repositories=3Ddefault,beta=3Dgit+https:/=
/github.com/ocaml/ocaml-beta-repository.git

With opam 2.1, the previous command line can be simplified to

opam update
opam switch create 4.14.0~beta1

If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

opam update
opam switch create <switch_name> --packages=3Docaml-variants.4.14.0~b=
eta1+options,<option_list>
--repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
ository.git

or with opam 2.1:

opam update
opam switch create <switch_name> ocaml-variants.4.14.0~beta1+options =
<option_list>

where <option_list> is a comma separated list of o= caml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

opam switch create 4.14.0~beta1+flambda+nffa ocaml-variants.4.14.0~beta1+op=
tions ocaml-option-flambda
ocaml-option-no-flat-float-array

All available options can be listed with opam search ocaml-option.

The source code for the beta is also available at these addresses:

Changes compared to the last alpha

The full list of changes for OCaml 4.14 is available at https://github.com/ocaml/ocaml/bl= ob/4.14/Changes

Standard library
  • additional fixes 10583, +10998: Add over 40 new functions in Seq. (Fran=C3=A7ois Pottier and S= imon Cruanes, review by Nicol=C3=A1s Ojeda B=C3=A4r, Daniel B=C3=BCnzli, Na= =C3=ABla Courant, Craig Ferguson, Wiktor Kuchta, Xavier Leroy, Guillaume Mu= nch-Maccagnoni, Rapha=C3=ABl Proust, Gabriel Scherer and Thierry Martinez)<= /li>
Documentation
  • 10397: Docu= ment exceptions raised by Unix module functions on Windows (Martin Jambon, = review by Daniel B=C3=BCnzli, David Alsopp, Damien Doligez, Xavier Leroy, a= nd Florian Angeletti)
  • 10794: Clar= ify warning 57 (Ambiguous or-pattern variables under guard) (Wiktor Kuchta,= review by Gabriel Scherer)
Build system
  • 10828 Build= native-code compilers on OpenBSD/aarch64 (Christopher Zimmermann)
  • 10835 Disab= le DT_TEXTREL warnings on x86 32 bit architecture by passing -Wl,-z,notext = in mksharedlib and mkmaindll. Fixes relocation issues, reported in 9800, making local patc= hes in Debian, Alpine, and FreeBSD superfluous. (Hannes Mehnert with Kate D= eplaix and St=C3=A9phane Glondu, review by Xavier Leroy)
Code generation
  • 10719: Ensu= re that build_apply respects Lambda.max_arity (Stephen Dolan, review by Xavier Leroy)
Internal/compiler-libs
  • additional fixes 10718, +11012: Add "Shape" information to the cmt files. Shapes are an abstra= ction of modules that can be used by external tooling to perform definition= -aware operations. (Ulysse G=C3=A9rard, Thomas Refis and Leo White, review = by Florian Angeletti)

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B7ED6E037F for ; Tue, 1 Mar 2022 14:54:15 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NG7r=TM=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: mh2cnjzAZ6L6Bn/+navqHmK2hC0CKpYYc/E92datZAaR3x7A8yh2wXFyS0iNDzIgL5sHnVeI1K Bmc4wT9xcq8dMYrXI/el/80Qvoe5W3UfuBZkFdqZlSaiqBDbT6y9OwLiwJ6FNKScMJd2hCFr65 ddId5y6iXtRGD9jk0uWormLIegWDj/Ovu+2CWIozEGnfClbf8ytZdvPhOPW/DZ8TlwG3uFLKq5 M/QHTvstZ9/Jln95ZwMsllVWyulgqYmx0geuBilBxVlDnxoIDy2koEeUIW7LO1z8GuMo/DmJjZ 18xorcKfk1Hbp/zW40FI6o9W X-IPAS-Result: =?us-ascii?q?A0C3AgAcJR5ihyIeaIFagmWBH1kGKBkBXgZSBRYVBwhEh?= =?us-ascii?q?FSJBogRgRaINoZ1iB2EFoERA08QAQMBDSoBDgUBAgQBAYISgnUCF4N7Ah4GA?= =?us-ascii?q?QUzEwECBAEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgMEARMBAQEBDQsJBQgMB?= =?us-ascii?q?RAOBTxkZASBSwSBdAs0DUABEAGBYwwMAwODdwEWAgEIBAY+AiUjAwkLAQYDA?= =?us-ascii?q?gQNARcBFAoXARIUBgKCChVJAYMWBAEKkjOaXYEvfzKBAYNPAQMDAgsDAQ4JJ?= =?us-ascii?q?oNzgRJSDQIUgQIXAYYRVUoBgwEJhAYCJxCBVUSBFYE8bUoHboFQND0LFwEBA?= =?us-ascii?q?QEBgRYICQEBEQIBBgsJDy0JglkXgk4ElQIOHxAJBi4rCRoOGRIEAQEXCQEOF?= =?us-ascii?q?woGAhkCCAoLAQccDgsHBgQHAx4sBQMBAgIFBAYpkXQQAgwDIAcDkHqHHIIVR?= =?us-ascii?q?49LgXEZYTQHg0uBOgYLiCKBHYxziCGDc4FOkTmDQI1rIZYzIIIphXN8CIEHC?= =?us-ascii?q?YJDiSWLBgglAYUKgU4qgQ4/HgwHMxowQ4I1ATMJRQEDAg0BAgIDAQIBAgkBA?= =?us-ascii?q?QJTAY1SAxaDKCiBa3QFgTw5O4JmgmVANAIBATQCBgEKAQEDCYVjAQEFEwsBP?= =?us-ascii?q?4ERiVwCAiSCIAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:z2+G1KN6HO/3JcBcTsajsMiBIKoaSvp037BL7SBMoHNuHfBw+/ rFoB15737JYVQqNk3I8OroUMK9qBjnmaKdj7N9AZ6SGCHY/EGoIIth4YaK+UyCJwTOsshH2+ NFe6h6YeeAaGSSYPyKgjWFLw== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,146,1643670000"; d="scan'208,217";a="23817853" X-MGA-submission: =?us-ascii?q?MDE+DSJknYdRjUrVWLWp1ww1+xXHm2sEGUExV9?= =?us-ascii?q?eNnviHt8KEJXzRVZKqlwjZLMecM+EBLXZ8tK4xgLkRHA/ZJ+4cidkJEf?= =?us-ascii?q?OLCyZt7MeOuhzPaiSJOUFpIFln8LWP3qgsIAjjKIA8ebN+ArWHMkTb3M?= =?us-ascii?q?9xVGFNsEO1FXN01dnBauP53Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Mar 2022 14:54:14 +0100 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 6697F5672CC; Tue, 1 Mar 2022 14:54:13 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 01 Mar 2022 14:54:12 +0100 Message-ID: <87y21tg4mz.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 1 14:54:14 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.296498, queueID=1F6175672E0 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMjIgdG8NCk1hcmNoIDAxLCAyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50 cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CmRhdGEtZW5jb2RpbmcuMC41IHJlbGVhc2UNClR1dG9yaWFsOiBSb2d1ZWxpa2Ugd2l0aCBlZmZl Y3QgaGFuZGxlcnMNCkZvciBEaXZlcnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJl YWNoeSBTdW1tZXIgMjAyMg0KQm9ndWUsIHRoZSBPQ2FtbCBHVUkNCkZyaWRheSAwMy8wNCBJbnRl cm4gcHJlc2VudGF0aW9ucyDigJMgb3BlbiBhdHRlbmRhbmNlIQ0KQWZmZWN0OiBDb21wb3NhYmxl IGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgZm9yIE9DYW1sIDUuMA0KU2VnZmF1bHQgU3lzdGVtcyBK b2lucyBUYXJpZGVzDQpPQ2FtbCBVc2VyIFN1cnZleSAyMDIyDQpPbGQgQ1dODQoNCg0KZGF0YS1l bmNvZGluZy4wLjUgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGF0YS1lbmNvZGluZy0wLTUtcmVsZWFz ZS85NDIwLzE+DQoNCg0KUmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT24gYmVoYWxmIG9mIFtOb21hZGljIExhYnNdLCBJJ20gaGFwcHkgdG8gYW5ub3VuY2Ug dGhlIHJlbGVhc2Ugb2YNCiAgZGF0YS1lbmNvZGluZyB2ZXJzaW9uIDAuNS4NCg0KICBUaGlzIG5l dyB2ZXJzaW9uIGJyaW5ncyBzZXZlcmFsIGJ1ZyBmaXhlcywgc29tZSBpbmNyZWFzZWQgdGVzdA0K ICBjb3ZlcmFnZSwgbWlub3IgaW1wcm92ZW1lbnRzIGluIHRoZSBBUEksIGFuZCBhIG1ham9yIG5l dyBmZWF0dXJlOg0KDQoNCltOb21hZGljIExhYnNdIDxodHRwczovL3d3dy5ub21hZGljLWxhYnMu Y29tLz4NCg0KQ29tcGFjdCBlbmNvZGluZ3M6IHN1Yi1ieXRlIHRhZyBzaXplcw0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBu ZXcgdmVyc2lvbiBwcm92aWRlcyBhIG5ldyBzZXQgb2YgY29tYmluYXRvcnMgZm9yIF9jb21wYWN0 Xw0KICBlbmNvZGluZ3MuIFRoZXNlIGNvbXBhY3QgZW5jb2RpbmdzIHdpbGwgaGFuZGxlIGFsbCB0 aGUgdmVyYm9zZSBhbmQNCiAgZXJyb3ItcHJvbmUgYml0LXR3aWRsaW5nIHByb2Nlc3MgbmVlZGVk IHRvIGNvbWJpbmUgbXVsdGlwbGUgc3ViLWJ5dGUNCiAgZGlzY3JpbWluYXRvcnMgaW50byBhIHNp bmdsZSBieXRlLXNpemUgb25lLg0KDQogIEUuZy4sIHRoZSBlbmNvZGluZyBgbGV0IGUxID0gZWl0 aGVyIChlaXRoZXIgYm9vbCB1bml0KSAob3B0aW9uIGJvb2wpJw0KICB1c2VzIHRocmVlIGJpdHMg aW4gdGhlIHNoYXJlZCB0YWcgYW5kIHplcm8gYnl0ZXMgYWZ0ZXIgdGhhdDsgdGhlDQogIGVuY29k aW5nIGBsZXQgZTIgPSBlaXRoZXIgaW50MzIgaW50NjQnIHVzZXMgb25lIGJpdCBpbiB0aGUgc2hh cmVkIHRhZw0KICBhbmQgZWl0aGVyIDQgb3IgOCBieXRlcyB0byByZXByZXNlbnQgdGhlIGludGVn ZXI7IHRoZSBwcm9kdWN0IGVuY29kaW5nDQogIGBsZXQgZWUgPSB0dXAyIGUxIGUyJyB1c2VzIGZv dXIgKDMgKyAxKSBiaXRzIGluIHRoZSBzaGFyZWQgdGFnIGFuZA0KICBlaXRoZXIgNCBvciA4IGJ5 dGVzIHRvIHJlcHJlc2VudCB0aGUgaW50ZWdlciBvZiBgZTInLg0KDQoNCkhvdyB0byBnZXQNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBjb2RlIGlzIGF2YWlsYWJsZSB1 bmRlciBNSVQgbGljZW5zZSBvbg0KICA8aHR0cHM6Ly9naXRsYWIuY29tL25vbWFkaWMtbGFicy9k YXRhLWVuY29kaW5nPi4NCg0KICBJdCBjYW4gYmUgaW5zdGFsbGVkIHZpYSBgb3BhbScuDQoNCg0K RGFyaW8gVGVpeGVpcmEgYXNrZWQgYW5kIFJhcGhhw6tsIFByb3VzdCByZXBsaWVkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBIaSBAcmFwaGFlbC1wcm91c3QhIEkgaGF2 ZSBhIHF1ZXN0aW9uIHJlZ2FyZGluZyB0aGUNCiAgICAgICAgY29ubmVjdGlvbiBiZXR3ZWVuIGBk YXRhLWVuY29kaW5nJyBhbmQNCiAgICAgICAgYGpzb24tZGF0YS1lbmNvZGluZycsIGFsc28gZGV2 ZWxvcGVkIGF0IE5vbWFkaWMgTGFicy4gVGhlDQogICAgICAgIGxhdHRlciBzZWVtcyB0aWVkIHRv IEpTT04sIHdoZXJlYXMgdGhlIGZvcm1lciBpcyBtb3JlDQogICAgICAgIGZsZXhpYmxlLCBzdXBw b3J0aW5nIGFsc28gYmluYXJ5IGVuY29kaW5ncy4gSG93ZXZlciwgc2luY2UNCiAgICAgICAgYGRh dGEtZW5jb2RpbmcnIGFsc28gc3VwcG9ydHMgSlNPTiwgZG9lc24ndCBpdCBzdWJzdW1lDQogICAg ICAgIGBqc29uLWRhdGEtZW5jb2RpbmcnIGNvbXBsZXRlbHk/DQoNCiAgVGhlIGBkYXRhLWVuY29k aW5nJyBsaWJyYXJ5IHVzZXMgYGpzb24tZGF0YS1lbmNvZGluZycgZm9yIGl0cyBKU09ODQogIGJh Y2tlbmQuIEl0IGRlbGVnYXRlcyBjb252ZXJzaW9uIGZyb20gT0NhbWwgdmFsdWVzIGludG8gYW5k IGZyb20gSlNPTg0KICB0byB0aGUgcHJpbWl0aXZlcyBwcm92aWRlZCBpbiB0aGUgaW50ZXJmYWNl IG9mIGBqc29uLWRhdGEtZW5jb2RpbmcnLg0KDQogIEluIGEgd2F5LCB5ZXMsIGFzIGFuIGVuZC11 c2VyIHlvdSBkb24ndCBuZWVkIHRvIHVzZQ0KICBganNvbi1kYXRhLWVuY29kaW5nJyBkaXJlY3Rs eSBiZWNhdXNlIHlvdSBjYW4gdXNlIHRoZSBgSnNvbicgbW9kdWxlIG9mDQogIGBkYXRhLWVuY29k aW5nJyBpbnN0ZWFkLiBUaGVyZSBhcmUgdGhyZWUgcG9zc2libGUgcmVhc29ucyB3aHkgeW91DQog IG1pZ2h0IGFkZCBganNvbi1kYXRhLWVuY29kaW5nJyBhcyBhIChub24tdHJhbnNpdGl2ZSkgZGVw ZW5kZW5jeSB0bw0KICB5b3VyIHByb2plY3QgYW5kIHVzZSBpdCBkaXJlY3RseSBpbiB5b3VyIGNv ZGU6DQoNCiAg4oCiIFlvdSB3YW50IHRvIGtlZXAgdGhlIGRlcGVuZGVuY3kgc2V0IGFuZCB0aGUg bnVtYmVyIG9mIGFic3RyYWN0aW9uDQogICAgbGF5ZXJzIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiBF LmcuLCBpbiBvcmRlciB0byByZWR1Y2UgYmluYXJ5IHNpemUuDQogIOKAoiBZb3Ugd2FudCBzb21l IHN0YXRpYyBndWFyYW50ZWVzIHRoYXQgc29tZSBlbmNvZGluZ3MgYXJlIG9ubHkgZXZlcnkNCiAg ICB1c2VkIGZvciBKU09OLiBFLmcuLCBpbiB5b3VyIGxvZ2dpbmcgc3lzdGVtLg0KICDigKIgWW91 IG5lZWQgdG8gZGVmaW5lIGEgSlNPTiBlbmNvZGluZyB3aGljaCBpcyByZWplY3RlZCBieQ0KICAg IGBkYXRhLWVuY29kaW5nJyBvbiBncm91bmRzIHRoYXQgaXQgaXMgaW52YWxpZCBpbiBiaW5hcnku IE5vdGUgdGhhdA0KICAgIOKAoiBUaGlzIGlzIHZlcnkgc3BlY2lmaWMgdG8gc29tZSBjb21iaW5h dG9ycyBidXQgYmFzaWNhbGx5IHNvbWUNCiAgICAgIGNvbWJpbmF0b3JzIHdpbGwgcmVqZWN0IHRo ZWlyIGlucHV0cyAocmFpc2UgYEludmFsaWRfYXJndW1lbnQnKQ0KICAgICAgYmVjYXVzZSB1c2lu ZyB0aGUgc2VyaWFsaXNlciB3b3VsZCBsZWFkIHRvIHVuZGVjb2RhYmxlIGRhdGEuIE1vc3QNCiAg ICAgIHR5cGljYWxseSwgdGhpcyBoYXBwZW5zIGlmIHlvdSB0cnkgdG8gY29uY2F0ZW5hdGUgdHdv IGZpZWxkcyBvZg0KICAgICAgdW5rbm93biBsZW5ndGguIERlY29kaW5nIHRoZSByZXN1bHQgYmVj b21lcyBhIGd1ZXNzaW5nIGdhbWUgYXMgdG8NCiAgICAgIHdlcmUgb25lIGZpZWxkIHN0b3BzIGFu ZCB3aGVyZSB0aGUgbmV4dCBiZWdpbnMuIFRoZXNlIGNvdWxkIGVhc2lseQ0KICAgICAgYmUgcmVw cmVzZW50ZWQgYXMgYW4gYXJyYXkgaW4gSlNPTiB3aGljaCBpbmNsdWRlcyBhbGwgdGhlDQogICAg ICBkZWxpbWl0ZXJzIHlvdSBuZWVkIHRvIGRlY29kZSBpdC4NCiAgICDigKIgVGhlcmUgYXJlIG90 aGVyIHdvcmthcm91bmRzIChlLmcuLCBwcmVmaXhpbmcgdGhlIGZpZWxkcyB3aXRoIGENCiAgICAg IGxlbmd0aCBmaWVsZCksIGJ1dCBnb2luZyBmb3IgdGhlIEpTT04gZW5jb2RpbmcgZGlyZWN0bHkg aXMgYSB2YWxpZA0KICAgICAgYXBwcm9hY2ggaWYgeW91IG9ubHkgbmVlZCBKU09OLg0KDQoNClJh cGhhw6tsIFByb3VzdCBsYXRlciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFZlcnNpb24gMC41LjEgb2YgdGhlIGRhdGEtZW5jb2RpbmcgaGFzIGp1c3Qg YmVlbiByZWxlYXNlZC4NCg0KICBUaGlzIGlzIGEgYnVnZml4IHJlbGVhc2UgbWFraW5nIG9uZSBv ZiB0aGUgbGlicmFyeSdzIGludGVybmFsIGNoZWNrcw0KICBtb3JlIHBlcm1pc3NpdmUuIFdpdGhv dXQgdGhpcyBmaXggKGkuZS4sIHVzaW5nIHZlcnNpb24gMC41KSwgc29tZQ0KICB2YWxpZCBlbmNv ZGluZ3MgYXJlIHJlamVjdGVkIChyYWlzaW5nIGBJbnZhbGlkX2FyZ3VtZW50JykgYnkgdGhlDQog IGxpYnJhcnkuDQoNCiAgWW91IGNhbiB1cGRhdGUgdmlhIG9wYW06IGBvcGFtIGluc3RhbGwgZGF0 YS1lbmNvZGluZy4wLjUuMScNCg0KDQpUdXRvcmlhbDogUm9ndWVsaWtlIHdpdGggZWZmZWN0IGhh bmRsZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3R1dG9yaWFsLXJvZ3VlbGlrZS13aXRoLWVmZmVjdC1oYW5kbGVycy85NDIyLzE+DQoNCg0K YXJ0LXcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGUgcmVjZW50IGNvbnZlcnNhdGlvbnMgYWJvdXQgW2BlaW8nIDAuMV0gYW5k IFthZ25vc3RpYyBibG9ja2luZ10NCiAgaGF2ZSBtYWRlIG1lIHZlcnkgY3VyaW91cyBhYm91dCBl ZmZlY3QgaGFuZGxlcnMuIFRoZSBtdWx0aWNvcmUgdGVhbQ0KICBoYXMgZG9uZSBhbiBbYXdlc29t ZV0gam9iIHdpdGggdGhlaXIgW3R1dG9yaWFsc10sIFtleGFtcGxlc10gYW5kDQogIFt0YWxrc10s IGJ1dCB0aGUgbGF5bWVuIGhhdmUgYmVlbiB0b28gcXVpZXQgZm9yIHN1Y2ggYW4gZXhjaXRpbmcN CiAgZmVhdHVyZSEgV2hlcmUgYXJlIGFsbCB0aGUgYmxvZyBwb3N0cyBhYm91dCBob3cgInlvdSBj b3VsZCBoYXZlDQogIGludmVudGVkIGFsZ2VicmFpYyBlZmZlY3RzIiBhbmQgIm9uZS1zaG90IGNv bnRpbnVhdGlvbnMgYXJlIGxpa2UNCiAgc3BhZ2hldHRpIj8NCg0KICBJbiBhbnkgY2FzZSwgSSdt IGhvcGluZyB0byB0ZWFzZSBzb21lIG9mIHlvdSBpbnRvIHRyeWluZyB0aGVtIG91dCB3aXRoDQog IFthIHNpbXBsZSB0dXRvcmlhbCBhYm91dCBwcm9ncmFtbWluZyBhIHJvZ3VlbGlrZSB3aXRoIGVm ZmVjdCBoYW5kbGVyc10NCiAgOikNCg0KICBUaGVyZSdzIG5vdGhpbmcgbmV3IGhlcmUgYmVzaWRl cyB0aGUgZnVuIHVzZS1jYXNlISBTbyBpZiB5b3UgYWxyZWFkeQ0KICBoYXZlIGFuIGludHVpdGl2 ZSB1bmRlcnN0YW5kaW5nIG9mIHRoZSBzeW50YXggYW5kIG1vdGl2YXRpb25zLCB5b3UgbWF5DQog IGJlIG1vcmUgaW50ZXJlc3RlZCBieSBbYSBkZWVwZXIgbG9vayBhdCB0aGUgc2NvcGUgb2YgZWZm ZWN0IGhhbmRsZXJzXQ0KICDigJMgYW5kIGEgc29mdCBpbnRyb2R1Y3Rpb24gdG8gc29tZSBsZXNz IGNvbW1vbiBmZWF0dXJlcyBvZiB0aGUgdHlwZQ0KICBzeXN0ZW0uIC8odGhpcyBsaW5rIHdhcyBw cmV2aW91c2x5IHBvc3RlZCBkZWVwIGludG8gdGhlIGBlaW8nIHRocmVhZCkvDQoNCiAgSSB3b3Vs ZCBiZSBncmF0ZWZ1bCBpZiB5b3Ugc3BvdCBhbnkgbWlzdGFrZSEgSSdtIGFsc28gY3VyaW91cyBv ZiBvdGhlcg0KICBmdW4gYXBwbGljYXRpb25zIGZvciBlZmZlY3QgaGFuZGxlcnPigKYgYW5kIGlm IHlvdSBmZWVsIGxpa2Ugc2hhcmluZw0KICB5b3VyIG93biBzdXJwcmlzZXMgYW5kIGRpc2NvdmVy aWVzLCBJIGJlbGlldmUgaXQgY291bGQgcmVhbGx5IGhlbHANCiAgb3RoZXJzIGxlYXJuIGZhc3Rl ciA6KQ0KDQoNCltgZWlvJyAwLjFdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Vpby0w LTEtZWZmZWN0cy1iYXNlZC1kaXJlY3Qtc3R5bGUtaW8tZm9yLW9jYW1sLTUvOTI5OC85Nz4NCg0K W2Fnbm9zdGljIGJsb2NraW5nXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctdG8t YmxvY2staW4tYW4tYWdub3N0aWMtd2F5LzkzNjgvNTE+DQoNClthd2Vzb21lXSA8aHR0cHM6Ly9n aXRodWIuY29tL3BhdHJpY29mZXJyaXMvYXdlc29tZS1tdWx0aWNvcmUtb2NhbWw+DQoNClt0dXRv cmlhbHNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL29jYW1sLWVmZmVjdHMtdHV0b3Jp YWw+DQoNCltleGFtcGxlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWZm ZWN0cy1leGFtcGxlcz4NCg0KW3RhbGtzXQ0KPGh0dHBzOi8vd2F0Y2gub2NhbWwub3JnL3ZpZGVv cy93YXRjaC83NGVjZTBhOC0zODBmLTRlMmEtYmVmNS1jNmJiOTA5MmJlODk+DQoNClthIHNpbXBs ZSB0dXRvcmlhbCBhYm91dCBwcm9ncmFtbWluZyBhIHJvZ3VlbGlrZSB3aXRoIGVmZmVjdCBoYW5k bGVyc10NCjxodHRwczovL2hhY2ttZC5pby9AeUZfbnRVaG1SdktVdDE1ZzdtMXVHdy9CSkJaN1RN ZXE+DQoNClthIGRlZXBlciBsb29rIGF0IHRoZSBzY29wZSBvZiBlZmZlY3QgaGFuZGxlcnNdDQo8 aHR0cHM6Ly9oYWNrbWQuaW8vQHlGX250VWhtUnZLVXQxNWc3bTF1R3cvQmstNU5YaDE1Pg0KDQoN CktpcmFuIEdvcGluYXRoYW4gdGhlbiBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBH cmVhdCBibG9nIHBvc3QhIFRoYXQgc2VlbXMgbGlrZSBhIHZlcnkgZWxlZ2FudCBpbXBsZW1lbnRh dGlvbiENCg0KICBGdW5ueSB5b3Ugc2hvdWxkIG1ha2UgYSByb3VnZWxpa2UgOnNtaWxleTogLCBJ IGd1ZXNzIGVmZmVjdCBoYW5kbGVycyArDQogIGdhbWVzIG1pZ2h0IGJlIHBvcHVsYXIgZm9yIGdh bWVzLCBiZWNhdXNlIEkgYWxzbyBoYWQgYSBibG9nIHBvc3QgYWJvdXQNCiAgZWZmZWN0IGhhbmRs ZXJzIGFuZCB0aGVpciBhcHBsaWNhdGlvbnMsIGluIHBhcnRpY3VsYXIgZm9yIGdhbWVzLA0KICBh bHRob3VnaCBpbiBteSBjYXNlIGl0IHdhcyBmb3IgYW5pbWF0aW9uczoNCg0KICA8aHR0cHM6Ly9n b3BpYW5kY29kZS51ay9sb2dzL2xvZy1ieWUtYnllLW1vbmFkcy1hbGdlYnJhaWMtZWZmZWN0cy5o dG1sPg0KDQoNCmdhc2NoZSBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdGU6IHRoZSAidXBzdHJlYW0i IHN0YXR1cyBvZiBlZmZlY3QgaGFuZGxlcnMgaXMgYSBsaXR0bGUNCiAgdW5jZXJ0YWluL2NvbmZ1 c2luZyByaWdodCBub3cuIFlvdXIgYmxvZyBwb3N0IChJIGRpZG4ndCBnZXQgYSBjaGFuY2UNCiAg dG8gcmVhZCBpdCB5ZXQsIGJ1dCBpdCBzb3VuZHMgdmVyeSBuaWNlISkgdXNlcyB0aGUgZXhwZXJp bWVudGFsIHN5bnRheA0KICBvZiBtdWx0aWNvcmUtNC4xMitlZmZlY3RzLCBidXQgdGhhdCBzeW50 YXggd2FzIGludGVudGlvbmFsbHkgL25vdC8NCiAgdXBzdHJlYW1lZCwgYW5kIGl0IHdpbGwgL25v dC8gYmUgcGFydCBvZiBPQ2FtbCA1LjAuDQoNCiAgSSB0aGluayB0aGVyZSBpcyBhIHJpc2sgb2Yg Y29uZnVzaW9uIGJlY2F1c2UgdGhlIGNvbW11bml0eSBpcyBhd2FyZQ0KICB0aGF0IE11bHRpY29y ZSBPQ2FtbCBoYXMgZWZmZWN0IGhhbmRsZXJzLCBhbmQgYWxzbyB0aGF0IE11bHRpY29yZQ0KICBP Q2FtbCBoYXMgYmVlbiBtZXJnZWQgdXBzdHJlYW0uIFNvIGl0IGNhbiBiZSB0ZW1wdGluZyB0byBi ZWxpZXZlIHRoYXQNCiAgdGhlIHVwY29taW5nIE9DYW1sIHJlbGVhc2UgKG9yIG1heWJlIG9uZSBv ciB0d28gcmVsZWFzZXMgYWZ0ZXIgdGhhdCwNCiAgd2Ugc2FpZCB0aGUgZmlyc3QgTXVsdGljb3Jl IHJlbGVhc2Ugd291bGQgYmUgbW9yZSBsaWtlIGEgcHJldmlldykgd2lsbA0KICBzdXBwb3J0IGVm ZmVjdCBoYW5kbGVycyBhcyBhIGxhbmd1YWdlIGZlYXR1cmUuIEl0IHdpbGwgbm90ISBFZmZlY3Rz IGFzDQogIGEgbGFuZ3VhZ2UgZmVhdHVyZSB3ZXJlIHJlbW92ZWQgZnJvbSBNdWx0aWNvcmUgT0Nh bWwgYmVmb3JlIHRoZQ0KICB1cHN0cmVhbSBtZXJnZS4gQW5kIC9ubyBvbmUga25vd3MvIGlmL3do ZW4gdGhleSB3aWxsIGJlIHN1cHBvcnRlZA0KICB1cHN0cmVhbS4NCg0KICBTbzogSSB0aGluayB0 aGF0IHlvdXIgYmxvZyBwb3N0cyBvbiB1c2luZyBlZmZlY3QgaGFuZGxlcnMgY291bGQgaGF2ZQ0K ICBzb21ld2hlcmUgYSBzaG9ydCBtZW50aW9uIHRoYXQgdGhlIGNvZGUgaXMgdXNpbmcgYW4gZXhw ZXJpbWVudGFsDQogIGV4dGVuc2lvbiBvZiBPQ2FtbCB0aGF0IGlzIG5vdCBzdXBwb3J0ZWQgYnkg dGhlIHVwc3RyZWFtDQogIGltcGxlbWVudGF0aW9uLg0KDQoNCiAgVGhlIHJlYXNvbmluZyBmb3Ig dGhpcyBjaG9pY2UgaXMgdGhhdCB3ZSB3YW50IHRvIGdpdmUgYSBjaGFuY2UgdG8gYQ0KICB0eXBl IHN5c3RlbSBmb3IgZWZmZWN0IGhhbmRsZXJzLCBidXQgdGhhdCBzdGlsbCBuZWVkIHF1aXRlIGEg Yml0IG1vcmUNCiAgdGltZSB0aGFuIHRoZSBNdWx0aWNvcmUgcnVudGltZSBpdHNlbGYuIFdlIGRv bid0IHdhbnQgdG8gZW5jb3VyYWdlIHRoZQ0KICBlY29zeXN0ZW0gdG8gcmVseSBvbiB1bnR5cGVk IGVmZmVjdHMsIGlmIGl0IG1lYW5zIGEgbG90IG9mIHBhaW4NCiAgdXBncmFkaW5nIHRvIHR5cGVk IGVmZmVjdHMgbGF0ZXIgKG9yIHJpc2sgaGF2aW5nIHRvIHN1cHBvcnQgYm90aCkuDQoNCiAgNS4w IG9ubHkgY29udGFpbnMgYmFzaWMgc3VwcG9ydCBmb3IgZWZmZWN0IGhhbmRsZXJzIGFzIGEgL3J1 bnRpbWUNCiAgcHJpbWl0aXZlLywgYnV0IGRvcyAvbm90LyBzdXBwb3J0IGhhbmRsZXJzIGFzIGEg L2xhbmd1YWdlIGZlYXR1cmUvLiBJDQogIHRoaW5rIHRoZXkgc2hvdWxkIGJlIGNvbnNpZGVyZWQg ZXhwZXJpbWVudGFsOiB5b3UgY2FuIHJlbHkgb24gdGhlbSBmb3INCiAgdGhlaXIgaW50ZW5kZWQg cHVycG9zZSBvZiBleHBvc2luZyBhIGZsZXhpYmxlIGludGVyZmFjZSBmb3IgY29uY3VycmVudA0K ICBmaWJlcnMsIGJ1dCB1c2VzIGJleW9uZCB0aGF0IG1heSBicmVhayBpbiB0aGUgZnV0dXJlLg0K DQogIFNvLCBpbiBhIHNlbnNlLCB3ZSBkb24ndCB3YW50IHBlb3BsZSB0byB1c2UgdGhlbS4gSXQn cyBvZiBjb3Vyc2UgZmluZQ0KICB0byB1c2UgZXhwZXJpbWVudGFsIGZlYXR1cmVzIGZyb20gZXhw ZXJpbWVudGFsIGZvcmtzIG9mIHRoZSBPQ2FtbA0KICBjb21waWxlciAoZWZmZWN0IGhhbmRsZXJz LCBtb2R1bGFyIGltcGxpY2l0cyBvciBleHBsaWNpdHMsIHJ1bnRpbWUNCiAgdHlwZSByZXByZXNl bnRhdGlvbnMgYW5kIHdoYXQgbm90KSwgYW5kIHRoZSBwZW9wbGUgd29ya2luZyBvbiB0aGVzZQ0K ICBleHBlcmltZW50YWwgZmVhdHVyZXMgZG8gYmVuZWZpdCBmcm9tIG90aGVyIHBlb3BsZSB0cnlp bmcgdGhlbSBhbmQNCiAgZ2l2aW5nIHRoZW0gZmVlZGJhY2suIEJ1dCB3ZSBkb24ndCB3YW50IHBl b3BsZSB0byBkZXBlbmQgb24gaXQgL2luDQogIHByb2R1Y3Rpb24vLCB3aGF0ZXZlciB0aGF0IG1l YW5zLiAoRm9yIGV4YW1wbGUsIGNvZGUgdXNpbmcgaXQgaXMNCiAgbGlrZWx5IHRvIGdldCBzdHVj ayBvbiA0LjEyIGZvcmV2ZXIgYW5kIG5ldmVyIHNlZSBhbiB1cGdyYWRlIHRvDQogIHVwY29taW5n IE9DYW1sIHZlcnNpb25zLCBhbHRob3VnaCBvZiBjb3Vyc2UgcGVvcGxlIGNvdWxkIGNob29zZSB0 bw0KICBwb3J0IHRoZSBleHBlcmltZW50YWwgYnJhbmNoIGZvcndhcmQuKQ0KDQoNCkZvciBEaXZl cnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJlYWNoeSBTdW1tZXIgMjAyMg0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9mb3It ZGl2ZXJzaXR5LWFuZC10aGUtb2NhbWwtY29tbXVuaXR5LW91dHJlYWNoeS1zdW1tZXItMjAyMi85 MjM0LzQ+DQoNCg0KU29uamEgSGVpbnplIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSnVzdCBp biBjYXNlIGFueW9uZSBpcyBhY3R1YWxseSBpbnRlcmVzdGVkIGluIHRoaXM6IHRoZSBwcm9qZWN0 DQogIHN1Ym1pc3Npb24gZGVhZGxpbmUgaGFzIGJlZW4gZXh0ZW5kZWQgZnJvbSBNYXJjaCA0dGgg dG8gTWFyY2ggMjNyZC4gU28NCiAgdGhlIHVwZGF0ZWQgdGltZWxpbmUgbm93IGxvb2tzIGFzIGZv bGxvd3M6DQoNCiAgPGh0dHBzOi8vYXdzMS5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFuZGFyZDExL3Vw bG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNS81MzRjYTlhMDhiY2UxMGYxMzUzMGU2Yzk4ZWFlMTc5 N2ZkZjEzZTUyLnBuZz4NCg0KICB3aGVyZSAyLiBhbmQgMy4gcHJvYmFibHkgbmVlZCB0byBiZSBk b25lIGEgYml0IGluIHBhcmFsbGVsLg0KDQoNCkJvZ3VlLCB0aGUgT0NhbWwgR1VJDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ib2d1ZS10aGUtb2Nh bWwtZ3VpLzkwOTkvMjM+DQoNCg0Kc2FuZXR0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpLCBzb21lIG5ldyBkZXZl bG9wbWVudHMuIEkgaGF2ZSBpbXBsZW1lbnRlZCBhIG5ldyBgU2RsX2FyZWEnIHdpZGdldA0KICB3 aGVyZSBvbmUgY2FuIGNvbnZlbmllbnRseSBpc3N1ZSBhbnkgU0RMIGZ1bmN0aW9uIChmcm9tIHRo ZSBTREwNCiAgUmVuZGVyZXIgQVBJKS4NCg0KICBIZXJlIGlzIChiZWxvdykgdGhlIG5ldyAnbGFi ZWxsZWQgZ3JhcGgnIGV4YW1wbGUuIEluIHRoaXMgZXhhbXBsZSBJIGFtDQogIHVzaW5nIHJlZ3Vs YXIgImxhYmVsIiB3aWRnZXRzIGZvciBjcmVhdGluZyB0aGUgbm9kZXMsIGFuZCBJIGFtIHVzaW5n DQogIGFuIFNkbF9hcmVhIGZvciBkcmF3aW5nIHRoZSBsaW5lcy4NCg0KICBUaGUgbmljZSB0aGlu Z3MgZm9yIGxhYmVscyB0byBiZSByZWd1bGFyIHdpZGdldHMgaXMgdGhhdCBvbmUgY2FuIGNsaWNr DQogIG9uIHRoZW0uIFRvIGRlbW9uc3RyYXRlIHRoaXMsIGluIHRoaXMgZXhhbXBsZSB0aGV5IHJl YWN0IHRvIGEgY2xpY2sgYnkNCiAganVtcGluZyB0byBhbm90aGVyIHJhbmRvbSBsb2NhdGlvbiAo d2l0aCBhbmltYXRpb24pLg0KDQogIDxodHRwczovL2F3czEuZGlzY291cnNlLWNkbi5jb20vc3Rh bmRhcmQxMS91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC9mL2Y5NTc1ODM4YTdlNWVhNGM1ODQ4 NWI5NTVlOTZmN2M5YmJkYTM4NGZfMl8xMjY2eDEwMDAucG5nPg0KDQogIDxodHRwczovL2F3czEu ZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYL2Qv ZDY5NThlMjY2ZjI3YTU1N2M1YzhkOGQzNzA5OWQ1MzJlYWNmMmMxYy5naWY+DQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBvcGVuIEJvZ3VlDQogIOKUgiBtb2R1bGUgVyA9IFdpZGdldA0KICDi lIIgbW9kdWxlIEwgPSBMYXlvdXQNCiAg4pSCIA0KICDilIIgbGV0IG4gPSAxNSAoKiBudW1iZXIg b2YgZGlzY3MgKikNCiAg4pSCIGxldCByYWRpdXMgPSAyMA0KICDilIIgbGV0IHdpZHRoID0gODAw DQogIOKUgiBsZXQgaGVpZ2h0ID0gNjAwDQogIOKUgiANCiAg4pSCIGxldCBjID0gRHJhdy5maW5k X2NvbG9yICIjZTViOTJjIg0KICDilIIgbGV0IGNiID0gRHJhdy5maW5kX2NvbG9yICIjN2I2YjM1 Ig0KICDilIIgbGV0IGRpc2Nfc3R5bGUgPSBTdHlsZS4oDQogIOKUgiAgICAgY3JlYXRlIH5ib3Jk ZXI6KA0KICDilIIgICAgICAgbWtfYm9yZGVyIH5yYWRpdXMgKG1rX2xpbmUgfmNvbG9yOkRyYXcu KG9wYXF1ZSBjKSB+d2lkdGg6MSB+c3R5bGU6U29saWQgKCkpKQ0KICDilIIgICAgICAgfmJhY2tn cm91bmQ6KGNvbG9yX2JnIERyYXcuKG9wYXF1ZSBjYikpICgpKQ0KICDilIIgDQogIOKUgiBsZXQg YmFja2dyb3VuZCA9IEwuc3R5bGVfYmcgU3R5bGUuKA0KICDilIIgICAgIG9mX2JnIChncmFkaWVu dCB+YW5nbGU6NDUuIERyYXcuW29wYXF1ZSBncmV5OyBvcGFxdWUgYmxhY2tdKSkNCiAg4pSCIA0K ICDilIIgbGV0IGZnID0gRHJhdy4ob3BhcXVlIHdoaXRlKQ0KICDilIIgDQogIOKUgiBsZXQgY3Jl YXRlX2Rpc2MgaSAoeCx5KSA9DQogIOKUgiAgIGxldCB3ID0gMipyYWRpdXMgKyAxIGluDQogIOKU giAgIGxldCBiZyA9IEJveC5jcmVhdGUgfnN0eWxlOmRpc2Nfc3R5bGUgfndpZHRoOncgfmhlaWdo dDp3ICgpIGluDQogIOKUgiAgIFcubGFiZWwgfmZnIChzdHJpbmdfb2ZfaW50IGkpDQogIOKUgiAg IHw+IEwucmVzaWRlbnQgfmJhY2tncm91bmQ6KEwuYm94X2JnIGJnKSB+eDooeC1yYWRpdXMpIH55 Oih5LXJhZGl1cykgfncgfmg6dw0KICDilIIgDQogIOKUgiBsZXQgbW92ZV9kaXNjICh4LHkpIGQg PQ0KICDilIIgICBsZXQgKHgwLCB5MCkgPSBMLnhwb3MgZCwgTC55cG9zIGQgaW4NCiAg4pSCICAg TC5hbmltYXRlX3ggZCAoQXZhci5mcm9tdG8geDAgeCk7DQogIOKUgiAgIEwuYW5pbWF0ZV95IGQg KEF2YXIuZnJvbXRvIHkwIHkpDQogIOKUgiANCiAg4pSCIGxldCByYW5kb21fY2VudGVyIF8gPQ0K ICDilIIgICByYWRpdXMgKyBSYW5kb20uaW50ICh3aWR0aCAtIDIqcmFkaXVzKSwNCiAg4pSCICAg cmFkaXVzICsgUmFuZG9tLmludCAoaGVpZ2h0IC0gMipyYWRpdXMpDQogIOKUgiANCiAg4pSCIGxl dCBhcmVhID0NCiAg4pSCICAgbGV0IHNkbHcgPSBXLnNkbF9hcmVhIH53OndpZHRoIH5oOmhlaWdo dCAoKSBpbg0KICDilIIgICBsZXQgc2RsYSA9IFcuZ2V0X3NkbF9hcmVhIHNkbHcgaW4NCiAg4pSC ICAgbGV0IGNlbnRlcnMgPSBBcnJheS5pbml0IG4gcmFuZG9tX2NlbnRlciBpbg0KICDilIIgICBs ZXQgY29sb3IgPSBEcmF3LihvcGFxdWUgZ3JleSkgaW4NCiAg4pSCICAgbGV0IGRyYXdfbGluZXMg cmVuZGVyZXIgPSBsZXQgb3BlbiBEcmF3IGluDQogIOKUgiAgICAgZm9yIGkgPSAwIHRvIG4gLSAy IGRvDQogIOKUgiAgICAgICBsZXQgeDAsIHkwID0gdG9fcGl4ZWxzIGNlbnRlcnMuKGkpIGluDQog IOKUgiAgICAgICBsZXQgeDEsIHkxID0gdG9fcGl4ZWxzIGNlbnRlcnMuKGkrMSkgaW4NCiAg4pSC ICAgICAgIGxpbmUgcmVuZGVyZXIgfmNvbG9yIH50aGljazo2IH54MCB+eTAgfngxIH55MQ0KICDi lIIgICAgIGRvbmUgaW4NCiAg4pSCICAgU2RsX2FyZWEuYWRkIHNkbGEgZHJhd19saW5lczsNCiAg 4pSCICAgbGV0IGRpc2NzID0gQXJyYXkubWFwaSBjcmVhdGVfZGlzYyBjZW50ZXJzIHw+IEFycmF5 LnRvX2xpc3QgaW4NCiAg4pSCICAgKCogbW92ZSB0aGUgZGlzYyB3aGVuIGNsaWNrIG9uIGl0ICop DQogIOKUgiAgIExpc3QuaXRlcmkgKGZ1biBpIGQgLT4NCiAg4pSCICAgICAgIFcub25fY2xpY2sg fmNsaWNrOihmdW4gXyAtPg0KICDilIIgCSAgY2VudGVycy4oaSkgPC0gcmFuZG9tX2NlbnRlciAw Ow0KICDilIIgCSAgU2RsX2FyZWEudXBkYXRlIHNkbGE7DQogIOKUgiAJICBsZXQgeCx5ID0gY2Vu dGVycy4oaSkgaW4NCiAg4pSCIAkgIG1vdmVfZGlzYyAoeCAtIHJhZGl1cywgeSAtIHJhZGl1cykg ZCkgKEwud2lkZ2V0IGQpKQ0KICDilIIgICAgIGRpc2NzOw0KICDilIIgICBMLnN1cGVycG9zZSB+ dzp3aWR0aCB+aDpoZWlnaHQgfmJhY2tncm91bmQgKEwucmVzaWRlbnQgc2RsdyA6OiBkaXNjcykN CiAg4pSCIA0KICDilIIgbGV0IGJvYXJkID0gQm9ndWUubWFrZSBbXSBbYXJlYV0NCiAg4pSCIA0K ICDilIIgbGV0ICgpID0gQm9ndWUucnVuIGJvYXJkDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCkZy aWRheSAwMy8wNCBJbnRlcm4gcHJlc2VudGF0aW9ucyDigJMgb3BlbiBhdHRlbmRhbmNlIQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9mcmlkYXktMDMtMDQtaW50ZXJuLXByZXNlbnRh dGlvbnMtb3Blbi1hdHRlbmRhbmNlLzk0MjkvMT4NCg0KDQpBeWEgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGlzIGlzIEF5YSwgb25lIG9m IHRoZSB0aHJlZSBbT3V0cmVhY2h5XSBpbnRlcm5zIHdvcmtpbmcgb24gT0NhbWwNCiAgdGhpcyB3 aW50ZXIgOmNhbWVsOiBBZnRlciAzIHZlcnkgZmFzdCBtb250aHMsIG91ciBpbnRlcm5zaGlwcyBh cmUNCiAgYWxyZWFkeSBjb21pbmcgdG8gYSBjbG9zZS4gV2UgaGF2ZSBoYWQgc3VjaCBhIGdyZWF0 IHRpbWUgd29ya2luZyBvbg0KICBvdXIgcHJvamVjdHMgYW5kIGxlYXJuaW5nIE9DYW1sIHRoYXQg d2Ugd2FudCB0byBob2xkIGFuIGV2ZW50IHRvIG1hcmsNCiAgdGhlIGVuZCBvZiB0aGUgaW50ZXJu c2hpcHMsIGFuZCB3ZSBkZWNpZGVkIHRvIG9wZW4gaXQgdXAgdG8gdGhlDQogIGNvbW11bml0eSA6 dGFkYToNCg0KICBBcyB5b3UgbWlnaHQgaGF2ZSBzZWVuIGluIHRoZSBbaW5pdGlhbCBhbm5vdW5j ZW1lbnRdLCBAcGl0YWcNCiAgQHNob25mZWRlciBAZ3MwNTEwIEB0bWF0dGlvIGFuZCBAcGtlbCBh bGwgdm9sdW50ZWVyZWQgdG8gbWVudG9yIHVzDQogIGZyb20gRGVjZW1iZXIgMjAyMSB0byBub3cu IFRoYW5rIHlvdSBhbGwgc28gc28gbXVjaCBmb3IgbWVudG9yaW5nIHVzDQogIGFuZCBpbnRyb2R1 Y2luZyB1cyB0byBPQ2FtbCA6aGVhcnQ6IDpmaXJlOiBJdCdzIGJlZW4gc3VjaCBhbiBlbmpveWFi bGUNCiAgZXhwZXJpZW5jZSENCg0KICBXZSBhcmUgaW52aXRpbmcgYW55b25lIHdobyBpcyBpbnRl cmVzdGVkIHRvIGF0dGVuZCBhIHZpcnR1YWwgc2Vzc2lvbg0KICBvZiAzIHNob3J0IHByZXNlbnRh dGlvbnMgb24gKkZyaWRheSwgTWFyY2ggNHRoLCA0LTVwbSBDRVQqICh3ZSB3aWxsDQogIHBvc3Qg dGhlIGxpbmsgdG8gam9pbiBvbiBUaHVyc2RheSkuIFRoZXJlIHdpbGwgYmUgdGltZSBmb3IgUSZB IGFmdGVyDQogIGVhY2ggcHJlc2VudGF0aW9uLCBhbmQgdGhlIHdob2xlIHNlc3Npb24gd2lsbCBi ZSByZWNvcmRlZCBhbmQgcG9zdGVkDQogIG9ubGluZSBzaG9ydGx5IGFmdGVyIGFzIHdlbGwuDQoN CiAg4oCiIEBheWM5IHdpbGwgcHJlc2VudCBvbiB1cGRhdGluZyBhIHN0YW5kYXJkIFBQWCBkZXJp dmVyIChtZW50b3JzOg0KICAgIEBwaXRhZyBAc2hvbmZlZGVyKQ0KICDigKIgQFNheVNheW8gd2ls bCBwcmVzZW50IG9uIHN5bnRheCBoaWdobGlnaHRpbmcgYW5kIG90aGVyIHVwZGF0ZXMgdG8NCiAg ICB0aGUgdnNjb2RlIGV4dGVuc2lvbiAobWVudG9yczogQHRtYXR0aW8gQGdzMDUxMCkNCiAg4oCi IEBKaWFlSyB3aWxsIHByZXNlbnQgb24gYnVpbGRpbmcgYSBiYXNpYyBtb25pdG9yaW5nIGRhc2hi b2FyZCBmb3INCiAgICBbb2NhbWwub3JnXSAobWVudG9yczogQHRtYXR0aW8pDQoNCiAgV2UgaG9w ZSB5b3UgY2FuIG1ha2UgaXQhDQoNCiAgLUBheWM5IEBTYXlTYXlvIEBKaWFlSw0KDQoNCltPdXRy ZWFjaHldIDxodHRwczovL291dHJlYWNoeS5vcmcvPg0KDQpbaW5pdGlhbCBhbm5vdW5jZW1lbnRd DQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubm91bmNpbmctb3VyLW5ldy1vdXRyZWFj aHktaW50ZXJucy84OTMyPg0KDQpbb2NhbWwub3JnXSA8aHR0cDovL29jYW1sLm9yZy8+DQoNCg0K QWZmZWN0OiBDb21wb3NhYmxlIGNvbmN1cnJlbmN5IHByaW1pdGl2ZXMgZm9yIE9DYW1sIDUuMA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZmZlY3QtY29tcG9zYWJs ZS1jb25jdXJyZW5jeS1wcmltaXRpdmVzLWZvci1vY2FtbC01LTAvOTQzMC8xPg0KDQoNCkRhbmll bCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBsb29rZWQgYSBiaXQgaW50 byB0aGUga2luZCBvZiBmaWJlciBhYnN0cmFjdGlvbiBhbmQgY29uY3VycmVuY3kNCiAgc3RydWN0 dXJlIEkgd291bGQgbGlrZSB0byB1c2Ugd2l0aCB0aGUgbmV3IHRvb2xzIE9DYW1sIDUuMCBpcyBn b2luZyB0bw0KICBvZmZlci4gIFlvdSBjYW4gZmluZCBzb21lIHJlc3VsdHMgaW4gYWZmZWN0J3Mg W2BGaWJlciddIG1vZHVsZS4NCg0KICBUaGlzIGZpYmVyIGFic3RyYWN0aW9uIHN1cHBvcnRzIHRl cm1pbmF0aW5nIGJ5IHJldHVybmluZyB2YWx1ZXMgb3INCiAgYWJub3JtYWxseSAoYnkgYWJvcnRp bmcgb3IgdmlhIGEgc3B1cmlvdXMgZXhjZXB0aW9uKS4gVGVybWluYXRpb24gb2YgYQ0KICBmaWJl ciBpcyBhbGlnbmVkIG9uIGZ1bmN0aW9uIHNjb3BlczogYWxsIHRoZSBmaWJlcnMgc3Bhd24gYnkg YSBmaWJlcg0KICBmdW5jdGlvbiBoYXZlIHRvIHRlcm1pbmF0ZSBpbiBvcmRlciBmb3IgaXQgdG8g dGVybWluYXRlLg0KDQogIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3VyIGZpYmVyIHJldHVybnMgYSB2 YWx1ZSBpdCB3YWl0cyBmb3IgaXRzIHNwYXducw0KICB0byB0ZXJtaW5hdGUgKGluIGFueSB3YXkp IGJlZm9yZSByZXR1cm5pbmcgdGhlIHZhbHVlLiBBbmQgaWYgeW91cg0KICBmaWJlciByZXR1cm5z IGFibm9ybWFsbHkgKHVuY2F1Z2h0IGVjZXB0aW9uIG9yIGV4cGxpY2l0IGFib3J0KSBpdA0KICBm aXJzdCBhYm9ydHMgYWxsIGl0cyBub24tdGVybWluYXRlZCBzcGF3bnMgYmVmb3JlIHJldHVybmlu ZyBhYm5vcm1hbGx5DQogIOKAkyB0aGlzIHByb3ZpZGVzIGFmZmVjdCdzIG5vdGlvbiBvZiBjYW5j ZWxsYXRpb24uDQoNCiAgRXhwbGljaXQgZmliZXIgYWJvcnRzIHJhaXNlIHRoZSBgQWJvcnQnIGV4 Y2VwdGlvbiBpbiBmaWJlcnMuIENvbWJpbmVkDQogIHdpdGggYSBkaXNjaXBsaW5lZCB1c2Ugb2Yg YEZ1bi5wcm90ZWN0JyBhbmQgYW4gb3B0aW9uYWwgYGZpbmFsbHknDQogIGhhbmRsZXIgc3BlY2lm aWVkIGF0IGZpYmVyIHNwYXduLCB0aGlzIGxldHMgdGhlbSByZWxlYXNlIHRoZQ0KICByZXNzb3Vy Y2VzIHRoZXkgbWF5IGhvbGQgd2hlbiBpdCdzIHRpbWUgdG8gc2F5IGdvb2RieWUuDQoNCiAgVGhl IG1vZHVsZSBhbHNvIHByb3ZpZGVzIGEgZ2VuZXJpYyB3YXkgb2YgYmxvY2tpbmcgYW5kIHVuYmxv Y2tpbmcNCiAgZmliZXJzIHRoYXQgeW91IGNhbiB1c2UgdG8gaW50ZXJmYWNlIHdpdGggeW91ciBm YXZvdXJpdGUgZXZlbnQNCiAgbG9vcC4gSXQgZG9lcyBzbyB3aXRob3V0IHJlcXVpcmluZyB0byBm aWRkbGUgd2l0aCBlZmZlY3RzLCB5b3UganVzdA0KICBuZWVkIHRvIG1ha2UganVkaWNpb3VzIHVz ZSBvZiBbYEZpYmVyLmJsb2NrJ10gYW5kIHByb3ZpZGUgYSBzdWl0YWJsZQ0KICBmdW5jdGlvbiB0 byBgRmliZXIucnVuJydzIGJ1aWx0LWluIHNjaGVkdWxlciB0byBsZXQgaXQga25vdyBhYm91dA0K ICBmaWJlcnMgdGhhdCBjYW4gYmUgdW5ibG9ja2VkLg0KDQogIEEgZ3JhYiBiYWcgb2YgY29tbWVu dHM6DQoNCiAgMS4gVGhlIGZpcnN0IGdvYWwgb2YgYWZmZWN0IGlzIHRvIHNlZWsgYSBjb25jdXJy ZW5jeSBhbmQgYWJvcnQNCiAgICAgc3RydWN0dXJlIHRoYXQgYXJlIGVhc3kgdG8gdW5kZXJzdGFu ZCwgdXNlIGFuZCBjb21wb3NlIHdpdGggZXZlbnQNCiAgICAgbG9vcHMuIFJpZ2h0IG5vdyBzb21l IGVmZmljaWVuY3kgYW5kIGltcGxlbWVudGF0aW9uIGFzcGVjdHMgbmVlZCB0bw0KICAgICBiZSBp bXByb3ZlZC4gVGhpcyB3aWxsIGxpa2VseSBjaGFuZ2UgdGhlIGV4cG9zZWQgc2V0IG9mIHByaW1p dGl2ZQ0KICAgICBlZmZlY3RzIHdoaWNoIGRvZXNuJ3QgZmVlbCBleGFjdGx5IHJpZ2h0IHlldCAo aWYgeW91IHdhbnQgdG8gYnVpbGQNCiAgICAgeW91ciBvd24gc2NoZWR1bGVyKS4NCg0KICAyLiBJ IHVzZSBhYm9ydCByYXRoZXIgdGhhbiBjYW5jZWwgdGVybWlub2xvZ3kuIEZyb20gbXkgbm9uLW5h dGl2ZQ0KICAgICBlbmdsaXNoIHNwZWFrZXIgcGVyc3BlY3RpdmUsIGNhbmNlbGxpbmcgaXMgbW9y ZSBhYm91dCBub3QgZG9pbmcNCiAgICAgc29tZXRoaW5nIHRoYXQgd2FzIHBsYW5uZWQgYnV0IGRp ZG4ndCBoYXBwZW4geWV0LiBBYm9ydGluZyBpcyBtb3JlDQogICAgIGFib3V0IHN0b3BwaW5nIHNv bWV0aGluZyB0aGF0IGlzIGdvaW5nIG9uLiBJdCBhbHNvIG1lbGRzIGJldHRlcg0KICAgICB3aXRo IHRoZSB1bmNhdWdodCBleGNlcHRpb24gY2FzZS4NCg0KICAzLiBTYXkgbm8gdG8gYHVuaXQnIHNv dXBzISBMZXQgZmliZXJzIHJldHVybiB2YWx1ZXMuDQoNCiAgNC4gQXQgdGhhdCBwb2ludCBJIGRv bid0IGZlZWwgdGhlIG5lZWQgdG8gYWRkIGEgcHJvbWlzZS9mdXR1cmUNCiAgICAgYWJzdHJhY3Rp b24gdG8gdGhlIHRvb2xib3guIFRoZSB3aG9sZSBwb2ludCBvZiBkaXJlY3Qgc3R5bGUgaXMgdG8N CiAgICAgZ2V0IHJpZCBvZiB0aGlzIGFzeW5jIG1hZG5lc3MuDQoNCiAgNS4gVGhlcmUncyBubyBz eW5jaHJvbmlzYXRpb24gc3RydWN0dXJlIHlldC4gU2VtYXBob3JlcyBhcmUgYWx3YXlzDQogICAg IHVzZWZ1bCBmb3IgdGhyb3R0bGluZyBzbyBJJ2xsIGNlcnRhaW5seSBhZGQgdGhhdCBhdCBzb21l IHBvaW50IG9yIGENCiAgICAgbW9yZSBmdW5kYW1lbnRhbCBwcmltaXRpdmUgbGlrZSBhbiBtdmFy Lg0KDQogIDYuIFRoZSBbYEZ1bml4J10gbW9kdWxlIGhhcyBhIGZldyBmaWJlciBmcmllbmRseSBg VW5peCcgbW9kdWxlDQogICAgIGZ1bmN0aW9ucyBmb3IgcGxheWluZyB3aXRoIHRpbWVycyBhbmQg dGhlIG5ldHdvcmssIHNlZSBbYHBpbmcubWwnXQ0KICAgICBmb3IgYW4gZXhhbXBsZSBvZiB1c2Uu IEluIHByYWN0aWNlIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gdXNlDQogICAgIHNvbWV0aGluZyBl bHNlIHRoYW4gYHNlbGVjdCgyKScgdGhvdWdoLiBUaGVyZSBhcmUgdmFyaW91cyB3YXlzIG9uZQ0K ICAgICBjb3VsZCBnbyBhYm91dCB0aGlzLCBzZWUgZm9yIGV4YW1wbGUgcG9pbnQgNi4gaW4gdGhl c2UgW2Rlc2lnbg0KICAgICBub3Rlc10uDQoNCiAgNy4gVGhlIFtgbW91c2UubWwnXSBoYXMgYSBi YXNpYyBleGFtcGxlIG9uIGhvdyB0byBpbnRlcmZhY2Ugd2l0aCB0aGUNCiAgICAgU0RMIGV2ZW50 IGxvb3Agd2hpY2ggcHJvdmlkZXMgYW5vdGhlciBleGFtcGxlIG9uIGhvdyBvbmUgZ29lcyB0bw0K ICAgICBpbnRlcmZhY2UgYEZpYmVyJyB3aXRoIGV2ZW50IGxvb3BzLg0KDQogIEknbSBub3QgZnVs bHkgY29udmluY2VkIGJ5IGV2ZXJ5dGhpbmcgeWV0LiBJdCB3aWxsIGNlcnRhaW5seSBuZWVkIG9u ZQ0KICBvciB0d28gbW9yZSBkZXNpZ24gcm91bmRzLiBJZiB5b3UgdHJ5IGl0LCBmZWVsIGZyZWUg dG8gY29tbWVudCBvciBtYWtlDQogIHN1Z2dlc3Rpb25zIG9uIHRoZSBpc3N1ZSB0cmFja2VyLg0K DQogIEhvbWUgcGFnZTogPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdD4NCg0K ICBBUEkgZG9jczogPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdC9kb2MvPiAo b3IgYG9kaWcgZG9jDQogIGFmZmVjdCcpDQoNCiAgSW5zdGFsbDoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS4wLjArdHJ1bmsNCiAg4pSCIG9wYW0gcGluIGFk ZCBodHRwczovL2VycmF0aXF1ZS5jaC9yZXBvcy9hZmZlY3QuZ2l0DQogIOKUlOKUgOKUgOKUgOKU gA0KDQoNCltgRmliZXInXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYWZmZWN0L2Rv Yy9GaWJlci9pbmRleC5odG1sPg0KDQpbYEZpYmVyLmJsb2NrJ10NCjxodHRwczovL2VycmF0aXF1 ZS5jaC9zb2Z0d2FyZS9hZmZlY3QvZG9jL0ZpYmVyL2luZGV4Lmh0bWwjdmFsLWJsb2NrPg0KDQpb YEZ1bml4J10gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2FmZmVjdC9kb2MvRnVuaXgv aW5kZXguaHRtbD4NCg0KW2BwaW5nLm1sJ10NCjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkv YWZmZWN0L2Jsb2IvbWFzdGVyL3Rlc3QvcGluZy5tbD4NCg0KW2Rlc2lnbiBub3Rlc10NCjxodHRw czovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYWZmZWN0L2Jsb2IvbWFzdGVyL0RFU0lHTi5tZD4NCg0K W2Btb3VzZS5tbCddDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2FmZmVjdC9ibG9iL21h c3Rlci90ZXN0L21vdXNlLm1sPg0KDQoNClNlZ2ZhdWx0IFN5c3RlbXMgSm9pbnMgVGFyaWRlcw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZWdmYXVsdC1zeXN0ZW1zLWpvaW5zLXRhcmlkZXMvOTQz MS8xPg0KDQoNClRob21hcyBHYXphZ25haXJlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgQGtheWNlZXNyayBhbmQgSSBhcmUgZGVsaWdodGVkIHRvIGFubm91bmNlIHRo YXQgU2VnZmF1bHQgU3lzdGVtcywgYQ0KICBzcGlub3V0IGZyb20gSUlULU1hZHJhcywgaXMgam9p bmluZyBUYXJpZGVzLiAgVGFyaWRlcyBoYXMgd29ya2VkDQogIGNsb3NlbHkgd2l0aCBTZWdmYXVs dCBTeXN0ZW1zIG92ZXIgdGhlIGxhc3QgY291cGxlIG9mIHllYXJzLCBtb3N0DQogIG5vdGFibHkg b24gdGhlIGF3YXJkLXdpbm5pbmcgTXVsdGljb3JlIE9DYW1sIHByb2plY3QgYW5kIHRoZQ0KICB1 cHN0cmVhbWluZyBwbGFucyBmb3IgT0NhbWwgNS4wLiBUaGlzIGFsbGlhbmNlIGZ1cnRoZXJzIHRo ZSBnb2FscyBvZg0KICBUYXJpZGVzLCBicmluZ2luZyB0aGUgY29tcGlsZXIgYW5kIGJlbmNobWFy a2luZyBleHBlcnRpc2Ugb2YgdGhlDQogIFNlZ2ZhdWx0IHRlYW0gZGlyZWN0bHkgaW50byB0aGUg VGFyaWRlcyBvcmdhbmlzYXRpb24sIHdoZXJlIGl0IGNhbiBiZQ0KICBjb21tZXJjaWFsbHkgZnVu ZGVkIGFuZCBzdXBwb3J0ZWQuDQoNCiAgQWxsIG9mIFNlZ2ZhdWx0IFN5c3RlbXPigJkgZXhpc3Rp bmcgcmVzcG9uc2liaWxpdGllcyBhbmQgb3Blbi1zb3VyY2UNCiAgY29tbWl0bWVudHMgd2lsbCBt aWdyYXRlIG92ZXIgdG8gVGFyaWRlcywgd2hlcmUgd29yayB3aWxsIGNvbnRpbnVlDQogIHRvd2Fy ZHMgdGhlIHRocmVlIG1haW4gb2JqZWN0aXZlcyBpbiAyMDIyOg0KDQogIOKAoiBSZWxlYXNpbmcg T0NhbWwgNS4wIHdpdGggc3VwcG9ydCBmb3IgZG9tYWlucyBhbmQgZWZmZWN0IGhhbmRsZXJzDQog IOKAoiBTdXBwb3J0aW5nIHRoZSBlY29zeXN0ZW0gdG8gbWlncmF0ZSB0aGUgT0NhbWwgY29tbXVu aXR5IG92ZXIgdG8NCiAgICBPQ2FtbCA1LjANCiAg4oCiIEltcHJvdmluZyBkZXZlbG9wZXIgcHJv ZHVjdGl2aXR5IGZvciBPQ2FtbCA1LjAgYnkgcmVsZWFzaW5nIHRoZSBiZXN0DQogICAgcGxhdGZv cm0gdG9vbHMNCg0KICBUaGlzIGFsbGlhbmNlIHdpbGwgY29tcGxlbWVudCB0aGUgY29tbWVyY2lh bCBvZmZlcmluZ3Mgb2YgVGFyaWRlcyDigJMNCiAgYWxyZWFkeSBzdHJlbmd0aGVuZWQgYnkgdGhl IGludGVncmF0aW9uIG9mIFtPQ2FtbCBMYWJzXSDigJMgYW5kDQogIGNvbnRyaWJ1dGUgdG8gVGFy aWRlc+KAmSBtaXNzaW9uOiBlbXBvd2VyaW5nIGRldmVsb3BlcnMsIGNvbW11bml0aWVzLA0KICBh bmQgb3JnYW5pc2F0aW9ucyB0byBhZG9wdCBPQ2FtbCBhcyB0aGVpciBwcmltYXJ5IHByb2dyYW1t aW5nDQogIGV4cGVyaWVuY2UgYnkgcHJvdmlkaW5nIHRyYWluaW5nLCBleHBlcnRpc2UsIGFuZCBk ZXZlbG9wbWVudCBzZXJ2aWNlcw0KICBhcm91bmQgdGhlIE9DYW1sIGxhbmd1YWdlLg0KDQogIFJl YWQgdGhlIGZ1bGwgYW5ub3VuY2VtZW50IFtoZXJlXSwgaW5jbHVkaW5nIGRldGFpbHMgb2Ygb3Vy IGdvYWxzIGFuZA0KICB0aGUgZm9jdXMgZm9yIDIwMjIuIFRoaXMgYWxsaWFuY2UgYnJpbmdzIHRo ZSBoZWFkY291bnQgb2YgVGFyaWRlcyB1cA0KICB0byA2MCsgcGVvcGxlLCBhbGwgd29ya2luZyB0 b3dhcmRzIG1ha2luZyBPQ2FtbCB0aGUgYmVzdCBsYW5ndWFnZSBmb3INCiAgYW55IGFuZCBldmVy eSBwcm9qZWN0LiBKb2luIG91ciB0ZWFtIGFuZCByZWFjaCBvdXQgZm9yIGNvbW1lcmNpYWwNCiAg c2VydmljZXMgYXQgW2h0dHBzOi8vdGFyaWRlcy5jb20vXS4NCg0KDQpbT0NhbWwgTGFic10gPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1sYWJzLWpvaW5zLXRhcmlkZXMvOTIyOT4N Cg0KW2hlcmVdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjItMDMtMDEtc2VnZmF1bHQt c3lzdGVtcy1qb2lucy10YXJpZGVzPg0KDQpbaHR0cHM6Ly90YXJpZGVzLmNvbS9dIDxodHRwczov L3RhcmlkZXMuY29tLz4NCg0KDQpPQ2FtbCBVc2VyIFN1cnZleSAyMDIyDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC11c2Vy LXN1cnZleS0yMDIyLzk0MzMvMT4NCg0KDQpLaW0gTmd1eeG7hW4gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICB3ZSBhcmUgZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSBbT0NhbWwgVXNlciBTdXJ2ZXkgMjAy Ml0uIFdpdGggdGhpcw0KICBzdXJ2ZXksIHRoZSBPQ1NGIGlzIHRyeWluZyB0byBnZXQgYSBiZXR0 ZXIgcGljdHVyZSBvZiB0aGUgT0NhbWwNCiAgY29tbXVuaXR5IGFuZCBpdHMgbmVlZHMuIEl0IHdv dWxkIGJlIHZlcnkgaGVscGZ1bCBpZiB5b3UgY291bGQgdGFrZSBhDQogIGZldyBtaW51dGVzICgx MCB0byAxNSkgdG8gZmlsbCB0aGUgc3VydmV5IGFuZCBzaGFyZSBpdCB3aXRoIG90aGVyDQogIE9D YW1sIHByb2dyYW1tZXJzLg0KDQogIFtodHRwczovL2Zvcm1zLmdsZS9vS3kySm96MWNaaENQTnRm Nl0NCg0KICBUaGUgc3VydmV5IGlzIHJ1biBieSB0aGUgW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRp b25dLiBJdCBidWlsZHMgb24NCiAgW3RoZSBwcmV2aW91cyBpdGVyYXRpb25dIGlzc3VlZCBpbiAy MDIwLiBUaGUgcmVzdWx0cyB3aWxsIGJlIHB1Ymxpc2hlZA0KICBoZXJlIG9uIGRpc2N1c3MgYW5k IG9uIHRoZSBbd2Vic2l0ZSBvZiB0aGUgT0NTRl0uIFdlIHdvdWxkIGxpa2UgdG8NCiAgcGFydGlj dWxhcmx5IHRoYW5rIEBjanIgZm9yIGhpcyBoZWxwIGFzIHdlbGwgYXMgZXZlcnlvbmUgd2hvIGNv bW1lbnRlZA0KICBvbiB0aGUgcHJldmlvdXMgc3VydmV5LiBXZSB0cmllZCBvdXIgYmVzdCB0byB0 YWtlIGFsbCByZW1hcmtzIGludG8NCiAgYWNjb3VudCBidXQgc3VyZWx5IG1pc3NlZCBzb21ldGhp bmcuIERvbid0IGhlc2l0YXRlIHRvIGdpdmUgdXMgeW91cg0KICBmZWVkYmFjayAoeW91IGNhbiBw b3N0IGhlcmUgb3Igc2VuZCBtZSBhIG1lc3NhZ2UvZW1haWwpLg0KDQogIFRoZSBzdXJ2ZXkgd2ls bCByZW1haW4gb3BlbmVkIHVudGlsIE1hcmNoIDExdGggMjAyMiAoQU9FKS4NCg0KDQpbT0NhbWwg VXNlciBTdXJ2ZXkgMjAyMl0gPGh0dHBzOi8vZm9ybXMuZ2xlL29LeTJKb3oxY1poQ1BOdGY2Pg0K DQpbaHR0cHM6Ly9mb3Jtcy5nbGUvb0t5MkpvejFjWmhDUE50ZjZdDQo8aHR0cHM6Ly9mb3Jtcy5n bGUvb0t5MkpvejFjWmhDUE50ZjY+DQoNCltPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSA8aHR0 cHM6Ly9vY2FtbC1zZi5vcmcvPg0KDQpbdGhlIHByZXZpb3VzIGl0ZXJhdGlvbl0NCjxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXVzZXItc3VydmV5LTIwMjAvNjYyND4NCg0K W3dlYnNpdGUgb2YgdGhlIE9DU0ZdIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of February 22 to March = 01, 2022.

data-encoding.0.5 release

Rapha=C3=ABl Proust announced

On behalf of Nomadic Labs, I'= m happy to announce the release of data-encoding version 0.5.

This new version brings several bug fixes, some increased test coverage, mi= nor improvements in the API, and a major new feature:

Compact encodings: sub-byte tag sizes

This new version provides a new set of combinators for compact encodings. These compact encodings will handle all the verbose and error-prone bit-twidling process needed to combine multiple= sub-byte discriminators into a single byte-size one.

E.g., the encoding let e1 =3D either (either bool unit) (option bool)= uses three bits in the shared tag and zero bytes after that; the encoding let e2 =3D either int32 int64 uses one bit in the= shared tag and either 4 or 8 bytes to represent the integer; the product encoding let ee =3D tup2 e1 e2 uses four (3 + 1) b= its in the shared tag and either 4 or 8 bytes to represent the integer of e2.

How to get

The code is available under MIT license on https://gitlab.com/nomadic-labs/data-encoding.

It can be installed via opam.

Dario Teixeira asked and Rapha=C3=ABl Proust replied<= /h3>

Hi @raphael-proust! I have a question regarding the connection between data-encoding and json-data-encoding, also developed at Nomadic Labs. The latter seems tied to JSON, whereas the forme= r is more flexible, supporting also binary encodings. However, since data-encoding also supports JSON, do= esn't it subsume json-data-encoding completely?

The data-encoding library uses json-data-encoding= for its JSON backend. It delegates conversion from OCaml values into and from JSON to the primitives provided in the interface of jso= n-data-encoding.

In a way, yes, as an end-user you don't need to use json-data-encodin= g directly because you can use the Json module of data-encoding instead. There are three possible reas= ons why you might add json-data-encoding as a (non-transitive) dependency to your project and use it directly in your cod= e:

  • You want to keep the dependency set and the number of abstraction layer= s as small as possible. E.g., in order to reduce binary size.
  • You want some static guarantees that some encodings are only every used= for JSON. E.g., in your logging system.
  • You need to define a JSON encoding which is rejected by data-enco= ding on grounds that it is invalid in binary. Note that
    • This is very specific to some combinators but basically some combinator= s will reject their inputs (raise Invalid_argument) because us= ing the serialiser would lead to undecodable data. Most typically, this hap= pens if you try to concatenate two fields of unknown length. Decoding the r= esult becomes a guessing game as to were one field stops and where the next= begins. These could easily be represented as an array in JSON which includ= es all the delimiters you need to decode it.
    • There are other workarounds (e.g., prefixing the fields with a length f= ield), but going for the JSON encoding directly is a valid approach if you = only need JSON.

Rapha=C3=ABl Proust later announced

Version 0.5.1 of the data-encoding has just been released.

This is a bugfix release making one of the library's internal checks more p= ermissive. Without this fix (i.e., using version 0.5), some valid encodings are rejected (raising Invalid_argu= ment) by the library.

You can update via opam: opam install data-encoding.0.5.1

Tutorial: Roguelike with effect handlers

art-w announced

The recent conversations about eio 0.1 and agnostic blocking have made me very curious about effect handlers. The multicore team has done an awesome job with their tutor= ials, examples and talks, but the laymen have been too quiet for such an exciting feature! Where are all the blog posts about how = "you could have invented algebraic effects" and "one-shot continuations are like spaghetti"?

In any case, I'm hoping to tease some of you into trying them out with a simple tutori= al about programming a roguelike with effect handlers :)

There's nothing new here besides the fun use-case! So if you already have a= n intuitive understanding of the syntax and motivations, you may be more interested by a deeper look at the scope of effect handlers – and a soft introduction to some less common features of the type system. (this link was previously posted deep into = the eio thread)

I would be grateful if you spot any mistake! I'm also curious of other fun = applications for effect handlers… and if you feel like sharing your own surprises and discoveries, I believe it coul= d really help others learn faster :)

Kiran Gopinathan then said

Great blog post! That seems like a very elegant implementation!

Funny you should make a rougelike :smiley: , I guess effect handlers + game= s might be popular for games, because I also had a blog post about effect handlers and their applications, in parti= cular for games, although in my case it was for animations:

https://gopiandcode.uk/logs/log-bye-bye-monads-algebraic-effects.htm= l

gasche also replied

Note: the "upstream" status of effect handlers is a little uncertain/confus= ing right now. Your blog post (I didn't get a chance to read it yet, but it sounds very nice!) uses the experimenta= l syntax of multicore-4.12+effects, but that syntax was intentionally not upstreamed, and it will not= be part of OCaml 5.0.

I think there is a risk of confusion because the community is aware that Mu= lticore OCaml has effect handlers, and also that Multicore OCaml has been merged upstream. So it can be tempting t= o believe that the upcoming OCaml release (or maybe one or two releases after that, we said the first Multicore relea= se would be more like a preview) will support effect handlers as a language feature. It will not! Effects as a la= nguage feature were removed from Multicore OCaml before the upstream merge. And no one knows if/when they will = be supported upstream.

So: I think that your blog posts on using effect handlers could have somewh= ere a short mention that the code is using an experimental extension of OCaml that is not supported by the upstream im= plementation.

The reasoning for this choice is that we want to give a chance to a type sy= stem for effect handlers, but that still need quite a bit more time than the Multicore runtime itself. We don't want= to encourage the ecosystem to rely on untyped effects, if it means a lot of pain upgrading to typed effects later= (or risk having to support both).

5.0 only contains basic support for effect handlers as a runtime primiti= ve, but dos not support handlers as a language feature. I think they should be considered experimental: yo= u can rely on them for their intended purpose of exposing a flexible interface for concurrent fibers, but uses beyond tha= t may break in the future.

So, in a sense, we don't want people to use them. It's of course fine to us= e experimental features from experimental forks of the OCaml compiler (effect handlers, modular implicits or explicit= s, runtime type representations and what not), and the people working on these experimental features do benefit from= other people trying them and giving them feedback. But we don't want people to depend on it in production, wh= atever that means. (For example, code using it is likely to get stuck on 4.12 forever and never see an upgrade to upcoming= OCaml versions, although of course people could choose to port the experimental branch forward.)

For Diversity and the OCaml Community: Outreachy Summer 2022

Sonja Heinze announced

Just in case anyone is actually interested in this: the project submission = deadline has been extended from March 4th to March 23rd. So the updated timeline now looks as follows:

3D"534ca9a08bce=

where 2. and 3. probably need to be done a bit in parallel.

Bogue, the OCaml GUI

sanette announced

Hi, some new developments. I have implemented a new Sdl_area w= idget where one can conveniently issue any SDL function (from the SDL Renderer API).

Here is (below) the new 'labelled graph' example. In this example I am usin= g regular "label" widgets for creating the nodes, and I am using an Sdl_area for drawing the lines.

The nice things for labels to be regular widgets is that one can click on t= hem. To demonstrate this, in this example they react to a click by jumping to another random location (with animation= ).

3D=

3D"d6958e266f27=

open Bogue
module W =3D Widget
module L =3D Layout

let n =3D 15 (* number of discs *)
let radius =3D 20
let width =3D 800
let height =3D 600

let c =3D Draw.find_color "#e5b92c"
let cb =3D Draw.find_color "#7b6b35"
let disc_style =3D =
Style.(
    create ~border:(
      mk_border ~radius (mk_line ~color:Draw.(opaque c) ~width:1 ~style:Solid =
()))
      ~background:(color_bg Draw.(opaque cb)) ())

let background =3D =
L.style_bg Style.(
    of_bg (gradient ~angle:45. Draw.[opaque grey; opaque black]))

let fg =3D Draw.(opaque white)

let create_disc i (x,y) =3D
  let w =3D 2*radius + 1 in
  let bg =3D Box.create ~style:disc_style ~width:w ~he=
ight:w () in
  W.label ~fg (string_of_int i)
  |> L.resident ~background:(<=
span style=3D"color: #228b22;">L.box_bg bg) ~x:(x-radius) ~y:(y-r=
adius) ~w ~h:w

let move_disc (x,y) d =3D
  let (x0, y0)=
 =3D L.xpos d, L.ypos d in
  L.animate_x d (Avar.fromto x0 x);
  L.animate_y d (Avar.fromto y0 y)

let random_center _=
 =3D
  radius + Random.int (width - 2*rad=
ius),
  radius + Random.int (height - 2*ra=
dius)

let area =3D
  let sdlw =3D W.sdl_area ~w:width ~h:height () in
  let sdla =3D W.get_sdl_area sdlw in<=
/span>
  let centers =3D Arr=
ay.init n random_center in
  let color =3D Draw.=
(opaque grey) in<=
/span>
  let draw_lines rend=
erer =3D let open Draw in
    for i =3D 0 to n - 2 do
      let x0, y0 =3D to_pixels centers.(i) in
      let x1, y1 =3D to_pixels centers.(i+1) in
      line renderer ~color ~thick:6 =
~x0 ~y0 ~x1 ~y1
    done in
  Sdl_area.add sdla draw_lines;
  let discs =3D Array=
.mapi create_disc centers |> Array.to_list in
  (* move the disc when click on it *)
  List.iteri (fun i d ->
      W.on_click ~click:(fun _ ->
          centers.(i) <- random_center 0;
          Sdl_area.update sdla;
          let x,y =3D centers.(i) in
          move_disc (x - radius, y - radius) d) (L.widget d))
    discs;
  L.superpose ~w:width ~h:height =
~background (L.resident sdlw :: discs)

let board =3D Bogue=
.make []<=
/span> [area]

let () =3D Bogue.run board

Friday 03/04 Intern presentations – open attendance!

Aya announced

This is Aya, one of the three Outreachy<= /a> interns working on OCaml this winter :camel: After 3 very fast months, our internships are already coming to a close. We have = had such a great time working on our projects and learning OCaml that we want to hold an event to mark the end o= f the internships, and we decided to open it up to the community :tada:

As you might have seen in the initial announcement, @pitag @shonfeder @gs0510 @tmattio and @pkel all volunteered to mentor us from December 2021 to now. = Thank you all so so much for mentoring us and introducing us to OCaml :heart: :fire: It's been such an enjoyable expe= rience!

We are inviting anyone who is interested to attend a virtual session of 3 s= hort presentations on Friday, March 4th, 4-5pm CET (we will post the link to join on Thursday). There will be ti= me for Q&A after each presentation, and the whole session will be recorded and posted online shortly after as well.

  • @ayc9 will present on updating a standard PPX deriver (mentors: @pitag = @shonfeder)
  • @SaySayo will present on syntax highlighting and other updates to the v= scode extension (mentors: @tmattio @gs0510)
  • @JiaeK will present on building a basic monitoring dashboard for ocaml.org (mentors: @tmattio)

We hope you can make it!

-@ayc9 @SaySayo @JiaeK

Affect: Composable concurrency primitives for OCaml 5.0

Daniel B=C3=BCnzli announced

I looked a bit into the kind of fiber abstraction and concurrency structure= I would like to use with the new tools OCaml 5.0 is going to offer. You can find some results in affect's Fiber module.

This fiber abstraction supports terminating by returning values or abnormal= ly (by aborting or via a spurious exception). Termination of a fiber is aligned on function scopes: all the f= ibers spawn by a fiber function have to terminate in order for it to terminate.

This means that if your fiber returns a value it waits for its spawns to te= rminate (in any way) before returning the value. And if your fiber returns abnormally (uncaught eception or explicit = abort) it first aborts all its non-terminated spawns before returning abnormally =E2=80=93 this provides a= ffect's notion of cancellation.

Explicit fiber aborts raise the Abort exception in fibers. Com= bined with a disciplined use of Fun.protect and an optional finally handler specified at fiber spawn, this lets t= hem release the ressources they may hold when it's time to say goodbye.

The module also provides a generic way of blocking and unblocking fibers th= at you can use to interface with your favourite event loop. It does so without requiring to fiddle with effects, = you just need to make judicious use of Fiber.block and provide a suitable function to Fiber.run's built-in scheduler to let it know about fibers = that can be unblocked.

A grab bag of comments:

  1. The first goal of affect is to seek a concurrency and abort structure t= hat are easy to understand, use and compose with event loops. Right now som= e efficiency and implementation aspects need to be improved. This will like= ly change the exposed set of primitive effects which doesn't feel exactly r= ight yet (if you want to build your own scheduler).
  2. I use abort rather than cancel terminology. From my non-native english = speaker perspective, cancelling is more about not doing something that was = planned but didn't happen yet. Aborting is more about stopping something th= at is going on. It also melds better with the uncaught exception case.
  3. Say no to unit soups! Let fibers return values.
  4. At that point I don't feel the need to add a promise/future abstraction= to the toolbox. The whole point of direct style is to get rid of this asyn= c madness.
  5. There's no synchronisation structure yet. Semaphores are always useful = for throttling so I'll certainly add that at some point or a more fundament= al primitive like an mvar.
  6. The Funix module has a few fiber friendly Unix= module functions for playing with timers and the network, see ping.ml for an example of use. In practice you want to be able to use som= ething else than select(2) though. There are various ways one = could go about this, see for example point 6. in these design notes.
  7. The mouse.ml has a basic example on how to interface wit= h the SDL event loop which provides another example on how one goes to inte= rface Fiber with event loops.

I'm not fully convinced by everything yet. It will certainly need one or tw= o more design rounds. If you try it, feel free to comment or make suggestio= ns on the issue tracker.

Home page: https://erratiq= ue.ch/software/affect

API docs: https://err= atique.ch/software/affect/doc/ (or odig doc affect)

Install:

opam switch create 5.0.0+trunk
opam pin add https://erratique.ch/repos/affect.git

Segfault Systems Joins Tarides

Thomas Gazagnaire announced

@kayceesrk and I are delighted to announce that Segfault Systems, a spinout= from IIT-Madras, is joining Tarides. Tarides has worked closely with Segfault Systems over the last couple of ye= ars, most notably on the award-winning Multicore OCaml project and the upstreaming plans for OCaml 5.0. This allia= nce furthers the goals of Tarides, bringing the compiler and benchmarking expertise of the Segfault team direc= tly into the Tarides organisation, where it can be commercially funded and supported.

All of Segfault Systems=E2=80=99 existing responsibilities and open-source = commitments will migrate over to Tarides, where work will continue towards the three main objectives in 2022:

  • Releasing OCaml 5.0 with support for domains and effect handlers
  • Supporting the ecosystem to migrate the OCaml community over to OCaml 5= .0
  • Improving developer productivity for OCaml 5.0 by releasing the best pl= atform tools

This alliance will complement the commercial offerings of Tarides – = already strengthened by the integration of OCaml= Labs – and contribute to Tarides=E2=80=99 mission: empowering developers, communities, and organisations to adopt OCaml as the= ir primary programming experience by providing training, expertise, and development services around the OCaml la= nguage.

Read the full announcement here, including details of our goals and the focus for 2022. This alliance brings the headc= ount of Tarides up to 60+ people, all working towards making OCaml the best language for any and every project. J= oin our team and reach out for commercial services at https://tarides.com/.

OCaml User Survey 2022

Kim Nguy=E1=BB=85n announced

we are delighted to announce the OCaml User Survey 2022. With this survey, the OCSF is trying to get a better picture of the OCaml community and its needs= . It would be very helpful if you could take a few minutes (10 to 15) to fill the survey and share it with other OC= aml programmers.

https://forms.gle/oKy2Joz1c= ZhCPNtf6

The survey is run by the OCaml Software F= oundation. It builds on the previous iteration issued in 2020. The results will be published here on discuss and on the website of th= e OCSF. We would like to particularly thank @cjr for his help as well as everyone who commented on the previous survey. We t= ried our best to take all remarks into account but surely missed something. Don't hesitate to give us your feedbac= k (you can post here or send me a message/email).

The survey will remain opened until March 11th 2022 (AOE).

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DB1B3E0045 for ; Tue, 15 Mar 2022 10:59:24 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=y+eG=T2=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: NMOiSL9nPQ+Anhbkxqi3l6F3gOtA+HCY9A3y1zkojyaalWHfGljwXXAJQtgsMO43B1LT2aFI11 Yyw79jsVapQLRXmRdpRK0PxZG9eKkzSYRfoTEqUZms3ZnZDqaPA8/rupjGYbOF2LCu5/GCxIgs qrH7Oo354L6nEuAAazZVV4KgBTSYssn8CIr+FLjqHp7aFHLr6b5TNF+Y1dQA37/4GLN4pYJ+K9 l/6VOftu8z8JetrnH1+pQdW1aTLIg6BIzwOijJXFFBbi5V657l4FcGSS+0hIz+zO4JQK/Nd6zu ToxXw6J0t9Qp4LOiTjtp/it3 X-IPAS-Result: =?us-ascii?q?A0DXAAAcYzBimCIeaIFahARfKBkBZFcrBwhEhFSJBogSi?= =?us-ascii?q?UyGdo1HA08QAQMBDSoBDgUBAgQBAYUghBACHgYBBTMTAQIEAQEBAQMCAwEBA?= =?us-ascii?q?QEBAQMBAQUBAQECAQECAwQBEwEBAQEBAQEBCQsJBwYMBRAOBTxkZASBSwSBd?= =?us-ascii?q?As0DYI1DAwDA4N3ARgJBAZAJSMDFAEGAwIEDQEXARQKFwESGoIMXgGDFgUKk?= =?us-ascii?q?VacDH8ygQGDTwEDAgENAw8vg3OBZA0CFIECF4YUVkqDAwmEBgInEIFVRIItg?= =?us-ascii?q?RFKB26BQQEOAQF6FwEBAQEBgScUAQGDOheCTgSWWwgCBDgIHlYUBRQWAQEgA?= =?us-ascii?q?i4IIxUBBxsBJg4VBS8BFgIeDQIDkV4kAg+YR5QZejQHg0yBOgYLiCSBHYxzi?= =?us-ascii?q?CGDc4FOil+YGSGWNiCJGIEPCYJDlBQdCAsfhQaBTiqBTRwCDAczGjBDgmkJR?= =?us-ascii?q?QEDAg0BAgIDAQIBAgkBAQJUjVUWgQQBCII8B2VZgSaBdTuFSQJANAIBATQCB?= =?us-ascii?q?gEKAQEDCYVjAQEFEwsBhnkrgh0BAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 28JSw+/Lw== IronPort-HdrOrdr: A9a23:05mECaxKGjmwqVcYNU9xKrPwK71zdoMgy1knxilNoH1uEvBw+P rAoB1273XJYVUqOU3I++rvBEDoexq1nqKdirN8AV7NZmTbkVrtBL4nx4rvyT/tFkTFh41g/J YlVbNxTPn5DV0St7ee3OBUKadD/OW6 X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,183,1643670000"; d="scan'208,217";a="26186085" X-MGA-submission: =?us-ascii?q?MDFqU7q/gKIb9kXDM9sIytJokWRx1U9MpqY/Dl?= =?us-ascii?q?dl22t1N4rEe48NHdN28YKLhjvkglrKvzZk2GQcVeE+0btXBGidS1xhaR?= =?us-ascii?q?Ya1u/X48QnWHh4/ePzvcHbMwAR9/wgTwTdZ4DF8VJVJW0FGsZPuqzMU6?= =?us-ascii?q?T1KOtvzPkvnS30SF98mbl7Cg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Mar 2022 10:59:24 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0518F565B45; Tue, 15 Mar 2022 10:59:23 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 15 Mar 2022 10:59:22 +0100 Message-ID: <87a6dr1qpx.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 15 10:59:23 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.065726, queueID=4951B565B46 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMDggdG8gMTUsDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClJvYnVyIFJl cHJvZHVjaWJsZSBCdWlsZHMNCk9DYW1sIFRlWG1hY3MgcGx1Z2luDQpSZWxlYXNlIG9mIG9jYW1s LXNmL2xlYXJuLW9jYW1sOjAuMTQuMA0KVHV0b3JpYWw6IFJvZ3VlbGlrZSB3aXRoIGVmZmVjdCBo YW5kbGVycw0KQXdlc29tZSBNdWx0aWNvcmUgT0NhbWwgYW5kIE11bHRpY29yZSBNb25vcmVwbw0K cHB4X3ZpZXdwYXR0ZXJuIGluaXRpYWwgcmVsZWFzZQ0KT2xkIENXTg0KDQoNClJvYnVyIFJlcHJv ZHVjaWJsZSBCdWlsZHMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJvYnVyLXJlcHJvZHVjaWJsZS1idWlsZHMvODgy Ny82Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIEhhbm5lcyBNZWhuZXJ0IGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIGJhY2tncm91bmQgYXJ0 aWNsZSBieSBAcmFuZCBpcyBub3cgb25saW5lDQogIDxodHRwczovL3I3cDUuZWFydGgvYmxvZy8y MDIyLTMtNy9CdWlsZGVyLXdlYiUyMHZpc3VhbGl6YXRpb25zJTIwYXQlMjBSb2J1cj4NCg0KDQpP Q2FtbCBUZVhtYWNzIHBsdWdpbg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vc3ltcGEu aW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDIyLTAzL21zZzAwMDA5Lmh0bWw+DQoNCg0K Tmljb2xhcyBSYXRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIG1hZGUgYSBi YXNpYyBPQ2FtbCBwbHVnaW4gZm9yIFRlWG1hY3MgKDxodHRwOi8vd3d3LnRleG1hY3Mub3JnPikg SQ0KICB3b3VsZCBsaWtlIHRvIGtlZXAgaXQgc2ltcGxlLCBidXQgY29tbWVudHMgYW5kIGltcHJv dmVtZW50cyBhcmUNCiAgd2VsY29tZS4NCiAgPGh0dHA6Ly9mb3J1bS50ZXhtYWNzLmNuL3Qvb2Nh bWwtYS1iYXNpYy1vY2FtbC1wbHVnaW4tZm9yLXRleG1hY3MvODEzPg0KDQoNClJlbGVhc2Ugb2Yg b2NhbWwtc2YvbGVhcm4tb2NhbWw6MC4xNC4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLW9mLW9jYW1sLXNmLWxlYXJuLW9jYW1sLTAt MTQtMC85NDkxLzE+DQoNCg0KWXVydWcgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgdmVyeSBwbGVhc2VkIHRvIGFubm91 bmNlIHRoZSBsYXRlc3Qgc3RhYmxlIHJlbGVhc2Ugb2YNCiAgW0xlYXJuLU9DYW1sXSwgdmVyc2lv biBgMC4xNC4wJy4NCg0KICBNYW55IHRoYW5rcyB0byBhbGwgdXNlcnMgYW5kIGRldmVsb3BlcnMg d2hvIHJlcG9ydGVkIGJ1Z3MsIGNvbnRyaWJ1dGVkDQogIGZlYXR1cmVzLCBvciBwYXRjaGVzISBT cGVjaWFsIHRoYW5rcyB0byBAZXJpa21kIHdobyBtYWRlIG1hbnkgb2YgdGhlDQogIGNoYW5nZXMg aW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlLg0KDQogIEEgKG1vc3RseSkgY29tcHJlaGVuc2l2ZSBs aXN0IG9mIHRoZSBmZWF0dXJlcywgZml4ZXMsIGFuZCBlbmhhbmNlbWVudHMNCiAgb2ZmZXJlZCBi eSB0aGlzIHJlbGVhc2UgaXMgYXZhaWxhYmxlIGluIFt0aGUgUmVsZWFzZSBOb3RlcyBdLg0KDQog IEEgYnJpZWYgYW5kIGluY29tcGxldGUgc3VtbWFyeSBvZiB0aGUgY2hhbmdlczoNCg0KICDigKIg QSBsb25nLXN0YW5kaW5nIGJ1ZyBoYXMgYmVlbiBmaXhlZC4gVGhpcyBidWcgd2FzIHRyaWdnZXJl ZCB3aGVuIHRoZQ0KICAgIHVzZXIgb3BlbmVkIHNldmVyYWwgc2Vzc2lvbnM6IHRoZSBhdXRvLXN5 bmMgbWVjaGFuaXNtIGNvdWxkIGxlYWQgdG8NCiAgICBvdmVyd3JpdGluZyB0aGUgc3R1ZGVudCdz IGNvZGUgd2l0aCBhbiBvbGRlciB2ZXJzaW9uLg0KDQogIOKAoiBUaGUgcmVsZWFzZSBhc3NldHMg bm93IGluY2x1ZGUgYSB6aXAgZmlsZSBjb250YWluaW5nIHRoZSBjb250ZW50cyBvZg0KICAgIHRo ZSBgd3d3YCBkaXJlY3RvcnkuIFRoaXMgZWFzZXMgdGhlIHVzYWdlIG9mIHRoZSBkaXN0cmlidXRl ZA0KICAgIGJpbmFyaWVzLg0KDQogIElmIG5lZWQgYmUsIGZlZWwgZnJlZSB0byBvcGVuIGlzc3Vl cyBpbiB0aGUgW0xlYXJuLU9DYW1sIGJ1ZyB0cmFja2VyXQ0KICBvciB0aGUgW2xlYXJuLW9jYW1s LmVsIGJ1ZyB0cmFja2VyXSwgb3IgcG9zdCBpbiB0aGlzIHRocmVhZCB0byBzaGFyZQ0KICB0aG91 Z2h0cyBvciBleHBlcmllbmNlLWZlZWRiYWNrLg0KDQogIEhhcHB5IE9DYW1sIGxlYXJuaW5nIGFu ZCB0ZWFjaGluZyENCg0KDQpbTGVhcm4tT0NhbWxdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt c2YvbGVhcm4tb2NhbWw+DQoNClt0aGUgUmVsZWFzZSBOb3RlcyBdDQo8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXNmL2xlYXJuLW9jYW1sL3JlbGVhc2VzL3RhZy92MC4xNC4wPg0KDQpbTGVhcm4t T0NhbWwgYnVnIHRyYWNrZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9j YW1sL2lzc3Vlcz4NCg0KW2xlYXJuLW9jYW1sLmVsIGJ1ZyB0cmFja2VyXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9wZml0YXhlbC9sZWFybi1vY2FtbC5lbC9pc3N1ZXM+DQoNCg0KVHV0b3JpYWw6IFJv Z3VlbGlrZSB3aXRoIGVmZmVjdCBoYW5kbGVycw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90dXRvcmlhbC1yb2d1ZWxpa2Utd2l0aC1lZmZlY3Qt aGFuZGxlcnMvOTQyMi8xOD4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBzdHcgc2FpZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU29ycnkgYWJvdXQg dGhlIGxhdGUgcmVwbHksIEkgd2FzIGJ1c3kgYWN0dWFsbHkgdmVyaWZ5aW5nIHRoYXQgbXkNCiAg Y29uY2VwdCB3b3JrcyBvdXQuIFRoYW5rZnVsbHkgaXQgZG9lcyA6c21pbGU6DQoNCiAgVGhlIFVJ IGZyYW1ld29yayBpcyBpbnNwaXJlZCBieSBbQ29uY3VyXSB3aGljaCBtZWFucyB0aGF0IGV2ZXJ5 IHdpZGdldA0KICBsaXN0ZW5zIGZvciBzb21lIHNldCBvZiBldmVudHMgYW5kIHN1c3BlbmRzIGNv bXB1dGF0aW9uIHVudGlsIG9uZSBvZg0KICB0aGVzZSBldmVudHMgb2NjdXJzLiBPbmNlIGl0IGRv ZXMsIGl0IGNvbnRpbnVlcyBleGVjdXRpb24gdW50aWwgaXQNCiAgZW5jb3VudGVyIHRoZSBuZXh0 IGF3YWl0IGF0IHdoaWNoIHBvaW50IGl0IHdpbGwgc3VzcGVuZCBvbmNlDQogIG1vcmUuIE9uY2Ug YSB3aWRnZXQgaGFzIGZ1bGZpbGxlZCBpdHMgcHVycG9zZSBpdCB0ZXJtaW5hdGVzIHdpdGggc29t ZQ0KICByZXR1cm4gdmFsdWUgKGUuZy4gdGV4dCBpbnB1dCBpcyBjb25maXJtZWQgd2l0aCBlbnRl ciAtPiByZXR1cm4gd2l0aCBhDQogIHN0cmluZykuICBDb21wbGV4IFVJcyBhcmUgdGhlbiBidWls dCBieSBjb21wb3Npbmcgc2ltcGxlciB3aWRnZXRzLiBBDQogIG1vcmUgZGV0YWlsZWQgZXhwbGFu YXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZSBsaW5rIGFib3ZlLg0KDQogIEkndmUgaW1wbGVtZW50 ZWQgdGhpcyBjb25jZXB0IHVzaW5nIGFuIGF3YWl0IGZ1bmN0aW9uIHRoYXQgdGFrZXMgYQ0KICBs aXN0IG9mIHRyaWdnZXJzIGFuZCBhIGhhbmRsZXIgZm9yIGVhY2ggcG9zc2libGUgZXZlbnQ6DQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZWZmZWN0IEF3YWl0IDogRXZlbnQudCBsaXN0IC0+IEV2 ZW50LnQNCiAg4pSCIGxldCByZWMgYXdhaXQgdHJpZ2dlcnMgaGFuZGxlciA9DQogIOKUgiAgIGhh bmRsZXIgKEVmZmVjdEhhbmRsZXJzLnBlcmZvcm0gKEF3YWl0IHRyaWdnZXJzKSkNCiAg4pSCIA0K ICDilIIgbGV0IHJlYyBjaGVja19ib3ggY2hlY2tlZCAgPQ0KICDilIIgICAoKiBkaXNwbGF5IGNo ZWNrIGJveCAqKQ0KICDilIIgICAuLi47DQogIOKUgiAgIGF3YWl0IFtNb3VzZV9wcmVzczsgS2V5 X3ByZXNzXSAoZnVuY3Rpb24NCiAg4pSCICAgfCBNb3VzZV9wcmVzcyAtPg0KICDilIIgICAgIHBy aW50X2VuZGxpbmUgIkkndmUgYmVlbiAodW4tKWNoZWNrZWQhIjsNCiAg4pSCICAgICBjaGVja19i b3ggKG5vdCBjaGVja2VkKQ0KICDilIIgICB8IEtleV9wcmVzcyAtPiAoKiBUZXJtaW5hdGUgaWYg YW55IGtleSBpcyBwcmVzc2VkICopIGNoZWNrZWQpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEV2 ZXJ5IHdpZGdldCBjYW4gdGhlbiBiZSBpbXBsZW1lbnRlZCBhcyBhIGZ1bmN0aW9uIHdoaWNoIGRp c3BsYXlzIHRoZQ0KICB3aWRnZXQgYW5kIHBlcmZvcm1zIGFuIGBBd2FpdCB0cmlnZ2Vycycgd2hp Y2ggaXMgcmVzdW1lZCBieSBwYXNzaW5nIGFuDQogIGV2ZW50IGZyb20gYHRyaWdnZXJzJywgZm9y IGV4YW1wbGUgdGhlIGNoZWNrIGJveCBhYm92ZS4NCg0KICBUaGUgbW9zdCBjb21wbGV4IHdpZGdl dCBJJ3ZlIGltcGxlbWVudGVkIHNvIGZhciBpcyBhIHNpbmdsZSBsaW5lIHRleHQNCiAgaW5wdXQu IEl0IGNhbiBiZSBjbGlja2VkIG9yIHNlbGVjdGVkIHdpdGggdGFiLiAgTW92aW5nIHRoZSBtb3Vz ZSB3aGlsZQ0KICBob2xkaW5nIHRoZSBidXR0b24gZG93biBjaGFuZ2VzIHRoZSBzZWxlY3Rpb24u IEFzIGFuIGF1dG9tYXRvbjoNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0 YW5kYXJkMTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC81LzU3NGUxNjRiNjE4OTYwODI4M2Rl MzJkOWYzNzU1MzRjYTgwY2FmZmEucG5nPg0KDQogIE9idmlvdXNseSwgdGhpcyBpcyBub3QgYSBk aXJlY3RlZCBhY3ljbGljIGdyYXBoIGFuZCB0aGVyZWZvcmUgbm90IGENCiAgcGVyZmVjdCBmaXQg Zm9yIHRoZSBpbXBsaWNpdCBzdGF0ZSBzdG9yZWQgaW4gdGhlDQogIGNvbnRpbnVhdGlvbi4gU3Bl Y2lmaWNhbGx5LCBgUHJlc3NlZCcgaGFzIGFuIGVkZ2UgdG8gb25lIG9mIGl0cw0KICBtdWx0aXBs ZSBwYXJlbnRzLiBXZSBjYW4gZXh0cmFjdCB0aGUgYFByZXNzZWQnIHN0YXRlIGludG8gaXRzIG93 bg0KICBmdW5jdGlvbiBhbmQgdGhlcmVmb3JlIGF2b2lkIHRoaXMgaXNzdWUgYnkgJ2R1cGxpY2F0 aW5nJyB0aGlzDQogIHN0YXRlLiBOb3cgYFByZXNzZWQnIG5vIGxvbmdlciBoYXMgbXVsdGlwbGUg cGFyZW50czoNCg0KICA8aHR0cHM6Ly9hd3MxLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEv dXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC83LzcwYTM0ZDJmNGJiODE4MDBhNWUzYjEyYjhlNDkx NDdhMGQ4MGVjZTQucG5nPg0KDQogIFNvbWUgY3ljbGVzIHJlbWFpbiBhbmQgd2UgY2FuJ3QgcmVt b3ZlIHRoZW0gYmVjYXVzZSB0aGV5IGFyZSBlc3NlbnRpYWwNCiAgdG8gdGhlIGZ1bmN0aW9uYWxp dHkuIEluc3RlYWQgd2UgdGhyb3cgYW4gYGV4Y2VwdGlvbiBSZXBlYXQnIHRoYXQNCiAgcmV0dXJu cyB1cyB0byBhIHBhcmVudCBub2RlIChleHBsaWNpdGx5IHNob3duIGZvciBGb2N1c2VkIC0+IFBy ZXNzZWQNCiAgLT4gUmVsZWFzZWQgLT4gRm9jdXNlZCkuICBUbyBkbyB0aGF0IHdlIG1vZGlmeSBg YXdhaXQnOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCByZWMgYXdhaXQgdHJpZ2dlcnMg aGFuZGxlciA9DQogIOKUgiAgIHRyeSBoYW5kbGVyIChFZmZlY3RIYW5kbGVycy5wZXJmb3JtIChB d2FpdCB0cmlnZ2VycykpIHdpdGgNCiAg4pSCICAgfCBSZXBlYXQgLT4gYXdhaXQgdHJpZ2dlcnMg aGFuZGxlcg0KICDilJTilIDilIDilIDilIANCiAgSW4gdGhlIGVuZCB0aGlzIHJlc3VsdHMgaW4g dGhpcyBtYWluIG1ldGhvZCBmb3IgdGhlIHRleHQgaW5wdXQsIHdpdGgNCiAgb25seSBtaW5vciBz aW1wbGlmaWNhdGlvbnM6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbWV0aG9kIGV4ZWN1dGUg PQ0KICDilIIgICAoKiBSZXByZXNlbnQgdGhlIFByZXNzZWQgc3RhdGUuDQogIOKUgiAgICAgIFdl IGF3YWl0IHRoZSBNb3VzZV9yZWxlYXNlIGFuZCBoYW5kbGUgTW91c2VfbW90aW9uIHdoaWxlIHdl IHdhaXQuICopDQogIOKUgiAgIGxldCBwcmVzc2VkICh4LF8pID0NCiAg4pSCICAgICBzZWxlY3Rp b24gPC0gUG9pbnQgeDsNCiAg4pSCICAgICBhd2FpdCBbYE1vdXNlX3JlbGVhc2U7IGBNb3VzZV9t b3Rpb25dIEBAIGZ1bmN0aW9uDQogIOKUgiAgICAgfCBgTW91c2VfcmVsZWFzZSAoXywgTE1CKSAt Pg0KICDilIIgICAgICAgKCkNCiAg4pSCICAgICB8IGBNb3VzZV9tb3Rpb24gKHgsXykgLT4NCiAg 4pSCICAgICAgIHNlbGYjc2VsZWN0IHg7DQogIOKUgiAgICAgICByYWlzZSBSZXBlYXQgKCogVGhp cyByZXN0YXJ0cyB0aGUgYXdhaXQgZnVuY3Rpb24gKikNCiAg4pSCICAgICB8IF8gLT4NCiAg4pSC ICAgICAgIHJhaXNlIFJlcGVhdA0KICDilIIgICBpbg0KICDilIIgDQogIOKUgiAgICgqIFdlIHN0 YXJ0IGluIHRoZSBVbmZvY3VzZWQgc3RhdGUgKikNCiAg4pSCICAgYmVnaW4NCiAg4pSCICAgICBh d2FpdCBbYE1vdXNlX3ByZXNzOyBgS2V5X3ByZXNzXSBAQCBmdW5jdGlvbg0KICDilIIgICAgIHwg YE1vdXNlX3ByZXNzIChwb3MsIExNQikgLT4NCiAg4pSCICAgICAgICAoKiBXZSBoYXZlIHJlZ2lz dGVyZWQgdGhlIHByZXNzLCBidXQgb25seSB3aGVuIGl0IGlzIHJlbGVhc2VkDQogIOKUgiAJICB3 aWxsIHdlIGJlIGZvY3VzZWQuICopDQogIOKUgiAgICAgICAgcHJlc3NlZCBwb3MNCiAg4pSCICAg ICB8IGBLZXlfcHJlc3MgVGFiIC0+DQogIOKUgiAgICAgICBzZWxlY3Rpb24gPC0gQXJlYSAoMCwg TGlzdC5sZW5ndGgga2V5cykNCiAg4pSCICAgICB8IF8gLT4gcmFpc2UgUmVwZWF0DQogIOKUgiAg IGVuZDsNCiAg4pSCIA0KICDilIIgICAoKiBXZSBtb3ZlIGludG8gdGhlIEZvY3VzZWQgc3RhdGUg KikNCiAg4pSCICAgYmVnaW4NCiAg4pSCICAgICBhd2FpdCBbYENvZGVwb2ludDsgYEtleV9wcmVz czsgYE1vdXNlX3ByZXNzXSBAQCBmdW5jdGlvbg0KICDilIIgICAgIHwgYEtleV9wcmVzcyBUYWIg fCBgS2V5X3ByZXNzIFJldHVybiAtPg0KICDilIIgICAgICAgKCkgKCogVGhlIG9ubHkgcGF0aCB3 aXRob3V0IHJhaXNpbmcgUmVwZWF0Lg0KICDilIIgCSAgICBUaGVyZWZvcmUgd2Ugb25seSBsZWF2 ZSB0aGlzIGF3YWl0IHdoZW4gYSB0YWIgb3IgcmV0dXJuIG9jY3VycyAqKQ0KICDilIIgICAgIHwg YE1vdXNlX3ByZXNzIChwb3MsIExNQikgLT4NCiAg4pSCICAgICAgIHByZXNzZWQgcG9zOw0KICDi lIIgICAgICAgcmFpc2UgUmVwZWF0DQogIOKUgiAgICAgfCBgS2V5X3ByZXNzIGMgLT4NCiAg4pSC ICAgICAgIHNlbGYjaW5zZXJ0IGM7DQogIOKUgiAgICAgICByYWlzZSBSZXBlYXQNCiAg4pSCICAg ICB8IF8gLT4gcmFpc2UgUmVwZWF0DQogIOKUgiAgIGVuZDsNCiAg4pSCICAgKCogV2UgaGF2ZSBy ZWFjaGVkIHRoZSBmaW5pc2hlZCBzdGF0ZS4gV2UgY2FuIG5vdyByZXR1cm4gdGhlIGVudGVyZWQg dGV4dC4gKikNCiAg4pSCICAgc2VsZiN0ZXh0DQogIOKUlOKUgOKUgOKUgOKUgA0KICBJIHRoaW5r IHRoYXQgdGhpcyBtZXRob2QgY2FwdHVyZXMgdGhlIGF1dG9tYXRvbiBhYm92ZSBxdWl0ZSBuaWNl bHkgYW5kDQogIGNhbiBiZSByZWxhdGl2ZWx5IGVhc2lseSB1bmRlcnN0b29kIChob3BlZnVsbHkg ZXZlbiB3aGVuIG9uZSBpcw0KICB1bmZhbWlsaWFyIHdpdGggdGhlIGZyYW1ld29yayBhbmQgYWNj ZXB0cyB0aGF0IHNvbWUgbWFnaWMgaXMgaGFwcGVuaW5nDQogIGluIHRoZSBiYWNrZ3JvdW5kICg6 ICkuICBJbXBsZW1lbnRpbmcgYXV0b21hdG9ucyBpbiB0ZXJtcyBvZiBlZmZlY3QNCiAgaGFuZGxl cnMgc2VlbXMgdG8gd29yayBxdWl0ZSB3ZWxsLCBhdCBsZWFzdCBmb3IgZ2FtZXMgYW5kIFVJcy4g V2hhdA0KICB0aGVzZSBhdXRvbWF0b25zIGhhdmUgaW4gY29tbW9uIGlzIHRoYXQgdGhleSBjYW4g YmUgdGhvdWdodCBvZiBhcw0KICBmbG93cywgc3RhcnRpbmcgYXQgc29tZSBzdGF0ZSBhbmQgZW5k aW5nIGF0IG9uZSBvZiBtdWx0aXBsZSBmaW5hbA0KICBzdGF0ZXMgYW5kIG9ubHkgaGF2ZSBmZXcg ZWRnZXMgdGhhdCBkb24ndCBmaXQgdGhpcyBzY2hlbWUsIHR1cm5pbmcNCiAgdGhlbSBpbnRvICdk aXJlY3RlZCBhbG1vc3QgYWN5Y2xpYyBncmFwaHMnLg0KDQogIFRoZXJlIGlzIG9idmlvdXNseSBh IGxvdCBtb3JlIG5lY2Vzc2FyeSBmb3IgYSBVSSBmcmFtZXdvcmsNCiAgKGUuZy4gcmVzaXppbmcg dGhlIHdpbmRvdy93aWRnZXRzLCBkZWxlZ2F0aW5nIHRoZSBldmVudHMgdG8gdGhlDQogIGNvcnJl Y3Qgd2lkZ2V0LCBjb21wb3Npbmcgd2lkZ2V0cywgZHJhd2luZyBvbiB0aGUgc2NyZWVuIGV0Yy4p IGFuZCBJDQogIHBsYW4gdG8gd3JpdGUgYWJvdXQgaXQgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0 dXJlLiBCdXQgZm9yIHRoYXQgSQ0KICB3aWxsIGZpcnN0IG5lZWQgdG8gYWN0dWFsbHkgc29sdmUg dGhlc2UgcHJvYmxlbXMgYXMgcmlnaHQgbm93IHRoZWlyDQogIGltcGxlbWVudGF0aW9uIGlzIHF1 aXRlIGJhcmVib25lcy4gVGhlIGNvZGUgY2FuIGJlIGZvdW5kIGhlcmUgZm9yDQogIHRob3NlIGlu dGVyZXN0ZWQgKHN0aWxsIHZlcnkgZWFybHkgaW4gZGV2ZWxvcG1lbnQhKToNCiAgPGh0dHBzOi8v Z2l0aHViLmNvbS9XaWxsZW5icmluay9ib2d1ZS8+DQoNCg0KW0NvbmN1cl0NCjxodHRwczovL2Fq bnNpdC5naXRodWIuaW8vY29uY3VyLWRvY3VtZW50YXRpb24vY2gwMi0wMS1hbmF0b215LW9mLWEt d2lkZ2V0Lmh0bWw+DQoNCg0KQXdlc29tZSBNdWx0aWNvcmUgT0NhbWwgYW5kIE11bHRpY29yZSBN b25vcmVwbw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hd2Vzb21lLW11bHRpY29yZS1vY2FtbC1hbmQtbXVsdGlj b3JlLW1vbm9yZXBvLzk1MTUvMT4NCg0KDQpQYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEEgc2hvcnQgYW5ub3VuY2VtZW50IG9mIHR3byByZXBvc2l0b3JpZXMg d2hpY2ggc29tZSBwZW9wbGUgbWF5IG9yIG1heQ0KICBub3QgaGF2ZSBzZWVuLiBGaXJzdGx5LCBb QXdlc29tZSBNdWx0aWNvcmUgT0NhbWxdLCBhIHBsYWNlIGZvcg0KICBnYXRoZXJpbmcgYWxsIG9m IHRoZSByYXBpZGx5IGNoYW5naW5nIGV4cGVyaW1lbnRzLCBpZGVhcywgbGlicmFyaWVzDQogIGFu ZCByZXNvdXJjZXMgZm9yIE11bHRpY29yZSBPQ2FtbCAoaW5jbHVkaW5nIHNvbWUgb2YgdGhlIGRp c2N1c3MNCiAgdGhyZWFkcykuIElmIHlvdSBhcmUgd29ya2luZyBvbiBzb21ldGhpbmcgb3IgZmVl bCBhbnl0aGluZyBpcyBtaXNzaW5nDQogIHBsZWFzZSBvcGVuIGEgUFIhDQoNCiAgU2Vjb25kbHks IGEgW011bHRpY29yZSBNb25vcmVwb10gd2hpY2ggYWltcyB0byBwcm92aWRlIGEgdmVyeSBxdWlj aw0KICBhbmQgZWFzeSB3YXkgdG8gdHJ5IG91dCBlZmZlY3RzIGFuZCBwYXJhbGxlbGlzbSB3aXRo IHF1aXRlIGEgZmV3DQogIGxpYnJhcmllcyAoc3VjaCBhcyBFaW8sIERyZWFtIGV0Yy4pLiBUaGUg YnJlYWtpbmcgY2hhbmdlcyBpbnRyb2R1Y2VkDQogIGJ5IE9DYW1sIDUgY2FuIG1ha2UgaXQgZnJ1 c3RyYXRpbmcgdG8gZ2V0IHN1Y2ggYSBzZXR1cCBpbiBwbGFjZSwNCiAgYWx0aG91Z2ggdGhpcyBp cyBsZXNzIGFuZCBsZXNzIHRydWUgdGhhbmtzIHRvIHRoZSBbYWxwaGENCiAgcmVwb3NpdG9yeV0u IFRoZSBpZGVhIGlzIHRoYXQgeW91IHNob3VsZCBqdXN0IGJlIGFibGUgdG8gY2xvbmUgdGhpcw0K ICByZXBvc2l0b3J5LCBjcmVhdGUgYSBuZXcgYDUuMC4wK3RydW5rJyBzd2l0Y2gsIGluc3RhbGwg YGR1bmUnIGFuZA0KICBzdGFydCBoYWNraW5nLiBJZiB0aGF0J3Mgbm90IHRoZSBjYXNlIHBsZWFz ZSBkbyBvcGVuIGFuIGlzc3VlLg0KDQoNCltBd2Vzb21lIE11bHRpY29yZSBPQ2FtbF0NCjxodHRw czovL2dpdGh1Yi5jb20vcGF0cmljb2ZlcnJpcy9hd2Vzb21lLW11bHRpY29yZS1vY2FtbD4NCg0K W011bHRpY29yZSBNb25vcmVwb10NCjxodHRwczovL2dpdGh1Yi5jb20vcGF0cmljb2ZlcnJpcy9v Y2FtbC1tdWx0aWNvcmUtbW9ub3JlcG8+DQoNClthbHBoYSByZXBvc2l0b3J5XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9raXQtdHkta2F0ZS9vcGFtLWFscGhhLXJlcG9zaXRvcnk+DQoNCg0KcHB4X3Zp ZXdwYXR0ZXJuIGluaXRpYWwgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t cHB4LXZpZXdwYXR0ZXJuLWluaXRpYWwtcmVsZWFzZS85NTE2LzE+DQoNCg0KU2ltbW8gU2FhbiBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIEknbSBnbGFkIHRvIGFubm91bmNlIHRoZSBpbml0aWFsIHJlbGVh c2Ugb2YgW3BweF92aWV3cGF0dGVybl0g4oCTDQogIHRyYW5zZm9ybWF0aW9uIGZvciB2aWV3IHBh dHRlcm5zIGluIE9DYW1sLg0KDQogIEl0IF9hdHRlbXB0cyB0b18gaW1pdGF0ZSBbSGFza2VsbCB2 aWV3IHBhdHRlcm5zXS4gSSB3cm90ZSB0aGlzIHBweA0KICByZXdyaXRlciBtb3N0bHkgb3V0IG9m IGN1cmlvc2l0eSwgcmF0aGVyIHRoYW4gbmVlZCwgYnV0IGl0IHR1cm5lZCBvdXQNCiAgbmVhdCBl bm91Z2ggdGhhdCBvdGhlcnMgbWlnaHQgZmluZCBpdCBpbnRlcmVzdGluZyBvciBldmVuIHVzZWZ1 bC4NCg0KDQpbcHB4X3ZpZXdwYXR0ZXJuXSA8aHR0cHM6Ly9naXRodWIuY29tL3NpbTY0Mi9wcHhf dmlld3BhdHRlcm4+DQoNCltIYXNrZWxsIHZpZXcgcGF0dGVybnNdDQo8aHR0cHM6Ly9naGMuZ2l0 bGFiLmhhc2tlbGwub3JnL2doYy9kb2MvdXNlcnNfZ3VpZGUvZXh0cy92aWV3X3BhdHRlcm5zLmh0 bWw+DQoNClN5bnRheA0K4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVXNlIGBbJXZpZXc/IHBhdCB3 aGVuIGV4cF0nIGFzIGEgcGF0dGVybiB0byBhcHBseSBgZXhwJyB0byB3aGF0ZXZlcg0KICB0aGUg cGF0dGVybiBpcyBtYXRjaGluZyBhbmQgbWF0Y2ggdGhlIHJlc3VsdCBvZiB0aGUgYGV4cCcgYXBw bGljYXRpb24NCiAgYWdhaW5zdCBgcGF0Jy4gIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBIYXNr ZWxsIHZpZXcgcGF0dGVybiBgZXhwIC0+DQogIHBhdCcuDQoNCiAgVGhlIGFib3ZlIGV4dGVuc2lv biBub2RlIHBheWxvYWQgc3ludGF4IGlzIHRoZSBiZXN0IEkgY291bGQgY29tZSB1cA0KICB3aXRo IHRvIGNvbWJpbmUgYW4gZXhwcmVzc2lvbiBhbmQgYSBwYXR0ZXJuLiAgSG9uZXN0bHksIEkgd2Fz IGV2ZW4NCiAgc3VycHJpc2VkIHRoYXQgYHdoZW4gZXhwJyBpcyBhdHRhY2hlZCB0byBhIHBhdHRl cm4gaW4gdGhlIEFTVCAobm90IGENCiAgY2FzZSksIGJlY2F1c2Ugbm9ybWFsbHkgaXQgaXNuJ3Qg cGFydCBvZiB0aGUgcGF0dGVybiBpdHNlbGYuDQoNCg0KRXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgVGhpcyBhbGxvd3Mgb25lIHRvIHdyaXRlDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgKCogVGhlc2UgY2FzZXMgYXJlIGV4YWN0bHkgbGlrZSByZWR1Y3Rpb24gcnVsZXMhICop DQogIOKUgiBsZXQgcmVjIHJlZHVjZSA9IGZ1bmN0aW9uDQogIOKUgiAgIHwgQWRkIChJbnQgbjEs IEludCBuMikgLT4gU29tZSAoSW50IChuMSArIG4yKSkNCiAg4pSCICAgfCBBZGQgKFsldmlldz8g U29tZSBwMScgd2hlbiByZWR1Y2VdLCBwMikgLT4gU29tZSAoQWRkIChwMScsIHAyKSkNCiAg4pSC ICAgfCBBZGQgKHAxLCBbJXZpZXc/IFNvbWUgcDInIHdoZW4gcmVkdWNlXSkgLT4gU29tZSAoQWRk IChwMSwgcDInKSkNCiAg4pSCICAgKCogLi4uICopDQogIOKUgiAgIHwgXyAtPiBOb25lDQogIOKU lOKUgOKUgOKUgOKUgA0KICBpbnN0ZWFkIG9mDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCog VGhlc2UgbmVzdGVkIGNhc2VzIGFyZSBzbyBhbm5veWluZyEgKikNCiAg4pSCIGxldCByZWMgcmVk dWNlID0gZnVuY3Rpb24NCiAg4pSCICAgfCBBZGQgKEludCBuMSwgSW50IG4yKSAtPiBTb21lIChJ bnQgKG4xICsgbjIpKQ0KICDilIIgICB8IEFkZCAocDEsIHAyKSAtPg0KICDilIIgICAgIGJlZ2lu IG1hdGNoIHJlZHVjZSBwMSB3aXRoDQogIOKUgiAgICAgICB8IFNvbWUgcDEnIC0+IFNvbWUgKEFk ZCAocDEnLCBwMikpDQogIOKUgiAgICAgICB8IE5vbmUgLT4NCiAg4pSCIAliZWdpbiBtYXRjaCBy ZWR1Y2UgcDIgd2l0aA0KICDilIIgCSAgfCBTb21lIHAyJyAtPiBTb21lIChBZGQgKHAxLCBwMicp KQ0KICDilIIgCSAgfCBOb25lIC0+IE5vbmUNCiAg4pSCIAllbmQNCiAg4pSCICAgICBlbmQNCiAg 4pSCICAgKCogLi4uICopDQogIOKUgiAgIHwgXyAtPiBOb25lDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFNlZSBbYGV4YW1wbGVzLycgb24gR2l0SHViXSBmb3IgbW9yZS4NCg0KDQpbYGV4YW1wbGVz Lycgb24gR2l0SHViXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9zaW02NDIvcHB4X3ZpZXdwYXR0ZXJu L3RyZWUvbWFzdGVyL2V4YW1wbGU+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVz c2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0 aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3Ro ZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3du LnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1u ZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0Lz4NCg0K --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

OCaml Weekly News

Previous Week Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 08 to 15, 2022.

Robur Reproducible Builds

Continuing this thread, Hannes Mehnert announced

OCaml TeXmacs plugin

Nicolas Ratier announced

I made a basic OCaml plugin for TeXmacs (http://www.texmacs.org) I would like to keep it simple, but comments and improvements are welcome. http://forum.texmacs.cn/t/ocaml-a-basic-ocaml-plugin-for-texmacs/813

Release of ocaml-sf/learn-ocaml:0.14.0

Yurug announced

We are very pleased to announce the latest stable release of Learn-OCaml, version 0.14.0.

Many thanks to all users and developers who reported bugs, contributed features, or patches! Special thanks to @erikmd who made many of the changes included in this release.

A (mostly) comprehensive list of the features, fixes, and enhancements offered by this release is available in the Release Notes .

A brief and incomplete summary of the changes:

  • A long-standing bug has been fixed. This bug was triggered when the user opened several sessions: the auto-sync mechanism could lead to overwriting the student's code with an older version.
  • The release assets now include a zip file containing the contents of the `www` directory. This eases the usage of the distributed binaries.

If need be, feel free to open issues in the Learn-OCaml bug tracker or the learn-ocaml.el bug tracker, or post in this thread to share thoughts or experience-feedback.

Happy OCaml learning and teaching!

Tutorial: Roguelike with effect handlers

Continuing this thread, stw said

Sorry about the late reply, I was busy actually verifying that my concept works out. Thankfully it does :smile:

The UI framework is inspired by Concur which means that every widget listens for some set of events and suspends computation until one of these events occurs. Once it does, it continues execution until it encounter the next await at which point it will suspend once more. Once a widget has fulfilled its purpose it terminates with some return value (e.g. text input is confirmed with enter -> return with a string). Complex UIs are then built by composing simpler widgets. A more detailed explanation can be found in the link above.

I've implemented this concept using an await function that takes a list of triggers and a handler for each possible event:

effect Await : Event.t list -> Event.t
let rec await triggers handler =
  handler (EffectHandlers.perform (Await triggers))

let rec check_box checked  =
  (* display check box *)
  ...;
  await [Mouse_press; Key_press] (function
  | Mouse_press ->
    print_endline "I've been (un-)checked!";
    check_box (not checked)
  | Key_press -> (* Terminate if any key is pressed *) checked)

Every widget can then be implemented as a function which displays the widget and performs an Await triggers which is resumed by passing an event from triggers, for example the check box above.

The most complex widget I've implemented so far is a single line text input. It can be clicked or selected with tab. Moving the mouse while holding the button down changes the selection. As an automaton:

574e164b6189608283de32d9f375534ca80caffa.png

Obviously, this is not a directed acyclic graph and therefore not a perfect fit for the implicit state stored in the continuation. Specifically, Pressed has an edge to one of its multiple parents. We can extract the Pressed state into its own function and therefore avoid this issue by 'duplicating' this state. Now Pressed no longer has multiple parents:

70a34d2f4bb81800a5e3b12b8e49147a0d80ece4.png

Some cycles remain and we can't remove them because they are essential to the functionality. Instead we throw an exception Repeat that returns us to a parent node (explicitly shown for Focused -> Pressed -> Released -> Focused). To do that we modify await:

let rec await triggers handler =
  try handler (EffectHandlers.perform (Await triggers)) with
  | Repeat -> await triggers handler

In the end this results in this main method for the text input, with only minor simplifications:

method execute =
  (* Represent the Pressed state.
     We await the Mouse_release and handle Mouse_motion while we wait. *)
  let pressed (x,_) =
    selection <- Point x;
    await [`Mouse_release; `Mouse_motion] @@ function
    | `Mouse_release (_, LMB) ->
      ()
    | `Mouse_motion (x,_) ->
      self#select x;
      raise Repeat (* This restarts the await function *)
    | _ ->
      raise Repeat
  in

  (* We start in the Unfocused state *)
  begin
    await [`Mouse_press; `Key_press] @@ function
    | `Mouse_press (pos, LMB) ->
       (* We have registered the press, but only when it is released
          will we be focused. *)
       pressed pos
    | `Key_press Tab ->
      selection <- Area (0, List.length keys)
    | _ -> raise Repeat
  end;

  (* We move into the Focused state *)
  begin
    await [`Codepoint; `Key_press; `Mouse_press] @@ function
    | `Key_press Tab | `Key_press Return ->
      () (* The only path without raising Repeat.
            Therefore we only leave this await when a tab or return occurs *)
    | `Mouse_press (pos, LMB) ->
      pressed pos;
      raise Repeat
    | `Key_press c ->
      self#insert c;
      raise Repeat
    | _ -> raise Repeat
  end;
  (* We have reached the finished state. We can now return the entered text. *)
  self#text

I think that this method captures the automaton above quite nicely and can be relatively easily understood (hopefully even when one is unfamiliar with the framework and accepts that some magic is happening in the background (: ). Implementing automatons in terms of effect handlers seems to work quite well, at least for games and UIs. What these automatons have in common is that they can be thought of as flows, starting at some state and ending at one of multiple final states and only have few edges that don't fit this scheme, turning them into 'directed almost acyclic graphs'.

There is obviously a lot more necessary for a UI framework (e.g. resizing the window/widgets, delegating the events to the correct widget, composing widgets, drawing on the screen etc.) and I plan to write about it at some point in the future. But for that I will first need to actually solve these problems as right now their implementation is quite barebones. The code can be found here for those interested (still very early in development!): https://github.com/Willenbrink/bogue/

Awesome Multicore OCaml and Multicore Monorepo

Patrick Ferris announced

A short announcement of two repositories which some people may or may not have seen. Firstly, Awesome Multicore OCaml, a place for gathering all of the rapidly changing experiments, ideas, libraries and resources for Multicore OCaml (including some of the discuss threads). If you are working on something or feel anything is missing please open a PR!

Secondly, a Multicore Monorepo which aims to provide a very quick and easy way to try out effects and parallelism with quite a few libraries (such as Eio, Dream etc.). The breaking changes introduced by OCaml 5 can make it frustrating to get such a setup in place, although this is less and less true thanks to the alpha repository. The idea is that you should just be able to clone this repository, create a new 5.0.0+trunk switch, install dune and start hacking. If that's not the case please do open an issue.

ppx_viewpattern initial release

Simmo Saan announced

I'm glad to announce the initial release of ppx_viewpattern – transformation for view patterns in OCaml.

It attempts to imitate Haskell view patterns. I wrote this ppx rewriter mostly out of curiosity, rather than need, but it turned out neat enough that others might find it interesting or even useful.

Syntax

Use [%view? pat when exp] as a pattern to apply exp to whatever the pattern is matching and match the result of the exp application against pat. This is analogous to the Haskell view pattern exp -> pat.

The above extension node payload syntax is the best I could come up with to combine an expression and a pattern. Honestly, I was even surprised that when exp is attached to a pattern in the AST (not a case), because normally it isn't part of the pattern itself.

Example

This allows one to write

(* These cases are exactly like reduction rules! *)
let rec reduce = function
  | Add (Int n1, Int n2) -> Some (Int (n1 + n2))
  | Add ([%view? Some p1' when reduce], p2) -> Some (Add (p1', p2))
  | Add (p1, [%view? Some p2' when reduce]) -> Some (Add (p1, p2'))
  (* ... *)
  | _ -> None

instead of

(* These nested cases are so annoying! *)
let rec reduce = function
  | Add (Int n1, Int n2) -> Some (Int (n1 + n2))
  | Add (p1, p2) ->
    begin match reduce p1 with
      | Some p1' -> Some (Add (p1', p2))
      | None ->
        begin match reduce p2 with
          | Some p2' -> Some (Add (p1, p2'))
          | None -> None
        end
    end
  (* ... *)
  | _ -> None

See examples/ on GitHub for more.

Old CWN

If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

If you also wish to receive it every week by mail, you may subscribe online.

--=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DA2ACE0069 for ; Tue, 22 Mar 2022 14:01:27 +0100 (CET) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=llyI=UB=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 8fuSmhyumHsjijOg+7oF8ueFQ+wuaok0U0Ooy99oHa7TWDdO8FPnFnUwVJ6xJGaV2FsxzhO3UX frt+3N0X+MmCtniV3CVVAV6Js1w9uG8/v5YiPqhcybHtcZsxf/GAe4PQeZMibPcP/P+hjzo2El SAyZRZ1UssxDD60PMrjO17Ftt2lhK172DYjt0//IUO6WlorUOJWEwNYKrHq/p0b3Qhfc8xlt6V jStSwo8o1+BeAjv6fYE8lfCtxA0Ev+WXCrIoPmPap3ye6sSJYAvLOX62HS3AZn8Vi476Xe4oUW MrLE/2EyG2AgsG+Si7rBwGIz X-IPAS-Result: =?us-ascii?q?A0BmAwD2xzlihyIeaIFaFgcBATwBBQUBAgEJAYFxgR9fK?= =?us-ascii?q?BkBZFcrBwhEhBY+iQaFRwGCSolNjxeEFoFjEAEDAQ0SAhYBDgUBAgQBAYUHA?= =?us-ascii?q?hc6AQSDZwIeBgEFMxMBAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETA?= =?us-ascii?q?QEBAQ0LCQUIDAUQDgU8ZGQEgUsEgXQLNA2CIhMMGYNwAQoOCQplFA8DFAEGA?= =?us-ascii?q?wIEDQEXARQKAxQBEhQGgmoBgxYFCpBEnAyBMYEBg08BAwMCDgEOCYQZgWQNA?= =?us-ascii?q?hSBGQGGE1ZLAYMCCYQGKRCBVUSBFAGCDB1RboJMFwEBAQEBgR8cAQFWgmSCZ?= =?us-ascii?q?QSXRg5sEEwZCA4BASACLggFFgYMCwEKBRQOCwQJBQkjCB8LOpIUBAYhmCSVF?= =?us-ascii?q?TQHg0yBOwYMiCWBHYx1iCKDdIFOimKYHSGWADoggimGcAiBCAmCQ5Q1gVWDY?= =?us-ascii?q?4FOKoFNARgFDAczGjBDDQgLgkkJRQEDAg0BAgIDAQIBAgkBAQKNdQEzFoEEA?= =?us-ascii?q?QGCSkF9gSaBdTuFS0A0AgEBATMCBgEKAQEDCYVjAQEFEwsBiAECAiQHghkBA?= =?us-ascii?q?Q?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 74= IronPort-HdrOrdr: A9a23:Y11hkqn8TfCJ7gozjUPKLc2Qv/7pDfIr3DAbv31ZSRFFG/Fw9v rPoB1173DJYVoqMk3I+urgBEDjex3hHPdOiOF7AV7IZmXbUQWTQb1K3M/L/HnLGiH19OJRvJ 0QEJRWOZnXFlY/qc775WCDYrMdKTS8gcKVuds= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,201,1643670000"; d="scan'208,217";a="27469170" X-MGA-submission: =?us-ascii?q?MDHhq1a7Gw9Kv4eURBHbPXzG4lgkjy1hOdJWue?= =?us-ascii?q?YnGSaKnB3Dcu1EMWkuVG2QbKbRVvfhdJHVnoU2X2IqsKqkDlApKopCzy?= =?us-ascii?q?vDEfzojcI1/X3xq2F46f61LWnJZFO9fzoicbiVVohoftb7cAKpJOoZ0j?= =?us-ascii?q?r1JLzIlArHmdKdl0R0ZJqIAQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Mar 2022 14:01:27 +0100 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EC312564EF2; Tue, 22 Mar 2022 14:01:25 +0100 (CET) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 22 Mar 2022 14:01:25 +0100 Message-ID: <87v8w6ta3e.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 22 14:01:26 2022 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.066427, queueID=44B37564EF3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMTUgdG8gMjIsDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkZyaWRheSAw My8wNCBJbnRlcm4gcHJlc2VudGF0aW9ucyDigJMgb3BlbiBhdHRlbmRhbmNlIQ0KTXVsdGljb3Jl IE9DYW1sOiBGZWJydWFyeSAyMDIyDQpPQ2FtbCA0LjE0LjAsIHNlY29uZCByZWxlYXNlIGNhbmRp ZGF0ZQ0KRm9yIERpdmVyc2l0eSBhbmQgdGhlIE9DYW1sIENvbW11bml0eTogT3V0cmVhY2h5IFN1 bW1lciAyMDIyDQpVbmRlcnN0YW5kaW5nIGNhbmNlbGxhdGlvbiAoaW4gZWlvKQ0KQXRkcHk6IGRl cml2ZSBzYWZlIEpTT04gaW50ZXJmYWNlcyBmb3IgUHl0aG9uDQpPbGQgQ1dODQoNCg0KRnJpZGF5 IDAzLzA0IEludGVybiBwcmVzZW50YXRpb25zIOKAkyBvcGVuIGF0dGVuZGFuY2UhDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZyaWRheS0wMy0wNC1pbnRlcm4tcHJlc2VudGF0aW9u cy1vcGVuLWF0dGVuZGFuY2UvOTQyOS84Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIEF5 YSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFtIZXJlIGlzIHRoZSBsaW5rXSB0byB0aGUgdmlkZW8gcmVjb3JkaW5n IG9mIHRoZSBwcmVzZW50YXRpb25zISBUaGFua3MNCiAgYWdhaW4gdG8gZXZlcnlvbmUgd2hvIGF0 dGVuZGVkIDpwcmF5OiA6dGFkYToNCg0KDQpbSGVyZSBpcyB0aGUgbGlua10NCjxodHRwczovL3dh dGNoLm9jYW1sLm9yZy92aWRlb3Mvd2F0Y2gvZjM4MjllNGItZTJjZC00NDNlLTg1MDItZjQwNmU4 OTNmZTVmPg0KDQoNCk11bHRpY29yZSBPQ2FtbDogRmVicnVhcnkgMjAyMg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9tdWx0aWNvcmUtb2NhbWwtZmVicnVhcnktMjAyMi85NTIyLzE+DQoNCg0KQW5p bCBNYWRoYXZhcGVkZHkgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBX ZWxjb21lIHRvIHRoZSBGZWJydWFyeSAyMDIyIFtNdWx0aWNvcmUgT0NhbWxdIG1vbnRobHkgcmVw b3J0ISBBcyB3aXRoDQogIFtwcmV2aW91cyB1cGRhdGVzXSwgdGhlc2UgaGF2ZSBiZWVuIGNvbXBp bGVkIGJ5IG1lLCBAY3RrMjEsIEBrYXljZWVzcmsNCiAgYW5kIEBzaGFrdGhpbWFhbi4NCg0KICBQ cm9ncmVzcyB0b3dhcmRzIGEgc3RhYmxlIE9DYW1sIDUuMC4wIHJlbGVhc2UgaGF2ZSBiZWVuIG1v dmluZyBmb3J3YXJkDQogIGF0IGZ1bGwgc3RlYW0sIHdpdGggbW9zdCBvZiB0aGUgbXVsdGljb3Jl IE9DYW1sIHdvcmsgbm93IGhhcHBlbmluZw0KICBkaXJlY3RseSB3aXRoaW4gdGhlIG1haW4gb2Nh bWwvb2NhbWwgcmVwb3NpdG9yeS4gQXMgYSBudW1iZXIgb2YNCiAgW2RlcHJlY2F0aW9uc10gaGF2 ZSBoYXBwZW5lZCBpbiBPQ2FtbCA1LjArdHJ1bmssIGl0IGNhbiBiZSBhIGxpdHRsZQ0KICB0cmlj a3kgaW4gdGhlIGltbWVkaWF0ZSB0ZXJtIHRvIGdldCBhIHdvcmtpbmcgZGV2ZWxvcG1lbnQgZW52 aXJvbm1lbnQuDQogIFlvdSBtYXkgZmluZCB0aGVzZSByZXNvdXJjZXMgaGVscGZ1bDoNCiAg4oCi IFRoZXJlIGlzIGEgW211bHRpY29yZSBtb25vcmVwb10gd2hpY2ggaXMgYSAnZmFzdCBjbG9uZSBh bmQgZHVuZQ0KICAgIGJ1aWxkJyB3aXRoIGEgbnVtYmVyIG9mIGVjb3N5c3RlbSBsaWJyYXJpZXMu ICh0aGFua3MgQHBhdHJpY29mZXJyaXMpDQogIOKAoiBUaGVyZSBpcyBhbiBbYWxwaGEtb3BhbS1y ZXBvc2l0b3J5XSB3aGljaCBjb250YWlucyB3b3JrLWluLXByb2dyZXNzDQogICAgcGFja2FnZXMu ICBJZiBhIHBhY2thZ2UgeW91IG1haW50YWluIGlzIGluIHRoZXJlLCBub3cgd291bGQgYmUgYQ0K ICAgIGdvb2QgdGltZSB0byBzdGFydCByZWxlYXNpbmcgaXQgdG8gdGhlIG1haW5saW5lIG9wYW0t cmVwb3NpdG9yeS4NCiAgICBSZW1lbWJlciB0aGF0IHdoaWxlIHdlIGNhbiBwcm9wb3NlIGNoYW5n ZXMsIG9ubHkgdGhlIGNvbW11bml0eQ0KICAgIG1haW50YWluZXJzIG9mIHRoZSByZWxldmFudCBw cm9qZWN0cyBjYW4gZG8gdGhlIGFjdHVhbCByZWxlYXNlLCBzbw0KICAgICp5b3VyIGhlbHAgd2l0 aCBtYWtpbmcgT0NhbWwgNS4wLWNvbXBhdGlibGUgcmVsZWFzZXMgb2YgeW91cg0KICAgIHByb2pl Y3RzIHdvdWxkIGJlIHZlcnkgbXVjaCBhcHByZWNpYXRlZCouICh0aGFua3MgQGtpdC10eS1rYXRl KQ0KDQogIEZvciBtYWlubGluZSBkZXZlbG9wbWVudCwgdGhlIFtjb21waWxlciBkZXZlbG9wbWVu dCBuZXdzbGV0dGVyXSBoYXMgYW4NCiAgb3ZlcnZpZXcgb2Ygd2hhdCdzIGJlZW4gaGFwcGVuaW5n IGluIHRoZSBjb21waWxlci4gIEZyb20gYSBtdWx0aWNvcmUNCiAgcGVyc3BlY3RpdmU6DQogIOKA oiB0aGUgW0FSTTY0IFBSXSBoYXMgYmVlbiBtZXJnZWQsIHNvIHlvdXIgc2hpbnkgTWFjIE0xcyB3 aWxsIG5vdyB3b3JrDQogIOKAoiB3ZSBjb250aW51ZSB0byB3b3JrIG9uIHRoZSBwb3N0LU11bHRp Y29yZSBtZXJnZSB0YXNrcyBmb3IgYW4NCiAgICB1cGNvbWluZyA1LjAuMCt0cnVuayByZWxlYXNl LiBUaGUgZG9jdW1lbnRhdGlvbiBlZmZvcnRzIG9uIHRoZSBPQ2FtbA0KICAgIG1lbW9yeSBtb2Rl bCwgcnVudGltZSBzeXN0ZW0sIGFuZCBTVFcgc3luY2hyb25pemF0aW9uIGhhdmUgYWxzbw0KICAg IHN0YXJ0ZWQuDQogIOKAoiBUaGUgW2VpbyBwcm9qZWN0XSBpcyBhY3RpdmVseSBiZWluZyBkZXZl bG9wZWQgd2hpY2ggbm93IGluY2x1ZGVzIFVEUA0KICAgIHN1cHBvcnQgd2l0aCBFaW8ncyBuZXR3 b3JraW5nIGludGVyZmFjZS4gIFRoZXJlIGhhcyBiZWVuIFtyb2J1c3QNCiAgICBkaXNjdXNzaW9u XSBvbiBzZXZlcmFsIGFzcGVjdHMgb2YgZWlvIHdoaWNoIGlzIGFsbCBpbmZsdWVuY2luZyB0aGUN CiAgICBuZXh0IGl0ZXJhdGlvbiBvZiBpdHMgZGVzaWduICh0aGFuayB5b3UgdG8gZXZlcnlvbmUh KS4gRm9yIHRob3NlIG9mDQogICAgeW91IHdobyBkbyBub3Qgd2lzaCB0byBwYXJ0aWNpcGF0ZSBp biBwdWJsaWMgZGlzY3Vzc2lvbiwgZmVlbCBmcmVlDQogICAgdG8gZ2V0IGluIHRvdWNoIHdpdGgg bWUgb3IgQGtheWNlZXNyayBmb3IgYSBwcml2YXRlIGRpc2N1c3Npb24sDQogICAgcGFydGljdWxh cmx5IGlmIHlvdSBoYXZlIGEgbGFyZ2UgT0NhbWwgY29kZWJhc2UgYW5kIG9waW5pb25zIG9uDQog ICAgY29uY3VycmVuY3kuIFdlJ2xsIHN1bW1hcmlzZSBhbGwgdGhlc2UgZGlzY3Vzc2lvbnMgYXMg YmVzdCB3ZSBjYW4NCiAgICBvdmVyIHRoZSBjb21pbmcgbW9udGhzLg0KICDigKIgYFNhbmRtYXJr LW5pZ2h0bHknIGFuZCBgU2FuZG1hcmsnIGhhdmUgYSBjdXN0b20gdmFyaWFudCBzdXBwb3J0DQog ICAgZmVhdHVyZSB0byBidWlsZCB0cnVuaywgZGV2ZWxvcGVyIGJyYW5jaGVzLCBvciBhIHNwZWNp ZmljIGNvbW1pdCB0bw0KICAgIGFzc2VzcyBhbnkgcGVyZm9ybWFuY2UgcmVncmVzc2lvbnMuIFRo ZSBiYWNrZW5kIHRvb2xpbmcgd2l0aCBVSQ0KICAgIGVuaGFuY2VtZW50cyBjb250aW51ZSB0byBk cml2ZSB0aGUgYGN1cnJlbnQtYmVuY2gnIHByb2plY3QgZm9yd2FyZC4NCg0KICBBcyBhbHdheXMs IHRoZSBNdWx0aWNvcmUgT0NhbWwgdXBkYXRlcyBhcmUgbGlzdGVkIGZpcnN0LCB3aGljaCBhcmUN CiAgdGhlbiBmb2xsb3dlZCBieSB0aGUgZWNvc3lzdGVtIHRvb2xpbmcgdXBkYXRlcy4gIEZpbmFs bHksIHRoZQ0KICBzYW5kbWFyaywgc2FuZG1hcmstbmlnaHRseSBhbmQgY3VycmVudC1iZW5jaCBw cm9qZWN0IHRhc2tzIGFyZQ0KICBtZW50aW9uZWQgZm9yIHlvdXIgcmVmZXJlbmNlLg0KDQogIC9F ZGl0b3LigJlzIG5vdGU6IHBsZWFzZSBmaW5kIHRoZSBmdWxsIHVwZGF0ZSBhdCB0aGUgYXJjaGl2 ZSBsaW5rDQogIGFib3ZlLi8NCg0KDQpbTXVsdGljb3JlIE9DYW1sXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLW11bHRpY29yZS9vY2FtbC1tdWx0aWNvcmU+DQoNCltwcmV2aW91cyB1cGRhdGVz XSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvbXVsdGljb3JlLW1vbnRobHk+DQoNCltk ZXByZWNhdGlvbnNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9D aGFuZ2VzPg0KDQpbbXVsdGljb3JlIG1vbm9yZXBvXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hd2Vzb21lLW11bHRpY29yZS1vY2FtbC1hbmQtbXVsdGljb3JlLW1vbm9yZXBvLzk1MTU+ DQoNClthbHBoYS1vcGFtLXJlcG9zaXRvcnldDQo8aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1r YXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS90cmVlL21hc3Rlci9wYWNrYWdlcz4NCg0KW2NvbXBp bGVyIGRldmVsb3BtZW50IG5ld3NsZXR0ZXJdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L29jYW1sLWNvbXBpbGVyLWRldmVsb3BtZW50LW5ld3NsZXR0ZXItaXNzdWUtNS1ub3ZlbWJlci0y MDIxLXRvLWZlYnJ1YXJ5LTIwMjIvOTQ1OT4NCg0KW0FSTTY0IFBSXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL3B1bGxzLzEwOTcyPg0KDQpbZWlvIHByb2plY3RdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpbz4NCg0KW3JvYnVzdCBkaXNjdXNzaW9uXSA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvZWZmZWN0cz4NCg0KDQpPQ2FtbCA0LjE0LjAsIHNl Y29uZCByZWxlYXNlIGNhbmRpZGF0ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9vY2FtbC00LTE0LTAtc2Vjb25kLXJlbGVhc2UtY2FuZGlkYXRlLzk1Mjgv MT4NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgcmVsZWFzZSBvZiBPQ2FtbCA0 LjE0LjAgaXMgaW1taW5lbnQuICBBcyBhIGxhc3QgdGVzdCB0aGF0DQogIGV2ZXJ5dGhpbmcgaXMg aW4gb3JkZXIsIHdlIGFyZSBwdWJsaXNoaW5nIGEgc2Vjb25kIHJlbGVhc2UgY2FuZGlkYXRlDQog IGZvciBPQ2FtbCA0LjE0LjAuDQoNCiAgV2UgYXJlIGRpcmVjdGx5IGp1bXBpbmcgdG8gdGhlIHNl Y29uZCByZWxlYXNlIGNhbmRpZGF0ZSBkdWUgdG8gYSB0eXBlDQogIHN5c3RlbSByZWdyZXNzaW9u IGRpc2NvdmVyZWQgZHVyaW5nIHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgdGhlIGZpcnN0DQogIHJl bGVhc2UgY2FuZGlkYXRlLg0KDQogIENvbXBhcmVkIHRvIHRoZSBsYXN0IGJldGEsIHRoaXMgcmVs ZWFzZSBjYW5kaWRhdGUgaW5jbHVkZXMgYQ0KICByZWdyZXNzaW9uIGZpeCB3aGVuIHR5cGluZyBy ZWN1cnNpdmUgY29uc3RyYWludHMsIHR3byBiYWNrZW5kIGZpeGVzDQogIChvbmUgZm9yIHRoZSBm cmFtZS1wb2ludGVyIG1vZGUgYW5kIHRoZSBvdGhlciBvbmUgZm9yIHRoZSBSSVNDLVYNCiAgYXJj aGl0ZWN0dXJlKSwgb25lIGNvbmZpZ3VyYXRpb24gZml4IGZvciBtdXNsL2FybTY0LCBhbmQgdGhl IG1hbnVhbA0KICBjaGFwdGVyIGZvciB0aGUgVE1DIHRyYW5zZm9ybWF0aW9uLg0KDQogIElmIHlv dSBmaW5kIGFueSBidWdzLCBwbGVhc2UgcmVwb3J0IHRoZW0gaGVyZToNCg0KICA8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcz4NCg0KICBUaGUgZnVsbCByZWxlYXNlIG9mIE9D YW1sIDQuMTQuMCBpcyBjdXJyZW50bHkgcGxhbm5lZCBmb3IgbmV4dCB3ZWVrLg0KDQoNCkluc3Rh bGxhdGlvbiBpbnN0cnVjdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBiYXNlIGNv bXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9s bG93aW5nIGNvbW1hbmRzDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg 4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjE0LjB+cmMyIC0tcmVwb3NpdG9yaWVzPWRlZmF1bHQs YmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVwb3NpdG9yeS5n aXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIElmIHlvdSB3YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1 cmF0aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBzd2l0Y2gNCiAgdG8gdGhlIG9wdGlvbiB2 YXJpYW50IHdpdGg6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSC IG9wYW0gc3dpdGNoIGNyZWF0ZSA8c3dpdGNoX25hbWU+IC0tcGFja2FnZXM9b2NhbWwtdmFyaWFu dHMuNC4xNC4wfnJjMitvcHRpb25zLDxvcHRpb25fbGlzdD4NCiAg4pSCIC0tcmVwb3NpdG9yaWVz PWRlZmF1bHQsYmV0YT1naXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVw b3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdoZXJlIGA8b3B0aW9uX2xpc3Q+JyBp cyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGBvY2FtbC1vcHRpb24tKicNCiAgcGFja2FnZXMu IEZvciBpbnN0YW5jZSwgZm9yIGEgZmxhbWJkYSBhbmQgbm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0 Y2g6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTQuMH5y YzIrZmxhbWJkYStuZmZhDQogIOKUgiAtLXBhY2thZ2VzPW9jYW1sLXZhcmlhbnRzLjQuMTQuMH5y YzIrb3B0aW9ucyxvY2FtbC1vcHRpb24tZmxhbWJkYSxvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9h dC1hcnJheQ0KICDilIIgLS1yZXBvc2l0b3JpZXM9ZGVmYXVsdCxiZXRhPWdpdCtodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwtYmV0YS1yZXBvc2l0b3J5LmdpdA0KICDilJTilIDilIDilIDi lIANCiAgQWxsIGF2YWlsYWJsZSBvcHRpb25zIGNhbiBiZSBsaXN0ZWQgd2l0aCBgb3BhbSBzZWFy Y2ggb2NhbWwtb3B0aW9uJy4NCg0KICBUaGUgc291cmNlIGNvZGUgZm9yIHRoZSByZWxlYXNlIGNh bmRpZGF0ZSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZQ0KICBhZGRyZXNzZXM6DQoNCiAg4oCi IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS80LjE0LjAtcmMyLnRhci5n ej4NCiAg4oCiIDxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNC4xNC9v Y2FtbC00LjE0LjB+cmMyLnRhci5nej4NCg0KDQpDaGFuZ2VzIHNpbmNlIHRoZSBsYXN0IGJldGEN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQpUeXBlIHN5c3RlbSByZWdyZXNzaW9uIGZpeA0K 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiIFsjMTExMDFdLCBbIzExMTA5XTogQSByZWN1 cnNpdmUgdHlwZSBjb25zdHJhaW50IGZhaWxzIG9uIDQuMTQNCiAgICAoSmFjcXVlcyBHYXJyaWd1 ZSwgcmVwb3J0IGFuZCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGkpDQoNCg0KWyMxMTEwMV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTExMDE+DQoNClsjMTExMDld IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExMTA5Pg0KDQoNCkJhY2tl bmQgZml4ZXMNCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKA oiBbIzEwNjg4XTogTW92ZSBmcmFtZSBkZXNjcmlwdG9yIHRhYmxlIGZyb20gYHJvZGF0YWAgdG8g YGRhdGFgDQogICAgc2VjdGlvbiBvbiBSSVNDLVYuICBJbXByb3ZlcyBzdXBwb3J0IGZvciBidWls ZGluZyBETExzIGFuZCBQSUVzLiBJbg0KICAgIHBhcnRpY3VsYXIsIHRoaXMgYXBwbGllcyB0byBh bGwgYmluYXJpZXMgaW4gZGlzdHJpYnV0aW9ucyB0aGF0IGJ1aWxkDQogICAgUElFcyBieSBkZWZh dWx0IChlZyBHZW50b28gYW5kIEFscGluZSkuIChBbGV4IEZhbiwgcmV2aWV3IGJ5IEdhYnJpZWwN CiAgICBTY2hlcmVyKQ0KDQogIOKAoiBbIzExMDMxXTogRXhjZXB0aW9uIGhhbmRsZXJzIHJlc3Rv cmUgdGhlIHJicCByZWdpc3RlciB3aGVuIHVzaW5nDQogICAgZnJhbWUtcG9pbnRlcnMgb24gYW1k NjQuIChGYWJyaWNlIEJ1b3JvLCB3aXRoIGhlbHAgZnJvbSBTdGVwaGVuDQogICAgRG9sYW4sIFRv bSBLZWxseSBhbmQgTWFyayBTaGlud2VsbCwgcmV2aWV3IGJ5IFhhdmllciBMZXJveSkNCg0KDQpb IzEwNjg4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDY4OD4NCg0K WyMxMTAzMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEwMzE+DQoN Cg0KQ29uZmlndXJhdGlvbiBmaXgNCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbIzExMDI1XSwgWyMxMTAzNl06IERvIG5vdCBwYXNz IC1uby1waWUgdG8gdGhlIEMgY29tcGlsZXIgb24NCiAgICBtdXNsL2FybTY0IChvbW5pLCBLYXRl IERlcGxhaXggYW5kIEFudG9uaW8gTnVubyBNb250ZWlybywgcmV2aWV3IGJ5DQogICAgWGF2aWVy IExlcm95KQ0KDQoNClsjMTEwMjVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzExMDI1Pg0KDQpbIzExMDM2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMTAzNj4NCg0KDQpEb2N1bWVudGF0aW9uDQrilITilITilITilITilITilITilITilITi lITilITilITilITilIQNCg0KICDigKIgKnVwZGF0ZWQgZW50cnkqIFsjMTgxXSwgWyM5NzYwXSwg K1sjMTA3NDBdOiBvcHQtaW4gdGFpbC1tb2R1bG8tY29ucw0KICAgICAoVE1DKSB0cmFuc2Zvcm1h dGlvbg0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiBsZXRbQHRhaWxfbW9kX2NvbnNdIHJl YyBtYXAgZiBsaSA9IC4uLg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KICAgIChGcsOpZMOpcmljIEJv dXIsIEdhYnJpZWwgU2NoZXJlciwgQmFzaWxlIENsw6ltZW50LCByZXZpZXcgYnkgQmFzaWxlDQog ICAgQ2zDqW1lbnQgYW5kIFBpZXJyZSBDaGFtYmFydCwgdGVzdGVkIGJ5IEtvbnN0YW50aW4gUm9t YW5vdikNCg0KDQpbIzE4MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTgxPg0KDQpbIzk3NjBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzk3 NjA+DQoNClsjMTA3NDBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEw NzQwPg0KDQoNCkZvciBEaXZlcnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJlYWNo eSBTdW1tZXIgMjAyMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9mb3ItZGl2ZXJzaXR5LWFuZC10aGUtb2NhbWwtY29tbXVuaXR5LW91dHJl YWNoeS1zdW1tZXItMjAyMi85MjM0LzU+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgUGF0 cmljayBGZXJyaXMgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhhbmtzIGZvciB0aGUgdXBk YXRlcyBAcGl0YWchIEZvciB0aGlzIHN1bW1lcidzIHJvdW5kIEknbGwgYmUNCiAgbWVudG9yaW5n IGEgcHJvamVjdCB0byBbRXh0ZW5kIG9jYW1sLWdlb2pzb24gdG8gc3VwcG9ydCBUb3BvSlNPTl0N CiAgd2hpY2ggd2lsbCBsaWtlbHkgYmUgYSBzZXBhcmF0ZSBwYWNrYWdlLiAgVGhpcyBpcyBwYXJ0 IG9mIGEgbGFyZ2VyDQogIGVmZm9ydCBJJ20gZW1iYXJraW5nIG9uIHRvIHByb3ZpZGUgYmV0dGVy IFtnZW9zcGF0aWFsIGxpYnJhcmllcyBhbmQNCiAgdG9vbHMgaW4gT0NhbWxdIQ0KDQogIEknZCBi ZSB2ZXJ5IGhhcHB5IHRvIGhhdmUgYSBjby1tZW50b3IgaWYgdGhlIHByb2plY3QgKG9yIGp1c3Qg dGhlIGlkZWENCiAgb2YgT3V0cmVhY2h5KSBpbnRlcmVzdHMgYW55b25lLiBEb24ndCBoZXNpdGF0 ZSB0byByZWFjaCBvdXQgdG8gbWUgb24NCiAgZGlzY3VzcyBwdWJsaWNseSBvciBwcml2YXRlbHkg aWYgeW91IGFyZSBpbnRlcmVzdGVkIG9yIGhhdmUgbW9yZQ0KICBxdWVzdGlvbnMgOmNhbWVsOg0K DQoNCltFeHRlbmQgb2NhbWwtZ2VvanNvbiB0byBzdXBwb3J0IFRvcG9KU09OXQ0KPGh0dHBzOi8v d3d3Lm91dHJlYWNoeS5vcmcvYXBwbHkvcHJvamVjdC1zZWxlY3Rpb24vI29jYW1sPg0KDQpbZ2Vv c3BhdGlhbCBsaWJyYXJpZXMgYW5kIHRvb2xzIGluIE9DYW1sXSA8aHR0cHM6Ly9naXRodWIuY29t L2dlb2NhbWw+DQoNCg0KVW5kZXJzdGFuZGluZyBjYW5jZWxsYXRpb24gKGluIGVpbykNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdW5kZXJzdGFuZGluZy1jYW5jZWxsYXRp b24taW4tZWlvLzkzNjkvNDU+DQoNCg0KRGVlcCBpbiB0aGlzIHRocmVhZCwgU2ltb24gQ3J1YW5l cyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgc3RpbGwgaGF2ZSByZXNlcnZh dGlvbnMgYWJvdXQgdGhlIGNhcGFiaWxpdGllcyBhc3BlY3Qgb2YgRWlvLCBidXQNCiAgdGhlIHN0 cnVjdHVyZWQgY29uY3VycmVuY3kgcGFydCBsb29rcyB2ZXJ5IG5pY2UuICBKdXN0IGEgZmV3IG5v dGVzLA0KICBmb3IgZnV0dXJlIHJlZmVyZW5jZSB0byByZWFkZXJzIG9mIHRoaXMgdGhyZWFkIChp ZiBJIGhhdmVuJ3QgbWlzc2VkDQogIHRoZW0gYmVpbmcgcG9zdGVkIGFib3ZlIGFscmVhZHkpOg0K DQogIEFub3RoZXIgaW50ZXJlc3RpbmcgcG9zdCBhYm91dCBzdHJ1Y3R1cmVkIGNvbmN1cnJlbmN5 IGFuZA0KICBjYW5jZWxsYXRpb246IDxodHRwczovLzI1MGJwbS5jb20vYmxvZzo3MS8+DQoNCiAg QSBzdHJ1Y3R1cmVkIGNvbmN1cnJlbmN5IGxpYnJhcnkgaW4gcHl0aG9uOiBbdHJpb10sIHdoaWNo IG1pZ2h0IGJlDQogIHJlbGF0aXZlbHkgc2ltaWxhciB0byBFaW8ncyBzd2l0Y2hlcyBpbiBjb25j ZXB0IChlc3Agc2luY2UgQHRhbGV4DQogIGxpbmtlZCBbdGhpc10pPw0KDQogIENvbXBhbmlvbiBw b3N0IHRvIHRoZSB0cmlvIGJsb2dwb3N0Og0KICA8aHR0cHM6Ly92b3JwdXMub3JnL2Jsb2cvdGlt ZW91dHMtYW5kLWNhbmNlbGxhdGlvbi1mb3ItaHVtYW5zLz4gd2hpY2gNCiAgaXMgZGlyZWN0bHkg cmVsZXZhbnQgdG8gdGhlIGN1cnJlbnQgdG9waWMuDQoNCg0KW3RyaW9dIDxodHRwczovL3RyaW8u cmVhZHRoZWRvY3MuaW8vZW4vc3RhYmxlL2luZGV4Lmh0bWw+DQoNClt0aGlzXQ0KPGh0dHBzOi8v dm9ycHVzLm9yZy9ibG9nL25vdGVzLW9uLXN0cnVjdHVyZWQtY29uY3VycmVuY3ktb3ItZ28tc3Rh dGVtZW50LWNvbnNpZGVyZWQtaGFybWZ1bC8+DQoNCg0KQXRkcHk6IGRlcml2ZSBzYWZlIEpTT04g aW50ZXJmYWNlcyBmb3IgUHl0aG9uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2F0ZHB5LWRlcml2ZS1zYWZlLWpzb24t aW50ZXJmYWNlcy1mb3ItcHl0aG9uLzk1NDQvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBBVEQgdGVhbSwgSSdkIGxpa2Ug dG8gYW5ub3VuY2UgYXRkcHksIHdoaWNoIGlzIHBhcnQNCiAgb2YgdGhlIHJlbGVhc2UgMi4zLngg b2YgdGhlIEFURCB0b29scy4gRm9yIG5vdywgdGhlIGJlc3QgaW5zdGFsbGF0aW9uDQogIG1ldGhv ZCB3aXRoIHZpYSBvcGFtOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIGluc3Rh bGwgYXRkcHkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgQXRkcHkgaXMgYSBuZXcgYmFja2VuZCBm b3IgW0FURF0uIEl0IHRha2VzIGEgY29sbGVjdGlvbiBvZiB0eXBlDQogIGRlZmluaXRpb25zIGFu ZCBkZXJpdmVzIFB5dGhvbiBjbGFzc2VzIHdpdGggbXlweSB0eXBlIGFubm90YXRpb25zIHRoYXQN CiAgdmFsaWRhdGUgdGhlIEpTT04gZGF0YS4NCg0KICBBIFtzaG9ydCBpbnRyb2R1Y3Rpb25dIGlz IGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KDQogIFVzZSBjYXNlczoNCiAg4oCiIFNh ZmUgY29tbXVuaWNhdGlvbiB3aXRoIGFub3RoZXIgcHJvZ3JhbSB0aGF0IGFsc28gdXNlcyBhbiBB VEQNCiAgICBpbnRlcmZhY2UuIE90aGVyIHN1cHBvcnRlZCBsYW5ndWFnZXMgYXJlIE9DYW1sIChp bmNsdWRpbmcNCiAgICBCdWNrbGVzY3JpcHQpLCBKYXZhLCBhbmQgU2NhbGEuDQogIOKAoiBOZWVk IGZvciBbbW9zdGx5XSB0eXBlLXNhZmUgUHl0aG9uIG1ldGhvZHMgdmlhIG15cHkuDQogIOKAoiBO ZWVkIGZvciBhIGdvb2QgUHl0aG9uIEFQSSB0byBjb21tdW5pY2F0ZSB3aXRoIGFuIE9DYW1sIGV4 ZWN1dGFibGUNCiAgICBvciBzZXJ2aWNlLg0KICDigKIgTmVlZCBmb3Igc3VtIHR5cGVzICh2YXJp YW50cywgYWxnZWJyYWljIGRhdGEgdHlwZXMsIHRhZ2dlZA0KICAgIHVuaW9ucykuIEFURCBzdW0g dHlwZXMgYXJlIG9yZGluYXJ5IHR5cGVzIHRoYXQgaW5jbHVkZSBwdXJlIGVudW1zLg0KDQogIEF0 ZHB5IHdhcyBkZXZlbG9wZWQgYXMgcGFydCBvZiBvdXIgd29yayBvbiBbU2VtZ3JlcF0gYXQgW3Iy Y10uIE1hbnkNCiAgdGhhbmtzIHRvIEBtc2VyaSBmb3IgaGlzIG1hc3NpdmUgaGVscCBkdXJpbmcg dGhlIG9wYW0gcmVsZWFzZSBvZiB0aGUgNw0KICBBVEQgcGFja2FnZXMsIGFuZCB0byB0aGUgQWhy ZWZzIGZvbGtzIGFuZCBAS2hhZHkgaW4gcGFydGljdWxhciBmb3INCiAgc3VwcG9ydGluZyB0aGUg cHJvamVjdC4NCg0KDQpbQVREXSA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQ+DQoNCltz aG9ydCBpbnRyb2R1Y3Rpb25dIDxodHRwczovL2F0ZC5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3Qv YXRkcHkuaHRtbD4NCg0KW1NlbWdyZXBdIDxodHRwczovL3NlbWdyZXAuZGV2Lz4NCg0KW3IyY10g PGh0dHBzOi8vcjJjLmRldi8+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2Fn ZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUg YXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBt ZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBh cmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQg b2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJz cz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdz LXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

OCaml Weekly News

Previous Week<= /a> Up Next Week

Hello

Here is the latest OCaml Weekly News, for the week of March 15 to 22, 2022.

Friday 03/04 Intern presentations – open attendance!

Continuing this thread, Aya announced

Here is the link to the video recording of the presentations! Thanks again to everyone who attended :pray: :tada:

Multicore OCaml: February 2022

Anil Madhavapeddy announced

Welcome to the February 2022 Multicore OCaml monthly report! As with previous u= pdates, these have been compiled by me, @ctk21, @kayceesrk and @shakthimaan.

Progress towards a stable OCaml 5.0.0 release have been moving forward at f= ull steam, with most of the multicore OCaml work now happening directly within the main ocaml/ocaml repository. A= s a number of deprecations<= /a> have happened in OCaml 5.0+trunk, it can be a little tricky in the immediate term to get a working development environmen= t. You may find these resources helpful:

  • There is a multicore monorepo which is a 'fast clo= ne and dune build' with a number of ecosystem libraries. (thanks @patricofe= rris)
  • There is an alpha-opam-repository which contains work-in= -progress packages. If a package you maintain is in there, now would be a = good time to start releasing it to the mainline opam-repository. Remember = that while we can propose changes, only the community maintainers of the re= levant projects can do the actual release, so your help with making OCam= l 5.0-compatible releases of your projects would be very much appreciated. (thanks @kit-ty-kate)

For mainline development, the

  • the ARM64 PR= has been merged, so your shiny Mac M1s will now work
  • we continue to work on the post-Multicore merge tasks for an upcoming 5= .0.0+trunk release. The documentation efforts on the OCaml memory model, ru= ntime system, and STW synchronization have also started.
  • The eio project = is actively being developed which now includes UDP support with Eio's netwo= rking interface. There has been robust discussion on several aspects of eio which is all influe= ncing the next iteration of its design (thank you to everyone!). For those = of you who do not wish to participate in public discussion, feel free to ge= t in touch with me or @kayceesrk for a private discussion, particularly if = you have a large OCaml codebase and opinions on concurrency. We'll summaris= e all these discussions as best we can over the coming months.
  • Sandmark-nightly and Sandmark have a custom v= ariant support feature to build trunk, developer branches, or a specific co= mmit to assess any performance regressions. The backend tooling with UI enh= ancements continue to drive the current-bench project forward.=
  • As always, the Multicore OCaml updates are listed first, which are then fol= lowed by the ecosystem tooling updates. Finally, the sandmark, sandmark-nightly and current-bench project tasks are= mentioned for your reference.

    Editor=E2=80=99s note: please find the full update at the archive link a= bove.

    OCaml 4.14.0, second release candidate

    octachron announced

    The release of OCaml 4.14.0 is imminent. As a last test that everything is in order, we are publishing a second rele= ase candidate for OCaml 4.14.0.

    We are directly jumping to the second release candidate due to a type system regression discovered during the release process of the first release candidate.

    Compared to the last beta, this release candidate includes a regression fix= when typing recursive constraints, two backend fixes (one for the frame-pointer = mode and the other one for the RISC-V architecture), one configuration fix for musl/arm64, and the manual chapter for the TMC transformation.

    If you find any bugs, please report them here:

    https://github.com/ocaml/= ocaml/issues

    The full release of OCaml 4.14.0 is currently planned for next week.

    Installation instructions

    The base compiler can be installed as an opam switch with the following com= mands

    opam update
    opam switch create 4.14.0~rc2 --repositories=3Ddefault,beta=3Dgit+https://g=
    ithub.com/ocaml/ocaml-beta-repository.git
    

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> --packages=3Docaml-variants.4.14.0~r=
    c2+options,<option_list>
    --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
    ository.git
    

    where <option_list> is a comma separated list of o= caml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

    opam switch create 4.14.0~rc2+flambda+nffa
    --packages=3Docaml-variants.4.14.0~rc2+options,ocaml-option-flambda,ocaml-o=
    ption-no-flat-float-array
    --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
    ository.git
    

    All available options can be listed with opam search ocaml-option.

    The source code for the release candidate is also available at these addres= ses:

    Changes since the last beta

    Type system regression fix
    • #11101, #11109: A recursiv= e type constraint fails on 4.14 (Jacques Garrigue, report and review by Flo= rian Angeletti)
    Backend fixes
    • #10688: Mov= e frame descriptor table from `rodata` to `data` section on RISC-V. Improv= es support for building DLLs and PIEs. In particular, this applies to all b= inaries in distributions that build PIEs by default (eg Gentoo and Alpine).= (Alex Fan, review by Gabriel Scherer)
    • #11031: Exc= eption handlers restore the rbp register when using frame-pointers on amd64= . (Fabrice Buoro, with help from Stephen Dolan, Tom Kelly and Mark Shinwell= , review by Xavier Leroy)
    Configuration fix
    • #11025, #11036: Do not pas= s -no-pie to the C compiler on musl/arm64 (omni, Kate Deplaix and Antonio N= uno Monteiro, review by Xavier Leroy)
    Documentation
    • updated entry = #181, #9760,= +#10740: opt-i= n tail-modulo-cons (TMC) transformation

      let[@tail_mod_cons] rec map f li =3D ...
      

      (Fr=C3=A9d=C3=A9ric Bour, Gabriel Scherer, Basile Cl=C3=A9ment, review by B= asile Cl=C3=A9ment and Pierre Chambart, tested by Konstantin Romanov)

    For Diversity and the OCaml Community: Outreachy Summer 2022

    Continuing this thread, Patrick Ferris said

    Thanks for the updates @pitag! For this summer's round I'll be mentoring a = project to Extend ocaml-geojson to support TopoJSON which will likely be a separate package. This is part of a larger effort I'm embarking on to provide better geospatial libraries and tools in OCaml!

    I'd be very happy to have a co-mentor if the project (or just the idea of O= utreachy) interests anyone. Don't hesitate to reach out to me on discuss publicly or privately if you are interested o= r have more questions :camel:

    Understanding cancellation (in eio)

    Deep in this thread, Simon Cruanes announced

    I still have reservations about the capabilities aspect of Eio, but the str= uctured concurrency part looks very nice. Just a few notes, for future reference to readers of this thread (if I have= n't missed them being posted above already):

    Another interesting post about structured concurrency and cancellation: https://250bpm.com/blog:71/

    A structured concurrency library in python: trio, which might be relatively similar to Eio's switches in concept (esp since @talex linked this)?

    Companion post to the trio blogpost: https://vorpus.org/blog/timeouts-and-ca= ncellation-for-humans/ which is directly relevant to the current topic.

    Atdpy: derive safe JSON interfaces for Python

    Martin Jambon announced

    On behalf of the ATD team, I'd like to announce atdpy, which is part of the= release 2.3.x of the ATD tools. For now, the best installation method with via opam:

    $ opam install atdpy
    

    Atdpy is a new backend for ATD. It takes a collection of type definitions and derives Python classes with mypy type annotations that validate the JSON da= ta.

    A short introdu= ction is included in the documentation.

    Use cases:

    • Safe communication with another program that also uses an ATD interface= . Other supported languages are OCaml (including Bucklescript), Java, and S= cala.
    • Need for [mostly] type-safe Python methods via mypy.
    • Need for a good Python API to communicate with an OCaml executable or s= ervice.
    • Need for sum types (variants, algebraic data types, tagged unions). ATD= sum types are ordinary types that include pure enums.

    Atdpy was developed as part of our work on Semgrep at r2c. Many thanks to @mseri for his massive help during the opam release of the 7 ATD packages, = and to the Ahrefs folks and @Khady in particular for supporting the project.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6E700E436E for ; Tue, 29 Mar 2022 09:43:01 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=I+4H=UI=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: db9HOE3fLL2ByGjKQzCJIog5krdV4YECjveBiI8oT5mcj0sKiqwNlVhiPm25tfYvv7OgRma7OH ARHN6j/h07XteWjw1td+dzs4vgibpMPRSqe55vGFHTmsFf9RkQ/UG4HFduHW8CSNLHzBmpCWcF 2L5FgSJxfIEQVuWWPQvIa+9y5EiuUrWJqNtXh75DGZqtGOxJZqkf95zlxsglp5YBtQ0elrcfmw Z6ra5MGMKYlwVQq9oGUNaknGQdqt12SF21j/6xEj50Q8p6WZc1FunMyvpjM7FV/n1TCiqUT5CB TGAgBNJ5h3JAAJFVrhxPVLHG X-IPAS-Result: =?us-ascii?q?A0CWAQCPt0JimCIeaIFagRWCb1kGKBkBXgZXKwcIRIRUi?= =?us-ascii?q?QYJiAmBFoIVhiKGeIw2gREDTxABAwENLAEOBQECBAEBghKCbwQCAhcGNAmDd?= =?us-ascii?q?gIeBgEFMxMBAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBA?= =?us-ascii?q?QEJCwkHBgwFEA4FPGRkBIFLBIF0CwcBByUNgjUMDAMDAYNwBAIBGAEIBAY+J?= =?us-ascii?q?xQPAxQBBgMCBA0BFwEUCgMUARIUBoJqAYJ1IQQBCpJemkMaJRB6fzKBAYNPA?= =?us-ascii?q?QMCAQILAwEOCSaDc4ESUw0CFIEZhhQUQ0sBgwIJgRSCcgIHIBCBVUSBFYIpS?= =?us-ascii?q?gdugVABcAMIFwEBAQEBgR8BGwEBEUWCZIJlBJd9Jg4gEQcFAREwDRMBEwcEB?= =?us-ascii?q?QsHIgEBFA4sAgYCIQIKCwEKBRQcDgYEGwEBIgUGBQMDBwYtkXcCEA4DGg0CA?= =?us-ascii?q?Y1BgUGJIoJdkUAZYTQHg0yBOwYMh0BmgR2Mdogig3SBT4pmhl2QUHAhljwIG?= =?us-ascii?q?IIphXV8gRAJgX9ElA8bDQgYhRiBTiprYgEbAgwHMxowQ4I1ATMJRQEDAg0BA?= =?us-ascii?q?gIDAQIBAgkBAQJUdYZVhggDFoEEAQhIgXuBPoEmgSRRO4RkaD80AQEBAQEzA?= =?us-ascii?q?gYBCgEBAwmFYwEBBRMLAYkRLYIZAQE?= IronPort-PHdr: A9a23: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 IUDcI4XU5jVEqRZPpOcuDsz5qypzWXWqWlUjQ== IronPort-Data: A9a23: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 28JSw+/Lw== IronPort-HdrOrdr: A9a23:b6yc86GpbbVAxnV9pLqE78eALOsnbusQ8zAXPiFKKSC9Hfb2qy nDpp4mPHzP6Qr5OktPpTnoAsDpKk80nqQY3WB+B9qfdTijkFTtBoBv54nvzlTbak7D398Y87 xvN4x3CNiYNykesS8W2njbL+od X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,219,1643670000"; d="scan'208,217";a="28817404" X-MGA-submission: =?us-ascii?q?MDHZFMwZn2cK09fufnMz9BWkgWTcr+ANaepn0r?= =?us-ascii?q?rJSPOv32NCD259CW5/Y5wbJ8FRY8x/qZFZXGzRjxt4L9yzo5qm1SOHK5?= =?us-ascii?q?WiCViisab+UZXBcjsDrQne3h9+OGISwNOkCP/qMv4vqT/7Lwu8l4Z7Zj?= =?us-ascii?q?JmIUGjMVWceJXBRFWVcBVT9w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Mar 2022 09:43:00 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1EE695605C5; Tue, 29 Mar 2022 09:42:59 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 29 Mar 2022 09:42:58 +0200 Message-ID: <87r16l5hml.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 29 09:42:59 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.045321, queueID=9867F5605C6 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMjIgdG8gMjksDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnB5bWxfYmlu ZGdlbjogYSBDTEkgYXBwIHRvIGdlbmVyYXRlIFB5dGhvbiBiaW5kaW5ncyBkaXJlY3RseSBmcm9t IE9DYW1sIHZhbHVlIHNwZWNpZmljYXRpb25zDQpUYXJpZGVzIGlzIGhpcmluZyENCkZvciBEaXZl cnNpdHkgYW5kIHRoZSBPQ2FtbCBDb21tdW5pdHk6IE91dHJlYWNoeSBTdW1tZXIgMjAyMg0KQ2Fx dGkgMS44LjAgYW5kIHJlbGF0ZWQgbmV3cw0KRmlyc3QgcmVsZWFzZSBvZiBwcmJubWNuLWRhZ2dl cg0KTWlyYWdlT1MgNC4wDQpPQ2FtbCA0LjE0LjAgaXMgcmVsZWFzZWQNCm9jYW1sLWluLXB5dGhv bi4wLjEuMDogRWZmb3J0bGVzcyBQeXRob24gYmluZGluZ3MgZm9yIE9DYW1sIG1vZHVsZXMNCk9s ZCBDV04NCg0KDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0byBnZW5lcmF0ZSBQeXRob24gYmlu ZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVjaWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHltbC1iaW5kZ2VuLWEtY2xpLWFwcC10 by1nZW5lcmF0ZS1weXRob24tYmluZGluZ3MtZGlyZWN0bHktZnJvbS1vY2FtbC12YWx1ZS1zcGVj aWZpY2F0aW9ucy84Nzg2LzY+DQoNCg0KUnlhbiBNb29yZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpOZXcg cmVsZWFzZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFZlcnNp b24gMC4zLjAgYW5kIDAuMy4xIGFyZSBub3cgYXZhaWxhYmxlIG9uIFtHaXRIdWJdLiAgMC4zLjAg aGFzIGJlZW4NCiAgbWVyZ2VkIGludG8gb3BhbSwgYW5kIGEgUFIgZm9yIDAuMy4xIGhhcyBiZWVu IG9wZW5lZC4gIFRoZSBbY2hhbmdlDQogIGxvZ10gaGFzIG1vcmUgZGV0YWlscyBhYm91dCB0aGUg Y2hhbmdlcy4NCg0KDQpbR2l0SHViXSA8aHR0cHM6Ly9naXRodWIuY29tL21vb3Jlcnlhbi9vY2Ft bF9weXRob25fYmluZGdlbi90YWdzPg0KDQpbY2hhbmdlIGxvZ10NCjxodHRwczovL2dpdGh1Yi5j b20vbW9vcmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuL2Jsb2IvbWFpbi9DSEFOR0VMT0cubWQ+ DQoNCg0KQmluZGluZyB0dXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFlvdSBjYW4gbm93IGJpbmQgdHVwbGVzIGRpcmVjdGx5LiAgSGVyZSdzIGEg UHl0aG9uIGZ1bmN0aW9uIHRoYXQgdGFrZXMNCiAgdHdvIGxpc3RzIG9mIHBvaW50cyAod2hlcmUg ZWFjaCAicG9pbnQiIGlzIGEgdHVwbGUgbGlrZSBgKHgsIHkpJykgYW5kDQogIGFkZHMgdGhlbSB0 b2dldGhlcg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZGVmIGFkZChwb2ludHMxLCBwb2lu dHMyKToNCiAg4pSCICAgICByZXR1cm4gWyh4MSArIHkxLCB4MiArIHkyKSBmb3IgKHgxLCB4Miks ICh5MSwgeTIpIGluIHppcChwb2ludHMxLCBwb2ludHMyKV0NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgQW5kIHlvdSBjb3VsZCBiaW5kIGl0IHVzaW5nIHR1cGxlcyBmcm9tIHRoZSBPQ2FtbCBzaWRl IGFzIHdlbGwuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2YWwgYWRkIDogcG9pbnRzMToo aW50ICogaW50KSBsaXN0IC0+IHBvaW50czI6KGludCAqIGludCkgbGlzdCAtPiB1bml0IC0+IChp bnQgKiBpbnQpIGxpc3QNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTm90ZSB0aGVyZSBhcmUgc29t ZSByZXN0cmljdGlvbnMgcmVnYXJkaW5nIHR1cGxlcywgd2hpY2ggeW91IGNhbiByZWFkDQogIGFi b3V0IFtoZXJlXSwgW2hlcmVdLCBvciBbaGVyZV0uDQoNCg0KW2hlcmVdIDxodHRwczovL21vb3Jl cnlhbi5naXRodWIuaW8vb2NhbWxfcHl0aG9uX2JpbmRnZW4vdHVwbGVzLz4NCg0KW2hlcmVdDQo8 aHR0cHM6Ly9naXRodWIuY29tL21vb3Jlcnlhbi9vY2FtbF9weXRob25fYmluZGdlbi9ibG9iL21h aW4vZXhhbXBsZXMvUkVBRE1FLm1kPg0KDQpbaGVyZV0NCjxodHRwczovL2dpdGh1Yi5jb20vbW9v cmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuL2Jsb2IvbWFpbi9DSEFOR0VMT0cubWQjMDMwLTIw MjItMDMtMTg+DQoNCg0KQXR0cmlidXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgWW91IGNhbiB1c2UgYXR0cmlidXRlcyBvbiB2YWx1ZSBzcGVjaWZpY2F0aW9ucy4gIEN1 cnJlbnRseSB0aGUgb25seQ0KICBvbmUgc3VwcG9ydGVkIGlzIGBweV9mdW5fbmFtZScsIHdoaWNo IGFsbG93cyB5b3UgdG8gZGVjb3VwbGUgdGhlDQogIFB5dGhvbiBtZXRob2QgbmFtZSBhbmQgdGhl IGdlbmVyYXRlZCBPQ2FtbCBmdW5jdGlvbiBuYW1lLg0KDQogIEFzIGFuIGV4YW1wbGUsIHRha2Ug dGhlIGZvbGxvd2luZyBQeXRob24gZnVuY3Rpb24sIHdoaWNoIGFkZHMgdG8NCiAgInRoaW5ncyIu DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBkZWYgYWRkKHgsIHkpOg0KICDilIIgICAgIHJl dHVybiB4ICsgeQ0KICDilJTilIDilIDilIDilIANCg0KICBZb3UgY291bGQgYmluZCBtdWx0aXBs ZSBPQ2FtbCBmdW5jdGlvbnMgdG8gdGhpcyBzaW5nbGUgZnVuY3Rpb24gbm93Lg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdmFsIGFkZF9pbnQgOiB4OmludCAtPiB5OmludCAtPiB1bml0IC0+ IGludA0KICDilIIgW0BAcHlfZnVuX25hbWUgYWRkXQ0KICDilIIgDQogIOKUgiB2YWwgYWRkX2Zs b2F0IDogeDpmbG9hdCAtPiB5OmZsb2F0IC0+IHVuaXQgLT4gZmxvYXQNCiAg4pSCIFtAQHB5X2Z1 bl9uYW1lIGFkZF0NCiAg4pSCIA0KICDilIIgdmFsIGFkZF9zdHJpbmcgOiB4OnN0cmluZyAtPiB5 OnN0cmluZyAtPiB1bml0IC0+IHN0cmluZw0KICDilIIgW0BAcHlfZnVuX25hbWUgYWRkXQ0KICDi lJTilIDilIDilIDilIANCg0KDQpQeXRob24gbWFnaWMgbWV0aG9kcw0K4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgVGhpcyBp cyBhbHNvIG5pY2UgZm9yIGJpbmRpbmcgUHl0aG9uIFttYWdpYyBtZXRob2RzXS4gRm9yIGV4YW1w bGUsIHlvdQ0KICBkb24ndCBoYXZlIHRvIHVzZSBgX19pbml0X18nIGFzIHRoZSBuYW1lIG9mIHRo ZSBPQ2FtbCBmdW5jdGlvbiB5b3UgdXNlDQogIHRvIG1ha2UgaW5zdGFuY2VzIG9mIGEgUHl0aG9u IGNsYXNzLiAgWW91IGNhbiBiaW5kIGl0IHRvIGEgbW9yZQ0KICBuYXR1cmFsIG5hbWUgbGlrZSBg Y3JlYXRlJyBvciBgbWFrZScuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2YWwgY3JlYXRl IDogbmFtZTpzdHJpbmcgLT4gYWdlOmludCAtPiB1bml0IC0+IHQNCiAg4pSCIFtAQHB5X2Z1bl9u YW1lIF9faW5pdF9fXQ0KICDilJTilIDilIDilIDilIANCg0KDQpbbWFnaWMgbWV0aG9kc10NCjxo dHRwczovL2RvY3MucHl0aG9uLm9yZy8zL3JlZmVyZW5jZS9kYXRhbW9kZWwuaHRtbCNzcGVjaWFs bmFtZXM+DQoNCg0KVXNpbmcgUHl0eXBlcy5weW9iamVjdCBkaXJlY3RseQ0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgU29tZXRpbWVzIHlvdSBtYXkgbm90IHdhbnQg dG8gYm90aGVyIGNvbnZlcnRpbmcgUHl0aG9uIHR5cGVzIHRvIG5vcm1hbA0KICBPQ2FtbCB0eXBl cyBhdCBhbGwuICBZb3UgY2FuIGRvIHRoYXQgbm93IGluIHZhbHVlIHNwZWNpZmljYXRpb25zIGJ5 DQogIHVzaW5nIHRoZSBgUHl0eXBlcy5weW9iamVjdCcgYW5kIGBQeS5PYmplY3QudCcgdHlwZXMg ZGlyZWN0bHkuDQoNCg0KRmV3ZXIgZGVwZW5kZW5jaWVzDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBgcmUnIGlzIG5vdyB1c2VkIGlu c3RlYWQgb2YgYHJlMicsIHdoaWNoIGRyb3BzIHRoZSBudW1iZXIgb2YNCiAgZGVwZW5kZW5jaWVz IHRoYXQgbmVlZCB0byBiZSBpbnN0YWxsZWQgYnkgYWJvdXQgaGFsZi4gIEFkZGl0aW9uYWxseSwN CiAgYGNvcmUnLCBgY29yZV9iZW5jaCcsIGFuZCBgYmlzZWN0X3BweCcgZG9uJ3QgbmVlZCB0byBi ZSBpbnN0YWxsZWQgaWYNCiAgeW91IHdhbnQgdG8gaW5zdGFsbCBgcHltbF9iaW5kZ2VuJyBkaXJl Y3RseSBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSwNCiAgd2hpY2ggZ3JlYXRseSBjdXRzIHRoZSBy ZXF1aXJlZCBkZXBlbmRlbmNpZXMgaW4gdGhpcyBjYXNlLg0KDQogIFRoYW5rcyBhZ2FpbiB0byBV bml4SnVua2llIGZvciBzcHVycmluZyBtYW55IG9mIHRoZXNlIHVwZGF0ZXMhDQoNCg0KVGFyaWRl cyBpcyBoaXJpbmchDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Rh cmlkZXMtaXMtaGlyaW5nLzk1NTMvMT4NCg0KDQpUaG9tYXMgR2F6YWduYWlyZSBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvbGxvd2luZyB0aGUgcmVjZW50IGFubm91 bmNlbWVudCBhYm91dCBUYXJpZGVzIChqb2luaW5nIGZvcmNlcyB3aXRoDQogIFtPQ2FtbCBMYWJz XSBhbmQgW1NlZ2ZhdWx0IFN5c3RlbV0pLCB3ZSBhcmUgbm93IGxvb2tpbmcgdG8gZXhwYW5kIG91 cg0KICB0ZWFtIHdpdGggZXhwZXJpZW5jZWQgc29mdHdhcmUgZW5naW5lZXJzLCBjb21wYXNzaW9u YXRlIHRlYW0gbGVhZHMgYW5kDQogIGV4cGVydHMgaW4gc29mdHdhcmUgY29uc3VsdGluZyBzZXJ2 aWNlcy4gT3VyIGFtYml0aW9uIGlzIHRvIGJyaW5nDQogIE9DYW1sIHRvIGEgdmFzdCBzZXQgb2Yg bmV3IGRldmVsb3BlcnMgYW5kIGluZHVzdHJpZXMuIFdlIHdhbnQgdG8gbWFrZQ0KICBkZXZlbG9w ZXJzIG1vcmUgcHJvZHVjdGl2ZSBieSBzcGVuZGluZyBsZXNzIHRpbWUgb24gZml4aW5nIGJ1Z3Mg YW5kDQogIG1vcmUgb24gd3JpdGluZyBuZXcgZmVhdHVyZXMuIEFuZCB3ZSB3YW50IHRoZSBzb2Z0 d2FyZSBpbmR1c3RyeSB0bw0KICBidWlsZCBtb3JlIHJvYnVzdCBhbmQgcGVyZm9ybWFudCBzeXN0 ZW1zIHRoYXQgY2FuIGxhc3QgZm9yIGRlY2FkZXMuDQoNCiAgV2UgYXJlIGxvb2tpbmcgZm9yOg0K DQogIOKAoiBFeHBlcmllbmNlZCBbU29mdHdhcmUgRW5naW5lZXIocyldIHRvIHRha2UgcGFydCBp biB0aGUgZGV2ZWxvcG1lbnQNCiAgICBvZiBJcm1pbi4gWW91IHdpbGwgYmUgcGFydCBvZiB0aGUg dGVhbSB0aGF0IGRlc2lnbnMsIGJ1aWxkcyBhbmQNCiAgICBzaGlwcyBJcm1pbiBsaWJyYXJpZXMg YW5kIGFwcGxpY2F0aW9ucyB0byBvdXIgY29tbXVuaXR5IGFuZA0KICAgIGN1c3RvbWVycy4NCiAg 4oCiIFtUZWFtIExlYWQocyldIHdobyBjYXJlcyBhYm91dCBtb3RpdmF0aW5nIHRoZWlyIHRlYW0g bWVtYmVycywNCiAgICBzdXBwb3J0aW5nIHRoZWlyIGdyb3d0aCBhbmQgZGV2ZWxvcG1lbnQgYW5k IHN1Y2Nlc3NmdWxseSBkZWxpdmVyaW5nDQogICAgdGhlIHRlYW0ncyBvYmplY3RpdmVzIG9uIHRp bWUuDQogIOKAoiBBIFtIZWFkIG9mIENvbnN1bHRpbmcgU2VydmljZXNdIHRvIGRpdmVyc2lmeSBv dXIgdGVjaG5pY2FsIHRlYW1zIGFuZA0KICAgIGNvbW1lcmNpYWwgc2VydmljZXMgcG9ydGZvbGlv LiBZb3UnbGwgYmUgdGhlIGZpcnN0IGhpcmUgZm9yIHRoaXMNCiAgICBicmFuZCBuZXcgZGVwYXJ0 bWVudCBhbmQgd2lsbCBoYXZlIHRoZSBvcHBvcnR1bml0eSB0byBoZWxwIHVzIGJ1aWxkDQogICAg b3VyIHNlcnZpY2VzIHN0cnVjdHVyZSBmcm9tIHNjcmF0Y2gsIGluY2x1ZGluZyBvdXIgc3RyYXRl Z3ksDQogICAgcHJvY2Vzc2VzLCB0b29scywgYW5kIHRlYW0uDQoNCiAgV2UgYXJlIGFsd2F5cyBs b29raW5nIGZvciBncmVhdCBPQ2FtbCBlbnRodXNpYXN0cyB0byBqb2luIG91ciB0ZWFtLCBzbw0K ICBldmVuIGlmIHRoZXNlIGpvYiBkZXNjcmlwdGlvbnMgZG8gbm90IGZpdCB5b3VyIHByb2ZpbGUg cHJlY2lzZWx5LCB5b3UNCiAgYXJlIHdlbGNvbWUgdG8gc2VuZCB1cyBbYSBzcG9udGFuZW91cyBh cHBsaWNhdGlvbl0hDQoNCg0KW09DYW1sIExhYnNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9n LzIwMjItMDEtMjctb2NhbWwtbGFicy1qb2lucy10YXJpZGVzPg0KDQpbU2VnZmF1bHQgU3lzdGVt XQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIyLTAzLTAxLXNlZ2ZhdWx0LXN5c3RlbXMt am9pbnMtdGFyaWRlcz4NCg0KW1NvZnR3YXJlIEVuZ2luZWVyKHMpXQ0KPGh0dHBzOi8vdGFyaWRl cy5jb20vam9icy9zZW5pb3Itc29mdHdhcmUtZW5naW5lZXI+DQoNCltUZWFtIExlYWQocyldIDxo dHRwczovL3RhcmlkZXMuY29tL2pvYnMvdGVhbS1sZWFkLWVuZ2luZWVyaW5nPg0KDQpbSGVhZCBv ZiBDb25zdWx0aW5nIFNlcnZpY2VzXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vam9icy9oZWFkLW9m LWNvbnN1bHRpbmctc2VydmljZXM+DQoNClthIHNwb250YW5lb3VzIGFwcGxpY2F0aW9uXQ0KPGh0 dHBzOi8vdGFyaWRlcy5jb20vam9icy9zcG9udGFuZW91cy1hcHBsaWNhdGlvbj4NCg0KDQpGb3Ig RGl2ZXJzaXR5IGFuZCB0aGUgT0NhbWwgQ29tbXVuaXR5OiBPdXRyZWFjaHkgU3VtbWVyIDIwMjIN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv Zm9yLWRpdmVyc2l0eS1hbmQtdGhlLW9jYW1sLWNvbW11bml0eS1vdXRyZWFjaHktc3VtbWVyLTIw MjIvOTIzNC82Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIEF5YSBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEBwaXRhZyBhbmQg SSBoYXZlIHJlc3VibWl0dGVkIHRoZSBQUFggZGVyaXZlcnMgcHJvamVjdCBmb3IgdGhpcyBTdW1t ZXINCiAgMjAyMiByb3VuZDogKkV4cGFuZCBPQ2FtbCdzIGxpYnJhcnkgb2Ygc3RhbmRhcmQgZGVy aXZlcnMqISBUaGlzIGlzIHRoZQ0KICBzYW1lIHByb2plY3QgSSB3YXMgdGhlIGludGVybiBmb3Ig dGhpcyBwYXN0IFdpbnRlciAyMDIyIHJvdW5kLCB3aGVyZQ0KICB0aGUgZ29hbCBpcyB0byBidWls ZCB1cCBhIFtzdGFuZGFyZCBkZXJpdmVyc10gbGlicmFyeSwgbGlrZQ0KICBgcHB4X2Rlcml2aW5n JywgdXNpbmcgdGhlIHVwZGF0ZWQgYHBweGxpYicgQVBJLg0KDQogIEknbSBleGNpdGVkIHRvIGJl IHN1cHBvcnRpbmcgQHBpdGFnIHdpdGggbWVudG9yaW5nLCBhbmQgZm9yIHRoZQ0KICBvcHBvcnR1 bml0eSB0byBzdGF5IGludm9sdmVkIG5vdyB0aGF0IG15IGludGVybnNoaXAgaGFzIGVuZGVkIDpz bWlsZXk6DQoNCg0KW3N0YW5kYXJkIGRlcml2ZXJzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LXBweC9zdGFuZGFyZF9kZXJpdmVycz4NCg0KDQpDYXF0aSAxLjguMCBhbmQgcmVsYXRlZCBuZXdz DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jYXF0aS0xLTgtMC1hbmQtcmVsYXRlZC1uZXdzLzk1NjEv MT4NCg0KDQoiUGV0dGVyIEEuIFVya2VkYWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGFtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBzZWNvbmQgcmVsZWFzZSBv ZiBbQ2FxdGldIHRoaXMgeWVhci4gVGhlDQogIHJlYXNvbiBmb3IgdGhlIHF1aWNrIHN1Y2Nlc3Np b24gaXMgcGFydGx5IGFuIGFkanVzdG1lbnQgdG8gdGhlIFtuZXcNCiAgQVBJIGZvciByZXF1ZXN0 IGNvbnN0cnVjdGlvbl0gYW5kIHBhcnRseSB0aGF0IFttYXRjaGFibGUgZXJyb3INCiAgY29uZGl0 aW9uc10gZGlkIG5vdCBtYWtlIGl0IGludG8gdGhlIHByZXZpb3VzIHJlbGVhc2UuICBZb3UgY2Fu IHNlZQ0KICB0aGUgZnVsbCByZWxlYXNlIG5vdGVzIGJlbG93Lg0KDQogIEkgd291bGQgYWxzbyBs aWtlIHRvIHRoYW5rIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSBmb3Igc3BvbnNvcmluZw0K ICBteSBlZmZvcnRzIG9uIHRoZSBDYXF0aSBwcm9qZWN0IHRoaXMgeWVhciwgYWxzbyBpbmNsdWRp bmcgbW9zdCBvZiB0aGUNCiAgd29yayB0aGF0IHdlbnQgaW50byB0aGUgcHJldmlvdXMgcmVsZWFz ZS4NCg0KICBPbmUgW2ZlYXR1cmUgaW4gcHJvZ3Jlc3NdIGlzIGEgbmV3IGRyaXZlciBiYXNlZCBv biB0aGUgcHVyZS1PQ2FtbA0KICBbcGd4XSB3aGljaCBzaG91bGQgbWFrZSBpdCBwb3NzaWJsZSwg d2l0aCBzb21lIGFkZGl0aW9uYWwgY2hhbmdlcyB0bw0KICB0aGUgd2F5IGRyaXZlcnMgYXJlIGxv YWRlZCwgdG8gdGFyZ2V0IE1pcmFnZU9TLiBJIGFtIG5vdGUgc3VyZSBpZiB0aGlzDQogIGNhbiBi ZSBkb25lIGluIGEgbWlub3IgcmVsZWFzZSBvciB3aWxsIHJlcXVpcmUgYSBDYXF0aSAyIGJyYW5j aC4NCg0KDQpbQ2FxdGldIDxodHRwczovL2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWNhcXRp Pg0KDQpbbmV3IEFQSSBmb3IgcmVxdWVzdCBjb25zdHJ1Y3Rpb25dDQo8aHR0cHM6Ly9wYXVya2Vk YWwuZ2l0aHViLmlvL29jYW1sLWNhcXRpL2NhcXRpL0NhcXRpX3JlcXVlc3QvSW5maXgvaW5kZXgu aHRtbD4NCg0KW21hdGNoYWJsZSBlcnJvciBjb25kaXRpb25zXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9wYXVya2VkYWwvb2NhbWwtY2FxdGkvaXNzdWVzLzcyPg0KDQpbT0NhbWwgU29mdHdhcmUgRm91 bmRhdGlvbl0gPGh0dHBzOi8vb2NhbWwtc2Yub3JnPg0KDQpbZmVhdHVyZSBpbiBwcm9ncmVzc10N CjxodHRwczovL2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWNhcXRpL2lzc3Vlcy8zOD4NCg0K W3BneF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hcmVuYWRvdGlvL3BneD4NCg0KUmVsZWFzZSBOb3Rl cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTmV3IGZlYXR1 cmVzOg0KDQogIOKAoiBBIG1hdGNoYWJsZSByZXByZXNlbnRhdGlvbiBvZiBjb21tb24gY2F1c2Vz IG9mIGVycm9ycyBvbiB0aGUNCiAgICBkYXRhYmFzZSBzaWRlIGlzIG5vdyBhdmFpbGFibGUsIHdp dGggbGltaXRhdGlvbnMuICBJdCBmb2N1c2VzIG9uDQogICAgY29uZGl0aW9ucyB3aGljaCBzZWVt IG1vc3QgbGlrZWx5IHVzZWZ1bCB0byBoYW5kbGUuICBBdCB0aGUgbW9tZW50DQogICAgd2UgbGFj ayBleHRlbmRlZCBlcnJvciBjb2RlcyBmcm9tIFNRTGl0ZTMgbmVlZGVkIHRvIG1ha2UgdGhlIGNh dXNlDQogICAgZnVsbHkgcHJlY2lzZS4NCg0KICDigKIgRXhwb3NlIHRoZSB1bmRlcmx5aW5nIGVy cm9yIGRldGFpbHMgZnJvbSBkYXRhYmFzZSBjbGllbnQgbGlicmFyaWVzLg0KICAgIFRoaXMgaXMg bWVhbnQgdG8gYmUgdXNlIGFzIGEgbGFzdCByZXNvcnQsIGFuZCByZXF1aXJlcyBkaXJlY3RseQ0K ICAgIGxpbmtpbmcgd2l0aCB0aGUgcmVsZXZhbnQgZHJpdmVycy4NCg0KICDigKIgQSBzZWNvbmQg c2V0IG9mIHJlcXVlc3QgY29uc3RydWN0aW9uIG9wZXJhdG9ycyBgLT4uJywgYC0+PycsIGAtPiEn LA0KICAgIGFuZCBgLT4qJyB3ZXJlIGludHJvZHVjZWQgYWZ0ZXIgZXhwZXJpZW5jZSB3aXRoIGNv bnZlcnRpbmcgZXhpc3RpbmcNCiAgICBjb2RlLiAgR2l2ZW4gdGhlIHBhcmFtZXRlciBhbmQgcmVz dWx0IHR5cGUgdGhleSByZXR1cm4gYSBmdW5jdGlvbg0KICAgIHdoaWNoIGNvbnN0cnVjdHMgYSBy ZXF1ZXN0IGRpcmVjdGx5IGZyb20gYSBxdWVyeSBzdHJpbmcuICBBdm9pZGluZw0KICAgIHRoZSBu ZWVkIHRvIGNvbXBvc2Ugd2l0aCBgQDotJyBzaW1wbGlmaWVzIGxvY2FsIG9wZW5zIGFuZCB1c2Fn ZSB3aXRoDQogICAgYExpc3QubWFwJyBldGMuDQoNCiAg4oCiIEVudmlyb25tZW50IHZhcmlhYmxl cyBhcmUgbm93IGV4cGFuZGVkIGluIHRoZSBkZWJ1ZyBsb2cgd2hlbiB1c2luZw0KICAgIHRoZSBu ZXcgcmVxdWVzdCBjb25zdHJ1Y3RvcnMgaW50cm9kdWNlZCBpbiAxLjcuMC4NCg0KICDigKIgQSBu ZXcgYD90d2Vha3NfdmVyc2lvbicgY29ubmVjdGlvbiBwYXJhbWV0ZXIgaGFzIGJlZW4gYWRkZWQg dG8NCiAgICBjb250cm9sIHdoZW4gdGhlIGNsaWVudCBpcyByZWFkeSB0byBhZGFwdCB0byBjaGFu Z2VzIGluIGRhdGFiYXNlDQogICAgc2Vzc2lvbiBwYXJhbWV0ZXJzIG9yIG90aGVyIGFkanVzdG1l bnRzIG9mIHRoZSBpbnRlcmFjdGlvbiB3aXRoDQogICAgc3BlY2lmaWMgZGF0YWJhc2Ugc3lzdGVt cy4gW1tNb3JlIGRldGFpbHMgYXZhaWxhYmxlIGluIHRoZQ0KICAgIGRvY3VtZW50YXRpb24uXV0N Cg0KICDigKIgRW5hYmxlIGZvcmVpZ24ga2V5IGNvbnN0cmFpbnQgY2hlY2tzIGZvciBTUUxpdGUz IHN0YXJ0aW5nIGF0IHR3ZWFrcw0KICAgIHZlcnNpb24gMS43Lg0KDQogIEZpeGVzOg0KDQogIOKA oiBGaXhlZCBkZWJ1ZyBsb2dnaW5nIHRvIHBhc3MgdGhlIGNvcnJlY3QgZHJpdmVyIGluZm8gdG8g dGhlIHF1ZXJ5DQogICAgY2FsbGJhY2sgaW5zdGVhZCBvZiBhIGR1bW15IGRyaXZlciBpbmZvIHdo aWNoIHdvdWxkIGNhdXNlIGEgZmFpbHVyZQ0KICAgIGlmIHVuc3VwcG9ydGVkLg0KDQogIERlcHJl Y2F0aW9uczoNCg0KICDigKIgVGhlIGAtLT4nIG9wZXJhdG9yIHdhcyByZW5hbWVkIHRvIGAtLT4h Jywgd2l0aCBhIGRlcHJlY2F0ZWQgYWxpYXMsDQogICAgZm9yIGNvbnNpc3RlbmN5IHdpdGggdGhl IG5ldyBgLT4hJyBvcGVyYXRvci4NCg0KICDigKIgVGhlIG9sZCBjb252ZW5pZW5jZSBpbnRlcmZh Y2UgZm9yIGNyZWF0aW5nIHJlcXVlc3RzIGhhcyBiZWVuDQogICAgZGVwcmVjYXRlZCBpbiBmYXZv dXIgb2YgdGhlIG5ldyBpbmZpeCBvcGVyYXRvcnMgYW5kIHRoZSBuZXcgcXVlcnkNCiAgICB0ZW1w bGF0ZSBwYXJzZXIuDQoNCiAg4oCiIERvY3VtZW50ZWQtb25seSBkZXByZWNhdGlvbnMgb2YgYENh cXRpX3NxbF9pbycsIGBDYXF0aV9sd3Rfc3FsX2lvJywNCiAgICBhbmQgYENhcXRpX2FzeW5jX3Nx bF9pbycgaGF2ZSBiZWVuIGFubm90YXRlZC4NCg0KDQpbTW9yZSBkZXRhaWxzIGF2YWlsYWJsZSBp biB0aGUgZG9jdW1lbnRhdGlvbi5dDQo8aHR0cHM6Ly9wYXVya2VkYWwuZ2l0aHViLmlvL29jYW1s LWNhcXRpL2NhcXRpL3R3ZWFrcy5odG1sPg0KDQoNCkZpcnN0IHJlbGVhc2Ugb2YgcHJibm1jbi1k YWdnZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtcHJi bm1jbi1kYWdnZXIvOTMxMS8yPg0KDQoNCklnYXJuaWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHByb3Vk IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHZlcnNpb24gMC4wLjIgb2YNCiAgW3ByYm5tY24t ZGFnZ2VyXS4NCg0KICBUaGlzIHZlcnNpb24gYWRkcyBTZXF1ZW50aWFsIE1vbnRlLUNhcmxvLCBh LmsuYS4gW3BhcnRpY2xlDQogIGZpbHRlcnNdLWJhc2VkIGluZmVyZW5jZSB0byB0aGUgbGlicmFy eS4NCg0KICBIZXJlJ3MgdGhlIGZ1bGwgY2hhbmdlbG9nOg0KICDigKIgRGVwZW5kZW5jeTogYHBy Ym5tY24tc3RhdHMuMC4wLjMnIC0+IGBwcmJubWNuLXN0YXRzLjAuMC40Jw0KICDigKIgQWRkIGJl dGEgZGlzdHJpYnV0aW9uIHRvIEdzbCBzYW1wbGVycw0KICDigKIgUmVmYWN0b3IgQ3BzIG1vbmFk DQogIOKAoiBBZGQgU01DIGluZmVyZW5jZQ0KICDigKIgU2ltcGxpZnkgaGFuZGxlciB0eXBlLCBt b2R1bGFyaXplIGVmZmVjdCBkZWZpbml0aW9ucyBhd2F5IGZyb20NCiAgICBDcHNfbW9uYWQNCiAg 4oCiIEZpeCB0eXBvOiBiZXJub3VpbGxpIC0+IGJlcm5vdWxsaSAocmVwb3J0IGJ5IEBuaWxzYmVj a2VyKQ0KDQogIEkgYWxzbyB3cm90ZSB0aGUgZm9sbG93aW5nIGFydGljbGU6IFtBcHBseWluZyBT ZXF1ZW50aWFsIE1vbnRlLUNhcmxvDQogIHRvIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nXSBJdCBj b250YWlucyBzb21lIHVzZSBjYXNlcyBmb3IgdGhlDQogIGxpYnJhcnksIEkgaG9wZSBzb21lIGZp bmQgaXQgZnVuIDopDQoNCiAgVG8gY29uY2x1ZGUgdGhpcyBwb3N0LCBhbmQgYXMgYSBwYXJ0aWFs IGFuc3dlciB0byBAZ2FzY2hlICdzDQogIFtxdWVzdGlvbl0gaW4gYW4gb2xkZXIgdGhyZWFkLCBJ IGJlbGlldmUgdGhhdCB1bmxpa2Ugc29tZSBvdGhlcg0KICBpbmZlcmVuY2UgdGVjaG5pcXVlcywg c2luZ2xlLXNob3QgY29udGludWF0aW9ucyBhcmUgZW5vdWdoIHRvDQogIGltcGxlbWVudCBTTUMu IFdpdGhvdXQgZ2V0dGluZyBpbnRvIHRoZSBkZXRhaWxzLCB0aGUgaW1wbGVtZW50YXRpb24gaXMN CiAgdmVyeSByZW1pbmlzY2VudCBvZiB0aGF0IG9mIGxpZ2h0d2VpZ2h0IHRocmVhZGluZyBsaWJy YXJpZXMuIEkgbG9vaw0KICBmb3J3YXJkIHRvIGV4cGVyaW1lbnQgd2l0aCBhIGZpYnJlLWJhc2Vk IGltcGxlbWVudGF0aW9uIQ0KDQoNCltwcmJubWNuLWRhZ2dlcl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9pZ2Fybmllci9wcmJubWNuLWRhZ2dlcj4NCg0KW3BhcnRpY2xlIGZpbHRlcnNdIDxodHRwczov L2VuLndpa2lwZWRpYS5vcmcvd2lraS9QYXJ0aWNsZV9maWx0ZXI+DQoNCltBcHBseWluZyBTZXF1 ZW50aWFsIE1vbnRlLUNhcmxvIHRvIHRpbWUgc2VyaWVzIGZvcmVjYXN0aW5nXQ0KPGh0dHA6Ly9w cm9iYW5vbWljb24ueHl6L2Jsb2cvd2luZF9wb3dlcl9mb3JlY2FzdC5odG1sPg0KDQpbcXVlc3Rp b25dDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L211bHRpLXNob3QtY29udGludWF0aW9u cy1nb25lLWZvcmV2ZXIvOTA3Mi81Pg0KDQoNCk1pcmFnZU9TIDQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tbWlyYWdlb3MtNC0wLzk1OTgvMT4NCg0KDQpUaG9tYXMgR2F6YWduYWlyZSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICpPbiBiZWhhbGYgb2YgdGhl IE1pcmFnZU9TIHRlYW0sIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZQ0KICByZWxlYXNl IG9mIE1pcmFnZU9TIDQuMC4wISogSSdkIGxpa2UgdG8gc2VuZCBzcGVjaWFsIHRoYW5rcyB0bw0K ICBAZGlub3NhdXJlIGFuZCBATG9ydGV4IHdobyBkcm92ZSB0aGF0IHJlbGVhc2UgZm9yd2FyZCBm b3IgbXVsdGlwbGUNCiAgeWVhcnMuDQoNCiAgU2luY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgMjAx MywgTWlyYWdlT1MgaGFzIG1hZGUgc3RlYWR5IHByb2dyZXNzDQogIHRvd2FyZCBkZXBsb3lpbmcg YSBzZWxmLW1hbmFnZWQgaW50ZXJuZXQgaW5mcmFzdHJ1Y3R1cmUuIFRoZSBwcm9qZWN04oCZcw0K ICBpbml0aWFsIGFpbSB3YXMgdG8gc2VsZi1ob3N0IGFzIG1hbnkgc2VydmljZXMgYXMgcG9zc2li bGUgYWltZWQgYXQNCiAgZW1wb3dlcmluZyBpbnRlcm5ldCB1c2VycyB0byBzZWN1cmVseSBkZXBs b3kgaW5mcmFzdHJ1Y3R1cmUgdG8gb3duDQogIHRoZWlyIGRhdGEgYW5kIHRha2UgYmFjayBjb250 cm9sIG9mIHRoZWlyIHByaXZhY3kuIE1pcmFnZU9TIGNhbg0KICBzZWN1cmVseSBkZXBsb3kgW3N0 YXRpYyB3ZWJzaXRlIGhvc3RpbmddIHdpdGgg4oCcTGV04oCZcyBFbmNyeXB04oCdDQogIGNlcnRp ZmljYXRlIHByb3Zpc2lvbmluZyBhbmQgYSBbc2VjdXJlIFNNVFBzdGFja10gd2l0aCBzZWN1cml0 eQ0KICBleHRlbnNpb25zLiBNaXJhZ2VPUyBjYW4gYWxzbyBkZXBsb3kgZGVjZW50cmFsaXNlZCBj b21tdW5pY2F0aW9uDQogIGluZnJhc3RydWN0dXJlIGxpa2UgW01hdHJpeF0sIFtPcGVuVlBOIHNl cnZlcnNdLCBhbmQgW1RMUyB0dW5uZWxzXSB0bw0KICBlbnN1cmUgZGF0YSBwcml2YWN5IG9yIFtE TlMoU0VDKSBzZXJ2ZXJzXSBmb3IgYmV0dGVyIGF1dGhlbnRpY2F0aW9uLg0KDQogIFRoZSBwcm90 b2NvbCBlY29zeXN0ZW0gbm93IGNvbnRhaW5zIFtodW5kcmVkcyBvZiBsaWJyYXJpZXNdIGFuZA0K ICBzZXJ2aWNlcyBtaWxsaW9ucyBvZiBkYWlseSB1c2Vycy4gT3ZlciB0aGVzZSB5ZWFycywgbWFq b3IgY29tbWVyY2lhbA0KICB1c2VycyBoYXZlIGpvaW5lZCB0aGUgcHJvamVjdHMuIFRoZXkgcmVs eSBvbiBNaXJhZ2VPUyBsaWJyYXJpZXMgdG8NCiAga2VlcCB0aGVpciBwcm9kdWN0cyBzZWN1cmUu IEZvciBpbnN0YW5jZSwgdGhlIE1pcmFnZU9TIG5ldHdvcmtpbmcgY29kZQ0KICBwb3dlcnMgW0Rv Y2tlciBEZXNrdG9w4oCZcyBWUE5LaXRdLCB3aGljaCBzZXJ2ZXMgdGhlIHRyYWZmaWMgb2YgbWls bGlvbnMNCiAgb2YgY29udGFpbmVycyBkYWlseS4gW0NpdHJpeCBIeXBlcnZpc29yXSB1c2VzIE1p cmFnZU9TIHRvIGludGVyYWN0DQogIHdpdGggWGVuLCB0aGUgaHlwZXJ2aXNvciB0aGF0IHBvd2Vy cyBtb3N0IG9mIHRvZGF54oCZcyBwdWJsaWMNCiAgY2xvdWQuIFtOaXRyb2tleV0gaXMgZGV2ZWxv cGluZyBhIG5ldyBoYXJkd2FyZSBzZWN1cml0eSBtb2R1bGUgYmFzZWQNCiAgb24gTWlyYWdlT1Mu IFtSb2J1cl0gZGV2ZWxvcHMgYSB1bmlrZXJuZWwgb3JjaGVzdHJhdGlvbiBzeXN0ZW0gZm9yDQog IGZsZWV0cyBvZiBNaXJhZ2VPUyB1bmlrZXJuZWxzLiBbVGFyaWRlc10gdXNlcyBNaXJhZ2VPUyB0 byBpbXByb3ZlIHRoZQ0KICBbVGV6b3NdIGJsb2NrY2hhaW4sIGFuZCBbSHlwZXJdIHVzZXMgTWly YWdlT1MgdG8gYnVpbGQgc2Vuc29yDQogIGFuYWx5dGljcyBhbmQgYW4gYXV0b21hdGlvbiBwbGF0 Zm9ybSBmb3Igc3VzdGFpbmFibGUgYWdyaWN1bHR1cmUuDQoNCiAgSW4gdGhlIGNvbWluZyB3ZWVr cywgb3VyIGJsb2cgd2lsbCBmZWF0dXJlIGluLWRlcHRoIHRlY2huaWNhbCBjb250ZW50DQogIGZv ciB0aGUgbmV3IGZlYXR1cmVzIHRoYXQgTWlyYWdlT1MgYnJpbmdzLCBhcyB3ZWxsIGFzIGEgdG91 ciBvZiB0aGUNCiAgZXhpc3RpbmcgY29tbXVuaXR5IGFuZCBjb21tZXJjaWFsIHVzZXJzIG9mIE1p cmFnZU9TLiBQbGVhc2UgcmVhY2ggb3V0DQogIGlmIHlvdeKAmWQgbGlrZSB0byB0ZWxsIHVzIGFi b3V0IHlvdXIgc3RvcnkuDQoNCg0KW3N0YXRpYyB3ZWJzaXRlIGhvc3RpbmddIDxodHRwczovL2dp dGh1Yi5jb20vcm9idXJpby91bmlwaT4NCg0KW3NlY3VyZSBTTVRQc3RhY2tdIDxodHRwczovL2dp dGh1Yi5jb20vbWlyYWdlL3B0dD4NCg0KW01hdHJpeF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJh Z2Uvb2NhbWwtbWF0cml4Pg0KDQpbT3BlblZQTiBzZXJ2ZXJzXSA8aHR0cHM6Ly9naXRodWIuY29t L3JvYnVyaW8vb3BlbnZwbj4NCg0KW1RMUyB0dW5uZWxzXSA8aHR0cHM6Ly9naXRodWIuY29tL3Jv YnVyaW8vdGxzdHVubmVsPg0KDQpbRE5TKFNFQykgc2VydmVyc10gPGh0dHBzOi8vZ2l0aHViLmNv bS9taXJhZ2Uvb2NhbWwtZG5zPg0KDQpbaHVuZHJlZHMgb2YgbGlicmFyaWVzXSA8aHR0cHM6Ly9n aXRodWIuY29tL21pcmFnZS8+DQoNCltEb2NrZXIgRGVza3RvcOKAmXMgVlBOS2l0XQ0KPGh0dHBz Oi8vd3d3LmRvY2tlci5jb20vYmxvZy9ob3ctZG9ja2VyLWRlc2t0b3AtbmV0d29ya2luZy13b3Jr cy11bmRlci10aGUtaG9vZC8+DQoNCltDaXRyaXggSHlwZXJ2aXNvcl0NCjxodHRwczovL3d3dy5j aXRyaXguY29tL2ZyLWZyL3Byb2R1Y3RzL2NpdHJpeC1oeXBlcnZpc29yLz4NCg0KW05pdHJva2V5 XSA8aHR0cHM6Ly93d3cubml0cm9rZXkuY29tL3Byb2R1Y3RzL25ldGhzbT4NCg0KW1JvYnVyXSA8 aHR0cHM6Ly9yb2J1ci5pby8+DQoNCltUYXJpZGVzXSA8aHR0cHM6Ly90YXJpZGVzLmNvbS8+DQoN CltUZXpvc10gPGh0dHBzOi8vdGV6b3MuY29tLz4NCg0KW0h5cGVyXSA8aHR0cHM6Ly9oeXBlci5h Zy8+DQoNCkluc3RhbGwgTWlyYWdlT1MgNA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGVhc2llc3Qgd2F5IHRvIGluc3RhbGwg TWlyYWdlT1MgNCBpcyBieSB1c2luZyB0aGUgb3BhbSB2ZXJzaW9uIDIuMQ0KICBhbmQgYG9jYW1s Pj00LjEyLjFgLiBGb2xsb3cgdGhlIFtpbnN0YWxsYXRpb24gZ3VpZGVdIGZvciBtb3JlIGRldGFp bHMuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gdXBkYXRlDQogIOKUgiAkIG9w YW0gaW5zdGFsbCAnbWlyYWdlPjQnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIC9Ob3RlLzogaWYg eW91IHVwZ3JhZGUgZnJvbSBNaXJhZ2VPUyAzIHlvdSB3aWxsIG5lZWQgdG8gbWFudWFsbHkgY2xl YW4NCiAgdGhlIHByZXZpb3VzIGdlbmVyYXRlZCBmaWxlcyAob3IgY2FsbCBgbWlyYWdlIGNsZWFu JyBiZWZvcmUNCiAgdXBncmFkaW5nKS4gWW91IHdvdWxkIGFsc28gd2FudCB0byByZWFkIFt0aGUg ZnVsbCBsaXN0IG9mIEFQSQ0KICBjaGFuZ2VzXS4gIFlvdSBjYW4gc2VlIHVuaWtlcm5lbCBleGFt cGxlcyBpbiBbbWlyYWdlL21pcmFnZS1za2VsZXRvbl0sDQogIFtyb2J1cmlvL3VuaWtlcm5lbHNd IG9yIFt0YXJpZGVzL3VuaWtlcm5lbHNdLg0KDQoNCltpbnN0YWxsYXRpb24gZ3VpZGVdIDxodHRw czovL21pcmFnZS5pby9kb2NzL2luc3RhbGw+DQoNClt0aGUgZnVsbCBsaXN0IG9mIEFQSSBjaGFu Z2VzXSA8aHR0cHM6Ly9taXJhZ2UuaW8vZG9jcy9icmVha2luZy1jaGFuZ2VzPg0KDQpbbWlyYWdl L21pcmFnZS1za2VsZXRvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLXNrZWxl dG9uPg0KDQpbcm9idXJpby91bmlrZXJuZWxzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyaW8v dW5pa2VybmVscz4NCg0KW3RhcmlkZXMvdW5pa2VybmVsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS90 YXJpZGVzL3VuaWtlcm5lbHM+DQoNCg0KQWJvdXQgTWlyYWdlT1MNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE1pcmFnZU9TIGlzIGEgbGlicmFyeSBvcGVy YXRpbmcgc3lzdGVtIHRoYXQgY29uc3RydWN0cyB1bmlrZXJuZWxzIGZvcg0KICBzZWN1cmUsIGhp Z2gtcGVyZm9ybWFuY2UsIGxvdy1lbmVyZ3kgZm9vdHByaW50IGFwcGxpY2F0aW9ucyBhY3Jvc3MN CiAgdmFyaW91cyBoeXBlcnZpc29yIGFuZCBlbWJlZGRlZCBwbGF0Zm9ybXMuIEl0IGlzIGF2YWls YWJsZSBhcyBhbg0KICBvcGVuLXNvdXJjZSBwcm9qZWN0IGNyZWF0ZWQgYW5kIG1haW50YWluZWQg YnkgdGhlIFtNaXJhZ2VPUyBDb3JlDQogIFRlYW1dLiBBIHVuaWtlcm5lbCBjYW4gYmUgY3VzdG9t aXNlZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGFyY2hpdGVjdHVyZQ0KICBieSBwaWNraW5nIHRoZSBy ZWxldmFudCBNaXJhZ2VPUyBsaWJyYXJpZXMgYW5kIGNvbXBpbGluZyB0aGVtIGludG8gYQ0KICBz dGFuZGFsb25lIG9wZXJhdGluZyBzeXN0ZW0sIHdoaWNoIGNvbnRhaW5zIHN0cmljdGx5IHRoZSBm dW5jdGlvbmFsaXR5DQogIG5lY2Vzc2FyeSBmb3IgdGhlIHRhcmdldC4gVGhpcyBtaW5pbWlzZXMg dGhlIHVuaWtlcm5lbOKAmXMgZm9vdHByaW50LA0KICBpbmNyZWFzaW5nIHRoZSBzZWN1cml0eSBv ZiB0aGUgZGVwbG95ZWQgb3BlcmF0aW5nIHN5c3RlbS4NCg0KICBUaGUgTWlyYWdlT1MgYXJjaGl0 ZWN0dXJlIGNhbiBiZSBkaXZpZGVkIGludG8gb3BlcmF0aW5nIHN5c3RlbQ0KICBsaWJyYXJpZXMs IHR5cGVkIHNpZ25hdHVyZXMsIGFuZCBhIG1ldGFwcm9ncmFtbWluZyBjb21waWxlci4gVGhlDQog IG9wZXJhdGluZyBzeXN0ZW0gbGlicmFyaWVzIGltcGxlbWVudCB2YXJpb3VzIGZ1bmN0aW9uYWxp dGllcywgcmFuZ2luZw0KICBmcm9tIGxvdy1sZXZlbCBuZXR3b3JrIGNhcmQgZHJpdmVycywgdG8g ZnVsbCByZWltcGxlbWVudGF0aW9ucyBvZiB0aGUNCiAgVExTIHByb3RvY29sLCBhcyB3ZWxsIGFz IHRoZSBHaXQgcHJvdG9jb2wgdG8gc3RvcmUgdmVyc2lvbmVkIGRhdGEuIEENCiAgc2V0IG9mIHR5 cGVkIHNpZ25hdHVyZXMgZW5zdXJlcyB0aGF0IHRoZSBPUyBsaWJyYXJpZXMgYXJlIGNvbnNpc3Rl bnQNCiAgYW5kIHdvcmsgd2VsbCBpbiBjb25qdW5jdGlvbiB3aXRoIGVhY2ggb3RoZXIuIE1vc3Qg aW1wb3J0YW50bHksDQogIE1pcmFnZU9TIGlzIGFsc28gYSBtZXRhcHJvZ3JhbW1pbmcgY29tcGls ZXIgdGhhdCBjYW4gaW5wdXQgT0NhbWwNCiAgc291cmNlIGNvZGUgYWxvbmcgd2l0aCBpdHMgZGVw ZW5kZW5jaWVzLCBhbmQgYSBkZXBsb3ltZW50IHRhcmdldA0KICBkZXNjcmlwdGlvbiBpbiBvcmRl ciB0byBnZW5lcmF0ZSBhbiBleGVjdXRhYmxlIHVuaWtlcm5lbCwgaS5lLiwgYQ0KICBzcGVjaWFs aXNlZCBiaW5hcnkgYXJ0ZWZhY3QgY29udGFpbmluZyBvbmx5IHRoZSBjb2RlIG5lZWRlZCB0byBy dW4gb24NCiAgdGhlIHRhcmdldCBwbGF0Zm9ybS4gT3ZlcmFsbCwgTWlyYWdlT1MgZm9jdXNlcyBv biBwcm92aWRpbmcgYSBzbWFsbCwNCiAgd2VsbC1kZWZpbmVkLCB0eXBlZCBpbnRlcmZhY2Ugd2l0 aCB0aGUgc3lzdGVtIGNvbXBvbmVudHMgb2YgdGhlIHRhcmdldA0KICBhcmNoaXRlY3R1cmUuDQoN CiAgUmVhZCB0aGUgZnVsbCBhbm5vdW5jZW1lbnQgb24gW21pcmFnZS5pbydzIGJsb2ddLg0KDQoN CltNaXJhZ2VPUyBDb3JlIFRlYW1dIDxodHRwczovL2dpdGh1Yi5jb20vb3Jncy9taXJhZ2UvdGVh bXMvY29yZS9tZW1iZXJzPg0KDQpbbWlyYWdlLmlvJ3MgYmxvZ10gPGh0dHBzOi8vbWlyYWdlLmlv L2Jsb2cvYW5ub3VuY2luZy1taXJhZ2UtNDA+DQoNCg0KQW5pbCBNYWRoYXZhcGVkZHkgdGhlbiBh ZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRm9yIHRob3NlIGN1cmlvdXMg YWJvdXQgd2hhdCBzb21lIG9mIHRoZSBNaXJhZ2VPUyBsaWJyYXJpZXMgX2FyZV8sDQogIHRoZXJl IGlzIGEgcmF3IFlhbWwgbGlzdCBvdmVyIGF0IFttaXJhZ2UvbWlyYWdlLXJlcG9zaXRvcmllc10g bGlzdGluZw0KICBtb3N0IG9mIHRoZW0uICBDb252ZXJzaW9uIG9mIHRoaXMgWWFtbCB0byBIVE1M IGZvciB0aGUgbWFpbiBtaXJhZ2UuaW8NCiAgd2Vic2l0ZSB3b3VsZCBiZSBhIHdlbGNvbWUgY29u dHJpYnV0aW9uISA6c2xpZ2h0X3NtaWxlOg0KDQoNClttaXJhZ2UvbWlyYWdlLXJlcG9zaXRvcmll c10NCjxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1yZXBvc2l0b3JpZXMvYmxvYi9t YWluL3JlcG9zLnltbD4NCg0KDQpPQ2FtbCA0LjE0LjAgaXMgcmVsZWFzZWQNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNC0x NC0wLWlzLXJlbGVhc2VkLzk2MDAvMT4NCg0KDQpvY3RhY2hyb24gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgT0NhbWwgdGVhbSBoYXMgdGhlIHBsZWFzdXJlIG9mIGNlbGVicmF0aW5nIHRoZSBiaXJ0aGRh eSBvZg0KICBBbGV4YW5kZXIgR3JvdGhlbmRpZWNrIGJ5IGFubm91bmNpbmcgdGhlIHJlbGVhc2Ug b2YgT0NhbWwgdmVyc2lvbg0KICA0LjE0LjAuDQoNCiAgU29tZSBvZiB0aGUgaGlnaGxpZ2h0cyBp biB0aGUgNC4xNC4wIHJlbGVhc2UgYXJlOg0KDQogIOKAoiBJbnRlZ3JhdGVkIHN1cHBvcnQgZm9y ICJnbyB0byBkZWZpbml0aW9ucyIgaW4gTWVybGluLg0KICDigKIgU3RhbmRhcmQgbGlicmFyeTog bmV3IG1vZHVsZXMgYEluX2NoYW5uZWwnIGFuZCBgT3V0X2NoYW5uZWwnLCBtYW55DQogICAgbmV3 IGZ1bmN0aW9ucyBpbiBTZXEgbW9kdWxlLCBVVEYgZGVjb2RpbmcgYW5kIHZhbGlkYXRpb24gc3Vw cG9ydCBmb3INCiAgICBzdHJpbmdzIGFuZCBieXRlcy4NCiAg4oCiIFJ1bnRpbWUgb3B0aW1pc2F0 aW9uOiBHQyBwcmVmZXRjaGluZy4gQmVuY2htYXJrcyBzaG93IGEgc3BlZWR1cCBvZg0KICAgIGFy b3VuZCAyMCUgaW4gR0MtaGVhdnkgcHJvZ3JhbXMuDQogIOKAoiBJbXByb3ZlZCBlcnJvciBtZXNz YWdlcyBpbiBwYXJ0aWN1bGFyIGZvciBtb2R1bGUtbGV2ZWwgZXJyb3IuDQogIOKAoiBEZXByZWNh dGVkIGZ1bmN0aW9ucyBhbmQgbW9kdWxlcyBpbiBwcmVwYXJhdGlvbiBmb3IgT0NhbWwgNS4gIElu DQogICAgcGFydGljdWxhciwgdGhlIFN0cmVhbSBhbmQgR2VubGV4IG1vZHVsZXMgYXJlIG5vdyBk ZXByZWNhdGVkLg0KICDigKIgVHlwZSB2YXJpYWJsZXMgY2FuIGJlIGV4cGxpY2l0bHkgaW50cm9k dWNlZCBpbiB2YWx1ZSBhbmQgdmFyaWFudA0KICAgIGNvbnN0cnVjdG9yIGRlY2xhcmF0aW9ucy4g Rm9yIGluc3RhbmNlLA0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiB2YWwgZm9sZDogKCdh Y2MgLT4gJ2VsdCAtPiAnYWNjKSAtPiAnYWNjIC0+ICdlbHQgbGlzdCAtPiAnYWNjDQogICAg4pSC IHR5cGUgc2hvd2FibGUgPSBTaG93OiAnYSAqICgnYSAtPiBzdHJpbmcpIC0+IHNob3dhYmxlDQog ICAg4pSU4pSA4pSA4pSA4pSADQogICAgY2FuIG5vdyBiZSB3cml0dGVuIGFzDQogICAg4pSM4pSA 4pSA4pSA4pSADQogICAg4pSCIHZhbCBmb2xkOiAnYWNjICdlbHQuICgnYWNjIC0+ICdlbHQgLT4g J2FjYykgLT4gJ2FjYyAtPiAnZWx0IGxpc3QgLT4gJ2FjYw0KICAgIOKUgiB0eXBlIHNob3dhYmxl ID0gU2hvdzogJ2EuICdhICogKCdhIC0+IHN0cmluZykgLT4gc2hvd2FibGUNCiAgICDilJTilIDi lIDilIDilIANCiAg4oCiIFRhaWwtY2FsbCB3aXRoIHVwIHRvIDY0IGFyZ3VtZW50cyBhcmUgbm93 IGd1YXJhbnRlZWQgdG8gYmUgb3B0aW1pemVkDQogICAgZm9yIGFsbCBhcmNoaXRlY3R1cmVzLg0K ICDigKIgRXhwZXJpbWVudGFsIHRhaWwgbW9kdWxvIGNvbnMgKFRNQykgdHJhbnNmb3JtYXRpb24N Cg0KICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBjaGFuZ2Vs b2cNCiAgYmVsb3cuICgvZWRpdG9y4oCZcyBub3RlOiBwbGVhc2UgZm9sbG93IHRoZSBhcmNoaXZl IGxpbmsgZm9yIHRoZSBmdWxsDQogIGNoYW5nZWxvZy8pDQoNCiAgVGhvc2UgcmVsZWFzZXMgYXJl IGF2YWlsYWJsZSBhcyBPUEFNIHN3aXRjaGVzLCBhbmQgYXMgYSBzb3VyY2UNCiAgZG93bmxvYWQg aGVyZToNCg0KICDigKIgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzQu MTQuMC50YXIuZ3o+DQogIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29j YW1sLTQuMTQvb2NhbWwtNC4xNC4wLnRhci5nej4NCg0KDQpvY2FtbC1pbi1weXRob24uMC4xLjA6 IEVmZm9ydGxlc3MgUHl0aG9uIGJpbmRpbmdzIGZvciBPQ2FtbCBtb2R1bGVzDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1vY2FtbC1pbi1weXRob24tMC0xLTAtZWZmb3J0bGVzcy1weXRob24tYmlu ZGluZ3MtZm9yLW9jYW1sLW1vZHVsZXMvOTYwMy8xPg0KDQoNClRoaWVycnkgTWFydGluZXogYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIGhhcHB5IHRvIGFubm91bmNl IHRoZSBmaXJzdCByZWxlYXNlIG9mIGBvY2FtbC1pbi1weXRob24nOiB0aGlzIGlzDQogIGEgUHl0 aG9uIHBhY2thZ2UgdGhhdCBleHBvc2VzIGFsbCBPQ2FtbCBtb2R1bGVzIGFzIFB5dGhvbiBsaWJy YXJpZXMsDQogIGdlbmVyYXRpbmcgYmluZGluZ3Mgb24gdGhlIGZseS4gVGhpcyBjYW4gYmUgc2Vl biBhcyBhIGR1YWwgb2YNCiAgW2BweW1sX2JpbmRnZW4nXTogYHB5bWxfYmluZGdlbicgYmluZHMg UHl0aG9uIGxpYnJhcmllcyBpbiBPQ2FtbCwNCiAgd2hpbGUgYG9jYW1sLWluLXB5dGhvbicgYmlu ZHMgT0NhbWwgbW9kdWxlcyBpbiBQeXRob24uDQoNCiAgSXQgaXMgYXZhaWxhYmxlIGZyb20gW0dp dEh1Yl0gb3IgKnZpYSogYG9wYW0nOiBgb3BhbSBpbnN0YWxsDQogIG9jYW1sLWluLXB5dGhvbicN Cg0KICBSZXF1aXJlbWVudHM6IGBPQ2FtbCcgPj0gNC4xMywgYFB5dGhvbicgPj0gMy43Lg0KDQog IE9uY2UgaW5zdGFsbGVkICp2aWEqIGBvcGFtJywgdGhlIHBhY2thZ2Ugc2hvdWxkIGJlIHJlZ2lz dGVyZWQgaW4gdGhlDQogIFB5dGhvbiBlbnZpcm9ubWVudDoNCg0KICDigKIgZWl0aGVyIGJ5IHJl Z2lzdGVyaW5nIHRoZSBwYWNrYWdlIHdpdGggYHBpcCcgdXNpbmcgdGhlIGZvbGxvd2luZw0KICAg IGNvbW1hbmQgKHJlcXVpcmVzIFB5dGhvbiA+PTMuOCk6DQogICAg4pSM4pSA4pSA4pSA4pSADQog ICAg4pSCIHBpcCBpbnN0YWxsIC0tZWRpdGFibGUgImBvcGFtIHZhciBvY2FtbC1pbi1weXRob246 bGliYCINCiAgICDilJTilIDilIDilIDilIANCiAg4oCiIG9yIGJ5IGFkZGluZyB0aGUgZm9sbG93 aW5nIGRlZmluaXRpb24gdG8gdGhlIGVudmlyb25tZW50Og0KICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgIOKUgiBleHBvcnQgUFlUSE9OUEFUSD0iYG9wYW0gdmFyIHNoYXJlYC9weXRob24vOiRQWVRI T05QQVRIIg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZW4sIHdlIGNhbiBgaW1wb3J0IG9j YW1sJyBpbiBQeXRob24gYW5kIHVzZSBPQ2FtbCBtb2R1bGVzOg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIFB5dGhvbiAzLjEwLjAgKGRlZmF1bHQsIE5vdiAxMCAyMDIxLCAxOToxNjoxNCkgW0dD QyA3LjUuMF0gb24gbGludXgNCiAg4pSCIFR5cGUgImhlbHAiLCAiY29weXJpZ2h0IiwgImNyZWRp dHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCiAg4pSCID4+PiBpbXBvcnQg b2NhbWwNCiAg4pSCID4+PiBwcmludChvY2FtbC5MaXN0Lm1hcCgobGFtYmRhIHggOiB4ICsgMSks IFsxLCAyLCAzXSkpDQogIOKUgiBbMjszOzRdDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFdlIGNh biBmb3IgaW5zdGFuY2UgY29tcGlsZSBhbiBPQ2FtbCBtb2R1bGUgb24gdGhlIGZseSBmcm9tIFB5 dGhvbi4NCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiA+Pj4gbSA9IG9jYW1sLmNvbXBpbGUoJ2xl dCBoZWxsbyB4ID0gUHJpbnRmLnByaW50ZiAiSGVsbG8sICVzIVxuJSEiIHgnKQ0KICDilIIgPj4+ IG0uaGVsbG8oJ3dvcmxkJykNCiAg4pSCIEhlbGxvLCB3b3JsZCENCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgQW5kIHdlIGNhbiByZXF1aXJlIGFuZCB1c2UgcGFja2FnZXMgL3ZpYS8gYGZpbmRsaWIn Lg0KICDilIzilIDilIDilIDilIANCiAg4pSCID4+PiBvY2FtbC5yZXF1aXJlKCJwYXJtYXAiKQ0K ICDilIIgPj4+IGZyb20gb2NhbWwgaW1wb3J0IFBhcm1hcA0KICDilIIgPj4+IHByaW50KFBhcm1h cC5wYXJtYXAoDQogIOKUgiAuLi4gICAobGFtYmRhIHggOiB4ICsgMSksIFBhcm1hcC5BKFsxLCAy LCAzXSksIG5jb3Jlcz0yKSkNCiAg4pSCIFsyOzM7NF0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg RGV0YWlscyBhYm91dCB0aGUgY29udmVyc2lvbnMgYXJlIGdpdmVuIGluIFtgUkVBRE1FLm1kJ10u DQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpbYHB5bWxfYmluZGdlbiddDQo8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1weW1sLWJpbmRnZW4tYS1jbGktYXBwLXRvLWdlbmVyYXRlLXB5 dGhvbi1iaW5kaW5ncy1kaXJlY3RseS1mcm9tLW9jYW1sLXZhbHVlLXNwZWNpZmljYXRpb25zLzg3 ODY+DQoNCltHaXRIdWJdIDxodHRwczovL2dpdGh1Yi5jb20vdGhpZXJyeS1tYXJ0aW5lei9vY2Ft bC1pbi1weXRob24+DQoNCltgUkVBRE1FLm1kJ10NCjxodHRwczovL2dpdGh1Yi5jb20vdGhpZXJy eS1tYXJ0aW5lei9vY2FtbC1pbi1weXRob24vYmxvYi9tYWluL1JFQURNRS5tZD4NCg0KDQpPbGQg Q1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBD V04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlv dSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9m IHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2 ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0Fs YW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0 QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3Rz LmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 22 to 29, 2022.

    pyml_bindgen: a CLI app to generate Python bindings directly f= rom OCaml value specifications

    Archive:

    Ryan Moore announced

    New releases

    Version 0.3.0 and 0.3.1 are now available on GitHub. 0.3.0 has been merged into opam, and a PR for 0.3.1 has been opened. The change log has more details about the changes.

    Binding tuples

    You can now bind tuples directly. Here's a Python function that takes two = lists of points (where each "point" is a tuple like (x, y)) and adds them together

    def add(points1, points2):
        return [(x1 + y1, x2 + y2) for (x1, x2), (y1, y2) in zip(points1,=
     points2)]
    

    And you could bind it using tuples from the OCaml side as well.

    val add : points1:(int * int) list -> points2:(int * int) list -> unit -> (int * int) l=
    ist
    

    Note there are some restrictions regarding tuples, which you can read about here, here, or here.

    Attributes

    You can use attributes on value specifications. Currently the only one sup= ported is py_fun_name, which allows you to decouple the Python method name and the generated OCaml function name.

    As an example, take the following Python function, which adds to "things".

    def add(x, y):
        return x + y
    

    You could bind multiple OCaml functions to this single function now.

    val add_int : x:int -> y<=
    /span>:int -> unit -> int
    [@@py_fun_name add]
    
    val add_float : x:float -> y:float -> unit=
     -> float
    [@@py_fun_name add]
    
    val add_string : x<=
    /span>:string -> y:string -> u=
    nit -> string
    [@@py_fun_name add]
    
    Python magic methods

    This is also nice for binding Python magic methods. For example, you don't have to use __init__ as the name of the OCaml function you use to make ins= tances of a Python class. You can bind it to a more natural name like create or make.

    val create : name:string -> age:int -> unit -> t
    [@@py_fun_name __init__]
    

    Using Pytypes.pyobject directly

    Sometimes you may not want to bother converting Python types to normal OCam= l types at all. You can do that now in value specifications by using the Pytypes.pyobject and P= y.Object.t types directly.

    Fewer dependencies

    re is now used instead of re2, which drops the nu= mber of dependencies that need to be installed by about half. Additionally, core, core_bench, and bisect_= ppx don't need to be installed if you want to install pyml_bin= dgen directly from the git repository, which greatly cuts the required dependenc= ies in this case.

    Thanks again to UnixJunkie for spurring many of these updates!

    Tarides is hiring!

    Thomas Gazagnaire announced

    Following the recent announcement about Tarides (joining forces with OCaml Labs and Segfault System), we are now looking to expand our team with experienced software engineers, compassionate team leads and experts i= n software consulting services. Our ambition is to bring OCaml to a vast set of new developers and industries. = We want to make developers more productive by spending less time on fixing bugs and more on writing new features. And = we want the software industry to build more robust and performant systems that can last for decades.

    We are looking for:

    • Experienced Software Engineer(s) to take part in the development of Irmin. You w= ill be part of the team that designs, builds and ships Irmin libraries and = applications to our community and customers.
    • Team Lead(s)= who cares about motivating their team members, supporting their growth= and development and successfully delivering the team's objectives on time.=
    • A Head= of Consulting Services to diversify our technical teams and commercial= services portfolio. You'll be the first hire for this brand new department= and will have the opportunity to help us build our services structure from= scratch, including our strategy, processes, tools, and team.

    We are always looking for great OCaml enthusiasts to join our team, so even= if these job descriptions do not fit your profile precisely, you are welcome to send us a spontaneous application!

    For Diversity and the OCaml Community: Outreachy Summer 2022

    Deep in this thread, Aya announced

    @pitag and I have resubmitted the PPX derivers project for this Summer 2022= round: Expand OCaml's library of standard derivers! This is the same project I was the intern for this p= ast Winter 2022 round, where the goal is to build up a stand= ard derivers library, like ppx_deriving, using the updated ppxlib API.

    I'm excited to be supporting @pitag with mentoring, and for the opportunity= to stay involved now that my internship has ended :smiley:

    Caqti 1.8.0 and related news

    "Petter A. Urkedal announced

    I am happy to announce the second release of Caqti this year. The reason for the quick succession is partly an adjustment to the new A= PI for request construction and partly that matchable er= ror conditions did not make it into the previous release. You can see the full release notes below.

    I would also like to thank OCaml Software = Foundation for sponsoring my efforts on the Caqti project this year, also including most of the work that went into the previ= ous release.

    One feature = in progress is a new driver based on the pure-OCaml pgx which should make it = possible, with some additional changes to the way drivers are loaded, to target MirageOS. I am note sure if this can be done = in a minor release or will require a Caqti 2 branch.

    Release Notes

    New features:

    • A matchable representation of common causes of errors on the database side is now available, with limitations. It focuses on conditions which seem most likely useful to handle. At the moment we lack extended error codes from SQLite3 needed to make the cause fully precise.
    • Expose the underlying error details from database client libraries. This is meant to be use as a last resort, and requires directly linking with the relevant drivers.
    • A second set of request construction operators ->., ->?, ->!, and ->* were introduced after experience with converting existi= ng code. Given the parameter and result type they return a function which constructs a request directly from a query string. Avoiding the need to compose with @:- simplifies local opens and usage with L= ist.map etc.
    • Environment variables are now expanded in the debug log when using the new request constructors introduced in 1.7.0.
    • A new ?tweaks_version connection parameter has been added = to control when the client is ready to adapt to changes in database session parameters or other adjustments of the interaction with specific database systems. [More details available in the documentation.]
    • Enable foreign key constraint checks for SQLite3 starting at tweaks version 1.7.

    Fixes:

    • Fixed debug logging to pass the correct driver info to the query callback instead of a dummy driver info which would cause a failure if unsupported.

    Deprecations:

    • The --> operator was renamed to -->!, w= ith a deprecated alias, for consistency with the new ->! operator.
    • The old convenience interface for creating requests has been deprecated in favour of the new infix operators and the new query template parser.
    • Documented-only deprecations of Caqti_sql_io, Caqti_= lwt_sql_io, and Caqti_async_sql_io have been annotated.

    First release of prbnmcn-dagger

    Igarnier announced

    I'm proud to announce the release of version 0.0.2 of prbnmcn-dagger.

    This version adds Sequential Monte-Carlo, a.k.a. particle filters-based inference to the library.

    Here's the full changelog:

    • Dependency: prbnmcn-stats.0.0.3 -> prbnmcn-stats.= 0.0.4
    • Add beta distribution to Gsl samplers
    • Refactor Cps monad
    • Add SMC inference
    • Simplify handler type, modularize effect definitions away from Cps_mona= d
    • Fix typo: bernouilli -> bernoulli (report by @nilsbecker)

    I also wrote the following article: Applying Sequential Monte-Carlo to time series forecasting It contains some use cases for the library, I hope some find it fun :)

    To conclude this post, and as a partial answer to @gasche 's question in an older thread, I believe that unlike some other inference techniques, single-shot continuations are = enough to implement SMC. Without getting into the details, the implementation is very reminiscent of that of lightwe= ight threading libraries. I look forward to experiment with a fibre-based implementation!

    MirageOS 4.0

    Thomas Gazagnaire announced

    On behalf of the MirageOS team, I am delighted to announce the release o= f MirageOS 4.0.0! I'd like to send special thanks to @dinosaure and @Lortex who drove that release forward for= multiple years.

    Since the first release of 2013, MirageOS has made steady progress toward d= eploying a self-managed internet infrastructure. The project=E2=80=99s initial aim was to self-host as many = services as possible aimed at empowering internet users to securely deploy infrastructure to own= their data and take back control of their privacy. MirageOS can securely deploy static website hosting with =E2=80=9CLet=E2=80=99s Encrypt=E2= =80=9D certificate provisioning and a se= cure SMTPstack with security extensions. MirageOS can also deploy decentralised communication infrastructure like Matrix, OpenVPN servers, and TLS tunnels to ensure data privacy or DNS(= SEC) servers for better authentication.

    The protocol ecosystem now contains = hundreds of libraries and services millions of daily users. Over these years, major commercial users have join= ed the projects. They rely on MirageOS libraries to keep their products secure. For instance, the MirageOS network= ing code powers Docker Desktop=E2=80=99s VPNKit, which serves the traffic of millions of containers daily. Citrix Hypervisor uses MirageOS to interact with Xen, the hypervisor that powers most of today=E2=80=99s public cloud. Nitrokey is developing a new hardware security module based on MirageOS. Robur develops a unikernel orchestration system for fleets of MirageOS unikernels. Tarides uses MirageOS to improve the Tezos blockchain, and Hyper uses MirageOS to build sensor analytics and an automation platform for sustainable agriculture.

    In the coming weeks, our blog will feature in-depth technical content for t= he new features that MirageOS brings, as well as a tour of the existing community and commercial users of MirageOS. = Please reach out if you=E2=80=99d like to tell us about your story.

    Install MirageOS 4

    The easiest way to install MirageOS 4 is by using the opam version 2.1 and = `ocaml>=3D4.12.1`. Follow the installation guide for more details.

    $ opam update
    $ opam install 'mirage>4'
    

    Note: if you upgrade from MirageOS 3 you will need to manually clean= the previous generated files (or call mirage clean before upgrading). You would also want to read the full list of API changes. You can see unikernel examples in mirage/mirage-skeleto= n, roburio/unikernels or tarides/unikernels.

    About MirageOS

    MirageOS is a library operating system that constructs unikernels for secur= e, high-performance, low-energy footprint applications across various hypervisor and embedded platforms. It is availa= ble as an open-source project created and maintained by the MirageOS Core Team. A unikernel can be customised based on the target architecture by picking the relevant MirageOS libraries and compiling them = into a standalone operating system, which contains strictly the functionality necessary for the target. This minimise= s the unikernel=E2=80=99s footprint, increasing the security of the deployed operating system.

    The MirageOS architecture can be divided into operating system libraries, t= yped signatures, and a metaprogramming compiler. The operating system libraries implement various functionalities,= ranging from low-level network card drivers, to full reimplementations of the TLS p= rotocol, as well as the Git protocol to store versioned data. A set of typed signatures ensures that the OS librari= es are consistent and work well in conjunction with each other. Most importantly, MirageOS is= also a metaprogramming compiler that can input OCaml source code along with its dependencies, and a deployment target description in order to generate an executable unikernel, i.e., a specialis= ed binary artefact containing only the code needed to run on the target platform. Overall, MirageOS focuses on pro= viding a small, well-defined, typed interface with the system components of the target architecture.

    Read the full announcement on mirage.io's blog.

    Anil Madhavapeddy then added

    For those curious about what some of the MirageOS libraries are, there is a raw Yaml list over at mirage/mirage-repositories listing most of them. Conversion of this Yaml to HTML for the main mirage.io website would be a w= elcome contribution! :slight_smile:

    OCaml 4.14.0 is released

    octachron announced

    The OCaml team has the pleasure of celebrating the birthday of Alexander Gr= othendieck by announcing the release of OCaml version 4.14.0.

    Some of the highlights in the 4.14.0 release are:

    • Integrated support for "go to definitions" in Merlin.
    • Standard library: new modules In_channel and Out_cha= nnel, many new functions in Seq module, UTF decoding and validation support for strings and bytes.
    • Runtime optimisation: GC prefetching. Benchmarks show a speedup of arou= nd 20% in GC-heavy programs.
    • Improved error messages in particular for module-level error.
    • Deprecated functions and modules in preparation for OCaml 5. In particular, the Stream and Genlex modules are now deprecated.
    • Type variables can be explicitly introduced in value and variant constructor declarations. For instance,

      val fold: ('acc -> 'e=
      lt -> 'acc) -> 'acc -> 'elt list -> 'acc
      type showable =3D Show: 'a * ('a -> string) -> showable
      

      can now be written as

      val fold: 'acc 'elt. ('a=
      cc -> 'elt -> 'acc) -> 'acc -> 'elt list -> 'acc
      type showable =3D Show: 'a. 'a * ('a -> string) -> show=
      able
      
    • Tail-call with up to 64 arguments are now guaranteed to be optimized for all architectures.
    • Experimental tail modulo cons (TMC) transformation

    The full list of changes can be found in the changelog below. (editor=E2= =80=99s note: please follow the archive link for the full changelog)

    Those releases are available as OPAM switches, and as a source download her= e:

    ocaml-in-python.0.1.0: Effortless Python bindings for OCaml mo= dules

    Thierry Martinez announced

    I am happy to announce the first release of ocaml-in-python: t= his is a Python package that exposes all OCaml modules as Python libraries, generating bindings on the fly. This can be se= en as a dual of pym= l_bindgen: pyml_bindgen binds Python libraries in OCaml, while ocam= l-in-python binds OCaml modules in Python.

    It is available from GitHub or via opam: opam install ocaml-in-python

    Requirements: OCaml >=3D 4.13, Python >=3D = 3.7.

    Once installed via opam, the package should be register= ed in the Python environment:

    • either by registering the package with pip using the following= command (requires Python >=3D3.8):

      pip install --editable "`opam var ocaml-in-python:lib`"
      
    • or by adding the following definition to the environment:

      export =
      PYTHONPATH=3D"`opam var share`/python/:$PYTHONPATH"
      

    Then, we can import ocaml in Python and use OCaml modules:

    Python 3.10.0 (default, Nov 10 2021, 19:16:14=
    ) [GCC 7.5.0] on linux
    Type "help", "copyright", "credits" or  for more informat=
    ion.
    >>> import ocaml
    >>> print(ocaml.List.map((lambd=
    a x : x + 1), [1, 2, 3]))
    [2;3;4]
    

    We can for instance compile an OCaml module on the fly from Python.

    >>> =
    m =3D ocaml.compile('let hello x =3D Printf.printf "Hello, %s!\n%!" x')
    >>> m.hello('world')
    Hello, world!
    

    And we can require and use packages via findlib.

    >>> ocaml.require("parmap")
    >>> from ocaml import Parmap
    >>> print(Parmap.parmap(
    ...   (lambda x : x + 1), Parmap.A([=
    1, 2, 3]), ncores=3D2))
    [2;3;4]
    

    Details about the conversions are given in README.md.

    Happy hacking!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 22E82E002D for ; Tue, 5 Apr 2022 13:50:05 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=h/sm=UP=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: r+FIcn6IM/+G9PU0xXkTJmc6VZCbBouBIJ8qXZTPDQedejsRaaxR0HQo9cc9e0soDGJe4wOY6t Tg8f6k6fNS5OZtoXPva9prQDWYSrk9hEnkvhk8SMlMnlZIWlxjpMTvxym8w+nTcjXXWaPth2PO KyUkxLAvYPY8ePB8ByGEKbb3Wvtoe1IekXudtmf8xUFqZdDOLy0lnUFlC3uX2wmyPj20tmPdSy dG6iywG32IXAISQAZ1nFwwkuW5KKe98p970vjCyx8dfMwucfpDfz2JUECRJP7rk98xKF1OvoAa I2IAPvhjr0wRIzEgOaLnJ8Zz X-IPAS-Result: =?us-ascii?q?A0AAAwB9LExieyIeaIFaHQEBAQEJARIBBQUBghqBIVkuG?= =?us-ascii?q?QFkVysHCEQChFKJBogSiU+Geow2gREDTxABAwENLAEMBwECBAEBghKCdQIXB?= =?us-ascii?q?oRBAh4GAQUzEwECBAEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgQEARMBAQ8LC?= =?us-ascii?q?QYHCwYQDgU8ZGQEgUsEgXQLNA2CNQwZg3ABGAEICkAlIwMUAQYDAgQNARcBF?= =?us-ascii?q?AoXARIUBoJrgxYFCpInnAyBMYEBg08BAwMCDgEOCYQZgWUNAhSBGYYUWEuDB?= =?us-ascii?q?AmECAIIHxCBVUSBFYJ6boJBCwwLAQEBAQEXfgocAQEIEg8tgmSCZQSZQA4LM?= =?us-ascii?q?wEPZRUFAQcDCRYBAQQeNgUeCgsBChgBGQQOCQQBOgsJAgsBkiohjy+JJIJdk?= =?us-ascii?q?UR7NAeDTIE8BgyIJ4EgjHmIIoVDoSyBYiGWPSCJHIEQCYJDiCCMGxMfBoUCg?= =?us-ascii?q?U4qXm8eAwkHMxowQ4JpCUUBAwINAQICAwECAQIJAQECkg8tgjeBdTuCXYJvP?= =?us-ascii?q?zQBAQEBCSsCBgEKAQEDCYVjAQEFEwsBhWaBXVoBAQ?= IronPort-PHdr: A9a23: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 cMUCkcXNA== IronPort-Data: A9a23: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 28Rm/+//rSsuEZp IronPort-HdrOrdr: A9a23:sf97F6kWtcA24AOP4K3/EUHayrLpDfI73DAbv31ZSRFFG/Fw8P re/sjztCWE6wr5PUtK8+xoV5PsfZqiz+8R3WB8B9uftWvd1ldAXbsD0WKK+VSJJ8SUzI9gPM lbHJSWAeeAaWRHsQ== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,236,1643670000"; d="scan'208,217";a="10622050" X-MGA-submission: =?us-ascii?q?MDFkPYmhHo2h/8uZmGw3ymRu1wsGAfz8v/Jhzx?= =?us-ascii?q?wAellulQ5rLs2jBwSvedflaB0ME4lsGn3ozgavmDwKoRIYPtTDSp6RI8?= =?us-ascii?q?VFmCdBSwjB2sLMVw5sZ5nU09UI8lqZRxORM7JDDx8uMsT6XTdSmFUFVh?= =?us-ascii?q?YPsPOGqhW0YiPC6CiXiFcGhA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Apr 2022 13:50:04 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id DC334564DE4; Tue, 5 Apr 2022 13:50:01 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 05 Apr 2022 13:50:01 +0200 Message-ID: <87tub7wxzq.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 5 13:50:02 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.489244, queueID=675FD564DE7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMjkgdG8gQXByaWwNCjA1LCAyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnYw LjE1IHJlbGVhc2Ugb2YgSmFuZSBTdHJlZXQgcGFja2FnZXMNCkVtZWxsZVRWIFNob3cgLSAyMDIy DQpPcGVuIHNvdXJjZSBlZGl0b3IgZm9yIGlPUywgaVBhZE9TIGFuZCBtYWNPUw0KVGhlIG15c3Rl cmlvdXMgcG9pbnRlciBpbiB0aGUgcnVudGltZSBjbG9zdXJlIHJlcHJlc2VudGF0aW9uDQpPdGhl ciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KdjAuMTUgcmVsZWFzZSBvZiBKYW5lIFN0cmVldCBw YWNrYWdlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t djAtMTUtcmVsZWFzZS1vZi1qYW5lLXN0cmVldC1wYWNrYWdlcy85NjEyLzE+DQoNCg0KQXJzZW5p eSBBbGVrc2V5ZXYgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBh cmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgdjAuMTUgcmVsZWFzZSBvZiBKYW5lIFN0cmVldCBw YWNrYWdlcyENCg0KICBUaGlzIHJlbGVhc2UgY29tZXMgd2l0aCA0MSBuZXcgcGFja2FnZXMsIGFu ZCBhIGxhcmdlIG51bWJlciBvZiBmaXhlcw0KICBhbmQgZW5oYW5jZW1lbnRzLiBUaGUgZG9jdW1l bnRhdGlvbiBmb3IgdGhlIGluZGl2aWR1YWwgcGFja2FnZXMgd2lsbA0KICBzb29uIGJlIGF2YWls YWJsZSBvbiBbdjMub2NhbWwub3JnL3BhY2thZ2VzXSwgYWZ0ZXIgc29tZSB0ZWNobmljYWwNCiAg aXNzdWVzIGFyZSBmaXhlZC4NCg0KICBUaGUgcmVtYWluZGVyIG9mIHRoaXMgZS1tYWlsIGhpZ2hs aWdodHMgdGhlIG1haW4gY2hhbmdlcyBzaW5jZSB0aGUNCiAgdjAuMTQgcmVsZWFzZS4NCg0KDQpb djMub2NhbWwub3JnL3BhY2thZ2VzXSA8aHR0cHM6Ly92My5vY2FtbC5vcmcvcGFja2FnZXM+DQoN Ck5vdGFibGUgY2hhbmdlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNClJlLXN0cnVjdHVyaW5nIG9mIGBDb3JlJy4NCuKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0K DQogIFRoZSBtb3N0IG5vdGljZWFibGUgYnJlYWtpbmcgY2hhbmdlIGlzIHRoZSByZS1zdHJ1Y3R1 cmluZyBvZiBgQ29yZScuDQoNCiAgSW4gMC4xNCwgYENvcmUnIGlzIHNvbWV3aGF0IGJsb2F0ZWQg YW5kIGluY2x1ZGVzIG1hbnkgbW9kdWxlcyB0aGF0IGFyZQ0KICBiYXJlbHkgZXZlciB1c2VkLCBt YW55IG9mIHdoaWNoIGFyZSBVbml4LXNwZWNpZmljLiBJbiAwLjE1LCBtYW55IG9mDQogIHRob3Nl IG1vZHVsZXMgbW92ZWQgdG8gc2VwYXJhdGUgbGlicmFyaWVzLCBtb3N0IG9mIHRoZW0gdG8NCiAg cGFja2FnZX5jb3JlX3VuaXh+LCBhbmQgYGNvcmUnIGlzIG5vdyBtdWNoIHNtYWxsZXIgYW5kIG5v IGxvbmdlcg0KICBjb250YWlucyB1bml4LXNwZWNpZmljIGNvZGUuDQoNCiAgVGhlIG1hcHBpbmcg YmV0d2VlbiB0aGUgbmV3IGxpYnJhcmllcyBhbmQgdGhlIG9sZCBtb2R1bGVzIGNhbiBiZQ0KICBz dW1tYXJpemVkIGJ5IHRoZSBjb250ZW50cyBvZiBgQ29yZV9jb21wYXQnIGxpYnJhcnkgdjAuMTQ6 DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgQ29tbWFuZF91bml4ID0gQ29yZS5D b21tYW5kDQogIOKUgiBtb2R1bGUgRGF0ZV91bml4ID0gQ29yZS5EYXRlDQogIOKUgiBtb2R1bGUg RmlsZW5hbWVfdW5peCA9IENvcmUuRmlsZW5hbWUNCiAg4pSCIG1vZHVsZSBTaWduYWxfdW5peCA9 IENvcmUuU2lnbmFsDQogIOKUgiBtb2R1bGUgU3lzX3VuaXggPSBDb3JlLlN5cw0KICDilIIgbW9k dWxlIENvcmVfdGhyZWFkID0gQ29yZS5UaHJlYWQNCiAg4pSCIG1vZHVsZSBUaW1lX3VuaXggPSBD b3JlLlRpbWUNCiAg4pSCIG1vZHVsZSBUaW1lX25zX3VuaXggPSBDb3JlLlRpbWVfbnMNCiAg4pSC IG1vZHVsZSBDb3JlX3VuaXggPSBDb3JlLlVuaXgNCiAg4pSCIG1vZHVsZSBWZXJzaW9uX3V0aWwg PSBDb3JlLlZlcnNpb25fdXRpbA0KICDilIIgDQogIOKUgiBtb2R1bGUgSW50ZXJ2YWxfbGliID0g c3RydWN0DQogIOKUgiAgIG1vZHVsZSBJbnRlcnZhbCA9IENvcmUuSW50ZXJ2YWwNCiAg4pSCICAg bW9kdWxlIEludGVydmFsX2ludGYgPSBDb3JlLkludGVydmFsX2ludGYNCiAg4pSCIGVuZA0KICDi lIIgDQogIOKUgiBtb2R1bGUgVGltZV9pbnRlcmZhY2UgPSBDb3JlLlRpbWVfY29tbW9uDQogIOKU lOKUgOKUgOKUgOKUgA0KDQoNCkFzeW5jOiBgTW9uaXRvci50cnlfd2l0aCcNCuKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhA0KDQogIGBNb25pdG9yLnRyeV93aXRoJyBhbmQgcmVsYXRlZCBmdW5jdGlvbnMgY2hh bmdlZCB0aGUgZGVmYXVsdHMgZm9yDQogIHRoZWlyIGBydW4nIGFuZCBgcmVzdCcgcGFyYW1ldGVy cy4gIFRoZXkgdXNlZCB0byBkZWZhdWx0IHRvDQogIGB+fnJ1bjp+U2NoZWR1bGUgfnJlc3Q6fkxv Z34nLCBidXQgbm93IHRoZXkgZGVmYXVsdCB0byBgfn5ydW46fk5vdw0KICB+cmVzdDp+UmFpc2V+ Jy4NCg0KDQpNYW55IG90aGVyIGNoYW5nZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZXJlIGFyZSBtYW55IGNoYW5nZXMgYW5k IGFkZGl0aW9ucyBhY3Jvc3MgMTMwKyBleGlzdGluZyBwYWNrYWdlcywNCiAgYW5kIHVuZm9ydHVu YXRlbHkgd2UgZG9uJ3QgbWFpbnRhaW4gYSBjaGFuZ2Vsb2cgdG8gbGlzdCB0aGVtIGFsbC4gIFRo ZQ0KICBjb2RlIGZvciBhbGwgb2Ygb3VyIHBhY2thZ2VzIGlzIG9uIG91ciBbZ2l0aHViXSwgYW5k IGlmIHlvdSdyZQ0KICBpbnRlcmVzdGVkIGluIHRoZSBkZXRhaWxzIG9mIHdoYXQgY2hhbmdlZCBp biBhIHBhcnRpY3VsYXIgcGFja2FnZSwgeW91DQogIGNhbiBpbnNwZWN0IHRoZSBkaWZmIGJldHdl ZW4gYnJhbmNoZXMgdjAuMTQgYW5kIHYwLjE1Lg0KDQoNCltnaXRodWJdIDxodHRwczovL2dpdGh1 Yi5jb20vamFuZXN0cmVldD4NCg0KDQpOZXcgcGFja2FnZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFtgYWJzdHJhY3RfYWxnZWJyYSddOiBBIHNtYWxsIGxpYnJh cnkgZGVzY3JpYmluZyBhYnN0cmFjdCBhbGdlYnJhDQogIGNvbmNlcHRzDQoNCiAgQSBsaWJyYXJ5 IGRlc2NyaWJpbmcgYWJzdHJhY3QgYWxnZWJyYSBjb25jZXB0cy4gQ3VycmVudGx5LCBpdCBpbmNs dWRlcw0KICBDb21tdXRhdGl2ZV9ncm91cCBhbmQgVmVjdG9yX3NwYWNlLg0KDQogIFtgYXN5bmNf cnBjX3dlYnNvY2tldCddOiBMaWJyYXJ5IHRvIHNlcnZlIGFuZCBkaXNwYXRjaCBBc3luYyBSUENz IG92ZXINCiAgd2Vic29ja2V0cw0KDQogIExpYnJhcnkgdG8gc2VydmUgYW5kIGRpc3BhdGNoIEFz eW5jIFJQQ3Mgb3ZlciB3ZWJzb2NrZXRzLg0KDQogIFJwY193ZWJzb2NrZXQgbWFrZXMgaXQgZWFz eSB0byBzZXJ2ZSBhbmQgc2VuZCBBc3luYyBSUENzIHdpdGgNCiAgSFRUUCtXZWJzb2NrZXQgdW5k ZXJseWluZyB0aGUgdHJhbnNwb3J0LiBJdCBhbHNvIHByb3ZpZGVzIGEgbWVjaGFuaXNtDQogIHRv IHNoYXJlIHRoZSBSUEMgaW1wbGVtZW50YXRpb25zIGJldHdlZW4gYSB2YW5pbGxhIFRDUCBzZXJ2 ZXIgYW5kIGENCiAgSFRUUCBzZXJ2ZXIuDQoNCiAgT24gdGhlIHNlcnZlciBzaWRlLCB0aGUgbGli cmFyeSBkZXRlY3RzIHdoZW4gYSB3ZWJzb2NrZXQgY29ubmVjdGlvbiBpcw0KICBlc3RhYmxpc2hl ZCwgYW5kIHJvdXRlcyB0byBhbiBvcHRpb25hbGx5IHByb3ZpZGVkIHZhbmlsbGEgSFRUUCBoYW5k bGVyDQogIHdoZW4gbm9uLXdlYnNvY2tldCB0cmFmZmljIG9jY3Vycy4NCg0KICBbYGJpZ2RlY2lt YWwnXTogQXJiaXRyYXJ5LXByZWNpc2lvbiBkZWNpbWFsIGJhc2VkIG9uIFphcml0aA0KDQogIEEg aGlnaC1wcmVjaXNpb24gcmVwcmVzZW50YXRpb24gb2YgZGVjaW1hbCBudW1iZXJzIGFzIFttYW50 aXNzYSAqDQogIDEwXmV4cG9uZW50XSwgd2hlcmUgdGhlIG1hbnRpc3NhIGlzIGludGVybmFsbHkg YSBbQmlnaW50LnRdIGFuZCB0aGUNCiAgZXhwb25lbnQgaXMgYW4gW2ludF0uDQoNCiAgW2Bjb2h0 dHBfYXN5bmNfd2Vic29ja2V0J106IFdlYnNvY2tldCBsaWJyYXJ5IGZvciB1c2Ugd2l0aCBjb2h0 dHAgYW5kDQogIGFzeW5jDQoNCiAgV2Vic29ja2V0IGxpYnJhcnkgZm9yIHVzZSB3aXRoIGNvaHR0 cCBhbmQgYXN5bmMuDQoNCiAgQ29odHRwX2FzeW5jX3dlYnNvY2tldCBpcyBhIGZ1bGwtZmVhdHVy ZWQgc2VydmVyLXNpZGUgd2Vic29ja2V0DQogIGltcGxlbWVudGF0aW9uLCB1c2luZyBBc3luYyBh cyB0aGUgY29uY3VycmVuY3kgbGlicmFyeSwgYW5kIENvaHR0cCBmb3INCiAgSFRUUCBuZWdvdGlh dGlvbi4NCg0KICBJdCBpbXBsZW1lbnRzIGEgbGFyZ2UgcG9ydGlvbiBvZiBSRkM2NDQ1LiBUaGUg bGlicmFyeSBoYXMgYmVlbg0KICBoYXJkZW5lZCB3aXRoIG1hbnkgYXBwbGljYXRpb25zIHVzaW5n IGl0IGZvciBzZXZlcmFsIHllYXIsIGluDQogIGNvbmp1bmN0aW9uIHdpdGggYXN5bmMtanMgYW5k IGdvb2dsZS1jaHJvbWUuDQoNCiAgW2Bjb2h0dHBfc3RhdGljX2hhbmRsZXInXTogQSBsaWJyYXJ5 IGZvciBlYXNpbHkgY3JlYXRpbmcgYSBjb2h0dHANCiAgaGFuZGxlciBmb3Igc3RhdGljIGZpbGVz DQoNCiAgU2luZ2xlIHBhZ2UgaGFuZGxlcnMgYXJlIGhhbmRsZXJzIHRoYXQgc2VydmUgdXNlciBz cGVjaWZpZWQgSmF2YVNjcmlwdA0KICAgICBhbmQgY3NzIGZpbGVzIGFsb25nIHdpdGggYSBnZW5l cmF0ZWQgaW5kZXggcGFnZSB0aGF0IGxvYWRzIHRob3NlDQogICAgIGZpbGVzLg0KDQogIFtgY29y ZV9jb21wYXQnXTogQ29tcGF0aWJpbGl0eSBmb3IgY29yZSAwLjE0DQoNCiAgQ29tcGF0aWJpbGl0 eSB3cmFwcGVyIHRvIG1ha2UgaXQgcG9zc2libGUgdG8gaGF2ZSBjb2RlIGNvbXBhdGlibGUgd2l0 aA0KICBib3RoIENvcmUgMC4xNCBhbmQgMC4xNS4NCg0KICBbYGVudl9jb25maWcnXTogSGVscGVy IGxpYnJhcnkgZm9yIHJldHJpZXZpbmcgY29uZmlndXJhdGlvbiBmcm9tIGFuDQogIGVudmlyb25t ZW50IHZhcmlhYmxlDQoNCiAgVGhlIEVudl9jb25maWcgbGlicmFyeSBpcyBhIGhlbHBlciBmb3Ig cmV0cmlldmluZyBsaWJyYXJ5IGFuZCBwcm9ncmFtDQogIGNvbmZpZ3VyYXRpb24gZnJvbSBhbiBl bnZpcm9ubWVudCB2YXJpYWJsZS4gSXRzIGdvYWwgaXMgdG8gbWFrZSBpdA0KICBlYXN5IHRvIG92 ZXJyaWRlIGEgY29uZmlndXJhdGlvbiB0aGF0IGlzIGxvYWRlZCBmcm9tIGRpc2ssIGNvbXB1dGVk LA0KICBvciBlbWJlZGRlZCBpbiBhIGxpYnJhcnkuDQoNCiAgW2BmaWxlX3BhdGgnXTogQSBsaWJy YXJ5IGZvciB0eXBlZCBtYW5pcHVsYXRpb24gb2YgVU5JWC1zdHlsZSBmaWxlDQogIHBhdGhzDQoN CiAgQSBsaWJyYXJ5IGZvciB0eXBlZCBtYW5pcHVsYXRpb24gb2YgVU5JWC1zdHlsZSBmaWxlIHBh dGhzLg0KDQogIFtgZnV6enlfbWF0Y2gnXTogQSBsaWJyYXJ5IGZvciBmdXp6eSBzdHJpbmcgbWF0 Y2hpbmcNCg0KICBBIGxpYnJhcnkgZm9yIGZ1enp5IHN0cmluZyBtYXRjaGluZw0KDQogIFtgZnpm J106IEEgbGlicmFyeSBmb3IgcnVubmluZyB0aGUgZnpmIGNvbW1hbmQgbGluZSB0b29sDQoNCiAg QSBsaWJyYXJ5IGZvciBydW5uaW5nIHRoZSBmemYgY29tbWFuZCBsaW5lIGZ1enp5IG1hdGNoZXIN Cg0KICBbYGhhcmRjYW1sX2MnXTogSGFyZGNhbWwgQyBTaW11bGF0aW9uIEJhY2tlbmQNCg0KICBB IGZhc3QgQy1iYXNlZCBzaW11bGF0aW9uIGJhY2tlbmQgZm9yIEhhcmRjYW1sIGNpcmN1aXRzLg0K DQogIFRoZSBsaWJyYXJ5IHRyYW5zcGFyZW50bHkgY29tcGlsZXMgYSBIYXJkY2FtbCBDaXJjdWl0 IHRvIEMgY29kZSwgd2hpY2gNCiAgaXMgaW4gdHVybiBjb21waWxlZCBhbmQgbGlua2VkIGludG8g dGhlIHJ1bm5pbmcgZXhlY3V0YWJsZS4gVGhlDQogIGdlbmVyYXRlZCBzaW11bGF0aW9uIG9iamVj dCBjYW4gYmUgdXNlZCBsaWtlIGFueSBvdGhlciBjeWNsZXNpbQ0KICBzaW11bGF0aW9uLg0KDQog IFtgaGFyZGNhbWxfY2lyY3VpdHMnXTogSGFyZGNhbWwgQ2lyY3VpdHMNCg0KICBBIHNtYWxsIGxp YnJhcnkgb2YgdXNlZnVsL2ludGVyZXN0aW5nIEhhcmRjYW1sIGNpcmN1aXRzLg0KDQogIFtgaGFy ZGNhbWxfZml4ZWRfcG9pbnQnXTogSGFyZGNhbWwgZml4ZWQgcG9pbnQgYXJpdGhtZXRpYw0KDQog IFNpZ25lZCBhbmQgVW5zaWduZWQgZml4ZWQgcG9pbnQgb3BlcmF0aW9ucywgd2l0aCBhIGZ1bGwg Y29tcGxlbWVudCBvZg0KICByb3VuZGluZyBhbmQgb3ZlcmZsb3cgZnVuY3Rpb25hbGl0eS4NCg0K ICBbYGhhcmRjYW1sX29mX3Zlcmlsb2cnXTogQ29udmVydCBWZXJpbG9nIHRvIGEgSGFyZGNhbWwg ZGVzaWduDQoNCiAgVGhlIG9wZW5zb3VyY2Ugc3ludGhlc2lzIHRvb2wgeW9zeXMgaXMgdXNlZCB0 byBjb252ZXJ0IGEgdmVyaWxvZw0KICBkZXNpZ24gdG8gYSBKU09OIGJhc2VkIG5ldGxpc3QgcmVw cmVzZW50YXRpb24uIFRoaXMgbGlicmFyeSBjYW4gbG9hZA0KICB0aGUgSlNPTiBuZXRsaXN0IGFu ZCBidWlsZCBhIGhhcmRjYW1sIGNpcmN1aXQuDQoNCiAgQ29kZSBjYW4gYWxzbyBiZSBnZW5lcmF0 ZWQgdG8gd3JhcCB0aGUgY29udmVyc2lvbiBwcm9jZXNzIHVzaW5nDQogIEhhcmRjYW1sIGludGVy ZmFjZXMuDQoNCiAgW2BoYXJkY2FtbF9zdGVwX3Rlc3RiZW5jaCddOiBIYXJkY2FtbCBUZXN0YmVu Y2ggTW9uYWQNCg0KICBBIG1vbmFkIGZvciBpbnRlcmFjdGluZyB3aXRoIEhhcmRjYW1sLkN5Y2xl c2ltIGJhc2VkIHNpbXVsYXRpb25zLg0KDQogIEFsbG93cyBtdWx0aXBsZSBjb250cm9sIHRocmVh ZHMgdG8gaW50ZXJhY3Qgd2l0aCBhIHNpbXVsYXRpb24gbW9kdWxlLA0KICBhbGwgb2Ygd2hpY2gg YXJlIHN5bmNocm9uaXNlZCB0byB0aGUgc3lzdGVtIGNsb2NrLg0KDQogIFtgaGFyZGNhbWxfdmVy aWZ5J106IEhhcmRjYW1sIFZlcmlmaWNhdGlvbiBUb29scw0KDQogIFRvb2xzIGZvciB2ZXJpZnlp bmcgcHJvcGVydGllcyBvZiBIYXJkY2FtbCBjaXJjdWl0cy4NCg0KICBDb21iaW5hdGlvbmFsIGNp cmN1aXRzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gJ2Nvbmp1bmN0aXZlIG5vcm1hbCBmb3JtJw0KICBm b3IgaW5wdXQgaW50byBTQVQgc29sdmVycyB2aWEgRElNQUMgZmlsZXMuIFN1cHBvcnQgZm9yIGEg ZmV3DQogIG9wZW5zb3VyY2Ugc29sdmVycyBpcyBpbnRlZ3JhdGVkIC0gbWluaXNhdCwgcGljb3Nh dCwgWjMgLSBqdXN0IGVuc3VyZQ0KICB0aGV5IGFyZSBpbiB5b3VyIFBBVEguDQoNCiAgQ2lyY3Vp dHMgY2FuIGFsc28gYmUgY29udmVydGVkIHRvIE51U01WIGZvcm1hdCBmb3IgYWR2YW5jZWQgYm91 bmRlZA0KICBhbmQgdW5ib3VuZGVkIG1vZGVsIGNoZWNraW5nIHRhc2tzLg0KDQogIFtgaGFyZGNh bWxfdmVyaWxhdG9yJ106IEhhcmRjYW1sIFZlcmlsYXRvciBTaW11bGF0aW9uIEJhY2tlbmQNCg0K ICBWZXJ5IGZhc3QgdmVyaWxhdG9yLWJhc2VkIHNpbXVsYXRpb25zIG9mIEhhcmRjYW1sIGNpcmN1 aXRzLg0KDQogIFRoaXMgbGlicmFyeSB0cmFuc3BhcmVudGx5IGNvbXBpbGVzIGEgdmVyaWxhdG9y LWJhc2VkIHNoYXJlZCBsaWJyYXJ5LA0KICBhbmQgbGlua3MgaXQgYmFjayB0byB0aGUgcnVubmlu ZyBleGVjdXRhYmxlIHRvIGJlIHVzZWQgYXMgYSBDeWNsZXNpbQ0KICBzaW11bGF0aW9uLg0KDQog IFtgaGFyZGNhbWxfeGlsaW54J106IEhhcmRjYW1sIHdyYXBwZXJzIGZvciBYaWxpbnggbWVtb3J5 IHByaW1pdGl2ZXMNCg0KICBUaGUgSGFyZGNhbWxfeGlsaW54IGxpYnJhcnkgcHJvdmlkZXMgd3Jh cHBlcnMgZm9yIFhpbGlueCBzcGVjaWZpYyBSQU0NCiAgYW5kIEZJRk8gcHJpbWl0aXZlIGJsb2Nr cy4gSW4gbWFueSBjYXNlcyBhIHNpbXVsYXRpb24gbW9kZWwgaXMNCiAgcHJvdmlkZWQuDQoNCiAg VGhlIGBTeW50aGVzaXMnIG1vZHVsZSBpbXBsZW1lbnRzIHZhcmlvdXMgYXJpdGhtZXRpYyBhbmQg bG9naWNhbCBSVEwNCiAgY29tcG9uZW50cyB3aXRoIFhpbGlueCBMVVQgcHJpbWl0aXZlcy4NCg0K ICBbYGhhcmRjYW1sX3hpbGlueF9jb21wb25lbnRzJ106IEhhcmRjYW1sIFhpbGlueCBjb21wb25l bnQgZGVmaW5pdGlvbnMNCg0KICBBIHRvb2wgZm9yIHJlYWRpbmcgWGlsaW54IFZIREwgVW5pc2lt IGFuZCBYUE0gY29tcG9uZW50IGRlZmluaXRpb25zDQogIGZyb20gYSBWaXZhZG8gaW5zdGFsbGF0 aW9uIGFuZCBnZW5lcmF0aW5nIEhhcmRjYW1sIGludGVyZmFjZXMNCiAgYXV0b21hdGljYWxseS4N Cg0KICBbYGhleF9lbmNvZGUnXTogSGV4YWRlY2ltYWwgZW5jb2RpbmcgbGlicmFyeQ0KDQogIFRo aXMgbGlicmFyeSBpbXBsZW1lbnRzIGhleGFkZWNpbWFsIGVuY29kaW5nIGFuZCBkZWNvZGluZw0K DQogIFtgaGdfbGliJ106IEEgbGlicmFyeSB0aGF0IHdyYXBzIHRoZSBNZXJjdXJpYWwgY29tbWFu ZCBsaW5lIGludGVyZmFjZQ0KDQogIEEgbGlicmFyeSB0aGF0IHdyYXBzIHRoZSBNZXJjdXJpYWwg Y29tbWFuZCBsaW5lIGludGVyZmFjZS4NCg0KICBbYGludF9yZXByJ106IEludGVnZXJzIG9mIHZh cmlvdXMgd2lkdGhzDQoNCiAgSW50ZWdlcnMgb2YgdmFyaW91cyB3aWR0aHMuDQoNCiAgW2Bqc29u YWYnXTogQSBsaWJyYXJ5IGZvciBwYXJzaW5nLCBtYW5pcHVsYXRpbmcsIGFuZCBzZXJpYWxpemlu ZyBkYXRhDQogIHN0cnVjdHVyZWQgYXMgSlNPTg0KDQogIEEgbGlicmFyeSBmb3IgcGFyc2luZywg bWFuaXB1bGF0aW5nLCBhbmQgc2VyaWFsaXppbmcgZGF0YSBzdHJ1Y3R1cmVkDQogIGFzIEpTT04u DQoNCiAgW2BrcmInXTogQSBsaWJyYXJ5IGZvciB1c2luZyBLZXJiZXJvcyBmb3IgYm90aCBScGMg YW5kIFRjcA0KICBjb21tdW5pY2F0aW9uDQoNCiAgSmFuZSBTdHJlZXQncyBsaWJyYXJ5IGZvciBL ZXJiZXJpemluZyBSUEMgY29ubmVjdGlvbnMgc28gdGhhdA0KICDigKIgdGhlIHNlcnZlciBnZXRz IGFuIGF1dGhlbnRpY2F0ZWQgcHJpbmNpcGFsIChpLmUuIHVzZXJuYW1lKSB3aXRoDQogICAgZXZl cnkgaW5jb21pbmcgY29ubmVjdGlvbiwgYW5kDQogIOKAoiBSUEMgY29tbXVuaWNhdGlvbiBtYXkg YmUgZW5jcnlwdGVkLCBpZiBuZWNlc3NhcnkuDQoNCiAgW2BtYWdpYy10cmFjZSddOiBFYXN5IElu dGVsIFByb2Nlc3NvciBUcmFjZSBWaXN1YWxpemVyDQoNCiAgTWFnaWMtdHJhY2UgbWFrZXMgaXQg ZWFzeSB0byByZWNvcmQgYW5kIHZpc3VhbGl6ZSBJbnRlbCBQcm9jZXNzb3INCiAgICAgIFRyYWNl IGRhdGEgZm9yIGRlYnVnZ2luZyB0cmlja3kgcGVyZm9ybWFuY2UgaXNzdWVzLg0KDQogIFtgb2Nh bWwtZW1iZWQtZmlsZSddOiBGaWxlcyBjb250ZW50cyBhcyBtb2R1bGUgY29uc3RhbnRzDQoNCiAg RW1iZWQtZmlsZSB0YWtlcyBzb21lIGZpbGVzIGFuZCBnZW5lcmF0ZXMgY29kZSBmb3IgYW4gT0Nh bWwgbW9kdWxlDQogIGRlZmluaW5nIHN0cmluZyBjb25zdGFudHMgY29udGFpbmluZyB0aGUgY29u dGVudHMgb2YgdGhvc2UgZmlsZXMuDQoNCiAgW2BvY2FtbF9pbnRyaW5zaWNzJ106IEludHJpbnNp Y3MNCg0KICBQcm92aWRlcyBmdW5jdGlvbnMgdG8gaW52b2tlIGFtZDY0IGluc3RydWN0aW9ucyAo c3VjaCBhcw0KICAgICAgIGNseixwb3BjbnQscmR0c2MscmRwbWMpIHdoZW4gYXZhaWxhYmxlLCBv ciBjb21wYXRpYmxlIHNvZnR3YXJlDQogICAgICAgaW1wbGVtZW50YXRpb24gb24gb3RoZXIgdGFy Z2V0cy4NCg0KICBbYG9jYW1sLXByb2JlcyddOiBVU0RUIHByb2JlcyBmb3IgT0NhbWw6IGNvbW1h bmQgbGluZSB0b29sDQoNCiAgQSB0b29sIGZvciBjb250cm9sbGluZyB1c2VyLXNwYWNlIHN0YXRp Y2FsbHktZGVmaW5lZCB0cmFjaW5nIHByb2Jlcw0KICBmb3IgT0NhbWwuICBFeHBlcmltZW50YWwu DQoNCiAgW2BwcHhfY3NzJ106IEEgcHB4IHRoYXQgdGFrZXMgaW4gY3NzIHN0cmluZ3MgYW5kIHBy b2R1Y2VzIGEgbW9kdWxlIGZvcg0KICBhY2Nlc3NpbmcgdGhlIHVuaXF1ZSBuYW1lcyBkZWZpbmVk IHdpdGhpbg0KDQogIEEgcHB4IHRoYXQgdGFrZXMgaW4gY3NzIHN0cmluZ3MgYW5kIHByb2R1Y2Vz IGEgbW9kdWxlIGZvciBhY2Nlc3NpbmcNCiAgdGhlIHVuaXF1ZSBuYW1lcyBkZWZpbmVkIHdpdGhp bi4NCg0KICBbYHBweF9kaXNhYmxlX3VudXNlZF93YXJuaW5ncyddOiBFeHBhbmRzIFtAZGlzYWJs ZV91bnVzZWRfd2FybmluZ3NdDQogIGludG8gW0B3YXJuaW5nIFwiLTIwLTI2LTMyLTMzLTM0LTM1 LTM2LTM3LTM4LTM5LTYwLTY2LTY3XCJdDQoNCiAgUGFydCBvZiB0aGUgSmFuZSBTdHJlZXQncyBQ UFggcmV3cml0ZXJzIGNvbGxlY3Rpb24uDQoNCiAgW2BwcHhfaWdub3JlX2luc3RydW1lbnRhdGlv biddOiBJZ25vcmUgSmFuZSBTdHJlZXQgc3BlY2lmaWMNCiAgaW5zdHJ1bWVudGF0aW9uIGV4dGVu c2lvbnMNCg0KICBJZ25vcmUgSmFuZSBTdHJlZXQgc3BlY2lmaWMgaW5zdHJ1bWVudGF0aW9uIGV4 dGVuc2lvbnMgZnJvbSBpbnRlcm5hbA0KICAgICBQUFhzIG9yIGNvbXBpbGVyIGZlYXR1cmVzIG5v dCB5ZXQgdXBzdHJlYW1lZC4NCg0KICBbYHBweF9qc29uYWZfY29udiddOiBbQEBkZXJpdmluZ10g cGx1Z2luIHRvIGdlbmVyYXRlIEpzb25hZiBjb252ZXJzaW9uDQogIGZ1bmN0aW9ucw0KDQogIFBh cnQgb2YgdGhlIEphbmUgU3RyZWV0J3MgUFBYIHJld3JpdGVycyBjb2xsZWN0aW9uLg0KDQogIFtg cHB4X3R5cGVkX2ZpZWxkcyddOiBHQURULWJhc2VkIGZpZWxkIGFjY2Vzc29ycyBhbmQgdXRpbGl0 aWVzDQoNCiAgUGFydCBvZiB0aGUgSmFuZSBTdHJlZXQncyBQUFggcmV3cml0ZXJzIGNvbGxlY3Rp b24uDQoNCiAgW2BwcHhfdHlwZV9kaXJlY3RlZF92YWx1ZSddOiBHZXQgW0BAZGVyaXZpbmddLXN0 eWxlIGdlbmVyYXRpb24gb2YNCiAgdHlwZS1kaXJlY3RlZCB2YWx1ZXMgd2l0aG91dCB3cml0aW5n IGEgcHB4DQoNCiAgYFBweF90eXBlX2RpcmVjdGVkX3ZhbHVlJyBpcyBhIHBweCB0aGF0IGRvZXMg YFtAQGRlcml2aW5nXSctc3R5bGUNCiAgZ2VuZXJhdGlvbiBvZiB0eXBlLWRpcmVjdGVkIHZhbHVl cyBiYXNlZCBvbiB1c2VyLXByb3ZpZGVkIG1vZHVsZXMuIFRoZQ0KICB1c2VyLXByb3ZpZGVkIG1v ZHVsZXMgdGVsbCBgcHB4X3R5cGVfZGlyZWN0ZWRfdmFsdWUnIGhvdyB0byBjb21wb3NlDQogIHR5 cGUtZGlyZWN0ZWQgdmFsdWVzIChmb3IgZXhhbXBsZSwgY29tYmluZSB0eXBlLWRpcmVjdGVkIHZh bHVlcyBvZiB0aGUNCiAgZmllbGRzIG9mIGEgcmVjb3JkIHRvIGZvcm0gYSB0eXBlLWRpcmVjdGVk IHZhbHVlIGZvciB0aGUgcmVjb3JkDQogIGl0c2VsZikuDQoNCiAgVGhpcyBhbGxvd3MgYSB3aWRl IHZhcmlldHkgb2YgUFBYcyBzdWNoIGFzIGBwcHhfc2V4cF9jb252JywNCiAgYHBweF9jb21wYXJl JywgYHBweF9lbnVtZXJhdGUnLCBldGMuIHRvIGJlIGltcGxlbWVudGVkIHdpdGgNCiAgYHBweF90 eXBlX2RpcmVjdGVkX3ZhbHVlJywgYnV0IHdpdGggc29tZSBydW50aW1lIGNvc3QuDQoNCiAgVGhp cyBQUFggY3VycmVudGx5IHN1cHBvcnRzIGRlcml2aW5nIHR5cGUtZGlyZWN0ZWQgdmFsdWVzIGZv ciByZWNvcmRzLA0KICBvcmRpbmFyeSAmIHBvbHltb3JwaGljIHZhcmlhbnRzIGFuZCB0dXBsZXMu IEl0IGFsc28gc3VwcG9ydHMgY3VzdG9tDQogIHVzZXItZGVmaW5lZCBhdHRyaWJ1dGVzIG9uIHJl Y29yZCBhbmQgdmFyaWFudCBmaWVsZHMuDQoNCiAgW2Bwcm9mdW5jdG9yJ106IEEgbGlicmFyeSBw cm92aWRpbmcgYSBzaWduYXR1cmUgZm9yIHNpbXBsZSBwcm9mdW5jdG9ycw0KICBhbmQgdHJhdmVy c2FsIG9mIGEgcmVjb3JkDQoNCiAgVGhpcyBpcyBhIHZlcnkgc21hbGwgbGlicmFyeSB3aGljaCBw cm92aWRlcyBhIHNpZ25hdHVyZSBmb3IgcHJvZnVuY3Rvcg0KICB0eXBlcyBhbmQgb3BlcmF0aW9u cyB3aGljaCBjYW4gYmUgdXNlZCB0byB0cmF2ZXJzZSBhIHJlY29yZCB3aXRoIHRoZW0NCiAgYmFz ZWQgb24gcmVjb3JkX2J1aWxkZXIgYW5kIHRoZSBgcHB4X2ZpZWxkcycgc3ludGF4IGV4dGVuc2lv bi4NCg0KICBbYHJlZGlzLWFzeW5jJ106IFJlZGlzIGNsaWVudCBmb3IgQXN5bmMgYXBwbGljYXRp b25zDQoNCiAgQSBjbGllbnQgbGlicmFyeSBmb3IgUmVkaXMgdmVyc2lvbnMgNiBhbmQgaGlnaGVy Lg0KDQogIFByb3ZpZGVzIGEgc3Ryb25nbHktdHlwZWQgQVBJIHdpdGggdHJhbnNwYXJlbnQgKGRl KXNlcmlhbGl6YXRpb24gZm9yDQogIGFwcGxpY2F0aW9uLWRlZmluZWQgdHlwZXMuDQoNCiAgU3Vw cG9ydHMgY2xpZW50IHRyYWNraW5nIGFuZCBpbnRlcm5hbGx5IHVzZXMgdGhlIFJFU1AzIHByb3Rv Y29sLg0KDQogIFtgc2V4cF9kaWZmJ106IENvZGUgZm9yIGNvbXB1dGluZyB0aGUgZGlmZiBvZiB0 d28gc2V4cHMNCg0KICBUaGUgY29kZSBiZWhpbmQgdGhlIFtkaWZmXSBzdWJjb21tYW5kIG9mIHRo ZSBKYW5lIFN0cmVldCdzIFtzZXhwXQ0KICBjb21tYW5kIGxpbmUgdG9vbC4NCg0KICBbYHNleHBf Z3JhbW1hciddOiBTZXhwIGdyYW1tYXIgaGVscGVycw0KDQogIEhlbHBlcnMgZm9yIG1hbmlwdWxh dGluZyBbU2V4cGxpYi5TZXhwX2dyYW1tYXJdIHZhbHVlcy4NCg0KICBbYHNleHBfc3RyaW5nX3F1 aWNrY2hlY2snXTogUXVpY2tjaGVjayBoZWxwZXJzIGZvciBzdHJpbmdzIHBhcnNpbmcgdG8NCiAg c2V4cHMNCg0KICBUaGlzIGxpYnJhcnkgcHJvdmlkZXMgcXVpY2tjaGVjayBnZW5lcmF0b3JzLCBo ZWxwZXJzLCBhbmQgc2hyaW5rZXJzDQogIGZvciBxdWlja2NoZWNrLWJhc2VkIHRlc3RzIHRoYXQg d2lzaCB0byBleGVyY2lzZSB0aGUgY29uY3JldGUgc3ludGF4DQogIG9mIHNleHBzLCBpbmNsdWRp bmcgZXNjYXBlIHNlcXVlbmNlcyBhbmQgY29tbWVudHMuDQoNCiAgW2B0cmFjaW5nJ106IFRyYWNp bmcgbGlicmFyeQ0KDQogIFV0aWxpdGllcyBmb3IgY3JlYXRpbmcgYW5kIHBhcnNpbmcgdHJhY2Vz IGluIEZ1Y2hzaWEgVHJhY2UgRm9ybWF0Lg0KDQogIFtgdXNlcm5hbWVfa2VybmVsJ106IEFuIGlk ZW50aWZpZXIgZm9yIGEgdXNlcg0KDQogIEEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIGZvciBhIHVz ZXIsIHR5cGljYWxseSBhIFVOSVggdXNlcm5hbWUNCg0KDQpbYGFic3RyYWN0X2FsZ2VicmEnXSA8 aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvYWJzdHJhY3RfYWxnZWJyYT4NCg0KW2Bhc3lu Y19ycGNfd2Vic29ja2V0J10NCjxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9hc3luY19y cGNfd2Vic29ja2V0Pg0KDQpbYGJpZ2RlY2ltYWwnXSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVz dHJlZXQvYmlnZGVjaW1hbD4NCg0KW2Bjb2h0dHBfYXN5bmNfd2Vic29ja2V0J10NCjxodHRwczov L2dpdGh1Yi5jb20vamFuZXN0cmVldC9jb2h0dHBfYXN5bmNfd2Vic29ja2V0Pg0KDQpbYGNvaHR0 cF9zdGF0aWNfaGFuZGxlciddDQo8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvY29odHRw X3N0YXRpY19oYW5kbGVyPg0KDQpbYGNvcmVfY29tcGF0J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9q YW5lc3RyZWV0L2NvcmVfY29tcGF0Pg0KDQpbYGVudl9jb25maWcnXSA8aHR0cHM6Ly9naXRodWIu Y29tL2phbmVzdHJlZXQvZW52X2NvbmZpZz4NCg0KW2BmaWxlX3BhdGgnXSA8aHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvZmlsZV9wYXRoPg0KDQpbYGZ1enp5X21hdGNoJ10gPGh0dHBzOi8v Z2l0aHViLmNvbS9qYW5lc3RyZWV0L2Z1enp5X21hdGNoPg0KDQpbYGZ6ZiddIDxodHRwczovL2dp dGh1Yi5jb20vamFuZXN0cmVldC9memY+DQoNCltgaGFyZGNhbWxfYyddIDxodHRwczovL2dpdGh1 Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9jPg0KDQpbYGhhcmRjYW1sX2NpcmN1aXRzJ10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2hhcmRjYW1sX2NpcmN1aXRzPg0KDQpbYGhhcmRj YW1sX2ZpeGVkX3BvaW50J10NCjxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2Ft bF9maXhlZF9wb2ludD4NCg0KW2BoYXJkY2FtbF9vZl92ZXJpbG9nJ10NCjxodHRwczovL2dpdGh1 Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9vZl92ZXJpbG9nPg0KDQpbYGhhcmRjYW1sX3N0ZXBf dGVzdGJlbmNoJ10NCjxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9zdGVw X3Rlc3RiZW5jaD4NCg0KW2BoYXJkY2FtbF92ZXJpZnknXSA8aHR0cHM6Ly9naXRodWIuY29tL2ph bmVzdHJlZXQvaGFyZGNhbWxfdmVyaWZ5Pg0KDQpbYGhhcmRjYW1sX3ZlcmlsYXRvciddDQo8aHR0 cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvaGFyZGNhbWxfdmVyaWxhdG9yPg0KDQpbYGhhcmRj YW1sX3hpbGlueCddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF94aWxp bng+DQoNCltgaGFyZGNhbWxfeGlsaW54X2NvbXBvbmVudHMnXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9qYW5lc3RyZWV0L2hhcmRjYW1sX3hpbGlueF9jb21wb25lbnRzPg0KDQpbYGhleF9lbmNvZGUn XSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvaGV4X2VuY29kZT4NCg0KW2BoZ19saWIn XSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvaGdfbGliPg0KDQpbYGludF9yZXByJ10g PGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2ludF9yZXByPg0KDQpbYGpzb25hZiddIDxo dHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9qc29uYWY+DQoNCltga3JiJ10gPGh0dHBzOi8v Z2l0aHViLmNvbS9qYW5lc3RyZWV0L2tyYj4NCg0KW2BtYWdpYy10cmFjZSddIDxodHRwczovL2dp dGh1Yi5jb20vamFuZXN0cmVldC9tYWdpYy10cmFjZT4NCg0KW2BvY2FtbC1lbWJlZC1maWxlJ10g PGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L29jYW1sLWVtYmVkLWZpbGU+DQoNCltgb2Nh bWxfaW50cmluc2ljcyddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9vY2FtbF9pbnRy aW5zaWNzPg0KDQpbYG9jYW1sLXByb2JlcyddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVl dC9vY2FtbC1wcm9iZXM+DQoNCltgcHB4X2NzcyddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0 cmVldC9wcHhfY3NzPg0KDQpbYHBweF9kaXNhYmxlX3VudXNlZF93YXJuaW5ncyddDQo8aHR0cHM6 Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X2Rpc2FibGVfdW51c2VkX3dhcm5pbmdzPg0KDQpb YHBweF9pZ25vcmVfaW5zdHJ1bWVudGF0aW9uJ10NCjxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0 cmVldC9wcHhfaWdub3JlX2luc3RydW1lbnRhdGlvbj4NCg0KW2BwcHhfanNvbmFmX2NvbnYnXSA8 aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X2pzb25hZl9jb252Pg0KDQpbYHBweF90 eXBlZF9maWVsZHMnXSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X3R5cGVkX2Zp ZWxkcz4NCg0KW2BwcHhfdHlwZV9kaXJlY3RlZF92YWx1ZSddDQo8aHR0cHM6Ly9naXRodWIuY29t L2phbmVzdHJlZXQvcHB4X3R5cGVfZGlyZWN0ZWRfdmFsdWU+DQoNCltgcHJvZnVuY3RvciddIDxo dHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9wcm9mdW5jdG9yPg0KDQpbYHJlZGlzLWFzeW5j J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3JlZGlzLWFzeW5jPg0KDQpbYHNleHBf ZGlmZiddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9zZXhwX2RpZmY+DQoNCltgc2V4 cF9ncmFtbWFyJ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3NleHBfZ3JhbW1hcj4N Cg0KW2BzZXhwX3N0cmluZ19xdWlja2NoZWNrJ10NCjxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0 cmVldC9zZXhwX3N0cmluZ19xdWlja2NoZWNrPg0KDQpbYHRyYWNpbmcnXSA8aHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvdHJhY2luZz4NCg0KW2B1c2VybmFtZV9rZXJuZWwnXSA8aHR0cHM6 Ly9naXRodWIuY29tL2phbmVzdHJlZXQvdXNlcm5hbWVfa2VybmVsPg0KDQoNCkVtZWxsZVRWIFNo b3cgLSAyMDIyDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2VtZWxsZXR2LXNob3ctMjAyMi85NjEzLzE+DQoNCg0KRGF2aWQgU2FuY2hvIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSSdtIGNyZWF0aW5nIGEgcG9zdCBhcyBhIGhlYWRlciBmcm9tIHRoaXMg c2Vhc29uIG9mICpFbWVsbGVUViogaW4NCiAgMjAyMC4gV2lsbCB1c2UgdGhpcyBwb3N0IHRvIHNo YXJlIGFubm91bmNlbWVudHMsIG5ldyBzaG93cywgZ2F0aGVyDQogIGZlZWRiYWNrIGFuZCBpbnZp dGUgeW91IHRvIHdhdGNoIGFuZCBmb2xsb3cNCiAgW2h0dHBzOi8vd3d3LnR3aXRjaC50di9lbWVs bGV0dl0hDQoNCiAgRm9yIHRoZSBvbmVzIHdobyBkb2Vzbid0IGtub3cgdXMsIEl0J3MgYSBzdHJl YW1pbmcgc2hvdyB0aGF0IHdpbGwNCiAgaGFwcGVuIG9uY2UgcGVyIG1vbnRoIGFuZCB3aWxsIHRy eSB0byBpbnRlcnZpZXcgYW5kIHRhbGsgY2FzdWFsbHkNCiAgYWJvdXQgT0NhbWwsIFJlYXNvbiwg UmVTY3JpcHQgYW5kIHRoZWlyIGNvbW11bml0aWVzLiBJbnZpdGluZw0KICBpbnRlcmVzdGluZyBl bmdpbmVlcnMgYW5kIGFzayBzaWxseSBxdWVzdGlvbnMgYWJvdXQgbGl0ZXJhbGx5DQogIGFueXRo aW5nLg0KDQogIElmIGNhbid0IGF0dGVuZCBsaXZlLCB3ZSBwdWJsaXNoIHRoZSBWT0QgaW4geW91 dHViZSB1bmRlcg0KICBbaHR0cHM6Ly93d3cueW91dHViZS5jb20vY2hhbm5lbC9VQ3ZWVmZDYTct bnpTdUNkTUtYbk5KTlFdLiAgWW91IGNhbg0KICByZS13YXRjaCBzb21lIG9mIHRoZSAyMDIxIGlu dGVydmlld3MsIHRoZXkgd2VyZSBhIHRvbiBvZiBmdW4gZm9yIG1lLg0KDQogIEl0J3MgbWFkZSBi eSBteXNlbGYgYW5kIEBmYWtlbmlja2Vscy4NCg0KICBGZWVsIGZyZWUgdG8gc2hhcmUgYW55IGZl ZWRiYWNrLCBwcm9wb3NlIGFueSBndWVzdCBvciBtYWtlIGZ1biBvZiB1cw0KICBeXg0KDQoNClto dHRwczovL3d3dy50d2l0Y2gudHYvZW1lbGxldHZdIDxodHRwczovL3d3dy50d2l0Y2gudHYvZW1l bGxldHY+DQoNCltodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDdlZWZkNhNy1uelN1 Q2RNS1huTkpOUV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS9jaGFubmVsL1VDdlZWZkNhNy1u elN1Q2RNS1huTkpOUT4NCg0KDQpPcGVuIHNvdXJjZSBlZGl0b3IgZm9yIGlPUywgaVBhZE9TIGFu ZCBtYWNPUw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNvdXJjZS1lZGl0b3ItZm9yLWlvcy1pcGFkb3MtYW5kLW1h Y29zLzc2MjQvMjE+DQoNCg0KTmF0aGFuIEZhbGxldCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEp1c3QgcmVsZWFzZWQgdGhlIGFwcCBvbiB0aGUgUGxheSBTdG9yZSBmb3IgQW5kcm9pZDog W1BsYXkgU3RvcmVdDQoNCiAgRmVlbCBmcmVlIHRvIGdpdmUgeW91ciBmZWVkYmFjayBhcyB3ZWxs LiBJIHRyaWVkIHRvIG1ha2UgaXQgbGlrZSB0aGUNCiAgaU9TL21hY09TIHZlcnNpb24uIEZvciBu b3csIHRoZSBvbmx5IG1pc3NpbmcgZmVhdHVyZSBpcyBzeW50YXgNCiAgaGlnaGxpZ2h0aW5nLCBi dXQgSSdtIHdvcmtpbmcgb24gaXQgKEkgc3RpbGwgaGF2ZSBhIGZldyBidWdzIHdpdGggaXQpDQoN Cg0KW1BsYXkgU3RvcmVdDQo8aHR0cHM6Ly9wbGF5Lmdvb2dsZS5jb20vc3RvcmUvYXBwcy9kZXRh aWxzP2lkPW1lLm5hdGhhbmZhbGxldC5vY2FtbD4NCg0KDQpUaGUgbXlzdGVyaW91cyBwb2ludGVy IGluIHRoZSBydW50aW1lIGNsb3N1cmUgcmVwcmVzZW50YXRpb24NCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhlLW15c3RlcmlvdXMtcG9p bnRlci1pbi10aGUtcnVudGltZS1jbG9zdXJlLXJlcHJlc2VudGF0aW9uLzk1NjAvNz4NCg0KDQpE ZWVwIGluIHRoaXMgdGhyZWFkLCBZdWUgTGkgUGljYXNzbyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFRoYW5rcyBmb3IgeW91ciByZXBsaWVzIEBzaWxlbmUgQHpvem96byAh ICBEdWUgdG8gcHJvamVjdCBpbnRlcmVzdCBJDQogIG5lZWQgdG8gdW5kZXJzdGFuZCB0aGUgcnVu dGltZSB2YWx1ZSByZXByZXNlbnRhdGlvbi4gTm93IEkgcmVsZWFzZWQgYQ0KICBsaXR0bGUgbGli cmFyeSBmb3IgZGlzcGxheWluZyBydW50aW1lIHZhbHVlcyBpbiB0ZXh0dWFsIGZvcm06DQogIFtP SW5zcGVjdF0uDQoNCg0KW09JbnNwZWN0XSA8aHR0cHM6Ly9naXRodWIuY29tL1l1ZUxpUGljYXNz by9PSW5zcGVjdD4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWxjb3JlIHBsYW5ldCBi bG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5r cyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbT0NhbWwgUGxhbmV0XS4NCg0K ICDigKIgW01pcmFnZU9TIDQgUmVsZWFzZWQhXQ0KICDigKIgW1BoRCBQb3NpdGlvbiBhdCBDRUEg TElTVCAtIExTTF0NCiAg4oCiIFtBbGwgeW91ciBtZXRyaWNzIGJlbG9uZyB0byBpbmZsdXhdDQog IOKAoiBbU2VjdXJlIFZpcnR1YWwgTWVzc2FnZXMgaW4gYSBCb3R0bGUgd2l0aCBTQ29QXQ0KICDi gKIgW1Jlc2VhcmNoIGludGVybnNoaXBzIGluIG91ciBUb29scyBhbmQgQ29tcGlsZXJzIGdyb3Vw XQ0KDQoNCltPQ2FtbCBQbGFuZXRdIDxodHRwOi8vb2NhbWwub3JnL2NvbW11bml0eS9wbGFuZXQv Pg0KDQpbTWlyYWdlT1MgNCBSZWxlYXNlZCFdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIw MjItMDMtMjktbWlyYWdlb3MtNC1yZWxlYXNlZD4NCg0KW1BoRCBQb3NpdGlvbiBhdCBDRUEgTElT VCAtIExTTF0NCjxodHRwOi8vZnJhbWEtYy5jb20vam9icy8yMDIyLTAzLTI4LW1hY2hpbmUtbGVh cm5pbmctZm9yLWltcHJvdmluZy1mb3JtYWwtdmVyaWZpY2F0aW9uLW9mLWNvZGUuaHRtbD4NCg0K W0FsbCB5b3VyIG1ldHJpY3MgYmVsb25nIHRvIGluZmx1eF0NCjxodHRwczovL2hhbm5lcy5ucXNi LmlvL1Bvc3RzL01vbml0b3Jpbmc+DQoNCltTZWN1cmUgVmlydHVhbCBNZXNzYWdlcyBpbiBhIEJv dHRsZSB3aXRoIFNDb1BdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjItMDMtMDgtc2Vj dXJlLXZpcnR1YWwtbWVzc2FnZXMtaW4tYS1ib3R0bGUtd2l0aC1zY29wPg0KDQpbUmVzZWFyY2gg aW50ZXJuc2hpcHMgaW4gb3VyIFRvb2xzIGFuZCBDb21waWxlcnMgZ3JvdXBdDQo8aHR0cHM6Ly9i bG9nLmphbmVzdHJlZXQuY29tL3Jlc2VhcmNoLWludGVybnNoaXBzLXRuYy8+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFu IFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5p ZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 29 to April 05, 2022.

    v0.15 release of Jane Street packages

    Arseniy Alekseyev announced

    We are pleased to announce the v0.15 release of Jane Street packages!

    This release comes with 41 new packages, and a large number of fixes and enhancements. The documentation for the individual packages will soon be available on v3.ocaml.org/packages, after some technical issues are fixed.

    The remainder of this e-mail highlights the main changes since the v0.14 release.

    Notable changes

    Re-structuring of Core.

    The most noticeable breaking change is the re-structuring of Core.

    In 0.14, Core is somewhat bloated and includes many modules that are barely ever used, many of which are Unix-specific. In 0.15, many of those modules moved to separate libraries, most of them to package~core_unix~, and core is now much smaller and no longer contains unix-specific code.

    The mapping between the new libraries and the old modules can be summarized by the contents of Core_compat library v0.14:

    module Command_unix = Core.Command
    module Date_unix = Core.Date
    module Filename_unix = Core.Filename
    module Signal_unix = Core.Signal
    module Sys_unix = Core.Sys
    module Core_thread = Core.Thread
    module Time_unix = Core.Time
    module Time_ns_unix = Core.Time_ns
    module Core_unix = Core.Unix
    module Version_util = Core.Version_util
    
    module Interval_lib = struct
      module Interval = Core.Interval
      module Interval_intf = Core.Interval_intf
    end
    
    module Time_interface = Core.Time_common
    
    Async: Monitor.try_with

    Monitor.try_with and related functions changed the defaults for their run and rest parameters. They used to default to ~~run:~Schedule ~rest:~Log~, but now they default to ~~run:~Now ~rest:~Raise~.

    Many other changes

    There are many changes and additions across 130+ existing packages, and unfortunately we don't maintain a changelog to list them all. The code for all of our packages is on our github, and if you're interested in the details of what changed in a particular package, you can inspect the diff between branches v0.14 and v0.15.

    New packages

    abstract_algebra: A small library describing abstract algebra concepts

    A library describing abstract algebra concepts. Currently, it includes Commutative_group and Vector_space.

    async_rpc_websocket: Library to serve and dispatch Async RPCs over websockets

    Library to serve and dispatch Async RPCs over websockets.

    Rpc_websocket makes it easy to serve and send Async RPCs with HTTP+Websocket underlying the transport. It also provides a mechanism to share the RPC implementations between a vanilla TCP server and a HTTP server.

    On the server side, the library detects when a websocket connection is established, and routes to an optionally provided vanilla HTTP handler when non-websocket traffic occurs.

    bigdecimal: Arbitrary-precision decimal based on Zarith

    A high-precision representation of decimal numbers as [mantissa * 10^exponent], where the mantissa is internally a [Bigint.t] and the exponent is an [int].

    cohttp_async_websocket: Websocket library for use with cohttp and async

    Websocket library for use with cohttp and async.

    Cohttp_async_websocket is a full-featured server-side websocket implementation, using Async as the concurrency library, and Cohttp for HTTP negotiation.

    It implements a large portion of RFC6445. The library has been hardened with many applications using it for several year, in conjunction with async-js and google-chrome.

    cohttp_static_handler: A library for easily creating a cohttp handler for static files

    Single page handlers are handlers that serve user specified JavaScript and css files along with a generated index page that loads those files.

    core_compat: Compatibility for core 0.14

    Compatibility wrapper to make it possible to have code compatible with both Core 0.14 and 0.15.

    env_config: Helper library for retrieving configuration from an environment variable

    The Env_config library is a helper for retrieving library and program configuration from an environment variable. Its goal is to make it easy to override a configuration that is loaded from disk, computed, or embedded in a library.

    file_path: A library for typed manipulation of UNIX-style file paths

    A library for typed manipulation of UNIX-style file paths.

    fuzzy_match: A library for fuzzy string matching

    A library for fuzzy string matching

    fzf: A library for running the fzf command line tool

    A library for running the fzf command line fuzzy matcher

    hardcaml_c: Hardcaml C Simulation Backend

    A fast C-based simulation backend for Hardcaml circuits.

    The library transparently compiles a Hardcaml Circuit to C code, which is in turn compiled and linked into the running executable. The generated simulation object can be used like any other cyclesim simulation.

    hardcaml_circuits: Hardcaml Circuits

    A small library of useful/interesting Hardcaml circuits.

    hardcaml_fixed_point: Hardcaml fixed point arithmetic

    Signed and Unsigned fixed point operations, with a full complement of rounding and overflow functionality.

    hardcaml_of_verilog: Convert Verilog to a Hardcaml design

    The opensource synthesis tool yosys is used to convert a verilog design to a JSON based netlist representation. This library can load the JSON netlist and build a hardcaml circuit.

    Code can also be generated to wrap the conversion process using Hardcaml interfaces.

    hardcaml_step_testbench: Hardcaml Testbench Monad

    A monad for interacting with Hardcaml.Cyclesim based simulations.

    Allows multiple control threads to interact with a simulation module, all of which are synchronised to the system clock.

    hardcaml_verify: Hardcaml Verification Tools

    Tools for verifying properties of Hardcaml circuits.

    Combinational circuits can be converted to 'conjunctive normal form' for input into SAT solvers via DIMAC files. Support for a few opensource solvers is integrated - minisat, picosat, Z3 - just ensure they are in your PATH.

    Circuits can also be converted to NuSMV format for advanced bounded and unbounded model checking tasks.

    hardcaml_verilator: Hardcaml Verilator Simulation Backend

    Very fast verilator-based simulations of Hardcaml circuits.

    This library transparently compiles a verilator-based shared library, and links it back to the running executable to be used as a Cyclesim simulation.

    hardcaml_xilinx: Hardcaml wrappers for Xilinx memory primitives

    The Hardcaml_xilinx library provides wrappers for Xilinx specific RAM and FIFO primitive blocks. In many cases a simulation model is provided.

    The Synthesis module implements various arithmetic and logical RTL components with Xilinx LUT primitives.

    hardcaml_xilinx_components: Hardcaml Xilinx component definitions

    A tool for reading Xilinx VHDL Unisim and XPM component definitions from a Vivado installation and generating Hardcaml interfaces automatically.

    hex_encode: Hexadecimal encoding library

    This library implements hexadecimal encoding and decoding

    hg_lib: A library that wraps the Mercurial command line interface

    A library that wraps the Mercurial command line interface.

    int_repr: Integers of various widths

    Integers of various widths.

    jsonaf: A library for parsing, manipulating, and serializing data structured as JSON

    A library for parsing, manipulating, and serializing data structured as JSON.

    krb: A library for using Kerberos for both Rpc and Tcp communication

    Jane Street's library for Kerberizing RPC connections so that

    • the server gets an authenticated principal (i.e. username) with every incoming connection, and
    • RPC communication may be encrypted, if necessary.

    magic-trace: Easy Intel Processor Trace Visualizer

    Magic-trace makes it easy to record and visualize Intel Processor Trace data for debugging tricky performance issues.

    ocaml-embed-file: Files contents as module constants

    Embed-file takes some files and generates code for an OCaml module defining string constants containing the contents of those files.

    ocaml_intrinsics: Intrinsics

    Provides functions to invoke amd64 instructions (such as clz,popcnt,rdtsc,rdpmc) when available, or compatible software implementation on other targets.

    ocaml-probes: USDT probes for OCaml: command line tool

    A tool for controlling user-space statically-defined tracing probes for OCaml. Experimental.

    ppx_css: A ppx that takes in css strings and produces a module for accessing the unique names defined within

    A ppx that takes in css strings and produces a module for accessing the unique names defined within.

    ppx_disable_unused_warnings: Expands [@disable_unused_warnings] into [@warning \"-20-26-32-33-34-35-36-37-38-39-60-66-67\"]

    Part of the Jane Street's PPX rewriters collection.

    ppx_ignore_instrumentation: Ignore Jane Street specific instrumentation extensions

    Ignore Jane Street specific instrumentation extensions from internal PPXs or compiler features not yet upstreamed.

    ppx_jsonaf_conv: [@@deriving] plugin to generate Jsonaf conversion functions

    Part of the Jane Street's PPX rewriters collection.

    ppx_typed_fields: GADT-based field accessors and utilities

    Part of the Jane Street's PPX rewriters collection.

    ppx_type_directed_value: Get [@@deriving]-style generation of type-directed values without writing a ppx

    Ppx_type_directed_value is a ppx that does [@@deriving]-style generation of type-directed values based on user-provided modules. The user-provided modules tell ppx_type_directed_value how to compose type-directed values (for example, combine type-directed values of the fields of a record to form a type-directed value for the record itself).

    This allows a wide variety of PPXs such as ppx_sexp_conv, ppx_compare, ppx_enumerate, etc. to be implemented with ppx_type_directed_value, but with some runtime cost.

    This PPX currently supports deriving type-directed values for records, ordinary & polymorphic variants and tuples. It also supports custom user-defined attributes on record and variant fields.

    profunctor: A library providing a signature for simple profunctors and traversal of a record

    This is a very small library which provides a signature for profunctor types and operations which can be used to traverse a record with them based on record_builder and the ppx_fields syntax extension.

    redis-async: Redis client for Async applications

    A client library for Redis versions 6 and higher.

    Provides a strongly-typed API with transparent (de)serialization for application-defined types.

    Supports client tracking and internally uses the RESP3 protocol.

    sexp_diff: Code for computing the diff of two sexps

    The code behind the [diff] subcommand of the Jane Street's [sexp] command line tool.

    sexp_grammar: Sexp grammar helpers

    Helpers for manipulating [Sexplib.Sexp_grammar] values.

    sexp_string_quickcheck: Quickcheck helpers for strings parsing to sexps

    This library provides quickcheck generators, helpers, and shrinkers for quickcheck-based tests that wish to exercise the concrete syntax of sexps, including escape sequences and comments.

    tracing: Tracing library

    Utilities for creating and parsing traces in Fuchsia Trace Format.

    username_kernel: An identifier for a user

    A string representation for a user, typically a UNIX username

    EmelleTV Show - 2022

    David Sancho announced

    I'm creating a post as a header from this season of EmelleTV in 2020. Will use this post to share announcements, new shows, gather feedback and invite you to watch and follow https://www.twitch.tv/emelletv!

    For the ones who doesn't know us, It's a streaming show that will happen once per month and will try to interview and talk casually about OCaml, Reason, ReScript and their communities. Inviting interesting engineers and ask silly questions about literally anything.

    If can't attend live, we publish the VOD in youtube under https://www.youtube.com/channel/UCvVVfCa7-nzSuCdMKXnNJNQ. You can re-watch some of the 2021 interviews, they were a ton of fun for me.

    It's made by myself and @fakenickels.

    Feel free to share any feedback, propose any guest or make fun of us ^^

    Open source editor for iOS, iPadOS and macOS

    Nathan Fallet announced

    Just released the app on the Play Store for Android: Play Store

    Feel free to give your feedback as well. I tried to make it like the iOS/macOS version. For now, the only missing feature is syntax highlighting, but I'm working on it (I still have a few bugs with it)

    The mysterious pointer in the runtime closure representation

    Deep in this thread, Yue Li Picasso announced

    Thanks for your replies @silene @zozozo ! Due to project interest I need to understand the runtime value representation. Now I released a little library for displaying runtime values in textual form: OInspect.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 283B2E00B8 for ; Tue, 12 Apr 2022 10:10:48 +0200 (CEST) Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none X-Ironport-Dmarc-Check-Result: validskip X-IronPort-AV: E=Sophos;i="5.90,253,1643670000"; d="scan'208,217";a="31268004" Received: from set.irisa.fr (HELO set) ([131.254.10.170]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Apr 2022 10:10:48 +0200 From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 12 Apr 2022 10:10:47 +0200 Message-ID: <87lewayb5k.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMDUgdG8gMTIsDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkxleGlGaSBp cyBoaXJpbmchDQpEw6l2ZWxvcHBldXIgcHJpbmNpcGFsIMOgIHBsZWluIHRlbXBzIGQnQWx0LUVy Z28gY2hleiBPQ2FtbFBybw0KVXNpbmcgYW4gZXh0ZXJuYWwgSmF2YVNjcmlwdCBmaWxlIGluIGpz X29mX29jYW1sDQpkaXNrdXZib3g6IHNtYWxsIHNldCBvZiBjcm9zcy1wbGF0Zm9ybSBDTEkgdG9v bHMNCk9sZCBDV04NCg0KDQpMZXhpRmkgaXMgaGlyaW5nIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2ItZnVsbHRpbWUtaW50ZXJuc2hpcC1wYXJpcy1sZXhpZmkt aXMtaGlyaW5nLzk2NDgvMT4NCg0KDQpBbGFpbiBGcmlzY2ggYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICDwn5OiIFtMZXhpRmldIGlzIGhpcmluZyENCg0KICDinJTvuI8gU29mdHdhcmUgRW5naW5l ZXIgKGZ1bGwtdGltZSk6IDxodHRwczovL2xua2QuaW4vZXZoa3hUZz4NCg0KICDinJTvuI8gU29m dHdhcmUgRGV2ZWxvcG1lbnQgSW50ZXJuc2hpcDogPGh0dHBzOi8vbG5rZC5pbi9nYi1iZERBOT4N Cg0KICBMZXhpRmkgaXMgYSBzb2Z0d2FyZSBlZGl0b3IsIGJhc2VkIGluIFBhcmlzLiBXZSBoYXZl IGJlZW4gaGFwcGlseQ0KICB1c2luZyBPQ2FtbCDwn5CqIGZvciBtb3JlIHRoYW4gMjAgeWVhcnMg aW4gb3VyIGVudGlyZSBzb2Z0d2FyZSBzdGFjaywNCiAgZnJvbSBiYWNrZW5kIGNvbXBvbmVudHMg dG8gVUkgKHdlYiAmIG5hdGl2ZSkgZnJvbnQtZW5kLCBhbmQgd2UNCiAgY29udHJpYnV0ZSBiYWNr IHRvIHRoZSBPQ2FtbCBjb21tdW5pdHkgKGNoZWNrIG91dCBvdXIgYmxvZyBwb3N0IDoNCiAgPGh0 dHBzOi8vd3d3LmxleGlmaS5jb20vYmxvZy9vY2FtbC9vY2FtbC1vcGVuLXNvdXJjZS8+KQ0KDQog IERvbid0IGhlc2l0YXRlIHRvIGNvbnRhY3QgbWUgZGlyZWN0bHkgaWYgeW91IHdhbnQgdG8gbGVh cm4gbW9yZSBhYm91dA0KICB0aGUgcG9zaXRpb25zIGJlZm9yZSBhcHBseWluZyENCg0KDQpbTGV4 aUZpXSA8aHR0cHM6Ly93d3cubGV4aWZpLmNvbT4NCg0KDQpEw6l2ZWxvcHBldXIgcHJpbmNpcGFs IMOgIHBsZWluIHRlbXBzIGQnQWx0LUVyZ28gY2hleiBPQ2FtbFBybw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9qb2ItZnVsbHRpbWUtcGFy aXMtZGV2ZWxvcHBldXItcHJpbmNpcGFsLWEtcGxlaW4tdGVtcHMtZGFsdC1lcmdvLWNoZXotb2Nh bWxwcm8vOTY2MC8xPg0KDQoNCkZhYnJpY2UgTGUgRmVzc2FudCBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFsdC1FcmdvIGVzdCBsJ3VuIGRlcyBzb2x2ZXVycyBT TVQgbGVzIHBsdXMgZWZmaWNhY2VzIHBvdXIgbGENCiAgdsOpcmlmaWNhdGlvbiBmb3JtZWxsZSBk ZSBjb2RlLiBJbCBlc3QgYWluc2kgdXRpbGlzw6kgZGVycmnDqHJlIGRlcw0KICBhdGVsaWVycyB0 ZWxzIHF1ZSBXaHkzLCBGcmFtYS1DIGV0IFNwYXJrLiBJbml0aWFsZW1lbnQgZMOpdmVsb3Bww6kg cGFyDQogIFN5bHZhaW4gQ29uY2hvbiBhdSBMUkksIGlsIGVzdCBhdWpvdXJkJ2h1aSBtYWludGVu dSBwYXIgT0NhbWxQcm8sDQogIGdyw6JjZSBhdXggZmluYW5jZW1lbnRzIGR1IENsdWIgQWx0LUVy Z28gKEFkYUNvcmUsIFRydXN0LWluLVNvZnQsDQogIFRoYWzDqHMsIE1FUkNFLCBDRUEgTGlzdCks IMOgIGRlcyBjb250cmF0cyBiaWxhdMOpcmF1eCBkJ8Opdm9sdXRpb24gZXQgw6ANCiAgZGVzIHBy b2pldHMgY29sbGFib3JhdGlmcy4NCg0KICBPQ2FtbFBybyBzb3VoYWl0ZSBhdWpvdXJkJ2h1aSBy ZWNydXRlciB1biBkw6l2ZWxvcHBldXIgcHJpbmNpcGFsIMOgDQogIHRlbXBzIHBsZWluIHBvdXIg QWx0LUVyZ28sIHBvdXIgY29tcGzDqXRlciBzb24gw6lxdWlwZSBtw6l0aG9kZXMNCiAgZm9ybWVs bGVzIGV0IGFjY8OpbMOpcmVyIGwnw6l2b2x1dGlvbiBkJ0FsdC1FcmdvLiAgRGlzcG9zYW50IGQn dW5lDQogIGV4cMOpcmllbmNlIGRhbnMgbGVzIG3DqXRob2RlcyBmb3JtZWxsZXMsIHNlcyBtaXNz aW9ucyBzZXJvbnQgOg0KDQogIOKAoiBkZSBkw6ljb3V2cmlyIGxlIHByb2pldCBBbHQtRXJnbyBl dCB0b3VzIHNlcyBjb21wb3NhbnRzIChwcm91dmV1ciwNCiAgICBpbnRlcmZhY2UgZ3JhcGhpcXVl LCBldGMuKSBldCBkJ2VuIGNvbXByZW5kcmUgbGUgZm9uY3Rpb25uZW1lbnQgw6ANCiAgICB0cmF2 ZXJzIGwnZXhwbG9yYXRpb24gZHUgY29kZSBldCBsYSBsZWN0dXJlIGQnYXJ0aWNsZXMNCiAgICBz Y2llbnRpZmlxdWVzOw0KICDigKIgZCfDqWxhYm9yZXIgbGEgcm9hZG1hcCBkZSBtYWludGVuYW5j ZSDDqXZvbHV0aXZlIGQnQWx0LUVyZ28sIGVuDQogICAgY29sbGFib3JhdGlvbiBhdmVjIGxlcyBt ZW1icmVzIGR1IENsdWIgQWx0LUVyZ28sIGV0IGRlIHByb3Bvc2VyIGRlcw0KICAgIGFtw6lsaW9y YXRpb25zIHF1aSBwb3Vycm9udCDDqnRyZSBmaW5hbmPDqWVzIGF1IHRyYXZlcnMgZGUgY29udHJh dHMNCiAgICBiaWxhdMOpcmF1eCBvdSBkZSBwcm9qZXRzIGNvbGxhYm9yYXRpZnM7DQogIOKAoiBk ZSBwYXJ0aWNpcGVyIGF2ZWMgbCfDqXF1aXBlIMOgIGxhIG1haW50ZW5hbmNlIGNvcnJlY3RpdmUg ZCdBbHQtRXJnbw0KICAgIGV0IGRlIGZvdXJuaXIgZHUgc3VwcG9ydCBhdXggbWVtYnJlcyBkdSBD bHViIEFsdC1FcmdvOw0KICDigKIgZGUgcGFydGljaXBlciDDoCBsJ2VuY2FkcmVtZW50IGRlIHN0 YWdlcyBldCBkZSB0aMOoc2VzIENJRlJFIGF1dG91cg0KICAgIGQnQWx0LUVyZ28gZXQgZGVzIHNv bHZldXJzIFNNVCBlbiBnw6luw6lyYWw7DQogIOKAoiBkZSBzdWl2cmUgbCdhY3R1YWxpdMOpIGRl cyBzb2x2ZXVycyBTTVRzIGV0IGRlcyB0cmF2YXV4IHNjaWVudGlmaXF1ZXMNCiAgICBjb25uZXhl cywgZXQgZGUgbWFpbnRlbmlyIGRlcyBjb2xsYWJvcmF0aW9ucyBhdmVjIGxlcyBleHBlcnRzDQog ICAgYWNhZMOpbWlxdWVzIGR1IGRvbWFpbmU7DQoNCiAgSW50w6lncsOpIGF1IHNlaW4gZGUgbCfD qXF1aXBlIE3DqXRob2RlcyBGb3JtZWxsZXMgZCdPQ2FtbFBybywgaWwNCiAgYsOpbsOpZmljaWVy YSBkZSBsZXVyIGV4cMOpcmllbmNlIGV0IGxldXIgZmVyYSBiw6luw6lmaWNpZXIgZGUgc29uDQog IGV4cGVydGlzZSBjcm9pc3NhbnRlIGRhbnMgbCd1dGlsaXNhdGlvbiBkJ0FsdC1FcmdvLiBPdXRy ZSBsYQ0KICBtYWludGVuYW5jZSBkJ0FsdC1FcmdvLCBsJ8OpcXVpcGUgTcOpdGhvZGVzIEZvcm1l bGxlcyBkJ09DYW1sUHJvDQogIHBhcnRpY2lwZSDDoCBkaXZlcnNlcyBhY3Rpdml0w6lzOg0KDQog IOKAoiBEw6l2ZWxvcHBlbWVudCBkJ291dGlscyBvcGVuLXNvdXJjZSBwb3VyIGxlcyBtw6l0aG9k ZXMgZm9ybWVsbGVzLCB0ZWxzDQogICAgcXVlIERvbG1lbiwgTWF0bGEsIGV0Yy4NCiAg4oCiIEV4 cGVydGlzZXMgc3VyIFdoeU1MLCBUTEEsIENvcSwgZXQgYXV0cmVzIGxhbmdhZ2VzIGRlIHNww6lj aWZpY2F0aW9uDQogICAgZXQgZGUgdsOpcmlmaWNhdGlvbjsNCiAg4oCiIENlcnRpZmljYXRpb24g ZGUgbG9naWNpZWxzIHBvdXIgbGVzIENyaXTDqHJlcyBDb21tdW5zIChFQUw2IGV0IHBsdXMpDQog IOKAoiBTcMOpY2lmaWNhdGlvbiBldCB2w6lyaWZpY2F0aW9uIGZvcm1lbGxlIGRlIHNtYXJ0IGNv bnRyYWN0cyAoU29saWRpdHksDQogICAgZXRjLikNCg0KICBMZXMgYnVyZWF1eCBkJ09DYW1sUHJv IHNvbnQgZGFucyBsZSAxNMOobWUgYXJyb25kaXNzZW1lbnQgZGUgUGFyaXMNCiAgKEFsw6lzaWEp LiBMJ2VudHJlcHJpc2UgZXN0IGNvbm51ZSBwb3VyIHNvbiDDqXF1aXBlIHN5bXBhdGhpcXVlLCBz b24NCiAgZXhjZWxsZW5jZSB0ZWNobmlxdWUsIHNhIHByb2R1Y3Rpdml0w6ksIHNlcyB2YWxldXJz IGV0IHNvbiDDqXRoaXF1ZS4NCg0KICBTaSBjZSBwb3N0ZSB2b3VzIGludMOpcmVzc2UsIG4naMOp c2l0ZXogcGFzIMOgIGVudm95ZXIgdm90cmUgQ1Ygw6A6DQoNCiAgY29udGFjdEBvY2FtbHByby5j b20NCg0KICBQb3VyIHBsdXMgZCdpbmZvcm1hdGlvbnMgc3VyIE9DYW1sUHJvOg0KDQogIDxodHRw czovL3d3dy5vY2FtbHByby5jb20vPg0KDQogIFBvdXIgcGx1cyBkJ2luZm9ybWF0aW9ucyBzdXIg QWx0LUVyZ286DQoNCiAgPGh0dHBzOi8vYWx0LWVyZ28ub2NhbWxwcm8uY29tLz4NCg0KICBQb3Vy IHBsdXMgZCdpbmZvcm1hdGlvbnMgc3VyIGxlIENsdWIgQWx0LUVyZ286DQoNCiAgPGh0dHBzOi8v d3d3Lm9jYW1scHJvLmNvbS9jbHViLWFsdC1lcmdvPg0KDQoNClVzaW5nIGFuIGV4dGVybmFsIEph dmFTY3JpcHQgZmlsZSBpbiBqc19vZl9vY2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91c2luZy1h bi1leHRlcm5hbC1qYXZhc2NyaXB0LWZpbGUtaW4tanMtb2Ytb2NhbWwvOTY2MS8xPg0KDQoNCkpv aG4gV2hpdGluZ3RvbiBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBhIGJlZ2lubmVyIGF0IGJvdGgg SmF2YXNjcmlwdCBhbmQgYGpzX29mX29jYW1sJywgc28gSSBtYXkgYmUNCiAgbWl4aW5nIHVwIGFs bCBzb3J0cyBvZiBtaXN0YWtlcyBhbmQgbWlzY29uY2VwdGlvbnMgaGVyZS4NCg0KICBJIGhhdmUg Y29tcGlsZWQgdXAgYW4gZXhpc3RpbmcgcHJvamVjdCwgbXkgY29tbWFuZCBsaW5lIFBERiB0b29s cywNCiAgdXNpbmcgYGpzX29mX29jYW1sJywgYW5kIGFsbCBpcyB3ZWxsOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgJCBub2RlIGNwZGYuanMgLWluZm8gaGVsbG8ucGRmDQogIOKUgiBFbmNy eXB0aW9uOiBOb3QgZW5jcnlwdGVkDQogIOKUgiBQZXJtaXNzaW9uczoNCiAg4pSCIExpbmVhcml6 ZWQ6IGZhbHNlDQogIOKUgiBWZXJzaW9uOiAxLjENCiAg4pSCIFBhZ2VzOiAxDQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIExpa2UgbWFnaWMhIEJ1dCBJIGhhZCB0byBjb21tZW50IG91dCB0aGUgcGFy dHMgb2YgbXkgY29kZSB3aGljaCB1c2UNCiAgZXh0ZXJuYWwgQyBjb2RlIG9mIGNvdXJzZSAtIHRo YXQgaXMgemxpYiBhbmQgc29tZSBlbmNyeXB0aW9uDQogIHByaW1pdGl2ZXMuIFNvIG5vdyBJIHdp c2ggdG8gYmluZCBqYXZhc2NyaXB0IGxpYnJhcmllcyBmb3IgdGhvc2UuIEkgYW0NCiAgZXhwZXJp bWVudGluZyB3aXRoIGEgc2ltcGxlIGxpYnJhcnkgb2YgbXkgb3duLCBmaXJzdCwgd2hpY2ggaXMg Z2l2ZW4NCiAgb24gdGhlIGNvbW1hbmQgbGluZSB0byBganNfb2Zfb2NhbWwnIGFzIGBmb29tb2Qu anMnOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZm9vID0gNDI7DQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEkgY2FuIGdldCB0byB0aGlzIGdsb2JhbCB2YXJpYWJsZSBlYXNpbHkgZnJvbSBP Q2FtbDoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBmb28gPSBKcy5VbnNhZmUuZ2xv YmFsIyMuZm9vDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEJ1dCBub3cgSSB3YW50IHRvIGRvIHRo aW5ncyBiZXR0ZXIsIGFuZCBJIGNoYW5nZSBgZm9vbW9kLmpzJyB0bzoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIGV4cG9ydHMuZm9vID0gNDI7DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEhv dyBjYW4gSSBnZXQgdG8gdGhhdD8gR2l2aW5nIGBmb29tb2QuanMnIG9uIHRoZSBganNfb2Zfb2Nh bWwnIGNvbW1hbmQNCiAgbGluZSBpbmNsdWRlcyB0aGUgY29udGVudHMgb2YgYGZvb21vZC5qcycg aW4gc29tZSB3YXksIGJ1dCBkb2VzIG5vdA0KICBjb250YWluIHRoZSBzdHJpbmcgYGZvb21vZCcs IHNvIEknbSBub3Qgc3VyZSBob3cgdG8gZ2V0IHRvIHRoZQ0KICBmb29tb2QncyB2YXJpYWJsZXMg YW5kIGZ1bmN0aW9ucy4gSG93IHRvIEkgYWNjZXNzIHRoZW0/IEluIHRoZSBub2RlDQogIFJFUEws IEkgY2FuIHNpbXBseSBkbzoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCID4gZm9vbW9kID0g cmVxdWlyZSgnLi9mb29tb2QuanMnKTsNCiAg4pSCIHsgZm9vOyA0MiB9DQogIOKUgiA+IGZvb21v ZC5mb287DQogIOKUgiA0Mg0KICDilJTilIDilIDilIDilIANCg0KICBJIGhhdmUgcmVhZCB0aGUg YGpzX29mX29jYW1sJyBoZWxwIHBhZ2Ugb24gaG93IHRvIGJpbmQgSlMgbW9kdWxlczoNCg0KICA8 aHR0cHM6Ly9vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9sYXRlc3QvbWFudWFsL2JpbmRpbmdzPg0K DQogIEkgaW1hZ2luZSBpZiBJIGNvdWxkIGdldCBvdmVyIHRoaXMgaHVtcCwgYWxsIHRoZSByZXN0 IG9mIHRoZQ0KICBpbmZvcm1hdGlvbiBJIG5lZWQgd2lsbCBiZSB0aGVyZS4NCg0KDQpOaWNvbMOh cyBPamVkYSBCw6RyIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE5vdCBleGFjdGx5 IHdoYXQgeW91IGFza2VkLCBidXQgaWYgeW91IGp1c3Qgd2FudCB0byBwcm92aWRlIGEgSlMNCiAg dmVyc2lvbiBvZiBzb21lIEMgcHJpbWl0aXZlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBl eHRlcm5hbCBmb28gOiB1bml0IC0+IGludCA9ICJjYW1sX2ZvbyINCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgeW91IGNhbiBkbyB0aGlzIGJ5IHdyaXRpbmcgdGhlIGZvbGxvd2luZyBpbiB5b3VyIGAu anMnIGZpbGU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAvL1Byb3ZpZGVzOiBjYW1sX2Zv bw0KICDilIIgZnVuY3Rpb24gY2FtbF9mb28oKSB7DQogIOKUgiAgIHJldHVybiA0MjsNCiAg4pSC IH0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlbiBganNfb2Zfb2NhbWwnIHdpbGwgYXV0b21h dGljYWxseSByZXBsYWNlIGNhbGxzIHRvIHRoZSBleHRlcm5hbA0KICBmdW5jdGlvbiBieSBhIGNh bGwgdG8gaXRzIEpTIGltcGxlbWVudGF0aW9uLg0KDQogIFRoaXMgaXMgdGhlIHNhbWUgbWVjaGFu aXNtIHVzZWQgYnkgYGpzX29mX29jYW1sJyB0byBpbXBsZW1lbnQgaXRzIG93bg0KICBKUyB2ZXJz aW9uIG9mIHRoZSBPQ2FtbCBydW50aW1lLCBzZWUgZWcNCg0KICA8aHR0cHM6Ly9naXRodWIuY29t L29jc2lnZW4vanNfb2Zfb2NhbWwvYmxvYi8zODUwYTY3YjFjYjAwY2ZkMmVlNDM5OWNmMWUyOTQ4 MDYyODg0YjkyL3J1bnRpbWUvYmlnYXJyYXkuanMjTDMyOC1MMzM1Pg0KDQoNCmRpc2t1dmJveDog c21hbGwgc2V0IG9mIGNyb3NzLXBsYXRmb3JtIENMSSB0b29scw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tZGlza3V2Ym94LXNtYWxsLXNldC1vZi1jcm9zcy1wbGF0Zm9ybS1jbGktdG9vbHMvOTY2 My8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICpUTERSKjoNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiAkIG9wYW0gdXBkYXRlDQogIOKUgiAkIG9wYW0gaW5zdGFsbCBkaXNrdXZi b3gNCiAg4pSCIA0KICDilIIgJCBkaXNrdXZib3ggY29weS1kaXIgLS1tb2RlIDc1NSBzcmMxLyBz cmMyLyBkZXN0Lw0KICDilIIgJCBkaXNrdXZib3ggY29weS1maWxlIC0tbW9kZSA0MDAgc3JjL2Eg ZGVzdC9iDQogIOKUgiAkIGRpc2t1dmJveCBjb3B5LWZpbGUtaW50byBzcmMxL2Egc3JjMi9iIGRl c3QvDQogIOKUgiAkIGRpc2t1dmJveCB0b3VjaC1maWxlIHgveS96DQogIOKUgiANCiAg4pSCICQg ZGlza3V2Ym94IGZpbmQtdXAgLiBfYnVpbGQNCiAg4pSCIFo6L3NvdXJjZS9fYnVpbGQNCiAg4pSC IA0KICDilIIgJCBkaXNrdXZib3ggdHJlZSAtLW1heC1kZXB0aCAyIC0tZW5jb2Rpbmc9VVRGLTgg Lg0KICDilIIgLg0KICDilIIg4pSc4pSA4pSAIENIQU5HRVMubWQNCiAg4pSCIOKUnOKUgOKUgCBS RUFETUUubWQNCiAg4pSCIOKUnOKUgOKUgCBfYnVpbGQvDQogIOKUgiDilIIgICDilJzilIDilIAg ZGVmYXVsdC8NCiAg4pSCIOKUgiAgIOKUnOKUgOKUgCBpbnN0YWxsLw0KICDilIIg4pSCICAg4pSU 4pSA4pSAIGxvZw0KICDilJTilIDilIDilIDilIANCg0KICAqUHJvYmxlbSo6IFdoZW4gd3JpdGlu ZyBjcmFtIHRlc3RzLCBEdW5lIHJ1bGVzIGFuZCBPcGFtIGJ1aWxkIHN0ZXBzLA0KICBvZnRlbiB3 ZSBkZWZhdWx0IHRvIHVzaW5nIEdOVSBiaW5hcmllcyAoYC91c3IvYmluLyonKSBhdmFpbGFibGUg b24NCiAgTGludXggKGV4LiBgL3Vzci9iaW4vY3AgLVInKS4gVW5mb3J0dW5hdGVseSB0aGVzZSBj b21tYW5kcyByYXJlbHkgd29yaw0KICBvbiBXaW5kb3dzLCBhbmQgYXMgYSBjb25zZXF1ZW5jZSBX aW5kb3dzIE9DYW1sIGRldmVsb3BlcnMgYXJlIGZvcmNlZA0KICB0byBtYWludGFpbiBDeWd3aW4g b3IgTVNZUzIgaW5zdGFsbGF0aW9ucyB0byBnZXQgR05VIHRvb2xpbmcuDQoNCiAgKlNvbHV0aW9u KjogUHJvdmlkZSBzb21lIG9mIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgZm9yIFdpbmRvd3MgYW5k DQogIG1hY09TIHRoYXQgdGhlIEdOVSBiaW5hcmllcyBpbiBgL3Vzci9iaW4vKicgZG8gaW4gTGlu dXguDQoNCiAgYGRpc2t1dmJveCcgaXMgYSBzaW5nbGUgYmluYXJ5IHRoYXQgdG9kYXkgcHJvdmlk ZXMgYW4gYW5hbG9nIGZvciBhDQogIHZlcnkgc21hbGwgbnVtYmVyIG9mIGJpbmFyaWVzIHRoYXQg SSBoYXZlIG5lZWRlZCBpbiB0aGUgRGlza3V2IFdpbmRvd3MNCiAgT0NhbWwgZGlzdHJpYnV0aW9u LiBJdCBpcyBsaWJlcmFsbHkgbGljZW5zZWQgdW5kZXIgQXBhY2hlIHYyLjAuICpXaXRoDQogIHlv dXIgUFJzIGl0IGNvdWxkIGVtdWxhdGUgbXVjaCBtb3JlISoNCg0KICBgZGlza3V2Ym94JyBoYXMg Q0kgdGVzdGluZyBmb3IgV2luZG93cywgbWFjT1MgYW5kIExpbnV4LiBVc2FnZSBhbmQNCiAgaGVs cCBhcmUgYXZhaWxhYmxlIGluIHRoZSBkaXNrdXZib3ggUkVBRE1FOg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL2Rpc2t1di9kaXNrdXZib3gjZGlza3V2LWJveD4NCg0KICAqYGRpc2t1dmJveCcgYWxz byBoYXMgYSBPQ2FtbCBsaWJyYXJ5LCBidXQgY29uc2lkZXIgdGhlIEFQSSB1bnN0YWJsZQ0KICAg dW50aWwgdmVyc2lvbiAxLjAuKg0KDQogIEFsdGVybmF0aXZlczoNCiAg4oCiIFRoZXJlIGFyZSBz b21lIHNoZWxsIHNjcmlwdGluZyB0b29scyBsaWtlIFtzaGV4cF0gYW5kIFtmZWF0aGVyXSB0aGF0 DQogICAgZ2l2ZSB5b3UgUE9TSVggcGlwZXMgaW4gT0NhbWwtZnJpZW5kbHkgc3ludGF4LiBJIGZl ZWwgdGhlc2UNCiAgICBjb21wbGVtZW50IERpc2t1diBCb3guDQogIOKAoiBEdW5lIGV4cG9zZXMg YChjb3B5KScgdG8gY29weSBhIGZpbGUgaW4gRHVuZSBydWxlczsgdGhlb3JldGljYWxseQ0KICAg IG1vcmUgb3BlcmF0aW9ucyBjb3VsZCBiZSBhZGRlZC4NCg0KICBJbnRlcm5hbGx5IGBkaXNrdXZi b3gnIGlzIGEgd3JhcHBlciBvbiB0aGUgZXhjZWxsZW50IFtib3MgLSBCYXNpYyBPUw0KICBpbnRl cmFjdGlvbl0gbGlicmFyeS4NCg0KDQpbc2hleHBdIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0 cmVldC9zaGV4cD4NCg0KW2ZlYXRoZXJdIDxodHRwczovL2dpdGh1Yi5jb20vY2hhcmxlc2V0Yy9m ZWF0aGVyPg0KDQpbYm9zIC0gQmFzaWMgT1MgaW50ZXJhY3Rpb25dDQo8aHR0cHM6Ly9lcnJhdGlx dWUuY2gvc29mdHdhcmUvYm9zL2RvYy9Cb3MvaW5kZXguaHRtbD4NCg0KQWNrbm93bGVkZ2VtZW50 cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VGhlIGZpcnN0IGltcGxlbWVudGF0aW9ucyBvZiBEaXNrdXYgQm94IHdlcmUgaW1wbGVtZW50ZWQg d2l0aCB0aGUNCiAgYXNzaXN0YW5jZSBvZiB0aGUgW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb24g KE9DU0YpXSwgYSBzdWItZm91bmRhdGlvbg0KICBvZiB0aGUgW0lOUklBIEZvdW5kYXRpb25dLg0K DQogIFR3byBPQ2FtbCBsaWJyYXJpZXMgKFtib3NdIGFuZCBbY21kbGluZXJdKSBhcmUgZXNzZW50 aWFsIHRvIERpc2t1dg0KICBCb3g7IHRoZXNlIGxpYnJhcmllcyB3ZXJlIGNyZWF0ZWQgYnkgW0Rh bmllbCBCw7xuemxpXSAoQGRidWVuemxpKSAuDQoNCg0KW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRp b24gKE9DU0YpXSA8aHR0cDovL29jYW1sLXNmLm9yZz4NCg0KW0lOUklBIEZvdW5kYXRpb25dIDxo dHRwczovL3d3dy5pbnJpYS5mcj4NCg0KW2Jvc10gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3 YXJlL2Jvcz4NCg0KW2NtZGxpbmVyXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21k bGluZXI+DQoNCltEYW5pZWwgQsO8bnpsaV0gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3Byb2ZpbGU+ DQoNCg0KRXhhbXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBmb2xsb3dp bmcgYXJlIGV4YW1wbGVzIHRoYXQgaGF2ZSBiZWVuIGNvbmRlbnNlZCBmcm9tIHRoZQ0KICBbZGlz a3V2Ym94IFJFQURNRS5tZF0g4oCmDQoNCg0KW2Rpc2t1dmJveCBSRUFETUUubWRdIDxodHRwczov L2dpdGh1Yi5jb20vZGlza3V2L2Rpc2t1dmJveCNkaXNrdXYtYm94Pg0KDQpVc2luZyBpbiBEdW5l IGNyYW0gdGVzdHMNCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg JCBpbnN0YWxsIC1kIGEvYi9jL2QvZS9mDQogIOKUgiAkIGluc3RhbGwgLWQgYS9iMi9jMi9kMi9l Mi9mMg0KICDilIIgJCBpbnN0YWxsIC1kIGEvYjIvYzMvZDMvZTMvZjMNCiAg4pSCICQgaW5zdGFs bCAtZCBhL2IyL2MzL2Q0L2U0L2Y0DQogIOKUgiAkIGluc3RhbGwgLWQgYS9iMi9jMy9kNC9lNS9m NQ0KICDilIIgJCBpbnN0YWxsIC1kIGEvYjIvYzMvZDQvZTUvZjYNCiAg4pSCICQgdG91Y2ggYS9i L3gNCiAg4pSCICQgdG91Y2ggYS9iL2MveQ0KICDilIIgJCB0b3VjaCBhL2IvYy9kL3oNCiAg4pSC IA0KICDilIIgJCBkaXNrdXZib3ggdHJlZSBhIC0tbWF4LWRlcHRoIDEwIC0tZW5jb2RpbmcgVVRG LTgNCiAg4pSCIGENCiAg4pSCIOKUnOKUgOKUgCBiLw0KICDilIIg4pSCICAg4pSc4pSA4pSAIGMv DQogIOKUgiDilIIgICDilIIgICDilJzilIDilIAgZC8NCiAg4pSCIOKUgiAgIOKUgiAgIOKUgiAg IOKUnOKUgOKUgCBlLw0KICDilIIg4pSCICAg4pSCICAg4pSCICAg4pSCICAg4pSU4pSA4pSAIGYv DQogIOKUgiDilIIgICDilIIgICDilIIgICDilJTilIDilIAgeg0KICDilIIg4pSCICAg4pSCICAg 4pSU4pSA4pSAIHkNCiAg4pSCIOKUgiAgIOKUlOKUgOKUgCB4DQogIOKUgiDilJTilIDilIAgYjIv DQogIOKUgiAgICAg4pSc4pSA4pSAIGMyLw0KICDilIIgICAgIOKUgiAgIOKUlOKUgOKUgCBkMi8N CiAg4pSCICAgICDilIIgICAgICAg4pSU4pSA4pSAIGUyLw0KICDilIIgICAgIOKUgiAgICAgICAg ICAg4pSU4pSA4pSAIGYyLw0KICDilIIgICAgIOKUlOKUgOKUgCBjMy8NCiAg4pSCICAgICAgICAg 4pSc4pSA4pSAIGQzLw0KICDilIIgICAgICAgICDilIIgICDilJTilIDilIAgZTMvDQogIOKUgiAg ICAgICAgIOKUgiAgICAgICDilJTilIDilIAgZjMvDQogIOKUgiAgICAgICAgIOKUlOKUgOKUgCBk NC8NCiAg4pSCICAgICAgICAgICAgIOKUnOKUgOKUgCBlNC8NCiAg4pSCICAgICAgICAgICAgIOKU giAgIOKUlOKUgOKUgCBmNC8NCiAg4pSCICAgICAgICAgICAgIOKUlOKUgOKUgCBlNS8NCiAg4pSC ICAgICAgICAgICAgICAgICDilJzilIDilIAgZjUvDQogIOKUgiAgICAgICAgICAgICAgICAg4pSU 4pSA4pSAIGY2Lw0KICDilJTilIDilIDilIDilIANCg0KDQpVc2luZyBpbiBPcGFtIGBidWlsZCcg c3RlcHMNCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgYnVpbGQ6IFsNCiAg4pSCICAgWyJkaXNrdXZib3giICJjb3B5LWZpbGUtaW50byIgImFzc2V0 cy9pY29uLnBuZyIgImFzc2V0cy9wdWJsaWMuZ3BnIiAiJXtfOnNoYXJlfSUiXQ0KICDilIIgXQ0K ICDilJTilIDilIDilIDilIANCg0KDQpVc2luZyBpbiBEdW5lIHJ1bGVzDQrilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIChydWxlDQogIOKUgiAgKHRhcmdldHMgZGlza3V2Ym94LmNvcnJlY3Rl ZC5tbCBkaXNrdXZib3guY29ycmVjdGVkLm1saSkNCiAg4pSCICAoZGVwcw0KICDilIIgICAoOmxp Y2Vuc2UgJXtwcm9qZWN0X3Jvb3R9L2V0Yy9saWNlbnNlLWhlYWRlci50eHQpDQogIOKUgiAgICg6 Y29uZiAgICAle3Byb2plY3Rfcm9vdH0vZXRjL2hlYWRhY2hlLmNvbmYpKQ0KICDilIIgIChhY3Rp b24NCiAg4pSCICAgKHByb2duDQogIOKUgiAgICAocnVuIGRpc2t1dmJveCBjb3B5LWZpbGUgLW0g NjQ0IGRpc2t1dmJveC5tbCAgZGlza3V2Ym94LmNvcnJlY3RlZC5tbCkNCiAg4pSCICAgIChydW4g ZGlza3V2Ym94IGNvcHktZmlsZSAtbSA2NDQgZGlza3V2Ym94Lm1saSBkaXNrdXZib3guY29ycmVj dGVkLm1saSkNCiAg4pSCICAgIChydW4gaGVhZGFjaGUgLWggJXtsaWNlbnNlfSAtYyAle2NvbmZ9 ICV7dGFyZ2V0c30pDQogIOKUgiAgICAocnVuIG9jYW1sZm9ybWF0IC0taW5wbGFjZSAtLWRpc2Fi bGUtY29uZi1maWxlcyAtLWVuYWJsZS1vdXRzaWRlLWRldGVjdGVkLXByb2plY3QgJXt0YXJnZXRz fSkpKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEg bWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0 IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQog IElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBt YXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQg bWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0K W3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNT IGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24v Y3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2Ft bC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9t bWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News
    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id A6628E02B4 for ; Tue, 19 Apr 2022 07:35:08 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=TiN5=U5=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: kFHjX2GJZcffcdY01LYRPDPDVNzFU7WbNjybwK4NA/gUncriAgRK9lq7SCm/q4nhM58dXDUpQp 1vPkXhG28/RogTVqu7Wq2aB9F7YPcBvYnVugNyIDDQ2UDi+hlO9TNo7P0gvANqhGnMVLkGGh0M fS42B9l1HNu3dKxo7y7kjizhjTdEqChB61OGCnaGB6ChP955S8ckTdhNf91pg/W5p0PEifGl4w DpcxK7PlpOrL6FF/e50dHxF8P7YjuVurXMspObng8MQm7LbjpzkCqE+f3H3Lc4s7W/M3jl4QZw qymml7rqDz3CfDe+RZr/LZ94 X-IPAS-Result: =?us-ascii?q?A0DaAABlSV5imCIeaIFahARfKBkBZFctBwhDhFSOTAGCS?= =?us-ascii?q?olPkzOBEQNfAQMBDSwBDgUBAgQBAYIPgnQCFgYzAQSEMwIeBgEFMxMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEJCwkHBgwFEA4FP?= =?us-ascii?q?GRkBIFLBIF0CzQNgiITDAwDA4N3ARYFBgpHHiMDFAcDAgQNARcBHgMBEwESG?= =?us-ascii?q?QGCDF4BgxkEAQqOZJwRgTGBATuDFAEDAxAPhCKBZSSBGYYWWEoBgwSEGCkQg?= =?us-ascii?q?VVEg1A9Am6CTBcBAQEBAYEjBQERAgEIIS2DIIJlBJsPJQ44Bg8cExYFCRMVB?= =?us-ascii?q?QEHDBACBQFQCDgBIx0OCRUFBykLCwItA4xPhUwDJwOPDokkgl2RRhljNAeDT?= =?us-ascii?q?IE8BgyIK4EgiyaBVHKHMYN0gU+KapgmIZY9IIkegRmCR5Q9BA+FKIFOKmsjc?= =?us-ascii?q?DMaMIJ4AQEBMQlFAQMCDQECAgMBAgECCQEBAo4pFoNQe4FpgXU7hUw/NAIBA?= =?us-ascii?q?TQCBgEKAQEDCYVjAQEFEwsBjHNeAQE?= IronPort-PHdr: A9a23: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 dGJ5sq2ow== IronPort-Data: A9a23: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 77s IronPort-HdrOrdr: A9a23:b43ZYq0ukObFgUkx3TyIiwqjBLUkLtp133Aq2lEZdPU1SKylfq +V88jzuSWftN9zYhAdcLK7VpVoKEm0nfVICOIqUYtKMjOKhEKYaKlcqaHizzfjFyCWzJ8/6Y 5QN45kBpnVBVh+5PyKhTVQ/uxQouW6zA== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,271,1643670000"; d="scan'208,217";a="11823109" X-MGA-submission: =?us-ascii?q?MDG8tixO5aMwOCuC6v4SkVZlKg8+yT/p+rNp+s?= =?us-ascii?q?IsxX5wJZxPgiScUIq/nzXHVX3B896l76RhrEPSI1GizkXae6ZkBzU/9I?= =?us-ascii?q?noN4yxFMHJq5bClZXJ8QRB01aaTd8lBFOsdG54ZNXXnQVDpXoGqhdwyJ?= =?us-ascii?q?oK2Xnh8Zca7NZMIffCoFVNXw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Apr 2022 07:35:04 +0200 Received: from set (unknown [109.190.253.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D5A7E564834; Tue, 19 Apr 2022 07:35:01 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 19 Apr 2022 07:34:49 +0200 Message-ID: <87a6chiqkm.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 19 07:35:02 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.290052, queueID=95E52564835 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMTIgdG8gMTksDQoyMDIyLg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkx3dCBpbmZv cm1hbCB1c2VyIHN1cnZleQ0KcHltbF9iaW5kZ2VuOiBhIENMSSBhcHAgdG8gZ2VuZXJhdGUgUHl0 aG9uIGJpbmRpbmdzIGRpcmVjdGx5IGZyb20gT0NhbWwgdmFsdWUgc3BlY2lmaWNhdGlvbnMNCkNy ZWF0aW5nIGEgbGlicmFyeSBmb3IgdXNlIGZyb20gSlMgd2l0aCBqc19vZl9vY2FtbA0Kb2NhbWwt bHNwLXNlcnZlciAxLjExLjANCk9DYW1sIHN1bW1lciBzY2hvb2wgaW4gU3BhaW4sIGNhbGwgZm9y IGluZHVzdHJ5IHNwZWFrZXJzDQpEdW5lIDMuMS4wDQpPbGQgQ1dODQoNCg0KTHd0IGluZm9ybWFs IHVzZXIgc3VydmV5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2x3dC1pbmZvcm1hbC11c2VyLXN1cnZleS85NjY2LzE+DQoNCg0KUmFw aGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSW4gb3JkZXIgdG8g bWFrZSBzb21lIGRlY2lzaW9ucyByZWxhdGluZyB0byB0aGUgbWFpbnRlbmFuY2Ugb2YgTHd0LA0K ICBJJ2QgbGlrZSB0byBrbm93IGEgbGl0dGxlIGJpdCBtb3JlIGFib3V0IGhvdyB0aGUgbGlicmFy eSBpcyB1c2VkIGluDQogIHRoZSB3aWxkLiBEbyBub3QgaGVzaXRhdGUgdG8gcmVzcG9uZCB0byB0 aGUgcG9sbCBhbmQvb3IgYXMgYSBtZXNzYWdlDQogIGluIHRoaXMgdGhyZWFkLCBvciBldmVuIHRv IGNvbnRhY3QgbWUgdmlhIG90aGVyIG1lYW5zIGluIGNhc2UgZGlzY3Vzcw0KICBpcyBub3QgeW91 ciBqYW0uDQoNCiAgL0VkaXRvcuKAmXMgbm90ZTogcGxlYXNlIGZvbGxvdyB0aGUgbGluayBhYm92 ZSB0byByZXBseSB0byB0aGUgc3VydmV5Li8NCg0KDQpweW1sX2JpbmRnZW46IGEgQ0xJIGFwcCB0 byBnZW5lcmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkgZnJvbSBPQ2FtbCB2YWx1ZSBzcGVj aWZpY2F0aW9ucw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHlt bC1iaW5kZ2VuLWEtY2xpLWFwcC10by1nZW5lcmF0ZS1weXRob24tYmluZGluZ3MtZGlyZWN0bHkt ZnJvbS1vY2FtbC12YWx1ZS1zcGVjaWZpY2F0aW9ucy84Nzg2Lzc+DQoNCg0KQ29udGludWluZyB0 aGlzIHRocmVhZCwgUnlhbiBNb29yZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEkgd3JvdGUgYSBbYmxvZyBwb3N0XSBwcm92aWRpbmcgYW4gaW50cm9kdWN0aW9uIHRvIGBweW1s X2JpbmRnZW4nLiAgSXQNCiAgZ2l2ZXMgYW4gaW50cm8gaW4gYSBzbGlnaHRseSBkaWZmZXJlbnQg c3R5bGUgYXMgY29tcGFyZWQgdG8gdGhlIFtkb2NzXQ0KICBhbmQgdGhlIFtleGFtcGxlc10sIGFu ZCBpbmNsdWRlcyBzb21lIG9mIHRoZSBsYXRlc3QgZmVhdHVyZXMgSSd2ZSBiZWVuDQogIHdvcmtp bmcgb24uDQoNCg0KW2Jsb2cgcG9zdF0NCjxodHRwczovL3d3dy50ZW5kZXJpc3RoZWJ5dGUuY29t L2Jsb2cvMjAyMi8wNC8xMi9vY2FtbC1weXRob24tYmluZGdlbi8+DQoNCltkb2NzXSA8aHR0cHM6 Ly9tb29yZXJ5YW4uZ2l0aHViLmlvL29jYW1sX3B5dGhvbl9iaW5kZ2VuLz4NCg0KW2V4YW1wbGVz XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9tb29yZXJ5YW4vb2NhbWxfcHl0aG9uX2JpbmRnZW4vdHJl ZS9tYWluL2V4YW1wbGVzPg0KDQoNCkNyZWF0aW5nIGEgbGlicmFyeSBmb3IgdXNlIGZyb20gSlMg d2l0aCBqc19vZl9vY2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jcmVhdGluZy1h LWxpYnJhcnktZm9yLXVzZS1mcm9tLWpzLXdpdGgtanMtb2Ytb2NhbWwvOTUyMy81Pg0KDQoNCkRl ZXAgaW4gdGhpcyB0aHJlYWQsIHRocmVlcHdvb2Qgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQ2F1dGlvbmFyeSBub3RlIGZvciBh bnlvbmUgcmVhZGluZyB0aGlzIGluIHRoZSBmdXR1cmU6IGR5bmFtaWMgaW1wb3J0cw0KICBhcmUg YXN5bmNocm9ub3VzLCBhbmQgaW5pdGlhbGl6aW5nIHRoZSBqc29vIHJ1bnRpbWUgdGFrZXMgc29t ZQ0KICBtaWxsaXNlY29uZHMsIHNvIHRoYXQgaWYgeW91IGp1c3QgZG86DQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgaW1wb3J0KCJvY2FtbC9leHBvcnQuYmMuanMiKTsNCiAg4pSCIHZhciB4ID0g bXlsaWIubXlmdW5jdGlvbigpOw0KICDilJTilIDilIDilIDilIANCiAgdGhlIHNlY29uZCBsaW5l IHdpbGwgZmFpbCBhcyBgbXlsaWInIGlzIG5vdCBkZWZpbmVkIHlldCAoYXQgbGVhc3QgdGhpcw0K ICBpcyB3aGF0IEkgdGhpbmsgaXMgaGFwcGVuaW5nKS4gWW91IG5lZWQgdG8gZ3VhcmFudGVlIHRo ZSBtb2R1bGUgaXMNCiAgZG9uZSBpbml0aWFsaXppbmcgaW4gc29tZSB3YXkgb3Igb3RoZXIuDQoN Cg0KS2ltIE5ndXnhu4VuIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgYGltcG9ydCcgc2hvdWxkIHJldHVy biBhIHByb21pc2Ugb2YgdGhlIGxvYWRlZCBtb2R1bGUuIFNvIHlvdSBjYW4ganVzdA0KICBgYXdh aXQnIGZvciBpdCAoaWYgeW91ciBjdXJyZW50IGNvbnRleHQgYWxsb3dzIHlvdSB0byB3cml0ZSBg YXdhaXQnKQ0KICBvciBqdXN0IDoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAgaW1wb3J0KCJv Y2FtbC9leHBvcnQuYmMuanMiKS50aGVuICgoXykgPT4gew0KICDilIIgDQogIOKUgiAgbXlsaWIu bXlmdW5jdGlvbigpOw0KICDilIIgDQogIOKUgiB9KTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0K b2NhbWwtbHNwLXNlcnZlciAxLjExLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLWxzcC1zZXJ2ZXItMS0xMS0wLzk2 NzcvMT4NCg0KDQpSdWRpIEdyaW5iZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT24g YmVoYWxmIG9mIHRoZSBvY2FtbGxzcCB0ZWFtLCBJJ20gZXhjaXRlZCB0byBhbm5vdW5jZSB0aGUN CiAgYXZhaWxhYmlsaXR5IG9mIHZlcnNpb24gMS4xMS4wLiBUaGlzIHJlbGVhc2UgaXMgYW4gaW1w b3J0YW50IG1pbGVzdG9uZQ0KICBmb3IgdGhlIHByb2plY3QgYmVjYXVzZSBpdCBpbnRyb2R1Y2Vz IGludGVncmF0aW9uIHdpdGggb3VyIGZhdm9yaXRlDQogIGJ1aWxkIHN5c3RlbS4gV2hlbiB5b3Ug cnVuIGR1bmUgaW4gd2F0Y2ggbW9kZSwgeW91IHdpbGwgbm93IGJlIGFibGUgdG8NCiAgc2VlIGJ1 aWxkIGVycm9ycyBpbiB0aGUgZGlhZ25vc3RpY3MgcGFuZWwgb2YgeW91ciBlZGl0b3IuIEl0J3Mg YWxsDQogIHJhdGhlciBleHBlcmltZW50YWwgZm9yIG5vdywgc28geW91ciBmZWVkYmFjayBhbmQg YnVnIHJlcG9ydHMgYXJlDQogIGFwcHJlY2lhdGVkLg0KDQogIEFzIHVzdWFsLCB0aGUgZnVsbCBj aGFuZ2UgbG9nIGlzIGJlbG93Lg0KDQogIEhhcHB5IGhhY2tpbmcuDQoNCiAgKjEuMTEuMCoNCg0K DQpGZWF0dXJlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIEFkZCBzdXBwb3J0 IGZvciBkdW5lIGluIHdhdGNoIG1vZGUuIFRoZSBsc3Agc2VydmVyIHdpbGwgbm93IGRpc3BsYXkN CiAgICBidWlsZCBlcnJvcnMgaW4gdGhlIGRpYWdub3N0aWNzIGFuZCBvZmZlciBwcm9tb3Rpb24g Y29kZSBhY3Rpb25zLg0KDQogIOKAoiBSZS1pbnRyb2R1Y2Ugb2NhbWxmb3JtYXQtcnBjICgjNTk5 LCBmaXhlcyAjNDk1KQ0KDQoNCkZpeGVzDQrilYzilYzilYzilYzilYwNCg0KICDigKIgRml4IHdv cmtzcGFjZSBzeW1ib2xzIHRoYXQgY291bGQgaGF2ZSBhIHdyb25nIHBhdGggaW4gc29tZSBjYXNl cw0KICAgIChbIzY3NV0pDQoNCg0KWyM2NzVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwtbHNwL3B1bGwvNjcxPg0KDQoNCk9DYW1sIHN1bW1lciBzY2hvb2wgaW4gU3BhaW4sIGNhbGwg Zm9yIGluZHVzdHJ5IHNwZWFrZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L29jYW1sLXN1bW1lci1zY2hvb2wtaW4tc3BhaW4tY2FsbC1mb3ItaW5kdXN0cnkt c3BlYWtlcnMvOTY4NS8xPg0KDQoNClJvYmVydG8gQmxhbmNvIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgRGVhciBhbGwsIFJpY2FyZG8gUm9kcsOtZ3VleiBhbmQgSSBhcmUgb3JnYW5p emluZyBhbiBpbnRyb2R1Y3RvcnkgT0NhbWwNCiAgY291cnNlIGFzIHBhcnQgb2YgdGhlIGFubnVh bCBzdW1tZXIgc2Nob29sIG9mIHRoZSBVbml2ZXJzaXR5IG9mDQogIFphcmFnb3phIGluIFNwYWlu LiAoVGhpcyBpcyB0aGUgb2xkZXN0IHN1bW1lciB1bml2ZXJzaXR5IGluIHRoZQ0KICBjb3VudHJ5 LCBuZWFyaW5nIGl0cyBjZW50ZW5uaWFsIGFubml2ZXJzYXJ5ISkuIFRoZSBjb3VudHJ5J3MgY29t cHV0aW5nDQogIHByb2dyYW1zIGFyZSBxdWl0ZSBleGNlbGxlbnQsIGFsdGhvdWdoIHdlIGhhdmUg Zm91bmQgdGhlbSB0byBnZW5lcmFsbHkNCiAgbm90IHBheSBzZXJpb3VzIGF0dGVudGlvbiB0byBt b2Rlcm4gZnVuY3Rpb25hbCBwcm9ncmFtbWluZy4gT3VyIGdvYWwNCiAgaXMgdG8gdXNlIE9DYW1s IHRvIGJlZ2luIHRvIGFkZHJlc3MgdGhpcyBkZWFydGguDQoNCiAgSW4gYWRkaXRpb24gdG8gdGhl IHJlZ3VsYXIgYWNhZGVtaWMgcHJvZ3JhbSB3ZSBhcmUgcGxhbm5pbmcgYQ0KICBzYXRlbGxpdGUg ZXZlbnQgb3BlbiB0byB0aGUgZ2VuZXJhbCBwdWJsaWMuIFRoaXMgaXMgbWVhbnQgdG8gaW50cm9k dWNlDQogIHRoZSBPQ2FtbCBlY29zeXN0ZW0gdG8gYSB3aWRlciBhdWRpZW5jZSBvZiBzdHVkZW50 cyBhbmQgYWNhZGVtaWNzLCBhcw0KICB3ZWxsIGFzIHByb2Zlc3Npb25hbHMuIEFzIHBhcnQgb2Yg dGhpcywgd2Ugd291bGQgbGlrZSB0byBob2xkIGEgcm91bmQNCiAgdGFibGUgZGlzY3Vzc2lvbiBv ZiBpbmR1c3RyaWFsIE9DYW1sIHVzZXJzIHRvIGRlbW9uc3RyYXRlIHRoZSB3aWR0aA0KICBhbmQg ZGVwdGggb2YgcHJhY3RpY2FsIHVzZXMgb2YgdGhlIGxhbmd1YWdlLiBUaGVyZSB3aWxsIGJlIHRp bWUgZm9yDQogIHBhcnRpY2lwYW50cyB0byBwcmVzZW50IHRoZWlyIHdvcmsgaW4gbW9yZSBkZXRh aWwsIGlmIHRoZXkgd2lzaCB0byBkbw0KICBzby4NCg0KICBJZiB5b3UgbWF5IGJlIGludGVyZXN0 ZWQgaW4gcGFydGljaXBhdGluZyBvciBoYXZlIGFueSBxdWVzdGlvbnMsIGZlZWwNCiAgZnJlZSB0 byB3cml0ZSB0byBtZSBoZXJlIG9yIHNlbmQgZW1haWwgdG8gZWl0aGVyIG9mIHVzLiBUaGUgY291 cnNlIGlzDQogIGN1cnJlbnRseSBpbiBpdHMgcGxhbm5pbmcgc3RhZ2VzOyBpdCBpcyBzY2hlZHVs ZWQgdG8gdGFrZSBwbGFjZSBpbg0KICBlYXJseSB0byBtaWQgSnVseSwgaW4gYWxsIGxpa2VsaWhv b2QgaW4gdGhlIGNpdHkgb2YgWmFyYWdvemEgYW5kIGluDQogIGh5YnJpZCBmb3JtYXQuIFRoZSBP Q2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIGlzIGJhY2tpbmcgdGhlIGluaXRpYXRpdmUNCiAgYW5k IHdlIHRoYW5rIHRoZW0gZm9yIHRoZWlyIGdlbmVyb3VzIHN1cHBvcnQuDQoNCiAgVXBkYXRlZCBp bmZvcm1hdGlvbiBhYm91dCB0aGUgY291cnNlIHdpbGwgYmUgYXZhaWxhYmxlIG9uIGl0cyB3ZWJz aXRlOg0KICA8aHR0cHM6Ly93ZWJkaWlzLnVuaXphci5lcy9ldnBmLz4NCg0KDQpEdW5lIDMuMS4w DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5lLTMtMS0wLzk2OTAvMT4NCg0KDQpSdWRpIEdyaW5i ZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBkdW5lIHRl YW0sIEknbSBwbGVhc2VkIHRvIGFubm91bmNlIHZlcnNpb24NCiAgMy4xLjAuIFRoaXMgcmVsZWFz ZSBjb250YWlucyBzb21lIHNtYWxsLCBidXQgaW50ZXJlc3RpbmcgZmVhdHVyZXMsIGFuZA0KICBz b21lIGltcG9ydGFudCBxdWFsaXR5IG9mIGxpZmUgYnVnIGZpeGVzLiBJIGVuY291cmFnZSBldmVy eW9uZSB0bw0KICB1cGdyYWRlIGFzIHNvb24gYXMgcG9zc2libGUuDQoNCiAgSGFwcHkgSGFja2lu Zy4NCg0KICAqMy4xLjAgKDE1LzA0LzIwMjIpKg0KDQogIOKAoiBBZGQgYHNvdXJjZWh1dCcgYXMg YW4gb3B0aW9uIGZvciBkZWZpbmluZyBwcm9qZWN0IHNvdXJjZXMgaW4NCiAgICBkdW5lLXByb2pl Y3QgZmlsZXMuIEZvciBleGFtcGxlLCBgKHNvdXJjZSAoc291cmNlaHV0DQogICAgdXNlci9yZXBv KSknLiAoIzU1NjQsIEByZ3JpbmJlcmcpDQoNCiAg4oCiIEFkZCBgZHVuZSBjb3EgdG9wJyBjb21t YW5kIGZvciBydW5uaW5nIGEgQ29xIHRvcGxldmVsICgjNTQ1NywNCiAgICBAcmxlcGlncmUpDQoN CiAg4oCiIEZpeCBkdW5lIGV4ZWMgZHVtcGluZyBkYXRhYmFzZSBpbiB3cm9uZyBkaXJlY3Rvcnkg KCM1NTQ0LCBAYm9ib3QpDQoNCiAg4oCiIEFsd2F5cyBvdXRwdXQgYWJzb2x1dGUgcGF0aHMgZm9y IGxvY2F0aW9ucyBpbiBSUEMgcmVwb3J0ZWQNCiAgICBkaWFnbm9zdGljcyAoIzU1MzksIEByZ3Jp bmJlcmcpDQoNCiAg4oCiIEFkZCBgKGRlcHMgPGRlcHM+KScgaW4gY3R5cGUgZmllbGQgKCM1MzQ2 LCBAYm9ib3QpDQoNCiAg4oCiIEFkZCBgKGluY2x1ZGUgPGZpbGU+KScgY29uc3RydWN0b3IgdG8g ZGVwZW5kZW5jeQ0KICAgIHNwZWNpZmljYXRpb25zLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGludHJv ZHVjZSBkeW5hbWljIGRlcGVuZGVuY2llcw0KICAgICgjNTQ0MiwgQGFubW9udGVpcm8pDQoNCiAg 4oCiIEVuc3VyZSB0aGF0IGBkdW5lIGRlc2NyaWJlJyBjb21wdXRlcyBhIHRyYW5zaXRpdmVseSBj bG9zZWQgc2V0IG9mDQogICAgbGlicmFyaWVzICgjNTM5NSwgQGVzb3BlKQ0KDQogIOKAoiBBZGQg ZGlyZWN0IGRlcGVuZGVuY2llcyB0byAkIGR1bmUgZGVzY3JpYmUgb3V0cHV0ICgjNTQxMiwgQGVz b3BlKQ0KDQogIOKAoiBTaG93IGF1dG8tZGV0ZWN0ZWQgY29uY3VycmVuY3kgb24gV2luZG93cyB0 b28gKCM1NTAyLCBATWlzdGVyREEpDQoNCiAg4oCiIEZpeCBvcGVyYXRpb25zIHRoYXQgcmVtb3Zl IGZvbGRlcnMgd2l0aCBhYnNvbHV0ZSBwYXRoLiBUaGlzIGhhcHBlbnMNCiAgICB3aGVuIHVzaW5n IGVzeSAoIzU1MDcsIEBFZHVhcmRvUkZTKQ0KDQogIOKAoiBEdW5lIHdpbGwgbm90IGZhaWwgaWYg c29tZSBkaXJlY3RvcmllcyBhcmUgbm9uLWVtcHR5IHdoZW4NCiAgICB1bmluc3RhbGxpbmcuICAo IzU1NDMsIGZpeGVzICM1NTQyLCBAbm9qYikNCg0KICDigKIgYGNvcWRlcCcgbm93IGRlcGVuZHMg b25seSBvbiB0aGUgZmlsZXN5c3RlbSBsYXlvdXQgb2YgdGhlIC52IGZpbGVzLA0KICAgIGFuZCBu b3Qgb24gdGhlaXIgY29udGVudHMgKCM1NTQ3LCBoZWxwcyB3aXRoICM1MTAwLCBAZWpnYWxsZWdv KQ0KDQogIOKAoiBUaGUgbWR4IHN0YW56YSAwLjIgY2FuIG5vdyBiZSB1c2VkIHdpdGggYChpbXBs aWNpdF90cmFuc2l0aXZlX2RlcHMNCiAgICBmYWxzZSknICgjNTU1OCwgZml4ZXMgIzU0OTksIEBl bWlsbG9uKQ0KDQogIOKAoiBGaXggbWlzc2luZyBwYXJlbnRoZXNpcyBpbiBwcmludGluZyBvZiBj b3JyZXNwb25kaW5nIHRlcm1pbmFsDQogICAgY29tbWFuZCBmb3IgYCh3aXRoLW91dHB1dHMtdG8g KScgKCM1NTUxLCBmaXhlcyAjNTU0NiwgQEFsaXp0ZXIpDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoN Cg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVl Lm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24v Pg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlz dGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 12 to 19, 2022.

    Lwt informal user survey

    Rapha=C3=ABl Proust announced

    In order to make some decisions relating to the maintenance of Lwt, I'd lik= e to know a little bit more about how the library is used in the wild. Do not hesitate to respond to the poll and/or = as a message in this thread, or even to contact me via other means in case discuss is not your jam.

    Editor=E2=80=99s note: please follow the link above to reply to the surv= ey.

    pyml_bindgen: a CLI app to generate Python bindings directly f= rom OCaml value specifications

    Archive:

    Continuing this thread, Ryan Moore announced

    I wrote a blog post providing an introduction to pyml_bindgen. It gives an intro in a slightly= different style as compared to the docs and = the examples, and includes some of the latest features I've been working on.

    Creating a library for use from JS with js_of_ocaml

    Deep in this thread, threepwood said

    Cautionary note for anyone reading this in the future: dynamic imports are = asynchronous, and initializing the jsoo runtime takes some milliseconds, so that if you just do:

    import("ocaml/export.bc.js");
    var =
    x =3D mylib.myfunction();
    

    the second line will fail as mylib is not defined yet (at leas= t this is what I think is happening). You need to guarantee the module is done initializing in some way or other.

    Kim Nguy=E1=BB=85n then said

    import should return a promise of the loaded module. So you ca= n just await for it (if your current context allows you to write await) or just :

     import("ocaml/export.bc.js").then ((_) =3D>=
    ; {
    
     mylib.myfunction();
    
    });
    

    ocaml-lsp-server 1.11.0

    Rudi Grinberg announced

    On behalf of the ocamllsp team, I'm excited to announce the availability of= version 1.11.0. This release is an important milestone for the project because it introduces integration with = our favorite build system. When you run dune in watch mode, you will now be able to see build errors in the diagnos= tics panel of your editor. It's all rather experimental for now, so your feedback and bug reports are appreciated.

    As usual, the full change log is below.

    Happy hacking.

    1.11.0

    Features

    • Add support for dune in watch mode. The lsp server will now display bui= ld errors in the diagnostics and offer promotion code actions.
    • Re-introduce ocamlformat-rpc (#599, fixes #495)

    Fixes

    • Fix workspace symbols that could have a wrong path in some cases (#675)

    OCaml summer school in Spain, call for industry speakers

    Roberto Blanco announced

    Dear all, Ricardo Rodr=C3=ADguez and I are organizing an introductory OCaml= course as part of the annual summer school of the University of Zaragoza in Spain. (This is the oldest summer university = in the country, nearing its centennial anniversary!). The country's computing programs are quite excellent, althou= gh we have found them to generally not pay serious attention to modern functional programming. Our goal is to use OCam= l to begin to address this dearth.

    In addition to the regular academic program we are planning a satellite eve= nt open to the general public. This is meant to introduce the OCaml ecosystem to a wider audience of students and = academics, as well as professionals. As part of this, we would like to hold a round table discussion of industrial = OCaml users to demonstrate the width and depth of practical uses of the language. There will be time for participant= s to present their work in more detail, if they wish to do so.

    If you may be interested in participating or have any questions, feel free = to write to me here or send email to either of us. The course is currently in its planning stages; it is schedul= ed to take place in early to mid July, in all likelihood in the city of Zaragoza and in hybrid format. The OCaml Soft= ware Foundation is backing the initiative and we thank them for their generous support.

    Updated information about the course will be available on its website: https://webdiis.unizar.es/evpf/=

    Dune 3.1.0

    Rudi Grinberg announced

    On behalf of the dune team, I'm pleased to announce version 3.1.0. This rel= ease contains some small, but interesting features, and some important quality of life bug fixes. I encourage everyon= e to upgrade as soon as possible.

    Happy Hacking.

    3.1.0 (15/04/2022)

    • Add sourcehut as an option for defining project sources in= dune-project files. For example, (source (sourcehut user/repo)). (#5564, @r= grinberg)
    • Add dune coq top command for running a Coq toplevel (#5457= , @rlepigre)
    • Fix dune exec dumping database in wrong directory (#5544, @bobot)
    • Always output absolute paths for locations in RPC reported diagnostics (#5539, @rgrinberg)
    • Add (deps <deps>) in ctype field (#5346, @bobot)
    • Add (include <file>) constructor to dependency speci= fications. This can be used to introduce dynamic dependencies (#5442, @anmonteiro)
    • Ensure that dune describe computes a transitively closed s= et of libraries (#5395, @esope)
    • Add direct dependencies to $ dune describe output (#5412, @esope)
    • Show auto-detected concurrency on Windows too (#5502, @MisterDA)
    • Fix operations that remove folders with absolute path. This happens when using esy (#5507, @EduardoRFS)
    • Dune will not fail if some directories are non-empty when uninstalling. (#5543, fixes #5542, @nojb)
    • coqdep now depends only on the filesystem layout of the .v= files, and not on their contents (#5547, helps with #5100, @ejgallego)
    • The mdx stanza 0.2 can now be used with (implicit_transitive_deps= false) (#5558, fixes #5499, @emillon)
    • Fix missing parenthesis in printing of corresponding terminal command f= or (with-outputs-to ) (#5551, fixes #5546, @Alizter)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 36489E0079 for ; Tue, 26 Apr 2022 08:44:37 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=SLrc=VE=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: LzDyvFSN92BNXVwYxnx7Cqh/X1y4ed4V4Y4aDCSVwGFq598D3BiznO1UNGubecSlsUm839wsEf TyvJAax/zwx/B/727AJVwpQ2f/R8s81UjA8WwO7R7fyGSJFqZeRWGICJYblrMnRV5lj0P7D59C NDvH31kX1WR1imRSO3iFjOeiHpRLwi8PXe2185vQdz0ik3O7Gd6tv7IYpA17jM67wAQfsVLNWg YQ3bL8bscx49qtoks2uTdJmtgsbPC3Adc+qxlOS4zeuV7Mq+jyXDwLS+iF56r5wHekGxaZbFH0 yiJIf4Ia7INLeQjPfpiThKgv X-IPAS-Result: =?us-ascii?q?A0AxBgCvk2di/yIeaIFahACBBwcSARdHAgEDVS0HCEOEF?= =?us-ascii?q?z2BYYcliBGJUJRFA18BAwENLAEMBgECBAEBg02BNgIchHECHgYBBTMTAQIEA?= =?us-ascii?q?QEBAQMCAwEBAQEBAQMBAQUBAQECAQECBAQBJAsJBgUNBhAOBQ8tZGQEgUsEg?= =?us-ascii?q?XQLNA2CNQwMAwODdwEKEQYKOAQBKCMDFAcDAhEBFwEeAwETARIagmyDGQQBC?= =?us-ascii?q?o8WnBGBMYEBg08BAwIDCQJDg3OBElMkgRmGFlhKAYMECYQPAicQgVVEgRWCe?= =?us-ascii?q?m6CTBcBAQEBAReBJAEBAlSDIIJlBJt0GgsOC2EQWSIBAQ1DCCoOAQ8UBxYOC?= =?us-ascii?q?UoLC5JQjz2JJJUhNAeDTYE8BgyIK4EgjHuIIoN0gU+FG4VPmCYhlj8ggimGd?= =?us-ascii?q?4EZgkeUPwKFOYFOKiWBWTMaMEMNEAGCSwlFAQMCDQECAgMBAgECCQEBAo1zA?= =?us-ascii?q?QEBBYQUgT6BJoF1O4VJAz80AgEBNwIGAQoBAQMJhWMBAQUTCwGHLwEB?= IronPort-PHdr: A9a23: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 ghBtGxx IronPort-Data: A9a23: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 r/sSg8= IronPort-HdrOrdr: A9a23:r8M9T6EjkcdriOHdpLqE78eALOsnbusQ8zAXPiFKKSC9Hfb2qy nDpp4mPHzP6Qr5OktPpTnoAsDpKk80nqQY3WB+B9qfdTijkFTtBoBv54nvzlTbak7D398Y87 xvN4x3CNiYNykesS8W2njbL+od X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.90,290,1643670000"; d="scan'208,217";a="12414874" X-MGA-submission: =?us-ascii?q?MDHE3rzb9DwrmoUxHtSSGioOkFV3obSSXTt3Jy?= =?us-ascii?q?Azh3Mwaf9LPDgMTh+cbgk40QWu+evnL6/5ZcgxgbihMdff/vikChK1/u?= =?us-ascii?q?gJbImCPUn/foyEXA2lpcqsWVOh7l+0eWyQ35u7HVmxsYf4OdqgpgauZJ?= =?us-ascii?q?E4kCJxbEwoZPDwT/MZic84zQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Apr 2022 08:44:35 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BE89A56126F; Tue, 26 Apr 2022 08:44:33 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 26 Apr 2022 08:44:33 +0200 Message-ID: <87bkwo4a3y.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 26 08:44:34 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.032596, queueID=2A65F561272 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 19 to 26, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Multicore OCaml: March 2022 OUPS meetup may 2022 (french only) JFLA 2022: Call for Participation (in French) Old CWN Multicore OCaml: March 2022 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Welcome to the March 2022 [Multicore OCaml] monthly report! This update along with the [previous updates] have been compiled by me, @ctk21, @kayceesrk and @shakthimaan. We have continued steadily towards making a stable OCaml 5.0 release, as you can see from the long list of fixes later =E2=80=93 thank you for = all your contributions! Platform configurations that were formerly supported in the 4.x branches for OpenBSD, FreeBSD, and NetBSD have now been re-enabled. ARM64 support (for macOS, Linux and the BSDs) is stable in trunk, and ARM CFI integration has been merged as a follow-up to facilitate debugging and profiling. Notably, this also includes [memory model tests for ARMv8 and Power ports]. The Windows mingw64 port is also working again in trunk. An [effects tutorial] has also been contributed to the OCaml manual; feedback continues to be welcome even after it's merged in. As you experiment with effects, please do continue to post to this forum with questions or comments about your learnings. The Sandmark benchmark project has added bytecode analysis to address any performance regressions. We have also been working on obtaining measurements for the compilation data points. The current-bench pipeline production deployments has significant UI changes, and now has alert notifications for the benchmark runs. As always, the Multicore OCaml open and completed tasks are listed first, which are then followed by the ecosystem tooling projects. The Sandmark, sandmark-nightly, and current-bench project updates are finally presented for your reference. /Editor=E2=80=99s note: please find the full changelog following the arch= ive link above./ [Multicore OCaml] [previous updates] [memory model tests for ARMv8 and Power ports] [effects tutorial] OUPS meetup may 2022 (french only) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: zapashcanon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Le prochain OUPS aura lieu le *jeudi 12 mai* 2022. Le rendez-vous est fix=C3=A9 =C3=A0 *19h* en *salle 15-16 101* , *4 place Jussieu* , 75005 P= aris. *L'inscription est obligatoire* pour pouvoir acc=C3=A9der au meetup ! Vot= re nom complet doit =C3=AAtre disponible. L'inscription s'effectue sur [meetup]. Toutes les informations sont disponibles sur [le site du oups]. J'aimerais aussi signaler que les slides et vid=C3=A9os des expos=C3=A9s = pass=C3=A9s [sont maintenant disponibles] ! :partying_face: *Programme* [meetup] [le site du oups] [sont maintenant disponibles] Gospel & Ortac - Cl=C3=A9ment Pascutto =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Gospel is a behavioural specification language for OCaml program. It provides developers with a non-invasive and easy-to-use syntax to annotate their module interfaces with formal contracts that describe type invariants, mutability, function pre-conditions and post-conditions, effects, exceptions, and [much more]! ortac: OCaml Runtime Assertion Checking. [much more] MirageOS 4 - Romain Calascibetta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C MirageOS 4 vient de sortir r=C3=A9cemment et c'est l'occasion de (re)pr=C3=A9senter ce projet permettant de construire des unikernels. Nous y pr=C3=A9senterons les nouvelles features et possibilit=C3=A9s et nous f= erons une introspection de 3 ans de travail de l'=C3=A9quipe core. Tezt: OCaml Tezos Test Framework - Romain Bardou =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Tezt is a test framework for OCaml. It is well suited for unit and regression tests and particularly shines for integration tests, i.e. tests that launch external processes. It was made with a focus on user experience. It allows you to easily select tests from the command-line and provides pretty logs. It also can run tests in parallel, automatically split the set of tests into several well-balanced batches to be run in parellel CI jobs, produce JUnit outputs, and more. It has been in use at Nomadic for the last 2 years and is thus quite battle-tested. JFLA 2022: Call for Participation (in French) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Timothy Bourke announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [ This message is intentionally written in French. It is a call for participation for the "Francophone Days on Functional Languages" to be held, finally and fingers crossed, at the end of June. Some of the articles are written in English. They are available online: ] *Merci de faire circuler : premier appel =C3=A0 participation* JFLA'2022 () Journ=C3=A9es Francophones des Langages Applicatifs Saint-M=C3=A9dard-d'Excideuil - du 28 juin au 1er juillet 2022 Les inscriptions aux JFLA 2022 - en pr=C3=A9sence ! - sont d=C3=A9sormais ouvertes : Ces journ=C3=A9es r=C3=A9unissent concepteurs, utilisateurs et th=C3=A9or= iciens ; elles ont pour ambition de couvrir les domaines des langages applicatifs, de la preuve formelle, de la v=C3=A9rification de programmes, et des objets math=C3=A9matiques qui sous-tendent ces outils. Ces domaines doivent =C3=AAtre pris au sens large : nous souhaitons promouvoir les pon= ts entre les diff=C3=A9rentes th=C3=A9matiques. L'inscription est un forfait qui comprend notamment l'h=C3=A9bergement en pension compl=C3=A8te sur le site des journ=C3=A9es : =E2=80=A2 participant=C2=B7e plein tarif, chambre simple : 660 euros =E2=80=A2 =C3=A9tudiant=C2=B7e orateur=C2=B7ice, en chambre double : 0 eu= ro Nous esp=C3=A9rons que vous serez nombreux =C3=A0 participer =C3=A0 ces j= ourn=C3=A9es. Inscrivez-vous d=C3=A8s que possible ! En particulier, les =C3=A9tudiant= =C2=B7es orateur=C2=B7ices sont invit=C3=A9=C2=B7es =C3=A0 s'inscrire, m=C3=AAme s= 'ils ne paient pas gr=C3=A2ce =C3=A0 nos sponsors. Vous pouvez d'ores et d=C3=A9j=C3=A0 vous inscrire au salon de discussion framateam afin d'=C3=A9changer ensemble : Tout le programme est =C3=A0 retrouver ici : Dates importantes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C =E2=80=A2 17 juin 2022 : date limite d'inscription aux journ=C3=A9es =E2=80=A2 28 juin au 1er juillet 2022 : journ=C3=A9es Cours invit=C3=A9s =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Delphine Demange (IRISA, Universit=C3=A9 de Rennes 1) "Si2-FIP: Programmation Fonctionnelle en Licence 1 avec Scala" =E2=80=A2 Denis M=C3=A9rigoux (Inria) "Rust pour le formaliste impatient" Expos=C3=A9 invit=C3=A9 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Matthias Puech (INA GRM) Titre =C3=A0 venir - avec une surprise= ! Articles accept=C3=A9s =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C L'ensemble des articles accept=C3=A9s est disponible sous forme d'une collection HAL : Comit=C3=A9 de programme =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C =E2=80=A2 Chantal Keller LMF, Universit=C3=A9 Paris-Saclay (Pr=C3=A9siden= te) =E2=80=A2 Timothy Bourke Inria, =C3=89NS de Paris (Vice-pr=C3=A9sident) =E2=80=A2 Sandrine Blazy Irisa, Universit=C3=A9 Rennes 1 =E2=80=A2 Fr=C3=A9d=C3=A9ric Bour Tarides - Inria =E2=80=A2 Guillaume Bury OcamlPro =E2=80=A2 Stefania Dumbrava Samovar, ENSIIE, T=C3=A9l=C3=A9com Sud Paris =E2=80=A2 Diane Gallois-Wong Nomadic Labs =E2=80=A2 Adrien Guatto IRIF, Universit=C3=A9 de Paris =E2=80=A2 David Janin LaBRI, Universit=C3=A9 de Bordeaux =E2=80=A2 Marie Kerjean LIPN, Universit=C3=A9 Paris 13 =E2=80=A2 Luc Pellissier LACL, Universit=C3=A9 Paris-Est Cr=C3=A9teil =E2=80=A2 M=C3=A1rio Pereira NOVA-LINCS, Universidade Nova de Lisboa =E2=80=A2 Alix Trieu Aarhus University =E2=80=A2 Yannick Zakowski LIP, Inria, =C3=89NS de Lyon Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 19 to 26, 2022.

    Multicore OCaml: March 2022

    Anil Madhavapeddy announced

    Welcome to the March 2022 Multicore OCaml monthly report! This update along with the previous updates have been compiled by me, @ctk21, @kayceesrk and @shakthimaan.

    We have continued steadily towards making a stable OCaml 5.0 release, as yo= u can see from the long list of fixes later – thank you for all your contributions! Platform configuration= s that were formerly supported in the 4.x branches for OpenBSD, FreeBSD, and NetBSD have now been re-enabled. ARM64 s= upport (for macOS, Linux and the BSDs) is stable in trunk, and ARM CFI integration has been merged as a follow-up to = facilitate debugging and profiling. Notably, this also includes memory model tests for ARMv8 and Power ports. The Windows mingw64 port is also working again in trunk.

    An effects tutorial has also been contributed to the OCaml manual; feedback continues to be welcome even after it's merged in. As you experim= ent with effects, please do continue to post to this forum with questions or comments about your learnings.

    The Sandmark benchmark project has added bytecode analysis to address any p= erformance regressions. We have also been working on obtaining measurements for the compilation data points. The curr= ent-bench pipeline production deployments has significant UI changes, and now has alert notifications for the benchma= rk runs.

    As always, the Multicore OCaml open and completed tasks are listed first, w= hich are then followed by the ecosystem tooling projects. The Sandmark, sandmark-nightly, and current-bench project= updates are finally presented for your reference.

    Editor=E2=80=99s note: please find the full changelog following the arch= ive link above.

    OUPS meetup may 2022 (french only)

    zapashcanon announced

    Le prochain OUPS aura lieu le jeudi 12 mai 2022. Le rendez-vous est = fix=C3=A9 =C3=A0 19h en salle 15-16 101 , 4 place Jussieu , 75005 Paris.

    L'inscription est obligatoire pour pouvoir acc=C3=A9der au meetup ! = Votre nom complet doit =C3=AAtre disponible. L'inscription s'effectue sur meetup.

    Toutes les informations sont disponibles sur le site du oups.

    J'aimerais aussi signaler que les slides et vid=C3=A9os des expos=C3=A9s pa= ss=C3=A9s sont maintenant disponibles ! :partying_face:

    Programme

    Gospel & Ortac - Cl=C3=A9ment Pascutto

    Gospel is a behavioural specification language for OCaml program. It provid= es developers with a non-invasive and easy-to-use syntax to annotate their module interfaces with formal contract= s that describe type invariants, mutability, function pre-conditions and post-conditions, effects, exception= s, and much more!

    ortac: OCaml Runtime Assertion Checking.

    MirageOS 4 - Romain Calascibetta

    MirageOS 4 vient de sortir r=C3=A9cemment et c'est l'occasion de (re)pr=C3= =A9senter ce projet permettant de construire des unikernels. Nous y pr=C3=A9senterons les nouvelles features et possibilit= =C3=A9s et nous ferons une introspection de 3 ans de travail de l'=C3=A9quipe core.

    Tezt: OCaml Tezos Test Framework - Romain Bardou

    Tezt is a test framework for OCaml. It is well suited for unit and regressi= on tests and particularly shines for integration tests, i.e. tests that launch external processes. It was made w= ith a focus on user experience. It allows you to easily select tests from the command-line and provides pretty logs. = It also can run tests in parallel, automatically split the set of tests into several well-balanced batches to = be run in parellel CI jobs, produce JUnit outputs, and more. It has been in use at Nomadic for the last 2 years and i= s thus quite battle-tested.

    JFLA 2022: Call for Participation (in French)

    Timothy Bourke announced

    [ This message is intentionally written in French. It is a call for participation for the "Francophone Days on Functional Languages" to be held, finally and fingers crossed, at the end of June. Some of the articles are written in English. They are available online: https://hal.inria.fr/JFLA2022/ ]

    Merci de faire circuler : premier appel =C3=A0 participation

    JFLA'2022 (http://jfla.inria= .fr/jfla2022.html)

    Journ=C3=A9es Francophones des Langages Applicatifs

    Saint-M=C3=A9dard-d'Excideuil - du 28 juin au 1er juillet 2022

    Les inscriptions aux JFLA 2022 - en pr=C3=A9sence ! - sont d=C3=A9sormais o= uvertes :

    https://www.azur-colloque.fr/DR04/inscription/preinscription/203/fr

    Ces journ=C3=A9es r=C3=A9unissent concepteurs, utilisateurs et th=C3=A9oric= iens ; elles ont pour ambition de couvrir les domaines des langages applicatifs, de la preuve formelle, de la v=C3=A9rification de programmes, et des objets math=C3=A9matiques qui sous-tendent ces outils. Ces domaines doivent =C3=AAtre pris au sens large : nous souhaitons promouvoir les ponts entre les diff=C3=A9rentes th=C3=A9matiques.

    L'inscription est un forfait qui comprend notamment l'h=C3=A9bergement en pension compl=C3=A8te sur le site des journ=C3=A9es :

    • participant=C2=B7e plein tarif, chambre simple : 660 euros
    • =C3=A9tudiant=C2=B7e orateur=C2=B7ice, en chambre double : 0 euro

    Nous esp=C3=A9rons que vous serez nombreux =C3=A0 participer =C3=A0 ces jou= rn=C3=A9es. Inscrivez-vous d=C3=A8s que possible ! En particulier, les =C3=A9tudiant=C2= =B7es orateur=C2=B7ices sont invit=C3=A9=C2=B7es =C3=A0 s'inscrire, m=C3=AAme s'i= ls ne paient pas gr=C3=A2ce =C3=A0 nos sponsors.

    Vous pouvez d'ores et d=C3=A9j=C3=A0 vous inscrire au salon de discussion f= ramateam afin d'=C3=A9changer ensemble : https://framateam.org/signup_user_complete/?id=3Dgnbebtncubnbp= e96ok9kam8t9y

    Tout le programme est =C3=A0 retrouver ici : http://jfla.inria.fr/jfla2022.html

    Dates importantes

    • 17 juin 2022 : date limite d'inscription aux journ=C3=A9es
    • 28 juin au 1er juillet 2022 : journ=C3=A9es

    Cours invit=C3=A9s

    • Delphine Demange (IRISA, Universit=C3=A9 de Rennes 1) "Si2-FIP: Programmation Fonctionnelle en Licence 1 avec Scala"
    • Denis M=C3=A9rigoux (Inria) "Rust pour le formaliste impatient"

    Expos=C3=A9 invit=C3=A9

    • Matthias Puech (INA GRM) Titre =C3=A0 venir - avec une surprise !

    Articles accept=C3=A9s

    L'ensemble des articles accept=C3=A9s est disponible sous forme d'une collection HAL : https://hal.inria.fr/JFLA202= 2

    Comit=C3=A9 de programme

    • Chantal Keller LMF, Universit=C3=A9 Paris-Saclay (Pr=C3=A9sidente)<= /li>
    • Timothy Bourke Inria, =C3=89NS de Paris (Vice-pr=C3=A9sident)<= /li>
    • Sandrine Blazy Irisa, Universit=C3=A9 Rennes 1
    • Fr=C3=A9d=C3=A9ric Bour Tarides - Inria
    • Guillaume Bury OcamlPro
    • Stefania Dumbrava Samovar, ENSIIE, T=C3=A9l=C3=A9com Sud Paris
    • Diane Gallois-Wong Nomadic Labs
    • Adrien Guatto IRIF, Universit=C3=A9 de Paris
    • David Janin LaBRI, Universit=C3=A9 de Bordeaux
    • Marie Kerjean LIPN, Universit=C3=A9 Paris 13
    • Luc Pellissier LACL, Universit=C3=A9 Paris-Est Cr=C3=A9teil
    • M=C3=A1rio Pereira NOVA-LINCS, Universidade Nova de Lisboa
    • Alix Trieu Aarhus University
    • Yannick Zakowski LIP, Inria, =C3=89NS de Lyon

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6DD6EE00BE for ; Tue, 3 May 2022 11:11:49 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=Rpxz=VL=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: W8t75lzypJASEDskNLYkMykEDn2J4Np5mSDA+qiod7G7X48dKft6js77i/Ct5VcFBfEnvpYTOP KH6Ep9IPJYXhMGl6W/iDK7DsVVR2u9iUHVjIh2fA8ld/W2EOYP0cYcPs+NIdhfO4uZxOnM0vBg rjqBB0ChW8eAP9oLUPv88T2H764e/UNJwQvEwlsXwuiz6w2gGnJpzzSU/KTZpizwXoLgJcHIqq jIF+OLFFK6h8fUOjjr2xm8X1pyK0WQttmRRTsbI/qzteBWq5+mnL2O+2Z+ei55duOhY2K+yz5P aZ8= X-IPAS-Result: =?us-ascii?q?A0DvAABu8XBimCIeaIFZAYN5gQMZAWRVLQcIQwOES1yBB?= =?us-ascii?q?4cdiAuJTY8bhBEPgQIDTxABAwENLAEOBAECBAEBgg6BPoE2AhwzCYReAh4GA?= =?us-ascii?q?QUzEwECBAEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgQEARMBAQEBAQEBAQkLC?= =?us-ascii?q?QcGDBUOBRcLhS85DYI1DAwDA4N3ARYCAwYEBj4CJSMDDQIFAQYDAhEBFwEeA?= =?us-ascii?q?wETARIUBQGCYwGDFwUKkgaaSBqBL38ygQGDTwEDAwINAw8vg3OBZSSBGIYYW?= =?us-ascii?q?EoBgweEGQInEIFVRIM+UW6BUEA1BxcBAQEBAYEoARECARoPLSkBgnaCZQSUQ?= =?us-ascii?q?SUOOgYsMwEDFw4FFAgOAQFYOAEHAxkwBEoLCwItA4RAjT8SDAMGIwGPFokkl?= =?us-ascii?q?EBjNAeDToE7BgyIK4EgjHuIIoN1gU+Ka4ZfkUchlkAgiSIIA4EGCYIBRZRCC?= =?us-ascii?q?IU0gU4qgQ4/HA4HMxowQ4I1AQEVHQlWCw9Wh3SFLgEFhBSCZIE8OTuFSQM/N?= =?us-ascii?q?AIBAQE2AgYBCgEBAwmFYwEBBRMLAYU1WgEB?= IronPort-PHdr: A9a23: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 BYP4A9M4gMZi4I2efrqstOgcQ== IronPort-Data: A9a23:xvYdlKM/xn9aw5XvrR3VkMFynXyQoLVcMsEvi/4bfWQNrUoq3zMGn 2ZJW2mCaPaDZmfxKdt2Pdy+9k5QsJOHm4U3THM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8kk/vgqoPUUIYoAAgoLeNfYHpn2EsLd9IR2NYy24DkW1jV4 LsenuWGULOb824sWo4rw/nbwP9flKyaVOQw4zTSzdgS1LPvvyF94KA3fcldHFOkKmVgJdNWc s6YpF2PEsw1yD92Yj+tuu6TnkTn2dc+NyDW4pZdc/DKbhSvOkXe345jXMfwZ3u7hB2Pn/wgl M1ziqCXdhkDEaDXo/oicEFxRnQW0a1uoNcrIFC6oZXV10rCYmfhyPVoDVgrMMsf4Okf7WNmr KZJbmlVMlbY36TtnNpXScE07ignBPLRB9tKgGlw32TnKaM+RpTSX6jB5dlZxSo9wMdUEqPXY 8MfLyFkbBHBfwFnMFAKDpkzh6Gt2mm5dCdXwL6QjfNsuzSOlFMruFTrGIrKdeyRVZt5pUiRn 22ZxnvLPS8jONPKnFJp9Vr12r6ewnOkMG4IL5Wz//tuxVmS3XA7EwwTTVL9oP+ji0f4Vcg3F qAP0i8+9O4q80i6UtT2Xxu5uWOJ+BkGVLK8DtHW9imLyoaFvx6nOVQjcSBrR9E9j9EJZmQDg wrhc8zSORRjt7icSHS4/7iSrC+vNSV9EYPkTXNVJefiy4W+yLzfni4jXf4/QPDo04yd9SXYm WzQ9HBWa6A71JZj6kmtwbzQqxyWznQjZjQ0/UDwRGuj4QJiDGJOT93xsAODhRqsBC1/SlTEs HVBtdKX6usDZaxheQSIULxLBLat9uqIOz3agEdyEt8m7TvFF5+fkWJ4vWEWyKRBa5hsldrVj Kn75Vs5CHh7ZyHCUEOPS9jtY/nGNIC5fTgfatjab8BVfr96fxKd8SdlaCa4hj6wyRV2z/tgY M3HK65A6Er274w5kVJaoM9DitcWKtwWnjiPLXwG50n/jOLAPiL9pUktaQfRP7BRAFy4TPX9q ooOZpTalH2zocXkby/e7YMJRW3m3lBlba0aX/d/L7fbSiI/QTFJI6KPndsJJtI094wIxrag1 izsASdwlQug7VWZcl/iQi44N9vSsWNX8ChT0doEZwj4ghDOoO+Hsc8iSnfAVeR5pLE7ka4oH pHouayoW5xyd9gOwBxFBbGVkWCoXE327e4jF3r9PlDTo7YIq831Ft7Yks/H8TlXSDKwsdoir rag0ALCXJdFQB5tZCoTQOz61Eu/5BDxh8orN3Yk4PEKEKkvzGSuAyb2k/k8LtpKLEnTgDyA2 G56xD8DveeX5dddHMbh3Mi5QkTALwe6NlJdG3jH4L22MyjD42flxpVPOApNVSvFWjmyoM1Oe s0Mp8zB3DY7cJqmfmay/3uHDU7z2jc3m4Jn8w== IronPort-HdrOrdr: A9a23:DGND7q2UWdaS5BfCx3W+FgqjBLUkLtp133Aq2lEZdPU1SKylfq +V88jzuSWftN9zYhAdcLK7VpVoKEm0nfVICOIqUYtKMjOKhEKYaKlcqaHizzfjFyCWzJ8/6Y 5QN45kBpnVBVh+5PyKhTVQ/uxQouW6zA== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,194,1647298800"; d="scan'208,217";a="13045072" X-MGA-submission: =?us-ascii?q?MDGdbHu4g1F/5ULY6LSX/sp0VbrfHlMnKWYgAd?= =?us-ascii?q?grZ4gLdPcp0pIF65p1NhW4t1j7e0rCfn+VxeJ8aAHsrjIamh0eUAoWSm?= =?us-ascii?q?QhpeCan6RDyUZ1lI+N3KOEqy73MyvsQBxVJI7ztiLowbHtcwcWCcJGUD?= =?us-ascii?q?nXM/Ku6DhA6t8RCDPJ+5SM6g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 May 2022 11:11:31 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 46AA65605EA; Tue, 3 May 2022 11:11:29 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 03 May 2022 11:11:28 +0200 Message-ID: <875ymnugjj.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 3 11:11:29 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.042073, queueID=8A1DD5605EC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 26 to May 03, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ATD now supports TypeScript pp_loc 2.0 Windows-friendly OCaml 4.12 distribution - Diskuv OCaml 0.1.0 V3.ocaml.org: we are live! Remaking an Old Game in OCaml Old CWN ATD now supports TypeScript =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Martin Jambon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [ATD] is a language for specifying typed interfaces for communicating across programming languages. It turns concrete type definitions ("schema") into code for each language. This code can read and write JSON safely, relieving the user of worrying about the structure of the JSON data. Starting from version 2.5.0, ATD provides `atdts', a single executable that turns a file `foo.atd' into `foo.ts'. See the [tutorial] for an introduction. The programming languages targeted by ATD are now: =E2=80=A2 Java =E2=80=A2 OCaml =E2=80=A2 Python + mypy =E2=80=A2 ReScript (BuckleScript) =E2=80=A2 Scala =E2=80=A2 TypeScript For an expert overview of the features that are currently supported, check out the test data: =E2=80=A2 [ATD input] =E2=80=A2 [TypeScript output] See also the [announcement for atdpy] that we made a month ago. [ATD] [tutorial] [ATD input] [TypeScript output] [announcement for atdpy] pp_loc 2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Armael announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Do you know how OCaml now displays errors by quoting back part of the source, highlighting the faulty part? For instance, with a single-line error location: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 File "foo.ml", line 1, characters 12-14: =E2=94=82 1 | let foo x =3D yy + 1;; =E2=94=82 ^^ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or a multi-line location: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 File "bar.ml", lines 3-5, characters 10-10: =E2=94=82 3 | ..........function =E2=94=82 4 | | A -> 0 =E2=94=82 5 | | B -> 1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Do you have your own language/configuration file/=E2=80=A6 parser or typechecker, that could benefit from nice, user-friendly error messages? The [pp_loc] library provides an easy-to-use implementation of the same source-quoting mechanism that is used in the OCaml compiler. It provides a single function `pp' which will display the relevant part of the input given the location(s) of the error. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val pp : =E2=94=82 ?max_lines:int -> =E2=94=82 input:Input.t -> =E2=94=82 Format.formatter -> =E2=94=82 loc list -> =E2=94=82 unit =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 (As one can see from the signature, `pp' also supports displaying several locations at once on the same source snippet, for multi-location errors.) The full [documentation is available online], and the library is available on opam (`opam install pp_loc'). This new version, thanks to the contribution of @c-cube, makes the `loc' type more flexible. It should now be easy to create source locations that can be passed to `pp', however you represent them in your parser (be it as (line,column) pairs, offsets, or any combination of those=E2=80=A6). For more details, see the [Pp_loc.Position] module. I am completely open to more PRs or ideas for improving the library further, and displaying source locations in even nicer ways! Happy error-message printing! [pp_loc] [documentation is available online] [Pp_loc.Position] Windows-friendly OCaml 4.12 distribution - Diskuv OCaml 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 A single `setup-*.exe' executable is now all that is necessary to install the Diskuv OCaml distribution on 64-bit Windows! Today you can use a prerelease of v0.4.0 which is available at The prerelease: =E2=80=A2 is for *experienced Windows users only* because the prerelease = is not signed! You will have to fight with your browser, operating system and anti-virus software to run the setup executable =E2=80=A2 is *not reproducible*. Because many Diskuv packages have not yet made it into Opam, the builds need several `opam pin' of unstable branches. =E2=80=A2 has not been incorporated into the documentation site. But the [Beyond Basics] documentation should still be accurate. Once those items above are addressed, a real (non-prerelease) 0.4.0 will be announced. Existing Diskuv OCaml users: Your existing Opam switches should be unaffected by the upgrade. But please make sure you can recreate your Opam switches (ie. use a `.opam' file) if something goes wrong. Release notes, including details of the migration to the Apache 2.0 license, are at available at [https://github.com/diskuv/dkml-installer-ocaml/releases/tag/v0.4.0-prere= l11] [Beyond Basics] [https://github.com/diskuv/dkml-installer-ocaml/releases/tag/v0.4.0-prerel1= 1] V3.ocaml.org: we are live! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am thrilled to announce that now serves version 3 of the site! Here's an overview of the major features in this new version: =E2=80=A2 [Central OCaml package documentation], which contains the documentation of every version of every OCaml packages. =E2=80=A2 [OCaml job board], which lists job opportunities from the commu= nity. =E2=80=A2 [A syndicated blog], which links to blog articles from the comm= unity and offers original blog posts. =E2=80=A2 [OCaml success stories] which explore how major OCaml industrial users solved real-world challenges using OCaml. =E2=80=A2 [Resources for learning OCaml], which aggregates resources and tutorials to learn OCaml. =E2=80=A2 [An interactive OCaml playground] to try OCaml code directly in= the browser. Version 2 remains accessible at , and older URLs to ocaml.org will be redirected to the v2 URL from now on. Similarly, v3.ocaml.org URLs will continue to work. Community feedback was instrumental and has been driving the direction of the project since day one. For instance, having a centralized package documentation site; or facilitating the hiring of OCaml developers and finding OCaml jobs were major concerns that were highlighted in the last [OCaml Survey]. They were what prompted us to work on the documentation site and the job board respectively. We've also listened to the community feedback we received along the way, and in particular, here's an overview of everything we've been doing to address the feedback we received after our last Discuss post: . Given how critical your input is to drive the project, I am deeply grateful to every one who took the time to share insights, suggestions and bug reports. Some of the suggestions will need more work and couldn't happen before launch, but we've listened to every one and will keep working on improving OCaml.org to address pain points of the community. Thank you, and keep the feedback coming! We're also starting to see a lot of contributions from external contributors. OCaml.org is open source, and contributions from anyone are extremely welcome! Never hesitate to open a PR if you see something you'd like to improve! You can read our [Contributing Guide] to learn how to contribute. [Central OCaml package documentation] [OCaml job board] [A syndicated blog] [OCaml success stories] [Resources for learning OCaml] [An interactive OCaml playground] [OCaml Survey] [Contributing Guide] Ecosystem Contributions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C As the storefront of the OCaml ecosystem, we couldn't develop the next version of OCaml.org without contributing back! As a result, we've published several packages on opam that we're using for OCaml.org: =E2=80=A2 [dream-accept]: Accept headers parsing for Dream =E2=80=A2 [dream-encoding]: Encoding primitives for Dream. =E2=80=A2 [hilite]: Generate HTML ready for syntax-highlighting with CSS = by parsing markdown documents. Other packages that are yet to be released are: =E2=80=A2 [code-mirror]: The code-mirror bindings =E2=80=A2 [js_top_worker]: An OCaml toplevel designed to run in a web wor= ker We've also made contributions downstream: =E2=80=A2 odoc: [Support for HTML fragments in odoc] =E2=80=A2 river: [API changes and capability to fetch metadata from RSS p= ost links] A huge thank you to the community for your constant effort in making OCaml such a great language to work with! In particular, here are some amazing community projects we are building upon: [Dream], [Brr] and [Omd] and [many more] [dream-accept] [dream-encoding] [hilite] [code-mirror] [js_top_worker] [Support for HTML fragments in odoc] [API changes and capability to fetch metadata from RSS post links] [Dream] [Brr] [Omd] [many more] What's next? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Launching the website is the first step on our roadmap to improve OCaml=E2=80=99s online presence. As mentioned above, the immediate goal is to be ready for this OCaml 5.00.0 release. With this in mind, we want to focus on improving the documentation and ensuring it includes good user pathways to learn about Domains, Effects, and generally how to write concurrent programs in OCaml. In addition to the documentation, some of the other projects on our roadmap are: =E2=80=A2 Toplevels for all the packages that compile to JavaScript. =E2=80=A2 Including OCaml Weekly News in the OCaml blog. =E2=80=A2 A better search through packages, documentation, and packages' documentation. This is an exciting time! Stay tuned! Call for maintainers =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C There's a lot of ways to contribute if you'd like to help. Our [contributing guide] should be a good entry point to learn what you can do as a community contributor. We're also looking for maintainers. As we're completing the first milestone with the launch and will start working on new projects, now is a great time to get involved! If you'd like to help on the initiatives on our roadmap above (or others!), feel free to reach out to me by email at thibaut@tarides.com, or by replying to this post. [contributing guide] Acknowledgements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This project was a huge effort that started over a year ago, and the result of dozens of [contributors]. We want to thank every one who contributed to the site. In particular, for the groundwork on rethinking the sitemap, user flows, new content, design, and frontend and package docs, we thank Ashish Agarwal, Kanishka Azimi, Richard Davison, Patrick Ferris, Gemma Gordon, Isabella Leandersson, Thibaut Mattio and Anil Madhavapeddy. For the work on the package site infrastructure and UI, we thank Jon Ludlam, Jules Aguillon and Lucas Pluvinage. And for the work on the designs and bringing them to life on the frontend, we thank Isabella Leandersson and Asaad Mahmood. For the work on the new content and reviewing the existing one, we thank Christine Rose and Isabella Leandersson. For the contributions on the content for Ahrefs, Jane Street and LexiFi respectively, we thank Louis Roch=C3=A9, James Somers, Nicol=C3=A1= s Ojeda B=C3=A4r. We=E2=80=99d also like to thank the major funders who supported the work = on revamping the website: grants from the Tezos Foundation, Jane Street and Tarides facilitated the bulk of the work. Thank you, and if anyone else wishes to help support it on an ongoing basis then donations to the OCaml Software Foundation and grants to the maintenance teams mentioned above are always welcomed. [contributors] Remaking an Old Game in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yotam Barnoy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've starting blogging about a [side-project of mine]. Hopefully I'll find the time to write some further entries in the series, including about reverse engineering a binary with IDA. [side-project of mine] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 26 to May 03, 2= 022.

    ATD now supports TypeScript

    Martin Jambon announced

    ATD is a language for specify= ing typed interfaces for communicating across programming languages. It turns concrete type definitions ("schema") into c= ode for each language. This code can read and write JSON safely, relieving the user of worrying about the structure o= f the JSON data.

    Starting from version 2.5.0, ATD provides atdts, a single exec= utable that turns a file foo.atd into foo.ts. See the t= utorial for an introduction. The programming languages targeted by ATD are now:

    • Java
    • OCaml
    • Python + mypy
    • ReScript (BuckleScript)
    • Scala
    • TypeScript

    For an expert overview of the features that are currently supported, check = out the test data:

    See also the announcement for atdpy that we made a month ago.

    pp_loc 2.0

    Armael announced

    Do you know how OCaml now displays errors by quoting back part of the sourc= e, highlighting the faulty part? For instance, with a single-line error location:

    File "foo.ml", line 1, characters 12-14:
    1 | let foo x =3D yy + 1;;
                    ^^
    

    or a multi-line location:

    File "bar.ml", lines 3-5, characters 10-10:
    3 | ..........function
    4 |   | A -> 0
    5 |   | B -> 1
    

    Do you have your own language/configuration file/… parser or typeche= cker, that could benefit from nice, user-friendly error messages?

    The pp_loc library provide= s an easy-to-use implementation of the same source-quoting mechanism that is used in the OCaml compiler. It provides a = single function pp which will display the relevant part of the input given the location(s) of the error.

    val pp :
      ?max_lines:int ->
      input:Input.t ->
      Format.formatter ->
      loc list ->
      unit
    

    (As one can see from the signature, pp also supports displayin= g several locations at once on the same source snippet, for multi-location errors.)

    The full documentation is available online, and the library is available on opam (opam install pp_loc).

    This new version, thanks to the contribution of @c-cube, makes the lo= c type more flexible. It should now be easy to create source locations that can be passed to pp, however you = represent them in your parser (be it as (line,column) pairs, offsets, or any combination of those…). For more details, see= the Pp_loc.Position module.

    I am completely open to more PRs or ideas for improving the library further= , and displaying source locations in even nicer ways!

    Happy error-message printing!

    Windows-friendly OCaml 4.12 distribution - Diskuv OCaml 0.1.0<= /h2>

    jbeckford announced

    A single setup-*.exe executable is now all that is necessary t= o install the Diskuv OCaml distribution on 64-bit Windows!

    Today you can use a prerelease of v0.4.0 which is available at https://githu= b.com/diskuv/dkml-installer-ocaml/releases/download/v0.4.0-prerel11/setup-d= iskuv-ocaml-windows_x86_64-0.4.0.exe

    The prerelease:

    • is for experienced Windows users only because the prerelease is = not signed! You will have to fight with your browser, operating system and = anti-virus software to run the setup executable
    • is not reproducible. Because many Diskuv packages have not yet m= ade it into Opam, the builds need several opam pin of unstable= branches.
    • has not been incorporated into the https://diskuv.gitlab.io/diskuv-ocaml documentation site.= But the Beyond Basics documentation should still be accurate= .

    Once those items above are addressed, a real (non-prerelease) 0.4.0 will be= announced.

    Existing Diskuv OCaml users: Your existing Opam switches should be unaffect= ed by the upgrade. But please make sure you can recreate your Opam switches (ie. use a .opam file) if = something goes wrong.

    Release notes, including details of the migration to the Apache 2.0 license= , are at available at https://github.com/diskuv/dkml-installer-ocaml/releases/tag/v0= .4.0-prerel11

    V3.ocaml.org: we are live!

    Thibaut Mattio announced

    I am thrilled to announce that https://ocaml= .org/ now serves version 3 of the site! Here's an overview of the major features in this new version:

    Version 2 remains accessible at https://v= 2.ocaml.org/, and older URLs to ocaml.org will be redirected to the v2 = URL from now on. Similarly, v3.ocaml.org URLs will continue to work.

    Community feedback was instrumental and has been driving the direction of t= he project since day one. For instance, having a centralized package documentation site; or facilitating the hiring= of OCaml developers and finding OCaml jobs were major concerns that were highlighted in the last OCaml Survey. They were what prompted us to work on the documentation site and the job board respectively.

    We've also listened to the community feedback we received along the way, an= d in particular, here's an overview of everything we've been doing to address the feedback we received after our l= ast Discuss post: https://hackmd.io/IniI= M_p3Qs2UB74cuKK7UQ.

    Given how critical your input is to drive the project, I am deeply grateful= to every one who took the time to share insights, suggestions and bug reports. Some of the suggestions will need mo= re work and couldn't happen before launch, but we've listened to every one and will keep working on improving OCaml.or= g to address pain points of the community. Thank you, and keep the feedback coming!

    We're also starting to see a lot of contributions from external contributor= s. OCaml.org is open source, and contributions from anyone are extremely welcome! Never hesitate to open a P= R if you see something you'd like to improve! You can read our Contributing Guide to learn how to contribute.

    Ecosystem Contributions

    As the storefront of the OCaml ecosystem, we couldn't develop the next vers= ion of OCaml.org without contributing back! As a result, we've published several packages on opam that we're usin= g for OCaml.org:

    Other packages that are yet to be released are:

    We've also made contributions downstream:

    A huge thank you to the community for your constant effort in making OCaml = such a great language to work with! In particular, here are some amazing community projects we are building upon: = Dream, Brr and Omd and many more

    What's next?

    Launching the website is the first step on our roadmap to improve OCaml=E2= =80=99s online presence.

    As mentioned above, the immediate goal is to be ready for this OCaml 5.00.0= release. With this in mind, we want to focus on improving the documentation and ensuring it includes good user pat= hways to learn about Domains, Effects, and generally how to write concurrent programs in OCaml.

    In addition to the documentation, some of the other projects on our roadmap= are:

    • Toplevels for all the packages that compile to JavaScript.
    • Including OCaml Weekly News in the OCaml blog.
    • A better search through packages, documentation, and packages' document= ation.

    This is an exciting time! Stay tuned!

    Call for maintainers

    There's a lot of ways to contribute if you'd like to help. Our contributing guide should be a good entry point to learn what you can do as a community contributor.

    We're also looking for maintainers. As we're completing the first milestone= with the launch and will start working on new projects, now is a great time to get involved!

    If you'd like to help on the initiatives on our roadmap above (or others!),= feel free to reach out to me by email at thibaut@tarides.com, or by replying to this post.

    Acknowledgements

    This project was a huge effort that started over a year ago, and the result= of dozens of contribu= tors. We want to thank every one who contributed to the site.

    In particular, for the groundwork on rethinking the sitemap, user flows, ne= w content, design, and frontend and package docs, we thank Ashish Agarwal, Kanishka Azimi, Richard Davison, Pat= rick Ferris, Gemma Gordon, Isabella Leandersson, Thibaut Mattio and Anil Madhavapeddy.

    For the work on the package site infrastructure and UI, we thank Jon Ludlam= , Jules Aguillon and Lucas Pluvinage. And for the work on the designs and bringing them to life on the frontend, we t= hank Isabella Leandersson and Asaad Mahmood.

    For the work on the new content and reviewing the existing one, we thank Ch= ristine Rose and Isabella Leandersson.

    For the contributions on the content for Ahrefs, Jane Street and LexiFi res= pectively, we thank Louis Roch=C3=A9, James Somers, Nicol=C3=A1s Ojeda B=C3=A4r.

    We=E2=80=99d also like to thank the major funders who supported the work on= revamping the website: grants from the Tezos Foundation, Jane Street and Tarides facilitated the bulk of the work. Thank= you, and if anyone else wishes to help support it on an ongoing basis then donations to the OCaml Software Foundat= ion and grants to the maintenance teams mentioned above are always welcomed.

    Remaking an Old Game in OCaml

    Yotam Barnoy announced

    I've starting blogging about a side-project of mine. Hopefully I'll find the time to write some further entries in the series, including about reverse engine= ering a binary with IDA.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 707E4E0099 for ; Tue, 10 May 2022 14:30:58 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zyLG=VS=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: /lDZuKKnQW9uNLiBbiU0kkPZvuZpGkbZUKVyqynhD3ypwQn/a1SJ9MnhErXalrGOB5qA7Lvhce N128yC20Wzn4L0/yK5sqcIJ2Hq1c3tZYhxkObp31jFuvOBNXd6qlkkTL1MASxjwMb2gPYO2PDW 4um2mZSRrM6vFjIFR78bQJdFFVq6k+/ABWSmK/NbPDbqeVX9AZk41q1sprBGgXqCZ8veifjO+Q 6JQiiW/nnBGX8+gbTihXubPkxjw58HSA/CfGL2MkXNaXUa5iOR3sfVHsoSofCwhdFC7PRzxQrT H/DBAlVXFfGrJiAU5J2eOTbX X-IPAS-Result: =?us-ascii?q?A0ALBgCjWXpieyIeaIFag3mBAxkBZFUtBwhDhE6JAIVAA?= =?us-ascii?q?YJKbIhilR8BAwENLAEKCAECBAEBhRo5AQSEagIeBgEFMxMBAgQBAQEBAwIDA?= =?us-ascii?q?QEBAQEBAwEBBQEBAQIBAQIEBAETAQEPCwkGBwsGEA4FPGRkBIFLBIF0CzQNg?= =?us-ascii?q?iITDBmDcAEhCmUjAxsDAgQNARcBHhcBEhqCZIMXBQqQT5wRgTGBAYNPAQMFh?= =?us-ascii?q?EGBZSSBGIYYWEqDCIQZKRCBVUSBFYJ6boJLFwEBAQEBgTsBAYN2gmUElHsOg?= =?us-ascii?q?XgBWDgNS0qSZ49CiSKVIzQHg0yBOwYMiCuBIIx7iCCFRKMPIZZBIIklgRqCR?= =?us-ascii?q?pRBhTuBTiqBfjMaMFAQgksJRQEDAg0BAgIDAQIBAgkBAQKNdQGEGYRZO4VMP?= =?us-ascii?q?zQCAQE3AgYBCgEBAwmFYwEBBRMLAYtmAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 r/sSg8= IronPort-HdrOrdr: A9a23:aAvPya2BX16LLPWJ+GaCwAqjBLwkLtp133Aq2lEZdPUnSKylfq GV9sjzuiWZtN98YgBEpTnEAtjlfZq+z/FICOsqUItKNTOO0ACVxcNZnOjfKlbbehEWmNQtt5 uIP5IRNDWsYGIK6vrH3A== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,214,1647298800"; d="scan'208,217";a="35567203" X-MGA-submission: =?us-ascii?q?MDH0zJwpQwlp26k0DNZKXj+RACuKku+ywbkF6A?= =?us-ascii?q?1ZrDWjIWFy/dld6E/Jm1criSAPjPUZa9e7KZeaT4wCKd8CYw27sGDQpA?= =?us-ascii?q?CAyXD1xtRizAG2eaDmirJ7BGdYPYptWFL49i2w669hRux1YxGZiFeNts?= =?us-ascii?q?ioIfvDqgNqu1O9eeav1oW8QQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 May 2022 14:30:58 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0AD93565ABD; Tue, 10 May 2022 14:30:57 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 10 May 2022 14:30:56 +0200 Message-ID: <87tu9x4lj3.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 10 14:30:57 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.087378, queueID=5A4B9565ABF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDAzIHRvIDEwLA0KMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpNdWx0aWNvcmUg T0NhbWw6IE1hcmNoIDIwMjINCk9sZCBDV04NCg0KDQpNdWx0aWNvcmUgT0NhbWw6IE1hcmNoIDIw MjINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvbXVsdGljb3JlLW9jYW1sLW1hcmNoLTIwMjIvOTY5Mi8zPg0KDQoN CkRlZXAgaW4gdGhpcyB0aHJlYWwsIEtDIFNpdmFyYW1ha3Jpc2huYW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgYmVuY2htYXJrcyBmcm9t IHRoZSAiUmV0cm9maXR0aW5nIEVmZmVjdCBoYW5kbGVycyB0byBPQ2FtbCIgUExESQ0KICAyMDIy IHBhcGVyICg8aHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzIxMDQuMDAyNTA+KSBpcyBhdmFpbGFibGUg aGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9wcmlzbWxhYi9yZXRyby1jb25jdXJyZW5jeS90 cmVlL21hc3Rlci9iZW5jaD4uIFNlZQ0KICBzZWN0aW9ucyA2LjIgYW5kIDYuMyBpbiB0aGUgcGFw ZXIuDQoNCg0KSGUgbGF0ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkndmUgbW92ZWQgdGhlIG1pY3JvYmVuY2htYXJrcyBhbG9uZSB0byBh IHNlcGFyYXRlIHJlcG86DQogIDxodHRwczovL2dpdGh1Yi5jb20vcHJpc21sYWIvcmV0cm8tY29u Y3VycmVuY3ktYmVuY2g+LiBUaGlzIHJlcG8gYWxzbw0KICBjb250YWlucyBpbnN0cnVjdGlvbnMg dG8gcnVuIHRoZSBkb2NrZXIgY29udGFpbmVyIHRoYXQgcnVucyB0aGUNCiAgYmVuY2htYXJrcyBm cm9tIHRoZSBwYXBlciB3aXRoIHRoZSBjdXN0b20gY29tcGlsZXIgdmFyaWFudHMuDQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIFtvbmxpbmVdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0 dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW29ubGluZV0gPGh0dHA6Ly9saXN0 cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 03 to 10, 2022.

    Multicore OCaml: March 2022

    Deep in this threal, KC Sivaramakrishnan announced

    The benchmarks from the "Retrofitting Effect handlers to OCaml" PLDI 2022 paper (https://arxiv.org/abs/2104.00250) is available here: https://github.com/prismlab/retro-concurrency/tree/master/bench. See sections 6.2 and 6.3 in the paper.

    He later added

    I've moved the microbenchmarks alone to a separate repo: https://github.com/prismlab/retro-concurrency-bench. This repo also contains instructions to run the docker container that runs the benchmarks from the paper with the custom compiler variants.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --==-=-=-- --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Pour une =C3=A9valuation ind=C3=A9pendante, transparente et rigoureuse ! Je soutiens la Commission d'=C3=89valuation de l'INRIA. --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 089E1E00A8 for ; Tue, 17 May 2022 09:12:37 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Sk9K=VZ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: NQkiAEd21twLmmVqHTurNI25BPQuxlwvvW5GKQ4uS+/JggjwB+Nv75H5EK+NO97Cot37bdHdh0 XGBQbyBxT5nxJ6+3v+YRpQ0rd5L1gknN0pWZL2rVtbul0HRS5MTKwGspKpqmnWEq83XsC3bRdO qSx5UX7AWVhPzZgf381ZP5IPbtbE+zfHXzSPHJfAfgdNpGNTndvODbDkqEnrR3EkEKSuxCiVHi t0mY2Hjd6eFsjAc+/IGmxwUxhKAIUnRKgFiFAGobV66/2gZmuxssO11XptC5hQhoNHQGFdHcGR MCpF3iNrSNX0rizKXfixO63M X-IPAS-Result: =?us-ascii?q?A0DXAAAQSoNimCIeaIFag3mBAxkBXgZVLQcIQ4ROgWOHH?= =?us-ascii?q?YgLiU6UPgNfAQMBDSwBBQ0BAgQBAYNMgU6FKAIeBgEFMxMBAgQBAQEBAwIDA?= =?us-ascii?q?QEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEJCwkHBgoHEA4FPGRkBIFLB?= =?us-ascii?q?IF0CzQNgjUMDAMDg3cBGwYKZSMDFAcDAgQNARcBHhcBEhQGAYJiAYMXBAEKk?= =?us-ascii?q?BOcEYExgQGDTwEDBRABDgmEGYESUySBGIYZWEoBgwmEGQInEIFVRIEVgnpug?= =?us-ascii?q?UJERRcBAQEBAYE7AQEIg26CZQSVaQc6A1SBBRKBIXEBCAYGBwoFMgYCDBgUB?= =?us-ascii?q?AITEk0GHgITDAoGFg5CEhkMDwMSAxEBBwILEggVLAgDAgMIAwIDLgIDGAkHC?= =?us-ascii?q?gMdCAocEhAUAgQTHwsIAxofLQkCBA4DQwgLCgMRBAMTGAsWCBAEBgMJLw0oC?= =?us-ascii?q?wMFDw8BBgMGAgUFAQMgAxQDBScHAyEHCyYNDQQjHQMDBSYDAgIbBwICAwIGF?= =?us-ascii?q?wYCAhlYCigNCAQIBBgEHiUTBQIHMQUELwIeBAUGEQkCFgIGBAUCBAQWAgISC?= =?us-ascii?q?AIIJxsHFjYZAQVdBgsJIxYGHBARBQYWAyZTDgYikmaDHQmBMwgGCjYOPDATH?= =?us-ascii?q?g0BWBkfATEPCQQKSggDOol0iC6YaYJgkUt8NAeDT4E9BgyIK4EgjH+IIoN1g?= =?us-ascii?q?U+RTZFGIZZFIIkmgRqCSIhIi3oDAhWFJIFOKoF+MxowgysJRQEDAg0BAgIDA?= =?us-ascii?q?QIBAgkBAQJTjSiEFIJZC4F1O4VMPzQCAQE3AgYBCgEBAwmFYwEBBRMLAYkGA?= =?us-ascii?q?QE?= IronPort-PHdr: A9a23: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 9aL8pTEkW6GJKQ= IronPort-Data: A9a23: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 r7sSg== IronPort-HdrOrdr: A9a23:wcI8O6uJcX6CgikDFbyNEPZ87skDcdV00zEX/kB9WHVpm62j9/ xG88516faZslwssRIb+OxoWpPvfZq0z/ccirX5Vo3PYOCJggaVBbAnxbSn6TztES/z+4dmpM RdWpk7Lsb/SXxzjcOS2njcLz/M+qjkzJyV X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,232,1647298800"; d="scan'208,217";a="36616131" X-MGA-submission: =?us-ascii?q?MDFP3HLENQ58LS/IgfdMGJ3ZmJCIjJePPwqNGn?= =?us-ascii?q?nX3fT71AytM84vb0Cf8eWeyjjwf1WHZKM0s8H+FnUY3ko/zKCkLR/EZm?= =?us-ascii?q?gSd5v90m8QOedgqChktFCUYkA0CfnfNofLD0LiXR1438nDASLzpAMEVz?= =?us-ascii?q?w+2XnCejxf8RRRvbo+e+gSig=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 May 2022 09:12:36 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 749675605B9; Tue, 17 May 2022 09:12:35 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 17 May 2022 09:12:34 +0200 Message-ID: <87lev0zl7h.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 17 09:12:35 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.024764, queueID=E0FD75605EF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDEwIHRvIDE3LA0KMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpCcm93c2luZyBP Q2FtbCBzb3VyY2UgdHJlZSB3aXRoIFZTQ29kZS9tZXJsaW4/DQpyZWxlYXNlIG9mIHByYm5tY24t Z251cGxvdCAwLjAuMw0KQ2FsbCBmb3IgUHJlc2VudGF0aW9ucyBmb3IgIlRlYWNoaW5nIEZ1bmN0 aW9uYWwgUHJvZ3JhbW1pbmcgaW4gT0NhbWwiIGFzIHBhcnQgb2YgdGhlIE9DYW1sIFdvcmtzaG9w IDIwMjINCk9sZCBDV04NCg0KDQpCcm93c2luZyBPQ2FtbCBzb3VyY2UgdHJlZSB3aXRoIFZTQ29k ZS9tZXJsaW4/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jyb3dzaW5nLW9jYW1sLXNvdXJjZS10cmVlLXdpdGgt dnNjb2RlLW1lcmxpbi85ODE5LzI+DQoNCg0KS2VpZ28gSW1haSBleHBsYWluZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEkgbWFuYWdlZCB0byBicm93c2UgdGhlIE9DYW1sIHNvdXJjZSB0cmVlIHdpdGggVlNDb2RlIHdp dGggdGhlDQogIGZvbGxvd2luZyBzdGVwczoNCg0KICAxLiBQcmVwYXJlIGAubWVybGluJyBmaWxl IChhdHRhY2hlZCBiZWxvdykgcmVmZXJyaW5nIHRvIHRoZSBhbGwgc291cmNlDQogICAgIGRpcmVj dG9yaWVzIGluIHRoZSB0cmVlDQogIDIuIFBpbiB5b3VyIG9jYW1sLWxzcC1zZXJ2ZXIgYXQgMS44 LjMgYnkgYG9wYW0gcGluIG9jYW1sLWxzcC1zZXJ2ZXINCiAgICAgMS44LjMnIChhcyBpdCBpcyB0 aGUgbGFzdCB2ZXJzaW9uIHRoYXQgc3VwcG9ydCBgLm1lcmxpbicpDQogIDMuIENsb25lIE9DYW1s IHJlcG9zaXRvcnkgYW5kIGNoZWNrIG91dCB0aGUgc2FtZSBPQ2FtbCB2ZXJzaW9uIGFzDQogICAg IHlvdXJzIChlLmcuIGBvcGFtIHN3aXRjaCBjcmVhdGUgNC4xMi4xOyBnaXQgY2hlY2tvdXQgNC4x Mi4xJykNCiAgNC4gQnVpbGQgT0NhbWwgKC4vY29uZmlndXJlICYmIG1ha2Ugd29ybGQpDQogIDUu IE9wZW4gdGhlIHRvcCBmb2xkZXIgb2YgdGhlIHNvdXJjZSB0cmVlIHVzaW5nIFZTQ29kZSAob3Ig cmVzdGFydCB0aGUNCiAgICAgbGFuZ3VhZ2Ugc2VydmVyKQ0KICA2LiBCcm93c2UgdGhlIGNvZGUN Cg0KICBDaGVlcnMhDQoNCiAgY29udGVudCBvZiBgLm1lcmxpbic6DQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgUyAuL2FzbWNvbXAvDQogIOKUgiBTIC4vYm9vdC9tZW5oaXIvDQogIOKUgiBTIC4v Ynl0ZWNvbXAvDQogIOKUgiBTIC4vZGVidWdnZXIvDQogIOKUgiBTIC4vZHJpdmVyLw0KICDilIIg UyAuL2ZpbGVfZm9ybWF0cy8NCiAg4pSCIFMgLi9sYW1iZGEvDQogIOKUgiBTIC4vbGV4Lw0KICDi lIIgUyAuL21pZGRsZV9lbmQvDQogIOKUgiBTIC4vbWlkZGxlX2VuZC9jbG9zdXJlLw0KICDilIIg UyAuL21pZGRsZV9lbmQvZmxhbWJkYS8NCiAg4pSCIFMgLi9taWRkbGVfZW5kL2ZsYW1iZGEvYmFz ZV90eXBlcy8NCiAg4pSCIFMgLi9vY2FtbGRvYy8NCiAg4pSCIFMgLi9vY2FtbHRlc3QvDQogIOKU giBTIC4vb3RoZXJsaWJzL2R5bmxpbmsvDQogIOKUgiBTIC4vb3RoZXJsaWJzL2R5bmxpbmsvYnl0 ZS8NCiAg4pSCIFMgLi9vdGhlcmxpYnMvZHlubGluay9keW5saW5rX2NvbXBpbGVybGlicy8NCiAg 4pSCIFMgLi9vdGhlcmxpYnMvZHlubGluay9uYXRpdmUvDQogIOKUgiBTIC4vb3RoZXJsaWJzL3N0 ci8NCiAg4pSCIFMgLi9vdGhlcmxpYnMvc3lzdGhyZWFkcy8NCiAg4pSCIFMgLi9vdGhlcmxpYnMv dW5peC8NCiAg4pSCIFMgLi9wYXJzaW5nLw0KICDilIIgUyAuL3N0ZGxpYi8NCiAg4pSCIFMgLi90 b29scy8NCiAg4pSCIFMgLi90b29scy91bmxhYmVsLXBhdGNoZXMvDQogIOKUgiBTIC4vdG9wbGV2 ZWwvDQogIOKUgiBTIC4vdG9wbGV2ZWwvYnl0ZS8NCiAg4pSCIFMgLi90b3BsZXZlbC9uYXRpdmUv DQogIOKUgiBTIC4vdHlwaW5nLw0KICDilIIgUyAuL3V0aWxzLw0KICDilIIgQiAuL2FzbWNvbXAv DQogIOKUgiBCIC4vYXNtY29tcC9kZWJ1Zy8NCiAg4pSCIEIgLi9ib290Lw0KICDilIIgQiAuL2J5 dGVjb21wLw0KICDilIIgQiAuL2RlYnVnZ2VyLw0KICDilIIgQiAuL2RyaXZlci8NCiAg4pSCIEIg Li9maWxlX2Zvcm1hdHMvDQogIOKUgiBCIC4vbGFtYmRhLw0KICDilIIgQiAuL2xleC8NCiAg4pSC IEIgLi9taWRkbGVfZW5kLw0KICDilIIgQiAuL21pZGRsZV9lbmQvY2xvc3VyZS8NCiAg4pSCIEIg Li9taWRkbGVfZW5kL2ZsYW1iZGEvDQogIOKUgiBCIC4vbWlkZGxlX2VuZC9mbGFtYmRhL2Jhc2Vf dHlwZXMvDQogIOKUgiBCIC4vb2NhbWxkb2MvDQogIOKUgiBCIC4vb2NhbWxkb2MvZ2VuZXJhdG9y cy8NCiAg4pSCIEIgLi9vY2FtbHRlc3QvDQogIOKUgiBCIC4vb3RoZXJsaWJzL2JpZ2FycmF5Lw0K ICDilIIgQiAuL290aGVybGlicy9keW5saW5rLw0KICDilIIgQiAuL290aGVybGlicy9keW5saW5r L2J5dGUvDQogIOKUgiBCIC4vb3RoZXJsaWJzL2R5bmxpbmsvZHlubGlua19jb21waWxlcmxpYnMv DQogIOKUgiBCIC4vb3RoZXJsaWJzL2R5bmxpbmsvbmF0aXZlLw0KICDilIIgQiAuL290aGVybGli cy9zdHIvDQogIOKUgiBCIC4vb3RoZXJsaWJzL3N5c3RocmVhZHMvDQogIOKUgiBCIC4vb3RoZXJs aWJzL3VuaXgvDQogIOKUgiBCIC4vcGFyc2luZy8NCiAg4pSCIEIgLi9zdGRsaWIvDQogIOKUgiBC IC4vdGVzdHN1aXRlL3Rlc3RzL25vLWFsaWFzLWRlcHMvDQogIOKUgiBCIC4vdG9vbHMvDQogIOKU giBCIC4vdG9wbGV2ZWwvDQogIOKUgiBCIC4vdG9wbGV2ZWwvYnl0ZS8NCiAg4pSCIEIgLi90b3Bs ZXZlbC9uYXRpdmUvDQogIOKUgiBCIC4vdHlwaW5nLw0KICDilIIgQiAuL3V0aWxzLw0KICDilJTi lIDilIDilIDilIANCg0KDQpyZWxlYXNlIG9mIHByYm5tY24tZ251cGxvdCAwLjAuMw0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1wcmJubWNuLWdudXBsb3QtMC0w LTMvOTg0MC8xPg0KDQoNCklnYXJuaWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgW3ByYm5tY24tZ251cGxvdF0g aXMgYSBkZWNsYXJhdGl2ZSB3cmFwcGVyIG9uIHRvcCBvZg0KICBbZ251cGxvdF0uIFZlcnNpb24g MC4wLjMgd2FzIGp1c3QgcmVsZWFzZWQuDQoNCiAgVGhlIEFQSSBpcyBub3QgZW50aXJlbHkgc2V0 IGluIHN0b25lIGJ1dCBpdCdzIHJlYXNvbmFibHkgdXNhYmxlLCBhdA0KICBsZWFzdCBmb3IgdXAg dG8gbW9kZXJhdGVseSBzaXplZCBwbG90cy4gSXQgcHJvY2VlZHMgYnkgY29uc3RydWN0aW5nDQog IHNlbGYtY29udGFpbmVkIGdudXBsb3Qgc2NyaXB0cyBmcm9tIGRlY2xhcmF0aXZlIHNwZWNpZmlj YXRpb25zIGFuZA0KICBkZWZlcnJpbmcgdG8gZ251cGxvdCBmb3IgZXhlY3V0aW9uLg0KDQogIEhl cmUncyB0aGUgW2RvY3VtZW50YXRpb25dLg0KDQogIEhhcHB5IGhhY2tpbmchDQoNCg0KW3ByYm5t Y24tZ251cGxvdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9pZ2Fybmllci9wcmJubWNuLWdudXBsb3Q+ DQoNCltnbnVwbG90XSA8aHR0cDovL3d3dy5nbnVwbG90LmluZm8vPg0KDQpbZG9jdW1lbnRhdGlv bl0gPGh0dHBzOi8vaWdhcm5pZXIuZ2l0aHViLmlvL3ByYm5tY24tZ251cGxvdC8+DQoNCg0KQ2Fs bCBmb3IgUHJlc2VudGF0aW9ucyBmb3IgIlRlYWNoaW5nIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcg aW4gT0NhbWwiIGFzIHBhcnQgb2YgdGhlIE9DYW1sIFdvcmtzaG9wIDIwMjINCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvY2FsbC1mb3ItcHJlc2VudGF0aW9ucy1mb3ItdGVhY2hpbmctZnVuY3Rpb25hbC1wcm9n cmFtbWluZy1pbi1vY2FtbC1hcy1wYXJ0LW9mLXRoZS1vY2FtbC13b3Jrc2hvcC0yMDIyLzk4NDcv MT4NCg0KDQpZdXJ1ZyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQpTcGVjaWFsIFNlc3Npb24gLyBDYWxsIGZvciBQcmVzZW50YXRpb25z IGZvciAiVGVhY2hpbmcgRnVuY3Rpb25hbCBQcm9ncmFtbWluZyBpbiBPQ2FtbCIgYXMgcGFydCBv ZiB0aGUgT0NhbWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IFdvcmtzaG9wIDIwMjINCg0KICDigKIgQWJzdHJhY3QgU3VibWlzc2lvbjogNiBKdW5lIDIwMjIN CiAg4oCiIEF1dGhvciBOb3RpZmljYXRpb246IDcgSnVseSAyMDIyDQogIOKAoiBPQ2FtbCBXb3Jr c2hvcDogOSBTZXB0IDIwMjINCg0KICBUaGUgT0NhbWwgV29ya3Nob3AgMjAyMiwgY28tbG9jYXRl ZCB3aXRoIElDRlAgMjAyMiwgd2lsbCB0YWtlIHBsYWNlDQogIHRoZSAyMDIyLTA5LTE2IGFuZCB3 aWxsIGJlIGhlbGQgYXQgTGp1YmxqYW5hLCBTbG92ZW5pYS4gVGhpcyB5ZWFyLCB3ZQ0KICB3b3Vs ZCBsaWtlIHRvIG9yZ2FuaXplIGEgc3BlY2lhbCBzZXNzaW9uIG9uICJUZWFjaGluZyBGdW5jdGlv bmFsDQogIFByb2dyYW1taW5nIGluIE9DYW1sIi4NCg0KICBIZW5jZSwgd2Ugd291bGQgbGlrZSB0 byBlbmNvdXJhZ2UgYW5kIGludml0ZSBzdWJtaXNzaW9ucyBmb3INCiAgcHJlc2VudGF0aW9ucyB0 aGF0IGhpZ2hsaWdodCB0ZWFjaGluZyBwcmFjdGljZXMgYW5kIGlubm92YXRpb24gdGhhdA0KICBo aWdobGlnaHQgaG93IE9DYW1sIGlzIHRhdWdodCBhcm91bmQgdGhlIGdsb2JlIGFuZCB0aGUgd2lk ZSByYW5nZSBvZg0KICB0b29scyBhbmQgc3RyYXRlZ2llcyB0aGF0IGhhdmUgYmVlbiBkZXZlbG9w ZWQgdG8gdGVhY2ggZWZmZWN0aXZlbHkNCiAgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyB1c2luZyBP Q2FtbC4gSW4gcGFydGljdWxhciwgd2UgYXJlIGludGVyZXN0ZWQNCiAgaW4gYXV0b21hdGVkIHBy b2dyYW0gZXZhbHVhdGlvbiAvIGdyYWRpbmcgdG9vbHMgLyBlcnJvciBhbmFseXNpcyAoYm90aA0K ICB0eXBlIGFuZCBzeW50YXggZXJyb3JzKSBmb3IgT0NhbWwgcHJvZ3JhbXMsIHRvb2xzIHRoYXQg cHJvdmlkZQ0KICBhc3Npc3RhbmNlIGluIHByYWN0aWNhbCBsZXNzb25zIChzdWNoIGFzIHBhaXIg cHJvZ3JhbW1pbmcgZm9yDQogIGV4YW1wbGUpLCBKdXBpdGVyIG5vdGVib29rcyBsaWtlIHNvbHV0 aW9ucyB0byBpbnRlcmFjdGl2ZWx5IGludHJvZHVjZQ0KICBwcm9ncmFtbWluZyBjb25jZXB0cywg b3IgZnVsbC1mZWF0dXJlZCB3ZWIgcGxhdGZvcm1zLiBXZSBhcmUNCiAgcGFydGljdWxhcmx5IHNl ZWtpbmcgY29udHJpYnV0aW9ucyBhbmQgZXhwZXJpZW5jZSByZXBvcnRzIG9mIHRoZQ0KICBMZWFy bi1PQ2FtbCBvbmxpbmUgcHJvZ3JhbW1pbmcgZW52aXJvbm1lbnQgd2hpY2ggaGFzIGJlZW4gdXNl ZCBieSB0aGUNCiAgT0NhbWwgdGVhY2hpbmcgY29tbXVuaXR5IGZvciBvbmxpbmUgYnV0IGFsc28g Zm9yIHJlZ3VsYXIgaW4tcGVyc29uDQogIGNsYXNzZXMuIFRoZSBnb2FsIGlzIHRvIHNoYXJlIGV4 cGVyaWVuY2VzLCBleGNoYW5nZSBpZGVhcyBhbmQgdG9vbHMsDQogIGFuZCBwcm9tb3RlIGJlc3Qg cHJhY3RpY2VzLg0KDQogIEludGVyZXN0ZWQgcmVzZWFyY2hlcnMgYXJlIGludml0ZWQgdG8gc3Vi bWl0IGFuZCByZWdpc3RlciBhDQogIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWxrIChhYm91dCAyIHBh Z2VzIGxvbmcpIGF0DQogIDxodHRwczovL29jYW1sMjAyMi5ob3RjcnAuY29tL3Byb3ZpZGluZz4g YSBjbGVhciBzdGF0ZW1lbnQgb2Ygd2hhdA0KICB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBwcmVz ZW50YXRpb246IHRoZSBwcm9ibGVtcyB0aGF0IGFyZSBhZGRyZXNzZWQsDQogIHRoZSBzb2x1dGlv bnMgb3IgbWV0aG9kcyB0aGF0IGFyZSBwcm9wb3NlZC4NCg0KICBMYVRlWC1wcm9kdWNlZCBQREZz IGFyZSBhIGNvbW1vbiBhbmQgd2VsY29tZSBzdWJtaXNzaW9uIGZvcm1hdC4gRm9yDQogIGFjY2Vz c2liaWxpdHkgcHVycG9zZXMsIHdlIGFzayBQREYgc3VibWl0dGVycyB0byBhbHNvIHByb3ZpZGUg dGhlDQogIHNvdXJjZXMgb2YgdGhlaXIgc3VibWlzc2lvbiBpbiBhIHRleHR1YWwgZm9ybWF0LCBz dWNoIGFzIC4udGV4DQogIHNvdXJjZXMuIFJldmlld2VycyBtYXkgcmVhZCBlaXRoZXIgdGhlIHN1 Ym1pdHRlZCBQREYgb3IgdGhlIHRleHQNCiAgdmVyc2lvbi4NCg0KICBUaGUgT0NhbWwgd29ya3No b3AgYW5kIHRoaXMgc3BlY2lhbCBzZXNzaW9uIGFyZSBpbmZvcm1hbCBtZWV0aW5ncyB3aXRoDQog IG5vIGZvcm1hbCBwcm9jZWVkaW5ncy4gVGhlIHByZXNlbnRhdGlvbiBtYXRlcmlhbCB3aWxsIGJl IGF2YWlsYWJsZQ0KICBvbmxpbmUgZnJvbSB0aGUgd29ya3Nob3AgaG9tZXBhZ2UuIFRoZSBwcmVz ZW50YXRpb25zIG1heSBiZSByZWNvcmRlZA0KICBhbmQgbWFkZSBhdmFpbGFibGUgYXQgYSBsYXRl ciBkYXRlLg0KDQogIFRoZSBtYWluIHByZXNlbnRhdGlvbiBmb3JtYXQgaXMgYSB3b3Jrc2hvcCB0 YWxrLCB0cmFkaXRpb25hbGx5IGFyb3VuZA0KICAyMCBtaW51dGVzIGluIGxlbmd0aCwgcGx1cyBx dWVzdGlvbiB0aW1lLCBidXQgd2UgYWxzbyBoYXZlIGEgcG9zdGVyDQogIHNlc3Npb24gZHVyaW5n IHRoZSB3b3Jrc2hvcCAtIHRoaXMgYWxsb3dzIHVzIHRvIHByZXNlbnQgbW9yZSBkaXZlcnNlDQog IHdvcmsgYW5kIGdpdmVzIHRpbWUgZm9yIGRpc2N1c3Npb24uIFRoZSBwcm9ncmFtIGNvbW1pdHRl ZSBmb3IgdGhlDQogIE9DYW1sIFdvcmtzaG9wIHdpbGwgZGVjaWRlIHdoaWNoIHByZXNlbnRhdGlv bnMgc2hvdWxkIGJlIGRlbGl2ZXJlZCBhcw0KICBwb3N0ZXJzIG9yIHRhbGtzLg0KDQogIOKAoiBT aW3Do28gTWVsbyBkZSBTb3VzYSAoVW5pdmVyc2l0eSBvZiBCZWlyYSBJbnRlcmlvcikNCiAg4oCi IEJyaWdpdHRlIFBpZW50a2EgKE1jR2lsbCBVbml2ZXJzaXR5KQ0KICDigKIgWWFubiBSZWdpcy1H aWFuYXMgKE5vbWFkaWMgTGFicykNCiAg4oCiIFh1amllIFNpIChNY0dpbGwgVW5pdmVyc2l0eSkN Cg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRv IG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQog IGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JT UyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNl aXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0u DQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0 cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4g U2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 10 to 17, 2022.

    Browsing OCaml source tree with VSCode/merlin?

    Keigo Imai explained

    I managed to browse the OCaml source tree with VSCode with the following st= eps:

    1. Prepare .merlin file (attached below) referring to the all= source directories in the tree
    2. Pin your ocaml-lsp-server at 1.8.3 by opam pin ocaml-lsp-server 1= .8.3 (as it is the last version that support .merlin)
    3. Clone OCaml repository and check out the same OCaml version as yours (e= .g. opam switch create 4.12.1; git checkout 4.12.1)
    4. Build OCaml (./configure && make world)
    5. Open the top folder of the source tree using VSCode (or restart the lan= guage server)
    6. Browse the code

    Cheers!

    content of .merlin:

    S ./asmcomp/
    S ./boot/menhir/
    S ./bytecomp/
    S ./debugger/
    S ./driver/
    S ./file_formats/
    S ./lambda/
    S ./lex/
    S ./middle_end/
    S ./middle_end/closure/
    S ./middle_end/flambda/
    S ./middle_end/flambda/base_types/
    S ./ocamldoc/
    S ./ocamltest/
    S ./otherlibs/dynlink/
    S ./otherlibs/dynlink/byte/
    S ./otherlibs/dynlink/dynlink_compilerlibs/
    S ./otherlibs/dynlink/native/
    S ./otherlibs/str/
    S ./otherlibs/systhreads/
    S ./otherlibs/unix/
    S ./parsing/
    S ./stdlib/
    S ./tools/
    S ./tools/unlabel-patches/
    S ./toplevel/
    S ./toplevel/byte/
    S ./toplevel/native/
    S ./typing/
    S ./utils/
    B ./asmcomp/
    B ./asmcomp/debug/
    B ./boot/
    B ./bytecomp/
    B ./debugger/
    B ./driver/
    B ./file_formats/
    B ./lambda/
    B ./lex/
    B ./middle_end/
    B ./middle_end/closure/
    B ./middle_end/flambda/
    B ./middle_end/flambda/base_types/
    B ./ocamldoc/
    B ./ocamldoc/generators/
    B ./ocamltest/
    B ./otherlibs/bigarray/
    B ./otherlibs/dynlink/
    B ./otherlibs/dynlink/byte/
    B ./otherlibs/dynlink/dynlink_compilerlibs/
    B ./otherlibs/dynlink/native/
    B ./otherlibs/str/
    B ./otherlibs/systhreads/
    B ./otherlibs/unix/
    B ./parsing/
    B ./stdlib/
    B ./testsuite/tests/no-alias-deps/
    B ./tools/
    B ./toplevel/
    B ./toplevel/byte/
    B ./toplevel/native/
    B ./typing/
    B ./utils/
    

    release of prbnmcn-gnuplot 0.0.3

    Igarnier announced

    prbnmcn-gnuplot= is a declarative wrapper on top of gnuplot. Version 0.0.3 was just re= leased.

    The API is not entirely set in stone but it's reasonably usable, at least f= or up to moderately sized plots. It proceeds by constructing self-contained gnuplot scripts from declarative sp= ecifications and deferring to gnuplot for execution.

    Here's the document= ation.

    Happy hacking!

    Call for Presentations for "Teaching Functional Programming in= OCaml" as part of the OCaml Workshop 2022

    Yurug announced

    Special Session / Call for Presentations for "Teachin= g Functional Programming in OCaml" as part of the OCaml

    Workshop 2022

    • Abstract Submission: 6 June 2022
    • Author Notification: 7 July 2022
    • OCaml Workshop: 9 Sept 2022

    The OCaml Workshop 2022, co-located with ICFP 2022, will take place the 202= 2-09-16 and will be held at Ljubljana, Slovenia. This year, we would like to organize a special session on "Teachi= ng Functional Programming in OCaml".

    Hence, we would like to encourage and invite submissions for presentations = that highlight teaching practices and innovation that highlight how OCaml is taught around the globe and the wide= range of tools and strategies that have been developed to teach effectively functional programming using OCaml. In = particular, we are interested in automated program evaluation / grading tools / error analysis (both type and syntax e= rrors) for OCaml programs, tools that provide assistance in practical lessons (such as pair programming for examp= le), Jupiter notebooks like solutions to interactively introduce programming concepts, or full-featured web platform= s. We are particularly seeking contributions and experience reports of the Learn-OCaml online programming = environment which has been used by the OCaml teaching community for online but also for regular in-person classes.= The goal is to share experiences, exchange ideas and tools, and promote best practices.

    Interested researchers are invited to submit and register a description of = the talk (about 2 pages long) at https://ocaml2022.hotcrp= .com/providing a clear statement of what will be provided by the presen= tation: the problems that are addressed, the solutions or methods that are proposed.

    LaTeX-produced PDFs are a common and welcome submission format. For accessi= bility purposes, we ask PDF submitters to also provide the sources of their submission in a textual format, such as .= .tex sources. Reviewers may read either the submitted PDF or the text version.

    The OCaml workshop and this special session are informal meetings with no f= ormal proceedings. The presentation material will be available online from the workshop homepage. The presentat= ions may be recorded and made available at a later date.

    The main presentation format is a workshop talk, traditionally around 20 mi= nutes in length, plus question time, but we also have a poster session during the workshop - this allows us to prese= nt more diverse work and gives time for discussion. The program committee for the OCaml Workshop will decide which = presentations should be delivered as posters or talks.

    • Sim=C3=A3o Melo de Sousa (University of Beira Interior)
    • Brigitte Pientka (McGill University)
    • Yann Regis-Gianas (Nomadic Labs)
    • Xujie Si (McGill University)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 43F07E43AC for ; Tue, 24 May 2022 10:04:06 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=zy//=WA=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 79/XXDpyXFo4ucSHNVQQ+1jvQyTpieg9D3CF9kJBC2FntmD0Ikb0zQRkbe71vfonPY3OCr/7DX q6Jt/WtypwDtmUgjLV10S8PNpcPHf0I+9eu0KfMRlnjDYWEr3QyqA0HDgkWI8TVHWAxqRJEh4E PL13y1k/Utx2d1ZE0mf1Y5zIPHc8xLW53wx6iUJT5USjMVAdK75Lr3SCQIHzOzLcQHSxkZCPbw x7SoujamHCzfoV+cP0ql+FQkBV3A/VkOA5yIzlv50FXN92Ko49TsrM2rjzzsydh+ZcmipPlnEe aibQ7fIlFPn8TqMcUaOtvNmm X-IPAS-Result: =?us-ascii?q?A0DhAQBHkYxihyIeaIFag3lbKBkBXgZVLQcIQ4ROiQCFQ?= =?us-ascii?q?gGCSoEWiDiGfI4UEAEDAQ0sAQwGAQIEAQGFAgJPAQSEbAIeBgEFMxMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQ0LCQUICgcQDgU8ZGQEg?= =?us-ascii?q?UsEgXQLNA2CIhMMGYNwARgDBgo7AwIlIwMUAQYDAhEBFwEeFwESFAaCC1gBg?= =?us-ascii?q?xcEAQqQapwRgTGBAYNPARgPhCKBElMkgRiGGllKAYMKhBkpEIFVRIEVgilKB?= =?us-ascii?q?26BQQF+CxcBAQEBAYE7AQFWgyCCZQSDII80gyAHOgNONRKBIXEBCAYGBwoFM?= =?us-ascii?q?gYCDBgUBAITEU0GHQITDAoGFg5CEhkMDwMSAxEBBwILEggVLAgDAgMIAwIDL?= =?us-ascii?q?gIDGAkHCgMdCAocEhAUAgQTHwsIAxofLQkCBA4DQwgLCgMRBAMTGAsWCBAEB?= =?us-ascii?q?gMJLw0oCwMFDw8BBgMGAgUFAQMgAxQDBScHAyEHCyYNDQQjHQMDBSYDAgIbB?= =?us-ascii?q?wICAwIGFwYCAhlYCigNCAQIBBgEHiUTBQIHMQUELwIeBAUGEQkCFgIGBAUCB?= =?us-ascii?q?AQWAgISCAIIJxsHFjYZAQVdBgsJIhYGHBARBQYWAyRRJwUwBiKSX4MYDIExA?= =?us-ascii?q?g44VwkiDgUBCgkXARcJAjYOFRUBBxsPCwQJBQkQDC4BCgsGKZFwEh4DJ5Enh?= =?us-ascii?q?yKCYQeSRTQHg1GBPQYMiCyBII0AiCODdYFPim+YJiGWRiCJKIESCYJJlEMGA?= =?us-ascii?q?gIThSSBTiqBawwHMxowgysJRQEDAg0BAgIDAQIBAgkBAQJUjVUWg1CEWTuFT?= =?us-ascii?q?D80AgEBNwIGAQoBAQMJhWMBAQUTCwGIEgSCRAEB?= IronPort-PHdr: A9a23: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 Gh7TG0iSA3F5bc= IronPort-Data: A9a23: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 77s IronPort-HdrOrdr: A9a23:hwky/awXf0SACig13yy/KrPwK71zdoMgy1knxilNoH1uEvBw+P rAoB1273XJYVUqOU3I++rvBEDoexq1nqKdirN8AV7NZmTbkVrtBL4nx4rvyT/tFkTFh41g/J YlVbNxTPn5DV0St7ee3OBUKadD/OW6 X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,248,1647298800"; d="scan'208,217";a="37788267" X-MGA-submission: =?us-ascii?q?MDHhAKmNJ3qUpkWpFubWPMyuWR5gxzoUQ9uzF/?= =?us-ascii?q?cx/04EJq1WkmRsfM6tQXWx2KpIwpuSF6M4TgkbLpuaX+qTFD+LTwpgfJ?= =?us-ascii?q?h4KbMSKTJ+o4fGkTbU5SCKjB8gt6fJRZE1KdeD/BmOhdfDucr1/HoLc2?= =?us-ascii?q?h2FuN2xisgX71de+tGbKp7Uw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 May 2022 10:04:05 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D2B49564C59; Tue, 24 May 2022 10:04:03 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 24 May 2022 10:04:03 +0200 Message-ID: <87pmk3l5l8.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 24 10:04:04 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.041535, queueID=9ABE2564C5B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 17 to 24, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ML Family Workshop 2022: Final Call for Presentations Dune 3.2.0 Hardcaml MIPS CPU Learning Project and Blog A tutorial on parallel programming in OCaml 5 Old CWN ML Family Workshop 2022: Final Call for Presentations =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Benoit Montagu announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to invite submissions to the *ML Family Workshop 2022*, to be held during the ICFP conference week on Thursday, September 15th. The ML family workshop warmly welcomes submission touching on the programming languages traditionally seen as part of the =E2=80=9CML famil= y=E2=80=9D (Standard ML, OCaml, F#, CakeML, SML#, Manticore, MetaOCaml, etc.). The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of the members of the ML family. We also encourage presentations from related languages (such as Haskell, Scala, Rust, Nemerle, Links, Koka, F*, Eff, ATS, etc), to exchange experience of further developing ML ideas. The workshop does not have proceedings, making it the perfect venue to run some ideas with the community or present some work in progress within a friendly environment. The PC has a broad expertise and submissions are 3 pages long: when in doubt, just submit! Currently, the workshop is scheduled to be an in-person event. We will give to the authors of accepted abstracts the opportunity to give their talks remotely if necessary, in case they could not travel. See the detailed CFP online on the ICFP website: Important dates =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Friday 3th June (any time zone): Abstract submission deadline =E2=80=A2 Tuesday 28th June: Author notification =E2=80=A2 Thursday 15th August: ML Family Workshop Program committee =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C =E2=80=A2 Kenichi Asai (Ochanomizu University) =E2=80=A2 Arthur Azevedo de Amorim (Boston University) =E2=80=A2 Dariusz Biernacki (University of Wroc=C5=82aw) =E2=80=A2 Stephen Dolan (Jane Street) =E2=80=A2 Kavon Farvardin (Apple) =E2=80=A2 Arma=C3=ABl Gu=C3=A9neau (Inria) =E2=80=A2 Sam Lindley (University of Edinburgh) =E2=80=A2 Guido Mart=C3=ADnez (CIFASIS-CONICET) =E2=80=A2 Keiko Nakata (SAP Innovation Center Potsdam) =E2=80=A2 Lionel Parreaux (Hong Kong University of Science and Technology) =E2=80=A2 Matija Pretnar (University of Ljubljana) =E2=80=A2 Mike Rainey (Carnegie Mellon University) =E2=80=A2 Yann R=C3=A9gis-Gianas (Nomadic Labs) =E2=80=A2 KC Sivaramakrishnan (IIT Madras and Tarides) =E2=80=A2 Ningning Xie (University of Cambridge) Chair: Beno=C3=AEt Montagu (Inria) Submission details =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C See the online CFP for the details on the expected submission format. Submissions must be uploaded to the workshop submission website before the submission deadline. Dune 3.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Rudi Grinberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune team, I'm pleased to announce the availability of version 3.2.0. This release contains few new features, but is packed with bug fixes and usability improvements. In particular, I'd like to point out that we've continued to improve the user experience with the watch mode. I encourage you all to try it out if you haven't already. Happy Hacking. 3.2.0 (17-05-2022) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 Fixed `dune describe workspace --with-deps' so that it correctly handles Reason files, as well as files any other dialect. (#5701, @esope) =E2=80=A2 Disable alerts when compiling code in vendored directories (#56= 83, @NathanReb) =E2=80=A2 Fixed `dune describe --with-deps', that crashed when some preprocessing was required in a dune file using `per_module'. (#5682, fixes #5680, @esope) =E2=80=A2 Add `$ dune describe pp' to print the preprocssed ast of sources. (#5615, fixes #4470, @cannorin) =E2=80=A2 Report dune file evaluation errors concurrently. In the same wa= y we report build errors. (#5655, @rgrinberg) =E2=80=A2 Watch mode now default to clearing the terminal on rebuild (#56= 36, fixes, #5216, @rgrinberg) =E2=80=A2 The output of jobs that finished but were cancelled is now omitted. (#5631, fixes #5482, @rgrinberg) =E2=80=A2 Allows to configure all the default destination directories with `./configure' (adds `bin', `sbin', `data', `libexec'). Use `OPAM_SWITCH_PREFIX' instead of calling the `opam' binaries in `dune install'. Fix handling of multiple `libdir' in `./configure' for handling `/usr/lib/ocaml/' and `/usr/local/lib/ocaml'. In `dune install' forbid relative directories in `libdir', `docdir' and others specific directory setting because their handling was inconsistent (#5516, fixes #3978 and #5455, @bobot) =E2=80=A2 `--terminal-persistence=3Dclear-on-rebuild' will no longer dest= roy scrollback on some terminals (#5646, @rgrinberg) =E2=80=A2 Add a fmt command as a shortcut of `dune build @fmt --auto-prom= ote' (#5574, @tmattio) =E2=80=A2 Watch mode now tracks copied external files, external directori= es for dependencies, dune files in OCaml syntax, files used by `include' stanzas, dune-project, opam files, libraries builtin with compiler, and foreign sources (#5627, #5645, #5652, #5656, #5672, #5691, #5722, fixes #5331, @rgrinberg) =E2=80=A2 Improve metrics for cram tests. Include test names in the event= and add a category for cram tests (#5626, @rgrinberg) =E2=80=A2 Allow specifying multiple licenses in project file (#5579, fixes #5574, @liyishuai) =E2=80=A2 Match `glob_files' only against files in external directories (#5614, fixes #5540, @rgrinberg) =E2=80=A2 Add pid's to chrome trace output (#5617, @rgrinberg) =E2=80=A2 Fix race when creating local cache directory (#5613, fixes #546= 1, @rgrinberg) =E2=80=A2 Add `not' to boolean expressions (#5610, fix #5503, @rgrinberg) =E2=80=A2 Fix relative dependencies outside the workspace (#4035, fixes #= 5572, @bobot) =E2=80=A2 Allow to specify `--prefix' via the environment variable `DUNE_INSTALL_PREFIX' (#5589, @vapourismo) =E2=80=A2 Dune-site.plugin: add support for `archive(native|byte, plugin)' used in the wild before findlib documented `plugin(native|byte)' in 2015 (#5518, @bobot) =E2=80=A2 Fix a bug where Dune would not correctly interpret `META' files= in alternative layout (ie when the META file is named `META.$pkg'). The `Llvm' bindings were affected by this issue. (#5619, fixes #5616, @nojb) =E2=80=A2 Support `(binaries)' in `(env)' in dune-workspace files (#5560,= fix #5555, @emillon) =E2=80=A2 (mdx) stanza: add support for (locks). (#5628, fixes #5489, @emillon) =E2=80=A2 (mdx) stanza: support including files in different directories = using relative paths, and provide better error messages when paths are invalid (#5703, #5704, fixes #5596, @emillon) =E2=80=A2 Fix ctypes rules for external lib names which aren't valid ocaml names (#5667, fixes #5511, @Khady) Hardcaml MIPS CPU Learning Project and Blog =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Alexander (Sasha) Skvortsov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! Last fall, we completed our original plan for this project, rewriting the verilog MIPS CPU we had designed for a class into Hardcaml. A few weeks later, we got an invite to video-meet with the Hardcaml team to talk about our experience. They even sent us actual Arty A-7 FPGAs so we could test out our simulation on real hardware! Junior year ended up much busier than expected, and although we had gotten our code onto the FPGAs by January, we=E2=80=99ve only just now fu= lly finished our project. Our blog now has 2 bonus installments: 1. [Running Hardcaml on an actual FPGA]. Here, we lit up LEDs to display the output of a hardcoded program. 2. [Hardcaml MIPS and I/O]. Here, we restructured our CPU so that programs can communicate with an external device using UART. With these changes, our full design is now a simplified but realistic processor that can run meaningful programs. Thank you very much to @andyman, @fyquah95, Ben Devlin, and the rest of the Jane Street FPGA team for creating Hardcaml, meeting with us, and answering our numerous questions throughout this process. Thank you also to @yaron_minsky and Jane Street for sending us the FPGAs to try out our code. This has been an incredibly interesting, challenging, and rewarding journey. We hope that our blog posts and sample project are useful for learning Hardcaml in the future, and welcome any questions or comments. [Running Hardcaml on an actual FPGA] [Hardcaml MIPS and I/O] A tutorial on parallel programming in OCaml 5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: KC Sivaramakrishnan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I ran a hands-on tutorial on the new parallel programming primitives in the upcoming OCaml 5 at the Tarides off-site last week. It covers the low-level parallelism primitives exposed by the OCaml 5 compiler as well as high-level parallel programming using `domainslib'. I hope you like it and find it useful. Please feel free to open issues if you find anything amiss. Alain De Vos asked and Olivier Nicole replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 As it is not immediately clear for me, does it uses threads , green threads, processes , fibers ? And who is responsible for the scheduling ,the Ocaml application or the underlying operating system ? Each domain corresponds to one system thread. The scheduling between them is therefore performed by the operating system. The tutorial only covers domains, which are the way to perform /parallelism/ in OCaml 5. To use /concurrency/ (e.g. having several IO-depending operations that run concurrently on the same core), the main mechanism is effects (which at the level of the runtime system, are implemented using small stack segments called fibers), as in the [eio library]. Effects allow such libraries to provide a form a lightweight threads (aka green threads) whose scheduling is implemented in the OCaml application using effect mechanisms. [eio library] UnixJunkie then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Here is a very simple tutorial on parallel programming in OCaml: use parany ! For OCaml 5, use the right branch of parany: Happy hacking! Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 17 to 24, 2022.

    ML Family Workshop 2022: Final Call for Presentations

    Benoit Montagu announced

    We are happy to invite submissions to the ML Family Workshop 2022, to be held during the ICFP conference week on Thursday, September 15th.

    The ML family workshop warmly welcomes submission touching on the programming languages traditionally seen as part of the =E2=80=9CML family= =E2=80=9D (Standard ML, OCaml, F#, CakeML, SML#, Manticore, MetaOCaml, etc.). The scope of the workshop includes all aspects of the design, semantics, theory, application, implementation, and teaching of the members of the ML family. We also encourage presentations from related languages (such as Haskell, Scala, Rust, Nemerle, Links, Koka, F*, Eff, ATS, etc), to exchange experience of further developing ML ideas.

    The workshop does not have proceedings, making it the perfect venue to run some ideas with the community or present some work in progress within a friendly environment. The PC has a broad expertise and submissions are 3 pages long: when in doubt, just submit!

    Currently, the workshop is scheduled to be an in-person event. We will give to the authors of accepted abstracts the opportunity to give their talks remotely if necessary, in case they could not travel.

    See the detailed CFP online on the ICFP website: https://icfp22.sigplan.org/home/mlfamilyworkshop-2022#Call-fo= r-Presentations

    Important dates

    • Friday 3th June (any time zone): Abstract submission deadline
    • Tuesday 28th June: Author notification
    • Thursday 15th August: ML Family Workshop

    Program committee

    • Kenichi Asai (Ochanomizu University)
    • Arthur Azevedo de Amorim (Boston University)
    • Dariusz Biernacki (University of Wroc=C5=82aw)
    • Stephen Dolan (Jane Street)
    • Kavon Farvardin (Apple)
    • Arma=C3=ABl Gu=C3=A9neau (Inria)
    • Sam Lindley (University of Edinburgh)
    • Guido Mart=C3=ADnez (CIFASIS-CONICET)
    • Keiko Nakata (SAP Innovation Center Potsdam)
    • Lionel Parreaux (Hong Kong University of Science and Technology)
    • Matija Pretnar (University of Ljubljana)
    • Mike Rainey (Carnegie Mellon University)
    • Yann R=C3=A9gis-Gianas (Nomadic Labs)
    • KC Sivaramakrishnan (IIT Madras and Tarides)
    • Ningning Xie (University of Cambridge)

    Chair: Beno=C3=AEt Montagu (Inria)

    Submission details

    See the online CFP for the details on the expected submission format.

    Submissions must be uploaded to the workshop submission website https://ml2022.hotcrp.com/ befor= e the submission deadline.

    Dune 3.2.0

    Rudi Grinberg announced

    On behalf of the dune team, I'm pleased to announce the availability of ver= sion 3.2.0. This release contains few new features, but is packed with bug fixes and usability improvements. In parti= cular, I'd like to point out that we've continued to improve the user experience with the watch mode. I encourage y= ou all to try it out if you haven't already.

    Happy Hacking.

    3.2.0 (17-05-2022)

    • Fixed dune describe workspace --with-deps so that it corre= ctly handles Reason files, as well as files any other dialect. (#5701, @esope)
    • Disable alerts when compiling code in vendored directories (#5683, @NathanReb)
    • Fixed dune describe --with-deps, that crashed when some preprocessing was required in a dune file using per_module. (#5682, fixes #5680, @esope)
    • Add $ dune describe pp to print the preprocssed ast of sou= rces. (#5615, fixes #4470, @cannorin)
    • Report dune file evaluation errors concurrently. In the same way we rep= ort build errors. (#5655, @rgrinberg)
    • Watch mode now default to clearing the terminal on rebuild (#5636, fixe= s, #5216, @rgrinberg)
    • The output of jobs that finished but were cancelled is now omitted. (#5= 631, fixes #5482, @rgrinberg)
    • Allows to configure all the default destination directories with = ./configure (adds bin, sbin, data, libexec= ). Use OPAM_SWITCH_PREFIX instead of calling the opam binaries in dune install. Fix ha= ndling of multiple libdir in ./configure for handling /usr/lib= /ocaml/ and /usr/local/lib/ocaml. In dune install forbid rela= tive directories in libdir, docdir and others specific directory sett= ing because their handling was inconsistent (#5516, fixes #3978 and #5455, @bobot)
    • --terminal-persistence=3Dclear-on-rebuild will no longer d= estroy scrollback on some terminals (#5646, @rgrinberg)
    • Add a fmt command as a shortcut of dune build @fmt --auto-promote= (#5574, @tmattio)
    • Watch mode now tracks copied external files, external directories for dependencies, dune files in OCaml syntax, files used by include stanzas, dune-project, opam files, libraries builtin with compiler, and foreign sources (#5627, #5645, #5652, #5656, #5672, #5691, #5722, fixes #5331, @rgrinberg)
    • Improve metrics for cram tests. Include test names in the event and add= a category for cram tests (#5626, @rgrinberg)
    • Allow specifying multiple licenses in project file (#5579, fixes #5574, @liyishuai)
    • Match glob_files only against files in external directorie= s (#5614, fixes #5540, @rgrinberg)
    • Add pid's to chrome trace output (#5617, @rgrinberg)
    • Fix race when creating local cache directory (#5613, fixes #5461, @rgri= nberg)
    • Add not to boolean expressions (#5610, fix #5503, @rgrinbe= rg)
    • Fix relative dependencies outside the workspace (#4035, fixes #5572, @b= obot)
    • Allow to specify --prefix via the environment variable DUNE_INSTALL_PREFIX (#5589, @vapourismo)
    • Dune-site.plugin: add support for archive(native|byte, plugin) used in the wild before findlib documented plugin(native|byte) in 2015 (#5= 518, @bobot)
    • Fix a bug where Dune would not correctly interpret META fi= les in alternative layout (ie when the META file is named META.$pkg). The L= lvm bindings were affected by this issue. (#5619, fixes #5616, @nojb)
    • Support (binaries) in (env) in dune-workspace= files (#5560, fix #5555, @emillon)
    • (mdx) stanza: add support for (locks). (#5628, fixes #5489, @emillon)
    • (mdx) stanza: support including files in different directories using re= lative paths, and provide better error messages when paths are invalid (#5703, #57= 04, fixes #5596, @emillon)
    • Fix ctypes rules for external lib names which aren't valid ocaml names (#5667, fixes #5511, @Khady)

    Hardcaml MIPS CPU Learning Project and Blog

    Alexander (Sasha) Skvortsov announced

    Hi everyone! Last fall, we completed our original plan for this project, re= writing the verilog MIPS CPU we had designed for a class into Hardcaml. A few weeks later, we got an invite to = video-meet with the Hardcaml team to talk about our experience. They even sent us actual Arty A-7 FPGAs so we could t= est out our simulation on real hardware!

    Junior year ended up much busier than expected, and although we had gotten = our code onto the FPGAs by January, we=E2=80=99ve only just now fully finished our project. Our blog now has 2 bonus installm= ents:

    1. Running Hardcaml on an actual FPGA. Here, we lit up LEDs= to display the output of a hardcoded program.
    2. Hardcaml MIPS and I/O. Here, we restructured our CPU so that programs = can communicate with an external device using UART.

    With these changes, our full design is now a simplified but realistic proce= ssor that can run meaningful programs.

    Thank you very much to @andyman, @fyquah95, Ben Devlin, and the rest of the= Jane Street FPGA team for creating Hardcaml, meeting with us, and answering our numerous questions throughout = this process. Thank you also to @yaron_minsky and Jane Street for sending us the FPGAs to try out our code.

    This has been an incredibly interesting, challenging, and rewarding journey= . We hope that our blog posts and sample project are useful for learning Hardcaml in the future, and welcome any que= stions or comments.

    A tutorial on parallel programming in OCaml 5

    KC Sivaramakrishnan announced

    I ran a hands-on tutorial on the new parallel programming primitives in the= upcoming OCaml 5 at the Tarides off-site last week. It covers the low-level parallelism primitives exposed by the OC= aml 5 compiler as well as high-level parallel programming using domainslib. I hope you like it and = find it useful. Please feel free to open issues if you find anything amiss.

    https://github.com= /kayceesrk/ocaml5-tutorial

    Alain De Vos asked and Olivier Nicole replied

    As it is not immediately clear for me, does it uses threads , green threads= , processes , fibers ? And who is responsible for the scheduling ,the Ocaml application or the underlying ope= rating system ?

    Each domain corresponds to one system thread. The scheduling between them i= s therefore performed by the operating system.

    The tutorial only covers domains, which are the way to perform paralleli= sm in OCaml 5. To use concurrency (e.g. having several IO-depending operations that run concurrently on the same co= re), the main mechanism is effects (which at the level of the runtime system, are implemented using small stack segme= nts called fibers), as in the eio library. Effects allow such libraries to provide a form a lightweight threads (aka green threads) whose scheduling is implemen= ted in the OCaml application using effect mechanisms.

    UnixJunkie then said

    Here is a very simple tutorial on parallel programming in OCaml: use parany= ! https://github.com/UnixJun= kie/parany For OCaml 5, use the right branch of parany: https://githu= b.com/UnixJunkie/parany/tree/domains

    Happy hacking!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id BF8DBE0235 for ; Tue, 31 May 2022 14:29:43 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=/XmI=WH=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 70iONeeW5E9qEJFV9LGCwfFw3jEZWpICYSK0JTc1d/mM8anHq7iWvLptZ4aAlZPB3dkWfdjb/r RoSxtTOgiLX69aRFcUBe5X3UD+IdYY59QzJrgMomTgrGqPIxA6XPDy2FrI5rzA33f7MueSXoGU hVc0CqL9d0nZ4iniCXC/Pe0uWi7luJVeurTRVRknz8+/Arl3j6kDKhZGeK1bftrn+mKtl3MV+K kKiHjxpOxhHEPVHnE+YnSrIOAGK9VsQLxirQaL2gGwh6oeQocug+3RdVncXMNMa6M5AgMeQ9ta AzAlPMN7gIENJVmOItoIPJm3 X-IPAS-Result: =?us-ascii?q?A0AtAgCmCZZimCIeaIFag3mBAxkBZlYtBwhEhE6JAIgNb?= =?us-ascii?q?IhllSABAwENLAEMBgECBAEBhQIChUQCHgYBBTMTAQIEAQEBAQMCAwEBAQEBA?= =?us-ascii?q?QMBAQUBAQECAQECBAQBEwEBAQEBAQEBCQsJBwYMBRAOBTxkZASBSwSBdAs0D?= =?us-ascii?q?YI1DBmDcAEhCmUjAxsDAhEBFwEeFwESGoJjAYMYBQqQJpwSgTGBAYNPAQMFh?= =?us-ascii?q?EGBZSSBGYYaWUqDC4MgeQInEIFVRIQPboJLFwECAQGBFSYBAVaDIIJlBI0ki?= =?us-ascii?q?SsHOgNONRKBIXEBCAYGBwoFMgYCDBgUBAITEU0GHQITDAoGFg5CEhkMDwMSA?= =?us-ascii?q?xEBBwILEggVLAgDAgMIAwIDLgIDGAkHCgMdCAocEhAUAgQTHwsIAxofLQkCB?= =?us-ascii?q?A4DQwgLCgMRBAMTGAsWCBAEBgMJLw0oCwMFDw8BBgMGAgUFAQMgAxQDBScHA?= =?us-ascii?q?yEHCyYNDQQjHQMDBSYDAgIbBwICAwIGFwYCAhlYCigNCAQIBBgEHiUTBQIHM?= =?us-ascii?q?QUELwIeBAUGEQkCFgIGBAUCBAQWAgISCAIIJxsHFjYZAQVdBgsJIRYGKREFB?= =?us-ascii?q?hYDI1EnBUgPKTsGIpNAgxeBPw4fHzJYGRYBAVg4WB0BByUWAi2SIAMnmEmVL?= =?us-ascii?q?jQHg1GBPQYMiCyBII0BiCODdYFPkU+RRyGWRyCJKYEbggNGlEshhRqBTiqBa?= =?us-ascii?q?wwHMxowgysJRQEDAg0BAgIDAQIBAgkBAQJUjSEBhBmCZIF1O4VMPzQCAQE3A?= =?us-ascii?q?gYBCgEBAwmFYwEBBRMLAYZKgjcBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:TQrKfKpdlp6iv5c2oUyYLtoTsJBeBmKRYxIvgKrLsJaIsI4StFCzt garIBmFO63eYzOge9EnPdu0oBsP6sLTx4RrQQE6qClkQX9Hp+PIVI+TRqvSF3PLf5ebFCqLz O1HN4KedJhsJpP4jk3wWlQ0hSAkjclkfpKlVKicfHoZqTZMEE/Nszo68wICqtMu0IHR7z+l4 4uo+ZWCYwb9gVaYD0pNg069gEM31BjNkGhA1rAOTagjUIj2yhH5pLpGTU2AByOQrrt8RoZWd M6fpF2NxV41yj92Yj+TfhkXRWVRKlLaFVDmZnO7wMFOiDAazsA5+v5T2Pbx9S67hh3R9+2dx umhurSPdAk4IbfDvt09Qjl6GiJOJqgdxbzudC3XXcy7lyUqclPp06woFEYyLJEV8eZxAHhT+ LofMj9lghKr3rjnhuvjFq833oJ4cKEHP6tH0p1k5QrjNq5zBqDGYvD1xYpA2zMhms1FHfDff tcULz11Y0HJZxRJfEwcCJc/gPuAjH7idTZVsxSQ+bpx5HLcpOB0+OGwbYOIJ4zRLSlTtlmGo mDroTTBOQs9JfWC7hSdw06o1taayEsXX6pLSOzpqa416LGJ/UQYARgSEF+6uuWRkV+7Q9sZK koO+yNoo7JayaCwZtztBlugp3qVohMXW9xRCvA3rgaXxcI4/jp1GEA7czBQd8YpkvYWVBwI3 1y5hNayOD9G5ej9pW2myp+Yqja7OC4wJGAEZDMZQQZt3zUFiN1v5v4oZoo+eJNZnuEZChmsk 27X8XlWa6E715JRj/3TEUXv2mrEm3TfcuIizivtNo5Pxjl4f8uCfYWu5lnAhRqrBNfAFwLZ1 JTos2N46O1LAZzIujaERu4AdIxFCt6AIGSamVlrDoUs/DSr+me+cMZX+j4WyKZV3iQsJG+Bj Kz74F05CHpv0J2CNvMfj2WZUJhC8EQYPY65Ps04l/IXCnSLSCeJ/Tt1eWmb1H33nU4nnMkXY MnGKpf3UCpAVv85lFJaotvxN5d1m0jSIkuNHvjGI+iPiuDBDJJoYetUaQrUP75RAF2s+VyEq Ig32zS2J+V3CbGvM3aHrub/3HgQIH4yGZ3sw/G7hcbdSjeK7FoJUqeLqZt4ItQNt/0Mxo/go y/hMmcFlguXrSCXeG2iNyE4AJuyDMkXhSxgZ0QEYw33s0XPlK7yts/zgbNtI+l+nAGipNYpJ 8Q4lzKoWa8XE26boGhHMPEQbuVKLXyWuO5HBAL9CBBXQnKqb1ahFgbMclS9+S8QIDCwsMdi8 bSs2hmCHMgJQBlkB8vNLvfz3xW2p3dEwLB+WE7BI99yfkTw8dkxenep16Rtesxcew/ewja61 hqNBUtKr+f6pYJoosLCgrqJrtv0HuYnRhhaEmDX4KyYLy7f+mb/k4ZMXPzRImLFU2fl5KipZ eNU1uzxdvodkw8S4YZ7Fr9qy4M45sfu9uYKnlQ+RC2TYg3yWL16I3SA0c1ejYF3x+dU6VmsR 0aC2thGIrHVasnrJ1gceVg+ZeOZ2PBIxzTf4KhnIEj+4yMrrrOLXV8IZkuJmHUbNLxxIZ8oy ucnudcL5kq4kBVzaoSKiSVd9mKtKH0cUvR+5sFKWtez0gd7mEtfZZH8CzPt5M/dYdt7Mn4sf m2eip3EiukO3UHFaXcySSPA0LYPn5gIoxwWnlYOK07Tw4jAlqZxxBpV4Cg6RQRTzwxa3qR0I Gcybx95IqCH/jFJgslfXjH1S1ERXkXBokGhmUEUkGD5TlWzUjKfJmMKOdGLoBIT/VVac2UJ5 7qf0mvkDW3nccyZMvHegqK5RyEPjOCd9zEuXOiiD53DB54+cCboia+oZHMVpl3gG8xZaIjvu 7xx5OgpAUHkHXd4nkH5I9DyOXcspNSsLmtfR/ps5+UMQXGafyu9sdRLA1updJkLf5Qm7mfhY /GD5atzu9CWzCGKvywWDq4KIqZpkbgu/tVqlnbDPnYI6f3HxtZ2mMu4yxUST1PHjzmjfQjR5 28Rm/+//rSsuEZp IronPort-HdrOrdr: A9a23:RVx37aO125Oy9cBcTsajsMiBIKoaSvp037BL7SBMoHNuHfBw+/ rFoB15737JYVQqNk3I8OroUMK9qBjnmaKdj7N9AZ6SGCHY/EGoIIth4YaK+UyCJwTOsshH2+ NFe6h6YeeAaGSSYPyKgjWFLw== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,265,1647298800"; d="scan'208,217";a="15515583" X-MGA-submission: =?us-ascii?q?MDHR8xp9+ApvN2g4+5Cq+mckHsoxfU/TrCvc4t?= =?us-ascii?q?rKGCt1jeHvGNavSnLXdigdlYMB4YKENSFSfil8WfJUlq/BodyZuIru1C?= =?us-ascii?q?246mJ6J/5SWiifKjuX3yGG2B45BJbd+W3yr6GTVUB/e9tWtZpNk716E0?= =?us-ascii?q?MXAUhwEawDNkl9eACYHRO2QA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 May 2022 14:29:42 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C48645648ED; Tue, 31 May 2022 14:29:41 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 31 May 2022 14:29:41 +0200 Message-ID: <87czftsx56.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 31 14:29:42 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.402576, queueID=0B3FC5648F4 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 24 to 31, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 carray.0.0.1 OCaml Users and Developers Workshop 2022 Old CWN carray.0.0.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Danny Willems announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm glad to announce the first (experimental) release of ocaml-carray, a library mocking the Array interface to work with contiguous C array. *Disclaimer*: this first version is experimental and must be used with caution. A restricted set of values are supported at the moment (custom block with no out-of-heap values). Depending on the demand, more values might be supported. Feel free to use this thread to suggest ideas, make opinions, etc. Repository License [MIT] Release [0.0.1] Documentation Nomadic Labs website Tezos ZK-rollups repository [MIT] [0.0.1] Motivation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C OCaml arrays are not always contiguous piece of memory, requiring accessing different chunks of memory when accessing individual elements. When requiring a value in memory, the CPU will fetch the RAM and load not only the particular value but a memory page (a contiguous piece of memory) and add it to its cache. The CPU will use its cache to load the values in its registers. It is not efficient with large OCaml arrays as the CPU will constantly fetch the RAM to load different memory pages in its cache. Also, when using the C FFI, the user must know the memory representation of an array and use the non user-friendly low-level interface macro `Field'. This work =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C This library provides a polymorphic interface mocking a subset of the `Array' interface to work with contiguous piece of memory. Using the library should be as easy as adding `module Array =3D Carray'. A C macro `Carray_val' is also provided for developers writing bindings and requires to simply cast in the underlying C type. It has also been observed sub arrays are sometimes used for read-only operations. However, `Array.sub' allocates a fresh copy of the requested sub part. `Carray' leverages this memory cost by providing noalloc variants, like `sub_noalloc'. Performances =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C The concept has been tested and used in real world applications like the polynomial library used by Nomadic Labs to implement zk-rollups. A speed up of around 50% has been observed when using contiguous arrays compared to OCaml arrays to compute NTT/FFT. Usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This library is *experimental*. Use this library with caution. The interface might change in the future. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install carray.0.0.1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml Users and Developers Workshop 2022 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Matija Pretnar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is a reminder for anyone interested in contributing to OCaml Workshop 2022. The deadline has been slightly extended to Friday, June 3 (anywhere on Earth), which means you have roughly *four days left* to prepare your submissions. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 24 to 31, 2022.

    carray.0.0.1

    Danny Willems announced

    I'm glad to announce the first (experimental) release of ocaml-carray, a library mocking the Array interface to work with contiguous C array. Disclaimer: this first version is experimental and must be used with caution. A restricted set of values are supported at the moment (custom block with no out-of-heap values). Depending on the demand, more values might be supported. Feel free to use this thread to suggest ideas, make opinions, etc.

    Repository
    https://gitlab.com/dannywillems/ocaml-carray
    License
    MIT
    Release
    0.0.1
    Documentation
    https://dannywillems.gitlab.io/ocaml-carray/carray/index.html
    Nomadic Labs website
    https://nomadic-labs.com
    Tezos ZK-rollups repository
    https://gitlab.com/nomadic-labs/privacy-team

    Motivation

    OCaml arrays are not always contiguous piece of memory, requiring accessing different chunks of memory when accessing individual elements. When requiring a value in memory, the CPU will fetch the RAM and load not only the particular value but a memory page (a contiguous piece of memory) and add it to its cache. The CPU will use its cache to load the values in its registers. It is not efficient with large OCaml arrays as the CPU will constantly fetch the RAM to load different memory pages in its cache. Also, when using the C FFI, the user must know the memory representation of an array and use the non user-friendly low-level interface macro Field.

    This work

    This library provides a polymorphic interface mocking a subset of the Array interface to work with contiguous piece of memory. Using the library should be as easy as adding module Array = Carray. A C macro Carray_val is also provided for developers writing bindings and requires to simply cast in the underlying C type. It has also been observed sub arrays are sometimes used for read-only operations. However, Array.sub allocates a fresh copy of the requested sub part. Carray leverages this memory cost by providing noalloc variants, like sub_noalloc.

    Performances

    The concept has been tested and used in real world applications like the polynomial library used by Nomadic Labs to implement zk-rollups. A speed up of around 50% has been observed when using contiguous arrays compared to OCaml arrays to compute NTT/FFT.

    Usage

    This library is experimental. Use this library with caution. The interface might change in the future.

    opam install carray.0.0.1
    

    OCaml Users and Developers Workshop 2022

    Continuing this thread, Matija Pretnar announced

    This is a reminder for anyone interested in contributing to OCaml Workshop 2022. The deadline has been slightly extended to Friday, June 3 (anywhere on Earth), which means you have roughly four days left to prepare your submissions.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 42A9AE007E for ; Tue, 7 Jun 2022 12:16:06 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=56cO=WO=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: JwQbyN/6KN6MsonnB6aroGW8nVLXxaVhSRHUFv/Zr2RV3GrleXpdX17L27K4V5pxdOdCMKD/Dw wiTaZua6PZ92VOoy0qOQIEvCG9POwQdwObyq52QxsIanfXDHL7vvCb7VI/E9unZMToZAF4qsPu Amwe9NJvijy9yxMpbDd/l5Kq4poecenHxWpA0cm46YMOy+HGXTx0yB9gC+Vao63Cf23ysHCQB2 0xU2j04zLQzWKAUhxzQZizdWbcbJ+2xW4tHh4UEiwbeFsy0z5W9T67WRqLOruVrHRFXipZwcfn vVaZyEvEyUmpdW8Ruv4OF+ho X-IPAS-Result: =?us-ascii?q?A0B1AwBXJJ9ieyIeaIFaFoNjWygZAWZWFhcHCESETokAi?= =?us-ascii?q?A0zY4g7hnyNQQNPEAEDAQ0sAQ4EAQIEAQGCDoJ0AoVGAh4GAQUzEwECBAEBA?= =?us-ascii?q?QEDAgMBAQEBAQEDAQEFAQEBAgEBAgQEARMBAQ8LCQYHDAUQDgU8ZGQEgUsEg?= =?us-ascii?q?XQLBwEsDYI1DAwDA4N3AQwMAQIGBAY4CCUjAxQBBgMCEQEXAR4DARMBEhQGA?= =?us-ascii?q?YJjgxgEAQqPUppJGjV6fzKBAYNPAQMCAQIJAgIDDy4Bg3OBZSSBGYYZWkoBg?= =?us-ascii?q?woJhBACJxCBVUSBFYIpSgdugksMCwEBAQEBgRUmAQECVIMggmUEiyiMDwc6A?= =?us-ascii?q?0c0EoEhcQEIBgYHCgUyBgIMGBQEAhMSTQYdAhIMCgYWDkISGQwPAxIDEQEHA?= =?us-ascii?q?gsSCBUsCAMCAwgDAgMuAgMXCQcKAx0IChwSEBQCBBMeCwgDGR8sCQIEDgNFC?= =?us-ascii?q?AsKAxEEAxMYCxYIEAQGAwkvDSgLAwUPDwEGAwYCBQUBAyADFAMFJwcDIQcLJ?= =?us-ascii?q?g0NBCMdAwMFJgMCAhsHAgIDAgYXBgICGVgKJg0IBAgEGAQdJRAFAgcxBQQvA?= =?us-ascii?q?h4EBQYRCQIWAgYEBQIEBBYCAhIIAggnGwcWNhkBBV0GCwkhFgYpEQUGFgMjS?= =?us-ascii?q?icFSA8pNTY6FwwGIpQShDQkAg44BgdGFQYUEwgDEQ4BAQkXAi4EBBgLEQQBC?= =?us-ascii?q?icDGgkCNgQOAQoLAi2SAh0EBZVkgwiUM3w0B4NRgT0GDIdwPIEijQGII4N1g?= =?us-ascii?q?U+KcIUxknYhlkgggiuGfAKBEgmCSYg0i2wlAwMghRuBTiprgQAMBzMaMEOCa?= =?us-ascii?q?AlFAQMCDQECAgMBAgECCQEBAlSKMYIKZgEwAxaBBAEIghsoalSBDBqBdTuBP?= =?us-ascii?q?YQMAz80AgEBNwIGAQoBAQMJhWMBAQUTCwGHNIFdWgEB?= IronPort-PHdr: A9a23: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 N4BV0wmYXU= IronPort-Data: A9a23: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 lvtSg+/ IronPort-HdrOrdr: A9a23:CPTCLaAhCT2VtyvlHemr55DYdb4zR+YMi2TDtnoQdfU7SKOlfq yV9sjztiWUtN9yYh8dcLm7UcHqfZq2z/JICOcqUIuKbU3Phy+DLY1p74fuqgeQeBHWx6p6zq klV6B/DbTLfD1HZCvBkWuFL+o= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,283,1647298800"; d="scan'208,217";a="16085349" X-MGA-submission: =?us-ascii?q?MDGznH5848RCsyPavh7inHx4UvCSRi7Q/pDWYq?= =?us-ascii?q?V+Y5PJGWknT8UItZFtz8gpeKu0MMTXSkOj0m9Muu2Ly2TfifzZjTiG8y?= =?us-ascii?q?pmKMDBjTJL2KKEFnebjIfjdTFGTmsp86KtturNGn9eiGWW9UlC8zlOix?= =?us-ascii?q?udzUNAlGnDxDScshkDgRUXBg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Jun 2022 12:16:05 +0200 Received: from set (ip-185-104-137-32.ptr.icomera.net [185.104.137.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 942F056065A; Tue, 7 Jun 2022 12:15:38 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 07 Jun 2022 12:15:24 +0200 Message-ID: <87k09s4w5f.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 7 12:16:03 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.471112, queueID=8F0025606B4 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 31 to June 07, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 carray.0.0.1 ML Family Workshop 2022: Final Call for Presentations OCaml Users and Developers Workshop 2022 dkml-c-probe.2.0.0: Cross-compiler friendly definitions for C compiling Full-Stack Web Dev in OCaml Tutorial w/ Dream, Bonsai, and GraphQL Sketch.sh now supports multiple compiler versions, starting with 4.13.1 Explicit type binding and mutual recursion findlib-1.9.4 omake-0.10.4 Old CWN carray.0.0.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this threas, Fabian said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Note that you can, to a certain degree, build your own flat structures with the `Bytes' module. Compared to bigarrays, `Bytes.t' has less indirection, a lower constant memory overhead and can be allocated on the minor heap. The contents of `Bytes.t' are not scanned by the GC, just like bigarrays. For example, a more efficient `int32 Array.t': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Int32_array : sig =E2=94=82 type t =E2=94=82 val equal : t -> t -> bool =E2=94=82 val create : int -> t =E2=94=82 val length : t -> int =E2=94=82 val get : t -> int -> int32 =E2=94=82 val set : t -> int -> int32 -> unit =E2=94=82 val sub : t -> int -> int -> t =E2=94=82 val to_list : bytes -> int32 list =E2=94=82 end =3D struct =E2=94=82 type t =3D Bytes.t =E2=94=82 let equal =3D Bytes.equal =E2=94=82 let create len =3D Bytes.create (4 * len) =E2=94=82 let length t =3D Bytes.length t / 4 =E2=94=82 let get t i =3D Bytes.get_int32_le t (4 * i) =E2=94=82 let set t i x =3D Bytes.set_int32_le t (4 * i) x =E2=94=82 let sub t pos len =3D Bytes.sub t (4 * pos) (4 * len) =E2=94=82 let to_list t =3D List.init (length t) (get t) =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A more efficient `(int * int)': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Point : sig =E2=94=82 type t =E2=94=82 val create : int -> int -> t =E2=94=82 val x : t -> int =E2=94=82 val y : t -> int =E2=94=82 end =3D struct =E2=94=82 external get_int64_unsafe : bytes -> int -> int64 =3D "%caml_= bytes_get64u" =E2=94=82 external set_int64_unsafe : bytes -> int -> int64 -> unit =3D= "%caml_bytes_set64u" =E2=94=82 type t =3D Bytes.t =E2=94=82 let create x y =3D =E2=94=82 let p =3D Bytes.create 16 in =E2=94=82 set_int64_unsafe p 0 (Int64.of_int x); =E2=94=82 set_int64_unsafe p 8 (Int64.of_int y); =E2=94=82 p =E2=94=82 let x t =3D Int64.to_int (get_int64_unsafe t 0) =E2=94=82 let y t =3D Int64.to_int (get_int64_unsafe t 8) =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 (making a more efficient `(int * int) Array.t' is left as an exercise to the reader) The downside compared to bigarrays is that it doesn't support `sub' without copying. Also, bytes can be moved by the GC (during minor GCs or compaction), and therefore you cannot release the runtime lock when passing them to C. The latter point is less relevant with the multicore extensions, especially since there is no compactor yet. There is some related discussion on the eio repository: ML Family Workshop 2022: Final Call for Presentations =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Benoit Montagu announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 ML Family Workshop 2022: DEADLINE EXTENSION =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C To increase your chances of submitting your work to the ML workshop, *the submission deadline is extended by a week*. The new deadline is Friday 10th June (AoE). A quick reminder: =E2=80=A2 The workshop does not have proceedings, making it the perfect v= enue to run some ideas with the community or present some work in progress within a friendly environment. =E2=80=A2 The work load as an author is low: submissions are only 3 pages= long (excluding references) =E2=80=A2 YOU have the power to make the ML workshop a success! =E2=80=A2 You have one more full week to submit to (please register your submission early!) =E2=80=A2 All the details are here: =E2=80=A2 The ML workshop is colocated with ICFP 2022 OCaml Users and Developers Workshop 2022 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Matija Pretnar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 To offer additional opportunities to contribute to the OCaml workshop, and to align with the [ML family workshop], to which you are also cordially invited, the submission deadline has been extended by a week to *Friday, June 10* (anywhere on Earth). [ML family workshop] dkml-c-probe.2.0.0: Cross-compiler friendly definitions for C compiling =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Summary: dkml-c-probe is a new package for maintainers who compile or link C code. Install it with `opam install dkml-c-probe'. Full docs are at [https://github.com/diskuv/dkml-c-probe#readme] [https://github.com/diskuv/dkml-c-probe#readme] Problem =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C You are creating an OCaml package that has foreign C code. Perhaps you need special C headers or libraries when you are targeting Apple users, or perhaps you need to execute custom OCaml code for Android users. More generally you need a way to determine whether your OCaml or C code is compiling for a Linux AMD/Intel 64-bit, Android ARM 32-bit, or any other ABI target. Solution =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A user of your OCaml package may, for example, be on a 64-bit AMD/Intel Linux machine using a 32-bit OCaml system compiled with `gcc -m32'; additionally they have a 32-bit Android ARM cross-compiler toolchain. `dkml-c-probe' will tell you the target operating system is `Linux' and the target ABI is `Linux_x86' except when the cross-compiler toolchain is invoked. With the cross-compiler toolchain `dkml-c-probe' will tell you the target operating system is `Android' and the target ABI is `Android_arm32v7a'. How it works =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C `dkml-c-probe' uses C preprocessor definitions (ex. `#if TARGET_CPU_X86_64', `#if __ANDROID__', etc.) to determine which ABI the C compiler (ex. `ocamlopt -config | grep native_c_compiler') is targeting. This isn't a new idea. The pattern is used in Esy and Mirage code as well. `dkml-c-probe' just codifies the pattern for use in your own code. Usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In OCaml code you can use the /versioned/ module: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module V2 : =E2=94=82 sig =E2=94=82 type t_os =3D Android | IOS | Linux | OSX | Windows =E2=94=82 type t_abi =3D =E2=94=82 Android_arm64v8a =E2=94=82 | Android_arm32v7a =E2=94=82 | Android_x86 =E2=94=82 | Android_x86_64 =E2=94=82 | Darwin_arm64 =E2=94=82 | Darwin_x86_64 =E2=94=82 | Linux_arm64 =E2=94=82 | Linux_arm32v6 =E2=94=82 | Linux_arm32v7 =E2=94=82 | Linux_x86_64 =E2=94=82 | Linux_x86 =E2=94=82 | Windows_x86_64 =E2=94=82 | Windows_x86 =E2=94=82 | Windows_arm64 =E2=94=82 | Windows_arm32 =E2=94=82 val get_os : (t_os, Rresult.R.msg) result Lazy.t =E2=94=82 val get_abi : (t_abi, Rresult.R.msg) result Lazy.t =E2=94=82 val get_abi_name : (string, Rresult.R.msg) result Lazy.t =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In C code you can use the [provided `dkml_compiler_probe.h' header] from within Dune or Opam. Here is a snippet that handles part of the Linux introspection: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #elif __linux__ =E2=94=82 # if __ANDROID__ =E2=94=82 # ... =E2=94=82 # else =E2=94=82 # define DKML_OS_NAME "Linux" =E2=94=82 # define DKML_OS_Linux =E2=94=82 # if __aarch64__ =E2=94=82 # define DKML_ABI "linux_arm64" =E2=94=82 # define DKML_ABI_linux_arm64 =E2=94=82 # elif __arm__ =E2=94=82 # if defined(__ARM_ARCH_6__) || defined(__ARM_ARCH_6J= __) || =E2=94=82 defined(__ARM_ARCH_6K__) || defined(__ARM_ARCH_6Z__) || defined= (__ARM_ARCH_6ZK__) || =E2=94=82 defined(__ARM_ARCH_6T2__) =E2=94=82 # define DKML_ABI "linux_arm32v6" =E2=94=82 # define DKML_ABI_linux_arm32v6 =E2=94=82 # elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_= 7A__) || =E2=94=82 defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) || defined= (__ARM_ARCH_7S__) =E2=94=82 # define DKML_ABI "linux_arm32v7" =E2=94=82 # define DKML_ABI_linux_arm32v7 =E2=94=82 # endif /* __ARM_ARCH_6__ || ..., __ARM_ARCH_7__ || = ... */ =E2=94=82 # elif __x86_64__ =E2=94=82 # define DKML_ABI "linux_x86_64" =E2=94=82 # define DKML_ABI_linux_x86_64 =E2=94=82 # elif __i386__ =E2=94=82 # define DKML_ABI "linux_x86" =E2=94=82 # define DKML_ABI_linux_x86 =E2=94=82 # elif defined(__ppc64__) || defined(__PPC64__) =E2=94=82 # define DKML_ABI "linux_ppc64" =E2=94=82 # define DKML_ABI_linux_ppc64 =E2=94=82 # elif __s390x__ =E2=94=82 # define DKML_ABI "linux_s390x" =E2=94=82 # define DKML_ABI_linux_s390x =E2=94=82 # endif /* __aarch64__, __arm__, __x86_64__, __i386__, __= ppc64__ || __PPC64__, =E2=94=82 __s390x__ */ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [provided `dkml_compiler_probe.h' header] Versioning and Contributing =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C Whenever a new ABI is added, it goes into a new version (ex. `module V3'). Your existing code that uses `module V2' will be unaffected. But each new ABI needs to have its own maintainer because I don't have access to every hardware platform on the planet! For example, PowerPC (`ppc64') and Linux on IBM Z (`s390x') are supported in the C Header but not the OCaml module because there are no PowerPC and S390x maintainers. Please consider contributing, especially if you want others to have an easier compilation story for your favorite hardware platform. Full-Stack Web Dev in OCaml Tutorial w/ Dream, Bonsai, and GraphQL =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Alexander (Sasha) Skvortsov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! I=E2=80=99ve written a tutorial blog series about full-stack= web development in OCaml, and wanted to share it here. Last semester, I took Penn State's [CMPSC 431W], where our final project was to build a database-driven web application. Since I'm fairly familiar with web programming through my work on [Flarum] and past internships/side projects, I decided to use this opportunity to explore the OCaml web development ecosystem. I used [Dream] for the backend, and [Bonsai] for the frontend. While working on this project, I realized two things: =E2=80=A2 OCaml is very underrated for web development. In addition to al= l the language=E2=80=99s great features and safety guarantees, the ecosystem = is pretty good! Dream near-perfectly coincides with my vision of backend webdev, and Bonsai has a great balance of flexibility/elegance and safety. =E2=80=A2 I couldn=E2=80=99t find realistic but accessible full-stack web= projects in OCaml available for reference. I found [tutorials] for [bits] and [pieces], but nothing that connected all the dots. I really enjoyed writing an article series on [hardware design with OCaml], so I decided to do so for web development as well. In total, I wrote 7 articles that walk through my project=E2=80=99s: 1. [Full-Stack WebDev in OCaml Intro]. This includes some background on the project, and instructions for accessing the [live demo]. 2. [Backend WebDev w/ Dream and Caqti]. 3. [Building GraphQL APIs with Dream] 4. [Setting up Bonsai]. 5. [Understanding Bonsai]. I actually wrote the first draft of this before I decided to do a blog, while trying to, well, understand Bonsai. It goes over some underlying concepts (SPAs, Frontend State Management, Algebraic Effects, Monads), as well as Bonsai=E2=80=99s co= re design. 6. [Using GraphQL in Bonsai]. 7. [Routing in Bonsai and Project Conclusion]. Additionally, the [project=E2=80=99s README] has a comprehensive overview= of the tech stack, folder structure, and usage instructions. It also includes some reflections on design decisions and my experience working with these libraries. I had a lot of fun writing these, and I hope they=E2=80=99re useful to an= yone considering OCaml for web development. Would be happy to answer any questions or comments. [CMPSC 431W] [Flarum] [Dream] [Bonsai] [tutorials] [bits] [pieces] [hardware design with OCaml] [Full-Stack WebDev in OCaml Intro] [live demo] [Backend WebDev w/ Dream and Caqti] [Building GraphQL APIs with Dream] [Setting up Bonsai] [Understanding Bonsai] [Using GraphQL in Bonsai] [Routing in Bonsai and Project Conclusion] [project=E2=80=99s README] Alexander (Sasha) Skvortsov later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Also, forgot to mention this originally, but I recommend accessing the demo with one of the emails from [this file] or [this file] (all passwords are still [here]), as those users can also demo create/update functionalities. [this file] [this file] [here] Daniel B=C3=BCnzli replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 People who are looking for more lightweight alternatives =E2=80=93 and wa= nt to do web programming without bothering too much about front end insanity can have a look at [hc] (yes indeed: sending HTML over `fetch', web programming excels at running in circles). The front JavaScript for that [CRUD webapp] comes out at 132Ko uncompressed without even trying to tweak anything. [hc] [CRUD webapp] Sketch.sh now supports multiple compiler versions, starting with 4.13.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Javier Ch=C3=A1varri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The interactive OCaml sketchbook [sketch.sh] has now support to store, edit and run sketches in different versions of the OCaml compiler. [sketch.sh] Support for 4.13 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Storing and running sketches using the compiler version 4.13.1 is now possible, this functionality has been added to the already existing support for version 4.06.1. The Reason parser and formatting tool refmt were also updated to a more recent version that supports 4.13.1. Here you can see a sketch showcasing the monadic let syntax, using the example from the official OCaml docs: [ZipSeq - Sketch.sh]. [ZipSeq - Sketch.sh] Existing sketches and forks =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C Previously existing sketches remain in 4.06.1, while newly created sketches will be on 4.13.1. For now, the only way to "migrate" a sketch to the newer version of the compiler is by copying its content and pasting it in a new sketch. Forked sketches inherit the compiler version of the forked sketch. Future plans =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C In the future, there are plans to support version 4.14.0 of the compiler, and we are considering adding a way so that the version of the compiler can be chosen for a given sketch. We are also working on migrating the editor UI codebase to a more recent version of ReasonReact, and use JSX3 instead of JSX2. Feature requests and bugs =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Please [let us know] in case you have a feature request, or if you encounter any issues or bugs. Also, don't hesitate to reach out via DM or any other means if you would like to contribute or participate in the project in some way. Thanks to [Ahrefs] for supporting an Open Source Day initiative, which allowed to allocate time to work on this improvement for sketch.sh, and for providing the infrastructure to run the sketch.sh service for the community. Thanks as well to the authors and maintainers of the OCaml compiler, js_of_ocaml, and ReScript, that sketch.sh relies upon. [let us know] [Ahrefs] Explicit type binding and mutual recursion =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Deep in this thread, octachron explained =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For most use cases, if you want an explicit annotation for recursive function, it will be much simpler to use the `type a. ...' form: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let rec foo: type a. a -> a =3D fun x -> x =E2=94=82 and bar: type a. a -> a =3D fun x -> foo x =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This form is a shortcut for both adding an explicit universal quantified and and a corresponding locally abstract type (in other words ~let f : 'a . =E2=80=A6. =3D fun (type a) -> =E2=80=A6 ~). The root issue with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let rec f (type a) (x:a) =3D f x =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 is that the locally abstract type `a' is introduced after `f'. Moreover, without an explicit type annotation, a recursive function like `f' is monomorphic in its body and a monorphic function cannot be called on a type that was defined after the function. In other words, the issue is that in term of type scopes, the function `f' is equivalent to =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f =3D ref Fun.id =E2=94=82 type t =3D A =E2=94=82 let x =3D !f A =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which also fails with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Error: This expression has type t but an expression was expecte= d of type 'a =E2=94=82 The type constructor t would escape its scope =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is why the second solution proposed by @Gopiandcode works. Indeed, in =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let foo, bar =3D fun (type a) -> =E2=94=82 let rec foo (x: a) : a =3D x =E2=94=82 and bar (x: a) : a =3D foo x in =E2=94=82 foo, bar =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 the type `a' is defined before the recursive functions `foo' and `bar', thus `foo a' does not break any scope constraint. findlib-1.9.4 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 findlib-1.9.4 is out. It mainly includes a change in the configuration script needed for OCaml-4-14. For manual, download, manuals, etc. see here: An updated OPAM package will follow soon. omake-0.10.4 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I just released omake-0.10.4, the build utility. This finally includes the fix for Apple Silicon, but also a couple of small changes (roughly everything since PR#100 to PR#146 on GitHub). For docs and the download link see . opam is underway. Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 31 to June 07, 20= 22.

    carray.0.0.1

    Deep in this threas, Fabian said

    Note that you can, to a certain degree, build your own flat structures with= the Bytes module. Compared to bigarrays, Bytes.t has less indirection, a= lower constant memory overhead and can be allocated on the minor heap. The contents of Byte= s.t are not scanned by the GC, just like bigarrays.

    For example, a more efficient int32 Array.t:

    module Int32_array : sig
      type t
      val equal : t -> t -> bool
      val create : int -> t
      val length : t -> int
      val get : t -> int -> int32
      val set : t -> int -> int32 -> unit
      val sub : t -> int -> int -> t
      val to_list : bytes -> int32 list
    end =3D struct
      type t =3D Bytes.t
      let equal =3D Bytes=
    .equal
      let create len =3D Bytes.create (4 * len)
      let length t=
     =3D Bytes.length t / 4
      let get t i =3D =
    Bytes.get_int32_le t (4 * i)
      let set t i x =3D Bytes.set_int32_le t (4 * i=
    ) x
      let sub t pos le=
    n =3D Bytes.sub t (4 * pos) (=
    4 * len)
      let to_list t =3D List.init (length t) (get t)
    end
    

    A more efficient (int * int):

    module Point : sig
      type t
      val create : int -> int -> t
      val x : t -> int
      val y : t -> int
    end =3D struct
      external get_int64_unsafe : bytes -> int -> i=
    nt64 =3D "%caml_bytes_get64u"
      external set_int64_unsafe : bytes -> int -> i=
    nt64 -> unit =3D "%caml_bytes_set64u"
      type t =3D Bytes.t
      let create x=
     y =3D
        let p =3D Bytes.<=
    /span>create 16 in
        set_int64_unsafe p 0 (Int64.of_i=
    nt x);
        set_int64_unsafe p 8 (Int64.of_i=
    nt y);
        p
      let x t =3D =
    Int64.to_int (get_int64_unsafe t 0)
      let y t =3D =
    Int64.to_int (get_int64_unsafe t 8)
    end
    

    (making a more efficient (int * int) Array.t is left as an exe= rcise to the reader)

    The downside compared to bigarrays is that it doesn't support sub without copying. Also, bytes can be moved by the GC (during minor GCs or compaction), and therefor= e you cannot release the runtime lock when passing them to C. The latter point is less r= elevant with the multicore extensions, especially since there is no compactor yet. There is = some related discussion on the eio repository: https://github.com/ocaml-multicore/eio/issues/140

    ML Family Workshop 2022: Final Call for Presentations

    Benoit Montagu announced

    ML Family Workshop 2022: DEADLINE EXTENSION

    To increase your chances of submitting your work to the ML workshop, the submission deadline is extended by a week. The new deadline is Friday 10th June (AoE).

    A quick reminder:

    OCaml Users and Developers Workshop 2022

    Matija Pretnar announced

    To offer additional opportunities to contribute to the OCaml workshop, and = to align with the ML family workshop, to which you are also cordially invited, the submission deadline has been exte= nded by a week to Friday, June 10 (anywhere on Earth).

    dkml-c-probe.2.0.0: Cross-compiler friendly definitions for C = compiling

    jbeckford announced

    Summary: dkml-c-probe is a new package for maintainers who compile or link = C code. Install it with opam install dkml-c-probe. Full docs are at https://github.co= m/diskuv/dkml-c-probe#readme

    Problem

    You are creating an OCaml package that has foreign C code. Perhaps you need= special C headers or libraries when you are targeting Apple users, or perhaps you need to exe= cute custom OCaml code for Android users. More generally you need a way to determine whether = your OCaml or C code is compiling for a Linux AMD/Intel 64-bit, Android ARM 32-bit, or any = other ABI target.

    Solution

    A user of your OCaml package may, for example, be on a 64-bit AMD/Intel Lin= ux machine using a 32-bit OCaml system compiled with gcc -m32; additionally they = have a 32-bit Android ARM cross-compiler toolchain. dkml-c-probe will tell you the targe= t operating system is Linux and the target ABI is Linux_x86 except when the cross-compiler= toolchain is invoked. With the cross-compiler toolchain dkml-c-probe will tell you the ta= rget operating system is Android and the target ABI is Android_arm32v7a.

    How it works

    dkml-c-probe uses C preprocessor definitions (ex. #if TA= RGET_CPU_X86_64, #if __ANDROID__, etc.) to determine which ABI the C compiler (ex. = ocamlopt -config | grep native_c_compiler) is targeting.

    This isn't a new idea. The pattern is used in Esy and Mirage code as well. = dkml-c-probe just codifies the pattern for use in your own code.

    Usage

    In OCaml code you can use the versioned module:

    module V2 :
      sig
        type t_os =3D Android | IOS | Linux | OSX | Windows
        type t_abi =3D
            Android_=
    arm64v8a
          | Android_=
    arm32v7a
          | Android_=
    x86
          | Android_=
    x86_64
          | Darwin_a=
    rm64
          | Darwin_x=
    86_64
          | Linux_ar=
    m64
          | Linux_ar=
    m32v6
          | Linux_ar=
    m32v7
          | Linux_x8=
    6_64
          | Linux_x8=
    6
          | Windows_=
    x86_64
          | Windows_=
    x86
          | Windows_=
    arm64
          | Windows_=
    arm32
        val get_os : (t_os, Rresult.R.msg) result Lazy.t
        val get_abi : (t_abi, Rresult.R.msg) result Lazy.t
        val get_abi_name : (string, Rresult.R.msg) result Laz=
    y.t
      end
    

    In C code you can use the provided dkml_compiler_probe.h header from within Dune or Opam. Here is a snippet that handles part of the Linux introspection:

    #elif __lin=
    ux__
    #   if __ANDROID__
    #       ...
    #   else
    #       define DKML_OS_NAME "Linux"
    #       define DKML_OS_Linux
    #       if __aarch64__
    #           define DKML_ABI "linux_arm64=
    "
    #           define DKML_ABI_linux_arm64
    #       elif __arm__
    #           if defined(__ARM_ARCH_6__) || #               define DKML_ABI "linux=
    _arm32v6"
    #               define DKML_ABI_linux_arm32v6
    #           elif defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) ||
    defined(__ARM_ARCH_7R__) || defined(=
    __ARM_ARCH_7M__) || defined(__ARM_ARCH_7S__)
    #               define DKML_ABI "linux=
    _arm32v7"
    #               define DKML_ABI_linux_arm32v7
    #           endif /* __ARM_ARCH_6__ || .=
    ..,  __ARM_ARCH_7__ || ... */
    #       elif __x86_64__
    #           define DKML_ABI "linux_x86_6=
    4"
    #           define DKML_ABI_linux_x86_64
    #       elif __i386__
    #           define DKML_ABI "linux_x86"<=
    /span>
    #           define DKML_ABI_linux_x86
    #       elif defined(__ppc64__) || defin=
    ed(__PPC64__)
    #           define DKML_ABI "linux_ppc64=
    "
    #           define DKML_ABI_linux_ppc64
    #       elif __s390x__
    #           define DKML_ABI "linux_s390x=
    "
    #           define DKML_ABI_linux_s390x
    #       endif /* __aarch64__, __arm__, _=
    _x86_64__, __i386__, __ppc64__ || __PPC64__,
    __s390x__ */
    

    Versioning and Contributing

    Whenever a new ABI is added, it goes into a new version (ex. module V= 3). Your existing code that uses module V2 will be unaffected.

    But each new ABI needs to have its own maintainer because I don't have acce= ss to every hardware platform on the planet!

    For example, PowerPC (ppc64) and Linux on IBM Z (s390x) are supported in the C Header but not the OCaml module because there are no PowerPC and S390x maintainers.

    Please consider contributing, especially if you want others to have an easi= er compilation story for your favorite hardware platform.

    Full-Stack Web Dev in OCaml Tutorial w/ Dream, Bonsai, and Gra= phQL

    Alexander (Sasha) Skvortsov announced

    Hi everyone! I=E2=80=99ve written a tutorial blog series about full-stack w= eb development in OCaml, and wanted to share it here.

    Last semester, I took Penn State's CMPSC 431W, where our final project was to build a database-driven web application. Sin= ce I'm fairly familiar with web programming through my work on Flarum and past internships/side projects, I decided to use this opportunity to explore the= OCaml web development ecosystem. I used = Dream for the backend, and Bonsai for the fronten= d.

    While working on this project, I realized two things:

    • OCaml is very underrated for web development. In addition to all the la= nguage=E2=80=99s great features and safety guarantees, the ecosystem is pre= tty good! Dream near-perfectly coincides with my vision of backend webdev, = and Bonsai has a great balance of flexibility/elegance and safety.
    • I couldn=E2=80=99t find realistic but accessible full-stack web project= s in OCaml available for reference. I found tutorials for bits and pieces, but n= othing that connected all the dots.

    I really enjoyed writing an article series on hardware design= with OCaml, so I decided to do so for web development as well. In total, I wrote 7 articles = that walk through my project=E2=80=99s:

    1. Full-Stack WebDev in OCaml Intro. This includes some backgro= und on the project, and instructions for accessing the live demo.
    2. Backend WebDev w/ Dream and Caqti.
    3. Building GraphQL APIs with Dream
    4. Sett= ing up Bonsai.
    5. U= nderstanding Bonsai. I actually wrote the first draft of this before I = decided to do a blog, while trying to, well, understand Bonsai. It goes ove= r some underlying concepts (SPAs, Frontend State Management, Algebraic Effe= cts, Monads), as well as Bonsai=E2=80=99s core design.
    6. Using GraphQL in Bonsai.
    7. Routing in Bonsai and Project Conclusion.

    Additionally, the project=E2=80=99s README has a comprehensive overview of the tech stack, folder structure, and usage instr= uctions. It also includes some reflections on design decisions and my experience working wit= h these libraries.

    I had a lot of fun writing these, and I hope they=E2=80=99re useful to anyo= ne considering OCaml for web development. Would be happy to answer any questions or comments.

    Alexander (Sasha) Skvortsov later added

    Also, forgot to mention this originally, but I recommend accessing the demo with one of the emails from = this file or this file (all passwords are still here), as those users can also demo create/update functionalities.

    Daniel B=C3=BCnzli replied

    People who are looking for more lightweight alternatives =E2=80=93 and want= to do web programming without bothering too much about front end insanity = can have a look at hc (yes indeed: sending HT= ML over fetch, web programming excels at running in circles).

    The front JavaScript for that CRUD webapp comes out at 132Ko uncompressed without even trying to = tweak anything.

    Sketch.sh now supports multiple compiler versions, starting wi= th 4.13.1

    Javier Ch=C3=A1varri announced

    Existing sketches and forks

    Previously existing sketches remain in 4.06.1, while newly created sketches= will be on 4.13.1. For now, the only way to "migrate" a sketch to the newer version of= the compiler is by copying its content and pasting it in a new sketch.

    Forked sketches inherit the compiler version of the forked sketch.

    Future plans

    In the future, there are plans to support version 4.14.0 of the compiler, a= nd we are considering adding a way so that the version of the compiler can be chosen = for a given sketch. We are also working on migrating the editor UI codebase to a more r= ecent version of ReasonReact, and use JSX3 instead of JSX2.

    Feature requests and bugs

    Please let us= know in case you have a feature request, or if you encounter any issues or bugs. Also, don't hesita= te to reach out via DM or any other means if you would like to contribute or participate in= the project in some way.

    Thanks to Ahrefs for supporting an Open= Source Day initiative, which allowed to allocate time to work on this improvement for sketch.sh, and for= providing the infrastructure to run the sketch.sh service for the community. Thanks as we= ll to the authors and maintainers of the OCaml compiler, js_of_ocaml, and ReScript, that sket= ch.sh relies upon.

    Explicit type binding and mutual recursion

    Deep in this thread, octachron explained

    For most use cases, if you want an explicit annotation for recursive functi= on, it will be much simpler to use the type a. ... form:

    let rec foo: type a. a -> a =3D fun x -> x
    and bar: type a.=
     a -> a =3D fun x -> foo x
    

    This form is a shortcut for both adding an explicit universal quantified an= d and a corresponding locally abstract type (in other words ~let f : 'a . …= . =3D fun (type a) -> … ~).

    The root issue with

    let rec f (a) (x:a) =3D f x
    

    is that the locally abstract type a is introduced after = f. Moreover, without an explicit type annotation, a recursive function like f is monomorphic in= its body and a monorphic function cannot be called on a type that was defined after the function.

    In other words, the issue is that in term of type scopes, the function f is equivalent to

    let f =3D ref Fun.id
    type t =3D A
    let x =3D !f=
     A
    

    which also fails with

    Error: This expression has type t but an expression was expected of type 'a
           The type constructor t would escape its scope
    

    This is why the second solution proposed by @Gopiandcode works. Indeed, in

    let foo, bar =3D fun =
    (type let rec foo (x: a) : a =3D=
     x
      and bar (x:<=
    span style=3D"color: #228b22;"> a) :=
     a =3D foo x in
      foo, bar
    

    the type a is defined before the recursive functions foo= and bar, thus foo a does not break any scope constraint.

    findlib-1.9.4

    Gerd Stolpmann announced

    findlib-1.9.4 is out. It mainly includes a change in the configuration script needed for OCaml-4-14.

    For manual, download, manuals, etc. see here:

    http://proje= cts.camlcity.org/projects/findlib.html

    An updated OPAM package will follow soon.

    omake-0.10.4

    Gerd Stolpmann announced

    I just released omake-0.10.4, the build utility. This finally includes the fix for Apple Silicon, but also a couple of small changes (roughly everything since PR#100 to PR#146 on GitHub).

    For docs and the download link see http://project= s.camlcity.org/projects/omake.html. opam is underway.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DB736E0038 for ; Tue, 14 Jun 2022 11:29:58 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=deZQ=WV=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: OPkvfJGBnbEkfFHK5Nrr/vPjj59mL/MY1JxKooDg1tLAyfnHnpFhHQaYfoMtISymsqNErLt2a1 gBWKxUjf85Im7a7NJLD6rfgTt/UwlcU0AfaUSy9x5dvkvNBsEQom06EFewUGpvTNF/eUbEcnOf xZox6ryGVoiVWZz5tR7CpVQei4CNkKeZ8OQHrdF47ZFmQYfK4iNLX9AH+LW/+Rov+2ETIYzThN fzP6p08mMINLo1k6oJlOZMGhx7WkYPMQqUmk960DrarIKJwLh0x26b0FlwmQ8njmTbVftdplD+ V4GJe8sWNqb0L5zxboKUhyEX X-IPAS-Result: =?us-ascii?q?A0AqAQCKVKhihyIeaIFaEwEBBwEBAQEBAQcBARIBAQQEA?= =?us-ascii?q?QGCD4EhgQMZAWdWLgcIRIROiQCIDYEWiDuGfoFNimQPgQIDTxABAwENLAEFD?= =?us-ascii?q?QECBAEBgg6CdAIWhTECHgYBBTMTAQIEAQEBAQMCAwEBAQEBAQMBAQUBAQECA?= =?us-ascii?q?QECBAQBEwEBAQENCwkFCAoHEA4FPGRkBIFLBIF0CzQNgjUMDAMDg3QDARYCA?= =?us-ascii?q?QgEBmUjAxQBBgMCBA0BFwEeAwETARIUBoJjAYMYAwUKkAiaSxo1en8ygQGDT?= =?us-ascii?q?wEDAgwCAgMPLgGDc4FlJIEZhh9bSgGDDgmCdIEdAicQgVVEgRWCKUoHboIRO?= =?us-ascii?q?gwLAQEBAQGBOwEBBgJOgyCCZQSBM4lziDWEfAc4A0c0EoEhcQEIBgYHCgUyB?= =?us-ascii?q?gIMGBQEAhMSTQYdAhIMCgYWDkISGQwPAxIDEQEHAgsSCBUsCAMCAwgDAgMuA?= =?us-ascii?q?gMXCQcKAx0IChwSEBQCBBMeCwgDGR8sCQIEDgNDCAsKAxEEAxMYCxYIEAQGA?= =?us-ascii?q?wkvDSgLAwUPDQEGAwYCBQUBAyADFAMFJwcDIQcLJg0NBCMdAwMFJgMCAhsHA?= =?us-ascii?q?gIDAgYXBgICGVYKJg0IBAgEGAQdJBAFAgcxBQQvAh4EBQYRCQIWAgYEBQIEB?= =?us-ascii?q?BYCAhIIAggnGwcWNhkBBV0GCwkhFgYpEQUGFgMjTCcFSA8pNTY8LyEbCoEJB?= =?us-ascii?q?iKVDxyEOSMCDgonBwYBDlMuBwwICgQBAVAIIxUBCgQRBA8CGgYDFjQLCwItA?= =?us-ascii?q?5FsFBADAwcEKY1kh2CDCIJhkVV8NAeDUYE+BgyILIEijQKII4N1gVCKcZgqI?= =?us-ascii?q?ZZLIIIrhnwCgRuCA0aDQIEmg06MEQYEHIUbgU4qgWsMBzMaMCIhglEXCUUBA?= =?us-ascii?q?wINAQICAwECAQIJAQECjikWgygogT6BDBqBdTuFTD80AgEBBzACBgEKAQEDC?= =?us-ascii?q?YVjAQEFEwsBhi4tghkBAQ?= IronPort-PHdr: A9a23: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 R4O4EJL/g1Sz+dN IronPort-Data: A9a23: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 28Rm/+//rSsuEZp IronPort-HdrOrdr: A9a23:RO0AlaHBL2xIGpvBpLqE78eALOsnbusQ8zAXPiFKKSC9Hfb2qy nDpp4mPHzP6Qr5OktPpTnoAsDpKk80nqQY3WB+B9qfdTijkFTtBoBv54nvzlTbak7D398Y87 xvN4x3CNiYNykesS8W2njbL+od X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.91,299,1647298800"; d="scan'208,217";a="40925915" X-MGA-submission: =?us-ascii?q?MDFABBdjlwaiGkfeV9LbQqMi6GtgCCoKCNNsqt?= =?us-ascii?q?z7fiQ0Gp4XRuqNb6sqojMUxEqUt8llEHtuD1HJ690KNCgtSC1nlq18Pc?= =?us-ascii?q?OxvUJPdbgxi6rsEgAs9CWa1Vo3xy0guq/T3WQpKP4j6TfQHF54xF5SIC?= =?us-ascii?q?Bsoi5xH5cSrD0bBNXUfRsfmA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jun 2022 11:29:58 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 383835646C3; Tue, 14 Jun 2022 11:29:57 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 14 Jun 2022 11:29:56 +0200 Message-ID: <87r13rh9t7.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 14 11:29:57 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.372135, queueID=7C0315646C5 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAwNyB0byAxNCwNCjIwMjIuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTHd0IGluZm9y bWFsIHVzZXIgc3VydmV5DQpUdXRvcmlhbDogRnVsbC1TdGFjayBXZWIgRGV2IGluIE9DYW1sIHcv IERyZWFtLCBCb25zYWksIGFuZCBHcmFwaFFMDQpka21sLWMtcHJvYmU6IENyb3NzLWNvbXBpbGVy IGZyaWVuZGx5IGRlZmluaXRpb25zIGZvciBDIGNvbXBpbGluZw0KSHRteC9oYyB3ZWIgZGV2ZWxv cG1lbnQgYXBwcm9hY2gNCkVuZ2luZWVyIGFuZCBwb3N0ZG9jIHBvc2l0aW9ucyBpbiBGcmFuY2Ug KHZhcmlvdXMgbGFicykgdG8gd29yayBvbiBhIHByb29mIGFzc2lzdGFudCBmb3IgY3J5cHRvIHBy b3RvY29scw0KWW9qc29uIDIuMC4wDQpvcGVudGVsZW1ldHJ5IDAuMg0Kb21ha2UtMC4xMC41DQpm aW5kbGliLTEuOS41DQpPbGQgQ1dODQoNCg0KTHd0IGluZm9ybWFsIHVzZXIgc3VydmV5DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2x3 dC1pbmZvcm1hbC11c2VyLXN1cnZleS85NjY2LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVh ZCwgUmFwaGHDq2wgUHJvdXN0IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcyB0byBl dmVyeW9uZSB3aG8gdG9vayB0aGUgdGltZSB0byBhbnN3ZXIgdGhlIHBvbGxzIGFib3ZlLiBJJ3Zl DQogIG5vdyBjbG9zZWQgdGhlbS4NCg0KICBUaGUgZmlyc3QgcHVsbC1yZXF1ZXN0IHRvIGNvbWUg b3V0IG9mIHRoaXMgcG9sbCBpcw0KICBbPGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9w dWxsLzk0Nz5dKHJlbW92aW5nIHN1cHBvcnQgZm9yDQogIE9DYW1sPD00LjA3KS4gVGhpcyB3YXMg dGhlIGN1dG9mZiBpbiB0aGUgcG9sbC4gSXQgcmVtb3ZlcyBhIGxvdCBvZg0KICBgI2lmJyBwcmVw cm9jZXNzaW5nIHN0YXRlbWVudHMgYW5kIGEgZmV3IHdvcmthcm91bmRzIHRvIHN0YXkNCiAgY29t cGF0aWJsZSB3aXRoIG9sZCBTdGRsaWIgaW50ZXJmYWNlcy4gVGhhbmtzIHRvIEBoYW5uZXMgZm9y DQogIGNvbnRyaWJ1dGluZyBtb3N0IG9mIHRoZSBjb21taXRzIG9uIHRoaXMgcHVsbC1yZXF1ZXN0 LiAgSWYgc3VwcG9ydCBmb3INCiAgT0NhbWw8PTQuMDcgaXMgaW1wb3J0YW50IHRvIHlvdSwgcGxl YXNlIHBhcnRpY2lwYXRlIGluIHRoZQ0KICBwdWxsLXJlcXVlc3QncyBkaXNjdXNzaW9uIG9yIG9u IHRoaXMgdGhyZWFkLg0KDQogIFN0YXkgdHVuZWQgZm9yIG1vcmUuIChCdXQgYWxzbyBiZSBwYXRp ZW50LikNCg0KDQpUdXRvcmlhbDogRnVsbC1TdGFjayBXZWIgRGV2IGluIE9DYW1sIHcvIERyZWFt LCBCb25zYWksIGFuZCBHcmFwaFFMDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3R1dG9yaWFsLWZ1bGwt c3RhY2std2ViLWRldi1pbi1vY2FtbC13LWRyZWFtLWJvbnNhaS1hbmQtZ3JhcGhxbC85OTYzLzIw Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIGplcmJlbiBhc2tlZCBhbmQgRGFuaWVsIELD vG56bGkgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgVmVyeSBpbnRlcmVzdGlu ZywgZGlkIHlvdSB3cml0ZSBzb21ld2hlcmUgYWJvdXQgaG93IGl0DQogICAgICAgIGNvbXBhcmVz IHRvIGh0bXg/DQoNCiAgTm90IHJlYWxseS4NCg0KICBBcyBmYXIgYXMgSSBjYW4gcmVtZW1iZXIg SSBsaWtlZCB0aGUgaWRlYXMgYnV0IGZvdW5kIHRoZWlyIGV4ZWN1dGlvbg0KICB0byBiZSBhIGJp dCBsYWNraW5nLCBzb21ldGltZXMgYWQtaG9jIGluIHRoZWlyIGF0dHJpYnV0ZSBEU0wsIGZvY3Vz aW5nDQogIG1vcmUgb24gdGhlIHNob3cgb2ZmIHRvIGNvbnZpbmNlIHNpbmdsZSBwYWdlIGFwcGxp Y2F0aW9uIHByb3BvbmVudHMgb2YNCiAgdGhlIGFwcHJvYWNoIHRoYW4gb24gYSBjbGVhciBjb25j ZXB0dWFsIG1vZGVsICh3aGljaCBgaGMnIHRyaWVzIHRvDQogIGRldGFpbCBpbiB0aGUgbWFudWFs IFtoZXJlXSkuDQoNCiAgVHdvIG90aGVyIHRoaW5ncyB0aGF0IGNvbWUgdG8gbWluZCBhcmU6DQoN CiAgMS4gQUZBSVIgdGhlaXIgZXhhbXBsZXMgcmVsaWVkIGEgbG90IG9uIHVuaXF1ZSBgaWQnIGF0 dHJpYnV0ZXMgZm9yDQogICAgIHRhcmdldGluZyByZXF1ZXN0IHJlc3VsdHMuIFVubGVzcyB5b3Ug ZmluZCBhIHByaW5jaXBsZWQgYW5kDQogICAgIGF1dG9tYXRlZCB3YXkgdG8gZ2VuZXJhdGUgdGhl c2UgdGhhdCdzIG5vdCBjb21wb3NpdGlvbmFsIGFuZA0KICAgICBicml0dGxlLiBJbiBgaGMnIEkg W2V4dGVuZGVkIHRoZSBDU1Mgc2VsZWN0b3Igc3ludGF4XSB0byBhbGxvdyB0bw0KICAgICBhZGRy ZXNzIHlvdXIgYW5jZXN0b3JzIChwZWFjZSBiZSB1cG9uIHRoZW0pLiBUaGF0J3MgbW9yZQ0KICAg ICBjb21wb3NpdGlvbmFsIGJ1dCBub3cgeW91IGJlY29tZSBzZW5zaXRpdmUgdG8gc3RydWN0dXJh bCBjaGFuZ2VzIGluDQogICAgIHlvdXIgbWFya3VwIOKAkyBwaWNrIHlvdXIgcG9pc29uW14xXS4N CiAgMi4gSSdtIG5vIGxvbmdlciBzdXJlIGFib3V0IHRoYXQsIGkuZS4gZG9uJ3QgdGFrZSBteSB3 b3JkIGZvciBpdCwgYnV0DQogICAgIEkgdGhpbmsgdGhlaXIgRFNMIGFsbG93ZWQgdG8gc3ByZWFk IHRoZSBkZWZpbml0aW9uIG9mIGFuDQogICAgIGludGVyYWN0aW9uIGFtb25nIG1hbnkgZWxlbWVu dHMgd2hpY2ggbWFkZSBpdCBtb3JlIGRpZmZpY3VsdCB0bw0KICAgICB1bmRlcnN0YW5kIHdoYXQg aXMgaGFwcGVuaW5nLiBJbiBgaGMnIGFsbCBhdHRyaWJ1dGVzIGRlZmluaW5nIHRoZQ0KICAgICBl ZmZlY3RzIG9mIGFuIGludGVyYWN0aW9uIGFyZSBhbHdheXMgbG9jYXRlZCBvbiBhIHNpbmdsZSBl bGVtZW50LA0KICAgICB0aGUgZWxlbWVudCB0aGF0IHBlcmZvcm1zIHRoZSByZXF1ZXN0Lg0KDQog IEZpbmFsbHkgd2hlbiB0aGluZ3MgZ28gd3JvbmcgSSBwcmVmZXIgdG8gaGF2ZSB0byB1bmRlcnN0 YW5kIFs3MDAgbGluZXMNCiAgb2YgbWxdIHJhdGhlciB0aGFuIFsyODAwIGxpbmVzIG9mIEphdmFT Y3JpcHRdIChub3RlIHRoYXQgdGhleSBsaWtlbHkNCiAgaGF2ZSBiZXR0ZXIgbGVnYWN5IGJyb3dz ZXIgc3VwcG9ydCBhbmQgbW9yZSBmdW5jdGlvbmFsaXR5KS4NCg0KICBJbiBhbnkgY2FzZSB0aGVy ZSdzIGEgbG9uZyBsaXN0IG9mIHRvZG9zIGluIGBoYycgYW5kIGl0IGxpa2VseSBuZWVkcw0KICBv bmUgb3IgdHdvIG1vcmUgZGVzaWduIHJvdW5kcyBiZWZvcmUgZ2V0dGluZyB0byBzb21ldGhpbmcg ZGVjZW50IOKAkyBpZg0KICB0aGF0J3MgZXZlbiByZW1vdGVseSBwb3NzaWJsZSBvbiB0aGUgd2Vi Lg0KDQogICAgICAgIERhbmcgaXQgQGRidWVuemxpIG9uZSBkYXkgeW914oCZbGwgcnVuIG91dCBv ZiBsZXR0ZXJzIGFuZA0KICAgICAgICBuZWVkIHRvIGNvbWUgdXAgd2l0aCBhbiBhY3R1YWwgbmFt ZSBmb3IgeW91ciBsaWJyYXJpZXMuDQoNCiAgTWluZCB5b3UgSSB0cmllZCB0byB1c2UgdGhyZWUg bGV0dGVycyBvbmNlLCBidXQgdGhlIHdob2xlIGV4cGVyaWVuY2UNCiAgdHVybmVkIG91dCB0byBi ZSBbZXh0cmVtZWx5IHVucGxlYXNhbnRdIDrigJMpDQoNCiAgW14xXTogVXNpbmcgdW5pcXVlIGlk cyByZWlmZWQgaW4gYW4gT0NhbWwgRURTTCBjb3VsZCBiZSBhIGJldHRlciBpZGVhLg0KDQoNClto ZXJlXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvaGMvZG9jL21hbnVhbC5odG1sI3Jl cXVlc3Q+DQoNCltleHRlbmRlZCB0aGUgQ1NTIHNlbGVjdG9yIHN5bnRheF0NCjxodHRwczovL2Vy cmF0aXF1ZS5jaC9zb2Z0d2FyZS9oYy9kb2MvbWFudWFsLmh0bWwjc2VsZWN0b3I+DQoNCls3MDAg bGluZXMgb2YgbWxdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2hjL2Jsb2IvbWFzdGVy L3NyYy9oY19wYWdlLm1sPg0KDQpbMjgwMCBsaW5lcyBvZiBKYXZhU2NyaXB0XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9iaWdza3lzb2Z0d2FyZS9odG14L2Jsb2IvbWFzdGVyL3NyYy9odG14LmpzPg0K DQpbZXh0cmVtZWx5IHVucGxlYXNhbnRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL3Jl bC9jb21taXQvZjk1YjZiYWQwMmE4MDgwZWI2NGY4ZDAxMjNjZDYzZDQwYjUyOGUzMz4NCg0KDQpk a21sLWMtcHJvYmU6IENyb3NzLWNvbXBpbGVyIGZyaWVuZGx5IGRlZmluaXRpb25zIGZvciBDIGNv bXBpbGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGttbC1jLXByb2JlLWNyb3NzLWNvbXBpbGVyLWZy aWVuZGx5LWRlZmluaXRpb25zLWZvci1jLWNvbXBpbGluZy85OTUwLzg+DQoNCg0KamJlY2tmb3Jk IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgVjMgaXMgYXZhaWxhYmxlLiBJdHMgYENfYWJpJyBtb2R1bGUgaGFz IHNvbWUgYmlnIGVuaGFuY2VtZW50czoNCiAg4oCiIGNsZWFuZXIgQVBJICh0aGFua3MgQG1zZXJp ISkNCiAg4oCiIHJlY29nbml6ZXMgdGhlIEJTRCBmYW1pbHk6IE9wZW5CU0QsIEZyZWVCU0QsIE5l dEJTRCBhbmQgRHJhZ29uRmx5IG9uDQogICAgeDg2XzY0IGhhcmR3YXJlDQogIOKAoiBpbnRlZ3Jh dGlvbiB0ZXN0aW5nIG5vdyBpbmNsdWRlcyBPcGVuQlNELCBGcmVlQlNEIGFuZCBvbmUNCiAgICBj cm9zcy1jb21waWxpbmcgdG9vbGNoYWluIChtYWNPUyB4ODZfNjQgaG9zdCB0aGF0IHRhcmdldHMg YXJtNjQpDQoNCiAgVjMgYWxzbyBoYXMgYSBuZXcgbW9kdWxlIGBDX2NvbmYnIHdoaWNoIG9jY3Vw aWVzIHRoZSBzYW1lIHByb2JsZW0NCiAgc3BhY2UgYXMgYGZpbmRsaWIgLyBvY2FtbGZpbmQnIGFu ZCBgcGtnLWNvbmZpZyc6DQogIOKAoiBVbmxpa2UgYGZpbmRsaWInIHdoaWNoIGlzIGEgc3BlY2lm aWNhdGlvbit0b29sIGZvciAzcmQgcGFydHkgT0NhbWwNCiAgICBsaWJyYXJpZXMsIGBDX2NvbmYn IGlzIGEgc3BlY2lmaWNhdGlvbit0b29sIGZvciBmb3JlaWduIEMgbGlicmFyaWVzDQogIOKAoiBV bmxpa2UgYHBrZy1jb25maWcnIHdoaWNoIGlzIGEgc3BlY2lmaWNhdGlvbit0b29sIGZvciBzeXN0 ZW0gKGhvc3QNCiAgICBBQkkpIEMgbGlicmFyaWVzLCBgQ19jb25mJyBpcyBhIHNwZWNpZmljYXRp b24rdG9vbCBmb3IgdGhlIG11bHRpcGxlDQogICAgQUJJcyB0aGF0IGFyZSBwcmVzZW50IHdoZW4g eW91IGNyb3NzLWNvbXBpbGUgT0NhbWwgb3IgQyBjb2RlDQogIOKAoiBVbmxpa2UgYHBrZy1jb25m aWcnIHdoaWNoIGlzIGRlc2lnbmVkIGZvciBVbml4LCBgQ19jb25mJyBpcyBkZXNpZ25lZA0KICAg IGZvciBXaW5kb3dzIGFuZCBVbml4IHdoZXJlIHBhdGhzIG1heSBoYXZlIHNwYWNlcywgYmFja3Ns YXNoZXMgYW5kDQogICAgY29sb25zDQogIOKAoiBGb3Igbm93IHRoZSBzcGVjaWZpY2F0aW9uIGlz IGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcy4gSWYgaXQNCiAgICBwcm92ZXMgdXNlZnVs IHRoZSBzcGVjaWZpY2F0aW9uIGNhbiBiZSBleHRlbmRlZC4NCg0KICBFeGFtcGxlcyBhbmQgZG9j IGxpbmtzIGZvciBWMyBhcmUgYXZhaWxhYmxlIGF0DQogIFtodHRwczovL2dpdGh1Yi5jb20vZGlz a3V2L2RrbWwtYy1wcm9iZSNka21sLWMtcHJvYmVdDQoNCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9k aXNrdXYvZGttbC1jLXByb2JlI2RrbWwtYy1wcm9iZV0NCjxodHRwczovL2dpdGh1Yi5jb20vZGlz a3V2L2RrbWwtYy1wcm9iZSNka21sLWMtcHJvYmU+DQoNCg0KTWFyY2VsbG8gU2VyaSBhc2tlZCBh bmQgamJlY2tmb3JkIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIFRoYW5rcyBhIGxvdCBm b3IgdGhlIHVwZGF0ZSEgQ2FuIHlvdSBzYXkgYSBiaXQgbW9yZSBhYm91dA0KICAgICAgICBob3cg YENfY29uZicgd29ya3M/DQoNCiAgQ19jb25mIGhhcyBhIGRldGFpbGVkIHByb2JsZW0gc3RhdGVt ZW50IGFuZCBzcGVjIGF0DQogIDxodHRwczovL2Rpc2t1di5naXRodWIuaW8vZGttbC1jLXByb2Jl L2RrbWwtYy1wcm9iZS9Ea21sX2NfcHJvYmUvQ19jb25mL2luZGV4Lmh0bWw+DQogICh3aGljaCBp cyBsaW5rZWQgdG8gb24gdGhlIGRrbWwtYy1wcm9iZSBSRUFETUUpLg0KDQogIEkgcHJvYmFibHkg c2hvdWxkbid0IHJlZ3VyZ2l0YXRlIHRoZSBkb2MgaGVyZSwgc28gSSdsbCB0YWtlIGEgZmV3IGtl eQ0KICBwaWVjZXMgZnJvbSB0aGUgZG9jIGFuZCB0aGVuIHBvc3Qgc29tZSB0aGluZ3MgaGVyZSB0 aGF0IEkgZGlkbid0IHB1dA0KICBvbiB0aGF0IGRvYyBwYWdlIOKApg0KDQogIDEuIEhlcmUgaXMg bXkgY29uZmlndXJhdGlvbiBmb3IgbG9jYXRpbmcgdGhlICJnbXAiIGxpYnJhcnkgb24gbXkgQXBw bGUNCiAgICAgU2lsaWNvbiBob3N0IG1hY2hpbmUgdGhhdCBjcm9zcy1jb21waWxlcyB0byB4ODZf NjQ6DQoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAgIOKUgiBDUF9HTVBfQ0NfREVGQVVMVCAg ICAgICAgICAgICAgICAgPSAtSVo6L2J1aWxkL2Rhcndpbl9hcm02NC92Y3BrZ19pbnN0YWxsZWQv YXJtNjQtb3N4L2luY2x1ZGUNCiAgICAg4pSCIENQX0dNUF9DQ19ERUZBVUxUX0RBUldJTl9YODZf NjQgICA9IC1JWjovYnVpbGQvZGFyd2luX3g4Nl82NC92Y3BrZ19pbnN0YWxsZWQveDY0LW9zeC9p bmNsdWRlDQogICAgIOKUgiBDUF9HTVBfTElOS19ERUZBVUxUICAgICAgICAgICAgICAgPSAtTFo6 L2J1aWxkL2Rhcndpbl9hcm02NC92Y3BrZ19pbnN0YWxsZWQvYXJtNjQtb3N4L2xpYjstbGdtcA0K ICAgICDilIIgQ1BfR01QX0xJTktfREVGQVVMVF9EQVJXSU5fWDg2XzY0ID0gLUxaOi9idWlsZC9k YXJ3aW5feDg2XzY0L3ZjcGtnX2luc3RhbGxlZC94NjQtb3N4L2xpYjstbGdtcA0KICAgICDilJTi lIDilIDilIDilIANCg0KICAgICDigKIgVGhlIG90aGVyIGRpcmVjdGlvbiBtYXkgYmUgbW9yZSBp bnRlcmVzdGluZywgc2luY2UgdGhlIGZyZWUNCiAgICAgICBHaXRIdWIgQWN0aW9ucyBvbmx5IHN1 cHBvcnRzIHg4Nl82NC4gVGhlIHNjZW5hcmlvIG9mIHRha2luZyBhDQogICAgICAgbWFjT1MgeDg2 XzY0IEdpdEh1YiBob3N0IGFuZCBjcm9zcy1jb21waWxpbmcgdG8gQXBwbGUgU2lsaWNvbiBpcw0K ICAgICAgIFtpbXBsZW1lbnRlZCBhbmQgcGFydGlhbGx5IHRlc3RlZF0uDQogIDIuIEkgYW0gdXNp bmcgYSBDIHBhY2thZ2UgbWFuYWdlciAodmNwa2cpIHRvIGdpdmUgbWUgY3Jvc3MtY29tcGlsZWQN CiAgICAgbGlicmFyaWVzIGFuZCB0aGUgZmxhZ3MgZm9yIHRoZSB0YXJnZXQgQUJJIChpbiB0aGlz IGNhc2UNCiAgICAgZGFyd2luX3g4Nl82NCBpcyB0aGUgdGFyZ2V0IEFCSSkuIEluIGdlbmVyYWwg aXQgZG9lc24ndCBtYXR0ZXINCiAgICAgd2hlcmUgeW91IGdldCB5b3VyIHRhcmdldCBBQkkgY29t cGF0aWJsZSBsaWJyYXJpZXMgZnJvbS4gRXhhbXBsZToNCiAgICAgV2hlbiBJJ20gY3Jvc3MtY29t cGlsaW5nIHRvIEFuZHJvaWQgb24gYSBXaW5kb3dzIHg4Nl82NCBob3N0LCB0aGUNCiAgICAgQW5k cm9pZCBTdHVkaW8gZW52aXJvbm1lbnQgZ2l2ZXMgbWUgc29tZSBsaWJyYXJpZXMgZm9yIGFuIEFu ZHJvaWQNCiAgICAgRW11bGF0b3IgKGhvc3QgQUJJKSBhbmQgYWxzbyBwcmVidWlsdCBsaWJyYXJp ZXMgZm9yIDQgQW5kcm9pZA0KICAgICBkZXZpY2UgQUJJczoNCg0KICAgICDilIzilIDilIDilIDi lIANCiAgICAg4pSCIERpcmVjdG9yeTogQzpcVXNlcnNceHh4XEFwcERhdGFcTG9jYWxcQW5kcm9p ZFxTZGtcbmRrXDIzLjEuNzc3OTYyMFxwcmVidWlsdA0KICAgICDilIIgDQogICAgIOKUgiBNb2Rl ICAgICAgICAgICAgICAgICBMYXN0V3JpdGVUaW1lICAgICAgICAgTGVuZ3RoIE5hbWUNCiAgICAg 4pSCIC0tLS0gICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0gICAgICAgICAtLS0tLS0gLS0t LQ0KICAgICDilIIgZC0tLS0tICAgICAgICAxMC8yMC8yMDIxICAgODoyNyBQTSAgICAgICAgICAg ICAgICBhbmRyb2lkLWFybQ0KICAgICDilIIgZC0tLS0tICAgICAgICAxMC8yMC8yMDIxICAgODoy NyBQTSAgICAgICAgICAgICAgICBhbmRyb2lkLWFybTY0DQogICAgIOKUgiBkLS0tLS0gICAgICAg IDEwLzIwLzIwMjEgICA4OjI3IFBNICAgICAgICAgICAgICAgIGFuZHJvaWQteDg2DQogICAgIOKU giBkLS0tLS0gICAgICAgIDEwLzIwLzIwMjEgICA4OjI2IFBNICAgICAgICAgICAgICAgIGFuZHJv aWQteDg2XzY0DQogICAgIOKUgiBkLS0tLS0gICAgICAgIDEwLzIwLzIwMjEgICA4OjI3IFBNICAg ICAgICAgICAgICAgIHdpbmRvd3MteDg2XzY0DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KICAzLiBU aGUgYENQX2NsaWJyYXJ5X0NDX0RFRkFVTFRfYWJpJyBjb25maWd1cmF0aW9uIHJlbGllcyBvbiBg YWJpJyAodGhlDQogICAgIG9jYW1sZmluZCB0b29sY2hhaW4gbmFtZSkgYmVpbmcgc3RhbmRhcmRp emVkLiBUaGUgYGdtcCcgbGlicmFyeSwNCiAgICAgZm9yIGV4YW1wbGUsIGlzIHVzZWQgYnkgbWFu eSBPQ2FtbCBwYWNrYWdlczsgSSB3YW50ZWQgb25lDQogICAgIGNvbmZpZ3VyYXRpb24gZm9yIGBn bXAnLCBub3Qgb25lIGNvbmZpZ3VyYXRpb24gZm9yIGVhY2ggYChnbXAsDQogICAgIE9DYW1sIHBh Y2thZ2UpJyBjb21iaW5hdGlvbi4gSW4gZmFjdCwgZ2V0dGluZyBhIGNvbnNpc3RlbnQgYGFiaScN CiAgICAgbmFtaW5nIHdhcyBvbmUgb2YgbXkgbW90aXZhdGlvbnMgZm9yIHJlbGVhc2luZyBgZGtt bC1jLXByb2JlJy4gSQ0KICAgICBkb24ndCB0aGluayB0aGUgcHJpb3IgYXJ0IGdvdCB0aGlzIHJp Z2h0IOKApiB0aGUgdmVyeSBzdGFsZQ0KICAgICBbb3BhbS1jcm9zcy1hbmRyb2lkXSBwcm9qZWN0 IHVzZXMgW2BhYmkgPSAiYW5kcm9pZCInXSB3aGljaCBpcw0KICAgICBpbnN1ZmZpY2llbnQgdG8g ZGlmZmVyZW50aWF0ZSB0aGUgNSsgc2V0cyBvZiBsaWJyYXJpZXMgYXZhaWxhYmxlIGluDQogICAg IEFuZHJvaWQgU3R1ZGlvLg0KICA0LiBUaGUgImdtcCIgKGV0Yy4pIGNvbmZpZ3VyYXRpb24gaXMg ZG9uZSBvbmNlIGluIGEgZmFtaWxpYXIgc3ludGF4DQogICAgIChgLUwsIC1JLCAtbCcpLiBIb3dl dmVyIHRoZSBgQ19jb25mJyBsaWJyYXJ5IHdpbGwgcGFyc2UgYW5kIHByaW50DQogICAgIHRoZSBj b25maWd1cmF0aW9uIGluIHRoZSBhcHByb3ByaWF0ZSBDIGNvbXBpbGVyIHN5bnRheC4gV2hlbiB0 aGUNCiAgICAgTVNWQyBjb21waWxlciBpcyB1c2VkIHlvdSBnZXQgTVNWQyBzdHlsZSBsaW5raW5n Og0KICAgICDilIzilIDilIDilIDilIANCiAgICAg4pSCIFsNCiAgICAg4pSCICAgIi1MSUJQQVRI Olo6L2J1aWxkL2Rhcndpbl94ODZfNjQvdmNwa2dfaW5zdGFsbGVkL3g2NC1vc3gvbGliIjsNCiAg ICAg4pSCICAgImdtcC5saWIiDQogICAgIOKUgiBdDQogICAgIOKUlOKUgOKUgOKUgOKUgA0KICAg ICBNU1ZDIGFuZCBHQ0MgY29udmVudGlvbnMgYXJlIHN1cHBvcnRlZCB0b2RheSBpbiBgQ19jb25m Jy4NCiAgNS4gQSByZWFsIGV4YW1wbGUgb2YgdXNpbmcgYENfY29uZicgaXMgaW4gbXkgY3VzdG9t aXphdGlvbiBvZiBbemFyaXRoDQogICAgIGxpYnJhcnldLiBJdCBjaGVja3MgYENfY29uZicgZmly c3QgdG8gc2VlIHdoZXRoZXIgdGhlIHVzZXIgaGFzIHRoZQ0KICAgICBob3N0L3RhcmdldCBBQkkg Y29uZmlndXJhdGlvbjsgaWYgaXQgZG9lc24ndCBpdCBmYWxscyBiYWNrIHRvDQogICAgIHBrZy1j b25maWcuDQoNCiAgVGhlIHRyZW5kIG9mIHVzaW5nIGBwa2ctY29uZmlnJyBpbiBPQ2FtbCBwYWNr YWdlcyBtYWtlcyBib3RoIG5hdGl2ZQ0KICBXaW5kb3dzIGFuZCBjcm9zcy1jb21waWxhdGlvbiBk aWZmaWN1bHQuIEF0IHRoZSBtb21lbnQgKndlDQogIHVuaW50ZW50aW9uYWxseSBzaG9vdCBvdXJz ZWx2ZXMgaW4gdGhlIGZvb3QqIGJlY2F1c2UgW0R1bmUNCiAgZG9jdW1lbnRhdGlvbiBlbmNvdXJh Z2VzIGBwa2ctY29uZmlnJ10gZm9yIHVuZGVyc3RhbmRhYmxlIHJlYXNvbnMuIEkNCiAgaG9wZSBg ZGttbC1jLXByb2JlJyBjYW4gYnJlYWsgdGhhdCB0cmVuZC4NCg0KDQpbaW1wbGVtZW50ZWQgYW5k IHBhcnRpYWxseSB0ZXN0ZWRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21sLWMtcHJv YmUvYmxvYi8yYzFlOTBiNGVlYTExOTM0OGQ2ZGFlMzdkNjQ5NDkwNDFlZjllYWViLy5naXRodWIv d29ya2Zsb3dzL3Rlc3QueW1sI0wyOTktTDM3OT4NCg0KW29wYW0tY3Jvc3MtYW5kcm9pZF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jcm9zcy9vcGFtLWNyb3NzLWFuZHJvaWQ+DQoNCltgYWJp ID0gImFuZHJvaWQiJ10NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtY3Jvc3Mvb3BhbS1jcm9z cy1hbmRyb2lkI3BvcnRpbmctcGFja2FnZXM+DQoNClt6YXJpdGggbGlicmFyeV0NCjxodHRwczov L2dpdGh1Yi5jb20vam9uYWhiZWNrZm9yZC9aYXJpdGgvYmxvYi9hMWJmNmQ1NWNkM2M0YjkxZGVl MGFmYjIzMDllZjExMjcxZTk3MjliL2Rpc2NvdmVyLm1sPg0KDQpbRHVuZSBkb2N1bWVudGF0aW9u IGVuY291cmFnZXMgYHBrZy1jb25maWcnXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9l bi9zdGFibGUvZHVuZS1saWJzLmh0bWwjY29uZmlndXJhdG9yLTE+DQoNCg0KSHRteC9oYyB3ZWIg ZGV2ZWxvcG1lbnQgYXBwcm9hY2gNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaHRteC1o Yy13ZWItZGV2ZWxvcG1lbnQtYXBwcm9hY2gvOTk5My8xMT4NCg0KDQpWbGFkaW1pciBLZWxlc2hl diBhbm5vdW5jZWQgYXNrZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEBjZW1lcmljaywgQHlhd2FyYW1pbiwgQGRidWVuemxpLCBhbmQgb3RoZXJzIHdo byd2ZSB1c2VkIGh0bXgvaGMgd2l0aA0KICBPQ2FtbCBiYWNrLWVuZDogd2hhdCBpcyB5b3VyIGV4 cGVyaWVuY2Ugd2l0aCB0ZW1wbGF0aW5nPyBJdCBzZWVtcyB0aGF0DQogIGh0bXgvaGMgcHV0cyBo aWdoIHJlcXVpcmVtZW50cyBvbiBhIGZsZXhpYmxlIEhUTUwgdGVtcGxhdGluZy9EU0wuIFdoYXQN CiAgZGlkIHlvdSBjaG9vc2UgYW5kIGlzIGl0IHdvcmtpbmcgb3V0IGZvciB5b3U/DQoNCg0KRGFu aWVsIELDvG56bGkgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHVzaW5nIE9DYW1sIGFuZCBhbiBh YnNvbHV0ZWx5IFt0cml2aWFsIEhUTUwgZ2VuZXJhdGlvbg0KICBsaWJyYXJ5XS4gSWYgeW91IHdh bnQgdG8gc2VlIGEgcmVhbCB3b3JsZCBleGFtcGxlIGhlYWQgdG8gdGhlDQogIGAqX2h0bWwue21s LG1saX0nIGZpbGVzIGluIFt0aGlzIGRpcmVjdG9yeV0gKG1vcmUgb24gdGhlIHN0cnVjdHVyZQ0K ICBmb3VuZCB0aGVyZSBbaGVyZV0pDQoNCiAgV29ya3MgcXVpdGUgd2VsbCBmb3IgbWUgYnV0IEkn ZCBzYXkgdGhlIHByb2JsZW0gaXMgbm90IHJlYWxseQ0KICB0ZW1wbGF0aW5nIGl0J3MgcmF0aGVy IG5vbi1icml0dGxlIFVSTCBtYW5hZ2VtZW50LiBGb3IgdGhhdCBJIHVzZQ0KICBbdGhpcyBtb2R1 bGVdIHdoaWNoIHdoaWxlIEknbSBub3QgZW50aXJlbHkgY29udmluY2VkIGJ5IGl0IHlldCwgYWxs b3dzDQogIG1lIHRvIHR5cGUgdGhlbSBhbmQgYXZvaWQgdGhlIHN0cmluZ2x5IHVuY2hlY2tlZCBk ZXBlbmRlbmRlbmNpZXMgc28NCiAgY2hhcmFjdGVyaXN0aWMgb2YgdGhlIHdlYiBkZXZlbG9wbWVu dCB3b3JsZC4NCg0KDQpbdHJpdmlhbCBIVE1MIGdlbmVyYXRpb24gbGlicmFyeV0NCjxodHRwczov L2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS93ZWJzL2RvYy9XZWJzX2h0bWwvaW5kZXguaHRtbD4NCg0K W3RoaXMgZGlyZWN0b3J5XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS9oeXBlcmJpYi90 cmVlL21hc3Rlci9zcmMvc2VydmljZT4NCg0KW2hlcmVdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Ri dWVuemxpL2h5cGVyYmliL2Jsb2IvbWFzdGVyL0RFVkVMLm1kI2NsaS10b29sLWFuZC1iYWNrZW5k Pg0KDQpbdGhpcyBtb2R1bGVdDQo8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvd2Vicy9k b2MvV2Vic19raXQvS3VybC9pbmRleC5odG1sPg0KDQoNCkNoYXMgRW1lcmljayBhbHNvIHJlcGxp ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFllYWgsIHlvdSdyZSByaWdodCBvbiB0aGF0IHBv aW50Lg0KDQogIEknbSB1c2luZyB0eXhtbCBmb3IgOTklIG9mIG15IEhUTUwgZ2VuZXJhdGlvbiwg c3BlY2lmaWNhbGx5IGl0cyBqc3gNCiAgcHB4LiBJIGFtIGp1ZGljaW91cyBhYm91dCBrZWVwaW5n IHRoZSBtYWluIGxvZ2ljcyBvZiB0aGUgcHJvamVjdCBpbg0KICBPQ2FtbCBwcm9wZXI7IGAucmUn IGZpbGVzIGV4aXN0IGV4Y2x1c2l2ZWx5IHRvIGhvbGQgbWFya3VwLiBUaGUgZW5kDQogIHJlc3Vs dCBpcyBhIF92ZXJ5XyBwbGVhc2FudCBlbnZpcm9ubWVudCBJTU8uIEluIHRoZSBlbmQsIEkgZGVh cmx5IHdpc2gNCiAgdGhlcmUgd2FzIGEgd2F5IHRvIGdldCBhY3R1YWwgSFRNTCBzeW50YXggaW50 byBgLm1sJyBmaWxlcyAoSSBhbSBubw0KICBmYW4gb2YgcmVhc29uIHN5bnRheCBvdXRzaWRlIG9m IGpzeCwgYW5kIEkgc3VzcGVjdCB0aGUgc29ydGEtbGVnYWN5DQogIGpzeCB0b29sY2hhaW4gbGVm dG92ZXIgZnJvbSByZWFzb25tbCB3aWxsIGVuZCB1cCBiZWluZyBhIHRlY2ggcmlzaw0KICBvdmVy IHRpbWUpLCBidXQgYXMgdGhpbmdzIHN0YW5kLCBpdCdzIHRoZSBiZXN0IG9wdGlvbiBJJ3ZlIGZv dW5kLg0KDQoNCllhd2FyIEFtaW4gYWxzbyByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20g anVzdCB1c2luZyBEcmVhbSdzICdidWlsdC1pbicgdGVtcGxhdGluZywgJ0VtYmVkZGVkIE1MICgu ZW1sKScsIGl0DQogIHdvcmtzIHJlYXNvbmFibHkgd2VsbOKAk2VhY2ggdGVtcGxhdGUgb3IgcGFy dGlhbCBpcyBqdXN0IGEgZnVuY3Rpb24gdGhhdA0KICB5b3UgZGVmaW5lIHRvIHRha2Ugc29tZSBh cmd1bWVudHMgYW5kIHJldHVybiBzb21lIG1hcmt1cC4gSXQgZXZlbg0KICBhdXRvLWVzY2FwZXMg dG8gcHJldmVudCBpbmplY3Rpb24gYXR0YWNrcy4gRS5nLiwNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIGxldCBjYXJkIG5hbWUgPQ0KICDilIIgICA8ZGl2IGNsYXNzPSJjYXJkIj48JXMgbmFt ZSAlPjwvZGl2Pg0KICDilJTilIDilIDilIDilIANCg0KICBUaGVyZSBhcmUgYSBjb3VwbGUgb2Yg dHJpY2tzIHRvIGJlIGF3YXJlIG9mIHdpdGggdGhlIEVNTCBzeW50YXggYnV0IGluDQogIGdlbmVy YWwgaXQgd29ya3Mgd2VsbC4NCg0KDQpTaW1vbiBDcnVhbmVzIGFsc28gcmVwbGllZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgRm9yIHRoZSBsaXR0bGUgd2ViZGV2IEkgZG8gKGludGVybmFs IHRvb2xzIG1vc3RseSBmb3IgbXlzZWxmKSwgSSd2ZQ0KICBhbHNvIGJlZW4gdXNpbmcgc2VydmVy IHNpZGUgaHRtbCBnZW5lcmF0aW9uLCB3aXRoIG15IG93biBgd2hlZWxzJw0KICB0b29scyBhbmQg YSBiaXQgb2YgaHRteC4NCg0KICBIZXJlJ3MgYW4gZXhjZXJwdCBmcm9tIGEgcGVyc29uYWwgcHJv amVjdCwgd2l0aCBteSBvd24gaHR0cGQgYW5kIGh0bWwNCiAgY29tYmluYXRvcnM7IGl0IGFkZHMg YSByb290IHRvIGhhbmRsZSBgL3RoeS88c29tZSBzdHJpbmc+JzoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIGxldCBoX3RoeSAoc2VsZjpzdGF0ZSkgOiB1bml0ID0NCiAg4pSCICAgSC5hZGRf cm91dGVfaGFuZGxlciBzZWxmLnNlcnZlcg0KICDilIIgICAgIEguUm91dGUuKGV4YWN0ICJ0aHki IEAvIHN0cmluZ191cmxlbmNvZGVkIEAvIHJldHVybikgQEAgZnVuIHRoeV9uYW1lIHJlcSAtPg0K ICDilIIgICBsZXRAICgpID0gdG9wX3dyYXBfIHJlcSBpbg0KICDilIIgICBsZXQgdGh5ID0gSWR4 LmZpbmRfdGh5IHNlbGYuc3QuaWR4IHRoeV9uYW1lIGluDQogIOKUgiAgIGxldCByZXMgPQ0KICDi lIIgICAgIGxldCBvcGVuIEh0bWwgaW4NCiAg4pSCICAgICBbDQogIOKUgiAgICAgICBkaXZbY2xz ICJjb250YWluZXIiXVsNCiAg4pSCIAloM1tdW3R4dGYgIlRoZW9yeSAlcyIgdGh5X25hbWVdOw0K ICDilIIgCVRoeV9maWxlLnRvX2h0bWwgdGh5Ow0KICDilIIgCWRpdiBbDQogIOKUgiAJICAiaHgt dHJpZ2dlciIsICJsb2FkIjsNCiAg4pSCIAkgICJoeC1nZXQiLCAoc3BmICIvZXZhbC8lcyIgQEAg SC5VdGlsLnBlcmNlbnRfZW5jb2RlIHRoeV9uYW1lKTsNCiAg4pSCIAkgICJoeC1zd2FwIiwgImlu bmVySHRtbCJdIFsNCiAg4pSCIAkgIHNwYW5bY2xzICJodG14LWluZGljYXRvciI7IEEuaWQgImlu ZCJdWw0KICDilIIgCSAgICB0eHQgIltldmFsdWF0aW5n4oCmXSI7DQogIOKUgiAJICBdDQogIOKU giAJXTsNCiAg4pSCICAgICAgIF0NCiAg4pSCICAgICBdDQogIOKUgiAgIGluDQogIOKUgiAgIHJl cGx5X3BhZ2UgfnRpdGxlOihzcGYgInRoZW9yeSAlcyIgdGh5X25hbWUpIHJlcSByZXMNCiAg4pSU 4pSA4pSA4pSA4pSADQoNCg0KRW5naW5lZXIgYW5kIHBvc3Rkb2MgcG9zaXRpb25zIGluIEZyYW5j ZSAodmFyaW91cyBsYWJzKSB0byB3b3JrIG9uIGEgcHJvb2YgYXNzaXN0YW50IGZvciBjcnlwdG8g cHJvdG9jb2xzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2VuZ2luZWVyLWFuZC1wb3N0ZG9jLXBvc2l0 aW9ucy1pbi1mcmFuY2UtdmFyaW91cy1sYWJzLXRvLXdvcmstb24tYS1wcm9vZi1hc3Npc3RhbnQt Zm9yLWNyeXB0by1wcm90b2NvbHMvOTk5OS8xPg0KDQoNCkRhdmlkIEJhZWxkZSBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFdlIGFyZSBsb29raW5nIGZvciBlbmdpbmVlcnMgYW5kIHBvc3Rkb2Nz IHRvIHdvcmsgb24gU3F1aXJyZWwsIGEgcHJvb2YNCiAgYXNzaXN0YW50IGRlZGljYXRlZCB0byBw cm92aW5nIGNyeXB0b2dyYXBoaWMgcHJvdG9jb2xzLiBXZSBoYXZlIGENCiAgYnJvYWQgcmFuZ2Ug b2YgcHJvamVjdHMgaW4gbWluZCwgcmFuZ2luZyBmcm9tIHB1cmUgT0NhbWwgZGV2ZWxvcG1lbnQN CiAgdG8gaW52b2x2ZWQgcHJvdG9jb2wgZm9ybWFsaXphdGlvbnMsIHdpdGggc2V2ZXJhbCB0aGVv cmV0aWNhbA0KICBxdWVzdGlvbnMgaW4gYmV0d2Vlbi4gSWYgeW91J2QgbGlrZSB0byB3b3JrIG9u IHNvbWUgb2YgdGhlc2UgYXNwZWN0cw0KICBmb3Igb25lIG9yIG1vcmUgeWVhcnMsIHBsZWFzZSBn ZXQgaW4gdG91Y2ggd2l0aCB1cyENCg0KICBNb3JlIGRldGFpbHMgY2FuIGJlIGZvdW5kIGhlcmU6 DQoNCiAgPGh0dHBzOi8vc3F1aXJyZWwtcHJvdmVyLmdpdGh1Yi5pby9wb3NpdGlvbnMucGRmPg0K DQoNCllvanNvbiAyLjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4teW9qc29uLTItMC0w LzEwMDAzLzE+DQoNCg0KTWFyZWsgS3ViaWNhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhp cyBGcmlkYXksIGl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIFlv anNvbg0KICAyLjAuMC4gWW91IGNhbiBnZXQgaXQgW2luIHlvdXIgbG9jYWwgT1BBTSByZXBvc2l0 b3J5XS4NCg0KICBLZXkgaGlnaGxpZ2h0cyBpbmNsdWRlOg0KDQogIOKAoiBGZXdlciBkZXBlbmRl bmNpZXM6IEdpdmVuIFlvanNvbiBpcyBhIGNvbW1vbiBkZXBlbmRlbmN5IHdlIGN1dCBkb3duDQog ICAgb24gaXRzIGRlcGVuZGVuY2llcyBzbyB5b3UgaGF2ZSB0byBpbnN0YWxsIGxlc3MgYW5kIGhh dmUgbGVzcw0KICAgIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzDQogIOKAoiBgU2VxJyBpbnRlcmZh Y2U6IFNpbmNlIE9DYW1sIDQuMTQgZGVwcmVjYXRlcyBgU3RyZWFtJyBhbmQgNS4wDQogICAgcmVt b3ZlcyBpdCwgdGhpcyB3YXMgYSBnb29kIHRpbWUgdG8gY2hhbmdlIHRvIHRoaXMgaW50ZXJmYWNl DQogIOKAoiBgQnVmZmVyJyBpbnRlcmZhY2U6IGNvbWluZyBhbG9uZyB3aXRoICMxLCB3ZSBjaGFu Z2VkIFlvanNvbiB0byB1c2UNCiAgICBgQnVmZmVyJyB3aGVyZXZlciBpdCB3YXMgdXNpbmcgYEJp bmlvdScgdHlwZXMgYmVmb3JlDQoNCiAgVGhhbmtzIHRvIGV2ZXJ5Ym9keSBpbnZvbHZlZCBpbiB0 aGlzIHJlbGVhc2UhDQoNCiAgSWYgWW9qc29uIHNvdW5kcyBsaWtlIGFuIGludGVyZXN0aW5nIHBy b2plY3QgZm9yIHlvdSB0byBjb250cmlidXRlLA0KICBbam9pbiB1c10uDQoNCiAgRnVsbCBjaGFu Z2Vsb2cgZm9sbG93czoNCg0KDQpbaW4geW91ciBsb2NhbCBPUEFNIHJlcG9zaXRvcnldDQo8aHR0 cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy95b2pzb24vPg0KDQpbam9pbiB1c10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkveW9qc29uPg0KDQoyLjAuMA0K4pWM4pWM4pWM 4pWM4pWMDQoNCiAgKjIwMjItMDYtMDIqDQoNCg0KUmVtb3ZlZA0K4pSE4pSE4pSE4pSE4pSE4pSE 4pSEDQoNCiAg4oCiIFJlbW92ZWQgZGVwZW5kZW5jeSBvbiBlYXN5LWZvcm1hdCBhbmQgcmVtb3Zl ZCBgcHJldHR5X2Zvcm1hdCcgZnJvbQ0KICAgIGBZb2pzb24nLCBgWW9qc29uLkJhc2ljJywgYFlv anNvbi5TYWZlJyBhbmQgYFlvanNvbi5SYXcnLiAoQGMtY3ViZSwNCiAgICAjOTApDQogIOKAoiBS ZW1vdmVkIGRlcGVuZGVuY3kgb24gYGJpbmlvdScsIHNpbXBsaWZ5aW5nIHRoZSBjaGFpbiBvZg0K ICAgIGRlcGVuZGVuY2llcy4gVGhpcyBjaGFuZ2VzIHNvbWUgQVBJczoNCiAgICDigKMgYEJpX291 dGJ1Zi50JyBpbiBzaWduYXR1cmVzIGlzIHJlcGxhY2VkIHdpdGggYEJ1ZmZlci50Jw0KICAgIOKA oyBgdG9fb3V0YnVmJyBiZWNvbWVzIGB0b19idWZmZXInIGFuZCBgc3RyZWFtX3RvX291dGJ1Zicg YmVjb21lcw0KICAgICAgYHN0cmVhbV90b19idWZmZXInDQogICAgKEBMZW9uaWRhcywgIzc0LCBh bmQgQGdhc2NoZSwgIzEzMikNCiAg4oCiIFJlbW92ZWQgYHlvanNvbi1iaW5pb3UnIGxpYnJhcnkN CiAg4oCiIFJlbW92ZWQgZGVwcmVjYXRlZCBganNvbicgdHlwZSBhbGlhc2luZyB0eXBlIGB0JyB3 aGljaCBoYXMgYmVlbg0KICAgIGF2YWlsYWJsZSBzaW5jZSAxLjYuMCAoQExlb25pZGFzLCAjMTAw KS4NCiAg4oCiIFJlbW92ZWQgYGpzb25fbWF4JyB0eXBlIChATGVvbmlkYXMsICMxMDMpDQogIOKA oiBSZW1vdmVkIGNvbnN0cmFpbnQgdGhhdCB0aGUgInJvb3QiIHZhbHVlIGJlaW5nIHJlbmRlcmVk ICh2aWEgZWl0aGVyDQogICAgYHByZXR0eV9wcmludCcgb3IgYHRvX3N0cmluZycpIG11c3QgYmUg YW4gb2JqZWN0IG9yDQogICAgYXJyYXkuIChAY2VtZXJpY2ssICMxMjEpDQogIOKAoiBSZW1vdmVk IGB2YWxpZGF0ZV9qc29uJyBhcyBpdCBvbmx5IG1hZGUgc2Vuc2UgaWYgdGhlIHR5cGUgd2FzIGNh bGxlZA0KICAgIGBqc29uJy4gIChATGVvbmlkYXMsICMxMzcpDQoNCg0KQWRkDQrilITilITilIQN Cg0KICDigKIgQWRkIGFuIG9wYW0gcGFja2FnZSBgeW9qc29uLWJlbmNoJyB0byBkZWFsIHdpdGgg YmVuY2htYXJrcw0KICAgIGRlcGVuZGVuY3kgKEB0bWNnaWxjaHJpc3QsICMxMTcpDQogIOKAoiBB ZGQgYSBiZW5jaG1hcmsgdG8ganVkZ2UgdGhlIHJlc3BlY3RpdmUgcGVyZm9ybWFuY2Ugb2YgcHJv dmlkaW5nIGENCiAgICBidWZmZXIgdnMgbGV0dGluZyBZb2pzb24gY3JlYXRlIGFuIGludGVybmFs ICgjMTM0LCBATGVvbmlkYXMpDQogIOKAoiBBZGQgYW4gb3B0aW9uYWwgYHN1Zicga2V5d29yZCBh cmd1bWVudCB3YXMgYWRkZWQgdG8gZnVuY3Rpb25zIHRoYXQNCiAgICB3cml0ZSBzZXJpYWxpemVk IEpTT04sIHRodXMgYWxsb3dpbmcgTkRKU09OIG91dHB1dC4gTW9zdCBmdW5jdGlvbnMNCiAgICBk ZWZhdWx0IHRvIG5vdCBhZGRpbmcgYW55IHN1ZmZpeCBleGNlcHQgZm9yIGB0b19maWxlJyAoIzEy NCwNCiAgICBAcGFuZ2xlc2QpIGFuZCBmdW5jdGlvbnMgd3JpdGluZyBzZXF1ZW5jZXMgb2YgdmFs dWVzIHdoZXJlIHRoZQ0KICAgIGRlZmF1bHQgaXMgYFxuJyAoIzEzNSwgQExlb25pZGFzKQ0KDQoN CkNoYW5nZQ0K4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAg4oCiIFRoZSBgc3RyZWFtX2Zyb21fKicg YW5kIGBzdHJlYW1fdG9fKicgZnVuY3Rpb25zIG5vdyB1c2UgYSBgU2VxLnQnDQogICAgaW5zdGVh ZCBvZiBhIGBTdHJlYW0udCcsIGFuZCB0aGV5IGFyZSByZW5hbWVkIGludG8gYHNlcV9mcm9tXyon IGFuZA0KICAgIGBzZXFfdG9fKicgKEBnYXNjaGUsICMxMzEpLg0KDQoNCkZpeA0K4pSE4pSE4pSE DQoNCiAg4oCiIEF2b2lkIGNvcHlpbmcgdW5uZWNlc3NhcmlseSBsYXJnZSBhbW91bnRzIG9mIHN0 cmluZ3Mgd2hlbiBwYXJzaW5nDQogICAgKCM4NSwgIzEwOCwgQExlb25pZGFzKQ0KICDigKIgRml4 IGBzdHJlYW1fdG9fZmlsZScgKCMxMzMsIEB0Y29vcG1hbiBhbmQgQGdhc2NoZSkNCg0KDQpvcGVu dGVsZW1ldHJ5IDAuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t b3BlbnRlbGVtZXRyeS0wLTIvMTAwMDUvMT4NCg0KDQpTaW1vbiBDcnVhbmVzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIHJlbGVh c2Ugb2YgW29jYW1sLW9wZW50ZWxlbWV0cnldDQogIDAuMi4gVGhpcyBsaWJyYXJ5IHByb3ZpZGVz IGEgY29yZSBpbnN0cnVtZW50YXRpb24gbGlicmFyeSwgYXMgd2VsbCBhcw0KICBleHBvcnRlcnMs IGZvciB0aGUgW29wZW50ZWxlbWV0cnldIHN0YW5kYXJkIGZvciBvYnNlcnZhYmlsaXR5OyBpdA0K ICBlbmNvbXBhc3NlcyBkaXN0cmlidXRlZCB0cmFjaW5nLCBtZXRyaWNzLCBhbmQgKG1vcmUgcmVj ZW50bHkpIGxvZw0KICBleHBvcnQuIEEgbG90IG9mIHRvb2xzIGFyZSBjb21wYXRpYmxlIHdpdGgg b3BlbnRlbGVtZXRyeSB0aGVzZSBkYXlzLA0KICBpbmNsdWRpbmcgR3JhZmFuYSwgRGF0YURvZywg amFlZ2VyLCBldGMuDQoNCiAgVGhpcyBpcyBzdGlsbCB2ZXJ5IGVhcmx5IGRheXMgZm9yIG9jYW1s LW9wZW50ZWxlbWV0cnksIGZlZWRiYWNrIGFuZA0KICBjb250cmlidXRpb25zIGFyZSB3ZWxjb21l Lg0KDQoNCltvY2FtbC1vcGVudGVsZW1ldHJ5XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9pbWFuZHJh LWFpL29jYW1sLW9wZW50ZWxlbWV0cnk+DQoNCltvcGVudGVsZW1ldHJ5XSA8aHR0cHM6Ly9vcGVu dGVsZW1ldHJ5LmlvLz4NCg0KDQpvbWFrZS0wLjEwLjUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5 bXBhL2FyYy9jYW1sLWxpc3QvMjAyMi0wNi9tc2cwMDAxMi5odG1sPg0KDQoNCkdlcmQgU3RvbHBt YW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBqdXN0IHJlbGVhc2VkIG9tYWtl LTAuMTAuNSwgdGhlIGJ1aWxkIHV0aWxpdHksIHdoaWNoIGZpeGVzIHRoZQ0KICBicm9rZW4gaW5z dGFsbGF0aW9uIG9mIHZlcnNpb24gMC4xMC40IGZyb20gbGFzdCB3ZWVrLg0KDQogIEZvciBkb2Nz IGFuZCB0aGUgZG93bmxvYWQgbGluayBzZWUNCiAgPGh0dHA6Ly9wcm9qZWN0cy5jYW1sY2l0eS5v cmcvcHJvamVjdHMvb21ha2UuaHRtbD4uIG9wYW0gaXMgdW5kZXJ3YXkuDQoNCg0KZmluZGxpYi0x LjkuNQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDIyLTA2 L21zZzAwMDEyLmh0bWw+DQoNCg0KR2VyZCBTdG9scG1hbm4gYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBmaW5kbGliLTEuOS41IGlzIG91dCwgZml4aW5nIHNvbWUgc2NyaXB0aW5nIGVy cm9ycyBpbiB0aGUgdmVyc2lvbg0KICAxLjkuNCBmcm9tIGxhc3Qgd2Vlay4NCg0KICBGb3IgbWFu dWFsLCBkb3dubG9hZCwgbWFudWFscywgZXRjLiBzZWUgaGVyZToNCg0KICA8aHR0cDovL3Byb2pl Y3RzLmNhbWxjaXR5Lm9yZy9wcm9qZWN0cy9maW5kbGliLmh0bWw+DQoNCiAgQW4gdXBkYXRlZCBP UEFNIHBhY2thZ2Ugd2lsbCBmb2xsb3cgc29vbi4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQg bWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10u DQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwg eW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Pg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoN CltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5m by9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 07 to 14, 2022.

    Lwt informal user survey

    Continuing this thread, Rapha=C3=ABl Proust said

    Thanks to everyone who took the time to answer the polls above. I've now cl= osed them.

    The first pull-request to come out of this poll is [https://github.com/ocsigen/lwt/pull/947](r= emoving support for OCaml<=3D4.07). This was the cutoff in the poll. It removes a lot of #if preprocessing statements and a few workarounds to stay compatible with old Stdlib interfaces. Thanks to @hanne= s for contributing most of the commits on this pull-request. If support for OCaml<=3D4.07 is important to you, please participate in = the pull-request's discussion or on this thread.

    Stay tuned for more. (But also be patient.)

    Tutorial: Full-Stack Web Dev in OCaml w/ Dream, Bonsai, and Gr= aphQL

    Continuing this thread, jerben asked and Daniel B=C3= =BCnzli replied

    Very interesting, did you write somewhere about how it compares to htmx?

    Not really.

    As far as I can remember I liked the ideas but found their execution to be = a bit lacking, sometimes ad-hoc in their attribute DSL, focusing more on the show off to convince single page applic= ation proponents of the approach than on a clear conceptual model (which hc tries to detail in the manual here).

    Two other things that come to mind are:

    1. AFAIR their examples relied a lot on unique id attributes = for targeting request results. Unless you find a principled and automated w= ay to generate these that's not compositional and brittle. In hc I = extended the CSS selector syntax to allow to address your ancestors (pe= ace be upon them). That's more compositional but now you become sensitive t= o structural changes in your markup =E2=80=93 pick your poison[^1].
    2. I'm no longer sure about that, i.e. don't take my word for it, but I th= ink their DSL allowed to spread the definition of an interaction among many= elements which made it more difficult to understand what is happening. In = hc all attributes defining the effects of an interaction are a= lways located on a single element, the element that performs the request.

    Finally when things go wrong I prefer to have to understand 700 lines of ml rather than 2800 lines of JavaScript (note that they likely have better legacy browser support and more functionality).

    In any case there's a long list of todos in hc and it likely n= eeds one or two more design rounds before getting to something decent =E2=80=93 if that's even remotely possible on the web.

    Dang it @dbuenzli one day you=E2=80=99ll run out of letters and need to com= e up with an actual name for your libraries.

    Mind you I tried to use three letters once, but the whole experience turned= out to be extremely unpleasant :=E2=80=93)

    [^1]: Using unique ids reifed in an OCaml EDSL could be a better idea.

    dkml-c-probe: Cross-compiler friendly definitions for C compil= ing

    jbeckford announced

    V3 is available. Its C_abi module has some big enhancements:

    • cleaner API (thanks @mseri!)
    • recognizes the BSD family: OpenBSD, FreeBSD, NetBSD and DragonFly on x8= 6_64 hardware
    • integration testing now includes OpenBSD, FreeBSD and one cross-compili= ng toolchain (macOS x86_64 host that targets arm64)

    V3 also has a new module C_conf which occupies the same proble= m space as findlib / ocamlfind and pkg-config:

    • Unlike findlib which is a specification+tool for 3rd party= OCaml libraries, C_conf is a specification+tool for foreign C= libraries
    • Unlike pkg-config which is a specification+tool for system= (host ABI) C libraries, C_conf is a specification+tool for th= e multiple ABIs that are present when you cross-compile OCaml or C code
    • Unlike pkg-config which is designed for Unix, C_conf= is designed for Windows and Unix where paths may have spaces, backs= lashes and colons
    • For now the specification is based on environment variables. If it prov= es useful the specification can be extended.

    Examples and doc links for V3 are available at https://git= hub.com/diskuv/dkml-c-probe#dkml-c-probe

    Marcello Seri asked and jbeckford replied

    Thanks a lot for the update! Can you say a bit more about how C_conf<= /code> works?

    C_conf has a detailed problem statement and spec at https://diskuv.github.io/dkml-c-probe/dkml-c-probe/Dkml_= c_probe/C_conf/index.html (which is linked to on the dkml-c-probe README).

    I probably shouldn't regurgitate the doc here, so I'll take a few key piece= s from the doc and then post some things here that I didn't put on that doc page …

    1. Here is my configuration for locating the "gmp" library on my Apple Silicon= host machine that cross-compiles to x86_64:

      CP_GMP_CC_DEFAULT                 =3D -IZ:/build/darwin_arm64/vcpkg_install=
      ed/arm64-osx/include
      CP_GMP_CC_DEFAULT_DARWIN_X86_64   =3D -IZ:/build/darwin_x86_64/vcpkg_instal=
      led/x64-osx/include
      CP_GMP_LINK_DEFAULT               =3D -LZ:/build/darwin_arm64/vcpkg_install=
      ed/arm64-osx/lib;-lgmp
      CP_GMP_LINK_DEFAULT_DARWIN_X86_64 =3D -LZ:/build/darwin_x86_64/vcpkg_instal=
      led/x64-osx/lib;-lgmp
      
      • The other direction may be more interesting, since the free GitHub Acti= ons only supports x86_64. The scenario of taking a macOS x86_64 GitHub host= and cross-compiling to Apple Silicon is implemented and partially tested.
    2. I am using a C package manager (vcpkg) to give me cross-compiled libraries = and the flags for the target ABI (in this case darwin_x86_64 is the target = ABI). In general it doesn't matter where you get your target ABI compatible= libraries from. Example: When I'm cross-compiling to Android on a Windows = x86_64 host, the Android Studio environment gives me some libraries for an = Android Emulator (host ABI) and also prebuilt libraries for 4 Android devic= e ABIs:

      Directory: C:\Users\xxx\AppData\Local\Android\Sdk\ndk\23.1.7779620\prebuilt
      
      Mode                 LastWriteTime         Length Name
      ----                 -------------         ------ ----
      d-----        10/20/2021   8:27 PM                android-arm
      d-----        10/20/2021   8:27 PM                android-arm64
      d-----        10/20/2021   8:27 PM                android-x86
      d-----        10/20/2021   8:26 PM                android-x86_64
      d-----        10/20/2021   8:27 PM                windows-x86_64
      
    3. The CP_clibrary_CC_DEFAULT_abi configuration relies on abi (the ocamlfind toolchain name) being standardized. The = gmp library, for example, is used by many OCaml packages; I wanted o= ne configuration for gmp, not one configuration for each (gmp, OCaml package) combination. In fact, getting a consistent abi naming was one of my motivations for releasing dkml-c-p= robe. I don't think the prior art got this right … the very s= tale opam-cro= ss-android project uses abi =3D "android" which is= insufficient to differentiate the 5+ sets of libraries available in Androi= d Studio.
    4. The "gmp" (etc.) configuration is done once in a familiar syntax (-L,= -I, -l). However the C_conf library will parse and pri= nt the configuration in the appropriate C compiler syntax. When the MSVC co= mpiler is used you get MSVC style linking:

      [
        "-LIBPATH:Z:/build/darwin_x86_64/vcpkg_in=
      stalled/x64-osx/lib";
        "gmp.lib"
      ]
      

      MSVC and GCC conventions are supported today in C_conf.

    5. A real example of using C_conf is in my customization of <= a href=3D"https://github.com/jonahbeckford/Zarith/blob/a1bf6d55cd3c4b91dee0= afb2309ef11271e9729b/discover.ml">zarith library. It checks C_con= f first to see whether the user has the host/target ABI configuratio= n; if it doesn't it falls back to pkg-config.

    The trend of using pkg-config in OCaml packages makes both nat= ive Windows and cross-compilation difficult. At the moment we unintentio= nally shoot ourselves in the foot because Dune documentation encou= rages pkg-config for understandable reasons. I hope = dkml-c-probe can break that trend.

    Htmx/hc web development approach

    Vladimir Keleshev announced asked

    @cemerick, @yawaramin, @dbuenzli, and others who've used htmx/hc with OCaml= back-end: what is your experience with templating? It seems that htmx/hc puts high requirements on a flexible HTML= templating/DSL. What did you choose and is it working out for you?

    Daniel B=C3=BCnzli replied

    I'm using OCaml and an absolutely trivial HTML generation library. If you want to see a real world example head to the *_html.{ml,mli} files in this directory (more on the structure found there here)

    Works quite well for me but I'd say the problem is not really templating it= 's rather non-brittle URL management. For that I use this module which while I'm not entirely convinced by it yet, allows me to type them and avoid the stringly= unchecked dependendencies so characteristic of the web development world.

    Chas Emerick also replied

    Yeah, you're right on that point.

    I'm using tyxml for 99% of my HTML generation, specifically its jsx ppx. I = am judicious about keeping the main logics of the project in OCaml proper; .re files exist exclusively to= hold markup. The end result is a very ple= asant environment IMO. In the end, I dearly wish there was a way to get actual HT= ML syntax into .ml files (I am no fan of reason syntax outside of jsx, and I suspect the sorta-legacy jsx toolchain = leftover from reasonml will end up being a tech risk over time), but as things stand, it's the best option I've found.

    Yawar Amin also replied

    I'm just using Dream's 'built-in' templating, 'Embedded ML (.eml)', it work= s reasonably well–each template or partial is just a function that you define to take some arguments and retur= n some markup. It even auto-escapes to prevent injection attacks. E.g.,

    let card name =3D
      <div class=3D"card"><%s name %></div>
    

    There are a couple of tricks to be aware of with the EML syntax but in gene= ral it works well.

    Simon Cruanes also replied

    For the little webdev I do (internal tools mostly for myself), I've also be= en using server side html generation, with my own wheels tools and a bit of htmx.

    Here's an excerpt from a personal project, with my own httpd and html combi= nators; it adds a root to handle /thy/<some string>:

    let h_thy (self:state) : unit =3D
      H.add_route_handler self.server
        H.Route.(exact "thy" @/ strin=
    g_urlencoded @/ return) @@ fun <=
    span style=3D"color: #a0522d;">thy_name req ->
      let@ () =3D top=
    _wrap_ req in
      let thy =3D Idx.find_thy self.st.idx thy_name in
      let res =3D
        let open Html i=
    n
        [
          div[cls "container"][
            h3[][txtf "Theory %s" thy_name];
            Thy_file.to_html thy;
            div [
              "hx-trigger", "load";
              "hx-get", (spf "/eval/%s" @@ H.Util.percent_encode thy_name=
    );
              "hx-swap", "innerHtml"] [
              span[cls "htmx-indicator";=
     A.id ][
                txt "[evaluating…]";
              ]
            ];
          ]
        ]
      in
      reply_page ~title:(spf "theory %s" thy_name) req res
    

    Yojson 2.0.0

    Marek Kubica announced

    This Friday, it is my pleasure to announce the release of Yojson 2.0.0. You= can get it in your loc= al OPAM repository.

    Key highlights include:

    • Fewer dependencies: Given Yojson is a common dependency we cut down on = its dependencies so you have to install less and have less transitive depen= dencies
    • Seq interface: Since OCaml 4.14 deprecates Stream and 5.0 removes it, this was a good time to change to this interface
    • Buffer interface: coming along with #1, we changed Yojson = to use Buffer wherever it was using Biniou types = before

    Thanks to everybody involved in this release!

    If Yojson sounds like an interesting project for you to contribute, join us.

    Full changelog follows:

    2.0.0

    2022-06-02

    Removed
    • Removed dependency on easy-format and removed pretty_format from Yojson, Yojson.Basic, Yojson.Safe an= d Yojson.Raw. (@c-cube, #90)
    • Removed dependency on biniou, simplifying the chain of depende= ncies. This changes some APIs:

      • Bi_outbuf.t in signatures is replaced with Buffer.t<= /code>
      • to_outbuf becomes to_buffer and stream_= to_outbuf becomes stream_to_buffer

      (@Leonidas, #74, and @gasche, #132)

    • Removed yojson-biniou library
    • Removed deprecated json type aliasing type t = which has been available since 1.6.0 (@Leonidas, #100).
    • Removed json_max type (@Leonidas, #103)
    • Removed constraint that the "root" value being rendered (via either pretty_print or to_string) must be an object or a= rray. (@cemerick, #121)
    • Removed validate_json as it only made sense if the type wa= s called json. (@Leonidas, #137)
    Add
    • Add an opam package yojson-bench to deal with benchmarks d= ependency (@tmcgilchrist, #117)
    • Add a benchmark to judge the respective performance of providing a buff= er vs letting Yojson create an internal (#134, @Leonidas)
    • Add an optional suf keyword argument was added to function= s that write serialized JSON, thus allowing NDJSON output. Most functions default to not adding any suffix except for to_file (#124, @panglesd) and fun= ctions writing sequences of values where the default is \n (#135, @Leonidas)
    Change
    • The stream_from_* and stream_to_* functions n= ow use a Seq.t instead of a Stream.t, and they are renamed into seq_from_* an= d seq_to_* (@gasche, #131).
    Fix
    • Avoid copying unnecessarily large amounts of strings when parsing (#85,= #108, @Leonidas)
    • Fix stream_to_file (#133, @tcoopman and @gasche)

    opentelemetry 0.2

    Simon Cruanes announced

    It is my pleasure to announce the release of ocaml-opentelemetry 0.2. This library provides a core instrumentation library, as well as expor= ters, for the opentelemetry standard for observ= ability; it encompasses distributed tracing, metrics, and (more recently) log export. A lot of tools are compatible with opentele= metry these days, including Grafana, DataDog, jaeger, etc.

    This is still very early days for ocaml-opentelemetry, feedback and contrib= utions are welcome.

    omake-0.10.5

    Gerd Stolpmann announced

    I just released omake-0.10.5, the build utility, which fixes the broken installation of version 0.10.4 from last week.

    For docs and the download link see http://project= s.camlcity.org/projects/omake.html. opam is underway.

    findlib-1.9.5

    Gerd Stolpmann announced

    findlib-1.9.5 is out, fixing some scripting errors in the version 1.9.4 from last week.

    For manual, download, manuals, etc. see here:

    http://proje= cts.camlcity.org/projects/findlib.html

    An updated OPAM package will follow soon.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 14BD8E0094 for ; Tue, 21 Jun 2022 10:06:56 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=5eoO=W4=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: m+NhxLaH8B/+o6Fo0GXgQ0p5D39OF9hdDZ/pcwDF5v2rrS1Z2l2dKG2FKAR1TMHMD75Y1lxDVG 8g6OUAEV4zFSJWI+8nnkjZd5fJFqhYEThYCukdwkyhNV7wF5Gm4sbG4TWV6w+NYIL10dq1xJFp nkwpGaf275V1GzSgwAwBJM/LbVkiK3Daact6OuXX6rujiTGSja5Oi8zs8UHLREBMkbhtjaGe1q h22XPcubsHRNM+S9+LtP6HuHcDz+PuBNvLV7ToxPH6BDkoLUnW4ws+7F/Q4KRlFH68z1U5CNOu 87Dx0WsGFvFYhuzB3CL553nH X-IPAS-Result: =?us-ascii?q?A0DjAgDPe7FimCIeaIFaFn+CZIEDGQFnVi4HCESEET2BY?= =?us-ascii?q?4cdiAyDK4Ymhn6NRANPEAEDAQ0sAQ4EAQIEAQGDTYIHCYRxAh4GAQUzEwECB?= =?us-ascii?q?AEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgQEARMBAQEBAQEBAQkLCQcGDAUQD?= =?us-ascii?q?gU8ZGQEgUsEgXQLNA2CNQwMAwMBg3MDAQoOCQo6AQMnIwMUAQYDAhEBFwEeF?= =?us-ascii?q?wESFAaCYwGDGAMFCpBRnBSBMYEBg08BFQMBDgkmg3OBZSSBGYYgXkoBgw8Jg?= =?us-ascii?q?RqCeAInEIFVRIItgWJugVABcwcXAQEBAQEXgQMhAQGDdoJlBIMXljgHOANHN?= =?us-ascii?q?BKBIXEBCAYGBwoFMgYCDBgUBAITEk0GHQISDAoGFg5CEhkMDwMSAxEBBwILE?= =?us-ascii?q?ggVLAgDAgMIAwIDLgIDFwkHCgMdCAocEhAUAgQTHgsIAxkfLAkCBA4DRQgLC?= =?us-ascii?q?gMRBAMTGAsWCBAEBgMJLw0oCwMFDw0BBgMGAgUFAQMgAxQDBScHAyEHCyYND?= =?us-ascii?q?QQjHQMDBSYDAgIbBwICAwIGFwYCAhhWCiYNCAQIBBgEHSQQBQIHMQUELwIeB?= =?us-ascii?q?AUGEQkCFgIGBAUCBAQWAgISCAIIJxsHFjYZAQVdBgsJIRYGKREFBhYDI0onB?= =?us-ascii?q?UgPKTU2PC8hGwqBDRYsCSQhBiKWCBwdhCUcDiAeSzQLBgcDDgMOAQEEHjY4C?= =?us-ascii?q?xkHEgQXGx0SCwsGKZITESeYT4JhkVZ8NAeDUYE+BgyHcTyBIoc7gw+COIgjg?= =?us-ascii?q?3WBUIpzkTSGdyGWTQgYgiuGf4ESCQeBfEZKlAMEKoUNgU4qgWsMBzMaMEOCa?= =?us-ascii?q?AlFAQMCDQECAgMBAgECCQEBAlSNIQEFLhaDUIE+IoEEgXU7B4EmgzdoPzQBA?= =?us-ascii?q?QEBNwIGAQoBAQMJhWMBAQUTCwGGMCyBPl4BAQ?= IronPort-PHdr: A9a23:y+F/PBw5iLSYdB7XCzL1xFBlVkEcU1XcAAcZ59Idhq5Udez7ptK+Z heZvK43xwaTBs3y0LFts6LuqafuWGgNs96qkUspV9hybSIDktgchAc6AcSIWgXRJf/uaDEmT owZDAc2t360PlJIF8ngelbcvmO97SIIGhX4KAF5Ovn5FpTdgsip2e2+4YDfbgtWiDayfL9+M hu7phjNu8cLhodvNrw/wQbTrHtSfORWy2JoJVaNkBv5+8y94p1t/TlOtvw478JPXrn0cKo+T bxDETQpKHs169HxtRnCVgSA+H0RWXgLnxVSAgjF6Bb6Xortsib/q+Fw1jWWMdHwQLspXjus8 rprSATwiCgZKzE57G/Zist1jK1BoRKhoQF0z4rbbYyRMfZzeKPRc9AcRWpfX8ZRTC1BDZi4b 4QREuEAM+FYr5PgqFsVsBCyAQehCP/qxjJOiHD2x6k62Pk/Hw/A0gIrAtYCvXbRoNjzKawcU /26zLPQwDvDcf1YxDnz5ovHfR89uvyDR658fNDLxEUzCw/IjFOdopHlMTOP0eQNtnCW4vZkV e21jW4sthx/rSSvxscpi4nJmp4VwU3D+CpjxIY6P9u4RFRgYdG4EJtQsiCaN5dqQs45W2Fov yI6y70auZGlYCcKyJInxx/Ga/yabYeE+BXjVPyeITphgn9uZb2wiQqo/0e61u38Ste70ExMr iddkdTAq2wB2gHR58SZRPZw40Ss1DWR2g7T6u9JPEQ5mKTFJpMlzLA9lIQfvErMEyL5l0j7j 6GYeEo59+S29ujqbbPrrYKSOY9zjwHxKKUumsqnDOQgLAcOQ2mb+fii2737+k35RbBKgeMsn qnfrp/aOdwXpqmlDABP14Yj7wyzDzC80NQXhXUHN1FFeBODj4jtIFHOJer3Deujg1uyijdn3 ezJPrrkApnVIXjDkavhfbZg60FH0gYzzNdf64pJBbEAO/L8RkjxtMbFARMjPAy0zP7rCNR71 oMEWGKAGLWVMK3IsVOQ4+IgPfOMZI4auDb6Nvgk6OTijXgnmV8dZaWp0poXaGy4HvR7OEqVe 2bjgtAEEWsSvwo+VPblhESYUTFNfXm9Qrwz5ishBIOpDYbCR5ihgLqG3Ce+BJJZe2FGBUyVH XfsbYqLQOwMZDiOLc9mlzwITbehS4491RGqrgD10KBrLuvT+iEAupLj1cR15+nJmh4p7zB7E 8Od02SVQ2FzgmwHXTo23KRlrUBnzVeDy6d4j+RZFdNO5/JJVgM6OYTbz+xgBND/XB/KcNSRS Fu+X9mqHzU8Qsgsz9MSbEtxAduvggzZ0yekDLIZj6GHCZIp/q7GwXT8J8lwx2zb2KU9lVUqX 8lCOXGgi6Vi7QbcHZTJnF+cl6uydaQTwirN9GCbwGqLs0BUTRR8Ub3CXXAbZkrWscr26V/CT 7+oCLQnKxZBxtCYJqtNcN3pgk1KRPblONvAf2K8g3q8CQiMy7+WcYbmZ2oQ0D/TBUQYiQwe8 3mLORA7Bii7omLeCDJuFUjoY0Pp6eRwtW+1QFIowwySb0Buyb219AcNiPOcRP4exqoEuCAlq zR0AFaywc7ZC9qGpwpgZaVcfM0y7E1A1WLDuAxwJoavL6R4iV4YaQh3pF/h1xVyCoVBjcgqs GgnwxF1KaKF1lNOay2X3YvqNr3SJWTz8wqja6nM2lHRyNqW/LwA5+wiq1r/pAGpClYi83J/3 tVIy3ec/InFDBIOUZLtVUY67wR1qKvfYik5/o/U0XxsMbKosjLZwNIoBO4lyg66cNtFMaOEE hXyE8wACMS0JuwqgQvhUhVRduRN8uR8a8e5cdOCx6jtOut8ynbux29Y5so1mhaH6CxUTu/Tw 41Dwv2J2g/BUC3z2hPpucnyncVAZCoONmu50yntQoBLNYNoeoNeIGOnJYWMzdV7hoLxEypR8 FelQUgN2MqoZQa6d1v5zBFd3kQRoGW6lG2/1TMiwGJhlbaWwCGbm7eqTxEAIGMeFDcKZTbEJ IG1i4tfR020d00ykwPj40/mxq9draA5Lm/JQE4OcTKlZ3p6XP6Iv6GZK9VK9ItuqT9eBe24a FbcUbX9phoGzwv7GG9P2D0wdzero4j02RtghzHVN259+ULQYto43hLD/JrZTP9V0CABQXxDs wKPUwWxOP78wonBj5DHo/yzXGKnV4ROfG/s14zVvS+y4ytxCh26nuyvstfgDA4x3DS90oV6E yLSo0W0eZHlgpyzKvkvZUx0HBn85s59T5l5iZc1jYoM1GIyg4XMu2IAlXbvPN5b36PncXdLQ iQEqzLMyDDsw1YrbneAxoaiE26Y3tMkfN6iJGUfxiM66clOTqaS9r1N2yVv8BK0qgfYYP41m Tl4q7Nm4XoThacSswoozzmBKqgVGVhEMCfskRWR8t34q79YLGqiarm/0kNikMvpVevT5FgEB DCiItF5QWd59aAdeBrU3Wf26534ddWYdt8VuhCO0l/Bg+VTNJMth68SnyM0cWn5vHAj16s6l Uk3h8D85dDbbT41uvnlUXs6fnXvasge+y/gl/Nbl8eShMW0G4l5Xy4MRN3uRO6pFzQbsbLmM RyPGXsysCT+e/KXEAmB5UNht3+KHYqsMiTdH0MilYA/SR66cXMD1RgTWCQmk5U5EAGz2cGnd 112szkV71i+sRBMz+N0KzH1VXrZrwqzLDJoWN6YNhUcvWQgrw/FdNeT6O5+BXQS95moqkqWI WyeZhhUJXkOXl2YClvjOLi3+NSG9PKXTLnbTbOGcfCFrupQUO2NzJSk3959/jqCAc6IO2FrE /wx3kcQFWA8AcnSnC8DDjAGjy+YJdWDqk36omcky6L3uOSuQg/k4pGDTqdfIck6sQuuj/3Fb 6mIni89LDhC0ZZEhnaazahGmkYVjzByejKtF7UZqCOLS7jf/80fR10SOSZjbo1Q6KYtwgRGO cjak874kLligbZ2AgVARQengsatdNAHKGG7NUraCQCMLrvjR3WDgMDvP/HmEeUJ3rkNu0Xi4 GTKT0PubGbczGflBU/zbrkEySifOFY2VJiVSh92EiCjSdvnbkb+K9prlXgtxqVygHrWNGkaO Dw6ckVXr7TW4zkKyvl4HmVA6DJiI4zm026i1dKAf8sbttw+PXghj+Ve8Wg3wLtT7ThZSbpyg iSHp9pnpRe9memKyyZ7eBBJtzBAiZnNuBlyf6LD+fwiET7I8QkM4mOZFxkR74I/W5u24/wWk YCJz/67ISwK69/O+MoAG8XYYNmKNnYsK1uMenacDQcISyKqKXCKgkVclP+I8XjG5pM+q5Xqh N8PUuoCDg1zT6tGTB89Wodec/IVFns+nLWWjdAF/y+7pRjVH4BBu4zfE+mVGbPpISqYir9NY 10Jx6n5JMIdLN6euQQqZ19kkYDNA0eVU8pKp3grVTUP+BAQ/X9ZG1JvjlribhKx7XQTE/+tg xNwjRFxNO0p/TGq+Fw3I1vWuAM6l1Q3ktj+xzXNYHj2Nqj6DuQ0Q2Lk8lM8NJ/2WVM/VjeJx Rk5OTDjEo0N2qNncXF3hQTcv5pWBPMaSrdLNRYUzPfRfP4o1FVAtg2twlJB7ubeT54+hE0ta 5Hm/Bcik0pzKdUyI6LXPq9AyFNd07mPsiGf3ec02AYCJkwJ/TDaaGsStUcPLLVjOzuw87km8 hSMwX0bMjtpNbJisrdw+0g6IejF0y/wz+sJMVi/barHaLuDsizFm9SPRxtz3xENhxAD5b9yw NsueEqSVlkywf2WDRtsV4KKaggHatoIsmDUeTeSvO7Nx5NsIoj7EfrnBayH5qME2QS8GwI4A 4kH7sIAB4ShlkbCIqKFZPZGyA1ztl6zfAzXUK1FIEDSwmZbr8ztnsAsg4UPeW1CWS04OCGzr N47vycSieGYFJcza3YeBc4fM24uHda9g2hftmhBCz++1qQYzhKD5nnyvHaYAD75ZttlLPCaA HEkQMmx4ik6+rOqhET/94WHYXn9McV+t9TP7+IDupvBDOlbBbVwqEbTnYBESmfiCjSeV4fte 96rM893MZT9ERPYGhSnhigwTtvtMdrlNaWOjQzyBM5VvISdwDE/JJq9GzUZSF97o+AO4r45Z BVWOsBqJ0ew60Jlb+rkfFT9sJ3mWWumJDpIQuMKyOy7Y+cS1C8wdqqhz2NmSJgmzu6x+EpLR ZcQjxiYy+zwAusWGSX1BHFZfB3C4CQjkG00fN0I+b9qnR7Plgwjb2WTc+h4dGFPv9c9HE6fZ 3JsBT8xQ1aay5HI4gutw6w69SxAmd1ZyqtA7Gi4uYXQKmHJOuTjudDOviwsYMJz6bV2KpDmK 9CauYn2myyGCoHXthyZXSW6EftDh9UWJzhXCqot+yltKYkNvoxP7lA0X8E1KulUCaUikbutb CJtES8YySJKH5PFxjEJhf2wnqfLjhrFOop3KwQK6d8R57lVGz4zeC4Vo7WvEpnbh3PRAHZeO x8dtExFrEcJkos6FggKyIDPUZlHxiUQpq5kFCzRGcsxn7MaYmSG2B7gT/Gwj+Gi3QRT1e/hl N4BV0wmYaC47/5Rklo0Jbp3LagJo4OMtSWHJxqSgQ== IronPort-Data: A9a23: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 m8cSt5aLlGtuA== IronPort-HdrOrdr: A9a23:gU+2D6wofCnd/MrGEMIwKrPwK71zdoMgy1knxilNoH1uEvBw+P rAoB1273XJYVUqOU3I++rvBEDoexq1nqKdirN8AV7NZmTbkVrtBL4nx4rvyT/tFkTFh41g/J YlVbNxTPn5DV0St7ee3OBUKadD/OW6 X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.92,209,1650924000"; d="scan'208,217";a="17355175" X-MGA-submission: =?us-ascii?q?MDG4320apt3vbRD5kni08mP1r8QM1QEmlt4lVb?= =?us-ascii?q?qyO1VHE0lhoIrZUv4biuqio72WP+fGok6pzmI1TrrpZNQQzqc9asQtyM?= =?us-ascii?q?b/6DqswMSL6GwlcY5Q00gUoh0y20SVzI3fFZfX+bf415RbRjvQiyhVpE?= =?us-ascii?q?GsO6/ujlXGKnO4bPkVenLuKg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jun 2022 10:06:53 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id DF27C564837; Tue, 21 Jun 2022 10:06:50 +0200 (CEST) From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 21 Jun 2022 10:06:34 +0200 Message-ID: <87v8suwid1.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 21 10:06:51 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.073900, queueID=68F5E564A06 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 14 to 21, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OBazl Toolsuite - tools for building OCaml with Bazel Job offer: 3 years compiler engineer at the French tax authority OCaml 5.0, zeroth alpha release Tezt, a framework for all your tests OCaml Stdlib, Containers, Batteries, Base and F# core functions comparisons Dune 3.3.0 Old CWN OBazl Toolsuite - tools for building OCaml with Bazel =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Gregg Reynolds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Version 2 of OBazl, a Bazel ruleset for building OCaml code, will soon be available. I'm letting you know early because I'll be giving a presentation about the OBazl Toolsuite for the [Bazel Exchange] conference next Wed, 22 June, at 3:00 pm UDT (10:00 am CDT). It's a virtual conference so you can tune in from anywhere. The talk will focus on some of the quirks of the OCaml build discipline and how I addressed them for the OBazl ruleset. The tools are usable now, they're just not yet properly documented and packaged, and in a few places there's a little more work to be done on the code. Nonetheless there is quite a bit of documentation (CAVEAT: some of it is outdated), with more on the way soon, and there are lots of demos available. So if you're interested in using Bazel to build your OCaml code I welcome you to take a look: [The OBazl Book] Twitter handle is @obazldev Discord: [https://discord.gg/PHSAW5DUva] [Bazel Exchange] [The OBazl Book] [https://discord.gg/PHSAW5DUva] Gregg Reynolds lated added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 PS. The conference organizers have provided this discount token: BAZEL-GR-20 It should be good for 20% off, registration is at [https://events.skillsmatter.com/bazelx2022] [https://events.skillsmatter.com/bazelx2022] Job offer: 3 years compiler engineer at the French tax authority =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Denis Merigoux announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [En fran=C3=A7ais parce que c'est une offre d'emploi dans l'administratio= n] Bonjour =C3=A0 toutes et =C3=A0 tous, Vous aimez la programmation fonctionnelle et les compilateurs ? Vous en avez marre des offres d'emploi dans la blockchain ? =C3=87a tombe bien, j'ai ce qu'il vous faut ! Il y a deux ans, j'ai lanc=C3=A9 un grand projet de modernisation du calc= ul informatique de calcul de l'imp=C3=B4t sur le revenu =C3=A0 la Direction G=C3=A9n=C3=A9rale des Finances Publiques (DGFiP), en partenariat avec In= ria: . Le logiciel au c=C5=93ur de ce projet de modernisation est Mlang, un compilateur =C3=A9crit en OCaml pour un couple de langages d=C3=A9di=C3= =A9s utilis=C3=A9s par la DGFiP pour encoder le calcul de l'imp=C3=B4t sur le revenu. Depuis deux ans, la DGFiP travaille =C3=A0 int=C3=A9grer Mlang =C3=A0 l'infrastr= ucture officielle de calcul de l'imp=C3=B4t sur le revenu pour remplacer des syst=C3=A8mes vieillissants. C'est donc un projet =C3=A0 tr=C3=A8s fort i= mpact (80M=E2=82=AC par d'imp=C3=B4ts par an), et proche de la R&D (OCaml, libre, innovation)= ! Depuis un an, la DGFiP emploie la soci=C3=A9t=C3=A9 OCamlPro sur le proje= t mais souhaite maintenant r=C3=A9-internaliser ses comp=C3=A9tences pour garder= la souverainet=C3=A9 num=C3=A9rique sur son infrastructure de calcul. C'est l=C3=A0 que cette offre d'emploi entre en jeu ! En effet la DGFiP vient d'ouvrir un poste en CDD de 3 ans pour un.e expert.e en compilation ! Les d=C3=A9tails : =E2=80=A2 Bureaux =C3=A0 Noisy-le-Grand (+ jusqu'=C3=A0 3 jours t=C3=A9l= =C3=A9travail/semaine) =E2=80=A2 Salaire: =C3=80 n=C3=A9gocier selon exp=C3=A9rience mais simila= ire =C3=A0 "Inspecteur des finances publiques". Selon le site du minist=C3=A8re de l'=C3=A9con= omie =C3=A7a d=C3=A9buterait =C3=A0 3k=E2=82=AC net/mois. =E2=80=A2 T=C3=A2ches: Maintenance, =C3=A9volution de Mlang et travaux an= nexes Et pour l'heureux.se recrut=C3=A9.e, la cerise sur le g=C3=A2teau sera de pouvoir collaborer avec moi et l'=C3=A9quipe Prosecco d'Inria (ainsi que Rapha=C3=ABl Monat, ) :) Attention cependant : il faudra s'attendre =C3=A0 devoir =C3=A9galement aider l'=C3=A9quipe de la DGFiP sur d'autres chanti= ers en fonction des priorit=C3=A9s. De m=C3=AAme, l'objectif est de partager la comp=C3=A9tence en compilation au sein de la DGFiP, donc les profils =C3=A9vang=C3=A9lisateurs de la programmation fonctionnelle sont les bien= venus ! Pour r=C3=A9f=C3=A9rence, voici l'offre officielle compl=C3=A8te: . S'il vous pla=C3=AEt, pas d'autocensure =C3=A0 cause de ce qui est marqu=C3=A9 dans ce PDF! Si vous= avez un doute contactez-moi par retour de mail. Deadline pour les candidatures: 9 juillet. Prise de poste inconnue, s=C3=BBrement aux alentours du 1er septembre mais j'imagine que c'est n=C3=A9gociable. Denis Merigoux later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Si vous =C3=AAtes int=C3=A9ress=C3=A9.e, envoyez votre CV et lettre de mo= tivation =C3=A0 bureau.si-part-rh@dgfip.finances.gouv.fr et bureau.rh-mobilite-carriere-a-recrutementchoix@dgfip.finances.gouv.fr. OCaml 5.0, zeroth alpha release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Five months after the initial merge of the multicore branch into the mainline OCaml and three months after the release of OCaml 4.14.0, OCaml 5.0.0 is starting to take shape. I am thus happy to announce an exceptional zeroth alpha release of OCaml 5.0.0 (see below for the installation instructions). This alpha release is expected to be rougher than an usual alpha release, due to the full rewrite of the OCaml runtime. In particular, the bytecode debugger will only be available in the next alpha release. Similarly, there will be some changes to the internal C runtime API and to the files installed by the compiler package in the next alpha release. Moreover, this zeroth alpha release is the occasion to remind everyone that OCaml 5.0 itself is expected to be a more experimental release than usual. Notably, the native compiler will only be available on the ARM64 and x86-64 architectures in this 5.0 release. Nevertheless, this zeroth alpha version is already stable enough for fellow hackers eager to join us in our early bug hunting and opam ecosystem fixing fun, or to venture in the new era of parallelism and (experimental) effects. You can follow the progresses in stabilising the opam ecosystem on A brief summary is that at least dune, merlin, ppxlib, utop, ocamlfind, and ocamlbuild work (potentially by using patches from the alpha opam repository). If you find any bugs, please report them here: In particular, any sequential OCaml 4 library or program should be valid in OCaml 5 (except for deprecated modules and functions). Please don't hesitate to report any compatibility bugs! If you are interested by the ongoing list of bug fixes, the updated change log for OCaml 5.0.0 is available at: Installation instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95= =E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2= =80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80= =95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95= =E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2= =80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80= =95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95= =E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2=80=95=E2= =80=95=E2=80=95=E2=80=95=E2=80=95 The base compiler can be installed as an opam switch with the following commands on opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.0.0~alpha0 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For previous version of opam, the switch creation command line is slightly more verbose: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.0.0~alpha0 --repositories=3Ddefault,beta= =3Dgit+https://github.com/ocaml/ocaml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.0.0~alpha0+op= tions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a comma separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.0.0~alpha0+flambda+nffa ocaml-variants.5.0= .0~alpha0+options ocaml-option-flambda =E2=94=82 ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The command line above is slightly more complicated for an opam version anterior to opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create --packages=3Docaml-variants.5.= 0.0~alpha0+options, =E2=94=82 --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/oc= aml-beta-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In both cases, all available options can be listed with `opam search ocaml-option'. If you want to test this version, it is strongly advised to install the alpha opam repository with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-rep= ository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This alpha repository contains various fixes in the process of being upstreamed. The source code for the alpha is also available at these addresses: =E2=80=A2 =E2=80=A2 Daniel B=C3=BCnzli asked and octachron replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Does this mean we get [global warming] again ? Indeed! I should have mentioned that point! The normal development process can restart on the compiler development branch. I will also try to slowly go through the backlog of frozen PRs once the alpha releases settle down. [global warming] Tezt, a framework for all your tests =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: rbardou announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Tezt (pronounced [/t=C9=9Bzti/]) is a test framework for OCaml that has been developed and used at Nomadic Labs to test [Octez], an OCaml implementation of the Tezos blockchain. It has become quite mature and we feel it would benefit the OCaml community at large, so we are releasing it publicly as a standalone product. Tezt is well-suited for unit tests, integration tests, and regression tests in particular. It was designed with a focus on user experience, with colourful logs, various ways to select the tests to run from the command-line, and more. It integrates well into CI pipelines. And it cleans up after itself, deleting temporary files and killing external processes. Unless you tell it not to, of course. For a more in-depth tour of Tezt, see [our latest blog post entry]. Tezt is available on opam: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install tezt =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Have a look at the [API documentation] and the [source code]. [/t=C9=9Bzti/] [Octez] [our latest blog post entry] [API documentation] [source code] OCaml Stdlib, Containers, Batteries, Base and F# core functions comparisons =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jp R announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Comparisons (names/signatures) of the core functions used in: =E2=80=A2 OCaml Stdlib (v4.41.0) =E2=80=A2 Containers (v3.8) =E2=80=A2 Batteries (v3.5.1) =E2=80=A2 Base (v0.15.0) =E2=80=A2 F# (v6.0) as a bonus Note: F# provides an Array.Parallel module with some functions (choose, collect, init, iter, iteri, map, mapi, partition) which could be good candidates for OCaml 5.0.0=E2=80=A6 Dune 3.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Etienne Millon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of the dune team, I=E2=80=99m pleased to announce the release of version 3.3.0. This is the first version that supports the upcoming OCaml 5.0. It also improves safety by sandboxing more rules and enabling more warnings, and there's a bunch of new features on the coq side too. Full changelog follows. Note that as usual, dune works hard not to break existing packages. So even if it mentions that rules require precise dependencies, for example, this new safety net is only enabled for project that use `(lang dune 3.3)'. Happy hacking. 3.3.0 (17-06-2022) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=80=A2 Sandbox preprocessing, lint, and dialect rules by default. All = these rules now require precise dependency specifications (#5807, @rgrinberg) =E2=80=A2 Allow list expansion in the `pps' specification for preprocessi= ng (#5820, @Firobe) =E2=80=A2 Add warnings 67-69 to dune's default set of warnings. These are warnings of the form "unused X.." (#5844, @rgrinberg) =E2=80=A2 Introduce project "composition" for coq theories. Coq theories = in separate projects can now refer to each other when in the same workspace (#5784, @Alizter, @rgrinberg) =E2=80=A2 Fix hint message for `data_only_dirs' that wrongly mentions the unknown constructor `data_only' (#5803, @lambdaxdotx) =E2=80=A2 Fix creating sandbox directory trees by getting rid of buggy memoization (#5794, @rgrinberg, @snowleopard) =E2=80=A2 Handle directory dependencies in sandboxed rules. Previously, t= he parents of these directory dependencies weren't created. (#5754, @rgrinberg) =E2=80=A2 Set the exit code to 130 when dune is terminated with a signal (#5769, fixes #5757) =E2=80=A2 Support new locations of unix, str, dynlink in OCaml >=3D 5.0 (= #5582, @dra27) =E2=80=A2 The `coq.theory' stanza now produces rules for running `coqdoc'. Given a theory named `mytheory', the directory targets `mytheory.html/' and `mytheory.tex/' or additionally the aliases `@doc' and `@doc-latex' will build the HTML and LaTeX documentation repsectively. (#5695, fixes #3760, @Alizter) =E2=80=A2 Coq theories marked as `(boot)' cannot depend on other theories (#5867, @ejgallego) =E2=80=A2 Ignore `bigarray' in `(libraries)' with OCaml >=3D 5.0. (#5526,= fixes #5494, @moyodiallo) =E2=80=A2 Start with :standard when building the ctypes generated foreign stubs so that we include important compiler flags, such as -fPIC (#5816, fixes #5809). Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 14 to 21, 2022.

    OBazl Toolsuite - tools for building OCaml with Bazel

    Gregg Reynolds announced

    Version 2 of OBazl, a Bazel ruleset for building OCaml code, will soon be a= vailable. I'm letting you know early because I'll be giving a presentation about the OBazl Toolsuite for the Bazel Exchange conference next Wed, 22 June, at 3:00 pm UDT (10:00 am CDT). It's a virtual conference so you can tune in from anywhere.= The talk will focus on some of the quirks of the OCaml build discipline and how I addressed them for the OBazl= ruleset.

    The tools are usable now, they're just not yet properly documented and pack= aged, and in a few places there's a little more work to be done on the code. Nonetheless there is quite a bit of docum= entation (CAVEAT: some of it is outdated), with more on the way soon, and there are lots of demos available. So if yo= u're interested in using Bazel to build your OCaml code I welcome you to take a look:

    The OBazl Book

    Twitter handle is @obazldev Discord: https://discord.gg/PHSA= W5DUva

    Gregg Reynolds lated added

    PS. The conference organizers have provided this discount token: BAZEL-GR= -20

    It should be good for 20% off, registration is at https://events.skill= smatter.com/bazelx2022

    Job offer: 3 years compiler engineer at the French tax authori= ty

    Denis Merigoux announced

    [En fran=C3=A7ais parce que c'est une offre d'emploi dans l'administration]

    Bonjour =C3=A0 toutes et =C3=A0 tous,

    Vous aimez la programmation fonctionnelle et les compilateurs ? Vous en ave= z marre des offres d'emploi dans la blockchain ? =C3=87a tombe bien, j'ai ce qu'il vous faut !

    Il y a deux ans, j'ai lanc=C3=A9 un grand projet de modernisation du calcul= informatique de calcul de l'imp=C3=B4t sur le revenu =C3=A0 la Direction G=C3=A9n=C3=A9rale des Finances Publiques (DGFiP= ), en partenariat avec Inria: https://www.inria.fr/fr/mlang-modernisation-calcul-impot-revenu.

    Le logiciel au c=C5=93ur de ce projet de modernisation est Mlang, un compil= ateur =C3=A9crit en OCaml pour un couple de langages d=C3=A9di=C3=A9s utilis=C3=A9s par la DGFiP pour encoder le calcul de l'imp= =C3=B4t sur le revenu. Depuis deux ans, la DGFiP travaille =C3=A0 int=C3=A9grer Mlang =C3=A0 l'infrastructure officielle de calcul de l'imp= =C3=B4t sur le revenu pour remplacer des syst=C3=A8mes vieillissants. C'est donc un projet =C3=A0 tr=C3=A8s fort impact (80M=E2=82= =AC par d'imp=C3=B4ts par an), et proche de la R&D (OCaml, libre, innovation) ! Depuis un an, la DGFiP emploie la soci=C3=A9t=C3=A9 OCamlPro = sur le projet mais souhaite maintenant r=C3=A9-internaliser ses comp=C3=A9tences pour garder la souverainet=C3=A9 = num=C3=A9rique sur son infrastructure de calcul.

    C'est l=C3=A0 que cette offre d'emploi entre en jeu ! En effet la DGFiP vie= nt d'ouvrir un poste en CDD de 3 ans pour un.e expert.e en compilation ! Les d=C3=A9tails :

    • Bureaux =C3=A0 Noisy-le-Grand (+ jusqu'=C3=A0 3 jours t=C3=A9l=C3=A9tra= vail/semaine)
    • Salaire: =C3=80 n=C3=A9gocier selon exp=C3=A9rience mais similaire =C3= =A0 "Inspecteur des finances publiques". Selon le site du minist=C3=A8re de= l'=C3=A9conomie =C3=A7a d=C3=A9buterait =C3=A0 3k=E2=82=AC net/mois.
    • T=C3=A2ches: Maintenance, =C3=A9volution de Mlang et travaux annexes

    Et pour l'heureux.se recrut=C3=A9.e, la cerise sur le g=C3=A2teau sera de p= ouvoir collaborer avec moi et l'=C3=A9quipe Prosecco d'Inria (ainsi que Rapha=C3=ABl Monat, ) :) Attention cependant : il faudra= s'attendre =C3=A0 devoir =C3=A9galement aider l'=C3=A9quipe de la DGFiP sur d'autres chantiers en fonction des priorit=C3=A9s. De m=C3= =AAme, l'objectif est de partager la comp=C3=A9tence en compilation au sein de la DGFiP, donc les profils =C3=A9vang=C3=A9lisateurs= de la programmation fonctionnelle sont les bienvenus !

    Pour r=C3=A9f=C3=A9rence, voici l'offre officielle compl=C3=A8te: https://merigoux.ovh/assets= /OffreDGFiP.pdf. S'il vous pla=C3=AEt, pas d'autocensure =C3=A0 cause de ce qui est marqu=C3=A9 dans ce PDF! Si vous a= vez un doute contactez-moi par retour de mail.

    Deadline pour les candidatures: 9 juillet. Prise de poste inconnue, s=C3=BB= rement aux alentours du 1er septembre mais j'imagine que c'est n=C3=A9gociable.

    Denis Merigoux later added

    Si vous =C3=AAtes int=C3=A9ress=C3=A9.e, envoyez votre CV et lettre de moti= vation =C3=A0 bureau.si-part-rh@dgfip.finances.gouv.fr et bureau.rh-mobilite-carriere-a-recrutementchoix@dgfip.finances.gouv.fr.

    OCaml 5.0, zeroth alpha release

    octachron announced

    Five months after the initial merge of the multicore branch into the mainli= ne OCaml and three months after the release of OCaml 4.14.0, OCaml 5.0.0 is starting to take shape.

    I am thus happy to announce an exceptional zeroth alpha release of OCaml 5.= 0.0 (see below for the installation instructions).

    This alpha release is expected to be rougher than an usual alpha release, d= ue to the full rewrite of the OCaml runtime. In particular, the bytecode debugger will only be available in the= next alpha release. Similarly, there will be some changes to the internal C runtime API and to the files installed by= the compiler package in the next alpha release.

    Moreover, this zeroth alpha release is the occasion to remind everyone that= OCaml 5.0 itself is expected to be a more experimental release than usual. Notably, the native compiler will only be = available on the ARM64 and x86-64 architectures in this 5.0 release.

    Nevertheless, this zeroth alpha version is already stable enough for fellow= hackers eager to join us in our early bug hunting and opam ecosystem fixing fun, or to venture in the new era of para= llelism and (experimental) effects.

    You can follow the progresses in stabilising the opam ecosystem on

    https://g= ithub.com/ocaml/opam-repository/issues/21526

    A brief summary is that at least dune, merlin, ppxlib, utop, ocamlfind, and= ocamlbuild work (potentially by using patches from the alpha opam repository).

    If you find any bugs, please report them here:

    https://github.com/ocaml/= ocaml/issues

    In particular, any sequential OCaml 4 library or program should be valid in= OCaml 5 (except for deprecated modules and functions). Please don't hesitate to report any compatibility bugs!

    If you are interested by the ongoing list of bug fixes, the updated change = log for OCaml 5.0.0 is available at:

    https://github.= com/ocaml/ocaml/blob/5.0/Changes

    Installation instructions


    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1:

    opam update
    opam switch create 5.0.0~alpha0
    

    For previous version of opam, the switch creation command line is slightly = more verbose:

    opam update
    opam switch create 5.0.0~alpha0 --repositories=3Ddefault,beta=3Dgit+https:/=
    /github.com/ocaml/ocaml-beta-repository.git
    

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.0.0~alpha0+options =
    <option_list>
    

    where <option_list> is a comma separated list of o= caml-option-* packages. For instance, for a flambda and no-flat-float-array switch:

    opam switch create 5.0.0~alpha0+flambda+nffa ocaml-variants.5.0.0~alpha0+op=
    tions ocaml-option-flambda
    ocaml-option-no-flat-float-array
    

    The command line above is slightly more complicated for an opam version ant= erior to opam 2.1:

    opam update
    opam switch create <switch_name> --packages=3Docaml-variants.5.0.0~al=
    pha0+options,<option_list>
    --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
    ository.git
    

    In both cases, all available options can be listed with opam search o= caml-option.

    If you want to test this version, it is strongly advised to install the alp= ha opam repository

    https://gi= thub.com/kit-ty-kate/opam-alpha-repository

    with

    opam repo add alpha git://github.com/kit-ty-kate/opam-alpha-repository.git
    

    This alpha repository contains various fixes in the process of being upstre= amed.

    The source code for the alpha is also available at these addresses:

    Daniel B=C3=BCnzli asked and octachron replied

    Does this mean we get global warming again ?

    Indeed! I should have mentioned that point! The normal development process = can restart on the compiler development branch.

    I will also try to slowly go through the backlog of frozen PRs once the alp= ha releases settle down.

    Tezt, a framework for all your tests

    rbardou announced

    Tezt (pronounced t= =C9=9Bzti) is a test framework for OCaml that has been developed and used at Nomadic Labs to test Octez, an OCaml implementation of the Tezos blockchain. It has become quite mature and we feel it would benefit the OCa= ml community at large, so we are releasing it publicly as a standalone product.

    Tezt is well-suited for unit tests, integration tests, and regression tests= in particular. It was designed with a focus on user experience, with colourful logs, various ways to select the t= ests to run from the command-line, and more. It integrates well into CI pipelines. And it cleans up after itself, = deleting temporary files and killing external processes. Unless you tell it not to, of course.

    For a more in-depth tour of Tezt, see our latest blog post entry.

    Tezt is available on opam:

    opam install tezt
    

    Have a look at the API documentation and the source code.

    OCaml Stdlib, Containers, Batteries, Base and F# core function= s comparisons

    Jp R announced

    https://github.com/Fourchaux/OC= aml-Stdlib_Containers_Batteries_Base-and-FSharp--core-functions-comparisons=

    Comparisons (names/signatures) of the core functions used in:

    • OCaml Stdlib (v4.41.0)
    • Containers (v3.8)
    • Batteries (v3.5.1)
    • Base (v0.15.0)
    • F# (v6.0) as a bonus

    Note: F# provides an Array.Parallel module with some functions (choose, collect, init, iter, iteri, map, mapi, partition) which could be good candidates for OCaml 5.0.0…

    Dune 3.3.0

    Etienne Millon announced

    On behalf of the dune team, I=E2=80=99m pleased to announce the release of = version 3.3.0. This is the first version that supports the upcoming OCaml 5.0. It also improves safety by sandboxing more= rules and enabling more warnings, and there's a bunch of new features on the coq side too. Full changelog follows.

    Note that as usual, dune works hard not to break existing packages. So even= if it mentions that rules require precise dependencies, for example, this new safety net is only enabled for project = that use (lang dune 3.3).

    Happy hacking.

    3.3.0 (17-06-2022)

    • Sandbox preprocessing, lint, and dialect rules by default. All these ru= les now require precise dependency specifications (#5807, @rgrinberg)
    • Allow list expansion in the pps specification for preproce= ssing (#5820, @Firobe)
    • Add warnings 67-69 to dune's default set of warnings. These are warning= s of the form "unused X.." (#5844, @rgrinberg)
    • Introduce project "composition" for coq theories. Coq theories in separ= ate projects can now refer to each other when in the same workspace (#5784, @Alizter, @rgrinberg)
    • Fix hint message for data_only_dirs that wrongly mentions = the unknown constructor data_only (#5803, @lambdaxdotx)
    • Fix creating sandbox directory trees by getting rid of buggy memoization (#5794, @rgrinberg, @snowleopard)
    • Handle directory dependencies in sandboxed rules. Previously, the paren= ts of these directory dependencies weren't created. (#5754, @rgrinberg)
    • Set the exit code to 130 when dune is terminated with a signal (#5769, = fixes #5757)
    • Support new locations of unix, str, dynlink in OCaml >=3D 5.0 (#5582= , @dra27)
    • The coq.theory stanza now produces rules for running coqdoc. Given a theory named mytheory, the directory targets mytheory.ht= ml/ and mytheory.tex/ or additionally the aliases @doc an= d @doc-latex will build the HTML and LaTeX documentation repsectively. (#5695, fixes #3760, @Alizter)
    • Coq theories marked as (boot) cannot depend on other theor= ies (#5867, @ejgallego)
    • Ignore bigarray in (libraries) with OCaml >= ;=3D 5.0. (#5526, fixes #5494, @moyodiallo)
    • Start with :standard when building the ctypes generated foreign stubs s= o that we include important compiler flags, such as -fPIC (#5816, fixes #5809).

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 05D5AE00BE for ; Tue, 28 Jun 2022 09:37:30 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=FQYq=XD=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: AWT7l/4ULdffDot+DfXOOVbq+xlneOMWFQSBSndsu1P9fJncGU+sStac3ZHVN9jjK6OLXlLQJ4 ejoF+cAY+DzFZ49GeM8ktrQ0Dw2iPHxkF+SdRksVJY0yCRA9/M+8FLFaotA5STPY5T4hPy5bt3 OfIppPHDOL1LeeYNtpF9qDC0pEKZHA0lQ2fBQRbmSfivD1R0fGsj8+iHd3O60tqZL0ie4IaaHe a/LYBBA/xBNrXb89na5ByocjpHpAI3zOQZHVgvW9RwZeZf9eu8RALatufXfsmu2AN1Gdi9tHlF uiCbRz86FyC52wHe2z42W9sW X-IPAS-Result: =?us-ascii?q?A0DdAQAEr7pihyIeaIFaHgEBCxIMgzCBAxkBZ1YuBwhEh?= =?us-ascii?q?E6RDYlWlRYQAQMBDSwBDgQBAgQBAYUDGIU0Ah4GAQUzEwECBAEBAQEDAgMBA?= =?us-ascii?q?QEBAQEDAQEFAQEBAgEBAgQEARMBAQEBDQsJBQgMBRAOBTxkZASBSwSBdAs0D?= =?us-ascii?q?YI1DBmDcAEhBAYTAQEsDBgjAxQBBgMCBA0BFwEeFwESGoJjAYMYAwQBCpEUm?= =?us-ascii?q?xp6fzKBAYIIAQEGgT8BhEqBXAkkgRmGIV9LAYMPhBsCFxAQgVVEhA9ugVB7F?= =?us-ascii?q?wEBAQEBgTsBAU2DKYJljjGDPYEvhjgHOANHLxKBIG4BCAYGBwoFMAYCDBgUB?= =?us-ascii?q?AITEk0GHAISDAoGFQ5CEhcMDwMSAxEBBwIJEggVKwgDAgMIAwIDKwIDFgkHC?= =?us-ascii?q?gMdCAocEhAUAgQRHgsIAxkeLAkCBA4DQggLCgMRBAMTGAkWCBAEBgMILw0nC?= =?us-ascii?q?wMFDw0BBgMGAgUFAQMgAxQDBSQHAyEPJg0NBCIdAwMFJQMCAhsHAgIDAgYVB?= =?us-ascii?q?gICGFYuDQgECAQYHyQPBQIHLwUELwIeBAUGEQgCFgIGBAUCBAQWAhAIAggnF?= =?us-ascii?q?wcTMxkBBVkQCSEWBikQBQYWAyFKJgVFDyg0NjwsHxsKgRosCSIWAwQEAwIGG?= =?us-ascii?q?gMDIgISKQYtBiKWVoRdDkA8PhMBGw8BLykbHQEMFxEVBAoERhYvA5IAIZh4l?= =?us-ascii?q?Tc0B4NRgT4GDIgvgSKNAogkg3WBUJFVkUohlk8giSuBHIJKlFOFPIFOKoFrD?= =?us-ascii?q?AczGjBDgmgJRQEDAg0BAgIDAQIBAgkBAQKOHQkDFoNQhCA5O4VMPzQCAQE3A?= =?us-ascii?q?gYBCgEBAwmFYwEBBRMLAYh4AQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 74= IronPort-HdrOrdr: A9a23:G3/KIq0da0hBnpDb3vbP4wqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.92,227,1650924000"; d="scan'208,217";a="43153083" X-MGA-submission: =?us-ascii?q?MDEsAWQNdcvUB7/R9+6TF+9UbYSgE3fPoQHvy1?= =?us-ascii?q?BLYPtPm71yQ4W2Uj5xUBA23X8xVuMLQd8KIDmEiTRdeIf3Y1A1aVQZFN?= =?us-ascii?q?I/KnH/J9MDfOwv0PaKGEbNkHIS0JcS0Xv/ua7kE8p0WHIFvux/0HhmNv?= =?us-ascii?q?/XcvaQYCs7mMtyIWZ2j8EZEg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jun 2022 09:37:29 +0200 Received: from set (unknown [89.207.171.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1C447565B42; Tue, 28 Jun 2022 09:37:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1656401847; bh=aUWy1tKri98D+R9rdjVeBG9RwuvHV/xNhhbroSETOIU=; h=From:To:Subject:Date:Message-ID; b=PQElZNEm4lP01G3rAcpwIneRPNNh5Lg/WJKEfTkez8ElZfZK1cy76q5n40pyoPOZ+ 9McwUGzmhHGuJkWNNryjdcFCQS2007z9kuuaYSo/b8/EcnKV5bAWnBmDMklQJ2Vws9 ywQHqAaBJ08odFe+OiVWZMFFS6YG9erki+JZD2UI= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 28 Jun 2022 09:37:16 +0200 Message-ID: <87sfnpw85v.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 28 09:37:28 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.459847, queueID=34E0C560785 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyMSB0byAyOCwNCjIwMjIuDQoNClRoZSBtYWlsaW5nIGxpc3QgbW9kZSBvZiBk aXNjdXNzLm9jYW1sLm9yZyBzZWVtcyB0byBoYXZlIGJlZW4gZG93biBmb3IgYQ0KZmV3IGRheXMs IHNvIEkgaGFkIHRvIG1hbnVhbGx5IHNjcmFwZSB0aGUgbWVzc2FnZXMuIE15IGFwb2xvZ2llcyBp ZiBJDQptaXNzZWQgYW55Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkFuIGFtdXNpbmcgdXNlIG9mIGZp cnN0LWNsYXNzIG1vZHVsZXM6IHJlYWRpbmcgZnJvbSBwbGFpbnRleHQgYW5kIGNvbXByZXNzZWQg ZmlsZXMNCkx3dC41LjYuMCAoYW5kIG90aGVyIEx3dCBwYWNrYWdlcykNCk9sZCBDV04NCg0KDQpB biBhbXVzaW5nIHVzZSBvZiBmaXJzdC1jbGFzcyBtb2R1bGVzOiByZWFkaW5nIGZyb20gcGxhaW50 ZXh0IGFuZCBjb21wcmVzc2VkIGZpbGVzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FuLWFtdXNpbmctdXNlLW9mLWZpcnN0 LWNsYXNzLW1vZHVsZXMtcmVhZGluZy1mcm9tLXBsYWludGV4dC1hbmQtY29tcHJlc3NlZC1maWxl cy8xMDA3Mz4NCg0KDQpDaGV0X011cnRoeSBleHBsYWluZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd2FzIHJl Y2VudGx5IHRyeWluZyB0byB3cml0ZSBhIHRoaW5nIGluIFJ1c3QsIGFuZCBoYXZpbmcgcHJvYmxl bXMsDQogIHNvIEkgd3JvdGUgdGhlIHNhbWUgdGhpbmcgaW4gT0NhbWwsIGp1c3QgdG8gbWFrZSBz dXJlIHRoYXQgaXQgd2FzDQogIGRvYWJsZS4gSSB0aG91Z2h0IEnigJlkIHBvc3QgYWJvdXQgaXQs IGIvYyBtYXliZSBpdOKAmXMgYW4gZXhhbXBsZSBvZiB3aGF0DQogIHdl4oCZbGwgZmluZCBtb3Jl IHRyYWN0YWJsZSwgb25jZSB3ZSBoYXZlIG1vZHVsYXIgaW1wbGljaXRzLg0KDQogIFRoZSBwcm9i bGVtOiBJIGhhdmUgYm90aCBjb21wcmVzc2VkIGFuZCBwbGFpbnRleHQgZmlsZXMsIGFuZCBJIHdh bnQgdG8NCiAgcnVuIGEgZnVuY3Rpb24gb3ZlciB0aGUgdW5jb21wcmVzc2VkIGNvbnRlbnRzLiBJ 4oCZZCBsaWtlIGEgY29tYmluYXRvcg0KICB0aGF0IEkgY2FuIGFwcGx5IHRvIHRoZSBmaWxlbmFt ZSBhbmQgdGhlIGZ1bmN0aW9uLCB0aGF0IHdpbGwgZG8gdGhlDQogIHdvcmsgb2Ygb3BlbmluZyB0 aGUgZmlsZSwgY2FsbGluZyB0aGUgZnVuY3Rpb24sIGNsb3NpbmcgdGhlIGZpbGUsIGV0Yy4NCg0K ICBUaGlzIGlzbuKAmXQgc28gaGFyZC4NCg0KICAxLiBkZWZpbmUgYSB0eXBlIG9mIFJFQURFUiAo YW5kIHR3byBpbnN0YW5jZXMgZm9yIHBsYWludGV4dCBhbmQNCiAgICAgZ3ppcHBlZCkuIFRoaXMg aXMgdGhlIGVxdWl2YWxlbnQgb2YgUnVzdOKAmXMg4oCcaW86OkJ1ZlJlYWTigJ0uDQoNCiAgICAg 4pSM4pSA4pSA4pSA4pSADQogICAgIOKUgiBtb2R1bGUgdHlwZSBSRUFERVIgPQ0KICAgICDilIIg ICBzaWcNCiAgICAg4pSCICAgICB0eXBlIGluX2NoYW5uZWwNCiAgICAg4pSCICAgICB2YWwgb3Bl bl9pbiA6IHN0cmluZyAtPiBpbl9jaGFubmVsDQogICAgIOKUgiAgICAgdmFsIGlucHV0X2NoYXIg OiBpbl9jaGFubmVsIC0+IGNoYXINCiAgICAg4pSCICAgICB2YWwgY2xvc2VfaW4gOiBpbl9jaGFu bmVsIC0+IHVuaXQNCiAgICAg4pSCICAgZW5kDQogICAgIOKUgiBsZXQgc3RkcmVhZGVyID0gKG1v ZHVsZSBTdGRsaWIgOiBSRUFERVIpIDs7DQogICAgIOKUgiBsZXQgZ3pyZWFkZXIgPSAobW9kdWxl IEd6aXAgOiBSRUFERVIpIDs7DQogICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogIDIuIHRoZW4gZGVm aW5lIGEgdHlwZSBvZiDigJxpbiBjaGFubmVsIHVzZXLigJ0gKOKAnElDVVNFUuKAnSkgYW5kIHRo ZSBnZW5lcmljDQogICAgIHZlcnNpb24gb2YgaXQNCg0KICAgICDilIzilIDilIDilIDilIANCiAg ICAg4pSCIG1vZHVsZSB0eXBlIElDVVNFUiA9IHNpZw0KICAgICDilIIgICB0eXBlIGluX2NoYW5u ZWwNCiAgICAg4pSCICAgdmFsIHVzZV9pYyA6IGluX2NoYW5uZWwgLT4gdW5pdA0KICAgICDilIIg ZW5kDQogICAgIOKUgiBtb2R1bGUgdHlwZSBHRU5FUklDX0lDVVNFUiA9IGZ1bmN0b3IgKFIgOiBS RUFERVIpIC0+IChJQ1VTRVIgd2l0aCB0eXBlIGluX2NoYW5uZWwgPSBSLmluX2NoYW5uZWwpDQog ICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogIDMuIHRoZW4gZGVmaW5lIG91ciBmdW5jdGlvbiB0aGF0 IHRha2VzIGEgZ2VuZXJpYyBpbl9jaGFubmVsLCBhbmQgdXNlcw0KICAgICBpdCDigJMg4oCcQ2F0 4oCdDQoNCiAgICAg4pSM4pSA4pSA4pSA4pSADQogICAgIOKUgiBtb2R1bGUgQ2F0KFIgOiBSRUFE RVIpIDogSUNVU0VSIHdpdGggdHlwZSBpbl9jaGFubmVsID0gUi5pbl9jaGFubmVsID0gc3RydWN0 DQogICAgIOKUgiAgIHR5cGUgaW5fY2hhbm5lbCA9IFIuaW5fY2hhbm5lbA0KICAgICDilIIgICBs ZXQgdXNlX2ljIGljID0NCiAgICAg4pSCICAgbGV0IHJlYyByZXJlYyAoKSA9DQogICAgIOKUgiAg ICAgbWF0Y2ggUi5pbnB1dF9jaGFyIGljIHdpdGgNCiAgICAg4pSCICAgICAgIGMgLT4gcHJpbnRf Y2hhciBjIDsgcmVyZWMgKCkNCiAgICAg4pSCICAgICB8IGV4Y2VwdGlvbiBFbmRfb2ZfZmlsZSAt PiAoKQ0KICAgICDilIIgICBpbiByZXJlYyAoKQ0KICAgICDilIIgZW5kDQogICAgIOKUlOKUgOKU gOKUgOKUgA0KDQogIDQuIEFuZCB0aGVuIHdyaXRlIG91ciDigJx3aXRoX2lucHV0X2ZpbGXigJ0g ZnVuY3Rpb24sIHRoYXQgdGFrZXMgYQ0KICAgICBmaWxlbmFtZSwgdGhlIGZ1bmN0aW9uIGZyb20g IzMsIGFuZCBhcHBsaWVzIGl0IHRvIGVpdGhlciBhIG5vcm1hbA0KICAgICBpbl9jaGFubmVsLCBv ciBvbmUgcHJvZHVjZWQgZnJvbSBhIGd6aXAtcmVhZGVyLg0KDQogICAgIOKUjOKUgOKUgOKUgOKU gA0KICAgICDilIIgbGV0IHdpdGhfaW5wdXRfZmlsZSBmbmFtZSAobW9kdWxlIFIgOiBHRU5FUklD X0lDVVNFUikgPQ0KICAgICDilIIgICBsZXQgKG1vZHVsZSBNIDogUkVBREVSKSA9DQogICAgIOKU giAgICAgaWYgRnBhdGguKGZuYW1lIHw+IHYgfD4gaGFzX2V4dCAiZ3oiKSB0aGVuDQogICAgIOKU giAgICAgICBnenJlYWRlcg0KICAgICDilIIgICAgIGVsc2Ugc3RkcmVhZGVyIGluDQogICAgIOKU giAgIGxldCBvcGVuIE0gaW4NCiAgICAg4pSCICAgbGV0IGljID0gTS5vcGVuX2luIGZuYW1lIGlu DQogICAgIOKUgiAgIGxldCBtb2R1bGUgQyA9IFIoTSkgaW4NCiAgICAg4pSCICAgdHJ5IGxldCBy diA9IEMudXNlX2ljIGljIGluIGNsb3NlX2luIGljIDsgcnYNCiAgICAg4pSCICAgd2l0aCBlIC0+ IGNsb3NlX2luIGljIDsgcmFpc2UgZQ0KICAgICDilJTilIDilIDilIDilIANCg0KICBBbmQgbm93 IHdlIGNhbiB1c2UgaXQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB3aXRoX2lucHV0X2Zp bGUgIi9ldGMvcGFzc3dkIiAobW9kdWxlIENhdCkgOzsNCiAg4pSCIHdpdGhfaW5wdXRfZmlsZSAi Zm9vLmd6IiAobW9kdWxlIENhdCkgOzsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRWFzeS1wZWFz eS4gSSBkb27igJl0IHJlbWVtYmVyIGVub3VnaCBhYm91dCB0aGUgbW9kdWxhciBpbXBsaWNpdHMN CiAgcHJvcG9zYWwgdG8gcmVtZW1iZXIgaWYgdGhpcyBjYW4gYmUgY2FzdCBpbiB0aGUgc3VwcG9y dGVkIGxhbmd1YWdlDQogIHRoZXJlLCBzbyBJIHN1cHBvc2UgSSBzaG91bGQgZ2V0IHNvbWUgdmVy c2lvbiBvZiB0aGF0IGNvZGUgKG9yIHRoZQ0KICBuZXdlciB2ZXJzaW9ucyBmcm9tIG90aGVycykg dXAtYW5kLXJ1bm5pbmcsIGFuZCBzZWUgaWYgdGhpcyBjYW4gYmUNCiAgbWFkZSB0byB3b3JrLg0K DQoNCmh5cGhlbnJmIGFza2VkIGFuZCBDaGV0X011cnRoeSByZXBsaWVkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBj YW7igJl0IHdlIGdldCByaWQgb2YgdGhlIGBHRU5FUklDX0lDVVNFUicgcmVxdWlyZW1lbnQgYW5k DQogICAgICAgIGp1c3QgYXNrIGZvciBmdW5jdGlvbnMgdGhhdCB0YWtlIGEgcGFja2VkIG1vZHVs ZSBvZiB0eXBlDQogICAgICAgIGBSRUFERVInDQoNCiAgICAgICAgYnkgdGhhdCBJIG1lYW4gdGhl IHNpZ25hdHVyZSBvZiBgd2l0aF9pbnB1dF9maWxlJyBiZWNvbWVzDQogICAgICAgIGBzdHJpbmcg LT4gKChtb2R1bGUgUkVBREVSKSAtPiAnYSkgLT4gJ2EnDQoNCiAgSXTigJlzIGEgZ29vZCBxdWVz dGlvbiwgYW5kIGFzIGEgbmV3YmllIHVzZXIgb2YgZmlyc3QtY2xhc3MgbW9kdWxlcywgSQ0KICBk b27igJl0IGtub3cgdGhlIHR5cGluZyBydWxlcyB3ZWxsIGVub3VnaCB0byBhbnN3ZXIuIEJ1dCBJ IGRpZCB0cnk6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgd2l0aF9pbnB1dF9maWxl JyBmbmFtZSBmID0NCiAg4pSCICAgbGV0IChtb2R1bGUgTSA6IFJFQURFUikgPQ0KICDilIIgICAg IGlmIEZwYXRoLihmbmFtZSB8PiB2IHw+IGhhc19leHQgImd6IikgdGhlbg0KICDilIIgICAgICAg Z3pyZWFkZXINCiAg4pSCICAgICBlbHNlIHN0ZHJlYWRlciBpbg0KICDilIIgICBsZXQgb3BlbiBN IGluDQogIOKUgiAgIGxldCBpYyA9IE0ub3Blbl9pbiBmbmFtZSBpbg0KICDilIIgICBmIChtb2R1 bGUgTSA6IFJFQURFUikgaWMNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgYW5kIGdvdA0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgRmlsZSAiaW9hYnMubWwiLCBsaW5lIDk2LCBjaGFyYWN0ZXJz IDI0LTI2Og0KICDilIIgOTYgfCAgIGYgKG1vZHVsZSBNIDogUkVBREVSKSBpYw0KICDilIIgCQkJ ICAgICBeXg0KICDilIIgRXJyb3I6IFRoaXMgZXhwcmVzc2lvbiBoYXMgdHlwZSBNLmluX2NoYW5u ZWwNCiAg4pSCICAgICAgICBidXQgYW4gZXhwcmVzc2lvbiB3YXMgZXhwZWN0ZWQgb2YgdHlwZSAn YQ0KICDilIIgICAgICAgIFRoZSB0eXBlIGNvbnN0cnVjdG9yIE0uaW5fY2hhbm5lbCB3b3VsZCBl c2NhcGUgaXRzIHNjb3BlDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEVUQTogSSByZW1lbWJlciBp biB0aGUgbW9kdWxhciBpbXBsaWNpdHMgcGFwZXIsIHRoYXQgdGhlcmUgd2FzIGEgbG90DQogIG9m IHdyYXBwZXJpbmcgY29kZSBpbiBzdHJ1Y3RzICh0aGF0IGRpZG7igJl0IHN0YXJ0IG9mZiBpbiBz dHJ1Y3RzKS4gSQ0KICB3b25kZXIgaWYgdGhhdOKAmXMgZXZpZGVuY2UgdGhhdCB5b3UgcmVhbGx5 IGRvIGhhdmUgdG8g4oCccHVzaCB1cOKAnSBjb2RlIHRvDQogIHRoZSBtb2R1bGUgbGV2ZWwgaW4g b3JkZXIgdG8gbWFrZSBpdCB3b3JrLg0KDQoNCm9jdGFjaHJvbiB0aGVuIHNhaWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFlv dSBkb27igJl0IG5lZWQgbW9kdWxhciBpbXBsaWNpdHMgdG8gc2ltcGxpZnkgeW91ciBjb2RlLiBZ b3VyIHBhY2tlZA0KICBtb2R1bGUgdHlwZSBpcyBlcXVpdmFsZW50IHRvOg0KDQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgdHlwZSBjaGFubmVsID0geyBpbnB1dF9jaGFyOiB1bml0IC0+IGNoYXI7 IGNsb3NlX2luOiB1bml0IC0+IHVuaXQgfQ0KICDilIIgdHlwZSBjaGFubmVsX2dlbmVyYXRvciA9 IHN0cmluZyAtPiAgY2hhbm5lbA0KICDilJTilIDilIDilIDilIANCg0KICBXZSBjb3VsZCBnbyBm YW5jeSBhbmQgbWFuaWZlc3QgdGhlIHR5cGUgd2l0aCBhbiBleGlzdGVudGlhbA0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgdHlwZSAnYSBjaGFubmVsID0NCiAg4pSCICAgeyBvcGVuX2ZuOiBz dHJpbmcgLT4gJ2E7IGlucHV0X2NoYXI6ICdhIC0+IGNoYXI7IGNsb3NlX2luOiAnYSAtPiB1bml0 IH0NCiAg4pSCIHR5cGUgY2hhbiA9IEFueTogJ2EgY2hhbm5lbCAtPiBjaGFuDQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIGJ1dCB0aGlzIGhhcyBtYWlubHkgdGhlIGFkdmFudGFnZSB0byBpbGx1c3Ry YXRlIHRoZSBmYWN0IHRoYXQgeW91IGFyZQ0KICBuZXZlciB1c2luZyB0aGUgbm9uLWV4aXN0ZW50 aWFsbHkgcXVhbGlmaWVkIGAnYSBjaGFubmVsJyB3aGljaCBtZWFucw0KICB0aGF0IGluIHRoZSBj dXJyZW50IHZlcnNpb24gb2YgeW91ciBjb2RlLCBtb2R1bGFyIChleHBsaWNpdHMgb3IpDQogIGlt cGxpY2l0cyBpcyBub3QgYSBnb29kIGZpdDogd2UgYXJlIG5vdCBzZWxlY3RpbmcgYSBtb2R1bGUg dG8gcHJvdmlkZQ0KICBmdW5jdGlvbnMgZm9yIGEgdHlwZSwgd2UgaGF2ZSBhbiBvYmplY3QgKGFr YSBhbiBleGlzdGVudGlhbGx5DQogIHF1YWxpZmllZCByZWNvcmQpIHdpdGggc29tZSBoaWRkZW4g aW5uZXIgdHlwZSB0aGF0IHdlIG5ldmVyIG5lZWQgdG8NCiAga25vdy4NCg0KDQpjLWN1YmUgbGF0 ZXIgc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSSB0aGluayBpdOKAmXMga2luZCBvZiBjb3VudGVyLXByb2R1Y3RpdmUgdG8gd2Fu dCBhIGBpbl9jaGFubmVsJyB0eXBlIGF0DQogIGFsbC4gVGhpcyBpcyB3aGF0IEnigJl2ZSBiZWVu IGRvaW5nLCBtb3JlIGFuZCBtb3JlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxl IHR5cGUgSU5QVVQgPSBzaWcNCiAg4pSCICAgdmFsIHJlYWRfY2hhciA6IHVuaXQgLT4gY2hhcg0K ICDilIIgICB2YWwgcmVhZCA6IGJ5dGVzIC0+IGludCAtPiBpbnQgLT4gaW50DQogIOKUgiAgIHZh bCBjbG9zZSA6IHVuaXQgLT4gdW5pdA0KICDilIIgZW5kDQogIOKUgiANCiAg4pSCIHR5cGUgaW5w dXQgPSAobW9kdWxlIElOUFVUKQ0KICDilIIgDQogIOKUgiBsZXQgb3Blbl9maWxlIChmaWxlbmFt ZTpzdHJpbmcpIDogaW5wdXQgPQ0KICDilIIgICBsZXQgaWMgPSBvcGVuX2luIGZpbGVuYW1lIGlu DQogIOKUgiAgIChtb2R1bGUgc3RydWN0DQogIOKUgiAgICAgbGV0IHJlYWRfY2hhcigpID0gaW5w dXRfY2hhciBpYw0KICDilIIgICAgIGxldCByZWFkID0gaW5wdXQgaWMNCiAg4pSCICAgICBsZXQg Y2xvc2UoKSA9IGNsb3NlX2luIGljDQogIOKUgiAgZW5kKQ0KICDilIIgDQogIOKUgiANCiAg4pSC IGxldCBkb19zdGggKG1vZHVsZSBJTjpJTlBVVCkgPQ0KICDilIIgICBJQy5yZWFkX2NoYXIgKCk7 DQogIOKUgiAgIElDLnJlYWQg4oCmDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgYmVoYXZl cyBsaWtlIGNsYXNzaWMgb2JqZWN0cyBpbiBvdGhlciBsYW5ndWFnZXMgYW5kIHRoZXJl4oCZcyBu bw0KICBjb21wbGljYXRlZCB0eXBpbmcgZ29pbmcgb24gKHdoYXQgd2l0aCBlYWNoIGltcGxlbWVu dGF0aW9uIGhhdmluZyBpdHMNCiAgb3duIGNoYW5uZWwgdHlwZSkuDQoNCg0KTHd0LjUuNi4wIChh bmQgb3RoZXIgTHd0IHBhY2thZ2VzKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tbHd0LTUtNi0wLWFuZC1vdGhlci1sd3QtcGFja2FnZXMvMTAwNzc+DQoNCg0KcmFwaGFl bC1wcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJdCBpcyBhIHJlYWwgcGxl YXN1cmUgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgTHd0IHZlcnNpb24gNS42LjAgYXMNCiAg d2VsbCBhcyBMd3QtZG9tYWluLjAuMi4wLCBMd3QtcHB4LjIuMS4wIGFuZCBMd3QtcmVhY3QuMS4y LjAuIFdpdGggdGhpcw0KICByZWxlYXNlIEx3dCBpcyBub3cgY29tcGF0aWJsZSB3aXRoIE9DYW1s IHZlcnNpb24gNS4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3JlbGVhc2Vz L3RhZy81LjYuMD4NCg0KICBUaGFuayB5b3UgdG8gdGhlIG1hbnkgY29udHJpYnV0b3JzIGZvciB0 aGUgZml4ZXMsIHRoZSBpbXByb3ZlbWVudHMsDQogIGFuZCB0aGUgT0NhbWw1IGNvbXBhdGliaWxp dHkhIENoZWNrIG91dCB0aGUgY2hhbmdlbG9nIGZvciBmdWxsIGRldGFpbHMNCiAgb24gZWFjaCBj b250cmlidXRpb24uDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5k IEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2 ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl DQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdl XSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZl XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhl IGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0K W29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWts eS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 21 to 28, 2022.

    The mailing list mode of discuss.ocaml.org seems to have been down for a fe= w days, so I had to manually scrape the messages. My apologies if I missed = any.

    An amusing use of first-class modules: reading from plaintext = and compressed files

    Chet_Murthy explained

    I was recently trying to write a thing in Rust, and having problems, so I w= rote the same thing in OCaml, just to make sure that it was doable. I thoug= ht I=E2=80=99d post about it, b/c maybe it=E2=80=99s an example of what we= =E2=80=99ll find more tractable, once we have modular implicits.

    The problem: I have both compressed and plaintext files, and I want to run = a function over the uncompressed contents. I=E2=80=99d like a combinator th= at I can apply to the filename and the function, that will do the work of o= pening the file, calling the function, closing the file, etc.

    This isn=E2=80=99t so hard.

    1. define a type of READER (and two instances for plaintext and gzipped). This= is the equivalent of Rust=E2=80=99s =E2=80=9Cio::BufRead=E2=80=9D.

      module type READER =3D
        sig
          type in_channel
          val open_in : string -> in_channel
          val input_char : in_channel -> char
          val close_in : in_channel -> unit
        end
      let stdreader =3D (=
      module Stdlib : READER) ;;
      let gzreader =3D (m=
      odule Gzip : READER) ;;
      
    2. then define a type of =E2=80=9Cin channel user=E2=80=9D (=E2=80=9CICUSER=E2= =80=9D) and the generic version of it

      module type ICUSER =3D <=
      span style=3D"color: #000000; font-weight: bold;">sig
        type in_channel
        val use_ic : in_channel -> unit
      end
      module type GENERIC_ICUSER =3D functor (READER) -> (ICUSER with type in_channel =3D R.in_channel)
      
    3. then define our function that takes a generic in_channel, and uses it =E2= =80=93 =E2=80=9CCat=E2=80=9D

      module Cat(R : READER=
      ) : =
      ICUSER with type<=
      /span> in_channel =3D R.in_channel =3D struct
        type in_channel =3D R.in_channel
        let use_ic ic =3D
        let rec rerec () =3D
          match R.input_char ic with
            c -> print_char c ; rerec ()
          | exception End_of_file -> ()
        in rerec ()
      end
      
    4. And then write our =E2=80=9Cwith_input_file=E2=80=9D function, that takes a= filename, the function from #3, and applies it to either a normal in_chann= el, or one produced from a gzip-reader.

      let with_input_file fname (m=
      odule R : GENERIC_ICUSER) =3D
        let (module M : =
      READER) =3D
          if Fpath.(fname |> v |> has_ext "gz") then
            gzreader
          else stdreader in
        let open M in
        let ic =3D M.open_in fname in
        let module C =3D R(M) in
        try let rv =
      =3D C.use_ic ic in close_in ic ; rv
        with e -> close_in ic ; raise e
      

    And now we can use it:

    with_input_file  (module Cat) ;;
    with_input_file "foo.gz" (module Cat) ;;
    

    Easy-peasy. I don=E2=80=99t remember enough about the modular implicits pro= posal to remember if this can be cast in the supported language there, so I= suppose I should get some version of that code (or the newer versions from= others) up-and-running, and see if this can be made to work.

    hyphenrf asked and Chet_Murthy replied

    can=E2=80=99t we get rid of the GENERIC_ICUSER requirement and= just ask for functions that take a packed module of type READER

    by that I mean the signature of with_input_file becomes = string -> ((module READER) -> 'a) -> 'a

    It=E2=80=99s a good question, and as a newbie user of first-class modules, = I don=E2=80=99t know the typing rules well enough to answer. But I did try:

    let with_input_file' fname f=
     =3D
      let (module M : =
    READER) =3D
        if Fpath.(fname |> v |> has_ext "gz") then
          gzreader
        else stdreader in
      let open M in
      let ic =3D M.open_in fname in
      f (module M : READER) ic
    

    and got

    File "ioabs.ml",=
     line 96, characters 24-26:
    96 |   f (module M : READER) ic
                                 ^^
    Error: This expres=
    sion has type M.in_channel
           but an expression was expected of type 'a
           The type constructor M.=
    in_channel would escape its scope
    

    ETA: I remember in the modular implicits paper, that there was a lot of wra= ppering code in structs (that didn=E2=80=99t start off in structs). I wonde= r if that=E2=80=99s evidence that you really do have to =E2=80=9Cpush up=E2= =80=9D code to the module level in order to make it work.

    octachron then said

    You don=E2=80=99t need modular implicits to simplify your code. Your packed= module type is equivalent to:

    type channel =3D { input=
    _char: unit -> char; close_in: unit -> unit }
    type channel_generator =3D string ->  channel
    

    We could go fancy and manifest the type with an existential

    type 'a channel =3D
      { open_fn: string -> 'a; input_char: 'a -> char; close_in: 'a ->=
     unit }
    type chan =3D Any: 'a channel -> chan
    

    but this has mainly the advantage to illustrate the fact that you are never= using the non-existentially qualified 'a channel which means = that in the current version of your code, modular (explicits or) implicits = is not a good fit: we are not selecting a module to provide functions for a= type, we have an object (aka an existentially qualified record) with some = hidden inner type that we never need to know.

    c-cube later said

    I think it=E2=80=99s kind of counter-productive to want a in_channel<= /code> type at all. This is what I=E2=80=99ve been doing, more and more:

    module type INPUT =3D sig
      val read_char : unit -> char
      val read : bytes -> int -> int -> int
      val close : unit -> unit
    end
    
    type input =3D (modu=
    le INPUT)
    
    let open_file (file=
    name:string) : input =3D
      let ic =3D open_in filename in
      (module struct
        let read_char() =3D input_char ic
        let read =3D input ic
        let close() =3D close_in ic
     end)
    
    
    let do_sth (module<=
    /span> IN:INPUT) =3D
      IC.read_char ();
      IC.read …
    

    This behaves like classic objects in other languages and there=E2=80=99s no= complicated typing going on (what with each implementation having its own = channel type).

    Lwt.5.6.0 (and other Lwt packages)

    raphael-proust announced

    It is a real pleasure to announce the release of Lwt version 5.6.0 as well = as Lwt-domain.0.2.0, Lwt-ppx.2.1.0 and Lwt-react.1.2.0. With this release L= wt is now compatible with OCaml version 5.

    https://githu= b.com/ocsigen/lwt/releases/tag/5.6.0

    Thank you to the many contributors for the fixes, the improvements, and the= OCaml5 compatibility! Check out the changelog for full details on each con= tribution.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 86F40E0092 for ; Tue, 5 Jul 2022 09:42:43 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=Bq6D=XK=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: gNERnbf6dsuT9eEJYFn0k68oDPAl+PGBM4Tr2kw0FQ30yWLPqQZYySBYOvWh7gEHIllju2pRU4 cyJ4f5qlmnyFWegFqx+iJaCLigm7Z3OrADuYWszBY6XfQvD6f877Rb3lkaFofw9ZVo1l0UYnk/ kIVoXHtZ5tWOgDE8eap43Z/2WNAnCQJeBLazGRnc75TfNiWx1unvYXXtS58DSj8DIfk2mf7AAq 6M6JWmNNSqhcd2khuYJd0SE+j5L5+KnbEk+Xi+OipqWvZPQHOfbh6At6T31zJVLxpfbwFgQvkD OA49oXf3hAq315bnUcyPFsZx X-IPAS-Result: =?us-ascii?q?A0ArAACP6sNimCIeaIFaHQEBAQEJARIBBQUBgX4FAQsBg?= =?us-ascii?q?SBbKBkBZ1YuBwhEhE6JAIgNiViTNIERA08QAQMBDSwBDgQBAgQBAYIQgi9FG?= =?us-ascii?q?IU1Ah4GAQUyBg4BAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBA?= =?us-ascii?q?QEBAQEJCwkHBgwFEA4FPGRkBIFLBIF0CwcIJQ2CNQwMAwODdwEYCQoTAQE4G?= =?us-ascii?q?CMDFAEGAwIEDQEXAR4DARMBEhQGgmMBgxgDBQqRHJpLGjV6gTGBAYIIAQEGg?= =?us-ascii?q?T8BAwMLAkODdIFcCSSBAhcBhh9gTAGDEQmEEwInEIFVRIEVgikSP26CA0EHF?= =?us-ascii?q?wEBAQEBF4ERAQ8CAgEIRYMpF4JOjUmBFoQqhx8HOANHLxKBH24BCAQGBwoFM?= =?us-ascii?q?AYCDBgUBAITEk0GHAISDAoGFQ5CEhcMDwMSAxEBBwIJEggVKwgDAgMIAwIDK?= =?us-ascii?q?wIDFgkHCgMdCAocEhAUAgQRHgsIAxkeLAkCBA4DQAgLCgMRBAMTGAkWCBAEB?= =?us-ascii?q?gMILw0nCwMFDw0BBgMGAgUFAQMgAxQDBSQHAyEPJg0NBCIdAwMFJQMCAhsHA?= =?us-ascii?q?gIDAgYVBgICGFYuDQgECAQYHyQPBQIHLwUELwIeBAUGEQgCFgIGBAUCBAQWA?= =?us-ascii?q?hAIAggnFwcTMxkBBVkQCSEWBikQBQYVAyFJJgVFDyg0NjwsHxsKgRosCSIWA?= =?us-ascii?q?wQEAwIGGgMDIgIQKQYyAxUGLRUVEQYilzCEJAwJAwEiDgstBg9LBwMBERkBE?= =?us-ascii?q?xYBARcLLggFFg8KBAEKBBQSDBcEARgBAxYTAQoCCQEBLZISEScCAY1timiCY?= =?us-ascii?q?ZFbGWQ0B4NRgT4GDIgwgSKDS4k4iCODdYFQinOBSpZiIZZUIIksgRMJgkqTX?= =?us-ascii?q?U8rBIU4gU4pgQ9dDAczGjCDKwkKOwEDAg0BAgIDAQIBAgkBAQKHSIZVB4EfA?= =?us-ascii?q?QmBP4EDgmSBdTuFTD80AgEBNwIGAQoBAQMJhWMBAQUTCwGIfAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 r7sSg== IronPort-HdrOrdr: A9a23:+9qL9awvCI4DQTYgoTd9KrPwOb1zdoMgy1knxilNoH1uE/Bw+P re/8jzuSWetN9zYh8dcLK7VJVoKEm0naKdh7N6AV7IZmbbUQWTQb1K3M/JxTr8Eyfiss5RvJ 0BT5RD X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.92,245,1650924000"; d="scan'208,217";a="44246379" X-MGA-submission: =?us-ascii?q?MDFlzlvJQxMw1Pm96ybInAGvR/M3ciU9nTVBqk?= =?us-ascii?q?W+U0yTG2tnEKQ/uLlGDkB2w5BtG83LvCezd+7/ULYD9MwyL2m+6X/MCT?= =?us-ascii?q?O+hY4ebXQDRTZeUOY4k9Z6RkkmGXYFgLDkqu3S4hvyAwX/THDMGRXxVo?= =?us-ascii?q?2n3E25Skwtyj81sEbCfhkl1Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Jul 2022 09:42:42 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id DAD045605F0; Tue, 5 Jul 2022 09:42:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1657006960; bh=FEEjQcACaBcJj7klzvS9frsTOZtRC+MG06LsJbLk9Nw=; h=From:To:Subject:Date:Message-ID; b=AicIw00naJh7fQrbbUsYxjgs7LY3gn+lkExdoGwHBe9zt1DnzmoGPhJ2YyvG642gm j8t3wLm7+13yT7li1k2j3/+f06l1rIoW5QEEdm7+gJj+OGzvW5YlXnXQFn4Rg9lTk7 mUjhZ6yWrWIP6OQd09e/IaLEhNmlkZbDBW8tismg= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 05 Jul 2022 09:42:40 +0200 Message-ID: <87a69o3szz.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 5 09:42:41 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.497902, queueID=C3E27560617 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyOCB0byBKdWx5DQowNSwgMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpBbiBh bXVzaW5nIHVzZSBvZiBmaXJzdC1jbGFzcyBtb2R1bGVzOiByZWFkaW5nIGZyb20gcGxhaW50ZXh0 IGFuZCBjb21wcmVzc2VkIGZpbGVzDQpUTFMgc2lnbmF0dXJlIHdpdGggb3BhbTp0bHMNCk9wZW4g U291cmNlIHRvb2xpbmcgZW5naW5lZXIgYXQgSmFuZSBTdHJlZXQNCkR1bmUgaG93IHRvIGRlZmlu ZSBjdXN0b20gYnVpbGQgdGFzaw0KTHd0LjUuNi4wIChhbmQgb3RoZXIgTHd0IHBhY2thZ2VzKQ0K V2luZG93cy1mcmllbmRseSBPQ2FtbCA0LjEyIGRpc3RyaWJ1dGlvbiAtIERpc2t1diBPQ2FtbCAw LjEuMA0KT0NhbWxGb3JtYXQgV2ViIENvbmZpZ3VyYXRvcg0KUmVsZWFzZSBvZiBvcHRpbWwtdHJh bnNwb3J0DQpPbGQgQ1dODQoNCg0KQW4gYW11c2luZyB1c2Ugb2YgZmlyc3QtY2xhc3MgbW9kdWxl czogcmVhZGluZyBmcm9tIHBsYWludGV4dCBhbmQgY29tcHJlc3NlZCBmaWxlcw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bi1hbXVzaW5nLXVzZS1vZi1maXJzdC1jbGFzcy1tb2R1bGVzLXJlYWRpbmctZnJvbS1wbGFpbnRl eHQtYW5kLWNvbXByZXNzZWQtZmlsZXMvMTAwNzMvOT4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhy ZWFkLCBNYcOrbGFuIGFza2VkIGFuZCBTaW1vbiBDcnVhbmVzIHJlcGxpZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogICAgICAgIFlvdSBnb3QgbWUgY3VyaW91czogd2hhdOKAmXMgdGhlIHJlYXNvbiBm b3IgdXNpbmcgYQ0KICAgICAgICBmaXJzdC1jbGFzcyBtb2R1bGUgaGVyZSBpbnN0ZWFkIG9mIGEg cmVjb3JkIG9yIGFuIG9iamVjdD8NCg0KICBPZiBjb3Vyc2UhDQoNCiAg4oCiIGNvbXBhcmVkIHRv IHJlY29yZHMsIEkgZmluZCBmaXJzdC1jbGFzcyBtb2R1bGVzIHRvIGJlIGEgbG90IG1vcmUNCiAg ICBjb252ZW5pZW50IGZvciB0aGlzIHVzZSBjYXNlLiBJIHN0aWxsIHVzZSByZWNvcmRzIGZvciBf ZGF0YV8sIGJ1dCBhDQogICAgcmVjb3JkLW9mLWZ1bmN0aW9uIGlzIG9mdGVuIGxlc3MgY29udmVu aWVudC4gRm9yIGV4YW1wbGUsIG1vZHVsZXMNCiAgICBhbGxvdyB5b3UgdG8gdXNlIGBpbmNsdWRl JywgdGhleSBkaXJlY3RseSBoYW5kbGUgZG93bi1jYXN0aW5nIGFzIGENCiAgICB3YXkgdG8gaGlk ZSBpbnRlcm5hbCBzdGF0ZSAod2hlcmVhcyBmb3IgbW9kdWxlcyB5b3UgbmVlZCB0byBjbG9zZQ0K ICAgIG92ZXIgdmFsdWVzIGNyZWF0ZWQgYmVmb3JlIHRoZSByZWNvcmQpOyBtb2R1bGUgdHlwZXMg YXJlIHN0cnVjdHVyYWwsDQogICAgc28gSSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGRpc2Ft YmlndWF0aW9uLCB3aGVyZWFzIHJlY29yZHMgbmVlZA0KICAgIG1vcmUgY2FyZSB0aGVyZS4gSW4g dGVybXMgb2YgcGVyZm9ybWFuY2UgYm90aCBzZWVtIGV4YWN0bHkgdGhlIHNhbWUsDQogICAgZnJv bSBteSB0b3kgYmVuY2htYXJrcy4NCiAg4oCiIGNvbXBhcmVkIHRvIG9iamVjdHMsIGZpcnN0LWNs YXNzIG1vZHVsZXMgYXJlIGEgYml0IGxlc3MgY29udmVuaWVudA0KICAgIChubyBydW50aW1lLWZy ZWUgY2FzdCwgbm8gdHJ1ZSBpbmhlcml0YW5jZS9taXhpbiksIGJ1dCBMU1AgYW5kIG90aGVyDQog ICAgdG9vbHMgYXJlIGZyYWdpbGUuIEluIGFkZGl0aW9uLCBpbnZva2luZyBhbiBvYmplY3QgbWV0 aG9kIHNlZW1zIHRvDQogICAgYmUgcm91Z2hseSB0d2ljZSBhcyBzbG93IGFzIGEgcmVjb3JkL21v ZHVsZSBmaWVsZCBhY2Nlc3Mg4oCUIEkgc3VwcG9zZQ0KICAgIGl0J3MgYmVjYXVzZSB0aGUgbGF0 dGVyIGlzIGp1c3QgYW4gYWNjZXNzIHZpYSBvZmZzZXQuIFRoYXQncyBvbiBhDQogICAgbWljcm8g YmVuY2htYXJrIHNvIGluIHJlYWxpdHkgaXQgbWlnaHQgYmUgd29yc2UuDQoNCg0KVExTIHNpZ25h dHVyZSB3aXRoIG9wYW06dGxzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Rscy1zaWduYXR1cmUtd2l0aC1vcGFt LXRscy85Mzk5LzEwPg0KDQoNCk1hcmN1cyBSb2hybW9zZXIgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBqdXN0IGltcGxlbWVudGVkIGtleSBnZW5lcmF0aW9uDQogIDxodHRw czovL2NvZGViZXJnLm9yZy9tcm8vc2VwcG8vc3JjL2JyYW5jaC9kZXZlbG9wL2xpYi9hczIubWwj TDk1Pg0KDQoNCk9wZW4gU291cmNlIHRvb2xpbmcgZW5naW5lZXIgYXQgSmFuZSBTdHJlZXQNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvam9iLW9wZW4tc291cmNlLXRvb2xpbmctZW5naW5lZXItYXQtamFuZS1zdHJlZXQvMTAwODMv MT4NCg0KDQpZYXJvbiBNaW5za3kgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSdyZSBsb29r aW5nIHRvIGhpcmUgc29tZW9uZSB0byBqb2luIG91ciBidWlsZC1zeXN0ZW1zIHRlYW0gd2l0aCBh DQogIGZvY3VzIG9uIG9wZW4tc291cmNlIHRvb2xpbmcuIFdlIGN1cnJlbnRseSByZWxlYXNlIGFs bW9zdCBhIG1pbGxpb24NCiAgbGluZXMgb2YgY29kZSBvZiBvdXIgaW50ZXJuYWwgbGlicmFyaWVz IGFuZCB0b29scywgaW5jbHVkaW5nIHRoaW5ncw0KICBsaWtlIFNleHBsaWIsIEJhc2UsIENvcmUs IEFzeW5jLCBJbmNyZW1lbnRhbCwgQm9uc2FpLCBIYXJkY2FtbCwNCiAgbWVtdHJhY2Utdmlld2Vy LCBhbmQgcGF0ZGlmZi4NCg0KICBXZSBoYXZlIGludGVybmFsIHRvb2xpbmcgZm9yIG1vdmluZyBj b2RlIGZyb20gb3VyIGludGVybmFsDQogIHJlcG9zaXRvcmllcyB0byBHaXRodWIgYW5kIGZvciBw dWJsaXNoaW5nIHRvIG9wYW0sIGFuZCBmb3IgZmVycnlpbmcNCiAgaW5mb3JtYXRpb24gYmFjayBm cm9tIEdpdGh1YiB0byBvdXIgaW50ZXJuYWwgdG9vbHMsIHNvIHRoYXQgZGV2ZWxvcGVycw0KICBj YW4gbW9yZSBlYXNpbHkgYW5kIHByb21wdGx5IHJlc3BvbmQgdG8gUFJzIGFuZCBpc3N1ZXMgY29t aW5nIGZyb20gdGhlDQogIG91dHNpZGUuDQoNCiAgV2Ugd2FudCB0byBtYWtlIG9wZW4tc291cmNp bmcgb3VyIGNvZGUgYmV0dGVyIGFuZCBmYXN0ZXIsIHNvIGl0J3MNCiAgZWFzaWVyIGZvciB1cyB0 byB3b3JrIHdpdGggb3V0c2lkZSBjb250cmlidXRvcnMsIGFuZCBpbXByb3ZlbWVudHMgY2FuDQog IGdldCBvdXQgdG8gdGhlIGNvbW11bml0eSBtb3JlIHF1aWNrbHkuIFlvdXIgd29yayB3b3VsZCBi ZSB0byBtYWtlIG91cg0KICByZWxlYXNlcyBkZWxpZ2h0ZnVsbHkgZWFzeSBhbmQgcmVsaWFibGUh DQoNCiAgSSB3cm90ZSBhIGJpdCBtb3JlIGFib3V0IGl0IGhlcmU6DQoNCiAgPGh0dHBzOi8vdHdp dHRlci5jb20veW1pbnNreS9zdGF0dXMvMTUzNjc2NjAzMTMxMzczOTc3Nj9zPTIwJnQ9c0N5VWxI R0hPMXkzem5CaDRwbDBYdz4NCg0KICBJZiB5b3UncmUgaW50ZXJlc3RlZCwgZ28gYWhlYWQgYW5k IG1ha2UgYW4gW29yZGluYXJ5IGFwcGxpY2F0aW9uXSB0bw0KICBvdXIgc29mdHdhcmUgZW5naW5l ZXJpbmcgcm9sZSwgYW5kIG1lbnRpb24gdGhhdCB5b3UncmUgaW50ZXJlc3RlZCBpbg0KICAib3Bl bi1zb3VyY2UgdG9vbGluZyIuIFdlJ3JlIGhhcHB5IHRvIGhpcmUgZm9yIHRoaXMgcm9sZSBpbiBi b3RoDQogIExvbmRvbiBhbmQgTmV3IFlvcmsuDQoNCg0KW29yZGluYXJ5IGFwcGxpY2F0aW9uXQ0K PGh0dHBzOi8vd3d3LmphbmVzdHJlZXQuY29tL2pvaW4tamFuZS1zdHJlZXQvYXBwbHkvPg0KDQoN CkR1bmUgaG93IHRvIGRlZmluZSBjdXN0b20gYnVpbGQgdGFzaw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kdW5lLWhvdy10by1kZWZpbmUtY3VzdG9tLWJ1aWxkLXRh c2svMTAwOTIvMT4NCg0KDQpjbm1hZGUgZXhwbGFpbmVkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBkdW5lIGhhcyB2ZXJ5IHBvd2VyZnVsIGV4 dGVuc2lvbnMsIGJ1dCB0aGUgZG9jdW1lbnRhdGlvbiBkb2Vzbid0IHRlbGwNCiAgeW91IGRpcmVj dGx5LiBUb2RheSBJJ2xsIHNoYXJlIGEgc3BlY2lmaWMgZXhhbXBsZSBvZiBob3cgd2UgY2FuIG1h a2UNCiAgZHVuZSBkbyBtYW55IHRoaW5ncyB3aXRoIGEgZHVuZSBjb25maWd1cmF0aW9uLg0KDQog IEZvciBleGFtcGxlDQoNCiAg4oCiIFB1Ymxpc2ggY29tcGlsZWQgZG9jdW1lbnRzIHRvIG91ciBk b2N1bWVudGF0aW9uIHNlcnZlcg0KICDigKIgU2VuZGluZyBlbWFpbCBub3RpZmljYXRpb25zIHRv IGVtYWlsIGdyb3Vwcw0KICDigKIgU2VuZGluZyBTTVMgbm90aWZpY2F0aW9ucyB0byBhZG1pbmlz dHJhdG9ycw0KICDigKIgQnVpbGQgYSBkb2N1bWVudCBhbmQgb3BlbiBhIGJyb3dzZXIgdG8gcHJl dmlldyB0aGUgZG9jdW1lbnQgcGFnZQ0KDQogIExldCdzIHN0YXJ0IHdpdGggYW4gZXhhbXBsZSwg d2UgY3JlYXRlIGEgZHVuZSBmaWxlIGluIHRoZSByb290DQogIGRpcmVjdG9yeSBvZiBvdXIgcHJv amVjdCwgd2hpY2ggeW91IG1heSBub3QgaGF2ZSBvcmlnaW5hbGx5LCB5b3UgaGF2ZQ0KICB0byBj cmVhdGUgYSBuZXcgb25lLCB3ZSBlbnRlciB0aGUgZm9sbG93aW5nDQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiA7IG5vdyB3ZSB0ZWxsIHlvdSBob3cgdG8gZGVmaW5lIGEgY3VzdG9tIHJ1bGUN CiAg4pSCIDsgcnVsZSBzdGFydCB3aXRoIChydWxlICkNCiAg4pSCIChydWxlDQogIOKUgiA7IChh bGlhcyBpcyBwb2ludCAgdGhlIGNvbW1hbmQgbmFtZSAsIHNvIHlvdSBjYW4gcnVuIHRoaXMgcnVs ZSBieSBjYWxsICBkdW5lIGJ1aWxkIEBkb2NvcGVuDQogIOKUgiAgKGFsaWFzIGRvY29wZW4pDQog IOKUgiAgOyBmb2xsb3dpbmcgbGluZSBpcyB2ZXJ5IGltcG9ydGFudCwgaXQgdGVsbCBkdW5lIGRv IG5vdCBjYWNoZSB0aGlzIGJ1aWxkIGNvbW1hbmQsIHNvIGl0IHdpbGwgcnVubmluZyBldmVyeSBj YWxsDQogIOKUgiB3aXRob3V0IGFueSBjYWNoZQ0KICDilIIgIChkZXBzICh1bml2ZXJzZSkpDQog IOKUgiAgOyBhY3Rpb24gIChzeXN0ZW0gIHRvIHRvbGQgc3lzdGVtIHJ1biBjb21tYW5kIGJ5IGBz aGAgaW4geW91ciBMaW51eC9NYWNPUywgd2luZG93cyB1c2VyIG1heSBydW5uaW5nIGNtZC5leGUN CiAg4pSCICA7IGNkIC4uLy4uIGlzIGNoYW5nZSB0aGUgYmFzZSBkaXJlY3Rvcnkgb2YgdGhlIHJ1 bm5pbmcgY29tbWFuZCAsb3IgdGhlIGRlZmF1bHQgZGlyZWN0b3J5IHdpbGwgYmUgX2J1aWxkL2Rl ZmF1bHQNCiAg4pSCICAoYWN0aW9uIChzeXN0ZW0gImNkIC4uLy4uICYmIHB3ZCAmJiAgZHVuZSBi dWlsZCBAZG9jICYmIG9wZW4gX2J1aWxkL2RlZmF1bHQvX2RvYy9faHRtbC9pbmRleC5odG1sIiAp KQ0KICDilIIgKQ0KICDilIIgOyBlbmQgb2Ygb25lIHBpZWNlIG9mIHJ1bGUNCiAg4pSCIA0KICDi lIIgOyBhbmQgd2UgZGVmaW5lIG1vcmUgYW5kIG1vcmUgcnVsZSBhcyB3ZSB3YW50DQogIOKUgiAo cnVsZQ0KICDilIIgICAoYWxpYXMgd2hvYW1pKQ0KICDilIIgICAoZGVwcyAodW5pdmVyc2UpKQ0K ICDilIIgICAoYWN0aW9uIChzeXN0ZW0gInVuYW1lIC1hO3dob2FtaSIpKQ0KICDilIIgKQ0KICDi lJTilIDilIDilIDilIANCg0KICBJbiB0aGlzIGV4YW1wbGUsIHdlIGRlZmluZSB0d28gcnVsZXMs IHRoZSBydWxlcyBhcmUgdGhlIHRhc2tzIHRoYXQNCiAgZHVuZSBjYW4gcmVjb2duaXplLCBpbiBk dW5lLCBpdCBpcyBjYWxsZWQgcnVsZXMNCg0KICBCZWNhdXNlIGl0IGlzIGEgY3VzdG9tIGJ1aWxk IGNvbW1hbmQsIHdlIHVzZSBhbGlhcyB0byB0YWtlIGEgdW5pcXVlDQogIGFuZCBub24tcmVwZWF0 aW5nIGFsaWFzLg0KDQogIFRoZSBmaXJzdCBidWlsZCBjb21tYW5kIGlzIHRvIGJ1aWxkIHRoZSBk b2N1bWVudCBhbmQgb3BlbiB0aGUgYnJvd3Nlcg0KICBwcmV2aWV3Lg0KDQogIE91ciBhbGlhcyBp cyBkb2NvcGVuDQoNCiAgVGhlbiBkZXBzIHdlIGFkZCB1bml2ZXJzZSB0byB0ZWxsIGR1bmUgdGhh dCB5b3UgZG9uJ3Qgd2FudCB0byBjYWNoZQ0KICBhbmQgZ2l2ZSBtZSBhIG5ldyBidWlsZCBldmVy eSB0aW1lLiBJZiB5b3UgZG9uJ3QgYWRkIHRoaXMgbGluZSwgZHVuZQ0KICB3aWxsIG9ubHkgZ2l2 ZSB5b3Ugb25lIGJ1aWxkLCBhbmQgdGhlbiBiZWNhdXNlIG9mIHRoZSBjYWNoZSwgeW91IHdvbid0 DQogIGJlIGFibGUgdG8gZXhlY3V0ZSBpdCBsYXRlci4NCg0KICBhY3Rpb24gZm9sbG93aW5nIGJ5 IHN5c3RlbSBoZXJlLCBhY3Rpb24gaXMgdGhlIGNvbW1hbmQgdG8gc3RhcnQsDQogIHN5c3RlbSBt ZWFucyB0byB1c2UgdGhlIHN5c3RlbSBzaGVsbCAod2luZG93cyBpcyBjbWQsIGxpbnV4IG1hY29z IGlzDQogIHNoKSB0byBnaXZlIHlvdSB0aGUgZXhlY3V0aW9uIG9mIHRoZSBjb2RlIHlvdSBzcGVj aWZ5Lg0KDQogIFlvdSBjYW4gc2VlIHRoZSBmaXJzdCB3ZSBhcmUgZmlyc3QgY2hhbmdlIHRoZSBk aXJlY3RvcnkgdG8gdGhlIHByb2plY3QNCiAgcm9vdCBkaXJlY3RvcnkgW2JlY2F1c2UgdGhlIGRl ZmF1bHQgZGlyZWN0b3J5IGlzIF9idWlsZC9kZWZhdWx0XSwgYW5kDQogIHRoZW4gd2UgcGVyZm9y bSB0aGUgYnVpbGQgZG9jdW1lbnQgZ2VuZXJhdGlvbiwgYW5kIHRoZW4gb3BlbiBvcGVuIHRoZQ0K ICBnZW5lcmF0ZWQgaHRtbCBwYWdlLg0KDQogIFRoZSBmaXJzdCBidWlsZCBjb21tYW5kIGlzIHRo aXMsIGlmIHlvdSB3YW50IHRvIHBlcmZvcm0gdGhlIGZpcnN0DQogIGJ1aWxkIHRhc2ssIHlvdSBj YW4gdHlwZQ0KDQogIGBkdW5lIGJ1aWxkIEBkb2NvcGVuJw0KDQogIFRoZW4gb3VyIHNlY29uZCBi dWlsZCBjb21tYW5kLCByZWxhdGl2ZWx5IHNpbXBsZSwgd2l0aCByZWZlcmVuY2UgdG8NCiAgdGhl IGZpcnN0LCB3ZSBjYW4gYWRkIGEgbG90IG9mIGJ1aWxkIGNvbW1hbmRzIHdlIHdhbnQgdG8gYWRk IGluc2lkZQ0KICB0aGlzIGR1bmUgY29uZmlndXJhdGlvbiBmaWxlLg0KDQogIFdlIGp1c3QgbmVl ZCB0byBzcGVjaWZ5IGRpZmZlcmVudCBhbGlhcyBhbGlhc2VzIGZvciB0aGVtLCBubw0KICBkdXBs aWNhdGlvbi4NCg0KICBUaGUgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbiBhbHNvIHNwZWNpZmllcyBz b21lIG90aGVyIGF2YWlsYWJsZQ0KICBjb21tYW5kcywgSSB3b24ndCBnbyBpbnRvIHRoZW0gb25l IGJ5IG9uZS4gU2luY2UgSSBwcmVmZXIgdG8gdXNlIHNoZWxsDQogIHNjcmlwdHMsIEkgcmVhbGx5 IG9ubHkgbmVlZCB0aGUgc3lzdGVtIHRvIGV4ZWN1dGUgbXkgc2hlbGwgc2NyaXB0cyBmb3INCiAg bWUuDQoNCg0KTHd0LjUuNi4wIChhbmQgb3RoZXIgTHd0IHBhY2thZ2VzKQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbHd0LTUtNi0wLWFuZC1vdGhlci1sd3QtcGFja2Fn ZXMvMTAwNzcvMj4NCg0KDQpSYXBoYcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KTHd0IDUuNi4xDQrilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBWZXJzaW9u IDUuNi4xIG9mIHRoZSBMd3QgcGFja2FnZSBoYXMgYmVlbiByZWxlYXNlZC4gVGhpcyB2ZXJzaW9u DQogIGNvbnRhaW5zIGEgZml4IGZvciBhIGJ1ZyBpbnRyb2R1Y2VkIGluIDUuNi4wIHdoZXJlYnkg ZGV2bnVsbCBmaWxlDQogIGRlc2NyaXB0b3Igd291bGQgYmUgY2xvc2VkIGR1cmluZyBzb21lIHVz ZXMgb2YgYEx3dF9wcm9jZXNzJy4NCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0 L3JlbGVhc2VzL3RhZy81LjYuMT4NCg0KDQpXaW5kb3dzLWZyaWVuZGx5IE9DYW1sIDQuMTIgZGlz dHJpYnV0aW9uIC0gRGlza3V2IE9DYW1sIDAuMS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi13aW5kb3dzLWZyaWVuZGx5LW9j YW1sLTQtMTItZGlzdHJpYnV0aW9uLWRpc2t1di1vY2FtbC0wLTEtMC84MzU4LzIxPg0KDQoNCmpi ZWNrZm9yZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSAwLjQuMCByZWxlYXNlIG9mIERpc2t1diBPQ2Ft bCBmb3IgV2luZG93cyB1c2VycyBpcyBhdmFpbGFibGUhIEl0DQogIGlzIHVzYWJsZSBlbm91Z2gg dGhhdCBJJ3ZlIGxldCBteSBzY2hvb2wtYWdlIGtpZHMgKGVsZW1lbnRhcnkgdGhyb3VnaA0KICBo aWdoIHNjaG9vbCkgaW5zdGFsbCBpdCBhbmQgZ28gdGhyb3VnaCBzb21lIHR1dG9yaWFscy4NCg0K ICA8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21sLWluc3RhbGxlci1vY2FtbCNyZWFkbWU+ DQoNCiAgVGhlIGxpbmtzIHRvIHRoZSBkb2N1bWVudGF0aW9uIGFyZSBhdmFpbGFibGUgZnJvbSB0 aGUgYWJvdmUgbGluayBhcw0KICB3ZWxsLg0KDQogIEhlcmUgYXJlIHRoZSBvbmUtdGltZSBpbmNv bnZlbmllbmNlcyBpZiB5b3UgaW5zdGFsbCB0aGlzIHJlbGVhc2U6DQogIDEuIFRoZSBidWlsdC1p biBhbnRpdmlydXMgV2luZG93cyBEZWZlbmRlciB0cmVhdHMgbmV3bHkgc2lnbmVkDQogICAgIGJp bmFyaWVzIGxpa2Ugc3BhbS4gVGhlcmUgbmVlZHMgdG8gYmUgZW5vdWdoIHBlb3BsZSB3aG8gIlJl cG9ydA0KICAgICB0aGlzIGZpbGUgYXMgc2FmZSIgYmVmb3JlIHRoZSBiaW5hcmllcyBhcmUgdHJ1 c3RlZC4gL0lmIHlvdSBkbw0KICAgICBub3RoaW5nIGJ1dCBtYXJrIGl0IHNhZmUgb3IgaW5zdGFs bCBpdCBvbiBXaW5kb3dzLCB5b3UgYXJlIGhlbHBpbmcNCiAgICAgb3RoZXJzIS8NCiAgMi4gVGhl IGluc3RhbGxlciB3aWxsIGF1dG9tYXRpY2FsbHkgaW5zdGFsbCB0aGUgVmlzdWFsIFN0dWRpbyBj b21waWxlcg0KICAgICBpZiBuZWVkZWQuIEJ1dCBWaXN1YWwgU3R1ZGlvIHNvbWV0aW1lcyByZXF1 aXJlcyBhIHJlYm9vdC4gVGhlDQogICAgIGluc3RydWN0aW9ucyB3aWxsIHRlbGwgeW91IGlmIHlv dSBuZWVkIHRoZSByZWJvb3QuDQogIDMuIFRoZSBWaXN1YWwgU3R1ZGlvIENvZGUgT0NhbWwgcGx1 Z2luIGRlZmF1bHRzIHRvIGV4cGVjdGluZyBhIGxlZ2FjeQ0KICAgICBgb2NhbWxlbnYnIHByb2dy YW0gb24gV2luZG93cy4gWW91IGhhdmUgdG8gc2VhcmNoIGZvciBgb2NhbWxlbnYnIGluDQogICAg IFZpc3VhbCBTdHVkaW8gQ29kZSBTZXR0aW5ncyBhbmQgZGlzYWJsZSBpdC4gVGhpcyBzaG91bGQg aGF2ZSBhIGZpeCwNCiAgICAgYnV0IG5vdCBpbiB0aW1lIGZvciB0aGlzIHJlbGVhc2UuDQoNCg0K V2luZG93cyBwYXJpdHkgd2l0aCBVbml4DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICAxLiBgb3BhbScg Y29tbWFuZHMgbGlrZSBgb3BhbSBpbnN0YWxsJyBzaG91bGQgd29yayB3aXRob3V0IGFueQ0KICAg ICB3cmFwcGVycy4gQnV0IHlvdSBzaG91bGQgY3JlYXRlIG5ldyBzd2l0Y2hlcyB3aXRoIGBvcGFt IGRrbWwgaW5pdCcNCiAgICAgKHNlZSBgLS1oZWxwJyBmb3Igb3B0aW9ucykuDQogIDIuIGBkdW5l JyBjb21tYW5kcyBsaWtlIGBkdW5lIGJ1aWxkJyBzaG91bGQgd29yayB3aXRob3V0IGFueQ0KICAg ICB3cmFwcGVycy4gVGhlIG9ubHkgaGljY3VwIGlzIHRoYXQgYWxpYXNlcyBsaWtlIGBkdW5lIGJ1 aWxkDQogICAgIEBydW50ZXN0JyBuZWVkIHRvIGJlIGVzY2FwZWQgaW4gUG93ZXJTaGVsbCBsaWtl Og0KICAgICDilIzilIDilIDilIDilIANCiAgICAg4pSCIGR1bmUgYnVpbGQgYEBydW50ZXN0DQog ICAgIOKUlOKUgOKUgOKUgOKUgA0KICAzLiBZb3UgaGF2ZSBwYXJ0aWFsIHN1cHBvcnQgaWYgeW91 ciBob21lIGRpcmVjdG9yeSBoYXMgc3BhY2VzLCBzaW5jZQ0KICAgICBpdCBpcyB2ZXJ5IGNvbW1v biBvbiBXaW5kb3dzIHRvIGhhdmUgeW91ciB1c2VybmFtZSBiZSBgRmlyc3ROYW1lDQogICAgIExh c3ROYW1lJy4gU28gZmFyIEkndmUgY29uZmlndXJlZC9wYXRjaGVkIG1vc3QgdGhpbmdzIHRvIHdv cmsgd2l0aA0KICAgICBzcGFjZXMsIGJ1dCB0aGVyZSBjb3VsZCBiZSBjb21tb24gcGFja2FnZXMg dGhhdCB3ZXJlIG1pc3NlZCwgYW5kDQogICAgIG9ubHkgTlRGUyBkcml2ZXMgd29yay4NCiAgNC4g T0NhbWwgNC4xMi4xLiBJJ2QgbGlrZSB0byB1cGdyYWRlIHRvIDQuMTMgb3IgNC4xNCwgYnV0IGhh dmluZw0KICAgICBzdXBwb3J0IGZvciBWaXN1YWwgU3R1ZGlvIENvZGUgZGVidWdnaW5nIHdpdGgg WzQuMTItb25seQ0KICAgICBvY2FtbGVhcmx5YmlyZF0gaXMgbW9yZSBpbXBvcnRhbnQsIGVzcGVj aWFsbHkgZm9yIHRyYWRpdGlvbmFsDQogICAgIFdpbmRvd3MgdXNlcnMuDQogIDUuIER1bmUgMi45 LjMuIEkndmUgYnVuZGxlZCBpbiBzdXBwb3J0IGluIDIuOS4zIGZvciBmc3dhdGNoL2lub3RpZnkg c28NCiAgICAgdGhhdCBgZHVuZSBidWlsZCAtLXdhdGNoJyB3b3JrcyBvbiBXaW5kb3dzLiBOb3Ro aW5nIGlzIGJsb2NraW5nIGFuDQogICAgIHVwZ3JhZGUgdG8gMy54IGV4Y2VwdCB0aW1lIChpZS4g bm90IG5vdykgYW5kIGEgcmVhc29uLg0KICA2LiBPcGFtIDIuMS4yIHBsdXMgc29tZSBQUnMgdGhh dCBhcmUgcGVuZGluZyB0aGUgbm90LXlldC1yZWxlYXNlZA0KICAgICB2ZXJzaW9uIDIuMi4NCiAg Ny4gR2l0IHBlcmZvcm1hbmNlIG9uIFdpbmRvd3MganVzdCBzdWNrcy4gSXQgaXMgbGlrZSBzb21l b25lIGRlc2lnbmVkDQogICAgIGl0IGZvciBhIExpbnV4IGtlcm5lbCDwn6SoLiBBcHBhcmVudGx5 IFtHaXQgRlNNb25pdG9yIGluIDIuMzcuMF0gY2FuDQogICAgIGJlIGVuYWJsZWQgdG8gc3BlZWQg dGhpbmdzIHVwLCBidXQgSSBkb24ndCBoYXZlIHJlYWwtd29ybGQNCiAgICAgZXhwZXJpZW5jZSB3 aXRoIGl0IGJlY2F1c2UgaXQgd2FzIGp1c3QgcmVsZWFzZWQgeWVzdGVyZGF5Lg0KICA4LiBNU1lT Miwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIHdpdGggYHdpdGgtZGttbCBiYXNoJywgbm93IHVzZXMg dGhlDQogICAgIENMQU5HNjQgdmFyaWFudC4gVGhlcmUgYXJlIHRob3VzYW5kcyBvZiB1cC10by1k YXRlIHRoaXJkLXBhcnR5DQogICAgIGxpYnJhcmllcyBhdmFpbGFibGUgYW5kLCB1bmxpa2UgTWlu R1csIHRoZXkgYXJlIEFCSSBjb21wYXRpYmxlIHdpdGgNCiAgICAgdGhlIGRvbWluYW50IFdpbmRv d3MgY29tcGlsZXIgKE1TVkMpLiBBbmQgaWYgeW91IGFyZSBpbnRlcmVzdGVkDQogICAgIHRoZXJl IGlzIGFuIFtvY2FtbHZlcnNlIEhlbHAgV2FudGVkXSB0byBhZGQgdGhlIENMQU5HNjQgY29tcGls ZXIgYXMNCiAgICAgYW4gYWx0ZXJuYXRpdmUgdG8gdGhlIEFkbWluaXN0cmF0b3ItcmVxdWlyaW5n LCByZWJvb3QtbmVlZGluZyBNU1ZDDQogICAgIGNvbXBpbGVyLg0KDQogIFRoYW5rcyB0byBPQ2Ft bCBTb2Z0d2FyZSBGb3VuZGF0aW9uIGZvciBzcG9uc29yaW5nIHRoaXMhDQoNCiAgMC40Lnggd2ls bCBiZSB0aGUgbGFzdCBtaW5vciB2ZXJzaW9ucyBvZiB0aGUgInByZXZpZXciLiBJJ2xsIGJlDQog IHNoaWZ0aW5nIHRvIGNsb3Npbmcgb3V0IGFueSBzaG93LXN0b3BwaW5nIGJ1Z3MsIGFuZCB1cGRh dGluZyB0aGUNCiAgdmFyaW91cyBXaW5kb3dzIG9uYm9hcmRpbmcgZ3VpZGVzIGZvciBPQ2FtbCB0 byBvZmZpY2lhbGx5IGluY2x1ZGUNCiAgRGlza3V2IE9DYW1sLg0KDQoNCls0LjEyLW9ubHkgb2Nh bWxlYXJseWJpcmRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2hhY2t3YWx5L29jYW1sZWFybHliaXJk L2lzc3Vlcy8zOD4NCg0KW0dpdCBGU01vbml0b3IgaW4gMi4zNy4wXQ0KPGh0dHBzOi8vZ2l0aHVi LmJsb2cvMjAyMi0wNi0yOS1pbXByb3ZlLWdpdC1tb25vcmVwby1wZXJmb3JtYW5jZS13aXRoLWEt ZmlsZS1zeXN0ZW0tbW9uaXRvci8+DQoNCltvY2FtbHZlcnNlIEhlbHAgV2FudGVkXQ0KPGh0dHBz Oi8vb2NhbWx2ZXJzZS5naXRodWIuaW8vY29udGVudC9oZWxwX3dhbnRlZC5odG1sPg0KDQoNCk9D YW1sRm9ybWF0IFdlYiBDb25maWd1cmF0b3INCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sZm9y bWF0LXdlYi1jb25maWd1cmF0b3IvMTAxMDMvMT4NCg0KDQpMb3VpcyBSb2Now6kgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJdCBpcyBteSBwbGVhc3VyZSB0byBzaGFyZSB3aXRoIHlvdSB0aGUgW29j YW1sZm9ybWF0IGNvbmZpZ3VyYXRvcl0gYXMNCiAgYSB3ZWIgcGFnZS4NCg0KICBPY2FtbGZvcm1h dCBpcyBhIGdyZWF0IHRvb2wgdGhhdCByZWFsbHkgbWFrZXMgZWRpdGluZyBjb2RlIGEgbW9yZQ0K ICBwbGVhc2FudCBleHBlcmllbmNlLiBJdCBoYXMgYSBidW5jaCBvZiBkaWZmZXJlbnQgYnVpbHQg aW4gcHJvZmlsZXMgYW5kDQogIG1hbnkgYWRkaXRpb25hbCBvcHRpb25zIHRvIGZpbmUgdHVuZSBo b3cgdGhlIGNvZGUgc2hvdWxkIGxvb2sNCiAgbGlrZS4gV2hpbGUgSSB3b3VsZCBlbmNvdXJhZ2Ug bW9zdCBwZW9wbGUgYW5kIG5ldyBwcm9qZWN0cyB0byB1c2Ugb25lDQogIG9mIHRoZSBkZWZhdWx0 IHByb2ZpbGVzLCB0aGUgbWFueSBvcHRpb25zIGFyZSBoZWxwZnVsIHdoZW4NCiAgdHJhbnNpdGlv bmluZyBhbiBleGlzdGluZyBjb2RlYmFzZS4gVW5mb3J0dW5hdGVseSBpdCBpcyBub3Qgc3VwZXIg ZWFzeQ0KICB0byBmaWd1cmUgb3V0IHdoaWNoIG9wdGlvbnMgdG8gdXNlIGFuZCBob3cgdG8gY29t YmluZSB0aGVtLiAgVGhlcmUgYXJlDQogIFs1OCBwYXJhbWV0ZXJzXSEgSSd2ZSBzcGVudCBhIGxv bmcgdGltZSB0cnlpbmcgZGlmZmVyZW50IGNvbWJpbmF0aW9ucw0KICBieSBjaGFuZ2luZyBhbiBv cHRpb24gaW4gbXkgLm9jYW1sZm9ybWF0LCBydW5uaW5nIGBkdW5lIGJ1aWxkIEBmbXRgLA0KICBj aGVja2luZyB0aGUgY29kZSwgZ29pbmcgYmFjayB0byB0aGUgZmlyc3Qgc3RlcOKApiBJdCBpcyBh IHRlZGlvdXMNCiAgd29yay4gU28gSSBkZWNpZGVkIHRvIG1ha2UgYSBzaW1wbGUgd2ViIGludGVy ZmFjZSB3aXRoIGFsbCBvZiB0aGUNCiAgb3B0aW9ucyBhdmFpbGFibGUgYW5kIGEgZmFzdGVyIGZl ZWRiYWNrIGxvb3AuDQoNCiAgPGh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL3N0YW5k YXJkMTEvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvMi8yNGU4OTFlOWUxNDAwZDRhNDdkZWJm OWUzNGIzZWE0MTRiZWJmNDE4XzJfMTM4MHg4MjYuanBlZz4NCg0KICBUaGFua3MgdG8ganNfb2Zf b2NhbWwgdGhlIHRhc2sgd2FzIG5vdCB0b28gY29tcGxpY2F0ZWQuIE9jYW1sZm9ybWF0DQogIGNh biBiZSBjb21waWxlZCB0byBqYXZhc2NyaXB0LCB0aGVyZSBpcyBub3RoaW5nIHNwZWNpYWwgdG8g ZG8uIFdoaWNoDQogIG1lYW5zIGV2ZXJ5dGhpbmcgY2FuIGJlIGRvbmUgaW4gdGhlIGJyb3dzZXIs IHRoZSBjb2RlIHdvbid0IGxlYWsgdG8NCiAgYW55b25lLCB0aGVyZSBpcyBubyBuZWVkIHRvIG1h aW50YWluIGEgc2VydmVyLCBhbmQgdGhlIHJlc3VsdCB3aWxsIGJlDQogIGd1YXJhbnRlZWQgdG8g YmUgaWRlbnRpY2FsIGFzIGEgZm9ybWF0dGluZyB3aXRoIHRoZSBjbGkgdG9vbC4NCg0KICBUaGUg Y29uZmlndXJhdGlvbiBjYW4gYmUgc2V0IHRocm91Z2ggdGV4dCAoanVzdCBwdXQgdGhlIGNvbnRl bnQgb2YNCiAgeW91ciBgLm9jYW1sZm9ybWF0YCBpbiB0aGUgdGV4dCBib3gpIGFuZCB0aHJvdWdo IGEgYnVuY2ggb2YNCiAgZHJvcGRvd24uIFRoZXkgd2lsbCBiZSBjb21iaW5lZCB0b2dldGhlci4g VGhlIGRyb3Bkb3duIHRha2VzDQogIHByZWNlZGVuY2Ugb3ZlciB0aGUgdGV4dHVhbCBjb25maWd1 cmF0aW9uIGlmIGFuIG9wdGlvbiBpcyBzZXQgaW4gYm90aC4NCg0KICBUaGUgcHJvamVjdCBoYXMg YmVlbiBzdGFydGVkIGFzIHBhcnQgb2YgdGhlICJvcGVuIHNvdXJjZSBkYXkiIGF0DQogIEFocmVm cyAod2UgdHJ5IHRvIGRlZGljYXRlIHNvbWUgdGltZSB0byBvcGVuIHNvdXJjZSBwcm9qZWN0cyB0 aGF0IHdlDQogIHVzZSBpbnRlcm5hbGx5KS4gSXQgaXMgc3RpbGwgaW4gaXRzIGluZmFuY3kuIFBs ZWFzZSBwYXJkb24gdGhlDQogIHRlcnJpYmxlIHN0eWxlLCBJIGFtIG5vdCBhIHdlYiBkZXZlbG9w ZXIgYW5kIGRpZG4ndCBoYXZlIHRpbWUgdG8gbWFrZQ0KICBpdCBsb29rIG5pY2VyIHlldC4gVGhl cmUgYXJlIHNvbWUgYW5ub3lpbmcgdGhpbmdzIHRvIGZpeCAobm8gZmVlZGJhY2sNCiAgd2hlbiB0 aGUgY29kZSBpcyBpbnZhbGlkIGFuZCBjYW4ndCBiZSBmb3JtYXR0ZWQpLCBhbmQgbWFueQ0KICBp bXByb3ZlbWVudHMgdG8gY29tZSAoYSB3YXkgdG8gZG93bmxvYWQgdGhlIGNvbmZpZ3VyYXRpb24g Zm9yDQogIGV4YW1wbGUpLiBCdXQgSSB0aGluayB0aGF0IGl0IGlzIGFscmVhZHkgd29ya2luZyB3 ZWxsIGVub3VnaCB0byBiZQ0KICB1c2VkIGJ5IG90aGVycy4NCg0KICBZb3UgY2FuIGZpbmQgdGhl IGNvbmZpZ3VyYXRvciBhdA0KICA8aHR0cHM6Ly9haHJlZnMuZ2l0aHViLmlvL29jYW1sZm9ybWF0 Lz4NCiAgVGhlIHNvdXJjZSBjb2RlIGlzIG9uIGdpdGh1YiBhdA0KICA8aHR0cHM6Ly9naXRodWIu Y29tL2FocmVmcy9vY2FtbGZvcm1hdC90cmVlL2FocmVmcy93ZWItdWkvYmluL3dlYi11aT4NCg0K ICBJZiB5b3UgbGlrZSBvY2FtbCBhbmQgd2FudCB0byBsb29rIGZvciBhIGpvYiwgd2UgaGF2ZSBz b21lIFtwb3NpdGlvbnMNCiAgYXZhaWxhYmxlXQ0KDQoNCltvY2FtbGZvcm1hdCBjb25maWd1cmF0 b3JdIDxodHRwczovL2FocmVmcy5naXRodWIuaW8vb2NhbWxmb3JtYXQvPg0KDQpbNTggcGFyYW1l dGVyc10NCjxodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2NhbWwtcHB4L29jYW1s Zm9ybWF0L21haW4vb2NhbWxmb3JtYXQtaGVscC50eHQ+DQoNCltwb3NpdGlvbnMgYXZhaWxhYmxl XSA8aHR0cHM6Ly9haHJlZnMuY29tL2pvYnM+DQoNCg0KUmVsZWFzZSBvZiBvcHRpbWwtdHJhbnNw b3J0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLW9mLW9wdGltbC10cmFuc3BvcnQvMTAxMjgv MT4NCg0KDQpJZ2FybmllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpISBbb3B0aW1sLXRyYW5zcG9ydF0gd2Fz IGp1c3QgcmVsZWFzZWQgb24gb3BhbS4gVGhpcyBsaWJyYXJ5IGJpbmRzDQogIEMrKyBwcmltaXRp dmVzIHRvIHNvbHZlIHRoZSBbb3B0aW1hbA0KICB0cmFuc3BvcnRhdGlvbl0oPGh0dHBzOi8vZW4u d2lraXBlZGlhLm9yZy93aWtpL1RyYW5zcG9ydGF0aW9uX3RoZW9yeV8obWF0aGVtYXRpY3MpPikN CiAgcHJvYmxlbSBiZXR3ZWVuIGZpbml0ZSB3ZWlnaHRlZCBwb2ludCBjbG91ZHMgKGkuZS4gZmlu aXRlDQogIG1lYXN1cmVzKS4gQ29uY3JldGVseSwgdGhpcyBhbGxvd3MgdG8gbGlmdCBhbnkgW21l dHJpY10gb24gYSBiYXNlDQogIHNwYWNlIHRvIGEgbWV0cmljIG9uIGZpbml0ZWx5IHN1cHBvcnRl ZCBwcm9iYWJpbGl0eSBtZWFzdXJlcyBvdmVyIHRoYXQNCiAgYmFzZSBzcGFjZS4gKEluIGZhY3Qs IHRoZSBsaWJyYXJ5IHdvcmtzIHdpdGggY29zdCBmdW5jdGlvbnMgbW9yZQ0KICBnZW5lcmFsIHRo YW4gdGhhdCBzYXRpc2Z5aW5nIHRoZSBtZXRyaWMgYXhpb21zLikgVGhlIGxpYnJhcnkgYWxzbw0K ICBvdXRwdXRzIGFuIG9wdGltYWwgY291cGxpbmcgYmV0d2VlbiBhbnkgdHdvIHN1Y2ggbWVhc3Vy ZXMuIE9wdGltYWwNCiAgdHJhbnNwb3J0YXRpb24gaGFzIG1hbnkgYXBwbGljYXRpb25zIGluIHN0 YXRpc3RpY3MsIGdyYXBoaWNzLA0KICBvcHRpbWl6YXRpb24sIGV0Yy4NCg0KICBUaGUgbGlicmFy eSBjb25zaXN0cyBpbiBiaW5kaW5ncyB0bw0KICA8aHR0cHM6Ly9naXRodWIuY29tL25ib25uZWVs L25ldHdvcmtfc2ltcGxleD4NCg0KDQpbb3B0aW1sLXRyYW5zcG9ydF0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9pZ2Fybmllci9vcHRpbWwtdHJhbnNwb3J0Pg0KDQpbbWV0cmljXSA8aHR0cHM6Ly9lbi53 aWtpcGVkaWEub3JnL3dpa2kvTWV0cmljX3NwYWNlPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2Vu ZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVz XS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWls LCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5lXS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoN CltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4N Cg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3Rp bmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 28 to July 05, 2= 022.

    An amusing use of first-class modules: reading from plaintext = and compressed files

    Continuing this thread, Ma=C3=ABlan asked and Simon C= ruanes replied

    You got me curious: what=E2=80=99s the reason for using a first-class modul= e here instead of a record or an object?

    Of course!

    • compared to records, I find first-class modules to be a lot more conven= ient for this use case. I still use records for d= ata, but a record-of-function is often less convenient. For example,= modules allow you to use include, they directly handle down-c= asting as a way to hide internal state (whereas for modules you need to clo= se over values created before the record); module types are structural, so = I don't need to worry about disambiguation, whereas records need more care = there. In terms of performance both seem exactly the same, from my toy benc= hmarks.
    • compared to objects, first-class modules are a bit less convenient (no = runtime-free cast, no true inheritance/mixin), but LSP and other tools are = fragile. In addition, invoking an object method seems to be roughly twice a= s slow as a record/module field access =E2=80=94 I suppose it's because the= latter is just an access via offset. That's on a micro benchmark so in rea= lity it might be worse.

    Open Source tooling engineer at Jane Street

    Yaron Minsky announced

    We're looking to hire someone to join our build-systems team with a focus o= n open-source tooling. We currently release almost a million lines of code of our internal libraries and tools,= including things like Sexplib, Base, Core, Async, Incremental, Bonsai, Hardcaml, memtrace-viewer, and patdiff.

    We have internal tooling for moving code from our internal repositories to = Github and for publishing to opam, and for ferrying information back from Github to our internal tools, so that develo= pers can more easily and promptly respond to PRs and issues coming from the outside.

    We want to make open-sourcing our code better and faster, so it's easier fo= r us to work with outside contributors, and improvements can get out to the community more quickly. Your work would= be to make our releases delightfully easy and reliable!

    I wrote a bit more about it here:

    https://twitter.com/yminsky/status/1536766031= 313739776?s=3D20&t=3DsCyUlHGHO1y3znBh4pl0Xw

    If you're interested, go ahead and make an ordinary application to our software engineering role, and mention that you're interested in "op= en-source tooling". We're happy to hire for this role in both London and New York.

    Dune how to define custom build task

    cnmade explained

    dune has very powerful extensions, but the documentation doesn't tell you d= irectly. Today I'll share a specific example of how we can make dune do many things with a dune configuration.

    For example

    • Publish compiled documents to our documentation server
    • Sending email notifications to email groups
    • Sending SMS notifications to administrators
    • Build a document and open a browser to preview the document page

    Let's start with an example, we create a dune file in the root directory of= our project, which you may not have originally, you have to create a new one, we enter the following

    ; now we tell you how to define a custom rule
    ; rule start with (rule )
    (rule
    ; (alias is point  the command name , so you can run this rule by call  dun=
    e build @docopen
     (alias docopen)
     ; following line is very important, it tell dune do not cache this build c=
    ommand, so it will running every call
    without any cache
     (deps (universe))
     ; action  (system  to told system run command by `sh` in your Linux/MacOS,=
     windows user may running cmd.exe
     ; cd ../.. is change the base directory of the running command ,or the def=
    ault directory will be _build/default
     (action (system "cd ../.. && pwd &&  dune build @doc &=
    & open _build/default/_doc/_html/index.html" ))
    )
    ; end of one piece of rule
    
    ; and we define more and more rule as we want
    (rule
      (alias whoami)
      (deps (universe))
      (action (system "uname -a;whoami"))
    )
    

    In this example, we define two rules, the rules are the tasks that dune can= recognize, in dune, it is called rules

    Because it is a custom build command, we use alias to take a unique and non= -repeating alias.

    The first build command is to build the document and open the browser previ= ew.

    Our alias is docopen

    Then deps we add universe to tell dune that you don't want to cache and giv= e me a new build every time. If you don't add this line, dune will only give you one build, and then because of the c= ache, you won't be able to execute it later.

    action following by system here, action is the command to start, system m= eans to use the system shell (windows is cmd, linux macos is sh) to give you the execution of the code you specify.

    You can see the first we are first change the directory to the project root= directory [because the default directory is _build/default], and then we perform the build document generation, and = then open open the generated html page.

    The first build command is this, if you want to perform the first build tas= k, you can type

    dune build @docopen

    Then our second build command, relatively simple, with reference to the fir= st, we can add a lot of build commands we want to add inside this dune configuration file.

    We just need to specify different alias aliases for them, no duplication.

    The official documentation also specifies some other available commands, = I won't go into them one by one. Since I prefer to use shell scripts, I really only need the system to execute my sh= ell scripts for me.

    Lwt.5.6.0 (and other Lwt packages)

    Rapha=C3=ABl Proust announced

    Lwt 5.6.1

    Version 5.6.1 of the Lwt package has been released. This version contains a= fix for a bug introduced in 5.6.0 whereby devnull file descriptor would be closed during some uses of Lwt_proce= ss.

    https://githu= b.com/ocsigen/lwt/releases/tag/5.6.1

    Windows-friendly OCaml 4.12 distribution - Diskuv OCaml 0.1.0<= /h2>

    jbeckford announced

    The 0.4.0 release of Diskuv OCaml for Windows users is available! It is usa= ble enough that I've let my school-age kids (elementary through high school) install it and go through some tutori= als.

    https://g= ithub.com/diskuv/dkml-installer-ocaml#readme

    The links to the documentation are available from the above link as well.

    Here are the one-time inconveniences if you install this release:

    1. The built-in antivirus Windows Defender treats newly signed binaries li= ke spam. There needs to be enough people who "Report this file as safe" bef= ore the binaries are trusted. If you do nothing but mark it safe or inst= all it on Windows, you are helping others!
    2. The installer will automatically install the Visual Studio compiler if = needed. But Visual Studio sometimes requires a reboot. The instructions wil= l tell you if you need the reboot.
    3. The Visual Studio Code OCaml plugin defaults to expecting a legacy ocamlenv program on Windows. You have to search for ocamlenv= in Visual Studio Code Settings and disable it. This should have a f= ix, but not in time for this release.

    Windows parity with Unix

    1. opam commands like opam install should work w= ithout any wrappers. But you should create new switches with opam dkml init (see = --help for options).
    2. dune commands like dune build should work without= any wrappers. The only hiccup is that aliases like dune build @runtest need to be esc= aped in PowerShell like:

      dune build `@runtest
      
    3. You have partial support if your home directory has spaces, since it is= very common on Windows to have your username be FirstName LastName. So far I've configured/patched most things to work with spaces, but = there could be common packages that were missed, and only NTFS drives work.=
    4. OCaml 4.12.1. I'd like to upgrade to 4.13 or 4.14, but having support f= or Visual Studio Code debugging with 4.12-only ocamlearlybird is more important, = especially for traditional Windows users.
    5. Dune 2.9.3. I've bundled in support in 2.9.3 for fswatch/inotify so tha= t dune build --watch works on Windows. Nothing is blocking an = upgrade to 3.x except time (ie. not now) and a reason.
    6. Opam 2.1.2 plus some PRs that are pending the not-yet-released version = 2.2.
    7. Git performance on Windows just sucks. It is like someone designed it f= or a Linux kernel =F0=9F=A4=A8. Apparently Git= FSMonitor in 2.37.0 can be enabled to speed things up, but I don't hav= e real-world experience with it because it was just released yesterday.
    8. MSYS2, which can be accessed with with-dkml bash, now uses= the CLANG64 variant. There are thousands of up-to-date third-party librari= es available and, unlike MinGW, they are ABI compatible with the dominant W= indows compiler (MSVC). And if you are interested there is an ocamlverse Help Wanted= to add the CLANG64 compiler as an alternative to the Administrator-req= uiring, reboot-needing MSVC compiler.

    Thanks to OCaml Software Foundation for sponsoring this!

    0.4.x will be the last minor versions of the "preview". I'll be shifting to= closing out any show-stopping bugs, and updating the various Windows onboarding guides for OCaml to officially incl= ude Diskuv OCaml.

    OCamlFormat Web Configurator

    Louis Roch=C3=A9 announced

    It is my pleasure to share with you the ocamlformat configurator as a web page.

    Ocamlformat is a great tool that really makes editing code a more pleasant = experience. It has a bunch of different built in profiles and many additional options to fine tune how the code sho= uld look like. While I would encourage most people and new projects to use one of the default profiles, the many o= ptions are helpful when transitioning an existing codebase. Unfortunately it is not super easy to figure out which o= ptions to use and how to combine them. There are 58 parameters! I've spent a long time trying different combinations by changing an option in my= .ocamlformat, running `dune build @fmt`, checking the code, going back to the first step… It is a tedious wor= k. So I decided to make a simple web interface with all of the options available and a faster feedback loop.

    =3D"24e891e9e1400d4a47debf9e34b3ea414bebf418_2_1380x826.jpeg"

    Thanks to js_of_ocaml the task was not too complicated. Ocamlformat can be = compiled to javascript, there is nothing special to do. Which means everything can be done in the browser, the code = won't leak to anyone, there is no need to maintain a server, and the result will be guaranteed to be identical as a f= ormatting with the cli tool.

    The configuration can be set through text (just put the content of your `.o= camlformat` in the text box) and through a bunch of dropdown. They will be combined together. The dropdown takes prece= dence over the textual configuration if an option is set in both.

    The project has been started as part of the "open source day" at Ahrefs (we= try to dedicate some time to open source projects that we use internally). It is still in its infancy. Please pardon= the terrible style, I am not a web developer and didn't have time to make it look nicer yet. There are some an= noying things to fix (no feedback when the code is invalid and can't be formatted), and many improvements to come (a w= ay to download the configuration for example). But I think that it is already working well enough to be used by = others.

    You can find the configurator at https://ahrefs.github.io/ocamlformat/
    The source code is on github at https://github.com/ahrefs/ocamlformat/= tree/ahrefs/web-ui/bin/web-ui

    If you like ocaml and want to look for a job, we have some positions available

    Release of optiml-transport

    Igarnier announced

    Hi! optiml-transpo= rt was just released on opam. This library binds C++ primitives to solve the [optimal transportation](https://en.wikipedia.org/wiki/Transportation_th= eory_(mathematics)) problem between finite weighted point clouds (i.e. finite measures). Concretely, this allows to li= ft any metric on a base= space to a metric on finitely supported probability measures over that base space. (In fact, the library works with cost functi= ons more general than that satisfying the metric axioms.) The library also outputs an optimal coupling between any tw= o such measures. Optimal transportation has many applications in statistics, graphics, optimization, etc.

    The library consists in bindings to https://github.com/nbonneel/network_simplex

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6E54BE034D for ; Tue, 12 Jul 2022 09:59:30 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=r8nt=XR=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: nbDwD+qG/O9uY/rwhlvmv1t5n5VnpgzdZv/w6CA6E3ChzSM2PjBJbDEvvZBSTJSDBd5OkyzEo0 6tMMMcHUV2K8rLXUhh02JVB+A7Bv3wq6liZikjHy4rAQv46/yGFyziRFXzQKK0DvZwzs0Xinvp cN9VuOnjsklkMCqMABQwixrHrM9zfzkvnbTvrnyIegizMUY1J24MwI4C63Mxpi20Bq8b2dtCNc ZN6MSzpkz7jUBvTRuAkOqF843EA2T6OVg+dKQrPdTJHPdWcEog/0e1k2tatHCOuqbRaF1GW7w8 BaHtB4DbOpriRhhfhHCAjGkY X-IPAS-Result: =?us-ascii?q?A0AYAQCnKM1imCIeaIFaEwEBgkOBIYEDGQFnVhYYBwhFh?= =?us-ascii?q?E6JAIgNgRaIQoZ/jCEUgREDTxABAwENLAEOBAECBAEBhQSFDwIeBgEFMQcOA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEBAQEBCQsJBwYMB?= =?us-ascii?q?RAOBTxkZASBSwSBdAs0DYI1DAwDA4N3ARgJChMBAS8JGCMDFAEGAwIRARcBH?= =?us-ascii?q?hcBEhkBgmMBgxgDBQuSE5saeoExgQGCCAEBBoE/AQMCAQIJAgIDGCUBg3SBX?= =?us-ascii?q?AkkgRmGIGBMAYMRCYQTAicQgVVEgRWCKUoHboJACxcBAQEBAYEoARECAQYCA?= =?us-ascii?q?kODKYJlkleIOgc4A0cvEoEfbAEIBgYHCgUwBgIMGBQEAhMSTQYWAhIMCgYTD?= =?us-ascii?q?kEQFwwPAxIDDwEHAgkQCBIlCAMCAwgDAgMmAgMWCQ4DHQgKGBIQEgIEERoLC?= =?us-ascii?q?AMWPwkCBA4DQAgOAxEEAw8YCRIIEAQGAzIMJQsDBQ8NAQYDBgIFBQEDIAMUA?= =?us-ascii?q?wUkBwMhDyYNDQQiHQMDBSUDAgIbBwICAwIGFQYCAhhUOQgECAQrJA8FAgcvB?= =?us-ascii?q?QQvAh4EBQYRCAIWAgYEBQIEBBYCEAgCCCcXBxMzGQEFWRAJIRYGJxAFBhUDI?= =?us-ascii?q?UcmBUUPKDQ2PCwfGwqBFSwJIhYDBAQDAgYaAwMiAhApBjEDFQYpFRQaEwkqg?= =?us-ascii?q?QMJAgMZBiKYOoQjCQQiDj5NFAMBERkcDgEBIAI2KgMHBAEKBToOFSITAQoLA?= =?us-ascii?q?pIbNScCjW+KaIJhkV19NAeDUYE+BgyIMIEijQOIJIVFjD2WYyGWViCJLIETC?= =?us-ascii?q?YJKlFoEBAuFKYFOGgR3I3AzGjBDgmgJRQEDAg0BAgIDAQIBAgkBAQKOJINrg?= =?us-ascii?q?mSBdTuFTD80AgEBNwIGAQoBAQMJhWMBAQUTCwGGNYFtWgEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:G0770KwP9l7bWTM+qFp6t+exwCrEfRIJ4+MujC+fZmUNrF6WrkVWy mAWCGmBbKzcZWagKIxzbdnkp04Cv57WzdJiQQpv+1hgHilAwSbnLYTAfx2oZ0t+DeWaERk5t 51GAjXkBJppJpMJjk71atANlVEliefQAOCU5NfsYkidfyc9IMsaoU8lyrRRbrJA24DjWVvS4 Imq+qUzBXf8s9JKGjJMg068gEg31BjCkGtwUosWOJinFHeH/5UkJMp3yZOZdxMUcaEIdgKOf Nsv+Znilo/vE7jBPfv++lrzWhVirrc/pmFigFIOM0SpqkAqSiDfTs/XOdJEAXq7hQllkPhIz f9TicyLWTwYGYTv285HDDp4KTlXaPguFL/veRBTsOSW3xSAa3zo0uljB0EwPJQF96BwG24mG f4wcWpcKEnb26TtmPTgFoGAhex7RCXvFLglgSk112HfEaMWe8XbRKHb+dJT3DExn91DW/HEa J8QbTNpKg/LYxhOJks/ApUjmuylnT/6Ly0er0iazUYyyzSOllApjeC1WDbTUv6LHs8WmGSCn E7t00b7AzcrO8XP7iXQpxpAgceWwXKqB9JNfFGizdZhiViXg2gSEwE+Tkq+ufD/i0ikWtsZJ VZ8x8Y1ha0irQqzSd3sQxCzoHiFpwMRHd1KHIXW9T1h1ILt5iyHOjg/XgVwT/UF9+VsGh8K7 EegyoaB6SNUjJWZTneU97GxpDy0ODQIIWJqWcPiZVdZizUEiN1o5i8jXuqPA4bp3oOoRGCYL ySi9nRk3+17Ydsjjv3TwLzRv967jrbzJuLfzj/WRSeC9Ap/a4++D2BDwQmCtK0YRGp1ZvJnu HVBl8XbwvoHC5qA/BFhrc0IDOjv//GBISHRil5pHoA8+nKq4XHLkWFsDNNWeRYB3iUsIGGBj KrvVeR5v8c7AZdSRfUrC79d8uxzpUQaKfzrV+rPcv1FaYVreQmM8UlGPBDNgD2zzBJ2z/piY f93lPpA615EVcyLKxLoHI8gPUMDnXhirY8ubcyqlkT6i+r2iIC9Ge5ebDNikdzVHIvd/FSEr IYAXyd74w9SVuTibzO/zGLgBQ5iEJTPPriv85Y/XrfaemJOQThxY9eMn+9JU9E7zsx9y7eZl lngCxQw4Aeu2hXvd17QAlg9M+yHYHqKhS9hVcDaFQz2iyFLjEfGxPp3SqbbipF2qrQ7laQvF 5HouayoW5xyd9gOwBxFBbGVkWCoXE3DadumM3X3bT4hUYRnQgCVqNbochG2qXsECTexvsYl5 bj8xkXcW5VaH1ZuC8PfafSOyVKtvClGybkqBhCSe9QDKl/x9IVKKjDqiqNlKc87LxielCCR0 BybAEtFqOSU+901/dDFiLqqtYCsF+ciTENWE3OCsuSuMi3L4meowYlBSfuFOzfHWzqsqqmlY OxUydD6MeEGzQ8a49omS+4zwPtntdX1prJcwgB1J1nxbgymWuF6P32L/chTrakRlLVXjg27B xCU8d5ANLTVZc7oHQJDJAchaejfh/gYliOItKYwMBy8/Chz7aaKWkVUPgCRhWpaNrQsaNEpx uIoucg37Q2ji0tzYobW1HgMr2ncfGYdV6gHt40BBNG5gAQcymZEPc7WBBjw7czdcN5LKEQrf mSZifaQnbha3UaeIXM/GWKXhLhYlc1IoBdO3UMPLFSPm8PYi7kwxhIIqWY7SQFczxNm1eNvO zkyZx0lf/3Wpzo41tJeW22MGh1aAEPL8ELGy2wPyD/TQX6uWzGfN2Y6I+uMoBsU/m80kuK3J 11EJLsJkAoGff0dGgM3SRcjs/vnXMB8/Q3Emdm6EoKCBZZSjf/NnPq1fWRRw/f4KZpZuaEFj bACECVMhWnTPykNpaY2EM+fiaRWTwqLTICHaep58vlPRQkwZxnrsQVj6CmNlgdlP/vO4FO1A MxoJ9tSWlK5zinmQvUzHrYCefks9BI2zINqR44H7lLqf1dSQvSFfX4QGuXDaLcXfuhT IronPort-HdrOrdr: A9a23:dtKghql5y2Wk32AdJ8AjHy1xQ8HpDfP9imdD5ihNYBxZY6Wkvu i0lvUayhP4zB4NMUtQw+xoS5PwNE80lKQFkLX5Uo3SIDUO0lHFEGhd1/qt/9SNIVyHygcZ79 YcT0CRYOeAVmSTo67BkU2F+vwbsZy6GDjCv5aH859VJTsaMp2JBW9Ce0Gm+zRNNU977PkCZe ShD6h81kWdkC8sH4XLRkXtNtKrz7ag+/yHEH12ZW9DmW3+60LQ1Fe5KWnj4v55aUID/V4Myx mHr+WT3NTojxjP8G6v64al1eUhpDKO8Ko5OCSz4PJlZgkE8jzYFPUTZ1Tuhl0IidDq01osmM TBuFMYIsp+r0nJdmWeqQf212DboX0Twk6n8lOeiWbuuojBWTw3T/BZjYZieB3D5yMbzZlB+Z MO5G6fv4daFlf4gSrwo+LQXxVRi0KorRMZ4KcuZ3c0a/pQVFaPl+1vm399IdMyDQb944AjHK 1FCsXZ7PFaGGnqG0zxjy1d0firVXQ3ElO4TlMZusqTugIm60xR/g8ewogWhX0A9I0wIqM0pd j5Dg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.92,265,1650924000"; d="scan'208,217";a="45240500" X-MGA-submission: =?us-ascii?q?MDEoE0KweqqaG2q6Gpevq4sik8cAwftqkhOcx1?= =?us-ascii?q?zXL3I8qKH48CiEnjwFyF1Ofdl3fYTzXzf2BoNzCBMnHV6iyHIccMESGm?= =?us-ascii?q?wbbdPw8n9427jVpkLE7HqjxhER/auyAlnbwtiSYlXju6/1CONKuExK3B?= =?us-ascii?q?71mTWGI81pcSkpj5drqos9EQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Jul 2022 09:59:29 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D94375647D6; Tue, 12 Jul 2022 09:59:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1657612768; bh=Hpo8eCtgTd2jFJpGYdhTRQID9DkL0bLWlLR721wHY3Y=; h=From:To:Subject:Date:Message-ID; b=o+YZ9EWwwB3kkdhxj6rF0XmDCXDxowbGskAgkZi6t+DoVbkyjqEnFP1e7Ohpfn/us jIZ8NeB/dxQ34W09qQ8r3xDqzYPam+w6Qos+dip167Mgb/gS1u8GUUBO1TrqN6z2y5 iD4suvTuKuCqHArgDyUGSMfkia4CStv2nFqgGn8U= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 12 Jul 2022 09:59:28 +0200 Message-ID: <87h73mn4m7.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 12 09:59:29 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.448229, queueID=262EE5647DA X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 05 to 12, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dune how to define custom build task Timedesc 0.8.0 - modern date time handling containers 3.9 OBazl 2.0.0-alpha-1 (Building OCaml SW with Bazel) QCheck 0.19 Opam-cross-windows now supports OCaml 4.14.0! Other OCaml News Old CWN Dune how to define custom build task =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: cnmade explained =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 dune has very powerful extensions, but the documentation doesn't tell you directly. Today I'll share a specific example of how we can make dune do many things with a dune configuration. For example =E2=80=A2 Publish compiled documents to our documentation server =E2=80=A2 Sending email notifications to email groups =E2=80=A2 Sending SMS notifications to administrators =E2=80=A2 Build a document and open a browser to preview the document page Let's start with an example, we create a dune file in the root directory of our project, which you may not have originally, you have to create a new one, we enter the following =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ; now we tell you how to define a custom rule =E2=94=82 ; rule start with (rule ) =E2=94=82 (rule =E2=94=82 ; (alias is point the command name , so you can run this rule = by call dune build @docopen =E2=94=82 (alias docopen) =E2=94=82 ; following line is very important, it tell dune do not cache = this build command, so it will running every call =E2=94=82 without any cache =E2=94=82 (deps (universe)) =E2=94=82 ; action (system to told system run command by `sh` in your = Linux/MacOS, windows user may running cmd.exe =E2=94=82 ; cd ../.. is change the base directory of the running command= ,or the default directory will be _build/default =E2=94=82 (action (system "cd ../.. && pwd && dune build @doc && open _= build/default/_doc/_html/index.html" )) =E2=94=82 ) =E2=94=82 ; end of one piece of rule =E2=94=82=20 =E2=94=82 ; and we define more and more rule as we want =E2=94=82 (rule =E2=94=82 (alias whoami) =E2=94=82 (deps (universe)) =E2=94=82 (action (system "uname -a;whoami")) =E2=94=82 ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In this example, we define two rules, the rules are the tasks that dune can recognize, in dune, it is called rules Because it is a custom build command, we use alias to take a unique and non-repeating alias. The first build command is to build the document and open the browser preview. Our alias is docopen Then deps we add universe to tell dune that you don't want to cache and give me a new build every time. If you don't add this line, dune will only give you one build, and then because of the cache, you won't be able to execute it later. action following by system here, action is the command to start, system means to use the system shell (windows is cmd, linux macos is sh) to give you the execution of the code you specify. You can see the first we are first change the directory to the project root directory [because the default directory is _build/default], and then we perform the build document generation, and then open open the generated html page. The first build command is this, if you want to perform the first build task, you can type `dune build @docopen' Then our second build command, relatively simple, with reference to the first, we can add a lot of build commands we want to add inside this dune configuration file. We just need to specify different alias aliases for them, no duplication. The official documentation also specifies some other available commands, I won't go into them one by one. Since I prefer to use shell scripts, I really only need the system to execute my shell scripts for me. Timedesc 0.8.0 - modern date time handling =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of Timedesc 0.8.0. Timedesc is a very comprehensive date time handling library with good support of time zone. [Homepage] [Homepage] Features =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Timestamp and date time handling with platform independent time= zone support =E2=80=A2 Subset of the IANA time zone database is built into this libr= ary =E2=80=A2 Supports Gregorian calendar date, ISO week date, and ISO ordinal date =E2=80=A2 Supports nanosecond precision =E2=80=A2 ISO8601 parsing and RFC3339 printing Main changes since 0.6.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Significantly reduced size of time zone database by using a cus= tom compression scheme =E2=80=A2 Many thanks to @glennsl for the proposed scheme at issue [#46] =E2=80=A2 This yields reduction of roughly 82% for same date period. The exact range of years included has been tuned slightly as well and I've lost track of the exact size after compilation. =E2=80=A2 Significantly reduced the number of dependencies, and moved JS,= JSON code into separate packages =E2=80=A2 Removed dependencies: `fmt', `containers', `oseq' =E2=80=A2 Introduced `sexplib' dependency for sexp handling consequen= tly as previously containers `CCSexp' was used =E2=80=A2 Moved JSON code into `timedesc-json' package along with Yojson dependency =E2=80=A2 Moved `tzlocal' and `tzdb' stuff into their own separate pack= ages (`timedesc-tzlocal' and `timedesc-tzdb' respectively) =E2=80=A2 Moved JS tzlocal backend into `timedesc-tzlocal-js' (along wi= th JS specific dependencies) [#46] Quality of life changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Updated string conversion functions based on pretty printers wh= ich raise `Date_time_cannot_deduce_offset_from_utc' to raise the exception instead of returning `None' =E2=80=A2 This simplifies the handling as return type is now simply just `string' =E2=80=A2 And for serious stuff users are expected to use only unambigu= ous date times anyway, which would not trigger this exception =E2=80=A2 Added ISO8601 printing facilities to `Timestamp' module for consistency =E2=80=A2 They are just aliases to the RFC3339 printers containers 3.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that containers 3.9 has just been released. Containers is a lightweight, modular extension of the stdlib that tries to remains compatible with it. Containers is starting to sprout some serialization primitives: it now has codecs for Bencode and CBOR. This release also contains a revamp of the testlib system (bye qtest) and the use of ocamlformat, for potential contributors who enjoy that. Containers should also be compatible with OCaml 5.0. OBazl 2.0.0-alpha-1 (Building OCaml SW with Bazel) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gregg Reynolds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've tagged alpha versions of OBazl [rules_ocaml] and [tools_opam]. The best way to start exploring is via [demos_obazl], which contains over 100 mostly simple demo/test programs, many of which are commented. Three simple commands get you configured and then `bazel test test' runs all the tests. Tested on MacOS 12.4 and Ubuntu 20. Documentation is still in progress but there is useful info at [The OBazl Book]. Lot's of things to say about this version but I'll stick to one point of interest. The four basic OCaml compilers are modeled by Bazel's platforms and toolchains mechanisms. Two of the compilers are actually cross-compilers (e.g. `ocamlc.opt' runs on the system arch but targets the OCaml vm), so to pick a compiler you tell OBazl which buildhost and targethost platforms you want. I've predefined configurations in [.bazelrc]; for example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 build:bcnc --host_platform=3D@opam//tc/host/build:bc =E2=94=82 build:bcnc --platforms=3D@opam//tc/host/target:nc =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which means to select the `ocamlopt.byte' (cross-)compiler, pass `--config=3Dbcnc'. Kinda cool IMHO. Maybe overkill for the basic compilers, but the mechanism is essential to support remote builds, custom compiler implementations and genuine cross-compilers. Feedback welcome. [rules_ocaml] [tools_opam] [demos_obazl] [The OBazl Book] [.bazelrc] QCheck 0.19 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to share the release of QCheck 0.19 - a library for property-based testing in OCaml in the style of Haskell's QuickCheck. =E2=80=A2 GitHub repo: =E2=80=A2 Documentation: The 0.19 release brings a range of new features and improvements detailed below and combines the effort of several individual contributors. It is now available on opam. Release notes: =E2=80=A2 new features and feature extensions =E2=80=A2 add optional `debug_shrink' parameters in alcotest interface = and expose default `debug_shrinking_choices' in test runners =E2=80=A2 add missing `?handler' parameter to `Test.check_cell_exn' =E2=80=A2 add an option `retries' parameter to `Test.make' et al. for checking a property repeatedly while shrinking. This can be useful when testing non-deterministic code. =E2=80=A2 add `tup2' to `tup9' for generators =E2=80=A2 add `Test.make_neg' for negative property-based tests, that a= re expected not to satisfy the tested property. =E2=80=A2 add environment variable `QCHECK_LONG_FACTOR' similar to `QCHECK_COUNT' =E2=80=A2 rename `Gen.opt' to `Gen.option' but keep the old binding for compatibility. =E2=80=A2 shrinker changes =E2=80=A2 recursive `list' shrinker with better complexity =E2=80=A2 `string' shrinker reuses improved `list' shrinker and adds `char' shrinking =E2=80=A2 function shrinker now shrinks default entry first and benef= its from `list' shrinker improvements =E2=80=A2 replacing the linear-time `char' shrinker with a faster one reusing the bisecting `int' shrinker algorithm =E2=80=A2 add `Shrink.char_numeral' and `Shrink.char_printable' =E2=80=A2 add shrinking for `char arbitrary~s ~char', `printable_char= ', and `numeral_char' =E2=80=A2 bug fixes =E2=80=A2 fix function generation affecting reproducability =E2=80=A2 fix distribution of `QCheck2.printable' which would omit cert= ain characters =E2=80=A2 use `Float.equal' for comparing `float~s in the ~Observable' module underlying function generators. =E2=80=A2 documentation updates: =E2=80=A2 clarify upper bound inclusion in `Gen.int_bound' and `Gen.int_range' =E2=80=A2 clarify `printable_char' and `Gen.printable' distributions =E2=80=A2 add missing `string_gen_of_size' and `small_printable_string' documentation =E2=80=A2 document `QCheck_alcotest.to_alcotest' =E2=80=A2 fix documented size distribution for `arbitrary' generators `string_gen', `string', `printable_string', `numeral_string', `list', and `array' =E2=80=A2 fix exception documentation for `check_result', `check_cell_e= xn', and `check_exn' =E2=80=A2 fix documentation for the distribution of `Gen.printable' and `printable_char' =E2=80=A2 fix documentation for the shrinking behaviour of `QCheck2.printable' =E2=80=A2 internal and test suite changes =E2=80=A2 add additional expect and unit tests and refactor expect test suite =E2=80=A2 add a shrinker performance benchmark =E2=80=A2 remove `--no-buffer' option on `dune runtest' to avoid garbli= ng the test output =E2=80=A2 make test suite run on 32-bit architectures Opam-cross-windows now supports OCaml 4.14.0! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Romain Beauxis announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Bit of a late announcement but the `opam-cross-windows' project now supports the OCaml compiler version `4.14.0': The `opam-cross-windows' project is part of an initiative started by @whitequark to provide cross-compilation support to existing `opam' packages. This allows users to compile binaries for windows but also android and ios on a linux or macos host. Support for packages is a on best-effort basis and is always looking for more contributors. Adding a package can be a little tricky at times but, if your package uses `dune', the cross-compilation support there is pretty wonderful and makes it pretty easy to add cross-compiled packages. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [The Magic of Merlin] =E2=80=A2 [Thales Cyber@Station F Selection] =E2=80=A2 [Team Tarides Visits a 17th Century Chateau] =E2=80=A2 [Functional Conf 2022] =E2=80=A2 [OCaml 5 Alpha Release] =E2=80=A2 [Adding Merkle Proofs to Tezos] =E2=80=A2 [OCaml Matrix: A Virtual World] =E2=80=A2 [Tarides Sponsors 12th Annual Journ=C3=A9es Franciliennes] =E2=80=A2 [OCaml.org Reboot: User-Centric Design & Content] =E2=80=A2 [Lightning Fast with Irmin: Tezos Storage is 6x faster with 100= 0 TPS surpassed] =E2=80=A2 [Tarides Partners with 50inTech!] =E2=80=A2 [What's New in MirageOS 4!] [the ocaml.org blog] [The Magic of Merlin] [Thales Cyber@Station F Selection] [Team Tarides Visits a 17th Century Chateau] [Functional Conf 2022] [OCaml 5 Alpha Release] [Adding Merkle Proofs to Tezos] [OCaml Matrix: A Virtual World] [Tarides Sponsors 12th Annual Journ=C3=A9es Franciliennes] [OCaml.org Reboot: User-Centric Design & Content] [Lightning Fast with Irmin: Tezos Storage is 6x faster with 1000 TPS surpassed] [Tarides Partners with 50inTech!] [What's New in MirageOS 4!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 05 to 12, 2022.

    Dune how to define custom build task

    cnmade explained

    dune has very powerful extensions, but the documentation doesn't tell you d= irectly. Today I'll share a specific example of how we can make dune do many things with a dune configuration.

    For example

    • Publish compiled documents to our documentation server
    • Sending email notifications to email groups
    • Sending SMS notifications to administrators
    • Build a document and open a browser to preview the document page

    Let's start with an example, we create a dune file in the root directory of= our project, which you may not have originally, you have to create a new one, we enter the following

    ; now we tell you how to define a custom rule
    ; rule start with (rule )
    (rule
    ; (alias is point  the command name , so you can run this rule by call  dun=
    e build @docopen
     (alias docopen)
     ; following line is very important, it tell dune do not cache this build c=
    ommand, so it will running every call
    without any cache
     (deps (universe))
     ; action  (system  to told system run command by `sh` in your Linux/MacOS,=
     windows user may running cmd.exe
     ; cd ../.. is change the base directory of the running command ,or the def=
    ault directory will be _build/default
     (action (system "cd ../.. && pwd &&  dune build @doc &=
    & open _build/default/_doc/_html/index.html" ))
    )
    ; end of one piece of rule
    
    ; and we define more and more rule as we want
    (rule
      (alias whoami)
      (deps (universe))
      (action (system "uname -a;whoami"))
    )
    

    In this example, we define two rules, the rules are the tasks that dune can= recognize, in dune, it is called rules

    Because it is a custom build command, we use alias to take a unique and non= -repeating alias.

    The first build command is to build the document and open the browser previ= ew.

    Our alias is docopen

    Then deps we add universe to tell dune that you don't want to cache and giv= e me a new build every time. If you don't add this line, dune will only give you one build, and then because of the c= ache, you won't be able to execute it later.

    action following by system here, action is the command to start, system m= eans to use the system shell (windows is cmd, linux macos is sh) to give you the execution of the code you specify.

    You can see the first we are first change the directory to the project root= directory [because the default directory is _build/default], and then we perform the build document generation, and = then open open the generated html page.

    The first build command is this, if you want to perform the first build tas= k, you can type

    dune build @docopen

    Then our second build command, relatively simple, with reference to the fir= st, we can add a lot of build commands we want to add inside this dune configuration file.

    We just need to specify different alias aliases for them, no duplication.

    The official documentation also specifies some other available commands, = I won't go into them one by one. Since I prefer to use shell scripts, I really only need the system to execute my sh= ell scripts for me.

    Timedesc 0.8.0 - modern date time handling

    Darren announced

    I'm pleased to announce the release of Timedesc 0.8.0.

    Timedesc is a very comprehensive date time handling library with good suppo= rt of time zone.

    Homepage

    Features

    • Timestamp and date time handling with platform independent time zone su= pport
      • Subset of the IANA time zone database is built into this library
    • Supports Gregorian calendar date, ISO week date, and ISO ordinal date
    • Supports nanosecond precision
    • ISO8601 parsing and RFC3339 printing

    Main changes since 0.6.0

    • Significantly reduced size of time zone database by using a custom comp= ression scheme
      • Many thanks to @glennsl for the proposed scheme at issue #46
      • This yields reduction of roughly 82% for same date period. The exact ra= nge of years included has been tuned slightly as well and I've lost track o= f the exact size after compilation.
    • Significantly reduced the number of dependencies, and moved JS, JSON co= de into separate packages
      • Removed dependencies: fmt, containers, = oseq
        • Introduced sexplib dependency for sexp handling consequent= ly as previously containers CCSexp was used
      • Moved JSON code into timedesc-json package along with Yojs= on dependency
      • Moved tzlocal and tzdb stuff into their own s= eparate packages (timedesc-tzlocal and timedesc-tzdb respectively)
      • Moved JS tzlocal backend into timedesc-tzlocal-js (along w= ith JS specific dependencies)

    Quality of life changes

    • Updated string conversion functions based on pretty printers which rais= e Date_time_cannot_deduce_offset_from_utc to raise the excepti= on instead of returning None
      • This simplifies the handling as return type is now simply just st= ring
      • And for serious stuff users are expected to use only unambiguous date t= imes anyway, which would not trigger this exception
    • Added ISO8601 printing facilities to Timestamp module for = consistency
      • They are just aliases to the RFC3339 printers

    containers 3.9

    Simon Cruanes announced

    I'm happy to announce that containers 3.9 has just been released. Container= s is a lightweight, modular extension of the stdlib that tries to remains compatible with it.

    Containers is starting to sprout some serialization primitives: it now has = codecs for Bencode and CBOR. This release also contains a revamp of the testlib system (bye qtest) and the use of oca= mlformat, for potential contributors who enjoy that. Containers should also be compatible with OCaml 5.0.

    OBazl 2.0.0-alpha-1 (Building OCaml SW with Bazel)

    Gregg Reynolds announced

    I've tagged alpha versions of OBazl rules_ocaml and tools_opam. The best w= ay to start exploring is via demos_obazl, which contains over 100 mostly simple demo/test programs, many of which are commented. Three simple comma= nds get you configured and then bazel test test runs all the tests.

    Tested on MacOS 12.4 and Ubuntu 20.

    Documentation is still in progress but there is useful info at The OBazl Book.

    Lot's of things to say about this version but I'll stick to one point of in= terest. The four basic OCaml compilers are modeled by Bazel's platforms and toolchains mechanisms. Two of the com= pilers are actually cross-compilers (e.g. ocamlc.opt runs on the system arch but targets the OCaml vm), = so to pick a compiler you tell OBazl which buildhost and targethost platforms you want. I've predefined configurations in .bazelrc; for example:

    build:bcnc --host_platform=3D@opam//tc/host/build:bc
    build:bcnc --platforms=3D@opam//tc/host/target:nc
    

    which means to select the ocamlopt.byte (cross-)compiler, pass= --config=3Dbcnc.

    Kinda cool IMHO. Maybe overkill for the basic compilers, but the mechanism = is essential to support remote builds, custom compiler implementations and genuine cross-compilers.

    Feedback welcome.

    QCheck 0.19

    Jan Midtgaard announced

    I'm happy to share the release of QCheck 0.19 - a library for property-base= d testing in OCaml in the style of Haskell's QuickCheck.

    The 0.19 release brings a range of new features and improvements detailed b= elow and combines the effort of several individual contributors.

    It is now available on opam.

    Release notes:

    • new features and feature extensions
      • add optional debug_shrink parameters in alcotest interface= and expose default debug_shrinking_choices in test runners
      • add missing ?handler parameter to Test.check_cell_ex= n
      • add an option retries parameter to Test.make = et al. for checking a property repeatedly while shrinking. This can be useful when testing non-deterministic code.
      • add tup2 to tup9 for generators
      • add Test.make_neg for negative property-based tests, that = are expected not to satisfy the tested property.
      • add environment variable QCHECK_LONG_FACTOR similar to QCHECK_COUNT
      • rename Gen.opt to Gen.option but keep the old= binding for compatibility.
      • shrinker changes
        • recursive list shrinker with better complexity
        • string shrinker reuses improved list shrinker= and adds char shrinking
        • function shrinker now shrinks default entry first and benefits from list shrinker improvements
        • replacing the linear-time char shrinker with a faster one = reusing the bisecting int shrinker algorithm
        • add Shrink.char_numeral and Shrink.char_printable
        • add shrinking for char arbitrary~s ~char, printable_= char, and numeral_char
    • bug fixes
      • fix function generation affecting reproducability
      • fix distribution of QCheck2.printable which would omit cer= tain characters
      • use Float.equal for comparing float~s in the ~Observ= able module underlying function generators.
    • documentation updates:
      • clarify upper bound inclusion in Gen.int_bound and G= en.int_range
      • clarify printable_char and Gen.printable dist= ributions
      • add missing string_gen_of_size and small_printable_s= tring documentation
      • document QCheck_alcotest.to_alcotest
      • fix documented size distribution for arbitrary generators = string_gen, string, printable_string= , numeral_string, list, and array
      • fix exception documentation for check_result, check_= cell_exn, and check_exn
      • fix documentation for the distribution of Gen.printable an= d printable_char
      • fix documentation for the shrinking behaviour of QCheck2.printabl= e
    • internal and test suite changes
      • add additional expect and unit tests and refactor expect test suite
      • add a shrinker performance benchmark
      • remove --no-buffer option on dune runtest to = avoid garbling the test output
      • make test suite run on 32-bit architectures

    Opam-cross-windows now supports OCaml 4.14.0!

    Romain Beauxis announced

    Bit of a late announcement but the opam-cross-windows project = now supports the OCaml compiler version 4.14.0: https://githu= b.com/ocaml-cross/opam-cross-windows

    The opam-cross-windows project is part of an initiative starte= d by @whitequark to provide cross-compilation support to existing opam packages. This allows users to compile binari= es for windows but also android and ios on a linux or macos host.

    Support for packages is a on best-effort basis and is always looking for mo= re contributors. Adding a package can be a little tricky at times but, if your package uses dune, the cro= ss-compilation support there is pretty wonderful and makes it pretty easy to add cross-compiled packages.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 23FCBE0261 for ; Tue, 19 Jul 2022 10:59:02 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=C9ok=XY=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: OHtOgjuR1vlHgOFNl/wgKmO4HvBbDuw/RRh7IZHDCLyTQnNIBJYFJSMZ19Gic7e/bLf3uaU5QR ShDjnFZU5sJ69Sf2aegpElKjntlmrdI+K1OZBO4W9tdO8umA1mNHKb+etJdmd+l+I/c5/5IdSJ XiOe9ZODMjvUzX81QRZQr3UQdiLh83vvvPjikoBvNcUP01m5TPAxZTgTxJ3j6OAMS3w/QjuZd5 H8PjyIa4ECrHXMawOunoFdCXKBT7lljNHNj8o6cnZPbwJNWeuxyPB3y161u6w7LCYL0cIg+oMJ ZNDKseBYoljOZcw/mNwm9dDZ X-IPAS-Result: =?us-ascii?q?A0BDAQCRcdZimCIeaIFag3lbKBkBZ1YuBwhFhE6If4gNg?= =?us-ascii?q?RaIQocBjhkQAQMBDSwBDgQBAgQBAYISgi9FAhaEeAIeBgEFMxMBAgQBAQEBA?= =?us-ascii?q?wIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEJCwkHBgwFEA4FPGRkB?= =?us-ascii?q?IFLBIF0CzQNgjUMGYNwARgJChMBASkPGCMDFAEGAwIEDQEXAR4XARIUBoIfR?= =?us-ascii?q?AGDGAMFC49LmksaNXqBMYEBgggBAQaBPwEDAwsCAgMPLgGDdoFcCSSBAheGJ?= =?us-ascii?q?mBMAYMUhB4CJxCBVUSBFYJzB26CAz0LFwEBAQEBF4EkAQECBkUJgyAXgk6SU?= =?us-ascii?q?IlQBzcDRy8SgR9sAQgGBgcKBS4GAgwYFAQCExJNBhYCEgwKBhMOQRAXDA8DE?= =?us-ascii?q?gMPAQcCCRAIEiUIAwIDCAMCAyYCAxYJDgMdCAoYEhASAgQRGgsIAxY/CQIED?= =?us-ascii?q?gNCCA4DEQQDDxgJEggQBAYDMgwlCwMFDw0BBgMGAgUFAQMgAxQDBSQHAyEPJ?= =?us-ascii?q?g0NBCIdAwMFJQMCAhsHAgIDAgYVBgICGFQ5CAQIBCsjDwUCBy8FBC8CHgQFB?= =?us-ascii?q?hEIAhYCBgQFAgQEFgIQCAIIJxcHEzMZAQVZEAkhFgYoEAUGFQMhRyYFRQ8oM?= =?us-ascii?q?zY8LB8bCoEVKgkiFgMEBAMCBhoDAyICEC4xAxUGKRMUGhMJK30JAgMidAMDB?= =?us-ascii?q?CwcBhyZPoQwJQ5FWhQbKQEBUAgFHgoHBAgcNANHCw2SLx0EjhuKaJU9NAeDV?= =?us-ascii?q?IE+BgyIMIEijQOIJIN2gVCKdJgtIZZYIIIqhwGBFAmCSoIMkiMrCBiFHYFOK?= =?us-ascii?q?oFNHgwHMxowQ4I0ATMJCQE7AQMCDQECAgMBAgECCQEBAo9DAQmCQoJZggA7h?= =?us-ascii?q?Uw/NAIBATcCBgEKAQEDCYVjAQEFEwsBiCNaAQE?= IronPort-PHdr: A9a23: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 l570A== IronPort-Data: A9a23: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 28JSw+/Lw== IronPort-HdrOrdr: A9a23:Pe3bMqNQOY8fEMBcTsyjsMiBIKoaSvp037BL7TEXdfUxSKalfq +V7ZcmPHPP6Ar5O0tApTnjAtjjfZq0z/ccirX5Vo3SOTUO1lHYSL2KLrGP/9QjIUDDHyJmup uIupIRNOHN X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.92,283,1650924000"; d="scan'208,217";a="46079247" X-MGA-submission: =?us-ascii?q?MDFGsOJZGDuKJnXEpH6BJ7agt78ijP78hXIqvD?= =?us-ascii?q?6kr3asztdloOYH8lFuzPEsh2IfK0i2tuFmApRzs0lDt0m+pyoiWgpg4b?= =?us-ascii?q?seMHehnptZhVAIGSQ+ONyxoyiA59sDJdp7sis9l3FdTQ/KLDiBLA6skF?= =?us-ascii?q?Dmo5HfD9MwVjHcgtWKsDL8iA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Jul 2022 10:59:01 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3CDE15646BE; Tue, 19 Jul 2022 10:59:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1658221140; bh=K3GbO6c826eVCH6vTJbSMs+4AmhBW1NjmRjffQioGwo=; h=From:To:Subject:Date:Message-ID; b=N/iys5FvxlFs1ZWYF187k4t9Ls15hXBOMBPXbzNIj37JuwIa5GrHlEYgeoQJ3RAGP AJ7dfkTCQkGh+1KYGF7Z4BqFyWqz3MQPKwnXFYSu7tS/o8OiN6CrFA8/O7THt59ysq Bcs3US+9Fveozzn0x9xJrmRKYXxKVDWGnxM8ifkc= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 19 Jul 2022 10:58:59 +0200 Message-ID: <87tu7djx64.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 19 10:59:00 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499643, queueID=8A0BE564772 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxMiB0byAxOSwNCjIwMjIuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KR29wY2FtbC1t b2RlIGFuZCBHb3BjYW1sLW1vZGUgbWVybGluICgwLjAuNikgLSBQaG9lbml4IHJlbGVhc2UgKFN1 cHBvcnQgZm9yIE9DYW1sIDQuMTQuMCEpDQpTYW5kbWFyayBOaWdodGx5IC0gQmVuY2htYXJraW5n IGFzIGEgU2VydmljZQ0KT0NhbWxGb3JtYXQgV2ViIENvbmZpZ3VyYXRvcg0KSmFuZSBTdHJlZXQg aXMgSGlyaW5nIEZyb250IEVuZCBFbmdpbmVlcnMNCkJBUCAyLjUuMCBSZWxlYXNlDQpXaHkgSSB1 c2VkIE9DYW1sIHRvIGRldmVsb3BlZCBhIHV0aWxpdHkgdG8gZG93bmxvYWQgSmlyYSBpdGVtcw0K TGlxdWlkc29hcCAyLjEuMA0KVmltIG5vdyBoaWdobGlnaHRzIHR5cGVzLCBmZWVkYmFjayB3ZWxj b21lDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KR29wY2FtbC1tb2RlIGFuZCBHb3Bj YW1sLW1vZGUgbWVybGluICgwLjAuNikgLSBQaG9lbml4IHJlbGVhc2UgKFN1cHBvcnQgZm9yIE9D YW1sIDQuMTQuMCEpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1nb3BjYW1s LW1vZGUtYW5kLWdvcGNhbWwtbW9kZS1tZXJsaW4tMC0wLTYtcGhvZW5peC1yZWxlYXNlLXN1cHBv cnQtZm9yLW9jYW1sLTQtMTQtMC8xMDE2NC8xPg0KDQoNCktpcmFuIEdvcGluYXRoYW4gYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBMaWtlIHRoZSAqcGhvZW5peCosIC9Hb3Bj YW1sLW1vZGUvICpyaXNlcyogYWdhaW4gZnJvbSB0aGUgYXNoZXMh4oCmDQoNCiAg4oCmdGhpcyB0 aW1lIHdpdGggc3VwcG9ydCBmb3IgT0NhbWwgNC4xNC4wIGFuZCBPQ2FtbCA0LjEzLjAgKGJ5IHBv cHVsYXINCiAgZGVtYW5kKQ0KDQogIFNlZSB0aGUgW29yaWdpbmFsIHJlbGVhc2UgcG9zdCBdIGZv ciBkZXRhaWxlZCBpbnN0cnVjdGlvbnMgb24gaG93IHlvdQ0KICBjYW4gaW5zdGFsbCBpdC4NCg0K DQpbb3JpZ2luYWwgcmVsZWFzZSBwb3N0IF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv aW50cm9kdWNpbmctZ29wY2FtbC1tb2RlLXN0cnVjdHVyYWwtb2NhbWwtZWRpdGluZy81MzEwPg0K DQpTY3JlZW5zaG90cyAoaWYgeW91IGhhdmVuJ3Qgc2VlbiB0aGVtIGJlZm9yZSkNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIDxodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9zdGFu ZGFyZDExL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvYS9hYmMxZmYwYjVkYmJlZmUyYmViMTUw ZjJjMDkxNDhjYjU0NzJlY2UyLmdpZj4NCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNk bi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzEvMWQ0M2UwZjQyY2Mx N2EzMDA1M2VlNGM3MTQ2MGU3MGU0MDYxZjcxMS5naWY+DQoNCg0KVmlkZW8NCuKVjOKVjOKVjOKV jOKVjA0KDQogIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PUtpcFJ1aUxYWUVvPg0K DQoNCldoYXQncyBuZXh0Pw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAg4oCiIFN1cHBvcnQgZm9yIE9DYW1sIDUuMA0KICDigKIgQmV0dGVyIGVyZ29ub21pY3MgZm9y IHBpcGluZyAoaS5lIGBfIHw+IF8nKQ0KICDigKIg4oCmIHlvdSBkZWNpZGUhIChmZWF0dXJlIHJl cXVlc3RzL3B1bGwgcmVxdWVzdHMgd2VsY29tZSEpDQoNCg0KU2FuZG1hcmsgTmlnaHRseSAtIEJl bmNobWFya2luZyBhcyBhIFNlcnZpY2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNhbmRtYXJrLW5pZ2h0bHktYmVu Y2htYXJraW5nLWFzLWEtc2VydmljZS8xMDE3NC8xPg0KDQoNClNoYWt0aGkgS2FubmFuIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGFyaWRlcyBpcyBoYXBweSB0byBhbm5vdW5jZSBT YW5kbWFyayBOaWdodGx5IGJlbmNobWFya2luZyBhcyBhDQogIHNlcnZpY2UuIHRsO2RyIE9DYW1s IGNvbXBpbGVyIGRldmVsb3BlcnMgY2FuIG5vdyBwb2ludCBkZXZlbG9wbWVudA0KICBicmFuY2hl cyBhdCB0aGUgc2VydmljZSBhbmQgZ2V0IHNlcXVlbnRpYWwgYW5kIHBhcmFsbGVsIGJlbmNobWFy aw0KICByZXN1bHRzIGF0IDxodHRwczovL3NhbmRtYXJrLnRhcmlkZXMuY29tPi4NCg0KICBbU2Fu ZG1hcmtdIGlzIGEgY29sbGVjdGlvbiBvZiBzZXF1ZW50aWFsIGFuZCBwYXJhbGxlbCBPQ2FtbA0K ICBiZW5jaG1hcmtzLCBpdHMgZGVwZW5kZW5jaWVzLCBhbmQgdGhlIHNjcmlwdHMgdG8gcnVuIHRo ZSBiZW5jaG1hcmtzDQogIGFuZCBjb2xsZWN0IHRoZSByZXN1bHRzLiBTYW5kbWFyayB3YXMgZGV2 ZWxvcGVkIGZvciB0aGUgTXVsdGljb3JlDQogIE9DYW1sIHByb2plY3QgaW4gb3JkZXIgdG8gKGEp IGVuc3VyZSB0aGF0IE9DYW1sIDUgKHdpdGggbXVsdGljb3JlDQogIHN1cHBvcnQpIGRvZXMgbm90 IGludHJvZHVjZSByZWdyZXNzaW9ucyBmb3Igc2VxdWVudGlhbCBwcm9ncmFtcw0KICBjb21wYXJl ZCB0byBzZXF1ZW50aWFsIE9DYW1sIDQgYW5kIChiKSBPQ2FtbCA1IHByb2dyYW1zIHNjYWxlIHdl bGwNCiAgd2l0aCBtdWx0aXBsZSBjb3Jlcy4gSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBub2lzZSBh bmQgZ2V0IGFjdGlvbmFibGUNCiAgcmVzdWx0cywgU2FuZG1hcmsgaXMgdHlwaWNhbGx5IHJ1biBv biBbdHVuZWQgbWFjaGluZXNdLiAgVGhpcyBtYWtlcyBpdA0KICBoYXJkZXIgZm9yIE9DYW1sIGRl dmVsb3BlcnMgdG8gdXNlIFNhbmRtYXJrIGZvciBkZXZlbG9wbWVudCB3aG8gbWF5DQogIG5vdCBo YXZlIHR1bmVkIG1hY2hpbmVzIHdpdGggYSBsYXJnZSBudW1iZXIgb2YgY29yZXMuDQoNCiAgVG8g YWRkcmVzcyB0aGlzLCB3ZSBpbnRyb2R1Y2UgU2FuZG1hcmsgTmlnaHRseSBzZXJ2aWNlIHdoaWNo IHJ1bnMgdGhlDQogIHNlcXVlbnRpYWwgYW5kIHBhcmFsbGVsIGJlbmNobWFya3MgZm9yIGEgc2V0 IG9mIGNvbXBpbGVyIC92YXJpYW50cy8NCiAgKGJyYW5jaC9jb21taXQvUFIgKyBjb21waWxlciAm IHJ1bnRpbWUgb3B0aW9ucykgb24gdHdvIHR1bmVkIG1hY2hpbmVzOg0KDQogIOKAoiBUdXJpbmcg KDI4IGNvcmVzLCBJbnRlbChSKSBYZW9uKFIpIEdvbGQgNTEyMCBDUFUgQCAyLjIwR0h6LCA2NCBH Qg0KICAgIFJBTSkNCiAg4oCiIE5hdmFqbyAoMTI4IGNvcmVzLCBBTUQgRVBZQyA3NTUxIDMyLUNv cmUgUHJvY2Vzc29yLCA1MDQgR0IgUkFNKQ0KDQogIE9DYW1sIGRldmVsb3BlcnMgY2FuIHJlcXVl c3QgdGhlaXIgZGV2ZWxvcG1lbnQgYnJhbmNoZXMgdG8gYmUgYWRkZWQgdG8NCiAgdGhlIG5pZ2h0 bHkgcnVucyBieSBhZGRpbmcgaXQgdG8gW3NhbmRtYXJrLW5pZ2h0bHktY29uZmlnXS4gVGhlDQog IHJlc3VsdHMgd2lsbCBhcHBlYXIgdGhlIGZvbGxvd2luZyBkYXkgYXQNCiAgPGh0dHBzOi8vc2Fu ZG1hcmsudGFyaWRlcy5jb20+Lg0KDQogIEhlcmUgaXMgYW4gaWxsdXN0cmF0aW9uIG9mIHNlcXVl bnRpYWwgYmVuY2htYXJrIHJlc3VsdHMgZnJvbSB0aGUNCiAgc2VydmljZToNCg0KICA8aHR0cHM6 Ly9pLmltZ3VyLmNvbS9NbjdWWmt5LnBuZz4NCg0KICBZb3Ugc2hvdWxkIGZpcnN0IHNwZWNpZnkg dGhlIGBudW1iZXIgb2YgdmFyaWFudHMnIHRoYXQgeW91IHdhbnQgZm9yDQogIGNvbXBhcmlzb24s IGFuZCB0aGVuIHNlbGVjdCBlaXRoZXIgdGhlIGBuYXZham8nIG9yIGB0dXJpbmcnDQogIGhvc3Ru YW1lcy4gVGhlIGRhdGVzIGZvciB3aGljaCBiZW5jaG1hcmsgcmVzdWx0cyBhcmUgYXZhaWxhYmxl IGFyZQ0KICB0aGVuIGxpc3RlZCBpbiB0aGUgYGRhdGUnIGNvbHVtbi4gSWYgdGhlcmUgYXJlIG1v cmUgdGhhbiBvbmUgcmVzdWx0IG9uDQogIGEgZ2l2ZW4gZGF5LCB0aGVuIHRoZSBzcGVjaWZpYyB2 YXJpYW50IG5hbWUsIFNIQTEgY29tbWl0IGFuZCBkYXRlIGFyZQ0KICBkaXNwbGF5ZWQgdG9nZXRo ZXIgZm9yIHNlbGVjdGlvbi4gWW91IG5lZWQgdG8gY2hvb3NlIG9uZSBvZiB0aGUNCiAgdmFyaWFu dHMgYXMgYSBiYXNlbGluZSBmb3IgY29tcGFyaXNvbi4gSW4gdGhlIGZvbGxvd2luZyBncmFwaCwg dGhlDQogIGA1LjEuMCt0cnVuaytzZXF1ZW50aWFsXzIwMjIwNzEyXzkyMGZiOGUnIGJ1aWxkIG9u IHRoZSBgbmF2YWpvJyBzZXJ2ZXINCiAgaGFzIGJlZW4gY2hvc2VuIGFzIHRoZSBiYXNlbGluZSwg YW5kIHlvdSBjYW4gc2VlIHRoZSBub3JtYWxpemVkIHRpbWUNCiAgKHNlY29uZHMpIGNvbXBhcmlz b24gZm9yIHRoZSB2YXJpb3VzIFNhbmRtYXJrIGJlbmNobWFya3MgZm9yIGJvdGgNCiAgYDUuMS4w K3RydW5rK3NlcXVlbnRpYWxfMjAyMjA3MTNfYzc1OTg5MCcgYW5kDQogIGA1LjEuMCt0cnVuaytz ZXF1ZW50aWFsXzIwMjIwNzE0XzYwNmFiZTgnIHZhcmlhbnRzLiBXZSBvYnNlcnZlIHRoYXQNCiAg dGhlIGBtYXRyaXhfbXVsdGlwbGljYXRpb24nIGFuZCBgc29saScgYmVuY2htYXJrIGhhdmUgYmVj b21lIDUlIHNsb3dlcg0KICBhcyBjb21wYXJlZCB0byB0aGUgSnVseSAxMiwgMjAyMiBuaWdodGx5 IHJ1bi4NCg0KICA8aHR0cHM6Ly9pLmltZ3VyLmNvbS83YjB5UzBoLnBuZz4NCg0KICBTaW1pbGFy bHksIHRoZSBub3JtYWxpemVkIE1heFJTUyAoS0IpIGdyYXBoIGZvciB0aGUgc2FtZSBiYXNlbGlu ZSBhbmQNCiAgdmFyaWFudHMgY2hvc2VuIGZvciBjb21wYXJpc29uIGlzIGlsbHVzdHJhdGVkIGJl bG93Og0KDQogIDxodHRwczovL2kuaW1ndXIuY29tL1NmTWJFaXUucG5nPg0KDQogIFRoZSBgbWFu ZGVsYnJvdDYnIGFuZCBgZmFubmt1Y2hyZWR1eCcgYmVuY2htYXJrcyBoYXZlIGluY3JlYXNlZCB0 aGUNCiAgTWF4UlNTIChLQikgYnkgMyUgYXMgY29tcGFyZWQgdG8gdGhlIGJhc2VsaW5lIHZhcmlh bnQsIHdoZXJlYXMsIHRoZQ0KICBtZXRyaWMgaGFzIHNpZ25pZmljYW50bHkgaW1wcm92ZWQgZm9y IHRoZSBgbGV4aWZpLWcycHAnIGFuZA0KICBgc2VxdWVuY2VfY3BzJyBiZW5jaG1hcmtzLg0KDQog IFRoZSBwYXJhbGxlbCBiZW5jaG1hcmsgc3BlZWR1cCByZXN1bHRzIGFyZSBhbHNvIGF2YWlsYWJs ZSBmcm9tIHRoZQ0KICBTYW5kbWFyayBuaWdodGx5IHJ1bnMuDQoNCiAgPGh0dHBzOi8vaS5pbWd1 ci5jb20vdUtGRFhDdi5wbmc+DQoNCiAgPGh0dHBzOi8vaS5pbWd1ci5jb20vMjRCR1hWWi5wbmc+ DQoNCiAgV2Ugb2JzZXJ2ZSBmcm9tIHRoZSBzcGVlZHVwIGdyYXBoIHRoYXQgdGhlcmUgaXMgbm90 IG11Y2ggZGlmZmVyZW5jZQ0KICBiZXR3ZWVuIGA1LjEuMCt0cnVuaytwYXJhbGxlbF8yMDIyMDcx NF82MDZhYmU4JyBhbmQgdGhlDQogIGA1LjEuMCt0cnVuaytkZWNvdXBsZV8yMDIyMDcwNl9lYjdh MzhkJyBkZXZlbG9wZXIgYnJhbmNoIHJlc3VsdHMuIFRoZQ0KICB4LWF4aXMgaW4gdGhlIGdyYXBo IHJlcHJlc2VudHMgdGhlIG51bWJlciBvZiBkb21haW5zLCB3aGlsZSB0aGUgeS1heGlzDQogIGNv cnJlc3BvbmRzIHRvIHRoZSBzcGVlZHVwLiBUaGUgbnVtYmVyIGluIHRoZSBwYXJlbnRoZXNpcyBh Z2FpbnN0IGVhY2gNCiAgYmVuY2htYXJrIHJlZmVycyB0byB0aGUgY29ycmVzcG9uZGluZyBydW5u aW5nIHRpbWUgb2YgdGhlIHNlcXVlbnRpYWwNCiAgYmVuY2htYXJrLiBUaGVzZSBjb21wYXJpc29u IHJlc3VsdHMgYXJlIHVzZWZ1bCB0byBvYnNlcnZlIGFueQ0KICBwZXJmb3JtYW5jZSByZWdyZXNz aW9ucyBvdmVyIHRpbWUuIEl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZSB0aGUNCiAgYHR1cmluZycg bWFjaGluZSByZXN1bHRzIGZvciB0aGUgcGFyYWxsZWwgYmVuY2htYXJrcyBhcyBpdCBpcyB0dW5l ZC4NCg0KICBJZiB5b3Ugd291bGQgbGlrZSB0byB1c2UgU2FuZG1hcmsgbmlnaHRseSBmb3IgT0Nh bWwgY29tcGlsZXINCiAgZGV2ZWxvcG1lbnQsIHBsZWFzZSBkbyBwaW5nIHVzIGZvciBhY2Nlc3Mg dG8gdGhlDQogIFtzYW5kbWFyay1uaWdodGx5LWNvbmZpZ10gcmVwb3NpdG9yeSBzbyB0aGF0IHlv dSBtYXkgYWRkIHlvdXIgb3duDQogIGNvbXBpbGVyIHZhcmlhbnRzLg0KDQoNCltTYW5kbWFya10g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5jaC9zYW5kbWFyaz4NCg0KW3R1bmVkIG1hY2hp bmVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5jaC9vY2FtbF9iZW5jaF9zY3JpcHRz I25vdGVzLW9uLWhhcmR3YXJlLWFuZC1vcy1zZXR0aW5ncy1mb3ItbGludXgtYmVuY2htYXJraW5n Pg0KDQpbc2FuZG1hcmstbmlnaHRseS1jb25maWddDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LWJlbmNoL3NhbmRtYXJrLW5pZ2h0bHktY29uZmlnPg0KDQoNCk9DYW1sRm9ybWF0IFdlYiBDb25m aWd1cmF0b3INCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sZm9ybWF0LXdlYi1jb25maWd1cmF0 b3IvMTAxMDMvNj4NCg0KDQpMb3VpcyBSb2Now6kgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGFu a3MgdG8gW1BvbWJhIE1hZ2FyXSB3ZSBub3cgaGF2ZSBhIGNvZGUgZWRpdG9yIHdpdGgNCiAgaGln aGxpZ2h0aW5nLiBJdCBob3BlZnVsbHkgc2hvdWxkIGFsc28gc29sdmUgdGhlIGxhY2sgb2YgbW9u b3NwYWNlDQogIGZvbnQgb24gc2FmYXJpLg0KDQogIDxodHRwczovL2dsb2JhbC5kaXNjb3Vyc2Ut Y2RuLmNvbS9zdGFuZGFyZDExL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYLzkvOTZmYjM1MzY0 MDljNTU1MzkyNjIyOGYwOTc4MTJkNWI2M2JkNmRiOF8yXzEzODB4Nzk4LmpwZWc+DQoNCg0KW1Bv bWJhIE1hZ2FyXSA8aHR0cHM6Ly9naXRodWIuY29tL3BqbXA+DQoNCg0KSmFuZSBTdHJlZXQgaXMg SGlyaW5nIEZyb250IEVuZCBFbmdpbmVlcnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvamFuZS1zdHJlZXQtaXMtaGlyaW5nLWZyb250LWVu ZC1lbmdpbmVlcnMvMTAxODMvMT4NCg0KDQpNYXR0IFJ1c3NlbGwgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBKYW5lIFN0cmVldCBpcyBsb29raW5nIHRvIGhpcmUgRnJvbnQgRW5kIEVuZ2luZWVy cyB0aGF0IHdhbnQgdG8gZGVzaWduDQogIGFuZCBidWlsZCBvdXIgbmV4dC1nZW5lcmF0aW9uIG9m IGJyb3dzZXItYmFzZWQgdG9vbHMgZm9yIG9wZXJhdGluZyBvdXINCiAgdHJhZGluZyBpbmZyYXN0 cnVjdHVyZSAoaW4gT0NhbWwpLiAgV2XigJlyZSBidWlsZGluZyB0b29scyBmb3IgZXhwZXJ0DQog IHVzZXJzLCBhbmQgd2FudCB0byBtYWludGFpbiBhIGhpZ2ggVVggYmFyIHdoaWxlIGJ1aWxkaW5n IHRvb2xzIHRoYXQNCiAgYXJlIHBvd2VyZnVsIGFuZCBmbGV4aWJsZSwgc28gaXTigJlzIGEgY2hh bGxlbmdpbmcgZG9tYWluLg0KDQogIFJvbiBNaW5za3kgd3JvdGUgYSBiaXQgbW9yZSBhYm91dCB0 aGUgcm9sZSBoZXJlOg0KICA8aHR0cHM6Ly90d2l0dGVyLmNvbS95bWluc2t5L3N0YXR1cy8xNTQx NjA1NDEwNjkxNTk2Mjg5P3M9MjAmdD15eXJoR3g3VG5Od1BJd2Rab0FycEd3Pg0KDQogIEFuZCB5 b3UgY2FuIGZpbmQgYSBsaW5rIHRvIHRoZSBqb2IgZGVzY3JpcHRpb25zIGFuZCB0aGUgYXBwbGlj YXRpb24NCiAgcGFnZSBoZXJlOg0KDQogIOKAoiBOWUM6IFtGcm9udCBFbmQgU29mdHdhcmUgRW5n aW5lZXI6IEV4cGVyaWVuY2VkOiBKYW5lIFN0cmVldF0NCiAg4oCiIExETjogW0Zyb250IEVuZCBT b2Z0d2FyZSBFbmdpbmVlcjogRXhwZXJpZW5jZWQ6IEphbmUgU3RyZWV0XQ0KDQoNCltGcm9udCBF bmQgU29mdHdhcmUgRW5naW5lZXI6IEV4cGVyaWVuY2VkOiBKYW5lIFN0cmVldF0NCjxodHRwczov L3d3dy5qYW5lc3RyZWV0LmNvbS9qb2luLWphbmUtc3RyZWV0L3Bvc2l0aW9uLzYxODQ1MjkwMDIv Pg0KDQpbRnJvbnQgRW5kIFNvZnR3YXJlIEVuZ2luZWVyOiBFeHBlcmllbmNlZDogSmFuZSBTdHJl ZXRdDQo8aHR0cHM6Ly93d3cuamFuZXN0cmVldC5jb20vam9pbi1qYW5lLXN0cmVldC9wb3NpdGlv bi82MjM2MDAyMDAyLz4NCg0KDQpCQVAgMi41LjAgUmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYmFwLTItNS0wLXJlbGVhc2UvMTAxODUvMT4NCg0KDQpJ dmFuIEdvdG92Y2hpdHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUg cHJvdWQgdG8gYW5ub3VuY2UgdGhlIDIuNS4wIHJlbGVhc2Ugb2YgdGhlIENhcm5lZ2llIE1lbGxv bg0KICBVbml2ZXJzaXR5IEJpbmFyeSBBbmFseXNpcyBQbGF0Zm9ybSAoQ01VIEJBUCkuIFRoaXMg aXMgb25lIG9mIHRoZQ0KICBiaWdnZXN0IHJlbGVhc2VzIG9mIEJBUCB3aXRoIGxvdHMgb2YgbmV3 IFtmZWF0dXJlcyBhbmQgYnVnIGZpeGVzXS4gSW4NCiAgdGhpcyByZWxlYXNlLCB3ZSBzaWduaWZp Y2FudGx5IGltcHJvdmVkIEJBUCBwZXJmb3JtYW5jZSAoaW4gc29tZSB1c2UNCiAgY2FzZXMgYnkg YSBmYWN0b3Igb2YgdGhyZWUpIGFuZCByZWR1Y2VkIG1lbW9yeSBjb25zdW1wdGlvbiAodXAgdG8g YQ0KICBmYWN0b3Igb2YgdHdvKS4gSW4gYWRkaXRpb24sIHdlIGRldmlzZWQgYSBuZXcgbWV0aG9k IGZvciByZXByZXNlbnRpbmcNCiAgZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyB0aGF0IGlzIHNj YWxhYmxlIGFuZCBlZmZpY2llbnQgYW5kIG5vdyB3ZQ0KICBlbmFibGUgZmxvYXRpbmctcG9pbnQg bGlmdGVycyBmb3IgYWxsIHg4NiBiaW5hcmllcyB3aXRoIGxpdHRsZSB0byBubw0KICBleHRyYSBv dmVyaGVhZC4gVGhlIGZsb2F0aW5nLXBvaW50IHN1cHBvcnQgZm9yIG90aGVyIHRhcmdldHMgaXMN CiAgY29taW5nISBXZSBhbHNvIHJld3JvdGUgdGhlIEFCSSBzcGVjaWZpY2F0aW9ucyBhbmQgbm93 IHN1cHBvcnQgZG96ZW5zDQogIG9mIGRpZmZlcmVudCBBQkkuICBUaGUgbmV3IEFCSXMgc3VwcG9y dCBjYWxsaW5nIGNvbnZlbnRpb25zIGZvcg0KICBzdHJ1Y3R1cmVzIGFuZCBmbG9hdGluZy1wb2lu dCB2YWx1ZXMgYW5kIHRoZSBgYmFwLWNgIGxpYnJhcnkgd2FzDQogIHNpZ25pZmljYW50bHkgZXhw YW5kZWQgd2l0aCBsb3RzIG9mIG5ldyBmdW5jdGlvbnMgYW5kIHR5cGVzIHRvDQogIGRlc2NyaWJl IEMgdHlwZXMgYW5kIEMgb2JqZWN0IGxheW91dHMuDQoNCiAgWW91IGNhbiBpbnN0YWxsIGJhcCB3 aXRoDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluc3RhbGwgYmFwLjIuNS4wDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIERvIG5vdCBmb3JnZXQgdG8gYG9wYW0gdXBkYXRlJyBiZWZv cmUgdGhhdC4NCg0KDQpbZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlc10NCjxodHRwczovL2dpdGh1Yi5j b20vQmluYXJ5QW5hbHlzaXNQbGF0Zm9ybS9iYXAvcmVsZWFzZXMvdGFnL3YyLjUuMD4NCg0KDQpX aHkgSSB1c2VkIE9DYW1sIHRvIGRldmVsb3BlZCBhIHV0aWxpdHkgdG8gZG93bmxvYWQgSmlyYSBp dGVtcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC93aHktaS11c2VkLW9jYW1sLXRvLWRldmVsb3BlZC1hLXV0aWxpdHktdG8tZG93 bmxvYWQtamlyYS1pdGVtcy8xMDE4Ni8xPg0KDQoNCldpbGxlbSBIb2VrIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgTm90IGEgdGVjaG5pY2FsIHBvc3Qg4oCTIGJ1dCBteSBub3RlcyBvbiB3aHkgSSBk ZWNpZGVkIHRvIHVzZWQgT0NhbWwgdG8NCiAgZGV2ZWxvcCBhIHNtYWxsIHV0aWxpdHkgdGhhdCBk b3dubG9hZCBKaXJhIGl0ZW1zIHRvIFNRTGl0ZQ0KICBbaHR0cHM6Ly93aG9lay5jb20vYi9qaXJh LXRvLXNxbGl0ZS13aXRoLXNjcnVtZG9nXQ0KDQogIFRoZSBIYWNrZXIgTmV3cyBjb21tZW50cyBo ZXJlDQogIFtodHRwczovL25ld3MueWNvbWJpbmF0b3IuY29tL2l0ZW0/aWQ9MzIxMDk0NjFdDQoN Cg0KW2h0dHBzOi8vd2hvZWsuY29tL2IvamlyYS10by1zcWxpdGUtd2l0aC1zY3J1bWRvZ10NCjxo dHRwczovL3dob2VrLmNvbS9iL2ppcmEtdG8tc3FsaXRlLXdpdGgtc2NydW1kb2c+DQoNCltodHRw czovL25ld3MueWNvbWJpbmF0b3IuY29tL2l0ZW0/aWQ9MzIxMDk0NjFdDQo8aHR0cHM6Ly9uZXdz Lnljb21iaW5hdG9yLmNvbS9pdGVtP2lkPTMyMTA5NDYxPg0KDQoNCkxpcXVpZHNvYXAgMi4xLjAN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWxpcXVpZHNvYXAtMi0xLTAv MTAxOTIvMT4NCg0KDQpSb21haW4gQmVhdXhpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIExpcXVpZHNvYXAgYDIuMS4wJyB3YXMganVzdCByZWxlYXNlZCwgc29tZSBgMTAgbW9udGhz IGFmdGVyIHRoZQ0KICBpbml0aWFsIHJlbGVhc2Ugb2YgdGhlIH4yLjAueCcgcmVsZWFzZSBjeWNs ZSENCg0KICBUaGUgcmVsZWFzZSBpcyBhdmFpbGFibGUgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHVi LmNvbS9zYXZvbmV0L2xpcXVpZHNvYXAvcmVsZWFzZXMvdGFnL3YyLjEuMD4gYW5kIHNob3VsZA0K ICBiZSBjb21pbmcgdGhyb3VnaCBgb3BhbScgcHJldHR5IHNvb24uDQoNCg0K8J+klCAgV2hhdCBp cyBsaXF1aWRzb2FwPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTGlxdWlkc29hcCBpcyBhIHN0YXRpY2Fs bHktdHlwZWQsIHR5cGUtaW5mZXJyZWQsIGZ1bmN0aW9uYWwgc2NyaXB0aW5nDQogIGxhbmd1YWdl IGVxdWlwcGVkIHdpdGggc3BlY2lhbGl6ZWQgb3BlcmF0b3JzIHRvIGJ1aWxkIGF1ZGlvIGFuZCB2 aWRlbw0KICBzdHJlYW0gYXV0b21hdGlvbi4NCg0KICBUaGUgbGlxdWlkc29hcCBsYW5ndWFnZSBv ZmZlcnMgYWxsIHRoZSBmbGV4aWJpbGl0eSBhbmQgZXhwcmVzc2l2aXR5IG9mDQogIGEgZnVsbHkg ZmVhdHVyZWQgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdG8gaGVscCBidWlsZCB5b3VyIG1lZGlhDQog IHN0cmVhbXMuDQoNCiAgVXNpbmcgbGlxdWlkc29hcCwgb25lIGNhbiB2ZXJ5IHF1aWNrbHkgc3Rh bmQgdXAgYSBtZWRpYSBzdHJlYW1pbmcNCiAgcGxhdGZvcm0gdGhhdCBjYW4gcm90YXRlIGZpbGVz IGZyb20gcGxheWxpc3RzLCBhY2NlcHQgbGl2ZSBESiBpbnB1dCwNCiAgbXV4IGF1ZGlvIGFuZCB2 aWRlbywgZW5jb2RlIChvciBub3QhKSBhbmQgc2VuZCB0aGUgcmVzdWx0aW5nIGRhdGEgdG8NCiAg eW91dHViZSwgaWNlY2FzdCwgSExTIGFuZCBtb3JlLi4NCg0KDQo6d2hpdGVfY2hlY2tfbWFyazog V2h5IGxpcXVpZHNvYXA/DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBXaGlsZSB0aGVyZSBhcmUgbWFueSB0b29scyB0aGF0IG9mZmVyIGNvbXBldGlu ZyBmZWF0dXJlcywgdGhlIHJlYWwNCiAgZGlmZmVyZW5jZSB3aXRoIGxpcXVpZHNvYXAgaXMgaXRz IHNjcmlwdGluZyBsYW5ndWFnZS4NCg0KICBTZXR0aW5nIHVwIHRvb2xzIHVzaW5nIGNvbmZpZ3Vy YXRpb24gZmlsZXMgaXMgb2Z0ZW4gZWFzaWVyIGFuZCBtb3JlDQogIHN0cmFpZ2h0IGZvcndhcmQs IGhvd2V2ZXIsIHdoZW4gaXQgY29tZXMgdG8gdGhlIGZpbmVyIGRldGFpbHMsIHN1Y2ggYXMNCiAg aW5zZXJ0aW5nIGppbmdsZXMgYmV0d2VlbiBzaG93cywgZGVmaW5pbmcgY3Jvc3NmYWRlcyBiZXR3 ZWVuIHRyYWNrcw0KICBhbmQgbW9yZSwgcG90ZW50aWFsbHksIGVhY2ggcHJvamVjdCBoYXMgaXRz IG93biBzZXQgb2YgZXhwZWN0YXRpb25zLA0KICBhbmQgdGhpcyBpcyB3aGVyZSBsaXF1aWRzb2Fw IGJlY29tZXMgcmVhbGx5IHVzZWZ1bCENCg0KDQo6emFwOu+4jyBXaGF0J3MgbmV3IGluIExpcXVp ZHNvYXAgMi4xLjA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOnphcDoNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIExvdHMg b2YgdGhpbmdzIGhhdmUgYmVlbiBicmV3aW5nIHNpbmNlIHRoZSBgMi4wLjAnIHJlbGVhc2UuIFRo aXMgbmV3DQogIHJlbGVhc2UgYnJhbmNoIGlzIGludGVuZGVkIHRvIGJyaW5nIHVwIHNvbWUgb2Yg dGhlIGJyZWFraW5nIGNoYW5nZXMNCiAgdGhhdCB3ZXJlIGludHJvZHVjZWQgd2hpbGUgd2Uga2Vl cCB3b3JraW5nIG9uIG1vcmUgZXhjaXRpbmcgZnV0dXJlDQogIGNoYW5nZXMgdGhhdCB3ZSBoYXZl IG9uIG91ciBbcm9hZG1hcF0NCg0KICBTb21lIG5vdGljZWFibGUgY2hhbmdlcyBpbmNsdWRlOg0K DQoNCltyb2FkbWFwXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nhdm9uZXQvbGlxdWlkc29hcC9ibG9i L21haW4vUk9BRE1BUC5tZD4NCg0KSW1wcm92ZWQgSlNPTiBwYXJzaW5nDQrilITilITilITilITi lITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICBZ b3Ugc2hvdWxkIG5vdyBiZSBhYmxlIHRvIGRvOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxl dCBqc29uLnBhcnNlICh7DQogIOKUgiAgIGZvbywNCiAg4pSCICAgYmxhLA0KICDilIIgICBnbmkN CiAg4pSCIH0gOiB7DQogIOKUgiAgIGZvbzogc3RyaW5nLA0KICDilIIgICBibGE6IGZsb2F0LA0K ICDilIIgICBnbmk6IGJvb2wNCiAg4pSCIH0pID0gJ3sgImZvbyI6ICJhYWJiY2MiLCAiYmxhIjog My4xNCwgImduaSI6IHRydWUgfScNCiAg4pSU4pSA4pSA4pSA4pSADQogIEZvciBhbnkgb25lIHdo byBoYXMgZXZlciB0cmllZCB0byBwYXJzZSBqc29uIGluIHRoZWlyIGxpcXVpZHNvYXANCiAgc2Ny aXB0cywgdGhpcyBpcyBnb25uYSBiZSBhIGdhbWUgY2hhbmdlci4gV2UgaGF2ZSBhIGRldGFpbGVk IGFydGljbGUNCiAgW2hlcmVdDQoNCg0KW2hlcmVdIDxodHRwczovL3d3dy5saXF1aWRzb2FwLmlu Zm8vZG9jLWRldi9qc29uLmh0bWw+DQoNCg0KUmVndWxhciBleHByZXNzaW9ucyBhcmUgbm93IGZp cnN0LWNsYXNzIGVudGl0aWVzLg0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE 4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoN CiAgVGhpcyBzaG91bGQgYmUgZmFtaWxpYXIgdG8gYW55b25lIHVzZWQgdG8gd29ya2luZyB3aXRo IEphdmFzY3JpcHQncw0KICByZWd1bGFyIGV4cHJlc3Npb24uIFNvLCBub3csIGluc3RlYWQgb2Yg ZG9pbmc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBzdHJpbmcubWF0Y2gocGF0dGVybj0i XFxkKyIsIHMpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFlvdSB3aWxsIG5vdyBkbzoNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIHIvXGQrLy50ZXN0KHMpDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFRoZXJlJ3MgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiBvZiB0aGlzIG5ldyBmZWF0dXJlIFto ZXJlXS4NCg0KDQpbaGVyZV0NCjxodHRwczovL3d3dy5saXF1aWRzb2FwLmluZm8vZG9jLWRldi9s YW5ndWFnZS5odG1sI3JlZ3VsYXJfZXhwcmVzc2lvbnM+DQoNCg0KVmltIG5vdyBoaWdobGlnaHRz IHR5cGVzLCBmZWVkYmFjayB3ZWxjb21lDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3ZpbS1ub3ctaGlnaGxpZ2h0cy10eXBlcy1mZWVk YmFjay13ZWxjb21lLzEwMTk4LzE+DQoNCg0KTWHDq2xhbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtBIHBhdGNoXSBqdXN0 IG1hZGUgaXRzIHdheSB0byBbdGhlIGNvbW11bml0eS1tYWludGFpbmVkIFZpbSBmaWxlcyBmb3IN CiAgT0NhbWxdIChub3QgcHJvcGFnYXRlZCB0byB0aGUgW29mZmljaWFsIFZpbSBkaXN0cmlidXRp b25dLCB5ZXQpLCB0aGF0DQogIHRyaWVzIHRvIGhpZ2hsaWdodCB0eXBlcy4gSU1ITyB0aGUgcGF0 Y2ggaXMgbGFyZ2UgYW5kIGhhY2t5IHNvIHlvdSBtYXkNCiAgd2FudCB0byB0cnkgaXQgY2F1dGlv dXNseSwgYW5kICpmZWVkYmFjayB3b3VsZCBiZSBhcHByZWNpYXRlZCouIDotKQ0KDQogIFRoZSBm b3JtZXIgYmVoYXZpb3Igd2FzIHRvIGhpZ2hsaWdodCBpZGVudGlmaWVycyB0aGF0IGhhcHBlbmVk IHRvIGJlDQogIHRoZSBuYW1lIG9mIGEgYnVpbHRpbiB0eXBlIChzdWNoIGFzIGBpbnQnIG9yIGBs aXN0JyksIHJlZ2FyZGxlc3Mgb2YNCiAgd2hlcmUgdGhleSBhcHBlYXJlZC4gTm93LCBpbiBwcmlu Y2lwbGUsIGFsbCB0eXBlIGV4cHJlc3Npb25zIGNhbiBiZQ0KICBoaWdobGlnaHRlZCwgYW5kIGJl IHNvIG9ubHkgd2hlbiBpbiBhIHR5cGUgY29udGV4dC4gQnkgZGVmYXVsdCwgb25seQ0KICBidWls dGluIHR5cGVzIGFyZSBoaWdobGlnaHRlZCwgYnV0IHlvdSBjYW4gdW5sZWFzaCB0aGUgZnVsbCBw b3dlciBvZg0KICB0aGUgbmV3IGxpbnRlcjoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICIg cHV0IHRoaXMgaW4gfi8udmltL2FmdGVyL3N5bnRheC9vY2FtbC52aW0gZm9yIGluc3RhbmNlOg0K ICDilIIgaGkgbGluayBvY2FtbFR5cGVDb25zdHIgICBUeXBlDQogIOKUgiBoaSBsaW5rIG9jYW1s VHlwZUJ1aWx0aW4gIFR5cGUNCiAg4pSCIGhpIGxpbmsgb2NhbWxUeXBlVmFyICAgICAgVHlwZQ0K ICDilIIgaGkgbGluayBvY2FtbFR5cGVBbnlWYXIgICBUeXBlDQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIG9yIGZhbmNpZXIgKGlmIHlvdSBsaWtlIGV4Y2VzcyA6cmFpbmJvdzopOg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgIiAxMTIgPSBsaWdodCBncmVlbiAodGhlIGNvbG9yIG9mIHRoZSDi gJxUeXBl4oCcIGhsIGdyb3VwIHdpdGggbXkgdGhlbWUpDQogIOKUgiBoaSBvY2FtbFR5cGVDb25z dHIgICAgICAgY3Rlcm1mZz0xMTINCiAg4pSCIGhpIG9jYW1sVHlwZUJ1aWx0aW4gICAgICBjdGVy bWZnPTExMiBjdGVybT1ib2xkDQogIOKUgiBoaSBvY2FtbFR5cGVWYXIgICAgICAgICAgY3Rlcm1m Zz0xMTIgY3Rlcm09aXRhbGljDQogIOKUgiBoaSBvY2FtbFR5cGVBbnlWYXIgICAgICAgY3Rlcm1m Zz0xMTIgY3Rlcm09Ym9sZA0KICDilJTilIDilIDilIDilIANCg0KICBFdmVuIGlmIHlvdSBkb27i gJl0IGNhcmUgYWJvdXQgaGlnaGxpZ2h0aW5nIHR5cGVzLCBhbGxvd2luZyB0aGUgbGludGVyDQog IHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHR5cGVzIGFuZCBleGNlcHRpb25zIGhhcyBzb21lIHRh bmdlbnRpYWwNCiAgYmVuZWZpdHMuDQoNCg0KW0EgcGF0Y2hdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvdmltLW9jYW1sL3B1bGwvNzY+DQoNClt0aGUgY29tbXVuaXR5LW1haW50YWluZWQgVmlt IGZpbGVzIGZvciBPQ2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvdmltLW9jYW1sPg0K DQpbb2ZmaWNpYWwgVmltIGRpc3RyaWJ1dGlvbl0NCjxodHRwczovL2dpdGh1Yi5jb20vdmltL3Zp bS90cmVlL21hc3Rlci9ydW50aW1lPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5v cmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1s IGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtG YXN0ZXIgSW5jcmVtZW50YWwgQnVpbGRzIHdpdGggRHVuZSAzXQ0KDQoNClt0aGUgb2NhbWwub3Jn IGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0Zhc3RlciBJbmNyZW1lbnRhbCBC dWlsZHMgd2l0aCBEdW5lIDNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjItMDctMTIt ZmFzdGVyLWluY3JlbWVudGFsLWJ1aWxkcy13aXRoLWR1bmUtMz4NCg0KDQpPbGQgQ1dODQrilZDi lZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBj YW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28g dGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBh cmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsg YnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0 dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNo bmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9y Zy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 12 to 19, 2022.

    Gopcaml-mode and Gopcaml-mode merlin (0.0.6) - Phoenix release= (Support for OCaml 4.14.0!)

    Kiran Gopinathan announced

    Like the phoenix, Gopcaml-mode rises again from the as= hes!…

    …this time with support for OCaml 4.14.0 and OCaml 4.13.0 (by popula= r demand)

    See the original release post for detailed instructions on how you can install it.

    Screenshots (if you haven't seen them before)

    3D"abc1ff0b5d=

    3D"1d43e0f42c=

    What's next?

    • Support for OCaml 5.0
    • Better ergonomics for piping (i.e _ |> _)
    • … you decide! (feature requests/pull requests welcome!)

    Sandmark Nightly - Benchmarking as a Service

    Shakthi Kannan announced

    Tarides is happy to announce Sandmark Nightly benchmarking as a service. tl= ;dr OCaml compiler developers can now point development branches at the service and get sequential and parallel b= enchmark results at https://sandmark.tarides.com.

    Sandmark is a colle= ction of sequential and parallel OCaml benchmarks, its dependencies, and the scripts to run the benchmarks and collect the results= . Sandmark was developed for the Multicore OCaml project in order to (a) ensure that OCaml 5 (with multicore support) = does not introduce regressions for sequential programs compared to sequential OCaml 4 and (b) OCaml 5 programs= scale well with multiple cores. In order to reduce the noise and get actionable results, Sandmark is typically run o= n tuned machines. This makes it harder for OCaml developers to use Sandmark for development w= ho may not have tuned machines with a large number of cores.

    To address this, we introduce Sandmark Nightly service which runs the seque= ntial and parallel benchmarks for a set of compiler variants (branch/commit/PR + compiler & runtime options= ) on two tuned machines:

    • Turing (28 cores, Intel(R) Xeon(R) Gold 5120 CPU @ 2.20GHz, 64 GB RAM)<= /li>
    • Navajo (128 cores, AMD EPYC 7551 32-Core Processor, 504 GB RAM)

    OCaml developers can request their development branches to be added to the = nightly runs by adding it to sandmark= -nightly-config. The results will appear the following day at https://sandmark.= tarides.com.

    Here is an illustration of sequential benchmark results from the service:

    3D"Mn7VZky.png"

    You should first specify the number of variants that you want = for comparison, and then select either the navajo or turing hostnames. The dates for which benchmark results are= available are then listed in the date column. If there are more than one result on a given day, then the specific variant na= me, SHA1 commit and date are displayed together for selection. You need to choose one of the variants as a baselin= e for comparison. In the following graph, the 5.1.0+trunk+sequential_20220712_920fb8e build on the navajo server has been chosen as the baseline, and you can see the normalized time (seconds) comparison for the various Sandmark b= enchmarks for both 5.1.0+trunk+sequential_20220713_c759890 and 5.1.0+trunk+= sequential_20220714_606abe8 variants. We observe that the matrix_multiplication and soli benchmark have bec= ome 5% slower as compared to the July 12, 2022 nightly run.

    3D"7b0yS0h.png"

    Similarly, the normalized MaxRSS (KB) graph for the same baseline and varia= nts chosen for comparison is illustrated below:

    3D"SfMbEiu.png"

    The mandelbrot6 and fannkuchredux benchmarks have= increased the MaxRSS (KB) by 3% as compared to the baseline variant, whereas, the metric has significantly improved for the lexif= i-g2pp and sequence_cps benchmarks.

    The parallel benchmark speedup results are also available from the Sandmark= nightly runs.

    3D"uKFDXCv.png"

    3D"24BGXVZ.png"

    We observe from the speedup graph that there is not much difference between= 5.1.0+trunk+parallel_20220714_606abe8 and the 5.1.0+trunk+decouple_20220706_eb7a38d developer branch= results. The x-axis in the graph represents the number of domains, while the y-axis corresponds to the speedup. The number = in the parenthesis against each benchmark refers to the corresponding running time of the sequential benchmark. These= comparison results are useful to observe any performance regressions over time. It is recommended to use the t= uring machine results for the parallel benchmarks as it is tuned.

    If you would like to use Sandmark nightly for OCaml compiler development, p= lease do ping us for access to the sandmark= -nightly-config repository so that you may add your own compiler variants.

    OCamlFormat Web Configurator

    Louis Roch=C3=A9 announced

    Thanks to Pomba Magar we now have a= code editor with highlighting. It hopefully should also solve the lack of monospace font on safari.

    =3D"96fb3536409c5553926228f097812d5b63bd6db8_2_1380x798.jpeg"

    Jane Street is Hiring Front End Engineers

    Matt Russell announced

    Jane Street is looking to hire Front End Engineers that want to design and = build our next-generation of browser-based tools for operating our trading infrastructure (in OCaml). We=E2=80=99re b= uilding tools for expert users, and want to maintain a high UX bar while building tools that are powerful and flexible,= so it=E2=80=99s a challenging domain.

    Ron Minsky wrote a bit more about the role here: https://twitter.com/yminsky/status/1541605410= 691596289?s=3D20&t=3DyyrhGx7TnNwPIwdZoArpGw

    And you can find a link to the job descriptions and the application page he= re:

    BAP 2.5.0 Release

    Ivan Gotovchits announced

    We are proud to announce the 2.5.0 release of the Carnegie Mellon Universit= y Binary Analysis Platform (CMU BAP). This is one of the biggest releases of BAP with lots of new features and bug = fixes. In this release, we significantly improved BAP performance (in some use cases by a factor of three) and reduc= ed memory consumption (up to a factor of two). In addition, we devised a new method for representing floating-point = operations that is scalable and efficient and now we enable floating-point lifters for all x86 binaries with little t= o no extra overhead. The floating-point support for other targets is coming! We also rewrote the ABI specifications= and now support dozens of different ABI. The new ABIs support calling conventions for structures and floating-point = values and the `bap-c` library was significantly expanded with lots of new functions and types to describe C t= ypes and C object layouts.

    You can install bap with

    opam install bap.2.5.0
    

    Do not forget to opam update before that.

    Why I used OCaml to developed a utility to download Jira items=

    Willem Hoek announced

    Not a technical post – but my notes on why I decided to used OCaml t= o develop a small utility that download Jira items to SQLite https://whoek.= com/b/jira-to-sqlite-with-scrumdog

    The Hacker News comments here https://news.yc= ombinator.com/item?id=3D32109461

    Liquidsoap 2.1.0

    Romain Beauxis announced

    Liquidsoap 2.1.0 was just released, some 10 months after= the initial release of the ~2.0.x release cycle!

    The release is available here: https://github.com/savonet/liquidsoap/releases/ta= g/v2.1.0 and should be coming through opam pretty soon.

    =F0=9F=A4=94 What is liquidsoap?

    Liquidsoap is a statically-typed, type-inferred, functional scripting langu= age equipped with specialized operators to build audio and video stream automation.

    The liquidsoap language offers all the flexibility and expressivity of a fu= lly featured programming language to help build your media streams.

    Using liquidsoap, one can very quickly stand up a media streaming platform = that can rotate files from playlists, accept live DJ input, mux audio and video, encode (or not!) and send the re= sulting data to youtube, icecast, HLS and more..

    :white_check_mark: Why liquidsoap?

    While there are many tools that offer competing features, the real differen= ce with liquidsoap is its scripting language.

    Setting up tools using configuration files is often easier and more straigh= t forward, however, when it comes to the finer details, such as inserting jingles between shows, defining crossfades= between tracks and more, potentially, each project has its own set of expectations, and this is where liquidsoap = becomes really useful!

    :zap:=EF=B8=8F What's new in Liquidsoap 2.1.0? &= #xa0; zap

    Lots of things have been brewing since the 2.0.0 release. This= new release branch is intended to bring up some of the breaking changes that were introduced while we keep working on more exc= iting future changes that we have on our road= map

    Some noticeable changes include:

    Improved JSON parsing

    You should now be able to do:

    let json.parse ({
      foo,
      bla,
      gni
    } : {
      foo: string,
      bla: float,
      gni: bool
    }) =3D '{ "foo": "aabbcc", "bla": 3.14, "gn=
    i": true }'
    

    For any one who has ever tried to parse json in their liquidsoap scripts, t= his is gonna be a game changer. We have a detailed article = here

    Regular expressions are now first-class entities.

    This should be familiar to anyone used to working with Javascript's regular= expression. So, now, instead of doing:

    string.match(pattern=3D"\\d+", s)
    

    You will now do:

    r/\d+/.test(s)
    

    There's a detailed description of this new feature here.

    Vim now highlights types, feedback welcome

    Ma=C3=ABlan announced

    A patch just mad= e its way to the community-m= aintained Vim files for OCaml (not propagated to the official Vim dis= tribution, yet), that tries to highlight types. IMHO the patch is large= and hacky so you may want to try it cautiously, and feedback would be appreciated. :-)

    The former behavior was to highlight identifiers that happened to be the na= me of a builtin type (such as int or list), regardless of where they appeared. Now, in principle, a= ll type expressions can be highlighted, and be so only when in a type context. By default, only builtin types are highlighted= , but you can unleash the full power of the new linter:

    " put this in ~/.vim/after/syntax/ocaml.vim for =
    instance:
    hi link ocamlTypeConstr   Type
    hi link ocamlTypeBuiltin  Type
    hi link ocamlTypeVar      Type
    hi link ocamlTypeAnyVar   Type
    

    or fancier (if you like excess :rainbow:):

    " 112 =3D light green (the color of the =E2=80=
    =9CType=E2=80=9C hl group with my theme)
    hi ocamlTypeConstr       ctermfg=3D112
    hi ocamlTypeBuiltin      ctermfg=3D112 cterm=3Dbold
    hi ocamlTypeVar          ctermfg=3D112 cterm=3Ditalic
    hi ocamlTypeAnyVar       ctermfg=3D112 cterm=3Dbold
    

    Even if you don=E2=80=99t care about highlighting types, allowing the linte= r to discriminate between types and exceptions has some tangential benefits.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 9F407E0260 for ; Tue, 26 Jul 2022 19:54:30 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=00GQ=X7=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: SN9oLKtfCgI7T5k9KG6JbSdeMG7qOmpeWF5Yhdd6yZExuh0nTlwUPt/9r857CNXhjc7rCs2AtA 9sjs9yxFSf6tZj4OHYK5036NnKW6wbpCnr6EGn6ZkOYF6JbRGv0PXoKK99W7FiVg0giMuTJGPY Dq/JUEXP8/nCZHdj/XxG/3iq9w4HAAK3HzyqYQhvZUFtwXi8YCHMG+roPCxWi1cJrjVmdU7wST iWMqzbjj1AozkfU9tnBVlT/JcUM06ppHnAF5zzs+lxrX/cl04fFP6a7m8fbFGp5jHmEJsUfX3H XabCIE1ObZ0VMEaFMcRbN7le X-IPAS-Result: =?us-ascii?q?A0BHAQCLKeBimCIeaIFaFoNjgQMZAWEGVxYYBwhFhE6If?= =?us-ascii?q?ogNgRaIQocCjhkQAQMBDSwBDgQBAgQBAYUGAhaEWAIeBgEFMxMBAgQBAQEBA?= =?us-ascii?q?wIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEJCwkHBgwFEA4FPGRkB?= =?us-ascii?q?IFLBIF0CzQNgjUMGYNwARgBCAQGEwEBOBgjAxQBBgMCBA0BFwEeAwETARIag?= =?us-ascii?q?mMBgxoDBAELjmabGnp/MoEBgggBAQaBPwEDAwsCAgMYJQGDdoESSgkkgQIXh?= =?us-ascii?q?i5gTAGDFwmCM4FkAicQgVVEgRWCcwdugVBwCxcBAQEBAYE7AQFNCYMgF4JOn?= =?us-ascii?q?GUHNwNFLxKBH2wBCAQGBwoFLgYCDBgUBAITEk0GFgISFAYTDkEQFwwPAxIDD?= =?us-ascii?q?wEHAgkQCBElCAIDCAMCAyYCAxYGDgMdCAoYEhASAgQRGgsGAxY+CQIEDgNAC?= =?us-ascii?q?A4DEQQDDxgJEggQBAYDMgwlCwMFDwwBBgMGBQMBAxsDFAMFJAcDHw8jDQ0EH?= =?us-ascii?q?x0DAwUlAwICGwcCAgMCBhUGAgIYNjkIBAgEKyMPBQIHLwUELwIeBAUGEQgCF?= =?us-ascii?q?gIGBAQEBBYCEAgCCCcXBxMzGQEFWRAJIRYGKBAFBhMDIEcmBUUPKDM1PCsfG?= =?us-ascii?q?wqBEioJIhYDBAQDAgYaAwMiAhAuMQMVBikTEi0JKncJAgMicQMDBCouAwkfH?= =?us-ascii?q?wcJF5x+gQwJChwOPgJZCRgTAQcDIAEEEws2IwUFCwgILQ0OFQ4IDBMLCzKSA?= =?us-ascii?q?hARBSKNdopplEB9NAeDVIE+BgyIMIEijQOIJIN2gVCKdIZiilSGdyGWWyCCK?= =?us-ascii?q?ocDgRcJgkuUXwQECxwKhQSBTiprgQAMBzMaMCIhgmgJRQEDAg0BAgIDAQIBA?= =?us-ascii?q?gkBAQKOKRaDUIE+gmI5O4VMPzQCAQE3AgYBCgEBAwmFYwEBBRMLAYgjWgEB?= IronPort-PHdr: A9a23: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 tqauZjemD3GUZSWtReKAnfSKg== IronPort-Data: A9a23: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 749rw6/L1E= IronPort-HdrOrdr: A9a23:Zm5XQ6O4cOlBNsBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,194,1654552800"; d="scan'208,217";a="47005307" X-MGA-submission: =?us-ascii?q?MDEDQ1e6W8YvStAytEIowM2FdZ4yl5ThIvQU87?= =?us-ascii?q?8JIPOxbUBPrVMeJFMkWhe6IBtmS5SxiC9w5p/33yGX0Zu0Wy6HZPKqyp?= =?us-ascii?q?KIjag6V169TzkRKHYSHO/5BNny3fPez2hm3V4i1Q7cevilnUcBHPUoE9?= =?us-ascii?q?vQgTplKUBwkVT9YENgo49RHQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Jul 2022 19:54:29 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A1C16564671; Tue, 26 Jul 2022 19:54:28 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1658858068; bh=/WI45E/qG7z23b0aKZ/D9TOeu9Hpjdx8aF0vGfqcNek=; h=From:To:Subject:Date:Message-ID; b=nDg6k+mVtxAjUdHjeDaSu7fonkSa2igoBMzdS2N7/fvN1kQH+VoHiXvOTgQQg2chP Hcr0DzxIb8zWFqOZftwuwAG/kSNu6qfc7JdtkppwmDVv94g4b9wXJKqosV8jK4lf8G q0s8lWe+Jd6tkzazPk/6zngXQd5P3mCataAX24kY= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 26 Jul 2022 19:54:27 +0200 Message-ID: <871qu7kbe4.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 26 19:54:29 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.494969, queueID=23640564673 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxOSB0byAyNiwNCjIwMjIuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSGVscCB3LiBt eSBmaXJzdCBHQURUIDogdW53cmFwcGluZyBTcWxpdGUzLkRhdGEudA0KRG9jdUxpYiAzLjEuMiBh bmQgTWV0YURCIDEuMC4yIG5vdyBvbiBPUEFNDQpkdW5lIDMuNC4wDQpPQ2FtbCA1LjAsIGZpcnN0 IG5vcm1hbCBhbHBoYSByZWxlYXNlDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KSGVs cCB3LiBteSBmaXJzdCBHQURUIDogdW53cmFwcGluZyBTcWxpdGUzLkRhdGEudA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9oZWxwLXctbXktZmlyc3QtZ2FkdC11bndyYXBwaW5nLXNxbGl0ZTMtZGF0 YS10LzEwMjAyLzE+DQoNCg0KUGhpbGlwcGUgU3RyYXVzcyBhc2tlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SSB3b3VsZCBsaWtlIHRvIGNvbnZlcnQgc3FsaXRlMy1vY2FtbCByZXR1cm5zIGZyb20gU3FsaXRl My5EYXRhLnQNCiAgYXJyYXkgdG8gcGxhaW4gb2NhbWwgdHlwZXMgaW4gYSB0dXBsZS4gSSBndWVz cyB1bndyYXBwaW5nIHRoZSBEYXRhLnQNCiAgY2FuIGJlIGRvbmUgdXNpbmcgYSBHQURULCBoZXJl J3MgbXkgdmVyeSB2ZXJ5IGZpcnN0IGF0dGVtcHQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giAoKiBzaW11bGF0ZSBTcWxpdGUzLkRhdGEudCAqKQ0KICDilIIgDQogIOKUgiB0eXBlIHQgPQ0K ICDilIIgfCBOT05FDQogIOKUgiB8IE5VTEwNCiAg4pSCIHwgSU5UIG9mIGludDY0DQogIOKUgiB8 IEZMT0FUIG9mIGZsb2F0DQogIOKUgiB8IFRFWFQgb2Ygc3RyaW5nDQogIOKUgiB8IEJMT0Igb2Yg c3RyaW5nIDs7DQogIOKUgiANCiAg4pSCICgqIGEgc2ltcGxlIEdBRFQgdG8gdW53cmFwIFNxbGl0 ZTMuRGF0YS50ICopDQogIOKUgiANCiAg4pSCIHR5cGUgXyBkYnZhbCA9DQogIOKUgiAgICAgfCBJ TlQgOiBpbnQ2NCAtPiBpbnQ2NCBkYnZhbA0KICDilIIgICAgIHwgRkxPQVQgOiBmbG9hdCAtPiBm bG9hdCBkYnZhbA0KICDilIIgICAgIHwgVEVYVCA6IHN0cmluZyAtPiBzdHJpbmcgZGJ2YWwNCiAg 4pSCICAgICB8IEJMT0IgOiBzdHJpbmcgLT4gc3RyaW5nIGRidmFsDQogIOKUgiAgICAgfCBOT05F IHwgTlVMTCA7Ow0KICDilIIgDQogIOKUgiBsZXQgdW53cmFwX2RhdGEgOiB0eXBlIGEuIGEgZGJ2 YWwgLT4gYSA9IGZ1biBkYnZhbCAtPg0KICDilIIgICAgIG1hdGNoIGRidmFsIHdpdGgNCiAg4pSC ICAgICB8IElOVCB4IC0+IHgNCiAg4pSCICAgICB8IEZMT0FUIHggLT4geA0KICDilIIgICAgIHwg VEVYVCBzdHIgLT4gc3RyDQogIOKUgiAgICAgfCBCTE9CIHN0ciAtPiBzdHIgOzsNCiAg4pSCIA0K ICDilIIgbGV0IHR1cGxlX29mX2FycmF5NCAoYXJyOiB0IGFycmF5KSA9DQogIOKUgiAgICAgYXNz ZXJ0IChBcnJheS5sZW5ndGggYXJyID0gNCkgOw0KICDilIIgICAgICh1bndyYXBfZGF0YSBhcnIu KDApLCB1bndyYXBfZGF0YSBhcnIuKDEpLCB1bndyYXBfZGF0YSBhcnIuKDIpLCB1bndyYXBfZGF0 YSBhcnIuKDMpKSA7Ow0KICDilJTilIDilIDilIDilIANCg0KICBDb21waWxhdGlvbiBmYWlscyB3 aXRoIHRoaXMgdHlwaW5nIGVycm9yOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgRmlsZSAi ZGF0YWJhc2UubWwiLCBsaW5lIDIzMywgY2hhcmFjdGVycyAxNy0yNDoNCiAg4pSCIDIzMyB8ICAg ICAodW53cmFwX2RhdGEgYXJyLigwKSwgdW53cmFwX2RhdGEgYXJyLigxKSwgdW53cmFwX2RhdGEg YXJyLigyKSwgdW53cmFwX2RhdGEgYXJyLigzKSkgOzsNCiAg4pSCIAkJICAgICAgIF5eXl5eXl4N CiAg4pSCIEVycm9yOiBUaGlzIGV4cHJlc3Npb24gaGFzIHR5cGUgdCBidXQgYW4gZXhwcmVzc2lv biB3YXMgZXhwZWN0ZWQgb2YgdHlwZQ0KICDilIIgCSAnYSBkYnZhbA0KICDilJTilIDilIDilIDi lIANCg0KICBXaGF0IGFtIEkgZG9pbmcgd3Jvbmc/IEkgbmVlZCB0byBtYWtlIHR5cGUgdCBjb21w YXRpYmxlIHdpdGggdHlwZSAnYQ0KICBkYnZhbC4gIFRoYW5rcyBpbiBhZHZhbmNlLg0KDQoNCm9j dGFjaHJvbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBZb3UgY2Fubm90IG1ha2UgdGhlIHR5cGUgYHQnIGFuZCBgJ2EgZGJ2 YWwnIGNvbXBhdGlibGUsIHRoZXJlIGFyZQ0KICBkaWZmZXJlbnQgdHlwZXMuDQoNCiAgQSB2ZXJ5 IGltcG9ydGFudCBwb2ludCB0byBrZWVwIGluIG1pbmQgd2l0aCBHQURUcyBpcyB0aGF0IG9uZSBj YW5ub3QNCiAgY3JlYXRlIHR5cGUtbGV2ZWwgaW5mb3JtYXRpb24gZnJvbSBkeW5hbWljYWwgdmFs dWVzLiBJbiBvdGhlciB3b3JkcywNCiAgdGhlcmUgYXJlIG5vIGZ1bmN0aW9ucyBvZiB0eXBlIH4g eCA6IHQgLT4gZih4KSBkYnZhbH50aGF0IHdpbGwgaW5mZXINCiAgdGhlIHR5cGUgb2YgaXRzIHJl dHVybiBmcm9tIHRoZSB2YWx1ZSBvZiBpdHMgYXJndW1lbnQgaW4gT0NhbWwuDQoNCiAgVGh1cyB0 aGUgdHlwZSBvZiB0aGUgZmluYWwgcmVzdWx0IG11c3QgY29tZSBmcm9tIHlvdXIgY29kZSBzb3Vy Y2UNCiAgcmF0aGVyIHRoYW4gZnJvbSB0aGUgZHluYW1pY2FsIGRhdGEuICBGb3IgaW5zdGFuY2Us IHlvdSBjYW4gZGVmaW5lDQogIGNvbnN0cnVjdG9yIGZyb20gdGhlIHR5cGUgYHQnIHRvIHRoZSBy aWdodCBgZGJ2YWwnIHR5cGU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZXhjZXB0aW9uIFR5 cGVfZXJyb3INCiAg4pSCIA0KICDilIIgbGV0IGludDogdCAtPiBfIGRidmFsID0gZnVuY3Rpb24N CiAg4pSCIHwgSU5UIHggLT4gSU5UIHgNCiAg4pSCIHwgXyAtPiByYWlzZSBUeXBlX2Vycm9yDQog IOKUgiANCiAg4pSCIGxldCBmbG9hdDogdCAtPiBfIGRidmFsID0gZnVuY3Rpb24NCiAg4pSCIHwg RkxPQVQgeCAtPiBGTE9BVCB4DQogIOKUgiB8IF8gLT4gcmFpc2UgVHlwZV9lcnJvcg0KICDilJTi lIDilIDilIDilIANCiAgVGhlbiBpZiB5b3Uga25vdyB0aGUgdHlwZSBvZiB0aGUgdHVwbGUsIHlv dSBjYW4gd3JpdGUgaXQgYXM6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IHR1cGxlX29m X2FycmF5NCAoYXJyOiB0IGFycmF5KSA9DQogIOKUgiAgICAgYXNzZXJ0IChBcnJheS5sZW5ndGgg YXJyID0gNCkgOw0KICDilIIgICAgIGludCBhcnIuKDApLCBpbnQgYXJyLigxKSwgaW50IGFyci4o MiksIGludCBhcnIuKDMpDQogIOKUlOKUgOKUgOKUgOKUgA0KICBvciBwb3NzaWJseSBhcw0KICDi lIzilIDilIDilIDilIANCiAg4pSCIGxldCBpbnQ0ID0gaW50LCBpbnQsIGludCwgaW50DQogIOKU giBsZXQgdHVwbGUgKGEsYixjLGQpIGFyciA9DQogIOKUgiAgIGFzc2VydCAoQXJyYXkubGVuZ3Ro IGFyciA9IDQpIDsNCiAg4pSCICAgYSBhcnIuKDApLCBiIGFyci4oMSksIGMgYXJyLigyKSwgZCBh cnIuKDMpDQogIOKUlOKUgOKUgOKUgOKUgA0KICBUaGVyZSBhcmUgbW9yZSBjb21wbGV4IGFsdGVy bmF0aXZlcyBiYXNlZCBvbiB0eXBlIHdpdG5lc3MsIHRoYXQgYWxsb3cNCiAgdG8gaW1wbGVtZW50 IGEgZm9ybSBvZiBzdGF0aWMgbWF0Y2hpbmcgb3ZlciB0aGUgZHluYW1pY2FsIHR5cGUgb2YNCiAg ZGF0YSwgYnV0IHRoZSBjb3JlIGlkZWEgdGhhdCB0aGUgdHlwZXMgYXJlIGFsd2F5cyBwcmVzZW50 IGluIHRoZQ0KICBzb3VyY2UgY29kZSBpbiBzb21lIHdheSBpcyB0aGUgc2FtZS4NCg0KDQpQaGls aXBwZSBTdHJhdXNzIHRoZW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT2ggSSBk aWRuJ3Qgbm90aWNlZCBpdCB3b3VsZCBiZSBkeW5hbWljYWwgdHlwaW5nISBJJ20gdG9vIHVzZWQg dG8gcHB4DQogIChhbmQgcHJldmlvdXNseSBjYW1scDQpIHdyaXR0ZW4gZGIgYWJzdHJhY3Rpb24g bGF5ZXIhDQoNCiAgSSdtIHNpbXBseSByZXBsYWNpbmcgc3FsZXhwciBieSBwbGFpbiBzcWxpdGUz LW9jYW1sIGluIHNvbWUgZXhpc3RpbmcNCiAgY29kZSBvZiBtaW5lLiBzcWxleHByIHF1aWNrIGRv Y286DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9tZnAvb2NhbWwtc3FsZXhwcj4NCg0KICBCdXQg SSBjYW4gbGl2ZSB3aXRoIGEgRGF0YS50IGFycmF5IQ0KDQoNCllhd2FyIEFtaW4gdGhlbiBhZGRl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgRXZlcnlib2R5IGhhcyB0aGVpciBmYXZvdXJpdGUgd2F5IG9mIHdyYXBw aW5nIFNRTGl0ZS4gSGVyZSdzIG1pbmUgKG5vDQogIFBQWCk6IDxodHRwczovL2dpdGh1Yi5jb20v eWF3YXJhbWluL29jYW1sX3NxbF9xdWVyeT4NCg0KICBJdCBoYXMgYSBsaXR0bGUgZGF0YSB0cmFu c2xhdGlvbiBsYXllciB0byBjb252ZXJ0IGZyb20gYERhdGEudCcgYXJyYXkNCiAgdG8gdGhlIGRl c2lyZWQgcmV0dXJuIHR5cGUuDQoNCg0KRG9jdUxpYiAzLjEuMiBhbmQgTWV0YURCIDEuMC4yIG5v dyBvbiBPUEFNDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2RvY3VsaWItMy0xLTItYW5kLW1ldGFkYi0xLTAtMi1ub3ctb24tb3BhbS8x MDIwNC8xPg0KDQoNCm5ndWVybW9uZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBwbGVhc2VkIHRvIGFu bm91bmNlIHRoZSByZWxlYXNlIG9mIGBkb2N1bGliJyBhbmQgYG1ldGFkYicsIG5vdw0KICBhdmFp bGFibGUgb24gT1BBTS4NCg0KICAqRG9jdUxpYiogaXMgYSBHVUkgZm9yIGRvY3VtZW50IG1hbmFn ZW1lbnQsIHBhcnRpY3VsYXJseSBmb3IgYWxsIHRoZQ0KICB0ZXh0Ym9va3MgYW5kIGFydGljbGVz IHlvdSd2ZSBhY2N1bXVsYXRlZCBidXQga25vdyB5b3UnbGwgbmV2ZXIgcmVhZA0KICA6dGhpbmtp bmc6LiBUaGUgaWRlYSBvZiBEb2N1TGliIGlzIHRvIGtlZXAgdHJhY2sgb2YgbWV0YWRhdGEgb2Yg ZmlsZXMNCiAgc3RvcmVkIGFjcm9zcyBtdWx0aXBsZSBsaWJyYXJpZXMgb24geW91ciBmaWxlIHN5 c3RlbSBpbiBzdWNoIGEgd2F5DQogIHRoYXQgeW91IGNhbiBtb3ZlLCByZW9yZ2FuaXplLCBvciBy ZW5hbWUgYSBmaWxlIHdpdGhvdXQgbG9zaW5nIHlvdXINCiAgbWV0YWRhdGEuIFlvdSBjYW4gYWRk aXRpb25hbGx5IGxvb2t1cCBtZXRhZGF0YSBvbiBgb3BlbmxpYnJhcnkub3JnJyBvcg0KICBgc2Vt YW50aWNzY2hvbGFyLm9yZycuIERvY3VMaWIgd2lsbCBhbHNvIHdhcm4gYWJvdXQgbWlzc2luZyBh bmQNCiAgZHVwbGljYXRlIGZpbGVzLiBTdG9yZWQgbWV0YWRhdGEgcHJlc2VudGx5IGluY2x1ZGVz IGF1dGhvciwgdGl0bGUsDQogIHllYXIsIHRhZ3MsIGFuZCBET0kvSVNCTi4NCg0KICA8aHR0cHM6 Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdp bmFsLzJYL2YvZmEwNjRjZDMyYmNlNmU1MjcyMmQzMDA0N2Q4ZTBlZjIxZmEwOTY4NC5wbmc+DQoN CiAgRm9yIG1vcmUgc2NyZWVuc2hvdHMgYW5kIGRldGFpbHM6DQogIDxodHRwczovL2dpdGh1Yi5j b20vbmd1ZXJtb25kL2RvY3VsaWI+DQoNCiAgKk1ldGFkYiogaXMgdGhlIEpTT04gZGF0YWJhc2Ug Zm9yIG1hbmlwdWxhdGluZyBmaWxlIG1ldGFkYXRhDQogIHVuZGVybHlpbmcgRG9jdUxpYiwgaW4g aG9wZXMgdGhhdCBpdCBtYXkgYmUgdXNlZnVsIHNvbWV3aGVyZQ0KICBlbHNlLiBEYXRhIGlzIHN0 b3JlZCBpbiB0aGUgZm9sbG93aW5nIHdheToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBwYXRo L3RvL2xpYnJhcnkNCiAg4pSCIHwtIC5tZXRhZGF0YQ0KICDilIIgICAgfC0gLi9mb28udHh0Lmpz b24NCiAg4pSCICAgIHwtIC4vYmxhaC9iYXIucGRmLmpzb24NCiAg4pSCICAgIHwtIC4vZm9vYmFy LnBkZi5qc29uDQogIOKUgiB8LSAuL2Zvby50eHQNCiAg4pSCIHwtIC4vYmxhaC9iYXIucGRmDQog IOKUgiB8LSAuL2Zvb2Jhci5wZGYNCiAg4pSU4pSA4pSA4pSA4pSADQogIEZvciBkb2N1bWVudGF0 aW9uOiA8aHR0cHM6Ly9naXRodWIuY29tL25ndWVybW9uZC9tZXRhZGI+DQoNCg0KZHVuZSAzLjQu MA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTQtMC8xMDIxMS8xPg0KDQoNCkV0aWVubmUg TWlsbG9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBk dW5lIHRlYW0sIEnigJltIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgdmVy c2lvbiAzLjQuMC4NCg0KICBCdWcgZml4ZXMsIGEgY291cGxlIG5ldyBmZWF0dXJlcywgYmV0dGVy IGhpbnRzIGFuZCBlcnJvciBtZXNzYWdlcyAtIEkNCiAgd29uJ3QgcmVzdGF0ZSB3aGF0J3MgaW4g dGhlIGNoYW5nZWxvZyBiZWxvdy4gIFRoYW5rcyB0byBldmVyeW9uZQ0KICBpbnZvbHZlZCBpbiB0 aGlzIHJlbGVhc2UhDQoNCiAg4oCiIE1ha2UgYGR1bmUgZGVzY3JpYmUnIGNvcnJlY3RseSBoYW5k bGUgb3ZlcmxhcHBpbmcgaW1wbGVtZW50YXRpb25zDQogICAgZm9yIHZpcnR1YWwgbGlicmFyaWVz ICgjNTk3MSwgZml4ZXMgIzU3NDcsIEBlc29wZSkNCg0KICDigKIgQnVpbGRpbmcgdGhlIGBAY2hl Y2snIGFsaWFzIHNob3VsZCBtYWtlIHN1cmUgdGhlIGxpYnJhcmllcyBhbmQNCiAgICBleGVjdXRh YmxlcyBkb24ndCBoYXZlIGRlcGVuZGVuY3kgY3ljbGVzICgjNTg5MiwgQHJncmluYmVyZykNCg0K ICDigKIgW2N0eXBlc10gQWRkIHN1cHBvcnQgZm9yIHRoZSBgZXJybm8nIHBhcmFtZXRlciB1c2lu ZyB0aGUNCiAgICBgZXJybm9fcG9saWN5JyBmaWVsZCBpbiB0aGUgY3R5cGVzIHNldHRpbmdzLiAo IzU4MjcsIEBkcm95bykNCg0KICDigKIgRml4IGBkdW5lIGNvcSB0b3AnIHdoZW4gaXQgaXMgaW52 b2tlZCBvbiBmaWxlcyBmcm9tIGEgc3ViZGlyZWN0b3J5DQogICAgb2YgdGhlIGRpcmVjdG9yeSBj b250YWluaW5nIHRoZSBhc3NvY2lhdGVkIHN0YW56YSAoIzU3ODQsIGZpeGVzDQogICAgIzU1NTIs IEBlamdhbGxlZ28sIEBybGVwaWdyZSwgQEFsaXp0ZXIpDQoNCiAg4oCiIEZpeCBoaW50IHdoZW4g YW4gaW52YWxpZCBtb2R1bGUgbmFtZSBpcyBmb3VuZC4gKCM1OTIyLCBmaXhlcyAjNTI3MywNCiAg ICBAZW1pbGxvbikNCg0KICDigKIgVGhlIGAoY2F0KScgYWN0aW9uIG5vdyBzdXBwb3J0cyBzZXZl cmFsIGZpbGVzLiAoIzU5MjgsIGZpeGVzICM1Nzk1LA0KICAgIEBlbWlsbG9uKQ0KDQogIOKAoiBE dW5lIG5vIGxvbmdlciB1c2VzIHNoaW1tZWQgYE1FVEEnIGZpbGVzIGZvciBPQ2FtbCA1LngsIHNv bGVseSB1c2luZw0KICAgIHRoZSBvbmVzIGluc3RhbGxlZCBieSB0aGUgY29tcGlsZXIuICgjNTkx NiwgQGRyYTI3KQ0KDQogIOKAoiBGaXggaGFuZGxpbmcgb2YgdGhlIGAoZGVwcyknIGZpZWxkIGlu IGAodGVzdCknIHN0YW56YXMgd2hlbiB0aGVyZSBpcw0KICAgIGFuIGAuZXhwZWN0ZWQnIGZpbGUu ICgjNTk1MiwgIzU5NTEsIGZpeGVzICM1OTUwLCBAZW1pbGxvbikNCg0KICDigKIgSWdub3JlIGlu c2lnbmlmaWNhbnQgZmlsZXN5c3RlbSBldmVudHMuIFRoaXMgc3RvcHMgUlBDIGluIHdhdGNoIG1v ZGUNCiAgICBmcm9tIGZsYXNoaW5nIGVycm9ycyBvbiBpbnNpZ25pZmljYW50IGZpbGUgc3lzdGVt IGV2ZW50cyBzdWNoIGFzDQogICAgY2hhbmdlcyBpbiB0aGUgYC5naXQvJyBkaXJlY3RvcnkuICgj NTk1MywgQHJncmluYmVyZykNCg0KICDigKIgRml4IHBhcnNpbmcgbW9yZSBlcnJvciBtZXNzYWdl cyBlbWl0dGVkIGJ5IHRoZSBPQ2FtbCBjb21waWxlci4gSW4NCiAgICBwYXJ0aWN1bGFyLCBtZXNz YWdlcyB3aGVyZSB0aGUgZXhjZXJwdCBsaW5lIG51bWJlciBzdGFydGVkIHdpdGggYQ0KICAgIGJs YW5rIGNoYXJhY3RlciB3ZXJlIHNraXBwZWQuICgjNTk4MSwgQHJncmluYmVyZykNCg0KICDigKIg ZW52IHN0YW56YTogd2FybiBpZiBzb21lIHJ1bGVzIGFyZSBpZ25vcmVkIGJlY2F1c2UgdGhleSBh cHBlYXIgYWZ0ZXINCiAgICBhIHdpbGRjYXJkIHJ1bGUuICgjNTg5OCwgZml4ZXMgIzU4ODYsIEBl bWlsbG9uKQ0KDQogIOKAoiBPbiBXaW5kb3dzLCBYREdfQ0FDSEVfSE9NRSBpcyB0YWtlbiB0byBi ZSB0aGUNCiAgICBgRk9MREVSSURfSW50ZXJuZXRDYWNoZScgaWYgdW5zZXQsIGFuZCBYREdfQ09O RklHX0hPTUUgYW5kDQogICAgWERHX0RBVEFfSE9NRSBhcmUgYm90aCB0YWtlbiB0byBiZSBgRk9M REVSSURfTG9jYWxBcHBEYXRhJyBpZiB1bnNldC4NCiAgICAoIzU5NDMsIGZpeGVzICM1ODA4LCBA bm9qYikNCg0KDQpFdGllbm5lIE1pbGxvbiB0aGVuIGFkZGVkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBUaGlzIGJyb2tlIDMyLWJpdCBjeWd3aW4gaW5zdGFsbGF0aW9ucywgc28gMy40LjEgd2Fz IHJlbGVhc2VkIHdpdGggYQ0KICBmaXguDQoNCg0KT0NhbWwgNS4wLCBmaXJzdCBub3JtYWwgYWxw aGEgcmVsZWFzZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9v Y2FtbC01LTAtZmlyc3Qtbm9ybWFsLWFscGhhLXJlbGVhc2UvMTAyMTYvMT4NCg0KDQpvY3RhY2hy b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGUgc3RhYmlsaXNhdGlvbiBvZiBPQ2FtbCA1LjAgaGFzIGJl ZW4gcHJvZ3Jlc3Npbmcgd2VsbCBkdXJpbmcgdGhlDQogIGxhc3QgbW9udGguICBXZSBoYXZlIHRo dXMgcmVsZWFzZWQgYSBmaXJzdCBub3JtYWwgYWxwaGEgcmVsZWFzZSBvZg0KICBPQ2FtbCA1LjAu MCB0byBoZWxwIGZlbGxvdyBoYWNrZXJzIGpvaW4gdXMgZWFybHkgaW4gb3VyIGJ1ZyBodW50aW5n DQogIGFuZCBvcGFtIGVjb3N5c3RlbSBmaXhpbmcgZnVuIChzZWUgYmVsb3cgZm9yIHRoZSBpbnN0 YWxsYXRpb24NCiAgaW5zdHJ1Y3Rpb25zKS4NCg0KICBZb3UgY2FuIGZvbGxvdyB0aGUgcHJvZ3Jl c3MgaW4gc3RhYmlsaXNpbmcgdGhlIG9wYW0gZWNvc3lzdGVtIG9uDQoNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvaXNzdWVzLzIxNTI2Pg0KDQogIElmIHlvdSBm aW5kIGFueSBidWdzLCBwbGVhc2UgcmVwb3J0IHRoZW0gaGVyZToNCg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcz4NCg0KICBDb21wYXJlZCB0byB0aGUgemVyb3RoIGFs cGhhIHJlbGVhc2UsIHRoaXMgYWxwaGEgcmVsZWFzZSByZXN0b3JlcyB0aGUNCiAgc3VwcG9ydCBm b3IgdGhlIGJ5dGVjb2RlIGRlYnVnZ2VyLCBhbmQgaW50ZWdyYXRlcyBhIGNoYW5nZSBvZiB0eXBl IGluDQogIHRoZSBGRkkgQVBJIHRoYXQgbWlnaHQgdHJpZ2dlciBzb21lIHdhcm5pbmdzIGluIEZG SSBjb2RlLg0KDQogIFdlIGFsc28gaGF2ZSBhIGNoYW5nZSBpbiB0aGUgaW5zdGFsbGVkIGZpbGVz OiB0aGUgY29tcGlsZXIgZGlzdHJpYnV0ZXMNCiAgbm93IGl0cyBvd24gTUVUQSBmaWxlcyByYXRo ZXIgdGhhbiByZWx5aW5nIG9uIGVpdGhlciBmaW5kbGliIG9yIGR1bmUNCiAgdG8gcHJvdmlkZSB0 aG9zZSBmaWxlcy4gVGhpcyBzaG91bGQgc2ltcGxpZnkgdGhlIHRhc2tzIG9mIGJvdGggdG9vbHMN CiAgaW4gZnV0dXJlIHZlcnNpb24uDQoNCiAgTm90ZSB0aGVyZSBhcmUgc3RpbGwgc29tZSBjaGFu Z2VzIGV4cGVjdGVkIGluIHRoZSBFZmZlY3QgbW9kdWxlIGJlZm9yZQ0KICB0aGUgbmV4dCBjYW5k aWRhdGUgcmVsZWFzZS4gR2VuZXJhbGx5LCBib3RoIHRoZSBFZmZlY3QgYW5kIERvbWFpbg0KICBt b2R1bGVzIGFyZSBzdGlsbCBleHBlcmltZW50YWwgYW5kIG1pZ2h0IGNoYW5nZSBBUEkgZXZlbiBk dXJpbmcgdGhlDQogIGJldGEgcmVsZWFzZXMuDQoNCiAgSWYgeW91IGFyZSBpbnRlcmVzdGVkIGJ5 IHRoZSBvbmdvaW5nIGxpc3Qgb2YgYnVnIGZpeGVzLCB0aGUgdXBkYXRlZA0KICBjaGFuZ2UgbG9n IGZvciBPQ2FtbCA1LjAuMCBpcyBhdmFpbGFibGUgYXQ6DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9ibG9iLzUuMC9DaGFuZ2VzPg0KDQogIEEgc2hvcnQgc3VtbWFyeSBvZiB0 aGUgY2hhbmdlcyBzaW5jZSB0aGUgemVyb3RoIGFscGhhIHJlbGVhc2UgaXMgYWxzbw0KICBhdmFp bGFibGUgYmVsb3cuDQoNCg0KSW5zdGFsbGF0aW9uIGluc3RydWN0aW9ucw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgVGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFt IHN3aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjE6DQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0 ZSA1LjAuMH5hbHBoYTENCiAg4pSU4pSA4pSA4pSA4pSADQogIEZvciBwcmV2aW91cyB2ZXJzaW9u IG9mIG9wYW0sIHRoZSBzd2l0Y2ggY3JlYXRpb24gY29tbWFuZCBsaW5lIGlzDQogIHNsaWdodGx5 IG1vcmUgdmVyYm9zZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDi lIIgb3BhbSBzd2l0Y2ggY3JlYXRlIDUuMC4wfmFscGhhMSAtLXJlcG9zaXRvcmllcz1kZWZhdWx0 LGJldGE9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnku Z2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KICBJZiB5b3Ugd2FudCB0byB0ZXN0IHRoaXMgdmVyc2lv biwgaXQgaXMgc3Ryb25nbHkgYWR2aXNlZCB0byBpbnN0YWxsDQogIHRoZSBhbHBoYSBvcGFtIHJl cG9zaXRvcnkNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEt cmVwb3NpdG9yeT4NCg0KICB3aXRoDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSByZXBv IGFkZCBhbHBoYSBnaXQraHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEt cmVwb3NpdG9yeS5naXQNCiAg4pSU4pSA4pSA4pSA4pSADQogIFlvdSBjYW4gY2hlY2sgdGhhdCB0 aGUgYWxwaGEgcmVwb3NpdG9yeSBoYXMgYmVlbiBjb3JyZWN0bHkgaW5zdGFsbGVkDQogIHdpdGgN Cg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgb3BhbSByZXBvDQogIOKUgiANCiAg4pSCIDw+ PD4gUmVwb3NpdG9yeSBjb25maWd1cmF0aW9uIGZvciBzd2l0Y2ggNS4wLjB+YWxwaGExIDw+PD48 Pjw+PD48Pjw+PD48Pjw+PD48Pjw+DQogIOKUgiAgMSBhbHBoYSAgIGdpdCtodHRwczovL2dpdGh1 Yi5jb20va2l0LXR5LWthdGUvb3BhbS1hbHBoYS1yZXBvc2l0b3J5LmdpdA0KICDilIIgIDIgZGVm YXVsdCBodHRwczovL29wYW0ub2NhbWwub3JnDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMg YWxwaGEgcmVwb3NpdG9yeSBjb250YWlucyB2YXJpb3VzIGZpeGVzIGluIHRoZSBwcm9jZXNzIG9m IGJlaW5nDQogIHVwc3RyZWFtZWQgd2hpY2ggdmFzdGx5IGluY3JlYXNlcyB0aGUgbnVtYmVyIG9m IG9wYW0gcGFja2FnZXMNCiAgY3VycmVudGx5IGNvbXBhdGlibGUgd2l0aCBPQ2FtbCA1LjAuMCAu DQoNCiAgSWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBp bGVyLCB5b3UgY2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRl IDxzd2l0Y2hfbmFtZT4gb2NhbWwtdmFyaWFudHMuNS4wLjB+YWxwaGExK29wdGlvbnMgPG9wdGlv bl9saXN0Pg0KICDilJTilIDilIDilIDilIANCg0KICB3aGVyZSBgb3B0aW9uX2xpc3QnIGlzIGEg Y29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYG9jYW1sLW9wdGlvbi0qJw0KICBwYWNrYWdlcy4gRm9y IGluc3RhbmNlLCBmb3IgYSBmbGFtYmRhIGFuZCBuby1mbGF0LWZsb2F0LWFycmF5IHN3aXRjaDoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS4wLjB+YWxwaGEx K2ZsYW1iZGErbmZmYSBvY2FtbC12YXJpYW50cy41LjAuMH5hbHBoYTErb3B0aW9ucyBvY2FtbC1v cHRpb24tZmxhbWJkYQ0KICDilIIgb2NhbWwtb3B0aW9uLW5vLWZsYXQtZmxvYXQtYXJyYXkNCiAg 4pSU4pSA4pSA4pSA4pSADQogIFRoZSBjb21tYW5kIGxpbmUgYWJvdmUgaXMgc2xpZ2h0bHkgbW9y ZSBjb21wbGljYXRlZCBmb3Igb3BhbSB2ZXJzaW9uDQogIGFudGVyaW9yIHRvIDIuMToNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIHVwZGF0ZQ0KICDilIIgb3BhbSBzd2l0Y2ggY3JlYXRl IDxzd2l0Y2hfbmFtZT4gLS1wYWNrYWdlcz1vY2FtbC12YXJpYW50cy41LjAuMH5hbHBoYTErb3B0 aW9ucyw8b3B0aW9uX2xpc3Q+DQogIOKUgiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LGJldGE9Z2l0 K2h0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIEluIGJvdGggY2FzZXMsIGFsbCBhdmFpbGFibGUgb3B0aW9ucyBj YW4gYmUgbGlzdGVkIHdpdGggYG9wYW0gc2VhcmNoDQogIG9jYW1sLW9wdGlvbicuDQoNCiAgVGhl IHNvdXJjZSBjb2RlIGZvciB0aGUgYWxwaGEgaXMgYWxzbyBhdmFpbGFibGUgYXQgdGhlc2UgYWRk cmVzc2VzOg0KDQogIOKAoiA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUv NS4wLjAtYWxwaGExLnRhci5nej4NCiAg4oCiIDxodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rp c3RyaWIvb2NhbWwtNS4wL29jYW1sLTUuMC4wfmFscGhhMS50YXIuZ3o+DQoNCg0KQ2hhbmdlcyBz aW5jZSB0aGUgemVyb3RoIGFscGhhIHJlbGVhc2U6DQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KUnVudGltZSBzeXN0ZW06DQri lITilITilITilITilITilITilITilITilITilITilITilITilITilITilIQNCg0KICDigKIgWyMx MTQwMF06IFJ1bnRpbWUgZXZlbnRzIGNvdW50ZXJzIGZpeGVzIEZpeGVzIG1pc21hdGNoIGJldHdl ZW4gT0NhbWwNCiAgICBhbmQgQyBBUElzLCByZW1vdmVzIGV2ZW50cyBmcm9tIDQueCB0aGF0IGFy ZSBub3QgcHJlc2VudCBpbiB0aGUgNS4wDQogICAgR0MgYW5kIGFkZHMgc29tZSBtaXNzaW5nIHBy b2Jlcy4gIChTYWRpcSBKYWZmZXIsIHJldmlldyBieSBHYWJyaWVsDQogICAgU2NoZXJlciwgRmxv cmlhbiBBbmdlbGV0dGkpDQoNCiAg4oCiIFsjMTEzNjhdOiBSdW50aW1lIGV2ZW50cyBidWZmZXIg c2l6ZSBPQ0FNTFJVTlBBUkFNUyBmaXggVGhlIHJ1bnRpbWUNCiAgICBldmVudHMgYnVmZmVyIHNp emUgY2FuIG5vdyBiZSBzZXQgdmlhIHRoZSAnZScgT0NBTUxSVU5QQVJBTS4gIFRoaXMNCiAgICBp cyBwcmV2aW91c2x5IG1pc3Rha2VubHkgZW5hYmxlZC9kaXNhYmxlZCB0cmFjaW5nIGluc3RlYWQu ICAoU2FkaXENCiAgICBKYWZmZXIsIHJldmlldyBieSBLQyBTaXZhcmFtYWtyaXNobmFuLCBEYXZp ZCBBbGxzb3BwLCBEYW1pZW4NCiAgICBEb2xpZ2V6KQ0KDQogIOKAoiBbIzExMzA0XTogRml4IGRh dGEgcmFjZSBvbiBXaW5kb3dzIGZpbGUgZGVzY3JpcHRvcnMgKE9saXZpZXIgTmljb2xlDQogICAg YW5kIFhhdmllciBMZXJveSwgcmV2aWV3IGJ5IFhhdmllciBMZXJveSwgRGF2aWQgQWxsc29wcCwg YW5kIFNhZGlxDQogICAgSmFmZmVyKQ0KDQogIOKAoiAqYnJlYWtpbmcgY2hhbmdlKiBbIzExMzM3 XTogcGFzcyAnZmxhZ3MnIG1ldGFkYXRhIHRvIHJvb3Qgc2Nhbm5lcnMsDQogICAgIHRvIG9wdGlt aXplIHN0YWNrIHNjYW5uaW5nIGluIHRoZSBieXRlY29kZSBpbnRlcnByZXRlci4gQ2hhbmdlcyB0 aGUNCiAgICAgaW50ZXJmYWNlIG9mIHVzZXItcHJvdmlkZWQgcm9vdC1zY2FubmluZyBob29rcy4g KEdhYnJpZWwgU2NoZXJlciwNCiAgICAgcmV2aWV3IGJ5IFhhdmllciBMZXJveSwgR3VpbGxhdW1l IE11bmNoLU1hY2NhZ25vbmksIFNhZGlxIEphZmZlcg0KICAgICBhbmQgVG9tIEtlbGx5KQ0KDQog IOKAoiBbIzExMTQ0XTogUmVzdG9yZSBmcmFtZS1wb2ludGVycyBzdXBwb3J0IGZvciBhbWQ2NCAo RmFicmljZSBCdW9ybywNCiAgICByZXZpZXcgYnkgRnJlZGVyaWMgQm91ciBhbmQgS0MgU2l2YXJh bWFrcmlzaG5hbikNCg0KICDigKIgKmJyZWFraW5nIGNoYW5nZSogWyMxMTI1NV06IGluIHRoZSBD IGludGVyZmFjZSwgYCZGaWVsZCh2LCBpKScgbm93DQogICAgIGhhcyB0eXBlIGB2b2xhdGlsZSB2 YWx1ZSAqJyBpbnN0ZWFkIG9mIGB2YWx1ZSAqJyBpbiBPQ2FtbCA0LiAgVGhpcw0KICAgICBtYWtl cyB0aGUgbWVtb3J5IG1vZGVsIGZvciBtaXhlZCBPQ2FtbC9DIGNvZGUgYmV0dGVyIGRlZmluZWQs IGJ1dA0KICAgICBjYW4gY2F1c2Ugd2FybmluZ3Mgb3IgdHlwZSBlcnJvcnMgaW4gdXNlciBDIGNv ZGUuIChLQw0KICAgICBTaXZhcmFtYWtyaXNobmFuLCByZXZpZXcgYnkgWGF2aWVyIExlcm95LCBH YWJyaWVsIFNjaGVyZXIgYW5kDQogICAgIEd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pLCBhZGRp dGlvbmFsIGRpc2N1c3Npb25zIHdpdGggU3RlcGhlbg0KICAgICBEb2xhbiBhbmQgTHVjIE1hcmFu Z2V0KQ0KDQoNClsjMTE0MDBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVz LzExNDAwPg0KDQpbIzExMzY4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMTM2OD4NCg0KWyMxMTMwNF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMvMTEzMDQ+DQoNClsjMTEzMzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzExMzM3Pg0KDQpbIzExMTQ0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMTE0ND4NCg0KWyMxMTI1NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvMTEyNTU+DQoNCg0KU3RhbmRhcmQgbGlicmFyeToNCuKUhOKUhOKUhOKUhOKUhOKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbIzEwODY3XSwgK1sjMTEz NDVdOiBSZW1vdmUgZGVwcmVjYXRlZCB2YWx1ZXM6IOKApiwgdGhlIGluZml4IG9wZXJhdG9yDQog ICAgKC5bIF08LSkuIChOaWNvbMOhcyBPamVkYSBCw6RyLCByZXZpZXcgYnkgRGFtaWVuIERvbGln ZXopDQoNCiAg4oCiIFsjMTEzMDldLCBbIzExNDI0XSwgWyMxMTQyN106IEFkZA0KICAgIERvbWFp bi5yZWNvbW1lbmRlZF9kb21haW5fY291bnQuIChDaHJpc3RpYW5vIEhhZXNiYWVydCwgS29uc3Rh bnRpbg0KICAgIEJlbG91c292LCByZXZpZXcgYnkgRGF2aWQgQWxsc29wcCwgS0MgU2l2YXJhbWFr cmlzaG5hbiwgR2FicmllbA0KICAgIFNjaGVyZXIsIE5pY29sYXMgT2plZGEgQmFyKQ0KDQoNClsj MTA4NjddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwODY3Pg0KDQpb IzExMzQ1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTM0NT4NCg0K WyMxMTMwOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEzMDk+DQoN ClsjMTE0MjRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNDI0Pg0K DQpbIzExNDI3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTQyNz4N Cg0KDQpUb29sczoNCuKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbIzExMDY1XTogUG9ydCB0 aGUgYnl0ZWNvZGUgZGVidWdnZXIgdG8gNS4wLCBhZGRpbmcgc3VwcG9ydCBmb3INCiAgICBlZmZl Y3QgaGFuZGxlcnMuIChEYW1pZW4gRG9saWdleiBhbmQgZmFiYmluZywgcmV2aWV3IGJ5IGZhYmJp bmcgYW5kDQogICAgWGF2aWVyIExlcm95KQ0KDQogIOKAoiBbIzExMzgyXTogT0NhbWxta3RvcCB1 c2UgYSBuZXcgaW5pdGlhbGl6YXRpb24gbW9kdWxlDQogICAgIk9DYW1sbWt0b3BfaW5pdCIgdG8g cHJlc2VydmUgYmFja3dhcmQtY29tcGF0aWJpbGl0eSB3aXRoDQogICAgdXNlci1tb2R1bGUgcHJv dmlkZWQgbW9kdWxlcyB0aGF0IGluc3RhbGwgdG9wbGV2ZWwgcHJpbnRlcnMuDQogICAgKEZsb3Jp YW4gQW5nZWxldHRpLCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyIGFuZCBEYXZpZCBBbGxzb3Bw KQ0KDQoNClsjMTEwNjVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEx MDY1Pg0KDQpbIzExMzgyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8x MTM4Mj4NCg0KDQpJbnN0YWxsYXRpb246DQrilITilITilITilITilITilITilITilITilITilITi lITilITilIQNCg0KICDigKIgWyMxMTAwN10sIFsjMTEzOTldOiBNRVRBIGZpbGVzIGZvciB0aGUg c3RkbGliLCBjb21waWxlci1saWJzIGFuZA0KICAgIG90aGVyIGxpYnJhcmllcyAodW5peCwgZHlu bGluaywgc3RyLCBydW50aW1lX2V2ZW50cywgdGhyZWFkcywNCiAgICBvY2FtbGRvYykgYXJlIG5v dyBpbnN0YWxsZWQgYWxvbmcgd2l0aCB0aGUgY29tcGlsZXIuIChEYXZpZCBBbGxzb3BwLA0KICAg IEZsb3JpYW4gQW5nZWxldHRpLCBOaWNvbMOhcyBPamVkYSBCw6RyIGFuZCBTw6liYXN0aWVuIEhp bmRlcmVyLCByZXZpZXcNCiAgICBieSBEYW5pZWwgQsO8bnpsaSwgS2F0ZSBEZXBsYWl4LCBBbmls IE1hZGhhdmFwZWRkeSBhbmQgR2FicmllbA0KICAgIFNjaGVyZXIpDQoNCg0KWyMxMTAwN10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEwMDc+DQoNClsjMTEzOTldIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExMzk5Pg0KDQoNCkJ1ZyBmaXhl czoNCuKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIOKAoiBbIzEwNzY4XSwgWyMx MTM0MF06IEZpeCB0eXBlY2hlY2tpbmcgcmVncmVzc2lvbiB3aGVuIGNvbWJpbmluZyBmaXJzdA0K ICAgIGNsYXNzIG1vZHVsZXMgYW5kIEdBRFRzLiAoSmFjcXVlcyBHYXJyaWd1ZSwgcmVwb3J0IGJ5 IEZyYW7Dp29pcw0KICAgIFRoaXLDqSwgcmV2aWV3IGJ5IE1hdHRoZXcgUnlhbikNCg0KICDigKIg WyMxMDc5MF06IGRvbid0IGRyb3AgdmFyaWFuY2UgYW5kIGluamVjdGl2aXR5IGFubm90YXRpb25z IHdoZW4NCiAgICBwcmV0dHkgcHJpbnRpbmcgYHdpdGgnIGNvbnN0cmFpbnRzIChmb3IgZXhhbXBs ZSwgYHdpdGggdHlwZSArISdhIHQgPQ0KICAgIC4uLicpLiAoRmxvcmlhbiBBbmdlbGV0dGksIHJl cG9ydCBieSBMdWtlIE1hdXJlciwgcmV2aWV3IGJ5IE1hdHRoZXcNCiAgICBSeWFuIGFuZCBHYWJy aWVsIFNjaGVyZXIpDQoNCiAg4oCiIFsjMTEyODldLCBbIzExNDA1XTogZml4IHNvbWUgbGVha3Mg b24gc3lzdGhyZWFkIHRlcm1pbmF0aW9uIChGYWJyaWNlDQogICAgQnVvcm8sIEVuZ3VlcnJhbmQg RGVjb3JuZSwgR2FicmllbCBTY2hlcmVyLCByZXZpZXcgYnkgWGF2aWVyIExlcm95DQogICAgYW5k IEZsb3JpYW4gQW5nZWxldHRpLCByZXBvcnQgYnkgUm9tYWluIEJlYXV4aXMpDQoNCiAg4oCiIFsj MTEzMTRdLCBbIzExNDE2XTogZml4IG5vbi1pbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlIGZvciBt b2R1bGUNCiAgICBpbmNsdXNpb24gKEZsb3JpYW4gQW5nZWxldHRpLCByZXBvcnQgYnkgVGhpZXJy eSBNYXJ0aW5leiwgcmV2aWV3IGJ5DQogICAgR2FicmllbCBTY2hlcmVyKQ0KDQogIOKAoiBbIzEx MzU4XSwgWyMxMTM3OV06IFJlZmFjdG9yIHRoZSBpbml0aWFsaXphdGlvbiBvZiBieXRlY29kZQ0K ICAgIHRocmVhZGluZywgVGhpcyBhdm9pZHMgYSAiZGFuZ2xpbmcgcG9pbnRlciIgd2FybmluZyBv ZiBHQ0MNCiAgICAxMi4xLiAoWGF2aWVyIExlcm95LCByZXBvcnQgYnkgQXJtYcOrbCBHdcOpbmVh dSwgcmV2aWV3IGJ5IEdhYnJpZWwNCiAgICBTY2hlcmVyKQ0KDQogIOKAoiBbIzExMzg3XSwgbW9k dWxlIHR5cGUgd2l0aCBjb25zdHJhaW50cyBubyBsb25nZXIgY3Jhc2ggdGhlIGNvbXBpbGVyDQog ICAgaW4gcHJlc2VuY2Ugb2YgYm90aCBzaGFkb3dpbmcgd2FybmluZ3MgYW5kIHRoZSBgLWJpbi1h bm5vdCcgY29tcGlsZXINCiAgICBmbGFnLiAoRmxvcmlhbiBBbmdlbGV0dGksIHJlcG9ydCBieSBD aHJpc3RvcGhlIFJhZmZhbGxpLCByZXZpZXcgYnkNCiAgICBHYWJyaWVsIFNjaGVyZXIpDQoNCg0K WyMxMDc2OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA3Njg+DQoN ClsjMTEzNDBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExMzQwPg0K DQpbIzEwNzkwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDc5MD4N Cg0KWyMxMTI4OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEyODk+ DQoNClsjMTE0MDVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNDA1 Pg0KDQpbIzExMzE0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTMx ND4NCg0KWyMxMTQxNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE0 MTY+DQoNClsjMTEzNThdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEx MzU4Pg0KDQpbIzExMzc5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8x MTM3OT4NCg0KWyMxMTM4N10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTEzODc+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1RhcmlkZXMgaXMgb24gdGhl IFdhdmVzdG9uZSBSYWRhciFdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2Nh bWwub3JnL2Jsb2cvPg0KDQpbVGFyaWRlcyBpcyBvbiB0aGUgV2F2ZXN0b25lIFJhZGFyIV0NCjxo dHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyMi0wNy0xOS10YXJpZGVzLWlzLW9uLXRoZS13YXZl c3RvbmUtcmFkYXI+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5k IEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2 ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl DQogIFtvbmxpbmVdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdl XSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZl XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhl IGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0K W29ubGluZV0gPGh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWts eS8+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 19 to 26, 2022.

    Help w. my first GADT : unwrapping Sqlite3.Data.t

    Philippe Strauss asked

    I would like to convert sqlite3-ocaml returns from Sqlite3.Data.t array to = plain ocaml types in a tuple. I guess unwrapping the Data.t can be done using a GADT, here's my very very first a= ttempt:

    (* simulate Sqlite3.Data.t *)
    
    type t =3D
    | NONE
    | NULL
    | INT of int64
    | FLOAT <=
    span style=3D"color: #a020f0;">of float
    | TEXT of string
    | BLOB of string ;;
    
    (* a=
     simple GADT to unwrap Sqlite3.Data.t *)
    
    type _ dbval =3D
        | INT=
     : int64 -> int64 dbval
        | FLOAT : float -> float dbval
        | TEXT : string -> string dbval
        | BLOB : string -> string dbval
        | NONE | NULL =
    ;;
    
    let unwrap_data : <=
    /span>type a. a dbval -> a =3D fun dbval ->
        match dbval with
        | INT=
     x -> x
        | FLOAT x -> x
        | TEXT str -> str
        | BLOB str -> str ;;
    
    let tuple_of_array4 ( t array) =3D
        assert (Array.length arr =3D 4) ;
        (unwrap_data arr.(0), unwrap_data arr.(1), unwrap_data arr.(2), unwrap_=
    data arr.(3)) ;;
    

    Compilation fails with this typing error:

    File "database.ml", line 233, characters 17-24:
    233 |     (unwrap_data arr.(0), unwrap_data arr.(1), unwrap_data arr.(2), u=
    nwrap_data arr.(3)) ;;
                           ^^^^^^^
    Error: This expres=
    sion has type t but an expression was expected of type
             'a dbval
    

    What am I doing wrong? I need to make type t compatible with type 'a dbval. Thanks in advance.

    octachron replied

    You cannot make the type t and 'a dbval compatibl= e, there are different types.

    A very important point to keep in mind with GADTs is that one cannot create= type-level information from dynamical values. In other words, there are no functions of type ~ x : t -> f(x) = dbval~that will infer the type of its return from the value of its argument in OCaml.

    Thus the type of the final result must come from your code source rather th= an from the dynamical data. For instance, you can define constructor from the type t to th= e right dbval type:

    exception Type_error
    
    let int: t -> _ =
    dbval =3D function
    | INT x -=
    > INT x
    | _ -> raise Type_error
    
    let float: t -> =
    _ dbval =3D function
    | FLOAT x=
     -> FLOAT x
    | _ -> raise Type_error
    

    Then if you know the type of the tuple, you can write it as:

    let tuple_of_array4 (arr: t =
    array) =3D
        assert (Array.length arr =3D 4) ;
        int arr.(0), int arr.(1), int arr.(2), int arr.(3)
    

    or possibly as

    let int4 =3D int, int, i=
    nt, int
    let tuple (a=
    ,b,c=
    ,d) arr =3D
      assert (Array.length arr =3D 4) ;
      a arr.(0), b arr.(1), c arr.(2), d arr.(3)
    

    There are more complex alternatives based on type witness, that allow to im= plement a form of static matching over the dynamical type of data, but the core idea that the types are always present= in the source code in some way is the same.

    Philippe Strauss then said

    Oh I didn't noticed it would be dynamical typing! I'm too used to ppx (and = previously camlp4) written db abstraction layer!

    I'm simply replacing sqlexpr by plain sqlite3-ocaml in some existing code o= f mine. sqlexpr quick doco:

    https://github.com/mfp/oca= ml-sqlexpr

    But I can live with a Data.t array!

    Yawar Amin then added

    Everybody has their favourite way of wrapping SQLite. Here's mine (no PPX): https://github.com= /yawaramin/ocaml_sql_query

    It has a little data translation layer to convert from Data.t = array to the desired return type.

    DocuLib 3.1.2 and MetaDB 1.0.2 now on OPAM

    nguermond announced

    I'm pleased to announce the release of doculib and metad= b, now available on OPAM.

    DocuLib is a GUI for document management, particularly for all the t= extbooks and articles you've accumulated but know you'll never read :thinking:. The idea of DocuLib is to keep track of = metadata of files stored across multiple libraries on your file system in such a way that you can move, reorganize, = or rename a file without losing your metadata. You can additionally lookup metadata on openlibrary.org or semanticscholar.org. DocuLib will also warn about missing and duplicate files. Stored metadata presently includes autho= r, title, year, tags, and DOI/ISBN.

    3D"fa064cd32b=

    For more screenshots and details: https://github.com/nguermond/doculib

    Metadb is the JSON database for manipulating file metadata underlyin= g DocuLib, in hopes that it may be useful somewhere else. Data is stored in the following way:

    path/to/library
    |- .metadata
       |- ./foo.txt.json
       |- ./blah/bar.pdf.json
       |- ./foobar.pdf.json
    |- ./foo.txt
    |- ./blah/bar.pdf
    |- ./foobar.pdf
    

    For documentation: https://= github.com/nguermond/metadb

    dune 3.4.0

    Etienne Millon announced

    On behalf of the dune team, I=E2=80=99m pleased to announce the release of = version 3.4.0.

    Bug fixes, a couple new features, better hints and error messages - I won't= restate what's in the changelog below. Thanks to everyone involved in this release!

    • Make dune describe correctly handle overlapping implementa= tions for virtual libraries (#5971, fixes #5747, @esope)
    • Building the @check alias should make sure the libraries a= nd executables don't have dependency cycles (#5892, @rgrinberg)
    • [ctypes] Add support for the errno parameter using the errno_policy field in the ctypes settings. (#5827, @droyo)
    • Fix dune coq top when it is invoked on files from a subdir= ectory of the directory containing the associated stanza (#5784, fixes #5552, @ejgallego, @rlepigre, @Alizter)
    • Fix hint when an invalid module name is found. (#5922, fixes #5273, @em= illon)
    • The (cat) action now supports several files. (#5928, fixes= #5795, @emillon)
    • Dune no longer uses shimmed META files for OCaml 5.x, sole= ly using the ones installed by the compiler. (#5916, @dra27)
    • Fix handling of the (deps) field in (test) st= anzas when there is an .expected file. (#5952, #5951, fixes #5950, @emillon)
    • Ignore insignificant filesystem events. This stops RPC in watch mode fr= om flashing errors on insignificant file system events such as changes in the .git/ directory. (#5953, @rgrinberg)
    • Fix parsing more error messages emitted by the OCaml compiler. In particular, messages where the excerpt line number started with a blank character were skipped. (#5981, @rgrinberg)
    • env stanza: warn if some rules are ignored because they appear after a wildcard rule. (#5898, fixes #5886, @emillon)
    • On Windows, XDG_CACHE_HOME is taken to be the FOLDERID_InternetCa= che if unset, and XDG_CONFIG_HOME and XDG_DATA_HOME are both taken to be FOLDERID_LocalAppData if unset. (#5943, fixes #5808, @nojb)

    Etienne Millon then added

    This broke 32-bit cygwin installations, so 3.4.1 was released with a fix.

    OCaml 5.0, first normal alpha release

    octachron announced

    The stabilisation of OCaml 5.0 has been progressing well during the last mo= nth. We have thus released a first normal alpha release of OCaml 5.0.0 to help fellow hackers join us early in our bug hunting and opam ecosystem fixing f= un (see below for the installation instructions).

    You can follow the progress in stabilising the opam ecosystem on

    https://g= ithub.com/ocaml/opam-repository/issues/21526

    If you find any bugs, please report them here:

    https://github.com/ocaml/= ocaml/issues

    Compared to the zeroth alpha release, this alpha release restores the suppo= rt for the bytecode debugger, and integrates a change of type in the FFI API t= hat might trigger some warnings in FFI code.

    We also have a change in the installed files: the compiler distributes now = its own META files rather than relying on either findlib or dune to provide tho= se files. This should simplify the tasks of both tools in future version.

    Note there are still some changes expected in the Effect module before the = next candidate release. Generally, both the Effect and Domain modules are still experimental and might change API even during the beta releases.

    If you are interested by the ongoing list of bug fixes, the updated change log for OCaml 5.0.0 is available at:

    https://github.= com/ocaml/ocaml/blob/5.0/Changes

    A short summary of the changes since the zeroth alpha release is also avail= able below.

    Installation instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1:

    opam update
    opam switch create 5.0.0~alpha1
    

    For previous version of opam, the switch creation command line is slightly = more verbose:

    opam update
    opam switch create 5.0.0~alpha1 --repositories=3Ddefault,beta=3Dgit+https:/=
    /github.com/ocaml/ocaml-beta-repository.git
    

    If you want to test this version, it is strongly advised to install the alp= ha opam repository

    https://gi= thub.com/kit-ty-kate/opam-alpha-repository

    with

    opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-repositor=
    y.git
    

    You can check that the alpha repository has been correctly installed with

    $ opam repo
    
    <><> Repository configuration for switch 5.0.0~alpha1 <>&=
    lt;><><><><><><><><><=
    ><><>
     1 alpha   git+https://github.com/kit-ty-kate/opam-alpha-repository.git
     2 default https://opam.ocaml.org
    

    This alpha repository contains various fixes in the process of being upstre= amed which vastly increases the number of opam packages currently compatible with OCam= l 5.0.0 .

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.0.0~alpha1+options =
    <option_list>
    

    where option_list is a comma separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array switch:

    opam switch create 5.0.0~alpha1+flambda+nffa ocaml-variants.5.0.0~alpha1+op=
    tions ocaml-option-flambda
    ocaml-option-no-flat-float-array
    

    The command line above is slightly more complicated for opam version anteri= or to 2.1:

    opam update
    opam switch create <switch_name> --packages=3Docaml-variants.5.0.0~al=
    pha1+options,<option_list>
    --repositories=3Ddefault,beta=3Dgit+https://github.com/ocaml/ocaml-beta-rep=
    ository.git
    

    In both cases, all available options can be listed with opam search o= caml-option.

    The source code for the alpha is also available at these addresses:

    Changes since the zeroth alpha release:

    Runtime system:
    • #11400: Run= time events counters fixes Fixes mismatch between OCaml and C APIs, removes events from 4.x that are not present in the 5.0 GC and adds some missing probes. (Sadiq Jaffer, review by Gabriel Scherer, Florian Angeletti)
    • #11368: Run= time events buffer size OCAMLRUNPARAMS fix The runtime events buffer size can now be set via the 'e' OCAMLRUNPARAM. This is previously mistakenly enabled/disabled tracing instead. (Sadiq Jaffer, review by KC Sivaramakrishnan, David Allsopp, Damien Doligez= )
    • #11304: Fix= data race on Windows file descriptors (Olivier Nicole and Xavier Leroy, review by Xavier Leroy, David Allsopp, and Sadiq Jaffer)
    • breaking change #11337: pass 'flags' metadata to root scanners, to optimize sta= ck scanning in the bytecode interpreter. Changes the interface of user-prov= ided root-scanning hooks. (Gabriel Scherer, review by Xavier Leroy, Guillau= me Munch-Maccagnoni, Sadiq Jaffer and Tom Kelly)
    • #11144: Res= tore frame-pointers support for amd64 (Fabrice Buoro, review by Frederic Bour and KC Sivaramakrishnan)
    • breaking change #11255: in the C interface, &Field(v, i) now h= as type volatile value * instead of value * in OC= aml 4. This makes the memory model for mixed OCaml/C code better defined, = but can cause warnings or type errors in user C code. (KC Sivaramakrishnan,= review by Xavier Leroy, Gabriel Scherer and Guillaume Munch-Maccagnoni, ad= ditional discussions with Stephen Dolan and Luc Maranget)
    Standard library:
    • #10867, +#11345: Remove de= precated values: =E2=80=A6, the infix operator (.[ ]<-). (Nicol=C3=A1s = Ojeda B=C3=A4r, review by Damien Doligez)
    • #11309, #11424, #11427: Add Domain.recomm= ended_domain_count. (Christiano Haesbaert, Konstantin Belousov, review by D= avid Allsopp, KC Sivaramakrishnan, Gabriel Scherer, Nicolas Ojeda Bar)
    Tools:
    • #11065: Por= t the bytecode debugger to 5.0, adding support for effect handlers. (Damien= Doligez and fabbing, review by fabbing and Xavier Leroy)
    • #11382: OCa= mlmktop use a new initialization module "OCamlmktop_init" to preserve backward-compatibility with user-module provided modules that inst= all toplevel printers. (Florian Angeletti, review by Gabriel Scherer and David Allsopp)
    Installation:
    • #11007, #11399: META files= for the stdlib, compiler-libs and other libraries (unix, dynlink, str, run= time_events, threads, ocamldoc) are now installed along with the compiler. = (David Allsopp, Florian Angeletti, Nicol=C3=A1s Ojeda B=C3=A4r and S=C3=A9b= astien Hinderer, review by Daniel B=C3=BCnzli, Kate Deplaix, Anil Madhavape= ddy and Gabriel Scherer)
    Bug fixes:
    • #10768, #11340: Fix typech= ecking regression when combining first class modules and GADTs. (Jacques Ga= rrigue, report by Fran=C3=A7ois Thir=C3=A9, review by Matthew Ryan)
    • #10790: don= 't drop variance and injectivity annotations when pretty printing wit= h constraints (for example, with type +!'a t =3D ...). = (Florian Angeletti, report by Luke Maurer, review by Matthew Ryan and Gabri= el Scherer)
    • #11289, #11405: fix some l= eaks on systhread termination (Fabrice Buoro, Enguerrand Decorne, Gabriel S= cherer, review by Xavier Leroy and Florian Angeletti, report by Romain Beau= xis)
    • #11314, #11416: fix non-in= formative error message for module inclusion (Florian Angeletti, report by = Thierry Martinez, review by Gabriel Scherer)
    • #11358, #11379: Refactor t= he initialization of bytecode threading, This avoids a "dangling pointer" w= arning of GCC 12.1. (Xavier Leroy, report by Arma=C3=ABl Gu=C3=A9neau, revi= ew by Gabriel Scherer)
    • #11387, mod= ule type with constraints no longer crash the compiler in presence of both = shadowing warnings and the -bin-annot compiler flag. (Florian = Angeletti, report by Christophe Raffalli, review by Gabriel Scherer)

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 25CB4E00B4 for ; Tue, 2 Aug 2022 11:51:46 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=UYwe=YG=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: gUdjIIBoX+vyuJP1pbgJuC1wUodFaq/z5JyKSMAY1ovbTGqBCthLIkMOzC/gOxLbhfeImThe7C KmZ4YUsVWnfu8Hq3AYos/mgkZS/+1VOyvvUQNhZ7DKmPZsm0MNYiKtwsRktPpDz3aiN8GfuKxF GBfFghBwj61MnE55SA/NNYuQd7FEWtkY3qy7cBsAdKHXkK89WIz07hF6tLXtpIO0InSnmm2wpF 4BzSHgaSePNjA13/8gA2tUWDkvyiT5ge/kNpITlXLhWON5MNCGyg/dc42GRQcYVT0pAXTZ2VZo EPMNQY9Tgo8QJvF6bT//kDPv X-IPAS-Result: =?us-ascii?q?A0DyAgD/8uhimCIeaIFagRWCZFsoGQFhBlcuBwhFAoRMi?= =?us-ascii?q?H4JiASBFoIVhi2PJIQUgXMBAwENLAEMBgECBAEBghKCdFEJhB4CHgYBBTMTA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEBAQEBCQsJBwYMB?= =?us-ascii?q?RAOBTxkZASBSwSBdAs0DYI1DIQGAwEbBgoTAQE4GBQPAwoBCQcDAhEBFwEeA?= =?us-ascii?q?xQBEhQGggtYAYMaAwQBC4wqmxp6gTGBAYIIAQEGgT8BFQMBDgkmg3aBEkoJJ?= =?us-ascii?q?IEZhjZhTAGDGoQgAicQgVVEgRWCKRI4BQJugUEBDgF6FwEBAQEBgR8JARECA?= =?us-ascii?q?U0bAoMMgmWHIIRXi24HNwNFHkIDC1YICRcSEBACBBEaCwYDFj4JAgQOA0AID?= =?us-ascii?q?QMRBAMPGAkSCBAEBgMxDCULAwUPDAEGAwYFAwEDGwMUAwUkBwMcDyMNDQQfH?= =?us-ascii?q?QMDBSUDAgIbBwICAwIGFQYCAhg2OQgECAQrIw8FAgcvBQQvAh4EBQYRCAIWA?= =?us-ascii?q?gYEBAQEFgIQCAIIJxcHEzMZAQVZEAkhFgYoEAUGEwMgSSYFRQ8oMzU8Kx8bC?= =?us-ascii?q?oESKgkiFQMEBAMCBhgDAyICEC4xAxUGKRMSLQkrdQkCAyJtAwMEKi4DCSEfB?= =?us-ascii?q?wkmK5R1ggqBQA4LZQwjASgZCA4BASI2OAEKAjASCQFJCzoDhEGNLwYqAyeRO?= =?us-ascii?q?4cklEEZZDQHg1SBPgYMiDGBIo0DTYQLg06DdoFQinSYLSGWXAgYgiqGBn0Ig?= =?us-ascii?q?QoFCYIER4RugUNujRUrhT2BTiqBDl0MBzMaMIMrCUUBAwINAQICAwECAQIJA?= =?us-ascii?q?QECjikWgQQBCIJDewY9gSaBdTuEZGg/NAEBAQEGCCkCBgEKAQEDCYVjAQEFE?= =?us-ascii?q?wsBhjUCAg0XgUZaAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 77s IronPort-HdrOrdr: A9a23:58FEbKmJVTqcY5PTEJN+ZWpL8g7pDfIW3DAbv31ZSRFFG/Fw5P re+MjztCWE7wr5N0tApTntAsW9qBDnhPtICOsqXYtKNTOO0ADEEGgI1+XfKkjbak/DH4Bmup tIQuxXNODQSWJbtK/BijVQa+xQo+VunM2T9IHj80s= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,210,1654552800"; d="scan'208,217";a="47711520" X-MGA-submission: =?us-ascii?q?MDFyYGcn6qV/b0CFSMFZfHLG+k5l7mQm8nHHUU?= =?us-ascii?q?4mCKkV/3NtdZzd6CqHbtGJOBIX+Aq1/ZWbF7aWTkenM8/4RjjicpV8j+?= =?us-ascii?q?0BdWo0sBpru9gSz3rIaNHnUEbsSIttJ+cv26qzzqgqRjpKPH4acFVbLJ?= =?us-ascii?q?5PeLSulsUGQQREOTCQCu1Nmg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Aug 2022 11:51:45 +0200 Received: from set (cbg35-2-78-242-14-140.fbx.proxad.net [78.242.14.140]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 490DD561233; Tue, 2 Aug 2022 11:51:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1659433904; bh=QClMqJuXDaC8VyH44ICsIgURW6qNJ9NsgRQNUQzjUMw=; h=From:To:Subject:Date:Message-ID; b=qu/onthKAEuSrScQDzzrEhCrNXM6gSTdr5I3s97AgJALac56H1y052ImALB+QSX4L t8ZvMh/MDbXUbplczBBYSSSs3vPH3BrkjUQd05vD4GOKvzh3szmpfdaCSEL4uow/QY 567sAiRf64/rRhgwWqME6/HflJfa12I5M2qDAObo= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 02 Aug 2022 11:51:43 +0200 Message-ID: <87mtcnvuq8.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 2 11:51:44 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.375901, queueID=B5D70561236 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 26 to August 02, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml Software Foundation: summer 2022 update Old CWN OCaml Software Foundation: summer 2022 update =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A quick update on recent works of the [OCaml Software Foundation]. It is a non-profit foundation ([earlier thread]) that receives funding from [our industrial sponsors] each year, and tries its best to spend it to support and strengthen the OCaml ecosystem and community. The funding volume we receive each year is around 200K=E2=82=AC. (For comparison: this is the yearly cost of one experienced full-time software engineer in many parts of the world.) We do not fund people full-time for long periods. Most actions receive from 3K=E2=82=AC to 20K= =E2=82=AC. The work to prepare and execute actions is mostly done by the (unpaid) [Executivee Committee]. It is currently formed by Nicol=C3=A1s Ojeda B=C3= =A4r ('nojb'), Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB=85n and myself, wi= th administrative personel provided by [INRIA]. Our current sponsors (thanks!) are [ahrefs], [Jane Street], [Tezos], [Bloomberg], [Lexifi], [SimCorp], [MERCE] and [Tarides]. (If your company would like to join as a sponsor, please [get in touch]. Unfortunately, we still cannot efficiently process small donations, so we are not calling for individual donations.) Feel free to use this thread for discussions, questions, suggestions and criticism, or to send a message/email for feedback. [OCaml Software Foundation] [earlier thread] [our industrial sponsors] [Executivee Committee] [INRIA] [ahrefs] [Jane Street] [Tezos] [Bloomberg] [Lexifi] [SimCorp] [MERCE] [Tarides] [get in touch] Recent actions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Below are some of the actions that we funded in the last year or so, and which have been actively worked on already by the people receiving the funding. Tooling =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 We worked on improving the debugging experience for OCaml by funding Fabian ('copy') to work on OCaml symbol demangling in Linux `perf' ([thread]), and supporting Yuxiang Wen ('hackwaly')'s work on [ocamlearlybird] ([thread]), an OCaml bytecode debugger for vscode. We also funded the early development work of [mutaml], a mutation-testing prototype by Jan Midtgaard. [thread] [ocamlearlybird] [thread] [mutaml] Communication =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 We decided to fund the time that Alan Schmitt ('brab') spends on the [Caml Weekly News] =E2=80=93 Alan also started cross-posting them on [red= dit] on this occasion. We funded John Whitington to work on OCaml documentation, on the core manual (see in particular [this PR]) or newcomer-oriented content on ocaml.org ([Get Up and Running with OCaml] and [A First Hour With OCaml]). We also purchased rights to John Whitington's book [OCaml from the Very Beginning] to put it [online] ([thread]). This is a good introduction to OCaml for people with little to no programming experience, and we hope that it will be easier to onboard people if they can get a free version online =E2=80=93 of course they are encourage= d to buy a paper copy if they like it and can afford it. We supported editing work for an upcoming book from the [Owl] team, "Architecture of Numerical Systems", with the requirement that the book be Open Access. (The idea followed our attempt to fund a hacking retreat for the Owl project in 2019, that was cancelled due to COVID.) We are also funding some work to refresh an older book about Caml in French, [Le Langage Caml], also available online, which several people in the community cite as their favorite OCaml book. Currently we are funding Arma=C3=ABl Gu=C3=A9neau to refresh the book's (crufty build syst= em and) content to work with current OCaml versions =E2=80=93 the book was writte= n in 1993 for Caml Light =E2=80=93 and we are considering funding an English translation. [Caml Weekly News] [reddit] [this PR] [Get Up and Running with OCaml] [A First Hour With OCaml] [OCaml from the Very Beginning] [online] [thread] [Owl] [Le Langage Caml] Teaching =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84 We funded Louis Gesbert ('AltGr') to do some technical development work on the LearnOCaml codebase. LearnOCaml is a technical platform to deploy automatically-graded OCaml exercices, used in various universities with probably around a few thousands students each year. We are also funding a Summer School about OCaml at the university of Zaragoza in Spain in early September 2022 ([thread], [website]). Note: if you are organizing an OCaml event (workshop, meetup, etc.), please get in touch to see whether/how we could support you. [thread] [website] Ecosystem =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84 We are funding part of the time Kate ('kit-ty-kate') spends on release-readiness for the OCaml compiler distribution =E2=80=93 monitoring build results for the whole OPAM repository and working with compiler maintainers and downstream package authors to solve compatibility issues before the release. This is great work which we think had a strong impact. There is now a larger concerted effort (not funded by us) to coordinate core tools around compiler releases =E2=80=93 see [this opam-repository PR] for example, which puts the ecosystem in a fairly good place compared to how new compiler versions felt a few years ago. We are also supporting Marcello Seri ('mseri') for his contributions to opam-repository maintenance. We are supporting Jonah Beckford ('jbeckford')'s work on his [Diskuv OCaml] distribution for Windows. [this opam-repository PR] [Diskuv OCaml] Libraries =E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2=94=84=E2= =94=84 We are funding Petter Urkedal ('paurkedal') to work on [Caqti], an OCaml library to work with SQL databases. We are supporting Zach Shipko's maintenance work on the [ocaml-rs] library, a library to write bindings / FFI code between OCaml and Rust. Finally, we supported some development work by Anton Bachin and Andrey Popp around the Dream web framework. They concentrated their efforts on [hyper] and [dream-social-login]. [Caqti] [ocaml-rs] [hyper] [dream-social-login] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 26 to August 02,= 2022.

    OCaml Software Foundation: summer 2022 update

    gasche announced

    A quick update on recent works of the OCam= l Software Foundation. It is a non-profit foundation (earlier thread) that receives funding from our industrial spons= ors each year, and tries its best to spend it to support and strengthen the OCaml ecosystem and community.

    The funding volume we receive each year is around 200K=E2=82=AC. (For compa= rison: this is the yearly cost of one experienced full-time software engineer in many parts of the world.) We do not fund peo= ple full-time for long periods. Most actions receive from 3K=E2=82=AC to 20K=E2=82=AC. The work to prepare and execute actions is mostly done by the (unpaid) Executivee Committee. It is currently formed by Nicol=C3=A1s Ojeda B=C3=A4r ('nojb= '), Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB=85n and myself, with administrative personel p= rovided by INRIA.

    Our current sponsors (thanks!) are ahrefs, Jane Street, Tezos, Bloomberg, Lexifi, SimCorp, MERCE and Taride= s. (If your company would like to join as a sponsor, please get in touch. Unfortunately, we still cannot efficiently process small donations, so we a= re not calling for individual donations.)

    Feel free to use this thread for discussions, questions, suggestions and cr= iticism, or to send a message/email for feedback.

    Recent actions

    Below are some of the actions that we funded in the last year or so, and wh= ich have been actively worked on already by the people receiving the funding.

    Tooling

    We worked on improving the debugging experience for OCaml by funding Fabian= ('copy') to work on OCaml symbol demangling in Linux perf (thread), and supporting Yuxiang Wen ('hackwaly')'s work on ocamlearlybird (thread), an OCaml bytecode debugger for vscode.

    We also funded the early development work of mutaml, a mutation-testing prototype by Jan Midtgaard.

    Communication

    We decided to fund the time that Alan Schmitt ('brab') spends on the Caml Weekly News – Alan also started cross-posting them on reddit on this occasion.

    We funded John Whitington to work on OCaml documentation, on the core manua= l (see in particular = this PR) or newcomer-oriented content on ocaml.org (Get Up and Running with OCaml and A First Hour Wi= th OCaml). We also purchased rights to John Whitington's book OCaml from the Very Beginning to put it online (thread). This is a good introduction to OCaml for people with little to no programming exper= ience, and we hope that it will be easier to onboard people if they can get a free version online – of course = they are encouraged to buy a paper copy if they like it and can afford it.

    We supported editing work for an upcoming book from the Owl team, "Architecture of Numerical Systems", with the requirement that the book be Open Access. (The idea foll= owed our attempt to fund a hacking retreat for the Owl project in 2019, that was cancelled due to COVID.)

    We are also funding some work to refresh an older book about Caml in French= , Le Langage Caml, also available online, which several people in the community cite as their favorite OCaml book. Currently we are funding Arma=C3=ABl Gu= =C3=A9neau to refresh the book's (crufty build system and) content to work with current OCaml versions – the book was writ= ten in 1993 for Caml Light – and we are considering funding an English translation.

    Teaching

    We funded Louis Gesbert ('AltGr') to do some technical development work on = the LearnOCaml codebase. LearnOCaml is a technical platform to deploy automatically-graded OCaml exercices, used in = various universities with probably around a few thousands students each year.

    We are also funding a Summer School about OCaml at the university of Zarago= za in Spain in early September 2022 (thread, website).

    Note: if you are organizing an OCaml event (workshop, meetup, etc.), please= get in touch to see whether/how we could support you.

    Ecosystem

    We are funding part of the time Kate ('kit-ty-kate') spends on release-read= iness for the OCaml compiler distribution – monitoring build results for the whole OPAM repository and working= with compiler maintainers and downstream package authors to solve compatibility issues before the release. This is g= reat work which we think had a strong impact. There is now a larger concerted effort (not funded by us) to coordi= nate core tools around compiler releases – see this opam-repository PR for example, which puts the ecosystem in a fairly good place compared to how new compiler versions felt= a few years ago.

    We are also supporting Marcello Seri ('mseri') for his contributions to opa= m-repository maintenance.

    We are supporting Jonah Beckford ('jbeckford')'s work on his Diskuv OCaml distribution for Windows.

    Libraries

    We are funding Petter Urkedal ('paurkedal') to work on Caqti, an OCaml library to work with SQL databases.

    We are supporting Zach Shipko's maintenance work on the ocaml-rs library, a library to write bindings / FFI code between OCaml and Rust.

    Finally, we supported some development work by Anton Bachin and Andrey Popp= around the Dream web framework. They concentrated their efforts on = hyper and dream-social-lo= gin.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 04A80E0235 for ; Tue, 9 Aug 2022 10:02:52 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=F0K5=YN=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: AHS6kw021wCl6VxWNdE6uadaKsDeDqL8UCQc6Lhaz4P5FdATiK3XsRygfaTm9Had+R5qr2MAPf vRVOiUj5ghihk7ZIX523myEojiOcbzF2NzB6V3Es1gRms6W1vOx0WZ4O813Vp18b/IuLlMLFBk op2RMpGBNjrsrM7saXu8xUKSHPNu+DNdmliElVx/zDQIs42rvkveRgbuCw9MOUtcK2uraJywAg NtNnEDScpyplNJO7kh5vlmIqRO8yVXMIuu5B0jj//trQimD6QsRgr0bYlRPvS0PyHE95Y2lHlv XYlOgnj21Rcb7C4uDU/ITJAZ X-IPAS-Result: =?us-ascii?q?A0BFAQDVE/JimCIeaIFag3lbKBkBZ1cuBwhFhE6BY4cbC?= =?us-ascii?q?YgEiVmHAo4ZEAEDAQ0sAQ4EAQIEAQGCE4E+gTYYhGICHgYBBTMTAQIEAQEBA?= =?us-ascii?q?QMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEBAQEBCQsJBwYMBRAOBTxkZ?= =?us-ascii?q?ASBSwSBdAs0DYI1DBmDcAEYCQQGEwEBOBgjAxQBBgMCBA0BFwEeFwESFAaCY?= =?us-ascii?q?wGDIgMEAQtDjTGbGnp/MoEBgggBAQaBPwEDAQIBCgICAxglAYN2gVwJJIEZh?= =?us-ascii?q?kNiTQGDGwmEFwInEIFVRIEUAYIpUW6CRAcXAQEBAQGBOwEBTYMpgmWYVAc3A?= =?us-ascii?q?0UeQgMLUggJFxIQEAIEERoLBgMWPwkCBA4DQAgNAxEEAw8YCRIIEAQGAzEMJ?= =?us-ascii?q?QsDBQ8MAQYDBgUDAQMbAxQDBSQHAxkPIw0NBB8dAwMFJQMCAhsHAgIDAgYVB?= =?us-ascii?q?gICGDY5CAQIBCsjDwUCBy8FBC8CHgQFBhEIAhYCBgQEBAQWAhAIAggnFwcTM?= =?us-ascii?q?xkBBVkQCSEWBigQBQYTAyBJJgVFDygzNTwrHxsKgRIqCSIVAwQEAwIGEwMDI?= =?us-ascii?q?gIQLjEDFQYpExItCSt1CQIDIm4DAwQqLgMJIR8HCSQqPQUFYpVpD4F8gT8OO?= =?us-ascii?q?AYPbRMBByIBAQQrIQYCOAEKBRQZDQ4rHwsLAi2SBhADCwOOH4pplEF9NAeDV?= =?us-ascii?q?IE+BgyINYEijQOIKIN2gVCCC4hpkUqGYiGWXyCCKocDgRgJgkqINYwvCIU1g?= =?us-ascii?q?TQaKoFpDgczGjBDgmcJCTwBAwINAQICAwECAQIJAQECjikWgQQBCYIaKIJkg?= =?us-ascii?q?XU7WoRyPzQCAQEHMAIGAQoBAQMJhWMBAQUTCwGIfgEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 74= IronPort-HdrOrdr: A9a23:GXbGWqMUqwqPPsBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,224,1654552800"; d="scan'208,217";a="21007989" X-MGA-submission: =?us-ascii?q?MDFJ8fl78nrHOSPFvqIg36eFQues8MF4B5NCk5?= =?us-ascii?q?Eb/zl17V7ua6W+A7QrjCvJuPF2bYD7mj1Dai3IQjTVdumCWIIOWn9p0A?= =?us-ascii?q?5CXBHfeWlFtxIcMIEFxHBKoV3SFPmygZp8/MW4GF13QMVgCsRVJW9D7t?= =?us-ascii?q?DW2e92pgxlIKFYdk6w9tHTcA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Aug 2022 10:02:51 +0200 Received: from set (lfbn-cle-1-507-42.w90-114.abo.wanadoo.fr [90.114.250.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4096D56482C; Tue, 9 Aug 2022 10:02:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1660032169; bh=4KS7JPtL5lsWjIW+8req/2jWnfY3GyNrXintjymF7d8=; h=From:To:Subject:Date:Message-ID; b=05pcLf/qZZNWkwNqml7DLkivVIbuBAvC/V45zjbA3YgorwefByPZtAHPa8QYG7vTl Mh2TVQpu4V8RS3hPYaD/uOrHjOLECLuJ57EI4i2Shf3ySZijVD+i77IpF2m9Bzc5Op bSPFLkAQx5dj0FL/3r5Pz7z25FfGC156I07y92jA= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 09 Aug 2022 10:02:39 +0200 Message-ID: <87tu6l974w.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 9 10:02:49 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.465487, queueID=84514564834 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDAyIHRvIDA5LA0KMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpweW1sX2Jp bmRnZW46IGEgQ0xJIGFwcCB0byBnZW5lcmF0ZSBQeXRob24gYmluZGluZ3MgZGlyZWN0bHkgZnJv bSBPQ2FtbCB2YWx1ZSBzcGVjaWZpY2F0aW9ucw0KSW50ZXJlc3RpbmcgT0NhbWwgQXJ0aWNsZXMN CkxvZ3MgdG8gYSBmaWxlIChhIHByaW1pdGl2ZSB3YXkpDQpUaW1lZGVzYyAwLjguMCAtIG1vZGVy biBkYXRlIHRpbWUgaGFuZGxpbmcNCk9DYW1sIHdlYnNpdGU6IE93bCBib29rIG5vdCBsaXN0ZWQN CkFwcGxpY2F0aW9uLXNwZWNpZmljIEltcHJvdmVtZW50cyB0byB0aGUgRWNvc3lzdGVtDQpPdGhl ciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KcHltbF9iaW5kZ2VuOiBhIENMSSBhcHAgdG8gZ2Vu ZXJhdGUgUHl0aG9uIGJpbmRpbmdzIGRpcmVjdGx5IGZyb20gT0NhbWwgdmFsdWUgc3BlY2lmaWNh dGlvbnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXB5bWwtYmlu ZGdlbi1hLWNsaS1hcHAtdG8tZ2VuZXJhdGUtcHl0aG9uLWJpbmRpbmdzLWRpcmVjdGx5LWZyb20t b2NhbWwtdmFsdWUtc3BlY2lmaWNhdGlvbnMvODc4Ni84Pg0KDQoNClJ5YW4gTW9vcmUgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KTmV3IHJlbGVhc2UNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFZlcnNpb24gMC40LjEgaXMgbm93IGF2YWlsYWJsZSBmcm9tIFtHaXRIdWJdIGFuZCBb T3BhbV0uICBUaGUgW2NoYW5nZQ0KICBsb2ddIGhhcyBtb3JlIGRldGFpbHMuDQoNCg0KW0dpdEh1 Yl0NCjxodHRwczovL2dpdGh1Yi5jb20vbW9vcmVyeWFuL29jYW1sX3B5dGhvbl9iaW5kZ2VuL3Jl bGVhc2VzL3RhZy8wLjQuMT4NCg0KW09wYW1dIDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2th Z2VzL3B5bWxfYmluZGdlbi8+DQoNCltjaGFuZ2UgbG9nXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9t b29yZXJ5YW4vb2NhbWxfcHl0aG9uX2JpbmRnZW4vYmxvYi9tYWluL0NIQU5HRUxPRy5tZD4NCg0K DQpOZXcgc3R1ZmYNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQpOZXcgYXR0cmlidXRl cw0K4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSE4pSEDQoNCiAgVGhlcmUg aXMgYSBuZXcgYXR0cmlidXRlIHlvdSBjYW4gdXNlOiBgcHlfYXJnX25hbWUnLiBJdCBhbGxvd3Mg eW91IHRvDQogIHVzZSBkaWZmZXJlbnQgYXJndW1lbnQgbmFtZXMgb24gdGhlIE9DYW1sIHNpZGUg ZnJvbSB0aG9zZSB0aGF0IGFyZQ0KICB1c2VkIG9uIHRoZSBQeXRob24gc2lkZS4NCg0KICBPbmUg dXNlIGNhc2UgaXMgZm9yIFB5dGhvbiBmdW5jdGlvbnMgdGhhdCBoYXZlIGFuIGFyZ3VtZW50IG5h bWUgdGhhdA0KICBpcyB0aGUgc2FtZSBhcyBzb21lIHJlc2VydmVkIE9DYW1sIGtleXdvcmQuIElu IHRoaXMgY2FzZSwgeW91IGNhbiB1c2UNCiAgYHB5X2FyZ19uYW1lJyB0byBtYXAgaXQgdG8gc29t ZXRoaW5nIGVsc2Ugb24gdGhlIE9DYW1sIHNpZGUuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giB2YWwgZiA6IHQgLT4gbWV0aG9kXzpzdHJpbmcgLT4gdW5pdCAtPiBzdHJpbmcNCiAg4pSCIFtA QHB5X2FyZ19uYW1lIG1ldGhvZF8gbWV0aG9kXQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGUg YXR0cmlidXRlIGlzIGZvbGxvd2VkIGJ5IHR3byBpdGVtcywgdGhlIGZpcnN0IGlzIHRoZSBhcmd1 bWVudCBuYW1lDQogIG9uIHRoZSBPQ2FtbCBzaWRlLCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgYXJn dW1lbnQgbmFtZSBvbiB0aGUgUHl0aG9uDQogIHNpZGUuDQoNCiAgU2VlIHRoZSBbYXR0cmlidXRl cyBleGFtcGxlXSBvbiBHaXRIdWIgZm9yIG1vcmUgaW5mby4NCg0KDQpbYXR0cmlidXRlcyBleGFt cGxlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9tb29yZXJ5YW4vb2NhbWxfcHl0aG9uX2JpbmRnZW4v dHJlZS9tYWluL2V4YW1wbGVzL2F0dHJpYnV0ZXM+DQoNCg0KSGVscGVyIHNjcmlwdHMNCuKUhOKU hOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhOKUhA0KDQogIEkgYWRkZWQgYSBjb3Vw bGUgb2Ygc2NyaXB0cyB0byBoZWxwIGluIGNhc2VzIHdoZXJlIHlvdSBuZWVkIHRvIHJ1bg0KICBg cHltbF9iaW5kZ2VuJyBvbiBhIGxvdCBvZiBkaWZmZXJlbnQgaW5wdXQgZmlsZXMgaW4gb25lIGdv LiAgSSBoYXZlDQogIGJlZW4gdXNpbmcgdGhlbSB3aGVuIHdyaXRpbmcgYmluZGluZ3MgZm9yIGJp Z2dlciBQeXRob24gbGlicmFyaWVzLCBhbmQNCiAgaW4gY2FzZXMgd2hlcmUgdGhlcmUgYXJlIGEg bG90IG9mIGN5Y2xpYyBweXRob24gY2xhc3NlcyB0byBiaW5kLg0KDQogIFtUaGlzXSBleGFtcGxl IGhhcyBtb3JlIGluZm8gYWJvdXQgdXNpbmcgdGhlIGhlbHBlciBzY3JpcHRzLg0KDQoNCltUaGlz XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9tb29yZXJ5YW4vb2NhbWxfcHl0aG9uX2JpbmRnZW4vdHJl ZS9tYWluL2V4YW1wbGVzL3JlY3Vyc2l2ZV9tb2R1bGVzPg0KDQoNCk90aGVyIHN0dWZmDQrilITi lITilITilITilITilITilITilITilITilITilIQNCg0KICDigKIgQWRkZWQgYW4gb3B0aW9uIHRv IHNwbGl0IGdlbmVyYXRlZCBtb2R1bGVzIGludG8gYG1sJyBhbmQgYG1saScNCiAgICBmaWxlcy4N CiAg4oCiIEFkZGVkIGEgZGV2IHBhY2thZ2UgZm9yIChob3BlZnVsbHkpIGVhc2llciBpbnN0YWxs YXRpb24gb2YNCiAgICBkZXZlbG9wbWVudCBkZXBlbmRlbmNpZXMuDQoNCg0KSW50ZXJlc3Rpbmcg T0NhbWwgQXJ0aWNsZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50ZXJlc3Rpbmctb2NhbWwtYXJ0aWNsZXMvMTg2 Ny85OT4NCg0KDQpDYWxhc2NpYmV0dGEgUm9tYWluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGksIEkgd291bGQgbGlrZSB0byBzaGFyZSBteSByZWNlbnQg YXJ0aWNsZSBhYm91dCBHQURUcyBhbmQgc3RhdGUNCiAgbWFjaGluZXM6IFtHQURUcyBhbmQgc3Rh dGUgbWFjaGluZV0NCg0KICBJdCdzIGFub3RoZXIgaW50cm9kdWN0aW9uIGFib3V0IEdBRFRzIGFu ZCBpdCBleHBsYWlucyBhIGJpdCB3aGF0IEkgZGlkDQogIGZvciBbcm9idXIuaW9dLiBFZW5qb3kg aXQgYW5kIGhhcHB5IGhhY2tpbmchDQoNCg0KW0dBRFRzIGFuZCBzdGF0ZSBtYWNoaW5lXQ0KPGh0 dHBzOi8vYmxvZy5vc2F1LnJlL2FydGljbGVzL2dhZHRfYW5kX3N0YXRlX21hY2hpbmUuaHRtbD4N Cg0KW3JvYnVyLmlvXSA8aHR0cHM6Ly9yb2J1ci5pbz4NCg0KDQpMb2dzIHRvIGEgZmlsZSAoYSBw cmltaXRpdmUgd2F5KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sb2dzLXRvLWEtZmls ZS1hLXByaW1pdGl2ZS13YXkvMTAyNjIvMT4NCg0KDQrwn4yNIE1hcmN1cyBSb2hybW9zZXIgYXNr ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZm91bmQNCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS9veGlkaXppbmcvc2lobC9ibG9iL2M2Nzg2ZjI1NDI0YzFiOWY0MGNlNjU2ZTkwOGJkMzE1MTVm MWNkMDkvc2lobC9zcmMvY29yZV9sb2cubWwjTDE4Pg0KICBhbmQgd29uZGVyIHdoYXQgYSBwcmlt aXRpdmUgd2F5IHRvIGxvZyB0byBhIGZpbGUgd291bGQgYmUuDQoNCiAgSSBuZWVkIHRvIGtlZXAg YHN0ZG91dCcgY2xlYW4gYW5kIG5vdCBzaG93IGFueSBsb2cgbWVzc2FnZSB1bmRlciBhbGwNCiAg Y2lyY3Vtc3RhbmNlcy4NCg0KDQrwn4yNIE1hcmN1cyBSb2hybW9zZXIgbGF0ZXIgYWRkZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZG8gYSBjZ2kgYW5kIGBz dGRvdXQnIGlzIHRoZSByZXNwb25zZSDigJMgbG9nZ2luZyBoYXMgdG8gZ28gdG8gYQ0KICBzZXBh cmF0ZSBmaWxlLiBOb3QgZXZlbiBgc3RkZXJyJyBhcyBJIHdhbnQgZGVidWcgbG9ncyBub3QgdG8g dGFpbnQgdGhlDQogIHdlYnNlcnZlciBlcnJvciBsb2cgaW4gY2FzZS4gQW5kIEkgd291bGQgbGlr ZSB0byBmdW5uZWwgbG9nZ2luZw0KICB0aHJvdWdoIGBMb2dzJy4NCg0KDQpZYXdhciBBbWluIHN1 Z2dlc3RlZCBhbmQg8J+MjSBNYXJjdXMgUm9ocm1vc2VyIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICAgICAgIEkgZG9uJ3Qga25vdyBhYm91 dCBgbG9ncycgYnV0IGl0IHNob3VsZCBiZSByZWxhdGl2ZWx5IGVhc3kNCiAgICAgICAgdG8ga2Vl cCBhbiBvcGVuIGZpbGUgaGFuZGxlIGFuZCBwcmludCBsb2cgbWVzc2FnZXMgdGhlcmUuDQoNCiAg PGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMvbG9ncy8+IC0gSSBsaWtlIHRoZSBsb2ds ZXZlbA0KICBhcHByb2FjaC4gQnV0IG1heWJlIEkgd2lsbCBkbyB3aXRob3V0IGFuZCBwYXNzIGFy b3VuZCB0aGUgY2hhbm5lbCwNCiAgeWVzLg0KDQoNCkplYW4gTWljaGVsIHN1Z2dlc3RlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSSBiZWxpZXZlIGxvZ3Mgc3VwcG9ydCBsb2dnaW5nIHRvIGEgZmlsZSB2aWEgRm9y bWF0LiBTZWUNCiAgPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2xvZ3MvZG9jL0xvZ3Mv aW5kZXguaHRtbCN2YWwtZm9ybWF0X3JlcG9ydGVyPg0KDQoNClNob24gYWxzbyBzdWdnZXN0ZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIEnigJl2ZSBmb3VuZCBsb2dzIHZlcnkgZXJnb25vbWljIGFuZCBlYXN5IHRvIHdvcmsg d2l0aC4gSSB0ZW5kIHRvIHB1bGwNCiAgaXQgaW4gdmlhIFtCb3NdLCB3aGljaCBoYXMgYSB2ZXJ5 IG5pY2UgaW50ZXJmYWNlIHRvIE9TDQogIGludGVyYWN0aW9ucy4gT3BlbmluZyB0aGUgYEJvc19z ZXR1cCcgbW9kdWxlIGFsc28gZG9lcyBkZWZhdWx0IGxvZ3MNCiAgY29uZmlndXJhdGlvbiwgYW5k IEkgZmluZCBhbGwgcXVpdGUgcGFpbmxlc3MgYW5kIHBsZWFzYW50Lg0KDQoNCltCb3NdIDxodHRw czovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9ib3M+DQoNCg0K8J+MjSBNYXJjdXMgUm9ocm1vc2Vy IHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIHRoYW5rcyBAeWF3YXJhbWluIEBiZWFqZWFubSBA c2hvbmZlZGVyLCBJIHRvb2sgYSBbbWlkZGxlIGdyb3VuZF0gYW5kDQogIHdlbnQgYWxvbmcgdGhl IGxpbmVzIG9mIDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL2xvZ3MvPiAodXNpbmcN CiAgdGhlIGxvZ2xldmVscyBhbmQgbG9nZ2luZyBjYWxsIHN0eWxlKSBidXQgYmFzZSB3cml0aW5n IGFsbW9zdCBkaXJlY3RseQ0KICBvbiBbb3V0X2NoYW5uZWxdLiAoSSBuZWVkIGEgbG9nIHJvdGF0 aW9uIG9uIHRvcCkNCg0KICBJIHdhcyBzdHJ1Z2dsaW5nIHdpdGggbG9zdCBtZXNzYWdlcyBob3dl dmVyIOKAkyB0aGUgbG9nZmlsZSByZW1haW5lZA0KICBlbXB0eSB1bnRpbCBJIGZsdXNoZWQgYWZ0 ZXIgZWFjaCBsb2cgbWVzc2FnZS4NCg0KICBJcyB0aGF0IGtub3duIGJlaGF2aW91ciB0aGF0IHdy aXRpbmcgdG8gYSBjaGFubmVsICh3aXRoDQogIFtQcmludGYuZnByaW50Zl0pIGRvZXNuJ3QgbmVj ZXNzYXJpbHkgZW5kIHVwIGluIHRoZSBmaWxlPyBFdmVuIHdoZW4NCiAgY2xvc2VkIHF1aWNrbHku DQoNCg0KW21pZGRsZSBncm91bmRdDQo8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvbXJvL3NlcHBvL3Ny Yy9icmFuY2gvZGV2ZWxvcC9saWIvbG9nci5tbD4NCg0KW291dF9jaGFubmVsXSA8aHR0cHM6Ly9v Y2FtbC5vcmcvYXBpL1N0ZGxpYi5odG1sI1RZUEVvdXRfY2hhbm5lbD4NCg0KW1ByaW50Zi5mcHJp bnRmXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYXBpL1ByaW50Zi5odG1sPg0KDQoNClVuaXhKdW5raWUg cmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgWW91IG11c3QgUHJpbnRmLnByaW50ZiB3aXRoICIlISIgYXQgdGhlIGVuZCBv ZiB5b3VyIGZvcm1hdCBzdHJpbmcsIHRvDQogICBiZSBzdXJlIHRoYXQgdGhlIGxvZyBpcyBmbHVz aGVkIHRvIGZpbGUuDQoNCiAgVGhhdCdzIHdoYXQgSSBkbyBpbiBkb2xvZzogPGh0dHBzOi8vZ2l0 aHViLmNvbS9Vbml4SnVua2llL2RvbG9nPg0KDQoNClRpbWVkZXNjIDAuOC4wIC0gbW9kZXJuIGRh dGUgdGltZSBoYW5kbGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGltZWRlc2MtMC04LTAtbW9kZXJuLWRhdGUtdGltZS1o YW5kbGluZy8xMDEzOC8yPg0KDQoNCkRhcnJlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRpbnkgdXBkYXRlOiBUaW1lZGVz YyAwLjkuMCBoYXMgYmVlbiByZWxlYXNlZCwgbW92aW5nIGBzZXhwbGliJw0KICBkZXBlbmRlbmN5 IGludG8gYHRpbWVkZXNjLXNleHAnIGFuZCBtb3ZlZCBmcm9tIGBtcGFyc2VyJyB0byBgYW5nc3Ry b20nDQogIGZvciBzb21lIGRhdGUgdGltZSB0ZXh0IHBhcnNlcnMgc2luY2UgYW5nc3Ryb20gaXMg YSBzdHJpY3QgbmVjZXNzaXR5DQogIGZvciBzb21lIGJpbmFyeSAoZGUpc2VyaWFsaXphdGlvbiBh bHJlYWR5Lg0KDQogIFRoaXMgb3ZlcmFsbCBtZWFucyBUaW1lZGVzYyBpcyBhYm91dCBhcyBzbGlt IGFzIGl0IGNhbiBnZXQgYXMgYSBkYXRlDQogIHRpbWUgaGFuZGxpbmcgbGliLCBkZXBlbmRpbmcg b25seSBvbjogYHNlcScsIGBhbmdzdHJvbScsIGByZXN1bHQnLCBhbmQNCiAgYHB0aW1lJyAoYHB0 aW1lJyBpcyBub3QgYSBzdHJpY3QgZGVwZW5kZW5jeSwgYnV0IGl0J3MgbmljZSB0byBoYXZlDQog IHRpbWVkZXNjIDwtPiBwdGltZSBjb252ZXJ0b3JzKS4NCg0KDQpGbG9yZW50IE1vbm5pZXIgYXNr ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIElzIHRoaXMgYSBsaWIgdGhhdCB0YXJnZXRzIHRvIHByb2Nlc3MgZGF0 ZXMgYW5kIHRpbWUgaW4gYQ0KICBwcm9ncmFtbWF0aWNhbGx5IHdheT8gICh0aGlzIGlzIHdoYXQg dGhlIHByb3ZpZGVkIGV4YW1wbGUgbWFrZSBtZQ0KICB0aGluaykgT3IgaXMgaXQgYWxzbyBzdXBw b3NlZCB0byBiZSB1c2VkIHRvIHByaW50IHNvbWV0aGluZyByZWFkYWJsZQ0KICBmb3IgYSB1c2Vy IGVsc2UgdGhhbiBhIHByb2dyYW1tZXI/DQoNCiAgSWYgdGhlcmUgaXMgbm8gZW5kLXVzZXIgZ29h bCBpbiB0aGlzIGxpYiwgcGxlYXNlIGp1c3QgaWdub3JlIG15DQogIG1lc3NhZ2UsIGFuZCBzb3Jy eSB0byBtYWtlIHlvdSBsb3NlIHNvbWUgdGltZS4NCg0KICBJbiB0aGUgb3RoZXIgY2FzZSBpZiB5 b3UgY29uc2lkZXIgcHJpbnRpbmcgZm9yIGVuZCB1c2VycywgaXQncyBtYXliZQ0KICB3b3J0aCB0 byBtZW50aW9uIHRoYXQgdGhlcmUgaXMgdGhlIFtEYXRlTG9jYWxlLW9jYW1sXSBtb2R1bGUgdGhh dCBpcw0KICBhdmFpbGFibGUgYW5kIHdoaWNoIHByb3ZpZGVzIHRoZSBuYW1lIGZvciB0aGUgbW9u dGhzLCBhbmQgZGF5cyBmb3INCiAgbW9yZSB0aGFuIDIwMCBsYW5ndWFnZXMuIEl0IGFsc28gcHJv dmlkZXMgYWJicmV2aWF0ZWQgdmVyc2lvbnMgZm9yDQogIGJvdGggbW9udGhzIGFuZCBkYXlzLCB3 aGljaCBhcmUgb2Z0ZW4gdXNlZC4NCg0KICBUaGUgW29jYW1sLWNvbW11bml0eS9jYWxlbmRhcl0g d2FzIG5vdCBkZXNpZ25lZCB3aXRoIGxvY2FsaXNhdGlvbiBpbg0KICBtaW5kLCBpdCBqdXN0IGRv ZXMgYFN0cmluZy5zdWIgZCAwIDMnIHRvIHByb3ZpZGUgc2hvcnQgbmFtZXMsIHdoaWNoDQogIHdp bGwgbm90IHdvcmsgd2l0aCBsYW5ndWFnZXMgdGhhdCBuZWVkIFVURjguDQoNCiAgVGhlcmUgaXMg dGhpcyBQUiB0aGF0IGlzIHN0aWxsIHdhaXRpbmcgZm9yIHNvbWUgcmV2aWV3IHNpbmNlIDIgeWVh cnMNCiAgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggbG9jYWxpc2F0aW9uOg0KICBbb2NhbWwt Y29tbXVuaXR5L2NhbGVuZGFyL3B1bGwvMzNdLg0KDQogIChBdCBsZWFzdCB0aGUgcGF0Y2ggaXMg YXZhaWxhYmxlIHRoZXJlIGZvciBzb21lb25lIHdobyBjb3VsZCBiZQ0KICBpbnRlcmVzdGVkLikN Cg0KICBJIGRvbid0IGtub3cgaWYgaXQgY291bGQgaW50ZXJlc3Qgc29tZSBvbmUgYnV0IEkgc2Vl IHRoYXQgdGhlIGV4YW1wbGUNCiAgb3V0cHV0cyBhIGxpc3Qgb2YgZGF0ZXMsIHRoYXQgbG9vayBs aWtlIHNvbWUga2luZCBvZiBsb2dzLiBJbiBjYXNlDQogIHNvbWUgb25lIHdvdWxkIGxpa2UgdG8g dmlzdWFsaXNlIGl0IGluIGEgd2F5IHNpbWlsYXIgdGhhbiB0aGUgdW5peA0KICBjb21tYW5kIGBj YWwnIHlvdSBjYW4ganVzdCBjcmVhdGUgZW1wdHkgZmlsZXMgd2hlcmUgdGhlIGZpbGUgbmFtZQ0K ICBmb2xsb3dzIHRoZSBwYXR0ZXJuIFlZWVktTU0tREQgbGlrZSBmb3IgZXhhbXBsZSAiZGlyLzIw MjItMDgtMDYudHh0IiwNCiAgeW91IHdpbGwgdGhlbiBiZSBhYmxlIHRvIHZpc3VhbGlzZSBpdCBp biB0aGUgY29uc29sZSB3aXRoIFtkZXRyaV0uDQoNCg0KW0RhdGVMb2NhbGUtb2NhbWxdIDxodHRw czovL2dpdGh1Yi5jb20vZmNjbS9EYXRlTG9jYWxlLW9jYW1sPg0KDQpbb2NhbWwtY29tbXVuaXR5 L2NhbGVuZGFyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWNvbW11bml0eS9jYWxlbmRhcj4N Cg0KW29jYW1sLWNvbW11bml0eS9jYWxlbmRhci9wdWxsLzMzXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1jb21tdW5pdHkvY2FsZW5kYXIvcHVsbC8zMy9jb21taXRzLzlmY2Q3Mzg2ZTI4N2Y4 ODQxZTUwM2ZiMWQxZTA1NDcyOTVhZWIwYzk+DQoNCltkZXRyaV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9mY2NtL2RldHJpPg0KDQoNCkRhcnJlbiByZXBsaWVkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBJcyB0aGlzIGEgbGliIHRoYXQgdGFyZ2V0 cyB0byBwcm9jZXNzIGRhdGVzIGFuZCB0aW1lIGluIGENCiAgICAgICAgcHJvZ3JhbW1hdGljYWxs eSB3YXk/ICAodGhpcyBpcyB3aGF0IHRoZSBwcm92aWRlZCBleGFtcGxlDQogICAgICAgIG1ha2Ug bWUgdGhpbmspIE9yIGlzIGl0IGFsc28gc3VwcG9zZWQgdG8gYmUgdXNlZCB0byBwcmludA0KICAg ICAgICBzb21ldGhpbmcgcmVhZGFibGUgZm9yIGEgdXNlciBlbHNlIHRoYW4gYSBwcm9ncmFtbWVy Pw0KICBEZXZlbG9wbWVudCBoYXMgYmVlbiBwcmltYXJpbHkgZm9jdXNlZCBvbiBmb3JtZXIsIG1v c3RseSBiZWNhdXNlDQogIHNvbHZpbmcgaXQgcHJvcGVybHkgd2FzIGFscmVhZHkgKHZlcnkpIGlu dm9sdmVkLg0KDQogIE5vdyB0aGF0IFRpbWVkZXNjIGhhcyBzdGFiaWxpc2VkLCB0aGUgbGF0dGVy IHJlYWRzIGxpa2UgYSB2ZXJ5IG5pY2UNCiAgbmV4dCBUT0RPIHRvIG1hdGNoIGZlYXR1cmUgcGFy aXR5IG9mIG90aGVyIGRhdGUgdGltZSBsaWJzLg0KDQogICAgICAgIEluIHRoZSBvdGhlciBjYXNl IGlmIHlvdSBjb25zaWRlciBwcmludGluZyBmb3IgZW5kIHVzZXJzLA0KICAgICAgICBpdOKAmXMg bWF5YmUgd29ydGggdG8gbWVudGlvbiB0aGF0IHRoZXJlIGlzIHRoZQ0KICAgICAgICBbRGF0ZUxv Y2FsZS1vY2FtbF0gbW9kdWxlIHRoYXQgaXMgYXZhaWxhYmxlIGFuZCB3aGljaA0KICAgICAgICBw cm92aWRlcyB0aGUgbmFtZSBmb3IgdGhlIG1vbnRocywgYW5kIGRheXMgZm9yIG1vcmUgdGhhbg0K ICAgICAgICAyMDAgbGFuZ3VhZ2VzLiBJdCBhbHNvIHByb3ZpZGVzIGFiYnJldmlhdGVkIHZlcnNp b25zIGZvcg0KICAgICAgICBib3RoIG1vbnRocyBhbmQgZGF5cywgd2hpY2ggYXJlIG9mdGVuIHVz ZWQuDQoNCiAgTG9va3MgbmVhdCEgSSBiZWxpZXZlIHRoZXJlIGhhdmUgYmVlbiByZXF1ZXN0cyBv ZiBsb2NhbGUgc2Vuc2l0aXZlDQogIHByZXR0eSBwcmludGluZy9jb252ZXJzaW9uIGZ1bmN0aW9u cywgc28gSSBkZWZpbml0ZWx5IHdvdWxkIGJlDQogIGludGVyZXN0ZWQgaW4gaW5jb3Jwb3JhdGlu ZyB5b3VyIHdvcmsgKGlmIHRoYXQgd2FzIHRoZSBpbnRlbnRpb24pLg0KDQogICAgICAgIEkgZG9u 4oCZdCBrbm93IGlmIGl0IGNvdWxkIGludGVyZXN0IHNvbWUgb25lIGJ1dCBJIHNlZSB0aGF0DQog ICAgICAgIHRoZSBleGFtcGxlIG91dHB1dHMgYSBsaXN0IG9mIGRhdGVzLCB0aGF0IGxvb2sgbGlr ZSBzb21lDQogICAgICAgIGtpbmQgb2YgbG9ncy4gSW4gY2FzZSBzb21lIG9uZSB3b3VsZCBsaWtl IHRvIHZpc3VhbGlzZSBpdA0KICAgICAgICBpbiBhIHdheSBzaW1pbGFyIHRoYW4gdGhlIHVuaXgg Y29tbWFuZCBgY2FsYCB5b3UgY2FuIGp1c3QNCiAgICAgICAgY3JlYXRlIGVtcHR5IGZpbGVzIHdo ZXJlIHRoZSBmaWxlIG5hbWUgZm9sbG93cyB0aGUgcGF0dGVybg0KICAgICAgICBZWVlZLU1NLURE IGxpa2UgZm9yIGV4YW1wbGUg4oCcZGlyLzIwMjItMDgtMDYudHh04oCdLCB5b3Ugd2lsbA0KICAg ICAgICB0aGVuIGJlIGFibGUgdG8gdmlzdWFsaXNlIGl0IGluIHRoZSBjb25zb2xlIHdpdGggW2Rl dHJpXS4NCg0KICBJIHdhcyBpbnRlcmVzdGVkIGluIHNvbWV0aGluZyBsaWtlIHRoaXMgZm9yIGFu b3RoZXIgc21hbGwgdXRpbGl0eSBjbWQNCiAgSSd2ZSB3cml0dGVuLCBuZWF0IQ0KDQoNCltEYXRl TG9jYWxlLW9jYW1sXSA8aHR0cHM6Ly9naXRodWIuY29tL2ZjY20vRGF0ZUxvY2FsZS1vY2FtbD4N Cg0KW2RldHJpXSA8aHR0cHM6Ly9naXRodWIuY29tL2ZjY20vZGV0cmk+DQoNCg0KT0NhbWwgd2Vi c2l0ZTogT3dsIGJvb2sgbm90IGxpc3RlZA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vY2FtbC13ZWJzaXRlLW93bC1ib29rLW5vdC1saXN0ZWQvMTAyNzQvMT4NCg0KDQpBbmRy ZWFzIFBvaXNlbCBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJdCB3b3VsZCBiZSBuaWNlIHRvIGFkZCBbT0NhbWwgU2Np ZW50aWZpYyBDb21wdXRpbmddIHRvIHRoZSBsaXN0IG9uDQogIDxodHRwczovL29jYW1sLm9yZy9i b29rcz4uDQoNCiAgVGhpcyBpcyBhIGdyZWF0IGJvb2sgYW5kIGl0IHdvdWxkIGJlIGEgc2hhbWUg bm90IHRvIHByb21vdGUgaXQuICBNYXliZQ0KICBhbnlvbmUgcmVzcG9uc2libGUgZm9yIHRoZSB3 ZWJzaXRlIHJlYWRzIHRoaXMgb3IgY2FuIHBvaW50IG1lIGluIHRoZQ0KICByaWdodCBkaXJlY3Rp b24uDQoNCiAgSSdtIG5vdCBpbiBhbnkgd2F5IGFmZmlsaWF0ZWQgd2l0aCB0aGUgYXV0aG9ycyBv ZiB0aGlzIGJvb2suDQoNCg0KW09DYW1sIFNjaWVudGlmaWMgQ29tcHV0aW5nXQ0KPGh0dHBzOi8v bGluay5zcHJpbmdlci5jb20vYm9vay8xMC4xMDA3Lzk3OC0zLTAzMC05NzY0NS0zPg0KDQoNCkFw cGxpY2F0aW9uLXNwZWNpZmljIEltcHJvdmVtZW50cyB0byB0aGUgRWNvc3lzdGVtDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2FwcGxpY2F0aW9uLXNwZWNpZmljLWltcHJvdmVtZW50cy10by10 aGUtZWNvc3lzdGVtLzEwMjIzLzQ5Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIEtheS1Vd2Ug S2lyc3RlaW4gc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUGVyc29uYWxseSwgSSBvZnRlbiB1c2Ug dGhlIG1vbmFkaWMgUmVzdWx0IHR5cGUgdG9nZXRoZXIgd2l0aCBhDQogIHBvbHltb3JwaGljIHZh cmlhbnQgZm9yIHRoZSBhY3R1YWwgZXJyb3JzLiBUaGlzIG1ha2VzIGRlYWxpbmcgd2l0aA0KICBl cnJvcnMgZnJvbSBkaWZmZXJlbnQgImxldmVscyIgb2YgbXkgc29mdHdhcmUgKGxpYnJhcnksIGNv bW1hbmQtbGluZQ0KICB0b29sLCBhbmQgR1VJKSBxdWl0ZSBjb21mb3J0YWJsZSAoYW5kIHR5cGUt c2FmZSEpLiAgQGtlbGVzaGV2IGhhcw0KICB3cml0dGVuIGEgbmljZSBibG9nIHBvc3Qgb24gdGhp czoNCiAgPGh0dHBzOi8va2VsZXNoZXYuY29tL2NvbXBvc2FibGUtZXJyb3ItaGFuZGxpbmctaW4t b2NhbWw+IHdpdGggYQ0KICByZWNlbnQgZm9sbG93IHVwOg0KICA8aHR0cHM6Ly9rZWxlc2hldi5j b20vYWR2YW5jZWQtZXJyb3ItaGFuZGxpbmctaW4tb2NhbWw+DQoNCg0KT3RoZXIgT0NhbWwgTmV3 cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZy b20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBm cm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9n XS4NCg0KICDigKIgW0lybWluIGluIHRoZSBCcm93c2VyXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJs b2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0lybWluIGluIHRoZSBCcm93c2VyXQ0K PGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIyLTA4LTAyLWlybWluLWluLXRoZS1icm93c2Vy Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwN CiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBb UlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICBbb25saW5l XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltvbmxpbmVdIDxo dHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvPg0KDQpbQWxh biBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 02 to 09, 2022.

    pyml_bindgen: a CLI app to generate Python bindings directly f= rom OCaml value specifications

    Archive:

    Ryan Moore announced

    New stuff

    New attributes

    There is a new attribute you can use: py_arg_name. It allows y= ou to use different argument names on the OCaml side from those that are used on the Python side.

    One use case is for Python functions that have an argument name that is the= same as some reserved OCaml keyword. In this case, you can use py_arg_name to map it to something else= on the OCaml side.

    val f : t -> method_:string -> unit -> string
    [@@py_arg_name method_ method]
    

    The attribute is followed by two items, the first is the argument name on t= he OCaml side, and the second is the argument name on the Python side.

    See the attributes example on GitHub for more info.

    Helper scripts

    I added a couple of scripts to help in cases where you need to run py= ml_bindgen on a lot of different input files in one go. I have been using them when writing bindings for bigger Python = libraries, and in cases where there are a lot of cyclic python classes to bind.

    This example has more info about using the helper scripts.

    Other stuff
    • Added an option to split generated modules into ml and mli files.
    • Added a dev package for (hopefully) easier installation of development = dependencies.

    Interesting OCaml Articles

    Calascibetta Romain announced

    Hi, I would like to share my recent article about GADTs and state machines:= GADT= s and state machine

    It's another introduction about GADTs and it explains a bit what I did for = robur.io. Eenjoy it and happy hacking!

    Logs to a file (a primitive way)

    =F0=9F=8C=8D Marcus Rohrmoser asked

    I found https://github.com/oxidiz= ing/sihl/blob/c6786f25424c1b9f40ce656e908bd31515f1cd09/sihl/src/core_log.ml= #L18 and wonder what a primitive way to log to a file would be.

    I need to keep stdout clean and not show any log message under= all circumstances.

    =F0=9F=8C=8D Marcus Rohrmoser later added

    I do a cgi and stdout is the response =E2=80=93 logging has to= go to a separate file. Not even stderr as I want debug logs not to taint the webserver error log in case. And I would like to funn= el logging through Logs.

    Yawar Amin suggested and =F0=9F=8C=8D Marcus Rohrmose= r replied

    I don't know about logs but it should be relatively easy to ke= ep an open file handle and print log messages there.

    https://opam.ocaml.org/pa= ckages/logs/ - I like the loglevel approach. But maybe I will do withou= t and pass around the channel, yes.

    Jean Michel suggested

    I believe logs support logging to a file via Format. See https://erratique.ch/software/logs/doc/Logs/index.html#val-form= at_reporter

    Shon also suggested

    I=E2=80=99ve found logs very ergonomic and easy to work with. I tend to pul= l it in via Bos, which has a very nic= e interface to OS interactions. Opening the Bos_setup module also does default logs configuration, and I find all quite painless = and pleasant.

    =F0=9F=8C=8D Marcus Rohrmoser said

    thanks @yawaramin @beajeanm @shonfeder, I took a middle ground and went along the lines of https://opam.ocaml.org/pa= ckages/logs/ (using the loglevels and logging call style) but base writ= ing almost directly on out_channe= l. (I need a log rotation on top)

    I was struggling with lost messages however =E2=80=93 the logfile remained = empty until I flushed after each log message.

    Is that known behaviour that writing to a channel (with Printf.fprintf) doesn't necessarily end up in the file? Even when closed quickly.

    UnixJunkie replied

    You must Printf.printf with "%!" at the end of your format string, to be sure that the log is flushed to file.

    That's what I do in dolog: https://github.com/UnixJunk= ie/dolog

    Timedesc 0.8.0 - modern date time handling

    Darren announced

    Tiny update: Timedesc 0.9.0 has been released, moving sexplib = dependency into timedesc-sexp and moved from mparser to angstrom for some date time text parse= rs since angstrom is a strict necessity for some binary (de)serialization already.

    This overall means Timedesc is about as slim as it can get as a date time h= andling lib, depending only on: seq, angstrom, result, and ptime (p= time is not a strict dependency, but it's nice to have timedesc <= -> ptime convertors).

    Florent Monnier asked

    Is this a lib that targets to process dates and time in a programmatically = way? (this is what the provided example make me think) Or is it also supposed to be used to print something readable for a user el= se than a programmer?

    If there is no end-user goal in this lib, please just ignore my message, an= d sorry to make you lose some time.

    In the other case if you consider printing for end users, it's maybe worth = to mention that there is the DateLocale-ocaml m= odule that is available and which provides the name for the months, and days for more than 200 languages. It also provides abbrevia= ted versions for both months and days, which are often used.

    The ocaml-community= /calendar was not designed with localisation in mind, it just does String.sub d 0 3 to provide short names, wh= ich will not work with languages that need UTF8.

    There is this PR that is still waiting for some review since 2 years to mak= e it compatible with localisation: ocaml-community/calendar/pull/33.

    (At least the patch is available there for someone who could be interested.)

    I don't know if it could interest some one but I see that the example outpu= ts a list of dates, that look like some kind of logs. In case some one would like to visualise it in a way similar = than the unix command cal you can just create empty files where the file name follows the pattern YYYY-MM-DD like = for example "dir/2022-08-06.txt", you will then be able to visualise it in the console with detri.

    Darren replied

    Is this a lib that targets to process dates and time in a programmatically = way? (this is what the provided example make me think) Or is it also supposed to be used to print something readable for a user el= se than a programmer?

    Development has been primarily focused on former, mostly because solving it= properly was already (very) involved.

    Now that Timedesc has stabilised, the latter reads like a very nice next TO= DO to match feature parity of other date time libs.

    In the other case if you consider printing for end users, it=E2=80=99s mayb= e worth to mention that there is the DateLocale-ocaml m= odule that is available and which provides the name for the months, and days for more than 200 languages. It also provides abbrevia= ted versions for both months and days, which are often used.

    Looks neat! I believe there have been requests of locale sensitive pretty p= rinting/conversion functions, so I definitely would be interested in incorporating your work (if that was the = intention).

    I don=E2=80=99t know if it could interest some one but I see that the examp= le outputs a list of dates, that look like some kind of logs. In case some one would like to visualise it in a way similar = than the unix command `cal` you can just create empty files where the file name follows the pattern YYYY-MM-DD like = for example =E2=80=9Cdir/2022-08-06.txt=E2=80=9D, you will then be able to visualise it in the console with detri.

    I was interested in something like this for another small utility cmd I've = written, neat!

    OCaml website: Owl book not listed

    Andreas Poisel said

    It would be nice to add OCaml Scientific Computing to the list on https://ocaml.org/books.

    This is a great book and it would be a shame not to promote it. Maybe anyone responsible for the website reads this or can point me in the = right direction.

    I'm not in any way affiliated with the authors of this book.

    Application-specific Improvements to the Ecosystem

    Deep in this thread, Kay-Uwe Kirstein said

    Personally, I often use the monadic Result type together with a polymorphic= variant for the actual errors. This makes dealing with errors from different "levels" of my software (library, comman= d-line tool, and GUI) quite comfortable (and type-safe!). @keleshev has written a nice blog post on this: https://keleshev.com/composable-er= ror-handling-in-ocaml with a recent follow up: https://keleshev.com/advanced-error-handling-in-ocaml

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 8322CE0382 for ; Tue, 16 Aug 2022 10:51:34 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=sXz0=YU=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: jMWQB3ti94zfMl9bTQUz0R+6G9UNgx1KZ84BE5nLKKQKjiEkXbrE9RSHo0MR9qMdq2k+z4SwLc uOD5vQSFSD7O3p3G4VzsahLvK0nH6e9J7TV/4GWzXGTxgMG886Et09G8jgrilIuI082/0hiyCT B/4HsQ485yIVxEyaLKjBuxzmYu2pGf401mpAGp9xjdCookgDuccw9HiZ0D+sq+0T7ZAcZl06KM oVSCAlgflC2PdP5oRacQYYSJvhDSzMSQwpwwmrOamZs6DR2CoSlc1aMWOEnh5YAfsAj4kT8sni r+3FnjTt0c+rP03EjDNvRLuM X-IPAS-Result: =?us-ascii?q?A0BrDwAMWvtieyIeaIFSCBMBAYJDgSGBAxkBZ1cuBwhFh?= =?us-ascii?q?E6IfoVDAYJKgRaIQ48mhACBdxABAwENLAEOBAECBAEBghOCdAIWOQEEhCUCH?= =?us-ascii?q?gYBBTEHDgECBAEBAQEDAgMBAQEBAQEDAQEFAQEBAgEBAgQEARMBAQ8LCQcGC?= =?us-ascii?q?wYQDgU8ZGQEgUsEgXQLBwEFJw2CIhMMDAMDg3cBGAkKEwEBOBgjAxQBBgMCB?= =?us-ascii?q?A0BFwEeAwETARIaAYJjgyIDBAELi0+aSxo1eoExgQGCCAEBBoFAARgBDgmEH?= =?us-ascii?q?IFcCSSBGYZQZU4BgyGEICkQgVVEgRWCcwdugkMIDAsBAQEBAYE2BQEBCEUJg?= =?us-ascii?q?yCCZYZykisHNwNFHkIDC1IICRcSEBACBBEaCwYDFj4JAgQOA0AIDQMRBAMPG?= =?us-ascii?q?AkSCBAEBgMxDCULAwUPDAEGAwYFAwEDGwMUAwUkBwMZDyMNDQQfHQMDBSUDA?= =?us-ascii?q?gIbBwICAwIGFQYCAhg2OQgECAQrIw8FAgcvBQQvAh4EBQYRCAIWAgYEBAQEF?= =?us-ascii?q?QIQCAIIJxcHEzMZAQVZEAkhFgYoEAUGEwMgRyYFRQ8oMzU8Kx8bCoESKgkgF?= =?us-ascii?q?QMEBAMCBhMDAyICEC4xAxUGKRMSLQcrdQkCAyJuAwMEKCwDCSEfBwkiJj0FB?= =?us-ascii?q?V8SKAUDBBWWKYIJgREJJAIOC2UvFBoUFgEBIAI2NAQLGAE0AxIGERgGCw0tk?= =?us-ascii?q?X0qKQGYX5RcZDQHg1WBPgYMh3s8gSKNAogog3aBUIp5mCwhlmEgiS0JgQ8Jg?= =?us-ascii?q?kqUZCGCFoMGgU4aAYF6DAczGjBDgmcJCjsBAwINAQICAwECAQIJAQECh0lVh?= =?us-ascii?q?gsWg1CCZIF1O4VMPzQCAQE3AgYBCgEBAwmFYwEBBRMLAYR+AQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 r/sSg8= IronPort-HdrOrdr: A9a23:JGpCKKG8oBG5a46bpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,240,1654552800"; d="scan'208,217";a="21347454" X-MGA-submission: =?us-ascii?q?MDGgunyHdKmVvHY5GP6ekILtoQ6zWZb0JeahhG?= =?us-ascii?q?kUhJUxjgOXaGvtC7UtqXTVYDu6xIYFHaLfqcyuEiiv2otEvVHdazpzqQ?= =?us-ascii?q?dhQ10WVspz7IquL3LWJq/t+72Fw36lPDEArk7a0WGGkFVXHMBs9rdumw?= =?us-ascii?q?1lwo5n0I7teHEC+vFCOQzA7A=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Aug 2022 10:51:33 +0200 Received: from set (lfbn-cle-1-507-42.w90-114.abo.wanadoo.fr [90.114.250.42]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A3BC35605C6; Tue, 16 Aug 2022 10:51:26 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1660639891; bh=jjAvtLcBsMPspYrLQwBeppCI8fUkQByN4wOSdmL+bIM=; h=From:To:Subject:Date:Message-ID; b=UhsNa2JNFjdTeBRGFgZLfYKvZR+ELMzeTQEkBwWscp9wOJBr5/7LfmtU8ofKfk0yx GKoKgDMvX4VYTKdhh6BXKcTcfX/lvUneFfAO2JiJim2Ljk2+ZD6OHdX7B50LYRhgWK Q/ykD5nHDoqoAjlTdUlh0N8n3SqLKEz7+tRV58+M= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 16 Aug 2022 10:51:20 +0200 Message-ID: <87wnb8inav.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 16 10:51:32 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.394256, queueID=DB32B56122C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDA5IHRvIDE2LA0KMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpFbWFjcyBv biB3aW5kb3dzLCBtZXJsaW4gbW9kZSwgbWVybGluIHNlcnZlciByZW1vdGUgb24gbGludXgsIHRy YW1wLCBzc2gNCmNsYW5nbWwgNC4yLjA6IE9DYW1sIGJpbmRpbmdzIGZvciBDbGFuZyBBUEkgKGZv ciBDIGFuZCBDKysgcGFyc2luZykNCm9wYW0gMi4xLjMNCkFwcGxpY2F0aW9uLXNwZWNpZmljIElt cHJvdmVtZW50cyB0byB0aGUgRWNvc3lzdGVtDQpVc2UgR2l0SHViIENJIHRvIGJ1aWxkIHNpbXBs ZSBiaW5hcnkgZGlzdHJpYnV0aW9uPw0Kc2V0dXAtZGttbC55bWwgR2l0SHViIEFjdGlvbnMgd29y a2Zsb3cgZm9yIGRpc3RyaWJ1dGluZyBiaW5hcmllcw0KRGlza3V2IE9DYW1sIDEueC54OyBXaW5k b3dzIE9DYW1sIGluc3RhbGxlciBubyBsb25nZXIgaW4gcHJldmlldw0KT2xkIENXTg0KDQoNCkVt YWNzIG9uIHdpbmRvd3MsIG1lcmxpbiBtb2RlLCBtZXJsaW4gc2VydmVyIHJlbW90ZSBvbiBsaW51 eCwgdHJhbXAsIHNzaA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9lbWFjcy1v bi13aW5kb3dzLW1lcmxpbi1tb2RlLW1lcmxpbi1zZXJ2ZXItcmVtb3RlLW9uLWxpbnV4LXRyYW1w LXNzaC8xMDI0My8zPg0KDQoNCkFydGVtIFBpYW55a2ggc2FpZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBtYW5hZ2VkIHRvIHNl dCB1cCBFbWFjcyArIFRSQU1QICsgTFNQIHRvIGRvIHJlbW90ZSBkZXZlbG9wbWVudCAobm90DQog IG9uIHRoZSBmaXJzdCBhdHRlbXB0IHRob3VnaCwgYXMgdGhlc2UgdGhpbmdzIHdlcmUgcXVpdGUg ZmlkZGx5IHRvIHNldA0KICB1cCkuDQoNCiAgSGVyZSdzIHdoYXQgSSBnb3Q6DQogIDEuIFlvdSBu ZWVkIGBvcGFtIGluc3RhbGwgb2NhbWwtbHNwLXNlcnZlcicgb24gdGhlIHJlbW90ZSBtYWNoaW5l Lg0KICAyLiBUZWxsIFRSQU1QIHRvIHVzZSBwYXRoIGZyb20gdGhlIHJlbW90ZSBzaGVsbDogYChh ZGQtdG8tbGlzdA0KICAgICAndHJhbXAtcmVtb3RlLXBhdGggJ3RyYW1wLW93bi1yZW1vdGUtcGF0 aCknDQogIDMuIFVzZSBbRWdsb3RdIGFzIGFuIExTUCBjbGllbnQuIEFsdGhvdWdoLCBgbHNwLW1v ZGUnIGNsYWltcyB0aGF0IHRoZXkNCiAgICAgc3VwcG9ydCByZW1vdGUgc2VydmVycywgSSBjb3Vs ZG4ndCBxdWl0ZSBtYWtlIGl0IHdvcmsgd2l0aA0KICAgICBgbHNwLW1vZGUnLiBUaGlzIGlzIHdo YXQgSSBoYXZlIGluIG15IGBpbml0LmVsJzoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAocmVx dWlyZSAnZWdsb3QpDQogIOKUgiAoYWRkLWhvb2sgJ3R1YXJlZy1tb2RlLWhvb2sgIydlZ2xvdC1l bnN1cmUpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCltFZ2xvdF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9qb2FvdGF2b3JhL2VnbG90Pg0KDQoNCmNsYW5nbWwgNC4yLjA6IE9DYW1sIGJpbmRpbmdzIGZv ciBDbGFuZyBBUEkgKGZvciBDIGFuZCBDKysgcGFyc2luZykNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWNsYW5nbWwtNC0yLTAtb2NhbWwtYmluZGluZ3MtZm9yLWNsYW5nLWFwaS1mb3ItYy1hbmQt Yy1wYXJzaW5nLzYxMjMvMjc+DQoNCg0KVGhpZXJyeSBNYXJ0aW5leiBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIGBjbGFuZ21sLjQuNy4wJyBpcyBub3cgaW4gb3BhbSwgd2l0 aCB0aGUgYnVnIGZpeGVzL2ZlYXR1cmVzIHJlcXVlc3RlZA0KICBieSBAbjQ3IGFuZCBzb21lIG90 aGVycy4gQWxsIExMVk0vQ2xhbmcgdmVyc2lvbnMgdXAgdG8gMTQuMC54IGFyZQ0KICBzdXBwb3J0 ZWQsIGFzIHdlbGwgYXMgT0NhbWwgNS4wLiBUaGUgb2ZmaWNpYWwgcmVwbyBpcyBub3cgb24gZ2l0 aHViOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL3RoaWVycnktbWFydGluZXovY2xhbmdtbD4gd2hp Y2ggc2hvdWxkIGVhc2UNCiAgcG9zdGluZyBpc3N1ZXMgYW5kIHB1bGwgcmVxdWVzdHMgKGFuZCBz aG91bGQgYmUgbW9yZSBjb252ZW5pZW50IHRoYW4NCiAgZGlzY3Vzc2lvbnMgb24gdGhpcyB0aHJl YWQhKS4NCg0KICBTdXBwb3J0IGZvciB0aGUgdXBjb21pbmcgQ2xhbmcgMTUgaXMgcGxhbm5lZCBm b3IgdGhlIG5leHQgcmVsZWFzZSB0aGF0DQogIHNob3VsZCBoYXBwZW4gc29vbiAodGhlIGRldmVs b3BtZW50IHZlcnNpb24gYWxyZWFkeSBzdXBwb3J0cyBDbGFuZw0KICAxNSkuDQoNCg0Kb3BhbSAy LjEuMw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS0yLTEtMy8xMDI5OS8xPg0KDQoNClIuIEJv dWpiZWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSBtaW5v ciByZWxlYXNlIG9mIG9wYW0gWzIuMS4zXS4NCg0KICBUaGlzIG9wYW0gcmVsZWFzZSBjb25zaXN0 cyBvZiBbYmFja3BvcnRlZF0gZml4ZXMuIFlvdeKAmWxsIGZpbmQgbW9yZQ0KICBpbmZvcm1hdGlv biBpbiB0aGUgW2Jsb2cgcG9zdF0uDQoNCiAgVG8gdXBncmFkZSBzaW1wbHkgcnVuOg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgYmFzaCAtYyAic2ggPChjdXJsIC1mc1NMIGh0dHBzOi8vcmF3 LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9pbnN0YWxsLnNo KSAtLXZlcnNpb24gMi4xLjMiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClsyLjEuM10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjEuMz4NCg0KW2JhY2twb3J0 ZWRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXMvNTAwMD4NCg0KW2Jsb2cg cG9zdF0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItMS0zPg0KDQoNCkFwcGxp Y2F0aW9uLXNwZWNpZmljIEltcHJvdmVtZW50cyB0byB0aGUgRWNvc3lzdGVtDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2FwcGxpY2F0aW9uLXNwZWNpZmljLWltcHJvdmVtZW50cy10by10aGUt ZWNvc3lzdGVtLzEwMjIzLzU0Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIEpwIFIgc2FpZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgUmVnYXJkaW5nIFBlcmwgdnMg T0NhbWw6IEFuIChpbXByZXNzaXZlKSBpbXBsZW1lbnRhdGlvbiBvZiBhbGwgdGhlDQogIHNvbHV0 aW9ucyBvZiB0aGUgUGVybCBDb29rYm9vayBpbiB0aGUgT2JqZWN0aXZlIENBTUwgbGFuZ3VhZ2Ug KHVzZWQgYXQNCiAgdGhlIHRpbWUpIGlzIGF2YWlsYWJsZSBoZXJlOg0KICA8aHR0cDovL3BsZWFj LnNvdXJjZWZvcmdlLm5ldC9wbGVhY19vY2FtbC9pbmRleC5odG1sPg0KDQogIFJlLXdyaXRpbmcg dGhlc2UgZXhhbXBsZXMgd2l0aCAibW9kZXJuIiBjb2RlL2xpYnJhcmllcyBjb3VsZCBiZSB2ZXJ5 DQogIGludGVyZXN0aW5nLg0KDQoNClVzZSBHaXRIdWIgQ0kgdG8gYnVpbGQgc2ltcGxlIGJpbmFy eSBkaXN0cmlidXRpb24/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3VzZS1naXRodWItY2kt dG8tYnVpbGQtc2ltcGxlLWJpbmFyeS1kaXN0cmlidXRpb24vMTAzMDMvMT4NCg0KDQpDaHJpc3Rp YW4gTGluZGlnIGFza2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJcyB0aGVyZSBhIHJlY29tbWVuZGVkIHdh eSAob3IgZXhhbXBsZSkgdG8gYnVpbGQgYSBzaW1wbGUgYmluYXJ5DQogIGRpc3RyaWJ1dGlvbiBv ZiBhbiBPQ2FtbCBwcm9qZWN0IHVzaW5nIHRoZSBHaXRIdWIgQ0k/IEkgYW0gbW9zdGx5DQogIGlu dGVyZXN0ZWQgaW4gYnVpbGRpbmcgdGhlIGV4ZWN1dGFibGVzIGFuZCBwYWNrYWdpbmcgdGhlbSBp biBzb21lDQogIGFyY2hpdmUgZm9ybWF0IGFuZCBtYWtlIHRoYXQgYXZhaWxhYmxlIGZvciBkb3du bG9hZCBmb3IgZGlmZmVyZW50DQogIGFyY2hpdGVjdHVyZXMuDQoNCg0KR3VpbGxhdW1lIEJ1cnkg cmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBoYXZlIHN1Y2ggYSB3b3JrZmxvdyBmb3Igb25lIG9m IG15IHByb2plY3QsIHNlZSBbdGhpcyB3b3JrZmxvdw0KICBmaWxlXS4gSXQgYXV0b21hdGljYWxs eSB0cmlnZ2VycyBvbiBuZXcgcmVsZWFzZXMsIGJ1aWxkcyB0aGUgcHJvamVjdA0KICB3aXRoIHRo ZSBhcHByb3ByaWF0ZSBjb21waWxlciAoZS5nLiBgZmxhbWJkYScpLCBhbmQgdXBsb2FkcyB0aGUg YnVpbHQNCiAgYXJ0ZWZhY3QgdG8gdGhlIHJlbGVhc2UgcGFnZSB3aGVyZSBpdCBjYW4gYmUgZG93 bmxvYWRlZC4gSXQgY3VycmVudGx5DQogIHdvcmtzIGZvciBib3RoIGxpbnV4IGFuZCBtYWMgKGxh c3QgdGltZSBJIHRyaWVkIGl0IHdpdGggd2luZG93cyBJIGdvdA0KICBzb21lIGVycm9ycyBhbmQg SSBoYXZlbid0IHlldCBoYWQgdGhlIHRpbWUgdG8gbG9vayBpbnRvIHRoYXQsIHNvIGkNCiAgZG9u J3Qga25vdyBpZiB0aGUgZXJyb3JzIHdlcmUgY2F1c2VkIGJ5IHRoZSB3b3JrZmxvdywgb3IgbXkg cHJvamVjdCkuDQoNCg0KW3RoaXMgd29ya2Zsb3cgZmlsZV0NCjxodHRwczovL2dpdGh1Yi5jb20v R2J1cnkvZG9sbWVuL2Jsb2IvbWFzdGVyLy5naXRodWIvd29ya2Zsb3dzL3JlbGVhc2UueW1sPg0K DQoNCmpiZWNrZm9yZCBhbHNvIHJlcGxpZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYXQgd2FzIGEgd2Vp cmQgY29pbmNpZGVuY2UgdGhhdCBJIHJlbGVhc2VkIGEgR2l0SHViIHdvcmtmbG93DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldHVwLWRrbWwteW1sLWdpdGh1Yi1hY3Rpb25z LXdvcmtmbG93LWZvci1kaXN0cmlidXRpbmctYmluYXJpZXMvMTAzMDg+DQogIGZvciB0aGlzIHRv ZGF5LiBAem96b3pvJ3Mgc29sdXRpb24gaXMgc2ltcGxlciBpZiBpdCB3b3JrcyBmb3IgeW91cg0K ICBpbnRlbmRlZCB0YXJnZXQgYXVkaWVuY2UuDQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiByZXBs aWVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGRpZCB0aGUgc2FtZSBmb3IgbXkg bGl0dGxlIHByb2plY3QgW2JvYl0gYnV0IGl0IHByb3ZpZGVzIGENCiAgW0Nvc21vcG9saXRhbl0g YmluYXJ5IHdoaWNoIHNob3VsZCBydW4gYW55d2hlcmUsIHNlZSB0aGUgW3dvcmtmbG93XQ0KICBh bmQgdGhlIFtsYXN0IHVwbG9hZGVkIGFydGlmYWN0XSA6c2xpZ2h0X3NtaWxlOi4NCg0KDQpbYm9i XSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9ib2I+DQoNCltDb3Ntb3BvbGl0YW5dIDxo dHRwczovL2dpdGh1Yi5jb20vamFydC9jb3Ntb3BvbGl0YW4+DQoNClt3b3JrZmxvd10NCjxodHRw czovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2JvYi9ibG9iL21haW4vLmdpdGh1Yi93b3JrZmxvd3Mv ZXNwZXJhbnRvLnltbD4NCg0KW2xhc3QgdXBsb2FkZWQgYXJ0aWZhY3RdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9ib2IvYWN0aW9ucy9ydW5zLzI3NDk5NzgxNDI+DQoNCg0Kc2V0dXAt ZGttbC55bWwgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3cgZm9yIGRpc3RyaWJ1dGluZyBiaW5hcmll cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tc2V0dXAtZGttbC15bWwtZ2l0aHViLWFjdGlvbnMtd29ya2Zsb3ct Zm9yLWRpc3RyaWJ1dGluZy1iaW5hcmllcy8xMDMwOC8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgYHYwYCByZWxlYXNlIG9mIGBz ZXR1cC1ka21sLnltbGAsIGENCiAgR2l0SHViIEFjdGlvbnMgd29ya2Zsb3cgZm9yIGRpc3RyaWJ1 dGluZyBleGVjdXRhYmxlcyBvciBsaWJyYXJpZXMgdG8NCiAgdGhlIHB1YmxpYzoNCiAg4oCiIDxo dHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtd29ya2Zsb3dzI3JlYWRtZT4NCg0KICBJdCBp cyBzaW1pbGFyIHRvIHRoZSBbR2l0SHViIEFjdGlvbiBzZXR1cC1vY2FtbF0gYnV0IGhhcyBzZXZl cmFsDQogIGFkdmFudGFnZXMgd2hlbiB5b3UgYXJlIHJlbGVhc2luZyBhIGZpbmlzaGVkIHByb2R1 Y3QgdG8gdGhlIHB1YmxpYzoNCiAg4oCiIE9uIExpbnV4IGl0IHVzZXMgYW4gYW5jaWVudCBHTElC QyAoQyBsaWJyYXJ5KSBzbyB5b3VyIGJpbmFyaWVzIHJ1bg0KICAgIG9uIG1vc3QgTGludXggZGlz dHJpYnV0aW9ucyB3aXRob3V0IHN0YXRpYyBsaW5raW5nLiBTdGF0aWNhbGx5DQogICAgbGlua2Vk IGJpbmFyaWVzIGFyZSBzaW1wbGUgdG8gZGlzdHJpYnV0ZSwgYnV0IGNhbiBiZSBwcm9ibGVtYXRp YyBmb3INCiAgICBzb21lIGNvcHktbGVmdCBsaWNlbnNlcywgYW5kIG1ha2VzIGl0IGRpZmZpY3Vs dCBmb3IgeW91ciBlbmQtdXNlcnMNCiAgICB0byBkbyBzZWN1cml0eSBwYXRjaGluZyBvZiB0aGUg bGlicmFyaWVzIHlvdSBsaW5rZWQgd2l0aC4NCiAg4oCiIE9uIFdpbmRvd3MgaXQgdXNlcyB0aGUg VmlzdWFsIFN0dWRpbyBjb21waWxlciByYXRoZXIgdGhhbiB0aGUNCiAgICBub24tc3RhbmRhcmQg KGZvciBXaW5kb3dzKSBHQ0MgY29tcGlsZXIuIFRoaXMgaXMgYSBuZWNlc3NpdHkgd2hlbg0KICAg IGRpc3RyaWJ1dGluZyBXaW5kb3dzIGxpYnJhcmllcywgYW5kIHJlZHVjZXMgcnVudGltZSBidWdz IHdoZW4NCiAgICBsaW5raW5nIG5hdGl2ZSBXaW5kb3dzIGxpYnJhcmllcyBpbnRvIHlvdXIgT0Nh bWwtYnVpbHQgV2luZG93cw0KICAgIGV4ZWN1dGFibGVzLiBJbiBhZGRpdGlvbiB5b3UgY2FuIGdl bmVyYXRlIFdpbmRvd3MgMzItYml0IGJpbmFyaWVzLg0KICDigKIgT24gbWFjT1MgaXQgY2FuIGJ1 aWxkIGJvdGggQVJNNjQgYW5kIHg4Nl82NCBiaW5hcmllcyBpZiB5b3UgdXNlDQogICAgW29wYW0t bW9ub3JlcG9dIHRvIGJ1aWxkIHlvdXIgcHJvamVjdC4gL0FscGhhLXJlbGVhc2UgY2F1dGlvbjog VGhpcw0KICAgIHdvcmtzIHRvZGF5IGJ1dCBvbmx5IGlmIHlvdSBoYW5kLWVkaXQgdGhlIC5sb2Nr ZWQgZmlsZS4gU28gb25seQ0KICAgIGFkdmFuY2VkIHVzZXJzIHRvZGF5IS8NCg0KICBFdmVuIGlm IHlvdSBhcmUgbm90IHJlbGVhc2luZyB0byB0aGUgcHVibGljLCBpZiB5b3UgYXJlIGEgcGFja2Fn ZQ0KICBtYWludGFpbmVyIHlvdSBtYXkgd2FudCB0byB1c2UgL2JvdGgvIGBzZXR1cC1vY2FtbCcg YW5kIGBzZXR1cC1ka21sJw0KICBzbyB0aGF0IHlvdSBnZXQgYWRkaXRpb25hbCBjb3ZlcmFnZSBm b3IgVmlzdWFsIFN0dWRpbyBhbmQgW01TWVMyXSBvbg0KICBXaW5kb3dzLCBhbmQgY292ZXJhZ2Ug Zm9yIGFuIG9sZGVyIEdMSUJDIG9uIExpbnV4Lg0KDQogIFRoZSBmdWxsIGNvbXBhcmlzb24gbWF0 cml4IGF2YWlsYWJsZSBhdA0KICBbaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21sLXdvcmtm bG93cyNyZWFkbWVdIGlzOg0KDQogIOKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KICAgYHNldHVwLWRr bWwnICAgICAgICAgICAgICAgICAgICAgICAgICBgc2V0dXAtb2NhbWwnICAgICAgICAgICAgIENv bnNlcXVlbmNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAg4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQogICBgZGttbC1iYXNlLWNvbXBpbGVyJyAgICAgICAgICAgICAgICAgIGBvY2FtbC1iYXNl LWNvbXBpbGVyJyAgICAgYHNldHVwLWRrbWwnICpvbmx5IHN1cHBvcnRzIDQuMTIuMSB0b2RheSou IGBzZXR1cC1vY2FtbCcgc3VwcG9ydHMgYWxsIHZlcnNpb25zIGFuZCB2YXJpYW50cyBvZiBPQ2Ft bCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAg R2l0SHViIGNoaWxkIHdvcmtmbG93ICAgICAgICAgICAgICAgICBHaXRIdWIgQWN0aW9uICAgICAg ICAgICAgIGBzZXR1cC1ka21sJyBpcyBtb3JlIGNvbXBsZXggdG8gY29uZmlndXJlLCBhbmQgdGFr ZXMgKmxvbmdlciB0byBydW4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAgIE1TVkMgKyBN U1lTMiAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDICsgQ3lnd2luICAgICAgICAgICAgICBP biBXaW5kb3dzIGBzZXR1cC1ka21sJyBjYW4gbGV0IHlvdXIgbmF0aXZlIGNvZGUgdXNlIG9yZGlu YXJ5IFdpbmRvd3MgbGlicmFyaWVzIHdpdGhvdXQgQUJJIGNvbmZsaWN0cy4gWW91IGNhbiBhbHNv IGRpc3RyaWJ1dGUgeW91ciBleGVjdXRhYmxlcyB3aXRob3V0IHRoZSBsaWNlbnNlIGhlYWRhY2hl IG9mIHJlZGlzdHJpYnV0aW5nIG9yIHN0YXRpY2FsbHkgbGlua2luZyBgbGliZ2NjX3Nfc2VoJyBh bmQgYGxpYnN0ZGMrKycgICAgICAgICAgICAgICAgICAgICAgDQogICBgZGttbC1iYXNlLWNvbXBp bGVyJyAgICAgICAgICAgICAgICAgIGBvY2FtbC1iYXNlLWNvbXBpbGVyJyAgICAgT24gbWFjT1Ms IGBzZXR1cC1ka21sJyBjcm9zcy1jb21waWxlcyB0byBBUk02NCB3aXRoIGBkdW5lIC14IGRhcndp bl9hcm02NCcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgQ2VudE9TIDcgYW5kIExpbnV4IGRpc3Ry b3MgZnJvbSAyMDE0ICBMYXRlc3QgVWJ1bnR1ICAgICAgICAgICAgIE9uIExpbnV4LCBgc2V0dXAt ZGttbCcgYnVpbGRzIHdpdGggYW4gb2xkIEdMSUJDLiBgc2V0dXAtZGttbCcgZHluYW1pY2FsbHkg bGlua2VkIExpbnV4IGV4ZWN1dGFibGVzIHdpbGwgYmUgaGlnaGx5IHBvcnRhYmxlIGFzIEdMSUJD IGNvbXBhdGliaWxpdHkgaXNzdWVzIHNob3VsZCBiZSByYXJlLCBhbmQgY29tcGF0aWJsZSB3aXRo IHRoZSB1bm1vZGlmaWVkIExHUEwgbGljZW5zZSB1c2VkIGJ5IGNvbW1vbiBPQ2FtbCBkZXBlbmRl bmNpZXMgbGlrZSBbR05VIE1QXSANCiAgIDAgeXJzICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgNCB5cnMgICAgICAgICAgICAgICAgICAgICBgc2V0dXAtb2NhbWwnIGlzIG9mZmljaWFs bHkgc3VwcG9ydGVkIGFuZCB3ZWxsLXRlc3RlZC4gICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgDQogICBTb21lIHBpbm5lZCBwYWNrYWdlcyAgICAgICAgICAgICAgICAgIE5v IHBhY2thZ2VzIHBpbm5lZCAgICAgICAgYHNldHVwLWRrbWwnLCBmb3Igc29tZSBwYWNrYWdlcywg bXVzdCBwaW4gdGhlIHZlcnNpb24gc28gdGhhdCBjcm9zcy1wbGF0Zm9ybSBwYXRjaGVzIChlc3Bl Y2lhbGx5IGZvciBXaW5kb3dzKSBhcmUgYXZhaWxhYmxlLiBXaXRoIGBzZXR1cC1vY2FtbCcgeW91 IGFyZSBmcmVlIHRvIHVzZSBhbnkgdmVyc2lvbiBvZiBhbnkgcGFja2FnZSAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIA0KICAgYGRpc2t1di9kaXNrdXYtb3BhbS1yZXBvc2l0b3J5JyAgICAgICBgZmRvcGVuL29w YW0tcmVwb3NpdG9yeScgIEN1c3RvbSBwYXRjaGVzIGZvciBXaW5kb3dzIGFyZSBzb21ldGltZXMg bmVlZGVkLiBgc2V0dXAtZGttbCcgdXNlcyBhIG11Y2ggc21hbGxlciBzZXQgb2YgcGF0Y2hlcy4g YHNldHVwLW9jYW1sJyB1c2VzIGEgbGFyZ2UgYnV0IGRlcHJlY2F0ZWQgc2V0IG9mIHBhdGNoZXMu ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICANCiAg 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQoNCiAgICAgICAgUHV0IHNpbXBseSwgdXNlIGBzZXR1cC1k a21sJyB3aGVuIHlvdSBhcmUgZGlzdHJpYnV0aW5nDQogICAgICAgIGV4ZWN1dGFibGVzIG9yIGxp YnJhcmllcyB0byB0aGUgcHVibGljLiBVc2UgYHNldHVwLW9jYW1sJw0KICAgICAgICBmb3IgYWxs IG90aGVyIG5lZWRzLg0KDQogIGBzZXR1cC1ka21sJyB3aWxsIHNldHVwIHRoZSBmb2xsb3dpbmcg T0NhbWwgYnVpbGQgZW52aXJvbm1lbnRzIGZvcg0KICB5b3U6DQoNCiAg4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSBDQogICBBQklzICAgICAgICAgICAgICAgICAgICAgICAgTmF0aXZlIGBv Y2FtbG9wdCcgY29tcGlsZXIgc3VwcG9ydHMgYnVpbGRpbmcgZXhlY3V0YWJsZXMgZm9yIHRoZSBm b2xsb3dpbmcgb3BlcmF0aW5nIHN5c3RlbXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIA0KICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCiAgIHdpbjMyLXdp bmRvd3NfeDg2ICAgICAgICAgICAzMi1iaXQgV2luZG93cyBbMV0gZm9yIEludGVsL0FNRCBDUFVz ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICB3aW4zMi13aW5kb3dz X3g4Nl82NCAgICAgICAgNjQtYml0IFdpbmRvd3MgWzFdIGZvciBJbnRlbC9BTUQgQ1BVcyAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgbWFjb3MtZGFyd2luX2FsbCAg ICAgICAgICAgIDY0LWJpdCBtYWNPUyBmb3IgSW50ZWwgYW5kIEFwcGxlIFNpbGljb24gQ1BVcy4g VXNpbmcgYGR1bmUgLXggZGFyd2luX2FybTY0JyB3aWxsIGNyb3NzLWNvbXBpbGUgdG8gYm90aDsg b3RoZXJ3aXNlIGRlZmF1bHRzIHRvIEludGVsLiANCiAgIG1hbnlsaW51eDIwMTQtbGludXhfeDg2 ICAgICAzMi1iaXQgTGludXg6IENlbnRPUyA3LCBDZW50T1MgOCwgRmVkb3JhIDMyKywgTWFnZWlh IDgrLCBvcGVuU1VTRSAxNS4zKywgUGhvdG9uIE9TIDQuMCsgKDMuMCsgd2l0aCB1cGRhdGVzKSwg VWJ1bnR1IDIwLjA0KyAgICAgICAgICAgDQogICBtYW55bGludXgyMDE0LWxpbnV4X3g4Nl82NCAg NjQtYml0IExpbnV4OiBDZW50T1MgNywgQ2VudE9TIDgsIEZlZG9yYSAzMissIE1hZ2VpYSA4Kywg b3BlblNVU0UgMTUuMyssIFBob3RvbiBPUyA0LjArICgzLjArIHdpdGggdXBkYXRlcyksIFVidW50 dSAyMC4wNCsgICAgICAgICAgIA0KICDilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIENCg0K ICBUaGFua3MgdG8gdGhlIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIChPQ1NGKV0gZm9yIHRo ZWlyIHN1cHBvcnQgb2YNCiAgREtNTC4gRW5qb3khDQoNCg0KW0dpdEh1YiBBY3Rpb24gc2V0dXAt b2NhbWxdDQo8aHR0cHM6Ly9naXRodWIuY29tL21hcmtldHBsYWNlL2FjdGlvbnMvc2V0LXVwLW9j YW1sPg0KDQpbb3BhbS1tb25vcmVwb10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbGxhYnMvb3Bh bS1tb25vcmVwbyNyZWFkbWU+DQoNCltNU1lTMl0gPGh0dHBzOi8vd3d3Lm1zeXMyLm9yZy8+DQoN CltodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtd29ya2Zsb3dzI3JlYWRtZV0NCjxodHRw czovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtd29ya2Zsb3dzI3JlYWRtZT4NCg0KW0dOVSBNUF0g PGh0dHBzOi8vZ21wbGliLm9yZy9tYW51YWwvQ29weWluZz4NCg0KW09DYW1sIFNvZnR3YXJlIEZv dW5kYXRpb24gKE9DU0YpXSA8aHR0cHM6Ly9vY2FtbC1zZi5vcmcvPg0KDQoNCkRpc2t1diBPQ2Ft bCAxLngueDsgV2luZG93cyBPQ2FtbCBpbnN0YWxsZXIgbm8gbG9uZ2VyIGluIHByZXZpZXcNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWRpc2t1di1vY2FtbC0xLXgteC13aW5kb3dzLW9jYW1sLWluc3RhbGxlci1u by1sb25nZXItaW4tcHJldmlldy8xMDMwOS8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIERpc2t1diBPQ2FtbCAoREtNTCkgaGFzIGdyYWR1YXRlZCB0byB2ZXJzaW9uIDEuMC4wLiBU aGF0IG1lYW5zIHlvdSdsbA0KICBzZWUgREtNTCBsaXN0ZWQgYXMgYSBXaW5kb3dzIG9wdGlvbiBm b3IgT0NhbWwgb24gdGhlIHZhcmlvdXMgT0NhbWwNCiAgd2Vic2l0ZXMgc29vbi4NCg0KICBUbyBy ZWNhcCDigKYgYnkgZm9sbG93aW5nIHRoZSBzaW1wbGUgW2Rvd25sb2FkIGFuZCBpbnN0YWxsIGlu c3RydWN0aW9ucw0KICBmb3IgV2luZG93c10geW91IHdpbGwgZ2V0Og0KICDigKIgT0NhbWwgNC4x Mi4xDQogIOKAoiBgZHVuZScgYW5kIGBvcGFtJyB3b3JraW5nIHRyYW5zcGFyZW50bHkgYXMgaWYg eW91IHdlcmUgb24gVW5peA0KICDigKIgYSBgcGxheWdyb3VuZCcgT3BhbSBzd2l0Y2ggc28geW91 IGNhbiBzdGFydCBjb2Rpbmcgd2l0aG91dCBoYXZpbmcgdG8NCiAgICBsZWFybiBtYW55IE9wYW0g Y29tbWFuZHMNCiAg4oCiIHlvdXIgT3BhbSBzd2l0Y2hlcyBzdXBwb3J0ZWQgYnkgdGhlIFZpc3Vh bCBTdHVkaW8gT0NhbWwgcGx1Z2luDQogIOKAoiBhbGwgdGhlIHByZXJlcXVpc2l0ZXMgeW91IG5l ZWQgZm9yIE9DYW1sIHByb2dyYW1taW5nOg0KICAgIOKAoiBhIEMgY29tcGlsZXIgYW5kIGFzc2Vt YmxlciAoVmlzdWFsIFN0dWRpbyBCdWlsZCBUb29scykNCiAgICDigKIgYSBVTklYIGVudmlyb25t ZW50IChNU1lTMjsgbW9zdGx5IHlvdSB3b24ndCBzZWUgaXQpDQogICAg4oCiIHNvdXJjZSBjb250 cm9sIChHaXQgZm9yIFdpbmRvd3MpDQogIOKAoiBzdXBwb3J0ISBGaWxlIGFuIGlzc3VlIGF0DQog ICAgW2h0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGttbC1pbnN0YWxsZXItb2NhbWwvaXNzdWVz XS4gSSBkb24ndA0KICAgIHByb21pc2UgeW91ciBXaW5kb3dzIGlzc3VlIHdpbGwgYmUgZml4ZWQs IGJ1dCBpdCB3aWxsIGJlIHJldmlld2VkLg0KDQogIENoYW5nZXMgc2luY2UgMC40LjA6DQogIOKA oiBBbiB1bmluc3RhbGxlci4gTm93IHlvdSBjYW4gQWRkIGFuZCBSZW1vdmUgIkRpc2t1diBPQ2Ft bCIgZnJvbSB0aGUNCiAgICBDb250cm9sIFBhbmVsDQogIOKAoiBUaGUgb2xkIEdpdExhYiByZXBv c2l0b3J5IGF0DQogICAgW2h0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYvZGlza3V2LW9jYW1sXSBp cyBiZWluZyByZXRpcmVkLiBUaGVyZQ0KICAgIHdpbGwgYmUgYSBuZXcgR2l0TGFiIHJlcG9zaXRv cnkgd2l0aCBtdWNoIG1vcmUgdGVzdGluZyBjYXBhY2l0eSB0aGF0DQogICAgd2lsbCBiZSBvbmxp bmUgaW4gdGhlIG5leHQgZmV3IG1vbnRocy4NCg0KICBGdWxsIGRvY3VtZW50YXRpb24gaXMgYXQN CiAgW2h0dHBzOi8vZGlza3V2LmdpdGxhYi5pby9kaXNrdXYtb2NhbWwvI2ludHJvZHVjdGlvbl0u DQoNCiAgL1BhY2thZ2UgbWFpbnRhaW5lcnMvOiBIYXZlIGEgbG9vayBhdCB0aGUgW2p1c3QgYW5u b3VuY2VkDQogIGBzZXR1cC1ka21sJ10gdG8gdGVzdCB5b3VyIG93biBHaXRIdWIgcGFja2FnZXMg dXNpbmcgbW9zdCBvZiB0aGUNCiAgV2luZG93cyBmdW5jdGlvbmFsaXR5IGxpc3RlZCBhYm92ZS4N Cg0KICBUaGFua3MgKGFnYWluISkgdG8gdGhlIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIChP Q1NGKV0gZm9yIHRoZWlyDQogIHN1cHBvcnQgb2YgREtNTC4gUGxlYXNlIGNvbnNpZGVyIGJlY29t aW5nIGEgY29udHJpYnV0b3IgdG8gREtNTCB0bw0KICBpbXByb3ZlIHRoZSBXaW5kb3dzIGVjb3N5 c3RlbS4gRW5qb3khDQoNCg0KW2Rvd25sb2FkIGFuZCBpbnN0YWxsIGluc3RydWN0aW9ucyBmb3Ig V2luZG93c10NCjxodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtaW5zdGFsbGVyLW9jYW1s I2luc3RhbGxpbmc+DQoNCltodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtaW5zdGFsbGVy LW9jYW1sL2lzc3Vlc10NCjxodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtaW5zdGFsbGVy LW9jYW1sL2lzc3Vlcz4NCg0KW2h0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYvZGlza3V2LW9jYW1s XQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYvZGlza3V2LW9jYW1sPg0KDQpbaHR0cHM6Ly9k aXNrdXYuZ2l0bGFiLmlvL2Rpc2t1di1vY2FtbC8jaW50cm9kdWN0aW9uXQ0KPGh0dHBzOi8vZGlz a3V2LmdpdGxhYi5pby9kaXNrdXYtb2NhbWwvI2ludHJvZHVjdGlvbj4NCg0KW2p1c3QgYW5ub3Vu Y2VkIGBzZXR1cC1ka21sJ10NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNldHVw LWRrbWwteW1sLWdpdGh1Yi1hY3Rpb25zLXdvcmtmbG93LWZvci1kaXN0cmlidXRpbmctYmluYXJp ZXMvMTAzMDg+DQoNCltPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIChPQ1NGKV0gPGh0dHBzOi8v b2NhbWwtc2Yub3JnLz4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJ ZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBh bmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNo aXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFs c28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3Jp YmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3Nh Z2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hp dmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0 aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0K DQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vl a2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0K DQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 09 to 16, 2022.

    Emacs on windows, merlin mode, merlin server remote on linux, = tramp, ssh

    Artem Pianykh said

    I managed to set up Emacs + TRAMP + LSP to do remote development (not on th= e first attempt though, as these things were quite fiddly to set up).

    Here's what I got:

    1. You need opam install ocaml-lsp-server on the remote machi= ne.
    2. Tell TRAMP to use path from the remote shell: (add-to-list 'tramp= -remote-path 'tramp-own-remote-path)
    3. Use Eglot as an LSP= client. Although, lsp-mode claims that they support remote se= rvers, I couldn't quite make it work with lsp-mode. This is wh= at I have in my init.el:
    (require 'eglot)
    (add-hook 'tuareg-mode-hook #'eglot-ensure)
    

    clangml 4.2.0: OCaml bindings for Clang API (for C and C++ par= sing)

    Thierry Martinez announced

    clangml.4.7.0 is now in opam, with the bug fixes/features requ= ested by @n47 and some others. All LLVM/Clang versions up to 14.0.x are supported, as well as OCaml 5.0. The official rep= o is now on github: https://github.com/= thierry-martinez/clangml which should ease posting issues and pull requ= ests (and should be more convenient than discussions on this thread!).

    Support for the upcoming Clang 15 is planned for the next release that shou= ld happen soon (the development version already supports Clang 15).

    opam 2.1.3

    R. Boujbel announced

    We are pleased to announce minor release of opam 2.1.3.

    This opam release consists of backported fixes. You=E2=80=99ll find more information in the blog = post.

    To upgrade simply run:

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.1.3"
    

    Application-specific Improvements to the Ecosystem

    Deep in this thread, Jp R said

    Regarding Perl vs OCaml: An (impressive) implementation of all the solutions of the Perl Cookbook in the Objective CAML language (used at the time) is available here: http://ple= ac.sourceforge.net/pleac_ocaml/index.html

    Re-writing these examples with "modern" code/libraries could be very intere= sting.

    Use GitHub CI to build simple binary distribution?

    Christian Lindig asked

    Is there a recommended way (or example) to build a simple binary distributi= on of an OCaml project using the GitHub CI? I am mostly interested in building the executables and packaging them i= n some archive format and make that available for download for different architectures.

    Guillaume Bury replied

    I have such a workflow for one of my project, see this workflow file. It automatically triggers on new releases, builds the project with the appropriate compiler (e.g. flam= bda), and uploads the built artefact to the release page where it can be downloaded. It currently works for both linux = and mac (last time I tried it with windows I got some errors and I haven't yet had the time to look into that, so i do= n't know if the errors were caused by the workflow, or my project).

    jbeckford also replied

    That was a weird coincidence that I released a GitHub workflow https://discuss.ocaml.org/t/ann-set= up-dkml-yml-github-actions-workflow-for-distributing-binaries/10308 for= this today. @zozozo's solution is simpler if it works for your intended target a= udience.

    Calascibetta Romain replied

    I did the same for my little project bob but it provides a Cosmopolitan binary wh= ich should run anywhere, see the workflow and the last uploaded artifact :slight_smile:.

    setup-dkml.yml GitHub Actions workflow for distributing binari= es

    jbeckford announced

    I am pleased to announce the `v0` release of `setup-dkml.yml`, a GitHub Act= ions workflow for distributing executables or libraries to the public:

    It is similar to the GitHub Action setup-ocaml but has several advantages when you are releasing a finished product to the public:

    • On Linux it uses an ancient GLIBC (C library) so your binaries run on m= ost Linux distributions without static linking. Statically linked binaries = are simple to distribute, but can be problematic for some copy-left license= s, and makes it difficult for your end-users to do security patching of the= libraries you linked with.
    • On Windows it uses the Visual Studio compiler rather than the non-stand= ard (for Windows) GCC compiler. This is a necessity when distributing Windo= ws libraries, and reduces runtime bugs when linking native Windows librarie= s into your OCaml-built Windows executables. In addition you can generate W= indows 32-bit binaries.
    • On macOS it can build both ARM64 and x86_64 binaries if you use opam-monorepo to= build your project. Alpha-release caution: This works today but only if= you hand-edit the .locked file. So only advanced users today!

    Even if you are not releasing to the public, if you are a package maintaine= r you may want to use both setup-ocaml and setup-dkml so that you get additional coverage for Visual = Studio and MSYS2 on Windows, and coverage for an older GLIBC on Linux.

    The full comparison matrix available at https://github.= com/diskuv/dkml-workflows#readme is:

    setup-dkml setup-ocaml Consequence
    dkml-base-compiler ocaml-base-compiler setup-dkml only supports 4.12.1 toda= y. setup-ocaml supports all versions and variants of OCaml=
    GitHub child workflow GitHub Action setup-dkml is more complex to configure= , and takes longer to run
    MSVC + MSYS2 GCC + Cygwin On Windows setup-dkml can let your nati= ve code use ordinary Windows libraries without ABI conflicts. You can also = distribute your executables without the license headache of redistributing = or statically linking libgcc_s_seh and libstdc++<= /td>
    dkml-base-compiler ocaml-base-compiler On macOS, setup-dkml cross-compiles to = ARM64 with dune -x darwin_arm64
    CentOS 7 and Linux distros from 2014 Latest Ubuntu On Linux, setup-dkml builds with an old= GLIBC. setup-dkml dynamically linked Linux executables will b= e highly portable as GLIBC compatibility issues should be rare, and compati= ble with the unmodified LGPL license used by common OCaml dependencies like= GNU MP
    0 yrs 4 yrs setup-ocaml is officially supported and= well-tested.
    Some pinned packages No packages pinned setup-dkml, for some packages, must pin= the version so that cross-platform patches (especially for Windows) are av= ailable. With setup-ocaml you are free to use any version of a= ny package
    diskuv/diskuv-opam-repository fdopen/opam-repository Custom patches for Windows are sometimes needed. setup-dkml uses a much smaller set of patches. setup-ocaml<= /code> uses a large but deprecated set of patches.

    Put simply, use setup-dkml when you are distributing executabl= es or libraries to the public. Use setup-ocaml for all other needs.

    setup-dkml will setup the following OCaml build environments f= or you:

    ABIs Native ocamlopt compiler = supports building executables for the following operating systems:
    win32-windows_x86 32-bit Windows [1] for Intel/AMD CPUs
    win32-windows_x86_64 64-bit Windows [1] for Intel/AMD CPUs
    macos-darwin_all 64-bit macOS for Intel and Apple Silicon CPUs. Using= dune -x darwin_arm64 will cross-compile to both; otherwise de= faults to Intel.
    manylinux2014-linux_x86 32-bit Linux: CentOS 7, CentOS 8, Fedora 32+, Mageia= 8+, openSUSE 15.3+, Photon OS 4.0+ (3.0+ with updates), Ubuntu 20.04+
    manylinux2014-linux_x86_64 64-bit Linux: CentOS 7, CentOS 8, Fedora 32+, Mageia= 8+, openSUSE 15.3+, Photon OS 4.0+ (3.0+ with updates), Ubuntu 20.04+

    Thanks to the OCaml Software Foundation (= OCSF) for their support of DKML. Enjoy!

    Diskuv OCaml 1.x.x; Windows OCaml installer no longer in previ= ew

    jbeckford announced

    Diskuv OCaml (DKML) has graduated to version 1.0.0. That means you'll see D= KML listed as a Windows option for OCaml on the various OCaml websites soon.

    To recap … by following the simple download and install instructions for = Windows you will get:

    Changes since 0.4.0:

    Full documentation is at https://dis= kuv.gitlab.io/diskuv-ocaml/#introduction.

    Package maintainers: Have a look at the just announced setup-dkml to test your own Git= Hub packages using most of the Windows functionality listed above.

    Thanks (again!) to the OCaml Software Fou= ndation (OCSF) for their support of DKML. Please consider becoming a contributor to DKML to improve the Windows ecosystem. E= njoy!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 9C33BE0385 for ; Tue, 23 Aug 2022 10:06:48 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=NDRh=Y3=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 99b59F3ooMBAfGiFNXpxBu4LtCuGnCoWCM2k80gYm67VLFfIbcIBw2STYq0+8Oo6iz6ugv8tdS b+nSg8GKExZJg5xr32xCO6U9B3DgkslygBMF7vg+CKKqKSnf7VpL2O7QjOph2kUsuGcTKU/AUT UuXr77pUr6obVYE7eto95RHgiUKMHn5dVaulk3qsxijpzObfAmSCHe0C68B12aSykbpM8HNmUN KEcJKsBNGHbLOgIsG3B2FLSq485dA91gLBeyjheuf7TX7xb3Yv//IcH4qhL8ixBCQWijZ+RBr8 9C7LwbG0Qqd1mhRBhG9CbXWH X-IPAS-Result: =?us-ascii?q?A0ABBwBiigRjmCIeaIFag3lbKBkBZ1cuBwhFhE6BY4cbh?= =?us-ascii?q?UMBgkpsKohElTMBAwENLAEMBgECBAEBg1GBNhg5AQSEDQIeBgEFMxMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEJCwkHBgwFEA4FP?= =?us-ascii?q?GRkBIFLBIF0CzQNgiITDBmDcAEhChMBATgYIwMbAwIEDQEXAR4XARIUBoJjA?= =?us-ascii?q?YMiAwULi3mbGnqBMYEBgggBAQaBQAEYD4QlgVwJJIEZhltlTgGDIoQiKRCBV?= =?us-ascii?q?USBFYJzB26CSxcBAQEBAYE7AQFNgymCZZljBzcDRR5CAwtICAkXEhAQAgQRG?= =?us-ascii?q?gsGAxY+CQIEDgNACA0DEQQDDxgJEggQBAYDMQwlCwMFDwwBBgMGBQMBAxsDF?= =?us-ascii?q?AMFJAcDGQ8jDQ0EHwwDAwUlAwICGwcCAgMCBhUFAgIYNjkIBAgEKyMPBQIHL?= =?us-ascii?q?wUELwIeBAUGEQgCFgIGBAQEBBUCEAgCCCcXBxMzGQEFWRAJIRYGKBAFBhMDI?= =?us-ascii?q?EkmBUUPKDM1OSsdGwqBEioJIBUDBAQDAgYTAwMgAhAuMQMUBikTEi0HK3UJA?= =?us-ascii?q?gMiawMDBCgsAwkfHwcJIiY9BQVbEigFAwMQIj0GAwkDAieXKYIGgUAOOAZ8E?= =?us-ascii?q?xwPAVg4WEoWAi2SCiEbDJhllUY0B4NVgT8GDIg4gSKNAogphUajLiGWZiCJL?= =?us-ascii?q?YEhgkqUaoU9gU4qXoEQCQczGjCDKglFAQMCDQECAgMBAgECCQEBAo4pFoEEA?= =?us-ascii?q?QeCRIRZO4VMPzQCAQE3AgYBCgEBAwmFYwEBBRMLAYRTAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 r/sSg8= IronPort-HdrOrdr: A9a23:PYk556mqed7sXLdj6+r4hwDndGDpDfIR3DAbv31ZSRFFG/Fw9v re/8jzsCWftN9/Yh8dcLy7VZVoIkm9yXcW2+gs1N6ZNWGMhILCFu5fBOXZrwHIKmnXyap21K trcaRyYeeAb2RSvILd+wf9N94hxbC8gcSVbArlvhJQcT0= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,257,1654552800"; d="scan'208,217";a="49607170" X-MGA-submission: =?us-ascii?q?MDGuVwGA4uf/d5r4xJoA7xKxVcu2Pr2wvLVCts?= =?us-ascii?q?lX+dnOMp+9DxTVAP+lwKVkKRYZYBgFv5aPvRKmp8MEK/J6wvgqfr3rbo?= =?us-ascii?q?Fbq4gU4G+C07MviZyloewp+gNZWBEx9IMQftSVFPKD4/TIbr9mT8RNDC?= =?us-ascii?q?bUlaNxCP2NaOTQ9omS2Wf5DQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Aug 2022 10:06:47 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8B8A0564C31; Tue, 23 Aug 2022 10:06:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1661242006; bh=0XXDJ6c5OTUVrrnhdfXt58Q0xlVqWgqf3YAOyiIlQ5k=; h=From:To:Subject:Date:Message-ID; b=32MWZ+NeUHVbvL8aGheDpXqPtiv+k2VMjWayiulk7gxzbX907UhJfv+X19n4baGVZ btkqjAsj6BTNeZ2EsArUQfeTEvyNDCL+TwtmabhrUgMvWFGFqPJ8+3sqFA4/piXJ48 Smn0quLuWMjXBTW7QvdJcsBhVtkFInDAEbHjEm9s= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 23 Aug 2022 10:06:46 +0200 Message-ID: <878rnf4c4p.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 23 10:06:46 2022 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.441534, queueID=CF713564C32 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDE2IHRvIDIzLA0KMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpXcml0aW5n IGEgdHJhbnNwaWxlciBmcm9tIFBIUCB0byBwb2x5Z2xvdCBQSFArQyBjb2RlDQpIb3cgdG8gc3Bl ZWQgdXAgdGhpcyBmdW5jdGlvbj8NCk9sZCBDV04NCg0KDQpXcml0aW5nIGEgdHJhbnNwaWxlciBm cm9tIFBIUCB0byBwb2x5Z2xvdCBQSFArQyBjb2RlDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Rpc2N1c3Npb24td3JpdGluZy1hLXRyYW5zcGlsZXItZnJvbS1waHAtdG8tcG9seWds b3QtcGhwLWMtY29kZS8xMDMwMS80Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIE9sbGUgSMOk cnN0ZWR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTWFkZSBhIHNtYWxsIHBy b3RvdHlwZSBoZXJlLCB2ZXJ5IHN0YW5kYXJkIHRoaW5nOg0KICA8aHR0cHM6Ly9naXRodWIuY29t L29sbGVoYXJzdGVkdC9waG9seWdsb3QvdHJlZS9tYWluL3NyYz4NCg0KICBQYXJzZXIgYW5kIGxl eGVyIGluIE1lbmhpciwgQVNUIHRoYXQgcmVwcmVzZW50cyB0aGUgc3Vic2V0IFBIUCBsYW5nLA0K ICB0aGVuIEknZCBoYXZlIHRvIGl0ZXJhdGUgb3ZlciBpdCB0byBpbmZlciBzb21lIHR5cGVzLCB0 cmFuc2Zvcm0gdG8NCiAgcG9seWdsb3QgQVNUIGFuZCBmcm9tIHRoZXJlIHRvIHN0cmluZy4NCg0K ICBUaGUgb25lIHRoaW5nIHRvIG1ha2UgaXQgbW9yZSBwcm9mZXNzaW9uYWwgd291bGQgYmUgcHJv cGVyIGVycm9yDQogIG1lc3NhZ2VzIGZvciB0aGUgZW5kIHVzZXLigKYgQnV0IHlvdSBoYXZlIHRv IGNhcnJ5IGZpbGUgYW5kIGxpbmUgaW4gdGhlDQogIEFTVCwgcmlnaHQ/IE1heWJlIEkgY2FuIGdv b2dsZSBhcm91bmQuIDp0aGlua2luZzoNCg0KDQpIb3cgdG8gc3BlZWQgdXAgdGhpcyBmdW5jdGlv bj8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93LXRvLXNwZWVkLXVwLXRoaXMtZnVuY3Rpb24v MTAyODYvMjk+DQoNCg0KRGVlcCBpbiBhIGh1Z2UgZGlzY3Vzc2lvbiwgWWFyb24gTWluc2t5IHNh aWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZyb20gb3VyIHBlcnNwZWN0aXZlIGF0IEphbmUg U3RyZWV0LCB1bmJveGVkIHR5cGVzIGlzIGEgL3ZlcnkvIGhpZ2gNCiAgcHJpb3JpdHkuIEEgbGFy Z2Ugc2xpY2Ugb2YgdGhlIHRlYW0gaXMgdGhpbmtpbmcgYWJvdXQgaXQsIGFuZCBDaHJpcw0KICBD YXNpbmdoaW5vIGFuZCBSaWNoYXJkIEVpc2VuYmVyZyBoYXZlIGpvaW5lZCByZWNlbnRseSBhbmQg aGF2ZSBpdCBhcw0KICB0aGVpciBwcmltYXJ5IGZvY3VzLCBhbG9uZyB3aXRoIEFudGFsLg0KDQog IEluIHRlcm1zIG9mIHdoZW4gaXQgbWFrZXMgaXQgdXBzdHJlYW0sIHRoYXQncyBsZXNzIGNsZWFy LiBXZSdyZQ0KICB3b3JraW5nIGhhcmQgb24gZ2V0dGluZyBvdXQgc29tZSBpbml0aWFsIHZlcnNp b25zIGRvbmUsIGFuZCB3ZSBwbGFuIG9uDQogIGl0ZXJhdGluZyBpbnRlcm5hbGx5LCB3aGVyZSBp dCdzIGVhc2llciBmb3IgdXMgdG8gdHJ5IHRoaW5ncyBvdXQgYW5kDQogIHRoZW4gY2hhbmdlIHRo ZW0gYXMgd2UgZ28uICBPbmNlIHdlIGhhdmUgYSBkZXNpZ24gdGhhdCB3ZSByZWFsbHkNCiAgYmVs aWV2ZSBpbiwgd2UgaW50ZW5kIHRvIHByb3Bvc2UgaXQgdXBzdHJlYW0sIGJ1dCBob3cgcXVpY2ts eSB0aGF0DQogIGdvZXMgKGFuZCB3aGV0aGVyIGl0J3Mgc3VjY2Vzc2Z1bCBhdCBhbGwhKSBkZXBl bmRzIG9uIHdoZXRoZXIgdXBzdHJlYW0NCiAgbWFpbnRhaW5lcnMgYW5kIHRoZSBsYXJnZXIgY29t bXVuaXR5IGZpbmQgdGhlIGltcHJvdmVtZW50cyBjb21wZWxsaW5nLg0KDQogIEluIGFueSBjYXNl LCBJIGZpbmQgdGhpcyBjb252ZXJzYXRpb24gZW5jb3VyYWdpbmcsIHNpbmNlIGl0IHN1Z2dlc3Rz DQogIHRoZXJlJ3Mgc29tZSByZWFsIGh1bmdlciBmb3IgaW1wcm92ZW1lbnRzIGluIHRoaXMgc3Bh Y2UuDQoNCiAgSSBleHBlY3QgSUNGUCBpbiBwYXJ0aWN1bGFyIHRvIGJlIGEgZ29vZCBvcHBvcnR1 bml0eSBmb3IgcGVvcGxlIHRvDQogIGxlYXJuIG1vcmUgYWJvdXQgdGhlIHdvcmsgd2UncmUgZG9p bmcgYm90aCBoZXJlLCBhbmQgYWxzbyBvbiB0eXBlLXNhZmUNCiAgc3RhY2sgYWxsb2NhdGlvbi4g KEZvciB3aGF0IGl0J3Mgd29ydGgsIHRoZSBsYXR0ZXIgaXMgYWxyZWFkeSBpbg0KICBwcm9kdWN0 aW9uIGludGVybmFsbHkgYW5kIGxvb2tzIHZlcnkgcHJvbWlzaW5nLikNCg0KICBJZiB5b3UnbGwg YmUgYXQgSUNGUDoNCg0KICDigKIgUmljaGFyZCBFaXNlbmJlcmcgd2lsbCBiZSBnaXZpbmcgYSBb dGFsayBvbiB1bmJveGVkIHR5cGVzXSBhdCB0aGUgTUwNCiAgICB3b3Jrc2hvcA0KICDigKIgU3Rl cGhlbiBEb2xhbiB3aWxsIGJlIGdpdmluZyBhIFt0YWxrIG9uIHN0YWNrIGFsbG9jYXRpb25dIGF0 IHRoZQ0KICAgIE9DYW1sIFVzZXJzIGFuZCBEZXZlbG9wZXJzIFdvcmtzaG9wLg0KDQoNClt0YWxr IG9uIHVuYm94ZWQgdHlwZXNdDQo8aHR0cHM6Ly9pY2ZwMjIuc2lncGxhbi5vcmcvZGV0YWlscy9t bGZhbWlseXdvcmtzaG9wLTIwMjItcGFwZXJzLzEzL1VuYm94ZWQtdHlwZXMtZm9yLU9DYW1sPg0K DQpbdGFsayBvbiBzdGFjayBhbGxvY2F0aW9uXQ0KPGh0dHBzOi8vaWNmcDIyLnNpZ3BsYW4ub3Jn L2RldGFpbHMvb2NhbWwtMjAyMi1wYXBlcnMvOS9TdGFjay1hbGxvY2F0aW9uLWZvci1PQ2FtbD4N Cg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRv IG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQog IGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JT UyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNl aXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0u DQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0 cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4g U2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 16 to 23, 2022.

    Writing a transpiler from PHP to polyglot PHP+C code

    Deep in this thread, Olle H=C3=A4rstedt announced

    Made a small prototype here, very standard thing: https://github.com/olleharstedt/= pholyglot/tree/main/src

    Parser and lexer in Menhir, AST that represents the subset PHP lang, then I= 'd have to iterate over it to infer some types, transform to polyglot AST and from there to string.

    The one thing to make it more professional would be proper error messages f= or the end user… But you have to carry file and line in the AST, right? Maybe I can google around. :thinking:

    How to speed up this function?

    Deep in a huge discussion, Yaron Minsky said

    >>From our perspective at Jane Street, unboxed types is a very high pr= iority. A large slice of the team is thinking about it, and Chris Casinghino and Richard Eisenberg have joined recently a= nd have it as their primary focus, along with Antal.

    In terms of when it makes it upstream, that's less clear. We're working har= d on getting out some initial versions done, and we plan on iterating internally, where it's easier for us to try = things out and then change them as we go. Once we have a design that we really believe in, we intend to propose it up= stream, but how quickly that goes (and whether it's successful at all!) depends on whether upstream maintainers an= d the larger community find the improvements compelling.

    In any case, I find this conversation encouraging, since it suggests there'= s some real hunger for improvements in this space.

    I expect ICFP in particular to be a good opportunity for people to learn mo= re about the work we're doing both here, and also on type-safe stack allocation. (For what it's worth, the latter is= already in production internally and looks very promising.)

    If you'll be at ICFP:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5F8A9E0038 for ; Tue, 13 Sep 2022 10:40:45 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=q1h0=ZQ=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: MDCfbrMc9Oqm4VIAVbGMDp4vu9hrmb+M4Kv4TQiFvICrrCWU+PJJCfZtnOnzqz8vBxmfKr6F4S 2PvuryEe9EbPylluaF2E8LwzgnSGylNcn/HCCoV4qFOfmfcvzxcBPfL882GjrX56rSzIlMR0nE XvTcobt/XkDNwSg1XaZtlgK+wS6AhZ1MA9Fdb+wo/OQ9iGEFmJSdOUNyyOqs8yq6jxiXnkwG+8 HJ1bCri44kuRZpXegfxHZNVJb7gL3FQwT3DnV4JmyL/KZ70Ny1mzOczfvR1y80FsCdvs9yYWup keHCa3OsUKQkux42U1U6x5Yj X-IPAS-Result: =?us-ascii?q?A0CRAQCnQCBjmCIeaIFaAR0BEgsBDIIEC4EhgQMZAWdWL?= =?us-ascii?q?gcIRYROiH6IFIEWiEiHCYwqFIERA08QAQMBDSwBDAYBAgQBAYQvVoRpAh4GA?= =?us-ascii?q?QUxBw4BAgQBAQEBAwIDAQEBAQEBAwEBBQEBAQIBAQIEBAETAQEBAQEBAQEUC?= =?us-ascii?q?RkFEA4FPGRkBIFLBIF0CwcGJw2CNQwZg3ABGAkKEwEBKwMEBhgUDwMUAQYDA?= =?us-ascii?q?hEBFwEeAxQBEhQGAYJiAYMgAwULi1SaTho1eoExgQGCCAEBBoFAAQMDCwICA?= =?us-ascii?q?wEOCSUBg3aBXAkkgRmHAm5VAYM2CYQdAicQgVVEgRWCDGcHboFQcAsXAQEBA?= =?us-ascii?q?QGBHhcGAQEIRYMpgmWSOIVgBzcDRR1BAwt3AxUDFAMFJAcDGQ8jDQ0EHQwDA?= =?us-ascii?q?wUlAwICGwcCAgMCBhMFAgIXNjgIBAgEKyQPBQIHLwUELwIeBAUGEQgCFgIGB?= =?us-ascii?q?AQEBBUCEAgCCCYXBxMzGQEFWRAJIRYGKA0FBhMDIEkmBUUPKDM1OSsdGwqBD?= =?us-ascii?q?ioJHxUDBAQDAgYTAwMiAhAqMRQEKRMSLQcrcwkCAyJqAwMEKCwDCSEfBygmP?= =?us-ascii?q?AdZEigFAwMQIj0GAwkDAiRbgQUsKAUDDRkmCAWVeoFPgUUOCi4XIgsPBw4GD?= =?us-ascii?q?QcTAQcDHwEBBRQHAgcvCSQLAQoEIxgOHS0FAwECDQQpA5IJEBInjgCKa4Jhk?= =?us-ascii?q?mk0B4NXgUEGDIg/gSONA4gqg3aBUIsAhmSRVCGWaSCJLYEYCYJLhHSDSIY4h?= =?us-ascii?q?U0rE4FCg2iBThoELzsNYgEdDAczGjBQGYINAQEBMQlFAQMCDQECAgMBAgECC?= =?us-ascii?q?QEBAoscgw0WgVhagR4QglSBPDk7WoRyPzQCAQE3AgYBCgEBAwmFYwEBBRMLA?= =?us-ascii?q?YMMgkcBAQ?= IronPort-PHdr: A9a23:b9DZThI8WcfVUMWegNmcuMJoWUAX0o4c3iYr45Yqw4hDbr6kt8y7e hCFvrM21QOCBdmTwskHotKei7rnV20E7MTJm1E5W7sIaSU4j94LlRcrGs+PBB6zBvfraysnA JYKDwc9rDm0PkdPBcnxeUDZrGGs4j4OABX/Mhd+KvjoFoLIgMm7ye6/94fdbglVizexbq9+I RqrpgjNq8cahpdvJLwswRXTuHtIfOpWxWJsJV2Nmhv3+9m98p1+/SlOovwt78FPX7n0cKQ+V rxYES8pM3sp683xtBnMVhWA630BWWgLiBVIAgzF7BbnXpfttybxq+Rw1DWGMcDwULs4WTes7 6F1SB/pkycHNiU28GXJhcdtgqNbpwihqAFkw4XJZI2YOuZycqbbcNgHR2ROQ9xRWjRBDI2ic oUBAekPMulEoITmvVQCsQGzCBOwCO/zyDJFgGL9060g0+QmFAHLxBAtH9YUv3TSsd77KbsdU eCwzKnJ0TXDc+5d1DDn54jMaB8hp+uAXalsfsrRzEkvFh/FjkmLpIz9ODOV0uQMs3SF4OV8V eKvjW8nqxhsojex3MssjZPJho0Mx13C6C52z5o7K8eiR05nfd6rDoFQtyeCOoZ4XM8vR3xkt Dg5x7AHp5O2fDQGxIkjyhPeZPKKbYeG7g7iWeqNPDp0mXJrdryjixuw/0WtzvPxW8m63ltUs idIlMTHuH4K1xzW8MeHS/1981+52TmRywDT6/1ELl4slarcLp4hx6A/moAVsUvdAi/6gEL2g 7OMeUUh/uik8ePnYq/pppOEOI90ix3+MqQzmsOkG+g3Lg8OX22D9eui27zs50j5QK1OjvIoi KXZt4raJcsDqq6+Hg9Vzpwj5AilADi60NQZnWMLLFVfeBKIl4ToNE/BIPbgDfelhFSskilky OzaPrH7BZXNNHfDnK/ufbZ67E5cxw4zws5F651IDbEBJer/WkjvtNPGFB85LQ20zPjpCdln2 IIeWGGPAq6BPKPUqF+I/fkgL/OWaI8UvzbxM/8l5+X0gn8kg1MdZ7em0YMNaHC/BftmPl+Zb WDwjdcGFmcKphIyTPbtiFKZTD5TfWy+X6M75j0jDYKmDJ3DSZqigLOfxiu7H5pWanhCCl+WF HfnbJiLVO0CaCKVJc9tiCALVb+kS4M5zh6hrhP6y6FgLurK4CEXqZXj1N1t6+3SkBE97zp0A NmH026XVW17hGIISyc43aB4u0x9yU2M3rN8g/NGD9Bc+/RJUgIiOZHA1eN6F8n+WhzbcteOU lamTc2qADE2TtIs398OflxxFM68gRzb2CqlH6Ual7mPBJAu6K7c2GLxJ8llx3bazqYhlVgmT dZROm29nKJw6w/TB4vRn0Wbjamqc7oT3DXR9GeZ02WBol1YXBRsXqXCWHATfkrWosn550PGS 7+iE7MnMhFOycOEN6BEacXpgE1bSPv9PNnSeX+9l3u/CBqSyL6AcJDmdmsS0SnFFUQJnR0f8 WyYOQU+CSqtuX/SACB0GV7yYU7g7e9zo26hQEAu1QGFdUhh2qK1+hELgfycTOse3rcLuSs8s Tl0BFG939bWCtqcuQVuYKVcYdU84FdeyGLWqRZxPpu6L6BtnlIecgJ3sF3y1xhvF4lMj8wno Gk3wAZuJq+Uyl1Mey+C0Z3+NbDbMmzy8wqua67S1FHeytGW+qIX5folt1vtoR2lG1I783l60 9lZz2OR6ZbRAgcKSZLxVUI39hhmp77EfiY954XU1Xx1MamprDDOwdUpBPEqyhu4ZdhfNLmLF AnoH80BG8euKOkqm1m1bhIYJ+1d76k0P96gd/SaxqGrJ/xsnDepgGVI+ox91ViM9yVkRu7Ox JkK2+uY0RefVzfgkFehtdj6lZ1caTEIAmW/0TTkBJJWZqBqYYkEE2KuI8muytV6hp7tQGJY+ UW4B1IG3c+pYQCdY0b83Q1Wz0QXoGaolTG2zzxuwHkVqf/V2DPIiay2cAUBEmpUQi9kgEu6Z cD+hM8cFgDgOwM2kjOh5F3m3O5aqLV7Ky/UW0geO2D9JmRmF6+xraaqYshV6Zpuvz8Efv67Z AWzTrf76yAR0ybiA3cWkDk/fjfsoZ75mh1mlEqFK3JisHfSecdx3ArSotvGSqgCjXI9WCBkh GyPVRCHNN6z8IDPz/8r08i7XmOlDdhIdDXziJiHrG297HFrBhu2m7aynMfmGE40y3yzzMFkA B3Btw20eYz3z+KiK+syd01hAhnn4Mp/G51iupM3gIAM1HMagJSM4HdBln38Yp1AwayrVHMWX nYQxsLNpg3s2UltNHWMkrnDbS3I25JhP4yIWzYO3SYs881BCKGV9aFJ2yxvrQ+xqQvXJ+N2n jIc1ecG4nkHheoEo0wokjXbBaodTgFDJSK5rx2T9JilqblPImaidb/lzE1lgdWoF62PuClZS C+/YpAmDDN95cV5MUvR3Tv08I6MlMD4VdsIrVXUlh7Bi7MQM5ctjr8RgjIhP2vhvHojwup9j Bp03Jj8spLVY2lq+au4BFZfOFiXL4sa/jjry71VnsOXw5yHBpJlCykGV5vuTOu1HXQVr/uvO wuVETI6o2uWAvKGR17ZsR866SmXVcv3f3iMQRtRhc1vXhycOFBSjEgPUTM2k4R4XgGmycr9c VtosygL7w2woR9Nx+R0chjnBz6F9UHxMmtyE8DZd0YFi2MKr13YOsGf8O9pSiRR/5n66ReIN nTefANQS2cARk2DAVnneLio/9jJteaCVY/cZ7PDZ6uDretGWrKG35Wqh8FdxQ3UY9zWPiE3P cRuwk1HTGx0EMTfmiwSRmoQjS2YZsqSolGn8S1yr9yj2P7sRQTk6JDJDudCd9J19Frl5MXLf /7Vnyt/JTtCg9kFwXbOjqMU3FsTlz1Gbz6pAKgNvi7LTbvNl+lQFRFROEYRfINYqqk72AdKI 8vSjNj4g6V5gvACAFBATVX9m8utaJ9CMySnOVjAHkrOKKWeKGiB2Nn5O+XkA+417q0cp1iqt D2cCUOmIjmTi2yjTAiha6cUyzmBNVhbtpu6d14uADrmXIugchq/IcN6hj0wwKQpizXNL2F5U 3A0MEofq63KqztfhuRjFmdB6Ht8MOTCnDyWp6rReJMG6r1zBSBli+9R4HI70qZYqiZeS5kX0 GORr8Yw8Qv+yrDdlmNrCEgX+GcXiI/Z7xo5Z6mLqcUfAT6B9RYJpw18EjwyrsB+Qp3qsqFUk Z3Ukb7rbSxF65TS9NcdAM7dLISGNmAgOFznAmycAAwARD+tfWbR4i4V2MqozSXAt8E68s3eo c8WTbtKSFE+FvUbE1loWtsYL8J+Wjoi16WQjMsJ+WaWph7MQs5XpdbCCuLUBu/gTVTRxbVJf BoHx7rkIJ9bb9eqnRU6Nh8hxMKRRwLZRphVrzdkbxMorUkF63V4QmApmieHIkus7HIVCf+oj 0szgwp6b/4q8WSk6FM2K1zW4SooxRBryJO82WzXK2a3d/vjOOMeQzD5vEUwLJ7hFgN8bAnp2 FdhKC+BXLVJyb1paWFsjgbY/5pJA/9VC6NeM3pyjbmaYesl1VNEp2Cp30hCsKH+M6A6wRJzc cb5nUsVwwVnfcI4LqzWJbNUwx5XnK3btyuh0KYqyw8bJloR2GmVZSgDtVdOM+U2YS2y8aY/j G7K0ysGY2UKW/cw97hRzHhlbv3Zz3q14YcWMke1JvCSJKOfunHdmIiPWFxl30cBkQ9e9rhz0 Ns/W0CTSkYkwaDXEkgZc83YJksGCqgavGiWdiGIv+LXxJtzNIjoDeHkQ9iFs6MMi16lFgIkT Mwcq94MFZ623ATEPN/qefQe0Rt3olyhdzDnRLxZPQiGmzAdr4SjwY9riMNGPj9HRz06KT++o rPZvAgvyLmKDtImOzECWY8VKn89WMu7gjNU+XNaA1zVmqpawVqH/2W6viPUHSXxZNplZe6Ja FVrEt7+ujxt9rjtz0bQ9oTCKmr6M9V7p9KJ7vkVwvTPQ7BVVecv6R+EwtsEHnDyATedQIK5K sqiNNJyYY6rViniGhm2jzZ/JyvoFO6kNbPAwQThRIIP9ZKewChmLsilUDcXBxZ3oegHoqN6f wwKJZQhM1bksAE3Nqr3Jwn9sJ3mW2G2NT5fVOVS182/d+UR1y0of/O3w3smT4gnwq+w60FFS JwRjx7YzOqufMEHC3m1QyQBPV6X43Fl32F6U4R6iv8y2hbJrUURP3iQeeplZXYF99AwCFWOI GlnX2o1Q1jPxYHH4wOqw/UT534ExYcSiLUZ9iOm+MSDM1fOEOSxpJ7YsjQtd40jqqx1asn4J 9ee8YjZhnrZRYXRtQuMVGi7EeBbk55eOnE9IrEAlGc7NMgBoYcE51A2U5J0HIZ0UPw1/7DyP AhdWDYVyT4FWoiA2j0bn+r63KHVwx6UeZJkKxcEtZRenvMXVDNwaS4F4qr/R8PRjWDOGQ1pa E8DqB9B4g4NjNo6Zuf+/I/BV4NB0RZTs6sySizPB4Vl/Fv9S3iLjB7/UvrrwInLlUpCifnr1 NccQht2D0NQkv1XmkUfI7ZyM6AMv4TOv2zAZQbgsWnq0ufjOEhJxJieaQjjFISc/zmZMGVU6 TgOSIRI0n2aCZkCj18zdvMwvFsVaInuP0/643ZML2tBFb6lU8um3BAg8WZAQD2lQYMp4wROq FXTSSFoaJCtqYz4NtNVWGACofV1Sn9cgBwrKym92IZRIMFL4ycRUX5IuzrP5bOP IronPort-Data: A9a23:dWS42qqc32fkvmCijU7c5dIscx1eBmKeYxIvgKrLsJaIsI4StFCzt garIBmFa/zZMDT0L41xatjlph9SsZKGmII3S1M/rng2RikS9uPIVI+TRqvSF3PLf5ebFCqLz O1HN4KedJhsJpP4jk3wWlQ0hSAkjclkfpKlVKicfHoZqTZMEE/Nszo68wICqtMu0IPR7z+l4 4uo+ZWOYQT9glaYD0pNg069gEM31BjNkGhA1rAOTagjUIj2yhH5pLpGTU2AByOQrrt8RoZWd M6fpF2NxV41yj92Yj+TfhkXRWVRKlLaFVDmZnO7wMFOiDAazsA5+v5T2Pbx9S67hh3R9+2dx umhurSBVgR5Ap/2tt06Uj4GDjBdLLxPoLL+dC3XXcy7lyUqclPp06woFEYyLJEV8eZxAHhT+ LofMj9lghKr3rjnhuvjFq833oJ4cKEHP6tH0p1k5QrjNq5zWMnDG/D43IpA2zMhms1FHfDff tcULz11Y0HJZxRJfEwcCJc/gPuAjH7idTZVsxSQ+bpx5HLcpOB0+OK2bYeLK4PaLSlTtl6c/ 0ObwlnWOAg9HdCuxTuly3v8mPCayEsXX6pLSOzpqa416LGJ/UQYARgSEF+6uuWRkV+7Q9sZK koO+yNoo7JayaCwZtztBlugp3qVohMXW9xRCvA3rgaXxcI4/jp1GEA1UT0RVO4cmvYRRBt0y 06qjsLgXTFW5ej9pW2myp+Yqja7OC4wJGAEZDMZQQZt3zUFiNpi5v4oZoo/eJNZnuEZChmsk 2DT93BWa6E715VVi/3TEUXv2WrEm3TfcuIizivtNo5Pxid0LK2/aoms6F6ex/dLIZqDQzFtV 1BVx5LBtIji4bkmciiABekAWZ+z7vCOPVXhbbNHGol4sSyq/2+/cItQ5jBnOUovNdwLEdMIX KMxkV0OjHOwFCL0BUOSX25XI59wpUQHPY60Ps04lvIUPvBMmPavpUmCn3K40WH3i1QLmqoiI 5qdesvEJS9EV/8/lGXqHL9Bj+9DKsUCKYX7G8uTI/OPj+f2WZJpYe1VbTNik8hlvPPa+lqPm zqhH5rQkk43vBLCjtn/qNJCfA9achDX9LjspspeauOZSjeK60l/Y8I9NYgJItQ/94wMz7+g1 ijkCidwlQSj7VWad1TiQi44MtvHA80gxU/XyARxZz5ELVB5P9b2hEreHrNqFYQaGBtLl6EsE 6dVKp7aUpyiiF3volwgUHU0l6Q6HDzDuO5EF3DNjOEXc8EySgrX1MXjewezpiACAjDu6Jk0p KCm3Q7AB59fV0JlFsmPMKCjyFa4vH48nuNuXhqTc4ILIR62qYU6eTbsivIXIt0XLUmRzDWt0 QvLUwwTovPAotNo/dSQ3fKEoo6lHvFQBE1fG2WHv7+6OTODoTi7xotRTOuDfTbcTX75vqK4a rwNnf37NfQGmndMspZ9Qu87nfJkv4O3quYDnAp+HXjNY1C6MZ9aIyGLjZtVq6lA5r5Fog/qC EiBzd9XZOeSM8T/HV9NeQcoY7jR1fwQnTWOv/05LF+gvX1y7OPBSUJWLgWBgyxbLaJoPcUi2 +h44Jwa7Am2ixwLNNeaj3ENpzTcdCRYC6h35IsHBILLixYwzg8Qa5LrChjwvMOFZeJKPxR4O TSTnqfD2+9RyxaQaXY1DnSRj+NRiY5U4UJP3AZEP1ONi8bIjf8x3QRM/HIwVAsMlkdL1Od6O 25KMUxpJPTXr2c43pAbB238SRtcABC5+1DqzwVbnmPuT36uCj7HIlo7NLvf50se6W9dImNW8 bzwJLwJito2kBwdHxfeWHKJb9TmXYU37grGidyqFMSDHoAnbHzimKDGia8gtU78Gc1o7KHYj bACwQqyQfST2e0sT2kTAY6H078dU1aBeHwERutulE/MNXrEdmv0gVBiNGjoEv6g5JX2HYuQE 8tqN95CXBS41T+To3YcH6Fkz3pch+YnvpxaEl/0DTdujoZzZQaFfH4dGuYSSYPrrxhTfR4BF 77s IronPort-HdrOrdr: A9a23:J8l7nKib5TtSiaU/+atiWa8HyHBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,312,1654552800"; d="scan'208,217";a="23556978" X-MGA-submission: =?us-ascii?q?MDFbEvWWc2ff2fCc0EBNyixt0tlVcJ/zQaolng?= =?us-ascii?q?x772bFnAU9wtnuTX8lCOf3DU3wodOCeDJfj+rfqMZoG9P1m8zr9uRD5j?= =?us-ascii?q?8/LkUUDqOjAYluWbzPnZjyKJOlskKzmoAHUOCNgz8MVqrwD3MOfNSlM7?= =?us-ascii?q?mLlIe4usO9yp+pRYbMQREbHw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Sep 2022 10:40:43 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4F12F5605BC; Tue, 13 Sep 2022 10:40:42 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1663058442; bh=oWLA28S2ytnFnQjieulzH2ml8CMEfA/ItUcAof2y4us=; h=From:To:Subject:Date:Message-ID; b=P2w+Uf57TE1LxKsbJjuOsZ9YMWa67U7eBa57VeS1vGbBD+MyNdtQ38MuDyEPadRGf eW4bM2ly8v0LtfmIpejOiFqZNV3qqAFtl73uOdTAknEx6B2CyfW+2XVK6hZAviXol0 /YtmMiM2mxrX6gi69DoB0R6Do00r6Y8sqhYBh8Mg= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 13 Sep 2022 10:40:41 +0200 Message-ID: <87sfkv8y5y.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 13 10:40:42 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.484746, queueID=93CDD5605BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 06 to 13, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Caqti 1.9.0 and Plans for 2.0.0 Outreachy summer =E2=80=9922 closing commemoration session on 23rd Sept MirageOS for B2B SaaS Tuareg and Caml modes for Emacs: what are the differences? Engineer position at Imandra (Austin TX/UK) Acme plumbing rules for OCaml Other OCaml News Old CWN Caqti 1.9.0 and Plans for 2.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Petter A. Urkedal announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 First I would like to announce the 1.9.0 minor release, see the release notes below for details. There is also ongoing work in the [caqti2 branch] targeted for the next major release. If someone have an opinion on directions, we can discuss it here, or in the issue tracker ([meta-issue]), see my brief notes below. I will attend parts of the ICFP 2022 virtually next week so there may be time to discuss over audio. [caqti2 branch] [meta-issue] Release Notes for 1.9.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C New features: =E2=80=A2 Allow unquoted semicolons in query strings in the new API. Ther= e are corner cases where it is needed, as reported in issue #87, and a parser which rejects semicolons are still available for loading schema files statement by statement. =E2=80=A2 Add support for MySQL and MariaDB configuration files, as a sol= ution to issue #86. =E2=80=A2 Add a limit to the number of times a database connection is reu= sed when pooling connections (#94). Thanks to Peter Mondlock for investigating resource usage server side motivating this addition. =E2=80=A2 Provide access to the raw SQLite3 connection handle for the pur= pose of defining custom functions (#56). Fixes: =E2=80=A2 Add missing dune dependency on unix (GPR#85 by David Allsopp). =E2=80=A2 Documentation fixes (GPR#82, GPR#83, GPR#84 by Reynir Bj=C3=B6r= nsson, GPR#88 by Jonathan Duarte, and GPR#92 by Jim Tittsler). Deprecations: =E2=80=A2 `Caqti_type.field' was deprecated in favour of `Caqti_type.Fiel= d.t'. Other: =E2=80=A2 Replace deprecated core_kernel dependency with core. Notes on 2.0.0 Development =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C The main addition is pgx and mirage support. It is already functional, but not very useful for production, since it lacks TLS. The trick here is that PostgreSQL uses STARTTLS, so we can=E2=80=99t use conduit-lwt as-= is. Another thing in progress, but unpublished, is [per-connection configuration]. Up till now, configuration has only been possible through the connection URL or behind-the-scene via C libraries (now also for MariaDB). However, this will no longer be practical for delivering CA certificates to pgx. Two design issues which you may have an opinion about: =E2=80=A2 Driver specific options can be defined in the `caqti' package o= r in `caqti-driver-*' packages. In the former case, the configuration can be manipulated without depending on specific drivers, but the downside is that we will pull in dependencies on `x509', `domain-name', `ipaddr' and possibly `tls' and `sexplib0'. =E2=80=A2 My current sketch provides sexp-serialisation, a choice mainly motivated by the availability of such serialization for client configuration of `tls', but I hope to find a more generic solution which allows easy embedding of Caqti configuration in application configuration independent of which format is used. An example of how an sexp-formatted configuration might look like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (connection =E2=94=82 (pool =E2=94=82 (max-use-count 20) =E2=94=82 (max-idle-size 10)) =E2=94=82 (driver postgresql) =E2=94=82 (endpoints =E2=94=82 (inet pg1.example.org) =E2=94=82 (inet pg2.example.org)) =E2=94=82 (target-session-attrs read-write)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where the `(pool ...)' clause is driver-indepnedent and the `(driver ...)' clause determines which DB-specific options are valid. In the current draft, order does not matter despite this dependency. (I could also mention plans of wrapping modules, but this will be done first as a forward-compatible module in parallel to the current modules preferably at the beginning of a major release cycle. The reason I haven=E2=80=99t written that main `Caqti' module yet, is that I = would like to take the opportunity to tidy up the namespace to make it easier for newcomers to discover the main entry points.) [per-connection configuration] Outreachy summer =E2=80=9922 closing commemoration session on 23rd Sept =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Moazzam Moriani announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I, along with Jay, were the two [Outreachy] interns working with the OCaml :camel: community this summer. I worked on [Multicore Applications] and Jay on [TopoJSON]. Our internship, of course, was only made possible because @sudha and @patricoferris generously chose to volunteer to mentor us=E2=80=93as our respective mentors=E2=80=93throu= ghout the summer. We are grateful to the both of them :heart:. Our three-month long Outreachy internship just ended relatively recently and, personally, I have really enjoyed working on my project and learning OCaml. So much so that Jay and I would like to share our experiences with the rest of the community. :sparkles: To carry forward a tradition established by the [previous Outreachy cohort], we will host a virtual session that will consist of two short presentations from the both of us followed by a Q&A. The session will be on Friday 23rd September 2-3pm CET. It is open to whoever wishes to join. A recording will be shared later online as well. We hope you will join us! :raised_hands: [Outreachy] [Multicore Applications] [TopoJSON] [previous Outreachy cohort] Marcus Rohrmoser asked and Moazzam Moriani replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I suppose you mean CEST i.e. 2022-09-23T14:00:00+02:00/PT1H Yes I do. Thank you for pointing it out. MirageOS for B2B SaaS =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Volodymyr Melnyk asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have an idea to build a SaaS for corporate blogging (like Medium, but for companies) and I want to try MirageOS as a total platform for services. I have no production experience with OCaml (only Golang, JS, Ruby) and have no experience with MirageOS and unikernels (only Docker, Linux, and a little bit k8s), but I=E2=80=99m very interested in = both. Could you please help me to clarify possible issues with such an approach? Also I=E2=80=99m interested about a hosting for MirageOS services. I don= =E2=80=99t like containers and k8s stuff and I prefer dedicated and virtual servers instead of cloud stuff because I have no resources to pay up to 5x more for hosting. Thank you for your help! Calascibetta Romain replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Thank you for your interest in MirageOS. MirageOS is first and foremost a framework for creating an application (such as a blog) for several targets. One of these targets is [Solo5] which allows to create an entire system which includes everything necessary for OCaml (its runtime). Thus, one can deploy a MirageOS application on: =E2=80=A2 KVM (with the target `hvt') =E2=80=A2 [Xen] =E2=80=A2 or produce a simple executable taking advantage of [seccomp] (a= nd thus finely controlling access to the executable). =E2=80=A2 we can also mention the experimental target for [Raspberry Pi 4] The objective of MirageOS is to make the choice of targets transparent to the application. This means that for a given application, deploying for KVM or Xen should not be an upstream choice (which would govern the development of the application) but the last of the choices which can, of course, be left to third party users. This reverses the development logic of an application thanks to abstraction mechanisms (specific to OCaml) (the [functors]) that allow to get rid of any specialisation to a given system (Solo5, Unix, Raspberry Pi, etc.). This is of course the theory and in practice, it works quite well :) . To take the example of the blog, you can see [Hannes=E2=80=99 blog] or [m= ine] which runs on MirageOS (KVM). The latter have a similar architecture: a unikernel managing TLS certificates and redirecting HTTP connections to unikernels on a local network ([tlstunnel] or [contruno]) and a unikernel ([unipi]) that only transmits what appears in a Git repository via the HTTP protocol (http/1.1 and h2). Deployment depends of course on what you have. Regarding KVM, you can follow the tutorials [here] (quite general) and [there]. You can deploy your unikernels on Google Cloud with this (probably a bit old) [tutorial]. Finally, a deployment with seccomp is possible, it is a simple executable. Of course, most of these unikernels are already available for download [here] thanks to the excellent work of [robur.io]. It is ensured that the generated image is reproducible regardless of the context. There is of course a whole series of unikernels made by the community that you can mainly find on GitHub. We can talk about several services like [DNS] or [emails]. I would like to specify that all this is still experimental. We are gradually reaching the stage where our unikernels are used in production domains, but it still requires a lot of work and a lot of skills for such a small team :) . Of course, we are open to everyone=E2= =80=99s participation and we are especially here to help newcomers. [Solo5] [Xen] [seccomp] [Raspberry Pi 4] [functors] [Hannes=E2=80=99 blog] [mine] [tlstunnel] [contruno] [unipi] [here] [there] [tutorial] [here] [robur.io] [DNS] [emails] Tuareg and Caml modes for Emacs: what are the differences? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this thread, Tim McGilchrist announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wrote up a longer form version of my setup at There are still some bits I am not happy with but I have been using it daily. Also @bbatsov wrote his version at Engineer position at Imandra (Austin TX/UK) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [Imandra] is looking for a full time engineer in the UK or in Austin, Texas. The job offers can be found [here].Imandra is an AI startup developing a cloud-native automated reasoning engine for analysis of algorithms and data. Whether you=E2=80=99re writing mission-critical code or need to understand the countless complex decisions that a system may make, use Imandra to ensure the algorithms you create are safe, explainable and fair. OCaml is the main language used at Imandra. [Imandra] [here] Acme plumbing rules for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David A. Arroyo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am sure that the intersection of OCaml users and [Acme] users is small, but I have reason to believe it is a non-zero set :) . For those of you using this spartan editor, here are some plumbing rules that I use that allow me to right-click on error messages returned by the OCaml compilers, and jump to the referenced location in acme: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # example: in file "foo/bar.ml", line 155, characters 30-62 =E2=94=82 type is text =E2=94=82 data matches '.*[Ff]ile "([^"]+)", line ([0-9]+), characters ([= 0-9]+)-([0-9]+).*'$nl'?' =E2=94=82 arg isfile $1 =E2=94=82 data set $file =E2=94=82 attr add addr=3D$2-#0+#$3,$2-#0+#$4 =E2=94=82 plumb to edit =E2=94=82 plumb client $editor =E2=94=82=20 =E2=94=82 # example: File "tests/dune", line 2, characters 7-22: =E2=94=82 type is text =E2=94=82 data matches '.*[Ff]ile "([^"]+)", lines ([0-9]+)-([0-9]+).*'$n= l'?' =E2=94=82 arg isfile $1 =E2=94=82 data set $file =E2=94=82 attr add addr=3D$2,$3 =E2=94=82 plumb to edit =E2=94=82 plumb client $editor =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It could probably be extended to search `~/.opam' so you could plumb errors in files outside of your project, but I do not use opam, so I haven=E2=80=99t needed to do it. Here is a short demo of its use: It=E2=80=99s not in OCaml, but I also wrote and put an `OcamlFmt' script in acme=E2=80=99s $PATH like so: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/bin/sh =E2=94=82 exec /usr/local/bin/acme-autoformat -r '\.mli?$' \ =E2=94=82 -- ocamlformat --name=3D'{{.Basename}}' --enable-outside-detec= ted-project - =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This calls `ocamlformat' whenever I Put an .ml[i] file. This is probably obviated by combining acme-lsp and ocaml-lsp, but these two bits work well enough that I haven=E2=80=99t felt a need to pursue it. [Acme] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Tarides Sponsors Girls Can Code] =E2=80=A2 [Introducing the Jane Street Graduate Research Fellowship] [the ocaml.org blog] [Tarides Sponsors Girls Can Code] [Introducing the Jane Street Graduate Research Fellowship] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I=E2=80=99ll= mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 06 to 13, 2= 022.

    Caqti 1.9.0 and Plans for 2.0.0

    Petter A. Urkedal announced

    First I would like to announce the 1.9.0 minor release, see the release not= es below for details.

    There is also ongoing work in the caqti2 branch targeted for the next major release. If someone have an opinion on directions, we can d= iscuss it here, or in the issue tracker (meta-issue<= /a>), see my brief notes below.

    I will attend parts of the ICFP 2022 virtually next week so there may be ti= me to discuss over audio.

    Release Notes for 1.9.0

    New features:

    • Allow unquoted semicolons in query strings in the new API. There are corner cases where it is needed, as reported in issue #87, and a parser which rejects semicolons are still available for loading schema files statement by statement.
    • Add support for MySQL and MariaDB configuration files, as a solution to issue #86.
    • Add a limit to the number of times a database connection is reused when pooling connections (#94). Thanks to Peter Mondlock for investigating resource usage server side motivating this addition.
    • Provide access to the raw SQLite3 connection handle for the purpose of defining custom functions (#56).

    Fixes:

    • Add missing dune dependency on unix (GPR#85 by David Allsopp).
    • Documentation fixes (GPR#82, GPR#83, GPR#84 by Reynir Bj=C3=B6rnsson, GPR#88 by Jonathan Duarte, and GPR#92 by Jim Tittsler).

    Deprecations:

    • Caqti_type.field was deprecated in favour of Caqti_t= ype.Field.t.

    Other:

    • Replace deprecated core_kernel dependency with core.

    Notes on 2.0.0 Development

    The main addition is pgx and mirage support. It is already functional, but= not very useful for production, since it lacks TLS. The trick here is that PostgreSQL uses STARTTLS, so we can&rsqu= o;t use conduit-lwt as-is.

    Another thing in progress, but unpublished, is per-connection configuration. Up ti= ll now, configuration has only been possible through the connection URL or behind-the-scene via C libraries (no= w also for MariaDB). However, this will no longer be practical for delivering CA certificates to pgx. Two design i= ssues which you may have an opinion about:

    • Driver specific options can be defined in the caqti packag= e or in caqti-driver-* packages. In the former case, the confi= guration can be manipulated without depending on specific drivers, but the = downside is that we will pull in dependencies on x509, d= omain-name, ipaddr and possibly tls and sexplib0.
    • My current sketch provides sexp-serialisation, a choice mainly motivate= d by the availability of such serialization for client configuration of tls, but I hope to find a more generic solution which allows easy= embedding of Caqti configuration in application configuration independent = of which format is used.

    An example of how an sexp-formatted configuration might look like:

    (connection
     (pool
      (max-use-count 20)
      (max-idle-size 10))
     (driver postgresql)
     (endpoints
      (inet pg1.example.org)
      (inet pg2.example.org))
     (target-session-attrs read-write))
    

    where the (pool ...) clause is driver-indepnedent and the (driver ...) clause determines which DB-specific options are valid. In the current draft, order does not matter despite this= dependency.

    (I could also mention plans of wrapping modules, but this will be done firs= t as a forward-compatible module in parallel to the current modules preferably at the beginning of a major rele= ase cycle. The reason I haven’t written that main Caqti module yet, is that I would like to take the o= pportunity to tidy up the namespace to make it easier for newcomers to discover the main entry points.)

    Outreachy summer ’22 closing commemoration session on 23= rd Sept

    Moazzam Moriani announced

    I, along with Jay, were the two Outr= eachy interns working with the OCaml :camel: community this summer. I worked on Multicore Applications and Jay on TopoJSON. Our int= ernship, of course, was only made possible because @sudha and @patricoferris generously chose to volunteer to mentor us–= ;as our respective mentors–throughout the summer. We are grateful to the both of them :heart:.

    Our three-month long Outreachy internship just ended relatively recently an= d, personally, I have really enjoyed working on my project and learning OCaml. So much so that Jay and I would l= ike to share our experiences with the rest of the community. :sparkles:

    To carry forward a tradition established by the previou= s Outreachy cohort, we will host a virtual session that will consist of two short presentations from the both of us fo= llowed by a Q&A. The session will be on Friday 23rd September 2-3pm CET.

    It is open to whoever wishes to join. A recording will be shared later onli= ne as well.

    We hope you will join us! :raised_hands:

    Marcus Rohrmoser asked and Moazzam Moriani replied

    I suppose you mean CEST i.e. 2022-09-23T14:00:00+02:00/PT1H

    Yes I do. Thank you for pointing it out.

    MirageOS for B2B SaaS

    Volodymyr Melnyk asked

    I have an idea to build a SaaS for corporate blogging (like Medium, but for= companies) and I want to try MirageOS as a total platform for services. I have no production experience with OCaml (= only Golang, JS, Ruby) and have no experience with MirageOS and unikernels (only Docker, Linux, and a little b= it k8s), but I’m very interested in both. Could you please help me to clarify possible issues with such an approach?

    Also I’m interested about a hosting for MirageOS services. I don&rsqu= o;t like containers and k8s stuff and I prefer dedicated and virtual servers instead of cloud stuff because I have no reso= urces to pay up to 5x more for hosting.

    Thank you for your help!

    Calascibetta Romain replied

    Thank you for your interest in MirageOS. MirageOS is first and foremost a f= ramework for creating an application (such as a blog) for several targets. One of these targets is Solo5 which allows to create an entire system which includes everything necessary for OCaml (i= ts runtime). Thus, one can deploy a MirageOS application on:

    • KVM (with the target hvt)
    • Xen
    • or produce a simple executable taking advantage of seccomp (a= nd thus finely controlling access to the executable).
    • we can also mention the experimental target for Raspberry Pi 4

    The objective of MirageOS is to make the choice of targets transparent to t= he application. This means that for a given application, deploying for KVM or Xen should not be an upstream choic= e (which would govern the development of the application) but the last of the choices which can, of course, be left = to third party users.

    This reverses the development logic of an application thanks to abstraction= mechanisms (specific to OCaml) (the functors) that allow to get= rid of any specialisation to a given system (Solo5, Unix, Raspberry Pi, etc.).

    This is of course the theory and in practice, it works quite well :) .

    To take the example of the blog, you can see Hannes’ blog or mine which runs on MirageOS (KVM). The latter have a similar architecture: a uni= kernel managing TLS certificates and redirecting HTTP connections to unikernels on a local network (tlstunnel or contruno) and a unike= rnel (unipi) that only transmits what appears in a Git repository via the HTTP protocol (http= /1.1 and h2).

    Deployment depends of course on what you have. Regarding KVM, you can follo= w the tutorials here (quite= general) and there. You = can deploy your unikernels on Google Cloud with this (probably a bit old) tutorial. Finally, a deployment with seccomp is possible, it is a simple executable.

    Of course, most of these unikernels are already available for download here thanks to the excellent work of robur.io. It is ens= ured that the generated image is reproducible regardless of the context.

    There is of course a whole series of unikernels made by the community that = you can mainly find on GitHub. We can talk about several services like DNS or emails.

    I would like to specify that all this is still experimental. We are gradual= ly reaching the stage where our unikernels are used in production domains, but it still requires a lot of w= ork and a lot of skills for such a small team :) . Of course, we are open to everyone’s participation and we a= re especially here to help newcomers.

    Tuareg and Caml modes for Emacs: what are the differences?

    Deep in this thread, Tim McGilchrist announced

    I wrote up a longer form version of my setup at https://lambdafoo.com/po= sts/2022-09-07-ocaml-with-emacs-2022.html There are still some bits I am not happy with but I have been using it dail= y. Also @bbatsov wrote his version at https://batsov.com/artic= les/2022/08/23/setting-up-emacs-for-ocaml-development/

    Engineer position at Imandra (Austin TX/UK)

    Simon Cruanes announced

    Imandra is looking for a full time engi= neer in the UK or in Austin, Texas.

    The job offers can be found here.Imandra is an AI startup developing a cloud-native automated reasoning engine for analysis of algorithms and data= . Whether you’re writing mission-critical code or need to understand the countless complex decisions that a system ma= y make, use Imandra to ensure the algorithms you create are safe, explainable and fair. OCaml is the main lan= guage used at Imandra.

    Acme plumbing rules for OCaml

    David A. Arroyo announced

    I am sure that the intersection of OCaml users and Acme users is small, but I have reason to believe it is a non-zero set :) . For those of you using this spartan ed= itor, here are some plumbing rules that I use that allow me to right-click on error messages returned by the OCaml co= mpilers, and jump to the referenced location in acme:

    # example: in file "foo/bar.ml", line 155, characters 30-62
    type	is	text
    data	matches	'.*[Ff]ile "([^"]+)", line ([0-9]+), characters ([0-9]+)-([0-9=
    ]+).*'$nl'?'
    arg	isfile	$1
    data	set	$file
    attr	add	addr=3D$2-#0+#$3,$2-#0+#$4
    plumb	to	edit
    plumb	client	$editor
    
    # example: File "tests/dune", line 2, characters 7-22:
    type	is	text
    data	matches	'.*[Ff]ile "([^"]+)", lines ([0-9]+)-([0-9]+).*'$nl'?'
    arg	isfile	$1
    data	set	$file
    attr	add	addr=3D$2,$3
    plumb	to	edit
    plumb	client	$editor
    

    It could probably be extended to search ~/.opam so you could p= lumb errors in files outside of your project, but I do not use opam, so I haven’t needed to do it.

    Here is a short demo of its use: h= ttps://youtu.be/Evl-N0oNNd0

    It’s not in OCaml, but I also wrote https://github.com/droyo/acme-autoformat and put an= OcamlFmt script in acme’s $PATH like so:

    #!/bin/sh
    exec /usr/local/bin/acme-autoformat -r '\.mli?$' \
    	-- ocamlformat --name=3D'{{.Basename}}' --enable-outside-detected-project -
    

    This calls ocamlformat whenever I Put an .ml[i] file. This is = probably obviated by combining acme-lsp and ocaml-lsp, but these two bits work well enough that I haven’t felt a = need to pursue it.

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I’ll mail it to you, or go take= a look at the archive or= the RSS feed of the a= rchives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id A96C4E0157 for ; Tue, 20 Sep 2022 16:01:36 +0200 (CEST) Authentication-Results: mail3-smtp-sop.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail3-smtp-sop.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail3-smtp-sop.national.inria.fr; envelope-from="SRS0=8mXz=ZX=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 6329c7bf_oXrbfVw0QxnhqjrAgfE8HKmXaXElvEikvF5SvG99gXAgRsh bjQf0Ey+9lh+nSOTwjhha2ln8Y/RrB2Vpi7mppw== X-IPAS-Result: =?us-ascii?q?A0CDAwAExyljmCIeaIFaAYJXgSFbKBkBZ1YWGAcIRQKET?= =?us-ascii?q?Ih+iBaBFoIVhjSHCo1PA08QAQMBDSwBDgQBAgQBAYISgi5FAhaEVAIeBgEFM?= =?us-ascii?q?gYOAQIEAQEBAQMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEBAQEBFAkZB?= =?us-ascii?q?RAOBSKFaA2CNQwMAwODdAMBCg4BCAoTAQEsBQcYFA8DFAEGAwIEDQEXAR4DF?= =?us-ascii?q?AESFAYBggpYAYMgAwULj2abHXqBMoEBgggBAQaBQAEDAgECCQICAw8uAYN2g?= =?us-ascii?q?VwJJIECGIcEblUBgzaEJgInEIFVRIEVgnMHboJLDAsBAQEBAYE7AQFNCYMgG?= =?us-ascii?q?IJOiXOPCQc3A0QdQQMLdgMVAxQDBSQHAxkPIw0NBB0MAwMFJQMCAhsHAgIDA?= =?us-ascii?q?gYTBQICFzY4CAQIBCskDwUCBy8FBC8CHgQFBhEIAhYCBgQEBAQVAhAIAggmF?= =?us-ascii?q?wcTMxkBBVkQCSEWBigNBQYTAyBJJgVFDygyaysdGwqBDCoJHxUDBAQDAgYTA?= =?us-ascii?q?wMiAhAqMRQEKRMSLQcrcwkCAyJsAwMEKCwDCSEfBygmPAdYEigFAwMQIj0GA?= =?us-ascii?q?wkDAiRbgQQsKAUDDRkmCAU5HgQIPAIFBpcJgU+BRQ4LFBkGARYRAxMkLgcUC?= =?us-ascii?q?AYBAQ0VJBItCwEHAwIDEwEHFgkOBRcbEwgDCwIeDwOERI1HHwSJNIR4imyUT?= =?us-ascii?q?hloNAeDWYFBBgyIQYEjgkuKOIgrg3aBUIUohViGZZFZIZZpIIIqhwOBGAmCS?= =?us-ascii?q?4g/jBIeCBiFHYFOKSRIYgEBGgIMBzMaMEMNBhMBggwBATIJCQE7HA9XjVUWg?= =?us-ascii?q?ygogT6BJoF1O4UaMj80AgEBBwcpAgYBCgEBAwmFYwEBBRMLAYQXWgEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:EWqjRK0A1STlwxKgX/NylQqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="5.93,330,1654552800"; d="scan'208,217";a="24205267" X-MGA-submission: =?us-ascii?q?MDFnK0vSsj9bLnosLZSuzWTPTSM0IdCAD+ol50?= =?us-ascii?q?rLdaUDA4+F9qrNlnFqGHJsqL56bybeT0j7FnOgsuoC62j0v6xu+5f8ci?= =?us-ascii?q?GJpMrdxq8NdqROkOb4UeDcEPaH+VEqFR5wG1ZdqjHUTT8/qJHycpvFwZ?= =?us-ascii?q?HdG7gImn8nb11/s7ZJyc+zHw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Sep 2022 16:01:35 +0200 Received: from set (set.irisa.fr [131.254.10.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0150E5646C9; Tue, 20 Sep 2022 16:01:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1663682494; bh=Kb0E7qOnRHli0EfIKTdXvbPxgjZQftXAw3lG1ms/nZ8=; h=From:To:Subject:Date:Message-ID; b=JwvdDLkQ6wTvsIXTJmXfr2BacfzUH9Uolov2FLwg+9binpoPATS8GdukW/HKDDtUO Pf7U5Ly3v+YfHWTdLDusLlgkg7xiGI5UWZaHCrNbF15i+5VrdUfKwGIq0q1tcqwvhE 2QkWCzLC0o6cqd139CXH4/JpRWe6/2HFfCVzv0+I= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 20 Sep 2022 16:01:25 +0200 Message-ID: <875yhirvpm.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 20 16:01:34 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.493512, queueID=483675646D0 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgU2VwdGVtYmVyIDEzIHRvDQoyMCwgMjAyMi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTYW5k bWFyayBOaWdodGx5IFNlcnZpY2Ugbm93IHJlcG9ydHMgSW5zdHJ1Y3Rpb25zIFJldGlyZWQgYWxv bmcgd2l0aCBUaW1lDQpPdXRyZWFjaHkgRGVjZW1iZXIgMjAyMg0KVW5pY29kZSAxNS4wLjAgdXBk YXRlIGZvciBVdWNkLCBVdWNwLCBVdW5mIGFuZCBVdXNlZw0KT1VQUyBtZWV0dXAgc2VwdGVtYmVy IDIwMjIgKGZyZW5jaCBvbmx5KQ0Kc3RyeW1vbmFzIHYyOiBsaWJyYXJ5IGZvciBoaWdoZXN0LXBl cmZvcm1hbmNlIHN0cmVhbSBwcm9jZXNzaW5nDQpPQ2FtbCBDb21tdW5pdHkgQ29kZSBvZiBDb25k dWN0DQpVc2UgT0NhbWwgdG8gaW50ZXJhY3Qgd2l0aCBOZW92aW0NCldoYXQgd2lsbCBiZSByZXF1 aXJlZCB0byB0cmFuc3BpbGUgT0NhbWwgdG8gTHVhPw0KT0JhemwgVG9vbHN1aXRlIC0gdG9vbHMg Zm9yIGJ1aWxkaW5nIE9DYW1sIHdpdGggQmF6ZWwNCk9sZCBDV04NCg0KDQpTYW5kbWFyayBOaWdo dGx5IFNlcnZpY2Ugbm93IHJlcG9ydHMgSW5zdHJ1Y3Rpb25zIFJldGlyZWQgYWxvbmcgd2l0aCBU aW1lDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NhbmRtYXJrLW5pZ2h0 bHktc2VydmljZS1ub3ctcmVwb3J0cy1pbnN0cnVjdGlvbnMtcmV0aXJlZC1hbG9uZy13aXRoLXRp bWUvMTA0NzUvMT4NCg0KDQpTaGFrdGhpIEthbm5hbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIFNhbmRtYXJrIE5pZ2h0bHkgaXMgYSBzZXJ2aWNlIGZvciB0aGUgT0NhbWwgY29tcGls ZXIgZGV2ZWxvcGVycyB0aGF0DQogIGhlbHBzIGJlbmNobWFyayB0aGUgZGV2ZWxvcG1lbnQgYnJh bmNoZXMgb2YgdGhlIGNvbXBpbGVyIG9uIHRoZSBsYXJnZQ0KICBzZXQgb2YgU2FuZG1hcmsgYmVu Y2htYXJrcyBvbiB0dW5lZCBtYWNoaW5lcyBhbmQgcmVwb3J0cyB0aGUgcmVzdWx0cw0KICBpbiBh biBpbnRlcmFjdGl2ZSBVSS4gQ3VycmVudGx5LCBTYW5kbWFyayBuaWdodGx5IHJlcG9ydGVkIG1h bnkNCiAgbWV0cmljcyBpbmNsdWRpbmcgcnVubmluZyB0aW1lLiBCdXQgcnVubmluZyB0aW1lIGlz IGEgbm90b3Jpb3VzbHkNCiAgbm9pc3kgbWV0cmljIG9uIG1vZGVybiBhcmNoaXRlY3R1cmVzIGR1 ZSB0byB0aGUgZWZmZWN0cyBvZiBtb2Rlcm4gT1MsDQogIGFyY2ggYW5kIG1pY3JvLWFyY2ggb3B0 aW1pc2F0aW9ucy4gVGhlcmUgY291bGQgYmUgc3dpbmdzIG9mIDUwJSBpbg0KICBlaXRoZXIgZGly ZWN0aW9ucyB3aGVuIHRoZSBkaXJlY3RvcnkgaW4gd2hpY2ggdGhlIHByb2dyYW0gaXMgcnVuDQog IGNoYW5nZXMuDQoNCiAgV2hpbGUgd2UgcnVuIFNhbmRtYXJrIGJlbmNobWFya3Mgb24gdHVuZWQg bWFjaGluZXMsIHdlIHN0aWxsIHNlZQ0KICBpbXBhY3Qgb2Ygbm9pc2Ugb24gdGhlIHJlYWwgdGlt ZSBtZWFzdXJlbWVudHMuIFRvIHRoaXMgZW5kLCB3ZQ0KICBpbnRyb2R1Y2UgYSBuZXcgbWV0cmlj IGludG8gU2FuZG1hcmsgbmlnaHRseSB0aGF0IGluIGFkZGl0aW9uIHRvIHJlYWwNCiAgdGltZSwg d291bGQgaGVscCBpbnRlcnByZXQgdGhlIHJlc3VsdHMgYWNjb3VudGluZyBmb3IgdGhlIG5vaXNl LiBXZQ0KICBub3cgcmVwb3J0IOKAnGluc3RydWN0aW9ucyByZXRpcmVk4oCdIGZvciBTYW5kbWFy ayBydW5zLiBJbnN0cnVjdGlvbnMNCiAgcmV0aXJlZCByZXBvcnQgdGhlIG51bWJlciBvZiBpbnN0 cnVjdGlvbnMgZXhlY3V0ZWQgYnkgdGhlIHByb2dyYW0NCiAgZHVyaW5nIGl0cyBydW4gYW5kIGhl bmNlIGlzIHNoaWVsZGVkIGZyb20gdGhlIG5vaXNlIHRoYXQgYWZmZWN0cyByZWFsDQogIHRpbWUg bWVhc3VyZW1lbnRzLiBPZiBjb3Vyc2UsIHRoZSBzYW1lIG51bWJlciBvZiBpbnN0cnVjdGlvbnMg bWF5IGJlDQogIGRpc2NoYXJnZWQgYXQgZGlmZmVyZW50IHJhdGVzIGJ5IHRoZSBwcm9jZXNzb3Ig ZHVlIHRvDQogIGluc3RydWN0aW9uLWxldmVsIHBhcmFsbGVsaXNtIGFuZCBoZW5jZSwgdGhlIGlu c3RydWN0aW9ucyBkaXNjaGFyZ2VkDQogIG1ldHJpYyBzaG91bGQgYmUgdXNlZCBpbiBjb25qdW5j dGlvbiB3aXRoIHJlYWwgdGltZSBtZWFzdXJlbWVudHMuIEZvcg0KICBleGFtcGxlLCBpZiBhIG5l dyBjb21waWxlciBmZWF0dXJlIGFkZHMgMiBpbnN0cnVjdGlvbnMgdG8gdGhlIHByb2xvZw0KICBv ZiB0aGUgZnVuY3Rpb24sIHRoZW4gdGhlIGluc3RydWN0aW9ucyByZXRpcmVkIG1ldHJpYyBzaG91 bGQgaW5mb3JtDQogIHlvdSBob3cgbWFueSBuZXcgaW5zdHJ1Y3Rpb25zIGFyZSBhY3R1YWxseSBl eGVjdXRlZCBvbiB0b3Agb2YgdGhlDQogIGJhc2VsaW5lLg0KDQogIFRoZSBpbnN0cnVjdGlvbnMg cmV0aXJlZCBtZXRyaWMgaXMgY29sbGVjdGVkIGZyb20gYHBlcmYnIGNvbW1hbmQuIFdlDQogIGFs c28gaGF2ZSBvdGhlciB1c2VmdWwgbWV0cmljcyBmcm9tIHBlcmYgc3VjaCBhcyBwYWdlIGZhdWx0 cywNCiAgYnJhbmNoZXMsIGJyYW5jaCBtaXNzZXMsIGNhY2hlIG1pc3NlcyBhdCB2YXJpb3VzIGxl dmVscyBvZiB0aGUNCiAgaGllcmFyY2h5LCBldGMuIFdlIHdpbGwgYWRkIGdyYXBocyB0byByZXBv cnQgdGhlc2UgZ29pbmcgZm9yd2FyZC4NCiAgRW5qb3kgdGhlIG5ldyBmZWF0dXJlLCBhbmQgYXMg ZXZlciwgcmVwb3J0IGlzc3VlcyBhbmQgYnVncyB0bw0KICBbU2FuZG1hcmsgSXNzdWVzXS4NCg0K ICBUaGUgd2ViIHNlcnZpY2UgaXMgYXZhaWxhYmxlIGF0IDxodHRwczovL3NhbmRtYXJrLnRhcmlk ZXMuY29tPiBhbmQgeW91DQogIGNhbiBzZWxlY3QgdGhlIGBQZXJmc3RhdCBPdXRwdXQnIHJhZGlv IGJ1dHRvbiBvbiB0aGUgbGVmdCBwYW5lbCBhcw0KICBzaG93biBiZWxvdy4NCg0KICA8aHR0cHM6 Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vc3RhbmRhcmQxMS91cGxvYWRzL29jYW1sL29yaWdp bmFsLzJYLzUvNWY5ZDNkOGQ4N2JhNjgyMWU4ZjQxZjAyN2NlN2E2YjAwNzRlYzk1YS5wbmc+DQoN CiAgQWZ0ZXIgc2VsZWN0aW5nIHRoZSB2YXJpYW50cyBhbmQgYSBiYXNlbGluZSBmb3IgY29tcGFy aXNvbiwgeW91IGNhbg0KICB2aWV3IHRoZSBub3JtYWxpc2VkIGBpbnN0cnVjdGlvbnMgcGVyIGN5 Y2xlJyBjaGFuZ2UgYXMgaWxsdXN0cmF0ZWQNCiAgYmVsb3c6DQoNCiAgPGh0dHBzOi8vZ2xvYmFs LmRpc2NvdXJzZS1jZG4uY29tL3N0YW5kYXJkMTEvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC8x LzFiYWY2NzNiMTI0NmViMzUwNWY4NjAzYTI2MGVlNGYyMmYzMmZiODUucG5nPg0KDQogIFlvdSBj YW4gYWxzbyByZXF1ZXN0IGZvciB5b3VyIGRldmVsb3BtZW50IGJyYW5jaGVzIHRvIGJlIGFkZGVk IHRvIHRoZQ0KICBTYW5kbWFyayBOaWdodGx5IFNlcnZpY2UgYXQgdGhlIFtzYW5kbWFyay1uaWdo dGx5LWNvbmZpZ10gcmVwb3NpdG9yeQ0KICBmb3IgdGhlIG5pZ2h0bHkgcnVucy4NCg0KDQpbU2Fu ZG1hcmsgSXNzdWVzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWJlbmNoL3NhbmRtYXJrL2lz c3Vlcz4NCg0KW3NhbmRtYXJrLW5pZ2h0bHktY29uZmlnXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1iZW5jaC9zYW5kbWFyay1uaWdodGx5LWNvbmZpZz4NCg0KUmVmZXJlbmNlcw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgMS4gUnVuIHBlcmZzdGF0IHdpdGggU2FuZG1h cmsgbmlnaHRseSBzZXJ2aWNlLiBbU2FuZG1hcmsgUFIgIzM5NF0NCiAgMi4gQWRkIHdlYnBhZ2Ug d2l0aCBwZXJmc3RhdCBvdXRwdXQgZnJvbSBTYW5kbWFyay4gW1NhbmRtYXJrLW5pZ2h0bHkNCiAg ICAgUFIgIzgxXQ0KICAzLiBwZXJmc3RhdC5pcHluYi4gW1NhbmRtYXJrIHBlcmZzdGF0IEp1cHl0 ZXIgbm90ZWJvb2tdDQoNCg0KW1NhbmRtYXJrIFBSICMzOTRdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtYmVuY2gvc2FuZG1hcmsvcHVsbC8zOTQ+DQoNCltTYW5kbWFyay1uaWdodGx5IFBSICM4 MV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmstbmlnaHRseS9wdWxs LzgxPg0KDQpbU2FuZG1hcmsgcGVyZnN0YXQgSnVweXRlciBub3RlYm9va10NCjxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtYmVuY2gvc2FuZG1hcmsvYmxvYi9tYWluL25vdGVib29rcy9wZXJmc3Rh dC9wZXJmc3RhdC5pcHluYj4NCg0KDQpPdXRyZWFjaHkgRGVjZW1iZXIgMjAyMg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFj aHktZGVjZW1iZXItMjAyMi8xMDMzNi8xOD4NCg0KDQpQYXRyaWNrIEZlcnJpcyBzYWlkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBKdXN0IGEgcmVtaW5kZXIgdGhlIGRlYWRsaW5lIGZvciBtZW50b3Igc2lnbnVwIGlzIGluIDkg ZGF5cywgdGhlIHNhbWUNCiAgZGF5IGFzDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv b3V0cmVhY2h5LXN1bW1lci0yMi1jbG9zaW5nLWNvbW1lbW9yYXRpb24tc2Vzc2lvbi1vbi0yM3Jk LXNlcHQvMTA0NTA+DQogIDpjYW1lbDoNCg0KDQpVbmljb2RlIDE1LjAuMCB1cGRhdGUgZm9yIFV1 Y2QsIFV1Y3AsIFV1bmYgYW5kIFV1c2VnDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi11bmljb2RlLTE1LTAtMC11cGRhdGUtZm9yLXV1Y2QtdXVjcC11dW5mLWFuZC11dXNlZy8x MDQ4NS8xPg0KDQoNCkRhbmllbCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg VW5pY29kZSAxNS4wLjAgd2FzIHJlbGVhc2VkIG9uIHRoZSAxM3RoIG9mIHNlcHRlbWJlci4gSXQg YWRkcyA0NDg5IG5ldw0KICBjaGFyYWN0ZXJzIHRvIHRoZSBzdGFuZGFyZC4NCg0KICBHaXZlbiB0 aGUgaW5jcmVhc2luZyBjb250cmlidXRpb25zIGZyb20gdGhlIFNvdXRoIEFzaWFuIHN1YmNvbnRp bmVudA0KICB0byBPQ2FtbCB3ZSBhcmUgZ2xhZCB0aGlzIGluY2x1ZGVzIHN1cHBvcnQgZm9yIHRo ZSA0MiAoc2ljKSBjaGFyYWN0ZXJzDQogIG9mIHRoZSBbTmFnIE11bmRhcmkgc2NyaXB0XS4gRm9y IGluZm9ybWF0aW9uIGFib3V0IHRoZSBvdGhlcg0KICBhZGRpdGlvbnMsIHNlZSB0aGUgW2Fubm91 bmNlbWVudCBwYWdlXS4NCg0KICBBY2NvcmRpbmdseSB0aGUgbGlicmFyaWVzIG1lbnRpb25lZCBh dCB0aGUgZW5kIG9mIHRoaXMgbWVzc2FnZSBoYWQgdG8NCiAgYmUgdXBkYXRlZC4gQ29uc3VsdCB0 aGUgaW5kaXZpZHVhbCByZWxlYXNlIG5vdGVzIGZvciBkZXRhaWxzLiBCb3RoDQogIFV1Y2QgYW5k IFV1Y3AgYXJlIGluY29tcGF0aWJsZSByZWxlYXNlcyBzaW5jZXMgbmV3IHNjcmlwdCBhbmQgYmxv Y2sNCiAgZW51bWVyYW50cyBoYWQgdG8gYmUgYWRkZWQuDQoNCiAgTm90ZSB0aGF0IHN0YXJ0aW5n IGZyb20gVW5pY29kZSAxNi4wLjAg4oCTIHRoYXQgaXMgaW4gYSB5ZWFyIOKAkyB0aGVzZQ0KICBs aWJyYXJpZXMgd2lsbCBiZSBjaGFuZ2VkIHRvIHVzZSB0aGUgVVRGIGRlY29kZXJzIG9mIHRoZSBz dGFuZGFyZA0KICBsaWJyYXJ5IHJhdGhlciB0aGFuIHJlbHkgb24gVXV0Zi4gVGhleSB3aWxsIHRo dXMgb25seSBiZSBhdmFpbGFibGUgZm9yDQogIE9DYW1sID49IDQuMTQuDQoNCiAgVGhlIE9DYW1s IHRpcHMgb2YgdGhlIFttaW5pbWFsIFVuaWNvZGUgaW50cm9kdWN0aW9uXSwgd2hpY2ggeW91IHNo b3VsZA0KICByZWFkIGlmIFVuaWNvZGUgc3RpbGwgcHV6emxlcyB5b3UsIGhhdmUgYmVlbiB1cGRh dGVkIHRvIG1lbnRpb24gdGhlDQogIG5ldyBzdGFuZGFyZCBsaWJyYXJ5IFVURiBkZWNvZGVycy4N Cg0KICBBbHNvLCB0aGUgYHVjaGFyaW5mbycgdG9vbCBkaXN0cmlidXRlZCB3aXRoIGB1dWNwJ1te MV0gY2FuIG5vdyBhbHNvDQogIGxvb2t1cCBjaGFyYWN0ZXJzIGJ5IG1hdGNoaW5nIHN1YnN0cmlu Z3MgaW4gdGhlaXIgVW5pY29kZSBuYW1lIG9yIG5hbWUNCiAgYWxpYXNlcy4NCg0KICBCZXN0LA0K DQogIERhbmllbA0KDQogIEEgYmlnIHRoYW5rcyBmb3IgZnVuZGluZyBmcm9tIHRoZSBbT0NhbWwg U29mdHdhcmUgRm91bmRhdGlvbl0gYW5kIGZyb20NCiAgbXkgW2ZhaXRoZnVsIGRvbmF0b3JzXS4N Cg0KDQogIOKAoiBVdWNkIDE1LjAuMCBVbmljb2RlIGNoYXJhY3RlciBkYXRhYmFzZSBkZWNvZGVy IGZvciBPQ2FtbC4NCiAgICA8aHR0cDovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS91dWNkPg0KICDi gKIgVXVjcCAxNS4wLjAgVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyBmb3IgT0NhbWwuDQog ICAgPGh0dHA6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvdXVjcD4NCiAg4oCiIFV1bmYgMTUuMC4w IFVuaWNvZGUgdGV4dCBub3JtYWxpemF0aW9uIGZvciBPQ2FtbC4NCiAgICA8aHR0cDovL2VycmF0 aXF1ZS5jaC9zb2Z0d2FyZS91dW5mPg0KICDigKIgVXVzZWcgMTUuMC4wIFVuaWNvZGUgdGV4dCBz ZWdtZW50YXRpb24gZm9yIE9DYW1sLg0KICAgIDxodHRwOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJl L3V1c2VnPg0KDQogIFteMV06IEl04oCZcyBhIGRlcG9wdCB5b3XigJlsbCBuZWVkIGBvcGFtIGlu c3RhbGwgY21kbGluZXIgdXV0ZiB1dW5mIHV1Y3AnDQogIHRvIGluc3RhbGwgaXQuDQoNCg0KW05h ZyBNdW5kYXJpIHNjcmlwdF0NCjxodHRwczovL3VuaWNvZGUub3JnL2NoYXJ0cy9QREYvVW5pY29k ZS0xNS4wL1UxNTAtMUU0RDAucGRmPg0KDQpbYW5ub3VuY2VtZW50IHBhZ2VdDQo8aHR0cHM6Ly9i bG9nLnVuaWNvZGUub3JnLzIwMjIvMDkvYW5ub3VuY2luZy11bmljb2RlLXN0YW5kYXJkLXZlcnNp b24tMTUwLmh0bWw+DQoNClttaW5pbWFsIFVuaWNvZGUgaW50cm9kdWN0aW9uXQ0KPGh0dHBzOi8v ZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3V1Y3AvZG9jL3VuaWNvZGUuaHRtbD4NCg0KW09DYW1sIFNv ZnR3YXJlIEZvdW5kYXRpb25dIDxodHRwOi8vb2NhbWwtc2Yub3JnLz4NCg0KW2ZhaXRoZnVsIGRv bmF0b3JzXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpPg0KDQoNCk9VUFMg bWVldHVwIHNlcHRlbWJlciAyMDIyIChmcmVuY2ggb25seSkNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3Vwcy1tZWV0dXAtc2VwdGVtYmVyLTIw MjItZnJlbmNoLW9ubHkvMTA0OTIvMT4NCg0KDQp6YXBhc2hjYW5vbiBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogICh0aGlzIGlzIGluIGZyZW5jaCBvbmx5IGFzIHRoZSB0YWxrcyB3aWxsIGJlIGluIGZy ZW5jaCBpdOKAmXMgcHJvYmFibHkNCiAgbm90IHJlbGV2YW50IGZvciBlbmdsaXNoIHNwZWFrZXJz KQ0KDQogIExlIHByb2NoYWluIE9VUFMgYXVyYSBsaWV1IGxlICpqZXVkaSAyOSBzZXB0ZW1icmUq IDIwMjIuIExlDQogIHJlbmRlei12b3VzIGVzdCBmaXjDqSDDoCAqMTloKiBhdSAqNCBwbGFjZSBK dXNzaWV1IChzYWxsZSDDoCBwcsOpY2lzZXIpKiwNCiAgNzUwMDUgUGFyaXMuDQoNCiAgKltM4oCZ aW5zY3JpcHRpb24gZXN0IG9ibGlnYXRvaXJlXSogcG91ciBwb3V2b2lyIGFjY8OpZGVyIGF1IG1l ZXR1cCAhDQoNCiAgTGVzIGV4cG9zw6lzIHNlcm9udCDDqWdhbGVtZW50IHJldHJhbnNtaXMgZW4g bGlnbmUgc3VyIGxlIFtnYWzDqG5lIGR1DQogIE9VUFNdLg0KDQogIFRvdXRlcyBsZXMgaW5mb3Jt YXRpb25zIHNvbnQgZGlzcG9uaWJsZXMgc3VyIGxlIFtzaXRlIGR1IE9VUFNdLg0KDQogICpQcm9n cmFtbWUgOioNCg0KICAqQ09CT0wgMTAxIOKAkyDDiW1pbGllbiBMZW1haXJlKg0KDQogIENPQk9M IGVzdCB1biBsYW5nYWdlIHRyw6hzIGFuY2llbiBldCBlc3QgYXNzZXogw6lsb2lnbsOpIGRlIGNl dXggcXVlIG5vdXMNCiAgbWFuaXB1bG9ucyB0b3VzIGxlcyBqb3Vycy4gTWFsZ3LDqSBjZWxhIGls IHJlc3RlIGzigJl1biBkZXMgcGx1cyB1dGlsaXPDqXMNCiAgZGFucyBsZSBtb25kZS4NCg0KICBE dXJhbnQgY2V0dGUgcHLDqXNlbnRhdGlvbiBqZSB2YWlzIGRvbmMgdm91cyBpbnRyb2R1aXJlIGF1 IGxhbmdhZ2UsDQogIHZvaXIgY29tbWVudCBzb250IMOpY3JpdCBsZXMgcHJvZ3JhbW1lcywgY29t bWVudCBsZXMgdmFyaWFibGVzDQogIHNvbnQtZWxsZXMgZMOpY2xhcsOpZXMgZXQgY29tbWVudCBs ZXMgbWFuaXB1bGVyLiBKZSB2YWlzIGF1c3NpIHZvdXMNCiAgcHLDqXNlbnRlciBxdWVscXVlcyBm ZWF0dXJlcyDigJxpbnTDqXJlc3NhbnRlc+KAnSBkdSBsYW5nYWdlLCBkb250IGNlcnRhaW5lcw0K ICBzb250IGluYXR0ZW5kdWVzLg0KDQogICpPQ2FtbCBNdWx0aWNvcmUg4oCTIEZsb3JpYW4gQW5n ZWxldHRpKg0KDQogICpPcGFtLWJpbjogT3BhbSBldCBwYXF1ZXRzIGJpbmFpcmVzIOKAkyBGYWJy aWNlIExlIEZlc3NhbnQqDQoNCiAgTOKAmXV0aWxpc2F0aW9uIGTigJl1biBnZXN0aW9ubmFpcmUg ZGUgcGFxdWV0cyBzb3VyY2VzIGNvbW1lIE9wYW0gbuKAmWVzdA0KICBwYXMgdG91am91cnMgb3B0 aW1hbGUgZW4gdGVtcHMsIGNhciBs4oCZb3V0aWwgcGFzc2UgYmVhdWNvdXAgZGUgdGVtcHMgw6AN CiAgcmVjb21waWxlciBkZXMgcGFxdWV0cywgZMOoasOgIGNvbXBpbMOpcyBkYW5zIGxlIHBhc3PD qSBvdSBwYXIgZOKAmWF1dHJlcw0KICB1dGlsaXNhdGV1cnMuIExlIHBsdWdpbiBPcGFtLWJpbiBy w6lwb25kIMOgIGNlIHByb2Jsw6htZSBlbiBwZXJtZXR0YW50IGRlDQogIGNyw6llciDDoCBsYSB2 b2zDqWUgZGVzIHBhcXVldHMgYmluYWlyZXMsIHF1aSBzZXJvbnQgcsOpdXRpbGlzw6lzIMOgDQog IGzigJlhdmVuaXIgZXQgcGV1dmVudCDDqnRyZSBwYXJ0YWfDqXMgYXZlYyBk4oCZYXV0cmVzIHV0 aWxpc2F0ZXVycy4gTOKAmWV4cG9zw6kNCiAgbW9udHJlIHNvbiB1dGlsaXNhdGlvbiBldCBjb21t ZW50IGlsIGZvbmN0aW9ubmUuDQoNCiAgTGVzIHByw6lzZW50YXRpb25zIHNlcm9udCBzdWl2aWVz IHBhciBkZXMgZGlzY3Vzc2lvbnMgbGlicmVzLiBMZXMNCiAgcGl6emFzIHNlcm9udCBvZmZlcnRl cyBwYXIgbGEgZm9uZGF0aW9uIE9DYW1sICEgOnBpenphOg0KDQoNCltM4oCZaW5zY3JpcHRpb24g ZXN0IG9ibGlnYXRvaXJlXQ0KPGh0dHBzOi8vd3d3Lm1lZXR1cC5jb20vZnItRlIvb2NhbWwtcGFy aXMvZXZlbnRzLzI4ODUyMDEwOC8+DQoNCltnYWzDqG5lIGR1IE9VUFNdIDxodHRwczovL2dhbGVu ZS5pcmlsbC5vcmcvZ3JvdXAvb3Vwcy8+DQoNCltzaXRlIGR1IE9VUFNdIDxodHRwczovL291cHMu ZnJhbWEuaW8vPg0KDQoNCnN0cnltb25hcyB2MjogbGlicmFyeSBmb3IgaGlnaGVzdC1wZXJmb3Jt YW5jZSBzdHJlYW0gcHJvY2Vzc2luZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDIyLTA5L21z ZzAwMDA0Lmh0bWw+DQoNCg0KT2xlZyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFzIGhhcyBqdXN0IGJlZW4gYW5ub3VuY2VkIGF0IHRo ZSBPQ0FNTCAyMDIyIHdvcmtzaG9wLCB0aGUgbmV3LA0KICByZS13cml0dGVuIHZlcnNpb24gb2Yg c3RyeW1vbmFzIGxpYnJhcnkgaXMgbm93IGF2YWlsYWJsZSBhdA0KDQogIDxodHRwczovL3N0cnlt b25hcy5naXRodWIuaW8+DQoNCiAgU3RyeW1vbmFzIGlzIHRoZSBzdHJlYW0gcHJvY2Vzc2luZyBs aWJyYXJ5IHRoYXQgYWNoaWV2ZXMgdGhlIGhpZ2hlc3QNCiAgcGVyZm9ybWFuY2Ugb2YgZXhpc3Rp bmcgT0NhbWwgc3RyZWFtaW5nIGxpYnJhcmllcywgYXR0YWluaW5nIHRoZSBzcGVlZA0KICBhbmQg bWVtb3J5IGVmZmljaWVuY3kgb2YgaGFuZC13cml0dGVuIHN0YXRlIG1hY2hpbmVzLiBJdCBzdXBw b3J0cw0KICBmaW5pdGUgYW5kIGluZmluaXRlIHN0cmVhbXMgd2l0aCB0aGUgZmFtaWxpYXIgZGVj bGFyYXRpdmUgaW50ZXJmYWNlLA0KICBvZiBhbnkgY29tYmluYXRpb24gb2YgbWFwLCBmaWx0ZXIs IHRha2Uod2hpbGUpLCBkcm9wKHdoaWxlKSwgemlwLA0KICBmbGF0bWFwIGNvbWJpbmF0b3JzIGFu ZCB0dXBsaW5nLiBFeHBlcmllbmNlZCB1c2VycyBtYXkgdXNlIHRoZQ0KICBsb3dlci1sZXZlbCBp bnRlcmZhY2Ugb2Ygc3RhdGVmdWwgc3RyZWFtcyBhbmQgaW1wbGVtZW50IGFjY3VtdWxhdGluZw0K ICBtYXBzLCBjb21wcmVzc2lvbiBhbmQgd2luZG93aW5nLiBUaGUgbGlicmFyeSBpcyBiYXNlZCBv biBhc3N1cmVkIGNvZGUNCiAgZ2VuZXJhdGlvbiAoYXQgcHJlc2VudCwgb2YgT0NhbWwgYW5kIEMp IGFuZCBndWFyYW50ZWVzIGluIGFsbCBjYXNlcw0KICBjb21wbGV0ZSBmdXNpb24uDQoNCiAgQ29t cGFyZWQgd2l0aCB0aGUgb3JpZ2luYWwgc3RyeW1vbmFzIChQT1BMIDIwMTcpLCB0aGUgbmV3IHZl cnNpb24gaXMNCiAgY29tcGxldGVseSByZS13cml0dGVuIGFuZDoNCiAg4oCiIEdlbmVyYXRlcyBu b3Qgb25seSBPQ2FtbCBidXQgYWxzbyBDICh3aGljaCBuZWVkcyBubyBPQ2FtbCBydW4tdGltZQ0K ICAgIGFuZCB2ZWN0b3JpemFibGUpDQogIOKAoiBIYXMgQ29yZSArIGNvZGUtZ2VuZXJhdGlvbiBC YWNrZW5kcyBhcmNoaXRlY3R1cmU6IE1ldGFPQ2FtbCBpcw0KICAgIG5lZWRlZCBvbmx5IGZvciB0 aGUgT0NhbWwgYmFja2VuZCBhbmQgYmVuY2htYXJrczsgdGhlIENvcmUgYW5kIHRoZSBDDQogICAg Z2VuZXJhdGlvbiBiYWNrZW5kIGFyZSBwdXJlIE9DYW1sLiBNb3JlIGJhY2tlbmRzIGNhbiBiZSBl YXNpbHkNCiAgICBhZGRlZC4NCiAg4oCiIFRoZSBjb21wbGV0ZSBmdXNpb24gaXMgbm93IGFjaGll dmVkIGluIGFsbCBjYXNlcw0KICDigKIgU3VwcG9ydHMgYm90aCB1c2VyLWZyaWVuZGx5IGFuZCBm YW1pbGlhciBkZWNsYXJhdGl2ZSBjb21iaW5hdG9ycywNCiAgICBhbmQgbG93LWxldmVsIGNvcmUg b2Ygc3RhZmVmdWwgc3RyZWFtcyAod2hpY2ggY2FuIGJlIHVzZWQgdG9nZXRoZXIpDQogIOKAoiBD b3JlIHN0cmVhbXMgc3VwcG9ydCBzdHJlYW1zIG92ZXIgdHVwbGVzLCByZWNvcmRzIGFuZCBldmVu IGFic3RyYWN0DQogICAgZGF0YSB0eXBlcw0KICDigKIgRnVzaW9uIGlzIG5vdyBwZXJmb3JtZWQg YXMgbm9ybWFsaXphdGlvbi1ieS1ldmFsdWF0aW9uDQoNCiAgVGhlIHBhcGVyIDxodHRwczovL3N0 cnltb25hcy5naXRodWIuaW8vZG9jcy9vY2FtbC0yMi5wZGY+IGFuZCB0aGUNCiAgICAgICAgICBP Q0FNTCAyMDIyIHRhbGsgKHNvb24gdG8gYmUgYXZhaWxhYmxlIG9uIFlvdVR1YmXigJlzIFNJR1BM QU4NCiAgICAgICAgICBjaGFubmVsLCBhbW9uZyBhbGwgb3RoZXIgdGFsa3Mgb2YgdGhlIElDRlAg MjAyMiBldmVudCkgZ2l2ZQ0KICAgICAgICAgIG1vcmUgZGV0YWlscy4gVGhlIGdpdGh1YiByZXBv IGNvbnRhaW5zIHRoZSBjb21wbGV0ZSBjb2RlIG9mDQogICAgICAgICAgdGhlIGxpYnJhcnksIGV4 YW1wbGVzIGFuZCBhbGwgYmVuY2htYXJrcy4NCg0KDQpPQ2FtbCBDb21tdW5pdHkgQ29kZSBvZiBD b25kdWN0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWNvbW11bml0eS1jb2RlLW9m LWNvbmR1Y3QvMTA0OTQvMT4NCg0KDQpTdWRoYSBQYXJpbWFsYSBhbm5vdW5jZWQNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEhlbGxvIGFsbCEgT24gYmVoYWxmIG9mIHRoZSBPQ2FtbCBDb0MgY29tbWl0 dGVlLCBJ4oCZZCBsaWtlIHRvIHByZXNlbnQNCiAgdGhlIHByb3Bvc2VkIENvZGUgb2YgQ29uZHVj dCBmb3IgdGhlIE9DYW1sIGNvbW11bml0eS4gV2UgaG9wZSB0aGlzIGlzDQogIGEgc3RlcCB0b3dh cmRzIGVuc3VyaW5nIGEgZnJpZW5kbHkgYW5kIGluY2x1c2l2ZSBjb21tdW5pdHkgZm9yDQogIGV2 ZXJ5b25lLg0KDQogIFRoZSBDb0MgdGV4dCwgYmFzZWQgb24gQ29udHJpYnV0b3IgQ292ZW5hbnQg Y2FuIGJlIGZvdW5kIFtoZXJlXS4NCg0KDQpbaGVyZV0NCjxodHRwczovL2dpc3QuZ2l0aHViLmNv bS9TdWRoYTI0Ny9lZDA0OWRlMGZkOTFkMjZmNDM3NzdmYjExYWMwNDUzZj4NCg0KVGhlIGNvbW1p dHRlZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGN1 cnJlbnQgY29tbWl0dGVlIGNvbnNpc3RzIG9mIHRoZSBmb2xsb3dpbmcgcGVvcGxlOg0KDQogIOKA oiBMb3VpcyBSb2Now6kgKCBAS2hhZHksIEFocmVmcykNCiAg4oCiIE1hcmNlbGxvIFNlcmkgKCBA bXNlcmksIFVuaXZlcnNpdHkgb2YgR3JvbmluZ2VuKQ0KICDigKIgUmFqYSBCb3VqYmVsICggQHJq Ym91LCBPQ2FtbFBybykNCiAg4oCiIFNpbW9uIENydWFuZXMgKCBAYy1jdWJlLCBJbWFuZGFyYSBT b2Z0d2FyZSkNCiAg4oCiIFNvbmphIEhlaW56ZSAoQHBpdGFnLCBUYXJpZGVzKQ0KDQoNClNjb3Bl DQrilYzilYzilYzilYzilYwNCg0KICBUaGUgc3BhY2VzIHdpdGhpbiB0aGUgc2NvcGUgb2YgdGhl IGNvbW1pdHRlZSBhdCB0aGUgbW9tZW50IGFyZToNCg0KICDigKIgZGlzY3Vzcy5vY2FtbC5vcmcN CiAg4oCiIE9DYW1sIG1haWxpbmcgbGlzdA0KICDigKIgT0NhbWwgSVJDDQogIOKAoiBPQ2FtbCBH aXRIdWIgb3JnYW5pc2F0aW9uDQoNCg0KVGltZWxpbmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoZSBjb21taXR0ZWUgaGFzIGRpc2N1c3NlZCBvbiB0aGUgQ29DIHRleHQuIFdl4oCZ ZCBiZSBoYXBweSB0byBoZWFyIGFueQ0KICBmZWVkYmFjayBmcm9tIHRoZSBjb21tdW5pdHkuIElm IGFsbCBnb2VzIHdlbGwsIHRoZSBDb0Mgd2lsbCBiZQ0KICBlbmZvcmNlZCByb3VnaGx5IGEgbW9u dGggZnJvbSBub3cuIFdl4oCZbGwga2VlcCB0aGlzIHRocmVhZCB1cGRhdGVkIHdpdGgNCiAgYW55 IGRldmVsb3BtZW50cy4NCg0KDQpSb2xlIG9mIE9DYW1sIFNvZnR3YXJlIGZvdW5kYXRpb24NCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdoaWxlIHRoaXMg ZWZmb3J0IGlzIGVuZG9yc2VkIGJ5IHRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uLA0KICB0 aGV54oCZcmUgbm90IGRpcmVjdGx5IGludm9sdmVkIHdpdGggdGhlIGNvbW1pdHRlZeKAmXMgb3Bl cmF0aW9uIG9yDQogIGRlY2lzaW9ucyBieSB0aGUgY29tbWl0dGVlIG9uIHRoZSBlbmZvcmNlbWVu dCwgYW5kIHRoaXMgd291bGQgcmVtYWluDQogIHRoZSBzYW1lIGluIGZ1dHVyZS4NCg0KDQpPbmJv YXJkaW5nIG1vcmUgcHJvamVjdHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBjb21taXR0ZWUg aXMgb3BlbiB0byBvbmJvYXJkaW5nIG1vcmUgcHJvamVjdHMgdW5kZXIgdGhlIHVtYnJlbGxhDQog IG9mIHRoaXMgQ29DLg0KDQogIFdlIHNlZSB0d28gd2F5cyB0byBnbyBmb3J3YXJkOg0KDQogICgx KSBQcm9qZWN0cyBhZG9wdCB0aGUgQ29DIHRleHQgYW5kIHRoZSBwcm9qZWN0IG1haW50YWluZXJz IGRvIHRoZQ0KICBtb2RlcmF0aW9uIHdvcmsgdGhlbXNlbHZlcy4NCg0KICAoMikgUHJvamVjdHMg YWRvcHQgdGhlIENvQyB0ZXh0IGFuZCB0aGUgY29tbWl0dGVlIHdvdWxkIGFsc28gYWN0IGFzDQog IGFyYml0cmVycyBmb3IgdmlvbGF0aW9uIHJlcG9ydHMgc3VibWl0dGVkIHRvIHRoZW0uDQoNCiAg SWRlYWxseSB3ZSBjb3VsZCBkbyBhIGNvbWJpbmF0aW9uIG9mIGJvdGguIFNtYWxsZXIgcHJvamVj dHMgY291bGQNCiAgcG9zc2libHkgYWRvcHQgdGhlIGxhdHRlciBhbmQgdGFrZSBoZWxwIGZyb20g dGhlIGNvbW1pdHRlZSBmb3INCiAgZW5mb3JjZW1lbnQsIHdoaWxlIGJpZ2dlciBwcm9qZWN0cyB3 aXRoIGNhcGFjaXR5IHRvIGRvIHRoZSBtb2RlcmF0aW9uDQogIHRoZW1zZWx2ZXMgY2FuIGFkb3B0 IHRoZSBDb0MgdGV4dC4gVGhlIGRlY2lzaW9uIHRvIGFjY2VwdCBwcm9qZWN0cw0KICBpbnRvIHRo ZSB1bWJyZWxsYSBsaWVzIHdpdGggdGhlIGNvbW1pdHRlZS4NCg0KICBXZeKAmXJlIGtlZW4gdG8g aGVhciBhbnkgdGhvdWdodHMgb3Igc3VnZ2VzdGlvbnMgZm9yIGltcHJvdmVtZW50LiBJZg0KICB5 b3XigJlyZSBpbnRlcmVzdGVkIHRvIGFkb3B0IHRoaXMgQ29DIGZvciB5b3VyIE9DYW1sIHByb2pl Y3QsIHBsZWFzZQ0KICBkb27igJl0IGhlc2l0YXRlIHRvIHBvc3QgaGVyZSBvciBjb250YWN0IG1l ICh3cml0ZSB0byBtZSBhdCBzdWRoYXJnMjQ3DQogIFthdF0gZ21haWwgW2RvdF0gY29tIG9yIERN IGhlcmUpIG9yIGFueSBvZiB0aGUgY29tbWl0dGVlIG1lbWJlcnMgKERNDQogIGhlcmUpLg0KDQoN ClVzZSBPQ2FtbCB0byBpbnRlcmFjdCB3aXRoIE5lb3ZpbQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC93aGF0LXdpbGwtYmUtcmVxdWlyZWQtdG8tdHJhbnNwaWxlLW9jYW1sLXRvLWx1 YS8xMDQ5My8xMD4NCg0KDQpEZWVwIGluIHRoaXMgdGhyZWFkLCBEYW5pIERpY2tzdGVpbiBzYWlk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBGb3IgdGhlIE5lb3ZpbS1zcGVjaWZpYyB1c2UgY2FzZSwgeW91IG1heSB3 YW50IHRvIHRha2UgYSBsb29rIGF0DQogIFt2Y2FtbF0sIHdoaWNoIGxldHMgeW91IHdyaXRlIE9D YW1sIHByb2dyYW1zIHRoYXQgaW50ZXJhY3Qgd2l0aCBOZW92aW0NCiAgb3ZlciBtc2dwYWNrIFJQ Qy4gRG8gbm90ZSB0aG91Z2ggdGhhdCB3aGlsZSB0aGUgbGlicmFyeSBhcy1pcyBzaG91bGQNCiAg cHJvdmlkZSB5b3Ugd2l0aCB0aGUgZnVuY3Rpb25hbGl0eSB5b3UgbmVlZCwgaXQgaXMgdW5kZXIg YWN0aXZlDQogIGRldmVsb3BtZW50IHNvIHRoZSBBUEkgbWF5IGNoYW5nZSAoaW1wcm92ZSkgaW4g c2lnbmlmaWNhbnQgd2F5cw0KICBiZXR3ZWVuIHJlbGVhc2VzLg0KDQoNClt2Y2FtbF0gPGh0dHBz Oi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMvdmNhbWwvPg0KDQoNCldoYXQgd2lsbCBiZSByZXF1 aXJlZCB0byB0cmFuc3BpbGUgT0NhbWwgdG8gTHVhPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93aGF0 LXdpbGwtYmUtcmVxdWlyZWQtdG8tdHJhbnNwaWxlLW9jYW1sLXRvLWx1YS8xMDQ5My8xND4NCg0K DQpEZWVwIGluIHRoaXMgdGhyZWFkLCBEYXZpZCBKZWZmcmV5IHNhaWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERvZXNu 4oCZdCBuZWNlc3NhcmlseSBoZWxwIG11Y2gsIGJ1dCBhIHdoaWxlIGFnbyBJIHdyb3RlIGENCiAg cHJvb2Ytb2YtY29uY2VwdCBNTC1zdHlsZSBsYW5ndWFnZSAodXNpbmcgT0NhbWwsIG9mIGNvdXJz ZSkgdGhhdA0KICB0cmFuc3BpbGVkIHRvIEx1YSAtIDxodHRwczovL2dpdGh1Yi5jb20vbWVybGUt bGFuZy9sdW1sPiAoSSB3YXMgbW9zdGx5DQogIHRoaW5raW5nIGFib3V0IHRhcmdldGluZyBnYW1l IGVuZ2luZXPigKYgSSBkaWQgZW5vdWdoIHRvIGltcGxlbWVudA0KICBUZXRyaXMgYW5kIHRoZW4g Z2F2ZSB1cCBvbiBpdCkuDQoNCiAgVGhlIG1vZHVsZSB0aGF0IGVtaXRzIEx1YSBzb3VyY2UgY29k ZSB3YXMgcHJldHR5IHNpbXBsZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9tZXJsZS1sYW5nL2x1 bWwvYmxvYi9tYXN0ZXIvbGliL2NvbXBpbGUubWw+IC0gSQ0KICBkaWQgdGhpbmtpbmcgYWJvdXQg dHJ5aW5nIHRvIHRhcmdldCBieXRlIGNvZGUgYnV0IGl0IHNlZW1lZCB0cmlja3kgZHVlDQogIHRv IGRpZmZlcmVudCBMdWEgdmVyc2lvbnMsIEkgdGhpbmsuDQoNCg0KT0JhemwgVG9vbHN1aXRlIC0g dG9vbHMgZm9yIGJ1aWxkaW5nIE9DYW1sIHdpdGggQmF6ZWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvb2JhemwtdG9vbHN1aXRlLXRvb2xzLWZvci1idWlsZGluZy1vY2FtbC13 aXRoLWJhemVsLzEwMDIxLzEwPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIGphbWVzIHdv b2R5YXR0IGFza2VkIGFuZCBHcmVnZyBSZXlub2xkcyByZXBsaWVkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBBbnkgY2hhbmNlIHdlIG1pZ2h0 IHNlZSBhIGBjb25mLWJhemVsJyBwYWNrYWdlIGFkZGVkIHRvDQogICAgICAgIE9QQU0gc28gYSBw YWNrYWdlIGNhbiBkZXBlbmQgb24gYSBjb21wYXRpYmxlIHZlcnNpb24gb2YNCiAgICAgICAgQmF6 ZWwgYmVpbmcgaW5zdGFsbGVkIG9uIHRoZSBob3N0Pw0KDQogIEnigJl2ZSBwdXQgYSBsb3Qgb2Yg d29yayBpbnRvIHNlYW1sZXNzIE9QQU0gaW50ZWdyYXRpb24sIGJ1dCBvbmx5IGluIG9uZQ0KICBk aXJlY3Rpb246IG1ha2UgaXQgZWFzeSB0byB1c2UgT1BBTSByZXNvdXJjZXMgaW4gYSBCYXplbCBi dWlsZA0KICBwcm9ncmFtLiBJIGhhdmUgbm90IHB1dCBtdWNoIHRob3VnaHQgaW50byBpbnRlZ3Jh dGluZyBCYXplbCBpdHNlbGYNCiAgaW50byB0aGUgT1BBTSBlY29zeXN0ZW0uIEZvciBleGFtcGxl IHB1Ymxpc2hpbmcgYSBCYXplbC1lbmFibGVkDQogIHBhY2thZ2UgdG8gT1BBTS4gSXQgbG9va3Mg bGlrZSB3cml0aW5nIHN1Y2ggYSBjb25mLWJhemVsIHBhY2thZ2Ugd291bGQNCiAgYmUgcHJldHR5 IGVhc3ksIGJ1dCBJ4oCZbSBub3Qgc3VyZSBpdCB3b3VsZCBkbyB1cyBtdWNoIGdvb2QgYXQgdGhl DQogIG1vbWVudC4gV2hhdCBzcGVjaWZpYyB1c2UgY2FzZXMgZG8geW91IGhhdmUgaW4gbWluZD8N Cg0KICBUaGVyZSBhcmUgdHdvIHdheXMgdG8gaW50ZWdyYXRlIEJhemVsIGFuZCBPUEFNLiBPbmUg aXMgdG8NCiAgYXV0b21hdGljYWxseSBnZW5lcmF0ZSBCVUlMRC5iYXplbCBmaWxlcyBmb3IgT1BB TSBwYWNrYWdlcy4gVGhlbiBCYXplbA0KICB3b3VsZCBidWlsZCBldmVyeXRoaW5nLCBlbGltaW5h dGluZyB0aGUgbmVlZCBmb3IgdGhlIE9QQU0gZW5naW5lLiBUaGlzDQogIGlzIHRoZSBzdHJhdGVn eSBmb2xsb3dlZCBieSBydXN0ICh0b29sOiBjYXJnb19yYXplLCBldmlkZW50bHkgbm93DQogIHN1 cHBsYW50ZWQgYnkgY3JhdGVfdW5pdmVyc2UpIGFuZCBnbyAodG9vbDogZ2F6ZWxsZSkuIFVuZm9y dHVuYXRlbHkgYQ0KICBjb21wbGV0ZSBzb2x1dGlvbiBhbG9uZyB0aGVzZSBsaW5lcyBpcyBub3Qg ZmVhc2libGUgZm9yIE9DYW1sLCBzaW5jZQ0KICBzb3VyY2UgZmlsZXMgZG8gbm90IGNhcnJ5IGVu b3VnaCBpbmZvcm1hdGlvbiB0byBzdXBwb3J0IGluZmVyZW5jZSB0byBhDQogIGJ1aWxkIHByb2dy YW0sIGFuZCBPUEFNIHBhY2thZ2VzIG1heSB1c2UgYSB2YXJpZXR5IG9mIGJ1aWxkIGxhbmd1YWdl cw0KICAoRHVuZSwgTWFrZWZpbGVzLCBPTWFrZSwgZXRjLikuIE9uIHRoZSBvdGhlciBoYW5kLCBE dW5lIHNlZW1zIHRvIGJlDQogIHRoZSBtb3N0IHdpZGVseSB1c2VkIGJ1aWxkIGVuZ2luZSBieSBh IGNvbnNpZGVyYWJsZSBtYXJnaW4sIGFuZCB0aGUNCiAgRHVuZSBsYW5ndWFnZSBpcyBlYXN5IHRv IHBhcnNlIChpZiBub3Qgc28gZWFzeSB0byBpbnRlcnByZXQpLCBzbyBJ4oCZbQ0KICB3b3JraW5n IG9uIGEgY29udmVyc2lvbiB0b29sIHRoYXQgYXV0b21hdGljYWxseSBjb252ZXJ0cyBEdW5lIGZp bGVzIHRvDQogIEJVSUxELmJhemVsIGZpbGVzLg0KDQogIFRoZSBvdGhlciBzdHJhdGVneSBpcyB0 byByZWx5IG9uIE9QQU0gdG8gYnVpbGQgZGVwZW5kZW5jaWVzIGFuZCB0aGVuDQogIOKAnGltcG9y dOKAnSB0aGUgYnVpbHQgYXJ0aWZhY3RzIGludG8gQmF6ZWwuIE9CYXpsIGRlZmluZXMgYW4NCiAg YG9wYW1faW1wb3J0JyBydWxlIGZvciB0aGlzIHB1cnBvc2UsIGFuZCBhIHRvb2wgdGhhdCBiYXpl bGl6ZXMgT1BBTQ0KICBzd2l0Y2hlcywgZ2VuZXJhdGluZyBhbiBPQmF6bCDigJljb3N3aXRjaOKA mS4gVGhlIG1hcHBpbmcgZnJvbSBPUEFNDQogIHBhY2thZ2UgbmFtZSB0byBCYXplbCBsYWJlbCBp cyBzdHJhaWdodGZvcndhcmQ6IOKAmXlvanNvbuKAmSB0bw0KICBgQHlvanNvbi8vbGliL3lvanNv bicsIOKAmWx3dC51bml44oCZIHRvIGBAbHd0Ly9saWIvdW5peCcsIGV0Yy4NCg0KICBTbyBpbiBw cmFjdGljZSBPQmF6bCBzdXBwb3J0cyBhIGh5YnJpZCBhcHByb2FjaC4gVXNlIEJhemVsIHRvIGJ1 aWxkDQogIHlvdXIgY29kZSwgYnV0IGltcG9ydCBwcmUtYnVpbHQgT1BBTSBkZXBlbmRlbmNpZXMu IFRvIGRvIHRoYXQgeW91IHJ1bg0KICB0aGUgb3BhbSBjb252ZXJzaW9uIHRvb2wgdG8gZ2VuZXJh dGUgYSDigJljb3N3aXRjaOKAmSB3aGljaCBkZWZpbmVzIGENCiAgbG9jYWwgQmF6ZWwgcmVwbyBm b3IgZWFjaCBPUEFNIHBhY2thZ2UsIGFuZCBjb25maWd1cmUgeW91cg0KICBXT1JLU1BBQ0UuYmF6 ZWwgdG8gaW1wb3J0IHRob3NlIHJlcG9zLiBXcml0ZSB5b3VyIEJVSUxELmJhemVsIGZpbGVzDQog IHVzaW5nIG9wYW0gbGFiZWxzIGFzIGFib3ZlLiBJZiB5b3VyIHByb2plY3QgYWxyZWFkeSB1c2Vz IGR1bmUsIHlvdSBjYW4NCiAgcnVuIHRoZSBkdW5lIGNvbnZlcnNpb24gdG9vbCB0byBnZW5lcmF0 ZSB5b3VyIEJVSUxELmJhemVsIGZpbGVzLCB3aGljaA0KICBpbiBzb21lIGNhc2VzIHdpbGwgbmVl ZCBzb21lIHR3ZWFraW5nLCBzaW5jZSBzb21lIER1bmUgc3RhbnphcyBsYWNrDQogIHN1ZmZpY2ll bnQgaW5mb3JtYXRpb24gZm9yIGNvbnZlcnNpb24sIGFuZCBpbiBvdGhlcnMgdGhlIGNvbnZlcnNp b24NCiAgY29kZSBuZWVkcyBjb21wbGljYXRlZCBsb2dpYyB0aGF0IEkgaGF2ZW7igJl0IGdvdHRl biBhcm91bmQgdG8gd3JpdGluZywNCiAgb3IgdGhhdCBkb2VzIG5vdCBzZWVtIHdvcnRoIHRoZSBi b3RoZXIuDQoNCiAgVGhlIE9QQU0g4oCcaW1wb3J04oCdIGNvbnZlcnNpb24gdG9vbCBpcyBmYWly bHkgc3RhYmxlLiBJdCBjb252ZXJ0cyB0aGUNCiAgTUVUQSBmaWxlcyBpbiBPUEFNIGludG8gQlVJ TEQuYmF6ZWwgZmlsZXMsIHdoaWNoIGluY2x1ZGUgZGVwZW5kZW5jeQ0KICBpbmZvcm1hdGlvbi4g U28gd2hlbiB5b3UgZGVwZW5kIG9uIGFuIGBvcGFtX2ltcG9ydCcgdGFyZ2V0IHlvdSBnZXQgaXRz DQogIGVudGlyZSBkZXBlbmRlbmN5IGdyYXBoLg0KDQogIFRoZSBEdW5lIG1pZ3JhdGlvbiB0b29s IGlzIGFub3RoZXIgbWF0dGVyLiBSZXZlcnNlLWVuZ2luZWVyaW5nIHRoZQ0KICBEdW5lIGxhbmd1 YWdlIGlzIGEgbm9uLXRyaXZpYWwgdGFzaywgbGVtbWUgdGVsbCB5YS4gVGhlIGdvb2QgbmV3cyBp cw0KICB0aGF0IGFmdGVyIHdoYXQgc2VlbXMgbGlrZSBlb25zIG9mIHdvcmsgdGhlIGVuZCBpcyBp biBzaWdodC4gSeKAmXZlIGJlZW4NCiAgcnVubmluZyBpdCBhZ2FpbnN0IGEgc2VtaS1yYW5kb20g c2V0IG9mIHByb2plY3RzIChqc19vZl9vY2FtbCwNCiAgb2NhbWwtcHJvdG9jLCBzb21lIHBweCBs aWJzLCBldGMuKSBhbmQgd29ya2luZyB0aHJvdWdoIHRoZSBxdWlya3MNCiAgaW5jaC1ieS1pbmNo LiBSdWxlIHN0YW56YXMgYXJlIGEgcmVhbCBQSVRBLCBjYW4gSSBqdXN0IHNheSB0aGF0PyBJbg0K ICBhbnkgY2FzZSwgaXQgbG9va3MgbGlrZSBJIHNob3VsZCBoYXZlIGFuIGFscGhhIHJlbGVhc2Ug d2l0aA0KICBkb2N1bWVudGF0aW9uIGFuZCBzb21lIGNhc2Ugc3R1ZGllcyB3aXRoaW4gYSB3ZWVr IG9yIHNvLiBJIGhvcGUuIEF0DQogIHRoZSB2ZXJ5IGxlYXN0IEnigJlsbCBjb252ZXJ0IG15IGRl diBjb25maWd1cmF0aW9uIGludG8gc29tZXRoaW5nIHVzYWJsZQ0KICBieSBvdGhlcnMgc28geW91 IGNhbiBmb2xsb3cgYWxvbmcgaWYgeW91IHdhbnQuDQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5k IG1lIGEgbWVzc2FnZV0gYW5kIEnigJlsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBh IGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZl c10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgW29ubGluZV0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0K DQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+ DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzPg0KDQpbb25saW5lXSA8aHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0 aW5mby9jYW1sLW5ld3Mtd2Vla2x5Lz4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 13 to 20, 2= 022.

    Sandmark Nightly Service now reports Instructions Retired alon= g with Time

    Shakthi Kannan announced

    Sandmark Nightly is a service for the OCaml compiler developers that helps = benchmark the development branches of the compiler on the large set of Sandmark benchmarks on tuned machines and repo= rts the results in an interactive UI. Currently, Sandmark nightly reported many metrics including running time. B= ut running time is a notoriously noisy metric on modern architectures due to the effects of modern OS, arch and mi= cro-arch optimisations. There could be swings of 50% in either directions when the directory in which the program = is run changes.

    While we run Sandmark benchmarks on tuned machines, we still see impact of = noise on the real time measurements. To this end, we introduce a new metric into Sandmark nightly that in addition = to real time, would help interpret the results accounting for the noise. We now report =E2=80=9Cinstructions retir= ed=E2=80=9D for Sandmark runs. Instructions retired report the number of instructions executed by the program during its run an= d hence is shielded from the noise that affects real time measurements. Of course, the same number of instructions = may be discharged at different rates by the processor due to instruction-level parallelism and hence, the instructi= ons discharged metric should be used in conjunction with real time measurements. For example, if a new compiler fea= ture adds 2 instructions to the prolog of the function, then the instructions retired metric should inform you how ma= ny new instructions are actually executed on top of the baseline.

    The instructions retired metric is collected from perf command= . We also have other useful metrics from perf such as page faults, branches, branch misses, cache misses at various levels of = the hierarchy, etc. We will add graphs to report these going forward. Enjoy the new feature, and as ever, report issu= es and bugs to S= andmark Issues.

    The web service is available at ht= tps://sandmark.tarides.com and you can select the Perfstat Output= radio button on the left panel as shown below.

    3D"5f9d3d8d87=

    After selecting the variants and a baseline for comparison, you can view th= e normalised instructions per cycle change as illustrated below:

    3D"1baf673b12=

    You can also request for your development branches to be added to the Sandm= ark Nightly Service at the sandmark= -nightly-config repository for the nightly runs.

    References

    1. Run perfstat with Sandmark nightly service. Sandmark PR #394
    2. Add webpage with perfstat output from Sandmark. Sandmark-nightly PR #81
    3. perfstat.ipynb. Sandmark perfstat Jupyter notebook=

    Outreachy December 2022

    Patrick Ferris said

    Just a reminder the deadline for mentor signup is in 9 days, the same day as https://discuss.ocaml.org/t/outreachy-sum= mer-22-closing-commemoration-session-on-23rd-sept/10450 :camel:

    Unicode 15.0.0 update for Uucd, Uucp, Uunf and Uuseg

    Daniel B=C3=BCnzli announced

    Unicode 15.0.0 was released on the 13th of september. It adds 4489 new char= acters to the standard.

    Given the increasing contributions from the South Asian subcontinent to OCa= ml we are glad this includes support for the 42 (sic) characters of the Nag Mundari script. For information about th= e other additions, see the announcement page.

    Accordingly the libraries mentioned at the end of this message had to be up= dated. Consult the individual release notes for details. Both Uucd and Uucp are incompatible releases sinces new = script and block enumerants had to be added.

    Note that starting from Unicode 16.0.0 =E2=80=93 that is in a year =E2=80= =93 these libraries will be changed to use the UTF decoders of the standard library rather than rely on Uutf. They will thus only be av= ailable for OCaml >=3D 4.14.

    The OCaml tips of the minimal Unicode introduction, which you should read if Unico= de still puzzles you, have been updated to mention the new standard library UTF decoders.

    Also, the ucharinfo tool distributed with uucp[^1= ] can now also lookup characters by matching substrings in their Unicode name or name aliases.

    Best,

    Daniel

    A big thanks for funding from the OCaml So= ftware Foundation and from my faithful donators.

    [^1]: It’s a depopt you’ll need opam install cmdliner uut= f uunf uucp to install it.

    OUPS meetup september 2022 (french only)

    zapashcanon announced

    (this is in french only as the talks will be in french it=E2=80=99s probabl= y not relevant for english speakers)

    Le prochain OUPS aura lieu le jeudi 29 septembre 2022. Le rendez-vou= s est fix=C3=A9 =C3=A0 19h au 4 place Jussieu (salle =C3=A0 pr=C3=A9ciser), 75005 Paris.

    L= ’inscription est obligatoire pour pouvoir acc=C3=A9der au meetup !

    Les expos=C3=A9s seront =C3=A9galement retransmis en ligne sur le gal=C3=A8ne du OUPS.

    Toutes les informations sont disponibles sur le site du OUPS.

    Programme :

    COBOL 101 – =C3=89milien Lemaire

    COBOL est un langage tr=C3=A8s ancien et est assez =C3=A9loign=C3=A9 de ceu= x que nous manipulons tous les jours. Malgr=C3=A9 cela il reste l’un des plus utilis=C3=A9s dans le monde.

    Durant cette pr=C3=A9sentation je vais donc vous introduire au langage, voi= r comment sont =C3=A9crit les programmes, comment les variables sont-elles d=C3=A9clar=C3=A9es et comment les manipuler. Je v= ais aussi vous pr=C3=A9senter quelques features “int=C3=A9ressantes” du langage, dont certaines sont inattendue= s.

    OCaml Multicore – Florian Angeletti

    Opam-bin: Opam et paquets binaires – Fabrice Le Fessant

    L’utilisation d’un gestionnaire de paquets sources comme Opam n= ’est pas toujours optimale en temps, car l’outil passe beaucoup de temps =C3=A0 recompiler des paquets, d=C3=A8j=C3=A0 compi= l=C3=A9s dans le pass=C3=A9 ou par d’autres utilisateurs. Le plugin Opam-bin r=C3=A9pond =C3=A0 ce probl=C3=A8me en permettant de cr=C3= =A9er =C3=A0 la vol=C3=A9e des paquets binaires, qui seront r=C3=A9utilis= =C3=A9s =C3=A0 l’avenir et peuvent =C3=AAtre partag=C3=A9s avec d’autres utili= sateurs. L’expos=C3=A9 montre son utilisation et comment il fonctionne.

    Les pr=C3=A9sentations seront suivies par des discussions libres. Les pizza= s seront offertes par la fondation OCaml ! :pizza:

    strymonas v2: library for highest-performance stream processin= g

    Oleg announced

    As has just been announced at the OCAML 2022 workshop, the new, re-written version of strymonas library is now available at

    https://strymonas.github.io

    Strymonas is the stream processing library that achieves the highest performance of existing OCaml streaming libraries, attaining the speed and memory efficiency of hand-written state machines. It supports finite and infinite streams with the familiar declarative interface, of any combination of map, filter, take(while), drop(while), zip, flatmap combinators and tupling. Experienced users may use the lower-level interface of stateful streams and implement accumulating maps, compression and windowing. The library is based on assured code generation (at present, of OCaml and C) and guarantees in all cases complete fusion.

    Compared with the original strymonas (POPL 2017), the new version is completely re-written and:

    • Generates not only OCaml but also C (which needs no OCaml run-time and vectorizable)
    • Has Core + code-generation Backends architecture: MetaOCaml is needed only for the OCaml backend and benchmarks; the Core and the C generation backend are pure OCaml. More backends can be easily added.
    • The complete fusion is now achieved in all cases
    • Supports both user-friendly and familiar declarative combinators, and low-level core of stafeful streams (which can be used together)
    • Core streams support streams over tuples, records and even abstract data types
    • Fusion is now performed as normalization-by-evaluation

    The paper https://s= trymonas.github.io/docs/ocaml-22.pdf and the OCAML 2022 talk (soon to be available on YouTube’s SIGPLAN ch= annel, among all other talks of the ICFP 2022 event) give more details. The github repo contains the complete code of the library, examples and all benchmarks.

    OCaml Community Code of Conduct

    Sudha Parimala announced

    Hello all! On behalf of the OCaml CoC committee, I’d like to present = the proposed Code of Conduct for the OCaml community. We hope this is a step towards ensuring a friendly and inclusive= community for everyone.

    The CoC text, based on Contributor Covenant can be found here.

    The committee

    The current committee consists of the following people:

    • Louis Roch=C3=A9 ( @Khady, Ahrefs)
    • Marcello Seri ( @mseri, University of Groningen)
    • Raja Boujbel ( @rjbou, OCamlPro)
    • Simon Cruanes ( @c-cube, Imandara Software)
    • Sonja Heinze (@pitag, Tarides)

    Scope

    The spaces within the scope of the committee at the moment are:

    • discuss.ocaml.org
    • OCaml mailing list
    • OCaml IRC
    • OCaml GitHub organisation

    Timeline

    The committee has discussed on the CoC text. We’d be happy to hear an= y feedback from the community. If all goes well, the CoC will be enforced roughly a month from now. We’ll keep t= his thread updated with any developments.

    Role of OCaml Software foundation

    While this effort is endorsed by the OCaml Software Foundation, they’= re not directly involved with the committee’s operation or decisions by the committee on the enforcement, and this would = remain the same in future.

    Onboarding more projects

    The committee is open to onboarding more projects under the umbrella of thi= s CoC.

    We see two ways to go forward:

    (1) Projects adopt the CoC text and the project maintainers do the moderati= on work themselves.

    (2) Projects adopt the CoC text and the committee would also act as arbitre= rs for violation reports submitted to them.

    Ideally we could do a combination of both. Smaller projects could possibly = adopt the latter and take help from the committee for enforcement, while bigger projects with capacity to do the mo= deration themselves can adopt the CoC text. The decision to accept projects into the umbrella lies with the commi= ttee.

    We’re keen to hear any thoughts or suggestions for improvement. If yo= u’re interested to adopt this CoC for your OCaml project, please don’t hesitate to post here or contact me (writ= e to me at sudharg247 [at] gmail [dot] com or DM here) or any of the committee members (DM here).

    Use OCaml to interact with Neovim

    Deep in this thread, Dani Dickstein said

    For the Neovim-specific use case, you may want to take a look at vcaml, which lets you write OCaml programs that interact with Neovim over msgpack = RPC. Do note though that while the library as-is should provide you with the functionality you need, it is und= er active development so the API may change (improve) in significant ways between releases.

    What will be required to transpile OCaml to Lua?

    Deep in this thread, David Jeffrey said

    Doesn’t necessarily help much, but a while ago I wrote a proof-of-con= cept ML-style language (using OCaml, of course) that transpiled to Lua - htt= ps://github.com/merle-lang/luml (I was mostly thinking about targeting = game engines… I did enough to implement Tetris and then gave up on it).

    The module that emits Lua source code was pretty simple: h= ttps://github.com/merle-lang/luml/blob/master/lib/compile.ml - I did th= inking about trying to target byte code but it seemed tricky due to different Lua versions, I think.

    OBazl Toolsuite - tools for building OCaml with Bazel

    Continuing this thread, james woodyatt asked and Greg= g Reynolds replied

    Any chance we might see a conf-bazel package added to OPAM so = a package can depend on a compatible version of Bazel being installed on the host?

    I’ve put a lot of work into seamless OPAM integration, but only in on= e direction: make it easy to use OPAM resources in a Bazel build program. I have not put much thought into integrating Baze= l itself into the OPAM ecosystem. For example publishing a Bazel-enabled package to OPAM. It looks like writing = such a conf-bazel package would be pretty easy, but I’m not sure it would do us much good at the moment. What = specific use cases do you have in mind?

    There are two ways to integrate Bazel and OPAM. One is to automatically ge= nerate BUILD.bazel files for OPAM packages. Then Bazel would build everything, eliminating the need for the O= PAM engine. This is the strategy followed by rust (tool: cargo_raze, evidently now supplanted by crate_unive= rse) and go (tool: gazelle). Unfortunately a complete solution along these lines is not feasible for OCa= ml, since source files do not carry enough information to support inference to a build program, and OPAM packag= es may use a variety of build languages (Dune, Makefiles, OMake, etc.). On the other hand, Dune seems to be the mo= st widely used build engine by a considerable margin, and the Dune language is easy to parse (if not so easy= to interpret), so I’m working on a conversion tool that automatically converts Dune files to BUILD.bazel files.

    The other strategy is to rely on OPAM to build dependencies and then &ldquo= ;import” the built artifacts into Bazel. OBazl defines an opam_import rule for this purpose, and a tool that = bazelizes OPAM switches, generating an OBazl ’coswitch’. The mapping from OPAM package name to Bazel label = is straightforward: ’yojson’ to @yojson//lib/yojson, ’lwt.unix’ to @lwt//lib= /unix, etc.

    So in practice OBazl supports a hybrid approach. Use Bazel to build your co= de, but import pre-built OPAM dependencies. To do that you run the opam conversion tool to generate a &rs= quo;coswitch’ which defines a local Bazel repo for each OPAM package, and configure your WORKSPACE.bazel to import those r= epos. Write your BUILD.bazel files using opam labels as above. If your project already uses dune, you can run the d= une conversion tool to generate your BUILD.bazel files, which in some cases will need some tweaking, since some = Dune stanzas lack sufficient information for conversion, and in others the conversion code needs complicated logic t= hat I haven’t gotten around to writing, or that does not seem worth the bother.

    The OPAM “import” conversion tool is fairly stable. It converts= the META files in OPAM into BUILD.bazel files, which include dependency information. So when you depend on an opam_import<= /code> target you get its entire dependency graph.

    The Dune migration tool is another matter. Reverse-engineering the Dune la= nguage is a non-trivial task, lemme tell ya. The good news is that after what seems like eons of work the end is in= sight. I’ve been running it against a semi-random set of projects (js_of_ocaml, ocaml-protoc, some ppx libs, etc.= ) and working through the quirks inch-by-inch. Rule stanzas are a real PITA, can I just say that? In any c= ase, it looks like I should have an alpha release with documentation and some case studies within a week or so. I ho= pe. At the very least I’ll convert my dev configuration into something usable by others so you can follow along if yo= u want.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I’ll mail it to you, or go take= a look at the archive or= the RSS feed of the a= rchives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 85102E0241 for ; Tue, 27 Sep 2022 09:17:24 +0200 (CEST) Authentication-Results: mail2-smtp-roc.national.inria.fr; spf=Pass smtp.pra=alan.schmitt@polytechnique.org; spf=Pass smtp.mailfrom=SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org; spf=Pass smtp.helo=postmaster@mx1.polytechnique.org Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of alan.schmitt@polytechnique.org designates 129.104.30.34 as permitted sender) identity=pra; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="alan.schmitt@polytechnique.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org designates 129.104.30.34 as permitted sender) identity=mailfrom; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-conformance=sidf_compatible; x-record-type="spf2.0"; x-record-text="spf2.0/pra,mfrom +a:mx1.polytechnique.org +a:mx2.polytechnique.org +a:mx3.polytechnique.org +ip6:2001:41d0:1:94de::736d:7470 -all" Received-SPF: Pass (mail2-smtp-roc.national.inria.fr: domain of postmaster@mx1.polytechnique.org designates 129.104.30.34 as permitted sender) identity=helo; client-ip=129.104.30.34; receiver=mail2-smtp-roc.national.inria.fr; envelope-from="SRS0=wKHr=Z6=polytechnique.org=alan.schmitt@bounces.m4x.org"; x-sender="postmaster@mx1.polytechnique.org"; x-conformance=sidf_compatible; x-record-type="v=spf1"; x-record-text="v=spf1 a -all" IronPort-SDR: 6332a383_3oKFCCo8ojjvm5eClC87Z62T3IU1l1WFFmZHEEGFD+Lt087 oyFwYNjdYa3GWOacWEBOEorJAxdV1d5ygzwtqBw== X-IPAS-Result: =?us-ascii?q?A0DplgAXojJjhyIeaIFaARWDY1soGQFnVi4HCEWEET2RF?= =?us-ascii?q?IEWiEqHC41PBE4QAQMBDSwBDAYBAgQBAYISgnMChGwCHgYBBTMTAQIEAQEBA?= =?us-ascii?q?QMCAwEBAQEBAQMBAQUBAQECAQECBAQBEwEBAQEYCRcHEA4FIoU7ByYNgjUMD?= =?us-ascii?q?AODdwMBCg4BCAQGEwEBKwcGGCMDFAEGAwIRARcBHgMBEwESFAYBgmIBgyADB?= =?us-ascii?q?QuOM5pOGjV6fzOBAYIIAQEGgUABAwIBCwICAw8uAYN2gVwJJIECF4cGbkUQA?= =?us-ascii?q?YM3CYQdAicQgVVEgRWCKRI4B26BUHAXCwEBAQEBgTQHAQEIRQmDIBiCToUhh?= =?us-ascii?q?GGPJwc3A0QdQQMLdwMVAxQDBSQHAxkPIw0NBB0MAwMFJQMCAhsHAgIDAgYTB?= =?us-ascii?q?QICFzY2CAQIBCskDwUCBy8FBC8CHgQFBhEIAhYCBgQEBAQVAhAIAggmFwcTM?= =?us-ascii?q?xkBBVkQCSEWBigNBQYTAyBJJgVEDygxaysdGwqBDCoJHxUDBAQDAgYTAwMiA?= =?us-ascii?q?hAqMRQEKRMSLQcrcwkCAyJsAwMEKCwDCSEfBygmPAdYEigFAwIQIj0GAwkDA?= =?us-ascii?q?iRbgQMsKAUDDRkmCAU6HgQIPAIFBlcTAgoSAxMPlyOBT4EWLw4HMQYBFhcQD?= =?us-ascii?q?gwJAwEDDQcTAQcMCA4BARQNAQ0gAQQECBsVAQcDAgIBEBUIBAkECgMBGAEOD?= =?us-ascii?q?BMIAxEYEQOERI1XEykDb40Sim2UU4EBNAeDXIFDBgyIQ4EjjQOIK4N2gVCLA?= =?us-ascii?q?IZlkVkhljA6IIIrhwICgRkJgkuIQA2LeiYDIBmFBIFOKiOBKhsPBzMaMEMNG?= =?us-ascii?q?YJBCUUcD4MoilABMxaBBAEHghwoQX2BJnspGDk7WieESz80AgEBNwIGAQoBA?= =?us-ascii?q?QMJhWMBAQUTCwGBf4JIAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:j5Kik6xOultIALqd54kAKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-IronPort-Anti-Spam-Filtered: true X-Spam-Status: Yes X-IronPort-AV: E=Sophos;i="5.93,348,1654552800"; d="scan'208,217";a="54672535" X-MGA-submission: =?us-ascii?q?MDFfUUo75xMvMA4RPqjiZSzVmfwLh/CzCr8nN3?= =?us-ascii?q?JWVv5yWYHS6QGnC5ZWRlwoymw3I+iQ4AygLd5Ax8kYdtLVG+9w6BUZTe?= =?us-ascii?q?gOQdWqLHc0Njxa58QVQOYQ1aOu3jJam97TEYnEUBFzLk/ewRj0YsuRs/?= =?us-ascii?q?nLjHWSJ+t3CuJipawwLUQfEw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Sep 2022 09:17:23 +0200 Received: from set (unknown [131.254.252.112]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 40605565D5D; Tue, 27 Sep 2022 09:17:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1664263042; bh=JaH82cRTRgykxqWwUOyB+9maDkML8dg6nmhe/avzzbU=; h=From:To:Subject:Date:Message-ID; b=uMMBObB0BlcksnE09GmHzP7Bk7qycjIWyQntKvdp+QGMwdNvB/6DUfj5YFKBwGxbg 2VSTn2IBUfDYWBx0AeHmRRyJOs9VLHNdtwGYSPe/OPyvyaDzmGCwtEnLlssN8ldN7q OgrSQef/crO6J6qM5fOBiyLtrmTwG0LiO3BeD55Y= From: Alan Schmitt To: "lwn" , "cwn" , caml-list@inria.fr Date: Tue, 27 Sep 2022 09:17:14 +0200 Message-ID: <87v8p9nv5x.fsf@m4x.org> MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 27 09:17:22 2022 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499997, queueID=9102D565D5F X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 20 to 27, 2022. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Esperanto, when OCaml meets Cosmopolitan OBazl Toolsuite - tools for building OCaml with Bazel Orsetto: structured data interchange languages (release 1.1.2) Interest in a Http_sig library? Outreachy summer =E2=80=9922 closing commemoration session on 23rd Sept findlib-1.9.6 Interesting OCaml Articles Other OCaml News Old CWN Esperanto, when OCaml meets Cosmopolitan =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am delighted to present the first *experimental* release of Esperanto. This project is a new OCaml _toolchain_ that creates binaries compiled with the [Cosmopolitan C library] and linked with the [=CE=B1c=CF=84=C2=B5=CE=B1lly p=CE=B4r=CF=84=CE=B1bl=CE=B5 =CE=B5x=CE= =B5c=C2=B5=CF=84=CE=B1bl=CE=B5] link script. The binary produced is then portable to different platforms: The main objective of Esperanto is to provide a toolchain capable of producing a portable binary from an existing project. This would allow to finally be able to distribute software for all these platforms without having to: 1) manage multiple platforms orthogonally, the Cosmopolitan C library offers you the POSIX API for all platforms (including Windows) 2) Produce several versions of the same software for each platform. Only the binary is needed to run on all platforms Cosmopolitan *does not* however produce a binary with a multi-platform assembler. At this stage, our distribution only supports the `x86_64' assembler (the most common one) but we are working on the possibility to produce a binary with different assemblers. I would like to give special thanks to Justine, the author of the Cosmopolitan project (to develop [redbean], a small portable HTTP server) for her excellent work. [Cosmopolitan C library] [=CE=B1c=CF=84=C2=B5=CE=B1lly p=CE=B4r=CF=84=CE=B1bl=CE=B5 =CE=B5x=CE=B5c= =C2=B5=CF=84=CE=B1bl=CE=B5] [redbean] A _toolchain_ =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In OCaml, the =E2=80=9Ctoolchain=E2=80=9D principle allows the existence = of several compilers within an OPAM switch and to choose one of them when it comes to cross-compiling a project. This principle, even though it is not clearly defined and even though its use remains very limited, exists through the `ocamlfind` tool. You can find these toolchains in your switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ls $(opam var lib)/findlib.conf.d/ =E2=94=82 esperanto.conf solo5.conf =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 From our experience with Mirage as well as the work done in `dune' regarding cross-compilation, the choice to propose a new _toolchain_ in order to allow cross-compilation of projects with OPAM is both a historical choice but also the most relevant one in our opinion [1]. =E2=97=8A Why we need to cross-compile? The term cross-compilation can be misunderstood if we only consider the question of the assembler issued by the compiler (does it match the host assembler or not). In our case, cross-compilation is a broader term that implies the use of external artefacts to the compiler that are different from the default and the use of compiler options that must be used throughout the production of the final binary. In other words, even though we are emitting the same assembler, we are doing so in a different =E2=80=9Ccontext=E2=80=9D which requires the defi= nition of a new _toolchain_ which includes our artefacts and compiler options. One of these artefacts is of course the C library used by the compiler which will then be systematically used by the _runtime caml_, the well named `libasmrun.a'. This is why, for example, there is a version of OCaml with [musl]. So there must be a version of OCaml with Cosmopolitan. This new _toolchain_ also allows you to include the necessary options for compiling C files because, yes, you can compile a C file with `ocamlopt'. In order to provide a coherent _workflow_ for a project, we need to provide not only a `libasmrun.a' compiled with our Cosmopolitan C library but also an OCaml compiler capable of invoking the C compiler with the right options required by Cosmopolitan. Finally, we also need to describe in this _toolchain_ how to link the object files together to actually produce a portable binary using the APE script. [musl] =E2=97=8A A simple example with this new _toolchain_ Installing Esperanto is very easy with OPAM. It will install the cross-compiler and the necessary files so that `ocamlfind~/~dune' can recognise this new _toolchain_: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install esperanto =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Finally, let=E2=80=99s try to produce a simple binary that displays =E2= =80=9CHello World!=E2=80=9D: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ cat >main.ml < =E2=97=8A Execution & Assimilation If you are not concerned by the above problems, you can simply run the program: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ./a.out =E2=94=82 Hello World! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There is a final solution that requires a little explanation of what =CE=B1c=CF=84=C2=B5=CE=B1lly p=CE=B4r=CF=84=CE=B1bl=CE=B5 =CE=B5x=CE=B5= c=C2=B5=CF=84=CE=B1bl=CE=B5 is. Indeed, the latter makes it possible to create a polyglot binary whose first point of entry is not your program but a small program which tries to recognize on which platform the binary tries to run. After this recognition, this little program will =E2=80=9Cinject=E2=80= =9D values corresponding to the platform in which you try to run your program in order to finally let Cosmopolitan manage the translation between its interface and the real POSIX interface that your system offers. Of course, this step has a cost as it adds an indirection between what your program wants to do and what is available on the system running your program. However, APE offers a very special option that allows the program to be assimilated to the platform in which it wants to run. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ file a.out =E2=94=82 a.out: DOS/MBR boot sector =E2=94=82 $ sh -c "./a.out --assimilate" =E2=94=82 $ file a.out =E2=94=82 a.out: ELF 64-bit LSB executable, x86-64 =E2=94=82 $ ./a.out =E2=94=82 Hello World! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This option makes your application truly native to the platform in which you run it. This means above all that the program is *no longer* portable. =E2=97=8A Esperanto, `dune' & `opam monorepo' The `dune' software also incorporates this toolchain idea using the `-x' option. More pragmatically, it is possible to define a new dune context to use Esperanto as a compilation toolchain. However, the original aim of Esperanto is to produce a portable binary. This implies, among other things, that it should not depend on remaining artefacts in order to run and, in this sense, the compilation of your project should be a static compilation. This means that all dependencies of your project must be available to compile in the same context as your project. Again, this is particularly necessary if any of your dependencies include C files, so they need to be compiled in some way. This is where `opam monorepo' comes in, it will simply =E2=80=9Cvendor= =E2=80=9D your dependencies into a =E2=80=9Cduniverse=E2=80=9D folder. Here are the st= eps needed to compile a project with Esperanto. We=E2=80=99ll take [`decompress'] as = an example which produces a binary that can compress/decompress documents: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ git clone https://github.com/mirage/decompress =E2=94=82 $ cd decompress =E2=94=82 $ cat >>bin/dune <dune-workspace < Issues =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Apart from the outcomes described above, however, the Esperanto toolchain is not complete. Indeed, the OCaml distribution gives several libraries such as `unix.cmxa' and `threads.cmxa'. A little work has been done to make the former available. The second one is however unavailable for the moment since Cosmopolitan only partially implements `pthread'. However, it seems that the author of Cosmopolotian wants to implement the rest of the `pthread' API which will then allow us to provide support for `threads.cmxa' and OCaml 5. This of course makes support for the projects more limited than we imagined (and that=E2=80=99s why this release is experimental) however, an effort has already been made to lwt into Cosmopolitan=E2=80=99s hypotheti= cal future support for `pthread'. Future =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C As explained above, support for `threads.cmxa' and OCaml 5 remains the priority. however, an effort has already been made to support [Lwt] via Cosmopolitan=E2=80=99s hypothetical future support for `pthread'. However, it is possible that Cosmopolitan could become a target for the MirageOS project in the same way as Solo5 (or our recent experiment on Raspberry Pi 4). In this sense, we will surely propose an integration in MirageOS so that projects can both produce unikernels with Solo5 or portable binaries with Cosmopolitan. [1] However, the question remains open at several levels, that of the compiler, that of OPAM and of course that of `dune'. It is clear that the current situation is not the best in terms of what we need to do to produce such a cross-compiler. Only the feedback from Solo5 (which requires cross-compilation) allows us to say that it is surely the right choice for what we want to offer. [Lwt] Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C We hope that this project will facilitate the distribution of software. You can read a more technical article about our work [here]. Finally, I would like to thank [robur.io] (an association you [can help]) for allowing me to do this project. *EDIT*: The author of Cosmopolitan just released Cosmopolitan with `pthread' support. So we will definitely try to improve our distribution to include OCaml with `threads.cmxa' support and move forward with OCaml 5! [here] [robur.io] [can help] OBazl Toolsuite - tools for building OCaml with Bazel =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Deep into this thread, Yawar Amin asked and Gregg Reynolds replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Doesn=E2=80=99t dune get advertised as being able to handle multiple programming languages, including C/C++? There=E2=80=99s really no comparison. Dune evidently can use the (C ABI) outputs of a =E2=80=9Cforeign=E2=80=9D build (if you write the glue code = needed to make this work) but there=E2=80=99s no real /build/ integration, and no hermeticity guarantees. Under Bazel different languages use different rulesets but they=E2=80=99re all Bazel rulesets, so you get one dependency graph across all languages, and if the rulesets are hermetic you get a hermetic build. Without ABI restrictions. For example if your build needs to run a Python (or Javascript, Ruby, whatever) tool, Bazel will build the tool and run it for you. Even for C I think Bazel has much better integration. The rules in rules_cc (e.g. cc_library producing a .a file) deliver a CcInfo provider (a provider is a kind of struct whose fields contain the artifacts delivered by a build action). The rules in rules_ocaml (e.g. ocaml_module) understand CcInfo dependencies and pass them around using OcamlProvider (a provider specific to the ocaml rules). Bazel supports a merge operation for CcInfo, and the ocaml rules always merge their CcInfo deps and pass them on. So every build target delivers the merge of all its CcInfo deps. The ocaml_binary rule that links its dependencies into an executable merges its CcInfo deps (which include merged CcInfo from their deps, recursively) and ends up with a single CcInfo containing every cc dependency in the dep graph, in the right order, with no duplicates. Then its simply a matter of constructing the link command with the appropriate =E2=80=93ccopt options. More succinctly: you can add a C dep directly to the module that needs it, and Bazel it pass it up the dependency chain, ensuring that it ends up on the command line when needed - building archives or executables. You don=E2=80=99t need to add a C dep to an archive target w= hen only one of n modules in the archive actually depends on it. I=E2=80=99ve just started working on rules_jsoo, which I think will nicely demonstrate the virtues of Bazel integration. The Bazel ecosystem includes a bunch of tools for working with Javascript; for example rules_js and rules_nodejs make it easy to control which node toolchain version to use, integrate npm stuff, etc. Wouldn=E2=80=99t it be nice to = be able to use such tools directly, without writing a bunch of glue code? Now a key element of Bazel integration is the use of providers. Rules deliver providers, and since providers act as a kind of rudimentary type system, I can use the JsInfo provider (defined by rules_js) to integrate rules_jsoo with the larger Bazel js ecoystem. For example, the jsoo_library rule takes the OcamlProvider provider delivered by ocaml_module rules, which contains the .cmo file. So jsoo_library runs those .cmo files through the jsoo compiler and delivers the resulting js files in a JsInfo provider. That provider is suitable as input to the rules in rules_js, which gives us seamless integration. So we can use the js_binary rule of rules_js to run code produced by jsoo_library under node. All that=E2=80=99s needed is to list the latter = as a dependency of the former. That=E2=80=99s the plan, anyway. Isn=E2=80=99t = that nice? Gregg Reynolds said and Daniel B=C3=BCnzli replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Ideally somebody learning a new language should not need to spend any time (at first) dealing with a build language too. This doesn=E2=80=99t only apply to learning. It also applies to prototypi= ng, hypothesis generation and testing. That=E2=80=99s the reason why I built [`brzo'] which I hope I=E2=80=99ll = be able to release at some point (still needs a good design review and changes to the OCaml strategy since it assumed we were moving towards a model that didn=E2=80=99t happen in the end =E2=80=93 namely the [library linki= ng proposal], I=E2=80=99d also like to add more languages to the mix but that could wai= t). None of my projects do not start with ~brzo~ing these days and the hassle free build experience is exhilarating. Build systems often are =E2=80=9Ccomplex and confusing=E2=80=9D, but that=E2=80=99s largely because the problem space itself is complex and confusing. There=E2=80=99s no getting around that. Note however that this is largely /accidental/ complexity due to the fact that compilers work in idiosyncratic ways for what build systems need in order to do their incremental and parallelization business. They are still stuck in a world where people would invoke their compiler manually at the cli level or specify the invocations themselves in a `Makefile'. In fact if it were not for the actual tools and the (lack) of information they give us, build is in fact an excessively simple problem. More specific to OCaml, the compiler clis have an insane amount of quirks and the whole system greatly suffers from an underspecified linking model. Basically it was not a good idea to let that be defined by a third party tool, if only so that you can actually talk about libraries in error messages from the compiler. [`brzo'] [library linking proposal] Orsetto: structured data interchange languages (release 1.1.2) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: james woodyatt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Announcing the release to OPAM of [Orsetto 1.1.2], an update to a personal project of mine not sponsored by my employer. Licensed with BSD 2-Clause. *Q. What is Orsetto?* Aspires to do eventually for OCaml more or less what [Serde] has done for Rust, i.e. to be a curated and self-contained collection of structured data interchange languages with a cohesive and unified model of serialization and deserialization. Two interchange languages are currently supported: [JSON ] and [CBOR ]. *Q. What is new in this release?* Mostly error corrections, particularly in the CBOR library, produced by improving test coverage. The change log for the release is here: [CHANGES.md ] Highlights: =E2=80=A2 Major improvements in test coverage. =E2=80=A2 Many corrections for logic errors. =E2=80=A2 A few minor usability improvements. Some things have not changed: =E2=80=A2 Still has no Programmer Guide or Tutorial, or really any introduction at all. =E2=80=A2 Still requires *ocamlfind* and builds with *omake*, which is currently not compatible with OCaml 5.0. =E2=80=A2 Still only supports JSON and CBOR. *Q. It looks incomplete. What are your plans for future development?* Yes, it=E2=80=99s a personal project, and yes, I=E2=80=99m aware there ar= e no reverse dependencies on it currently in the public OPAM repository. Still, I=E2= =80=99d welcome opportunities to collaborate with others who share my vision for the project. As long as it=E2=80=99s just me working on this, develop= ment will continue to be somewhat slow, as I=E2=80=99m prone to over-engineer things I care about. I have a lot of projects, and this is the only open source one. =E2=80=A2 *Orsetto 1.0.3* is the previous release. It offered parsers and emitter combinators for JSON and CBOR for OCaml >=3D 4.06.1 (including 4.13~alpha1). The quality of its JSON support is adequate, and it scores well on the >[nst/JSONTestSuite] tests. The quality of its CBOR support is provisional, >and not recommended. =E2=80=A2 *Orsetto 1.1.2* is the current release. It adds generalized and extensible structured data interchange models with specializations for producing emitters and parsers for JSON and CBOR. The quality of the CBOR support is much improved, and I=E2=80=99m using it with go= od results in other projects. Supported on OCaml >=3D 4.08. =E2=80=A2 *Orsetto 1.2* is the next planned release. It will drop interfa= ces marked `@caml.deprecated` in the 1.1 release. It will also drop support for OCaml < 4.10, and it will stop depending on **ocamlfind**. I hope to add a PPX for deriving parsers and emitters from OCaml data type definitions. I might also consider one or more new interchange languages=E2=80=94 suggestions are heartily encouraged. [Orsetto 1.1.2] [Serde] [JSON ] [CBOR ] [CHANGES.md ] [nst/JSONTestSuite] Interest in a Http_sig library? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Heyo all! I=E2=80=99ve been working on an activitypub server for a while = now, and while it=E2=80=99s still not yet complete, recently I=E2=80=99ve reac= hed a point where I realised that I=E2=80=99ve actually been sitting on some libraries that the community might benefit from, as the current ecosystem doesn=E2=80=99t seem to handle these things. One such component that seemed to be in a state that was suitable to split off from was a small helper module to implement a particular http signature scheme that seems to be rather common in the activitypub scene. In particular, the scheme I=E2=80=99m referring to is defined here: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Signing HTTP Messages =E2=94=82 draft-cavage-http-signatures-12 =E2=94=82=20 =E2=94=82 Abstract =E2=94=82 When communicating over the Internet using the HTTP protocol= , it can =E2=94=82 be desirable for a server or client to authenticate the send= er of a =E2=94=82 particular message. It can also be desirable to ensure that= the =E2=94=82 message was not tampered with during transit. This document =E2=94=82 describes a way for servers and clients to simultaneously add =E2=94=82 authentication and message integrity to HTTP messages by usi= ng a =E2=94=82 digital signature. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99ve written a small library that glues together some components = in the OCaml ecosystem to somewhat handle the signing (I have been mainly working off an =E2=80=9Cimplement-enough-to-make-the-system-work=E2=80=9D= process rather than directly transcribing the specification above): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (** [verify ~signed_string ~signature key] returns true iff =E2=94=82 [signature] over [signed_string] is valid according to [key]= . *) =E2=94=82 val verify: signed_string:string -> signature:string -> X509.Pu= blic_key.t -> bool =E2=94=82=20 =E2=94=82 (** [verify_request ~resolve_public_key req] verifies that a dr= eam =E2=94=82 request has been signed according to the HTTP signature sche= me *) =E2=94=82 val verify_request: =E2=94=82 resolve_public_key:(string -> (X509.Public_key.t, 'a) Lwt_res= ult.t) -> =E2=94=82 Dream.request -> (bool, 'a) result Lwt.t =E2=94=82=20 =E2=94=82 (** [build_signed_headers ~priv_key ~key_id ~headers ~body_str =E2=94=82 ~current_time ~method_ ~uri] returns a list of signed header= s using =E2=94=82 [priv_key] according to the HTTP signature scheme. [key_id] = should =E2=94=82 be a string that can be used to look up the public key assoc= iated =E2=94=82 with [priv_key]. *) =E2=94=82 val build_signed_headers: =E2=94=82 priv_key:X509.Private_key.t -> =E2=94=82 key_id:string -> =E2=94=82 headers:string StringMap.t -> =E2=94=82 body_str:string -> =E2=94=82 current_time:Ptime.t -> method_:string -> uri:Uri.t -> (strin= g * string) list =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The library is currently published at under the LGPL, but I haven=E2=80=99t released it on opam. Anyway, I was wondering if anyone else had interest in this kind of package, and whether it would be a good candidate for submission to opam - or if there are actually already existing libraries in the OCaml ecosystem that would actually already do this. Outreachy summer =E2=80=9922 closing commemoration session on 23rd Sept =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thank you to everyone that could make it to the presentation today. The presentation is now live: :camel: In particular a massive congratulations and thank you to @moazzammoriani and @IIITM-Jay. Thank you also to @sudha for being the driving force behind making the presentation happen again this round! See you all for the next round! Aside: if anybody has any issues with the live video please do reach out here either publicly or privately, we gave prior warning of our intentions to record and put the video on watch.ocaml.org, but I appreciate some people joined a little later/might have some reservations etc. findlib-1.9.6 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 findlib-1.9.6 is out, now supporting OCaml-5.00 (as far as we know it). There are also a few other install-related fixes in it. For manual, download, manuals, etc. see here: An updated OPAM package will follow soon. Interesting OCaml Articles =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Deep in this thread, alan said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 An interesting paper that uses OCaml is by Francois Pottier, which gives a declarative DSL for implementing type rules with applicative functors. It has an associated library, . Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Tarides Sponsors High School Hackers] [the ocaml.org blog] [Tarides Sponsors High School Hackers] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I=E2=80=99ll= mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe [online]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [online] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 20 to 27, 2= 022.

    Esperanto, when OCaml meets Cosmopolitan

    Calascibetta Romain announced

    I am delighted to present the first experimental release of Esperant= o. This project is a new OCaml toolchain that creates binaries compiled with the Cosmopolitan C library and linked with the =CE=B1c=CF=84=C2=B5=CE=B1lly p=CE=B4r=CF=84=CE=B1bl=CE=B5 =CE=B5x=CE=B5c=C2=B5=CF=84=CE=B1bl=CE=B5 l= ink script. The binary produced is then portable to different platforms:

    3D"linux= 3D"w= 3D"msd= 3D"macos= 3D"f= 3D"ope= 3D"net=

    The main objective of Esperanto is to provide a toolchain capable of produc= ing a portable binary from an existing project. This would allow to finally be able to distribute software for all= these platforms without having to:

    1. manage multiple platforms orthogonally, the Cosmopolitan C library offe= rs you the POSIX API for all platforms (including Windows)
    2. Produce several versions of the same software for each platform. Only t= he binary is needed to run on all platforms

    Cosmopolitan does not however produce a binary with a multi-platform= assembler. At this stage, our distribution only supports the x86_64 assembler (the most common one) but w= e are working on the possibility to produce a binary with different assemblers.

    I would like to give special thanks to Justine, the author of the Cosmopoli= tan project (to develop redbean, a small portable HTTP server)= for her excellent work.

    A toolchain

    In OCaml, the “toolchain” principle allows the existence of sev= eral compilers within an OPAM switch and to choose one of them when it comes to cross-compiling a project. This principle, eve= n though it is not clearly defined and even though its use remains very limited, exists through the `ocamlfind` to= ol.

    You can find these toolchains in your switch:

    $ ls $<=
    span style=3D"color: #375cd8;">(opam var lib)/findlib.conf.d/
    esperanto.conf solo5.conf
    

    >>From our experience with Mirage as well as the work done in dune regarding cross-compilation, the choice to propose a new toolchain in order to allow = cross-compilation of projects with OPAM is both a historical choice but also the most relevant one in our opinion [1].

    • Why we need to cross-compile?

      The term cross-compilation can be misunderstood if we only consider the que= stion of the assembler issued by the compiler (does it match the host assembler or not). In our case, cross-comp= ilation is a broader term that implies the use of external artefacts to the compiler that are different from the d= efault and the use of compiler options that must be used throughout the production of the final binary.

      In other words, even though we are emitting the same assembler, we are doin= g so in a different “context” which requires the definition of a new toolchain= which includes our artefacts and compiler options.

      One of these artefacts is of course the C library used by the compiler whic= h will then be systematically used by the runtime caml, the well named libasmr= un.a. This is why, for example, there is a version of OCaml with musl. So there must be a version of = OCaml with Cosmopolitan.

      This new toolchain also allows you to incl= ude the necessary options for compiling C files because, yes, you can compile a C file with ocamlopt.

      In order to provide a coherent workflow fo= r a project, we need to provide not only a libasmrun.a compile= d with our Cosmopolitan C library but also an OCaml compiler capable of invoking t= he C compiler with the right options required by Cosmopolitan.

      Finally, we also need to describe in this toolcha= in how to link the object files together to actually produce a portable binary using the APE script.

    • A simple example with this new toolchain

      Installing Esperanto is very easy with OPAM. It will install the cross-comp= iler and the necessary files so that ocamlfind~/~dune can recognise this new toolchain:

      $ opam install esperanto
      

      Finally, let’s try to produce a simple binary that displays “He= llo World!”:

      $ cat &=
      gt;main.ml <<EOF
      let () =3D print_endlin=
      e "Hello World!"
      EOF
      $ ocamlfind -toolchain opt main.ml
      $ objcopy -S -O binary a.out
      $ file a.out
      a.out: DOS/MBR boot sector
      

      The binary produced can already be executed. However, there are still some = issues that have been fixed since then but which are probably not yet integrated in your system. They concern zsh and binfmt_misc in particular.

      The first problem with zsh is that it does not recognise the b= inary correctly. This problem has been fixed in the latest version of zsh.5.9.0.

      $ zsh --version
      zsh 5.8.1
      $ zsh
      $ ./a.out
      zsh: exec format error: ./a.out
      

      The second problem concerns binfmt_misc which intervenes upstr= eam at the execution of your programs in order to choose how to execute them. In this case, binfmt_misc recognis= es Cosmopolitan binaries as Windows software by default.

      Here too, a solution is available and described by the author of Cosmopolit= an here: APE loader<= /a>

    Issues

    Apart from the outcomes described above, however, the Esperanto toolchain i= s not complete. Indeed, the OCaml distribution gives several libraries such as unix.cmxa and threads.cmxa. A little work has been done to make the former available. The second one is however unavailable for the moment sinc= e Cosmopolitan only partially implements pthread.

    However, it seems that the author of Cosmopolotian wants to implement the r= est of the pthread API which will then allow us to provide support for threads.cmxa and OCaml 5.

    This of course makes support for the projects more limited than we imagined= (and that’s why this release is experimental) however, an effort has already been made to lwt into Cosmopol= itan’s hypothetical future support for pthread.

    Future

    As explained above, support for threads.cmxa and OCaml 5 remai= ns the priority. however, an effort has already been made to support Lwt via Cos= mopolitan’s hypothetical future support for pthread.

    However, it is possible that Cosmopolitan could become a target for the Mir= ageOS project in the same way as Solo5 (or our recent experiment on Raspberry Pi 4).

    In this sense, we will surely propose an integration in MirageOS so that pr= ojects can both produce unikernels with Solo5 or portable binaries with Cosmopolitan.

    [1] However, the question remains open at several levels, that of the compi= ler, that of OPAM and of course that of dune. It is clear that= the current situation is not the best in terms of what we need to do to pr= oduce such a cross-compiler. Only the feedback from Solo5 (which requires c= ross-compilation) allows us to say that it is surely the right choice for w= hat we want to offer.

    Conclusion

    We hope that this project will facilitate the distribution of software. You= can read a more technical article about our work here.= Finally, I would like to thank robur.io = (an association you can help) for a= llowing me to do this project.

    EDIT: The author of Cosmopolitan just released Cosmopolitan with pthread support. So we will definitely try to improve our distribution to include OCaml with threads.cmxa su= pport and move forward with OCaml 5!

    OBazl Toolsuite - tools for building OCaml with Bazel

    Deep into this thread, Yawar Amin asked and Gregg Rey= nolds replied

    Doesn=E2=80=99t dune get advertised as being able to handle multiple progra= mming languages, including C/C++?

    There’s really no comparison. Dune evidently can use the (C ABI) outp= uts of a “foreign” build (if you write the glue code needed to make this work) but there’s no real build integ= ration, and no hermeticity guarantees. Under Bazel different languages use different rulesets but they’re all Bazel rule= sets, so you get one dependency graph across all languages, and if the rulesets are hermetic you get a hermetic build. = Without ABI restrictions. For example if your build needs to run a Python (or Javascript, Ruby, whatever) tool, Baze= l will build the tool and run it for you.

    Even for C I think Bazel has much better integration. The rules in rules_c= c (e.g. cc_library producing a .a file) deliver a CcInfo provider (a provider is a kind of struct whose fields cont= ain the artifacts delivered by a build action). The rules in rules_ocaml (e.g. ocaml_module) understand CcInfo de= pendencies and pass them around using OcamlProvider (a provider specific to the ocaml rules). Bazel supports a me= rge operation for CcInfo, and the ocaml rules always merge their CcInfo deps and pass them on. So every build targe= t delivers the merge of all its CcInfo deps. The ocaml_binary rule that links its dependencies into an executable = merges its CcInfo deps (which include merged CcInfo from their deps, recursively) and ends up with a single CcInf= o containing every cc dependency in the dep graph, in the right order, with no duplicates. Then its simply a matter= of constructing the link command with the appropriate –ccopt options. More succinctly: you can add a C dep= directly to the module that needs it, and Bazel it pass it up the dependency chain, ensuring that it ends up on the c= ommand line when needed - building archives or executables. You don’t need to add a C dep to an archive= target when only one of n modules in the archive actually depends on it.

    I’ve just started working on rules_jsoo, which I think will nicely de= monstrate the virtues of Bazel integration. The Bazel ecosystem includes a bunch of tools for working with Javascript; = for example rules_js and rules_nodejs make it easy to control which node toolchain version to use, integrate npm = stuff, etc. Wouldn’t it be nice to be able to use such tools directly, without writing a bunch of glue code? Now= a key element of Bazel integration is the use of providers. Rules deliver providers, and since providers act as = a kind of rudimentary type system, I can use the JsInfo provider (defined by rules_js) to integrate rules_jsoo with = the larger Bazel js ecoystem. For example, the jsoo_library rule takes the OcamlProvider provider delivered b= y ocaml_module rules, which contains the .cmo file. So jsoo_library runs those .cmo files through the jsoo compiler= and delivers the resulting js files in a JsInfo provider. That provider is suitable as input to the rules in rules_j= s, which gives us seamless integration. So we can use the js_binary rule of rules_js to run code produced by jsoo_l= ibrary under node. All that’s needed is to list the latter as a dependency of the former. That’s the plan, a= nyway. Isn’t that nice?

    Gregg Reynolds said and Daniel B=C3=BCnzli replied

    Ideally somebody learning a new language should not need to spend any time = (at first) dealing with a build language too.

    This doesn’t only apply to learning. It also applies to prototyping, = hypothesis generation and testing.

    That’s the reason why I built brzo which I hope I’ll be able to release at some point (still needs a good design review and changes to the OCaml strat= egy since it assumed we were moving towards a model that didn’t happen in the end =E2=80=93 namely the library linking proposal, I’d also like to add more languages to the mix but that= could wait).

    None of my projects do not start with ~brzo~ing these days and the hassle f= ree build experience is exhilarating.

    Build systems often are =E2=80=9Ccomplex and confusing=E2=80=9D, but that= =E2=80=99s largely because the problem space itself is complex and confusing. There=E2=80=99s no getting around that.

    Note however that this is largely accidental complexity due to the f= act that compilers work in idiosyncratic ways for what build systems need in order to do their incremental and paralleliz= ation business.

    They are still stuck in a world where people would invoke their compiler ma= nually at the cli level or specify the invocations themselves in a Makefile.

    In fact if it were not for the actual tools and the (lack) of information t= hey give us, build is in fact an excessively simple problem.

    More specific to OCaml, the compiler clis have an insane amount of quirks a= nd the whole system greatly suffers from an underspecified linking model. Basically it was not a good idea to let th= at be defined by a third party tool, if only so that you can actually talk about libraries in error messages from t= he compiler.

    Orsetto: structured data interchange languages (release 1.1.2)=

    james woodyatt announced

    Announcing the release to OPAM of Orsetto 1.1.2, an update to a personal project of mine not sponsored by my employer. Licensed with BSD 2-Clause.

    Q. What is Orsetto?

    Aspires to do eventually for OCaml more or less what Serde has done for Rust, i.e. to be a curated and self-contained collection of structured data interchange langua= ges with a cohesive and unified model of serialization and deserialization.

    Two interchange languages are currently supported: JSON and CBOR .

    Q. What is new in this release?

    Mostly error corrections, particularly in the CBOR library, produced by imp= roving test coverage.

    The change log for the release is here: CHANGES.md

    Highlights:

    • Major improvements in test coverage.
    • Many corrections for logic errors.
    • A few minor usability improvements.

    Some things have not changed:

    • Still has no Programmer Guide or Tutorial, or really any introduction a= t all.
    • Still requires ocamlfind and builds with omake, which is = currently not compatible with OCaml 5.0.
    • Still only supports JSON and CBOR.

    Q. It looks incomplete. What are your plans for future development?

    Yes, it=E2=80=99s a personal project, and yes, I’m aware there are no= reverse dependencies on it currently in the public OPAM repository. Still, I=E2=80=99d welcome opportunities to collaborate wi= th others who share my vision for the project. As long as it=E2=80=99s just me working on this, development will continue to = be somewhat slow, as I’m prone to over-engineer things I care about. I have a lot of projects, and this is the only open so= urce one.

    • Orsetto 1.0.3 is the previous release. It offered parsers and em= itter combinators for JSON and CBOR for OCaml >=3D 4.06.1 (including 4.1= 3~alpha1). The quality of its JSON support is adequate, and it scores well = on the >nst/JSONTestSui= te tests. The quality of its CBOR support is provisional, >and not r= ecommended.
    • Orsetto 1.1.2 is the current release. It adds generalized and ex= tensible structured data interchange models with specializations for produc= ing emitters and parsers for JSON and CBOR. The quality of the CBOR support= is much improved, and I’m using it with good results in other projec= ts. Supported on OCaml >=3D 4.08.
    • Orsetto 1.2 is the next planned release. It will drop interfaces= marked `@caml.deprecated` in the 1.1 release. It will also drop support fo= r OCaml < 4.10, and it will stop depending on ocamlfind. I= hope to add a PPX for deriving parsers and emitters from OCaml data type d= efinitions. I might also consider one or more new interchange languages=E2= =80=94 suggestions are heartily encouraged.

    Interest in a Http_sig library?

    Kiran Gopinathan announced

    Heyo all! I’ve been working on an activitypub server for a while now,= and while it’s still not yet complete, recently I’ve reached a point where I realised that I’ve actual= ly been sitting on some libraries that the community might benefit from, as the current ecosystem doesn’t seem to handle t= hese things.

    One such component that seemed to be in a state that was suitable to split = off from was a small helper module to implement a particular http signature scheme that seems to be rather common= in the activitypub scene.

    In particular, the scheme I’m referring to is defined here: https://datatracker.ietf.org/doc/html/draft-cavage-http-signatures-1= 2

                             Signing HTTP Messages
                        draft-cavage-http-signatures-12
    
    Abstract
       When communicating over the Internet using the HTTP protocol, it can
       be desirable for a server or client to authenticate the sender of a
       particular message.  It can also be desirable to ensure that the
       message was not tampered with during transit.  This document
       describes a way for servers and clients to simultaneously add
       authentication and message integrity to HTTP messages by using a
       digital signature.
    

    I’ve written a small library that glues together some components in t= he OCaml ecosystem to somewhat handle the signing (I have been mainly working off an “implement-enough-to-make-= the-system-work” process rather than directly transcribing the specification above):

    (** [verify ~signed_str=
    ing ~signature key] returns true iff
       [signature] over [signed_string] is valid ac=
    cording to [key]. *)
    val verify: signed_=
    string:string -> signature=
    :string -> X509.Public_key.t ->=
    ; bool
    
    (** [verify_request ~resolve_public_key req] verifies that a dream
       request has been sig=
    ned according to the HTTP signature scheme *)
    val verify_request:
      resolve_public_key:(string -> (=
    X509.Public_key.t, 'a) Lwt_result.t) ->
      Dream.request -> (bool, 'a) res=
    ult Lwt.t
    
    (** [build_signed_headers ~priv_key ~key_id ~header=
    s ~body_str
       ~current_time ~method_ ~uri] returns a list of signed he=
    aders using
       [priv_key] according to the HTT=
    P signature scheme. [key_id] should
       be a string that can=
     be used to look up the public key associated
       with [priv_key]. *)
    val build_signed_headers:
      priv_key:X509.Private_key.t ->
      key_id:string ->
      headers:string StringMap.t ->
      body_str:string ->
      current_time:Ptime.t -> method_:string -> uri:Uri.t -> (string * string) list
    

    The library is currently published at https://github.com/Gopiandcode/http_sig_ocaml unde= r the LGPL, but I haven’t released it on opam.

    Anyway, I was wondering if anyone else had interest in this kind of package= , and whether it would be a good candidate for submission to opam - or if there are actually already existin= g libraries in the OCaml ecosystem that would actually already do this.

    Outreachy summer ’22 closing commemoration session on 23= rd Sept

    Patrick Ferris announced

    Thank you to everyone that could make it to the presentation today. The pre= sentation is now live: https://watch.ocaml.org/videos/watch/dc5bbf5b-3dd9-4c8d-b26a-71e= 730a67788 :camel:

    In particular a massive congratulations and thank you to @moazzammoriani an= d @IIITM-Jay. Thank you also to @sudha for being the driving force behind making the presentation happen again thi= s round! See you all for the next round!

    Aside: if anybody has any issues with the live video please do reach out he= re either publicly or privately, we gave prior warning of our intentions to record and put the video on watch.ocaml.= org, but I appreciate some people joined a little later/might have some reservations etc.

    findlib-1.9.6

    Gerd Stolpmann announced

    findlib-1.9.6 is out, now supporting OCaml-5.00 (as far as we know it). There are also a few other install-related fixes in it.

    For manual, download, manuals, etc. see here:

    http://proje= cts.camlcity.org/projects/findlib.html

    An updated OPAM package will follow soon.

    Interesting OCaml Articles

    Deep in this thread, alan said

    An interesting paper that uses OCaml is http://gallium.inria.fr/~fpottie= r/publis/fpottier-elaboration.pdf by Francois Pottier, which gives a declarative DSL for implementing type rules= with applicative functors. It has an associated library, ht= tps://opam.ocaml.org/packages/inferno/.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I’ll mail it to you, or go take= a look at the archive or= the RSS feed of the a= rchives.

    If you also wish to receive it every week by mail, you may subscribe online.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=iSFM4Et0; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=r9KqhGTj; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 370DAB80123 for ; Tue, 19 Mar 2024 15:09:11 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=CzWy3W/4sUidaKOw6VXaBnqDwYWkRCG+UaIwbg0vlKo=; b=iSFM4Et0vsR0sxmjy3O4d4d4/Yfv24HUe8k5/i6DRdLAvU2OaKi6BfVo ZqcglBjNIpoq2TBhwa7K5ppMaSOXPaTYCUSvsJg9NCaV48IkyrRXICDGA 2hZabOC4a+c5xRuLtv+yGnb7E0xh9bRl4P2aKBrJ1IFaVhgDs/SAaSiKS E=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,137,1708383600"; d="scan'208,217";a="157434029" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Mar 2024 16:09:08 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7BC9BE0146; Tue, 19 Mar 2024 16:09:08 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 413E8E0145 for ; Tue, 19 Mar 2024 16:09:05 +0100 (CET) IronPort-SDR: 65f9aa90_2aGo0tlYEStprGMa6ObjC+ZNvgFepL2bCmIgSAFSIEi/3q5 Op+a8mfc3z9n9XgnFVeiSL4ec69OkDvNwLqR1vw== X-IPAS-Result: =?us-ascii?q?A0FsAQCgqflllyIeaIFaAYJXgTZbKBkBYlYyBwhIA4QXP?= =?us-ascii?q?INPjhiRRYg/gjCBVhSBLBYjFAEDAQ0uAQ4EAQIEAQEDAQIBgguCdAKIAwIfB?= =?us-ascii?q?gEEMAkOAQIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBAQEBA?= =?us-ascii?q?TcFEDWFbA2CPxkVI2tjAgYDNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIIBAEQJ1YOAQIGChMBATIGGCMDFAEGAwIRATUDA?= =?us-ascii?q?RMBEhQGAoIMFEQBgl8DBQwGlm6bOnqBMoEBggoBAQaBCD4CAQsCAgMBDgklA?= =?us-ascii?q?a8HgWEJgTAYiAwaAWpoAoQGGwmEMycPgVVEgUqBVmcHb4I/CxcBAQEBGIERA?= =?us-ascii?q?RECAQ4MDyQJgyWCaIEYKVaBKoFoAyaCKwOBPYFaEIMfgQEmgXIBhWIETwEHF?= =?us-ascii?q?WqCK0GBG0KGN4FNgSIIaxsQHjcREBMNAwhuHQIxOgMFAwQyChIMCx8FVANDB?= =?us-ascii?q?kkLAwIaBQMDBIEuBQ0aAhAsJgMDEkkCEBQDOAMDBgMKMTBVQQxQA2QfMgk8D?= =?us-ascii?q?wwaAhsUDSQjAiw+AwkKEAIWAx0WBDARCQsmAyoGNgISDAYGBl0gFgkEJQMIB?= =?us-ascii?q?ANSAyByEQMEGgQLB3iBSoF1BBNEAxCBNIdJglmDQoIhgl4DRB1AAwttPTUUG?= =?us-ascii?q?yiiYngCAYIRDgstBgEPGxMPBwYIAgEDFA4FAQcMCBANCgkCLggOCwIGGAoFF?= =?us-ascii?q?BEVDgITBhAZBggDCwItA5IrFCgsAXKOIo4ElEs0B4QVgVsGDIh5gSSVaoQFg?= =?us-ascii?q?VaLJphJZCKYPSCCM4caCoEbCYFsaZUqFAQDAQsNGYMigXOBZDpsPwEbAgwHM?= =?us-ascii?q?xowQ4IzATMJCjwcD4R3iTUWgQwBBASCQ4E+gkpRO4pmQjUCAQEOKQIHAQoBA?= =?us-ascii?q?QMJhWIBAYM+gUcBAQ?= IronPort-PHdr: A9a23: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 shiZvT23fGndpVTWij1G2VAdkPIvyVrzwBc IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:cmy9FqE8rKx9i6JGpLqE5ceALOsnbusQ8zAXPo5KKSC9Ffbo9P xG/c5w6faaslcssR0b9uxofZPvfZqjz+8W3WBhB9qftWDd0QPCEGgh1/qG/9SKIUHDH4BmpM NdmtBFebrNMWQ= X-Talos-CUID: 9a23:UaKmNG1qR8lwmekaT4AQy7xfBMoJKjrFlVjrIBGSDXo3EaG0SEGz5/Yx X-Talos-MUID: 9a23:GdYjhwunHJI1dZ3WFs2n2xppc+liv/6SN0FXgZFZocCBFXJNEmLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,137,1708383600"; d="scan'208,217";a="157433980" X-MGA-submission: =?us-ascii?q?MDHOKxA09TXR253LaIidCN7MtMS5YcYsNO6jDZ?= =?us-ascii?q?S3n85sb6abaQuKopB2zNKCXrN7mTpum6fU+VqvKep7V85Pim7QTEQcEE?= =?us-ascii?q?Bv6X1nEOywwuZ8Uxt/HENRomYSOTWPKMMPNa9+r5yHnvVoKxNE0FYENd?= =?us-ascii?q?y6IRgLPA/LHtGVDtV78zN7jg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Mar 2024 16:09:04 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1244E560008; Tue, 19 Mar 2024 16:09:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1710860943; bh=FfrnDF7K7IH9fzYR5Yz8QzxfPMQIxuhRGSegXpm9nv8=; h=From:To:Subject:Date:Message-ID; b=r9KqhGTjTgPD8c3t8bokRyjsnq0Xz7c4X5BV9DcKZC+HpIG6B/5eNRcs+tueyBt+H H/7ep99WZhlaCVqGwdEMfsqINc2eAum+DsQSQs3ry/vix+WqNrwzcM6ph4e8Tyemcu UUCc9UfEJkZaDFnDk2QvjiiwDcIaB+pSmnOxOPxA= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 19 Mar 2024 16:09:01 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 19 16:09:03 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.313750, queueID=71B8656007C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19102 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 12 to 19, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 dune 3.14 Announcing OCaml Manila Meetups Outreachy internship demo session OCaml 4.14.2 released Docfd 3.0.0: TUI multiline fuzzy document finder Shape with us the New OCaml.org Community Area! Opam-repository: Updated documentation, retirement and call for maintainers DkCoder 0.1.0 A Versatile OCaml Library for Git Interaction - Seeking Community Feedback Other OCaml News Old CWN dune 3.14 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Marek Kubica announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce that Dune 3.14.2 is now available. Note that due to a regression that was detected before publishing to opam version `3.14.1' should not be used. The fix for the regression is part of this release. This feature brings some small bugfixes around the handling of Coq as well as solves an issue where Dune is running on Windows in a path that contains Unicode characters. This affected e.g. users with diacritics or non-latin script in their name when running Dune within their home directory. =E2=80=A2 When a directory is changed to a file, correctly remove it in subsequent `dune build' runs. (#9327, fix #6575, @emillon) =E2=80=A2 Fix a problem with the doc-new target where transitive dependen= cies were missed during compile. This leads to missing expansions in the output docs. (#9955, @jonludlam) =E2=80=A2 coq: fix performance regression in coqdep unescaping (#10115, f= ixes #10088, @ejgallego, thanks to Dan Christensen for the report) =E2=80=A2 coq: memoize coqdep parsing, this will reduce build times for C= oq users, in particular for those with many .v files (#10116, @ejgallego, see also #10088) =E2=80=A2 on Windows, use an unicode-aware version of `CreateProcess' to = avoid crashes when paths contains non-ascii characters. (#10212, fixes #10180, @emillon) =E2=80=A2 fix compilation on non-glibc systems due to `signal.h' not being pulled in spawn stubs. (#10256, @emillon) Announcing OCaml Manila Meetups =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm thrilled to announce the OCaml Manila Meetup! Seeing that OCaml doesn't seem to have reached the Philippines just yet (I wasn't able to find existing OCaml or FP communities), the goal is to build one, starting small, with a few people meeting every month in a coffee to hack on fun projects, and letting it grow organically. The inaugural event is scheduled for the 4th of April: If you're living in Manila, or if you know anyone who would be interested in joining, please don't hesitate to reach out! I would also greatly appreciate retweets if you happen to be on Twitter: Happy hacking! Outreachy internship demo session =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The recording from the demo session is now live on watch.ocaml.org :camel: OCaml 4.14.2 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 We have the pleasure of celebrating the birthday of Grace Chisholm Young by announcing the release of OCaml version 4.14.2. This release is a collection of safe bug fixes, cherry-picked from the OCaml 5 branch. If you are still using OCaml 4.14 and cannot yet upgrade to OCaml 5, this release is for you. The 4.14 branch is expected to receive updates for at least one year, while the OCaml 5 branch is stabilising. Thus don't hesitate to report any bugs on the OCaml issue tracker (at ). See the list of changes below for more details. Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 4.14.2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the release candidate is also directly available on: =E2=80=A2 [GitHub] =E2=80=A2 [Inria archive] [GitHub] [Inria archive] Changes since OCaml 4.14.1 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C =E2=97=8A Runtime system: =E2=80=A2 [#11764], [#12577]: Add prototypes to old-style C function definitions and declarations. (Antonin D=C3=A9cimo, review by Xavier Leroy and Nick Barnes) =E2=80=A2 [#11763], [#11759], [#11861], [#12509], [#12577]: Use strict prototypes on primitives. (Antonin D=C3=A9cimo, review by Xavier Leroy, David Allsopp, S=C3=A9bastien Hinderer and Nick Barnes) =E2=80=A2 (*breaking change*) [#10723]: do not use `-flat-namespace' link= ing for macOS. (Carlo Cabrera, review by Damien Doligez) =E2=80=A2 [#11332], [#12702]: make sure `Bool_val(v)' has type `bool' in = C++ (Xavier Leroy, report by ygrek, review by Gabriel Scherer) [#11764] [#12577] [#11763] [#11759] [#11861] [#12509] [#10723] [#11332] [#12702] Build system: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [#11590]: Allow installing to a destination path containing spa= ces. (=C3=89lie Brami, review by S=C3=A9bastien Hinderer and David Allsopp) =E2=80=A2 [#12372]: Pass option -no-execute-only to the linker for OpenBS= D >=3D 7.3 so that code sections remain readable, as needed for closure marshaling. (Xavier Leroy and Anil Madhavapeddy, review by Anil Madhavapeddy and S=C3=A9bastien Hinderer) =E2=80=A2 [#12903]: Disable control flow integrity on OpenBSD >=3D 7.4 to= avoid illegal instruction errors on certain CPUs. (Michael Hendricks, review by Miod Vallat) [#11590] [#12372] [#12903] Bug fixes: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 [#12061], [#12063]: don't add inconsistent equalities when comp= uting high-level error messages for functor applications and inclusions. (Florian Angeletti, review by Gabriel Scherer) =E2=80=A2 [#12878]: fix incorrect treatment of injectivity for private recursive types. (Jeremy Yallop, review by Gabriel Scherer and Jacques Garrigue) =E2=80=A2 [#12971], [#12974]: fix an uncaught Ctype.Escape exception on s= ome invalid programs forming recursive types. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani) =E2=80=A2 [#12264], [#12289]: Fix compact_allocate to avoid a pathological case that causes very slow compaction. (Damien Doligez, report by Arseniy Alekseyev, review by Sadiq Jaffer) =E2=80=A2 [#12513], [#12518]: Automatically enable emulated `fma' for Vis= ual Studio 2019+ to allow configuration with either pre-Haswell/pre-Piledriver CPUs or running in VirtualBox. Restores parity with the other Windows ports, which don't require explicit `--enable-imprecise-c99-float-ops'. (David Allsopp, report by Jonah Beckford and Kate Deplaix, review by S=C3=A9bastien Hinderer) =E2=80=A2 [#11633], [#11636]: bugfix in caml_unregister_frametable (Fr=C3= =A9d=C3=A9ric Recoules, review by Gabriel Scherer) =E2=80=A2 [#12636], [#12646]: More prudent reinitialization of I/O mutexes after a fork() (Xavier Leroy, report by Zach Baylin, review by Enguerrand Decorne) =E2=80=A2 (*breaking change*) [#10845] Emit frametable size on amd64 BSD (OpenBSD, FreeBSD, NetBSD) systems (emitted for Linux in [#8805]) (Hannes Mehnert, review by Nicol=C3=A1s Ojeda B=C3=A4r) =E2=80=A2 [#12958]: Fix tail-modulo-cons compilation of try-with, && and = || expressions. (Gabriel Scherer and Nicol=C3=A1s Ojeda B=C3=A4r, report = by Sylvain Boilard, review by Gabriel Scherer) =E2=80=A2 [#12116], [#12993]: explicitly build non PIE executables on x86 32bits architectures (Florian Angeletti, review by David Allsopp) =E2=80=A2 [#13018]: Don't pass duplicate libraries to the linker when compiling ocamlc.opt and when using systhreads (new versions of lld emit a warning). (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r) [#12061] [#12063] [#12878] [#12971] [#12974] [#12264] [#12289] [#12513] [#12518] [#11633] [#11636] [#12636] [#12646] [#10845] [#8805] [#12958] [#12116] [#12993] [#13018] Docfd 3.0.0: TUI multiline fuzzy document finder =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi all, I am happy to announce Docfd 3.0.0, which adds a non-interactive search mode and support of DOCXs and other file formats via `pandoc', as well as many polishes. [Repo] Think interactive grep for text files, PDFs, DOCXs, etc, but word/token based instead of regex and line based, so you can search across lines easily. Docfd aims to provide good UX via integration with common text editors and PDF viewers, so you can jump directly to a search result with a single key press. [Repo] Demos =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Navigating repo: Quick search with non-interactive mode: PDF navigation: Shape with us the New OCaml.org Community Area! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Claire Vandenberghe announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m reaching out to request a few minutes of your time to review = the wireframe for the OCaml community area. Following user interviews with those unfamiliar with OCaml, we gathered insights on what would be helpful for you landing on the community page. As a result, we=E2=80=99re restructuring aspects of the pages and content= on the landing page. This is a wireframe, so the focus is on checking the navigation, layout, and content, not the User Interface (UI). Your feedback are needed at this stage, and please feel free to leave comments directly on Figma, via email, or let=E2=80=99s schedule a quick call. Thank you for participating in this review. Have a great day and week ahead. Link: Page: =E2=80=9CWireframe=E2=80=9D Opam-repository: Updated documentation, retirement and call for maintainers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 After having been maintainer of opam-repository for the past 6 and half years, I'm publicly announcing my retirement from it, to focus on opam itself. This change has been more or less already in effect since September last year (following a burnout) and I have since been working on writing enough documentation so that my move away from opam-repository can be as smooth as possible. This documentation is now live in: =E2=80=A2 [CONTRIBUTING.md]: documentation at destination of package maintainers. This document has been rewritten in hopes of being more helpful for beginner and well as experimented publishers. =E2=80=A2 the [opam-repository wiki], which now also includes: =E2=80=A3 a [FAQ] =E2=80=A3 [informations about the infrastructure] =E2=80=A3 a [governance / points of contacts] document =E2=80=A3 a helper on [How To deal with CI] =E2=80=A3 a list of all the [current policies] i could think of, as wel= l as their reasoning and exceptions. These policies were previously mostly passed down orally, most of them have been in place since the very beginning =E2=80=A3 several documents at destination of current opam-repository maintainers and opam-repository maintainers in training, all freely accessible for the curious eyes (although rereading them now, i will admit those documents are not my finest work, as they were the first ones i wrote in the past 6 months =F0=9F=99=88) Any improvements to these documents are also welcome. To contribute simply open a PR on opam-repository, or a ticket on the [opam-repository bugtracker] to contribute to the wiki. Hopefully, all these documents are a solid enough base so that they get updated as time goes on, by current and future opam-repository maintainers. I'm also writing this post to call for said future opam-repository maintainers: if you want to become a maintainer, feel free to contact @mseri and @raphael-proust. I do recommend the experience of working with them on opam-repository =F0=9F=98=8A [CONTRIBUTING.md] [opam-repository wiki] [FAQ] [informations about the infrastructure] [governance / points of contacts] [How To deal with CI] [current policies] [opam-repository bugtracker] DkCoder 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I wrote an article [DkCoder: Intro to Scripting] that describes a very early cut of OCaml-ified scripting: Hello Builder! Scripting is a small, free and important piece of DkSDK. Walk with me as we use the DkSDK tool "*DkCoder*" to write little scripts that become full-fledged programs. My hope is that /within minutes/ you feel like your dev experience is as productive as in Python, but enhanced so you: 1. have nothing to install except Git and optionally Visual Studio Code 2. have safe and understandable code ("static typing") DkCoder is a transparently installed OCaml 4.14 environment with one API: run a script. It shouldn't be confused with conventional OCaml distributions, although underneath DkCoder has the conventional bytecode binaries=C2=B9, and `dune' and `ocamllsp'. No C compiler, Cygwin/MSYS2, Homebrew or MacPorts are needed. Please skim the article for the exact Windows/macOS/Linux requirements. It grew out of two things: 1. My frustrations sharing scripts with others. It was easy for inter-dependencies between scripts to break POSIX shell scripts (the basis of the DkML installer) and CMake scripts (most of my tools). 2. My need to have a good delivery vehicle for my own software. Please don't do anything major with DkCoder yet. In fact, if you think you'll be using DkCoder for your own scripts or your own software, please send me a message so I can prioritize/deprioritize. I'd like to thank @octachron for the [codept analyzer]. It is lightly used now but as hinted in the Security section of the article it will become much more important. And also thanks to the projects that have fixed their newly discovered bytecode-only bugs over the past two months. =C2=B9: Actually, I bundle a new binary called `ocamlrunx' which is a DT_NEEDED/LC_LOAD_DYLIB re-linking of `ocamlrun' against all the C libraries (`ffi', `SDL2*' and their deps today) to get macOS and Linux bytecode working. [DkCoder: Intro to Scripting] [codept analyzer] A Versatile OCaml Library for Git Interaction - Seeking Community Feedback =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Mathieu Barbin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've recently pushed updates to the [vcs] public repo with most of the contents of my early draft. For those interested in early experimentation, I've created a release on my custom opam-repository. The interface is still very a work in progress, but you can already see how the pieces fit together. In particular, the [provider] component, which is crucial for the dynamic dispatch implementation of `vcs', is now available on opam. The `vcs' project serves as a good real-world example of the capabilities this provides. Please feel free to open issues on GitHub with general feedback, requests, or to start a discussion. @kopecs, I don't have a precise timeline for an initial publication on opam yet. I've created this [milestone] if you'd like to follow the progress or leave a comment. Thank you for your interest! @paurkedal: Your setup has been a great source of inspiration for me, and I've found it incredibly helpful. Thank you so much! @samoht: I chose the approach that felt most comfortable for this particular project, but I greatly appreciate your input. I'll definitely keep your suggestions in mind for future projects. Thanks! [vcs] [provider] [milestone] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [My experience at IndiaFOSS 2023: Community, Workshop, and Talk= s] =E2=80=A2 [Lean 4: When Sound Programs become a Choice] [the ocaml.org blog] [My experience at IndiaFOSS 2023: Community, Workshop, and Talks] [Lean 4: When Sound Programs become a Choice] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 12 to 19, 2024.

    dune 3.14

    Marek Kubica announced

    We're happy to announce that Dune 3.14.2 is now available.

    Note that due to a regression that was detected before publishing to opam v= ersion 3.14.1 should not be used. The fix for the regression is part of this release.

    This feature brings some small bugfixes around the handling of Coq as well = as solves an issue where Dune is running on Windows in a path that contains Unicode characters. This affected e.g. users with diacri= tics or non-latin script in their name when running Dune within their home directory.

    • When a directory is changed to a file, correctly remove it in subsequent dune build runs. (#9327, fix #6575, @emillon)
    • Fix a problem with the doc-new target where transitive dependencies were missed during compile. This leads to missing expansions in the output docs. (#9955, @jonludlam)
    • coq: fix performance regression in coqdep unescaping (#10115, fixes #10= 088, @ejgallego, thanks to Dan Christensen for the report)
    • coq: memoize coqdep parsing, this will reduce build times for Coq users= , in particular for those with many .v files (#10116, @ejgallego, see also #1008= 8)
    • on Windows, use an unicode-aware version of CreateProcess = to avoid crashes when paths contains non-ascii characters. (#10212, fixes #10180, @emillon)<= /li>
    • fix compilation on non-glibc systems due to signal.h not b= eing pulled in spawn stubs. (#10256, @emillon)

    Announcing OCaml Manila Meetups

    Thibaut Mattio announced

    I'm thrilled to announce the OCaml Manila Meetup!

    Seeing that OCaml doesn't seem to have reached the Philippines just yet (I = wasn't able to find existing OCaml or FP communities), the goal is to build one, starting small, with a few people meeting every month= in a coffee to hack on fun projects, and letting it grow organically.

    The inaugural event is scheduled for the 4th of April: https://www.meetup.com/ocaml-= manila/events/299786391/

    If you're living in Manila, or if you know anyone who would be interested i= n joining, please don't hesitate to reach out!

    I would also greatly appreciate retweets if you happen to be on Twitter: https://t= witter.com/tmattio_/status/1768169167004577997

    Happy hacking!

    Outreachy internship demo session

    Continuing this thread, Patrick Ferris announced

    The recording from the demo session is now live on watch.ocaml.org :camel:= =20

    https://watch.= ocaml.org/w/b7sv1LQSVZQH6trf4xpwFX

    OCaml 4.14.2 released

    octachron announced

    We have the pleasure of celebrating the birthday of Grace Chisholm Young by= announcing the release of OCaml version 4.14.2.

    This release is a collection of safe bug fixes, cherry-picked from the OCam= l 5 branch. If you are still using OCaml 4.14 and cannot yet upgrade to OCaml 5, this r= elease is for you.

    The 4.14 branch is expected to receive updates for at least one year, while= the OCaml 5 branch is stabilising.

    Thus don't hesitate to report any bugs on the OCaml issue tracker (at https://github.com/ocaml/ocaml= /issues).

    See the list of changes below for more details.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands:

    opam update
    opam switch create 4.14.2
    

    The source code for the release candidate is also directly available on:

    Changes since OCaml 4.14.1

    • Runtime system:
      • #11764, #12577: Add protot= ypes to old-style C function definitions and declarations. (Antonin D=C3=A9= cimo, review by Xavier Leroy and Nick Barnes)
      • #11763, #11759, #11861, #12509, #12577: Use strict prototypes on primit= ives. (Antonin D=C3=A9cimo, review by Xavier Leroy, David Allsopp, S=C3=A9b= astien Hinderer and Nick Barnes)
      • (breaking change) #10723: do not use -flat-namespace linking for m= acOS. (Carlo Cabrera, review by Damien Doligez)
      • #11332, #12702: make sure = Bool_val(v) has type bool in C++ (Xavier Leroy, r= eport by ygrek, review by Gabriel Scherer)

    Build system:

    • #11590: All= ow installing to a destination path containing spaces. (=C3=89lie Brami, review by S=C3=A9bastien Hinderer and David Allsopp)
    • #12372: Pas= s option -no-execute-only to the linker for OpenBSD >=3D 7.3 so that code sections remain readable, as needed for closure marshaling. (Xavier Leroy and Anil Madhavapeddy, review by Anil Madhavapeddy and S=C3=A9bastien Hinderer)
    • #12903: Dis= able control flow integrity on OpenBSD >=3D 7.4 to avoid illegal instruction errors on certain CPUs. (Michael Hendricks, review by Miod Vallat)

    Bug fixes:

    • #12061, #12063: don't add = inconsistent equalities when computing high-level error messages for functo= r applications and inclusions. (Florian Angeletti, review by Gabriel Schere= r)
    • #12878: fix= incorrect treatment of injectivity for private recursive types. (Jeremy Yallop, review by Gabriel Scherer and Jacques Garrigue)
    • #12971, #12974: fix an unc= aught Ctype.Escape exception on some invalid programs forming recursive typ= es. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani)=
    • #12264, #12289: Fix compac= t_allocate to avoid a pathological case that causes very slow compaction. (= Damien Doligez, report by Arseniy Alekseyev, review by Sadiq Jaffer)
    • #12513, #12518: Automatica= lly enable emulated fma for Visual Studio 2019+ to allow confi= guration with either pre-Haswell/pre-Piledriver CPUs or running in VirtualB= ox. Restores parity with the other Windows ports, which don't require expli= cit --enable-imprecise-c99-float-ops. (David Allsopp, report b= y Jonah Beckford and Kate Deplaix, review by S=C3=A9bastien Hinderer)
    • #11633, #11636: bugfix in = caml_unregister_frametable (Fr=C3=A9d=C3=A9ric Recoules, review by Gabriel = Scherer)
    • #12636, #12646: More prude= nt reinitialization of I/O mutexes after a fork() (Xavier Leroy, report by = Zach Baylin, review by Enguerrand Decorne)
    • (breaking change) #10845 Emit frametable size on amd64 BSD (OpenBSD, FreeBSD, N= etBSD) systems (emitted for Linux in #8805) (Hannes Mehnert, review by Nicol=C3=A1s Ojeda B= =C3=A4r)
    • #12958: Fix= tail-modulo-cons compilation of try-with, && and || expressions. (Gabriel Scherer and Nicol=C3=A1s Ojeda B=C3=A4r, report by Sylvain Boilard= , review by Gabriel Scherer)
    • #12116, #12993: explicitly= build non PIE executables on x86 32bits architectures (Florian Angeletti, = review by David Allsopp)
    • #13018: Don= 't pass duplicate libraries to the linker when compiling ocamlc.opt and when using systhreads (new versions of lld emit a warning). (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r)

    Docfd 3.0.0: TUI multiline fuzzy document finder

    Darren announced

    Hi all, I am happy to announce Docfd 3.0.0, which adds a non-interactive se= arch mode and support of DOCXs and other file formats via pandoc, as well as many polishes.

    Repo

    Think interactive grep for text files, PDFs, DOCXs, etc, but word/token bas= ed instead of regex and line based, so you can search across lines easily.

    Docfd aims to provide good UX via integration with common text editors and = PDF viewers, so you can jump directly to a search result with a single key press.

    Demos

    Navigating repo:

    3D"repo.gif"

    Quick search with non-interactive mode:

    3D"repo-non-interactive.gif"

    PDF navigation:

    3D"pdf-viewer-integration.jpg"

    Shape with us the New OCaml.org Community Area!

    Claire Vandenberghe announced

    I=E2=80=99m reaching out to request a few minutes of your time to review th= e wireframe for the OCaml community area. Following user interviews with those unfamiliar with OCaml, we gathered insights on what w= ould be helpful for you landing on the community page.

    As a result, we=E2=80=99re restructuring aspects of the pages and content o= n the landing page. This is a wireframe, so the focus is on checking the navigation, layout, and content, not the User Interface (UI).

    Your feedback are needed at this stage, and please feel free to leave comme= nts directly on Figma, via email, or let=E2=80=99s schedule a quick call. Thank you for participating in this review. Have a great day an= d week ahead.

    Link: https://www.figma.com/file/7hmoWkQP9PgLTfZCqiZMWa/OCaml-Co= mmunity-Pages?type=3Ddesign&node-id=3D152%3A386&mode=3Ddesign&t= =3DjzXnvmUyoQth2558-1

    Page: =E2=80=9CWireframe=E2=80=9D

    Opam-repository: Updated documentation, retirement and call fo= r maintainers

    Kate announced

    After having been maintainer of opam-repository for the past 6 and half yea= rs, I'm publicly announcing my retirement from it, to focus on opam itself. This change has been more or less already in effect s= ince September last year (following a burnout) and I have since been working on writing enough documentation so that my move away fro= m opam-repository can be as smooth as possible.

    This documentation is now live in:

    • CONTRIBUTING.md: documentation at destination of package main= tainers. This document has been rewritten in hopes of being more helpful fo= r beginner and well as experimented publishers.
    • the opam-repo= sitory wiki, which now also includes:
      • a FAQ=
      • informations about the infrastructure
      • a = governance / points of contacts document
      • a helper on How To deal with CI
      • a list of all the current policies i could think of, as well as their reaso= ning and exceptions. These policies were previously mostly passed down oral= ly, most of them have been in place since the very beginning
      • several documents at destination of current opam-repository maintainers= and opam-repository maintainers in training, all freely accessible for the= curious eyes (although rereading them now, i will admit those documents ar= e not my finest work, as they were the first ones i wrote in the past 6 mon= ths =F0=9F=99=88)

    Any improvements to these documents are also welcome. To contribute simply = open a PR on opam-repository, or a ticket on the opam-repository= bugtracker to contribute to the wiki.

    Hopefully, all these documents are a solid enough base so that they get upd= ated as time goes on, by current and future opam-repository maintainers.

    I'm also writing this post to call for said future opam-repository maintain= ers: if you want to become a maintainer, feel free to contact @mseri and @raphael-proust. I do recommend the experience of workin= g with them on opam-repository =F0=9F=98=8A

    DkCoder 0.1.0

    jbeckford announced

    I wrote an article DkCoder: Intro to Scripting that describes a very early cut of= OCaml-ified scripting:

    Hello Builder! Scripting is a small, free and important piece of DkSDK. Wal= k with me as we use the DkSDK tool "DkCoder" to write little scripts that become full-fledged programs. My hope is that = within minutes you feel like your dev experience is as productive as in Python, but enhanced so you:

    1. have nothing to install except Git and optionally Visual Studio Code
    2. have safe and understandable code ("static typing")

    DkCoder is a transparently installed OCaml 4.14 environment with one API: r= un a script. It shouldn't be confused with conventional OCaml distributions, although underneath DkCoder has the conventional bytec= ode binaries=C2=B9, and dune and ocamllsp.

    No C compiler, Cygwin/MSYS2, Homebrew or MacPorts are needed. Please skim t= he article for the exact Windows/macOS/Linux requirements.

    It grew out of two things:

    1. My frustrations sharing scripts with others. It was easy for inter-depe= ndencies between scripts to break POSIX shell scripts (the basis of the DkM= L installer) and CMake scripts (most of my tools).
    2. My need to have a good delivery vehicle for my own software.

    Please don't do anything major with DkCoder yet. In fact, if you think you'= ll be using DkCoder for your own scripts or your own software, please send me a message so I can prioritize/deprioritize.

    I'd like to thank @octachron for the codept analyzer. It is lightly used now but as hinted in the Security section of the article it will become much more important. And= also thanks to the projects that have fixed their newly discovered bytecode-only bugs over the past two months.

    =C2=B9: Actually, I bundle a new binary called ocamlrunx which= is a DT_NEEDED/LC_LOAD_DYLIB re-linking of ocamlrun against all the C libraries (ffi, SDL2* and their deps to= day) to get macOS and Linux bytecode working.

    A Versatile OCaml Library for Git Interaction - Seeking Commun= ity Feedback

    Continuing this thread, Mathieu Barbin announced

    I've recently pushed updates to the vcs public repo with most of the contents of my early draft. For those interested in early experimentation, I've created a release on my= custom opam-repository.

    The interface is still very a work in progress, but you can already see how= the pieces fit together. In particular, the provider componen= t, which is crucial for the dynamic dispatch implementation of vcs, is now available on opam. The vcs project serves as a good rea= l-world example of the capabilities this provides.

    Please feel free to open issues on GitHub with general feedback, requests, = or to start a discussion.

    @kopecs, I don't have a precise timeline for an initial publication on opam= yet. I've created this milestone if you= 'd like to follow the progress or leave a comment. Thank you for your interest!

    @paurkedal: Your setup has been a great source of inspiration for me, and I= 've found it incredibly helpful. Thank you so much!

    @samoht: I chose the approach that felt most comfortable for this particula= r project, but I greatly appreciate your input. I'll definitely keep your suggestions in mind for future projects. Thanks!

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 12 Mar 2024 10:31:19 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 12 Mar 2024 10:31:19 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 12 Mar 2024 10:31:19 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 42CAVVaf009911 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 12 Mar 2024 10:31:31 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 42CAVMjg009895 for ; Tue, 12 Mar 2024 10:31:22 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 Mar 2024 11:31:19 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id A167CE0035; Tue, 12 Mar 2024 11:31:19 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 75775E00B7 for ; Tue, 12 Mar 2024 11:31:15 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Mar 2024 11:31:11 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D1CA0564784; Tue, 12 Mar 2024 11:31:10 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHadGhrQm/uCLHEKUG4s0UY/+37KQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 12 Mar 2024 10:31:09 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 654d8dbe-c579-419f-466f-08dc427f8e46 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.07,119,1708383600"; d="scan'208,217";a="81903004" x-spam-flag: No, tests=bogofilter, spamicity=0.406072, queueID=11F97564786 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMy0xMiBUdWUgMTE6MzAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDMuMDUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMy4xOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1hcmNoIDA1IHRvIDEyLCAyMDI0LiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPkpzX29mX29jYW1sIDUuNzwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzIiPkJpbmRpbmdzIHRvIFF1aWNrSlM8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiMzIj5PY2FtbC13aW5kb3dzIDUuMS4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+Rmly c3QgcmVsZWFzZSBjYW5kaWRhdGUgZm9yIE9DYW1sIDQuMTQuMjwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzUiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBGZWJydWFyeSAyMDI0PC9hPiA8L2xpPjxsaT48 YSBocmVmPSIjNiI+QW5ub3VuY2luZyB0aGUgTmV3IERhcmsgTW9kZSBvbiBPQ2FtbC5vcmc8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5DYWxsIGZvciBwcmVzZW50YXRpb25zIOKAkyBNTCAyMDI0 OiBBQ00gU0lHUExBTiBNTCBGYW1pbHkgV29ya3Nob3A8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIj OCI+ZHJlYW0taHRtbCAzLjAuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPnBweF9taW5pZGVi dWcgMS4zLjA6IHRvd2FyZCBhIGxvZ2dpbmcgZnJhbWV3b3JrPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMTAiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc0NGIwZjcy Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPkpzX29mX29jYW1s IDUuNzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpzLW9mLW9j YW1sLTUtNy8xNDE5MS8yIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpzLW9mLW9j YW1sLTUtNy8xNDE5MS8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmcxOThjN2IwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMTk4YzdiMCI+ SGh1Z28gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmcxOThjN2IwIj4NCjxwPkpzX29mX29jYW1sIDUuNy4xIGhhcyBiZWVuIHJlbGVhc2VkIHRv ZGF5LiA8L3A+DQo8cD5JdCBmaXhlcyBhIG1pcy1jb21waWxhdGlvbiBidWcgaW50cm9kdWNlZCBp biB0aGUgbGFzdCByZWxlYXNlLiA8L3A+DQo8cD5BcyBhbHdheXMsIHNlZSB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vanNfb2Zfb2NhbWwvYmxvYi9tYXN0ZXIvQ0hBTkdF Uy5tZCI+DQpDaGFuZ2Vsb2cgPC9hPmZvciBvdGhlciBjaGFuZ2VzLiA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iMiI+QmluZGluZ3MgdG8gUXVpY2tKUzwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJpbmRpbmdzLXRvLXF1aWNranMvMTQyNjMvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJpbmRpbmdzLXRvLXF1aWNranMvMTQyNjMv MTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjODQ3NWNl IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYzg0NzVjZSI+RGF2aWQgU2FuY2hvIGFu bm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzg0 NzVjZSI+DQo8cD5J4oCZbSBoYXBweSB0byBhbm5vdW5jZSBhIG5ldyBsaWJyYXJ5ICg8YSBocmVm PSJodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL3F1aWNranMvIj5xdWlja2pzLm1sPC9h PikgdGhhdCBJIGhhdmUgYmVlbiB3b3JraW5nIG9uLCBzb21ldGltZXMgb24tc3RyZWFtIHdpdGgg dGhlIGhlbHAgb2YgYSBmZXcgcGVvcGxlIChzcGVjaWFsbHkgQHdlbGx0eXBlZGJpdGNoKSBhbmQg b3RoZXIgdGltZXMsIGp1c3QgY29kaW5nIGxvbmVseS4NCjwvcD4NCjxwPkl04oCZcyBhbiBlYXJs eSBwcm9qZWN0IHRvIGJpbmQgdG8gcXVpY2tqcyA8Yj48YSBocmVmPSJodHRwczovL2JlbGxhcmQu b3JnL3F1aWNranMiPmh0dHBzOi8vYmVsbGFyZC5vcmcvcXVpY2tqczwvYT48L2I+IGEgc21hbGwg YW5kIGVtYmVkZGFibGUgSmF2YVNjcmlwdCBlbmdpbmUuIEl0IHN1cHBvcnRzIHRoZSBFUzIwMjMg c3BlY2lmaWNhdGlvbiBpbmNsdWRpbmcgbW9kdWxlcywgYXN5bmNocm9ub3VzIGdlbmVyYXRvcnMs IHByb3hpZXMgYW5kIEJpZ0ludC4NCjwvcD4NCjxwPkl0IHBhc3NlcyBuZWFybHkgMTAwJSBvZiB0 aGUgRUNNQVNjcmlwdCBUZXN0IFN1aXRlIHRlc3RzIHdoZW4gc2VsZWN0aW5nIHRoZSBFUzIwMjMg ZmVhdHVyZXMuIEEgc3VtbWFyeSBpcyBhdmFpbGFibGUgYXQNCjxhIGhyZWY9Imh0dHBzOi8vdGVz dDI2Mi5meWkvIj5UZXN0MjYyIFJlcG9ydDwvYT4gYW5kIGhhcyB2ZXJ5IGxvdyBzdGFydHVwIHRp bWUgKGNvbXBhcmVkIHRvIG90aGVyIEpTIEVuZ2luZXMpLg0KPC9wPg0KPHA+VGhlIG5lZWQgdG8g YmluZCB0byBhIEphdmFTY3JpcHQgZW5naW5lIG9uIE9DYW1sIGFwcGVhcmVkIHdoaWxlIHdvcmtp bmcgd2l0aCBzZXJ2ZXItcmVhc29uLXJlYWN0IGNvbXBvbmVudHMuIFdoaWxlIG1vdmluZyBSZWFz b25SZWFjdCBjb21wb25lbnRzIGZyb20gdGhlIGJyb3dzZXIgaW50byB0aGUgc2VydmVyLg0KPC9w Pg0KPHA+VGhvc2UgY29tcG9uZW50cyByZWxpZWQgb24gSmF2YVNjcmlwdCBBUElzIHN1Y2ggYXMg RE9NIEFQSXMsIGJ1dCBhbHNvIHNvbWUg4oCccHVyZeKAnSBKUy4gVGhlIHBhcnQgb2YgdGhlIGJy b3dzZXIgaXNu4oCZdCBhdmFpbGFibGUgb24gdGhlIHNlcnZlciAob2J2KSBzbyB3ZSBkaXNjYXJk IGl0IHdpdGggYSBwcHggKGNhbGxlZCBicm93c2VyX3BweA0KPGEgaHJlZj0iaHR0cHM6Ly90d2l0 dGVyLmNvbS9kYXZlc254L3N0YXR1cy8xNzY1MDU5ODg4NTUwNjg2ODkyIj5odHRwczovL3R3aXR0 ZXIuY29tL2RhdmVzbngvc3RhdHVzLzE3NjUwNTk4ODg1NTA2ODY4OTI8L2E+KSBidXQgc3RpbGwg dGhlcmUgd2VyZSBzb21lICjigJ1wdXJlIEpT4oCdKSBjb2RlIHRoYXQgY291bGQgcnVuIG9uIHRo ZSBzZXJ2ZXIgc3VjaCBhcyBBcnJheS9MaXN0L1N0cmluZyBvcGVyYXRpb25zLCBSZWdFeHAsIGkx OG4sIERhdGUsIGV0Yy4NCjwvcD4NCjxwPk9uIHRoZSBicm93c2VyLCB0aG9zZSBhcGlzIGFyZSBh dmFpbGFibGUgdW5kZXIgPGNvZGU+bWVsYW5nZS5qczwvY29kZT4gKHdoaWNoIGFyZSBiaW5kaW5n cyB0byBKUzoNCjxhIGhyZWY9Imh0dHBzOi8vbWVsYW5nZS5yZS92Mi4wLjAvY29tbXVuaWNhdGUt d2l0aC1qYXZhc2NyaXB0LyI+aHR0cHM6Ly9tZWxhbmdlLnJlL3YyLjAuMC9jb21tdW5pY2F0ZS13 aXRoLWphdmFzY3JpcHQ8L2E+KSBhbmQgSSBtYWRlIGFuIGVmZm9ydCBvZiBoYXZpbmcgc2ltaWxh ciBpbXBsZW1lbmF0aW9ucyBvbg0KPGNvZGU+c2VydmVyLXJlYXNvbi1yZWFjdC5qczwvY29kZT4g d2hpY2ggaW1wbGVtZW50ZWQgaW4gT0NhbWwgdGhlIHNhbWUgQVBJcywgYnV0IHRoZXJlIHdlcmUg YSBmZXcgaXNzdWVzIHRoYXQgSSBjb3VsZG7igJl0IHJlc29sdmUgaW4gT0NhbWwgKG9yIEkgZGlk buKAmXQgd2FudCB0byByZXNvbHZlKSwgZm9yIGV4YW1wbGUgdGhlIEphdmFTY3JpcHQgUmVnRXhw IGVuZ2luZSBoYWQgYmFja3RyYWNpbmcgYW5kIG5hbWVkIGdyb3VwcyB3aGljaCBQY3JlICh0aGUN CiBmaXJzdCBhcHByb2FjaCBJIHVzZWQpIGRvZXNu4oCZdCBoYXZlLiA8L3A+DQo8cD5UaG9zZSBB UElzIGFyZSBhdmFpbGFibGUgKHdpdGggYSBmdWxsIHRlc3Qgc3VpdGUpIG9uIG1hbnkgSlMgZW5n aW5lcywgc28gSXQgd2FzIGEgbWF0dGVyIG9mIGNob29zaW5nIG9uZSBhbmQgYmluZCB0byBpdOKA piB3aGljaCBicmluZ3MgdG8gcmVsZWFzZQ0KPGEgaHJlZj0iaHR0cDovL3F1aWNranMubWwiPnF1 aWNranMubWw8L2E+IGludG8gb3BhbSB3aXRoIFJlZ0V4cCBzdXBwb3J0IGFuZCBvbmdvaW5nDQo8 Yj5CaWdJbnQsIERhdGUsIHBhcnNlIG51bWJlcnMsIGFuZCBlbmNvZGUvZGVjb2RlIFVSSS48L2I+ IDwvcD4NCjxwPkxldCBtZSBrbm93IGlmIHlvdSBmaW5kIGl0IHVzZWZ1bCwgYW5kIGZlZWwgZnJl ZSB0byBjb2xsYWIhIDwvcD4NCjxwPlBTOiBJJ20gdmVyeSBhd2FyZSB0aGF0IHRoZSBtZW1lIHdy aXRlcyBpdHNlbGYsIE9DYW1sIHRvIEpTIGFuZCBub3cgd2UgYnJpbmcgSlMgaW50byBPQ2FtbC4N CjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5PY2FtbC13aW5kb3dzIDUuMS4xPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtd2luZG93cy01 LTEtMS8xNDI2OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtd2lu ZG93cy01LTEtMS8xNDI2OC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2RlMjE4NWQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkZTIxODVk Ij5Sb21haW4gQmVhdXhpcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2RlMjE4NWQiPg0KPHA+QSBsaXR0bGUgb3ZlciBhIHdlZWsgYWdvLCA8 Y29kZT5vY2FtbC13aW5kb3dzLjUuMS4xPC9jb2RlPiB3YXMgYWRkZWQgdG8gPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLWNyb3NzL29wYW0tY3Jvc3Mtd2luZG93cyI+DQpvY2FtbC1j cm9zcy9vcGFtLWNyb3NzLXdpbmRvd3M8L2E+IPCfjoogPC9wPg0KPHA+VGhlIDxjb2RlPm9wYW0t Y3Jvc3Mtd2luZG93czwvY29kZT4gcmVwb3NpdG9yeSBwcm92aWRlcyA8Y29kZT5vcGFtPC9jb2Rl PiBwYWNrYWdlcyB0aGF0IGJ1aWxkIGxpYnJhcmllcyBhbmQgYmluYXJpZXMgdGFyZ2V0dGluZyB0 aGUgd2luZG93cyBwbGF0Zm9ybSBmcm9tIGxpbnV4IGFuZCBtYWNvcyBob3N0cyB1c2luZyB0aGUN CjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm1pbmd3LXc2NC5vcmcvIj5taW5ndy13NjQ8L2E+IGNyb3Nz LWNvbXBpbGVyIGFuZCA8YSBocmVmPSJodHRwczovL214ZS5jYy8iPg0KbXhlLmNjPC9hPiBmb3Ig ZXh0ZW5hbCBkZXBlbmRlbmNpZXMuIDwvcD4NCjxwPlRoZSBhZGRpdGlvbiBvZiBhIDxjb2RlPm9j YW1sPC9jb2RlPiBjcm9zcy1jb21waWxlciB2ZXJzaW9uIDxjb2RlPjUuMS4xPC9jb2RlPiBtYWtl cyBpdCBwb3NzaWJsZSB0byBjb21waWxlIGNvZGUgdXNpbmcgdGhlIGF3ZXNvbWUgbmV3IHNldCBv ZiBmZWF0dXJlIG9mIHRoZSBvY2FtbCA1LnggcmVsZWFzZXMhDQo8L3A+DQo8cD5BIGxvdCBvZiBw YWNrYWdlcyBzdGlsbCBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gc3VwcG9ydCB0aGUgb2NhbWwgNSBj b21waWxlci4gRm9ydHVuYXRlbHksIGFkZGluZyBuZXcNCjxjb2RlPmR1bmU8L2NvZGU+LWJhc2Vk IHBhY2thZ2VzIGhhcyBiZWNvbWUgcmVtYXJrYWJseSBlYXN5IHRoYW5rcyB0byA8Y29kZT5kdW5l PC9jb2RlPidzIGdyZWF0IGNyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQuIEFsc28sIHRoZSBDSSBj b3VsZCB1c2Ugc29tZSBsb3ZlLg0KPC9wPg0KPHA+SWYgeW91IGZpbmQgaXQgdXNlZnVsLCBmZWVs IGZyZWUgdG8gY29tZSBoZWxwISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+Rmly c3QgcmVsZWFzZSBjYW5kaWRhdGUgZm9yIE9DYW1sIDQuMTQuMjwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtcmVsZWFzZS1jYW5kaWRhdGUtZm9yLW9jYW1sLTQt MTQtMi8xNDI2OS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9maXJzdC1yZWxlYXNl LWNhbmRpZGF0ZS1mb3Itb2NhbWwtNC0xNC0yLzE0MjY5LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYzMwZTI4YiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZ2MzMGUyOGIiPm9jdGFjaHJvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2MzMGUyOGIiPg0KPHA+VGhlIHJlbGVhc2Ugb2Yg T0NhbWwgdmVyc2lvbiA0LjE0LjIgaXMgaW1taW5lbnQuIDwvcD4NCjxwPk9DYW1sIDQuMTQuMiBp cyBhIG5ldyB1cGRhdGUgdG8gdGhlIHN0YWJsZSA0LjE0IGJyYW5jaCBvZiBPQ2FtbC4gVGhpcyBu ZXcgcmVsZWFzZSBiYWNrcG9ydHMgbWFueSBzYWZlIGJ1ZyBmaXhlcyBmcm9tIHRoZSBPQ2FtbCA1 IGJyYW5jaCBhbmQgZml4ZXMgYSBoYW5kZnVsIG9mIGNvbXBhdGliaWxpdHkgaXNzdWVzIG9mIE9D YW1sIDQuMTQuMSB3aXRoIG5ld2VyIG9wZXJhdGluZyBzeXN0ZW0gdmVyc2lvbnMuDQo8L3A+DQo8 cD5BIGZ1bGwgbGlzdCBvZiBidWcgZml4ZXMgaXMgYXZhaWxhYmxlIGJlbG93LiA8L3A+DQo8cD5J biBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgZnV0dXJlIHJlbGVhc2Ugd29ya3MgYXMgZXhwZWN0 ZWQsIHdlIGFyZSBwbGFubmluZyB0byB0ZXN0IGEgcmVsZWFzZSBjYW5kaWRhdGUgZHVyaW5nIHRo ZSB1cGNvbWluZyB3ZWVrICh0aGUgcmMgY2FuZGlkYXRlIG1pZ2h0IHRha2Ugc29tZSB0aW1lIHRv IHByb3BhZ2F0ZSBvbiB0aGUgb3BhbSByZXBvc2l0b3J5KS4NCjwvcD4NCjxwPklmIHlvdSBmaW5k IGFueSBidWdzLCBwbGVhc2UgcmVwb3J0IHRoZW0gaGVyZSBvbiA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzIj4NCkdpdEh1YjwvYT4uIDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnM2E0YTFlZCIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzNhNGExZWQiPkluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnM8L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzNhNGExZWQiPg0KPHA+VGhlIGJh c2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3aXRjaCB3aXRoIHRoZSBm b2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjE6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxl IiBpZD0ib3JnMWVmZDU5YSI+DQpvcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlIDQuMTQu Mn5yYzENCjwvcHJlPg0KPHA+VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVsZWFzZSBjYW5kaWRh dGUgaXMgYXZhaWxhYmxlIG9uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS80LjE0LjItcmMxLnRhci5n eiI+R2l0SHViPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1 Yi9kaXN0cmliL29jYW1sLTQuMTQvb2NhbWwtNC4xNC4yLXJjMS50YXIuZ3oiPklucmlhIGFyY2hp dmVzPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aWQ9Im9yZzEwNjY4YjQiPjwvYT5GaW5lLVR1bmVkIENvbXBpbGVyIENvbmZpZ3VyYXRpb248YnI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMTA2NjhiNCI+DQo8cD5J ZiB5b3Ugd2FudCB0byB0d2VhayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcGlsZXIsIHlv dSBjYW4gc3dpdGNoIHRvIHRoZSBvcHRpb24gdmFyaWFudCB3aXRoOg0KPC9wPg0KPHByZSBjbGFz cz0iZXhhbXBsZSIgaWQ9Im9yZzJiMTljNzUiPg0Kb3BhbSB1cGRhdGUNCm9wYW0gc3dpdGNoIGNy ZWF0ZSAmbHQ7c3dpdGNoX25hbWUmZ3Q7IG9jYW1sLXZhcmlhbnRzLjQuMTQuMn5yYzEmIzQzO29w dGlvbnMgJmx0O29wdGlvbl9saXN0Jmd0Ow0KPC9wcmU+DQo8cD53aGVyZSA8Y29kZT4mbHQ7b3B0 aW9uX2xpc3QmZ3Q7PC9jb2RlPiBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIDxjb2RlPm9j YW1sLW9wdGlvbi0qPC9jb2RlPiBwYWNrYWdlcy4gRm9yIGluc3RhbmNlLCBmb3IgYQ0KPGNvZGU+ ZmxhbWJkYTwvY29kZT4gYW5kIDxjb2RlPm5vLWZsYXQtZmxvYXQtYXJyYXk8L2NvZGU+IHN3aXRj aDogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzczZWU1NzEiPg0Kb3BhbSBzd2l0 Y2ggY3JlYXRlIDQuMTQuMn5yYzEmIzQzO2ZsYW1iZGEmIzQzO25mZmEgb2NhbWwtdmFyaWFudHMu NC4xNC4yfnJjMSYjNDM7b3B0aW9ucyBvY2FtbC1vcHRpb24tZmxhbWJkYSBvY2FtbC1vcHRpb24t bm8tZmxhdC1mbG9hdC1hcnJheQ0KPC9wcmU+DQo8cD5BbGwgYXZhaWxhYmxlIG9wdGlvbnMgY2Fu IGJlIGxpc3RlZCB3aXRoIDxjb2RlPm9wYW0gc2VhcmNoIG9jYW1sLW9wdGlvbjwvY29kZT4uDQo8 L3A+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnYjAxMzI2MSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2IwMTMyNjEiPkNo YW5nZXMgU2luY2UgT0NhbWwgNC4xNC4xPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00 IiBpZD0idGV4dC1vcmdiMDEzMjYxIj48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48 YSBpZD0ib3JnM2MzZDE0MyI+PC9hPlJ1bnRpbWUgU3lzdGVtOjxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmczYzNkMTQzIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNzY0 Ij4jMTE3NjQ8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzEyNTc3Ij4NCiMxMjU3NzwvYT46IEFkZCBwcm90b3R5cGVzIHRvIG9sZC1zdHlsZSBDIGZ1 bmN0aW9uIGRlZmluaXRpb25zIGFuZCBkZWNsYXJhdGlvbnMuIChBbnRvbmluIETDqWNpbW8sIHJl dmlldyBieSBYYXZpZXIgTGVyb3kgYW5kIE5pY2sgQmFybmVzKQ0KPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTc2MyI+IzExNzYzPC9hPiwg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTc1OSI+DQoj MTE3NTk8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVz LzExODYxIj4jMTE4NjE8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyNTA5Ij4NCiMxMjUwOTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI1NzciPiMxMjU3NzwvYT46IFVzZSBzdHJpY3QgcHJvdG90 eXBlcyBvbiBwcmltaXRpdmVzLiAoQW50b25pbiBEw6ljaW1vLCByZXZpZXcgYnkgWGF2aWVyIExl cm95LCBEYXZpZCBBbGxzb3BwLCBTw6liYXN0aWVuIEhpbmRlcmVyIGFuZCBOaWNrIEJhcm5lcykN CjwvbGk+PGxpPig8Yj5icmVha2luZyBjaGFuZ2U8L2I+KSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEwNzIzIj4NCiMxMDcyMzwvYT46IERvIG5vdCB1c2Ug PGNvZGU+LWZsYXQtbmFtZXNwYWNlPC9jb2RlPiBsaW5raW5nIGZvciBtYWNPUy4gKENhcmxvIENh YnJlcmEsIHJldmlldyBieSBEYW1pZW4gRG9saWdleikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEzMzIiPiMxMTMzMjwvYT4sIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI3MDIiPg0KIzEyNzAy PC9hPjogTWFrZSBzdXJlIDxjb2RlPkJvb2xfdmFsKHYpPC9jb2RlPiBoYXMgdHlwZSA8Y29kZT5i b29sPC9jb2RlPiBpbiBDJiM0MzsmIzQzOyAoWGF2aWVyIExlcm95LCByZXBvcnQgYnkgeWdyZWss IHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxp PjxhIGlkPSJvcmdkN2JlYWMwIj48L2E+QnVpbGQgU3lzdGVtOjxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdkN2JlYWMwIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNTkw Ij4jMTE1OTA8L2E+OiBBbGxvdyBpbnN0YWxsaW5nIHRvIGEgZGVzdGluYXRpb24gcGF0aCBjb250 YWluaW5nIHNwYWNlcyAow4lsaWUgQnJhbWksIHJldmlldyBieSBTw6liYXN0aWVuIEhpbmRlcmVy IGFuZCBEYXZpZCBBbGxzb3BwKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjM3MiI+IzEyMzcyPC9hPjogUGFzcyBvcHRpb24NCjxjb2Rl Pi1uby1leGVjdXRlLW9ubHk8L2NvZGU+IHRvIHRoZSBsaW5rZXIgZm9yIE9wZW5CU0QgJmd0Oz0g Ny4zIHNvIHRoYXQgY29kZSBzZWN0aW9ucyByZW1haW4gcmVhZGFibGUsIGFzIG5lZWRlZCBmb3Ig Y2xvc3VyZSBtYXJzaGFsaW5nLiAoWGF2aWVyIExlcm95IGFuZCBBbmlsIE1hZGhhdmFwZWRkeSwg cmV2aWV3IGJ5IEFuaWwgTWFkaGF2YXBlZGR5IGFuZCBTw6liYXN0aWVuIEhpbmRlcmVyKQ0KPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjkw MyI+IzEyOTAzPC9hPjogRGlzYWJsZSBjb250cm9sIGZsb3cgaW50ZWdyaXR5IG9uIE9wZW5CU0Qg Jmd0Oz0gNy40IHRvIGF2b2lkIGlsbGVnYWwgaW5zdHJ1Y3Rpb24gZXJyb3JzIG9uIGNlcnRhaW4g Q1BVcy4gKE1pY2hhZWwgSGVuZHJpY2tzLCByZXZpZXcgYnkgTWlvZCBWYWxsYXQpDQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdjNDNlNjExIj48L2E+QnVnIGZpeGVzOjxi cj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdjNDNlNjExIj4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEyMDYxIj4jMTIwNjE8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMDYzIj4NCiMxMjA2MzwvYT46IERvbid0IGFkZCBpbmNv bnNpc3RlbnQgZXF1YWxpdGllcyB3aGVuIGNvbXB1dGluZyBoaWdoLWxldmVsIGVycm9yIG1lc3Nh Z2VzIGZvciBmdW5jdG9yIGFwcGxpY2F0aW9ucyBhbmQgaW5jbHVzaW9ucy4gKEZsb3JpYW4gQW5n ZWxldHRpLCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjg3OCI+IzEyODc4PC9hPjogRml4 IGluY29ycmVjdCB0cmVhdG1lbnQgb2YgaW5qZWN0aXZpdHkgZm9yIHByaXZhdGUgcmVjdXJzaXZl IHR5cGVzLiAoSmVyZW15IFlhbGxvcCwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlciBhbmQgSmFj cXVlcyBHYXJyaWd1ZSkNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTI5NzEiPiMxMjk3MTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI5NzQiPg0KIzEyOTc0PC9hPjogRml4IGFuIHVuY2F1 Z2h0IEN0eXBlLiBFc2NhcGUgZXhjZXB0aW9uIG9uIHNvbWUgaW52YWxpZCBwcm9ncmFtcyBmb3Jt aW5nIHJlY3Vyc2l2ZSB0eXBlcy4gKEdhYnJpZWwgU2NoZXJlciwgcmV2aWV3IGJ5IEZsb3JpYW4g QW5nZWxldHRpLCByZXBvcnQgYnkgTmV2ZW4gVmlsbGFuaSkNCjwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIyNjQiPiMxMjI2NDwvYT4sIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIyODkiPg0KIzEy Mjg5PC9hPjogRml4IDxjb2RlPmNvbXBhY3RfYWxsb2NhdGU8L2NvZGU+IHRvIGF2b2lkIGEgcGF0 aG9sb2dpY2FsIGNhc2UgdGhhdCBjYXVzZXMgdmVyeSBzbG93IGNvbXBhY3Rpb24uIChEYW1pZW4g RG9saWdleiwgcmVwb3J0IGJ5IEFyc2VuaXkgQWxla3NleWV2LCByZXZpZXcgYnkgU2FkaXEgSmFm ZmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMjUxMyI+IzEyNTEzPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlcy8xMjUxOCI+DQojMTI1MTg8L2E+OiBBdXRvbWF0aWNhbGx5IGVuYWJsZSBl bXVsYXRlZCA8Y29kZT5mbWE8L2NvZGU+IGZvciBWaXN1YWwgU3R1ZGlvIDIwMTkmIzQzOyB0byBh bGxvdyBjb25maWd1cmF0aW9uIHdpdGggZWl0aGVyIHByZS1IYXN3ZWxsL3ByZS1QaWxlZHJpdmVy IENQVXMgb3IgcnVubmluZyBpbiBWaXJ0dWFsQm94LiBSZXN0b3JlcyBwYXJpdHkgd2l0aCB0aGUg b3RoZXIgV2luZG93cyBwb3J0cywgd2hpY2ggZG9uJ3QgcmVxdWlyZSBleHBsaWNpdA0KPGNvZGU+ LS1lbmFibGUtaW1wcmVjaXNlLWM5OS1mbG9hdC1vcHM8L2NvZGU+LiAoRGF2aWQgQWxsc29wcCwg cmVwb3J0IGJ5IEpvbmFoIEJlY2tmb3JkIGFuZCBLYXRlIERlcGxhaXgsIHJldmlldyBieSBTw6li YXN0aWVuIEhpbmRlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy8xMTYzMyI+IzExNjMzPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTYzNiI+DQojMTE2MzY8L2E+OiBCdWcgZml4IGlu IDxjb2RlPmNhbWxfdW5yZWdpc3Rlcl9mcmFtZXRhYmxlPC9jb2RlPiAoRnLDqWTDqXJpYyBSZWNv dWxlcywgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlcikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2MzYiPiMxMjYzNjwvYT4sIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2NDYiPg0KIzEyNjQ2 PC9hPjogTW9yZSBwcnVkZW50IHJlaW5pdGlhbGlzYXRpb24gb2YgSS9PIG11dGV4ZXMgYWZ0ZXIg YSBmb3JrKCkgKFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IFphY2ggQmF5bGluLCByZXZpZXcgYnkg RW5ndWVycmFuZCBEZWNvcm5lKQ0KPC9saT48bGk+KDxiPmJyZWFraW5nIGNoYW5nZTwvYj4pIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTA4NDUiPg0KIzEw ODQ1PC9hPiBFbWl0IGZyYW1ldGFibGUgc2l6ZSBvbiBBTUQ2NCBCU0QgKE9wZW5CU0QsIEZyZWVC U0QsIE5ldEJTRCkgc3lzdGVtcyAoZW1pdHRlZCBmb3IgTGludXggaW4NCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvODgwNSI+Izg4MDU8L2E+KSAoSGFubmVz IE1laG5lcnQsIHJldmlldyBieSBOaWNvbMOhcyBPamVkYSBCw6RyKQ0KPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjk1OCI+IzEyOTU4PC9h PjogRml4IDxjb2RlPnRhaWwtbW9kdWxvLWNvbnM8L2NvZGU+IGNvbXBpbGF0aW9uIG9mDQo8Y29k ZT50cnktd2l0aDwvY29kZT4sIDxjb2RlPiZhbXA7JmFtcDs8L2NvZGU+LCBhbmQgPGNvZGU+fHw8 L2NvZGU+IGV4cHJlc3Npb25zLiAoR2FicmllbCBTY2hlcmVyIGFuZCBOaWNvbMOhcyBPamVkYSBC w6RyLCByZXBvcnQgYnkgU3lsdmFpbiBCb2lsYXJkLCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVy KQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iNSI+T0NhbWwub3JnIE5ld3NsZXR0ZXI6IEZlYnJ1YXJ5IDIwMjQ8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy1uZXdzbGV0dGVyLWZlYnJ1YXJ5LTIw MjQvMTQyNzIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3Ns ZXR0ZXItZmVicnVhcnktMjAyNC8xNDI3Mi8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzNiNzUzNzEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmczYjc1MzcxIj5TYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczYjc1MzcxIj4NCjxwPldlbGNvbWUgdG8gdGhlIEZl YnJ1YXJ5IDIwMjQgZWRpdGlvbiBvZiB0aGUgT0NhbWwub3JnIG5ld3NsZXR0ZXIhIFRoaXMgdXBk YXRlIGhhcyBiZWVuIGNvbXBpbGVkIGJ5IHRoZSBPQ2FtbC5vcmcgdGVhbS4gWW91IGNhbiBmaW5k DQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3RhZy9vY2FtbG9yZy1uZXdzbGV0 dGVyIj5wcmV2aW91cyB1cGRhdGVzPC9hPiBvbiBEaXNjdXNzLg0KPC9wPg0KPHA+T3VyIGdvYWwg aXMgdG8gbWFrZSBPQ2FtbC5vcmcgdGhlIGJlc3QgcmVzb3VyY2UgZm9yIGFueW9uZSB3aG8gd2Fu dHMgdG8gZ2V0IHN0YXJ0ZWQgYW5kIGJlIHByb2R1Y3RpdmUgaW4gT0NhbWwuIFRoZSBPQ2FtbC5v cmcgbmV3c2xldHRlciBwcm92aWRlcyBhbiB1cGRhdGUgb24gb3VyIHByb2dyZXNzIHRvd2FyZHMg dGhhdCBnb2FsIGFuZCBhbiBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyB3ZSBhcmUgd29ya2luZyBv bi4NCjwvcD4NCjxwPldlIGNvdWxkbid0IGRvIGl0IHdpdGhvdXQgYWxsIHRoZSBhbWF6aW5nIE9D YW1sIGNvbW11bml0eSBtZW1iZXJzIHdobyBoZWxwIHVzIHJldmlldywgcmV2aXNlLCBhbmQgY3Jl YXRlIGJldHRlciBPQ2FtbCBkb2N1bWVudGF0aW9uLiBZb3VyIGZlZWRiYWNrIGVuYWJsZXMgdXMg dG8gYmV0dGVyIHByaW9yaXRpc2Ugb3VyIHdvcmsuIFRoYW5rIHlvdSENCjwvcD4NCjxwPlRoaXMg bmV3c2xldHRlciBjb3ZlcnM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5PQ2Ft bCBEb2N1bWVudGF0aW9uOjwvYj4gTmV3IGRvY3VtZW50YXRpb24gaGFzIGJlZW4gcmVsZWFzZWQs IGFuZCBleGlzdGluZyBkb2N1bWVudGF0aW9uIGhhcyBiZWVuIGltcHJvdmVkLg0KPC9saT48bGk+ PGI+T0NhbWwgQ29va2Jvb2s6PC9iPiBBIHByb3RvdHlwZSBvZiBhbiBPQ2FtbCBjb29rYm9vayB0 aGF0IHByb3ZpZGVzIHNob3J0IGNvZGUgZXhhbXBsZXMgdGhhdCBzb2x2ZSBwcmFjdGljYWwgcHJv YmxlbXMgdXNpbmcgcGFja2FnZXMgZnJvbSB0aGUgT0NhbWwgZWNvc3lzdGVtIGlzIG9uIHN0YWdp bmcub2NhbWwub3JnL2Nvb2tib29rLg0KPC9saT48bGk+PGI+RGFyayBNb2RlOjwvYj4gV2UncmUg YWxtb3N0IHJlYWR5IHRvIHJlbGVhc2UgZGFyayBtb2RlIG5vdy4gPC9saT48bGk+PGI+Q29tbXVu aXR5IFNlY3Rpb24gUmV3b3JrOjwvYj4gV2UgYXJlIHByZXBhcmluZyB3aXJlZnJhbWVzIGZvciB0 aGUgY29tbXVuaXR5IHNlY3Rpb24gdG8gYmV0dGVyIHByZXNlbnQgdGhlIGV4aXN0aW5nIGNvbnRl bnQuIEluIGFkZGl0aW9uLCB3ZSBzdGFydGVkIHByZWxpbWluYXJ5IHdvcmsgdG93YXJkcyBhIGRl ZGljYXRlZCAmcXVvdDtFdmVudHMmcXVvdDsgcGFnZS4NCjwvbGk+PGxpPjxiPkdlbmVyYWwgSW1w cm92ZW1lbnRzOjwvYj4gQXMgdXN1YWwsIHdlIGFsc28gd29ya2VkIG9uIGdlbmVyYWwgbWFpbnRl bmFuY2UgYW5kIGltcHJvdmVtZW50cyBiYXNlZCBvbiB1c2VyIGZlZWRiYWNrLCBzbyB3ZSdyZSBo aWdobGlnaHRpbmcgc29tZSBvZiBvdXIgd29yayBiZWxvdy4NCjwvbGk+PC91bD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNWUxZGIwYyIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzVlMWRiMGMiPk9wZW4gSXNzdWVzIGZvciBDb250cmlidXRvcnMgJmFtcDsg T3V0cmVhY2h5IEFwcGxpY2F0aW9uIFBlcmlvZDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnNWUxZGIwYyI+DQo8cD5UaGVyZSBhcmUgb3BlbiBpc3N1ZXMgZm9y IGV4dGVybmFsIGNvbnRyaWJ1dG9ycy4gSG93ZXZlciwgc2luY2UgZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcgcGFydGljaXBhdGVzIGluIHRoZSBPdXRyZWFjaHkgYXBwbGljYXRpb24gcGVyaW9k LCB3ZSBtaWdodCBoYXZlIGEgc2hvcnRhZ2Ugb2Ygb3BlbiBpc3N1ZXMgaW4gTWFyY2gsIHNpbmNl IE91dHJlYWNoeSBhcHBsaWNhbnRzIHdpbGwgcXVpY2tseSB0YWtlIHRoZW0gb24uDQo8L3A+DQo8 cD5Zb3UgY2FuIGZpbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9pc3N1ZXM/cT1pcyUzQWlzc3VlJiM0MztpcyUzQW9wZW4mIzQzO2xhYmVsJTNBJTIyaGVscCYj NDM7d2FudGVkJTIyJiM0MztubyUzQWFzc2lnbmVlIj4NCm9wZW4gaXNzdWVzIGZvciBjb250cmli dXRvcnMgaGVyZTwvYT4hIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdmMzhhZTA3IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZjM4YWUw NyI+T0NhbWwgRG9jdW1lbnRhdGlvbjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnZjM4YWUwNyI+DQo8cD48Yj5Vc2VyIFRlc3Rpbmc8L2I+IDwvcD4NCjxwPlR3 ZW50eS1vbmUgYnJhdmUgbmV3YmllcyBhY2NlcHRlZCBiZWluZyBvYnNlcnZlZCBmb3Igb25lIGhv dXIgd2hpbGUgZGlzY292ZXJpbmcgT0NhbWwgdGhyb3VnaCB0aGUgb25saW5lIGRvY3MgYW5kIGNv bXBsZXRpbmcgYSBjb3VwbGUgb2YgcHJvZ3JhbW1pbmcgdGFza3MuIE1hbnkgdGhhbmtzIHRvIGFs bCB0aGUgcGFydGljaXBhbnRzIG9mIHRoZSB1c2VyIHRlc3Rpbmcgc2Vzc2lvbnMgd2UgaGVsZCEN CjwvcD4NCjxwPkhhbGYgb2YgdGhlIHVzZXIgdGVzdGluZyBwYXJ0aWNpcGFudHMgdXNlZCB0aGUg cmVjZW50bHkgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcyI+DQp1cGRhdGVkIHR1dG9y aWFsczwvYT4sIHRoZSBvdGhlciBoYWxmIHVzZWQgPGEgaHJlZj0iaHR0cHM6Ly92Mi5vY2FtbC5v cmcvZG9jcyI+djIub2NhbWwub3JnL2RvY3M8L2E+LiBPdXIgdGFrZWF3YXkgZnJvbSB0aGlzIGlz Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxlYXJuaW5nIE9DYW1sIGlzbid0IGhh cmQuIEhvd2V2ZXIsIGxlYXJuaW5nIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgaXMuIE1vc3QgcGFy dGljaXBhbnRzIHdobyBoYWQgcHJldmlvdXMgRlAgZXhwZXJpZW5jZSBzdWNjZXNzZnVsbHkgY29t cGxldGVkIHRoZSB0YXNrcy4NCjwvbGk+PGxpPlRoZSB1cGRhdGVkIGRvY3MgZG8gYSBsaXR0bGUg YmV0dGVyIHRoYW4gdGhlIG1hbnVhbCBhdCB0ZWFjaGluZyBib3RoIE9DYW1sIGFuZCBGUCB0byBw YXJ0aWNpcGFudHMgd2l0aG91dCBGUCBleHBlcmllbmNlLiBBIGZldyBvZiB0aGVtIHN1Y2NlZWRl ZCBhdCB0aGUgbW9yZSBjb21wbGV4IHRhc2tzIHVzaW5nIHRoZSBuZXcgdHV0b3JpYWxzLCB3aGls ZSBhbGwgcGFydGljaXBhbnRzIHdpdGhvdXQgRlAgZXhwZXJpZW5jZSBmYWlsZWQgdXNpbmcNCiB0 aGUgb2xkIGRvY3VtZW50YXRpb24uIDwvbGk+PC91bD4NCjxwPkJ5IG9ic2VydmluZyB0aGUgcGFy dGljaXBhbnRzIHRyeSB0byBtYWtlIHNlbnNlIG9mIHRoZSB0YXNrcyBhbmQgZmluZCByZWxldmFu dCBtYXRlcmlhbHMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHdlIGhhdmUgaWRlbnRpZmllZCBtYW55 IHNtYWxsZXIgY2hhbmdlcyB0aGF0IGFyZSBsaWtlbHkgdG8gaW1wcm92ZSB0aGUgdXNlciBleHBl cmllbmNlIG9uIHRoZSBkb2N1bWVudGF0aW9uIHBhZ2VzLg0KPC9wPg0KPHA+PGI+UmVsZXZhbnQg UFJzIGFuZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxi PkluIFByb2dyZXNzOjwvYj4gPC9saT48bGk+PGI+SW4gUmV2aWV3IChpbnRlcm5hbCk6PC9iPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8yMDQ0Ij5IaWdoZXItT3JkZXIgRnVuY3Rpb25zPC9hPg0KPC9saT48 L3VsPg0KPC9saT48bGk+PGI+SW4gUmV2aWV3IChjb21tdW5pdHkpOjwvYj4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTQwMCI+RmlsZSBNYW5pcHVsYXRpb248L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxwLXJldmlldy10aGUtbmV3LWZpbGUtbWFuaXB1bGF0aW9u LXR1dG9yaWFsLW9uLW9jYW1sLW9yZy8xMjYzOCI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+ PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTMx Ij5Qb2x5bW9ycGhpYyBWYXJpYW50czwvYT4gKHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L25ldy1kcmFmdC10dXRvcmlhbC1vbi1wb2x5bW9ycGhpYy12YXJpYW50cy8x MzQ4NSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PC91bD4NCjwvbGk+PGxpPjxiPlB1Ymxp c2hlZDo8L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwNDUiPk1hcHM8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC85NDgiPlNldHM8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xODAwIj5PcHRpb25zPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTc3OCI+TW9kdWxlcywgRnVuY3RvcnMsIExpYnJhcmllcyBX aXRoIER1bmU8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9k cmFmdC10dXRvcmlhbHMtb24tbW9kdWxlcy1mdW5jdG9ycy1hbmQtbGlicmFyaWVzLyI+DQpEaXNj dXNzPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzE4ODEiPkxhYmVsbGVkIEFyZ3VtZW50czwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODgwIj5UaGUgT0NhbWwg UGxheWdyb3VuZDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9UaGUtQW1vZ2hh dmFyc2hhIj5AVGhlLUFtb2doYXZhcnNoYTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4MjUiPlJ1bm5pbmcgQ29tbWFuZHMgaW4g YW4gb3BhbSBTd2l0Y2g8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTUyOSI+TXV0YWJsZSBTdGF0ZSAvIEltcGVyYXRpdmUgUHJv Z3JhbW1pbmc8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9k cmFmdC10dXRvcmlhbC1vbi1tdXRhYmlsaXR5LWxvb3BzLWFuZC1pbXBlcmF0aXZlLXByb2dyYW1t aW5nLzEzNTA0Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+QW5ub3VuY2VtZW50IG9u IERpc2N1c3M6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctdHV0b3Jp YWxzLW9uLWJhc2ljcy1vZi1vY2FtbC8xMzM5NiI+DQpOZXcgVHV0b3JpYWxzIG9uIEJhc2ljcyBv ZiBPQ2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzE1MTQiPkJhc2ljIERhdGEgVHlwZXM8L2E+IChzZWUNCjxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1vcmctdHV0b3JpYWwtcmV2YW1waW5nLWNv bnRkLWJhc2ljLWRhdGF0eXBlcy8xMjk4NSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxp PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTEyIj5G dW5jdGlvbnMgYW5kIFZhbHVlczwvYT4gKHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L29jYW1sLW9yZy10dXRvcmlhbC1yZXZhbXBpbmctY29uZC12YWx1ZXMtYW5kLWZ1 bmN0aW9ucy8xMzAwNSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vb2NhbWwub3JnL2RvY3MvaW5zdGFsbGluZy1vY2FtbCI+SW5zdGFsbGluZyBPQ2FtbDwv YT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaGVscC1yZXZhbXBp bmctdGhlLWdldHRpbmctc3RhcnRlZC10dXRvcmlhbHMtaW4tb2NhbWwtb3JnLzEyNzQ5Ij4NCkRp c2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9j cy90b3VyLW9mLW9jYW1sIj5BIFRvdXIgT2YgT0NhbWw8L2E+IChzZWUgPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hlbHAtcmV2YW1waW5nLXRoZS1nZXR0aW5nLXN0YXJ0ZWQt dHV0b3JpYWxzLWluLW9jYW1sLW9yZy8xMjc0OSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+ PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MveW91ci1maXJzdC1wcm9ncmFtIj5Z b3VyIEZpcnN0IE9DYW1sIFByb2dyYW08L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9oZWxwLXJldmFtcGluZy10aGUtZ2V0dGluZy1zdGFydGVkLXR1dG9yaWFs cy1pbi1vY2FtbC1vcmcvMTI3NDkiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL29wYW0tc3dpdGNoLWludHJvZHVjdGlvbiI+SW50 cm9kdWN0aW9uIHRvIG9wYW0gU3dpdGNoZXM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9kb2NzL2FybTY0LWZpeCI+Rml4IEhvbWVicmV3IEVycm9ycyBvbiBBcHBsZSBN MTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mvb3BlcmF0b3Jz Ij5PcGVyYXRvcnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mv ZXJyb3ItaGFuZGxpbmciPkVycm9yIEhhbmRsaW5nPC9hPiAoc2VlIDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LWdldC1zdGFydGVkLWRvY3VtZW50YXRpb24tb24t b2NhbWwtb3JnLzEzMjY5Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9hcnJheXMiPkFycmF5czwvYT4gKHNlZSA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmVlZGJhY2stbmVlZGVkLW5ldy1hcnJheXMtdHV0 b3JpYWwtb24tb2NhbWwtb3JnLzEyNjgzIj4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9zZXF1ZW5jZXMiPlNlcXVlbmNlczwvYT4g KHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY3JlYXRpbmctYS10dXRv cmlhbC1vbi1zZXF1ZW5jZXMvMTIwOTEiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjwvdWw+ DQo8L2xpPjxsaT48Yj5PdGhlciBBY3Rpdml0eTwvYj46DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwNjAi Pihkb2NzKSBCYXNpYyBEYXRhIFR5cGVzOiBBZGQgbGluayB0byBtb2R1bGUgU3RyPC9hPg0KPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIw OTAiPkZpcnN0IGNsYXNzIG1vZHVsZSAoTGVhcm5pbmcvTGFuZ3VhZ2UvTW9kdWxlIFN5c3RlbSk8 L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1Mb3llciI+QEYtTG95ZXI8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8yMDkyIj5VcGRhdGUgYnBfMDNfcnVuX2V4ZWN1dGFibGVzX2FuZF90ZXN0cy5tZDwvYT4gYnkN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GLUxveWVyIj5ARi1Mb3llcjwvYT4gPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwOTMi PkRPQzogcmVwbGFjZSBkcmVhbSB3aXRoIHlvanNvbiBpbiBmaXJzdCBwcm9ncmFtPC9hPiBieQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hlYXRoaGVubGV5Ij5AaGVhdGhoZW5sZXk8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8yMDk1Ij5VcGRhdGUgdHlwbyAmIzQzOyBjaGFuZ2UgZnJvbSBhcHBlbmQgdG8gcHJlcGVuZDwv YT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYW5pcG9tYSI+QGRhbmlwb21hPC9h PiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMjEwNSI+QWRkIHdvcmtzcGFjZSBmaWxlIGZvciB1c2Ugd2l0aCBkdW5lLXBrZzwvYT4gYnkN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkYnVncyI+QGdyaWRidWdzPC9hPiA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjEx NSI+Rml4IHR5cG9zIGluIGd1aWRlbGluZXM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vY2lvbngiPkBjaW9ueDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMjAiPlJlbW92aW5nIGR1bmUgZnJvbSBzZXR1cCBp bnN0cnVjdGlvbnM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vVGhlLUFtb2do YXZhcnNoYSI+QFRoZS1BbW9naGF2YXJzaGE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDIzIj5JbXByb3ZlIHNvbWUgd29yZGlu ZyBpbiB0aGUgZnVuY3RvcnMgdHV0b3JpYWw8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vbmV1cm9ldm9sdXR1cyI+QG5ldXJvZXZvbHV0dXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDU0Ij5BZGQgbGluayBm cm9tIG9wZXJhdG9ycyB0byBtb25hZHM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vY3VpaHRsYXVhYyI+QGN1aWh0bGF1YWM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDQ3Ij4oZG9jKSBJbXByb3ZlIHdvcmRp bmcgaW4gJnF1b3Q7TGlicmFyaWVzIHdpdGggRHVuZSZxdW90OyB0dXRvcmlhbDwvYT4gYnkNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9UaGUtQW1vZ2hhdmFyc2hhIj5AVGhlLUFtb2doYXZh cnNoYTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzIwNTkiPlJlcGxhY2UgVmFyaWFibGUgYnkgUGFyYW1ldGVyPC9hPiBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWMiPkBjdWlodGxhdWFjPC9hPiA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjA0 NiI+KGRvY3MpIEFkZGluZyBhbiBleGFtcGxlIG9mIGEgY2xvc3VyZSB0aGF0IGNvbnRhaW5zIG11 dGFibGUgc3RhdGUgaW4gTXV0YWJsZSBTdGF0ZSAmYW1wOyBJbXBlcmF0aXZlIFR1dG9yaWFsPC9h PiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RoZS1BbW9naGF2YXJzaGEiPkBUaGUt QW1vZ2hhdmFyc2hhPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMjA2NCI+KGRvY3MpIFJlY29tbWVuZCBkdW5lIHdhdGNoIG1vZGU8 L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20veWF3YXJhbWluIj5AeWF3YXJhbWlu PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjA3MyI+KGRvY3MpIFNldCDigJxTZXRz4oCcIGFzIFNldCdzIHR1dG9yaWFsIHRpdGxl PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWMiPkBjdWlodGxh dWFjPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMjA4NyI+KGRvY3MpIENvcnJlY3QgbWFwIHRvIG1hcF9lcnJvciBpbiBFcnJvciBI YW5kbGluZyBHdWlkZTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlodGxh dWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzIxMTciPk9taXQgbWVudGlvbiBvZiBNZXJsaW48L2E+IGJ5 DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20veWF3YXJhbWluIj5AeWF3YXJhbWluPC9hPiA8 L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNTYyYjgxYSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzU2MmI4 MWEiPlVwY29taW5nIE9DYW1sIENvb2tib29rPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmc1NjJiODFhIj4NCjxwPldlIG1hZGUgc29tZSBwcm9ncmVzcyB0b3dh cmRzIGFkZGluZyBhIG5ldywgY29tbXVuaXR5LWRyaXZlbiBzZWN0aW9uIHRvIHRoZSBMZWFybiBh cmVhOiB0aGUgT0NhbWwgQ29va2Jvb2suIFRoZSBjb29rYm9vayBhaW1zIHRvIGJlIGEgY29tcGls YXRpb24gb2YgcmVjaXBlcyB0aGF0IHByb3ZpZGUgY29kZSBzYW1wbGVzIHRoYXQgc29sdmUgcHJh Y3RpY2FsLW1pbmRlZCB0YXNrcyB1c2luZyBwYWNrYWdlcyBmcm9tIHRoZSBPQ2FtbCBlY29zeXN0 ZW0uDQo8L3A+DQo8cD5IZXJlIGlzIHRoZSBkZXNpZ24gd2UgYXJlIGNvbnNpZGVyaW5nOiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q2F0ZWdvcnk6IEhpZ2gtbGV2ZWwgZ3JvdXBzIG9m IHRhc2tzLCBlLmcuLCBuZXR3b3JraW5nLCBkYXRhIGNvbXByZXNzaW9uLCBvciBjb21tYW5kIGxp bmUgYXJndW1lbnRzLg0KPC9saT48bGk+VGFzazogU2luZ2xlIHRoaW5nIHRvIGJlIGRvbmUgaW4g YSBjYXRlZ29yeSwgZS5nLiwgd3JpdGUgdG8gYSBmaWxlLCBtYWtlIGFuIEhUVFAgR0VUIHJlcXVl c3QsIG9yIHJldHVybiBhbiBleGl0IHN0YXR1cy4NCjwvbGk+PGxpPlJlY2lwZTogVmVyc2lvbiBv ZiB0YXNrIHVzaW5nIGEgcGFja2FnZSwgZS5nLiwgSFRUUCBHRVQgdXNpbmcgPGNvZGU+Y3VybHk8 L2NvZGU+IG9yDQo8Y29kZT5jb2h0dHA8L2NvZGU+LiA8L2xpPjwvdWw+DQo8cD5BIHJvdWdoIHBy b3RvdHlwZSBpcyBvbiBzdGFnaW5nLm9jYW1sLm9yZy9jb29rYm9vay4gVGhlIGNvbnRyaWJ1dGlv bnMgYW5kIHRoZSB1c2VyIGZlZWRiYWNrIHdlIHJlY2VpdmVkIHN1Z2dlc3QgdGhhdCB0aGUgc3Ry dWN0dXJlIG9mIHRoZSBjb29rYm9vayBuZWVkcyB0byBiZSByZWZpbmVkIG9uZSBtb3JlIHRpbWUg dW50aWwgaXQgaXMgcmVhZHkgdG8gYmUgcmVsZWFzZWQuDQo8L3A+DQo8cD5BIGdvb2QgcGxhY2Ug dG8gZ2l2ZSBmZWVkYmFjayBvbiB0aGUgY29va2Jvb2sgaXMgPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2ZlZWRiYWNrLWhlbHAtd2FudGVkLXVwY29taW5nLW9jYW1sLW9yZy1j b29rYm9vay1mZWF0dXJlLzE0MTI3LzEwIj4NCnRoaXMgZGlzY3VzcyB0aHJlYWQ8L2E+LiA8L3A+ DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzE4MzkiPlByb3RvdHlwZSBPQ2FtbCBDb29rYm9vazwvYT4NCjwvbGk+PGxpPkNvbnRy aWJ1dGlvbnMgdG8gdGhlIENvb2tib29rOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPihXSVAp IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDk5Ij5D b29rYm9vayA6IGZpbGVzeXN0ZW08L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v Ri1Mb3llciI+QEYtTG95ZXI8L2E+IDwvbGk+PGxpPihXSVApIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMTEyIj5Db29rYm9vayBuZXR3b3JraW5nPC9h PiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0YtTG95ZXIiPkBGLUxveWVyPC9hPiA8 L2xpPjxsaT4oV0lQKSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjEyMSI+Q29va2Jvb2sgeG1sPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL0YtTG95ZXIiPkBGLUxveWVyPC9hPiA8L2xpPjxsaT4oV0lQKSA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjEyMyI+Q29va2Jvb2sgOiBXZWIgLyBz aW1wbGUgSFRUUCBjbGllbnQ8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1M b3llciI+QEYtTG95ZXI8L2E+IDwvbGk+PGxpPihXSVApIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMTI0Ij5Db29rYm9vayBXZWIgLyB1cmk8L2E+IGJ5 DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1Mb3llciI+QEYtTG95ZXI8L2E+IDwvbGk+ PGxpPihXSVApIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8yMTI1Ij5Db29rYm9vazogUmVnZXhwIChwcHhfcmVnZXhwKTwvYT4gYnkNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9GLUxveWVyIj5ARi1Mb3llcjwvYT4gPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwOTciPkNvb2tib29rIDog ZW5jb2Rpbmc8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1Mb3llciI+QEYt TG95ZXI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8yMDk4Ij5Db29rYm9vayA6IGFuZCBTb3J0aW5nIGxpc3QgYW5kIGFycmF5czwv YT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GLUxveWVyIj5ARi1Mb3llcjwvYT4g PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzIxMDQiPkNvb2tib29rIHRleHRwcm9jZXNzaW5nPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL0YtTG95ZXIiPkBGLUxveWVyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjEwMCI+Q29va2Jvb3QgOiBBZGQgYSBE YXRhYmFzZSAvIGV6c3FsaXRlIGVudHJ5PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL0YtTG95ZXIiPkBGLUxveWVyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjEwNyI+Q29va2Jvb2sgY29uY3VycmVuY3kgOiBM d3Q8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1Mb3llciI+QEYtTG95ZXI8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8yMTA4Ij5Db29rYm9vayBjYXF0aSBwcHggcmFwcGVyPC9hPiBieQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL0YtTG95ZXIiPkBGLUxveWVyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjExOSI+Q29va2Jvb2sgRXpz cWxpdGUgLSB0eXBvIGFuZCByZXdyaXRpbmc8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vRi1Mb3llciI+QEYtTG95ZXI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMTE4Ij5Db29rYm9vayBTb3J0aW5nIC0gdHlw bzwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9GLUxveWVyIj5ARi1Mb3llcjwv YT4gPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzk5MmJlYjQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc5 OTJiZWI0Ij5EYXJrIE1vZGU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0 ZXh0LW9yZzk5MmJlYjQiPg0KPHA+SW4gRGVjZW1iZXIsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9veWVudWdhMTciPm95ZW51Z2ExNzwvYT4gc3RhcnRlZCB0byBpbXBsZW1lbnQgdGhlIG5l dyBkYXJrIG1vZGUgb24gT0NhbWwub3JnLg0KPC9wPg0KPHA+Qnkgbm93LCB0aGUgbmV3IGRhcmsg bW9kZSBpcyBtb3N0bHkgY29tcGxldGUsIGJ1dCBpdCBoYXNuJ3QgYmVlbiByZXZpZXdlZCBvciB0 ZXN0ZWQgc3VmZmljaWVudGx5Lg0KPC9wPg0KPHA+V2UgaGF2ZSBlbmFibGVkIHRoZSBkYXJrIG1v ZGUgb24gc3RhZ2luZy5vY2FtbC5vcmcsIGJhc2VkIG9uIHlvdXIgYnJvd3NlciAvIG9wZXJhdGlu ZyBzeXN0ZW0gcHJlZmVyZW5jZXMuIElmIHlvdSB3YW50IHRvIGhlbHAsIHlvdSBjYW4gdmlldyB0 aGUgZGFyayBtb2RlIG9uIHN0YWdpbmcub2NhbWwub3JnIGFuZCByZXBvcnQgYW55dGhpbmcgeW91 IHNlZSBieSBvcGVuaW5nIGFuIGlzc3VlLg0KPC9wPg0KPHA+PGI+Q29tcGxldGVkIFBhZ2VzOjwv Yj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODk3Ij5MZWFybi9HZXQgU3RhcnRlZCAmIzQzOyBM YW5ndWFnZSAmIzQzOyBHdWlkZXM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkwMiI+TGVhcm4vRXhjZXJjaXNlczwvYT4gYnkN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9veWVudWdhMTciPkBveWVudWdhMTc8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x OTAzIj5MZWFybi9Cb29rczwvYT4gYnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL295ZW51 Z2ExNyI+DQpAb3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkxOSI+TGVhcm4vUGxhdGZvcm0gVG9vbHM8L2E+IGJ5 DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTk0NiI+UGFja2FnZXMgU2VhcmNoIFJlc3VsdHM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk3MyI+UGFja2FnZXMgJiM0Mzsg Q29tbXVuaXR5PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL295ZW51Z2ExNyI+ QG95ZW51Z2ExNzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9wdWxsLzIwMDEiPkJsb2cgJiM0MzsgSm9icyAmIzQzOyBDaGFuZ2Vsb2c8L2E+ IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9h PiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMTgzNiI+TGVhcm4vT3ZlcnZpZXc8L2E+IGJ5IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9veWVudWdhMTciPg0KQG95ZW51Z2ExNzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMzIiPkluc3RhbGwgJiM0MzsgUGFwZXJz ICYjNDM7IExvZ29zIGFuZCBQb2xpY3kgUGFnZXM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjA1MyI+R292ZXJuYW5jZSAmIzQz OyBPdXRyZWFjaHkgSW50ZXJuc2hpcHMgUGFnZTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9veWVudWdhMTciPkBveWVudWdhMTc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDY5Ij5Lb21lcGFnZSAmIzQzOyBU dXRvcmlhbCBTZWFyY2ggUmVzdWx0cyBQYWdlPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL295ZW51Z2ExNyI+QG95ZW51Z2ExNzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIxMDkiPk9DYW1sIFdvcmtzaG9wICYj NDM7IFN1Y2Nlc3MgU3RvcmllczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v eWVudWdhMTciPkBveWVudWdhMTc8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkYmUxZDY5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnZGJlMWQ2OSI+Q29tbXVuaXR5IFNlY3Rpb24gUmV3b3JrPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdkYmUxZDY5Ij4NCjxwPlRoaXMgbW9udGgs IHdlIGhhdmUgc3RhcnRlZCB0byBkbyB1c2VyIHJlc2VhcmNoIG9uIHRoZSBjb21tdW5pdHkgYXJl YSBhbmQgZ2F0aGVyZWQgZmVlZGJhY2sgYW5kIGlkZWFzIG9uIHRoZSBjdXJyZW50IHBhZ2VzLiBB bW9uZyBvdGhlcnMsIHdlIGhhdmUgaWRlbnRpZmllZCB0aGVzZToNCjwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT50aGUgQ29tbXVuaXR5IHNlY3Rpb24gbmVlZHMgYSBiZXR0ZXIgRXZlbnRz IGRpcmVjdG9yeSA8L2xpPjxsaT50aGUgSm9icyBwYWdlIG5lZWRzIHRvIGJlIG1vcmUgZWFzaWx5 IHJlYWNoYWJsZSBmcm9tIHRoZSBjb21tdW5pdHkgcGFnZSA8L2xpPjxsaT5pdCB3b3VsZCBiZSBn cmVhdCB0byBoaWdobGlnaHQgT3BlbiBTb3VyY2UgcHJvamVjdHMgZnJvbSB0aGUgT0NhbWwgZWNv c3lzdGVtIHRoYXQgYXJlIGxvb2tpbmcgZm9yIGNvbnRyaWJ1dG9ycw0KPC9saT48L3VsPg0KPHA+ SWYgeW91IGhhdmUgb3BpbmlvbnMgb24gdGhlIGNvbW11bml0eSBzZWN0aW9uLCBmZWVsIGZyZWUg dG8gc2hhcmUgdGhlbSBpbiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbG9v a2luZy1mb3ItaWRlYXMtZm9yLXRoZS1jb21tdW5pdHktcGFnZS1hdC1vY2FtbC1vcmcvMTQwMzIv OSI+DQp0aGlzIGRpc2N1c3MgdGhyZWFkPC9hPiEgPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFu ZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDE4Ij5DcmVhdGUgQ29t bXVuaXR5IFN1Ym5hdiB0byBwdXQgSm9icyB1bmRlciBDb21tdW5pdHk8L2E+IGJ5DQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vc2FiaW5lIj5Ac2FiaW5lPC9hPiA8L2xpPjxsaT48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjAyMiI+QWRkIFRpdGxl IGZvciBCcmVhZGNydW1iIFN1Ym5hdiAoZS5nLiAmcXVvdDtMZWFybiZxdW90OyAvICZxdW90O0Nv bW11bml0eSZxdW90Oyk8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FiaW5l Ij5Ac2FiaW5lPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnN2JlM2UyNSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzdi ZTNlMjUiPkdlbmVyYWwgSW1wcm92ZW1lbnRzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmc3YmUzZTI1Ij4NCjxwPk1hbnkgdGhhbmtzIGdvIG91dCB0byB0aGUg bWFueSBjb250cmlidXRvcnMgd2hvIGhlbHBlZCBpbXByb3ZlIE9DYW1sLm9yZyBpbiBGZWJydWFy eS4gRmluZCB0aGVtIGxpc3RlZCBiZWxvdyENCjwvcD4NCjxwPjxiPlJlbGV2YW50IFBScyBhbmQg QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5HZW5lcmFsOg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8yMDI0Ij5NYWtlIHR1dG9yaWFsIGZpZWxkIHNob3J0X3RpdGxlIG9w dGlvbmFsPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FtYXJhY2hpZ29vZG5l c3M3NCI+QGFtYXJhY2hpZ29vZG5lc3M3NDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMTYiPihidWlsZCkgRG9udCBDcnVuY2gg dGhlIGRhdGEvIEZvbGRlcjwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJp bmUiPkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8yMDI4Ij5SZWZpbmUgTGVhcm4gTGFuZGluZyBQYWdlIFN0eWxlcyB0 byBtZWV0IEZpZ21hIERlc2lnbjwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9z YWJpbmUiPkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8yMDQwIj5SZW1vdmUgb2Jzb2xldGUgdGV4dCBvbiBkaWZmaWN1 bHR5IHN5bWJvbHMgb24gZXhlcmNpc2VzIHBhZ2U8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vY3VpaHRsYXVhYyI+QGN1aWh0bGF1YWM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDQ4Ij5tYWtlIHRoZSBnaXRo dWIgbGlua3Mgb24gb2NhbWwub3JnIHBvaW50IHRvIHRoZSBvY2FtbCBvcmc8L2E+IGJ5DQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vdi1nYiI+QHYtZ2I8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDc2Ij5mZWF0OiBjcmVh dGUgb2NhbWwgcGxheWdyb3VuZCBtb2JpbGUgdmlldw0KPC9hPmJ5IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9GYXR1bWFBIj5ARmF0dW1hQTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIxMjAiPkFkZCBPQ2FtbCBMYW5ndWFn ZSBNYW51YWwgYnV0dG9uIG9uIExlYXJuIE92ZXJ2aWV3IGhlcm8gc2VjdGlvbjwvYT4gYnkNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUiPkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMTE2Ij5CdWdm aXg6IFJlbW92ZSB0aGUgZHVwbGljYXRlZCAmcXVvdDtEb2NzJnF1b3Q7IGxpbmsgYW5kIG1ha2Ug aXQgbG9va3MgbGlrZSB0aGUgZmlnbWE8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20va2l5b3YwOSI+QGtpeW92MDk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDc1Ij5BZHZlcnRpc2UgYXRvbSBmZWVkIGluIGhl YWQgdXNpbmcgbGluazwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlodGxh dWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzIwNjciPmFkanVzdCBsaXN0IGJ1bGxldCBjb2xvcjwvYT4g YnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lZ21hbGV0YSI+QGVnbWFsZXRhPC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MjA3MSI+TWFrZSB0aGUgcGxheWdyb3VuZCBjdXJzb3IgbW9yZSBvYnZpb3VzPC9hPiBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4gPC9saT48bGk+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwNzgiPkFkZCBU d28gUGFja2FnZXMgdG8gJnF1b3Q7SXMgT0NhbWwgV2ViIFlldD8mcXVvdDs8L2E+IGJ5DQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1Mb3llciI+QEYtTG95ZXI8L2E+IDwvbGk+PC91bD4N CjwvbGk+PGxpPkRhdGEgcGFyc2luZzoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjAzOSI+KG9vZC1nZW4p IE1ha2Ugb3B0aW9uYWwgbGlzdCB0eXBlcyBpbiAndHV0b3JpYWxzJyB0eXBlIG5vbi1vcHRpb25h bDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lZ21hbGV0YSI+QGVnbWFsZXRh PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjA0MiI+KG9vZC1nZW4pIEFkanVzdCB0eXBlIG9mIGZpZWxkcyB3aXRoDQo8Y29kZT5s aXN0IG9wdGlvbjwvY29kZT4gdHlwZSB0byA8Y29kZT5saXN0PC9jb2RlPiBpbiBDaGFuZ2Vsb2cs IE5ld3MsIFBsYW5ldCwgYW5kIFdvcmtzaG9wPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2VnbWFsZXRhIj5AZWdtYWxldGE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMTAyIj4ob29kLWdlbikgVW5pZnkgRGF0 YS5FdmVudCAvIERhdGEuTWVldHVwIGludG8gRGF0YS5FdmVudCAvIERhdGEuRXZlbnQvUmVjdXJy aW5nRXZlbnQ8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FiaW5lIj5Ac2Fi aW5lPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMjA2OCI+KG9vZC1nZW4pIEFkanVzdCB0eXBlIG9mIGZpZWxkcyB3aXRoDQo8Y29k ZT5vcHRpb248L2NvZGU+IHR5cGUgaW4gV29ya3Nob3A8L2E+IGJ5IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9lZ21hbGV0YSI+DQpAZWdtYWxldGE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDYzIj5EbyBub3QgZ2VuZXJh dGUgZW1wdHkgZGF0YS93YXRjaC55bWw8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vY3VpaHRsYXVhYyI+QGN1aWh0bGF1YWM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDYxIj5Eb24ndCBsZXQgZ2V0X29rIHN3 YWxsb3cgZXJyb3IgY2F1c2VzPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1 aWh0bGF1YWMiPkBjdWlodGxhdWFjPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjA1NSI+KG9vZC1nZW4pIEFkanVzdCB0eXBlIG9m IGZpZWxkcyB3aXRoIGJvb2wgb3B0aW9uIHR5cGUgdG8gYm9vbCBpbiBSZWxlYXNlPC9hPiBieQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2VnbWFsZXRhIj5AZWdtYWxldGE8L2E+IDwvbGk+ PC91bD4NCjwvbGk+PGxpPkRhdGE6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMjUiPkNoYW5nZWxvZyBl bnRyeSBmb3IgT0NhbWwgNS4yLjB+YWxwaGExPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL09jdGFjaHJvbiI+QE9jdGFjaHJvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMzYiPkFkZCBjaGFuZ2Vsb2cgZW50 cnkgZm9yIHBweGxpYi4wLjMyLjAgcmVsZWFzZTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9OYXRoYW5SZWIiPkBOYXRoYW5SZWI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDUwIj5jaGFuZ2Vsb2c6IGFkZCBk dW5lLjMuMTMuMTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbWlsbG9uIj5A ZW1pbGxvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzIwOTYiPkFkZCBtaXNzaW5nIGNoYW5nZWxvZ3MgZm9yIEphbnVhcnk8L2E+ IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdG1hdHRpbyI+QHRtYXR0aW88L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8y MTEzIj4oZGF0YSkgYWRkIE1pcmFnZU9TIGhhY2sgcmV0cmVhdDwvYT4gYnkNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUiPkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMDU4Ij5BZGQgY2hhbmdlbG9n IGZvciBkdW5lLjMuMTQuMDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbWls bG9uIj5AZW1pbGxvbjwvYT4gPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iNiI+QW5ub3VuY2luZyB0aGUgTmV3IERhcmsgTW9kZSBvbiBPQ2Ft bC5vcmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubm91bmNpbmct dGhlLW5ldy1kYXJrLW1vZGUtb24tb2NhbWwtb3JnLzE0MjczLzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubm91bmNpbmctdGhlLW5ldy1kYXJrLW1vZGUtb24tb2NhbWwtb3JnLzE0 MjczLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzgw MjVlMDAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4MDI1ZTAwIj5TYWJpbmUgU2No bWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc4MDI1ZTAwIj4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGxhdW5jaCBvZiB0 aGUgbmV3IERhcmsgTW9kZSBmZWF0dXJlIG9uIG9jYW1sLm9yZy4gPC9wPg0KPHA+VGhpcyBlbmhh bmNlbWVudCB3YXMgbGVkIGJ5IFVYL1VJIGRlc2lnbmVyIEBDbGFpcmVfVmFuZGVuYmVyZ2hlLCBm b2N1c2luZyBvbiBhbiBpbnR1aXRpdmUgYW5kIGV5ZS1mcmllbmRseSBkZXNpZ24gc3VpdGFibGUg Zm9yIGV4dGVuZGVkIHVzZS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZmVhdHVyZSB3YXMg Y2FycmllZCBvdXQgYnkgT3V0cmVhY2h5IGludGVybiBAU2V1biwgc3Bhbm5pbmcgZnJvbSBEZWNl bWJlciB0byBNYXJjaC4gV2UNCiBhcmUgdmVyeSBoYXBweSB3aXRoIGhlciB3b3JrLiA8L3A+DQo8 cD5UaGlzIHVwZGF0ZSBhaW1zIHRvIHByb3ZpZGUgYSBtb3JlIGNvbWZvcnRhYmxlIGJyb3dzaW5n IGV4cGVyaWVuY2UsIGVzcGVjaWFsbHkgZm9yIHRob3NlIHdobyBwcmVmZXIgYSBkYXJrZXIgaW50 ZXJmYWNlIGZvciByZWFkaW5nIGRvY3VtZW50YXRpb24uDQo8L3A+DQo8cD5XZSBpbnZpdGUgeW91 IHRvIGV4cGxvcmUgdGhlIG5ldyBkYXJrIG1vZGUgYW5kIHJlcG9ydCBhbnkgaXNzdWVzIGFuZCBw b3NzaWJsZSBpbXByb3ZlbWVudHMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvaXNzdWVzIj5oZXJlPC9hPiEgOnNwYXJrbGVzOjpoZWFydDogPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjciPkNhbGwgZm9yIHByZXNlbnRhdGlvbnMg4oCTIE1MIDIwMjQ6 IEFDTSBTSUdQTEFOIE1MIEZhbWlseSBXb3Jrc2hvcDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvY2FsbC1mb3ItcHJlc2VudGF0aW9ucy1tbC0yMDI0LWFjbS1zaWdwbGFu LW1sLWZhbWlseS13b3Jrc2hvcC8xNDI4NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9jYWxsLWZvci1wcmVzZW50YXRpb25zLW1sLTIwMjQtYWNtLXNpZ3BsYW4tbWwtZmFtaWx5LXdv cmtzaG9wLzE0Mjg0LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzc1OTlhMDciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc3NTk5YTA3Ij5H dWlsbGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc1OTlhMDciPg0KPHA+V2UgYXJlIGhhcHB5IHRvIGlu dml0ZSBzdWJtaXNzaW9ucyB0byB0aGUgPGI+TUwgMjAyNDwvYj4gd29ya3Nob3A6IDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjI4Y2MyYiIgY2xhc3M9Im91dGxp bmUtNCI+DQo8aDQgaWQ9Im9yZzYyOGNjMmIiPkhpZ2hlci1vcmRlciwgVHlwZWQsIEluZmVycmVk LCBTdHJpY3Q6IEFDTSBTSUdQTEFOIE1MIEZhbWlseSBXb3Jrc2hvcDwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNjI4Y2MyYiI+DQo8cD5Dby1sb2NhdGVkIHdp dGggPGEgaHJlZj0iaHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvIj5JQ0ZQIDwvYT48L3A+DQo8 ZGwgY2xhc3M9Im9yZy1kbCI+PGR0PkRhdGU8L2R0PjxkZD5GcmlkYXksIFNlcHRlbWJlciA2LCAy MDI0IDwvZGQ+PGR0PkxvY2F0aW9uPC9kdD48ZGQ+TWlsYW4sIEl0YWx5IDwvZGQ+PC9kbD4NCjxw PjxhIGhyZWY9Imh0dHBzOi8vaWNmcDI0LnNpZ3BsYW4ub3JnL2hvbWUvbWx3b3Jrc2hvcC0yMDI0 Ij5DYWxsIGZvciBwcmVzZW50YXRpb25zDQo8L2E+PC9wPg0KPHA+TUwgKG9yaWdpbmFsbHksIOKA nE1ldGEgTGFuZ3VhZ2XigJ0pIGlzIGEgZmFtaWx5IG9mIHByb2dyYW1taW5nIGxhbmd1YWdlcyB0 aGF0IGluY2x1ZGVzIGRpYWxlY3RzIGtub3duIGFzIFN0YW5kYXJkIE1MLCBPQ2FtbCwgYW5kIEYj LCBhbW9uZyBvdGhlcnMuIFRoZSBkZXZlbG9wbWVudCBvZiB0aGVzZSBsYW5ndWFnZXMgaGFzIGlu c3BpcmVkIGEgbGFyZ2UgYW1vdW50IG9mIGNvbXB1dGVyIHNjaWVuY2UgcmVzZWFyY2gsIGJvdGgg cHJhY3RpY2FsIGFuZA0KIHRoZW9yZXRpY2FsLiA8L3A+DQo8cD5UaGUgTUwgRmFtaWx5IFdvcmtz aG9wIGlzIGFuIGVzdGFibGlzaGVkIGluZm9ybWFsIHdvcmtzaG9wIGFpbWluZyB0byByZWNvZ25p emUgdGhlIGVudGlyZSBleHRlbmRlZCBNTCBmYW1pbHkgYW5kIHRvIHByb3ZpZGUgdGhlIGZvcnVt IHRvIHByZXNlbnQgYW5kIGRpc2N1c3MgY29tbW9uIGlzc3VlczogYWxsIGFzcGVjdHMgb2YgdGhl IGRlc2lnbiwgc2VtYW50aWNzLCB0aGVvcnksIGFwcGxpY2F0aW9uLCBpbXBsZW1lbnRhdGlvbiwg YW5kIHRlYWNoaW5nDQogb2YgdGhlIG1lbWJlcnMgb2YgdGhlIE1MIGZhbWlseS4gV2UgYWxzbyBl bmNvdXJhZ2UgcHJlc2VudGF0aW9ucyBmcm9tIHJlbGF0ZWQgbGFuZ3VhZ2VzIChzdWNoIGFzIEhh c2tlbGwsIFNjYWxhLCBSdXN0LCBOZW1lcmxlLCBMaW5rcywgS29rYSwgRiosIEVmZiwgQVRTLCBl dGMpLCB0byBwcm9tb3RlIHRoZSBleGNoYW5nZSBvZiBpZGVhcyBhbmQgZXhwZXJpZW5jZS4gVGhl IE1MIGZhbWlseSB3b3Jrc2hvcCB3aWxsIGJlIGhlbGQgaW4gY2xvc2UgY29vcmRpbmF0aW9uDQog d2l0aCB0aGUgT0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgV29ya3Nob3AuIDwvcD4NCjxwPldl IHBsYW4gdGhlIHdvcmtzaG9wIHRvIGFuIGJlIGluLXBlcnNvbiBldmVudCB3aXRoIHJlbW90ZSBw YXJ0aWNpcGF0aW9uIChzdHJlYW1lZCBsaXZlKS4gU3BlYWtlcnMgYXJlIGdlbmVyYWxseSBleHBl Y3RlZCB0byBwcmVzZW50IGluIHBlcnNvbiAod2Ugd2lsbCB3b3JrIHRvIG1ha2UgcmVtb3RlIHBy ZXNlbnRhdGlvbnMgcG9zc2libGUpLg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkRl YWRsaW5lIGZvciB0YWxrIHByb3Bvc2FsczogPGI+VGh1cnNkYXksIEp1bmUgNiwgMjAyNCAoQW9F KTwvYj4gPC9saT48bGk+Tm90aWZpY2F0aW9uIG9mIGFjY2VwdGFuY2U6IDxiPlNhdHVyZGF5LCBK dWx5IDYsIDIwMjQ8L2I+IDwvbGk+PGxpPldvcmtzaG9wOiA8Yj5GcmlkYXksIFNlcHRlbWJlciA2 LCAyMDI0PC9iPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnYjY3OWVhNCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2I2Nzll YTQiPkZvcm1hdDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn YjY3OWVhNCI+DQo8cD5UaGUgTUwgMjAyNCB3b3Jrc2hvcCB3aWxsIGNvbnRpbnVlIHRoZSBpbmZv cm1hbCBhcHByb2FjaCBmb2xsb3dlZCBzaW5jZSAyMDEwLiBQcmVzZW50YXRpb25zIGFyZSBzZWxl Y3RlZCBieSB0aGUgcHJvZ3JhbSBjb21taXR0ZWUgZnJvbSBzdWJtaXR0ZWQgcHJvcG9zYWxzLiBU aGVyZSBhcmUgbm8gcHVibGlzaGVkIHByb2NlZWRpbmdzLCBzbyBjb250cmlidXRpb25zIG1heSBi ZSBzdWJtaXR0ZWQgZm9yIHB1YmxpY2F0aW9uIGVsc2V3aGVyZS4gVGhlDQogbWFpbiBjcml0ZXJp b24gaXMgdGhlIHByb21vdGluZyBhbmQgaW5mb3JtaW5nIHRoZSBkZXZlbG9wbWVudCBvZiB0aGUg ZW50aXJlIGV4dGVuZGVkIE1MIGZhbWlseSBhbmQgZGVsaXZlcmluZyBhIGxpdmVseSB3b3Jrc2hv cCBhdG1vc3BoZXJlLiBXZSBwYXJ0aWN1bGFybHkgZW5jb3VyYWdlIHRhbGtzIGFib3V0IHdvcmtz IGluIHByb2dyZXNzLCBwcmVzZW50YXRpb25zIG9mIG5lZ2F0aXZlIHJlc3VsdHMgKHRoaW5ncyB0 aGF0IHdlcmUgZXhwZWN0ZWQNCiB0byBidXQgZGlkIG5vdCBxdWl0ZSB3b3JrIG91dCkgYW5kIGlu Zm9ybWVkIHBvc2l0aW9ucy4gPC9wPg0KPHA+V2Ugc2VlayBwcmVzZW50YXRpb25zIG9uIHRvcGlj cyBpbmNsdWRpbmcgKGJ1dCBub3QgbGltaXRlZCB0byk6IGxhbmd1YWdlIGRlc2lnbiwgaW1wbGVt ZW50YXRpb24sIHR5cGUgc3lzdGVtcywgYXBwbGljYXRpb25zLCBlbnZpcm9ubWVudHMsIHNlbWFu dGljcy4gV2Ugc3BlY2lmaWNhbGx5IGVuY291cmFnZSByZXBvcnRpbmcgd2hhdCBkaWQgbm90IG1l ZXQgZXhwZWN0YXRpb25zIG9yIHdoYXQsIGRlc3BpdGUgYWxsIGVmZm9ydHMsIGRpZCBub3QNCiB3 b3JrIHRvIHNhdGlzZmFjdGlvbi4gRm91ciBraW5kcyBvZiBzdWJtaXNzaW9ucyBhcmUgc29saWNp dGVkOiBSZXNlYXJjaCBQcmVzZW50YXRpb25zLCBFeHBlcmllbmNlIFJlcG9ydHMsIERlbW9zLCBh bmQgSW5mb3JtZWQgUG9zaXRpb25zLg0KPC9wPg0KPHA+VGhlIHBvaW50IG9mIHRoZSBzdWJtaXNz aW9uIHNob3VsZCBiZSBjbGVhciBmcm9tIGl0cyBmaXJzdCB0d28gcGFnZXMgKFBDIG1lbWJlcnMg YXJlIG5vdCBvYmxpZ2F0ZWQgdG8gcmVhZCBhbnkgZnVydGhlci4pDQo8L3A+DQo8cD5TZWUgdGhl IDxhIGhyZWY9Imh0dHBzOi8vaWNmcDI0LnNpZ3BsYW4ub3JnL2hvbWUvbWx3b3Jrc2hvcC0yMDI0 I0NhbGwtZm9yLVByZXNlbnRhdGlvbnMiPg0KZnVsbCBjYWxsIGZvciBwcmVzZW50YXRpb25zIDwv YT5mb3Igc2NvcGUgYW5kIHN1Ym1pc3Npb24gaW5zdHJ1Y3Rpb25zLiA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5kcmVhbS1odG1sIDMuMC4wPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0zLTAtMC8xNDAxMy82Ij5o dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRyZWFtLWh0bWwtMy0wLTAvMTQwMTMvNjwv YT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnM2ZkZjBkOSIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzNmZGYwZDkiPllhd2FyIEFtaW4gYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczZmRmMGQ5 Ij4NCjxwPltBTk5dIGRyZWFtLWh0bWwgMy4yLjAgPC9wPg0KPHA+VGhhbmtzIHRvIE1hcmNvIFNj aG5laWRlciBmb3Igbm90aWNpbmcgYW5kIGFkZGluZyBhIG1pc3NpbmcgY29udmVuaWVuY2Ugd3Jh cHBlciBmb3INCjxjb2RlPkRyZWFtLnNlbmQ8L2NvZGU+LCBub3cgd2UgaGF2ZSA8Y29kZT5EcmVh bV9odG1sLnNlbmQ8L2NvZGU+IHRvIHdyaXRlIG1hcmt1cCBkaXJlY3RseSB0byBhIFdlYlNvY2tl dCBhcyB0ZXh0Lg0KPC9wPg0KPHA+QWxzbyBhIGNoYW5nZSB0byB1c2Ugb3VyIGludGVybmFsIGZ1 bmN0aW9uIHRvIGVzY2FwZSB0aGUgdGV4dCBpbnNpZGUgSFRNTCBjb21tZW50cyBpZQ0KPGNvZGU+ Y29tbWVudCAmcXVvdDt4eXomcXVvdDs8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iOSI+cHB4X21pbmlkZWJ1ZyAxLjMuMDogdG93YXJkIGEgbG9nZ2luZyBmcmFtZXdvcms8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtbWluaWRlYnVn LTEtMy0wLXRvd2FyZC1hLWxvZ2dpbmctZnJhbWV3b3JrLzE0MjEzLzIiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtbWluaWRlYnVnLTEtMy0wLXRvd2FyZC1hLWxvZ2dpbmct ZnJhbWV3b3JrLzE0MjEzLzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzUwYmE1M2MiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1MGJhNTNj Ij5MdWthc3ogU3RhZmluaWFrIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnNTBiYTUzYyI+DQo8cD5IYXBweSB0byBzYXkgPGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC5vcmcvcC9wcHhfbWluaWRlYnVnL2xhdGVzdCI+cHB4X21pbmlkZWJ1ZyAxLjQu MDwvYT4gaXMgbm93IGluIHRoZSBvcGFtIHJlcG9zaXRvcnkuIFRoZSB0d28gbmV3IGZlYXR1cmVz IHNpbmNlIDEuMy4wIGFyZToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5hIDxzcGFu IGNsYXNzPSJ1bmRlcmxpbmUiPlRhYmxlIG9mIENvbnRlbnRzPC9zcGFuPiB2aWV3IG9uIGxvZ3Ms IGEgbG9nIGZpbGUgd2l0aCBzZWxlY3RlZCBsb2cgZW50cnkgaGVhZGVycyBhcyBoeXBlcmxpbmtz IHBvaW50aW5nIHRvIGFuY2hvcnMgaW4gdGhlIHJlZ3VsYXIgbG9nIGZpbGUocyksIHRoZSB0YWJs ZSBvZiBjb250ZW50cyBsb2dzIHByZXNlcnZlIHRoZSBsb2cgdHJlZSBoaWVyYXJjaHkgYnV0IGRv bid0IHVzZSBmb2xkaW5nLA0KPC9saT48bGk+dGltZSBzdGFtcHMgb3B0aW9uYWxseSBvdXRwdXQg YXMgdGltZSBlbGFwc2VkIHNpbmNlIHRoZSBzdGFydCBvZiBhIHByb2dyYW0gcmF0aGVyIHRoYW4g YXMgd2FsbC1jbG9jayB0aW1lcy4NCjwvbGk+PC91bD4NCjxwPldoYXQgZnV0dXJlIGRldmVsb3Bt ZW50IG9mIDxjb2RlPnBweF9taW5pZGVidWc8L2NvZGU+IHdvdWxkIHlvdSBsaWtlIHRvIHNlZT8g PC9wPg0KPHA+W3BvbGwgdHlwZT1yZWd1bGFyIHJlc3VsdHM9YWx3YXlzIHB1YmxpYz10cnVlIGNo YXJ0VHlwZT1iYXJdIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JIHdhbnQgZmxhbWUg Z3JhcGhzIDwvbGk+PGxpPkkgd2FudCBiZXR0ZXIgc3VwcG9ydCBmb3IgZXhjZXB0aW9ucyA8L2xp PjxsaT5JIHdhbnQgPGNvZGU+JWxvZ19lbnRyeTwvY29kZT4gKHJlbGVhc2UgMS41LjAgYWxyZWFk eSkgPC9saT48bGk+cHB4X21pbmlkZWJ1ZyBpcyBhbHJlYWR5IGdvb2QgZW5vdWdoIGZvciBtZSA8 L2xpPjxsaT5wcHhfbWluaWRlYnVnIGlzIG5vdCBmb3IgbWUgYW55d2F5IDwvbGk+PC91bD4NCjxw PlsvcG9sbF0gPC9wPg0KPHA+VGhhbmsgWW91ISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjEwIj5PdGhlciBPQ2FtbCBOZXdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC0xMCI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlYTIy YWY5IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZWEyMmFmOSI+RnJvbSB0aGUgb2Nh bWwub3JnIGJsb2c8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2VhMjJhZjkiPg0KPHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3Jl Z2F0ZWQgYXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9y ZyBibG9nPC9hPi4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBz Oi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTAzLTA3LWEtdGltZS1mb3ItY2hhbmdlLW91ci1yZXNw b25zZS10by10aGUtd2hpdGUtaG91c2UtY3liZXJzZWN1cml0eS1wcmVzcy1yZWxlYXNlIj5BIFRp bWUgZm9yIENoYW5nZTogT3VyIFJlc3BvbnNlIHRvIHRoZSBXaGl0ZSBIb3VzZSBDeWJlcnNlY3Vy aXR5IFByZXNzIFJlbGVhc2U8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0NGIwZjcyIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0ib3JnNDRiMGY3MiI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtb3JnNDRiMGY3MiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3Mg YSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVl Lm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEknbGwgbWFpbCBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8 L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWls LCB5b3UgbWF5IHN1YnNjcmliZSB0byB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9zeW1wYS5pbnJpYS5m ci9zeW1wYS9pbmZvL2NhbWwtbGlzdCI+DQpjYW1sLWxpc3Q8L2E+LiA8L3A+DQo8ZGl2IGNsYXNz PSJhdXRob3JuYW1lIiBpZD0ib3JnZDY0NjM3YiI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 5 Mar 2024 14:51:32 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 5 Mar 2024 14:51:32 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 5 Mar 2024 14:51:32 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 425EpfU2029764 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 5 Mar 2024 14:51:41 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 425EpTQf029748 for ; Tue, 5 Mar 2024 14:51:29 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 Mar 2024 15:51:26 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6A433E0CD3; Tue, 5 Mar 2024 15:51:26 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5CEDFE004E for ; Tue, 5 Mar 2024 15:51:19 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Mar 2024 15:51:16 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 463E3564848; Tue, 5 Mar 2024 15:51:14 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHabwydVceqVheddUy+9bFsqk8ayg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 5 Mar 2024 14:50:41 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: bcaf4c17-fcb4-4332-0708-08dc3d23bf66 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.06,205,1705359600"; d="scan'208,217";a="81344078" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499118, queueID=D549956484A x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMy0wNSBUdWUgMTU6NDkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDIuMjcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMy4xMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDI3IHRvIE1hcmNoIDA1LCAy MDI0Lg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0K PGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVu dHMiIHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5taXJhZ2UtY3J5cHRv IDAuMTEuMyAod2l0aCBtb3JlIHNwZWVkIGZvciBlbGxpcHRpYyBjdXJ2ZXMpIOKAkyBhbmQgdGhl IGZ1dHVyZSByb2FkbWFwIG9mIG1pcmFnZS1jcnlwdG88L2E+DQo8L2xpPjxsaT48YSBocmVmPSIj MiI+T2NzaWdlbjogc3VtbWFyeSBvZiByZWNlbnQgcmVsZWFzZXM8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiMzIj5PQ2FtbCBQbGF0Zm9ybSBOZXdzbGV0dGVyOiBKYW51YXJ5IDIwMjQ8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM0Ij5EaXNjdXNzaW9ucyBvbiB0aGUgZnV0dXJlIG9mIHRoZSBvcGFtIHJl cG9zaXRvcnk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5vY2FtbC1wcm90b2MtcGx1Z2luIDUu MC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+cHB4X21pbmlkZWJ1ZyAxLjMuMDogdG93YXJk IGEgbG9nZ2luZyBmcmFtZXdvcms8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5pb3N0cmVhbSAw LjI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5Cb2d1ZSwgdGhlIE9DYW1sIEdVSTwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzkiPk93bCBwcm9qZWN0IHJlc3RydWN0dXJlZDwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzEwIj4yMCYjNDM7IHdheXMgdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSB3aXRoIGZv cmVpZ24gbGliczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5vcGFtIGJ1aWxkIGFuZCBvcGFt IHRlc3Q6IHRoZSBvcGFtIHBsdWdpbnMgdGhhdCBzaW1wbGlmaWVzIHlvdXIgZGV2IHNldHVwPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iIzEyIj5TZWVraW5nIGZlZWRiYWNrIG9uIHJlcGFja2FnZWQg bGlicmFyaWVzIGZvciBCYXNlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTMiPk91dHJlYWNoeSBp bnRlcm5zaGlwIGRlbW8gc2Vzc2lvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzE0Ij5kcmVhbS1o dG1sIDMuMC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTUiPkFkZCB5b3VyIE9DYW1sIEV2ZW50 cyB0byB0aGUgQ29tbXVuaXR5IFBhZ2Ugb24gT0NhbWwub3JnPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMTYiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc0YTA2NTI0 Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPm1pcmFnZS1jcnlw dG8gMC4xMS4zICh3aXRoIG1vcmUgc3BlZWQgZm9yIGVsbGlwdGljIGN1cnZlcykg4oCTIGFuZCB0 aGUgZnV0dXJlIHJvYWRtYXAgb2YgbWlyYWdlLWNyeXB0bzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW1pcmFnZS1jcnlwdG8tMC0xMS0zLXdpdGgtbW9yZS1zcGVl ZC1mb3ItZWxsaXB0aWMtY3VydmVzLWFuZC10aGUtZnV0dXJlLXJvYWRtYXAtb2YtbWlyYWdlLWNy eXB0by8xNDIwMC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWlyYWdlLWNy eXB0by0wLTExLTMtd2l0aC1tb3JlLXNwZWVkLWZvci1lbGxpcHRpYy1jdXJ2ZXMtYW5kLXRoZS1m dXR1cmUtcm9hZG1hcC1vZi1taXJhZ2UtY3J5cHRvLzE0MjAwLzE8L2E+DQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzk3OTQ3OGQiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmc5Nzk0NzhkIj5IYW5uZXMgTWVobmVydCBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzk3OTQ3OGQiPg0KPHA+d2XigJly ZSBoYXBweSB0byBhbm5vdW5jZSBtaXJhZ2UtY3J5cHRvIDAuMTEuMyAod2hpY2gganVzdCBnb3Qg bWVyZ2VkIHRvIG9wYW0tcmVwb3NpdG9yeSksIHdoaWNoIGluY2x1ZGVzIGh1Z2UgcGVyZm9ybWFu Y2UgaW1wcm92ZW1lbnRzIGZvciBlbGxpcHRpYyBjdXJ2ZXMuIFRoZSBBUEkgZGlkbuKAmXQgY2hh bmdlIGF0IGFsbCA6KQ0KPC9wPg0KPHA+VGhlIGJhY2tncm91bmQgc3RvcnkgaXMgdGhhdCB3ZSBm aW5hbGx5IG1lcmdlZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJh Z2UtY3J5cHRvL3B1bGwvMTQ2Ij4NCuKAnHVzZSBieXRlcyBpbnN0ZWFkIG9mIENzdHJ1Y3QudOKA nSBQUjwvYT4gd2hpY2ggd2FzIG9wZW5lZCB+4oCLMi41IHllYXJzIGFnbyBieSBAZGlub3NhdXJl LiBXZSByZXZpZXdlZCB0aGF0LCBhbmQgZGlkIHNvbWUgYmVuY2htYXJrcy4gQW5kIGV2ZW4gd2Vu dCBhIGJpdCBmdXJ0aGVyIGFuZCBhcmUgbm93IHVzaW5nDQo8Y29kZT5zdHJpbmc8L2NvZGU+IChp bnN0ZWFkIG9mIDxjb2RlPmJ5dGVzPC9jb2RlPikuIFNlZSA8YSBocmVmPSJodHRwczovL2Jsb2cu cm9idXIuY29vcC9hcnRpY2xlcy9zcGVlZGluZy1lYy1zdHJpbmcuaHRtbCI+DQpodHRwczovL2Js b2cucm9idXIuY29vcC9hcnRpY2xlcy9zcGVlZGluZy1lYy1zdHJpbmcuaHRtbDwvYT4gZm9yIGZ1 cnRoZXIgZGV0YWlscy4NCjwvcD4NCjxwPkFub3RoZXIgUFIgd29ydGggbWVudGlvbmluZyBpcyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcHVsbC8xOTEi Pg0KdXNlIHdpbmRvd2VkIGFsZ29yaXRobSBmb3IgYmFzZSBzY2FsYXIgbXVsdGlwbGljYXRpb248 L2E+IGZyb20gVmlyZ2lsZSBSb2JsZXMg4oCTIG5vdyBzb21lIHByZWNvbXB1dGVkIHRhYmxlcyBh cmUgc2hpcHBlZCAoc2FtZSBhcHByb2FjaCB3YXMgZG9uZSBmb3IgMjU1MTkgYWxyZWFkeSkuDQo8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS1jcnlwdG8v cHVsbC8xOTEiPlNlZTwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJh Z2UtY3J5cHRvL3B1bGwvMTkxI2lzc3VlY29tbWVudC0xOTMyMDAzMDAyIj4NCnRoaXM8L2E+IDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9wdWxsLzE5MSNp c3N1ZWNvbW1lbnQtMTk1MTgzNjk5NiI+DQpQUjwvYT4gKGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL3JlbGVhc2VzL3RhZy92MC4xMS4zIj4N CnJlbGVhc2Ugbm90ZXM8L2E+KSBmb3Igc29tZSBkZXRhaWxlZCBwZXJmb3JtYW5jZSBudW1iZXJz IG9uIGRpZmZlcmVudCBDUFVzIOKAkyB0aGUgUDI1NiBzaWduIG9wZXJhdGlvbiBpcyBhcm91bmQg MTB4IGZhc3RlciB0aGFuIG9sZGVyIHJlbGVhc2VzLiBUaGlzIGlzIHN0aWxsIDUgdGltZXMgc2xv d2VyIHRoYW4gT3BlblNTTCAtIGJ1dCB0aGVuIHdlIHVzZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL21pdC1wbHYvZmlhdC1jcnlwdG8vIj5maWF0LWNyeXB0bzwvYT4gaW5zdGVhZCBvZiBo YW5kY3JhZnRlZCBhc3NlbWJseSBjb2RlLiBXZeKAmXJlIGtlZW4gdG8gaW1wcm92ZSB0aGUgcGVy Zm9ybWFuY2UgZXZlbiBmdXJ0aGVyIOKAkyBpZGVhcywgb2JzZXJ2YXRpb25zLCBleHBlcmltZW50 cyBhbmQgUFJzIGFyZSB2ZXJ5IHdlbGNvbWUuIFdlIGludmVzdGlnYXRlZCBiZW5jaG1hcmtpbmcg b2YgZS5nLg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRv L3B1bGwvMjAyIj5kaWdlc3QgYWxnb3JpdGhtcyBhY3Jvc3MgdGhlIE9DYW1sIGVjb3N5c3RlbSBh bmQgT3BlblNTTCBhcyBiYXNlbGluZTwvYT4gYW5kIHdlbGNvbWUgaW1wcm92ZW1lbnRzIGFuZCBm dXJ0aGVyIHdvcmsgb24gdGhhdCAoZXNwZWNpYWxseSBBRVMtR0NNIGFuZCBQb2x5MTMwNS1DaGFD aGEyMCBhcmUgcGFpbmZ1bGx5IHNsb3cgY29tcGFyZWQgdG8gT3BlblNTTCkuDQo8L3A+DQo8cD5P dGhlciBpbXByb3ZlbWVudHMgYW5kIGZpeGVzIGluY2x1ZGUgc3VwcG9ydCBmb3IgTG9vbmdhcmNo LCBOZXRCU0QsIHVzZSByZHRpbWUgaW5zdGVhZCBvZiByZGN5Y2xlIG9uIFJJU0MtViB3aGVuIGlu IHVzZXIgbW9kZSwgaW5pdGlhbCBzdXBwb3J0IGZvciBDTC5FWEUuIFRoYW5rcyB0byBldmVyeW9u ZSBpbnZvbHZlZCBpbiB0aGlzIHJlbGVhc2VkOiBAamJlY2tmb3JkIEByZXluaXIgQGRpbm9zYXVy ZSBAcGFsYWlucCBAZWR3aW4NCjwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vbWlyYWdlL21pcmFnZS1jcnlwdG8vcmVsZWFzZXMvdGFnL3YwLjExLjMiPmZ1bGwgY2hhbmdl bG9nPC9hPiBtYXkgYmUgd29ydGggdG8gcmVhZC4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnNzYxYjcyYSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y Zzc2MWI3MmEiPkZ1dHVyZSByb2FkbWFwIChicmVha2luZyBjaGFuZ2VzKTwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNzYxYjcyYSI+DQo8cD5BbHNvLCBwbGVh c2Ugbm90ZSBpZiB5b3XigJlyZSB1c2luZyBtaXJhZ2UtY3J5cHRvIHRoYXQgd2XigJlsbCByZXZp c2UgdGhlIEFQSSBhbmQgbm8gbG9uZ2VyIHVzZSBDc3RydWN0LnQgLyBiaWdhcnJheXMsIGJ1dCBp bnN0ZWFkIGJ5dGVzL3N0cmluZy4gMC4xMS4zIHdpbGwgYmUgdGhlIGxhc3QgcmVsZWFzZSB1c2lu ZyBDc3RydWN0LnQuIFRoZSBoYXNoIGZ1bmN0aW9uYWxpdHkgKDxjb2RlPk1pcmFnZV9jcnlwdG8u SGFzaDwvY29kZT4pIHdpbGwgYWxzbw0KIGJlIHJlbW92ZWQgKHNpbmNlIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9taXJhZ2UvZGlnZXN0aWYiPmRpZ2VzdGlmPC9hPiBpbXBsZW1lbnRzIHRo ZW0gbmljZWx5KS4gUGxlYXNlIHZvaWNlIHlvdXIgY29uY2VybnMgLyBpZGVhcyBhdA0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9taXJhZ2UtY3J5cHRvL2lzc3Vlcy8yMDUiPmh0 dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0by9pc3N1ZXMvMjA1PC9hPg0KPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+T2NzaWdlbjogc3VtbWFyeSBv ZiByZWNlbnQgcmVsZWFzZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L29jc2lnZW4tc3VtbWFyeS1vZi1yZWNlbnQtcmVsZWFzZXMvMTM4MTcvNiI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NzaWdlbi1zdW1tYXJ5LW9mLXJlY2VudC1yZWxlYXNlcy8xMzgx Ny82PC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVhODNj ZjMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1YTgzY2YzIj5WaW5jZW50IEJhbGF0 IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn NWE4M2NmMyI+DQo8cD5FbGlvbSAxMC4zLjEgcmVsZWFzZWQ6IDwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5GaXhpbmcgUHJvYmxlbSB3aXRoIGJyb3dzZXIgbmF2aWdhdGlvbiA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9lbGlvbS9pc3N1ZXMvNzgxIj4NCmh0dHBzOi8v Z2l0aHViLmNvbS9vY3NpZ2VuL2VsaW9tL2lzc3Vlcy83ODE8L2E+IDwvbGk+PGxpPkFkZGluZyBy YXcgZXZlbnRzIGhhbmRsZXJzIGluIEVsaW9tX2NvbnRlbnQuSHRtbC5GLlJhdyBmb3Igc2VydmVy LXNpZGUgb25seSBwcm9ncmFtbWluZw0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjMiPk9DYW1sIFBsYXRmb3JtIE5ld3NsZXR0ZXI6IEphbnVhcnkgMjAyNDwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci1q YW51YXJ5LTIwMjQvMTQyMDMvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwt cGxhdGZvcm0tbmV3c2xldHRlci1qYW51YXJ5LTIwMjQvMTQyMDMvMTwvYT4gPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4MDljMTBmIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnODA5YzEwZiI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4MDljMTBmIj4NCjxwPldlbGNv bWUgdG8gdGhlIG5pbnRoIGVkaXRpb24gb2YgdGhlIE9DYW1sIFBsYXRmb3JtIG5ld3NsZXR0ZXIh IDwvcD4NCjxwPkluIHRoaXMgSmFudWFyeSAyMDI0IGVkaXRpb24sIHdlIGFyZSBleGNpdGVkIHRv IGJyaW5nIHlvdSB0aGUgbGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29udGludWluZyBv dXIgdHJhZGl0aW9uIG9mIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1lbnRzIGFzIHNlZW4g aW4NCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL3BsYXRmb3JtLW5ld3Ns ZXR0ZXIiPnByZXZpb3VzIGVkaXRpb25zPC9hPi4gVG8gdW5kZXJzdGFuZCB0aGUgZGlyZWN0aW9u IHdl4oCZcmUgaGVhZGVkLCBlc3BlY2lhbGx5IHJlZ2FyZGluZyBkZXZlbG9wbWVudCB3b3JrZmxv d3MgYW5kIHVzZXIgZXhwZXJpZW5jZSBpbXByb3ZlbWVudHMsIGNoZWNrIG91dCBvdXINCjxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCI+cm9hZG1hcDwvYT4u IDwvcD4NCjxwPjxiPkhpZ2hsaWdodHM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+QSBwcmV2aWV3IHZlcnNpb24gb2YgdGhlIGxvbmctYXdhaXRlZCBNZXJsaW4gcHJvamVjdC13 aWRlIHJlZmVyZW5jZXMgaXMgYXZhaWxhYmxlLiBSZWFkIG1vcmUgb24NCjxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHJldmlldy1wbGF5LXdpdGgtcHJvamVjdC13aWRl LW9jY3VycmVuY2VzLWZvci1vY2FtbC8xMzgxNCI+DQp0aGUgYW5ub3VuY2VtZW50PC9hPi4gPC9s aT48bGk+QSBmaXJzdCBiZXRhIG9mIG9wYW0gMi4yIGlzIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL2NoYW5nZWxvZy8yMDI0LTAxLTE4LW9wYW0tMi0yLTAtYmV0YTEiPg0KYXZhaWxhYmxlPC9h PiEgVHJ5IGl0LCBhbmQgbGV0IHRoZSBvcGFtIHRlYW0ga25vdyBpZiB5b3UgZW5jb3VudGVyIGFu eSBpc3N1ZXMgdXNpbmcgb3BhbSBvbiBXaW5kb3dzLg0KPC9saT48bGk+VGhlIDxjb2RlPm9kb2M8 L2NvZGU+IHRlYW0gc3RhcnRlZCBhbiBlZmZvcnQgdG8gdW5pZnkgdGhlIE9DYW1sLm9yZyBwYWNr YWdlIGRvY3VtZW50YXRpb24gd2l0aCB0aGUgbG9jYWwgd29ya2Zsb3cgcHJvdmlkZWQgYnkgRHVu ZS4gVGhpcyBpcyB2ZXJ5IGV4Y2l0aW5nLCBhcyB0aGUgcmVzdWx0IHNob3VsZCBiZSBhIG11Y2gg aW1wcm92ZWQgbG9jYWwgZG9jdW1lbnRhdGlvbiB3aXRoIER1bmUgYW5kIGZhc3RlciByZWxlYXNl cyBvZg0KPGNvZGU+b2RvYzwvY29kZT4gZmVhdHVyZXMgb24gT0NhbWwub3JnLiBUaGV5IGFyZSBh dCB0aGUgdmVyeSBiZWdpbm5pbmcgb2YgdGhlIHByb2plY3QsIGJ1dCBzdGF5IHR1bmVkIGZvciBl eGNpdGluZyBuZXdzIGluIHRoZSBjb21pbmcgbW9udGhzIQ0KPC9saT48L3VsPg0KPHA+PGI+UmVs ZWFzZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjQtMDEtMTYtZHVuZS0zLjEzLjAiPkR1bmUgMy4xMy4w PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0w MS0wNS1kdW5lLTMuMTIuMiI+RHVuZSAzLjEyLjI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI0LTAxLTE4LW9wYW0tMi0yLTAtYmV0YTEiPm9wYW0g Mi4yLjB+YmV0YTE8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFu Z2Vsb2cvMjAyNC0wMS0yNC1vZG9jLTIuNC4xIj48Y29kZT5vZG9jPC9jb2RlPiAyLjQuMTwvYT4N CjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTRjNjkz YiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzk0YzY5M2IiPjxiPltEdW5lXTwvYj4g RXhwbG9yaW5nIFBhY2thZ2UgTWFuYWdlbWVudCBpbiBEdW5lICg8YSBocmVmPSJodHRwczovL29j YW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzQtYnVpbGQtYS1wcm9qZWN0Ij5XNDwvYT4p PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc5NGM2OTNiIj4N CjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHJncmluYmVyZyAoVGFyaWRlcyksIEBMZW9uaWRh cy1mcm9tLVhJViAoVGFyaWRlcyksIEBncmlkYnVncyAoVGFyaWRlcyksIEBraXQtdHkta2F0ZSAo VGFyaWRlcyksIEBBbGl6dGVyDQo8L3A+DQo8cD48Yj5XaHk6PC9iPiBVbmlmeSBPQ2FtbCB0b29s aW5nIHVuZGVyIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBmb3IgYWxsIGRldmVsb3BtZW50IHdvcmtm bG93cy4gVGhpcyBhZGRyZXNzZXMgb25lIG9mIHRoZSBtb3N0IGltcG9ydGFudCBwYWluIHBvaW50 cw0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9vbWJhMWQ4dmhsam5yY24vT0Nh bWwtdXNlci1zdXJ2ZXktMjAyMC5wZGY/ZGw9MCI+DQpyZXBvcnRlZCBieSB0aGUgY29tbXVuaXR5 PC9hPi4gPC9wPg0KPHA+PGI+V2hhdDo8L2I+IFByb3RvdHlwaW5nIHRoZSBpbnRlZ3JhdGlvbiBv ZiBwYWNrYWdlIG1hbmFnZW1lbnQgaW50byBEdW5lIHVzaW5nIG9wYW0gYXMgYSBsaWJyYXJ5LiBX ZeKAmXJlIGludHJvZHVjaW5nIGENCjxjb2RlPmR1bmUgcGtnIGxvY2s8L2NvZGU+IGNvbW1hbmQg dG8gZ2VuZXJhdGUgYSBsb2NrIGZpbGUgYW5kIGVuaGFuY2luZyA8Y29kZT5kdW5lIGJ1aWxkPC9j b2RlPiB0byBoYW5kbGUgZGVwZW5kZW5jaWVzIGluIHRoZSBsb2NrIGZpbGUuIE1vcmUgZGV0YWls cyBpbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy83 NjgwIj5EdW5lIFJGQzwvYT4uIDwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+U3VwcG9ydCBvcGFt4oCZcyBwaW4tZGVwZW5kcyBmaWVsZCDi gJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85Njg1Ij4NCmh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTY4NTwvYT4gPC9saT48bGk+U2V0ICV7 cGtnOmRldn0gY29ycmVjdGx5IGZvciBwYWNrYWdlcyB0aGF0IHVzZSBkZXYgc291cmNlcyDigJMg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NjA1Ij4NCmh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTYwNTwvYT4gPC9saT48bGk+UmVtb3ZlIFJl cG9zaXRvcnlfaWQgcmVmYWN0b3IsIHdoaWNoIGluc3RlYWQgbm93IHVzZXMgR2l0IFVSTHMgdG8g c3BlY2lmeSByZXZpc2lvbnMg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9wdWxsLzk2MTQiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTYxNDwv YT4NCjwvbGk+PGxpPlJlbW92ZSA8Y29kZT4tLXNraXAtdXBkYXRlPC9jb2RlPiBhbmQgYXV0b21h dGljYWxseSBpbmZlciBvZmZsaW5lIG1vZGUgd2hlbiBwb3NzaWJsZSDigJMNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTY4MyI+aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvcHVsbC85NjgzPC9hPg0KPC9saT48bGk+U3VwcG9ydCBzdWJtb2R1bGVzIGlu IHJlcG9zIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzk3 OTgiPg0KaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85Nzk4PC9hPiA8L2xpPjxs aT5Eb27igJl0IGRvd25sb2FkIHRoZSBzYW1lIHBhY2thZ2Ugc291cmNlIGFyY2hpdmUgbXVsdGlw bGUgdGltZXMgZHVyaW5nIGEgYnVpbGQuIE1hbnkgT0NhbWwgcGFja2FnZXMgYXJlIGluIEdpdCBy ZXBvcyAoYW5kIHNvdXJjZSBhcmNoaXZlcykgd2l0aCBzZXZlcmFsIG90aGVyIHJlbGF0ZWQgcGFj a2FnZXMsIGFuZCBpdOKAmXMgY29tbW9uIGZvciBhIHByb2plY3QgdG8gZGVwZW5kIG9uIHNldmVy YWwgcGFja2FnZXMgZnJvbSB0aGUgc2FtZSByZXBvLg0KIFdpdGhvdXQgdGhpcyBjaGFuZ2UsIHRo ZSBzb3VyY2UgYXJjaGl2ZSBmb3IgYSByZXBvIHdvdWxkIGJlIGRvd25sb2FkZWQgb25jZSBmb3Ig ZWFjaCBwYWNrYWdlIGZyb20gdGhhdCByZXBvIGFwcGVhcmluZyBpbiBhIHByb2plY3TigJlzIGRl cGVuZGVuY2llcyDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1 bGwvOTc3MSI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NzcxPC9hPg0KPC9s aT48bGk+QWRkIGEgY29uZCBzdGF0ZW1lbnQgZm9yIGNob29zaW5nIGxvY2tkaXJzLiBUaGlzIGFs bG93cyB0aGUgbG9ja2RpciB0byBiZSBjaG9zZW4gYmFzZWQgb24gcHJvcGVydGllcyBvZiB0aGUg Y3VycmVudCBzeXN0ZW0gKGUuZy4sIE9TLCBhcmNoaXRlY3R1cmUpIHdoaWNoIHdpbGwgc2ltcGxp Znkgd29ya2luZyBvbiBwcm9qZWN0cyB3aXRoIHN5c3RlbS1zcGVjaWZpYyBkZXBlbmRlbmNpZXMu IOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NzUwIj5o dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzk3NTA8L2E+DQo8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjIwNzVhMCIgY2xh c3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2IyMDc1YTAiPjxiPltvcGFtXTwvYj4gTmF0aXZl IFN1cHBvcnQgZm9yIFdpbmRvd3MgaW4gb3BhbSAyLjIgKDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3NS1tYW5hZ2UtZGVwZW5kZW5jaWVzIj5XNTwvYT4p PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdiMjA3NWEwIj4N CjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHJqYm91IChPQ2FtbFBybyksIEBraXQtdHkta2F0 ZSAoVGFyaWRlcyksIEBkcmEyNyAoVGFyaWRlcyksIEBBbHRHciAoT0NhbWxQcm8pDQo8L3A+DQo8 cD48Yj5XaHk6PC9iPiBFbmhhbmNlIE9DYW1s4oCZcyB2aWFiaWxpdHkgb24gV2luZG93cyBieSBp bnRlZ3JhdGluZyBuYXRpdmUgb3BhbSBhbmQNCjxjb2RlPm9wYW0tcmVwb3NpdG9yeTwvY29kZT4g c3VwcG9ydCwgZm9zdGVyaW5nIGEgbGFyZ2VyIGNvbW11bml0eSBhbmQgbW9yZSBXaW5kb3dzLWZy aWVuZGx5IHBhY2thZ2VzLg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+IFJlbGVhc2luZyBvcGFtIDIu MiB3aXRoIG5hdGl2ZSBXaW5kb3dzIHN1cHBvcnQsIG1ha2luZyB0aGUgb2ZmaWNpYWwNCjxjb2Rl Pm9wYW0tcmVwb3NpdG9yeTwvY29kZT4gdXNhYmxlIG9uIFdpbmRvd3MgcGxhdGZvcm1zLiA8L3A+ DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFk ZCA8Y29kZT5yc3luYzwvY29kZT4gcGFja2FnZSB0byBpbnRlcm5hbCBDeWd3aW4gcGFja2FnZXMg bGlzdCAoZW5hYmxlcyBsb2NhbCBwaW5uaW5nIGFuZCBpcyB1c2VkIGJ5IHRoZSBWQ1MgYmFja2Vu ZHMg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzU4MDgi Pm9jYW1sL29wYW0jNTgwODwvYT4gPC9saT48bGk+Q2hlY2sgYW5kIGFkdmVydGlzZSB0byB1c2Ug R2l0IGZvciBXaW5kb3dzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS9wdWxsLzU3MTgiPg0Kb2NhbWwvb3BhbSM1NzE4PC9hPiA8L2xpPjxsaT5SZWxlYXNlZCA8YSBo cmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0wMS0xOC1vcGFtLTItMi0wLWJl dGExIj5vcGFtIDIuMn5iZXRhMTwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2Y2I1MjZkIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnNmNiNTI2ZCI+PGI+W+KAizxjb2RlPm9kb2M8L2NvZGU+4oCLXTwvYj4gVW5pZnkg T0NhbWwub3JnIGFuZCBMb2NhbCBQYWNrYWdlIERvY3VtZW50YXRpb248L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzZjYjUyNmQiPg0KPHA+KDxhIGhyZWY9Imh0 dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3MjUtZ2VuZXJhdGUtZG9jdW1l bnRhdGlvbiI+VzI1PC9hPikNCjwvcD4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQGpvbmx1 ZGxhbSAoVGFyaWRlcyksIEBqdWxvdyAoVGFyaWRlcyksIEBwYW5nbGVzZCAoVGFyaWRlcykNCjwv cD4NCjxwPjxiPldoeTo8L2I+IEltcHJvdmluZyBsb2NhbCBkb2N1bWVudGF0aW9uIGdlbmVyYXRp b24gd29ya2Zsb3cgd2lsbCBoZWxwIHBhY2thZ2UgYXV0aG9ycyB3cml0ZSBiZXR0ZXIgZG9jdW1l bnRhdGlvbiBmb3IgdGhlaXIgcGFja2FnZXMsIGFuZCBjb25zb2xpZGF0aW5nIHRoZSBkaWZmZXJl bnQNCjxjb2RlPm9kb2M8L2NvZGU+IGRvY3VtZW50YXRpb24gZ2VuZXJhdG9ycyB3aWxsIGhlbHAg bWFrZSBjb250aW51b3VzIGltcHJvdmVtZW50cyB0bw0KPGNvZGU+b2RvYzwvY29kZT4gYXZhaWxh YmxlIHRvIGEgbGFyZ2VyIGF1ZGllbmNlLiA8L3A+DQo8cD48Yj5XaGF0OjwvYj4gV2Ugd2lsbCB3 cml0ZSBjb252ZW50aW9ucyB0aGF0IGRyaXZlcnMgbXVzdCBmb2xsb3cgdG8gZW5zdXJlIHRoYXQg dGhlaXIgb3V0cHV0IHdpbGwgYmUgZnVuY3Rpb25hbC4gT25jZSBlc3RhYmxpc2hlZCwgd2Ugd2ls bCB1cGRhdGUgdGhlIGR1bmUgcnVsZXMgdG8gZm9sbG93IHRoZXNlIHJ1bGVzLCBhY2Nlc3MgbmV3 DQo8Y29kZT5vZG9jPC9jb2RlPiBmZWF0dXJlcyAoZS5nLiwgc291cmNlIHJlbmRlcmluZykgYW5k IHByb3ZpZGUgc2ltaWxhciBmdW5jdGlvbmFsaXRpZXMgdG8gZG9jcy5vY2FtbC5vcmcgKGEgbmF2 aWdhdGlvbmFsIHNpZGViYXIgZm9yIGluc3RhbmNlKS4gVGhpcyB3aWxsIGVmZmVjdGl2ZWx5IG1h a2UgRHVuZSB1c2FibGUgdG8gZ2VuZXJhdGUgT0NhbWwub3JnIHBhY2thZ2UgZG9jdW1lbnRhdGlv bi4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+V2Ugc3RhcnRlZCBieSBjb21wYXJpbmcgdGhlIHZhcmlvdXMgZHJpdmVycywgdGhlaXIg bmVlZHMgYW5kIGNvbnN0cmFpbnRzLCBhbmQgdG8gZmxlc2ggb3V0IHdoYXQgdGhlIGNvbnZlbnRp b25zIGNvdWxkIGxvb2sgbGlrZS4gV2Ugd2lsbCBwdWJsaXNoIGFuIFJGQyBiZWZvcmUgc3RhcnRp bmcgdGhlIGltcGxlbWVudGF0aW9uIHdvcmsgdG8gZW5zdXJlIHRoYXQgd2UgaW5kZWVkIHVuZGVy c3Rvb2QgdGhlIG5lZWRzIG9mIGV2ZXJ5b25lLg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzBkZTZjZTEiIGNsYXNzPSJvdXRsaW5lLTQi Pg0KPGg0IGlkPSJvcmcwZGU2Y2UxIj48Yj5b4oCLPGNvZGU+b2RvYzwvY29kZT7igItdPC9iPiBB ZGQgU2VhcmNoIENhcGFiaWxpdGllcyB0byA8Y29kZT4NCm9kb2M8L2NvZGU+ICg8YSBocmVmPSJo dHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzI1LWdlbmVyYXRlLWRvY3Vt ZW50YXRpb24iPlcyNTwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmcwZGU2Y2UxIj4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHBhbmdsZXNkIChU YXJpZGVzKSwgQEVtaWxlVHJvdGlnbm9uIChUYXJpZGVzKSwgQGp1bG93IChUYXJpZGVzKSwgQGpv bmx1ZGxhbSAoVGFyaWRlcykNCjwvcD4NCjxwPjxiPldoeTo8L2I+IEltcHJvdmUgdXNhYmlsaXR5 IGFuZCBuYXZpZ2FiaWxpdHkgaW4gT0NhbWwgcGFja2FnZXMgZG9jdW1lbnRhdGlvbiwgYm90aCBs b2NhbGx5IGFuZCBvbiBPQ2FtbC5vcmcsIGJ5IG9mZmVyaW5nIGFkdmFuY2VkIHNlYXJjaCBvcHRp b25zIGxpa2UgdHlwZS1iYXNlZCBxdWVyaWVzLg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+IEltcGxl bWVudGluZyBhIHNlYXJjaCBlbmdpbmUgaW50ZXJmYWNlIGluIDxjb2RlPm9kb2M8L2NvZGU+LCBj b21wbGV0ZSB3aXRoIGEgVUkgYW5kIGEgc2VhcmNoIGluZGV4LiBBZGRpdGlvbmFsbHksIHdl4oCZ cmUgZGV2ZWxvcGluZyBhIGRlZmF1bHQgY2xpZW50LXNpZGUgc2VhcmNoIGVuZ2luZSBiYXNlZCBv biBTaGVybG9kb2MuDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPldlIGtlcHQgd29ya2luZyBvbiBTaGVybG9kb2MgaW4gSmFudXJheSwg YW5kIGEgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zaGVybG9kb2Mt YS1zZWFyY2gtZW5naW5lLWZvci1vY2FtbC1kb2N1bWVudGF0aW9uLzE0MDExIj4NCm5ldyB2ZXJz aW9uIHdhcyByZWxlYXNlZDwvYT4gYSBmZXcgd2Vla3MgYWdvLCB3aGljaCBjYW4gbm93IGJlIGVt YmVkZGVkIG9uIDxjb2RlPg0Kb2RvYzwvY29kZT4tYnVpbHQgZG9jIHNpdGVzLiA8L2xpPjxsaT5X ZSBhbHNvIGZpbmlzaGVkIHVwZGF0aW5nIHRoZSBEdW5lIHJ1bGVzIHdoaWNoIGRyaXZlIDxjb2Rl Pm9kb2M8L2NvZGU+LCB0byBlbmFibGUgdGhlIG5ldyBzZWFyY2ggZmVhdHVyZSBvbiBsb2NhbGx5 IGJ1aWx0IGRvY3MuIFRoZXNlIGNoYW5nZXMgd2VyZSByZWxlYXNlZCBhcyBwYXJ0IG9mIER1bmUg My4xNC4wLiDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwv OTc3MiI+b2NhbWwvZHVuZSM5NzcyPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTJkNDMzYyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8 aDQgaWQ9Im9yZzUyZDQzM2MiPjxiPlvigIs8Y29kZT5vZG9jPC9jb2RlPuKAi108L2I+IFN5bnRh eCBmb3IgSW1hZ2VzIGFuZCBBc3NldHMgaW4gPGNvZGU+DQpvZG9jPC9jb2RlPiAoPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwI3cyNS1nZW5lcmF0ZS1kb2N1 bWVudGF0aW9uIj5XMjU8L2E+KTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9 InRleHQtb3JnNTJkNDMzYyI+DQo8cD48Yj5Db250cmlidXRlZCBieTo8L2I+IEBwYW5nbGVzZCAo VGFyaWRlcyksIEBqb25sdWRsYW0gKFRhcmlkZXMpLCBAZGJ1ZW56bGksIEBncGV0aW90IChUYXJp ZGVzKQ0KPC9wPg0KPHA+PGI+V2h5OjwvYj4gRW1wb3dlciBwYWNrYWdlIGF1dGhvcnMgdG8gY3Jl YXRlIHJpY2gsIGVuZ2FnaW5nIGRvY3VtZW50YXRpb24gYnkgZW5hYmxpbmcgdGhlIGludGVncmF0 aW9uIG9mIG11bHRpbWVkaWEgZWxlbWVudHMgZGlyZWN0bHkgaW50byBPQ2FtbCBwYWNrYWdlIGRv Y3VtZW50YXRpb24uDQo8L3A+DQo8cD48Yj5XaGF0OjwvYj4gV2XigJlyZSBpbnRyb2R1Y2luZyBu ZXcgc3ludGF4IGFuZCBzdXBwb3J0IGZvciBlbWJlZGRpbmcgbWVkaWEgKGltYWdlcywgYXVkaW8s IHZpZGVvcykgYW5kIGhhbmRsaW5nIGFzc2V0cyB3aXRoaW4gdGhlDQo8Y29kZT5vZG9jPC9jb2Rl PiBlbnZpcm9ubWVudC4gPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5UaGUgUFIgaXMgc3RpbGwgdW5kZXIgYWN0aXZlIHJldmlldyBhbmQg d2XigJlyZSBhZGRyZXNzaW5nIHRoZSBsYXN0IG1pbm9yIGNvbmNlcm5zLiDigJMNCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvMTAwMiI+b2NhbWwvb2RvYyMxMDAy PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnYTA2ZjQzNiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2EwNmY0MzYiPjxi PlvigIs8Y29kZT5vZG9jPC9jb2RlPuKAi108L2I+IEltcHJvdmluZyA8Y29kZT5vZG9jPC9jb2Rl PiBQZXJmb3JtYW5jZSAoPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1y b2FkbWFwI3cyNS1nZW5lcmF0ZS1kb2N1bWVudGF0aW9uIj5XMjU8L2E+KTwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTA2ZjQzNiI+DQo8cD48Yj5Db250cmli dXRlZCBieTo8L2I+IEBqb25sdWRsYW0gKFRhcmlkZXMpLCBAanVsb3cgKFRhcmlkZXMpLCBAZ3Bl dGlvdCAoVGFyaWRlcykNCjwvcD4NCjxwPjxiPldoeTo8L2I+IEFkZHJlc3MgcGVyZm9ybWFuY2Ug aXNzdWVzIGluIDxjb2RlPm9kb2M8L2NvZGU+LCBwYXJ0aWN1bGFybHkgZm9yIGxhcmdlLXNjYWxl IGRvY3VtZW50YXRpb24sIHRvIGVuaGFuY2UgZWZmaWNpZW5jeSBhbmQgdXNlciBleHBlcmllbmNl IGFuZCB1bmxvY2sgbG9jYWwgZG9jdW1lbnRhdGlvbiBnZW5lcmF0aW9uIGluIGxhcmdlIGNvZGUg YmFzZXMuDQo8L3A+DQo8cD48Yj5XaGF0OjwvYj4gUHJvZmlsaW5nIDxjb2RlPm9kb2M8L2NvZGU+ IHRvIGlkZW50aWZ5IHRoZSBtYWluIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIGFuZCBvcHRpbWlz aW5nDQo8Y29kZT5vZG9jPC9jb2RlPiB3aXRoIHRoZSBmaW5kaW5ncy4gPC9wPg0KPHA+PGI+QWN0 aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XZSBpbnZlc3RpZ2F0 ZWQgYSBjb3VwbGUgb2YgaXNzdWVzIGJyb3VnaHQgZm9ydGggYnkgdGhlIDxjb2RlPm1vZHVsZSB0 eXBlIG9mPC9jb2RlPiBmaXggdGhhdCB3YXMgbWVudGlvbmVkIGxhc3QgbW9udGguIFRoaXMgZXZl bnR1YWxseSByZXN1bHRlZCBpbiBhIHNlcmllcyBvZiBQUnM6DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwNzgiPm9jYW1sL29kb2MjMTA3ODwvYT4sIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvMTA3OSI+DQpvY2FtbC9vZG9j IzEwNzk8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxs LzEwODEiPm9jYW1sL29kb2MjMTA4MTwvYT4NCjwvbGk+PGxpPldlIGFsc28gbm90aWNlZCB0aGF0 IDxjb2RlPm9kb2M8L2NvZGU+4oCZcyBoYW5kbGluZyBvZiB0aGUgbG9hZCBwYXRoIHdhcyBxdWFk cmF0aWMsIHNvIHdlIGNoYW5nZWQgdGhhdCBpbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29kb2MvcHVsbC8xMDc1Ij5vY2FtbC9vZG9jIzEwNzU8L2E+LiA8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOWJjMjIwZiIgY2xh c3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzliYzIyMGYiPjxiPltNZXJsaW5dPC9iPiBTdXBw b3J0IGZvciBQcm9qZWN0LVdpZGUgUmVmZXJlbmNlcyBpbiBNZXJsaW4gKDxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3MTktbmF2aWdhdGUtY29kZSI+VzE5 PC9hPik8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzliYzIy MGYiPg0KPHA+PGI+Q29udHJpYnV0ZWQgYnk6PC9iPiBAdm9vZG9vcyAoVGFyaWRlcyksIEB0cmVm aXMgKFRhcmlkZXMpLCBARWtkb2hpYnMgKE9DYW1sUHJvKSwgQGdhc2NoZSAoSU5SSUEpLCBAT2N0 YWNocm9uIChJTlJJQSkNCjwvcD4NCjxwPjxiPldoeTo8L2I+IEVuaGFuY2UgY29kZSBuYXZpZ2F0 aW9uIGFuZCByZWZhY3RvcmluZyBmb3IgZGV2ZWxvcGVycyBieSBwcm92aWRpbmcgcHJvamVjdC13 aWRlIHJlZmVyZW5jZSBlZGl0b3IgZmVhdHVyZXMsIGFsaWduaW5nIE9DYW1sIHdpdGggdGhlIGVk aXRvciBleHBlcmllbmNlIGZvdW5kIGluIG90aGVyIGxhbmd1YWdlcy4NCjwvcD4NCjxwPjxiPldo YXQ6PC9iPiBJbnRyb2R1Y2luZyA8Y29kZT5tZXJsaW4gc2luZ2xlIG9jY3VycmVuY2VzPC9jb2Rl PiBhbmQgTFNQIDxjb2RlPg0KdGV4dERvY3VtZW50L3JlZmVyZW5jZXM8L2NvZGU+IHN1cHBvcnQs IGV4dGVuZGluZyBjb21waWxlcuKAmXMgU2hhcGVzIGZvciBnbG9iYWwgb2NjdXJyZW5jZXMgYW5k IGludGVncmF0aW5nIHRoZXNlIGZlYXR1cmVzIGluIER1bmUsIE1lcmxpbiwgYW5kIE9DYW1sIExT UC4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+UmVsZWFzZWQgYSBwcmV2aWV3IHZlcnNpb24gb2YgcHJvamVjdC13aWRlIHJlZmVyZW5j ZXMgYW5kIGFubm91bmNlZCBpdCBvbiBEaXNjdXNzLCBhc2tpbmcgZm9yIGZlZWRiYWNrIC0NCjxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHJldmlldy1wbGF5LXdpdGgt cHJvamVjdC13aWRlLW9jY3VycmVuY2VzLWZvci1vY2FtbC8xMzgxNCI+DQpQbGF5IHdpdGggcHJv amVjdC13aWRlIG9jY3VycmVuY2VzIGZvciBPQ2FtbCE8L2E+IDwvbGk+PGxpPk1lcmdlZCB0aGUg Y29tcGlsZXIgUFIgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVs bC8xMjUwOCI+DQpvY2FtbC9vY2FtbCMxMjUwNjwvYT4gPC9saT48bGk+QXMgYSB0ZWFzZXIgZm9y IGZ1dHVyZSB3b3JrIHRoYXQgd2lsbCBidWlsZCBvbiBwcm9qZWN0LXdpZGUgcmVmZXJlbmNlcywg d2Ugc3RhcnRlZCBwcm90b3R5cGluZyB0aGUgcHJvamVjdC13aWRlDQo8Y29kZT5yZW5hbWU8L2Nv ZGU+IGZlYXR1cmUgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9vY2FtbC1s c3AvdHJlZS9pbmRleC1wcmV2aWV3Ij4NCnZvb2Rvb3Mvb2NhbWwtbHNwI2luZGV4LXByZXZpZXc8 L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmczNTY5ODEzIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMzU2OTgxMyI+PGI+ W01lcmxpbl08L2I+IEltcHJvdmluZyBNZXJsaW7igJlzIFBlcmZvcm1hbmNlICg8YSBocmVmPSJo dHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzE5LW5hdmlnYXRlLWNvZGUi PlcxOTwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcz NTY5ODEzIj4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHBpdGFnIChUYXJpZGVzKSwgQEVu Z2lsIChUYXJpZGVzKSA8L3A+DQo8cD48Yj5XaHk6PC9iPiBTb21lIE1lcmxpbiBxdWVyaWVzIGhh dmUgYmVlbiBzaG93biB0byBzY2FsZSBwb29ybHkgaW4gbGFyZ2UgY29kZWJhc2VzLCBtYWtpbmcg dGhlIGVkaXRvciBleHBlcmllbmNlIHN1YnBhci4gVXNlcnMgcmVwb3J0IHRoYXQgdGhleSBzb21l dGltZXMgbXVzdCB3YWl0IGEgZmV3IHNlY29uZHMgdG8gZ2V0IHRoZSBhbnN3ZXIuIFRoaXMgaXMg b2J2aW91c2x5IGEgbWFqb3IgaXNzdWUgdGhhdCBodXJ0cyBkZXZlbG9wZXIgZXhwZXJpZW5jZSwN CiBzbyB3ZeKAmXJlIHdvcmtpbmcgb24gaW1wcm92aW5nIE1lcmxpbiBwZXJmb3JtYW5jZSB3aGVu IGl0IGZhbGxzIHNob3J0LiA8L3A+DQo8cD48Yj5XaGF0OjwvYj4gRGV2ZWxvcGluZyBiZW5jaG1h cmtpbmcgdG9vbHMgYW5kIG9wdGltaXNpbmcgTWVybGlu4oCZcyBwZXJmb3JtYW5jZSB0aHJvdWdo IHRhcmdldGVkIGltcHJvdmVtZW50cyBiYXNlZCBvbiBwcm9maWxpbmcgYW5kIGFuYWx5c2lzIG9m IGJlbmNobWFyayByZXN1bHRzLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XZSBtZXJnZWQgdGhlIEZ1enp5IHRlc3RpbmcgQ0kuIEFz IGEgcmVtaW5kZXIsIHRoaXMgQ0kgdGVzdHMgTWVybGluIFBScyBmb3IgYmVoYXZpb3VyIHJlZ3Jl c3Npb25zLiBUaGlzIHdpbGwgaGVscCB1cyBtYWtlIHN1cmUgdGhhdCB3ZSBkb27igJl0IGluYWR2 ZXJ0ZW50bHkgYnJlYWsgTWVybGluIHF1ZXJpZXMgYnkgdGVzdGluZyB0aGVtIG9uIGEgYnJvYWQg cmFuZ2Ugb2YgdXNlIGNhc2VzIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9t ZXJsaW4vcHVsbC8xNzE2Ij5vY2FtbC9tZXJsaW4jMTcxNjwvYT4gPC9saT48bGk+SW4gPGNvZGU+ bWVybGluLWxpYjwvY29kZT4sIHdlIHN0YXJ0ZWQgd3JpdGluZyBhIHByb3RvdHlwZSB0byBwcm9j ZXNzIHRoZSBidWZmZXIgaW4gcGFyYWxsZWwgd2l0aCB0aGUgcXVlcnkgY29tcHV0YXRpb24uIFBh cmFsbGVsaXNtIHJlZmVycyB0byBPQ2FtbCA1IHBhcmFsbGVsaXNtIChkb21haW5zKS4NCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPkRpc2N1c3Npb25zIG9u IHRoZSBmdXR1cmUgb2YgdGhlIG9wYW0gcmVwb3NpdG9yeTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvZGlzY3Vzc2lvbnMtb24tdGhlLWZ1dHVyZS1vZi10aGUtb3BhbS1y ZXBvc2l0b3J5LzEzODk4LzkiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Rpc2N1c3Np b25zLW9uLXRoZS1mdXR1cmUtb2YtdGhlLW9wYW0tcmVwb3NpdG9yeS8xMzg5OC85PC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0NmE1NTJkIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNDZhNTUyZCI+S2F0ZSBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQ2YTU1MmQiPg0KPHA+VGhlIG5v dGVzIGZvciBsYXN0IHdlZWvigJlzIG1lZXRpbmcgYXJlIGF2YWlsYWJsZSA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8yMzc4OSNpc3N1ZWNv bW1lbnQtMTk2MTc1NzMzNSI+DQpoZXJlPC9hPiA8L3A+DQo8cD48aT5Gb3IgZXZlcnlvbmUgd2hv IHdhbnRzIHRvIGNvbWUgdG8gdGhlIG5leHQgbWVldGluZywgcGxlYXNlIGZpbGwgPGEgaHJlZj0i aHR0cHM6Ly9mcmFtYWRhdGUub3JnL3FEMlBiNTdCN2g2eEo4VTQiPg0KdGhlIGZyYW1hZGF0ZTwv YT4gYXMgc29vbiBhcyB5b3Uga25vdyB3aGVuIHlvdSBhcmUgYXZhaWxhYmxlLCBzbyB0aGF0IHdl IGNhbiBwbGFuIHdoZW4gdGhlIG1lZXRpbmcgaXMgZ29pbmcgdG8gYmUuPC9pPg0KPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPm9jYW1sLXByb3RvYy1wbHVnaW4gNS4wLjA8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1wcm90b2MtcGx1Z2lu LTUtMC0wLzE0MjA1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1w cm90b2MtcGx1Z2luLTUtMC0wLzE0MjA1LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnZDA5NTAwOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2QwOTUwMDgiPkFuZGVycyBGdWdtYW5uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZDA5NTAwOCI+DQo8cD5JdOKAmXMgbXkgcGxlYXN1cmUg dG8gYW5ub3VuY2UgcmVsZWFzZSA1LjAuMCBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v YW5kZXJzZnVnbWFubi9vY2FtbC1wcm90b2MtcGx1Z2luIj4NCm9jYW1sLXByb3RvYy1wbHVnaW48 L2E+LiA8L3A+DQo8cD5vY2FtbC1wcm90b2MtcGx1Z2luIGlzIGEgcGx1Z2luIGZvciB0aGUgZ29v Z2xlIHByb3RvYnVmIGNvbXBpbGVyLCA8Y29kZT5wcm90b2M8L2NvZGU+LCB0byBnZW5lcmF0ZSB0 eXBlIG1hcHBpbmdzIGFuZCBmdW5jdGlvbnMgZm9yIHNlcmlhbGl6YXRpb24gYW5kIGRlLXNlcmlh bGl6YXRpb24gb2YgZ29vZ2xlIHByb3RvY29sIGJ1ZmZlcnMuIFRoZSBwbHVnaW4gYWltcyB0byBi ZSBmdWxseSBjb21wbGlhbnQgd2l0aCB0aGUgcHJvdG9idWYgc3BlY2lmaWNhdGlvbg0KIGFuZCBy ZWNvbW1lbmRhdGlvbnMgYW5kIHRvIGdlbmVyYXRlIGFuIGludHVpdGl2ZSBtYXBwaW5nIGJldHdl ZW4gZ29vZ2xlIHByb3RvYnVmIG1lc3NhZ2UgZGVmaW5pdGlvbnMgYW5kIE9jYW1sIHR5cGVzLiBP Y2FtbC1wcm90b2MtcGx1Z2luIGlzIHdyaXR0ZW4gaW4gcHVyZSBvY2FtbC4NCjwvcD4NCjxwPlZl cnNpb24gNS4wLjAgaW5jbHVkZXMgb3B0aW9uIHRvIG1lcmdlIG1lc3NhZ2VzIHRvIGJlIGZ1bGx5 IGNvbXBsaWFudCB3aXRoIHRoZSBwcm90b2J1ZiBzcGVjaWZpY2F0aW9uIGFuZCBmaXhlcyBidWdz IHJlbGF0ZWQgdG8gbmFtZSBtYXBwaW5nIHRvIGF2b2lkIG5hbWUgY29sbGlzaW9ucyBhbmQgZml4 IGNvZGUgZ2VuZXJhdGlvbiBlcnJvciBpbiBzb21lIGNvcm5lciBjYXNlcy4NCjwvcD4NCjxwPlNl cmlhbGl6YXRpb24gYW5kIGRlc2VyaWFsaXphdGlvbiBoYXMgYWxzbyBiZWVuIGh1Z2VseSBvcHRp bWl6ZWQgZm9yIHNwZWVkIGFuZCBpcyBub3cgb24gcGFyIHdpdGggb3RoZXIgb2NhbWwgcHJvdG9i dWYgaW1wbGVtZW50YXRpb25zIChiZW5jaGVkIGFnYWluc3Qgb2NhbWwtcHJvdG9jKQ0KPC9wPg0K PHA+b2NhbWwtcHJvdG9idWYtcGx1Z2luIDUuMC4wIGlzIGF2YWlsYWJsZSB0aG91Z2ggb3BhbSBh bmQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FuZGVyc2Z1Z21hbm4vb2Nh bWwtcHJvdG9jLXBsdWdpbiI+DQpwcm9qZWN0IHBhZ2U8L2E+IG9uIGdpdGh1Yi4gPC9wPg0KPHA+ RnVsbCBjaGFuZ2Vsb2cgaXMgYXZhaWxhYmxlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9h bmRlcnNmdWdtYW5uL29jYW1sLXByb3RvYy1wbHVnaW4vcmVsZWFzZXMiPg0KaGVyZTwvYT4gPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPnBweF9taW5pZGVidWcgMS4zLjA6IHRvd2Fy ZCBhIGxvZ2dpbmcgZnJhbWV3b3JrPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tcHB4LW1pbmlkZWJ1Zy0xLTMtMC10b3dhcmQtYS1sb2dnaW5nLWZyYW1ld29yay8x NDIxMy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHB4LW1pbmlkZWJ1Zy0x LTMtMC10b3dhcmQtYS1sb2dnaW5nLWZyYW1ld29yay8xNDIxMy8xPC9hPg0KPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkYjI1OTNmIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnZGIyNTkzZiI+THVrYXN6IFN0YWZpbmlhayBhbm5vdW5jZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2RiMjU5M2YiPg0KPHA+SGkh IEnigJltIGhhcHB5IHRvIGludml0ZSB5b3UgdG8gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2x1a3N0YWZpL3BweF9taW5pZGVidWciPg0KcHB4X21pbmlkZWJ1ZyAx LjMuMDwvYT4uIEl04oCZcyBub3cgYXZhaWxhYmxlIGluIHRoZSBvcGFtIHJlcG9zaXRvcnkuIFNv bWUgbmV3IGZlYXR1cmVzIHNpbmNlIHZlcnNpb24gMS4wOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkV4dGVuc2lvbiBwb2ludCB2YXJpYW50cyB0aGF0IHN1cHBvcnQgZGVidWcgcnVu dGltZSBwYXNzaW5nLCB0aGV5IHNpbXBsaWZ5IGhhdmluZyBlLmcuIGRlZGljYXRlZCBsb2cgZmls ZXMgZm9yIHRocmVhZHMgb3IgZG9tYWlucy4NCjwvbGk+PGxpPlVucmVnaXN0ZXJlZCBleHRlbnNp b24gcG9pbnRzIDxjb2RlPiVsb2c8L2NvZGU+LCA8Y29kZT4lbG9nX3Jlc3VsdDwvY29kZT4sIDxj b2RlPg0KJWxvZ19wcmludGJveDwvY29kZT4gdG8gZXhwbGljaXRseSBsb2cgdmFsdWVzLiA8L2xp PjxsaT5Mb2cgbGV2ZWxzIGF0IHJ1bnRpbWUgdG8gcmVzdHJpY3QgaG93IG11Y2ggaXMgbG9nZ2Vk LCBhbmQgYXQgY29tcGlsZSB0aW1lIHRvIHJlc3RyaWN0IGhvdyBtdWNoIGxvZ2dpbmcgY29kZSBp cyBnZW5lcmF0ZWQuDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+TG9nIGxldmVscyBjYW4gYmUg Ym90aCBzZXQgZ2xvYmFsbHkgYW5kIGFkanVzdGVkIGZvciBsb2NhbCBzY29wZXMuIDwvbGk+PGxp PkNvbXBpbGUgdGltZSBsb2cgbGV2ZWxzIGNhbiBiZSByZWFkIG9mZiBhbiBlbnZpcm9ubWVudCB2 YXJpYWJsZS4gPC9saT48L3VsPg0KPC9saT48bGk+RXh0ZW5zaW9uIHBvaW50IHByZWZpeCA8Y29k ZT4lZGlhZ25fPC9jb2RlPiAoam9pbmluZyBwcmVmaXhlcyA8Y29kZT4lZGVidWdfPC9jb2RlPiBh bmQNCjxjb2RlPiV0cmFja188L2NvZGU+KSB0aGF0IHJlc3RyaWN0cyB0aGUgbG9nIGxldmVsIHRv IGV4cGxpY2l0IGxvZ3MuIDwvbGk+PGxpPkRvZXMgbm90IGNyYXNoIGZvciBsb2dzIHRoYXQgZXNj YXBlZCBhbGwgbG9nIGVudHJpZXMg4oCTIHByaW50cyB0aGUgZW50cnkgaWQgb2YgdGhlIGVudHJ5 IHRoZSBvcnBoYW5lZCBsb2cgbGV4aWNhbGx5IGJlbG9uZ3MgdG8uDQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+T3B0aW9uYWxseSBwcmludHMgbG9nIGVudHJ5IGlkcyBmb3IgYWxsIGVudHJpZXMu IDwvbGk+PC91bD4NCjwvbGk+PGxpPk9wdGlvbmFsbHkgc25hcHNob3RzIHVuY2xvc2VkIGxvZyB0 cmVlczoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5vdXRwdXRzIHRoZSBjdXJyZW50IGxvZyB0 cmVlIGlmIHN1ZmZpY2llbnQgdGltZSBwYXNzZWQgc2luY2UgdGhlIHByZXZpb3VzIHRyZWUgd2Fz IHByaW50ZWQgb3IgdGhlIHByZXZpb3VzIHNuYXBzaG90LCBlcmFzZXMgdGhlIHByZXZpb3VzIHNu YXBzaG90IHdoZW4gc25hcHNob3R0aW5nIG9yIHByaW50aW5nIHRoZSBzYW1lIGxvZyB0cmVlLg0K PC9saT48L3VsPg0KPC9saT48bGk+QSBmZXcgbW9yZSBjaGFuZ2VzIHRoYXQgaW1wcm92ZSB1c2Fi aWxpdHkuIDwvbGk+PC91bD4NCjxwPlAuUy4gSWYgeW91IGZhY2UgcHJvYmxlbXMgd2l0aCBtaXNz aW5nIGxpbmUgYnJlYWtzIGluIHRoZSBIVE1MIG91dHB1dCwgcmUtaW5zdGFsbA0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9wcmludGJveCI+cHJpbnRib3ggZnJvbSBzb3VyY2U8 L2E+IG9yIHZlcnNpb24gJmd0OyAwLjEwLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjciPmlvc3RyZWFtIDAuMjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWlvc3RyZWFtLTAtMi8xNDIxNC8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWlvc3RyZWFtLTAtMi8xNDIxNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc5NDBhOGIwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOTQw YThiMCI+U2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzk0MGE4YjAiPg0KPHA+SW9zdHJlYW0gMC4yIHdhcyByZWNlbnRs eSByZWxlYXNlZCBvbiBvcGFtLiBIZXJl4oCZcyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL2MtY3ViZS9vY2FtbC1pb3N0cmVhbS9yZWxlYXNlcy90YWcvdjAuMiI+DQpyZWxlYXNlIGl0 c2VsZjwvYT4uIDwvcD4NCjxwPklvc3RyZWFtIGlzIGEgbGlicmFyeSBwcm92aWRpbmcgYSBzbWFs bCBzZXQgb2YgYWJzdHJhY3Rpb25zIGZvciBJL08gc3RyZWFtcyAoISkgb3Zlcg0KPGNvZGU+Ynl0 ZXM8L2NvZGU+LiBXaXRoIHJlbGVhc2UgMC4yLCB0aGVyZSBhcmUgbm93IDQgbWFpbiB0eXBlcywg YWxsIG9mIHRoZW0gYmFzZWQgb24gb2JqZWN0czoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2MtY3ViZS5naXRodWIuaW8vb2NhbWwtaW9zdHJlYW0vaW9z dHJlYW0vSW9zdHJlYW0vSW4vaW5kZXguaHRtbCI+PGNvZGU+SW9zdHJlYW0uSW4udDwvY29kZT48 L2E+IGZvciB1bmJ1ZmZlcmVkIGlucHV0czsNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYy1j dWJlLmdpdGh1Yi5pby9vY2FtbC1pb3N0cmVhbS9pb3N0cmVhbS9Jb3N0cmVhbS9Jbl9idWYvaW5k ZXguaHRtbCI+PGNvZGU+SW9zdHJlYW0uSW5fYnVmLnQ8L2NvZGU+PC9hPiBmb3IgYnVmZmVyZWQg aW5wdXRzOw0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9jLWN1YmUuZ2l0aHViLmlvL29jYW1s LWlvc3RyZWFtL2lvc3RyZWFtL0lvc3RyZWFtL091dC9pbmRleC5odG1sIj48Y29kZT5Jb3N0cmVh bS5PdXQudDwvY29kZT48L2E+IGZvciB1bmJ1ZmZlcmVkIG91dHB1dHM7DQo8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2MtY3ViZS5naXRodWIuaW8vb2NhbWwtaW9zdHJlYW0vaW9zdHJlYW0vSW9z dHJlYW0vT3V0X2J1Zi9pbmRleC5odG1sIj48Y29kZT5Jb3N0cmVhbS5PdXRfYnVmLnQ8L2NvZGU+ PC9hPiBmb3IgYnVmZmVyZWQgb3V0cHV0cy4NCjwvbGk+PC91bD4NCjxwPkkgZm91bmQgb3V0IHRo YXQgaGF2aW5nIGFsbCB0aGVzZSBleHBsaWNpdCB0eXBlcyBpcyBiZXR0ZXIgdGhhbiBwaWNraW5n IG9ubHkgc29tZSBvZiB0aGVtLiBBDQo8Y29kZT5Jbl9idWYudDwvY29kZT4gY2FuIGFjdCBhcyBh IHByb3BlciBieXRlIHN0cmVhbSwgZXhwb3NpbmcgaXRzIGludGVybmFsIHNsaWNlIG9mIGJ5dGVz IHNvIHRoYXQgaXTigJlzIHBvc3NpYmxlIHRvIGltcGxlbWVudCBsaW5lIHBhcnNpbmcgYW5kIHN1 Y2guIFRoYW5rcyB0byB0aGUgb2JqZWN0IHR5cGVzLA0KPGNvZGU+SW5fYnVmLnQ8L2NvZGU+IGlz IGEgc3VidHlwZSBvZiA8Y29kZT5Jbi50PC9jb2RlPiwgYW5kIHNhbWUgZ29lcyBmb3IgPGNvZGU+ DQpPdXRfYnVmLnQ8L2NvZGU+IGFuZCA8Y29kZT5PdXQudDwvY29kZT4uIDwvcD4NCjxwPlRoZXJl IGlzIGFsc28gYSA8YSBocmVmPSJodHRwczovL2MtY3ViZS5naXRodWIuaW8vb2NhbWwtaW9zdHJl YW0vaW9zdHJlYW0tY2FtbHppcC9Jb3N0cmVhbV9jYW1semlwL2luZGV4Lmh0bWwiPg0KPGNvZGU+ aW9zdHJlYW0tY2FtbHppcDwvY29kZT48L2E+IGxpYnJhcnkgdGhhdCBpbXBsZW1lbnRzIHN0cmVh bSBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb3ZlciB0aGVzZSB0eXBlcy4NCjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI4Ij5Cb2d1ZSwgdGhlIE9DYW1sIEdVSTwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJvZ3VlLXRoZS1vY2FtbC1ndWkvOTA5OS81NyI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJvZ3VlLXRoZS1vY2FtbC1ndWkvOTA5 OS81NzwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4ZGE4 YWNmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOGRhOGFjZiI+c2FuZXR0ZSBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzhkYThh Y2YiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgYSBuZXcgdmVyc2lvbiBvZiA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vc2FuZXR0ZS9ib2d1ZSI+DQpCb2d1ZTwvYT4gKDIwMjQwMjI1 KS4gSSB3b3VsZCBsaWtlIHRvIG1lbnRpb24gaGVyZSB0d28gbWFpbiBjaGFuZ2VzOiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhpcyBpcyB0aGUgPGI+bGFzdCB2ZXJzaW9uIHRoYXQg c3VwcG9ydHMgU0RMIDIuMC45PC9iPiAoZGVmYXVsdCBpbiBEZWJpYW4gMTApIE5leHQgdmVyc2lv biB3aWxsIHVzZQ0KPGNvZGU+dHNkbCAxLjAuMDwvY29kZT4gd2hpY2ggcmVxdWlyZXMgU0RMIDIu MC4xMCBvciBsYXRlciA8L2xpPjxsaT5UaGFua3MgdG8gQGVkd2luICwgdGhpcyB2ZXJzaW9uIChp ZiB1c2luZyBTREwgJmd0Oz0gMi4wLjE2KSBpcyBtdWNoIG1vcmUgPGI+PGI+cG93ZXItZnJpZW5k bHk8L2I+PC9iPiAod2hlbiBpZGxlKS4gWW91IG1heSBub3cgbGVhdmUgYSBCb2d1ZSBhcHAgb3Bl biAoaWYgaWRsZSkgd2l0aG91dCB3b3JyeWluZyBmb3IgeW91ciBsYXB0b3AgYmF0dGVyeSAoYW5k IHRoZSBlbnZpcm9ubWVudCk6IGVuZXJneSBjb25zdW1wdGlvbiBpcyBub3cgdmVyeSBjbG9zZQ0K IHRvIHplcm8uICg8Y29kZT5wb3dlcnRvcDwvY29kZT4gaW5kaWNhdGVzIGluc3RhbnRhbmVvdXMg cG93ZXIgb2YgMG1XLCB3aGljaCBJIHRoaW5rIG1lYW5zIGxlc3MgdGhhbiAwLjFtVyBvbiBteSBs YXB0b3ApDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+T3dsIHByb2pl Y3QgcmVzdHJ1Y3R1cmVkPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9v d2wtcHJvamVjdC1yZXN0cnVjdHVyZWQvMTQyMjYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb3dsLXByb2plY3QtcmVzdHJ1Y3R1cmVkLzE0MjI2LzE8L2E+IDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTAxOWNjZCIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzkwMTljY2QiPmpyemhhbzQyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTAxOWNjZCI+DQo8cD5EZWFyIE9DYW1sIENv bW11bml0eSwgZm9sbG93aW5nIG91ciBwcmV2aW91cyBkZWNpc2lvbiB0byBjb25jbHVkZSB0aGUg T3dsIHByb2plY3QsIHdlIGhhdmUgYmVlbiB0b3VjaGVkIGJ5IHRoZSBzdXBwb3J0aXZlIGFuZCBl bmNvdXJhZ2luZyBmZWVkYmFjayBmcm9tIGFsbCBvZiB5b3UuIEFmdGVyIGEgdGhvcm91Z2ggZGlz Y3Vzc2lvbiwgTGlhbmcgQHJ5YW5yaHltZXMgYW5kIEkgdGhpbmsgaXQgbWlnaHQgc3RpbGwgYmUg Zm9yIHRoZSBiZXN0DQogaW50ZXJlc3Qgb2YgdGhlIE9DYW1sIGNvbW11bml0eSB0byBjb250aW51 ZSBtYWludGFpbmluZyBhIHNvbGlkIG51bWVyaWNhbCBjb21wdXRpbmcgbGlicmFyeS4gQ29uc2Vx dWVudGx5LCBJLCBKaWFueGluLCB3aWxsIGFzc3VtZSB0aGUgcm9sZSBvZiBwcm9qZWN0IGxlYWRl ciB0byBlbnN1cmUgT3dsIHJlbWFpbnMgbWFpbnRhaW5lZC4gT3VyIGdvYWwgaXMgdG8ga2VlcCBP d2wgc3RhYmxlIGFuZCB1cGRhdGVkLCBnaXZlbiB0aGUgdmVyeSBsaW1pdGVkDQogcmVzb3VyY2Ug d2UgaGF2ZSwgYXMgZXhwbGFpbmVkIGluIG91ciBwcmV2aW91cyBkZWNsYXJhdGlvbi4gQXQgbGVh c3Qgd2UgYWltIHRvIGtlZXAgT3dsIGNvbXBhdGlibGUgd2l0aCB0aGUgbGF0ZXN0IHN0YWJsZSB2 ZXJzaW9uIG9mIE9DYW1sLg0KPC9wPg0KPHA+QXMgbWVudGlvbmVkIHByZXZpb3VzbHksIG91ciBh dmFpbGFiaWxpdHkgdG8gZGVkaWNhdGUgdGltZSB0byBPd2wgaXMgbGltaXRlZC4gQWNoaWV2aW5n IG91ciBvYmplY3RpdmVzIHdpbGwgcmVxdWlyZSBjb2xsZWN0aXZlIGVmZm9ydC4gVGh1cywgSSBh bSBsb29raW5nIHRvIGFzc2VtYmxlIGEgdGVhbSBvZiBjb250cmlidXRvcnMgZWFnZXIgdG8gc3Vw cG9ydCBib3RoIGRldmVsb3BtZW50IGFuZCBtYWludGVuYW5jZSB0YXNrcy4gRm9yIGRldGFpbHMN CiBvbiBvdXIgcGxhbnMgYW5kIGhvdyB5b3UgY2FuIGNvbnRyaWJ1dGUsIHBsZWFzZSByZWZlciB0 byB0aGUgcHJvamVjdOKAmXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL293bGJhcm4vb3ds Ij4NClJFQURNRTwvYT4gZmlsZS4gPC9wPg0KPHA+SWYgeW914oCZcmUgaW50ZXJlc3RlZCBpbiBq b2luaW5nIHRoZSBPd2wgdGVhbSwgdGFraW5nIG9uIGEgc3BlY2lmaWMgcGFydCBvZiB0aGUgY29k ZWJhc2UsIG9yIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMsIGRvIG5vdCBoZXNpdGF0ZSB0byBj b250YWN0IG1lIGhlcmUgb3IgdmlhDQo8YSBocmVmPSJtYWlsdG86amlhbnhpbi56aGFvQGtpdC5l ZHUiPmVtYWlsPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+MjAmIzQz OyB3YXlzIHRvIGJ1aWxkIGFuIGV4ZWN1dGFibGUgd2l0aCBmb3JlaWduIGxpYnM8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC8yMC13YXlzLXRvLWJ1aWxkLWFuLWV4ZWN1 dGFibGUtd2l0aC1mb3JlaWduLWxpYnMvMTQyMjcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvMjAtd2F5cy10by1idWlsZC1hbi1leGVjdXRhYmxlLXdpdGgtZm9yZWlnbi1saWJzLzE0 MjI3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzRk YzdkZjEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0ZGM3ZGYxIj5HcmVnZyBSZXlu b2xkcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzRkYzdkZjEiPg0KPHA+Rm9yZWlnbiBsaWJzIGNhbiBiZSBsaW5rZWQgaW50byBPQ2FtbCBl eGVjdXRhYmxlcyBpbiBhIHZhcmlldHkgb2Ygd2F5cy4gVGhlIHBlcnRpbmVudCBpbmZvIGlzIGRp c3RyaWJ1dGVkIGFjcm9zcyBzZXZlcmFsIHRvcGljcyBpbiB0aGUgbWFudWFsLiBTbyBJIHB1dCB0 b2dldGhlciBhIHN1aXRlIG9mIDIwLXNvbWUgTVdFcyBkZW1vbnN0cmF0aW5nIHRoZSBvcHRpb25z Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmVtaXR0aW5nIG5hdGl2ZSBvciBieXRl Y29kZSBleGVjdXRhYmxlcyA8L2xpPjxsaT52bSBleGVjdXRhYmxlczogZnJlZXN0YW5kaW5nIG9y IGRlcGVuZGVudCBvbiBvY2FtbHJ1biA8L2xpPjxsaT51c2luZyBhIHN0YXRpYyBvciBkeW5hbWlj IHN0dWJsaWIgPC9saT48bGk+bGlua2luZyB0aGUgc3R1YmxpYiBhZ2FpbnN0IHN0YXRpYyBvciBz aGFyZWQgZm9yZWlnbiBsaWJzIDwvbGk+PGxpPnB1dHRpbmcgbGliIGRlcHMgZGlyZWN0bHkgb24g dGhlIGNtZCBsaW5lIHYuIHVzaW5nIC1jY2xpYiBvciAtZGxsaWIgPC9saT48L3VsPg0KPHA+QWxs IGRlbW9zIHVzZSBhIHZlcnkgc2ltcGxlIGZvcmVpZ24gbGliIChpbiBDKSBhbmQgc3R1YmxpYiwg YW5kIHRoZSBidWlsZHMgYXJlIGV4cHJlc3NlZCBpbiBhIGZldyByZWxhdGl2ZWx5IHNpbXBsZSBt YWtlZmlsZXMuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2JhemwvZGVt b3Nfb2JhemwvdHJlZS9tYWluL21ha2VmaWxlcy9mZmkiPmh0dHBzOi8vZ2l0aHViLmNvbS9vYmF6 bC9kZW1vc19vYmF6bC90cmVlL21haW4vbWFrZWZpbGVzL2ZmaTwvYT4NCjwvcD4NCjxwPlRoaXMg Y291bGQgYmUgdXNlZCBhcyB0aGUgYmFzaXMgb2YgYSBwcm9wZXIgdHV0b3JpYWwsIGJ1dCBJ4oCZ bSBub3Qgc3VyZSBJ4oCZbGwgZ2V0IGFyb3VuZCB0byB0aGF0Lg0KPC9wPg0KPHA+KE9oIGNyYXAs IEkgZm9yZ290IHRvIHVwZGF0ZSB0aGUgZG9jcy4gVGhlIG1ha2UgdGFyZ2V0IG5hbWVzIGEgbGl0 dGxlIGRpZmZlcmVudC4gUmVhZCB0aGUgbWFrZWZpbGVzLiA7KQ0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTEiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIxMSI+b3BhbSBidWlsZCBhbmQgb3BhbSB0ZXN0OiB0aGUgb3BhbSBwbHVn aW5zIHRoYXQgc2ltcGxpZmllcyB5b3VyIGRldiBzZXR1cDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLWJ1aWxkLW9wYW0tdGVzdC10aGUtb3BhbS1wbHVn aW5zLXRoYXQtc2ltcGxpZmllcy15b3VyLWRldi1zZXR1cC84ODY3LzIiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLWJ1aWxkLW9wYW0tdGVzdC10aGUtb3BhbS1wbHVnaW5z LXRoYXQtc2ltcGxpZmllcy15b3VyLWRldi1zZXR1cC84ODY3LzI8L2E+DQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2IwY2MzZGUiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmdiMGNjM2RlIj5LYXRlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjBjYzNkZSI+DQo8cD5IaSBldmVyeW9uZSwgPC9w Pg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBvcGFtLWJ1aWxk ICZhbXA7IG9wYW0tdGVzdCAwLjIuMCAoc29vbiAwLjIuNCB3aXRoIGFsbCB0aGUgbGF0ZXN0IGlt cHJvdmVtZW50cykNCjwvcD4NCjxwPlRoZXNlIHR3byBvcGFtIHBsdWdpbnMgbm93IHJlcXVpcmUg eW91ciBjdXJyZW50IGNsaWVudCB0byBiZSBvcGFtIDIuMiAoZS5nLiB0aGUgbGF0ZXN0IDIuMi4w fmJldGExKS4gSWYgeW91IHVzZSBvcGFtIDIuMiB5b3UgY2FuIGluc3RhbGwgdGhlbSB1c2luZzoN CjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc5MmVmZTVlIj4NCm9wYW0gdXBkYXRl ICZhbXA7JmFtcDsgb3BhbSBpbnN0YWxsICdvcGFtLWJ1aWxkJmd0Oz0wLjIuMCcgJ29wYW0tdGVz dCZndDs9MC4yLjAnDQo8L3ByZT4NCjxwPkFmdGVyIHRoYXQgeW91IGNhbiB1c2UgdGhlbSBmcm9t IGFueSBzd2l0Y2hlcyB1c2luZzogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzFj MWFkYjIiPg0Kb3BhbSBidWlsZCAtLWhlbHANCm9wYW0gdGVzdCAtLWhlbHANCjwvcHJlPg0KPHA+ VGhlIGhpZ2hsaWdodHMgb2YgdGhpcyB2ZXJzaW9uIGN5Y2xlIGFyZTogPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPlZhc3RseSBpbXByb3ZlZCBwZXJmb3JtYW5jZSBhbmQgVUkgPC9saT48 bGk+QWRkZWQgYSBuZXcgPGNvZGU+LS1nbG9iYWw8L2NvZGU+IGFuZCA8Y29kZT4tLWxvY2FsPC9j b2RlPiBjb21tYW5kIGxpbmUgYXJndW1lbnQgdG8gc2lnbmlmeSB3aGV0aGVyIHRvIHVzZSBhIGxv Y2FsIHN3aXRjaCBvciBhIGdsb2JhbCBzd2l0Y2gNCjwvbGk+PGxpPkFkZCBhIG5ldyBjb25maWcg ZmlsZSBzdG9yaW5nIHRoZSB1c2VyIHByZWZlcmVuY2UgYW5kIHdoaWNoIGtpbmQgb2Ygc3dpdGNo IHRvIHVzZSBieSBkZWZhdWx0DQo8L2xpPjxsaT5Mb3RzIG9mIGZpeGVzIGFuZCBpbXByb3ZlbWVu dHMgPC9saT48L3VsPg0KPHA+T24gYSBwZXJzb25hbCBub3RlLCBteSBtYWluIGluY2VudGl2ZSB3 aXRoIHRoZXNlIGNoYW5nZXMgd2FzIHRvIGZpbmFsbHkgdXNlIHRoZXNlIHBsdWdpbnMgcGVyc29u YWxseSBhbmQgaW4gcGFydGljdWxhciwgd2hpbGUgd29ya2luZyBvbiBzb21lIHBhY2thZ2VzIGZv ciBteSB3b3JrIG9uIHRoZSDigJxPQ2FtbCA1LjIgcmVsZWFzZSByZWFkaW5lc3PigJ0gKHNlZSBh IG1vcmUgZ2VuZXJhbCBkZXNjcmlwdGlvbiBvZiB0aGlzIHdvcmsNCjxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1zb2Z0d2FyZS1mb3VuZGF0aW9uLWphbnVhcnktMjAy NC11cGRhdGUvMTM4MjgjaW5mcmFzdHJ1Y3R1cmUtNSI+DQpoZXJlPC9hPiksIGkgZW5jb3VudGVy ZWQgYSBjb3VwbGUgb2YgcGFja2FnZXMgd2hlcmUgdGhlIG9ubHkgd2F5IHRvIGNvbXBpbGUgdGhl bSB3YXMgdXNpbmcgb3BhbSBhcyB0aGV5IHdlcmUgdXNpbmcgY3VzdG9tIHZhcmlhYmxlcyBwYXNz ZWQgdG8gdGhlaXIgYXJndW1lbnRzLg0KPGNvZGU+b3BhbSBpbnN0YWxsPC9jb2RlPiB3YXMgbm90 IHdoYXQgaSB3YW50ZWQgKGkgZG9u4oCZdCB3YW50IHRvIGluc3RhbGwgaXQsIGkganVzdCBuZWVk IHRvIHNlZSBpZiB0aGUgbG9jYWwgdmVyc2lvbiBjb21waWxlcykgYnV0DQo8Y29kZT5vcGFtIGJ1 aWxkPC9jb2RlPiBmaXRzIHRoZSBiaWxsIHBlcmZlY3RseSBoZXJlIChJIGRvbuKAmXQga25vdyB3 aGF0IGJ1aWxkLXN5c3RlbSBpdCB1c2VzLCBpIGp1c3Qgd2FudCB0byBjb21waWxlIGl0KS4NCjwv cD4NCjxwPkEgZGVtbyBvZiB0aGUgbmV3IHZlcnNpb24gKGhlcmUgMC4yLjQpIGNhbiBiZSBzZWVu IGhlcmU6IDwvcD4NCjxkaXYgaWQ9Im9yZzdkODcwZTYiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGlt ZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRz L29jYW1sL29yaWdpbmFsLzJYL2EvYWIzYjQyZjViMzZhYWM0M2E0MTA3YjhkMjg4MDExZTQ2ODg2 NDRiZS5naWYiIGFsdD0iYWIzYjQyZjViMzZhYWM0M2E0MTA3YjhkMjg4MDExZTQ2ODg2NDRiZS5n aWYiPg0KPC9wPg0KPC9kaXY+DQo8cD48Yj5EaXNjbGFpbWVyPC9iPjogQXMgd2l0aCB2ZXJzaW9u IDAuMS4wLCB0aGVzZSBwbHVnaW5zIGFyZSBzdGlsbCA8Yj5leHBlcmltZW50YWw8L2I+LCBob3dl dmVyIHRoZXkgc2hvdWxkIGJlIGEgbG90IG1vcmUgcG9saXNoZWQgYW5kIHVzYWJsZSwgaG9wZWZ1 bGx5IGlmIGVub3VnaCBwZW9wbGUgcmVwb3J0IGlzc3VlcyAoYmlnIHRoYW5rcyB0byBAZ3JpZGJ1 Z3MgZm9yIHRoZSByZXBvcnRzIG9uIHRoZSBwcmV2aW91cyB2ZXJzaW9ucykgbmV4dA0KIHZlcnNp b24gc2hvdWxkIGJlIGRlZW1lZCBzdGFibGUuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEyIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMTIiPlNlZWtpbmcgZmVlZGJhY2sgb24gcmVwYWNrYWdlZCBsaWJyYXJpZXMgZm9yIEJhc2U8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEyIj4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZWVraW5nLWZlZWRiYWNr LW9uLXJlcGFja2FnZWQtbGlicmFyaWVzLWZvci1iYXNlLzE0MjQxLzEiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3NlZWtpbmctZmVlZGJhY2stb24tcmVwYWNrYWdlZC1saWJyYXJpZXMt Zm9yLWJhc2UvMTQyNDEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnMzA3NmJiOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzMwNzZiYjgi Pk1hdGhpZXUgQmFyYmluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnMzA3NmJiOCI+DQo8cD5EZWFyIE9DYW1sIGNvbW11bml0eSwgPC9wPg0K PHA+TGF0ZWx5IEnigJl2ZSBiZWVuIHdvcmtpbmcgb24gcmVkdWNpbmcgZGVwZW5kZW5jeSBmb290 cHJpbnRzIGluIHNvbWUgb2YgbXkgcHJvamVjdHMsIHdoaWNoIGxlZCBtZSB0byByZXBhY2thZ2Ug c29tZSBvZiBKYW5lIFN0cmVldOKAmXMgbGlicmFyaWVzIHRoYXQgSSBmcmVxdWVudGx5IHVzZS4g VGhlIGdvYWwgd2FzIHRvIG1ha2UgdGhlc2UgbGlicmFyaWVzIGRlcGVuZCBzb2xlbHkgb24NCjxj b2RlPkJhc2U8L2NvZGU+LCB0aGVyZWJ5IG1ha2luZyB0aGVtIG1vcmUgYWNjZXNzaWJsZSBhbmQg bGlnaHR3ZWlnaHQuIDwvcD4NCjxwPkhlcmUgYXJlIHRoZSBsaWJyYXJpZXMgSeKAmXZlIHJlcGFj a2FnZWQgc28gZmFyOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL21iYXJiaW4vYXBwZW5kYWJsZS1saXN0Ij5BcHBlbmRhYmxlIExpc3Q8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2RvdWJseS1s aW5rZWQiPkRvdWJseSBMaW5rZWQgTGlzdDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL21iYXJiaW4vbm9uZW1wdHktbGlzdCI+Tm9uZW1wdHkgTGlzdDwvYT4gPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vcmV2ZXJzZWQtbGlzdCI+UmV2 ZXJzZWQgTGlzdDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21iYXJi aW4vdW5pb24tZmluZCI+VW5pb24gRmluZDwvYT4gPC9saT48L3VsPg0KPHA+VGhlc2UgbGlicmFy aWVzIHJlcXVpcmVkIG1pbmltYWwgbW9kaWZpY2F0aW9ucyB0byByZW1vdmUgdGhlIG9yaWdpbmFs IGRlcGVuZGVuY2llcyBmcm9tDQo8Y29kZT5Db3JlPC9jb2RlPiwgPGNvZGU+Q29yZV9rZXJuZWw8 L2NvZGU+LCBvciA8Y29kZT5Db3JlX2V4dGVuZGVkPC9jb2RlPiwgZGVwZW5kaW5nIG9uIHRoZSBj YXNlLg0KPC9wPg0KPHA+Rm9yIGluc3RhbmNlLCB0aGUgPGNvZGU+Tm9uZW1wdHkgTGlzdDwvY29k ZT4gbGlicmFyeSBpcyBhIHJlcGFja2FnZWQgdmVyc2lvbiBvZg0KPGNvZGU+Q29yZV9rZXJuZWw8 L2NvZGU+4oCZcyA8Y29kZT5Ob25lbXB0eV9saXN0PC9jb2RlPi4gVGhlIG9yaWdpbmFsIGNvZGUg Y2FuIGJlIGZvdW5kDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9jb3Jl X2tlcm5lbC90cmVlL21hc3Rlci9ub25lbXB0eV9saXN0Ij5oZXJlPC9hPi4gSeKAmXZlIG1vZGlm aWVkIHRoZSBjb2RlIHNsaWdodGx5IHRvIHJlbW92ZSBkZXBlbmRlbmNpZXMgb24NCjxjb2RlPkNv cmU8L2NvZGU+IGFuZCA8Y29kZT5Db3JlX2tlcm5lbDwvY29kZT4sIG1ha2luZyBpdCBzb2xlbHkg ZGVwZW5kZW50IG9uIDxjb2RlPg0KQmFzZTwvY29kZT4uIFRoaXMgYWxsb3dzIHRoZSBsaWJyYXJ5 IHRvIGJlIHVzZWQgaW4gbW9yZSBjb250ZXh0cyB3aXRob3V0IHRoZSBuZWVkIHRvIGFkZCBhIGRl cGVuZGVuY3kgb24NCjxjb2RlPkNvcmU8L2NvZGU+IGFuZCA8Y29kZT5Db3JlX2tlcm5lbDwvY29k ZT4uIDwvcD4NCjxwPknigJltIHJlYWNoaW5nIG91dCB0byBnYXVnZSBpbnRlcmVzdCBpbiB0aGVz ZSByZXBhY2thZ2VkIGxpYnJhcmllcy4gV2hpbGUgdGhlIHVzZSBjYXNlIG1pZ2h0IGJlIG5pY2hl LCBJIGJlbGlldmUgdGhlcmUgY291bGQgYmUNCjxjb2RlPkJhc2U8L2NvZGU+IHVzZXJzIHdobyBh cmUgbW90aXZhdGVkIGVub3VnaCB0byBsaW1pdCB0aGVpciBkZXBlbmRlbmNpZXMgb24gPGNvZGU+ DQpjb3JlPC9jb2RlPiwgZXRjLiA8L3A+DQo8cD5JZiB0aGVyZeKAmXMgaW50ZXJlc3QgaW4gdGhl IGNvbW11bml0eSBmb3IgdGhlc2UgbGlicmFyaWVzLCBJ4oCZbSBjb25zaWRlcmluZyByZWFjaGlu ZyBvdXQgdG8gSmFuZSBTdHJlZXQgdG8gZGlzY3VzcyBvcHRpb25zLiBJZiBKYW5lIFN0cmVldCBp c27igJl0IGludGVyZXN0ZWQgYnV0IHRoZSBjb21tdW5pdHkgaXMsIEnigJltIG9wZW4gdG8gbW92 aW5nIHRoZXNlIGxpYnJhcmllcyBpbnRvIGEgY29tbXVuaXR5IHNwYWNlLiBJ4oCZbSBhbHNvIHdp bGxpbmcgdG8NCiB2b2x1bnRlZXIgYXMgYSBtYWludGFpbmVyIGluIHRoaXMgY2FzZS4gT2YgY291 cnNlLCBJIHdhbnQgdG8gcmVzcGVjdCB0aGUgY29tbXVuaXR54oCZcyBlc3RhYmxpc2hlZCBwcmFj dGljZXMgYW5kIHdvdWxkbuKAmXQgd2FudCB0byBzdGVwIG9uIGFueW9uZeKAmXMgdG9lcy4NCjwv cD4NCjxwPklmIHRoZXJl4oCZcyBubyBpbnRlcmVzdCwgSeKAmW0gaGFwcHkgdG8gY29udGludWUg YXMgaXMuIEnigJltIHNpbXBseSBvZmZlcmluZyB0aGlzIGluIGNhc2UgaXQgbWlnaHQgYmUgYmVu ZWZpY2lhbCB0byBvdGhlcnMuDQo8L3A+DQo8cD5JIGFwcHJlY2lhdGUgeW91ciB0aW1lIGFuZCBs b29rIGZvcndhcmQgdG8geW91ciBmZWVkYmFjayEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSIxMyI+T3V0cmVhY2h5IGludGVybnNoaXAgZGVtbyBzZXNzaW9uPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3V0cmVhY2h5LWludGVybnNoaXAtZGVtby1zZXNz aW9uLzE0MjQ3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291dHJlYWNoeS1pbnRl cm5zaGlwLWRlbW8tc2Vzc2lvbi8xNDI0Ny8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzY4YmNmOGUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmc2OGJjZjhlIj5GYXkgQ2Fyc29ucyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzY4YmNmOGUiPg0KPHA+SGkgYWxsISBNeXNlbGYgYW5kIHRo ZSBvdGhlciBPdXRyZWFjaHkgaW50ZXJucyBmcm9tIHRoaXMgYmF0Y2ggYXJlIGdvaW5nIHRvIGJl IHB1YmxpY2x5IGRlbW9pbmcgb3VyIHByb2plY3RzIFtkYXRlPTIwMjQtMDMtMDYgdGltZT0xMjow MDowMCB0aW1lem9uZT3igJxBbWVyaWNhL05ld19Zb3Jr4oCdXSAhDQo8L3A+DQo8cD5JbSBnb2lu ZyB0byBiZSB0YWxraW5nIGFib3V0IDxpPkpveTwvaT4sIHRoZSBjcmVhdGl2ZSBjb2RpbmcgbGli cmFyeSBJIGRldmVsb3BlZCwgZ29pbmcgb3ZlciBzb21lIGZlYXR1cmVzIGFuZCBob3BlZnVsbHkg ZG9pbmcgc29tZSBsaXZlLWNvZGVkIGdlbmVyYXRpdmUgYXJ0ISBUaGUgb3RoZXIgaW50ZXJucyB3 aWxsIGJlIHByZXNlbnRpbmcgdGhlaXIgd29yayB3aXRoDQo8aT5Cb2d1ZTwvaT4gYW5kIHJlZmFj dG9yaW5nIHRoZSBVSSBvZiBPY2FtbC5vcmcgPC9wPg0KPHA+U3RvcCBieSBpZiB5b3XigJlkIGxp a2UhIDxhIGhyZWY9Imh0dHBzOi8vbWVldC5nb29nbGUuY29tL3J5bS1lcWF4LXV3Yj9ocz0xMjIm YW1wO2F1dGh1c2VyPTAiPg0KbGluazwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSIxNCI+ZHJlYW0taHRtbCAzLjAuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1kcmVhbS1odG1sLTMtMC0wLzE0MDEzLzUiPmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tZHJlYW0taHRtbC0zLTAtMC8xNDAxMy81PC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMTM2YTFjIiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnMzEzNmExYyI+WWF3YXIgQW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzMxMzZhMWMiPg0KPHA+W0FOTl0gZHJlYW0t aHRtbCAzLjEuMCA8L3A+DQo8cD5UaGFua3MgdG8gdGhlIGVmZm9ydHMgb2YgS2VudG8gT2t1cmEs IEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC5vcmcvcC9kcmVhbS1odG1sLzMuMS4wIj4NCjMuMS4wPC9hPiwgd2hpY2ggYnJpbmdzIGNv bXBsZXRlIHN1cHBvcnQgZm9yIGFsbCBzdGFuZGFyZCA8YSBocmVmPSJodHRwczovL2RldmVsb3Bl ci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9NYXRoTUwiPg0KTWF0aE1MPC9hPiBhdHRyaWJ1 dGVzIGFuZCBlbGVtZW50cy4gPC9wPg0KPHA+RWc6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMt Y29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5EcmVhbV9odG1sPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPk1hdGhNTDwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2 MDFmOyI+b3A8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnN5bTwvc3Bhbj4g PSBtbyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5bXTwvc3Bhbj4gW3R4dCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDsl cyZxdW90Ozwvc3Bhbj4gc3ltXQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5w b3c8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmk8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+ID0gbXN1cCA8c3BhbiBzdHlsZT0iY29sb3I6 ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5bXTwvc3Bhbj4gWw0KICBtaSA8 c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5b XTwvc3Bhbj4gW3R4dCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDslcyZxdW90 Ozwvc3Bhbj4gaV07DQogIG1uIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiBbdHh0IDxzcGFuIHN0eWxlPSJjb2xvcjogI2Nh MzQwMDsiPiZxdW90OyVzJnF1b3Q7PC9zcGFuPiBuXTsNCl0NCg0KPHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5hXjImIzQzO2JeMj1jXjI8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3Nw YW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0 PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5weXRoYWdvcmFzX3RoZW9yZW08 L3NwYW4+ID0gbXRhYmxlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1j b2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiBbDQogIG10ciA8c3BhbiBzdHlsZT0iY29sb3I6ICMy NDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5bXTwvc3Bhbj4gWw0KICAgIG10ZCA8 c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5b XTwvc3Bhbj4gW3BvdyA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDthJnF1b3Q7 PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDsyJnF1b3Q7PC9zcGFu Pjsgb3AgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7JiM0MzsmcXVvdDs8L3Nw YW4+OyBwb3cgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7YiZxdW90Ozwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7MiZxdW90Ozwvc3Bhbj5dOw0K ICAgIG10ZCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNm Y2Y3ZWY7Ij5bXTwvc3Bhbj4gW29wIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90 Oz0mcXVvdDs8L3NwYW4+XTsNCiAgICBtdGQgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+W108L3NwYW4+IFtwb3cgPHNwYW4gc3R5bGU9ImNv bG9yOiAjY2EzNDAwOyI+JnF1b3Q7YyZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj Y2EzNDAwOyI+JnF1b3Q7MiZxdW90Ozwvc3Bhbj5dOw0KICBdOw0KXQ0KPC9wcmU+DQo8L2Rpdj4N CjxwPkFzIHlvdSBjYW4gc2VlLCB3ZSBjYW4gd3JpdGUgaGVscGVycyB0aGF0IGdyZWF0bHkgcmVk dWNlIGR1cGxpY2F0aW9uLiA8L3A+DQo8cD5UaGlzIGFkZGl0aW9uIGNvbXBsZXRlcyBkcmVhbS1o dG1s4oCZcyBzdXBwb3J0IGZvciBhbGwgc3RhbmRhcmQgWE1MLWJhc2VkIG1hcmt1cHMgdGhhdCBh cmUgcmVuZGVyZWQgYnkgYnJvd3NlcnMuDQo8L3A+DQo8cD5UaGlzIHJlbGVhc2UgYWxzbyBkZXBy ZWNhdGVzIGEgY291cGxlIG9mIG5vbi1zdGFuZGFyZCBIVE1MIGF0dHJpYnV0ZXMgdGhhdCBJIGhh ZCBtaXN0YWtlbmx5IGFkZGVkIGJlZm9yZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTE1IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMTUiPkFkZCB5b3VyIE9DYW1sIEV2ZW50cyB0byB0aGUgQ29tbXVuaXR5IFBhZ2Ugb24gT0Nh bWwub3JnPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNSI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWRkLXlvdXIt b2NhbWwtZXZlbnRzLXRvLXRoZS1jb21tdW5pdHktcGFnZS1vbi1vY2FtbC1vcmcvMTQyNTEvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWRkLXlvdXItb2NhbWwtZXZlbnRzLXRvLXRo ZS1jb21tdW5pdHktcGFnZS1vbi1vY2FtbC1vcmcvMTQyNTEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMTc4ODc3NyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzE3ODg3NzciPlNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE3ODg3NzciPg0KPHA+SGV5IGZv bGtzISA8L3A+DQo8cD5UaGlzIGlzIGEgY2FsbCBmb3IgYW55b25lIHdobyBpcyBydW5uaW5nIG9y IGtub3dzIGFib3V0IHVwY29taW5nIE9DYW1sLXJlbGF0ZWQgZXZlbnRzIHRvIGFkZCB0aG9zZSBl dmVudHMgdG8gdGhlIEV2ZW50cyBkaXJlY3Rvcnkgb24gT0NhbWwub3JnLg0KPC9wPg0KPHA+SGVy ZeKAmXMgaG93IHRvIGRvIGl0OiA8L3A+DQo8cD5PcGVuIGEgcHVsbCByZXF1ZXN0IHNpbWlsYXIg dG8gdGhpcyBvbmU6IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8yMTM0Ij5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMjEzNDwvYT4NCjwvcD4NCjxwPklmIGl04oCZcyBhIHJlY3VycmluZyBldmVudCwgY3JlYXRl IGEgbGlzdGluZyBpbiA8Y29kZT5yZWN1cnJpbmcueW1sPC9jb2RlPi4gSWYgaXTigJlzIGEgb25l LXRpbWUgZXZlbnQsIHlvdSBzaG91bGQgb21pdCB0aGlzLg0KPC9wPg0KPHA+SWYgdGhlcmXigJlz IHN0YXJ0IG9yIGVuZCB0aW1lcywgdGhleSBuZWVkIHRvIGJlIGdpdmVuIGluIFVUQyAtIHNvIHRo YXQgd2UgY2FuLCBpbiBhIGxhdGVyIGltcHJvdmVtZW50IHRvIHRoZSBFdmVudHMgZGlyZWN0b3J5 LCBjb252ZXJ0IHRoZW0gdG8gdGhlIHZpZXdlcuKAmXMgbG9jYWwgdGltZXpvbmUgbW9yZSBlYXNp bHkuIEhlcmXigJlzIGFuIGV4YW1wbGUgb2YgYW4gZXZlbnQgd2l0aCBhIHN0YXJ0IHRpbWU6DQo8 L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnMmRlOGFiYSI+DQotLS0NCnRpdGxlOiAm cXVvdDtPQ2FtbCBVc2VycyBpbiBQYXJpcyAoT1VQUykmcXVvdDsNCnRleHR1YWxfbG9jYXRpb246 IFBhcmlzLCBGcmFuY2UNCmxvY2F0aW9uOg0KICBsYXQ6IDQ4Ljg1NjYNCiAgbG9uZzogMi4zNTIy DQp1cmw6IGh0dHBzOi8vd3d3Lm1lZXR1cC5jb20vb2NhbWwtcGFyaXMvZXZlbnRzLzI5OTAxNDA4 Mi8NCnJlY3VycmluZ19ldmVudF9zbHVnOiBvY2FtbC11c2Vycy1wYXJpcy1vdXBzDQpzdGFydHM6 DQogIHl5eXlfbW1fZGQ6ICZxdW90OzcwMjQtMDItMjkmcXVvdDsNCiAgdXRjX2hoX21tOiAmcXVv dDsxODowMCZxdW90Ow0KLS0tDQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTE2IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTYi Pk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTE2Ij48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVhMGE1NmEiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1YTBhNTZhIj5Gcm9tIHRoZSBvY2FtbC5vcmcg YmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWEwYTU2 YSI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBh dCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJsb2c8 L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9mcmFt YS1jLmNvbS9mYy12ZXJzaW9ucy9uaWNrZWwuaHRtbCI+UmVsZWFzZSBvZiBGcmFtYS1DIDI4LjEg KE5pY2tlbCk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyNC0wMi0yOC10d28tbWFqb3ItaW1wcm92ZW1lbnRzLWluLW9kb2MtaW50cm9kdWNpbmctc2Vh cmNoLWVuZ2luZS1pbnRlZ3JhdGlvbiI+VHdvIE1ham9yIEltcHJvdmVtZW50cyBpbiBvZG9jOiBJ bnRyb2R1Y2luZyBTZWFyY2ggRW5naW5lIEludGVncmF0aW9uPC9hPg0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGEwNjUy NCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzRhMDY1MjQiPk9sZCBDV048L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzRhMDY1MjQiPg0KPHA+SWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNj aG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZ bGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhy ZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9m IHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUg aXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSB0byB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdCI+DQpjYW1sLWxpc3Q8 L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnNzk5ZGZlYiI+DQo8cD48 YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 27 Feb 2024 13:53:29 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 27 Feb 2024 13:53:29 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 27 Feb 2024 13:53:29 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41RDrZQ1015571 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 27 Feb 2024 13:53:35 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41RDrNiv015553 for ; Tue, 27 Feb 2024 13:53:24 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 Feb 2024 14:53:21 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 59A4BE0CD6; Tue, 27 Feb 2024 14:53:21 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 3B27BE0035 for ; Tue, 27 Feb 2024 14:53:16 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Feb 2024 14:53:13 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9F357564718; Tue, 27 Feb 2024 14:53:11 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaaYRYiMZyXDq9akiUTF2MKl6csA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 27 Feb 2024 13:53:09 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 5e447ad5-8469-468c-47eb-08dc379b7a58 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.06,188,1705359600"; d="scan'208,217";a="80758929" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.463204, queueID=EDE49564719 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <37925BB2BB01654BB8F21034D15F1729@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMi0yNyBUdWUgMTQ6NTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDIuMjAuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMy4wNS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDIwIHRvIDI3LCAyMDI0Lg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5GZWVkYmFjayAvIEhlbHAgV2Fu dGVkOiBVcGNvbWluZyBPQ2FtbC5vcmcgQ29va2Jvb2sgRmVhdHVyZTwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzIiPlRoZSBPQ2FtbCBjb21tdW5pdHkgaXMgc2lnbmVkIHVwIGZvciBPdXRyZWFjaHkh PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+VXBjb21pbmcgQ2FxdGkgUmVsZWFzZSAtIFRMUywg UGFja2FnaW5nLCBhbmQgbWlub3IgYnJlYWthZ2U8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5E aXNjdXNzaW9ucyBvbiB0aGUgZnV0dXJlIG9mIHRoZSBvcGFtIHJlcG9zaXRvcnk8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM1Ij5kcmVhbS1odG1sIDMuMC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIj NiI+VGVtcG9yYXJ5IGluY3JlYXNlIGluIG9wYW0gQ0kgcmVzcG9uc2UgdGltZXM8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM3Ij5BIFZlcnNhdGlsZSBPQ2FtbCBMaWJyYXJ5IGZvciBHaXQgSW50ZXJh Y3Rpb24gLSBTZWVraW5nIENvbW11bml0eSBGZWVkYmFjazwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9 IiM4Ij5PY3NpZ2VuOiBzdW1tYXJ5IG9mIHJlY2VudCByZWxlYXNlczwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzkiPmZ1c2VhdSAwLjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+SG93IGRvIHdl IHdhbnQgdG8gcHJlc2VudCBPQ2FtbCB0byB0aGUgV29ybGQgb24gT0NhbWwub3JnPzwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzExIj5NaXJhZ2VPUyBoYWNrIHJldHJlYXQgMjAyNCBlZGl0aW9uIChB cHJpbCAyMm5kIC0gMjh0aCk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMiI+UmVjcnVpdGVtZW50 IG9uIHRoZSBDYXRhbGEgcHJvamVjdCAoRnJlbmNoKTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEz Ij5Kc19vZl9vY2FtbCA1Ljc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxNCI+RWlvLXRyYWNlIDAu MSBhbmQgRWlvIDAuMTU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxNSI+T3RoZXIgT0NhbWwgTmV3 czwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZ2U5YzM4N2MiPk9sZCBDV048L2E+IDwvbGk+PC91 bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+RmVlZGJhY2sgLyBIZWxwIFdhbnRlZDogVXBjb21pbmcg T0NhbWwub3JnIENvb2tib29rIEZlYXR1cmU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2ZlZWRiYWNrLWhlbHAtd2FudGVkLXVwY29taW5nLW9jYW1sLW9yZy1jb29rYm9v ay1mZWF0dXJlLzE0MTI3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZlZWRiYWNr LWhlbHAtd2FudGVkLXVwY29taW5nLW9jYW1sLW9yZy1jb29rYm9vay1mZWF0dXJlLzE0MTI3LzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2FmZWFkNzki IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhZmVhZDc5Ij5TYWJpbmUgU2NobWFsdHog YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdh ZmVhZDc5Ij4NCjxwPkhpIGFsbCwgPC9wPg0KPHA+d2UncmUgYWRkaW5nIGFuICZxdW90O09DYW1s IENvb2tib29rJnF1b3Q7IGZlYXR1cmUgdG8gT0NhbWwub3JnIHdoZXJlIHRoZSBjb21tdW5pdHkg Y2FuIHNoYXJlIHJlY2lwZXMgKHNtYWxsIGNvZGUgc25pcHBldHMpIGZvciBjb21tb24gdGFza3Mu IFRoZXNlIHJlY2lwZXMgY2FuIHVzZSBwYWNrYWdlcyBmcm9tIHRoZSBPQ2FtbCBlY29zeXN0ZW0u DQo8L3A+DQo8cD5BIFBSIGZvciBhIHByb3RvdHlwZSBpcyB1cCBhdCA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTgzOSI+DQpodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTgzOTwvYT4gYW5kIGNhbiBiZSBleHBsb3JlZCBvbiA8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL3N0YWdpbmcub2NhbWwub3JnL2Nvb2tib29rIj5odHRw czovL3N0YWdpbmcub2NhbWwub3JnL2Nvb2tib29rPC9hPg0KPC9wPg0KPHA+SSBhbSB0ZW1wdGVk IHRvIHRha2UgaW5zcGlyYXRpb24gaW4gc3Bpcml0IHByaW1hcmlseSBmcm9tIHRoZSBSdXN0IENv b2tib29rICg8YSBocmVmPSJodHRwczovL3J1c3QtbGFuZy1udXJzZXJ5LmdpdGh1Yi5pby9ydXN0 LWNvb2tib29rL2ludHJvLmh0bWwiPmh0dHBzOi8vcnVzdC1sYW5nLW51cnNlcnkuZ2l0aHViLmlv L3J1c3QtY29va2Jvb2svaW50cm8uaHRtbDwvYT4pLCBzaW5jZSB0aGlzIGlzIGZvY3VzZWQgZW50 aXJlbHkgb24gdGFza3MNCiB0aGF0IG1heSBiZSByZXF1aXJlZCBmb3Igc2hpcHBpbmcgYXBwbGlj YXRpb25zIHRvIHByb2R1Y3Rpb24uIDwvcD4NCjxwPkhvd2V2ZXIsIHBlb3BsZSBhbHNvIG1lbnRp b25lZCB0aGF0IHRoZXkgbGlrZSB0aGUgZm9ybWF0IG9mIEdvIGJ5IEV4YW1wbGUgKDxhIGhyZWY9 Imh0dHBzOi8vZ29ieWV4YW1wbGUuY29tL3NvcnRpbmciPmh0dHBzOi8vZ29ieWV4YW1wbGUuY29t L3NvcnRpbmc8L2E+KSBhIGxvdC4NCjwvcD4NCjxwPlRoZSBjdXJyZW50IHByb3RvdHlwZSBvZiB0 aGUgY29va2Jvb2sgb24gc3RhZ2luZy5vY2FtbC5vcmcvY29va2Jvb2sgY29tYmluZXMgYm90aCBv ZiB0aGVzZSBpZGVhcy4NCjwvcD4NCjxwPlBsZWFzZSBjb21tZW50IGFueSBmZWVkYmFjaywgaWRl YXMsIGV0Yy4gRWl0aGVyIGhlcmUgb3IgZGlyZWN0bHkgb24gdGhlIFBSIGF0IDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODM5Ij4NCmh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODM5PC9hPiEgPC9wPg0KPHA+VGhlIGZpbmFs IHZlcnNpb24gbWF5IGJlIHNpbXBsZXIgLSBmb3IgZXhhbXBsZSwgd2UgbWlnaHQgZmluZCB0aGF0 IG5vIHJlY2lwZXMgbmVlZCBtb3JlIHRoYW4gYSBzaW5nbGUgZmlsZSwgaW4gd2hpY2ggY2FzZSB3 ZSdsbCByZW1vdmUgdGhlIGNhcGFiaWxpdHkgdG8gaGF2ZSBtdWx0aXBsZSBmaWxlcyBvbiBhIHJl Y2lwZS4NCjwvcD4NCjxwPkFsc28sIEkgd2lsbCBkZWZpbml0ZWx5IG5lZWQgeW91ciBoZWxwIGlu IGNvbXBsZXRpbmcgdGhlIGxpc3Qgb2YgdGFza3MgYW5kIGNyZWF0aW5nIGFsbCB0aG9zZSByZWNp cGVzLiBZb3UgY2FuIG1ha2Ugc3VnZ2VzdGlvbnMgb24gdGhlIFBSIHRvIGFkZCB0YXNrcy4gOmhl YXJ0Og0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPlRoZSBPQ2FtbCBjb21tdW5p dHkgaXMgc2lnbmVkIHVwIGZvciBPdXRyZWFjaHkhPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC90aGUtb2NhbWwtY29tbXVuaXR5LWlzLXNpZ25lZC11cC1mb3Itb3V0cmVh Y2h5LzEzODkyLzE1Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90aGUtb2NhbWwtY29t bXVuaXR5LWlzLXNpZ25lZC11cC1mb3Itb3V0cmVhY2h5LzEzODkyLzE1PC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMzY2MzBlIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMzM2NjMwZSI+UGF1bC1FbGxpb3QgYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczMzY2MzBlIj4NCjxwPkhlcmUg YXJlIHRoZSBub3RlcyBmcm9tIHllc3RlcmRheSdzIG1lZXRpbmchIFdlIGRpc2N1c3NlZCBhIGxv dCBvZiB0aGluZ3MsIHNvIHRoZXkgZG8gbm90IGdvIGludG8gYXMgbXVjaCBkZXRhaWxzIGFzIHdo YXQgd2FzIHNhaWQuIFRoYW5rcyB0byBhbGwgdGhlIHBhcnRpY2lwYW50cywgYW5kIHRvIEBwaXRh ZyBmb3Igb3JnYW5pemluZywgcnVubmluZyBhbmQgdGFraW5nIHRoZSBub3RlcyENCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjA2MDgxMSIgY2xhc3M9Im91dGxp bmUtNCI+DQo8aDQgaWQ9Im9yZzIwNjA4MTEiPldoYXQgYXJlIHRoZSBjdXJyZW50bHkgcHJvcG9z ZWQgcHJvamVjdHM/PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1v cmcyMDYwODExIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BbiBhY2Nlc3NpYmxlIGludGVy ZmFjZSB0byByZWFkIGEgZGlmZi4gTWVudG9ycyA6IEBFbWlsZVRyb3RpZ25vbiBhbmQgQEp1bG9v LCBAcGFuZ2xlc2QuDQo8L2xpPjxsaT5IaWdobGlnaHQgc2VhcmNoIHRlcm1zIGluIHNoZXJsb2Rv YyByZXN1bHRzLiBNZW50b3JzIDogQEVtaWxlVHJvdGlnbm9uIGFuZCBASnVsb28sIEBwYW5nbGVz ZC4NCjwvbGk+PGxpPkNyZWF0ZSBhIHN0YW5kYWxvbmUgcmVwb3NpdG9yeSBhcyBhIGJhc2lzIGZv ciB0aGUgZXhlcmNpc2Ugc2VjdGlvbiBvbiBvY2FtbC5vcmcgaW50byBhIHN0YW5kYWxvbmUgcHJv amVjdC4gTWVudG9ycyA6IEBjdWlodGxhdWFjIGFuZCBAc2hha3RoaW1hYW4NCjwvbGk+PGxpPkEg ZGlmZmluZyB0b29sIGZvciBjbWkgYXJ0ZWZhY3RzIHRvIGhlbHAgbWFpbnRhaW5lcnMgb2YgbGli cmFyeSBkZXRlY3QgQVBJIGNoYW5nZXMuIEBOYXRoYW5SZWIsIEBzaG9uZmVkZXIuDQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTE0ZTQ2 OSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2UxNGU0NjkiPldoYXQgaXMgaXQgbGlr ZSB0byBiZSBhbiBPdXRyZWFjaHkgbWVudG9yPzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnZTE0ZTQ2OSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QmVp bmcgYXBwcm9hY2hhYmxlIDwvbGk+PGxpPlBpbmcgdGhlIGludGVybiBhdCBsZWFzdCBvbmNlIGEg ZGF5IDwvbGk+PGxpPkV4cGVjdHMgdG8gc3BlbmQgYW4gaG91ciBhIGRheQ0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPkRlcGVuZHMgb24gdGhlIHBlcmlvZC4gQXQgdGhlIGJlZ2lubmluZywgbW9y ZSB0aW1lLWludGVuc2UuIExhdGVyLCB0aGUgaW50ZXJuIHdpbGwgYmUgbW9yZSBpbmRlcGVuZGVu dC4NCjwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjxocj4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxs aT5Qcm9qZWN0IHNjb3BpbmcuOiBQcm9qZWN0ICZxdW90O21hbmFnZW1lbnQmcXVvdDsgPC9saT48 bGk+UHJlcGFyaW5nIGZvciB0aGUgY29udHJpYnV0aW9uIHBlcmlvZA0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkZpbmQgZ29vZCBpc3N1ZXMgPC9saT48L3VsPg0KPC9saT48bGk+Q29udHJpYnV0 aW9uIHBlcmlvZA0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkRlcGVuZGluZyBvbiB0aGUgaXNz dWVzIHlvdSBmb3VuZCwgdGhpcyBjYW4gYmUgdmVyeSB0aW1lLWludGVuc2Ugb3Igbm90LiA8L2xp PjwvdWw+DQo8L2xpPjxsaT5JbnRlcm5zaGlwDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q2hl Y2staW5zIDwvbGk+PGxpPlBhaXItcHJvZ3JhbW1pbmcgPC9saT48bGk+TWVldGluZ3MuIEdvb2Qg aWRlYTogVXNlIGEgcGFkIHRvIGV4cGxhaW4gdGhpbmdzIHZpYSBkcmF3aW5ncy4gPC9saT48bGk+ VHJ5IG91dCBkaWZmZXJlbnQgdGhpbmdzDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VHJ5IGRh aWx5IHN0YW5kLXVwcyBmb3IgYSB3aGlsZSA8L2xpPjxsaT5UcnkgdG8gbGVhdmUgdGhlIGludGVy biBhbG9uZSBmb3IgYSB3aGlsZSA8L2xpPjxsaT5UcnkgdG8gY29ubmVjdCB0aGUgaW50ZXJucyA8 L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2xpPjwvb2w+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnZmQ4NDY4ZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQg aWQ9Im9yZ2ZkODQ2OGQiPlRpcHMgZm9yIG1lbnRvcmluZzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZmQ4NDY4ZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+SGF2ZSB5b3VyIGV4cGVjdGF0aW9ucyByaWdodCBmcm9tIHRoZSBiZWdpbm5pbmcuIEEgdmVy eSBnb29kIGludGVybnNoaXAgYWNoaWV2ZXMgdHdvIHRoaW5nczogVGhlIHByb2plY3QgYWR2YW5j ZXMgYSBsb3QsIGFuZCB0aGUgaW50ZXJuIGdyb3dzIGEgbG90LiBCdXQgYWxzbyBpZiBvbmx5IG9u ZSBvZiB0aG9zZSB0d28gdGhpbmdzIGhhcHBlbnMsIHRoZSBpbnRlcm5zaGlwIGlzIHZlcnkgc3Vj Y2Vzc2Z1bC4NCjwvbGk+PGxpPlNjb3BlIG91dCBhIGZpcnN0IHZlcnkgc2VsZi1jb250YWluZWQg ZWFzeSB0YXNrIHRoYXQgeW91IHRoaW5rIGNvdWxkIGJlIGRvbmUgaW4gb25lIHdlZWsuIFRoZW4s IGV4cGVjdCB0aGF0IHRoZSBpbnRlcm4gd2lsbCB0YWtlIDEuNSBtb250aCBvbiBpdC4NCjwvbGk+ PGxpPlB1dCBhICZxdW90O3JlcXVpcmVtZW50JnF1b3Q7IG9uIHRoZSBhcHBsaWNhbnRzIHRvIHN0 YXJ0IGNvbnRyaWJ1dGluZyA8L2xpPjxsaT5BZGFwdCB0byB0aGUgaW50ZXJuIDwvbGk+PGxpPkF2 b2lkIHdyaXRpbmcgY29kZSBmb3IgdGhlIGludGVybg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PkUuZy4gaW4gdGhlIHJldmlldywgbmV2ZXIgbWFrZSBhIGNvZGUgc3VnZ2VzdGlvbiwgYnV0IHBo cmFzZSBvdXQgdGhlIGNoYW5nZSB5b3UgaGF2ZSBpbiBtaW5kDQo8L2xpPjwvdWw+DQo8L2xpPjxs aT5SZWxhdGVkOiBBdm9pZCAmcXVvdDtkcmFnZ2luZyBhbG9uZyZxdW90OyB0aGUgaW50ZXJuLiA8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn Y2VkM2UyMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2NlZDNlMjMiPkN1cnJlbnQg Ym90dGxlbmVja3M8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y Z2NlZDNlMjMiPg0KPHA+Q3VycmVudGx5LCB0aGUgYm90dGxlbmVjayBpcyBlbm91Z2ggbWVudG9y cywgbm90IGZpbmRpbmcgbW9yZSBwcm9qZWN0cy4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzFlZDA0MzMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmcxZWQwNDMzIj5Dcml0ZXJpYSBmb3IgYSBwcm9qZWN0IC8gZnVuZGluZzwvaDQ+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMWVkMDQzMyI+PC9kaXY+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2QwYmM4NDgiPjwvYT5Qcm9qZWN0czxi cj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdkMGJjODQ4Ij4NCjxw PkFueSBwcm9qZWN0IGlzIGEgZ29vZCBwcm9qZWN0IGZvciB0aGlzLCBhc3N1bWluZyB5b3UgaGF2 ZSB0aGUgbWVudG9yIGNhcGFjaXRpZXMuIEl0IGRvZXNuJ3QgbWF0dGVyIHdoaWNoIHBhcnQgb2Yg dGhlIGNvbW11bml0eSBpcyBmcm9tIG9yIHdobyB0aGUgbWFpbnRhaW5lciBpcy4gVGhlIG9ubHkg dGhpbmcgdGhhdCBtYXR0ZXJzIGlzIHRoYXQgdGhlIHByb2plY3QgaXMgb3Blbi1zb3VyY2UgYW5k IGl0J3MgaW4gT0NhbWwuIEEgZmV3IHRpcHMNCiBmb3IgYSBnb29kIHByb2plY3Q6IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5CZSBpbiBjb250cm9sIG9mIHRoZSByZXBvcyB0aGUgcHJv amVjdCBpcyBvbg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBwcm9qZWN0IG5lZWRzIHRv IGJlIG5vbi1jb250cm92ZXJzaWFsIGFtb25nIHRoZSByZXBvIG1haW50YWluZXJzLiA8L2xpPjwv dWw+DQo8L2xpPjxsaT5Eb24ndCBoYXZlIHRvbyBoaWdoIGV4cGVjdGF0aW9ucyBvbiB3aGF0IGNh biBiZSBkb25lLiA8L2xpPjwvdWw+DQo8cD5BbnlvbmUgY2FuIHN1Ym1pdCBhIHByb2plY3QuIDwv cD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2NlNWRiM2QiPjwvYT5GdW5kaW5nPGJyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2NlNWRiM2QiPg0KPHA+QW55 IHByb2plY3QgYXMgZGVzY3JpYmVkIGFib3ZlIGlzIHdlbGNvbWUuIEFueSBtZW50b3IgZm9yIHN1 Y2ggYSBwcm9qZWN0IGNhbiBnZXQgZnVuZGluZy4gQW55IGludGVybiB3b3JraW5nIG9uIHN1Y2gg YSBwcm9qZWN0IHdvdWxkIGdldCBmdW5kaW5nIGFzIHdlbGwuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+ PGxpPjxhIGlkPSJvcmdiYjk1NzI1Ij48L2E+T2JqZWN0aXZlIG9mIGZ1bmRpbmc8YnI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYmI5NTcyNSI+DQo8cD5UaGUgb2Jq ZWN0aXZlIG9mIHRoZSBmdW5kaW5nIGlzIHRvIGluY3JlYXNlIE9DYW1sJ3Mgb3V0cmVhY2h5IGFu ZCBkaXZlcnNpdHkuIEl0J3Mgbm90IHRvIHByb21vdGUgcHJvamVjdHMgZnJvbSBhIGNlcnRhaW4g cGFydCBvZiB0aGUgZWNvc3lzdGVtLg0KPC9wPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQxOGJiZjIiIGNsYXNzPSJvdXRsaW5lLTQi Pg0KPGg0IGlkPSJvcmc0MThiYmYyIj5XaGVyZSBkbyBtZW50b3JzIGNvbW11bmljYXRlPC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc0MThiYmYyIj4NCjxwPlNv IGZhciwgd2UndmUgdXNlZCBTbGFjayBhbmQgaGF2ZSBpbnZpdGVkIG1lbnRvcnMgd2hvIHdlcmVu J3Qgb24gdGhlcmUuIFdlJ3ZlIGRpc2N1c3NlZCB0aGF0IHRoZSBPdXRyZWFjaHkgWnVsaXAgbWln aHQgYmUgYW4gZXZlbiBiZXR0ZXIgcGxhY2UuIFdlJ2xsIHRyeSB0aGF0IHRoaXMgcm91bmQuDQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5VcGNvbWluZyBDYXF0aSBS ZWxlYXNlIC0gVExTLCBQYWNrYWdpbmcsIGFuZCBtaW5vciBicmVha2FnZTwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXBjb21pbmctY2FxdGktcmVsZWFzZS10bHMtcGFj a2FnaW5nLWFuZC1taW5vci1icmVha2FnZS8xMzkyNi83Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC91cGNvbWluZy1jYXF0aS1yZWxlYXNlLXRscy1wYWNrYWdpbmctYW5kLW1pbm9yLWJy ZWFrYWdlLzEzOTI2Lzc8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzAxN2YwYWUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwMTdmMGFlIj4m cXVvdDtQZXR0ZXIgQS4gVXJrZWRhbCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzAxN2YwYWUiPg0KPHA+Q2FxdGkgMi4xLjEgaGFzIG5vdyBi ZWVuIHJlbGVhc2VkIHRvIE9QQU0uIFRoZSBmb2xsb3dpbmcgcGFja2FnZXMgd2VyZSBpbmNsdWRl ZDoNCjwvcD4NCjx0YWJsZSBib3JkZXI9IjIiIGNlbGxzcGFjaW5nPSIwIiBjZWxscGFkZGluZz0i NiIgcnVsZXM9Imdyb3VwcyIgZnJhbWU9ImhzaWRlcyI+DQo8Y29sZ3JvdXA+PGNvbCBjbGFzcz0i b3JnLWxlZnQiPjxjb2wgY2xhc3M9Im9yZy1sZWZ0Ij48L2NvbGdyb3VwPg0KPHRoZWFkPg0KPHRy Pg0KPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJvcmctbGVmdCI+UGFja2FnZTwvdGg+DQo8dGggc2Nv cGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij4yLjEuMTwvdGg+DQo8L3RyPg0KPC90aGVhZD4NCjx0 Ym9keT4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNhcXRpPC90ZD4NCjx0ZCBjbGFzcz0i b3JnLWxlZnQiPnllczwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+Y2Fx dGktYXN5bmM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+eWVzPC90ZD4NCjwvdHI+DQo8dHI+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5jYXF0aS1laW88L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVm dCI+eWVzPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5jYXF0aS1sd3Q8 L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+eWVzPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xh c3M9Im9yZy1sZWZ0Ij5jYXF0aS1taXJhZ2U8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+eWVz PC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5jYXF0aS10bHMtYXN5bmM8 L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+bm8sIG9taXR0ZWQgZm9yIG5vdzwvdGQ+DQo8L3Ry Pg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+Y2FxdGktdGxzLWVpbzwvdGQ+DQo8dGQgY2xh c3M9Im9yZy1sZWZ0Ij5ubywgb21pdHRlZCBmb3Igbm93PC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQg Y2xhc3M9Im9yZy1sZWZ0Ij5jYXF0aS10bHMtbHd0PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQi Pm5vLCBvbWl0dGVkIGZvciBub3c8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxl ZnQiPmNhcXRpLXRsczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij55ZXM8L3RkPg0KPC90cj4N Cjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNhcXRpLWRyaXZlci1tYXJpYWRiPC90ZD4NCjx0 ZCBjbGFzcz0ib3JnLWxlZnQiPnllczwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+Y2FxdGktZHJpdmVyLXBneDwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij55ZXM8L3Rk Pg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNhcXRpLWRyaXZlci1wb3N0Z3Jl c3FsPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPnllczwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRk IGNsYXNzPSJvcmctbGVmdCI+Y2FxdGktZHJpdmVyLXNxbGl0ZTM8L3RkPg0KPHRkIGNsYXNzPSJv cmctbGVmdCI+eWVzPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5jYXF0 aS1keW5sb2FkPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPm5vLCB1bmNoYW5nZWQ8L3RkPg0K PC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNhcXRpLXR5cGUtY2FsZW5kYXI8L3Rk Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+bm8sIHVuY2hhbmdlZDwvdGQ+DQo8L3RyPg0KPC90Ym9k eT4NCjwvdGFibGU+DQo8cD5EZXRhaWxzIGNhbiBiZSBmb3VuZCBpbiB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL3BhdXJrZWRhbC9vY2FtbC1jYXF0aS9yZWxlYXNlcy90YWcvdjIuMS4w Ij4NCnJlbGVhc2Ugbm90ZXMgZm9yIHZlcnNpb24gMi4xLjA8L2E+IHNpbmNlIDIuMS4xIGluY2x1 ZGUgYnVpbGQgYW5kIHBhY2thZ2luZyBmaXhlcyBvbmx5Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjQiPkRpc2N1c3Npb25zIG9uIHRoZSBmdXR1cmUgb2YgdGhlIG9wYW0gcmVwb3Np dG9yeTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZGlzY3Vzc2lvbnMt b24tdGhlLWZ1dHVyZS1vZi10aGUtb3BhbS1yZXBvc2l0b3J5LzEzODk4LzciPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Rpc2N1c3Npb25zLW9uLXRoZS1mdXR1cmUtb2YtdGhlLW9wYW0t cmVwb3NpdG9yeS8xMzg5OC83PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdiYWY5YmRmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmFmOWJk ZiI+S2F0ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZ2JhZjliZGYiPg0KPHA+VGhlIG5vdGVzIGZyb20gdGhlIHByZXZpb3VzIG1lZXRpbmcg YXJlIGF2YWlsYWJsZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBv c2l0b3J5L2lzc3Vlcy8yMzc4OSNpc3N1ZWNvbW1lbnQtMTk1NDgyNjQ3MSI+DQpoZXJlPC9hPiwg c29ycnkgZm9yIHRoZSBkZWxheS4gPC9wPg0KPHA+VGhlIG5leHQgbWVldGluZyB3aWxsIGJlIHRv bW9ycm93IChXZWRuZXNkYXkgMjAyNC0wMi0yMCkgc2FtZSB0aW1lIGFuZCBwbGFjZSBhcyBwcmV2 aW91c2x5Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjE0OjAwIEdNVCBvbiA8YSBo cmVmPSJodHRwczovL21lZXQuaml0LnNpL29wYW0tcmVwby1tZWV0aW5nIj5qaXRzaTwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPmRyZWFtLWh0bWwgMy4wLjA8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLTMtMC0w LzE0MDEzLzIiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0zLTAt MC8xNDAxMy8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc0ZmQ0YWU1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNGZkNGFlNSI+WWF3YXIg QW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzRmZDRhZTUiPg0KPHA+SSd2ZSBqdXN0IHJlbGVhc2VkIDMuMC4xIHdpdGggYSBidWdmaXgg Zm9yIEFSSUEgYXR0cmlidXRlIG5hbWVzLCBwbGVhc2UgdXBncmFkZSBpZiB5b3UgYXJlIHVzaW5n IEFSSUE6DQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL2RyZWFtLWh0bWwvMy4wLjEiPmh0 dHBzOi8vb2NhbWwub3JnL3AvZHJlYW0taHRtbC8zLjAuMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSI2Ij5UZW1wb3JhcnkgaW5jcmVhc2UgaW4gb3BhbSBDSSByZXNwb25zZSB0 aW1lczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGVtcG9yYXJ5LWlu Y3JlYXNlLWluLW9wYW0tY2ktcmVzcG9uc2UtdGltZXMvMTQxMzgvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvdGVtcG9yYXJ5LWluY3JlYXNlLWluLW9wYW0tY2ktcmVzcG9uc2UtdGlt ZXMvMTQxMzgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnZjBlNzdjMCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2YwZTc3YzAiPkFuaWwg TWFkaGF2YXBlZGR5IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnZjBlNzdjMCI+DQo8cD5Zb3UgbWF5IGFsbCBub3RpY2UgYSB0ZW1wb3Jhcnkg aW5jcmVhc2Ugb3ZlciB0aGUgbmV4dCBmZXcgZGF5cyBpbiB0aGUgb3BhbSByZXBvc2l0b3J5IENJ IHJlc3BvbnNlIHRpbWVzIHdoZW4gc3VibWl0dGluZyBvcGFtIHBhY2thZ2VzLiBUaGlzIGlzIGJl Y2F1c2UgTWFyayBFbHZlcnMsIEBzYW1vaHQgYW5kIEkgYXJlIGF0dGVtcHRpbmcgdG8gcmViYWxh bmNlIHRoZSBjbHVzdGVyIHRoYXQgZHJpdmVzIHRoZXNlIGpvYnMgdG93YXJkcyB1c2luZw0KIGxl c3MgcG93ZXIsIGFuZCBtb3JlIHJlbmV3YWJsZSBwb3dlci4gPC9wPg0KPHA+TW9zdCBvZiB0aGUg bWFjaGluZXMgYXJlIDxhIGhyZWY9Imh0dHA6Ly9pbmZyYS5vY2FtbC5vcmcvYnktbG9jYXRpb24v Y2FlbHVtIj5jdXJyZW50bHkgaG9zdGVkPC9hPiBhdCB0aGUgQ2FtYnJpZGdlIENvbXB1dGVyIExh YiAobm90IHJlbmV3YWJsZSBjdXJyZW50bHkpLCBhbmQgd2UgYXJlIG1vdmluZyBtb3JlIHdvcmsg aW50byBTY2FsZXdheSdzIFBhcmlzIGRhdGFjZW50cmUgKHJlbmV3YWJsZSksIGJ1dCB0aGUgY2Fw YWNpdHkgaXMgZmFyIGxvd2VyLg0KIFRoZSByZXN1bHRzIHNob3cgYSBuaWNlIHNoYXJwIGRyb3Ag aW4gcmVzb3VyY2UgdXRpbGlzYXRpb24sIGJ1dCB0aGUgam9iIHJlc3BvbnNlIHRpbWVzIGFyZSBm YXIgc2xvd2VyIG9uIHRoZSBsb3dlciBjYXBhY2l0eS4NCjwvcD4NCjxwPldlJ2xsIGJyaW5nIHRo ZSBDYW1icmlkZ2UgbWFjaGluZXMgYmFjayBpbnRvIHRoZSBwb29sIGxhdGVyIHRoaXMgd2VlayBp ZiB3ZSBjYW4ndCBnZXQgU2NhbGV3YXkgdG8gYmUgc29sZWx5IGVub3VnaCBjYXBhY2l0eSwgYnV0 IEkgaG9wZSB5b3UgYWxsIGFncmVlIHRoYXQgaXQncyBhbHNvIGltcG9ydGFudCB0aGF0IHdlIG1p bmltaXNlIHJlc291cmNlIHVzYWdlIGV2ZXJ5d2hlcmUgd2UgY2FuLiAoYW5kIGluIGdlbmVyYWws IHRoZSBub24teDg2DQogbWFjaGluZXMgd2lsbCByZW1haW4gYXQgQ2FtYnJpZGdlIGFzIHRoZXJl IGFyZSBubyBhbHRlcm5hdGl2ZSBob3N0aW5nIG9wdGlvbnMgZm9yIFBPV0VSIG9yIFJJU0MtViBj dXJyZW50bHkpLg0KPC9wPg0KPGRpdiBpZD0ib3JnZTlkYzRjNCIgY2xhc3M9ImZpZ3VyZSI+DQo8 cD48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3Vw bG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2UvZTVkN2FiYzdiOTk0MjUyZWFhY2I2NmM4Yzg5MzMw ZTEzNDI3MzA0N18yXzEzODB4MzE0LmpwZWciIGFsdD0iZTVkN2FiYzdiOTk0MjUyZWFhY2I2NmM4 Yzg5MzMwZTEzNDI3MzA0N18yXzEzODB4MzE0LmpwZWciPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iNyI+QSBWZXJzYXRpbGUgT0NhbWwgTGlicmFyeSBmb3IgR2l0IElu dGVyYWN0aW9uIC0gU2Vla2luZyBDb21tdW5pdHkgRmVlZGJhY2s8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2EtdmVyc2F0aWxlLW9jYW1sLWxpYnJhcnktZm9yLWdpdC1p bnRlcmFjdGlvbi1zZWVraW5nLWNvbW11bml0eS1mZWVkYmFjay8xNDE1NS8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLXZlcnNhdGlsZS1vY2FtbC1saWJyYXJ5LWZvci1naXQtaW50 ZXJhY3Rpb24tc2Vla2luZy1jb21tdW5pdHktZmVlZGJhY2svMTQxNTUvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmVhNDU4OCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzJlYTQ1ODgiPk1hdGhpZXUgQmFyYmluIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMmVhNDU4OCI+DQo8cD5E ZWFyIE9DYW1sIGNvbW11bml0eSwgPC9wPg0KPHA+SSB3b3VsZCBsaWtlIHRvIHRhbGsgYWJvdXQg YSBwcm9qZWN0IEkndmUgYmVlbiB3b3JraW5nIG9uOiA8Y29kZT5WY3M8L2NvZGU+LCBhIHZlcnNh dGlsZSBPQ2FtbCBsaWJyYXJ5IGZvciBHaXQgaW50ZXJhY3Rpb24uIFRoZSBsaWJyYXJ5IHByb3Zp ZGVzIGEgZGlyZWN0LXN0eWxlIEFQSSBmb3IgaW50ZXJhY3Rpbmcgd2l0aCBHaXQgcmVwb3NpdG9y aWVzIGFuZCBpcyBkZXNpZ25lZCBhcyBhbiAmcXVvdDtpbnRlcmZhY2UmcXVvdDssIG9yICZxdW90 O3ZpcnR1YWwmcXVvdDsgbGlicmFyeQ0KIHdpdGggdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbiBw cm92aWRlZCBieSBvdGhlciBjb21wb25lbnQgZHluYW1pY2FsbHkgZGlzcGF0Y2hlZCBhdCBydW50 aW1lIChzaW1pbGFyIHRvDQo8Y29kZT5FaW88L2NvZGU+IHZzIDxjb2RlPkVpb19tYWluPC9jb2Rl PikuIFRoaXMgZGVzaWduIGFpbXMgaGlnaCBmbGV4aWJpbGl0eSBhbmQgYWRhcHRhYmlsaXR5IHRv IGRpZmZlcmVudCB1c2UgY2FzZXMuDQo8L3A+DQo8cD5UaGUgVmNzIGxpYnJhcnkgaXMgZGVzaWdu ZWQgdG8gYmUgYmFja2VuZC1hZ25vc3RpYyBhbmQgY29uY3VycmVuY3ktcnVudGltZSBpbmRlcGVu ZGVudC4gSXQncyBjb21wYXRpYmxlIHdpdGggYm90aCBFaW8gYW5kIE9DYW1sIFN0ZGxpYiBydW50 aW1lcy4NCjwvcD4NCjxwPk15IGZvY3VzIG9uIHRoZSBiYWNrZW5kIGltcGxlbWVudGF0aW9uIGhh cyBiZWVuIHByYWdtYXRpYyBhcyBvZiB5ZXQuIEkndmUgY29uY2VudHJhdGVkIG9uIGltcGxlbWVu dGluZyBhIHByb3ZpZGVyIGNhbGxlZA0KPGNvZGU+Z2l0LWNsaTwvY29kZT4gdGhhdCB3cmFwcyB0 aGUgR2l0IENMSSwgcnVubmluZyBpdCBhcyBhbiBleHRlcm5hbCBwcm9jZXNzLCBpbnRlcnByZXRp bmcgaXRzIGV4aXQgc3RhdHVzIGFuZCBwYXJzaW5nIGl0cyBvdXRwdXQuIFRoaXMgYXBwcm9hY2gg aGFzIGFsbG93ZWQgbWUgdG8gZm9jdXMgb24gdGhlIGNvcmUgZnVuY3Rpb25hbGl0eSBhbmQgZGVz aWduIG9mIHRoZSBWY3MgbGlicmFyeS4gSSBwbGFuIHRvIGV4cGxvcmUgdGhlIGZlYXNpYmlsaXR5 DQogb2Ygc3VwcG9ydGluZywgaW4gYSBzaW1pbGFyIGZhc2hpb24sIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9hYW50cm9uL2x1diI+bHV2PC9hPiBhbmQgcG9zc2libHkNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL21pb3UiPm1pb3U8L2E+IGFzIHNlcGFyYXRlIGZ1 dHVyZSB3b3JrIChzdGlsbCB2aWEgdGhlDQo8Y29kZT5naXQtY2xpPC9jb2RlPiBwcm92aWRlciku IDwvcD4NCjxwPlRoZSBwcm9qZWN0IGlzIGN1cnJlbnRseSBpbiB0aGUgZHJhZnQgc3RhZ2UgaW4g YSBwcml2YXRlIHJlcG9zaXRvcnksIGFuZCBJIGFtIGdyYWR1YWxseSB3b3JraW5nIHRocm91Z2gg dGhlIHByb2Nlc3Mgb2Ygb3Blbi1zb3VyY2luZyB0aGUgZGVwZW5kZW5jaWVzIGZvciB0aGlzIHBy b2plY3QuIFRoZSBBUEkgaXQgc3VwcG9ydHMgaXMgdmVyeSBpbmNvbXBsZXRlLCBhbmQgSSBhbSBl eHRlbmRpbmcgaW5jcmVtZW50YWxseSBhcyBJIG5lZWQgbW9yZS4NCjwvcD4NCjxwPldoaWxlIHRo ZSBjb2RlIGlzbid0IHB1Ymxpc2hlZCB5ZXQsIEkndmUgd3JpdHRlbiBhIHB1YmxpYyBSRUFETUUg dGhhdCBvdXRsaW5lcyB0aGUgcHJvamVjdCdzIGFyY2hpdGVjdHVyZSwgZGVzaWduIHByaW5jaXBs ZXMsIGFuZCBtb3RpdmF0aW9uLiBZb3UgY2FuIHJlYWQgaXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9tYmFyYmluL3ZjcyI+aGVyZTwvYT4uIDwvcD4NCjxwPkknbSByZWFjaGluZyBvdXQg dG8gdGhlIGNvbW11bml0eSBmb3IgZmVlZGJhY2sgb24gdGhlIGFwcHJvYWNoLiBJJ20gcGFydGlj dWxhcmx5IGludGVyZXN0ZWQgaW4geW91ciB0aG91Z2h0cyBvbiB0aGUgdXNlIG9mIGEgcHJvdmlk ZXItYmFzZWQgcGFyYW1ldHJpYyBsaWJyYXJ5IGFuZCB0aGUgZ3JhbnVsYXJpdHkgb2YgdGhlIHBy b3ZpZGVyIGludGVyZmFjZXMgdmlhDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWJhcmJp bi92Y3MvYmxvYi9tYWluL2RvYy90cmFpdHMubWQiPlRyYWl0czwvYT4sIGJ1dCBJIHdvdWxkIGJl IGludGVyZXN0ZWQgYnkgb3RoZXIgZmVlZGJhY2sgeW91J2QgZmVlbCBsaWtlIHNoYXJpbmcuIFBs ZWFzZSBmZWVsIGZyZWUgdG8gb3BlbiBpc3N1ZXMsIG9yIGFza2luZyBxdWVzdGlvbnMgb3IgY29u dGFjdGluZyBtZSBpZiB5b3UgYXJlIGludGVyZXN0ZWQgYnkgdGhlIHByb2plY3QuDQo8L3A+DQo8 cD5BZGRpdGlvbmFsbHksIEknbSBpbiB0aGUgcHJvY2VzcyBvZiBzZWxlY3RpbmcgYW4gYXBwcm9w cmlhdGUgbGljZW5zZSBmb3IgdGhlIHByb2plY3QuIEkgdGhpbmsgaXQgaXMgZmFpciB0byByZXNw b25kIHRvIHRoYXQgJnF1b3Q7V2UgYXMgYSBjb21tdW5pdHkgY2Fubm90IGdpdmUgeW91IGxlZ2Fs IGFkdmljZSBvbiB0aGF0IG1hdHRlciwgeW91IHNob3VsZCBjb250YWN0IHdpdGggYSBsYXd5ZXIm cXVvdDsuIE9uIHRoZSBvdGhlciBoYW5kLCBpZiBlaXRoZXIgeW91DQogb3Igc29tZW9uZSB5b3Ug a25vdyBoYXZlIHNwZW50IGEgbG90IG9mIHRpbWVzIHRoaW5raW5nIGFib3V0IHRoZSBzdWJqZWN0 IG9mIExJQ0VOU0VzIGZvciB0aGUgT0NhbWwgZWNvc3lzdGVtLCBpdCB3b3VsZCBiZSBvZiBsb3Nz IGZvciBtZSBub3QgdG8gdGFsayB0byB5b3UuIEknbGwgYmUgZ3JhdGVmdWwgaWYgeW91IGRvIHJl YWNoIG91dC4NCjwvcD4NCjxwPlRoYW5rIHlvdSBpbiBhZHZhbmNlIGZvciB5b3VyIHRpbWUgYW5k IGZlZWRiYWNrLiBJIGxvb2sgZm9yd2FyZCB0byBlbmdhZ2luZyB3aXRoIHRoZSBjb21tdW5pdHkg b24gdGhpcyBwcm9qZWN0Lg0KPC9wPg0KPHA+QmVzdCwgTWF0aGlldSA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iOCI+T2NzaWdlbjogc3VtbWFyeSBvZiByZWNlbnQgcmVsZWFzZXM8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jc2lnZW4tc3VtbWFyeS1vZi1y ZWNlbnQtcmVsZWFzZXMvMTM4MTcvNSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2Nz aWdlbi1zdW1tYXJ5LW9mLXJlY2VudC1yZWxlYXNlcy8xMzgxNy81PC9hPiA8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzViNTI1YWIiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmc1YjUyNWFiIj5WaW5jZW50IEJhbGF0IGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWI1MjVhYiI+DQo8cD5PY3NpZ2Vu IFN0YXJ0IDYuMi4wIHdhcyByZWxlYXNlZCBhIGZldyBkYXlzIGFnby4gSXQgc2ltcGxpZmllcyB0 aGUgY29kZSBvZiB0aGUgZGVtbyBhcHBsaWNhdGlvbiBieSByZW1vdmluZyBmaXJzdC1jbGFzcyBt b2R1bGVzIGFuZCBtYWtpbmcgdGhlIGNvZGUgbW9yZSBzdGFuZGFyZC4NCjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI5Ij5mdXNlYXUgMC4xPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZnVzZWF1LTAtMS8xNDE1Ny8xIj5odHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWZ1c2VhdS0wLTEvMTQxNTcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnNDA5NzI2MiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzQwOTcyNjIiPlNpbW9uIENydWFuZXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0MDk3MjYyIj4NCjxwPkRlYXIgYWxsLCA8L3A+ DQo8cD5JdCBicmluZ3MgbWUgYSBzbWlsZSB0byBhbm5vdW5jZSB0aGF0IDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9jLWN1YmUvZnVzZWF1Ij4NCmZ1c2VhdTwvYT4gMC4xIGlzIGluIHRoZSBw cm9jZXNzIG9mIGJlaW5nIHJlbGVhc2VkIG9uIG9wYW0uIEZ1c2VhdSAoJnF1b3Q7ZnVoLXpvJnF1 b3Q7LCBmcmVuY2ggZm9yIHNwaW5kbGUpIGlzIHlldCBhbm90aGVyIGxpZ2h0d2VpZ2h0IGZpYmVy IGxpYnJhcnkgZm9yIE9DYW1sIDUuDQo8L3A+DQo8cD5UaGlzIGlzIGVhcmx5IGRheXMsIGFzIGVt cGhhc2l6ZWQgaW4gdGhlIDAuMSB2ZXJzaW9uIG51bWJlci4gSWYgeW91IGdpdmUgaXQgYSB0cnks IGV4cGVjdCBzb21lIGJ1Z3MsIHJvdWdoIGVkZ2VzIGluIHRoZSBBUEksIGFuZCBjaGFuZ2VzIGlu IHRoZSBmdXR1cmUuIEl0IGFsc28gZG9lc24ndCBoYXZlIGdyZWF0IGRvY3MuDQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2MwYWUzMWUiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmdjMGFlMzFlIj5yYXRpb25hbGUgYW5kIG92ZXJ2aWV3PC9oND4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjMGFlMzFlIj4NCjxwPldpdGgg dGhhdCBvdXQgb2YgdGhlIHdheSwgSSdkIGxpa2UgdG8gZ2l2ZSBhIHJhdGlvbmFsZSBmb3IgdGhp cyBuZXcgbGlicmFyeS4gVGhlIHByaW1hcnkgZ29hbCBvZiBGdXNlYXUgaXMgdG8gYmUgc2ltcGxl IHdoaWxlIHByb3ZpZGluZyBhIG1vZGVybiwgbmljZSwgY29tZm9ydGFibGUgQVBJIHRoYXQgcmVs aWVzIG9uIE9DYW1sIDUncyBlZmZlY3RzIHRvIGF2b2lkIG1vbmFkaWMgaGVsbC4gQXMgc3VjaCwN CjxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPmZpYmVyczwvc3Bhbj4sIHRoZSBsaWdodHdlaWdodCB0 aHJlYWRzIHRoYXQgYXJlIGNvb3BlcmF0aXZlbHkgc2NoZWR1bGVkIGJ5IEZ1c2VhdSwgY2FuIG5h dGl2ZWx5IHVzZSBhbGwgdXN1YWwgY29udHJvbCBzdHJ1Y3R1cmVzIChsb29wcywgZXhjZXB0aW9u cyB3aXRoIHByb3BlciBiYWNrdHJhY2VzLCBldGMuKS4NCjwvcD4NCjxwPk9mIGFsbCB0aGUgbGli cmFyaWVzIGluIHRoaXMgY3JvcCBvZiBuZXcgT0NhbWwgNS1iYXNlZCBzY2hlZHVsZXJzLCBGdXNl YXUgaXMgcHJvYmFibHkgdGhlIGxlYXN0IGFtYml0aW91cy4gSW4gcGFydGljdWxhciwgaXQgZG9l cw0KPGI+bm90PC9iPjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmF0dGVtcHQgdG8g dXNlIGNhcGFiaWxpdGllcyBmb3IgbW9yZSBzZWN1cmUgcHJvZ3JhbW1pbmcgPC9saT48bGk+dXNl IGRvbWFpbnMgaW4gYW55IHdheSAoaXQncyBwdXJlbHkgc2luZ2xlIHRocmVhZGVkKSA8L2xpPjxs aT5oYXZlIGEgbm90aW9uIG9mIHF1b3RhIG9yIGZhaXJuZXNzIDwvbGk+PGxpPmluc2lzdCBvbiBo YXZpbmcgaXRzIG93biBJTyBldmVudCBsb29wLiA8L2xpPjwvdWw+DQo8cD5XaGF0IEZ1c2VhdSBk b2VzIGlzIHByb3ZpZGUgZmliZXJzLCBjb29wZXJhdGl2ZSBjaGFubmVscywgc3RydWN0dXJlZCBj b25jdXJyZW5jeSwgc2xlZXAsIGNhbmNlbGxhdGlvblteMV0sIGZpYmVyIGxvY2FsIHN0b3JhZ2Us IGFuZCB0aGUgYWJpbGl0eSBmb3IgdGhlIHNjaGVkdWxlciB0byBydW4gYWxvbmdzaWRlIGFuIGV2 ZW50IGxvb3AuDQo8L3A+DQo8cD5UaGUgbW9zdCBjb21wZWxsaW5nIHVzZSBmb3IgRnVzZWF1IHJp Z2h0IG5vdyBpcyB2aWEgPGNvZGU+ZnVzZWF1LWx3dDwvY29kZT4sIHdoaWNoIGNvdXBsZXMgRnVz ZWF1J3MgZmliZXIgc2NoZWR1bGVyIHdpdGgNCjxjb2RlPkx3dF9lbmdpbmU8L2NvZGU+J3MgZXZl bnQgbG9vcCAod2hpY2ggY2FuIGxldmVyYWdlIDxjb2RlPmxpYmV2PC9jb2RlPikuIFVzaW5nDQo8 Y29kZT5mdXNlYXUtbHd0PC9jb2RlPiwgaXQncyBmYWlybHkgZWFzeSB0byB1c2UgTHd0IGxpYnJh cmllcyBhbmQgPGNvZGU+YXdhaXQ8L2NvZGU+IHRoZW0gZnJvbSBhIEZ1c2VhdSBmaWJlciAoaW4g ZmFjdCwgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL2Z1c2VhdS9ibG9i L21haW4vZXhhbXBsZXMvbHd0L2FyZ2lvcGUvYXJnaW9wZS5tbCI+DQpiaWdnZXN0IGV4YW1wbGU8 L2E+IHdyaXR0ZW4gaW4gRnVzZWF1IHNvIGZhciB1c2VzIDxjb2RlPmV6Y3VybC1sd3Q8L2NvZGU+ IG9yIDxjb2RlPg0KY29odHRwLWx3dC11bml4PC9jb2RlPiB0byBjcmF3bCBhIHdlYiBzaXRlIHdp dGggbXVsdGlwbGUgY29uY3VycmVudCBjb25uZWN0aW9ucywgYW5kIHVzZXMNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvbW9vbnBvb2wvIj5tb29ucG9vbDwvYT4gdG8gcGFyc2Ug dGhlIHdlYiBwYWdlcyBpbiBwYXJhbGxlbCBpbiB0aGUgYmFja2dyb3VuZC4NCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3NzI0MTY3IiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNzcyNDE2NyI+c3RydWN0dXJlZCBjb25jdXJyZW5jeTwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNzcyNDE2NyI+DQo8 cD5GdXNlYXUncyBmaWJlcnMgKHR5cGU6IDxjb2RlPidhIEZpYmVyLnQ8L2NvZGU+IGZvciBhIGZp YmVyIHJldHVybmluZyA8Y29kZT4nYTwvY29kZT4pIGZvcm0gYSBjYW5jZWxsYXRpb24gdHJlZS4g V2hlbiBhIGZpYmVyIHNwYXducyBhIGNoaWxkIGZpYmVyLCBpdCBoYXMgYSBmZXcgd2F5cyBvZiBk b2luZyB0aGF0IGJ1dCB0aGUgbWFpbiBvbmUgaXM6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3Jj LWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dmFsPC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNzYwMWY7Ij5zcGF3bjwvc3Bhbj4gOg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDgyNGY7Ij4/bmFtZTwvc3Bhbj46c3RyaW5nIC0mZ3Q7DQogIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPj9wcm9wYWdhdGVfY2FuY2VsX3RvX3BhcmVudDwvc3Bhbj46Ym9vbCAtJmd0Ow0K ICAodW5pdCAtJmd0OyAnYSkgLSZndDsgJ2EgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ RmliZXIuPC9zcGFuPnQNCjwvcHJlPg0KPC9kaXY+DQo8cD53aGljaCBjcmVhdGVzIGEgbmV3IGZp YmVyLCByZWdpc3RlcnMgaXQgYXMgYSBjaGlsZCBvZiB0aGUgY3VycmVudCBmaWJlciwgYW5kIHJl c3VtZXMgdGhlIGN1cnJlbnQgZmliZXIuIFRoZSBpZGVhIGhlcmUgaXMgdGhhdCBpZiB0aGUgcGFy ZW50IGlzIGNhbmNlbGxlZCwgdGhlIGNoaWxkIGlzDQo8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5h bHdheXM8L3NwYW4+IGNhbmNlbGxlZDsgaWYgPGNvZGU+cHJvcGFnYXRlX2NhbmNlbF90b19wYXJl bnQ8L2NvZGU+IGlzDQo8Y29kZT50cnVlPC9jb2RlPiwgdGhlbiB0aGUgY2hpbGQgZmFpbGluZyBh bHNvIGNhbmNlbHMgdGhlIHBhcmVudC4gPC9wPg0KPHA+V2hhdGV2ZXIgaGFwcGVucywgYSBmaWJl ciA8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5hbHdheXM8L3NwYW4+IHJlc29sdmVzIGFmdGVyIGFs bCBpdHMgY2hpbGRyZW4gaGF2ZSByZXR1cm5lZC4gV2hhdCB0aGlzIG1lYW5zIGlzIHRoYXQsIHdo ZW4gYSBmaWJlcidzIG1haW4gZnVuY3Rpb24gcmV0dXJucyBvciByYWlzZXMsIEZ1c2VhdSBkb2Vz bid0IGltbWVkaWF0ZWx5IHJlc29sdmUgdGhlIGZpYmVyOyBpbnN0ZWFkIGl0IGF1dG9tYXRpY2Fs bHkNCiB3YWl0cyBmb3IgYWxsIGFsaXZlIGNoaWxkcmVuLiBJZiB0aGUgZnVuY3Rpb24gZmFpbHMs IHRoZSBjaGlsZHJlbiBhcmUgY2FuY2VsbGVkIGJlZm9yZSB0aGUgd2FpdC4NCjwvcD4NCjxwPk9u bHkgd2hlbiBhbGwgY2hpbGRyZW4gaGF2ZSByZXNvbHZlZCB3aWxsIHRoZSBwYXJlbnQgZmliZXIn cyByZXN1bHQgYmUgcHJvcGVybHkgc2V0LiBJZiB0aGUgZmliZXIncyBmdW5jdGlvbiB3YXMgYSBz dWNjZXNzLCBidXQgYSBjaGlsZCAod2l0aA0KPGNvZGU+fnByb3BhZ2F0ZV9jYW5jZWxfdG9fcGFy ZW50OnRydWU8L2NvZGU+KSBmYWlscywgdGhlbiB0aGUgcmVzdWx0IHN3aXRjaGVzIGZyb20gc3Vj Y2VzcyB0byBmYWlsdXJlLg0KPC9wPg0KPHA+VGhpcyBtZWFucyBGdXNlYXUgZG9lc24ndCBoYXZl IHN3aXRjaGVzIG9yIGdyYXZleWFyZHMgb3IgbnVyc2VyaWVzLiBJdCBvbmx5IGhhcyBmaWJlcnMs IGFuZCB0aGUgY3VycmVudGx5IGFjdGl2ZSBmaWJlciBpcyB0aGUgbnVyc2VyeSBmb3IgYWxsIG5l d2x5IHNwYXduIHN1Yi1maWJlcnNbXjJdLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzliY2ZmYzgiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlk PSJvcmc5YmNmZmM4Ij5jYW5jZWxsYXRpb24gYW5kIHJhY2luZyBtdWx0aXBsZSBvcGVyYXRpb25z PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc5YmNmZmM4Ij4N CjxwPkN1cnJlbnRseSB0aGVyZSBpcyBubyBwcmltaXRpdmUgaW4gRnVzZWF1IHRvIHRha2UgbXVs dGlwbGUgZmliZXJzIGFuZCB3YWl0IGZvciB0aGUgZmlyc3Qgb25lIHRvIGZpbmlzaCwgY2FuY2Vs bGluZyB0aGUgb3RoZXJzLiBUaGlzIGlzIGNvbW1vbiBpbiBMd3QgYW5kIEkgZG9uJ3QgbGlrZSBp dCwgYmVjYXVzZSBpdCBtZWFucyB3ZSBtaWdodCBlbmQgdXAgaW4gc2l0dWF0aW9ucyB3aGVyZSBi b3RoIGZpYmVycyBhY3R1YWxseSBjb21wbGV0ZWQsDQogYW5kIGVuZCB1cCBsb3NpbmcgZGF0YSBp biB0aGUgZmliZXIgdGhhdCBsb3N0IHRoZSByYWNlLiA8L3A+DQo8cD5JbnN0ZWFkIDxjb2RlPkZ1 c2VhdTwvY29kZT4gaGFzIGEgPGNvZGU+c2VsZWN0PC9jb2RlPiBwcmltaXRpdmUgYW5kIGEgbm90 aW9uIG9mIGF0b21pYyBldmVudDoNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVy Ij4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5tb2R1bGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPkY8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RnVzZWF1 PC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5GLjwvc3Bhbj5zZWxlY3Qg Ww0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5XaGVuPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Ri5DaGFuLjwv c3Bhbj5ldl9yZWNlaXZlIGMxLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij54PC9z cGFuPiAtJmd0OyDigKYpOw0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91 bmQtY29sb3I6ICNmY2Y3ZWY7Ij5XaGVuPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0 ZmNmOyI+Ri5DaGFuLjwvc3Bhbj5ldl9zZW5kIGMyIHksIDxzcGFuIHN0eWxlPSJjb2xvcjogIzU1 NzQwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pZ25vcmU8L3NwYW4+KTsNCiAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+V2hlbjwvc3Bhbj4g KDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkYuU2xlZXAuPC9zcGFuPmV2X3RpbWVvdXQg NS4sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPl88L3NwYW4+IC0mZ3Q7IDxzcGFu IHN0eWxlPSJjb2xvcjogIzU1NzQwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mYWlsd2l0aDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7dGltZW91dCZxdW90Ozwvc3Bh bj4pOw0KXQ0KPC9wcmU+DQo8L2Rpdj4NCjxwPlRoaXMgbWVjaGFuaXNtIGRlY291cGxlcyA8c3Bh biBjbGFzcz0idW5kZXJsaW5lIj5wb2xsaW5nPC9zcGFuPiBlYWNoIGF0b21pYyBldmVudCBpbiB0 dXJuLCBjaGVja2luZyBpZiBpdCdzIGFibGUgdG8gZmlyZSByaWdodCBub3cuIElmLCBpbg0KPGNv ZGU+V2hlbiAoZXYsIGYpPC9jb2RlPiwgdGhlIGV2ZW50IDxjb2RlPmV2PC9jb2RlPiBmaXJlcyB3 aGVuIHBvbGxlZCBhbmQgcmV0dXJucw0KPGNvZGU+eDwvY29kZT4sIHRoaXMgY29ycmVzcG9uZGlu ZyBicmFuY2ggaXMgdGFrZW4sIGFuZCB0aGUgPGNvZGU+c2VsZWN0PC9jb2RlPiB0YWlsLWNhbGxz IGludG8NCjxjb2RlPmYgeDwvY29kZT4uIEZvciBleGFtcGxlIGlmIDxjb2RlPkYuQ2hhbi5ldl9y ZWNlaXZlIGMxPC9jb2RlPiBmaXJlcyAocmVjZWl2aW5nIGFuIGl0ZW0gZnJvbSBhIGNoYW5uZWwp LCB0aGVuIHRoZSBjYWxsYmFjayBpcyBwYXNzZWQgdGhlIHJlY2VpdmVkIHZhbHVlLg0KPC9wPg0K PHA+SWYgbm8gYnJhbmNoIHN1Y2NlZWRzLCB0aGVuIHRoZSBmaWJlciBzdXNwZW5kcyBhbmQgcmVn aXN0ZXJzIHRvIGVhY2ggZXZlbnQncyA8Y29kZT4NCndhaXQ8L2NvZGU+IGZ1bmN0aW9uLiBUaGlz IG1lYW5zIGVhY2ggZXZlbnQgaXMgcGFzc2VkIGEgd2FrZXVwIGNhbGxiYWNrIGFuZCByZWdpc3Rl cnMgaXQgc29tZXdoZXJlIChzb2NrZXQgcmVhZGluZXNzLCBmdXR1cmUgY29tcGxldGlvbiwgY2hh bm5lbCByZWNlaXZlciBsaXN0LCBldGMuKS4NCjwvcD4NCjxwPlRoaXMgbWVjaGFuaXNtIChvbiB3 aGljaCB0aGUgcGFpbnQgaXMgdmVyeSBmcmVzaCEpIGlzIGV4dGVuc2libGUgKHNvIHlvdSBjYW4g bWFrZSB5b3VyIG93biBldmVudHMpIGFuZCBoYXMsIGltaG8sIGNsZWFuZXIgc2VtYW50aWNzIHRo YW4gY29tcGxleCByYWNlLWFuZC1jYW5jZWwtdGhlLWxvc2VyIGNvbWJpbmF0b3JzLg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2M3MTk2YzUiIGNs YXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdjNzE5NmM1Ij5kb21haW5zPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjNzE5NmM1Ij4NCjxwPkFzIHNhaWQg YWJvdmUsIEZ1c2VhdSBkb2Vzbid0IHNjaGVkdWxlIG9uIG11bHRpcGxlIGNvcmVzLiBQYXJ0IG9m IGl0IGlzIGZvciBzaW1wbGljaXR5IHJlYXNvbnMgKGl0IG1ha2VzIHRoZSBzY2hlZHVsZXIgbGVh biBhbmQgc2ltcGxlKTsgcGFydCBvZiBpdCBpcyB0byBmYWNpbGl0ZSBpbnRlcm9wZXJhYmlsaXR5 IHdpdGggTHd0Lg0KPC9wPg0KPHA+SG93ZXZlciwgc29tZSBvZiB0aGUgdHlwZXMgaW4gRnVzZWF1 IGFyZSB0aHJlYWQtc2FmZS4gSW4gcGFydGljdWxhcjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPml0J3MgcG9zc2libGUgdG8gc2NoZWR1bGUgYSBmaWJlciBmcm9tIGFub3RoZXIgdGhy ZWFkICg8Y29kZT5zcGF3bl9mcm9tX2FueXdoZXJlPC9jb2RlPikNCjwvbGk+PGxpPm1hbnkgZnVu Y3Rpb25zIHRvIGFjY2VzcyBmaWJlcnMnIHN0YXRlLCBjYW5jZWwgZmliZXJzLCBvciBjYWxsYmFj a3MgdXNlZCB0byByZXN1bWUgc3VzcGVuZGVyIGZpYmVycywgYXJlIHRocmVhZC1zYWZlLiBUaGlz IG1lYW5zIGl0J3Mgbm90IHRoYXQgaGFyZCB0byBpbXBsZW1lbnQgYQ0KPGNvZGU+YXdhaXQ8L2Nv ZGU+IGZ1bmN0aW9uIG9uIHNvbWUgZm9yZWlnbiBub3Rpb24gb2YgZnV0dXJlLiA8L2xpPjwvdWw+ DQo8cD5Gb3IgQ1BVIGJvdW5kIHRhc2tzLCB0aGVyZSBpcyBhbiBvcHRpb25hbCBsaWJyYXJ5IDxj b2RlPmZ1c2VhdS5tb29ucG9vbDwvY29kZT4gdGhhdCBoYXMNCjxjb2RlPkZ1c2VhdV9tb29ucG9v bC5hd2FpdF9mdXQgOiAnYSBNb29ucG9vbC5GdXQudCAtJmd0OyAnYTwvY29kZT4uIFRoaXMgY2Fu IGJlIHJ1biBmcm9tIEZ1c2VhdSB0byB3YWl0IGZvciBhIG1vb25wb29sIGNvbXB1dGF0aW9uIHRv IGJlIGRvbmUuDQo8L3A+DQo8cD5XaXRoIGFkZGl0aW9uYWwgaGVscGVycywgaXQncyBmYWlybHkg ZWFzeSB0byBzdGFydCBhIGJhY2tncm91bmQgY29tcHV0YXRpb24gZnJvbSBmdXNlYXUsIGFuZCBt YXliZSBzdXNwZW5kIHRoZSBjdXJyZW50IGZpYmVyIHVudGlsIGl0J3MgZG9uZToNCjwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij52YWw8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnNwYXduPC9zcGFuPiA6IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwODI0ZjsiPm9uPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5Nb29ucG9vbC5SdW5uZXIuPC9zcGFuPnQgLSZndDsgKHVuaXQgLSZndDsgJ2EpIC0mZ3Q7 DQogICdhIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk1vb25wb29sLkZ1dC48L3NwYW4+ dA0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjNGY2NzdmOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiog QW4gYWxpYXMgdG8gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPnshPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk1vb25wb29sLkZ1dC48L3NwYW4+c3Bhd248 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij59PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzRmNjc3ZjsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dmFsPC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICNhNzYwMWY7Ij5zcGF3bl9hbmRfYXdhaXQ8L3NwYW4+IDogPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+b248L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi Pk1vb25wb29sLlJ1bm5lci48L3NwYW4+dCAtJmd0OyAodW5pdCAtJmd0OyAnYSkgLSZndDsgJ2EN CjwvcHJlPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnZTk3Mzk1OCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2U5NzM5NTgiPmNs b3NpbmcgdGhvdWdodHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZ2U5NzM5NTgiPg0KPHA+VGhlIGRlc2lnbiBzcGFjZSBmb3IgY29uY3VycmVuY3kgbGlicmFy aWVzIGluIE9DYW1sIDUgaXMgd2lkZSwgYW5kIEkgZmluZCBpdCBpbnRlcmVzdGluZyB0aGF0IGFs cmVhZHkgYSBsb3Qgb2YgYWx0ZXJuYXRpdmVzIGhhdmUgZW1lcmdlZCwgZWFjaCB3aXRoIGl0cyBv d24gZm9jdXMuIEEgbmljaGUgdGhhdCBGdXNlYXUNCjxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPmNv dWxkPC9zcGFuPiBmaWxsIGlzIGV4aXN0aW5nIHByb2plY3RzIHRoYXQgaGF2ZSBhIGxvdCBvZiBM d3QgY29kZSwgYW5kIHdhbnQgdG8gbWlncmF0ZSBpdCBwcm9ncmVzc2l2ZWx5IHRvIGEgKGltaG8p IG5pY2VyIHN0eWxlIG9mIGNvbmN1cnJlbmN5LiBBbm90aGVyIG5pY2hlIGlzIGZvciBwZW9wbGUg b3IgdGVhbXMgdGhhdCB3YW50IGEgcmVhc29uYWJseSBzaW1wbGUgZmliZXIgbGlicmFyeSB0byBj b21iaW5lDQogd2l0aCB0aGVpciBldmVudCBsb29wIChlLmcuIDxjb2RlPmx1djwvY29kZT4gb3Ig PGNvZGU+bGliZXY8L2NvZGU+IG9yIG1heWJlIGV2ZW50IGEgZ3JhcGhpY2FsIGV2ZW50IGxvb3Ap Lg0KPC9wPg0KPHA+W14xXTogY2FuY2VsbGF0aW9uIGlzIHdoZXJlIG1vc3QgYnVncyBhbmQgcm91 Z2ggZWRnZXMgYXJlIGxpa2VseSB0byBsaXZlLCB1bnN1cnByaXNpbmdseS4NCjwvcD4NCjxwPlte Ml06IHRoZXJlIGFyZSBhbHRlcm5hdGl2ZXMgdG8gPGNvZGU+c3Bhd248L2NvZGU+IHRoYXQgc3Rh cnQgYSBmaWJlciB1bmRlciBhIGRpZmZlcmVudCBwYXJlbnQsIG9yIHVuZGVyIHRoZSByb290IGZp YmVyLCBiYXNpY2FsbHkgc2ltaWxhciB0bw0KPGNvZGU+THd0LmFzeW5jPC9jb2RlPiwgd2hlbiBp dCdzIG5lZWRlZC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj5I b3cgZG8gd2Ugd2FudCB0byBwcmVzZW50IE9DYW1sIHRvIHRoZSBXb3JsZCBvbiBPQ2FtbC5vcmc/ PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93LWRvLXdlLXdhbnQt dG8tcHJlc2VudC1vY2FtbC10by10aGUtd29ybGQtb24tb2NhbWwtb3JnLzE0MTYzLzEiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy1kby13ZS13YW50LXRvLXByZXNlbnQtb2NhbWwt dG8tdGhlLXdvcmxkLW9uLW9jYW1sLW9yZy8xNDE2My8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhNDZmMTkxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnYTQ2ZjE5MSI+U2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTQ2ZjE5MSI+DQo8cD5IaSBldmVyeW9u ZSEgPC9wPg0KPHA+V2UncmUgcmV3b3JraW5nIHRoZSBIb21lcGFnZSBvZiA8YSBocmVmPSJodHRw Oi8vb2NhbWwub3JnLyI+b2NhbWwub3JnPC9hPiBhbmQgdGhlIG1hcmtldGluZy1yZWxhdGVkIHBh Z2VzLCBzdWNoIGFzICZxdW90O0luZHVzdHJpYWwgVXNlcnMmcXVvdDssICZxdW90O0FjYWRlbWlj IFVzZXJzJnF1b3Q7LCBhbmQgJnF1b3Q7V2h5IE9DYW1sPyZxdW90Ow0KPC9wPg0KPHA+SSBwdXQg YSBHb29nbGUgZm9ybSB3aXRoIHNvbWUgcXVlc3Rpb25zIGZvciBhbnlvbmUgd2hvJ3MgaW50ZXJl c3RlZCB0byBnaXZlIGlucHV0IG9uIHRoaXMgaGVyZToNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBz Oi8vZm9ybXMuZ2xlL3BoNUFCeExzdXljS0s0R0Q4Ij5odHRwczovL2Zvcm1zLmdsZS9waDVBQnhM c3V5Y0tLNEdEODwvYT4NCjwvcD4NCjxwPlRoZSBhaW0gb2YgYWxsIHRoaXMgaXMgdG8gc2VlIGhv dyB3ZSBjYW4gaW1wcm92ZSB0aGUgbmFycmF0aXZlIG9uIHRoZSBIb21lcGFnZSBhbmQgdG8gbWFr ZSBzdXJlIHdlIGdpdmUgcGVvcGxlIGFsbCB0aGV5IG5lZWQgdG8ga25vdy4gSWRlYWxseSwgdGhl IHJld29ya2VkIHBhZ2VzIGNvdmVyIGFsbCB0aGUgcG9pbnRzIHdlIHdhbnQgdG8gbWFrZSBhbmQg YWxsIHRoZSByZXNvdXJjZXMgd2Ugd2FudCB0byBoaWdobGlnaHQuDQo8L3A+DQo8cD5CZXN0IDwv cD4NCjxwPlNhYmluZSA6c3BhcmtsZXM6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MTEiPk1pcmFnZU9TIGhhY2sgcmV0cmVhdCAyMDI0IGVkaXRpb24gKEFwcmlsIDIybmQgLSAyOHRo KTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21pcmFnZW9zLWhhY2st cmV0cmVhdC0yMDI0LWVkaXRpb24tYXByaWwtMjJuZC0yOHRoLzE0MDAyLzMiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L21pcmFnZW9zLWhhY2stcmV0cmVhdC0yMDI0LWVkaXRpb24tYXBy aWwtMjJuZC0yOHRoLzE0MDAyLzM8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZ2VjZjg3NjUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlY2Y4 NzY1Ij5IYW5uZXMgTWVobmVydCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2VjZjg3NjUiPg0KPHA+cGxlYXNlIG5vdGUgcmVnaXN0cmF0aW9u IGRlYWRsaW5lIHVwY29taW5nIChNYXJjaCAxc3QpIC0gdGhlcmUgYXJlIHN0aWxsIHNvbWUgc3Bv dHMgYXZhaWxhYmxlIOKAkyBsb29raW5nIGZvcndhcmQgdG8gc2VlIHlvdSB0aGVyZSA6cGFsbV90 cmVlOiA6ZHJvbWVkYXJ5X2NhbWVsOiA6dGVjaG5vbG9naXN0Og0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTIiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIxMiI+UmVjcnVpdGVtZW50IG9uIHRoZSBDYXRhbGEgcHJvamVjdCAoRnJl bmNoKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTIiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JlY3J1aXRlbWVu dC1vbi10aGUtY2F0YWxhLXByb2plY3QtZnJlbmNoLzE0MTg1LzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3JlY3J1aXRlbWVudC1vbi10aGUtY2F0YWxhLXByb2plY3QtZnJlbmNoLzE0 MTg1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNh NDA5ZDUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczYTQwOWQ1Ij5EZW5pcyBNZXJp Z291eCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzNhNDA5ZDUiPg0KPHA+W0FzIHRoZSBwb3NpdGlvbnMgb3BlbmluZyBhcmUgaW4gUGFyaXMg YW5kIGhvc3RlZCBhdCB0aGUgRnJlbmNoIE5hdGlvbmFsIFJlc2VhcmNoIENlbnRlciBpbiBDb21w dXRlciBTY2llbmNlIElOUklBLCB0aGUgcmVzdCBvZiB0aGUgcG9zdCBpcyBpbiBGcmVuY2hdDQo8 L3A+DQo8cD5Cb25qb3VyIMOgIHRvdXRlcyBldCDDoCB0b3VzLCA8L3A+DQo8cD5MZSBwcm9qZXQg Q2F0YWxhIHJlY3J1dGUgISBjYXRhbGEtbGFuZ1twb2ludF1vcmcgPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPnVuLmUgaW5nw6luaWV1ci5lIGNvbXBpbGF0aW9uIDxhIGhyZWY9Imh0dHBz Oi8vam9icy5pbnJpYS5mci9wdWJsaWMvY2xhc3NpYy9mci9vZmZyZXMvMjAyNC0wNzE5MCI+DQpo dHRwczovL2pvYnMuaW5yaWEuZnIvcHVibGljL2NsYXNzaWMvZnIvb2ZmcmVzLzIwMjQtMDcxOTA8 L2E+IDwvbGk+PGxpPnVuZSBpbmfDqW5pZXVyLmUgd2ViIDxhIGhyZWY9Imh0dHBzOi8vam9icy5p bnJpYS5mci9wdWJsaWMvY2xhc3NpYy9mci9vZmZyZXMvMjAyNC0wNzE5MSI+DQpodHRwczovL2pv YnMuaW5yaWEuZnIvcHVibGljL2NsYXNzaWMvZnIvb2ZmcmVzLzIwMjQtMDcxOTE8L2E+IDwvbGk+ PC91bD4NCjxwPkxlcyBwb3N0ZXMgc29udCBkZXMgQ0REIGRlIGRldXggYW5zIGF2ZWMgbGUgc3Rh dHV0IGQnaW5nw6luaWV1ciBkZSByZWNoZXJjaGUgSU5SSUEuIFTDqWzDqXRyYXZhaWwgcG9zc2li bGUgbWFpcyBwYXMgZnVsbCByZW1vdGUuIEMnZXN0IHVuIGNvbnRyYXQgZGUgbGEgZm9uY3Rpb24g cHVibGlxdWUgZCfDiXRhdCBkb25jIDM4IGggMzAgcGFyIHNlbWFpbmUsIDcgc2VtYWluZXMgZGUg Y29uZ8OpcyAmIzQzOyAxMCBqb3VycyBkZSBSVFQuIExlIHNhbGFpcmUgZXN0DQogaW5kZXjDqSBz dXIgbGEgZ3JpbGxlIGRlcyBpbmfDqW5pZXVycyBkZSByZWNoZXJjaGUgSU5SSUEgcXVpIGVzdCBm b25jdGlvbiBkZSBsJ2V4cMOpcmllbmNlIChhdmVjIHVuIHByaW5jaXBlIGRlIHJlY29uc3RpdHV0 aW9uIGRlIGNhcnJpw6hyZSkuDQo8L3A+DQo8cD5MZXMgZ3JvcyBjaGFudGllcnMgcG91ciBsZXMg MiBwcm9jaGFpbmVzIGFubsOpZXMgc29udCBsJ8Opdm9sdXRpb24gZXQgbGEgbWFpbnRlbmFuY2Ug ZHUgbGFuZ2FnZSwgbGUgZMOpdmVsb3BwZW1lbnQgZCdvdXRpbHMgZCdhaWRlIGF1IGTDqXZlbG9w cGVtZW50IG1haXMgYXVzc2kgbCdpbmR1c3RyaWFsaXNhdGlvbiBkdSBkaXNwb3NpdGlmIGQnZXhw bGljYWJpbGl0w6kgZGVzIGFsZ29yaXRobWVzIHB1YmxpY3MgZG9udCB1bmUgZMOpbW8gZXN0IGRp c3BvbmlibGUNCiBzdXIgY29kZVtwb2ludF1nb3V2W3BvaW50XWZyL2RlbW9zL2NhdGFsYS8uIFBh cnRhbnQgZGVzIHJlY29tbWFuZGF0aW9ucyBkJ3VuIHLDqWNlbnQgcmFwcG9ydCBkZSByZWNoZXJj aGUsIG5vdXMgc291aGFpdG9ucyBmYWlyZSBwbHVzaWV1cnMgdmlzdWFsaXNhdGlvbnMgZGUgbGEg dHJhY2UgZCdleHBsaWNhdGlvbiBkZSBsYSBkw6ljaXNpb24gw6AgZGVzdGluYXRpb24gZHUgZ3Jh bmQgcHVibGljLCBtYWlzIGF1c3NpIGVuIGludGVybmUgw6AgbCdhZG1pbmlzdHJhdGlvbg0KIGF1 eCBqdXJpc3RlcywgZMOpdmVsb3BwZXVycyBldCB0ZXN0ZXVycy4gTGEgb3UgbGUgZGV2IHdlYiBz dXIgbGUgcHJvamV0IGTDqWZpbmlyYSBwb3RlbnRpZWxsZW1lbnQgw6AgcXVvaSByZXNzZW1ibGVy YSBsZSBwcm9jaGFpbiBhdmlzIGQnaW1wb3NpdGlvbiBvdSBkw6l0YWlsIGRlIGNhbGN1bCBkZXMg cHJlc3RhdGlvbnMgc29jaWFsZXMuDQo8L3A+DQo8cD5MZSBzdGFjayB3ZWIgZXN0IHBvdXIgbCdp bnN0YW50IMOpY3JpdCBlbiBSZXNjcmlwdCBhdmVjIHVuIHBldSBkJ2ludGVyYWN0aW9uIGF2ZWMg ZHUgSlMgZ8OpbsOpcsOpIHBhcg0KPGNvZGU+anNfb2Zfb2NhbWw8L2NvZGU+LiBPbiBhaW1lcmFp dCBiaWVuIGdhcmRlciBSZXNjcmlwdCBwbHV0w7R0IHF1ZSBkZSBwYXNzZXIgw6AgVHlwZXNjcmlw dCBkb25jIHNpIHZvdXMgcHJhdGlxdWV6IFJlc2NyaXB0LCBuJ2jDqXNpdGV6IHBhcyDDoCBwb3N0 dWxlciAhIMOJdmlkZW1tZW50LCBsYSBtYWpvcml0w6kgZGVzIGNob3NlcyBzZSBwYXNzZSBxdWFu ZCBtw6ptZSBlbiBPQ2FtbCA6KQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMyI+ SnNfb2Zfb2NhbWwgNS43PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC0xMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWpzLW9mLW9jYW1sLTUtNy8xNDE5MS8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWpzLW9mLW9jYW1sLTUtNy8xNDE5MS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdlODQzMTkwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnZTg0MzE5MCI+SGh1Z28gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmdlODQzMTkwIj4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3VuY2Ug dGhlIHJlbGVhc2Ugb2YganNfb2Zfb2NhbWwgNS43LiBJdCBzaG91bGQgc29vbiBiZSBhdmFpbGFi bGUgaW4gb3BhbS4NCjwvcD4NCjxwPkpzX29mX29jYW1sIGlzIGEgY29tcGlsZXIgZnJvbSBPQ2Ft bCBieXRlY29kZSB0byBKYXZhU2NyaXB0LiBJdCBtYWtlcyBpdCBwb3NzaWJsZSB0byBydW4gcHVy ZSBPQ2FtbCBwcm9ncmFtcyBpbiBKYXZhU2NyaXB0IGVudmlyb25tZW50IGxpa2UgYnJvd3NlcnMg YW5kIE5vZGUuanMuDQo8L3A+DQo8cD5Nb3N0IHNpZ25pZmljYW50IGNoYW5nZXM6IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5TdXBwb3J0IGZvciBPQ2FtbCA1LjIuMH5hbHBoYTEgPC9s aT48bGk+Tm8gbG9uZ2VyIHJlbHkgb24gPGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIubW96aWxs YS5vcmcvZW4tVVMvZG9jcy9HbG9zc2FyeS9JSUZFIj4NCklJRkU8L2E+IGZvciBzY29waW5nIHZh cmlhYmxlIGluc2lkZSBsb29wcy4gPC9saT48L3VsPg0KPHA+U2VlIHRoZSA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NzaWdlbi9qc19vZl9vY2FtbC9ibG9iL21hc3Rlci9DSEFOR0VTLm1k Ij4NCkNoYW5nZWxvZyA8L2E+Zm9yIG90aGVyIGNoYW5nZXMuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTE0IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMTQiPkVpby10cmFjZSAwLjEgYW5kIEVpbyAwLjE1PC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZWlvLXRyYWNlLTAtMS1hbmQtZWlvLTAtMTUvMTQx OTcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZWlvLXRyYWNlLTAtMS1hbmQtZWlv LTAtMTUvMTQxOTcvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdiNDFmMDU2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYjQxZjA1NiI+VGhv bWFzIExlb25hcmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBp ZD0idGV4dC1vcmdiNDFmMDU2Ij4NCjxwPldpdGggPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sLW11bHRpY29yZS9laW8iPkVpbzwvYT4gMC4xNSBqdXN0IHJlbGVhc2VkLCBJJ2QgbGlr ZSB0byBhbm5vdW5jZSBhbHNvIHRoZSBmaXJzdCByZWxlYXNlIG9mIHRoZQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8tdHJhY2UiPmVpby10cmFjZTwvYT4g dG9vbCwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdmlzdWFsaXNlIHRoZSBiZWhhdmlvdXIgb2YgYW55 IEVpbyBwcm9ncmFtIChubyBuZWVkIGZvciBhIHNwZWNpYWwgaW5zdHJ1bWVudGVkIGJ1aWxkKS4g Rm9yIGVhbXBsZSwgaGVyZSBpcyBvbmUgb2YgRWlvJ3MgdHV0b3JpYWwgZXhhbXBsZXM6DQo8L3A+ DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9j YW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5GaWJlci48L3NwYW4+Ym90aA0KICAo PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bh bj4gKCkgLSZndDsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9s ZDsiPmZvcjwvc3Bhbj4geCA9IDEgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdl aWdodDogYm9sZDsiPnRvPC9zcGFuPiAzIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5kbzwvc3Bhbj4gdHJhY2VsbiA8c3BhbiBzdHlsZT0iY29sb3I6ICNj YTM0MDA7Ij4mcXVvdDt4ID0gJWQmcXVvdDs8L3NwYW4+IHg7IDxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPkZpYmVyLjwvc3Bhbj55aWVsZCAoKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZm MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZG9uZTwvc3Bhbj4pDQogICg8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiAoKSAtJmd0OyA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+Zm9yPC9zcGFuPiB5 ID0gMSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dG88 L3NwYW4+IDMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsi PmRvPC9zcGFuPiB0cmFjZWxuIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O3kg PSAlZCZxdW90Ozwvc3Bhbj4geTsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RmliZXIu PC9zcGFuPnlpZWxkICgpIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij5kb25lPC9zcGFuPikNCjwvcHJlPg0KPC9kaXY+DQo8cHJlIGNsYXNzPSJleGFtcGxl IiBpZD0ib3JnMjdjNjk4MiI+DQpkdW5lIGJ1aWxkIC4vZXhhbXBsZXMNCmVpby10cmFjZSBydW4g LS0gLi9fYnVpbGQvZGVmYXVsdC9leGFtcGxlcy9ib3RoL21haW4uZXhlDQo8L3ByZT4NCjxwPndp bGwgb3BlbiBhIHdpbmRvdyBzaG93aW5nOiA8L3A+DQo8ZGl2IGlkPSJvcmc1MTczNWRiIiBjbGFz cz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNv bS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9hL2EwNWZlNmMwZTQ4OWJhOWE3 ZmIxNmY0M2I3ZjNiOTQyYzRiN2Q5ZDEucG5nIiBhbHQ9ImEwNWZlNmMwZTQ4OWJhOWE3ZmIxNmY0 M2I3ZjNiOTQyYzRiN2Q5ZDEucG5nIj4NCjwvcD4NCjwvZGl2Pg0KPHA+VGhlIHVwcGVyIGhvcml6 b250YWwgYmFyIGlzIHRoZSBpbml0aWFsIGZpYmVyLCBhbmQgdGhlIGJyYWNrZXRzIHNob3cgPGNv ZGU+RmliZXIuYm90aDwvY29kZT4gY3JlYXRpbmcgYSBzZWNvbmQgZmliZXIuIFRoZSBncmVlbiBz ZWdtZW50cyBzaG93IHdoZW4gZWFjaCBmaWJlciBpcyBydW5uaW5nLiBOb3RlIHRoYXQgdGhlIG91 dHB1dCBmcm9tDQo8Y29kZT50cmFjZWxuPC9jb2RlPiBhcHBlYXJzIGluIHRoZSB0cmFjZSBhcyB3 ZWxsIGFzIG9uIHRoZSBjb25zb2xlLiBJbiB0aGUgZWlvLXRyYWNlIHdpbmRvdywgc2Nyb2xsaW5n IHdpdGggdGhlIG1vdXNlIG9yIHRvdWNocGFkIHdpbGwgem9vbSBpbiBvciBvdXQgb2YgdGhlIGRp YWdyYW0uDQo8L3A+DQo8cD5UaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byBzZWUgd2hhdCdz IGdvaW5nIG9uLCBhbmQgdG8gZmluZCBwZXJmb3JtYW5jZSBwcm9ibGVtcy4gRm9yIGV4YW1wbGUs IHdlIGNhbiBzZWUgdGhhdCB0aGUgZmlyc3Qgb3V0cHV0IGFib3ZlIHRvb2sgcXVpdGUgYSBiaXQg bG9uZ2VyIHRoYW4gdGhlIG90aGVycy4gWW91IGNhbiB0aGVuIHVzZSBlLmcuDQo8YSBocmVmPSJo dHRwczovL21hZ2ljLXRyYWNlLm9yZy8iPm1hZ2ljLXRyYWNlPC9hPiB0byBnZXQgdmVyeSBmaW5l LWdyYWluZWQgdHJhY2VzIGF0IHRoaXMgcG9pbnQgKGFuZCB3ZSBjYW4gc2VlIHRoYXQgZS5nLiB0 aGUgTGludXgNCjxjb2RlPndyaXRlPC9jb2RlPiBzeXN0ZW0gY2FsbCB0YWtlcyBhIGxvdCBsb25n ZXIgdGhlIGZpcnN0IHRpbWUpLiA8L3A+DQo8cD5laW8tdHJhY2UgY2FuIHRyYWNlIG11dGxpcGxl IGRvbWFpbnMsIGFuZCBzaG93cyB0aGUgdmFyaW91cyBzdGFnZXMgb2YgZ2FyYmFnZSBjb2xsZWN0 aW9uLiBIZXJlIHdlIGhhdmUgdHdvIGRvbWFpbnMgcnVubmluZzsgdGhlIHllbGxvdyByZWdpb25z IHNob3cgd2hlbiB0aGUgT0NhbWwgY29kZSBpcyBzdG9wcGVkIGR1ZSB0byBnYXJiYWdlIGNvbGxl Y3Rpb24gb3IgcG9sbGluZyB0aGUgT1M6DQo8L3A+DQo8ZGl2IGlkPSJvcmdlYmQwZTUxIiBjbGFz cz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNv bS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvZi9mYmI5YzU4ZTZiZDU0ZmEy ZGNjMmU3MDE0Zjc3N2E3MzA5MDM4MTI2XzJfMTM4MHgzNzAucG5nIiBhbHQ9ImZiYjljNThlNmJk NTRmYTJkY2MyZTcwMTRmNzc3YTczMDkwMzgxMjZfMl8xMzgweDM3MC5wbmciPg0KPC9wPg0KPC9k aXY+DQo8cD5TbyBmYXIsIGVpby10cmFjZSBoYXMgYWxzbyB1bmNvdmVyZWQgdHdvIGJ1Z3MgaW4g T0NhbWw6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI5 NDgiPg0KIzEyOTQ4PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy8xMjg5NyI+IzEyODk3PC9hPi4gRm9yIGV4YW1wbGUsIHRoZSB0cmFjZSBiZWxv dyBzaG93cyBhIHByb2Nlc3MgZnJlZXppbmcgZm9yIGFyb3VuZCA0NW1zIGR1cmluZw0KPGNvZGU+ RG9tYWluLmpvaW48L2NvZGU+LCBkdWUgdG8gYSBwcm9ibGVtIHdhaXRpbmcgZm9yIE9DYW1sJ3Mg dGljayB0aHJlYWQgdG8gc3RvcDoNCjwvcD4NCjxkaXYgaWQ9Im9yZzgzZmUyZGUiIGNsYXNzPSJm aWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1 c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzQvNDdjNDM5ZDQ1ZjVjMDdlY2RmYjFj YmFjMTFjYTQ4N2Y5OWJjZTNiMC5wbmciIGFsdD0iNDdjNDM5ZDQ1ZjVjMDdlY2RmYjFjYmFjMTFj YTQ4N2Y5OWJjZTNiMC5wbmciPg0KPC9wPg0KPC9kaXY+DQo8cD5QYXJ0aWN1bGFyIHRoYW5rcyBh cmUgZHVlIHRvIEBwYXRyaWNvZmVycmlzIGFuZCBATG9ydGV4IGZvciB0aGVpciB3b3JrIG9uIEVp byB0cmFjaW5nLg0KPC9wPg0KPHA+VGhlcmUgaGF2ZSBhbHNvIGJlZW4gbG90cyBvZiBvdGhlciBy ZWNlbnQgaW1wcm92ZW1lbnRzIHRvIEVpbywgaW5jbHVkaW5nOiA8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2Vp by9laW8vRWlvL0V4ZWN1dG9yX3Bvb2wvaW5kZXguaHRtbCI+RWlvLkV4ZWN1dG9yX3Bvb2w8L2E+ IGZvciBzdWJtaXR0aW5nIGpvYnMgdG8gYSBwb29sIG9mIHdvcmtlciBkb21haW5zICh0aGFua3Mg dG8gQGFzZW1pb19zZ3JvbmRpbikuDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLW11 bHRpY29yZS5naXRodWIuaW8vZWlvL2Vpby9FaW8vUG9vbC9pbmRleC5odG1sIj5FaW8uUG9vbDwv YT4gZm9yIG1hbmFnaW5nIHBvb2xzIG9mIHJlc291cmNlcyAobGlrZQ0KPGNvZGU+THd0X3Bvb2w8 L2NvZGU+KS4gQW5kIG5vdGUgdGhhdCB5b3UgY2FuIG5vdyBhdHRhY2ggcmVzb3VyY2VzIHRvIGEg c3dpdGNoIGZyb20gYW55IGRvbWFpbiwgd2hpY2ggbWFrZXMgcG9vbHMgbW9yZSB1c2VmdWwuDQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLW11bHRpY29yZS5naXRodWIuaW8vZWlvL2Vp by9FaW8vTGF6eS9pbmRleC5odG1sIj5FaW8uTGF6eTwvYT4gaXMgbGlrZQ0KPGNvZGU+U3RkbGli Lkxhenk8L2NvZGU+IGJ1dCBtdWx0aS1kb21haW4gc2FmZS4gPC9saT48bGk+VGhlcmUgYXJlIGxv dHMgbW9yZSBvcGVyYXRpb25zIGluIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdp dGh1Yi5pby9laW8vZWlvL0Vpby9QYXRoL2luZGV4Lmh0bWwiPg0KRWlvLlBhdGg8L2E+ICg8Y29k ZT5zdGF0PC9jb2RlPiwgPGNvZGU+cm10cmVlPC9jb2RlPiwgPGNvZGU+bWtkaXJzPC9jb2RlPiwg ZXRjKS4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlv L2Vpby9laW8vRWlvX3VuaXgvTmV0L2luZGV4Lmh0bWwjcGFzc2luZy1maWxlLWRlc2NyaXB0b3Jz Ij5GRC1wYXNzaW5nPC9hPiBvdmVyIFVuaXgtZG9tYWluIHNvY2tldHMuDQo8L2xpPjxsaT5UaGUg RWlvX3Bvc2l4IGJhY2tlbmQgbm93IHVzZXMgZmlsZSBkZXNjcmlwdG9ycyBmb3IgZGlyZWN0b3Jp ZXMgKEVpb19saW51eCBhbHJlYWR5IGRpZCB0aGlzKSwgd2hpY2ggYXZvaWRzIHJhY2VzIHdpdGgg c3ltbGlua3MgYW5kIGlzIGZhc3Rlci4gSXQgYWxzbyBtZWFucyB0aGF0IEVpbyBub3cgd29ya3Mg d2l0aCBDYXBzaWN1bSBPUyBzYW5kYm94aW5nLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2Vpby9laW8vRWlvX3VuaXgvaW5kZXguaHRtbCN2YWwt cnVuX2luX3N5c3RocmVhZCI+cnVuX2luX3N5c3RocmVhZDwvYT4gbm93IHVzZXMgYSBwb29sIG9m IHN5cy10aHJlYWRzIGZvciBwZXJmb3JtYW5jZS4NCjwvbGk+PC91bD4NCjxwPkZvciBmdWxsIGRl dGFpbHMsIHNlZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29y ZS9laW8vcmVsZWFzZXMiPg0KcmVsZWFzZSBub3RlczwvYT4sIGFuZCBmZWVsIGZyZWUgdG8gam9p biB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9jdW1lbnQvZC8xWkJmYmpB a3ZFa3Y5bGR1bXBaVjVWWHJFY19IcFBlWWpIUFdfVGl3SmU0USI+DQpkZXZlbG9wZXIgbWVldGlu Z3MgZXZlcnkgdHdvIHdlZWtzPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIx NSI+T3RoZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMTUiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjEzZDlkOCIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzIxM2Q5ZDgiPkZyb20gdGhlIG9jYW1sLm9y ZyBibG9nPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyMTNk OWQ4Ij4NCjxwPkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVk IGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxv ZzwvYT4uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2Js b2cucm9idXIuY29vcC9hcnRpY2xlcy9ncHRhci5odG1sIj5HUFRhcjwvYT4gPC9saT48bGk+PGEg aHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDItMjEtbXktZXhwZXJpZW5jZS13 aXRoLXRhcmlkZXMtYXQtaWNmcC0yMDIzIj5NeSBFeHBlcmllbmNlIFdpdGggVGFyaWRlcyBhdCBJ Q0ZQIDIwMjMhPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnZTljMzg3YyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9Im9yZ2U5YzM4N2MiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LW9yZ2U5YzM4N2MiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0K c2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJJ2xsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0K dGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+ SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1h eSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEv aW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9y bmFtZSIgaWQ9Im9yZ2FkNWZkN2YiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 20 Feb 2024 09:13:21 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 20 Feb 2024 09:13:21 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 20 Feb 2024 09:13:21 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41K9DPri007655 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 20 Feb 2024 09:13:25 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41K9DIBX007645 for ; Tue, 20 Feb 2024 09:13:18 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 Feb 2024 10:13:16 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7C6A6E00B7; Tue, 20 Feb 2024 10:13:16 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id DB087E008A for ; Tue, 20 Feb 2024 10:13:13 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Feb 2024 10:12:50 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 465AC5605D4; Tue, 20 Feb 2024 10:12:48 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaY90NucbiukQ3kkuxJ4Dl0alZUw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 20 Feb 2024 09:12:48 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: bec69006-f450-41ad-66e7-08dc31f42f64 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.06,172,1705359600"; d="scan'208,217";a="80104933" x-spam-flag: No, tests=bogofilter, spamicity=0.281118, queueID=AB35B5605D5 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <5AF1CE861782264F85CFADBDAC353EE9@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMi0yMCBUdWUgMTA6MTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDIuMTMuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMi4yNy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDEzIHRvIDIwLCAyMDI0Lg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5MaXN0IG9mIHByb3RlY3RlZCBr ZXl3b3JkIGluIE9DYW1sPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+b2NhbWwuY29kZXMsIGNv ZGUgc2VhcmNoIGZvciBPUEFNIHBhY2thZ2VzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+ZHVu ZSAzLjE0PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+TGVhcm4tT0NhbWwgMS4wIGlzIG91dCE8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5NZWxhbmdlIDMuMDwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzYiPkRvY2ZkOiBUVUkgbXVsdGlsaW5lIGZ1enp5IGRvY3VtZW50IGZpbmRlciAyLjIuMDwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzciPlJlOiBQcHhsaWIgZGV2IG1lZXRpbmdzPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjOCI+T3dsIHByb2plY3QgY29uY2x1ZGluZzwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzkiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmcxMWNi NTA3Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPkxpc3Qgb2Yg cHJvdGVjdGVkIGtleXdvcmQgaW4gT0NhbWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2xpc3Qtb2YtcHJvdGVjdGVkLWtleXdvcmQtaW4tb2NhbWwvMzAwMi82Ij4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9saXN0LW9mLXByb3RlY3RlZC1rZXl3b3JkLWluLW9j YW1sLzMwMDIvNjwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc0ZmViMmVhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNGZlYjJlYSI+TXV6aW11 emhpIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnNGZlYjJlYSI+DQo8cD5IZXJlJ3MgdGhlIGxhdGVzdCBsaW5rLCB3aXRoIHdvcmtpbmcgYW5j aG9yOiA8YSBocmVmPSJodHRwczovL3YyLm9jYW1sLm9yZy9tYW51YWwvbGV4Lmh0bWwjc3NzOmtl eXdvcmRzIj4NCmh0dHBzOi8vdjIub2NhbWwub3JnL21hbnVhbC9sZXguaHRtbCNzc3M6a2V5d29y ZHM8L2E+IDwvcD4NCjxwPlRoZSBPQ2FtbCBtYW51YWwgYWxzbyBwcm92aWRlcyBhbiBJbmRleCBv ZiBrZXl3b3JkcyB3aGljaCBpcyBoZWxwZnVsIGluIHJlYWRpbmcgc3ludGF4ZXMgYW5kIG1lbnRp b25zIG9mIGtleXdvcmRzIGluIGRldGFpbC4NCjxhIGhyZWY9Imh0dHBzOi8vdjIub2NhbWwub3Jn L21hbnVhbC9tYW51YWwwNzQuaHRtbCI+aHR0cHM6Ly92Mi5vY2FtbC5vcmcvbWFudWFsL21hbnVh bDA3NC5odG1sPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPm9jYW1sLmNv ZGVzLCBjb2RlIHNlYXJjaCBmb3IgT1BBTSBwYWNrYWdlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLWNvZGVzLWNvZGUtc2VhcmNoLWZvci1vcGFtLXBh Y2thZ2VzLzE0MDkyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1j b2Rlcy1jb2RlLXNlYXJjaC1mb3Itb3BhbS1wYWNrYWdlcy8xNDA5Mi8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2MmYwZWYxIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnNjJmMGVmMSI+cHJnYmxuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNjJmMGVmMSI+DQo8cD5JIHJlY2VudGx5 IHN0YXJ0ZWQgdXNpbmcgYSBsb2NhbCBpbnN0YW5jZSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vbGl2ZWdyZXAvbGl2ZWdyZXAiPg0KbGl2ZWdyZXA8L2E+IHRvIGVhc2lseSBzZWFyY2gg dGhyb3VnaCBhIGJ1bmNoIG9mIE9DYW1sIHJlcG9zaXRvcmllcy4gSXQncyBiZWVuIGhlbHBmdWwg Zm9yIGxvb2tpbmcgYXQgZXhhbXBsZXMgb2YgaG93IG90aGVycyB1c2UgY2VydGFpbiBmdW5jdGlv bnMgb3IgbGlicmFyaWVzIHdoZXJlIGRvY3VtZW50YXRpb24gaXMgc2NhcmNlLg0KPC9wPg0KPHA+ SSB0aG91Z2h0IEknZCBzZXQgdXAgYSBwdWJsaWMgaW5zdGFuY2UgaW4gY2FzZSBvdGhlcnMgd291 bGQgZmluZCB0aGlzIGhhbmR5IHRvby4gWW91IGNhbiBub3cgc2VhcmNoIHRocm91Z2ggdGhlIGNv ZGUgb2YgbW9zdCBPUEFNIHBhY2thZ2VzIG9uDQo8YSBocmVmPSJodHRwczovL29jYW1sLmNvZGVz LyI+aHR0cHM6Ly9vY2FtbC5jb2Rlcy88L2E+LiA8L3A+DQo8cD5IZXJlIGFyZSBzb21lIHRoaW5n cyB0byBrZWVwIGluIG1pbmQ6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JJ20gY3Vy cmVudGx5IG9ubHkgaW5kZXhpbmcgR2l0SHViIHJlcG9zaXRvcmllcyBmcm9tIHRoZSA8aT5kZXYt cmVwbzwvaT4gZmllbGQgb2YgT1BBTSBwYWNrYWdlcywgYXMgbW9zdCBhcmUgaG9zdGVkIHRoZXJl ICgyMzc1IHJlcG9zaXRvcmllcykuIEkgcGxhbiBvbiBpbmRleGluZyB0aGUgcmVtYWluaW5nIHJl cG9zaXRvcmllcyBpZiB0aGVyZSdzIGludGVyZXN0IChlLmcuLCBzdHVmZiBvbiBHaXRMYWIsIEJp dGJ1Y2tldCwgcGVyc29uYWwNCiBkb21haW5zKS4gPC9saT48bGk+VGhlcmUncyBubyBhdXRvbWF0 ZWQgcmUtaW5kZXhpbmcgdG8ga2VlcCB1cCB3aXRoIHRoZSBhZGRpdGlvbiBvZiBuZXcgcGFja2Fn ZXMgeWV0LCBidXQgdGhpcyBjb3VsZCBiZSBpbXBsZW1lbnRlZCBmYWlybHkgZWFzaWx5Lg0KPC9s aT48bGk+VGhlIGxpdmVncmVwIGluc3RhbmNlIGlzIHJ1bm5pbmcgb24gYSBsb3ctZW5kIFZQUywg c28gdGhlIHBlcmZvcm1hbmNlIGlzbid0IG9wdGltYWwuIEhvd2V2ZXIsIGl0IHN0aWxsIGZlZWxz IHNuYXBweSBhbmQgcGVyZmVjdGx5IHVzYWJsZSB0byBtZS4NCjwvbGk+PC91bD4NCjxwPkknbSBs b29raW5nIGZvcndhcmQgdG8gYW55IGZlZWRiYWNrLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iMyI+ZHVuZSAzLjE0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tZHVuZS0zLTE0LzE0MDk2LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t ZHVuZS0zLTE0LzE0MDk2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzEyNWQ1NDkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxMjVkNTQ5 Ij5FdGllbm5lIE1pbGxvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzEyNWQ1NDkiPg0KPHA+V2UncmUgaGFwcHkgdG8gYW5ub3VuY2UgdGhh dCBEdW5lIDMuMTQuMCBpcyBub3cgYXZhaWxhYmxlLiBUaGlzIGZlYXR1cmUgaGFzIG1hbnkgZml4 ZXMgYW5kIG5ldyBmZWF0dXJlcyB0aGF0IHlvdSBjYW4gZmluZCBpbiB0aGUgY2hhbmdlbG9nLg0K PC9wPg0KPHA+VGhlcmUgYXJlIGEgZmV3IG5ldyBmZWF0dXJlcyB0aGF0IHdlIHdvdWxkIGxpa2Ug dG8gc3BlY2lhbGx5IGhpZ2hsaWdodC4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdkYjk3ZjFjIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZGI5N2Yx YyI+RHluYW1pYyBkdW5lIGZpbGVzIHdpdGggPGNvZGU+KGR5bmFtaWNfaW5jbHVkZSk8L2NvZGU+ PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdkYjk3ZjFjIj4N CjxwPkl0IGlzIGNvbW1vbiBmb3Igc29tZSBwYXJ0cyBvZiBhIGJ1aWxkIHRvIGJlIGR5bmFtaWM6 IGZvciBleGFtcGxlIGEgc291cmNlIGZpbGUgY2FuIGJlIGdlbmVyYXRlZCwgb3Igc29tZSBwYXJ0 cyBvZiB0aGUgY29uZmlndXJhdGlvbiBsaWtlIEMgZmxhZ3MgY2FuIGJlIGdlbmVyYXRlZCBmcm9t IGEgRHVuZSBydWxlLiBCdXQgdW50aWwgbm93IGl0IHdhcyBub3QgcG9zc2libGUgdG8gZ2VuZXJh dGUgcnVsZXMgZHluYW1pY2FsbHkuDQo8L3A+DQo8cD5Gb3IgZXhhbXBsZSwgb25lIG1pZ2h0IHdh bnQgdG8gZG8gaXQgaXMgdG8gc2V0IHVwIG9uZSBydWxlIHBlciBpbnB1dCBmaWxlLiBUaGlzIGlz IGEgY29tbW9uIHBhdHRlcm4gaW4gdGVzdCBzdWl0ZXMgYW5kIGlzIGVhc3kgdG8gZG8gd2l0aCBN YWtlLiBCdXQgRHVuZSBkb2VzIG5vdCBoYXZlIGEgY29uY2VwdCBvZiBwYXJhbWV0ZXJpemVkIHJ1 bGVzLCBzbyBpdCBpcyBuZWNlc3NhcnkgdG8gc2V0IHVwIG9uZSBydWxlIHBlciBpbnB1dCBmaWxl Lg0KPC9wPg0KPHA+VGhlIHBhdHRlcm4gdG8gZG8gdGhpcyB3aXRoIER1bmUgaXMgdG86IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Xcml0ZSBhIGdlbmVyYXRvciB0aGF0IGxpc3RzIHRo ZSBpbnB1dCBmaWxlcyBhbmQgZW1pdHMgRHVuZSBzdGFuemFzIChhcyB0ZXh0KTsNCjwvbGk+PGxp PkFkZCBhIHJ1bGUgdGhhdCBtYWtlcyBhIDxjb2RlPmR1bmUuaW5jPC9jb2RlPiBmaWxlIHVzaW5n IHRoaXMgZ2VuZXJhdG9yOyA8L2xpPjxsaT5BZGQgPGNvZGU+KGluY2x1ZGUgZHVuZS5pbmMpPC9j b2RlPiBpbiB0aGUgbWFpbiA8Y29kZT5kdW5lPC9jb2RlPiBmaWxlLCA8L2xpPjwvdWw+DQo8cD5I b3dldmVyLCB0aGlzIHJlcXVpcmVzIGNoZWNraW5nIGluIHRoZSBnZW5lcmF0ZWQgPGNvZGU+ZHVu ZS5pbmM8L2NvZGU+IGZpbGUgaW4gdGhlIHJlcG9zaXRvcnkuIEFub3RoZXIgZHJhd2JhY2sgaXMg dGhhdCB3aGVuIG1vZGlmeWluZyB0aGUgbGlzdCBvZiBpbnB1dCBmaWxlcywgaXQgaXMgbmVjZXNz YXJ5IHRvIHJ1biB0ZXN0cyB0d2ljZTogb25lIHRvIHVwZGF0ZQ0KPGNvZGU+ZHVuZS5pbmM8L2Nv ZGU+LCBvbmUgdG8gcnVuIHRoZSBuZXcgdGVzdC4gPC9wPg0KPHA+VGhpcyByZWxlYXNlIG9mIER1 bmUgYWRkcyBhIG5ldyA8Y29kZT4oZHluYW1pY19pbmNsdWRlKTwvY29kZT4gc3RhbnphIHRoYXQg bGlmdHMgdGhlc2UgcmVzdHJpY3Rpb25zOg0KPGNvZGU+ZHVuZS5pbmM8L2NvZGU+IGRvZXMgbm90 IGhhdmUgdG8gYmUgcGFydCBvZiB0aGUgc291cmNlIHRyZWUsIGl0IGNhbiBiZSBnZW5lcmF0ZWQg dHJhbnNwYXJlbnRseS4gVGhpcyBjb21lcyB3aXRoIHNvbWUgcmVzdHJpY3Rpb25zOiBzb21lIHN0 YW56YXMgY2FuIG5vdCBiZSBnZW5lcmF0ZWQsIGluIHBhcnRpY3VsYXIgdGhlIG9uZXMgdGhhdCBk ZWZpbmUgcHVibGljIGxpYnJhcmllcy4gQW5kIGR1ZSB0byBob3cgcnVsZSBsb2FkaW5nIHdvcmtz LA0KIHRoZSBnZW5lcmF0ZWQgc3RhbnphIG5lZWRzIHRvIGJlIGRlZmluZWQgaW4gYSBkaWZmZXJl bnQgZGlyZWN0b3J5LiA8L3A+DQo8cD5TdGlsbCwgdGhpcyBzaG91bGQgYmUgdXNlZnVsIGZvciBt YW55IHVzZXJzIHRoYXQgcmVseSBvbiB0aGUgZ2VuZXJhdGUtaW5jbHVkZS1jb21taXQgYnBhdHRl cm4gZGVzY3JpYmVkIGFib3ZlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzRmOGUzOTIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc0 ZjhlMzkyIj5TaGVybG9kb2MgaW50ZWdyYXRpb248L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZzRmOGUzOTIiPg0KPHA+U2hlcmxvZG9jIGlzIGEgc2VhcmNoIGVu Z2luZSBmb3IgT0NhbWwgZG9jdW1lbnRhdGlvbiwgd2hpY2ggc3VwcG9ydHMgc2VhcmNoIGJ5IG5h bWUsIGRvY3VtZW50YXRpb24gYW5kIGZ1enp5IHR5cGUgc2VhcmNoIChzaW1pbGFyIHRvIEhvb2ds ZSBpbiB0aGUgSGFza2VsbCB3b3JsZCkuIEl0IGNhbiBiZSBvYnRhaW5lZCBmcm9tIG9wYW0gdXNp bmcNCjxjb2RlPm9wYW0gaW5zdGFsbCBzaGVybG9kb2M8L2NvZGU+LiA8L3A+DQo8cD5XaGVuIGl0 IGlzIGF2YWlsYWJsZSwgRHVuZSBjb21tYW5kcyB0aGF0IHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0 aW9uLCBzdWNoIGFzIDxjb2RlPg0KZHVuZSBidWlsZCBAZG9jPC9jb2RlPiBhbmQgPGNvZGU+ZHVu ZSBidWlsZCBAZG9jLW5ldzwvY29kZT4sIHdpbGwgaW5jbHVkZSBhIHNlYXJjaCBiYXIgaW4gdGhl IGdlbmVyYXRlZCBvdXRwdXQuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYTEyZWIxZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Ex MmViMWUiPkNoYW5nZWxvZzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnYTEyZWIxZSI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9y ZzYxYWQ5M2YiPjwvYT5BZGRlZDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmc2MWFkOTNmIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JbnRyb2R1Y2UgYSA8 Y29kZT4oZHluYW1pY19pbmNsdWRlIC4uKTwvY29kZT4gc3RhbnphLiBUaGlzIGlzIGxpa2UgPGNv ZGU+KGluY2x1ZGUgZm9vKTwvY29kZT4gYnV0IGFsbG93cw0KPGNvZGU+Zm9vPC9jb2RlPiB0byBi ZSB0aGUgdGFyZ2V0IG9mIGEgcnVsZS4gQ3VycmVudGx5LCB0aGVyZSBhcmUgc29tZSBsaW1pdGF0 aW9ucyBvbiB0aGUgc3RhbnphcyB0aGF0IGNhbiBiZSBnZW5lcmF0ZWQuIEZvciBleGFtcGxlLCBw dWJsaWMgZXhlY3V0YWJsZXMsIGxpYnJhcmllcyBhcmUgY3VycmVudGx5IGZvcmJpZGRlbi4gKCM5 OTEzLCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+SW50cm9kdWNlIDxjb2RlPiQgZHVuZSBwcm9tb3Rp b24gbGlzdDwvY29kZT4gdG8gcHJpbnQgdGhlIGxpc3Qgb2YgYXZhaWxhYmxlIHByb21vdGlvbnMu ICgjOTcwNSwgQG1veW9kaWFsbG8pDQo8L2xpPjxsaT5JZiBTaGVybG9kb2MgaXMgaW5zdGFsbGVk LCBhZGQgYSBzZWFyY2ggYmFyIGluIGdlbmVyYXRlZCBIVE1MIGRvY3MgKCM5NzcyLCBARW1pbGVU cm90aWdub24pDQo8L2xpPjxsaT5BZGQgPGNvZGU+b25seV9zb3VyY2VzPC9jb2RlPiBmaWVsZCB0 byA8Y29kZT5jb3B5X2ZpbGVzPC9jb2RlPiBzdGFuemEgKCM5ODI3LCBmaXhlcyAjOTcwOSwgQGpj aGF2YXJyaSkNCjwvbGk+PGxpPlRoZSA8Y29kZT4oZm9yZWlnbl9saWJyYXJ5KTwvY29kZT4gc3Rh bnphIG5vdyBzdXBwb3J0cyB0aGUgPGNvZGU+KGVuYWJsZWRfaWYpPC9jb2RlPiBmaWVsZC4gKCM5 OTE0LCBAbm9qYikNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzI0YTBh ZGMiPjwvYT5GaXhlZDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1v cmcyNGEwYWRjIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaXggPGNvZGU+JCBkdW5lIGlu c3RhbGwgLXA8L2NvZGU+IGluY29ycmVjdGx5IHJlY29nbml6aW5nIHBhY2thZ2VzIHRoYXQgYXJl IHN1cHBvc2VkIHRvIGJlIGZpbHRlcmVkICgjOTg3OSwgZml4ZXMgIzQ4MTQsIEByZ3JpbmJlcmcp DQo8L2xpPjxsaT5zdWJzdDogY29ycmVjdGx5IGhhbmRsZSBvcGFtIGZpbGVzIGluIG9wYW0vIHN1 YmRpcmVjdG9yeSAoIzk4OTUsIGZpeGVzICM5ODYyLCBAZW1pbGxvbikNCjwvbGk+PGxpPk9kb2Mg cHJpdmF0ZSBydWxlcyBhcmUgbm90IHNldCB1cCBpZiBhIGxpYnJhcnkgaXMgbm90IGF2YWlsYWJs ZSBkdWUgdG8gPGNvZGU+DQplbmFibGVkX2lmPC9jb2RlPiAoIzk4OTcsIEByZ3JpbmJlcmcgYW5k IEBqY2hhdmFycmkpIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzMzMGI3 OGYiPjwvYT5DaGFuZ2VkPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0 LW9yZzMzMGI3OGYiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPldoZW4gZHVuZSBsYW5ndWFn ZSAzLjE0IGlzIGVuYWJsZWQsIHJlc29sdmUgdGhlIGJpbmFyeSBpbiA8Y29kZT4ocnVuICV7Ymlu Oi4ufSAuLik8L2NvZGU+IGZyb20gd2hlcmUgdGhlIGJpbmFyeSBpcyBidWlsdC4gKCM5NzA4LCBA cmdyaW5iZXJnKQ0KPC9saT48bGk+Ym9vdDogcmVtb3ZlIHNpbmdsZS1jb21tYW5kIGJvb3RzdHJh cC4gVGhpcyB3YXMgYW4gYWx0ZXJuYXRpdmUgYm9vdHN0cmFwIHN0cmF0ZWd5IHRoYXQgd2FzIHVz ZWQgaW4gY2VydGFpbiBjb25kaXRpb25zLiBSZW1vdmFsIG1ha2VzIHRoZSBib290c3RyYXAgYSBi aXQgc2xvd2VyIG9uIExpbnV4IHdoZW4gb25seSBhIHNpbmdsZSBjb3JlIGlzIGF2YWlsYWJsZSwg YnV0IGJvb3RzdHJhcCBpcyBub3cgcmVwcm9kdWNpYmxlIGluIGFsbCBjYXNlcy4NCiAoIzk3MzUs IGZpeGVzICM5NTA3LCBAZW1pbGxvbikgPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+TGVhcm4tT0NhbWwgMS4wIGlzIG91dCE8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xlYXJuLW9jYW1sLTEtMC1pcy1vdXQv MTQxMDAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbGVhcm4tb2NhbWwtMS0wLWlz LW91dC8xNDEwMC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzNmOWNjZTUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczZjljY2U1Ij5Mb3Vp cyBHZXNiZXJ0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnM2Y5Y2NlNSI+DQo8cD5IZWxsbyBhbGwsIDwvcD4NCjxwPkxlYXJuLU9DYW1sIDEu MCBpcyBmaW5hbGx5IG91dCA6dGFkYTogPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2NhbWwvIj48Yj5MZWFybi1PQ2FtbDwv Yj48L2E+IGlzIGEgd2ViIHBsYXRmb3JtIGZvciBleGVyY2lzZXMgaW4gT0NhbWwgcHJvZ3JhbW1p bmcsIHdpdGggYXV0b21hdGVkIGdyYWRpbmcgdGhhdCB3YXMgb3JpZ2luYWxseSBkZXZlbG9wcGVk IGZvciB0aGUgT0NhbWwgTU9PQy4gVGhlIGludGVyZmFjZSBmZWF0dXJlcyBhIGNvZGUgZWRpdG9y IGFuZCBjbGllbnQtc2lkZQ0KIGV2YWx1YXRpb24gYW5kIGdyYWRpbmcgOyBpdCBjYW4gYmUgc2Vy dmVkIHN0YXRpY2FsbHksIGJ1dCBpZiBydW5uaW5nIHRoZSBidW5kbGVkIHNlcnZlciB0aGVyZSBh cmUgYWxzbyBzZXJ2ZXItc2lkZSBzYXZlcywgZmFjaWxpdGllcyBmb3IgdGVhY2hlcnMgdG8gZm9s bG93IHRoZSBwcm9ncmVzcyBvZiBzdHVkZW50cywgZ2l2ZSBhc3NpZ25tZW50cywgZ2V0IGdyYWRl cywgZXRjLg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdlMmEwM2RjIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZTJhMDNk YyI+R2V0IG1lIHRoZXJlITwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnZTJhMDNkYyI+DQo8cD5UaGVyZSBpcyBhIGxpdmUgZGVtbyBhdCA8YSBocmVmPSJodHRw czovL29jYW1sLXNmLm9yZy9sZWFybi1vY2FtbC1wdWJsaWMiPm9jYW1sLXNmLm9yZzwvYT4uDQo8 L3A+DQo8cD5BbHRob3VnaCBtb3N0IGNoYW5nZXMgd2lsbCBiZSBtb3N0bHkgbWVhbmluZ2Z1bCBm b3IgdGVhY2hlcnMgcnVubmluZyB0aGVpciBpbnN0YW5jZXMsIHRoaXMgYWxyZWFkeSBzaG93cyB0 aGUgZ3Jvd2luZyBjb3JwdXMgb2YgZXhlcmNpc2VzLg0KPC9wPg0KPHA+VG8gcnVuIHlvdXIgb3du IGluc3RhbmNlLCBzZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtc2Yub3JnL2xlYXJuLW9j YW1sL2hvd3RvLWRlcGxveS1hLWxlYXJuLW9jYW1sLWluc3RhbmNlLmh0bWwiPg0KZ3VpZGU8L2E+ LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYTU5 YzEyNyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2E1OWMxMjciPldoYXQncyBuZXc8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2E1OWMxMjciPg0K PHA+VGhpcyBmaXJzdCBtYWpvciByZWxlYXNlLCBhbG9uZyB3aXRoIGEgbG90IG9mIHF1YWxpdHkt b2YtbGlmZSBpbXByb3ZlbWVudHMsIGZlYXR1cmVzIGEgc2lnbmlmaWNhbnQgcmV3cml0ZSBvZiB0 aGUgZXZhbHVhdGlvbiBlbmdpbmUuIFRoZSBtYWluIHZpc2libGUgY29uc2VxdWVuY2VzIGFyZToN CjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5hIG5pY2Ugc3BlZWR1cCB0byB0aGUgZ3Jh ZGluZyBvZiBleGVyY2lzZXMgaW4gdGhlIGJyb3dzZXIgPC9saT48bGk+YSBodWdlICh4MTAwKSBz cGVlZHVwIHRvIHRoZSBwcmUtcHJvY2Vzc2luZyBvZiB0aGUgZXhlcmNpc2VzICh3aGVuIHJ1bm5p bmcgPGNvZGU+DQpsZWFybi1vY2FtbCBidWlsZDwvY29kZT4pIDwvbGk+PGxpPmV4ZXJjaXNlIHNv bHV0aW9ucyBjYW4gbm8gbG9uZ2VyIGxlYWsgKHRoZSBzZXJ2ZXIgb25seSBwcm92aWRlcyB0aGUg YWxyZWFkeSBjb21waWxlZCBqc29vIHZlcnNpb24gdG8gdGhlIGNsaWVudCksIG1ha2luZyB0aGUg cGxhdGZvcm0gbW9yZSBzdWl0YWJsZSBmb3IgZXZhbHVhdGlvbnMNCjwvbGk+PGxpPmVycm9yIG1l c3NhZ2VzIHdoZW4gY29tcGlsaW5nIGV4ZXJjaXNlcyBhcmUgbXVjaCwgbXVjaCBiZXR0ZXIgPC9s aT48L3VsPg0KPHA+QSBmZXcgb3RoZXIgbW9zdC13YW50ZWQgZmVhdHVyZXMgaGF2ZSBhbHNvIGJl ZW4gYWRkZWQsIGxpa2UgYSByZXdvcmtlZCBleGVyY2lzZSBjaG9pY2UgcGFnZSwgYW5kIHRoZSBh YmlsaXR5IHRvIHVwZGF0ZSBhIHJ1bm5pbmcgaW5zdGFuY2Ugd2l0aCBtaW5pbWFsIGRvd250aW1l ICg8Y29kZT5sZWFybi1vY2FtbCBidWlsZCBzZXJ2ZSAtLXJlcGxhY2U8L2NvZGU+KSA7IGFzIHdl bGwgYXMgbG90cyBvZiBRb0wgaW1wcm92ZW1lbnRzLCBsaWtlIGJ1Z2ZpeGVzDQogYW5kIGludGVn cmF0ZWQgZG9jdW1lbnRhdGlvbiBpbiB0aGUgdGVhY2hlciBpbnRlcmZhY2UuIDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1N2FkNWExIiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNTdhZDVhMSI+V2hhdCdzIGNvbWluZzwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNTdhZDVhMSI+DQo8cD5BIHByb3Bl ciBsb2dpbiBzeXN0ZW0gd2l0aCBjaG9pY2UgYmV0d2VlbiBlbWFpbC9wYXNzd29yZCBvciBhIE1v b2RsZSBzZXJ2ZXIgaXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFy bi1vY2FtbC9wdWxsLzM2MiI+aW4gdGhlIHdvcmtzPC9hPiA7IHdlIGV4cGVjdCBpdCB0byBsYW5k IHNob3J0bHkgaW4gMS4xLCBvbmNlIHdlIHdvcmsgb24gdGhlIHJlbWFpbmluZyByb3VnaCBlZGdl cy4NCjwvcD4NCjxwPlBvcnRpbmcgdG8gbW9yZSByZWNlbnQgdmVyc2lvbnMgb2YgT0NhbWwgaXMg YWxzbyBwbGFubmVkLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnMDdhNWJjZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzA3YTViY2Ui PkZlZWRiYWNrPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcw N2E1YmNlIj4NCjxwPkZlZWRiYWNrIGlzIHZlcnkgd2VsY29tZSBoZXJlIG9yIG9uIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFybi1vY2FtbC9pc3N1ZXMiPg0KR2l0aHVi PC9hPi4gPC9wPg0KPHA+4oCUIExvdWlzIEdlc2JlcnQgKE9DYW1sUHJvKSwgb24gYmVoYWxmIG9m IHRoZSBMZWFybi1PQ2FtbCB0ZWFtIDwvcD4NCjxwPldpdGggdGhhbmtzIHRvIHRoZSBPQ2FtbCBG b3VuZGF0aW9uIGZvciBmdW5kaW5nIHRoZSBtYWpvciBwYXJ0IG9mIHRoaXMgd29yay4gPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+TWVsYW5nZSAzLjA8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tZWxhbmdlLTMtMC8xNDEwMi8xIj5o dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1lbGFuZ2UtMy0wLzE0MTAyLzE8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2JlNGQ5YWMiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiZTRkOWFjIj5BbnRvbmlvIE51bm8gTW9udGVpcm8g YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdi ZTRkOWFjIj4NCjxwPkRlYXIgT0NhbWwgdXNlcnMsIDwvcD4NCjxwPnRoZSBNZWxhbmdlIHRlYW0g aXMgcHJvdWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgTWVsYW5nZSAzLjAuIDwvcD4NCjxw Pk1lbGFuZ2UgaXMgYSBiYWNrZW5kIGZvciB0aGUgT0NhbWwgY29tcGlsZXIgdGhhdCBlbWl0cyBK YXZhU2NyaXB0LiBUaGlzIHJlbGVhc2UgZm9jdXNlcyBvbjoNCjwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5JbXByb3ZlZCBPQ2FtbCB2ZXJzaW9uIHN1cHBvcnQ6IHdlJ3JlIHJlbGVhc2lu ZyBNZWxhbmdlIHYzIHdpdGggZnVsbCBzdXBwb3J0IGZvciBPQ2FtbCA0LjE0IGFuZCBPQ2FtbCA1 LjEsIHNpbWlsYXIgdG8gTWVybGluJ3MgcmVjZW50IHZlcnNpb25pbmcgc2NoZW1lICgzLjAuMC00 MTQgYW5kIDMuMC4wLTUxKS4NCjwvbGk+PGxpPkJldHRlciBKYXZhU2NyaXB0IGludGVyb3A6IHdl IHN1cHBvcnQgbW9yZSBjb21iaW5hdGlvbnMgaW4gb3VyIEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJm YWNlIGxheWVyLCBhbGxvd2luZyB0byBvdXRwdXQgbW9yZSBKYXZhU2NyaXB0IGNvbnN0cnVjdHMg d2l0aG91dCByZXNvcnRpbmcgdG8NCjxjb2RlPiVtZWwucmF3PC9jb2RlPiA8L2xpPjxsaT5NYWRl IE1lbGFuZ2UgbGVhbmVyIGFuZCBtb3JlIHJvYnVzdDoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5pbiB0aGUgY29tcGlsZXIgY29yZSwgd2UgZml4ZWQgYSBmZXcgY3Jhc2hlcywgcmVtb3ZlZCB1 bnVzZWQgY29kZSBhbmQgbWFkZSBvdGhlciBjb2RlIGZhc3RlcjsNCjwvbGk+PGxpPmluIHRoZSBN ZWxhbmdlIHJ1bnRpbWUgbGlicmFyaWVzLCB3ZSB1bmlmaWVkIEFQSXMgdGhhdCB3ZXJlIGR1cGxp Y2F0ZWQgb3IgaW5jb25zaXN0ZW50DQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5JbXBsZW1lbnRlZCBt b3JlIHJ1bnRpbWUgcHJpbWl0aXZlcyBhbmQgZW5hYmxlZCBhZGRpdGlvbmFsIFN0ZGxpYiBmdW5j dGlvbnMgPC9saT48L3VsPg0KPHA+V2l0aCB0aGUgcmVsZWFzZSBvZiBNZWxhbmdlIDMsIHdlJ3Jl IGFsc28gaW50cm9kdWNpbmcgYSByZWRlc2lnbiBvZiBvdXIgPGEgaHJlZj0iaHR0cHM6Ly9tZWxh bmdlLnJlL3YzLjAuMC8iPg0KZG9jdW1lbnRhdGlvbiB3ZWJzaXRlPC9hPi4gV2UgYWRkZWQgYW4g b3ZlcmFsbCBuZXcgZGVzaWduLCBzbmFwcGllciBuYXZpZ2F0aW9uIGFuZCByZWFsLXRpbWUgc2Vh cmNoLg0KPC9wPg0KPHA+SSB3cm90ZSBhIG1vcmUgY29tcHJlaGVuc2l2ZSByZWxlYXNlIGFubm91 bmNlbWVudCBpbiB0aGUgZm9sbG93aW5nIHBvc3Q6IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8v bWVsYW5nZS5yZS9ibG9nL3Bvc3RzL2Fubm91bmNpbmctbWVsYW5nZS0zIj5odHRwczovL21lbGFu Z2UucmUvYmxvZy9wb3N0cy9hbm5vdW5jaW5nLW1lbGFuZ2UtMzwvYT4NCjwvcD4NCjxwPkFzIGFs d2F5cywgZmVlZGJhY2sgaXMgdmVyeSBtdWNoIGFwcHJlY2lhdGVkLiA8L3A+DQo8cD5UaGlzIHJl bGVhc2Ugb2YgTWVsYW5nZSBpcyBzcG9uc29yZWQgYnkgQWhyZWZzIGFuZCB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC1zZi5vcmcvIj4NCk9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb24gPC9hPi4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt NiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPkRvY2ZkOiBUVUkgbXVsdGlsaW5lIGZ1 enp5IGRvY3VtZW50IGZpbmRlciAyLjIuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWRvY2ZkLXR1aS1tdWx0aWxpbmUtZnV6enktZG9jdW1lbnQtZmluZGVyLTIt Mi0wLzE0MTA5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kb2NmZC10dWkt bXVsdGlsaW5lLWZ1enp5LWRvY3VtZW50LWZpbmRlci0yLTItMC8xNDEwOS8xPC9hPg0KPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0Mzc4ZjI3IiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnNDM3OGYyNyI+RGFycmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNDM3OGYyNyI+DQo8cD5JIGFtIGhh cHB5IHRvIHNoYXJlIGEgbmV3IHJlbGVhc2Ugb2YgRG9jZmQsIDIuMi4wLiA8L3A+DQo8cD48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFycmVubGRsL2RvY2ZkIj5SZXBvPC9hPi4gQWxzbyBw YWNrYWdlZCBvbiA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL2RvY2ZkL2xhdGVzdCI+DQpv cGFtPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9hdXIuYXJjaGxpbnV4Lm9yZy9wYWNrYWdlcy9kb2Nm ZC1iaW4iPkFVUjwvYT4sIGFuZCBOaXggKGFzDQo8Y29kZT5kb2NmZDwvY29kZT4pLCA8L3A+DQo8 cD5UaGluayBpbnRlcmFjdGl2ZSBncmVwIGZvciBib3RoIHRleHQgZmlsZXMgYW5kIFBERnMsIGJ1 dCB3b3JkL3Rva2VuIGJhc2VkIGluc3RlYWQgb2YgcmVnZXggYW5kIGxpbmUgYmFzZWQsIHNvIHlv dSBjYW4gc2VhcmNoIGFjcm9zcyBsaW5lcyBlYXNpbHkuDQo8L3A+DQo8cD5Eb2NmZCBhaW1zIHRv IHByb3ZpZGUgZ29vZCBVWCB2aWEgaW50ZWdyYXRpb24gd2l0aCBjb21tb24gdGV4dCBlZGl0b3Jz IGFuZCBQREYgdmlld2Vycywgc28geW91IGNhbiBqdW1wIGRpcmVjdGx5IHRvIGEgc2VhcmNoIHJl c3VsdCB3aXRoIGEgc2luZ2xlIGtleSBwcmVzcy4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnNWUzYmQ2OCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzVlM2JkNjgiPkRlbW9zPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4 dC1vcmc1ZTNiZDY4Ij4NCjxwPk5hdmlnYXRpbmcgcmVwbzogPC9wPg0KPGRpdiBpZD0ib3JnYWJj ODU1NCIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9yYXcuZ2l0aHVidXNl cmNvbnRlbnQuY29tL2RhcnJlbmxkbC9kb2NmZC9tYWluL2RlbW8tdmhzLWdpZnMvcmVwby5naWYi IGFsdD0icmVwby5naWYiPg0KPC9wPg0KPC9kaXY+DQo8cD5OYXZpZ2F0aW5nICZxdW90O09DYW1s IFByb2dyYW1taW5nOiBDb3JyZWN0ICYjNDM7IEVmZmljaWVudCAmIzQzOyBCZWF1dGlmdWwmcXVv dDsgYm9vayBQREYgYW5kIG9wZW5pbmcgaXQgdG8gdGhlIGNsb3Nlc3QgbG9jYXRpb24gdG8gdGhl IHNlbGVjdGVkIHNlYXJjaCByZXN1bHQgdmlhIFBERiB2aWV3ZXIgaW50ZWdyYXRpb246DQo8L3A+ DQo8ZGl2IGlkPSJvcmdlYjdhYjg1IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRw czovL2dpdGh1Yi5jb20vZGFycmVubGRsL2RvY2ZkL2Jsb2IvbWFpbi9zY3JlZW5zaG90cy9wZGYt dmlld2VyLWludGVncmF0aW9uLmpwZz9yYXc9dHJ1ZSIgYWx0PSJwZGYtdmlld2VyLWludGVncmF0 aW9uLmpwZz9yYXc9dHJ1ZSI+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxYjViMWZmIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBp ZD0ib3JnMWI1YjFmZiI+TWFqb3IgY2hhbmdlcyBzaW5jZSBsYXN0IGFubm91bmNlbWVudDwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMWI1YjFmZiI+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+U2VhcmNoIGV4cHJlc3Npb24gaXMgYWRkZWQgKGFuZCBwcm9w ZXJseSBkb2N1bWVudGVkIG1vcmUgcmVjZW50bHkpLiBBIHNlYXJjaCBleHByZXNzaW9uIGlzIG9u ZSBvZjoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5TZWFyY2ggcGhyYXNlLCBlLmcuIDxjb2Rl PmZ1enp5IHNlYXJjaDwvY29kZT4gPC9saT48bGk+PGNvZGU+P2V4cHJlc3Npb248L2NvZGU+IChv cHRpb25hbCkgPC9saT48bGk+PGNvZGU+KGV4cHJlc3Npb24pPC9jb2RlPiA8L2xpPjxsaT48Y29k ZT5leHByZXNzaW9uIHwgZXhwcmVzc2lvbjwvY29kZT4gKG9yKSwgZS5nLiA8Y29kZT5nbyAoIGxl ZnQgfCByaWdodCApPC9jb2RlPg0KPC9saT48L3VsPg0KPC9saT48bGk+U2VhcmNoIHJlc3VsdHMg d2l0aCBiYWxhbmNlZCBvcGVuaW5nIGFuZCBjbG9zaW5nIHN5bWJvbHMgKDxjb2RlPigpPC9jb2Rl PiwgPGNvZGU+DQpbXTwvY29kZT4sIDxjb2RlPnt9PC9jb2RlPikgYXJlIHJhbmtlZCBoaWdoZXIg dG8gcmVkdWNlIHZpc3VhbCBub2lzZSB3aGVuIHNlYXJjaGluZzxicj4NCjxpbWcgc3JjPSJodHRw czovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmln aW5hbC8yWC82LzYzYjJjMzQ2ZjllZDY5OGE4MDdkYTMzYzhkOTRiODdkNmIxYTk0Y2UucG5nIiBh bHQ9IjYzYjJjMzQ2ZjllZDY5OGE4MDdkYTMzYzhkOTRiODdkNmIxYTk0Y2UucG5nIj4NCjwvbGk+ PGxpPkFkZGVkIGZpbGUgc2VsZWN0aW9uIHN1cHBvcnQgdmlhIDxjb2RlPmZ6ZjwvY29kZT4gPC9s aT48bGk+QWRkZWQgc3VwcG9ydCBmb3IgPGNvZGU+amVkfi9+eGplZDwvY29kZT4gPC9saT48bGk+ UmVzdG9yZWQgYmVoYXZpb3VyIG9mIHNraXBwaW5nIGZpbGUgZXh0ZW5zaW9uIGNoZWNrcyBmb3Ig dG9wLWxldmVsIHVzZXIgc3BlY2lmaWVkIGZpbGVzLiBUaGlzIGJlaGF2aW91ciB3YXMgbGlrZWx5 IHJlbW92ZWQgZHVyaW5nIHNvbWUgcHJldmlvdXMgb3ZlcmhhdWwuDQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTci IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5SZTogUHB4bGliIGRldiBtZWV0aW5nczwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5n cy8xMjQ0MS8xNiI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweGxpYi1kZXYtbWVldGlu Z3MvMTI0NDEvMTY8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzg1NWUxYzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4NTVlMWMyIj5Tb25q YSBIZWluemUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmc4NTVlMWMyIj4NCjxwPlRoYW5rcyBldmVyeW9uZSB3aG8gaGFzIHBhcnRpY2lwYXRl ZCBpbiB0aGUgcG9sbCEgOmhlYXJ0OiBJdCBzZWVtcyBsaWtlIGEgZmV3IHBlb3BsZSBkbyBhcHBy ZWNpYXRlIHRoZSBtb250aGx5IHBvc3RzLCBzbyBJL3dlJ2xsIGtlZXAgb24gZG9pbmcgdGhlbS4g SWYgYW55b25lIGhhcyBhbnkgY29tbWVudCwganVzdCBsZXQgdXMga25vdy4gSG93ZXZlciwgYWNj b3JkaW5nIHRvIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBwb2xsLCB0aGVyZSdzDQogYWxzbyBv bmUgcGVyc29uIHdobyBmaW5kcyB0aGlzIHRocmVhZCBhIGJpdCBzcGFtbXkgLSBhbmQgdGhlcmUg bWlnaHQgYmUgbW9yZS4gSSdsbCBsZWF2ZSB0aGUgcG9sbCBvcGVuIGZvciBhcyBsb25nIGFzIGRp c2N1c3MgYWxsb3dzIG1lLCBzbyB0aGF0IEkgY2FuIHNlZSBpZiB0aGF0IG51bWJlciBpbmNyZWFz ZXMgaW4gdGhlIGZ1dHVyZS4gSW4gdGhlIG1lYW50aW1lOiBJJ20gc29ycnkgZm9yIHRoZSBpbmNv bnZlbmllbmNlIGZvciB0aGUgdmVyeQ0KIGZldyB3aG8gZmluZCB0aGUgcG9zdHMgc3BhbW15ISA8 L3A+DQo8cD5UaGlzIG1vbnRoLCB3ZSdyZSBoYXZpbmcgdGhlIG1lZXRpbmcgb24gTW9uZGF5IGlu c3RlYWQgb2YgVHVlc2RheSwgc2FtZSB0aW1lIGFzIGFsd2F5czogW2RhdGU9MjAyNC0wMi0xOSB0 aW1lPTE4OjAwOjAwIHRpbWV6b25lPSZxdW90O0V1cm9wZS9NYWRyaWQmcXVvdDtdIC4gVGhhdCdz IGFsc28gcmVmbGVjdGVkIGluIHRoZSBwdWJsaWMgY2FsZW5kYXIgZXZlbnQuIEhlcmUncyBvdXIg YWdlbmRhLiBSZW1lbWJlciB0aGF0IGV2ZXJ5b25lIGlzIHdlbGNvbWUgdG8NCiBhZGQgdGhpbmdz OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+NS4yIHN1cHBvcnQNCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT5MZXQncyBkaXNjdXNzIHRoZSBjb21wbGljYXRlZCBjb21waWxlciBBU1Qg Y2hhbmdlcyBmb3IgNS4yLCBhbW9uZyBvdGhlcnMsIGlmIHdlJ3JlIHRlc3RpbmcgdGhlaXIgc3Vw cG9ydCBlbm91Z2guDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+U3ludGFjdGljIHN1cHBvcnQg Zm9yIGZ1bmN0aW9ucyB3aXRoIGFyaXR5ICZndDsgMSA8L2xpPjxsaT5IYXZlIHRoZXJlIGJlZW4g bW9yZSBjb21wbGljYXRlZCBBU1QgY2hhbmdlcyB0aGlzIHRpbWU/IDwvbGk+PC91bD4NCjwvbGk+ PGxpPlRoZSBjb21waWxlciA8Y29kZT5vY2FtbC5wcHguY29udGV4dDwvY29kZT4gY2hhbmdlDQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhpcyBhZmZlY3RzIHRoZSBQUFggd29ybGQgaWZmIHBl b3BsZSB3YW50IHRvIGJ1aWxkIHRoZWlyIHByb2plY3Qgd2l0aCBhIGRpZmZlcmVudCBPQ2FtbCB2 ZXJzaW9uIHRoYW4gdGhlaXIgUFBYIGlzIGJ1aWx0IHdpdGguIERvIHdlIHdhbnQgdG8ga2VlcCBv biBzdXBwb3J0aW5nIHRoYXQgd29ya2Zsb3c/DQo8L2xpPjxsaT5XaHkgd2FzIHRoZSBjaGFuZ2Ug b2YgPGNvZGU+b2NhbWwucHB4LmNvbnRleHQ8L2NvZGU+IGluIHRoZSBjb21waWxlciBkb25lIGlu IGEgYnJlYWtpbmcgd2F5PyBJcyBpdCB3b3J0aCBmb3IgdXMgdG8gZGlzY3VzcyB0aGF0IHdpdGgg dGhlbT8NCjwvbGk+PC91bD4NCjwvbGk+PGxpPlRoZSBwcHhsaWIgPGNvZGU+fnByZXZpZXc8L2Nv ZGU+IHJlbGVhc2Ugd2l0aCA1LjIgc3VwcG9ydCA8L2xpPjwvdWw+DQo8L2xpPjxsaT5VcGNvbWlu ZyB0aGluZ3MgdG8gZG8gb24gPGNvZGU+cHB4bGliPC9jb2RlPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPldoZW4gdG8gc3RhcnQgd2l0aCB0aGUgd29yayB0byBidW1wIHBweGxpYidzIEFTVCB0 byA1LjI/IDwvbGk+PGxpPldoZW4gdG8gc3RhcnQgd2l0aCB0aGUgdXBzdHJlYW0gPGNvZGU+QXN0 bGliPC9jb2RlPiBlZmZvcnRzPyA8L2xpPjwvdWw+DQo8L2xpPjxsaT5JbiBjYXNlIHdlIGhhdmUg dGltZSwgbGV0J3MgYWxzbyBkaXNjdXNzIGhvdyB0byBpbXByb3ZlIHRoZSByZXBvIGZvciBwZW9w bGUgdG8gZ2V0IGludm9sdmVkIGVhc2llciAoaXNzdWUgbGFiZWxzLCBjb250cmlidXRpb24gZ3Vp ZGVsaW5lcyBldGMpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+T3ds IHByb2plY3QgY29uY2x1ZGluZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvb3dsLXByb2plY3QtY29uY2x1ZGluZy8xNDExNy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vd2wtcHJvamVjdC1jb25jbHVkaW5nLzE0MTE3LzE8L2E+IDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGU3ZWQwMSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzRlN2VkMDEiPnNvbGl0YXJ5X2Nyb3cgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0ZTdlZDAxIj4NCjxwPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vd2xiYXJuL293bCI+bW9yZSBhdCBvd2wgcHJvamVjdCBnaXRo dWIgcmVwbyA8L2E+PC9wPg0KPHA+T3dsIHByb2plY3QgaXMgY29uY2x1ZGluZyBhZnRlciA4IHll YXJzIG9mIGRldmVsb3BtZW50LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+T3Ro ZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt OSI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1NWNlYmE4IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNTVjZWJhOCI+RnJvbSB0aGUgb2NhbWwub3JnIGJsb2c8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzU1Y2ViYTgiPg0K PHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9yZyBibG9nPC9hPi4g PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vcHJpdmVyLmRl di9ibG9nL2RiY2FtbC9kYmNhbWwvIj5JbnRyb2R1Y2luZyBEQkNhbWwsIERhdGFiYXNlIHRvb2xr aXQgZm9yIE9DYW1sPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9wcml2ZXIuZGV2L2Js b2cvZGJjYW1sL2J1aWxkaW5nLWEtY29ubm5lY3Rpb24tcG9vbC8iPkJ1aWxkaW5nIGEgQ29ubm5l Y3Rpb24gUG9vbCBmb3IgREJDYW1sIG9uIHRvcCBvZiByaW90PC9hPg0KPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy1wbHVnaW5zL21ldGFjc2wuaHRtbCI+TWV0QWNzbCB2 MC42IGZvciBGcmFtYS1DIDI4LjAgTmlja2VsPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDItMTQtbXVsdGljb3JlLXRlc3RpbmctdG9vbHMtZHNj aGVjay1wdC0xIj5NdWx0aWNvcmUgVGVzdGluZyBUb29sczogRFNDaGVjayBQdCAxPC9hPg0KPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvc3BlZWRpbmct ZWMtc3RyaW5nLmh0bWwiPlNwZWVkaW5nIGVsbGlwdGljIGN1cnZlIGNyeXB0b2dyYXBoeTwvYT4N CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5vc2F1LnJlL2FydGljbGVzL2x3dF9wYXVz ZS5odG1sIj5Db29wZXJhdGlvbiBhbmQgTHd0LnBhdXNlPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMTFjYjUwNyIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzExY2I1MDciPk9sZCBDV048L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzExY2I1MDciPg0KPHA+SWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1p dHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJJ2xsIG1h aWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUg YXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2 ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBz Oi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4g PC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZ2FmOGQwMDkiPg0KPHA+PGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 13 Feb 2024 08:42:58 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 13 Feb 2024 08:42:58 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 13 Feb 2024 08:42:58 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41D8gxi8012349 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 13 Feb 2024 08:42:59 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 41D8glnZ012334 for ; Tue, 13 Feb 2024 08:42:48 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 Feb 2024 09:42:44 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id BA82DE0CE1; Tue, 13 Feb 2024 09:42:43 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6B5AAE00B7 for ; Tue, 13 Feb 2024 09:42:37 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Feb 2024 09:42:35 +0100 Received: from TM.local (unknown [89.207.171.77]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4AB685605CD; Tue, 13 Feb 2024 09:42:33 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaXlilHVk56LIBP0a5eazCIuKQIQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 13 Feb 2024 08:42:28 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 4cfc7254-7a2a-450d-ea23-08dc2c6fc7be X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.06,156,1705359600"; d="scan'208,217";a="151623419" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.491044, queueID=1FAC55605CF x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMi0xMyBUdWUgMDk6MzkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDIuMDYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMi4yMC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDA2IHRvIDEzLCAyMDI0Lg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5TaGVybG9kb2MsIGEgc2VhcmNo IGVuZ2luZSBmb3IgT0NhbWwgZG9jdW1lbnRhdGlvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIi PmRyZWFtLWh0bWwgMy4wLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5PQ2FtbC5vcmcgTmV3 c2xldHRlcjogSmFudWFyeSAyMDI0PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+T0NhbWwgNS4y LjAsIGZpcnN0IGFscGhhIHJlbGVhc2U8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5SZWxlYXNl IG9mIHBweGxpYi4wLjMyLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5Mb29raW5nIGZvciBJ ZGVhcyBmb3IgdGhlIENvbW11bml0eSBQYWdlIGF0IE9DYW1sLm9yZzwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzciPlByb2ZpbGluZyBPQ2FtbCBwcm9ncmFtczwvYT4gPC9saT48bGk+PGEgaHJlZj0i IzgiPk1vbmFkaWMgcHJvZ3JhbW1pbmcgdHV0b3JpYWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5 Ij5UdXRvcmlhbCBvbiBHQURUczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEwIj5DYXF0aS9wcHhf cmFwZXIgdHV0b3JpYWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMSI+UmU6IGR1bmUgMy4xMzwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzEyIj5PdGhlciBPQ2FtbCBOZXdzPC9hPiA8L2xpPjxsaT48 YSBocmVmPSIjb3JnZWMwNzhmMCI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSIxIj5TaGVybG9kb2MsIGEgc2VhcmNoIGVuZ2luZSBmb3IgT0NhbWwgZG9jdW1lbnRhdGlv bjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNoZXJsb2RvYy1h LXNlYXJjaC1lbmdpbmUtZm9yLW9jYW1sLWRvY3VtZW50YXRpb24vMTQwMTEvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNoZXJsb2RvYy1hLXNlYXJjaC1lbmdpbmUtZm9yLW9j YW1sLWRvY3VtZW50YXRpb24vMTQwMTEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnN2IxZDViOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzdiMWQ1YjgiPkVtaWxlIFRyb3RpZ25vbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzdiMWQ1YjgiPg0KPHA+V2UgKEBhcnQtdywgQEVtaWxl VHJvdGlnbm9uKSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgZmlyc3QgcmVsZWFzZSBvZiBT aGVybG9kb2Mgb24gb3BhbSENCjwvcD4NCjxwPlNoZXJsb2RvYyBpcyBhIHNlYXJjaCBlbmdpbmUg Zm9yIE9DYW1sIGRvY3VtZW50YXRpb24sIHdoaWNoIHN1cHBvcnRzIHNlYXJjaCBieSBuYW1lLCBk b2N1bWVudGF0aW9uIGFuZCBmdXp6eSB0eXBlIHNlYXJjaCAoc2ltaWxhciB0byBIb29nbGUgaW4g dGhlIEhhc2tlbGwgd29ybGQpLiBZb3UgY2FuIHRyeSBpdCBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9k b2Muc2hlcmxvY29kZS5jb20iPmRvYy5zaGVybG9jb2RlLmNvbTwvYT4gb24gdGhlIGxpYnJhcmll cyBwdWJsaXNoZWQgaW4gdGhlIG9wYW0gcmVwb3NpdG9yeSwgdGhhbmtzIHRvIGFsbCB0aGUgZG9j dW1lbnRhdGlvbiBhdmFpbGFibGUgb24NCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnIj5PQ2Ft bC5vcmc8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIG1haW4gZm9jdXMg b2YgdGhpcyByZWxlYXNlIGlzIHRoZSBpbnRlZ3JhdGlvbiB3aXRoIE9kb2MgKGFuZCA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzk3NzIiPg0Kc3VwcG9ydCBmb3Ig PGNvZGU+ZHVuZSBidWlsZCBAZG9jPC9jb2RlPiBpcyBpbiBwcm9ncmVzczwvYT4pLiBUaGUgbGF0 ZXN0IHJlbGVhc2Ugb2YNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t cmVsZWFzZS1vZi1vZG9jLTItNC0wLzEzNjc2Ij5PZG9jIDIuNC4wIGludHJvZHVjZXMgYSBzZWFy Y2ggYmFyPC9hPiBpbiBpdHMgc3RhdGljIGh0bWwgZG9jdW1lbnRhdGlvbiwgd2hpY2ggZW5hYmxl cyBhIGphdmFzY3JpcHQgc2VhcmNoIGVuZ2luZSB0byBydW4gY2xpZW50LXNpZGUgKHdpdGhvdXQg YSBzZXJ2ZXIpLiBTaW5jZSBTaGVybG9kb2MgaXMgZnVsbHkgaW1wbGVtZW50ZWQNCiBpbiBPQ2Ft bCwgaXQgd2FzIHN0cmFpZ2h0Zm9yd2FyZCB0byBjb21waWxlIGl0IHRvIGphdmFzY3JpcHQgdXNp bmcgPGNvZGU+anNfb2Zfb2NhbWw8L2NvZGU+LiBTZWUgZm9yIGV4YW1wbGUgdGhlDQo8YSBocmVm PSJodHRwczovL2FydC13LmdpdGh1Yi5pby9zaGVybG9kb2MvY21kbGluZXIvQ21kbGluZXIvaW5k ZXguaHRtbCI+PGNvZGU+Q21kbGluZXI8L2NvZGU+IHBhY2thZ2UgZG9jdW1lbnRhdGlvbiB3aXRo IHNlYXJjaDwvYT4gaG9zdGVkIG9uIGdpdGh1YiBzdGF0aWMgcGFnZXMuDQo8L2xpPjxsaT5TaGVy bG9kb2Mgbm93IHVzZXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mv b2RvY19zZWFyY2gvT2RvY19zZWFyY2gvaW5kZXguaHRtbCI+DQo8Y29kZT5vZG9jLnNlYXJjaDwv Y29kZT48L2E+IGxpYnJhcnkgYW5kIGlzIGhlbmNlIGFibGUgdG8gc2VhcmNoIGZvciBtb2R1bGVz LCB0eXBlcywgY29uc3RydWN0b3JzLCByZWNvcmQgZmllbGRzLCBldGMgYXMgd2VsbCBhcyBpbnNp ZGUgZG9jdW1lbnRhdGlvbiBjb21tZW50cy4gKFByb3RpcCBmb3IgbGlicmFyeSBhdXRob3JzOiBT aGVybG9kb2MgaGVhdmlseSBmYXZvcnMgZG9jdW1lbnRlZCBmdW5jdGlvbnMgOykgKQ0KPC9saT48 bGk+VGhlcmUgaXMgYWxzbyBhIG5ldyBjb21tYW5kLWxpbmUgaW50ZXJmYWNlIHRoYXQgeW91IGNv dWxkIHVzZSB0byBsb2NhbGx5IHNlYXJjaCBwYWNrYWdlcyBpbnN0YWxsZWQgaW4geW91ciBzd2l0 Y2gsIGFsdGhvdWdoIHRoZSBDTEkgd2FzIGRldmVsb3BlZCBmb3IgZGVidWdnaW5nIGFuZCBjb3Vs ZCB1c2Ugc29tZSBsb3ZlIQ0KPC9saT48L3VsPg0KPHA+SW5zdHJ1Y3Rpb25zIGZvciB0cnlpbmcg b3V0IHRoaXMgbmV3IHZlcnNpb24gY2FuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vYXJ0LXcvc2hlcmxvZG9jIj4NCnJlYWRtZTwvYT4sIGJ1dCBpdCBjYW4gYmUg YXMgc2ltcGxlIGFzOiA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNjkyMDZmOSI+ DQokIG9wYW0gaW5zdGFsbCBzaGVybG9kb2Mgb2RpZw0KJCBvZGlnIG9kb2MNCiQgZXhwb3J0IFNI RVJMT0RPQ19EQj0vdG1wL3NoZXJsb2RvYy5tYXJzaGFsDQokIHNoZXJsb2RvYyBpbmRleCAkKGZp bmQgJE9QQU1fU1dJVENIX1BSRUZJWC92YXIvY2FjaGUvb2RpZy9vZG9jIC1uYW1lICcqLm9kb2Ns JyAgfCBncmVwIC12ICZxdW90O19fJnF1b3Q7KQ0KJCBzaGVybG9kb2Mgc2VhcmNoICZxdW90O2xp c3QgbWFwJnF1b3Q7DQo8L3ByZT4NCjxwPldlIGhvcGUgeW91IGVuam95IGl0IHRvIGZpbmQgeW91 ciB3YXkgaW4gdGhlIGV2ZXItZ3Jvd2luZyBPQ2FtbCBlY29zeXN0ZW0hICZsdDszIDwvcD4NCjxw PjxpPlRoaXMgaXMgYW4gZWFybHkgcmVsZWFzZTogaWYgeW91IGJlbGlldmUgdGhhdCBoYXZpbmcg YSBncmVhdCBzZWFyY2ggZW5naW5lIGlzIGltcG9ydGFudCwgcGxlYXNlIGhlbHAgdXMgYnkgcmVw b3J0aW5nIGFueSBpc3N1ZSB5b3UgZW5jb3VudGVyLCBxdWVyaWVzIHdpdGggdW5leHBlY3RlZCBy ZXN1bHRzLCBvciBieSBjb250cmlidXRpbmcgbmV3IFBScyEgKHRvIGUuZy4gaW1wcm92ZSB0aGUg Q0xJLCB0aGUgd2Vic2l0ZSBvciBldmVuIHRoZQ0KIGFsZ29yaXRobXMgaWYgeW91IGV2ZXIgd2Fu dGVkIHRvIGxlYXJuIGhvdyBhIHNlYXJjaCBlbmdpbmUgd29ya3MhKTwvaT4gPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPmRyZWFtLWh0bWwgMy4wLjA8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLTMtMC0wLzE0MDEzLzEiPmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0zLTAtMC8xNDAxMy8xPC9hPg0K PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmMTM5NjliIiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZjEzOTY5YiI+WWF3YXIgQW1pbiBhbm5vdW5jZWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2YxMzk2OWIiPg0K PHA+SGksIGRyZWFtLWh0bWwgMy4wLjAgaGFzIGJlZW4gcmVsZWFzZWQgdG8gb3BhbTogPGEgaHJl Zj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9kcmVhbS1odG1sLzMuMC4wIj4NCmh0dHBzOi8vb2NhbWwu b3JnL3AvZHJlYW0taHRtbC8zLjAuMDwvYT4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PlJlcG86IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS95YXdhcmFtaW4vZHJlYW0taHRtbCI+ aHR0cHM6Ly9naXRodWIuY29tL3lhd2FyYW1pbi9kcmVhbS1odG1sPC9hPg0KPC9saT48bGk+QVBJ IGRvY3M6IDxhIGhyZWY9Imh0dHBzOi8veWF3YXJhbWluLmdpdGh1Yi5pby9kcmVhbS1odG1sL2Ry ZWFtLWh0bWwvRHJlYW1faHRtbC9pbmRleC5odG1sIj4NCmh0dHBzOi8veWF3YXJhbWluLmdpdGh1 Yi5pby9kcmVhbS1odG1sL2RyZWFtLWh0bWwvRHJlYW1faHRtbC9pbmRleC5odG1sPC9hPiA8L2xp PjwvdWw+DQo8cD5EcmVhbS1odG1sIGlzIGEgbGlicmFyeSBmb3IgZ2VuZXJhdGluZyBIVE1MLCBj bG9zZWx5IGludGVncmF0ZWQgd2l0aCBEcmVhbS4gSXQgY2FuIGJlIHVzZWQgYXMgYW4gYWx0ZXJu YXRpdmUgdG8gRHJlYW3igJlzIGJ1aWx0LWluIEVtYmVkZGVkIE1MIHRlbXBsYXRpbmcgbGFuZ3Vh Z2UgYW5kIGNvbWVzIHdpdGggYWxsIGN1cnJlbnQgaHRteCBhdHRyaWJ1dGVzIGRlZmluZWQgb3V0 IG9mIHRoZSBib3guDQo8L3A+DQo8cD5JbiB0aGlzIHJlbGVhc2UsIEkgbWFkZSBhIGJyZWFraW5n IGNoYW5nZSAoaGVuY2UgbWFqb3IgdmVyc2lvbiBidW1wKSB0byByZXN0cmljdCB0aGUNCjxjb2Rl PnJvbGU8L2NvZGU+IGF0dHJpYnV0ZSB0byBvbmx5IHRoZSBhY2NlcHRhYmxlIHZhbHVlcyBmb3Ig QVJJQSByb2xlcy4gUHJldmlvdXNseSBpdCB3YXMgYWNjZXB0aW5nIGFueSBmb3JtYXQgc3RyaW5n Lg0KPC9wPg0KPHA+UGx1cyBhIG1ham9yIG5ldyBmZWF0dXJlOiBhbGwgdGhlIEFSSUEgYXR0cmli dXRlcyB3aXRoIHRoZSB0eXBlcyBvZiB0aGVpciB2YWx1ZXMgbmFycm93ZWQgYXMgbXVjaCBhcyBw b3NzaWJsZS4gRWc6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJl IGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+b3BlbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ RHJlYW1faHRtbDwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5IVE1M PC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij50b2FzdDwvc3Bhbj4g Pyg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5pZHZhbDwvc3Bhbj49PHNwYW4gc3R5bGU9 ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7dG9hc3QmcXVvdDs8L3NwYW4+KSA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5tc2c8L3NwYW4+ID0NCnAgW2lkIDxzcGFuIHN0eWxlPSJjb2xvcjog I2NhMzQwMDsiPiZxdW90OyVzJnF1b3Q7PC9zcGFuPiBpZHZhbDsgPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+QXJpYS48L3NwYW4+bGl2ZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7 IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5gcG9saXRlPC9zcGFuPl0gW3R4dCA8c3BhbiBz dHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDslcyZxdW90Ozwvc3Bhbj4gbXNnXQ0KPC9wcmU+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5PQ2FtbC5vcmcgTmV3c2xldHRl cjogSmFudWFyeSAyMDI0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9v Y2FtbC1vcmctbmV3c2xldHRlci1qYW51YXJ5LTIwMjQvMTQwMTQvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItamFudWFyeS0yMDI0LzE0MDE0LzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMGNkODdlYSIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzBjZDg3ZWEiPlNhYmluZSBTY2htYWx0eiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzBj ZDg3ZWEiPg0KPHA+V2VsY29tZSB0byB0aGUgSmFudWFyeSAyMDI0IGVkaXRpb24gb2YgdGhlIE9D YW1sLm9yZyBuZXdzbGV0dGVyISBUaGlzIHVwZGF0ZSBoYXMgYmVlbiBjb21waWxlZCBieSB0aGUg T0NhbWwub3JnIHRlYW0uIFlvdSBjYW4gZmluZA0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90YWcvb2NhbWxvcmctbmV3c2xldHRlciI+cHJldmlvdXMgdXBkYXRlczwvYT4gb24g RGlzY3Vzcy4NCjwvcD4NCjxwPk91ciBnb2FsIGlzIHRvIG1ha2UgT0NhbWwub3JnIHRoZSBiZXN0 IHJlc291cmNlIGZvciBhbnlvbmUgd2hvIHdhbnRzIHRvIGdldCBzdGFydGVkIGFuZCBiZSBwcm9k dWN0aXZlIGluIE9DYW1sLiBUaGUgT0NhbWwub3JnIG5ld3NsZXR0ZXIgcHJvdmlkZXMgYW4gdXBk YXRlIG9uIG91ciBwcm9ncmVzcyB0b3dhcmRzIHRoYXQgZ29hbCBhbmQgYW4gb3ZlcnZpZXcgb2Yg dGhlIGNoYW5nZXMgd2UgYXJlIHdvcmtpbmcgb24uDQo8L3A+DQo8cD5XZSBjb3VsZG7igJl0IGRv IGl0IHdpdGhvdXQgYWxsIHRoZSBhbWF6aW5nIE9DYW1sIGNvbW11bml0eSBtZW1iZXJzIHdobyBo ZWxwIHVzIHJldmlldywgcmV2aXNlLCBhbmQgY3JlYXRlIGJldHRlciBPQ2FtbCBkb2N1bWVudGF0 aW9uLiBZb3VyIGZlZWRiYWNrIGVuYWJsZXMgdXMgdG8gYmV0dGVyIHByaW9yaXRpc2Ugb3VyIHdv cmsuIFRoYW5rIHlvdSENCjwvcD4NCjxwPlRoaXMgbmV3c2xldHRlciBjb3ZlcnM6IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5PQ2FtbCBEb2N1bWVudGF0aW9uOjwvYj4gTmV3IGRv Y3VtZW50YXRpb24gaGFzIGJlZW4gcmVsZWFzZWQsIGFuZCBleGlzdGluZyBkb2N1bWVudGF0aW9u IGhhcyBiZWVuIGltcHJvdmVkLg0KPC9saT48bGk+PGI+RGFyayBNb2RlOjwvYj4gVGhlcmXigJlz IGJlZW4gZ29vZCBwcm9ncmVzcyBvbiBpbXBsZW1lbnRpbmcgdGhlIHVwY29taW5nIGRhcmsgbW9k ZS4NCjwvbGk+PGxpPjxiPkdlbmVyYWwgSW1wcm92ZW1lbnRzOjwvYj4gQXMgdXN1YWwsIHdlIGFs c28gd29ya2VkIG9uIGdlbmVyYWwgbWFpbnRlbmFuY2UgYW5kIGltcHJvdmVtZW50cyBiYXNlZCBv biB1c2VyIGZlZWRiYWNrLCBzbyB3ZeKAmXJlIGhpZ2hsaWdodGluZyBzb21lIG9mIG91ciB3b3Jr IGJlbG93Lg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmcxY2RjZTc4IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMWNkY2U3OCI+T3BlbiBJ c3N1ZXMgZm9yIENvbnRyaWJ1dG9yczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnMWNkY2U3OCI+DQo8cD5XZSBjcmVhdGVkIG1hbnkgaXNzdWVzIGZvciBleHRl cm5hbCBjb250cmlidXRvcnMuIFRoZSBtYWpvcml0eSBvZiB0aGVtIGFyZSBzdWl0YWJsZSBmb3Ig T0NhbWwgYmVnaW5uZXJzLCBhbmQgd2XigJlyZSBoYXBweSB0byByZXZpZXcgYW5kIHByb3ZpZGUg ZmVlZGJhY2sgb24geW91ciBwdWxsIHJlcXVlc3RzIQ0KPC9wPg0KPHA+WW91IGNhbiBmaW5kIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzP3E9aXMlM0Fp c3N1ZSYjNDM7aXMlM0FvcGVuJiM0MztsYWJlbCUzQSUyMmhlbHAmIzQzO3dhbnRlZCUyMiYjNDM7 bm8lM0Fhc3NpZ25lZSI+DQpvcGVuIGlzc3VlcyBmb3IgY29udHJpYnV0b3JzIGhlcmU8L2E+ISA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGM4NjA4 YiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzRjODYwOGIiPk9DYW1sIERvY3VtZW50 YXRpb248L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzRjODYw OGIiPg0KPHA+V2UgcmVsZWFzZWQgbXVsdGlwbGUgbmV3IGRvY3VtZW50cywgbW9zdCBub3RhYmx5 IG9uIE1vZHVsZXMsIEZ1bmN0b3JzLCBMaWJyYXJpZXMgd2l0aCBEdW5lLCBhcyB3ZWxsIGFzIGEg bmV3IHR1dG9yaWFsIG9uIHVzaW5nIHRoZSBPQ2FtbC5vcmcgUGxheWdyb3VuZC4gVGhlIGRvY3Vt ZW50YXRpb24gb24gTGFiZWxsZWQgQXJndW1lbnRzLCBTZXRzLCBhbmQgT3B0aW9ucyBoYXMgYmVl biBpbXByb3ZlZC4NCjwvcD4NCjxwPlRvIGJldHRlciB1bmRlcnN0YW5kIGhvdyBlZmZlY3RpdmUg dGhlIG5ldyBkb2N1bWVudGF0aW9uIGlzLCB3ZSBhcmUgcnVubmluZyB1c2VyIHRlc3RzIChhbm5v dW5jZWQNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9yZXF1ZXN0LWZvci1m ZWVkYmFjay10YWtlLXRoZS1vY2FtbC1vcmctbGVhcm4tYXJlYS11c2VyLXNhdGlzZmFjdGlvbi1z dXJ2ZXkvMTM5MjgiPg0Kb24gRGlzY3VzczwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8veC5jb20v c2FiaW5lL3N0YXR1cy8xNzUyMjcyMTczMzgzNzE3MTcxP3M9MjAiPg0Kb24gVHdpdHRlci9YPC9h PikgdG8gY29tcGFyZSB0aGUgb2xkIGRvY3VtZW50YXRpb24gY29udGVudCBvbiB2Mi5vY2FtbC5v cmcgd2l0aCB0aGUgbmV3IGRvY3VtZW50YXRpb24gb24gb2NhbWwub3JnLiBBIHN1ZmZpY2llbnQg bnVtYmVyIG9mIG5ld2NvbWVycyB0byBPQ2FtbCB2b2x1bnRlZXJlZCB0byBoZWxwIHVzIHdpdGgg dGhpcy4gVGhhbmtzIHNvIG11Y2ghDQo8L3A+DQo8cD5JbiBhZGRpdGlvbiwgdGhlcmUgaXMgYW4g b3BlbiBzdXJ2ZXkgdGhhdCBhc2tzIHlvdSB0byByYXRlIHRoZSBuZXcgZG9jdW1lbnRhdGlvbiBp biByZWxhdGlvbiB0byB0aGUgb2xkIGNvbnRlbnQ6IFdlIHdvdWxkIGxvdmUgdG8gaGF2ZSB5b3Vy IGlucHV0IG9uDQo8YSBocmVmPSJodHRwczovL2Zvcm1zLmdsZS9iMkJTNU5FaUZhVVZTY0pUQSI+ dGhpcyBzdXJ2ZXk8L2E+LCBldmVuIGlmIHlvdSBvbmx5IGRyb3AgdXMgc29tZSBudW1lcmljIHJh dGluZ3MhDQo8L3A+DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+SW4gUHJvZ3Jlc3M6PC9iPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPk1hcHMgPC9saT48bGk+SGlnaGVyIE9yZGVyIEZ1bmN0aW9ucyA8L2xp PjwvdWw+DQo8L2xpPjxsaT48Yj5JbiBSZXZpZXcgKGludGVybmFsKTo8L2I+IDwvbGk+PGxpPjxi PkluIFJldmlldyAoY29tbXVuaXR5KTo8L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MDAiPkZpbGUg TWFuaXB1bGF0aW9uPC9hPiAoc2VlDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvaGVscC1yZXZpZXctdGhlLW5ldy1maWxlLW1hbmlwdWxhdGlvbi10dXRvcmlhbC1vbi1vY2Ft bC1vcmcvMTI2MzgiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUzMSI+UG9seW1vcnBoaWMgVmFy aWFudHM8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXct ZHJhZnQtdHV0b3JpYWwtb24tcG9seW1vcnBoaWMtdmFyaWFudHMvMTM0ODUiPg0KRGlzY3VzcyBU aHJlYWQ8L2E+KSA8L2xpPjwvdWw+DQo8L2xpPjxsaT48Yj5QdWJsaXNoZWQ6PC9iPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC85NDgiPlNldHM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODAwIj5PcHRpb25zPC9hPiA8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc3OCI+TW9kdWxl cywgRnVuY3RvcnMsIExpYnJhcmllcyBXaXRoIER1bmU8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kcmFmdC10dXRvcmlhbHMtb24tbW9kdWxlcy1mdW5jdG9y cy1hbmQtbGlicmFyaWVzLyI+DQpEaXNjdXNzPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4ODEiPkxhYmVsbGVkIEFyZ3VtZW50 czwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xODgwIj5UaGUgT0NhbWwgUGxheWdyb3VuZDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9UaGUtQW1vZ2hhdmFyc2hhIj5AVGhlLUFtb2doYXZhcnNoYTwvYT4gPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4 MjUiPlJ1bm5pbmcgQ29tbWFuZHMgaW4gYW4gb3BhbSBTd2l0Y2g8L2E+DQo8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUyOSI+TXV0YWJs ZSBTdGF0ZSAvIEltcGVyYXRpdmUgUHJvZ3JhbW1pbmc8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kcmFmdC10dXRvcmlhbC1vbi1tdXRhYmlsaXR5LWxvb3Bz LWFuZC1pbXBlcmF0aXZlLXByb2dyYW1taW5nLzEzNTA0Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikg PC9saT48bGk+QW5ub3VuY2VtZW50IG9uIERpc2N1c3M6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9uZXctdHV0b3JpYWxzLW9uLWJhc2ljcy1vZi1vY2FtbC8xMzM5NiI+DQpO ZXcgVHV0b3JpYWxzIG9uIEJhc2ljcyBvZiBPQ2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1MTQiPkJhc2ljIERhdGEgVHlw ZXM8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1v cmctdHV0b3JpYWwtcmV2YW1waW5nLWNvbnRkLWJhc2ljLWRhdGF0eXBlcy8xMjk4NSI+DQpEaXNj dXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8xNTEyIj5GdW5jdGlvbnMgYW5kIFZhbHVlczwvYT4gKHNlZQ0KPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy10dXRvcmlhbC1yZXZh bXBpbmctY29uZC12YWx1ZXMtYW5kLWZ1bmN0aW9ucy8xMzAwNSI+DQpEaXNjdXNzIFRocmVhZDwv YT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvaW5zdGFsbGluZy1v Y2FtbCI+SW5zdGFsbGluZyBPQ2FtbDwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvaGVscC1yZXZhbXBpbmctdGhlLWdldHRpbmctc3RhcnRlZC10dXRvcmlhbHMt aW4tb2NhbWwtb3JnLzEyNzQ5Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy90b3VyLW9mLW9jYW1sIj5BIFRvdXIgT2YgT0NhbWw8 L2E+IChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hlbHAtcmV2YW1w aW5nLXRoZS1nZXR0aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWluLW9jYW1sLW9yZy8xMjc0OSI+DQpE aXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Rv Y3MveW91ci1maXJzdC1wcm9ncmFtIj5Zb3VyIEZpcnN0IE9DYW1sIFByb2dyYW08L2E+IChzZWUN CjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxwLXJldmFtcGluZy10aGUt Z2V0dGluZy1zdGFydGVkLXR1dG9yaWFscy1pbi1vY2FtbC1vcmcvMTI3NDkiPg0KRGlzY3VzcyBU aHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL29wYW0t c3dpdGNoLWludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uIHRvIG9wYW0gU3dpdGNoZXM8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL2FybTY0LWZpeCI+Rml4IEhv bWVicmV3IEVycm9ycyBvbiBBcHBsZSBNMTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v b2NhbWwub3JnL2RvY3Mvb3BlcmF0b3JzIj5PcGVyYXRvcnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvZXJyb3ItaGFuZGxpbmciPkVycm9yIEhhbmRsaW5nPC9h PiAoc2VlIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LWdldC1z dGFydGVkLWRvY3VtZW50YXRpb24tb24tb2NhbWwtb3JnLzEzMjY5Ij4NCkRpc2N1c3MgVGhyZWFk PC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9hcnJheXMiPkFy cmF5czwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmVlZGJh Y2stbmVlZGVkLW5ldy1hcnJheXMtdHV0b3JpYWwtb24tb2NhbWwtb3JnLzEyNjgzIj4NCkRpc2N1 c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9z ZXF1ZW5jZXMiPlNlcXVlbmNlczwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvY3JlYXRpbmctYS10dXRvcmlhbC1vbi1zZXF1ZW5jZXMvMTIwOTEiPg0KRGlzY3Vz cyBUaHJlYWQ8L2E+KSA8L2xpPjwvdWw+DQo8L2xpPjxsaT48Yj5PdGhlciBBY3Rpdml0eTwvYj46 DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzE4OTIiPkZpeCBjb2RlIGV4YW1wbGUgaW4gVmFsdWVzICZhbXA7 IEZ1bmN0aW9ucyB0dXRvcmlhbDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9j dWlodGxhdWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4ODYiPkltcHJvdmUg4oCZTWFuYWdpbmcgRGVw ZW5kZW5jaWVzIHdpdGggb3BhbeKAmTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9zYWJpbmUiPkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODgzIj4oZG9jKSBNZW50aW9uIDxjb2RlPmR1bmUtcmVs ZWFzZTwvY29kZT4gb3BhbSBwYWNrYWdlIGluIOKAnFB1Ymxpc2hpbmcgYSBQYWNrYWdl4oCdPC9h PiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4gPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4 ODIiPkFkZCBob3cgdG8gZ2VuZXJhdGUgPGNvZGU+DQpvZG9jPC9jb2RlPiA8Y29kZT4ubWxkPC9j b2RlPiBkb2N1bWVudGF0aW9uIHBhZ2VzIHdpdGggRHVuZSB0byB0aGUg4oCcR2VuZXJhdGluZyBE b2N1bWVudGF0aW9uIFdpdGgNCjxjb2RlPm9kb2M8L2NvZGU+4oCdPC9hPiBieSA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vc2FiaW5lIj5Ac2FiaW5lPC9hPiA8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkwNSI+UHJlcGVuZCA8Y29k ZT5vcGFtIGV4ZWMgLS08L2NvZGU+IG9uIGFsbA0KPGNvZGU+ZHVuZTwvY29kZT4gY29tbWFuZHM8 L2E+IGJ5IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUiPkBzYWJpbmU8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTkwOSI+TWVudGlvbiByZWNvcmQgdXBkYXRlIHN5bnRheDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9zcmozMSI+QHNyajMxPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkxNCI+Rml4IEdldHRpbmcgU3RhcnRl ZCBkb2N1bWVudGF0aW9uPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FraW5k b2Z5b2dhIj5AYWtpbmRvZnlvZ2E8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTIwIj5GaXggd29yZGluZyBvbiBHZXR0aW5nIFN0 YXJ0ZWQgcGFnZTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ha2luZG9meW9n YSI+QGFraW5kb2Z5b2dhPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTkyNCI+Rml4IHR5cG9zIGluIFlvdXIgRmlyc3QgT0NhbWwg UHJvZ3JhbSB0dXRvcmlhbDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlo dGxhdWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5MjYiPihkb2MpIEZpeCBzbWFsbCB0eXBvIG9uIEdl dHRpbmcgU3RhcnRlZCBwYWdlPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Fr aW5kb2Z5b2dhIj5AYWtpbmRvZnlvZ2E8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTI1Ij5SZW1vdmUgbGlua3MgdG8gVjIgaW4g ZG9jczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlodGxhdWFjIj5AY3Vp aHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzE5NDEiPihkb2MpIFNvbWUgbWlzYyBtaW5vciBkb2Mgbml0cw0KPC9hPmJ5 IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZWF0aGhlbmxleSI+QGhlYXRoaGVubGV5PC9h Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xOTQ4Ij5Db2RlIHRlc3QgZm9yIFNldCBWMiBUdXRvcmlhbDwv YT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpbmVyb3NlIj5AY2hyaXN0 aW5lcm9zZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzE5NDAiPihkb2MpIFJlbW92ZSBGdW5jdGlvbmFsIFByb2dyYW1taW5nIGRv Y3VtZW50PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNhYmlu ZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzE5NTQiPihkb2MpIFJlbW92ZSBVbmZvbGQgYW4gT3B0aW9uIHNlY3Rpb248L2E+IGJ5 DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY3VpaHRsYXVhYyI+QGN1aWh0bGF1YWM8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xOTQ3Ij4oZG9jKSBNaW5vciBsaW5lIGVkaXRpbmcgZm9yIExhYmVsbGVkIEFyZ3VtZW50czwv YT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpc3RpbmVyb3NlIj5AY2hyaXN0 aW5lcm9zZTwvYT4gPC9saT48bGk+SXNzdWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9pc3N1ZXMvMTkxMSI+VXNlIOKAnHBhcmFtZXRlcuKAnSBhbmQg4oCcYXJn dW1lbnTigJ0gYXBwcm9wcmlhdGVseTwvYT4gaGFzIGJlZW4gcmVzb2x2ZWQgYnkgbXVsdGlwbGUg UFJzIGZyb20NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Qb29ybHlEZWZpbmVkQmVoYXZp b3VyIj5AUG9vcmx5RGVmaW5lZEJlaGF2aW91cjwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NTgiPkZpeCBs aW5rIGluIOKAmU90aGVyIGluc3RhbGxhdGlvbiBtZXRob2Rz4oCZIGNvbGxhcHNpYmxlPC9hPiBi eQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25vcnNrZWxkIj5Abm9yc2tlbGQ8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x OTYwIj4oZG9jKSBVcGRhdGVkIOKAnE9wZXJhdG9ycyzigJ0gYWRkaW5nIGEgbGluayB0byB0aGUg b3BlcmF0b3IgdGFibGUgaW4gdGhlIGxhbmd1YWdlIG1hbnVhbDwvYT4gYnkNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9jdWlodGxhdWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5MjMiPlVzZSBh IGZpbGVuYW1lIGRpZmZlcmVudCBmcm9tIHRoZSBsaWJyYXJ5IG5hbWUgaW4gWW91ciBGaXJzdCBP Q2FtbCBQcm9ncmFtPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1 YWMiPkBjdWlodGxhdWFjPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTk1MSI+TWVudGlvbiBsYWJlbGxlZCBwYXJhbWV0ZXJzIGlu IEEgVG91ciBvZiBPQ2FtbDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Qb29y bHlEZWZpbmVkQmVoYXZpb3VyIj5AUG9vcmx5RGVmaW5lZEJlaGF2aW91cjwvYT4gPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NTIiPk1l bnRpb24gbGFiZWxsZWQgcGFyYW1ldGVycyBpbiBWYWx1ZXMgYW5kIEZ1bmN0aW9uczwvYT4gYnkN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Qb29ybHlEZWZpbmVkQmVoYXZpb3VyIj5AUG9v cmx5RGVmaW5lZEJlaGF2aW91cjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NDIiPihkb2MpIGFkZCBtb3JlIGluZm8gYWJvdXQg bXVsdGlwbGUgZmlsZXM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaGVhdGho ZW5sZXkiPkBoZWF0aGhlbmxleTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NTciPkluY2x1ZGUgdGV4dCBvbiBpZi10aGVuLWVs c2UgYW5kIGJlZ2luLWVuZDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlo dGxhdWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5OTgiPkZpeCBhIHR5cG8gaW4gcHJvZ3JhbW1pbmcg Z3VpZGVsaW5lczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wcmVzZW50aGVl Ij5AcHJlc2VudGhlZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzE5OTYiPkZpeGluZyAjMTk3OSBMaW5rIG9uIHByaXZhY3kgcG9s aWN5IHBhZ2UgNDA0PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RoZS1BbW9n aGF2YXJzaGEiPkBUaGUtQW1vZ2hhdmFyc2hhPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjAwMiI+Rml4IHR5cG8gaW4gdGhlIHR1 dG9yaWFsIG9uIG9wdGlvbmFsIHBhcmFtczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9qdWxiaW5iIj5AanVsYmluYjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMDMiPih0eXBvKSBBZGQgbWlzc2luZyBzcGFj ZSBvbiBwYWNrYWdlcyBwYWdlPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nh YmluZSI+QHNhYmluZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzE5NDkiPkltcHJvdmUgZG9jdW1lbnRhdGlvbiBvbiBFZGl0b3Ig U3VwcG9ydDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9QaXppZUR1c3QiPkBQ aXppZUR1c3Q8L2E+IDwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjxwPldlIHN0YXJ0ZWQgb3Blbmlu ZyBpc3N1ZXMgbWFya2VkIHdpdGgg4oCcaGVscCB3YW50ZWTigJ0gdG8gZW5hYmxlIGV4dGVybmFs IGNvbnRyaWJ1dG9ycyB0byBoZWxwIGltcHJvdmUgdGhlIGRvY3MuIFRoZSByZXNwb25zZSBoYXMg YmVlbiBvdmVyd2hlbG1pbmdseSBwb3NpdGl2ZSwgYW5kIHdl4oCZcmUgdGhyaWxsZWQgdG8ga2Vl cCB0aGlzIHVwIGFuZCBtYWtlIHRoZSBPQ2FtbCBkb2N1bWVudGF0aW9uIHRydWx5IGdyZWF0IHdp dGggeW91ciBoZWxwIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2ViN2Q3MDIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdlYjdkNzAy Ij5VcGNvbWluZyBEYXJrIE1vZGU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlk PSJ0ZXh0LW9yZ2ViN2Q3MDIiPg0KPHA+SW4gRGVjZW1iZXIsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9veWVudWdhMTciPm95ZW51Z2ExNzwvYT4gc3RhcnRlZCB0byBpbXBsZW1lbnQgdGhl IG5ldyBkYXJrIG1vZGUgb24gT0NhbWwub3JnLiBQbGFucyBhcmUgdG8gY29tcGxldGUgYW5kIGFj dGl2YXRlIHRoZSBkYXJrIG1vZGUgYmFzZWQgb24gYnJvd3Nlci9vcGVyYXRpbmcgc3lzdGVtIHBy ZWZlcmVuY2VzIGJ5IGVhcmx5IE1hcmNoLiBJdCBsb29rcyBsaWtlIHdlIGFyZSBvbg0KIHRyYWNr IHRvIGFjaGlldmUgdGhpcy4gPC9wPg0KPHA+V2UgY29udGludW91c2x5IG1lcmdlIHNtYWxsIHBh dGNoZXMgaW50byBPQ2FtbC5vcmcsIGFuZCB5b3UgY2FuIHRha2UgYSBsb29rIGF0IGNvbXBsZXRl ZCBkYXJrIG1vZGUgcGFnZXMgb24NCjxhIGhyZWY9Imh0dHBzOi8vc3RhZ2luZy5vY2FtbC5vcmci Pmh0dHBzOi8vc3RhZ2luZy5vY2FtbC5vcmc8L2E+LiBXZSBwbGFjZWQgYSBidXR0b24gYXQgdGhl IGJvdHRvbSBvZiB0aGUgcGFnZSB0byB0b2dnbGUgdGhlIGRhcmsgbW9kZSBvbiBzdGFnaW5nLiAo VGhpcyBpcyBub3QgZ29pbmcgdG8gYmUgcmVsZWFzZWQuIEl0IGlzIG9ubHkgYSBtZWFucyBmb3Ig dXMgdG8gcmV2aWV3IHRoZSBkYXJrIG1vZGUgcGFnZXMuKQ0KPC9wPg0KPHA+PGI+Q29tcGxldGVk IFBhZ2VzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODk3Ij5MZWFybi9HZXQgU3RhcnRl ZCAmIzQzOyBMYW5ndWFnZSAmIzQzOyBHdWlkZXM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkwMiI+TGVhcm4vRXhjZXJjaXNl czwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9veWVudWdhMTciPkBveWVudWdh MTc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xOTAzIj5MZWFybi9Cb29rczwvYT4gYnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL295ZW51Z2ExNyI+DQpAb3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkxOSI+TGVhcm4vUGxhdGZvcm0gVG9v bHM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVn YTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMTk0NiI+UGFja2FnZXMgU2VhcmNoIFJlc3VsdHM8L2E+IGJ5DQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiA8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk3MyI+UGFja2Fn ZXMgJiM0MzsgQ29tbXVuaXR5PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL295 ZW51Z2ExNyI+QG95ZW51Z2ExNzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIwMDEiPkJsb2cgJiM0MzsgSm9icyAmIzQzOyBDaGFu Z2Vsb2c8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3ll bnVnYTE3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwub3JnL3B1bGwvMTgzNiI+TGVhcm4vT3ZlcnZpZXc8L2E+IGJ5IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9veWVudWdhMTciPg0KQG95ZW51Z2ExNzwvYT4gPC9saT48L3VsPg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2E2YjYyYmEiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhNmI2MmJhIj5HZW5lcmFsIEltcHJvdmVtZW50czwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTZiNjJiYSI+DQo8cD48 Yj5Nb3N0IE5vdGFibGUgQ2hhbmdlcyBUTERSPC9iPjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPldlIG1lcmdlZCBhIGJhc2ljIGRvY3VtZW50YXRpb24gc2VhcmNoIGZlYXR1cmUgdG8g ZW5hYmxlIHNlYXJjaCBpbnNpZGUgdGhlIE9DYW1sIGRvY3VtZW50YXRpb24uIEl0IGlzIGF2YWls YWJsZSBvbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MiPkxlYXJuIGFyZWEg 4oCcT3ZlcnZpZXfigJ0gcGFnZTwvYT4hIFRoZXJl4oCZcyByb29tIGZvciBpbXByb3ZlbWVudHMg aGVyZSwgdGhlIG1vc3Qgbm90YWJsZSBvZiB3aGljaCB3b3VsZCBiZSBhZGRpbmcgdHlwbyBjb3Jy ZWN0aW9uLCBhbmQgdW5pZnlpbmcgcGFja2FnZSBhbmQgZG9jdW1lbnRhdGlvbiBzZWFyY2ggaW4g dGhlIHRvcCBuYXZpZ2F0aW9uIGJhcuKAmXMgc2VhcmNoIGJveC4NCjwvbGk+PGxpPkEgbG9uZy1z dGFuZGluZyBidWcgd2hlcmUgd3JvbmcgbGlicmFyeSBuYW1lcyB3ZXJlIGRpc3BsYXllZCBpbiB0 aGUgcGFja2FnZSBkb2N1bWVudGF0aW9uIG1vZHVsZSB0cmVlIHZpZXcgaGFzIGJlZW4gZml4ZWQh DQo8L2xpPjxsaT5UaGUgcGFja2FnZSBvdmVydmlldyBwYWdlIG5vdyBsaW5rcyB0byBhIG5ldyBw YWdlIHRoYXQgbGlzdHMgYWxsIHBhY2thZ2UgdmVyc2lvbnMgd2l0aCB0aGVpciBwdWJsaWNhdGlv biBkYXRlcy4NCjwvbGk+PGxpPlRoZSBjaGFuZ2Vsb2cgaXMgbm93IHJlYWNoYWJsZSBmcm9tIHRo ZSBtYWluIGxhbmRpbmcgcGFnZS4gPC9saT48bGk+V2Ugbm93IGxpbmsgdGhlIHByZXJlcXVpc2l0 ZXMgb2YgdHV0b3JpYWxzIGFuZCByZWNvbW1lbmRlZCBuZXh0IHR1dG9yaWFscyBpbiB0aGUgWUFN TCBtZXRhZGF0YSBvZiB0aGUgdHV0b3JpYWzigJlzIE1hcmtkb3duIHBhZ2UuIFRoaXMgZW5zdXJl cyB0aGF0IHRoZXNlIGxpbmtzIGJldHdlZW4gdHV0b3JpYWxzIHdpbGwgc3RheSB2YWxpZC4NCjwv bGk+PC91bD4NCjxwPk1hbnkgdGhhbmtzIGdvIG91dCB0byB0aGUgbWFueSBjb250cmlidXRvcnMg d2hvIGhlbHBlZCBpbXByb3ZlIE9DYW1sLm9yZyBpbiBKYW51YXJ5LiBGaW5kIHRoZW0gbGlzdGVk IGJlbG93IQ0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0aWVzOjwvYj4gPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkdlbmVyYWw6DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4 NzEiPkRvY3VtZW50YXRpb24gU2VhcmNoIEZlYXR1cmU8L2E+IGJ5DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vU2F5U2F5byI+QFNheVNheW88L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vc2FiaW5lIj4NCkBzYWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTI4Ij4oZmVhdCkgYWRkIHJlY29tbWVu ZGVkX25leHRfdHV0b3JpYWxzIGNhcGFiaWxpdHk8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vZW5vb25hbiI+QGVub29uYW48L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTQzIj5BZGQgcHJlY29tcGlsZSBjaGVj ayBmb3IgUmVjb21tZW5kZWQgTmV4dCBUdXRvcmlhbHM8L2E+IGJ5DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vZW5vb25hbiI+QGVub29uYW48L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTY1Ij4oZmVhdCkgYWRkIHByZXJl cXVpc2l0ZV90dXRvcmlhbHMgY2FwYWJpbGl0eTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9Qb29ybHlEZWZpbmVkQmVoYXZpb3VyIj5AUG9vcmx5RGVmaW5lZEJlaGF2aW91cjwv YT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzE3OTkiPkFkZCBQYWNrYWdlIFZlcnNpb25zIFBhZ2U8L2E+IGJ5DQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vc2FiaW5lIj5Ac2FiaW5lPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTg3MCI+TWFrZSBjaGFuZ2Vsb2cg cmVhY2hhYmxlIGZyb20gdGhlIGxhbmRpbmcgcGFnZTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9GYXR1bWFBIj5ARmF0dW1hQTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5OTQiPkZpeGluZyAjMTk4OSBNaXNh bGlnbmVkIHNlbGVjdCBkcm9wIGRvd24gb24gam9icyBwYWdlPC9hPiBieQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL1RoZS1BbW9naGF2YXJzaGEiPkBUaGUtQW1vZ2hhdmFyc2hhPC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MjAwMCI+SW1wbGVtZW50IGFjdGl2ZSBzdGF0ZSBvbiBleGVyY2lzZSBzaWRlYmFyPC9hPiBieQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL295ZW51Z2ExNyI+QG95ZW51Z2ExNzwvYT4gPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIw MDkiPlVwZGF0ZSA8Y29kZT5VdGlscy5odW1hbl9kYXRlPC9jb2RlPiB0byB1c2UgdGhlIG5ld2Vy IFRpbWVkZXNjIEFQSTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXJyZW5s ZGwiPkBkYXJyZW5sZGw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xOTIyIj5GaXggbGFuZ3VhZ2UgbWFudWFsIGJhbm5lciBIVE1M PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4g PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE5MzkiPkluIGNhc2UgPGNvZGU+ZG9jcy1kYXRhLm9jYW1sLm9yZzwvY29kZT4gaXMgdW5yZWFj aGFibGUsIGZhaWwgbW9yZSBncmFjZWZ1bGx5PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NTYiPihidWcpIEZpeCBTdHJpbmcuc3ViIGV4 Y2VwdGlvbiBpZiBjaGFuZ2Vsb2cgbGVuZ3RoICZsdDsgMTAwPC9hPiBieQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5MzciPkdpdGlnbm9yZSAqOk9F Q3VzdG9tUHJvcGVydHk8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FiaW5l Ij5Ac2FiaW5lPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMTk4MiI+UmVtb3ZlIFRoZSBPQ2FtbCBTeXN0ZW0gZnJvbSBob21lPC9h PiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWMiPkBjdWlodGxhdWFj PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTk2NyI+U2ltcGxpZnkgdHlwaW5nIG9mIHJlY29tbWVuZGVkIG5leHQgdHV0b3JpYWxz PC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWMiPkBjdWlodGxh dWFjPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5QYWNrYWdlIGRvY3VtZW50YXRpb246DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50 L29jYW1sLWRvY3MtY2kvcHVsbC8xNjkiPlRoZSA8Y29kZT5kb2NzLWNpPC9jb2RlPiBwaXBlbGlu ZSBubyBsb25nZXIgcGlucw0KPGNvZGU+b2RvYzwvY29kZT4sIGFsbG93aW5nIFZvb2RvbyB0byB0 YWtlIGNvbnRyb2wgb2YgaXRzIGRlcGVuZGVuY2llcyBmb3IgYmV0dGVyIHNlcGFyYXRpb24gb2Yg Y29uY2VybnMuPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmluZSI+QHNh YmluZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWRvYy92 b29kb28vcHVsbC8xMzgiPlJlZmFjdG9yOiBJbXByb3ZlIG5hbWluZyBvZiBkaWZmZXJlbnQgaW5k ZXggbW9kdWxlczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUiPkBz YWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1kb2Mv dm9vZG9vL3B1bGwvMTM2Ij5CdWdmaXg6IFJlYWQgTGlicmFyeSBOYW1lcyBmcm9tIFBhY2thZ2Vz IENvcnJlY3RseTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUiPkBz YWJpbmU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1kb2Mv dm9vZG9vL3B1bGwvMTM3Ij5CdWdmaXg6IE1vdmUgSDEgVGl0bGUgUmVuZGVyaW5nIHRvIHRoZSBD b3JyZWN0IExvY2F0aW9uPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3NhYmlu ZSI+QHNhYmluZTwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+RGF0YSBwYXJzaW5nICg8Y29kZT5v b2QtZ2VuPC9jb2RlPik6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NzQiPlJlcG9ydCBmaWxlIG5hbWUg b24gWUFNTCBlcnJvcjwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jdWlodGxh dWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzE5ODQiPkNoYW5nZWxvZzogaW5mZXIgZGF0ZSBmcm9tIHNs dWcgaWYgbm90IGluIG1ldGFkYXRhPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2VtaWxsb24iPkBlbWlsbG9uPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk4NyI+PGNvZGU+b29kLWdlbjwvY29kZT46IGNhbGwg Y3J1bmNoIG9uIGVhY2ggZGlyZWN0b3J5IHNlcGFyYXRlbHk8L2E+IGJ5DQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vZW1pbGxvbiI+QGVtaWxsb248L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTgxIj5UdXRvcmlhbCB0aXRs ZXMgb25seSBhcyBtZXRhZGF0YTwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Q b29ybHlEZWZpbmVkQmVoYXZpb3VyIj5AUG9vcmx5RGVmaW5lZEJlaGF2aW91cjwvYT4gPC9saT48 L3VsPg0KPC9saT48bGk+RGF0YToNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk4MCI+QWRkIHR3byBpbmRp dmlkdWFsIGJsb2cgcG9zdCBlbnRyaWVzPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL0lkYXJhTmFidWsiPkBJZGFyYU5hYnVrPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk3NiI+Q2hhbmdlbG9nIGZvciBEdW5l IDMuMTMuMDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lbWlsbG9uIj5AZW1p bGxvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzE5ODYiPmNoYW5nZWxvZzogb3BhbS4yLjIuMH5iZXRhMTwvYT4gYnkNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZSI+QGtpdC10eS1rYXRlPC9hPiA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTkw NCI+QWRkIExhdmFsIFVuaXZlcnNpdHkgYXMgYW4gYWNhZGVtaWMgdXNlciBvZiBPQ2FtbDwvYT4g YnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ia3RhcmkiPkBia3Rhcmk8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODk4 Ij5BZGQgMiBYZW5TZXJ2ZXIgam9iczwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9lZHdpbnRvcm9rIj5AZWR3aW50b3JvazwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5NjEiPihkYXRhKSBBZGRlZCA8Y29kZT5w cml2ZXIuZGV2PC9jb2RlPiBPQ2FtbCBmZWVkPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2VtaWxwcml2ZXIiPkBlbWlscHJpdmVyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTk1MCI+QWRkIGNoYW5nZWxvZyBm b3IgRHVuZSAzLjEyLjI8L2E+IGJ5DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZW1pbGxv biI+QGVtaWxsb248L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8xOTgzIj5Vc2UgWWFtbCBkYXNoZXMgZm9yIGxpc3RzPC9hPiBieQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWMiPkBjdWlodGxhdWFjPC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTk5MSI+QWRkIG1pc3NpbmcgUGxhdGZvcm0gY2hhbmdlbG9nczwvYT4gYnkNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvIj5AdG1hdHRpbzwvYT4gPC9saT48L3VsPg0KPC9saT48 bGk+UmVwb3NpdG9yeSBkb2NzOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xOTA4Ij5GaXggYnJva2VuIGxp bmtzIGluIENPTlRSSUJVVElORy5tZDwvYT4gYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9jdWlodGxhdWFjIj5AY3VpaHRsYXVhYzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE5MDYiPihkb2MpIE1lbnRpb24gaW4gQ09O VFJJQlVUSU5HLm1kIGhvdyB0byBhZGQgaW1hZ2VzPC9hPiBieQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL3NhYmluZSI+QHNhYmluZTwvYT4gPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+T0NhbWwgNS4yLjAsIGZpcnN0IGFscGhh IHJlbGVhc2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTUt Mi0wLWZpcnN0LWFscGhhLXJlbGVhc2UvMTQwMTYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb2NhbWwtNS0yLTAtZmlyc3QtYWxwaGEtcmVsZWFzZS8xNDAxNi8xPC9hPiA8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzc5ODg5MjgiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc3OTg4OTI4Ij5vY3RhY2hyb24gYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3OTg4OTI4Ij4NCjxwPlR3byBt b250aHMgYWZ0ZXIgdGhlIHJlbGVhc2Ugb2YgT0NhbWwgNS4xLjEsIHRoZSBzZXQgb2YgbmV3IGZl YXR1cmVzIGZvciB0aGUgZnV0dXJlIHZlcnNpb24gNS4yLjAgb2YgT0NhbWwgaGFzIGJlZW4gZnJv emVuLiBXZSBhcmUgdGh1cyBoYXBweSB0byBhbm5vdW5jZSB0aGUgZmlyc3QgYWxwaGEgcmVsZWFz ZSBmb3IgT0NhbWwgNS4yLjAuDQo8L3A+DQo8cD5UaGlzIGFscGhhIHZlcnNpb24gaXMgaGVyZSB0 byBoZWxwIGZlbGxvdyBoYWNrZXJzIGpvaW4gdXMgZWFybHkgaW4gb3VyIGJ1ZyBodW50aW5nIGFu ZCBvcGFtIGVjb3N5c3RlbSBmaXhpbmcgZnVuIChzZWUgYmVsb3cgZm9yIHRoZSBpbnN0YWxsYXRp b24gaW5zdHJ1Y3Rpb25zKS4gTW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgd2hvbGUgcmVsZWFz ZSBwcm9jZXNzIGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9yZWxlYXNlLWluZm8vaW50cm9kdWN0aW9uLm1k Ij4NCmNvbXBpbGVyIHJlcG9zaXRvcnk8L2E+LCBhbmQgd2Ugd2lsbCB0cnkgdG8gcHJvcGFnYXRl IHRoaXMgaW5mb3JtYXRpb24gdG8gb2NhbWwub3JnIHNob3J0bHkuDQo8L3A+DQo8cD5UaGUgcHJv Z3Jlc3NlcyBvbiBzdGFiaWxpc2luZyB0aGUgZWNvc3lzdGVtIGFyZSB0cmFja2VkIG9uIHRoZSA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8y NTE4MiI+DQpvcGFtIHJlYWRpbmVzcyBmb3IgNS4yLjAgbWV0YS1pc3N1ZTwvYT4uIDwvcD4NCjxw PlRoZSBmdWxsIHJlbGVhc2UgaXMgZXhwZWN0ZWQgYXJvdW5kIEFwcmlsLiA8L3A+DQo8cD5JZiB5 b3UgZmluZCBhbnkgYnVncywgcGxlYXNlIHJlcG9ydCB0aGVtIG9uIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMiPg0KT0NhbWzigJlzIGlzc3VlIHRyYWNrZXI8 L2E+LiA8L3A+DQo8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gdGhlIG9uZ29pbmcgbGlzdCBv ZiBuZXcgZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcywgdGhlIHVwZGF0ZWQgY2hhbmdlIGxvZyBmb3Ig T0NhbWwgNS4yLjAgaXMgYXZhaWxhYmxlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvYmxvYi81LjIvQ2hhbmdlcyI+b24gR2l0SHViPC9hPi4gPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhOTA5YTI3IiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnYTkwOWEyNyI+SW5zdGFsbGF0aW9uIEluc3RydWN0aW9uczwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTkwOWEyNyI+DQo8cD5UaGUgYmFz ZSBjb21waWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dpdGNoIHdpdGggdGhlIGZv bGxvd2luZyBjb21tYW5kcyBvbiBvcGFtIDIuMSBhbmQgbGF0ZXI6DQo8L3A+DQo8cHJlIGNsYXNz PSJleGFtcGxlIiBpZD0ib3JnNjM3YjU3YSI+DQpvcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3Jl YXRlIDUuMi4wfmFscGhhMQ0KPC9wcmU+DQo8cD5Gb3IgcHJldmlvdXMgdmVyc2lvbiBvZiBvcGFt LCB0aGUgc3dpdGNoIGNyZWF0aW9uIGNvbW1hbmQgbGluZSBpcyBzbGlnaHRseSBtb3JlIHZlcmJv c2U6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnOGY2M2VkYyI+DQpvcGFtIHVw ZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlIDUuMi4wfmFscGhhMQ0KLS1yZXBvc2l0b3JpZXM9ZGVm YXVsdCxiZXRhPWdpdCYjNDM7aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWJldGEtcmVw b3NpdG9yeS5naXQNCjwvcHJlPg0KPHA+VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgYWxwaGEgaXMg YWxzbyBhdmFpbGFibGUgYXQgdGhlc2UgYWRkcmVzc2VzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUv NS4yLjAtYWxwaGExLnRhci5neiI+R2l0SHViPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuMi9vY2FtbC01LjIuMH5hbHBoYTEu dGFyLmd6Ij5PQ2FtbCBhcmNoaXZlcyBhdCBJbnJpYTwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmcxN2M1ZTg3Ij48L2E+RmluZS1UdW5l ZCBDb21waWxlciBDb25maWd1cmF0aW9uPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUi IGlkPSJ0ZXh0LW9yZzE3YzVlODciPg0KPHA+SWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZp Z3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5b3UgY2FuIHN3aXRjaCB0byB0aGUgb3B0aW9uIHZh cmlhbnQgd2l0aDoNCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdmOWYxNjFkIj4N Cm9wYW0gdXBkYXRlDQpvcGFtIHN3aXRjaCBjcmVhdGUgJmx0O3N3aXRjaF9uYW1lJmd0OyBvY2Ft bC12YXJpYW50cy41LjIuMH5hbHBoYTEmIzQzO29wdGlvbnMgJmx0O29wdGlvbl9saXN0Jmd0Ow0K PC9wcmU+DQo8cD53aGVyZSA8Y29kZT5vcHRpb25fbGlzdDwvY29kZT4gaXMgYSBzcGFjZSBzZXBh cmF0ZWQgbGlzdCBvZiA8Y29kZT5vY2FtbC1vcHRpb24tKjwvY29kZT4gcGFja2FnZXMuIEZvciBp bnN0YW5jZSwgZm9yIGEgZmxhbWJkYSBhbmQgbm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0Y2g6DQo8 L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnZGEzOWVlMiI+DQpvcGFtIHN3aXRjaCBj cmVhdGUgNS4yLjB+YWxwaGExJiM0MztmbGFtYmRhJiM0MztuZmZhIG9jYW1sLXZhcmlhbnRzLjUu Mi4wfmFscGhhMSYjNDM7b3B0aW9ucw0Kb2NhbWwtb3B0aW9uLWZsYW1iZGEgb2NhbWwtb3B0aW9u LW5vLWZsYXQtZmxvYXQtYXJyYXkNCjwvcHJlPg0KPHA+VGhlIGNvbW1hbmQgbGluZSBhYm92ZSBp cyBzbGlnaHRseSBtb3JlIGNvbXBsaWNhdGVkIGZvciBvcGFtIHZlcnNpb24gYW50ZXJpb3IgdG8g Mi4xOg0KPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzM3YmMzMWUiPg0Kb3BhbSB1 cGRhdGUNCm9wYW0gc3dpdGNoIGNyZWF0ZSAmbHQ7c3dpdGNoX25hbWUmZ3Q7IC0tcGFja2FnZXM9 b2NhbWwtdmFyaWFudHMuNS4yLjB+YWxwaGExJiM0MztvcHRpb25zLCZsdDtvcHRpb25fbGlzdCZn dDsNCi0tcmVwb3NpdG9yaWVzPWRlZmF1bHQsYmV0YT1naXQmIzQzO2h0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC1iZXRhLXJlcG9zaXRvcnkuZ2l0DQo8L3ByZT4NCjxwPkluIGJvdGggY2Fz ZXMsIGFsbCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggPGNvZGU+b3BhbSBz ZWFyY2ggb2NhbWwtb3B0aW9uPC9jb2RlPi4NCjwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPlJlbGVhc2Ugb2YgcHB4bGliLjAuMzIuMDwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsZWFzZS1vZi1wcHhsaWItMC0zMi0w LzE0MDI5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JlbGVhc2Utb2YtcHB4bGli LTAtMzItMC8xNDAyOS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZ2U3NWRjMjgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlNzVkYzI4Ij5O YXRoYW4gUmVib3VycyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2U3NWRjMjgiPg0KPHA+VGhlIHBweGxpYiBkZXYgdGVhbSBpcyBoYXBweSB0 byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBwcHhsaWIuMC4zMi4wLiA8L3A+DQo8cD5UaGUgbWFp biBmZWF0dXJlIG9mIHRoaXMgcmVsZWFzZSwgaW1wbGVtZW50ZWQgYnkgQGJ1cm5sZXlkZXYxIGR1 cmluZyB0aGVpciBPdXRyZWFjaHkgaW50ZXJuc2hpcCwgaXMgYSBodWdlIGltcHJvdmVtZW50IG9m IHRoZSBoYW5kbGluZyBvZiBsb2NhdGVkIGV4Y2VwdGlvbnMgcmFpc2VkIGJ5IHBweC1lcy4gV2hl bmV2ZXIgYSByZXdyaXRlIG9mIHRoZSBBU1QgdGhyb3dzIHN1Y2ggYW4gZXhjZXB0aW9uLCB0aGUg cHB4bGliIGRyaXZlciBjYXRjaGVzDQogaXQgYW5kIHJlc3VtZXMgdGhlIHJld3JpdGluZyB1c2lu ZyB0aGUgbGF0ZXN0IHZhbGlkIEFTVCBpdCBrbm93cyBvZi4gQWxsIGNhdWdodCBleGNlcHRpb25z IGFyZSBhcHBlbmRlZCB0byB0aGUgZmluYWwgQVNUIGFzDQo8Y29kZT5bJSVvY2FtbC5lcnJvciAu Ll08L2NvZGU+IG5vZGVzLiBUaGlzIG1lYW5zIHRoZSBkcml2ZXIgcmV0dXJucyBhIHZhbGlkIEFT VCBpbnN0ZWFkIG9mIG9uZSBjb21wb3NlZCBvZiBhIHNpbmdsZSBlcnJvciBub2RlIGNvcnJlc3Bv bmRpbmcgdG8gdGhlIGZpcnN0IHJhaXNlZCBleGNlcHRpb24uIFRoaXMgbGVhZHMgdG8gYSBtdWNo IGJldHRlciBleHBlcmllbmNlIGZvciBwcHggdXNlcnMgYXMgbWVybGluIG5vdyBoYXMgYSB2YWxp ZCBBU1QgdG8NCiB3b3JrIHdpdGggd2hlbiB0aGlzIGhhcHBlbnMsIGFsbG93aW5nIGl0IHRvIHBy b3Blcmx5IGZ1bmN0aW9uIGFuZCByZXBvcnQgYWxsIGVycm9ycywgZnJvbSBwcHgtZXMgb3Igb3Ro ZXJ3aXNlLiBOb3RlIHRoYXQgZGVzcGl0ZSB0aGlzIGNoYW5nZSB3ZSBzdGlsbCByZWNvbW1lbmQg cHB4IGF1dGhvcnMgdG8gZW1iZWQgZXJyb3JzIGluIHRoZSByZXdyaXR0ZW4gQVNUIHJhdGhlciB0 aGFuIHRocm93IGV4Y2VwdGlvbnMuDQo8L3A+DQo8cD5UaGUgcmVsZWFzZSBhbHNvIGNvbWVzIHdp dGggYSBmZXcgYnVnIGZpeGVzIG9uIGxvbmdpZGVudCBwYXJzaW5nIG9yIHdpbmRvd3MgY29tcGF0 aWJpbGl0eSBhbmQgYSBuZXcgc2ltcGxpZmllZCBBUEkgZm9yIHBweCBhdXRob3JzIHVzaW5nIGF0 dHJpYnV0ZXMgYXMgZmxhZ3MgKGkuZS4gYXR0cmlidXRlcyB3aXRob3V0IHBheWxvYWRzIHN1Y2gg YXMNCjxjb2RlPltAaWdub3JlXTwvY29kZT4gZm9yIGluc3RhbmNlKS4gPC9wPg0KPHA+WW91IGNh biByZWFkIHRoZSBmdWxsIHBhdGNoIG5vdGVzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1wcHgvcHB4bGliL2Jsb2IvbWFpbi9DSEFOR0VTLm1kIzAzMjAtMjAyNC0wMi0wNSI+DQpo ZXJlPC9hPi4gPC9wPg0KPHA+V2XigJlkIGxpa2UgdG8gdGhhbmsgb3VyIGV4dGVybmFsIGNvbnRy aWJ1dG9ycyBmb3IgdGhpcyByZWxlYXNlOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ QGJ1cm5sZXlkZXYxIGZvciB0aGVpciBpbXByb3ZlbWVudCBvZiB0aGUgZHJpdmVyIGV4Y2VwdGlv biBoYW5kbGluZyA8L2xpPjxsaT5AZGlhbmFvaWdvIGZvciB0aGVpciBhZGRpdGlvbiBvZiB0aGUg bmV3IGF0dHJpYnV0ZSBmbGFncyBBUEkgPC9saT48bGk+QGpvbmFoYmVja2ZvcmQgZm9yIHRoZWly IGZpeCBvZiB0aGUgd2luZG93cyBjb21wYXRpYmlsaXR5IDwvbGk+PC91bD4NCjxwPldl4oCZZCBh bHNvIGxpa2UgdG8gdGhhbmsgdGhlIE9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb24gd2hvIGhhcyBi ZWVuIGZ1bmRpbmcgbXkgd29yayBvbiB0aGlzIHJlbGVhc2UuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iNiI+TG9va2luZyBmb3IgSWRlYXMgZm9yIHRoZSBDb21tdW5pdHkgUGFnZSBh dCBPQ2FtbC5vcmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xvb2tp bmctZm9yLWlkZWFzLWZvci10aGUtY29tbXVuaXR5LXBhZ2UtYXQtb2NhbWwtb3JnLzE0MDMyLzEi Pg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xvb2tpbmctZm9yLWlkZWFzLWZvci10aGUt Y29tbXVuaXR5LXBhZ2UtYXQtb2NhbWwtb3JnLzE0MDMyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzRjM2JmNjIiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmc0YzNiZjYyIj5TaGFrdGhpIEthbm5hbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzRjM2JmNjIiPg0KPHA+R3JlZXRpbmdz ISA8L3A+DQo8cD5BcyB3ZSBjb250aW51ZSB0byBtYWtlIGdyZWF0IHN0cmlkZXMgaW4gMjAyNCwg d2Ugd291bGQgbGlrZSB0byBzdXBwb3J0IGFuZCBncm93IG91ciBPQ2FtbCBjb21tdW5pdHkhDQo8 L3A+DQo8cD5JbiB0aGlzIHJlZ2FyZCwgd2UgbmVlZCB0byBvdmVyaGF1bCB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvY29tbXVuaXR5Ij4NCk9DYW1sLm9yZyBDb21tdW5pdHk8L2E+IHBh Z2UsIHNpbWlsYXIgdG8gaG93IHdlIGhhdmUgcmV2YW1wZWQgdGhlIFBhY2thZ2UgT3ZlcnZpZXcg cGFnZSBhbmQgdGhlIExlYXJuIEFyZWEgYmFzZWQgb24geW91ciBmZWVkYmFjay4NCjwvcD4NCjxw PldoYXQgYXJlIHRoZSBzcGVjaWZpYyA8Yj50b3BpY3M8L2I+IG9yIDxiPmZlYXR1cmVzPC9iPiB0 aGF0IHlvdSB3b3VsZCBsaWtlIHRvIHByb21pbmVudGx5IGRpc3BsYXkgb24gdGhlIENvbW11bml0 eSBsYW5kaW5nIHBhZ2U/DQo8L3A+DQo8cD5BcmUgdGhlcmUgc3BlY2lmaWMgPGI+cmVzb3VyY2Vz PC9iPiwgPGI+bGlua3M8L2I+LCBhbmQgPGI+Y29udGVudDwvYj4gdGhhdCB5b3UgZmluZCB2YWx1 YWJsZT8NCjwvcD4NCjxwPlNob3cgdXMgYW55IHBhZ2VzIGZyb20gb3RoZXIgY29tbXVuaXRpZXMg dGhhdCB5b3UgZmluZCBhcmUgd2VsbCBkb25lLCBhbmQgdGVsbCB1cyB3aGF0IHlvdSB0aGluayBh Ym91dCB0aGVtLg0KPC9wPg0KPHA+UGxlYXNlIHNoYXJlIHlvdXIgdGhvdWdodHMgYW5kIHN1Z2dl c3Rpb25zIGZvciB0aGUgQ29tbXVuaXR5IEFyZWEgcGFnZS4gPC9wPg0KPHA+TGV04oCZcyBkaXNj dXNzISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+UHJvZmlsaW5nIE9DYW1sIHBy b2dyYW1zPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxw PkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcm9maWxpbmct b2NhbWwtcHJvZ3JhbXMvMTQwMzMvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHJv ZmlsaW5nLW9jYW1sLXByb2dyYW1zLzE0MDMzLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNzE3ZjcxZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzcxN2Y3MWUiPkxvdWlzIFJvY2jDqSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzcxN2Y3MWUiPg0KPHA+QWhyZWZzIHJlY2VudGx5IGhh ZCB0byBkbyBzb21lIHByb2ZpbGluZyB0byBpbnZlc3RpZ2F0ZSBidWlsZCB0aW1lcy4gQGpjaGF2 YXJyaSB1c2VkIHRoaXMgb3Bwb3J0dW5pdHkgdG8gcmVncm91cCBkaWZmZXJlbnQgdGVjaG5pcXVl cyBpbiBhIHNpbmdsZSBkb2N1bWVudCwgd2hpY2ggd2FzIHRoZW4gdHVybmVkIGludG8gdGhpcyBi bG9nIHBvc3QuDQo8L3A+DQo8cD5UaGUgcG9zdCBmb2N1c2VzIG9uIGR1bmUsIGFzIGl0IHdhcyBv dXIgdGFyZ2V0IHRoaXMgdGltZS4gQnV0IGl0IGFwcGxpZXMgdG8gYmFzaWNhbGx5IGFsbCBvY2Ft bCBwcm9ncmFtcy4NCjwvcD4NCjxwPldlIGhvcGUgdGhhdCBpdCBjYW4gc2VydmUgYXMgYSBzdGFy dGluZyBwb2ludCBpZiB5b3UgZXZlciBoYXZlIHRvIGNvbmR1Y3Qgc2ltaWxhciBpbnZlc3RpZ2F0 aW9ucy4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vdGVjaC5haHJlZnMuY29tL3Byb2ZpbGlu Zy1kdW5lLWJ1aWxkcy1hOGRlNTg5ZWMyNjgiPmh0dHBzOi8vdGVjaC5haHJlZnMuY29tL3Byb2Zp bGluZy1kdW5lLWJ1aWxkcy1hOGRlNTg5ZWMyNjg8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iOCI+TW9uYWRpYyBwcm9ncmFtbWluZyB0dXRvcmlhbDwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbW9uYWRpYy1wcm9ncmFtbWluZy10dXRvcmlhbC8xNDAz NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tb25hZGljLXByb2dyYW1taW5nLXR1 dG9yaWFsLzE0MDM0LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMGIxMjYxNiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzBiMTI2MTYiPkZy w6lkw6lyaWMgTG95ZXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmcwYjEyNjE2Ij4NCjxwPkkgaGF2ZSB0eXBlZCBhIGxpdHRsZSBtb25hZGlj IHByb2dyYW1taW5nIHR1dG9yaWFsLiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL3d3dy5zaW5l cmoub3JnL35sb3llci9tb25hZGljX3Byb2dyYW1taW5nL21vbmFkaWNfcHJvZ3JhbW1pbmcvaW5k ZXguaHRtbCI+aHR0cHM6Ly93d3cuc2luZXJqLm9yZy9+bG95ZXIvbW9uYWRpY19wcm9ncmFtbWlu Zy9tb25hZGljX3Byb2dyYW1taW5nL2luZGV4Lmh0bWw8L2E+DQo8L3A+DQo8cD5Ib3BlIHRoaXMg aGVscHMuIFlvdXIgY29tbWVudHMgYXJlIHdlbGNvbWVkLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iOSI+VHV0b3JpYWwgb24gR0FEVHM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3R1dG9yaWFsLW9uLWdhZHRzLzE0MDQwLzEiPmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC90dXRvcmlhbC1vbi1nYWR0cy8xNDA0MC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhOWY4NjcwIiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnYTlmODY3MCI+UmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTlmODY3MCI+DQo8cD5J4oCZdmUg d3JpdHRlbiBhIHRocmVlLXBhcnQgdHV0b3JpYWwgb24gR0FEVHMuIDxhIGhyZWY9Imh0dHBzOi8v cmFwaGFlbC1wcm91c3QuZ2l0bGFiLmlvL2NvZGUvbXktZmlyc3QtZ2FkdC5odG1sIj4NClRoZSBm aXJzdCBwYXJ0PC9hPiBzaG93cyB0aGUgdmVyeSBiYXNpYy4gSXQgaXMgaW50ZW5kZWQgZm9yIGFu eW9uZSB3aG8gYWxyZWFkeSBrbm93cyBPQ2FtbCBidXQgaGFzbuKAmXQgd3JpdHRlbiBhIEdBRFQg YmVmb3JlLg0KPGEgaHJlZj0iaHR0cHM6Ly9yYXBoYWVsLXByb3VzdC5naXRsYWIuaW8vY29kZS9n YWR0LXRpcHMtYW5kLXRyaWNrcy5odG1sIj5UaGUgc2Vjb25kIHBhcnQ8L2E+IGlzIGEgY29sbGVj dGlvbiBvZiBkaWZmZXJlbnQgdGVjaG5pcXVlcyB5b3UgY2FuIHVzZSB3aGVuIG1ha2luZyB5b3Vy IG93biBHQURULiBJdCBpcyBpbnRlbmRlZCBhcyBhIGZvbGxvdy11cCBvZiB0aGUgZmlyc3QgcGFy dCBvciBmb3IgcHJvZ3JhbW1lcnMgd2hvIGhhdmUgd3JpdHRlbg0KIEdBRFRzIGJlZm9yZSBidXQg ZmVlbCBsaWtlIHRoZXkgc3RpbGwgaGF2ZSB0aGluZ3MgdG8gbGVhcm4uIDxhIGhyZWY9Imh0dHBz Oi8vcmFwaGFlbC1wcm91c3QuZ2l0bGFiLmlvL2NvZGUvZ2FkdC1nYWxsZXJ5Lmh0bWwiPg0KVGhl IHRoaXJkIHBhcnQ8L2E+IGlzIGEgZ2FsbGVyeSBvZiBHQURUcyBmb3VuZCBpbiB0aGUgcHVibGlj IE9DYW1sIHNvZnR3YXJlIGVjb3N5c3RlbS4gSXTigJlzIGludGVuZGVkIGZvciBhbnlvbmUgd2hv IHdhbnRzIHRvIHNlZSBwcmFjdGljYWwtdXNlIGV4YW1wbGVzLg0KPC9wPg0KPHA+SSBpbnRlbmQg dG8gZXhwYW5kIHRoZSBnYWxsZXJ5IG9mIEdBRFRzIChwYXJ0IHRocmVlKS4gTGV0IG1lIGtub3cg aWYgeW91IGhhdmUgc3VnZ2VzdGlvbnMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjEwIj5DYXF0aS9wcHhfcmFwZXIgdHV0b3JpYWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9jYXF0aS1wcHgtcmFwZXItdHV0b3JpYWwvMTQwNTYvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvY2FxdGktcHB4LXJhcGVyLXR1dG9yaWFsLzE0MDU2LzE8L2E+ IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGE0NDQ5OCIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRhNDQ0OTgiPkZyw6lkw6lyaWMgTG95ZXIgYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0YTQ0 NDk4Ij4NCjxwPkkgcHJvcG9zZSB0aGUgZm9sbG93aW5nIHR1dG9yaWFsIDwvcD4NCjxwPjxhIGhy ZWY9Imh0dHBzOi8vd3d3LnNpbmVyai5vcmcvfmxveWVyL2NhcXRpX3BweF9yYXBwZXIvY2FxdGlf cHB4X3JhcHBlci9pbmRleC5odG1sIj5odHRwczovL3d3dy5zaW5lcmoub3JnL35sb3llci9jYXF0 aV9wcHhfcmFwcGVyL2NhcXRpX3BweF9yYXBwZXIvaW5kZXguaHRtbDwvYT4NCjwvcD4NCjxwPkl0 IGlzIGFib3V0IENhcXRpIGFuZCBwcHhfcmFwcGVyIHVzZS4gVGhlIHR1dG9yaWFsIGFsc28gdXNl cyB0aGUgPGNvZGU+THd0X3Jlc3VsdDwvY29kZT4gbW9uYWQgYW5kIGl0cw0KPGNvZGU+KGxldCop PC9jb2RlPiBiaW5kaW5nIG9wZXJhdG9yLiBUaGlzIGF2b2lkIGFueSBleHBsaWNpdCBlcnJvciBo YW5kbGluZy4gPC9wPg0KPHA+SSBob3BlIHRoaXMgd2lsbCBiZSBpbnRlcmVzdGluZywgYW5kIHdp bGwgYmUgZ2xhZCB0byBnZXQgc29tZSBhZHZpY2UgdG8gaW1wcm92ZSB0aGlzIGZpcnN0IGNvcHku DQo8L3A+DQo8cD5QZXJoYXBzIEkgc2hvdWxkIGFkZCBhIHNlY3Rpb24gYWJvdXQgcHJvY2Vzc2lu ZyBhIDxjb2RlPmxpc3Q8L2NvZGU+IG9mIHF1ZXJpZXMgKGV4OiBhIHF1ZXJ5IHJldHVybnMgYSBs aXN0IG9mIGl0ZW0gYW5kIHdlIHdhbnQgdG8gZXhlY3V0ZSBhIG5ldyBxdWVyeSBmb3IgZWFjaCBy b3cpDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5SZTogZHVuZSAzLjEzPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMy0xMy8xMzkx MS8yIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMy0xMy8xMzkxMS8yPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmYTczNzMzIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZmE3MzczMyI+RXRpZW5uZSBNaWxsb24gYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmYTcz NzMzIj4NCjxwPkFuZCBkdW5lIDMuMTMuMSBpcyBhdmFpbGFibGUgd2l0aCB0aGUgZm9sbG93aW5n IGZpeGVzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Rml4IHBlcmZvcm1hbmNlIHJl Z3Jlc3Npb24gZm9yIGluY3JlbWVudGFsIGJ1aWxkcyAoIzk3NjksIGZpeGVzICM5NzM4LCBAcmdy aW5iZXJnKQ0KPC9saT48bGk+Rml4IDxjb2RlPmR1bmUgb2NhbWwgdG9wLW1vZHVsZTwvY29kZT4g dG8gY29ycmVjdGx5IGhhbmRsZSBhYnNvbHV0ZSBwYXRocy4gKCM4MjQ5LCBmaXhlcyAjNzM3MCwg QEFsaXp0ZXIpDQo8L2xpPjxsaT5zdWJzdDogaWdub3JlIGJyb2tlbiBzeW1saW5rcyB3aGVuIGxv b2tpbmcgYXQgc291cmNlIGZpbGVzICgjOTgxMCwgZml4ZXMgIzk1OTMsIEBlbWlsbG9uKQ0KPC9s aT48bGk+c3Vic3Q6IGRvIG5vdCBmYWlsIG9uIDMyLWJpdCBzeXN0ZW1zIHdoZW4gbGFyZ2UgZmls ZXMgYXJlIGVuY291bnRlcmVkLiBKdXN0IGxvZyBhIHdhcm5pbmcgaW4gdGhpcyBjYXNlLiAoIzk4 MTEsIGZpeGVzICM5NTM4LCBAZW1pbGxvbikNCjwvbGk+PGxpPmJvb3Q6IHNvcnQgZGlyZWN0b3J5 IGVudHJpZXMgaW4gcmVhZGRpci4gVGhpcyBtYWtlcyB0aGUgZHVuZSBiaW5hcnkgcmVwcm9kdWNp YmxlIGluIHRlcm1zIG9mIGZpbGVzeXN0ZW0gb3JkZXIuICgjOTg2MSwgZml4ZXMgIzk3OTQsIEBl bWlsbG9uKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMiI+T3RoZXIg T0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTIi PjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTEyZGQ2OCIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzUxMmRkNjgiPkZyb20gdGhlIG9jYW1sLm9yZyBibG9nPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc1MTJkZDY4Ij4NCjxw PkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IDxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxvZzwvYT4uIDwv cD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3ByaXZlci5kZXYv YmxvZy9vY2FtbC9vY2FtbC1pbnRyb2R1Y3Rpb24vIj5PQ2FtbDogSW50cm9kdWN0aW9uPC9hPg0K PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDItMDctaW1w cm92aW5nLW9jYW1sLW9yZy10by1wcm92aWRlLWFuLWVuZ2FnaW5nLXV4LWFuZC10cnVzdGVkLXVz ZXItcmVzb3VyY2VzIj5JbXByb3ZpbmcgT0NhbWwub3JnIHRvIFByb3ZpZGUgYW4gRW5nYWdpbmcg VVggYW5kIFRydXN0ZWQgVXNlciBSZXNvdXJjZXM8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlYzA3OGYwIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnZWMwNzhmMCI+T2xkIENXTjwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnZWMwNzhmMCI+DQo8cD5JZiB5b3UgaGFw cGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBw b2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWls IGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFy Y2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIHRvIHRoZSA8YSBocmVmPSJodHRwczov L3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Ij4NCmNhbWwtbGlzdDwvYT4uIDwv cD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmczN2QzNWZjIj4NCjxwPjxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 30 Jan 2024 14:16:05 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 30 Jan 2024 14:16:05 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 30 Jan 2024 14:16:05 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40UEGUew031920 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 Jan 2024 14:16:30 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40UEGE26031907 for ; Tue, 30 Jan 2024 14:16:15 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Jan 2024 15:16:12 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id DB526E0CE0; Tue, 30 Jan 2024 15:16:12 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6BF5CE008A for ; Tue, 30 Jan 2024 15:16:09 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jan 2024 15:16:06 +0100 Received: from TM.local (lfbn-ren-1-1772-105.w86-253.abo.wanadoo.fr [86.253.80.105]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 905E956122B; Tue, 30 Jan 2024 15:16:03 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaU4bcs2xu6+l8JE+bnkngSMT2nw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 30 Jan 2024 14:16:02 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 2ee1a8ed-7880-449b-8fd5-08dc219dff45 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.05,707,1701126000"; d="scan'208,217";a="78232821" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.491691, queueID=8472F56122C x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMS0zMCBUdWUgMTU6MTUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDEuMjMuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMi4wNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMjMgdG8gMzAsIDIwMjQuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+UHJlZmFjdWx0eS9wb3N0ZG9jIHJl c2VhcmNoIHBvc2l0aW9uIGF0IEphbmUgU3RyZWV0IChOZXcgWW9yayBvciBMb25kb24pPC9hPg0K PC9saT48bGk+PGEgaHJlZj0iIzIiPlZnIDkuNS4wIOKAkyBEZWNsYXJhdGl2ZSAyRCB2ZWN0b3Ig Z3JhcGhpY3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5PQ2FtbCBQbGF0Zm9ybSBOZXdzbGV0 dGVyOiBOb3ZlbWJlciBhbmQgRGVjZW1iZXIgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQi PlVwY29taW5nIENhcXRpIFJlbGVhc2UgLSBUTFMsIFBhY2thZ2luZywgYW5kIG1pbm9yIGJyZWFr YWdlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNSI+RGV2ZWxvcGluZyBXZWIgYW5kIG1vYmlsZSBh cHBsaWNhdGlvbnMgaW4gT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5kcmVhbS1odG1s IDIuMC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+RGlzY3Vzc2lvbnMgb24gdGhlIGZ1dHVy ZSBvZiB0aGUgb3BhbSByZXBvc2l0b3J5PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+UmVxdWVz dCBmb3IgRmVlZGJhY2s6IFRha2UgdGhlIE9DYW1sLm9yZyBMZWFybiBBcmVhIFVzZXIgU2F0aXNm YWN0aW9uIFN1cnZleTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5NaWRkbGV3YXJlIDEuMC4w IOKAkyBDb21wb3NhYmxlIGZ1bmN0aW9ucyB3aGljaCByZXNwb25kIHRvIGlubmVyIGNhbGxzPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iIzEwIj5Bbm5vdW5jaW5nIHZhbGlkYXRlIDEuMC4wIC0gRW5o YW5jZWQgRGF0YSBWYWxpZGF0aW9uIGluIE9DYW1sITwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMx MSI+Q29uZ3JhdHVsYXRpb24gdG8gdGhlIE9DYW1sIHRlYW0gZm9yIHRoZSAyMDIzIFNJR1BMQU4g cHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHNvZnR3YXJlIGF3YXJkISDwn4+GPC9hPg0KPC9saT48bGk+ PGEgaHJlZj0iIzEyIj5QYXJ0aWNpcGF0ZSBpbiBPQ2FtbC5vcmcgTGVhcm4gQXJlYSBVc2VyIFRl c3Rpbmc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMyI+T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9s aT48bGk+PGEgaHJlZj0iI29yZzVlNzJlMzgiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMSI+UHJlZmFjdWx0eS9wb3N0ZG9jIHJlc2VhcmNoIHBvc2l0aW9uIGF0IEph bmUgU3RyZWV0IChOZXcgWW9yayBvciBMb25kb24pPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9qb2ItcHJlZmFjdWx0eS1wb3N0ZG9jLXJlc2VhcmNoLXBvc2l0aW9uLWF0 LWphbmUtc3RyZWV0LW5ldy15b3JrLW9yLWxvbmRvbi8xMzkxOS8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9qb2ItcHJlZmFjdWx0eS1wb3N0ZG9jLXJlc2VhcmNoLXBvc2l0aW9uLWF0 LWphbmUtc3RyZWV0LW5ldy15b3JrLW9yLWxvbmRvbi8xMzkxOS8xPC9hPg0KPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4YjI1YTMwIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnOGIyNWEzMCI+UmljaGFyZCBFaXNlbmJlcmcgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4YjI1YTMwIj4NCjxwPkni gJltIGV4Y2l0ZWQgdG8gc2hhcmUgdGhhdCBKYW5lIFN0cmVldCBoYXMgb3BlbmVkIHVwIGEgdmlz aXRpbmcgcG9zaXRpb24gdG8gd29yayB3aXRoIG91ciB0eXBlIHN5c3RlbXMgdGVhbSB0byBpbXBy b3ZlIGFuZCBmb3JtYWxpemUgdmFyaW91cyBhc3BlY3RzIG9mIG91ciBleHRlbnNpb25zIHRvIE9D YW1sLiBUaGlzIHBvc2l0aW9uIGlzIGVudmlzaW9uZWQgdG8gc2l0IGJldHdlZW4gZ3JhZHVhdGlv biBmcm9tIGEgUGhEIHByb2dyYW0gYW5kIHRoZQ0KIHN0YXJ0IG9mIGEgdGVudXJlLXRyYWNrIHBy b2Zlc3NvcnNoaXAgYXQgYSByZXNlYXJjaCBpbnN0aXR1dGlvbi4gQ2FuZGlkYXRlcyBtaWdodCBh bHJlYWR5IGhhdmUgYSBmYWN1bHR5IG9mZmVyIGluIGhhbmQgYW5kIGJlIHRha2luZyBhIGdhcCB5 ZWFyLCBvciB0aGV5IG1pZ2h0IGJlIHNlZWtpbmcgYSBtb3JlIHRyYWRpdGlvbmFsIHBvc3Rkb2Mu IFRoZSB2aXNpdCBjYW4gbGFzdCBvbmUgb3IgdHdvIHllYXJzLiBJdCB3aWxsIGJlIHJlc2VhcmNo LWZvY3VzZWQsDQogd2l0aCBhIGdvYWwgb2YgcHVibGlzaGluZyBzZXZlcmFsIHBhcGVycyBpbiB0 b3AgdmVudWVzLiBUaGUgdmlzaXRvciB3aWxsIGJlIGFibGUgdG8gc2VlIGZpcnN0aGFuZCBob3cg bGFuZ3VhZ2UgaW1wcm92ZW1lbnRzIGFmZmVjdCB0aGUgdXNlcnMgYWxsIGFyb3VuZCB1cyBpbiBv dXIgb2ZmaWNlLiBUaGlzIHdpbGwgYmUgYSBncmVhdCBvcHBvcnR1bml0eSBhdCBjb21iaW5pbmcg dGhlIHRoZW9yZXRpY2FsIGFuZCBwcmFjdGljYWwgYXNwZWN0cyBvZg0KIHJlc2VhcmNoIGluIG91 ciBmaWVsZC4gPC9wPg0KPHA+RnVsbCBkZXRhaWxzIGFuZCBuZXh0IHN0ZXBzIGFyZSBhdCA8YSBo cmVmPSJodHRwczovL3d3dy5qYW5lc3RyZWV0LmNvbS9qb2luLWphbmUtc3RyZWV0L3Byb2dyYW1z LWFuZC1ldmVudHMvdmlzaXRpbmctcmVzZWFyY2hlci1wcmVmYWN1bHR5LyI+DQpodHRwczovL3d3 dy5qYW5lc3RyZWV0LmNvbS9qb2luLWphbmUtc3RyZWV0L3Byb2dyYW1zLWFuZC1ldmVudHMvdmlz aXRpbmctcmVzZWFyY2hlci1wcmVmYWN1bHR5LzwvYT4NCjwvcD4NCjxwPknigJlsbCBiZSBzdXBl cnZpc2luZyB0aGlzIHBvc2l0aW9uLiBIYXBweSB0byBhbnN3ZXIgYW55IHF1ZXN0aW9ucyBvdmVy IGVtYWlsIGF0IHJlaXNlbmJlcmdAamFuZXN0cmVldC5jb20uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMiI+VmcgOS41LjAg4oCTIERlY2xhcmF0aXZlIDJEIHZlY3RvciBncmFwaGlj czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZnLTktNS0wLWRl Y2xhcmF0aXZlLTJkLXZlY3Rvci1ncmFwaGljcy8xMzkyMi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tdmctOS01LTAtZGVjbGFyYXRpdmUtMmQtdmVjdG9yLWdyYXBoaWNzLzEz OTIyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE3 NGMxNmUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxNzRjMTZlIj5EYW5pZWwgQsO8 bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzE3NGMxNmUiPg0KPHA+SGVsbG8sIDwvcD4NCjxwPkl04oCZcyBteSBwbGVhc3VyZSB0byBh bm5vdW5jZSB0aGUgcmVsZWFzZSAwLjkuNSBvZiBWZzogPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5W ZyBpcyBhIGRlY2xhcmF0aXZlIDJEIHZlY3RvciBncmFwaGljcyBsaWJyYXJ5LiBJbWFnZXMgYXJl IHZhbHVlcyB0aGF0IGRlbm90ZSBmdW5jdGlvbnMgbWFwcGluZyBwb2ludHMgb2YgdGhlIGNhcnRl c2lhbiBwbGFuZSB0byBjb2xvcnMgYW5kIGNvbWJpbmF0b3JzIGFyZSBwcm92aWRlZCB0byBkZWZp bmUgYW5kIGNvbXBvc2UgdGhlbS4NCjwvcD4NCjxwPlJlbmRlcmVycyBmb3IgUERGLCBTVkcsIENh aXJvIGFuZCB0aGUgSFRNTCBjYW52YXMgYXJlIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGxpYnJhcnku IEFuIEFQSSBhbGxvd3MgdG8gaW1wbGVtZW50IG5ldyByZW5kZXJlcnMuDQo8L3A+DQo8cD5WZyBp cyBkaXN0cmlidXRlZCB1bmRlciB0aGUgSVNDIGxpY2Vuc2UuIDwvcD4NCjwvYmxvY2txdW90ZT4N CjxwPkV4Y2VwdCBmb3IgdGhlIGFkZGl0aW9uIG9mIGNvbWJpbmF0b3JzIHRvIDxhIGhyZWY9Imh0 dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3ZnL2RlbW9zL2RiX3ZpZXdlciNwYXRocy1zbW9v dGhzIj4NCnNtb290aGx5IHN0aXRjaDwvYT4gQsOpemllciBwYXRocyBieSBGcmFuw6dvaXMgVGhp csOpLCB0aGlzIGlzIG1vc3RseSBhIGJ1cmVhdWNyYXRpYyBhbmQgbWFpbnRlbmFuY2UgcmVsZWFz ZS4NCjwvcD4NCjxwPkF0IHRoZSBsaWJyYXJ5IGxldmVsLCB0aGUgPGNvZGU+VmdyX3N2ZzwvY29k ZT4gbW9kdWxlIGlzIG5vdyBwYXJ0IG9mIHRoZSA8Y29kZT4NCnZnPC9jb2RlPiBsaWJyYXJ5IGFu ZCB0aGUgPGNvZGU+dmcuc3ZnPC9jb2RlPiBsaWJyYXJ5IGlzIGRlcHJlY2F0ZWQuIFRoZSA8Y29k ZT5WZ3JfaHRtbGM8L2NvZGU+IGNhbnZhcyByZW5kZXJlciBoYXMgYmVlbiByZXdyaXR0ZW4gd2l0 aA0KPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyIj5icnI8L2E+IHdo aWNoIGJlY29tZXMgYW4gb3B0aW9uYWwgZGVwZW5kZW5jeSBvZiB0aGUgcGFja2FnZSB3aGlsZSB0 aGUgZGVwZW5kZW5jaWVzIG9uDQo8Y29kZT5qc19vZl9vY2FtbDwvY29kZT4gYW5kIDxjb2RlPmpz X29mX29jYW1sLXBweDwvY29kZT4gYXJlIGRyb3BwZWQgZm9yIGdvb2QuIDwvcD4NCjxwPlRlbiB5 ZWFycyBhZ28gbmVpdGhlciBkYXJrIHRoZW1lcyBub3IgPGNvZGU+Lm1sZDwvY29kZT4gZmlsZXMg ZGlkIGV4aXN0IHNvIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUv dmcvZG9jL3R1dG9yaWFsLmh0bWwiPnR1dG9yaWFsPC9hPiwgdGhlIDxhIGhyZWY9Imh0dHBzOi8v ZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3ZnL2RvYy9zZW1hbnRpY3MuaHRtbCI+DQpzZW1hbnRpY3M8 L2E+IGFuZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvdmcvZG9j L2ltYWdlX2hvd3RvLmh0bWwiPg0KaW1hZ2UgaG93dG88L2E+IGhhdmUgYmVlbiBzbGlnaHRseSBy ZXdvcmtlZCBhbmQgbW92ZWQgb3V0IG9mIHRoZSBWZyBtb2R1bGUgZG9jdW1lbnRhdGlvbiB0byB0 aGVpciBvd24gcGFnZXMgYW5kIHRoZSBkb2MgaW1hZ2VzIGhhdmUgYmVlbiBmaXhlZCB0byB3b3Jr IGluIGRhcmsgdGhlbWVzLg0KPC9wPg0KPHA+UmVhZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2RidWVuemxpL3ZnL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQjdjA5NS0yMDI0LTAxLTIz LWxhLWZvcmNsYXotdnMiPg0KcmVsZWFzZSBub3RlczwvYT4gZm9yIGFsbCB0aGUgb3RoZXIgY2hh bmdlcy4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkhvbWVwYWdlOiA8YSBocmVmPSJo dHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS92ZyI+aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29m dHdhcmUvdmc8L2E+DQo8L2xpPjxsaT5BUEkgZG9jcyAmYW1wOyBtYW51YWxzOiA8YSBocmVmPSJo dHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS92Zy9kb2MvIj5odHRwczovL2VycmF0aXF1ZS5j aC9zb2Z0d2FyZS92Zy9kb2MvPC9hPg0KPC9saT48bGk+SW5zdGFsbDogPGNvZGU+b3BhbSBpbnN0 YWxsIHZnPC9jb2RlPiAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVw b3NpdG9yeS9wdWxsLzI1MTEzIj5vcGFtIHByPC9hPikNCjwvbGk+PC91bD4NCjxwPkJlc3QsIDwv cD4NCjxwPkRhbmllbCA8L3A+DQo8cD5BIGJpZyB0aGFua3MgdG8gbXkgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpIj5kb25hdG9yczwvYT4uDQo8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+T0NhbWwgUGxhdGZvcm0gTmV3c2xldHRlcjogTm92ZW1i ZXIgYW5kIERlY2VtYmVyIDIwMjM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXBsYXRmb3JtLW5ld3NsZXR0ZXItbm92ZW1iZXItYW5kLWRlY2VtYmVyLTIwMjMv MTM5MjQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3 c2xldHRlci1ub3ZlbWJlci1hbmQtZGVjZW1iZXItMjAyMy8xMzkyNC8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkNDc0N2M3IiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnZDQ3NDdjNyI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkNDc0N2M3Ij4NCjxwPldl bGNvbWUgdG8gdGhlIGVpZ2h0aCBlZGl0aW9uIG9mIHRoZSBPQ2FtbCBQbGF0Zm9ybSBuZXdzbGV0 dGVyISA8L3A+DQo8cD5JbiB0aGlzIE5vdmVtYmVyIGFuZCBEZWNlbWJlciBlZGl0aW9uLCB3ZSBh cmUgZXhjaXRlZCB0byBicmluZyB5b3UgdGhlIGxhdGVzdCBvbiB0aGUgT0NhbWwgUGxhdGZvcm0s IGNvbnRpbnVpbmcgb3VyIHRyYWRpdGlvbiBvZiBoaWdobGlnaHRpbmcgcmVjZW50IGRldmVsb3Bt ZW50cyBhcyBzZWVuIGluDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3RhZy9w bGF0Zm9ybS1uZXdzbGV0dGVyIj5wcmV2aW91cyBlZGl0aW9uczwvYT4uIFRvIHVuZGVyc3RhbmQg dGhlIGRpcmVjdGlvbiB3ZeKAmXJlIGhlYWRlZCwgZXNwZWNpYWxseSByZWdhcmRpbmcgZGV2ZWxv cG1lbnQgd29ya2Zsb3dzIGFuZCB1c2VyIGV4cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBv dXQgb3VyDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAi PnJvYWRtYXA8L2E+LiA8L3A+DQo8cD48Yj5IaWdobGlnaHRzOjwvYj4gPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPlRoZSA8Y29kZT5vZG9jPC9jb2RlPiB0ZWFtIGlzIHN0YXJ0aW5nIHdv cmsgb24gaW1wcm92aW5nIDxjb2RlPm9kb2M8L2NvZGU+IHBlcmZvcm1hbmNlcy4gQWZ0ZXIgc2hp cHBpbmcgaW1wb3J0YW50IGZlYXR1cmVzLCBpbmNsdWRpbmcgYSBsaW5rIHRvIHNvdXJjZSBjb2Rl LCBzeW50YXggZm9yIHRhYmxlcywgYW5kIHJlY2VudCBzdXBwb3J0IGZvciBzZWFyY2gsIHRoZXkg YXJlIHR1cm5pbmcgdGhlaXIgZm9jdXMgb24gY29uc29saWRhdGluZw0KIHRoZSBmdWxsIGRvY3Vt ZW50YXRpb24gZ2VuZXJhdGlvbiBzdGFjayAoaW5jbHVkaW5nIER1bmUgcnVsZXMgYW5kIGludGVn cmF0aW9uIHdpdGggT0NhbWwub3JnIHBhY2thZ2UgZG9jcykgYW5kIGltcHJvdmluZyBwZXJmb3Jt YW5jZXMuDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAy My0xMS0xNS1vcGFtLTItMi0wLWFscGhhMyI+b3BhbSAyLjJ+YWxwaGEzIGlzIG91dDwvYT4hIEl0 IGlzIHRoZSBsYXN0IGFscGhhIHJlbGVhc2UsIGFuZCB0aGUgb3BhbSB0ZWFtIHBsYW5zIHRvIHN0 YXJ0IHRoZSBiZXRhIHJlbGVhc2UgbmV4dCBjeWNsZS4NCjwvbGk+PGxpPkFudGljaXBhdGluZyBv biB0aGUgSmFudWFyeSB1cGRhdGUsIHRoZSBjb21waWxlciBQUiBuZWNlc3NhcnkgZm9yIE1lcmxp biBwcm9qZWN0LXdpZGUgcmVmZXJlbmNlcyBoYXMgYmVlbiBtZXJnZWQhIFRoaXMgd2lsbCBiZSBw YXJ0IG9mIE9DYW1sIDUuMiwgbWVhbmluZyB0aGF0IHN0YXJ0aW5nIHdpdGggdGhlIG5leHQgY29t cGlsZXIgdmVyc2lvbiwgT0NhbWwgZGV2ZWxvcGVycyB3aWxsIGJlIGFibGUgdG8gcXVlcnkgZm9y IHByb2plY3Qtd2lkZQ0KIHJlZmVyZW5jZXMgKGFuZCBsaW1pdGVkIHN1cHBvcnQgZm9yIHByb2pl Y3Qtd2lkZSByZW5hbWUhKSBpbiB0aGVpciBwcm9qZWN0cy4gUmVhZCBtb3JlDQo8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXByZXZpZXctcGxheS13aXRoLXByb2plY3Qt d2lkZS1vY2N1cnJlbmNlcy1mb3Itb2NhbWwvMTM4MTQiPg0KaGVyZTwvYT4gdG8ga25vdyBob3cg eW91IGNhbiB0ZXN0IHRoZSBmZWF0dXJlLiA8L2xpPjwvdWw+DQo8cD48Yj5SZWxlYXNlczo8L2I+ IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9y Zy9jaGFuZ2Vsb2cvMjAyMy0xMi0xNC1vZG9jLTIuNC4wIj5PZG9jIDIuNC4wPC9hPiA8L2xpPjxs aT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyMy0xMi0xOC1vY2FtbC1s c3AtMS4xNy4wIj5PQ2FtbCBMU1AgMS4xNy4wPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjMtMTItMDYtbWVybGluLTQuMTMiPk1lcmxpbiA0LjEz PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyMy0x MS0yOS1kdW5lLTMuMTIuMSI+RHVuZSAzLjEyLjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDIzLTExLTE1LW9wYW0tMi0yLTAtYWxwaGEzIj5vcGFt IDIuMi4wfmFscGhhMzwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNTNlYmY1YSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzUzZWJm NWEiPjxiPltEdW5lXTwvYj4gRXhwbG9yaW5nIFBhY2thZ2UgTWFuYWdlbWVudCBpbiBEdW5lICg8 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzQtYnVpbGQt YS1wcm9qZWN0Ij5XNDwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmc1M2ViZjVhIj4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHJncmluYmVyZyAo VGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJViAoVGFyaWRlcyksIEBncmlkYnVncyAoVGFyaWRl cyksIEBraXQtdHkta2F0ZSAoVGFyaWRlcyksIEBBbGl6dGVyDQo8L3A+DQo8cD48Yj5XaHk6PC9i PiBVbmlmeSBPQ2FtbCB0b29saW5nIHVuZGVyIGEgc2luZ2xlIGNvbW1hbmQgbGluZSBmb3IgYWxs IGRldmVsb3BtZW50IHdvcmtmbG93cy4gVGhpcyBhZGRyZXNzZXMgb25lIG9mIHRoZSBtb3N0IGlt cG9ydGFudCBwYWluIHBvaW50cw0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9v bWJhMWQ4dmhsam5yY24vT0NhbWwtdXNlci1zdXJ2ZXktMjAyMC5wZGY/ZGw9MCI+DQpyZXBvcnRl ZCBieSB0aGUgY29tbXVuaXR5PC9hPi4gPC9wPg0KPHA+PGI+V2hhdDo8L2I+IFByb3RvdHlwaW5n IHRoZSBpbnRlZ3JhdGlvbiBvZiBwYWNrYWdlIG1hbmFnZW1lbnQgaW50byBEdW5lIHVzaW5nIG9w YW0gYXMgYSBsaWJyYXJ5LiBXZeKAmXJlIGludHJvZHVjaW5nIGENCjxjb2RlPmR1bmUgcGtnIGxv Y2s8L2NvZGU+IGNvbW1hbmQgdG8gZ2VuZXJhdGUgYSBsb2NrIGZpbGUgYW5kIGVuaGFuY2luZyA8 Y29kZT5kdW5lIGJ1aWxkPC9jb2RlPiB0byBoYW5kbGUgZGVwZW5kZW5jaWVzIGluIHRoZSBsb2Nr IGZpbGUuIE1vcmUgZGV0YWlscyBpbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9kdW5lL2lzc3Vlcy83NjgwIj5EdW5lIFJGQzwvYT4uIDwvcD4NCjxwPjxiPkFjdGl2aXRp ZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW50cm9kdWNlZCBhIGxvY2tp bmcgbWVjaGFuaXNtIHRvIHByZXZlbnQgY29uZmxpY3RzIGluIG11bHRpcGxlIHJlcG9zaXRvcmll cyBhbmQgZml4ZWQgYSBidWcgaW4gRHVuZeKAmXMgbG9ja2luZyBjb2RlLiDigJMNCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTE0MCI+b2NhbWwvZHVuZSM5MTQw PC9hPiA8L2xpPjxsaT5FbmFibGVkIHByb2plY3QgbG9ja2luZyB3aXRob3V0IGEgbmV0d29yayBj b25uZWN0aW9uIHVzaW5nIGxvY2FsbHkgY2FjaGVkIDxjb2RlPg0Kb3BhbS1yZXBvc2l0b3J5PC9j b2RlPi4g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTIw MiI+b2NhbWwvZHVuZSM5MjAyPC9hPg0KPC9saT48bGk+RW5oYW5jZWQgaGFuZGxpbmcgb2YgPGNv ZGU+b3BhbS1yZXBvc2l0b3JpZXM8L2NvZGU+IHdpdGggbm9uLXN0YW5kYXJkIGNvbnRlbnRzIChu b24tZmlsZSBvYmplY3RzKS4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9wdWxsLzkzNTIiPm9jYW1sL2R1bmUjOTM1MjwvYT4gPC9saT48bGk+QWRkZWQgYSBmZWF0 dXJlIHdoZXJlIHVzZXJzIGNhbiBzZXQgYXJiaXRyYXJ5IHZhcmlhYmxlcyB3aGljaCBjYW4gYmUg cmVmZXJyZWQgdG8gYnkgb3BhbSBwYWNrYWdlcyB3aGlsZSBzb2x2aW5nIGEgcHJvamVjdOKAmXMg ZGVwZW5kZW5jaWVzLiBUaGlzIGdpdmVzIHVzZXJzIG1vcmUgY29udHJvbCBvdmVyIGRlY2lzaW9u cyBtYWRlIGJ5IHRoZSBzb2x2ZXIgYW5kIHdoaWNoIGRlcGVuZGVuY2llcyB0aGVpciBwcm9qZWN0 IGVuZHMgdXAgaGF2aW5nDQogaW4gaXRzIDxjb2RlPmxvY2tkaXI8L2NvZGU+LiDigJMgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85MzI1Ij4NCm9jYW1sL2R1bmUj OTMyNTwvYT4gPC9saT48bGk+RW5zdXJlZCA8Y29kZT5sb2NrZGlyPC9jb2RlPiBjb250YWlucyBh bGwgZGVwZW5kZW5jaWVzIG9mIGxvY2FsIHBhY2thZ2VzIGZvciBjb25zaXN0ZW5jeS4gVGhpcyBw cmV2ZW50cyBEdW5lIGZyb20gcHJlc2VudGluZyBpbmNvbnNpc3RlbnQgaW5mb3JtYXRpb24gdG8g dXNlcnMgd2hvIGhhdmUgY2hhbmdlZCB0aGVpciBwcm9qZWN04oCZcyBkZXBlbmRlbmNpZXMgYWZ0 ZXIgY3JlYXRpbmcgYQ0KPGNvZGU+bG9ja2RpcjwvY29kZT4uIEluc3RlYWQsIHRoZXnigJlsbCBi ZSBwcm9tcHRlZCB0byByZWNvbXB1dGUgdGhlaXIgPGNvZGU+bG9ja2RpcjwvY29kZT4uIOKAkw0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85MTU2Ij5vY2FtbC9k dW5lIzkxNTY8L2E+IDwvbGk+PGxpPkFiaWxpdHkgdG8gZGV0ZWN0IHdoaWNoIGRlcGVuZGVuY2ll cyBpbiB0aGUgPGNvZGU+bG9ja2RpcjwvY29kZT4gYXJlIG9ubHkgbmVlZGVkIHdoZW4gYnVpbGRp bmcgdGVzdHMuIFRoaXMgd2lsbCBiZSBuZWNlc3NhcnkgdG8gYWxsb3cgdXNlcnMgdG8gc2tpcCBk b3dubG9hZGluZyBhbmQgYnVpbGRpbmcgcGFja2FnZXMgdGhhdCBhcmUgb25seSBuZWVkZWQgZm9y IHRlc3RpbmcgdW5sZXNzIHRoZXkgYXJlIHJ1bm5pbmcgdGVzdHMuIOKAkw0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85MDk1Ij5vY2FtbC9kdW5lIzkwOTU8L2E+ IDwvbGk+PGxpPkltcHJvdmVkIHN1cHBvcnQgZm9yIFdpbmRvd3MsIGZvY3VzaW5nIG9uIGJldHRl ciBDdXJsIGludGVncmF0aW9uIGFuZCBvcGFtIGxpYnJhcnkgYWRqdXN0bWVudHMgZm9yIFdpbmRv d3MgYXJjaGl0ZWN0dXJlcy4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9wdWxsLzkyNTIiPm9jYW1sL2R1bmUjOTI1MjwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTA0OCI+DQpvY2FtbC9kdW5lIzkwNDg8L2E+IDwvbGk+ PGxpPlJlZmluZWQgY29udGV4dC9sb2NrIGZpbGUgaGFuZGxpbmcgaW4gRHVuZSBwYWNrYWdlIG1h bmFnZW1lbnQuIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxs LzkzNDMiPg0Kb2NhbWwvZHVuZSM5MzQzPC9hPiA8L2xpPjxsaT5SZWZpbmVkIGNvbnRleHQvbG9j ayBmaWxlIGhhbmRsaW5nLiBCZWZvcmUgZWFjaCBjb250ZXh0IGhhZCBhbiBhc3NvY2lhdGVkIGxv Y2sgZmlsZSBzbyBsb2NrIGZpbGVzIHdlcmUgc2VsZWN0ZWQgdmlhIGNvbnRleHQgYXJndW1lbnRz LiBOb3cgdGhlIGNvbnRleHQgbWlkZGxlbWVuIGhhdmUgYmVlbiByZW1vdmVkIGFuZCB0aGUgdXNl cnMgc2VsZWN0cyBsb2NrIGZpbGVzIGJ5IHNwZWNpZnlpbmcgdGhlIGxvY2tmaWxlIGl0c2VsZi4g VGhpcyBhcHBsaWVzDQogdG8gbW9zdCBwa2cgcmVsYXRlZCBjb21tYW5kcy4g4oCTIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTM0MyI+DQpvY2FtbC9kdW5lIzkz NDM8L2E+IDwvbGk+PGxpPkFkZGVkIHN1cHBvcnQgZm9yIHRoZSA8Y29kZT5jb25mbGljdHM8L2Nv ZGU+IGZpZWxkIGluIG9wYW0gZmlsZXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9kdW5lL3B1bGwvOTM0MCI+DQpvY2FtbC9kdW5lIzkzNDA8L2E+IDwvbGk+PGxpPkxvb2tl ZCBpbnRvIHNvbHV0aW9ucyB0byBhZGQgc3VwcG9ydCBmb3IgZGVwdG9wcyDigJMgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NDMwIj4NCm9jYW1sL2R1bmUjOTQz MDwvYT4gPC9saT48bGk+V3JpdGluZyB0aGUgUElEIG9mIHByb2Nlc3MgdGhhdCBjcmVhdGVkIHRo ZSBsb2NrIGZpbGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85 Mjk1Ij4NCm9jYW1sL2R1bmUjOTI5NTwvYT4gdG8gYmUgYWJsZSB0byBlYXNpbHkgZGV0ZXJtaW5l IHdoaWNoIHByb2Nlc3MgaXMgaG9sZGluZyB0aGUgcmV2aXNpb24gc3RvcmUgbG9jaw0KPC9saT48 bGk+QXZvaWQgR2l0IHRyYW5zbGF0aW5nIGl0cyBDTEkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL2R1bmUvcHVsbC85MzkwIj4NCm9jYW1sL2R1bmUjOTM5MDwvYT4uIFNpbmNlIHdl IHVzZSB0aGUgR2l0IGJpbmFyeSB1bmRlciB0aGUgaG9vZCwgdXNlcnMgd2l0aCBkaWZmZXJlbnQg bG9jYWxlcyBtaWdodCBnZXQgdHJhbnNsYXRlZCBHaXQgb3V0cHV0LiBTaW5jZSBvdXIgR2l0IG91 dHB1dCBpcyBub3Qgc2hvd24gdG8gdGhlIHVzZXIsIHdlIGRpc2FibGUgdHJhbnNsYXRpb24uDQo8 L2xpPjxsaT5SZW1vdmUgPGNvZGU+b3BhbS1yZXBvc2l0b3J5LXVybDwvY29kZT4gb3B0aW9uIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTM3MyI+DQpvY2FtbC9k dW5lIzkzNzM8L2E+IFJlbW92ZXMgYWxsIENMSSBvcHRpb25zIHRoYXQgZGVhbCB3aXRoIHJlcG9z aXRvcmllcy4gQWxsIDxjb2RlPg0Kb3BhbS1yZXBvc2l0b3JpZXM8L2NvZGU+IGFyZSBub3cgY29u dHJvbGxlZCBpbiB0aGUgPGNvZGU+ZHVuZS13b3Jrc3BhY2U8L2NvZGU+IGZpbGUuDQo8L2xpPjxs aT5TdXBwb3J0IGZvciBzcGVjaWZ5aW5nIHBhcnRpY3VsYXIgYnJhbmNoZXMvY29tbWl0cyBmb3Ig cmVwb3MgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85MjQxIj4N Cm9jYW1sL2R1bmUjOTI0MTwvYT4gYWRkcyBzdXBwb3J0IGZvciBzcGVjaWZ5aW5nIGJyYW5jaGVz IGFuZCBjb21taXRzIGFzIDxjb2RlPm9wYW0tcmVwb3NpdG9yeTwvY29kZT4gc291cmNlcywgc28g dGhlIHVzZXIgY2FuIGZpeCBvbmUgcGFydGljdWxhciBzdGF0ZSBvZg0KPGNvZGU+b3BhbS1yZXBv c2l0b3J5PC9jb2RlPiA8L2xpPjxsaT5FbmFibGUgY2hlY2tpbmcgb3V0IHRhZ3MgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NDcxIj5vY2FtbC9kdW5lIzk0NzE8 L2E+IGFkZHMgdGhlIHNhbWUgc3VwcG9ydCBhcyBhYm92ZSBidXQgZm9yIHRhZ3MuIEl0IGRvZXMg c28gYnkgc2F2aW5nIHRoZSB0YWdzIGluIHBlci1yZW1vdGUgbmFtZXNwYWNlcywgdGh1cyBpdCB3 b3JrcyB2ZXJ5IG11Y2ggbGlrZSBicmFuY2hlcy4NCjwvbGk+PGxpPkltcGxlbWVudCBkb3dubG9h ZGluZyBzb3VyY2VzIHZpYSBHaXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvcHVsbC85NTA2Ij4NCm9jYW1sL2R1bmUjOTUwNjwvYT4gZW5hYmxlcyBjbG9uaW5nIHNvdXJj ZSBkaXJlY3RvcmllcyB2aWEgdGhlIHJldiBzdG9yZSwgdGh1cyBjYWNoaW5nIG1vc3QgY29tbWl0 cyB3aGVuIHdvcmtpbmcgd2l0aCBtdWx0aXBsZSBwcm9qZWN0cyBmcm9tIHRoZSBzYW1lIHJlcG8s IGV0Yy4NCjwvbGk+PGxpPlJlYWQgdGhlIG1haW4gYnJhbmNoIGNvcnJlY3RseSBldmVuIGlmIHRh Z3MgZXhpc3QgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NTQ5 Ij4NCm9jYW1sL2R1bmUjOTU0OTwvYT4gZml4ZXMgYW4gaXNzdWUgd2hlcmUgdGhlIGNvZGUgdGhh dCBkZXRlcm1pbmVzIHRoZSB0cmFja2luZyBicmFuY2ggZ290IGNvbmZ1c2VkIGluIHRoZSBwcmVz ZW5jZSBvZiBuYW1lc3BhY2VkIHRhZ3MuDQo8L2xpPjxsaT5EdW5lIHdpbGwgY29tcHV0ZSBjaGVj a3N1bXMgZm9yIGxvY2sgZmlsZXMgb2YgcGFja2FnZXMgd2hpY2ggZG9u4oCZdCBhbHJlYWR5IGhh dmUgY2hlY2tzdW1zIGluIHRoZWlyIG9wYW0gbWV0YWRhdGEuIOKAkw0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85Mzg0Ij5vY2FtbC9kdW5lIzkzODQ8L2E+IDwv bGk+PGxpPlBhY2thZ2UgbWV0YWRhdGEgZm9yIGEgRHVuZSBwcm9qZWN0IGNhbiBiZSByZWFkIGZy b20gPGNvZGU+Lm9wYW08L2NvZGU+IGZpbGVzIHJhdGhlciB0aGFuDQo8Y29kZT5kdW5lLXByb2pl Y3Q8L2NvZGU+IOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxs Lzk0MTgiPm9jYW1sL2R1bmUjOTQxODwvYT4NCjwvbGk+PGxpPlN1cHBvcnQgZm9yIGNvbmZsaWN0 IGNsYXNzZXMgaW4gb3BhbSBmaWxlcyBmb3IgdGhlIHNvbHZlciDigJMgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85NDQyIj4NCm9jYW1sL2R1bmUjOTQ0MjwvYT4g PC9saT48bGk+VGhlIGFiaWxpdHkgdG8gYWRkIGFkZGl0aW9uYWwgY29uc3RyYWludHMgdG8gZmVl ZCB0aGUgc29sdmVyIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9w dWxsLzkzMzciPg0Kb2NhbWwvZHVuZSM5MzM3PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNWFhNmQwNCIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzVhYTZkMDQiPjxiPltvcGFtXTwvYj4gTmF0aXZlIFN1cHBvcnQgZm9y IFdpbmRvd3MgaW4gb3BhbSAyLjIgKDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxh dGZvcm0tcm9hZG1hcCN3NS1tYW5hZ2UtZGVwZW5kZW5jaWVzIj5XNTwvYT4pPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc1YWE2ZDA0Ij4NCjxwPjxiPkNvbnRy aWJ1dGVkIGJ5OjwvYj4gQHJqYm91IChPQ2FtbFBybyksIEBraXQtdHkta2F0ZSAoVGFyaWRlcyks IEBkcmEyNyAoVGFyaWRlcyksIEBBbHRHciAoT0NhbWxQcm8pDQo8L3A+DQo8cD48Yj5XaHk6PC9i PiBFbmhhbmNlIE9DYW1s4oCZcyB2aWFiaWxpdHkgb24gV2luZG93cyBieSBpbnRlZ3JhdGluZyBu YXRpdmUgb3BhbSBhbmQNCjxjb2RlPm9wYW0tcmVwb3NpdG9yeTwvY29kZT4gc3VwcG9ydCwgZm9z dGVyaW5nIGEgbGFyZ2VyIGNvbW11bml0eSBhbmQgbW9yZSBXaW5kb3dzLWZyaWVuZGx5IHBhY2th Z2VzLg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+IFJlbGVhc2luZyBvcGFtIDIuMiB3aXRoIG5hdGl2 ZSBXaW5kb3dzIHN1cHBvcnQsIG1ha2luZyB0aGUgb2ZmaWNpYWwNCjxjb2RlPm9wYW0tcmVwb3Np dG9yeTwvY29kZT4gdXNhYmxlIG9uIFdpbmRvd3MgcGxhdGZvcm1zLiA8L3A+DQo8cD48Yj5BY3Rp dml0aWVzOjwvYj4gPGk+RlJPTSBLQVRFPC9pPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+V2XigJl2ZSByZWxlYXNlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS9yZWxlYXNlcy90YWcvMi4yLjAtYWxwaGEzIj4NCm9wYW0gMi4yLjB+YWxwaGEzPC9hPiwgYSBj dWxtaW5hdGlvbiBvZiB0aGUgbGFzdCA0IG1vbnRocyBvZiB3b3JrLiBUaGlzIHJlbGVhc2UsIGFt b25nc3Qgb3RoZXIgZml4ZXMgYW5kIGltcHJvdmVtZW50cywgYWRkcyBhIG5ldw0KPGNvZGU+eC1l bnYtcGF0aC1yZXdyaXRlPC9jb2RlPiBmaWVsZCBuZWNlc3NhcnkgZm9yIFdpbmRvd3Mgc3VwcG9y dC4gLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzU2MzYiPg0K IzU2MzY8L2E+IDwvbGk+PGxpPldl4oCZdmUgYWxzbyBmaXhlZCBhIG51bWJlciBvZiBpc3N1ZXMg b24gV2luZG93czoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaXggaXNzdWVzIGluIHRoZSBD IHN0dWJzIGZvciBXaW5kb3dzIC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0vcHVsbC81NzE0Ij4NCiM1NzE0PC9hPiA8L2xpPjxsaT5GaXggaW5jb3JyZWN0IGVycm9yIG1l c3NhZ2UgaW4gY29uZmlndXJlIG9uIFdpbmRvd3MgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb3BhbS9wdWxsLzU2NjciPg0KIzU2Njc8L2E+IDwvbGk+PGxpPkFsd2F5cyByZXNv bHZlIHRoZSBmdWxscGF0aCB0byB0aGUgPGNvZGU+Y3lncGF0aDwvY29kZT4gZXhlY3V0YWJsZSAt IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTcxNiI+DQojNTcx NjwvYT4gPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2NlMTBhNDkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJv cmdjZTEwYTQ5Ij48Yj5b4oCLPGNvZGU+b2RvYzwvY29kZT7igItdPC9iPiBBZGQgU2VhcmNoIENh cGFiaWxpdGllcyB0byA8Y29kZT4NCm9kb2M8L2NvZGU+ICg8YSBocmVmPSJodHRwczovL29jYW1s Lm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzI1LWdlbmVyYXRlLWRvY3VtZW50YXRpb24iPlcy NTwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjZTEw YTQ5Ij4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHBhbmdsZXNkIChUYXJpZGVzKSwgQEVt aWxlVHJvdGlnbm9uIChUYXJpZGVzKSwgQGp1bG93IChUYXJpZGVzKSwgQGpvbmx1ZGxhbSAoVGFy aWRlcykNCjwvcD4NCjxwPjxiPldoeTo8L2I+IEltcHJvdmUgdXNhYmlsaXR5IGFuZCBuYXZpZ2Fi aWxpdHkgaW4gT0NhbWwgcGFja2FnZXMgZG9jdW1lbnRhdGlvbiwgYm90aCBsb2NhbGx5IGFuZCBv biBPQ2FtbC5vcmcsIGJ5IG9mZmVyaW5nIGFkdmFuY2VkIHNlYXJjaCBvcHRpb25zIGxpa2UgdHlw ZS1iYXNlZCBxdWVyaWVzLg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+IEltcGxlbWVudGluZyBhIHNl YXJjaCBlbmdpbmUgaW50ZXJmYWNlIGluIDxjb2RlPm9kb2M8L2NvZGU+LCBjb21wbGV0ZSB3aXRo IGEgVUkgYW5kIGEgc2VhcmNoIGluZGV4LiBBZGRpdGlvbmFsbHksIHdl4oCZcmUgZGV2ZWxvcGlu ZyBhIGRlZmF1bHQgY2xpZW50LXNpZGUgc2VhcmNoIGVuZ2luZSBiYXNlZCBvbiBTaGVybG9kb2Mu DQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPGk+RlJPTSBFTUlMRTwvaT4gPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPkFmdGVyIG1lcmdpbmcgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29kb2MvcHVsbC85NzIiPnRoZSBQUiB0aGF0IGFkZGVkIHN1cHBvcnQgZm9y IHNlYXJjaCB0bw0KPGNvZGU+b2RvYzwvY29kZT48L2E+IGluIE9jdG9iZXIsIHdlIGNvbnRpbnVl ZCB3b3JrIG9uIGJ1aWxkaW5nIGFuIDxjb2RlPm9kb2M8L2NvZGU+LWNvbXBhdGlibGUgc2VhcmNo IGVuZ2luZSBiYXNlZCBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9kb2Muc2hlcmxvY29kZS5jb20vIj5T aGVybG9kb2M8L2E+LiBUaGlzIHdpbGwgZ2l2ZSBhIHNlYXJjaCBlbmdpbmUgd2l0aCB0eXBlLWJh c2VkIHNlYXJjaCBmb3IgZXZlcnkgcGFja2FnZSB0aGF0IHVzZXMNCjxjb2RlPm9kb2M8L2NvZGU+ LiBUaGUgcGxhbiBpcyB0byBtYWtlIFNoZXJsb2RvYyB0aGUgc2VhcmNoIGVuZ2luZSBpbiBEdW5l 4oCZcyBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24uIFlvdSBjYW4gdHJ5IGFuIGVhcmx5IGRlbW8g b24NCjxhIGhyZWY9Imh0dHBzOi8vYXJ0LXcuZ2l0aHViLmlvL3ZhcnJheS92YXJyYXkvVmFycmF5 Ij5WYXJyYXnigJlzIGRvYzwvYT4g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcnQt dy9zaGVybG9kb2MvcHVsbC80Ij4NCmFydC13L3NoZXJsb2RvYyM0PC9hPiA8L2xpPjxsaT5CdWlk aW5nIG9uIDxjb2RlPm9kb2M8L2NvZGU+4oCZcyBzdXBwb3J0IGZvciBzZWFyY2gsIHdlIG1lcmdl ZCBhIFBSIHRoYXQgYWRkcyBvY2N1cnJlbmNlcyBpbmZvcm1hdGlvbiB0byB0aGUgc2VhcmNoIGlu ZGV4LiBUaGlzIHdpbGwgYWxsb3dzDQo8Y29kZT5vZG9jPC9jb2RlPiBzZWFyY2ggZW5naW5lcyB0 byBpbXByb3ZlIHRoZSBvcmRlciBvZiBzZWFyY2ggcmVzdWx0cyBieSB1c2luZyB0aGUgbnVtYmVy IG9mIG9jY3VyZW5jZXMuIOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29k b2MvcHVsbC85NzYiPm9jYW1sL29kb2MjOTc2PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjBmNDE2MiIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzIwZjQxNjIiPjxiPlvigIs8Y29kZT5vZG9jPC9jb2RlPuKAi108L2I+ IFN5bnRheCBmb3IgSW1hZ2VzIGFuZCBBc3NldHMgaW4gPGNvZGU+DQpvZG9jPC9jb2RlPiAoPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwI3cyNS1nZW5lcmF0 ZS1kb2N1bWVudGF0aW9uIj5XMjU8L2E+KTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NCIgaWQ9InRleHQtb3JnMjBmNDE2MiI+DQo8cD48Yj5Db250cmlidXRlZCBieTo8L2I+IEBwYW5n bGVzZCAoVGFyaWRlcyksIEBqb25sdWRsYW0gKFRhcmlkZXMpLCBAZGJ1ZW56bGksIEBncGV0aW90 IChUYXJpZGVzKQ0KPC9wPg0KPHA+PGI+V2h5OjwvYj4gRW1wb3dlciBwYWNrYWdlIGF1dGhvcnMg dG8gY3JlYXRlIHJpY2gsIGVuZ2FnaW5nIGRvY3VtZW50YXRpb24gYnkgZW5hYmxpbmcgdGhlIGlu dGVncmF0aW9uIG9mIG11bHRpbWVkaWEgZWxlbWVudHMgZGlyZWN0bHkgaW50byBPQ2FtbCBwYWNr YWdlIGRvY3VtZW50YXRpb24uDQo8L3A+DQo8cD48Yj5XaGF0OjwvYj4gV2XigJlyZSBpbnRyb2R1 Y2luZyBuZXcgc3ludGF4IGFuZCBzdXBwb3J0IGZvciBlbWJlZGRpbmcgbWVkaWEgKGltYWdlcywg YXVkaW8sIHZpZGVvcykgYW5kIGhhbmRsaW5nIGFzc2V0cyB3aXRoaW4gdGhlDQo8Y29kZT5vZG9j PC9jb2RlPiBlbnZpcm9ubWVudC4gPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BZGRlZCBhc3NldHMgaW4gdGhlIGVudmlyb25tZW50IHRv IHRyZWF0IHRoZW0gc2ltaWxhcmx5IGFzIG90aGVyIHJlc29sdmFibGUgZWxlbWVudHMuIFRoaXMg YWRkcmVzc2VkIHRoZSByZW1haW5pbmcgZmVlZGJhY2sgZnJvbSByZXZpZXdzLCBhbmQgaWYgbm8g b3RoZXIgYmxvY2tlciBpcyBmb3VuZCwgdGhlIFBSIHNob3VsZCBiZSByZWFkeSB0byBtZXJnZS4g 4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMDIiPm9j YW1sL29kb2MjMTAwMjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2VhNWEyZTMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJv cmdlYTVhMmUzIj48Yj5b4oCLPGNvZGU+b2RvYzwvY29kZT7igItdPC9iPiBJbXByb3ZpbmcgPGNv ZGU+b2RvYzwvY29kZT4gUGVyZm9ybWFuY2UgKDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Rv Y3MvcGxhdGZvcm0tcm9hZG1hcCN3MjUtZ2VuZXJhdGUtZG9jdW1lbnRhdGlvbiI+VzI1PC9hPik8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2VhNWEyZTMiPg0K PHA+PGI+Q29udHJpYnV0ZWQgYnk6PC9iPiBAam9ubHVkbGFtIChUYXJpZGVzKSwgQGp1bG93IChU YXJpZGVzKSwgQGdwZXRpb3QgKFRhcmlkZXMpDQo8L3A+DQo8cD48Yj5XaHk6PC9iPiBBZGRyZXNz IHBlcmZvcm1hbmNlIGlzc3VlcyBpbiA8Y29kZT5vZG9jPC9jb2RlPiwgcGFydGljdWxhcmx5IGZv ciBsYXJnZS1zY2FsZSBkb2N1bWVudGF0aW9uLCB0byBlbmhhbmNlIGVmZmljaWVuY3kgYW5kIHVz ZXIgZXhwZXJpZW5jZSwgYW5kIHVubG9jayBsb2NhbCBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24g aW4gbGFyZ2UgY29kZSBiYXNlcy4NCjwvcD4NCjxwPjxiPldoYXQ6PC9iPiBQcm9maWxpbmcgPGNv ZGU+b2RvYzwvY29kZT4gdG8gaWRlbnRpZnkgdGhlIG1haW4gcGVyZm9ybWFuY2UgYm90dGxlbmVj a3MsIGFuZCBvcHRpbWlzaW5nDQo8Y29kZT5vZG9jPC9jb2RlPiB3aXRoIHRoZSBmaW5kaW5ncy4g PC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5FeHBlcmltZW50ZWQgd2l0aCBkaWZmZXJlbnQgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBhbGdvcml0 aG1zIGZvciBtb3JlIGVmZmljaWVudCBkb2N1bWVudGF0aW9uIGdlbmVyYXRpb24gb24gbGFyZ2Ug ZmlsZXMuIC0tPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2MvcHVsbC8xMDMz Ij5vY2FtbC9vZG9jIzEwMzM8L2E+LA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29kb2MvcHVsbC8xMDM2Ij5vY2FtbC9vZG9jIzEwMzY8L2E+LCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwNDkiPg0Kb2NhbWwvb2RvYyMxMDQ5PC9hPiA8L2xp PjxsaT5JbXBsZW1lbnRlZCBpdGVtIGxvb2t1cCBpbXByb3ZlbWVudHMgaW4gc2lnbmF0dXJlcyBm b3IgZmFzdGVyIHByb2Nlc3NpbmcuIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2RvYy9wdWxsLzEwNDkiPg0Kb2NhbWwvb2RvYyMxMDQ5PC9hPiA8L2xpPjxsaT5EZXZlbG9w ZWQgYSBmaXggZm9yIG1lbW9yeSBpc3N1ZXMgY2F1c2VkIGJ5IDxjb2RlPm1vZHVsZSB0eXBlIG9m PC9jb2RlPiBleHByZXNzaW9ucywgd2l0aCBwcm9taXNpbmcgcmVzdWx0cyBmcm9tIHRlc3Rpbmcg YXQgSmFuZSBTdHJlZXQuIOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29k b2MvcHVsbC8xMDQyIj5vY2FtbC9vZG9jIzEwNDI8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0YWQ0NmQ3IiBjbGFzcz0ib3V0bGlu ZS00Ij4NCjxoNCBpZD0ib3JnNGFkNDZkNyI+PGI+W0R1bmVdPC9iPiBHZW5lcmF0ZSBEZXBlbmRl bmNpZXMgRG9jdW1lbnRhdGlvbiB3aXRoIER1bmUgKDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3MjUtZ2VuZXJhdGUtZG9jdW1lbnRhdGlvbiI+VzI1PC9h Pik8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzRhZDQ2ZDci Pg0KPHA+PGI+Q29udHJpYnV0ZWQgYnk6PC9iPiBAam9ubHVkbGFtIChUYXJpZGVzKSA8L3A+DQo8 cD48Yj5XaHk6PC9iPiBFbmhhbmNlIHRoZSB1c2FiaWxpdHkgb2YgbG9jYWxseS1nZW5lcmF0ZWQg ZG9jdW1lbnRhdGlvbiBieSBwcm92aWRpbmcgZGlyZWN0IGFjY2VzcyB0byBkZXBlbmRlbmNpZXPi gJkgZG9jdW1lbnRhdGlvbi4NCjwvcD4NCjxwPjxiPldoYXQ6PC9iPiBJbXBsZW1lbnRpbmcgbmV3 IER1bmUgcnVsZXMgZm9yIDxjb2RlPm9kb2M8L2NvZGU+IHRvIGVuYWJsZSBlZmZpY2llbnQgZG9j dW1lbnRhdGlvbiBnZW5lcmF0aW9uIGFuZCBhY2Nlc3MgdG8gZG9jdW1lbnRhdGlvbiBmb3IgYWxs IG9wYW0gcGFja2FnZXMgaW4geW91ciBzd2l0Y2guDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwv Yj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBuZXcgRHVuZSBydWxlcyBoYXZl IGJlZW4gbWVyZ2VkIGFuZCBhcmUgYXZhaWxhYmxlIGluIHRoZSBuZXdlc3QgcmVsZWFzZSBvZiBE dW5lIDMuMTIuMS4gVHJ5IHJ1bm5pbmcNCjxjb2RlPmR1bmUgYnVpbGQgQGRvYy1uZXc8L2NvZGU+ IHRvIGdlbmVyYXRlIHlvdXIgZG9jdW1lbnRhdGlvbiBhbmQgdGVsbCB1cyB3aGF0IHlvdSB0aGlu ayEg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg4MDMi Pm9jYW1sL2R1bmUjODgwMzwvYT4gPC9saT48bGk+U2hvcnRseSBhZnRlciB0aGUgcmVsZWFzZSwg d2Ugbm90aWNlZCBhbiBpc3N1ZXMgd2l0aCBkZXBlbmRlbmN5IGhhbmRsaW5nLiBXZeKAmXJlIHdv cmtpbmcgb24gYSBmaXggdGhhdCBzaG91bGQgYmUgcmVsZWFzZWQg4oCTDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzk0NjEiPm9jYW1sL2R1bmUjOTQ2MTwvYT4g PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Zzk0NzgyZWIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc5NDc4MmViIj48Yj5bTWVy bGluXTwvYj4gU3VwcG9ydCBmb3IgUHJvamVjdC1XaWRlIFJlZmVyZW5jZXMgaW4gTWVybGluICg8 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzE5LW5hdmln YXRlLWNvZGUiPlcxOTwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmc5NDc4MmViIj4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHZvb2Rvb3MgKFRh cmlkZXMpLCBAdHJlZmlzIChUYXJpZGVzKSwgQEVrZG9oaWJzIChPQ2FtbFBybyksIEBnYXNjaGUg KElOUklBKQ0KPC9wPg0KPHA+PGI+V2h5OjwvYj4gRW5oYW5jZSBjb2RlIG5hdmlnYXRpb24gYW5k IHJlZmFjdG9yaW5nIGZvciBkZXZlbG9wZXJzIGJ5IHByb3ZpZGluZyBwcm9qZWN0LXdpZGUgcmVm ZXJlbmNlIGVkaXRvciBmZWF0dXJlcywgYWxpZ25pbmcgT0NhbWwgd2l0aCB0aGUgZWRpdG9yIGV4 cGVyaWVuY2UgZm91bmQgaW4gb3RoZXIgbGFuZ3VhZ2VzLg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+ IEludHJvZHVjaW5nIDxjb2RlPm1lcmxpbiBzaW5nbGUgb2NjdXJyZW5jZXM8L2NvZGU+IGFuZCBM U1AgPGNvZGU+DQp0ZXh0RG9jdW1lbnQvcmVmZXJlbmNlczwvY29kZT4gc3VwcG9ydCwgZXh0ZW5k aW5nIGNvbXBpbGVy4oCZcyBTaGFwZXMgZm9yIGdsb2JhbCBvY2N1cnJlbmNlcywgYW5kIGludGVn cmF0aW5nIHRoZXNlIGZlYXR1cmVzIGluIER1bmUsIE1lcmxpbiwgYW5kIE9DYW1sIExTUC4NCjwv cD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ VGhlIGZpcnN0IGl0ZXJhdGlvbiBvbiBwcm9qZWN0LXdpZGUgb2NjdXJyZW5jZXMgaXMgY2xvc2lu Zy1pbiwgYW5kIHdlIG1hZGUgYSBjdXN0b20NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92 b29kb29zL29wYW0tcmVwb3NpdG9yeS1pbmRleCI+PGNvZGU+b3BhbS1yZXBvc2l0b3J5PC9jb2Rl PjwvYT4gdG8gdGVzdCB0aGUgZmVhdHVyZSB3aGlsZSB0aGUgY2hhbmdlcyBtYWtlIHRoZWlyIHdh eSBpbnRvIHRoZSB1cHN0cmVhbSBjb21waWxlci4gVGhpcyBnYXZlIHVzIHRoZSBvcHBvcnR1bml0 eSB0byB0ZXN0IHRoZSBmZWF0dXJlIG9uIG1vcmUgcmVhbCBwcm9qZWN0cywgYW5kIGFmdGVyIGFu b3RoZXINCiByb3VuZCBvZiBidWctZml4aW5nIGFuZCBVSSBpbXByb3ZlbWVudCB3ZSA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXByZXZpZXctcGxheS13aXRoLXByb2pl Y3Qtd2lkZS1vY2N1cnJlbmNlcy1mb3Itb2NhbWwvMTM4MTQiPg0Kb3BlbmVkIGl0PC9hPiB0byB0 aGUgY29tbXVuaXR5IGZvciB3aWRlciB0ZXN0aW5nLiA8L2xpPjxsaT5BbnRpY2lwYXRpbmcgdGhl IEphbnVhcnkgdXBkYXRlLCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL3B1bGwvMTI1MDgiPg0KY29tcGlsZXIgUFI8L2E+IGhhcyBiZWVuIG1lcmdlZCEgOnRhZGE6 IFRoZSBuZXh0IHN0ZXBzIGFyZSB0byByZXZpc2l0IHRoZSBwYXRjaGVzIG9uIHRoZSBvdGhlciBw cm9qZWN0cyBhbmQgdG8gb3BlbiBQUnMgdXBzdHJlYW0uIER1bmUgaXMgdGhlIG5leHQgaW4gbGlu ZS4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMjUw OCI+b2NhbWwvb2NhbWwjMTI1MDg8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4ZWM3NTMyIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnOGVjNzUzMiI+PGI+W01lcmxpbl08L2I+IEltcHJvdmluZyBNZXJsaW7igJlzIFBl cmZvcm1hbmNlICg8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRt YXAjdzE5LW5hdmlnYXRlLWNvZGUiPlcxOTwvYT4pPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmc4ZWM3NTMyIj4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4g QHBpdGFnIChUYXJpZGVzKSwgQEVuZ2lsIChUYXJpZGVzKSwgQDNSYWZhbCAoVGFyaWRlcykgPC9w Pg0KPHA+PGI+V2h5OjwvYj4gU29tZSBNZXJsaW4gcXVlcmllcyBoYXZlIGJlZW4gc2hvd24gdG8g c2NhbGUgcG9vcmx5IGluIGxhcmdlIGNvZGViYXNlcywgbWFraW5nIHRoZSBlZGl0b3IgZXhwZXJp ZW5jZSBzdWJwYXIsIGFuZCB1c2VycyByZXBvcnQgdGhhdCB0aGV5IHNvbWV0aW1lcyBtdXN0IHdh aXQgYSBmZXcgc2Vjb25kcyB0byBnZXQgdGhlIGFuc3dlci4gVGhpcyBpcyBvYnZpb3VzbHkgYSBt YWpvciBpc3N1ZSB0aGF0IGh1cnRzIGRldmVsb3Blcg0KIGV4cGVyaWVuY2UsIHNvIHdl4oCZcmUg d29ya2luZyBvbiBpbXByb3ZpbmcgTWVybGluIHBlcmZvcm1hbmNlIHdoZW4gaXQgZmFsbHMgc2hv cnQuDQo8L3A+DQo8cD48Yj5XaGF0OjwvYj4gRGV2ZWxvcGluZyBiZW5jaG1hcmtpbmcgdG9vbHMg YW5kIG9wdGltaXNpbmcgTWVybGlu4oCZcyBwZXJmb3JtYW5jZSB0aHJvdWdoIHRhcmdldGVkIGlt cHJvdmVtZW50cyBiYXNlZCBvbiBwcm9maWxpbmcgYW5kIGFuYWx5c2lzIG9mIGJlbmNobWFyayBy ZXN1bHRzLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5XZeKAmXZlIG1hZGUgdGhlIGZpbGUgY2FjaGUgbGlmZXRpbWUgY29uZmlndXJh YmxlLiBWYXJ5aW5nIHRoZSBsaWZldGltZSB3aWxsIGFsbG93IGV4cGVyaW1lbnRpbmcgd2l0aCBN ZXJsaW7igJlzIHRpbWUvc3BhY2UgdHJhZGUtb2ZmLiBCZWZvcmUsIGl0IHdhcyBjb25zdGFudGx5 IHNldCB0byA1IG1pbi4gLTxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4v cHVsbC8xNjk4Ij4jMTY5ODwvYT4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JbnRyb2R1Y2Vk IGEgY29uZmlnIHRoYXQgbGV0cyB1c2VycyBzZXQgYSBmaWxlIGNhY2hlIGxpZmVzcGFuLiBXaGVu IG1vZGlmaWVkIHRvIGEgbGFyZ2VyIHZhbHVlIGl0IHNob3VsZCBpbXByb3ZlIHBlcmZvcm1hbmNl IGZvciBsYXJnZSByZXBvc2l0b3JpZXMg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvbWVybGluL3B1bGwvMTY5OCI+b2NhbWwvbWVybGluIzE2OTg8L2E+IDwvbGk+PGxpPklu dHJvZHVjZWQgdGhlIGZpbGUgY2FjaGUgbGlmZXNwYW4gZmxhZyB0byA8Y29kZT5vY2FtbC1sc3A8 L2NvZGU+LCBzbyBpdCBjYW4gYmUgdXNlZCBmb3IgYWxsIExTUCBjbGllbnRzIOKAkw0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9wdWxsLzEyMTAiPm9jYW1sL29j YW1sLWxzcCMxMjEwPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5XZeKAmXZlIGVucmljaGVkIHRo ZSB0ZWxlbWV0cnkgdGhhdCBjb21lcyBlbWJlZGRlZCBpbiB0aGUgPGNvZGU+b2NhbWxtZXJsaW48 L2NvZGU+IHJlc3BvbnNlczoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XZeKAmXZlIGFkZGVk IGluZm9ybWF0aW9uIGFib3V0IGNhY2hlIGhpdHMgYW5kIG1pc3NlcyBvZiB0aGUgdmFyaW91cyBN ZXJsaW4gY2FjaGVzOg0KPGNvZGU+Y21pLWZpbGVzPC9jb2RlPiBjYWNoZSwgPGNvZGU+Y210LWZp bGVzPC9jb2RlPiBjYWNoZSwgdHlwZXIgcGhhc2UgY2FjaGUsIFBQWCBwaGFzZSBjYWNoZSwgYW5k IHJlYWRlciBwaGFzZSBjYWNoZS4gLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L21lcmxpbi9wdWxsLzE3MTEiPiMxNzExPC9hPiA8L2xpPjxsaT5XZeKAmXZlIGFkZGVkIGluZm9y bWF0aW9uIGFib3V0IHRoZSBzaXplIG9mIHRoZSBtYWpvciBoZWFwIGF0IHRoZSBlbmQgb2YgYW4g PGNvZGU+DQpvY2FtbG1lcmxpbjwvY29kZT4gcXVlcnkgLSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTcxNyI+IzE3MTc8L2E+IC0gV2XigJl2ZSBmaW5pc2hl ZCB1cCBNZXJsaW7igJlzIG5ldyBGdXp6eSBDSSwgYSBieS1wcm9kdWN0IG9mIHRoZSBwZXJmb3Jt YW5jZSB3b3JrLg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPldl4oCZdmUgb3BlbmVkIHRoZSBQ UnMgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTcxNiI+ IzE3MTY8L2E+IChhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4v cHVsbC8xNzE5Ij4jMTcxOTwvYT4pIDwvbGk+PGxpPldl4oCZdmUgd3JpdHRlbiBhIEdpdEh1YiB3 aWtpIGVudHJ5IHdpdGggYSBoaWdoLWxldmVsIGRlc2NyaXB0aW9uIGFib3V0IGl0LiAtIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vd2lraS9NZXJsaW4tRnV6enktQ0ki Pg0KTWVybGluIEZ1enp5IENJPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5VcGNvbWluZyBDYXF0aSBSZWxl YXNlIC0gVExTLCBQYWNrYWdpbmcsIGFuZCBtaW5vciBicmVha2FnZTwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXBjb21pbmctY2FxdGktcmVsZWFzZS10bHMtcGFja2Fn aW5nLWFuZC1taW5vci1icmVha2FnZS8xMzkyNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC91cGNvbWluZy1jYXF0aS1yZWxlYXNlLXRscy1wYWNrYWdpbmctYW5kLW1pbm9yLWJyZWFr YWdlLzEzOTI2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzdlNDkwOWIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc3ZTQ5MDliIj5QZXR0 ZXIgQS4gVXJrZWRhbCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzdlNDkwOWIiPg0KPHA+VGhlIG5leHQgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL3BhdXJrZWRhbC9vY2FtbC1jYXF0aS8iPkNhcXRpPC9hPiByZWxlYXNlIGlzIGFsbW9z dCByZWFkeSBpZiBJIHByb2NlZWQgYXMgcGxhbm5lZCwgdGhvdWdoIEkgd291bGQgbGlrZSB0byBs aWZ0IHBsYW5zIGluIGFkdmFuY2UgaW4gY2FzZSBhbnlvbmUgaGFzIGZlZWRiYWNrLg0KPC9wPg0K PHA+V2hpbGUgQ2FxdGkgMiBicm91Z2h0IHN1cHBvcnQgZm9yIE1pcmFnZU9TICh1c2luZyBQR1gp LCBpdCBpcyBtaXNzaW5nIFRMUywgd2hpY2ggbGltaXRzIGl0cyB1c2FiaWxpdHkgaW4gcHJhY3Rp c2UuIFBhdGNoaW5nIHRoYXQgaG9sZSB3aWxsIGJlIHRoZSBtYWluIGRlbGl2ZXJ5IGZvciB0aGUg dXBjb21pbmcgcmVsZWFzZS4gVGhpcyBpbnZvbHZlZCBhIHJldmlzaW9uIG9mIHRoZSBuZXR3b3Jr IGFic3RyYWN0aW9uIGFuZCBiZXR0ZXIgcGVyZm9ybWFuY2UNCiB1bmRlciBFSU8uIDwvcD4NCjxw PlNvbWUgbW9yZSBtaW5vciBjaGFuZ2VzIGNhbiBiZSBzZWVuIGluIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9wYXVya2VkYWwvb2NhbWwtY2FxdGkvYmxvYi9tYXN0ZXIvQ0hBTkdFUy5tZCI+ DQp0aGUgcHJlbGltaW5hcnkgY2hhbmdlIGxvZzwvYT4uIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnMmYwYzAwZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9 Im9yZzJmMGMwMGUiPk1pbm9yIEJyZWFraW5nIENoYW5nZXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzJmMGMwMGUiPg0KPHA+TXkgcGxhbiBpcyB0aGUgbWFr ZSB0aGUgdXBjb21pbmcgb25lIGEgbWlub3IgcmVsZWFzZSwgYnV0IHRoZXJlIHdpbGwgYmUgdHdv IGJyZWFraW5nIGNoYW5nZXMsIHNvIHdlIGNvdWxkIGRpc2N1c3Mgd2hldGhlciBhIG1pbm9yIHJl bGVhc2UgaXMgcmVhc29uYWJsZToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGVy ZSB3aWxsIGJlIGEgbmV3IG9wdGlvbmFsIDxjb2RlPj9jb25maWc8L2NvZGU+IHBhcmFtZXRlciBm b3IgYWxsIGZ1bmN0aW9ucyB3aGljaCBjb25uZWN0IHRvIGEgZGF0YWJhc2Ugb3IgY3JlYXRlIGEg Y29ubmVjdGlvbiBwb29sLCB3aGljaCBjYW4gYnJlYWsgY29kZSB3aGljaCBtYWtlcyBoaWdoZXIt b3JkZXIgY2FsbHMgb3IgYWxpYXNlcyB0aG9zZSBwYXJ0cyBvZiB0aGUgc2lnbmF0dXJlcy4NCjwv bGk+PGxpPlRoZSA8Y29kZT5DYXF0aV9xdWVyeS50PC9jb2RlPiB0eXBlIHdpbGwgaGF2ZSBvbmUg YWRkaXRpb25hbCBjb25zdHJ1Y3RvciAoPGNvZGU+VjwvY29kZT4pLCB3aGljaCBicmVha3MgYW55 IGNvZGUgd2hpY2ggYWxpYXMgdGhlIHR5cGUgYWxvbmcgd2l0aCBpdHMgY29uc3RydWN0b3JzLg0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzNmMzQ0MDgiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczZjM0NDA4Ij5QYWNrYWdp bmcgYW5kIFRMUzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn M2YzNDQwOCI+DQo8cD5UTDtEUjogVGhpcyBpcyBtb3N0bHkgYSByZXF1ZXN0IGZvciBjb21tZW50 cyBhYm91dCBwYWNrYWdpbmcuIDwvcD4NCjxwPlRoZSBDYXF0aSBwcm9qZWN0IGN1cnJlbnRseSBo YXMgMTEgcGFja2FnZXMgaW4gdGhlIG9mZmljaWFsIE9QQU0gcmVwb3NpdG9yeS4gV2l0aCB0aGUg Y3VycmVudCBwbGFuLCB0aGVyZSB3aWxsIGJlIGFuIGFkZGl0aW9uYWwgNCBUTFMgcGFja2FnZXM6 DQo8L3A+DQo8dGFibGUgYm9yZGVyPSIyIiBjZWxsc3BhY2luZz0iMCIgY2VsbHBhZGRpbmc9IjYi IHJ1bGVzPSJncm91cHMiIGZyYW1lPSJoc2lkZXMiPg0KPGNvbGdyb3VwPjxjb2wgY2xhc3M9Im9y Zy1sZWZ0Ij48Y29sIGNsYXNzPSJvcmctbGVmdCI+PGNvbCBjbGFzcz0ib3JnLWxlZnQiPjwvY29s Z3JvdXA+DQo8dGhlYWQ+DQo8dHI+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5w YWNrYWdlczwvdGg+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5kZXNjcmlwdGlv bjwvdGg+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5hc3Nlc3NtZW50PC90aD4N CjwvdHI+DQo8L3RoZWFkPg0KPHRib2R5Pg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PGNv ZGU+Y2FxdGk8L2NvZGU+PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNvcmUgZnVuY3Rpb25h bGl0eTwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5yZXF1aXJlZDwvdGQ+DQo8L3RyPg0KPHRy Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PGNvZGU+Y2FxdGktZHlubG9hZDwvY29kZT48L3RkPg0K PHRkIGNsYXNzPSJvcmctbGVmdCI+ZHluYW1pYyBsaW5raW5nPC90ZD4NCjx0ZCBjbGFzcz0ib3Jn LWxlZnQiPmNvdWxkIGJlIG1lcmdlZCBpbnRvIDxjb2RlPmNhcXRpPC9jb2RlPjwvdGQ+DQo8L3Ry Pg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PGNvZGU+Y2FxdGktZHJpdmVyLW1hcmlhZGI8 L2NvZGU+LCA8Y29kZT5jYXF0aS1kcml2ZXItcGd4PC9jb2RlPiwNCjxjb2RlPmNhcXRpLWRyaXZl ci1wb3N0Z3Jlc3FsPC9jb2RlPiwgPGNvZGU+Y2FxdGktZHJpdmVyLXNxbGl0ZTwvY29kZT48L3Rk Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+cmVxdWlyZWQ8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBj bGFzcz0ib3JnLWxlZnQiPjxjb2RlPmNhcXRpLWFzeW5jPC9jb2RlPiwgPGNvZGU+Y2FxdGktZWlv PC9jb2RlPiwgPGNvZGU+Y2FxdGktbHd0PC9jb2RlPiwNCjxjb2RlPmNhcXRpLW1pcmFnZTwvY29k ZT48L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+cmVxdWlyZWQ8L3RkPg0KPC90cj4NCjx0cj4N Cjx0ZCBjbGFzcz0ib3JnLWxlZnQiPjxjb2RlPmNhcXRpLXR5cGUtY2FsZW5kYXI8L2NvZGU+PC90 ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmNvbnZlbmllbmNlPC90ZD4NCjx0ZCBjbGFzcz0ib3Jn LWxlZnQiPmNvdWxkIGJlIHJldGlyZWQ8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3Jn LWxlZnQiPjxjb2RlPmNhcXRpLXRsczwvY29kZT48L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+ Y29yZSBUTFMgcGFja2FnZTwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5zZWUgYmVsb3c8L3Rk Pg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPjxjb2RlPmNhcXRpLXRscy1hc3lu YzwvY29kZT4sIDxjb2RlPmNhcXRpLXRscy1laW88L2NvZGU+LCA8Y29kZT4NCmNhcXRpLXRscy1s d3Q8L2NvZGU+PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPnNwZWNpYWxpemVkIFRMUyBlbmdp bmVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPnNlZSBiZWxvdzwvdGQ+DQo8L3RyPg0KPC90 Ym9keT4NCjwvdGFibGU+DQo8cD4oRm9yIDxjb2RlPmNhcXRpLW1pcmFnZTwvY29kZT4sIFRMUyBp cyBpbmNsdWRlZCwgc2luY2UgdGhlIDxjb2RlPnRsczwvY29kZT4gbGlicmFyeSBpcyB0aGUgb25s eSBvcHRpb24gdG8gZW5jcnlwdCBQb3N0Z3JlU1FMIGNvbW11bmljYXRpb24gZm9yIHVuaWtlcm5l bHMsIGlmIG5vdCBpbXBsZW1lbnRlZCBhdCB0aGUgbmV0d29yayBsZXZlbCwgQUZBSUsuKQ0KPC9w Pg0KPHA+QXMgaW5kaWNhdGVkIGFib3ZlIHRoZXJlIGNvdWxkIGJlIG9wdGlvbnMgdG8gZWxpbWlu YXRlIHR3byBleGlzdGluZyBwYWNrYWdlcywgYnV0IEnigJlsbCBsZWF2ZSB0aGF0IGZvciBsYXRl ci4gVGhlIGFsdGVybmF0aXZlcyBJ4oCZdmUgY29uc2lkZXJlZCBmb3IgdGhlIFRMUyBpbXBsZW1l bnRhdGlvbiBhbmQgcGFja2FnaW5nIGlzOg0KPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxp PlRoZSBpbXBsZW1lbnRlZCBjaG9pY2UgaXMgdG8gdXNlIHRoZSA8Y29kZT50bHMtYXN5bmM8L2Nv ZGU+LCA8Y29kZT50bHMtZWlvPC9jb2RlPiwNCjxjb2RlPnRscy1sd3Q8L2NvZGU+LCBhbmQgPGNv ZGU+dGxzLW1pcmFnZTwvY29kZT4gaW5zdGFudGlhdGlvbnMgb2YgdGhlIFRMUyBlbmdpbmUsIHRo dXMgYWRkaW5nIG9uZSBwYWNrYWdlIHBlciBmbGF2b3VyLg0KPC9saT48bGk+VExTIHN1cHBvcnQg Zm9yIEFzeW5jLCBFSU8sIGFuZCBMV1QgY291bGQgaW5zdGVhZCBiZSBtZXJnZWQgYXMgc3VibGli cmFyaWVzIG9mDQo8Y29kZT5jYXF0aS1hc3luYzwvY29kZT4sIDxjb2RlPmNhcXRpLWVpbzwvY29k ZT4sIGFuZCA8Y29kZT5jYXF0aS1sd3Q8L2NvZGU+LCBhbmQNCjxjb2RlPmNhcXRpLXRsczwvY29k ZT4gY291bGQgYmUgbWVyZ2VkIGludG8gPGNvZGU+Y2FxdGk8L2NvZGU+LiBUaGUgbWFpbiByZWFz b24gZm9yIG5vdCBkb2luZyB0aGlzLCBpcyB0aGUgQyBiaW5kaW5ncyBmb3IgTWFyaWFEQiBhbmQg UG9zdGdyZVNRTCBhbHJlYWR5IGhhdmUgVExTIGJ1aWx0LWluLCBzbyBpbiBtb3N0IGNhc2VzIHRo ZQ0KPGNvZGU+dGxzPC9jb2RlPiBkZXBlbmRlbmN5IHdvdWxkIGJlIHJlZHVuZGFudC4gVGhlIGRl cGVuZGVuY2llcyBjb3VsZCBiZSBtYWRlIG9wdGlvbmFsLCB0aG91Z2ggSSBoYXZlIHRoZSBpbXBy ZXNzaW9uIG1hbnkgY29uc2lkZXIgb3B0aW9uYWwgZGVwZW5kZW5jaWVzIGhhcm1mdWwuDQo8L2xp PjxsaT5UaGUgQ2FxdGkgbmV0d29yayBhYnN0cmFjdGlvbnMgY291bGQgdXNlIHRoZSBwdXJlIFRM UyBlbmdpbmUgZGlyZWN0bHksIHRodXMgcmVxdWlyaW5nIG9ubHkgb25lIGV4dHJhIHBhY2thZ2Us DQo8Y29kZT5jYXF0aS10bHM8L2NvZGU+LiBUaGlzIHdvdWxkIGJlIGEgZWxlZ2FudCBzb2x1dGlv biwgZXhjZXB0IHRoYXQgaXQgd2lsbCBub3Qgd29yayB3aXRoIHRoZQ0KPGNvZGU+c3NsPC9jb2Rl PiBsaWJyYXJ5IHNob3VsZCB3ZSB3YW50IHRvIHN1cHBvcnQgaXQsIHNpbmNlIGl0IGlzIHRpZWQg dG8gdGhlIG5ldHdvcmsgc3RhY2suDQo8L2xpPjwvb2w+DQo8cD5XaGlsZSBzd2l0Y2hpbmcgdG8g dGhlIHNlY29uZCBvcHRpb24gaXMgc2ltcGxlLCBzd2l0Y2hpbmcgdG8gdGhlIHRoaXJkIG9wdGlv biB3b3VsZCByZXF1aXJlIG1vcmUgd29yayBvbiBteSBwYXJ0LCBkZWxheWluZyB0aGUgcmVsZWFz ZSwgYnV0IEkgY291bGQgYmUgY29udmluY2VkIGlmIHdlIGZlZWwgc3Ryb25nbHkgZm9yIHRoZSBl bmQgcmVzdWx0Lg0KPC9wPg0KPHA+VGhlIDxjb2RlPmNhcXRpLXRsczwvY29kZT4gcGFja2FnZSBp cyAoY3VycmVudGx5KSBvbmx5IG5lZWRlZCB0byBkZWZpbmUgYSBzaGFyZWQgY29uZmlndXJhdGlv biBrZXkgd2hpY2ggZGVwZW5kcyBvbiB0aGUNCjxjb2RlPnRsczwvY29kZT4gbGlicmFyeS4gPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+RGV2ZWxvcGluZyBXZWIgYW5k IG1vYmlsZSBhcHBsaWNhdGlvbnMgaW4gT0NhbWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2RldmVsb3Bpbmctd2ViLWFuZC1tb2JpbGUtYXBwbGljYXRpb25zLWluLW9j YW1sLzEzOTI3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2RldmVsb3Bpbmctd2Vi LWFuZC1tb2JpbGUtYXBwbGljYXRpb25zLWluLW9jYW1sLzEzOTI3LzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2JkNjRjMWMiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdiZDY0YzFjIj5WaW5jZW50IEJhbGF0IGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYmQ2NGMxYyI+DQo8cD5IZXJl IGlzIGEgKHJlLSlyZWNvcmRpbmcgb2YgYSB0YWxrIEkgZ2F2ZSBhIGZldyB3ZWVrcyBhZ28gYXQg VGFyaWRlcywgYWJvdXQgT2NzaWdlbiBhbmQgQmUgU3BvcnQuDQo8L3A+DQo8cD5BYnN0cmFjdDog PC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5UaGlzIHByZXNlbnRhdGlvbiBnaXZlcyBhbiBvdmVydmll dyBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY3NpZ2VuLm9yZyI+T2NzaWdlbjwvYT4gZnJhbWV3 b3JrLCB3aGljaCBpcyB1c2VkIGluIHBhcnRpY3VsYXIgdG8gZGV2ZWxvcCB0aGUNCjxhIGhyZWY9 Imh0dHBzOi8vYmVzcG9ydC5jb20vbmV3cyI+QmUgU3BvcnQ8L2E+IHNvY2lhbCBuZXR3b3JrLiBP Y3NpZ2VuIGlzIGEgc2V0IGEgdG9vbHMgdG8gZGV2ZWxvcCBXZWIgc2l0ZXMgYW5kIGFwcGxpY2F0 aW9ucy4gQW1vbmdzdCBvdGhlciB0aGluZ3MsIGl0IGNvbnRhaW5zDQo8YSBocmVmPSJodHRwczov L29jc2lnZW4ub3JnL2pzX29mX29jYW1sIj5qc19vZl9vY2FtbDwvYT4sIGEgY29tcGlsZXIgdG8g SmF2YXNjcmlwdCwgYW5kDQo8YSBocmVmPSJodHRwczovL29jc2lnZW4ub3JnL2VsaW9tIj5FbGlv bTwvYT4sIGEgcG93ZXJmdWwgV2ViIGZyYW1ld29yayB0aGF0IGNhbiBiZSB1c2VkIGZvciB0cmFk aXRpb25hbCBzZXJ2ZXItc2lkZSBXZWIgcHJvZ3JhbW1pbmcsIGJ1dCBhbHNvIHRvIGRldmVsb3Ag Y2xpZW50LXNlcnZlciBXZWIgYW5kIG1vYmlsZSBkaXN0cmlidXRlZCBhcHBsaWNhdGlvbnMsIGVu dGlyZWx5IGluIE9DYW1sLCB1c2luZyBtdWx0aS10aWVyIHByb2dyYW1taW5nLg0KIFdlIHdpbGwg dHJ5IHRvIHNob3cgaG93IHRoaXMgcHJvZ3JhbW1pbmcgc3R5bGUgY2FuIHNhdmUgYSBodWdlIGFt b3VudCBvZiB0aW1lLiA8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD48YSBocmVmPSJodHRwczovL29j c2lnZW4ub3JnL3R1dG8vbGF0ZXN0L21hbnVhbC9iYXNpY3MiPkRvY3VtZW50YXRpb248L2E+IDwv cD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vd2F0Y2gub2NhbWwub3JnL3cvcVF6Yjk0WDlXTTd6TGlm N0Z5blB5TiI+aHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdy9xUXpiOTRYOVdNN3pMaWY3RnluUHlO PC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPmRyZWFtLWh0bWwgMi4wLjA8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLTIt MC0wLzEzNjI2LzIiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0y LTAtMC8xMzYyNi8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmczNzA2NGFmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzcwNjRhZiI+WWF3 YXIgQW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzM3MDY0YWYiPg0KPHA+W0FOTl0gZHJlYW0taHRtbCAyLjEuMCA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+RGVwcmVjYXRlIDxjb2RlPkh4Lm9uPC9jb2RlPiBhbmQgaW50cm9k dWNlIG5ldyA8Y29kZT5IeC5vbl88L2NvZGU+IGV2ZW50IGhhbmRsZXIgYXR0cmlidXRlIHN0eWxl IHVzZWQgYnkgaHRteA0KPC9saT48bGk+QWRkIDxjb2RlPmZvcm0gW21ldGhvZF8gYGRpYWxvZ108 L2NvZGU+IG5ldyBhdHRyaWJ1dGUgdmFsdWUgZm9yIHB1cmUgSFRNTCBtb2RhbHMNCjwvbGk+PC91 bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTci IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5EaXNjdXNzaW9ucyBvbiB0aGUgZnV0dXJl IG9mIHRoZSBvcGFtIHJlcG9zaXRvcnk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Rpc2N1c3Npb25zLW9uLXRoZS1mdXR1cmUtb2YtdGhlLW9wYW0tcmVwb3NpdG9yeS8x Mzg5OC80Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kaXNjdXNzaW9ucy1vbi10aGUt ZnV0dXJlLW9mLXRoZS1vcGFtLXJlcG9zaXRvcnkvMTM4OTgvNDwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjM4ZmRhZCIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZ2IzOGZkYWQiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFJhcGhhw6tsIFBy b3VzdCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZ2IzOGZkYWQiPg0KPHA+QWxvbmcgd2l0aCBvdGhlciB2b2x1bnRlZXJzLCB3ZSBoYXZlIHRh a2VuIG5vdGVzIGR1cmluZyB0aGUgbWVldGluZy4gVGhleSBhcmUgYXZhaWxhYmxlDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8yMzc4OSNp c3N1ZWNvbW1lbnQtMTkwOTY5MzcwMCI+DQpvbiB0aGUgZ2l0aHViIGlzc3VlPC9hPi4gPC9wPg0K PHA+VEw7RFI6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGVyZSB3YXMgYSBnZW5l cmFsIGNvbnNlbnN1cyB0byBjcmVhdGUgYW4g4oCcYXJjaGl2ZeKAnSByZXBvc2l0b3J5IHdoZXJl IHdlIGNhbiBtb3ZlIGJyb2tlbiwgdW5tYWludGFpbmVkLCBvYnNvbGV0ZSBwYWNrYWdlcyAoc3Bl Y2lmaWMgY2hhcmFjdGVyaXNhdGlvbiBzdGlsbCB0byBiZSBkZWZpbmVkKQ0KPC9saT48bGk+VGhl cmUgaXMgYW5vdGhlciBtZWV0aW5nIHBsYW5uZWQgb24gMjAyNC0wMi0wNyB0byBkaXNjdXNzIHRo ZSBzcGVjaWZpY3MgZnVydGhlcg0KPC9saT48L3VsPg0KPHA+SWYgdGhpcyB0b3BpYyBpcyBpbXBv cnRhbnQgdG8geW91OiBQbGVhc2UgbGVhdmUgY29tbWVudHMgb24gdGhlIGdpdGh1YiB0aHJlYWQu IFBsZWFzZSBhdHRlbmQgdGhlIG1lZXRpbmcuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iOCI+UmVxdWVzdCBmb3IgRmVlZGJhY2s6IFRha2UgdGhlIE9DYW1sLm9yZyBMZWFybiBBcmVh IFVzZXIgU2F0aXNmYWN0aW9uIFN1cnZleTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcmVxdWVzdC1mb3ItZmVlZGJhY2stdGFrZS10aGUtb2NhbWwtb3JnLWxlYXJuLWFy ZWEtdXNlci1zYXRpc2ZhY3Rpb24tc3VydmV5LzEzOTI4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3JlcXVlc3QtZm9yLWZlZWRiYWNrLXRha2UtdGhlLW9jYW1sLW9yZy1sZWFybi1h cmVhLXVzZXItc2F0aXNmYWN0aW9uLXN1cnZleS8xMzkyOC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhNmRkNzkwIiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnYTZkZDc5MCI+U2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTZkZDc5MCI+DQo8cD48Yj5HaXZl IHVzIEZlZWRiYWNrIG9uIHRoZSBJbXByb3ZlZCBPQ2FtbCBMZWFybmluZyBFeHBlcmllbmNlITwv Yj4gPC9wPg0KPHA+T3ZlciB0aGUgcGFzdCBzaXggbW9udGhzLCBvdXIgdGVhbSBoYXMgYmVlbiBo YXJkIGF0IHdvcmsgcmVmaW5pbmcgdGhlIE9DYW1sIGxlYXJuaW5nIGFyZWEuIFRocm91Z2ggYW4g VVggcHJvY2VzcywgaW5jbHVkaW5nIHN1cnZleXMsIHVzZXIgaW50ZXJ2aWV3IGNhbGxzLCB2aWRl byBzZXNzaW9ucywgYW5kIGluLWRlcHRoIGFuYWx5c2lzIHRvIGlkZW50aWZ5IHBhaW4gcG9pbnRz IGFuZCB1c2VyIG5lZWRzLCB3ZSBoYXZlIGNyZWF0ZWQgYSBicmFuZC1uZXcNCiB1c2VyIGV4cGVy aWVuY2UgYW5kIGludGVyZmFjZS4gPC9wPg0KPHA+Tm93LCB3ZSBhcmUgbG9va2luZyBmb3IgeW91 ciBmZWVkYmFjayBvbiBvdXIgd29yay4gWW91ciBwZXJzcGVjdGl2ZSBpcyBpbnZhbHVhYmxlIGFz IHdlIHN0cml2ZSB0byBpbXByb3ZlDQo8YSBocmVmPSJodHRwOi8vb2NhbWwub3JnLyI+T0NhbWwu b3JnPC9hPi4gPC9wPg0KPHA+PGI+V2hhdCB3ZSBoYXZlIGRvbmU6PC9iPiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+RW5oYW5jZWQgVVg6IFVwZGF0ZWQgbmF2aWdhdGlvbiBiYXNlZCBv biB1c2VyIHN1cnZleXMgd2l0aCBpbnRlcnZpZXdzIGFuZCBhbmFseXNpcy4NCjwvbGk+PGxpPlJl dmFtcGVkIFVJOiBBIGZyZXNoIGludGVyZmFjZSBkZXNpZ25lZCB3aXRoIHlvdXIgbmVlZHMgaW4g bWluZC4gPC9saT48bGk+QmV0dGVyIExhbmRpbmcgUGFnZSBvbiB0aGUgTGVhcm4gQXJlYTogV2Ug cHJvdmlkZSBhIHdpbmRvdyBpbnRvIHRoZSBkb2N1bWVudGF0aW9uLCBmcm9tIGJlZ2lubmVyIHRv IGV4cGVydC4gVGhpcyBzaG91bGQgbWFrZSB0aGUgY29udGVudCBtb3JlIGRpc2NvdmVyYWJsZS4N CjwvbGk+PC91bD4NCjxwPjxiPldoeSBZb3VyIEZlZWRiYWNrIE1hdHRlcnM6PC9iPiBZb3VyIGlu c2lnaHRzIGFyZSBjcml0aWNhbCBpbiBzaGFwaW5nIHRoZSBmdXR1cmUgb2YgT0NhbWzigJlzIGxl YXJuaW5nIGFyZWEuIFdlIHVzZSB5b3VyIGZlZWRiYWNrIHRvIHByaW9yaXRpemUgYW5kIGltcGxl bWVudCBpbXByb3ZlbWVudHMuDQo8L3A+DQo8cD48Yj5Ib3cgdG8gU2hhcmUgWW91ciBUaG91Z2h0 czo8L2I+IEV4cGxvcmUgdGhlIG5ldyBkZXNpZ24gYXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5v cmcvZG9jcyI+DQpodHRwczovL29jYW1sLm9yZy9kb2NzPC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6 Ly9mb3Jtcy5nbGUvYjJCUzVORWlGYVVWU2NKVEEiPnNoYXJlIHlvdXIgZmVlZGJhY2sgd2l0aCB1 cyBoZXJlPC9hPg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9mb3Jtcy5nbGUvYjJCUzVORWlG YVVWU2NKVEEiPmh0dHBzOi8vZm9ybXMuZ2xlL2IyQlM1TkVpRmFVVlNjSlRBPC9hPg0KPC9wPg0K PHA+VGhhbmsgeW91IGZvciBiZWluZyBhIHBhcnQgb2YgdGhlIE9DYW1sIGNvbW11bml0eS4gPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPk1pZGRsZXdhcmUgMS4wLjAg4oCTIENvbXBv c2FibGUgZnVuY3Rpb25zIHdoaWNoIHJlc3BvbmQgdG8gaW5uZXIgY2FsbHM8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21pZGRsZXdhcmUtMS0wLTAtY29tcG9zYWJsZS1m dW5jdGlvbnMtd2hpY2gtcmVzcG9uZC10by1pbm5lci1jYWxscy8xMzkzMS8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9taWRkbGV3YXJlLTEtMC0wLWNvbXBvc2FibGUtZnVuY3Rpb25z LXdoaWNoLXJlc3BvbmQtdG8taW5uZXItY2FsbHMvMTM5MzEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2MyZTBlMyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzdjMmUwZTMiPlRyZW50IFNtYWxsIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2MyZTBlMyI+DQo8cD5IZXkgZm9sa3Mh IDwvcD4NCjxwPknigJltIGhhcHB5IHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIDxj b2RlPm1pZGRsZXdhcmU8L2NvZGU+LCBhIHV0aWxpdHkgZm9yIGNvbXBvc2luZyBmdW5jdGlvbnMg d2hpY2ggbmVlZCB0byByZXNwb25kIHRvIGlubmVyIGNhbGxzLg0KPC9wPg0KPHA+U2VlIG91ciBH aXRIdWIgZm9yIGV4YW1wbGVzIGFuZCBtb3JlIGRldGFpbHM6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9za29sZW1sYWJzL21pZGRsZXdhcmUiPg0KaHR0cHM6Ly9naXRodWIuY29tL3Nrb2xl bWxhYnMvbWlkZGxld2FyZTwvYT4gPC9wPg0KPHA+VGhpcyBwYWNrYWdlIHdhcyBkZXZlbG9wZWQg aW50ZXJuYWxseSBhdCBTa29sZW0gVGVjaG5vbG9naWVzLCBhbmQgd2XigJl2ZSBkZWNpZGVkIHRv IG9wZW4tc291cmNlIGl0LiBNb3JlIHN1Y2ggcGFja2FnZXMgYXJlIGNvbWluZyBzb29uIQ0KPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTAi IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+QW5ub3VuY2luZyB2YWxpZGF0ZSAxLjAu MCAtIEVuaGFuY2VkIERhdGEgVmFsaWRhdGlvbiBpbiBPQ2FtbCE8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYW5ub3VuY2luZy12YWxpZGF0ZS0xLTAtMC1lbmhh bmNlZC1kYXRhLXZhbGlkYXRpb24taW4tb2NhbWwvMTM5NDUvMSI+DQpodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWFubm91bmNpbmctdmFsaWRhdGUtMS0wLTAtZW5oYW5jZWQtZGF0YS12 YWxpZGF0aW9uLWluLW9jYW1sLzEzOTQ1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzFkNzcwYzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmcxZDc3MGMyIj5NYXRldXN6IExlZHdvxYQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxZDc3MGMyIj4NCjxwPkhlbGxvIE9DYW1sIENvbW11 bml0eSEgPC9wPg0KPHA+SeKAmW0gZXhjaXRlZCB0byBzaGFyZSB0aGUgcmVsZWFzZSBvZiA8Y29k ZT52YWxpZGF0ZTwvY29kZT4gdmVyc2lvbiAxLjAuMCB3aXRoIHlvdSBhbGwhIFRoaXMgdmVyc2lv biBpcyBhIHNpZ25pZmljYW50IG1pbGVzdG9uZSBpbiBteSBqb3VybmV5IHRvIHByb3ZpZGUgYSBy b2J1c3QgZGF0YSB2YWxpZGF0aW9uIGxpYnJhcnkgZm9yIE9DYW1sLg0KPC9wPg0KPHA+SW4gdGhp cyByZWxlYXNlLCBJ4oCZdmUgaW50cm9kdWNlZCBzb21lIGV4Y2l0aW5nIGZlYXR1cmVzLiBWYXJp YW50IHN1cHBvcnQgaXMgbm93IGF2YWlsYWJsZSwgZW5hYmxpbmcgbW9yZSBjb21wbGV4IGRhdGEg dHlwZXMgdG8gYmUgaGFuZGxlZCB3aXRoIGVhc2UuIEnigJl2ZSBhbHNvIGltcGxlbWVudGVkIHN1 cHBvcnQgZm9yIHJlY3Vyc2l2ZSBhbmQgY2lyY3VsYXIgcmVjdXJzaXZlIHR5cGVzLCBhbGxvd2lu ZyB2YWxpZGF0aW9uIG9mIG5lc3RlZCBhbmQNCiBpbnRlcmNvbm5lY3RlZCBkYXRhIHN0cnVjdHVy ZXMuIEhlcmXigJlzIGEgcXVpY2sgcGVlayBhdCBob3cgaXQgd29ya3M6IDwvcD4NCjxkaXYgY2xh c3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij50cmVlPC9zcGFuPiA9DQogIHwgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+TGVhZjwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPm9mPC9z cGFuPiAoaW50PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BncmVhdGVyX3RoYW4gPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjYTI2MDRmOyI+XTwvc3Bhbj4pDQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIx OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+Tm9kZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPm9mPC9zcGFuPiB7DQogICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKjwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPkFubm90YXRpb24g Y2FuIGJlIG9uIHR5cGUgb3IgbGFiZWwgZGVjbGFyYXRpb24sIGJvdGggd29ya3M8L3NwYW4+PHNw YW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4qKTwvc3Bhbj4N CiAgICBsZWZ0IDogdHJlZTsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BkaXZlXTwv c3Bhbj4NCiAgICByaWdodCA6ICh0cmVlPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0Bk aXZlXTwvc3Bhbj4pDQogIH0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BAZGVyaXZp bmcgdmFsaWRhdGUsIHNob3csIGVxXTwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA3YTlmOyI+bXlfdHJlZTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Ob2RlPC9zcGFuPiB7IGxlZnQgPSA8c3BhbiBzdHls ZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5MZWFmPC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4xPC9zcGFuPjsgcmlnaHQgPSA8c3BhbiBz dHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5MZWFmPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4yPC9zcGFuPiB9DQo8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52YWxpZGF0aW9uX3Jlc3VsdDwvc3Bhbj4gPSB2YWxpZGF0 ZV90cmVlIG15X3RyZWUNCjwvcHJlPg0KPC9kaXY+DQo8cD5J4oCZbSBhbHNvIGV4Y2l0ZWQgdG8g YW5ub3VuY2UgdGhhdCB0aGUgdmFsaWRhdGUgQVBJIGlzIG5vdyBzdGFibGUuIFdoaWxlIEkgcGxh biB0byBrZWVwIGVuaGFuY2luZyB0aGUgbGlicmFyeSBieSBhZGRpbmcgbmV3IGFubm90YXRpb25z IGZvciBkaWZmZXJlbnQgdmFsaWRhdG9ycyBvdmVyIHRpbWUsIEkgYXNzdXJlIHlvdSBvZiBjb25z aXN0ZW50IGFuZCByZWxpYWJsZSBmdW5jdGlvbmFsaXR5IGluIGZ1dHVyZSB1cGRhdGVzLg0KPC9w Pg0KPHA+SWYgeW91IGhhdmUgc3VnZ2VzdGlvbnMgZm9yIG5ldyB2YWxpZGF0b3JzIG9yIGZlYXR1 cmVzLCB3ZeKAmWQgbG92ZSB0byBoZWFyIHRoZW0uIFlvdXIgZmVlZGJhY2sgaXMgY3J1Y2lhbCBp biBzaGFwaW5nIHRoZSBmdXR1cmUgb2YNCjxjb2RlPnZhbGlkYXRlPC9jb2RlPiAuIDwvcD4NCjxw PlRvIGRpdmUgZGVlcGVyIGludG8gPGNvZGU+dmFsaWRhdGU8L2NvZGU+IDEuMC4wLCBjaGVjayBv dXQgb3VyIEdpdEh1YiBwYWdlOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQXhvdDAxNy92 YWxpZGF0ZSI+DQpodHRwczovL2dpdGh1Yi5jb20vQXhvdDAxNy92YWxpZGF0ZTwvYT4gPC9wPg0K PHA+SGFwcHkgQ29kaW5nISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5Db25n cmF0dWxhdGlvbiB0byB0aGUgT0NhbWwgdGVhbSBmb3IgdGhlIDIwMjMgU0lHUExBTiBwcm9ncmFt bWluZyBsYW5ndWFnZXMgc29mdHdhcmUgYXdhcmQhIPCfj4Y8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9jb25ncmF0dWxhdGlvbi10by10aGUtb2NhbWwtdGVhbS1mb3It dGhlLTIwMjMtc2lncGxhbi1wcm9ncmFtbWluZy1sYW5ndWFnZXMtc29mdHdhcmUtYXdhcmQvMTI0 MzcvMyI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY29uZ3JhdHVsYXRpb24tdG8tdGhl LW9jYW1sLXRlYW0tZm9yLXRoZS0yMDIzLXNpZ3BsYW4tcHJvZ3JhbW1pbmctbGFuZ3VhZ2VzLXNv ZnR3YXJlLWF3YXJkLzEyNDM3LzM8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzRiZTUzZDUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0YmU1 M2Q1Ij5YYXZpZXIgTGVyb3kgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc0YmU1M2Q1Ij4NCjxwPlRvIGZvbGxvdyB1cCBvbiBAc3BkZWdhYnJp ZWxsZeKAmXMgbmljZSBtZXNzYWdlOiB0aGUgU0lHUExBTiBQTCBTb2Z0d2FyZSBBd2FyZCAyMDIz IHdhcyBmb3JtYWxseSBnaXZlbiB0byB0aGUgT0NhbWwgZGV2ZWxvcG1lbnQgdGVhbSBsYXN0IHdl ZWsgYXQgUE9QTCAyMDI0IGluIExvbmRvbiwgYW5kIEkgd2FzIHZlcnkgcGxlYXNlZCBhbmQgaG9u b3JlZCB0byBnaXZlIHRoZSByZWNlcHRpb24gc3BlZWNoIG9uIGJlaGFsZiBvZiB0aGUgdGVhbS4g Rm9yDQogdGhlIHJlY29yZCwgSeKAmWxsIHBvc3QgdGhlIHNwZWVjaCBuZXh0LiA8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmNlNmRjMiIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzJjZTZkYzIiPlhhdmllciBMZXJveSB0aGVuIHNhaWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzJjZTZkYzIiPg0K PHA+SXTigJlzIGFuIGhvbm9yIGZvciB0aGUgd2hvbGUgT0NhbWwgZGV2ZWxvcG1lbnQgdGVhbSB0 byByZWNlaXZlIHN1Y2ggYSBwcmVzdGlnaW91cyBhd2FyZC4gU29tZSBvZiB1cyBhcmUgaGVyZSB0 b25pZ2h0OiBHYWJyaWVsIFNjaGVyZXIsIERhbWllbiBEb2xpZ2V6LCBGbG9yaWFuIEFuZ2VsZXR0 aSwgTHVjIE1hcmFuZ2V0LCBEYXZpZCBBbGxzb3BwLCBTdGVwaGVuIERvbGFuLCBOaWNvbGFzIE9q ZWRhIELDpHIsIGFuZCBJ4oCZbSBYYXZpZXIgTGVyb3kuDQogSXTigJlzIHR3bywgYWxtb3N0IHRo cmVlIGdlbmVyYXRpb25zIG9mIGNvbXB1dGVyIHNjaWVudGlzdHMgYW5kIGRldmVsb3BlcnMgdGhh dCBhcmUgYmVpbmcgaG9ub3JlZOKApg0KPC9wPg0KPHA+VGhlcmUgaXMgbm8gZGVueWluZyB0aGF0 IE9DYW1sIGhhcyBiZWVuIGEgbG9uZy10ZXJtIHByb2plY3QuIEkgcmVsZWFzZWQgdGhlIGZpcnN0 IHZlcnNpb24gb2YgT0NhbWwsIHRoZW4gY2FsbGVkIE9iamVjdGl2ZSBDYW1sLCBpbiAxOTk2LCBh bG1vc3QgMjggeWVhcnMgYWdvLiBCdXQgaXQgd2FzIGFscmVhZHkgdGhlIGNvbnNvbGlkYXRpb24g b2YgbXVjaCBlYXJsaWVyIHdvcmssIGdvaW5nIGJhY2sgbW9yZSB0aGFuIDUwIHllYXJzIGZyb20g bm93Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlJvYmluIE1pbG5lcuKAmXMgd29y ayBvbiDigJxNTOKAnSwgdGhlIE1ldGEgTGFuZ3VhZ2UgKHNjcmlwdGluZyBsYW5ndWFnZSkgb2Yg aGlzIExDRiBwcm9vZiBhc3Npc3RhbnQsIHdoaWNoIGludHJvZHVjZWQgdGhlIGxvdmVseSB0eXBl IHN5c3RlbSBhbmQgdHlwZSBpbmZlcmVuY2UgYWxnb3JpdGhtIHdlIGFsbCBrbm93Lg0KPC9saT48 bGk+VGhlbiBHw6lyYXJkIEh1ZXQgYnJvdWdodCBMQ0YgTUwgYmFjayBob21lIHRvIFJvY3F1ZW5j b3VydCBvbiBhIG1hZ25ldGljIHRhcGUsIGFuZCBsaWtlZCBpdCBzbyBtdWNoIHRoYXQgd2l0aCBH dXkgQ291c2luZWF1IGFuZCB0aGVpciBzdHVkZW50cywgdGhleSBkZXZlbG9wZWQgQ0FNTCwgYW4g aW1wbGVtZW50YXRpb24gb2YgTWlsbmVy4oCZcyBNTCB1c2luZyB0aGUgQ0FNICh0aGUgQ2F0ZWdv cmljYWwgQWJzdHJhY3QgTWFjaGluZSkgYXMgaW50ZXJtZWRpYXRlDQogbGFuZ3VhZ2Ug4oCTIGhl bmNlIHRoZSBDQU1MIG5hbWUuIEFuZCB0aGV5IHVzZWQgaXQgYXMgdGhlIGltcGxlbWVudGF0aW9u IGxhbmd1YWdlIGZvciB3aGF0IHdhcyB0byBiZWNvbWUgdGhlIENvcSBwcm9vZiBhc3Npc3RhbnQu DQo8L2xpPjxsaT5UaGVuLCB0d28gc3R1ZGVudHMgb2YgQ291c2luZWF1IGF0IEVOUywgRGFtaWVu IERvbGlnZXogYW5kIEksIGZlbGwgaW4gbG92ZSB3aXRoIHRoZSBDQU1MIGxhbmd1YWdlIGFuZCBk ZXZlbG9wZWQgQ2FtbCBMaWdodCwgYSBsaWdodHdlaWdodCwgb3Blbi1zb3VyY2UgaW1wbGVtZW50 YXRpb24gb2YgQ0FNTCBzdWl0YWJsZSBmb3IgdGVhY2hpbmcgYW5kIHBvcHVsYXJpemluZyB0aGUg bGFuZ3VhZ2UuDQo8L2xpPjwvdWw+DQo8cD5TbywgdGhlIDE5OTYgMS4wIHJlbGVhc2Ugb2YgT0Nh bWwgd2FzIGFscmVhZHkgYSBjb25zb2xpZGF0aW9uIG9mIHRoZSBDQU1MIGxhbmd1YWdlLCB0aGUg bWVtb3J5IG1hbmFnZW1lbnQgYW5kIHZpcnR1YWwgbWFjaGluZSBmcm9tIENhbWwgTGlnaHQsIG15 IGVhcmx5IDE5OTDigJlzIHdvcmsgb24gbmF0aXZlIGNvbXBpbGF0aW9uIGFuZCBTdGFuZGFyZCBN TC1zdHlsZSBtb2R1bGUgc3lzdGVtcywgYW5kIErDqXLDtG1lIFZvdWlsbG9u4oCZcyBQaEQgd29y aw0KIG9uIHR5cGUgc3lzdGVtcyBhbmQgdHlwZSBpbmZlcmVuY2UgZm9yIG9iamVjdHMuIDwvcD4N CjxwPlNpbmNlIHRoZW4sIE9DYW1sIGhhcyBjb250aW51ZWQgdG8gcGljayB1cCBuZXcgZmVhdHVy ZXMgYXJpc2luZyBmcm9tIFBMIHJlc2VhcmNoLCBzdWNoIGFzIEdlbmVyYWxpemVkIEFsZ2VicmFp YyBEYXRhIFR5cGVzIGluIHRoZSBsYXRlIDIwMDDigJlzLCBvciB2ZXJ5IHJlY2VudGx5IHVzZXIt ZGVmaW5lZCBlZmZlY3RzIGFuZCBlZmZlY3QgaGFuZGxlcnMsIG1ha2luZyBPQ2FtbCBvbmUgb2Yg dGhlIGZpcnN0IG5vbi1leHBlcmltZW50YWwgbGFuZ3VhZ2VzDQogdG8gc3VwcG9ydCBlZmZlY3Rz LiBUaGlzIGFyb3NlIGZyb20gdGhlIE11bHRpY29yZSBPQ2FtbCBwcm9qZWN0LCBhbG9uZyB3aXRo IHN1cHBvcnQgZm9yIHNoYXJlZC1tZW1vcnkgcGFyYWxsZWxpc20sIGF0IGxvbmcgbGFzdCEsIGFu ZCBhIG5ldyByZWxheGVkIG1lbW9yeSBtb2RlbC4NCjwvcD4NCjxwPkJ1dCB0aGF04oCZcyBub3Qg dGhlIG9ubHkgd2F5IGluIHdoaWNoIE9DYW1sIGhhcyBzZXJ2ZWQgYW5kIGNvbnRpbnVlcyB0byBz ZXJ2ZSByZXNlYXJjaCBpbiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIElmIHlvdSBsb29rIGF0IHBy ZXZpb3VzIHJlY2lwaWVudHMgZm9yIHRoaXMgU0lHUExBTiBzb2Z0d2FyZSBzeXN0ZW0gYXdhcmQs IHlvdeKAmWxsIGZpbmQgdGhlIENvcSBwcm9vZiBhc3Npc3RhbnQsIHdoaWNoIGlzIGltcGxlbWVu dGVkIGluIE9DYW1sOw0KIHRoZSBDb21wQ2VydCBDIGNvbXBpbGVyLCB3aGljaCBhbHNvIHVzZXMg T0NhbWwgZm9yIGl0cyBub24tdmVyaWZpZWQgcGFydHM7IGFzIHdlbGwgYXMgV2ViQXNzZW1ibHks IHdob3NlIHJlZmVyZW5jZSBpbnRlcnByZXRlciBpcyB3cml0dGVuIGluIE9DYW1sLiBBbmQgbG9v a2luZyBhdCBwb3NzaWJsZSBmdXR1cmUgcmVjaXBpZW50cywgeW914oCZbGwgZmluZCBSdXN0LCB3 aG9zZSBmaXJzdCBjb21waWxlciB3YXMgd3JpdHRlbiBpbiBPQ2FtbDsgU1RBTiwNCiB0aGUgcHJv YmFiaWxpc3RpYyBwcm9ncmFtbWluZyBsYW5ndWFnZSB3aG9zZSBjb21waWxlciB3YXMgcmVjZW50 bHkgcmV3cml0dGVuIGluIE9DYW1sOyBhbmQgSlNDZXJ0LCB0aGUgSmF2YXNjcmlwdCBmb3JtYWxp emF0aW9uIHRoYXQgYWxzbyB1c2VzIE9DYW1sIGZvciBpdHMgcmVmZXJlbmNlIGludGVycHJldGVy Lg0KPC9wPg0KPHA+T2YgY291cnNlLCB0aGVzZSBhcmUgbm90IHRoZSBvbmx5IHVzZXMgb2YgT0Nh bWwhIEZvciBzb21ldGhpbmcgY29tcGxldGVseSBkaWZmZXJlbnQ6IGhvdyBtYW55IG9mIHlvdSB0 b29rIHRoZSBFdXJvc3RhciB0cmFpbiB0byBjb21lIGhlcmU/IG9yIGZsZXcgYW4gQWlyYnVzIHBs YW5lPyBDaGFuY2VzIGFyZSB0aGF0IGEgZ29vZCBjaHVuayBvZiB0aGUgc29mdHdhcmUgZW1iZWRk ZWQgaW4geW91ciBwbGFuZSBvciBpbiB5b3VyIHRyYWluIHdhcw0KIGdlbmVyYXRlZCBmcm9tIFND QURFIGJsb2NrIGRpYWdyYW1zIGJ5IGFuIE9DYW1sIHByb2dyYW0sIHRoZSBTQ0FERSBLQ0cgNiBj b21waWxlci4NCjwvcD4NCjxwPlNvLCB3ZeKAmXJlIHZlcnkgcHJvdWQgb2Ygb3VyIGdyZWF0ZXIg dXNlciBjb21tdW5pdHkgYW5kIGFsbCB0aGV5IGRvIHdpdGggT0NhbWwsIGJvdGggaW4gY2xhc3Np YyBhcHBsaWNhdGlvbiBhcmVhcyBmb3IgTUwgbGFuZ3VhZ2VzIHN1Y2ggYXMgdGhlb3JlbSBwcm92 ZXJzLCBwcm9vZiBhc3Npc3RhbnRzLCBzdGF0aWMgYW5hbHl6ZXJzLCB2ZXJpZmljYXRpb24gdG9v bHMsIGNvbXBpbGVycywgY29kZSBnZW5lcmF0b3JzLCBldGMuOyBhbmQgaW4gbW9yZQ0KIHVudXN1 YWwgYXJlYXMgc3VjaCBhcyBzeXN0ZW1zIHByb2dyYW1taW5nLiA8L3A+DQo8cD5XaGVuIERhbWll biBhbmQgSSB3ZXJlIGhhY2tpbmcgQ2FtbCBMaWdodCBpbiAxOTkwLCB3ZSBoYWQgbm8gaWRlYSB0 aGF0IDEwIHllYXJzIGxhdGVyIHRoZSBFbnNlbWJsZSBwZW9wbGUgYXQgQ29ybmVsbCBhbmQgSUJN IHdvdWxkIHJlaW1wbGVtZW50IGEgd2hvbGUgbmV0d29yayBhbmQgcHJvdG9jb2wgc3RhY2sgZm9y IGRpc3RyaWJ1dGVkIGFwcGxpY2F0aW9ucyBpbiBPQ2FtbCBhbmQgZ2V0IGJldHRlciBsYXRlbmN5 IHRoYW4gdGhlaXIgcHJldmlvdXMNCiBDJiM0MzsmIzQzOyBpbXBsZW1lbnRhdGlvbi4gVGhlbiBj YW1lIHJlYWwtdGltZSB0cmFkaW5nLCB3ZWIgcmFkaW9zIGFuZCBhdWRpbyBzdHJlYW1pbmcsIHRo ZSBJcm1pbiBkaXN0cmlidXRlZCBkYXRhYmFzZSwgTWlyYWdlIHVuaWtlcm5lbHMgdGhhdCBib290 IG9uIGEgYmFyZSBoeXBlcnZpc29yLCBhbmQgbW9yZS4NCjwvcD4NCjxwPldoYXQgbWFkZSB0aGF0 IHBvc3NpYmxlPyBOb3QganVzdCBmYW5jeSB0eXBlcyBhbmQgbmljZSBtb2R1bGVzIOKAkyBldmVu IHRob3VnaCBzeXN0ZW1zIHByb2dyYW1tZXJzIHZhbHVlIHR5cGUgc2FmZXR5IGFuZCBtb2R1bGFy aXR5IGhpZ2hseSDigJMgYnV0IGFsc28gYmFzaWMgcHJvcGVydGllcyBvZiBPQ2FtbDoNCjwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5hIGxhbmd1YWdlIHdpdGggYSBzaW1wbGUgY29zdCBt b2RlbCwgd2hlcmUgaXTigJlzIGVhc3kgdG8gdHJhY2sgaG93IG11Y2ggdGltZSBhbmQgaG93IG11 Y2ggc3BhY2UgaXMgdXNlZDsNCjwvbGk+PGxpPmEgY29tcGlsZXIgdGhhdCBwcm9kdWNlcyBlZmZp Y2llbnQgY29kZSB0aGF0IGxvb2tzIGxpa2UgdGhlIHNvdXJjZSBjb2RlLCB3aXRoIG9ubHkgcHJl ZGljdGFibGUgb3B0aW1pemF0aW9uczsNCjwvbGk+PGxpPmEgbG93LWxhdGVuY3kgZ2FyYmFnZSBj b2xsZWN0b3IsIHVzYWJsZSBmb3Igc29mdCByZWFsLXRpbWUgYXBwbGljYXRpb25zLiBUbyB1cyBQ TCBmb2xrcywgdGhpcyBkb2VzbuKAmXQgc291bmQgbGlrZSBtdWNoLiBHb29kIGx1Y2sgZ2V0dGlu ZyBhIHBhcGVyIGFjY2VwdGVkIGF0IFBPUEwgb3IgUExESSBiYXNlZCBvbiB0aGVzZSBpZGVhcyEg WWV0LCB0aGF04oCZcyBjcnVjaWFsIHRvIG9wZW4gdGhlIHdheSB0byBtYW55IGV4Y2l0aW5nIGFw cGxpY2F0aW9ucy4NCjwvbGk+PC91bD4NCjxwPldpbGwgdGhlcmUgYmUgb3RoZXIgY2hhbmNlIGVu Y291bnRlcnMgd2l0aCBuZXcgYXBwbGljYXRpb24gYXJlYXMgbGlrZSB0aGlzIGZvciBPQ2FtbCBp biB0aGUgZnV0dXJlPyBJIGhhdmUgbm8gaWRlYSDigJMgYW5kIHRoYXTigJlzIHdoYXQgbWFrZXMg UEwgcmVzZWFyY2ggZXhjaXRpbmcsIGV2ZW4gYWZ0ZXIgYWxsIHRoZXNlIHllYXJzIQ0KPC9wPg0K PHA+QXQgYW55IHJhdGUsIHdlLCB0aGUgcmVjaXBpZW50cyBvZiB0aGlzIGF3YXJkLCBhcmUgcHJv dWQgb2YgdGhlIGFjaGlldmVtZW50cyBvZiB0aGUgT0NhbWwgdXNlciBjb21tdW5pdHksIGFuZCBk ZWVwbHkgaG9ub3JlZCB0byBzZWUgb3VyIGVmZm9ydHMgcmVjb2duaXplZCBieSB0aGlzIGF3YXJk LiBUaGFuayB5b3UhDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci0xMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEyIj5QYXJ0aWNp cGF0ZSBpbiBPQ2FtbC5vcmcgTGVhcm4gQXJlYSBVc2VyIFRlc3Rpbmc8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEyIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wYXJ0aWNpcGF0ZS1pbi1vY2FtbC1vcmctbGVhcm4t YXJlYS11c2VyLXRlc3RpbmcvMTM5NjQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv cGFydGljaXBhdGUtaW4tb2NhbWwtb3JnLWxlYXJuLWFyZWEtdXNlci10ZXN0aW5nLzEzOTY0LzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg4NzJiNjQi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4ODcyYjY0Ij5TYWJpbmUgU2NobWFsdHog YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4 ODcyYjY0Ij4NCjxwPldlIG5lZWQgc29tZSBoZWxwIHdpdGggdXNhYmlsaXR5IHRlc3Rpbmcgb24g dGhlIE9DYW1sLm9yZyBMZWFybiBhcmVhISA8L3A+DQo8cD48Yj5XaGF04oCZcyBpdCBhbGwgYWJv dXQ/PC9iPiA8L3A+DQo8cD5XZeKAmXJlIGNvbmR1Y3RpbmcgdXNlciB0ZXN0aW5nIHNlc3Npb25z IHRvIGVuaGFuY2UgdGhlIFVYL1VJIGFuZCBjb250ZW50IG9mIHRoZSBPQ2FtbC5vcmcgbGVhcm5p bmcgYXJlYS4gVGhpcyBpcyBhbiBvcHBvcnR1bml0eSBmb3IgaW5kaXZpZHVhbHMgd2l0aCBubyBw cmlvciBrbm93bGVkZ2Ugb2YgT0NhbWwuDQo8L3A+DQo8cD5XZSB3aWxsIGRvIGEgMToxIHZpZGVv IGNhbGwgd2l0aCB5b3Ugd2hlcmUgd2UgcHJlc2VudCB5b3Ugd2l0aCBhIEdpdEh1YiBjb2Rlc3Bh Y2UgdGhhdCBnaXZlcyB5b3UgYSBzZXQgb2YgcHJvZ3JhbW1pbmcgdGFza3MgdG8gc29sdmUuIFdl IHdhbnQgdG8gbGVhcm4gZnJvbSB5b3Ugc29sdmluZyAob3IgdHJ5aW5nIHRvIHNvbHZlKSB0aGUg dGFza3MgaW4gb3JkZXIgdG8gaW1wcm92ZSB0aGUgZG9jdW1lbnRhdGlvbi4NCjwvcD4NCjxwPldl IHdpbGwgc2hhcmUgcmVsZXZhbnQgZG9jdW1lbnRzIG9yIG1hdGVyaWFscyBiZWZvcmUgdGhlIHNl c3Npb24uIDwvcD4NCjxwPjxiPktleSBDcml0ZXJpYSBmb3IgUGFydGljaXBhbnRzOjwvYj4gPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk5vIHByZXZpb3VzIGV4cGVyaWVuY2Ugd2l0aCBP Q2FtbCA8L2xpPjxsaT5JbnRlcmVzdGVkIGluIGxlYXJuaW5nIE9DYW1sIDwvbGk+PGxpPkJlIGF2 YWlsYWJsZSBmb3IgYSAxIGhvdXIgdmlkZW8gY2FsbCA8L2xpPjwvdWw+DQo8cD48Yj5Ib3cgdG8g UGFydGljaXBhdGU6PC9iPiBTaW1wbHkgZXhwcmVzcyB5b3VyIGludGVyZXN0IHRocm91Z2ggPGEg aHJlZj0iaHR0cHM6Ly9mb3Jtcy5nbGUvWHBUZ0E1Tm1aWm1jcGFGMUEiPg0KdGhpcyBHb29nbGUg Rm9ybTwvYT4uIFNwb3RzIGFyZSBsaW1pdGVkISA8L3A+DQo8cD5PYnZpb3VzbHksIG1vc3QgcGVv cGxlIGhlcmUgcmVhZGluZyB0aGlzIHdpbGwgbm90IG1lZXQgdGhlIGNyaXRlcmlhIChiZWNhdXNl IG9mIHByZXZpb3VzIE9DYW1sIGtub3dsZWRnZSksIGhvd2V2ZXIsIGluIHRoaXMgY2FzZSwgd2Ug YXNrIHlvdSB0byByZWFjaCBvdXQgYW5kIHNoYXJlIHRoaXMgaW52aXRhdGlvbiB3aXRoIGZyaWVu ZHMgb3IgYWNxdWFpbnRhbmNlcyB3aG8gbWlnaHQgYmUgd2lsbGluZyBhbmQgcXVhbGlmaWVkIHRv IHBhcnRpY2lwYXRlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMyI+T3RoZXIg T0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTMi PjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTljNmMzYSIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U5YzZjM2EiPkZyb20gdGhlIG9jYW1sLm9yZyBibG9nPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdlOWM2YzNhIj4NCjxw PkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IDxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxvZzwvYT4uIDwv cD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29t L2Jsb2cvMjAyNC0wMS0yNC1taXJhZ2Vvcy1kZXNpZ25pbmctYS1tb3JlLXJlc2lsaWVudC1uZXR3 b3JraW5nLXN0YWNrLXdpdGgtdGNwIj5NaXJhZ2VPUzogRGVzaWduaW5nIGEgTW9yZSBSZXNpbGll bnQgTmV0d29ya2luZyBTdGFjayBXaXRoIMK1VENQPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzAxXzIzX29wYW1fMTAxX3RoZV9maXJzdF9zdGVw cyI+b3BhbSAxMDE6IHRoZSBmaXJzdCBzdGVwczwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVlNzJlMzgiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmc1ZTcyZTM4Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmc1ZTcyZTM4Ij4NCjxwPklmIHlvdSBoYXBw ZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBv bHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwg aXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJj aGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5 IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8v c3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9w Pg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZzU3MzVkN2UiPg0KPHA+PGEgaHJlZj0i aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 23 Jan 2024 09:45:35 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 23 Jan 2024 09:45:34 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 23 Jan 2024 09:45:34 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40N9jvqa016172 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 23 Jan 2024 09:45:57 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40N9jiH8016156 for ; Tue, 23 Jan 2024 09:45:44 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Jan 2024 10:45:42 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id C4D26E0CD8; Tue, 23 Jan 2024 10:45:42 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id BD7D6E008A for ; Tue, 23 Jan 2024 10:45:36 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jan 2024 10:45:34 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9735C561219; Tue, 23 Jan 2024 10:45:25 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaTeDpStJqmVn8dUaQsjMo7T8Jaw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 23 Jan 2024 09:45:13 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 8069d0ce-e4a5-421c-7477-08dc1bf80c24 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.05,214,1701126000"; d="scan'208,217";a="148133949" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.492732, queueID=DD2FA56121C x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMS0yMyBUdWUgMTA6NDMgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDEuMTYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMS4zMC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMTYgdG8gMjMsIDIwMjQuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+VGhlIE9DYW1sIGNvbW11bml0eSBp cyBzaWduZWQgdXAgZm9yIE91dHJlYWNoeSE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5PQ2Ft bC5vcmcgTmV3c2xldHRlcjogTm92ZW1iZXIgYW5kIERlY2VtYmVyIDIwMjM8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiMzIj5EaXNjdXNzaW9ucyBvbiB0aGUgZnV0dXJlIG9mIHRoZSBvcGFtIHJlcG9z aXRvcnk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5kdW5lIDMuMTM8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM1Ij5vcGFtIDIuMi4wfmJldGExPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+Wmlw YyAwLjEuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiNvcmdlZTg5Y2EwIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjEiPlRoZSBPQ2FtbCBjb21tdW5pdHkgaXMgc2lnbmVkIHVwIGZvciBPdXRy ZWFjaHkhPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxw PkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90aGUtb2NhbWwt Y29tbXVuaXR5LWlzLXNpZ25lZC11cC1mb3Itb3V0cmVhY2h5LzEzODkyLzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3RoZS1vY2FtbC1jb21tdW5pdHktaXMtc2lnbmVkLXVwLWZvci1v dXRyZWFjaHkvMTM4OTIvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnZjA4Nzg5NSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2YwODc4OTUi PlNvbmphIEhlaW56ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2YwODc4OTUiPg0KPHA+SGVsbG8gZXZlcnlvbmUgOndhdmU6IDwvcD4NCjxw PlZlcnkgZ29vZCBuZXdzOiBUaGUgT0NhbWwgY29tbXVuaXR5IGlzIHNpZ25lZCB1cCBmb3IgdGhl IG5leHQgT3V0cmVhY2h5IHJvdW5kIHdpdGggZm91ciBzbG90cyBhZ2FpbiENCjwvcD4NCjxwPjxh IGhyZWY9Imh0dHBzOi8vd3d3Lm91dHJlYWNoeS5vcmcvIj5PdXRyZWFjaHk8L2E+IGlzIGEgbm9u LXByb2ZpdCBwcm92aWRpbmcgYW4gb3Zlci1hcmNoaW5nIHN0cnVjdHVyZSBmb3Igb3Blbi1zb3Vy Y2UgY29tbXVuaXRpZXMgdG8gb2ZmZXIgdGhyZWUgbW9udGhzIGxvbmcgcmVtb3RlIGludGVybnNo aXBzIHRvIGZvbGtzIGZyb20gdW5kZXJyZXByZXNlbnRlZCBiYWNrZ3JvdW5kcyBpbiBvcGVuLXNv dXJjZS4gUGFydGljaXBhdGluZyBpbiBPdXRyZWFjaHkNCiBpcyBhIGdyZWF0IG9wcG9ydHVuaXR5 IGZvciBhbnkgb3Blbi1zb3VyY2UgY29tbXVuaXR5IHRvIHdvcmsgd2l0aCBuZXcgcGVvcGxlLCB0 byBpbmNyZWFzZSBpdHMgb3V0cmVhY2gsIGFuZCB0byBvcGVuIGEgZmlyc3QgZG9vciB0byBtb3Jl IGRpdmVyc2l0eSBpbiB0aGUgY29tbXVuaXR5Lg0KPC9wPg0KPHA+VGhlIDxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL291dHJlYWNoeSI+T0NhbWwgY29tbXVuaXR5IGhhcyBhIGxvbmcgaGlzdG9y eTwvYT4gb2YgcGFydGljaXBhdGluZyBpbiB0aGF0IHdvbmRlcmZ1bCBpbml0aWF0aXZlLiBUaGVy ZSBoYXZlIGJlZW4gYWxsIGtpbmRzIG9mIE9DYW1sIHByb2plY3RzIHRoYXQgaW50ZXJucyBoYXZl IHdvcmtlZCBvbiwgc2hhcGVkLCBhbmQgZ2l2ZW4gaW5wdXQgdG8gZXZlcnkgeWVhciBzaW5jZSAy MDE0ICh3aXRoDQogdGhlIGV4Y2VwdGlvbiBvZiAyMDE3LzE4KS4gQW5kIGFsc28gdGhpcyAoTm9y dGhlcm4gaGVtaXNwaGVyZSkgd2ludGVyLCA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvd2VsY29taW5nLW91ci1uZXctb3V0cmVjaHktaW50ZXJucy8xMzY1MiI+DQp3ZeKAmXJl IGhhdmluZyB0aHJlZSBhbWF6aW5nIGludGVybnMgd2l0aCB1czwvYT4uIDwvcD4NCjxwPlNvLCBh cyBhIGZpcnN0IHBvaW50LCBJIHdhbnQgdG8gc2F5OiBUaGFuayB5b3UsIGV2ZXJ5b25lISA6aGVh cnQ6IEkgbXlzZWxmIGhhdmUgc3RhcnRlZCBiZWluZyBpbnZvbHZlZCBpbiB0aGUgT0NhbWwgT3V0 cmVhY2h5IG9yZ2FuaXphdGlvbiBvbmx5IHJlY2VudGx5LCB3aGlsZSB0aGUgd2hvbGUgY29tbXVu aXR5IGhhcyBiZWVuIGRyaXZpbmcgdGhpcyBmb3IgYSBsb25nIHRpbWUgbm93LiBBbmQgdGhhdOKA mXMgb25lIG9mIHRoZSBtYW55IHRoaW5ncw0KIHRoYXTigJlzIHJlYWxseSByZWFsbHkgbmljZSBh Ym91dCBPQ2FtbDogVGhlcmUgYXJlIG5pY2UgaW5kdXN0cmlhbCB1c2VycywgaW4gdGhpcyBjYXNl DQo8YSBocmVmPSJodHRwczovL3d3dy5qYW5lc3RyZWV0LmNvbS8iPkphbmUgU3RyZWV0PC9hPiBh bmQgPGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS8iPg0KVGFyaWRlczwvYT4sIHdob+KAmXJl IHdpbGxpbmcgdG8gZnVuZCB0aGVzZSBraW5kcyBvZiBlZmZvcnRzLCBhbmQgdGhlcmXigJlzIGEg d2hvbGUgbG90IG9mIGNvbW11bml0eSBtZW1iZXJzIHdob+KAmXJlIHdpbGxpbmcgdG8gKGFuZCBl bmpveSEpIGdldHRpbmcgaW52b2x2ZWQsIGNvbWUgdXAgd2l0aCBwcm9qZWN0cywgYW5kIG1lbnRv ci4NCjwvcD4NCjxwPkFuZCB0aGF0IGJyaW5ncyBtZSB0byBteSBzZWNvbmQgcG9pbnQ6IERvIHJl YWNoIG91dCB0byB1cyBpZiB5b3UgYWxzbyB3YW50IHRvIGZvcm0gcGFydCBvZiB0aGlzLiBJdOKA mXMgdXAgdG8geW91IHdoZXRoZXIgeW91IHdhbnQgdG8gd3JpdGUgaW4gdGhpcyB0aHJlYWQgb3Ig dG8gRE0gQHBhdHJpY29mZXJyaXMgYW5kL29yIG1lIChAcGl0YWcpLiBKdXN0IGxpa2UgaW4gdGhl IGxhc3QgY291cGxlIG9mIHJvdW5kcywgSSBhbHJlYWR5IGhhdmUgYQ0KIGZldyBjb25jcmV0ZSBw ZW9wbGUgaW4gbWluZCB0byByZWFjaCBvdXQgdG8gZm9yIHRoZSB1cGNvbWluZyByb3VuZC4gSG93 ZXZlciwgSSBkb27igJl0IGtub3cgYW5kIGNhbuKAmXQga25vdyBldmVyeW9uZSBpbiB0aGUgY29t bXVuaXR5IGluIHBlcnNvbi4gU28gbWUgcmVhY2hpbmcgb3V0IHRvIHBlb3BsZSBpcyB3b3JraW5n IHdlbGwgc28gZmFyLCBidXQgcGVvcGxlIHJlYWNoaW5nIG91dCB0byB1cyB3b3VsZCBiZSBtdWNo IGVhc2llciBhbmQgYSBsb3QNCiBsZXNzIHJlc3RyaWN0aXZlLiA8L3A+DQo8cD5QRDogSeKAmWxs IHBvc3QgaGVyZSB3aXRoIHRoZSByZWxldmFudCBkYXRlcyBmb3IgdGhlIG5leHQgcm91bmQgb25j ZSB0aGV5IGJlY29tZSBtb3JlIHJlbGV2YW50LiBUbyBhbHJlYWR5IGdpdmUgb25lIGRhdGU6IFRo ZSBkZWFkbGluZSBmb3IgT0NhbWwgY29tbXVuaXR5IG1lbWJlcnMgdG8gc3VibWl0IGludGVybnNo aXAgcHJvamVjdHMgaXMNCjxiPjxiPkZlYi4gMjMsIDIwMjQ8L2I+PC9iPi4gPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBOb3ZlbWJlciBhbmQg RGVjZW1iZXIgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2Nh bWwtb3JnLW5ld3NsZXR0ZXItbm92ZW1iZXItYW5kLWRlY2VtYmVyLTIwMjMvMTM4OTUvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItbm92ZW1iZXIt YW5kLWRlY2VtYmVyLTIwMjMvMTM4OTUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnYjI5NzMxMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2IyOTczMTIiPlNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2IyOTczMTIiPg0KPHA+V2VsY29tZSB0byB0aGUgTm92 ZW1iZXIgYW5kIERlY2VtYmVyIDIwMjMgZWRpdGlvbiBvZiB0aGUgT0NhbWwub3JnIG5ld3NsZXR0 ZXIhIFRoaXMgdXBkYXRlIGhhcyBiZWVuIGNvbXBpbGVkIGJ5IHRoZSBPQ2FtbC5vcmcgdGVhbS4g WW91IGNhbiBmaW5kDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3RhZy9vY2Ft bG9yZy1uZXdzbGV0dGVyIj5wcmV2aW91cyB1cGRhdGVzPC9hPiBvbiBEaXNjdXNzLg0KPC9wPg0K PHA+T3VyIGdvYWwgaXMgdG8gbWFrZSBPQ2FtbC5vcmcgdGhlIGJlc3QgcmVzb3VyY2UgZm9yIGFu eW9uZSB3aG8gd2FudHMgdG8gZ2V0IHN0YXJ0ZWQgYW5kIGJlIHByb2R1Y3RpdmUgaW4gT0NhbWwu IFRoZSBPQ2FtbC5vcmcgbmV3c2xldHRlciBwcm92aWRlcyBhbiB1cGRhdGUgb24gb3VyIHByb2dy ZXNzIHRvd2FyZHMgdGhhdCBnb2FsIGFuZCBhbiBvdmVydmlldyBvZiB0aGUgY2hhbmdlcyB3ZSBh cmUgd29ya2luZyBvbi4NCjwvcD4NCjxwPldlIGNvdWxkbuKAmXQgZG8gaXQgd2l0aG91dCBhbGwg dGhlIGFtYXppbmcgT0NhbWwgY29tbXVuaXR5IG1lbWJlcnMgd2hvIGhlbHAgdXMgcmV2aWV3LCBy ZXZpc2UsIGFuZCBjcmVhdGUgYmV0dGVyIE9DYW1sIGRvY3VtZW50YXRpb24uIFlvdXIgZmVlZGJh Y2sgZW5hYmxlcyB1cyB0byBiZXR0ZXIgcHJpb3JpdGlzZSBvdXIgd29yayBhbmQgbWFrZSBwcm9n cmVzcyB0b3dhcmRzIG91ciBnb2FsLiBUaGFuayB5b3UhDQo8L3A+DQo8cD5UaGlzIG5ld3NsZXR0 ZXIgY292ZXJzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+TGVhcm4gQXJlYTo8 L2I+IFdlIG1hZGUgc3Vic3RhbnRpYWwgY2hhbmdlcyB0byB0aGUgTGVhcm4gQXJlYSBVSSwgaW50 cm9kdWNpbmcgYSBuZXcgbGFuZGluZyBwYWdlIGFuZCBpbXByb3ZpbmcgdmFyaW91cyBlbGVtZW50 cyBvbiB0aGUgTGVhcm4gQXJlYeKAmXMgc3VicGFnZXMuIFdvcmsgb24gYSBkb2N1bWVudGF0aW9u IHNlYXJjaCBmZWF0dXJlIGlzIGluIHByb2dyZXNzLCBhbmQgbmV3IGRvY3VtZW50YXRpb24gaGFz IGJlZW4gYWRkZWQNCiBvciBzdWJzdGFudGlhbGx5IGltcHJvdmVkISA8L2xpPjxsaT48Yj5VcGNv bWluZyBEYXJrIE1vZGU8L2I+OiBXZSBjb21wbGV0ZWQgdGhlIFVJIGRlc2lnbnMgZm9yIHRoZSB1 cGNvbWluZyBkYXJrIG1vZGUgYW5kIG91ciBPdXRyZWFjaHkgaW50ZXJuIGhhcw0KPC9saT48L3Vs Pg0KPHA+c3RhcnRlZCB0byBpbXBsZW1lbnQgdGhlIGNoYW5nZXMuIDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48Yj5Bbm5vdW5jaW5nIHRoZSBPdXRyZWFjaHkgSW50ZXJuczwvYj46IFdl 4oCZcmUgaGFwcHkgdG8gd2VsY29tZSB0d28gaW50ZXJucyB0byB3b3JrIG9uIE9DYW1sIHByb2pl Y3RzIQ0KPC9saT48bGk+PGI+R2VuZXJhbCBJbXByb3ZlbWVudHM6PC9iPiBBcyB1c3VhbCwgd2Ug YWxzbyB3b3JrZWQgb24gZ2VuZXJhbCBtYWludGVuYW5jZSBhbmQgaW1wcm92ZW1lbnRzIGJhc2Vk IG9uIHVzZXIgZmVlZGJhY2ssIHNvIHdl4oCZcmUgaGlnaGxpZ2h0aW5nIHNvbWUgb2Ygb3VyIHdv cmsgYmVsb3cuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2FiNjc0OWIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhYjY3NDliIj5PcGVu IElzc3VlcyBmb3IgQ29udHJpYnV0b3JzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00 IiBpZD0idGV4dC1vcmdhYjY3NDliIj4NCjxwPldlIGNyZWF0ZWQgbWFueSBpc3N1ZXMgZm9yIGV4 dGVybmFsIGNvbnRyaWJ1dG9ycy4gVGhlIG1ham9yaXR5IG9mIHRoZW0gYXJlIHN1aXRhYmxlIGZv ciBPQ2FtbCBiZWdpbm5lcnMsIGFuZCB3ZeKAmXJlIGhhcHB5IHRvIHJldmlldyBhbmQgcHJvdmlk ZSBmZWVkYmFjayBvbiB5b3VyIHB1bGwgcmVxdWVzdHMhDQo8L3A+DQo8cD5Zb3UgY2FuIGZpbmQg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9pc3N1ZXM/cT1pcyUz QWlzc3VlJiM0MztpcyUzQW9wZW4mIzQzO2xhYmVsJTNBJTIyaGVscCYjNDM7d2FudGVkJTIyJiM0 MztubyUzQWFzc2lnbmVlIj4NCm9wZW4gaXNzdWVzIGZvciBjb250cmlidXRvcnMgaGVyZTwvYT4h IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2ZjY5 MjU5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNmY2OTI1OSI+TGVhcm4gQXJlYTwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNmY2OTI1OSI+PC9k aXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzAxODk2ODIiPjwvYT4xLiBS ZWRlc2lnbiBvZiB0aGUgTGVhcm4gQXJlYTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01 IiBpZD0idGV4dC1vcmcwMTg5NjgyIj4NCjxwPk9DYW1sLm9yZyBpcyB1bmRlcmdvaW5nIGFuIGV4 Y2l0aW5nIHRyYW5zZm9ybWF0aW9uLCBhbmQgd2XigJlyZSB0aHJpbGxlZCB0byBzaGFyZSBzb21l IGtleSB1cGRhdGVzIHdpdGggeW91LiBPdXIgbWFpbiBmb2N1cyBoYXMgYmVlbiB0aGUgZmluYWxp c2F0aW9uIGFuZCBhcHByb3ZhbCBvZiBhIG5ldyB1c2VyIGludGVyZmFjZSAoVUkpIGRlc2lnbiwg YWltZWQgYXQgZW5oYW5jaW5nIHlvdXIgZXhwZXJpZW5jZS4gVGhpcyB1cGRhdGUgaXNu4oCZdCBq dXN0DQogYWJvdXQgbG9va3M7IHdl4oCZcmUgZW5zdXJpbmcgdGhlIHdlYnNpdGUgaXMgZnVsbHkg b3B0aW1pc2VkIGZvciBtb2JpbGUgYW5kIHRhYmxldCBkZXZpY2VzLg0KPC9wPg0KPHA+VGhlIGNv bGxhYm9yYXRpb24gYmV0d2VlbiBvdXIgdGVhbSBhbmQgdXNlcnMgbGlrZSB5b3UgaGFzIGJlZW4g aW5zdHJ1bWVudGFsIGluIHNoYXBpbmcgdGhlIHByb2plY3QuIFlvdXIgaW5wdXQgYW5kIHN1cHBv cnQgaGF2ZSBiZWVuIGludmFsdWFibGUsIGFuZCB3ZeKAmXJlIGdyYXRlZnVsIGZvciB0aGUgY29t bXVuaXR54oCZcyBpbnZvbHZlbWVudCBpbiBtYWtpbmcgdGhpcyB3ZWJzaXRlIHRoZSBiZXN0IGl0 IGNhbiBiZS4NCjwvcD4NCjxwPk91ciBkZXNpZ24gc3lzdGVtIGhhcyBzZWVuIHNldmVyYWwgdXBk YXRlcywgaW5jbHVkaW5nIG5ldyBjb21wb25lbnRzIGxpa2UgYSB2YXJpYWJsZSBsYW5kaW5nIHBh Z2UgYnV0dG9uLCBkaXZlcnNlIGljb25zIChpbmNsdWRpbmcgc29jaWFsIG1lZGlhIGFuZCBPQ2Ft bCBpY29ucyBsaWtlIER1bmUgYW5kIG9wYW0pLCBlbmhhbmNlZCB0ZXh0IHN0eWxlcywgdXBkYXRl ZCBjb2xvciB2YXJpYWJsZXMsIGFuZCBtb3JlLg0KPC9wPg0KPHA+V2XigJl2ZSBjb21wbGV0ZWQg dGhlIGRlc2lnbnMgZm9yIGFsbCBwYWdlcyBvZiB0aGUgTGVhcm4gYXJlYS4gRWFjaCBwYWdlIGhh cyBiZWVuIGRlc2lnbmVkIHdpdGggYXR0ZW50aW9uIHRvIGRldGFpbCwgZW5zdXJpbmcgY29uc2lz dGVuY3kgYW5kIGNvaGVyZW5jZSBhY3Jvc3MgYWxsIHZlcnNpb25zLg0KPC9wPg0KPHA+SWYgeW91 4oCZcmUgY3VyaW91cyBhbmQgd2FudCB0byB0YWtlIGEgY2xvc2VyIGxvb2sgYXQgdGhlIGRlc2ln bnMsIHlvdSBjYW4gYWNjZXNzIG91cg0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuZmlnbWEuY29tL2Zp bGUvNkJTT0VxU3N5UWV1bHdMbzJwanM5ci9VbnRpdGxlZD90eXBlPWRlc2lnbiZhbXA7bm9kZS1p ZD0wJTNBMSZhbXA7bW9kZT1kZXNpZ24mYW1wO3Q9R3dWeHZyWEl0WDdrOHBQOS0xIj4NCkZpZ21h IERlc2lnbiBGaWxlczwvYT4uIFBsZWFzZSBiZSBhd2FyZSB0aGF0IHRoZSBjb250ZW50IHNob3du IG9uIHRoZSBwYWdlcyBpcyBub3QgYWx3YXlzIGFjY3VyYXRlLiBXZSBhaW0gdG8gcHJvdmlkZSBv dXIgZGVzaWduZXIgd2l0aCBiZXR0ZXIgY29udGVudCBmb3IgdGhlIG1vY2t1cHMgYW5kIFVJIGdv aW5nIGZvcndhcmQuDQo8L3A+DQo8cD5UaGUgd29yayBvbiBpbXBsZW1lbnRpbmcgdGhlIG5ldyBk ZXNpZ25zIGZvciB0aGUgbGlnaHQgbW9kZSBvZiB0aGUgTGVhcm4gYXJlYSBoYXZlIGJlZW4gY29t cGxldGVkIGluIERlY2VtYmVyIQ0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0 aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkltcGxlbWVudGVkIExlYXJu IFVJIGZyb20gRmlnbWEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzE3OTgiPg0Kb2NhbWwvb2NhbWwub3JnIzE3OTg8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViL2NvbS9GYXR1bWFBIj5ARmF0dW1hQTwvYT4gY29udHJpYnV0ZWQ6IElt cHJvdmUgcGxhdGZvcm0gcGFnZSBjYXJkIHN0eWxlcw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NTIiPm9jYW1sL29jYW1sLm9yZyMxNzUyPC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZmxvcmVudGRyb3Vzc2V0Ij5AZmxv cmVudGRyb3Vzc2V0PC9hPiBjb250cmlidXRlZDogTGluayBleGVyY2lzZXMgdG8gdHV0b3JpYWxz DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc1MyI+ b2NhbWwvb2NhbWwub3JnIzE3NTM8L2E+IDwvbGk+PGxpPkFkZCBib29rIGxpbmtzIGJhc2VkIG9u IEZpZ21hIGRlc2lnbiAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xODM0Ij4NCm9jYW1sL29jYW1sLm9yZyMxODM0PC9hPiA8L2xpPjxsaT5XSVA6IERv Y3VtZW50YXRpb24gU2VhcmNoIEZlYXR1cmUgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTg3MSI+DQpvY2FtbC9vY2FtbC5vcmcjMTg3MTwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnZDQ2MjkxNyI+PC9hPjIuIE9DYW1s IERvY3VtZW50YXRpb248YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQt b3JnZDQ2MjkxNyI+DQo8cD5JbiBOb3ZlbWJlciwgd2UgZm9jdXNzZWQgb24gYWRkcmVzc2luZyBh bmQgaW5jb3Jwb3JhdGluZyBjb21tdW5pdHkgZmVlZGJhY2sgb24gdGhlIOKAnEdldHRpbmcgU3Rh cnRlZOKAnSBkb2N1bWVudHMuIFRoZSBjb21tZW50cyBhbmQgZGlzY3Vzc2lvbiBvbiBEaXNjdXNz IHdlcmUgc28gaGVscGZ1bC4gV2UgZW5jb3VyYWdlIG1vcmUgb2YgdGhhdCENCjwvcD4NCjxwPldl IGFsc28gd29ya2VkIG9uIHBvbGlzaGluZyDigJxCYXNpYyBEYXRhIFR5cGVz4oCdIGFuZCDigJxW YWx1ZXMgYW5kIEZ1bmN0aW9ucy7igJ0gUGx1cyB0aGUgdGVhbSBoYXMgYmVlbiB3b3JraW5nIG9u IG5ldyDigJxNb2R1bGVzLOKAnSDigJxGdW5jdG9ycyzigJ0gYW5kIOKAnExpYnJhcmllcyBXaXRo IER1bmXigJ0gZG9jdW1lbnRzLCBob3BpbmcgdG8gaGF2ZSBpdCwgYW5kIHRoZSBvbmVzIGluIGNv bW11bml0eSByZXZpZXcgKGJlbG93KSwgcHVibGlzaGVkIGJlZm9yZSB0aGUNCiBlbmQgb2YgdGhl IHllYXIuIDwvcD4NCjxwPjxiPlJlbGV2YW50IFBScyBhbmQgQWN0aXZpdGllczo8L2I+IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5JbiBQcm9ncmVzczo8L2I+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+U2V0cyA8L2xpPjxsaT5NYXBzIDwvbGk+PGxpPkhpZ2hlciBPcmRlciBG dW5jdGlvbnMgPC9saT48L3VsPg0KPC9saT48bGk+PGI+SW4gUmV2aWV3IChpbnRlcm5hbCk6PC9i Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xODAwIj5PcHRpb25zPC9hPiA8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTgyNSI+UnVubmluZyBDb21t YW5kcyBpbiBhIFN3aXRjaDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODgxIj5MYWJlbGxlZCBBcmd1bWVudHM8L2E+DQo8L2xp PjwvdWw+DQo8L2xpPjxsaT48Yj5JbiBSZXZpZXcgKGNvbW11bml0eSk6PC9iPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xNzc4Ij5Nb2R1bGVzLCBGdW5jdG9ycywgTGlicmFyaWVzIFdpdGggRHVuZTwvYT4g KHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2RyYWZ0LXR1dG9yaWFs cy1vbi1tb2R1bGVzLWZ1bmN0b3JzLWFuZC1saWJyYXJpZXMvIj4NCkRpc2N1c3M8L2E+KSA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQw MCI+RmlsZSBNYW5pcHVsYXRpb248L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9oZWxwLXJldmlldy10aGUtbmV3LWZpbGUtbWFuaXB1bGF0aW9uLXR1dG9yaWFs LW9uLW9jYW1sLW9yZy8xMjYzOCI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTMxIj5Qb2x5bW9y cGhpYyBWYXJpYW50czwvYT4gKHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L25ldy1kcmFmdC10dXRvcmlhbC1vbi1wb2x5bW9ycGhpYy12YXJpYW50cy8xMzQ4NSI+DQpE aXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PC91bD4NCjwvbGk+PGxpPjxiPlB1Ymxpc2hlZDo8L2I+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzE4MjUiPlJ1bm5pbmcgQ29tbWFuZHMgaW4gYW4gb3BhbSBTd2l0 Y2g8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMTUyOSI+TXV0YWJsZSBTdGF0ZSAvIEltcGVyYXRpdmUgUHJvZ3JhbW1pbmc8L2E+ IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kcmFmdC10dXRvcmlh bC1vbi1tdXRhYmlsaXR5LWxvb3BzLWFuZC1pbXBlcmF0aXZlLXByb2dyYW1taW5nLzEzNTA0Ij4N CkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+QW5ub3VuY2VtZW50IG9uIERpc2N1c3M6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctdHV0b3JpYWxzLW9uLWJhc2lj cy1vZi1vY2FtbC8xMzM5NiI+DQpOZXcgVHV0b3JpYWxzIG9uIEJhc2ljcyBvZiBPQ2FtbDwvYT4g PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE1MTQiPkJhc2ljIERhdGEgVHlwZXM8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9vY2FtbC1vcmctdHV0b3JpYWwtcmV2YW1waW5nLWNvbnRkLWJhc2ljLWRh dGF0eXBlcy8xMjk4NSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTEyIj5GdW5jdGlvbnMgYW5k IFZhbHVlczwvYT4gKHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29j YW1sLW9yZy10dXRvcmlhbC1yZXZhbXBpbmctY29uZC12YWx1ZXMtYW5kLWZ1bmN0aW9ucy8xMzAw NSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL2RvY3MvaW5zdGFsbGluZy1vY2FtbCI+SW5zdGFsbGluZyBPQ2FtbDwvYT4gKHNlZSA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaGVscC1yZXZhbXBpbmctdGhlLWdldHRp bmctc3RhcnRlZC10dXRvcmlhbHMtaW4tb2NhbWwtb3JnLzEyNzQ5Ij4NCkRpc2N1c3MgVGhyZWFk PC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy90b3VyLW9mLW9j YW1sIj5BIFRvdXIgT2YgT0NhbWw8L2E+IChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2hlbHAtcmV2YW1waW5nLXRoZS1nZXR0aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWlu LW9jYW1sLW9yZy8xMjc0OSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MveW91ci1maXJzdC1wcm9ncmFtIj5Zb3VyIEZpcnN0IE9D YW1sIFByb2dyYW08L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9oZWxwLXJldmFtcGluZy10aGUtZ2V0dGluZy1zdGFydGVkLXR1dG9yaWFscy1pbi1vY2FtbC1v cmcvMTI3NDkiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9kb2NzL29wYW0tc3dpdGNoLWludHJvZHVjdGlvbiI+SW50cm9kdWN0aW9uIHRv IG9wYW0gU3dpdGNoZXM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9k b2NzL2FybTY0LWZpeCI+Rml4IEhvbWVicmV3IEVycm9ycyBvbiBBcHBsZSBNMTwvYT4NCjwvbGk+ PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mvb3BlcmF0b3JzIj5PcGVyYXRvcnM8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvZXJyb3ItaGFuZGxp bmciPkVycm9yIEhhbmRsaW5nPC9hPiAoc2VlIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tbmV3LWdldC1zdGFydGVkLWRvY3VtZW50YXRpb24tb24tb2NhbWwtb3JnLzEz MjY5Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2Ft bC5vcmcvZG9jcy9hcnJheXMiPkFycmF5czwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvZmVlZGJhY2stbmVlZGVkLW5ldy1hcnJheXMtdHV0b3JpYWwtb24tb2Nh bWwtb3JnLzEyNjgzIj4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC5vcmcvZG9jcy9zZXF1ZW5jZXMiPlNlcXVlbmNlczwvYT4gKHNlZSA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY3JlYXRpbmctYS10dXRvcmlhbC1vbi1zZXF1 ZW5jZXMvMTIwOTEiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjwvdWw+DQo8L2xpPjxsaT48 Yj5PdGhlciBBY3Rpdml0eTwvYj46DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2UgaW50ZWdy YXRlZCBwYWdlcyBmcm9tIE9DYW1sIGJvb2tzIGludG8gdGhlIExlYXJuIGFyZWEsIHJlcHJvZHVj ZWQgb24gT0NhbWwub3JnIHdpdGggcGVybWlzc2lvbiAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc2NiI+b2NhbWwvb2NhbWwub3JnIzE3NjY8L2E+ Og0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkNvbXBpbGVyICZhbXA7IFJ1bnRpbWUgcGFnZXMg ZnJvbSA8YSBocmVmPSJodHRwczovL2Rldi5yZWFsd29ybGRvY2FtbC5vcmcvIj5SZWFsIFdvcmxk IE9DYW1sPC9hPiwgYW5kDQo8L2xpPjxsaT5NZW1vaXNhdGlvbiAmYW1wOyBNb25hZHMgZnJvbSA8 YSBocmVmPSJodHRwczovL2NzMzExMC5naXRodWIuaW8vdGV4dGJvb2svY292ZXIuaHRtbCI+DQpP Q2FtbCBQcm9ncmFtbWluZzogQ29ycmVjdCAmIzQzOyBFZmZpY2llbnQgJiM0MzsgQmVhdXRpZnVs PC9hPiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5SZWFycmFuZ2VkIHRoZSBzZWN0aW9ucyBvbiB0aGUg TGFuZ3VhZ2UgZG9jdW1lbnRhdGlvbiB0YWIgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTc1NiI+DQpvY2FtbC9vY2FtbC5vcmcjMTc1NjwvYT4gPC9s aT48bGk+RG9jdW1lbnRhdGlvbiBmb3JtYXR0aW5nOiBSZXBsYWNlIHVuc2VtYW50aWMgYmxvY2tx dW90ZXMgYnkgaGlnaGxpZ2h0aW5nIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8xNzU5Ij4NCm9jYW1sL29jYW1sLm9yZyMxNzU5PC9hPiA8L2xpPjxsaT5X ZSBpbXByb3ZlZCB0aGUg4oCcSXMgT0NhbWwgV2ViIFlldD/igJ0gcGFnZSwgYWRkaW5nIG1hbnkg bW9yZSBwYWNrYWdlcyBhbmQgcmV3b3JraW5nIHRoZSB0ZXh0IHRvIG1vcmUgYWNjdXJhdGVseSBj YXB0dXJlIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBPQ2FtbCB3ZWIgZWNvc3lzdGVtIC0NCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODQzIj5vY2Ft bC9vY2FtbC5vcmcjMTg0MzwvYT4gPC9saT48bGk+RWRpdGluZyBvbiBCYXNpYyBEYXRhIFR5cGVz IC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4Mjci Pg0Kb2NhbWwvb2NhbWwub3JnIzE4Mjc8L2E+IDwvbGk+PGxpIGlkPSJWYWx1ZXMgJmFtcDsgRnVu Y3Rpb25zIj5BZGRyZXNzaW5nIHN1Z2dlc3Rpb25zIGZyb20gSXNzdWUgIzE3NjIgLSA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTgxMiI+DQpvY2FtbC9v Y2FtbC5vcmcjMTgxMjwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+PGI+Q29udHJpYnV0aW9uczo8 L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2JlbmphbWluLXRob21hcyI+QGJlbmphbWluLXRob21hczwvYT4gaW1wcm92ZWQgdGhlIGBNYXBg IGRvY3VtZW50IGJ5IHByb3ZpZGluZyBhIGJldHRlciBleGFtcGxlIHRoYXQgdXNlcyBkaWZmZXJl bnQgdHlwZXMgZm9yIHRoZSBrZXkgYW5kIHZhbHVlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc0MyI+b2NhbWwvb2NhbWwub3JnIzE3NDM8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sZW9zdGVyYSI+QGxlb3N0ZXJhPC9h PiBzaW1wbGlmaWVkIHRoZSDigJxCb290c3RyYXBwaW5nIGEgUHJvamVjdCB3aXRoIER1bmXigJ0g Z3VpZGUgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE3OTIiPm9jYW1sL29jYW1sLm9yZyMxNzkyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi9jb20vRmF0dW1hQSI+QEZhdHVtYUE8L2E+IGZpeGVkIGEgdHlwbyBpbiDigJxUb3Vy IG9mIE9DYW1s4oCdDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTczOSI+b2NhbWwvb2NhbWwub3JnIzE3Mzk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9iaW53YW5nLWRldiI+QGJpbndhbmctZGV2PC9hPiBjb250cmlidXRl ZDogRml4IHR5cGUgaW5jb25zaXN0ZW5jeSBpbiB0dXRvcmlhbA0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NTciPm9jYW1sL29jYW1sLm9yZyMxNzU3 PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSjNSTiI+QEozUk48L2E+ IGNvbnRyaWJ1dGVzOiBGaXggZXNjYXBpbmcgaW4g4oCcWW91ciBGaXJzdCBPQ2FtbCBQcm9ncmFt 4oCdIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x ODQ2Ij5vY2FtbC9vY2FtbC5vcmcjMTg0NjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL1NjNHJhbW91Y2hlIj5AU2M0cmFtb3VjaGU8L2E+IGNvbnRyaWJ1dGVzOiBBZGQg Y29tcGFyaXNvbiBvZiBzdGQgY29udGFpbmVycyBndWlkZSB0byB2MyBkb2NzDQo8L2xpPjwvdWw+ DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMTgyOCI+b2NhbWwvb2NhbWwub3JnIzE4Mjg8L2E+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1NjNHJhbW91Y2hlIj5AU2M0cmFtb3VjaGU8 L2E+IGNvbnRyaWJ1dGVzOiBGaXggdHlwbyBpbiBUb3VyIG9mIE9DYW1sIC0NCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODIwIj5vY2FtbC9vY2FtbC5v cmcjMTgyMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0ozUk4iPkBK M1JOPC9hPiBjb250cmlidXRlczogRml4IGJyb2tlbiDigJxJbnN0YWxsIFBsYXRmb3JtIFRvb2xz 4oCdIGxpbmsgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzE4NDEiPm9jYW1sL29jYW1sLm9yZyMxODQxPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+ DQo8cD5XZSBzdGFydGVkIG9wZW5pbmcgaXNzdWVzIG1hcmtlZCB3aXRoIOKAnGhlbHAgd2FudGVk 4oCdIHRvIGVuYWJsZSBleHRlcm5hbCBjb250cmlidXRvcnMgdG8gaGVscCBpbXByb3ZlIHRoZSBk b2NzLiBUaGUgcmVzcG9uc2UgaGFzIGJlZW4gb3ZlcndoZWxtaW5nbHkgcG9zaXRpdmUsIGFuZCB3 ZeKAmXJlIHRocmlsbGVkIHRvIGtlZXAgdGhpcyB1cCBhbmQgbWFrZSB0aGUgT0NhbWwgZG9jdW1l bnRhdGlvbiB0cnVseSBncmVhdCB3aXRoIHlvdXIgaGVscCENCjwvcD4NCjwvZGl2Pg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmYzZlMDEyIiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZmM2ZTAxMiI+VXBjb21pbmcgRGFyayBNb2RlPC9o ND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdmYzZlMDEyIj4NCjxw PkluIERlY2VtYmVyLCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5veWVu dWdhMTc8L2E+IHN0YXJ0ZWQgdG8gaW1wbGVtZW50IHRoZSBuZXcgZGFyayBtb2RlIG9uIE9DYW1s Lm9yZy4gUGxhbnMgYXJlIHRvIGNvbXBsZXRlIGFuZCBhY3RpdmF0ZSB0aGUgZGFyayBtb2RlIGJh c2VkIG9uIGJyb3dzZXIgLyBvcGVyYXRpbmcgc3lzdGVtIHByZWZlcmVuY2VzIGJ5IGVhcmx5IE1h cmNoLg0KPC9wPg0KPHA+V2UgY29udGludW91c2x5IG1lcmdlIHNtYWxsIHBhdGNoZXMgaW50byBv Y2FtbC5vcmcsIGFuZCB5b3UgY2FuIHRha2UgYSBsb29rIGF0IGNvbXBsZXRlZCBkYXJrIG1vZGUg cGFnZXMgb24NCjxhIGhyZWY9Imh0dHBzOi8vc3RhZ2luZy5vY2FtbC5vcmciPmh0dHBzOi8vc3Rh Z2luZy5vY2FtbC5vcmc8L2E+LiBXZSBwbGFjZWQgYSBidXR0b24gYXQgdGhlIGJvdHRvbSBvZiB0 aGUgcGFnZSB0byB0b2dnbGUgdGhlIGRhcmsgbW9kZSBvbiBzdGFnaW5nICh0aGlzIGlzIG5vdCBn b2luZyB0byBiZSByZWxlYXNlZCwgaXQgaXMgb25seSBhIG1lYW5zIGZvciB1cyB0byByZXZpZXcg dGhlIGRhcmsgbW9kZSBwYWdlcykuDQo8L3A+DQo8cD48Yj5SZWxldmFudCBBY3Rpdml0aWVzIGFu ZCBQUnM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW1wbGVtZW50IGRhcmsg bW9kZSBvbiBsZWFybiBhcmVhIGxhbmRpbmcgcGFnZSAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODM2Ij4NCm9jYW1sL29jYW1sLm9yZyMxODM2PC9h PiA8L2xpPjxsaT5VSSBkZXNpZ24gZm9yIGRhcmsgbW9kZSBvbiBhbGwgT0NhbWwub3JnIHBhZ2Vz LCBhbmQgcmVzdWx0aW5nIERlc2lnbiBTeXN0ZW0gY2hhbmdlcw0KPC9saT48L3VsPg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzYzZTI1Y2YiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc2M2UyNWNmIj5Bbm5vdW5jaW5nIHRoZSBPdXRyZWFjaHkg SW50ZXJuczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNjNl MjVjZiI+DQo8cD5JbiBOb3ZlbWJlciwgd2UgcmV2aWV3ZWQgYW5kIHJhdGVkIHRoZSBPdXRyZWFj aHkgY29udHJpYnV0aW9ucyBmb3IgdGhlIGRhcmsgbW9kZSBwcm9qZWN0IGFuZCB0aGUgR1VJIHBy b2plY3QgYW5kIHNlbGVjdGVkIHRoZSB0d28gaW50ZXJucy4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9veWVudWdhMTciPkBveWVudWdhMTc8L2E+IGlzIHdvcmtpbmcgd2l0aCB0aGUgT0Nh bWwub3JnIHRlYW0gb24gaW1wbGVtZW50aW5nIHRoZSBkYXJrIG1vZGUsIHdoaWxlDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vSWRhcmFOYWJ1ayI+QElkYXJhTmFidWs8L2E+IGhhcyBiZWVu IHNlbGVjdGVkIGZvciB0aGUgR1VJIHByb2plY3QuIENvbmdyYXR1bGF0aW9ucw0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL0lkYXJhTmFidWsiPkBJZGFyYU5hYnVrPC9hPiBhbmQgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL295ZW51Z2ExNyI+DQpAb3llbnVnYTE3PC9hPiEgPC9wPg0K PHA+U2luY2UgdGhlIE91dHJlYWNoeSBhcHBsaWNhdGlvbiBwZXJpb2QgZW5kZWQgaW4gT2N0b2Jl ciwgd2UgbGlzdCBhbGwgdGhlIHJlbWFpbmluZyBwdWxsIHJlcXVlc3RzIGRvbmUgb24gT3V0cmVh Y2h5IElzc3VlcyBpbiB0aGUg4oCcR2VuZXJhbCBJbXByb3ZlbWVudHPigJ0gc2VjdGlvbiBiZWxv dy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdm MDU5N2ZmIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZjA1OTdmZiI+R2VuZXJhbCBJ bXByb3ZlbWVudHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y Z2YwNTk3ZmYiPg0KPHA+PGI+TW9zdCBJbXBvcnRhbnQgQ2hhbmdlcyBUTERSPC9iPjogPC9wPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZXJl4oCZcyBub3cgYSBzZWxmLWhvc3RlZCBQbGF1 c2libGUuaW8gaW5zdGFuY2UgZm9yIE9DYW1sLm9yZywgYWNjZXNzaWJsZSBhdCA8YSBocmVmPSJo dHRwczovL3BsYXVzaWJsZS5jaS5kZXYvb2NhbWwub3JnIj4NCmh0dHBzOi8vcGxhdXNpYmxlLmNp LmRldi9vY2FtbC5vcmc8L2E+ISA8L2xpPjxsaT5Zb3UgY2FuIHNlZSB0aGUgZGlmZmVyZW50IE9D YW1sIHRlYW1zIChDb21waWxlciwgUGxhdGZvcm0sIFBhY2thZ2luZywgSW5mcmFzdHJ1Y3R1cmUs IE9DYW1sLm9yZykgYW5kIHRoZSBtYWludGFpbmVycyBvZiByZWxldmFudCByZXBvc2l0b3JpZXMg YXQgdGhlIG5ldyBnb3Zlcm5hbmNlIHBhZ2UgYXQNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L2dvdmVybmFuY2UiPmh0dHBzOi8vb2NhbWwub3JnL2dvdmVybmFuY2U8L2E+ISA8L2xpPjxsaT5U aGUgT0NhbWwgTG9nbyBub3cgaGFzIGEgZGVkaWNhdGVkIHBhZ2UgYXQgPGEgaHJlZj0iaHR0cHM6 Ly9vY2FtbC5vcmcvbG9nbyI+aHR0cHM6Ly9vY2FtbC5vcmcvbG9nbzwvYT4hDQo8L2xpPjxsaT5X ZeKAmXJlIG5vdyBkaXNwbGF5aW5nIGEgcGFja2FnZeKAmXMgUkVBRE1FIG9uIHRoZSBwYWNrYWdl IG92ZXJ2aWV3IHBhZ2UuIDwvbGk+PGxpPllvdSBjYW4gbm93IDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvYmxvYi9tYWluL0NPTlRSSUJVVElORy5tZCNjb250ZW50 LXVwY29taW5nX2V2ZW50Ij4NCmxpc3QgdXBjb21pbmcgZXZlbnRzPC9hPiB3aXRoIGRhdGUgYW5k IHRpbWUgb24gPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvY29tbXVuaXR5Ij4NCmh0dHBzOi8v b2NhbWwub3JnL2NvbW11bml0eTwvYT4uIDwvbGk+PGxpPk9DYW1sLm9yZyBub3cgaGFzIHNvY2lh bCBtZWRpYSBpbWFnZXMsIHNvIHRoYXQgc2hhcmluZyBPQ2FtbC5vcmcgbGlua3MgbG9va3Mgbmlj ZXIuDQo8L2xpPjwvdWw+DQo8cD5NYW55IHRoYW5rcyBnbyBvdXQgdG8gdGhlIG1hbnkgY29udHJp YnV0b3JzIHdobyBoZWxwZWQgaW1wcm92ZSBPQ2FtbC5vcmcgaW4gTm92ZW1iZXIgYW5kIERlY2Vt YmVyLiBGaW5kIHRoZW0gbGlzdGVkIGJlbG93IQ0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFu ZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkZlYXR1cmVz IC8gSW1wcm92ZW1lbnRzOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZGVkIGEgZ292ZXJu YW5jZSBwYWdlIHRoYXQgbGlzdHMgdGhlIG1haW50YWluZXJzIGFuZCBkZXYgbWVldGluZ3Mgb2Yg dGhlIGNvbXBpbGVyLCBhbGwgdGhlIHByb2plY3RzIG9mIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgYW5k IHRoZSBvY2FtbC5vcmcgaW5mcmFzdHJ1Y3R1cmUgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEyMzkiPm9jYW1sL29jYW1sLm9yZyMxMjM5PC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSWRhcmFOYWJ1ayI+QElkYXJhTmFi dWs8L2E+IGNvbnRyaWJ1dGVkOiBBZGRlZCB0aGUgYWJpbGl0eSB0byByZWNvcmQgdXBjb21pbmcg ZXZlbnRzIHRvIHRoZSBjb21tdW5pdHkgcGFnZSAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTcxNyI+b2NhbWwvb2NhbWwub3JnIzE3MTc8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9HaXJpc2gtSmFuZ2FtIj5AR2lyaXNo LUphbmdhbTwvYT4gY29udHJpYnV0ZWQ6IEFkZGVkIGEgcGFnZSBmb3IgdGhlIE9DYW1sIGxvZ28g LQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3MTEi Pm9jYW1sL29jYW1sLm9yZyMxNzExPC9hPiA8L2xpPjxsaT5BZGQgYWJpbGl0eSB0byBkaXNhYmxl IGFuIE9DYW1sIFBsYW5ldCBzb3VyY2UgLyBmaXggc2NyYXBlciBhbmQgc2NyYXBlIG1pc3Npbmcg cGxhbmV0IHBvc3RzIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xNzM0Ij5vY2FtbC9vY2FtbC5vcmcjMTczNDwvYT4gPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhIj5AbGVvc3RlcmE8L2E+IGNvbnRyaWJ1dGVkOiBQ YWNrYWdlIHNlYXJjaCBVWCBpbXByb3ZlbWVudHMgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE2OTEiPm9jYW1sL29jYW1sLm9yZyMxNjkxPC9hPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZGVkIGFuIE9wZW5TZWFyY2ggbWFuaWZlc3QsIHNv IHlvdSBjYW4gYWRkIHRoZSBPQ2FtbCBwYWNrYWdlcyBzZWFyY2ggdG8geW91ciBicm93c2VyIHNl YXJjaCBiYXINCjwvbGk+PGxpPk1hZGUgc2VhcmNoIGlucHV0IGluIG1haW4gbmF2YmFyIGdhaW4g dGFiLWZvY3VzIGVhcmxpZXIgPC9saT48bGk+U2V0IHRhYmluZGV4PeKAnDHigJ0gZm9yIHRoZSBp bi1wYWNrYWdlIHNlYXJjaCBpbnB1dCBvbiB0aGUgcGFja2FnZSBkb2N1bWVudGF0aW9uIHBhZ2UN CjwvbGk+PGxpPkF1dG9mb2N1cyB0aGUgc2VhcmNoIGludXB0IG9uIHRoZSBwYWNrYWdlIHNlYXJj aCByZXN1bHRzIHBhZ2UgPC9saT48L3VsPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL21heXM0Ij5AbWF5czQ8L2E+IGNvbnRyaWJ1dGVkOiBBZGQgbGlua3MgdG8gQ09OVFJJ QlVUSU5HLm1kIGZvciBhbGwgZGF0YSBpdGVtcyB0aGF0IGNhbiBiZSBjb250cmlidXRlZCAtDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTY4MiI+b2Nh bWwvb2NhbWwub3JnIzE2ODI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9tLXNwaXRmaXJlIj5AbS1zcGl0ZmlyZTwvYT4gY29udHJpYnV0ZWQ6IEVudHJpZXMgb24gdGhl IGNoYW5nZWxvZyBwYWdlIGFyZSBub3cgcGFnaW5hdGVkIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNzUxIj5vY2FtbC9vY2FtbC5vcmcjMTc1MTwv YT4gPC9saT48bGk+QWRkIG1pc3Npbmcgc29jaWFsIG1lZGlhIGltYWdlcyB0byBPQ2FtbC5vcmcg SFRNTCBtZXRhZGF0YS4gTm93LCBwb3N0cyBzaGFyZWQgb24gc29jaWFsIG1lZGlhIGhhdmUgdGhl IE9DYW1sIGxvZ28gYXMgaW1hZ2UsIHdoaWNoIGlzIG11Y2ggYmV0dGVyIHRoYW4gaGF2aW5nIG5v IGltYWdlIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xNzg0Ij5vY2FtbC9vY2FtbC5vcmcjMTc4NDwvYT4gPC9saT48bGk+V2XigJlyZSBub3cgZGlz cGxheWluZyBhIHBhY2thZ2XigJlzIFJFQURNRSBvbiB0aGUgcGFja2FnZSBvdmVydmlldyBwYWdl LiBUaGlzIHdhcyBwYXJ0IG9mIG9uZSBvZiB0aGUgZGVzaWduIG9wdGlvbnMgZnJvbSB0aGUgcGFj a2FnZSBhcmVhIHJlZGVzaWduIGVhcmxpZXIgdGhpcyB5ZWFyLiBIb3dldmVyLCBpdCB3YXNu4oCZ dCBlbnRpcmVseSBjbGVhciB0aGF0IHRoaXMgd2FzIHRoZSByaWdodCB0aGluZyB0byBkby4gTW9y ZSBjb25maXJtYXRpb24gY2FtZQ0KIHVwIGluIHRlcm1zIG9mIHBlb3BsZSBhc2tpbmcgZm9yIHRo aXMsIHNvIHdlIGRpZCBpdC4gLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwub3JnL3B1bGwvMTgzMiI+DQpvY2FtbC9vY2FtbC5vcmcjMTgzMjwvYT4gPC9saT48bGk+VXBk YXRlIHRvIFRhaWx3aW5kIENTUyAzLjMuNiAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xODUwIj4NCm9jYW1sL29jYW1sLm9yZyMxODUwPC9hPiA8L2xp PjxsaT5BZGRlZCB0YWJsZSBvZiBjb250ZW50cyB0byBqdW1wIHRvIGluZGl2aWR1YWwgc2VjdGlv bnMgb24g4oCcSXMgT0NhbWwgV2ViIHlldOKAnSAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTg0OSI+b2NhbWwvb2NhbWwub3JnIzE4NDk8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SV1VCQUtXQU5BWU8iPkBSV1VCQUtX QU5BWU88L2E+IGNvbnRyaWJ1dGVkOiBJbXByb3ZlZCByZXNwb25zaXZlIGxheW91dCBvbiByZWxl YXNlcyBwYWdlIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8xNzE2Ij5vY2FtbC9vY2FtbC5vcmcjMTcxNjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2tpeW92MDkiPkBraXlvdjA5PC9hPiBjb250cmlidXRlZDogUmVkdWNl ZCB0aGUgbnVtYmVyIG9mIG5ld3MgaXRlbXMgaW4gdGhlIGJsb2cgcGFnZSB0byBoYXZlIGEgc2lt aWxhciBoZWlnaHQgdG8gdGhlIE9DYW1sIFBsYW5ldCBjb2x1bW4gLQ0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NTQiPm9jYW1sL29jYW1sLm9yZyMx NzU0PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5A b3llbnVnYTE3PC9hPiBjb250cmlidXRlZDogSW1wcm92ZWQgcmVzcG9uc2l2ZSBjb2xsYXBzaW5n IG9mIHRoZSB0YWJsZSBvbiB0aGUgcGFwZXJzIHBhZ2UgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NDEiPm9jYW1sL29jYW1sLm9yZyMxNzQxPC9h PiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5CdWdmaXhlczoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5BZGp1c3QgQ1NTIG9yZGVyIG9mIGVsZW1lbnRzIG9mIG1haW4gbmF2LCBzdGFydGluZyBmcm9t IDAgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc0 NSI+DQpvY2FtbC9vY2FtbC5vcmcjMTc0NTwvYT4gPC9saT48bGk+U2V0IGNvcnJlY3QgYmFja2dy b3VuZCBjb2xvciBvbiBsZWFybiB0YWJzIHNlbGVjdCBlbGVtZW50IC0gPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NDYiPg0Kb2NhbWwvb2NhbWwub3Jn IzE3NDY8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Tb2xhci1SYXlz Ij5AU29sYXItUmF5czwvYT4gY29udHJpYnV0ZWQ6IFJlbW92ZSBsaW5rcyBmcm9tIG91dHJlYWNo eSBwcm9qZWN0IGRlc2NyaXB0aW9uIHRvIHByZXZlbnQgb3ZlcmZsb3cgLQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NjQiPm9jYW1sL29jYW1sLm9y ZyMxNzY0PC9hPiA8L2xpPjxsaT5QYXRjaCB1cHN0cmVhbSBkZXBlbmRlbmN5IGByaXZlcmAgdG8g ZmFsbCBiYWNrIHRvIGZlZWQgZW50cnnigJlzIGBpZGAgaWYgYGxpbmtzYCB0YWcgZG9lcyBub3Qg ZXhpc3QuIFRoaXMgYWxsb3dzIG1vcmUgZmVlZHMgdG8gYmUgc2NyYXBlZCBzdWNjZXNzZnVsbHku IC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90YXJpZGVzL3JpdmVyL3B1bGwvMTEiPnRh cmlkZXMvcml2ZXIjMTE8L2E+IDwvbGk+PGxpPkFkZGVkIG1pc3NpbmcgQ29kZSBvZiBDb25kdWN0 IFJvdXRlIC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE3ODEiPg0Kb2NhbWwvb2NhbWwub3JnIzE3ODE8L2E+IDwvbGk+PGxpPkFkZGVkIG1pc3Npbmcg 4oCZUGxhdGZvcm0gVG9vbHPigJkgbGluayBpbiBmb290ZXIgLSA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc4OCI+DQpvY2FtbC9vY2FtbC5vcmcjMTc4 ODwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0FuZHJvR2VuaXVzLWNv ZGVzIj5AQW5kcm9HZW5pdXMtY29kZXM8L2E+IGNvbnRyaWJ1dGVkOiBGaXhlZCBhIGJ1ZyBpbiBw YWdpbmF0aW9uIHdoZXJlIHRoZSBwYWdlIG51bWJlciDigJwx4oCdIHdhcyBkaXNwbGF5ZWQgdHdp Y2Ugd2hlbiBhbGwgdGhlIHJlc3VsdHMgd291bGQgZml0IG9uIGEgc2luZ2xlIHBhZ2UgLQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3MjkiPm9jYW1s L29jYW1sLm9yZyMxNzI5PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v RGVtbXl0aGV0ZWNoaWUiPkBEZW1teXRoZXRlY2hpZTwvYT4gY29udHJpYnV0ZWQ6IEFkZCBgd29y ZC13cmFwOiBicmVhay13b3JkYCB0byB0aGUgVGFpbHdpbmQgVHlwb2dyYXBoeSBwcm9zZSBjbGFz cyB0byBwcmV2ZW50IGxvbmcgVVJMcyBpbiBjb250ZW50IGFyZWFzIGZyb20gb3ZlcmZsb3dpbmcg LQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3MjIi Pm9jYW1sL29jYW1sLm9yZyMxNzIyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vQW5kcm9HZW5pdXMtY29kZXMiPkBBbmRyb0dlbml1cy1jb2RlczwvYT4gY29udHJpYnV0 ZWQ6IFNob3J0ZW4gdGV4dCBvbiBPdXRyZWFjaHkgUHJvamVjdHMgbGluayBvbiB0aGUgY29tbXVu aXR5IHBhZ2UgdG8gcHJldmVudCBvdmVyZmxvdyAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTc0OSI+b2NhbWwvb2NhbWwub3JnIzE3NDk8L2E+IDwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9veWVudWdhMTciPkBveWVudWdhMTc8 L2E+IGNvbnRyaWJ1dGVkOiBSZW5kZXIgc2VhcmNoIHF1ZXJ5IGFzIGlucHV0IHZhbHVlIG9uIHRo ZSBwYXBlcnMgcGFnZSBhbmQgdGhlIHJlbGVhc2VzIHBhZ2UgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NDciPm9jYW1sL29jYW1sLm9yZyMxNzQ3 PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi9jb20vRmF0dW1hQSI+QEZhdHVt YUE8L2E+IGNvbnRyaWJ1dGVkOiBBZGRlZCBzcGFjaW5nIGJlbG93IOKAnFNlZSBBbGwgUmVsZWFz ZXPigJ0gYnV0dG9uIG9uIGhvbWVwYWdlIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xNzQwIj5vY2FtbC9vY2FtbC5vcmcjMTc0MDwvYT4gPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JXVUJBS1dBTkFZTyI+QFJXVUJBS1dBTkFZ TzwvYT4gY29udHJpYnV0ZWQ6IFJlc29sdmUgdGV4dCBzdHlsaW5nIGlzc3VlIGluIHJlbGVhc2Ug bGlzdCBoZWFkZXJzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTc3MyI+b2NhbWwvb2NhbWwub3JnIzE3NzM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9rZXZhbmFudGhhIj5Aa2V2YW5hbnRoYTwvYT4gY29udHJpYnV0ZWQ6 IEZpeCBpbnZhbGlkIGxpbmsgZm9yIGV4ZXJjaXNlcw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4MDIiPm9jYW1sL29jYW1sLm9yZyMxODAyPC9hPiA8 L2xpPjwvdWw+DQo8L2xpPjxsaT5PdGhlcjoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiBjb250cmli dXRlZDogUmVwbGFjZWQgZGVwZW5kZW5jeSBgb21kYCB3aXRoIGBjbWFya2l0YCAtDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTY0MiI+b2NhbWwvb2Nh bWwub3JnIzE2NDI8L2E+LiBUaGFua3MgZm9yIHRoaXMgZXhjZWxsZW50IGFuZCBjaGFsbGVuZ2lu ZyBjb250cmlidXRpb24hDQo8L2xpPjxsaT5SZW1vdmUgWW9zaGkgdG9vbCAtIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNzM1Ij5vY2FtbC9vY2FtbC5v cmcjMTczNTwvYT4NCjwvbGk+PGxpPlJlbW92ZWQgZHJlYW0tZGFzaGJvYXJkLCBpdCB3YXMgcmVw bGFjZWQgYSBzZWxmLWhvc3RlZCBwbGF1c2libGUuaW8gaW5zdGFuY2UgLQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3MzYiPm9jYW1sL29jYW1sLm9y ZyMxNzM2PC9hPiA8L2xpPjxsaT5SZW5hbWUgVHV0b3JpYWxzLSZndDtEb2N1bWVudGF0aW9uIGlu IG1ldGEgdGl0bGUgb2YgTGVhcm4gQXJlYSAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xNzg5Ij4NCm9jYW1sL29jYW1sLm9yZyMxNzg5PC9hPiA8L2xp PjwvdWw+DQo8L2xpPjxsaT5Db250ZW50Og0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZGVk IOKAnEludHJvZHVjdGlvbiB0byBGdW5jdGlvbmFsIFByb2dyYW1taW5nIGFuZCB0aGUgU3RydWN0 dXJlIG9mIFByb2dyYW1taW5nIExhbmd1YWdlcyB1c2luZyBPQ2FtbOKAnSB0byB0aGUgYm9va3Mg c2VjdGlvbiAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMTc0NCI+b2NhbWwvb2NhbWwub3JnIzE3NDQ8L2E+IDwvbGk+PGxpPkFkZGVkIHRoZSBjaGFu Z2Vsb2cgZm9yIG9wYW0uMi4yLjB+YWxwaGEzIC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzE3NzEiPg0Kb2NhbWwvb2NhbWwub3JnIzE3NzE8L2E+IDwv bGk+PGxpPlVwZGF0ZSB0aXRsZSBvZiBQbGF0Zm9ybSBSb2FkbWFwIGRvY3VtZW50IHRvIOKAmU9D YW1sIFBsYXRmb3JtIFJvYWRtYXDigJkgLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTc5MCI+DQpvY2FtbC9vY2FtbC5vcmcjMTc5MDwvYT4gPC9saT48 bGk+QWRkIHNvbWUgZmVlZHMgdG8gdGhlIE9DYW1sIFBsYW5ldCAtIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNzc5Ij4NCm9jYW1sL29jYW1sLm9yZyMx Nzc5PC9hPiA8L2xpPjxsaT5BZGRlZCDigJxQcmFjdGljYWwgT0NhbWzigJ0gYmxvZyB0byB0aGUg UGxhbmV0IC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE4MDYiPg0Kb2NhbWwvb2NhbWwub3JnIzE4MDY8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9jYWlzYXItcGxhdGZvcm0iPkBjYWlzYXItcGxhdGZvcm08L2E+IGNvbnRy aWJ1dGVkOiBGaXggYnJva2VuIGxpbmsgaW4gQ0VBIFJlc2VhcmNoIEVuZ2luZWVyIG9mZmVyLg0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE3ODciPm9j YW1sL29jYW1sLm9yZyMxNzg3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vS2lob25nSGVvIj5AS2lob25nSGVvPC9hPiBjb250cmlidXRlZDogQWRkIEtBSVNUIGFzIGFu IGFjYWRlbWljIGluc3RpdHV0aW9uDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMTc5MSI+b2NhbWwvb2NhbWwub3JnIzE3OTE8L2E+IDwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oZXR6ZW5tYXQiPkBoZXR6ZW5tYXQ8L2E+IGNvbnRy aWJ1dGVzOiBGaXggd3JvbmcgcmVsZWFzZSBkYXRlIGZvciA1LjEuMSAtDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTg1OCI+b2NhbWwvb2NhbWwub3Jn IzE4NTg8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS96YXBhc2hjYW5v biI+QHphcGFzaGNhbm9uPC9hPiBjb250cmlidXRlczogRml4IG9yZGVyIG9mIHByZXNlbnRhdGlv bnMgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4 NTkiPm9jYW1sL29jYW1sLm9yZyMxODU5PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiBjb250cmlidXRlczogYWRkIG91dHJl YWNoeSBibG9nIHwgaW50cm9kdWNlIHlvdXJzZWxmIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xODQ4Ij5vY2FtbC9vY2FtbC5vcmcjMTg0ODwvYT4g PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0lkYXJhTmFidWsiPkBJZGFyYU5h YnVrPC9hPiBjb250cmlidXRlZDogQWRkIE91dHJlYWNoeSBCbG9nIFBvc3QgdG8gT0NhbWwgUGxh bmV0DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTg3 OCI+b2NhbWwvb2NhbWwub3JnIzE4Nzg8L2E+IDwvbGk+PGxpPkFkZGVkIOKAmVJldHJvZml0dGlu ZyBQYXJhbGxlbGlzbSBvbnRvIE9DYW1s4oCZIHBhcGVyIC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE4NzUiPg0Kb2NhbWwvb2NhbWwub3JnIzE4NzU8 L2E+IDwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjMiPkRpc2N1c3Npb25zIG9uIHRoZSBmdXR1cmUgb2YgdGhlIG9wYW0gcmVwb3NpdG9yeTwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZGlzY3Vzc2lvbnMtb24tdGhl LWZ1dHVyZS1vZi10aGUtb3BhbS1yZXBvc2l0b3J5LzEzODk4LzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Rpc2N1c3Npb25zLW9uLXRoZS1mdXR1cmUtb2YtdGhlLW9wYW0tcmVwb3Np dG9yeS8xMzg5OC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmcyZjdmMzIwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMmY3ZjMyMCI+UmFw aGHDq2wgUHJvdXN0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnMmY3ZjMyMCI+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29wYW0tcmVwb3NpdG9yeS8iPmRlZmF1bHQgb3BhbSByZXBvc2l0b3J5PC9hPiBoYXMg YmVlbiBnZXR0aW5nIGxhcmdlciBhbmQgbGFyZ2VyIHdpdGggYW4gZXZlciBpbmNyZWFzaW5nIG51 bWJlciBvZiBwYWNrYWdlcy4gVGhpcyBpcyBzb21ld2hhdCBvZiBhIGdvb2Qgc2lnbiBmb3IgdGhl IGFjdGl2ZSBjb21tdW5pdHkgb2YgT0NhbWwgZGV2ZWxvcGVycy4gQnV0IGl0IGlzIGFsc28NCiBh IGNoYWxsZW5nZSBmb3IgaXRzIHVzZSwgZm9yIGl0cyBtYWludGVuYW5jZSwgYW5kIGZvciB0aGUg ZXhlY3V0aW9uIG9mIGl0cyBDSS4gPC9wPg0KPHA+QSBkaXNjdXNzaW9uIG9uIHRoZSBmdXR1cmUg b2YgdGhlIG9wYW0gcmVwb3NpdG9yeSBpcyBoYXBwZW5pbmcgYW5kIHdlICh0aGUgb3BhbSByZXBv c2l0b3J5IG1haW50YWluZXJzKSB3b3VsZCBsaWtlIHRvIGludml0ZSBPQ2FtbCBkZXZlbG9wZXJz IGF0IGxhcmdlIHRvIHBhcnRpY2lwYXRlLg0KPC9wPg0KPHA+WW91IGNhbiByZWFkIHRoZSBkZWRp Y2F0ZWQgZ2l0aHViIGlzc3VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFt LXJlcG9zaXRvcnkvaXNzdWVzLzIzNzg5Ij4NClJlcXVlc3RzIGZvciBjb21tZW50czogaG93IGRv ZXMgb3BhbS1yZXBvc2l0b3J5IHNjYWxlPzwvYT4gYW5kIHNoYXJlIG9waW5pb25zIHRoZXJlLg0K PC9wPg0KPHA+WW91IGNhbiBhbHNvIGpvaW4gdGhlIHB1YmxpYyBtZWV0aW5nIGhlbGQgV2VkbmVz ZGF5IDIwMjQtMDEtMjQgYXQgMTQ6MDAgR01UIG9uDQo8YSBocmVmPSJodHRwczovL21lZXQuaml0 LnNpL29wYW0tcmVwby1tZWV0aW5nIj5odHRwczovL21lZXQuaml0LnNpL29wYW0tcmVwby1tZWV0 aW5nPC9hPi4NCjwvcD4NCjxwPlBsZWFzZSBkbyBwcmVmZXIgdGhlIGlzc3VlIChyYXRoZXIgdGhh biB0aGlzIHRocmVhZCkgdG8gZGlzY3VzcyB0aGUgaXNzdWUgKHRvIGtlZXAgdGhlIGRpc2N1c3Np b24gaW4gYSBjZW50cmFsIGxvY2F0aW9uKS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI0Ij5kdW5lIDMuMTM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1kdW5lLTMtMTMvMTM5MTEvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5l LTMtMTMvMTM5MTEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMWE5NGQxOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzFhOTRkMTgiPkV0 aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnMWE5NGQxOCI+DQo8cD5XZeKAmXJlIGhhcHB5IHRvIGFubm91bmNlIHRoYXQg RHVuZSAzLjEzLjAgaXMgbm93IGF2YWlsYWJsZS4gVGhpcyBmZWF0dXJlIGlzIHBhY2tlZCB3aXRo IGZpeGVzIGFuZCBuZXcgZmVhdHVyZXMgdGhhdCB5b3UgY2FuIGZpbmQgaW4gdGhlIGNoYW5nZWxv Zy4NCjwvcD4NCjxwPlRoZXJlIGFyZSBhIGZldyBuZXcgZmVhdHVyZXMgdGhhdCB3ZSB3b3VsZCBs aWtlIHRvIHNwZWNpYWxseSBoaWdobGlnaHQuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYjRkZWNjNCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2I0 ZGVjYzQiPkdlbmVyYXRlIENvbmZsaWN0cyBGaWxlIGZvciBNZW5oaXIgR3JhbW1hcnMgKDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvOTUxMiI+Izk1MTI8L2E+LA0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25vamIiPkBub2piPC9hPik8L2g0Pg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2I0ZGVjYzQiPg0KPHA+V2hlbiA8Y29k ZT5tZW5oaXI8L2NvZGU+IGlzIHVzZWQgdG8gZ2VuZXJhdGUgY29kZSBmcm9tIDxjb2RlPi5tbHk8 L2NvZGU+IGZpbGVzLCB0aGVyZSBhcmUgc29tZXRpbWVzIGlzc3VlcyB3aXRoIHRoZSBncmFtbWFy IGl0c2VsZiwgc3VjaCBhcyBzaGlmdC1yZWR1Y2UgY29uZmxpY3RzLg0KPC9wPg0KPHA+TWVuaGly IGhhcyBhbiBvcHRpb24gdG8gZ2VuZXJhdGUgYSDigJxjb25mbGljdHPigJ0gZmlsZSB1c2luZyBp dHMgPGNvZGU+LS1leHBsYWluPC9jb2RlPiBmbGFnLCBidXQgdW50aWwgbm93IHRoaXMgd2FzIG5v dCBleHBvc2VkIGJ5IER1bmUuIFN0YXJ0aW5nIGZyb20gdGhpcyB2ZXJzaW9uLCB0aGlzIGZpbGUg d2lsbCBiZSBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSB0byBoZWxwIGRldmVsb3BlcnMgZGVidWcg dGhlaXIgZ3JhbW1hcnMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnOTA1NDlhNyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzkwNTQ5 YTciPkNhY2hlZCBEaXJlY3RvcnkgVGFyZ2V0cyAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvcHVsbC85NTM1Ij4jOTUzNTwvYT4sDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vcmxlc2hjaGluc2tpeSI+QHJsZXNoY2hpbnNraXk8L2E+KTwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOTA1NDlhNyI+DQo8cD5EdW5l4oCZcyBnbG9i YWwgY2FjaGUgaXMgYSB3YXkgdG8gc2F2ZSB0aGUgcmVzdWx0IG9mIGludGVybWVkaWF0ZSBidWls ZCByZXN1bHRzLCBldmVuIGFjcm9zcyBwcm9qZWN0cy4gUHJldmlvdXNseSwgaXQgd291bGQgb25s eSB3b3JrIHdpdGggZmlsZSB0YXJnZXRzLiBXaXRoIHRoaXMgY2hhbmdlLCBpdCBub3cgc3VwcG9y dHMgRHVuZeKAmXMgZXhwZXJpbWVudGFsIGRpcmVjdG9yeSB0YXJnZXRzLg0KPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzdlOTE3OTkiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc3ZTkxNzk5Ij5EeW5hbWljIE1vZHVsZSBMaXN0ICg8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzk1NzgiPiM5NTc4PC9hPiwN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ub2piIj5Abm9qYjwvYT4pPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc3ZTkxNzk5Ij4NCjxwPkluIHNldmVy YWwgcGxhY2VzIGluIHRoZSBEdW5lIGxhbmd1YWdlLCBpdCBpcyBwb3NzaWJsZSB0byBwYXNzIGEg bGlzdCBvZiBtb2R1bGVzLiBGb3IgZXhhbXBsZSBpbiBhDQo8Y29kZT4obGlicmFyeSk8L2NvZGU+ IHN0YW56YSwgaWYgZm9yIHNvbWUgcmVhc29uIHRoZSBkZWZhdWx0IG9mIHBpY2tpbmcgYWxsIHRo ZSBzb3VyY2UgZmlsZXMgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlzIG5vdCB0aGUgcmlnaHQg dGhpbmcgdG8gZG8sIGl0IGlzIHBvc3NpYmxlIHRvIHBhc3MNCjxjb2RlPihtb2R1bGUgQSBCIEMp PC9jb2RlPiB0byBvbmx5IGF0dGFjaCB0aGVzZSBtb2R1bGVzIHRvIHRoZSBsaWJyYXJ5LiA8L3A+ DQo8cD5BbiBpbXBvcnRhbnQgbGltaXRhdGlvbiBoYXMgYmVlbiB0aGF0IHRoZSBsaXN0IG9mIG1v ZHVsZXMgbmVlZGVkIHRvIGJlIHN0YXRpYzogd3JpdHRlbiBhcyBpcyBpbiB0aGUNCjxjb2RlPmR1 bmU8L2NvZGU+IGZpbGUuIFRoaXMgbGltaXRhdGlvbiBoYXMgbm93IGJlZW4gbGlmdGVkIGFuZCBp dCBpcyBwb3NzaWJsZSB0byB1c2UNCjxjb2RlPig6aW5jbHVkZSk8L2NvZGU+IG9yIDxjb2RlPiV7 cmVhZC1saW5lczpmaWxlfTwvY29kZT4gaW4gdGhpcyBmaWVsZCBhbmQgc2ltaWxhciBvbmVzLg0K PC9wPg0KPHA+TGV4aUZp4oCZcyB1c2UgY2FzZSBpcyBhIHN5c3RlbSBvZiBzdGF0aWMgcGx1Zy1p bnM6IGEgcHJvZ3JhbSBpcyBleHRlbmRlZCBieSBzZWxlY3Rpbmcgd2hpY2ggbW9kdWxlcyBhcmUg bGlua2VkIHRvIHRoZSBhcHBsaWNhdGlvbiBjb3JlLiBUaGlzIGxpc3Qgb2YgbW9kdWxlcyBjYW4g bm93IGJlIGVtaXR0ZWQgYnkgYSBnZW5lcmF0b3IgdGhhdCByZWFkcyBhIGNvbmZpZ3VyYXRpb24g ZmlsZS4NCjwvcD4NCjxwPlByZXZpb3VzbHksIHRoaXMgcmVxdWlyZWQgdXNpbmcgT0NhbWwgc3lu dGF4IGZvciB0aGUgPGNvZGU+ZHVuZTwvY29kZT4gZmlsZSwgd2hpY2ggaGFzIHNldmVyYWwgaXNz dWVzLCBpbmNsdWRpbmcgaW5jb21wYXRpYmlsaXR5IHdpdGggZmVhdHVyZXMgbGlrZQ0KPGNvZGU+ KGluY2x1ZGVfc3ViZGlycyk8L2NvZGU+IGFuZCBwb29yIHBlcmZvcm1hbmNlIGJlY2F1c2UgRHVu ZSBkb2VzIG5vdCBrbm93IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdlbmVyYXRvciBhbmQgbmVl ZHMgdG8gcmUtcnVuIHRoZSBidWlsZCBtb3JlIHRpbWVzIHRoYW4gbmVjZXNzYXJ5Lg0KPC9wPg0K PHA+SGVyZSBpcyB0aGUgZnVsbCBjaGFuZ2Vsb2c6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjMzBkMjA0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnYzMwZDIwNCI+QWRkZWQ8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQi IGlkPSJ0ZXh0LW9yZ2MzMGQyMDQiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZCBjb21t YW5kIDxjb2RlPmR1bmUgY2FjaGUgY2xlYXI8L2NvZGU+IHRvIGNvbXBsZXRlbHkgZGVsZXRlIGFs bCB0cmFjZXMgb2YgdGhlIER1bmUgY2FjaGUuICgjODk3NSwgQG5vamIpDQo8L2xpPjxsaT5BbGxv dyB0byBkaXNhYmxlIENvcSAwLjggZGVwcmVjYXRpb24gd2FybmluZyAoIzk0MzksIEBlamdhbGxl Z28pIDwvbGk+PGxpPkFsbG93IDxjb2RlPk9DQU1MRklORF9UT09MQ0hBSU48L2NvZGU+IHRvIGJl IHNldCBwZXIgY29udGV4dCBpbiB0aGUgd29ya3NwYWNlIGZpbGUgdGhyb3VnaCB0aGUNCjxjb2Rl PmVudjwvY29kZT4gc3RhbnphLiAoIzk0NDksIEByZ3JpbmJlcmcpIDwvbGk+PGxpPk1lbmhpcjog Z2VuZXJhdGUgPGNvZGU+LmNvbmZsaWN0czwvY29kZT4gZmlsZSBieSBkZWZhdWx0LiBBZGQgbmV3 IGZpZWxkIHRvIHRoZQ0KPGNvZGU+KG1lbmhpcik8L2NvZGU+IHN0YW56YSB0byBjb250cm9sIHRo ZSBnZW5lcmF0aW9uIG9mIHRoaXMgZmlsZTogPGNvZGU+KGV4cGxhaW4gJmx0O2JsYW5nIGV4cHJl c3Npb24mZ3Q7KTwvY29kZT4uIEludHJvZHVjZQ0KPGNvZGU+KG1lbmhpciAoZmxhZ3MgLi4uKSAo ZXhwbGFpbiAuLi4pKTwvY29kZT4gZmllbGQgaW4gdGhlIDxjb2RlPihlbnYpPC9jb2RlPiBzdGFu emEsIGRlbGV0ZQ0KPGNvZGU+KG1lbmhpcl9mbGFncyk8L2NvZGU+IGZpZWxkLiBBbGwgY2hhbmdl cyBhcmUgZ3VhcmRlZCB1bmRlciBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBNZW5oaXIgZXh0ZW5zaW9u LCAzLjAuICgjOTUxMiwgQG5vamIpDQo8L2xpPjxsaT5EaXJlY3RvcnkgdGFyZ2V0cyBjYW4gbm93 IGJlIGNhY2hlZC4gKCM5NTM1LCBAcmxlc2hjaGluc2tpeSkgPC9saT48bGk+SXQgaXMgbm93IHBv c3NpYmxlIHRvIHVzZSBzcGVjaWFsIGZvcm1zIHN1Y2ggYXMgPGNvZGU+KDppbmNsdWRlKTwvY29k ZT4gYW5kIHZhcmlhYmxlcw0KPGNvZGU+JXtyZWFkLWxpbmVzOn08L2NvZGU+IGluIDxjb2RlPiht b2R1bGVzKTwvY29kZT4gYW5kIHNpbWlsYXIgZmllbGRzLiBOb3RlIHRoYXQgdGhlIGRlcGVuZGVu Y2llcyBpbnRyb2R1Y2VkIGluIHRoaXMgd2F5IChpZSB0aGUgZmlsZXMgYmVpbmcgcmVhZCkgbXVz dCBsaXZlIGluIGEgZGlmZmVyZW50IGRpcmVjdG9yeSB0aGFuIHRoZSBzdGFuemEgbWFraW5nIHVz ZSBvZiB0aGVtLiAoIzk1NzgsIEBub2piKQ0KPC9saT48bGk+UmVtb3ZlIHdhcm5pbmcgMzAgZnJv bSBkZWZhdWx0IHNldCBmb3IgcHJvamVjdHMgd2hlcmUgZHVuZSBsYW5nIGlzIGF0IGxlYXN0IDMu MTMgKCM5NTY4LCBAZ2FzY2hlKQ0KPC9saT48bGk+QWRkIDxjb2RlPmNvcWRvY19mbGFnczwvY29k ZT4gZmllbGQgdG8gPGNvZGU+Y29xPC9jb2RlPiBmaWVsZCBvZiA8Y29kZT5lbnY8L2NvZGU+IHN0 YW56YSBhbGxvd2luZyB0aGUgc2V0dGluZyBvZiB3b3Jrc3BhY2Utd2lkZSBkZWZhdWx0cyBmb3IN Cjxjb2RlPmNvcWRvY19mbGFnczwvY29kZT4uICgjOTI4MCwgZml4ZXMgIzkxMzksIEBBbGl6dGVy KSA8L2xpPjxsaT5jdHlwZXM6IGZpeCBhbiBlcnJvciB3aGVyZSA8Y29kZT4oY3R5cGVzKTwvY29k ZT4gd2l0aCBubyA8Y29kZT4oZnVuY3Rpb25fZGVzY3JpcHRpb24pPC9jb2RlPiB3b3VsZCBjYXVz ZSBhbiBlcnJvciB0cnlpbmcgcmVmZXIgdG8gYSBub25leGlzdGVudA0KPGNvZGU+X3N0dWJzLmE8 L2NvZGU+IGRlcGVuZGVuY3kgKCM5MzAyLCBmaXggIzkzMDAsIEBlbWlsbG9uKSA8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYWZiODBmMCIg Y2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2FmYjgwZjAiPkNoYW5nZWQ8L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2FmYjgwZjAiPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPkNoZWNrIHRoYXQgcGFja2FnZSBuYW1lcyBpbiA8Y29kZT4oZGVwZW5k cyk8L2NvZGU+IGFuZCByZWxhdGVkIGZpZWxkcyBpbiA8Y29kZT4NCmR1bmUtcHJvamVjdDwvY29k ZT4gYXJlIHdlbGwtZm9ybWVkLiAoIzk0NzIsIGZpeGVzICM5MjcwLCBARWxlY3RyZUFBUykgPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Nm YTA3ZTQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdjZmEwN2U0Ij5GaXhlZDwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnY2ZhMDdlNCI+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+RG8gbm90IGlnbm9yZSA8Y29kZT4oZm9ybWF0dGluZyAuLik8 L2NvZGU+IHNldHRpbmdzIGluIGNvbnRleHQgb3Igd29ya3NwYWNlIGZpbGVzICgjODQ0NywgQHJn cmluYmVyZykNCjwvbGk+PGxpPkZpeGVkIGEgYnVnIHdoZXJlIER1bmUgd2FzIGluY29ycmVjdGx5 IHBhcnNpbmcgdGhlIG91dHB1dCBvZiBjb3FkZXAgd2hlbiBpdCB3YXMgZXNjYXBlZCwgYXMgaXMg dGhlIGNhc2Ugb24gV2luZG93cy4gKCM5MjMxLCBmaXhlcyAjOTIxOCwgQEFsaXp0ZXIpDQo8L2xp PjxsaT5Db3B5aW5nIG1vZGUgZm9yIHNhbmRib3hlcyB3aWxsIG5vdyBmb2xsb3cgc3ltYm9saWMg bGlua3MgKCM5MjgyLCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+Rm9yYmlkIHRoZSBlbXB0eSA8Y29k ZT4oYmluYXJpZXMgLi4pPC9jb2RlPiBmaWVsZCBpbiB0aGUgPGNvZGU+ZW52PC9jb2RlPiBzdGFu emEgaW4gdGhlIHdvcmtzcGFjZSBmaWxlIHVubGVzcyBsYW5ndWFnZSB2ZXJzaW9uIGlzIGF0IGxl YXN0IDMuMi4gKCM5MzA5LCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+W2NvcV0gRml4IGJ1ZyBpbiBj b21wdXRhdGlvbiBvZiBmbGFncyB3aGVuIGNvbXBvc2VkIHdpdGggYm9vdCB0aGVvcmllcy4gKCM5 MzQ3LCBmaXhlcyAjNzkwOSwgQGVqZ2FsbGVnbykNCjwvbGk+PGxpPkZpeGVkIGEgYnVnIHdoZXJl IHRoZSA8Y29kZT4oc2VsZWN0KTwvY29kZT4gZmllbGQgb2YgdGhlIDxjb2RlPihsaWJyYXJpZXMp PC9jb2RlPiBmaWVsZCBvZiB0aGUNCjxjb2RlPih0ZXN0KTwvY29kZT4gc3RhbnphIHdhc27igJl0 IHdvcmtpbmcgcHJvcGVybHkuICgjOTM4NywgZml4ZXMgIzkzNjUsIEBBbGl6dGVyKQ0KPC9saT48 bGk+Rml4IGhhbmRsaW5nIG9mIHRoZSA8Y29kZT5QQVRIPC9jb2RlPiBhcmd1bWVudCB0byA8Y29k ZT5kdW5lIGluaXQgcHJvaiBOQU1FIFBBVEg8L2NvZGU+LiBBbiBpbnRlcm1lZGlhdGUgZGlyZWN0 b3J5IGNhbGxlZA0KPGNvZGU+TkFNRTwvY29kZT4gaXMgbm8gbG9uZ2VyIGNyZWF0ZWQgaWYgPGNv ZGU+UEFUSDwvY29kZT4gaXMgc3VwcGxpZWQsIHNvIDxjb2RlPg0KZHVuZSBpbml0IHByb2ogbXlf cHJvamVjdCAuPC9jb2RlPiB3aWxsIG5vdyBpbml0aWFsaXplIGEgcHJvamVjdCBpbiB0aGUgY3Vy cmVudCB3b3JraW5nIGRpcmVjdG9yeS4gKCM5NDQ3LCBmaXhlcyAjOTIwOSwgQHNob25mZWRlcikN CjwvbGk+PGxpPkV4cGVyaW1lbnRhbCBkb2MgcnVsZXM6IENvcnJlY3RseSBoYW5kbGUgdGhlIGNh c2Ugd2hlbiBhIHBhY2thZ2UgZGVwZW5kcyB1cG9uIGl0cyBvd24gc3VibGlicmFyaWVzICgjOTQ2 MSwgZml4ZXMgIzk0NTYsIEBqb25sdWRsYW0pDQo8L2xpPjxsaT5SZXNvbHZlIHZhcmlvdXMgcHVi bGljIGJpbmFyaWVzIHRvIHRoZWlyIGJ1aWxkIGxvY2F0aW9uLCByYXRoZXIgdGhhbiB0byB3aGVy ZSB0aGV54oCZcmUgY29waWVkIGluIHRoZQ0KPGNvZGU+X2J1aWxkL2luc3RhbGw8L2NvZGU+IGRp cmVjdG9yeSAoIzk0OTYsIGZpeGVzICM3OTA4LCBAcmdyaW5iZXJnKS4gPC9saT48bGk+Q29ycmVj dGx5IGlnbm9yZSB3YXJuaW5nIGZsYWdzIGluIHZlbmRvcmVkIHByb2plY3RzICgjOTUxNSwgQHJn cmluYmVyZykgPC9saT48bGk+VXNlIHdhdGNoIGV4Y2x1c2lvbnMgaW4gd2F0Y2ggbW9kZSBvbiBN YWNPUyAoIzk2NDMsIGZpeGVzICM5NTE3LCBAUG9vcmx5RGVmaW5lZEJlaGF2aW91cikNCjwvbGk+ PGxpPkZpeCBtZXJsaW4gY29uZmlndXJhdGlvbiBmb3IgPGNvZGU+KGluY2x1ZGVfc3ViZGlycyBx dWFsaWZpZWQpPC9jb2RlPiBtb2R1bGVzICgjOTY1OSwgZml4ZXMgIzgyOTcsIEByZ3JpbmJlcmcp DQo8L2xpPjxsaT5GaXggaGFuZGxpbmcgb2YgPGNvZGU+ZW5hYmxlZF9pZjwvY29kZT4gaW4gYmlu YXJ5IGluc3RhbGwgc3Rhbnphcy4gUHJldmlvdXNseSwgd2XigJlkIGlnbm9yZSB0aGUgcmVzdWx0 IG9mDQo8Y29kZT5lbmFibGVkX2lmPC9jb2RlPiB3aGVuIGV2YWx1YXRpbmcgPGNvZGU+JXtiaW46 Li59PC9jb2RlPiAoIzk3MDcsIEByZ3JpbmJlcmcpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5vcGFtIDIuMi4wfmJldGExPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS0yLTItMC1iZXRhMS8xMzkxMy8xIj5odHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0yLTAtYmV0YTEvMTM5MTMvMTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGI2OWIxOCIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRiNjliMTgiPkthdGUgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0YjY5YjE4Ij4NCjxwPk9u IGJlaGFsZiBvZiB0aGUgb3BhbSBkZXYgdGVhbSwgSeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhl IGZpcnN0IGJldGEgcmVsZWFzZSBvZiBvcGFtIDIuMi4wLg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4MjI0MmU2IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBp ZD0ib3JnODIyNDJlNiI+V2hhdOKAmXMgbmV3IGluIHRoaXMgYmV0YT88L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzgyMjQyZTYiPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPjxjb2RlPm9wYW0gaW5pdDwvY29kZT4gb24gV2luZG93cyBub3cgcmVxdWlyZXMg eW91IHRvIGNob29zZSB3aGljaCBHaXQgdG8gdXNlLiBHaXQgZm9yIFdpbmRvd3MgaXMgbm93IHJl Y29tbWVuZGVkIGJ5IGRlZmF1bHQsIHRob3VnaCBDeWd3aW7igJlzIEdpdCBjYW4gb2YgY291cnNl IHN0aWxsIGJlIHVzZWQuIFNlZSB0aGUgYmxvZyBwb3N0IGxpbmtlZCBiZWxvdyBmb3IgbW9yZSBp bmZvIG9uIHdoeSBjaG9vc2Ugb25lIG92ZXIgdGhlIG90aGVyLg0KPC9saT48bGk+d2hlbiBjb21w aWxpbmcgb3BhbSBvbiBXaW5kb3dzIHdpdGggTWluR1csIHRoZSByZXN1bHRpbmcgb3BhbSBiaW5h cnkgbm93IGNvbnRhaW5zDQo8Y29kZT5saWJzdGRjJiM0MzsmIzQzOzwvY29kZT4gaW5zdGVhZCBv ZiByZXF1aXJpbmcgdGhlIERMTCB0byBiZSBkaXN0cmlidXRlZCBhbG9uZ3NpZGUgaXQgb3IgdG8g YmUgcHJlc2VudCBpbiB0aGUgZW52aXJvbm1lbnQgZHVyaW5nIGNvbXBpbGF0aW9uDQo8L2xpPjxs aT5maXggPGNvZGU+b3BhbSBlbnY8L2NvZGU+IGNvbnRhaW5pbmcgY2FycmlhZ2UgcmV0dXJuIG9u IEN5Z3dpbiAtIDxjb2RlPmV2YWwgJChvcGFtIGVudik8L2NvZGU+IG5vdyB3b3JrcyBmcm9tIGEg Q3lnd2luIGJhc2ggdGVybWluYWwNCjwvbGk+PGxpPmFzIHdlbGwgYXMgYSBidW5jaCBvZiBidWcg Zml4ZXMgYW5kIGltcHJvdmVtZW50cyA8L2xpPjwvdWw+DQo8cD5Zb3XigJlsbCBmaW5kIHRoZXNl IGZlYXR1cmVzIHByZXNlbnRlZCBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9y Zy9ibG9nL29wYW0tMi0yLTAtYmV0YTEvIj4NCmJsb2cgcG9zdDwvYT4sIGFuZCBmb3Igc29tZSBl eHRyYSBkZXRhaWxzIHlvdSBjYW4gdGFrZSBhIGxvb2sgYXQgdGhlIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjIuMC1iZXRhMSI+DQpyZWxlYXNl IG5vdGU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9i bG9iLzIuMi4wLWJldGExL0NIQU5HRVMiPg0KY2hhbmdlbG9nPC9hPi4gPC9wPg0KPHA+V2UgZW5j b3VyYWdlIHlvdSB0byB0cnkgb3V0IHRoaXMgYmV0YSByZWxlYXNlLCBpbnN0cnVjdGlvbnMgYXJl IGRldGFpbGVkIGluIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29w YW0tMi0yLTAtYmV0YTEiPmJsb2cgcG9zdDwvYT4sIGluIHBhcnRpY3VsYXINCjxhIGhyZWY9Imh0 dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItMi0wLWJldGExLyNIb3ctdG8tVGVzdC1v cGFtLW9uLVdpbmRvd3MiPg0KaWYgeW914oCZcmUgdXNpbmcgV2luZG93czwvYT4gZm9yIHdoaWNo IHdlIHByb3ZpZGUgYSDigJMgPGk+c3RpbGwgZXhwZXJpbWVudGFsPC9pPiDigJMgcHJlLWJ1aWx0 IGJpbmFyeS4NCjwvcD4NCjxwPk9uIFVuaXgtbGlrZSBzeXN0ZW1zIHRob3VnaCwgdG8gdXBncmFk ZSwgc2ltcGx5IHJ1bjogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzlmNGM3YTMi Pg0KYmFzaCAtYyAmcXVvdDtzaCAmbHQ7KGN1cmwgLWZzU0wgaHR0cHM6Ly9yYXcuZ2l0aHVidXNl cmNvbnRlbnQuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL2luc3RhbGwuc2gpIC0tdmVyc2lv bg0KMi4yLjB+YmV0YTEmcXVvdDsNCjwvcHJlPg0KPHA+SGFwcHkgaGFja2luZywgPGI+Jmx0OyZn dDsgJmx0OyZndDsgVGhlIG9wYW0gdGVhbSAmbHQ7Jmd0OyAmbHQ7Jmd0OzwvYj4gOmNhbWVsOiA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5aaXBjIDAuMS4wPC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4temlwYy0wLTEtMC8xMzM4OC8y Ij5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXppcGMtMC0xLTAvMTMzODgvMjwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTBlMzYzZSIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzkwZTM2M2UiPkRhbmllbCBCw7xuemxpIGFubm91 bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTBlMzYz ZSI+DQo8cD5aaXBjIDAuMi4wIGhhcyBiZWVuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yNTEwNSI+DQpyZWxlYXNlZDwvYT4gdG8gdGhlIG9w YW0tcmVwb3NpdG9yeS4gPC9wPg0KPHA+SXQgcHJvdmlkZXMgYSBmZXcgZW5jb2RpbmcgYnVnIGZp eGVzIGNvdXJ0ZXN5IG9mIFZhbGVudGluIEdhdGllbi1CYXJvbuKAmXMgaW52ZXN0aWdhdGlvbnMg b24gcm91bmQgdHJpcHBpbmcNCjxjb2RlPmRvY3g8L2NvZGU+IGZpbGVzIHdpdGggPGNvZGU+emlw YzwvY29kZT4uIDwvcD4NCjxwPkhlIGFsc28gc3VnZ2VzdGVkIG5vdCB0byBpZ25vcmUgPGNvZGU+ emlwPC9jb2RlPuKAmXMgZGVjbGFyZWQgbWV0YWRhdGEgYWJvdXQgZGVjb21wcmVzc2lvbiBzaXpl IHRvIGFsbG93IGNsaWVudHMgdG8gZWFzaWx5IGNhcCBtZW1vcnkgY29uc3VtcHRpb24gZm9yIGRl Y29kaW5nIHVudHJ1c3RlZCB6aXAgZmlsZXMgKGJyZWFraW5nIGNoYW5nZSkuDQo8L3A+DQo8cD5U aGUgZGV0YWlscyBhcmUgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnps aS96aXBjL2Jsb2IvZmE0YmJmZTRlNzAxMTk2NjVmMzk3NjliZWM5Y2ZhYzllMDcyOTMwNC9DSEFO R0VTLm1kI3YwMjAtMjAyNC0wMS0yMi1sYS1mb3JjbGF6LXZzIj4NCnJlbGVhc2Ugbm90ZXM8L2E+ IGFuZCBtYW55IHRoYW5rcyB0byBoaW0uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3 Ij5PdGhlciBPQ2FtbCBOZXdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC03Ij48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2I2MzJkNGIiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiNjMyZDRiIj5Gcm9tIHRoZSBvY2FtbC5vcmcg YmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjYzMmQ0 YiI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBh dCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJsb2c8 L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9pZGFy YW5hYnVrLmNvbS9ibG9nL2V2ZXJ5b25lX3N0cnVnZ2xlcyI+T3V0cmVhY2h5IEJsb2c6IEV2ZXJ5 b25lIFN0cnVnZ2xlczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vaWRhcmFuYWJ1ay5j b20vYmxvZy9vY2FtbF9jb21tdW5pdHkiPlRoZSBPQ2FtbCBDb21tdW5pdHk8L2E+DQo8L2xpPjxs aT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNC0wMS0xNy13aGF0LWFyZS1k YXRhLXJhY2VzLWFuZC1kby10aGV5LXRocmVhdGVuLXlvdXItYnVzaW5lc3MiPldoYXQgYXJlIERh dGEgUmFjZXM/IEFuZCBkbyBUaGV5IFRocmVhdGVuIFlvdXIgQnVzaW5lc3M/PC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9wcml2ZXIuZGV2L2Jsb2cvZnVuY3Rpb25hbC1wcm9ncmFtbWlu Zy9jb25jZXB0cy1vZi1mdW5jdGlvbmFsLXByb2dyYW1taW5nLyI+Q29uY2VwdHMgb2YgRnVuY3Rp b25hbCBQcm9ncmFtbWluZzwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VlODljYTAiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSJvcmdlZTg5Y2EwIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC1vcmdlZTg5Y2EwIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBh IENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBv ciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0K PC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEu ZnIvc3ltcGEvaW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFz cz0iYXV0aG9ybmFtZSIgaWQ9Im9yZzc4MmFmOGEiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 16 Jan 2024 10:08:31 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 16 Jan 2024 10:08:31 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 16 Jan 2024 10:08:31 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40GA8p5h028058 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 16 Jan 2024 10:08:51 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 40GA8fVt028041 for ; Tue, 16 Jan 2024 10:08:41 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Jan 2024 11:08:40 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3C244E0CCA; Tue, 16 Jan 2024 11:08:39 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 2D505E0CCE for ; Tue, 16 Jan 2024 11:01:20 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jan 2024 11:01:18 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id CBF965613AF; Tue, 16 Jan 2024 11:01:09 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaSGP1FE75WomA002sHtrvO1NjWQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 16 Jan 2024 10:01:09 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 6b948c86-73bb-43c9-ccc3-08dc167b177e X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,198,1695679200"; d="scan'208,217";a="146866990" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.486286, queueID=113165613B0 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <25DA5EF94F97784FB3812FF8792932DF@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMS0xNiBUdWUgMTA6NTkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDEuMDkuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMS4yMy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMDkgdG8gMTYsIDIwMjQuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+VmVyaWZ5aW5nIGFuIEVmZmVjdC1C YXNlZCBDb29wZXJhdGl2ZSBDb25jdXJyZW5jeSBTY2hlZHVsZXIgaW4gSXJpcywgYnkgQWRyaWFu IERhcHByaWNoPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzIiPk9DYW1sIFNvZnR3YXJlIEZvdW5k YXRpb246IEphbnVhcnkgMjAyNCB1cGRhdGU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5NaW91 LCBhIHNpbXBsZSBzY2hlZHVsZXIgZm9yIE9DYW1sIDU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0 Ij5HcmFjZSDwn5KFLCBmYW5jeSBkaWFnbm9zdGljIGxpYnJhcnkgZm9yIGNvbXBpbGVyczwvYT4g PC9saT48bGk+PGEgaHJlZj0iIzUiPkpzX29mX29jYW1sIDUuNS4yPC9hPiA8L2xpPjxsaT48YSBo cmVmPSIjNiI+Rmlyc3QgcmVsZWFzZSBvZiBvbWE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5P Y2FtbGVhcmx5YmlyZCBqdXN0IGdvdCBhYmlsaXR5IHRvIGluc3BlY3Qgb3BhcXVlL2Fic3RyYWN0 IHZhbHVlczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5WYWxpZGF0ZSAtIEEgTmV3IExpYnJh cnkgZm9yIERhdGEgVmFsaWRhdGlvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPmR1bmUuMy4x Mi4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTAiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiNvcmc4MWM1MTRiIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjEiPlZlcmlmeWluZyBhbiBFZmZlY3QtQmFzZWQgQ29vcGVyYXRpdmUgQ29uY3Vy cmVuY3kgU2NoZWR1bGVyIGluIElyaXMsIGJ5IEFkcmlhbiBEYXBwcmljaDwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdmlkZW8tdmVyaWZ5aW5nLWFuLWVmZmVjdC1iYXNl ZC1jb29wZXJhdGl2ZS1jb25jdXJyZW5jeS1zY2hlZHVsZXItaW4taXJpcy1ieS1hZHJpYW4tZGFw cHJpY2gvMTM4MjUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdmlkZW8tdmVyaWZ5 aW5nLWFuLWVmZmVjdC1iYXNlZC1jb29wZXJhdGl2ZS1jb25jdXJyZW5jeS1zY2hlZHVsZXItaW4t aXJpcy1ieS1hZHJpYW4tZGFwcHJpY2gvMTM4MjUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnMDM3MTMwOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzAzNzEzMDkiPlZpbmNlbnQgQmFsYXQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwMzcxMzA5Ij4NCjxwPkFkcmlhbiBEYXBwcmlj aCBnYXZlIGEgdGFsayBhdCBUYXJpZGVzIGEgZmV3IHdlZWtzIGFnbywgYWJvdXQgVmVyaWZ5aW5n IGFuIEVmZmVjdC1CYXNlZCBDb29wZXJhdGl2ZSBDb25jdXJyZW5jeSBTY2hlZHVsZXIgaW4gSXJp cy4gSGVyZSBpcyBhIGxpbmsgdG8gdGhlIHZpZGVvLg0KPC9wPg0KPHA+QWJzdHJhY3Q6IDwvcD4N CjxibG9ja3F1b3RlPg0KPHA+TGlnaHR3ZWlnaHQgYXN5bmNocm9ub3VzIHByb2dyYW1taW5nICh1 c2luZyBmdXR1cmVzLCBnb3JvdXRpbmVzIG9yIGdyZWVuIHRocmVhZHMpIGhhcyBiZWVuIHdpZGVs eSBhZG9wdGVkIHRvIG9yZ2FuaXplIHByb2dyYW1zIHdpdGggbWFueSBjb25jdXJyZW50IHRhc2tz LCBtb3JlIHRoYW4gYXJlIHRyYWRpdGlvbmFsbHkgZmVhc2libGUgd2l0aCB0aHJlYWQtcGVyLXRh c2sgbW9kZWxzIG9mIGNvbmN1cnJlbmN5LiBXaXRoIHRoZSByZWxlYXNlIG9mDQogT0NhbWwgNSBh bmQgaXRzIHN1cHBvcnQgZm9yIGVmZmVjdCBoYW5kbGVycywgdGhlIG5ldyBjb25jdXJyZW5jeSBs aWJyYXJ5IEVpbyB3YXMgcHJvcG9zZWQgd2hpY2ggYWltcyB0byByZXBsYWNlIHByZXZpb3VzIG1v bmFkaWMgY29uY3VycmVuY3kgbGlicmFyaWVzIGZvciBPQ2FtbC4gSW4gdGhpcyB3b3JrIHdlIHZl cmlmeSB0aGUgY29yZSBmaWJlciBhbmQgcHJvbWlzZSBhYnN0cmFjdGlvbnMgb2YgRWlvIGFuZCBz aG93IHRoZWlyIHNhZmV0eSBhbmQNCiBlZmZlY3Qgc2FmZXR5IHVzaW5nIHRoZSBIYXplbCBwcm9n cmFtIGxvZ2ljLiBIYXplbCBpcyBidWlsdCBvbiB0aGUgSXJpcyBmcmFtZXdvcmsgYW5kIGFsbG93 cyByZWFzb25pbmcgYWJvdXQgcHJvZ3JhbXMgd2l0aCBlZmZlY3QgaGFuZGxlcnMuIFdlIGFsc28g YWRhcHQgdGhlIGV4aXN0aW5nIHByb29mIG9mIHRoZSB2ZXJpZmllZCBDUVMgZGF0YXN0cnVjdHVy ZSBzaW5jZSBFaW8gdXNlcyBhIGN1c3RvbWl6ZWQgdmVyc2lvbiBvZiBDUVMgZm9yIGl0cw0KIGlt cGxlbWVudGF0aW9uIG9mIHByb21pc2VzLiBXZSBkbyBub3QgdHJlYXQgc29tZSBmZWF0dXJlcyBv ZiBFaW8gbGlrZSBjYW5jZWxsYXRpb24sIGJlY2F1c2UgaXQgZG9lcyBub3QgeWllbGQgYSB2ZXJp ZmlhYmxlIHNwZWNpZmljYXRpb24sIGFuZCByZXNvdXJjZSBjb250cm9sIHVzaW5nIHN3aXRjaGVz LCBzaW5jZSBpdCBpcyBhIGxpdmVuZXNzIHByb3BlcnR5Lg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0K PHA+PGEgaHJlZj0iaHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdy9pUU5xWnpBOGdWbWQ0UlFheWNB d3g0Ij5odHRwczovL3dhdGNoLm9jYW1sLm9yZy93L2lRTnFaekE4Z1ZtZDRSUWF5Y0F3eDQ8L2E+ DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+T0NhbWwgU29mdHdhcmUgRm91bmRh dGlvbjogSmFudWFyeSAyMDI0IHVwZGF0ZTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3Qvb2NhbWwtc29mdHdhcmUtZm91bmRhdGlvbi1qYW51YXJ5LTIwMjQtdXBkYXRlLzEz ODI4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXNvZnR3YXJlLWZvdW5k YXRpb24tamFudWFyeS0yMDI0LXVwZGF0ZS8xMzgyOC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNTdhZGJjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnMTU3YWRiYyI+Z2FzY2hlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMTU3YWRiYyI+DQo8cD5IYXBweSBuZXcgeWVhciEgPC9w Pg0KPHA+VGhpcyBpcyBhbiB1cGRhdGUgdXBkYXRlIG9uIHJlY2VudCB3b3JrcyBvZiB0aGUgPGEg aHJlZj0iaHR0cDovL29jYW1sLXNmLm9yZy8iPg0KT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbjwv YT4sIGNvdmVyaW5nIG91ciAyMDIzIGFjdGlvbnMg4oCTIHRoZSBwcmV2aW91cyB1cGRhdGUgd2Fz IGluDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtc29mdHdhcmUt Zm91bmRhdGlvbi1qYW51YXJ5LTIwMjMtdXBkYXRlLzExMjE3Ij4NCkphbnVhcnkgMjAyMzwvYT4u IDwvcD4NCjxwPlRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIGlzIGEgbm9uLXByb2ZpdCBm b3VuZGF0aW9uICg8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRoZS1v Y2FtbC1zb2Z0d2FyZS1mb3VuZGF0aW9uLzQ0NzYiPmVhcmxpZXIgdGhyZWFkPC9hPikgdGhhdCBy ZWNlaXZlcyBmdW5kaW5nIGZyb20NCjxhIGhyZWY9Imh0dHA6Ly9vY2FtbC1zZi5vcmcvI3Nwb25z b3JzIj5vdXIgaW5kdXN0cmlhbCBzcG9uc29yczwvYT4gZWFjaCB5ZWFyLCBhbmQgdHJpZXMgaXRz IGJlc3QgdG8gc3BlbmQgaXQgdG8gc3VwcG9ydCBhbmQgc3RyZW5ndGhlbiB0aGUgT0NhbWwgZWNv c3lzdGVtIGFuZCBjb21tdW5pdHkuDQo8L3A+DQo8cD5UaGUgZnVuZGluZyB2b2x1bWUgd2UgcmVj ZWl2ZSBlYWNoIHllYXIgaXMgYXJvdW5kIDIwMEvigqwuIChGb3IgY29tcGFyaXNvbjogdGhpcyBp cyB0aGUgeWVhcmx5IGNvc3Qgb2Ygb25lIGV4cGVyaWVuY2VkIGZ1bGwtdGltZSBzb2Z0d2FyZSBl bmdpbmVlciBpbiBtYW55IHBhcnRzIG9mIHRoZSB3b3JsZC4pIFdlIGRvIG5vdCBmdW5kIHBlb3Bs ZSBmdWxsLXRpbWUgZm9yIGxvbmcgcGVyaW9kcy4gTW9zdCBhY3Rpb25zIHJlY2VpdmUgZnJvbSAz S+KCrA0KIHRvIDIwS+KCrC4gVGhlIHdvcmsgdG8gcHJlcGFyZSBhbmQgZXhlY3V0ZSBhY3Rpb25z IGlzIG1vc3RseSBkb25lIGJ5IHRoZSAodW5wYWlkKSA8YSBocmVmPSJodHRwOi8vb2NhbWwtc2Yu b3JnL2Fib3V0LXVzLyI+DQpFeGVjdXRpdmUgQ29tbWl0dGVlPC9hPi4gSXQgaXMgY3VycmVudGx5 IGZvcm1lZCBieSBOaWNvbMOhcyBPamVkYSBCw6RyLCBEYW1pZW4gRG9saWdleiwgWGF2aWVyIExl cm95LCBLaW0gTmd1eeG7hW4sIFZpcmdpbGUgUHJldm9zdG8gYW5kIG15c2VsZiwgd2l0aCBhZG1p bmlzdHJhdGl2ZSBwZXJzb25uZWwgcHJvdmlkZWQgYnkNCjxhIGhyZWY9Imh0dHBzOi8vZW4ud2lr aXBlZGlhLm9yZy93aWtpL0ZyZW5jaF9JbnN0aXR1dGVfZm9yX1Jlc2VhcmNoX2luX0NvbXB1dGVy X1NjaWVuY2VfYW5kX0F1dG9tYXRpb24iPg0KSU5SSUE8L2E+IGFuZCBnZW5lcmFsIGFzc2lzdGFu Y2UgYnkgQWxhbiBTY2htaXR0LiA8L3A+DQo8cD5PdXIgY3VycmVudCBzcG9uc29ycyAodGhhbmtz ISkgYXJlIDxhIGhyZWY9Imh0dHBzOi8vYWhyZWZzLmNvbS8iPmFocmVmczwvYT4sIDxhIGhyZWY9 Imh0dHBzOi8vamFuZXN0cmVldC5jb20vIj4NCkphbmUgU3RyZWV0PC9hPiwgPGEgaHJlZj0iaHR0 cHM6Ly90ZXpvcy5jb20vIj5UZXpvczwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vYmxvb21iZXJnLmNv bS8iPg0KQmxvb21iZXJnPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9sZXhpZmkuY29tLyI+TGV4aWZp PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9zaW1jb3JwLmNvbS8iPg0KU2ltQ29ycDwvYT4sIDxhIGhy ZWY9Imh0dHBzOi8vd3d3Lm1pdHN1YmlzaGllbGVjdHJpYy1yY2UuZXUvIj5NRVJDRTwvYT4gYW5k IDxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vIj4NClRhcmlkZXM8L2E+LiAoSWYgeW91ciBj b21wYW55IHdvdWxkIGxpa2UgdG8gam9pbiBhcyBhIHNwb25zb3IsIHBsZWFzZSA8YSBocmVmPSJo dHRwOi8vb2NhbWwtc2Yub3JnL2JlY29taW5nLWEtc3BvbnNvci8iPg0KZ2V0IGluIHRvdWNoPC9h Pi4gVW5mb3J0dW5hdGVseSwgd2Ugc3RpbGwgY2Fubm90IGVmZmljaWVudGx5IHByb2Nlc3Mgc21h bGwgZG9uYXRpb25zLCBzbyB3ZSBhcmUgbm90IGNhbGxpbmcgZm9yIGluZGl2aWR1YWwgZG9uYXRp b25zLikNCjwvcD4NCjxwPkZlZWwgZnJlZSB0byB1c2UgdGhpcyB0aHJlYWQgZm9yIHF1ZXN0aW9u cy9zdWdnZXN0aW9ucyA6LSkgPC9wPg0KPHA+PGI+UmVjZW50IGFjdGlvbnM8L2I+IDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzgwNjcwMSIgY2xhc3M9Im91dGxp bmUtNCI+DQo8aDQgaWQ9Im9yZzc4MDY3MDEiPlRlYWNoaW5nPC9oND4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc3ODA2NzAxIj4NCjxwPldlIGFyZSBmdW5kaW5nIGFu IHVwZGF0ZSBhbmQgRW5nbGlzaCB0cmFuc2xhdGlvbiAoc3RpbGwgaW4gcHJvZ3Jlc3MpIG9mIHRo ZSBGcmVuY2ggYm9vaw0KPGEgaHJlZj0iaHR0cDovL3Byb2dyYW1tZXItYXZlYy1vY2FtbC5scmku ZnIvIj5BcHByZW5kcmUgw6AgUHJvZ3JhbW1lciBhdmVjIE9DYW1sPC9hPiwgYnkgU3lsdmFpbiBD b25jaG9uIGFuZCBKZWFuLUNocmlzdG9waGUgRmlsbGnDonRyZSwgdW5kZXIgdGhlIHVuZGVyc3Rh bmRpbmcgdGhhdCBpdCB3aWxsIGJlIHJlbGVhc2VkIGFzIG9wZW4gYWNjZXNzIGNvbnRlbnQg4oCT IG9ubGluZSwgYXQgbm8gY29zdC4gVGhpcyBpcyBhIGdvb2QgYm9vayB0aGF0IGlzDQogc3VpdGFi bGUgZm9yIHVzZSBpbiBjbGFzc3Jvb20gb2YgZmlyc3QtIG9yIHNlY29uZC15ZWFyIHVuaXZlcnNp dHkgc3R1ZGVudHMgb2YgdmFyaW91cyBsZXZlbC4gKEluIGNvbXBhcmlzb24sDQo8YSBocmVmPSJo dHRwczovL2pvaG53aGl0aW5ndG9uLm5ldC9vY2FtbGZyb210aGV2ZXJ5YmVnaW5uaW5nL2luZGV4 Lmh0bWwiPk9DYW1sIGZyb20gdGhlIFZlcnkgQmVnaW5uaW5nPC9hPiBhbmQNCjxhIGhyZWY9Imh0 dHBzOi8vZGV2LnJlYWx3b3JsZG9jYW1sLm9yZy8iPlJlYWwgV29ybGQgT0NhbWw8L2E+IGFyZSBt b3JlIGFpbWVkIGFzIHNlbGYtc3R1ZHkgdGhhbiB1c2UgaW4gY2xhc3Nyb29tLCBhbmQgdGhlDQo8 YSBocmVmPSJodHRwczovL2NzMzExMC5naXRodWIuaW8vdGV4dGJvb2svY292ZXIuaHRtbCI+Q29y bmVsbCBDUzMxMTAgdGV4dGJvb2s8L2E+IGlzIGFpbWVkIGF0IG1vcmUgYWR2YW5jZWQgc3R1ZGVu dHMgd2l0aCBhIHN0cm9uZyBiYWNrZ3JvdW5kLikNCjwvcD4NCjxwPkZvciB0aGUgc2Vjb25kIHll YXIgaW4gYSByb3csIHdlIGZ1bmRlZCBhIFNwYW5pc2ggPGEgaHJlZj0iaHR0cHM6Ly93ZWJkaWlz LnVuaXphci5lcy9ldnBmL2luZGV4Lmh0bWwiPg0Kc3VtbWVyIHNjaG9vbDwvYT4gb24gZnVuY3Rp b25hbCBwcm9ncmFtbWluZyBpbiBPQ2FtbCwgb3JnYW5pemVkIGluIFNhcmFnb3NzYSBieSBSaWNh cmRvIFJvZHJpZ3VleiBhbmQgUm9iZXJ0byBCbGFuY28uIFRoaXMgaXMgYW4gb2NjYXNpb24gZm9y IHN0dWRlbnRzIHRvIGRpc2NvdmVyIE9DYW1sIGFuZCBmdW5jdGlvbmFsIHByb2dyYW1taW5nLCBh bmQgdGhlIG9yZ2FuaXplcnMgYWxzbyBydW4gYSBvbmUtZGF5IG1pbmktd29ya3Nob3AgZm9yIHRo ZQ0KIHN0dWRlbnRzIGFuZCBhbnlvbmUgaW50ZXJlc3RlZCAoaW5jbHVkaW5nIG9ubGluZSksIHRo ZSA8YSBocmVmPSJodHRwczovL3dlYmRpaXMudW5pemFyLmVzL2V2cGYvZXZlbnQuaHRtbCI+DQpE YXkgb2YgdGhlIENhbWw8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnZjJkZjhlMiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Yy ZGY4ZTIiPk91dHJlYWNoPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4 dC1vcmdmMmRmOGUyIj4NCjxwPldlIGFyZSBmdW5kaW5nIHRoZSByZWN1cnJpbmcgPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvb3VwcyI+T0NhbWwgTWVldHVwIGluIFBhcmlz PC9hPjsgdGhpcyB5ZWFyIHdlIGFyZSBhbHNvIGZ1bmRpbmcgYSBuZXcgbWVldHVwIGluIFRvdWxv dXNlLCBhIGNpdHkgaW4gdGhlIHNvdXRoLXdlc3QgcmVnaW9uIG9mIEZyYW5jZSBrbm93biBmb3Ig ZHVjayBjdWlzaW5lLCB3aGl0ZSBiZWFucywgYW5kIHN0cm9uZyBhZXJvc3BhY2UNCiBpbmR1c3Ry eS4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG9yZ2FuaXppbmcgYW4gT0NhbWwgbWVldHVwIGlu IHlvdXIgY2l0eSwgYW5kIHNvbWUgbGlnaHQgZnVuZGluZyB3b3VsZCBoZWxwLCBwbGVhc2UgZ2V0 IGluIHRvdWNoIQ0KPC9wPg0KPHA+V2UgZ290IGluIHRvdWNoIHdpdGggdGhlIG9yZ2FuaXplcnMg b2YgdGhlIElDRlAgMjAyMyBjb25mZXJlbmNlIHRvIGVuc3VyZSB0aGF0IGNvbG9jYXRlZCB3b3Jr c2hvcHMgKHdoaWNoIGluY2x1ZGUgdGhlIE9DYW1sIFdvcmtzaG9wKSBjYW4gYmUgYXR0ZW5kZWQg b25saW5lIGF0IGxvdyBvciBubyBjb3N0LiBUaGUgSUNGUCBvcmdhbml6ZXJzIGFjY2VwdGVkIHRv IChzZW1pLW9mZmljaWFsbHkpIG1ha2UgdmlydHVhbCBhdHRlbmRhbmNlIGZyZWUsDQogc28gd2Ug dHJpZWQgdG8gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtz aG9wLTIwMjMtc2F0dXJkYXktc2VwdGVtYmVyLTl0aC1zZWF0dGxlLXRpbWV6b25lLW9ubGluZS1h dHRlbmRhbmNlLWlzLWZyZWUvMTIyMjYiPg0KZW5jb3VyYWdlIGJyb2FkIHBhcnRpY2lwYXRpb248 L2E+IHRvIHRoZSBPQ2FtbCBXb3Jrc2hvcC4gV2UgYWxzbyBzdXBwb3J0ZWQgdGhlIE9DYW1sIFdv cmtzaG9wIGJ5IGZ1bmRpbmcgdGhlIGV4cGVuc2VzIG9mIHNvbWUgb2YgdGhlIHByb2dyYW0gY29t bWl0dGVlIG1lbWJlcnMgdG8gYXR0ZW5kLCB3aGVuIHRoZXkgZG8gbm90IGhhdmUgYW4gZW1wbG95 ZXIgaW4gYWNhZGVtaWEgb3IgaW5kdXN0cnkgdGhhdCBjYW4gZWFzaWx5IHJlaW1idXJzZSB0aGVp cg0KIHRyaXAuIDwvcD4NCjxwPldlIGFyZSBzdXBwb3J0aW5nIHRoZSB3b3JrIG9mIEFsYW4gU2No bWl0dCBvbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4N CkNhbWwgV2Vla2x5IE5ld3NsZXR0ZXIgKENXTik8L2E+LiA8L3A+DQo8cD5LaW0gTmd1eeG7hW4g cmFuIHRoZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXVz ZXItc3VydmV5LTIwMjMvMTM0NjkiPg0KT0NhbWwgVXNlciBTdXJ2ZXkgMjAyMzwvYT4gZm9yIHRo ZSBPQ2FtbCBGb3VuZGF0aW9uIOKAkyB3ZSBoYXZlIG5vdCBwb3N0ZWQgdGhlIHN1cnZleSByZXN1 bHRzIHlldC4NCjwvcD4NCjxwPldlIGludml0ZWQgU3VkaGEgUGFyaW1hbGEgdG8gcHJvcG9zZSBt b3JlIGFjdGlvbnMgb3JpZW50ZWQgdG93YXJkcyBkaXZlcnNpdHkgYW5kIGluY2x1c2lvbi4gQSBm aXJzdCBzdGVwIGlzIHRoZSBpbmNsdXNpb24gb2YgZGVtb2dyYXBoaWMgcXVlc3Rpb25zIGluIHRo ZSAyMDIzIHN1cnZleSwgdG8gZ2V0IGEgYmV0dGVyIHBpY3R1cmUgb2YgdGhlIGN1cnJlbnQgY29t cG9zaXRpb24gb2YgdGhlIE9DYW1sIGNvbW11bml0eS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2MjRiYWUzIiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnNjI0YmFlMyI+RWNvc3lzdGVtPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmc2MjRiYWUzIj48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBpZD0ib3JnZDhmZjVkMSI+PC9hPkluZnJhc3RydWN0dXJlPGJyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2Q4ZmY1ZDEiPg0KPHA+QXMgaW4gcHJldmlv dXMgeWVhcnMsIHdlIGFyZSBmdW5kaW5nIEthdGUgRGVwbGFpeCB0byB3b3JrIG9uIOKAnHJlbGVh c2UgcmVhZGluZXNz4oCdIG9mIHRoZSBPQ2FtbCBlY29zeXN0ZW06IHdoZW4gYSBuZXcgT0NhbWwg cmVsZWFzZSBpcyBiZWluZyBwcmVwYXJlZCwgS2F0ZSBjaGVja3MgdGhlIGNvbXBhdGliaWxpdHkg b2YgYWxsIG9wYW0gcGFja2FnZXMgd2l0aCB0aGUgdXBjb21pbmcgcmVsZWFzZSBhbmQgZ2V0cyBp biB0b3VjaCB3aXRoIG1haW50YWluZXJzDQogdG8gY29udHJpYnV0ZSBvciByZXF1ZXN0IHN1cHBv cnQgZm9yIHRoZSBuZXcgdmVyc2lvbi4gVGhlIE9DYW1sIDUgdHJhbnNpdGlvbiBoYXMgYmVlbiBh IGxvdCBvZiB3b3JrIGZvciBLYXRlIG9uIHRoaXMgZnJvbnQg4oCTIG1vc3RseSBub3QgZHVlIHRv IHRoZSBNdWx0aWNvcmUgcnVudGltZSBjaGFuZ2VzLCBidXQgdGhlIHJlbW92YWwgb2YgdmFyaW91 cyBsb25nLWRlcHJlY2F0ZWQgZnVuY3Rpb25zIG9mIG91ciBDIGFuZCBPQ2FtbCBBUElzLg0KPC9w Pg0KPHA+Rm9yIGFsbW9zdCBhcyBsb25nIGFzIHdlIGNhbiByZW1lbWJlciwgS2F0ZSBEZXBsYWl4 IGhhcyBhbHNvIGJlZW4gdGhlIG1vc3QgYWN0aXZlIG1haW50YWluZXIgb2YgdGhlIG9wYW0tcmVw b3NpdG9yeSDigJMgdGhlIHBlcnNvbiB3aG8gcHJvdmlkZXMgZmVlZGJhY2sgd2hlbiB0aGVyZSBp cyBhIHBhY2thZ2luZyBpc3N1ZSBpbiBhIG5ldyBQUiB0byB0aGUgb3BhbS1yZXBvc2l0b3J5LCB0 byBpbnRlcnByZXQgQ0kgZmFpbHVyZXMsIHJlY29tbWVuZA0KIGJlc3QgcGFja2FnaW5nIHByYWN0 aWNlcywgZXRjLiAoS2F0ZeKAmXMgd29yayBvbiB0aGlzIHRvcGljIHdhcyBmdW5kZWQgYnkgT0Nh bWxsYWJzIHRoZW4gVGFyaWRlcywgbm90IHRoZSBPQ2FtbCBGb3VuZGF0aW9uLikgS2F0ZSBkZWNp ZGVkIHJlY2VudGx5IHRvIG1vdmUgb24gdG8gb3RoZXIgdGhpbmdzIOKAkyBub3RhYmx5LCBjb250 cmlidXRpb25zIHRvDQo8Y29kZT5vcGFtPC9jb2RlPi4gKFRoZXJlIHdhcyBhIDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1uZXctb3BhbS1yZXBvc2l0b3J5LW1h aW50YWluZXJzLzEyMDQxLzgiPg0KY2FsbCBmb3Igdm9sdW50ZWVyczwvYT4gb24gRGlzY3VzcyBh cm91bmQgdGhhdCB0aW1lLikgVGhpcyB3YXMgYSBiaXQgb2YgYSBzY2FyZSBmb3IgdXMgYXMgdGhl IGdvb2QgaGVhbHRoIG9mIHRoZSBwdWJsaWMgb3BhbS1yZXBvc2l0b3J5IGlzIGNlbnRyYWwgdG8g dGhlIGZ1bmN0aW9uaW5nIG9mIHRoZSBjdXJyZW50IE9DYW1sIGZyZWUgc29mdHdhcmUgZWNvc3lz dGVtLiBXZSB3ZXJlIGFscmVhZHkgcHJvdmlkaW5nIGZpbmFuY2lhbCBzdXBwb3J0IChpbg0KIHRo ZSBmb3JtIG9mIHJlc2VhcmNoIGZ1bmRpbmcpIHRvIE1hcmNlbGxvIFNlcmksIHRoZSBzZWNvbmQg bW9zdC1hY3RpdmUgY29udHJpYnV0b3IsIGFuZCByZW5ld2VkIG91ciBzdXBwb3J0LiBXZSBhbHNv IGdvdCBpbiB0b3VjaCB3aXRoIG90aGVyIG9wYW0tcmVwb3NpdG9yeSBjb250cmlidXRvcnMsIGFu ZCBzdGFydGVkIGZ1bmRpbmcgdGhlIHdvcmsgb2YgSGFvY2hlbiBYaWUuDQo8L3A+DQo8L2Rpdj4N CjwvbGk+PGxpPjxhIGlkPSJvcmczOTNkMDkyIj48L2E+VG9vbHM8YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMzkzZDA5MiI+DQo8cD5XZSBnb3QgaW4gdG91Y2gg d2l0aCBmcmVxdWVudCBEdW5lIGNvbnRyaWJ1dG9ycyB0byBvZmZlciBmaW5hbmNpYWwgc3VwcG9y dCBmb3IgdGhlaXIgY29udHJpYnV0aW9ucy4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9B bGl6dGVyIj5BbGkgQ2FnbGF5YW48L2E+IHdhcyBzdXBwb3J0ZWQgaW4gdGhpcyB3YXkgaW4gMjAy My4NCjwvcD4NCjxwPldlIGFyZSBzdXBwb3J0aW5nIHNvbWUgb2YgdGhlIHdvcmsgb2YgSm9uYWgg QmVja2ZvcmQgb24gV2luZG93cyBzdXBwb3J0IG9mIE9DYW1sLCBhcyB3ZWxsIGFzIGhpcyB3b3Jr IG9uIG1lbnRvcmluZyBPQ2FtbCBzdHVkZW50cyBpbiB0aGUgU2VhdHRsZSBhcmVhLiBJZiB5b3Ug d2FudCB0byBsZWFybiBhYm91dCBKb25haOKAmXMgd29yaywgY29uc2lkZXIgd2F0Y2hpbmcNCjxh IGhyZWY9Imh0dHBzOi8vaGZwdWcub3JnLzIwMjMvMDQvMjEvam9uYWgtYmVja2ZvcmQtd2hhdC1k aXN0cmlidXRpbmctb2NhbWwtb24td2luZG93cy1nYXZlLW1lLWFuZC15b3UvIj4NCmhpcyBBcHJp bCAyMDIzIHRhbGs8L2E+IGF0IHRoZSBIb3VzdG9uIEZ1bmN0aW9uYWwgUHJvZ3JhbW1lcnMgbWVl dHVwLiA8L3A+DQo8cD5TaW1tbyBTYWFuIHNwb250YW5lb3VzbHkgPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lYXJseWJpcmQtMS0yLTAtcmV2aXZhbC1vZi1hLWRlYnVn Z2VyLzEyNzQxIj4NCnRvb2sgdXAgbWFpbnRlbmFuY2Ugb2Ygb2NhbWxlYXJseWJpcmQ8L2E+LCB0 aGUgYnl0ZWNvZGUgZGVidWdnZXIgZnJvbnRlbmQgdGhhdCBpbnRlZ3JhdGVzIHdpdGggdmlzdWFs IHN0dWRpbyBjb2RlIOKAkyB3ZSBoYWQgcHJldmlvdXNseSBmdW5kZWQgb2NhbWxlYXJseWJpcmQg bWFpbnRlbmFuY2UsIGJ1dCBpdHMgV2VuIG1vdmVkIHRvIGEgZGVtYW5kaW5nIHN0YXJ0dXAgYW5k IHdhcyBub3QgYXZhaWxhYmxlIHRvIHdvcmsgb24gb2NhbWxlYXJseWJpcmQNCiBhbnltb3JlLiBX ZSBhcmUgZnVuZGluZyB0aGUgdGltZSBvZiBTaW1tbyBTYWFuLCB3aG8gYWNjb21wbGlzaGVkIGEg bG90IGluIGEgc2hvcnQgYW1vdW50IG9mIHRpbWUsIG5vdGFibHkgdGhlIGludGVncmF0aW9uIG9m IHRoZSBvY2FtbGVhcmx5YmlyZCBwbHVnaW4gaW4gdGhlIG1haW4gT0NhbWwgcGx1Z2luIGZvciB2 c2NvZGUuDQo8L3A+DQo8cD5XZSB3aWxsIGJlIGZ1bmRpbmcgb25lIHllYXIgb2YgcG9zdC1kb2Mg YnkgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Q2cyI+VGFrYWZ1bWkgU2Fpa2F3YTwvYT4g YXQgTmFnb3lhIFVuaXZlcnNpdHksIHRvIGNvbnRpbnVlIGhpcyB3b3JrIHdpdGggSmFjcXVlcyBH YXJyaWd1ZSBvbiB0aGUgcmVmYWN0b3Jpbmcgb2YgdGhlIE9DYW1sIHR5cGUtY2hlY2tlci4gVGhl IHR5cGUtY2hlY2tlciBjb2RlYmFzZSBzdWZmZXJzIGZyb20gdGVjaG5pY2FsDQogZGVidCwgYW5k IHRoZSBlZmZvcnQgbGVkIGJ5IEphY3F1ZXMgaW4gdGhlIGxhc3QgZmV3IHllYXIgaGFzIGJlZW4g cHJlY2lvdXMgaW4gbWFraW5nIGl0IGVhc2llciB0byB1bmRlcnN0YW5kLCBpbXByb3ZlIGFuZCBl eHRlbmQgZm9yIG90aGVyIGRldmVsb3BlcnMuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlk PSJvcmdjNjk5YmYwIj48L2E+TGlicmFyaWVzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTUiIGlkPSJ0ZXh0LW9yZ2M2OTliZjAiPg0KPHA+V2UgZnVuZGVkIHdvcmsgYnkgQWxhbiBIdSB0 byBpbXByb3ZlIHRoZSBPQ2FtbCBMTFZNIGJpbmRpbmdzLCB0byBzdXBwb3J0IG5ld2VyIExMVk0g cmVsZWFzZXMgYW5kIG1ha2UgdGhlbSBjb21wYXRpYmxlIHdpdGggT0NhbWwgNS4gQWxhbg0KPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1sbHZtLTE1LWlzLW91dC8xMzAx OSI+YW5ub3VuY2VkIHRoaXMgd29yazwvYT4gb24gRGlzY3Vzcy4NCjwvcD4NCjxwPldlIHN1cHBv cnQgdGhlIGNvbnRyaWJ1dGlvbnMgb2YgRGFuaWVsIELDvG56bGkgdG8gdGhlIE9DYW1sIGVjb3N5 c3RlbS4gRGFuaWVsIHVzZWQgdGhpcyBzdXBwb3J0IHRvIGZ1bmQgdGhlIGRldmVsb3BtZW50IG9m DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1jbWFya2l0LTAtMS0wLWNvbW1vbm1hcmstcGFyc2VyLWFuZC1yZW5k ZXJlci1mb3Itb2NhbWwvMTE5MDAiPmNtYXJraXQ8L2E+LCBhIG5ldyBNYXJrZG93biBwYXJzZXIg YW5kIHJlbmRlcmVyIGZvciBPQ2FtbCwgYW5kDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcG9jLW9jYW1sbWFyay1hbi1vY2FtbGRvYy10by1jb21tb25tYXJrLWJpLWRpcmVj dGlvbmFsLXRyYW5zbGF0aW9uLzExOTAxLzIiPg0Kb2NhbWxtYXJrPC9hPiBhIHRvb2wgdG8gdXNl IE1hcmtkb3duIHRvIHdyaXRlIE9DYW1sIGRvY3VtZW50YXRpb24gY29tbWVudHMsIDwvbGk+PGxp PjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wb2Mtb2NhbWxtYXJrLWFuLW9j YW1sZG9jLXRvLWNvbW1vbm1hcmstYmktZGlyZWN0aW9uYWwtdHJhbnNsYXRpb24vMTE5MDEvMiI+ V2ViR1BVIHN1cHBvcnQgaW4gYnJyPC9hPiwgaGlzIGJyb3dzZXIgaW50ZXJhY3Rpb24gdG9vbGtp dA0KPC9saT48bGk+c3VwcG9ydCBmb3IgVW5pY29kZSAxNS4wIGFuZCAxNS4xIGluIGhpcyBVbmlj b2RlIGxpYnJhcmllcyA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLXppcGMtMC0xLTAvMTMzODgiPnppcGM8L2E+LCBhIHB1cmUtT0NhbWwgWklQIGFyY2hp dmVyLg0KPC9saT48L3VsPg0KPHA+V2UgY29udGludWVkIHByb3ZpZGluZyBwYXJ0aWFsIHN1cHBv cnQgZm9yIHRoZSB3b3JrIG9mIEFudG9uaW8gTW9udGVpcm8gb24gPGEgaHJlZj0iaHR0cHM6Ly9t ZWxhbmdlLnJlL3YyLjIuMC8iPg0KTWVsYW5nZTwvYT4uIEluIDIwMjMsIEFudG9uaW8gPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tZWxhbmdlLTEtMC1jb21waWxlLW9j YW1sLXJlYXNvbm1sLXRvLWphdmFzY3JpcHQvMTIzMDUiPg0KYW5ub3VuY2VkIE1lbGFuZ2UgMS4w PC9hPi4gPC9wPg0KPHA+V2UgYXJlIHN1cHBvcnRpbmcgdGhlIHdvcmsgb2YgUGV0dGVyIFVya2Vk YWwgb24gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wYXVya2VkYWwvb2NhbWwtY2Fx dGkvIj4NCkNhcXRpPC9hPiBsaWJyYXJ5LCB0aGUgbWFpbiBkYXRhYmFzZSBjb25uZWN0aW9uIGxp YnJhcnkgaW4gdGhlIE9DYW1sIGNvbW11bml0eS4gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1jYXF0aS0yLTAtMS8xMjg4NSI+DQpDYXF0aSAyPC9hPiB3YXMgcmVsZWFz ZWQgaW4gMjAyMy4gPC9wPg0KPHA+V2Ugd2lsbCBiZSBzdXBwb3J0aW5nIHRoZSB0aW1lIG9mIE5h dGhhbiBSZWJvdXJzIHRvIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93ZWxj b21pbmctYS1uZXctcHB4bGliLW1haW50YWluZXIvMTM2MjAiPg0KY29udHJpYnV0ZSB0byB0aGUg bWFpbnRlbmFuY2U8L2E+IG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgv cHB4bGliIj4NCnBweGxpYjwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjMiPk1pb3UsIGEgc2ltcGxlIHNjaGVkdWxlciBmb3IgT0NhbWwgNTwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1pb3UtYS1zaW1wbGUt c2NoZWR1bGVyLWZvci1vY2FtbC01LzEyOTYzLzEzIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tbWlvdS1hLXNpbXBsZS1zY2hlZHVsZXItZm9yLW9jYW1sLTUvMTI5NjMvMTM8L2E+ IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmFmNGRlZCIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzJhZjRkZWQiPkNhbGFzY2liZXR0YSBSb21haW4g YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcy YWY0ZGVkIj4NCjxwPknigJltIGRlbGlnaHRlZCB0byBhbm5vdW5jZSB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvbWlvdS9yZWxlYXNlcy90YWcvdjAuMC4xX2JldGEy Ij4NCjxjb2RlPmJldGEyPC9jb2RlPjwvYT4gcmVsZWFzZSBvZiBNaW91LiBUaGlzIHN1bW1hcmlz ZXMgdGhlIGZlZWRiYWNrIHdl4oCZdmUgcmVjZWl2ZWQgYW5kIHNwZWNpZmllcyB0aGUgQVBJIHRo YXQgdGhpcyBsaWJyYXJ5IHNob3VsZCBvZmZlciBpbiB0ZXJtcyBvZiBzY2hlZHVsaW5nLg0KPC9w Pg0KPHA+QXMgYSByZW1pbmRlciwgTWlvdSBpcyBpbnRlbmRlZCB0byBiZSBzaW1wbGUgYW5kIGRl c2lnbmVkIGZvciBkZXZlbG9waW5nIHNlcnZpY2VzIGFuZCBpbnRlZ3JhdGluZyBpbnRvIGEgdW5p a2VybmVsLiBXZSB3ZXJlIHRhbGtpbmcgYWJvdXQgaW1wbGVtZW50aW5nIGEgbGlicmFyeSBzdWNo IGFzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9oYXBweS1leWViYWxs cyI+aGFwcHktZXllYmFsbHM8L2E+IHdpdGggTWlvdSwgYnV0IHdlIGhhdmUgbm93IG1hZGUgYXZh aWxhYmxlIGEgbGlicmFyeSB0aGF0IGltcGxlbWVudHMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9yb2J1ci1jb29wL2h0dHBjYXRzIj5hbiBIVFRQIGNsaWVudCBhbmQvb3Igc2VydmVyPC9h PiAoPGNvZGU+aHR0cC8xLjE8L2NvZGU+LA0KPGNvZGU+aDI8L2NvZGU+IGFzIHdlbGwgYXMgPGNv ZGU+YWxwbjwvY29kZT4gc3VwcG9ydCB2aWEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21p cmxlZnQvb2NhbWwtdGxzLyI+DQpvY2FtbC10bHM8L2E+KS4gPC9wPg0KPHA+VGhpcyBoYXMgZW5h YmxlZCB1cyB0byBmaW5kIGJ1Z3MgdHlwaWNhbCBvZiBhIHRyYW5zaXRpb24gYmV0d2VlbiBPQ2Ft bCA0IGFuZCBPQ2FtbCA1LCBpbiBwYXJ0aWN1bGFyIGlsbGVnYWwgcGFyYWxsZWwgYWNjZXNzIHRv IGRhdGEgb24NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWNyeXB0 by9wdWxsLzE4NiI+bWlyYWdlLWNyeXB0bzwvYT4gKGFsdGhvdWdoIHdlIHdvdWxkIGxpa2UgdG8g b2JzZXJ2ZSB0aGUgaW1wbGljYXRpb25zIGluIHRlcm1zIG9mIHBlcmZvcm1hbmNlIG9mIG91ciBm aXgpLg0KPC9wPg0KPHA+V2Ugd2lsbCBvZiBjb3Vyc2UgY29udGludWUgdG8gbGlzdGVuIGFuZCBl eHBlcmltZW50IHdpdGggTWlvdSBpbiBvcmRlciB0byBkZXZlbG9wIHRoaXMgbGlicmFyeSBpbiBh IHdheSB0aGF0IHN1aXRzIHVzIGFuZCBvdXIgdXNlcnMuIFRoZSBkb2N1bWVudGF0aW9uIGhhcyBi ZWVuIHVwZGF0ZWQgYWNjb3JkaW5nbHkgYW5kIGlzIG5vdyBhdmFpbGFibGUNCjxhIGhyZWY9Imh0 dHBzOi8vZG9jcy5vc2F1LnJlLyI+aGVyZTwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSI0Ij5HcmFjZSDwn5KFLCBmYW5jeSBkaWFnbm9zdGljIGxpYnJhcnkgZm9yIGNvbXBpbGVy czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdyYWNlLWZhbmN5 LWRpYWdub3N0aWMtbGlicmFyeS1mb3ItY29tcGlsZXJzLzEzODM0LzEiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1ncmFjZS1mYW5jeS1kaWFnbm9zdGljLWxpYnJhcnktZm9yLWNv bXBpbGVycy8xMzgzNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmc4Y2E1ZmYyIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOGNhNWZmMiI+ QWxpc3RhaXIgT+KAmUJyaWVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnOGNhNWZmMiI+DQo8cD5JdCBpcyBteSBwbGVhc3VyZSB0byBhbm5v dW5jZSB0aGUgaW5pdGlhbCByZWxlYXNlIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9q b2hueW9iL2dyYWNlIj4NCkdyYWNlPC9hPiwgYSBjdXR0aW5nLWVkZ2UgT0NhbWwgbGlicmFyeSDw n5CqIHRoYXQgaW5jbHVkZXMgYSBzZXJpZXMgb2YgaW50ZXJmYWNlcyBmb3IgYnVpbGRpbmcsIHJl cG9ydGluZywgYW5kIHJlbmRlcmluZyBiZWF1dGlmdWwgY29tcGlsZXIgZGlhZ25vc3RpY3MuDQo8 L3A+DQo8cD5UbyBnZXQgc3RhcnRlZCwgc2ltcGx5IHJ1bjogPC9wPg0KPGRpdiBjbGFzcz0ib3Jn LXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+b3BhbSB1cGRhdGUN Cm9wYW0gaW5zdGFsbCBncmFjZQ0KPC9wcmU+DQo8L2Rpdj4NCjxwPjxiPktleSBmZWF0dXJlczwv Yj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPvCfk5AgSW5saW5lIGFuZCBtdWx0aS1s aW5lIGVycm9yIG1lc3NhZ2VzIHdpdGggYXNzb2NpYXRlZCBwcmlvcml0aWVzIDwvbGk+PGxpPvCf k4IgTXVsdGktZmlsZSBlcnJvcnMgPC9saT48bGk+4pqZ77iPIENvbmZpZ3VyYWJsZSByZW5kZXJp bmcgKHN0eWxpbmcgYW5kIGNoYXJhY3RlciBzZXQpIDwvbGk+PGxpPvCfjIggQ29sb3VyZWQgbWVz c2FnZXMgZm9yIEFOU0kgdGVybWluYWxzIDwvbGk+PGxpPvCfkqogMTAwJSBPQ2FtbCA8L2xpPjwv dWw+DQo8cD5UaGUgcHJvamVjdCBpcyBzdGlsbCBpbiBpdHMgZWFybHkgcGhhc2Ugd2l0aCBtYW55 IGFkZGl0aW9uYWwgZmVhdHVyZXMgcGxhbm5lZDoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT7wn5OaIFVuaWNvZGUgc3VwcG9ydCA8L2xpPjxsaT7imqHvuI8gTFNQIGludGVncmF0aW9u IHdpdGggPGNvZGU+bGlub2w8L2NvZGU+IDwvbGk+PGxpPvCfkYAgQWNjZXNzaWJpbGl0eSBmZWF0 dXJlcyBzdWNoIGltcHJvdmVkIGNvbG91ciBvcHRpb25zIGFuZCBuYXJyYXRhYmxlIHJlbmRlcmVy cw0KPC9saT48L3VsPg0KPHA+SSBpbnZpdGUgdGhlIGNvbW11bml0eSB0byBwbGF5IHdpdGggR3Jh Y2UsIGV4cGxvcmluZyBpdHMgY2FwYWJpbGl0aWVzIGFuZCBsaW1pdGF0aW9ucy4gWW91ciBpbnNp Z2h0cyB3aWxsIHBsYXkgYSBjcnVjaWFsIHJvbGUgaW4gc2hhcGluZyB0aGUgZnV0dXJlIG9mIHRo aXMgbGlicmFyeSA6KQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPkpzX29mX29j YW1sIDUuNS4yPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC01Ij4N CjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tanMt b2Ytb2NhbWwtNS01LTIvMTM1ODEvMiI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1q cy1vZi1vY2FtbC01LTUtMi8xMzU4MS8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmczYmJkZTUxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn M2JiZGU1MSI+SGh1Z28gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmczYmJkZTUxIj4NCjxwPkpzX29mX29jYW1sIDUuNiB3YXMgcmVsZWFzZWQg cmVjZW50bHkgd2l0aCBtYW55IGZpeGVzIHJlbGF0ZWQgdG8gaXRzIGphdmFzY3JpcHQgcGFyc2Vy L3ByaW50ZXIvbWluaWZpZXINCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5GaXJz dCByZWxlYXNlIG9mIG9tYTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWZpcnN0LXJlbGVhc2Utb2Ytb21hLzEzODQ1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLW9tYS8xMzg0NS8xPC9hPiA8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzFiOTgxMGYiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmcxYjk4MTBmIj5GcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFiOTgxMGYiPg0KPHA+SGVs bG8sIDwvcD4NCjxwPkl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxl YXNlIG9mIE9tYS4gVGhpcyBsaWJyYXJ5IG9mZmVycyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUg b3JkZXIgbWFpbnRlbmFuY2UgZGF0YSBzdHJ1Y3R1cmUgZGVzY3JpYmVkIGluDQo8YSBocmVmPSJo dHRwczovL2VyaWtkZW1haW5lLm9yZy9wYXBlcnMvRGlldHpTbGVhdG9yX0VTQTIwMDIvcGFwZXIu cGRmIj50aGlzIHBhcGVyPC9hPi4NCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVy Ij4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPiAgb3BhbSB1cGRhdGUNCiAgb3BhbSBpbnN0 YWxsIG9tYQ0KPC9wcmU+DQo8L2Rpdj4NCjxwPkhlcmUgaXMgaXRzIDxhIGhyZWY9Imh0dHA6Ly9j YW1iaXVtLmlucmlhLmZyL35mcG90dGllci9vbWEvZG9jL29tYS9PbWEvaW5kZXguaHRtbCI+DQpk b2N1bWVudGF0aW9uPC9hPi4gPC9wPg0KPHA+SGFwcHkgaGFja2luZyEgPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjciPk9jYW1sZWFybHliaXJkIGp1c3QgZ290IGFiaWxpdHkgdG8gaW5z cGVjdCBvcGFxdWUvYWJzdHJhY3QgdmFsdWVzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tb2NhbWxlYXJseWJpcmQtanVzdC1nb3QtYWJpbGl0eS10by1pbnNwZWN0 LW9wYXF1ZS1hYnN0cmFjdC12YWx1ZXMvMTM4NTIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW9jYW1sZWFybHliaXJkLWp1c3QtZ290LWFiaWxpdHktdG8taW5zcGVjdC1vcGFx dWUtYWJzdHJhY3QtdmFsdWVzLzEzODUyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2M4YWE5NDciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdjOGFhOTQ3Ij7mloflrofnpaUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmdjOGFhOTQ3Ij4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3Vu Y2UgdGhlIHJlbGVhc2Ugb2Ygb2NhbWxlYXJseWJpcmQuMS4zLjAuIEl0IHNob3VsZCBzb29uIGJl IGFibGUgYXZhaWxhYmxlIGluIG9wYW0uDQo8L3A+DQo8cD5BIGJpZyBmZWF0dXJlIGp1c3QgbGFu ZGVkLiBZb3UgY2FuIGluc3BlY3Qgb3BhcXVlL2Fic3RyYWN0IHZhbHVlcyBzaW5jZSB2ZXJzaW9u IDEuMy4wLg0KPC9wPg0KPHA+c2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9oYWNrd2Fs eS9vY2FtbGVhcmx5YmlyZC9wdWxsLzUzIj5odHRwczovL2dpdGh1Yi5jb20vaGFja3dhbHkvb2Nh bWxlYXJseWJpcmQvcHVsbC81MzwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4 Ij5WYWxpZGF0ZSAtIEEgTmV3IExpYnJhcnkgZm9yIERhdGEgVmFsaWRhdGlvbjwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXZhbGlkYXRlLWEtbmV3LWxpYnJhcnkt Zm9yLWRhdGEtdmFsaWRhdGlvbi8xMzg2MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tdmFsaWRhdGUtYS1uZXctbGlicmFyeS1mb3ItZGF0YS12YWxpZGF0aW9uLzEzODYxLzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2JlZTZmODUi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiZWU2Zjg1Ij5NYXRldXN6IExlZHdvxYQg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdi ZWU2Zjg1Ij4NCjxwPkhlbGxvISA8L3A+DQo8cD5J4oCZbSBleGNpdGVkIHRvIGFubm91bmNlIHRo ZSBwcmV2aWV3IHJlbGVhc2Ugb2YgYSBuZXcgbGlicmFyeSBjYWxsZWQgPGNvZGU+dmFsaWRhdGU8 L2NvZGU+ISBUaGlzIGxpYnJhcnkgYWltcyB0byBtYWtlIHRoZSBwcm9jZXNzIG9mIHZhbGlkYXRp bmcgcmVjb3JkcywgbGlzdHMsIG9yIGluZGl2aWR1YWwgdmFsdWVzIG1vcmUgc3RyZWFtbGluZWQg YW5kIGVmZmljaWVudC4NCjwvcD4NCjxwPjxjb2RlPnZhbGlkYXRlPC9jb2RlPiBvcGVyYXRlcyB0 aHJvdWdoIGEgUFBYIGRlcml2ZXIgdGhhdCBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlcyB2YWxpZGF0 b3JzIHVzaW5nIGFubm90YXRpb25zLiBJdCBjb21lcyB3aXRoIGFuIGFycmF5IG9mIGhlbHBlciB2 YWxpZGF0aW9uIGZ1bmN0aW9ucyBmb3IgZGlmZmVyZW50IGRhdGEgdHlwZXMsIG1ha2luZyBpdCB2 ZXJzYXRpbGUgYW5kIGVhc3kgdG8gaW50ZWdyYXRlIGludG8geW91ciBwcm9qZWN0cy4NCjwvcD4N CjxwPjxiPkV4YW1wbGUgVXNhZ2U8L2I+OiA8L3A+DQo8cD5JbWFnaW5lIHlvdSBoYXZlIGEgcmVj b3JkIHR5cGUgd2l0aCB2YXJpb3VzIGZpZWxkcyB0aGF0IG5lZWQgdmFsaWRhdGlvbi4gV2l0aCA8 Y29kZT4NCnZhbGlkYXRlPC9jb2RlPiwgeW91IGNhbiBlYXNpbHkgYW5ub3RhdGUgdGhlc2UgZmll bGRzIGFuZCB0aGUgbGlicmFyeSB3aWxsIGhhbmRsZSB0aGUgcmVzdC4gRm9yIGV4YW1wbGU6DQo8 L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3Jj LW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ dHlwZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+bXlfcmVjb3JkPC9zcGFu PiA9IHsNCiAgbWluIDogc3RyaW5nOyA8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQG1p bl9sZW5ndGggPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjI8L3NwYW4+PHNw YW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+XTwvc3Bhbj4NCiAgZW1haWwgOiBzdHJpbmc7IDxz cGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAZW1haWxdPC9zcGFuPg0KICB1dWlkIDogc3Ry aW5nOyA8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQHV1aWRdPC9zcGFuPg0KICB1cmwg OiBzdHJpbmc7IDxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAdXJsXTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BtYXhfbGVuZ3RoIDwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij4yMDA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRm OyI+XTwvc3Bhbj4NCiAgbnVtZXJpY19saXN0IDogaW50IGxpc3Q7IDxzcGFuIHN0eWxlPSJjb2xv cjogI2EyNjA0ZjsiPltAbGlzdF9taW5fbGVuZ3RoIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij4yPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPl08L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAbGVzc190aGFuIDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4xMDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYw NGY7Ij5dPC9zcGFuPg0KICBvdGhlcl9yZWNvcmQ6IG90aGVyOyA8c3BhbiBzdHlsZT0iY29sb3I6 ICNhMjYwNGY7Ij5bQGRpdmVdPC9zcGFuPg0KfSA8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7 Ij5bQEBkZXJpdmluZyB2YWxpZGF0ZV08L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhpcyB3 aWxsIGF1dG9tYXRpY2FsbHkgY3JlYXRlIGEgPGNvZGU+dmFsaWRhdGVfbXlfcmVjb3JkPC9jb2Rl PiBmdW5jdGlvbiwgYXBwbHlpbmcgdGhlIHNwZWNpZmllZCB2YWxpZGF0aW9ucyB0byBlYWNoIGZp ZWxkLg0KPC9wPg0KPHA+PGI+SW5zdGFsbGF0aW9uPC9iPjogWW91IGNhbiBpbnN0YWxsIDxjb2Rl PnZhbGlkYXRlPC9jb2RlPiB1c2luZyBPUEFNOiA8L3A+DQo8cD5Db3B5IGNvZGUgPC9wPg0KPHBy ZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzBkYTg2NmIiPg0Kb3BhbSBpbnN0YWxsIHZhbGlkYXRl DQo8L3ByZT4NCjxwPkkgZW5jb3VyYWdlIHlvdSB0byB0cnkgaXQgb3V0LCBhbmQgeW91ciBmZWVk YmFjayBhbmQgY29udHJpYnV0aW9ucyBhcmUgaW52YWx1YWJsZSBhdCB0aGlzIHN0YWdlLg0KPC9w Pg0KPHA+Rm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHZpc2l0IEdpdEh1YiA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vQXhvdDAxNy92YWxpZGF0ZSUyMCI+DQpyZXBvc2l0b3J5PC9hPiBhbmQg Y2hlY2sgb3V0IHRoZSA8YSBocmVmPSJodHRwczovL2F4b3QwMTcuZ2l0aHViLmlvL3ZhbGlkYXRl LyI+ZG9jdW1lbnRhdGlvbjwvYT4uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+ ZHVuZS4zLjEyLjE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTki Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1k dW5lLTMtMTItMS8xMzUzNi8yIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUt My0xMi0xLzEzNTM2LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZ2U4ZTA4NzgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlOGUwODc4Ij5F dGllbm5lIE1pbGxvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2U4ZTA4NzgiPg0KPHA+V2UganVzdCByZWxlYXNlZCB2ZXJzaW9uIDMuMTIu MiB3aXRoIDIgYnVnZml4ZXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaXggdmVy c2lvbiBjaGVjayBpbiA8Y29kZT5ydW50ZXN0X2FsaWFzPC9jb2RlPiBmb3IgPGNvZGU+Y3JhbTwv Y29kZT4gc3RhbnphICgjOTQ1NCwgQGVtaWxsb24pDQo8L2xpPjxsaT5GaXggc3RhY2sgb3ZlcmZs b3cgd2hlbiBhIDxjb2RlPihydW4pPC9jb2RlPiBhY3Rpb24gY2FuIG5vdCBiZSBwYXJzZWQuICgj OTUzMCwgZml4ZXMgIzk1MjksIEBncmlkYnVncykNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMTAiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2M1NzliYzAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdjNTc5YmMwIj5Gcm9t IHRoZSBvY2FtbC5vcmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnYzU3OWJjMCI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxv Z3MgYWdncmVnYXRlZCBhdCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUg b2NhbWwub3JnIGJsb2c8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJl Zj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDEtMTAtbWVldC1vZG9jLW9jYW1sLXMt ZG9jdW1lbnRhdGlvbi1nZW5lcmF0b3IiPk1lZXQgb2RvYywgT0NhbWzigJlzIERvY3VtZW50YXRp b24gR2VuZXJhdG9yPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODFjNTE0YiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9Im9yZzgxYzUxNGIiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LW9yZzgxYzUxNGIiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmci Pg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdv IHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3du LyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+ DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5 b3UgbWF5IHN1YnNjcmliZSB0byB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9z eW1wYS9pbmZvL2NhbWwtbGlzdCI+DQpjYW1sLWxpc3Q8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJh dXRob3JuYW1lIiBpZD0ib3JnOTQ0NDk5MSI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 9 Jan 2024 13:41:12 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 9 Jan 2024 13:41:12 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 9 Jan 2024 13:41:12 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 409DfUhe012295 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 9 Jan 2024 13:41:30 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 409DfK3O012281 for ; Tue, 9 Jan 2024 13:41:20 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Jan 2024 14:41:19 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1916AE004E; Tue, 9 Jan 2024 14:41:19 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6AC8BE0CCA for ; Tue, 9 Jan 2024 14:41:12 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jan 2024 14:41:11 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8BA655605B7; Tue, 9 Jan 2024 14:41:01 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaQwGC+swRX+jDAkWiYlo56X5GfQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 9 Jan 2024 13:40:46 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: b5e291e0-201a-45ba-e062-08dc1118a50d X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,183,1695679200"; d="scan'208,217";a="145643099" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=D85755605B8 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <090F40BAAE5FD542812F6C68A8B7CA9B@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMS0wOSBUdWUgMTQ6MzkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDEuMDIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMS4xNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMDIgdG8gMDksIDIwMjQuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+T2RvYyBtb2R1bGUgaW5kZXggYm9v a21hcmtsZXQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5jcmVhdGUtbWVsYW5nZS1hcHAgMS4w LjAgLSBBIENMSSBmb3IgcXVpY2tseSBiZWNvbWluZyBwcm9kdWN0aXZlIHdpdGggTWVsYW5nZTwv YT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMzIj5XaGF04oCZcyBwb3NzaWJsZSB3aXRoIE1lbGFuZ2U8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5PY2FtbC10cy1tb2RlIC0gRW1hY3Mgb2NhbWwgbWFq b3IgbW9kZSB1c2luZyB0cmVlIHNpdHRlcjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPlVzaW5n IE1lbmhpciB0byBwYXJzZSBpbnRvIGlkaW9tYXRpYyBKUyAoVHlwZVNjcmlwdCkgc3RydWN0dXJl czwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5QbGF5IHdpdGggcHJvamVjdC13aWRlIG9jY3Vy cmVuY2VzIGZvciBPQ2FtbCE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5OZXcgcmVsZWFzZSBv ZiBNZW5oaXIgKDIwMjMxMjMxKTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPk9jc2lnZW46IHN1 bW1hcnkgb2YgcmVjZW50IHJlbGVhc2VzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+c2FyaWYg MC4xLjAgLSBTdGF0aWMgQW5hbHlzaXMgUmVzdWx0cyBJbnRlcmNoYW5nZSBGb3JtYXQgKFNBUklG KSBGb3IgT0NhbWw8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjMTAiPk90aGVyIE9DYW1sIE5ld3M8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmdhNTk5M2ExIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPk9kb2MgbW9kdWxlIGluZGV4IGJvb2ttYXJrbGV0PC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vZG9jLW1vZHVsZS1pbmRleC1ib29r bWFya2xldC8xMzc4MC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vZG9jLW1vZHVs ZS1pbmRleC1ib29rbWFya2xldC8xMzc4MC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzdkYzM4MzYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmc3ZGMzODM2Ij5ZYXdhciBBbWluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnN2RjMzgzNiI+DQo8cD5IZWxsbywgSSBtYWRlIGEgPGEgaHJl Zj0iaHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2Jvb2ttYXJrbGV0cy8jaDItb2RvYy1pZHgi Pg0KYm9va21hcmtsZXQ8L2E+IHRoYXQgaW5qZWN0cyBhbiBpbmRleCBvZiBhIG1vZHVsZeKAmXMg Y29udGVudHMgaW50byB0aGUgc2lkZWJhciBvZiBhbg0KPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ b2RvYy1nZW5lcmF0ZWQgbW9kdWxlIGRvY3VtZW50YXRpb248L3NwYW4+IHBhZ2UuIEZvciBleGFt cGxlLCBpZiB5b3UgZ28gdG8NCjxhIGhyZWY9Imh0dHBzOi8vYWFudHJvbi5naXRodWIuaW8vZHJl YW0vIj5odHRwczovL2FhbnRyb24uZ2l0aHViLmlvL2RyZWFtLzwvYT4gLCBhbmQgcnVuIHRoZSBi b29rbWFya2xldCwgeW91IHdpbGwgc2VlOg0KPC9wPg0KPGRpdiBpZD0ib3JnM2Q1MjUzZiIgY2xh c3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5j b20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2IvYjhmZjI4NzVhNjllMTZk ZjcwNzcyZmU3NmUwNGY4YmFkMzM0YmM1ZF8yXzEzODB4NjI0LnBuZyIgYWx0PSJiOGZmMjg3NWE2 OWUxNmRmNzA3NzJmZTc2ZTA0ZjhiYWQzMzRiYzVkXzJfMTM4MHg2MjQucG5nIj4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt MiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPmNyZWF0ZS1tZWxhbmdlLWFwcCAxLjAu MCAtIEEgQ0xJIGZvciBxdWlja2x5IGJlY29taW5nIHByb2R1Y3RpdmUgd2l0aCBNZWxhbmdlPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3JlYXRlLW1lbGFuZ2Ut YXBwLTEtMC0wLWEtY2xpLWZvci1xdWlja2x5LWJlY29taW5nLXByb2R1Y3RpdmUtd2l0aC1tZWxh bmdlLzEzNzk0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jcmVhdGUtbWVs YW5nZS1hcHAtMS0wLTAtYS1jbGktZm9yLXF1aWNrbHktYmVjb21pbmctcHJvZHVjdGl2ZS13aXRo LW1lbGFuZ2UvMTM3OTQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnOWU0Y2MyZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzllNGNjMmYi PkRpbGxvbiBNdWxyb3kgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc5ZTRjYzJmIj4NCjxwPkhlbGxvIHnigJlhbGwg8J+RiyA8L3A+DQo8cD5J IGhhdmUgYmVlbiB3b3JraW5nIG9uIGNyZWF0aW5nIGEgc2NhZmZvbGRpbmcgdG9vbCBhaW1lZCBh dCBlbmFibGluZyBKYXZhU2NyaXB0IGFuZCBUeXBlU2NyaXB0IGRldmVsb3BlcnMgdG8gcXVpY2ts eSBiZWNvbWUgZmFtaWxpYXIgYW5kIHByb2R1Y3RpdmUgd2l0aCBPQ2FtbCwgUmVhc29uTUwsIGFu ZCBNZWxhbmdlLiBUaGUgZGV2ZWxvcGVyIGV4cGVyaWVuY2UsIHRvb2xpbmcsIGFuZCBwcm9qZWN0 IHNldHVwIGlzIG9waW5pb25hdGVkIGFuZA0KIG1lYW50IHRvIGJlIGZhbWlsaWFyIGFuZCBmcmll bmRseSBmb3IgZm9sa3MgY29taW5nIGZyb20gdGhhdCBlY29zeXN0ZW0uIDwvcD4NCjxwPlNvLCB3 aXRob3V0IGZ1cnRoZXIgYWRvLCBJ4oCZbSBleGNpdGVkIHRvIGFubm91bmNlIGNyZWF0ZS1tZWxh bmdlLWFwcCwgMS4wLjAhIDwvcD4NCjxwPkdldCBzdGFydGVkIGJ5IHNpbXBseSBydW5uaW5nIDxj b2RlPm5wbSBjcmVhdGUgbWVsYW5nZS1hcHBAbGF0ZXN0PC9jb2RlPiBhbmQgY29tcGxldGluZyB0 aGUgcXVlc3Rpb25zIHRoYXQgdGhlIENMSSB3aWxsIGd1aWRlIHlvdSB0aHJvdWdoLg0KPC9wPg0K PHA+UHJvamVjdCBzZXR1cDogPC9wPg0KPGRpdiBpZD0ib3JnMWNmNjg3MCIgY2xhc3M9ImZpZ3Vy ZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5l c3M3L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2YvZjkzM2RkYmRkN2YxYTg0NzFmODJkNThk ZWQ3NzRlZWVmZmM5ODgwMF8yXzkwMHg5MzIuanBlZyIgYWx0PSJmOTMzZGRiZGQ3ZjFhODQ3MWY4 MmQ1OGRlZDc3NGVlZWZmYzk4ODAwXzJfOTAweDkzMi5qcGVnIj4NCjwvcD4NCjwvZGl2Pg0KPHA+ U2NhZmZvbGRpbmc6IDwvcD4NCjxkaXYgaWQ9Im9yZ2E4MTlkMTUiIGNsYXNzPSJmaWd1cmUiPg0K PHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91 cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC9jL2M4MmY3MWQ4NDU1ZWZiNmQ0ZTJkZTgyNzVmN2Fl Y2JhNzI3ODAyOTRfMl85MDB4NTY0LmpwZWciIGFsdD0iYzgyZjcxZDg0NTVlZmI2ZDRlMmRlODI3 NWY3YWVjYmE3Mjc4MDI5NF8yXzkwMHg1NjQuanBlZyI+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im9yZ2ZjNTgxZmIiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFs LmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC85 LzkyOWYzNzNiZWU4Mzg0ZDUwZDAxNzIwMGY3M2MzNTRlNjFlZjkxNmNfMl85MDB4NTM0LmpwZWci IGFsdD0iOTI5ZjM3M2JlZTgzODRkNTBkMDE3MjAwZjczYzM1NGU2MWVmOTE2Y18yXzkwMHg1MzQu anBlZyI+DQo8L3A+DQo8L2Rpdj4NCjxwPuKcqFlvdXIgbmV3IE1lbGFuZ2UgYXBwIOKcqCA8L3A+ DQo8ZGl2IGlkPSJvcmcxZDE3OWU0IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRw czovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRp bWl6ZWQvMlgvZS9lYjA5ODczMDJkOTlkZmRiMGFlODdiZjFiZjM3MTg1NmZlMjc2MjRkXzJfOTAw eDU3Ni5qcGVnIiBhbHQ9ImViMDk4NzMwMmQ5OWRmZGIwYWU4N2JmMWJmMzcxODU2ZmUyNzYyNGRf Ml85MDB4NTc2LmpwZWciPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvcmc3MDgzNGNjIiBjbGFz cz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNv bS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvNi82YjNhOTQ1ZDYzYzM2NjRh NzkyODk0MzY2ZThlYWQ3ODZlZjZiNzIzXzJfOTAweDc5Mi5qcGVnIiBhbHQ9IjZiM2E5NDVkNjNj MzY2NGE3OTI4OTQzNjZlOGVhZDc4NmVmNmI3MjNfMl85MDB4NzkyLmpwZWciPg0KPC9wPg0KPC9k aXY+DQo8cD5Zb3UgY2FuIGZpbmQgdGhlIGNvZGUvcHJvamVjdGVkIGdlbmVyYXRlZCBpbiB0aGlz IGV4YW1wbGUgaGVyZTogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RtbXVscm95L2NyZWF0 ZS1tZWxhbmdlLWFwcC1leGFtcGxlIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9kbW11bHJveS9jcmVh dGUtbWVsYW5nZS1hcHAtZXhhbXBsZTwvYT4gPC9wPg0KPHA+SeKAmXZlIHRyaWVkIHRvIHRha2Ug Z3JlYXQgY2FyZSB0byBwcm92aWRlIGFzIG11Y2ggaGVscGZ1bCBpbmZvcm1hdGlvbiBmb3IgZGV2 ZWxvcGVycyB1bmZhbWlsaWFyIHdpdGggb3VyIGVjb3N5c3RlbSBhcyBwb3NzaWJsZS4gWW914oCZ bGwgZmluZCBtYW55IG9mIHRoZSBzY2FmZm9sZGVkIGZpbGVzIGNvbW1lbnRlZCB3aXRoIGV4cGxh bmF0aW9ucywgZXhhbXBsZXMsIGFuZCBhZGRpdGlvbmFsIHJlc291cmNlcyBhaW1lZCBhdCBxdWlj a2x5IGJlY29taW5nDQogcHJvZHVjdGl2ZSB3aXRoIE9DYW1sLCBSZWFzb25NTCwgYW5kIE1lbGFu Z2UuIDwvcD4NCjxwPjxiPkxvb2tpbmcgZm9yd2FyZCDwn5GAPC9iPiA8L3A+DQo8cD5JIGhhdmUg YSBsb3Qgb2YgaWRlYXMgYXJvdW5kIG1ha2luZyBiaW5kaW5ncyBlYXNpZXIgYW5kIG1vcmUgcGxl YXNhbnQgdG8gd3JpdGUgZm9yIG1hbmFnZSwgYWxvbmcgd2l0aCBzb21lIGRlbGlnaHRmdWwgd2F5 cyB0byBpbnRlZ3JhdGUgdGhlbSBpbnRvIENNQS4NCjwvcD4NCjxwPkJ1dCBmaXJzdOKApiA8L3A+ DQo8cD5XZeKAmXJlIHJld3JpdGluZyB0byBuYXRpdmUgT0NhbWwgdXNpbmcgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21pbnR0ZWEiPg0KTWludFRlYTwvYT4hIEN1cnJlbnRs eSA8Y29kZT5jcmVhdGUtbWVsYW5nZS1hcHA8L2NvZGU+IGlzIHdyaXR0ZW4gdXNpbmcgTWVsYW5n ZSBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92YWRpbWRlbWVkZXMvaW5rIj5Jbms8 L2E+LCBhIGxpYnJhcnkgZm9yIHJlbmRlcmluZyBSZWFjdCBjb21wb25lbnRzIHRvbyB0aGUgdGVy bWluYWwuDQo8L3A+DQo8cD5XaGVuIEkgc3RhcnRlZCBDTUEsIE9DYW1sIGRpZG7igJl0IGhhdmUg YSBncmVhdCBUVUkgc3RvcnkgZm9yIGVhc2lseSBtYWtpbmcgZGVsaWdodGZ1bCBleHBlcmllbmNl cyAocGx1cyBJIHdhbnRlZCBhbiBleGN1c2UgdG8gZ28gZGVlcGVyIHdpdGggTWVsYW5nZSwgYW5k IGRvZXNu4oCZdCBhIENMSSB3cml0dGVuIHdpdGggT0NhbWwgYW5kIFJlYWN0IHNvdW5kIHJpZGlj dWxvdXM/IPCfmIIpDQo8L3A+DQo8cD5JIHdvdWxkIGxvdmUgZm9yIENNQSBpdHNlbGYgdG8gYmUg YSBncmVhdCBPU1MgcHJvamVjdCBmb3IgYmVnaW5uZXJzIHdpdGggT0NhbWwgdG8gZ2V0IGludm9s dmVkIHdpdGggYW5kIGxlYXJuIHdpdGggYW5kIEnigJltIGFpbWluZyB0byBicmluZyBhcyBtYW55 IHBlb3BsZSBhbG9uZyBmb3IgdGhhdCByaWRlIGFzIEkgY2FuIDopDQo8L3A+DQo8cD5Zb3UgY2Fu IGZvbGxvdyBteSBkZXZlbG9wbWVudCBvZiBDTUEgb24gPGEgaHJlZj0iaHR0cHM6Ly90d2l0Y2gu dHYvZG1tdWxyb3kiPm15IHR3aXRjaCBjaGFubmVsPC9hPiB3aGVyZSBJIGxpdmUgc3RyZWFtIE9D YW1sIGNvbnRlbnQgZXZlcnkgTS1GIDdhbSAtIDEwYW0gRVQNCjwvcD4NCjxwPlRoYW5rcyB54oCZ YWxsISDwn5CrIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5XaGF04oCZcyBwb3Nz aWJsZSB3aXRoIE1lbGFuZ2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3doYXRzLXBvc3NpYmxlLXdpdGgtbWVsYW5nZS8xMzgwNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC93aGF0cy1wb3NzaWJsZS13aXRoLW1lbGFuZ2UvMTM4MDYvMTwvYT4gPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3Nzg5ZDU1IiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnNzc4OWQ1NSI+RGF2aWQgU2FuY2hvIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNzc4OWQ1NSI+DQo8cD5I aSA8L3A+DQo8cD5TaW5jZSBkdW5lIGdvdCB0aGUgaW50ZWdyYXRpb24gd2l0aCBNZWxhbmdlIChh bmQgQWhyZWZzIG1pZ3JhdGVkIHRvIE1lbGFuZ2UgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2FocmVmcy1pcy1ub3ctYnVpbHQtd2l0aC1tZWxhbmdlLzEyMTA3Ij4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9haHJlZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS8x MjEwNzwvYT4pIEkgd2FudGVkIHRvIHdyaXRlIGFib3V0IHRoZSBiZW5lZml0cyBvZiB1c2luZyBp dC4NCjwvcD4NCjxwPkkgd3JvdGUgYSBibG9nIHBvc3QgY29tcGFyaW5nIE1lbGFuZ2Ugd2l0aCB0 aGUgcHJldmlvdXMgY29tcGlsZXIgKEJ1Y2tsZVNjcmlwdC9SZVNjcmlwdCkgYW5kIHdoYXTigJlz IHBvc3NpYmxlLiBJIHRyaWVkIHRvIGJlIG9iamV0aXZlIGFuZCBmb2N1cyBvbmx5IG9uIHRoZSB0 ZWNobmljYWwgcGFydHMgb2YgaXQuDQo8L3A+DQo8cD5UaGUgbGluayB0byB0aGUgcG9zdCBpczog PGEgaHJlZj0iaHR0cHM6Ly9zYW5jaG8uZGV2L2Jsb2cvd2hhdHMtcG9zc2libGUtd2l0aC1tZWxh bmdlIj4NCmh0dHBzOi8vc2FuY2hvLmRldi9ibG9nL3doYXRzLXBvc3NpYmxlLXdpdGgtbWVsYW5n ZTwvYT4gPC9wPg0KPHA+SG9wZSB5b3UgbGlrZSBpdCwgYW5kIGZlZWwgZnJlZSB0byBhc2sgYW55 dGhpbmchIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5PY2FtbC10cy1tb2RlIC0g RW1hY3Mgb2NhbWwgbWFqb3IgbW9kZSB1c2luZyB0cmVlIHNpdHRlcjwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtdHMtbW9kZS1lbWFjcy1vY2FtbC1tYWpvci1t b2RlLXVzaW5nLXRyZWUtc2l0dGVyLzEzODA3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXRzLW1vZGUtZW1hY3Mtb2NhbWwtbWFqb3ItbW9kZS11c2luZy10cmVlLXNpdHRl ci8xMzgwNy8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc0YzAwZDY0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNGMwMGQ2NCI+TWFsY29s bSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzRjMDBkNjQiPg0KPHA+VGhpcyB3ZWVrZW5kIEkgZ290IGludGVyZXN0ZWQgaW4gZW1hY3MgbWFq b3IgbW9kZXMgYmFzZWQgb24gdHJlZXNpdHRlciwgc28gSSBkZWNpZGVkIHRvIGltcGxlbWVudA0K PGNvZGU+b2NhbWwtdHMtbW9kZTwvY29kZT4uIFRoZSBjb2RlIGNhbiBiZSBmb3VuZCBoZXJlOiA8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGVycmF0ZWFtaW8vb2NhbWwtdHMt bW9kZSI+aHR0cHM6Ly9naXRodWIuY29tL3RlcnJhdGVhbWlvL29jYW1sLXRzLW1vZGU8L2E+DQo8 L3A+DQo8cD5JdCB3YXMgYWN0dWFsbHkgdmVyeSBlYXN5IHRoYW5rcyB0byB0aGUgaGFyZCB3b3Jr IG90aGVycyBoYXZlIGRvbmUgaW4gY3JlYXRpbmcgdGhlIHRyZWVzaXR0ZXIgZ3JhbW1hci4NCjwv cD4NCjxwPkl0IHN1cHBvcnRzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+U3ludGF4 IGhpZ2hsaWdodGluZyBvZiA8Y29kZT4ubWw8L2NvZGU+IGFuZCA8Y29kZT4ubWxpPC9jb2RlPiBm aWxlcy4gPC9saT48bGk+SW5pdGlhbCBpbmRlbnRhdGlvbiBzdXBwb3J0ICh0aGlzIGlzIHByb2Jh Ymx5IGN1cnJlbnRseSBicm9rZW4gaW4gbXVsdGlwbGUgcGxhY2VzKQ0KPC9saT48bGk+PGNvZGU+ Qy1jIEMtYTwvY29kZT4gLSBTd2l0Y2ggYmV0d2VlbiA8Y29kZT4ubWw8L2NvZGU+IGFuZCA8Y29k ZT4ubWxpPC9jb2RlPiBmaWxlcyBmb3IgYSBtb2R1bGUuDQo8L2xpPjwvdWw+DQo8cD5UaGlzIGlz IGxlc3MgZmVhdHVyZSByaWNoIHRoYW4gVHVhcmVnIG1vZGUsIHNvIEkgZG9u4oCZdCBrbm93IGlm IGl0IHJlcGxhY2VzIGl0LiBJZiBhbnl0aGluZywgbWF5YmUgaXQgY291bGQgYmUgaW50ZWdyYXRl ZCBpbnRvIHR1YXJlZyBtb2RlLg0KPC9wPg0KPHA+SSBoYXZlIG5vIGV4cGVyaWVuY2Ugd3JpdGlu ZyBlbGlzcCBzbyB0aGlzIHByb2JhYmx5IGhhcyBvYnZpb3VzIG1pc3Rha2VzLiBDb250cmlidXRp b25zIHdlbGNvbWUhDQo8L3A+DQo8cD5FbmpveSEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzczYjAyYmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc3M2IwMmJjIj5NYWxjb2xtIHRoZW4gYWRkZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzczYjAyYmMiPg0KPHA+V2hvb3BzLCBpbiBteSBleGNp dGVtZW50IGxlYXJuaW5nIGFib3V0IHRyZWVzaXR0ZXIgSSBkaWRu4oCZdCBub3RpY2UgdGhhdCB0 aGVyZSBhbHJlYWR5IGlzIGFuIG9jYW1sLXRzLW1vZGUuIFRoYXQgb25lIGlzIHByb2JhYmx5IHRo ZSBwcmVmZXJyZWQgb25lIHRvIHVzZS4gSeKAmWxsIHByb2JhYmx5IGRpcmVjdCBhbnkgb2YgbXkg ZGV2ZWxvcG1lbnQgdG93YXJkcyBpdC4gQnV0IGxlYXJuaW5nIGhvdyB0byBtYWtlIGEgbWFqb3Ig bW9kZSB3YXMgYSBmdW4NCiBleHBlcmllbmNlLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iNSI+VXNpbmcgTWVuaGlyIHRvIHBhcnNlIGludG8gaWRpb21hdGljIEpTIChUeXBlU2NyaXB0 KSBzdHJ1Y3R1cmVzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC01 Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91c2lu Zy1tZW5oaXItdG8tcGFyc2UtaW50by1pZGlvbWF0aWMtanMtdHlwZXNjcmlwdC1zdHJ1Y3R1cmVz LzEzODA5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3VzaW5nLW1lbmhpci10by1w YXJzZS1pbnRvLWlkaW9tYXRpYy1qcy10eXBlc2NyaXB0LXN0cnVjdHVyZXMvMTM4MDkvMTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjE1ZGM4MSIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2IxNWRjODEiPlNob24gYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiMTVkYzgxIj4NCjxwPkhl bGxvIGFuZCBIYXBweSBOZXcgWWVhciEgPC9wPg0KPHA+QXMgd2UgYWxsIGtub3csIGRlc3BpdGUg YmVpbmcgbmFtZWQgYW4gPGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2Ft bCI+DQpPYmplY3RpdmUgQ2F0ZWdvcmljYWwgQWJzdHJhY3QgTWFjaGluZSBMYW5ndWFnZTwvYT4s IE9DYW1sIGlzIE9idmlvdXNseSBhIENvbXBsZXRlbHkgQXdlc29tZSBbTWV0YSBMYW5ndWFnZV0o PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUxfKHByb2dyYW1taW5nX2xh bmd1YWdlKSI+aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTUxfKHByb2dyYW1taW5nX2xh bmd1YWdlKTwvYT4pLiBUaGUgYXdlc29tZW5lc3MgaXMgZm91bmRlZA0KIG9uIHRoZSB3b25kZXJm dWwgbGFuZ3VhZ2UsIGJ1dCBvYnZpb3VzbHkgY29tcGxldGVkIGJ5IHRoZSBleHRyYW9yZGluYXJ5 IGVjb3N5c3RlbSBvZiB0b29scyBhbmQgdGVjaG5pcXVlcyB0aGF0IHRha2UgbGlmZSBpbiB0aGF0 IGxhbmd1YWdlLiA6c3R1Y2tfb3V0X3Rvbmd1ZV93aW5raW5nX2V5ZToNCjwvcD4NCjxwPlRoaXMg aXMgYSBub3RlIHRvIHNoYXJlIGEgc29sdXRpb24gSSBoYWNrZWQgdG9nZXRoZXIgdXNpbmcgYSBo YW5kZnVsIG9mIHRoZXNlIGF3ZXNvbWUgdG9vbHMgaW4gb3VyIGxvdmVseSBsYW5ndWFnZSwgYnV0 IGFsc28gYSByZXF1ZXN0IGZvciBhbnkgc3VnZ2VzdGlvbnMgb24gYSBtb3JlIGVsZWdhbnQgc29s dXRpb24gdG8gdGhlIHByb2JsZW0gcG9zZWQuDQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzU4MGI4ZjkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc1 ODBiOGY5Ij5UaGUgUHJvYmxlbTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9 InRleHQtb3JnNTgwYjhmOSI+DQo8cD5JIHdhbnRlZCB0byB1c2UgTWVuaGlyIGFuZCBTZWRsZXgg dG8gd3JpdGUgYSBmYXVsdC10b2xlcmFudCwgaW5jcmVtZW50YWwgcGFyc2VyIGZvciBhIHByZWV4 aXN0aW5nIHByb2plY3QgdGhhdCBoYXMgYW4gaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uIChJ UiksIGFuZCBhIGJ1bmNoIG9mIG90aGVyIHRvb2xzLCB3cml0dGVuIGluIFR5cGVTY3JpcHQuDQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZjNlODYw MCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2YzZTg2MDAiPk5vbi1zb2x1dGlvbnM8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2YzZTg2MDAiPg0K PHA+VW5mb3J0dW5hdGVseSwgYWNoaWV2aW5nIHRoaXMgb3V0Y29tZSB3YXMgbm90IHF1aXRlIGFz IHNpbXBsZSBhcyBhZGRpbmcgYSA8Y29kZT4NCihtb2RlIGpzKTwvY29kZT4gdG8gZHVuZSB0byBo YXZlIHRoZSBnZW5lcmF0ZWQgcGFyc2VyIGNvbXBpbGVkIGJ5IDxhIGhyZWY9Imh0dHBzOi8vb2Nz aWdlbi5vcmcvanNfb2Zfb2NhbWwvbGF0ZXN0L21hbnVhbC9vdmVydmlldyI+DQpKc19vc19vY2Ft bCAoSnNvbykgPC9hPi4gT2YgY291cnNlLCB0aGF0IDxiPmRvZXM8L2I+IHdvcmsgbGlrZSBhIGNo YXJtLCBhbmQgaWYgd2UgY291bGQganVzdGlmeSByZXdyaXRpbmcgZXZlcnl0aGluZyBpbiBPQ2Ft bCwgd2XigJlkIGJlIGFibGUgdG8gcHJvZHVjZSBKUyBlYXN5IGFzIHBpZS4gQnV0IGZvciBpbnRl cm9wIHdpdGggdGhlIGV4aXN0aW5nIFR5cGVTY3JpcHQgY29kZSB0aGlzIHdvbuKAmXQgZmx5LiBX ZSBuZWVkIHRvIHBhcnNlIGludG8gSlMNCiBvYmplY3RzIHRoYXQgcmVwcmVzZW50IHRoZSBJUiBp biBhIGh1bWFuLXJlYWRhYmxlIHdheSwgaWRlYWxseSBtYXRjaGluZyBvdXIgZXhpc3RpbmcgVHlw ZVNjcmlwdCB0eXBlcywgYnV0IEpzb28gZ2l2ZXMgc29tZXRoaW5nIGxpa2UgdGhpcy4NCjwvcD4N CjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc2NzY0MDUyIj4NCiZndDsgcGFyc2VyLnBhcnNl KCdkZWYgZm9vKGEsYikgPSAxMjMnKQ0KWyAwLCBbIDAsIFsgMCwgW0FycmF5XSwgW0FycmF5XSBd LCAwIF0gXQ0KPC9wcmU+DQo8cD5NeSBuZXh0IHRob3VnaHQgd2FzIHRvIHVzZSBNZWxhbmdlOiBp dCBzZWVtcyB0byBiZSBhIGdyZWF0IHByb2plY3Qgd2l0aCBhIGxvdCBvZiBleGNlbGxlbnQgd29y ayBnb2luZyBpbiB0byBpdCwgYW5kLCBpaXVjLCBpdHMgcHVycG9zZSBpcyBwcmVjaXNlbHkgdG8g Y29tcGlsZSBPQ2FtbCBpbnRvIGlkaW9tYXRpYyhpc2gpIEpTLiBCdXQgSSBoaXQgYSByb2FkIGJs b2NrIHJpZ2h0IGF3YXksIHdoaWNoIGxlZCBtZSB0byBhc2sNCjxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC93aGF0LWFyZS10aGUtbGltaXRzLWFuZC1wcmVyZXF1aXNpdGVzLW9m LXVzaW5nLWRlcGVuZGVuY2llcy13aXRoLW1lbGFuZ2UvMTM2ODgiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3doYXQtYXJlLXRoZS1saW1pdHMtYW5kLXByZXJlcXVpc2l0ZXMtb2YtdXNp bmctZGVwZW5kZW5jaWVzLXdpdGgtbWVsYW5nZS8xMzY4ODwvYT4gYW5kIHRvIHRyeSBzb21ldGhp bmcgZWxzZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdhZDUwM2QxIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYWQ1MDNkMSI+QSBT b2x1dGlvbjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYWQ1 MDNkMSI+DQo8cD5Gb3J0dW5hdGVseSwgdGhlIHdlYWx0aCBvZiBzaGluaW5nIGpld2Vscy1vZi10 b29scyBpbiB0aGUgT0NhbWwgZWNvc3lzdGVtIG1hZGUgdGhpcyBzaG9ydCB3b3JrLiBUaGUgc29s dXRpb24gSSBlbmRlZCB1cCB3aXRoIGlzIGhhY2t5IGFzIGhlY2ssIGJ1dCBpdHMgZG9pbmcgd2hh dCBJIG5lZWRlZDoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JIGRlZmluZSBvdXIg dHlwZXMgdXNpbmcgdGhlIGV4Y2VsbGVudCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWhy ZWZzL2F0ZCI+DQphdGQ8L2E+LiA8L2xpPjxsaT4NCjxwPkkgZ2VuZXJhdGUgT0NhbWwgYW5kIFR5 cGVTY3JpcHQgcmVwcmVzZW50YXRpb25zIG9mIHRoZSB0eXBlcywgYWxvbmcgd2l0aCBKU09OIHNl cmlhbGl6ZXJzLCB2aWEgYSBkdW5lIGNvbmZpZyBsaWtlDQo8L3A+DQo8cHJlIGNsYXNzPSJleGFt cGxlIiBpZD0ib3JnODQ4ODUyMyI+DQoobGlicmFyeQ0KIChwdWJsaWNfbmFtZSBsYW5nX2lyKQ0K IChsaWJyYXJpZXMgYXRkZ2VuKSkNCg0KOzsgVGhlIE9DYW1sIHNlci9kZS1zZXJpYWxpemVycw0K KHJ1bGUNCiAodGFyZ2V0cyBsYW5nX2lyX2oubWwNCiAgICAgICAgICBsYW5nX2lyX2oubWxpKQ0K IChkZXBzICAgIGxhbmdfaXIuYXRkKQ0KIChhY3Rpb24gIChydW4gYXRkZ2VuIC1qIC1qLXN0ZCAl e2RlcHN9KSkpDQoNCjs7IFRoZSBPQ2FtbCB0eXBlcw0KKHJ1bGUNCiAodGFyZ2V0cyBsYW5nX2ly X3QubWwNCiAgICAgICAgICBsYW5nX2lyX3QubWxpKQ0KIChkZXBzICAgIGxhbmdfaXIuYXRkKQ0K IChhY3Rpb24gIChydW4gYXRkZ2VuIC10ICV7ZGVwc30pKSkNCg0KOzsgVGhlIFR5cGVTY3JpcHQg dHlwZXMgYW5kIHNlci9kZQ0KKHJ1bGUNCiAodGFyZ2V0cyBsYW5nX2lyLnRzKQ0KIChkZXBzICAg IGxhbmdfaXIuYXRkKQ0KIChhY3Rpb24gIChydW4gYXRkdHMgJXtkZXBzfSkpKQ0KDQo7OyBDb252 ZXJzaW9uIG9mIHRoZSBUeXBlU2NyaXB0IGludG8gdmFuaWxsYSBKUyBzbyBJIGNhbiB0ZXN0IGl0 IHdpdGggbm9kZQ0KKHJ1bGUNCiAodGFyZ2V0cyBsYW5nX2lyLmpzKQ0KIChkZXBzICAgIGxhbmdf aXIudHMpDQogKGFjdGlvbiAgKHJ1biBucHggdHNjICV7ZGVwc30pKSkNCjwvcHJlPg0KPC9saT48 bGk+SSB1c2UgbWVuaGlyIGFuZCBzZWRsZXggdG8gZGVmaW5lIGEgcGFyc2VyIHRoYXQgcHJvZHVj ZXMgaW5oYWJpdGFudHMgb2YgdGhlIE9DYW1sIHR5cGVzIGdlbmVyYXRlZCBpbg0KPGNvZGU+bGFu Z19pcl90Lm1sPC9jb2RlPi4gKFdvcmtpbmcgb3V0IHRoZSBpbmNyZW1lbnRhbCwgZmF1bHQtdG9s ZXJhbnQgcGFyc2luZyB3YXMgaXRzIG93biBleGhpbGFyYXRpbmcgc2lkZSBxdWVzdCwgYnV0IEni gJlsbCBzYXZlIGEgcmVwb3J0IG9uIHRoYXQgZm9yIGl04oCZcyBvd24gcG9zdC4pDQo8L2xpPjxs aT4NCjxwPlRoZW4gSSB1c2UgSnNvbyB0byBydW4gdGhlIHBhcnNlciBpbiBKUyBhbmQgdGhlbiBz ZXJpYWxpemUgaXRzIG9wdGltaXplZCBidXQgaW5zY3JpdGFibGUgcmVwcmVzZW50YXRpb24gaW50 byB0aGUgSlNPTiBkaWN0YXRlZCBieSBhdGQ6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNv bnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj4gICAgPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkxhbmdfcGFyc2VyX2xpYjwvc3Bhbj4NCg0KICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Kc19vZl9vY2FtbDwvc3Bhbj4NCg0KICAgIDxzcGFu IHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+RXhwb3J0IGZ1 bmN0aW9uczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0 YWxpYzsiPiAqKTwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQt c3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPlNlZSAgaHR0cHM6Ly9vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9s YXRlc3QvbWFudWFsL3Jldi1iaW5kaW5nczwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZm NGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5fPC9zcGFuPiA9DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0 ZmNmOyI+SnMuPC9zcGFuPmV4cG9ydF9hbGwNCiAgICAgICAgKDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vYmplY3Q8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjYTI2MDRmOyI+JWpzPC9zcGFuPg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bWV0aG9kPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICNhNzYwMWY7Ij5wYXJzZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ czwvc3Bhbj4gPQ0KICAgICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ bGV4YnVmPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNlZGxleGluZy5V dGY4Ljwvc3Bhbj5mcm9tX3N0cmluZyBzIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5tYXRjaDwvc3Bhbj4gcGFyc2UgbGV4YnVm IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij53aXRoPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigq IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PnJ1biB0aGUgcGFyc2VyPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1z dHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KICAgICAgICAgICAgfCA8c3BhbiBzdHlsZT0iY29s b3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lPC9zcGFuPiB0IC0m Z3Q7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkxhbmdfaXIuUXVpbnRfaXJfai48L3Nw YW4+c3RyaW5nX29mX3QgdCA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6 IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPnByb2R1Y2UgYSBKU09OIHN0cmluZzwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJj b2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ZnJvbSB0aGUgcmVzdWx0PC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Kik8L3Nw YW4+DQogICAgICAgICAgICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPk5vbmU8L3NwYW4+IC0mZ3Q7IDxzcGFuIHN0eWxlPSJjb2xvcjog I2NhMzQwMDsiPiZxdW90OyZxdW90Ozwvc3Bhbj4NCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmVuZDwvc3Bhbj4pDQo8L3ByZT4NCjwvZGl2 Pg0KPC9saT48bGk+DQo8cD5BbmQsIGZpbmFsbHksIEkgbWFrZSBhIGxpdHRsZSA8Y29kZT53cmFw cGVyLmpzPC9jb2RlPiB0aGF0IGludm9rZXMgdGhlIGF0ZC1nZW5lcmF0ZWQgZGVzZXJpYWxpemVy IHRvIHBhcnNlIGludG8gdGhlIFR5cGVTY3JpcHQgcmVwcmVzZW50YXRpb246DQo8L3A+DQo8ZGl2 IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLWpzIj48c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dmFyPC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5pcjwvc3Bhbj4gPSByZXF1aXJlKDxzcGFuIHN0 eWxlPSJjb2xvcjogI2NhMzQwMDsiPicuL19idWlsZC9kZWZhdWx0L2lyL2xhbmdfaXIuanMnPC9z cGFuPikNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij52 YXI8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnBhcnNlcjwvc3Bhbj4gPSBy ZXF1aXJlKDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPicuL19idWlsZC9kZWZhdWx0L2pz L2xhbmdfcGFyc2VyLmJjLmpzJzwvc3Bhbj4pDQoNCmV4cG9ydHMucGFyc2UgPSA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuY3Rpb248L3NwYW4+ICg8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zPC9zcGFuPikgew0KICA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+cmV0dXJuPC9zcGFuPiBpci5yZWFk VChKU09OLnBhcnNlKHBhcnNlci5wYXJzZShzKSkpDQp9DQo8L3ByZT4NCjwvZGl2Pg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2FjODZm YzEiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhYzg2ZmMxIj5UaGUgcmVzdWx0PC9o ND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdhYzg2ZmMxIj4NCjxw Pkkgbm93IGNhbiB1c2UgdGhlIHdyYXBwZXIgc2NyaXB0IHRvIHBhcnNlIGludG8gdGhlIG5pY2Ug VHlwZVNjcmlwdCAoY29tcGF0aWJsZSkgc3RydWN0dXJlcyBJIG5lZWQ6DQo8L3A+DQo8cHJlIGNs YXNzPSJleGFtcGxlIiBpZD0ib3JnNTU3M2E2YSI+DQpbbWVAY29tcCBtcGFyc2luZ10kIG5vZGUN CiZndDsgdmFyIHAgPSByZXF1aXJlKCcuL3dyYXBwZXIuanMnKQ0KdW5kZWZpbmVkDQomZ3Q7IHAu cGFyc2UoJnF1b3Q7ZGVmIGZvbyhhLGIpID0gMTIzJnF1b3Q7KQ0KWw0Kew0KICAgIGxvYzogeyBz dGFydF86IFtPYmplY3RdLCBlbmRfOiBbT2JqZWN0XSB9LA0KICAgIHY6IHsgbmFtZTogJ2Zvbycs IHBhcmFtczogW0FycmF5XSwgYm9keTogW09iamVjdF0gfQ0KfQ0KXQ0KPC9wcmU+DQo8cD5JIGhh dmUgdGhyZWUgaG9wZXMgZm9yIHRoaXMgcG9zdDogPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0K PGxpPkkgaG9wZSB0byBjb250cmlidXRlIHlldCBhbm90aGVyIG5vdGUgY2VsZWJyYXRpbmcgdGhl IHZpcnR1ZXMgb2Ygb3VyIGV4dHJhb3JkaW5hcnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZWNvc3lz dGVtLg0KPC9saT48bGk+SSBob3BlIGl0IG1pZ2h0IGJlIHVzZWZ1bCBmb3Igb3RoZXJzIHdobyBu ZWVkIHRvIHNvbHZlIHNpbWlsYXIgcHJvYmxlbXMuIDwvbGk+PGxpPkkgaG9wZSB0aGVyZSBpcyBh IG1vcmUgZWxlZ2FudCB3YXkgdG8gYWNoaWV2ZSB0aGlzIHJlc3VsdCAobmFtZWx5LCB3aXRob3V0 IGhhdmluZyB0byBnbyB0aHJvdWdoIHNlcmlhbGl6YXRpb24pIGFuZCB0aGF0IG9uZSBvZiB54oCZ YWxsIGNhbiBwb2ludCB0aGUgd2F5Lg0KPC9saT48L29sPg0KPHA+OmhlYXJ0OiA6Y2FtZWw6IDwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPlBsYXkgd2l0aCBwcm9qZWN0 LXdpZGUgb2NjdXJyZW5jZXMgZm9yIE9DYW1sITwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLXByZXZpZXctcGxheS13aXRoLXByb2plY3Qtd2lkZS1vY2N1cnJlbmNl cy1mb3Itb2NhbWwvMTM4MTQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBy ZXZpZXctcGxheS13aXRoLXByb2plY3Qtd2lkZS1vY2N1cnJlbmNlcy1mb3Itb2NhbWwvMTM4MTQv MTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWM0OTBi MCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2VjNDkwYjAiPnZkcyBhbm5vdW5jZWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2VjNDkwYjAiPg0K PHA+SGkgZmVsbG93IGNhbWVsZXJzIPCfkYssIEkgYW0gdmVyeSBwbGVhc2VkIHRvIGFubm91bmNl IHRoYXQgZXZlcnkgb25lIGNhbiBub3cgdHJ5IHRoZSB1cGNvbWluZyBwcm9qZWN0LXdpZGUgb2Nj dXJyZW5jZXMgZmVhdHVyZSBmb3IgTWVybGluIGFuZCBPQ2FtbC1MU1AuDQo8L3A+DQo8cD5UaGlz IGZlYXR1cmUgaW52b2x2ZXMgY2hhbmdlcyB0byBtdWx0aXBsZSBwYWNrYWdlcyBzdWNoIGFzIDxj b2RlPm9jYW1sPC9jb2RlPiwNCjxjb2RlPm1lcmxpbjwvY29kZT4sIDxjb2RlPm9jYW1sLWxzcDwv Y29kZT4gYW5kIDxjb2RlPmR1bmU8L2NvZGU+IHNvIHdlIGRlY2lkZWQgdG8gcHJlcGFyZSBhIGN1 c3RvbSBvcGFtIHJlcG9zaXRvcnkgdG8gbWFrZSBpdCBlYXN5IGZvciBhZHZlbnR1cm91cyBwZW9w bGUgdG8gaW5zdGFsbCB0aGUgZmVhdHVyZSwgcGxheSB3aXRoIGl0LCBhbmQgbW9zdC1pbXBvcnRh bnRseeKApiBicmVhayBpdCAhIFdlIGhvcGUgeW91IHdpbGwgaGF2ZSBhcyBtdWNoIGZ1bg0KIHF1 ZXJ5aW5nIGFyb3VuZCB5b3VyIGNvZGViYXNlcyBhcyB3ZSBkbyA6LSkgPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNjFmZDdkIiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnMTYxZmQ3ZCI+UmVxdWlyZW1lbnRzIGZvciB0aGlzIHByZXZpZXc6PC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxNjFmZDdkIj4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5IYXZlIHByb2plY3RzIGNvbXBhdGlibGUgd2l0aCA8aT5PQ2Ft bCA0LjE0LjI8L2k+LiA8L2xpPjxsaT5UaGVzZSBwcm9qZWN0cyBidWlsZCB3aXRoIDxpPkR1bmU8 L2k+LiAoVGhlIHRvb2xzIHRoZW1zZWx2ZXMgYXJlIGJ1aWxkLXN5c3RlbSBhZ25vc3RpYywgYnV0 IHRoaXMgcHJldmlldyBvbmx5IGluY2x1ZGUgcnVsZXMgZm9yIER1bmUuKQ0KPC9saT48bGk+WW91 IHVzZSBhbiA8aT5MU1AtYmFzZWQgZWRpdG9yIHBsdWdpbjwvaT4uIChXZSBkbyBwbGFuIHRvIGJy aW5nIGJhc2ljIHN1cHBvcnQgdG8gdGhlIHZhbmlsbGENCjxjb2RlPmVtYWNzPC9jb2RlPiBhbmQg PGNvZGU+dmltPC9jb2RlPiBtb2RlcyBmb3IgTWVybGluLikgPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzkxOWY4YzUiIGNsYXNzPSJvdXRs aW5lLTQiPg0KPGg0IGlkPSJvcmc5MTlmOGM1Ij5XaGF0IHRoZSBmZWF0dXJlIGRvZXPigKY8L2g0 Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzkxOWY4YzUiPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPuKchSBSZXR1cm5zIGV2ZXJ5IDxiPnVzYWdlczwvYj4gb2Yg dHlwZXMsIHZhbHVlcywgY29uc3RydWN0b3JzIGFuZCBsYWJlbHMgaW4gPGNvZGU+DQptbDwvY29k ZT4gYW5kIDxjb2RlPm1saTwvY29kZT4gZmlsZXMgaW4gdGhlIHdvcmtzcGFjZSA8L2xpPjxsaT7i nIUgUmV0dXJucyBkaXJlY3QgdXNhZ2VzIG9mIG1vZHVsZXMgKGxpa2UgPGNvZGU+TTwvY29kZT4g aW4gPGNvZGU+aW5jbHVkZSBNPC9jb2RlPikNCjwvbGk+PGxpPuKchSBDYW4gYmUgY2FsbGVkIG9u IGFueSBzdWNoIHVzYWdlIG9mIGEgdmFsdWUgb3Igb24gaXRzIDxiPmRlZmluaXRpb248L2I+IGl0 c2VsZg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZ2Y0M2FmOWUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdmNDNhZjllIj7i gKZ3aGF0IGlzIGRvZXMgbm90IGRvIHlldDo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZ2Y0M2FmOWUiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPuKdjCBS ZXR1cm4gPGI+ZGVjbGFyYXRpb25zPC9iPiByZWxhdGVkIHRvIHNlYXJjaGVkIHZhbHVlcyBpbiBi b3RoIDxiPm1sPC9iPiBhbmQNCjxiPm1saTwvYj4gZmlsZXMuIFRoaXMgd2lsbCBjb21lIGluIGEg c2Vjb25kIGl0ZXJhdGlvbi4gPC9saT48bGk+4p2MIE9jY3VycmVuY2VzIG9mIG1vZHVsZXMgYXBw ZWFyaW5nIGluIHBhdGhzOiBsaWtlIDxjb2RlPk08L2NvZGU+IGFuZCA8Y29kZT5OPC9jb2RlPiBp bg0KPGNvZGU+TS5OLlA8L2NvZGU+LiBUaGlzIHdpbGwgYWxzbyBhcnJpdmUgbGF0ZXIuIDwvbGk+ PGxpPuKaoO+4jyBSZW5hbWluZyBpcyBleHBlcmltZW50YWwgYW5kIG5vdCBhcyBzbWFydCBhcyBv bmUgd291bGQgZXhwZWN0ICh3aXRoIHJlZ2FyZCB0byBwdW5uaW5nIGFuZCBvdGhlciBzeW50YWN0 aWMgdHJpY2tzKS4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmcxN2VmNDEzIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMTdl ZjQxMyI+4oCmYW5kIGtub3duIGNhdmVhdHM6PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmcxN2VmNDEzIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT7imqDv uI8gSW50ZXJhY3Rpb24gd2l0aCBQUFggbWlnaHQgZ2l2ZSB1bmV4cGVjdGVkIHJlc3VsdHMgZGVw ZW5kaW5nIG9uIHRoZSBzcGVjaWZpY3Mgb2YgdGhlIFBQWC4NCjwvbGk+PGxpPuKaoO+4jyBWYWx1 ZXMgd2hvc2UgZGVmaW5pdGlvbiBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBzdGF0aWNhbGx5IChsaWtl IGl0ZW1zIG9mIGEgZmlyc3QtY2xhc3MgbW9kdWxlKSB3b27igJl0IGJlIHNlYXJjaGVkIHByb2pl Y3Qtd2lkZS4gRm9yIHRoZSBzYW1lIHJlYXNvbiwgd2FsdWVzIGNvbWluZyBmcm9tIGxpYnJhcmll cyB0aGF0IGRvIG5vdCBpbnN0YWxsIHRoZWlyDQo8Y29kZT5jbXQ8L2NvZGU+IGZpbGVzIHdvbuKA mXQgYmUgc2VhcmNoZWQgcHJvamVjdC13aWRlLiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZmQ2OTJjZCIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZ2ZkNjkyY2QiPkRlbW88L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZ2ZkNjkyY2QiPg0KPHA+SW4gdGhlIGZvbGxvd2luZyBkZW1vLCB0aGUg ZmVhdHVyZSBpcyB1c2VkIHRvIHJlbmFtZSBhIHN5bWJvbCBpbiBNZXJsaW4uIFNpbmNlIHRoZSBu YW1lIGFwcGVhcnMgaW4gb25lDQo8Yj5kZWNsYXJhdGlvbjwvYj4sIHRoaXMgbGFzdCBvY2N1cnJl bmNlIHN0aWxsIG5lZWRzIHRvIGJlIHJlcGxhY2VkIGJ5IGhhbmQgZm9yIHRoZSBidWlsZCB0byBz dWNjZWVkOg0KPC9wPg0KPGRpdiBpZD0ib3JnNDgxMWQ3ZCIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48 aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9h ZHMvb2NhbWwvb3JpZ2luYWwvMlgvNS81ZjkzODBmY2M3ZTg0MWM1NGUwMThhMzkwOTQ2ZWFhODAx ZmY0MjQxLmdpZiIgYWx0PSI1ZjkzODBmY2M3ZTg0MWM1NGUwMThhMzkwOTQ2ZWFhODAxZmY0MjQx LmdpZiI+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdkYzE5ZTRlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZGMxOWU0 ZSI+U2V0dXA8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2Rj MTllNGUiPg0KPHA+WW91IGNhbiBmaW5kIGRldGFpbGVkIHNldHVwIGluc3RydWN0aW9uIGluIHRo ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9vcGFtLXJlcG9zaXRvcnktaW5k ZXgiPg0KY3VzdG9tIG9wYW0gcmVwb3NpdG9yeTwvYT4uIEluIHNob3J0OiA8L3A+DQo8b2wgY2xh c3M9Im9yZy1vbCI+DQo8bGk+QWRkIHRoZSByZXBvc2l0b3J5IHRvIHlvdXIgb3BhbSBpbnN0YWxs YXRpb246IDxjb2RlPm9wYW0gcmVwbyBhZGQgaW5kZXggaHR0cHM6Ly9naXRodWIuY29tL3Zvb2Rv b3Mvb3BhbS1yZXBvc2l0b3J5LWluZGV4LmdpdDwvY29kZT4NCjwvbGk+PGxpPkNyZWF0ZSBhIHN3 aXRjaCAoZ2xvYmFsIG9yIGxvY2FsKSB3aXRoIHRoZSA8Y29kZT4mIzQzO2luZGV4PC9jb2RlPiBv Y2FtbCB2YXJpYW50Og0KPGNvZGU+b3BhbSBzd2l0Y2ggY3JlYXRlIC0tcmVwb3NpdG9yaWVzPWRl ZmF1bHQsaW5kZXggNC4xNC4yJiM0MztpbmRleDwvY29kZT4gPC9saT48bGk+SW5zdGFsbCA8Y29k ZT5tZXJsaW48L2NvZGU+LCA8Y29kZT5vY2FtbC1sc3A8L2NvZGU+IGFuZCB0aGUgaW5kZXhlcjog PGNvZGU+b3BhbSBpbnN0YWxsIGluZGV4aW5nLXRvb2xzPC9jb2RlPg0KPC9saT48bGk+QnVpbGQg dGhlIGluZGV4IHdpdGggeW91ciBwcm9qZWN0OiA8Y29kZT5kdW5lIGJ1aWxkIEBvY2FtbC1pbmRl eCBAeW91ci11c3VhbC10YXJnZXQtbWF5YmUtaW5zdGFsbC1vci1hbGwgLS13YXRjaDwvY29kZT4N CjwvbGk+PC9vbD4NCjxwPlJlZmVyZW5jZXMgYW5kIHJlbmFtaW5nIHF1ZXJpZXMgc2hvdWxkIHJl dHVybiByZXN1bHQgb24gdGhlIGVudGlyZSB3b3Jrc3BhY2UuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhODM0Y2JmIiBjbGFzcz0ib3V0bGluZS00 Ij4NCjxoNCBpZD0ib3JnYTgzNGNiZiI+RmVlZGJhY2s8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2E4MzRjYmYiPg0KPHA+UGxlYXNlIGRvIG5vdCBoZXNpdGF0 ZSB0byBzaGFyZSBhbnkgZmVlZGJhY2sgb24gdGhlIGZlYXR1cmUgaGVyZSBvciBieSA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9vcGFtLXJlcG9zaXRvcnktaW5kZXgvaXNzdWVz Ij4NCm9wZW5pbmcgYW4gaXNzdWUgb24gdGhlIHJlcG9zaXRvcnk8L2E+IDpzbGlnaHRseV9zbWls aW5nX2ZhY2U6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPk5ldyBy ZWxlYXNlIG9mIE1lbmhpciAoMjAyMzEyMzEpPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtbWVuaGlyLTIwMjMxMjMxLzEzODE2LzEiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctcmVsZWFzZS1vZi1tZW5oaXItMjAy MzEyMzEvMTM4MTYvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc0NWJiZDcxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNDViYmQ3MSI+RnJh bsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc0NWJiZDcxIj4NCjxwPkl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNl IGEgbmV3IHZlcnNpb24gb2YgTWVuaGlyLCAyMDIzMTIzMS4gSXQgc2hvdWxkIGJlIGF2YWlsYWJs ZSBub3c6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnODliOWNkMSI+DQpvcGFt IHVwZGF0ZQ0Kb3BhbSBpbnN0YWxsIG1lbmhpci4yMDIzMTIzMQ0KPC9wcmU+DQo8cD5UaGUgbWFp biBuZXcgZmVhdHVyZXMgYXJlIGFzIGZvbGxvd3M6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT4NCjxwPlRoZSBuZXcgY29tbWFuZCBsaW5lIHN3aXRjaCA8Y29kZT4tLXVucGFyc2luZzwv Y29kZT4gKHdoaWNoIG11c3QgYmUgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoDQo8Y29kZT4tLXRh YmxlPC9jb2RlPikgY2F1c2VzIE1lbmhpciB0byBnZW5lcmF0ZSBhbiB1bnBhcnNpbmcgQVBJLiBJ biBzaG9ydCwgdW5wYXJzaW5nIGlzIHRoZSBwcm9jZXNzIG9mIHRyYW5zZm9ybWluZyBhYnN0cmFj dCBzeW50YXggdHJlZXMgYmFjayBpbnRvIHRleHQuIFRoZSB1bnBhcnNpbmcgQVBJIGlzIGludGVu ZGVkIHRvIGhlbHAgdXNlcnMgd3JpdGUgY29ycmVjdCB1bnBhcnNlcnMsIGJ1dCBkb2VzIG5vdCBh dXRvbWF0ZSB0aGUgd2hvbGUgcHJvY2Vzcy4NCjwvcD4NCjxwPkZvciBtb3JlIGRldGFpbHMsIHBs ZWFzZSBzZWUgdGhlIHBhcGVyIDxhIGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90 dGllci9wdWJsaXMvcG90dGllci11bnBhcnNpbmctMjAyNC5wZGYiPg0KQ29ycmVjdCwgRmFzdCBM UigxKSBVbnBhcnNpbmc8L2E+LiA8L3A+DQo8cD5UaGUgdW5wYXJzaW5nIEFQSSByZXF1aXJlcyBs aW5raW5nIHdpdGggdGhlIGxpYnJhcnkgPGNvZGU+TWVuaGlyQ1NUPC9jb2RlPiwgYW5kIHJlcXVp cmVzIE9DYW1sIDQuMDguDQo8L3A+DQo8L2xpPjxsaT4NCjxwPkF0dHJpYnV0ZXMgY2FuIG5vdyBi ZSBhdHRhY2hlZCB3aXRoIGEgcHJvZHVjdGlvbi4gKEluIHByZXZpb3VzIHZlcnNpb25zIG9mIE1l bmhpciwgYXR0cmlidXRlcyBjb3VsZCBiZSBhdHRhY2hlZCBvbmx5IHdpdGggYSBzeW1ib2wsIHdp dGggYSBzcGVjaWZpYyBvY2N1cnJlbmNlIG9mIGEgc3ltYm9sIGluIHRoZSByaWdodC1oYW5kIHNp ZGUgb2YgYSBwcm9kdWN0aW9uLCBvciB3aXRoIHRoZSB3aG9sZSBncmFtbWFyLikgVGhpcyBpcyBh Y2hpZXZlZA0KIGJ5IGxldHRpbmcgb25lIG9yIG1vcmUgYXR0cmlidXRlcyBhcHBlYXIgaW1tZWRp YXRlbHkgYWZ0ZXIgdGhlIHNlbWFudGljIGFjdGlvbi4gPC9wPg0KPHA+RHVyaW5nIHRoZSB0d28g Z3JhbW1hciB0cmFuc2Zvcm1hdGlvbiBwaGFzZXMgKGV4cGFuc2lvbiBvZiBwYXJhbWV0ZXJpemVk IG5vbnRlcm1pbmFsIHN5bWJvbHMgYW5kIGVsaW1pbmF0aW9uIG9mDQo8Y29kZT4laW5saW5lPC9j b2RlPiBub250ZXJtaW5hbCBzeW1ib2xzKSwgdGhlIDxjb2RlPltAbmFtZV08L2NvZGU+IGF0dHJp YnV0ZXMgYXR0YWNoZWQgd2l0aCBwcm9kdWN0aW9ucyByZWNlaXZlIHNwZWNpYWwgdHJlYXRtZW50 LCBzbyBhcyB0byBhbGxvdyBlYWNoIHByb2R1Y3Rpb24gdG8gcmVjZWl2ZSBhIHVuaXF1ZSBuYW1l Lg0KPC9wPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPk9jc2lnZW46 IHN1bW1hcnkgb2YgcmVjZW50IHJlbGVhc2VzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9vY3NpZ2VuLXN1bW1hcnktb2YtcmVjZW50LXJlbGVhc2VzLzEzODE3LzEiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jc2lnZW4tc3VtbWFyeS1vZi1yZWNlbnQtcmVs ZWFzZXMvMTM4MTcvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdmYzc1MDQwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZmM3NTA0MCI+Vmlu Y2VudCBCYWxhdCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZ2ZjNzUwNDAiPg0KPHA+V2UgZG8gbm90IGFubm91bmNlIHZlcnkgb2Z0ZW4gb3Vy IHJlbGVhc2VzIG9uIHRoaXMgZm9ydW0uIEhlcmUgaXMgYSByb3VuZHVwIG9mIHJlY2VudCByZWxl YXNlcyB0byBtYWtlIGFtZW5kcy4NCjwvcD4NCjxwPk1hbnkgcmVsZWFzZXMgb2YgPGEgaHJlZj0i aHR0cDovL29jc2lnZW4ub3JnL2pzX29mX29jYW1sIj5Kc19vZl9vY2FtbDwvYT4gbGFzdCB5ZWFy LCB3aXRoIGltcG9ydGFudCBmZWF0dXJlcyBsaWtlIHRoZSBzdXBwb3J0IG9mIE9DYW1sIDUgZWZm ZWN0cywgZ2xvYmFsIGRlYWQtY29kZSBlbGltaW5hdGlvbiwgc3VwcG9ydCBmb3IgbW9kZXJuIEph dmFTY3JpcHQgYW5kDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9qc19vZl9v Y2FtbC9ibG9iL21hc3Rlci9DSEFOR0VTLm1kIj5hIGh1Z2UgbGlzdCBvZiBpbXByb3ZlbWVudHMg YW5kIGZpeGVzPC9hPi4gVGhlcmUgaXMgbm93IGFsc28gYSBuZXcgYmFja2VuZCBmb3IganNfb2Zf b2NhbWwsDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29j YW1sIj5XYXNtX29mX29jYW1sPC9hPiB3cml0dGVuIGJ5IEB2b3VpbGxvbiwgdG8gY29tcGlsZSB0 byBXZWJBc3NlbWJseS4gSXQgY2FuIGJlIHVzZWQgYXMgYSByZXBsYWNlbWVudCBmb3IganNfb2Zf b2NhbWwgd2l0aCB2ZXJ5IGZldyBjaGFuZ2VzLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cDovL29j c2lnZW4ub3JnL2VsaW9tIj5FbGlvbTwvYT4sIHRoZSBPQ2FtbCBXZWIgZnJhbWV3b3JrLCBoYXMg bm93IHJlYWNoZWQgdmVyc2lvbiAxMC4yLiBBbW9uZ3N0IHRoZSBtb3N0IHJlY2VudCBjaGFuZ2Vz Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBEdW5lLWJhc2VkIGJ1aWxkIHN5 c3RlbSBpcyBub3cgdGhlIGRlZmF1bHQgb25lIGZvciBjbGllbnQtc2VydmVyIGFwcHMgPC9saT48 bGk+Y29tcGF0aWJpbGl0eSB3aXRoIE9DYW1sIDUgPC9saT48bGk+UmVhY3RpdmUgcHJvZ3JhbW1p bmc6IFVwZGF0ZSB0byByZWNlbnQgdmVyc2lvbnMgb2YganNfb2Zfb2NhbWwsIHdoaWNoIHN1cHBv cnQgd2VhayBwb2ludGVycw0KPC9saT48bGk+RG9jdW1lbnRhdGlvbiBpbXByb3ZlbWVudHMgPC9s aT48L3VsPg0KPHA+QW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vZWxpb20v cHVsbC83NjciPmV4cGVyaW1lbnRhbCB2ZXJzaW9uPC9hPiBpcyBhbHNvIGF2YWlsYWJsZSB0byBi dWlsZCBXQVNNIGFwcGxpY2F0aW9ucyB3aXRoIHdhc21fb2Zfb2NhbWwNCjwvcD4NCjxwPjxhIGhy ZWY9Imh0dHA6Ly9vY3NpZ2VuLm9yZy9vY3NpZ2VuLXN0YXJ0Ij5PY3NpZ2VuLVN0YXJ0PC9hPiB2 ZXJzaW9uIDYuMSA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+cmVtb3ZlcyBhIGRlcGVu ZGVuY3kgb24gT2NhbWxuZXQgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggT0NhbWwgNS4gTm8g ZGVmYXVsdCBlbWFpbCBmdW5jdGlvbiBpcyBub3cgcHJvdmlkZWQuIFdhcm5pbmc6IHRoaXMgbWln aHQgYmUgYSByZWdyZXNzaW9uIGlmIHlvdSB1c2UgdGhlIGRlZmF1bHQgZW1haWwtc2VuZGluZyBm dW5jdGlvbi4NCjwvbGk+PGxpPnVwZGF0ZXMgdGhlIGR1bmUtYmFzZWQgYnVpbGQgc3lzdGVtIDwv bGk+PC91bD4NCjxwPjxhIGhyZWY9Imh0dHA6Ly9vY3NpZ2VuLm9yZy90eXhtbCI+VHl4bWw8L2E+ IDQuNiB3YXMgcmVsZWFzZWQgd2l0aCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NzaWdl bi90eXhtbC9yZWxlYXNlcyI+DQpmaXhlczwvYT4gb24gc29tZSB0YWdzIGFuZCBvcHRpb25zLiA8 L3A+DQo8cD48YSBocmVmPSJodHRwOi8vb2NzaWdlbi5vcmcvbHd0Ij5Md3Q8L2E+IHJlYWNoIHZl cnNpb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3JlbGVhc2VzL3Rh Zy81LjcuMCI+DQo1Ljc8L2E+IDwvcD4NCjxwPlNldmVyYWwgbWFpbnRlbmFuY2UgcmVsZWFzZXMg b2YgPGEgaHJlZj0iaHR0cDovL29jc2lnZW4ub3JnL29jc2lnZW4tdG9vbGtpdCI+T2NzaWdlbi1U b29sa2l0PC9hPg0KPC9wPg0KPHA+VGhlIE9jc2lnZW4gdGVhbSB3aXNoZXMgeW91IGEgaGFwcHkg bmV3IHllYXIhIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI5Ij5zYXJpZiAwLjEuMCAt IFN0YXRpYyBBbmFseXNpcyBSZXN1bHRzIEludGVyY2hhbmdlIEZvcm1hdCAoU0FSSUYpIEZvciBP Q2FtbDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNhcmlmLTAt MS0wLXN0YXRpYy1hbmFseXNpcy1yZXN1bHRzLWludGVyY2hhbmdlLWZvcm1hdC1zYXJpZi1mb3It b2NhbWwvMTM4MjEvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNhcmlmLTAt MS0wLXN0YXRpYy1hbmFseXNpcy1yZXN1bHRzLWludGVyY2hhbmdlLWZvcm1hdC1zYXJpZi1mb3It b2NhbWwvMTM4MjEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnNDdiMzIyZCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzQ3YjMyMmQiPkdl b2ZmcmV5IEJvcm91Z2ggYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc0N2IzMjJkIj4NCjxwPkhpIGZvbGtzLCBJIGFubm91bmNlIHRoZSBpbml0 aWFsIHJlbGVhc2Ugb2Ygc2FyaWYgdmVyc2lvbiAwLjEuMCwgYSBsaWJyYXJ5IGZvciBwcm9jZXNz aW5nIGFuZCB2YWxpZGF0aW5nIHRoZSBTQVJJRiBmb3JtYXQuIElmIHlvdSBhcmUgZmFtaWxpYXIg d2l0aCBzdGF0aWMgYW5hbHlzaXMgYW5kL29yIGNvZGUgc2Nhbm5lciBsaWtlIFNlbWdyZXAgb3Ig U255ayBldGMsIFNBUklGIGlzIG9uZSBvZiB0aGUgb3V0cHV0IGZvcm1hdCB0aGF0IHBlb3BsZQ0K IGdlbmVyYXRlIGFuZCBzaGFyZSBhZnRlciBzY2FubmluZywgdGhlIHNwZWNpZmljYXRpb24gaXRz ZWxmIGlzIHF1aXRlIGJpZyBhbmQgY29udm9sdXRlZC4NCjwvcD4NCjxwPk15IG1vdGl2YXRpb24g Zm9yIG1ha2luZyB0aGlzIGxpYnJhcnkgaXMgdGhhdCB0aGVyZSBzZWVtcyB0byBiZSBubyBkZWZp bml0aXZlIGxpYnJhcnkgZm9yIFNBUklGIGluIHRoZSBPQ2FtbCBlY29zeXN0ZW0sIGFuZCBldmVu IGNvbXBhbmllcyBsaWtlIFNlbWdyZXAgcmVsaWVzIG9uIHNvbWUgcHl0aG9uIGdsdWUgY29kZSB0 byBnZW5lcmF0ZSB0aGUgZm9ybWF0LiBHaXZlbiBPQ2FtbOKAmXMgaW1wb3J0YW5jZSBpbiB0aGUg c3RhdGljIGFuYWx5c2lzDQogc2NlbmUgSSB0aG91Z2h0IGl0IHdvdWxkIGJlIG5pY2UgaWYgdGhp cyBnZXRzIG92ZXIgdGhlIGxpbmUgOnNsaWdodF9zbWlsZTogPC9wPg0KPHA+Q29kZTogPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL2dib3JvdWdoL3NhcmlmIj5odHRwczovL2dpdGh1Yi5jb20v Z2Jvcm91Z2gvc2FyaWY8L2E+DQo8L3A+DQo8cD5Eb2N1bWVudGF0aW9uOiA8YSBocmVmPSJodHRw czovL2dib3JvdWdoLmdpdGh1Yi5pby9zYXJpZi9zYXJpZi9zYXJpZi9pbmRleC5odG1sIj4NCmh0 dHBzOi8vZ2Jvcm91Z2guZ2l0aHViLmlvL3NhcmlmL3NhcmlmL3NhcmlmL2luZGV4Lmh0bWw8L2E+ IChQYWNrYWdlIGF2YWlsYWJsZSB2ZXJ5IHNvb24gaW4gb3BhbS1yZXBvc2l0b3J5IHBlbmRpbmcg UFIgYXBwcm92YWwpDQo8L3A+DQo8cD5IYXZlIGEgbmljZSBkYXkhIDwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iMTAiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzE0NTQ0NzEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxNDU0NDcxIj5G cm9tIHRoZSBvY2FtbC5vcmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnMTQ1NDQ3MSI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwg YmxvZ3MgYWdncmVnYXRlZCBhdCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0 aGUgb2NhbWwub3JnIGJsb2c8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aHJlZj0iaHR0cHM6Ly9wcmFjdGljYWxvY2FtbC5jb20vcGFyc2luZy13aXRoLWJpbmFyeS1zdHJp bmctcGF0dGVybi1tYXRjaGluZy8iPlBhcnNpbmcgd2l0aCBCaW5hcnkgU3RyaW5nIFBhdHRlcm4g TWF0Y2hpbmc8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhNTk5M2ExIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0ib3JnYTU5OTNhMSI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtb3JnYTU5OTNhMSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpz ZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4N CnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxw PklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBt YXkgc3Vic2NyaWJlIHRvIHRoZSA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBh L2luZm8vY2FtbC1saXN0Ij4NCmNhbWwtbGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhv cm5hbWUiIGlkPSJvcmcxNjU3OWRiIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 6 Feb 2024 15:14:12 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 6 Feb 2024 15:14:12 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 6 Feb 2024 15:14:12 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 416FEdNc029264 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 6 Feb 2024 15:14:39 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 416FETB3029249 for ; Tue, 6 Feb 2024 15:14:29 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 06 Feb 2024 16:14:28 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B4BBFE0CD5; Tue, 6 Feb 2024 16:14:27 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6ABB6E008A for ; Tue, 6 Feb 2024 16:14:23 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Feb 2024 16:14:21 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0F2645613B9; Tue, 6 Feb 2024 16:14:20 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaWQ8jTCwb43fvNEuOgIKoSkuIgg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 6 Feb 2024 15:14:00 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 99ad288b-f7e7-49f2-be1a-08dc27264648 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.05,247,1701126000"; d="scan'208,217";a="150583343" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499670, queueID=49D305613BA x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <35F2332B934F1E4A996CD37F07804E04@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMi0wNiBUdWUgMTY6MTIgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjQuMDEuMzAuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMi4xMy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMzAgdG8gRmVicnVhcnkgMDYs IDIwMjQuDQo8L3A+DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+ DQo8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250 ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPk9DYW1sIG1lZXR1 cHMgYXQgZGlmZmVyZW50IHBsYWNlczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPlR1dG9yaWFs cyBvbiBNb2R1bGVzLCBGdW5jdG9ycyBhbmQgTGlicmFyaWVzPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMyI+b3BhbSAxMDE6IHRoZSBmaXJzdCBzdGVwcywgYnkgT0NhbWxQcm88L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM0Ij5Cb2d1ZSB0dXRvcmlhbHMgMC4xLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 IiM1Ij5Bbm5vdW5jaW5nIHZhbGlkYXRlIDEuMC4wIC0gRW5oYW5jZWQgRGF0YSBWYWxpZGF0aW9u IGluIE9DYW1sITwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5NaXJhZ2VPUyBoYWNrIHJldHJl YXQgMjAyNCBlZGl0aW9uIChBcHJpbCAyMm5kIC0gMjh0aCk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 IiM3Ij5GbWxpYiAwLjUuOCB3aXRoIHVuaWNvZGUgcGFyc2VyczwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzgiPkxlYXJuIExhbWJkYSBDYWxjdWx1cyBpbiAxMCBtaW51dGVzIHdpdGggT0NhbWw8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5wcHhfbWluaWRlYnVnIDEuMC4wOiBleHBsb3JlIGxvZ3Mg b2YgdHlwZS1hbm5vdGF0ZWQgbGV0LWJpbmRpbmdzLCBjb2RlIGJyYW5jaGVzPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iIzEwIj5PQ2FtbCBSZXRyZWF0IGF0IEF1cm92aWxsZSwgSW5kaWEgKE1hcmNo IDEwdGggLSBNYXJjaCAxNXRoKTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMxMSI+T1VQUyBtZWV0 dXAgZmVicnVhcnkgMjAyNDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEyIj5PdGhlciBPQ2FtbCBO ZXdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnY2U2NjRjYyI+T2xkIENXTjwvYT4gPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5PQ2FtbCBtZWV0dXBzIGF0IGRpZmZlcmVudCBwbGFj ZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW1lZXR1cHMt YXQtZGlmZmVyZW50LXBsYWNlcy8xMzk1OS82Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9vY2FtbC1tZWV0dXBzLWF0LWRpZmZlcmVudC1wbGFjZXMvMTM5NTkvNjwvYT4gPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyODMyYmRmIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMjgzMmJkZiI+WGF2aWVyIFZhbiBkZSBXb2VzdHluZSBhbm5vdW5j ZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzI4MzJiZGYi Pg0KPHA+SW4gTGlsbGUsIGZyb20gMjAxNiB0byAyMDIxLCB3ZSBvcmdhbmlzZWQgTGFtYmRhTGls bGU6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sYW1iZGFsaWxsZS90YWxrcyI+DQpodHRw czovL2dpdGh1Yi5jb20vbGFtYmRhbGlsbGUvdGFsa3M8L2E+IDwvcD4NCjxwPkV2ZW4gaWYgdGhl IGV2ZW50IHdhc27igJl0IDEwMCUgZGVkaWNhdGVkIHRvIE9DYW1sLCBpdCB3YXMgbWFpbmx5IGdl bmVyYWwuIFRoZXJlIHdlcmUgc2V2ZXJhbCBwcmVzZW50YXRpb25zIGRlZGljYXRlZCB0byBPQ2Ft bCBvciBieSBtZW1iZXJzIG9mIHRoZSBPQ2FtbCBjb21tdW5pdHkgKDEzIHRhbGtzIHJlbGF0ZWQg dG8gT0NhbWwvUmVhc29uKS4NCjwvcD4NCjxwPlRoZSBldmVudCB3YXMgcHJldHR5IGNvb2wgYW5k IHN1cnZpdmVkIHRoZSBvbmxpbmUgbWVldHVwIHBhbmRlbWljIGp1c3QgZmluZS4gQW5kIHllcywg d2Ugd2VyZSB1c2luZyBNZWV0dXAgKGFuZCBUd2l0dGVyIGZvciBjb21tdW5pY2F0aW9uKSB3aXRo IGEgYmlnIHByZXNlbmNlIGF0IG90aGVyIGV2ZW50cyBmb3IgcHVibGljaXR5LiBMb29raW5nIGJh Y2ssIEkgdGhpbmsgaXQgd2FzIHByb2JhYmx5IG9uZSBvZiB0aGUgYmlnZ2VzdCByZWd1bGFyDQog ZXZlbnRzIGRlZGljYXRlZCB0byBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGluIEZyZW5jaCwgb3V0 c2lkZSB0aGUgYWNhZGVtaWMgd29ybGQuDQo8L3A+DQo8cD5JbiAyMDIxLCBJIG1vdmVkIHRvIE5h bnRlcyBhbmQgd2Ugd2VyZSBhYmxlIHRvIGxhdW5jaCBMYW1iZGFOYW50ZXMgOiA8YSBocmVmPSJo dHRwczovL21vYmlsaXpvbi5mci9AbGFtYmRhbmFudGVzIj4NCmh0dHBzOi8vbW9iaWxpem9uLmZy L0BsYW1iZGFuYW50ZXM8L2E+IDwvcD4NCjxwPih5ZWFoLCB0aGUgbG9nbyBpcyDigKYgd2VpcmQp IDwvcD4NCjxwPlRoZSBldmVudCBpcywgZm9yIHRoZSBtb21lbnQsIGxlc3MgYW1iaXRpb3VzIChi dXQgd2XigJl2ZSBhbHJlYWR5IGhhZCAyIGV2ZW50cyBkZWRpY2F0ZWQgdG8gT0NhbWwsIHdlIGFs c28gc3BvbnNvcmVkIGFuIE9VUFMhKS4gQW5vdGhlciBjaGFuZ2UgaXMgdGhlIHN3aXRjaCB0byBN b2JpbGl6b24sIGEgZnJlZSBNZWV0dXAgaW1wbGVtZW50YXRpb24gYmFzZWQgb24gQWN0aXZpdHlQ dWIuIEl04oCZcyBub3QgY3JhenksIGFuZCBhcyB3ZSBsaWtlIHRvDQogcmVpbnZlbnQgdGhlIHdo ZWVsLCB3ZeKAmWxsIHByb2JhYmx5IHdyaXRlIG91ciB2ZXJzaW9uIGluIE9DYW1sLiA8L3A+DQo8 cD5XZeKAmXJlIGFsd2F5cyBvbiB0aGUgbG9va291dCBmb3Igc3BlYWtlcnMgYW5kIHByZXNlbnRh dGlvbnMsIHNvIHdl4oCZZCBiZSBkZWxpZ2h0ZWQgdG8gaG9zdCBhbnkuIElmIHlvdeKAmXJlIGNs b3NlIHRvIE5hbnRlcyEgRm9yIDIwMjQsIHdl4oCZcmUgZ29pbmcgdG8gdHJ5LCBhZnRlciB0aGUg U2NhbGFJTyAyMDI0IGNvbmZlcmVuY2UgKHRoZSAxMHRoIGFubml2ZXJzYXJ5LCBpbiBOYW50ZXMs IHdoZXJlIEnigJlsbCBiZSBnaXZpbmcgdGhlIG9wZW5pbmcga2V5bm90ZSkNCiB0byBjcmVhdGUg YSBtb3JlIHJlZ3VsYXIgZXZlbnQsIGFuZCB0byBoYXZlIGJldHRlciBjb21tdW5pY2F0aW9uIHNv IHRoYXQsIHdoeSBub3QsIHdlIGVuZCB1cCB3aXRoIGEgcmVhbCBhbm51YWwgY29uZmVyZW5jZS4N CjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5UdXRvcmlhbHMgb24gTW9kdWxlcywg RnVuY3RvcnMgYW5kIExpYnJhcmllczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvdHV0b3JpYWxzLW9uLW1vZHVsZXMtZnVuY3RvcnMtYW5kLWxpYnJhcmllcy8xMzk2OC8x Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90dXRvcmlhbHMtb24tbW9kdWxlcy1mdW5j dG9ycy1hbmQtbGlicmFyaWVzLzEzOTY4LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzM5NmIxYmYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmczOTZiMWJmIj5DdWlodGxhdWFjIEFsdmFyYWRvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMzk2YjFiZiI+DQo8cD5EZWFyIE9DYW1sZXJz LCA8L3A+DQo8cD5PQ2FtbC5vcmcgdHV0b3JpYWwgdXBkYXRlcyBjb250aW51ZS4gV2XigJl2ZSBq dXN0IHB1Ymxpc2hlZCB0aGUgdGhyZWUgdHV0b3JpYWxzIG9uIHRoZSBtb2R1bGUgc3lzdGVtDQo8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZHJhZnQtdHV0b3JpYWxzLW9uLW1v ZHVsZXMtZnVuY3RvcnMtYW5kLWxpYnJhcmllcyI+DQphbm5vdW5jZWQ8L2E+IGluIERlY2VtYmVy OiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5v cmcvbW9kdWxlcyI+TW9kdWxlczwvYT4g4oCUIEJhc2VkIG9uIHRoZSBwcmV2aW91cyB2ZXJzaW9u DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9mdW5jdG9ycyI+RnVuY3RvcnM8 L2E+IOKAlCBNb3N0bHkgcmV3cml0dGVuIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL2R1bmUiPkxpYnJhcmllcyB3aXRoIER1bmU8L2E+IOKAlCBOZXcgPC9saT48L29sPg0KPHA+ VGhlIHRhcmdldCBhdWRpZW5jZSBpcyBkZXZlbG9wZXJzIGxlYXJuaW5nIE9DYW1sLiBObyBmdW5j dGlvbmFsIHByb2dyYW1taW5nIGtub3dsZWRnZSBpcyBhc3N1bWVkLiBIb3dldmVyLCBpdCBjb21l cyBhZnRlciB0aGUg4oCcR2V0IFN0YXJ0ZWTigJ0gYW5kIOKAnExhbmd1YWdl4oCdIHNlcmllcy4N CjwvcD4NCjxwPlRoYW5rcyB0byBAb3N0ZXJhLCBAeWF3YXJhbWluLCBAamJlLCBhbmQgQGxpbmRp ZyBmb3IgdGhlaXIgZmVlZGJhY2suIFNoYXJlIHlvdXJzIG9uIEdpdEh1YiwgaGVyZSwgb3IgdXNl IHRoZSDigJxPcGVuIGFuIElzc3Vl4oCdIGFuZCDigJxDb250cmlidXRl4oCdIGxpbmtzIGF0IHRo ZSBib3R0b20gb2YgdGhlIHBhZ2VzLiBXZeKAmXZlIHJlY2VudGx5IHJlY2VpdmVkIGFuZCBtZXJn ZWQgbWFueSBjb250cmlidXRpb25zOyB3ZeKAmWQgYmUgaGFwcHkgdG8gYWRkIGV2ZW4NCiBtb3Jl LiA8L3A+DQo8cD5Ib3BlIGl0IGhlbHBzIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIz Ij5vcGFtIDEwMTogdGhlIGZpcnN0IHN0ZXBzLCBieSBPQ2FtbFBybzwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1vcGFtLTEwMS10aGUtZmlyc3Qtc3RlcHMtYnkt b2NhbWxwcm8vMTM5NzUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1vcGFt LTEwMS10aGUtZmlyc3Qtc3RlcHMtYnktb2NhbWxwcm8vMTM5NzUvMTwvYT4NCjwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOWM1MDY1MCIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZzljNTA2NTAiPk9DYW1sUHJvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOWM1MDY1MCI+DQo8cD5HcmVldGluZ3Mg Q2FtZWxlZXJzLCA8L3A+DQo8cD5IZXJl4oCZcyBhIHF1aWNrIGhlYWRzIHVwIGFib3V0IG91ciBs YXRlc3QgYmxvZyBwb3N0OiA8YSBocmVmPSJodHRwczovL29jYW1scHJvLmNvbS9ibG9nLzIwMjRf MDFfMjNfb3BhbV8xMDFfdGhlX2ZpcnN0X3N0ZXBzLyI+DQpvcGFtIDEwMTogdGhlIGZpcnN0IHN0 ZXBzPC9hPiA8L3A+DQo8cD5XZSBiZWxpZXZlIHRoaXMgc2hvcnQgdHV0b3JpYWwgY291bGQgYmUg dXNlZnVsIHRvIGFueWJvZHkgd2hvIGlzIGxvb2tpbmcgaW50byBnZXR0aW5nIGFjcXVhaW50ZWQg d2l0aCBvdXIgYmVsb3ZlZCBwYWNrYWdlIG1hbmFnZXIsIGJlIHRoZXkgbmV3IG9yIHNpbXBseSB1 bmF3YXJlIGFib3V0IGhvdyBvcGFtIGludGVyYWN0cyB3aXRoIHlvdXIgc3lzdGVtIGF0IGBpbml0 YCB0aW1lIQ0KPC9wPg0KPHA+SG9waW5nIHRoYXQgaXQgbWF5IHNlcnZlIGFzIGEgcmVmZXJlbmNl IGZvciBhbGwgbmV3Y29tZXJzIHRvIHRoZSBlY29zeXN0ZW0sIDwvcD4NCjxwPktpbmQgcmVnYXJk cywgVGhlIE9DYW1sUHJvIFRlYW0gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPkJv Z3VlIHR1dG9yaWFscyAwLjEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWJvZ3VlLXR1dG9yaWFscy0wLTEtMC8xMTgxNi85Ij4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tYm9ndWUtdHV0b3JpYWxzLTAtMS0wLzExODE2Lzk8L2E+IDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTBjMDlhNCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzkwYzA5YTQiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIHNhbmV0 dGUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmc5MGMwOWE0Ij4NCjxibG9ja3F1b3RlPg0KPHA+TW9yZSB3aWxsIGNvbWUgd2hlbiB0aW1lIHBl cm1pdHMhIDwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPknigJltIGhhcHB5IHRvIGFubm91bmNlIDIg bW9yZSB0dXRvcmlhbHM6IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vc2FuZXR0ZS5naXRodWIu aW8vYm9ndWUtdHV0b3JpYWxzL2JvZ3VlLXR1dG9yaWFscy9sYXlvdXRzLmh0bWwiPkxheW91dHMg OiBhIHRyZWUgc3RydWN0dXJlPC9hPg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9zYW5ldHRl LmdpdGh1Yi5pby9ib2d1ZS10dXRvcmlhbHMvYm9ndWUtdHV0b3JpYWxzL3dpZGdldHMuaHRtbCI+ V2lkZ2V0cyBhbmQgY29ubmVjdGlvbnMgOiBhIGdyYXBoIHN0cnVjdHVyZTwvYT4NCjwvcD4NCjxw PlRoZSBsYXR0ZXIgZXZlbiBoYXMgYSBzbWFsbCByZXZlcnNpLWxpa2UgZ2FtZSB3aGVyZSBhbGwg c3F1YXJlcyBhcmUgYWN0dWFsbHkgd2lkZ2V0cyB0YWxraW5nIHRvIGVhY2ggb3RoZXIsIGRlbW9u c3RyYXRpbmcgdGhlIHVzZSBvZiDigJxjb25uZWN0aW9uc+KAnS4NCjwvcD4NCjxkaXYgaWQ9Im9y Z2EzZGNjNzciIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRp c2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzcvNzli YzM4NTEwNDZmYmI1MTEyZDBlMmE4YTllNzU1MGM4ZmQ0MTliOS53ZWJwIiBhbHQ9Ijc5YmMzODUx MDQ2ZmJiNTExMmQwZTJhOGE5ZTc1NTBjOGZkNDE5Yjkud2VicCI+DQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5Bbm5vdW5jaW5nIHZhbGlkYXRlIDEuMC4wIC0gRW5o YW5jZWQgRGF0YSBWYWxpZGF0aW9uIGluIE9DYW1sITwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWFubm91bmNpbmctdmFsaWRhdGUtMS0wLTAtZW5oYW5jZWQtZGF0 YS12YWxpZGF0aW9uLWluLW9jYW1sLzEzOTQ1LzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1hbm5vdW5jaW5nLXZhbGlkYXRlLTEtMC0wLWVuaGFuY2VkLWRhdGEtdmFsaWRhdGlv bi1pbi1vY2FtbC8xMzk0NS8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdkY2FjNzA1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZGNhYzcw NSI+TWF0ZXVzeiBMZWR3b8WEIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnZGNhYzcwNSI+DQo8cD5IZXkgZXZlcnlvbmUsIGl04oCZcyBtZSBh Z2FpbiB3aXRoIG1vcmUgZ29vZCBuZXdzIGZyb20gdGhlIDxjb2RlPnZhbGlkYXRlPC9jb2RlPiB3 b3JsZCENCjwvcD4NCjxwPknigJltIHRocmlsbGVkIHRvIGFubm91bmNlIHRoYXQgPGNvZGU+dmFs aWRhdGU8L2NvZGU+IGhhcyBqdXN0IGxldmVsZWQgdXAgdG8gdmVyc2lvbiAxLjEuMCEgVGhpcyB1 cGRhdGUgcGFja3MgYSBidW5jaCBvZiBuZXcgZmVhdHVyZXMgYW5kIGFubm90YXRpb25zIHRoYXQg SeKAmW0gc3VyZSB5b3XigJlsbCBmaW5kIHVzZWZ1bC4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNWMwNzIyOCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9 Im9yZzVjMDcyMjgiPldoYXTigJlzIE5ldzo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZzVjMDcyMjgiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPk5l dyBTdHJpbmcgQW5ub3RhdGlvbnM8L2I+OiA8Y29kZT5AdWxpZDwvY29kZT4gZm9yIFVMSUQgc3Ry aW5ncywgPGNvZGU+QGlwdjQ8L2NvZGU+IGFuZA0KPGNvZGU+QGlwdjY8L2NvZGU+IGZvciBJUCBh ZGRyZXNzZXMsIDxjb2RlPkBwaG9uZTwvY29kZT4gZm9yIEUuMTY0IHBob25lIG51bWJlcnMsIGFu ZA0KPGNvZGU+QG1hY19hZGRyZXNzPC9jb2RlPiBmb3IgTUFDIGFkZHJlc3Nlcy4gVGhlc2Ugd2ls bCBoZWxwIGVuc3VyZSB5b3VyIGRhdGEgZm9ybWF0cyBhcmUgc3BvdCBvbi4NCjwvbGk+PGxpPjxi Pk9wdGlvbiBUeXBlIEFubm90YXRpb25zPC9iPjogSW50cm9kdWNpbmcgPGNvZGU+QHNvbWU8L2Nv ZGU+IGFuZCA8Y29kZT5Abm9uZTwvY29kZT4gdG8gYXNzZXJ0IHByZXNlbmNlIG9yIGFic2VuY2Ug b2YgdmFsdWVzIGluIG9wdGlvbiB0eXBlcy4NCjwvbGk+PGxpPjxiPkFkdmFuY2VkIEFubm90YXRp b25zPC9iPjoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Y29kZT5AY3VzdG9tPC9jb2RlPjog Q3JlYXRlIHlvdXIgb3duIHZhbGlkYXRpb24gbG9naWMhIEl04oCZcyBzdXBlciBmbGV4aWJsZSBh bmQgYWxsb3dzIHlvdSB0byBkZWZpbmUgdmFsaWRhdGlvbnMgdGhhdCBzdWl0IHlvdXIgdW5pcXVl IG5lZWRzLg0KPC9saT48bGk+PGNvZGU+QGlnbm9yZV9pZjwvY29kZT46IFNraXAgdmFsaWRhdGlv bnMgY29uZGl0aW9uYWxseS4gUmVhbGx5IGhhbmR5IGZvciB0aG9zZSBjb21wbGV4IGRhdGEgc3Ry dWN0dXJlcy4NCjwvbGk+PGxpPjxjb2RlPkBzb21lX2lmPC9jb2RlPiBhbmQgPGNvZGU+QG5vbmVf aWY8L2NvZGU+OiBDb250cm9sIHRoZSByZXF1aXJlbWVudHMgb2YgPGNvZGU+DQpTb21lPC9jb2Rl PiBhbmQgPGNvZGU+Tm9uZTwvY29kZT4gaW4gb3B0aW9uIHR5cGVzIGJhc2VkIG9uIGNvbmRpdGlv bnMuIDwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdkZDBhNGI5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3Jn ZGQwYTRiOSI+RGl2ZSBpbnRvIHRoZSBFeGFtcGxlczo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2RkMGE0YjkiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPjxhIGlkPSJvcmc3MjA2ODFjIj48L2E+PGNvZGU+QGN1c3RvbTwvY29kZT48YnI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNzIwNjgxYyI+DQo8ZGl2IGNs YXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5jdXN0b21fdmFsaWRhdG9yPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zdHI8L3NwYW4+ID0NCiAgPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmlmPC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5TdHJpbmcuPC9zcGFuPmxlbmd0aCBzdHIgJmd0OyA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij4xPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQy NTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+T2s8L3NwYW4+ICgpDQogIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbHNlPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5FcnJv cjwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlZhbGlkYXRlLjwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5C YXNlRXJyb3I8L3NwYW4+IHsgY29kZSA9IDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZx dW90O2N1c3RvbV92YWxpZGF0b3ImcXVvdDs8L3NwYW4+OyBwYXJhbXMgPSA8c3BhbiBzdHlsZT0i Y29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5bXTwvc3Bhbj4gfSkN Cg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5cGU8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPmN1c3RvbV92YWxpZGF0b3JfcmVj b3JkPC9zcGFuPiA9IHsNCiAgY3VzdG9tX3ZhbGlkYXRvciA6IHN0cmluZzsgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjYTI2MDRmOyI+W0BjdXN0b20gY3VzdG9tX3ZhbGlkYXRvcl08L3NwYW4+DQogIC4u Lg0KfQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BAZGVyaXZpbmcgdmFsaWRhdGVd PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzIyZmFm MWEiPjwvYT48Y29kZT5AaWdub3JlX2lmPC9jb2RlPjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmcyMmZhZjFhIj4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFp bmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij50ZW1wZXJhdHVyZV9yZWNvcmQ8L3NwYW4+ID0gew0KICB1bml0IDogc3RyaW5n Ow0KICB0ZW1wZXJhdHVyZSA6IGludDsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0Bn cmVhdGVyX3RoYW5fb3JfZXF1YWwgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi PjA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+XTwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BpZ25vcmVfaWYgZnVuIHIgLSZndDsgci51bml0ICZsdDsm Z3Q7IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtLJnF1b3Q7PC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPl08L3NwYW4+DQp9DQo8c3BhbiBzdHls ZT0iY29sb3I6ICNhMjYwNGY7Ij5bQEBkZXJpdmluZyB2YWxpZGF0ZV08L3NwYW4+DQo8L3ByZT4N CjwvZGl2Pg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnODIwYjUzMyI+PC9hPjxjb2RlPkBz b21lX2lmPC9jb2RlPiBhbmQgPGNvZGU+QG5vbmVfaWY8L2NvZGU+PGJyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzgyMGI1MzMiPg0KPGRpdiBjbGFzcz0ib3JnLXNy Yy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5cGU8L3NwYW4+IDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPmNvbnRhY3RfaW5mbzwvc3Bhbj4gPSB7DQogIHVzZXJuYW1lIDog c3RyaW5nIG9wdGlvbjsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0Bzb21lX2lmIGZ1 biByIC0mZ3Q7IHIuZW1haWwgPSBOb25lXTwvc3Bhbj4NCiAgZW1haWwgOiBzdHJpbmcgb3B0aW9u OyA8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQG5vbmVfaWYgZnVuIHIgLSZndDsgT3B0 aW9uLmlzX3NvbWUgci51c2VybmFtZV08L3NwYW4+DQp9DQo8c3BhbiBzdHlsZT0iY29sb3I6ICNh MjYwNGY7Ij5bQEBkZXJpdmluZyB2YWxpZGF0ZV08L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+ VGhlc2UgbmV3IGZlYXR1cmVzIGFkZCBzbyBtdWNoIG1vcmUgZGVwdGggYW5kIGZsZXhpYmlsaXR5 IHRvIDxjb2RlPnZhbGlkYXRlPC9jb2RlPi4gSeKAmW0gcmVhbGx5IGV4Y2l0ZWQgdG8gc2VlIGhv dyB5b3UgYWxsIHVzZSB0aGVtIGluIHlvdXIgcHJvamVjdHMuDQo8L3A+DQo8cD5DaGVjayBvdXQg YWxsIHRoZSBkZXRhaWxzOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQXhvdDAxNy92YWxp ZGF0ZSI+R2l0SHViIC0gQXhvdDAxNy92YWxpZGF0ZTwvYT4uDQo8L3A+DQo8L2Rpdj4NCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5NaXJhZ2VPUyBoYWNrIHJldHJlYXQg MjAyNCBlZGl0aW9uIChBcHJpbCAyMm5kIC0gMjh0aCk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L21pcmFnZW9zLWhhY2stcmV0cmVhdC0yMDI0LWVkaXRpb24tYXByaWwt MjJuZC0yOHRoLzE0MDAyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21pcmFnZW9z LWhhY2stcmV0cmVhdC0yMDI0LWVkaXRpb24tYXByaWwtMjJuZC0yOHRoLzE0MDAyLzE8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2E2MzgzMzgiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhNjM4MzM4Ij5IYW5uZXMgTWVobmVydCBhbm5vdW5j ZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2E2MzgzMzgi Pg0KPHA+RGVhciB2YWx1ZWQgT0NhbWwgZW50aHVzaWFzdCwgPC9wPg0KPHA+aXQgaXMgbXkgcGxl YXN1cmUgdG8gZGlzdHJpYnV0ZSB0aGUgbmV3cyB0aGF0IHRoZXJlIHdpbGwgYmUgYSBuZXh0IGZh Y2UtdG8tZmFjZSBtZWV0aW5nIG9mIE1pcmFnZU9TIHBlb3BsZSBpbiBzdW5ueSBNYXJyYWtlc2gs IE1vcm9jY28uDQo8L3A+DQo8cD5UaGlzIHRpbWUgaXQgaXMgaW4gbGF0ZSBBcHJpbCwgYW5kIHdl 4oCZcmUga2VlbiB0byBzYXkgaGkgdG8gbmV3IGZhY2VzIGFuZCB0byBwZW9wbGUgd2UgYWxyZWFk eSBrbm93Lg0KPC9wPg0KPHA+RXZlcnlvbmUgaXMgd2VsY29tZSAtIHlvdSBzaG91bGQgYmUgbmlj ZSBhbmQgYWxzbyBiZSBpbnRlcmVzdGVkIGluIE1pcmFnZU9TICh0byBhIGNlcnRhaW4gZGVncmVl KS4gOkQgQnV0IGlmIHlvdeKAmXJlIG1vc3RseSBqb2luaW5nIGZvciB0aGUgc3Vuc2hpbmUgYW5k IGRlbGljaW91cyBmb29kLCB0aGF0IGlzIGZpbmUgYXMgd2VsbC4NCjwvcD4NCjxwPkZ1cnRoZXIg aW5mb3JtYXRpb24gYW5kIHJlZ2lzdHJhdGlvbiBpbnN0cnVjdGlvbnMgb24gPGEgaHJlZj0iaHR0 cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pbyI+DQpodHRwczovL3JldHJlYXQubWlyYWdlLmlvPC9hPiA8 L3A+DQo8cD5Ib3BlIHRvIHNlZSB5b3UgdGhlcmUhIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSI3Ij5GbWxpYiAwLjUuOCB3aXRoIHVuaWNvZGUgcGFyc2VyczwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZtbGliLTAtNS04LXdpdGgtdW5pY29kZS1wYXJz ZXJzLzE0MDAzLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1mbWxpYi0wLTUt OC13aXRoLXVuaWNvZGUtcGFyc2Vycy8xNDAwMy8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzIyNmExMjciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmcyMjZhMTI3Ij5IZWxtdXQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmcyMjZhMTI3Ij4NCjxwPkkgaGF2ZSB0aGUgcGxlYXN1cmUgdG8g YW5ub3VuY2UgdmVyc2lvbiAwLjUuOCBvZiA8Y29kZT5mbWxpYjwvY29kZT4uIDxjb2RlPmZtbGli PC9jb2RlPiBpcyBhIGZ1bmN0aW9uYWwgbW9uYWRpYyBsaWJyYXJ5IHdoaWNoIGZlYXR1cmVzIGNv bWJpbmF0b3IgcGFyc2luZywgZWxtIGxpa2UgYnJvd3NlciBhcHBsaWNhdGlvbnMsIGFuZCBwcmV0 dHkgcHJpbnRpbmcuIFRoaXMgcmVsZWFzZSBmb2N1c2VzIG1haW5seSBjb21iaW5hdG9yIHBhcnNp bmcuDQogVGhlIGFkZGVkIGZ1bmN0aW9uYWxpdHkgaXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVs Ij4NCjxsaT5QYXJzaW5nIG9mIHN0cmVhbXMgb2YgdW5pY29kZSBjaGFyYWN0ZXJzICg8YSBocmVm PSJodHRwczovL2hici5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxpYl9wYXJzZS9GbWxpYl9wYXJz ZS9VY2hhcmFjdGVyL2luZGV4Lmh0bWwiPmh0dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi9vZG9j L2ZtbGliX3BhcnNlL0ZtbGliX3BhcnNlL1VjaGFyYWN0ZXIvaW5kZXguaHRtbDwvYT4pDQo8L2xp PjxsaT5TZXBhcmF0ZSBwYXJzZXJzIGFuZCBsZXhlcnMgKDxhIGhyZWY9Imh0dHBzOi8vaGJyLmdp dGh1Yi5pby9mbWxpYi9vZG9jL2ZtbGliX3BhcnNlL0ZtbGliX3BhcnNlL1BhcnNlX3dpdGhfbGV4 ZXIvaW5kZXguaHRtIj5odHRwczovL2hici5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxpYl9wYXJz ZS9GbWxpYl9wYXJzZS9QYXJzZV93aXRoX2xleGVyL2luZGV4Lmh0bTwvYT4pDQo8L2xpPjwvdWw+ DQo8cD5GdXJ0aGVybW9yZSB0aGUgbGlicmFyeSA8Y29kZT5GbWxpYl9icm93c2VyPC9jb2RlPiAo PGEgaHJlZj0iaHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvZm1saWJfYnJvd3Nlci9k b2MuaHRtbCI+aHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvZm1saWJfYnJvd3Nlci9k b2MuaHRtbDwvYT4pIGhhcyBhZGRlZCBmdW5jdGlvbmFsaXR5IHRvIG1ha2UgcGFyYWxsZWwgaHR0 cCByZXF1ZXN0cyAoaW4gZ2VuZXJhbCBwYXJhbGxlbA0KIHRhc2tzKS4gPC9wPg0KPHA+VGhlIG1h aW4gZmVhdHVyZXMgb2YgPGNvZGU+Rm1saWJfcGFyc2U8L2NvZGU+IGFyZTogPC9wPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPkluZGVudGF0aW9uIHNlbnNpdGl2ZSBwYXJzaW5nOiBUaGUgcGFy c2VycyBjYW4gcGFyc2UgaW5kZW50aWF0aW9uIHNlbnNpdGl2ZSBsYW5ndWFnZXMgbGlrZSBQeXRo b24sIEhhc2tlbGwsIFlhbWwsIGV0Yy4gKDxhIGhyZWY9Imh0dHBzOi8vaGJyLmdpdGh1Yi5pby9m bWxpYi9vZG9jL2ZtbGliX3BhcnNlL3BhcnNlX2luZGVudGF0aW9uLmh0bWwiPmh0dHBzOi8vaGJy LmdpdGh1Yi5pby9mbWxpYi9vZG9jL2ZtbGliX3BhcnNlL3BhcnNlX2luZGVudGF0aW9uLmh0bWw8 L2E+KQ0KPC9saT48bGk+SW5jcmVtZW50YWwgcGFyc2luZzogVGhlIHBhcnNlcnMgaGF2ZSBpbnZl cnNpb24gb2YgY29udHJvbC4gSS5lLiB0aGV5IGRvIG5vdCByZWFkIGZyb20gc3RyZWFtcy4gVGhl IHVzZXIgY2FuIHB1c2ggY2hhcmFjdGVycyBvciB0b2tlbnMgaW50byB0aGUgcGFyc2Vycy4gVGhl IHBhcnNpbmcgcHJvY2VzcyBjYW4gYmUgaW50ZXJydXB0ZWQgYW5kIHJlc3VtZWQgYXQgYW55IHRp bWUuDQo8L2xpPjxsaT5JbW11dGFibGU6IFRoZSBwYXJzZXIgY2FuIHRoZXJlZm9yZSBiZSB1c2Vk IGluIGxpdmUgZWRpdG9ycy4gVGhlIHBhcnNlcnMgY2FuIGUuZy4gYmUgc3RvcmVkIGF0IHRoZSBi ZWdpbm5pbmcgb2YgZWFjaCBsaW5lLiBBZnRlciBlZGl0aW5nIGEgbGluZSB0aGUgcGFyc2VyIGNh biBiZSByZXN0YXJ0ZWQgYnkgZmVlZGluZyBpdCB0aGUgY3VycmVudCBsaW5lIGFuIGZvbGxvd2lu Zy4NCjwvbGk+PGxpPk5pY2VseSBmb3JtYXR0ZWQgZXJyb3IgbWVzc2FnZXMgKDxhIGhyZWY9Imh0 dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi9vZG9jL2ZtbGliX3BhcnNlL3BhcnNlX2Zvcm1hdC5o dG1sIj5odHRwczovL2hici5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxpYl9wYXJzZS9wYXJzZV9m b3JtYXQuaHRtbDwvYT4pDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+ TGVhcm4gTGFtYmRhIENhbGN1bHVzIGluIDEwIG1pbnV0ZXMgd2l0aCBPQ2FtbDwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbGVhcm4tbGFtYmRhLWNhbGN1bHVzLWluLTEw LW1pbnV0ZXMtd2l0aC1vY2FtbC8xNDAwNC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9sZWFybi1sYW1iZGEtY2FsY3VsdXMtaW4tMTAtbWludXRlcy13aXRoLW9jYW1sLzE0MDA0LzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM0NGJhMTci IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczNDRiYTE3Ij5EbWl0cmlpIEtvdmFuaWtv diBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzM0NGJhMTciPg0KPHA+SGkgZXZlcnlvbmUgOndhdmU6IDwvcD4NCjxwPkkgd3JvdGUgYSBzaG9y dCBibG9nIHBvc3QgYWJvdXQgdGVhY2hpbmcgdGhlIGZ1bmRhbWVudGFscyBvZiBMYW1iZGEgQ2Fs Y3VsdXMgd2l0aCBzb21lIE9DYW1sIGNvZGU6DQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2Rl di50by9jaHNoZXJzaC9sZWFybi1sYW1iZGEtY2FsY3VsdXMtaW4tMTAtbWludXRlcy13aXRoLW9j YW1sLTU2YmEiPmh0dHBzOi8vZGV2LnRvL2Noc2hlcnNoL2xlYXJuLWxhbWJkYS1jYWxjdWx1cy1p bi0xMC1taW51dGVzLXdpdGgtb2NhbWwtNTZiYTwvYT4NCjwvcD4NCjxwPk5vdGhpbmcgcmVhbGx5 IGtuZXcgaWYgeW914oCZcmUgYWxyZWFkeSBmYW1pbGlhciB3aXRoIHRoZSBzdWJqZWN0IGJ1dCBp dOKAmXMgbmljZSByZW1pbmRlciBob3cgZWFzeSBhbmQgZWxlZ2FudCBhIExhbWJkYSBDYWxjdWx1 cyBjb2RlIGNhbiBiZSBpbiBhbiBGUCBsYW5ndWFnZSA6c2xpZ2h0bHlfc21pbGluZ19mYWNlOg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt OSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPnBweF9taW5pZGVidWcgMS4wLjA6IGV4 cGxvcmUgbG9ncyBvZiB0eXBlLWFubm90YXRlZCBsZXQtYmluZGluZ3MsIGNvZGUgYnJhbmNoZXM8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtbWluaWRlYnVn LTEtMC0wLWV4cGxvcmUtbG9ncy1vZi10eXBlLWFubm90YXRlZC1sZXQtYmluZGluZ3MtY29kZS1i cmFuY2hlcy8xNDAwNS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHB4LW1p bmlkZWJ1Zy0xLTAtMC1leHBsb3JlLWxvZ3Mtb2YtdHlwZS1hbm5vdGF0ZWQtbGV0LWJpbmRpbmdz LWNvZGUtYnJhbmNoZXMvMTQwMDUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYTU5NTU3ZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2E1 OTU1N2YiPkx1a2FzeiBTdGFmaW5pYWsgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhNTk1NTdmIj4NCjxwPknigJltIGhhcHB5IHRvIGFubm91 bmNlIHZlcnNpb24gMS4wIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sdWtzdGFmaS9w cHhfbWluaWRlYnVnIj4NCnBweF9taW5pZGVidWc8L2E+LiBJdCBpcyBpbnNwaXJlZCBieSA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFyaXVzZi9wcHhfZGVidWciPg0KZGFyaXVzZi9wcHhf ZGVidWc6IFRvb2xzIGZvciByZWNvcmQtYW5kLXJlcGxheSBkZWJ1Z2dpbmc8L2E+LCBidXQgcmF0 aGVyIHRoYW4gcGFyc2luZw0KPGNvZGU+LmNtdDwvY29kZT4gZmlsZXMgaXQgcmVsaWVzIG9uIHVz ZXItcHJvdmlkZWQgdHlwZSBhbm5vdGF0aW9ucy4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPkl0IGNhbiBoaWdobGlnaHQgcGF0aHMgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24tYmFzZWQg c2VhcmNoIHRlcm0uIDwvbGk+PGxpPkl0IGhhcyBvcHRpb25zIHRvIHRyaW0gZG93biB0aGUgc2l6 ZSBvZiBnZW5lcmF0ZWQgbG9ncyBhbmQgc3BsaXQgbG9ncyBpbnRvIG11bHRpcGxlIGZpbGVzLg0K PC9saT48bGk+SXQgdXNlcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3ByaW50 Ym94Ij5jLWN1YmUvcHJpbnRib3g8L2E+IGFzIGEgYmFja2VuZCAocGx1cyBhIG1pbmltYWwsIGZs dXNoaW5nIGJhY2tlbmQpIOKAkyBvZmZlcmluZyBIVE1MIGFuZCBNYXJrZG93biBvdXRwdXQgd2l0 aCBmb2xkYWJsZSB0cmVlcy4NCjwvbGk+PGxpPkl0IHN1cHBvcnRzIGJvdGggPGNvZGU+ZGVyaXZp bmcuc2hvdzwvY29kZT4gYW5kIDxjb2RlPmRlcml2aW5nIHNleHA8L2NvZGU+IOKAnGZyb250ZW5k c+KAnSDigJMgaW4gdGhlIGxhdHRlciBjYXNlLCBpdCBjYW4gdHVybiBsYXJnZSB2YWx1ZXMgaW50 byBmb2xkYWJsZSB0cmVlcy4NCjwvbGk+PGxpPkl0IGNhbiBsb2cgY29udHJvbCBmbG93IHN0cnVj dHVyZXMgKG1hdGNoIC8gZnVuY3Rpb24gYnJhbmNoZXMsIGxvb3BzLCBhbm9ueW1vdXMgZnVuY3Rp b25zKS4NCjwvbGk+PGxpPkl0IHByb3BhZ2F0ZXMgdHlwZXMgdG9wLWRvd24sIG1lcmdlcyB0eXBl cyBhbmQgZGVjb21wb3NlcyBwYXR0ZXJucywgbWFraW5nIGl0IGVhc2llciB0byBwcm92aWRlIHR5 cGVzIGZvciBkZXNpcmVkIHZhbHVlcy4NCjwvbGk+PC91bD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9sdWtzdGFmaS9wcHhfbWluaWRlYnVnIj5wcHhfbWluaWRlYnVnOiBGb3JtYXR0 ZWQgbG9ncyBvZiB0eXBlLWFubm90YXRlZCBsZXQtYm91bmQgdmFsdWVzLCBmdW5jdGlvbiBhcmd1 bWVudHMgYW5kIHJlc3VsdHMsDQo8Y29kZT5pZjwvY29kZT4gYW5kIDxjb2RlPm1hdGNoPC9jb2Rl PiBicmFuY2hlcyB0YWtlbi4gT3B0aW9uYWxseSwgYXMgY29sbGFwc2libGUgSFRNTCBvciBNYXJr ZG93biB0cmVlcyB3aXRoIGhpZ2hsaWdodHMuIChnaXRodWIuY29tKTwvYT4NCjwvcD4NCjxwPklu bGluZSB0ZXN0IGV4YW1wbGVzOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbHVrc3RhZmkv cHB4X21pbmlkZWJ1Zy9ibG9iL21haW4vdGVzdC90ZXN0X2V4cGVjdF90ZXN0Lm1sIj4NCnBweF9t aW5pZGVidWcvdGVzdC90ZXN0X2V4cGVjdF90ZXN0Lm1sPC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjEwIj5PQ2FtbCBSZXRyZWF0IGF0IEF1cm92aWxsZSwgSW5kaWEgKE1hcmNo IDEwdGggLSBNYXJjaCAxNXRoKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXJldHJlYXQtYXQtYXVyb3ZpbGxlLWluZGlhLW1hcmNoLTEwdGgtbWFyY2gtMTV0 aC8xNDAwNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1yZXRyZWF0LWF0 LWF1cm92aWxsZS1pbmRpYS1tYXJjaC0xMHRoLW1hcmNoLTE1dGgvMTQwMDYvMTwvYT4NCjwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTU1OTBkMiIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U1NTkwZDIiPlN1ZGhhIFBhcmltYWxhIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTU1OTBkMiI+DQo8 cD5EZWFyIGZlbGxvdyBDYW1sLWVycywgPC9wPg0KPHA+V2UgYXJlIHJ1bm5pbmcgYW4gT0NhbWwg cmV0cmVhdCAoaW5zcGlyZWQgYnkgPGEgaHJlZj0iaHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pby8i Pg0KTWlyYWdlIFJldHJlYXRzPC9hPikgYXQgQXVyb3ZpbGxlLCBJbmRpYSAobG9jYXRlZCB+M2hy cyBkcml2ZSBmcm9tIENoZW5uYWkpLiBXZSBhcmUgbG9va2luZyBmb3J3YXJkIHRvIGhhY2tpbmcg b24gYSB2YXJpZXR5IG9mIE9DYW1sIHByb2plY3RzIHRocm91Z2hvdXQgdGhlIHdlZWsgYW5kIHBh cnRpY2lwYXRpbmcgaW4gZXh0ZXJuYWwgYWN0aXZpdGllcyBpbiB0aGUgZXZlbmluZ3MuIEZvbGtz IGludGVyZXN0ZWQgdG8gYXR0ZW5kIHRoZSByZXRyZWF0LA0KIHBsZWFzZSByZWdpc3RlciBoZXJl IC0gPGEgaHJlZj0iaHR0cHM6Ly9mb3Jtcy5nbGUvSzhWRkp5V2Y0bWNvRW41cTYiPmh0dHBzOi8v Zm9ybXMuZ2xlL0s4VkZKeVdmNG1jb0VuNXE2PC9hPg0KPC9wPg0KPHA+UGxlYXNlIGRvbuKAmXQg aGVzaXRhdGUgdG8gY29udGFjdCB1cyBpbiBjYXNlIHlvdSBoYXZlIHF1ZXN0aW9ucy4gSG9waW5n IHRvIHNlZSBzb21lIG9mIHlvdSB0aGVyZSENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMTEiPk9VUFMgbWVldHVwIGZlYnJ1YXJ5IDIwMjQ8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vdXBzLW1lZXR1cC1mZWJydWFyeS0yMDI0LzE0MDA3LzEiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291cHMtbWVldHVwLWZlYnJ1YXJ5LTIwMjQvMTQwMDcv MTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlMTBlMTY5 IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZTEwZTE2OSI+emFwYXNoY2Fub24gYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdlMTBl MTY5Ij4NCjxwPlRoZSBuZXh0IE9VUFMgbWVldHVwIHdpbGwgdGFrZSBwbGFjZSBvbiA8Yj5UaHVy c2RheSwgMjl0aCBvZiBGZWJydWFyeTwvYj4gMjAyNC4gSXQgd2lsbCBzdGFydCBhdA0KPGI+N3Bt PC9iPiBhdCB0aGUgPGI+NCBwbGFjZSBKdXNzaWV1PC9iPiBpbiBQYXJpcy4gPC9wPg0KPHA+Ondh cm5pbmc6IDp0cnVtcGV0OiBJdCB3aWxsIGJlIGluIHRoZSBpbiB0aGUgPGI+RXNjbGFuZ29uIGJ1 aWxkaW5nPC9iPiAoYW1waGkgQXN0aWVyKS4gOnRydW1wZXQ6IDp3YXJuaW5nOg0KPC9wPg0KPHA+ UGxlYXNlLCA8Yj48YSBocmVmPSJodHRwczovL3d3dy5tZWV0dXAuY29tL2ZyLUZSL29jYW1sLXBh cmlzL2V2ZW50cy8yOTkwMTQwODIiPnJlZ2lzdGVyIG9uIG1lZXR1cA0KPC9hPjwvYj5hcyBzb29u IGFzIHBvc3NpYmxlIHRvIGxldCB1cyBrbm93IGhvdyBtYW55IHBpenphIHdlIHNob3VsZCBvcmRl ci4gPC9wPg0KPHA+Rm9yIG1vcmUgZGV0YWlscywgeW91IG1heSBjaGVjayB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9vdXBzLmZyYW1hLmlvIj5PVVBT4oCZIHdlYnNpdGUNCjwvYT4uIDwvcD4NCjxwPuKA lCA8L3A+DQo8cD5UaGlzIG1vbnRoIHdpbGwgZmVhdHVyZSB0aGUgZm9sbG93aW5nIHRhbGtzIDog PC9wPg0KPHA+PGI+Q29ycmVjdCwgRmFzdCBMUigxKSBVbnBhcnNpbmcg4oCTIEZyYW7Dp29pcyBQ b3R0aWVyPC9iPiA8L3A+DQo8cD5XZSBkZXNjcmliZSBhbiBleHRlbnNpb24gb2YgdGhlIExSKDEp IHBhcnNlciBnZW5lcmF0b3IgTWVuaGlyIHdpdGggbmV3IGZlYXR1cmVzIHRoYXQgYWltIHRvIGZh Y2lsaXRhdGUgdW5wYXJzaW5nLCB0aGF0IGlzLCB0cmFuc2Zvcm1pbmcgYWJzdHJhY3Qgc3ludGF4 IHRyZWVzIGJhY2sgaW50byB0ZXh0LiBPdXIgbWV0aG9kIHN1cHBvcnRzIG5vbi1MUigxKSBncmFt bWFycyBkZWNvcmF0ZWQgd2l0aCBwcmVjZWRlbmNlIGRlY2xhcmF0aW9ucyBhbmQNCiBndWFyYW50 ZWVzIGNvcnJlY3QgdW5wYXJzaW5nLCBieSB3aGljaCB3ZSBtZWFuIHRoYXQgcGFyZW50aGVzZXMg b3Igb3RoZXIgZGlzYW1iaWd1YXRpb24gc3ltYm9scyBhcmUgaW5zZXJ0ZWQgd2hlcmUgbmVjZXNz YXJ5LiBGdXJ0aGVybW9yZSwgaXQgYWxsb3dzIHRoZSB1c2VyIHRvIGNvbnRyb2wgb3RoZXIgYXNw ZWN0cyBvZiB0aGUgdW5wYXJzaW5nIHByb2Nlc3MsIHN1Y2ggYXMgbGF5b3V0LiBPdXIgY29udHJp YnV0aW9ucyBpbmNsdWRlIGEgbm92ZWwNCiB2aWV3IG9mIHVucGFyc2luZyBhcyBhIGNvbXBvc2l0 aW9uIG9mIHNldmVyYWwgc3VjY2Vzc2l2ZSB0cmFuc2Zvcm1hdGlvbnM7IHRoZSBub3ZlbCBjb25j ZXB0IG9mIGRpc2p1bmN0aXZlIGNvbmNyZXRlIHN5bnRheCB0cmVlcyAoRENTVHMpOyBhIGZhc3Qg YWxnb3JpdGhtIHRoYXQgY29udmVydHMgRENTVHMgdG8gb3JkaW5hcnkgY29uY3JldGUgc3ludGF4 IHRyZWVzIChDU1RzKSwgdGhlcmVieSBkZWNpZGluZyB3aGVyZSBkaXNhbWJpZ3VhdGlvbiBzeW1i b2xzDQogbXVzdCBiZSBpbnNlcnRlZDsgYW5kIHRoZSBhdXRvbWF0ZWQgZ2VuZXJhdGlvbiBvZiBz YWZlIEFQSXMgZm9yIHRoZSBjb25zdHJ1Y3Rpb24gb2YgRENTVHMgYW5kIGRlY29uc3RydWN0aW9u IG9mIENTVHMuDQo8L3A+DQo8cD48Yj5PY3NpZ2VuL0JlIFNwb3J0OiBJbXBsw6ltZW50ZXIgdW4g csOpc2VhdSBzb2NpYWwgZW4gT0NhbWwg4oCTIFZpbmNlbnQgQmFsYXQ8L2I+DQo8L3A+DQo8cD5M YW5jZXIgdW4gcsOpc2VhdSBzb2NpYWwgZW4gMjAxNSBlc3QgdW4gcHJvamV0IHRyw6hzIGFtYml0 aWV1eCBwb3VyIHVuZSBzdGFydC11cCA6IG91dHJlIGxhIGRpZmZpY3VsdMOpIGRlIGNhcHRlciB1 bmUgbWFzc2UgZOKAmXV0aWxpc2F0ZXVycyBzdWZmaXNhbnRlLCBpbCBmYXV0IHLDqXVzc2lyIMOg IGltcGzDqW1lbnRlciByYXBpZGVtZW50IGV0IGF2ZWMgcGV1IGRlIG1veWVuIGRlcyBhcHBsaWNh dGlvbnMgV2ViIGV0IG1vYmlsZXMgYXZlYyB1biBuaXZlYXUNCiBkZSBxdWFsaXTDqSBjb21wYXJh YmxlIGF1eCBncmFuZHMgcsOpc2VhdXggY29uY3VycmVudHMuIEJlIFNwb3J0IGVzdCBsZSByw6lz ZWF1IHNvY2lhbCBkdSBzcG9ydCwgZMOpdmVsb3Bww6kgZW4gY29sbGFib3JhdGlvbiBhdmVjIGxl IGNvbWl0w6kgbmF0aW9uYWwgb2x5bXBpcXVlIGV0IHBsdXNpZXVycyBmw6lkw6lyYXRpb25zLiBJ bCByZWNlbnNlIHBsdXMgZGUgNjUwMDAwIMOpcXVpcGVzIGZyYW7Dp2Fpc2VzIGRhbnMgdG91cyBs ZXMgc3BvcnRzIGV0IHRvdXMgbGV1cnMNCiBtYXRjaHMsIGF1eCBuaXZlYXV4IGFtYXRldXIgZXQg cHJvZmVzc2lvbm5lbC4gSWwgcHJvcG9zZSBkZXMgZm9uY3Rpb25uYWxpdMOpcyBzaW1pbGFpcmVz IMOgIEZhY2Vib29rIDogcGFnZXMgcGVyc29ubmVsbGVzLCBncm91cGVzLCDDqXbDqW5lbWVudHMs IGZsdXggZOKAmWFjdHVhbGl0w6ksIGV0Yy4gRGFucyBjZXQgZXhwb3PDqSBqZSBtb250cmVyYWkg Y29tbWVudCBsZSBjaG9peCBk4oCZT0NhbWwgcG91ciBs4oCZaW1wbMOpbWVudGF0aW9uIHPigJll c3QgYXbDqXLDqSBnYWduYW50Lg0KIEzigJl1dGlsaXNhdGlvbiBwb3Vzc8OpZSBkdSB0eXBhZ2Ug cGVybWV0IGRlIHLDqWR1aXJlIGNvbnNpZMOpcmFibGVtZW50IGxlIHRlbXBzIGRlIGTDqWJvZ2Fn ZSBldCBsZSBmcmFtZXdvcmsgT2NzaWdlbiBwZXJtZXQgZGUgc2ltcGxpZmllciBiZWF1Y291cCBs YSBjb21tdW5pY2F0aW9uIGNsaWVudC1zZXJ2ZXVyIGV0IGRlIGTDqXZlbG9wcGVyIGF2ZWMgdW4g c2V1bCBldCBtw6ptZSBjb2RlIGxlcyBhcHBsaWNhdGlvbnMgV2ViIGV0IG1vYmlsZSBwb3VyIEFu ZHJvaWQNCiBldCBpT1MuIEplIHZvdXMgZG9ubmVyYWkgbGVzIGJhc2VzIGRlIGNlIHN0eWxlIGRl IHByb2dyYW1tYXRpb24gcHLDqWN1cnNldXIgZXQgdm91cyBtb250cmVyYWkgY29tbWVudCBmYWly ZSByYXBpZGVtZW50IHZvdHJlIHByZW1pw6hyZSBhcHBsaWNhdGlvbi4NCjwvcD4NCjxwPuKAlCA8 L3A+DQo8cD5BZnRlciB0aGUgdGFsa3MgdGhlcmUgd2lsbCBiZSBzb21lIHBpenphcyBvZmZlcmVk IGJ5IHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLXNmLm9yZyI+DQpPQ2FtbCBTb2Z0d2FyZSBG b3VuZGF0aW9uPC9hPiBhbmQgbGF0ZXIgb24gd2XigJlsbCBtb3ZlIHRvIGEgcHViIG5lYXJieSBh cyB1c3VhbC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMiI+T3RoZXIgT0NhbWwg TmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTIiPjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZGFkNGI3YyIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZ2RhZDRiN2MiPkZyb20gdGhlIG9jYW1sLm9yZyBibG9nPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkYWQ0YjdjIj4NCjxwPkhlcmUg YXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IDxhIGhyZWY9Imh0 dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxvZzwvYT4uIDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3RlY2guYWhyZWZzLmNvbS9w cm9maWxpbmctZHVuZS1idWlsZHMtYThkZTU4OWVjMjY4P3NvdXJjZT1yc3MtLS0tMzAzNjYyZDg4 YmFlLS1vY2FtbCI+UHJvZmlsaW5nIER1bmUgQnVpbGRzPC9hPg0KPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDEtMzEtYXJlLXlvdXItcHJvZ3JhbXMtZG9p bmctd2hhdC15b3UtdGhpbmstdGhleS1yZS1kb2luZy1pbnRyb2R1Y2luZy1tb25pdG9yaW5nLXRv b2xzLWZvci1tdWx0aWNvcmUtb2NhbWwiPkFyZSBZb3VyIFByb2dyYW1zIERvaW5nIFdoYXQgWW91 IFRoaW5rIFRoZXnigJlyZSBEb2luZz8gSW50cm9kdWNpbmcgTW9uaXRvcmluZyBUb29scyBmb3Ig TXVsdGljb3JlIE9DYW1sPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL21hdGguYW5kcmVq LmNvbS8yMDI0LzAxLzMwL3NwYWNlLWZpbGxpbmctY3VydmVzLWNvbnN0cnVjdGl2ZWx5LyI+U3Bh Y2UtZmlsbGluZyBjdXJ2ZXMsIGNvbnN0cnVjdGl2ZWx5PC9hPg0KPC9saT48L3VsPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnY2U2NjRjYyIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZ2NlNjY0Y2MiPk9sZCBDV048L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZ2NlNjY0Y2MiPg0KPHA+SWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1p dHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwg bWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRo ZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQg ZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSB0byB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdCI+DQpjYW1sLWxpc3Q8L2E+ LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnYzZmOTMzMSI+DQo8cD48YSBo cmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 2 Jan 2024 08:59:45 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 2 Jan 2024 08:59:45 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 2 Jan 2024 08:59:45 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 402900Tg000714 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 2 Jan 2024 09:00:01 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 4028xp3m000697 for ; Tue, 2 Jan 2024 08:59:52 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 Jan 2024 09:59:50 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 24031E0D5D; Tue, 2 Jan 2024 09:59:50 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 97AC1E004E for ; Tue, 2 Jan 2024 09:59:45 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jan 2024 09:59:44 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 89D11561260; Tue, 2 Jan 2024 09:59:42 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaPVoICzDGJywKzECX19KOxDInjg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 2 Jan 2024 08:59:22 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 819c67af-8374-4542-f8f2-08dc0b712a88 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,324,1695679200"; d="scan'208,217";a="75629395" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.479338, queueID=DD1F5561269 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <8CD073DF7B4F7247827F134EEF938A3E@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyNC0wMS0wMiBUdWUgMDk6NTcgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTIuMjYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMS4wOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIERlY2VtYmVyIDI2LCAyMDIzIHRvIEphbnVh cnkgMDIsIDIwMjQuDQo8L3A+DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9j LXRvYyI+DQo8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1v Zi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPmNhc3Rv cmUgMC4wLjEg4oCTIGEgcG9ydGFibGUgQ0EgU3RvcmUgd2l0aCBubyBkZXBlbmRlbmNpZXM8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5maXhnZW4gMC4xLjAgLSBhIENMSSB0b29sIGZvciBnZW5l cmF0aW5nIGZpeHR1cmVzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+OCBtb250aHMgb2YgT0Nh bWwgYWZ0ZXIgOCB5ZWFycyBvZiBIYXNrZWxsIGluIHByb2R1Y3Rpb248L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM0Ij5yaW90IDAuMC43IOKAkyBhbiBhY3Rvci1tb2RlbCBtdWx0aS1jb3JlIHNjaGVk dWxlciBmb3IgT0NhbWwgNTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5TcGF0aWFsIFNoZWxs IMK3IEEgd2luZG93cyBzd2l0Y2hlciBmb3IgaTMgYW5kIHN3YXkgaW1wbGVtZW50ZWQgaW4gT0Nh bWw8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNiI+T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9saT48 bGk+PGEgaHJlZj0iI29yZzM0MmRhMDAiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMSI+Y2FzdG9yZSAwLjAuMSDigJMgYSBwb3J0YWJsZSBDQSBTdG9yZSB3aXRoIG5v IGRlcGVuZGVuY2llczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWNhc3RvcmUtMC0wLTEtYS1wb3J0YWJsZS1jYS1zdG9yZS13aXRoLW5vLWRlcGVuZGVuY2llcy8x MzcxOS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2FzdG9yZS0wLTAtMS1h LXBvcnRhYmxlLWNhLXN0b3JlLXdpdGgtbm8tZGVwZW5kZW5jaWVzLzEzNzE5LzE8L2E+DQo8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2FhNDYxMTEiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhYTQ2MTExIj5vc3RlcmEgYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhYTQ2MTExIj4NCjxwPkhpIGZv bGtzISA6d2F2ZTogaGFwcHkgdG8gYW5ub3VuY2UgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2xlb3N0ZXJhL2Nhc3RvcmUiPg0KY2FzdG9yZSAwLjAuMTwvYT4uIDwvcD4NCjxwPjxiPnRsO2Ry PC9iPiBJ4oCZbSB0YWtpbmcgYSBwYWdlIGZyb20gdGhlIEVsaXhpciBjb21tdW5pdHnigJlzIHBs YXlib29rIGhlcmUsIHRoZSA8Y29kZT4NCkNhX3N0b3JlPC9jb2RlPiBtb2R1bGUgaW5jbHVkZXMg YW4gdXAtdG8tZGF0ZSBwdWJsaWMgY2VydGlmaWNhdGUgY2hhaW4gZnJvbSBhIGdlbmVyYWxseSB0 cnVzdHdvcnRoeSBzb3VyY2UgKGVnLiBNb3ppbGxhKSB0aGF0IHdl4oCZbGwgdXBkYXRlIHZpYSBD SSBhbmQgcHVibGlzaCBhdXRvbWF0aWNhbGx5IHRvDQo8Y29kZT5vcGFtPC9jb2RlPiBwZXJpb2Rp Y2FsbHkuIDwvcD4NCjxwPjxiPkhvdyB0byB1c2UgaXQ8L2I+IEVhc3ksIGp1c3QgPGNvZGU+b3Bh bSBpbnN0YWxsIGNhc3RvcmU8L2NvZGU+IGFuZCBpbiB5b3VyIDxjb2RlPg0KZHVuZS1wcm9qZWN0 PC9jb2RlPiBtYWtlIHN1cmUgdG8gdXNlIDxjb2RlPihjYXN0b3JlICgmZ3Q7PSAmcXVvdDswLjAu MCZxdW90OykpPC9jb2RlPiBzbyB5b3UgYXV0b21hdGljYWxseSB1cGdyYWRlIHRvIHRoZSBsYXRl c3QgY2VydGlmaWNhdGUuDQo8L3A+DQo8cD5Ob3cgeW91IGNhbiB1c2UgaXQgd2l0aCA8Y29kZT5v Y2FtbC10bHM8L2NvZGU+IGFuZCB3aGVuIHlvdSBuZWVkIHRoYXQgLnBlbSBmaWxlIHlvdSBjYW4g ZmVlZCBpdCB0aGUgY29udGVudHMgb2YNCjxjb2RlPkNhX3N0b3JlLnBlbTwvY29kZT4uIDwvcD4N CjxwPjxiPldoeSB3ZSBkaWQgdGhpczwvYj4gSSB3YXMgYnVpbGRpbmcgYW4gPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL2JsaW5rIj4NCkhUVFAgY2xpZW50PC9hPiBmb3IgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL3Jpb3QiPlJpb3Q8L2E+IGFuZCByZWFs aXplZCB0aGF0IHRvIHN1cHBvcnQgVExTIEnigJlkIG5lZWQgdG8gZWl0aGVyIGhhdmUgY3VzdG9t IGNlcnRpZmljYXRlcyBvciBicmluZyBpbg0KPGNvZGU+Y2Etc3RvcmU8L2NvZGU+IGFuZCBsZXQg aXQgcmVzb2x2ZSB0aGVtIGZyb20gdGhlIHN5c3RlbS4gPC9wPg0KPHA+VGhlIEVsaXhpciBjb21t dW5pdHnigJlzIGFwcHJvYWNoIHRvIHRoaXMgaXMgYSBsb3Qgc2ltcGxlci4gPC9wPg0KPHA+PGI+ V2hhdOKAmXMgbWlzc2luZy9uZXh0PC9iPiBUaGUgbGF0ZXN0IC5wZW0gZmlsZSB3YXMgdXBkYXRl ZCBvbiBEZWMgMTJ0aCBhbmQgSSBuZWVkIHRvIGJ1aWxkIHRoZSBzY2hlZHVsZWQgQ0kgd29ya2Zs b3cgdGhhdOKAmWxsIHVwZGF0ZSBpdCAvIHB1Ymxpc2ggdGhlIGxpYiwgc28gaWYgeW914oCZcmUg aW50byBjcnlwdG8gKG1heWJlIGkgY2FuIG5lcmRzbmlwZSBAaGFubmVzPykgb3IgY2kgKEB1bHJp a3N0cmlkPykgdGhlbiBwaW5nIG1lIDopDQo8L3A+DQo8cD5IYXBweSBoYWNraW5nISA6Y2FtZWw6 IDwvcD4NCjxwPi8gTGVhbmRybyA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnNzExNDE3MyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzcx MTQxNzMiPm9zdGVyYSBsYXRlciBhZGRlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnNzExNDE3MyI+DQo8cD5JIHNwZW50IGEgbGl0dGxlIHRpbWUgY29uc29s aWRhdGluZyB0aGF0IHByZXByb2Nlc3NpbmcgY29kZSBpbnRvIDxjb2RlPmNhc3RvcmU8L2NvZGU+ LCBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkv cHVsbC8yNDk5NCI+MC4wLjI8L2E+IGlzIG9uIGl0cyB3YXkgb24gb3BhbS4NCjwvcD4NCjxwPkl0 4oCZbGwgbGV0IHlvdSB3cml0ZSB0aGlzOiA8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRh aW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICNhNzYwMWY7Ij5kZWNvZGVfcGVtPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5jYTwvc3Bhbj4gPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jYTwvc3Bh bj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Dc3RydWN0Ljwvc3Bhbj5vZl9zdHJp bmcgY2EgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmlu PC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jZXJ0PC9zcGFuPiA9 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlg1MDkuQ2VydGlmaWNhdGUuPC9zcGFuPmRl Y29kZV9wZW0gY2EgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9s ZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZXN1bHQuPC9z cGFuPmdldF9vayBjZXJ0DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+aW48L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jYXM8 L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TGlzdC48L3NwYW4+bWFwIGRl Y29kZV9wZW0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q2Ffc3RvcmUuPC9zcGFuPmNl cnRpZmljYXRlcyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+aW48L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hdXRoZW50aWNh dG9yPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlg1MDkuQXV0aGVudGlj YXRvci48L3NwYW4+Y2hhaW5fb2ZfdHJ1c3QgfnRpbWUgY2FzIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnRsc19jb25maWc8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+VGxzLkNvbmZpZy48L3NwYW4+Y2xpZW50IH5hdXRoZW50aWNhdG9yICgpIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCjxz cGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Li4uPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICop PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5maXhn ZW4gMC4xLjAgLSBhIENMSSB0b29sIGZvciBnZW5lcmF0aW5nIGZpeHR1cmVzPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZml4Z2VuLTAtMS0wLWEtY2xpLXRvb2wt Zm9yLWdlbmVyYXRpbmctZml4dHVyZXMvMTM3MjAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWZpeGdlbi0wLTEtMC1hLWNsaS10b29sLWZvci1nZW5lcmF0aW5nLWZpeHR1cmVz LzEzNzIwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzcxN2UwMmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc3MTdlMDJjIj5NYXJjIENv cXVhbmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc3MTdlMDJjIj4NCjxwPkhleWEgZXZlcnlvbmUhIDwvcD4NCjxwPlRoaXMgd2Vla2VuZCBJ IGhhZCBzb21lIGZ1biBhbmQgYnVpbHQgYSA8YSBocmVmPSJodHRwczovL2NvZGViZXJnLm9yZy9t YXJjYy9maXhnZW4iPg0KZml4dHVyZSBnZW5lcmF0b3I8L2E+IGluIE9DYW1sISBJdCBpcyBteSB2 ZXJ5IGZpcnN0IERTTC4gPC9wPg0KPHA+SSBmb3VuZCBpdCB2ZXJ5IHRpbWUgY29uc3VtaW5nIHRv IHNldCB1cCB0ZXN0IGRhdGEsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggcmVsYXRpb25h bCBkYXRhLCB3aGVyZSBzb21lIGRhdGEgZ2VuZXJhdGVkIG5lZWRzIHRvIHJlZmVyZW5jZSBzb21l IG90aGVyIGRhdGEuIFRoZXJlZm9yZSwgSSB3YW50ZWQgYSBzbGltIERTTCB0aGF0IGNhbiBiZSB1 c2VkIHRvIHF1aWNrbHkgZ2VuZXJhdGUgdGVzdCBkYXRhIHdoaWNoIEkgY2FuIGltcG9ydA0KIGl0 IGludG8gU1FMIG9yIE5vU1FMLiA8L3A+DQo8cD5TbyB0byBnaXZlIGFuIGV4YW1wbGU6IDwvcD4N CjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdhZTkxYmRhIj4NCn46IGZpeGdlbiAndXNlciAo Mik6IGlkIHV1aWR2NCwgbmFtZSBuYW1lOyBvcmRlciAoNSk6IGlkIHV1aWR2NCwgYnV5ZXIgdXNl ci5pZCwgYW1vdW50IGludCgxLDQwKSwgY3VycmVuY3kNCigmcXVvdDtVU0QmcXVvdDssJnF1b3Q7 TVhOJnF1b3Q7KScNCg0KRklMRSBOQU1FOiB1c2VyDQpuYW1lLGlkDQpJdmFuLDFhYTJmNjUwLTk1 YjItNDc3YS05Y2NmLTg4YzQ2ZDkyN2U0ZQ0KSnVkeSwwYmI3MjU4Zi04ODQzLTQ5OTctOTdhOC0w ODM1MTYyM2E5ZDENCg0KRklMRSBOQU1FOiBvcmRlcg0KY3VycmVuY3ksYW1vdW50LGJ1eWVyLGlk DQpVU0QsMTQsMWFhMmY2NTAtOTViMi00NzdhLTljY2YtODhjNDZkOTI3ZTRlLDQyMzYyZThkLTJj MjItNDQzYS04ODUxLTYyZTliMmNkMThjZg0KTVhOLDE5LDBiYjcyNThmLTg4NDMtNDk5Ny05N2E4 LTA4MzUxNjIzYTlkMSxlYmNjZjhkYi1kZTViLTQ3NDQtYmQ5OS03ZTI5OWZiMzEwN2ENCk1YTiwx NywxYWEyZjY1MC05NWIyLTQ3N2EtOWNjZi04OGM0NmQ5MjdlNGUsYjIzZWU4NmQtZDY5ZS00Mjcw LTkxNTYtOTQ0Mjc3YTQ2ZWExDQpNWE4sMzIsMWFhMmY2NTAtOTViMi00NzdhLXB1cmNoYXNlOWNj Zi04OGM0NmQ5MjdlNGUsY2M5ZDA1YzItNDkyMS00MTVkLTgyMGUtNDcxM2FlZmQ1NTkzDQpVU0Qs MjksMWFhMmY2NTAtOTViMi00NzdhLTljY2YtODhjNDZkOTI3ZTRlLDkyMTczOGRhLWIwZTMtNGQ1 MC1hYzdlLWQyNDM4MDVlY2ZlOA0KPC9wcmU+DQo8cD5JdCBjYW4gYWxzbyBleHBvcnQgdG8gSlNP TiEgPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZ2Y1MTEzODIiPg0KfjogZml4Z2Vu ICd1c2VyICgyKTogaWQgdXVpZHY0LCBuYW1lIG5hbWU7IHB1cmNoYXNlICg1KTogaWQgdXVpZHY0 LCBidXllciB1c2VyLmlkLCBhbW91bnQgaW50KDEsNDApLCBjdXJyZW5jeQ0KKCZxdW90O1VTRCZx dW90OywmcXVvdDtNWE4mcXVvdDspJyAtZiBqc29uDQoNCkZJTEUgTkFNRTogdXNlcg0KW3smcXVv dDtuYW1lJnF1b3Q7OiAmcXVvdDtJdmFuJnF1b3Q7LCAmcXVvdDtpZCZxdW90OzogJnF1b3Q7ZjZj OTBmOTYtZmFhZC00NzQxLWE1MmItNmQ1M2I5NGQ0OGYzJnF1b3Q7fSwgeyZxdW90O25hbWUmcXVv dDs6ICZxdW90O0p1ZHkmcXVvdDssICZxdW90O2lkJnF1b3Q7Og0KJnF1b3Q7NTdlY2NjNWMtYWQw OS00MjI5LWIwYzctYTgyODI4MGRiYTFiJnF1b3Q7fV0NCg0KRklMRSBOQU1FOiBwdXJjaGFzZQ0K W3smcXVvdDtjdXJyZW5jeSZxdW90OzogJnF1b3Q7VVNEJnF1b3Q7LCAmcXVvdDthbW91bnQmcXVv dDs6IDE0LCAmcXVvdDtidXllciZxdW90OzogJnF1b3Q7ZjZjOTBmOTYtZmFhZC00NzQxLWE1MmIt NmQ1M2I5NGQ0OGYzJnF1b3Q7LCAmcXVvdDtpZCZxdW90OzoNCiZxdW90OzhlNTkwNzVjLTFhNmEt NDA5My04NmNhLWUxMTM1YWZkMzRmMyZxdW90O30sIHsmcXVvdDtjdXJyZW5jeSZxdW90OzogJnF1 b3Q7TVhOJnF1b3Q7LCAmcXVvdDthbW91bnQmcXVvdDs6IDE5LCAmcXVvdDtidXllciZxdW90OzoN CiZxdW90OzU3ZWNjYzVjLWFkMDktNDIyOS1iMGM3LWE4MjgyODBkYmExYiZxdW90OywgJnF1b3Q7 aWQmcXVvdDs6ICZxdW90O2ZkODlhZDMwLWFmMDctNGM5ZC05ZWM0LWFkZTc1ODNlOWNmMCZxdW90 O30sIHsmcXVvdDtjdXJyZW5jeSZxdW90OzogJnF1b3Q7TVhOJnF1b3Q7LA0KJnF1b3Q7YW1vdW50 JnF1b3Q7OiAxNywgJnF1b3Q7YnV5ZXImcXVvdDs6ICZxdW90O2Y2YzkwZjk2LWZhYWQtNDc0MS1h NTJiLTZkNTNiOTRkNDhmMyZxdW90OywgJnF1b3Q7aWQmcXVvdDs6ICZxdW90O2IxNWNkM2Q3LWVk ZTEtNDYxMi1iMGYyLWEzNmNjMWE3M2YxYyZxdW90O30sDQp7JnF1b3Q7Y3VycmVuY3kmcXVvdDs6 ICZxdW90O01YTiZxdW90OywgJnF1b3Q7YW1vdW50JnF1b3Q7OiAzMiwgJnF1b3Q7YnV5ZXImcXVv dDs6ICZxdW90O2Y2YzkwZjk2LWZhYWQtNDc0MS1hNTJiLTZkNTNiOTRkNDhmMyZxdW90OywgJnF1 b3Q7aWQmcXVvdDs6DQomcXVvdDsyOTVhODViOC00MmQ5LTQ5YTQtOGNlNi1lNGQ3YjFhOTRlYTkm cXVvdDt9LCB7JnF1b3Q7Y3VycmVuY3kmcXVvdDs6ICZxdW90O1VTRCZxdW90OywgJnF1b3Q7YW1v dW50JnF1b3Q7OiAyOSwgJnF1b3Q7YnV5ZXImcXVvdDs6DQomcXVvdDtmNmM5MGY5Ni1mYWFkLTQ3 NDEtYTUyYi02ZDUzYjk0ZDQ4ZjMmcXVvdDssICZxdW90O2lkJnF1b3Q7OiAmcXVvdDs5MjVlZmY5 NS1iN2EyLTRjYmUtOTNiOS1iNTE5MzcyYTE2Y2YmcXVvdDt9XQ0KPC9wcmU+DQo8cD5Gb3Igbm93 IGl0IGRvZXNu4oCZdCBoYXZlIG1hbnkgZ2VuZXJhdG9ycyAoSSBwbGFuIHRvIGFkZCBtb3JlKSwg dGhlIGRvY3MgYXJlIGEgYml0IHNwYXJzZSBhbmQgSSBkb27igJl0IGtub3cgaWYgSSBzaGFyZWQg dGhlIGNvbXBpbGVkIGJpbmFyeSBjb3JyZWN0bHkuIEhvd2V2ZXIsIEkgd2FudGVkIHRvIHNoYXJl IGl0IGVhcmx5IHRvIGdhdGhlciBmZWVkYmFjayENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSIzIj44IG1vbnRocyBvZiBPQ2FtbCBhZnRlciA4IHllYXJzIG9mIEhhc2tlbGwgaW4gcHJv ZHVjdGlvbjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvOC1tb250aHMt b2Ytb2NhbWwtYWZ0ZXItOC15ZWFycy1vZi1oYXNrZWxsLWluLXByb2R1Y3Rpb24vMTM3MjkvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvOC1tb250aHMtb2Ytb2NhbWwtYWZ0ZXItOC15 ZWFycy1vZi1oYXNrZWxsLWluLXByb2R1Y3Rpb24vMTM3MjkvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzVkNWIxNSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzc1ZDViMTUiPkRtaXRyaWkgS292YW5pa292IGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNzVkNWIxNSI+DQo8cD5IaSBl dmVyeW9uZSA6d2F2ZTogPC9wPg0KPHA+SeKAmXZlIGJlZW4gdXNpbmcgSGFza2VsbCBpbiBwcm9k dWN0aW9uIGZvciB0aGUgcHJldmlvdXMgOCB5ZWFycy4gQnV0IGZvciB0aGUgbGFzdCA4IG1vbnRo cywgSSB1c2VkIE9DYW1sIGF0IEJsb29tYmVyZy4NCjwvcD4NCjxwPkkgd3JvdGUgYSBibG9nIHBv c3QgY29tcGFyaW5nIHR3byBsYW5ndWFnZXMgZnJvbSBteSBQT1Y6IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2Rldi50by9jaHNoZXJzaC84LW1vbnRocy1v Zi1vY2FtbC1hZnRlci04LXllYXJzLW9mLWhhc2tlbGwtaW4tcHJvZHVjdGlvbi1oOTYiPkRldi50 bzogOCBtb250aHMgb2YgT0NhbWwgYWZ0ZXIgOCB5ZWFycyBvZiBIYXNrZWxsIGluIHByb2R1Y3Rp b24gKGJ5IEBjaHNoZXJzaCk8L2E+DQo8L2xpPjwvdWw+DQo8cD5JIHRyaWVkIHRvIHByb3ZpZGUg YSByZWFzb25hYmxlIGFuZCBiYWxhbmNlZCBvdmVydmlldyBvZiB0aGVzZSB0d28gbGFuZ3VhZ2Vz LCBhbHRob3VnaCBteSBleHBlcmllbmNlIGluIGJvdGggaXMgc2lnbmlmaWNhbnRseSBkaWZmZXJl bnQuIEkgaG9wZSB0aGlzIGJsb2cgcG9zdCBjYW4gZ2l2ZSBhIHJvdWdoIGlkZWEgb2YgYm90aCBs YW5ndWFnZXMgOnJlbGlldmVkOg0KPC9wPg0KPHA+RW5qb3khIEFuZCBsZXQgbWUga25vdyBhbnkg ZmVlZGJhY2sgeW91IGhhdmUhIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5yaW90 IDAuMC43IOKAkyBhbiBhY3Rvci1tb2RlbCBtdWx0aS1jb3JlIHNjaGVkdWxlciBmb3IgT0NhbWwg NTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJpb3QtMC0wLTct YW4tYWN0b3ItbW9kZWwtbXVsdGktY29yZS1zY2hlZHVsZXItZm9yLW9jYW1sLTUvMTM3MzIvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJpb3QtMC0wLTctYW4tYWN0b3ItbW9k ZWwtbXVsdGktY29yZS1zY2hlZHVsZXItZm9yLW9jYW1sLTUvMTM3MzIvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOGQyYWI0ZSIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzhkMmFiNGUiPm9zdGVyYSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzhkMmFiNGUiPg0KPHA+SGkgZm9sa3Mg OndhdmU6IHdlIHNraXBwZWQgb3ZlciAwLjAuNiBiZWNhdXNlIG9mIGEgQ0kgYnVnLCBhbmQgZW5k ZWQgdXAgcmVsZWFzaW5nIFJpb3QNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL3AvcmlvdC8w LjAuNyI+MC4wLjc8L2E+IGluc3RlYWQgOnNsaWdodF9zbWlsZTogPC9wPg0KPHA+SGVyZeKAmXMg YSBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzLiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZ2I3NDBlMzkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdiNzQw ZTM5Ij5TaW5nbGUgcHVibGljIHBhY2thZ2U8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZ2I3NDBlMzkiPg0KPHA+VGhlIHB1YmxpYyBzdXJmYWNlIG9mIHRoZSBS aW90IHBhY2thZ2Ugc2hvdWxkIGJlIGxpbWl0ZWQgbm93IHRvIHRoZSB0b3AtbGV2ZWwgYFJpb3Rg IG1vZHVsZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdmZDA2NDg4IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZmQwNjQ4OCI+SW50 cm9kdWNlIGRlZGljYXRlZCBJL08gU2NoZWR1bGVyPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmdmZDA2NDg4Ij4NCjxwPlRvIGltcHJvdmUgbG9uZy10YWlsIGxh dGVuY3kgd2hlbiBkb2luZyBJL08sIHdl4oCZcmUgc3BsaXR0aW5nIG91dCB0aGUgcG9sbCBsb29w IG91dCBvZiB0aGUgbWFpbiBzY2hlZHVsZXJzIGFuZCB1c2luZyBhIGRlZGljYXRlZCB0aHJlYWQg Zm9yIHBvbGxpbmcgSS9PLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzg2NDliNDciIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4NjQ5 YjQ3Ij5JbXByb3ZlZCBJL08gcHJpbWl0aXZlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnODY0OWI0NyI+DQo8cD5UaGUgcnVudGltZSBub3cgc2hpcHMgd2l0 aCBhbiBJTyBhbmQgYSBCdWZmZXIgbW9kdWxlIHRoYXQgaW5jbHVkZXMgbW9yZSBsb3ctbGV2ZWwg ZnVuY3Rpb25zOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnRvIGRvIHZlY3Rvcml6 ZWQgcmVhZHMvd3JpdGVzLCA8L2xpPjxsaT5hd2FpdCBmb3IgZmlsZSBkZXNjcmlwdG9yIGF2YWls YWJpbGl0eSAoZm9yIHJlYWRpbmcsIHdyaXRpbmcsIG9yIGJvdGgpLCA8L2xpPjxsaT5jb3B5IGRh dGEgYmV0d2VlbiBidWZmZXJzIDwvbGk+PGxpPndyaXRlIGJ1ZmZlcnMgZGlyZWN0bHkgdG8gd3Jp dGVycyA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnODRmZjk0MCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzg0ZmY5NDAiPkkv TyBSZWFkZXJzICZhbXA7IFdyaXRlcnM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQi IGlkPSJ0ZXh0LW9yZzg0ZmY5NDAiPg0KPHA+V2XigJlyZSBpbnRyb2R1Y2luZyA8Yj5SZWFkZXIv V3JpdGVyPC9iPiB0byBidWlsZCBSZWFkL1dyaXRlIHN0cmVhbWluZyBwaXBlbGluZXMgbGlrZSB5 b3XigJlkIGRvIGluIFJ1c3Qgd2l0aCB0aGUgUmVhZC9Xcml0ZSB0cmFpdHMuDQo8L3A+DQo8cD5U aGlzIG9uZSBpcyBwYXJ0aWN1bGFybHkgZXhjaXRpbmcgYmVjYXVzZSB3ZSBjYW4gbm93IHdyaXRl IHN1cGVyIGNsZWFuIHRyYW5zZm9ybWF0aW9ucyBvZiBkYXRhIHRoYXQgY2FuIGJlIG1hZGUgc3Vw ZXIgZWZmaWNpZW50LCBhbmQgYXJlIHRyYWNrZWQgYXQgdGhlIHR5cGUtbGV2ZWwsIGxpa2UgdGhp czoNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNy YyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmZpbGU8L3NwYW4+ ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RmlsZS48L3NwYW4+b3Blbl9yZWFkIDxz cGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O3Rlc3QmcXVvdDs8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5bIGByIF0g RmlsZS50PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRh bGljOyI+ICopPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdo dDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cmVhZDwv c3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5GaWxlLjwvc3Bhbj50b19yZWFk ZXIgZmlsZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ aW48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGlj OyI+KCogIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0 YWxpYzsiPlsgYHIgXSBGaWxlLnQgUmVhZGVyLnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAj OGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICopPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA3YTlmOyI+ZGVjcnlwdDwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5EZWNyeXB0Ljwvc3Bhbj5vZl9yZWFkZXIgcmVhZCA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+WyBgciBdIEZpbGUudCBEZWNyeXB0 LnQgUmVhZGVyLnQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxl OiBpdGFsaWM7Ij4gKik8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij51 bnppcDwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5VbnppcC48L3NwYW4+ b2ZfcmVhZGVyIHJlYWQgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPmluPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6 IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPlsgYHIgXSBGaWxlLnQgRGVjcnlwdC50IFVuemlwLnQgUmVhZGVyLnQ8L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8 L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5kYXRhPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPklPLkJ1ZmZl ci50PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGlj OyI+ICopPC9zcGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IGJ1ZiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PklPLkJ1ZmZlci48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+d2l0aF9jYXBh Y2l0eTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MTAyNDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0K ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0Kjwv c3Bhbj4gbGVuID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SU8uUmVhZGVyLjwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5yZWFkPC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij51bnppcDwvc3Bhbj4gfjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5 ZjsiPmJ1Zjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5JTy5CdWZm ZXIuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnN1Yjwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YnVmPC9zcGFuPiB+PHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA3YTlmOyI+bGVuPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250 LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBm b250LXN0eWxlOiBpdGFsaWM7Ij4uLi48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRh OyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhp cyB3aWxsIHB1bGwgMTAyNCBieXRlcyBvdXQgb2YgdGhpcyBzdHJlYW0sIGxhemlseSByZWFkaW5n IGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBjaGFpbi4gQW5kIGlmIHlvdSB3YW50IGl0IGJ1ZmZlcmVk LCB5b3UganVzdCBnb3R0YSBjYWxsLg0KPGNvZGU+SU8uUmVhZGVyLmJ1ZmZlcmVkIHJlYWRlcjwv Y29kZT4gYW5kIHlvdeKAmXJlIGdvb2QgdG8gZ28uIDwvcD4NCjxwPlRoZXNlIG5ldyBpbnRlcmZh Y2VzIGFyZSBhdmFpbGFibGUgZm9yIHRoZSBuZXcgRmlsZSBtb2R1bGUgYXMgd2VsbCBhcyBmb3Ig dGhlIE5ldC5Tb2NrZXQgbW9kdWxlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNSI+U3BhdGlhbCBTaGVsbCDCtyBBIHdpbmRvd3Mgc3dpdGNoZXIgZm9yIGkzIGFuZCBz d2F5IGltcGxlbWVudGVkIGluIE9DYW1sPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tc3BhdGlhbC1zaGVsbC1hLXdpbmRvd3Mtc3dpdGNoZXItZm9yLWkzLWFuZC1z d2F5LWltcGxlbWVudGVkLWluLW9jYW1sLzEzNzQ3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1zcGF0aWFsLXNoZWxsLWEtd2luZG93cy1zd2l0Y2hlci1mb3ItaTMtYW5kLXN3 YXktaW1wbGVtZW50ZWQtaW4tb2NhbWwvMTM3NDcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnMTg0ZGQ3NiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzE4NGRkNzYiPlRob21hcyBMZXRhbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE4NGRkNzYiPg0KPHA+SGkgZm9sa3MgOndhdmU6 IEkgaGF2ZSBiZWVuIHdpbGxpbmcgdG8gc2hhcmUgU3BhdGlhbCBTaGVsbCBoZXJlIGZvciBhIHdo aWxlIG5vdywgbW9zdGx5IGJlY2F1c2UgaXQgaXMgaW1wbGVtZW50ZWQgaW4gT0NhbWwgc28gaXTi gJlzIGEgZ29vZCB3YXkgZm9yIG1lIHRvIGZpbmQgcG90ZW50aWFsIGNvbnRyaWJ1dG9ycyBhaGFo ICh1bmZvcnR1bmF0ZWx5LCB0aGUgY29kZWJhc2UgY291bGQgYmUgbW9yZSBjb21tZW50ZWQgdGJo KS4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sdGhtcy9zcGF0aWFsLXNoZWxsIj5TcGF0 aWFsIFNoZWxsPC9hPiBpbXBsZW1lbnRzIGEgc3BhdGlhbCBtb2RlbCBpbnNwaXJlZCBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9tYXRlcmlhbC1zaGVsbC5jb20iPk1hdGVyaWFsIFNoZWxsPC9hPiBmb3Ig aTMgYW5kIHN3YXkuIEkgaGF2ZSB2ZXJ5IHJlY2VudGx5IHRhZ2dlZCBpdHMgNnRoIHJlbGVhc2Us IGFuZCBJIGJlbGlldmUgbm93IGlzIGEgZ29vZCB0aW1lIHRvIHRyeSBhbmQgcHV0IGl0IGluIHRo ZSBoYW5kcyBvZiBvdGhlciBodW1hbiBiZWluZ3MuIFdoYXQgbWlnaHQgZ28gd3Jvbmc/IDpzd2Vh dF9zbWlsZToNCjwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbHRobXMv c3BhdGlhbC1zaGVsbCNzcGF0aWFsLXNoZWxsIj48Y29kZT5SRUFETUU8L2NvZGU+PC9hPiBzaG91 bGQgYmUgY29tcHJlaGVuc2l2ZSBlbm91Z2ggdG8gZ2V0IHlvdSBzdGFydGVkLCBhbmQNCjxhIGhy ZWY9Imh0dHBzOi8vc29hcC5jb2ZmZWUvfmx0aG1zL3Bvc3RzL1NwYXRpYWxTaGVsbDYuaHRtbCI+ SeKAmXZlIGFsc28gcHVibGlzaGVkIGEgc2hvcnQgYmxvZ3Bvc3Q8L2E+IGdpdmluZyBhIGJpdCBt b3JlIGJhY2tncm91bmQgb24gbXkgU3BhdGlhbCBTaGVsbCBqb3VybmV5LCBhbmQgaGFzIGEgbmlj ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9zcGF0aWFsLXNoZWxsLmFwcC9kZW1vLm1wNCI+dmlkZW88L2E+ IHlvdSBjYW4gd2l0Y2ggaWYgeW91IGFyZSBjdXJpb3VzLg0KPC9wPg0KPHA+SWYgeW91IHJ1biBp bnRvIHByb2JsZW1zIHdoaWxlIHRyeWluZyB0byB0ZXN0LCBkbyBub3QgaGVzaXRhdGUgdG8gcmVh Y2ggb3V0ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbHRobXMvc3BhdGlhbC1zaGVsbC9p c3N1ZXMiPkdpdEh1YiBpc3N1ZXM8L2E+IGFyZSBwcm9iYWJseSB0aGUgYmVzdCB3YXkgdG8gZG8g c28pLiBJIGRvIGhvcGUgU3BhdGlhbCBTaGVsbCBiZWNvbWVzIGEgdXNhYmxlIHByb2dyYW1zIGZv ciBhbnlvbmUgaW50ZXJlc3RlZA0KIGluIHRoZSB3b3JrZmxvdyBpdCBlbmFibGVzIG9uIGkzL3N3 YXkgZGVza29wLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+T3RoZXIgT0NhbWwg TmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+PC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwZTRmNGNkIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnMGU0ZjRjZCI+RnJvbSB0aGUgb2NhbWwub3JnIGJsb2c8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzBlNGY0Y2QiPg0KPHA+SGVyZSBh cmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgPGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9yZyBibG9nPC9hPi4gPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8y MDIzLTEyLTI5LWFubm91bmNpbmctdGhlLW9yY2hpZGUtcHJvamVjdC1wb3dlcmluZy1zYXRlbGxp dGUtaW5ub3ZhdGlvbiI+QW5ub3VuY2luZyB0aGUgT1JDSElERSBQcm9qZWN0OiBQb3dlcmluZyBT YXRlbGxpdGUgSW5ub3ZhdGlvbjwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM0MmRhMDAiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSJvcmczNDJkYTAwIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC1vcmczNDJkYTAwIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlz cyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlx dWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91 LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+ Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkg bWFpbCwgeW91IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5y aWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBj bGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZ2I1YTUyZWQiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 26 Dec 2023 10:12:49 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 26 Dec 2023 10:12:48 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 26 Dec 2023 10:12:48 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BQAD21E013664 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 26 Dec 2023 10:13:02 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BQACr1N013648 for ; Tue, 26 Dec 2023 10:12:53 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 26 Dec 2023 11:12:53 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id F35A8E0CCC; Tue, 26 Dec 2023 11:12:51 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id AFA4CE004E for ; Tue, 26 Dec 2023 11:12:46 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Dec 2023 11:12:46 +0100 Received: from tm.home (lfbn-ren-1-1297-32.w86-229.abo.wanadoo.fr [86.229.144.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 518015605D3; Tue, 26 Dec 2023 11:12:32 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaN+QUD4trEm312UmkqtnNo3GMnw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 26 Dec 2023 10:12:18 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: afd96f20-8bdb-4cae-fccc-08dc05fb3688 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,306,1695679200"; d="scan'208,217";a="144036559" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.491632, queueID=A4A135605D4 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMi0yNiBUdWUgMTE6MTAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTIuMTkuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyNC4wMS4wMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIERlY2VtYmVyIDE5IHRvIDI2LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5SZWxlYXNlIG9mIG9kb2MgMi40 LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5QcHhsaWIgZGV2IG1lZXRpbmdzPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjMyI+Z3JpZCAwLjEuMCAtIEEgdGlueSBsaWJyYXJ5IGZvciB0d28tZGlt ZW5zaW9uYWwgYXJyYXlzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+RHJhZnQgdHV0b3JpYWxz IG9uIE1vZHVsZXMsIEZ1bmN0b3JzIGFuZCBMaWJyYXJpZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 IiM1Ij5Fc3BlcmFudG8sIHdoZW4gT0NhbWwgbWVldHMgQ29zbW9wb2xpdGFuPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjNiI+T0NhbWwgaW4gY3VsdHVyYWwgaGVyaXRhZ2U8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM3Ij5jb2xvcnMgMC4wLjEg4oCTIGNvbG9yc3BhY2UgbWFuaXB1bGF0aW9uIGluIHB1 cmUgT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5PQ2FtbCBpcyA8Yj5hd2Vzb21lPC9i PjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiNvcmc2ZTU3YWU2Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjEiPlJlbGVhc2Ugb2Ygb2RvYyAyLjQuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Utb2Ytb2RvYy0yLTQtMC8xMzY3Ni8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1vZG9jLTItNC0wLzEzNjc2LzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjEyNDExMCIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2IxMjQxMTAiPkVtaWxlIFRyb3RpZ25vbiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Ix MjQxMTAiPg0KPHA+VGhlIG9kb2MgdGVhbSBpcyBkZWxpZ2h0ZWQgdG8gYW5ub3VuY2UgdGhlIHJl bGVhc2Ugb2Ygb2RvYyAyLjQuMC4gSXQgbWFpbmx5IGNvbnRhaW5zIHN1cHBvcnQgZm9yIHNlYXJj aCBlbmdpbmVzLiBUaGVyZSBhcmUgb2YgY291cnNlIGJ1Z2ZpeGVzIGFuZCBzbWFsbGVyIG5ldyBm ZWF0dXJlcy4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGEx NThjMiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzRhMTU4YzIiPjpzdGFyMjogU3Bv dGxpZ2h0IEZlYXR1cmUgb2YgT2RvYyAyLjQuMCA6IFNlYXJjaDwvaDQ+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNGExNThjMiI+DQo8cD5PZG9jIG5vdyBzdXBwb3J0 IHNlYXJjaGluZyBpbiB0aGUgZG9jdW1lbnRhdGlvbiAhIFRoZSBzZWFyY2ggaXMgbWFkZSB0byBy dW4gaW4gdGhlIGJyb3dzZXIsIHNvIHRoYXQgeW91IGRvIG5vdCBuZWVkIGEgc2VydmVyIHRvIGVu YWJsZSBzZWFyY2g6IHlvdSBjYW4gaGF2ZSBzZWFyY2ggb24geW91ciBkb2N1bWVudGF0aW9uIGhv c3RlZCBvbiBnaXRodWIgcGFnZXMgb3IgZXZlbiBsb2NhbGx5IG9uIHlvdXIgbWFjaGluZS4NCjwv cD4NCjxwPk5vIHNlYXJjaCBlbmdpbmUgaXMgc2hpcHBlZCB3aXRoLCB5b3UgbmVlZCB0byBwcm92 aWRlIG9uZSwgYnV0IGFsbCB0aGUgZmFjaWxpdGllcyB0byBtYWtlIHVzZSBvZiBvbmUgYXJlIHBy ZXNlbnQuIFdlIGFkYXB0ZWQgQGFydC13IOKAmXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9hcnQtdy9zaGVybG9kb2MvdHJlZS9qc29vIj5zaGVybG9kb2M8L2E+IGZvciBzZWFtbGVzcyBp bnRlZ3JhdGlvbiB3aXRoIG9kb2MsIGFsb25nc2lkZSB3aXRoIG5ldyBmZWF0dXJlcy4gSXQgaXMg bm90IHlldCByZWxlYXNlZCBvbiBvcGFtLCBidXQgd2UgaG9wZSBpdCB3aWxsIGJlIHNvb24uDQo8 L3A+DQo8cD5Zb3UgY2FuIGFscmVhZHkgdGVzdCBzaGVybG9kb2MgYW5kIHBsYXkgd2l0aCBpdCBv biB5b3VyIG93biBwcm9qZWN0cywgdGhlcmUgYXJlIGluc3RydWN0aW9ucyBpbiBpdHMNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcnQtdy9zaGVybG9kb2MvYmxvYi9qc29vL1JFQURNRS5t ZCI+cmVhZG1lPC9hPi4gU2hlcmxvZG9jIGhhcyBmdXp6eSB0eXBlZC1iYXNlZCBzZWFyY2ggbGlr ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9ob29nbGUuaGFza2VsbC5vcmcvIj5ob29nbGU8L2E+IGluIHRo ZSBoYXNrZWxsIHdvcmxkLCBhbmQgaXMgbWFkZSB0byB3b3JrIGJlc3QgZm9yIE9DYW1sICh1bmxp a2UgYSBnZW5lcmFsIHB1cnBvc2Ugc2VhcmNoIGVuZ2luZSBsaWtlIGVsYXN0aWMgc2VhcmNoKS4N CjwvcD4NCjxwPkNoZWNrIHRoZSByZXN1bHRzIG9uIG9kb2PigJlzIG93biBvbmxpbmUgZG9jdW1l bnRhdGlvbiA6IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2MvIj4NCm9jYW1s LmdpdGh1Yi5pby9vZG9jPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2UxM2U5YjkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdl MTNlOWI5Ij46aGFuZHNoYWtlOiBKb2luIFRoZSBNaXNzaW9uPC9oND4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdlMTNlOWI5Ij4NCjxwPldoaWxlIHdlIGFyZSBkZWRp Y2F0ZWQgdG8gZGV2ZWxvcGluZyB0aGUgYmVzdCB0b29saW5nIHRvIGdlbmVyYXRlIGFuZCBzZXJ2 ZSBkb2N1bWVudGF0aW9uIG9uIE9DYW1sLm9yZywgY3JlYXRpbmcgYSB3ZWxsLWRvY3VtZW50ZWQg bGlicmFyeSBlY29zeXN0ZW0gY2FuIG9ubHkgYmUgYSBjb2xsZWN0aXZlIGVmZm9ydC4gUGFja2Fn ZSBhdXRob3JzOiB3ZeKAmXJlIHdvcmtpbmcgaGFyZCB0byBnaXZlIHlvdSBncmVhdCB0b29scywg YnV0IHdl4oCZbGwgbmVlZA0KIGFsbCB5b3VyIGhlbHAgdG8gY3JlYXRlIGFuIGVjb3N5c3RlbSBv ZiB3ZWxsLWRvY3VtZW50ZWQgbGlicmFyaWVzIGZvciBPQ2FtbCEgPC9wPg0KPHA+SWYgeW91IGZp bmQgdGhhdCB3cml0aW5nIGRvY3VtZW50YXRpb24gZm9yIHlvdXIgbGlicmFyeSBpc27igJl0IGFz IHN0cmFpZ2h0Zm9yd2FyZCBhcyB5b3Ugd291bGQgbGlrZSwgcGxlYXNlIGRvIHNoYXJlIHlvdXIg ZmVlZGJhY2sgd2l0aCB1cy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc2N2ZmZGIxIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNjdm ZmRiMSI+OmdlYXI6IEZ1bGwgY2hhbmdlbG9nPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmc2N2ZmZGIxIj48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT48YSBpZD0ib3JnYjM3ZDcyMiI+PC9hPkFkZGVkPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2IzN2Q3MjIiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFk ZCBzdXBwb3J0IGZvciBleHRlcm5hbCBzZWFyY2ggZW5naW5lcyAoQHBhbmdsZXNkLCBARW1pbGVU cm90aWdub24sICM5NzIpIFRoaXMgaW5jbHVkZXMgdGhlIGdlbmVyYXRpb24gb2YgYW4gaW5kZXgg YW5kIHRoZSBkaXNwbGF5IG9mIHRoZSByZXN1bHRzIGluIHRoZSBVSSAoSFRNTCBvbmx5KS4NCjwv bGk+PGxpPkRpc3BsYXkg4oCZcHJpdmF0ZeKAmSBrZXl3b3JkIGZvciBwcml2YXRlIHR5cGUgZXh0 ZW5zaW9ucyAoQGdwZXRpb3QsICMxMDE5KSA8L2xpPjxsaT5BbGxvdyB0byBvbWl0IHBhcmVudCB0 eXBlIGluIGNvbnN0cnVjdG9yIHJlZmVyZW5jZSAoQHBhbmdsZXNkLCBARW1pbGVUcm90aWdub24s ICM5MzMpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdkMGJjMTM4Ij48 L2E+Rml4ZWQ8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZDBi YzEzOCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2FybiBhbmQgZXhpdCB3aGVuIHRhYmxl KHMpIGlzIG5vdCBjbG9zZWQgKEBsdWJlZ2FzaW1vbiwgIzEwNTApIDwvbGk+PGxpPkhpbnQgd2hl biBsaXN0KHMpIGlzIG5vdCBjbG9zZWQgKEBsdWJlZ2FzaW1vbiwgIzEwNTApIDwvbGk+PGxpPkZp eCBjcmFzaCBvbiBmdW5jdG9ycyByZXR1cm5pbmcgYW4gYWxpYXMgKEBKdWxvdywgIzEwNDYpIDwv bGk+PGxpPkZpeCByZW5kZXJpbmcgb2YgcG9seW1vcnBoaWMgdmFyaWFudHMgKEB3aWtrdSwgQHBh bmdsZXNkLCAjOTcxKSA8L2xpPjxsaT5BZGQgcmVmZXJlbmNlcyB0byBleHRlbnNpb24gZGVjbGFy YXRpb25zIChAZ3BldGlvdCwgQHBhbmdsZXNkLCAjOTQ5KSA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv bGk+PGxpPjxhIGlkPSJvcmdmNjUzMTk5Ij48L2E+Q2hhbmdlZDxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdmNjUzMTk5Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5TdHlsZTogQWRqdXN0ZWQgbGluZSBoZWlnaHQgaW4gdGhlIFRPQyB0byBpbXByb3ZlIHJl YWRhYmlsaXR5IChAc29yYXdlZSwgIzEwNDUpDQo8L2xpPjxsaT5TdHlsZTogUmVtb3ZlIGZvbnQg ZmFsbGJhY2sgdG8gSGVsdmV0aWNhLCBBcmlhbCAoQEp1bG93LCAjMTAyOCkgPC9saT48bGk+U3R5 bGU6IFByZWZvcm1hdHRlZCBlbGVtZW50cyBmYWxsYmFjayB0byBVQSBtb25vc3BhY2UgKEB0b2Fz dGFsLCAjOTY3KSA8L2xpPjxsaT5TdHlsZTogU2lkZWJhciBpcyBub3cgc3R1Y2sgdG8gdGhlIGxl ZnQgb2YgdGhlIGNvbnRlbnQgaW5zdGVhZCBvZiB0aGUgbGVmdCBvZiB0aGUgdmlld3BvcnQgKEBF bWlsZVRyb3RpZ25vbiwgIzk5OSkNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPlBweGxpYiBkZXYgbWVldGluZ3M8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweGxpYi1kZXYtbWVldGluZ3MvMTI0NDEvMTMi Pmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzEz PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5MGE4OTBj IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOTBhODkwYyI+Q29udGludWluZyB0aGlz IHRocmVhZCwgU29uamEgSGVpbnplIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnOTBhODkwYyI+DQo8cD5IZXJlIGFyZSB0b2RheeKAmXMgbWVl dGluZyBub3RlczogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9wcHhsaWIv d2lraS9EZXYtbWVldGluZy0xOS0xMi0yMDIzIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1w cHgvcHB4bGliL3dpa2kvRGV2LW1lZXRpbmctMTktMTItMjAyMzwvYT4gPC9wPg0KPHA+Jmd0O0Zy b20gbmV4dCBtZWV0aW5nIG9uLCBJ4oCZbGwgbWFrZSBzdXJlIHRvIG9ubHkgc2VuZCBvbmUgbWVz c2FnZSBvbiBkaXNjdXNzIHBlciBtZWV0aW5nIGNvbnRhaW5pbmcgYm90aCB0aGUgYWdlbmRhIGFu ZCBhIGxpbmsgdG8gZnV0dXJlIG1lZXRpbmcgbm90ZXMuDQo8L3A+DQo8cD5IYXZlIGEgbmljZSBu ZXcgeWVhciBldmVyeW9uZSEgOnRhZGE6OikgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjMiPmdyaWQgMC4xLjAgLSBBIHRpbnkgbGlicmFyeSBmb3IgdHdvLWRpbWVuc2lvbmFsIGFycmF5 czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdyaWQtMC0xLTAt YS10aW55LWxpYnJhcnktZm9yLXR3by1kaW1lbnNpb25hbC1hcnJheXMvMTM2ODAvMSI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdyaWQtMC0xLTAtYS10aW55LWxpYnJhcnktZm9y LXR3by1kaW1lbnNpb25hbC1hcnJheXMvMTM2ODAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnNTNmMzRjNyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzUzZjM0YzciPkplYW4gQ2hyaXN0b3BoZSBGaWxsaWF0cmUgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc1M2YzNGM3Ij4NCjxwPkRl YXIgYWxsLCA8L3A+DQo8cD5NeSBjb2xsZWFndWUgQEtfTiBtYW5hZ2VkIHRvIGhhdmUgaGFsZiBv ZiB0aGUgbGFiIGFkZGljdGVkIHRvIDxhIGhyZWY9Imh0dHBzOi8vYWR2ZW50b2Zjb2RlLmNvbS8y MDIzIj4NCkFkdmVudCBvZiBDb2RlPC9hPiA6c3dlYXRfc21pbGU6IDwvcD4NCjxwPlRoaXMgeWVh ciwgbWFueSBwcm9ibGVtcyBpbnZvbHZlIGdyaWRzLCBhbmQgaXQgcHJvdmVkIHVzZWZ1bCB0byBo YXZlIGEgdGlueSBsaWJyYXJ5IHRvIGhhbmRsZSB0d28tZGltZW5zaW9uYWwgYXJyYXlzLiBTbyBo ZXJlIGl0IGlzIChhbmQgdmlhIG9wYW0pOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iYWNrdHJhY2tpbmcvZ3JpZCI+aHR0cHM6Ly9n aXRodWIuY29tL2JhY2t0cmFja2luZy9ncmlkPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9iYWNrdHJhY2tpbmcuZ2l0aHViLmlvL2dyaWQvIj5kb2N1bWVudGF0aW9uPC9hPiA8L2xpPjwv dWw+DQo8cD5Ob3RoaW5nIHNvcGhpc3RpY2F0ZWQsIGFuZCBub3RoaW5nIHlvdSBjb3VsZCBub3Qg ZG8gd2l0aCA8Y29kZT5BcnJheTwvY29kZT4gZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyeSwgb2Yg Y291cnNlLCBidXQgdXNlZnVsIG5vbmV0aGVsZXNzLg0KPC9wPg0KPHA+Tm90ZTogVGhpcyBpcyA8 aT5ub3Q8L2k+IGEgbGluZWFyIGFsZ2VicmEgbGlicmFyeS4gPC9wPg0KPHA+SGFwcHkgaGFja2lu ZywgSmVhbi1DaHJpc3RvcGhlIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5EcmFm dCB0dXRvcmlhbHMgb24gTW9kdWxlcywgRnVuY3RvcnMgYW5kIExpYnJhcmllczwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZHJhZnQtdHV0b3JpYWxzLW9uLW1vZHVsZXMt ZnVuY3RvcnMtYW5kLWxpYnJhcmllcy8xMzY4Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9kcmFmdC10dXRvcmlhbHMtb24tbW9kdWxlcy1mdW5jdG9ycy1hbmQtbGlicmFyaWVzLzEz Njg2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzBi YzMzNmIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwYmMzMzZiIj5DdWlodGxhdWFj IEFsdmFyYWRvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnMGJjMzM2YiI+DQo8cD5EZWFyIE9DYW1sZXJzLCA8L3A+DQo8cD5UaGUgc2VyaWVz IG9uIG9jYW1sLm9yZyB0dXRvcmlhbCB1cGRhdGVzIGNvbnRpbnVlLiBUaGlzIHRpbWUsIHRoZSBv Y2FtbC5vcmcgdGVhbSBoYXMgdGhyZWUgZHJhZnRzIHJlbGF0ZWQgdG8gdGhlIG1vZHVsZSBzeXN0 ZW0gaW4gYSBzaW5nbGUgcHVsbCByZXF1ZXN0LiBXZSB3YW50IHlvdXIgZmVlZGJhY2sgb24gaXQ6 DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+R0ggUFI6IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNzc4Ij5VcGRhdGUgTW9kdWxlcyBhbmQg RnVuY3RvcnMgVHV0b3JpYWxzICMxNzc4PC9hPg0KPC9saT48bGk+T25saW5lIGRyYWZ0czoNCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3N0YWdpbmcub2NhbWwub3Jn L2RvY3MvbW9kdWxlcyI+TW9kdWxlczwvYT4g4oCUIFRoaXMgaXMgcmVmcmVzaCBvZiB0aGUgcHJl dmlvdXMgdmVyc2lvbg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9y Zy9kb2NzL2Z1bmN0b3JzIj5GdW5jdG9yczwvYT4g4oCUIFRoaXMgaXMgbW9zdGx5IG5ldyBtYXRl cmlhbA0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL2xp YnJhcmllcy1kdW5lIj5MaWJyYXJpZXMgV2l0aCBEdW5lPC9hPiDigJQgVGhpcyBpcyBlbnRpcmVs eSBuZXcgbWF0ZXJpYWwNCjwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjxwPlRoZSA8Yj50YXJnZXQg YXVkaWVuY2U8L2I+IGlzIGRldmVsb3BlcnMgbGVhcm5pbmcgT0NhbWwuIE5vIGZ1bmN0aW9uYWwg cHJvZ3JhbW1pbmcga25vd2xlZGdlIGlzIGFzc3VtZWQuIEhvd2V2ZXIsIGl0IGNvbWVzIGFmdGVy IHRoZSDigJxHZXQgU3RhcnRlZOKAnSBzZXJpZXM6DQo8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+ DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9pbnN0YWxsaW5nLW9jYW1sIj5J bnN0YWxsaW5nIE9DYW1sPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9k b2NzL3RvdXItb2Ytb2NhbWwiPkEgVG91ciBvZiBPQ2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy95b3VyLWZpcnN0LXByb2dyYW0iPllvdXIgRmlyc3QgT0Nh bWwgUHJvZ3JhbTwvYT4NCjwvbGk+PC9vbD4NCjxwPlRoZXkgYWxzbyByZXF1aXJlIHRoZSBmaXJz dCB0d28gdHV0b3JpYWxzIG9mIHRoZSDigJxJbnRyb2R1Y3Rpb27igJ0gc2VyaWVzIGFzIHByZXJl cXVpc2l0ZXM6DQo8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9vY2FtbC5vcmcvZG9jcy92YWx1ZXMtYW5kLWZ1bmN0aW9ucyI+VmFsdWVzIGFuZCBGdW5jdGlv bnM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL2Jhc2ljLWRh dGEtdHlwZXMiPkJhc2ljIERhdGF0eXBlcyBhbmQgUGF0dGVybiBNYXRjaGluZzwvYT4NCjwvbGk+ PC9vbD4NCjxwPkFzIHRoZSBwcmV2aW91c2x5IGFubm91bmNlZCBkcmFmdHMsIHRoZXNlIGFsc28g Y29udGFpbiBvdmVybG9va2VkIGlzc3Vlcy4gV2Ugd2FudCB0byBtYWtlIGl0IGJldHRlciB3aXRo IHlvdXIgaGVscC4NCjwvcD4NCjxwPlNoYXJlIHlvdXIgZmVlZGJhY2sgb24gR2l0SHViIG9yIGhl cmUsIGJ1dCBkbyBub3QgdXNlIHRoZSDigJxDb250cmlidXRl4oCdIGxpbmsgYXQgdGhlIGJvdHRv bSBvZiB0aGUgc3RhZ2luZyBwYWdlcy4NCjwvcD4NCjxwPkhvcGUgaXQgaGVscHMgPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPkVzcGVyYW50bywgd2hlbiBPQ2FtbCBtZWV0cyBDb3Nt b3BvbGl0YW48L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lc3Bl cmFudG8td2hlbi1vY2FtbC1tZWV0cy1jb3Ntb3BvbGl0YW4vMTA1MDEvNCI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWVzcGVyYW50by13aGVuLW9jYW1sLW1lZXRzLWNvc21vcG9s aXRhbi8xMDUwMS80PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmczMDIwNjcwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzAyMDY3MCI+Q2Fs YXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzMwMjA2NzAiPg0KPHA+SeKAmW0gZ2xhZCB0byBhbm5vdW5jZSB0aGUg cmVsZWFzZSBvZiBFc3BlcmFudG8gKDAuMC41KS4gVGhpcyByZWxlYXNlIGludGVncmF0ZXMgdGhl IGxhc3QgcmVsZWFzZSBvZg0KPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9qdXN0aW5ldHVu bmV5L3N0YXR1cy8xNzI2MTQxMDI0NTk3MzI0MTg5P3Q9SzFuSWgtMlk3Smphb09jOVk2YlV6QSI+ DQpDb3Ntb3BvbGl0YW4gMy4xPC9hPi4gPC9wPg0KPHA+VGhlIGxhdHRlciBpbmNvcnBvcmF0ZXMg YSBncmVhdCBkZWFsIG9mIHdvcmsgb24gdGhlIENvc21vcG9saXRhbiB0b29sY2hhaW46IDwvcD4N CjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5hIG1vZGlmaWNhdGlvbiBvZiB0aGUgR0NDIGNvbXBp bGF0aW9uIHNvIHRoYXQgY29kZSBubyBsb25nZXIgbmVlZHMgdG8gYmUgcGF0Y2hlZCB0byB0cmFu c2Zvcm0gY29uc3RhbnRzIGludG8gdmFyaWFibGVzDQo8L2xpPjxsaT5jcm9zcy1jb21waWxhdGlv biBzdXBwb3J0IGZvciBhYXJjaDY0IDwvbGk+PGxpPnN1cHBvcnQgZm9yIEFwcGxlIFNpbGljb24g PC9saT48L29sPg0KPHA+VGhpcyByZWxlYXNlIGludHJvZHVjZXMgYSBjaGFuZ2UgaW4gdGhlIGNv bnN0cnVjdGlvbiBvZiB0aGUgcG9ydGFibGUgYXJ0aWZhY3QgZnJvbSBPQ2FtbCBzb3VyY2UgY29k ZSwgd2hpY2ggaXMgZXhwbGFpbmVkDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlub3Nh dXJlL2VzcGVyYW50byI+aGVyZTwvYT4uIE1vcmUgZ2VuZXJhbGx5LCB0aGUgc3RlcHMgYXJlOg0K PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmNvbXBpbGF0aW9uIHRvIDxjb2RlPng4Nl82 NDwvY29kZT4gPC9saT48bGk+Y29tcGlsYXRpb24gdG8gPGNvZGU+YWFyY2g2NDwvY29kZT4gPC9s aT48bGk+bGlua2luZyB0aGUgdHdvIGFydGlmYWN0cyB3aXRoIDxjb2RlPmFwZWxpbms8L2NvZGU+ LiA8L2xpPjwvdWw+DQo8cD5DdXJyZW50bHksIHRoaXMgdmVyc2lvbiBvZiBFc3BlcmFudG8gaGFz IGJlZW4gdGVzdGVkIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9i b2IiPg0KYm9iPC9hPiwgYW4gT0NhbWwgZmlsZS1zaGFyaW5nIHByb2dyYW0uIFdlIGhhdmUgdGVz dGVkIGl0cyBwb3J0YWJpbGl0eSBvbiBEZWJpYW4sIFVidW50dSwgTWFjIE0xLCBGcmVlQlNEIGFu ZCBXaW5kb3dzLiBBcyB3ZSBtYWtlIGNsZWFyIGluIHRoZSBkZXNjcmlwdGlvbiwgRXNwZXJhbnRv 4oCZcyBzb2xlIHB1cnBvc2UgaXMgdG8gYXNzaXN0IGluIHRoZSBkaXN0cmlidXRpb24gb2Ygc29m dHdhcmUgKHJhdGhlciB0aGFuIHRvIHByb3ZpZGUgYSBzdXBwb3J0aXZlDQogZW52aXJvbm1lbnQg Zm9yIGRldmVsb3BlcnMpLiBXZSB0aGVyZWZvcmUgYWR2aXNlIHlvdSB0byB1c2UgRG9ja2VyIChv ciByZWxhdGVkIHRlY2hub2xvZ3kpIHRvIGNyZWF0ZSB5b3VyIHBvcnRhYmxlIGV4ZWN1dGFibGUg ZnJvbSB5b3VyIHNvdXJjZXMgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmUv Ym9iL2Jsb2IvbWFpbi8uZ2l0aHViL3dvcmtmbG93cy9lc3BlcmFudG8ueW1sIj5ib2I8L2E+IGhh cywgZm9yIGV4YW1wbGUsDQogYSBHaXRIdWIgQ0kgdGhhdCBwcm9kdWNlcyBzdWNoIGFuIGV4ZWN1 dGFibGUpLiA8L3A+DQo8cD5PZiBjb3Vyc2UsIHdl4oCZcmUgcGxhbm5pbmcgdG8gaW50ZWdyYXRl IHdpdGggT0NhbWwgNSwgc2luY2UgPGNvZGU+cHRocmVhZDwvY29kZT4gc3VwcG9ydCBpcyBub3cg YXZhaWxhYmxlIGluIENvc21vcG9saXRhbiAoaXQgd2FzbuKAmXQgYXQgZmlyc3QpLiBTbyB3ZSBv bmx5IHN1cHBvcnQgT0NhbWwgNC4xNCBhbmQgT0NhbWwgNC4xMy4gV2XigJlyZSB3YWl0aW5nIGZv ciBhIHJldmlldyBvZiBhbm90aGVyIHByb2plY3Qgd2hpY2ggaXMgcHJlcGFyaW5nDQogaXRzIHRy YW5zaXRpb24gdG8gT0NhbWwgNSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9v Y2FtbC1zb2xvNS9wdWxsLzEyNCI+PGNvZGU+b2NhbWwtc29sbzU8L2NvZGU+PC9hPikgYmVmb3Jl IGludGVncmF0aW5nIGl0IGludG8gRXNwZXJhbnRvLg0KPC9wPg0KPHA+RmluYWxseSwgd2Ugd291 bGQgbGlrZSB0byB0aGFuayB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9yb2J1ci5jb29wIj5yb2J1ci5j b29wPC9hPiBjb29wZXJhdGl2ZSAod2hpY2ggeW91IGNhbg0KPGEgaHJlZj0iaHR0cHM6Ly9yb2J1 ci5jb29wL0RvbmF0ZSI+aGVscDwvYT4pIGZvciBnaXZpbmcgdXMgdGhlIGZyZWVkb20gdG8gbWFp bnRhaW4gdGhpcyBwcm9qZWN0Lg0KPC9wPg0KPHA+UFM6IEVzcGVyYW50byBpcyBzdGlsbCBpbiBb YSByZWxlYXNlIHByb2Nlc3NdKCkgKGFuZCBub3QgaW1tZWRpYXRlbHkgYXZhaWxhYmxlIHZpYSBP UEFNKSwgYnV0IHRoZSBwcm9jZXNzIHNob3VsZCBiZSBjb21wbGV0ZWQgaW4gdGhlIG5leHQgZmV3 IGRheXMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+T0NhbWwgaW4gY3VsdHVy YWwgaGVyaXRhZ2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1s LWluLWN1bHR1cmFsLWhlcml0YWdlLzEzNjk2LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLWluLWN1bHR1cmFsLWhlcml0YWdlLzEzNjk2LzE8L2E+IDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjc1NGFmNyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZ2I3NTRhZjciPnplZHN0YXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiNzU0YWY3Ij4NCjxwPkhpIGFsbCEgPC9wPg0K PHA+SnVzdCB3YW50ZWQgdG8gc2hhcmUgc29tZSBlZmZvcnRzIHRvIGJyaW5nIE9DYW1sIHRvIHRo ZSBjdWx0dXJhbCBoZXJpdGFnZSBzZWN0b3IuIFNvIGZhciBJIGhhdmUgYnVpbHQgYSB3ZWIgYW5u b3RhdGlvbiBzZXJ2ZXIgdXNpbmcgRHJlYW0gYW5kIElybWluDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vbmF0aW9uYWxhcmNoaXZlcy9taWlpZnkiPmh0dHBzOi8vZ2l0aHViLmNvbS9uYXRp b25hbGFyY2hpdmVzL21paWlmeTwvYT4gYnV0IGhhdmUgc29tZSBwbGFucyB0byBjb250aW51ZSB0 aGUgd29yay4NCjwvcD4NCjxwPlRoZSBjaGFsbGVuZ2VzIGZvciBvdXIgZGlnaXRhbCBzZXJ2aWNl cyBhcmUgbWFpbmx5IGFyb3VuZCBzY2FsZSBhbmQgdGhlcmUgaXMgYSBncm93aW5nIGludGVyZXN0 IGFyb3VuZCBncmVlbiBjb21wdXRpbmcuIEluc3BpcmVkIGJ5IHRoZSB0YWxrIEhhbm5lcyBnYXZl IGF0IENDQywgaXQgd291bGQgYmUgZ3JlYXQgdG8gZXhwbG9yZSB0aGUgYmVuZWZpdHMgb2YgTWly YWdlT1MhDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+Y29sb3JzIDAuMC4xIOKA kyBjb2xvcnNwYWNlIG1hbmlwdWxhdGlvbiBpbiBwdXJlIE9DYW1sPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY29sb3JzLTAtMC0xLWNvbG9yc3BhY2UtbWFuaXB1 bGF0aW9uLWluLXB1cmUtb2NhbWwvMTM2OTcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWNvbG9ycy0wLTAtMS1jb2xvcnNwYWNlLW1hbmlwdWxhdGlvbi1pbi1wdXJlLW9jYW1s LzEzNjk3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2RkZGZmMzYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkZGRmZjM2Ij5vc3RlcmEg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdk ZGRmZjM2Ij4NCjxwPkhpIGZvbGtzIDp3YXZlOiBqdXN0IHdhbnRlZCB0byBzaGFyZSBhIGxpdHRs ZSBsaWJyYXJ5IEkgcHV0IHRvZ2V0aGVyIHRvIGRvIGNvbG9yIG1hbmlwdWxhdGlvbiBpbg0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21pbnR0ZWEiPk1pbnQgVGVhPC9hPi4g SXTigJlsbCBiZSB1c2VkIGluIHRoZSBuZXh0IHJlbGVhc2Ugb2YgTWludCBUZWEsIGFuZCBhbGxv dyB1cyB0byBkbyBncmFkaWVudHMgYW5kIGFsbCBzb3J0cyBvZiBuaWNlIGNvbG9yIHN0dWZmOg0K PC9wPg0KPGRpdiBpZD0ib3JnODJkOTUxZSIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0i aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwv b3JpZ2luYWwvMlgvNS81NmViZWU3NDcxMDdkOGU5ZGM5ZGVjNzllZGY3ZDM5YjMwYzk4MDg4Lmdp ZiIgYWx0PSI1NmViZWU3NDcxMDdkOGU5ZGM5ZGVjNzllZGY3ZDM5YjMwYzk4MDg4LmdpZiI+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im9yZ2I2YTU0YjIiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGlt ZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRz L29jYW1sL29yaWdpbmFsLzJYLzUvNTQzZjRmYWU3MTE0MzY3MDcxOWU1NmU3ZTI5NGU3YjEzOGM1 NGZmNy5naWYiIGFsdD0iNTQzZjRmYWU3MTE0MzY3MDcxOWU1NmU3ZTI5NGU3YjEzOGM1NGZmNy5n aWYiPg0KPC9wPg0KPC9kaXY+DQo8cD5UaGlzIGZpcnN0IHJlbGVhc2Ugb2YgY29sb3JzOiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW50cm9kdWNlcyBSR0IsIExSR0IsIFhZWiwgTFVW LCBVViB0eXBlcyA8L2xpPjxsaT5JbmNsdWRlcyBzdGFuZGFyZCB3aGl0ZSByZWZlcmVuY2UgcG9p bnQgYGQ2NWAgPC9saT48bGk+U3VwcG9ydHMgTGluZWFyaXppbmcvRGVsaW5lYXJpemluZyBSR0Ig PC9saT48bGk+SW5jbHVkZXMgY29udmVyc2lvbnMgYmV0d2VlbiBBTlNJLCBSR0IsIExSR0IsIFhZ WiwgYW5kIExVViA8L2xpPjxsaT5IYXMgYmxlbmRpbmcgZm9yIExVViBhbmQgUkdCICh2aWEgTFVW KSB3aXRoIGNvbmZpZ3VyYWJsZSBtaXhpbmcgPC9saT48bGk+SW5jbHVkZXMgYW4gQU5TSSB0byBS R0IgY29sb3IgdGFibGUgPC9saT48L3VsPg0KPHA+SeKAmW0gaG9waW5nIHRvIGtlZXAgaXQgc3Vw ZXIgc21hbGwgYW5kIGluIHB1cmUgT0NhbWwgc28gd2UgY2FuIHVzZSBpdCBmb3IgdGVybWluYWxz IGJ1dCBhbHNvIG90aGVyIHBsYWNlcyBsaWtlIHdlYiwgb3Igb3RoZXIgZ3JhcGhpY3Mgc2V0dGlu Z3MuDQo8L3A+DQo8cD5Zb3UgY2FuIHJlYWQgdGhlIGZ1bGwgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2xlb3N0ZXJhL2NvbG9ycy9ibG9iL21haW4vQ0hBTkdFUy5tZCI+DQpjaGFuZ2Vsb2cg aGVyZTwvYT4uIDwvcD4NCjxwPklmIHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gY29udHJpYnV0aW5n IHRvIGFueSBvZiB0aGVzZSwgbG9vayBmb3Igb3BlbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vbGVvc3RlcmEvY29sb3JzL2lzc3Vlcz9xPWlzJTNBaXNzdWUmIzQzO2lzJTNBb3BlbiYjNDM7 bGFiZWwlM0ElMjJnb29kJiM0MztmaXJzdCYjNDM7aXNzdWUlMjIiPg0KZ29vZCBmaXJzdCBpc3N1 ZXM8L2E+LCBhbmQgZG9u4oCZdCBoZXNpdGF0ZSB0byByZWFjaCBvdXQgb24gRGlzY29yZC9YOiBA bGVvc3RlcmEgOnNsaWdodF9zbWlsZToNCjwvcD4NCjxwPkhhcHB5IGhhY2tpbmchIDpjYW1lbDog OmhhbmRfd2l0aF9pbmRleF9maW5nZXJfYW5kX3RodW1iX2Nyb3NzZWQ6IDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI4Ij5PQ2FtbCBpcyA8Yj5hd2Vzb21lPC9iPjwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtaXMtYXdlc29tZS8xMzcwMC8xIj5odHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtaXMtYXdlc29tZS8xMzcwMC8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3ZTNhYjZlIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2UzYWI2ZSI+amJlY2tmb3JkIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2UzYWI2ZSI+DQo8cD5J IGhhdmUgYSBmdWxsIGFydGljbGUgYW5kIHJlcG9zaXRvcnkgYXQgPGEgaHJlZj0iaHR0cHM6Ly9n aXRsYWIuY29tL2Rpc2t1di9zYW1wbGVzL21lcnJ5Y2hyaXN0bWFzMjAyMyNka3Nkay1tZXJyeS1j aHJpc3RtYXMtMjAyMyI+DQpodHRwczovL2dpdGxhYi5jb20vZGlza3V2L3NhbXBsZXMvbWVycnlj aHJpc3RtYXMyMDIzI2Rrc2RrLW1lcnJ5LWNocmlzdG1hcy0yMDIzPC9hPi4NCjwvcD4NCjxwPlNo b3J0IHZlcnNpb24g4oCmIGh1Z2UgdGhhbmtzIHRvIE9sZWcgZm9yIGhpcyBwcmVwcmludCBwYXBl ciA8YSBocmVmPSJodHRwczovL3d3dy5zY2llbmNlZGlyZWN0LmNvbS9zY2llbmNlL2FydGljbGUv YWJzL3BpaS9TMDE2NzY0MjMyMzAwMDk3NyI+DQpHZW5lcmF0aW5nIEM6IEhldGVyb2dlbmVvdXMg bWV0YXByb2dyYW1taW5nIHN5c3RlbSBkZXNjcmlwdGlvbjwvYT4uIEnigJl2ZSBhZGFwdGVkIGl0 IHNvIGl0IG1vc3RseSB3b3JrcyB3aXRoIFBQWCBhbmQgd2l0aG91dCBCRVIgTWV0YU9DYW1sIChh bHRob3VnaCBJIGludGVuZCB0byBzd2l0Y2ggdG8gQkVSIE1ldGFPQ2FtbCBhdCBzb21lIHBvaW50 KS4NCjwvcD4NCjxwPlR5cGluZyByZWFsIE9DYW1sIG9uIHlvdXIga2V5Ym9hcmQ6IDwvcD4NCjxw cmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdhZDQ5NzQxIj4NCiQgZ2l0IGNsb25lIGh0dHBzOi8v Z2l0bGFiLmNvbS9kaXNrdXYvc2FtcGxlcy9tZXJyeWNocmlzdG1hczIwMjMuZ2l0DQokIGNkIG1l cnJ5Y2hyaXN0bWFzMjAyMw0KJCBvcGFtIHN3aXRjaCBjcmVhdGUgLiA0LjE0LjEgIyBvciBvbiBX aW5kb3dzOiBka21sIGluaXQNCiQgb3BhbSBpbnN0YWxsIC4gdXRvcCAtLXdpdGgtdGVzdCAtLXll cw0KJCBvcGFtIGV4ZWMgLS0gZHVuZSB1dG9wDQojcmVxdWlyZSAmcXVvdDttZXRhcXVvdC5wcHgm cXVvdDs7Ow0Kb3BlbiBEa1NES01ldGF0eXBlX09mZnNob3JlOzsNCm9wZW4gWG1hczIwMjM7Ow0K bGV0IHN1bV9hcl9zdGFnZWQgPQ0KICAoIExleGluZy5kdW1teV9wb3MsDQogICAgWyVleHByDQog ICAgICBmdW4gYXJyIG4gLSZndDsNCiAgICAgICAgbGV0IHN1bSA9IHJlZiAwIGluDQogICAgICAg IGZvciBpID0gMCB0byAzIGRvDQogICAgICAgICAgZm9yIGogPSBpIHRvIG1pbiAoaSAmIzQzOyAz KSAobiAtIDEpIGRvDQogICAgICAgICAgICBzdW0gOj0gIXN1bSAmIzQzOyBhcnIuKGopDQogICAg ICAgICAgZG9uZQ0KICAgICAgICBkb25lOw0KICAgICAgICAhc3VtXSwNCiAgICBMZXhpbmcuZHVt bXlfcG9zICkgOzsNCg0KcHJpbnRfYyAmcXVvdDtzdW1fYXImcXVvdDsgKG1vZHVsZSBTdW1BckNv bnYpIHN1bV9hcl9zdGFnZWQgOzsNCjwvcHJlPg0KPHA+cHJpbnRzIHJlYWwgQyBjb2RlOiA8L3A+ DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLWMi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPmludDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNv bG9yOiAjYTc2MDFmOyI+RGtTREtNZXRhdHlwZV9PZmZzaG9yZV9zdW1fYXI8L3NwYW4+KDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPmludDwvc3Bhbj4gKiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+Y29uc3Q8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPmFycjwvc3Bhbj4sPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ aW50PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+Y29uc3Q8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+KXsN CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+aW50PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5zdW08L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRm OyI+MDwvc3Bhbj47DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij5mb3I8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5pbnQ8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmk8L3NwYW4+ID0gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj47IGkgJmx0OyAoPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA4MjRmOyI+MTwvc3Bhbj4gJiM0MzsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+Mzwv c3Bhbj4pOyBpICYjNDM7PSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4xPC9zcGFuPikN CiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+Zm9y PC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+aW50PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5qPC9zcGFuPiA9IGk7IGogJmx0OyAoPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4gJiM0MzsgbWluKGkgJiM0MzsgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+Mzwvc3Bhbj4sbiAtIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0 ZjsiPjE8L3NwYW4+KSk7IGogJiM0Mzs9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8 L3NwYW4+KQ0KICAgIHN1bSA9IHN1bSAmIzQzOyAoYXJyW2pdKTsNCiAgPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPnJldHVybjwvc3Bhbj4gc3VtOw0KfQ0K PC9wcmU+DQo8L2Rpdj4NCjxwPk90aGVyIGxhbmd1YWdlcyBhcmUgZWFzeSB0byBhZGQuIDwvcD4N CjxwPk1lcnJ5IENocmlzdG1hcyEgSm9uYWggPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjkiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTkiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTdmNDk0MiIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U3ZjQ5NDIiPkZyb20gdGhlIG9jYW1sLm9y ZyBibG9nPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdlN2Y0 OTQyIj4NCjxwPkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVk IGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxv ZzwvYT4uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3Rh cmlkZXMuY29tL2Jsb2cvMjAyMy0xMi0yMC1vY2FtbC1zdXJ2ZXktZGV2ZWxvcGVycy1wZXJjZXB0 aW9uLWludGVyZXN0LWFuZC1wZXJjZWl2ZWQtYmFycmllcnMiPk9DYW1sIFN1cnZleTogRGV2ZWxv cGVyc+KAmSBQZXJjZXB0aW9uLCBJbnRlcmVzdCwgYW5kIFBlcmNlaXZlZCBCYXJyaWVyczwvYT4N CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTEyLTE0LW9j YW1sLW1lbW9yeS1zYWZldHktYW5kLWJleW9uZCI+T0NhbWw6IE1lbW9yeSBTYWZldHkgYW5kIEJl eW9uZDwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzZlNTdhZTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJv cmc2ZTU3YWU2Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC1vcmc2ZTU3YWU2Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQg bWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhl IGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5m by9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFt ZSIgaWQ9Im9yZ2MzM2IwNGEiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 19 Dec 2023 10:10:39 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 19 Dec 2023 10:10:39 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 19 Dec 2023 10:10:39 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BJAAoHP022251 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 19 Dec 2023 10:10:50 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BJAAc8N022236 for ; Tue, 19 Dec 2023 10:10:38 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Dec 2023 11:10:37 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 77C13E0CD1; Tue, 19 Dec 2023 11:10:37 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 97DF0E004E for ; Tue, 19 Dec 2023 11:10:27 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Dec 2023 11:10:25 +0100 Received: from TM.local (natedu1.unice.fr [134.59.191.33]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F42395600B8; Tue, 19 Dec 2023 11:10:22 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaMmOe3KGolWLcDkupRAcRch/6lg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 19 Dec 2023 10:10:09 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 68d47ab6-a412-4d7a-d6ba-08dc007ac054 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,287,1695679200"; d="scan'208,217";a="74829879" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.498827, queueID=5F33C5605AE x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMi0xOSBUdWUgMTE6MDUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTIuMTIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMi4yNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIERlY2VtYmVyIDEyIHRvIDE5LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5XZWxjb21pbmcgYSBuZXcgPGNv ZGU+cHB4bGliPC9jb2RlPiBtYWludGFpbmVyPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+TGVh cm4tT0NhbWwgMS4wIGFwcHJvYWNoaW5nIOKAkyBjYWxsIGZvciB0ZXN0ZXJzPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjMyI+Y21hcmtpdCAwLjMuMCDigJMgQ29tbW9uTWFyayBwYXJzZXIgYW5kIHJl bmRlcmVyIGZvciBPQ2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPmRyZWFtLWh0bWwgMi4w LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5DQUlTQVIgcmVsZWFzZSAxLjAsIGEgcGxhdGZv cm0gZm9yIGNoYXJhY3Rlcml6aW5nIEFJIHNhZmV0eSBhbmQgcm9idXN0bmVzczwvYT4NCjwvbGk+ PGxpPjxhIGhyZWY9IiM2Ij5XZWIgQW5hbHl0aWNzIG9uIE9DYW1sLm9yZzwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzciPlR1dG9yaWFsIG9uIE11dGFiaWxpdHksIExvb3BzLCBhbmQgSW1wZXJhdGl2 ZSBQcm9ncmFtbWluZzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPlJGU00gdmVyc2lvbiAyLjA8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5yaW90IDAuMC41PC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMTAiPnR0eSAwLjAuMTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5ob29rZSAwLjAuMSDi gJMgc3ByaW5nLWJhc2VkIGFuaW1hdGlvbnMgbGlicmFyeTwvYT4gPC9saT48bGk+PGEgaHJlZj0i IzEyIj7igJxPQ2FtbCBvbiBHaXRodWLigJ0gYm90IHBvc3Rpbmcgb24gdGhlIGZlZGl2ZXJzZTwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzEzIj5NaW50IFRlYSAobWludHRlYSAwLjAuMSkg4oCTIGEg bGl0dGxlIFRVSSBmcmFtZXdvcmsgZm9yIE9DYW1sPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzE0 Ij5XZWxjb21pbmcgb3VyIG5ldyBPdXRyZWNoeSBpbnRlcm5zPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMTUiPnpiZyB2MC4yLjA6IEEgbmV3IHZlcnNpb24gb2YgWmVybyBCdWxsc2hpdCBHaXQ8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiMxNiI+UHB4bGliIGRldiBtZWV0aW5nczwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzE3Ij5PdGhlciBPQ2FtbCBOZXdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3Jn MWQwNTIzMSI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5XZWxj b21pbmcgYSBuZXcgPGNvZGU+cHB4bGliPC9jb2RlPiBtYWludGFpbmVyPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93ZWxjb21pbmctYS1uZXctcHB4bGliLW1haW50YWlu ZXIvMTM2MjAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2VsY29taW5nLWEtbmV3 LXBweGxpYi1tYWludGFpbmVyLzEzNjIwLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnYjVmNzQwMyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2I1Zjc0MDMiPlNvbmphIEhlaW56ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2I1Zjc0MDMiPg0KPHA+SGVsbG8gZXZlcnlvbmUgOndhdmU6 IFNvbWUgdmVyeSBnb29kIG5ld3MgZm9yIDxjb2RlPnBweGxpYjwvY29kZT46IEBOYXRoYW5SZWIg d2lsbCBqb2luIHVzIGJhY2sgYXMgYSBtYWludGFpbmVyISBIaXMgbWFpbnRlbmFuY2Ugd29yayB3 aWxsIHBhcnRseSBiZSBmdW5kZWQgYnkgdGhlDQo8YSBocmVmPSJodHRwczovL29jYW1sLXNmLm9y Zy8iPk9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb248L2E+LiA8L3A+DQo8cD5XZSwgdGhlIGN1cnJl bnQgbWFpbnRhaW5lcnMsIGhhdmVu4oCZdCBoYWQgbXVjaCB0aW1lIGZvciA8Y29kZT5wcHhsaWI8 L2NvZGU+IGxhdGVseSBhcyB3ZeKAmXJlIHByZXR0eSB0aWVkIHVwIHdpdGggb3VyIG90aGVyIHBy b2plY3RzIGFzIHdlbGwuIEhvd2V2ZXIsDQo8Y29kZT5wcHhsaWI8L2NvZGU+IGlzIGFuIGltcG9y dGFudCBwcm9qZWN0OiBJdOKAmXMgYSAodHJhbnNpdGl2ZSkgZGVwZW5kZW5jeSBvZiBhYm91dCBo YWxmIG9mIHRoZQ0KPGNvZGU+b3BhbTwvY29kZT4gZWNvc3lzdGVtLCBzbyBpdCBzaG91bGQgcmVj ZWl2ZSBhIGdvb2QgYW1vdW50IG9mIG1haW50ZW5hbmNlIGF0dGVudGlvbi4gU28gaXTigJlzIHZl cnkgcmVhc3N1cmluZyB0byBoYXZlIGEgbmV3IG1haW50YWluZXIgd2l0aCB1cyBhbmQgaXTigJlz IHN1cGVyIHN1cGVyIG5pY2UgdGhhdCBpdOKAmXMgQE5hdGhhblJlYiwgc2luY2Ugd2Uga25vdyB0 aGF0IHdlIGVuam95IHdvcmtpbmcgdG9nZXRoZXIgYW5kIHRoYXQgaGXigJlsbCBiZQ0KIGEgdmVy eSBhY3RpdmUsIHRob3VnaHRmdWwsIGFuZCBwcmFnbWF0aWMgbWFpbnRhaW5lci4gPC9wPg0KPHA+ V2XigJl2ZSBhbHJlYWR5IGRpc2N1c3NlZCB3aGF0IHdvdWxkIGN1cnJlbnRseSBiZSB0aGUgbW9z dCBhcHByZWNpYXRlZCB0byB3b3JrIG9uLCBhbmQsIHRvZ2V0aGVyIHdpdGggdHlwaWNhbCBnZW5l cmFsIG1haW50ZW5hbmNlLCBpdCB3aWxsIGJlIHRvIHVwc3RyZWFtDQo8Y29kZT5Bc3RsaWI8L2Nv ZGU+IHRvIHRoZSBjb21waWxlci4gVGhhbmtzIHRvIHBhc3Qgd29yayBhbHJlYWR5IGRvbmUsIHVw c3RyZWFtaW5nDQo8Y29kZT5Bc3RsaWI8L2NvZGU+IGlzIGEgdGVjaG5pY2FsbHkgc3RyYWlnaHRm b3J3YXJkIHBsYW4uIEFtb25nIG90aGVycywgaXQgd291bGQgbWFrZQ0KPGNvZGU+cHB4bGliPC9j b2RlPiBjb250aW51b3VzbHkgY29pbnN0YWxsYWJsZSB3aXRoIE9DYW1sIDxjb2RlPnRydW5rPC9j b2RlPiwgYW5kIGl0IHdvdWxkIGNvbnNpZGVyYWJseSBzaW1wbGlmeQ0KPGNvZGU+cHB4bGliPC9j b2RlPiBtYWludGVuYW5jZS4gV2Uga25vdyB0aGF0IGl04oCZcyBvZnRlbiBjb25mdXNlZCB3aXRo IGEgZGlmZmVyZW50IGFuZCBhIGxvdCBtb3JlIGNvbXBsZXggcGxhbiBmcm9tIHRoZSBwYXN0IHRo YXQgd2XigJl2ZSBhYmFuZG9uZWQuIFdl4oCZbGwgY29tbXVuaWNhdGUgd2VsbCBhYm91dCB0aGlz Lg0KPC9wPg0KPHA+QE5hdGhhblJlYiB3aWxsIGFsc28gaGVscCBkdXJpbmcgdGhlIG5leHQgY29t cGlsZXIgcmVsZWFzZSBwaGFzZSB3aGVuIHdlIGJ1bXAgdGhlDQo8Y29kZT5wcHhsaWI8L2NvZGU+ LWV4cG9zZWQgPGNvZGU+cGFyc2V0cmVlPC9jb2RlPiB0byBtYXRjaCB0aGUgbmV3IGNvbXBpbGVy IHZlcnNpb24uIFdoZW4gd2UgZG8gc28sIGFzIGFsd2F5cywgd2XigJlsbCBicmVhayBhIGZldyBQ UFhzLCBhbmQgd2XigJlsbCBtYWtlIHN1cmUgdG8gcGF0Y2ggdGhvc2UuDQo8L3A+DQo8cD5BbGwg dGhhdCBiZWluZyBzYWlkLCB3ZSwgdGhlIGN1cnJlbnQgbWFpbnRhaW5lcnMsIHdpbGwga2VlcCBv biBtYWludGFpbmluZyA8Y29kZT4NCnBweGxpYjwvY29kZT4gYXMgd2VsbC4gV2XigJl2ZSBkb25l IHRoYXQgYXMgcGFydCBvZiBvdXIgam9iIGF0IDxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20v Ij4NClRhcmlkZXM8L2E+IGZvciBhIHdoaWxlIG5vdyBhbmQgd2Uga25vdyBpdOKAmXMgaW1wb3J0 YW50IGZvciB0aGUgY29tbXVuaXR5IGFuZCBlbmpveSBkb2luZyBzby4gSXQgd2lsbCBiZSBuaWNl IHRvIG1haW50YWluDQo8Y29kZT5wcHhsaWI8L2NvZGU+IGluIGNvbGxhYm9yYXRpb24gd2l0aCBw ZW9wbGUgZnJvbSB3aXRoaW4gVGFyaWRlcyBhbmQgZnJvbSBvdXRzaWRlIFRhcmlkZXMsIHNpbWls YXJseSBhcyBpdCBpcyB0aGUgY2FzZSBmb3Igb3RoZXIgT0NhbWwgUGxhdGZvcm0gdG9vbHMuDQo8 L3A+DQo8cD5XZWxjb21lIGJhY2ssIE5hdGhhbiwgYW5kIHRoYW5rcyBhIGxvdCEgOnNsaWdodF9z bWlsZTogQHBhbmdsZXNkIGFuZCBAcGl0YWcgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjIiPkxlYXJuLU9DYW1sIDEuMCBhcHByb2FjaGluZyDigJMgY2FsbCBmb3IgdGVzdGVyczwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbGVhcm4tb2NhbWwtMS0wLWFwcHJv YWNoaW5nLWNhbGwtZm9yLXRlc3RlcnMvMTM2MjEvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvbGVhcm4tb2NhbWwtMS0wLWFwcHJvYWNoaW5nLWNhbGwtZm9yLXRlc3RlcnMvMTM2MjEv MTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOGQ5Mzkx YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzhkOTM5MWMiPkxvdWlzIEdlc2JlcnQg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4 ZDkzOTFjIj4NCjxwPkhlbGxvIGFsbCwgPC9wPg0KPHA+SXQgaGFzIGJlZW4gbG9uZyBtYXR1cmlu ZywgYnV0IExlYXJuLU9DYW1sIDEuMCBpcyBhYm91dCB0byBiZSByZWxlYXNlZC4gPC9wPg0KPGJs b2NrcXVvdGU+DQo8cD48Yj5MZWFybi1PQ2FtbDwvYj4gaXMgYSB3ZWIgcGxhdGZvcm0gZm9yIGV4 ZXJjaXNlcyBpbiBPQ2FtbCBwcm9ncmFtbWluZywgd2l0aCBhdXRvbWF0ZWQgZ3JhZGluZywgb3Jp Z2luYWxseSBkZXZlbG9wcGVkIGZvciB0aGUgT0NhbWwgTU9PQy4gVGhlIGludGVyZmFjZSBmZWF0 dXJlcyBhIGNvZGUgZWRpdG9yIGFuZCBjbGllbnQtc2lkZSBldmFsdWF0aW9uIGFuZCBncmFkaW5n IDsgaXQgY2FuIGJlIHNlcnZlZCBzdGF0aWNhbGx5LCBidXQgaWYgcnVubmluZw0KIHRoZSBidW5k bGVkIHNlcnZlciB0aGVyZSBhcmUgYWxzbyBzZXJ2ZXItc2lkZSBzYXZlcywgZmFjaWxpdGllcyBm b3IgdGVhY2hlcnMgdG8gZm9sbG93IHRoZSBwcm9ncmVzcyBvZiBzdHVkZW50cywgZ2l2ZSBhc3Np Z25tZW50cywgZ2V0IGdyYWRlcywgZXRjLg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0ZWJhNDQ0IiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnNGViYTQ0NCI+V2hhdOKAmXMgbmV3PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc0ZWJhNDQ0Ij4NCjxwPlRoaXMgZmlyc3QgbWFqb3IgcmVs ZWFzZSwgYWxvbmcgd2l0aCBhIGxvdCBvZiBxdWFsaXR5LW9mLWxpZmUgaW1wcm92ZW1lbnRzLCBm ZWF0dXJlcyBhIHNpZ25pZmljYW50IHJld3JpdGUgb2YgdGhlIGV2YWx1YXRpb24gZW5naW5lLiBU aGUgbWFpbiB2aXNpYmxlIGNvbnNlcXVlbmNlcyBhcmU6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+YSBuaWNlIHNwZWVkdXAgdG8gdGhlIGdyYWRpbmcgb2YgZXhlcmNpc2VzIGluIHRo ZSBicm93c2VyIDwvbGk+PGxpPmEgaHVnZSAoeDEwMCkgc3BlZWR1cCB0byB0aGUgcHJlLXByb2Nl c3Npbmcgb2YgdGhlIGV4ZXJjaXNlcyAod2hlbiBydW5uaW5nIDxjb2RlPg0KbGVhcm4tb2NhbWwg YnVpbGQ8L2NvZGU+KSA8L2xpPjxsaT5leGVyY2lzZSBzb2x1dGlvbnMgY2FuIG5vIGxvbmdlciBs ZWFrICh0aGUgc2VydmVyIG9ubHkgcHJvdmlkZXMgdGhlIGFscmVhZHkgY29tcGlsZWQganNvbyB2 ZXJzaW9uIHRvIHRoZSBjbGllbnQpLCBtYWtpbmcgdGhlIHBsYXRmb3JtIG1vcmUgc3VpdGFibGUg Zm9yIGV2YWx1YXRpb25zDQo8L2xpPjxsaT5lcnJvciBtZXNzYWdlcyB3aGVuIGNvbXBpbGluZyBl eGVyY2lzZXMgYXJlIG11Y2gsIG11Y2ggYmV0dGVyIDwvbGk+PC91bD4NCjxwPkEgZmV3IG90aGVy IG1vc3Qtd2FudGVkIGZlYXR1cmVzIGhhdmUgYWxzbyBiZWVuIGFkZGVkLCBsaWtlIGEgcmV3b3Jr ZWQgZXhlcmNpc2UgY2hvaWNlIHBhZ2UsIGFuZCB0aGUgYWJpbGl0eSB0byB1cGRhdGUgYSBydW5u aW5nIGluc3RhbmNlIHdpdGggbWluaW1hbCBkb3dudGltZSAoPGNvZGU+bGVhcm4tb2NhbWwgYnVp bGQgc2VydmUgLS1yZXBsYWNlPC9jb2RlPikNCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxOTVmODYyIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBp ZD0ib3JnMTk1Zjg2MiI+RnV0dXJlIHZlcnNpb25zPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmcxOTVmODYyIj4NCjxwPkFub3RoZXIgbW9zdC13YW50ZWQgZmVh dHVyZSBpcyBhIHByb3BlciBsb2dpbiBzeXN0ZW0gKHdpdGggY2hvaWNlIGJldHdlZW4gZW1haWwv cGFzc3dvcmQgb3IgYSBNb29kbGUgc2VydmVyKSA7IHdlIGV4cGVjdCBpdCB0byBsYW5kIHNob3J0 bHkgaW4gMS4xLCBvbmNlIHdlIHdvcmsgb24gdGhlIHJlbWFpbmluZyByb3VnaCBlZGdlcyBvZiBv dXIgYWxyZWFkeSB3b3JraW5nIHByb3RvdHlwZS4NCjwvcD4NCjxwPlBvcnRpbmcgdG8gbW9yZSBy ZWNlbnQgdmVyc2lvbnMgb2YgT0NhbWwgaXMgYWxzbyBwbGFubmVkLiA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDUwNDFjZSIgY2xhc3M9Im91dGxp bmUtNCI+DQo8aDQgaWQ9Im9yZzQ1MDQxY2UiPlRlc3RlcnMgcmVxdWlyZWQhPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc0NTA0MWNlIj4NCjxwPkFzIHRoaXMg dmVyc2lvbiBmZWF0dXJlcyBsYXJnZSBpbnRlcm5hbCBjaGFuZ2VzLCB3ZSB3b3VsZCBiZSB2ZXJ5 IGdyYXRlZnVsIHRvIHRlYWNoZXJzIHdobyBhZ3JlZWluZyB0byB0cnkgaXQgb3V0IGFuZCByZXBv cnQgYW55IHJlZ3Jlc3Npb25zIGJlZm9yZSBwdWJsaWNhdGlvbiAoZXhwZWN0ZWQgYnkgdGhlIGVu ZCBvZiB0aGUgeWVhcikuDQo8L3A+DQo8cD5UaGVyZSBhcmUgdHdvIHJlY29tbWVuZGVkIHdheXMg dG8gdGVzdCB0aGUgdXBjb21pbmcgdmVyc2lvbjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPg0KPHA+Jmd0O0Zyb20gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xl YXJuLW9jYW1sIj5zb3VyY2U8L2E+OiBmb2xsb3cgdGhlIG9ubGluZSBpbnN0cnVjdGlvbnMsIG9y IHVzZSB0aGUgZm9sbG93aW5nIGZvciBjcmVhdGluZyBhIHRlbXBvcmFyeSBpbnN0YWxsYXRpb24g aW4gYSBsb2NhbCBvcGFtIHN3aXRjaCB0aGF0IHlvdSBjYW4gZWFzaWx5IHJlbW92ZSBhZnRlcndh cmRzOg0KPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZ2NkNTM1YTEiPg0KICAgICAg b3BhbSB1cGRhdGUNCiAgICAgIG9wYW0gc291cmNlIGxlYXJuLW9jYW1sIC0tZGV2IC0tZGlyPWxl YXJuLW9jYW1sLWJldGEgJmFtcDsmYW1wOyBcDQogICAgICAgIGNkIGxlYXJuLW9jYW1sLWJldGEg JmFtcDsmYW1wOyBcDQogICAgICAgIG9wYW0gc3dpdGNoIGNyZWF0ZSAuIC0tbG9ja2VkICZhbXA7 JmFtcDsgXA0KICAgICAgICBleHBvcnQgT1BBTVNXSVRDSD0kUFdEICZhbXA7JmFtcDsgXA0KICAg ICAgICBldmFsICQob3BhbSBlbnYpDQogICAgICBsZWFybi1vY2FtbCBidWlsZCBzZXJ2ZSAtLXJl cG89UkVQT1NJVE9SWQ0KPC9wcmU+DQo8L2xpPjxsaT4NCjxwPlVzaW5nIGEgcHJlLWJ1aWx0IERv Y2tlciBpbWFnZSAod2l0aCBSRVBPU0lUT1JZIGFuIGFic29sdXRlIHBhdGgsIHRvIGUuZy4gYSBs b2NhbCBjbG9uZSBvZg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJu LW9jYW1sLWNvcnB1cyI+dGhlIGNvcnB1czwvYT4g4oCUIHNlZSBiZWxvdykNCjwvcD4NCjxwcmUg Y2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdkY2MyNTJkIj4NCiAgICAgIGRvY2tlciBydW4gLS1ybSBc DQogICAgICAgIC12IFJFUE9TSVRPUlk6L3JlcG9zaXRvcnk6cm8gXA0KICAgICAgICAtdiBsZWFy bi1vY2FtbC1iZXRhLXN5bmM6L3N5bmMgXA0KICAgICAgICAtcCA4MDo4MDgwIFwNCiAgICAgICAg LS1uYW1lIGxlYXJuLW9jYW1sLWJldGEgXA0KICAgICAgICBvY2FtbHNmL2xlYXJuLW9jYW1sOm1h c3Rlcg0KPC9wcmU+DQo8L2xpPjwvdWw+DQo8cD5QbGVhc2UgcmVwb3J0IDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFybi1vY2FtbC9pc3N1ZXMiPmluIEdpdGh1YjwvYT4s IG9yIGNvbnRhY3QgdXMgZGlyZWN0bHkgZm9yIGZlZWRiYWNrLg0KPC9wPg0KPHA+RGV2ZWxvcG1l bnQgc3RhdGljIGJ1aWxkcyBhcmUgYWxzbyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC1zZi5vcmcvbGVhcm4tb2NhbWwvYXJ0aWZhY3RzLyI+DQpodHRwczovL29jYW1sLXNmLm9y Zy9sZWFybi1vY2FtbC9hcnRpZmFjdHMvPC9hPiA7IHRlc3RzIG9uIHRoZSBzdGFuZGFsb25lIGNs aWVudCBhbmQgc2VydmVyIHdvdWxkIGJlIGhlbHBmdWwgKHRoZSBtYWluIGJpbmFyeSByZXF1aXJl cyBhIGhvc3QgT0NhbWwgaW5zdGFsbGF0aW9uIHdpdGggdGhlIGFwcHJvcHJpYXRlIGxlYXJuLW9j YW1sIGxpYnJhcmllcyBpbiBvcmRlciB0byBjb21waWxlIHRoZSBleGVyY2lzZXMsIHNvIHRoZSBz dGFuZC1hbG9uZQ0KIHZlcnNpb24gaXMgdW5saWtlbHkgdG8gYmUgb2YgdXNlKSA8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZjQ0ZTM0MiIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Y0NGUzNDIiPlRoZSBMZWFybi1vY2FtbCBDb3JwdXM8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2Y0NGUzNDIiPg0K PHA+SeKAmWQgYWxzbyBsaWtlIHRvIHRha2UgdGhlIG9wcG9ydHVuaXR5IHRvIHBvaW50IG91dCB0 aGUgbmV3IGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHB1YmxpYw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLXNmL2xlYXJuLW9jYW1sLWNvcnB1cyI+ZXhlcmNpc2UgY29ycHVzPC9hPiBi eSBTaW3Do28gTWVsbyBkZSBTb3VzYSBhbmQgSHVnbyBGw6lyw6llLCB3aGljaCBjb21wbGV0ZSB0 aGUgZXhpc3RpbmcgZXhlcmNpc2VzIGZyb20gdGhlIE9DYW1sIE1PT0MgYW5kIHRoZSBtb3JlIGFk dmFuY2VkIG9uZXMgZnJvbSBGcmFuw6dvaXMgUG90dGllciwgYXMgd2VsbCBhcyB0aGUgY3VyYXRp b24gd29yayBieSBNb2hhbWVkDQogSGVybm91ZiBhbmQgRGFyaW8gUGludG8uIDwvcD4NCjxwPllv dSBjYW4gdGVzdCB0aGUgY29ycHVzIHdpdGggPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9 Im9yZzMxNjg1NWIiPg0KICAgIGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtc2Yv bGVhcm4tb2NhbWwtY29ycHVzDQogICAgbGVhcm4tb2NhbWwgYnVpbGQgc2VydmUgLS1yZXBvPS4v bGVhcm4tb2NhbWwtY29ycHVzDQo8L3ByZT4NCjxwPkEgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1z Zi5vcmcvbGVhcm4tb2NhbWwtcHVibGljIj5saXZlIHZlcnNpb248L2E+IGlzIGFsc28gYXZhaWxh YmxlLg0KPC9wPg0KPHA+4oCUIExvdWlzIEdlc2JlcnQgKE9DYW1sUHJvKSwgb24gYmVoYWxmIG9m IHRoZSBMZWFybi1PQ2FtbCB0ZWFtIDwvcD4NCjxwPldpdGggdGhhbmtzIHRvIHRoZSBPQ2FtbCBG b3VuZGF0aW9uIGZvciBmdW5kaW5nIHRoZSBtYWpvciBwYXJ0IG9mIHRoaXMgd29yay4gPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+Y21hcmtpdCAwLjMuMCDigJMgQ29t bW9uTWFyayBwYXJzZXIgYW5kIHJlbmRlcmVyIGZvciBPQ2FtbDwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNtYXJraXQtMC0zLTAtY29tbW9ubWFyay1wYXJzZXIt YW5kLXJlbmRlcmVyLWZvci1vY2FtbC8xMzYyMi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tY21hcmtpdC0wLTMtMC1jb21tb25tYXJrLXBhcnNlci1hbmQtcmVuZGVyZXItZm9y LW9jYW1sLzEzNjIyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzBmMTZiNmQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwZjE2YjZkIj5E YW5pZWwgQsO8bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzBmMTZiNmQiPg0KPHA+SGVsbG8sIDwvcD4NCjxwPlRoZXJl4oCZcyBhIG5l dyByZWxlYXNlIG9mIDxjb2RlPmNtYXJraXQ8L2NvZGU+LCBhbiBJU0MtbGljZW5zZWQgQ29tbW9u TWFyayBwYXJzZXIgYW5kIHJlbmRlcmVyIGZvciBPQ2FtbC4NCjwvcD4NCjxwPlRoaXMgaXMgYSBi dWcgZml4IHJlbGVhc2UgYnV0IGl0IGFsc28gYWRkcyBhIDxjb2RlPi1mPC9jb2RlPiBvcHRpb24g dG8gPGNvZGU+Y21hcmtpdCBodG1sPC9jb2RlPiB0byByZW5kZXIgZnVsbC1mZWF0dXJlZCBkb2N1 bWVudHMgd2l0aCBhbGwgZXh0ZW5zaW9ucyBlbmFibGVkIGluY2x1ZGluZyBtYXRoIHJlbmRlcmlu ZyBhbmQgc2VjdGlvbiBhbmNob3JzIHdpdGhvdXQgaGFzc2xlIHdpdGgNCjxjb2RlPmNtYXJraXQg aHRtbCAtZiBteWRvYy5tZCAmZ3Q7IG15ZG9jLmh0bWw8L2NvZGU+IOKAkyBiZWZvcmUgdGhhdCBh biBpbnNhbmUgYW1vdW50IG9mIG9wdGlvbnMgaGFkIHRvIGJlIHNwZWNpZmllZCwgc2VlDQo8Y29k ZT5jbWFya2l0IGh0bWwgLS1oZWxwPC9jb2RlPiBmb3IgZGV0YWlscy4gPC9wPg0KPHA+QWxsIHRo ZSBkZXRhaWxzIGFyZSBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxp L2NtYXJraXQvYmxvYi9tYWluL0NIQU5HRVMubWQjdjAzMC0yMDIzLTEyLTEyLWxhLWZvcmNsYXot dnMiPg0KcmVsZWFzZSBub3RlczwvYT4uIFRoYW5rcyB0byBAamNoYXZhcnJpIGFuZCBAM1JhZmFs IGZvciByZXBvcnRpbmcgaXNzdWVzLiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SG9t ZXBhZ2U6IDxhIGhyZWY9Imh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtYXJraXQiPmh0 dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtYXJraXQ8L2E+DQo8L2xpPjxsaT5Eb2NzOiA8 YSBocmVmPSJodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9jbWFya2l0L2RvYyI+aHR0cHM6 Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21hcmtpdC9kb2M8L2E+IChvcg0KPGNvZGU+b2RpZyBk b2MgY21hcmtpdDwvY29kZT4pIDwvbGk+PGxpPkluc3RhbGw6IDxjb2RlPm9wYW0gaW5zdGFsbCBj bWFya2l0PC9jb2RlPiA8L2xpPjwvdWw+DQo8cD5BIGJpZyB0aGFua3MgdG8gbXkgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpLyI+ZG9uYXRvcnM8L2E+LiBJIHdl bGNvbWUgYW5kIHRoYW5rIHRoZSBuZXcgZG9uYXRvciBAemJheWxpbi4NCjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI0Ij5kcmVhbS1odG1sIDIuMC4wPC9oMj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0yLTAtMC8xMzYyNi8xIj5odHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRyZWFtLWh0bWwtMi0wLTAvMTM2MjYvMTwvYT4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTBmYzUxYyIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzUwZmM1MWMiPllhd2FyIEFtaW4gYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc1MGZjNTFjIj4NCjxw PkhpLCBkcmVhbS1odG1sIDIuMC4wIGhhcyBiZWVuIHJlbGVhc2VkIHRvIG9wYW06IDxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwub3JnL3AvZHJlYW0taHRtbC9sYXRlc3QiPg0KaHR0cHM6Ly9vY2FtbC5v cmcvcC9kcmVhbS1odG1sL2xhdGVzdDwvYT4gPC9wPg0KPHA+UmVwbzogPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL3lhd2FyYW1pbi9kcmVhbS1odG1sIj5odHRwczovL2dpdGh1Yi5jb20veWF3 YXJhbWluL2RyZWFtLWh0bWw8L2E+IEFQSSBkb2NzOg0KPGEgaHJlZj0iaHR0cHM6Ly95YXdhcmFt aW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJlYW0taHRtbC9EcmVhbV9odG1sL2luZGV4Lmh0bWwi Pg0KaHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJlYW0taHRtbC9EcmVh bV9odG1sL2luZGV4Lmh0bWw8L2E+IDwvcD4NCjxwPkRyZWFtLWh0bWwgaXMgYSBsaWJyYXJ5IGZv ciBnZW5lcmF0aW5nIEhUTUwsIGNsb3NlbHkgaW50ZWdyYXRlZCB3aXRoIERyZWFtLiBJdCBjYW4g YmUgdXNlZCBhcyBhbiBhbHRlcm5hdGl2ZSB0byBEcmVhbeKAmXMgYnVpbHQtaW4gRW1iZWRkZWQg TUwgdGVtcGxhdGluZyBsYW5ndWFnZS4gSGVyZeKAmXMgdGhlIERyZWFtIGhvbWUgcGFnZSBleGFt cGxlIHVzaW5nIGRyZWFtLWh0bWw6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5l ciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNh NzYwMWY7Ij5oZWxsbzwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+d2hvPC9z cGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5EcmVhbV9odG1s PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5IVE1MPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48 L3NwYW4+DQogIGh0bWwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNv bG9yOiAjZmNmN2VmOyI+W108L3NwYW4+IFsNCiAgICBib2R5IDxzcGFuIHN0eWxlPSJjb2xvcjog IzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiBbDQogICAgICBo MSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5bXTwvc3Bhbj4gW3R4dCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtIZWxs bywgJXMhJnF1b3Q7PC9zcGFuPiB3aG9dXV0NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gKCkgPQ0KICA8c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5EcmVhbS48L3NwYW4+cnVuDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1 MmEyYTsiPkBAPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5EcmVhbS48L3Nw YW4+bG9nZ2VyDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPkBAPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5EcmVhbS48L3NwYW4+cm91dGVyIFs8c3BhbiBzdHls ZT0iY29sb3I6ICM0NDRmY2Y7Ij5EcmVhbS48L3NwYW4+Z2V0IDxzcGFuIHN0eWxlPSJjb2xvcjog I2NhMzQwMDsiPiZxdW90Oy8mcXVvdDs8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZm MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDdhOWY7Ij5fPC9zcGFuPiAtJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5EcmVh bV9odG1sLjwvc3Bhbj5yZXNwb25kIChoZWxsbyA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7 Ij4mcXVvdDt3b3JsZCZxdW90Ozwvc3Bhbj4pKV0NCjwvcHJlPg0KPC9kaXY+DQo8cD5JbiB0aGlz IHJlbGVhc2UsIEkgbWFkZSBhIGJyZWFraW5nIGNoYW5nZSAoaGVuY2UgbWFqb3IgdmVyc2lvbiBi dW1wKSB0byByZXN0cmljdCB0aGUNCjxjb2RlPmNhcHR1cmU8L2NvZGU+IGF0dHJpYnV0ZSB0byBv bmx5IHRoZSB2YWx1ZXMgPGNvZGU+YHVzZXI8L2NvZGU+IG9yIDxjb2RlPmBlbnZpcm9ubWVudDwv Y29kZT4uIFByZXZpb3VzbHkgaXQgd2FzIGFjY2VwdGluZyBhbnkgZm9ybWF0IHN0cmluZy4NCjwv cD4NCjxwPlBsdXMgYSBzbWFsbCBhZGRpdGlvbiwgdGhlIDxjb2RlPmF1dG9jb21wbGV0ZTwvY29k ZT4gYXR0cmlidXRlIG5vdyBhbHNvIGFjY2VwdHMgdGhlDQo8Y29kZT5gd2ViYXV0aG48L2NvZGU+ IHZhbHVlLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+Q0FJU0FSIHJlbGVhc2Ug MS4wLCBhIHBsYXRmb3JtIGZvciBjaGFyYWN0ZXJpemluZyBBSSBzYWZldHkgYW5kIHJvYnVzdG5l c3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jYWlzYXItcmVs ZWFzZS0xLTAtYS1wbGF0Zm9ybS1mb3ItY2hhcmFjdGVyaXppbmctYWktc2FmZXR5LWFuZC1yb2J1 c3RuZXNzLzEzNjM0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jYWlzYXIt cmVsZWFzZS0xLTAtYS1wbGF0Zm9ybS1mb3ItY2hhcmFjdGVyaXppbmctYWktc2FmZXR5LWFuZC1y b2J1c3RuZXNzLzEzNjM0LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzAzYmM5YTUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwM2JjOWE1 Ij5KdWxpZW4gR2lyYXJkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnMDNiYzlhNSI+DQo8cD5EZWFyIGFsbCwgPC9wPg0KPHA+b24gdGhlIG9j Y2FzaW9uIG9mIHRoZSA2OHRoIGJpcnRoZGF5IG9mIHRoZSBGbGFnIG9yIEV1cm9wZSwgd2UgYXJl IGRlbGlnaHRlZCB0byByZWxlYXNlIHRoZSB2ZXJzaW9uIDEuMCBvZiBDQUlTQVIuIFRoZSByZWxl YXNlIHNvdXJjZSBpcyBhdmFpbGFibGUgdW5kZXIgb3VyDQo8YSBocmVmPSJodHRwczovL2dpdC5m cmFtYS1jLmNvbS9wdWIvY2Fpc2FyLyI+Z2l0bGFiPC9hPi4gWW91IGNhbiBpbnN0YWxsIGl0IHZp YSBvcGFtIHdpdGgNCjxjb2RlPm9wYW0gaW5zdGFsbCBjYWlzYXI8L2NvZGU+LiBXZSBhbHNvIGhh dmUgYSBkb2NrZXIgaW1hZ2UgaG9zdGVkIG9uIERvY2tlcmh1YiBwYWNrYWdpbmcgQ0FJU0FSIGFu ZCBzb21lIGRlZGljYXRlZCBwcm92ZXJzLiBZb3UgY2FuIHB1bGwgaXQgd2l0aA0KPGNvZGU+ZG9j a2VyIHB1bGwgbGFpc2VyL2NhaXNhcjpwdWI8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzQxZWY1MzUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlk PSJvcmc0MWVmNTM1Ij5FeHRlbnNpb25zIG9mIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UgYW5kIGlu dGVycHJldGF0aW9uIGNhcGFiaWxpdGllczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NCIgaWQ9InRleHQtb3JnNDFlZjUzNSI+DQo8cD5XZSBleHRlbmRlZCB0aGUgV2h5TUwgc3BlY2lm aWNhdGlvbiBsYW5ndWFnZSB0byB0YWtlIGludG8gYWNjb3VudCBjb21tb24gbWFjaGluZSBsZWFy bmluZyBjb25zdHJ1Y3RzLiBJdCBpcyBub3cgcG9zc2libGUgdG8gbW9kZWwgbWFjaGluZSBsZWFy bmluZyBjb21wdXRhdGlvbnMgdXNpbmcgdmVjdG9ycyBhbmQgZGF0YXNldHMuIFBhcnRzIG9mIHRo aXMgc3BlY2lmaWNhdGlvbiBjYW4gYmUgaW50ZXJwcmV0ZWQgZGlyZWN0bHkgYnkgQ0FJU0FSLg0K IENBSVNBUiBjYW4gdGhlbiBpbnN0YW5jaWF0ZSB0aGUgc3BlY2lmaWNhdGlvbiB3aXRoIGNvbmNy ZXRlIHZhbHVlcyBwcm92aWRlZCBieSB0aGUgdXNlci4gQ0FJU0FSIGNhbiBhbHNvIGNvbXB1dGUg dGhlIHJlc3VsdHMgb2Ygb3BlcmF0aW9ucyBvbiB2ZWN0b3JzIHN1Y2ggYXMgZ2V0dGluZyBhbiBp bmRleCBvbiBhIGNvbmNyZXRlIHZlY3Rvciwgb3Igbm9ybWFsaXppbmcgYSBkYXRhc2V0LiBGaW5h bGx5LCB0aGlzIGxhbmd1YWdlIGFsbG93cyB0bw0KIHBlcmZvcm0gdHJhbnNmb3JtYXRpb25zIG9u IHRoZSBwcm9vZiBnb2FscyB0aGF0IG1ha2VzIHRoZW0gbW9yZSBhbWVuYWJsZSBmb3IgcHJvdmVy cy4NCjwvcD4NCjxwPlRoZSBlbmQgcmVzdWx0IGlzIGEgY2xlYW5lciBtb2RlbGxpbmcgbGFuZ3Vh Z2UgdGhhdCBiZWhhdmVzIOKAnGFzIGV4cGVjdGVk4oCdIGZvciB0aGUgdXNlciwgYnJpZGdpbmcg dGhlIGdhcCBiZXR3ZWVuIHRoZSBzcGVjaWZpY2F0aW9uIGFuZCB0aGUgYWN0dWFsIHN5c3RlbSB0 byB2ZXJpZnkuIFdlIGJlbGlldmUgdGhhdCB0aGlzIHdpbGwgc3VyZWx5IGJlIGhlbHBmdWwgZm9y IHRoZSBjb21tdW5pdHkuDQo8L3A+DQo8cD5DaGVjayB0aGUgdXBkYXRlZCA8YSBocmVmPSJodHRw czovL3d3dy5jYWlzYXItcGxhdGZvcm0uY29tL2RvY3VtZW50YXRpb24vYWNhc194dSI+DQpkb2N1 bWVudGF0aW9uIGV4YW1wbGVzPC9hPiB0byBnZXQgYSBncmFzcCBvbiB0aGUgbmV3IGxhbmd1YWdl LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZjdi NDUxZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Y3YjQ1MWQiPlVzYWJpbGl0eTwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZjdiNDUxZCI+DQo8 cD5JdCBpcyBub3cgcG9zc2libGUgdG8gc3BlY2lmeSB3aGljaCB0aGVvcmllcyBhbmQvb3IgZ29h bHMgdG8gY2hlY2sgd2l0aGluIGEgc3BlY2lmaWNhdGlvbi4gQ0FJU0FSIGlzIG5vdyBhdmFpbGFi bGUgYXMgYSBOaXggZmxha2UuIFdlIHBsYW4gdG8gbWFrZSBpdCBhdmFpbGFibGUgb24gbml4cGtn cyBpbiBhIGZ1dHVyZSByZWxlYXNlLiBXZSBhZGRlZCBhIGNvbnRyaWJ1dGlvbiBndWlkZSBpbiB0 aGUgbWFudWFsLCB1bmRlciB0aGUg4oCcQ29udHJpYnV0aW5n4oCdDQogc2VjdGlvbi4gPC9wPg0K PHA+TWVycnkgZW5kLW9mLXllYXIgY2VsZWJyYXRpb25zISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI2Ij5XZWIgQW5hbHl0aWNzIG9uIE9DYW1sLm9yZzwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2ViLWFuYWx5dGljcy1vbi1vY2FtbC1vcmcv MTMxODgvOSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2ViLWFuYWx5dGljcy1vbi1v Y2FtbC1vcmcvMTMxODgvOTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdhOWQ1OGM4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYTlkNThjOCI+ VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmdhOWQ1OGM4Ij4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhh dCB3ZeKAmXZlIHJvbGxlZCBvdXQgdGhlIFBsYXVzaWJsZSBpbnN0YW5jZSBvbiB0aGUgT0NhbWwu b3JnIGluZnJhc3RydWN0dXJlLg0KPC9wPg0KPHA+VGhlIHB1YmxpYyBkYXNoYm9hcmQgaXMgY3Vy cmVudGx5IGFjY2Vzc2libGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9wbGF1c2libGUuY2kuZGV2L29j YW1sLm9yZyI+DQpodHRwczovL3BsYXVzaWJsZS5jaS5kZXYvb2NhbWwub3JnPC9hPiwgYW5kIHdl IHBsYW4gdG8gdXBkYXRlIHRoZSBPQ2FtbC5vcmcgRE5TIHRvIHByb3ZpZGUgYSBwbGF1c2libGUu b2NhbWwub3JnIFVSTC4NCjwvcD4NCjxwPlRoaXMgaXMgYWxyZWFkeSBzaG93aW5nIHZlcnkgaW50 ZXJlc3RpbmcgcmVzdWx0cyAodGhlIG5ldyA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW5ldy1nZXQtc3RhcnRlZC1kb2N1bWVudGF0aW9uLW9uLW9jYW1sLW9yZy8xMzI2 OSI+DQpHZXR0aW5nIFN0YXJ0ZWQgZG9jdW1lbnRhdGlvbjwvYT4gYXJlIHRoZSBtb3N0IHZpc2l0 ZWQgcGFnZXMgb2YgdGhlIHNpdGUhKSwgYW5kIHdlIGNhbuKAmXQgd2FpdCB0byBzZWUgaG93IHRo ZSBpbXByb3ZlbWVudHMgd2XigJlyZSBtYWtpbmcgdG8gT0NhbWwub3JnIGFyZSByZWZsZWN0ZWQg aW4gdGhlIHVzYWdlIG9mIHRoZSBzaXRlLg0KPC9wPg0KPHA+QXMgYSByZW1pbmRlciwgUGxhdXNp YmxlIGlzIGEgcHJpdmFjeS1mb2N1c2VkIFdlYiBhbmFseXRpY3Mgc2VydmljZSwgd2hpY2ggd2Ug c2VsZi1ob3N0IG9uIHRoZSBPQ2FtbC5vcmcgaW5mcmFzdHJ1Y3R1cmUuIE5vIHBlcnNvbmFsIGRh dGEgaXMgY29sbGVjdGVkIGFuZCB3ZSByZW1haW4gZnVsbHkgY29tcGxpYW50IHdpdGggR0RQUiwg Q0NQQSBhbmQgUEVDUi4gVGhlIGluZm9ybWF0aW9uIHlvdSBoYXZlIG9uIHRoZSBwdWJsaWMgZGFz aGJvYXJkDQogaXMgdGhlIGluZm9ybWF0aW9uIHdlIGhhdmUsIGFuZCBhcyB5b3UgY2FuIHNlZSwg dGhpcyBpcyBhbGwgYWdncmVnYXRlZCBpbmZvcm1hdGlvbiB3aGljaCBpcyBuZXZlciB0cmFjZWQg dG8gaW5kaXZpZHVhbHMuIERvbuKAmXQgaGVzaXRhdGUgdG8gcmVhZCBtb3JlIGFib3V0IHdoYXQg UGxhdXNpYmxlIGRvZXMgdG8gcmVzcGVjdCB5b3VyIHByaXZhY3kgYXQNCjxhIGhyZWY9Imh0dHBz Oi8vcGxhdXNpYmxlLmlvL3ByaXZhY3ktZm9jdXNlZC13ZWItYW5hbHl0aWNzIj5odHRwczovL3Bs YXVzaWJsZS5pby9wcml2YWN5LWZvY3VzZWQtd2ViLWFuYWx5dGljczwvYT4uDQo8L3A+DQo8cD5U aGFuayB5b3UgYWxsISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+VHV0b3JpYWwg b24gTXV0YWJpbGl0eSwgTG9vcHMsIGFuZCBJbXBlcmF0aXZlIFByb2dyYW1taW5nPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90dXRvcmlhbC1vbi1tdXRhYmlsaXR5LWxv b3BzLWFuZC1pbXBlcmF0aXZlLXByb2dyYW1taW5nLzEzNjQ0LzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3R1dG9yaWFsLW9uLW11dGFiaWxpdHktbG9vcHMtYW5kLWltcGVyYXRpdmUt cHJvZ3JhbW1pbmcvMTM2NDQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnZjFhNzUwZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2YxYTc1 MGYiPkN1aWh0bGF1YWMgQWx2YXJhZG8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmMWE3NTBmIj4NCjxwPkRlYXIgT0NhbWxlcnMsIDwvcD4N CjxwPlRoZSBPQ2FtbC5vcmcgaXMgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgdGhl IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvbXV0YWJpbGl0eS1sb29wcy1hbmQtaW1w ZXJhdGl2ZSI+DQpNdXRhYmlsaXR5LCBMb29wcywgYW5kIEltcGVyYXRpdmUgUHJvZ3JhbW1pbmc8 L2E+IHR1dG9yaWFsIHdoaWNoIHdhcyA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvZHJhZnQtdHV0b3JpYWwtb24tbXV0YWJpbGl0eS1sb29wcy1hbmQtaW1wZXJhdGl2ZS1wcm9n cmFtbWluZyI+DQpkaXNjdXNzZWQ8L2E+IGhlcmUgYSBjb3VwbGUgb2Ygd2Vla3MgYWdvLiBXZeKA mXZlIGluY2x1ZGVkIGZlZWRiYWNrIGZyb20gdGhhdCB0aHJlYWQuDQo8L3A+DQo8cD5UaGUgPGI+ dGFyZ2V0IGF1ZGllbmNlPC9iPiBpcyBkZXZlbG9wZXJzIGxlYXJuaW5nIE9DYW1sLiBObyBmdW5j dGlvbmFsIHByb2dyYW1taW5nIGtub3dsZWRnZSBpcyBhc3N1bWVkLiBIb3dldmVyLCBpdCBjb21l cyBhZnRlciB0aGUgdXBkYXRlZCDigJxHZXQgU3RhcnRlZOKAnSBzZXJpZXM6DQo8L3A+DQo8b2wg Y2xhc3M9Im9yZy1vbCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9pbnN0 YWxsaW5nLW9jYW1sIj5JbnN0YWxsaW5nIE9DYW1sPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9kb2NzL3RvdXItb2Ytb2NhbWwiPkEgVG91ciBvZiBPQ2FtbDwvYT4gPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy95b3VyLWZpcnN0LXByb2dyYW0i PllvdXIgRmlyc3QgT0NhbWwgUHJvZ3JhbTwvYT4NCjwvbGk+PC9vbD4NCjxwPkFuZCBpdCBjb21l cyBhdCB0aGUgZW5kIG9mIHRoZSDigJxJbnRyb2R1Y3Rpb27igJ0gc2VyaWVzIChjdXJyZW50bHkg YmVpbmcgdXBkYXRlZCB0b28pOg0KPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvdmFsdWVzLWFuZC1mdW5jdGlvbnMiPlZhbHVlcyBh bmQgRnVuY3Rpb25zPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9j cy9iYXNpYy1kYXRhLXR5cGVzIj5CYXNpYyBEYXRhdHlwZXMgYW5kIFBhdHRlcm4gTWF0Y2hpbmc8 L2E+DQo8L2xpPjxsaT5JZiBTdGF0ZW1lbnRzIGFuZCBSZWN1cnNpb25zIDwvbGk+PGxpPkxpc3Rz IDwvbGk+PGxpPkxhYmVsbGVkICZhbXA7IE9wdGlvbmFsIEFyZ3VtZW50cyA8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL3N0YWdpbmcub2NhbWwub3JnL2RvY3MvbXV0YWJpbGl0eS1sb29wcy1hbmQt aW1wZXJhdGl2ZSI+TXV0YWJpbGl0eSwgTG9vcHMsIGFuZCBJbXBlcmF0aXZlIFByb2dyYW1taW5n PC9hPg0KPC9saT48L29sPg0KPHA+VGhlIGluaXRpYWwgUFIgaXMgbm93IGNsb3NlZCwgYnV0IHRo aXMgaXMgb3BlbiBzb3VyY2UuIFdl4oCZcmUgaGFwcHkgdG8gcmVjZWl2ZSBmZWVkYmFjayBoZXJl IG9yIGluIEdpdEh1YiwgYXMgaXNzdWVzIG9yIFBSLiBZb3UgY2FuIGFsc28gdXNlIHRoZSDigJxD b250cmlidXRl4oCdIGxpbmsgYXQgdGhlIGJvdHRvbSBvZiB0aGUgc3RhZ2luZyBwYWdlLg0KPC9w Pg0KPHA+VGhhbmtzIHRvIEB6YmF5bGluLCBAc2lsZW5lIGFuZCBAS19OIGZvciB0aGVpciBmZWVk YmFjayBvbiB0aGUgZHJhZnQuIDwvcD4NCjxwPkhvcGUgaXQgaGVscHMgPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjgiPlJGU00gdmVyc2lvbiAyLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZnNtLXZlcnNpb24tMi0wLzEzNjQ1LzEiPmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmZzbS12ZXJzaW9uLTItMC8xMzY0NS8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhZDU2YmI0IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYWQ1NmJiNCI+anNlcm90IGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYWQ1NmJiNCI+DQo8cD5JdOKA mXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIGF2YWlsYWJpbGl0eSBvZiB2ZXJzaW9uIDxj b2RlPjIuMDwvY29kZT4gb2YgdGhlDQo8Y29kZT5SRlNNPC9jb2RlPiBsYW5ndWFnZSBhbmQgY29t cGlsZXIuIDwvcD4NCjxwPjxjb2RlPlJGU008L2NvZGU+IGlzIGEgZG9tYWluIHNwZWNpZmljIGxh bmd1YWdlIGZvciBkZXNjcmliaW5nLCBzaW11bGF0aW5nIGFuZCBnZW5lcmF0aW5nIGNvZGUgZnJv bQ0KPGk+cmVhY3RpdmUgZmluaXRlIHN0YXRlIG1hY2hpbmVzPC9pPi4gPC9wPg0KPHA+Jmd0O0Zy b20gYSBkZXNjcmlwdGlvbiBvZiBhIHN5c3RlbSBjb21wb3NlZCBvZiBhIHNldCBvZiByZWFjdGl2 ZSBGU01zLCB0aGUgPGNvZGU+DQpSRlNNPC9jb2RlPiBjb21waWxlciBjYW4gZ2VuZXJhdGUgPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmdyYXBoaWNhbCBkZXNjcmlwdGlvbiBvZiB0aGUg c3lzdGVtIGluIHRoZSA8Y29kZT4uZG90PC9jb2RlPiBmb3JtYXQgPC9saT48bGk+ZXhlY3V0aW9u IHRyYWNlcyBpbiB0aGUgPGNvZGU+LnZjZDwvY29kZT4gZmlsZSBmb3JtYXQgPC9saT48bGk+Y29k ZSBpbiA8Y29kZT5DPC9jb2RlPiwgPGNvZGU+U3lzdGVtQzwvY29kZT4gYW5kIDxjb2RlPlZIREw8 L2NvZGU+IGZvciBzaW11bGF0aW9uIG9yIGltcGxlbWVudGF0aW9uIG9uIGEgdGFyZ2V0IHBsYXRm b3JtDQo8L2xpPjwvdWw+DQo8cD5UaGUgbW9zdCBzaWduaWZpY2FudCBjaGFuZ2VzIHNpbmNlIHZl cnNpb24gMS43IGFyZSA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+YW4gZW50aXJlbHkg cmVjcmFmdGVkLCBtb2R1bGFyIGltcGxlbWVudGF0aW9uIDwvbGk+PGxpPmEgZnVsbCBmb3JtYWwg c2VtYW50aWNzIGZvciB0aGUg4oCcY29yZeKAnSB2ZXJzaW9uIG9mIHRoZSBsYW5ndWFnZSA8L2xp PjxsaT5hIGRvY3VtZW50YXRpb24gbm93IHNwbGl0dGVkIGluIGEgVXNlciBNYW51YWwgYW5kIGEg UmVmZXJlbmNlIE1hbnVhbCA8L2xpPjwvdWw+DQo8cD48Y29kZT5SRlNNPC9jb2RlPiBpcyBhdmFp bGFibGUgZnJvbSB0aGlzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qc2Vyb3QvcmZzbSI+ DQpHSCBwYWdlPC9hPiBvciBhcyBhbiA8YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwub3JnL3Bh Y2thZ2VzL3Jmc20vIj5PUEFNIHBhY2thZ2U8L2E+Lg0KPC9wPg0KPHA+Q29tbWVudHMsIGZlZWRi YWNrcyBhbmQgYnVnIHJlcG9ydHMgd2VsY29tZSAhIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSI5Ij5yaW90IDAuMC41PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tcmlvdC0wLTAtNS8xMzY0Ni8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXJpb3QtMC0wLTUvMTM2NDYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnYzczZWJiMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2M3M2Vi YjIiPm9zdGVyYSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZ2M3M2ViYjIiPg0KPHA+SGkgZm9sa3MgOndhdmU6IGp1c3QgcmVsZWFzZWQgPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9yaW90LzAuMC41Ij5SaW90IHYwLjAuNTwvYT4gb24g b3BhbSB3aXRoIHNvbWUgcXVhbGl0eSBvZiBsaWZlIGltcHJvdmVtZW50cywgYW5kIGEgYnVuY2gg b2YgYnVnIGZpeGVzOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPllvdSBjYW4gbm93 IGRvIGNvbW11bmljYXRpb24gPHNwYW4gY2xhc3M9InVuZGVybGluZSI+YnkgbmFtZTwvc3Bhbj4g YnkgcmVnaXN0ZXJpbmcgYSBwaWQuIE5hbWVzIGFyZSBjdXJyZW50bHkgc3RyaW5ncyDigJMgdGhp cyBoZWxwcyBpbiBzaXR1YXRpb25zIHdoZXJlIHlvdSBuZWVkIGEgZ2xvYmFsbHkga25vd24gcHJv Y2VzcyBidXQgeW91IGNhbuKAmXQgdGhyZWFkIHRoZSBhY3R1YWwgcHJvY2VzcyBpZCBldmVyeXdo ZXJlLg0KPC9saT48bGk+VGltZXJzIHNob3VsZCBiZSB3b3JraW5nIGNvcnJlY3RseSBub3cgOnVw c2lkZV9kb3duX2ZhY2U6IDwvbGk+PGxpPkkvTyBzaG91bGQgYmVoYXZlIG1vcmUgcmVhc29uYWJs eSB3aGVuIHJlYWRpbmcvd3JpdGluZyB0byBjbG9zZWQgZmRzIOKAkyBubyBtb3JlIHBlc2t5IFNJ R1BJUEVzIGtpbGxpbmcgeW91ciBhcHAgd2l0aG91dCByZWFzb24uDQo8L2xpPjwvdWw+DQo8cD5Z b3UgY2FuIHJlYWQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sZW9zdGVyYS9yaW90 L2Jsb2IvbWFpbi9DSEFOR0VTLm1kIzAwNSI+DQpjaGFuZ2Vsb2cgaGVyZTwvYT4uIDwvcD4NCjxw PklmIHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gY29udHJpYnV0aW5nLCB0aGVyZeKAmXMgYSBmZXcg aXNzdWVzIHRhZ2dlZCB3aXRoIGBoZWxwIHdhbnRlZGAsIGJ1dCBkb27igJl0IGhlc2l0YXRlIHRv IHJlYWNoIG91dCB0byBtZSBvbiBEaXNjb3JkL1g6IEBsZW9zdGVyYQ0KPC9wPg0KPHA+SGFwcHkg aGFja2luZyEgOnRhZGE6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc4ZGUzNTFhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOGRlMzUx YSI+UmljaGFyZCBIdXh0b24gdGhlbiBhZGRlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnOGRlMzUxYSI+DQo8YmxvY2txdW90ZT4NCjxwPlJpb3QgaXMgYW4g PGEgaHJlZj0iaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQWN0b3JfbW9kZWwiPmFjdG9y LW1vZGVsPC9hPiBtdWx0aS1jb3JlIHNjaGVkdWxlciBmb3IgT0NhbWwgNS4gSXQgYnJpbmdzDQo8 YSBocmVmPSJodHRwczovL2VybGFuZy5vcmciPkVybGFuZzwvYT4tc3R5bGUgY29uY3VycmVuY3kg dG8gdGhlIGxhbmd1YWdlLCB3aGVyZSBsaWdodHdlaWdodCBwcm9jZXNzZXMgY29tbXVuaWNhdGUg dmlhIG1lc3NhZ2UtcGFzc2luZy4NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPkp1c3QgdG8gZ2l2 ZSBzb21lIGNvbnRleHQuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTAiPnR0eSAw LjAuMTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTAiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10dHktMC0w LTEvMTM2NDcvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10dHktMC0wLTEvMTM2 NDcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZGQx ZmI5NCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2RkMWZiOTQiPm9zdGVyYSBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2RkMWZi OTQiPg0KPHA+SGkgZm9sa3MgOndhdmU6IGp1c3QgcmVsZWFzZWQgPGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC5vcmcvcC90dHkvMC4wLjEiPnR0eSB2MC4wLjE8L2E+IG9uIG9wYW0uDQo8L3A+DQo8cD48 Y29kZT50dHk8L2NvZGU+IGlzIGEgcHVyZSBPQ2FtbCBsaWJyYXJ5IGZvciBkaXJlY3RseSBpbnRl cmFjdGluZyB3aXRoIHRoZSB0ZXJtaW5hbCwgdGhhdCBJ4oCZbSB1c2luZyB0byBidWlsZA0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21pbnR0ZWEiPk1pbnQgVGVhPC9hPjog PC9wPg0KPGRpdiBpZD0ib3JnZDUyMGQ5NiIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0i aHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21pbnR0ZWEvcmF3L21haW4vZXhhbXBsZXMvdmll d3MvZGVtby5naWYiIGFsdD0iZGVtby5naWYiPg0KPC9wPg0KPC9kaXY+DQo8cD5UaGlzIGZpcnN0 IHJlbGVhc2UgaW5jbHVkZXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5IaWdoLWxl dmVsIDxjb2RlPlRlcm1pbmFsPC9jb2RlPiBtb2R1bGUgZm9yIGNvbnRyb2xsaW5nIGEgdGVybWlu YWwgKHdpdGggZnVuY3Rpb25zIGxpa2UNCjxjb2RlPmN1cnNvcl91cCBuPC9jb2RlPikgPC9saT48 bGk+Tm9uLWJsb2NraW5nIHJlYWRpbmcgb2YgVVRGLTggaW5wdXQgZnJvbSBzdGRpbiBpbiB0aGUg PGNvZGU+U3RkaW48L2NvZGU+IG1vZHVsZQ0KPC9saT48bGk+VGVybWluYWwgflByb2ZpbGV+cyBm b3IgZGV0ZXJtaW5pbmcgd2hhdCBjb2xvciBwYWxldHRlcyBhcmUgYXZhaWxhYmxlIDwvbGk+PGxp PkEgPGNvZGU+Q29sb3I8L2NvZGU+IG1vZHVsZSBmb3IgcGFyc2luZyBhbmQgd29ya2luZyB3aXRo IFJHQi9BTlNJL0FOU0kyNTYgY29sb3JzDQo8L2xpPjxsaT5BIGNvbGxlY3Rpb24gb2YgNjAgZXNj YXBlIHNlcXVlbmNlIGZ1bmN0aW9ucyBpbiA8Y29kZT5Fc2NhcGVfc2VxPC9jb2RlPiA8L2xpPjxs aT5hIGxvdCBvZiByb29tIGZvciBpbXByb3ZlbWVudCEgPC9saT48L3VsPg0KPHA+SWYgeW914oCZ cmUgaW50ZXJlc3RlZCBpbiBjb250cmlidXRpbmcsIHRoZXJl4oCZcyBhIGZldyBpc3N1ZXMgdGFn Z2VkIHdpdGggPGNvZGU+aGVscCB3YW50ZWQ8L2NvZGU+LCBidXQgZG9u4oCZdCBoZXNpdGF0ZSB0 byByZWFjaCBvdXQgdG8gbWUgb24gRGlzY29yZC9YOiBAbGVvc3RlcmENCjwvcD4NCjxwPkhhcHB5 IGhhY2tpbmchIDp0YWRhOiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5ob29r ZSAwLjAuMSDigJMgc3ByaW5nLWJhc2VkIGFuaW1hdGlvbnMgbGlicmFyeTwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ob29rZS0wLTAtMS1zcHJpbmctYmFzZWQt YW5pbWF0aW9ucy1saWJyYXJ5LzEzNjQ4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1ob29rZS0wLTAtMS1zcHJpbmctYmFzZWQtYW5pbWF0aW9ucy1saWJyYXJ5LzEzNjQ4LzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzIyZDk0NTQi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyMmQ5NDU0Ij5vc3RlcmEgYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyMmQ5NDU0Ij4N CjxwPkhpIGZvbGtzIDp3YXZlOiBqdXN0IHJlbGVhc2VkIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL3AvaG9va2UvMC4wLjEiPmhvb2tlIHYwLjAuMTwvYT4gb24gb3BhbS4NCjwvcD4NCjxwPjxj b2RlPmhvb2tlPC9jb2RlPiBpcyBhIHNpbXBsZSwgZWZmaWNpZW50IHNwcmluZyBhbmltYXRpb24g bGlicmFyeSBmb3Igc21vb3RoLCBuYXR1cmFsIG1vdGlvbi4gSXQgY2FuIGJlIHVzZWQgZm9yIG1h bnkgdGhpbmdzLCBpbmNsdWRpbmcgVFVJIGFwcGxpY2F0aW9ucyBvciBnYW1lczoNCjwvcD4NCjxk aXYgaWQ9Im9yZ2Q1YTA1YjIiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8v Z2l0aHViLmNvbS9sZW9zdGVyYS9ob29rZS9yYXcvbWFpbi9leGFtcGxlcy90dWkvZGVtby5naWYi IGFsdD0iZGVtby5naWYiPg0KPC9wPg0KPC9kaXY+DQo8cD5JZiB5b3XigJlyZSBpbnRlcmVzdGVk IGluIGNvbnRyaWJ1dGluZyBkb27igJl0IGhlc2l0YXRlIHRvIHJlYWNoIG91dCBvbiBEaXNjb3Jk L1g6IEBsZW9zdGVyYQ0KPC9wPg0KPHA+SGFwcHkgaGFja2luZyEgOnRhZGE6IDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEyIiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iMTIiPuKAnE9DYW1sIG9uIEdpdGh1YuKAnSBib3QgcG9zdGlu ZyBvbiB0aGUgZmVkaXZlcnNlPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC0xMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvb2NhbWwtb24tZ2l0aHViLWJvdC1wb3N0aW5nLW9uLXRoZS1mZWRpdmVyc2UvMTM2NDkvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb24tZ2l0aHViLWJvdC1wb3N0aW5n LW9uLXRoZS1mZWRpdmVyc2UvMTM2NDkvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnMTEwNjE4ZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzExMDYxOGYiPlpvZ2d5IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnMTEwNjE4ZiI+DQo8cD5IZWxsbywgPC9wPg0KPHA+SeKAmW0gZ2xhZCB0 byBhbm5vdW5jZSBhIG5ldyBib3Qgd2hpY2ggbWlnaHQgYmUgb2YgaW50ZXJlc3QgZm9yIHBlb3Bs ZSBvbiB0aGUgRmVkaXZlcnNlOiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vdGFwcy5nb29kLWVyaXMu bmV0L2FjdG9ycy9vY2FtbGdpdGh1YiI+T0NhbWwgb24gR2l0aHViIGJvdDwvYT4uIDwvcD4NCjxw PlRoaXMgYm90IGNoZWNrcyBmb3IgZXZlbnRzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwiPmBvY2FtbC9vY2FtbGA8L2E+IEdpdGh1YiBwcm9qZWN0IGFuZCBw dWJsaXNoZXMgc29tZSBvZiB0aGVtIG9uIHRoZSBGZWRpdmVyc2UuIEJ5IG5vdyBvbmx5IHNvbWUg aXNzdWUgZXZlbnRzIGFyZSBwdWJsaXNoZWQgKGNvbW1lbnQgY3JlYXRpb24sZGVsZXRpb24sdXBk YXRlIGFuZCBvcGVuaW5nL2Nsb3Npbmcgb2YNCiBpc3N1ZXMpLiA8L3A+DQo8cD5UaGUgYm90IGlz IGltcGxlbWVudGVkIHVzaW5nIGFuIEFjdGl2dHlQdWIgbGlicmFyeSBub3QgcmVsZWFzZWQgeWV0 LiBJdCBhY3RzIGFzIGEgY2xpZW50IGZvciBhIHNlbGYtaG9zdGVkIGZlZGVyYXRlZCBzZXJ2ZXIg ZGV2ZWxvcGVkIHVzaW5nIHRoZSBzYW1lIGxpYnJhcnkuIEJvdGggc2hvdWxkIGJlIHJlbGVhc2Vk IHNvb24gKG1heWJlIGZlYnJ1YXJ5KS4NCjwvcD4NCjxwPkRvIG5vdCBoZXNpdGF0ZSB0byBmb2xs b3cgdGhlIGJvdCA6c2xpZ2h0X3NtaWxlOiBUaGUgc2VydmVyIGlzIG5vdCBhIE1hc3RvZG9uIHNl cnZlciwgc28geW91IHdvbuKAmXQgYmUgYWJsZSB0byBmb2xsb3cgaXQgZnJvbSB0aGUgaHRtbCBw YWdlLiBZb3UgY2FuIGZvbGxvdyBpdCBmcm9tDQo8YSBocmVmPSJodHRwczovL21hc3RvZG9uLnNv Y2lhbC9Aem9nZ3lfb2NhbWwvMTExNTg0NTg2MDM1MzkzODM4Ij50aGlzIHBvc3Q8L2E+IGZvciBl eGFtcGxlLiAoTWFzdG9kb24gaXMgbm90IGFuIEFjdGl2aXR5cHViIGNsaWVudCwgYnV0IGEgc2Vy dmVyIGNhcHR1cmluZyB1c2VycykNCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTEzIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTMi Pk1pbnQgVGVhIChtaW50dGVhIDAuMC4xKSDigJMgYSBsaXR0bGUgVFVJIGZyYW1ld29yayBmb3Ig T0NhbWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEzIj4NCjxw PkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWludC10 ZWEtbWludHRlYS0wLTAtMS1hLWxpdHRsZS10dWktZnJhbWV3b3JrLWZvci1vY2FtbC8xMzY1MC8x Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWludC10ZWEtbWludHRlYS0wLTAt MS1hLWxpdHRsZS10dWktZnJhbWV3b3JrLWZvci1vY2FtbC8xMzY1MC8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxMTczODk5IiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMTE3Mzg5OSI+b3N0ZXJhIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMTE3Mzg5OSI+DQo8cD5IaSBmb2xrcyA6 d2F2ZToganVzdCByZWxlYXNlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGVvc3RlcmEv bWludHRlYSI+bWludHRlYSB2MC4wLjE8L2E+IG9uIG9wYW0uDQo8L3A+DQo8cD5NaW50IFRlYSBp cyBhIGZ1biwgZnVuY3Rpb25hbCwgYW5kIHN0YXRlZnVsIHdheSB0byBidWlsZCB0ZXJtaW5hbCBh cHBzIGluIE9DYW1sIGhlYXZpbHkgaW5zcGlyZWQgYnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9jaGFybWJyYWNlbGV0L2J1YmJsZXRlYSI+QnViYmxlVGVhPC9hPi4gTWludCBUZWEgaXMg YnVpbHQgb24NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sZW9zdGVyYS9yaW90Ij5SaW90 PC9hPiBhbmQgdXNlcyBUaGUgRWxtIEFyY2hpdGVjdHVyZS4NCjwvcD4NCjxwPkl0IGluY2x1ZGVz IHBsZW50eSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGVvc3RlcmEvbWludHRlYS90 cmVlL21haW4vZXhhbXBsZXMiPg0KZXhhbXBsZXM8L2E+IG9mIHdoYXQgeW91IGNhbiBidWlsZCB3 aXRoIGl0OiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQ5OWNm YWUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc0OTljZmFlIj5Ub2dnbGluZyBBbHRT Y3JlZW48L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzQ5OWNm YWUiPg0KPGRpdiBpZD0ib3JnMDBjODhhOCIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0i aHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21pbnR0ZWEvcmF3L21haW4vZXhhbXBsZXMvYWx0 c2NyZWVuLXRvZ2dsZS9kZW1vLmdpZiIgYWx0PSJkZW1vLmdpZiI+DQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMDY0OWU0IiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMzA2NDllNCI+U3RvcHdhdGNoPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczMDY0OWU0Ij4NCjxkaXYgaWQ9Im9y Z2E1OTY1YzgiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2l0aHViLmNv bS9sZW9zdGVyYS9taW50dGVhL3Jhdy9tYWluL2V4YW1wbGVzL3N0b3B3YXRjaC9kZW1vLmdpZiIg YWx0PSJkZW1vLmdpZiI+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmcwM2Q4NDUwIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0i b3JnMDNkODQ1MCI+TXVsdGlwbGUgVmlld3MvUGFnZXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzAzZDg0NTAiPg0KPGRpdiBpZD0ib3JnZDczMDRjNiIgY2xh c3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZXJhL21p bnR0ZWEvcmF3L21haW4vZXhhbXBsZXMvdmlld3MvZGVtby5naWYiIGFsdD0iZGVtby5naWYiPg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnMmIxNDc1ZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzJiMTQ3NWQiPkJvdW5j aW5nIEJhbGwgLyBTcHJpbmctYmFzZWQgcGh5c2ljczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnMmIxNDc1ZCI+DQo8ZGl2IGlkPSJvcmcxZmY1YzUwIiBjbGFz cz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dpdGh1Yi5jb20vbGVvc3RlcmEvaG9v a2UvcmF3L21haW4vZXhhbXBsZXMvdHVpL2RlbW8uZ2lmIiBhbHQ9ImRlbW8uZ2lmIj4NCjwvcD4N CjwvZGl2Pg0KPHA+QWxvbmdzaWRlIHRoaXMgcmVsZWFzZSB0aGVyZeKAmXMgYWxzbyBpdHMgc2li bGluZyBwYWNrYWdlczogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0 dHBzOi8vb2NhbWwub3JnL3Avc3BpY2VzLzAuMC4xIj5zcGljZXMgdjAuMC4xPC9hPiDigJMgYSBz dHlsaW5nIGxpYnJhcnkgZm9yIFRVSSBhcHBsaWNhdGlvbnMNCjwvbGk+PGxpPmFuZCA8YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9wL2xlYXZlcy8wLjAuMSI+bGVhdmVzIHYwLjAuMTwvYT4g4oCT IGEgcmV1c2FibGUgY29tcG9uZW50IGxpYnJhcnkNCjwvbGk+PC91bD4NCjxwPllvdSBjYW4gcmVh ZCB0aGUgZnVsbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGVvc3RlcmEvbWludHRlYS9i bG9iL21haW4vQ0hBTkdFUy5tZCI+DQpjaGFuZ2Vsb2cgaGVyZTwvYT4uIDwvcD4NCjxwPklmIHlv deKAmXJlIGludGVyZXN0ZWQgaW4gY29udHJpYnV0aW5nIHRvIGFueSBvZiB0aGVzZSwgdGhlcmXi gJlzIGEgZmV3IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sZW9zdGVyYS9taW50dGVhL2lz c3Vlcz9xPWlzJTNBaXNzdWUmIzQzO2lzJTNBb3BlbiYjNDM7bGFiZWwlM0ElMjJnb29kJiM0Mztm aXJzdCYjNDM7aXNzdWUlMjIiPg0KZ29vZCBmaXJzdCBpc3N1ZXM8L2E+IG9wZW4gYWxyZWFkeSwg YW5kIGRvbuKAmXQgaGVzaXRhdGUgdG8gcmVhY2ggb3V0IG9uIERpc2NvcmQvWDogQGxlb3N0ZXJh IDpzbGlnaHRfc21pbGU6DQo8L3A+DQo8cD5IYXBweSBoYWNraW5nISA6dGFkYTogPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0x NCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjE0Ij5XZWxjb21pbmcgb3VyIG5ldyBPdXRy ZWNoeSBpbnRlcm5zPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0x NCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2Vs Y29taW5nLW91ci1uZXctb3V0cmVjaHktaW50ZXJucy8xMzY1Mi8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC93ZWxjb21pbmctb3VyLW5ldy1vdXRyZWNoeS1pbnRlcm5zLzEzNjUyLzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOGMzMjc3OSIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzhjMzI3NzkiPkd1aWxsYXVtZSBQZXRpb3Qg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4 YzMyNzc5Ij4NCjxwPkhlbGxvIGV2ZXJ5b25lIDopIFdl4oCZdmUganVzdCBzdGFydGVkIGFuIGFt YXppbmcgbmV3IHJvdW5kIG9mIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm91dHJlYWNoeS5vcmcvIj4N Ck91dHJlYWNoeTwvYT4gaW50ZXJuc2hpcHMuIE91dHJlYWNoeSBpcyBhIG5vbi1wcm9maXQgb3Jn YW5pemF0aW9uIHByb3ZpZGluZyBhIHN0cnVjdHVyZSBmb3IgcGVvcGxlIHVuZGVycmVwcmVzZW50 ZWQgaW4gb3Blbi1zb3VyY2UgdG8gZG8gMyBtb250aHMgbG9uZyBpbnRlcm5zaGlwcyBpbiBhbiBv cGVuLXNvdXJjZSBjb21tdW5pdHkuIEluIHRoZSBPQ2FtbCBjb21tdW5pdHksIHRoaXMgT3V0cmVh Y2h5IHJvdW5kLCB3ZeKAmXZlIGNvbWUgdXAgd2l0aA0KIGZvdXIgaW50ZXJuc2hpcCBwcm9qZWN0 cyBmcm9tIGRpZmZlcmVudCBjb250ZXh0cy4gRm9yIHRocmVlIG9mIHRoZW0sIHdlIGFyZSBmb3J0 dW5hdGUgdG8gbm93IGhhdmUgdGhlIGZvbGxvd2luZyBoaWdobHkgZGVkaWNhdGVkIGFuZCBlbnRo dXNpYXN0aWMgaW50ZXJucyB3b3JraW5nIGFuZCBiZWluZyBhY3RpdmVseSBlbmdhZ2VkIGluIHRo ZW06DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QFNldW4gaXMgd29ya2luZyBvbiBp bXBsZW1lbnRpbmcgYSBkYXJrIG1vZGUgb24gb2NhbWwub3JnLiBUaGUgcHJvamVjdCBpZGVhIGlz IHRvIGltcGxlbWVudCBhIGRhcmsgdGhlbWUgZm9yIHRoZSB3ZWJzaXRlLCBhbmQgdG8gY2hvb3Nl IGEgZGFyayBvciBsaWdodCB0aGVtZSBvbiB0aGUgd2Vic2l0ZSBiYXNlZCBvbiB0aGUgc3lzdGVt IHByZWZlcmVuY2VzIG9mIHRoZSB1c2VyLiBNZW50b3JzOiBAU2F5U2F5byBhbmQgQHB1bmNoYWdh bg0KPC9saT48bGk+QGZheSBpcyB3b3JraW5nIG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9TdWRoYTI0Ny9vY2FtbC1qb3kiPm9jYW1sLWpveTwvYT4sIGEgY3JlYXRpdmUgY29kaW5nIGxp YnJhcnkgdG8gZHJhdyBnZW9tZXRyaWMgb2JqZWN0cyBpbiBPQ2FtbC4gVGhpcyBpcyBpbnNwaXJl ZCBieSB0aGUgcHl0aG9uIGxpYnJhcnkgb2YgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vZm9zc3VuaXRlZC9qb3kiPnNhbWUgbmFtZTwvYT4uIEpveSBvZmZlcnMgdGhlIGFiaWxpdHkg dG8gZHJhdyBzaW1wbGUgc2hhcGVzLCBwZXJmb3JtIHRyYW5zZm9ybWF0aW9ucyBvbiB0aGVtLCBh bmQgY29tcG9zZSB0aG9zZSB0cmFuc2Zvcm1hdGlvbnMuIFRoaXMgd2lsbCBiZSBhIGdyZWF0IHRv b2wgZm9yIHRlYWNoaW5nIHByb2dyYW1taW5nIGFzIHdlbGwgYXMgY3JlYXRpbmcgYXJ0IGluIGEg ZnVuY3Rpb25hbA0KIHdheS4gTWVudG9yczogQG5pa29jaGlrbyBhbmQgQHN1ZGhhIDwvbGk+PGxp PkBpZGFyYV9uYWJ1ayBpcyB3b3JraW5nIG9uIGltcHJvdmluZyB0aGUgR1VJIGV4cGVyaWVuY2Ug aW4gT0NhbWwuIFRoaXMgaGFzIGJlZW4gaW5zcGlyZWQgYnkNCjxhIGhyZWY9Imh0dHBzOi8vYXJl d2VndWl5ZXQuY29tLyI+UnVzdOKAmXMgQXJlIFdlIEdVSSBZZXQ/PC9hPiwgYW5kIGFpbXMgYXQg ZG9pbmcgYSBzdXJ2ZXkgb2YgdGhlIEdVSSBsaWJyYXJpZXMsIHdyaXRpbmcgZG9jdW1lbnRhdGlv biwgdHV0b3JpYWxzIGFuZCBleGFtcGxlcyB0byBiZW5lZml0IHRoZSBjb21tdW5pdHkgYW5kIG1h a2UgT0NhbWwgbW9yZSBHVUktZnJpZW5kbHkuIE1lbnRvcnM6IEBncGV0aW90IGFuZCBAbW9henph bW1vcmlhbmkNCjwvbGk+PGxpPlVuZm9ydHVuYXRlbHkgbm8gaW50ZXJuIHdhcyBzZWxlY3RlZCBm b3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nZW9jYW1sL29jYW1sLXJ0cmVlLyI+ DQpPQ2FtbCBSKi10cmVlIHByb2plY3Q8L2E+IHRoaXMgcm91bmQsIGJ1dCBsb3RzIG9mIGdyZWF0 IGZlYXR1cmVzLCBleGFtcGxlcyBhbmQgdGVzdHMgd2VyZSBhZGRlZCBkdXJpbmcgdGhlIGNvbnRy aWJ1dGlvbiBwZXJpb2QuDQo8L2xpPjwvdWw+DQo8cD5JdOKAmXMgdmVyeSBncmF0aWZ5aW5nIHRv IHdvcmsgYXMgbWVudG9ycyBhbmQgb3JnYW5pemVycyBvbiB0aG9zZSBwcm9qZWN0cyBhbmQgdG8g c2VlIGJvdGggdGhlIGludGVybnMgYW5kIHRoZSBwcm9qZWN0cyBncm93IGV2ZXJ5IGRheS4gQXMg dG8gd2hvIHdlIGFyZTogV2XigJlyZSBhIG1peGVkIGdyb3VwIG9mIE9DYW1sIGVudGh1c2lhc3Rz LCBzb21lIG9mIHdob20gd29yayBhdA0KPGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS8iPlRh cmlkZXM8L2E+IGFuZCBvdGhlcnMgZG9u4oCZdC4gVGFyaWRlcyBoYXMgYmVlbiBsZXR0aW5nIGVt cGxveWVlcyBiZSBlbmdhZ2VkIGluIE91dHJlYWNoeSBpbnRlcm5zaGlwcyBhbmQgZG8gb3RoZXIg ZGl2ZXJzaXR5IGFuZC9vciBtZW50b3Jpbmcgd29yayBhcyBwYXJ0IG9mIG91ciBqb2IgZm9yIGEg d2hpbGUgbm93ISBBbmQgc2luY2UgbGFzdCBPdXRyZWFjaHkgcm91bmQsIHRoZSBUYXJpZGVzLWV4 dGVybmFsDQogbWVudG9ycyBhcmUgZnVuZGVkIGZvciB0aGVpciBtZW50b3IgZWZmb3J0cyBmcm9t IEphbmUgU3RyZWV0IGFuZCBUYXJpZGVzLiBXZSBhcHByZWNpYXRlIGJvdGggYSBsb3QhDQo8L3A+ DQo8cD5QbGVhc2UsIHdlbGNvbWUgQFNldW4sIEBmYXkgYW5kIEBpZGFyYV9uYWJ1ayB0byB0aGUg Y29tbXVuaXR5ISBXZeKAmXJlIGxvb2tpbmcgZm9yd2FyZCB0byBob3cgdGhlIGludGVybnNoaXBz IGFyZSBnb2luZyB0byBldm9sdmUsIEBtb2F6emFtbW9yaWFuaSwgQGdwZXRpb3QsIEBwdW5jaGFn YW4sIEBTYXlTYXlvLCBAbmlrb2NoaWtvLCBAc3VkaGEsIEBwaXRhZw0KPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTUiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSIxNSI+emJnIHYwLjIuMDogQSBuZXcgdmVyc2lvbiBvZiBaZXJvIEJ1 bGxzaGl0IEdpdDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTUi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi16 YmctdjAtMi0wLWEtbmV3LXZlcnNpb24tb2YtemVyby1idWxsc2hpdC1naXQvMTM2NjQvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXpiZy12MC0yLTAtYS1uZXctdmVyc2lvbi1v Zi16ZXJvLWJ1bGxzaGl0LWdpdC8xMzY2NC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdjZjcxZTMxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnY2Y3MWUzMSI+RG1pdHJpaSBLb3Zhbmlrb3YgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjZjcxZTMxIj4NCjxwPkhpIGV2ZXJ5b25lIDp3 YXZlOiA8L3A+DQo8cD44IG1vbnRocyBhZ28gSSBhbm5vdW5jZWQgbXkgZmlyc3QgZXZlciBvcGVu LXNvdXJjZSBPQ2FtbCBwcm9qZWN0IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXpiZy16ZXJvLWJ1bGxzaGl0LWdp dC8xMTkyOSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi16YmctemVyby1idWxsc2hp dC1naXQvMTE5Mjk8L2E+DQo8L2xpPjwvdWw+DQo8cD5BZnRlciBxdWl0ZSBhIHdoaWxlLCBJ4oCZ bSBoYXBweSB0byBhbm5vdW5jZSB0aGUgc2Vjb25kIHJlbGVhc2UhIDwvcD4NCjxwPlZlcnNpb24g PGI+MC4yLjA8L2I+IGJyaW5ncyB0aGUgbmV3IGNvbW1hbmQgPGNvZGU+emJnIGRvbmU8L2NvZGU+ IGFuZCBmaXhlcyBzZXZlcmFsIHBpdGZhbGxzIGluIHRoZSBpbml0aWFsIGltcGxlbWVudGF0aW9u LiBUaGUgZnVsbCBjaGFuZ2Vsb2cgY2FuIGJlIGZvdW5kIG9uIEdpdEh1YjoNCjwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY2hzaGVyc2gv emJnL2Jsb2IvbWFpbi9DSEFOR0VMT0cubWQjMDIwLS0yMDIzLTEyLTE3LSI+R2l0SHViOiBjaHNo ZXJzaC96YmcvQ0hBTkdFTE9HLm1kOiB2MC4yLjA8L2E+DQo8L2xpPjwvdWw+DQo8cD5SZW1hcmth Ymx5LCBhbGwgdGhlIGltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzIGluIHRoaXMgdmVyc2lvbiB3 ZXJlIG1hZGUgYnkgZXh0ZXJuYWwgY29udHJpYnV0b3JzISA6ZXhwbG9kaW5nX2hlYWQ6DQo8L3A+ DQo8cD5JdCB3YXJtcyBteSBoZWFydCB0byBiZSBhIHBhcnQgb2Ygc3VjaCBhIHZpYnJhbnQgYW5k IHN1cHBvcnRpdmUgY29tbXVuaXR5IDpvcmFuZ2VfaGVhcnQ6IEnigJltIHVzaW5nDQo8Y29kZT56 Ymc8L2NvZGU+IGFzIGEgcHJvamVjdCB0byBsZWFybiBPQ2FtbCBhbmQgc2NyYXRjaCBteSBwZXJz b25hbCBpdGNoLiBJbWFnaW5lIG15IHN1cnByaXNlIHdoZW4gSSBsZWFybmVkIHRoYXQgb3RoZXIg cGVvcGxlIG5vdCBvbmx5IHVzZQ0KPGNvZGU+emJnPC9jb2RlPiBhcyB3ZWxsIGJ1dCBhbHNvIGNv bnRyaWJ1dGUgaW1wb3J0YW50IGltcHJvdmVtZW50cyEgPC9wPg0KPHA+QW55d2F5LCBoYXBweSBj b2RpbmcgZXZlcnlvbmUgYW5kIGxldCBtZSBrbm93IGFueSBmZWVkYmFjayB5b3UgaGF2ZSA6aHVn czogPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItMTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxNiI+UHB4bGliIGRldiBtZWV0aW5n czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTYiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweGxpYi1kZXYtbWVl dGluZ3MvMTI0NDEvMTIiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1l ZXRpbmdzLzEyNDQxLzEyPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdmM2RhNzdhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZjNkYTc3YSI+ U29uamEgSGVpbnplIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnZjNkYTc3YSI+DQo8cD5AcGFuZ2xlc2QgYW5kIEkgYXJlIGdvaW5nIHRvIGhh dmUgYSBwcm9iYWJseSBxdWl0ZSBxdWljayBEZWNlbWJlciBkZXYgbWVldGluZyB0b21vcnJvdywg Y29uY3JldGVseSBbZGF0ZT0yMDIzLTEyLTE5IHRpbWU9MTg6MDA6MDAgdGltZXpvbmU94oCcRXVy b3BlL01hZHJpZOKAnV0uIEhlcmXigJlzIG91ciBhZ2VuZGE6DQo8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+MC4zMi4wIHJlbGVhc2UNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5SZWFz b24gZm9yIHRoZSByZWxlYXNlOiA8Y29kZT5BdHRyaWJ1dGU8L2NvZGU+IEFQSSBhZGRpdGlvbi4g PC9saT48bGk+UHJlcGFyYXRpb24gZm9yIHRoZSByZWxlYXNlOiBXaGF0IGVsc2UgdG8gbWVyZ2Ug YmVmb3JlIHRoZSByZWxlYXNlPyA8L2xpPjxsaT5DYXV0aW9uIGZvciB0aGUgcmVsZWFzZTogPGNv ZGU+Q2FtbDwvY29kZT4gLSZndDsgPGNvZGU+U3RkbGliPC9jb2RlPiBjaGFuZ2UuIDwvbGk+PC91 bD4NCjwvbGk+PGxpPkNvbXBpbGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9wdWxsLzEyMjQ2Ij5jaGFuZ2Ugb2YgQVNUIGNvbnRleHQgZm9ybWF0PC9hPi4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5BcmUgdGhlcmUgc3RpbGwgdXNlIGNhc2VzIHdoZXJlIHRoZSBw cHggZHJpdmVyIGlzIGNvbXBpbGVkIG9uIGEgZGlmZmVyZW50IE9DYW1sIHZlcnNpb24gdGhhbiB0 aGUgcHJvamVjdCBpcyBjb21waWxlZCB3aXRoPyBJbiB0aG9zZSBjYXNlcywgdGhhdCBjb21waWxl ciBjaGFuZ2Ugd291bGQgYWZmZWN0IHVzLg0KPC9saT48L3VsPg0KPC9saT48bGk+Q2hhbmdlIG9m IHBoaWxvc29waHkgZm9yIDxjb2RlPnRydW5rLXN1cHBvcnQ8L2NvZGU+IGJyYW5jaC4gPC9saT48 L3VsPg0KPHA+QXMgYWx3YXlzLCB3ZeKAmXJlIGhhcHB5IHRvIGFkZCBhbnl0aGluZyB0byB0aGUg YWdlbmRhISBBbmQgYWxzbywgYXMgYWx3YXlzLCB3ZeKAmXJlIGhhcHB5IGlmIGFueW9uZSB3YW50 cyB0byBqb2luOg0KPGEgaHJlZj0iaHR0cHM6Ly9tZWV0Lmdvb2dsZS5jb20veXh3LWVqbnUtY2p1 Ij5odHRwczovL21lZXQuZ29vZ2xlLmNvbS95eHctZWpudS1janU8L2E+IC4gVGhhdOKAmXMgdHJ1 ZSBpbiBnZW5lcmFsIGFuZCBwYXJ0aWN1bGFybHkgaWYgeW91IGhhdmUgaW5zaWdodCBhYm91dCB0 aGUgdXNlIGNhc2UgcXVlc3Rpb24gaW4gcG9pbnQgMiBmcm9tIHRoZSBhZ2VuZGEgKGFsc28gaGFw cHkgdG8gaGVhciBhYm91dCBpdCBoZXJlIG9uIGRpc2N1c3MpLg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTciIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIxNyI+T3RoZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMTciPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnM2YxNjBkOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzNmMTYwZDgiPkZy b20gdGhlIG9jYW1sLm9yZyBibG9nPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBp ZD0idGV4dC1vcmczZjE2MGQ4Ij4NCjxwPkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBi bG9ncyBhZ2dyZWdhdGVkIGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRo ZSBvY2FtbC5vcmcgYmxvZzwvYT4uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBo cmVmPSJodHRwczovL295ZW51Z2FvbHV3YXNldW4uaGFzaG5vZGUuZGV2L291dHJlYWNoeS1pbnRy b2R1Y2UteW91cnNlbGYiPk91dHJlYWNoeSBCbG9nICMxOiBJbnRyb2R1Y2UgWW91cnNlbGY8L2E+ DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmcxZDA1MjMxIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnMWQwNTIz MSI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3Jn MWQwNTIzMSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJl Zj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVz c2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQg PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZl PC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3du LnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl IHRvIHRoZSA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1s aXN0Ij4NCmNhbWwtbGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJv cmc1ZGY1NjU2Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5B bGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9i b2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 12 Dec 2023 10:20:41 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 12 Dec 2023 10:20:41 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 12 Dec 2023 10:20:41 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BCAKn6I013706 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 12 Dec 2023 10:20:50 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3BCAKdAT013686 for ; Tue, 12 Dec 2023 10:20:39 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 Dec 2023 11:20:37 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 439A7E0D5D; Tue, 12 Dec 2023 11:20:37 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id DF75FE00B7 for ; Tue, 12 Dec 2023 11:20:29 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Dec 2023 11:20:28 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4624656125E; Tue, 12 Dec 2023 11:20:26 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaLOTchtlZYDRb+0K4klivvZZDWg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 12 Dec 2023 10:20:26 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: e59c8908-6a7a-456d-5f37-08dbfafbfe6b X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,269,1695679200"; d="scan'208,217";a="74155976" x-spam-flag: No, tests=bogofilter, spamicity=0.394221, queueID=82714561260 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <573AC451F498E240B39C76F2D24B62BA@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMi0xMiBUdWUgMTE6MTkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTIuMDUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMi4xOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIERlY2VtYmVyIDA1IHRvIDEyLCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5FY29zeXN0ZW0gV2lzaGxpc3Qg U3VydmV5PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+T1VQUyBtZWV0dXAgZGVjZW1iZXIgMjAy MzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkpzX29mX29jYW1sIDUuMjwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzQiPmNvbnRhaW5lcnMgMy4xMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPk1l bGFuZ2UgMi4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+T0NhbWwgNS4xLjEgcmVsZWFzZWQ8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5Ea01MIDIuMS4wIC0gTWFqb3IgY2hhbmdlczwvYT4g PC9saT48bGk+PGEgaHJlZj0iIzgiPkNhbGwgZm9yIFBhcnRpY2lwYXRpb246IEJPQiAyMDI0IChC ZXJsaW4sIE1hcmNoIDE1KTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPm9jYW1sLXByb3RvYyAz LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9saT48 bGk+PGEgaHJlZj0iI29yZ2VmOTkxMTIiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMSI+RWNvc3lzdGVtIFdpc2hsaXN0IFN1cnZleTwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZWNvc3lzdGVtLXdpc2hsaXN0LXN1cnZleS8xMzU3OC8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9lY29zeXN0ZW0td2lzaGxpc3Qtc3VydmV5LzEz NTc4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMDhj NDczYyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzA4YzQ3M2MiPlNhYmluZSBTY2ht YWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzA4YzQ3M2MiPg0KPHA+SGV5IE9DYW1sIGZvbGtzLCA8L3A+DQo8cD5JIGFtIHJ1bm5pbmcg YSBsaXR0bGUgT0NhbWwgRWNvc3lzdGVtIFdpc2hsaXN0IHN1cnZleSB3aGVyZSB5b3UgY2FuIHB1 dCBpbiByZWFsbHkgc3BlY2lmaWMgd2lzaGVzIGZvcg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPm5ldyBwYWNrYWdlcywgPC9saT48bGk+cGFja2FnZSBpbXByb3ZlbWVudHMsIDwvbGk+ PGxpPmNvbXBpbGVyIC8gdG9vbGluZyAvIGxhbmd1YWdlIGNoYW5nZXMgPC9saT48L3VsPg0KPHA+ SeKAmW0gcmVhbGx5IGN1cmlvdXMgd2hhdCB5b3UgYWxsIG5lZWQgYW5kIEkgdGhpbmsgdGhpcyB3 aWxsIGJlIGhlbHBmdWwgdG8gYmV0dGVyIHVuZGVyc3RhbmQgdGhlIGN1cnJlbnQgc3RhdGUgb2Yg dGhlIGVjb3N5c3RlbS4NCjwvcD4NCjxwPlRoZSBzdXJ2ZXkgd2lsbCBzdGF5IG9wZW4gYXQgbGVh c3QgaW50byBKYW51YXJ5LCBwcm9iYWJseSBtdWNoIGxvbmdlci4gPC9wPg0KPHA+UHV0IHRob3Nl IHdpc2hlcyBpbiEg8J+OhPCfkKvwn5Sl8J+UpSA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2Rv Y3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNkVkdqTzNnOXFTMzFyWHkzU0UtUHhjRzZB a2k2NTJqaXF4emZNMmxiN2tWaDVVSGcvdmlld2Zvcm0/dXNwPXNmX2xpbmsiPmh0dHBzOi8vZG9j cy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2RWR2pPM2c5cVMzMXJYeTNTRS1QeGNHNkFr aTY1MmppcXh6Zk0ybGI3a1ZoNVVIZy92aWV3Zm9ybT91c3A9c2ZfbGluazwvYT4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5PVVBTIG1lZXR1cCBkZWNlbWJlciAyMDIzPC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXBzLW1lZXR1cC1kZWNlbWJlci0y MDIzLzEzNTgwLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291cHMtbWVldHVwLWRl Y2VtYmVyLTIwMjMvMTM1ODAvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc0MzNiYjdmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNDMzYmI3 ZiI+emFwYXNoY2Fub24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc0MzNiYjdmIj4NCjxwPlRoZSBuZXh0IE9VUFMgbWVldHVwIHdpbGwgdGFr ZSBwbGFjZSBvbiA8Yj5UaHVyc2RheSwgMTR0aCBvZiBEZWNlbWJlcjwvYj4gMjAyMy4gSXQgd2ls bCBzdGFydCBhdA0KPGI+N3BtPC9iPiBhdCB0aGUgPGI+NCBwbGFjZSBKdXNzaWV1PC9iPiBpbiBQ YXJpcy4gPC9wPg0KPHA+Ondhcm5pbmc6IDp0cnVtcGV0OiBJdCB3aWxsIGJlIGluIHRoZSBpbiB0 aGUgPGI+RXNjbGFuZ29uIGJ1aWxkaW5nPC9iPiAoYW1waGkgVEJBKS4gOnRydW1wZXQ6IDp3YXJu aW5nOg0KPC9wPg0KPHA+UGxlYXNlLCA8Yj48YSBocmVmPSJodHRwczovL3d3dy5tZWV0dXAuY29t L2ZyLUZSL29jYW1sLXBhcmlzL2V2ZW50cy8yOTc3OTEwMzciPnJlZ2lzdGVyIG9uIG1lZXR1cA0K PC9hPjwvYj5hcyBzb29uIGFzIHBvc3NpYmxlIHRvIGxldCB1cyBrbm93IGhvdyBtYW55IHBpenph IHdlIHNob3VsZCBvcmRlci4gPC9wPg0KPHA+Rm9yIG1vcmUgZGV0YWlscywgeW91IG1heSBjaGVj ayB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vdXBzLmZyYW1hLmlvIj5PVVBT4oCZIHdlYnNpdGUNCjwv YT4uIDwvcD4NCjxwPlRoaXMgbW9udGggd2lsbCBmZWF0dXJlIHRoZSBmb2xsb3dpbmcgdGFsa3Mg OiA8L3A+DQo8cD48Yj5NaW91LCB1biBzaW1wbGUgc2NoZWR1bGVyIHBvdXIgT0NhbWwgNSDigJMg Um9tYWluIENhbGFzY2liZXR0YSAoQGRpbm9zYXVyZSk8L2I+DQo8L3A+DQo8cD5NaW91IGVzdCB1 biBzY2hlZHVsZXIgcG91ciBPQ2FtbCA1IHV0aWxpc2FudCBsZXMgZWZmZXRzIG5vdXZlbGxlbWVu dCBpbnRyb2R1aXQuIElsIHNlIGNvbmNlbnRyZSBzdXIgbGEgZGlzcG9uaWJpbGl0w6kgZOKAmXVu ZSBhcHBsaWNhdGlvbiBhdSB0cmF2ZXJzIGTigJl1bmUgcG9saXRpcXVlIGRlIGdlc3Rpb24gZGVz IHTDomNoZXMgYmllbiBkw6ljcml0ZS4gQ2V0dGUgcHLDqXNlbnRhdGlvbiBpbnRyb2R1aXJhIGxl cyBlZmZldHMgYXZlYyBPQ2FtbCA1IGFpbnNpDQogcXXigJl1bmUgcsOpdHJvc3BlY3RpdmUgZGUg c29uIEFQSS4gSWwgc+KAmWFnaXJhIGVuc3VpdGUgZGUgcHLDqXNlbnRlciBsZXMgc3DDqWNpZml0 w6lzIGRlIE1pb3UgcGFyIHJhcHBvcnQgYXV4IGF1dHJlcyBzY2hlZHVsZXJzLiBFbmZpbiwgaWwg eSBhdXJhIGxhIHByw6lzZW50YXRpb24gZOKAmXVuIGNsaWVudC9zZXJ2ZXVyIEhUVFAgZMOpdmVs b3Bww6kgc2Vsb24gbGUgZGVzaWduIGRlIE1pb3UuIExhIHByw6lzZW50YXRpb24gcGVybWV0dHJh IGRlIGZhaXJlIHVuIMOpdGF0DQogZGVzIGxpZXV4IGR1IHNjaGVkdWxpbmcgZW4gT0NhbWwsIGRl cyByYWlzb25zIGRlIGxhIG11bHRpcGxpY2l0w6kgZGVzIHNvbHV0aW9ucyBhaW5zaSBxdWUgZGVz IG9iamVjdGlmcyBjb25jcmV0cyBkZSBNaW91IChpbXBsw6ltZW50YXRpb24gZGUgc2VydmljZXMs IGRpc3BvbmliaWxpdMOpcyBkZXMgYXBwbGljYXRpb25zLCB1bmlrZXJuZWxzKS4NCjwvcD4NCjxw PjxiPlRvd2FyZHMgYSBzb2x1dGlvbiB0byB0aGUgZXhwcmVzc2lvbiBwcm9ibGVtIGZvciBjb21w aWxlcnM6IHN0cm9uZ2x5IHR5cGVkIG5hbm8tcGFzc2VzIOKAkyBCb3JpcyBZYWtvYm93c2tpPC9i Pg0KPC9wPg0KPHA+V2UgcHJlc2VudCBhIG5ldyBzb2x1dGlvbiB0byB0aGUgcHJvYmxlbSBvZiAo c3Ryb25nbHkpIHR5cGluZyBjb21waWxlciBwYXNzZXMgd2hlbiB0aGUgc291cmNlIGFuZCBkZXN0 aW5hdGlvbiBsYW5ndWFnZSBzaGFyZSBtdWx0aXBsZSBjb25zdHJ1Y3RvcnMuIFdlIGFyZSBpbnRl cmVzdGVkIGluIGFwcHJvYWNoZXMgdGhhdCBsaW1pdCB0aGUgYW1vdW50IG9mIGJvaWxlcnBsYXRl IHRoYXQgbmVlZHMgdG8gYmUgKHJlKXdyaXR0ZW4gZm9yIGVhY2gNCiBsYW5ndWFnZSwgd2hpbGUg c3RpbGwgbWFpbnRhaW5pbmcgYSB2ZXJ5IHN0cmljdCB0eXBpbmcgZGlzY2lwbGluZS4gT3VyIHNv bHV0aW9uIHVzZXMgd2VsbC1rbm93biB0b29scywgYnV0IGNvbWJpbmUgdGhlbSBpbiBhIG5vdmVs IHdheToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT50aGUgaWRlYSBvZiBuYW5vcGFz c2VzLCBpbiB3aGljaCBlYWNoIHBhc3MgZW5jb2RlcyBhIHZlcnkgbGltaXRlZCB0cmFuc2Zvcm1h dGlvbg0KPC9saT48bGk+dGhlIHVzZSBvZiBwcHggc3ludGF4IGV4dGVuc2lvbnMgdG8gZXhwcmVz cyBvbmx5IHRoZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIGEgbGFuZ3VhZ2UgYW5kIHRoZSBuZXh0DQo8 L2xpPjxsaT50aGUgdHJhdmVyc2FsIG9mIHRoZSBBU1QgdXNpbmcgdG9wLWRvd24gYW5kIGJvdHRv bS11cCByZWN1cnNpb24gc2NoZW1lcyA8L2xpPjxsaT5PQ2FtbCBwb2x5bW9ycGhpYyB2YXJpYW50 cywgd2hpY2ggYXJlIGluc3RydW1lbnRhbCB0byBwcmVjaXNlbHkgdHlwZSBvdXIgKG5vbi1yZWN1 cnNpdmUpIHRyYW5zZm9ybWF0aW9uIGZ1bmN0aW9ucy4NCjwvbGk+PC91bD4NCjxwPldlIHByZXNl bnQgb3VyIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgYXBwcm9hY2ggaW4gdGhlIGNvbnRleHQgb2Yg dGhlIEFkYSBmcm9udGVuZCBmb3IgdGhlIEluZmVyIGFuYWx5emVyLCB3aGljaCBhcyBvZiB0b2Rh eSBjb250YWlucyAyOCBwYXNzZXMuIFdlIHdpbGwgYWxzbyBkaXNjdXNzIHRoZSB2YXJpb3VzIHBp dGZhbGxzIHdlIGhhdmUgZW5jb3VudGVyZWQgYWxvbmcgdGhlIHdheSwgYXMgd2VsbCBhcyBwb3Nz aWJsZSBpbXByb3ZlbWVudHMNCiAoaW4gcGFydGljdWxhciBkZWZvcmVzdGluZyB0aGUgY29tYmlu YXRpb24gb2YgbXVsdGlwbGUgcGFzc2VzKS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjMiPkpzX29mX29jYW1sIDUuMjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWpzLW9mLW9jYW1sLTUtMi8xMzU4MS8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWpzLW9mLW9jYW1sLTUtMi8xMzU4MS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0N2RkNGNjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnNDdkZDRjYyI+SGh1Z28gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmc0N2RkNGNjIj4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3Vu Y2UgdGhlIHJlbGVhc2Ugb2YganNfb2Zfb2NhbWwgNS4yLiBJdCBzaG91bGQgc29vbiBiZSBhYmxl IGF2YWlsYWJsZSBpbiBvcGFtLg0KPC9wPg0KPHA+SnNfb2Zfb2NhbWwgaXMgYSBjb21waWxlciBm cm9tIE9DYW1sIGJ5dGVjb2RlIHRvIEphdmFTY3JpcHQuIEl0IG1ha2VzIGl0IHBvc3NpYmxlIHRv IHJ1biBwdXJlIE9DYW1sIHByb2dyYW1zIGluIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgbGlrZSBi cm93c2VycyBhbmQgTm9kZS5qcy4NCjwvcD4NCjxwPk1vc3Qgc2lnbmlmaWNhbnQgY2hhbmdlczog PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkltcHJvdmUgc3VwcG9ydCBmb3IgbW9kZXJu IGphdmFzY3JpcHQgPC9saT48bGk+TmV3IGdsb2JhbCBkZWFkIGNvZGUgZWxpbWluYXRpb24gcGFz cy4gSnNvbyBjYW4gbm93IGRyb3AgdW51c2VkIGNvZGUgaW5zaWRlIGZ1bmN0b3JzLiBTZWUgdGhl DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9qc19vZl9vY2FtbC9wdWxsLzE1 MDMiPnB1bGwgcmVxdWVzdDwvYT4gZm9yIG1vcmUgZGV0YWlscw0KPC9saT48bGk+Q2hhbmdlIHN0 cmF0ZWd5IHVzZWQgZm9yIGNvbnRyb2wgZmxvdyBjb21waWxhdGlvbi4gSXQgd2FzIGFkYXB0ZWQg ZnJvbSB3YXNtX29mX29jYW1sIGFuZCBiYXNlZCBvbiB0aGUgZm9sbG93aW5nIHBhcGVyDQo8YSBo cmVmPSJodHRwczovL2RsLmFjbS5vcmcvZG9pL2Ficy8xMC4xMTQ1LzM1NDc2MjEiPmh0dHBzOi8v ZGwuYWNtLm9yZy9kb2kvYWJzLzEwLjExNDUvMzU0NzYyMTwvYT4uDQo8L2xpPjwvdWw+DQo8cD5T ZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2pzX29mX29jYW1sL2Js b2IvbWFzdGVyL0NIQU5HRVMubWQiPg0KQ2hhbmdlbG9nIDwvYT5mb3Igb3RoZXIgY2hhbmdlcy4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt NCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPmNvbnRhaW5lcnMgMy4xMzwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0xMy8xMzU4 Mi8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0xMy8xMzU4 Mi8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxN2E2 ODUwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMTdhNjg1MCI+U2ltb24gQ3J1YW5l cyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzE3YTY4NTAiPg0KPHA+SGVsbG8sIEkganVzdCByZWxlYXNlZCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vYy1jdWJlL29jYW1sLWNvbnRhaW5lcnMvcmVsZWFzZXMvdGFnL3YzLjEzIj4NCmNv bnRhaW5lcnMgMy4xMzwvYT4gb24gb3BhbS4gPC9wPg0KPHA+VGhpcyByZWxlYXNlIGlzIHNvbWV3 aGF0IG1vcmUgYnJlYWtpbmcgdGhhbiB1c3VhbDogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPk9DYW1sIDQuMDggaXMgbm93IHRoZSBtaW5pbXVtIE9DYW1sIHZlcnNpb24uIDwvbGk+PGxp Pjxjb2RlPkNDU2hpbXNfPC9jb2RlPiAod2hpY2ggd2FzIHVzZWQgdG8gcHJvdmlkZSBhIHNoaW0g Zm9yIDxjb2RlPlN0ZGxpYjwvY29kZT4gcHJlLTQuMDgpIGlzIHJlbW92ZWQNCjwvbGk+PGxpPjxj b2RlPmNvbnRhaW5lcnMtdGhyZWFkPC9jb2RlPiwgd2hpY2ggd2FzIGRlcHJlY2F0ZWQsIGlzIG5v IG1vcmUuIFRoZSByZWNvbW1lbmRlZCBhbHRlcm5hdGl2ZSBpcw0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2MtY3ViZS9tb29ucG9vbC8iPk1vb25wb29sPC9hPi4gPC9saT48L3VsPg0KPHA+ T24gT0NhbWwgNS4xIGFuZCBhYm92ZSwgdGFpbC1yZWMtbW9kLWNvbnMgaXMgdXNlZCB0byBzaW1w bGlmeSBhbmQgYWNjZWxlcmF0ZSBzb21lIGZ1bmN0aW9ucyBpbg0KPGNvZGU+Q0NMaXN0PC9jb2Rl Pi4gPC9wPg0KPHA+SGFwcHkgaGFja2luZyEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjUiPk1lbGFuZ2UgMi4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tbWVsYW5nZS0yLTAvMTMwNzMvMyI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1t ZWxhbmdlLTItMC8xMzA3My8zPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdlNDhjODBjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZTQ4Yzgw YyI+QW50b25pbyBOdW5vIE1vbnRlaXJvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTQ4YzgwYyI+DQo8cD5NZWxhbmdlIDIuMiBpcyBub3cg b3V0IHdpdGggc3VwcG9ydCBmb3IgT0NhbWwgNS4xLjEuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSI2Ij5PQ2FtbCA1LjEuMSByZWxlYXNlZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0xLTEtcmVsZWFzZWQvMTM1OTIvMSI+aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMS0xLXJlbGVhc2VkLzEzNTkyLzE8L2E+DQo8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE0YTYyZDEiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmcxNGE2MmQxIj5vY3RhY2hyb24gYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxNGE2MmQxIj4NCjxwPkluIHRo ZSBsYXN0IHRocmVlIG1vbnRocyBhZnRlciB0aGUgcmVsZWFzZSBvZiBPQ2FtbCA1LjEuMCwgdGhy ZWUgc2lnbmlmaWNhbnQgcmVncmVzc2lvbnMgaGF2ZSBiZWVuIGRpc2NvdmVyZWQgaW4gT0NhbWwg NS4xLjAuIFRob3NlIHJlZ3Jlc3Npb25zIGNvbmNlcm4gdGhlIHBhY2thZ2luZyBvZiBleGVjdXRh YmxlcywgdGhlIHR5cGVjaGVja2luZyBvZiBPQ2FtbCBwcm9ncmFtcywgYW5kIHRoZSBwZXJmb3Jt YW5jZSBvZiBudW1lcmljYWwgY29kZXMuDQo8L3A+DQo8cD5TaW5jZSB0aG9zZSByZWdyZXNzaW9u cyBhZmZlY3QgbWFueSB1c2VycyBhbmQgY291bGQgaGF2ZSBsYXN0aW5nIGVmZmVjdHMsIHdlIGhh dmUgcHVibGlzaGVkIGEgcGF0Y2ggcmVsZWFzZSwgT0NhbWwgNS4xLjEsIGZpeGluZyB0aG9zZSBp c3N1ZXMuDQo8L3A+DQo8cD5BcyBhIG1ham9yIGV4Y2VwdGlvbiB0byBvdXIgcG9saWN5IGZvciBw YXRjaCByZWxlYXNlcywgT0NhbWwgNS4xLjEgd2lsbCBjb250YWluIG9uZSBicmVha2luZyBjaGFu Z2UgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnk6IHRoZQ0KPGNvZGU+Q29tcHJlc3Npb248L2NvZGU+ IGZsYWcgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSA8Y29kZT5NYXJzaGFsPC9jb2RlPiBtb2R1 bGUuIFRoaXMgZHJhc3RpYyBtZWFzdXJlIGhhcyBiZWVuIHRha2VuIGJlY2F1c2Ugc3VwcG9ydGlu ZyB6c3RkIGNvbXByZXNzaW9uIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IG1hZGUgenN0ZCBhIGRl cGVuZGVuY3kgb2YgYWxsIE9DYW1sIGV4ZWN1dGFibGVzLiBTaW5jZSB0aGUgY29tcGlsZXIgc2hv dWxkIG5vdA0KIHByb3BhZ2F0ZSBpdHMgZGVwZW5kZW5jaWVzIG9uIGVuZC11c2VycywgdGhlIHN1 cHBvcnQgZm9yIGNvbXByZXNzZWQgbWFyc2hhbGxpbmcgaGFzIGJlZW4gbW92ZWQgdG8gYSBjb21w aWxlciBpbnRlcm5hbCBsaWJyYXJ5IGluIDUuMS4xLg0KPC9wPg0KPHA+QWNjb3VudGluZyBmb3Ig dGhlIHN0aWxsIGV4cGVyaW1lbnRhbCBuYXR1cmUgb2YgdGhlIG11bHRpY29yZSBydW50aW1lLCB0 aGlzIHBhdGNoIHJlbGVhc2UgNS4xLjEgYWxzbyBjb250YWlucyBzYWZlIGZpeGVzIGZvciBzdWJ0 bGUgY29uY3VycmVuY3kgYnVncyBpbiB0aGUgT0NhbWwgcnVudGltZS4NCjwvcD4NCjxwPkluIGJy aWVmLCBpZiB5b3Ugd2VyZSB1c2luZyBPQ2FtbCA1LjEuMCwgSSBzdHJvbmdseSByZWNvbW1lbmQg dGhhdCB5b3Ugc3dpdGNoIHRvIDUuMS4xIC4NCjwvcD4NCjxwPlRoZSBmdWxsIGxpc3Qgb2YgY2hh bmdlcyBpcyBhdmFpbGFibGUgYmVsb3cgZm9yIG1vcmUgZGV0YWlscy4gPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNTg4M2U2IiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnMjU4ODNlNiI+SW5zdGFsbGF0aW9uIEluc3RydWN0aW9uczwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMjU4ODNlNiI+DQo8cD5UaGUgYmFz ZSBjb21waWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dpdGNoIHdpdGggdGhlIGZv bGxvd2luZyBjb21tYW5kczoNCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdkMGU2 M2E2Ij4NCm9wYW0gdXBkYXRlDQpvcGFtIHN3aXRjaCBjcmVhdGUgNS4xLjENCjwvcHJlPg0KPHA+ VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVsZWFzZSBpcyBhbHNvIGRpcmVjdGx5IGF2YWlsYWJs ZSBvbjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzUuMS4xLnRhci5neiI+R2l0SHViPC9hPiA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNS4x L29jYW1sLTUuMS4xLnRhci5neiI+SW5yaWEgYXJjaGl2ZTwvYT4NCjwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5OTZlMzk3IiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnOTk2ZTM5NyI+Q2hhbmdlcyBpbiBPQ2FtbCA1LjEuMSAo OCBEZWNlbWJlciAyMDIzKTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnOTk2ZTM5NyI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9y ZzY2NjM3YjUiPjwvYT5TdGFuZGFyZCBMaWJyYXJ5PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTUiIGlkPSJ0ZXh0LW9yZzY2NjM3YjUiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPig8 Yj5icmVha2luZyBjaGFuZ2U8L2I+KSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEyNTYyIj4NCiMxMjU2MjwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI3MzQiPiMxMjczNDwvYT4sIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI3ODMiPg0KIzEyNzgzPC9hPjogUmVt b3ZlIHRoZSA8Y29kZT5NYXJzaGFsLkNvbXByZXNzaW9uPC9jb2RlPiBmbGFnIHRvIHRoZSA8Y29k ZT5NYXJzaGFsLnRvXyo8L2NvZGU+IGZ1bmN0aW9ucyBpbnRyb2R1Y2VkIGluIDUuMSBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjAwNiI+IzEyMDA2 PC9hPiwgYXMgaXQgY2Fubm90IGJlIGltcGxlbWVudGVkIHdpdGhvdXQgcmlza2luZyB0byBsaW5r IC1senN0ZCB3aXRoIGFsbCBvY2FtbG9wdC1nZW5lcmF0ZWQgZXhlY3V0YWJsZXMuIFRoZSBjb21w aWxlcnMgYXJlIHN0aWxsIGFibGUgdG8gdXNlIFpTVEQgY29tcHJlc3Npb24gZm9yIGNvbXBpbGF0 aW9uIGFydGVmYWN0cy4gKFhhdmllciBMZXJveQ0KIGFuZCBEYXZpZCBBbGxzb3BwLCByZXBvcnQg YnkgS2F0ZSBEZXBsYWl4LCByZXZpZXcgYnkgTmljb2zDoXMgT2plZGEgQsOkciwgS2F0ZSBEZXBs YWl4LCBhbmQgRGFtaWVuIERvbGlnZXopLg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48 YSBpZD0ib3JnNTgwZjQ1MiI+PC9hPkJ1ZyBGaXhlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmc1ODBmNDUyIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNjIzIj4jMTI2 MjM8L2E+LCBmaXggdGhlIGNvbXB1dGF0aW9uIG9mIHZhcmlhbmNlIGNvbXBvc2l0aW9uIChGbG9y aWFuIEFuZ2VsZXR0aSwgcmVwb3J0IGJ5IFZlc2EgS2Fydm9uZW4sIHJldmlldyBieSBHYWJyaWVs IFNjaGVyZXIpDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyNTgxIj4jMTI1ODE8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEyNjA5Ij4NCiMxMjYwOTwvYT46IEZpeCBlcnJvciBvbiB1c2Vz IG9mIHBhY2tlZCBtb2R1bGVzIG91dHNpZGUgdGhlaXIgcGFjayB0byBjb3JyZWN0bHkgaGFuZGxl IG5lc3RlZCBwYWNrcyAoVmluY2VudCBMYXZpcm9uLCByZXBvcnQgYnkgSmF2aWVyIENow6F2YXJy aSwgcmV2aWV3IGJ5IFBpZXJyZSBDaGFtYmFydCkNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2NDUiPiMxMjY0NTwvYT4sIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2NDkiPg0KIzEyNjQ5PC9h PiBmaXggZXJyb3IgbWVzc2FnZXMgZm9yIGN5Y2xpYyB0eXBlIGRlZmluaXRpb25zIGluIHByZXNl bmNlIG9mIHRoZSA8Y29kZT4NCi1zaG9ydC1wYXRoczwvY29kZT4gZmxhZy4gKEZsb3JpYW4gQW5n ZWxldHRpLCByZXBvcnQgYnkgVmVzYSBLYXJ2b25lbiwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJl cikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMvMTI3NTciPiMxMjc1NzwvYT46IEZpeCBvY2FtbG5hdCAobmF0aXZlIHRvcGxldmVsKSBieSBy ZWdpc3RlcmluZyBmcmFtZXRhYmxlcyBjb3JyZWN0bHkgKFN0ZXBoZW4gRG9sYW4sIE5pY2sgQmFy bmVzIGFuZCBNYXJrIFNoaW53ZWxsLCByZXZpZXcgYnkgVmluY2VudCBMYXZpcm9uIGFuZCBTw6li YXN0aWVuIEhpbmRlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy8xMjc5MSI+IzEyNzkxPC9hPjogPGNvZGU+ZXh0ZXJuPC9jb2RlPiBp cyBhcHBsaWVkIHRvIGRlZmluaXRpb25zIG9mDQo8Y29kZT5jYW1sX2J1aWx0aW5fY3ByaW08L2Nv ZGU+IGFuZCA8Y29kZT5jYW1sX25hbWVzX29mX2J1aWx0aW5fY3ByaW08L2NvZGU+IHdoZW4gbGlu a2luZyBieXRlY29kZSDigJktY3VzdG9t4oCZIGV4ZWN1dGFibGVzIHdpdGggYSBDJiM0MzsmIzQz OyBsaW5rZXIuIChTaGF5bmUgRmxldGNoZXIsIHJldmlldyBieSBBbnRvbmluIETDqWNpbW8gYW5k IFhhdmllciBMZXJveSkNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzc4 ZWQ3MGUiPjwvYT5HQyBQZXJmb3JtYW5jZSBSZWdyZXNzaW9uIEZpeGVzPGJyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzc4ZWQ3MGUiPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTIzMTgiPiMxMjMxODwvYT46IEdDOiBzaW1wbGlmeSB0aGUgbWVhbmluZyBvZiBjdXN0b21fbWlu b3JfbWF4X3NpemU6IGJsb2NrcyB3aXRoIG91dC1vZi1oZWFwIG1lbW9yeSBhYm92ZSB0aGlzIGxp bWl0IGFyZSBub3cgYWxsb2NhdGVkIGRpcmVjdGx5IGluIHRoZSBtYWpvciBoZWFwLiAoRGFtaWVu IERvbGlnZXosIHJlcG9ydCBieSBTdGVwaGVuIERvbGFuLA0KIHJldmlldyBieSBHYWJyaWVsIFNj aGVyZXIpIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvMTI0MzkiPiMxMjQzOTwvYT46IEZpbmFsaXplIGFuZCBjb2xsZWN0IGRlYWQgY3VzdG9t IGJsb2NrcyBkdXJpbmcgbWlub3IgY29sbGVjdGlvbiAoRGFtaWVuIERvbGlnZXosIHJldmlldyBi eSBYYXZpZXIgTGVyb3ksIEdhYnJpZWwgU2NoZXJlciBhbmQgS0MgU2l2YXJhbWFrcmlzaG5hbikN CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTI1OTAiPiMxMjU5MDwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTI1OTUiPg0KIzEyNTk1PC9hPjogTW92ZSA8Y29kZT5jYW1sX2NvbGxlY3RfZ2Nf c3RhdHNfc2FtcGxlPC9jb2RlPiBpbiA8Y29kZT5jYW1sX2VtcHR5X21pbm9yX2hlYXBfcHJvbW90 ZTwvY29kZT4gYmVmb3JlIGJhcnJpZXIgYXJyaXZhbC4gKEIuIFN6aWx2YXN5LCByZXZpZXcgYnkg R2FicmllbCBTY2hlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy8xMjQ5MSI+IzEyNDkxPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjQ5MyI+DQojMTI0OTM8L2E+LCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNTAwIj4jMTI1MDA8L2E+LCA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNzU0Ij4NCiMx Mjc1NDwvYT46IERvIG5vdCBjaGFuZ2UgR0MgcGFjZSB3aGVuIGNyZWF0aW5nIHN1Yi1hcnJheXMg b2YgYmlnYXJyYXlzIChYYXZpZXIgTGVyb3ksIHJlcG9ydCBieSBJZG8gWWFyaXYsIGFuYWx5c2lz IGJ5IEdhYnJpZWwgU2NoZXJlciwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlciBhbmQgRmFicmlj ZSBCdW9ybykNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzMzNDRjN2Yi PjwvYT5SdW50aW1lIEJ1ZyBGaXhlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmczMzQ0YzdmIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExODAwIj4jMTE4MDA8L2E+LCA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNzA3Ij4NCiMx MjcwNzwvYT46IGZpeCBhbiBhc3NlcnRpb24gcmFjZSBjb25kaXRpb24gaW4gPGNvZGU+aW5zdGFs bF9iYWNrdXBfdGhyZWFkPC9jb2RlPiAoSmFuIE1pZHRnYWFyZCwgcmV2aWV3IGJ5IEdhYnJpZWwg U2NoZXJlcikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTI0ODYiPiMxMjQ4NjwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvMTI1MzUiPg0KIzEyNTM1PC9hPjogRml4IGRlbGl2ZXJ5IG9mIHVu aGFuZGxlZCBlZmZlY3QgZXhjZXB0aW9ucyBvbiBhbWQ2NCB3aXRoIOKAk2VuYWJsZS1mcmFtZS1w b2ludGVycyAoTWlvZCBWYWxsYXQsIHJlcG9ydCBieSBKYW4gTWlkdGdhYXJkLCByZXZpZXcgYnkg R2FicmllbCBTY2hlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy8xMjcxMiI+IzEyNzEyPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjc0MiI+DQojMTI3NDI8L2E+OiBmaXggYW4gYXNz ZXJ0aW9uIGJvdW5kYXJ5IGNhc2UgaW4gPGNvZGU+Y2FtbF9yZXNldF95b3VuZ19saW1pdDwvY29k ZT4gKEphbiBNaWR0Z2FhcmQsIHJldmlldyBieSBHdWlsbGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSkN CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTI3MTMiPiMxMjcxMzwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9pc3N1ZXMvMTI3MTUiPg0KIzEyNzE1PC9hPjogZGlzYWJsZSBjb21tb24gc3ViZXhwcmVzc2lv biBlbGltaW5hdGlvbiBmb3IgYXRvbWljIGxvYWRzIChHYWJyaWVsIFNjaGVyZXIgYW5kIFZpbmNl bnQgTGF2aXJvbiwgcmV2aWV3IGJ5IFZpbmNlbnQgTGF2aXJvbiwgS0MgU2l2YXJhbWFrcmlzaG5h biBhbmQgWGF2aWVyIExlcm95LCByZXBvcnQgYnkgVmVzYSBLYXJ2b25lbiBhbmQgQ2FyaW5lIE1v cmVsKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNyI+RGtNTCAyLjEuMCAtIE1ham9yIGNoYW5nZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21sLTItMS0wLW1ham9yLWNoYW5nZXMvMTM1OTMvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRrbWwtMi0xLTAtbWFqb3ItY2hhbmdl cy8xMzU5My8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzI4OTQ5ZmIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyODk0OWZiIj5qYmVja2Zv cmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmcyODk0OWZiIj4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3VuY2UgYSBtYWpvciBvdmVyaGF1 bCBvZiBEa01MIGluIHZlcnNpb24gMi4xLjAuIDwvcD4NCjxwPlNvbWUgb2YgdGhlIG1ham9yIGNo YW5nZXMgaW5jbHVkZTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxjb2RlPndpbmdl dCBpbnN0YWxsIGRrbWw8L2NvZGU+IGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgdG8gaW5zdGFsbC4g PC9saT48bGk+SW5zdGFsbGF0aW9uIGlzIG5vdyBpbiBzdGFnZXMuIFRoZSBmaXJzdCBzdGFnZSAo PGNvZGU+d2luZ2V0IGluc3RhbGwgZGttbDwvY29kZT4pIHRha2VzIDUgbWludXRlcyBhbmQgbGV0 cyB0aGUgZW5kLXVzZXIgZG8NCjxjb2RlPnV0b3A8L2NvZGU+LCA8Y29kZT5vY2FtbGM8L2NvZGU+ IGFuZCA8Y29kZT5vY2FtbHJ1bjwvY29kZT4gKHN1ZmZpY2llbnQgZm9yIGxlYXJuaW5nKS4gSG93 ZXZlciwgYW55IGNvbW1hbmQgdGhhdCBuZWVkIFZpc3VhbCBTdHVkaW8gKGV4Lg0KPGNvZGU+b3Bh bTwvY29kZT4sIDxjb2RlPmRrbWw8L2NvZGU+KSB3aWxsIGZpcnN0Og0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPmd1aWRlIHlvdSBpZiB5b3UgbmVlZCBHaXQgYW5kL29yIFZpc3VhbCBTdHVkaW8g KDxjb2RlPndpbmdldDwvY29kZT4gZG9lcyBub3Qgc3VwcG9ydCBhdXRvLWluc3RhbGxpbmcgZGVw ZW5kZW5jaWVzIGxpa2Ugb3RoZXINCjxpPnNhbmU8L2k+IHBhY2thZ2UgbWFuYWdlcnMpLCBhbmQg dGhlbiA8L2xpPjxsaT5pbnN0YWxsIHRoZSBPQ2FtbCBzeXN0ZW0gY29tcGlsZXIsIHRoZSBvcGFt IHJvb3QgYW5kIGEgcGxheWdyb3VuZCBnbG9iYWwgc3dpdGNoIGF1dG9tYXRpY2FsbHkgb24gZmly c3QgcnVuDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5BbHBoYSBzdXBwb3J0IGZvciBtYWNPUy9TaWxp Y29uIGFuZCBtb3N0IG1vZGVybiBkaXN0cm9zIG9mIEdOVS9MaW51eCA8L2xpPjxsaT5IYXMgYW4g YWNjb21wYW55aW5nIHZpZGVvIGRlc2NyaWJpbmcgaG93IHRvIGluc3RhbGwgYW5kIHVzZSBEa01M IG9uIFdpbmRvd3MgdGFyZ2V0ZWQgdG8gYm90aCBsZWFybmVycyBhbmQgcHJvZmVzc2lvbmFscy4g SW5jbHVkZXMgVmlzdWFsIFN0dWRpbyBDb2RlIGFuZCBMU1A6DQo8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iOCI+Q2FsbCBmb3IgUGFydGljaXBhdGlvbjogQk9CIDIwMjQgKEJl cmxpbiwgTWFyY2ggMTUpPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9j YWxsLWZvci1wYXJ0aWNpcGF0aW9uLWJvYi0yMDI0LWJlcmxpbi1tYXJjaC0xNS8xMzYwOS8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1wYXJ0aWNpcGF0aW9uLWJvYi0y MDI0LWJlcmxpbi1tYXJjaC0xNS8xMzYwOS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmc3ZDA2NTI0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnN2QwNjUyNCI+TWljaGFlbCBTcGVyYmVyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2QwNjUyNCI+DQo8cD5Nb3JlIGluZm8gYXQgPGEg aHJlZj0iaHR0cHM6Ly9ib2Jrb25mLmRlLzIwMjQvIj5odHRwczovL2JvYmtvbmYuZGUvMjAyNC88 L2E+ISA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnODliZGUzNCI+DQo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09DQoJCQkgICAgICAgQk9CIDIwMjQNCgkJCSAgICAgIENvbmZlcmVuY2UNCgkgICAg IOKAnFdoYXQgaGFwcGVucyBpZiB3ZSBzaW1wbHkgdXNlIHdoYXTigJlzIGJlc3Q/4oCdDQoJCSAg ICAgICBNYXJjaCAxNSwgMjAyNCwgQmVybGluDQoJCSAgICAgICBodHRwczovL2JvYmtvbmYuZGUv MjAyNC8NCg0KCSAgICBQcm9ncmFtOiBodHRwczovL2JvYmtvbmYuZGUvMjAyNC9wcm9ncmFtLmh0 bWwNCgkgIFJlZ2lzdHJhdGlvbjogaHR0cHM6Ly9ib2Jrb25mLmRlLzIwMjQvcmVnaXN0cmF0aW9u Lmh0bWwNCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT0NCg0KQk9CIGNvbmZlcmVuY2UgaXMgYSBwbGFjZSBmb3Ig ZGV2ZWxvcGVycywgYXJjaGl0ZWN0cywgYW5kIGRlY2lzaW9uLW1ha2Vycw0KdG8gZXhwbG9yZSB0 ZWNobm9sb2dpZXMgYmV5b25kIHRoZSBtYWluc3RyZWFtIGluIHNvZnR3YXJlIGRldmVsb3BtZW50 DQphbmQgdG8gZmluZCB0aGUgYmVzdCB0b29scyBhdmFpbGFibGUgdG8gc29mdHdhcmUgZGV2ZWxv cGVycyB0b2RheS4gT3VyDQpnb2FsIGlzIGZvciBhbGwgcGFydGljaXBhbnRzIG9mIEJPQiB0byBy ZXR1cm4gaG9tZSB3aXRoIG5ldyBpbnNpZ2h0cw0KdGhhdCBlbmFibGUgdGhlbSB0byBpbXByb3Zl IHRoZWlyIG93biBzb2Z0d2FyZSBkZXZlbG9wbWVudA0KZXhwZXJpZW5jZS4NCg0KVGhlIHByb2dy YW0gZmVhdHVyZXMgMTQgdGFsa3MgYW5kIDggdHV0b3JpYWxzIG9uIGN1cnJlbnQgdG9waWNzOg0K DQpodHRwczovL2JvYmtvbmYuZGUvMjAyNC9wcm9ncmFtLmh0bWwNCg0KVGFsayBzdWJqZWN0cyBp bmNsdWRlcyBmdW5jdGlvbmFsIHByb2dyYW1taW5nLCBwcm9wZXJ0eS1iYXNlZCB0ZXN0aW5nLA0K c2VydmljZSBBUEkgZGVzaWduLCBwcm9ncmFtbWluZyBmb3Igc3BhY2VjcmFmdCwgYWNjZXNzaWJp bGl0eSwNCmh5cGVybWVkaWEsIGJ1c2luZXNzIHByb2Nlc3Nlcywgc29mdHdhcmUgYW5hbHl0aWNz LCBldmVudC1iYXNlZA0KY29tbXVuaWNhdGlvbiBhbmQgemVyby1rbm93bGVkZ2UgcHJvb2ZzLg0K DQpCT0Igd2lsbCBmZWF0dXJlIHR1dG9yaWFscyBvbiBGIywgSGFza2VsbCwgTGVhbiwgU3dpZnRV SSwgQ29waWxvdCwgdGhlDQpLIEZyYW1ld29yaywgZnVuY3Rpb25hbCBkb21haW4gbW9kZWxsaW5n LCBhbmQgTGliZXJhdGluZyBTdHJ1Y3R1cmVzLg0KDQpBbmRyZWFzIFJvc3NiZXJnIHdpbGwgZ2l2 ZSB0aGUga2V5bm90ZSB0YWxrLg0KDQpSZWdpc3RyYXRpb24gaXMgb3BlbiAtIG9ubGluZSB0aWNr ZXRzIGFyZSBhbGwgdW5kZXIgMjAw4oKsLCBhbmQgbWFueQ0KZGlzY291bnQgb3B0aW9ucyBhcmUg YXZhaWxhYmxlLCBhcyBhcmUgZ3JhbnRzIGZvciBtZW1iZXJzIG9mIGdyb3Vwcw0KdW5kZXJyZXBy ZXNlbnRlZCBpbiB0ZWNoOg0KDQpodHRwczovL2JvYmtvbmYuZGUvMjAyNC9yZWdpc3RyYXRpb24u aHRtbA0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+b2NhbWwtcHJvdG9jIDMu MDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXByb3Rv Yy0zLTAvMTM2MTEvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1wcm90 b2MtMy0wLzEzNjExLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzE4OTFhNTciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxODkxYTU3Ij5T aW1vbiBDcnVhbmVzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnMTg5MWE1NyI+DQo8cD5EZWFyIGNhbWxpZGFlLCA8L3A+DQo8cD5J4oCZbSBo YXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vbXJhbnNhbi9vY2FtbC1wcm90b2MvcmVsZWFzZXMvdGFnL3YzLjAuMCI+DQpvY2FtbC1wcm90 b2MgMy4wPC9hPiAoYWxvbmdzaWRlIHRoZSBtdWx0aXBsZSBydW50aW1lIGxpYnJhcmllczogPGNv ZGU+cGJydDwvY29kZT4sDQo8Y29kZT5wYnJ0X3lvanNvbjwvY29kZT4sIGFuZCB0aGUgbmV3IDxj b2RlPnBicnRfc2VydmljZXM8L2NvZGU+KS4gVGhpcyBpcyBhIG1ham9ybHkgYnJlYWtpbmcgcmVs ZWFzZSwgSeKAmW0gc29ycnkgZm9yIHRoYXQgKEkgZG8sIGhvd2V2ZXIsIGJlbGlldmUgaXQgbmVj ZXNzYXJ5KSBhbmQgcmVjb21tZW5kIGV2ZXJ5IHVzZXIgb2Ygb2NhbWwtcHJvdG9jIGFkZCBhbiB1 cHBlciBib3VuZA0KPGNvZGU+Jmx0OyAzLjA8L2NvZGU+IHRvIHRoZWlyIGN1cnJlbnQgcHJvamVj dCBhbmQgbWlncmF0ZSB3aGVuIHRoZXkgaGF2ZSB0aW1lLiA8L3A+DQo8cD5GaXJzdCwgYSBzdW1t YXJ5LiA8Y29kZT5vY2FtbC1wcm90b2M8L2NvZGU+IGlzIGEgc2VsZi1jb250YWluZWQgY29tcGls ZXIgdGhhdCB0dXJucw0KPGEgaHJlZj0iaHR0cHM6Ly9wcm90b2J1Zi5kZXYvIj5wcm90b2J1Zjwv YT4gSURMIGZpbGVzICg8Y29kZT4ucHJvdG88L2NvZGU+IGZpbGVzKSBpbnRvIE9DYW1sIHR5cGVz LCBwcmV0dHktcHJpbnRlcnMsIGFuZCAoZGUpc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMuIFRoZSBy dW50aW1lIGxpYnJhcnkNCjxjb2RlPnBicnQ8L2NvZGU+ICjigJxwcm90b2J1ZiBydW50aW1l4oCd KSBjb250YWlucyBzdXBwb3J0IGNvZGUgZm9yIHByaW50ZXJzIGFuZCBiaW5hcnkgKGRlKXNlcmlh bGl6YXRpb247DQo8Y29kZT5wYnJ0X3lvanNvbjwvY29kZT4gY29udGFpbnMgc3VwcG9ydCBjb2Rl IGZvciBKU09OIChkZSlzZXJpYWxpemF0aW9uIGJ5IHdheSBvZg0KPGNvZGU+eW9qc29uPC9jb2Rl Pi4gPC9wPg0KPHA+U28gd2hhdCBjaGFuZ2VkIHdpdGggb2NhbWwtcHJvdG9jIDMuMD8gTWFueSB0 aGluZ3MuIDwvcD4NCjxwPkZvciBhIHN0YXJ0LCBmcm9tIG9uZSA8Y29kZT4ucHJvdG88L2NvZGU+ IGZpbGUgd2Ugbm93IGdlbmVyYXRlIG9uZSBwYWlyIG9mIDxjb2RlPg0KLm1sPC9jb2RlPiBhbmQg PGNvZGU+Lm1saTwvY29kZT4gZmlsZXMgaW5zdGVhZCBvZiBzZXZlcmFsIHBhaXJzLiBUaGlzIHJl ZHVjZXMgdGhlIGJvaWxlcnBsYXRlIGluIGJ1aWxkIHN5c3RlbXMgYW5kIHNpbXBsaWZpZXMgdXNl ciBjb2RlIG92ZXJhbGwgKG9uZSBtb2R1bGUgcGVyDQo8Y29kZT4ucHJvdG88L2NvZGU+IGZpbGUp LiBBIGxhcmdlIGludGVybmFsIHJlZmFjdG9yIG9mIDxjb2RlPm9jYW1sLXByb3RvYzwvY29kZT4g d2FzIGRvbmUgcHJpb3IgdG8gdGhlIGludGVncmF0aW9uIG9m4oCmDQo8c3BhbiBjbGFzcz0idW5k ZXJsaW5lIj5zZXJ2aWNlczwvc3Bhbj4uIDwvcD4NCjxwPlRoZSBtYWpvciBuZXcgZmVhdHVyZSBv ZiA8Y29kZT5vY2FtbC1wcm90b2M8L2NvZGU+IDMuMCBpcyB0aGUgc3VwcG9ydCBmb3Igc2Vydmlj ZSBkZWNsYXJhdGlvbnMuIFRoZXNlIGFyZSBlc3NlbnRpYWxseQ0KPGEgaHJlZj0iaHR0cHM6Ly9w cm90b2J1Zi5kZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL3Byb3RvMy8jc2VydmljZXMiPmEgd2F5PC9h PiB0byBkZXNjcmliZSBSUEMgZW5kcG9pbnRzLCBuZXh0IHRvIHRoZSB0eXBlcyB1c2VkIHRvIGlu dGVyYWN0IHdpdGggdGhlIGVuZHBvaW50ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbXJh bnNhbi9vY2FtbC1wcm90b2MvYmxvYi9tYXN0ZXIvc3JjL2V4YW1wbGVzL2ZpbGVfc2VydmVyLnBy b3RvIj5leGFtcGxlPC9hPjsNCjxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2MtY3Vi ZS9jNzZmZWNhZmVlZGY0MjZjMzUzZTQ4N2MyZTQ3MTM1NCI+ZnVsbCBnZW5lcmF0ZWQgY29kZTwv YT4pLiBUaGlzIGlzIHR5cGljYWxseSB3aGF0IGl0IHVzZWQgaW4gc3lzdGVtcyBzdWNoIGFzDQo8 YSBocmVmPSJodHRwczovL2dycGMuaW8iPmdSUEM8L2E+LiBOb3cgPGNvZGU+b2NhbWwtcHJvdG9j PC9jb2RlPiBnZW5lcmF0ZXMgc2VydmVyIGFuZCBjbGllbnQgc3R1YnMgZm9yIGVhY2ggZW5kcG9p bnQsIHRoYXQgcGFjayB0b2dldGhlciB0aGUgdHlwZSBkZWZpbml0aW9ucyBhbmQgdGhlIHJlbGV2 YW50IChkZSlzZXJpYWxpemVyczsgdGhhdCBjb2RlIGRvZXNu4oCZdCBwcmVzdW1lIGFueXRoaW5n IGFib3V0IGEgY29uY3JldGUgUlBDIHN5c3RlbS4NCiBJIGhhdmUgaW4gdGhlIHdvcmtzIGEgc2lt cGxlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2l0Y2h0di90d2lycCI+VHdpcnA8L2E+ DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL29jYW1sLXR3aXJwIj5PQ2FtbCBs aWJyYXJ5PC9hPiB0aGF0IHJlbGllcyBvbiB0aGlzIGdlbmVyYXRlZCBjb2RlIHRvIHByb3ZpZGUg c2VydmljZXMgb3ZlciBIVFRQIDEuMTsgSXQgaXMgYWxzbyBwb3NzaWJsZSB0byB3cml0ZSBSUEMg c3lzdGVtcyBvdmVyIFpNUSwgd2Vic29ja2V0cywgZXRjLiB3aXRob3V0IGNoYW5nZXMgdG8gdGhl IGdlbmVyYXRlZCBjb2RlW14xXS4NCjwvcD4NCjxwPlteMV06IG5vdGUgdGhhdCB0d2lycCBkb2Vz buKAmXQgc3VwcG9ydCBzdHJlYW0gUlBDIG92ZXIgSFRUUCAxLjEuIE90aGVyIFJQQyBzeXN0ZW1z IGNhbiBzdXBwb3J0IHRoZXNlLCBlLmcuIGdSUEMgZG9lcy4NCjwvcD4NCjxwPkFub3RoZXIgYmln LWlzaCBjaGFuZ2UgaXMgaG93IHRoZSBnZW5lcmF0ZWQgY29kZSBsb29rcyBsaWtlLCBhdCBsZWFz dCB3aGVuIGl0IGNvbWVzIHRvIGJpbmFyeSAoZGUpc2VyaWFsaXphdGlvbi4NCjxjb2RlPm9jYW1s LXByb3RvYzwvY29kZT4gMy4wIGNvbWVzIHdpdGggc2lnbmlmaWNhbnQgc3BlZWR1cHMgZm9yIGVu Y29kaW5nICh1cCB0byB0d2ljZSB0aGUgdGhyb3VnaHB1dDsgb3JkZXIgb2YgbWFnbml0dWRlIHJl ZHVjdGlvbiBpbiBhbGxvY2F0aW9ucyBpbiBzb21lIGNhc2VzIFteMl0pIGFuZCBzb21lIGxlc3Mg aW1wcmVzc2l2ZSBzcGVlZHVwcyBmb3IgZGVjb2RpbmcuIFRoaXMgaXMgYSBjb21iaW5hdGlvbiBv ZiBtdWx0aXBsZSBjaGFuZ2VzOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnVzZSBv ZiBhIGZldyBDIHN0dWJzIHRvIGFjY2VsZXJhdGUgdmFyaW50IGRlY29kaW5nL2VuY29kaW5nOyA8 L2xpPjxsaT5lbmNvZGluZyBpcyBkb25lIGJhY2stdG8tZnJvbnQsIHdoaWNoIGFsbG93cyB0aGUg ZW5jb2RlciB0byB1c2UgYSBzaW5nbGUgc2xpY2UgaW50ZXJuYWxseVteM10uIFRoaXMgaXMgd2hh dCByZXF1aXJlZCBjaGFuZ2VzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSBpbiB0aGUgZmlyc3QgcGxh Y2U7DQo8L2xpPjxsaT5lbmNvZGluZyBjb2RlIG5vdyByZXF1aXJlcyBhIGxvdCBmZXdlciBjbG9z dXJlcyAocGFzc2luZyBhcmd1bWVudHMgZXhwbGljaXRseSBpbnN0ZWFkKSB3aGljaCByZWR1Y2Vz IGFsbG9jYXRpb25zIHRvIGFsbW9zdCBub3RoaW5nLg0KPC9saT48L3VsPg0KPHA+SSBoYXZlbuKA mXQgcmVjZW50bHkgYmVuY2htYXJrZWQgYWdhaW5zdCBvdGhlciBwcm90b2J1ZiBpbXBsZW1lbnRh dGlvbnMgaW4gT0NhbWwsIGJ1dCBJ4oCZbSByZWFzb25hYmx5IGNvbmZpZGVudCB0aGF0IHRoaXMg aXMgbm93IHRoZSBmYXN0ZXN0IG9uZSBieSBhIGhlYWx0aHkgbWFyZ2luLg0KPC9wPg0KPHA+VGhl cmUgYXJlIGFsc28gb3RoZXIgaW1wcm92ZW1lbnRzIGFuZCBidWdmaXhlcy4gSSB3YW50IHRvIHRo YW5rIGluIHBhcnRpY3VsYXIgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2x1cHVzIj4NCkBL b25zdGFudGluX09sa2hvdnNraTwvYT4gZm9yIHNvbWUgb2YgdGhlc2UgY29udHJpYnV0aW9ucyBh bmQgZm9yIHZlcnkgaGVscGZ1bCBkaXNjdXNzaW9ucywgYW5kIGFsc28gQFZQaGFudG9tIGZvciBt b3JlIGRpc2N1c3Npb25zIG9uIHRoZSB0b3BpYyBvZiBwZXJmb3JtYW5jZS4NCjwvcD4NCjxwPlte Ml06IGlmIHRoZSBlbmNvZGVyIHR5cGUgaXMgcmV1c2VkLCB0aGVyZeKAmXMgYWxtb3N0IG5vIG1p bm9yIGFsbG9jYXRpb25zLCBhbmQgbm8gbWFqb3IgYWxsb2NhdGlvbnMsIHRvIGVuY29kZSBhbiBl eGlzdGluZyB2YWx1ZSBpbnRvIHRoZSBlbmNvZGVy4oCZcyBidWZmZXIuDQo8L3A+DQo8cD5bXjNd OiBiZWNhdXNlIHN1Yi1tZXNzYWdlcyB1c2UgdmFyaW50IGFzIHRoZWlyIHNpemVzLCBlbmNvZGlu ZyBmcm9udC10by1iYWNrIGNhbm5vdCBiZSBlZmZpY2llbnRseSBkb25lIGluIGEgc2luZ2xlIGJ1 ZmZlciwgYmVjYXVzZSBpdOKAmXMgbm90IGNsZWFyIGhvdyBtYW55IGJ5dGVzIHRvIHJlc2VydmUg aW4gZnJvbnQgb2YgYSBzdWItbWVzc2FnZS4gV2l0aCBiYWNrLXRvLWZyb250IHRoYXTigJlzIG5v dCBhbiBpc3N1ZS4NCjwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbXJh bnNhbi9vY2FtbC1wcm90b2MvcmVsZWFzZXMvdGFnL3YzLjAuMCI+Y2hhbmdlbG9nPC9hPiBjb250 YWlucyBtYW55IG1vcmUgZGV0YWlscy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MTAiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTEwIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzIxYzMyZWQi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyMWMzMmVkIj5Gcm9tIHRoZSBvY2FtbC5v cmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMjFj MzJlZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9nYWxsaXVt LmlucmlhLmZyL2Jsb2cvZmxvcmlhbi1jdy0yMDIzLTEyLTExIj5GbG9yaWFuIGNvbXBpbGVyIHdl ZWtseSwgMTEgRGVjZW1iZXIgMjAyMzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDIzLTEyLTA1LWludGVybmF0aW9uYWwtZGlzYWJpbGl0eS1kYXktMjAy My13aHktaXQtbWF0dGVycyI+SW50ZXJuYXRpb25hbCBEaXNhYmlsaXR5IERheSAyMDIzOiBXaHkg SXQgTWF0dGVyczwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VmOTkxMTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSJvcmdlZjk5MTEyIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC1vcmdlZjk5MTEyIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwg eW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4N CnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0 YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8i Pg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0K PHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91 IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3lt cGEvaW5mby9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0 aG9ybmFtZSIgaWQ9Im9yZzcxZmJjNDUiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 5 Dec 2023 10:14:11 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 5 Dec 2023 10:14:11 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 5 Dec 2023 10:14:11 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3B5AEH6W009161 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 5 Dec 2023 10:14:17 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3B5AE3Im009138 for ; Tue, 5 Dec 2023 10:14:03 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 Dec 2023 11:14:02 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7F8EEE0CD1; Tue, 5 Dec 2023 11:14:01 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 50A00E00B7 for ; Tue, 5 Dec 2023 11:13:57 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Dec 2023 11:13:22 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 80BFB5605E0; Tue, 5 Dec 2023 11:13:20 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaJ2PKa6GpDl12FECDPuuzpSdWNg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 5 Dec 2023 10:13:08 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: d87e414c-92b9-4136-968f-08dbf57aece2 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,251,1695679200"; d="scan'208,217";a="73438892" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.484404, queueID=E12A25605E9 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <730C28323BE3F6418A8352DB72BF56E2@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMi0wNSBUdWUgMTE6MTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTEuMjguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMi4xMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE5vdmVtYmVyIDI4IHRvIERlY2VtYmVyIDA1 LCAyMDIzLg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2Mi Pg0KPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29u dGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5IaWdobGV4ZXI8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5WaWRlbyBUdXRvcmlhbDogSG93IHRvIEluc3RhbGwg T0NhbWwgb24gTGludXggYW5kIG1hY09TITwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkVpbyBU VUkgY2hhdCBzZXJ2ZXIgYW5kIGNsaWVudCBkZW1vPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+ ZHVuZS4zLjEyLjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5PQ2FtbCBQbGF0Zm9ybSBOZXdz bGV0dGVyOiBPY3RvYmVyIDIwMjM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5BZHZlbnQgb2Yg Q29kZSBwcm9qZWN0IHRlbXBsYXRlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+b3BhbS1oZWFs dGgtY2hlY2stbmcgMC4xLjA6IGNoZWNrIHRoZSBoZWFsdGggb2YgYW4gb3BhbSByZXBvc2l0b3J5 IG9uIHlvdXIgaG9tZSBtYWNoaW5lPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzgiPkZpcnN0IHJl bGVhc2UgY2FuZGlkYXRlIG9mIE9DYW1sIDUuMS4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+ Q29tcG9zaXRpb25hbCBBdXRvbWF0ZWQgVmVyaWZpY2F0aW9uIGZvciBPQ2FtbDwvYT4gPC9saT48 bGk+PGEgaHJlZj0iIzEwIj5PQ2FtbCBhbmQgT1BBTSBhd2FyZGVkIFRoZSBPcGVuIFNjaWVuY2Ug QXdhcmQgZm9yIEZyZWUgYW5kIE9wZW4tU291cmNlIFJlc2VhcmNoIFNvZnR3YXJlczwvYT4NCjwv bGk+PGxpPjxhIGhyZWY9IiMxMSI+SUNGUCAyMDIzIE9DYW1sIFByZXNlbnRhdGlvbnMgb24gWW91 VHViZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEyIj5nZW9qc29uIGFuZCBnZW9qc29uZTwvYT4g PC9saT48bGk+PGEgaHJlZj0iIzEzIj5SZXRoaW5raW5nIGFic3RyYWN0IG1vZHVsZSB0eXBlcyAt IGZlZWRiYWNrIHdhbnRlZDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzE0Ij5UU2FuIHN1cHBvcnQg aW4gT0NhbWwgNS4xIGFuZCBibG9nIHBvc3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxNSI+SGls aXRlIDAuMy4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTYiPllvdSBDYW4gQXR0ZW5kIHRoZSBO ZXcgT0NhbWwub3JnIENvbW11bml0eSBNZWV0aW5nczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzE3 Ij5BIERlY2VtYmVyIHVwZGF0ZSBmcm9tIHRoZSBvY2FtbC13YXNtIG9yZ2FuaXNhdGlvbjwvYT4g PC9saT48bGk+PGEgaHJlZj0iIzE4Ij5PdGhlciBPQ2FtbCBOZXdzPC9hPiA8L2xpPjxsaT48YSBo cmVmPSIjb3JnZTMzZDU0MCI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSIxIj5IaWdobGV4ZXI8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1oaWdobGV4ZXIvMTM1MjAvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1oaWdo bGV4ZXIvMTM1MjAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnOTMzZTQzNyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzkzM2U0MzciPkVt aWxlIFRyb3RpZ25vbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzkzM2U0MzciPg0KPHA+SSBwbGVhc2UgdG8gYW5ub3VuY2UgdGhlIGZpcnN0 IHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9oaWdobGV4ZXIvbGF0ZXN0 L2RvYy9IaWdobGV4ZXIvaW5kZXguaHRtbCI+DQpoaWdobGV4ZXI8L2E+LiBJdCBpcyBhIHNtYWxs IGxpYnJhcnkgdGhhdCBhbGxvd3MgeW91IHRvIGhpZ2hsaWdodCBvY2FtbCBjb2RlIHNuaXBwZXRz IHVzaW5nIGEgbW9kaWZpZWQgdmVyc2lvbiBvZiB0aGUgb2NhbWwgbGV4ZXIuDQo8L3A+DQo8cD5J dCB3YXMgZGVzaWduZWQgdG8gd29yayB3ZWxsIGluIHRoZSBicm93c2VyIHdpdGgganNfb2Zfb2Nh bWwsIGJ1dCBpdCBkb2VzIG5vdCBoYXZlIHRvLCB5b3UgY2FuIHVzZSBpdCB0byBjb2xvciBodG1s IGluIHRoZSBiYWNrZW5kIG9yIGV2ZW4gcHJvYmFibHkgbGF0ZXguDQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iMiI+VmlkZW8gVHV0b3JpYWw6IEhvdyB0byBJbnN0YWxsIE9DYW1sIG9u IExpbnV4IGFuZCBtYWNPUyE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3ZpZGVvLXR1dG9yaWFsLWhvdy10by1pbnN0YWxsLW9jYW1sLW9uLWxpbnV4LWFuZC1tYWNvcy8x MzUyMy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC92aWRlby10dXRvcmlhbC1ob3ct dG8taW5zdGFsbC1vY2FtbC1vbi1saW51eC1hbmQtbWFjb3MvMTM1MjMvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTM1MjMxZiIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZ2UzNTIzMWYiPklzYWJlbGxhIExlYW5kZXJzc29uIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTM1MjMxZiI+ DQo8cD5IZWxsbyBldmVyeW9uZSEgPC9wPg0KPHA+SeKAmW0gcGFydCBvZiBhIGdyb3VwIGF0IFRh cmlkZXMgdGhhdCBpcyBmb2N1c2luZyBvbiBjcmVhdGluZyB2aWRlbyB0dXRvcmlhbHMgZm9yIE9D YW1sLiBTaW5jZSBldmVyeW9uZSBsZWFybnMgZGlmZmVyZW50bHkg4oCTIEkgbXlzZWxmIHVzZSB2 aWRlb3MgYSBsb3Qgd2hlbiBsZWFybmluZyBhIG5ldyBza2lsbCBvciBjb25jZXB0IOKAkyB3ZSB3 YW50IHRvIHByb3ZpZGUgZGlmZmVyZW50IG1lZGl1bXMgdGhyb3VnaCB3aGljaCBwZW9wbGUgY2Fu IGxlYXJuDQogT0NhbWwuIDwvcD4NCjxwPlRoaXMgaXMgb3VyIGZpcnN0IHZpZGVvIGFuZCB0aGVy ZeKAmXMgZGVmaW5pdGVseSByb29tIGZvciBpbXByb3ZlbWVudCEgUGxlYXNlIGxldCB1cyBrbm93 IHdoYXQgY291bGQgYmUgYmV0dGVyLCBhbmQgaWYgeW91IGhhdmUgYW55IGlkZWFzIGZvciB3aGF0 IHdlIHNob3VsZCBjb3ZlciBuZXh0IHBsZWFzZSBzaGFyZSB0aGVtIHdpdGggdXMhIDpEDQo8L3A+ DQo8cD48YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXN5NEVRaXJOTVVJ Ij5odHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXN5NEVRaXJOTVVJPC9hPg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPkVpbyBUVUkgY2hhdCBzZXJ2ZXIgYW5kIGNsaWVu dCBkZW1vPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxw PkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9laW8tdHVpLWNo YXQtc2VydmVyLWFuZC1jbGllbnQtZGVtby8xMzUzMy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9laW8tdHVpLWNoYXQtc2VydmVyLWFuZC1jbGllbnQtZGVtby8xMzUzMy8xPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2JmOGMxYjMiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiZjhjMWIzIj5EYXJyZW4gYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiZjhjMWIzIj4NCjxwPkhl bGxvIGV2ZXJ5b25lLCA8L3A+DQo8cD5J4oCZbSBzaGFyaW5nIGEgc21hbGwgZGVtbyBvZiB1c2lu ZyBFaW8gYW5kIE5vdHR1aSAoYW5kIE5vdHR5KSB0byBpbXBsZW1lbnQgY2hhdCBzZXJ2ZXIgJiM0 MzsgY2xpZW50Lg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhcnJlbmxk bC9vY2FtbC10dWktY2hhdC1kZW1vIj5SZXBvPC9hPiA8L3A+DQo8cD5UaGUgdGVjaG5pY2FsIGRl dGFpbHMgYXJlIGF2YWlsYWJsZSBpbiB0aGUgUkVBRE1FIG9mIHRoZSByZXBvLiA8L3A+DQo8cD5T ZXJ2ZXI6IDwvcD4NCjxkaXYgaWQ9Im9yZzgzNjYwN2QiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGlt ZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRz L29jYW1sL29yaWdpbmFsLzJYLzQvNGY3OTQ4Mzk5MDA5Y2Q3OTc2MDAzZWM3YTJiMjg5YmQzMDZl NTBmNC5wbmciIGFsdD0iNGY3OTQ4Mzk5MDA5Y2Q3OTc2MDAzZWM3YTJiMjg5YmQzMDZlNTBmNC5w bmciPg0KPC9wPg0KPC9kaXY+DQo8cD5DbGllbnQ6IDwvcD4NCjxkaXYgaWQ9Im9yZzZmNTdhZmUi IGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1j ZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYL2YvZjRjYTM1YTViMDg4 MDdlYmM1MDI1ODljOWNiNmFlN2UxNDY4ZTdkNC5wbmciIGFsdD0iZjRjYTM1YTViMDg4MDdlYmM1 MDI1ODljOWNiNmFlN2UxNDY4ZTdkNC5wbmciPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iNCI+ZHVuZS4zLjEyLjE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1kdW5lLTMtMTItMS8xMzUzNi8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWR1bmUtMy0xMi0xLzEzNTM2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzhiZjE3ZTQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmc4YmYxN2U0Ij5FdGllbm5lIE1pbGxvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzhiZjE3ZTQiPg0KPHA+VGhlIER1bmUgdGVhbSBp cyBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIER1bmUgMy4xMi4gPC9wPg0KPHA+ Tm90ZSB0aGF0IGR1ZSB0byBhIG1pc3Rha2UgZHVyaW5nIHRoZSByZWxlYXNlIHByb2Nlc3MsIHZl cnNpb24gPGNvZGU+My4xMi4wPC9jb2RlPiB3YXMgbm90IHB1Ymxpc2hlZCB0byBvcGFtIGFuZCBz aG91bGQgbm90IGJlIHVzZWQuIFNvIGhlcmXigJlzIHRoZSBjaGFuZ2Vsb2cgZm9yDQo8Y29kZT4z LjEyLjE8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Zzg5MWNjMTciIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4OTFjYzE3Ij5BZGRlZDwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnODkxY2MxNyI+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW50cm9kdWNlIDxjb2RlPiQgZHVuZSBvY2FtbCBkb2M8 L2NvZGU+IHRvIG9wZW4gYW5kIGJyb3dzZSBkb2N1bWVudGF0aW9uLiAoIzcyNjIsIGZpeGVzICM2 ODMxLCBARW1pbGVUcm90aWdub24pDQo8L2xpPjxsaT48Y29kZT5kdW5lIGNhY2hlIHRyaW08L2Nv ZGU+IG5vdyBhY2NlcHRzIGJpbmFyeSBieXRlIHVuaXRzOiA8Y29kZT5LaUI8L2NvZGU+LA0KPGNv ZGU+TWlCPC9jb2RlPiwgZXRjLiAoIzg2MTgsIEBBbGl6dGVyKSA8L2xpPjxsaT5JbnRyb2R1Y2Ug dGhlIDxjb2RlPnJ1bnRlc3RfYWxpYXM8L2NvZGU+IGZpZWxkIHRvIHRoZSA8Y29kZT5jcmFtPC9j b2RlPiBzdGFuemEuIFRoaXMgYWxsb3dzIHJlbW92aW5nIGRlZmF1bHQNCjxjb2RlPnJ1bnRlc3Q8 L2NvZGU+IGFsaWFzIGZyb20gdGVzdHMuIChAcmdyaW5iZXJnLCAjODg4NykgPC9saT48bGk+RGlz cGxheSBjYWNoZSBsb2NhdGlvbiBpbiBEdW5lIGxvZyAoIzg5NzQsIEBub2piKSA8L2xpPjxsaT5E dW5lIGNhbiBub3cgYmUgYnVpbHQgYW5kIGluc3RhbGxlZCBvbiBIYWlrdSAoIzg3OTUsIGZpeCAj ODU1MSwgQEFsaXp0ZXIpIDwvbGk+PGxpPk1hcmsgaW5zdGFsbGVkIGRpcmVjdG9yaWVzIGluIDxj b2RlPmR1bmUtcGFja2FnZTwvY29kZT4gZmlsZXMuIFRoaXMgZml4ZXMgPGNvZGU+DQoocGFja2Fn ZSk8L2NvZGU+IGRlcGVuZGVuY2llcyBhZ2FpbnN0IHBhY2thZ2VzIHRoYXQgY29udGFpbiBzdWNo IGRpcmVjdG9yaWVzLiAoIzg5NTMsIGZpeGVzICM4OTE1LCBAZW1pbGxvbikNCjwvbGk+PGxpPklu dHJvZHVjZSBuZXcgZXhwZXJpbWVudGFsIG9kb2MgcnVsZXMgKCM4ODAzLCBAam9uanVkbGFtKSA8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn YzI4ZDQ5YSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2MyOGQ0OWEiPkNoYW5nZWQ8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2MyOGQ0OWEiPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmR1bmUtYnVpbGQtaW5mbzogd2hlbiA8Y29kZT52ZXJz aW9uPSZxdW90OyZxdW90OzwvY29kZT4gaXMgZm91bmQgaW4gYSA8Y29kZT5NRVRBPC9jb2RlPiBm aWxlLCB3ZSBub3cgcmV0dXJuDQo8Y29kZT5Ob25lPC9jb2RlPiBhcyBhIHZlcnNpb24gc3RyaW5n ICgjOTE3NywgQGVtaWxsb24pIDwvbGk+PGxpPk5vIGxvbmdlciBmb3JjZSBjb2xvcnMgZm9yIE9D YW1sIDQuMDMgYW5kIDQuMDQgKCM4Nzc4LCBAcmdyaW5iZXJnKSA8L2xpPjxsaT5EZXBlbmRlbmNp ZXMgaW4gdGhlIGNvcHlpbmcgc2FuZGJveCBhcmUgbm93IHdyaXRlYWJsZSAoIzg5MjAsIEByZ3Jp bmJlcmcpIDwvbGk+PGxpPlJ1bGVzIHRoYXQgb25seSB1c2UgaW50ZXJuYWwgZHVuZSBhY3Rpb25z ICg8Y29kZT53cml0ZS1maWxlPC9jb2RlPiwgPGNvZGU+ZWNobzwvY29kZT4sIGV0Yy4pIGNhbiBu b3cgYmUgc2FuZGJveGVkLiAoIzkwNDEsIGZpeGVzICM4ODU0LCBAcmdyaW5iZXJnKQ0KPC9saT48 bGk+QWRkIDxjb2RlPnRlc3RfPC9jb2RlPiBwcmVmaXggdG8gZGVmYXVsdCB0ZXN0IG5hbWUgaW4g PGNvZGU+ZHVuZSBpbml0IHByb2plY3Q8L2NvZGU+ICgjOTI1NywgZml4ZXMgIzkxMzEsIEA5c2Fr bzYpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnZDc1NWU4ZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Q3NTVlOGUiPkZp eGVkPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdkNzU1ZThl Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5EbyBub3QgaWdub3JlIGxpYnJhcmllcyBuYW1l ZCA8Y29kZT5iaWdhcnJheTwvY29kZT4gd2hlbiB0aGV5IGFyZSBkZWZpbmVkIGluIGNvbmp1bmN0 aW9uIHdpdGggT0NhbWwgNS4wICgjODkwMiwgZml4ZXMgIzg5MDEsIEByZ3JpbmJlcmcpDQo8L2xp PjxsaT5Db3JyZWN0bHkgaWdub3JlIDxjb2RlPmJpZ2FycmF5PC9jb2RlPiBvbiByZWNlbnQgdmVy c2lvbnMgb2YgT0NhbWwgKCM5MDc2LCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+QWJzZW50IHBhY2th Z2VzIHNob3VsZG7igJl0IHByZXZlbnQgYWxsIHJ1bGVzIGZyb20gYmVpbmcgbG9hZGVkICgjODk0 OCwgZml4ZXMgIzg2MzAsIEByZ3JpbmJlcmcpDQo8L2xpPjxsaT5Db3JyZWN0bHkgZGV0ZXJtaW5l IHRoZSBzdGFuemEgb2YgbWVuaGlyIG1vZHVsZXMgd2hlbiA8Y29kZT4oaW5jbHVkZV9zdWJkaXJz IHF1YWxpZmllZCk8L2NvZGU+IGlzIGVuYWJsZWQgKEByZ3JpbmJlcmcsICM4OTQ5LCBmaXhlcyAj NzYxMCkNCjwvbGk+PGxpPlJlLXJ1biBhY3Rpb25zIHdoZW5ldmVyIDxjb2RlPihleHBhbmRfYWxp YXNlc19pbl9zYW5kYm94KTwvY29kZT4gY2hhbmdlcyAoIzg5OTAsIEByZ3JpbmJlcmcpDQo8L2xp PjxsaT5EbyBub3QgcmUtcnVuIHJ1bGVzIHdoZW4gdGhlaXIgbG9jYXRpb24gY2hhbmdlcyAoIzkw NTIsIEByZ3JpbmJlcmcpIDwvbGk+PGxpPltjb3EgcnVsZXNdIEJlIG1vcmUgdG9sZXJhbnQgd2hl biBjb3FjIOKAk3ByaW50LXZlcnNpb24gLyDigJNjb25maWcgZG9u4oCZdCB3b3JrIHByb3Blcmx5 LCBhbmQgZmFsbGJhY2sgdG8gYSByZWFzb25hYmxlIGRlZmF1bHQuIFRoaXMgZml4ZXMgcHJvYmxl bXMgd2hlbiBidWlsZGluZyBDb3EgcHJvamVjdHMgd2l0aA0KPGNvZGU+KHN0ZGxpYiBubyk8L2Nv ZGU+IGFuZCBsaWtlbHkgb3RoZXIgY2FzZXMuICgjODk2NiwgZml4ICM4OTU4LCBAQWxpenRlciwg cmVwb3J0ZWQgYnkgTGFzc2UgQmxhYXV3YnJvZWspDQo8L2xpPjxsaT5EdW5lIHdpbGwgbm93IHJ1 biBhdCBhIGxvd2VyIGZyYW1lcmF0ZSBvZiAxNSBmcHMgcmF0aGVyIHRoYW4gNjAgd2hlbiA8Y29k ZT5JTlNJREVfRU1BQ1M8L2NvZGU+LiAoIzg4MTIsIEBBbGl6dGVyKQ0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+T0NhbWwgUGxhdGZvcm0gTmV3c2xldHRl cjogT2N0b2JlciAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9v Y2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVyLW9jdG9iZXItMjAyMy8xMzUzOC8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVyLW9jdG9iZXItMjAy My8xMzUzOC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2E0N2Q5YmYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhNDdkOWJmIj5UaGliYXV0 IE1hdHRpbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZ2E0N2Q5YmYiPg0KPHA+V2VsY29tZSB0byB0aGUgc2V2ZW50aCBlZGl0aW9uIG9mIHRo ZSBPQ2FtbCBQbGF0Zm9ybSBuZXdzbGV0dGVyISA8L3A+DQo8cD5JbiB0aGlzIE9jdG9iZXIgZWRp dGlvbiwgd2UgYnJpbmcgeW91IHRoZSBsYXRlc3Qgb24gdGhlIE9DYW1sIFBsYXRmb3JtLCBjb250 aW51aW5nIG91ciB0cmFkaXRpb24gb2YgaGlnaGxpZ2h0aW5nIHJlY2VudCBkZXZlbG9wbWVudHMg YXMgc2VlbiBpbg0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvcGxhdGZv cm0tbmV3c2xldHRlciI+cHJldmlvdXMgZWRpdGlvbnM8L2E+LiBUbyB1bmRlcnN0YW5kIHRoZSBk aXJlY3Rpb24gd2XigJlyZSBoZWFkZWQsIGVzcGVjaWFsbHkgcmVnYXJkaW5nIGRldmVsb3BtZW50 IHdvcmtmbG93cyBhbmQgdXNlciBleHBlcmllbmNlIGltcHJvdmVtZW50cywgY2hlY2sgb3V0IG91 cg0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwIj5yb2Fk bWFwPC9hPi4gPC9wPg0KPHA+PGI+SGlnaGxpZ2h0czo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5UaGUgdGhyZWUteWVhciByb2FkbWFwIGZvciB0aGUgT0NhbWwgUGxhdGZvcm0g aGFzIGJlZW4gYWRvcHRlZCEgV2XigJlyZSB0aHJpbGxlZCB0byBoYXZlIGEgY29tbXVuaXR5LWRy aXZlbiByb2FkbWFwIGZvciB0aGUgaW1wcm92ZW1lbnQgb2YgT0NhbWwgZGV2ZWxvcGVyIGV4cGVy aWVuY2UsIGFuZCB3ZeKAmXJlIHZlcnkgZ3JhdGVmdWwgZm9yIGFsbCB0aGUgZXhjZWxsZW50IGZl ZWRiYWNrIHdlIHJlY2VpdmVkIGZyb20gdGhlIGNvbW11bml0eS4gSGF2ZQ0KIGEgbG9vayBhdCB0 aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3RoZS1vY2FtbC1wbGF0Zm9y bS1yb2FkbWFwLWlzLWFkb3B0ZWQvMTM0NTkiPg0KYW5ub3VuY2VtZW50PC9hPi4gPC9saT48bGk+ QWZ0ZXIgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2RlcHJlY2F0aW5nLW9j YW1sLW1pZ3JhdGUtcGFyc2V0cmVlLWluLWZhdm9yLW9mLXBweGxpYi1hbHNvLWFzLWEtcGxhdGZv cm0tdG9vbC8xMzI0MCI+DQpnaXZpbmcgc3BhY2UgZm9yIGZlZWRiYWNrPC9hPiBhbmQgb2JqZWN0 aW9ucyBieSB0aGUgY29tbXVuaXR5LCB3ZSBoYXZlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L2NoYW5nZWxvZy8yMDIzLTEwLTIzLW9tcC1kZXByZWNhdGlvbiI+DQpkZXByZWNhdGVkIG9jYW1s LW1pZ3JhdGUtcGFyc2V0cmVlPC9hPiAoYWthIE9NUCkuIEl0IGlzIHN1cGVyc2VkZWQgYnkgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9wcHhsaWIiPg0KUHB4bGliPC9hPi4g PC9saT48bGk+V2XigJlyZSBpbnRyb2R1Y2luZyBhIG5ldyBmb3JtYXQgZm9yIG91ciBuZXdzbGV0 dGVyLiBMZXQgdXMga25vdyB5b3VyIHRob3VnaHRzIGFuZCBob3cgd2UgY2FuIG1ha2UgaXQgZXZl biBiZXR0ZXIgZm9yIHlvdSENCjwvbGk+PC91bD4NCjxwPjxiPlJlbGVhc2VzOjwvYj4gPC9wPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5n ZWxvZy8yMDIzLTEwLTMwLW9wYW0tcHVibGlzaC0yLjMuMCI+PGNvZGU+b3BhbS1wdWJsaXNoPC9j b2RlPiAyLjMuMDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5n ZWxvZy8yMDIzLTEwLTA1LXBweGxpYi0wLjMxLjAiPjxjb2RlPlBweGxpYjwvY29kZT4gMC4zMS4w PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjMt MTAtMzAtb2RvYy0yLjMuMSI+PGNvZGU+b2RvYzwvY29kZT4gMi4zLjE8L2E+DQo8L2xpPjxsaT48 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyMy0xMC0wNC1kdW5lLTMuMTEu MCI+RHVuZSAzLjExLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2No YW5nZWxvZy8yMDIzLTEwLTEyLWR1bmUtMy4xMS4xIj5EdW5lIDMuMTEuMTwvYT4gPC9saT48L3Vs Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjMGE4ZDQ3IiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYzBhOGQ0NyI+PGI+W0R1bmVdPC9iPiBFeHBsb3Jpbmcg UGFja2FnZSBNYW5hZ2VtZW50IGluIER1bmU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZ2MwYThkNDciPg0KPHA+KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3NC1idWlsZC1hLXByb2plY3QiPlc0PC9hPikgPC9wPg0K PHA+PGI+Q29udHJpYnV0ZWQgYnk6PC9iPiBAcmdyaW5iZXJnIChUYXJpZGVzKSwgQExlb25pZGFz LWZyb20tWElWIChUYXJpZGVzKSwgQGdyaWRidWdzIChUYXJpZGVzKSwgQGtpdC10eS1rYXRlIChU YXJpZGVzKSwgQEFsaXp0ZXINCjwvcD4NCjxwPjxiPldoeTo8L2I+IFVuaWZ5IE9DYW1sIHRvb2xp bmcgdW5kZXIgYSBzaW5nbGUgY29tbWFuZCBsaW5lIGZvciBhbGwgZGV2ZWxvcG1lbnQgd29ya2Zs b3dzLiBUaGlzIGFkZHJlc3NlcyBvbmUgb2YgdGhlIG1vc3QgaW1wb3J0YW50IHBhaW4gcG9pbnRz DQo8YSBocmVmPSJodHRwczovL3d3dy5kcm9wYm94LmNvbS9zL29tYmExZDh2aGxqbnJjbi9PQ2Ft bC11c2VyLXN1cnZleS0yMDIwLnBkZj9kbD0wIj4NCnJlcG9ydGVkIGJ5IHRoZSBjb21tdW5pdHk8 L2E+LiA8L3A+DQo8cD48Yj5XaGF0OjwvYj4gUHJvdG90eXBpbmcgdGhlIGludGVncmF0aW9uIG9m IHBhY2thZ2UgbWFuYWdlbWVudCBpbnRvIER1bmUgYnkgdXNpbmcgb3BhbSBhcyBhIGxpYnJhcnku IFdl4oCZcmUgYWRkaW5nIGEgbmV3DQo8Y29kZT5kdW5lIHBrZyBsb2NrPC9jb2RlPiBjb21tYW5k IHRvIGdlbmVyYXRlIGEgbG9jayBmaWxlIGFuZCBleHRlbmQgPGNvZGU+ZHVuZSBidWlsZDwvY29k ZT4gdG8gc3VwcG9ydCBkb3dubG9hZGluZyBhbmQgYnVpbGRpbmcgZGVwZW5kZW5jaWVzIHNwZWNp ZmllZCBpbiB0aGUgbG9jayBmaWxlLiBSZWFkIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL2R1bmUvaXNzdWVzLzc2ODAiPkR1bmUgUkZDPC9hPiBmb3IgbW9yZSBkZXRhaWxz Lg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5XZSByZXdvcmtlZCB0aGUgc3RvcmFnZSBmb3Igb3BhbSByZXBvc2l0b3JpZXMuIFdlIG5v dyBoYXZlIHN1cHBvcnQgZm9yIG11bHRpcGxlIHJlcG9zaXRvcmllcywgd2hpY2ggd2Ugc3RvcmUg YW5kIHVwZGF0ZSBpbiBhbiBlZmZpY2llbnQgbWFubmVyLiDigJMNCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODk1MCI+b2NhbWwvZHVuZSM4OTUwPC9hPiA8L2xp PjxsaT5XZSBpbnRyb2R1Y2VkIHRoZSA8Y29kZT4kIGR1bmUgcGtnIG91dGRhdGVkPC9jb2RlPiBj b21tYW5kIHRvIHZpZXcgYWxsIHRoZSBvdXRkYXRlZCBwYWNrYWdlcyBpbiBhIGxvY2sgZGlyZWN0 b3J5LiDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODc3 MyI+b2NhbWwvZHVuZSM4NzczPC9hPiA8L2xpPjxsaT5XZSBpbnRyb2R1Y2VkIDxjb2RlPiQgZHVu ZSBkZXNjcmliZSBwa2cgbG9jazwvY29kZT4gdG8gcHJpbnQgbG9jayBkaXJlY3Rvcmllcy4gVGhp cyBnaXZlcyB1c2VycyBhIG5pY2Ugb3ZlcnZpZXcgb2Ygd2hhdOKAmXMgYXZhaWxhYmxlIGluIHRo ZSBsb2NrIGRpcmVjdG9yeeKAmXMgYnVpbGQgcGxhbi4g4oCTDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg4NDEiPm9jYW1sL2R1bmUjODg0MTwvYT4gPC9saT48 bGk+V2UgYWRkZWQgc3VwcG9ydCBmb3Igc29sdmVyIHZhcmlhYmxlcyBpbiA8Y29kZT5sb2NrZGly PC9jb2RlPiB0byBtYWtlIHN1cmUgb3BhbSB2YXJpYWJsZXMgYXJlIGFsc28gYXZhaWxhYmxlIGF0 IGJ1aWxkIGFuZCBpbnN0YWxsIHRpbWUg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvZHVuZS9wdWxsLzg5NzMiPm9jYW1sL2R1bmUjODk3MzwvYT4gPC9saT48bGk+V2UgbWFu YWdlZCB0byBzdWNjZXNzZnVsbHkgZ2VuZXJhdGUgYSBsb2NrIGZpbGUgZm9yIDxjb2RlPmNtZGxp bmVyPC9jb2RlPiBvbiBXaW5kb3dzISA6d2luZG93czogTmV4dCwgd2XigJlyZSB3b3JraW5nIG9u IG1ha2luZyBidWlsZCB3b3JrIG9uIFdpbmRvd3MgYXMgd2VsbC4g4oCTDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzkwNDgiPm9jYW1sL2R1bmUjOTA0ODwvYT4g PC9saT48bGk+QW5kIGFzIHVzdWFsLCB3ZSBmaXhlZCBhIGJ1bmNoIG9mIGJ1Z3MgdGhhdCBwcmV2 ZW50ZWQgeW91ciByZWd1bGFyIHBhY2thZ2VzIGZyb20gYnVpbGRpbmc6DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+UmVxdWlyZSBjb3B5aW5nIHNhbmRib3ggZm9yIGJ1aWxkIHJ1bGVzIOKAkyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg5MjMiPg0Kb2NhbWwv ZHVuZSM4OTIzPC9hPiA8L2xpPjxsaT5SZXNwZWN0IFtmbGFnc10gZmllbGQgaW4gb3BhbSBwYWNr YWdlcyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC85MDQ3 Ij4NCm9jYW1sL2R1bmUjOTA0NzwvYT4gPC9saT48bGk+SW1wcm92ZSBpbnZhbGlkIHN1YnN0aXR1 dGUgZXJyb3Ig4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwv ODkyMiI+DQpvY2FtbC9kdW5lIzg5MjI8L2E+IDwvbGk+PGxpPkNvcnJlY3RseSB2ZXJpZnkgdGFy YmFsbCBjaGVja3N1bXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L3B1bGwvODg3NiI+DQpvY2FtbC9kdW5lIzg4NzY8L2E+IDwvbGk+PGxpPkltcHJvdmUgbG9jYXRp b25zIG9mIGNvbnZlcnNpb24gZXJyb3JzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvZHVuZS9wdWxsLzg4MjgiPg0Kb2NhbWwvZHVuZSM4ODI4PC9hPiA8L2xpPjxsaT5SZW1v dmUgcG9zdCBkZXBzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9w dWxsLzg4MzQiPm9jYW1sL2R1bmUjODgzNDwvYT4NCjwvbGk+PGxpPk1vdmUgc29sdmVyIGVudiBw cmludGluZyB0byBvd24gY29tbWFuZCDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL2R1bmUvcHVsbC84ODE5Ij4NCm9jYW1sL2R1bmUjODgxOTwvYT4gPC9saT48bGk+UmVjb3Jk IGluc3RhbGxlZCBkaXJlY3RvcmllcyBpbiA8Y29kZT5kdW5lLXBhY2thZ2U8L2NvZGU+IOKAkyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg5NTMiPg0Kb2NhbWwv ZHVuZSM4OTUzPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMDJjNmZiOCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8 aDQgaWQ9Im9yZzAyYzZmYjgiPjxiPltvcGFtXTwvYj4gTmF0aXZlIFN1cHBvcnQgZm9yIFdpbmRv d3MgaW4gb3BhbSAyLjI8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZzAyYzZmYjgiPg0KPHA+KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZv cm0tcm9hZG1hcCN3NS1tYW5hZ2UtZGVwZW5kZW5jaWVzIj5XNTwvYT4pDQo8L3A+DQo8cD48Yj5D b250cmlidXRlZCBieTo8L2I+IEByamJvdSAoT0NhbWxQcm8pLCBAa2l0LXR5LWthdGUgKFRhcmlk ZXMpLCBAZHJhMjcgKFRhcmlkZXMpLCBAQWx0R3IgKE9DYW1sUHJvKQ0KPC9wPg0KPHA+PGI+V2h5 OjwvYj4gT3BhbSBhbmQgPGNvZGU+b3BhbS1yZXBvc2l0b3J5PC9jb2RlPiBjdXJyZW50bHkgZG9u 4oCZdCBzdXBwb3J0IFdpbmRvd3MgbmF0aXZlbHkuIFRoaXMgZWZmZWN0aXZlbHkgbWFrZXMgT0Nh bWwgYSB2ZXJ5IG5pY2hlIGNhbmRpZGF0ZSBvbiBXaW5kb3dzLCBhcyB1c2VycyBlaXRoZXIgaGF2 ZSB0byAoMSkgbm90IHVzZSBhIHBhY2thZ2UgbWFuYWdlciBvciAoMikgdXNlIGEgZm9yayBvZiBv cGFtIGFuZCB0aGUNCjxjb2RlPm9wYW0tcmVwb3NpdG9yeTwvY29kZT4uIE1ha2luZyBvcGFtIGFu ZCB0aGUgPGNvZGU+b3BhbS1yZXBvc2l0b3J5PC9jb2RlPiBjb21wYXRpYmxlIHdpdGggV2luZG93 cyB3aWxsIG1ha2UgT0NhbWwgYSBiZXR0ZXIgY2hvaWNlIGZvciBXaW5kb3dzIHVzZXJzIGFuZCBo ZWxwIHVzIGdyb3cgdGhlIGNvbW11bml0eS4gTW9yZSBXaW5kb3dzIHVzZXJzIGFibGUgdG8gdXNl IG9wYW0gbGVhZHMgdG8gbW9yZSBjb250cmlidXRvcnMsIG1vcmUgdGVzdGluZywNCiBtb3JlIFdp bmRvd3MgZnJpZW5kbHkgcGFja2FnZXMsIGFuZCBtb3JlIHBhY2thZ2VzIGluIHRoZSBlbmQuIDwv cD4NCjxwPjxiPldoYXQ6PC9iPiBSZWxlYXNpbmcgb3BhbSAyLjIgd2l0aCBuYXRpdmUgc3VwcG9y dCBmb3IgV2luZG93cyBhbmQgbWFraW5nIHRoZSBvZmZpY2lhbA0KPGNvZGU+b3BhbS1yZXBvc2l0 b3J5PC9jb2RlPiB1c2FibGUgb24gV2luZG93cy4gPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+ IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Fc3NlbnRpYWxseSBmb2N1c2VkIG9uIDxj b2RlPnNldGVudjwvY29kZT4gJmFtcDsgPGNvZGU+YnVpbGQtZW52PC9jb2RlPiBlbnZpcm9ubWVu dCB2YXJpYWJsZXMgdXBkYXRlIGhhbmRsaW5nIG9uIFdpbmRvd3MgLQ0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NjM2Ij5vY2FtbC9vcGFtIzU2MzY8L2E+IDwv bGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcw Y2ZkYzcwIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMGNmZGM3MCI+PGI+W+KAizxj b2RlPm9kb2M8L2NvZGU+4oCLXTwvYj4gQWRkIFNlYXJjaCBDYXBhYmlsaXRpZXMgdG8gPGNvZGU+ DQpvZG9jPC9jb2RlPjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnMGNmZGM3MCI+DQo8cD4oPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9y bS1yb2FkbWFwI3cyNS1nZW5lcmF0ZS1kb2N1bWVudGF0aW9uIj5XMjU8L2E+KQ0KPC9wPg0KPHA+ PGI+Q29udHJpYnV0ZWQgYnk6PC9iPiBAcGFuZ2xlc2QgKFRhcmlkZXMpLCBARW1pbGVUcm90aWdu b24gKFRhcmlkZXMpLCBAanVsb3cgKFRhcmlkZXMpLCBAam9ubHVkbGFtIChUYXJpZGVzKQ0KPC9w Pg0KPHA+PGI+V2h5OjwvYj4gVGhlIGluLXBhY2thZ2Ugc2VhcmNoIGFkZGVkIGluIE9DYW1sLm9y Z+KAmXMgY2VudHJhbCBwYWNrYWdlIGRvY3VtZW50YXRpb24gaGFzIGJlZW4gdmVyeSB3ZWxsIHJl Y2VpdmVkIGJ5IHRoZSBjb21tdW5pdHkgYW5kIGltcHJvdmVzIGhvdyB1c2VycyBuYXZpZ2F0ZSBh bmQgZGlzY292ZXIgT0NhbWwgZG9jdW1lbnRhdGlvbi4gV2XigJlyZSB1cHN0cmVhbWluZyBpdCB0 bw0KPGNvZGU+b2RvYzwvY29kZT4gdG8gYnJpbmcgaXQgaW50byB0aGUgbG9jYWwgZG9jdW1lbnRh dGlvbiBhcyB3ZWxsIGFuZCBwcm92aWRlIG1vcmUgYWR2YW5jZWQgZmVhdHVyZXMsIGxpa2Ugc2Vh cmNoaW5nIGJ5IHR5cGUuDQo8L3A+DQo8cD48Yj5XaGF0OjwvYj4gV2XigJlyZSBhZGRpbmcgc3Vw cG9ydCBpbiA8Y29kZT5vZG9jPC9jb2RlPiBmb3IgcGx1Z2luZyBpbiBhIHNlYXJjaCBlbmdpbmUh DQo8Y29kZT5vZG9jPC9jb2RlPiBwcm92aWRlcyB0aGUgVUkgKGEgc2VhcmNoIGJhcikgYW5kIHdp bGwgZ2VuZXJhdGUgYSBzZWFyY2ggaW5kZXggKHRoYXQgY2FuIGFsc28gYmUgdXNlZCB0byBiZSBp bnRlZ3JhdGVkIGludG8gb3RoZXIgc2VhcmNoIGVuZ2luZSBsaWtlIEVsYXN0aWNzZWFyY2gpLiBX ZeKAmXJlIGFsc28gYnVpbGRpbmcgYSBkZWZhdWx0IGNsaWVudC1zaWRlIHNlYXJjaCBlbmdpbmUg YmFzZWQgb24gU2hlcmxvZG9jLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XZeKAmXZlIG1lcmdlZCB0aGUgUFIgYWRkaW5nIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvOTcyIj5uZXcgc2VhcmNoIGNh cGFiaWxpdGllczwvYT4hIDp0YWRhOiBUaGlzIHdpbGwgc2hpcCBpbiB0aGUgdXBjb21pbmcgdmVy c2lvbiBvZg0KPGNvZGU+b2RvYzwvY29kZT4gMi40LjAuIDwvbGk+PGxpPldlIGFyZSBjdXJyZW50 bHkgZXhwZXJpbWVudGluZyB3aXRoIGJ1aWxkaW5nIGFuIDxjb2RlPm9kb2M8L2NvZGU+IHNlYXJj aCBlbmdpbmUgYmFzZWQgb24NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcnQtdy9zaGVy bG9kb2MiPlNoZXJsb2RvYzwvYT4gLS08YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXJ0LXcv c2hlcmxvZG9jL3B1bGwvNCI+YXJ0LXcvc2hlcmxvZG9jIzQ8L2E+Lg0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzZkMWUzOWUiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc2ZDFlMzllIj48Yj5b4oCLPGNvZGU+b2RvYzwvY29k ZT7igItdPC9iPiBTeW50YXggZm9yIEltYWdlcyBhbmQgQXNzZXRzIGluIDxjb2RlPg0Kb2RvYzwv Y29kZT48L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzZkMWUz OWUiPg0KPHA+KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1h cCN3MjUtZ2VuZXJhdGUtZG9jdW1lbnRhdGlvbiI+VzI1PC9hPikNCjwvcD4NCjxwPjxiPkNvbnRy aWJ1dGVkIGJ5OjwvYj4gQHBhbmdsZXNkIChUYXJpZGVzKSwgQGpvbmx1ZGxhbSAoVGFyaWRlcyks IEBkYnVlbnpsaSwgQGdwZXRpb3QgKFRhcmlkZXMpDQo8L3A+DQo8cD48Yj5XaHk6PC9iPiBBbGxv dyBwYWNrYWdlIGF1dGhvcnMgdG8gd3JpdGUgcmljaCBkb2N1bWVudGF0aW9uLCBtYWtpbmcgaXQg bW9yZSB1c2VmdWwgYW5kIGltcHJvdmluZyBPQ2FtbCBkZXZlbG9wZXIgZXhwZXJpZW5jZSBieSBw cm92aWRpbmcgYW4gZWNvc3lzdGVtIG9mIGhpZ2gtcXVhbGl0eSBkb2N1bWVudGF0aW9uIGZvciBP Q2FtbCBwYWNrYWdlcy4NCjwvcD4NCjxwPjxiPldoYXQ6PC9iPiBXZeKAmXJlIGFkZGluZyBzdXBw b3J0IGZvciBhc3NldHMgYW5kIG5ldyBzeW50YXggdG8gZW1iZWQgbWVkaWFzIChpbWFnZXMsIGF1 ZGlvLCBhbmQgdmlkZW9zKS4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+V2XigJl2ZSBkZWNpZGVkIHRvIHJld29yayB0aGUgYXNzZXQg c3VwcG9ydCBkZXNpZ24gYSBsaXR0bGUgdG8gYnJpbmcgaXQgbW9yZSBpbiBsaW5lIHdpdGggaG93 IG90aGVyIGVsZW1lbnRzIGFyZSBoYW5kbGVkLCBzdWNoIGFzIG1vZHVsZXMsIHR5cGVzLCBhbmQg dmFsdWVzLiBUaGUgaW50ZW50IGlzIHRvIGVuc3VyZSB0aGUgY29kZSBpcyBzdHJhaWdodGZvcndh cmQgdG8gbWFpbnRhaW4gaW4gdGhlIGxvbmcgdGVybS4g4oCTDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMDIiPm9jYW1sL29kb2MjMTAwMjwvYT4gPC9saT48 bGk+V2UgY29udGludWVkIHJldmlld2luZyB0aGUgUFIsIGFkZGluZyBzeW50YWN0aWMgc3VwcG9y dCBmb3IgbWVkaWEuIFRoZXJlIHdlcmUgc29tZSBnb29kIGRpc2N1c3Npb25zIHJlbGF0aW5nIHRv IG1pc3NpbmcgYXNzZXRzLCBhbmQgaXTigJlzIHJlYWR5IHRvIGdvIGluIG9uY2UgdGhlIGFzc2V0 cyBQUiBpcyBtZXJnZWQuIOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29k b2MvcHVsbC8xMDA1Ij5vY2FtbC9vZG9jIzEwMDU8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlMjQ3YzczIiBjbGFzcz0ib3V0bGlu ZS00Ij4NCjxoNCBpZD0ib3JnZTI0N2M3MyI+PGI+W0R1bmVdPC9iPiBHZW5lcmF0ZSBEZXBlbmRl bmNpZXMgRG9jdW1lbnRhdGlvbiB3aXRoIER1bmU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2UyNDdjNzMiPg0KPHA+KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCN3MjUtZ2VuZXJhdGUtZG9jdW1lbnRhdGlvbiI+VzI1 PC9hPikNCjwvcD4NCjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQGpvbmx1ZGxhbSAoVGFyaWRl cykgPC9wPg0KPHA+PGI+V2h5OjwvYj4gTWFrZSBsb2NhbGx5LWdlbmVyYXRlZCBkb2N1bWVudGF0 aW9uIG1vcmUgdXNlZnVsIGJ5IGFsbG93aW5nIHVzZXJzIHRvIG5hdmlnYXRlIHRvIHRoZWlyIGRl cGVuZGVuY2llc+KAmSBkb2N1bWVudGF0aW9uIGZyb20gdGhlaXIgcGFja2FnZSBkb2NzLiBDdXJy ZW50bHkgdXNlcnMgY2FuIHVzZQ0KPGNvZGU+b2RpZzwvY29kZT4sIHdoaWNoIHByb3ZpZGVzIGEg c2ltaWxhciB3b3JrZmxvdy4gV2XigJlyZSBhZGRpbmcgc3VwcG9ydCBmb3IgdGhpcyBpbiBEdW5l IGRpcmVjdGx5Lg0KPC9wPg0KPHA+PGI+V2hhdDo8L2I+IFdl4oCZcmUgd3JpdGluZyBuZXcgRHVu ZSBydWxlcyBmb3IgPGNvZGU+b2RvYzwvY29kZT4gdGhhdCAoMSkgdXNlIHRoZSBuZXcNCjxjb2Rl Pm9kb2M8L2NvZGU+IENMSSB0byBlbmFibGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnQgYW5kIGNh Y2hpbmcgb3Bwb3J0dW5pdGllcyBhbmQgKDIpIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uIG9m IGV2ZXJ5IG9wYW0gcGFja2FnZXMgaW4geW91ciBzd2l0Y2gsIGFsbG93aW5nIHVzZXJzIHRvIG5h dmlnYXRlIHRvIHRoZWlyIGRlcGVuZGVuY2llc+KAmSBkb2N1bWVudGF0aW9uIGZyb20gdGhlaXIg bG9jYWwgZG9jcy4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+VGhlIG5ldyBEdW5lIHJ1bGVzIGhhdmUgYmVlbiByZXdvcmtlZCBhIGxp dHRsZSBmb2xsb3dpbmcgZmVlZGJhY2sgZnJvbSBAYWxpenRlciBhbmQgQHJncmluYmVyZywgaW1w cm92aW5nIHRoZSBmb2xsb3dpbmcgYXJlYXM6IGJldHRlciBzdXBwb3J0IGZvciBtdWx0aXBsZQ0K PGNvZGU+ZmluZGxpYjwvY29kZT4gZGlyZWN0b3JpZXM7IGJldHRlciBzdXBwb3J0IGZvciBzeXN0 ZW0gc3dpdGNoZXM7IGFuZCBhIG1vcmUgcm9idXN0IG1ldGhvZCBmb3IgdHJhbnNsYXRpbmcgZnJv bQ0KPGNvZGU+ZmluZGxpYjwvY29kZT4gcGF0aHMgdG8gbG9jYWwgcGF0aHMuIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg4MDMiPg0Kb2NhbWwvZHVuZSM4 ODAzPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnYWExMjQ5NCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2FhMTI0OTQi PjxiPltNZXJsaW5dPC9iPiBTdXBwb3J0IGZvciBQcm9qZWN0LVdpZGUgUmVmZXJlbmNlcyBpbiBN ZXJsaW48L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2FhMTI0 OTQiPg0KPHA+KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1h cCN3MTktbmF2aWdhdGUtY29kZSI+VzE5PC9hPikgPC9wPg0KPHA+PGI+Q29udHJpYnV0ZWQgYnk6 PC9iPiBAdm9vZG9vcyAoVGFyaWRlcyksIEB0cmVmaXMgKFRhcmlkZXMpLCBARWtkb2hpYnMgKE9D YW1sUHJvKSwgQGdhc2NoZSAoSU5SSUEpDQo8L3A+DQo8cD48Yj5XaHk6PC9iPiBQcm9qZWN0LXdp ZGUgcmVmZXJlbmNlIGFzIGFuIGVkaXRvciBmZWF0dXJlIGlzIGEgZ3JlYXQgd2F5IGZvciBkZXZl bG9wZXJzIHRvIG5hdmlnYXRlIHRoZWlyIGNvZGViYXNlIGFuZCB1bmRlcnN0YW5kIGl0IGJldHRl ci4gSXTigJlzIGFsc28gYSBmZWF0dXJlIHRoYXQgdXNlcnMgZXhwZWN0IHRvIGhhdmUgY29taW5n IGZyb20gb3RoZXIgZWNvc3lzdGVtcywgc28gaGF2aW5nIHN1cHBvcnQgZm9yIGl0IGluIE1lcmxp biBhbmQNCiBPQ2FtbCBMU1Agd2lsbCBib3RoIGltcHJvdmUgT0NhbWwgZWRpdG9yIGV4cGVyaWVu Y2UgYW5kIG1ha2UgaXQgb24gcGFyIHdpdGggb3RoZXIgbGFuZ3VhZ2VzLg0KPC9wPg0KPHA+PGI+ V2hhdDo8L2I+IFdl4oCZcmUgYWRkaW5nIGEgbmV3IDxjb2RlPm1lcmxpbiBzaW5nbGUgb2NjdXJy ZW5jZXM8L2NvZGU+IGNvbW1hbmQgYW5kIHN1cHBvcnQgZm9yIHRoZSBMU1ANCjxjb2RlPnRleHRE b2N1bWVudC9yZWZlcmVuY2VzPC9jb2RlPiByZXF1ZXN0LiBUbyBkbyB0aGF0LCB3ZeKAmXJlIGV4 dGVuZGluZyB0aGUgY29tcGlsZXLigJlzIFNoYXBlcyB0byBzdXBwb3J0IGdsb2JhbCBvY2N1cmVu Y2VzLCBidWlsZGluZyBhIHRvb2wgdGhhdCBnZW5lcmF0ZXMgYW4gaW5kZXggb2YgaWRlbnRpZmll cnMgaW4gYSBjb2RlYmFzZSBhbmQgYWRkaW5nIHN1cHBvcnQgZm9yIGl0IGluIER1bmUsIE1lcmxp biwgYW5kIE9DYW1sIExTUC4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+V2UgY29udGludWVkIHdvcmtpbmcgb24gdGhlIGNvbXBpbGVy IFBSIGZvciBwcm9qZWN0LXdpZGUgb2NjdXJyZW5jZXMsIG5vdGFibHkgYWRkaW5nIHN1cHBvcnQg Zm9yIGlubGluZSByZWNvcmRz4oCZIGxhYmVscy4gVGhlIFBSIGlzIG5vdyByZWFkeSBmb3IgdGhl IG5leHQgcm91bmQgb2YgcmV2aWV3cy4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvcHVsbC8xMjUwOCI+b2NhbWwvb2NhbWwjMTI1MDg8L2E+IDwvbGk+PGxpPkNv bmN1cnJlbnRseSwgd2UgY29udGludWVkIHdvcmtpbmcgb24gdGhlIHRvb2xzIGludm9sdmVkIGlu IHByb3ZpZGluZyBvY2N1cnJlbmNlcy4gV2UgYXJlIHN0aWxsIG9uIHRyYWNrIGZvciByZWxlYXNp bmcgYW4gZXhwZXJpbWVudGFsIDQuMTQtYmFzZWQgdmFyaWFudCBvZiB0aGUgY29tcGlsZXIgdG8g Z2F0aGVyIGZlZWRiYWNrIG9uIHRoZSBmZWF0dXJlIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSB5ZWFy LiBPdXIgY3VycmVudCBhaW0gaXMgdG8NCiBwcm92aWRlIG9mZmljaWFsIHByb2plY3Qtd2lkZSBv Y2N1cnJlbmNlcyBzdXBwb3J0IGluIE9DYW1sIDUuMi4g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS92b29kb29zL21lcmxpbi9wdWxsLzgiPg0Kdm9vZG9vcy9tZXJsaW4jODwvYT4sIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92b29kb29zL29jYW1sLWxzcC9wdWxsLzIiPnZvb2Rv b3Mvb2NhbWwtbHNwIzI8L2E+LA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Zvb2Rvb3Mv ZHVuZS9wdWxsLzIiPnZvb2Rvb3MvZHVuZSMyPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL3Zvb2Rvb3Mvb2NhbWwtaW5kZXgvcHVsbC81Ij4NCm9jYW1sLWluZGV4IzU8L2E+IDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjNWVh MGFiIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYzVlYTBhYiI+PGI+W01lcmxpbl08 L2I+IEltcHJvdmluZyBNZXJsaW7igJlzIFBlcmZvcm1hbmNlICg8YSBocmVmPSJodHRwczovL29j YW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJvYWRtYXAjdzE5LW5hdmlnYXRlLWNvZGUiPlcxOTwvYT4p PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjNWVhMGFiIj4N CjxwPjxiPkNvbnRyaWJ1dGVkIGJ5OjwvYj4gQHBpdGFnIChUYXJpZGVzKSwgQEVuZ2lsIChUYXJp ZGVzKSwgQDNSYWZhbCAoVGFyaWRlcykgPC9wPg0KPHA+PGI+V2h5OjwvYj4gU29tZSBNZXJsaW4g cXVlcmllcyBoYXZlIGJlZW4gc2hvd24gdG8gc2NhbGUgcG9vcmx5IGluIGxhcmdlIGNvZGViYXNl cywgbWFraW5nIHRoZSBlZGl0b3IgZXhwZXJpZW5jZSBzdWJwYXIsIHdpdGggdXNlcnMgcmVwb3J0 aW5nIHRoYXQgdGhleSBzb21ldGltZSBtdXN0IHdhaXQgZm9yIGEgZmV3IHNlY29uZHMgdG8gZ2V0 IHRoZSBhbnN3ZXIgZm9yIE1lcmxpbi4gVGhpcyBpcyBvYnZpb3VzbHkgYSBtYWpvciBpc3N1ZSB0 aGF0DQogaHVydHMgZGV2ZWxvcGVyIGV4cGVyaWVuY2UsIHNvIHdl4oCZcmUgd29ya2luZyBvbiBp bXByb3ZpbmcgTWVybGluIHBlcmZvcm1hbmNlIHdoZW4gaXQgZmFsbHMgc2hvcnQuDQo8L3A+DQo8 cD48Yj5XaGF0OjwvYj4gV2XigJlyZSBidWlsZGluZyBiZW5jaG1hcmtpbmcgYW5kIGZ1enp5LXRl c3RpbmcgQ0lzIHRvIGNvbnRpbnVvdXNseSBiZW5jaG1hcmsgYW5kIHRlc3QgTWVybGluLiBXZeKA mXJlIGFkZHJlc3NpbmcgdGhlIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2tzIGlkZW50aWZpZWQgZnJv bSBwcm9maWxpbmcgTWVybGluIGFuZCBhbmFseXNpbmcgYmVuY2htYXJraW5nIHJlc3VsdHMuDQo8 L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp Pldl4oCZdmUgY29udGludWVkIG91ciB3b3JrIG9uIGEgZnV6enktdGVzdGluZyBDSSBmb3IgTWVy bGluLiBPdXIgZmlyc3QgYXBwcm9hY2ggd2FzIHRvIHBlcnNpc3QgdGhlIHRlc3RpbmcgZGF0YSBp biBzeW5jIHdpdGggdGhlIE1lcmxpbiBjb21taXQgaGlzdG9yeS4gSG93ZXZlciwgdGhhdCBpbXBs aWVkIGRlYWxpbmcgd2l0aCBhbGwga2luZHMgb2YgZGF0YSByYWNlcyB3aGVuIGNvbXBhcmluZyB0 aGUgZGF0YSBiZXR3ZWVuIGEgUFIgYW5kIGl0cw0KIGJhc2UgYnJhbmNoLCB3aGVuIGdlbmVyYXRp bmcgYW5kIHBlcnNpc3RpbmcgbmV3IGRhdGEsIGFuZCB3aGVuIGFwcHJvdmluZyBjaGFuZ2VzLiBU byBhdm9pZCB0aGF0LCBpbiBPY3RvYmVyIHdlIGV4cGVyaW1lbnRlZCB3aXRoIGEgc2ltcGxlciBh cHByb2FjaCB0aGF0IHJlZ2VuZXJhdGVzIHRoZSBkYXRhIGZvciBldmVyeSBDSSBydW4gLSB3aXRo b3V0IGNvbXByb21pc2luZyBvbiBDSSBydW4gdGltZS4gVGhlIG5ldyBhcHByb2FjaCBzZWVtcyBw cm9taXNpbmcuDQo8L2xpPjxsaT5XZeKAmXZlIGFsc28gY29tZSBiYWNrIHRvIHdvcmsgb24gTWVy bGluIHBlcmZvcm1hbmNlIGltcHJvdmVtZW50cy4gV2UgcGxhbiB0byA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL2lzc3Vlcy8xNjM2Ij4NCm9wdGltaXNlIE1lcmxpbuKA mXMgc3BhY2UtdGltZSB0cmFkZS1vZmY8L2E+IGJ5IGV4cGVyaW1lbnRpbmcgKG9uIGFuIG9wdC1p biBiYXNpcykgd2l0aCBkaWZmZXJlbnQgbGlmZXRpbWVzIGZvciB0aGUNCjxjb2RlPmNtaS1jYWNo ZTwvY29kZT4gYW5kIDxjb2RlPmNtdC1jYWNoZTwvY29kZT4uIEZvciB0aGF0LCB3ZeKAmXJlIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vaXNzdWVzLzE2ODAiPg0KYWRk aW5nIGluZm9ybWF0aW9uIGFib3V0IE1lcmxpbuKAmXMgbWVtb3J5IHVzYWdlIHRvIGl0cyB0ZWxl bWV0cnk8L2E+LiBGdXJ0aGVybW9yZSwgd2XigJl2ZSBsb29rZWQgaW50byByZWZpbmluZyB0aGUg dHlwZXIgY2FjaGUgZ3JhbnVsYXJpdHkgYW5kDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvbWVybGluL2lzc3Vlcy8xNjM3I2lzc3VlY29tbWVudC0xNzgxMjMyMzc5Ij5oYXZlIGFu YWx5c2VkIGl0cyBjaGFsbGVuZ2VzPC9hPi4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjYiPkFkdmVudCBvZiBDb2RlIHByb2plY3QgdGVtcGxhdGU8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1hZHZlbnQtb2YtY29kZS1wcm9q ZWN0LXRlbXBsYXRlLzEzNTM5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1h ZHZlbnQtb2YtY29kZS1wcm9qZWN0LXRlbXBsYXRlLzEzNTM5LzE8L2E+IDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2E1YTE0NSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzdhNWExNDUiPlRyZW50IFNtYWxsIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2E1YTE0NSI+DQo8cD5IZXkgZXZlcnlv bmUhIDwvcD4NCjxwPkkgcmVjZW50bHkgcHVibGlzaGVkIGEgc3RhcnRlciBwcm9qZWN0IGZvciB3 b3JraW5nIG9uIEFkdmVudCBvZiBDb2RlIHB1enpsZXMgaW4gT0NhbWw6DQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vU2l4c3RyaW5nOTgyL3RhbmVuYmF1bSI+aHR0cHM6Ly9naXRodWIuY29t L1NpeHN0cmluZzk4Mi90YW5lbmJhdW08L2E+DQo8L3A+DQo8cD5JdCB3b3JrcyBmb3IgYWxsIOKA nHllYXJz4oCdIChhbmQgc2hvdWxkIHdvcmsgZm9yIDIwMjMsIGFzc3VtaW5nIG5vIEFQSSBjaGFu Z2VzIHdpbGwgYmUgbWFkZSB0b25pZ2h0KSwgYW5kIGhhcyBzb21lIG90aGVyIG5pY2UgZmVhdHVy ZXM6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QXV0b21hdGljIGRvd25sb2FkaW5n ICYjNDM7IGNhY2hpbmcgb2YgcHV6emxlIGlucHV0cyA8L2xpPjxsaT5DTEkgZm9yIHJ1bm5pbmcg cHV6emxlcyAmIzQzOyBzdWJtaXR0aW5nIGFuc3dlcnMgdG8gPGNvZGU+YWR2ZW50b2Zjb2RlLmNv bTwvY29kZT4NCjwvbGk+PGxpPkF1dG9tYXRpYyBwdXp6bGUgZGV0ZWN0aW9uICYjNDM7IHJlZ2lz dHJhdGlvbiA8L2xpPjwvdWw+DQo8cD5Ib3BlIHNvbWUgZm9sa3MgZmluZCB0aGlzIHVzZWZ1bCDi gJMgSeKAmXZlIGJlZW4gdXNpbmcgaXQgYSBsb3QgbXlzZWxmISA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iNyI+b3BhbS1oZWFsdGgtY2hlY2stbmcgMC4xLjA6IGNoZWNrIHRoZSBoZWFs dGggb2YgYW4gb3BhbSByZXBvc2l0b3J5IG9uIHlvdXIgaG9tZSBtYWNoaW5lPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS1oZWFsdGgtY2hlY2stbmctMC0x LTAtY2hlY2stdGhlLWhlYWx0aC1vZi1hbi1vcGFtLXJlcG9zaXRvcnktb24teW91ci1ob21lLW1h Y2hpbmUvMTM1NDYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0taGVh bHRoLWNoZWNrLW5nLTAtMS0wLWNoZWNrLXRoZS1oZWFsdGgtb2YtYW4tb3BhbS1yZXBvc2l0b3J5 LW9uLXlvdXItaG9tZS1tYWNoaW5lLzEzNTQ2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzFjOGNhMjkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmcxYzhjYTI5Ij5LYXRlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnMWM4Y2EyOSI+DQo8cD5IaSBldmVyeW9uZSwgPC9wPg0KPHA+SeKA mW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0taGVhbHRoLWNoZWNrLW5nIj4NCm9wYW0taGVh bHRoLWNoZWNrLW5nPC9hPiB0aGF0IEnigJl2ZSBiZWVuIGRldmVsb3BpbmcgdGhlIHBhc3QgMiBt b250aHMuIDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZS9v cGFtLWhlYWx0aC1jaGVjay1uZyI+b3BhbS1oZWFsdGgtY2hlY2stbmc8L2E+IGlzIGEgZm9yayBv Zg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L29wYW0taGVhbHRoLWNoZWNr Ij5vcGFtLWhlYWx0aC1jaGVjazwvYT4gKGF2YWlsYWJsZSBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9j aGVjay5jaS5vY2FtbC5vcmcvIj5jaGVjay5jaS5vY2FtbC5vcmc8L2E+KSBvZiB3aGljaCBJ4oCZ bSBhbHNvIHRoZSBhdXRob3Igb2YgYW5kIHdhcyBpdHMgbWFpbiB1c2VyIGZvciB0aGUgcGFzdCA2 IHllYXJzLiBJdCBmdW5kYW1lbnRhbGx5IGRpZmZlcnMgZnJvbSBpdHMgcGFyZW50IG1haW5seSBi eSB0YXJnZXRpbmcgc21hbGwgaG9tZSBzZXJ2ZXJzIHVzaW5nOg0KPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPmFuIG9mZi10aGUtc2hlbGYgRG9ja2VyIGluc3RhbGxhdGlvbiA8L2xpPjxs aT50aWdodGx5IGNvbnRyb2xsZWQgbmV0d29yayBhY2Nlc3MgKGUuZy4geW91IGRvbuKAmXQgd2Fu dCB0byBoYXZlIHlvdXIgaG9tZSBpbnRlcm5ldCBzdG9wIHRvIGEgY3Jhd2wgYXQgYW4gdW5leHBl Y3RlZCB0aW1lIHdoaWxlIHlvdeKAmXJlIHdhdGNoaW5nIGEgdmlkZW8pDQo8L2xpPjxsaT5hIHRp Z2h0bHkgY29udHJvbGxlZCBsb2FkIG1ha2luZyBpdCBlYXNpZXIgdG8gYmVuY2htYXJrIHdob2xl IHJ1bnMgYW5kIGhhdmUgc3RhYmxlIHRlbXBlcmF0dXJlLCB3aGljaCBhbHNvIG1ha2VzIHN1cmUg eW91ciBoYXJkd2FyZSBsYXN0cyBhcyBsb25nIGFzIHBvc3NpYmxlDQo8L2xpPjwvdWw+DQo8cD5N eSBtYWluIGdvYWwgd2FzIGZvciBpdCB0byBiZSBlYXNpZXIgdG8gbWFpbnRhaW4gYW5kIGRlcGxv eSB3aGVuIEnigJltIHdvcmtpbmcgZm9yIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1zZi5v cmcvIj5PQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiBvbiBtYWtpbmcgc3VyZSB0aGUgT0Nh bWwgU29mdHdhcmUgRWNvc3lzdGVtIChha2EuIHBhY2thZ2VzIGluDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5LyI+b3BhbS1yZXBvc2l0b3J5PC9hPikg aXMgcmVhZHkgYmVmb3JlIGVhY2ggcmVsZWFzZSBvZiB0aGUgT0NhbWwgY29tcGlsZXIsIGFzIHdl bGwgYXMgbWFraW5nIHN1cmUgdGhlIGNvbXBpbGVyIGl0c2VsZiBkb2VzbuKAmXQgaGF2ZSBhbnkg cHJvYmxlbS4NCjwvcD4NCjxwPkluY2lkZW50YWxseSwgaGF2aW5nIGEgc2VydmVyIGF0IGhvbWUs IGVzcGVjaWFsbHkgaW4gY29sZGVyIGNvdW50cmllcyBsaWtlIFNjb3RsYW5kLCBtYWtlcyBpdCBz byB0aGF0IHlvdeKAmXJlIG5vdCB3YXN0aW5nIGFueSBlbmVyZ3kgdHJ5aW5nIHRvIGdldCByaWQg b2YgaGVhdCBmcm9tIGEgc2VydmVyIHJvb20uIEluc3RlYWQgaXQgbm93IHNlcnZlcyBhcyB5b3Vy IG93biBwZXJzb25hbCBlbGVjdHJpYyBzcGFjZSBoZWF0ZXIgdGhhdCB5b3UgY2FuDQogY2Fycnkg dG8gcm9vbXMgdGhhdCBuZWVkIGl0LCBtYWtpbmcgdGhlIHdob2xlIHByb2Nlc3MgYSBsaXR0bGUg Yml0IGdyZWVuZXIgb3ZlcmFsbC4NCjwvcD4NCjxwPklmIHlvdeKAmXJlIGluIHRoZSB1bmxpa2Vs eSBjYXNlLCB3aGVyZSwgbGlrZSBtZSB5b3UgbmVlZCB0byB0ZXN0IGFuIGVudGlyZSBvcGFtIHJl cG9zaXRvcnkgb24gYSBkYWlseSBiYXNpcywgeW914oCZcmUgd2VsY29tZSB0byBpbnN0YWxsIG9w YW0taGVhbHRoLWNoZWNrLW5nIDAuMS4wIHVzaW5nOg0KPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBs ZSIgaWQ9Im9yZzI1ODVkYTIiPg0Kb3BhbSBwaW4gYWRkIGdpdCYjNDM7aHR0cHM6Ly9naXRodWIu Y29tL2tpdC10eS1rYXRlL29wYW0taGVhbHRoLWNoZWNrLW5nI3YwLjEuMA0KPC9wcmU+DQo8cD5Z b3UgY2FuIHJlYWQgb24gdGhlIHByZXJlcXVpc2l0ZXMgYW5kIHVzYWdlIGluIHRoZSBhc3NvY2lh dGVkIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9raXQtdHkta2F0ZS9vcGFtLWhlYWx0aC1j aGVjay1uZy9ibG9iL3YwLjEuMC9SRUFETUUubWQiPg0KUkVBRE1FPC9hPi4gPC9wPg0KPHA+PGk+ RGlzY2xhaW1lcjogSeKAmW0gbm90IGNsYWltaW5nIHRoaXMgcmVsZWFzZSB0byBiZSBzdGFibGUg b3Igc2VjdXJlLCBpZiB5b3UgZG8gdXNlIGl0LCB1c2UgaXQgYXQgeW91ciBvd24gcmlzay4gSWYg eW91IGhhdmUgYW55IHF1ZXN0aW9ucywgZmVlbCBmcmVlIHRvIGFzayBoZXJlIG9yIG9uIHRoZSBi dWd0cmFja2VyLjwvaT4NCjwvcD4NCjxwPknigJlkIGxpa2UgdG8gdGhhbmsgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwtc2Yub3JnLyI+T0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gZm9y IGZvdW5kaW5nIG15IHdvcmsgYW5kIHRoaXMgcmVsZWFzZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI4Ij5GaXJzdCByZWxlYXNlIGNhbmRpZGF0ZSBvZiBPQ2FtbCA1LjEuMTwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtcmVsZWFzZS1jYW5kaWRh dGUtb2Ytb2NhbWwtNS0xLTEvMTM1NDgvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv Zmlyc3QtcmVsZWFzZS1jYW5kaWRhdGUtb2Ytb2NhbWwtNS0xLTEvMTM1NDgvMTwvYT4gPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlNjRiMDVjIiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnZTY0YjA1YyI+b2N0YWNocm9uIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTY0YjA1YyI+DQo8cD5Ud28g bW9udGhzIChhbmQgaGFsZikgYWZ0ZXIgdGhlIHJlbGVhc2Ugb2YgT0NhbWwgNS4xLjAsIHdlIGhh dmUgZGlzY292ZXJlZCB0aHJlZSBzaWduaWZpY2FudCByZWdyZXNzaW9ucyBpbiBPQ2FtbCA1LjEu MCwgYWZmZWN0aW5nIHRoZSBwYWNrYWdpbmcgb2YgZXhlY3V0YWJsZXMsIHRoZSB0eXBlY2hlY2tp bmcgb2YgT0NhbWwgcHJvZ3JhbXMsIGFuZCB0aGUgcGVyZm9ybWFuY2Ugb2YgbnVtZXJpY2FsIGNv ZGVzLg0KPC9wPg0KPHA+U2luY2UgdGhvc2UgcmVncmVzc2lvbnMgYWZmZWN0IG1hbnkgdXNlcnMg YW5kIGNvdWxkIGhhdmUgbGFzdGluZyBlZmZlY3RzLCB3ZSBoYXZlIGRlY2lkZWQgdG8gY3V0IGEg cGF0Y2ggcmVsZWFzZSBvZiBPQ2FtbCA1LjEgd2l0aCBmaXhlcyBmb3IgdGhvc2UgaXNzdWVzIG5l eHQgd2Vlay4NCjwvcD4NCjxwPlRvIGdpdmUgdGltZSBmb3Igb3BhbSBwYWNrYWdlcyB0byB0ZXN0 IHRoaXMgcGF0Y2ggdmVyc2lvbiwgd2UgaGF2ZSBqdXN0IHB1Ymxpc2hlZCBhIGZpcnN0IHJlbGVh c2UgY2FuZGlkYXRlIGZvciBPQ2FtbCA1LjEuMSAuIFRoZSBmdWxsIGxpc3Qgb2YgY2hhbmdlcyBp biB0aGlzIHJlbGVhc2UgY2FuZGlkYXRlIGlzIGF2YWlsYWJsZSBiZWxvdy4NCjwvcD4NCjxwPkFz IGEgbWFqb3IgZXhjZXB0aW9uIHRvIG91ciBwb2xpY3kgZm9yIHBhdGNoIHJlbGVhc2VzLCBPQ2Ft bCA1LjEuMSB3aWxsIGNvbnRhaW4gb25lIGJyZWFraW5nIGNoYW5nZSBpbiB0aGUgc3RhbmRhcmQg bGlicmFyeTogdGhlDQo8Y29kZT5Db21wcmVzc2lvbjwvY29kZT4gZmxhZyBoYXMgYmVlbiByZW1v dmVkIGZyb20gdGhlIDxjb2RlPk1hcnNoYWw8L2NvZGU+IG1vZHVsZS4gVGhpcyBkcmFzdGljIG1l YXN1cmUgd2FzIHRha2VuIGJlY2F1c2Ugc3VwcG9ydGluZyB6c3RkIGNvbXByZXNzaW9uIGluIHRo ZSBzdGFuZGFyZCBsaWJyYXJ5IG1hZGUgenN0ZCBhIGRlcGVuZGVuY3kgb2YgYWxsIE9DYW1sIGV4 ZWN1dGFibGVzLiBTaW5jZSB0aGUgY29tcGlsZXIgc2hvdWxkIG5vdCBpbXBvc2UNCiBpdHMgZGVw ZW5kZW5jeSBvbiBlbmQtdXNlcnMsIHRoZSBzdXBwb3J0IGZvciBjb21wcmVzc2VkIG1hcnNoYWxp bmcgaGFzIGJlZW4gbW92ZWQgdG8gYSBjb21waWxlciBpbnRlcm5hbCBsaWJyYXJ5IGluIDUuMS4x LiBUaGlzIGludGVybmFsbHkgbGlicmFyeSBtaWdodCBiZSByZWxlYXNlZCBhcyBhbiBpbmRlcGVu ZGVudCBsaWJyYXJ5IGluIGxhdGVyIHJlbGVhc2VzIG9mIE9DYW1sIGJ1dCBub3QgaW4gT0NhbWwg NS4xLjEgdG8gZ2l2ZSB1cyB0aW1lDQogdG8gcG9saXNoIHRoZSBsaWJyYXJ5IGludGVncmF0aW9u IGFuZCBwYWNrYWdpbmcuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnYTlkYWEwZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2E5ZGFhMGUiPkluc3Rh bGxhdGlvbiBJbnN0cnVjdGlvbnM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlk PSJ0ZXh0LW9yZ2E5ZGFhMGUiPg0KPHA+VGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxl ZCBhcyBhbiBvcGFtIHN3aXRjaCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAy LjEgYW5kIGxhdGVyOg0KPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzJhNTBmZWYi Pg0KICAgIG9wYW0gdXBkYXRlDQogICAgb3BhbSBzd2l0Y2ggY3JlYXRlIDUuMS4xfnJjMQ0KPC9w cmU+DQo8cD5UaGUgc291cmNlIGNvZGUgZm9yIHRoZSByZWxlYXNlIGNhbmRpZGF0ZSBpcyBhbHNv IGRpcmVjdGx5IGF2YWlsYWJsZSBvbjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkdp dEh1YjogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS4x LjEtcmMxLnRhci5neiI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS4x LjEtcmMxLnRhci5nejwvYT4NCjwvbGk+PGxpPk9DYW1sIGFyY2hpdmVzIGF0IElucmlhOiA8YSBo cmVmPSJodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNS4xL29jYW1sLTUu MS4xfnJjMS50YXIuZ3oiPg0KaHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1s LTUuMS9vY2FtbC01LjEuMX5yYzEudGFyLmd6PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnODc0Zjk1ZCI+PC9hPkZpbmUtVHVuZWQgQ29t cGlsZXIgQ29uZmlndXJhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmc4NzRmOTVkIj4NCjxwPklmIHlvdSB3YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1cmF0 aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBzd2l0Y2ggdG8gdGhlIG9wdGlvbiB2YXJpYW50 IHdpdGg6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNGY5NGFkZiI+DQogICAg b3BhbSB1cGRhdGUNCiAgICBvcGFtIHN3aXRjaCBjcmVhdGUgJmx0O3N3aXRjaF9uYW1lJmd0OyBv Y2FtbC12YXJpYW50cy41LjEuMX5yYzEmIzQzO29wdGlvbnMgJmx0O29wdGlvbl9saXN0Jmd0Ow0K PC9wcmU+DQo8cD53aGVyZSA8Y29kZT5vcHRpb25fbGlzdDwvY29kZT4gaXMgYSBzcGFjZS1zZXBh cmF0ZWQgbGlzdCBvZiA8Y29kZT5vY2FtbC1vcHRpb24tKjwvY29kZT4gcGFja2FnZXMuIEZvciBp bnN0YW5jZSwgZm9yIGENCjxjb2RlPmZsYW1iZGE8L2NvZGU+IGFuZCA8Y29kZT5uby1mbGF0LWZs b2F0LWFycmF5PC9jb2RlPiBzd2l0Y2g6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJv cmdlMmQ2ZjBkIj4NCiAgICBvcGFtIHN3aXRjaCBjcmVhdGUgNS4xLjF+cmMxJiM0MztmbGFtYmRh JiM0MztuZmZhIG9jYW1sLXZhcmlhbnRzLjUuMS4xfnJjMSYjNDM7b3B0aW9ucyBvY2FtbC1vcHRp b24tZmxhbWJkYSBvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KPC9wcmU+DQo8cD5B bGwgYXZhaWxhYmxlIG9wdGlvbnMgY2FuIGJlIGxpc3RlZCB3aXRoIDxjb2RlPm9wYW0gc2VhcmNo IG9jYW1sLW9wdGlvbjwvY29kZT4uDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODc0YTM4YyIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzg3NGEzOGMiPkNoYW5nZXMgaW4gT0NhbWwgNS4xLjE8L2g0Pg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzg3NGEzOGMiPjwvZGl2Pg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmdmMjIwYmY2Ij48L2E+U3RhbmRhcmQgTGlicmFy eSBEZXBlbmRlbmN5IEZpeDo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRl eHQtb3JnZjIyMGJmNiI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+KDxiPmJyZWFraW5nIGNo YW5nZTwvYj4pIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTI1NjIiPg0KIzEyNTYyPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy8xMjczNCI+IzEyNzM0PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjc4MyI+DQojMTI3ODM8L2E+OiBSZW1vdmUgdGhlIDxjb2Rl Pk1hcnNoYWwuQ29tcHJlc3Npb248L2NvZGU+IGZsYWcgdG8gdGhlIDxjb2RlPk1hcnNoYWwudG9f KjwvY29kZT4gZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gNS4xIGJ5DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMDA2Ij4jMTIwMDY8L2E+LCBhcyBpdCBj YW5ub3QgYmUgaW1wbGVtZW50ZWQgd2l0aG91dCByaXNraW5nIHRvIGxpbmsgLWx6c3RkIHdpdGgg YWxsIG9jYW1sb3B0LWdlbmVyYXRlZCBleGVjdXRhYmxlcy4gVGhlIGNvbXBpbGVycyBhcmUgc3Rp bGwgYWJsZSB0byB1c2UgWlNURCBjb21wcmVzc2lvbiBmb3IgY29tcGlsYXRpb24gYXJ0ZWZhY3Rz LiAoWGF2aWVyIExlcm95DQogYW5kIERhdmlkIEFsbHNvcHAsIHJlcG9ydCBieSBLYXRlIERlcGxh aXgsIHJldmlldyBieSBOaWNvbMOhcyBPamVkYSBCw6RyLCBLYXRlIERlcGxhaXgsIGFuZCBEYW1p ZW4gRG9saWdleikuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc3NjM5 MjIwIj48L2E+VHlwZSBTeXN0ZW0gQnVnIEZpeDo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNSIgaWQ9InRleHQtb3JnNzYzOTIyMCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjYyMyI+IzEyNjIz PC9hPiwgZml4IHRoZSBjb21wdXRhdGlvbiBvZiB2YXJpYW5jZSBjb21wb3NpdGlvbiAoRmxvcmlh biBBbmdlbGV0dGksIHJlcG9ydCBieSBWZXNhIEthcnZvbmVuLCByZXZpZXcgYnkgR2FicmllbCBT Y2hlcmVyKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNmU3MjZhOSI+ PC9hPkdDIFBlcmZvcm1hbmNlIFJlZ3Jlc3Npb24gRml4ZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNmU3MjZhOSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjU5MCI+ IzEyNTkwPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMjU5NSI+DQojMTI1OTU8L2E+OiBNb3ZlIDxjb2RlPmNhbWxfY29sbGVjdF9nY19zdGF0c19z YW1wbGU8L2NvZGU+IGluIDxjb2RlPmNhbWxfZW1wdHlfbWlub3JfaGVhcF9wcm9tb3RlPC9jb2Rl PiBiZWZvcmUgYmFycmllciBhcnJpdmFsLiAoQi4gU3ppbHZhc3ksIHJldmlldyBieSBHYWJyaWVs IFNjaGVyZXIpDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyMzE4Ij4jMTIzMTg8L2E+OiBHQzogc2ltcGxpZnkgdGhlIG1lYW5pbmcgb2Yg Y3VzdG9tX21pbm9yX21heF9zaXplOiBibG9ja3Mgd2l0aCBvdXQtb2YtaGVhcCBtZW1vcnkgYWJv dmUgdGhpcyBsaW1pdCBhcmUgbm93IGFsbG9jYXRlZCBkaXJlY3RseSBpbiB0aGUgbWFqb3IgaGVh cC4gKERhbWllbiBEb2xpZ2V6LCByZXBvcnQgYnkgU3RlcGhlbiBEb2xhbiwNCiByZXZpZXcgYnkg R2FicmllbCBTY2hlcmVyKSA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzEyNDM5Ij4jMTI0Mzk8L2E+OiBGaW5hbGl6ZSBhbmQgY29sbGVjdCBk ZWFkIGN1c3RvbSBibG9ja3MgZHVyaW5nIG1pbm9yIGNvbGxlY3Rpb24gKERhbWllbiBEb2xpZ2V6 LCByZXZpZXcgYnkgWGF2aWVyIExlcm95LCBHYWJyaWVsIFNjaGVyZXIgYW5kIEtDIFNpdmFyYW1h a3Jpc2huYW4pDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyNDkxIj4jMTI0OTE8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEyNDkzIj4NCiMxMjQ5MzwvYT4sIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI1MDAiPiMxMjUwMDwvYT4sIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI3NTQiPg0KIzEyNzU0PC9h PjogRG8gbm90IGNoYW5nZSBHQyBwYWNlIHdoZW4gY3JlYXRpbmcgc3ViLWFycmF5cyBvZiBiaWdh cnJheXMgKFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IElkbyBZYXJpdiwgYW5hbHlzaXMgYnkgR2Fi cmllbCBTY2hlcmVyKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNGMz MWY0NSI+PC9hPk1pc2NlbGxhbmVvdXMgQnVnIEZpeGVzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzRjMzFmNDUiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI1ODEiPiMx MjU4MTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMv MTI2MDkiPg0KIzEyNjA5PC9hPjogRml4IGVycm9yIG9uIHVzZXMgb2YgcGFja2VkIG1vZHVsZXMg b3V0c2lkZSB0aGVpciBwYWNrIHRvIGNvcnJlY3RseSBoYW5kbGUgbmVzdGVkIHBhY2tzIChWaW5j ZW50IExhdmlyb24sIHJlcG9ydCBieSBKYXZpZXIgQ2jDoXZhcnJpLCByZXZpZXcgYnkgUGllcnJl IENoYW1iYXJ0KQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy8xMjc1NyI+IzEyNzU3PC9hPjogRml4IG9jYW1sbmF0IChuYXRpdmUgdG9wbGV2 ZWwpIGJ5IHJlZ2lzdGVyaW5nIGZyYW1ldGFibGVzIGNvcnJlY3RseSAoU3RlcGhlbiBEb2xhbiwg TmljayBCYXJuZXMgYW5kIE1hcmsgU2hpbndlbGwsIHJldmlldyBieSBWaW5jZW50IExhdmlyb24g YW5kIFPDqWJhc3RpZW4gSGluZGVyZXIpDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNjQ1Ij4jMTI2NDU8L2E+LCA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNjQ5Ij4NCiMxMjY0OTwvYT4gZml4 IGVycm9yIG1lc3NhZ2VzIGZvciBjeWNsaWMgdHlwZSBkZWZpbml0aW9ucyBpbiBwcmVzZW5jZSBv ZiB0aGUgPGNvZGU+DQotc2hvcnQtcGF0aHM8L2NvZGU+IGZsYWcuIChGbG9yaWFuIEFuZ2VsZXR0 aSwgcmVwb3J0IGJ5IFZlc2EgS2Fydm9uZW4sIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQo8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI5 Ij5Db21wb3NpdGlvbmFsIEF1dG9tYXRlZCBWZXJpZmljYXRpb24gZm9yIE9DYW1sPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wb3N0ZG9jLWNvbXBvc2l0aW9uYWwtYXV0 b21hdGVkLXZlcmlmaWNhdGlvbi1mb3Itb2NhbWwvMTM1NTAvMSI+DQpodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvcG9zdGRvYy1jb21wb3NpdGlvbmFsLWF1dG9tYXRlZC12ZXJpZmljYXRpb24t Zm9yLW9jYW1sLzEzNTUwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzkzNGUyOGMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5MzRlMjhj Ij5HYWJyaWVsIFJhZGFubmUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc5MzRlMjhjIj4NCjxwPlRoaXMgaXMgYW4gYW5ub3VuY2VtZW50IGZv ciBhIHBvc3Rkb2N0b3JhbCBwb3NpdGlvbiBpbiB0aGUgQ0FWT0MgcHJvamVjdCAoQ29tcG9zaXRp b25hbCBBdXRvbWF0ZWQgVmVyaWZpY2F0aW9uIGZvciBPQ2FtbCBDb2RlKS4gVGhlIHBvc3QtZG9j IHdpbGwgdGFrZSBwbGFjZSBpbiBOYW50ZXMsIEZyYW5jZS4gSXQgd2lsbCBiZSBjby1zdXBlcnZp c2VkIGJ5IEd1aWxoZW0gSmFiZXIgKE5hbnRlcyBVbml2ZXJzaXTDqSBhbmQgSW5yaWEgR2FsbGlu ZXR0ZQ0KIHRlYW0pIGFuZCBHYWJyaWVsIFJhZGFubmUgKElucmlhIENBU0ggdGVhbSkuIEl0IGFp bXMgdG8gYnJpbmcgdG9nZXRoZXIgYXBwcm9hY2hlcyBmcm9tIGFic3RyYWN0IGludGVycHJldGF0 aW9uLCBtb2RlbCBjaGVja2luZywgYW5kIGdhbWUgc2VtYW50aWNzIHRvIHN0YXRpY2FsbHkgYW5h bHl6ZSBPQ2FtbCBjb2RlLg0KPC9wPg0KPHA+VGhlIHN1Y2Nlc3NmdWwgY2FuZGlkYXRlIHdpbGwg YmUgZW1wbG95ZWQgYnkgSW5yaWEgYW5kIHdvcmsgaW4gdGhlIEdhbGxpbmV0dGUgdGVhbSAoPGEg aHJlZj0iaHR0cHM6Ly9nYWxsaW5ldHRlLmlucmlhLmZyIj5odHRwczovL2dhbGxpbmV0dGUuaW5y aWEuZnI8L2E+KSwgYXQgTmFudGVzIFVuaXZlcnNpdHkuIFRoZSBwb3NpdGlvbiBpcyBmb3Igb25l IHllYXIsIGFuZCBzaG91bGQgc3RhcnQgaW4gdGhlIGZpcnN0IHNlbWVzdGVyIG9mIDIwMjQNCiAo dG8gYmUgbmVnb2NpYXRlZCkuIFRoZSBzYWxhcnkgd2lsbCBkZXBlbmQgb24gdGhlIHN1Y2Nlc3Nm dWwgY2FuZGlkYXRl4oCZcyBwcmlvciByZXNlYXJjaCBleHBlcmllbmNlIHdpdGggYSBndWFyYW50 ZWVkIG1pbmltdW0gb2YgfjIyMDDigqwvbW9udGggYWZ0ZXIgdGF4ZXMuIFRoZSB3b3JraW5nIGxh bmd1YWdlIGNhbiBlaXRoZXIgYmUgRW5nbGlzaCBvciBGcmVuY2guDQo8L3A+DQo8cD5XZSBzZWVr IGNhbmRpZGF0ZXMgaG9sZGluZyBhIFBoRCBpbiBDb21wdXRlciBTY2llbmNlIG9yIE1hdGhlbWF0 aWNzLCBhbmQgd2l0aCBleHBlcnRpc2UgaW4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2Ugc2VtYW50aWNz LCDOuy1jYWxjdWxpLCB0eXBlIHRoZW9yeSwgZnVuY3Rpb25hbCBwcm9ncmFtbWluZywgYWJzdHJh Y3QgaW50ZXJwcmV0YXRpb24sIGNvbXBpbGF0aW9uLCBtb2RlbCBjaGVja2luZywgb3IgcHJvZ3Jh bSBsb2dpYy4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTI4 MDhjNSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2UyODA4YzUiPlByb2ZpbGU8L2g0 Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2UyODA4YzUiPg0KPHA+ VGhlIGNhbmRpZGF0ZSBzaG91bGQgYmUgZmFtaWxpYXIgd2l0aCBmb3JtYWwgYXBwcm9hY2hlcyBp biBwcm9ncmFtbWluZyBsYW5ndWFnZSBkZXNpZ24sIG5vdGFibHkgdHlwZSBzeXN0ZW1zLCBzZW1h bnRpY3MsIGFuZCBsb2dpYy4gTW9yZSBjb25jcmV0ZWx5LCBrbm93bGVkZ2Ugb2YgdGhlIE9DYW1s IHByb2dyYW1taW5nIGxhbmd1YWdlIGlzIGV4cGVjdGVkLCBhbmQgYSBrbm93bGVkZ2Ugb2YgYWJz dHJhY3QgaW50ZXJwcmV0YXRpb24gb3IgbW9kZWwNCiBjaGVja2luZyB3b3VsZCBiZSBoaWdobHkg YXBwcmVjaWF0ZWQuIDwvcD4NCjxwPlRoaXMgcG9zdGRvYyBzdHJvbmdseSByZWxpZXMgb24gdGhl IGZhY3QgdGhhdCBwcmFjdGljYWwgaW1wbGVtZW50YXRpb24gc2hvdWxkIGhhdmUgc3Ryb25nIHRo ZW9yZXRpY2FsIGZvdW5kYXRpb25zIGFuZCB0aGF0IGZ1cnRoZXIgcmVmaW5lbWVudHMgb2YgdGhl IHRoZW9yeSBzaG91bGQgZ2V0IGluc3BpcmF0aW9uIGZyb20gdGhlIHByYWN0aWNhbCBzaWRlLg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg3ZDg1 MDUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4N2Q4NTA1Ij5BcHBsaWNhdGlvbiBw cm9jZXNzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc4N2Q4 NTA1Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BcHBsaWNhdGlvbnMgd2lsbCBiZSBwcm9j ZXNzZWQgc3RhcnRpbmcgdGhlIDE4dGggb2YgRGVjZW1iZXIuIExhdGUgYXBwbGljYXRpb25zIHdp bGwgYmUgY29uc2lkZXJlZCB1bnRpbCB0aGUgcG9zaXRpb24gaXMgZmlsbGVkLg0KPC9saT48bGk+ WW91IGRvIG5vdCBuZWVkIHRvIGhhdmUgZGVmZW5kZWQgeW91ciBQaEQgdGhlc2lzIHRvIGFwcGx5 LCBidXQgeW91IHdpbGwgbmVlZCB0byBoYXZlIG9idGFpbmVkIHlvdXIgUGhEIHRvIHN0YXJ0IHRo ZSBjb250cmFjdC4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5DYW5kaWRhdGVzIGNhbiBzZW5k IHRoZWlyIGFwcGxpY2F0aW9uIHRvIEd1aWxoZW0gSmFiZXIgKGd1aWxoZW0gZG90IGphYmVyIGF0 IGlucmlhIGRvdCBmcikgYW5kIEdhYnJpZWwgUmFkYW5uZSAoZ2FicmllbCBkb3QgcmFkYW5uZSBh dCBpbnJpYSBkbyBmcikgd2l0aCBhIHN1YmplY3QgY29udGFpbmluZyDigJxbQ0FWT0MgcG9zdC1k b2MgYXBwbGljYXRpb25d4oCcLg0KPC9saT48L3VsPg0KPC9saT48bGk+VGhlIGFwcGxpY2F0aW9u IHNob3VsZCBjb250YWluIGEgQ1YsIHR3byBzZWxlY3RlZCBwdWJsaWNhdGlvbnMgYW5kIHR3byBj b250YWN0cyBvZiByZWZlcmVuY2UgcGVyc29ucyAob3IgcmVmZXJlbmNlIGxldHRlcnMgaWYgYXZh aWxhYmxlKS4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmcxNjAyYjQzIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMTYwMmI0 MyI+Q29udGV4dDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn MTYwMmI0MyI+DQo8cD5UaGUgQ0FWT0MgcHJvamVjdCBhaW1zIHRvIGRldmVsb3AgYSBzb3VuZCBh bmQgcHJlY2lzZSBzdGF0aWMgYW5hbHl6ZXIgZm9yIE9DYW1sLCB0aGF0IGNhbiBjYXRjaCBsYXJn ZSBjbGFzc2VzIG9mIGJ1Z3MgcmVwcmVzZW50ZWQgYnkgdW5jYXVnaHQgZXhjZXB0aW9ucy4gVGhl IGFuYWx5emVyIHJlYXNvbnMgY29tcG9zaXRpb25hbGx5IG9uIHByb2dyYW1zLCBpbiBvcmRlciB0 byBhbmFseXplIHRoZW0gYXQgdGhlIGdyYW51bGFyaXR5IG9mIGEgZnVuY3Rpb24NCiBvciBvZiBh IG1vZHVsZS4gSXQgdGFrZXMgaW50byBhY2NvdW50IHRoZSBhYnN0cmFjdGlvbiBwcm9wZXJ0aWVz IHByb3ZpZGVkIGJ5IHRoZSB0eXBlIHN5c3RlbSBhbmQgdGhlIG1vZHVsZSBzeXN0ZW0gb2YgdGhl IGxhbmd1YWdlOiBsb2NhbCB2YWx1ZXMsIGFic3RyYWN0ZWQgZGVmaW5pdGlvbnMgb2YgdHlwZXMs IHBhcmFtZXRyaWMgcG9seW1vcnBoaXNtLg0KPC9wPg0KPHA+VGhlIG1haW4gZ29hbCBpcyB0byBi ZSBzb3VuZCBpbiBhIHN0cm9uZyB3YXk6IGlmIGFuIE9DYW1sIG1vZHVsZSBpcyBjb25zaWRlcmVk IHRvIGJlIGNvcnJlY3QgYnkgdGhlIGFuYWx5emVyLCB0aGVuIG9uZSB3aWxsIGhhdmUgdGhlIGd1 YXJhbnRlZSB0aGF0IG5vIE9DYW1sIGNvZGUgaW50ZXJhY3Rpbmcgd2l0aCB0aGlzIG1vZHVsZSBj YW4gdHJpZ2dlciB1bmNhdWdodCBleGNlcHRpb25zIGNvbWluZyBmcm9tIHRoZSBjb2RlIG9mIHRo aXMgbW9kdWxlLg0KPC9wPg0KPHA+VG8gbW9kZWwgdGhlIGJlaGF2aW91ciBvZiBhIG1vZHVsZSwg d2UgcmVseSBvbiBnYW1lIHNlbWFudGljcywgd2hlcmUgcHJvZ3JhbXMgZm9ybWVkIGJ5IGEgbW9k dWxlIGFuZCBhIGNsaWVudCBvZiB0aGUgbW9kdWxlIGFyZSBtb2RlbGVkIGFzIGNhbGxzLWFuZC1y ZXR1cm5zIGludGVyYWN0aW9ucy4gQSBtb2R1bGUgaXMgdGhlbiByZXByZXNlbnRlZCBhcyBhIHRy YW5zaXRpb24gc3lzdGVtIHRoYXQgZ2VuZXJhdGVzIHRyYWNlcyByZXByZXNlbnRpbmcNCiB0aGUg aW50ZXJhY3Rpb24gd2l0aCBhbnkgcG9zc2libGUgY2xpZW50LiBUaGlzIHRyYW5zaXRpb24gc3lz dGVtIGlzIGRpcmVjdGx5IGdlbmVyYXRlZCBmcm9tIHRoZSBtb2R1bGXigJlzIGNvZGUgKGltcGxl bWVudGF0aW9uIGFuZCBzaWduYXR1cmUpLCB1c2luZyBhbiBvcGVyYXRpb25hbCBzZW1hbnRpY3Mu IFdlIGhhdmUgaW1wbGVtZW50ZWQgc3VjaCBhbiBpbnRlcmFjdGl2ZSBzZW1hbnRpY3MgZm9yIGEg bGFyZ2UgZnJhZ21lbnQgb2YgT0NhbWwsIHdoaWNoDQogd2UgYXJlIHVzaW5nIHRvIGRldmVsb3Ag b3VyIHByb3RvdHlwZSBhbmFseXplci4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjEwIj5PQ2FtbCBhbmQgT1BBTSBhd2FyZGVkIFRoZSBPcGVuIFNjaWVuY2UgQXdhcmQg Zm9yIEZyZWUgYW5kIE9wZW4tU291cmNlIFJlc2VhcmNoIFNvZnR3YXJlczwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWFuZC1vcGFtLWF3YXJkZWQtdGhlLW9w ZW4tc2NpZW5jZS1hd2FyZC1mb3ItZnJlZS1hbmQtb3Blbi1zb3VyY2UtcmVzZWFyY2gtc29mdHdh cmVzLzEzNTUzLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWFuZC1vcGFt LWF3YXJkZWQtdGhlLW9wZW4tc2NpZW5jZS1hd2FyZC1mb3ItZnJlZS1hbmQtb3Blbi1zb3VyY2Ut cmVzZWFyY2gtc29mdHdhcmVzLzEzNTUzLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzQ2MDIzODkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmc0NjAyMzg5Ij5PQ2FtbFBybyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQ2MDIzODkiPg0KPHA+R3JlZXRpbmdzIHRvIGFsbCBvdXIgZmVs bG93IENhbWVsZWVycyEgPC9wPg0KPHA+SW4gY2FzZSB5b3UgbWlzc2VkIGl0OiB0d28gZGF5cyBh Z28sIHRoZSBPQ2FtbCBDb21tdW5pdHksIHNwZWNpZmljYWxseSwgd2FzIGNvbW1lbmRlZCBieSB0 aGUNCjxpPk1pbmlzdMOocmUgZGUgbOKAmUVuc2VpZ25lbWVudCBTdXDDqXJpZXVyIGV0IGRlIGxh IFJlY2hlcmNoZTwvaT4gKEZyZW5jaCBNaW5pc3RyeSBvZiBIaWdoZXIgRWR1Y2F0aW9uIGFuZCBS ZXNlYXJjaCkgaW4gdGhlIGNvbnRleHQgb2YgdGhlaXIgYW5udWFsDQo8YSBocmVmPSJodHRwczov L3d3dy5lbnNlaWduZW1lbnRzdXAtcmVjaGVyY2hlLmdvdXYuZnIvZnIvcmVtaXNlLWRlcy1wcml4 LXNjaWVuY2Utb3V2ZXJ0ZS1kdS1sb2dpY2llbC1saWJyZS1kZS1sYS1yZWNoZXJjaGUtMjAyMy05 MzczMiNpdGVtNCI+DQpQcml4IFNjaWVuY2UgT3V2ZXJ0ZSBkdSBMb2dpY2llbCBMaWJyZSBkZSBs YSBSZWNoZXJjaGU8L2E+IChUaGUgT3BlbiBTY2llbmNlIEF3YXJkcyBvZiBGcmVlIGFuZCBPcGVu LVNvdXJjZSBSZXNlYXJjaCBTb2Z0d2FyZSkuDQo8L3A+DQo8cD5MZXTigJlzIGFwcHJlY2lhdGUg dGhpcyBtb21lbnQgZm9yIHdoYXQgaXQgaXM6IGFuIGFja25vd2xlZGdlbWVudCBvZiB0aGUgZ2Fy Z2FudHVhbiBhbW91bnRzIG9mIHdvcmsgdGhhdCBoYXZlIGJlZW4gcG91cmVkIGludG8gT0NhbWwg Zm9yIHRoZSBwYXN0IDI3IHllYXJzLCBhbmQgYW4gb3Bwb3J0dW5pdHkgZm9yIGNlbGVicmF0aW9u IGFuZCBwcmFpc2UhIFdlIGFyZSBzbyBwcm91ZCBhbmQgaGFwcHkgdG8gYmUgcGFydCBvZiB0aGlz IHN0cm9uZyBhbmQNCiBkeW5hbWljIGNvbW11bml0eSEgPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD48 aT5PQ2FtbCBpcyBhIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgdGhhdCBlbWJlZHMg aW1wZXJhdGl2ZSBhbmQgb2JqZWN0LW9yaWVudGVkIGNvbnN0cnVjdHMuIEl0cyBkZXNpZ24gaXMg Y2VudHJlZCBhcm91bmQgc3Ryb25nIHN0YXRpYyB0eXBpbmcsIGF1dG9tYXRpYyB0eXBlIGluZmVy ZW5jZSwgYW5kIHByb2dyYW0gbW9kdWxhcml0eS4gSXRzIGFwcGxpY2F0aW9ucyBzcGFuIGZyb20g dGhlIGhpZ2gtZW5kIGFjYWRlbWljIHJlc2VhcmNoDQogdG8gdmFyaW91cyBpbmR1c3RyaWFsIGRv bWFpbnMuIEFtb25nIG90aGVyIHRoaW5ncywgT0NhbWwgaXMgY29tcHJpc2VkIG9mIHR3byBjb21w aWxlcnMgYW5kIGFuIGV4ZWN1dGlvbiBlbnZpcm9ubWVudC4gSXQgZXZvbHZlcyBpbnNpZGUgYSB2 YXN0IGVjb3N5c3RlbSBjZW50cmVkIGFyb3VuZCB0aGUgcGFja2FnZSBtYW5hZ2VyDQo8Y29kZT5v cGFtPC9jb2RlPi4gVGhlIGxhbmd1YWdlIGhhcyBtYWludGFpbmVkIGl0cyBjb3Vyc2Ugc2luY2Ug MTk5NiB3aGlsZSBtYWludGFpbmluZyB0aGUgcGVyZW5uaWFsaXR5IG9mIHRoZSBwcm9ncmFtcyBy dW5uaW5nIG9uIGl0LjwvaT4NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMTEiPklDRlAgMjAyMyBPQ2FtbCBQcmVzZW50YXRpb25zIG9uIFlvdVR1YmU8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taWNmcC0yMDIzLW9jYW1s LXByZXNlbnRhdGlvbnMtb24teW91dHViZS8xMzU1NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4taWNmcC0yMDIzLW9jYW1sLXByZXNlbnRhdGlvbnMtb24teW91dHViZS8xMzU1 NC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczZGIw NjFiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnM2RiMDYxYiI+amJlY2tmb3JkIGFu bm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnM2Ri MDYxYiI+DQo8cD5UaGUgaW5kaXZpZHVhbCBwcmVzZW50YXRpb25zIG9mIHRoZSBJQ0ZQIDIwMjMg T0NhbWwgdHJhY2sgYXJlIGF2YWlsYWJsZcK5IGF0OiA8YSBocmVmPSJodHRwczovL3d3dy55b3V0 dWJlLmNvbS9wbGF5bGlzdD9saXN0PVBMeXJsazhYYXlscDdUcTUtWk42amtpci1zWXJoR2lfMEUi Pg0KaHR0cHM6Ly93d3cueW91dHViZS5jb20vcGxheWxpc3Q/bGlzdD1QTHlybGs4WGF5bHA3VHE1 LVpONmpraXItc1lyaEdpXzBFPC9hPiA8L3A+DQo8cD5CaW9zIGFuZCBwYXBlcnMgYXJlIGxpc3Rl ZCBpbiB0aGUgSUNGUCAyMDIzIHByb2dyYW0gc2NoZWR1bGU6IDxhIGhyZWY9Imh0dHBzOi8vaWNm cDIzLnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMyNwcm9ncmFtIj4NCmh0dHBzOi8vaWNmcDIz LnNpZ3BsYW4ub3JnL2hvbWUvb2NhbWwtMjAyMyNwcm9ncmFtPC9hPi4gPC9wPg0KPHA+VGhhbmtz IHRvIGFsbCB0aGUgcHJlc2VudGVycyBhbmQgcGFydGljaXBhbnRzIHdobyBtYWRlIHRoaXMgZXZl bnQgaGFwcGVuISA8L3A+DQo8cD7igJMgSUNGUCAyMDIzIE9DYW1sIENoYWlycyA8L3A+DQo8cD5b wrldIE9ubHkgdGhlIHByZXNlbnRhdGlvbnMgdGhhdCBnYXZlIHBlcm1pc3Npb24gdG8gYmUgcmVj b3JkZWQuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTEyIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTIiPmdlb2pzb24gYW5kIGdl b2pzb25lPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMiI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdlb2pz b24tYW5kLWdlb2pzb25lLzEwNzM4LzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1nZW9qc29uLWFuZC1nZW9qc29uZS8xMDczOC8yPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzQ3OWM1MTciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmc0NzljNTE3Ij5QYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQ3OWM1MTciPg0KPHA+UmVjZW50bHksIGEgdmVy c2lvbiA8Y29kZT4wLjIuMDwvY29kZT4gd2FzIHJlbGVhc2VkIG9mIDxjb2RlPkdlb2pzb248L2Nv ZGU+IGFuZA0KPGNvZGU+R2VvanNvbmU8L2NvZGU+IOKAkyB0aGUgYmlnZ2VzdCBjaGFuZ2Ugd2Fz IHRvIHJlbW92ZSB0aGUgZXhwbGljaXQgZGVwZW5kZW5jeSBvbiBFaW8gZnJvbSB0aGUgY29yZSBs aWJyYXJ5IGFuZCBwbGFjZSBpdCBpbnRvIGEgc3VicGFja2FnZQ0KPGNvZGU+Z2VvanNvbmUuZWlv PC9jb2RlPi4gVGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nZW9jYW1sL29jYW1sLWdl b2pzb24jZ2VvanNvbmUiPg0KUkVBRE1FPC9hPiBoYXMgc29tZSBkb2N1bWVudGF0aW9uIG9uIHRo aXMgY2hhbmdlLiA8L3A+DQo8cD5IYXBweSBHZW9zcGF0aWFsIEhhY2tpbmcgOndvcmxkX21hcDog OmNhbWVsOiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci0xMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEzIj5SZXRoaW5raW5nIGFi c3RyYWN0IG1vZHVsZSB0eXBlcyAtIGZlZWRiYWNrIHdhbnRlZDwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2dhZ2FsaXVtLWJsb2ctcG9zdC1yZXRoaW5raW5nLWFic3Ry YWN0LW1vZHVsZS10eXBlcy1mZWVkYmFjay13YW50ZWQvMTM1NjQvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvZ2FnYWxpdW0tYmxvZy1wb3N0LXJldGhpbmtpbmctYWJzdHJhY3QtbW9k dWxlLXR5cGVzLWZlZWRiYWNrLXdhbnRlZC8xMzU2NC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1NDJlOGZiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnNTQyZThmYiI+Q2zDqW1lbnQgQmxhdWRlYXUgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc1NDJlOGZiIj4NCjxwPknigJl2ZSB3 cml0dGVuIGEgYmxvZyBwb3N0IG9uIDxpPmFic3RyYWN0IG1vZHVsZSB0eXBlczwvaT4gKDxjb2Rl Pm1vZHVsZSB0eXBlIFQ8L2NvZGU+IHdpdGhvdXQgYSBkZWZpbml0aW9uKSwgYXZhaWxhYmxlDQo8 YSBocmVmPSJodHRwczovL2dhbGxpdW0uaW5yaWEuZnIvYmxvZy9yZXRoaW5raW5nLW9jYW1sLWFi c3RyYWN0LXNpZ25hdHVyZXMvIj5vbiB0aGUgZ2FnYWxpdW0gYmxvZzwvYT4uIFRoZSBwb3N0IHN1 bXMgdXAgaG93IGFic3RyYWN0IG1vZHVsZSB0eXBlcyBjYW4gYmUgdXNlZCwgd2hhdCBhcmUgdGhl IGN1cnJlbnQgaXNzdWVzIGFuZCBwcm9wb3NlcyBhIHJlc3RyaWN0aW9uL3NpbXBsaWZpY2F0aW9u IG9mIHRoZWlyIHNlbWFudGljcy4gVGhlIGdvYWwNCiBpcyB0byBldmVudHVhbGx5IHVwZGF0ZSB0 aGUgdHlwZWNoZWNrZXIgd2l0aCB0aGlzIHNpbXBsaWZpZWQgc2VtYW50aWNzLiA8L3A+DQo8cD5Z ZXQsIGFzIGl0IGlzIGEgcmVzdHJpY3Rpb24sIGl0IG1pZ2h0IGJyZWFrIGJhY2t3YXJkcyBjb21w YXRpYmlsaXR5LiBUaGVyZWZvcmUsIHRoZSBrZXkgcXVlc3Rpb24gSeKAmW0gdHJ5aW5nIHRvIGFu c3dlciBpcyB3aGV0aGVyIG9yIG5vdCB0aGUgc2ltcGxpZmljYXRpb24gSeKAmW0gcHJvcG9zaW5n IGlzDQo8Yj5hY3R1YWxseSBiYWNrd2FyZHMgY29tcGF0aWJsZTwvYj4sIGJlY2F1c2Ugbm8gb25l IHVzZXMgYWJzdHJhY3QgbW9kdWxlIHR5cGVzIG91dHNpZGUgb2YgdGhlIHNldHRpbmcgSeKAmW0g cHJvcG9zaW5nLg0KPC9wPg0KPHA+SSB3ZWxjb21lIGFueSBmZWVkYmFjayBmcm9tIHRoZSBib3Ro IHRoZSBwZWRhZ29naWNhbCBwYXJ0IG9yIHRoZSBwcm9wb3NlZCByZXN0cmljdGlvbiAodG8NCjxp PnNpbXBsZS1zaWduYXR1cmVzLW9ubHkgaW5zdGFudGlhdGlvbjwvaT4pLCBlc3BlY2lhbGx5IGlm IHlvdeKAmXJlIGFuIHVzZXIgb3IgcG90ZW50aWFsIHVzZXIgb2YgYWJzdHJhY3QgbW9kdWxlIHR5 cGVzIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItMTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxNCI+VFNhbiBzdXBwb3J0IGlu IE9DYW1sIDUuMSBhbmQgYmxvZyBwb3N0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC0xNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLXRzYW4tc3VwcG9ydC1pbi1vY2FtbC01LTEtYW5kLWJsb2ctcG9zdC8xMzMw Ni8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdHNhbi1zdXBwb3J0LWluLW9j YW1sLTUtMS1hbmQtYmxvZy1wb3N0LzEzMzA2LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2VkMjkwYTgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmdlZDI5MGE4Ij5PbGl2aWVyIE5pY29sZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2VkMjkwYTgiPg0KPHA+PGEgaHJlZj0iaHR0cHM6 Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj16cjlTMEZyX0NoYyZhbXA7bGlzdD1QTHlybGs4WGF5 bHA3VHE1LVpONmpraXItc1lyaEdpXzBFJmFtcDtpbmRleD00Ij5UaGUgdmlkZW8gb2Ygb3VyIHRh bGs8L2E+IGFib3V0IFRocmVhZFNhbml0aXplciBhdCB0aGUgT0NhbWwgV29ya3Nob3AgMjAyMyBp cyBub3cgYXZhaWxhYmxlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxNSI+SGls aXRlIDAuMy4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNSI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWhp bGl0ZS0wLTMtMC8xMjcyMy8yIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWhpbGl0 ZS0wLTMtMC8xMjcyMy8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmczMjYyOTE2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzI2MjkxNiI+ UGF0cmljayBGZXJyaXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmczMjYyOTE2Ij4NCjxwPlRoZSBub3QgdG9vIGRpc3RhbnQgZnV0dXJlIGlz IGhlcmUhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkv cHVsbC8yNDgwNyI+DQpIaWxpdGUgPGNvZGU+MC40LjA8L2NvZGU+PC9hPiBub3cgdXNlcyA8Y29k ZT5DbWFya2l0PC9jb2RlPiBpbnN0ZWFkIG9mIDxjb2RlPk9tZDwvY29kZT4gZm9yIHRoZSB1bmRl cmx5aW5nIE1hcmtkb3duIGxpYnJhcnkuIFRoaXMgaXMgaW4gdmVyeSBsYXJnZSBwYXJ0IHRoYW5r cyB0bw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE2 NDIiPk91dHJlYWNoeSBjb250cmlidXRpb25zIHRvIG9jYW1sLm9yZzwvYT4hDQo8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xNiIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjE2Ij5Zb3UgQ2FuIEF0dGVuZCB0aGUgTmV3IE9DYW1sLm9y ZyBDb21tdW5pdHkgTWVldGluZ3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTE2Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC95b3UtY2FuLWF0dGVuZC10aGUtbmV3LW9jYW1sLW9yZy1jb21tdW5pdHktbWVldGluZ3Mv MTI2NTYvOSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QveW91LWNhbi1hdHRlbmQtdGhl LW5ldy1vY2FtbC1vcmctY29tbXVuaXR5LW1lZXRpbmdzLzEyNjU2Lzk8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2M5Y2QzM2YiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdjOWNkMzNmIj5TYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjOWNkMzNmIj4NCjxwPlRo ZSBtZWV0aW5nIHRpbWUgZm9yIGZ1dHVyZSBvY2FtbC5vcmcgZGV2IG1lZXRpbmdzIGhhcyBjaGFu Z2VkIHRvIDE3OjAwLTE4OjAwIENFVC4NCjwvcD4NCjxwPkRlYyAxMSBhZ2VuZGE6IDwvcD4NCjxv bCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5PcGVuIGlzc3VlcyBmb3IgY29udHJpYnV0b3JzIDwvbGk+ PGxpPlEmYW1wO0EgPC9saT48L29sPg0KPHA+WW91IGNhbiBwcm9wb3NlIHRvcGljcyBmb3IgdGhl IGFnZW5kYS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxNyI+QSBEZWNlbWJlciB1 cGRhdGUgZnJvbSB0aGUgb2NhbWwtd2FzbSBvcmdhbmlzYXRpb248L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTE3Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLWRlY2VtYmVyLXVwZGF0ZS1mcm9tLXRoZS1vY2FtbC13 YXNtLW9yZ2FuaXNhdGlvbi8xMzU2NS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h LWRlY2VtYmVyLXVwZGF0ZS1mcm9tLXRoZS1vY2FtbC13YXNtLW9yZ2FuaXNhdGlvbi8xMzU2NS8x PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1M2Y2YmE4 IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNTNmNmJhOCI+SmFuIE1pZHRnYWFyZCBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzUz ZjZiYTgiPg0KPHA+RGVjZW1iZXIgaXMgdXBvbiB1cyBhbmQgc28gaXQgaXMgdGltZSBmb3IgYW4g dXBkYXRlIHNpbmNlIG91ciBsYXN0IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbi11cGRhdGUtZnJvbS10aGUtb2NhbWwtd2FzbS1vcmdhbml6YXRpb24vMTMxMTQiPg0KPGNv ZGU+b2NhbWwtd2FzbTwvY29kZT4gb3JnYW5pc2F0aW9uIFNlcHRlbWJlciB1cGRhdGU8L2E+LiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2RiYWQ1MDMiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdkYmFkNTAzIj5JbnRyb2R1Y3Rpb248L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2RiYWQ1MDMiPg0KPHA+RWFybGll ciB0aGlzIHllYXIgd2UgZm9ybWVkIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13 YXNtIj50aGUgPGNvZGU+DQpvY2FtbC13YXNtPC9jb2RlPiBvcmdhbmlzYXRpb248L2E+IHRvIGpv aW4gZWZmb3J0cyBiZXR3ZWVuIHR3byA8YSBocmVmPSJodHRwczovL3dlYmFzc2VtYmx5Lm9yZy8i Pg0KV2ViQXNzZW1ibHkgKFdhc20pPC9hPiB0YXJnZXRpbmcgY29tcGlsZXIgcHJvamVjdHMgZm9y IE9DYW1sOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL09DYW1sUHJvL3dhc29jYW1sIj48Y29kZT53YXNvY2FtbDwvY29kZT48L2E+IOKA kyBhIHByb3RvdHlwZSBiYWNrZW5kIGZvciBPQ2FtbOKAmXMgbmF0aXZlIGNvZGUgY29tcGlsZXIg YmFzZWQgb24gdGhlIEZsYW1iZGEtaW50ZXJtZWRpYXRlIHJlcHJlc2VudGF0aW9uDQo8L2xpPjxs aT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIj48 Y29kZT53YXNtX29mX29jYW1sPC9jb2RlPjwvYT4g4oCTIGEgZm9yayBvZg0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jc2lnZW4vanNfb2Zfb2NhbWwiPjxjb2RlPmpzX29mX29jYW1sPC9j b2RlPjwvYT4gdGhhdCB0cmFuc2xhdGVzIE9DYW1sIGJ5dGVjb2RlIHRvIFdhc20gaW5zdGVhZCBv ZiBKYXZhU2NyaXB0DQo8L2xpPjwvdWw+DQo8cD5FeGNpdGluZyBuZXdzOiA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvZ2MiPlRoZSBXZWJBc3NlbWJseSBHYXJiYWdlIENv bGxlY3Rpb24gKFdhc21HQykgZXh0ZW5zaW9uPC9hPiB3aGljaCBib3RoDQo8Y29kZT53YXNvY2Ft bDwvY29kZT4gYW5kIDxjb2RlPndhc21fb2Zfb2NhbWw8L2NvZGU+IGRlcGVuZCBvbiBpcyBub3cg ZW5hYmxlZCBieSBkZWZhdWx0IGluIHRoZSBsYXRlc3Q6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9ibG9nL3dhc21n Yy8iPkNocm9tZSAxMTkgcmVsZWFzZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly93d3cu bW96aWxsYS5vcmcvZW4tVVMvZmlyZWZveC8xMjAuMC9yZWxlYXNlbm90ZXMvIj5GaXJlZm94IDEy MCByZWxlYXNlPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2E5YTUyNDciIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdh OWE1MjQ3Ij48Y29kZT53YXNtX29mX29jYW1sPC9jb2RlPjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTlhNTI0NyI+DQo8cD48Y29kZT53YXNtX29mX29jYW1s PC9jb2RlPiBjdXJyZW50bHkgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyA8YSBocmVmPSJodHRwczov L3dlYmFzc2VtYmx5Lm9yZy9yb2FkbWFwLyI+DQpXYXNtIGV4dGVuc2lvbnM8L2E+OiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1dlYkFz c2VtYmx5L2djIj5UaGUgR0MgZXh0ZW5zaW9uPC9hPiwgaW5jbHVkaW5nIGZ1bmN0aW9uYWwgcmVm ZXJlbmNlcyBhbmQgMzEtYml0IGludGVnZXJzDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vV2ViQXNzZW1ibHkvdGFpbC1jYWxsL2Jsb2IvbWFpbi9wcm9wb3NhbHMvdGFpbC1j YWxsL092ZXJ2aWV3Lm1kIj5UaGUgdGFpbC1jYWxsIGV4dGVuc2lvbjwvYT4NCjwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9leGNlcHRpb24taGFuZGxpbmcv YmxvYi9tYXN0ZXIvcHJvcG9zYWxzL2V4Y2VwdGlvbi1oYW5kbGluZy9FeGNlcHRpb25zLm1kIj5U aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGV4dGVuc2lvbjwvYT4NCjwvbGk+PC91bD4NCjxwPkFzIHlv dSBtYXkgaGF2ZSBpbmZlcnJlZCwgd2l0aCB0aGUgbGF0ZXN0IHJlbGVhc2UgQ2hyb21lIDExOSBj YW4gbm93IHJ1biB0aGUgb3V0cHV0IG9mDQo8Y29kZT53YXNtX29mX29jYW1sPC9jb2RlPiBvdXQg b2YgdGhlIGJveCEgPC9wPg0KPHA+Rm9yIEZpcmVmb3ggMTIwLCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1sL2lzc3Vlcy8xMCNpc3N1ZWNvbW1lbnQt MTgyNDAyMjA2MCI+DQpvbmUgbmVlZHMgdG8gZW5hYmxlIHRoZSBXYXNtIHRhaWwgY2FsbCBleHRl bnNpb24gZmlyc3Q8L2E+LCBidXQgdGhpcyB3aWxsIDxhIGhyZWY9Imh0dHBzOi8vYnVnemlsbGEu bW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTE4NDY3ODkiPg0KYmUgcmVtZWRpZWQgaW4gdGhl IGZvcnRoY29taW5nIDEyMSByZWxlYXNlPC9hPi4gPC9wPg0KPHA+T0NhbWwgNS54IGNvZGUgdXNp bmcgZWZmZWN0IGhhbmRsZXJzIGNhbiBiZSBjb21waWxlZCBpbiB0d28gZGlmZmVyZW50IHdheXM6 IG9uZSBjYW4gZWl0aGVyIGVuYWJsZSB0aGUgQ1BTIHRyYW5zZm9ybWF0aW9uIGZyb20NCjxjb2Rl PmpzX29mX29jYW1sPC9jb2RlPiBvciBlbWl0IGNvZGUgcmVxdWlyaW5nIHRoZSA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvanMtcHJvbWlzZS1pbnRlZ3JhdGlvbi9ibG9i L21haW4vcHJvcG9zYWxzL2pzLXByb21pc2UtaW50ZWdyYXRpb24vT3ZlcnZpZXcubWQiPg0KSmF2 YVNjcmlwdC1Qcm9taXNlIEludGVncmF0aW9uIGV4dGVuc2lvbjwvYT4uIDwvcD4NCjxwPlByZXZp b3VzbHksIDxjb2RlPndhc21fb2Zfb2NhbWw8L2NvZGU+IGFsc28gcmVxdWlyZWQgdGhlIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9zdHJpbmdyZWYiPg0KZXhwZXJpbWVu dGFsIDxjb2RlPnN0cmluZ3JlZjwvY29kZT4gcHJvcG9zYWw8L2E+IHRvIGNvbnZlcnQgc3RyaW5n cyBiZXR3ZWVuIE9DYW1sIGFuZCBKYXZhU2NyaXB0LiBUaGUNCjxjb2RlPnN0cmluZ3JlZjwvY29k ZT4gcHJvcG9zYWwgbWF5IGhvd2V2ZXIgYmUgc3VwZXJzZWVkZWQgYnkgdGhlIG5ld2VyIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9qcy1zdHJpbmctYnVpbHRpbnMvYmxv Yi9tYWluL3Byb3Bvc2Fscy9qcy1zdHJpbmctYnVpbHRpbnMvT3ZlcnZpZXcubWQiPg0KSlMtc3Ry aW5nLWJ1aWx0aW5zIHByb3Bvc2FsPC9hPiwgd2hpY2ggaXMgYmVpbmcgaW1wbGVtZW50ZWQgaW4g Ym90aCBDaHJvbWUgYW5kIEZpcmVmb3guIFdpdGggdGhlIEphdmFTY3JpcHQgc3RyaW5nIHNpdHVh dGlvbiB1cCBpbiB0aGUgYWlyLCBmb3Igbm93DQo8Y29kZT53YXNtX29mX29jYW1sPC9jb2RlPiBp bnN0ZWFkIHVzZXMgdGhlIDxjb2RlPlRleHRFbmNvZGVyfi9+VGV4dERlY29kZXI8L2NvZGU+IEFQ SSBvbiB0aGUgSmF2YVNjcmlwdCBzaWRlIHRvIGNvbnZlcnQgSmF2YVNjcmlwdCB0byBvciBmcm9t IFVURi04IGJ5IHdyaXRpbmcgc3RyaW5ncyB0byBvciByZWFkaW5nIHRoZW0gZnJvbSBhIGJ1ZmZl ciBpbiBXYXNtIGxpbmVhciBtZW1vcnkgYXMgYW4gaW50ZXJtZWRpYXRlIHN0YXRlLg0KPC9wPg0K PHA+U2luY2UgU2VwdGVtYmVyIEB2b3VpbGxvbiBoYXMgY29udGludWVkIGV4dGVuZGluZyBhbmQg aW1wcm92aW5nIDxjb2RlPndhc21fb2Zfb2NhbWw8L2NvZGU+Og0KPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21f b2Zfb2NhbWwvY29tbWl0LzNkN2I3OWE5MzJkMmQwYzQ1Yjk5YWYwZmIzMDRlOGIwMjVmZjNiOTki PkltcGxlbWVudGVkIHVuYm94ZWQNCjxjb2RlPmZsb2F0PC9jb2RlPiBhcnJheXM8L2E+IDwvbGk+ PGxpPlNtYWxsIHJ1bnRpbWUgaW1wcm92ZW1lbnRzOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PkFjY3VyYXRlIGZ1c2VkIG11bHRpcGx54oCTYWRkIDwvbGk+PGxpPkltcHJvdmVkIGhhbmRsaW5n IG9mIHVuY2F1Z2h0IGV4Y2VwdGlvbnMgPC9saT48bGk+SW1wcm92ZWQgdGhlIGdlbmVyYXRlZCBj b2RlIGJ5IHJlZHVjaW5nIHRoZSBudW1iZXIgb2YgY2FzdHMgPC9saT48L3VsPg0KPC9saT48bGk+ T3B0aW1pc2VkIHRoZSBKYXZhU2NyaXB0IGludGVyZmFjZToNCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1s L2NvbW1pdC8zOTY1NzYxYWU2NjE4OWZkMmQyN2RmMWYwMDMxMmM3ZTFlNWFhMGJlIj5HZW5lcmF0 ZSBjb25zdGFudCBKYXZhU2NyaXB0IHN0cmluZ3MgYXQgY29tcGlsZSB0aW1lPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbC9j b21taXQvYTE3ZDE5MDI5MWVkMmE4ZmJlNTFmZDc3MDFhNzdlMzA2OTA0OWVhYSI+R2VuZXJhdGUg SmF2YVNjcmlwdCBjb2RlIGZvciBmdW5jdGlvbiBhbmQgbWV0aG9kIGNhbGxzPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbC9j b21taXQvNzY3MTM0YWNlMjVkODYxMjk2NWZkODM1MjM3MGNlNzM1NGY5MTFiMCI+R2VuZXJhdGUg SmF2YVNjcmlwdCBjb2RlIGZvciBvYmplY3QgbGl0ZXJhbHMgYW5kIG9iamVjdCBwcm9wZXJ0eSBh Y2Nlc3NlczwvYT4NCjwvbGk+PC91bD4NCjwvbGk+PGxpPlJ1biBDSSB0ZXN0cyBhZnRlciBlYWNo IHB1c2g6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+UnVuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvY29tbWl0LzZlZjFlMDRlYWUwMDkxYmQ4 N2I1OTU3OTFkYjdhZGExMGIzYzRkNzciPg0KPGNvZGU+anNfb2Zfb2NhbWw8L2NvZGU+4oCZcyB0 ZXN0c3VpdGUgaW5jbHVkaW5nIGVmZmVjdHMsIGFuZCBhIG51bWJlciBvZiBvdGhlciB0ZXN0c3Vp dGVzIHRlc3RpbmcgaW4gcGFydGljdWxhciB0aGV+emFyaXRofiBKYXZhU2NyaXB0IHN0dWJzIGFu ZCB0aGUNCjxjb2RlPmJvbnNhaTwvY29kZT4gbGlicmFyeTwvYT4gPC9saT48bGk+UnVuIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvY29tbWl0Lzkz MWRlZDY1YzUzODVhZjgzMzI3ZWQ2MDUyMjZiOTM4MDk1NjgwYjEiPg0KbW9yZSBKYW5lIFN0cmVl dCB0ZXN0czwvYT4gdG8gZW5zdXJlIGNvbXBhdGliaWxpdHkgPC9saT48L3VsPg0KPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vZWxpb20vcHVsbC83NjciPlVwZGF0 ZWQgPGNvZGU+RWxpb208L2NvZGU+IHRvIHdvcmsgd2l0aA0KPGNvZGU+d2FzbV9vZl9vY2FtbDwv Y29kZT48L2E+IGFzIGEgc3RyZXNzIHRlc3QuIFRoaXMgaW5jbHVkZWQ6DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+RmluZGluZyBhbmQgZml4aW5nIGEgbnVtYmVyIG9mIHNtYWxsIGJ1Z3MgaW4g PGNvZGU+d2FzbV9vZl9vY2FtbDwvY29kZT7igJlzIHJ1bnRpbWUNCjwvbGk+PGxpPkltcGxlbWVu dGluZyBhIGZldyBtaXNzaW5nIGZlYXR1cmVzIGluIHRoZSBydW50aW1lLCBsaWtlIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvY29tbWl0L2QyZThl ZWYwNDExN2RiMDczMThmYWYzNmU2NjE5Y2Y0YjRlZWExMzIiPg0KPGNvZGU+SnNvbi5vdXRwdXQ8 L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdhc20vd2Fz bV9vZl9vY2FtbC9jb21taXQvZjZiMWFmNjZiYzQzY2VkMjJkMjhiMjhkNGM4ZmYzZWYwNjQxZjRj ZSI+DQo8Y29kZT5Kcy5leHBvcnQ8L2NvZGU+PC9hPiAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvY29tbWl0L2Y1MTdiYmNhZmQ4MWRlNDg2Y2Y5 OTUxZjQwMWJkNDVhNjllYzRhZTgiPg0KRml4ZWQgYSBwZXJmb3JtYW5jZSBpc3N1ZSB3aXRoIHRv cGxldmVsIGxvb3BzPC9hPjoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5PdXIgbG9vcHMgaW5j bHVkZWQgYWxsIHRoZSBjb2RlIHRoYXQgZm9sbG93cywgYW5kIHRoZSBWOCBlbmdpbmUgdXNlZCBq dW1wIG9mZnNldHMgdG8gZXN0aW1hdGUgdGhlIGNvc3Qgb2YgYSBsb29wLiBTbywgaXQgY291bGQg d2lkZWx5IG92ZXJlc3RpbWF0ZSB0aGUgY29zdCBvZiBsb29wcyBhdCB0b3BsZXZlbCBhbmQgcHJv ZHVjZSBvcHRpbWlzZWQgdG9wLWxldmVsIGNvZGUgd2hpY2ggaXMgcnVuIG9ubHkgb25jZS4gU2lu Y2UgdGhpcyBjb2RlDQogY2FuIGJlIHZlcnkgbGFyZ2UsIHRoaXMgY291bGQgdGFrZSBzZXZlcmFs IG1pbnV0ZXMuIE5vdywgdGhlIGNvZGUgd2hpY2ggaXMgbm90IGludm9sdmVkIGluIGEgbG9vcCBp cyBtb3ZlZCBhZnRlciB0aGUgbG9vcCBpZiBpdCBleGNlZWRzIGEgc2l6ZSB0aHJlc2hvbGQuDQo8 L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8cD5JbiBhZGRpdGlvbiwgQHZvdWls bG9uIGFsc28gY29udHJpYnV0ZWQgd2l0aCBhIGNvdXBsZSBvZiBicm9hZGVyIFdhc20gY29tbXVu aXR5IGltcHJvdmVtZW50czoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5NYWtpbmcg PGNvZGU+YmluYXJ5ZW48L2NvZGU+IG1vcmUgZWZmZWN0aXZlIGF0IGNhbmNlbGxpbmcgb3V0IGEg Ym94aW5nIGZvbGxvd2VkIGJ5IGFuIHVuYm94aW5nOg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL1dlYkFzc2VtYmx5L2JpbmFyeWVuL3B1bGwvNTk1MiI+V2ViQXNzZW1ibHkvYmluYXJ5ZW4j NTk1MjwvYT4gYW5kDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2Nocm9taXVtLXJldmlldy5n b29nbGVzb3VyY2UuY29tL2MvdjgvdjgvJiM0MzsvNTAxMzY3NCI+SW1wcm92ZWQgdGhlIHBlcmZv cm1hbmNlIG9mIFdhc20gZXhjZXB0aW9ucyBpbiBWODwvYT4sIHRoZSBKYXZhU2NyaXB0IC8gV2Fz bSBlbmdpbmUgdXNlZCBieSBDaHJvbWUuIEFmdGVyIGEgbnVtYmVyIG9mIG9wdGltaXNhdGlvbnMs IGxpa2UgdXNpbmcgYSBjYWNoZSB0byBmaW5kIHdoaWNoIFdhc20gY29kZSBjb3JyZXBvbmRzDQog dG8gYSBjb2RlIHBvaW50ZXIsIHRoZXkgYXJlIGFib3V0IGEgb3JkZXIgb2YgbWFnbml0dWRlIGZh c3Rlci4gQXMgYSBjb25zZXF1ZW5jZSB0aGUgQm95ZXIgYmVuY2htYXJrIHJ1bnMgYWJvdXQgNSB0 aW1lIGZhc3Rlci4NCjwvbGk+PC91bD4NCjxwPkZpbmFsbHksIGhlIHByZXBhcmVkIGFuZCBnYXZl IHR3byBwcmVzZW50YXRpb25zIGFib3V0IDxjb2RlPndhc21fb2Zfb2NhbWw8L2NvZGU+Og0KPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkEgZ2VuZXJhbCA8Y29kZT53YXNtX29mX29jYW1s PC9jb2RlPiB0YWxrIGF0IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1i bHkvbWVldGluZ3MvYmxvYi9tYWluL21haW4vMjAyMy9DRy0xMC5tZCI+DQpXZWJBc3NlbWJseSBD b21tdW5pdHkgR3JvdXAgbWVldGluZzwvYT4gb24gT2N0b2JlciAxMi4gSW4gcGFydGljdWxhciwg aGUgcHJlc2VudGVkIGEgbnVtYmVyIG9mIHBlcmZvcm1hbmNlIG1lYXN1cmVtZW50cy4NCjwvbGk+ PGxpPkEgdGFsayBvbiBpbXBsZW1lbnRpbmcgT0NhbWwgZWZmZWN0IGhhbmRsZXJzIGluIFdhc20g YXQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9tZWV0aW5ncy9i bG9iL21haW4vc3RhY2svMjAyMy9zdGFjay0yMDIzLTExLTA2Lm1kIj4NCldlYkFzc2VtYmx54oCZ cyBTdGFjayBTdWJncm91cDwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xOCIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjE4Ij5PdGhlciBPQ2FtbCBOZXdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC0xOCI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmdkMmIzMjdkIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZDJiMzI3ZCI+RnJvbSB0 aGUgb2NhbWwub3JnIGJsb2c8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZ2QyYjMyN2QiPg0KPHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dz IGFnZ3JlZ2F0ZWQgYXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9j YW1sLm9yZyBibG9nPC9hPi4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9 Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL2Jsb2cvcmV0aGlua2luZy1vY2FtbC1hYnN0cmFjdC1z aWduYXV0cmVzIj5SZXRoaW5raW5nIE9DYW1sIGFic3RyYWN0IHNpZ25hdHVyZXM8L2E+DQo8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2ZyYW1hLWMuY29tL2ZjLXZlcnNpb25zL25pY2tlbC5odG1s Ij5SZWxlYXNlIG9mIEZyYW1hLUMgMjguMCAoTmlja2VsKTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vcHJhY3RpY2Fsb2NhbWwuY29tL3VuaXgtbW9kdWxlLWNvbnNpZGVyZWQtaGFybWZ1 bC8iPlVuaXggTW9kdWxlIENvbnNpZGVyZWQgSGFybWZ1bDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vc2lnbmFscy10aHJlYWRzLnNpbXBsZWNhc3QuY29tL2VwaXNvZGVzL3BlcmZvcm1h bmNlLWVuZ2luZWVyaW5nLW9uLWhhcmQtbW9kZS13aXRoLWFuZHJldy1odW50ZXItZnhoQ01Ja0Ii PlBlcmZvcm1hbmNlIEVuZ2luZWVyaW5nIG9uIEhhcmQgTW9kZSB3aXRoIEFuZHJldyBIdW50ZXI8 L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2hhbm5lcy5yb2J1ci5jb29wL1Bvc3RzL1RD UC1ucyI+UmVkZXZlbG9waW5nIFRDUCBmcm9tIHRoZSBncm91bmQgdXA8L2E+DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdl MzNkNTQwIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnZTMzZDU0MCI+T2xkIENXTjwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnZTMzZDU0MCI+DQo8 cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFs YW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5k IEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIHRvIHRoZSA8YSBo cmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Ij4NCmNhbWwt bGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmdlNDZiYjFkIj4N CjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8 L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1s Pg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 28 Nov 2023 09:10:57 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 28 Nov 2023 09:10:56 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 28 Nov 2023 09:10:56 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AS9B0e8022494 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 28 Nov 2023 09:11:01 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AS9AjAJ022478 for ; Tue, 28 Nov 2023 09:10:45 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Nov 2023 10:10:41 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9DF0FE0D62; Tue, 28 Nov 2023 10:10:39 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E0A07E004E for ; Tue, 28 Nov 2023 10:10:33 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Nov 2023 10:10:31 +0100 Received: from TM.local (unknown [131.254.252.220]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 47A775605BE; Tue, 28 Nov 2023 10:10:22 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaIdrMY5FOZUfrukSjfwsGn1G3nQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 28 Nov 2023 09:09:53 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 7874d676-69af-4148-ce12-08dbeff1ee62 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,233,1695679200"; d="scan'208,217";a="138927554" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499960, queueID=A96CA5605BF x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMS0yOCBUdWUgMTA6MDggLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTEuMjEuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMi4wNS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE5vdmVtYmVyIDIxIHRvIDI4LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5SaW90IHYwLjAuMzogYW4gYWN0 b3ItbW9kZWwgbXVsdGktY29yZSBzY2hlZHVsZXIgZm9yIE9DYW1sIDU8L2E+DQo8L2xpPjxsaT48 YSBocmVmPSIjMiI+Q2FwZXIgMC45PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+T0NhbWwgVXNl ciBTdXJ2ZXkgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPlNldCB1cCBPQ2FtbCAyLjEu MjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBPY3RvYmVy IDIwMjM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5kcmVhbS1odG1sIDEuMi4wPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNyI+TmV3IERyYWZ0IFR1dG9yaWFsIG9uIFBvbHltb3JwaGljIFZhcmlh bnRzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+UHB4bGliIGRldiBtZWV0aW5nczwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzkiPnZhcnJheSAwLjI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+ Rmlyc3QgcmVsZWFzZSBvZiA8Y29kZT51cm48L2NvZGU+OiBVcm5zIGZvciBmYXN0IGZ1bmN0aW9u YWwgcmFuZG9tIHNhbXBsaW5nPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzExIj5EcmFmdCBUdXRv cmlhbCBvbiBNdXRhYmlsaXR5LCBMb29wcywgYW5kIEltcGVyYXRpdmUgUHJvZ3JhbW1pbmc8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSIjMTIiPkZpcnN0IHJlbGVhc2Ugb2YgcHJldHR5X2V4cHJlc3Np dmU6IEEgUHJldHR5IEV4cHJlc3NpdmUgUHJpbnRlcjwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMx MyI+T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZzM3YTQxNTYiPk9s ZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+UmlvdCB2MC4wLjM6IGFu IGFjdG9yLW1vZGVsIG11bHRpLWNvcmUgc2NoZWR1bGVyIGZvciBPQ2FtbCA1PC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmlvdC12MC0wLTMtYW4tYWN0b3ItbW9k ZWwtbXVsdGktY29yZS1zY2hlZHVsZXItZm9yLW9jYW1sLTUvMTM0NjMvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXJpb3QtdjAtMC0zLWFuLWFjdG9yLW1vZGVsLW11bHRpLWNv cmUtc2NoZWR1bGVyLWZvci1vY2FtbC01LzEzNDYzLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzA4ZmNkN2IiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmcwOGZjZDdiIj5vc3RlcmEgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwOGZjZDdiIj4NCjxwPkhpIGZvbGtzISA6d2F2ZTogd2Fu dGVkIHRvIHNoYXJlIHNvbWV0aGluZyBJ4oCZdmUgYmVlbiB3b3JraW5nIG9uIHRoZXNlIGxhc3Qg ZmV3IHdlZWtzLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2xlb3N0ZWFy L3Jpb3QiPlJpb3Q8L2E+IGlzIGFuIDxhIGhyZWY9Imh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93 aWtpL0FjdG9yX21vZGVsIj4NCmFjdG9yLW1vZGVsPC9hPiBtdWx0aS1jb3JlIHNjaGVkdWxlciBm b3IgT0NhbWwgNS4gSXQgYnJpbmdzIDxhIGhyZWY9Imh0dHBzOi8vZXJsYW5nLm9yZy8iPg0KRXJs YW5nPC9hPi1zdHlsZSBjb25jdXJyZW5jeSB0byB0aGUgbGFuZ3VhZ2UsIHdoZXJlIGxpZ2h0d2Vp Z2h0IHByb2Nlc3NlcyBjb21tdW5pY2F0ZSB2aWEgdHlwZWQgbWVzc2FnZS1wYXNzaW5nLg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiMmM2NDgwIiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYjJjNjQ4MCI+V2h5IEFjdG9ycz88L2g0Pg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2IyYzY0ODAiPg0KPHA+SXQgcmFpc2Vz IHRoZSBhYnN0cmFjdGlvbiBvZiBtdWx0aS1jb3JlIHNvIHlvdSBkb27igJl0IGhhdmUgdG8gdGhp bmsgYWJvdXQgdGhyZWFkcyBhbmQgbG93LWxldmVsIG11bHRpdGhyZWFkaW5nIHByaW1pdGl2ZXMs IGFuZCBpbnN0ZWFkIGNhbiBmb2N1cyBvbiBzdHJ1Y3R1cmluZyB5b3VyIGFwcGxpY2F0aW9uIGlu IHRlcm1zIG9mIGhpZXJhcmNoaWVzIG9mIHByb2Nlc3NlcyB0aGF0IGRvIHNvbWUgd29yaywgYW5k IGhvdyB0aGV5IGNvbW11bmljYXRlDQogd2l0aCBlYWNoIG90aGVyLiA8L3A+DQo8cD5Fcmxhbmcg KGFuZCBieSBleHRlbnNpb24gRWxpeGlyKSBoYXMgYmVlbiBkb2luZyB0aGlzIGZvciBpbXB1cmUg ZnVuY3Rpb25hbCBwcm9ncmFtbWluZyBmb3IgZGVjYWRlcyBub3cgYW5kIGluIG15IGV4cGVyaWVu Y2UgaXQgaXMgYW4gaW5jcmVkaWJseSBwcm9kdWN0aXZlIHdheSBvZiB3b3JraW5nLiBTbyBJ4oCZ bSBob3BpbmcgdG8gZXN0YWJsaXNoIHRoZSBmb3VuZGF0aW9uIGZvciBkb2luZyB0aGlzIGtpbmQg b2YgYXBwbGljYXRpb24gZGV2ZWxvcG1lbnQNCiBidXQgPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ d2l0aCB0eXBlczwvc3Bhbj4uIDwvcD4NCjxibG9ja3F1b3RlPg0KPHA+PGI+TkI6PC9iPiBUaGlz IGlzIHRoZSBkdWFsIG9mIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGVvc3RlcmEv Y2FyYW1lbCI+DQpDYXJhbWVsPC9hPiBwcm9qZWN0LCB3aGljaCBpcyBhbiBhbHRlcm5hdGl2ZSBi YWNrZW5kIGZvciBPQ2FtbCB0aGF0IGNvbXBpbGVzIHRvIENvcmUgRXJsYW5nLCB0aHVzIGxldHRp bmcgeW91IHJ1bg0KPHNwYW4gY2xhc3M9InVuZGVybGluZSI+c29tZTwvc3Bhbj4gT0NhbWwgb24g dGhlIEVybGFuZyBWTS4gPC9wPg0KPC9ibG9ja3F1b3RlPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2U0ZDE4NDQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdlNGQxODQ0Ij5HZXR0aW5nIFN0YXJ0ZWQ8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2U0ZDE4NDQiPg0KPHA+WW91IGNhbiBnZXQgc3RhcnRlZCB3 aXRoOiA8Y29kZT5vcGFtIGluc3RhbGwgcmlvdDwvY29kZT4gPC9wPg0KPC9kaXY+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2QzYTlmZDUiPjwvYT5IZWxsbyB3b3JsZDxicj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdkM2E5ZmQ1Ij4NCjxwPlRo ZSBzaW1wbGVzdCBSaW90IHByb2dyYW0geW91IGNhbiB3cml0ZSBpcyB0aGlzOiA8L3A+DQo8ZGl2 IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SaW90Ljwvc3Bhbj5ydW4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7IHByaW50X2VuZGxpbmUgPHNw YW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7aGVsbG8gd29ybGQmcXVvdDs8L3NwYW4+ DQo8L3ByZT4NCjwvZGl2Pg0KPHA+QnV0IHRoZXJl4oCZcyBhIHNtYWxsIGNhdmVhdCBoZXJlOiB0 aGlzIHByb2dyYW0gPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ZG9lc27igJl0IHRlcm1pbmF0ZTwv c3Bhbj4uDQo8L3A+DQo8cD5SaW90LCBsaWtlIHRoZSBFcmxhbmcgVk0sIGlzIGRlc2lnbmVkIGZv ciBsb25nLXJ1bm5pbmcgYXBwbGljYXRpb25zLiBEZXNwaXRlIHRoaXMsIGl0IHN0YXJ0cyB1cCBy ZWFzb25hYmx5IGZhc3QgKDxjb2RlPjRtcyBvbiBhIDEwLWNvcmUgTTEgTWF4KS4gVG8gdGVybWlu YXRlIHRoZSBydW50aW1lIHdlIG11c3QgY2FsbCB+UmlvdC5zaHV0ZG93biAoKTwvY29kZT4uDQo8 L3A+DQo8cD5UaGUgc21hbGxlc3QgUmlvdCBwcm9ncmFtIGlzIHRoZW46IDxjb2RlPlJpb3QuKHJ1 biBzaHV0ZG93bik8L2NvZGU+IDwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1NTkzOTlhIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnNTU5Mzk5YSI+SGVsbG8gd29ybGQsIHdpdGggbWVzc2FnZXMhPC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc1NTkzOTlhIj4NCjxwPlRoZSBuZXh0 IHNtYWxsZXN0IFJpb3QgcHJvZ3JhbSB5b3UgY2FuIHdyaXRlIGlzIGEgaGVsbG8td29ybGQgdGhh dCB1c2VzIFByb2Nlc3NlcyBhbmQgTWVzc2FnZXM6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3Jj LWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b3BlbiA8L3NwYW4+PHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+UmlvdDwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5NZXNzYWdlLjwvc3Bhbj50ICYjNDM7PSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5IZWxsb193b3JsZDwvc3Bhbj4NCg0KPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4g KCkgPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SaW90Ljwvc3Bhbj5ydW4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7DQogIDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJ1bnRpbWUuTG9nLjwvc3Bhbj5zZXRfbG9nX2xldmVs ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5Tb21lPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29s b3I6ICNmY2Y3ZWY7Ij5JbmZvPC9zcGFuPik7DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPnBpZDwvc3Bhbj4gPQ0KICAgIHNwYXduICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZm MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiAoKSAtJmd0Ow0KICAgICAgICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bWF0Y2g8L3NwYW4+ IHJlY2VpdmUgKCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9s ZDsiPndpdGg8L3NwYW4+DQogICAgICAgIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+SGVsbG9fd29ybGQ8L3NwYW4+IC0mZ3Q7DQogICAg ICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SdW50aW1lLkxvZy48L3NwYW4+ aW5mbyAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1 bjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+Zjwvc3Bhbj4gLSZndDsgZiA8 c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtoZWxsbyB3b3JsZCBmcm9tICVhISZx dW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UGlkLjwvc3Bhbj5wcCAo c2VsZiAoKSkpKQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+aW48L3NwYW4+DQogIHNlbmQgcGlkIEhlbGxvX3dvcmxkDQo8L3ByZT4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzRhM2EyMTkiIGNs YXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc0YTNhMjE5Ij5IZWxsbyB3b3JsZCwgd2l0aCBh cHBsaWNhdGlvbnM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y ZzRhM2EyMTkiPg0KPHA+T25jZSB5b3Ugd2FudCB0byBzdGFydCBidWlsZGluZyBhcHBsaWNhdGlv bnMgd2l0aCBzdXBlcnZpc2lvbiB0cmVlcywgdG8gbmljZWx5IGRlY291cGxlIHRoZSBzdWJzeXN0 ZW1zIG9mIHlvdXIgYXBwLCB5b3UgY2FuIHVzZSB0aGUNCjxjb2RlPkFwcGxpY2F0aW9uPC9jb2Rl PiBpbnRlcmZhY2UsIGFuZCA8Y29kZT5SaW90LnN0YXJ0IH5hcHBzPC9jb2RlPjogPC9wPg0KPGRp diBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm1vZHVsZTwv c3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TXlfYXBwPC9zcGFuPiA9IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zdHJ1Y3Q8L3NwYW4+ DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnN0YXJ0PC9zcGFuPiAoKSA9DQog ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnBpZDwvc3Bhbj4gPSBzcGF3bl9s aW5rICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVu PC9zcGFuPiAoKSAtJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6 IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPi4uLiBkbyB3b3JrISAuLi48L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAj OGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPk9rPC9zcGFu PiBwaWQNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5l bmQ8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJpb3QuPC9zcGFuPnN0 YXJ0IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5hcHBzPC9zcGFuPjpbDQogICg8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SaW90LkxvZ2dlcjwvc3Bhbj4pOyA8c3Bh biBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPndlIHdhbnQg dG8gc3RhcnQgdGhlIGxvZ2dlciBhcHAgZmlyc3Q8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAj OGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+DQogICg8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SaW90LlRlbGVtZXRyeTwvc3Bhbj4pOyA8c3BhbiBzdHls ZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPndlIHRoZW4gc3RhcnQg dGhlIHRlbGVtZXRyeSBhcHA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250 LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+DQogICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZm MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5NeV9kYjwvc3Bhbj4pOyA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7 IGZvbnQtc3R5bGU6IGl0YWxpYzsiPnRoZW4gc3RhcnQgdGhlIGRhdGFiYXNlIHNlcnZlcjwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwv c3Bhbj4NCiAgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5tb2R1bGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk15X2FwcDwvc3Bh bj4pOyA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigq IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PmZpbmFsbHkgd2Ugc3RhcnQgb3VyIGFwcDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZm NGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCl0gKCkNCjwvcHJlPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjZhYTMxOCIg Y2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzI2YWEzMTgiPk5leHQgU3RlcHM8L2g0Pg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzI2YWEzMTgiPg0KPHA+SWYg eW914oCZcmUgaW50ZXJlc3RlZCBpbiB0cnlpbmcgUmlvdCwgSeKAmXZlIHN0YXJ0ZWQgd29ya2lu ZyBvbiBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sZW9zdGVyYS9yaW90L3RyZWUvbWFp bi9leGFtcGxlcyNyZWFkbWUiPg0KdHV0b3JpYWw8L2E+IHRoYXQgc3RhcnRzIGZyb20gemVybyBh bmQgd29ya3MgaXRzIHdheSB1cC4gSXTigJlzIG5vdCBjb21wbGV0ZSB5ZXQgYnV0IGl0IHNob3Vs ZCBnZXQgeW91IHVwIGFuZCBydW5uaW5nIGFuZCBidWlsZGluZyBpbnRlcmVzdGluZyBwcm9ncmFt cyENCjwvcD4NCjxwPknigJlkIGxvdmUgYW55IGZlZWRiYWNrIHnigJlhbGwgaGF2ZSBhYm91dCB0 aGlzIDopIGVzcGVjaWFsbHkgaW50ZXJlc3RlZCBpbiB3aGF0IHdvdWxkIHlvdSBsaWtlIHRvIGJ1 aWxkIHdpdGggaXQgb3Igd2hhdCBsaWJyYXJpZXMgeW914oCZZCBsaWtlIHRvIHVzZSBpbiB0aGlz IHNwYWNlLg0KPC9wPg0KPHA+QWxzbyBoYXBweSB0byBhbnN3ZXIgYW55IHF1ZXN0aW9ucyA6RCA8 L3A+DQo8cD4vIExlYW5kcm8gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MiI+Q2FwZXIgMC45PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0y Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Y2FwZXItMC05LzEzNDY3LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2FwZXIt MC05LzEzNDY3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzAxZmRjNGYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwMWZkYzRmIj5uaWtz dSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzAxZmRjNGYiPg0KPHA+PGEgaHJlZj0iaHR0cDovL2NhcGVyLmNzLmlpdC5lZHUvIj5DYXBlcjwv YT4gaGFzIHJlYWNoZWQgPGI+djAuOTwvYj4uIEl0IGlzIGEgdG9vbCBmb3IgdW5kZXJzdGFuZGlu ZyBhbmQgcHJvY2Vzc2luZyDigJxwY2FwIGV4cHJlc3Npb25z4oCdIChhbHNvIGtub3duIGFzDQo8 aT50Y3BkdW1wIGZpbHRlcnM8L2k+KSB3aGljaCBhcmUgdXNlZCBmb3IgbmV0d29yayBwYWNrZXQg YW5hbHlzaXMuIEl0IGlzIGVudGlyZWx5IHdyaXR0ZW4gaW4gT0NhbWwgYW5kIGluY2x1ZGVzIHBj YXAgYW5hbHlzaXMgbG9naWMsIGEgZnJvbS1zY3JhdGNoIEJQRiBjb21waWxlciwgYW5kIGNvbnZl cnNpb24gdG8vZnJvbSBFbmdsaXNoIGV4cHJlc3Npb25zLg0KPC9wPg0KPHA+WW91IGNhbiB1c2Ug Q2FwZXIgb25saW5lIHRocm91Z2ggdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnRjcGR1bXAub3Jn L2JwZmV4YW0vIj4NCkJQRiBFeGFtPC9hPiBzaXRlLiA8L3A+DQo8cD5DYXBlcuKAmXMgUkVBRE1F IGNvbnRhaW5zIG1vdGl2YXRpb24sIGJ1aWxkaW5nLCBhbmQgdXNhZ2UgZXhhbXBsZXMsIGFuZCBp dHMgQ0hBTkdFTE9HIGRlc2NyaWJlcyByZWNlbnQgdXBkYXRlcy4NCjwvcD4NCjxwPkEgaHVnZSB0 aGFua3MgZ29lcyB0byBDYXBlcuKAmXMgY29udHJpYnV0ZXJzLiBGdXJ0aGVyIGNvbnRyaWJ1dGlv bnMgYW5kIGZlZWRiYWNrIGFyZSB3ZWxjb21lIOKAkyBhIGxpc3Qgb2YgY29udHJpYnV0aW9uIGlk ZWFzIGlzIGluY2x1ZGVkIG9uIENhcGVy4oCZcyB3ZWIgcGFnZS4NCjwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIzIj5PQ2FtbCBVc2VyIFN1cnZleSAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtdXNlci1zdXJ2ZXktMjAyMy8xMzQ2OS8x Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtdXNlci1zdXJ2ZXktMjAy My8xMzQ2OS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2Y3NjUwZjEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmNzY1MGYxIj5LaW0gTmd1 eeG7hW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmdmNzY1MGYxIj4NCjxwPkhpIGV2ZXJ5b25lLCA8L3A+DQo8cD53ZSBhcmUgZGVsaWdodGVk IHRvIGFubm91bmNlIHRoZSA8YSBocmVmPSJodHRwczovL2Zvcm1zLmdsZS9pdGVvUjdRTXpGWHcy bXA4OSI+DQpPQ2FtbCBVc2VyIFN1cnZleSwgMjAyMyBlZGl0aW9uPC9hPi4gV2l0aCB0aGlzIHN1 cnZleSwgdGhlIE9DU0YgaXMgdHJ5aW5nIHRvIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIHRoZSBP Q2FtbCBjb21tdW5pdHkgYW5kIGl0cyBuZWVkcy4gSXQgd291bGQgYmUgdmVyeSBoZWxwZnVsIGlm IHlvdSBjb3VsZCB0YWtlIGEgZmV3IG1pbnV0ZXMgKDEwIHRvIDE1KSB0byBmaWxsIHRoZSBzdXJ2 ZXkgYW5kIHNoYXJlIGl0IHdpdGggb3RoZXIgT0NhbWwgcHJvZ3JhbW1lcnMuDQo8L3A+DQo8cD48 YSBocmVmPSJodHRwczovL2Zvcm1zLmdsZS9pdGVvUjdRTXpGWHcybXA4OSI+aHR0cHM6Ly9mb3Jt cy5nbGUvaXRlb1I3UU16Rlh3Mm1wODk8L2E+DQo8L3A+DQo8cD5UaGUgc3VydmV5IGlzIHJ1biBi eSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1zZi5vcmcvIj5PQ2FtbCBTb2Z0d2FyZSBGb3Vu ZGF0aW9uDQo8L2E+LiBJdCBidWlsZHMgb24gcHJldmlvdXMgaXRlcmF0aW9ucy4gVGhlIHJlc3Vs dHMgd2lsbCBiZSBwdWJsaXNoZWQgaGVyZSBvbiBkaXNjdXNzIGFuZCBvbiB0aGUNCjxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwtc2Yub3JnLyI+d2Vic2l0ZSBvZiB0aGUgT0NTRiA8L2E+LiBUaGUgT0NT RiB3b3VsZCBsaWtlIHRvIHRoYW5rIGFsbCB0aGUgcGVvcGxlIHRoYXQgaGF2ZSBoZWxwZWQgaW4g ZGV2aXNpbmcgdGhpcyBvciBwcmV2aW91cyB2ZXJzaW9ucyBvZiB0aGUgc3VydmV5LiBEb27igJl0 IGhlc2l0YXRlIHRvIGdpdmUgdXMgeW91ciBmZWVkYmFjayAoeW91IGNhbiBwb3N0IGhlcmUgb3Ig c2VuZCBtZSBhIG1lc3NhZ2UvZW1haWwpLg0KPC9wPg0KPHA+VGhlIHN1cnZleSB3aWxsIHJlbWFp biBvcGVuZWQgdW50aWwgRGVjZW1iZXIgOHRoIDIwMjMgKEFPRSkuIFBsZWFzZSB0YWtlIHRoZSBz dXJ2ZXkgYW5kIGRvbuKAmXQgaGVzaXRhdGUgdG8gc2hhcmUgdGhlIGxpbmshDQo8L3A+DQo8cD5T b21lIHJlbWFya3MgcmVnYXJkaW5nIHRoaXMgeWVhcuKAmXMgc3VydmV5OiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+TW9zdCBvZiB0aGUgcXVlc3Rpb25zIGFyZSBzaW1pbGFyIHRvIHRo ZSBvbmVzIGluIHRoZSBwcmV2aW91cyBzdXJ2ZXksIHNvbWUgaGF2ZSBiZWVuIGZpeGVkLCBzb21l IGhhdmUgYmVlbiB1cGRhdGVkIChlLmcuIHRvIGxpc3QgbW9yZSByZWNlbnQgdmVyc2lvbnMgb2Yg dGhlIE9DYW1sIGNvbXBpbGVyKQ0KPC9saT48bGk+QSBuZXcgc2VjdGlvbiBhdCB0aGUgZW5kIG9u IERlbW9ncmFwaGljcywgRGl2ZXJzaXR5IGFuZCBJbmNsdXNpb24uIFRoZSByZWxhdGVkIHF1ZXN0 aW9ucyBhcmUgbW9yZSBwZXJzb25hbCBidXQgYWdhaW4gY29tcGxldGVseSBvcHRpb25hbCBhbmQg d291bGQgZ3JlYXRseSBoZWxwIHVzIGdldCBhIGJldHRlciBwaWN0dXJlIG9mIG91ciBjb21tdW5p dHkgYW5kIGFyZWFzIHdlcmUgdGhlIE9DU0YgY2FuIGhlbHAgaW1wcm92ZSB0aGluZ3MNCjwvbGk+ PGxpPkFnYWluLCB3ZSByZXNvcnRlZCB0byB1c2luZyBHb29nbGUgRm9ybXMuIEkgc3BlbnQgcXVp dGUgc29tZSB0aW1lIHRyeWluZyB0byBmaW5kIGEgdmlhYmxlIGFsdGVybmF0aXZlLCBidXQgbm9u ZSB3ZXJlIHNhdGlzZmFjdG9yeSAoZWl0aGVyIGZyb20gYSB0ZWNobmljYWwsIGFjY2Vzc2liaWxp dHkgb3IgYnVyZWF1Y3JhdGljIHBvaW50IG9mIHZpZXcpLiBJIHVuZGVyc3RhbmQgdGhhdCB0aGlz IGNhbiBiZSBhIGRpc2FwcG9pbnRtZW50IGZvcg0KIHNvbWUuIElmIHlvdSBhcmUgaW50ZXJlc3Rl ZCBpbiBydW5uaW5nIHRoZSBzdXJ2ZXkgbmV4dCB5ZWFyIG9uIGJlaGFsZiBvZiB0aGUgT0NTRiwg Z2V0IGluIHRvdWNoIQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPlNl dCB1cCBPQ2FtbCAyLjEuMjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXNldC11cC1vY2FtbC0yLTEtMi8xMzQ3MC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tc2V0LXVwLW9jYW1sLTItMS0yLzEzNDcwLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjFmZDk1NiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZzYxZmQ5NTYiPlNvcmEgTW9yaW1vdG8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2MWZkOTU2Ij4NCjxwPlRoaXMgcmVsZWFz ZSBjb250YWlucyBhIHdvcmthcm91bmQgZm9yIGFuIHVwc3RyZWFtIGlzc3VlIHRoYXQgaXMgY2F1 c2luZyBwb3N0IHByb2Nlc3MgdG8gYmVjb21lIGluY3JlZGlibHkgc2xvdy4gSWYgeW91IHdvdWxk IGxpa2UgdG8gYWNjZXNzIHJlbGF0ZWQgaW5mb3JtYXRpb24sIGNoZWNrIG91dCB0aGUgUFIuDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcHVsbC83MjQiPmh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9zZXR1cC1vY2FtbC9wdWxsLzcyNDwvYT4NCjwvcD4NCjxw PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9zZXR1cC1vY2FtbC9yZWxlYXNlcy90 YWcvdjIuMS4yIj5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwvcmVsZWFzZXMv dGFnL3YyLjEuMjwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5PQ2FtbC5v cmcgTmV3c2xldHRlcjogT2N0b2JlciAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9vY2FtbC1vcmctbmV3c2xldHRlci1vY3RvYmVyLTIwMjMvMTM0NzMvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItb2N0b2Jlci0y MDIzLzEzNDczLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnODA1MTk2NiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzgwNTE5NjYiPlNhYmlu ZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZzgwNTE5NjYiPg0KPHA+V2VsY29tZSB0byB0aGUgT2N0b2JlciAyMDIzIGVkaXRp b24gb2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyISBUaGlzIHVwZGF0ZSBoYXMgYmVlbiBjb21w aWxlZCBieSB0aGUgT0NhbWwub3JnIHRlYW0uIFlvdSBjYW4gZmluZA0KPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvb2NhbWxvcmctbmV3c2xldHRlciI+cHJldmlvdXMgdXBk YXRlczwvYT4gb24gRGlzY3Vzcy4NCjwvcD4NCjxwPk91ciBnb2FsIGlzIHRvIG1ha2UgT0NhbWwu b3JnIHRoZSBiZXN0IHJlc291cmNlIGZvciBhbnlvbmUgd2hvIHdhbnRzIHRvIGdldCBzdGFydGVk IGFuZCBiZSBwcm9kdWN0aXZlIGluIE9DYW1sLiBUaGUgT0NhbWwub3JnIG5ld3NsZXR0ZXIgcHJv dmlkZXMgYW4gdXBkYXRlIG9uIG91ciBwcm9ncmVzcyB0b3dhcmRzIHRoYXQgZ29hbCBhbmQgYW4g b3ZlcnZpZXcgb2YgdGhlIGNoYW5nZXMgd2UgYXJlIHdvcmtpbmcgb24uDQo8L3A+DQo8cD5XZSBj b3VsZG7igJl0IGRvIGl0IHdpdGhvdXQgYWxsIHRoZSBhbWF6aW5nIE9DYW1sIGNvbW11bml0eSBt ZW1iZXJzIHdobyBoZWxwIHVzIHJldmlldywgcmV2aXNlLCBhbmQgY3JlYXRlIGJldHRlciBPQ2Ft bCBkb2N1bWVudGF0aW9uLiBZb3VyIGZlZWRiYWNrIGVuYWJsZXMgdXMgdG8gYmV0dGVyIHByaW9y aXRpemUgb3VyIHdvcmsgYW5kIG1ha2UgcHJvZ3Jlc3MgdG93YXJkcyBvdXIgZ29hbC4gVGhhbmsg eW91IQ0KPC9wPg0KPHA+VGhpcyBtb250aCwgb3VyIHByaW9yaXRpZXMgd2VyZTogPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPkxlYXJuIEFyZWE6PC9iPiBXZSBjb250aW51ZSBvdXIg ZWZmb3J0cyB0byBtYWtlIE9DYW1sLm9yZyBhIGdyZWF0IHJlc291cmNlIGZvciBsZWFybmluZyBP Q2FtbC4gVGhpcyBtb250aCwgd2XigJl2ZSB2YWxpZGF0ZWQgYSBuZXcgdmVyc2lvbiBvZiB0aGUg ZGVzaWducyBmb3IgdGhlIExlYXJuIGFyZWEsIGFuZCB3ZeKAmXZlIHB1Ymxpc2hlZCB0d28gbmV3 IGRvY3VtZW50YXRpb24gcGFnZXMhDQo8L2xpPjxsaT48Yj5PdXRyZWFjaHkgSW50ZXJuc2hpcCBB cHBsaWNhdGlvbiBQZXJpb2Q8L2I+OiBPQ2FtbC5vcmcgaXMgcGFydGljaXBhdGluZyBpbiB0aGUg T3V0cmVhY2h5IEludGVybnNoaXAgUHJvZ3JhbSB3aXRoIHR3byBpbnRlcm5zaGlwIHByb2plY3Rz LiBBcyBwYXJ0IG9mIHRoZSBhcHBsaWNhdGlvbiBwZXJpb2QsIHdl4oCZdmUgcmVjZWl2ZWQgdG9u cyBvZiBmYW50YXN0aWMgY29udHJpYnV0aW9ucyBmcm9tIE91dHJlYWNoeSBhcHBsaWNhbnRzIQ0K PC9saT48bGk+PGI+R2VuZXJhbCBJbXByb3ZlbWVudHM6PC9iPiBBcyB1c3VhbCwgd2UgYWxzbyB3 b3JrZWQgb24gZ2VuZXJhbCBtYWludGVuYW5jZSBhbmQgaW1wcm92ZW1lbnRzIGJhc2VkIG9uIHVz ZXIgZmVlZGJhY2ssIHNvIHdl4oCZcmUgaGlnaGxpZ2h0aW5nIHNvbWUgb2Ygb3VyIHdvcmsgYmVs b3cuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE3 YmQyODciIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcxN2JkMjg3Ij5MZWFybiBBcmVh PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxN2JkMjg3Ij48 L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZTg5YWNmMCI+PC9hPjEu IFJlZGVzaWduIG9mIHRoZSBMZWFybiBBcmVhPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTUiIGlkPSJ0ZXh0LW9yZ2U4OWFjZjAiPg0KPHA+QWZ0ZXIgZ29pbmcgYmFjayB0byB0aGUgZHJh d2luZyBib2FyZCBvbiB0aGUgbmV3IGRlc2lnbnMgZm9yIHRoZSBMZWFybiBhcmVhLCB3ZeKAmXZl IGRlc2lnbmVkIGEgbmV3IHZlcnNpb24gb2YgdGhlIGxhbmRpbmcgcGFnZSwgYWxvbmdzaWRlIHVw ZGF0ZWQgdmFyaWFudHMgb2YgdGhlIENvbW11bml0eSBhbmQgUGFja2FnZSBsYW5kaW5nIHBhZ2Vz LCB0byBlbnN1cmUgdGhleSBhcmUgdmlzdWFsbHkgY29uc2lzdGVudC4gV2XigJl2ZSB2YWxpZGF0 ZWQNCiB0aGUgbmV3IGRlc2lnbiBkaXJlY3Rpb24gYW5kIHdpbGwgYmUgdXBkYXRpbmcgdGhlIGRl c2lnbnMgZm9yIHRoZSByZXN0IG9mIHRoZSBMZWFybiBhcmVhIHBhZ2VzIG5leHQuIE9uY2UgdGhl IGRlc2lnbnMgYXJlIGF2YWlsYWJsZSBmb3IgYWxsIHRoZSBwYWdlcywgd2XigJlsbCBiZSByZWFk eSB0byBzdGFydCBpbXBsZW1lbnRpbmcgdGhlbS4gV2XigJlyZSB2ZXJ5IGV4Y2l0ZWQgdG8gZ2V0 IHRoZSBuZXcgdmVyc2lvbiBvZiB0aGUgcGFnZXMgbGl2ZTsgd2UNCiBob3BlIHlvdSBhcmUgdG9v ISBTdGF5IHR1bmVkISA8L3A+DQo8dGFibGUgYm9yZGVyPSIyIiBjZWxsc3BhY2luZz0iMCIgY2Vs bHBhZGRpbmc9IjYiIHJ1bGVzPSJncm91cHMiIGZyYW1lPSJoc2lkZXMiPg0KPGNvbGdyb3VwPjxj b2wgY2xhc3M9Im9yZy1sZWZ0Ij48Y29sIGNsYXNzPSJvcmctbGVmdCI+PGNvbCBjbGFzcz0ib3Jn LWxlZnQiPjwvY29sZ3JvdXA+DQo8dGhlYWQ+DQo8dHI+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9 Im9yZy1sZWZ0Ij5MZWFybjwvdGg+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5D b21tdW5pdHk8L3RoPg0KPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJvcmctbGVmdCI+UGFja2FnZTwv dGg+DQo8L3RyPg0KPC90aGVhZD4NCjx0Ym9keT4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQi PjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBs b2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvYi9iNzZkNzI3YTJiOTA2NGFhMTNmYWFmYjRhMDY0ODJm ZjA2MzlkNzY1XzJfMjYyeDEwMDAuanBlZyIgYWx0PSJiNzZkNzI3YTJiOTA2NGFhMTNmYWFmYjRh MDY0ODJmZjA2MzlkNzY1XzJfMjYyeDEwMDAuanBlZyI+PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxl ZnQiPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcv dXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvNy83MTUwNTUwNTQ1ZTU2YjA0OTkyYTljMGJhYzNi NDk1M2ZmYTllZjJjXzJfMzI0eDEwMDAucG5nIiBhbHQ9IjcxNTA1NTA1NDVlNTZiMDQ5OTJhOWMw YmFjM2I0OTUzZmZhOWVmMmNfMl8zMjR4MTAwMC5wbmciPjwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1s ZWZ0Ij48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3 L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYLzYvNmY2Zjk0YmY3OWQ1YTYyZWIzODlkNGM1MTNi MzAwODQ0Zjg0YjFiOV8yXzMyOHgxMDAwLmpwZWciIGFsdD0iNmY2Zjk0YmY3OWQ1YTYyZWIzODlk NGM1MTNiMzAwODQ0Zjg0YjFiOV8yXzMyOHgxMDAwLmpwZWciPjwvdGQ+DQo8L3RyPg0KPC90Ym9k eT4NCjwvdGFibGU+DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q29udGludWVkIHdvcmsgb24gPGEgaHJlZj0iaHR0 cHM6Ly93d3cuZmlnbWEuY29tL2ZpbGUvQXFrNXkwM2ZzYUN1aFRTeXdtbVkwNi9PQ2FtbC5vcmct UHVibGljLURlc2lnbnM/dHlwZT1kZXNpZ24mYW1wO25vZGUtaWQ9NTA2JTNBMjE3MiZhbXA7bW9k ZT1kZXNpZ24mYW1wO3Q9eUhaZm42VWNjQ2ptNVFDbi0xIj4NCkZpZ21hIFVYL1VJIGRlc2lnbnM8 L2E+IGZvciB0aGUgbmV3IExlYXJuIGFyZWEgPC9saT48bGk+Qm9va3MgcGFnZSByZWRlc2lnbiAt IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTM2Ij4N Cm9jYW1sL29jYW1sLm9yZyMxNTM2PC9hPiA8L2xpPjxsaT5BZGRlZCBhIHNob3J0IGRlc2NyaXB0 aW9uIHRvIGFsbCBleGVyY2lzZXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzE2ODEiPg0Kb2NhbWwvb2NhbWwub3JnIzE2ODE8L2E+IDwvbGk+PGxpPkNv bGxhcHNlIHRhYiBuYXZpZ2F0aW9uIHRvIGJyZWFkY3J1bWJzIGZvciBtb2JpbGUgdmlldyBvbiBs ZWFybiBhcmVhIC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzE1NDEiPg0Kb2NhbWwvb2NhbWwub3JnIzE1NDE8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0K PC9saT48bGk+PGEgaWQ9Im9yZzFhOTMwODEiPjwvYT4yLiBPQ2FtbCBEb2N1bWVudGF0aW9uPGJy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzFhOTMwODEiPg0KPHA+ TGFzdCBtb250aCwgd2UgYW5ub3VuY2VkIHRoZSBwdWJsaWNhdGlvbiBvZiB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctZ2V0LXN0YXJ0ZWQtZG9jdW1lbnRh dGlvbi1vbi1vY2FtbC1vcmcvMTMyNjkiPg0KbmV3IEdldCBTdGFydGVkIGRvY3VtZW50YXRpb248 L2E+LiBBZnRlciBwdWJsaXNoaW5nIHRoaXMgc2VjdGlvbiwgd2XigJlyZSB0dXJuaW5nIG91ciBm b2N1cyB0byB0aGUgTGFuZ3VhZ2Ugc2VjdGlvbiBvZiB0aGUgZG9jdW1lbnRhdGlvbi4NCjwvcD4N CjxwPlRoaXMgbW9udGgsIHdl4oCZdmUgcHVibGlzaGVkIHR3byBuZXcgZG9jdW1lbnRhdGlvbiBw YWdlczogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1 MTQiPg0KQmFzaWMgRGF0YSBUeXBlczwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTEyIj5GdW5jdGlvbnMgJmFtcDsgVmFsdWVzPC9hPi4g VG9nZXRoZXIsIHRoZXkgdGVhY2ggdGhlIGJhc2ljcyBvZiBPQ2FtbCBmcm9tIHRoZSB2ZXJ5IGJl Z2lubmluZywgc3RhcnRpbmcgd2l0aCB3aGF0IGEgdmFsdWUgYW5kIGEgZnVuY3Rpb24gYXJlLiBI YXZpbmcgd2l0bmVzc2VkIG5ld2NvbWVycyBzdWNoIGFzIE91dHJlYWNoeQ0KIGludGVybnMgc3Ry dWdnbGUgdG8gbGVhcm4gT0NhbWwgZnJvbSB0aGUgT0NhbWwub3JnIGRvY3VtZW50YXRpb24gYmVj YXVzZSBpdCByZXF1aXJlZCBhIGxvdCBvZiBwcmlvciBwcm9ncmFtbWluZyBrbm93bGVkZ2UsIHdl 4oCZcmUgZXhjaXRlZCB0byBoYXZlIHRoaXMgbmV3IGNvbnRlbnQgYXZhaWxhYmxlIGZvciBPdXRy ZWFjaHkgaW50ZXJucyBhbmQgYWxsIG5ld2NvbWVycy4gVGhpcyBpcyBhIGZpcnN0IHZlcnNpb24g b2YgdGhlIHBhZ2VzLCBhbmQgd2XigJl2ZQ0KIGFscmVhZHkgcmVjZWl2ZWQgPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy10dXRvcmlhbHMtb24tYmFzaWNzLW9mLW9jYW1s LzEzMzk2Ij4NCmV4Y2VsbGVudCBmZWVkYmFjazwvYT4gdG8gaW1wcm92ZSBpdC4gRG9u4oCZdCBo ZXNpdGF0ZSB0byBzaGFyZSBtb3JlLCB3aGV0aGVyIHlvdeKAmXJlIGEgYmVnaW5uZXIgc3RydWdn bGluZyB0byBnZXQgdXAgYW5kIHJ1bm5pbmcsIG9yIGFuIE9DYW1sIGRldmVsb3BlciB3aXRoIG9w aW5pb25zIG9uIGhvdyB3ZSBzaG91bGQgdGVhY2ggT0NhbWwhDQo8L3A+DQo8cD5XZeKAmXJlIGN1 cnJlbnRseSByZXZpZXdpbmcgdHdvIG90aGVyIGRvY3VtZW50YXRpb24gcGFnZXMgb24gTXV0YWJp bGl0eSBhbmQgUG9seW1vcnBoaWMgVmFyaWFudHMuIFRoZXkgc2hvdWxkIGJlIHJlYWR5IGZvciBj b21tdW5pdHkgcmV2aWV3IHNvb24uDQo8L3A+DQo8cD5TdGF5IHR1bmVkLCBhbmQgcGxlYXNlLCBr ZWVwIHRoZSBmZWVkYmFjayBvbiB0aGUgbmV3IGRvY3VtZW50YXRpb24gY29taW5nOyBpdOKAmXMg YmVlbiBhIGJsYXN0IHRvIHNlZSBzbyBtdWNoIGVuZ2FnZW1lbnQgZnJvbSB0aGUgY29tbXVuaXR5 IQ0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPkluIFByb2dyZXNzOjwvYj4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5TZXRzIDwvbGk+PGxpPk1hcHMgPC9saT48L3VsPg0KPC9saT48bGk+PGI+SW4g UmV2aWV3IChpbnRlcm5hbCk6PC9iPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTI5Ij5NdXRhYmxlIFN0 YXRlIC8gSW1wZXJhdGl2ZSBQcm9ncmFtbWluZzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTMxIj5Qb2x5bW9ycGhpYyBWYXJp YW50czwvYT4NCjwvbGk+PC91bD4NCjwvbGk+PGxpPjxiPkluIFJldmlldyAoY29tbXVuaXR5KTo8 L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MDAiPkZpbGUgTWFuaXB1bGF0aW9uPC9hPiAoc2VlDQo8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaGVscC1yZXZpZXctdGhlLW5ldy1m aWxlLW1hbmlwdWxhdGlvbi10dXRvcmlhbC1vbi1vY2FtbC1vcmcvMTI2MzgiPg0KRGlzY3VzcyBU aHJlYWQ8L2E+KSA8L2xpPjwvdWw+DQo8L2xpPjxsaT48Yj5QdWJsaXNoZWQ6PC9iPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8xNTE0Ij5CYXNpYyBEYXRhIFR5cGVzPC9hPiAoc2VlDQo8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLXR1dG9yaWFsLXJldmFtcGluZy1jb250 ZC1iYXNpYy1kYXRhdHlwZXMvMTI5ODUiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUxMiI+RnVu Y3Rpb25zIGFuZCBWYWx1ZXM8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1vcmctdHV0b3JpYWwtcmV2YW1waW5nLWNvbmQtdmFsdWVzLWFuZC1mdW5j dGlvbnMvMTMwMDUiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9kb2NzL2luc3RhbGxpbmctb2NhbWwiPkluc3RhbGxpbmcgT0NhbWw8L2E+ IChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hlbHAtcmV2YW1waW5n LXRoZS1nZXR0aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWluLW9jYW1sLW9yZy8xMjc0OSI+DQpEaXNj dXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mv dG91ci1vZi1vY2FtbCI+QSBUb3VyIE9mIE9DYW1sPC9hPiAoc2VlIDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxwLXJldmFtcGluZy10aGUtZ2V0dGluZy1zdGFydGVkLXR1 dG9yaWFscy1pbi1vY2FtbC1vcmcvMTI3NDkiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxs aT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3lvdXItZmlyc3QtcHJvZ3JhbSI+WW91 ciBGaXJzdCBPQ2FtbCBQcm9ncmFtPC9hPiAoc2VlDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvaGVscC1yZXZhbXBpbmctdGhlLWdldHRpbmctc3RhcnRlZC10dXRvcmlhbHMt aW4tb2NhbWwtb3JnLzEyNzQ5Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9vcGFtLXN3aXRjaC1pbnRyb2R1Y3Rpb24iPkludHJv ZHVjdGlvbiB0byBvcGFtIFN3aXRjaGVzPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC5vcmcvZG9jcy9hcm02NC1maXgiPkZpeCBIb21lYnJldyBFcnJvcnMgb24gQXBwbGUgTTE8 L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL29wZXJhdG9ycyI+ T3BlcmF0b3JzPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL2Vy cm9yLWhhbmRsaW5nIj5FcnJvciBIYW5kbGluZzwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1nZXQtc3RhcnRlZC1kb2N1bWVudGF0aW9uLW9uLW9j YW1sLW9yZy8xMzI2OSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vb2NhbWwub3JnL2RvY3MvYXJyYXlzIj5BcnJheXM8L2E+IChzZWUgPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZlZWRiYWNrLW5lZWRlZC1uZXctYXJyYXlzLXR1dG9y aWFsLW9uLW9jYW1sLW9yZy8xMjY4MyI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mvc2VxdWVuY2VzIj5TZXF1ZW5jZXM8L2E+IChz ZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NyZWF0aW5nLWEtdHV0b3Jp YWwtb24tc2VxdWVuY2VzLzEyMDkxIj4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48L3VsPg0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzMyMjE0ZWQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczMjIx NGVkIj5PdXRyZWFjaHk8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZzMyMjE0ZWQiPg0KPHA+T0NhbWwub3JnIGlzIHBhcnRpY2lwYXRpbmcgaW4gdGhlIDxhIGhy ZWY9Imh0dHBzOi8vd3d3Lm91dHJlYWNoeS5vcmcvIj5PdXRyZWFjaHkgSW50ZXJuc2hpcCBQcm9n cmFtPC9hPi4gT3V0cmVhY2h5IHByb3ZpZGVzIGludGVybnNoaXBzIHRvIHBlb3BsZSBzdWJqZWN0 IHRvIHN5c3RlbWljIGJpYXMgYW5kIGltcGFjdGVkIGJ5IHVuZGVycmVwcmVzZW50YXRpb24gaW4g dGhlIHRlY2huaWNhbCBpbmR1c3RyeSB3aGVyZSB0aGV5IGFyZSBsaXZpbmcuDQo8L3A+DQo8cD5B IHN1YnN0YW50aWFsIHBhcnQgb2YgdGhpcyBtb250aCBoYXMgYmVlbiBzcGVudCBvbiBjcmVhdGlu ZyBpc3N1ZXMsIHJldmlld2luZyBwdWxsIHJlcXVlc3RzLCBhbmQgbWVudG9yaW5nIE91dHJlYWNo eSBhcHBsaWNhbnRzIG9uIHRoZSBPQ2FtbCBEaXNjb3JkIHNlcnZlci4NCjwvcD4NCjxwPlRoZSBj b250cmlidXRpb25zIGluY2x1ZGUgc21hbGwgZml4ZXMsIGltcGxlbWVudGluZyBGaWdtYSBkZXNp Z25zLCBhbmQgc21hbGwgZmVhdHVyZSBhZGRpdGlvbnMuIE5vdGFibHksIHRoZQ0KPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nIj5PQ2FtbCBDaGFuZ2Vsb2c8L2E+IG5vdyBoYXMg YW4gUlNTIGZlZWQsIGFuZCBzb21lIG91dHN0YW5kaW5nIGRlc2lnbnMgZm9yIHRoZSBwYWNrYWdl IGFyZWEgaGF2ZSBiZWVuIGFwcGxpZWQuDQo8L3A+DQo8cD44IG91dCBvZiB0aGUgMjEgbWVkaXVt IGRpZmZpY3VsdHkgaXNzdWVzIGhhdmUgYmVlbiBjb21wbGV0ZWQgaW4gT2N0b2Jlciwgd2hpbGUg b25seSA2IG91dCBvZiAzMCBzaW1wbGUgb3V0cmVhY2h5IGlzc3VlcyByZW1haW4gb3Blbi4gRm9y IHRoZSByZW1haW5pbmcgaXNzdWVzLCB3ZSB3aWxsIHN1cHBvcnQgdGhlIGNvbnRyaWJ1dG9ycyBp biBmaW5pc2hpbmcgdGhlaXIgd29yaywgYW5kIGZyZWUgYW55IGFiYW5kb25lZCBpc3N1ZXMgc28g dGhhdA0KIGNvbW11bml0eSBtZW1iZXJzIGNhbiBwaWNrIHRoZW0gdXAuIDwvcD4NCjxwPjxiPlJl bGV2YW50IFBScyBhbmQgQWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5PcGVuZWQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9p c3N1ZXM/cT1pcyUzQWlzc3VlJiM0MztpcyUzQW9wZW4mIzQzO2xhYmVsJTNBb3V0cmVhY2h5Ij4N CjMwIHNpbXBsZSBpc3N1ZXMgdGFnZ2VkIOKAnG91dHJlYWNoeeKAnTwvYT4sIGFuZCA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL2lzc3Vlcz9xPWlzJTNBaXNzdWUm IzQzO2lzJTNBb3BlbiYjNDM7bGFiZWwlM0FvdXRyZWFjaHktbWVkaXVtIj4NCjIxIGlzc3VlcyB0 YWdnZWQg4oCcb3V0cmVhY2h5LW1lZGl1beKAnTwvYT4gPC9saT48bGk+UmVmYWN0b3IgJiM0Mzsg c2ltcGxpZnkgbGVhcm4gbGF5b3V0IGluIHByZXBhcmF0aW9uIGZvciBuZXcgZm9vdGVyIC0gPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1OTAiPg0Kb2Nh bWwvb2NhbWwub3JnIzE1OTA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9hZGVtb2xhb21vc2FueWEiPkBhZGVtb2xhb21vc2FueWE8L2E+IGNvbnRyaWJ1dGVkOiBSZWFy cmFuZ2VkIGFuZCBjaGFuZ2VkIGxpbmtzIGluIGZvb3RlciAtDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTYxNiI+b2NhbWwvb2NhbWwub3JnIzE2MTY8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9JZGFyYU5hYnVrIj5ASWRh cmFOYWJ1azwvYT4gY29udHJpYnV0ZWQ6IFVwZGF0ZSBUYWlsd2luZCBDb25maWd1cmF0aW9uIHRv IFJlc29sdmUgV2FybmluZ3MgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzE2MjAiPm9jYW1sL29jYW1sLm9yZyMxNjIwPC9hPiA8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3PC9hPiBjb250cmli dXRlZDogQWRkIGEgUlNTIGZlZWQgZm9yIGNoYW5nZWxvZyAtDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTU5MyI+b2NhbWwvb2NhbWwub3JnIzE1OTM8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zb3BoaWF0dW5qaSI+QHNv cGhpYXR1bmppPC9hPiBjb250cmlidXRlZDogUmVuYW1lZCDigJxwcm9ibGVtc+KAnSB3aXRoIOKA nGV4ZXJjaXNlc+KAnSBpbiBmaWxlbmFtZXMgYW5kIGNvZGViYXNlIC0NCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTkyIj5vY2FtbC9vY2FtbC5vcmcj MTU5MjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2thbGlvMDA3Ij5A a2FsaW8wMDc8L2E+IGNvbnRyaWJ1dGVkOiBBZGQgYSDigJxTdGFuZGFyZCBMaWJyYXJ5IEFQSeKA nSBsaW5rIHRvIHRoZSBtb2JpbGUgbmF2aWdhdGlvbiBtZW51IC0NCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjAwIj5vY2FtbC9vY2FtbC5vcmcjMTYw MDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JXVUJBS1dBTkFZTyI+ QFJXVUJBS1dBTkFZTzwvYT4gY29udHJpYnV0ZWQ6IEZpeCBzZWFyY2ggYmFyIG9uIG1lZGl1bS1z aXplZCBzY3JlZW5zIC0NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xNjY1Ij5vY2FtbC9vY2FtbC5vcmcjMTY2NTwvYT4gPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3NoeXVzdTQiPkBzaHl1c3U0PC9hPiBjb250cmlidXRlZDogRml4 IGp1bXAgdG8gZGVmaW5pdGlvbiBvbiBpbi1wYWNrYWdlIHNlYXJjaCBmb3IgU2FmYXJpIC0NCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjM0Ij5vY2Ft bC9vY2FtbC5vcmcjMTYzNDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L0ZhdHVtYUEiPkBGYXR1bWFBPC9hPiBjb250cmlidXRlZDogRml4IGhvcml6b250YWwgc2Nyb2xs aW5nIG9uIG9jYW1sIGVjb3N5c3RlbSBzZWN0aW9uIG9mIGhvbWVwYWdlIC0NCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjY4Ij5vY2FtbC9vY2FtbC5v cmcjMTY2ODwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0FuZHJvR2Vu aXVzLWNvZGVzIj5AQW5kcm9HZW5pdXMtY29kZXM8L2E+IGNvbnRyaWJ1dGVkOiBBcHBsaWVkIG5l dyBkZXNpZ24gZm9yIFBhY2thZ2UgU2VhcmNoIERyb3Bkb3duIC0NCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjA4Ij5vY2FtbC9vY2FtbC5vcmcjMTYw ODwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hlbmlsR29uZGFsaWEi PkBoZW5pbEdvbmRhbGlhPC9hPiBjb250cmlidXRlZDogQXBwbGllZCBOZXcgU3R5bGVzIHRvIFBh Y2thZ2UgRG9jdW1lbnRhdGlvbiBNb2R1bGUgTmF2aWdhdGlvbiAtDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTYzOCI+b2NhbWwvb2NhbWwub3JnIzE2 Mzg8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9HaXJpc2gtSmFuZ2Ft Ij5AR2lyaXNoLUphbmdhbTwvYT4gY29udHJpYnV0ZWQ6IFBhZ2luYXRlIHBhY2thZ2Ugc2VhcmNo IHJlc3VsdHMgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzE2NTciPm9jYW1sL29jYW1sLm9yZyMxNjU3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vc29waGlhdHVuamkiPkBzb3BoaWF0dW5qaTwvYT4gY29udHJpYnV0ZWQ6 IEZpeGVkIGpzLW9mLW9jYW1sIGxpbmsgb24gaG9tZSAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTcwNyI+b2NhbWwvb2NhbWwub3JnIzE3MDc8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9CdXJubGV5ZGV2MSI+QEJ1cm5s ZXlkZXYxPC9hPiBjb250cmlidXRlZDogQWRkIEFib25nd2HigJlzIHN1bW1lciBpbnRlcm5zaGlw IGluZm8gLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzE2NDciPm9jYW1sL29jYW1sLm9yZyMxNjQ3PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vUldVQkFLV0FOQVlPIj5AUldVQkFLV0FOQVlPPC9hPiBjb250cmlidXRlZDog QWRkIGxpbmsgdG8gRW5nbGlzaCBlZGl0aW9uIG9mIHRoZSBib29rIOKAnETDqXZlbG9wcGVtZW50 IGTigJlhcHBsaWNhdGlvbnMgYXZlYyBPYmplY3RpdmUgQ2FtbA0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE2NTkiPm9jYW1sL29jYW1sLm9yZyMxNjU5 PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQXJ5YW5Hb2RhcmEiPkBB cnlhbkdvZGFyYTwvYT4gY29udHJpYnV0ZWQ6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QWRk IEJsb2cgUG9zdCBmb3IgT3V0cmVhY2h5IFN1bW1lciBpbnRlcm5zaGlwLCBTdW1tZXLigJkyMyAt IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjQ5Ij4N Cm9jYW1sL29jYW1sLm9yZyMxNjQ5PC9hPiA8L2xpPjxsaT5BZGQgQmxvZyBsaW5rIGluIHRoZSBz dW1tZXIgaW50ZXJuc2hpcCBwb3N0IC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9wdWxsLzE3MDMjcHVsbHJlcXVlc3RyZXZpZXctMTY5MTI0MTQ4MyI+DQpvY2Ft bC9vY2FtbC5vcmcjMTcwMzwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL21vaGRhcXVpYjE3MSI+QG1vaGRhcXVpYjE3MTwvYT4gY29udHJpYnV0ZWQ6 IFR1dG9yaWFsIEJvdHRvbSBTZWN0aW9uIFN0eWxlcyAoIzE2MDMpDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTYxNyI+b2NhbWwvb2NhbWwub3JnIzE2 MTc8L2E+IC0gc3RhdHVzOiB3YWl0aW5nIGZvciBjb21wbGV0aW9uIG9mIGFub3RoZXIgaXNzdWUN CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9JZGFyYU5hYnVrIj5ASWRhcmFO YWJ1azwvYT4gY29udHJpYnV0ZWQ6IEFkZCBDYXBhYmlsaXR5IGZvciBhIEJvb2sgRW50cnkgdG8g aGF2ZSBNdWx0aXBsZSBMYW5ndWFnZXMgLSAjMTY2Ng0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE2NzkiPm9jYW1sL29jYW1sLm9yZyMxNjc5PC9hPiA8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3llbnVnYTE3Ij5Ab3llbnVnYTE3 PC9hPiBjb250cmlidXRlZDogQWRkIGEgSnVtcCBUbyBUb3AgQnV0dG9uDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTcwMiI+b2NhbWwvb2NhbWwub3Jn IzE3MDI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zb3BoaWF0dW5q aSI+QHNvcGhpYXR1bmppPC9hPiBjb250cmlidXRlZDogTGVhcm4gQXJlYSBGb290ZXIgUmVkZXNp Z24gLQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE2 NDUiPm9jYW1sL29jYW1sLm9yZyMxNjQ1PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTZlZjBmYiIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzU2ZWYwZmIiPkdlbmVyYWwgSW1wcm92ZW1lbnRzPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc1NmVmMGZiIj4NCjxwPlRoaXMgbW9udGgs IHdl4oCZcmUgd2VsY29taW5nIDEgbmV3IGNvbnRyaWJ1dG9yOiA8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhdmVzbngiPkBkYXZlc254 PC9hPiBjaGFuZ2VzIOKAmVVua25vd24gZG9jdW1lbnRhdGlvbiBzdGF0dXPigJkgZnJvbQ0KPGNv ZGU+YTwvY29kZT4gdG8gYSA8Y29kZT5zcGFuPC9jb2RlPiAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNjI4Ij4NCm9jYW1sL29jYW1sLm9yZyMxNjI4 PC9hPiA8L2xpPjwvdWw+DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2Ugbm93IGxvZyBhIG1lc3NhZ2UgaW5zdGVh ZCBvZiBjcmFzaGluZyB3aGVuIGZhaWxpbmcgdG8gcGFyc2UgdGhlIG9wYW0gZmlsZSAtDQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTU3NSI+b2NhbWwv b2NhbWwub3JnIzE1NzU8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjYiPmRyZWFtLWh0bWwgMS4yLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLTEtMC0wLzEyNzg3LzUiPmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0xLTAtMC8xMjc4Ny81PC9hPg0KPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2NmRmY2EzIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnNjZkZmNhMyI+WWF3YXIgQW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzY2ZGZjYTMiPg0KPHA+U21hbGwgYWRk aXRpb24gdG8gYWxsb3cgY2hlY2tpbmcgaWYgYSBub2RlIG9yIGF0dHIgaXMg4oCZbnVsbOKAmSAo aS5lLiBlbXB0eSkuIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIHlvdSBnZXQgYSBub2RlIG9yIGF0 dHIgcGFzc2VkIGluIHRvIHlvdXIgZnVuY3Rpb24gYW5kIHlvdSBuZWVkIHRvIGRlY2lkZSB3aGF0 IHRvIHJlbmRlciBkZXBlbmRpbmcgb24gd2hldGhlciBpdOKAmXMgZW1wdHkgb3Igbm90Lg0KPC9w Pg0KPHA+QXMgYSByZW1pbmRlciwg4oCZbnVsbOKAmSBvciBlbXB0eSBub2RlcyBhbmQgYXR0cmli dXRlcyBhcmUgb25lcyB3aGljaCBhcmUgc2ltcGx5IG5vdCByZW5kZXJlZCBpbnRvIHRoZSBmaW5h bCBIVE1MLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPk5ldyBEcmFmdCBUdXRv cmlhbCBvbiBQb2x5bW9ycGhpYyBWYXJpYW50czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvbmV3LWRyYWZ0LXR1dG9yaWFsLW9uLXBvbHltb3JwaGljLXZhcmlhbnRzLzEz NDg1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy1kcmFmdC10dXRvcmlhbC1v bi1wb2x5bW9ycGhpYy12YXJpYW50cy8xMzQ4NS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkOGFhMWFiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnZDhhYTFhYiI+Q3VpaHRsYXVhYyBBbHZhcmFkbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Q4YWExYWIiPg0KPHA+RGVhciBPQ2Ft bGVycywgPC9wPg0KPHA+VGhlIE9DYW1sLm9yZyBjb250aW51ZXMgd29ya2luZyBvbiBuZXcgdHV0 b3JpYWxzLiBXZSBoYXZlIGEgZHJhZnQgb24gcG9seW1vcnBoaWMgdmFyaWFudHM7IHdl4oCZZCBs aWtlIHlvdXIgZmVlZGJhY2sgb24gaXQ6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ R0ggUFI6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x NTMxIj5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUzMTwvYT4NCjwv bGk+PGxpPk9ubGluZSBkcmFmdDogPGEgaHJlZj0iaHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9k b2NzL3BvbHltb3JwaGljLXZhcmlhbnRzIj5odHRwczovL3N0YWdpbmcub2NhbWwub3JnL2RvY3Mv cG9seW1vcnBoaWMtdmFyaWFudHM8L2E+DQo8L2xpPjwvdWw+DQo8cD5QcmV2aW91c2x5IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctdHV0b3JpYWxzLW9uLWJhc2ljcy1v Zi1vY2FtbCI+DQphbm5vdW5jZWQ8L2E+IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tbmV3LWdldC1zdGFydGVkLWRvY3VtZW50YXRpb24tb24tb2NhbWwtb3JnIj4NCnR1 dG9yaWFsczwvYT4gZm9ybSBhIHNlcmllcy4gPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxp PjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvaW5zdGFsbGluZy1vY2FtbCI+SW5zdGFs bGluZyBPQ2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy90 b3VyLW9mLW9jYW1sIj5BIFRvdXIgb2YgT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL2RvY3MveW91ci1maXJzdC1wcm9ncmFtIj5Zb3VyIEZpcnN0IE9DYW1sIFBy b2dyYW08L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3ZhbHVl cy1hbmQtZnVuY3Rpb25zIj5WYWx1ZXMgYW5kIEZ1bmN0aW9uczwvYT4NCjwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvYmFzaWMtZGF0YS10eXBlcyI+QmFzaWMgRGF0YXR5 cGVzIGFuZCBQYXR0ZXJuIE1hdGNoaW5nPC9hPg0KPC9saT48L29sPg0KPHA+QnV0IHRoaXMgb25l IGlzIG5vdCBpbnRlbmRlZCB0byBmb2xsb3cgcmlnaHQgYWZ0ZXIgdGhvc2UuIEl0IGlzIGRlc2ln bmVkIHRvIGJlIHRha2VuIGJ5IHBlb3BsZSBmYW1pbGlhciB3aXRoIE9DYW1s4oCZcyBiYXNpY3Mg YW5kIHdpbGxpbmcgdG8gbWFzdGVyIHBvbHltb3JwaGljIHZhcmlhbnRzLg0KPC9wPg0KPHA+QXMg YSBkcmFmdCwgaXQgaGFzIGdhcHMsIG1vc3Qgbm90YWJseTogPC9wPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPlRoZSBzZWN0aW9uIG9uIFBlcmZvcm1hbmNlIERyYXdiYWNrcyBuZWVkcyB0byBi ZSBzdHJlbmd0aGVuZWQgPC9saT48bGk+QW4gZXhhbXBsZSBpbnNwaXJlZCBieSBAZ2FycmlndWUg 4oCcQ29kZSByZXVzZSB0aHJvdWdoIHBvbHltb3JwaGljIHZhcmlhbnRz4oCdIHBhcGVyIGlzIG1p c3NpbmcNCjwvbGk+PC91bD4NCjxwPlNoYXJlIHlvdXIgZmVlZGJhY2sgaGVyZSBvciBpbiBHaXRI dWIsIGJ1dCBkbyBub3QgdXNlIHRoZSDigJxDb250cmlidXRl4oCdIGxpbmsgYXQgdGhlIGJvdHRv bSBvZiB0aGUgcGFnZS4NCjwvcD4NCjxwPkhvcGUgaXQgaGVscHMgPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjgiPlBweGxpYiBkZXYgbWVldGluZ3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3BweGxpYi1kZXYtbWVldGluZ3MvMTI0NDEvMTEiPmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzExPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2YTU3Y2UwIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNmE1N2NlMCI+Q29udGludWluZyB0aGlzIHRocmVhZCwg U29uamEgSGVpbnplIHNhaWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzZhNTdjZTAiPg0KPHA+SXQgd2FzIGEgbmljZSBhbmQgc2hvcnQgbWVldGluZyB3aXRo IEBjZWFzdGx1bmQgYW5kIG1lLiBIZXJlIGFyZSB0aGUgbWVldGluZyBub3RlczoNCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGliL3dpa2kvRGV2LW1lZXRpbmctMjEt MTEtMjAyMyI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9wcHhsaWIvd2lraS9EZXYtbWVl dGluZy0yMS0xMS0yMDIzPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPnZh cnJheSAwLjI8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi12YXJy YXktMC0yLzEzNDkyLzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdmFycmF5LTAt Mi8xMzQ5Mi8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc3YmEzZTA0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2JhM2UwNCI+YXJ0LXcg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3 YmEzZTA0Ij4NCjxwPkhlbGxvIGV2ZXJ5b25lLCA8L3A+DQo8cD5J4oCZbSBub3Qgc28gcGxlYXNl ZCB0byBhbm5vdW5jZSBhIGJ1Z2ZpeCByZWxlYXNlIG9mIHRoZSA8Y29kZT52YXJyYXk8L2NvZGU+ IHBhY2thZ2Ugb24gb3BhbS4gVGhpcyBsaWJyYXJ5IHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9u IG9mIGR5bmFtaWMgYXJyYXlzLCB3aGljaCBhdXRvbWF0aWNhbGx5IHJlc2l6ZSBhcyBlbGVtZW50 cyBhcmUgYWRkZWQgb3IgcmVtb3ZlZCBmcm9tIHRoZSBhcnJheS4gSXTigJlzIGJhc2VkIG9uIHRo ZSByZWFsbHkgZnVuDQogcGFwZXIgPGEgaHJlZj0iaHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5l dC9wdWJsaWNhdGlvbi8yMjUxNzQzNjNfVGllcmVkX1ZlY3RvcnNfRWZmaWNpZW50X0R5bmFtaWNf QXJyYXlzX2Zvcl9SYW5rLUJhc2VkX1NlcXVlbmNlcyI+DQrigJxUaWVyZWQgVmVjdG9yczogRWZm aWNpZW50IER5bmFtaWMgQXJyYXlzIGZvciBSYW5rLUJhc2VkIFNlcXVlbmNlc+KAnSBieSBNaWNo YWVsIFQuIEdvb2RyaWNoIGFuZCBKb2huIEcuIEtsb3NzIElJPC9hPi4gV2hlbiBJIGZpcnN0IGhl YXJkIGFib3V0IGl0LCBJIGNvdWxkIG5vdCByZXNpc3QgaW1wbGVtZW50aW5nIHRoaXMgZGF0YXN0 cnVjdHVyZSBiZWNhdXNlIGl0cyBhbGdvcml0aG1pYyBjb21wbGV4aXRpZXMgYXJlIHJhdGhlciBm YW5jeToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Y29kZT5PKDEpPC9jb2RlPiB0 byBnZXQvc2V0IGVsZW1lbnRzIGFueXdoZXJlIGluIHRoZSBhcnJheSA8L2xpPjxsaT48Y29kZT5P KDEpPC9jb2RlPiB0byBhZGQgb3IgcG9wIGFuIGVsZW1lbnQgYXQgdGhlIGZyb250L2JhY2sgb2Yg dGhlIGFycmF5IDwvbGk+PGxpPjxjb2RlPk8o4bWP4oiaTik8L2NvZGU+IHRvIGFkZCBvciBwb3Ag YW4gZWxlbWVudCBhbnl3aGVyZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBhcnJheSAoZm9yIGFueSBr ICZndDs9IDEpDQo8L2xpPjwvdWw+DQo8cD5BbmQgYmVjYXVzZSB0aGVyZeKAmXMgYSBmdW4gd2F5 IG9mIGV4cG9zaW5nIHRoZSBBUEkgdXNpbmcgT0NhbWzigJlzIGZ1bmN0b3JzOiA8L3A+DQo8ZGl2 IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5PbmU8L3NwYW4+ICAgPSA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5WYXJyYXkuQ2lyY3VsYXI8L3NwYW4+ICAgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4g c3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5rPTEgPSZndDsgTyhO KSBjb21wbGV4aXR5IGZvciBpbnNlcnQvZGVsZXRlPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm1vZHVsZTwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VHdvPC9zcGFuPiAgID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+VmFycmF5LlJvb3QgKE9uZSk8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzhm NmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+az0yID0mZ3Q7IE8o4oiaTikgY29tcGxleGl0 eTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5tb2R1bGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlRocmVlPC9z cGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlZhcnJheS5Sb290IChUd28pPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigq IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi Pms9MyA9Jmd0OyBPKMKz4oiaTikgY29tcGxleGl0eTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+ DQo8cD5Nb3JlIGRldGFpbHMgb24gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcnQt dy92YXJyYXkiPmdpdGh1YiByZXBvPC9hPiBhbmQgdGhlDQo8YSBocmVmPSJodHRwczovL2FydC13 LmdpdGh1Yi5pby92YXJyYXkvdmFycmF5L1ZhcnJheS8iPm9ubGluZSBBUEkgZG9jdW1lbnRhdGlv bjwvYT4NCjxpPih3aGljaCBpbmNsdWRlcyBhIHRlYXNlciBmb3Igb2RvYyB1cGNvbWluZyBzZWFy Y2ggZmVhdHVyZSwgdGhhbmtzIHRvIEBFbWlsZVRyb3RpZ25vbiwgQHBhbmdsZXNkIGFuZCB0aGUg d29uZGVyZnVsIG9kb2MgdGVhbSA6aGVhcnQ6ICk8L2k+DQo8L3A+DQo8cD5ZZXQsIEkgbmV2ZXIg cHVibGljbHkgYW5ub3VuY2VkIHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YgdGhpcyBwYWNrYWdlIG9u IG9wYW3igKYgYmVjYXVzZSBJIGRvbuKAmXQgdGhpbmsgZHluYW1pYyBhcnJheXMgYXJlIGFjdHVh bGx5IHVzZWZ1bCB3aGVuIHByb2dyYW1taW5nIGluIE9DYW1sISBVc2luZyBpbnRlZ2VyIGluZGlj ZXMgdG8gYWRkcmVzcyBlbGVtZW50cyBpcyBwcm9uZSB0byDigJxpbmRleCBvdXQgb2YgYm91bmRz 4oCdIGJ1Z3MsIHNvIGl04oCZcyByYXJlbHkNCiB0aGUgcmlnaHQgY2hvaWNlLiBJZiB5b3UgZG8g aGF2ZSBhIHVzZWNhc2UgZm9yIHRoZW0sIEkgd291bGQgbG92ZSB0byBoZWFyIGl0IDopIDwvcD4N CjxwPuKAlCA8L3A+DQo8cD5CdXQgb2ssIHNvLCB3YWl0LCB3aHkgYW0gSSBhbm5vdW5jaW5nIGl0 IG5vdz8gV2VsbCBiZWNhdXNlIEBuLW9zYm9ybmUgZm91bmQgYSBidWcgaW4gbXkgY29kZSB3aGlj aCBjb3VsZCB0cmlnZ2VyIGEgc2VnZmF1bHQhIFRoaXMgdGVycmlibGUgYnVnIHdhcyBvbmx5IGFm ZmVjdGluZyB0aGUgbGVzc2VyLXVzZWQNCjxjb2RlPmRlbGV0ZV9hdDwvY29kZT4gb3BlcmF0aW9u LCBhbmQgc28gaXQgbGF5IGRvcm1hbnQgZm9yIHR3byB5ZWFycy4gVGhpcyB3YXMgYSB2ZXJ5IGR1 bWIgbWlzdGFrZTogVGhpcyBzcGVjaWZpYyBmdW5jdGlvbiB3YXMgbWlzc2luZyBhIGNoZWNrIGZv ciBvdXQgb2YgYm91bmQgaW5kZXhlcyAoaGEhKQ0KPC9wPg0KPHA+V2hpbGUgSSB3b3VsZCBwcmVm ZXIgdG8gYXZvaWQgdGhlIHB1YmxpYyB3YWxrIG9mIHNoYW1lLCBob3cgdGhlIGJ1ZyB3YXMgZGlz Y292ZXJlZCBpcyB0b28gY29vbCBub3QgdG8gc2hhcmU6IEBuLW9zYm9ybmUgYW5kIEBzaHltIHdy b3RlIGENCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1nb3NwZWwvZ29zcGVsIj5H b3NwZWw8L2E+IHNwZWNpZmljYXRpb24gb2YgaG93IHRoZSBWYXJyYXkgbGlicmFyeSBzaG91bGQg YmVoYXZlLCB3aGljaCBlbmFibGVkIHRoZW0gdG8gc3RyZXNzIHRlc3QgaXQgYW5kIGRpc2NvdmVy IGEgY291bnRlci1leGFtcGxlIHdoZXJlIG15IGNvZGUgd2FzIG1pc2JlaGF2aW5nLiBIZXJl4oCZ cyBhbiBleHRyYWN0IG9mIHRoZSBmYXVsdHkgZnVuY3Rpb24gc3BlY2lmaWNhdGlvbiwNCiB3aGVy ZSBHb3NwZWwgc3BlY3MgYXJlIHdyaXR0ZW4gYXMgc3BlY2lhbCBjb21tZW50cyA8Y29kZT4oKkAg Li4uICopPC9jb2RlPiBpbiB0aGUgbWxpIGRvY3VtZW50YXRpb246DQo8L3A+DQo8ZGl2IGNsYXNz PSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlwZTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+J2EgdDwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xv cjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCo8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5AIG11dGFibGUgbW9kZWwgY29udGVu dHMgOiAnYSBzZXF1ZW5jZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQt c3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsg Zm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0 YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Xl5eIEdvc3BlbCBtb2RlbGl6YXRpb24gb2YgdGhlIGFi c3RyYWN0IHZhcnJheSB0eXBlPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBm b250LXN0eWxlOiBpdGFsaWM7Ij4gICAgICAgYXMgYSAmcXVvdDttdXRhYmxlIHNlcXVlbmNlIGNh bGxlZCBjb250ZW50cyZxdW90Ozwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPnZhbDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj YTc2MDFmOyI+ZGVsZXRlX2F0PC9zcGFuPiA6ICdhIHQgLSZndDsgaW50IC0mZ3Q7IHVuaXQNCjxz cGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9udC1zdHlsZTogaXRhbGljOyI+KCoqIDwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5bPC9zcGFuPmRlbGV0ZV9hdCB0IGk8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5dPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzRm Njc3ZjsgZm9udC1zdHlsZTogaXRhbGljOyI+IHJlbW92ZXMgdGhlIGVsZW1lbnQgPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPls8L3NwYW4+dC4oaSk8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij5dPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9udC1z dHlsZTogaXRhbGljOyI+Ljwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9u dC1zdHlsZTogaXRhbGljOyI+ICAgIEV2ZXJ5IGVsZW1lbnQgb24gdGhlIHJpZ2h0IG9mIDwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5bPC9zcGFuPmk8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij5dPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9udC1z dHlsZTogaXRhbGljOyI+IGlzIHNoaWZ0ZWQgYnkgb25lIHRvIHRoZSBsZWZ0LiAqKTwvc3Bhbj4N CjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCo8L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5AIGRl bGV0ZV9hdCB0IGk8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPiAgICBjaGVja3MgaW5zaWRlIGkgdC5jb250ZW50czwvc3Bhbj4NCjxzcGFu IHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICAgIG1vZGlmaWVz IHQuY29udGVudHM8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPiAgICBlbnN1cmVzIHQuY29udGVudHMgPSBvbGQgKHQuY29udGVudHNbLi4o aSAtIDEpXSAmIzQzOyYjNDM7IHQuY29udGVudHNbKGkgJiM0MzsgMSkuLl0pPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0K PC9wcmU+DQo8L2Rpdj4NCjxwPk5vdGUgdGhlIHVzZSBvZiB0aGUga2V5d29yZCA8Y29kZT5vbGQ8 L2NvZGU+IG9uIHRoZSBsYXN0IGxpbmUsIHdoaWNoIGFsbG93cyB0aGUgcG9zdGNvbmRpdGlvbg0K PGNvZGU+ZW5zdXJlczwvY29kZT4gdG8gcmVmZXIgdG8gdGhlIHN0YXRlIG9mIHRoZSBpbnB1dCA8 Yj48Yj5iZWZvcmU8L2I+PC9iPiBpdCB3YXMgaW1wZXJhdGl2ZWx5IG1vZGlmaWVkLiBGb3JtYWwg c3BlY2lmaWNhdGlvbnMgYXJlIGdlbmVyYWxseSByZXNlcnZlZCB0byBzcGVjaWFsaXN0cywgYnV0 IGxvb2sgaG93IHJlYWRhYmxlIHRoaXMgaXMhICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v bi1vc2Jvcm5lL29ydGFjL2Jsb2IvODdmYjA4ZWY5ZTk0ZWEwZDc4MGYzMDM0OGMxMjFhY2I0OTIx NDY3My9leGFtcGxlcy92YXJyYXlfc2lnLm1sI0wxMjAiPnNlZQ0KIHRoZSBmdWxsIHZhcnJheSBz cGVjPC9hPikgPC9wPg0KPHA+R29zcGVsIHNwZWNzIGNhbiB0aGVuIGJlIGludGVycHJldGVkIGJ5 IGEgdmFyaWV0eSBvZiB0b29scy4gVG8gZGlzY292ZXIgdGhpcyBzcGVjaWZpYyBidWcsIEBuLW9z Ym9ybmUgdXNlZA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWdvc3BlbC9vcnRh YyI+T3J0YWM8L2E+IHRvIGF1dG9tYXRpY2FsbHkgdHJhbnNsYXRlIGhpcyBzcGVjaWZpY2F0aW9u IGludG8gYW4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1nb3NwZWwvb3J0YWMv YmxvYi9tYWluL3BsdWdpbnMvcWNoZWNrLXN0bS9SRUFETUUubWQiPg0KZXhlY3V0YWJsZSBRQ2hl Y2stU1RNIHRlc3Q8L2E+IHRvIHNlYXJjaCBmb3IgaW5jb2hlcmVuY2llcyBiZXR3ZWVuIHRoZSBt b2RlbCBhbmQgdGhlIGFjdHVhbCBpbXBsZW1lbnRhdGlvbi4NCjwvcD4NCjxwPlZlcnkgdmVyeSBj b29sIHN0dWZmLiBJZiB5b3UgYXJlIGxvb2tpbmcgZm9yIG1vcmUgcmVzb3VyY2VzIG9uIHRoZSBz dWJqZWN0LCBJIGZvdW5kDQo8YSBocmVmPSJodHRwczovL3d3dy5wYXNjdXR0by5mci9tZWRpYS9k aXNzZXJ0YXRpb24ucGRmI2NoYXB0ZXIuMiI+Q2hhcHRlciAyIG9mIENsw6ltZW50IFBhc2N1dHRv 4oCZcyBQaEQgdGhlc2lzPC9hPiB0byBiZSBhIHZlcnkgbmljZSBpbnRyb2R1Y3Rpb24gdG8gR29z cGVsIHNwZWNpZmljYXRpb25zIDopIChhbmQgbGF0ZXIgY2hhcHRlcnMgZGVzY3JpYmUgaGlzIGN1 dHRpbmcgZWRnZSByZXNlYXJjaCBmb3IgT3J0YWMhKQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2NkNmVlNzkiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmdjZDZlZTc5Ij56YXBhc2hjYW5vbiB0aGVuIHNhaWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2NkNmVlNzkiPg0KPHA+Rm9yIHRob3NlIHNw ZWFraW5nIGZyZW5jaCBhbmQgaW50ZXJlc3RlZCBpbiBHb3NwYWwvT3J0YWMsIHRoZXJl4oCZcyA8 YSBocmVmPSJodHRwczovL3d3dy5pcmlsbC5vcmcvdmlkZW9zL09VUFMvMjAyMi0wNS9vcnRhYy1j bGVtZW50LXBhc2N1dHRvLmh0bWwiPg0KYSB2aWRlbzwvYT4gb2YgQ2zDqW1lbnTigJlzIHRhbGsg Z2l2ZW4gYXQgdGhlIG91cHMgbWVldHVwIGxhc3QgeWVhci4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSIxMCI+Rmlyc3QgcmVsZWFzZSBvZiA8Y29kZT51cm48L2NvZGU+OiBVcm5zIGZv ciBmYXN0IGZ1bmN0aW9uYWwgcmFuZG9tIHNhbXBsaW5nPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtdXJuLXVybnMtZm9yLWZhc3Qt ZnVuY3Rpb25hbC1yYW5kb20tc2FtcGxpbmcvMTM0OTkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtdXJuLXVybnMtZm9yLWZhc3QtZnVuY3Rpb25h bC1yYW5kb20tc2FtcGxpbmcvMTM0OTkvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnOWViYzUyZCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzllYmM1MmQiPkp1c3RpbiBGcmFuayBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzllYmM1MmQiPg0KPHA+SGkgYWxsISBJ4oCZbSBwbGVhc2Vk IHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9sYWVsYXRoL29jYW1sLXVybiI+DQp1cm48L2E+IGEgbGlicmFyeSB0aGF0IGltcGxlbWVu dHMgPGEgaHJlZj0iaHR0cHM6Ly9kbC5hY20ub3JnL2RvaS9wZGYvMTAuMTE0NS8zMTIyOTU1LjMx MjI5NTkiPg0KdXJuczwvYT4sIGEgdmVyeSBuaWZ0eSBwdXJlIGZ1bmN0aW9uYWwgZGF0YSBzdHJ1 Y3R1cmUgZm9yIHJhbmRvbWx5IHNhbXBsaW5nIHdpdGggb3Igd2l0aG91dCByZXBsYWNlbWVudCBm cm9tIHdlaWdodGVkIGRpc2NyZXRlIGRpc3RyaWJ1dGlvbnMgaW4gbG9nIHRpbWUuIEl0IHByb3Zp ZGVzIGltcGxlbWVudGF0aW9ucyBmb3IgdXNpbmcgfmludH5zIGFuZCB+ZmxvYXR+cyBhcyB3ZWln aHRzLCB0aG91Z2ggaXQgY2FuIGJlIGV4dGVuZGVkIHRvIGFueQ0KIG51bWJlciBsaWtlIHRoaW5n IHRoYXQgY2FuIGJlIHVuaWZvcm1seSBzYW1wbGVkIGZyb20uIDwvcD4NCjxwPlRoZSBwYWNrYWdl IGlzIGF2YWlsYWJsZSB0aHJvdWdoIG9wYW0gd2l0aCA8Y29kZT5vcGFtIGluc3RhbGwgdXJuPC9j b2RlPiwgYW5kIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTEiPkRyYWZ0IFR1dG9yaWFsIG9uIE11dGFiaWxpdHks IExvb3BzLCBhbmQgSW1wZXJhdGl2ZSBQcm9ncmFtbWluZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2RyYWZ0LXR1dG9yaWFsLW9uLW11dGFiaWxpdHktbG9vcHMtYW5k LWltcGVyYXRpdmUtcHJvZ3JhbW1pbmcvMTM1MDQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvZHJhZnQtdHV0b3JpYWwtb24tbXV0YWJpbGl0eS1sb29wcy1hbmQtaW1wZXJhdGl2ZS1w cm9ncmFtbWluZy8xMzUwNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdiOGI0ZjI4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYjhiNGYy OCI+Q3VpaHRsYXVhYyBBbHZhcmFkbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2I4YjRmMjgiPg0KPHA+RGVhciBPQ2FtbGVycywgPC9wPg0K PHA+VGhlIE9DYW1sLm9yZyB0ZWFtIGhhcyB5ZXQgYW5vdGhlciBkcmFmdCB0dXRvcmlhbC4gVGhp cyB0aW1lLCB0aGUgdGl0bGUgaXM6IOKAnE11dGFiaWxpdHksIExvb3BzLCBhbmQgSW1wZXJhdGl2 ZSBQcm9ncmFtbWluZ+KAnS4gV2Ugd2FudCB5b3VyIGZlZWRiYWNrIG9uIGl0Og0KPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPkdIIFBSOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTUyOSI+VHV0b3JpYWwgb24gTXV0YWJpbGl0eSBhbmQgSW1w ZXJhdGl2ZSBQcm9ncmFtbWluZzwvYT4NCjwvbGk+PGxpPk9ubGluZSBkcmFmdDogPGEgaHJlZj0i aHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL211dGFiaWxpdHktbG9vcHMtYW5kLWltcGVy YXRpdmUiPg0KTXV0YWJpbGl0eSwgTG9vcHMsIGFuZCBJbXBlcmF0aXZlIFByb2dyYW1taW5nPC9h PiA8L2xpPjwvdWw+DQo8cD5UaGUgPGI+dGFyZ2V0IGF1ZGllbmNlPC9iPiBpcyBkZXZlbG9wZXJz IGxlYXJuaW5nIE9DYW1sLiBObyBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGtub3dsZWRnZSBpcyBh c3N1bWVkLiBIb3dldmVyLCBpdCBjb21lcyBhZnRlciB0aGUg4oCcR2V0IFN0YXJ0ZWTigJ0gc2Vy aWVzOg0KPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwub3JnL2RvY3MvaW5zdGFsbGluZy1vY2FtbCI+SW5zdGFsbGluZyBPQ2FtbDwvYT4gPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy90b3VyLW9mLW9jYW1sIj5BIFRvdXIg b2YgT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MveW91 ci1maXJzdC1wcm9ncmFtIj5Zb3VyIEZpcnN0IE9DYW1sIFByb2dyYW08L2E+DQo8L2xpPjwvb2w+ DQo8cD5BbmQgaXQgY29tZXMgYXQgdGhlIGVuZCBvZiB0aGUg4oCcSW50cm9kdWN0aW9u4oCdIHNl cmllczogPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwub3JnL2RvY3MvdmFsdWVzLWFuZC1mdW5jdGlvbnMiPlZhbHVlcyBhbmQgRnVuY3Rpb25zPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9iYXNpYy1kYXRhLXR5 cGVzIj5CYXNpYyBEYXRhdHlwZXMgYW5kIFBhdHRlcm4gTWF0Y2hpbmc8L2E+DQo8L2xpPjxsaT5J ZiBTdGF0ZW1lbnRzIGFuZCBSZWN1cnNpb25zIDwvbGk+PGxpPkxpc3RzIDwvbGk+PGxpPkxhYmVs bGVkICZhbXA7IE9wdGlvbmFsIEFyZ3VtZW50cyA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3N0 YWdpbmcub2NhbWwub3JnL2RvY3MvbXV0YWJpbGl0eS1sb29wcy1hbmQtaW1wZXJhdGl2ZSI+TXV0 YWJpbGl0eSwgTG9vcHMsIGFuZCBJbXBlcmF0aXZlIFByb2dyYW1taW5nPC9hPg0KPC9saT48L29s Pg0KPHA+QXMgdGhlIHByZXZpb3VzbHkgYW5ub3VuY2VkIGRyYWZ0IG9uIDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctZHJhZnQtdHV0b3JpYWwtb24tcG9seW1vcnBoaWMt dmFyaWFudHMiPg0KcG9seW1vcnBoaWMgdmFyaWFudHM8L2E+IHRoaXMgb25lIGNvbnRhaW5zIG92 ZXJsb29rZWQgaXNzdWVzLiBXZSB3YW50IHRvIG1ha2UgaXQgYmV0dGVyIHdpdGggeW91ciBoZWxw Lg0KPC9wPg0KPHA+U2hhcmUgeW91ciBmZWVkYmFjayBoZXJlIG9yIGluIEdpdEh1YiwgYnV0IGRv IG5vdCB1c2UgdGhlIOKAnENvbnRyaWJ1dGXigJ0gbGluayBhdCB0aGUgYm90dG9tIG9mIHRoZSBz dGFnaW5nIHBhZ2UuDQo8L3A+DQo8cD5Ib3BlIGl0IGhlbHBzIDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEyIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMTIiPkZpcnN0IHJlbGVhc2Ugb2YgcHJldHR5X2V4cHJlc3NpdmU6IEEgUHJl dHR5IEV4cHJlc3NpdmUgUHJpbnRlcjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLXByZXR0eS1leHByZXNzaXZlLWEtcHJldHR5LWV4 cHJlc3NpdmUtcHJpbnRlci8xMzUxNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tZmlyc3QtcmVsZWFzZS1vZi1wcmV0dHktZXhwcmVzc2l2ZS1hLXByZXR0eS1leHByZXNzaXZl LXByaW50ZXIvMTM1MTYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnOTBmNjNlOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzkwZjYzZTki PlNvcmF3ZWUgUG9ybmNoYXJvZW53YXNlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTBmNjNlOSI+DQo8cD5IaSBldmVyeW9uZSEgPC9wPg0K PHA+SSBhbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vc29yYXdlZS9wcmV0dHktZXhwcmVzc2l2ZS1vY2FtbCI+DQo8Y29kZT5wcmV0 dHlfZXhwcmVzc2l2ZTwvY29kZT48L2E+LCBhbiBpbXBsZW1lbnRhdGlvbiBvZiA8YSBocmVmPSJo dHRwczovL2RsLmFjbS5vcmcvZG9pL2Ficy8xMC4xMTQ1LzM2MjI4MzciPg0KQSBQcmV0dHkgRXhw cmVzc2l2ZSBQcmludGVyPC9hPiAoT09QU0xB4oCZMjMpLiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9zb3Jhd2VlLmdpdGh1Yi5pby9wcmV0dHktZXhwcmVz c2l2ZS1vY2FtbC9wcmV0dHlfZXhwcmVzc2l2ZS8iPkRvY3VtZW50YXRpb248L2E+DQo8L2xpPjxs aT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc29yYXdlZS9wcmV0dHktZXhwcmVzc2l2ZS1v Y2FtbCI+UHJvamVjdCBwYWdlPC9hPg0KPC9saT48bGk+b3BhbTogPGNvZGU+b3BhbSBpbnN0YWxs IHByZXR0eV9leHByZXNzaXZlPC9jb2RlPiA8L2xpPjwvdWw+DQo8cD5Vbmxpa2Ugb3RoZXIgcHJl dHR5IHByaW50ZXJzIGluIHRoZSBPQ2FtbCBlY29zeXN0ZW0gd2hpY2ggYXJlIG1vc3RseSBmb2N1 c2VkIG9uIHRoZSBPQ2FtbCBzdHlsZSAoYXMgZmFyIGFzIEkgY2FuIHRlbGwpLA0KPGNvZGU+cHJl dHR5X2V4cHJlc3NpdmU8L2NvZGU+IGlzIGdlbmVyYWwtcHVycG9zZSwgbWFraW5nIGl0IHN1aXRh YmxlIGZvciBmb3JtYXR0aW5nIHZhcmlvdXMgc3R5bGVzICh0aGUgcHJldHR5IHByaW50ZXIgd2Fz IG9yaWdpbmFsbHkgY3JlYXRlZCB0byBmb3JtYXQgcHJvZ3JhbXMgaW4gdGhlIFJhY2tldCBsYW5n dWFnZSkuDQo8Y29kZT5wcmV0dHlfZXhwcmVzc2l2ZTwvY29kZT4gaXMgZnVydGhlciBkaXN0aW5n dWlzaGVkIGZyb20gb3RoZXIgZ2VuZXJhbC1wdXJwb3NlIHByZXR0eSBwcmludGVycyAoZS5nLiwg SHVnaGVz4oCZLCBXYWRsZXLigJlzLCBCZXJuYXJkeeKAmXMpIGJ5IGl0cyBleHByZXNzaXZlbmVz cyBhbmQgb3B0aW1hbGl0eS4NCjwvcD4NCjxwPlRoaXMgaXMgYWxzbyBteSBmaXJzdCBPQ2FtbCBw cm9qZWN0IChub3QgY291bnRpbmcgUmVhc29uKS4gQW55IGZlZWRiYWNrIGlzIHdlbGNvbWUhDQo8 L3A+DQo8cD5UaGFua3MsIFNvcmF3ZWUgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIx MyI+T3RoZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMTMiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmVlMTc4YSIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzJlZTE3OGEiPkZyb20gdGhlIG9jYW1sLm9y ZyBibG9nPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyZWUx NzhhIj4NCjxwPkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVk IGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4NCnRoZSBvY2FtbC5vcmcgYmxv ZzwvYT4uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL3Rh cmlkZXMuY29tL2Jsb2cvMjAyMy0xMS0yMS1ob3ctdG8taW5zdGFsbC1vY2FtbC01LWEtdmlkZW8t dHV0b3JpYWwiPkhvdyB0byBJbnN0YWxsIE9DYW1sIDU6IEEgVmlkZW8gVHV0b3JpYWw8L2E+DQo8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmczN2E0MTU2IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnMzdhNDE1NiI+ T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnMzdh NDE1NiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0i bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2Fn ZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEg aHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9h PiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJz cyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdp c2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIHRv IHRoZSA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0 Ij4NCmNhbWwtbGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmc5 Zjk5MjkyIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFu IFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5 Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 14 Nov 2023 13:42:45 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 14 Nov 2023 13:42:45 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 14 Nov 2023 13:42:45 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AEDgijj007718 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 14 Nov 2023 13:42:44 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AEDgZdr007702 for ; Tue, 14 Nov 2023 13:42:35 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Nov 2023 14:42:33 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6820EE0D5D; Tue, 14 Nov 2023 14:42:33 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id EDC8CE0133 for ; Tue, 14 Nov 2023 14:42:26 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Nov 2023 14:42:25 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3E5C95605DF; Tue, 14 Nov 2023 14:42:23 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaFwBzokCru3787EuS90QTrHiARA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 14 Nov 2023 13:42:00 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 2d7b8308-2125-43b7-f977-08dbe5179561 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,302,1694728800"; d="scan'208,217";a="71441853" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.494893, queueID=046D35605E1 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMS0xNCBUdWUgMTQ6NDAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTEuMDcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMS4yMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE5vdmVtYmVyIDA3IHRvIDE0LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5SZWxlYXNlIG9mIFRvcGlhcnkg MC4zLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5GaXJzdCByZWxlYXNlIG9mIE9DYW1sIGJp bmRpbmdzIHRvIHRoZSBQb2xhcnMgZGF0YWZyYW1lIGxpYnJhcnk8L2E+DQo8L2xpPjxsaT48YSBo cmVmPSIjMyI+SG93LVRvOiBCdWNrIDIgYW5kIE9DYW1sIC0gQnVpbGQgc3lzdGVtPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNCI+UmVsZWFzZSBvZiBNb29ucG9vbCAwLjU8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM1Ij5aaXBjIDAuMS4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+TmV3IFR1dG9y aWFscyBvbiBCYXNpY3Mgb2YgT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5jbGwgMC4y LjAgLSBtdXRhYmxlIGNpcmN1bGFyL2N5Y2xpYyBkb3VibHkgbGlua2VkIGxpc3RzPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjOCI+R2xvYmFsIGRlYWQgY29kZSBlbGltaW5hdGlvbiBpbiBqc19vZl9v Y2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZ2NhZTRkNGYiPk9sZCBDV048L2E+IDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+UmVsZWFzZSBvZiBUb3BpYXJ5IDAuMy4wPC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi10b3BpYXJ5 LTAtMy0wLzEzMzgxLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNl LW9mLXRvcGlhcnktMC0zLTAvMTMzODEvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc0MjU3OTg5IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn NDI1Nzk4OSI+Tmljb2xhcyBKZWFubmVyb2QgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0MjU3OTg5Ij4NCjxwPkhpIGV2ZXJ5b25lLCA8L3A+ DQo8cD5XZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vdHdlYWcvdG9waWFyeS9yZWxlYXNlcy90YWcvdjAuMy4wIj4NClRv cGlhcnkgdjAuMy4wIOKAkyBEcmVhbXkgRHJhY2FlbmE8L2E+LiA8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzllOTRlOTMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmc5ZTk0ZTkzIj5XaGF0IGlzIFRvcGlhcnk/PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc5ZTk0ZTkzIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vdG9w aWFyeS50d2VhZy5pby8iPlRvcGlhcnk8L2E+IGlzIGEgZm9ybWF0dGVyIGZvciBPQ2FtbCBhbmQg YSB1bml2ZXJzYWwgZm9ybWF0dGluZyBlbmdpbmUuIEl0IGlzIGEgdG9vbCBpbiB0aGUgVHJlZS1z aXR0ZXIgZWNvc3lzdGVtLCBkZXNpZ25lZCBmb3IgZm9ybWF0dGVyIGF1dGhvcnMgYW5kIGZvcm1h dHRlciB1c2Vycy4gQXV0aG9ycyBjYW4gY3JlYXRlIGEgZm9ybWF0dGVyIHdpdGhvdXQgaGF2aW5n IHRvIHdyaXRlDQogdGhlaXIgb3duIGVuZ2luZSBvciBldmVuIHRoZWlyIG93biBwYXJzZXIuIFVz ZXJzIGJlbmVmaXQgZnJvbSB1bmlmb3JtIGNvZGUgc3R5bGUgYW5kIHRoZSBjb252ZW5pZW5jZSBv ZiB1c2luZyBhIHNpbmdsZSBmb3JtYXR0ZXIgdG9vbCBhY3Jvc3MgbXVsdGlwbGUgbGFuZ3VhZ2Vz LiBUb3BpYXJ5IGlzIHdyaXR0ZW4gaW4gUnVzdCBhbmQgZGV2ZWxvcGVkIGJ5DQo8YSBocmVmPSJo dHRwczovL3d3dy50d2VhZy5pby8iPlR3ZWFnPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y1Nzc4N2IiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmdmNTc3ODdiIj5XaGF04oCZcyBuZXc/PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmdmNTc3ODdiIj4NCjxwPiZndDtGcm9tIGFuIE9DYW1sIHVz ZXLigJlzIHBlcnNwZWN0aXZlLCB0aGlzIHJlbGVhc2UgbW9zdGx5IGluY2x1ZGVzIHRoZSBmb2xs b3dpbmcgY2hhbmdlczoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XZSA8YSBocmVm PSJodHRwczovL3d3dy50d2VhZy5pby9ibG9nLzIwMjMtMTAtMDUtY2xpLXV4LWluLXRvcGlhcnkv Ij5yZXdvcmtlZCB0aGUgY29tbWFuZCBsaW5lIGludGVyZmFjZTwvYT47IHNlZQ0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3R3ZWFnL3RvcGlhcnkvYmxvYi92MC4zLjAvZG9jcy9taWdyYXRp b24tMC4yLTAuMy5tZCI+DQp0aGUgbWlncmF0aW9uIGd1aWRlPC9hPi4gPC9saT48bGk+V2UgaW1w cm92ZWQgdGhlIGluY2x1ZGVkIGZvcm1hdHRpbmcgZm9yIE9DYW1sIGFuZCBmaXhlZCBpc3N1ZXMu IDwvbGk+PGxpPldlIGFkZGVkIHJvdWdoIHN1cHBvcnQgZm9yIE9DYW1sTGV4LiBUaGlzIGRvZXMg bm90IHlldCBpbmNsdWRlIGluamVjdGVkIE9DYW1sIHBpZWNlcyBvZiBjb2RlIGJ1dA0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL3R3ZWFnL3RvcGlhcnkvaXNzdWVzLzU3OSI+dGhpcyBmZWF0 dXJlIGlzIG9uIGl0cyB3YXk8L2E+Lg0KPC9saT48L3VsPg0KPHA+VGhlcmUgaXMgbW9yZSBidXQg d2Ugd2lsbCBwb2ludCB5b3UgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90d2Vh Zy90b3BpYXJ5L3JlbGVhc2VzL3RhZy92MC4zLjAiPg0KcmVsZWFzZTwvYT4sIHRoZSA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vdHdlYWcvdG9waWFyeS9ibG9iL3YwLjMuMC9DSEFOR0VMT0cu bWQiPg0KY2hhbmdlIGxvZzwvYT4gb3IgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3R3ZWFn L3RvcGlhcnkvY29tcGFyZS92MC4yLjMuLi52MC4zLjAiPg0KYWxsIHRoZSBjaGFuZ2VzPC9hPiBm b3IgdGhvc2UuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc4Njc4ZjQwIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnODY3OGY0MCI+SG93 IHRvIGdldCBpdD88L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y Zzg2NzhmNDAiPg0KPHA+WW91IGNhbiB0cnkgVG9waWFyeSB3aXRob3V0IGluc3RhbGxpbmcgaXQg d2l0aCBvdXIgPGEgaHJlZj0iaHR0cHM6Ly90b3BpYXJ5LnR3ZWFnLmlvL3BsYXlncm91bmQvIj4N Cm9ubGluZSBwbGF5Z3JvdW5kPC9hPi4gVG9waWFyeSBpcyBhbHNvIGF2YWlsYWJsZSB2aWEgT1BB TSBzbyB5b3UgY2FuIHNpbXBseSByZWx5IG9uDQo8Y29kZT5vcGFtIGluc3RhbGwgdG9waWFyeTwv Y29kZT4uIElmIHlvdSBhcmUgY3VyaW91cyBhcyB0byBob3cgd2UgcGFja2FnZWQgYSBSdXN0IHBy b2plY3QgaW4gT1BBTSwgd2UgaGF2ZQ0KPGEgaHJlZj0iaHR0cHM6Ly93d3cudHdlYWcuaW8vYmxv Zy8yMDIzLTA2LTI5LXBhY2thZ2luZy10b3BpYXJ5LWluLW9wYW0vIj5qdXN0IHRoZSBibG9nIHBv c3Q8L2E+LiBOaXggdXNlcnMsIHlvdSBjYW4gZmluZCBUb3BpYXJ5IGluIG5peHBrZ3Mgb3IgcmVs eSBvbiB0aGUgZmxha2UNCjxjb2RlPmdpdGh1Yjp0d2VhZy90b3BpYXJ5PC9jb2RlPi4gRmluYWxs eSwgc2luY2UgdGhpcyB2ZXJzaW9uLCBzdGF0aWNhbGx5LWxpbmtlZCBiaW5hcmllcyBhcmUgYXZh aWxhYmxlIGZvciBkb3dubG9hZCBmcm9tIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L3R3ZWFnL3RvcGlhcnkvcmVsZWFzZXMvdGFnL3YwLjMuMCI+R2l0SHViIHJlbGVhc2U8L2E+Lg0K PC9wPg0KPHA+V2UgaG9wZSB5b3UgbGlrZSBpdDsgZG8gdHJ5LCByZXBvcnQgaXNzdWVzLCBhc2sg Zm9yIGZlYXR1cmVzLCBvciB0ZWxsIHVzIHlvdXIgbG92ZSENCjwvcD4NCjxwPkNoZWVycywgVGhl IFRvcGlhcnkgdGVhbS4gPC9wPg0KPHA+YmxvZy9hbm5vdW5jZTogPGEgaHJlZj0iaHR0cHM6Ly93 d3cudHdlYWcuaW8vYmxvZy8yMDIzLTAzLTA5LWFubm91bmNpbmctdG9waWFyeS8iPg0KaHR0cHM6 Ly93d3cudHdlYWcuaW8vYmxvZy8yMDIzLTAzLTA5LWFubm91bmNpbmctdG9waWFyeS88L2E+IDwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPkZpcnN0IHJlbGVhc2Ugb2Yg T0NhbWwgYmluZGluZ3MgdG8gdGhlIFBvbGFycyBkYXRhZnJhbWUgbGlicmFyeTwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2Ytb2NhbWwt YmluZGluZ3MtdG8tdGhlLXBvbGFycy1kYXRhZnJhbWUtbGlicmFyeS8xMzM4Mi8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi1vY2FtbC1iaW5kaW5n cy10by10aGUtcG9sYXJzLWRhdGFmcmFtZS1saWJyYXJ5LzEzMzgyLzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzdjNTQwMWUiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmc3YzU0MDFlIj5tdF9jYXJldCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzdjNTQwMWUiPg0KPHA+SGkgZXZlcnlv bmUhIDwvcD4NCjxwPknigJltIGV4Y2l0ZWQgdG8gc2hhcmUgYSBwcm9qZWN0IEnigJl2ZSBiZWVu IHdvcmtpbmcgb246IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tdC1jYXJldC9wb2xhcnMt b2NhbWwiPg0KcG9sYXJzLW9jYW1sPC9hPiwgc29tZSBPQ2FtbCBiaW5kaW5ncyB0byB0aGUgUG9s YXJzIGRhdGFmcmFtZSBsaWJyYXJ5LiBJZiB5b3XigJl2ZSBldmVyIHdhbnRlZCB0byBkbyBkYXRh IHNjaWVuY2Ugb3IgdGFidWxhciBkYXRhIHByb2Nlc3NpbmcgaW4gT0NhbWwsIHBsZWFzZSBjb25z aWRlciB0cnlpbmcgdGhpcyBvdXQhDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL3d3dy5wb2xh LnJzLyI+UG9sYXJzPC9hPiBpcyBhIHF1aXRlIHBlcmZvcm1hbnQgZGF0YWZyYW1lIGxpYnJhcnkg d3JpdHRlbiBpbiBSdXN0LCB3aXRoIGFuIEFQSSB0aGF0IGlzIGJ1aWx0IG9uIHRvcCBvZiB0aGUg QXBhY2hlIEFycm93IGZvcm1hdCB3aXRoIGEgZm9jdXMgb24gcGVyZm9ybWFuY2UsIHV0aWxpemlu ZyBwYXJhbGxlbGlzbSBhbmQgU0lNRCB0byBnZXQgcHJldHR5IGJpZyBzcGVlZHVwcyBjb21wYXJl ZA0KIHRvIHJlZ3VsYXIgcmVjb3JkcyBvciBsaWJyYXJpZXMgbGlrZSBwYW5kYXMuIDwvcD4NCjxw Pldl4oCZdmUgcG9ydGVkIG1vc3Qgb2YgdGhlIGV4YW1wbGVzIGluIHRoZSBQb2xhcnMgdXNlciBn dWlkZSB0byBPQ2FtbCBpbiB0aGUgZm9ybSBvZiBleHBlY3QgdGVzdHM6DQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vbXQtY2FyZXQvcG9sYXJzLW9jYW1sL3RyZWUvbWFpbi9ndWlkZSI+aHR0 cHM6Ly9naXRodWIuY29tL210LWNhcmV0L3BvbGFycy1vY2FtbC90cmVlL21haW4vZ3VpZGU8L2E+ IEkgZW5jb3VyYWdlIGZvbGtzIHRvIHRha2UgYSBsb29rIGlmIHlvdeKAmXJlIGludGVyZXN0ZWQg aW4gc2VlaW5nIHNvbWUgZXhhbXBsZXMgb2YgaWRpb21hdGljIHVzYWdlIG9mIHBvbGFycy1vY2Ft bDsgSSB0aGluayB0aGUgbGFiZWxsZWQNCiBhcmd1bWVudHMgYW5kIHVzZSBvZiBHQURUcyBoYXZl IG1hZGUgdGhlIEFQSSBxdWl0ZSBuaWNlIHRvIHdvcmsgd2l0aCEgPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczOTk1Nzg0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnMzk5NTc4NCI+SG93IHRvIGdldCBpdDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnMzk5NTc4NCI+DQo8cD5XZeKAmXZlIGp1c3QgcmVsZWFzZWQg dGhlIGZpcnN0IHZlcnNpb24gdG8gb3BhbSwgc28geW91IGNhbiBpbnN0YWxsIGl0IHdpdGggPGNv ZGU+DQpvcGFtIGluc3RhbGwgcG9sYXJzPC9jb2RlPi4gSXQgYWxzbyB3b3JrcyB3aXRoIE9DYW1s IGp1cHl0ZXIgbm90ZWJvb2tzIHZpYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWthYmUv b2NhbWwtanVweXRlciI+DQpvY2FtbC1qdXB5dGVyPC9hPjogPC9wPg0KPGRpdiBpZD0ib3JnMzk2 ZTUxMyIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291 cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYLzYvNjFlMWU2 NmU1OTc2Y2FhYmVkOWFlZDA5NGZlODk2NDAzMDZkN2IxOF8yXzk3OHgxMDAwLnBuZyIgYWx0PSI2 MWUxZTY2ZTU5NzZjYWFiZWQ5YWVkMDk0ZmU4OTY0MDMwNmQ3YjE4XzJfOTc4eDEwMDAucG5nIj4N CjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2NhNWUwMTMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdjYTVlMDEzIj5Db250 cmlidXRpbmc8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2Nh NWUwMTMiPg0KPHA+SWYgeW91IGZpbmQgYW55IGlzc3VlcyBvciBoYXZlIGFueSBxdWVzdGlvbnMs IGZlZWwgZnJlZSB0byBjb21tZW50IG9yIHJhaXNlIGFuIGlzc3VlIG9uIEdpdEh1Yi4gV2hpbGUg d2XigJl2ZSBleHBvc2VkIGEgZmFpciBhbW91bnQgb2YgcG9sYXJzIGZ1bmN0aW9uYWxpdHksIHRo ZXJl4oCZcyBxdWl0ZSBhIGxvdCBtb3JlIHdlIGhhdmVu4oCZdCBnb3R0ZW4gYXJvdW5kIHRvLCBz byBQUnMgYXJlIHZlcnkgd2VsY29tZSENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjMiPkhvdy1UbzogQnVjayAyIGFuZCBPQ2FtbCAtIEJ1aWxkIHN5c3RlbTwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93LXRvLWJ1Y2stMi1hbmQtb2NhbWwt YnVpbGQtc3lzdGVtLzEzMzM0LzgiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy10 by1idWNrLTItYW5kLW9jYW1sLWJ1aWxkLXN5c3RlbS8xMzMzNC84PC9hPiA8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y3ZTM3YWUiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmdmN2UzN2FlIj5Db250aW51aW5nIHRoaXMgdGhyZWFkLCBSb2xhbmQgQ3Nh c3phciBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZ2Y3ZTM3YWUiPg0KPHA+QWRkZWQgYSBjaGFwdGVyIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUg TWVybGluIGZpbGVzOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1DYW5kaWRh dGUvT0NhbWwtQnVjay0yLUV4YW1wbGVzI3VzaW5nLWJ1Y2stMi13aXRoLW9jYW1sLWxzcC1vci1t ZXJsaW4iPg0KVXNpbmcgQnVjayAyIHdpdGggT0NhbWwtTFNQIG9yIE1lcmxpbjwvYT4gPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPlJlbGVhc2Ugb2YgTW9vbnBvb2wgMC41PC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1tb29ucG9v bC0wLTUvMTMzODcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Ut b2YtbW9vbnBvb2wtMC01LzEzMzg3LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnN2VlNjkxOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzdl ZTY5MTkiPlNpbW9uIENydWFuZXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmc3ZWU2OTE5Ij4NCjxwPkRlYXIgT0NhbWwgZW5qb3llcnMsIDwv cD4NCjxwPknigJltIHF1aXRlIGdpZGR5IGF0IHRoZSBvcHBvcnR1bml0eSB0byBhbm5vdW5jZSB0 aGUgcmVsZWFzZSBvZiBNb29ucG9vbCAwLjUuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9j LWN1YmUvbW9vbnBvb2wiPg0KTW9vbnBvb2w8L2E+IGlzIGEgTUlULWxpY2Vuc2VkIHRocmVhZC1w b29sIGxpYnJhcnkgZm9yIE9DYW1sIDUsIHdpdGggYW4gZXllIHRvd2FyZHMgbWl4ZWQgSU8gYW5k IENQVSB3b3JrbG9hZHMuDQo8L3A+DQo8cD5Nb29ucG9vbOKAmXMgdW5pcXVlW14xXSBkZXNpZ24g YWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBtdWx0aXBsZSB0aHJlYWQgcG9vbHMgdGhhdCBzaGFyZSBh biB1bmRlcmx5aW5nIGRvbWFpbiBwb29sLiBEdWUgdG8gaG93IGRvbWFpbnMgd29yayBpbiBPQ2Ft bCA1LCB0aGVyZSBzaG91bGQgYmUgYXQgbW9zdA0KPGNvZGU+bjwvY29kZT4gZG9tYWlucyBhY3Rp dmUgYXQgb25jZSwgd2hlcmUgPGNvZGU+bjwvY29kZT4gaXMgcm91Z2hseSB0aGUgbnVtYmVyIG9m IGNvcmVzIG9uIHRoZSBtYWNoaW5lLiBGb3IgbWl4ZWQgd29ya2xvYWRzIHRoYXQgcmVseSBvbiB0 aHJlYWRzLCB0aGlzIGlzIG5vdCByZWFsbHkgYWRlcXVhdGUgYXMgaXQgbWVhbnMgdGhhdCBvbmx5 DQo8Y29kZT5uPC9jb2RlPiB0YXNrcyBjYW4gcnVuIG9yIGJsb2NrIG9uIElPIGF0IHRoZSBzYW1l IHRpbWUuIEluc3RlYWQgTW9vbnBvb2wgcGVybWl0cyB0aGUgY3JlYXRpb24gb2YgbWFueSBtb3Jl IHRocmVhZHMsIHBvc3NpYmx5IGluIGluZGVwZW5kZW50IHBvb2xzIChpZS4gd2l0aCBpbmRlcGVu ZGVudCBzY2hlZHVsZXJzKSwgZm9yIGRpZmZlcmVudCB3b3JrbG9hZHMuDQo8L3A+DQo8cD5Nb29u cG9vbCBhbHNvIHByb3ZpZGVzIHNvbWUgY29uY3VycmVuY3kgcHJpbWl0aXZlcyBzdWNoIGFzIGZ1 dHVyZXMsIGxvY2tzLCBhbmQgYSBibG9ja2luZyBxdWV1ZS4NCjwvcD4NCjxwPlRoaXMgcmVsZWFz ZSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9tb29ucG9vbC9yZWxlYXNlcy90 YWcvdjAuNSI+Y2hhbmdlbG9nPC9hPikgaGFzIHNlZW4gYSBsb3Qgb2YgY2hhbmdlIGluIE1vb25w b29sOiB0aGVyZSBhcmUgbm93IHR3byBkaXN0aW5jdCBwb29sIGltcGxlbWVudGF0aW9ucyB0aGF0 IGFiaWRlIGJ5IHRoZSBzYW1lDQo8Y29kZT5SdW5uZXI8L2NvZGU+IGludGVyZmFjZTogPC9wPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPuKAnGZpZm/igJ0gcG9vbDogYSBzaW1wbGUgcG9vbCB3 aXRoIGEgc2luZ2xlIGJsb2NraW5nIHF1ZXVlIGZvciB3b3JrbG9hZHMgd2l0aCBjb2Fyc2UgZ3Jh bnVsYXJpdHkgdGFza3MgdGhhdCB2YWx1ZSBsYXRlbmN5IChlLmcuIGEgd2ViIHNlcnZlcikNCjwv bGk+PGxpPuKAnHdz4oCdIHBvb2w6IGEgd29yay1zdGVhbGluZyBwb29sIGZvciBoZWF2eSBjb21w dXRlIHdvcmtsb2FkcyB0aGF0IGZlYXR1cmUgYSBsb3Qgb2YgYXdhaXQvZm9yay1qb2luLCB3aXRo IGEgbG90IG9mIGhlbHAgZnJvbSBTYWRpcSwgS0MsIGFuZCBlc3BlY2lhbGx5IFZlc2EgS2Fydm9u ZW4gKEBwb2x5dHlwaWMpIHRvIHdob20gSeKAmW0gdmVyeSBncmF0ZWZ1bCBmb3IgaGlzIGhlbHAg YW5kIGV4cGxhbmF0aW9ucy4NCjwvbGk+PC91bD4NCjxwPkRvY3VtZW50YXRpb24gY2FuIGJlIGZv dW5kIDxhIGhyZWY9Imh0dHBzOi8vYy1jdWJlLmdpdGh1Yi5pby9tb29ucG9vbC9kZXYvbW9vbnBv b2wvaW5kZXguaHRtbCI+DQpoZXJlPC9hPi4gPC9wPg0KPHA+W14xXTogZm9yIG5vdywgYXQgbGVh c3QuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5aaXBjIDAuMS4wPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4temlwYy0wLTEtMC8xMzM4OC8xIj5o dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXppcGMtMC0xLTAvMTMzODgvMTwvYT4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZGM4ODdmOSIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2RjODg3ZjkiPkRhbmllbCBCw7xuemxpIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZGM4ODdmOSI+ DQo8cD5IZWxsbywgPC9wPg0KPHA+SXTigJlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSBm aXJzdCByZWxlYXNlIG9mIHRoZSBaaXBjIGxpYnJhcnk6IDwvcD4NCjxibG9ja3F1b3RlPg0KPHA+ WmlwYyBpcyBhbiBpbi1tZW1vcnkgPGEgaHJlZj0iaHR0cHM6Ly9wa3dhcmUuY2FjaGVmbHkubmV0 L3dlYmRvY3MvY2FzZXN0dWRpZXMvQVBQTk9URS5UWFQiPg0KWklQIGFyY2hpdmU8L2E+IGFuZCA8 YSBocmVmPSJodHRwczovL3d3dy5yZmMtZWRpdG9yLm9yZy9yZmMvcmZjMTk1MSI+ZGVmbGF0ZTwv YT4gY29tcHJlc3Npb24gY29kZWMuIE90aGVyIGNvbXByZXNzaW9uIGZvcm1hdHMgaW4gWklQIGFy Y2hpdmVzIGNhbiBiZSBzdXBwb3J0ZWQgYnkgdXNpbmcgdGhpcmQtcGFydHkgbGlicmFyaWVzLg0K PC9wPg0KPHA+WmlwYyBoYXMgbm8gZGVwZW5kZW5jaWVzIGFuZCBubyBDIGNvZGUuIEl0IGlzIGRp c3RyaWJ1dGVkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS4NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxw PlRoaXMgZmlyc3QgcmVsZWFzZSBiZW5lZml0ZWQgZnJvbSBhbmQgZmluaXNoZXMgYSBnZW5lcm91 cyBncmFudCBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vb2NhbWwtc2Yub3JnLyI+DQpPQ2FtbCBT b2Z0d2FyZSBGb3VuZGF0aW9uPC9hPiBmb3IgdGhlIHllYXJzIDIwMjIgdG8gMjAyMy4gTXkgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpIj4NCmRvbmF0b3JzPC9h PiBhcmUgYWxzbyBwYXJhbW91bnQgdG8gYmUgYWJsZSB0byBnZXQgdGhlc2UgdGhpbmdzIGlyb25l ZCBhbmQgb3V0IGZvciByZWFzb25hYmxlIHRoaXJkLXBhcnR5IHVzYWdlLCByYXRoZXIgdGhhbiB0 aGVtIHJlbWFpbmluZyBwcml2YXRlIGtsdWRnZXMgdG8gc3VwcG9ydCB1cmdlbnQgbmVlZHMgO+KA kykNCjwvcD4NCjxwPlRoYW5rIHlvdSBhbGwgZm9yIHlvdXIgc3VwcG9ydC4gPC9wPg0KPHA+SG9t ZXBhZ2U6IDxhIGhyZWY9Imh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3ppcGMiPmh0dHBz Oi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3ppcGM8L2E+DQo8L3A+DQo8cD5Eb2NzOiA8YSBocmVm PSJodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS96aXBjL2RvYyI+aHR0cHM6Ly9lcnJhdGlx dWUuY2gvc29mdHdhcmUvemlwYy9kb2M8L2E+IChvcg0KPGNvZGU+b2RpZyBkb2MgemlwYzwvY29k ZT4pIDwvcD4NCjxwPkluc3RhbGw6IDxjb2RlPm9wYW0gaW5zdGFsbCB6aXBjPC9jb2RlPiAob25j ZSB0aGlzIFtQUl0gaXMgbWVyZ2VkKSA8L3A+DQo8cD5EYW5pZWwgPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjYiPk5ldyBUdXRvcmlhbHMgb24gQmFzaWNzIG9mIE9DYW1sPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctdHV0b3JpYWxzLW9uLWJhc2ljcy1v Zi1vY2FtbC8xMzM5Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctdHV0b3Jp YWxzLW9uLWJhc2ljcy1vZi1vY2FtbC8xMzM5Ni8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2M5MjIzZDciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmdjOTIyM2Q3Ij5DdWlodGxhdWFjIEFsdmFyYWRvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzkyMjNkNyI+DQo8cD5EZWFyIE9DYW1s ZXJzIDwvcD4NCjxwPlRoZSBPQ2FtbC5vcmcgdGVhbSBpcyBoYXBweSB0byBhbm5vdW5jZSB0aGUg cHVibGljYXRpb24gb2YgdHdvIG5ldyB0dXRvcmlhbHM6IDwvcD4NCjxvbCBjbGFzcz0ib3JnLW9s Ij4NCjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3ZhbHVlcy1hbmQtZnVuY3Rp b25zIj5WYWx1ZXMgYW5kIEZ1bmN0aW9uczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v b2NhbWwub3JnL2RvY3MvYmFzaWMtZGF0YS10eXBlcyI+QmFzaWMgRGF0YSBUeXBlcyBhbmQgUGF0 dGVybiBNYXRjaGluZzwvYT4NCjwvbGk+PC9vbD4NCjxwPlRoZXNlIHBhZ2VzIHRlYWNoIHRoZSBi YXNpY3Mgb2YgT0NhbWwsIHN0YXJ0aW5nIGZyb20gd2hhdCBpcyBhIHZhbHVlIGFuZCBjb250aW51 aW5nIHRvIGJhc2ljIHR5cGVzLiBCZWZvcmUgdGhlbSwgdGhlIGRvY3VtZW50YXRpb24gb24gT0Nh bWwub3JnIGFzc3VtZWQgYSBsb3QgbW9yZSB1bmRlcnN0YW5kaW5nIGFuZCBtYWRlIGl0IGhhcmQg Zm9yIGJlZ2lubmVycyB0byBsZWFybiBPQ2FtbCB1c2luZyBPQ2FtbC5vcmcuIFRoZXJlIGFyZSBt b3JlDQogZ2FwcyB0byBmaWxsLCBidXQgYWxvbmdzaWRlIHRoZSA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1nZXQtc3RhcnRlZC1kb2N1bWVudGF0aW9uLW9uLW9j YW1sLW9yZyI+DQpyZWNlbnRseSBwdWJsaXNoZWQ8L2E+IOKAnEdldCBTdGFydGVk4oCdIGRvY3Mg KDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvaW5zdGFsbGluZy1vY2FtbCI+SW5zdGFs bGluZyBPQ2FtbDwvYT4sDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3RvdXItb2Yt b2NhbWwiPkEgVG91ciBvZiBPQ2FtbDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L2RvY3MveW91ci1maXJzdC1wcm9ncmFtIj4NCllvdXIgRmlyc3QgT0NhbWwgUHJvZ3JhbTwvYT4p LCB0aGlzIHdpbGwgYWxsb3cgcGVvcGxlIHRvIHVzZSBPQ2FtbC5vcmcgdG8gc3RhcnQgbGVhcm5p bmcgdGhlIGxhbmd1YWdlLg0KPC9wPg0KPHA+VW5saWtlIOKAnEdldCBTdGFydGVk4oCdIGRvY3Vt ZW50cywgdGhlc2UgdHdvIGhhdmUgYSBuYXJyb3dlciBmb2N1czogPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPlRoZSBmb3JtZXIgaXMgbmV3LiBJdCBjb3ZlcnMgdmFsdWVzLCBkZWZpbml0 aW9ucywgZnVuY3Rpb25zLCBlbnZpcm9ubWVudHMsIHNjb3BlcywgY2xvc3VyZXMsIGFuZCBzaGFk b3dpbmcuDQo8L2xpPjxsaT5UaGUgbGF0dGVyIGlzIG1vc3RseSBuZXcuIEl0IHJldXNlcyBzb21l IG9mIHRoZSDigJxEYXRhIFR5cGVzIEFuZCBNYXRjaGluZ+KAnSBtYXRlcmlhbHMuIEJ1dCBpdCBh bHNvIHJlcGxhY2VzIGl0LiBJdCBjb3ZlcnMgcHJlZGVmaW5lZCB0eXBlcywgdmFyaWFudHMsIHJl Y29yZHMsIGFuZCBwYXR0ZXJuIG1hdGNoaW5nLg0KPC9saT48L3VsPg0KPHA+VGhleSBmb3JtIGEg c2VyaWVzLiDigJxWYWx1ZXMgYW5kIEZ1bmN0aW9uc+KAnSBnb2VzIGZpcnN0LCBhbmQg4oCcQmFz aWMgRGF0YSBUeXBlcyBBbmQgUGF0dGVybiBNYXRjaGluZ+KAnSBnb2VzIGFmdGVyLiBUaGUgb25s eSBwcmVyZXF1aXNpdGUgaXMgdGhlIGNvbXBsZXRpb24gb2YgdGhlIOKAnEdldCBTdGFydGVk4oCd IHNlcmllcy4NCjwvcD4NCjxwPldl4oCZdmUgcmVjZWl2ZWQgYW5kIGluY2x1ZGVkIGZlZWRiYWNr IG9uIHRoZW0gd2hlbiB0aGV5IHdlcmUgcHVsbCByZXF1ZXN0cy4gSG93ZXZlciwgYXMgb2YgYW55 IGZyZXNoIHJlbGVhc2UsIHRoZXJl4oCZcyByb29tIGZvciBmaXhlcyBhbmQgaW1wcm92ZW1lbnRz LiBEb27igJl0IGhlc2l0YXRlIHRvIHNoYXJlIHlvdXIgb3BpbmlvbiwgY29tbWVudHMgb3Igc3Vn Z2VzdGlvbnMuIFNpbmNlIHRoaXMgaXMgYmVnaW5uZXItb3JpZW50ZWQgbWF0ZXJpYWwsDQogd2Xi gJlkIGFwcHJlY2lhdGUgdmVyeSBtdWNoIGlmIHlvdSBmaW5kIGJyYXZlIGVub3VnaCBwZW9wbGUg dG8gbGVhcm4gT0NhbWwgdXNpbmcgdGhlbSBhbmQgcHJvdmlkZSBhIHJlcG9ydCBvbiBob3cgaXQg d2VudC4NCjwvcD4NCjxwPkhvcGUgaXQgaGVscHMgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjciPmNsbCAwLjIuMCAtIG11dGFibGUgY2lyY3VsYXIvY3ljbGljIGRvdWJseSBsaW5rZWQg bGlzdHM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jbGwtMC0y LTAtbXV0YWJsZS1jaXJjdWxhci1jeWNsaWMtZG91Ymx5LWxpbmtlZC1saXN0cy8xMzQxNi8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2xsLTAtMi0wLW11dGFibGUtY2lyY3Vs YXItY3ljbGljLWRvdWJseS1saW5rZWQtbGlzdHMvMTM0MTYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzg4NjgwZSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzM4ODY4MGUiPlJvYiBBbmRlcnNvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzM4ODY4MGUiPg0KPHA+SGkgYWxsLCA8 L3A+DQo8cD5UaGlzIGlzIDxhIGhyZWY9Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMv Y2xsLyI+Y2xsPC9hPiwgYSBzaW1wbGUgY2lyY3VsYXIgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRp b24gZGVzaWduZWQgZm9yIE8oMSkgaW5zZXJ0aW9uIGFuZCByZW1vdmFsLCBPKG4pIHRyYXZlcnNh bCwgYW5kIGNsb3NlIHRvIE8oMSkgc2VhcmNoIHVzaW5nIGEgYmFja2luZyBoYXNodGFibGUuDQo8 L3A+DQo8cD5DdXJyZW50bHkgaXQgc3VwcG9ydHM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5pbml0aWFsaXNpbmcgYSBjaXJjdWxhciBsaW5rZWQgbGlzdCBmcm9tIGEgc3RhbmRhcmQg bGlzdCB3aXRoIDxjb2RlPmluaXQ8L2NvZGU+DQo8L2xpPjxsaT50cmF2ZXJzaW5nIHRocm91Z2gg dGhlIGxpc3QgdXNpbmcgPGNvZGU+bmV4dDwvY29kZT4gYW5kIDxjb2RlPnByZXY8L2NvZGU+IGZ1 bmN0aW9ucw0KPC9saT48bGk+YWRkaW5nIGFuZCByZW1vdmluZyBlbGVtZW50cyBhdCB0aGUgY3Vy cmVudCBoZWFkIHVzaW5nIDxjb2RlPmFkZDwvY29kZT4gYW5kIDxjb2RlPg0KcG9wPC9jb2RlPiA8 L2xpPjxsaT5maW5kaW5nIGFuZCBuYXZpZ2F0aW5nIHRvIGVsZW1lbnRzIGluIHRoZSBsaXN0IGVp dGhlciBieSBpdGVyYXRpbmcgdGhyb3VnaCBhbGwgZWxlbWVudHMgb3IgbG9va2luZyB1cCBlbGVt ZW50cyB3aXRoIHRoZSBiYWNraW5nIGhhc2h0YWJsZQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp Pjxjb2RlPnNlZWs8L2NvZGU+IHRvIGl0ZXJhdGUgdGhyb3VnaCBhbmQgcGVyZm9ybSBhbiBPKG4p IGxvb2t1cCA8L2xpPjxsaT48Y29kZT5maW5kPC9jb2RlPiB0byBwZXJmb3JtIGFuIE8oMSkgbG9v a3VwIDwvbGk+PC91bD4NCjwvbGk+PGxpPml0ZXJhdGUgdGhyb3VnaCB0aGUgZnVsbCBsaXN0IGZy b20gdGhlIGN1cnJlbnQgaGVhZCBhbmQgYXBwbHkgYSBnaXZlbiBmdW5jdGlvbiB0byBlYWNoIGVs ZW1lbnQgd2l0aA0KPGNvZGU+aXRlcjwvY29kZT4gPC9saT48bGk+b3V0cHV0IHRoZSBjdXJyZW50 IGNpcmN1bGFyIGxpc3QgYXMgYSBzdGFuZGFyZCBPY2FtbCBsaXN0IHVzaW5nIDxjb2RlPnRvX2xp c3Q8L2NvZGU+DQo8L2xpPjwvdWw+DQo8cD5JIHN0YXJ0ZWQgZGV2ZWxvcGluZyA8Y29kZT5jbGw8 L2NvZGU+IGFmdGVyIHdyaXRpbmcgY2lyY3VsYXIgbGlua2VkIGxpc3QgaW1wbGVtZW50YXRpb25z IGZvciBhIGNvdXBsZSBvZiBwcm9ncmFtbWluZyBwdXp6bGVzLCBhbmQgZGVjaWRlZCB0aGF0IHdy aXRpbmcgYW5kIHB1Ymxpc2hpbmcgYSBsaWJyYXJ5IHdhcyBhIGdvb2Qgd2F5IGZvciBtZSB0byBj b250aW51ZSBsZWFybmluZyBPY2FtbC4NCjwvcD4NCjxwPkkgaGF2ZSBpbmNsdWRlZCBleGFtcGxl cyBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbXNpZGVkb3duL29jYW1sLWNs bCI+DQpHaXRodWIgcmVwbzwvYT4gZm9yIGJvdGggb2YgdGhlc2UgcHV6emxlczogQWR2ZW50IG9m IGNvZGUgMjAyMCBkYXkgMjMgKGNyYWIgY3VwcyksIGFuZCB0aGUgSm9zZXBodXMgcHJvYmxlbSBD b2Rld2FycyBrYXRhLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPkdsb2JhbCBk ZWFkIGNvZGUgZWxpbWluYXRpb24gaW4ganNfb2Zfb2NhbWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1nbG9iYWwtZGVhZC1jb2RlLWVsaW1pbmF0aW9uLWluLWpz LW9mLW9jYW1sLzEzNDE3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1nbG9i YWwtZGVhZC1jb2RlLWVsaW1pbmF0aW9uLWluLWpzLW9mLW9jYW1sLzEzNDE3LzE8L2E+DQo8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzEwMjBmZTQiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxMDIwZmU0Ij5NaWNhaCBDYW50b3IgYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxMDIwZmU0Ij4NCjxw PkhpIGV2ZXJ5b25lISA8L3A+DQo8cD5XZSByZWNlbnRseSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NzaWdlbi9qc19vZl9vY2FtbC9wdWxsLzE1MDMiPm1lcmdlZDwvYT4gYSBsYXJnZSBj aGFuZ2UgdG8NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2pzX29mX29jYW1s Ij5qc19vZl9vY2FtbDwvYT4gdGhhdCBpbXBsZW1lbnRzIGEgbmV3DQo8Yj5nbG9iYWwgZGVhZCBj b2RlIGVsaW1pbmF0aW9uPC9iPiBwYXNzLiBJIHdyb3RlIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0 IHdoaWNoIGV4cGxhaW5zIHRoZSBpbXBhY3Qgb2YgdGhpcyBjaGFuZ2UsIHdoeSBpdCB3YXMgbmVj ZXNzYXJ5LCBhbmQgYWxsIHRoZSBpbXBvcnRhbnQgaW1wbGVtZW50YXRpb24gZGV0YWlsczoNCjwv cD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm1pY2FoY2FudG9yLmNvbS9ibG9nL2pzLW9mLW9j YW1sLWRlYWQtY29kZS8iPmh0dHBzOi8vd3d3Lm1pY2FoY2FudG9yLmNvbS9ibG9nL2pzLW9mLW9j YW1sLWRlYWQtY29kZS88L2E+DQo8L3A+DQo8cD48Yj5JbiBhIG51dHNoZWxsPC9iPiwgdGhpcyBj aGFuZ2UgYWRkcmVzc2VzIGEgbG9uZy1rbm93biBsaW1pdGF0aW9uIG9mIGpzX29mX29jYW1sIHRv IHJlbW92ZSB1bnVzZWQgY29kZSBmcm9tIGZ1bmN0b3JzIChsaWtlIE1hcCBhbmQgU2V0KS4gUHJl dmlvdXNseSwgZXZlbiBpZiBvbmx5IG9uZSBmdW5jdGlvbiBmcm9tIHRoZXNlIG1vZHVsZXMgd2Fz IHVzZWQsIGFsbCBvZiB0aGUgZnVuY3Rpb24gZGVmaW5pdGlvbnMgd291bGQgYmUgaW5jbHVkZWQN CiBpbiB0aGUgSmF2YVNjcmlwdCBleGVjdXRhYmxlLCBzaWduaWZpY2FudGx5IGluY3JlYXNpbmcg dGhlIG91dHB1dCBzaXplLiA8L3A+DQo8cD48Yj5JbiBwcmFjdGljZTwvYj4sIHByb2dyYW1zIHRo YXQgY29tcGlsZSB3aXRoIGpzX29mX29jYW1sIGFuZCBkZXBlbmQgb24gbGlicmFyaWVzIHRoYXQg ZXhwb3NlIGxhcmdlIGZ1bmN0b3IgaW50ZXJmYWNlcyAobGlrZQ0KPGEgaHJlZj0iaHR0cHM6Ly9v Y3NpZ2VuLm9yZy90eXhtbC9sYXRlc3QvbWFudWFsL2ludHJvIj5UeVhNTDwvYT4sIGZvciBpbnN0 YW5jZSkgY291bGQgc2VlIHNpZ25pZmljYW50IGRlY3JlYXNlcyBpbiBvdXRwdXQgc2l6ZS4gSW4g cGFydGljdWxhciwgZm9yIGEgbWluaW1hbCB3ZWJzaXRlIHVzaW5nIHR5eG1sLCB3ZSBzYXcgYSBk ZWNyZWFzZSBieSAyMWtiIG9yIDExJSBvZiB0aGUgdG90YWwgSlMgc2l6ZS4gV2Vic2l0ZXMgdXNp bmcgTWFwIGFuZA0KIFNldCBjb3VsZCBhbHNvIHNlZSBzaXplIGRlY3JlYXNlcyBvZiB1cCB0byAx MGtiIGZvciBlYWNoIG1vZHVsZS4gPC9wPg0KPHA+VGhlIG5ldyBwYXNzIGlzIGVuYWJsZWQgYnkg ZGVmYXVsdCwgYW5kIGZyb20gb3VyIGJlbmNobWFya2luZywgaXQgc2hvdWxkbuKAmXQgY29udHJp YnV0ZSBhIHNpZ25pZmljYW50IGluY3JlYXNlIGluIGNvbXBpbGUgdGltZSBmb3IgbW9zdCBwcm9n cmFtcyAoYXMgaW4sIGxlc3MgdGhhbiAxMDBtcykuIEhvd2V2ZXIsIHNvbWUgdmVyeSBsYXJnZSBw cm9qZWN0cyAobGlrZQ0KPGNvZGU+b2NhbWxjPC9jb2RlPiBvciB0aGUgT0NhbWwgdG9wbGV2ZWwg Y29tcGlsZXIpIGNvdWxkIHNlZSBhIGNvbXBpbGUgdGltZSBpbmNyZWFzZSBvZiAxLTUlLiBJZiB0 aGlzIGlzIHNpZ25pZmljYW50LCB0aGUgcGFzcyBjYW4gYmUgZGlzYWJsZWQgd2l0aA0KPGNvZGU+ LS1kaXNhYmxlIGdsb2JhbGRlYWRjb2RlPC9jb2RlPi4gPC9wPg0KPHA+VGhhbmsgeW91IHRvIDxh IGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vIj5UYXJpZGVzPC9hPiBmb3Igc3VwcG9ydGluZyB0 aGlzIHdvcmsgdGhyb3VnaCBteSBpbnRlcm5zaGlwLCBhbmQgaW4gcGFydGljdWxhciB0byBteSBp bmNyZWRpYmxlIG1lbnRvcnMgQHZvdWlsbG9uICwgQG90aW5pIGFuZCBAam1pZCAuIEFsc28gdGhh bmtzIHRvIEBoaHVnbyBmb3IgcmV2aWV3aW5nIGFuZCBwcm92aWRpbmcgZmVlZGJhY2sgb24gdGhl IHB1bGwgcmVxdWVzdC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2NhZTRkNGYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJv cmdjYWU0ZDRmIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC1vcmdjYWU0ZDRmIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQg bWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhl IGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5m by9jYW1sLWxpc3QiPg0KY2FtbC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFt ZSIgaWQ9Im9yZzAzZDkwZTAiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 7 Nov 2023 10:32:24 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 7 Nov 2023 10:32:24 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 7 Nov 2023 10:32:24 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3A7AWLhg017108 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 7 Nov 2023 10:32:21 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3A7AWBDf017095 for ; Tue, 7 Nov 2023 10:32:11 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Nov 2023 11:32:10 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3FE02E0CD7; Tue, 7 Nov 2023 11:32:10 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6E638E00B6 for ; Tue, 7 Nov 2023 11:32:03 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Nov 2023 11:32:02 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EBF9F56460E; Tue, 7 Nov 2023 11:31:52 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaEWWyRV7p6xhN4U+6jj7Tfr5klQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 7 Nov 2023 10:31:41 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: f3abd032-4378-45e7-e159-08dbdf7cd4fb X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,283,1694728800"; d="scan'208,217";a="135000126" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=47CDD564655 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <93F06E253D70E94AA9674088E4688505@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMS0wNyBUdWUgMTE6MzAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTAuMzEuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMS4xNC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE9jdG9iZXIgMzEgdG8gTm92ZW1iZXIgMDcs IDIwMjMuDQo8L3A+DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+ DQo8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250 ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPkEgc2Vjb25kIGFy dGljbGUgYWJvdXQgTWlvdTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPmF0ZGRpZmY6IHJlcG9y dCBpbmNvbXBhdGliaWxpdGllcyBhZnRlciBtb2RpZnlpbmcgYSB0eXBlZCBpbnRlcmZhY2U8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSIjMyI+T0NhbWwgaW1wbGVtZW50YXRpb24gb2Ygd2ViYmVuY2g8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5Vc2luZyBEb2N1c2F1cnVzIHRvIGRvY3VtZW50IGFu IE9DYW1sIHByb2plY3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5SZWxlYXNlIG9mIG9jYW1s LXNmL2xlYXJuLW9jYW1sOjAuMTYuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzYiPkRpc2NvcmQu bWw6IEVpby1iYXNlZCBEaXNjb3JkIGxpYnJhcnkgd2l0aCB2b2ljZSBzdXBwb3J0PC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNyI+UmVsZWFzZSBvZiBGbWxpYiAwLjUuNzwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzgiPlN1cnZleSBvbiB0aGUgbmV3IOKAnEdldHRpbmcgU3RhcnRlZOKAnSBEb2N1bWVu dGF0aW9uIG9uIE9DYW1sLm9yZzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5PdGhlciBPQ2Ft bCBOZXdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnZDVjZDNhOCI+T2xkIENXTjwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5BIHNlY29uZCBhcnRpY2xlIGFib3V0IE1pb3U8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9tYXN0b2Rvbi5zb2NpYWwvQGRpbm9zYXVyZS8xMTEyOTUzMjg2 ODg0MjE0ODIiPmh0dHBzOi8vbWFzdG9kb24uc29jaWFsL0BkaW5vc2F1cmUvMTExMjk1MzI4Njg4 NDIxNDgyPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdi YWJhZTNiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmFiYWUzYiI+RGlub3NhdXJl IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn YmFiYWUzYiI+DQo8cD5JIGZpbmFsbHkgbWFkZSBteSBzZWNvbmQgYXJ0aWNsZSBhYm91dCAjTWlv dSAoI09DYW1sIDUgJmFtcDsgI211bHRpY29yZSkgYW5kIGl0cyBub3Rpb24gb2YgcnVsZXMuIEl0 4oCZcyBhdmFpbGFibGUgaGVyZToNCjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5vc2F1LnJlL2FydGlj bGVzL21pb3VfcnVsZXMuaHRtbCI+aHR0cHM6Ly9ibG9nLm9zYXUucmUvYXJ0aWNsZXMvbWlvdV9y dWxlcy5odG1sPC9hPiAoZW5qb3kgdGhlIHJlYWRpbmcpLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjIiPmF0ZGRpZmY6IHJlcG9ydCBpbmNvbXBhdGliaWxpdGllcyBhZnRlciBtb2Rp ZnlpbmcgYSB0eXBlZCBpbnRlcmZhY2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L25ldy1hdGRkaWZmLXJlcG9ydC1pbmNvbXBhdGliaWxpdGllcy1hZnRlci1tb2RpZnlp bmctYS10eXBlZC1pbnRlcmZhY2UvMTMzNDcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvbmV3LWF0ZGRpZmYtcmVwb3J0LWluY29tcGF0aWJpbGl0aWVzLWFmdGVyLW1vZGlmeWluZy1h LXR5cGVkLWludGVyZmFjZS8xMzM0Ny8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc3ZTMwZGQ4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn N2UzMGRkOCI+TWFydGluIEphbWJvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzdlMzBkZDgiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnODRkY2M2MiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzg0ZGNj NjIiPkJhY2tncm91bmQ8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZzg0ZGNjNjIiPg0KPHA+QVREIHN0YW5kcyBmb3Ig4oCcQWRqdXN0YWJsZSBUeXBlIERlZmlu aXRpb25z4oCdLiBUaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQiPg0K QVREIHByb2plY3Q8L2E+IGNvbnNpc3RzIG9mIGEgbGFuZ3VhZ2UgZm9yIHNwZWNpZnlpbmcgdHlw ZXMgYW5kIHRoZWlyIEpTT04gcmVwcmVzZW50YXRpb24gYW5kIGNvZGUgZ2VuZXJhdG9ycyB0aGF0 IG1ha2UgaXQgc2FmZSBhbmQgZWFzeSB0byByZWFkIGFuZCB3cml0ZSBKU09OIGRhdGEuIEl0IGN1 cnJlbnRseSBvZmZlcnMgaW50ZXJvcGVyYWJpbGl0eSBmb3IgNiBwcm9ncmFtbWluZyBsYW5ndWFn ZXMgKEQsIEphdmEsIE9DYW1sLCBTY2FsYSwgVHlwZVNjcmlwdCwNCiBQeXRob24vTXlweSkuIDwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiZDY4NTJh IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYmQ2ODUyYSI+VHJhY2tpbmcgaW5jb21w YXRpYmlsaXRpZXMgd2l0aCBhdGRkaWZmPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00 IiBpZD0idGV4dC1vcmdiZDY4NTJhIj4NCjxwPkF0ZGRpZmYgdGFrZXMgdHdvIHZlcnNpb25zIG9m IGFuIDxjb2RlPi5hdGQ8L2NvZGU+IGZpbGUsIHdoaWNoIGlzIGEgY29sbGVjdGlvbiBvZiB0eXBl IGRlZmluaXRpb25zLCBjb21wYXJlcyB0aGVtIGFuZCByZXBvcnRzIGluY29tcGF0aWJpbGl0aWVz LiBIZXJl4oCZcyBhIHNpbXBsZSBleGFtcGxlOg0KPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1j b250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5leGFtcGxlLnYxLmF0ZDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAgKik8L3Nw YW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlw ZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+dDwvc3Bhbj4gPSB7DQogIHg6 IHN0cmluZzsNCn0NCjwvcHJlPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5l ciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZm NGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4 ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPmV4YW1wbGUudjIuYXRkPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5cGU8L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQ8L3NwYW4+ID0gew0KICA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij4/eDwvc3Bhbj46IHN0cmluZyBvcHRpb247DQp9DQo8L3ByZT4N CjwvZGl2Pg0KPHA+QXRkZGlmZiBmaW5kcyBvbmUgcHJvYmxlbTogPC9wPg0KPHByZSBjbGFzcz0i ZXhhbXBsZSIgaWQ9Im9yZ2U3MjY3ZmYiPg0KJCBhdGRkaWZmIGV4YW1wbGUudjEuYXRkIGV4YW1w bGUudjIuYXRkDQpbMjIxZWQzY2VdIEZvcndhcmQgaW5jb21wYXRpYmlsaXR5Og0KRmlsZSAmcXVv dDtleGFtcGxlLnYxLmF0ZCZxdW90OywgbGluZSAyLCBjaGFyYWN0ZXJzIDItMTENCkZpbGUgJnF1 b3Q7ZXhhbXBsZS52Mi5hdGQmcXVvdDssIGxpbmUgMiwgY2hhcmFjdGVycyAyLTE5Og0KRm9ybWVy bHkgcmVxdWlyZWQgZmllbGQgJ3gnIGlzIG5vdyBvcHRpb25hbC4NClRoZSBmb2xsb3dpbmcgdHlw ZXMgYXJlIGFmZmVjdGVkOg0KICB0DQo8L3ByZT4NCjxwPkluY29tcGF0aWJpbGl0aWVzIGNhbiBi ZSBiYWNrd2FyZCAoPSBjYW7igJl0IHJlYWQgb2xkZXIgZGF0YSksIGZvcndhcmQgKD0gY2Fu4oCZ dCByZWFkIG5ld2VyIGRhdGEpLCBvciBib3RoLiBEZXBlbmRpbmcgb24gdGhlIHVzZSBjYXNlIGZv ciBhIHR5cGUsIHRoZSB1c2VyIG1heSBjYXJlIGFib3V0IGp1c3Qgb25lIGRpcmVjdGlvbi4gVGhl DQo8YSBocmVmPSJodHRwczovL2F0ZC5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvYXRkLWxhbmd1 YWdlLmh0bWwjaG93LXRvLWNoYW5nZS1hLWpzb24taW50ZXJmYWNlLXNhZmVseSI+DQpkb2N1bWVu dGF0aW9uPC9hPiBleHBhbmRzIGEgYml0IG9uIHRoaXMgYW5kIHByb3ZpZGVzIGEgY29tbWFuZCB0 byB1c2UgYXRkZGlmZiB3aXRoIGdpdC4NCjwvcD4NCjxwPlRoZSByZWNvbW1lbmRlZCB2ZXJzaW9u IG9mIGF0ZGRpZmYgaXMgdGhlIGxhdGVzdCwgJmd0Oz0gMi4xNS4wLiBJdCBpcyBpbnN0YWxsZWQg YXMgcGFydCBvZiB0aGUNCjxjb2RlPmF0ZDwvY29kZT4gb3BhbSBwYWNrYWdlOiA8L3A+DQo8cHJl IGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnZjhhNjJiZSI+DQpvcGFtIHVwZGF0ZQ0Kb3BhbSBpbnN0 YWxsIGF0ZC4yLjE1LjANCjwvcHJlPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MyI+T0NhbWwgaW1wbGVtZW50YXRpb24gb2Ygd2ViYmVuY2g8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWltcGxlbWVudGF0aW9uLW9mLXdlYmJlbmNoLzEzMzQ4 LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWltcGxlbWVudGF0aW9uLW9m LXdlYmJlbmNoLzEzMzQ4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnYTljMzhlNCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2E5YzM4ZTQi PmJpZ2NvbnZpZW5jZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2E5YzM4ZTQiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnNmRjZjVkMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzZkY2Y1ZDMiPk92ZXJ2 aWV3PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc2ZGNmNWQz Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9iaWdjb252aWVuY2Uvd2ViYmVuY2hf bWwiPndlYmJlbmNoX21sPC9hPiBpcyB0aGUgT0NhbWwgaW1wbGVtZW50YXRpb24gb2YNCjxhIGhy ZWY9Imh0dHA6Ly9ob21lLnRpc2NhbGkuY3ovfmN6MjEwNTUyL3dlYmJlbmNoLmh0bWwiPndlYmJl bmNoPC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnOGUzYjNiOSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzhlM2IzYjkiPldlYiBC ZW5jaDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOGUzYjNi OSI+DQo8cD5XZWIgQmVuY2ggaXMgdmVyeSBzaW1wbGUgdG9vbCBmb3IgYmVuY2htYXJraW5nIFdX VyBvciBwcm94eSBzZXJ2ZXJzLiBVc2VzIGZvcmsoKSBmb3Igc2ltdWxhdGluZyBtdWx0aXBsZSBj bGllbnRzIGFuZCBjYW4gdXNlIEhUVFAvMC45LUhUVFAvMS4xIHJlcXVlc3RzLiBUaGlzIGJlbmNo bWFyayBpcyBub3QgdmVyeSByZWFsaXN0aWMsIGJ1dCBpdCBjYW4gdGVzdCBpZiB5b3VyIEhUVFBE IGNhbiByZWFseSBoYW5kbGUgdGhhdCBtYW55IGNsaWVudHMNCiBhdCBvbmNlICh0cnkgdG8gcnVu IHNvbWUgQ0dJcykgd2l0aG91dCB0YWtpbmcgeW91ciBtYWNoaW5lIGRvd24uIERpc3BsYXlzIHBh Z2VzL21pbiBhbmQgYnl0ZXMvc2VjLiBDYW4gYmUgdXNlZCBpbiBtb3JlIGFnZ3Jlc3NpdmUgbW9k ZSB3aXRoIC1mIHN3aXRjaC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc5MjE2NzVmIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnOTIx Njc1ZiI+QnVpbGQ8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y ZzkyMTY3NWYiPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZ2U0NDA0MDIiPg0KJCBnaXQg Y2xvbmUgaHR0cHM6Ly9naXRodWIuY29tL2JpZ2NvbnZpZW5jZS93ZWJiZW5jaF9tbC5naXQNCiQg Y2Qgd2ViYmVuY2hfbWwNCiQgZXZhbCBgb3BhbSBlbnZgDQokIGR1bmUgYnVpbGQNCiQgZHVuZSBl eGVjIC0tIHdlYmJlbmNoIC10IDEwIC1jIDIwIGh0dHA6Ly8xMjcuMC4wLjE6ODAwMC8NCjwvcHJl Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+VXNpbmcgRG9jdXNhdXJ1cyB0 byBkb2N1bWVudCBhbiBPQ2FtbCBwcm9qZWN0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC91c2luZy1kb2N1c2F1cnVzLXRvLWRvY3VtZW50LWFuLW9jYW1sLXByb2plY3Qv MTMzNTkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXNpbmctZG9jdXNhdXJ1cy10 by1kb2N1bWVudC1hbi1vY2FtbC1wcm9qZWN0LzEzMzU5LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNkOWNiYjciIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmczZDljYmI3Ij5NYXRoaWV1IEJhcmJpbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzNkOWNiYjciPg0KPHA+SGkhIDwvcD4N CjxwPkkgd2FudGVkIHRvIHNoYXJlIHNvbWUgcG9zaXRpdmUgZmVlZGJhY2sgb24gdXNpbmcgPGEg aHJlZj0iaHR0cHM6Ly9kb2N1c2F1cnVzLmlvLyI+DQpEb2N1c2F1cnVzPC9hPiB0byBkb2N1bWVu dCBhbiBPQ2FtbCBQcm9qZWN0OiA8YSBocmVmPSJodHRwczovL21iYXJiaW4uZ2l0aHViLmlvL2Jv cGtpdC8iPg0KQm9wa2l0PC9hPi4gPC9wPg0KPHA+QW1vbmcgdGhlIHJlYXNvbnMgSSBjaG9vc2Ug dG8gZXhwZXJpbWVudCB3aXRoIGl0IHdhcyBpdHMgY29tcGF0aWJpbGl0eSB3aXRoIDxjb2RlPg0K b2NhbWwtbWR4PC9jb2RlPiBhbmQgdGhlIDxjb2RlPmR1bmUtcnVudGVzdDwvY29kZT4gJmFtcDsg PGNvZGU+ZHVuZS1wcm9tb3RlPC9jb2RlPiB3b3JrZmxvdy4gVGhhdCBpcywgYSBsb3Qgb2YgdGhl IGR5bmFtaWMgY29udGVudHMgdGhhdCBzaG93cyBpbiB0aGUgZG9jIHN0YXlzIGluIHN5bmMgd2hl biB0aGUgY29kZSBpcyB1cGRhdGVkIGR1cmluZyBkZXZlbG9wbWVudCwgaW5jbHVkaW5nIGZpbGUg cGFydHMsIGV4cGVjdCB0ZXN0cyB0cmFjZXMgYW5kIG1lcm1haWQNCiBkaWFncmFtcy4gPC9wPg0K PHA+SSBhbHNvIGxpa2VkIHRoZSBmYWN0IHRoYXQgdGhlIGNvbnRlbnRzIGlzIG1vc3RseSBiYXNl ZCBvbiA8Y29kZT4qLm1kPC9jb2RlPiBmaWxlcyB0aGF0IGFyZSBwcmVzZW50IGluIHRoZSB0cmVl LCBhbmQgdGhvc2UgdGhhdCBjYW4gYmUgYnJvd3NlZCBkaXJlY3RseSBmcm9tIEdpdEh1YiBhcyB3 ZWxsIChzdWNoIGFzIGFsbCB0aGUgUkVBRE1FLm1kIGZvdW5kIGF0IHRoZSBsZWFmIG9mIHRoZSBw cm9qZWN04oCZcyBkaXJlY3Rvcnkgc3RydWN0dXJlLA0KIHdoaWNoIGFyZSByZW5kZXJlZCBzaW1p bGFybHkgYnkgR2l0SHViKS4gPC9wPg0KPHA+VGhpcyBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBHaXRI dWIgYW5kIEdpdEh1YiBBY3Rpb25zIGluIHRoYXQgdGhlIGRvYyBjYW4gYmUgaG9zdGVkIGRpcmVj dGx5IGluIHRoZSBHaXRIdWIgcGFnZXMgb2YgdGhlIHByb2plY3QuDQo8L3A+DQo8cD5J4oCZdmUg YWxzbyBleHBlcmltZW50ZWQgd2l0aCB0aGVpciBzdXBwb3J0IGZvciBhIGdsb2JhbCBzZWFyY2gg Ym94IHZpYSA8YSBocmVmPSJodHRwczovL2RvY3VzYXVydXMuaW8vZG9jcy9zZWFyY2gjdXNpbmct YWxnb2xpYS1kb2NzZWFyY2giPg0KYWxnb2FsaWE8L2E+IHdoaWNoIHdhcyBvdmVyYWxsIHN0cmFp Z2h0IGZvcndhcmQgdG8gc2V0dXAuIDwvcD4NCjxwPkFzIGEgc2lkZSBub3RlLCBJIGp1c3Qgd2Vu dCB0aHJvdWdoIHRoZWlyIDxhIGhyZWY9Imh0dHBzOi8vZG9jdXNhdXJ1cy5pby9kb2NzL21pZ3Jh dGlvbi92MyI+DQp2MyBtaWdyYXRpb24gZ3VpZGU8L2E+LCBhbmQgSSBsaWtlZCB0aGUgZXhwZXJp ZW5jZS4gPC9wPg0KPHA+UHV0dGluZyBpdCBvdXQgdGhlcmUgaW4gY2FzZSB5b3XigJlyZSBpbnRl cmVzdGVkIGluIHRyeWluZyBpdCBvdXQsIG9yIHNpbXBseSB3YW50IHRvIGJyb3dzZSBhbiBleGFt cGxlIG9mIGEgRG9jdXNhdXJ1cyBzZXR1cCBpbnZvbHZpbmcgYW4gT0NhbWwgcHJvamVjdCB1c2lu Zw0KPGNvZGU+b2NhbWwtbWR4PC9jb2RlPiBhbmQgPGNvZGU+ZHVuZTwvY29kZT4uIDwvcD4NCjxw PlRoYW5rcyEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPlJlbGVhc2Ugb2Ygb2Nh bWwtc2YvbGVhcm4tb2NhbWw6MC4xNi4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1vY2FtbC1zZi1sZWFybi1vY2FtbC0wLTE2LTAvMTMzNjEv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Utb2Ytb2NhbWwtc2Yt bGVhcm4tb2NhbWwtMC0xNi0wLzEzMzYxLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzM3NmE2NWQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmczNzZhNjVkIj5FcmlrIE1hcnRpbi1Eb3JlbCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzM3NmE2NWQiPg0KPHA+RGVhciBhbGwsIDwvcD4N CjxwPldlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBsYXRlc3Qgc3RhYmxlIHJlbGVhc2Ug b2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9jYW1sIj4NCkxl YXJuLU9DYW1sPC9hPiwgdmVyc2lvbiA8Y29kZT4wLjE2LjA8L2NvZGU+LiA8L3A+DQo8cD5NYW55 IHRoYW5rcyB0byBhbGwgdXNlcnMgd2hvIGNvbnRyaWJ1dGVkIGJ1Z3MgcmVwb3J0cywgZml4ZXMs IGFuZCBlbmhhbmNlbWVudHMhDQo8L3A+DQo8cD5BIGNvbXByZWhlbnNpdmUgbGlzdCBvZiB0aGUg Zml4ZXMgYW5kIGVuaGFuY2VtZW50cyBvZmZlcmVkIGJ5IHRoaXMgcmVsZWFzZSBpcyBhdmFpbGFi bGUgaW4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFybi1vY2FtbC9y ZWxlYXNlcy90YWcvdjAuMTYuMCI+dGhlIFJlbGVhc2UgTm90ZXM8L2E+IHdoaWNoIGFsc28gZ2F0 aGVycyBzdGF0aWMgYmluYXJpZXMgZm9yIExpbnV4IGFuZCBtYWNPUywgdGhlIGNvcnJlc3BvbmRp bmcNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVs bC8yNDczOSI+b3BhbS1yZXBvc2l0b3J5IHB1bGwgcmVxdWVzdDwvYT4gaXMgcGVuZGluZywgYW5k IHRoZSBEb2NrZXIgaW1hZ2VzIG9mDQo8YSBocmVmPSJodHRwczovL2h1Yi5kb2NrZXIuY29tL3Iv b2NhbWxzZi9sZWFybi1vY2FtbC90YWdzIj5sZWFybi1vY2FtbDwvYT4gYW5kIDxhIGhyZWY9Imh0 dHBzOi8vaHViLmRvY2tlci5jb20vci9vY2FtbHNmL2xlYXJuLW9jYW1sLWNsaWVudC90YWdzIj4N CmxlYXJuLW9jYW1sLWNsaWVudDwvYT4gYXJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBvbiBEb2Nr ZXIgSHViLiA8L3A+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1haW50YWluIGEgPGNvZGU+bGVhcm4t b2NhbWw8L2NvZGU+IHNlcnZlciwgd2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRoYXQgeW91IHVwZGF0 ZSB5b3VyIHZlcnNpb24gdG8NCjxjb2RlPjAuMTYuMDwvY29kZT4gdG8gYmVuZWZpdCBmcm9tIGlt cG9ydGFudCBmaXhlcywgYXMgd2VsbCBhcyBuZXdlc3QgZmVhdHVyZXMuIDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGMyNmU5ZSIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzRjMjZlOWUiPkhpZ2hsaWdodHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzRjMjZlOWUiPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxp Pg0KPHA+Jmd0O0Zyb20gYSBzdHVkZW50IHBvaW50LW9mLXZpZXcsIGEgZmVhdHVyZSBkZXZlbG9w ZWQgYnkgTS4gSGVybm91ZiwgRC4gUGludG8sIGFuZCBMLiBHZXNiZXJ0IGZyb20gT0NhbWxQcm8g c2lnbmlmaWNhbnRseSBpbXByb3ZlcyB0aGUgVUkvVVggZm9yIHRoZQ0KPGI+ZXhlcmNpc2VzIGxp c3Q8L2I+LCBhZGRpbmcgdGhyZWUgc3ViLXRhYnMgPGNvZGU+QnkgY2F0ZWdvcnk8L2NvZGU+LCA8 Y29kZT5CeSBza2lsbDwvY29kZT4gKHNlZSB0aGUgc2NyZWVuc2hvdCBiZWxvdyksIGFuZA0KPGNv ZGU+QnkgZGlmZmljdWx0eTwvY29kZT4sIHdpdGggY29sbGFwc2libGUgYmxvY2tzOiA8L3A+DQo8 ZGl2IGlkPSJvcmdiZGI4OWZmIiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczov L2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmlnaW5h bC8yWC82LzYxNmQzNjAwYzQ3NmUxYzU4YTk0NDY5NjFhYWM4YTYwZmI2YTg0N2YucG5nIiBhbHQ9 IjYxNmQzNjAwYzQ3NmUxYzU4YTk0NDY5NjFhYWM4YTYwZmI2YTg0N2YucG5nIj4NCjwvcD4NCjwv ZGl2Pg0KPC9saT48bGk+DQo8cD4mZ3Q7RnJvbSBhIHRlYWNoZXIgcG9pbnQtb2YtdmlldywgdGhl IGhhbmRsaW5nIG9mIDxiPk9wZW4vQ2xvc2VkIHN0YXR1cyBmb3IgYXNzaWduZWQgZXhlcmNpc2Vz PC9iPiBoYXMgYmVlbiBzaWduaWZpY2FudGx5IGltcHJvdmVkIChjZi4gaXNzdWVzDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2NhbWwvaXNzdWVzLzUzNCI+IzUz NDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFybi1vY2Ft bC9pc3N1ZXMvNTU4Ij4NCiM1NTg8L2E+KS4gV2hlbiBleGVyY2lzZXMgYXJlIGFzc2lnbmVkLCBs ZWFybi1vY2FtbOKAmXMgdGVhY2hlciB0YWIgbm93IHNob3dzIHRoZSBnbG9iYWwtc3RhdHVzIG9m IHRoZSBleGVyY2lzZXMsIGVzcGVjaWFsbHkgZm9yIHVuYXNzaWduZWQgc3R1ZGVudHMgKHNlZSB0 aGUgc2NyZWVuc2hvdCBiZWxvdykuIFRoZSB1bmRlcmx5aW5nIHNvdW5kbmVzcyBpbnZhcmlhbnQg aGFzIGJlZW4gbWFkZSBleHBsaWNpdCwgYW5kIGlzIG5vdyB2ZXJpZmllZCB1c2luZw0KIGEgZGVk aWNhdGVkIDxiPjxiPnBweF9leHBlY3Q8L2I+PC9iPiB0ZXN0IHN1aXRlLiA8L3A+DQo8ZGl2IGlk PSJvcmc0ODcxODUxIiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2Jh bC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC81 LzVmNzc5NDAyMGZkZmI1OTYyMzMwODc5ODdlOTRjZTFjODFlNWIwYTgucG5nIiBhbHQ9IjVmNzc5 NDAyMGZkZmI1OTYyMzMwODc5ODdlOTRjZTFjODFlNWIwYTgucG5nIj4NCjwvcD4NCjwvZGl2Pg0K PC9saT48L29sPg0KPHA+SWYgbmVlZCBiZSwgZmVlbCBmcmVlIHRvIG9wZW4gaXNzdWVzIGluIHRo ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2NhbWwvaXNzdWVz L25ldy9jaG9vc2UiPg0KTGVhcm4tT0NhbWwgYnVnIHRyYWNrZXI8L2E+IG9yIHRoZSA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vcGZpdGF4ZWwvbGVhcm4tb2NhbWwuZWwvaXNzdWVzIj4NCmxl YXJuLW9jYW1sLmVsIGJ1ZyB0cmFja2VyPC9hPiwgb3IgcG9zdCBpbiB0aGlzIHRocmVhZCB0byBz aGFyZSBjb21tZW50cy4gPC9wPg0KPHA+SGFwcHkgT0NhbWwgbGVhcm5pbmcgYW5kIHRlYWNoaW5n LCBhbmQgc3RheSB0dW5lZCBmb3IgdGhlIG5leHQgcmVsZWFzZSEgPC9wPg0KPHA+RXJpayBNYXJ0 aW4tRG9yZWwgZm9yIHRoZSBMZWFybi1PQ2FtbCB0ZWFtIPCfkKsgPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDYzMjM3YiIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzQ2MzIzN2IiPkVyaWsgTWFydGluLURvcmVsIGxhdGVy IGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0NjMy MzdiIj4NCjxwPkZvciB0aG9zZSB3aG8gZG9u4oCZdCBrbm93IHRoZSBsZWFybi1vY2FtbCBwbGF0 Zm9ybSB5ZXQ6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT50aGUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9jYW1sIj5sZWFybi1vY2FtbDwvYT4gYXJ0 aWZhY3QgKGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSkgaXMgYSBmdWxsLXN0YWNr IHdlYiBzZXJ2ZXIgd3JpdHRlbiBpbiBPQ2FtbCwgZnVsbHkgY3VzdG9taXphYmxlIHRvIHNlcnZl IE1hcmtkb3duLWJhc2VkIGxlY3R1cmVzIGFuZCBpbnRlcmFjdGl2ZSBleGVyY2lzZXMgZW5kb3dl ZCB3aXRoIGF1dG8tZ3JhZGluZw0KIHRlc3RzLCB3cml0dGVuIGluIE9DYW1sIGFzIHdlbGw7IDwv bGk+PGxpPmFuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wZml0YXhlbC9sZWFybi1vY2Ft bC5lbCI+ZW1hY3MgZnJvbnRlbmQ8L2E+IGZvciBsZWFybi1vY2FtbCBpcyBhbHNvIGF2YWlsYWJs ZSBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9tZWxwYS5vcmcvIy9sZWFybi1vY2FtbCI+TUVMUEE8L2E+ OyA8L2xpPjxsaT50aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJu LW9jYW1sLWNvcnB1cyI+bGVhcm4tb2NhbWwtY29ycHVzPC9hPiBpcyBhIGxhcmdlIGNvbGxlY3Rp b24gb2YgZXhlcmNpc2VzIHRoYXQgb3JpZ2luYXRlZCBpbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8v d3d3LnlvdXR1YmUuY29tL3dhdGNoP3Y9bzBDS183cnVJbUUmYW1wO2xpc3Q9UExUQkVONDQxdUVZ MzZ0NUNDckprZFRTdjU4OGQzbldONSI+DQpPQ2FtbCBNT09DPC9hPiBhbmQgaGFzIGJlZW4gZnVy dGhlciBleHRlbmRlZCBieSBzZXZlcmFsIGF1dGhvcnMgc2luY2UgdGhlbjsgPC9saT48bGk+YSBz dGF0aWMgaW5zdGFuY2Ugb2YgbGVhcm4tb2NhbWwsIGNvbWJpbmluZyB0aGUgbGF0ZXN0IHJlbGVh c2Ugb2YgbGVhcm4tb2NhbWwgYW5kIGxlYXJuLW9jYW1sLWNvcnB1c+KAmSBleGVyY2lzZXMsIGlz IGF2YWlsYWJsZSBhdDoNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtc2Yub3JnL2xlYXJuLW9jYW1s LXB1YmxpYy8jYWN0aXZpdHk9ZXhlcmNpc2VzIj5odHRwczovL29jYW1sLXNmLm9yZy9sZWFybi1v Y2FtbC1wdWJsaWMvPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYi PkRpc2NvcmQubWw6IEVpby1iYXNlZCBEaXNjb3JkIGxpYnJhcnkgd2l0aCB2b2ljZSBzdXBwb3J0 PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kaXNjb3JkLW1sLWVpby1i YXNlZC1kaXNjb3JkLWxpYnJhcnktd2l0aC12b2ljZS1zdXBwb3J0LzEzMzcwLzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Rpc2NvcmQtbWwtZWlvLWJhc2VkLWRpc2NvcmQtbGlicmFy eS13aXRoLXZvaWNlLXN1cHBvcnQvMTMzNzAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNmQ5OWZkMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzZkOTlmZDIiPmFucW91IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnNmQ5OWZkMiI+DQo8cD5IaS4gSeKAmW0gd3JpdGluZyBhIERpc2Nv cmQgbGlicmFyeSwgRGlzY29yZC5tbCwgaW4gT0NhbWwgZm9yIG15IHBlcnNvbmFsIHByb2plY3Qu IEFzIG9mIG5vdywgaXQgc3VwcG9ydHMgdm9pY2UgZnVuY3Rpb25hbGl0eSBhcyB3ZWxsIGFzIHRl eHQgb25lLCBhbmQgeW91IGNhbiB3cml0ZSwgZm9yIGV4YW1wbGUsIGEgbXVzaWMgYm90IHdpdGgg dGhpcyBsaWJyYXJ5Lg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3VzaGl0 b3JhLWFucW91L2Rpc2NvcmRtbCI+aHR0cHM6Ly9naXRodWIuY29tL3VzaGl0b3JhLWFucW91L2Rp c2NvcmRtbDwvYT4NCjwvcD4NCjxwPkkgdXNlZCBFaW8gdG8gd3JpdGUgdGhpcyBsaWJyYXJ5IGFu ZCB3cm90ZSBhIHNpbXBsZSBFcmxhbmctbGlrZSBhY3RvciBtb2RlbCBpbXBsZW1lbnRhdGlvbiAo PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3VzaGl0b3JhLWFucW91L2FjdGFhIj5hY3RhYTwv YT4pLiBBbHNvLCBJIHVzZWQgQ29odHRwLWVpbyAoYmV0YTEpIHdpdGggb2NhbWwtd2Vic29ja2V0 IHRvIGNvbW11bmljYXRlIHdpdGggdGhlIERpc2NvcmTigJlzIHNlcnZlciAoZ2F0ZXdheSkuDQo8 L3A+DQo8cD5JIGhvcGUgc29tZW9uZSBtYXkgYmUgaW50ZXJlc3RlZCBpbiB0aGlzIGxpYnJhcnku IEFueSBmZWVkYmFjayB3b3VsZCBiZSBhcHByZWNpYXRlZCENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI3Ij5SZWxlYXNlIG9mIEZtbGliIDAuNS43PC9oMj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1mbWxpYi0wLTUtNy8xMzM3My8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1mbWxpYi0wLTUtNy8x MzM3My8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE0 NTliODAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxNDU5YjgwIj5IZWxtdXQgYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxNDU5 YjgwIj4NCjxwPkhpIGFsbCwgPC9wPg0KPHA+SSBhbSBoYXBweSB0byBhbm5vdWNlIHRoZSByZWxl YXNlIDAuNS43IG9mIDxjb2RlPkZtbGliPC9jb2RlPi4gPC9wPg0KPHA+VGhpcyByZWxlYXNlIG1h a2VzIHNvbWUgbWlub3IgaW1wcm92ZW1lbnRzIGZvciBjb21iaW5hdG9yIHBhcnNpbmcgd2l0aCBz ZXBhcmF0ZSBsZXhlciBhbmQgcGFyc2VyLiBUaGUgcG9zaXRpb24gaW5mb3JtYXRpb24gY29udGFp bnMgbm93IGNoYXJhY3RlciBhbmQgYnl0ZSBvZmZzZXRzIGFuZCBvZmZlcnMgcG9zaXRpb24gcmFu Z2UgaW5mb3JtYXRpb24gb24gc3ludGF4IGVycm9ycy4NCjwvcD4NCjxwPkZvciBtb3JlIGluZm9y bWF0aW9uIG9uIGNvbWJpbmF0b3IgcGFyc2luZyB3aXRoIHNlcGFyYXRlIGxleGVyIGFuZCBwYXJz ZXIgcGxlYXNlIHJlYWQNCjxhIGhyZWY9Imh0dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi9vZG9j L2ZtbGliX3BhcnNlL3BhcnNlX2xleC5odG1sIj5odHRwczovL2hici5naXRodWIuaW8vZm1saWIv b2RvYy9mbWxpYl9wYXJzZS9wYXJzZV9sZXguaHRtbDwvYT4uDQo8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+R2VuZXJhbCBpbmZvcm1hdGlvbiBhYm91dCBmbWxpYjogPGEgaHJlZj0iaHR0 cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvaW5kZXguaHRtbCI+DQpodHRwczovL2hici5n aXRodWIuaW8vZm1saWIvb2RvYy9pbmRleC5odG1sPC9hPiA8L2xpPjxsaT5Db21iaW5hdG9yIHBh cnNpbmcgd2l0aCBmbWxpYjogPGEgaHJlZj0iaHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29k b2MvZm1saWJfcGFyc2UvaW5kZXguaHRtbCI+DQpodHRwczovL2hici5naXRodWIuaW8vZm1saWIv b2RvYy9mbWxpYl9wYXJzZS9pbmRleC5odG1sPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iOCI+U3VydmV5IG9uIHRoZSBuZXcg4oCcR2V0dGluZyBTdGFydGVk4oCdIERv Y3VtZW50YXRpb24gb24gT0NhbWwub3JnPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9zdXJ2ZXktb24tdGhlLW5ldy1nZXR0aW5nLXN0YXJ0ZWQtZG9jdW1lbnRhdGlvbi1v bi1vY2FtbC1vcmcvMTMzODAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3VydmV5 LW9uLXRoZS1uZXctZ2V0dGluZy1zdGFydGVkLWRvY3VtZW50YXRpb24tb24tb2NhbWwtb3JnLzEz MzgwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzZk NThiYmIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2ZDU4YmJiIj5TYWJpbmUgU2No bWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc2ZDU4YmJiIj4NCjxwPkhlbGxvIGV2ZXJ5b25lLCA8L3A+DQo8cD53ZeKAmXZlIHByZXBh cmVkIGEgc3VydmV5IHRvIGNhcHR1cmUgc29tZSBhbm9ueW1vdXMgZmVlZGJhY2sgb24gdGhlIG5l dyBkb2N1bWVudGF0aW9uIGluIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9n ZXQtc3RhcnRlZCI+4oCcR2V0dGluZyBTdGFydGVk4oCdIHNlY3Rpb24gb24gT0NhbWwub3JnPC9h Pi4NCjwvcD4NCjxwPknigJlkIGJlIHN0b2tlZCBpZiB5b3UgY291bGQgaGVscCB1cyBieSByZXZp ZXdpbmcgdGhlIG5ldyBwYWdlcyBhbmQgY29tcGxldGluZyB0aGUgc3VydmV5LCBubyBtYXR0ZXIg aWYgeW914oCZcmUgYSBuZXdjb21lciB0byBPQ2FtbCBvciBub3QuDQo8L3A+DQo8cD5XZeKAmXJl IGNvbmR1Y3RpbmcgdGhpcyBzdXJ2ZXkgdG8gdW5kZXJzdGFuZCBpZiBhbmQgd2hhdCB3ZSBuZWVk IHRvIGNoYW5nZSBnb2luZyBmb3J3YXJkLCBzbyB0aGF0LCBpbiB0aGUgZW5kLCB3ZSBoYXZlIGRv Y3VtZW50YXRpb24gdGhhdCB3b3JrcyBmb3IgbmV3Y29tZXJzIHdpdGggdmFyeWluZyBiYWNrZ3Jv dW5kcyBvbiBPQ2FtbC5vcmcuIFdl4oCZcmUgZG9pbmcgdGhpcyBpbiBhIG5vbi1wdWJsaWMgc3Vy dmV5LCBzbyB0aGF0IGV2ZXJ5b25lIGNhbg0KIHNwZWFrIHRoZWlyIG1pbmQgZnJlZWx5IHdpdGhv dXQgYmVpbmcganVkZ2VkLiBBIHN1bW1hcnkgb2YgcG9pbnRzIGJyb3VnaHQgdXAgd2lsbCBiZSBw b3N0ZWQgYXQgbGF0ZXN0IGJ5IE5vdiAzMCBhcyBhIHJlc3BvbnNlIHRvIHRoaXMgcG9zdC4NCjwv cD4NCjxwPklmIHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gY29udHJpYnV0aW5nIHRvIHRoZSBkb2N1 bWVudGF0aW9uLCBvciBoYXZpbmcgYSBjYWxsIHdpdGggdXMsIHRoZXJl4oCZcyBhIHF1ZXN0aW9u IGF0IHRoZSB2ZXJ5IGVuZCBvZiB0aGUgc3VydmV5IHdoZXJlIHlvdSBjYW4gbGVhdmUgeW91ciBF bWFpbCBzbyB3ZSBjYW4gcmVhY2ggb3V0IHRvIHlvdS4NCjwvcD4NCjxwPlRoYW5rcyBmb3IgcGFy dGljaXBhdGluZyEgTGV04oCZcyBtYWtlIHRoZSBPQ2FtbCBkb2N1bWVudGF0aW9uIGF3ZXNvbWUh IDpmaXJlOiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9k L2UvMUZBSXBRTFNlUDhKVWFIRW9KWW5GQlYyNXppWUJTRGV6ZVh6YkZya1VtaTFjQ3ZraW12M2JV QXcvdmlld2Zvcm0/dXNwPXNmX2xpbmsiPmh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2Qv ZS8xRkFJcFFMU2VQOEpVYUhFb0pZbkZCVjI1emlZQlNEZXplWHpiRnJrVW1pMWNDdmtpbXYzYlVB dy92aWV3Zm9ybT91c3A9c2ZfbGluazwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI5Ij5PdGhlciBPQ2FtbCBOZXdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC05Ij48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzk3NmQ3NjAi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5NzZkNzYwIj5Gcm9tIHRoZSBvY2FtbC5v cmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTc2 ZDc2MCI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJs b2c8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly90 YXJpZGVzLmNvbS9ibG9nLzIwMjMtMTEtMDEtd2ViYXNzZW1ibHktc3VwcG9ydC1mb3Itb2NhbWwt aW50cm9kdWNpbmctd2FzbS1vZi1vY2FtbCI+V2ViQXNzZW1ibHkgU3VwcG9ydCBmb3IgT0NhbWw6 IEludHJvZHVjaW5nIFdhc21fb2ZfT2NhbWw8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2ZyYW1hLWMuY29tL2ZjLXZlcnNpb25zL25pY2tlbC5odG1sIj5CZXRhIHJlbGVhc2Ugb2YgRnJh bWEtQyAyOC4wfmJldGEgKE5pY2tlbCk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3Rh cmlkZXMuY29tL2Jsb2cvMjAyMy0xMC0yNS10dXRvcmlhbC1idWlsZGluZy1hLWJyb3dzZXItZXh0 ZW5zaW9uLXdpdGgtaXJtaW4iPlR1dG9yaWFsOiBCdWlsZGluZyBhIEJyb3dzZXIgRXh0ZW5zaW9u IFdpdGggSXJtaW48L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Js b2cvMjAyMy0xMC0xOC1vZmYtdG8tdGhlLXJhY2VzLXVzaW5nLXRocmVhZHNhbml0aXplci1pbi1v Y2FtbCI+T2ZmIHRvIHRoZSBSYWNlczogVXNpbmcgVGhyZWFkU2FuaXRpemVyIGluIE9DYW1sPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMTAtMTAt cHJpb3JpdGlzaW5nLW1lbnRhbC1oZWFsdGgtYXQtdGFyaWRlcyI+UHJpb3JpdGlzaW5nIE1lbnRh bCBIZWFsdGggYXQgVGFyaWRlczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRl cy5jb20vYmxvZy8yMDIzLTEwLTA0LXBvcnRpbmctb2J1aWxkZXItdG8tZnJlZWJzZCI+UG9ydGlu ZyBPQnVpbGRlciB0byBGcmVlQlNEPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly90YXJp ZGVzLmNvbS9ibG9nLzIwMjMtMDktMjctdHV0b3JpYWwtaG93LXRvLXBvcnQtbHd0LWFwcGxpY2F0 aW9ucy10by1laW8iPlR1dG9yaWFsOiBIb3cgdG8gUG9ydCBMd3QgQXBwbGljYXRpb25zIHRvIEVp bzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9nYWxsaXVtLmlucmlhLmZyL2Jsb2cvZmxv cmlhbi1jdy0yMDIzLTA5LTI2Ij5GbG9yaWFuIGNvbXBpbGVyIHdlZWtseSwgMjYgU2VwdGVtYmVy IDIwMjM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAy My0wOS0yMC1hLXllYXItb2Ytc3BhY2Vvcy1zaG93aW5nLXRoZS13b3JsZC10aGUtYmVuZWZpdHMt b2Ytb2NhbWwiPkEgWWVhciBvZiBTcGFjZU9TOiBTaG93aW5nIHRoZSBXb3JsZCB0aGUgQmVuZWZp dHMgb2YgT0NhbWw8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Js b2cvMjAyMy0wOS0xNS1vdXItZXhwZXJpZW5jZS1hdC10YXJpZGVzLXByb2plY3RzLWZyb20tb3Vy LWludGVybnNoaXBzLWluLTIwMjMiPk91ciBFeHBlcmllbmNlIGF0IFRhcmlkZXM6IFByb2plY3Rz IEZyb20gT3VyIEludGVybnNoaXBzIGluIDIwMjM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRw czovL3RlY2guYWhyZWZzLmNvbS9iZXlvbmQtdHlwZXNjcmlwdC1kaWZmZXJlbmNlcy1iZXR3ZWVu LXR5cGVkLWxhbmd1YWdlcy1mM2UxNDI1Mz9zb3VyY2U9cnNzLS0tLTMwMzY2MmQ4OGJhZS0tb2Nh bWwiPkJleW9uZCBUeXBlU2NyaXB0OiBEaWZmZXJlbmNlcyBCZXR3ZWVuIFR5cGVkIExhbmd1YWdl czwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS93aGF0 LXRoZS1pbnRlcm5zLWhhdmUtd3JvdWdodC0yMDIzLyI+V2hhdCB0aGUgaW50ZXJucyBoYXZlIHdy b3VnaHQsIDIwMjMgZWRpdGlvbjwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRl cy5jb20vYmxvZy8yMDIzLTA5LTA4LXRoZS1zdGF0ZS1vZi10aGUtYXJ0LWluLWZ1bmN0aW9uYWwt cHJvZ3JhbW1pbmctdGFyaWRlcy1hdC1pY2ZwLTIwMjMiPlRoZSBTdGF0ZSBvZiB0aGUgQXJ0IGlu IEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmc6IFRhcmlkZXMgYXQgSUNGUCAyMDIzPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy1wbHVnaW5zL2ZyYW1hLWNsYW5nLmh0 bWwiPlJlbGVhc2Ugb2YgRnJhbWEtQ2xhbmcgMC4wLjE0PC9hPg0KPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL294aWRpemluZy1vY2FtbC1wYXJhbGxlbGlzbS8i Pk94aWRpemluZyBPQ2FtbDogRGF0YSBSYWNlIEZyZWVkb208L2E+DQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkNWNkM2E4 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnZDVjZDNhOCI+T2xkIENXTjwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnZDVjZDNhOCI+DQo8cD5JZiB5 b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2No bWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJls bCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2Yg dGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBp dCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIHRvIHRoZSA8YSBocmVmPSJo dHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Ij4NCmNhbWwtbGlzdDwv YT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmcxMTYxNWE2Ij4NCjxwPjxh IGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 31 Oct 2023 10:43:58 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 31 Oct 2023 10:43:58 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 31 Oct 2023 10:43:58 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39VAhqFg023665 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 31 Oct 2023 10:43:52 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39VAheiM023649 for ; Tue, 31 Oct 2023 10:43:40 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 31 Oct 2023 11:43:39 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 98BB3E0CE1; Tue, 31 Oct 2023 11:43:38 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 464F8E00BA for ; Tue, 31 Oct 2023 11:43:32 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Oct 2023 11:43:29 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1A3445605BC; Tue, 31 Oct 2023 11:43:28 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaC+cnDCIk0lbF5UqPfYdYGn94ng== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 31 Oct 2023 10:43:27 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: fd3ab37c-63c9-4397-6f57-08dbd9fe497d X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,265,1694728800"; d="scan'208,217";a="70203265" x-spam-flag: No, tests=bogofilter, spamicity=0.445903, queueID=536CF5605BD x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMC0zMSBUdWUgMTE6NDEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTAuMjQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMS4wNy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE9jdG9iZXIgMjQgdG8gMzEsIDIwMjMuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+YXNhaSAwLjIuMCBmb3IgY29tcGls ZXIgZGlhZ25vc3RpY3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5UU2FuIHN1cHBvcnQgaW4g T0NhbWwgNS4xIGFuZCBibG9nIHBvc3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5NZWxhbmdl IDIuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPmRyZWFtLWh0bWwgMS4wLjA8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM1Ij5PQ2FtbCBQbGF0Zm9ybSBOZXdzbGV0dGVyOiBTZXB0ZW1iZXIgMjAy MzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzYiPkhvdy1UbzogQnVjayAyIGFuZCBPQ2FtbCAtIEJ1 aWxkIHN5c3RlbTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPkZpcnN0IHJlbGVhc2Ugb2Ygb3J0 YWMtY29yZSwgb3J0YWMtcnVudGltZSBhbmQgb3J0YWMtcWNoZWNrLXN0bTwvYT4NCjwvbGk+PGxp PjxhIGhyZWY9IiM4Ij5vcGFtLXB1Ymxpc2ggMi4zLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNv cmcyMTdlOTg0Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPmFz YWkgMC4yLjAgZm9yIGNvbXBpbGVyIGRpYWdub3N0aWNzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tYXNhaS0wLTItMC1mb3ItY29tcGlsZXItZGlhZ25vc3RpY3Mv MTMzMDUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWFzYWktMC0yLTAtZm9y LWNvbXBpbGVyLWRpYWdub3N0aWNzLzEzMzA1LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnOTVlZDExYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzk1ZWQxMWIiPkZhdm9uaWEgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmc5NWVkMTFiIj4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2Ug PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9hc2FpL2xhdGVzdC9kb2MvaW5kZXguaHRtbCI+ DQphc2FpIDAuMi4wPC9hPiBmb3IgZ2VuZXJhdGluZyBhbmQgcHJpbnRpbmcgY29tcGlsZXIgZGlh Z25vc3RpY3MuIFRoaXMgaXMgYSBtYWpvciByZWxlYXNlOiB0aGVyZSBhcmUgbWFueSBpbXByb3Zl bWVudHMgYW5kICh1bmZvcnR1bmF0ZWx5KSBtYW55IGJhY2t3YXJkLWluY29tcGF0aWJsZSBjaGFu Z2VzLiBDb21wYXJlZCB0byB0aGUgcHJldmlvdXMgcmVsZWFzZSwgdGhpcyB2ZXJzaW9uIGlzIHNp Z25pZmljYW50bHkgbW9yZSBzdGFibGUsIHRob3VnaA0KIHdlIG1pZ2h0IHN0aWxsIG1ha2UgYmln IGNoYW5nZXMgYmVmb3JlIDEuMC4wLiBXZSBoYXZlIGEgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5v cmcvcC9hc2FpL2xhdGVzdC9kb2MvcXVpY2tzdGFydC5odG1sIj4NCvCflLAgcXVpY2tzdGFydCB0 dXRvcmlhbDwvYT4gZm9yIHlvdSB0byB0cnkgb3V0IGFuZCB3b3VsZCBsb3ZlIHRvIGhlYXIgeW91 ciBmZWVkYmFjay4NCjwvcD4NCjxwPlRoZSBtb3N0IHNpZ25pZmljYW50IGNoYW5nZSBpcyB0aGUg aW50cm9kdWN0aW9uIG9mIDxiPnN0cnVjdHVyZWQgcmVwb3J0ZXJzLjwvYj4gVGhlIGxpYnJhcnkg Y2FuIHRodXMgYmUgdXNlZCBpbiB0d28gZGlmZmVyZW50IG1vZGVzOg0KPC9wPg0KPG9sIGNsYXNz PSJvcmctb2wiPg0KPGxpPlVzZSA8Yj5SZXBvcnRlcjwvYj4gKGFzIHRoZSBvbGQgPGI+TG9nZ2Vy PC9iPik6IGl0cyBBUEkgaXMgYmlhc2VkIHRvd2FyZHMgZnJlZS1mb3JtIGV4cGxhbmF0aW9ucy4N CjwvbGk+PGxpPlVzZSA8Yj5TdHJ1Y3R1cmVkUmVwb3J0ZXI6PC9iPiBpdHMgQVBJIGlzIGJpYXNl ZCB0b3dhcmRzIGZ1bGx5IHN0cnVjdHVyZWQgbWVzc2FnZXMuDQo8L2xpPjwvb2w+DQo8cD5Cb3Ro IG1vZGVzIHNoYXJlIHRoZSBzYW1lIHR5cGUgb2YgPGI+ZGlhZ25vc3RpY3MsPC9iPiBhbmQgdGh1 cywgYW4gYXBwbGljYXRpb24gdXNpbmcgc3RydWN0dXJlZCBtZXNzYWdlcyBjYW4gYWRvcHQgYSBs aWJyYXJ5IHVzaW5nIGZyZWUtZm9ybSBleHBsYW5hdGlvbnMgYW5kIHZpY2UgdmVyc2EuIEdyZWF0 IGNhcmUgaGFzIGJlZW4gdGFrZW4gdG8gbWFrZSBzdXJlIHRoZSB0d28gbW9kZXMgY2FuIHdvcmsg dG9nZXRoZXIuIFRoZSBjdXJyZW50DQogdHV0b3JpYWwgZm9jdXNlcyBvbiA8Yj5SZXBvcnRlcjwv Yj4gYW5kIGZyZWUtZm9ybSBleHBsYW5hdGlvbnMgYmVjYXVzZSB0aGF0IG1vZGUgaXMgc2xpZ2h0 bHkgZWFzaWVyIHRvIHNldCB1cC4NCjwvcD4NCjxwPlRoZSBzZWNvbmQgbW9zdCBzaWduaWZpY2Fu dCBjaGFuZ2UgaXMgdGhhdCB0aGUgVFRZIGhhbmRsZXIgZ290IGFuIG92ZXJoYXVsLiBUaGUgb3V0 cHV0IGlzIG5vdyBtb3JlIGNvbmNpc2UsIGluZm9ybWF0aW9uYWwsIGFuZCBiZWF1dGlmdWwuIFlv dSBjYW4gdHJpdmlhbGx5IHByb2R1Y2UgYW4gZXJyb3IgbWVzc2FnZSBsaWtlIHRoaXM6DQo8L3A+ DQo8ZGl2IGlkPSJvcmcxMDY0ZGM2IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRw czovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmln aW5hbC8yWC8zLzNjMTk5NDRmMDg4MGI1MjRhYzVkNjc1YzUxNzEzNmViYTY5MDg1NzUucG5nIiBh bHQ9IjNjMTk5NDRmMDg4MGI1MjRhYzVkNjc1YzUxNzEzNmViYTY5MDg1NzUucG5nIj4NCjwvcD4N CjwvZGl2Pg0KPHA+SW4gY2FzZSB5b3UgYXJlIHdvbmRlcmluZywgd2UgaW50ZW50aW9uYWxseSBk aWQgbm90IGltcGxlbWVudCB0aGUgUnVzdC1zdHlsZSBBU0NJSSBhcnQgZHVlIHRvIG91ciBvYnNl c3Npb24gd2l0aCBVbmljb2RlIGVtb2ppcyAoc2VlDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9y Zy9wL2FzYWkvbGF0ZXN0L2RvYy9kZXNpZ24uaHRtbCI+b3VyIGRlc2lnbiBwaGlsb3NvcGh5PC9h PikuIEhvd2V2ZXIsIG91ciBtb2R1bGFyIGRlc2lnbiBtYWtlcyBpdCBpcyB2ZXJ5IGVhc3kgdG8g Y29ubmVjdCBvdXIgbWVzc2FnZSByZXBvcnRpbmcgaW50ZXJmYWNlIHdpdGggb3RoZXIgcmVuZGVy aW5nIGxpYnJhcmllcywgZm9yIGV4YW1wbGUgdGhlIG9uZSB0cmFja2VkIGJ5DQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvaXNzdWVzLzEwNyI+dGhpcyBHaXRIdWIgaXNz dWUuPC9hPiA8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj4NCihUaGUgYXV0aG9yIHNhaWQgd2Ugc2hv dWxkIHdhaXQgYSBiaXQgYmVmb3JlIHRoZXkgZmluaXNoIHRoZSByZW5kZXJlciwgYW5kIHRoYXTi gJlzIHdoeSB3ZSBoYXZlIG5vdCBpbXBsZW1lbnRlZCBpdCB5ZXQhKTwvc3Bhbj4NCjwvcD4NCjxw PlRoYW5rcyB0byBAdmlyaXRyaWxiaWEgZm9yIG1hbnkgdmFsdWFibGUgc3VnZ2VzdGlvbnMuIDwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTUzODYyZSIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2U1Mzg2MmUiPkNoYW5nZWxvZzwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZTUzODYyZSI+PC9kaXY+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzc1MTMwNTAiPjwvYT5CUkVBS0lORyBDSEFOR0VT PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzc1MTMwNTAiPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPlNwYW48L2I+IGlzIHJlbmFtZWQgdG8gPGI+UmFu Z2U8L2I+IDwvbGk+PGxpPjxiPkxvZ2dlcjwvYj4gaXMgcmVuYW1lZCB0byA8Yj5SZXBvcnRlcjwv Yj4gYW5kIDxiPlJlcG9ydGVyLkNvZGU8L2I+IGlzIHJlbmFtZWQgdG8NCjxiPlJlcG9ydGVyLk1l c3NhZ2U8L2I+IDwvbGk+PGxpPjxiPlJhbmdlOjwvYj4gdGhlIHR5cGUgPGNvZGU+cG9zaXRpb248 L2NvZGU+IHdhcyBjaGFuZ2VkIHRvIGFsbG93IHN0cmluZyAoaW4tbWVtb3J5KSBzb3VyY2VzDQo8 L2xpPjxsaT48Yj5EaWFnbm9zdGljOjwvYj4gdGhlIHR5cGUgPGNvZGU+ZGlhZ25vc3RpYzwvY29k ZT4gd2FzIGNoYW5nZWQgYW5kIDxjb2RlPm1lc3NhZ2U8L2NvZGU+IHdhcyByZW5hbWVkIHRvDQo8 Y29kZT5sb2N0ZXh0PC9jb2RlPiA8L2xpPjxsaT5UaGUgTFNQIGhhbmRsZXIgaXMgc2VwYXJhdGVk IG91dCBhcyBhIG5ldyBwYWNrYWdlIChub3QgcHVibGlzaGVkIHlldCkgPC9saT48L3VsPg0KPC9k aXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnMmIzMTgwYiI+PC9hPkJ1ZyBGaXhlczxicj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcyYjMxODBiIj4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48Yj5EaWFnbm9zdGljOjwvYj4gZml4IGFuZCBpbXByb3ZlIDxjb2RlPnN0 cmluZ19vZl90ZXh0PC9jb2RlPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPig8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvaXNzdWVzLzgzIj4jODM8L2E+KSAoPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9hc2FpL2NvbW1pdC9lMzJhZGM1ZmJiZDhjY2E2 YzJjMGY2MzNhZmEyZWMxYmViNzE2ZjcxIj5lMzJhZGM1PC9hPikNCjwvbGk+PGxpPig8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvY29tbWl0L2IwMGQ4Y2QyZWVlOWU1MWVh ODlmZWQ4ZDA5ODhkMjBmYjc5NjRlMDAiPmIwMGQ4Y2Q8L2E+KQ0KPC9saT48L3VsPg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnZWVlZmQxYiI+PC9hPkZlYXR1cmVzPGJy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2VlZWZkMWIiPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPmludHJvZHVjZSA8Yj5TdHJ1Y3R1cmVkUmVwb3J0ZXI8L2I+ IGZvciBmdWxseSBzdHJ1Y3R1cmVkIG1lc3NhZ2VzDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ KDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvYXNhaS9pc3N1ZXMvOTciPiM5Nzwv YT4pICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvY29tbWl0L2FkZDY1 ZjgxZGRjNmEzNzczNGQzMmM0MzYzZDdhYmY0NWQ5NmFhM2MiPmFkZDY1Zjg8L2E+KQ0KPC9saT48 L3VsPg0KPC9saT48bGk+PGI+UmFuZ2U6PC9iPiBhbGxvdyBzdHJpbmcgKGluLW1lbW9yeSkgc291 cmNlcw0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPig8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vUmVkUFJML2FzYWkvaXNzdWVzLzkwIj4jOTA8L2E+KSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL1JlZFBSTC9hc2FpL2NvbW1pdC9hZTYyNzQxOTMzZjY4ODFhMWRhOGY1M2JlNDUyNDlk MzQ3OTE4MzIxIj5hZTYyNzQxPC9hPikNCjwvbGk+PGxpPig8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vUmVkUFJML2FzYWkvaXNzdWVzLzEwMSI+IzEwMTwvYT4pICg8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvY29tbWl0LzRiNjgxOWEyODljNTE0ZjkyZjBmYmIwNmJl ZTZhYzViZDc5YTA5NjIiPjRiNjgxOWE8L2E+KQ0KPC9saT48bGk+KDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9SZWRQUkwvYXNhaS9jb21taXQvYTk0NGU2NjhhYzE2NTMyMDU5ZGZmMjYwNjQ3 MTJjNjMwMGMzYjE1YiI+YTk0NGU2NjwvYT4pDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT48Yj5UdHk6 PC9iPiBjb21wbGV0ZWx5IHJlZGVzaWduIHRoZSBUVFkgb3V0cHV0DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+KDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvYXNhaS9pc3N1ZXMv ODEiPiM4MTwvYT4pICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvY29t bWl0Lzk2ODViYzkyZTBjYzFmYmZmMTUyODE0ZDlhN2EzNDBmMTQ4NzFiZTUiPjk2ODViYzk8L2E+ KQ0KPC9saT48bGk+KDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvYXNhaS9pc3N1 ZXMvOTEiPiM5MTwvYT4pICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkv Y29tbWl0LzA3ZmUyNDEwNDQwNGEzM2VhMjEzYzE5MTA2NzFkMmZhNGQxNDUzMWMiPjA3ZmUyNDE8 L2E+KQ0KPC9saT48bGk+KDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvYXNhaS9p c3N1ZXMvOTMiPiM5MzwvYT4pICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2Fz YWkvY29tbWl0L2MzZjA3NDc5MjU0YWQwMjgyMzUwMDI2MjExOGRlNjQ5NjY2ZTYxMjgiPmMzZjA3 NDc8L2E+KQ0KPC9saT48bGk+KDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvYXNh aS9jb21taXQvMzllNzE1NGI3NDZiNTQ0NGJjOTdhMjRiZGJiMjZlNTVhODNiZDJkOCI+MzllNzE1 NDwvYT4pDQo8L2xpPjxsaT4oPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9hc2Fp L2NvbW1pdC9hOWNhY2ExZjJlNDZlOTgyZDhmYTU2YTY5NTI4ZGYzOTBkYzZmMWVmIj5hOWNhY2Ex PC9hPikNCjwvbGk+PGxpPig8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkv aXNzdWVzLzExNCI+IzExNDwvYT4pICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJM L2FzYWkvY29tbWl0LzVkMjA2NmJmNTMwYzQxZTJhOTIwYjYyNThkOTA1Y2ZmZWVlZjkyMjkiPjVk MjA2NmI8L2E+KQ0KPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+VFNhbiBzdXBwb3J0IGluIE9DYW1sIDUuMSBhbmQg YmxvZyBwb3N0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4N CjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdHNh bi1zdXBwb3J0LWluLW9jYW1sLTUtMS1hbmQtYmxvZy1wb3N0LzEzMzA2LzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi10c2FuLXN1cHBvcnQtaW4tb2NhbWwtNS0xLWFuZC1ibG9n LXBvc3QvMTMzMDYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMDE0ZmYxZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzAxNGZmMWYiPkZh YnJpY2UgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmcwMTRmZjFmIj4NCjxwPldpdGggPGI+VGhyZWFkU2FuaXRpemVyPC9iPiBzdXBwb3J0IHRv IGJlIHBhcnQgb2YgPGI+T0NhbWwgNS4yPC9iPiwgd2UgKEBvdGluaSBhbmQgSSkgd2FudGVkIHRv IGxldCB5b3Uga25vdyBhYm91dCBhIGNvdXBsZSBvZiBuZXdzIG9uIHRoZSBzdWJqZWN0Lg0KPC9w Pg0KPHA+SWYgeW91IGRvbuKAmXQgYWxyZWFkeSBrbm93IGFib3V0IGl0LCBUaHJlYWRTYW5pdGl6 ZXIgKGFsc28ga25vd24gYXMgVFNhbikgaXMgYSBzcGVjaWFsIGluc3RydW1lbnRhdGlvbiBhZGRl ZCB0byB5b3VyIHByb2dyYW0gdG8gZGV0ZWN0DQo8Yj5kYXRhIHJhY2VzPC9iPi4gPGk+UXVpY2sg cGVkYW50aWMgcmVtaW5kZXIgd2l0aCB0aGUgZGVmaW5pdGlvbiBvZiBhIGRhdGEgcmFjZTo8L2k+ IDpuZXJkX2ZhY2U6DQo8L3A+DQo8YmxvY2txdW90ZT4NCjxwPkEgZGF0YSByYWNlIGlzIHdoZW4g dHdvIG9yIG1vcmUgdGhyZWFkcyBhY2Nlc3MgdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGNvbmN1 cnJlbnRseSwgYW5kIGF0IGxlYXN0IG9uZSBvZiB0aGUgYWNjZXNzZXMgaXMgYSB3cml0ZS4gRGF0 YSByYWNlcyBjYW4gbGVhZCB0byBwYXJ0aWN1bGFybHkgaGFyZC10by1kZWJ1ZyBwcm9ibGVtcy4N CjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPldlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoYXQg d2UgaGF2ZSA8Yj5iYWNrcG9ydGVkIFRTYW4gdG8gT0NhbWwgNS4xPC9iPiwgc28gdGhhdCB5b3Ug Y2FuIHN0YXJ0IHVzaW5nIGl0IHJpZ2h0IGF3YXkuIFRoaXMgdmVyc2lvbiBiZW5lZml0cyBmcm9t IGENCjxiPm1vcmUgdXAtdG8tZGF0ZSBjb21waWxlcjwvYj4gdGhhbiB0aGUgNS4wIGJhY2twb3J0 LCBhbmQgd2lsbCBhbHNvIDxiPnBlcmZvcm0gYmV0dGVyPC9iPiBhcyBtYW55IGltcHJvdmVtZW50 cyBoYXZlIGJlZW4gbWFkZSB0byB0aGUgVFNhbiBpbnRlZ3JhdGlvbi4gVGhlIGltcGFjdCBvbiB5 b3VyIHByb2dyYW0gcnVudGltZSB1bmRlciBUU2FuIHdpbGwgYmUgbG93ZXIuIDpyb2NrZXQ6DQo8 L3A+DQo8cD5UbyBnZXQgaXQgcnVubmluZyBvbiB5b3VyIG1hY2hpbmUsIGl04oCZcyBhcyBzaW1w bGUgYXM6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc0NTcxOTEyIj4NCm9wYW0g dXBkYXRlDQpvcGFtIHN3aXRjaCBjcmVhdGUgNS4xLjAmIzQzO3RzYW4NCjwvcHJlPg0KPHA+Om9w ZW5fYm9vazogV2UgaGFkIHRoZSBvcHBvcnR1bml0eSB0byBwcmVzZW50IFRTYW4gYXQgdGhlIDxi PklDRlAgMjAyMyBPY2FtbCBXb3Jrc2hvcDwvYj4sIHVuZm9ydHVuYXRlbHkgdGhlIHJlY29yZGlu ZyBpc27igJl0IGF2YWlsYWJsZSB5ZXQuIDpmYWNlX2hvbGRpbmdfYmFja190ZWFyczogQnV0IGlm IHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gbGVhcm5pbmcgbW9yZSBvZiBhYm91dA0KPGI+aG93IFRT YW4gd29ya3M8L2I+LCBhbmQgdGhlIGNoYWxsZW5nZXMgd2UgZmFjZWQgaW4gPGI+aW50ZWdyYXRp bmc8L2I+IGl0IHdpdGggdGhlIE9DYW1sIGNvbXBpbGVyIHdl4oCZdmUgd3JpdHRlbiBhbg0KPGI+ YXJ0aWNsZTwvYj4gYXQgPGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMTAt MTgtb2ZmLXRvLXRoZS1yYWNlcy11c2luZy10aHJlYWRzYW5pdGl6ZXItaW4tb2NhbWwvIj4NCmh0 dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTEwLTE4LW9mZi10by10aGUtcmFjZXMtdXNpbmct dGhyZWFkc2FuaXRpemVyLWluLW9jYW1sLzwvYT4hDQo8L3A+DQo8cD46dGVhY2hlcjogRm9yIGEg bW9yZSA8Yj5oYW5kcy1vbiBleHBlcmllbmNlPC9iPiwgQGptaWQgaGFzIGFsc28gYWRkZWQgYSA8 Yj50dXRvcmlhbDwvYj4NCjxjb2RlPlRyYW5zaXRpb25pbmcgdG8gTXVsdGljb3JlIHdpdGggVGhy ZWFkU2FuaXRpemVyPC9jb2RlPiwgd2hpY2ggd2Fsa3MgeW91IHRocm91Z2ggdGhlIHN0ZXBzIG9m IGluc3RhbGxpbmcgVFNhbiwgdXNpbmcgaXQgdG8gZGV0ZWN0IGRhdGEgcmFjZXMgaW4gb25lIGV4 YW1wbGUsIGFuZCBhZGRyZXNzaW5nIHRoZW0uIEl04oCZcyBhdmFpbGFibGUgYXQNCjxhIGhyZWY9 Imh0dHBzOi8vd3d3Lm9jYW1sLm9yZy9kb2NzL211bHRpY29yZS10cmFuc2l0aW9uIj5odHRwczov L3d3dy5vY2FtbC5vcmcvZG9jcy9tdWx0aWNvcmUtdHJhbnNpdGlvbjwvYT4uDQo8L3A+DQo8cD5I YXBweSBkYXRhIHJhY2UgaHVudGluZywgYW5kIGhhdmUgYSBmdW4gd2l0aCBwYXJhbGxlbGlzbSEg Om5pbmphOiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+TWVsYW5nZSAyLjA8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tZWxhbmdlLTItMC8xMzA3 My8yIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1lbGFuZ2UtMi0wLzEzMDczLzI8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzYxOWYzMDki IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2MTlmMzA5Ij5BbnRvbmlvIE51bm8gTW9u dGVpcm8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc2MTlmMzA5Ij4NCjxwPldlIGhhdmUgc2luY2UgcmVsZWFzZWQgTWVsYW5nZSAyLjEgd2l0 aCB0aGUgZm9sbG93aW5nIGZpeGVzIGFuZCBpbXByb3ZlbWVudHM6IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT5BZGQgVFJNQyAoVGFpbCBSZWN1cnNpb24gTW9kdWxvIENvbnMpIHN1cHBv cnQgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tZWxhbmdlLXJlL21lbGFuZ2UvcHVsbC83 NDMiPm1lbGFuZ2UtcmUvbWVsYW5nZSM3NDM8L2E+KQ0KPC9saT48bGk+W3BsYXlncm91bmRdOiBB ZGQgPGNvZGU+bWVsYW5nZS5kb208L2NvZGU+IHRvIGJ1bmRsZSAoPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZS9wdWxsLzc3OSI+bWVsYW5nZS1yZS9tZWxhbmdl Izc3OTwvYT4pDQo8L2xpPjxsaT5GaXggPGNvZGU+U3lzLmFyZ3Y8L2NvZGU+IHJ1bnRpbWUgdG8g bWF0Y2ggZGVjbGFyZWQgdHlwZSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21lbGFuZ2Ut cmUvbWVsYW5nZS9wdWxsLzc5MSI+bWVsYW5nZS1yZS9tZWxhbmdlIzc5MTwvYT4pDQo8L2xpPjxs aT5NYWtlIDxjb2RlPidhIEpzLnQ8L2NvZGU+IGFic3RyYWN0IChhZ2FpbiksIGZpeGluZyBhIHJl Z3Jlc3Npb24gd2hlbiBicmluZ2luZyBiYWNrIE9DYW1sLXN0eWxlIG9iamVjdHMgZnJvbSBCdWNr bGVTY3JpcHQgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tZWxhbmdlLXJlL21lbGFuZ2Uv cHVsbC83ODYiPm1lbGFuZ2UtcmUvbWVsYW5nZSM3ODY8L2E+KQ0KPC9saT48bGk+RG9u4oCZdCBp c3N1ZSDigJx1bnVzZWQgYXR0cmlidXRl4oCdIHdhcm5pbmcgZm9yIHdlbGwtZm9ybWVkIDxjb2Rl PkBAQG1lbC5jb25maWc8L2NvZGU+IGluIGludGVyZmFjZSBmaWxlcyAoPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZS9wdWxsLzgwMCI+bWVsYW5nZS1yZS9tZWxh bmdlIzgwMDwvYT4pDQo8L2xpPjxsaT5TdG9wIHNob3dpbmcgPGNvZGU+SnNfXy5Kc19pbnRlcm5h bDwvY29kZT4gaW4gdHlwZXMgYW5kIGVycm9yIG1lc3NhZ2VzICg8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vbWVsYW5nZS1yZS9tZWxhbmdlL3B1bGwvNzk4Ij5tZWxhbmdlLXJlL21lbGFuZ2Uj Nzk4PC9hPikNCjwvbGk+PGxpPkZpeCBwcmludGluZyBvZiBPQ2FtbC1zdHlsZSBvYmplY3RzIGFu ZCB1bmN1cnJpZWQgYXBwbGljYXRpb24gKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tZWxh bmdlLXJlL21lbGFuZ2UvcHVsbC84MDciPm1lbGFuZ2UtcmUvbWVsYW5nZSM4MDc8L2E+KQ0KPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPmRyZWFtLWh0bWwgMS4wLjA8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLTEtMC0w LzEyNzg3LzIiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0xLTAt MC8xMjc4Ny8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc4NmMzYWEwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnODZjM2FhMCI+WWF3YXIg QW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzg2YzNhYTAiPg0KPHA+W0FOTl0gZHJlYW0taHRtbCAxLjEuMCA8L3A+DQo8cD5TbWFsbCB1 cGRhdGUgdG8gYWRkIHNvbWUgbWluaW1hbCBTVkcgc3VwcG9ydCAoUFJzIHRvIGFkZCBtb3JlIFNW RyB0YWdzIGFuZCBhdHRyaWJ1dGVzIHdlbGNvbWUpLiBBbHNvIGFkZGVkDQo8Y29kZT5mZXRjaHBy aW9yaXR5PC9jb2RlPiBhdHRyaWJ1dGUuIEUuZy4gPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1j b250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPkRyZWFtX2h0bWw8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPm9zaV9sb2dvPC9zcGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5TVkc8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgc3ZnIFt4bWxuczsgdmlld2JveCA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+bWluX3g8L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPjA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5taW5feTwv c3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+fndpZHRoPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgy NGY7Ij4xMDA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5oZWlnaHQ8L3Nw YW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjEwMDwvc3Bhbj5dIFsNCiAgICBwYXRo IFsNCiAgICAgIGQgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7TTM0LDkzbDEx LC0yOWExNSwxNSAwLDEsMSA5LDBsMTEsMjlhNDUsNDUgMCwxLDAgLTMxLDB6JnF1b3Q7PC9zcGFu PjsNCiAgICAgIHN0cm9rZSA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDsjMTQy JnF1b3Q7PC9zcGFuPjsNCiAgICAgIHN0cm9rZV93aWR0aCA8c3BhbiBzdHlsZT0iY29sb3I6ICNj YTM0MDA7Ij4mcXVvdDsyJnF1b3Q7PC9zcGFuPjsNCiAgICAgIGZpbGwgPHNwYW4gc3R5bGU9ImNv bG9yOiAjY2EzNDAwOyI+JnF1b3Q7IzRhNSZxdW90Ozwvc3Bhbj5dIDxzcGFuIHN0eWxlPSJjb2xv cjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPg0KICBdDQoN CjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnVuaW1wb3J0YW50PC9zcGFuPiA9DQog IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVu IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5IVE1MPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIGlt ZyBbDQogICAgc3JjIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90Oy9pbWFnZXMv aW5fdmlld3BvcnRfYnV0X25vdF9pbXBvcnRhbnQuc3ZnJnF1b3Q7PC9zcGFuPjsNCiAgICBmZXRj aHByaW9yaXR5IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjog I2ZjZjdlZjsiPmBsb3c8L3NwYW4+Ow0KICAgIGFsdCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0 MDA7Ij4mcXVvdDtJJ20gYW4gdW5pbXBvcnRhbnQgaW1hZ2UhJnF1b3Q7PC9zcGFuPjsNCiAgXQ0K PC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5PQ2FtbCBQbGF0Zm9y bSBOZXdzbGV0dGVyOiBTZXB0ZW1iZXIgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci1zZXB0ZW1iZXItMjAyMy8xMzMx NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0 dGVyLXNlcHRlbWJlci0yMDIzLzEzMzE0LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnY2IzMDIxNSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2NiMzAyMTUiPlRoaWJhdXQgTWF0dGlvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnY2IzMDIxNSI+DQo8cD5XZWxjb21lIHRvIHRoZSBzaXh0 aCBlZGl0aW9uIG9mIHRoZSBPQ2FtbCBQbGF0Zm9ybSBuZXdzbGV0dGVyISA8L3A+DQo8cD5EaXZl IGludG8gdGhlIGxhdGVzdCB1cGRhdGVzIGZyb20gU2VwdGVtYmVyIGFuZCBkaXNjb3ZlciBob3cg dGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0iPg0KT0NhbWwgUGxh dGZvcm08L2E+IGlzIGV2b2x2aW5nLiBKdXN0IGxpa2UgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90YWcvcGxhdGZvcm0tbmV3c2xldHRlciI+DQpwcmV2aW91cyBuZXdzbGV0 dGVyczwvYT4sIGl0IHNwb3RsaWdodHMgdGhlIHJlY2VudCBkZXZlbG9wbWVudHMgYW5kIGVuaGFu Y2VtZW50cyB0byB0aGUgT0NhbWwgZGV2ZWxvcG1lbnQgd29ya2Zsb3dzLg0KPC9wPg0KPHA+SW4g YWRkaXRpb24gdG8gdGhlIHVwZGF0ZXMgb24gdGhlIFBsYXRmb3JtIHRlYW3igJlzIHByb2dyZXNz IGhpZ2hsaWdodGVkIGJlbG93LCBkb27igJl0IGhlc2l0YXRlIHRvDQo8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYS1yb2FkbWFwLWZvci10aGUtb2NhbWwtcGxhdGZvcm0tc2Vl a2luZy15b3VyLWZlZWRiYWNrLzEyMjM4Ij4NCnNoYXJlIHlvdXIgZmVlZGJhY2s8L2E+IG9uIHRo ZSB1cGNvbWluZyBQbGF0Zm9ybSByb2FkbWFwLiBXZeKAmXZlIGp1c3QgdXBkYXRlZCBpdCBiYXNl ZCBvbiB0aGUgbW9zdCByZWNlbnQgZmVlZGJhY2sgYW5kIGFyZSBhaW1pbmcgdG8gYWRvcHQgaXQg aW4gdGhlIGNvbWluZyB3ZWVrcywgYmFycmluZyBuZXcgY29uY2VybnMgZnJvbSB0aGUgY29tbXVu aXR5Lg0KPC9wPg0KPHA+SGFwcHkgcmVhZGluZyEgPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPkJ1aWxkaW5nIFBhY2thZ2VzDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+W0R1bmVdIEV4 cGxvcmluZyBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZSA8L2xpPjxsaT5bb3BhbV0gTmF0aXZl IFN1cHBvcnQgZm9yIFdpbmRvd3MgaW4gb3BhbSAyLjIgPC9saT48bGk+W0R1bmVdIER1bmUgVGVy bWluYWwgVXNlciBJbnRlcmZhY2UgPC9saT48bGk+W0R1bmVdIFN1cHBvcnQgb24gTmljaGUgUGxh dGZvcm1zIDwvbGk+PC91bD4NCjwvbGk+PGxpPkdlbmVyYXRpbmcgRG9jdW1lbnRhdGlvbg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPltvZG9jXSBBZGQgU2VhcmNoIENhcGFiaWxpdGllcyB0byBv ZG9jIDwvbGk+PGxpPltvZG9jXSBTeW50YXggZm9yIEltYWdlcyBhbmQgQXNzZXRzIGluIG9kb2Mg PC9saT48bGk+W0R1bmVdIEdlbmVyYXRlIERlcGVuZGVuY2llcyBEb2N1bWVudGF0aW9uIHdpdGgg RHVuZSA8L2xpPjwvdWw+DQo8L2xpPjxsaT5FZGl0aW5nIGFuZCBSZWZhY3RvcmluZyBDb2RlDQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+W01lcmxpbl0gU3VwcG9ydCBmb3IgUHJvamVjdC1XaWRl IFJlZmVyZW5jZXMgaW4gTWVybGluIDwvbGk+PGxpPltNZXJsaW5dIEltcHJvdmluZyBNZXJsaW7i gJlzIFBlcmZvcm1hbmNlIDwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNzBjMjk3NyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9 Im9yZzcwYzI5NzciPlJlbGVhc2VzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBp ZD0idGV4dC1vcmc3MGMyOTc3Ij4NCjxwPkhlcmUgYXJlIGFsbCB0aGUgbmV3IHZlcnNpb25zIG9m IFBsYXRmb3JtIHRvb2xzIHRoYXQgd2VyZSByZWxlYXNlZCB0aGlzIG1vbnRoOg0KPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxv Zy8yMDIzLTA5LTIyLW1lcmxpbi00LjExIj5NZXJsaW4gNC4xMTwvYT4gPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjMtMDktMjYtbWVybGluLTQuMTIiPk1l cmxpbiA0LjEyPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vs b2cvMjAyMy0wOS0xOS1vY2FtbGZvcm1hdC0wLjI2LjEiPk9DYW1sRm9ybWF0IDAuMjYuMTwvYT4N CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDIzLTA5LTI3 LW1keC0yLjMuMSI+TURYIDIuMy4xPC9hPiA8L2xpPjwvdWw+DQo8cD5Gb3IgZGV0YWlsZWQgcmVs ZWFzZSBub3RlcyBhbmQgYW5ub3VuY2VtZW50cywgZXhwbG9yZSB0aGUgPGEgaHJlZj0iaHR0cHM6 Ly9vY2FtbC5vcmcvY2hhbmdlbG9nIj4NCk9DYW1sIENoYW5nZWxvZzwvYT4uIDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2Y2EzYzJhIiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNmNhM2MyYSI+QnVpbGRpbmcgUGFja2FnZXM8L2g0Pg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzZjYTNjMmEiPjwvZGl2Pg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmc3MjU3OTc3Ij48L2E+PGI+W0R1bmVd PC9iPiBFeHBsb3JpbmcgUGFja2FnZSBNYW5hZ2VtZW50IGluIER1bmU8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNzI1Nzk3NyI+DQo8cD5Db250cmlidXRvcnM6 IEByZ3JpbmJlcmcgKFRhcmlkZXMpLCBATGVvbmlkYXMtZnJvbS1YSVYgKFRhcmlkZXMpLCBAZ3Jp ZGJ1Z3MgKFRhcmlkZXMpLCBAa2l0LXR5LWthdGUgKFRhcmlkZXMpLCBAQWxpenRlcg0KPC9wPg0K PHA+VGhlIGJpZ2dlc3QgaGlnaGxpZ2h0IGZyb20gU2VwdGVtYmVyIGlzIHRoYXQgdGhlIHdvcmsg dG8gZXhwb3NlIHRoZSBjb21waWxlciBhbmQgbGlicmFyaWVzIGZyb20gcGFja2FnZXMgaW5zdGFs bGVkIGJ5IER1bmUgdG8gdGhlIHJlc3Qgb2YgdGhlIHByb2plY3QgaXMgbm93IGNvbXBsZXRlISBU aGlzIG1lYW5zIHRoYXQgdGhlcmUgaXMgbm93IGEgcHJvdG90eXBlIG9mIER1bmUgcGFja2FnZSBt YW5hZ2VtZW50IHRoYXQgY2FuIGJlIHVzZWQgdG8NCiBidWlsZCBwcm9qZWN0cyB0aGF0IGRlcGVu ZCBvbiAoc2ltcGxlKSBvcGFtIHBhY2thZ2VzISBUaGlzIGlzIHN0aWxsIGFuIGVhcmx5IHByb3Rv dHlwZSB0aGF04oCZcyBub3QgcmVhZHkgdG8gYmUgdGVzdGVkIG91dHNpZGUgb2YgdGhlIGNvcmUg dGVhbSwgYnV0IHN0aWxsIGEgc2lnbmlmaWNhbnQgbWlsZXN0b25lOiA6dGFkYTohDQo8L3A+DQo8 cD5JbiBhZGRpdGlvbiB0byB0aGlzLCB3b3JrIGluIFNlcHRlbWJlciBmb2N1c3NlZCBvbiB0aHJl ZSBhcmVhczogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkluY3JlYXNpbmcgY292ZXJh Z2Ugb2Ygb3BhbSBmZWF0dXJlcyB0byBzdXBwb3J0IG1vcmUgb3BhbSBwYWNrYWdlcyBmcm9tIHRo ZSA8Y29kZT4NCm9wYW0tcmVwb3NpdG9yeTwvY29kZT4uIFRoaXMgbW9udGgsIHRoZSBEdW5lIHRl YW0gYWRkZWQgc3VwcG9ydCBmb3IgbmV3IGZpZWxkcywgaW5jbHVkaW5nDQo8Y29kZT5idWlsZC1l bnY8L2NvZGU+LCA8Y29kZT5zZXRlbnY8L2NvZGU+LCBhbmQgPGNvZGU+c3Vic3Q8L2NvZGU+LCBh bmQgdGhleSBhbHNvIGFkZGVkIHN1cHBvcnQgZm9yIHBhdGNoaW5nLg0KPC9saT48bGk+RGVzaWdu aW5nIGFuZCBpbXBsZW1lbnRpbmcgYSBzdHJpbmcgbWFuaXB1bGF0aW9uIERTTCBmb3IgRHVuZSBj b25maWd1cmF0aW9ucy4gVGhpcyB3aWxsIGFsbG93IHVzZXJzIHRvIGV4cHJlc3MgdGhlIHNhbWUg YW1vdW50IG9mIGR5bmFtaXNtIGZvdW5kIGluIG9wYW0gZmlsdGVycyBpbiBEdW5lIHBhY2thZ2Ug bG9ja2ZpbGVzLCB3aGljaCBpcyBuZWNlc3NhcnkgZm9yIGNvbnZlcnRpbmcgb3BhbQ0KPGNvZGU+ YnVpbGQ8L2NvZGU+IGFuZCA8Y29kZT5pbnN0YWxsPC9jb2RlPiBjb21tYW5kcyBpbnRvIER1bmUg ZXhwcmVzc2lvbnMuIDwvbGk+PGxpPlN0YXJ0ZWQgd29ya2luZyBvbiBzdXBwb3J0IGZvciBjdXN0 b20gb3BhbSByZXBvc2l0b3JpZXMgYnkgbWFraW5nIHRoZSA8Y29kZT5vcGFtLXJlcG9zaXRvcnk8 L2NvZGU+IGNvbmZpZ3VyYWJsZSBpbg0KPGNvZGU+ZHVuZS13b3Jrc3BhY2U8L2NvZGU+LiBUaGUg bmV4dCBzdGVwIGlzIHRvIGV4cGVyaW1lbnQgb24gaG93IG9wYW0gcmVwb3NpdG9yaWVzIGFyZSBz dG9yZWQgYW5kIGFjY2Vzc2VkLiBPbmUgaWRlYSBpcyB0aGF0IGFsbCBvcGFtIHJlcG9zaXRvcmll cyB3b3VsZCBiZSBzdG9yZWQgaW4gb25lIHJldmlzaW9uIHN0b3JhZ2UgdGhhdCB3b3VsZCBzdXBw bHkgYWxsIHRoZSBkYXRhLiBUaGlzIGhhcyB0aGUgYWR2YW50YWdlIHRoYXQgaW5jcmVtZW50YWwN CiB1cGRhdGVzIGFyZSBzbWFsbCwgd2hpY2ggd29yayBsaWtlIHB1bGxpbmcgdmlhIEdpdC4gVGhl IHJlcG8gZG9lc27igJl0IG5lZWQgdG8gYmUgdW5jb21wcmVzc2VkLCB0aHVzIGxlc3Mgc3RvcmFn ZSBhbmQgaW5vZGVzIHVzZWQuDQo8L2xpPjwvdWw+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk1vdmUgcGFja2FnZXMgdG8gcHJpdmF0ZSBjb250 ZXh0IOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg0Njci Pg0Kb2NhbWwvZHVuZSM4NDY3PC9hPiA8L2xpPjxsaT5UcmFuc2xhdGUgPGNvZGU+YnVpbGQtZW52 PC9jb2RlPiBmcm9tIG9wYW0gZmlsZSBpbnRvIGxvY2sgZGlyIOKAkyA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg3MDEiPg0Kb2NhbWwvZHVuZSM4NzAxPC9hPiA8 L2xpPjxsaT5UcmFuc2xhdGUgPGNvZGU+c2V0ZW52PC9jb2RlPiBmcm9tIG9wYW0gZmlsZSBpbnRv IER1bmUgbG9jayBkaXIg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L3B1bGwvODcwOCI+DQpvY2FtbC9kdW5lIzg3MDg8L2E+IDwvbGk+PGxpPlRyYW5zbGF0ZSA8Y29k ZT5zdWJzdHM8L2NvZGU+IGZpZWxkIG9mIG9wYW0gZmlsZSBpbnRvIGJ1aWxkIGFjdGlvbiDigJMg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC84NjY5Ij4NCm9jYW1s L2R1bmUjODY2OTwvYT4gPC9saT48bGk+QWRkIHBhdGNoaW5nIHN1cHBvcnQgdG8gRHVuZSBwa2cg 4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODY1NCI+DQpv Y2FtbC9kdW5lIzg2NTQ8L2E+IDwvbGk+PGxpPkNvcHkgZmlsZXMgZnJvbSBvcGFtIHJlcG9zaXRv cnkgdG8gbG9jayBkaXIg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L3B1bGwvODY0OCI+DQpvY2FtbC9kdW5lIzg2NDg8L2E+IDwvbGk+PGxpPjxjb2RlPmR1bmUubG9j azwvY29kZT4gaXMgaWdub3JlZCBpbiA8Y29kZT4tLXJlbGVhc2U8L2NvZGU+IOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg3NjEiPg0Kb2NhbWwvZHVuZSM4 NzYxPC9hPiA8L2xpPjxsaT5PcGFtIHJlcG9zaXRvcmllcyBmcm9tIDxjb2RlPmR1bmUtd29ya3Nw YWNlPC9jb2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC84NjMzIj4NCm9jYW1sL2R1bmUjODYzMzwvYT4gPC9saT48bGk+QWRkIDxjb2RlPmR1bmUgcGtn IG91dGRhdGVkPC9jb2RlPiBjb21tYW5kIGZvciBzaG93aW5nIG91dGRhdGVkIHBhY2thZ2VzIOKA kyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg3NzMiPg0Kb2Nh bWwvZHVuZSM4NzczPC9hPiA8L2xpPjxsaT5FeHBlcmltZW50YWwgc3RyaW5nIGxpc3QgbGFuZ3Vh Z2Ug4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODU5NiI+ DQpvY2FtbC9kdW5lIzg1OTY8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9 Im9yZzBmMThlYmUiPjwvYT48Yj5bb3BhbV08L2I+IE5hdGl2ZSBTdXBwb3J0IGZvciBXaW5kb3dz IGluIG9wYW0gMi4yPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9y ZzBmMThlYmUiPg0KPHA+Q29udHJpYnV0b3JzOiBAcmpib3UgKE9DYW1sUHJvKSwgQGtpdC10eS1r YXRlIChUYXJpZGVzKSwgQGRyYTI3IChUYXJpZGVzKSwgQEFsdEdyIChPQ2FtbFBybykNCjwvcD4N CjxwPkluIHByZXBhcmF0aW9uIGZvciB0aGUgdXBjb21pbmcgcmVsZWFzZSBvZiBvcGFtIDIuMn5h bHBoYTMsIHRoZSB3b3JrIGhhcyBmb2N1c3NlZCBvbiBiZXR0ZXIgaGFuZGxpbmcgb2YgcGF0aCBy ZXdyaXRpbmcgZm9yIHRoZQ0KPGNvZGU+c2V0ZW52PC9jb2RlPiBhbmQgPGNvZGU+YnVpbGQtZW52 PC9jb2RlPiBvcGFtIGZpZWxkcy4gPC9wPg0KPHA+VGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtL3B1bGwvNTYzNiI+cHJvcG9zZWQgY2hhbmdlPC9hPiB3aWxsIGFsbG93 IHVzZXJzIHRvIHNwZWNpZnksIGluIHRoZSBvcGFtIGZpbGUsIHRoZSBwYXRoIHNlcGFyYXRvciBh bmQgZm9ybWF0IHRoZXkgd2FudCBmb3IgZWFjaCBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbg0KPGNv ZGU+c2V0ZW52fi9+YnVpbGQtZW52PC9jb2RlPi4gVGhpcyBlbnN1cmVzIHRoZSBlbnZpcm9ubWVu dCB2YXJpYWJsZXMgYXJlIGNvcnJlY3RseSBzZXQgYW5kIHVzYWJsZSBvbiBXaW5kb3dzLg0KPC9w Pg0KPHA+VGhlIFBSIGlzIGluIHJldmlldyBhbmQgbm90IHF1aXRlIHJlYWR5IHRvIGJlIG1lcmdl ZCwgYnV0IHRoaXMgaXMgdGhlIGxhc3QgaXNzdWUgc2NvcGVkIGZvciBvcGFtIDIuMn5hbHBoYTMu DQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPlBhdGggcmV3cml0aW5nIGZvciA8Y29kZT5zZXRlbnY6PC9jb2RlPiBhbmQgPGNvZGU+YnVp bGQtZW52OjwvY29kZT4gLSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9w dWxsLzU2MzYiPg0Kb2NhbWwvb3BhbSM1NjM2PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+ PGxpPjxhIGlkPSJvcmdkMGEzZWRlIj48L2E+PGI+W0R1bmVdPC9iPiBEdW5lIFRlcm1pbmFsIFVz ZXIgSW50ZXJmYWNlPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9y Z2QwYTNlZGUiPg0KPHA+Q29udHJpYnV0b3JzOiBAQWxpenRlciwgQHJncmluYmVyZyAoVGFyaWRl cykgPC9wPg0KPHA+Rm9sbG93aW5nIHRoZSBtZXJnZSBvZiB0aGUgUFIgdG8gcG9ydCBEdW5lIFRV SSB0byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbGV0LWRlZi9sd2QiPg0KTm90dHVpPC9h PiBpbiBBdWd1c3QsIGFuZCB0aGUgYWRkaXRpb24gb2YgYSBmZXcgZmVhdHVyZXMsIEBBbGl6dGVy IGNvbnRpbnVlZCB0aGUgd29yayBvbiBidWlsZGluZyBhIGZ1bGwtb24gVGVybWluYWwgVXNlciBJ bnRlcmZhY2UgZm9yIER1bmUgd2l0aCB0d28gcHVsbCByZXF1ZXN0cywgbmFtZWx5IHRoZSBhZGRp dGlvbiBvZiBhDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg2 MDEiPkpvYnMgdGFiIGluIDxjb2RlPnR1aTwvY29kZT4gbW9kZTwvYT4sIGFuZCBzdXBwb3J0IGZv cg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC84NjE5Ij5tdWx0 aWxpbmUgc3RhdHVzIGxpbmVzPC9hPi4gPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BZGQgSm9icyB0YWIgaW4gPGNvZGU+dHVpPC9jb2Rl PiBtb2RlIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg2 MDEiPg0Kb2NhbWwvZHVuZSM4NjAxPC9hPiA8L2xpPjxsaT5NdWx0aWxpbmUgc3RhdHVzIHN1cHBv cnQg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODYxOSI+ DQpvY2FtbC9kdW5lIzg2MTk8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9 Im9yZzUyZjM1ZTIiPjwvYT48Yj5bRHVuZV08L2I+IFN1cHBvcnQgb24gTmljaGUgUGxhdGZvcm1z PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzUyZjM1ZTIiPg0K PHA+Q29udHJpYnV0b3JzOiBAQWxpenRlciA8L3A+DQo8cD5EdW5lIG5vdyBidWlsZHMgb24gYm90 aCA8YSBocmVmPSJodHRwczovL3d3dy5oYWlrdS1vcy5vcmcvIj5IYWlrdTwvYT4gYW5kIEFuZHJv aWQgKHVzaW5nIFRlcm11eCkhIFRoaXMgbWVhbnMgaXQgaXMgbm93IHBvc3NpYmxlIHRvIGJ1aWxk IGFuZCBpbnN0YWxsIGJvdGggT0NhbWwgYW5kIER1bmUgb24gdGhlc2UgcGxhdGZvcm1zLCB3aGlj aCBzaG91bGQgcGF2ZSB0aGUgd2F5IGZvciBtb3JlIG5hdGl2ZSBPQ2FtbCBkZXZlbG9wbWVudC4N CjwvcD4NCjxwPkZvciByZWZlcmVuY2UsIGhlcmUgaXMgYSB0YWJsZSBvZiBEdW5l4oCZcyBwbGF0 Zm9ybSBzdXBwb3J0ICh3aXRoIDxjb2RlPj88L2NvZGU+IGluZGljYXRpbmcgdGhhdCBmdXJ0aGVy IHRlc3RpbmcgaXMgbmVlZGVkKToNCjwvcD4NCjx0YWJsZSBib3JkZXI9IjIiIGNlbGxzcGFjaW5n PSIwIiBjZWxscGFkZGluZz0iNiIgcnVsZXM9Imdyb3VwcyIgZnJhbWU9ImhzaWRlcyI+DQo8Y29s Z3JvdXA+PGNvbCBjbGFzcz0ib3JnLWxlZnQiPjxjb2wgY2xhc3M9Im9yZy1sZWZ0Ij48Y29sIGNs YXNzPSJvcmctbGVmdCI+PGNvbCBjbGFzcz0ib3JnLWxlZnQiPjxjb2wgY2xhc3M9Im9yZy1sZWZ0 Ij48Y29sIGNsYXNzPSJvcmctbGVmdCI+PC9jb2xncm91cD4NCjx0aGVhZD4NCjx0cj4NCjx0aCBz Y29wZT0iY29sIiBjbGFzcz0ib3JnLWxlZnQiPlBsYXRmb3JtPC90aD4NCjx0aCBzY29wZT0iY29s IiBjbGFzcz0ib3JnLWxlZnQiPlN1cHBvcnQ8L3RoPg0KPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJv cmctbGVmdCI+V2F0Y2g8L3RoPg0KPHRoIHNjb3BlPSJjb2wiIGNsYXNzPSJvcmctbGVmdCI+VFVJ PC90aD4NCjx0aCBzY29wZT0iY29sIiBjbGFzcz0ib3JnLWxlZnQiPkNhY2hlPC90aD4NCjx0aCBz Y29wZT0iY29sIiBjbGFzcz0ib3JnLWxlZnQiPlNhbmRib3hpbmc8L3RoPg0KPC90cj4NCjwvdGhl YWQ+DQo8dGJvZHk+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5MaW51eDwvdGQ+DQo8dGQg Y2xhc3M9Im9yZy1sZWZ0Ij5GdWxsPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+WWVz PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNs YXNzPSJvcmctbGVmdCI+TWFjT1M8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+RnVsbDwvdGQ+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+WWVz PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0 Ij5ZZXM8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPldpbmRvd3MgKERL TUwpPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkZ1bGw8L3RkPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+WWVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPk5vKjwvdGQ+DQo8dGQgY2xhc3M9 Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+Q29weSBvbmx5PC90ZD4N CjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5XaW5kb3dzIChNaW5HVyk8L3RkPg0K PHRkIGNsYXNzPSJvcmctbGVmdCI+TGltaXRlZDwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5Z ZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+WWVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxl ZnQiPlllczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPC90cj4NCjx0cj4N Cjx0ZCBjbGFzcz0ib3JnLWxlZnQiPldpbmRvd3MgKEN5Z3dpbik8L3RkPg0KPHRkIGNsYXNzPSJv cmctbGVmdCI+TGltaXRlZDwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRk IGNsYXNzPSJvcmctbGVmdCI+WWVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0i b3JnLWxlZnQiPkxpbnV4IChBbmRyb2lkKTwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5MaW1p dGVkPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1s ZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PzwvdGQ+DQo8dGQgY2xhc3M9Im9y Zy1sZWZ0Ij4/PC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5GcmVlQlNE PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkxpbWl0ZWQ8L3RkPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+WWVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+DQo8dGQgY2xhc3M9 Im9yZy1sZWZ0Ij4/PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPj88L3RkPg0KPC90cj4NCjx0 cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPk5ldEJTRDwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0 Ij5MaW1pdGVkPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlllczwvdGQ+DQo8dGQgY2xhc3M9 Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PzwvdGQ+DQo8dGQgY2xh c3M9Im9yZy1sZWZ0Ij4/PC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5P cGVuQlNEPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkxpbWl0ZWQ8L3RkPg0KPHRkIGNsYXNz PSJvcmctbGVmdCI+PzwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij4/PC90ZD4NCjx0ZCBjbGFz cz0ib3JnLWxlZnQiPj88L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PzwvdGQ+DQo8L3RyPg0K PHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+SGFpa3U8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVm dCI+TGltaXRlZDwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5ZZXM8L3RkPg0KPHRkIGNsYXNz PSJvcmctbGVmdCI+WWVzPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPj88L3RkPg0KPHRkIGNs YXNzPSJvcmctbGVmdCI+PzwvdGQ+DQo8L3RyPg0KPC90Ym9keT4NCjwvdGFibGU+DQo8cD5JZiB5 b3XigJlyZSB3b3JraW5nIG9uIG9uZSBvZiB0aGVzZSBwbGF0Zm9ybXMsIGRvbuKAmXQgaGVzaXRh dGUgdG8gb3BlbiBpc3N1ZXMgb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvaXNzdWVzIj4NCkR1bmXigJlzIGJ1ZyB0cmFja2VyPC9hPiBpZiB5b3UgZW5jb3VudGVyIGFu eSBwcm9ibGVtISA8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPkFkZCBIYWlrdSBzdXBwb3J0IOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg3OTUiPm9jYW1sL2R1bmUjODc5NTwvYT4NCjwvbGk+PC91 bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdkODgxNzRlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZDg4MTc0ZSI+R2Vu ZXJhdGluZyBEb2N1bWVudGF0aW9uPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBp ZD0idGV4dC1vcmdkODgxNzRlIj48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBp ZD0ib3JnNTE5MzI3OSI+PC9hPjxiPltvZG9jXTwvYj4gQWRkIFNlYXJjaCBDYXBhYmlsaXRpZXMg dG8gPGNvZGU+b2RvYzwvY29kZT48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnNTE5MzI3OSI+DQo8cD5Db250cmlidXRvcnM6IEBwYW5nbGVzZCAoVGFyaWRlcyks IEBFbWlsZVRyb3RpZ25vbiAoVGFyaWRlcyksIEBqdWxvdyAoVGFyaWRlcyksIEBqb25sdWRsYW0g KFRhcmlkZXMpDQo8L3A+DQo8cD5Xb3JrIGNvbnRpbnVlcyBvbiBhZGRpbmcgc2VhcmNoIGNhcGFi aWxpdGllcyB0byA8Y29kZT5vZG9jPC9jb2RlPiBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBkb2N1 bWVudGF0aW9uIGJyb3dzaW5nIGV4cGVyaWVuY2UuDQo8L3A+DQo8cD5JbiBTZXB0ZW1iZXIsIHRo ZSA8Y29kZT5vZG9jPC9jb2RlPiB0ZWFtIGNvbnRpbnVlZCByZXZpZXdpbmcgdGhlIGRpZmZlcmVu dCBwdWxsIHJlcXVlc3RzIHN0YXJ0ZWQgaW4gQXVndXN0LiBQZWVyLXJldmlld3Mgc3VnZ2VzdGVk IHNldmVyYWwgaW1wcm92ZW1lbnRzIHRvIHRvIHRoZSBDTEkgYW5kIHRoZSBsaWJyYXJ5IEFQSS4N CjwvcD4NCjxwPlRoZXkgYWxzbyB3b3JrZWQgb24gY2xpZW50LXNpZGUgcGVyZm9ybWFuY2UgaW1w cm92ZW1lbnRzIGJ5IGxvYWRpbmcgdGhlIHNlYXJjaCBzY3JpcHQgb25seSB3aGVuIHRoZSB1c2Vy IGNsaWNrcyBvbiB0aGUgc2VhcmNoIGJhciwgYW5kIHRoZXkgbWFkZSBxdWl0ZSBhIGxvdCBvZiBw cm9ncmVzcyBvbiB0aGUgVUkgb3ZlcmFsbC4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+U3VwcG9ydCBmb3Igc2VhcmNoIGluIDxjb2Rl Pm9kb2M8L2NvZGU+IOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9w dWxsLzk3MiI+DQpvY2FtbC9vZG9jIzk3MjwvYT4gPC9saT48bGk+Q29sbGVjdCBvY2N1cnJlbmNl cyBpbmZvcm1hdGlvbiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2Mv cHVsbC85NzYiPg0Kb2NhbWwvb2RvYyM5NzY8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48 bGk+PGEgaWQ9Im9yZ2Q0YmI5ODkiPjwvYT48Yj5bb2RvY108L2I+IFN5bnRheCBmb3IgSW1hZ2Vz IGFuZCBBc3NldHMgaW4gPGNvZGU+b2RvYzwvY29kZT48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNSIgaWQ9InRleHQtb3JnZDRiYjk4OSI+DQo8cD5Db250cmlidXRvcnM6IEBwYW5nbGVz ZCAoVGFyaWRlcykgPC9wPg0KPHA+VGhlIGVmZm9ydCB0byBhZGQgc3VwcG9ydCBmb3IgaW1hZ2Vz IGFuZCBhc3NldHMgdG8gPGNvZGU+b2RvYzwvY29kZT4gYW5kIGJyaW5nIGltYWdlcyB0byB0aGUg T0NhbWwub3JnIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBjb250aW51ZXMhDQo8L3A+DQo8cD5UaGlz IG1vbnRoLCBAcGFuZ2xlc2Qgb3BlbmVkIGEgUFIgd2l0aCBhbiA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMDIiPg0KaW1wbGVtZW50YXRpb24gZm9yIGFzc2V0 IHJlZmVyZW5jZXM8L2E+LiA8L3A+DQo8cD5UaGUgZXhhY3Qgc3ludGF4IGZvciBtZWRpYXMgd2Vu dCB0aHJvdWdoIHNldmVyYWwgZGVzaWducywgaW4gcGFydGljdWxhciB3aGV0aGVyIGEgbWVkaWEg aXMgYSBibG9jaywgYSBuZXN0YWJsZSBibG9jaywgb3IgYW4gaW5saW5lIGVsZW1lbnQuIEF0IHRo ZSBlbmQgb2YgdGhlIG1vbnRoLCBAcGFuZ2xlc2QgY3JlYXRlZCBhDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMDUiPlBSPC9hPiB0aGF0IGJ1aWxkcyBvbiB0 aGUgYXNzZXQgcmVmZXJlbmNlcyBQUiBpbiBvcmRlciB0byBhZGQgc3VwcG9ydCBmb3IgbWVkaWFz Lg0KPC9wPg0KPHA+Rm9yIHNvbWUgdGltZSwgdGhlcmUgaGFzIGJlZW4gbm8gb2ZmaWNpYWwgY29u dmVudGlvbiBvbiBob3cgZG9jdW1lbnRhdGlvbiBmb3Igb3BhbS1pbnN0YWxsZWQgcGFja2FnZXMg c2hvdWxkIGJlIGJ1aWx0LiBXaXRoIHRoZSBhZGRlZCBjb21wbGV4aXR5IG9mIGhhdmluZyBhc3Nl dHMsIGl0IHdhcyBhIGdvb2QgdGltZSB0byBzb2x2ZSB0aGlzLiBBDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMTEiPmRvY3VtZW50YXRpb24gUFI8L2E+IHdh cyBvcGVuZWQgZm9yIHRoaXMuIFdhcm0gdGhhbmsgeW91IHRvIEBkYnVlbnpsaSBmb3IgdGhlIHRo b3Vyb3VnaCByZXZpZXcgYW5kIHBhcnRpY2lwYXRpbmcgaW4gZXN0YWJsaXNoaW5nIHRoZXNlIGNv bnZlbnRpb25zIQ0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT5Bc3NldCBSZWZlcmVuY2VzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzEwMDIiPm9jYW1sL29kb2MjMTAwMjwvYT4NCjwvbGk+PGxp Pk1lZGlhcyBpbiA8Y29kZT5vZG9jPC9jb2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29kb2MvcHVsbC8xMDA1Ij4NCm9jYW1sL29kb2MjMTAwNTwvYT4gPC9saT48bGk+ RG9jdW1lbnQgcGFyZW50LWNoaWxkIGNvbnZlbnRpb24gZm9yIGluc3RhbGxlZCBwYWNrYWdlcyDi gJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2MvcHVsbC8xMDExIj4NCm9j YW1sL29kb2MjMTAxMTwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3Jn MzFkMzg4MCI+PC9hPjxiPltEdW5lXTwvYj4gR2VuZXJhdGUgRGVwZW5kZW5jaWVzIERvY3VtZW50 YXRpb24gd2l0aCBEdW5lPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0 LW9yZzMxZDM4ODAiPg0KPHA+Q29udHJpYnV0b3JzOiBAam9ubHVkbGFtIChUYXJpZGVzKSA8L3A+ DQo8cD5DdXJyZW50bHksIER1bmUgb25seSBrbm93cyBob3cgdG8gYnVpbGQgdGhlIGRvY3VtZW50 YXRpb24gZm9yIHRoZSBwYWNrYWdlcyBpbiB5b3VyIER1bmUgd29ya3NwYWNlLCBtZWFuaW5nIHRo YXQgeW91IGNhbiBvbmx5IHJlYWQgdGhlIGRvY3VtZW50YXRpb24gb2YgeW91ciBkZXBlbmRlbmNp ZXMgZnJvbSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL3BhY2thZ2VzIj5PQ2FtbC5v cmcgcGFja2FnZSBzaXRlPC9hPi4gQWx0ZXJuYXRpdmUgPGNvZGU+DQpvZG9jPC9jb2RlPiBkcml2 ZXJzLCBsaWtlIDxhIGhyZWY9Imh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL29kaWciPjxj b2RlPm9kaWc8L2NvZGU+PC9hPiwgYnVpbGQgZG9jdW1lbnRhdGlvbiBmb3IgYWxsIHRoZSBwYWNr YWdlcyBpbiB5b3VyIHN3aXRjaCBhbmQgaGF2ZSBiZWVuIHRoZSByZWNvbW1lbmRlZCBzb2x1dGlv biBmb3IgdXNlcnMgd2hvIHByZWZlciB0byByZWFkIHRoZSBkZXBlbmRlbmNpZXPigJkgZG9jdW1l bnRhdGlvbiBsb2NhbGx5Lg0KPC9wPg0KPHA+SW4gYW4gZWZmb3J0IHRvIGltcHJvdmUgdGhlIGRv Y3VtZW50YXRpb24gZ2VuZXJhdGlvbiBleHBlcmllbmNlIHdpdGggRHVuZSwgQGpvbmx1ZGxhbSB3 b3JrZWQgb24gYSBuZXcgdmVyc2lvbiBvZiBEdW5lIHJ1bGVzIHRvIGdlbmVyYXRlIHRoZSBkb2N1 bWVudGF0aW9uLiBXaXRoIHRoZXNlIHJ1bGVzLCBEdW5lIHdpbGwgZ2FpbiB0aGUgYWRkaXRpb25h bCBhYmlsaXR5IHRvIGJ1aWxkIHRoZSBjb21iaW5hdGlvbiBvZiB0aGUgdHdvOiBhIGNvaGVyZW50 DQogc2V0IG9mIGRvY3MgdGhhdCBjb3ZlciBib3RoIHN3aXRjaC1pbnN0YWxsZWQgbGlicmFyaWVz IGFuZCBsb2NhbCBsaWJyYXJpZXMuIDwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzg4MDMiPlBSPC9hPiBpcyBpbiByZXZpZXcgYW5kIGlzIHNl dCB0byBiZSBtZXJnZWQgaW4gdGhlIGNvbWluZyB3ZWVrcy4NCjwvcD4NCjxwPkZ1dHVyZSBwbGFu cyBmb3IgdGhlIG5ldyBydWxlcyBpbmNsdWRlIGJldHRlciBpbnRlZ3JhdGlvbiB3aXRoIHRoZSBy ZXN0IG9mIHRoZSBwbGF0Zm9ybSwgaW1wcm92ZW1lbnRzIGluIGNhcGFiaWxpdGllcyB0byBjb3Zl ciB0aGUgdXNlIGNhc2VzIHRoYXQNCjxjb2RlPmR1bmUgYnVpbGQgQGRvYzwvY29kZT4gY292ZXJz LCBpbnRlZ3JhdGlvbiBvZiBzb3VyY2UgcmVuZGVyaW5nLCBhbmQgaW50ZWdyYXRpb24gb2Ygc2Vh cmNoIChvbmNlIGl0IGxhbmRzIGluDQo8Y29kZT5vZG9jPC9jb2RlPiEpLiA8L3A+DQo8cD48Yj5B Y3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk5ldyA8Y29kZT5v ZG9jPC9jb2RlPiBydWxlIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVu ZS9wdWxsLzg4MDMiPg0Kb2NhbWwvZHVuZSM4ODAzPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv bGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2Y0OWY1NSIg Y2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzdmNDlmNTUiPkVkaXRpbmcgYW5kIFJlZmFj dG9yaW5nIENvZGU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y ZzdmNDlmNTUiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmdmNGUy NWIyIj48L2E+PGI+W01lcmxpbl08L2I+IFN1cHBvcnQgZm9yIFByb2plY3QtV2lkZSBSZWZlcmVu Y2VzIGluIE1lcmxpbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1v cmdmNGUyNWIyIj4NCjxwPkNvbnRyaWJ1dG9yczogQHZvb2Rvb3MgKFRhcmlkZXMpLCBAdHJlZmlz IChUYXJpZGVzKSwgQEVrZG9oaWJzIChPQ2FtbFBybyksIEBnYXNjaGUgKElOUklBKQ0KPC9wPg0K PHA+SW4gQXVndXN0LCB0aGUgTWVybGluIHRlYW0gb3BlbmVkIHRoZSBQUiBvbiB0aGUgY29tcGls ZXIgdGhhdCBhZGRzIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gaW4gdGhlIFNoYXBlcyB0byBp bXBsZW1lbnQgcHJvamVjdC13aWRlIHJlZmVyZW5jZXMuDQo8L3A+DQo8cD5UaGUgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTI1MDgiPlBSPC9hPiByZWNlaXZl ZCByZXZpZXdzLCBzbyB0aGUgdGVhbSB3b3JrZWQgb24gdGFraW5nIHRoZSBmZWVkYmFjayBpbnRv IGFjY291bnQgd2hpbGUgYWxzbyBjb250aW51aW5nIHdvcmsgb24gdGhlIHJlc3Qgb2YgdGhlIHN0 YWNrIChidWlsZCBzeXN0ZW0gcnVsZXMsIHRoZSBpbmRleGVyIGFuZCBuZXcgbG9jYXRlLCBhbmQg b2NjdXJyZW5jZXMgYmFja2VuZHMNCiBmb3IgTWVybGluKS4gPC9wPg0KPHA+VGhleSBhbHNvIGNv bnNvbGlkYXRlZCBhIHJlbGVhc2UgcGxhbiBhbmQgdGltZWxpbmUuIFRoZSBwbGFuIGlzIHRvIGZp cnN0IHJlbGVhc2UgYW4gZXhwZXJpbWVudGFsIDQuMTQtYmFzZWQgdmFyaWFudCBvZiB0aGUgY29t cGlsZXIgaW4gb3JkZXIgdG8gZ2F0aGVyIGZlZWRiYWNrIG9uIHRoaXMgZWFnZXJseSBhd2FpdGVk IGZlYXR1cmUgYmVmb3JlIHRoZSBlbmQgb2YgdGhlIHllYXIuIFRoZSBjdXJyZW50IGFpbSBpcyB0 byBwcm92aWRlIG9mZmljaWFsDQogcHJvamVjdC13aWRlIG9jY3VycmVuY2VzIHN1cHBvcnQgaW4g T0NhbWwgNS4yLiA8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPkFkZCBzdXBwb3J0IGZvciBwcm9qZWN0LXdpZGUgb2NjdXJyZW5jZXMgdG8g dGhlIGNvbXBpbGVyIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv cHVsbC8xMjUwOCI+DQpvY2FtbC9vY2FtbCMxMjUwODwvYT4gPC9saT48bGk+VXNlIG5ldyBjb21w aWxlIGluZm9ybWF0aW9uIGluIENNVCBmaWxlcyB0byBidWlsZCBhbmQgYWdncmVnYXRlIGluZGV4 ZXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92b29kb29zL29jYW1sLXVpZGVwcy9w dWxsLzUiPg0Kdm9vZG9vcy9vY2FtbC11aWRlcHMjNTwvYT4gPC9saT48bGk+RHVuZSBvcmNoZXN0 cmF0ZXMgaW5kZXggZ2VuZXJhdGlvbiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Zv b2Rvb3MvZHVuZS9wdWxsLzEiPg0Kdm9vZG9vcy9kdW5lIzE8L2E+IDwvbGk+PGxpPlVzZSBuZXcg Q01UIGluZm8gdG8gcHJvdmlkZSBidWZmZXIgb2NjdXJyZW5jZXMgYW5kIGluZGV4ZXMgZm9yIHBy b2plY3Qtd2lkZSBvY2N1cnJlbmNlcyDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92 b29kb29zL21lcmxpbi9wdWxsLzciPnZvb2Rvb3MvbWVybGluIzc8L2E+IDwvbGk+PGxpPlN1cHBv cnQgcHJvamVjdC13aWRlIG9jY3VycmVuY2VzIGluIDxjb2RlPm9jYW1sLWxzcDwvY29kZT4g4oCT IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92b29kb29zL29jYW1sLWxzcC9wdWxsLzEiPg0K dm9vZG9vcy9vY2FtbC1sc3AjMTwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBp ZD0ib3JnYTliNTgxOCI+PC9hPjxiPltNZXJsaW5dPC9iPiBJbXByb3ZpbmcgTWVybGlu4oCZcyBQ ZXJmb3JtYW5jZTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdh OWI1ODE4Ij4NCjxwPkNvbnRyaWJ1dGVkIGJ5OiBAcGl0YWctaGEgKFRhcmlkZXMpLCBAM1JhZmFs IChUYXJpZGVzKSwgQHZvb2Rvb3MgKFRhcmlkZXMpLCBAbGV0LWRlZiAoVGFyaWRlcykNCjwvcD4N CjxwPlRoZSBNZXJsaW4gdGVhbSBjb250aW51ZXMgd29yayBvbiBpbXByb3ZpbmcgTWVybGluIHBl cmZvcm1hbmNlLiA8L3A+DQo8cD5CZWZvcmUgZGl2aW5nIGludG8gc3BlY2lmaWMgcGVyZm9ybWFu Y2Ugb3B0aW1pc2F0aW9uLCB0aGV5IHdvcmtlZCBvbiBhIGJlbmNobWFya2luZyBDSSB0byBjYXRj aCBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucyBhbmQgbWVhc3VyZSBpbXByb3ZlbWVudHMuIFdoaWxl IGF0IGl0LCB0aGV54oCZdmUgYWxzbyB3b3JrZWQgb24gYSBmdXp6eSB0ZXN0aW5nIENJIHRvIGNh dGNoIGJlaGF2aW91ciByZWdyZXNzaW9ucy4NCjwvcD4NCjxwPkluIFNlcHRlbWJlciwgZm9sbG93 aW5nIHRoZSBQcm9vZiBvZiBDb25jZXB0IChQb0MpIG9mIHRoZSBmdXp6eS10ZXN0aW5nIENJIChm cm9tIHRoZSB3b3JrIGluIEp1bHkpLCB0aGUgdGVhbSBjb250aW51ZWQgdGhlaXIgd29yayBvbiBh ZGRyZXNzaW5nIHRoZSBsaW1pdGF0aW9ucyBvZiB0aGUgY3VycmVudCBDSSBpbXBsZW1lbnRhdGlv biB0aGF0IHdvdWxkIHByZXZlbnQgaXQgZnJvbSBiZWluZyBtZXJnZWQgaW4gTWVybGluLiBTcGVj aWZpY2FsbHksDQogdGhleSBmb2N1c3NlZCBvbiBmaW5kaW5nIGEgc29sdXRpb24gdG8gc3RvcmUg dGhlIGZ1enp5IHRlc3RpbmcgcmVzdWx0cyBpbiBhIHdheSB0aGF0IHdvdWxkbuKAmXQgYmxvYXQg dGhlIE1lcmxpbiByZXBvc2l0b3J5LiBUaGUgY3VycmVudCBhcHByb2FjaCBpcyB0byBzdG9yZSB0 aGUgZGF0YSBpbiBhIHNlcGFyYXRlIEdpdCByZXBvc2l0b3J5IGFuZCBwdWxsIGl0IHdoZW4gcnVu bmluZyB0aGUgZnV6enktdGVzdGluZyBDSS4gVGhleeKAmXZlIGNyZWF0ZWQNCiBhIEdpdEh1YiBh Y3Rpb24gd29ya2Zsb3cgdGhhdCBpbXBsZW1lbnRzIHRoaXMgYmVoYXZpb3VyLiA8L3A+DQo8cD5O ZXh0LCB0aGUgcGxhbiBpcyB0byBjb21wbGV0ZSB0aGUgd29yayBvbiB0aGUgTWVybGluIENJIGJl Zm9yZSBncmFkdWFsbHkgc2hpZnRpbmcgZm9jdXMgdG8gcGVyZm9ybWFuY2Ugb3B0aW1pc2F0aW9u cy4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+UG9DIGZvciB0aGUgQmVoYXZpb3IgQ0kg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9tZXJsaW4vcHVsbC8xNjU3Ij4NCm9jYW1sL21lcmxpbiMxNjU3PC9hPiA8L2xp PjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5I b3ctVG86IEJ1Y2sgMiBhbmQgT0NhbWwgLSBCdWlsZCBzeXN0ZW08L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy10by1idWNrLTItYW5kLW9jYW1sLWJ1aWxkLXN5c3Rl bS8xMzMzNC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctdG8tYnVjay0yLWFu ZC1vY2FtbC1idWlsZC1zeXN0ZW0vMTMzMzQvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdjMzBhM2E0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnYzMwYTNhNCI+Um9sYW5kIENzYXN6YXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjMzBhM2E0Ij4NCjxwPknigJl2ZSBqdXN0IG1hZGUg YSByZXBvIGNvbnRhaW5pbmcgZXhhbXBsZXMgb24gaG93IHRvIHVzZSA8YSBocmVmPSJodHRwczov L2J1Y2syLmJ1aWxkLyI+DQpCdWNrIDI8L2E+IHdpdGggT0NhbWwgdXNpbmcgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9vY2FtbC1zY3JpcHRzIj4NCm9jYW1sLXNjcmlw dHM8L2E+OiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1DYW5k aWRhdGUvT0NhbWwtQnVjay0yLUV4YW1wbGVzIj5PQ2FtbC1CdWNrLTItRXhhbXBsZXMgLSBHaXRI dWI8L2E+IFRoZSBleGFtcGxlIHByb2plY3RzIGRvIGFsc28gY29udGFpbiBEdW5lIGZpbGVzLCBz byB5b3UgY2FuIGNvbXBhcmUgdGhlbS4NCjwvcD4NCjxwPkFsbCBxdWVzdGlvbnMsIHN1Z2dlc3Rp b25zIGFuZCBjb3JyZWN0aW9ucyBhcmUgd2VsY29tZSwgYWxzbyBmb3IgTWV0YeKAmXMgT0NhbWwg c2NyaXBzLg0KPC9wPg0KPHA+V2h5IEJ1Y2sgMiBhbmQgbm90IEJhemVsPyA8L3A+DQo8cD5GaXJz dDogSSBoYXZlIG5ldmVyIHRyaWVkIEJhemVsIChvciB0aGUgT0NhbWwgc3VwcG9ydCksIHNvIEkg Y2Fubm90IHNheSBhbnl0aGluZyBhYm91dCBpdC4gSeKAmXZlIGNob3NlbiBCdWNrIDIgYmVjYXVz ZSBPQ2FtbCBzdXBwb3J0IGlzIGluY2x1ZGVkIGJ5IEZhY2Vib29rIGl0c2VsZiwgdGhlDQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vZmFjZWJvb2svYnVjazIvdHJlZS9tYWluL3ByZWx1ZGUi PlByZWx1ZGU8L2E+IGNvbnRhaW5zIGFsbCBsYW5ndWFnZSBydWxlcyBvZiBCdWNrIDIsIHRoZXJl IGFyZSBubyDigJxidWlsZCBpbuKAnSBhbmQg4oCcZXh0ZXJuYWzigJ0gbGFuZ3VhZ2VzIGFzIHdp dGggQmF6ZWwuIEJ1Y2sgMiBpcyB3cml0dGVuIGluIFJ1c3QgKHdoaWNoIEkgdXNlLCBzbyBubyBl eHRyYSB0b29saW5nIG5lZWRlZCB0byBidWlsZCBpdCksDQogQmF6ZWwgaW4gSmF2YS4gQW5kIEJh emVsIGlzIGJ5IEdvb2dsZS4gPC9wPg0KPHA+QnV0IEkgd291bGQganVzdCBsb29rIGF0IHRoZSBz dXBwb3J0IG9mIGVhY2ggZm9yIHRoZSBsYW5ndWFnZXMgeW91IHdhbnQgdG8vbmVlZCB0by9tdXN0 IHVzZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmdlNzNlMzU2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZTczZTM1NiI+SGVucnkg VGlsbCBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdl NzNlMzU2Ij4NCjxwPlZlcnkgY29vbC4gPC9wPg0KPHA+RXZpZGVudGx5LCBhIGNvdXBsZSBvZiB0 aGUgY3JlYXRvcnMgb2YgQnVjazIgZ2F2ZSBhIHRhbGsgYWJvdXQgdGhpcyBzdWJqZWN0IGF0IElD RlAgdGhpcyB5ZWFyLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9pY2ZwMjMuc2lncGxhbi5v cmcvZGV0YWlscy9vY2FtbC0yMDIzLXBhcGVycy8xL0J1Y2syLWZvci1PQ2FtbC1Vc2Vycy1EZXZl bG9wZXJzIj5odHRwczovL2ljZnAyMy5zaWdwbGFuLm9yZy9kZXRhaWxzL29jYW1sLTIwMjMtcGFw ZXJzLzEvQnVjazItZm9yLU9DYW1sLVVzZXJzLURldmVsb3BlcnM8L2E+DQo8L3A+DQo8cD5UaGUg c2xpZGUgZGVjayBmb3IgdGhlIHRhbGsgaXMgYXZhaWxhYmxlIDxjb2RlPn50aGVyZX48L2NvZGU+ IDxhIGhyZWY9Imh0dHBzOi8vbmRtaXRjaGVsbC5jb20vZG93bmxvYWRzL3NsaWRlcy1idWNrMl9m b3Jfb2NhbWxfdXNlcnNfYW5kX2RldmVsb3BlcnMtMDlfc2VwXzIwMjMucGRmIj4NCmhlcmU8L2E+ LiA8L3A+DQo8cD5Ib3BlZnVsbHkgd2XigJlsbCBzZWUgYSB2aWRlbyBvZiB0aGUgcHJlc2VudGF0 aW9uIG9uIFlvdVR1YmUgc29vbiBhcyB3ZWxsLiA6Y3Jvc3NlZF9maW5nZXJzOg0KPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzI4YTMxZGYiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyOGEzMWRmIj5Sb2xhbmQgQ3Nhc3phciBzYWlkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyOGEzMWRmIj4NCjxw PlllcywgdGhpcyBpcyBhIGdvb2QgaWRlYS4gVGhlIG9mZmljaWFsIE9DYW1sIGV4YW1wbGVzICh3 aGljaCBkbyBub3QgdXNlIE9wYW0gcGFja2FnZXMvdGhlIG9jYW1sLXNjcmlwdHMpIHdoaWNoIHRo aXMgdGFsayBpcyBhYm91dCBhcmUgbG9jYXRlZCBpbiB0aGUgQnVjayAyIHJlcG9zaXRvcnksIGlu IHRoZSBleGFtcGxlcyBzdWJkaXJlY3RvcnkNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9m YWNlYm9vay9idWNrMi90cmVlL21haW4vZXhhbXBsZXMvd2l0aF9wcmVsdWRlL29jYW1sIj4NCk9D YW1sIGV4YW1wbGVzPC9hPi4gPC9wPg0KPHA+QnR3LiBOZWlsIE1pdGNoZWxsIGlzIHRoZSBwZXJz b24gYmVoaW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9uZG1pdGNoZWxsL3NoYWtlIj4N ClNoYWtlPC9hPiBhbmQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm1pY3Jvc29mdC5jb20vZW4t dXMvcmVzZWFyY2gvdXBsb2Fkcy9wcm9kLzIwMTgvMDMvYnVpbGQtc3lzdGVtcy5wZGYiPg0KQnVp bGQgU3lzdGVtcyBhIGxhIENhcnRlPC9hPiBwYXBlci4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjciPkZpcnN0IHJlbGVhc2Ugb2Ygb3J0YWMtY29yZSwgb3J0YWMtcnVudGltZSBhbmQg b3J0YWMtcWNoZWNrLXN0bTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWZpcnN0LXJlbGVhc2Utb2Ytb3J0YWMtY29yZS1vcnRhYy1ydW50aW1lLWFuZC1vcnRhYy1x Y2hlY2stc3RtLzEzMzM1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJz dC1yZWxlYXNlLW9mLW9ydGFjLWNvcmUtb3J0YWMtcnVudGltZS1hbmQtb3J0YWMtcWNoZWNrLXN0 bS8xMzMzNS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc3YjEwNmE0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2IxMDZhNCI+Tmljb2xh cyBPc2Jvcm5lIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnN2IxMDZhNCI+DQo8cD5XZSBhcmUgdmVyeSBoYXBweSB0byBhbm5vdW5jZSB0aGUg aW5pdGlhbCByZWxlYXNlIG9mIDxjb2RlPm9ydGFjLWNvcmU8L2NvZGU+LCBvcnRhYy1ydW50aW1l fiBhbmQNCjxjb2RlPm9ydGFjLXFjaGVjay1zdG08L2NvZGU+LiA8L3A+DQo8cD5PcnRhYyBpcyBh IHJ1bnRpbWUgYXNzZXJ0aW9uIGNoZWNraW5nIHRvb2wgZm9yIE9DYW1sIGJhc2VkIG9uIEdvc3Bl bCBzcGVjaWZpY2F0aW9uIGxhbmd1YWdlLg0KPC9wPg0KPHA+PGNvZGU+b3J0YWMtY29yZTwvY29k ZT4gcGFja2FnZSBleHBvc2VzIGEgbGlicmFyeSB0byB0cmFuc2xhdGUgYSBzdWJzZXQgb2YgR29z cGVsIHNwZWNpZmljYXRpb24gbGFuZ3VhZ2UgaW50byBPQ2FtbCB0ZXJtcy4gSXQgYWxzbyBwcm92 aWRlcyB0aGUNCjxjb2RlPm9ydGFjPC9jb2RlPiBjb21tYW5kLWxpbmUgdG9vbC4gWW91IHdpbGwg bmVlZCB0byBoYXZlIG9uZSBvZiBPcnRhYyBwbHVnaW5zIGluc3RhbGxlZCB0byB1c2UgdGhlDQo8 Y29kZT5vcnRhYzwvY29kZT4gY29tbWFuZC1saW5lIHRvb2wuIDwvcD4NCjxwPjxjb2RlPm9ydGFj LXJ1bnRpbWU8L2NvZGU+IHByb3ZpZGVzIHJ1bnRpbWUgZW52aXJvbm1lbnQgdGhhdCB0aGUgdHJh bnNsYXRlZCB0ZXJtcyBkZXBlbmQgb24uIEluIHBhcnRpY3VsYXIsIGl0IHByb3ZpZGVzIGFuIGlt cGxlbWVudGF0aW9uIG9mIHRoZSBleGVjdXRhYmxlIHN1YnNldCBvZiB0aGUgR29zcGVsIHN0YW5k YXJkIGxpYnJhcnkuDQo8L3A+DQo8cD48Y29kZT5vcnRhYy1xY2hlY2stc3RtPC9jb2RlPiBwcm92 aWRlcyBhIHBsdWdpbiBmb3IgT3J0YWMuIEl0IGdlbmVyYXRlcyBRQ2hlY2stU1RNIHRlc3RzIGZv ciBhIG1vZHVsZSBzcGVjaWZpZWQgd2l0aCBHb3NwZWwuIFFDaGVjay1TVE0gaXMgYSBtb2RlbC1i YXNlZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgT3J0YWMvUUNoZWNrLVNUTSByZWxpZXMgb24gdGhl IEdvc3BlbCBtb2RlbHMgeW91IGdhdmUgaW4gdGhlIHNwZWNpZmljYXRpb25zIHRvDQogYnVpbGQg dGhlIFFDaGVjay1TVE0gdGVzdHMuIFNlZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1nb3Nw ZWwuZ2l0aHViLmlvL29ydGFjL29ydGFjLXFjaGVjay1zdG0vaW5kZXguaHRtbCI+DQpkb2N1bWVu dGF0aW9uPC9hPiBmb3IgbW9yZSBkZXRhaWxzIG9uIGhvdyB0byB3cml0ZSB0aGUgc3BlY2lmaWNh dGlvbnMgYW5kIGhvdyB0byB1c2VzIHRoZSB0b29sIHRvIHRlc3QgeW91ciBsaWJyYXJpZXMuDQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+b3BhbS1wdWJsaXNoIDIuMy4wPC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS1wdWJsaXNoLTItMy0w LzEzMzM3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLXB1Ymxpc2gt Mi0zLTAvMTMzMzcvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdiYzlhNmRmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmM5YTZkZiI+S2F0 ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2JjOWE2ZGYiPg0KPHA+SGkgZXZlcnlvbmUsIDwvcD4NCjxwPldl4oCZcmUgcGxlYXNlZCB0byBh bm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBvcGFtLXB1Ymxpc2ggMi4zLjAuIDwvcD4NCjxwPlRoaXMg cmVsZWFzZSwgYXBhcnQgZnJvbSBhIGNvdXBsZSBvZiBsaWdodCBpbXByb3ZlbWVudHMsIG1haW5s eSBjb25zaXN0cyBvZiB0aGUgZm9sbG93aW5nIG5ldyBvcHRpb246DQo8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+WW91IGNhbiBub3cgdXNlIG9wYW0tcHVibGlzaCB3aXRoIHRoZSA8Y29k ZT4tLW5vLWNvbmZpcm1hdGlvbjwvY29kZT4gYXJndW1lbnQgZm9yIHVzZSBpbiBhdXRvbWF0ZWQg cGlwZWxpbmUuIFVzZSB0aGlzIG9wdGlvbiB3aXRoIGV4dHJlbWUgY2F1dGlvbiBpZiB5b3UgZG8g dXNlIGl0Lg0KPC9saT48L3VsPg0KPHA+VGhlIGZ1bGwgY2hhbmdlbG9nIGlzIGF2YWlsYWJsZSA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtb3BhbS9vcGFtLXB1Ymxpc2gvcmVsZWFz ZXMvdGFnLzIuMy4wIj4NCmhlcmU8L2E+LiA8L3A+DQo8cD5FbmpveSwgVGhlIG9wYW0gdGVhbS4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnMjE3ZTk4NCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzIxN2U5ODQiPk9sZCBD V048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzIxN2U5ODQi Pg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+ IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3Ig dGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJT UyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRv IHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSB0byB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdCI+DQpj YW1sLWxpc3Q8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnNjc2YTYy NSI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2ht aXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwv aHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 24 Oct 2023 10:18:37 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 24 Oct 2023 10:18:37 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 24 Oct 2023 10:18:37 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39O9ISEd002524 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 24 Oct 2023 10:18:29 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39O9ID0q002503 for ; Tue, 24 Oct 2023 10:18:14 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Oct 2023 11:18:11 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 113F9E0CD8; Tue, 24 Oct 2023 11:18:11 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D873BE00BA for ; Tue, 24 Oct 2023 11:18:02 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Oct 2023 11:17:45 +0200 Received: from TM (87-88-183-11.abo.bbox.fr [87.88.183.11]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 361CF5612D2; Tue, 24 Oct 2023 11:17:42 +0200 (CEST) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaBlsS4NvLBCcIoUyrJyi+8hSbuA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 24 Oct 2023 10:17:41 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 2bda73c3-55ea-4330-ed97-08dbd472347f X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,247,1694728800"; d="scan'208,217";a="69589506" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499999, queueID=90FB35612D4 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <9E91317717F7CD4E9A21B6900CF7167D@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMC0yNCBUdWUgMTE6MTUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTAuMTcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMC4zMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE9jdG9iZXIgMTcgdG8gMjQsIDIwMjMuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+VXNpbmcgUmVhc29uIGFuZCBSZWFj dCBtZXRhLWZyYW1ld29ya3MuIEFsc28gc29tZSBNZWxhbmdlIDI8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiMyIj5QcHhsaWIgZGV2IG1lZXRpbmdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+QSBo YWNrIHRvIGltcGxlbWVudCBlZmZpY2llbnQgVExTICh0aHJlYWQtbG9jYWwtc3RvcmFnZSk8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5OZXcgR2V0IFN0YXJ0ZWQgRG9jdW1lbnRhdGlvbiBvbiBP Q2FtbC5vcmc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5XZWIgQW5hbHl0aWNzIG9uIE9DYW1s Lm9yZzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzYiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBBdWd1 c3QgYW5kIFNlcHRlbWJlciAyMDIzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+UmVsZWFzZSBv ZiBvZG9jIDIuMy4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+QW5ub3VuY2UgU2VwcG8uU29j aWFsIHYwLjMgYW5kIGludml0ZSB0aG91Z2h0czwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPmJ3 ZCAyLjMuMCBmb3IgYmFja3dhcmQgbGlzdHM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+U3Rv cmluZyBjcmVkZW50aWFscyB0byBhIHByaXZhdGUgT1BBTSByZXBvc2l0b3J5PC9hPiA8L2xpPjxs aT48YSBocmVmPSIjMTEiPk9DYW1sIG9uIFdpbmRvd3M6IHRoZSBsb25nIHBhdGhzIGlzc3VlPC9h PiA8L2xpPjxsaT48YSBocmVmPSIjMTIiPkEgUm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBsYXRmb3Jt IC0gU2Vla2luZyBZb3VyIEZlZWRiYWNrPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTMiPkFkZGlu ZyBEeW5hbWljIEFycmF5cyAvIFZlY3RvcnMgdG8gU3RkTGliPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMTQiPnZkb20gMC4zOiBmdW5jdGlvbmFsIFVJIGFwcGxpY2F0aW9ucyBub3cgd2l0aCBjdXN0 b20gZXZlbnQgaGFuZGxlcnM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjb3JnZTE1YmE0NiI+T2xk IENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5Vc2luZyBSZWFzb24gYW5k IFJlYWN0IG1ldGEtZnJhbWV3b3Jrcy4gQWxzbyBzb21lIE1lbGFuZ2UgMjwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXNpbmctcmVhc29uLWFuZC1yZWFjdC1tZXRhLWZy YW1ld29ya3MtYWxzby1zb21lLW1lbGFuZ2UtMi8xMzI2MC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC91c2luZy1yZWFzb24tYW5kLXJlYWN0LW1ldGEtZnJhbWV3b3Jrcy1hbHNvLXNv bWUtbWVsYW5nZS0yLzEzMjYwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzQzZGM4ZTYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0M2Rj OGU2Ij5wc2IgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmc0M2RjOGU2Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZGV2LnRvL3BzYi9yZWFzb24t YW5kLXJlYWN0LW1ldGEtZnJhbWV3b3Jrcy1kN24iPmh0dHBzOi8vZGV2LnRvL3BzYi9yZWFzb24t YW5kLXJlYWN0LW1ldGEtZnJhbWV3b3Jrcy1kN248L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMiI+UHB4bGliIGRldiBtZWV0aW5nczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5ncy8xMjQ0MS85Ij5odHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5ncy8xMjQ0MS85PC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0YTViNzY3IiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnNGE1Yjc2NyI+U29uamEgSGVpbnplIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNGE1Yjc2NyI+DQo8cD5Ab2N0 YWNocm9uIGhhcyBjb21lIHRvIHRoZSBwcHhsaWIgZGV2IG1lZXRpbmcgdG9kYXksIHdoaWNoIGhh cyBiZWVuIGEgdmVyeSBuaWNlIHN1cnByaXNlLiBJdOKAmXMgbmljZSB0byBkaXNjdXNzIGludGVy c2VjdGlvbnMgYmV0d2VlbiBwcHhsaWIgYW5kIHRoZSBjb21waWxlciB0b2dldGhlciB3aXRoIGNv bXBpbGVyIG1haW50YWluZXJzLiBUaGFua3MsIEBvY3RhY2hyb24hDQo8L3A+DQo8cD5TbyBpdCBo YXMgYmVlbiBAcGFuZ2xlc2QsIEBvY3RhY2hyb24gYW5kIG1lIGluIHRoZSBtZWV0aW5nLiBIZXJl IGFyZSB0aGUgbWVldGluZyBub3RlczoNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC1wcHgvcHB4bGliL3dpa2kvRGV2LW1lZXRpbmctMTktMDktMjAyMyI+aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXBweC9wcHhsaWIvd2lraS9EZXYtbWVldGluZy0xOS0wOS0yMDIzPC9hPi4NCjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMi IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5BIGhhY2sgdG8gaW1wbGVtZW50IGVmZmlj aWVudCBUTFMgKHRocmVhZC1sb2NhbC1zdG9yYWdlKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYS1oYWNrLXRvLWltcGxlbWVudC1lZmZpY2llbnQtdGxzLXRocmVhZC1s b2NhbC1zdG9yYWdlLzEzMjY0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2EtaGFj ay10by1pbXBsZW1lbnQtZWZmaWNpZW50LXRscy10aHJlYWQtbG9jYWwtc3RvcmFnZS8xMzI2NC8x PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmYzUzNGYx IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZmM1MzRmMSI+VmVzYSBLYXJ2b25lbiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Zj NTM0ZjEiPg0KPHA+Q3VycmVudGx5IE9DYW1sIDUgcHJvdmlkZXMgYSA8YSBocmVmPSJodHRwczov L3YyLm9jYW1sLm9yZy9hcGkvRG9tYWluLkRMUy5odG1sIj4NCjxjb2RlPkRvbWFpbi5ETFM8L2Nv ZGU+PC9hPiBtb2R1bGUgZm9yIGRvbWFpbi1sb2NhbC1zdGF0ZS4gPC9wPg0KPHA+VW5mb3J0dW5h dGVseSwgPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE3NzAiPnRoZXJlIGlzIG5vIGNvcnJlc3BvbmRp bmcNCjxjb2RlPlRocmVhZC5UTFM8L2NvZGU+PC9hPiBmb3IgKHN5cyl0aHJlYWQtbG9jYWwtc3Rh dGUsIGFuZCA8L2xpPjxsaT50aGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5Eb21h aW4uRExTPC9jb2RlPiBpcyBub3QgdGhyZWFkLXNhZmUuIDwvbGk+PC9vbD4NCjxwPkkgZG9u4oCZ dCB3YW50IHRvIHNwZW5kIHRpbWUgdG8gbW90aXZhdGUgdGhpcyB0b3BpYywgYnV0IGZvciBtYW55 IG9mIHRoZSB1c2UgY2FzZXMgb2YNCjxjb2RlPkRvbWFpbi5ETFM8L2NvZGU+LCB3aGF0IHlvdSBh Y3R1YWxseSB3YW50LCBpcyB0byB1c2UgYSA8Y29kZT5UaHJlYWQuVExTPC9jb2RlPi4gSU9XLCBt YW55IG9mIHRoZSB1c2VzIG9mDQo8Y29kZT5Eb21haW4uRExTPC9jb2RlPiBhcmUgcHJvYmFibHkg 4oCcd3JvbmfigJ0gYW5kIHNob3VsZCBhY3R1YWxseSB1c2UgYSA8Y29kZT5UaHJlYWQuVExTPC9j b2RlPiwgYmVjYXVzZSwgd2hlbiB1c2luZw0KPGNvZGU+RG9tYWluLkRMUzwvY29kZT4sIHRoZSBh c3N1bXB0aW9uIG11c3QgYmUgdGhhdCB5b3UgZG9u4oCZdCBoYXZlIG11bHRpcGxlIHRocmVhZHMg b24gdGhlIGRvbWFpbiwgYnV0IHRoYXQgaXMgdHlwaWNhbGx5IGRlY2lkZWQgYXQgYSBoaWdoZXIg bGV2ZWwgaW4gdGhlIGFwcGxpY2F0aW9uIGFuZCBzbyBtYWtpbmcgc3VjaCBhbiBhc3N1bXB0aW9u IGlzIHR5cGljYWxseSBub3Qgc2FmZS4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNGQ2MWRjNCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzRkNjFk YzQiPjxjb2RlPkRvbWFpbi5ETFM8L2NvZGU+IGlzIG5vdCB0aHJlYWQtc2FmZTwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNGQ2MWRjNCI+DQo8cD5JIG1lbnRp b25lZCB0aGF0IHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9uIDxjb2RlPkRvbWFpbi5ETFM8L2Nv ZGU+IGlzIG5vdCB0aHJlYWQtc2FmZS4gV2hhdCBJIG1lYW4gYnkgdGhhdCBpcyB0aGF0IHRoZSBj dXJyZW50IGltcGxlbWVudGF0aW9uIGlzIGxpdGVyYWxseSBub3QgdGhyZWFkLXNhZmUgYXQgYWxs IGluIHRoZSBzZW5zZSB0aGF0IHVucmVsYXRlZCBjb25jdXJyZW50DQo8Y29kZT5Eb21haW4uRExT PC9jb2RlPiBhY2Nlc3NlcyBjYW4gYWN0dWFsbHkgYnJlYWsgdGhlIERMUy4gPC9wPg0KPHA+Q29u c2lkZXIgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvZTM5N2Vk MjhiY2VmODVmZGMxZjBmMDA3YWY0ODFlZjIwMWZiMWZkNy9zdGRsaWIvZG9tYWluLm1sI0wxMjAt TDEyNyI+DQp0aGUgaW1wbGVtZW50YXRpb24gb2YgPGNvZGU+RG9tYWluLkRMUy5nZXQ8L2NvZGU+ PC9hPjogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0i c3JjIHNyYy1vY2FtbCI+ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5nZXQ8L3Nw YW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5pZHg8L3NwYW4+LCA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij5pbml0PC9zcGFuPikgPQ0KICAgIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnN0PC9zcGFuPiA9IG1heWJlX2dyb3cgaWR4IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52PC9zcGFuPiA9IHN0LihpZHgpIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8L3NwYW4+IHYg PT0gdW5pcXVlX3ZhbHVlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij50aGVuPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlm OyI+dic8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+T2JqLjwvc3Bhbj5y ZXByIChpbml0ICgpKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+aW48L3NwYW4+DQogICAgICBzdC4oaWR4KSAmbHQ7LSAoPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+U3lzLjwvc3Bhbj5vcGFxdWVfaWRlbnRpdHkgdicpOw0KICAgICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+T2JqLjwvc3Bhbj5tYWdpYyB2Jw0KICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbHNlPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5PYmouPC9zcGFuPm1hZ2ljIHYNCjwvcHJlPg0KPC9k aXY+DQo8cD5JZiB0aGVyZSBhcmUgdHdvIChvciBtb3JlKSB0aHJlYWRzIG9uIGEgc2luZ2xlIGRv bWFpbiB0aGF0IGNvbmN1cnJlbnRseSBjYWxsIDxjb2RlPg0KZ2V0PC9jb2RlPiBiZWZvcmUgPGNv ZGU+aW5pdDwvY29kZT4gaGFzIGJlZW4gY2FsbGVkIGluaXRpYWxseSwgdGhlbiB3aGF0IG1pZ2h0 IGhhcHBlbiBpcyB0aGF0DQo8Y29kZT5pbml0PC9jb2RlPiBnZXRzIGNhbGxlZCB0d2ljZSAob3Ig bW9yZSkgYW5kIHRoZSB0aHJlYWRzIGdldCBkaWZmZXJlbnQgdmFsdWVzIHdoaWNoIGNvdWxkIGUu Zy4gYmUgcG9pbnRlcnMgdG8gdHdvIGRpZmZlcmVudCBtdXRhYmxlIG9iamVjdHMuDQo8L3A+DQo8 cD5Db25zaWRlciA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi9l Mzk3ZWQyOGJjZWY4NWZkYzFmMGYwMDdhZjQ4MWVmMjAxZmIxZmQ3L3N0ZGxpYi9kb21haW4ubWwj TDk4LUwxMTEiPg0KdGhlIGltcGxlbWVudGF0aW9uIG9mIDxjb2RlPm1heWJlX2dyb3c8L2NvZGU+ PC9hPjogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0i c3JjIHNyYy1vY2FtbCI+ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5tYXliZV9n cm93PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5pZHg8L3NwYW4+ID0NCiAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zdDwvc3Bhbj4gPSBnZXRfZGxzX3N0 YXRlICgpIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5p bjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zejwvc3Bhbj4g PSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48L3NwYW4+bGVuZ3RoIHN0IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4N CiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8 L3NwYW4+IGlkeCAmbHQ7IHN6IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij50aGVuPC9zcGFuPiBzdA0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbHNlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+YmVnaW48L3NwYW4+DQogICAgICA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+cmVjPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5jb21wdXRlX25ld19zaXplPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zPC9zcGFuPiA9DQogICAgICAgIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pZjwvc3Bhbj4gaWR4ICZsdDsgcyA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bh bj4gcyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZWxz ZTwvc3Bhbj4gY29tcHV0ZV9uZXdfc2l6ZSAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+ Mjwvc3Bhbj4gKiBzKQ0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+bmV3X3N6PC9zcGFuPiA9IGNvbXB1dGVfbmV3X3NpemUgc3ogPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bmV3X3N0PC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwvc3Bhbj5tYWtlIG5ld19zeiB1bmlxdWVfdmFsdWUgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0K ICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+QXJyYXkuPC9zcGFuPmJsaXQgc3Qg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4gbmV3X3N0IDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPjA8L3NwYW4+IHN6Ow0KICAgICAgc2V0X2Rsc19zdGF0ZSBuZXdf c3Q7DQogICAgICBuZXdfc3QNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+ZW5kPC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxwPkltYWdpbmUgY2Fs bGluZyA8Y29kZT5nZXQ8L2NvZGU+ICh3aGljaCBjYWxscyA8Y29kZT5tYXliZV9ncm93PC9jb2Rl Pikgd2l0aCB0d28gZGlmZmVyZW50IGtleXMgZnJvbSB0d28gZGlmZmVyZW50IHRocmVhZHMgY29u Y3VycmVudGx5LiBUaGUgZW5kIHJlc3VsdCBtaWdodCBiZSB0aGF0IHR3byBkaWZmZXJlbnQgYXJy YXlzIGFyZSBhbGxvY2F0ZWQgYW5kIG9ubHkgb25lIG9mIHRoZW0g4oCcd2luc+KAnS4gV2hhdCB0 aGlzIG1lYW5zLCBmb3IgZXhhbXBsZSwNCiBpcyB0aGF0IGVmZmVjdHMgb2YgPGNvZGU+c2V0PC9j b2RlPiBjYWxscyBtYXkgZWZmZWN0aXZlbHkgYmUgdW5kb25lIGJ5IGNvbmN1cnJlbnQgY2FsbHMg b2YNCjxjb2RlPmdldDwvY29kZT4uIDwvcD4NCjxwPkluIG90aGVyIHdvcmRzLCB0aGUgPGNvZGU+ RG9tYWluLkRMUzwvY29kZT4sIGFzIGl0IGlzIGN1cnJlbnRseSBpbXBsZW1lbnRlZCwgaXMgbm90 IHRocmVhZC1zYWZlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzg3OTU1M2YiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4Nzk1NTNm Ij5Ib3cgdG8gaW1wbGVtZW50IGFuIGVmZmljaWVudCA8Y29kZT5UaHJlYWQuVExTPC9jb2RlPj88 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzg3OTU1M2YiPg0K PHA+SWYgeW91IGRpZyBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aHJlYWRzLCB5b3Ugd2ls bCBub3RpY2UgdGhhdCB0aGUgb3BhcXVlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvYmxvYi9lMzk3ZWQyOGJjZWY4NWZkYzFmMGYwMDdhZjQ4MWVmMjAxZmIxZmQ3L290 aGVybGlicy9zeXN0aHJlYWRzL3RocmVhZC5tbGkjTDE4Ij4NCjxjb2RlPlRocmVhZC50PC9jb2Rl PiB0eXBlPC9hPiBpcyBhY3R1YWxseSBhIGhlYXAgYmxvY2sgKHJlY29yZCkgb2YgdGhyZWUgZmll bGRzLiBZb3UgY2FuIHNlZSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9ibG9iL2UzOTdlZDI4YmNlZjg1ZmRjMWYwZjAwN2FmNDgxZWYyMDFmYjFmZDcvb3RoZXJs aWJzL3N5c3RocmVhZHMvc3Rfc3R1YnMuYyNMNjYtTDY4Ij4NCjxjb2RlPlRocmVhZC50PC9jb2Rl PiBhY2Nlc3NvcnM8L2E+OiA8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8 cHJlIGNsYXNzPSJzcmMgc3JjLWMiPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPiNkZWZp bmU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPklkZW50PC9zcGFuPig8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52PC9zcGFuPikgRmllbGQodiwgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4pDQo8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7 Ij4jZGVmaW5lPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5TdGFydF9jbG9z dXJlPC9zcGFuPig8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52PC9zcGFuPikgRmllbGQo diwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4pDQo8c3BhbiBzdHlsZT0i Y29sb3I6ICNhMjYwNGY7Ij4jZGVmaW5lPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYw MWY7Ij5UZXJtaW5hdGVkPC9zcGFuPig8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52PC9z cGFuPikgRmllbGQodiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+Mjwvc3Bhbj4pDQo8 L3ByZT4NCjwvZGl2Pg0KPHA+YW5kIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvYmxvYi9lMzk3ZWQyOGJjZWY4NWZkYzFmMGYwMDdhZjQ4MWVmMjAxZmIxZmQ3L290 aGVybGlicy9zeXN0aHJlYWRzL3N0X3N0dWJzLmMjTDMzNS1MMzQ2Ij4NCjxjb2RlPlRocmVhZC50 PC9jb2RlPiBhbGxvY2F0aW9uPC9hPjogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWlu ZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1jIj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+c3RhdGljPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij52YWx1ZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+Y2FtbF90 aHJlYWRfbmV3X2Rlc2NyaXB0b3I8L3NwYW4+KDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PnZhbHVlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jbG9zPC9zcGFuPikN CnsNCiAgQ0FNTHBhcmFtMShjbG9zKTsNCiAgQ0FNTGxvY2FsMShtdSk7DQogIDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPnZhbHVlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5kZXNjcjwvc3Bhbj47DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1z dHlsZTogaXRhbGljOyI+LyogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9u dC1zdHlsZTogaXRhbGljOyI+Q3JlYXRlIGFuZCBpbml0aWFsaXplIHRoZSB0ZXJtaW5hdGlvbiBz ZW1hcGhvcmU8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBp dGFsaWM7Ij4gKi88L3NwYW4+DQogIG11ID0gY2FtbF90aHJlYWRzdGF0dXNfbmV3KCk7DQogIDxz cGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+LyogPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Q3JlYXRl IGEgZGVzY3JpcHRvciBmb3IgdGhlIG5ldyB0aHJlYWQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKi88L3NwYW4+DQogIGRlc2NyID0gY2Ft bF9hbGxvY18zKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjA8L3NwYW4+LCBWYWxfbG9u ZyhhdG9taWNfZmV0Y2hfYWRkKCZhbXA7dGhyZWFkX25leHRfaWQsICYjNDM7PHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4pKSwNCiAgICAgICAgICAgICAgICAgICAgICAgY2xv cywgbXUpOw0KICBDQU1McmV0dXJuKGRlc2NyKTsNCn0NCjwvcHJlPg0KPC9kaXY+DQo8cD5UaGUg c2Vjb25kIGZpZWxkLCA8Y29kZT5TdGFydF9jbG9zdXJlPC9jb2RlPiwgaXMgdXNlZCB0byBwYXNz IHRoZSBjbG9zdXJlIHRvIHRoZSB0aHJlYWQgc3RhcnQ6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmct c3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLWMiPjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zdGF0aWM8L3NwYW4+IDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPnZvaWQ8L3NwYW4+ICogPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2 MDFmOyI+Y2FtbF90aHJlYWRfc3RhcnQ8L3NwYW4+KDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPnZvaWQ8L3NwYW4+ICogPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+djwvc3Bhbj4p DQp7DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPmNhbWxfdGhyZWFkX3Q8L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnRoPC9zcGFuPiA9ICg8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5jYW1sX3RocmVhZF90PC9zcGFuPikgdjsNCiAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+aW50PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5kb21faWQ8L3NwYW4+ID0gdGgtJmd0O2RvbWFpbl9pZDsNCiAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+dmFsdWU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmNs b3M8L3NwYW4+Ow0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij52b2lkPC9zcGFuPiAq IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnNpZ25hbF9zdGFjazwvc3Bhbj47DQoNCiAg Y2FtbF9pbml0X2RvbWFpbl9zZWxmKGRvbV9pZCk7DQoNCiAgc3RfdGxzX3NldChjYW1sX3RocmVh ZF9rZXksIHRoKTsNCg0KICB0aHJlYWRfbG9ja19hY3F1aXJlKGRvbV9pZCk7DQogIHJlc3RvcmVf cnVudGltZV9zdGF0ZSh0aCk7DQogIHNpZ25hbF9zdGFjayA9IGNhbWxfaW5pdF9zaWduYWxfc3Rh Y2soKTsNCg0KICBjbG9zID0gU3RhcnRfY2xvc3VyZShBY3RpdmVfdGhyZWFkLSZndDtkZXNjcik7 DQogIGNhbWxfbW9kaWZ5KCZhbXA7KFN0YXJ0X2Nsb3N1cmUoQWN0aXZlX3RocmVhZC0mZ3Q7ZGVz Y3IpKSwgVmFsX3VuaXQpOw0KICBjYW1sX2NhbGxiYWNrX2V4bihjbG9zLCBWYWxfdW5pdCk7DQog IGNhbWxfdGhyZWFkX3N0b3AoKTsNCiAgY2FtbF9mcmVlX3NpZ25hbF9zdGFjayhzaWduYWxfc3Rh Y2spOw0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ cmV0dXJuPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9zcGFuPjsNCn0N CjwvcHJlPg0KPC9kaXY+DQo8cD5hbmQsIGFzIHNlZW4gYWJvdmUsIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL2UzOTdlZDI4YmNlZjg1ZmRjMWYwZjAwN2FmNDgx ZWYyMDFmYjFmZDcvb3RoZXJsaWJzL3N5c3RocmVhZHMvc3Rfc3R1YnMuYyNMNTc1Ij4NCml0IGlz IG92ZXJ3cml0dGVuIHdpdGggdGhlIHVuaXQgdmFsdWU8L2E+IGJlZm9yZSB0aGUgY2xvc3VyZSBp cyBjYWxsZWQuIDwvcD4NCjxwPldoYXQgdGhpcyBtZWFucyBpcyB0aGF0IHdoZW4geW91IGNhbGwg PGNvZGU+VGhyZWFkLnNlbGYgKCk8L2NvZGU+IGFuZCBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGN1 cnJlbnQNCjxjb2RlPlRocmVhZC50PC9jb2RlPiwgdGhlIDxjb2RlPlN0YXJ0X2Nsb3N1cmU8L2Nv ZGU+IGZpZWxkIG9mIHRoYXQgaGVhcCBibG9jayB3aWxsIGJlIHRoZSB1bml0IHZhbHVlOg0KPC9w Pg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1v Y2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmFz c2VydDwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk9iai48L3NwYW4+Zmll bGQgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk9iai48L3NwYW4+cmVwciAoPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VGhyZWFkLjwvc3Bhbj5zZWxmICgpKSkgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5PYmouPC9zcGFuPnJlcHIgKCkpDQo8L3ByZT4NCjwvZGl2Pg0KPHA+TGV04oCZcyBoaWph Y2sgdGhhdCBmaWVsZCBmb3IgdGhlIHB1cnBvc2Ugb2YgaW1wbGVtZW50aW5nIGFuIGVmZmljaWVu dCBUTFMhIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGZ1bGwgaGFjazogPC9wPg0KPGRpdiBjbGFzcz0i b3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm1vZHVsZTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VExTPC9zcGFuPiA6IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zaWc8L3NwYW4+DQogIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij4nYSBrZXk8L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij52YWw8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogI2E3NjAxZjsiPm5ld19rZXk8L3NwYW4+IDogKHVuaXQgLSZndDsgJ2EpIC0mZ3Q7ICdh IGtleQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ dmFsPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5nZXQ8L3NwYW4+IDogJ2Eg a2V5IC0mZ3Q7ICdhDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij52YWw8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnNldDwvc3Bh bj4gOiAnYSBrZXkgLSZndDsgJ2EgLSZndDsgdW5pdA0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPmVuZDwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+c3RydWN0PC9zcGFuPg0KICA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlwZTwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+J2Ega2V5PC9zcGFuPiA9IHsgaW5kZXggOiBpbnQ7IGNv bXB1dGUgOiB1bml0IC0mZ3Q7ICdhIH0NCg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5jb3VudGVyPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkF0b21p Yy48L3NwYW4+bWFrZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9zcGFuPg0KICA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij51bmlxdWU8L3NwYW4+ICgpID0gPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+T2JqLjwvc3Bhbj5yZXByIGNvdW50ZXINCg0KICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5uZXdfa2V5PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5jb21wdXRlPC9zcGFuPiA9DQogICAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA3YTlmOyI+aW5kZXg8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+QXRvbWljLjwvc3Bhbj5mZXRjaF9hbmRfYWRkIGNvdW50ZXIgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA4MjRmOyI+MTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgIHsgaW5kZXg7IGNvbXB1dGUgfQ0KDQogIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij50PC9zcGFuPiA9IHsgX2lkIDogaW50OyA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bXV0YWJsZTwvc3Bh bj4gdGxzIDogPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+T2JqLjwvc3Bhbj50IH0NCg0K ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5jZWlsX3Bvd18yX21pbnVzXzE8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+ID0NCiAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5uPC9zcGFuPiA9IG4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjYTUyYTJhOyI+bG9yPC9zcGFuPiAobiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5s c3I8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8L3NwYW4+KSA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bjwvc3Bhbj4gPSBuIDxzcGFuIHN0eWxl PSJjb2xvcjogI2E1MmEyYTsiPmxvcjwvc3Bhbj4gKG4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUy YTJhOyI+bHNyPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4yPC9zcGFuPikg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFu Pg0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5s ZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+ID0gbiA8c3Bh biBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5sb3I8L3NwYW4+IChuIDxzcGFuIHN0eWxlPSJjb2xv cjogI2E1MmEyYTsiPmxzcjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDwv c3Bhbj4pIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5p bjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5uPC9zcGFuPiA9 IG4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+bG9yPC9zcGFuPiAobiA8c3BhbiBzdHls ZT0iY29sb3I6ICNhNTJhMmE7Ij5sc3I8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0 ZjsiPjg8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+aW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bjwv c3Bhbj4gPSBuIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPmxvcjwvc3Bhbj4gKG4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+bHNyPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij4xNjwvc3Bhbj4pIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPlN5cy48L3NwYW4+aW50X3NpemUgJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7 Ij4zMjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9s ZDsiPnRoZW48L3NwYW4+IG4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+bG9yPC9zcGFu PiAobiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5sc3I8L3NwYW4+IDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPjMyPC9zcGFuPikgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAw OyBmb250LXdlaWdodDogYm9sZDsiPmVsc2U8L3NwYW4+IG4NCg0KICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjogI2EyNjA0ZjsiPltAaW5saW5lIG5ldmVyXTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjYTc2MDFmOyI+Z3Jvd190bHM8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5Zjsi PnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmJlZm9yZTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+aW5kZXg8L3NwYW4+ID0NCiAgICA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5uZXdfbGVuZ3RoPC9zcGFuPiA9IGNlaWxfcG93XzJfbWlu dXNfMSAoaW5kZXggJiM0MzsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4p IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bh bj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hZnRlcjwvc3Bhbj4gPSA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48L3NwYW4+bWFrZSBuZXdfbGVuZ3Ro ICh1bmlxdWUgKCkpIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48 L3NwYW4+YmxpdCBiZWZvcmUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4g YWZ0ZXIgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4gKDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwvc3Bhbj5sZW5ndGggYmVmb3JlKTsNCiAgICB0LnRs cyAmbHQ7LSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5PYmouPC9zcGFuPnJlcHIgYWZ0 ZXI7DQogICAgYWZ0ZXINCg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+bGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAaW5s aW5lXTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+Z2V0X3Rsczwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+aW5kZXg8L3NwYW4+ID0NCiAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij50PC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPk9iai48L3NwYW4+bWFnaWMgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PlRocmVhZC48L3NwYW4+c2VsZiAoKSkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPnRsczwvc3Bhbj4gPSB0LnRscyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2 ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmlmPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5PYmouPC9zcGFuPmlzX2ludCB0bHMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAw OyBmb250LXdlaWdodDogYm9sZDsiPnRoZW48L3NwYW4+IGdyb3dfdGxzIHQgWzxzcGFuIHN0eWxl PSJjb2xvcjogI2E1MmEyYTsiPnx8PC9zcGFuPl0gaW5kZXgNCiAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZWxzZTwvc3Bhbj4NCiAgICAgIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnRsczwvc3Bhbj4gPSAoPHNwYW4gc3R5bGU9ImNv bG9yOiAjNDQ0ZmNmOyI+T2JqLjwvc3Bhbj5tYWdpYyB0bHMgOiA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5PYmoudCBhcnJheTwvc3Bhbj4pIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pZjwvc3Bhbj4gaW5kZXggJmx0OyA8c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48L3NwYW4+bGVuZ3RoIHRscyA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bhbj4gdGxz IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbHNlPC9z cGFuPiBncm93X3RscyB0IHRscyBpbmRleA0KDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3 NjAxZjsiPmdldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+a2V5PC9zcGFu PiA9DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+dGxzPC9zcGFuPiA9IGdl dF90bHMga2V5LmluZGV4IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij52 YWx1ZTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48L3NwYW4+ dW5zYWZlX2dldCB0bHMga2V5LmluZGV4IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZm MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8L3NwYW4+IHZhbHVlIDxzcGFuIHN0eWxlPSJjb2xv cjogI2E1MmEyYTsiPiE9PC9zcGFuPiB1bmlxdWUgKCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2 ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPnRoZW48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPk9iai48L3NwYW4+bWFnaWMgdmFsdWUNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZWxzZTwvc3Bhbj4NCiAgICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnZhbHVlPC9zcGFuPiA9IGtleS5jb21wdXRlICgpIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4N CiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwvc3Bhbj51bnNhZmVf c2V0IHRscyBrZXkuaW5kZXggKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk9iai48L3Nw YW4+cmVwciAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U3lzLjwvc3Bhbj5vcGFxdWVf aWRlbnRpdHkgdmFsdWUpKTsNCiAgICAgIHZhbHVlDQoNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjYTc2MDFmOyI+c2V0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5rZXk8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnZhbHVlPC9zcGFuPiA9DQogICAg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+dGxzPC9zcGFuPiA9IGdldF90bHMga2V5 LmluZGV4IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5p bjwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJheS48L3NwYW4+ dW5zYWZlX3NldCB0bHMga2V5LmluZGV4ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5P YmouPC9zcGFuPnJlcHIgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlN5cy48L3NwYW4+ b3BhcXVlX2lkZW50aXR5IHZhbHVlKSkNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5lbmQ8L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIGFib3Zl IGFjaGlldmVzIGFib3V0IDgwJSBvZiB0aGUgcGVyZm9ybWFuY2Ugb2YgPGNvZGU+RG9tYWluLkRM UzwvY29kZT4gYWxsb3dpbmcgcm91Z2hseSAyNDFNIH5UTFMuZ2V0fu+7v3MvcyAodnMgMjk2TSB+ RG9tYWluLkRMUy5nZXR+77u/cy9zKSBvbiBteSBsYXB0b3AuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5OZXcgR2V0IFN0YXJ0ZWQgRG9jdW1lbnRhdGlvbiBvbiBP Q2FtbC5vcmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXct Z2V0LXN0YXJ0ZWQtZG9jdW1lbnRhdGlvbi1vbi1vY2FtbC1vcmcvMTMyNjkvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1nZXQtc3RhcnRlZC1kb2N1bWVudGF0aW9uLW9u LW9jYW1sLW9yZy8xMzI2OS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc3YjFlMmJiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2IxZTJi YiI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc3YjFlMmJiIj4NCjxwPkRlYXIgT0NhbWwgQ29tbXVuaXR5LCA8L3A+ DQo8cD5PbiBiZWhhbGYgb2YgdGhlIE9DYW1sLm9yZyB0ZWFtLCBJ4oCZbSB0aHJpbGxlZCB0byBh bm5vdW5jZSB0aGUgcHVibGljYXRpb24gb2YgdGhlIG5ldw0KPGEgaHJlZj0iaHR0cHM6Ly9vY2Ft bC5vcmcvZG9jcy9nZXQtc3RhcnRlZCI+R2V0IFN0YXJ0ZWQgZG9jdW1lbnRhdGlvbjwvYT4uIDwv cD4NCjxwPkl0IGlzIG9yZ2FuaXNlZCBpbiB0aHJlZSBzdGFnZXM6IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL2luc3RhbGxpbmct b2NhbWwiPjxiPkluc3RhbGxpbmcgT0NhbWw8L2I+PC9hPiwgd2hpY2ggZ3VpZGVzIHlvdSB0aHJv dWdoIHRoZSBpbnN0YWxsYXRpb24gb2Ygb3BhbSwgdGhlIGluaXRpYWxpc2F0aW9uIG9mIGEgc3dp dGNoIGFuZCB0aGUgaW5zdGFsbGF0aW9uIG9mIFBsYXRmb3JtIHRvb2xzLg0KPC9saT48bGk+PGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy90b3VyLW9mLW9jYW1sIj48Yj5BIFRvdXIgb2Yg T0NhbWw8L2I+PC9hPiwgd2hpY2ggd2Fsa3MgeW91IHRocm91Z2ggdGhlIGJhc2ljcyBvZiB0aGUg T0NhbWwgbGFuZ3VhZ2UgYW5kIGludml0ZXMgeW91IHRvIHVzZSB0aGUgdG9wLWxldmVsIHRvIHN0 YXJ0IHBsYXlpbmcgd2l0aCB0aGUgbGFuZ3VhZ2UuDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9kb2NzL3lvdXItZmlyc3QtcHJvZ3JhbSI+PGI+WW91ciBGaXJzdCBPQ2FtbCBQ cm9ncmFtPC9iPjwvYT4sIHdoaWNoIGlzIGEgYml0IG1vcmUgcHJhY3RpY2FsIGFuZCBhc3N1bWVz IHlvdeKAmXJlIHVzaW5nIGFuIGVkaXRvciB0byBoZWxwIHlvdSBjcmVhdGUgeW91ciBmaXJzdCBl eGVjdXRhYmxlIHVzaW5nIER1bmUuDQo8L2xpPjwvdWw+DQo8cD5JbiBhZGRpdGlvbiB0byB0aGVz ZSwgeW914oCZbGwgYWxzbyBmaW5kIGludHJvZHVjdG9yeSBndWlkZXMgb24gdGhlIHRvb2xpbmcg dG8gY29tcGxlbWVudCB0aGUgaW50cm9kdWN0aW9uIHRvIHRoZSBsYW5ndWFnZToNCjwvcD4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3Nl dC11cC1lZGl0b3IiPkNvbmZpZ3VyaW5nIFlvdXIgRWRpdG9yPC9hPiA8L2xpPjxsaT48YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9kb2NzL3RvcGxldmVsLWludHJvZHVjdGlvbiI+SW50cm9kdWN0 aW9uIHRvIHRoZSBPQ2FtbCBUb3BsZXZlbDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v b2NhbWwub3JnL2RvY3Mvb3BhbS1zd2l0Y2gtaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb24gdG8g b3BhbSBTd2l0Y2hlczwvYT4NCjwvbGk+PC91bD4NCjxwPk91ciBnb2FsIGlzIHRvIG1ha2UgT0Nh bWwub3JnIHRoZSBiZXN0IHJlc291cmNlIHRvIGdldCBzdGFydGVkIHdpdGggYW5kIGxlYXJuIE9D YW1sLg0KPC9wPg0KPHA+VGhlcmUgYXJlIHN0aWxsIGEgbG90IG9mIGdhcHMgdG8gZmlsbCBpbiB0 aGUgZG9jdW1lbnRhdGlvbiDigJMgYW5kIHdl4oCZbGwgY29udGludWUgdG8gd29yayBvbiB0aGVz ZSBpbiB0aGUgY29taW5nIG1vbnRocyDigJMgYnV0IHRoZSBHZXQgU3RhcnRlZCBleHBlcmllbmNl IGlzIHByb2JhYmx5IHRoZSBtb3N0IGltcG9ydGFudCBwYXJ0IG9mIHRoZSBkb2N1bWVudGF0aW9u IHRvIGFsbGV2aWF0ZSBmcmljdGlvbiBwb2ludHMgdGhhdCBkaXNjb3VyYWdlIG5ldw0KIHVzZXJz IGZyb20gYWRvcHRpbmcgT0NhbWwuIEFzIHN1Y2gsIGRvbuKAmXQgaGVzaXRhdGUgdG8gcHVibGlj aXNlIHRoZXNlLCBidXQgbW9zdCBpbXBvcnRhbnRseSwgbGV0IHVzIGtub3cgeW91ciBmZWVkYmFj ayENCjwvcD4NCjxwPkhhcHB5IHJlYWRpbmchIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI1Ij5XZWIgQW5hbHl0aWNzIG9uIE9DYW1sLm9yZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvd2ViLWFuYWx5dGljcy1vbi1vY2FtbC1vcmcvMTMxODgvOCI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2ViLWFuYWx5dGljcy1vbi1vY2FtbC1vcmcvMTMxODgv ODwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3YjYzZWYx IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2I2M2VmMSI+Q29udGludWluZyB0aGlz IHRocmVhZCwgVGhpYmF1dCBNYXR0aW8gc2FpZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnN2I2M2VmMSI+DQo8cD5UaGFua3MgZm9yIHRoZSBmZWVkYmFjayBh bmQgdGhlIHBhcnRpY2lwYXRpb24gaW4gdGhlIHN1cnZleSEgPC9wPg0KPHA+U2VlaW5nIHRoYXQg dGhlcmUgYXJlbuKAmXQgbWFqb3IgY29uY2VybnMsIHdl4oCZbGwgYmUgbW92aW5nIGZvcndhcmQg d2l0aCBhIHRyaWFsIG9mIFBsYXVzaWJsZS4NCjwvcD4NCjxwPkFzIEBhdnNtIHNhaWQsIHdlIHBs YW4gb24gc2VsZi1ob3N0aW5nIGl0IG9uIHRoZSBPQ2FtbC5vcmcgaW5mcmFzdHJ1Y3R1cmUgdG8g cmVzcGVjdCBvdXIgY29tbWl0bWVudCB0byBub3QgdXNlIGFueSB0aGlyZC1wYXJ0eSBzZXJ2aWNl LiBUaGlzIG1lYW5zIHRoYXQgbm90IG9ubHkgd2Ugd29u4oCZdCBiZSBjb2xsZWN0aW5nIGFueSBw ZXJzb25hbCBkYXRhLCBidXQgZXZlbiB0aGUgYWdncmVnYXRlIGRhdGEgd2lsbCBuZXZlciBsZWF2 ZSB0aGUgT0NhbWwub3JnDQogaW5mcmFzdHJ1Y3R1cmUuIDwvcD4NCjxwPlRoZXJl4oCZcyByb3Vn aGx5IGEgdGhpcmQgb2YgcGVvcGxlIHdobyBhcmUgYWdhaW5zdCBhZGRpbmcgYW5hbHl0aWNzIHRv IE9DYW1sLm9yZyBpbiB0aGUgc3VydmV5IGFib3ZlLiBXZSBzdHJvbmdseSBiZWxpZXZlIHRoYXQg UGxhdXNpYmxlIGlzIGFsaWduZWQgd2l0aCBvdXIgY29tbWl0bWVudCB0byBwcm90ZWN0IE9DYW1s Lm9yZyB2aXNpdG9yc+KAmSBwcml2YWN5LCBidXQgSeKAmWxsIGVjaG8gQGF2c20gaW4gc2F5aW5n IHRoYXQgaWYgcGVvcGxlIGJlbGlldmUNCiB0aGF0IHRoaXMgaXMgbm90IHRoZSBjYXNlLCBJ4oCZ ZCBsb3ZlIHRvIGhlYXIgYWJvdXQgdGhlIHNwZWNpZmljIGNvbmNlcm5zIGFuZCBpZGVhcyBmb3Ig YWx0ZXJuYXRpdmVzLg0KPC9wPg0KPHA+VG8gYW5zd2VyIHNvbWUgcXVlc3Rpb25zIGFib3ZlOiA8 L3A+DQo8YmxvY2txdW90ZT4NCjxwPkFyZSB5b3UgZ29pbmcgdG8gZ2l2ZSBhIHB1YmxpYyBhY2Nl c3MgdG8gdGhlIFBsYXVzaWJsZSBzdGF0aXN0aWNzID8gT3Igd2lsbCBpdCBiZSBvbmx5IGZvciB0 aGUgbWFpbnRhaW5lcnMgaS5lLiBUYXJpZGVzID8NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPlRo ZSBhbmFseXRpY3MgZGFzaGJvYXJkIHdpbGwgYmUgcHVibGljLiA8L3A+DQo8YmxvY2txdW90ZT4N CjxwPkhhdmUgeW91IGNvbnNpZGVyZWQgcnVubmluZyBhIHNlcnZlci1zaWRlIGFuYWx5dGljcyBz ZXJ2aWNlPyA8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5ZZXMsIEBKaWFlSyBhY3R1YWxseSB3b3Jr ZWQgb24gYSBzZXJ2ZXItc2lkZSBhbmFseXRpY3Mgc2VydmljZSBhcyBwYXJ0IG9mIGhlciBPdXRy ZWFjaHkgaW50ZXJuc2hpcCBpbiAyMDIxIGFuZCBoYWQgbWFkZSBmYW50YXN0aWMgcHJvZ3Jlc3Mu IFRoZSBXSVAgZGFzaGJvYXJkIGlzIGF2YWlsYWJsZSBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9vY2Ft bC5vcmcvZGFzaGJvYXJkIj5odHRwczovL29jYW1sLm9yZy9kYXNoYm9hcmQ8L2E+LiA8L3A+DQo8 cD5JdCBjdXJyZW50bHkgZG9lc27igJl0IGNvbGxlY3QgPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ YW55PC9zcGFuPiBkYXRhIGFuZCBvbmx5IGxvZ3MgdW5pcXVlIHBhZ2UgYWNjZXNzZXMuDQo8L3A+ DQo8cD5XZSBoYWQgcGxhbm5lZCBvbiBidWlsZGluZyBvbiB0b3Agb2YgdGhpcywgYnV0IGFzIHlv dSBjYW4gaW1hZ2luZSB0aGlzIGlzIGEgbGFyZ2UgcHJvamVjdCwgYW5kIHRoZSBPQ2FtbC5vcmcg dGVhbSBoYXMgYmVlbiBwcmlvcml0aXNpbmcgaW1wcm92ZW1lbnRzIHRvIHRoZSBzaXRlIGl0c2Vs Zi4NCjwvcD4NCjxwPkkgZm91bmQgdGhlIGZvbGxvd2luZyB0byBiZSBhIGdvb2QgcmVhZCBvbiB0 aGUgcHJvcyBhbmQgY29ucyBvZiBzZXJ2ZXItc2lkZSB2cyBjbGllbnQtc2lkZSBhbmFseXRpY3M6 DQo8YSBocmVmPSJodHRwczovL3BsYXVzaWJsZS5pby9ibG9nL3NlcnZlci1sb2ctYW5hbHlzaXMj aG93LWJpZy1vZi1hLWRhdGEtZ2FwLWlzLXRoZXJlLWJldHdlZW4tc2VydmVyLWxvZy1hbmFseXNp cy1hbmQtd2ViLWFuYWx5dGljcyI+DQpodHRwczovL3BsYXVzaWJsZS5pby9ibG9nL3NlcnZlci1s b2ctYW5hbHlzaXMjaG93LWJpZy1vZi1hLWRhdGEtZ2FwLWlzLXRoZXJlLWJldHdlZW4tc2VydmVy LWxvZy1hbmFseXNpcy1hbmQtd2ViLWFuYWx5dGljczwvYT4NCjwvcD4NCjxwPlRMO0RSIGZvciBh bGwgaXRzIGJlbmVmaXRzLCBzZXJ2ZXItc2lkZSBhbmFseXRpY3MgY29tZXMgd2l0aCBhIGxvYWQg b2YgZHJhd2JhY2tzIGFuZCBpc27igJl0IGZ1bmRhbWVudGFsbHkgbW9yZSBwcml2YWN5LWZyaWVu ZGx5IHRoYW4gcHJpdmFjeS1vcmllbnRlZCBjbGllbnQtc2lkZSBhbmFseXRpY3Mgc29sdXRpb24u DQo8L3A+DQo8cD5UaGF0IGJlaW5nIHNhaWQsIGlmIHNvbWVvbmUgd291bGQgbGlrZSB0byBjb250 cmlidXRlIHRvIHRoZSBEcmVhbSBhbmFseXRpY3MgZGFzaGJvYXJkIHRvIG1ha2UgaXQgdXNhYmxl IGFzIGFuIGFsdGVybmF0aXZlIHRvIG90aGVyIGFuYWx5dGljcyBzb2x1dGlvbnMsIEnigJlkIGJl IG1vcmUgdGhhbiBoYXBweSB0byBtb3ZlIHRvd2FyZHMgdGhpcyEgRG9u4oCZdCBoZXNpdGF0ZSB0 byByZWFjaCBvdXQgdG8gbWUgb3Igb3RoZXIgT0NhbWwub3JnIG1haW50YWluZXJzDQogYWJvdXQg dGhhdC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk9DYW1sLm9yZyBOZXdzbGV0 dGVyOiBBdWd1c3QgYW5kIFNlcHRlbWJlciAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9vY2FtbC1vcmctbmV3c2xldHRlci1hdWd1c3QtYW5kLXNlcHRlbWJlci0y MDIzLzEzMjcyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy1uZXdz bGV0dGVyLWF1Z3VzdC1hbmQtc2VwdGVtYmVyLTIwMjMvMTMyNzIvMTwvYT4NCjwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2YyMzAxNCIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZzdmMjMwMTQiPlRoaWJhdXQgTWF0dGlvIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2YyMzAxNCI+DQo8cD5XZWxj b21lIHRvIHRoZSBBdWd1c3QgYW5kIFNlcHRlbWJlciAyMDIzIGVkaXRpb24gb2YgdGhlIE9DYW1s Lm9yZyBuZXdzbGV0dGVyISBUaGlzIHVwZGF0ZSBoYXMgYmVlbiBjb21waWxlZCBieSB0aGUgT0Nh bWwub3JnIHRlYW0uIFlvdSBjYW4gZmluZCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdGFnL29jYW1sb3JnLW5ld3NsZXR0ZXIiPnByZXZpb3VzIHVwZGF0ZXMgb24gRGlz Y3VzczwvYT4uDQo8L3A+DQo8cD5PdXIgZ29hbCBpcyB0byBtYWtlIE9DYW1sLm9yZyB0aGUgYmVz dCByZXNvdXJjZSBmb3IgYW55b25lIHdobyB3YW50cyB0byBnZXQgc3RhcnRlZCBhbmQgYmUgcHJv ZHVjdGl2ZSBpbiBPQ2FtbC4gVGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyIHByb3ZpZGVzIGFuIHVw ZGF0ZSBvbiBvdXIgcHJvZ3Jlc3MgdG93YXJkcyB0aGF0IGdvYWwgYW5kIGFuIG92ZXJ2aWV3IG9m IGNoYW5nZXMgd2UgYXJlIHdvcmtpbmcgb24uDQo8L3A+DQo8cD5XZSBjb3VsZG7igJl0IGRvIGl0 IHdpdGhvdXQgYWxsIHRoZSBhbWF6aW5nIE9DYW1sIGNvbW11bml0eSBtZW1iZXJzIHdobyBoZWxw IHVzIHJldmlldywgcmV2aXNlLCBhbmQgY3JlYXRlIGJldHRlciBPQ2FtbCBkb2N1bWVudGF0aW9u LiBZb3VyIGZlZWRiYWNrIGVuYWJsZXMgdXMgdG8gYmV0dGVyIHByaW9yaXRpc2Ugb3VyIHdvcmsg YW5kIG1ha2UgcHJvZ3Jlc3MgdG93YXJkcyBvdXIgZ29hbC4gVGhhbmsgeW91IQ0KPC9wPg0KPHA+ VGhlc2UgcGFzdCB0d28gbW9udGhzLCBvdXIgcHJpb3JpdGllcyB3ZXJlOiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGI+TGVhcm4gQXJlYTo8L2I+IFdl4oCZcmUgd29ya2luZyB0b3dh cmRzIG1ha2luZyBPQ2FtbC5vcmcgYSBncmVhdCByZXNvdXJjZSB0byBsZWFybiBPQ2FtbCBhbmQg ZGlzY292ZXIgaXRzIGVjb3N5c3RlbS4gV2XigJl2ZSBmb2N1c3NlZCBvbiBnZXR0aW5nIHRoZSBu ZXcgR2V0IFN0YXJ0ZWQgZG9jdW1lbnRhdGlvbiByZWFkeSBmb3IgcHVibGljYXRpb24sIGFuZCB3 ZSBzdGFydGVkIHdvcmsgb24gYSBzZWNvbmQgaXRlcmF0aW9uIG9mIHRoZSBkZXNpZ25zDQogZm9y IHRoZSBMZWFybiBhcmVhLiA8L2xpPjxsaT48Yj5HZW5lcmFsIEltcHJvdmVtZW50czo8L2I+IEFz IHVzdWFsLCB3ZSBhbHNvIHdvcmtlZCBvbiBnZW5lcmFsIG1haW50ZW5hbmNlIGFuZCBpbXByb3Zl bWVudHMgYmFzZWQgb24gdXNlciBmZWVkYmFjaywgc28gd2XigJlyZSBoaWdobGlnaHRpbmcgc29t ZSBvZiBvdXIgd29yayBiZWxvdy4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYWM3YzMxMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Fj N2MzMTMiPkxlYXJuIEFyZWE8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0 ZXh0LW9yZ2FjN2MzMTMiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJv cmc3MjdjMjQ2Ij48L2E+MS4gUmVkZXNpZ24gb2YgdGhlIExlYXJuIEFyZWE8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNzI3YzI0NiI+DQo8cD5BZnRlciBjb21w bGV0aW5nIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBkZXNpZ24gaW4gSnVseSwgd2Ugc3RhcnRl ZCB3b3JraW5nIG9uIGEgbmV3IGl0ZXJhdGlvbiB0aGF0IGlzIG1vcmUgaW4gbGluZSB3aXRoIHRo ZSBjdXJyZW50IGJyYW5kaW5nIG9mIHRoZSBzaXRlLiBGZWVkYmFjayBmcm9tIHRoZSB0ZWFtIGFu ZCB1c2VycyBoYXMgYmVlbiBleHRyZW1lbHkgcG9zaXRpdmUgb24gdGhlIFVYICh0aGUgc3RydWN0 dXJlIG9mIHRoZSBuZXcgZG9jdW1lbnRhdGlvbg0KIGFuZCB0aGUgbGF5b3V0IG9mIHRoZSBwYWdl cyksIGJ1dCB3ZSBmZWx0IHRoYXQgdGhlIGRlc2lnbiBkaXJlY3Rpb24gbmVlZGVkIHRvIGJlIHJl Y29uY2lsZWQgd2l0aCBhbmQgaW1wcm92ZSBvbiB0aGUgZXhpc3RpbmcgZGVzaWducyBvZiBhbGwg cGFnZXMuIFRodXMsIHdlIGFyZSByZXZpc2l0aW5nIHRoZSBkZXNpZ25z4oCZIFVJIGFzcGVjdHMg aW4gYm90aCBsaWdodCBhbmQgZGFyayBtb2Rlcy4NCjwvcD4NCjxwPjxiPlJlbGV2YW50IFBScyBh bmQgQWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Db250aW51 ZWQgd29yayBvbiA8YSBocmVmPSJodHRwczovL3d3dy5maWdtYS5jb20vZmlsZS9BcWs1eTAzZnNh Q3VoVFN5d21tWTA2L09DYW1sLm9yZy1QdWJsaWMtRGVzaWducz90eXBlPWRlc2lnbiZhbXA7bm9k ZS1pZD0xMzAtNzU0JmFtcDttb2RlPWRlc2lnbiZhbXA7dD1YdlZDTXVrcTVBUjNveFJmLTAiPg0K RmlnbWEgVVgvVUkgZGVzaWduczwvYT4gZm9yIHRoZSBuZXcgTGVhcm4gYXJlYToNCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5Db250aW51ZWQgb3ZlcmFsbCBMZWFybiBhcmVhIFVJIGRlc2lnbiA8 L2xpPjxsaT5JbXByb3ZlZCBkYXJrIG1vZGUgZm9yIHRoZSBob21lIHBhZ2Ugb24gbW9iaWxlIGFu ZCBtYWRlIG5lY2Vzc2FyeSB0ZXh0IGFtZW5kbWVudHMNCjwvbGk+PGxpPkRlc2lnbmVkIG1vYmls ZSB2aWV3cyBmb3IgdGhlIHNlYXJjaCBmaWVsZCB3aXRoIGFuIG9wZW4gbmF2aWdhdGlvbiBmZWF0 dXJlIGFuZCBicmVhZGNydW1iIG5hdmlnYXRpb24NCjwvbGk+PGxpPldvcmtlZCBvbiB1cGRhdGlu ZyB0aGUgZGVzaWduIHN5c3RlbXMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5IGJldHdlZW4gbGlnaHQg YW5kIGRhcmsgdmFyaWFudHMNCjwvbGk+PC91bD4NCjwvbGk+PGxpPkNvbnRpbnVlZCB0aGUgaW1w bGVtZW50YXRpb24gb2YgbmV3IGNvbXBvbmVudHMgZm9yIHRoZSBMZWFybiBBcmVhOg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPlNraWxsIHRhZyBjb21wb25lbnQgZm9yIHRoZSBMZWFybiBhcmVh IGlzIGNvbXBsZXRlZCDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzE0MjciPg0Kb2NhbWwvb2NhbWwub3JnIzE0Mjc8L2E+IDwvbGk+PGxpPkxlYXJu IG92ZXJ2aWV3IGNhcmRzIChJbnN0YWxsICYjNDM7IFN0YW5kYXJkIExpYnJhcnkgQVBJKSBjb21w bGV0ZWQg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xNDQxIj4NCm9jYW1sL29jYW1sLm9yZyMxNDQxPC9hPiA8L2xpPjxsaT5Cb29rcyBibG9jayBj b21wb25lbnQgY29tcGxldGVkIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMTQ4MSI+DQpvY2FtbC9vY2FtbC5vcmcjMTQ4MTwvYT4gPC9saT48bGk+ VHV0b3JpYWwgYmxvY2sgY29tcG9uZW50IGNvbXBsZXRlZCDigJMgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEzODciPg0Kb2NhbWwvb2NhbWwub3JnIzEz ODc8L2E+IDwvbGk+PGxpPkV4ZXJjaXNlcyBibG9jayBjb21wb25lbnQg4oCTIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDc5Ij4NCm9jYW1sL29jYW1s Lm9yZyMxNDc5PC9hPiA8L2xpPjxsaT5WaWRlbyBibG9jayBjb21wb25lbnQg4oCTIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDgwIj4NCm9jYW1sL29j YW1sLm9yZyMxNDgwPC9hPiA8L2xpPjxsaT5MYW5ndWFnZSBNYW51YWwgQmFubmVyIENvbXBvbmVu dCAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDA2 Ij4NCm9jYW1sL29jYW1sLm9yZyMxNDA2PC9hPiA8L2xpPjxsaT5DaGFuZ2UgbGVhcm4gYXJlYSB0 YWIgbmF2aWdhdGlvbiBjb2xvciAtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8xNTIyIj4NCm9jYW1sL29jYW1sLm9yZyMxNTIyPC9hPiA8L2xpPjwvdWw+ DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdjYzk5OTMyIj48L2E+Mi4g T0NhbWwgRG9jdW1lbnRhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmdjYzk5OTMyIj4NCjxwPlNpbmNlIEF1Z3VzdCwgd2XigJl2ZSBmb2N1c2VkIG1haW5s eSBvbiB0aGUg4oCcR2V0dGluZyBTdGFydGVk4oCdIGRvY3VtZW50cywgaW5jbHVkaW5nIGEgZ3Vp ZGUgdG8gaW5zdGFsbGluZyBPQ2FtbCwgYSDigJx0b3Vy4oCdIG9mIHRoZSBPQ2FtbCBsYW5ndWFn ZSwgYW5kIGEgdHV0b3JpYWwgdG8gY3JlYXRlIHlvdXIgZmlyc3QgcHJvamVjdCBpbiBPQ2FtbC4N CjwvcD4NCjxwPkFudGljaXBhdGluZyBvbiBvdXIgT2N0b2JlciB1cGRhdGUsIHdl4oCZdmUganVz dCA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1nZXQtc3RhcnRl ZC1kb2N1bWVudGF0aW9uLW9uLW9jYW1sLW9yZy8xMzI2OSI+DQpwdWJsaXNoZWQ8L2E+IHRoZSBu ZXcgR2V0IFN0YXJ0ZWQgZG9jdW1lbnRhdGlvbiBwYWdlcyEgOnRhZGE6IDwvcD4NCjxwPldlIHN0 aWxsIGVuY291cmFnZSBjb21tdW5pdHkgZmVlZGJhY2ssIGFzIHdlIGZ1bGx5IGV4cGVjdCB0byBp dGVyYXRpdmVseSBpbXByb3ZlIHRoZXNlIGRvY3MgaW4gdGhlIGNvbWluZyB3ZWVrcywgZXNwZWNp YWxseSBhcyB0aGV5IHdpbGwgbm93IHNlcnZlIGFzIHRoZSBwcmltYXJ5IHJlc291cmNlIHRvIGV2 ZXJ5b25lIHdobyB3YW50cyB0byBnZXQgdXAgYW5kIHJ1bm5pbmcgd2l0aCBPQ2FtbC4NCjwvcD4N CjxwPk91ciBmb2N1cyB3aWxsIG5vdyBzaGlmdCB0byBmaWxsaW5nIHRoZSBnYXBzIGluIHRoZSBM YW5ndWFnZSBzZWN0aW9uIG9mIHRoZSBkb2N1bWVudGF0aW9uLCBzdGFydGluZyB3aXRoIHRoZSBC YXNpYyBEYXRhIFR5cGVzIGFuZCBGdW5jdGlvbnMgYW5kIFZhbHVlcyBwYWdlcywgd2hpY2ggYXJl IGN1cnJlbnRseSBpbiB0aGUgQ29tbXVuaXR5IHJldmlldyBzdGFnZS4NCjwvcD4NCjxwPjxiPlJl bGV2YW50IFBScyBhbmQgQWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48Yj5GaXJzdCBEcmFmdCBJbiBQcm9ncmVzczo8L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+U2V0cyA8L2xpPjxsaT5NYXBzIDwvbGk+PGxpPk11dGFibGUgU3RhdGUgLyBJbXBlcmF0 aXZlIFByb2dyYW1taW5nIDwvbGk+PC91bD4NCjwvbGk+PGxpPjxiPkluIFJldmlldyAoaW50ZXJu YWwpOjwvYj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Qb2x5bW9ycGhpYyBWYXJpYW50cyA8 L2xpPjwvdWw+DQo8L2xpPjxsaT48Yj5JbiBSZXZpZXcgKGNvbW11bml0eSk6PC9iPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8xNTE0Ij5CYXNpYyBEYXRhIFR5cGVzPC9hPiAoc2VlDQo8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLXR1dG9yaWFsLXJldmFtcGluZy1jb250 ZC1iYXNpYy1kYXRhdHlwZXMvMTI5ODUiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUxMiI+RnVu Y3Rpb25zIGFuZCBWYWx1ZXM8L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1vcmctdHV0b3JpYWwtcmV2YW1waW5nLWNvbmQtdmFsdWVzLWFuZC1mdW5j dGlvbnMvMTMwMDUiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQwMCI+RmlsZSBNYW5pcHVsYXRp b248L2E+IChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxwLXJl dmlldy10aGUtbmV3LWZpbGUtbWFuaXB1bGF0aW9uLXR1dG9yaWFsLW9uLW9jYW1sLW9yZy8xMjYz OCI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PC91bD4NCjwvbGk+PGxpPjxiPlB1Ymxpc2hl ZDo8L2I+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5v cmcvZG9jcy9pbnN0YWxsaW5nLW9jYW1sIj5JbnN0YWxsaW5nIE9DYW1sPC9hPiAoc2VlIDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxwLXJldmFtcGluZy10aGUtZ2V0dGlu Zy1zdGFydGVkLXR1dG9yaWFscy1pbi1vY2FtbC1vcmcvMTI3NDkiPg0KRGlzY3VzcyBUaHJlYWQ8 L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3RvdXItb2Ytb2Nh bWwiPkEgVG91ciBPZiBPQ2FtbDwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvaGVscC1yZXZhbXBpbmctdGhlLWdldHRpbmctc3RhcnRlZC10dXRvcmlhbHMtaW4t b2NhbWwtb3JnLzEyNzQ5Ij4NCkRpc2N1c3MgVGhyZWFkPC9hPikgPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy95b3VyLWZpcnN0LXByb2dyYW0iPllvdXIgRmlyc3QgT0Nh bWwgUHJvZ3JhbTwvYT4gKHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2hlbHAtcmV2YW1waW5nLXRoZS1nZXR0aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWluLW9jYW1sLW9y Zy8xMjc0OSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v b2NhbWwub3JnL2RvY3Mvb3BhbS1zd2l0Y2gtaW50cm9kdWN0aW9uIj5JbnRyb2R1Y3Rpb24gdG8g b3BhbSBTd2l0Y2hlczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Rv Y3MvYXJtNjQtZml4Ij5GaXggSG9tZWJyZXcgRXJyb3JzIG9uIEFwcGxlIE0xPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9vcGVyYXRvcnMiPk9wZXJhdG9yczwv YT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9lcnJvci1oYW5kbGlu ZyI+RXJyb3IgSGFuZGxpbmc8L2E+IChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1uZXctZ2V0LXN0YXJ0ZWQtZG9jdW1lbnRhdGlvbi1vbi1vY2FtbC1vcmcvMTMy NjkiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29jYW1s Lm9yZy9kb2NzL2FycmF5cyI+QXJyYXlzPC9hPiAoc2VlIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9mZWVkYmFjay1uZWVkZWQtbmV3LWFycmF5cy10dXRvcmlhbC1vbi1vY2Ft bC1vcmcvMTI2ODMiPg0KRGlzY3VzcyBUaHJlYWQ8L2E+KSA8L2xpPjxsaT48YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9kb2NzL3NlcXVlbmNlcyI+U2VxdWVuY2VzPC9hPiAoc2VlIDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jcmVhdGluZy1hLXR1dG9yaWFsLW9uLXNlcXVl bmNlcy8xMjA5MSI+DQpEaXNjdXNzIFRocmVhZDwvYT4pIDwvbGk+PC91bD4NCjwvbGk+PC91bD4N CjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmdmYTk1ZDE5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZmE5NWQxOSI+R2VuZXJh bCBJbXByb3ZlbWVudHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZ2ZhOTVkMTkiPg0KPHA+VGhpcyBtb250aCwgd2XigJlyZSB3ZWxjb21pbmcgMiBuZXcgY29u dHJpYnV0b3JzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL1NoYWxva1NoYWxvbSI+QFNoYWxva1NoYWxvbTwvYT4gaW1wcm92ZWQgdGhl IOKAnFdoeSBPQ2FtbD/igJ0gcGFnZSAtDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTUxNiI+b2NhbWwvb2NhbWwub3JnIzE1MTY8L2E+IDwvbGk+PGxp PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9lY2h1YmVyMiI+QGVjaHViZXIyPC9hPiBmaXhl ZCBhIGJyb2tlbiBsaW5rIHRvIHRoZSBFZGl0b3Igc2V0dXAgaW5zdHJ1Y3Rpb25zIC0NCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTUyIj5vY2FtbC9v Y2FtbC5vcmcjMTU1MjwvYT4gPC9saT48L3VsPg0KPHA+YW5kIHdlbGNvbWUgY29udHJpYnV0aW9u cyBmcm9tIHJldHVybmluZyBjb250cmlidXRvcnM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQXNoaW5lRm9zdGVyIj5AQXNoaW5lRm9z dGVyPC9hPiBmaXhlZCBkYXRlIHBhcnNlIGVycm9yIGZvciBuZXdzIHNlY3Rpb24gb2YgdGhlIGJs b2cg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTUwMyI+b2NhbWwvb2NhbWwub3JnIzE1MDM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9lZHdpbnRvcm9rIj5AZWR3aW50b3JvazwvYT4gdXBkYXRlZCBYZW5TZXJ2ZXIg ZW50cnkgb24gSm9iIGJvYXJkIGFuZCBJbmR1c3RyaWFsIFVzZXJzIOKAkw0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1MTEiPm9jYW1sL29jYW1sLm9y ZyMxNTExPC9hPiA8L2xpPjwvdWw+DQo8cD5UaGFua3MgYSBsb3QgdG8gYWxsIHRoZSBjb250cmli dXRvcnMgdGhpcyBtb250aCEgSXTigJlzIGxvdmVseSB0byBzZWUgbW9yZSBhbmQgbW9yZSBwZW9w bGUgbWFraW5nIGNvbnRyaWJ1dGlvbnMgdG8gdGhlIHNpdGUhDQo8L3A+DQo8cD48Yj5SZWxldmFu dCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ TG9jYWwgYmxvZ3Mgb24gT0NhbWwub3JnIChmb3Igbm93IG9ubHkgdGhlIG9wYW0gYmxvZykgbm93 IGhhdmUgYSBkZWRpY2F0ZWQgUlNTIGZlZWQg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQ1OSI+b2NhbWwvb2NhbWwub3JnIzE0NTk8L2E+IDwv bGk+PGxpPkFkZGVkIGFuIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvaXMtb2NhbWwt d2ViLXlldCI+SXMgT0NhbWwgV2ViIFlldD88L2E+IHBhZ2UgLQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEyMjYiPm9jYW1sL29jYW1sLm9yZyMxMjI2 PC9hPiA8L2xpPjxsaT5SZXBhaXJlZCBicm9rZW4gbGlua3MgdG8gdGhlIGV4dGVudCBwb3NzaWJs ZSBpbiAxNyBkaWZmZXJlbnQgZmlsZXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8xNDYxIj4NCm9jYW1sL29jYW1sLm9yZyMxNDYxPC9hPiwgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1MTUiPg0Kb2Nh bWwvb2NhbWwub3JnIzE1MTU8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzE1MjAiPg0Kb2NhbWwvb2NhbWwub3JnIzE1MjA8L2E+IDwvbGk+ PGxpPkNoYW5nZSBNYWtlZmlsZSBvZiB0aGUgUGxheWdyb3VuZCB0byBjcmVhdGUgYSBsb2NhbCBv cGFtIHN3aXRjaCAoaW4gbGluZSB3aXRoIHRoZSBsb2NhbCBzd2l0Y2ggY3JlYXRlZCBieSBPQ2Ft bC5vcmfigJlzIE1ha2VmaWxlKSBpbiBvcmRlciB0byByZXNvbHZlIHByb2JsZW1zIHdpdGggY29w eWluZyB0aGUNCjxjb2RlPlN0ZGxpYjwvY29kZT4gYnVpbGQgYXJ0aWZhY3RzIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQ2OSI+DQpvY2FtbC9v Y2FtbC5vcmcjMTQ2OTwvYT4gPC9saT48bGk+QSBsaW5rIHRvIGFuIE91dHJlYWNoeSBibG9nIHBv c3QgaGFzIGJlZW4gY29udHJpYnV0ZWQgdG8gdGhlIE9DYW1sIFBsYW5ldCDigJMgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0NzQiPg0Kb2NhbWwvb2Nh bWwub3JnIzE0NzQ8L2E+IDwvbGk+PGxpPkZpeGVkIGFuIGlzc3VlIHdpdGggUGFja2FnZSBzZWFy Y2ggb24gU2FmYXJpIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMTUxMCI+DQpvY2FtbC9vY2FtbC5vcmcjMTUxMDwvYT4gPC9saT48bGk+SGlnaGxp Z2h0ZWQgYWN0aXZlIGxpbmsgaW4gcHJpbWFyeSBjb2xvciBhbmQgaW5jcmVhc2VkIGNsaWNrYWJs ZSBhcmVhIGZvciBsaW5rcyBpbiBtb2JpbGUgbWFpbiBuYXZpZ2F0aW9uIC0NCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTIxIj5vY2FtbC9vY2FtbC5v cmcjMTUyMTwvYT4gPC9saT48bGk+TWlub3IgaW1wcm92ZW1lbnRzIG9uIGRvY3VtZW50YXRpb24g Z2VuZXJhdGlvbi4gU2luZ2xlIG5ldyBsaW5lcyBpbiA8Y29kZT4ubWQ8L2NvZGU+IGZpbGVzIHdl cmUgdHJhbnNsYXRlZCB0byBsaW5lYnJlYWtzIGJ5IHZvb2Rvby4gTm93LCB2b29kb28gZW1pdHMg c3BhY2UgY2hhcmFjdGVycyBmb3IgdGhlc2Ug4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwtZG9jL3Zvb2Rvby9wdWxsLzExOSI+b2NhbWwtZG9jL3Zvb2RvbyMxMTk8L2E+IDwv bGk+PGxpPlJlZHVjZWQgc3BhY2luZyBpbiBwYWNrYWdlIGRvY3VtZW50YXRpb24gYmV0d2VlbiA8 Y29kZT4uc3BlYzwvY29kZT4gYW5kIDxjb2RlPg0KLnNwZWMtZG9jPC9jb2RlPiDigJMgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE1MDkiPm9jYW1sL29j YW1sLm9yZyMxNTA5PC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNyI+UmVsZWFzZSBvZiBvZG9jIDIuMy4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1vZG9jLTItMy0wLzEzMjczLzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLW9mLW9kb2MtMi0zLTAvMTMyNzMvMTwv YT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3MWVhYWMwIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNzFlYWFjMCI+UGF1bC1FbGxpb3QgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3MWVhYWMw Ij4NCjxwPlRoZSBvZG9jIHRlYW0gaXMgdGhyaWxsZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ug b2Ygb2RvYyAyLjMuMCEg8J+OiSBUaGlzIHJlbGVhc2UgaXMgdGhlIHJlc3VsdCBvZiBhbG1vc3Qg YSB5ZWFyIG9mIGRpbGlnZW50IHdvcmsgc2luY2UgdGhlIGxhc3QgbWFqb3IgcmVsZWFzZSBvZiBv ZG9jIDIuMi4wLCBpdCBjb21lcyBwYWNrZWQgd2l0aCBzaWduaWZpY2FudCBuZXcgZmVhdHVyZXMg YW5kIGltcHJvdmVtZW50cyENCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMmExYjgwOSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzJhMWI4MDkiPvCf jJ8gU3BvdGxpZ2h0IEZlYXR1cmVzIG9mIE9kb2MgMi4zLjA8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzJhMWI4MDkiPg0KPHA+SGVyZSBhcmUgYSBjb3VwbGUg b2YgdGhlIG5ldyBmZWF0dXJlcyBpbnRyb2R1Y2VkIGluIE9kb2MgMi4zLjAgdGhhdCB3ZeKAmWQg bGlrZSB0byBoaWdobGlnaHQuDQo8L3A+DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT48YSBpZD0ib3JnYWEzNWQ4YiI+PC9hPjEuIDxiPlRhYmxlIFN1cHBvcnQ8L2I+PGJyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2FhMzVkOGIiPg0KPHA+VGFibGUg c3VwcG9ydCBpcyB0aGUgbGFzdCBhZGRpdGlvbiB0byB0aGUgb2RvYyBsYW5ndWFnZSwgYW5kIGNv bWVzIHdpdGggdHdvIHN5bnRheCBmbGF2b3VyczogYSBsaWdodCBvbmUsIGFuZCBhIGhlYXZ5IG9u ZS4gVGhlIGxpZ2h0IG1hcmt1cCBpcyBzaW1pbGFyIHRvIG1hcmtkb3du4oCZcyBtYXJrdXAgZm9y IHRhYmxlLCBwcm9kdWNpbmcgdGFibGVzIHRoYXQgYXJlIHJlYWRhYmxlIGluIHRoZSBzb3VyY2Ug ZmlsZSBhcyB3ZWxsLg0KPC9wPg0KPHA+SG93ZXZlciwgdGhpcyBtYXJrdXAgaGFzIHNvbWUgbGlt aXRhdGlvbiwgc2luY2UgaXQgb25seSBhbGxvd3MgaW5saW5lIGNvbnRlbnQgaW4gY2VsbHMuIEl0 IGNhbiBhbHNvIGJlIGRpZmZpY3VsdCB0byByZWFkIGFuZCBtYW50YWluIGZvciBiaWcgdGFibGVz LCB3aXRob3V0IGEgcHJvcGVyIGVkaXRvciBzdXBwb3J0LiBGb3IgdGhpcyByZWFzb24sIE9kb2Mg YWxzbyBwcm92aWRlcyBhIOKAnGhlYXZ54oCdIG1hcmt1cCwgY2xvc2VyIHRvIHRoZSBodG1sDQog b25lLCB3aXRoIGZld2VyIGxpbWl0YXRpb25zISA8L3A+DQo8cD5IZXJlIGlzIGEgdGFibGUgaW4g aGVhdnksIGxpZ2h0LCBhbmQgcmVuZGVyZWQgZm9ybTogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBs ZSIgaWQ9Im9yZ2Y2MWNjNmEiPg0Ke3QNClRhYmxlIHwgc3VwcG9ydA0KLS0tLS0tfC0tLS0tLS0t DQppcyAgICB8IGNvb2whDQp9DQo8L3ByZT4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc0 NTJhYTdhIj4NCnt0YWJsZQ0Ke3RyIHt0aCBUYWJsZX0ge3RoIHN1cHBvcnR9fQ0Ke3RyIHt0ZCBp c30ge3RkIGNvb2whfX0NCn0NCjwvcHJlPg0KPHRhYmxlIGJvcmRlcj0iMiIgY2VsbHNwYWNpbmc9 IjAiIGNlbGxwYWRkaW5nPSI2IiBydWxlcz0iZ3JvdXBzIiBmcmFtZT0iaHNpZGVzIj4NCjxjb2xn cm91cD48Y29sIGNsYXNzPSJvcmctbGVmdCI+PGNvbCBjbGFzcz0ib3JnLWxlZnQiPjwvY29sZ3Jv dXA+DQo8dGhlYWQ+DQo8dHI+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5UYWJs ZTwvdGg+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5zdXBwb3J0PC90aD4NCjwv dHI+DQo8L3RoZWFkPg0KPHRib2R5Pg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+aXM8L3Rk Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+Y29vbCE8L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8L3Rh YmxlPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNDBmYzdjNCI+PC9hPjIuIDxiPlNvdXJj ZSBDb2RlIFJlbmRlcmluZzwvYj48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnNDBmYzdjNCI+DQo8cD5Tb3VyY2UgY29kZSByZW5kZXJpbmcgaXMgYW4gZXh0cmVt ZWx5IGV4Y2l0aW5nIG5ldyBmZWF0dXJlLiBOb3Qgb25seSA8Y29kZT5vZG9jPC9jb2RlPiBpcyBu b3cgYWJsZSB0byBnZW5lcmF0ZSBhIHJlbmRlcmluZyBvZiB0aGUgc291cmNlIGZpbGVzIChhbmQg c291cmNlIGhpZXJhcmNoeSkgb2YgYSBwcm9qZWN0LCBidXQgaXQgaXMgYWxzbyBhYmxlIHRvIGNy ZWF0ZSBkaXJlY3QgbGlua3MgZnJvbSB0aGUgZG9jdW1lbnRhdGlvbiB0byB0aGUgaW1wbGVtZW50 YXRpb24hDQo8L3A+DQo8cD5UaGlzIHB1dHMgdGhlIGRvY3VtZW50YXRpb24gYnJvd3NpbmcgdG8g YSBuZXcgbGV2ZWwsIGJ5IGhlbHBpbmcgdG8gcXVpY2tseSBhbnN3ZXIgYW55IGltcGxlbWVudGF0 aW9uLXJlbGF0ZWQgcXVlc3Rpb24hDQo8L3A+DQo8cD5UaGUgc291cmNlIGNvZGUgcmVuZGVyaW5n IGlzIGFsc28gdGFpbG9yZWQgdG8gT0NhbWwsIGZvciBpbnN0YW5jZSB3aXRoIGxpbmtzIGZyb20g dmFyaWFibGVzIHRvIHRoZWlyIGRlZmluaXRpb24sIHNvbWV0aGluZyBtaXNzaW5nIGZyb20gdHJh ZGl0aW9uYWwgaHRtbC1iYXNlZCBzb3VyY2Ugdmlld2luZyBzdWNoIGFzIGdpdGh1YiENCjwvcD4N CjxwPlVzaW5nIHRoaXMgZmVhdHVyZXMgaW4gb2RvY+KAmXMgZHJpdmVyIHdpbGwgcmVxdWlyZSBz b21lIHdvcmssIGJ1dCB5b3UgY2FuIGFscmVhZHkgaGF2ZSBhIHByZXZpZXcgb2YgdGhlIGZlYXR1 cmUgYnkgZ29pbmcgdG8gdGhlIG9kb2MgQVBJIHdlYnNpdGUsIHdoaWNoIHdhcyBidWlsdCB3aXRo IHRoZSBmZWF0dXJlIGVuYWJsZWQuIEZvciBpbnN0YW5jZSwgdGhlDQo8YSBocmVmPSJodHRwczov L29jYW1sLmdpdGh1Yi5pby9vZG9jL29kb2NfaHRtbC9PZG9jX2h0bWwvaW5kZXguaHRtbCI+T2Rv Y19odG1sPC9hPiBtb2R1bGUgaXMgbm93IHBvcHVsYXRlZCB3aXRoIG1hbnkNCjxjb2RlPlNvdXJj ZTwvY29kZT4gbGlua3MsIGp1bXBpbmcgcmlnaHQgaW50byB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC5naXRodWIuaW8vb2RvYy9zb3VyY2Uvc3JjL2h0bWwvZ2VuZXJhdG9yLm1sLmh0bWwiPg0K aW1wbGVtZW50YXRpb24gZmlsZTwvYT4hIERpcmVjdG9yeSBwYWdlcyB0byBicm93c2VyIHRoZSBp bXBsZW1lbnRhdGlvbiBhcmUgYWxzbyA8YSBocmVmPSJodHRwczovL29jYW1sLmdpdGh1Yi5pby9v ZG9jL3NvdXJjZS9zcmMvaW5kZXguaHRtbCI+DQppbmNsdWRlZDwvYT4gOkQgPC9wPg0KPC9kaXY+ DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2I1NTJm MDIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdiNTUyZjAyIj7wn5e677iPIEJhY2tn cm91bmQgJmFtcDsgUm9hZG1hcDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9 InRleHQtb3JnYjU1MmYwMiI+DQo8cD5CZWZvcmUgZGlzcGxheWluZyB0aGUgZnVsbCBjaGFuZ2Vs b2csIHNvbWUgYmFja2dyb3VuZCBvbiBvdXIgcm9hZG1hcCBhbmQgd2hhdCBjb21lcyBuZXh0Lg0K PC9wPg0KPHA+VGhlIGxhY2sgb2YgYWNjZXNzIHRvIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRhdGlv biBmb3IgT0NhbWwgbGlicmFyaWVzIGlzIG9uZSBvZiB0aGUgYmlnZ2VzdCBwYWluIHBvaW50cyBy ZXBvcnRlZCBieSB0aGUgT0NhbWwgY29tbXVuaXR5LCBhcyBoaWdobGlnaHRlZCBpbiB0aGUNCjxh IGhyZWY9Imh0dHBzOi8vb2NhbWwtc2Yub3JnL2RvY3MvMjAyMi9vY2FtbC11c2VyLXN1cnZleS0y MDIyLnBkZiI+MjAyMiBPQ2FtbCBzdXJ2ZXk8L2E+IChjLmYuIFE1MCkuDQo8L3A+DQo8cD5UaGlz IG1vdGl2YXRlZCB0aGUgb2RvYyBhbmQgT0NhbWwub3JnIHRlYW1zIHRvIGpvaW50bHkgd29yayBv biBhIGNlbnRyYWxpc2VkIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiwgdGhhdA0KPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3YzLW9jYW1sLW9yZy13ZS1hcmUtbGl2ZS85NzQ3Ij53 ZW50IGxpdmUgaW4gQXByaWwgMjAyMjwvYT4sIGFzIHBhcnQgb2YgdGhlIG5ldyB2ZXJzaW9uIG9m IE9DYW1sLm9yZy4NCjwvcD4NCjxwPldpdGggZG9jdW1lbnRhdGlvbiBmb3IgT0NhbWwgbGlicmFy aWVzIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL3BhY2thZ2VzIj5yZWFkaWx5IGF2YWlsYWJs ZSBvbiBPQ2FtbC5vcmc8L2E+LCB3ZSBub3cgdHVybiBvdXIgZm9jdXMgb24gbWFraW5nIHN1cmUg dGhhdCBsaWJyYXJ5IGF1dGhvcnMgaGF2ZSB0aGUgdG9vbGluZyB0aGV5IG5lZWQgdG8gY3JlYXRl IGhpZ2gtcXVhbGl0eSBkb2N1bWVudGF0aW9uLg0KPC9wPg0KPHA+T3VyIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL2Jsb2IvbWFzdGVyL1JPQURNQVAubWQiPnJvYWRtYXA8 L2E+IGhpZ2hsaWdodHMgc29tZSBmZWF0dXJlcyB3ZSBiZWxpZXZlIHdpbGwgbWFrZSB0aGUgZ2Vu ZXJhdGVkIGRvY3VtZW50YXRpb24gc2lnbmlmaWNhbnRseSBiZXR0ZXIgZm9yIHJlYWRlcnMsIGFu ZCBkb2N1bWVudGF0aW9uLXdyaXRpbmcgbXVjaCBtb3JlIHBsZWFzYW50IGFuZCByZXdhcmRpbmcu DQo8L3A+DQo8cD5UaGlzIHJlbGVhc2UgaXMgYSBzaWduaWZpY2FudCBtaWxlc3RvbmUgaW4gaW1w bGVtZW50aW5nIHRoZSBmZWF0dXJlcyBvbiBvdXIgcm9hZG1hcCBhbmQgaXMgdGhlIHByZWN1cnNv ciB0byBhIHNlcmllcyBvZiB1cGNvbWluZyByZWxlYXNlcy4gT2RvYyAyLjQuMCB3aWxsIGZvbGxv dyBzaG9ydGx5IGFuZCB3aWxsIGJyaW5nIHN1cHBvcnQgZm9yIHNlYXJjaC4gU3RheSB0dW5lZCBh bmQgZm9sbG93IG91ciBwcm9ncmVzcyB0aHJvdWdoIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90YWcvcGxhdGZvcm0tbmV3c2xldHRlciI+T0NhbWwgUGxhdGZvcm0gbmV3 c2xldHRlcjwvYT4hDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnNWU5MTk0MyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzVlOTE5NDMi PvCfpJ0gSm9pbiBUaGUgTWlzc2lvbjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnNWU5MTk0MyI+DQo8cD5XaGlsZSB3ZSBhcmUgZGVkaWNhdGVkIHRvIGRldmVs b3BpbmcgdGhlIGJlc3QgdG9vbGluZyB0byBnZW5lcmF0ZSBhbmQgc2VydmUgZG9jdW1lbnRhdGlv biBvbiBPQ2FtbC5vcmcsIGNyZWF0aW5nIGEgd2VsbC1kb2N1bWVudGVkIGxpYnJhcnkgZWNvc3lz dGVtIGNhbiBvbmx5IGJlIGEgY29sbGVjdGl2ZSBlZmZvcnQuIFBhY2thZ2UgYXV0aG9yczogd2Xi gJlyZSB3b3JraW5nIGhhcmQgdG8gZ2l2ZSB5b3UgZ3JlYXQgdG9vbHMsIGJ1dCB3ZeKAmWxsIG5l ZWQNCiBhbGwgeW91ciBoZWxwIHRvIGNyZWF0ZSBhbiBlY29zeXN0ZW0gb2Ygd2VsbC1kb2N1bWVu dGVkIGxpYnJhcmllcyBmb3IgT0NhbWwhIDwvcD4NCjxwPklmIHlvdSBmaW5kIHRoYXQgd3JpdGlu ZyBkb2N1bWVudGF0aW9uIGZvciB5b3VyIGxpYnJhcnkgaXNu4oCZdCBhcyBzdHJhaWdodGZvcndh cmQgYXMgeW91IHdvdWxkIGxpa2UsIHBsZWFzZSBkbyBzaGFyZSB5b3VyIGZlZWRiYWNrIHdpdGgg dXMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn YTMxMzZmYiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2EzMTM2ZmIiPjIuMy4wIENo YW5nZWxvZzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTMx MzZmYiI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2JkYTkwMjYi PjwvYT5BZGRlZDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdi ZGE5MDI2Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Tb3VyY2UgY29kZSByZW5kZXJpbmcg KEBKdWxvdywgQHBhbmdsZXNkLCBAam9ubHVkbGFtICM5MDksICM5OTYsICM5OTMsICM5ODIpIDwv bGk+PGxpPkhhbmRsZSB0YWJsZXMgbWFya3VwIChAcGFuZ2xlc2QsIEBncGV0aW90LCAjODkzKSA8 L2xpPjxsaT5Jbml0aWFsIHN1cHBvcnQgZm9yIGFzc2V0cyAoQHRyZWZpcywgIzk3NSkgPC9saT48 bGk+b2RvYy1wYXJzZXIgcmVtZXJnZWQgKEBqb25sdWRsYW0sICM5NzMpIFRoaXMgaW5jbHVkZXMg dGFibGUgc3VwcG9ydCAoQGdwZXRpb3QsIEBwYW5nbGVzZCwgb2NhbWwtZG9jL29kb2MtcGFyc2Vy IzExIG9jYW1sLWRvYy9vZG9jLXBhcnNlciMxNCkgYW5kIGRlbGltaXRlZCBjb2RlIGJsb2NrcyB3 aXRoIG9wdGlvbmFsIG91dHB1dCAoQGpvbmx1ZGxhbSwgb2NhbWwtZG9jL29kb2MtcGFyc2VyIzE3 KQ0KPC9saT48bGk+QWRkIGEgdG9vbHRpcCB0byByZWZlcmVuY2VzIHdpdGggdGV4dCAoQEp1bG93 LCAjOTQ1KSA8L2xpPjxsaT5BZGQgZW1vamkgdG8gYWxlcnRzIGluIENTUyAoQHlhd2FyYW1pbiwg IzkyOCkgPC9saT48bGk+QWRkIGNvbW1vbiBsYW5ndWFnZSBpbiBzaGlwcGVkIGhpZ2hsaWdodGpz IChASnVsb3csICM5NTMpIDwvbGk+PGxpPkRpc3BsYXkg4oCZcHJpdmF0ZeKAmSBrZXl3b3JkIGZv ciBwcml2YXRlIHR5cGUgZXh0ZW5zaW9ucyAoQGdwZXRpb3QsICMxMDE5KSA8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdkMjVmMDY1Ij48L2E+Rml4ZWQ8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZDI1ZjA2NSI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+Rml4IDxjb2RlPi0taGlkZGVuPC9jb2RlPiBub3QgYWx3YXlzIHRha2VuIGlu dG8gYWNjb3VudCAoQHBhbmdsZXNkLCAjOTQwKSA8L2xpPjxsaT5TeW50YXggaGlnaGxpZ2h0IGxh YmVscyBpbiBmdW5jdGlvbiBhcmd1bWVudHMgKEBwYW5nbGVzZCwgIzk5MCkgPC9saT48bGk+RW5z dXJlIGdlbmVyYXRlZCBodG1sIGVuZHMgd2l0aCBhIG5ld2xpbmUgKEAzUmFmYWwsICM5NTQpIDwv bGk+PGxpPldhcm4gYWdhaW5zdCB0YWdzIGluIHBhZ2VzIChASnVsb3csICM5NDgpIDwvbGk+PGxp PlJlbW92ZSB1bmhlbHBmdWwg4oCZVW5yZXNvbHZlZF9hcHBseeKAmSBlcnJvcnMgKEBncGV0aW90 LCAjOTQ2KSA8L2xpPjxsaT5BbGxvdyBsaW5rcyBhbmQgcmVmZXJlbmNlcyBpbiBoZWFkaW5ncyAo QEVtaWxlVHJvdGlnbm9uLCBAcGFuZ2xlc2QsICM5NDIpIDwvbGk+PGxpPkZpeCByZW5kZXJpbmcg b2YgbWV0aG9kIHR5cGVzIChAem9nZ3ksICM5MzUpIDwvbGk+PGxpPkZpeCBzZWN0aW9uIGxhYmVs bGluZyB3aXRoIHN1Ym1vZHVsZXMgKEBFbWlsZVRyb3RpZ25vbiwgQHBhbmdsZXNkLCAjOTMxKSA8 L2xpPjxsaT5MYVRlWCBiYWNrZW5kIGZpeGVzIChAT2N0YWNocm9uLCAjOTIxICM5MjApIDwvbGk+ PGxpPmh0bWw6IFJlbW92ZSBleHRyYSBzcGFjZSBpbiBjbGFzcyBkZWNsYXJhdGlvbnMgKEBKdWxv dywgIzkzNikgPC9saT48bGk+Rml4IHJlbmRlcmluZyBvZiB1bnJlc29sdmVkIHJlZmVyZW5jZXMg KEBKdWxvdywgIzk1NykgPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iOCI+QW5ub3VuY2UgU2VwcG8uU29jaWFsIHYwLjMgYW5kIGludml0ZSB0 aG91Z2h0czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWFubm91 bmNlLXNlcHBvLXNvY2lhbC12MC0zLWFuZC1pbnZpdGUtdGhvdWdodHMvMTMyNzcvMSI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWFubm91bmNlLXNlcHBvLXNvY2lhbC12MC0zLWFu ZC1pbnZpdGUtdGhvdWdodHMvMTMyNzcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnMzg3NjI4NCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzM4NzYyODQiPk1hcmN1cyBSb2hybW9zZXIg8J+MjSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzM4NzYyODQiPg0KPHA+SGkgYWxsLCA8L3A+ DQo8cD5JIGFtIGhhcHB5IHRvIGFubm91bmNlIHllc3RlcmRheeKAmXMgcmVsZWFzZSBvZiB2MC4z IG9mICNTZXBwbyEsIHRoZSBmcmllbmRseSwgc3VzdGFpbmFibGUsIHBlcm1hY29tcHV0aW5nIGlu c3BpcmVkIGFsdGVybmF0aXZlIHRvIGFsbCB0aG9zZSBoZWF2eSBtaWNyb2Jsb2cgc2VydmVycy4g R2VuZXJvdXNseSBmdW5kZWQgYnkgI05MbmV0DQo8YSBocmVmPSJodHRwczovL25sbmV0Lm5sL3By b2plY3QvU2VwcG8iPmh0dHBzOi8vbmxuZXQubmwvcHJvamVjdC9TZXBwbzwvYT4gPC9wPg0KPHA+ SXTigJlzIGJ1aWx0IHRvIGJlIG9wZXJhdGVkIGJ5IHlvdXJzZWxmIG9uIGNvbW1vZGl0eSBzaGFy ZWQgd2Vic3BhY2Ugd2l0aG91dCByZXF1aXJpbmcgbXVjaCBmdXJ0aGVyIGF0dGVudGlvbi4NCjwv cD4NCjxwPlJlYWQgbW9yZSBhdCA8YSBocmVmPSJodHRwczovL3NlcHBvLnNvY2lhbC9lbi9zdXBw b3J0LyNpbnN0YWxsYXRpb24iPmh0dHBzOi8vc2VwcG8uc29jaWFsL2VuL3N1cHBvcnQvI2luc3Rh bGxhdGlvbjwvYT4NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Eb3dubG9hZDogPGEg aHJlZj0iaHR0cHM6Ly9zZXBwby5zb2NpYWwvTGludXgteDg2XzY0LTAuMyI+aHR0cHM6Ly9zZXBw by5zb2NpYWwvTGludXgteDg2XzY0LTAuMzwvYT4NCjwvbGk+PGxpPkJpbmFyeTogPGEgaHJlZj0i aHR0cHM6Ly9zZXBwby5zb2NpYWwvTGludXgteDg2XzY0LTAuMy9zZXBwby5jZ2kiPmh0dHBzOi8v c2VwcG8uc29jaWFsL0xpbnV4LXg4Nl82NC0wLjMvc2VwcG8uY2dpPC9hPg0KPC9saT48bGk+U291 cmNlOiA8YSBocmVmPSJodHRwczovL3NlcHBvLnNvY2lhbC9MaW51eC14ODZfNjQtMC4zL3NvdXJj ZS50YXIuZ3oiPmh0dHBzOi8vc2VwcG8uc29jaWFsL0xpbnV4LXg4Nl82NC0wLjMvc291cmNlLnRh ci5nejwvYT4NCjwvbGk+PGxpPkdpdDogPGEgaHJlZj0iaHR0cHM6Ly9zZXBwby5zb2NpYWwvdi81 ZjA3OGQ5Ij5odHRwczovL3NlcHBvLnNvY2lhbC92LzVmMDc4ZDk8L2E+DQo8L2xpPjwvdWw+DQo8 cD5DaGFuZ2VzIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5wb3N0IG5vdGVzIDwvbGk+ PGxpPmJlaW5nIHN1YnNjcmliZWQgdG8gKGFrYSDigJlmb2xsb3dlZOKAmSkgPC9saT48bGk+ZGlz dHJpYnV0ZSBwb3N0IHRvIHN1YnNjcmliZXJzIDwvbGk+PGxpPmpvYiBxdWV1ZSB0byBkbyBzbyA8 L2xpPjxsaT5ob3VzZWtlZXBpbmcgVVggKHBhc3N3b3JkLCBwcm9maWxlIHBhZ2UsIHRpbWV6b25l KSA8L2xpPjwvdWw+DQo8cD5Zb3VyIHRob3VnaHRzIGFyZSB2ZXJ5IG11Y2ggYXBwcmVjaWF0ZWQu IDwvcD4NCjxwPk1hcmN1cyBSb2hybW9zZXIgPGEgaHJlZj0iaHR0cHM6Ly9kaWdpdGFsY291cmFn ZS5zb2NpYWwvQG1yby8xMTEyNjEyNzEwNzEwMzQzNzciPg0KaHR0cHM6Ly9kaWdpdGFsY291cmFn ZS5zb2NpYWwvQG1yby8xMTEyNjEyNzEwNzEwMzQzNzc8L2E+IDwvcD4NCjxwPlAuUy46IFRoZXJl IHdpbGwgYmUg8J+QqyBzdGlja2VycyBhZ2Fpbiwgc29vbi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjkiPmJ3ZCAyLjMuMCBmb3IgYmFja3dhcmQgbGlzdHM8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1id2QtMi0zLTAtZm9yLWJhY2t3YXJkLWxpc3Rz LzEzMjc4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1id2QtMi0zLTAtZm9y LWJhY2t3YXJkLWxpc3RzLzEzMjc4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYWM1YTQwMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2Fj NWE0MDIiPkZhdm9uaWEgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmdhYzVhNDAyIj4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgYSBuZXcg dmVyc2lvbiBvZiA8Y29kZT5id2Q8L2NvZGU+IGZvciBiYWNrd2FyZCBsaXN0cyEgVGhlIG5ldyBy ZWxlYXNlIGFkZGVkDQo8Y29kZT5pbml0PC9jb2RlPiBhbmQgYSBmZXcgb3RoZXIgPGNvZGU+TGlz dDwvY29kZT4gZnVuY3Rpb25zIGludHJvZHVjZWQgaW4gT0NhbWwgNS4xICg8Y29kZT5pc19lbXB0 eTwvY29kZT4sDQo8Y29kZT5maW5kX2luZGV4PC9jb2RlPiwgYW5kIDxjb2RlPmZpbmRfbWFwaTwv Y29kZT4pLiBJdCBhbHNvIGFkZGVkIG1hbnkgaW5saW5pbmcgYW5ub3RhdGlvbnMuDQo8L3A+DQo8 cD5CYWNrd2FyZCBsaXN0cyBhcmUgaXNvbW9ycGhpYyB0byByZWd1bGFyIGxpc3RzIGJ1dCBwbGFj ZSBlbGVtZW50cyBiYWNrd2FyZC4gVXNpbmcgYSBkaWZmZXJlbnQgdHlwZSBmb3Igc2VtYW50aWNh bGx5IGJhY2t3YXJkIGxpc3RzIGNhbiBhdm9pZCBidWdzIHN1Y2ggYXMgbWlzc2luZyBvciBtaXN1 c2luZw0KPGNvZGU+TGlzdC5yZXY8L2NvZGU+IG9yIDxjb2RlPkxpc3QucmV2X2FwcGVuZDwvY29k ZT4uIDxiPjxiPk91ciBzdHJhdGVneSBpcyB0byBrZWVwIHRoZSBlbGVtZW50c+KAmQ0KPHNwYW4g Y2xhc3M9InVuZGVybGluZSI+dGV4dHVhbCBvcmRlcjwvc3Bhbj4gYW5kIGF2b2lkIGZ1bmN0aW9u cyBzdWNoIGFzIDxjb2RlPkxpc3QucmV2PC9jb2RlPi48L2I+PC9iPiBJbml0aWFsbHksIHRoaXMg cGFja2FnZSB3YXMgY3JlYXRlZCB0byBlbGltaW5hdGUgYnVncyBpbiBvdXIgdHlwZSBjaGVja2Vy cywgYnV0IHdlIGhhdmUgYmVlbiB1c2luZyBpdCBhbG1vc3QgZXZlcnl3aGVyZSBzaW5jZSB0aGVu LiBJIHJlY29tbWVuZCB1c2luZw0KPGNvZGU+YndkPC9jb2RlPiBpZiB5b3UgdXNlIDxjb2RlPmxp c3Q8L2NvZGU+IHRvIHN0b3JlIDxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPmFueXRoaW5nPC9zcGFu PiBzZW1hbnRpY2FsbHkgYmFja3dhcmQuIPCfmIkNCjwvcD4NCjxwPk1vcmUgaW5mb3JtYXRpb24g YXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9vY2FtbC1id2QiPmh0dHBzOi8v Z2l0aHViLmNvbS9SZWRQUkwvb2NhbWwtYndkPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSIxMCI+U3RvcmluZyBjcmVkZW50aWFscyB0byBhIHByaXZhdGUgT1BBTSByZXBvc2l0 b3J5PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RvcmluZy1jcmVk ZW50aWFscy10by1hLXByaXZhdGUtb3BhbS1yZXBvc2l0b3J5LzM1MjAvMTAiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3N0b3JpbmctY3JlZGVudGlhbHMtdG8tYS1wcml2YXRlLW9wYW0t cmVwb3NpdG9yeS8zNTIwLzEwPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmczYTU2YjFkIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnM2E1NmIx ZCI+UmljaGFyZCBEZWdlbm5lIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnM2E1NmIxZCI+DQo8cD5XZWxwLCA0IHllYXJzIGxhdGVyLCBJIGRl Y2lkZWQgdG8gZ2l2ZSB0aGF0IHdob2xlIHByaXZhdGUgT1BBTSByZXBvc2l0b3J5IHRoaW5nIGFu b3RoZXIgc2hvdCwgYW5kIEkgZW5kZWQgdXAgd2l0aCBzb21ldGhpbmcgSeKAmW0gcXVpdGUgcHJv dWQgb2YsIHdpdGggYSBwcml2YXRlIE9wYW0gcmVwb3NpdG9yeSwgYW5kIHByaXZhdGUgcGFja2Fn ZXMgdXBsb2FkZWQgdG8gR2l0TGFi4oCZcyBwYWNrYWdlIHJlZ2lzdHJpZXMhDQo8L3A+DQo8cD48 YSBocmVmPSJodHRwczovL2Jsb2cucmljaGFyZGRlZ2VubmUuZnIvMjAyMy8xMC8yMC9zZXR0aW5n LXVwLWEtcHJpdmF0ZS1vcGFtLXJlcG9zaXRvcnktb24tZ2l0bGFiLXN0ZXAtYnktc3RlcC8iPmh0 dHBzOi8vYmxvZy5yaWNoYXJkZGVnZW5uZS5mci8yMDIzLzEwLzIwL3NldHRpbmctdXAtYS1wcml2 YXRlLW9wYW0tcmVwb3NpdG9yeS1vbi1naXRsYWItc3RlcC1ieS1zdGVwLzwvYT4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTEiPk9DYW1sIG9uIFdpbmRvd3M6IHRoZSBsb25nIHBh dGhzIGlzc3VlPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMSI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwt b24td2luZG93cy10aGUtbG9uZy1wYXRocy1pc3N1ZS8xMzI4My8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9vY2FtbC1vbi13aW5kb3dzLXRoZS1sb25nLXBhdGhzLWlzc3VlLzEzMjgz LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmY4Y2I1 NCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzJmOGNiNTQiPk1hbmFzIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMmY4Y2I1NCI+ DQo8cD5Ob3QgdmVyeSBsb25nIGFnbywgSSBtYW5hZ2VkIHRvIHNvbHZlIHRoZSBsb25nIHBhdGhz IGlzc3VlIGZvciBPQ2FtbCBhbmQgSSB3YW50IHRvIHNoYXJlIGhvdy4NCjwvcD4NCjxwPldoaWxl IGJ1aWxkaW5nIGEgbGFyZ2UgcHJvamVjdCwgSSByYW4gaW50byB0aGUgcGF0aCBpc3N1ZXMgLSBE dW5lIHdvdWxkIGZhaWwgd2l0aCBlcnJvcnMgc2F5aW5nIGEgY2VydGFpbiBmaWxlIHByZXNlbnQg aW4gYSBsb25nIGZpbGUgd2FzIG5vdCBmb3VuZC4gU2hvcnRlbmluZyBsaWJyYXJpZXMgbmFtZXMg aGVscGVkLiBCdXQgd2hhdCB3YXMgcmVhbGx5IG5lZWRlZCB3YXMgbWFuaWZlc3RpbmcgT0NhbWwg dG9vbHMgc28gdGhhdCB0aGV5IGNhbg0KIHBlcmZvcm0gSS9PIG9uIGxvbmcgcGF0aHMgYXMgZGVz Y3JpYmVkIDxhIGhyZWY9Imh0dHBzOi8vbGVhcm4ubWljcm9zb2Z0LmNvbS9lbi11cy93aW5kb3dz L3dpbjMyL2ZpbGVpby9tYXhpbXVtLWZpbGUtcGF0aC1saW1pdGF0aW9uP3RhYnM9cmVnaXN0cnki Pg0KaGVyZSBvbiBNU0ROIGRvY3M8L2E+LiA8L3A+DQo8cD5HdWlkZWxpbmVzIHRoZXJlIGV4cGVj dCBiaW5hcnkgYXJ0aWZhY3RzIChkbGwgb3IgZXhlKSBoYXZlIHRvIGJlIG1hbmlmZXN0ZWQgd2l0 aCBzb21ldGhpbmcgbGlrZSB0aGlzDQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5l ciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXhtbCI+Jmx0Oz88c3BhbiBzdHlsZT0iY29sb3I6ICMw MDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+eG1sPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0ZjY3N2Y7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPnZlcnNpb249JnF1b3Q7MS4wJnF1b3Q7IGVu Y29kaW5nPSZxdW90O3V0Zi04JnF1b3Q7PC9zcGFuPj8mZ3Q7DQombHQ7PHNwYW4gc3R5bGU9ImNv bG9yOiAjYTc2MDFmOyI+YXBwbGljYXRpb248L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzU1 NzQwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij54bWxuczwvc3Bhbj49PHNwYW4gc3R5bGU9ImNvbG9y OiAjY2EzNDAwOyI+JnF1b3Q7dXJuOnNjaGVtYXMtbWljcm9zb2Z0LWNvbTphc20udjMmcXVvdDs8 L3NwYW4+Jmd0Ow0KICAgICZsdDs8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij53aW5kb3dz U2V0dGluZ3M8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICM1NTc0MDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+eG1sbnM8L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPndzMjwv c3Bhbj49PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7aHR0cDovL3NjaGVtYXMu bWljcm9zb2Z0LmNvbS9TTUkvMjAxNi9XaW5kb3dzU2V0dGluZ3MmcXVvdDs8L3NwYW4+Jmd0Ow0K ICAgICAgICAmbHQ7PHNwYW4gc3R5bGU9ImNvbG9yOiAjNTU3NDAwOyBmb250LXdlaWdodDogYm9s ZDsiPndzMjwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+bG9uZ1BhdGhBd2Fy ZTwvc3Bhbj4mZ3Q7dHJ1ZSZsdDsvPHNwYW4gc3R5bGU9ImNvbG9yOiAjNTU3NDAwOyBmb250LXdl aWdodDogYm9sZDsiPndzMjwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+bG9u Z1BhdGhBd2FyZTwvc3Bhbj4mZ3Q7DQogICAgJmx0Oy88c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYw MWY7Ij53aW5kb3dzU2V0dGluZ3M8L3NwYW4+Jmd0Ow0KJmx0Oy88c3BhbiBzdHlsZT0iY29sb3I6 ICNhNzYwMWY7Ij5hcHBsaWNhdGlvbjwvc3Bhbj4mZ3Q7DQo8L3ByZT4NCjwvZGl2Pg0KPHA+SWRl YWxseSwgdGhlIGFwcGxpY2F0aW9uIGJlaW5nIGJ1aWx0IGlzIGFsc28gbWFuaWZlc3RlZCBzby4g PC9wPg0KPHA+SSB1c2UgZXN5IGFzIG15IGRhaWx5IGRyaXZlciBmb3IgV2luZG93cyBkZXZlbG9w bWVudC4gSSBoYXZlIGFsd2F5cyBmb3VuZCB0aGUgd29ya2Zsb3cgb24gV2luZG93cyB3aXRoIGVz eSByZWFzb25hYmxlIGFuZCBuZXZlciBzdG9wcGVkIHVzaW5nIGl0IHNpbmNlIEkgZGlzY292ZXJl ZC4gT3ZlciB0aW1lLCBJIGhhdmUgdGFrZW4gdXAgbWFpbnRlbmFuY2Ugb2YgdGhlIHByb2plY3Qg dG9vLg0KPC9wPg0KPHA+T0NhbWwgb24gV2luZG93cyBpcyBwcmFjdGljYWwgb25seSB3aXRoIEN5 Z3dpbi4gTm90IGJlY2F1c2UgdGhlIHRvb2xzIG5lZWRzIGEgVW5peCBsaWtlIGVudmlyb25tZW50 IC0gdGhleSBoYXZlIGV2b2x2ZWQgc2lnbmlmaWNhbnRzIG92ZXIgdGhlIHllYXJzIHNpbmNlIEkg aGF2ZSBiZWVuIHVzaW5nIE9DYW1sIG9uIFdpbmRvd3MuIEN5Z3dpbiBpcyBjb252ZW5pZW50IGJl Y2F1c2Ugb2YgdGhlIGxpYnJhcmllcyBpbiB0aGUgZWNvc3lzdGVtIC0NCiBmb3IgaW5zdGFuY2Ug YWxsIHRoZSBuYXRpdmUgbGlicmFyaWVzIGZyb20gR05VIHByb2plY3QuIEdOVSBwcm9qZWN0cyBh cmUgZWFzaWx5IGJ1aWx0IGluc2lkZSBDeWd3aW4vTVNZUy9taW5ndyBidXQgbm90IHNvIG91dHNp ZGUuDQo8L3A+DQo8cD5JIHdhcyB3b3JyaWVkIHRoYXQgSeKAmWQgaGF2ZSB0byB3cml0ZSBzb21l IGdvcnkgaGFjayBpbiB0aGUgY29tcGlsZXIgdG8gbWFuaWZlc3QgZXZlcnkgYmluYXJ5IGFydGlm YWN0IC0gZHVuZSBoYWQgdG8gYmUgbWFuaWZlc3RlZCB0b28uIFRoZXJlIGFyZSBtYW55IHdheXMg dG8gZW1iZWQgdGhlIG1hbmlmZXN0IHdpdGggdG9vbHMNCjxjb2RlPndpbmRyZXM8L2NvZGU+IGV0 Yy4gQnV0IGZvcnR1bmF0ZWx5LCBJIGZvdW5kIHRoYXQgTWluZ3cgYWxyZWFkeSBlbWJlZHMgYWxs IGV4ZWN1dGFibGVzIHdpdGggYSBkZWZhdWx0IG9uZS4gSXQgY2FuIGJlIGZvdW5kIGhlcmUNCjxh IGhyZWY9Imh0dHBzOi8vY3lnd2luLmNvbS9wYWNrYWdlcy9zdW1tYXJ5L3dpbmRvd3MtZGVmYXVs dC1tYW5pZmVzdC5odG1sIzp+OnRleHQ9ZGVzY3JpcHRpb24lM0ElMjBUaGUlMjBEZWZhdWx0JTIw V2luZG93cyUyMGFwcGxpY2F0aW9uLHZlcnNpb24lMjBzdXBwb3J0ZWQlMjBieSUyMHRoaXMlMjBt YW5pZmVzdC4iPg0KYW1vbmcgdGhlIEN5Z3dpbiBwcm9qZWN0czwvYT4gPC9wPg0KPHA+SSBkZWNp ZGVkIHRvIGZvcmsgdGhlIHJlcG9zaXRvcnkgYW5kIHVzZSB0aGUgbWFuaWZlc3QgTVNETiBkb2Nz IHJlY29tbWVuZGVkLiBZb3UgY2FuIGZpbmQgaXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9NYW5hc0pheWFudGgvd2luZG93cy1kZWZhdWx0LW1hbmlmZXN0L3RyZWUvbWFzdGVyIj5oZXJl PC9hPiBUaGlzIGhlbHBlZCBtZSBmaXggbXkgcHJvamVjdCwgYnV0IEkgd2FudGVkIHRoaXMgZm9y IHRoZSByZXN0IG9mIHRoZSBjb21tdW5pdHkgdG9vLg0KPC9wPg0KPHA+RXN5IHVzZXMgYSB1dGls aXR5IGNhbGxlZCBlc3ktYmFzaCB3aGljaCBwYWNrYWdlcyB0aGUgQ3lnd2luIGVudmlyb25tZW50 IGZvciB0aGUgdXNlci4gV2UgZmluZCB0aGF0IHVzZXJzIGhhdmUgbW9zdGx5IHVuaWZvcm0gc2V0 dXBzIHRoaXMgd2F5LiBIZWxwcyB3aXRoIHJlcHJvZHVjaWJpbGl0eS4gSSBkZWNpZGVkIHRvDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vTWFuYXNKYXlhbnRoL2VzeS1iYXNoL2Jsb2IvZGV2 L2Rvd25sb2FkLWN5Z3dpbi1wYWNrYWdlcy5qcyNMMjAiPg0KdHdlYWsgZXN5LWJhc2ggdG8gcGFj a2FnZSBteSBmb3JrPC9hPiBvZiB0aGUgd2luZG93cy1kZWZhdWx0LW1hbmlmZXN0IGFsb25nIHdp dGggb3RoZXIgQ3lnd2luIHBhY2thZ2VzLiBUaGlzIHdheSBPQ2FtbCB1c2VycyBkb250IGhhdmUg dG8gd29ycnkgYWJvdXQgdGhlIGxvbmcgcGF0aHMgaXNzdWUgYW55bW9yZS4NCjwvcD4NCjxwPlRo aXMgaGFzIGJlZW4gYXZhaWxhYmxlIHNpbmNlIGVzeSAwLjcuMC4gSWYgeW914oCZZCBsaWtlIHRv IHRyeSB0aGUgbGF0ZXN0IGVzeSwgaXQgaXMgYXZhaWxhYmxlIG9uIE5QTSBhbmQgY2FuIGJlIGlu c3RhbGxlZCB3aXRoDQo8Y29kZT5ucG0gaSAtZyBlc3k8L2NvZGU+IDwvcD4NCjxwPknigJlkIGxv dmUgdG8gaGVhciB5b3VyIHRob3VnaHRzIG9uIHRoaXMgYXBwcm9hY2guIE1vcmUgdGhhbiBoYXBw eSB0byBjb250cmlidXRlIGEgc29sdXRpb24gbGlrZSB0aGlzIGZvciBvcGFtIHRvby4NCjwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEyIiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTIiPkEgUm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBs YXRmb3JtIC0gU2Vla2luZyBZb3VyIEZlZWRiYWNrPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC0xMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYS1yb2FkbWFwLWZvci10aGUtb2NhbWwtcGxhdGZvcm0tc2Vla2luZy15 b3VyLWZlZWRiYWNrLzEyMjM4LzY4Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLXJv YWRtYXAtZm9yLXRoZS1vY2FtbC1wbGF0Zm9ybS1zZWVraW5nLXlvdXItZmVlZGJhY2svMTIyMzgv Njg8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y5ZTVl ZjEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmOWU1ZWYxIj5UaGliYXV0IE1hdHRp byBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2Y5ZTVlZjEiPg0KPHA+SSB1cGRhdGVkIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v dGFyaWRlcy9vY2FtbC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFpbi9yb2FkbWFwLm1kIj4NCnJv YWRtYXA8L2E+IHRvIGluY29ycG9yYXRlIHRoZSBsYXRlc3QgZmVlZGJhY2suIFRoaXMgdXBkYXRl OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QWRkcyBhIHdvcmtmbG93IHRvIHN1cHBv cnQgRHVuZSBwbHVnaW5zICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGFyaWRlcy9vY2Ft bC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFpbi9yb2FkbWFwLm1kI3cxNS1wbHVnaW4tZXh0ZW5z aWJpbGl0eSI+VzE1PC9hPikNCjwvbGk+PGxpPkFkZHMgYSB3b3JrZmxvdyB0byBpbnRlZ3JhdGUg d2l0aCBvdGhlciBidWlsZCBzeXN0ZW1zICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGFy aWRlcy9vY2FtbC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFpbi9yb2FkbWFwLm1kI3cxNi1pbnRl Z3JhdGUtd2l0aC1vdGhlci1idWlsZC1zeXN0ZW1zIj5XMTY8L2E+KQ0KPC9saT48bGk+QWRkcyBh IHdvcmtmbG93IHRvIGNvbXBpbGUgdG8gV2ViQXNzZW1ibHkgZnJvbSBEdW5lICg8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vdGFyaWRlcy9vY2FtbC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFp bi9yb2FkbWFwLm1kI3cxNC1jb21waWxlLXRvLXdlYmFzc2VtYmx5Ij5XMTQ8L2E+KQ0KPC9saT48 bGk+QWRkcyBhIHdvcmtmbG93IHRvIGNvbXBpbGUgTWlyYWdlT1MgdW5pa2VybmVscyBmcm9tIER1 bmUgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90YXJpZGVzL29jYW1sLXBsYXRmb3JtLXJv YWRtYXAvYmxvYi9tYWluL3JvYWRtYXAubWQjdzEyLWNvbXBpbGUtdG8tbWlyYWdlb3MiPlcxMjwv YT4pDQo8L2xpPjxsaT5VcGRhdGVzIExpdGVyYXRlIFByb2dyYW1taW5nIHdvcmtmbG93IHRvIHVz ZSBvZG9jIGFuZCBtZW50aW9uIGludGVyYWN0aXZlIGNvZGUgYmxvY2tzICg8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vdGFyaWRlcy9vY2FtbC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFpbi9y b2FkbWFwLm1kI3cyNC1saXRlcmF0ZS1wcm9ncmFtbWluZyI+VzI0PC9hPikNCjwvbGk+PGxpPlVw ZGF0ZXMgR2VuZXJhdGUgRG9jdW1lbnRhdGlvbiB3b3JrZmxvdyB0byBsaXN0IGZlYXR1cmVzIHBs YW5uZWQgYXMgcGFydCBvZiB0aGUgb2RvYyByb2FkbWFwICg8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vdGFyaWRlcy9vY2FtbC1wbGF0Zm9ybS1yb2FkbWFwL2Jsb2IvbWFpbi9yb2FkbWFwLm1k I3cyNS1nZW5lcmF0ZS1kb2N1bWVudGF0aW9uIj5XMjU8L2E+KQ0KPC9saT48bGk+VXBkYXRlcyBQ YWNrYWdlIFB1YmxpY2F0aW9uIHRvIHJlbW92ZSBtZW50aW9uIHRoYXQgdXNlcnMgbmVlZCBub3Qg dG8gY29tbWl0IGFuIG9wYW0gZmlsZSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Rhcmlk ZXMvb2NhbWwtcGxhdGZvcm0tcm9hZG1hcC9ibG9iL21haW4vcm9hZG1hcC5tZCN3MjYtcGFja2Fn ZS1wdWJsaWNhdGlvbiI+VzI2PC9hPikNCjwvbGk+PC91bD4NCjxwPkEgYmlnIHRoYW5rIHlvdSB0 byBldmVyeW9uZSB3aG8gcGFydGljaXBhdGVkIGluIHRoZSBkaXNjdXNzaW9uISBCdWlsZGluZyBh IGNvbW11bml0eS1kcml2ZW4gcm9hZG1hcCBpcyBubyB0cml2aWFsIGV4ZXJjaXNlLCBidXQgd2l0 bmVzc2luZyBzbyBtYW55IHBlb3BsZSBiZWluZyBkcml2ZW4gdG8gc2hhcmUgY29uc3RydWN0aXZl IGZlZWRiYWNrLCB0aGVyZeKAmXMgbm8gZG91YnQgdGhhdCBpdOKAmXMgYWJzb2x1dGVseSB3b3J0 aCBpdC4NCjwvcD4NCjxwPk11Y2ggb2YgdGhlIGZlZWRiYWNrLCBib3RoIGhlcmUgYW5kIGluIG90 aGVyIERpc2N1c3MgdGhyZWFkcyAoZS5nLiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvdGhlLW9jYW1sLXBsYXRmb3JtLWEtdmVoZW1lbnQtZGlzc2VudC8xMzAwOCI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhlLW9jYW1sLXBsYXRmb3JtLWEtdmVoZW1lbnQtZGlz c2VudC8xMzAwODwvYT4pLCBwb2ludHMgb3V0IHRoZSByb2FkbWFw4oCZcyBwcm9ub3VuY2VkIER1 bmUtZm9jdXMuIEkgd2FudCB0byBiZSB2ZXJ5IGNsZWFyIHRoYXQgd2hpbGUgdGhlIGZvY3VzIG9m IHRoZSBjb21pbmcgeWVhcnMgaGlnaGxpZ2h0ZWQgaW4gdGhlIHJvYWRtYXAgaXMgaW5kZWVkIHRv IGNvbnNvbGlkYXRlIHRoZSBpbnRlZ3JhdGlvbg0KIG9mIHRoZSBQbGF0Zm9ybSB0b29scyB0byBj cmVhdGUgYSBjb2hlc2l2ZSBleHBlcmllbmNlIOKAkyBhIHRvcCByZXF1ZXN0IGluIHRoZSBPQ2Ft bCBzdXJ2ZXlzIOKAkyB0aGVyZeKAmXMgbm8gaW50ZW50aW9uIHRvIG1ha2UgRHVuZSB0aGUgc2lu Z3VsYXIgc29sdXRpb24gZm9yIE9DYW1sIHRvb2xpbmcuIFRoZSBPQ2FtbCBQbGF0Zm9ybSBpcyBh IGNvbGxlY3Rpb24gb2YgaW5kZXBlbmRlbnQgdG9vbHMgdGhhdCBjYW4gYmUgdXNlZCB3aXRob3V0 IER1bmUsIGFuZA0KIHRoaXMgd2lsbCByZW1haW4gdGhlIGNhc2UuIDwvcD4NCjxwPldl4oCZdmUg d29ya2VkIG9uIGZvcm1hbGlzaW5nIHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2Nz L3BsYXRmb3JtLXByaW5jaXBsZXMiPg0KR3VpZGluZyBQcmluY2lwbGVzPC9hPiBiZWZvcmUgc2hh cmluZyB0aGUgcm9hZG1hcC4gT25lIGtleSBwcmluY2lwbGUgd2XigJl2ZSBhc3NlcnRlZCBpcyB0 aGF0IHdoaWxlIFBsYXRmb3JtIHRvb2xzIG9wZXJhdGUgdW5kZXIgYSBzaW5nbGUgZnJvbnRlbmQg KHRoZSBlZGl0b3Igb3IgRHVuZSBhdCB0aGUgbW9tZW50KSwgdGhleSByZW1haW4gaW5kZXBlbmRl bnQuIEB4YXZpZXJsZXJveSByaWdodGx5IHN1Z2dlc3RlZCB0aGF0IHdlIGNvbW1pdCB0byB0aGlz DQogaW4gc3Ryb25nZXIgdGVybXMsIHNvIHdl4oCZdmUgdXBkYXRlZCB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1wcmluY2lwbGVzI3A1LXRvb2xzLWFyZS1pbmRl cGVuZGVudC15ZXQtdW5pZmllZCI+DQpyZWxldmFudCBQcmluY2lwbGU8L2E+IHRvIG1ha2UgdGhp cyBtb3JlIGV4cGxpY2l0LiA8L3A+DQo8cD5JbiBhZGRpdGlvbiB0byBjbGFyaWZ5aW5nIHRoZSBH dWlkaW5nIFByaW5jaXBsZXMsIHNlZWluZyB0aGF0IHRoZSBtYWpvcml0eSBvZiB0aGUgZmVlZGJh Y2sgd2UgcmVjZWl2ZWQgaXMgYXNraW5nIGZvciBiZXR0ZXIgc3VwcG9ydCBmb3Igbm9uLUR1bmUg dXNlcnMsIHR3byBvZiB0aGUgYWRkZWQgd29ya2Zsb3dzIGluIHRoaXMgbGFzdCB1cGRhdGUgKFcx NSBhbmQgVzE2KSBhaW0gYXQgYnJpbmdpbmcgYmV0dGVyIHN1cHBvcnQgZm9yIHRoaXJkLXBhcnR5 DQogKGkuZS4gbm9uLVBsYXRmb3JtKSB0b29scy4gPC9wPg0KPHA+U3BlY2lhbCB0aGFua3MgdG8g QGpiZWNrZm9yZCBmb3IgaW5pdGlhdGluZyBkaXNjdXNzaW9ucyBvbiA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9kaXNjdXNzaW9ucy84NzA3Ij4NCkR1bmUgcGx1Z2luczwv YT4hIDwvcD4NCjxwPkxldCB1cyBrbm93IHdoYXQgeW91IHRoaW5rIG9mIHRoZXNlIG5ldyB3b3Jr Zmxvd3MgYW5kIHRoZSBvdGhlciB1cGRhdGVzISBBcyB1c3VhbCwgbGV04oCZcyBnaXZlIGFuIGFk ZGl0aW9uYWwgMiB3ZWVrcyBmb3IgZmVlZGJhY2sgb24gdGhlIHJvYWRtYXAuIEJhcnJpbmcgc2ln bmlmaWNhbnQgY29uY2VybnMsIHdl4oCZbGwgdW5kZXJnbyBhIGZpbmFsIHJldmlzaW9uIGJhc2Vk IG9uIGFsbCB0aGUgZGlzY3Vzc2lvbnMgYmVmb3JlIGFkb3B0aW5nIHRoZQ0KIGZpcnN0IHZlcnNp b24uIDwvcD4NCjxwPlBTOiB0aGFuayB5b3UgQHNob25mZWRlciBmb3IgcG9pbnRpbmcgb3V0IHRo YXQgdGhlIGlzc3VlcyB3ZXJlIGRlYWN0aXZhdGVkIG9uIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL3RhcmlkZXMvb2NhbWwtcGxhdGZvcm0tcm9hZG1hcC9pc3N1ZXMiPnJlcG9zaXRv cnk8L2E+LiBJ4oCZdmUgYWN0aXZhdGVkIHRoZW0sIHNvIGRvbuKAmXQgaGVzaXRhdGUgdG8gb3Bl biBpc3N1ZXMgdGhlcmUgbm93Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMyI+ QWRkaW5nIER5bmFtaWMgQXJyYXlzIC8gVmVjdG9ycyB0byBTdGRMaWI8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEzIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hZGRpbmctZHluYW1pYy1hcnJheXMtdmVjdG9ycy10 by1zdGRsaWIvNDY5Ny80OCI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWRkaW5nLWR5 bmFtaWMtYXJyYXlzLXZlY3RvcnMtdG8tc3RkbGliLzQ2OTcvNDg8L2E+IDwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjFiMzkzMSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzYxYjM5MzEiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIGdhc2NoZSBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzYxYjM5 MzEiPg0KPHA+SGkgZXZlcnlvbmUsIDwvcD4NCjxwPkEgc2hvcnQgbm90ZTogd2UgZXZlbnR1YWxs eSBtYW5hZ2UgdG8gYnVpbGQgY29uc2Vuc3VzIG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9wdWxsLzExODgyIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9wdWxsLzExODgyPC9hPiBhbmQgSSBtZXJnZWQgaXQgeWVzdGVyZGF5LCBzbyB0aGVyZSB3aWxs IGJlIGENCjxjb2RlPkR5bmFycmF5PC9jb2RlPiBtb2R1bGUgaW4gdGhlIHN0YW5kYXJkIGxpYnJh cnkgaW4gT0NhbWwgNS4yLiBUaGFua3MgQEJhc3RvdVA0MTEgYW5kIEBjLWN1YmUgZm9yIHRoZWly IGVmZm9ydHMgYnJpbmdpbmcgdXMgdG8gdGhpcyBwb2ludCwgYW5kIHRvIHRoZSBtYW55IHJldmll d2VycyBvZiB0aGUgbGF0ZXN0IGl0ZXJhdGlvbiBvZiB0aGUgUFIgKGluIHBhcnRpY3VsYXIgQDMx NGV0ZXIsIEBjLWN1YmUsIEBjbGVmLW1lbiwgQGRhbWllbmRvbGlnZXosDQogQGRidWVuemxpLCBA Z2FkbW0sIEBPY3RhY2hyb24gYW5kIEB3aWt0b3IpLiA8L3A+DQo8cD5UaGUgaW1wbGVtZW50YXRp b24gdXNlcyBhbiBpbmRpcmVjdGlvbiB0byBnZXQgYSB0eXBlLXNhZmUg4oCcZW1wdHnigJ0gdmFs dWUgdG8gdXNlIGluIHVudXNlZCBlbGVtZW50cyBvZiB0aGUgc3VwcG9ydCBhcnJheS4gSG9wZWZ1 bGx5IHdlIGNhbiBpbXByb3ZlIG9uIHRoYXQgd2l0aCBhIHNhZmUgbWFnaWNhbCBpbXBsZW1lbnRh dGlvbiBpbiB0aGUgc2hvcnQgZnV0dXJlIOKAkyBidXQgSSB0aGluayB0aGF0IHRoZSBwZXJmb3Jt YW5jZSBpcyBnb29kIGVub3VnaA0KIGFscmVhZHkuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTE0IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iMTQiPnZkb20gMC4zOiBmdW5jdGlvbmFsIFVJIGFwcGxpY2F0aW9ucyBub3cgd2l0aCBj dXN0b20gZXZlbnQgaGFuZGxlcnM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTE0Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tdmRvbS0wLTMtZnVuY3Rpb25hbC11aS1hcHBsaWNhdGlvbnMtbm93LXdpdGgtY3Vz dG9tLWV2ZW50LWhhbmRsZXJzLzEzMjk4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi12ZG9tLTAtMy1mdW5jdGlvbmFsLXVpLWFwcGxpY2F0aW9ucy1ub3ctd2l0aC1jdXN0b20t ZXZlbnQtaGFuZGxlcnMvMTMyOTgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnOTM1NTA4OCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzkz NTUwODgiPkF1csOpbGllbiBTYXVlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnOTM1NTA4OCI+DQo8cD5XZSBhcmUgdGhyaWxsZWQgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb2YgdGhlIG5ldyB2MC4zIHJlbGVhc2Ugb2YgPGNvZGU+dmRvbTwv Y29kZT4sIHByZXZpb3VzbHkgbmFtZWQNCjxjb2RlPm9jYW1sLXZkb208L2NvZGU+ISA8L3A+DQo8 cD5UaGUgbGlicmFyeSBpbXBsZW1lbnRzIHRoZSBmdW5jdGlvbmFsIEVsbSBhcmNoaXRlY3R1cmUu IENvbWJpbmVkIHdpdGggdGhlIHBvd2VyIG9mIE9DYW1sLCBpdCBtYWtlcyB0aGUgZGV2ZWxvcG1l bnQgb2YgVUkgYXBwbGljYXRpb25zIGVhc3kgYW5kIHJlbGlhYmxlLCBhbmQgdGhhdCBpcyB3aHkg d2UgaGF2ZSBiZWVuIHVzaW5nIGl0IGludGVybmFsbHkgc2luY2UgMjAxNi4NCjwvcD4NCjxwPkEg aGlnaGxpZ2h0IG9mIHRoaXMgbmV3IHZlcnNpb24gaXMgdGhlIGludHJvZHVjdGlvbiBvZiBmdWxs eSBjdXN0b21pemFibGUgZXZlbnQgaGFuZGxlcnMsIHVzaW5nIEVsbS1zdHlsZSBkZWNvZGVycy4g VGhpcyBlbmhhbmNlbWVudCBzaW1wbGlmaWVzIHRoZSBtYW5hZ2VtZW50IG9mIGludHJpY2F0ZSBi cm93c2VyIGV2ZW50cywgc3VjaCBhcyByZXRyaWV2aW5nIGRyYWctYW5kLWRyb3BwZWQgZmlsZXMu DQo8L3A+DQo8cD5SZWFkIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmxleGlmaS5jb20vYmxvZy9vY2Ft bC9kZWNvZGVycy8iPm91ciBibG9nIHBvc3Q8L2E+IGZvciBtb3JlIGRldGFpbHMgYWJvdXQgdGhp cyBuZXcgZmVhdHVyZSENCjwvcD4NCjxwPkdpdEh1YiBob21lcGFnZTogPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL0xleGlGaS9vY2FtbC12ZG9tIj5odHRwczovL2dpdGh1Yi5jb20vTGV4aUZp L29jYW1sLXZkb208L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdlMTViYTQ2IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i b3JnZTE1YmE0NiI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtb3JnZTE1YmE0NiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBj YW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5k IG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBh IGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRo ZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklm IHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkg c3Vic2NyaWJlIHRvIHRoZSA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2lu Zm8vY2FtbC1saXN0Ij4NCmNhbWwtbGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5h bWUiIGlkPSJvcmc5Mjc5MGJjIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 21 Nov 2023 07:47:40 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 21 Nov 2023 07:47:40 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 21 Nov 2023 07:47:40 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AL7lgN9029268 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 21 Nov 2023 07:47:42 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3AL7lWTk029253 for ; Tue, 21 Nov 2023 07:47:32 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Nov 2023 08:47:31 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 4628CE0CCE; Tue, 21 Nov 2023 08:47:31 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CBC9FE004E for ; Tue, 21 Nov 2023 08:47:22 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Nov 2023 08:47:21 +0100 Received: from TM.local (248.113.124.80.rev.sfr.net [80.124.113.248]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 10D4D56069E; Tue, 21 Nov 2023 08:47:12 +0100 (CET) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaHE8BY9H15T4vHEm1KZb7SVG9IQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 21 Nov 2023 07:47:02 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: adb8cf3a-78fc-40ce-d045-08dbea662376 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.04,215,1695679200"; d="scan'208,217";a="137520919" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499834, queueID=6FE25564689 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <74E1D5BCC3353B468A89A49DF3BF4102@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMS0yMSBUdWUgMDg6NDUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTEuMTQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMS4yOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE5vdmVtYmVyIDE0IHRvIDIxLCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5vcGFtIDIuMi4wfmFscGhhMzwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPm9jYW1sIGFuZCBwb3ZyYXk8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiMzIj50aGUgYmVnaW5uaW5nIG9mIGEgcGxhdGZvcm1lcjwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzQiPm9jYW1sIHNobXVwczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPkRvY2ZkOiBU VUkgZnV6enkgZG9jdW1lbnQgZmluZGVyIDEuOS4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+ VGV6dCA0LjAuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPk9DYW1sIDUuMS4xIDogaW5jb21p bmcgYnJlYWtpbmcgY2hhbmdlIGluIHRoZSA8Y29kZT5NYXJzaGFsPC9jb2RlPiBtb2R1bGU8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSIjOCI+VGhlIE9DYW1sIFBsYXRmb3JtIFJvYWRtYXAgaXMgQWRv cHRlZDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPlBweGxpYiBkZXYgbWVldGluZ3M8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiMxMCI+TWlyYWdlVlBOIChhbiBPcGVuVlBO4oSiIGltcGxlbWVudGF0 aW9uKSBpcyByZXN1cnJlY3RlZDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5PdGhlciBPQ2Ft bCBOZXdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnNjhhMWNlZSI+T2xkIENXTjwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5vcGFtIDIuMi4wfmFscGhhMzwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0yLTAtYWxwaGEzLzEzNDMx LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3BhbS0yLTItMC1hbHBoYTMvMTM0 MzEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGFk YTcxMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRhZGE3MTIiPkthdGUgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0YWRhNzEy Ij4NCjxwPldlIGFyZSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4yLjAtYWxwaGEzIj4N Cm9wYW0gMi4yLjB+YWxwaGEzPC9hPi4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmcxYTkzOTI0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMWE5Mzky NCI+V2hhdOKAmXMgbmV3IGluIHRoaXMgYWxwaGE/PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmcxYTkzOTI0Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5v cGFtIGZpbGVzIG5vdyBzdXBwb3J0IGEgbmV3IDxjb2RlPngtZW52LXBhdGgtcmV3cml0ZTwvY29k ZT4gZmllbGQgd2hpY2ggc3BlY2lmaWVzIHJld3JpdGluZyBydWxlcyBmb3IgdGhlIGVudmlyb25t ZW50IHZhcmlhYmxlIHVwZGF0ZXMgZGVmaW5lZCBpbiB0aGUNCjxjb2RlPnNldGVudjwvY29kZT4g YW5kIDxjb2RlPmJ1aWxkLWVudjwvY29kZT4gZmllbGRzLiBUaGlzIGlzIHJlcXVpcmVkIGZvciB0 aGUgV2luZG93cyBzdXBwb3J0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBzZWUgdGhlDQo8YSBocmVm PSJodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTItMC1hbHBoYTMvIj5ibG9nIHBv c3Q8L2E+LiA8L2xpPjxsaT48Y29kZT4vdG1wPC9jb2RlPiBpcyBub3cgd3JpdGFibGUgYWdhaW4g aW4gdGhlIHNhbmRib3gsIHJlc3RvcmluZyBQT1NJWCBjb21wbGlhbmNlLiBTaW5jZSBvcGFtIDIu MC45IG9ubHkNCjxjb2RlPiRUTVBESVI8L2NvZGU+IHdhcyB3cml0YWJsZSA8L2xpPjxsaT48Y29k ZT5vcGFtIHRyZWUgcGFja2FnZS52ZXJzaW9uPC9jb2RlPiBpcyBub3cgc3VwcG9ydGVkLCBkaXNw bGF5aW5nIHRoZSBkZXBlbmRlbmN5IHRyZWUgb2YgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGEgcGFj a2FnZQ0KPC9saT48bGk+PGNvZGU+b3BhbSB0cmVlIC0tcmVjdXJzZTwvY29kZT4gYW5kIDxjb2Rl Pi0tc3VicGF0aDwvY29kZT4gYXJlIG5vdyBzdXBwb3J0ZWQgZm9yIGRpcmVjdG9yeSBhcmd1bWVu dHMNCjwvbGk+PGxpPmEgbmV3IDxjb2RlPm9wYW0gYWRtaW4gYWRkLWV4dHJhZmlsZXM8L2NvZGU+ IGNvbW1hbmQgaGFzIGJlZW4gYWRkZWQgdG8gYWRkL2NoZWNrL3VwZGF0ZSB0aGUNCjxjb2RlPmV4 dHJhLWZpbGVzOjwvY29kZT4gZmllbGQgYWNjb3JkaW5nIHRvIHRoZSBmaWxlcyBwcmVzZW50IGlu IHRoZSA8Y29kZT5maWxlcy88L2NvZGU+IGRpcmVjdG9yeQ0KPC9saT48bGk+YSBuZXcgPGNvZGU+ b3BhbSBsaW50IC1XIEAxLi45PC9jb2RlPiBhcmd1bWVudCBoYXMgYmVlbiBhZGRlZCB0byBhbGxv dyBtYXJraW5nIGEgc2V0IG9mIHdhcm5pbmdzIGFzIGVycm9ycyBpZiB0aGV5IG9jY3VyDQo8L2xp PjxsaT5SZWxlYXNlczogcHJlLWJ1aWx0IGJpbmFyaWVzIG5vdyBpbmNsdWRlIHRoZSA8Y29kZT5M aW51eC9wcGM2NGxlPC9jb2RlPiBhbmQgPGNvZGU+DQpMaW51eC9zMzkweDwvY29kZT4gcGxhdGZv cm1zIDwvbGk+PGxpPmFzIHdlbGwgYXMgYSBidW5jaCBvZiBidWcgZml4ZXMgYW5kIGltcHJvdmVt ZW50cyA8L2xpPjwvdWw+DQo8cD5Zb3XigJlsbCBmaW5kIHRoZXNlIGZlYXR1cmVzIHByZXNlbnRl ZCBpbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAt YWxwaGEzLyI+DQpibG9nIHBvc3Q8L2E+LCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlvdSBj YW4gdGFrZSBhIGxvb2sgYXQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v cGFtL3JlbGVhc2VzL3RhZy8yLjIuMC1hbHBoYTMiPg0KcmVsZWFzZSBub3RlPC9hPiBvciB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vYmxvYi8yLjIuMC1hbHBoYTMv Q0hBTkdFUyI+DQpjaGFuZ2Vsb2c8L2E+LiA8L3A+DQo8cD5XZSBlbmNvdXJhZ2UgeW91IHRvIHRy eSBvdXQgdGhpcyBhbHBoYSByZWxlYXNlLCBpbnN0cnVjdGlvbnMgYXJlIGRldGFpbGVkIGluIHRo ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAtYWxwaGEz Ij5ibG9nIHBvc3Q8L2E+LCBpbiBwYXJ0aWN1bGFyDQo8YSBocmVmPSJodHRwczovL29wYW0ub2Nh bWwub3JnL2Jsb2cvb3BhbS0yLTItMC1hbHBoYTMvI0hvdy10by1UZXN0LW9wYW0tb24tV2luZG93 cyI+DQpmb3IgV2luZG93czwvYT4gd2hlcmUgd2Ugbm93IHByb3ZpZGUgYW4gPGI+PGI+ZXhwZXJp bWVudGFsPC9iPjwvYj4gcHJlLWJ1aWx0IGJpbmFyeS4NCjwvcD4NCjxwPk9uIFVuaXgtbGlrZSBz eXN0ZW1zIHRob3VnaCwgdG8gdXBncmFkZSwgc2ltcGx5IHJ1bjogPC9wPg0KPGRpdiBjbGFzcz0i b3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+YmFzaCAtYyA8 c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtzaCAmbHQ7KDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6ICNjYTM0MDA7Ij5jdXJsPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2Nh MzQwMDsiPiAtZnNTTDwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPmh0dHBz Oi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9pbnN0 YWxsLnNoKSAtLXZlcnNpb248L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4y LjIuMH5hbHBoYTMmcXVvdDs8L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+SGFwcHkgaGFja2lu ZywgPGI+Jmx0OyZndDsgJmx0OyZndDsgVGhlIG9wYW0gdGVhbSAmbHQ7Jmd0OyAmbHQ7Jmd0Ozwv Yj4gOmNhbWVsOiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5vY2Ft bCBhbmQgcG92cmF5PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0y Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t b2NhbWwtYW5kLXBvdnJheS8xMzQzNi8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LW9jYW1sLWFuZC1wb3ZyYXkvMTM0MzYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnMmE2NTZhOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzJhNjU2YTkiPkZsb3JlbnQgTW9ubmllciBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzJhNjU2YTkiPg0KPHA+Tm90IHNvbWV0aGluZyBzZXJp b3VzLCBzb21ldGhpbmcgZm9yIHRoZSBob2JiaWVzLCBoZXJlIGlzIGEgbWVzc2FnZSB0byBhbm5v dW5jZSBiaW5kaW5ncyBmb3IgUG92UmF5DQo8YSBocmVmPSJodHRwczovL3BvdnJheS5vcmciPmh0 dHBzOi8vcG92cmF5Lm9yZzwvYT4gPC9wPg0KPHA+VGhpcyBwcm9qZWN0IHN0YXJ0ZWQgYXMgYW4g ZWFybHkgZGFmdCBpbiAyMDA5OiA8YSBocmVmPSJodHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9v Y2FtbC9wb3ZyYXkvcG92LWJpbmQudGd6Ij4NCmh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL29j YW1sL3BvdnJheS9wb3YtYmluZC50Z3o8L2E+IGFuZCBtb3JlIHJlY2VudGx5IEkgY29udGludWVk IHRoaXMgcHJvamVjdDoNCjxhIGhyZWY9Imh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL29jYW1s L3BvdnJheTIvIj5odHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9vY2FtbC9wb3ZyYXkyLzwvYT4N CjwvcD4NCjxwPlRoZSBsYXN0IHZlcnNpb24gaXM6IHBvdi1iaW5kLTAuMTAgPC9wPg0KPHA+SGVy ZSBhcmUgZXhhbXBsZXMgb2YgdGhpbmdzIHlvdSBjYW4gZG8gd2l0aCBpdCAod2l0aCBzb3VyY2Vz IHVuZGVyIHRoZSBpbWFnZXMpOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhy ZWY9Imh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL29jYW1sL3BvdnJheTIvZXhhbXBsZXMvMC4w Ny92aWV3cy5odG1sIj5odHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9vY2FtbC9wb3ZyYXkyL2V4 YW1wbGVzLzAuMDcvdmlld3MuaHRtbDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9kZWNh cG9kZTMxNC5mcmVlLmZyL29jYW1sL3BvdnJheTIvZXhhbXBsZXMvMC4wOC8iPmh0dHA6Ly9kZWNh cG9kZTMxNC5mcmVlLmZyL29jYW1sL3BvdnJheTIvZXhhbXBsZXMvMC4wOC88L2E+DQo8L2xpPjxs aT48YSBocmVmPSJodHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9vY2FtbC9wb3ZyYXkyL2V4YW1w bGVzLzAuMDkvIj5odHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9vY2FtbC9wb3ZyYXkyL2V4YW1w bGVzLzAuMDkvPC9hPg0KPC9saT48L3VsPg0KPHA+SGVyZSBpcyB0aGUgYXBpLWRvYyBvZiB2ZXJz aW9uIDAuMTA6IDxhIGhyZWY9Imh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL29jYW1sL3BvdnJh eTIvZG9jcy8wLjEwL1BvdnJheS5odG1sIj4NCmh0dHA6Ly9kZWNhcG9kZTMxNC5mcmVlLmZyL29j YW1sL3BvdnJheTIvZG9jcy8wLjEwL1BvdnJheS5odG1sPC9hPiA8L3A+DQo8cD5UaGlzIGlzIG5v dCBhIGJpbmRpbmdzIHRvIGEgQyBsaWIsIGl04oCZcyBhIOKAnHByaW50ZiB3cmFwcGVy4oCdLCBp dCBjcmVhdGVzIC5wb3YgZmlsZXMgdGhhdCB5b3UgY2FuIHByb3ZpZGUgdG8gcG92cmF5IG9uIHRo ZSBjb21tYW5kIGxpbmUuDQo8L3A+DQo8cD4zIGFwaSBhcmUgcHJvdmlkZWQ6IGEgc2ltcGxlIG9u ZSB0aGF0IHJldHVybnMgc3RyaW5ncywgZnVuY3Rpb25zIHN0YXJ0IHdpdGgg4oCcZ2V0XyrigJ0s IGFub3RoZXIgb25lIHRoYXQgYWNjdW11bWF0ZSB0byBhIOKAnHNjZW5l4oCdIHR5cGUgdGhhdCB5 b3UgY3JlYXRlIGF0IHRoZSBiZWdpbmluZyB3aXRoIOKAnG5ld19zY2VuZeKAnSwgYW5kIHRoZSB0 aGlyZCBvbmUgaXMgbW9yZSBkZXNjcmlwdGl2ZSB3aXRoIHRoZSB0eXBlIOKAnHNjZW5lX2Rlc2Pi gJ0gd2hpY2ggY2FuDQogYmUgdXNlZnVsbCBpZiB5b3Ugd2FudCB0byBMaXN0Lm1hcCBzb21ldGhp bmcgKHNvbWUgb3RoZXIgaW5wdXQgdGhhdCB5b3Ugd2FudCB0byByZXByZXNlbnQgZ3JhcGhpY2Fs bHkpLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPnRoZSBiZWdpbm5pbmcgb2Yg YSBwbGF0Zm9ybWVyPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0z Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t dGhlLWJlZ2lubmluZy1vZi1hLXBsYXRmb3JtZXIvMTM0MzgvMSI+DQpodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLXRoZS1iZWdpbm5pbmctb2YtYS1wbGF0Zm9ybWVyLzEzNDM4LzE8L2E+ IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGJiZTIzNiIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRiYmUyMzYiPkZsb3JlbnQgTW9ubmllciBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzRiYmUy MzYiPg0KPHA+SGVyZSBpcyB0aGUgYmVnaW5uaW5nIG9mIGEgcGxhdGZvcm1lciBnYW1lIHRoYXQg SSBtYWRlIGZvciBteSAzIHllYXJzIG9sZCBzb246DQo8YSBocmVmPSJodHRwOi8vZGVjYXBvZGUz MTQuZnJlZS5mci9hbnQvcGxhdGZvcm03LjMvcGxhdGZvcm0uaHRtbCI+aHR0cDovL2RlY2Fwb2Rl MzE0LmZyZWUuZnIvYW50L3BsYXRmb3JtNy4zL3BsYXRmb3JtLmh0bWw8L2E+DQo8L3A+DQo8cD5J ZiB0aGUgYXZhdGFyIGZhbGxzIGludG8gdGhlIHdhdGVyIGl0IGNoYW5nZXMgaXRzIGNvbG9yLCBJ IG1hZGUgdGhpcyBiZWNhdXNlIGl0IHdhcyBlYXN5IHRvIGRvIGFuZCBpdCBtYWRlIGxhdWdoIG15 IHNvbi4NCjwvcD4NCjxwPk9uIG15IGNvbXB1dGVycyBNYXJpT0NhbWwgaXMgc2xvdywgc28gSSB3 YXMgaGFwcHkgdG8gc2VlIHRoYXQgbXkgdmVyc2lvbiBpcyBub3Qgc2xvdywgZXZlbiB3aXRoIGEg YmlnZ2VyIGNhbnZhcyBzaXplLiBJdOKAmXMgbm90IHNsb3cgZXZlbiBvbiBhIG1vZGVzdCBsYXB0 b3AuDQo8L3A+DQo8cD5JIGRpZG7igJl0IGZvdW5kIHRoZSBhbGdvcnl0aG0gYnkgbXlzZWxmLCBJ IGZvdW5kIGl0IGluIGFuIGFydGljbGUgYnV0IEkgZGlkbuKAmXQga2VwdCB0aGUgbGluay4gSSBz aG91bGQgaGF2ZSBrZXB0IGl0LCBzbyB0aGF0IEkgY291bGQgaGF2ZSBjaXRlIGl0IGluIHRoZSBz b3VyY2UgY29kZS4NCjwvcD4NCjxwPlRoaXMgYWxnb3JpdGhtIGlzIHZlcnkgc2ltcGxlLCBpdCBz aW1wbGlmaWVzIHRoZSBwcm9jZXNzLCB3aXRoIDIgbG9vcHMsIG9uZSBmb3IgdGhlIFkgYXhpcywg YW5kIGFub3RoZXIgb25lIGZvciB0aGUgWCBheGlzLCBzbyB0aGUgbW92ZSBvZiB0aGUgYXZhdGFy IGlzIG5vdCBhIHJlYWwgZGlhZ29uYWwsIGJ1dCBpdOKAmXMgbm90IHZpc2libGUgd2hlbiB3ZSBw bGF5Lg0KPC9wPg0KPHA+QWxzbyBpdCB1c2VzIGludCBjYWxjdWxhdGlvbnMsIHNvIHRoYXQgaXQg bWF0Y2hlcyB0aGUgcGl4ZWwgb2YgdGhlIHNjcmVlbiwgYW5kIHRoZSBwaXhlbCBvZiB0aGUgcGxh dGZvcm0gdGhhdCBpdCBjb2xsaWRlcy4NCjwvcD4NCjxwPkkgZG9u4oCZdCBrbm93IGhvdyBNYXJp T0NhbWzigJlzIHBoeXNpY3Mgd29ya3MsIEkgdHJpZWQgdG8gcmVhZCB0aGUgc291cmNlIGNvZGUg dG8gbG9jYXRlIHRoZSBwaHlzaWNzLCBidXQgSSBoYXZlbuKAmXQgYmVlbiBhYmxlIHRvIGZpbmQg aXQuDQo8L3A+DQo8cD5UaGVyZSBpcyBjdXJlbnRseSBvbmx5IG9uZSBzY3JlZW4gaW4gdGhlIGxl dmVsLiBJIHdvdWxkIHRha2UgYW55IGFkdmljZSBhYm91dCBob3cgdG8gbWFrZSBhIGxldmVsIHRo YXQgaXMgbGFyZ2VyIHRoYW4gb25lIHNjcmVlbiwgd2hpY2ggYWxnb3JpdGhtIHRvIHVzZSB0byBj aGVjayBjb2xsaXNpb25zIHdpdGggb25seSB0aGUgbmVhcmVzdCBibG9ja3MuDQo8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+b2NhbWwgc2htdXBzPC9oMj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtc2htdXBzLzEzNDM5LzEiPmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtc2htdXBzLzEzNDM5LzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2EzODU2MjkiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdhMzg1NjI5Ij5GbG9yZW50IE1vbm5pZXIgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhMzg1NjI5Ij4NCjxwPkkg d291bGQgbGlrZSB0byBhbm5vdW5jZSB0aGUgbGFzdCB2ZXJzaW9ucyBvZiBteSBzaG11cChzKSAo bG9vayBsaWtlIHNldmVyYWwgc2htdXBzIGJ1dCBpdOKAmXMgb25seSBza2lucyB3aXRoIGRpZmZl cmVudCBncmFwaGljcyk6DQo8YSBocmVmPSJodHRwOi8vZGVjYXBvZGUzMTQuZnJlZS5mci9nYW1l cy9zaG11cHMuaHRtbCI+aHR0cDovL2RlY2Fwb2RlMzE0LmZyZWUuZnIvZ2FtZXMvc2htdXBzLmh0 bWw8L2E+IHRoZSBzY3JvbGxpbmcgaW4gc2htdXBfcHgxMSBzaG91bGQgYmUgaW1wcm92ZWQsIHRo ZXJlIGFyZSAyIHNjcmVlbnMgb25lIG9uIHRvcCBvZiBlYWNob3RoZXIgZm9yIHRoZSBzY3JvbGxp bmcgaW5zdGVhZCBvZiBnZW5lcmF0aW5nIG9ubHkgb25lIG5ldyBuZWVkZWQgbGluZQ0KIGF0IHRo ZSB0aW1lIChub3Qgb25lIGVudGlyZSBzZWNvbmQgc2NyZWVuKS4gSSBhbHNvIGp1c3QgZml4ZWQg YSBidWcgaW4gdGhlIGFkamFjZW5jeSBtYXAgb2Ygc2htdXBfcHgxMSB0b2RheS4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5Eb2NmZDogVFVJIGZ1enp5IGRvY3VtZW50IGZpbmRl ciAxLjkuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRvY2Zk LXR1aS1mdXp6eS1kb2N1bWVudC1maW5kZXItMS05LTAvMTM0NDIvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWRvY2ZkLXR1aS1mdXp6eS1kb2N1bWVudC1maW5kZXItMS05LTAv MTM0NDIvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn Nzg1Y2ZkOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc4NWNmZDkiPkRhcnJlbiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc4 NWNmZDkiPg0KPHA+SeKAmW0gaGFwcHkgdG8gc2hhcmUgRG9jZmQgMS45LjAsIHdoaWNoIGFsbG93 cyB5b3UgdG8gZmluZCBhbmQgc2VhcmNoIHRocm91Z2ggdGV4dCBmaWxlcyBhbmQgUERGcyBxdWlj a2x5Lg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9kYXJyZW5sZGwvZG9jZmQiPlJlcG88L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9kYXJyZW5sZGwvZG9jZmQvcmVsZWFzZXMvdGFnLzEuOS4wIj5TdGF0aWNh bGx5IGxpbmtlZCBiaW5hcnk8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2ZjMTQ0NDUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdm YzE0NDQ1Ij5EZW1vczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnZmMxNDQ0NSI+DQo8cD5OYXZpZ2F0aW5nIHJlcG86IDwvcD4NCjxkaXYgaWQ9Im9yZzg1ZjQ5 ODkiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJz ZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzkvOTgxYzdhMDYx YTdiYmViNGYyNGM3ZWI3ZTdkYjU5NWE1ZWFkYmFlMy5naWYiIGFsdD0iOTgxYzdhMDYxYTdiYmVi NGYyNGM3ZWI3ZTdkYjU5NWE1ZWFkYmFlMy5naWYiPg0KPC9wPg0KPC9kaXY+DQo8cD5OYXZpZ2F0 aW5nIOKAnE9DYW1sIFByb2dyYW1taW5nOiBDb3JyZWN0ICYjNDM7IEVmZmljaWVudCAmIzQzOyBC ZWF1dGlmdWzigJ0gYm9vayBQREYgYW5kIG9wZW5pbmcgaXQgdG8gdGhlIGNsb3Nlc3QgbG9jYXRp b24gdG8gdGhlIHNlbGVjdGVkIHNlYXJjaCByZXN1bHQgdmlhIFBERiB2aWV3ZXIgaW50ZWdyYXRp b246DQo8L3A+DQo8ZGl2IGlkPSJvcmcyOGY3YjY3IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcg c3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9v Y2FtbC9vcHRpbWl6ZWQvMlgvYS9hYjRiN2ZlNWVkNmZmNjViOTM5NjcyY2Y4ZmI4NDM5MzM0ZmNh OTA4XzJfMTM4MHg3NTIuanBlZyIgYWx0PSJhYjRiN2ZlNWVkNmZmNjViOTM5NjcyY2Y4ZmI4NDM5 MzM0ZmNhOTA4XzJfMTM4MHg3NTIuanBlZyI+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2ODE1ZGJjIiBjbGFzcz0ib3V0bGluZS00 Ij4NCjxoNCBpZD0ib3JnNjgxNWRiYyI+RmVhdHVyZXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzY4MTVkYmMiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp Pk11bHRpdGhyZWFkZWQgaW5kZXhpbmcgYW5kIHNlYXJjaGluZyA8L2xpPjxsaT5NdWx0aWxpbmUg ZnV6enkgc2VhcmNoIG9mIG11bHRpcGxlIGZpbGVzIG9yIGEgc2luZ2xlIGZpbGUgPC9saT48bGk+ U3dhcCBiZXR3ZWVuIG11bHRpLWZpbGUgdmlldyBhbmQgc2luZ2xlIGZpbGUgdmlldyBvbiB0aGUg Zmx5IDwvbGk+PGxpPkNvbnRlbnQgdmlldyBwYW5lIHRoYXQgc2hvd3MgdGhlIHNuaXBwZXQgc3Vy cm91bmRpbmcgdGhlIHNlYXJjaCByZXN1bHQgc2VsZWN0ZWQNCjwvbGk+PGxpPlRleHQgZWRpdG9y IGFuZCBQREYgdmlld2VyIGludGVncmF0aW9uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiY2JlODM3IiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnYmNiZTgzNyI+TWFqb3IgY2hhbmdlcyBzaW5jZSAwLjIuNjwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYmNiZTgzNyI+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+UERGIHN1cHBvcnQgYW5kIFBERiB2aWV3ZXIgaW50ZWdyYXRpb24gPC9s aT48bGk+QmV0dGVyIHRleHQgZWRpdG9yIGludGVncmF0aW9uIChvcGVucyB0byBsaW5lIGNvbnRh aW5pbmcgc3RhcnQgb2Ygc2VhcmNoIHJlc3VsdCBpbiBmaWxlKQ0KPC9saT48bGk+T24tZGlzayBj YWNoZSBvZiBpbmRleCA8L2xpPjxsaT5Qcm9wZXIgd29yZCB3cmFwcGluZyBpbiBUVUkgPC9saT48 bGk+R2VuZXJhbCBvcHRpbWl6YXRpb25zIHRvIGFsbG93IHNlYXJjaGluZyByZWxhdGl2ZWx5IGxh cmdlIGRvY3VtZW50cyA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI2Ij5UZXp0IDQuMC4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tdGV6dC00LTAtMC8xMzQ1Ni8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRl enQtNC0wLTAvMTM0NTYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnNGJmNTNkYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRiZjUzZGIi PnJiYXJkb3UgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmc0YmY1M2RiIj4NCjxwPkl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIHZlcnNpb24gNC4wLjAgb2YgVGV6dCwgYSB0ZXN0IGZyYW1ld29yayBmb3IgT0Nh bWwgd2hpY2ggaXMgd2VsbCBzdWl0ZWQgZm9yIHVuaXQsIGludGVncmF0aW9uIGFuZCByZWdyZXNz aW9uIHRlc3RzIGluIHBhcnRpY3VsYXIuIEl0IGlzIHVzZWQgZm9yIG1vc3QNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0bGFiLmNvbS90ZXpvcy90ZXpvcy8iPlRlem9zPC9hPiB0ZXN0cy4gPC9wPg0KPHA+ VGhlIG1haW4gaGlnaGxpZ2h0cyBvZiB0aGlzIG1ham9yIHJlbGVhc2UgYXJlOiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+PGNvZGU+LS1oZWxwPC9jb2RlPiBpcyBtdWNoIGVhc2llciB0 byByZWFkOyA8L2xpPjxsaT5jdXN0b20gY29tbWFuZC1saW5lIGFyZ3VtZW50cyBmb3IgdGVzdHMg Y2FuIG5vdyBiZSBkZWZpbmVkIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yYmFy ZG91L2NsYXAvIj4NCkNsYXA8L2E+LCBhbmQgdGhleSB3aWxsIGFwcGVhciBpbiA8Y29kZT4tLWhl bHA8L2NvZGU+OyA8L2xpPjxsaT50ZXN0cyBjYW4gbm93IGJlIHNlbGVjdGVkIHVzaW5nIGdlbmVy aWMgcHJlZGljYXRlcyBzdWNoIGFzIDxjb2RlPid0YWcxICZhbXA7JmFtcDsgKHRhZzIgfHwgZmls ZSA9IHRlc3QubWwpJzwvY29kZT47DQo8L2xpPjxsaT5vbmUgY2FuIG5vdyB1c2UgdGhlIDxjb2Rl PkpTT048L2NvZGU+IG1vZHVsZSB3aXRob3V0IGxpbmtpbmcgd2l0aCBhbGwgb2YgVGV6dCwgYnkg bGlua2luZyB3aXRoIHRoZQ0KPGNvZGU+dGV6dC5qc29uPC9jb2RlPiBzdWJsaWJyYXJ5LiA8L2xp PjwvdWw+DQo8cD5TZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxh YnMvdGV6dC8tL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQjdmVyc2lvbi00MDAiPg0KY2hhbmdlbG9n PC9hPiBmb3IgdGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzLCBhbmQgdGhlIDxhIGhyZWY9Imh0dHBz Oi8vbm9tYWRpYy1sYWJzLmdpdGxhYi5pby90ZXp0LzQuMC4wL3RlenQvVGV6dC9pbmRleC5odG1s Ij4NCkFQSSBEb2N1bWVudGF0aW9uPC9hPiBmb3IgbW9yZSBkZXRhaWxzLiA8L3A+DQo8cD5Zb3Ug Y2FuIGluc3RhbGwgVGV6dCB3aXRoIG9wYW06IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlk PSJvcmdlOGI0MDZjIj4NCm9wYW0gaW5zdGFsbCB0ZXp0DQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI3Ij5PQ2FtbCA1LjEuMSA6IGluY29taW5nIGJyZWFraW5nIGNoYW5nZSBpbiB0 aGUgPGNvZGU+TWFyc2hhbDwvY29kZT4gbW9kdWxlPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9vY2FtbC01LTEtMS1pbmNvbWluZy1icmVha2luZy1jaGFuZ2UtaW4tdGhl LW1hcnNoYWwtbW9kdWxlLzEzNDU3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29j YW1sLTUtMS0xLWluY29taW5nLWJyZWFraW5nLWNoYW5nZS1pbi10aGUtbWFyc2hhbC1tb2R1bGUv MTM0NTcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn NzgwZjc3OSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc4MGY3NzkiPm9jdGFjaHJv biBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Zzc4MGY3NzkiPg0KPHA+U29tZSB0aW1lIGFmdGVyIHRoZSByZWxlYXNlIG9mIE9DYW1sIDUuMS4w LCB3ZSBkaXNjb3ZlcmVkIHRoYXQgdGhlcmUgaW4gYSBwYWNrYWdpbmcgYnVnIGluIHRoZSA1LjEu MCBjb21waWxlciBkaXN0cmlidXRpb246IHRoZSBuZXcgc3VwcG9ydCBmb3IgY29tcHJlc3NlZCBj b21waWxlciBhcnRlZmFjdHMgaW4gdGhlIGNvbXBpbGVyIG1hZGUgYWxsIE9DYW1sIGV4ZWN1dGFi bGUgcHJvZ3JhbSBkZXBlbmRzIG9uIHRoZSB6c3RkbGliIGxpYnJhcnkNCiAoaWYgY29tcHJlc3Np b24gc3VwcG9ydCB3YXMgZW5hYmxlZCkuIDwvcD4NCjxwPlRoZXJlIGlzIGFscmVhZHkgYW4gb3Bh bSBjb25maWd1cmF0aW9uIG9wdGlvbiA8Y29kZT4tb2NhbWwtb3B0aW9uLW5vLWNvbXByZXNzaW9u PC9jb2RlPiB0byBkaXNhYmxlIHRoaXMgc3VwcG9ydCBhbmQgdGhpcyBkZXBlbmRlbmN5Lg0KPC9w Pg0KPHA+TmV2ZXJ0aGVsZXNzLCBoYXZpbmcgYSBjb21waWxlciBkZXBlbmRlbmN5IGFmZmVjdHMg YWxsIE9DYW1sIGVuZCBvZiB1c2VycyBpcyBmYXIgZnJvbSBpZGVhbC4gVGh1cyB3ZSBoYXZlIGJl ZW4gdHJ5aW5nIHRvIGZpbmQgYWx0ZXJuYXRpdmVzIHRvIHJlbW92ZSB0aGlzIGRlcGVuZGVuY3ku IFVuZm9ydHVuYXRlbHksIG91ciBjdXJyZW50IGNvbmNsdXNpb24gaXMgdGhhdCB0aGVyZSBhcmUg bm8gcm9idXN0IGFuZCBPUy1pbmRlcGVuZGVudCBzb2x1dGlvbnMNCiB0byByZW1vdmUgdGhpcyBk ZXBlbmRlbmN5IGluIGVuZC11c2VyIHByb2dyYW1zIHdoaWxlIHByZXNlcnZpbmcgdGhlIGN1cnJl bnQgPGNvZGU+DQpNYXJzaGFsPC9jb2RlPiBhcGkgd2l0aCBpdHMgbmV3IDxjb2RlPkNvbXByZXNz aW9uPC9jb2RlPiBmbGFnLiA8L3A+DQo8cD5UaGVyZWZvcmUsIHdlIGFyZSA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMjczNCI+Y3VycmVudGx5IHBsYW5uaW5n IHRvIHJlbW92ZSB0aGlzIGZsYWc8L2E+IGluIHRoZSB1cGNvbWluZyA1LjEuMSBwYXRjaCByZWxl YXNlLiBUaGUgY29tcGlsZXIgd2lsbCBzdGlsbCBzdXBwb3J0IGNvbXByZXNzaW9uIHVzaW5nIGFu IGludGVybmFsIGxpYnJhcnksIGJ1dCB0aGUgc3RhbmRhcmQgbGlicmFyeSB3aWxsIGJlDQogZnJl ZSBmcm9tIGFueSBkZXBlbmRlbmN5IG9uIHpzdGRsaWIuIFN1cHBvcnQgZm9yIGNvbXByZXNzZWQg bWFyc2hhbGxpbmcgbWlnaHQgYmUgcHJvcG9zZWQgaW4gYSBzZXBhcmF0ZSBsaWJyYXJ5IGF0IGEg bGF0ZXIgcG9pbnQuDQo8L3A+DQo8cD5UaGlzIG1lYW5zIHRoYXQgdGhlcmUgd2lsbCBhIGJyZWFr aW5nIGNoYW5nZSBpbiBhIHBhdGNoIHJlbGVhc2UsIGJ1dCB0aGlzIGJyZWFjaCBvZiBwb2xpY3kg c2VlbWVkIGEgYmV0dGVyIG9wdGlvbiB0aGFuIGxlYXZpbmcgYSBkaXNhYmxlZCBmbGFnIGluIGEg c2luZ2xlIHZlcnNpb24gb2YgdGhlDQo8Y29kZT5NYXJzaGFsbDwvY29kZT4gYXBpLiA8L3A+DQo8 cD5JZiB3ZSBoYXZlIGFueSBjb21tZW50cyBvbiB0aGlzIHVuZm9ydHVuYXRlIHNvbHV0aW9uLCBJ IGFtIGFsbCBlYXJzLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+VGhlIE9DYW1s IFBsYXRmb3JtIFJvYWRtYXAgaXMgQWRvcHRlZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvdGhlLW9jYW1sLXBsYXRmb3JtLXJvYWRtYXAtaXMtYWRvcHRlZC8xMzQ1OS8x Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90aGUtb2NhbWwtcGxhdGZvcm0tcm9hZG1h cC1pcy1hZG9wdGVkLzEzNDU5LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNWZhNWIwNCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzVmYTVi MDQiPlRoaWJhdXQgTWF0dGlvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnNWZhNWIwNCI+DQo8cD5JIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2Ug dGhlIGFkb3B0aW9uIG9mIHRoZSBpbml0aWFsIHZlcnNpb24gb2YgdGhlIDxhIGhyZWY9Imh0dHBz Oi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0tcm9hZG1hcCI+DQpPQ2FtbCBQbGF0Zm9ybSByb2Fk bWFwPC9hPiEgPC9wPg0KPHA+VGhlIHJvYWRtYXAgaXMgdGhlIHJlc3VsdCBvZiBleHRlbnNpdmUg Y29sbGFib3JhdGlvbiB3aXRoIGtleSBjb250cmlidXRvcnMgYW5kDQo8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYS1yb2FkbWFwLWZvci10aGUtb2NhbWwtcGxhdGZvcm0tc2Vl a2luZy15b3VyLWZlZWRiYWNrLzEyMjM4Ij4NCmRpc2N1c3Npb25zIHdpdGhpbiB0aGUgY29tbXVu aXR5PC9hPi4gV2UgZXh0ZW5kIG91ciB0aGFua3MgdG8gb3JnYW5pemF0aW9ucyB3aG8gcGFydGlj aXBhdGVkIGluIHVzZXIgaW50ZXJ2aWV3cywgaW5jbHVkaW5nIEphbmUgU3RyZWV0LCBCbG9vbWJl cmcsIEFocmVmcywgTGV4aUZpLCBSb3V0aW5lLCBhbmQgTWV0YSwgYXMgd2VsbCBhcyB0aGUgbWFu eSBkZXZlbG9wZXJzIHdobyBzaGFyZWQgdmFsdWFibGUgaW5zaWdodHMgdGhhdCBoZWxwZWQgc2hh cGUNCiB0aGUgcm9hZG1hcC4gV2UgYWxzbyB0aGFuayBvdXIgZGVkaWNhdGVkIE9DYW1sIFBsYXRm b3JtIG1haW50YWluZXJzIGFuZCB0aG9zZSB3aG8gY29udHJpYnV0ZWQgdGhlaXIgZmVlZGJhY2sg b24gRGlzY3Vzcy4NCjwvcD4NCjxwPkEgZmV3IHRoaW5ncyB0aGF0IGFyZSBpbXBvcnRhbnQgdG8g a2VlcCBpbiBtaW5kOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIHJvYWRtYXAg aXMgYSBsaXZpbmcgZG9jdW1lbnQuIEl0IHdpbGwgY29udGludWUgdG8gZXZvbHZlLiBOb3cgdGhh dCB0aGUgZmlyc3QgdmVyc2lvbiBpcyBsaXZlIG9uIE9DYW1sLm9yZywgZG9u4oCZdCBoZXNpdGF0 ZSB0byBwcm9wb3NlIGFtZW5kbWVudHMgaW4gdGhlIGZvcm0gb2YgUHVsbCBSZXF1ZXN0cyB0byB0 aGUgT0NhbWwub3JnIHJlcG9zaXRvcnkuDQo8L2xpPjxsaT5UaGUgcm9hZG1hcCBpcyBhIGRpcmVj dGlvbmFsIGd1aWRlLCBub3QgYSBzdHJpY3Qgc3BlY2lmaWNhdGlvbi4gSXQgb25seSBzZXRzIHBy aW9yaXRpZXMgZm9yIHRvb2wgZGV2ZWxvcG1lbnQgb24gdGhlIE9DYW1sIFBsYXRmb3JtLCBzaGFw ZWQgaW4gY29sbGFib3JhdGlvbiB3aXRoIG1haW50YWluZXJzLiBDaGFuZ2VzIGluIHRoZSB3b3Jr Zmxvd3MgYXJlIHZlcnkgbGlrZWx5IHRvIGhhcHBlbiBhcyB3b3JrIHN0YXJ0cyBvbiB0aGUgZGlm ZmVyZW50DQogcHJvamVjdHMuIDwvbGk+PGxpPldpdGggYSBmb2N1cyBvbiBhZGRyZXNzaW5nIG1h am9yIGRldmVsb3BlciBuZWVkcyBhbmQgcmVxdWVzdHMsIHRoZSByb2FkbWFwIGlzIGEgdGhyZWUt eWVhciBwbGFuLiBJdOKAmXMgYSByZWxhdGl2ZWx5IHNob3J0IHRpbWVsaW5lLCBzbyBpdCBhaW1z IGZvciBhIGJhbGFuY2UgYmV0d2VlbiBsb25nLXRlcm0gZ29hbHMgYW5kIGltbWVkaWF0ZSBpbXBy b3ZlbWVudHMuDQo8L2xpPjwvdWw+DQo8cD48Yj5FbnRlcmluZyB0aGUgRXhlY3V0aW9uIFBoYXNl PC9iPiA8L3A+DQo8cD5XaXRoIHRoZSBwbGFubmluZyBwaGFzZSBjb21wbGV0ZSwgd2XigJlyZSBt b3ZpbmcgdG93YXJkcyBleGVjdXRpbmcgdGhlIHJvYWRtYXAuIFRoaXMgaXMgYSBjb21tdW5pdHkg ZWZmb3J0LCBhbmQgZXZlcnlvbmUgY2FuIHBhcnRpY2lwYXRlOg0KPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPjxiPkNvbW11bml0eSBtZW1iZXJzPC9iPjogQ29udHJpYnV0aW9ucyB0byBQ bGF0Zm9ybSBwcm9qZWN0cyBhcmUgd2VsY29tZS4gQWxsIHRoZSBQbGF0Zm9ybSBwcm9qZWN0cyBh cmUgYWN0aXZlbHkgbG9va2luZyBmb3IgY29udHJpYnV0b3JzIGFuZCBldmVyeW9uZSB3aWxsIGJl IG1vcmUgdGhhbiBoYXBweSB0byBoZWxwIHlvdSBvbmJvYXJkIG9uIGEgcHJvamVjdC90YXNrLg0K PC9saT48bGk+PGI+T0NhbWwgZGV2ZWxvcGVyczwvYj46IFlvdXIgZmVlZGJhY2sgaXMgYWx3YXlz IGhlbHBmdWwuIFdlIGVuY291cmFnZSB5b3UgdG8gc2hhcmUgeW91ciBleHBlcmllbmNlcyBhbmQg c3VnZ2VzdGlvbnMgdGhyb3VnaCBpc3N1ZXMgb3IgaGVyZSwgb24gRGlzY3Vzcy4NCjwvbGk+PGxp PjxiPkluZHVzdHJpYWwgdXNlcnM8L2I+OiBJZiBlbGVtZW50cyBvZiB0aGUgcm9hZG1hcCBhbGln biB3aXRoIHlvdXIgb3JnYW5pemF0aW9u4oCZcyBpbnRlcmVzdHMsIGNvbnNpZGVyIHN1cHBvcnRp bmcgdGhyb3VnaCBkZXZlbG9wbWVudCBjb250cmlidXRpb25zIG9yIGZ1bmRpbmcgbWFpbnRhaW5l cnMuDQo8L2xpPjwvdWw+DQo8cD48Yj5Db21tdW5pdHkgRmVlZGJhY2s8L2I+IDwvcD4NCjxwPlRo ZSByb2FkbWFwIHdlbnQgdGhyb3VnaCBhIGZldyBpdGVyYXRpb25zIHNpbmNlIGl0cyBmaXJzdCBk cmFmdCB3YXMgc2hhcmVkIGZvciBjb21tdW5pdHkgZmVlZGJhY2suIEFtb25nIGFsbCB0aGUgZXhj ZWxsZW50IGZlZWRiYWNrIHdlIHJlY2VpdmVkLCB0aGUgZm9jdXMgb2YgdGhlIHJvYWRtYXAgb24g YnVpbGRpbmcgYSBjb2hlc2l2ZSBleHBlcmllbmNlIHRocm91Z2ggRHVuZSBpcyBvbmUgcG9pbnQg dGhhdCBzcGlsdCBhIGxvdCBvZiBpbmsuDQogSSB3YW50IHRvIGhpZ2hsaWdodCBhIGZldyBjaGFu Z2VzIHdl4oCZdmUgbWFkZSB0byB0aGUgcm9hZG1hcCBiYXNlZCBvbiB0aGF0IGZlZWRiYWNrOg0K PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPg0KPHA+UmUtd3JvdGUgKFA1KSBUb29scyBh cmUgaW5kZXBlbmRlbnQsIHlldCB1bmlmaWVkIDwvcD4NCjxibG9ja3F1b3RlPg0KPHA+Rm9sbG93 aW5nIG9uIFA0LCB3ZSB1bmRlcmxpbmUgdGhlIGNyaXRpY2FsIGltcG9ydGFuY2Ugb2YgcGVybWl0 dGluZyB0b29scyB0byBmbG91cmlzaCBpbmRlcGVuZGVudGx5OiB0aGUgT0NhbWwgUGxhdGZvcm0g ZXhpc3RzIGFuZCB3aWxsIGNvbnRpbnVlIHRvIGV4aXN0IGFzIGEgY29sbGVjdGlvbiBvZiB0b29s cyB0aGF0IGNhbiBiZSB1c2VkIGluZGVwZW5kZW50bHkuIFvigKZdIEFtaWRzdCB0aGlzIGludGVn cmF0aW9uLCB3ZSBmaXJtbHkgY29tbWl0DQogdG8gZW5zdXJpbmcgdGhhdCB0b29scyByZXRhaW4g dGhlaXIgaW5kZXBlbmRlbmNlIGFuZCBjb250aW51ZSB0byBiZSBhY2Nlc3NpYmxlIHRocm91Z2gg dGhlaXIgb3duIENMSXMuDQo8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8L2xpPjxsaT4NCjxwPkFkZGVk IChXMTUpIFBsdWdpbiBFeHRlbnNpYmlsaXR5IDwvcD4NCjxibG9ja3F1b3RlPg0KPHA+Rm9sbG93 aW5nIChQNikgKFRoZSBQbGF0Zm9ybSBpcyBjb2hlc2l2ZSwgeWV0IGV4dGVuc2libGUpLCBEdW5l IGFsbG93cyBleHRlcm5hbCB0b29scyB0byBleHRlbmQgaXRzIGxhbmd1YWdlIHRvIGFkZCBuZXcg YnVpbGQgcnVsZXMgdGhyb3VnaCBhIHBsdWdpbiBzeXN0ZW0uIFvigKZdDQo8L3A+DQo8L2Jsb2Nr cXVvdGU+DQo8L2xpPjxsaT4NCjxwPkFkZGVkIChXMTYpIEludGVncmF0ZSBXaXRoIE90aGVyIEJ1 aWxkIFN5c3RlbXMgPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5b4oCmXSBJbiBvcmRlciB0byBlbnN1 cmUgdGhhdCB0aGUgT0NhbWwgZWNvc3lzdGVtIHJlbWFpbnMgYWNjZXNzaWJsZSBhbmQgdXNhYmxl IGZvciBhbGwgdGhlc2UgdXNlcnMsIHJlZ2FyZGxlc3Mgb2YgdGhlaXIgY2hvc2VuIGJ1aWxkIHN5 c3RlbSwgRHVuZSBvZmZlcnMgc3VwcG9ydCB0byBlamVjdCB0aGUgYnVpbGQgcGxhbiB0byBhIG1h Y2hpbmUtcmVhZGFibGUgZm9ybWF0LiBUaGlzIGVuYWJsZXMgdGhpcmQtcGFydHkgdG9vbHMgdG8g Y29uc3VtZQ0KIHRoZSBleHBvcnRlZCBidWlsZCBwbGFuIGFuZCBjb252ZXJ0IGl0IGludG8gb3Ro ZXIgYnVpbGQgc3lzdGVtc+KAmSBzcGVjaWZpY2F0aW9ucy4gW+KApl0NCjwvcD4NCjwvYmxvY2tx dW90ZT4NCjwvbGk+PC91bD4NCjxwPkFuZCBhcyBtZW50aW9uZWQgYWJvdmUsIHRoZSByb2FkbWFw IGlzIGEgbGl2aW5nIGRvY3VtZW50LCBzbyBkb27igJl0IGhlc2l0YXRlIHRvIHNlbmQgYSBQUiB0 byB1cGRhdGUgb3IgYWRkIGRldmVsb3BtZW50IHdvcmtmbG93cy4NCjwvcD4NCjxwPlRoaXMgcm9h ZG1hcCBpcyBhIHNpZ25pZmljYW50IHN0ZXAgaW4gb3VyIGpvdXJuZXkgdG8gaW1wcm92ZSB0aGUg T0NhbWwgdG9vbGluZywgbWFraW5nIE9DYW1sIGV2ZW4gbW9yZSBwbGVhc2FudCB0byB1c2UsIGFu ZCBlYXNpZXIgdG8gYWRvcHQuIEl0IHdhcyBhbHNvIHRoZSBmaXJzdCB0aW1lIHdlIG9yZ2FuaXNl ZCBhIGNvbW11bml0eSBkaXNjdXNzaW9uIHRvIGFkb3B0IGEgUGxhdGZvcm0gcm9hZG1hcC4gVGhp cyB3YXMgYWJzb2x1dGVseSB3b3J0aA0KIGl0LCBhbmQgc29tZXRoaW5nIHdl4oCZbGwgYWltIHRv IHJlcHJvZHVjZS4gSW4gdGhlIG1lYW50aW1lLCBpZiB5b3UgaGF2ZSBzdWdnZXN0aW9ucyBvbiBo b3cgd2UgY2FuIG9yZ2FuaXNlIHRoZXNlIGNvbnZlcnNhdGlvbnMgYmV0dGVyIGluIHRoZSBmdXR1 cmUsIGRvbuKAmXQgaGVzaXRhdGUgdG8gc2hhcmUgeW91ciB0aG91Z2h0cy4NCjwvcD4NCjxwPk5v dywgdGltZSB0byBidWlsZC4gT24gd2UgZ28hIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI5Ij5QcHhsaWIgZGV2IG1lZXRpbmdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzEwIj5odHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5ncy8xMjQ0MS8xMDwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzI3NTczZSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzcyNzU3M2UiPlNvbmphIEhlaW56ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzcyNzU3M2UiPg0KPHA+SGVsbG8gOikg PC9wPg0KPHA+VG9tb3Jyb3csIGNvbmNyZXRlbHkgW2RhdGU9MjAyMy0xMS0yMSB0aW1lPTE4OjAw OjAwIHRpbWV6b25lPeKAnEV1cm9wZS9NYWRyaWTigJ1dLCBpcyBvdXIgbW9udGhseSBwcHhsaWIg ZGV2IG1lZXRpbmcuIEhlcmXigJlzIHdoYXQgd2UgY3VycmVudGx5IGhhdmUgb24gdGhlIGFnZW5k YToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5EZXByZWNhdGlvbiBvZiA8Y29kZT5D YW1sPC9jb2RlPiBpbiBwcHhsaWIgYW5kIGhvdyBicmVha2luZyB0aGF0IGNoYW5nZSBpcy4gPC9s aT48bGk+PGNvZGU+QXN0X2J1aWxkZXI8L2NvZGU+IGFuZCA8Y29kZT5Bc3RfcGF0dGVybjwvY29k ZT4gaGF2ZSBhIHJlc3RyaWN0ZWQgQVBJIHdydCBhdHRyaWJ1dGVzLg0KPGNvZGU+QXN0X2hlbHBl cjwvY29kZT4gc2VlbWVkIG1vcmUgZmxleGlibGUgd3J0IGF0dHJpYnV0ZXMuIFdoeT8gKHNlZSA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L3BweGxpYi9pc3N1ZXMvNDU4Ij4N Cmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGliL2lzc3Vlcy80NTg8L2E+IGFuZCA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmVzdC1wcmFjdGljZXMtZm9yLWF0 dHJpYnV0ZXMtaW4tcHB4LzEzNDAwIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9iZXN0 LXByYWN0aWNlcy1mb3ItYXR0cmlidXRlcy1pbi1wcHgvMTM0MDA8L2E+KSA8L2xpPjxsaT5XZeKA mXJlIHN0b3BwaW5nIHRoZSBlZmZvcnRzIHRvIG1hbnVhbGx5IGtlZXAgcHB4bGliIGNvbXBhdGli bGUgd2l0aCA8Y29kZT50cnVuazwvY29kZT4uDQo8L2xpPjxsaT5QcHhsaWIgZHJpdmVyIHBlcmZv cm1hbmNlIDwvbGk+PGxpPkN1cnJlbnQgc3RhdGUgb2YgPGNvZGU+cHB4X2Rlcml2aW5nPC9jb2Rl PiA8L2xpPjwvdWw+DQo8cD5XZeKAmXJlIG1ha2luZyBpdCBhIHpvb20gbWVldGluZyB0aGlzIHRp bWUsIHNvIHRoZSBtZWV0aW5nIGxpbmsgaXMgZGlmZmVyZW50IHRoYW4gdXN1YWwuIEhlcmUgaXQg aXM6DQo8YSBocmVmPSJodHRwczovL3VzMDR3ZWIuem9vbS51cy9qLzc0NTMzNDI3NDUwP3B3ZD1o eDdZVUwxTFc5VXQ5cnljYzRhMUFBR3lPMzZvSUouMSI+DQpodHRwczovL3VzMDR3ZWIuem9vbS51 cy9qLzc0NTMzNDI3NDUwP3B3ZD1oeDdZVUwxTFc5VXQ5cnljYzRhMUFBR3lPMzZvSUouMTwvYT4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt MTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+TWlyYWdlVlBOIChhbiBPcGVuVlBO 4oSiIGltcGxlbWVudGF0aW9uKSBpcyByZXN1cnJlY3RlZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9t YXN0b2Rvbi5zb2NpYWwvQGhhbm5lc20vMTExNDIwMzM1NjUzMTA4OTk3Ij5odHRwczovL21hc3Rv ZG9uLnNvY2lhbC9AaGFubmVzbS8xMTE0MjAzMzU2NTMxMDg5OTc8L2E+DQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzY4YmFkM2QiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmc2OGJhZDNkIj5oYW5uZXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2OGJhZDNkIj4NCjxwPldlIGhhdmUgZXhjaXRp bmcgI09DYW1sIG5ld3M6IDxhIGhyZWY9Imh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVz L21pcmFnZXZwbi5odG1sIj4NCmh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzL21pcmFn ZXZwbi5odG1sPC9hPiDigJMgdGhlIE1pcmFnZVZQTiAoYW4gT3BlblZQTuKEoiBpbXBsZW1lbnRh dGlvbikgaXMgcmVzdXJyZWN0ZWQsIGFuZCB3ZeKAmXJlIG1ha2luZyBwcm9ncmVzcy4NCjwvcD4N CjxwPldlIGhvc3QgPGEgaHJlZj0iaHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AiPmh0dHBzOi8vYmxv Zy5yb2J1ci5jb29wPC9hPiAoYSAjTWlyYWdlT1MgdW5pcGkgdW5pa2VybmVsIC0NCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3VuaXBpIj5odHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC91bmlwaTwvYT4pIHVzaW5nIFlPQ2FtbCAoPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL3hodG1sYm9pL3lvY2FtbCI+aHR0cHM6Ly9naXRodWIuY29tL3hodG1sYm9pL3lvY2Ft bDwvYT4pIGFuZCB0bHN0dW5uZWwgYXMgcmV2ZXJzZSBUTFMgcHJveHkgKDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3Rsc3R1bm5lbCI+aHR0cHM6Ly9naXRodWIuY29tL3Jv YnVyLWNvb3AvdGxzdHVubmVsPC9hPikuDQogRGVwbG95bWVudCB3YXMgZG9uZSB3aXRoaW4gJmx0 OyAxNSBtaW51dGVzLCB1c2luZyBvdXIgI3JlcHJvZHVjaWJsZV9idWlsZHMgaW5mcmFzdHJ1Y3R1 cmUNCjxhIGhyZWY9Imh0dHBzOi8vYnVpbGRzLnJvYnVyLmNvb3AiPmh0dHBzOi8vYnVpbGRzLnJv YnVyLmNvb3A8L2E+IDwvcD4NCjxwPkVuam95IHJlYWRpbmcgOkQgPC9wPg0KPHA+Q29sbGFib3Jh dGlvbiBAZGlub3NhdXJlIGFuZCBAcmV5bmlyIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMTEiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTExIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZjNWNj YmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmYzVjY2JjIj5Gcm9tIHRoZSBvY2Ft bC5vcmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn ZmM1Y2NiYyI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVn YXRlZCBhdCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3Jn IGJsb2c8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvbWlyYWdldnBuLW5jcC5odG1sIj5NaXJhZ2VWUE4g dXBkYXRlZCAoQUVBRCwgTkNQKTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5y b2J1ci5jb29wL2FydGljbGVzL21pcmFnZXZwbi5odG1sIj5NaXJhZ2VWUE4gJmFtcDsgdGxzLWNy eXB0LXYyPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNjhhMWNlZSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 Im9yZzY4YTFjZWUiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LW9yZzY4YTFjZWUiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3Ug Y2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2Vu ZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0 aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5J ZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5 IHN1YnNjcmliZSB0byB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9p bmZvL2NhbWwtbGlzdCI+DQpjYW1sLWxpc3Q8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3Ju YW1lIiBpZD0ib3JnZjY2MWQ0MCI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9t bWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 17 Oct 2023 08:47:35 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 17 Oct 2023 08:47:35 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 17 Oct 2023 08:47:35 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39H7lOsq008085 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 17 Oct 2023 08:47:24 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39H7lDRm008069 for ; Tue, 17 Oct 2023 08:47:14 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Oct 2023 09:47:12 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id DC5ACE0CD7; Tue, 17 Oct 2023 09:47:11 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 6D8E8E00B7 for ; Tue, 17 Oct 2023 09:47:09 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Oct 2023 09:47:08 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8FD7B561298; Tue, 17 Oct 2023 09:46:58 +0200 (CEST) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHaAM4xBMAqBcZ6LUi2W//XQ6Lunw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 17 Oct 2023 08:46:58 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: fc4f7d52-7648-496d-954f-08dbcee553f4 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,231,1694728800"; d="scan'208,217";a="131601438" x-spam-flag: No, tests=bogofilter, spamicity=0.375818, queueID=0389056129D x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 OCaml Weekly News

    OCaml Weekly News

    Previous We= ek Up Next We= ek

    Hello

    Here is the latest OCaml Weekly News, for the week of October 10 to 17, = 2023.

    Hiring Functional Software Engineers (OCaml or Haskell) in Par= is, France!

    Christian announced

    Hey team! Tweag is hiring a Functional Software engineer with Experience= in OCaml or Haskell, if you=92re fluent in ant of these languages please f= eel free to apply. This is an onsite position at our client offices located= in Paris, France. (Hybrid model can be discussed in the interview process)

    If you want to lear more and how to apply please follow this link where = you=92ll see all the information: https://grnh.se/51d5e65b3us

    Any questions let me know!

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    FYI, we just rolled out a 0.3 release of qcheck-lin, = qcheck-stm, and qcheck-multicoretests-util: https://github.com/ocaml-multicore/multicoretests/releases/tag/0.3 The = release should be available in an opam repo near you shortly=85 :wink:

    The 0.3 release brings 3 =93usability improvements=94 to STM and Util and a Lin search improvement that should reduce me= mory allocation.

    • #400: Catch and delay exceptions in STM=92s next_sta= te for a nicer UX
    • #387: Reduce needless allocations in Lin=92s sequenti= al consistency search, as part of an Out_channel test cleanup
    • #379: Extend the set of Util.Pp pretty-printers and teach them to add break hints similar = to ppx_deriving.show; teach to_show to generate trun= cated strings when $MCTUTILS_TRUNCATE environment variable is set
    • #368: = Switch STM_domain.agree_prop_par_asym from using Semapho= re.Binary to using an int Atomic.t which improves the error rate across platforms an= d backends

    Happy testing! :smiley:

    dune 3.11.0

    Etienne Millon announced

    We just released dune 3.11.1 with the following fixes:

    Fixed

    • Fix dune rpc commands on Windows (#8806, fixes #8799, @noj= b)
    • Fix inline_tests when the partition list is empty = (#8849, fixes #8848, @hhugo)

    runtime_events_tools 0.5.0

    Sudha Parimala announced

    I=92m happy to announce the release of runtime_events_tools.0.5.0.

    OCaml 5.0 introduced a new ring-buffer based tracing system with low overheads. This eliminated th= e need for a separate tracing runtime and added the ability to keeping trac= ing on by default. The OCaml runtime uses this tracing system to track GC e= vents. OCaml 5.1 went further to include support for = custom events.

    Runtime events tools through olly, provides functionality t= o grok the data provided by the runtime tracing system.

    Olly has two modes; trace , and gc-stats

    olly trace

    $ olly trace example.trace example.exe
    

    Records runtime traces in fuchsia and json formats. The trace files can = be visualised with ui.perfetto. or json = trace with [chrome://tracing](chrome://tracing).

    Here=92s a sample trace rendered in perfetto.

    3D=

    olly gc-stats

    Provides information about GC time and latencies.

    $ olly gc-stats "binarytrees5_multicore.exe 2 20"
    
    Execution times:
    Wall time (s):	2.61
    CPU time (s):	4.63
    GC time (s):	2.93
    GC overhead (% of CPU time):	63.18%
    
    GC time per domain (s):
    Domain0: 	1.59
    Domain1: 	1.34
    
    GC latency profile:
    #[Mean (ms):	0.76,	 Stddev (ms):	1.56]
    #[Min (ms):	0.00,	 max (ms):	15.68]
    
    Percentile 	 Latency (ms)
    25.0000 	 0.00
    50.0000 	 0.01
    60.0000 	 0.04
    70.0000 	 0.28
    75.0000 	 0.66
    80.0000 	 1.40
    85.0000 	 2.44
    90.0000 	 3.16
    95.0000 	 3.62
    96.0000 	 3.79
    97.0000 	 4.06
    98.0000 	 4.73
    99.0000 	 6.29
    99.9000 	 13.59
    99.9900 	 15.68
    99.9990 	 15.68
    99.9999 	 15.68
    100.0000 	 15.68
    

    New features in this release:

    • Support for fuchsia format: Stores the trace in binary format, m= aking the trace files 4x smaller in size, on an average.
    • gc-stats mode: In addition to latency percentiles, GC stats= provide more insights, such as GC time and GC time spent per domain.
    • Custom events support: Not only can you trace GC events, but now = you can also trace your own events 3D"a3=

      Trace for a recursive fibonacci function

    Note that if you see non-terminating events in your traces, you might wa= nt to include this compiler patch =96 https://github.com/oc= aml/ocaml/pull/12583.

    Gospel 0.2.0

    Nicolas Osborne announced

    We are very happy to announce the release 0.2.0 of gospel! =

    Gospel is a tool-agnostic behavioural specification language for OCaml. = It allows you to write strongly typed contract-based specifications for you= r OCaml libraries (for a reasonable subset of OCaml). Gospel=92s syntax has= been designed to be easy to learn for an OCaml programmer. You can access the documentation here.

    This release adds two main features, a gospel dumpast comma= nd and a gospel.ppx ppx rewriter to display Gospel specification as doc= umentation with odoc.

    Some minor extensions have been added to the language itself:

    • a with construct to name a variable in type invariants ref= erring to a value of the specified type,
    • int literals,
    • anonymous functions now suppor= t both patterns in arguments and return type annotations,
    • unit result in function headers,
    • constants can now be ref= erenced in specifications,
    • infix operators are now accepted in spe= cification headers.

    Parser, preprocessor, and error messages have been improved. In particul= ar the preprocessor can now handle large files and locations are properly t= racked. Pattern matches are now also checked for exhaustiveness and redunda= ncy.

    We have made a number of improvements and bugfixes in the type checker a= s well as some minor modifications in the Gospel standard library. Finally,= the documentation has been revised.

    Talk about declarative rhythm-machines with Fry a= nd FRP @ Copenhagen

    rand announced

    I=92m happy to announce that I=92m doing a talk on Fry at meetup for functional copenhageners @ 24. october. Fry is = a small library that enables declarative definitions of rhythm-machines etc= . together with FRP (React). These can be interactive, generat= ive, experimental - what ever you fancy. Recently I=92ve used it for a polyrhythmic machine (pmmd) based on bpm-modulation, that I=92m planning on releasing as modular sy= nthesizer hardware.

    A couple of concepts from Fry that are interesting, which y= ou can see from its examples: =

    Also, OCaml with first class modules + module functors + FRP, ma= p elegantly to the semantics of modular synth= esizers. Simply:

    • a unit event maps to a control-voltage (CV) trigger
    • a float signal maps = to CV
    • a module functor maps to a modular synth module taking CV-in= , exposing CV-out

    If you are near Copenhagen - hope to see you (:

    Deprecating ocaml-migrate-parsetree in favor of Ppxlib, also a= s a Platform tool

    Sonja Heinze announced

    Hello everyone :wave:

    We=92re planning to deprecate ocaml-migrate-parsetree (OMP) finally. OMP forms part of the OCaml Platform, so we can=92t and wouldn=92t just do that without the a= pproval of the community. So first a bit of context:

    What is OMP anyways?

    OMP used to be an extremely important project in the meta-programming-re= lated chunk of OCaml=92s ecosystem. Since the introduction of extension nodes= and attri= butes in OCaml 4.2 in 2014, meta-programming in OCaml is most commonly = done on OCaml=92s parsetree. The caveat: The parsetree is extended and modi= fied between OCaml minor versions, meaning that handling the OCaml parsetree directly is unstable. OMP came to the re= scue by introducing a concept we call versioned parsetrees (or versioned ASTs) t= ogether with migrations between those fixed versions of the parsetree, allo= wing the workflow

    3D"H13pahLWp.p=

    That workflow allows one PPX to guarantee compatibility with multiple co= mpiler versions (here, PPX =3D PreProcessor eXtension stands for the meta-p= rogramming instance). That was extremely important at the time to introduce= a more version-flexible ecosystem and to reduce the maintenance burden of PPXs!

    OMP also provided the concept of a driver, which is one single binary driving the applicatoin of all PPXs. Without= that, using n PPXs would mean copying the workflow pictured above n times.= That=92s an incredible performance overhead. The OMP driver took care of applying all PPXs, so fewer parsetre= e migrations and less communication between different processes were necess= ary (before: one process per PPX).

    Why was OMP not enough?

    However, the OMP driver was still duplicating parsetree migrations, and = it did one whole parsetree pass per PPX. And because of the latter, the out= come of the preprocessor phase used to depend on the order of PPXs, which d= idn=92t follow any semantically relevant or otherwise reasoned pattern. The reason why it would have been extremely= complicated to improve the OMP driver further was that each PPX chose its = own versioned parsetree version. There was no agreement between different P= PXs.

    • Ppxlib

      So the solution was to have the PPXs agree on one versioned parsetree ve= rsion. That=92s what Ppxlib does. It also do= es a lot more by providing an extensive API to write PPXs easily and others= , but the main point here is that it consolidates a consistent PPX ecosyste= m wrt parsetree versions. The way it does so is by exposing one fixed versioned parsetree version that all P= PXs are defined against.

      Thanks to that, the Ppxlib driver can get rid of unnecessary parsetree m= igrations, and it can merge a whole bunch of PPXs into one AST pass, improv= ing performance and guaranteeing a clear order of PPX transformations. Also= important: Having all PPXs on the same versioned parsetree version, makes it easy to have them all on the on= e of the latest OCaml version. For details I=92m not going into, that=92s t= he only (reasonable) way to have the PPXs support the latest compiler synta= x features, so that=92s a huge advantage of Ppxlib as well.

      Ppxlib still isn=92t perfect and comes with its own little set of proble= ms, but it does solve the mentioned big problems of performance overhead, u= nclear composition semantics, parsetree-version-fragmentation among differe= nt PPXs, and lack of latest compiler syntax support. So by now, the whole OCaml opam ecosystem has shifted from= OMP to Ppxlib (more below).

      The latest update on the state of Ppxlib, also including info about OMP = and the ecosystem=92s transition from one to the other is this one from 2021. All Ppxlib maintainers have very very little tim= e for communication and similar. If a new update would be strongly apprecia= ted, let us know. For here, let=92s focus on OMP:

    What does it mean to deprecate OMP?

    Given that by now, OMP=92s maintenance is held at the bare bare minimum = anyways, deprecating it would only have one clear impact:

    • Real-life

      We=92d stop adding new compiler support, so the last supported compiler = would be OCaml 5.0. Concretely: We won=92t add the new versioned parsetrees= and migrations for the new compilers anymore.

    • Formalities

      We=92d also mark the OMP opam packages as deprecated, and we=92d move OM= P to the Deprecate section in the set of OCaml Platform tools= (now it=92s in the Sustained section).

    Is it ok to deprecate OMP?

    You tell us :) Here=92s some info:

    • Opam packages

      All packages on opam have moved to Ppxlib now. There=92s only a hand-full of packages that formally still depend on OMP, but all of t= hat seems to be formal left-overs in the opam files, a left-over test depen= dency or similar. I=92ve opened issues on those packages, mentioning the po= tential upcoming deprecation of OMP, and nobody has complained.

    • Distribution packages

      There are still a few distributions that keep on packaging OMP on their = distribution, e.g. there=92s OMP on D= ebian, OMP on Fedora and OMP on Arch. However, the reason for that seems merely historical (with= unquestioned inertia): There are no reverse dependencies on Debian or Fedo= ra. On Arch, there are a few reverse dependencies, none of them still being= relevant in the present. I=92ll reach out to the three respective package managers. If anyone has any info or re= levant context about this, please share it!

    • Users/community

      And this is where we=92re asking for feedback. Does it sound good to eve= ryone to deprecate OMP? We do have the strong impression that pretty much e= veryone has moved to Ppxlib, but if you think we=92re missing something imp= ortant, please let us know (or, just use this opportunity to say something nice about OMP :slight_smile: ).

    • Original author and current maintainer

      Obviously, the current maintainer/=93sustainer=94 (me) thinks it=92s goo= d to deprecate OMP finally. And the original author, @let-def, is behind it= as well.

      Btw, @let-def, thanks a lot for this crucial piece of OCaml software! It= contains a lot of really good ideas, concepts, and implementation details!= Even once deprecated, it will persist - partly quite literally inside Ppxl= ib in the form of the versioned parsetrees, the migrations, and parts of the driver.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I=92ll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to = the caml-list.

    From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 10 Oct 2023 08:49:31 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 10 Oct 2023 08:49:31 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 10 Oct 2023 08:49:31 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39A7nHSX032693 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 10 Oct 2023 08:49:17 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 39A7n54R032672 for ; Tue, 10 Oct 2023 08:49:06 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Oct 2023 09:49:02 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 04B5DE0205; Tue, 10 Oct 2023 09:49:00 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 1A4F2E00B7 for ; Tue, 10 Oct 2023 09:48:56 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Oct 2023 09:48:54 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2A4D95605C9; Tue, 10 Oct 2023 09:48:52 +0200 (CEST) From: Alan Schmitt To: lwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ+05NCADaJilE4ECm3ZmzPvYqww== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 10 Oct 2023 08:48:51 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: c8111ea7-4f79-49dc-be5b-08dbc965701c X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,212,1694728800"; d="scan'208,217";a="68243065" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.456868, queueID=891BC5606A4 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMC0xMCBUdWUgMDk6NDMgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMTAuMDMuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMC4xNy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE9jdG9iZXIgMDMgdG8gMTAsIDIwMjMuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+SW50ZXJlc3RpbmcgT0NhbWwgQXJ0 aWNsZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5iaW5kaW5ncyB0byB0aGUgUEFSSSBhbGdl YnJhIGxpYnJhcnk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5PQ2FtbCBjb21waWxlciBwcm9q ZWN0L2NvbnRyaWJ1dGlvbiBpZGVhczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPlBweGxpYiAw LjMxLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5kdW5lIDMuMTEuMDwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzYiPkFycmFraXM6IEEgbmV3IFJJU0MtViBzaW11bGF0b3I8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM3Ij5XZWIgQW5hbHl0aWNzIG9uIE9DYW1sLm9yZzwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzgiPkEgUm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBsYXRmb3JtIC0gU2Vla2luZyBZb3Vy IEZlZWRiYWNrPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+cHJvZHVjZXIgMC4yLjA8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiMxMCI+Q2FsbCBmb3IgQ29udHJpYnV0aW9uczogQk9CIDIwMjQsIEJl cmxpbiBbTWFyY2ggMTUsIERlYWRsaW5lIE5vdiAxN108L2E+DQo8L2xpPjxsaT48YSBocmVmPSIj MTEiPkEgbGl0dGxlIGFydGljbGUgYWJvdXQgTWlvdTwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29y ZzI3NWM4ODYiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+SW50 ZXJlc3RpbmcgT0NhbWwgQXJ0aWNsZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2ludGVyZXN0aW5nLW9jYW1sLWFydGljbGVzLzE4NjcvMTEwIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9pbnRlcmVzdGluZy1vY2FtbC1hcnRpY2xlcy8xODY3LzExMDwvYT4g PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjNzZjMjJmIiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYzc2YzIyZiI+RG1pdHJpaSBLb3Zhbmlrb3Ygc2Fp ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzc2YzIyZiI+ DQo8cD5Ub2RheSBJ4oCZdmUgcmVhZCBhIG5pY2UgYmVnaW5uZXItZnJpZW5kbHkgYmxvZyBwb3N0 IGFib3V0IHBhdHRlcm4gbWF0Y2hpbmcgaW4gT0NhbWwgd2l0aCBsb3RzIG9mIGV4YW1wbGVzOg0K PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3Lm5leHhl bC5kZXYvYmxvZy9wYXR0ZXJuLW1hdGNoaW5nIj5odHRwczovL3d3dy5uZXh4ZWwuZGV2L2Jsb2cv cGF0dGVybi1tYXRjaGluZzwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSIyIj5iaW5kaW5ncyB0byB0aGUgUEFSSSBhbGdlYnJhIGxpYnJhcnk8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1iaW5kaW5ncy10by10aGUtcGFyaS1hbGdlYnJh LWxpYnJhcnkvMTMxNTcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJpbmRp bmdzLXRvLXRoZS1wYXJpLWFsZ2VicmEtbGlicmFyeS8xMzE1Ny8xPC9hPiA8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzZiMTdhOTgiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmc2YjE3YTk4Ij5KdWxpZW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2YjE3YTk4Ij4NCjxwPkkgd3JvdGUgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL2p0Y29vbGVuL29jYW1sLXBhcmkiPm9jYW1sLXBhcmk8L2E+ LCBhbiBPQ2FtbCBsaWJyYXJ5IHByb3ZpZGluZyBiaW5kaW5ncyB0byB0aGUNCjxhIGhyZWY9Imh0 dHBzOi8vcGFyaS5tYXRoLnUtYm9yZGVhdXguZnIvIj5QQVJJPC9hPiBhbGdlYnJhIGxpYnJhcnku IFRoZSBiaW5kaW5ncyBhcmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZnJvbSB0aGUgbGlicmFy eeKAmXMgaGVhZGVyIGZpbGVzLiBJbiBhZGRpdGlvbiwgYSBsaWdodCB3cmFwcGVyIG9mZmVycyBh IHRoaW4gbGF5ZXIgb2Ygc3RhdGljIHR5cGluZyB0byBub3Qgb25seSBlbmNvZGUgcGFydCBvZiB0 aGUgd3JpdHRlbiBkb2N1bWVudGF0aW9uDQogaW50byB0eXBlcyBieSBtZWFucyBvZiBwaGFudG9t IHR5cGVzLCBidXQgdG8gZW5jb2RlIGFjdHVhbCBpbnZhcmlhbnRzIHRvIHByZXZlbnQgbWlzbWF0 Y2hlcyBiZXR3ZWVuIGZ1bmN0aW9ucyBhbmQgYXJndW1lbnRzLiBFLmcuLCB0byBwcmV2ZW50IGZy b20gbXVsdGlwbHlpbmcgYSBncm91cCBlbGVtZW50IGJ5IGEgcG9seW5vbWlhbC4gT25lIGNhbiBm aW5kIGNvZGUgc2FtcGxlcyBpbiB0aGUNCjxjb2RlPmV4YW1wbGVzPC9jb2RlPiBkaXJlY3Rvcnks IG5vdGFibHkgY3J5cHRvZ3JhcGhpYyBwb2x5bm9taWFsIGNvbW1pdG1lbnRzICg8Y29kZT5remcu bWw8L2NvZGU+KSBhbmQgYW4gYXR0YWNrIG9uIGEga25hcHNhY2sgY3J5cHRvc3lzdGVtICg8Y29k ZT5rbmFwc2Fja19sbGwubWw8L2NvZGU+KS4NCjwvcD4NCjxwPlRoZSB1bmRlcmx5aW5nIGxpYnJh cnksIFBBUkksIGlzIHdyaXR0ZW4gaW4gQyBhbmQgcmVsaWVzIG9uIGEgc2luZ2xlIHJlY3Vyc2l2 ZSB0eXBlIHRvIHJlcHJlc2VudCBhbGwgb2JqZWN0cy4gV2l0aCB0aGUgd3JhcHBlciwgdGhpcyB0 eXBlIGlzDQo8Y29kZT4o4oCYa2luZCwg4oCYc3RydWN0dXJlKSB0PC9jb2RlPiBzbyBhcyB0byBh bm5vdGF0ZSBpdCB3aXRoIGl0cyBraW5kIGFuZCB0aGUgb3BlcmF0aW9ucyBpdCBzdXBwb3J0cy4g SXQgaXMgdGh1cyBwb3NzaWJsZSB0byB3cml0ZSBhIGdlbmVyaWMgYWxnb3JpdGhtIHRoYXQgd29y a3Mgd2l0aCBncm91cCBlbGVtZW50cw0KPGNvZGU+KOKAmGEsIGdyb3VwKSB0PC9jb2RlPiBmb3Ig aW5zdGFuY2UuIFRoZSBsaWJyYXJ5IHdpbGwgYmUgYXZhaWxhYmxlIG9uIE9QQU0gb25jZSBpdHMg Y2FjaGUgaXMgc3luY2hyb25pemVkIChzbyB0b21vcnJvdyk6DQo8Y29kZT5vcGFtIGluc3RhbGwg b2NhbWwtcGFyaTwvY29kZT4uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5PQ2Ft bCBjb21waWxlciBwcm9qZWN0L2NvbnRyaWJ1dGlvbiBpZGVhczwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY29tcGlsZXItcHJvamVjdC1jb250cmlidXRpb24t aWRlYXMvMTMxNjUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY29tcGls ZXItcHJvamVjdC1jb250cmlidXRpb24taWRlYXMvMTMxNjUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMWY3YmJiYSIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzFmN2JiYmEiPmdhc2NoZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFmN2JiYmEiPg0KPHA+V2UgY29tcGlsZXIgbWFp bnRhaW5lcnMgd2VyZSByZWNlbnRseSBhcHByb2FjaGVkIGJ5IHN0dWRlbnRzIGxvb2tpbmcgZm9y IGEgY29udHJpYnV0aW9uIHRvIHRoZSBPQ2FtbCBjb21waWxlciB0aGF0IHdvdWxkIGJlIGFwcHJv cHJpYXRlIGZvciB0aGVpciBmaW5hbCB5ZWFyIHByb2plY3QuIFdlIHRob3VnaHQgb2YgYSBjb3Vw bGUgY29udHJpYnV0aW9uIHRvcGljcywgYnV0IGluIHRoZSBlbmQgdGhlIHN0dWRlbnRzIGRlY2lk ZWQgdG8gd29yaw0KIG9uIHNvbWV0aGluZyBlbHNlLiBJIHR1cm5lZCBvdXIgcHJvamVjdCBpZGVh cyBpbnRvIGdpdGh1Yi9vY2FtbCBpc3N1ZXM7IGlmIHlvdSB3ZXJlIGxvb2tpbmcgZm9yIGEgbWVk aXVtLXNpemUgcHJvamVjdCB0byBjb250cmlidXRlIHRvIHRoZSBPQ2FtbCBjb21waWxlciBjb2Rl YmFzZSwgeW91IG1heSBiZSBpbnRlcmVzdGVkIGluIHNvbWUgb2YgdGhlbS4NCjwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5zbWFsbCB0YXNrOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNjI5Ij5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyNjI5PC9hPg0KPC9saT48bGk+bWVkaXVtLXNpemVkIHRhc2s6IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2MzAiPmh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2MzA8L2E+DQo8L2xpPjxsaT5tZWRpdW0tc2l6 ZWQgdGFzazogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8x MjYzMSI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjYzMTwvYT4NCjwv bGk+PGxpPmxhcmdlciB0YXNrOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyNjMyIj5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEy NjMyPC9hPg0KPC9saT48bGk+Y2hvb3NlLXRoZS1zaXplIHRhc2s6IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTI2MzMiPmh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvMTI2MzM8L2E+DQo8L2xpPjwvdWw+DQo8cD5MZXQgbWUgdXNlIHRo aXMgb2NjYXNpb24gdG8gcmVtaW5kIHBlb3BsZSB0aGF0IHdlIGhhdmUgdGFnZ2VkIHNvbWUgaXNz dWVzIGFzIOKAnG5ld2NvbWVyIGpvYnPigJ0sIHdoaWNoIG1heSBiZSBnb29kIGVudHJ5IHBvaW50 IHRvIGNvbnRyaWJ1dGUgdG8gdGhlIGNvbXBpbGVyLg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9sYWJlbHMvbmV3 Y29tZXItam9iIj5uZXdjb21lciBqb2JzPC9hPiBmb3IgcmVsYXRpdmVseSBlYXN5IHRhc2tzDQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvbGFiZWxzL25l d2NvbWVyLWpvYi1hZHZhbmNlZCI+YWR2YW5jZWQgbmV3Y29tZXIgam9iczwvYT4gZm9yIGhhcmRl ciB0YXNrcyAobW9yZSB3b3JrLCBvciByZXF1aXJlcyBnb29kIGV4cGVydGlzZSBpbiB0aGUgbGFu Z3VhZ2Ugb3IgbGVhcm5pbmcgdGVjaG5pY2FsIGFzcGVjdHMgb2YgaG93IHRoZSBjb21waWxlciB3 b3JrcykNCjwvbGk+PC91bD4NCjxwPlBsZWFzZSBmZWVsIGZyZWUgb2YgY291cnNlIHRvIGFzayBh bnkgcXVlc3Rpb24sIG1ha2Ugc3VnZ2VzdGlvbnMgZXRjLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iNCI+UHB4bGliIDAuMzEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLXBweGxpYi0wLTMxLTAvMTMxNzAvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1wcHhsaWItMC0zMS0wLzEzMTcwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzhiNzYzZTMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc4Yjc2M2UzIj5Tb25qYSBIZWluemUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4Yjc2M2UzIj4NCjxwPldl4oCZcmUgaGFwcHkg dG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgPGNvZGU+UHB4bGliPC9jb2RlPiAwLjMxLjAuIDwv cD4NCjxwPlRoaXMgPGNvZGU+UHB4bGliPC9jb2RlPiByZWxlYXNlIGZpeGVzIGEgYnVnIGluIHRo ZSBzdXBwb3J0IG9mIE9DYW1sIDUuMS4wLiBCZWZvcmUgdGhhdCBidWcgZml4LCB0aGUgd2Fybmlu Z3MgYWJvdXQgYSBnZW5lcmF0aXZlL2FwcGxpY2F0aXZlIG1pc21hdGNoIGJldHdlZW4gYSBmdW5j dG9yIGNyZWF0aW9uIGFuZCBpdHMgYXBwbGljYXRpb24gaW50cm9kdWNlZCBieSBPQ2FtbCA1LjEu MCB3ZXJlIGFsc28gdHJpZ2dlcmVkIHdoZW4gdGhhdCBtaXNtYXRjaA0KIGRpZG7igJl0IGV4aXN0 LiA8L3A+DQo8cD5GdXJ0aGVybW9yZSwgdGhlIHJlbGVhc2UgY29udGFpbnMgYSBjb3VwbGUgb2Yg YnVnIGZpeGVzIGluIHRoZSBjb250ZXh0IG9mIGF0dHJpYnV0ZXMuDQo8L3A+DQo8cD5XZeKAmXJl IGFsc28gZXhjaXRlZCBhYm91dCB0d28gbWFpbiBlbmhhbmNlbWVudHMuIE9uZSBhbGxvd3MgYXV0 aG9ycyBvZiBleHRlbnNpb24gbm9kZSByZXdyaXRlcnMgdG8gYWRkIGEgcGF0aCBhcmd1bWVudCB0 byB0aGUgZXh0ZW5zaW9uIG5vZGUuIFRoYXTigJlzIGV4Y2VsbGVudCBmb3IgaHlnaWVuZSBzaW5j ZSBpdCBhbGxvd3MgdGhlIFBQWCB0byBiZSBleHBsaWNpdCBhYm91dCBtb2R1bGVzIHJhdGhlciB0 aGFuIGRlcGVuZGluZyBvbiBpdHMgc2NvcGUuDQo8L3A+DQo8cD5UaGUgb3RoZXIgbWFpbiBlbmhh bmNlbWVudCBhbGxvd3MgYW4gb3B0LWluIGZvciBjb21waWxlciB3YXJuaW5ncyBhYm91dCB1bnVz ZWQgY29kZSBnZW5lcmF0ZWQgYnkgZGVyaXZlcnMgKHdhcm5pbmdzIHczMiBhbmQgdzYwKS4gVGhh dCBvcHRpbmcgaW4gbmVlZHMgdG8gaGFwcGVuIG9uIGJvdGggc2lkZXMgb2YgdGhlIGRlcml2ZXIs IHRoZSB3cml0ZXIgc2lkZSBhbmQgdGhlIHVzZXIgc2lkZS4gT3B0aW5nIGluIHRvIHRob3NlIGNv ZGUgd2FybmluZ3MNCiB3aWxsIGhlbHAgdG8gY2xlYW4gdXAgdW51c2VkIGNvZGUsIGxlYWRpbmcg dG8gcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGluIGNvbXBpbGF0aW9uIGFuZCBlZGl0b3Igc3Vw cG9ydC4NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaXggc3VwcG9ydCBmb3IgT0Nh bWwgNS4xOiBtaWdyYXRlZCBjb2RlIHByZXNlcnZlcyBnZW5lcmF0aXZlIGZ1bmN0b3Igd2Fybmlu Z3MsIHdpdGhvdXQgY3JlYXRpbmcgbW9yZS4gTG9jYXRpb25zIGFyZSBiZXR0ZXIgcHJlc2VydmVk LiAoIzQzMiwgQHBpdGFnLWhhLCBAcGFuZ2xlc2QpDQo8L2xpPjxsaT5Ecml2ZXI6IEFkZCA8Y29k ZT4tdW51c2VkLWNvZGUtd2FybmluZ3M8L2NvZGU+IGNvbW1hbmQtbGluZSBmbGFnLiAoIzQ0NCwg QGNlYXN0bHVuZCkNCjwvbGk+PGxpPkFkZCA8Y29kZT4/d2FybmluZzwvY29kZT4gZmxhZyB0byA8 Y29kZT5EZXJpdmluZy5HZW5lcmF0b3IubWFrZTwvY29kZT4uICgjNDQwLCBAamFja3NvbnpvdTEy MyB2aWEgQGNlYXN0bHVuZCkNCjwvbGk+PGxpPlJlc3RvcmUgdGhlIOKAnHBhdGhfYXJn4oCdIGZ1 bmN0aW9uYWxpdHkgaW4gdGhlIFYzIEFQSSAoIzQzMSwgQEVMTElPVFRDQUJMRSkgPC9saT48bGk+ RXhwb3NlIG1pZ3JhdGlvbi9jb3B5aW5nL2V0Yy4gZnVuY3Rpb25zIGZvciBhbGwgQVNUIHR5cGVz IG5lZWRlZCBieSA8Y29kZT5QcHJpbnRhc3Q8L2NvZGU+ICgjNDU0LCBAYW50YWxzeikNCjwvbGk+ PGxpPlByZXNlcnZlIHF1b3RlZCBhdHRyaWJ1dGVzIG9uIGFudGlxdW90ZXMgaW4gbWV0YXF1b3Qg KCM0NDEsIEBuY2lrLXJvYmVydHMpIDwvbGk+PGxpPkF0dHJpYnV0ZSBuYW1lc3BhY2VzOiBGaXgg c2VtYW50aWNzIG9mIHJlc2VydmluZyBtdWx0aS1jb21wb25lbnQgbmFtZXNwYWNlcyAoIzQ0Mywg QG5jaWstcm9iZXJ0cykNCjwvbGk+PC91bD4NCjxwPlBEOiBZb3UgY2FuIGFsc28gZmluZCB0aGVz ZSByZWxlYXNlIG5vdGVzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vs b2ciPg0Kb2NhbWwub3JnIGNoYW5nZWxvZzwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSI1Ij5kdW5lIDMuMTEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWR1bmUtMy0xMS0wLzEzMTczLzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tZHVuZS0zLTExLTAvMTMxNzMvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnOGIwYjJjOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzhi MGIyYzkiPkV0aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnOGIwYjJjOSI+DQo8cD5UaGUgRHVuZSB0ZWFtIGlzIHBsZWFz ZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRHVuZSAzLjExIDxhIGhyZWY9Imh0dHBzOi8v ZW4ud2lraXBlZGlhLm9yZy93aWtpL1dpbmRvd3NfMy4xeCNXaW5kb3dzX2Zvcl9Xb3JrZ3JvdXBz XzMuMTEiPg0K4oCcZm9yIHdvcmtncm91cHPigJ08L2E+LiA8L3A+DQo8cD5IZXJlIGlzIHRoZSBj aGFuZ2Vsb2c6IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMmRi OWVlZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzJkYjllZWQiPkFkZGVkPC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcyZGI5ZWVkIj4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48Y29kZT5lbmFibGVkX2lmPC9jb2RlPiBub3cgc3VwcG9ydHMg PGNvZGU+YXJjaF9zaXh0eWZvdXI8L2NvZGU+IHZhcmlhYmxlICgjODAyMywgZml4ZXMgIzc5OTcs IEBBbGl6dGVyKQ0KPC9saT48bGk+RXhwZXJpbWVudGFsOiBBZGRlZCBhIDxjb2RlPiQgZHVuZSBt b25pdG9yPC9jb2RlPiBjb21tYW5kIHRoYXQgY2FuIGNvbm5lY3QgdG8gYSBydW5uaW5nDQo8Y29k ZT5kdW5lIGJ1aWxkPC9jb2RlPiBpbiB3YXRjaCBtb2RlIGFuZCBkaXNwbGF5IHRoZSBlcnJvcnMg YW5kIHByb2dyZXNzLiAoIzgxNTIsIEBBbGl6dGVyKQ0KPC9saT48bGk+VGhlIDxjb2RlPnByb2dy ZXNzPC9jb2RlPiBSUEMgcHJvY2VkdXJlIG5vdyBoYXMgYW4gZXh0cmEgZmllbGQgZm9yIHRoZSA8 Y29kZT4NCkluX3Byb2dyZXNzPC9jb2RlPiBjb25zdHJ1Y3RvciBmb3IgdGhlIG51bWJlciBvZiBm YWlsZWQgam9icy4gKCM4MjEyLCBAQWxpenRlcikgPC9saT48bGk+QWRkIGEgPGNvZGU+LS1wcmV2 aWV3PC9jb2RlPiBmbGFnIHRvIDxjb2RlPmR1bmUgZm10PC9jb2RlPiB3aGljaCBjYXVzZXMgaXQg dG8gcHJpbnQgb3V0IHRoZSBjaGFuZ2VzIGl0IHdvdWxkIG1ha2Ugd2l0aG91dCBhcHBseWluZyB0 aGVtICgjODI4OSwgQGdyaWRidWdzKQ0KPC9saT48bGk+SW50cm9kdWNlIDxjb2RlPihzb3VyY2Vf dHJlZXMgLi4pPC9jb2RlPiB0byB0aGUgaW5zdGFsbCBzdGFuemEgdG8gYWxsb3cgaW5zdGFsbGlu ZyBlbnRpcmUgc291cmNlIHRyZWVzLiAoIzgzNDksIEByZ3JpbmJlcmcpDQo8L2xpPjxsaT5BZGQg PGNvZGU+LS1zdG9wLW9uLWZpcnN0LWVycm9yPC9jb2RlPiBvcHRpb24gdG8gPGNvZGU+ZHVuZSBi dWlsZDwvY29kZT4gd2hpY2ggd2lsbCB0ZXJtaW5hdGUgdGhlIGJ1aWxkIHdoZW4gdGhlIGZpcnN0 IGVycm9yIGlzIGVuY291bnRlcmVkLiAoIzg0MDAsIEBwbXdoaXRlIGFuZCBAQWxpenRlcikNCjwv bGk+PGxpPkR1bmUgbm93IGRpc3BsYXlzIHRoZSBudW1iZXIgb2YgZXJyb3JzIHdoZW4gd2FpdGlu ZyBmb3IgY2hhbmdlcyBpbiB3YXRjaCBtb2RlLiAoIzg0MDgsIGZpeGVzICM2ODg5LCBAQWxpenRl cikNCjwvbGk+PGxpPkFkZCA8Y29kZT53aXRoX3ByZWZpeDwvY29kZT4ga2V5d29yZCBmb3IgY2hh bmdpbmcgdGhlIHByZWZpeCBvZiB0aGUgZGVzdGluYXRpb24gb2YgaW5zdGFsbGVkIGZpbGVzIG1h dGNoZWQgYnkgZ2xvYnMuICgjODQxNiwgQGdyaWRidWdzKQ0KPC9saT48bGk+QWRkZWQgZXhwZXJp bWVudGFsIDxjb2RlPi0tZGlzcGxheSB0dWk8L2NvZGU+IG9wdGlvbiBmb3IgRHVuZSB0aGF0IG9w ZW5zIGFuIGludGVyYWN0aXZlIFRlcm1pbmFsIFVzZXIgSW50ZXJmYWNlIChUVUkpIHdoZW4gRHVu ZSBpcyBydW5uaW5nLiBQcmVzcyDigJk/4oCZIHRvIG9wZW4gdXAgYSBoZWxwIHNjcmVlbiB3aGVu IHJ1bm5pbmcgZm9yIG1vcmUgaW5mb3JtYXRpb24uICgjODQyOSwgQEFsaXp0ZXIgYW5kIEByZ3Jp bmJlcmcpDQo8L2xpPjxsaT5BZGQgYSA8Y29kZT53YXJuaW5nczwvY29kZT4gZmllbGQgdG8gPGNv ZGU+ZHVuZS1wcm9qZWN0PC9jb2RlPiBmaWxlcyBhcyBhIHVuaWZpZWQgbWVjaGFuaXNtIHRvIGVu YWJsZSBvciBkaXNhYmxlIGR1bmUgd2FybmluZ3MgKEByZ3JpbmJlcmcsIDg0NDgpDQo8L2xpPjxs aT48Y29kZT5kdW5lIGV4ZWM8L2NvZGU+OiBzdXBwb3J0IHN5bnRheCBsaWtlIDxjb2RlPiV7Ymlu OnByb2dyYW19PC9jb2RlPi4gVGhpcyBjYW4gYXBwZWFyIGFueXdoZXJlIGluIHRoZSBjb21tYW5k IGxpbmUsIHNvIHRoaW5ncyBsaWtlDQo8Y29kZT5kdW5lIGV4ZWMgdGltZSAle2Jpbjpwcm9ncmFt fTwvY29kZT4gbm93IHdvcmsuICgjNjAzNSwgIzg0NzQsIGZpeGVzICMyNjkxLCBAZW1pbGxvbiwg QExlb25pZGFzLWZyb20tWElWKQ0KPC9saT48bGk+QWRkIGEgbmV3IGFsaWFzIDxjb2RlPkBkb2Mt anNvbjwvY29kZT4gdG8gYnVpbGQgb2RvYyBkb2N1bWVudGF0aW9uIGluIEpTT04gZm9ybWF0LiBU aGlzIG91dHB1dCBjYW4gYmUgY29uc3VtZWQgYnkgZXh0ZXJuYWwgdG9vbHMuICgjODE3OCwgQGVt aWxsb24pDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnYWE1YzZiMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2FhNWM2YjMi PkNoYW5nZWQgYW5kIGZpeGVkPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmdhYTVjNmIzIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Vc2UgPGNvZGU+cG9z aXhfc3Bhd248L2NvZGU+IGluc3RlYWQgb2YgPGNvZGU+Zm9yazwvY29kZT4gb24gTWFjT1MuIFRo aXMgZ2l2ZXMgdXMgYSBwZXJmb3JtYW5jZSBib29zdCBhbmQgYWxsb3dzIHVzIHRvIHJlLWVuYWJs ZSB0aHJlYWQuICgjODA5MCwgQHJncmluYmVyZykNCjwvbGk+PGxpPk1vZHVsZXMgdGhhdCB3ZXJl IGRlY2xhcmVkIGluIDxjb2RlPihtb2R1bGVzX3dpdGhvdXRfaW1wbGVtZW50YXRpb24pPC9jb2Rl PiwgPGNvZGU+DQoocHJpdmF0ZV9tb2R1bGVzKTwvY29kZT4gb3IgPGNvZGU+KHZpcnR1YWxfbW9k dWxlcyk8L2NvZGU+IGJ1dCBub3QgZGVjbGFyZWQgaW4gPGNvZGU+DQoobW9kdWxlcyk8L2NvZGU+ IHdpbGwgcmFpc2UgYW4gZXJyb3IuICgjNzY3NCwgQEFsaXp0ZXIpIDwvbGk+PGxpPk5vIGxvbmdl ciBlbWl0IGxpbmtvcHRzKGphdmFzY3JpcHQpIGluIE1FVEEgZmlsZXMgKCM4MTY4LCBAaGh1Z28p IDwvbGk+PGxpPlJQQyBtZXNzYWdlIHN0eWxlcyBhcmUgbm93IHNlcmlhbGlzZWQgbWVhbmluZyB0 aGF0IFJQQyBkaWFnbm9zdGljcyBrZWVwIHRoZWlyIEFuc2kgc3R5bGluZy4gKCM4NTE2LCBmaXhl cyAjNjkyMSwgQEFsaXp0ZXIpDQo8L2xpPjxsaT5UcnVuY2F0ZSBvdXRwdXQgZnJvbSBhY3Rpb25z IHRoYXQgcHJvZHVjZSB0b28gbXVjaCBvdXRwdXQgKEB0b3YsICM4MzUxKSA8L2xpPjxsaT5BbGxv dyBsaWJyYXJpZXMgdG8gc2hhZG93IE9DYW1sIGJ1aWx0aW4gbGlicmFyaWVzLiBQcmV2aW91c2x5 LCBidWlsdGluIGxpYnJhcmllcyB3b3VsZCBhbHdheXMgdGFrZSBwcmVjZWRlbmNlLiAoQHJncmlu YmVyZywgIzg1NTgpDQo8L2xpPjxsaT48Y29kZT5kdW5lIHV0b3A8L2NvZGU+IG5vIGxvbmdlciBs aW5rcyA8Y29kZT51dG9wPC9jb2RlPiBpbiDigJxjdXN0b23igJ0gbW9kZSwgd2hpY2ggc2hvdWxk IG1ha2UgdGhpcyBjb21tYW5kIGNvbnNpZGVyYWJseSBmYXN0ZXIuICgjODYzMSwgZml4ZXMgIzY4 OTQsIEBub2piKQ0KPC9saT48bGk+RW5zdXJlIHRoYXQgcGFja2FnZSBuYW1lcyBpbiA8Y29kZT5k dW5lLXByb2plY3Q8L2NvZGU+IGFyZSB2YWxpZCBvcGFtIHBhY2thZ2UgbmFtZXMuICgjODMzMSwg QGVtaWxsb24pDQo8L2xpPjxsaT5pbml0OiBjaGVjayB0aGF0IG1vZHVsZSBuYW1lcyBhcmUgdmFs aWQgKCM4NjQ0LCBmaXhlcyAjODI1MiwgQGVtaWxsb24pIDwvbGk+PGxpPmR1bmUgaW5pdDogcGFy c2UgPGNvZGU+LS1wdWJsaWM8L2NvZGU+IGFzIGEgcHVibGljIG5hbWUgKCM4NjAzLCBmaXhlcyAj NzEwOCwgQGVtaWxsb24pDQo8L2xpPjxsaT5TdG9wIHNpZ25pbmcgc291cmNlIGZpbGVzIHdpdGgg c3Vic3RpdHV0aW9ucy4gU2lnbiBvbmx5IGJpbmFyaWVzIGluc3RlYWQgKCM4MzYxLCBmaXhlcyAj ODM2MCwgQGFubW9udGVpcm8pDQo8L2xpPjxsaT5NYWtlIGNvcHkgc2FuZGJveCBzdXBwb3J0IGRp cmVjdG9yeSB0YXJnZXRzLiAoIzg3MDUsIGZpeGVzICM3NzI0LCBAZW1pbGxvbikgPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE5ZjZlOWYi IGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcxOWY2ZTlmIj5EZXByZWNhdGVkIGFuZCBy ZW1vdmVkPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxOWY2 ZTlmIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5EZXByZWNhdGUgaW5zdGFsbCBkZXN0aW5h dGlvbiBwYXRocyBiZWdpbm5pbmcgd2l0aCDigJwuLuKAnSB0byBwcmV2ZW50IHBhY2thZ2VzIGVz Y2FwaW5nIHRoZWlyIGRlc2lnbmF0ZWQgaW5zdGFsbGF0aW9uIGRpcmVjdG9yaWVzLiAoIzgzNTAs IEBncmlkYnVncykNCjwvbGk+PGxpPlJlbW92ZSB3YXJuaW5nIGFnYWluc3QgPGNvZGU+LmR1bmU8 L2NvZGU+IGZpbGVzIGdlbmVyYXRlZCBieSBwcmUgZHVuZSAyLjAgKCM4NjExLCBAcmdyaW5iZXJn KQ0KPC9saT48bGk+UmVtb3ZlIHZlcnNpb25zIDAuMSBhbmQgMC4yIG9mIHRoZSBleHBlcmltZW50 YWwgY3R5cGVzIGV4dGVuc2lvbi4gKCM4MjkzLCBAZW1pbGxvbikNCjwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPkFycmFraXM6IEEgbmV3IFJJU0MtViBzaW11 bGF0b3I8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FycmFraXMtYS1u ZXctcmlzYy12LXNpbXVsYXRvci8xMzE3Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hcnJha2lzLWEtbmV3LXJpc2Mtdi1zaW11bGF0b3IvMTMxNzYvMTwvYT4gPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwNDc3NmNhIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnMDQ3NzZjYSI+VmFsb3JhbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzA0Nzc2Y2EiPg0KPHA+SeKAmXZlIGJlZW4g d29ya2luZyB3aXRoIGEgZnJpZW5kIG9uIGEgbmV3IFJJU0MtViBzaW11bGF0b3IgY2FsbGVkIEFy cmFraXMsIGFuZCB3ZSBqdXN0IGRpZCBvdXIgZmlyc3QgcmVsZWFzZSENCjwvcD4NCjxwPk1vc3Qg b2YgdGhlIGZlYXR1cmVzIGFyZSBsaXN0ZWQgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFi LmNvbS92YWxvcmFuTS9hcnJha2lzIj4NClJFQURNRTwvYT4sIGJ1dCBpZiB5b3UgYXJlIGludGVy ZXN0ZWQsIGhlcmUgaXMgYSBxdWljayBzdW1tYXJ5OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+RnVsbCBSVjMySU0gSW5zdHJ1Y3Rpb24gc2V0IDwvbGk+PGxpPkRpZmZlcmVudCB0eXBl IG9mIGVudmlyb25tZW50YWwgY2FsbCBzdXBwb3J0IChVTklYIGFuZCBWZW51cykgPC9saT48bGk+ UGFydGlhbCBHTlUgPGNvZGU+YXM8L2NvZGU+IGFzc2VtYmxlciBkaXJlY3RpdmUgPC9saT48bGk+ QSBkZWJ1Z2dpbmcgc3lzdGVtIHVzaW5nIGJyZWFrcG9pbnQgPC9saT48L3VsPg0KPHA+VGhlcmUg aXMgY3VycmVudGx5IG9ubHkgYSB0ZXJtaW5hbCBpbnRlcmZhY2UsIGJ1dCB3ZSBoYXZlIGFscmVh ZHkgaW1wbGVtZW50ZWQgYSBVTklYIHNvY2tldCB0byBtYWtlIGl0IGVhc3kgdG8gZGV2ZWxvcCBw bHVnaW4gdG8gaW50ZWdyYXRlIGl0IHRvIG90aGVyIGRldmVsb3BtZW50IGVudmlyb25tZW50IChX ZSBhcmUgY3VycmVudGx5IHdvcmtpbmcgb24gYSBWaW0gcGx1Z2luKQ0KPC9wPg0KPHA+QXMgaXQg aXMgb3VyIGZpcnN0IHJlbGVhc2UsIHRoZXkgbWF5IHN0aWxsIGJlIHNvbWUgaXNzdWUsIGJ1dCB0 aGUgc2ltdWxhdG9yIGlzIGFscmVhZHkgcXVpdGUgdXNhYmxlLg0KPC9wPg0KPHA+VGhlIGNvbXBs ZXRlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBwcm9qZWN0IGlzIGF2YWlsYWJsZSA8YSBocmVmPSJo dHRwczovL2dpdGxhYi5jb20vdmFsb3Jhbk0vYXJyYWtpcy8tL3dpa2lzL2hvbWUiPg0KaGVyZTwv YT4gPC9wPg0KPHA+V2Ugd291bGQgYmUgbW9yZSB0aGFuIGhhcHB5IHRvIHJlY2VpdmUgYW55IGZl ZWRiYWNrLCBzbyBwbGVhc2UgZmVlbCBmcmVlIHRvIHRlc3QgaXQgYW5kIG9wZW4gYW4gaXNzdWUg aWYgeW91IGZpbmQgc29tZXRoaW5nIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Ijci PldlYiBBbmFseXRpY3Mgb24gT0NhbWwub3JnPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC93ZWItYW5hbHl0aWNzLW9uLW9jYW1sLW9yZy8xMzE4OC8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC93ZWItYW5hbHl0aWNzLW9uLW9jYW1sLW9yZy8xMzE4OC8xPC9h PiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2RmNGVjYzYiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkZjRlY2M2Ij5UaGliYXV0IE1hdHRpbyBzYWlk LCBzdGFydGluZyBhIGRpc2N1c3Npb248L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2RmNGVjYzYiPg0KPHA+QXMgeW914oCZdmUgd2l0bmVzc2VkLCB0aGUgT0Nh bWwub3JnIHRlYW0gaGFzIGJlZW4gaGFyZCBhdCB3b3JrIHRvIG1ha2UgdGhlIHNpdGUgdGhlIGJl c3QgcmVzb3VyY2UgdG8gbGVhcm4gT0NhbWwgYW5kIGRpc2NvdmVyIHRoZSBlY29zeXN0ZW0uDQo8 L3A+DQo8cD5TaW5jZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Yz LW9jYW1sLW9yZy13ZS1hcmUtbGl2ZS85NzQ3Ij4NCmxhdW5jaCBvZiBWMzwvYT4gaW4gQXByaWwg bGFzdCB5ZWFyLCB3ZeKAmXZlIHJldmFtcGVkIHRoZSBjZW50cmFsaXNlZCBkb2N1bWVudGF0aW9u IHNpdGUgYmFzZWQgb24gY29tbXVuaXR5IGZlZWRiYWNrLCBhbmQgd2XigJlyZSBjdXJyZW50bHkg ZG9pbmcgdGhlIHNhbWUgZm9yIHRoZSBMZWFybiBhcmVhIGFuZCB0aGUgZG9jdW1lbnRhdGlvbi4g V2XigJlyZSBwbGFubmluZyB0byByZXZpc2l0IHRoZSBCbG9nIGFuZCBDb21tdW5pdHkgc2VjdGlv bnMgbmV4dC4NCjwvcD4NCjxwPldoaWxlIHdl4oCZcmUgcmVjZWl2aW5nIHRvbnMgb2YgcXVhbGl0 YXRpdmUgZmVlZGJhY2sgdGhhdCBpbmRpY2F0ZXMgdGhhdCB3ZeKAmXJlIG1vdmluZyBpbiB0aGUg cmlnaHQgZGlyZWN0aW9uLCBpdOKAmXMgYmVlbiBhIGNoYWxsZW5nZSB0byBtZWFzdXJlIHRoZSBp bXBhY3Qgb2YgdGhlIGRlY2lzaW9ucyB3ZSB0YWtlLiBBcmUgdXNlcnMgb2YgdGhlIHNpdGUgYWJs ZSB0byBmaW5kIHRoZSBTdGFuZGFyZCBMaWJyYXJ5IGRvY3VtZW50YXRpb24gbW9yZSBlYXNpbHk/ DQogSG93IG1hbnkgdXNlcnMgd2hvIGluc3RhbGwgT0NhbWwgZW5kIHVwIHJlYWRpbmcgdGhlIGRv Y3VtZW50YXRpb24/IEFyZSBwZW9wbGUgdXNpbmcgdGhlIG5ldw0KPGEgaHJlZj0iaHR0cHM6Ly9v Y2FtbC5vcmcvY2hhbmdlbG9nIj5PQ2FtbCBDaGFuZ2Vsb2c8L2E+IGFuZCB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvam9icyI+DQpKb2IgYm9hcmQ8L2E+PyBBIGxvdCBvZiBxdWVzdGlv bnMgYXJlIGN1cnJlbnRseSBkaWZmaWN1bHQgdG8gYW5zd2VyIGFuZCB3b3VsZCBhbGxvdyB1cyB0 byBtYWtlIGJldHRlciBkZWNpc2lvbnMgdG8gaW1wcm92ZSB0aGUgZXhwZXJpZW5jZSBvbiB0aGUg c2l0ZS4NCjwvcD4NCjxwPldoZW4gd2UgbGF1bmNoZWQgdGhlIHNpdGUsIHdlIG1hZGUgYSBzdHJv bmcgY29tbWl0bWVudCB0byA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wb2xpY2llcy9wcml2 YWN5LXBvbGljeSI+DQpwcm90ZWN0IHVzZXJz4oCZIHByaXZhY3k8L2E+LiBXZSByZWZ1c2UgdG8g dXNlIGNvb2tpZXMsIHdlIGFyZSBub3QgdXNpbmcgYW55IGV4dGVybmFsIHNlcnZpY2UgdGhhdCBt aWdodCBjb2xsZWN0IHlvdXIgZGF0YSwgd2XigJlyZSB2ZW5kb3JpbmcgZXZlcnkgSmF2YVNjcmlw dCBhbmQgYXNzZXQgc28gYXMgdG8gbm90IHVzZSBleHRlcm5hbCBDRE4sIGFuZCB3ZeKAmXJlIG5v dCBydW5uaW5nIGFueSB3ZWIgYW5hbHl0aWNzLg0KPC9wPg0KPHA+V2XigJlyZSBzdGlsbCB1bndh dmVyaW5nbHkgY29tbWl0dGVkIHRvIHByb3RlY3RpbmcgT0NhbWwub3Jn4oCZcyB2aXNpdG9yc+KA mSBwcml2YWN5LiBUbyBhZGRyZXNzIG91ciBsYWNrIG9mIGRhdGEgb24gdGhlIHNpdGXigJlzIHVz YWdlIHdoaWxlIHJlc3BlY3RpbmcgdGhlIHByaW5jaXBsZXMgd2XigJl2ZSBhZG9wdGVkLCB3ZeKA mXZlIHNlbGVjdGVkDQo8YSBocmVmPSJodHRwczovL3BsYXVzaWJsZS5pby8iPlBsYXVzaWJsZTwv YT4gYXMgYSBwb3NzaWJsZSB3YXkgdG8gZ2V0IHVzYWdlIHN0YXRpc3RpY3MuDQo8L3A+DQo8cD5Q bGF1c2libGUgaXMgYSA8YSBocmVmPSJodHRwczovL3BsYXVzaWJsZS5pby9wcml2YWN5LWZvY3Vz ZWQtd2ViLWFuYWx5dGljcyI+cHJpdmFjeS1mb2N1c2VkPC9hPiB3ZWIgYW5hbHl0aWNzIHNlcnZp Y2UuIEl0IGRvZXNu4oCZdCB1c2UgY29va2llcywgZG9lc27igJl0IGNvbGxlY3QgYW55IHBlcnNv bmFsIGRhdGEsIGFuZCBpcyBmdWxseSBjb21wbGlhbnQgd2l0aCBHRFBSLCBDQ1BBIGFuZCBQRUNS Lg0KPC9wPg0KPHA+V2UgcGxhbiBvbiByb2xsaW5nIG91dCBQbGF1c2libGUgZm9yIE9DYW1sLm9y ZyBpbiB0aGUgY29taW5nIHdlZWtzLiA8L3A+DQo8cD5EbyB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25z IG9yIGNvbmNlcm5zIHdpdGggdXNpbmcgUGxhdXNpYmxlIG9uIE9DYW1sLm9yZz8gPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPkEgUm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBsYXRmb3Jt IC0gU2Vla2luZyBZb3VyIEZlZWRiYWNrPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hLXJvYWRtYXAtZm9yLXRoZS1vY2FtbC1wbGF0Zm9ybS1zZWVraW5nLXlvdXItZmVl ZGJhY2svMTIyMzgvNjIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Etcm9hZG1hcC1m b3ItdGhlLW9jYW1sLXBsYXRmb3JtLXNlZWtpbmcteW91ci1mZWVkYmFjay8xMjIzOC82MjwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjlmYWU5ZiIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2I5ZmFlOWYiPkRlZXAgaW4gdGhpcyB0aHJlYWQs IFhhdmllciBMZXJveSBzYWlkIGFuZCBBbmlsIE1hZGhhdmFwZWRkeSByZXBsaWVkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiOWZhZTlmIj4NCjxibG9ja3F1 b3RlPg0KPHA+SSBhZ3JlZSB0aGF0IGFuIGludGVncmF0ZWQgdG9vbCBjYW4gaGF2ZSBiZXR0ZXIg cGVyZm9ybWFuY2UgdGhhbiBhIGNvbGxlY3Rpb24gb2Ygc3RhbmRhbG9uZSB0b29scyB1c2VkIHZp YSB0aGVpciBDTElzLiBCdXQgdGhpcyBpcyBub3QgYSB2YWxpZCByZWFzb24gdG8ga2lsbCB0aGUg c3RhbmRhbG9uZSB0b29scyBhbmQgdGhlaXIgQ0xJcyEgSXTigJlzIGZvciBlbmQtdXNlcnMgdG8g Y2hvb3NlIGJldHdlZW4gdGhlIGZhc3QgaW50ZWdyYXRlZCB0b29sDQogd2l0aCBpdHMgZml4ZWQg d29ya2Zsb3cgYW5kIHRoZSBwZXJoYXBzIHNsb3dlciBidXQgbW9yZSBmbGV4aWJsZSBzdGFuZGFs b25lIHRvb2xzIHRoYXQgc3VwcG9ydCB0aGUgdXNlcnPigJkgcHJlZmVycmVkIHdvcmtmbG93Lg0K PC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+SSBmZWFyIEkgbWF5IGJlIHBhcnRseSByZXNwb25zaWJs ZSBmb3IgdGhlIOKAmWtpbGxpbmcgdGhlIENMSeKAmSBwYXJ0IG9mIHRoaXMsIGFzIEkgZmlyc3Qg ZGVtb25zdHJhdGVkIGEgcmVhbGx5IGVhcmx5IGludGVncmF0ZWQgcHJvdG90eXBlIGJhY2sgaW4g YQ0KPGEgaHJlZj0iaHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdy84M0FOamd1Z1hSdEo3QUNOUmFw c1FlP3N0YXJ0PTI3bTNzIj5PeGZvcmQgT0NhbWwgV29ya3Nob3AgcHJlc2VudGF0aW9uPC9hPi4g QWxsb3cgbWUgdG8gYmUgcmVhbGx5IGNsZWFyIG9uIG15IHBvc2l0aW9uIGhlcmUgdG9kYXk6DQo8 Yj5hbnkgQ0xJIHRoYXQgaXMgcmVsZWFzZWQgYXMgcGFydCBvZiBPQ2FtbCBQbGF0Zm9ybSB0b29s aW5nIGFuZCBoYXMgdXNlcnMgaXMgb25lIHdlIHRyeSByZWFsbHkgaGFyZCB0byBtYWludGFpbjwv Yj4sIGFzIHRoYXQgQ0xJIGlzIHZlcnkgb2Z0ZW4gYWxyZWFkeSBpbnRlZ3JhdGVkIGludG8gYnVp bGQgc2NyaXB0cyAoYW5kIHdpbGwgdGh1cyBicmVhayBzb21lIG9wYW0gcGFja2FnZXMgdGhhdCBh cmUgYWxyZWFkeSByZWxlYXNlZCwgYW5kIHdlDQogZG8gdHJ5IHNvIGhhcmQgdG8ga2VlcCB0aG9z ZSBidWlsZGluZyBvdmVyIHRpbWUgd2l0aG91dCB1cHBlciBib3VuZHMpLiA8L3A+DQo8cD5CYWNr IHdoZW4gSSBzdGFydGVkIHByb3RvdHlwaW5nIHRoZSBpbnRlZ3JhdGVkIENMSSBpbiAyMDE3LCBP Q2FtbCB3YXMgcG9zc2libHkgYXQgaXRzIGxvd2VzdCBwb2ludCBpbiB0ZXJtcyBvZiB0aGUgUGxh dGZvcm0gdG9vbGluZywgc2luY2UgYWxtb3N0IG5vIGluZHVzdHJpYWwgdXNlcnMgYWN0dWFsbHkg dXNlZCB0aGUgcHVibGljbHkgcmVsZWFzZWQgdG9vbHMhIEphbmUgU3RyZWV0IGhhZCBKZW5nYSwg Q29xIGhhZCBNYWtlZmlsZXMsIFhlbg0KIHN0aWxsIHVzZWQgb21ha2UsIHRoZSBPQ2FtbCBjb21w aWxlciBpdHNlbGYgaGFkIGJhY2tlZCBhd2F5IGZyb20gdXNpbmcgb2NhbWxidWlsZCwgYW5kIGV2 ZXJ5IHByb2plY3QgSSB0YWxrZWQgdG8gZGlkbuKAmXQgYmVjYXVzZSB0aGV5IGNpdGVkIHNsb3cg cGVyZm9ybWFuY2UgYW5kIGRpZmZpY3VsdCBkZWJ1Z2dhYmlsaXR5IHRvIHRoZSB0aGVuLXJlY29t bWVuZGVkIHN0YWNrIG9mIE9hc2lzL29jYW1sYnVpbGQvb2NhbWxmaW5kLiBIb3cgZGlkIHRoaXMN CiBoYXBwZW4/IEEgZmF0ZWZ1bCBkZWNpc2lvbiBiYWNrIGluIDIwMTIgcmVzdWx0ZWQgaW4gT2Fz aXMgPHNwYW4gY2xhc3M9InVuZGVybGluZSI+DQp3cmFwcGluZzwvc3Bhbj4gdGhlIG9jYW1sYnVp bGQgQ0xJLCB3aGljaCBpbiB0dXJuIGhhZCBhIHNwZWNpYWwgbW9kZSB0aGF0IHdyYXBwZWQgb2Nh bWxmaW5kLCBhbmQgZXZlcnkgc2luZ2xlIGNvbXBpbGVyIGludm9jYXRpb24gd2VudCB0aHJvdWdo IDUgZm9ya3MgYmVmb3JlIGl0IGV2ZXIgZ290IHRvDQo8Y29kZT5vY2FtbG9wdC5vcHQ8L2NvZGU+ LiBJZiBpbnN0ZWFkIE9hc2lzIGhhZCBpbnN0ZWFkIGxpbmtlZCB0byBvY2FtbGJ1aWxkIGFzIGEg bGlicmFyeSwgd2UgbWF5IGhhdmUgYXZvaWRlZCB0aGlzLCBidXQgd2XigJlsbCBuZXZlciBmaW5k IG91dC4gQW5kIEnigJltIG5vdCBjcml0aWNpc2luZyB0aGUgYXV0aG9ycyBvZiBPYXNpcyBmb3Ig dGhlaXIgZGVjaXNpb24gZWl0aGVyIOKAkyBpdCB3YXMgYSB2ZXJ5IHByYWdtYXRpYyBvbmUgdG8g Z2V0IHVzIHBhc3QNCiBoYXZpbmcgdG8gd3JpdGUgZGlyZWN0IG9jYW1sYnVpbGQgX3RhZ3MgZmls ZXMuIDwvcD4NCjxwPldoYXQgSSB1bmRlcmVzdGltYXRlZCB3aXRoIHRoZSBpbnRlZ3JhdGVkIENM SSBpcyB0aGUgc2hlZXIgYW1vdW50IG9mIHRpbWUgYW55IG1pZ3JhdGlvbnMgdGFrZSBmb3IgZG93 bnN0cmVhbSBwcm9qZWN0cywgYW5kIGFsc28gd2hhdCBYYXZpZXIgcG9pbnRzIG91dCBhYm92ZSBh Ym91dCBtdWx0aS1sYW5ndWFnZSBidWlsZHMgYW5kIHRoZSBmbGV4aWJpbGl0eSBvZiBNYWtlZmls ZXMuIFNvIG15IG93biB0aGlua2luZyBoYXMgZXZvbHZlZCBvbiBpdA0KIHRvbzogd2hhdCB3ZSBu ZWVkIGZyb20gb3VyIHRvb2xzIGlzIGEgT0NhbWwgbGlicmFyeSBpbnRlcmZhY2UsIHdpdGggdGhl IENMSXMgYmVpbmcgYXMgdGhpbiBhcyBwb3NzaWJsZS4gQW5kIGJ5IGFuZCBsYXJnZSwgdGhhdOKA mXMgbW9zdGx5IGhvdyB0aGUgYWN0aXZlIHRvb2xzIGluIHRoZSBQbGF0Zm9ybSBvcGVyYXRlIHRv ZGF5LiBXZSBoYXZlIGEgbnVtYmVyIG9mIENMSSB0b29scyB0aGF0IGludGVyb3BlcmF0ZSB2aWEg b3BhbS1saWJzIG9yIHRoZQ0KIG1vcmUgbGlnaHR3ZWlnaHQgb3BhbS1maWxlLWZvcm1hdC4gRHVu ZSBpdHNlbGYgaXMganVzdCB2ZW5kb3JpbmcgaW4gYmlnIGNodW5rcyBvZiBvcGFtIGZvciBpdHMg b3duIGludGVncmF0aW9uLCB3aGljaCBtZWFucyB0aGF0IGl0IGNhbiBiZSB1cGdyYWRlZCB3aXRo IHRoZSBzYW1lIGNvcmUgbG9naWMgYXMgdXNlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIG9w YW0gQ0xJLiBEdW5l4oCZcyBhbHNvIGdvdCBhIGxpYnJhcnkgcmVpbXBsZW1lbnRhdGlvbg0KIG9m IG9jYW1sZmluZCwgc28gdGhhdCBpdCBkb2VzbuKAmXQgbmVlZCB0byBzaGVsbCBvdXQgdG8gdGhh dCBidXQgc3RpbGwgcmV0YWlucyBzdHJvbmcgY29tcGF0aWJpbGl0eS4NCjwvcD4NCjxwPlRoaXMg YWxzbyBwb2ludHMgdG8gYSBwb3NzaWJsZSBnb29kIHRvcGxldmVsIG1ldHJpYyBmb3IgdGhlIE9D YW1sIFBsYXRmb3JtOiA8Yj4NCndoYXQgcHJvcG9ydGlvbiBvZiB0aGUgY29tbXVuaXR5IGFyZSB1 c2luZyB0aGUgdG9vbHMgdGhhdCB3ZSByZWNvbW1lbmQ/PC9iPiBUaGlzIHByb3BvcnRpb24gaXMg Y2xlYXJseSBpbmNyZWFzaW5nIChvcGFtLCBkdW5lLCBtZXJsaW4sIGxzcC1zZXJ2ZXIgYW5kIG9k b2MgYXJlIG5vdyB3aWRlbHkgYWRvcHRlZCBib3RoIGluIG9wZW4gc291cmNlIGFuZCBpbiBtb25v bGl0aGljIGNvZGViYXNlcyB0aGF0IHVzZSBPQ2FtbCksIGJ1dCBJIHRoaW5rIHdl4oCZcmUNCiBs ZXNzIGNsZWFyIG9uIG90aGVycyBsaWtlIG9jYW1sZm9ybWF0LCBkdW5lLXJlbGVhc2UgPHNwYW4g Y2xhc3M9InVuZGVybGluZSI+dnM8L3NwYW4+IG9wYW0tcHVibGlzaCwgYW5kIG1keC4gU3VnZ2Vz dGlvbnMgZm9yIGltcHJvdmVtZW50cyBvbiB0aGlzIG1ldHJpYywgYW5kIGZvciB3YXlzIHRvIG1l YXN1cmUgaXQgbW9yZSBzeXN0ZW1hdGljYWxseSwgYXJlIHdlbGNvbWUuDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iOSI+cHJvZHVjZXIgMC4yLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcm9kdWNlci0wLTItMC8xMzE5MS8xIj5odHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXByb2R1Y2VyLTAtMi0wLzEzMTkxLzE8L2E+DQo8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzc1YzdlNzIiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc3NWM3ZTcyIj5UcmVudCBTbWFsbCBhbm5vdW5jZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc1YzdlNzIiPg0KPHA+SGkg ZXZlcnlvbmUhIDwvcD4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFz ZSBvZiA8Y29kZT5wcm9kdWNlcjwvY29kZT4sIHYwLjIuMC4gPC9wPg0KPHA+VGhpcyByZWxlYXNl IGFsbG93cyBhIFByb2R1Y2VyIGdyYXBoIHRvIGJlIHNwZWNpZmllZCBmb3IgTW9uYWRzIHdpdGgg bW9yZSB0aGFuIG9uZSB0eXBlIHBhcmFtZXRlciAoZS5nLg0KPGNvZGU+UmVzdWx0LnQ8L2NvZGU+ KS4gVGhlIHByZXZpb3VzIHJlbGVhc2Ugb2YgdGhpcyBsaWJyYXJ5IG9ubHkgYWxsb3dlZCBNb25h ZHMgd2l0aCBvbmUgdHlwZSBwYXJhbWV0ZXIgKGUuZy4NCjxjb2RlPkx3dC50PC9jb2RlPikuIDwv cD4NCjxwPkZlZWwgZnJlZSB0byB0YWtlIGEgbG9vayBhbmQgbGV0IG1lIGtub3cgd2hhdCB5b3Ug dGhpbmsg4oCTIGNvbnRyaWJ1dGlvbnMgYXJlIGFsc28gd2VsY29tZSBpZiB5b3UgZmluZCB0aGlz IGlkZWEgaW50cmlndWluZyBhbmQgd2FudCB0byBpbXByb3ZlIHVwb24gaXQuDQo8L3A+DQo8cD5I YXBweSBjb2RpbmchIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTAiPkNhbGwgZm9y IENvbnRyaWJ1dGlvbnM6IEJPQiAyMDI0LCBCZXJsaW4gW01hcmNoIDE1LCBEZWFkbGluZSBOb3Yg MTddPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY2FsbC1mb3ItY29u dHJpYnV0aW9ucy1ib2ItMjAyNC1iZXJsaW4tbWFyY2gtMTUtZGVhZGxpbmUtbm92LTE3LzEzMjEx LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NhbGwtZm9yLWNvbnRyaWJ1dGlvbnMt Ym9iLTIwMjQtYmVybGluLW1hcmNoLTE1LWRlYWRsaW5lLW5vdi0xNy8xMzIxMS8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiOTk2NGU5IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYjk5NjRlOSI+TWljaGFlbCBTcGVyYmVyIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjk5NjRlOSI+ DQo8cD5PQ2FtbC1yZWxhdGVkIG1hdGVyaWFsIGlzIHZlcnkgbXVjaCB3ZWxjb21lIGF0IEJPQiEg PC9wPg0KPHA+V2ViIHZlcnNpb24gb2YgY2FsbCBpcyBoZXJlOiA8L3A+DQo8cD48YSBocmVmPSJo dHRwczovL2JvYmtvbmYuZGUvMjAyNC9jZmMuaHRtbCI+aHR0cHM6Ly9ib2Jrb25mLmRlLzIwMjQv Y2ZjLmh0bWw8L2E+DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNjAyM2YwNiI+ DQo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICAgIEJPQiBD b25mZXJlbmNlIDIwMjQNCiAgICAgICAgICZxdW90O1doYXQgaGFwcGVucyB3aGVuIHdlIHVzZSB3 aGF0J3MgYmVzdCBmb3IgYSBjaGFuZ2U/JnF1b3Q7DQogICAgICAgICAgICAgICAgICBodHRwczov L2JvYmtvbmYuZGUvMjAyNC9jZmMuaHRtbA0KICAgICAgICAgICAgICAgICAgICAgICAgIEJlcmxp biwgTWFyIDE3DQogICAgICAgICAgICAgICAgICAgICAgICBDYWxsIGZvciBDb250cmlidXRpb25z DQogICAgICAgICAgICAgICAgICAgICBEZWFkbGluZTogTm92ZW1iZXIgMTcsIDIwMjMNCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09DQoNCllvdSBhcmUgYWN0aXZlbHkgZW5nYWdlZCBpbiBhZHZhbmNl ZCBzb2Z0d2FyZSBlbmdpbmVlcmluZyBtZXRob2RzLA0Kc29sdmUgYW1iaXRpb3VzIHByb2JsZW0g d2l0aCBzb2Z0d2FyZSBhbmQgYXJlIG9wZW4gdG8gY3V0dGluZy1lZGdlDQppbm5vdmF0aW9uPyBB dHRlbmQgdGhpcyBjb25mZXJlbmNlLCBtZWV0IHBlb3BsZSB0aGF0IHNoYXJlIHlvdXIgZ29hbHMs DQphbmQgZ2V0IHRvIGtub3cgdGhlIGJlc3Qgc29mdHdhcmUgdG9vbHMgYW5kIHRlY2hub2xvZ2ll cyBhdmFpbGFibGUNCnRvZGF5LiBXZSBzdHJpdmUgdG8gb2ZmZXIgYSBkYXkgZnVsbCBvZiBuZXcg ZXhwZXJpZW5jZXMgYW5kDQppbXByZXNzaW9ucyB0aGF0IHlvdSBjYW4gdXNlIHRvIGltbWVkaWF0 ZWx5IGltcHJvdmUgeW91ciBkYWlseSBsaWZlIGFzDQphIHNvZnR3YXJlIGRldmVsb3Blci4NCg0K SWYgeW91IHNoYXJlIG91ciB2aXNpb24gYW5kIHdhbnQgdG8gY29udHJpYnV0ZSwgc3VibWl0IGEg cHJvcG9zYWwgZm9yDQphIHRhbGsgb3IgdHV0b3JpYWwhDQoNCk5PVEU6IFRoZSBjb25mZXJlbmNl IGZlZSB3aWxsIGJlIHdhaXZlZCBmb3IgcHJlc2VudGVycy4gVHJhdmVsDQpleHBlbnNlcyB3aWxs IG5vdCBiZSBjb3ZlcmVkIChmb3IgZXhjZXB0aW9ucyBzZWUgJnF1b3Q7U3BlYWtlciBHcmFudHMm cXVvdDspLg0KDQpTaGVwaGVyZGluZw0KLS0tLS0tLS0tLS0NCg0KVGhlIHByb2dyYW0gY29tbWl0 dGVlIG9mZmVycyBzaGVwaGVyZGluZyB0byBhbGwgc3BlYWtlcnMuIFNoZXBoZXJkaW5nDQpwcm92 aWRlcyBzcGVha2VycyBhc3Npc3RhbmNlIHdpdGggcHJlcGFyaW5nIHRoZWlyDQpzZXNzaW9ucy4g U3BlY2lmaWNhbGx5Og0KDQotIGFkdmljZSBvbiBzdHJ1Y3R1cmUgYW5kIHByZXNlbnRhdGlvbg0K LSByZXZpZXcgb2YgdGFsayBzbGlkZXMNCi0gYXNzaXN0YW5jZSB3aXRoIHJlY29yZGluZw0KLSBy ZXZpZXcgb2YgcmVjb3JkaW5nLCBpZiBhcHBsaWNhYmxlDQoNClNwZWFrZXIgR3JhbnRzDQotLS0t LS0tLS0tLS0tLQ0KDQpCT0IgaGFzIFNwZWFrZXIgR3JhbnRzIGF2YWlsYWJsZSB0byBzdXBwb3J0 IHNwZWFrZXJzIGZyb20gZ3JvdXBzDQp1bmRlci1yZXByZXNlbnRlZCBpbiB0ZWNobm9sb2d5LiBX ZSBzcGVjaWZpY2FsbHkgc2VlayB3b21lbiBzcGVha2VycywNCnNwZWFrZXJzIG9mIGNvbG9yLCBh bmQgc3BlYWtlcnMgd2hvIGFyZSBub3QgYWJsZSB0byBhdHRlbmQgdGhlDQpjb25mZXJlbmNlIGZv ciBmaW5hbmNpYWwgcmVhc29ucy4NCg0KVG9waWNzDQotLS0tLS0NCg0KV2UgYXJlIGxvb2tpbmcg Zm9yIHRhbGtzIGFib3V0IGJlc3Qtb2YtYnJlZWQgc29mdHdhcmUgdGVjaG5vbG9neSwgZS5nLjoN Cg0KLSBmdW5jdGlvbmFsIHByb2dyYW1taW5nDQotIHBlcnNpc3RlbnQgZGF0YSBzdHJ1Y3R1cmVz IGFuZCBkYXRhYmFzZXMNCi0gZXZlbnQtYmFzZWQgbW9kZWxsaW5nIGFuZCBhcmNoaXRlY3R1cmUN Ci0gJnF1b3Q7ZmFuY3kgdHlwZXMmcXVvdDsgKGRlcGVuZGVudCB0eXBlcywgZ3JhZHVhbCB0eXBp bmcsIGxpbmVhciB0eXBlcywgLi4uKQ0KLSBmb3JtYWwgbWV0aG9kcyBmb3IgY29ycmVjdG5lc3Mg YW5kIHJvYnVzdG5lc3MNCi0gYWJzdHJhY3Rpb25zIGZvciBjb25jdXJyZW5jeSBhbmQgcGFyYWxs ZWxpc20NCi0gbWV0YXByb2dyYW1taW5nDQotIHByb2JhYmlsaXN0aWMgcHJvZ3JhbW1pbmcNCi0g bWF0aCBhbmQgcHJvZ3JhbW1pbmcNCi0gY29udHJvbGxlZCBzaWRlIGVmZmVjdHMNCi0gcHJvZ3Jh bSBzeW50aGVzaXMNCi0gbmV4dC1nZW5lcmF0aW9uIElERXMNCi0gZWZmZWN0aXZlIGFic3RyYWN0 aW9ucyBmb3IgZGF0YSBhbmFseXRpY3MNCi0g4oCmIGV2ZXJ5dGhpbmcgcmVhbGx5IHRoYXQgaXNu 4oCZdCBtYWluc3RyZWFtLCBidXQgeW91IHRoaW5rIHNob3VsZCBiZQ0KLSDigKYgaW5jbHVkZWlu ZyByb3VnaCBpZGVhcyB3b3J0aCBkaXNjdXNzaW5nLg0KDQpQcmVzZW50ZXJzIHNob3VsZCBwcm92 aWRlIHRoZSBhdWRpZW5jZSB3aXRoIGluZm9ybWF0aW9uIHRoYXQgaXMNCnByYWN0aWNhbGx5IHVz ZWZ1bCBmb3Igc29mdHdhcmUgZGV2ZWxvcGVycy4NCg0KQ2hhbGxlbmdlcw0KLS0tLS0tLS0tLQ0K DQpGdXJ0aGVybW9yZSwgd2Ugc2VlayBjb250cmlidXRpb25zIG9uIHN1Y2Nlc3NmdWwgYXBwcm9h Y2hlcyBmb3INCnNvbHZpbmcgaGFyZCBwcm9ibGVtcywgZm9yIGV4YW1wbGU6DQoNCi0gYmlhcyBp biBtYWNoaW5lLWxlYXJuaW5nIHN5c3RlbXMNCi0gZGlnaXRhbCB0cmFuc2Zvcm1hdGlvbiBpbiBk aWZmaWN1bHQgc2V0dGluZ3MNCi0gYWNjZXNzaWJpbHRpdHkNCi0gc3lzdGVtcyB3aXRoIGNyaXRp Y2FsIHJlbGlhYmlsaXR5IHJlcXVpcmVtZW50cw0KLSBlY29sb2dpY2FsbHkgc3VzdGFpbmFibGUg c29mdHdhcmUgZGV2ZWxvcG1lbnQNCg0KV2UncmUgZXNwZWNpYWxseSBpbnRlcmVzdGVkIGluIGV4 cGVyaWVuY2UgcmVwb3J0cy4NCk90aGVyIHRvcGljcyBhcmUgYWxzbyByZWxldmFudCwgZS5nLjoN Cg0KLSBpbnRyb2R1Y3RvcnkgdGFsa3Mgb24gdGVjaG5pY2FsIGJhY2tncm91bmQNCi0gb3ZlcnZp ZXdzIG9mIGEgZ2l2ZW4gZmllbGQNCi0gZGVtb3MgYW5kIGhvdy10b3MNCg0KUmVxdWlyZW1lbnRz DQotLS0tLS0tLS0tLS0NCg0KV2UgYWNjZXB0IHByb3Bvc2FscyBmb3IgcHJlc2VudGF0aW9ucyBv ZiA0NSBtaW51dGVzICg0MCBtaW51dGVzIHRhbGsgJiM0MzsNCjUgbWludXRlcyBxdWVzdGlvbnMp LCBhcyB3ZWxsIGFzIDkwIG1pbnV0ZSB0dXRvcmlhbHMgZm9yDQpiZWdpbm5lcnMuIFRoZSBsYW5n dWFnZSBvZiBwcmVzZW50YXRpb24gc2hvdWxkIGJlIGVpdGhlciBFbmdsaXNoIG9yDQpHZXJtYW4u DQoNCllvdXIgcHJvcG9zYWwgc2hvdWxkIGluY2x1ZGUgKGluIHlvdXIgcHJlc2VudGF0aW9uIGxh bmd1YWdlIG9mIGNob2ljZSk6DQoNCi0gQW4gYWJzdHJhY3Qgb2YgbWF4LiAxNTAwIGNoYXJhY3Rl cnMuDQotIEEgc2hvcnQgYmlvL2N2DQotIENvbnRhY3QgaW5mb3JtYXRpb24gKGluY2x1ZGluZyBh dCBsZWFzdCBlbWFpbCBhZGRyZXNzKQ0KLSBBIGxpc3Qgb2YgMy01IGNvbmNyZXRlIGlkZWFzIG9m IGhvdyB5b3VyIHdvcmsgY2FuIGJlIGFwcGxpZWQgaW4gYSBkZXZlbG9wZXIncyBkYWlseSBsaWZl DQotIGFkZGl0aW9uYWwgbWF0ZXJpYWwgKHdlYnNpdGVzLCBibG9ncywgc2xpZGVzLCB2aWRlb3Mg b2YgcGFzdCBwcmVzZW50YXRpb25zLCDigKYpDQoNCk9yZ2FuaXNhdGlvbg0KLS0tLS0tLS0tLS0t DQoNCi0gRGlyZWN0IHF1ZXN0aW9ucyB0byBrb25mZXJlbnogYXQgYm9ia29uZiBkb3QgZGUNCi0g UHJvcG9zYWwgZGVhZGxpbmU6IE5vdmVtYmVyIDE3LCAyMDIzDQotIE5vdGlmaWNhdGlvbjogRGVj ZW1iZXIgNSwgMjAyMw0KLSBQcm9ncmFtOiBEZWNlbWJlciAxMiwgMjAyMw0KDQpTdWJtaXQgaGVy ZToNCg0KaHR0cHM6Ly9wcmV0YWx4LmNvbS9ib2ItMjAyNC9zdWJtaXQvDQoNClByb2dyYW0gQ29t bWl0dGVlDQotLS0tLS0tLS0tLS0tLS0tLQ0KDQoobW9yZSBpbmZvcm1hdGlvbiBoZXJlOiBodHRw czovL2JvYmtvbmYuZGUvMjAyNC9wcm9ncmFtbWtvbWl0ZWUuaHRtbCkNCg0KLSBNYXR0aGlhcyBG aXNjaG1hbm4sIFdpcmUNCi0gTWF0dGhpYXMgTmV1YmF1ZXIsIFNJQ0sgQUcNCi0gTmljb2xlIFJh dWNoLCBTb2Z0d2FyZWVudHdpY2tsdW5nIHVuZCBFbnR3aWNrbHVuZ3Njb2FjaGluZw0KLSBNaWNo YWVsIFNwZXJiZXIsIEFjdGl2ZSBHcm91cA0KLSBTdGVmYW4gV2VociwgSG9jaHNjaHVsZSBPZmZl bmJ1cmcNCg0KU2NpZW50aWZpYyBBZHZpc29yeSBCb2FyZA0KDQotIEFubmV0dGUgQmllbml1c2Es IFRVIEthaXNlcnNsYXV0ZXJuDQotIFRvcnN0ZW4gR3J1c3QsIFVuaSBUw7xiaW5nZW4NCi0gUGV0 ZXIgVGhpZW1hbm4sIFVuaSBGcmVpYnVyZw0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjExIj5BIGxpdHRsZSBhcnRpY2xlIGFib3V0IE1pb3U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v bWFzdG9kb24uc29jaWFsL0BkaW5vc2F1cmUvMTExMjA0ODU2MDI4ODIyMjk5Ij5odHRwczovL21h c3RvZG9uLnNvY2lhbC9AZGlub3NhdXJlLzExMTIwNDg1NjAyODgyMjI5OTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYWE0YmQ1NCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZ2FhNGJkNTQiPkRpbm9zYXVyZSBzYWlkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhYTRiZDU0Ij4NCjxwPkkganVzdCBwdWJs aXNoZWQgYSBsaXR0bGUgYXJ0aWNsZSBhYm91dCBNaW91LCBhIHNjaGVkdWxlciBmb3IgI09DYW1s IDUgaW4gbXkgYmxvZzoNCjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5vc2F1LnJlL2FydGljbGVzL21p b3UuaHRtbCI+aHR0cHM6Ly9ibG9nLm9zYXUucmUvYXJ0aWNsZXMvbWlvdS5odG1sPC9hPi4gWW91 IGNhbiBhbHNvIGNoZWNrIG15IGxhc3QgZXhwZXJpbWVudGF0aW9uIGFib3V0IGl0LCBhbiBIVFRQ IGNsaWVudCB3aGljaCBpcyBhYmxlIHRvIHJ1biB0aGluZ3MgaW4gcGFyYWxsZWw6DQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9odHRwY2F0cyI+aHR0cHM6Ly9naXRodWIu Y29tL3JvYnVyLWNvb3AvaHR0cGNhdHM8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNzVjODg2IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0ib3JnMjc1Yzg4NiI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtb3JnMjc1Yzg4NiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3Mg YSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVl Lm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwg b3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4N CjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlIHRvIHRoZSA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Ij4NCmNhbWwtbGlzdDwvYT4uIDwvcD4NCjxkaXYgY2xh c3M9ImF1dGhvcm5hbWUiIGlkPSJvcmdhYjk4NmZlIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 3 Oct 2023 14:01:19 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 3 Oct 2023 14:01:19 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 3 Oct 2023 14:01:19 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 393D12rJ015158 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 3 Oct 2023 14:01:02 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 393D0p52015140 for ; Tue, 3 Oct 2023 14:00:51 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Oct 2023 15:00:47 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 397B9E0CEA; Tue, 3 Oct 2023 15:00:46 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 84324E00B7 for ; Tue, 3 Oct 2023 15:00:38 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Oct 2023 15:00:36 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 43E0856470E; Tue, 3 Oct 2023 15:00:34 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ9fmzE0uDRrbruUezAN2+IDFWyQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 3 Oct 2023 14:00:33 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: f4961b7d-8c78-4aa7-5c89-08dbc410d5fa X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.03,197,1694728800"; d="scan'208,217";a="67640605" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499971, queueID=91D59564713 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <392DA4EC29301049B2CE2563028AC1E3@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0xMC0wMyBUdWUgMTQ6NTYgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDkuMjYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4xMC4xMC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIFNlcHRlbWJlciAyNiB0byBPY3RvYmVyIDAz LCAyMDIzLg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2Mi Pg0KPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29u dGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5BbiB1cGRhdGUg ZnJvbSB0aGUgb2NhbWwtd2FzbSBvcmdhbml6YXRpb248L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMy Ij5JbnRlcmVzdGluZyBPQ2FtbCBBcnRpY2xlczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkJh dHRlcmllcyB2My43LjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij51cmkuNC40LjA8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiM1Ij5PdXRyZWFjaHkgRGVjZW1iZXIgMjAyMzwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzYiPnF1ZWVuc2hlYWQ6IGEgQnJpdGlzaCBwdWIgbmFtZSBnZW5lcmF0b3I8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5PQ2FtbCBiZWhpbmQgdGhlIHNjZW5lczogRXhjZXB0aW9u PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+QSBtZW1vcnktcG9seW1vcnBoaWMsIHBvbHlnbG90 IGltcGxlbWVudGF0aW9uIG9mIFNwbERvdWJseUxpbmtlZExpc3QgKGFzIHRyYW5zcGlsZWQgYnkg UGhvbHlnbG90IDAuMi1iZXRhY2hpY2tlbik8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjOSI+UGFj a2FnZXMgZm9yIG1ha2luZyBwcm9vZiBhc3Npc3RhbnRzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIj b3JnN2Q0MjdhMCI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5B biB1cGRhdGUgZnJvbSB0aGUgb2NhbWwtd2FzbSBvcmdhbml6YXRpb248L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FuLXVwZGF0ZS1mcm9tLXRoZS1vY2FtbC13YXNtLW9y Z2FuaXphdGlvbi8xMzExNC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbi11cGRh dGUtZnJvbS10aGUtb2NhbWwtd2FzbS1vcmdhbml6YXRpb24vMTMxMTQvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2E2OGRlMCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzdhNjhkZTAiPkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3YTY4ZGUwIj4NCjxwPlN1 bW1lciBhbmQgSUNGUCBoYXMgcGFzc2VkIHNpbmNlIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm5vdW5jaW5nLXRoZS1vY2FtbC13YXNtLW9yZ2FuaXNhdGlvbi8xMjY3NiI+ DQp3ZSBhbm5vdW5jZWQgdGhlIDxjb2RlPm9jYW1sLXdhc208L2NvZGU+IG9yZ2FuaXphdGlvbiBp biBKdWx5PC9hPi4gSGVyZSB3ZSBwcm92aWRlIGFuIHVwZGF0ZSBmcm9tIHRoZQ0KPGNvZGU+d2Fz b2NhbWw8L2NvZGU+IGFuZCA8Y29kZT53YXNtX29mX29jYW1sPC9jb2RlPiBjb21waWxlciBwcm9q ZWN0cyBzaW5jZSB0aGVuLg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdkNDgwNzQzIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZDQ4MDc0MyI+SW50 cm9kdWN0aW9uPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdk NDgwNzQzIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vd2ViYXNzZW1ibHkub3JnLyI+V2ViQXNzZW1i bHkgKFdhc20pPC9hPiBpcyBhbiBhdHRyYWN0aXZlIGNvbXBpbGF0aW9uIHRhcmdldCBmb3IgT0Nh bWwsIGFzIGl0IGhvbGRzIHByb21pc2VzIG9mIGJldHRlciB3ZWItcGVyZm9ybWFuY2UgdGhhbiBj b21waWxpbmcgdG8gSmF2YVNjcmlwdCBhbmQgZnVydGhlcm1vcmUgb3BlbnMgdXAgZm9yIHJ1bm5p bmcgT0NhbWwgb24gbmV3IHBsYXRmb3Jtcy4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC13YXNtIj5UaGUgPGNvZGU+b2NhbWwtd2FzbTwvY29kZT4gb3JnYW5pemF0aW9uPC9hPiBp cyBhIGpvaW50IGVmZm9ydCBiZXR3ZWVuIHR3byBXYXNtLXRhcmdldGluZyBjb21waWxlciBwcm9q ZWN0cyBmb3IgT0NhbWw6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL3dhc29jYW1sIj48Y29kZT53YXNvY2FtbDwvY29k ZT48L2E+IC0gYW4gRkxhbWJkYS1iYXNlZCBiYWNrZW5kIGZvciBPQ2FtbOKAmXMgbmF0aXZlIGNv ZGUgY29tcGlsZXINCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13 YXNtL3dhc21fb2Zfb2NhbWwiPjxjb2RlPndhc21fb2Zfb2NhbWw8L2NvZGU+PC9hPiAtIGEgZm9y ayBvZg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vanNfb2Zfb2NhbWwiPjxj b2RlPmpzX29mX29jYW1sPC9jb2RlPjwvYT4gdGhhdCBjb25zdW1lcyBPQ2FtbCBieXRlY29kZSBh bmQgZW1pdHMgV2FzbSBpbnN0ZWFkIG9mIEphdmFTY3JpcHQNCjwvbGk+PC91bD4NCjxwPkJvdGgg Y29tcGlsZXJzIGRlcGVuZCBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1i bHkvZ2MiPnRoZSBwcm9wb3NlZCBnYXJiYWdlIGNvbGxlY3Rpb24gKEdDKSBleHRlbnNpb24gdG8g V2FzbTwvYT4sIHdoaWNoIGlzIGF2YWlsYWJsZSBiZWhpbmQgYSBmbGFnIGluIGRldmVsb3BtZW50 IHZlcnNpb25zIG9mIENocm9tZSwgRmlyZWZveCwgYW5kIE5vZGUuanMuIEFzIGEgZmlyc3QgbmV3 cyBpdGVtLCB3ZSBhcmUgZXhjaXRlZA0KIHRvIHNoYXJlIHRoYXQgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL1dlYkFzc2VtYmx5L3Byb3Bvc2Fscy9wdWxsLzE3MiI+dGhlIFdhc20gR0MgcHJv cG9zYWwgaGFzIG1vdmVkIHRvIHN0YWdlIDQ8L2E+LiBBcyBhIGNvbnNlcXVlbmNlDQo8YSBocmVm PSJodHRwczovL2dyb3Vwcy5nb29nbGUuY29tL2EvY2hyb21pdW0ub3JnL2cvYmxpbmstZGV2L2Mv S19HcERGMHk1UTgvbS9YSUpTZmJUSEJ3QUo/cGxpPTEiPg0KQ2hyb21lIGlzIHBsYW5uaW5nIHRv IGVuYWJsZSB0aGUgV2FzbUdDIGV4dGVuc2lvbiBpbiB2ZXJzaW9uIDExOTwvYT4sIDxhIGhyZWY9 Imh0dHBzOi8vY2hyb21lc3RhdHVzLmNvbS9yb2FkbWFwIj4NCnNjaGVkdWxlZCB0byByZWxlYXNl IGluIE5vdmVtYmVyITwvYT4gOnRhZGE6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdhOTQ2YzVlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0i b3JnYTk0NmM1ZSI+PGNvZGU+d2Fzb2NhbWw8L2NvZGU+PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmdhOTQ2YzVlIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5AY2hhbWJhcnQgcHJlc2VudGVkIDxjb2RlPndhc29jYW1sPC9jb2RlPiBhdCB0aGUgPGEgaHJl Zj0iaHR0cHM6Ly9pY2ZwMjMuc2lncGxhbi5vcmcvaG9tZS9tbHdvcmtzaG9wLTIwMjMjcHJvZ3Jh bSI+DQpNTCB3b3Jrc2hvcCBpbiBTZWF0dGxlPC9hPiBpbiBlYXJseSBTZXB0ZW1iZXIgaW4gY29u bmVjdGlvbiB3aXRoIElDRlDigJkyMw0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkhlcmXigJlz IDxhIGhyZWY9Imh0dHBzOi8veW91dHUuYmUvTTVNM2YzMXB4bnM/bGlzdD1QTHlybGs4WGF5bHA3 RWEtWnU5OEdfVnV4R3RVbktfakI4JmFtcDt0PTIyNzE5Ij4NCmEgdmlkZW8gbGluayB0byB0aGUg cmVjb3JkZWQgcHJlc2VudGF0aW9uPC9hPiA8L2xpPjxsaT5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9p Y2ZwMjMuc2lncGxhbi5vcmcvZGV0YWlscy9vY2FtbC0yMDIzLXBhcGVycy8xMy9XYXNvY2FtbC1h LWNvbXBpbGVyLWZyb20tT0NhbWwtdG8tV2ViQXNzZW1ibHkiPg0Kc2xpZGVzIGFuZCB0aGUgd29y a3Nob3AgcGFwZXIgYXJlIGF2YWlsYWJsZSBmcm9tIHRoaXMgcGFnZTwvYT4gd2l0aCBtb3JlIGRl dGFpbHMgYWJvdXQgdGhlIGNvbXBpbGVyDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5BZnRlciBoYXZp bmcgYmVuY2htYXJrZWQgPGNvZGU+d2Fzb2NhbWw8L2NvZGU+LCBpdCB3YXMgbm90aWNlZCB0aGF0 IFY4IGV4Y2VwdGlvbnMgYXJlIHRvbyBzbG93IHJpZ2h0IG5vdy4gVGhlIE9DYW1sIGV4Y2VwdGlv biBjb21waWxhdGlvbiBzdHJhdGVneSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGF2b2lkIHVzaW5nIHRo ZSBuYXRpdmUgV2FzbSBvbmVzIGZvciBub3cuIFRoaXMgd2lsbCBiZSB0dXJuZWQgYmFjayBpbnRv IHByb3BlciBXYXNtIGV4Y2VwdGlvbnMNCiB3aGVuIHRoZSBlbmdpbmVzIGltcHJvdmUuIDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2NGMx ZTVmIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNjRjMWU1ZiI+PGNvZGU+d2FzbV9v Zl9vY2FtbDwvY29kZT48L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0 LW9yZzY0YzFlNWYiPg0KPHA+QHZvdWlsbG9uIGhhcyBtYWRlIHNvbGlkIHByb2dyZXNzIG9uIGlt cGxlbWVudGluZyBydW4tdGltZSBiaW5kaW5ncywgd2hpY2ggbWVhbnMgdGhhdA0KPGNvZGU+d2Fz bV9vZl9vY2FtbDwvY29kZT4gY2FuIG5vdyA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ Y29tcGlsZSA8Y29kZT5vY2FtbGM8L2NvZGU+IGl0c2VsZiBpbnRvIFdhc20gPC9saT48bGk+cnVu IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9ib25zYWkiPkJvbnNh aSB0ZXN0cyBhbmQgZXhhbXBsZXM8L2E+DQo8L2xpPjwvdWw+DQo8cD5FYXJseSBiZW5jaG1hcmtz IHJlc3VsdHMgYXJlIGVuY291cmFnaW5nOiBDb21waWxlZCBwcm9ncmFtcyB0eXBpY2FsbHkgcnVu IGFyb3VuZCAxMC0yMCUgZmFzdGVyIGNvbXBhcmVkIHRvIHRoZQ0KPGNvZGU+anNfb2Zfb2NhbWw8 L2NvZGU+IGVxdWl2YWxlbnQuIDwvcD4NCjxwPkEgbW9yZSBkZXRhaWxlZCBzdGF0dXM6IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Mb3RzIG9mIHJ1bnRpbWUgYmluZGluZ3MgaGF2ZSBi ZWVuIGltcGxlbWVudGVkDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Zm9yIGV2ZW4gbW9yZSBw YXJ0cyBvZiB0aGUgT0NhbWwgPGNvZGU+U3RkbGliPC9jb2RlPjogYmlnYXJyYXlzLCB3ZWFrIHBv aW50ZXJzLCBlcGhlbWVyb25zLCBtYXJzaGFsaW5nL3VubWFyc2hhbGluZw0KPC9saT48bGk+Zm9y IGV4dGVybmFsIHBhY2thZ2VzOiA8Y29kZT5iYXNlPC9jb2RlPiwgPGNvZGU+Y29yZTwvY29kZT4s IDxjb2RlPnBweF9leHBlY3Q8L2NvZGU+LA0KPGNvZGU+cHB4X2lubGluZV90ZXN0PC9jb2RlPiwg PGNvZGU+dGltZV9ub3c8L2NvZGU+LCA8Y29kZT5pbmNyX2RvbTwvY29kZT4sIDxjb2RlPg0KYWxj b3Rlc3Q8L2NvZGU+LCA8Y29kZT5iYXNlX2JpZ3N0cmluZzwvY29kZT4sIDxjb2RlPmNvcmVfa2Vy bmVsPC9jb2RlPiwgPGNvZGU+c3RyaW5nX2RpY3Q8L2NvZGU+LA0KPGNvZGU+Ymlnc3RyaW5nYWY8 L2NvZGU+LCA8Y29kZT5qc19vZl9vY2FtbF9wYXRjaGVzPC9jb2RlPiwgPGNvZGU+b2NhbWwtY3N0 cnVjdDwvY29kZT4sDQo8Y29kZT5aYXJpdGg8L2NvZGU+IDwvbGk+PC91bD4NCjwvbGk+PGxpPkEg bnVtYmVyIG9mIFBScyB0byBnZXQgPGNvZGU+V2FzbV9vZl9vY2FtbDwvY29kZT4gc3VwcG9ydGVk Og0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmluIDxjb2RlPmR1bmU8L2NvZGU+IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvODI3OCI+b2NhbWwvZHVuZSM4Mjc4 PC9hPg0KPC9saT48bGk+aW4gPGNvZGU+Z2VuX2pzX2FwaTwvY29kZT4gPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL0xleGlGaS9nZW5fanNfYXBpL3B1bGwvMTczIj4NCkxleGlGaS9nZW5fanNf YXBpIzE3MzwvYT4gPC9saT48bGk+aW4gPGNvZGU+QnJyPC9jb2RlPiA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vZGJ1ZW56bGkvYnJyL3B1bGwvNTEiPmRidWVuemxpL2JyciM1MTwvYT4gYW5k DQo8L2xpPjxsaT50byBpbXByb3ZlIHRoZSA8Y29kZT5qc19vZl9vY2FtbDwvY29kZT4tPGNvZGU+ d2FzbV9vZl9vY2FtbDwvY29kZT4gY29tcGF0aWJpbGl0eQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jc2lnZW4vanNfb2Zfb2NhbWwvcHVsbC8xNDkyIj5vY3NpZ2VuL2pzX29mX29jYW1s IzE0OTI8L2E+DQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5JdCBpcyBub3cgcG9zc2libGUgdG8gaW5j bHVkZSBKYXZhU2NyaXB0IHJ1bnRpbWUgZmlsZXMgYW5kIHRvIHVzZSBKYXZhU2NyaXB0IHByaW1p dGl2ZXMgZnJvbSBXYXNtIHJ1bnRpbWUgY29kZSwgcmV1c2luZyB0aGUNCjxjb2RlPmpzX29mX29j YW1sPC9jb2RlPiBsaW5rZXIuIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvY29tbWl0L2U3MzFlNDg1ODQ5YWNkYTk3ZDMyOGVmY2Vm Mzg1OWIzY2FhYTYzZjIiPkltcGxlbWVudGVkIEVmZmVjdCBzdXBwb3J0IHRocm91Z2ggQ1BTIHRy YW5zZm9ybWF0aW9uPC9hPiBmb3IgY29tcGFyaXNvbiB3aXRoIHRoZSBjdXJyZW50IEpTIHByb21p c2UgaW50ZWdyYXRpb24gaW1wbGVtZW50YXRpb24NCjwvbGk+PGxpPlVwZGF0ZXMgY29udHJpYnV0 aW5nIHRvIHRoZSBvbi1nb2luZyBXYXNtIEdDIGVjb3N5c3RlbSBkZXZlbG9wbWVudDoNCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5NYWtlIHRoZSBsZWdhY3kgcGFyc2VyIGZvbGxvdyBtb3JlIGNs b3NlbHkgdGhlIHN0YW5kYXJkIEdDIHRleHQgZm9ybWF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9XZWJBc3NlbWJseS9iaW5hcnllbi9wdWxsLzU4ODkiPg0KV2ViQXNzZW1ibHkvYmluYXJ5 ZW4jNTg4OTwvYT4gPC9saT48bGk+VXBkYXRlIHN0cmluZ3JlZiB0ZXh0IGZvcm1hdCA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvYmluYXJ5ZW4vcHVsbC81ODkxIj4NCldl YkFzc2VtYmx5L2JpbmFyeWVuIzU4OTE8L2E+IDwvbGk+PGxpPlVzZSB0aGUgc3RhbmRhcmQgc3lu dGF4IGZvciByZWYuY2FzdCwgcmVmLnRlc3QgYW5kIGFycmF5Lm5ld19maXhlZCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvYmluYXJ5ZW4vcHVsbC81ODk0Ij4NCldlYkFz c2VtYmx5L2JpbmFyeWVuIzU4OTQ8L2E+IDwvbGk+PGxpPkZpeGVkIGEgVjggY3Jhc2ggPGEgaHJl Zj0iaHR0cHM6Ly9jaHJvbWl1bS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3Y4L3Y4LyYjNDM7 LzQ2NjAyODYiPg0KaHR0cHM6Ly9jaHJvbWl1bS1yZXZpZXcuZ29vZ2xlc291cmNlLmNvbS9jL3Y4 L3Y4LyYjNDM7LzQ2NjAyODY8L2E+IGFuZCBpbXBsZW1lbnRlZCBhIHdvcmthcm91bmQgaW4gYmlu YXJ5ZW4gdG9vbHMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9iaW5h cnllbi9wdWxsLzU3OTkiPldlYkFzc2VtYmx5L2JpbmFyeWVuIzU3OTk8L2E+DQo8L2xpPjxsaT5G aXhlZCB0aGUgYmluYXJ5ZW4gbGlua2VyIDxjb2RlPndhc20tbWVyZ2U8L2NvZGU+IHRvIHN1cHBv cnQgZXhwb3J0aW5nIGFuIGltcG9ydGVkIG1vZHVsZSBlbnRyeQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL1dlYkFzc2VtYmx5L2JpbmFyeWVuL3B1bGwvNTgxMyI+V2ViQXNzZW1ibHkvYmlu YXJ5ZW4jNTgxMzwvYT4NCjwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjIiPkludGVyZXN0aW5nIE9DYW1sIEFydGljbGVzPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9pbnRlcmVzdGluZy1vY2FtbC1hcnRpY2xlcy8x ODY3LzEwNSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50ZXJlc3Rpbmctb2NhbWwt YXJ0aWNsZXMvMTg2Ny8xMDU8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnY2VhOGFiMSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2NlYThhYjEi Pmdhc2NoZSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmdjZWE4YWIxIj4NCjxwPkkgaGFkIGZ1biByZWFkaW5nIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmNh bWJ1cy5uZXQvcGxheWluZy13aXRoLWNhbWwtbGlnaHQtb24tZG9zLyI+DQpQbGF5aW5nIHdpdGgg Q2FtbCBMaWdodCBvbiBET1M8L2E+LCBwdWJsaXNoZWQgdG9kYXkgKGl0IGlzIG5vdCBvYnZpb3Vz IGZyb20gdGhlIHRpdGxlKS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5CYXR0 ZXJpZXMgdjMuNy4xPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0z Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9iYXR0 ZXJpZXMtdjMtNy0xLzEzMTE3LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9iYXR0ZXJp ZXMtdjMtNy0xLzEzMTE3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzU0YWZmYWQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1NGFmZmFk Ij5Vbml4SnVua2llIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnNTRhZmZhZCI+DQo8cD5EZWFyIGNvbW11bml0eSwgPC9wPg0KPHA+QmF0dGVy aWVzIGlzIGEgY29tbXVuaXR5LW1haW50YWluZWQgZXh0ZW5kZWQgc3RhbmRhcmQgbGlicmFyeSBm b3IgT0NhbWwuIDwvcD4NCjxwPlRoZSBsYXRlc3QgdmVyc2lvbiBvZiBiYXR0ZXJpZXMgaXMgbm93 IGF2YWlsYWJsZSBpbiBvcGFtOiB2My43LjEuIDwvcD4NCjxwPlRoaXMgdmVyc2lvbiBtb3N0bHkg YWRkcyBjb21wYXRpYmlsaXR5IHdpdGggb2NhbWwtNS4xLjAgKHRoYW5rcyB0byBAa2l0LXR5LWth dGUpLiBOb3csIGJhdHRlcmllcyByZWxpZXMgb24gZHVuZSBmb3IgY29tcGlsYXRpb24gKHRoYW5r cyB0byBTaW1tbyBTYWFuIGFuZCBHYWJyaWVsIFNjaGVyZXIpLg0KPC9wPg0KPHA+TWFueSB0aGFu a3MgdG8gYWxsIGNvbnRyaWJ1dG9ycyBmb3IgdGhpcyByZWxlYXNlISA8L3A+DQo8cD5IYXBweSBo YWNraW5nLCBUaGUgYmF0dGVyaWVzIG1haW50YWluZXJzLiA8L3A+DQo8cD5IZXJlIGlzIHRoZSBj aGFuZ2UgbG9nIGZvciB2My43LjE6IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnMDFkOWRmZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzAxZDlkZmQi PnYzLjcuMSAobWlub3IgcmVsZWFzZSk8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQi IGlkPSJ0ZXh0LW9yZzAxZDlkZmQiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmZpeCBDSSB0 ZXN0cyAoZHVuZSBjbGVhbiAmYW1wOyZhbXA7IGR1bmUgYnVpbGQgQHNyYy9ydW50ZXN0KSAjMTEy MSAoU2ltbyBTYWFuKSA8L2xpPjxsaT5maXggZG9jdW1lbnRhdGlvbiBlcnJvcnMgZm9yIEJhdFNl dCwgQmF0TWFwIGFuZCBCYXRTcGxheSAjMTEyMCAoU2ltbW8gU2FhbikgPC9saT48bGk+Y29tcGF0 aWJpbGl0eSB3aXRoIE9DYW1sIDUuMS4wICMxMTE3IChraXQtdHkta2F0ZSkgPC9saT48bGk+YnVn Zml4IGltcGFjdGluZyBCYXRTdHJpbmcuc3BsaXRfb25fc3RyaW5nICMxMTEyIChHdWlkbyBNYXJ0 aW5leiwgcmV2aWV3IGJ5IEZyYW5jb2lzIEJlcmVuZ2VyKQ0KPC9saT48bGk+YWRkIGJhdHRlcmll cy51bnRocmVhZGVkIHRvIGR1bmUgZmlsZSAjMTEwNCAoU3RlcGhlbiBTaGVycmF0dCkgPC9saT48 bGk+YWRkIG9wdGlvbmFsIGRlcGVuZGVuY3kgdG8gZHVuZSBpbiBvcGFtIGZpbGUgIzExMDMgKFN0 ZXBoZW4gU2hlcnJhdHQpIDwvbGk+PGxpPkZpbmlzaCBzd2l0Y2ggdG8gZHVuZSAjMTA5OCBkdW5l IGJ1aWxkICMxMDk5IGR1bmUgcnVudGVzdCAoU2ltbW8gU2FhbiwgcmV2aWV3IGJ5IEZyYW5jb2lz IEJlcmVuZ2VyKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i NCI+dXJpLjQuNC4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00 Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t dXJpLTQtNC0wLzEzMTE5LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdXJpLTQt NC0wLzEzMTE5LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzM5Y2IyZjgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczOWNiMmY4Ij5DYWxh c2NpYmV0dGEgUm9tYWluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnMzljYjJmOCI+DQo8cD5Zb3VycyB0cnVseSBpcyBkZWxpZ2h0ZWQgdG8g YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgVXJpIDQuNC4wLiA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vbWlyYWdlL29jYW1sLXVyaSI+DQo8Y29kZT5vY2FtbC11cmk8L2NvZGU+PC9hPiBpcyBh IGxpYnJhcnkgZm9yIG1hbmlwdWxhdGluZyBVUklzIGluIGFjY29yZGFuY2Ugd2l0aCA8YSBocmVm PSJodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzM5ODYiPg0KUkZDIDM5 ODY8L2E+LiBUaGlzIGFubm91bmNlbWVudCBhbGxvd3MgdXMgdG8gY2xhcmlmeSBhIDxiPmJyZWFr aW5nIGNoYW5nZTwvYj4gaW4gdGhlIGludGVycHJldGF0aW9uIG9mIElQdjYuIFByZXZpb3VzIHZl cnNpb25zIGRpZCBub3QgaW50ZXJwcmV0IElQdjYgaW4gdGhlDQo8Y29kZT5ob3N0PC9jb2RlPiBw YXJ0IG9mIHRoZSBVUkkgLSB3ZSBzaW1wbHkgZXNjYXBlZCB0aGUgc3BlY2lhbCBjaGFyYWN0ZXJz LiBUaGlzIHZlcnNpb24gb2YNCjxjb2RlPnVyaTwvY29kZT4gbm93IGludGVycHJldHMgSVB2NiBh ZGRyZXNzZXMgaW4gdGhlIDxjb2RlPmhvc3Q8L2NvZGU+IHBhcnQuIFRoaXMgaW1wbGllcyBhIGNo YW5nZSBpbiB0aGUgbGlicmFyeeKAmXMgYmVoYXZpb3VyIHdoaWNoIG1heSBoYXZlIHNvbWUgaW1w YWN0IG9uIHNvZnR3YXJlIHVzaW5nIHRoaXMgbGlicmFyeS4gVGhpcyBhbm5vdW5jZW1lbnQgY2xh cmlmaWVzIHRoaXMg4oCcYnJlYWtpbmcgY2hhbmdl4oCdLg0KPC9wPg0KPHA+VGhlIGxpYnJhcnkg aXMgYXZhaWxhYmxlIGZyb20gT1BBTTogPGNvZGU+b3BhbSBpbnN0YWxsIHVyaS40LjQuMDwvY29k ZT4uIEZyb20gd2hhdCB3ZSBoYXZlIGJlZW4gYWJsZSB0byBvYnNlcnZlLCB0aGlzIGJyZWFraW5n LWNoYW5nZSBkb2VzIG5vdCBoYXZlIGENCjxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPmRpcmVjdDwv c3Bhbj4gaW1wYWN0IG9uIHRoZSBlY29zeXN0ZW0uIFRoZSByZWxlYXNlIHdlbnQgYWhlYWQgd2l0 aG91dCBhbnkgc29mdHdhcmUgYmVpbmcgYnJva2VuLiBIb3dldmVyLCB3ZSB3b3VsZCBsaWtlIHRv IHdhcm4geW91IG9mIHN1Y2ggYSBjaGFuZ2UuIFRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL21pcmFnZS9vY2FtbC11cmkvaXNzdWVzIj5pc3N1ZXM8L2E+IGFyZSBvcGVuIGlmIHlvdSBu b3RpY2UgYW55IHVud2FudGVkIGJlaGF2aW91ciBpbiB0aGUgbGlicmFyeS4NCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5PdXRyZWFjaHkgRGVjZW1iZXIgMjAyMzwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3V0cmVhY2h5LWRlY2VtYmVyLTIwMjMvMTI5 NDkvMTIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291dHJlYWNoeS1kZWNlbWJlci0y MDIzLzEyOTQ5LzEyPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzllYjBiZmYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5ZWIwYmZmIj5EZWVw IGluIHRoaXMgdGhyZWFkLCBTdWRoYSBQYXJpbWFsYSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc5ZWIwYmZmIj4NCjxwPkBuaWtvY2hpa28gYW5kIEkg aGF2ZSBwcm9wb3NlZCBhIHByb2plY3QgdG8gZGV2ZWxvcCBhIGdlb21ldHJpYyBjcmVhdGl2ZSBj b2RpbmcgbGlicmFyeSBmb3IgT0NhbWwuIFRoaXMgaXMgaGVhdmlseSBpbnNwaXJlZCBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Zvc3N1bml0ZWQvam95Ij5qb3k8L2E+IOKAkyB3ZSBo YWQgbG9hZHMgb2YgZnVuIGhhY2tpbmcgd2l0aCBpdCBhdA0KPGEgaHJlZj0iaHR0cHM6Ly90YXJp ZGVzLmNvbS9ibG9nLzIwMjMtMDEtMTItbGFtYmRhLXJldHJlYXQtcmVwb3J0LyI+TGFtYmRhIFJl dHJlYXQ8L2E+IChpbiBTY2hlbWUpIGFuZCB3YW50IHRvIHBhc3MgaXQgb24gdG8gT0NhbWwgcHJv Z3JhbW1lcnMsIGFuZCBsZWFybiBhIGJpdCBhYm91dCBjcmVhdGl2ZSBjb2RpbmcgaW4gdGhlIHBy b2Nlc3MuIFJlYWxseSBleGNpdGVkIHRvIHdvcmsgb24gdGhpcy4gT3V0cmVhY2h5IGFwcGxpY2Fu dHM6IFBsZWFzZQ0KIGRvbuKAmXQgaGVzaXRhdGUgdG8gZ2V0IGluIHRvdWNoIHdpdGggdXMgaWYg eW914oCZcmUgaW50ZXJlc3RlZCB0byBjb250cmlidXRlLiA6KSA8L3A+DQo8cD5IdWdlIHRoYW5r cyB0byBAcGl0YWcsIEBwYXRyaWNvZmVycmlzIGFuZCBldmVyeW9uZSBpbnZvbHZlZCwgZm9yIHRo ZWlyIGVmZm9ydHMgdG8ga2VlcCB0aGlzIHRocml2aW5nIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y0ZjMwOGUiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmdmNGYzMDhlIj5Tb25qYSBIZWluemUgdGhlbiBzYWlkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmNGYzMDhlIj4NCjxwPkFzIHByb21p c2VkLCBoZXJlIGlzIHRoZSB1cGRhdGUvc3VtbWFyeSBvbiB0aGlzIHJvdW5k4oCZcyBwcm9qZWN0 cy4gSnVzdCBsaWtlIGxhc3Qgcm91bmQsIHRoZSBPQ2FtbCBjb21tdW5pdHkgaGFzIHNpZ25lZCB1 cCB3aXRoIGZvdXIgc3VwZXIgY29vbCBwcm9qZWN0cyBhZ2Fpbi4gSGVyZSBhcmUgdGhpcyByb3Vu ZOKAmXMgcHJvamVjdHM6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGk+SW1wbGVt ZW50IFIqLXRyZWUgaW4gT0NhbWw8L2k+IEFuIFIqLXRyZWUgaXMgYSBkYXRhIHN0cnVjdHVyZSBk ZXNpZ25lZCBmb3IgZ2Vvc3BhdGlhbCB1c2UsIHBhcnRpY3VsYXJseSB0byBiZSBxdWVyaWVkIGZv ciBnZW9zcGF0aWFsIG9iamVjdHMgY29udGFpbmVkIGluIGEgZ2l2ZW4gYm94LiBJdOKAmXMgc3Vw ZXIgbmljZSB0byBzZWUgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2VvY2FtbCI+ R2Vvc3BhdGlhbCBlY29zeXN0ZW0gZm9yIE9DYW1sPC9hPiB0aHJpdmUuIE1lbnRvcnM6IEBwYXRy aWNvZmVycmlzICwgQEFyeWFuR29kYXJhDQo8L2xpPjxsaT48aT5JbXBsZW1lbnQgYSBkYXJrIG1v ZGUgZm9yIE9DYW1sLm9yZzwvaT4gSXTigJlzIGEgdmVyeSBuaWNlIGlkZWEgdG8gaGF2ZSBhIGNv bW1vbiBmZWF0dXJlIHJlcXVlc3QgYXMgYW4gT3V0cmVhY2h5IHByb2plY3QhIFRoYXQgbWFrZXMg dGhlIGludGVybnNoaXAgdmVyeSBncmF0aWZ5aW5nIGZvciB0aGUgaW50ZXJuLiBNZW50b3JzOiBA U2F5U2F5byAsIEBwdW5jaGFnYW4NCjwvbGk+PGxpPjxpPkltcHJvdmUgdGhlIEdVSSBleHBlcmll bmNlIGZvciBPQ2FtbCB1c2VyczwvaT4gVG9nZXRoZXIgd2l0aCB0cnlpbmcgb3V0IGFuZCBwb3Nz aWJseSBpbXByb3ZpbmcgZGlmZmVyZW50IEdVSSBsaWJyYXJpZXMgaW4gT0NhbWwsIHRoYXQgd2ls bCBlbnRhaWwgd3JpdGluZyBhIOKAnEFyZSB3ZSBHVUkgeWV04oCdIHBhZ2Ugb24gb2NhbWwub3Jn LCBzaW1pbGFyIHRvDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL2lzLW9jYW1sLXdl Yi15ZXQiPkFyZSB3ZSB3ZWIgeWV0PzwvYT4uIFRob3NlIHBhZ2VzIGFyZSBzdXBlciBpbXBvcnRh bnQsIGJvdGggdG8gdW5kZXJzdGFuZCB0aGUgY3VycmVudCBPQ2FtbCBlY29zeXN0ZW0gb3Vyc2Vs dmVzIGFuZCB0byBnaXZlIGFuIG92ZXJ2aWV3IHRvIG5ld2NvbWVycy4gTWVudG9yczogQGdwZXRp b3QsIEBtb2F6emFtbW9yaWFuaQ0KPC9saT48bGk+PGk+RGV2ZWxvcCBhIGdlb21ldHJpYyBjcmVh dGl2ZSBjb2RpbmcgbGlicmFyeSBpbiBPQ2FtbDwvaT4gU3VjaCBhIGNvb2wgaWRlYSwgQHN1ZGhh ICEgSXQgY29tYmluZXMgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyB3aXRoIGNyZWF0aXZpdHkgYW5k IGJhc2ljIGdlb21ldHJ5LiBUaGUgaWRlYSBpcyB0byBlbmNvZGUgYW5kIGRyYXcgMi1kaW1lbnNp b25hbCBnZW9tZXRyaWMgc2hhcGVzIGluIGEgZnVuY3Rpb25hbCBzdHlsZS4gSXTigJlzIGluc3Bp cmVkDQogYnkgUHl0aG9u4oCZcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZm9zc3VuaXRl ZC9qb3kiPmpveTwvYT4uIE1lbnRvcnM6IEBzdWRoYSwgQG5pa29jaGlrbw0KPC9saT48L3VsPg0K PHA+RXZlbiBhdCB0aGUgc21hbGwgcmlzayBvZiBiZWluZyBhbm5veWluZzogVGhpcyBpcyBhIGdv b2QgdGltZSBmb3IgZXZlcnlvbmUgd2hvIG1pZ2h0IHBvc3NpYmx5IGJlIGludGVyZXN0ZWQgaW4g bWVudG9yaW5nIHRvIHN0YXJ0IHRoaW5raW5nIGFib3V0IGEgcHJvamVjdCBmb3IgbmV4dCByb3Vu ZCA6KQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPnF1ZWVuc2hlYWQ6IGEgQnJp dGlzaCBwdWIgbmFtZSBnZW5lcmF0b3I8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1xdWVlbnNoZWFkLWEtYnJpdGlzaC1wdWItbmFtZS1nZW5lcmF0b3IvMTMxMjQv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXF1ZWVuc2hlYWQtYS1icml0aXNo LXB1Yi1uYW1lLWdlbmVyYXRvci8xMzEyNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmdiYzZlMDRiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnYmM2ZTA0YiI+UmFwaGHDq2wgUHJvdXN0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYmM2ZTA0YiI+DQo8cD5KdXN0IGJlY2F1c2UgSSBj b3VsZCwgaXQgZG9lc27igJl0IG1lYW4gSSBzaG91bGQgaGF2ZTsgYW5kIHlldCBJIGRpZCB3cml0 ZSBhbiBlbnRpcmVseSB1bm5lY2Vzc2FyeSBnZW5lcmF0b3IgZm9yIG5hbWVzIG9mIEJyaXRpc2gg cHVicy4NCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmcxZTc4YjI1Ij4NCiQgb3Bh bSBpbnN0YWxsIHF1ZWVuc2hlYWQNCuKApg0KJCBxdWVlbnNoZWFkDQpUaGUgaG9yc2UgYW5kIGdv YXRzDQo8L3ByZT4NCjxwPk1vcmUgZGV0YWlscyBvbiA8YSBocmVmPSJodHRwczovL3JhcGhhZWwt cHJvdXN0LmdpdGxhYi5pby9jb2RlL3F1ZWVuc2hlYWQuaHRtbCI+DQp0aGlzIHNob3J0IGJsb2cg cG9zdDwvYT4uIDwvcD4NCjxwPkl0IHdhcyBhIGdvb2QgZXhjdXNlIHRvIGV4cGVyaW1lbnQgd2l0 aCA8Y29kZT5jcnVuY2g8L2NvZGU+IGFzIGEgd2F5IHRvIGVtYmVkIHNvbWUgZGF0YSBmaWxlcyBp biBhbiBPQ2FtbCBwcm9ncmFtLiBUdXJuZWQgb3V0IHRvIGJlIGVhc3kuDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iNyI+T0NhbWwgYmVoaW5kIHRoZSBzY2VuZXM6IEV4Y2VwdGlvbjwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2F0Y2gtb2NhbWwtYmVoaW5k LXRoZS1zY2VuZXMtZXhjZXB0aW9uLzEyNzQzLzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3dhdGNoLW9jYW1sLWJlaGluZC10aGUtc2NlbmVzLWV4Y2VwdGlvbi8xMjc0My8yPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzhhYmZmYzIiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4YWJmZmMyIj5GYWJyaWNlIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOGFiZmZjMiI+DQo8cD5U byBjZWxlYnJhdGUgdGhpcyB0YWxrIG5vdyBiZWluZyBwdWJsaWNseSBhdmFpbGFibGUsIEnigJl2 ZSBhZGRlZCBhIGNoYXB0ZXIgdGhhdCB3YXMgbm90IHBhcnQgb2YgdGhlIG9yaWdpbmFsIHByZXNl bnRhdGlvbiENCjwvcD4NCjxwPlRoaXMgPGNvZGU+QmFja3RyYWNlczwvY29kZT4gc2VjdGlvbiBh aW1zIHRvIGV4cGxhaW4gaG93IGJhY2t0cmFjZXMgYXJlIGNvbnN0cnVjdGVkIGZvciBleGNlcHRp b25zLCBzbyB0aGF0IGV4Y2VwdGlvbnMgY2FuIGJlIGxpbmtlZCB0byB0aGUgY29kZSBsb2NhdGlv biB0aGF0IHJhaXNlZCB0aGVtLiBJdCBhbHNvIGdpdmVzIGVub3VnaCBkZXRhaWxzIGFib3V0IHRo ZSBpbXBsZW1lbnRhdGlvbiB0byBqdXN0aWZ5IHRoZSBjbGFpbXMgaW4NCjxjb2RlPlRha2Vhd2F5 ICM1PC9jb2RlPiBhYm91dCBiYWNrdHJhY2UgY29sbGVjdGlvbiBhbmQgPGNvZGU+cmFpc2Vfbm90 cmFjZTwvY29kZT4uDQo8L3A+DQo8cD5JdOKAmXMgYSBiaXQgdGVjaG5pY2FsLCBzbyBJIGRpZG7i gJl0IGRpdmUgaW4gPGI+YWxsPC9iPiB0aGUgZGV0YWlscywgYnV0IHRoZXJl4oCZcyBjZXJ0YWlu bHkgcGxlbnR5IHRvIHVuZGVyc3RhbmQgdGhlIHRlY2huaXF1ZSB1c2VkLg0KPC9wPg0KPHA+VGhl IHVwZGF0ZWQgc2xpZGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgcmVsZWFzZSBwYWdlIG9mIHRoZSBy ZXBvc2l0b3J5OiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZmFiYmluZy9vYnRzX2V4bi9y ZWxlYXNlcyI+DQpodHRwczovL2dpdGh1Yi5jb20vZmFiYmluZy9vYnRzX2V4bi9yZWxlYXNlczwv YT4gRmVlbCBmcmVlIHRvIGFzayBtZSBhbnkgcXVlc3Rpb25zIGlmIGFueXRoaW5nIGlzbuKAmXQg Y2xlYXIgZW5vdWdoLiA6c2xpZ2h0bHlfc21pbGluZ19mYWNlOg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjgiPkEgbWVtb3J5LXBvbHltb3JwaGljLCBwb2x5Z2xvdCBpbXBsZW1lbnRh dGlvbiBvZiBTcGxEb3VibHlMaW5rZWRMaXN0IChhcyB0cmFuc3BpbGVkIGJ5IFBob2x5Z2xvdCAw LjItYmV0YWNoaWNrZW4pPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h LW1lbW9yeS1wb2x5bW9ycGhpYy1wb2x5Z2xvdC1pbXBsZW1lbnRhdGlvbi1vZi1zcGxkb3VibHls aW5rZWRsaXN0LWFzLXRyYW5zcGlsZWQtYnktcGhvbHlnbG90LTAtMi1iZXRhY2hpY2tlbi8xMzEy Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLW1lbW9yeS1wb2x5bW9ycGhpYy1w b2x5Z2xvdC1pbXBsZW1lbnRhdGlvbi1vZi1zcGxkb3VibHlsaW5rZWRsaXN0LWFzLXRyYW5zcGls ZWQtYnktcGhvbHlnbG90LTAtMi1iZXRhY2hpY2tlbi8xMzEyNi8xPC9hPg0KPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczOWE4ZDk2IiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnMzlhOGQ5NiI+T2xsZSBIw6Ryc3RlZHQgYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczOWE4ZDk2Ij4NCjxwPkFkZGVk IHNvbWUgbmV3IGZlYXR1cmVzIHRvIG15IGhvYmJ5IGNvbXBpbGVyIHByb2plY3QsIFBob2x5Z2xv dC4gOikgTWF5YmUgbm90aGluZyBpbnRlcmVzdGluZyBmcm9tIGFuIE9DYW1sIHBlcnNwZWN0aXZl LCBpdOKAmXMgYSBwcmV0dHkgYmFzaWMgYW1hdGV1ciBob21lLW1hZGUgY29tcGlsZXIgc3lzdGVt LCBub3RoaW5nIGZhbmN5LiBUaGUgd2VpcmRlc3QgYXNwZWN0IG9mIGl0IGlzIHRoYXQgaXQgb3V0 cHV0cyBDLWNvZGUgdGhhdCBpcyBhbHNvDQogdmFsaWQgUEhQLWNvZGUsIHNvIGNhbGxlZCBwb2x5 Z2xvdCBjb2RlIChzZW1pLXJlYWRhYmxlKS4gPC9wPg0KPHA+U2luY2UgSeKAmW0gY2FyZWVyLWxv Y2tlZCBpbnRvIFBIUCwgSeKAmW0gd3JpdGluZyBteXNlbGYgb3V0IG9mIGl0IHdpdGggbXkgb3du IGNvbXBpbGVyLg0KPC9wPg0KPHA+QW5vdGhlciBtb3RpdmF0aW9uIGlzIGEgc2xpZ2h0IGRpc2Fw cG9pbnRtZW50IGluIHJlY2VudCBsYW5ndWFnZXMsIGxpa2UgUnVzdCwgd2hpY2ggZG9lcyBub3Qs IGFjY29yZGluZyB0byBtZSwgYWRoZXJlIHRvIHRoZSA4MC8yMC1ydWxlIC0gdGhhdCB0aGUgbW9z dCBjb21tb24gdXNlLWNhc2Ugc2hvdWxkIGJlIGVhc3ksIGFuZCB0aGF0IGluIDgwJSBvZiBjYXNl cywgeW91IGRvbuKAmXQgaGF2ZSB0byBiZSBmYXN0LCBidXQgeW91IHNob3VsZCBiZQ0KPHNwYW4g Y2xhc3M9InVuZGVybGluZSI+YWJsZTwvc3Bhbj4gdG8gYmUgZmFzdCAoaW5zdGVhZCBvZiBmb3Jj ZWQgdG8gYmUgZmFzdCkuIEhlbmNlIHRoZQ0KPGI+b3B0LW91dC1vZi1HQzwvYj4gZXhwZXJpbWVu dC4gPC9wPg0KPHA+VGhlIGN1cnJlbnQgR0MgaXMganVzdCBCb2VobS4gTWlnaHQgYmUgaW50ZXJl c3RpbmcgdG8gdHJ5IHdpdGggcmVmLWNvdW50IHRvby4gUHJvcGVyIHRyYWNpbmcgaXMgb3V0LW9m LXNjb3BlIGZvciB0aGUgcHJvamVjdCAodG9vIGhhcmTigKYgYW5kIHJlcXVpcmVzIGhlYWRlcnMg ZXRjLCBjYW7igJl0IGNvbWJpbmUgaXQgd2l0aCBtYW51YWwgbWVtb3J5LCBhZmFpaykuDQo8L3A+ DQo8cD5NYWluIE9DYW1sIHNyYyBpcyBoZXJlOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2xsZWhhcnN0ZWR0L3Bob2x5Z2xvdC90cmVlL21haW4vc3JjL2xpYiI+DQpodHRwczovL2dpdGh1 Yi5jb20vb2xsZWhhcnN0ZWR0L3Bob2x5Z2xvdC90cmVlL21haW4vc3JjL2xpYjwvYT4gPC9wPg0K PHA+TW9zdCByZWNlbnQgYmxvZyBwb3N0OiA8YSBocmVmPSJodHRwOi8vb2xsZWhhcnN0ZWR0Lmdp dGh1Yi5pby9wcm9ncmFtbWluZy8yMDIzLzAzLzE5L21lbW9yeS1wb2x5bW9ycGhpYy1zcGxkb3Vi bHlsaW5rZWRsaXN0LXBob2x5Z2xvdC5odG1sIj4NCmh0dHA6Ly9vbGxlaGFyc3RlZHQuZ2l0aHVi LmlvL3Byb2dyYW1taW5nLzIwMjMvMDMvMTkvbWVtb3J5LXBvbHltb3JwaGljLXNwbGRvdWJseWxp bmtlZGxpc3QtcGhvbHlnbG90Lmh0bWw8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iOSI+UGFja2FnZXMgZm9yIG1ha2luZyBwcm9vZiBhc3Npc3RhbnRzPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcGFja2FnZXMtZm9yLW1ha2luZy1wcm9vZi1h c3Npc3RhbnRzLzEzMTM4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wYWNr YWdlcy1mb3ItbWFraW5nLXByb29mLWFzc2lzdGFudHMvMTMxMzgvMTwvYT4gPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyMTE1NDMwIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnMjExNTQzMCI+RmF2b25pYSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzIxMTU0MzAiPg0KPHA+V2UgYXJlIGV4Y2l0 ZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL1JlZFBSTC9hc2FpLyI+DQphc2FpIOa1heOBhDwvYT4gb24gT1BBTSwgYWxvbmcgd2l0 aCBuZXcgdmVyc2lvbnMgb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JlZHBybC9hbGdh ZWZmIj4NCmFsZ2FlZmY8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJM L3l1dWppbmNob3UiPnl1dWppbmNob3Ug5Y+L5Lq65bizPC9hPi4gV2UgYWxzbyByZWxlYXNlZA0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9vY2FtbC1id2QiPmJ3ZDwvYT4gYW5k IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWRQUkwvbXVnZW4iPg0KbXVnZW4g54Sh6ZmQ PC9hPiBvbiBPUEFNIGVhcmxpZXIgYnV0IGRpZG7igJl0IG1ha2UgYW4gYW5ub3VuY2VtZW50LiA8 L3A+DQo8cD5BbGwgdGhlc2UgcGFja2FnZXMgYXJlIHBhcnQgb2YgPGEgaHJlZj0iaHR0cDovL3Jl ZHBybC5vcmcvIj5vdXIgcmVzZWFyY2ggcHJvamVjdDwvYT4gdG8gZGlzc2VjdCBhIHR5cGljYWwg cHJvb2YgYXNzaXN0YW50IGludG8gY29tcG9zYWJsZSBjb21wb25lbnRzIHNvIHRoYXQNCjxzcGFu IGNsYXNzPSJ1bmRlcmxpbmUiPmV2ZXJ5b25lPC9zcGFuPiBjYW4gZWFzaWx5IGJ1aWxkIGEgaGln aC1xdWFsaXR5LCB1c2FibGUgcHJvdG90eXBlIG91dCBvZiB0aGVpciB0eXBlIGNoZWNrZXIuIEl0 IHR1cm5zIG91dCB0aGF0IG1hbnkgY29tcG9uZW50cyBhcmUgdXNlZnVsIGZvciB3cml0aW5nIGNv bXBpbGVycywgdG9vLiBIZXJlIGFyZSBvdXIgcGFja2FnZXM6ICjinIUgbWVhbnMgaXTigJlzIG9u IE9QQU0uKQ0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPuKchSA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vUmVkUFJML2FzYWkvIj5hc2FpIOa1heOBhDwvYT4gZm9yIGNvbXBpbGVy IGRpYWdub3N0aWNzLg0KPC9saT48bGk+4pyFIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9S ZWRQUkwveXV1amluY2hvdSI+eXV1amluY2hvdSDlj4vkurrluLM8L2E+IGZvciBuYW1lc3BhY2Vz IGFuZCBsZXhpY2FsIHNjb3BpbmcuIFNlZSBteQ0KPGEgaHJlZj0iaHR0cHM6Ly95b3V0dS5iZS81 Q3A4ak5yV1NqSSI+VFlQRVMgMjAyMiB0YWxrPC9hPiBmb3IgaXRzIGRlc2lnbiBwcmluY2lwbGVz Lg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9iYW50b3JyYSI+ YmFudG9ycmE8L2E+IGZvciBsaWJyYXJ5IG1hbmFnZW1lbnQgKHN0aWxsIHVuZGVyIGhlYXZ5IGRl dmVsb3BtZW50IGFuZCByZXZpc2lvbnMpDQo8L2xpPjxsaT7inIUgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL1JlZFBSTC9tdWdlbiI+bXVnZW4g54Sh6ZmQPC9hPiBmb3IgdW5pdmVyc2UgbGV2 ZWxzLiBTZWUgb3VyDQo8YSBocmVmPSJodHRwczovL2RvaS5vcmcvMTAuMTE0NS8zNTcxMjUwIj5Q T1BMIDIwMjMgcGFwZXI8L2E+IGZvciBhIHRoZW9yZXRpYyBhbmFseXNpcyBvZiBpdHMgZGVzaWdu Lg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9rYWRvIj5rYWRv IOOCq+ODiTwvYT4gZm9yIGhhbmRsaW5nIGNvZmlicmF0aW9ucyBpbiBDYXJ0ZXNpYW4gQ3ViaWNh bCBUeXBlIFRoZW9yeS4gVGhpcyB3YXMgYWxzbyB1c2VkIGZvciBpbXBsZW1lbnRpbmcNCjxhIGhy ZWY9Imh0dHBzOi8vYXJ4aXYub3JnL2Ficy8yMjEwLjA1NDIwIj51bmZvbGRpbmcgY29udHJvbDwv YT4uIDwvbGk+PC91bD4NCjxwPnRvZ2V0aGVyIHdpdGggdGhlc2UgbW9yZSBnZW5lcmFsLXB1cnBv c2UgcGFja2FnZXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT7inIUgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL1JlZFBSTC9hbGdhZWZmIj5hbGdhZWZmPC9hPiBmb3Igd2VsbC1r bm93biBjb21wb3NhYmxlIGVmZmVjdHMtYmFzZWQgZ2FkZ2V0cyAoZS5nLiwgc3RhdGUsIHJlYWRl ciwgZXRjLikNCjwvbGk+PGxpPuKchSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVkUFJM L29jYW1sLWJ3ZCI+YndkPC9hPiBmb3IgYmFja3dhcmQgbGlzdHMgPC9saT48L3VsPg0KPHA+V2Ug aGF2ZSBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yZWRwcmwvYWxnYWV0dCI+cHJvdG90 eXBlIHN5c3RlbTwvYT4gc2hvd2luZyBob3cgdGhlc2UgcGFja2FnZXMgbWF5IGJlIHVzZWQgdG9n ZXRoZXIuIE1hbnkgcGFja2FnZXMgaGF2ZSBiZWVuIHVzZWQgaW4gb3VyDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vUmVkUFJML2Nvb2x0dCI+cHJvb2YgYXNzaXN0YW50IGNvb2x0dDwvYT4s IEBqb25zdGVybGluZ+KAmXMg4pyFDQo8YSBocmVmPSJodHRwczovL3d3dy5qb25tc3Rlcmxpbmcu Y29tL2ptcy0wMDVQLnhtbCI+Zm9yZXN0ZXI8L2E+IHRvb2wgYW5kIFRvcG9zIEluc3RpdHV0ZeKA mXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Ub3Bvc0luc3RpdHV0ZS9wb2x5dHQiPnBv bHl0dDwvYT4uIFdlIGludml0ZSB5b3UgdG8gdHJ5IG91dCBvdXIgcGFja2FnZXMgdGhlIG5leHQg dGltZSB5b3Ugd2FudCB0byBidWlsZCBhIHByb29mIGFzc2lzdGFudCBvciBjb21waWxlciENCjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzdkNDI3YTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmc3ZDQyN2EwIj5PbGQgQ1dO PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmc3ZDQyN2EwIj4N CjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86 YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBh bmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRo ZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1Mg ZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byBy ZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgdG8gdGhlIDxh IGhyZWY9Imh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3QiPg0KY2Ft bC1saXN0PC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZ2JmOTQyOWEi Pg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0 dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0 bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 19 Sep 2023 09:57:04 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 19 Sep 2023 09:57:04 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 19 Sep 2023 09:57:04 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38J8ufha003368 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 19 Sep 2023 09:56:41 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38J8uTXw003355 for ; Tue, 19 Sep 2023 09:56:30 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Sep 2023 10:56:28 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A2DA0E0CD5; Tue, 19 Sep 2023 10:56:27 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id AA53FE004E for ; Tue, 19 Sep 2023 10:56:22 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Sep 2023 10:56:19 +0200 Received: from TM.local (ip-185-104-137-32.ptr.icomera.net [185.104.137.32]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7631D56126E; Tue, 19 Sep 2023 10:56:04 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ6tdDsoFstM3TSEO5FDuV6a54VQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 19 Sep 2023 09:54:00 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: d5ebd5de-909f-4fb9-8c9e-08dbb8ee656a X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.02,159,1688421600"; d="scan'208,217";a="126728703" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499997, queueID=26A90561286 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOS0xOSBUdWUgMTA6NTIgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDkuMTIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOS4yNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIFNlcHRlbWJlciAxMiB0byAxOSwgMjAyMy4N CjwvcD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5U YWJsZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiBy b2xlPSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+RGtNTCAyLjAueCBSZWxlYXNl czwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPkJsdXJoYXNoIDAuMS4wIGlzIG91dCE8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiMzIj5TWlhYIHY0IChhbmQgRWlvKTwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzQiPkxMVk0gMTUgaXMgb3V0ITwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPk9DYW1sIDUu MS4wIHJlbGVhc2VkPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+TXVsdGljb3JlLCBBc3luYywg YW5kIEx3dDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPlVuaWNvZGUgMTUuMS4wIHVwZGF0ZSBm b3IgVXVjZCwgVXVjcCwgVXVuZiBhbmQgVXVzZWc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5z YWZlbW9uZXkgMC4xLjAgaW5pdGlhbCByZWxlYXNlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+ cHB4X29wdGludDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEwIj5Ea01MIEluc3RhbGwgQVBJIDAu NC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTEiPkRrTUwgV29ya2Zsb3dzIDIuMC54PC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjMTIiPkZvbGxvdyB0aGUgTUwgYW5kIE9DYW1sIHdvcmtzaG9wcyBv bmxpbmUsIFNlcHRlbWJlciA4dGggYW5kIDl0aCBvbiBTZWF0dGxlIHRpbWU8L2E+DQo8L2xpPjxs aT48YSBocmVmPSIjb3JnYTI1YTBjYiI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSIxIj5Ea01MIDIuMC54IFJlbGVhc2VzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZGttbC0yLTAteC1yZWxlYXNlcy8xMjY0Mi85Ij4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGttbC0yLTAteC1yZWxlYXNlcy8xMjY0Mi85PC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzc0YzVjYWQiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc3NGM1Y2FkIj5qYmVja2ZvcmQgYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3NGM1Y2FkIj48L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzA2Mzg3OTgiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmcwNjM4Nzk4Ij5Ea01MIDIuMC4zPC9oND4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcwNjM4Nzk4Ij4NCjxwPkNvbnNpZGVyIDIuMC4zIHRv IGJlIGEgcmVsZWFzZSBjYW5kaWRhdGUuIFRoZSA8YSBocmVmPSJodHRwczovL2dpdGxhYi5jb20v ZGttbC9kaXN0cmlidXRpb25zL2RrbWwvLS9yZWxlYXNlcy8yLjAuMyI+DQppbnN0YWxsZXJzIGFu ZCByZWxlYXNlIG5vdGVzIGFyZSBoZXJlPC9hPi4gPC9wPg0KPHA+VGhlIG1ham9yIGJ1Z2ZpeCBz b2x2ZXMgVmlzdWFsIEMmIzQzOyYjNDM7IFJlZGlzdHJpYnV0YWJsZXMgZmFpbGluZyB3aGVuIGEg aGlnaGVyIHZlcnNpb24gaXMgYWxyZWFkeSBpbnN0YWxsZWQuDQo8L3A+DQo8cD5UaGUgbWFqb3Ig Y2hhbmdlIGlzIHRoYXQgdGhlIOKAnEJ5dGVjb2RlIEVkaXRpb27igJ0gaW5zdGFsbGVyIGlzIG5v IGxvbmdlciBiZWluZyByZWxlYXNlZCwgZHVlIHRvIHRoZSBsYWNrIG9mIHVzZXJzIHNheWluZyB0 aGV5IHdvdWxkIHVzZSBpdC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjIiPkJsdXJoYXNoIDAuMS4wIGlzIG91dCE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1ibHVyaGFzaC0wLTEtMC1pcy1vdXQvMTMwMTMvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWJsdXJoYXNoLTAtMS0wLWlzLW91dC8xMzAxMy8xPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZiZDA0NDMiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmYmQwNDQzIj5hbnFvdSBhbm5vdW5jZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2ZiZDA0NDMiPg0KPHA+SSBh bSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIGEgbmV3IGxpYnJhcnkgQmx1cmhh c2ggMC4xLjAhIDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS91c2hpdG9yYS1h bnFvdS9vY2FtbC1ibHVyaGFzaCI+aHR0cHM6Ly9naXRodWIuY29tL3VzaGl0b3JhLWFucW91L29j YW1sLWJsdXJoYXNoPC9hPg0KPC9wPg0KPHA+VGhpcyBsaWJyYXJ5IGltcGxlbWVudHMgYW4gZW5j b2RlciBmb3IgPGEgaHJlZj0iaHR0cHM6Ly9ibHVyaGEuc2gvIj5CbHVySGFzaDwvYT4gaW4gT0Nh bWwuIEJsdXJIYXNoIGFsbG93cyB1cyB0byBjb252ZXJ0IGFuIGltYWdlIGludG8gYSBzaG9ydCBz dHJpbmcgdGhhdCByZXByZXNlbnRzIGEgbGlnaHR3ZWlnaHQsIOKAmWJsdXJyZWTigJkgdmVyc2lv biBvZiB0aGUgaW5wdXQgaW1hZ2UuIEl0IGNhbiBiZSB1c2VkIGFzIGEgcGxhY2Vob2xkZXIgb24N CiBhIFdlYiBwYWdlLCBmb3IgZXhhbXBsZS4gPC9wPg0KPHA+VGhlIG9ubHkgZnVuY3Rpb24gdGhp cyBsaWJyYXJ5IHByb3ZpZGVzIGlzIDxjb2RlPkJsdXJoYXNoLmJsdXJfaGFzaF9mb3JfcGl4ZWxz PC9jb2RlPiwgd2hpY2ggdGFrZXMgdGhlIHNhbWUgYXJndW1lbnRzIGFzDQo8Y29kZT5ibHVySGFz aEZvclBpeGVsczwvY29kZT4gaW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3dvbHRhcHAv Ymx1cmhhc2gvdHJlZS9tYXN0ZXIvQyI+DQp0aGUgQyByZWZlcmVuY2UgaW1wbGVtZW50YXRpb248 L2E+LiA8L3A+DQo8cD5BbHRob3VnaCBpdCBkb2VzIG5vdCBkZXBlbmQgb24gYW55IGltYWdlIGxp YnJhcnksIHlvdSBjYW4gdXNlIChlLmcuLCkgY2FtbGltYWdlcyB0byBsb2FkIGFuIGltYWdlIGZy b20gYSBmaWxlLg0KPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBj bGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+bG9h ZF9pbWFnZV9hc19yZ2IyNDwvc3Bhbj4gfjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnBh dGg8L3NwYW4+ID0NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDog Ym9sZDsiPm1hdGNoPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5PSW1hZ2Vz Ljwvc3Bhbj4obG9hZCBwYXRoIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7 Ij58Jmd0Ozwvc3Bhbj4gdGFnKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+d2l0aDwvc3Bhbj4NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7 IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5SZ2IyNDwvc3Bhbj4gaW1nIC0mZ3Q7IGltZw0K ICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPlJnYmEzMjwvc3Bhbj4gaW1nIC0mZ3Q7IGltZyN0b19yZ2IyNA0KICB8IDxzcGFuIHN0eWxl PSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkluZGV4ODwvc3Bh bj4gaW1nIC0mZ3Q7IGltZyN0b19yZ2IyNA0KICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUy MTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkluZGV4MTY8L3NwYW4+IGltZyAtJmd0OyBp bWcjdG9fcmdiMjQNCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQt Y29sb3I6ICNmY2Y3ZWY7Ij5DbXlrMzI8L3NwYW4+IF8gLSZndDsgPHNwYW4gc3R5bGU9ImNvbG9y OiAjNTU3NDAwOyBmb250LXdlaWdodDogYm9sZDsiPmZhaWx3aXRoPC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtOb3Qgc3VwcG9ydGVkIGltYWdlIHR5cGU6IENteWsz MiZxdW90Ozwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdo dDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+Ymx1cmhh c2g8L3NwYW4+IH48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij54X2NvbXBvbmVudHM8L3Nw YW4+IH48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij55X2NvbXBvbmVudHM8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnNyYzwvc3Bhbj4gPQ0KICA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5CbHVyaGFzaC48L3NwYW4+Ymx1cl9oYXNoX2Zvcl9waXhlbHMgfnhf Y29tcG9uZW50cyB+eV9jb21wb25lbnRzIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn53 aWR0aDwvc3Bhbj46c3JjI3dpZHRoDQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+ fmhlaWdodDwvc3Bhbj46c3JjI2hlaWdodCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+ Ynl0ZXNfcGVyX3Jvdzwvc3Bhbj46KHNyYyN3aWR0aCAqIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw ODI0ZjsiPjM8L3NwYW4+KSBzcmMjZHVtcA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYw MWY7Ij50ZXN0X2VuY29kZV9jYXNlMTwvc3Bhbj4gKCkgPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDdhOWY7Ij5zcmM8L3NwYW4+ID0gbG9hZF9pbWFnZV9hc19yZ2IyNCA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij5+cGF0aDwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2Ez NDAwOyI+JnF1b3Q7Li4vLi4vLi4vdGVzdC90ZXN0LnBwbSZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5oYXNoPC9zcGFuPiA9IGJsdXJoYXNoIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn54X2NvbXBvbmVudHM8L3NwYW4+OjxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPjQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi Pn55X2NvbXBvbmVudHM8L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjM8L3Nw YW4+IHNyYyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkFsY290ZXN0Ljwvc3Bh bj4oY2hlY2sgc3RyaW5nKSA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDt0ZXN0 MSZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7TEZFLkBE OUYwMV8yJUwlTUlWRCo5R29lLTtXQiZxdW90Ozwvc3Bhbj4gaGFzaDsNCiAgKCkNCjwvcHJlPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+U1pYWCB2NCAoYW5kIEVpbyk8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zenh4LXY0LWFuZC1laW8v MTMwMTQvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zenh4LXY0LWFuZC1laW8v MTMwMTQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn MjA0ZTk2MiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzIwNGU5NjIiPlNpbW9uIEdy b25kaW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmcyMDRlOTYyIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hc2VtaW8vU1pY WCI+R2l0aHViIGxpbms8L2E+IDwvcD4NCjxwPknigJl2ZSByZWNlbnRseSByZWxlYXNlZCB2NCBv ZiBTWlhYIGFuZCBpdOKAmXMgbm93IGJ1aWx0IG9uIEVpbyBpbnN0ZWFkIG9mIEx3dC4gPC9wPg0K PHA+SXQgbWFkZSBtZSByZWFsaXplIGp1c3QgaG93IG11Y2ggY29tcGxleGl0eSB3ZeKAmXZlIGFs bCBhY2NlcHRlZCBhcyB0aGUgY29zdCBvZiBkb2luZyBhc3luY2hyb25vdXMgSU8uDQo8L3A+DQo8 cD5UaGUgY29kZSB3YXMgc28gdGhvcm91Z2hseSBzaW1wbGlmaWVkIHRoYW5rcyB0byBFaW/igJlz IG5vbi1tb25hZGljIGludGVyZmFjZSAobm8gbW9yZSBjb2xvcmVkIGZ1bmN0aW9ucyB0aGF0IGlu ZmVjdCBldmVyeXRoaW5nIHdpdGggYOKAmWEgTHd0LnRgKSBhbmQgaXRzIGNvbmNlcHQgb2YNCjxh IGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9laW8vZWlvL0Vpby9Td2l0 Y2gvaW5kZXguaHRtbCI+U3dpdGNoPC9hPiB0aGF0IEkgd2FzIGFibGUgdG8gaW1wbGVtZW50IGNv bXBsZXggZmVhdHVyZXMgYW5kIG9wdGltaXphdGlvbnMgdGhhdCBJIGhhZCBwcmV2aW91c2x5IGRl ZW1lZCB0b28gY29zdGx5IGluIHRlcm1zIG9mIGRldmVsb3BtZW50IHRpbWUgYW5kIGFkZGVkIGNv bXBsZXhpdHkuDQo8L3A+DQo8cD52NCBpcyBtb3JlIHRoYW4gM3ggZmFzdGVyLCBtdWNoIGVhc2ll ciB0byB1c2UgY29ycmVjdGx5LCBhbmQgb2ZmZXJzIHN0cm9uZ2VyIG1lbW9yeSB1c2FnZSBndWFy YW50ZWVzLCBhbGwgdGhhbmtzIHRvIEVpby4NCjwvcD4NCjxwPlNaWFggaXMgYSAqUyp0cmVhbWlu ZyAqWipJUCwgKlgqTUwgYW5kICpYKkxTWCBsaWJyYXJ5LiA8L3A+DQo8cD5JdCBjYW4gc3RyZWFt IGRhdGEgb3V0IG9mIHRoZXNlIDMgZmlsZSBmb3JtYXRzIGV2ZW4gd2hlbiByZWFkaW5nIGZyb20g YSBuZXR3b3JrIHNvY2tldCwgZWl0aGVyIGluIGNvbnN0YW50IG1lbW9yeSBvciB3aXRoIHVzZXIt ZGVmaW5lZCBtZW1vcnkgdXNhZ2UgZ3VhcmFudGVlcy4NCjwvcD4NCjxwPkFsbCAzIGZvcm1hdHMg YXJlIHF1aXRlIOKAnHF1aXJreeKAnSB0byBzYXkgdGhlIGxlYXN0LiBYTFNYIChha2EuIE9PWE1M KSBpcyBpbmZhbW91cyBmb3IgYmVpbmcgZGlmZmljdWx0IHRvIHN0cmVhbS4gSSBjb3VsZCB0YWxr IGF0IGxlbmd0aCBhYm91dCBhbGwgdGhlIGRpZmZlcmVudCBzdWJzcGVjaWVzIG9mIFpJUCBmaWxl cyENCjwvcD4NCjxwPldoZW5ldmVyIGdpdmluZyB1cCB0aGUgbm9uLXNlZWthYmlsaXR5IHJlcXVp cmVtZW50IChuZXR3b3JrIHN0cmVhbXMsIGV0Yy4pIGJyaW5ncyBiZW5lZml0cywgU1pYWCBvZmZl cnMNCjxiPmJvdGg8L2I+IGludGVyZmFjZXM6IGFuIGVhc2llciBhbmQvb3IgbW9yZSBwZXJmb3Jt YW50IGZ1bmN0aW9uIHRoYXQgbWF5IOKAnGp1bXDigJ0gYXJvdW5kIGEgZmlsZSwNCjxiPmFuZCBh bHNvPC9iPiBhIG1vcmUgYWR2YW5jZWQgbm9uLXNlZWtpbmcgZnVuY3Rpb24uIDwvcD4NCjxwPkh1 bmRyZWRzIG9mIGhvdXJzIG9mIGJlbmNobWFya2luZywgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL2FzZW1pby9TWlhYL2Jsb2IvODk0ZjQ1YzIyNzQwNGViYWVkZTFiNDkxOGE4YWQ0ZjY1Yzhh NDczMi9zcmMvcGFyc2luZy5tbCI+DQpvcHRpbWl6YXRpb248L2E+IGFuZCB0ZXN0aW5nIGhhdmUg Z29uZSBpbnRvIHRoaXMgbGF0ZXN0IHJlbGVhc2UgdG8gc3F1ZWV6ZSBvdXQgYXMgbXVjaCBwZXJm b3JtYW5jZSBhcyBwb3NzaWJsZSBhbmQgSeKAmW0gZXh0cmVtZWx5IHBsZWFzZWQgd2l0aCB0aGUg cmVzdWx0Lg0KPC9wPg0KPHA+SSBob3BlIGl0IHByb3ZlcyB1c2VmdWwgdG8gdGhlIE9DYW1sIGVj b3N5c3RlbS4gRmVlbCBmcmVlIHRvIGFzayBhbnkgcXVlc3Rpb25zIGFib3V0IFNaWFgsIEVpbywg WExTWCwgWklQLCBYTUwsIGV0Yy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5M TFZNIDE1IGlzIG91dCE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1sbHZtLTE1LWlzLW91dC8xMzAxOS8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWxsdm0tMTUtaXMtb3V0LzEzMDE5LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2ZlMjc3ODYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdm ZTI3Nzg2Ij5hbGFuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnZmUyNzc4NiI+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1s Lm9yZy9wYWNrYWdlcy9sbHZtL2xsdm0uMTUuMC43JiM0MztubnAtMi8iPk9DYW1sIGJpbmRpbmdz IHRvIExMVk0gMTU8L2E+IGhhdmUgYmVlbiByZWxlYXNlZCBvbiBvcGFtIQ0KPC9wPg0KPHA+VGhp cyBpcyBhIG1pbGVzdG9uZSBpbiB3b3JrIGNvbnRyYWN0ZWQgYnkgdGhlIE9DYW1sIFNvZnR3YXJl IEZvdW5kYXRpb24gdG8gZW5zdXJlIHRoZSBPQ2FtbCBMTFZNIGJpbmRpbmdzIHJlbWFpbiB1cCB0 byBkYXRlIHdpdGggYm90aCBjaGFuZ2VzIGluIE9DYW1sIGFuZCBMTFZNLiBGaXJzdCwgSSB3b3Vs ZCBsaWtlIHRvIHRoYW5rIEBqamIgZm9yIHN1cGVydmlzaW5nIG1lLCBhbmQgQEtpdC10eS1rYXRl IGFuZCBAS2FrYWR1IG9uIEdpdEh1Yg0KIGZvciB0aGVpciB2YWx1YWJsZSBoZWxwLiA8L3A+DQo8 cD5XaGlsZSBwcmV2aW91cyB2ZXJzaW9ucyBvZiBPQ2FtbCBoYXZlIHN1cHBvcnRlZCBuYWtlZCBw b2ludGVycyAocG9pbnRlcnMgdG8gb3V0c2lkZSB0aGUgT0NhbWwgaGVhcCBhcyBPQ2FtbCB2YWx1 ZXMpLCBPQ2FtbCA14oCZcyBuZXcgbXVsdGljb3JlIHJ1bnRpbWUgZGlzYWxsb3dzIG5ha2VkIHBv aW50ZXJzLiBGdXJ0aGVybW9yZSwgT0NhbWwgNSBkZXByZWNhdGVkIHZhcmlvdXMgcnVudGltZSBB UEkgZnVuY3Rpb25zLiBJIGhhZCBwcmV2aW91c2x5DQogd3JpdHRlbiA8YSBocmVmPSJodHRwczov L3Jldmlld3MubGx2bS5vcmcvRDEzNjQwMCI+aHR0cHM6Ly9yZXZpZXdzLmxsdm0ub3JnL0QxMzY0 MDA8L2E+IHRvIGFkYXB0IHRoZSBMTFZNIGJpbmRpbmdzIG9uIHRoZSBtYWluIGJyYW5jaCB0byB0 aGVzZSBjaGFuZ2VzLCBidXQgTExWTSAxNSBoYWQgYWxyZWFkeSBiZWVuIHJlbGVhc2VkIGJ5IHRo ZW4sIHdpdGggbmFrZWQgcG9pbnRlcnMgaW4gdXNlLiBUaGVyZWZvcmUsIEkgYmFja3BvcnRlZCBE MTM2NDAwDQogdG8gTExWTSAxNSBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWxhbi1q LWh1L2xsdm0tcHJvamVjdC90cmVlL3JlbGVhc2UvMTUueCYjNDM7b3BhbSI+DQpteSBmb3JrPC9h PiwgYW5kIHRoaXMgZm9yayBpcyB3aGF0IGlzIHB1Ymxpc2hlZCBvbiBvcGFtLiBUaGVyZWZvcmUs IHRoZSB2ZXJzaW9uIG9mIExMVk0gMTUgb24gb3BhbSBpcyBjb21wYXRpYmxlIHdpdGggT0NhbWwg NS4NCjwvcD4NCjxwPkZ1cnRoZXJtb3JlLCB0aGUgTExWTSBJUiBoYXMgYmVlbiBtaWdyYXRpbmcg ZnJvbSBwb2ludGVycyB3aGljaCBjYXJyeSB0aGUgdHlwZXMgb2YgdGhlaXIgcG9pbnRlZXMgdG8g dW50eXBlZCDigJxvcGFxdWUgcG9pbnRlcnMu4oCdIEFzIGEgcmVzdWx0LCBtYW55IExMVk0gQVBJ IGZ1bmN0aW9ucyBoYXZlIGJlZW4gZGVwcmVjYXRlZCBhbmQgcmVwbGFjZWQuIEZvciBleGFtcGxl LA0KPGNvZGU+YnVpbGRfY2FsbDwvY29kZT4gaGFzIGJlZW4gZGVwcmVjYXRlZCB3aXRoIHRoZSBy ZXBsYWNlbWVudCBiZWluZyA8Y29kZT5idWlsZF9jYWxsMjwvY29kZT4uIEkgaGF2ZSBhZGRlZCBk ZXByZWNhdGlvbiBhbGVydHMgdG8gdGhlIHJlbGV2YW50IGZ1bmN0aW9ucyBhbmQgYWRkZWQgbWlz c2luZyBiaW5kaW5ncyB0byBjb25zdHJ1Y3Qgb3BhcXVlIHBvaW50ZXJzLg0KPC9wPg0KPHA+VGhl IGNoYW5nZXMgYmV0d2VlbiB0aGUgdXBzdHJlYW0gTExWTSAxNSBicmFuY2ggYW5kIHRoZSBmb3Jr IHB1Ymxpc2hlZCBvbiBvcGFtIGNhbiBiZSB2aWV3ZWQgYXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9sbHZtL2xsdm0tcHJvamVjdC9jb21wYXJlL3JlbGVhc2UvMTUueC4uLmFsYW4tai1o dTpsbHZtLXByb2plY3Q6YWE0NDA0MGI2MDk2ODcwZDZiZGVjYzdjYzdjOWU1NTRmN2IyNWE1NCI+ DQpodHRwczovL2dpdGh1Yi5jb20vbGx2bS9sbHZtLXByb2plY3QvY29tcGFyZS9yZWxlYXNlLzE1 LnguLi5hbGFuLWotaHU6bGx2bS1wcm9qZWN0OmFhNDQwNDBiNjA5Njg3MGQ2YmRlY2M3Y2M3Yzll NTU0ZjdiMjVhNTQ8L2E+Lg0KPC9wPg0KPHA+SW5kZXBlbmRlbnRseSwgQEtpdC10eS1rYXRlIGhh ZCBiZWVuIHdvcmtpbmcgb24gYnVpbGRpbmcgdGhlIExMVk0gYmluZGluZ3Mgd2l0aCBEdW5lIGlu c3RlYWQgb2YgdGhlIGluLXRyZWUgT0NhbWxmaW5kLWJhc2VkIHN5c3RlbSBhdA0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL2xsdm0tZHVuZSI+aHR0cHM6Ly9naXRodWIu Y29tL2tpdC10eS1rYXRlL2xsdm0tZHVuZTwvYT4uIEhlciByZXBvIGhhcyBhIEdpdCBzdWJtb2R1 bGUgdGhhdCBwb2ludHMgdG8gbXkgZm9yayBvZiBMTFZNLCBhbmQgaGVyIHJlcG8gY29udGFpbnMg dGhlIER1bmUgc2NhZmZvbGRpbmcgdGhhdCB0aGUgTExWTSAxNSByZWxlYXNlIG9uIG9wYW0gdXNl cy4gVGhpcyBjaGFuZ2Ugb2YgYnVpbGQNCiBzeXN0ZW1zIG1heSBoYXZlIGltcGxpY2F0aW9ucyBm b3Igc2VsZWN0aW5nIGJldHdlZW4gZHluYW1pYyBhbmQgc3RhdGljIGxpbmtpbmcgdG8gTExWTToN CjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5QcmlvciBvcGFtIHJlbGVhc2VzIG9mIExM Vk0gdXNlIE9DYW1sZmluZCwgd2hpY2ggaXMgc3VwcG9ydGVkIHZpYSB0aGUgaW4tdHJlZSBNRVRB IGZpbGUuIFRoZSBwYWNrYWdlIGhhZCBhIHNjcmlwdCB0aGF0IGluc3RhbGxlZCB2ZXJzaW9ucyBv ZiB0aGUgYmluZGluZ3MgdGhhdCBsaW5rIHN0YXRpY2FsbHkgb3IgZHluYW1pY2FsbHkgdG8gTExW TSAoaWYgZWFjaCB3YXMgYXZhaWxhYmxlKSBhbmQgcGF0Y2hlZCB0aGUgTUVUQSBmaWxlIHRvIHVz ZQ0KIHRoZSA8Y29kZT5sbHZtLnN0YXRpYzwvY29kZT4gcHJlZGljYXRlIHRvIGNob29zZSBiZXR3 ZWVuIHRoZW0uIDwvbGk+PGxpPlRoZSA8Y29kZT5sbHZtLnN0YXRpYzwvY29kZT4gcHJlZGljYXRl IGNhbiBiZSBzZXQgdXNpbmcgT0NhbWxmaW5kIGJ1dCBjYW5ub3QgYmUgc2V0IGZyb20gRHVuZS4N CjwvbGk+PGxpPlRoZSBMTFZNIDE1IHJlbGVhc2UgdXNlcyBEdW5lLCB3aGljaCBpdCBzdXBwb3J0 cyBieSBydW5uaW5nIGEgc2NyaXB0IHRoYXQgZ2VuZXJhdGVzIER1bmUgZmlsZXMgaW4gdGhlIHNv dXJjZSB0cmVlLiBUaGUgc2NyaXB04oCZcyBnZW5lcmF0ZWQgRHVuZSBmaWxlcyB1c2UgdGhlIHZp cnR1YWwgbGlicmFyeSBmZWF0dXJlIHRvIGRlZmluZSB2ZXJzaW9ucyBvZiB0aGUgbGlicmFyeSB0 aGF0IGxpbmsgc3RhdGljYWxseSBvciBkeW5hbWljYWxseSB0bw0KIExMVk0gKGlmIGVhY2ggaXMg YXZhaWxhYmxlKS4gPC9saT48bGk+T0NhbWxmaW5kLWJhc2VkIHBhY2thZ2VzIGRvbuKAmXQgdW5k ZXJzdGFuZCB0aGUgRHVuZSB2aXJ0dWFsIGxpYnJhcnkgZmVhdHVyZSBhbmQgdGhlcmVmb3JlIGNh bm5vdCB1c2UgdGhlIOKAnGRlZmF1bHQgaW1wbGVtZW50YXRpb27igJ0gYW5kIG11c3Qgc2VsZWN0 IHRoZSBzdGF0aWMgb3IgZHluYW1pYyBpbXBsZW1lbnRhdGlvbiBleHBsaWNpdGx5Lg0KPC9saT48 bGk+QGtpdC10eS1rYXRlIGJlbGlldmVzIHRoYXQgdGhlIHBhY2thZ2UgYnVpbGRzIGZhc3RlciBh bmQgaXMgZWFzaWVyIHRvIG1haW50YWluIHdpdGggRHVuZS4NCjwvbGk+PC91bD4NCjxwPkZ1cnRo ZXIgY29udGV4dDogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fzay1mb3It c3VnZ2VzdGlvbnMtZm9yLXRoZS1uZXh0LXozLXBhY2thZ2UtcmVsZWFzZS84OTIyLzQiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fzay1mb3Itc3VnZ2VzdGlvbnMtZm9yLXRoZS1uZXh0 LXozLXBhY2thZ2UtcmVsZWFzZS84OTIyLzQ8L2E+IGFuZA0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3VzaW5nLW91dHB1dC1vZi1vY2FtbGZpbmQtcGFyYW1zLW9ubHktc2hv dy1pbi1hLWR1bmUtYnVpbGQvNDE4NyI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXNp bmctb3V0cHV0LW9mLW9jYW1sZmluZC1wYXJhbXMtb25seS1zaG93LWluLWEtZHVuZS1idWlsZC80 MTg3PC9hPi4NCjwvcD4NCjxwPkluIHRoZSBwcm9jZXNzIG9mIHByZXBhcmluZyB0aGlzIHJlbGVh c2UsIEBLaXQtdHkta2F0ZSBhbmQgQEtha2FkdSB0ZXN0ZWQgbXkgY2hhbmdlcyBvbiB0aGVpciBw ZXJzb25hbCBwcm9qZWN0cyBhbmQgaGVscGVkIHVuY292ZXIgaXNzdWVzLg0KPC9wPg0KPHA+UGxl YXNlIGxldCBtZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMuIDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI1Ij5PQ2FtbCA1LjEuMCByZWxlYXNlZDwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0xLTAtcmVsZWFzZWQvMTMwMjEvMSI+aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMS0wLXJlbGVhc2VkLzEzMDIxLzE8L2E+ DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2QwNTgyM2UiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkMDU4MjNlIj5vY3RhY2hyb24gYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkMDU4MjNlIj4N CjxwPldlIGhhdmUgdGhlIHBsZWFzdXJlIG9mIGNlbGVicmF0aW5nIHRoZSBhbm5pdmVyc2FyeSBv ZiBPbHltcGUgZGUgR291Z2Vz4oCZIOKAnERlY2xhcmF0aW9uIG9mIHRoZSBSaWdodHMgb2YgV29t YW4gYW5kIG9mIHRoZSBGZW1hbGUgQ2l0aXplbuKAnSBieSBhbm5vdW5jaW5nIHRoZSByZWxlYXNl IG9mIE9DYW1sIHZlcnNpb24gNS4xLjAuDQo8L3A+DQo8cD5Tb21lIG9mIHRoZSBoaWdobGlnaHRz IGluIE9DYW1sIDUuMS4wIGFyZTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk1hbnkg cnVudGltZSBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGFuZCBtZW1vcnktbGVha3MgZml4ZXMgPC9s aT48L3VsPg0KPHA+KGR5bmxpbmtpbmcsIHdlYWsgYXJyYXksIHdlYWsgaGFzaCBzZXRzLCBHQyB3 aXRoIGlkbGUgZG9tYWlucywgR0MgcHJlZmV0Y2hpbmcpDQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+UmVzdG9yZWQgc3VwcG9ydCBmb3IgbmF0aXZlIGNvZGUgZ2VuZXJhdGlvbiBvbiBS SVNDLVYgYW5kIHMzOTB4IGFyY2hpdGVjdHVyZXMNCjwvbGk+PGxpPlJlc3RvcmVkIEN5Z3dpbiBw b3J0IDwvbGk+PGxpPlJlZHVjZWQgaW5zdGFsbGF0aW9uIHNpemUgKDUwJSByZWR1Y3Rpb24pIDwv bGk+PGxpPkNvbXByZXNzZWQgY29tcGlsYXRpb24gYXJ0ZWZhY3RzICguY21pLCAuY210LCAuY210 aSwgLmNtbywgLmNtYSBmaWxlcykgPC9saT48bGk+MTkgZXJyb3IgbWVzc2FnZSBpbXByb3ZlbWVu dHMgPC9saT48bGk+MTQgc3RhbmRhcmQgbGlicmFyeSBmdW5jdGlvbnMgbWFkZSB0YWlsLXJlY3Vy c2l2ZSB3aXRoIFRhaWwtUmVjdXJzaW9uLU1vZHVsby1Db25zIChUUk1DKSwgc3VjaCBhcw0KPGNv ZGU+TGlzdC5hcHBlbmQ8L2NvZGU+IGFuZCA8Y29kZT5MaXN0Lm1hcDwvY29kZT4gPC9saT48bGk+ NTcgbmV3IHN0YW5kYXJkIGxpYnJhcnkgZnVuY3Rpb25zIDwvbGk+PGxpPk1vcmUgZXhhbXBsZXMg aW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiA8L2xpPjxsaT40MiBidWcgZml4 ZXMgPC9saT48L3VsPg0KPHA+T0NhbWwgNS4xLjAgaXMgc3RpbGwgYSByZWxhdGl2ZWx5IGV4cGVy aW1lbnRhbCByZWxlYXNlIGNvbXBhcmVkIHRvIHRoZSBPQ2FtbCA0LjE0IGJyYW5jaC4gSW4gcGFy dGljdWxhcjoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGUgUE9XRVIgcG9ydCBp cyBiZWluZyB0ZXN0ZWQgaW4gdGhlIGRldiB2ZXJzaW9uIG9mIHRoZSBjb21waWxlci4gPC9saT48 bGk+VGhlIFdpbmRvd3MgTVNWQyBwb3J0IGlzIHN0aWxsIHVuYXZhaWxhYmxlLiA8L2xpPjxsaT5F cGhlbWVyb24gcGVyZm9ybWFuY2VzIG5lZWQgdG8gYmUgaW52ZXN0aWdhdGVkLiA8L2xpPjxsaT5H QyBjb21wYWN0aW9uIGlzIGEgd29yayBpbiBwcm9ncmVzcy4gPC9saT48bGk+PGNvZGU+c3RhdG1l bXByb2Y8L2NvZGU+IGlzIGEgd29yayBpbiBwcm9ncmVzcy4gPC9saT48bGk+VGhlcmUgYXJlIGEg bnVtYmVyIG9mIGtub3duIHJ1bnRpbWUgY29uY3VycmVuY3kgYnVncyAodGhhdCB0cmlnZ2VyIHVu ZGVyIHJhcmUgY2lyY3Vtc3RhbmNlcykuDQo8L2xpPjwvdWw+DQo8cD5XZSBhcmUgcGxhbm5pbmcg dG8gYWRkcmVzcyB0aG9zZSByZWdyZXNzaW9ucywgaG9wZWZ1bGx5IGluIHRpbWUgZm9yIHRoZSBP Q2FtbCA1LjIuMCByZWxlYXNlIGZvciBzb21lIG9mIHRoZW0uIE1lYW53aGlsZSwgdGhlIE9DYW1s IDQuMTQgYnJhbmNoIHdpbGwgYmUgbWFpbnRhaW5lZCwgYW5kIHRoZSBuZXh0IHJlbGVhc2Ugb24g dGhlIE9DYW1sIDQuMTQgYnJhbmNoLCBPQ2FtbCA0LjE0LjIsIHNob3VsZCBmb2xsb3cgdGhpcyBy ZWxlYXNlIGluDQogdGhlIHVwY29taW5nIG1vbnRocy4gPC9wPg0KPHA+UGxlYXNlIHJlcG9ydCBh bnkgdW5leHBlY3RlZCBiZWhhdmlvdXJzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzIj4NCk9DYW1sIGlzc3VlIHRyYWNrZXI8L2E+IGFuZCBwb3N0 IGFueSBxdWVzdGlvbnMgb3IgY29tbWVudHMgeW91IG1pZ2h0IGhhdmUgb24gb3VyIDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmciPg0KZGlzY3Vzc2lvbiBmb3J1bXM8L2E+LiA8L3A+ DQo8cD5UaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGluIHRoZSA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0xLTAtcmVsZWFzZWQvMTMwMjEv MiI+DQpjaGFuZ2Vsb2cgYmVsb3c8L2E+LiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzU3MTI5NWMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc1NzEy OTVjIj5JbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmc1NzEyOTVjIj4NCjxwPlRoZSBiYXNlIGNvbXBpbGVyIGNhbiBi ZSBpbnN0YWxsZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRz Og0KPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3Jj IHNyYy1zaGVsbCI+b3BhbSB1cGRhdGUNCm9wYW0gc3dpdGNoIGNyZWF0ZSA1LjEuMA0KPC9wcmU+ DQo8L2Rpdj4NCjxwPlRoZSBzb3VyY2UgY29kZSBmb3IgdGhlIHJlbGVhc2UgY2FuZGlkYXRlIGlz IGFsc28gZGlyZWN0bHkgYXZhaWxhYmxlIG9uOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS4xLjAu dGFyLmd6Ij5HaXRIdWI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vY2FtbC5pbnJpYS5m ci9wdWIvZGlzdHJpYi9vY2FtbC01LjEvb2NhbWwtNS4xLjAudGFyLmd6Ij5PQ2FtbCBhcmNoaXZl cyBhdCBJbnJpYTwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPjxhIGlkPSJvcmczNTVkYWU5Ij48L2E+RmluZS1UdW5lZCBDb21waWxlciBDb25maWd1cmF0 aW9uPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzM1NWRhZTki Pg0KPHA+SWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBp bGVyLCB5b3UgY2FuIHN3aXRjaCB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCjwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwi Pm9wYW0gdXBkYXRlDQpvcGFtIHN3aXRjaCBjcmVhdGUgJmx0O3N3aXRjaF9uYW1lJmd0OyBvY2Ft bC12YXJpYW50cy41LjEuMCYjNDM7b3B0aW9ucyAmbHQ7b3B0aW9uX2xpc3QmZ3Q7DQo8L3ByZT4N CjwvZGl2Pg0KPHA+d2hlcmUgPGNvZGU+Jmx0O29wdGlvbl9saXN0Jmd0OzwvY29kZT4gaXMgYSBj b21tYS1zZXBhcmF0ZWQgbGlzdCBvZiA8Y29kZT5vY2FtbC1vcHRpb24tKjwvY29kZT4gcGFja2Fn ZXMuIEZvciBpbnN0YW5jZSwgZm9yIGENCjxjb2RlPmZsYW1iZGE8L2NvZGU+IGFuZCA8Y29kZT5u by1mbGF0LWZsb2F0LWFycmF5PC9jb2RlPiBzd2l0Y2g6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1z cmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0gc3dpdGNoIGNy ZWF0ZSA1LjEuMCYjNDM7ZmxhbWJkYSYjNDM7bmZmYSBvY2FtbC12YXJpYW50cy41LjEuMCYjNDM7 b3B0aW9ucw0Kb2NhbWwtb3B0aW9uLWZsYW1iZGEgb2NhbWwtb3B0aW9uLW5vLWZsYXQtZmxvYXQt YXJyYXkNCjwvcHJlPg0KPC9kaXY+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI2Ij5NdWx0aWNvcmUsIEFzeW5jLCBhbmQgTHd0PC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0aWNvcmUtYXN5bmMtYW5kLWx3dC8yNjg3LzE4Ij4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tdWx0aWNvcmUtYXN5bmMtYW5kLWx3dC8yNjg3 LzE4PC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzU1MTdk YTQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1NTE3ZGE0Ij5BbnRvbiBLb2Noa292 IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn NTUxN2RhNCI+DQo8cD5BIHNpbXBsZSBwb3J0aW5nIGd1aWRlIGZyb20gTHd0IHRvIEVpbyBhcyBh IGRlZmluaXRpdmUgYW5zd2VyIHRvIG15IG93biBxdWVzdGlvbiBmcm9tIHllYXJzIGFnbzoNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbHd0X2VpbyNwb3J0aW5n LWEtbHd0LWFwcGxpY2F0aW9uLXRvLWVpbyI+DQpodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL2x3dF9laW8jcG9ydGluZy1hLWx3dC1hcHBsaWNhdGlvbi10by1laW88L2E+IDwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5Vbmljb2RlIDE1LjEuMCB1cGRhdGUgZm9yIFV1 Y2QsIFV1Y3AsIFV1bmYgYW5kIFV1c2VnPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tdW5pY29kZS0xNS0xLTAtdXBkYXRlLWZvci11dWNkLXV1Y3AtdXVuZi1hbmQt dXVzZWcvMTMwMjYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXVuaWNvZGUt MTUtMS0wLXVwZGF0ZS1mb3ItdXVjZC11dWNwLXV1bmYtYW5kLXV1c2VnLzEzMDI2LzE8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVlMWNmNGYiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1ZTFjZjRmIj5EYW5pZWwgQsO8bnpsaSBhbm5vdW5j ZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVlMWNmNGYi Pg0KPHA+VW5pY29kZSAxNS4xLjAgd2FzIHJlbGVhc2VkIG9uIFNlcHRlbWJlciAxMi4gPC9wPg0K PHA+VGhpcyBpcyBhIHBvaW50IHJlbGVhc2UgZm9yIFVuaWNvZGUgb3JnYW5pc2F0aW9uYWwgcmVh c29ucyBidXQgaXQgc3RpbGwgYWRkcyA2MjcgbmV3IGNoYXJhY3RlcnMgdG8gdGhlIHN0YW5kYXJk IGFuZCBhIGZldyBydWxlcyB3ZXJlIGNoYW5nZWQgaW4gdGhlIHNlZ21lbnRhdGlvbiBzdGFuZGFy ZHMuIFNlZSB0aGUgZGV0YWlscyBvbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vYmxvZy51bmljb2Rl Lm9yZy8yMDIzLzA5L2Fubm91bmNpbmctdW5pY29kZS1zdGFuZGFyZC12ZXJzaW9uLTE1MS5odG1s Ij4NCmFubm91bmNlbWVudCBwYWdlPC9hPi4gPC9wPg0KPHA+QWNjb3JkaW5nbHkgdGhlIGxpYnJh cmllcyBtZW50aW9uZWQgYXQgdGhlIGVuZCBvZiB0aGlzIG1lc3NhZ2UgaGFkIHRvIGJlIHVwZGF0 ZWQuIENvbnN1bHQgdGhlIGluZGl2aWR1YWwgcmVsZWFzZSBub3RlcyBmb3IgZGV0YWlscy4gQm90 aA0KPGNvZGU+VXVjZDwvY29kZT4gYW5kIDxjb2RlPlV1Y3A8L2NvZGU+IGFyZSBpbmNvbXBhdGli bGUgcmVsZWFzZXMgc2luY2VzIGEgYmxvY2sgZW51bWVyYW50IGhhZCB0byBiZSBhZGRlZCBhbmQg c29tZSBwcm9wZXJ0eSB2YWx1ZXMgY2hhbmdlZCB0aGVpciB0eXBlLiBBIGZldyBuZXcgcHJvcGVy dGllcyByZWxhdGVkIHRvIGlkZW50aWZpZXJzLCBDSksgYW5kIEluZGljIGJyZWFraW5nIGFyZSBh bHNvIGFkZGVkLCBzZWUgdGhlDQo8Y29kZT5VdWNwPC9jb2RlPiByZWxlYXNlIG5vdGVzIGZvciBk ZXRhaWxzLiA8L3A+DQo8cD5BcyBtZW50aW9uZWQgbGFzdCB5ZWFyIGFsbCB0aGUgbGlicmFyaWVz IGFuZCBzYW1wbGUgY29kZSBoYXZlIGJlZW4gY2hhbmdlZCB0byB1c2UgdGhlIFVURiBkZWNvZGVy cyBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeSByYXRoZXIgdGhhbiByZWx5IG9uIHRoZQ0KPGNvZGU+ dXV0ZjwvY29kZT4gcGFja2FnZS4gPC9wPg0KPHA+VGhpcyBoYXMgdGhlIGZvbGxvd2luZyBpbXBh Y3Q6IDwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5UaGVzZSBuZXcgdmVyc2lvbnMgYXJl IG9ubHkgYXZhaWxhYmxlIGZvciBPQ2FtbCAmZ3Q7PSA0LjE0LjAgPC9saT48bGk+VGhlIGxpYnJh cnkgbmFtZSA8Y29kZT51dW5mLnN0cmluZzwvY29kZT4gaXMgZGVwcmVjYXRlZC4gVGhlIDxjb2Rl PlV1bmZfc3RyaW5nPC9jb2RlPiBtb2R1bGUgaXMgbm93IHNpbXBseSBwYXJ0IG9mIHRoZQ0KPGNv ZGU+dXVuZjwvY29kZT4gbGlicmFyeS4gPC9saT48bGk+VGhlIGxpYnJhcnkgbmFtZSA8Y29kZT51 dXNlZy5zdHJpbmc8L2NvZGU+IGlzIGRlcHJlY2F0ZWQuIFRoZSA8Y29kZT5VdXNlZ19zdHJpbmc8 L2NvZGU+IG1vZHVsZSBpcyBub3cgc2ltcGx5IHBhcnQgb2YgdGhlDQo8Y29kZT51dXNlZzwvY29k ZT4gbGlicmFyeS4gPC9saT48L29sPg0KPHA+UmVnYXJkaW5nIHBvaW50IDIuIGFuZCAzLiB0aGUg bGlicmFyaWVzIHN0aWxsIGV4aXN0IGJ1dCBnZW5lcmF0ZSBhbiA8Y29kZT5vY2FtbGZpbmQ8L2Nv ZGU+IHdhcm5pbmcgaWYgdGhleSBhcmUgdXNlZC4gVGhleSBhcmUgZW1wdHkgYW5kIHNpbXBseSBy ZXF1aXJlIHRoZSBiYXNlIGxpYnJhcnkuIFRoZXkgd2lsbCBiZSBmdWxseSByZW1vdmVkIGF0IHNv bWUgcG9pbnQuDQo8L3A+DQo8cD5Ud28gb3RoZXIgbGVzcyB2aXNpYmxlIGNoYW5nZXMgYXJlOiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QWZ0ZXIgd2FpdGluZyBmb3IgdG9vIGxvbmcg aWYgaW50cmEgbW9kdWxlIGxpbmsgdGltZSBkZWFkIGNvZGUgZWxpbWluYXRpb24gd291bGQgbWF5 YmUgbWFrZSBpdCBpbiB0aGUgY29tcGlsZXIsDQo8Y29kZT5VdWNwPC9jb2RlPiB3YXMgZmluYWxs eSBjaGFuZ2VkIHRvIHVzZSBtb2R1bGUgYWxpYXNlcy4gVGhpcyBtZWFucyB0aGF0IG9ubHkgdGhl IGRhdGEgbW9kdWxlcyB5b3UgdXNlIGdldCBsaW5rZWQgaW4geW91ciBwcm9ncmFtcy4NCjwvbGk+ PGxpPkFsc28gYWZ0ZXIgbXVjaCByZWx1Y3RhbmNlLCB0aGUgcmVwb3Mgbm93IHRyYWNrIGdlbmVy YXRlZCBkYXRhIGZpbGVzIGZvciBiZXR0ZXIgc291cmNlIHRyYWNlYWJpbGl0eSwgc2FuZGJveGVk IHBpbm5pbmcsIGFuZCBtYWtlIGl0IGVhc2llciB0byBkaWcgdGhlbSBvdXQgd2hlbiB0aGVpciBk YXRhIGdlbmVyYXRpb24gc3RyYXRlZ3kgYnJlYWtzIHRoZSBjb21waWxlci4NCjwvbGk+PC91bD4N CjxwPkEgYmlnIHRoYW5rcyBmb3IgZnVuZGluZyBmcm9tIHRoZSA8YSBocmVmPSJodHRwOi8vb2Nh bWwtc2Yub3JnLyI+T0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gYW5kIGZyb20gbXkNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy9kYnVlbnpsaSI+ZG9uYXRvcnM8L2E+ LiA8L3A+DQo8cD5JIHdlbGNvbWUgYW5kIHRoYW5rIHRoZSBuZXcgZG9uYXRvciA8YSBocmVmPSJo dHRwczovL2FocmVmcy5jb20vIj5haHJlZnM8L2E+LiA8L3A+DQo8cD5BbmQgcmVtZW1iZXIsIE9D YW1sIDpoZWFydDogVW5pY29kZS4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlV1Y2Qg MTUuMS4wIFVuaWNvZGUgY2hhcmFjdGVyIGRhdGFiYXNlIGRlY29kZXIgZm9yIE9DYW1sLiA8YSBo cmVmPSJodHRwOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3V1Y2QiPg0KaHR0cDovL2VycmF0aXF1 ZS5jaC9zb2Z0d2FyZS91dWNkPC9hPiA8L2xpPjxsaT5VdWNwIDE1LjEuMCBVbmljb2RlIGNoYXJh Y3RlciBwcm9wZXJ0aWVzIGZvciBPQ2FtbC4gPGEgaHJlZj0iaHR0cDovL2VycmF0aXF1ZS5jaC9z b2Z0d2FyZS91dWNwIj4NCmh0dHA6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvdXVjcDwvYT4gPC9s aT48bGk+VXVuZiAxNS4xLjAgVW5pY29kZSB0ZXh0IG5vcm1hbGl6YXRpb24gZm9yIE9DYW1sLiA8 YSBocmVmPSJodHRwOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL3V1bmYiPg0KaHR0cDovL2VycmF0 aXF1ZS5jaC9zb2Z0d2FyZS91dW5mPC9hPiA8L2xpPjxsaT5VdXNlZyAxNS4xLjAgVW5pY29kZSB0 ZXh0IHNlZ21lbnRhdGlvbiBmb3IgT0NhbWwuIDxhIGhyZWY9Imh0dHA6Ly9lcnJhdGlxdWUuY2gv c29mdHdhcmUvdXVzZWciPg0KaHR0cDovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS91dXNlZzwvYT4g PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPnNhZmVtb25leSAwLjEuMCBp bml0aWFsIHJlbGVhc2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1zYWZlbW9uZXktMC0xLTAtaW5pdGlhbC1yZWxlYXNlLzEzMDI5LzEiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1zYWZlbW9uZXktMC0xLTAtaW5pdGlhbC1yZWxlYXNlLzEzMDI5 LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDUwY2Nh YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzQ1MGNjYWMiPkdlb2ZmcmV5IEJvcm91 Z2ggYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmc0NTBjY2FjIj4NCjxwPkhlbGxvIGV2ZXJ5b25lISBGaXJzdCB0aW1lIHBvc3RlciBhbmQgb2Nh bWwgY29udHJpYnV0b3IgaGVyZSwgSSBqdXN0IHJlbGVhc2UgYSBsaWJyYXJ5IG5hbWVkIOKAnHNh ZmVtb25leeKAnSB3aGljaCBpcyBpbnRlbmRlZCB0byB1cGhvbGQgdHlwZSBzYWZldHkgYW5kIGVu Zm9yY2UgbG9zc2xlc3Mgb3BlcmF0aW9ucyBmb3IgdmFyaW91cyBraW5kIG9mIGN1cnJlbmN5IG1h bmlwdWxhdGlvbnMgYW5kIG9mZmVycyBjb252ZW5pZW50IGFwaSBmb3IgdXNlcnMuDQogSSBzdGFy dGVkIGxlYXJuaW5nIG9jYW1sIGFib3V0IDIgbW9udGhzIGFnbyBzbyBpdCB3YXMgYSBncmVhdCBs ZWFybmluZyBleHBlcmllbmNlIGZvciBtZSBtYWtpbmcgdGhpcyBsaWJyYXJ5IGFuZCBJIG11c3Qg c2F5IEkgYWJzb2x1dGVseSBmZWxsIGluIGxvdmUgd2l0aCBvY2FtbCBhbmQgcmVhbGx5IHRoaW5r IHRoaXMgaXMgdGhlIGJlc3QgYWJzdHJhY3Rpb24gZm9yIHdyaXRpbmcgZWxlZ2FudCwgZnVuY3Rp b25hbCBhbmQgcGVyZm9ybWFudCBzb2Z0d2FyZSwNCiBsaWtlIHJ1c3QgJiM0MzsgaGFza2VsbCBz dXBlcmNoYXJnZWQgYnV0IGJldHRlciA7KSByZWFsbHkgZ2xhZCBJIGZvdW5kIHRoaXMgY29tbXVu aXR5IGFuZCBldmVyeW9uZSBzZWVtcyB2ZXJ5IGhlbHBmdWwgYW5kIGtpbmQgaW5kZWVkLg0KPC9w Pg0KPHA+WW91IGNhbiBmaW5kIGZ1cnRoZXIgaW5mbyBoZXJlOiA8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+c291cmNlIGNvZGU6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nYm9y b3VnaC9zYWZlbW9uZXkiPmh0dHBzOi8vZ2l0aHViLmNvbS9nYm9yb3VnaC9zYWZlbW9uZXk8L2E+ DQo8L2xpPjxsaT5kb2N1bWVudGF0aW9uOiA8YSBocmVmPSJodHRwczovL2dib3JvdWdoLmdpdGh1 Yi5pby9zYWZlbW9uZXkvc2FmZW1vbmV5L3NhZmVtb25leS9pbmRleC5odG1sIj4NCmh0dHBzOi8v Z2Jvcm91Z2guZ2l0aHViLmlvL3NhZmVtb25leS9zYWZlbW9uZXkvc2FmZW1vbmV5L2luZGV4Lmh0 bWw8L2E+IDwvbGk+PC91bD4NCjxwPlBsZWFzZSBkbyBmb3JnaXZlIG1lIGZvciBtdWNraW5nIHVw IHRoZSBkb2N1bWVudGF0aW9uIGF0IHRoaXMgbW9tZW50IGFzIEkgYW0gc3RpbGwgdHJ5aW5nIHRv IGZpZ3VyZSBvdXQgdGhlIHF1aXJrcyB3aXRoIHdyaXRpbmcgYW5kIHB1Ymxpc2hpbmcgZG9jcywg d2lsbCBmaXggaXQgc29vbiB0byB0aGUgYmVzdCBvZiBteSBhYmlsaXR5LiBJIHVzZWQgZHVuZS1y ZWxlYXNlIGZvciBwdWJsaXNoaW5nIHRvIGdoLXBhZ2VzIGFuZCBzZWVtcyBsaWtlDQogYSBxdWl0 ZSBhIG1hbnVhbCBwcm9jZXNzLCBpZiB5b3Uga25vdyBhIGJldHRlciB3YXkgdGhlbiBwbGVhc2Ug ZG8gbGV0IG1lIGtub3cuIDwvcD4NCjxwPlRoYW5rIHlvdSBhbmQgaGF2ZSBhIGxvdmVseSB3ZWVr ZW5kISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+cHB4X29wdGludDwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBweC1vcHRpbnQvMTMwMzAvMSI+ aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtb3B0aW50LzEzMDMwLzE8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2E1ZGQ3ZjYiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhNWRkN2Y2Ij5SZXluaXIgQmrDtnJuc3NvbiBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2E1ZGQ3 ZjYiPg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBwcHhfb3B0 aW50LjAuMi4wLCBhIHNtYWxsIHBweCBmb3IgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21p cmFnZS9vcHRpbnQiPg0Kb3B0aW50PC9hPiBsaXRlcmFscy4gSW5zdGVhZCBvZiB3cml0aW5nIDxj b2RlPk9wdGludC5taW51c19vbmU8L2NvZGU+IG9yIDxjb2RlPk9wdGludC5JbnQ2My5taW51c19v bmU8L2NvZGU+IHlvdSBjYW4gd3JpdGUNCjxjb2RlPi0xaTwvY29kZT4gb3IgPGNvZGU+LTFJPC9j b2RlPiByZXNwZWN0aXZlbHkuIEl0IG1heSBiZSBoYW5keSBpZiB5b3Ugd3JpdGUgY29kZSB3aXRo IGEgbG90IG9mIG9wdGludCBsaXRlcmFscy4NCjwvcD4NCjxwPlZlcnNpb24gMC4yLjAgdHJpZXMg dG8gYmUgc21hcnRlciBhbmQgd2lsbCB1c2UgPGNvZGU+T3B0aW50Lm9mX3Vuc2lnbmVkX2ludDMy PC9jb2RlPiBhbmQNCjxjb2RlPk9wdGludC5JbnQ2My5vZl91bnNpZ25lZF9pbnQ8L2NvZGU+IG92 ZXIgPGNvZGU+Xy5vZl9zdHJpbmc8L2NvZGU+IHdoZW4gcG9zc2libGUuDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj5Ea01MIEluc3RhbGwgQVBJIDAuNC4wPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRrbWwtaW5zdGFsbC1hcGktMC00LTAv MTI2NjUvMiI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRrbWwtaW5zdGFsbC1h cGktMC00LTAvMTI2NjUvMjwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdjYWVhMGRmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnY2FlYTBkZiI+ amJlY2tmb3JkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnY2FlYTBkZiI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdi MTk5MjI5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYjE5OTIyOSI+RGtNTCBJbnN0 YWxsIEFQSSAwLjUuMTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnYjE5OTIyOSI+DQo8cD5UaGlzIHdhcyBuZXdseSByZWxlYXNlZCB0b2RheS4gSXQgaGFzIHNv bWUgYmFja3dhcmRzLWluY29tcGF0aWJsZSBjaGFuZ2VzIHdoaWNoIG5lY2Vzc2l0YXRlZCBidW1w aW5nIHRvIDAuNS54Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk9ubHkgcmVnaXN0 ZXIgZGVzaXJlZCBjb21wb25lbnRzLiBQcmV2aW91c2x5IGFsbCB0aGUgY29tcG9uZW50cyBpbiB0 aGUgPGNvZGU+DQpvY2FtbGZpbmQ8L2NvZGU+IHVuaXZlcnNlIChleC4gb3BhbSBzd2l0Y2gpIHdl cmUgcmVnaXN0ZXJlZC4gTm93IG9ubHkgY2hvc2VuIGNvbXBvbmVudHMgYW5kIHRoZWlyIGRlcGVu ZGVuY2llcyBhcmUgcmVnaXN0ZXJlZC4NCjwvbGk+PGxpPkFkZCBpbnN0YWxsL3VuaW5zdGFsbCBk ZXBlbmRlbmNpZXMgdG8gTUVUQSBvZiBlYWNoIGNvbXBvbmVudCBvcGFtIHBhY2thZ2UuIEZvciBu b3cgdGhpcyBpcyBkdXBsaWNhdGl2ZSB3aXRoIENvbXBvbmVudCBSZWdpc3RyeSwgYnV0IGdpdmVz IGFjY2VzcyBjb21wb25lbnQgZ3JhcGggcHVyZWx5IHdpdGgNCjxjb2RlPm9jYW1sZmluZDwvY29k ZT4gc28gY2FuIGJlIHVzZWQgYXQgY29kZSBnZW5lcmF0aW9uIHRpbWUuIDwvbGk+PC91bD4NCjxw PkFuZCB0aGVyZSBpcyBvbmUgYnVnZml4OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ UHJpbnQgYm90aCBlcnJvciBtZXNzYWdlIGFuZCBiYWNrdHJhY2UsIG5vdCBqdXN0IGJhY2t0cmFj ZS4gPC9saT48L3VsPg0KPHA+RGtNTCBJbnN0YWxsIEFQSSAwLjUuMSB3YXMgdGhlIHZlcnNpb24g dXNlZCB0byBjcmVhdGUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9ka21sL2Rpc3Ry aWJ1dGlvbnMvZGttbC8tL3JlbGVhc2VzLzIuMC4zIj4NCkRrTUwgMi4wLjMgV2luZG93cyBpbnN0 YWxsZXI8L2E+IHRoYW5rcyB0byB0aGUgZmluYW5jaWFsIHN1cHBvcnQgb2YgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwtc2Yub3JnLyI+DQpPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uPC9hPi4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5Ea01MIFdvcmtmbG93 cyAyLjAueDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21s LXdvcmtmbG93cy0yLTAteC8xMzAzMy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tZGttbC13b3JrZmxvd3MtMi0wLXgvMTMwMzMvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3MjM0M2IyIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnNzIzNDNiMiI+amJlY2tmb3JkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNzIzNDNiMiI+DQo8cD5Ea01MIFdvcmtmbG93cyBhcmUg R2l0SHViIEFjdGlvbnMsIEdpdExhYiBDSS9DRCBhbmQgZGVza3RvcCBzY3JpcHRzLiBWZXJzaW9u IDIuMC4zIGlzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtd29ya2Zs b3dzI2RrbWwtd29ya2Zsb3dzIj5hdmFpbGFibGUgdG9kYXkgYnkgY2xpY2tpbmcgaGVyZTwvYT4u IFdobyBpcyB0aGlzIGZvcj8NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JZiB5b3Ug d2FudCB0byBjb21waWxlIDxiPmFuZCBkaXN0cmlidXRlPC9iPiBiaW5hcmllcyBmb3IgV2luZG93 cywgTGludXggYW5kIG1hY09TLCB0aGVuIHRoZQ0KPGNvZGU+Y29tcGlsZXJzPC9jb2RlPiB3b3Jr Zmxvd3MgbWF5IGJlIGEgZ29vZCBjaG9pY2UgZm9yIHlvdS4gPC9saT48bGk+SWYgeW91IGFyZSBh IDxpPnBhY2thZ2UgbWFpbnRhaW5lcjwvaT4gYW5kIHdhbnQgdG8gdGVzdCB0aGF0IHlvdXIgcGFj a2FnZSBjb21waWxlcyB3aXRoIFZpc3VhbCBTdHVkaW8NCjxpPk1TVkM8L2k+LCB0aGUgV2luZG93 cyA8Y29kZT5jb21waWxlcnM8L2NvZGU+IHdvcmtmbG93IGlzIGEgZ29vZCBjaG9pY2UuIDwvbGk+ PC91bD4NCjxwPkkgcGVyc29uYWxseSB1c2UgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9tYXJrZXRwbGFjZS9hY3Rpb25zL3NldC11cC1vY2FtbCI+DQpzZXR1cC1vY2FtbDwvYT4gR2l0 SHViIEFjdGlvbiBmb3IgdGVzdGluZyBPQ2FtbCBjb2RlLCBhbmQgPGk+YWRkaXRpb25hbGx5PC9p PiB1c2UgRGtNTCBXb3JrZmxvd3MgdG8gZGlzdHJpYnV0ZSBiaW5hcmllcyBpbiBteSBvd24gc29m dHdhcmUgbGlrZSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGlza3V2 Ym94L3JlbGVhc2VzIj5XaW5kb3dzL0xpbnV4L21hY09TIGRpc2t1dmJveCBiaW5hcmllczwvYT4u DQo8L3A+DQo8cD5UaGUgcHJvYmxlbXMgSSB3YXMgdHJ5aW5nIHRvIHNvbHZlOiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+SXQgaGFzIHRvIHdvcmsgd2l0aCBNU1ZDLiBJdCBpcyByZWFs bHkgZWFzeSB0byBkaXN0cmlidXRlIGJpbmFyaWVzIG9uIFdpbmRvd3MgaWYgeW91IHVzZSBNU1ZD Lg0KPC9saT48bGk+SSBncmV3IHJlYWxseSByZWFsbHkgdGlyZWQgb2YgZGVidWdnaW5nIGlzc3Vl cyByZW1vdGVseSBpbiB2ZW5kb3IgbG9ja2VkIEdpdEh1YiBBY3Rpb25zLiBHaXRMYWIgQ0kvQ0Qg aXMgbm90IGFzIGJhZCBidXQgc3RpbGwgbm90IGdvb2QuIEkgbmVlZGVkIHRoZSBhYmlsaXR5IHRv IGVhc2lseSBydW4gdGhlIENJL0NEIGRpcmVjdGx5IG9uIFBDcy4NCjwvbGk+PGxpPkkgYW0gbm90 IGEgZmFuIG9mIHN0YXRpYyBsaW5raW5nLiBJTUhPLCBzdGF0aWMgbGlua2luZyBpcyBhbiBvdmVy bHkgY29tcGxleCBzb2x1dGlvbiBpbiBzZWFyY2ggb2YgYSBwcm9ibGVtIHRoYXQgaXMgb25seSBw cmVzZW50IG9uIExpbnV4IChwcm9iYWJseSBkdWUgdG8gdGhlDQo8YSBocmVmPSJodHRwczovL3Ry dWVsaXN0LmNvL2Jsb2cvbGludXgtc3RhdGlzdGljcy8iPjYwMCYjNDM7IExpbnV4IGRpc3RyaWJ1 dGlvbnM8L2E+KS4gQW5kIGFtb25nIG90aGVyIHRoaW5ncyBpdCBjb21wbGljYXRlcyBzZWN1cml0 eS4gQnV0IOKApg0KPC9saT48bGk+SSA8aT5kbzwvaT4gbGlrZSBzdGF0aWMgbGlua2luZ+KAmXMg 4oCcZWFzeSB0byBkZXBsb3nigJ0gZmVhdHVyZTogeW91IGNhbiBzdGF0aWMgbGluayBhbiBleGVj dXRhYmxlIG9uIHlvdXIgTGludXggZGVza3RvcCBhbmQNCjxjb2RlPnNjcDwvY29kZT4gdG8gYSBM aW51eCBzZXJ2ZXIuIChTZWUg4oCcQ2hhbmdlc+KAnSBiZWxvdykgPC9saT48bGk+SSB3YW50ZWQg dG8gZ2VuZXJhdGUgQXBwbGUgU2lsaWNvbiBiaW5hcmllcyBvbiBBcHBsZSB4ODZfNjQgQ0kvQ0Qg aGFyZHdhcmUuIDwvbGk+PC91bD4NCjxwPjxiPkNoYW5nZXMgd2l0aCAyLjAuMzwvYj46IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaW5hbGx5IGltcGxlbWVudGVkIHRoZSDigJxlYXN5 IHRvIGRlcGxveeKAnSBmZWF0dXJlLiBOb3cgdGhlIHN0ZXBzIGZvciBhIHdvcmtpbmcgQ0kvQ0Qg cGlwZWxpbmUgYXJlIGp1c3Q6IDEpIGVkaXQNCjxjb2RlPi5naXRpZ25vcmU8L2NvZGU+LCAyKSBl ZGl0IDxjb2RlPi5naXRhdHRyaWJ1dGVzPC9jb2RlPiBhbmQgMykgY29weS1hbmQtcGFzdGUgaW50 byB5b3VyIHRlcm1pbmFsLg0KPC9saT48bGk+TWFrZSB1c2Ugb2YgdGhlIHN0YW5kYXJkaXplZCwg dXBncmFkYWJsZSA8Y29kZT4uL2RrPC9jb2RlPiBzY3JpcHQgdG8gZG8gYWxsIHRoZSBmZXRjaGlu ZyBhbmQgY3JlYXRpb24gb2Ygc2NyaXB0cy4NCjwvbGk+PC91bD4NCjxwPjxpPk5vbWVuY2xhdHVy ZTogRGtNTCBXb3JrZmxvd3MgaXMgYSBwYXJ0IG9mIERrTUwsIGhlbHBzIHRvIG1haW50YWluIHRo ZSBXaW5kb3dzIGVjb3N5c3RlbSwgYW5kIGhhcyBiZWVuIHN1cHBvcnRlZCBmaW5hbmNpYWxseSBi eSB0aGUgT0NhbWwgU29mdHdhcmUgRm91bmRhdGFpb24sIGJ1dCBpcyBzZXBhcmF0ZSBmcm9tIHRo ZSBEa01MIEluc3RhbGxlciBtYW55IHBlb3BsZSBhcmUgYXdhcmUgb2YuIEnigJlsbCB0cnkgdG8g ZGlzdGluZ3Vpc2ggdGhlbQ0KIGdvaW5nIGZvcndhcmQuPC9pPiA8L3A+DQo8cD5IZXJlIGlzIGEg ZmVhdHVyZSBjb21wYXJpc29uOiA8L3A+DQo8dGFibGUgYm9yZGVyPSIyIiBjZWxsc3BhY2luZz0i MCIgY2VsbHBhZGRpbmc9IjYiIHJ1bGVzPSJncm91cHMiIGZyYW1lPSJoc2lkZXMiPg0KPGNvbGdy b3VwPjxjb2wgY2xhc3M9Im9yZy1sZWZ0Ij48Y29sIGNsYXNzPSJvcmctbGVmdCI+PGNvbCBjbGFz cz0ib3JnLWxlZnQiPjwvY29sZ3JvdXA+DQo8dGhlYWQ+DQo8dHI+DQo8dGggc2NvcGU9ImNvbCIg Y2xhc3M9Im9yZy1sZWZ0Ij48Y29kZT5jb21waWxlcnM8L2NvZGU+PC90aD4NCjx0aCBzY29wZT0i Y29sIiBjbGFzcz0ib3JnLWxlZnQiPjxjb2RlPnNldHVwLW9jYW1sPC9jb2RlPjwvdGg+DQo8dGgg c2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1sZWZ0Ij5Db25zZXF1ZW5jZTwvdGg+DQo8L3RyPg0KPC90 aGVhZD4NCjx0Ym9keT4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPmRrbWwtYmFzZS1jb21w aWxlcjwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5vY2FtbC1iYXNlLWNvbXBpbGVyPC90ZD4N Cjx0ZCBjbGFzcz0ib3JnLWxlZnQiPjxjb2RlPmNvbXBpbGVyczwvY29kZT4gPGI+b25seSBzdXBw b3J0cyA0LjE0LjAgdG9kYXk8L2I+LiA8Y29kZT4NCnNldHVwLW9jYW1sPC9jb2RlPiBzdXBwb3J0 cyBhbGwgdmVyc2lvbnMgYW5kIHZhcmlhbnRzIG9mIE9DYW1sIGluY2x1ZGluZyBPQ2FtbCA1PC90 ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5HaXRIdWIgTG9jYWwgQWN0aW9u PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkdpdEh1YiBNYXJrZXRwbGFjZSBBY3Rpb248L3Rk Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PGNvZGU+Y29tcGlsZXJzPC9jb2RlPiB1c2VzIGxvY2Fs IHNjcmlwdHMgdG8gaW1wbGVtZW50IHRoZSBHaXRIdWIgYnVpbGQgbG9naWMsIHdoaWxlDQo8Y29k ZT5zZXR1cC1vY2FtbDwvY29kZT4gaXMgZGlzdHJpYnV0ZWQgdGhyb3VnaCBHaXRIdWIgTWFya2V0 cGxhY2Ugd2hpY2ggaXMgZWFzaWVyIHRvIHVzZTwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNz PSJvcmctbGVmdCI+R2l0TGFiIENJL0NEIExvY2FsIEluY2x1ZGU8L3RkPg0KPHRkIGNsYXNzPSJv cmctbGVmdCI+PGk+bm90IHN1cHBvcnRlZDwvaT48L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+ PGNvZGU+Y29tcGlsZXJzPC9jb2RlPiBzdXBwb3J0cyBHaXRMYWIgQ0kvQ0Q8L3RkPg0KPC90cj4N Cjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPlBlcnNvbmFsIENvbXB1dGVyIFNjcmlwdHM8L3Rk Pg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+PGk+bm90IHN1cHBvcnRlZDwvaT48L3RkPg0KPHRkIGNs YXNzPSJvcmctbGVmdCI+PGNvZGU+Y29tcGlsZXJzPC9jb2RlPiBjYW4gZ2VuZXJhdGVzIHNjcmlw dHMgdG8gc2ltdWxhdGUgQ0kgb24geW91ciBwZXJzb25hbCBjb21wdXRlciBmb3IgdHJvdWJsZXNo b290aW5nPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5NU1ZDICYjNDM7 IE1TWVMyPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkdDQyAmIzQzOyBDeWd3aW48L3RkPg0K PHRkIGNsYXNzPSJvcmctbGVmdCI+T24gV2luZG93cyA8Y29kZT5jb21waWxlcnM8L2NvZGU+IGNh biBsZXQgeW91ciBuYXRpdmUgY29kZSB1c2Ugb3JkaW5hcnkgV2luZG93cyBsaWJyYXJpZXMgd2l0 aG91dCBBQkkgY29uZmxpY3RzLiBZb3UgY2FuIGFsc28gZGlzdHJpYnV0ZSB5b3VyIGV4ZWN1dGFi bGVzIHdpdGhvdXQgdGhlIGxpY2Vuc2UgaGVhZGFjaGUgb2YgcmVkaXN0cmlidXRpbmcgb3Igc3Rh dGljYWxseSBsaW5raW5nDQo8Y29kZT5saWJnY2Nfc19zZWg8L2NvZGU+IGFuZCA8Y29kZT5saWJz dGRjJiM0MzsmIzQzOzwvY29kZT48L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxl ZnQiPmRrbWwtYmFzZS1jb21waWxlcjwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5vY2FtbC1i YXNlLWNvbXBpbGVyPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPk9uIG1hY09TLCA8Y29kZT5j b21waWxlcnM8L2NvZGU+IGNyb3NzLWNvbXBpbGVzIHRvIEFSTTY0IHdpdGgNCjxjb2RlPmR1bmUg LXggZGFyd2luX2FybTY0PC9jb2RlPjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+Q2VudE9TIDcgYW5kIExpbnV4IGRpc3Ryb3MgZnJvbSAyMDE0PC90ZD4NCjx0ZCBjbGFz cz0ib3JnLWxlZnQiPkxhdGVzdCBVYnVudHU8L3RkPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+T24g TGludXgsIDxjb2RlPmNvbXBpbGVyczwvY29kZT4gYnVpbGRzIHdpdGggYW4gb2xkIEdMSUJDLiA8 Y29kZT4NCmNvbXBpbGVyczwvY29kZT4gZHluYW1pY2FsbHkgbGlua2VkIExpbnV4IGV4ZWN1dGFi bGVzIHdpbGwgYmUgaGlnaGx5IHBvcnRhYmxlIGFzIEdMSUJDIGNvbXBhdGliaWxpdHkgaXNzdWVz IHNob3VsZCBiZSByYXJlLCBhbmQgY29tcGF0aWJsZSB3aXRoIHRoZSB1bm1vZGlmaWVkIExHUEwg bGljZW5zZSB1c2VkIGJ5IGNvbW1vbiBPQ2FtbCBkZXBlbmRlbmNpZXMgbGlrZQ0KPGEgaHJlZj0i aHR0cHM6Ly9nbXBsaWIub3JnL21hbnVhbC9Db3B5aW5nIj5HTlUgTVA8L2E+PC90ZD4NCjwvdHI+ DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij4xIHlyczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1s ZWZ0Ij40IHlyczwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij48Y29kZT5zZXR1cC1vY2FtbDwv Y29kZT4gaXMgb2ZmaWNpYWxseSBzdXBwb3J0ZWQgYW5kIHdlbGwtdGVzdGVkLjwvdGQ+DQo8L3Ry Pg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+U29tZSBwaW5uZWQgcGFja2FnZXM8L3RkPg0K PHRkIGNsYXNzPSJvcmctbGVmdCI+Tm8gcGFja2FnZXMgcGlubmVkPC90ZD4NCjx0ZCBjbGFzcz0i b3JnLWxlZnQiPjxjb2RlPmNvbXBpbGVyczwvY29kZT4sIGZvciBzb21lIHBhY2thZ2VzLCBtdXN0 IHBpbiB0aGUgdmVyc2lvbiBzbyB0aGF0IGNyb3NzLXBsYXRmb3JtIHBhdGNoZXMgKGVzcGVjaWFs bHkgZm9yIFdpbmRvd3MpIGFyZSBhdmFpbGFibGUuIFdpdGgNCjxjb2RlPnNldHVwLW9jYW1sPC9j b2RlPiB5b3UgYXJlIGZyZWUgdG8gdXNlIGFueSB2ZXJzaW9uIG9mIGFueSBwYWNrYWdlPC90ZD4N CjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5kaXNrdXYvZGlza3V2LW9wYW0tcmVw b3NpdG9yeTwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5mZG9wZW4vb3BhbS1yZXBvc2l0b3J5 PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPkN1c3RvbSBwYXRjaGVzIGZvciBXaW5kb3dzIGFy ZSBzb21ldGltZXMgbmVlZGVkLiA8Y29kZT5jb21waWxlcnM8L2NvZGU+IHVzZXMgYSBtdWNoIHNt YWxsZXIgc2V0IG9mIHBhdGNoZXMuDQo8Y29kZT5zZXR1cC1vY2FtbDwvY29kZT4gdXNlcyBhIGxh cmdlIGJ1dCBkZXByZWNhdGVkIHNldCBvZiBwYXRjaGVzLjwvdGQ+DQo8L3RyPg0KPC90Ym9keT4N CjwvdGFibGU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEyIj5Gb2xsb3cgdGhlIE1MIGFu ZCBPQ2FtbCB3b3Jrc2hvcHMgb25saW5lLCBTZXB0ZW1iZXIgOHRoIGFuZCA5dGggb24gU2VhdHRs ZSB0aW1lPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMiI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZm9sbG93LXRo ZS1tbC1hbmQtb2NhbWwtd29ya3Nob3BzLW9ubGluZS1zZXB0ZW1iZXItOHRoLWFuZC05dGgtb24t c2VhdHRsZS10aW1lLzEyOTgxLzgiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZvbGxv dy10aGUtbWwtYW5kLW9jYW1sLXdvcmtzaG9wcy1vbmxpbmUtc2VwdGVtYmVyLTh0aC1hbmQtOXRo LW9uLXNlYXR0bGUtdGltZS8xMjk4MS84PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmcwOTA5Y2E1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn MDkwOWNhNSI+R3VpbGxhdW1lIE11bmNoLU1hY2NhZ25vbmkgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwOTA5Y2E1Ij4NCjxwPlRoZSBNTCB3 b3Jrc2hvcCBjYW4gYmUgd2F0Y2hlZCBoZXJlOiA8YSBocmVmPSJodHRwczovL3d3dy55b3V0dWJl LmNvbS93YXRjaD92PU01TTNmMzFweG5zJmFtcDt0PTI3MzJzIj4NCmh0dHBzOi8vd3d3LnlvdXR1 YmUuY29tL3dhdGNoP3Y9TTVNM2YzMXB4bnMmYW1wO3Q9MjczMnM8L2E+IChzb21lb25lIGhhcyBw b3N0ZWQgdGltZXN0YW1wcyBmb3IgdGhlIHZhcmlvdXMgdGFsa3MgaW4gdGhlIGNvbW1lbnRzIG9m IHRoZSB2aWRlbykuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdhMjVhMGNiIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3Jn YTI1YTBjYiI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtb3JnYTI1YTBjYiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g PGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1l IGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBh cmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdz LXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9 Im9yZzg2Y2Q5MWIiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8i PkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 12 Sep 2023 14:22:48 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 12 Sep 2023 14:22:48 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 12 Sep 2023 14:22:48 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38CDMMQ9010335 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 12 Sep 2023 14:22:22 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38CDM1I5010320 for ; Tue, 12 Sep 2023 14:22:02 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 Sep 2023 15:22:00 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5F14AE0CD1; Tue, 12 Sep 2023 15:22:00 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 21C2CE004E for ; Tue, 12 Sep 2023 15:21:54 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Sep 2023 15:21:53 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 888A6564671; Tue, 12 Sep 2023 15:21:50 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ5Xw54wEFlg/lrESKPKQ1wM7qLA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 12 Sep 2023 14:21:50 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 7f9fc7b1-2146-4e25-3162-08dbb3935bac X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.02,139,1688421600"; d="scan'208,217";a="65755398" x-spam-flag: No, tests=bogofilter, spamicity=0.367981, queueID=CD95C564674 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOS0xMiBUdWUgMTU6MjAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDkuMDUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOS4xOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIFNlcHRlbWJlciAwNSB0byAxMiwgMjAyMy4N CjwvcD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5U YWJsZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiBy b2xlPSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+TWlvdSwgYSBzaW1wbGUgc2No ZWR1bGVyIGZvciBPQ2FtbCA1PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+RWlvIERpZ2VzdCAj MSAoU2VwdGVtYmVyIDIwMjMpPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+SGVscCByZXZhbXBp bmcgdGhlIGdldHRpbmcgc3RhcnRlZCB0dXRvcmlhbHMgaW4gb2NhbWwub3JnPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjNCI+cGNyZTItb2NhbWwuNy41LjEgcmVsZWFzZWQ8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM1Ij5UaGlyZCAoYW5kIGhvcGVmdWxseSBsYXN0KSByZWxlYXNlIGNhbmRpZGF0ZSBm b3IgT0NhbWwgNS4xLjA8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNiI+T2NhbWwub3JnIHR1dG9y aWFsIHJldmFtcGluZywgY29udOKAmWQgLSBCYXNpYyBEYXRhdHlwZXM8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM3Ij5QcmludGluZywgbW9kdWxhciBpbXBsaWNpdHMgYW5kIHRoZSBTdGRsaWI8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5PY2FtbC5vcmcgdHV0b3JpYWwgcmV2YW1waW5nLCBjb27i gJlkIC0gVmFsdWVzIGFuZCBGdW5jdGlvbnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc4MDMz MmE3Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPk1pb3UsIGEg c2ltcGxlIHNjaGVkdWxlciBmb3IgT0NhbWwgNTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLW1pb3UtYS1zaW1wbGUtc2NoZWR1bGVyLWZvci1vY2FtbC01LzEyOTYz LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1taW91LWEtc2ltcGxlLXNjaGVk dWxlci1mb3Itb2NhbWwtNS8xMjk2My8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzlkMTNjZWQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5 ZDEzY2VkIj5DYWxhc2NpYmV0dGEgUm9tYWluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOWQxM2NlZCI+DQo8cD5J4oCZbSBwbGVhc2VkIHRv IGFubm91bmNlIHRoZSBleHBlcmltZW50YWwgcmVsZWFzZSBvZiBNaW91ICg8Y29kZT4wLjAuMX5i ZXRhMTwvY29kZT4pOiBhIHJvdW5kLXJvYmluZyBzY2hlZHVsZXIgZm9yIE9DYW1sIDUuIE1pb3Ug aXMgYSBzbWFsbCBsaWJyYXJ5IHRoYXQgZm9jdXNlcyBvbiBpbXBsZW1lbnRpbmcgc3lzdGVtICZh bXA7IG5ldHdvcmsgYXBwbGljYXRpb25zLg0KPC9wPg0KPHA+WW91IGNhbiBub3cgZmluZCB0aGUg cHJvamVjdCBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcm9idXJpby9taW91Ij5HaXRI dWI8L2E+LCBSb2J1cuKAmXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0LnJvYnVyLmNvb3Avcm9idXIv bWlvdSI+cmVwb3NpdG9yeTwvYT4sIGFzIHdlbGwgYXMgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9z YXUucmUvbWlvdS8iPg0KaXRzIGRvY3VtZW50YXRpb248L2E+IGFuZCBhIGZldyB0dXRvcmlhbHMu IFRoaXMgcmVsZWFzZSB3YXMgbWFya2VkIGJ5IHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBhDQo8YSBo cmVmPSJodHRwczovL2RhdGF0cmFja2VyLmlldGYub3JnL2RvYy9odG1sL3JmYzgzMDUiPmhhcHB5 LWV5ZWJhbGxzPC9hPi9kbnMgWzFdIGNsaWVudCBjb21iaW5pbmcgY29uY3VycmVuY3kgYW5kIHBh cmFsbGVsaXNtLiBUaGUgYWltIGlzIHRvIGJlIGFibGUgdG8gY29udGludWUgaW1wbGVtZW50aW5n IHNlcnZpY2VzIHVzaW5nIHRoaXMgbGlicmFyeSBhbmQgdG8gZ3VpZGUgdGhlIHVzZXIvZGV2ZWxv cGVyIHRvd2FyZHMgZ29vZCBzeXN0ZW0gcHJhY3RpY2VzLg0KPC9wPg0KPHA+VGhlIHByb2plY3Qg aXMgc3RpbGwgaW4gYW4gaXRlcmF0aW9uIHBoYXNlIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9m IHNlcnZpY2VzIHN1Y2ggYXMgZG5zIGFuZCBlbWFpbCBpbiBvcmRlciB0byB2YWxpZGF0ZSBvdXIg ZGVzaWduLiBUaGlzIHJlbGVhc2UgaW52aXRlcyB5b3UgdG8gaXRlcmF0ZSB3aXRoIHVzIHRvIGJl bmVmaXQgZnJvbSBldmVyeW9uZeKAmXMgZXhwZXJpZW5jZS4NCjwvcD4NCjxwPldlIHdpbGwgY29t cGxldGUgdGhpcyB0aHJlYWQgd2l0aCBhcnRpY2xlcyBzcGVjaWZ5aW5nIHRoZSBpbXBsZW1lbnRh dGlvbiBvZiBNaW91LiBUaGUgZG9jdW1lbnRhdGlvbiBnaXZlcyBhIGdvb2Qgb3ZlcnZpZXcgb2Yg b3VyIG9iamVjdGl2ZXMgYW5kIHRoZSBNaW91IGZyYW1ld29yay4gSWYgeW91IGFyZSBpbnRlcmVz dGVkLCB3ZSBpbnZpdGUgeW91IHRvIHJlYWQgaXQuDQo8L3A+DQo8cD5XZSB3b3VsZCBsaWtlIHRv IHRoYW5rIGV2ZXJ5b25lIHdobyBoYXMgYmVlbiBpbnZvbHZlZCBpbiBhbnkgd2F5IGluIHRoZSBw cm9qZWN0IGZvciB0aGVpciBleHBlcmllbmNlIGFuZCB0aGVpciBjb250cmlidXRpb25zLiBBbmQg d2UgaG9wZSB0byBjb25zaWRlciBvdGhlciBleHBlcmllbmNlcyBhbmQgZmVlZGJhY2sgaW4gb3Jk ZXIgdG8gZGV2ZWxvcCBNaW91IGluIHRoZSBzYW1lIHdheSBhcw0KPGEgaHJlZj0iaHR0cHM6Ly9y b2J1ci5jb29wIj5Sb2J1cjwvYT4gaGFzIGFscmVhZHkgZG9uZSBmb3IgdGhlIG90aGVyIHByb2pl Y3RzLiA8L3A+DQo8cD48Yj5bMV08L2I+OiBJbXBsZW1lbnRpbmcgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL3JvYnVyaW8vaGFwcHktZXllYmFsbHMiPmhhcHB5LWV5ZWJhbGxzPC9hPiB2aWEg dGhlIGV4Y2VsbGVudA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9vY2FtbC1k bnMiPm9jYW1sLWRuczwvYT4gcHJvamVjdCBoYXMgZW5hYmxlZCB1cyB0bzoNCjwvcD4NCjxvbCBj bGFzcz0ib3JnLW9sIj4NCjxsaT5jaGVjayB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGxhdW5jaCBh IGJhY2tncm91bmQgdGFzayBtYW5hZ2luZyBjb25uZWN0aW9ucyB3aXRob3V0IGJlaW5nIGFibGUg dG8NCjxiPmRldGFjaDwvYj4gYSB0YXNrIDwvbGk+PGxpPnNhdGlzZnkgdGhlIG5vdGlvbnMgb2Yg PGEgaHJlZj0iaHR0cHM6Ly9kb2NzLm9zYXUucmUvbWlvdS9NaW91L093bmVyc2hpcC9pbmRleC5o dG1sIj4NCnNvY2tldCBvd25lcnNoaXA8L2E+IDwvbGk+PGxpPmltcGxlbWVudCBhIHJlYWwgYXBw bGljYXRpb24gdXNpbmcgb25lIG9mIHRoZSBwcm90b2NvbHMgd2UgbWFpbnRhaW4gPC9saT48L29s Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPkVpbyBEaWdlc3QgIzEgKFNlcHRlbWJlciAy MDIzKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZWlvLWRpZ2VzdC0x LXNlcHRlbWJlci0yMDIzLzEyOTY4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Vp by1kaWdlc3QtMS1zZXB0ZW1iZXItMjAyMy8xMjk2OC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNlZjY3ODkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmczZWY2Nzg5Ij5TdWRoYSBQYXJpbWFsYSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzNlZjY3ODkiPg0KPHA+QXMgd2XigJlyZSBi cmFjaW5nIHRvd2FyZHMgYW4gdXBkYXRlIHRvIEVpbyAxLjAgYWZ0ZXIgSUNGUCAoZmFtb3VzIGxh c3Qgd29yZHMsIGp1c3Qga2lkZGluZyA6RCksIHRoZSB0ZWFtIGlzIGhhcHB5IHRvIHByZXNlbnQg dXBkYXRlcyBvbiBFaW8gYW5kIGZyaWVuZHMuIFdlIGhvcGUgdG8gY2FycnkgdGhpcyBvdXQgb24g bW9udGhseSBvciBiaS1tb250aGx5IGJhc2lzLCBpbiBsaW5lIHdpdGggdGhlIHByZWNlZGVudCBz ZXQgYnkgTXVsdGljb3JlDQogTW9udGhsaWVzLCB0aGUgUGxhdGZvcm0gTmV3c2xldHRlciBhbmQg b3RoZXJzLiA8L3A+DQo8cD5Gb3IgdGhlIHVuaW5pdGlhdGVkLCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2VpbyI+RWlvPC9hPiBpcyBhIGRpcmVjdC1zdHlsZSBj b25jdXJyZW5jeSBsaWJyYXJ5IGZvciBPQ2FtbCA1IGFuZCBiZXlvbmQuIEVpbyBsZXZlcmFnZXMg ZWZmZWN0IGhhbmRsZXJzIGZvciBub24tYmxvY2tpbmcgSU8sIGFuZCBhdCB0aGUgc2FtZSB0aW1l IG9mZmVycyBhZHZhbnRhZ2VzIHN1Y2ggYXMgZW5oYW5jZWQgc3VwcG9ydA0KIGZvciBiYWNrdHJh Y2VzIGFuZCBiZWluZyBhYmxlIHRvIHdyaXRlIGNvbmN1cnJlbnQgY29kZSBpbiBkaXJlY3Qtc3R5 bGUuIDwvcD4NCjxwPkFkZGl0aW9uYWxseSwgRWlvIG9mZmVycyBmYXN0IG5hdGl2ZSBiYWNrZW5k cyBmb3IgdmFyaW91cyBvcGVyYXRpbmcgc3lzdGVtcyB3aGVuIGF2YWlsYWJsZSwgc3VjaCBhcw0K PGNvZGU+aW9fdXJpbmc8L2NvZGU+IGZvciBMaW51eC4gRWlvIGlzIGNvbmNlaXZlZCB0byBiZSBh IHJlcGxhY2VtZW50IGZvciBleGlzdGluZyBtb25hZGljIGNvbmN1cnJlbmN5IGxpYnJhcmllcyBz dWNoIGFzIEx3dC4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUvZWlvL3JlbGVhc2VzL3RhZy92MC4xMiI+RWlvIDAuMTIgd2FzIHJlbGVhc2VkPC9h PiBub3QgbG9uZyBhZ28uIFRoZSBwZW5kaW5nIHRhc2tzIGZvciBFaW8gMS4wIGFyZSBiZWluZyB0 cmFja2VkIGF0DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vp by9pc3N1ZXMvMzg4Ij5FaW8jMzM4PC9hPi4gPC9wPg0KPHA+QmVmb3JlIGdvaW5nIG9uIHdpdGgg ZGV0YWlsZWQgdXBkYXRlcywgSeKAmWQgbGlrZSB0byB0YWtlIGEgbW9tZW50IHRvIHRoYW5rIGFs bCBjb250cmlidXRvcnMgYW5kIHVzZXJzIGZvciBzcGVuZGluZyB0aGVpciB0aW1lIG9uIEVpby4g V2l0aG91dCB0aGVpciBjb2xsZWN0aXZlIGVmZm9ydHMsIHRoZXJlIGlzIG5vIHdheSB3ZSBjb3Vs ZCBiZSBhcyBmYXIgaW4gdGhlIGRldmVsb3BtZW50IG9mIEVpbyBhcyB3ZSBhcmUuIElmIHlvdeKA mXJlIGludGVyZXN0ZWQNCiBpbiBjb250cmlidXRpbmcgb3IgdGVzdGluZyB3ZeKAmWQgYmUgbW9y ZSB0aGFuIGhhcHB5IHRvIHdlbGNvbWUgeW91IHRvIHRoZSBjb21tdW5pdHkhDQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzY3Yjg4NGYiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmc2N2I4ODRmIj5VcGRhdGVzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc2N2I4ODRmIj4NCjxwPkVpbyBoYXMgdW5kZXJnb25lIHNp Z25pZmljYW50IGRldmVsb3BtZW50cyBhbmQgaW1wcm92ZW1lbnRzIGluIHRoZSBwYXN0IGZldyBt b250aHMuIE5vdGFibHksIGl0IHJlcGxhY2VzIHRoZSBPQ2FtbCBvYmplY3Qgc3lzdGVtIHdpdGgg cG9seW1vcnBoaWMgdmFyaWFudHMgdG8gcmVwcmVzZW50IE9TIHJlc291cmNlcywgdGhlcmVieSBt YWtpbmcgY29kZSBtb3JlIGFjY2Vzc2libGUuIEVpbyBhbHNvIGJvYXN0cyB2YXJpb3VzIGJhY2tl bmRzLCBpbmNsdWRpbmcNCiBhIGZhc3QgbmF0aXZlIElPIGJhY2tlbmQgZm9yIExpbnV44oCZcyA8 Y29kZT5pb191cmluZzwvY29kZT4gYW5kIGEgZ2VuZXJpYyBQT1NJWCBiYWNrZW5kLCB3aGlsZSBh bHNvIGV4cGxvcmluZyBwb3NzaWJpbGl0aWVzIGZvciBtYWNPUyBhbmQgV2luZG93cyBzdXBwb3J0 Lg0KPC9wPg0KPHA+TW9yZW92ZXIsIEVpbyBpcyBtYWtpbmcgc3RyaWRlcyBpbiBKYXZhU2NyaXB0 IGludGVyb3BlcmFiaWxpdHksIGFpbWluZyB0byB0YXJnZXQgYnJvd3NlciBhcHBsaWNhdGlvbnMu IFRoZSBsYXRlc3QgcmVsZWFzZSBpbnRyb2R1Y2VzIGEgcmVzb3VyY2UgcG9vbCwgYWtpbiB0bw0K PGNvZGU+THd0X3Bvb2w8L2NvZGU+LCBhbmQgYW50aWNpcGF0ZXMgc3VwcG9ydCBmb3IgY3VzdG9t IGV2ZW50cyB3aXRoIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGlj b3JlL21laW8iPg0KPGNvZGU+bWVpbzwvY29kZT48L2E+IENMSSB0b29sLiBRdWl0ZSBhIGZldyBh cHBsaWNhdGlvbnMgaGF2ZSBzdGFydGVkIG1pZ3JhdGluZyB0byBFaW8sIGluY2x1ZGluZyBJcm1p biwgV2F5bGFuZCwNCjxjb2RlPm9jYW1sLWdycGM8L2NvZGU+LCBPQ2FtbCBDSeKAmXMgc29sdmVy IHNlcnZpY2UgYW5kIG1vcmUsIGV4cGFuZGluZyBFaW/igJlzIHV0aWxpdHkgYWNyb3NzIGRpdmVy c2UgZG9tYWlucy4NCjwvcD4NCjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlk PSJvcmc3Njk1ZDg4Ij48L2E+UmVwbGFjaW5nIG9iamVjdHMgd2l0aCB2YXJpYW50czxicj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc3Njk1ZDg4Ij4NCjxwPlBSOiA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpby9wdWxsLzU1MyI+ aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vcHVsbC81NTM8L2E+DQo8L3A+ DQo8cD5PcmlnaW5hbGx5LCBFaW/igJlzIGNhcGFiaWxpdGllcyB3ZXJlIGVuY29kZWQgdXNpbmcg dGhlIE9DYW1sIG9iamVjdCBzeXN0ZW0uIEhvd2V2ZXIsIGFzIG9iamVjdHMgaW4gT0NhbWwgYXJl IG5vdCBhIHdpZGVseSB1c2VkIGZlYXR1cmUsIHRoZXJlIHdhcyBjb25jZXJuIGZyb20gdGhlIGNv bW11bml0eSB0aGF0IHJlbGlhbmNlIG9uIHRoZSBvYmplY3Qgc3lzdGVtIHdvdWxkIGhpbmRlciB3 aWRlciBhZG9wdGlvbiBvZiBFaW8uIEFzIGEgcmVzdWx0DQogb2YgdGhpcyBmZWVkYmFjaywgRWlv IG5vdyB1c2VzIHBvbHltb3JwaGljIHZhcmlhbnRzIHRvIHNlcnZlIHRoZSBzYW1lIGZ1bmN0aW9u IGFzIG9iamVjdHMgZGlkIHByZXZpb3VzbHkuDQo8L3A+DQo8cD5Qb2x5bW9ycGhpYyB2YXJpYW50 cyBhcmUgYmV0dGVyIHVuZGVyc3Rvb2QgYnkgbW9zdCBPQ2FtbCBwcmFjdGl0aW9uZXJzIGFuZCB3 ZSBob3BlIHRoYXQgdGhpcyBjaGFuZ2Ugd2lsbCBlbmFibGUgbW9yZSB1c2VycyB0byBhZG9wdCBF aW8uIFZlcnkgbGl0dGxlIGNvZGUgaXMgZXhwZWN0ZWQgdG8gYnJlYWsgYXMgYSByZXN1bHQsIGFu ZCB0aGlzIGNoYW5nZSB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGluIG90aGVyIGxpYnJhcmllcyBi dWlsdCB3aXRoDQogRWlvIHNvb24uIDwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2Jm NjFkNGIiPjwvYT5CYWNrZW5kczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmdiZjYxZDRiIj4NCjxwPk9uZSBvZiB0aGUgZ29hbHMgb2YgRWlvIGlzIHRvIHByb3Zp ZGUgZmFzdCBuYXRpdmUgSU8gYmFja2VuZHMgZm9yIG1ham9yIG9wZXJhdGluZyBzeXN0ZW1zLiBJ dCBpcyBmb3IgdGhpcyByZWFzb24gdGhhdCB3ZSBzdGFydGVkIHdpdGggYSBiYWNrZW5kIGZvcg0K PGNvZGU+aW9fdXJpbmc8L2NvZGU+LCBMaW51eOKAmXMgc3RhdGUtb2YtdGhlLWFydCwgaGlnaC1w ZXJmb3JtYW5jZSBJL08gQVBJLiBXZSBldmVudHVhbGx5IGFkZGVkIGENCjxjb2RlPmxpYnV2PC9j b2RlPiBiYWNrZW5kICh0aHJvdWdoIEx1diksIHdoaWNoIGFsbG93ZWQgcG9ydGFiaWxpdHkgYWNy b3NzIG11bHRpcGxlIG9wZXJhdGluZyBzeXN0ZW1zLCB2aXMtw6AtdmlzIExpbnV4LCBNYWNPUywg YW5kIFdpbmRvd3MuIFVuZm9ydHVuYXRsZXkgaXQgYWxzbyBjYXVzZWQNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvL2lzc3Vlcy80MzQiPnNldmVyYWwgcHJv YmxlbXM8L2E+LCBhbmQgd2UgZW5kZWQgdXAgcmVwbGFjaW5nIGl0IHdpdGgNCjxjb2RlPmVpb19w b3NpeDwvY29kZT4uIDwvcD4NCjxwPjxjb2RlPkVpb19wb3NpeDwvY29kZT4gaXMgYSBnZW5lcmlj IFBPU0lYIGJhY2tlbmQsIHVzaW5nIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUvb2NhbWwtaW9tdXgiPg0KPGNvZGU+b2NhbWwtaW9tdXg8L2NvZGU+PC9hPi4gVGhl IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvL3RyZWUvbWFp bi9saWJfZWlvX3dpbmRvd3MiPg0KV2luZG93cyBiYWNrZW5kPC9hPiBpcyBmdW5jdGlvbmFsIChw dW4gaW50ZW5kZWQpLCB3aXRoIG1vcmUgaW1wcm92ZW1lbnRzIGJlaW5nIGFkZGVkLiBBdCBzb21l IHBvaW50LCB3ZSBtYXkgcmV0aGluayBhIEdyYW5kIENlbnRyYWwgRGlzcGF0Y2ggYmFja2VuZCBh bmQgSU8gQ29tcGxldGlvbiBwb3J0cyBiYWNrZW5kIGZvciBNYWNPUyBhbmQgV2luZG93cyByZXNw ZWN0aXZlbHkuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcyZjIxZjI4Ij48L2E+ SmF2YXNjcmlwdCBJbnRlcm9wPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0 ZXh0LW9yZzJmMjFmMjgiPg0KPHA+UFI6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC1tdWx0aWNvcmUvZWlvL3B1bGwvNDA1Ij5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGlj b3JlL2Vpby9wdWxsLzQwNTwvYT4NCjwvcD4NCjxwPkhhdmluZyB0YWxrZWQgYWJvdXQgYmFja2Vu ZHMgZm9yIG1ham9yIG9wZXJhdGluZyBzeXN0ZW1zLCBvbmUgY2Fubm90IGlnbm9yZSBicm93c2Vy cywgd2hpY2ggYXJlIGdldHRpbmcgaW5jcmVhc2luZ2x5IGNvbW1vbi4gV2UgaGF2ZSBhIFdJUCBi cm93c2VyIGJhY2tlbmQgZm9yIGVuYWJsaW5nIEVpbyB0byB0YXJnZXQgSmF2YXNjcmlwdCAoYW5k IEpzb28pIGFwcGxpY2F0aW9ucy4gVGhpcyBpcyBhIHByb21pc2luZyBhdmVudWUgdGhhdCBvcGVu cw0KIHVwIHBvc3NpYmlsaXRpZXMgZm9yIEx3dCBiYXNlZCBsaWJyYXJpZXMgdGhhdCB1c2UgSnNv byB0byBtaWdyYXRlIHRvIEVpby4gPC9wPg0KPHA+RnVydGhlcm1vcmUsIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9wYXRyaWNvZmVycmlzL2Vpb2pzb28vdHJlZS9tYWluIj48Y29kZT5laW9q c29vPC9jb2RlPjwvYT4gc2hvd3Mgc29tZSBpbnRlcmVzdGluZyBleGFtcGxlcyBvZiBFaW8NCjwv cD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Kc19vZl9vY2FtbCBpbiBhY3Rpb24uIDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzhmYjQxODQiPjwvYT5Qb29sIGFuZCBM YXp5PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzhmYjQxODQi Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlBvb2w6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvL3B1bGwvNjAyIj5odHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtbXVsdGljb3JlL2Vpby9wdWxsLzYwMjwvYT4NCjwvbGk+PGxpPkxhenk6IDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvL3B1bGwvNjA5Ij5odHRwczovL2dp dGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpby9wdWxsLzYwOTwvYT4NCjwvbGk+PC91bD4NCjxw PlRoZSBsYXRlc3QgcmVsZWFzZSBvZiBFaW8gcHJvdmlkZXMgYSBwb29sLiBUaGlzIGlzIHNpbWls YXIgdG8gPGNvZGU+THd0X3Bvb2w8L2NvZGU+LCBoZWxwZnVsIGZvciBtYW5hZ2luZyBhIGNvbGxl Y3Rpb24gb2YgcmVzb3VyY2VzLiBGb3IgaW5zdGFuY2UsIGl04oCZcyBwb3NzaWJsZSB0aGF0IG1h aW50YWluaW5nIGENCjxiPnBvb2w8L2I+IG9mIGV4cGVuc2l2ZSByZXNvdXJjZXMgc3VjaCBhcyBk b21haW5zIG9yIGRhdGFiYXNlIGNvbm5lY3Rpb25zIGlzIG1vcmUgbWVtb3J5IGFuZCByZXNvdXJj ZSBlZmZpY2llbnQgdGhhbiB0aGUgYWx0ZXJuYXRpdmUuDQo8L3A+DQo8cD5UaGUgbGF0ZXN0IHJl bGVhc2UgYWxzbyBpbmNsdWRlcyBhIGZpYmVyLXNhZmUgbGF6eSBtb2R1bGUgKDxjb2RlPkVpby5M YXp5PC9jb2RlPikgdGhhdCBhbGxvd3MgbGF6eSB2YWx1ZXMgdG8gYmUgZm9yY2VkIGNvbmN1cnJl bnRseSBmcm9tIG11bHRpcGxlIGZpYmVycy4NCjwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9 Im9yZzBlYmQ4MzQiPjwvYT5DdXN0b20gRXZlbnRzIChtZWlvKTxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcwZWJkODM0Ij4NCjxwPk9DYW1sIDUuMSB3aWxsIGhh dmUgc3VwcG9ydCBmb3IgdXNlci1kZWZpbmVkIGN1c3RvbSBldmVudHMsIGV4dGVuZGluZyB0aGUg cmluZy1idWZmZXIgYmFzZWQgZXZlbnQgdHJhY2luZyBzeXN0ZW0uDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL21laW8iPjxjb2RlPm1laW88L2NvZGU+PC9hPiBp cyBhIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90b2tpby1ycy9jb25zb2xlIj4NCnRva2lv LWNvbnNvbGU8L2E+IHN0eWxlIENMSSB0b29sIGZvciByZWFsIHRpbWUgbW9uaXRvcmluZyBvZiBF aW8gcHJvZ3JhbXMuIFRoZSBob3BlIGlzIHRoYXQgaXQgd2lsbCBtYWtlIGRlYnVnZ2luZyBFaW8g cHJvZ3JhbXMgYSBtb3JlIHBsZWFzYW50IGV4cGVyaWVuY2UuIFRoZSB0b29sIGlzIGN1cnJlbnRs eSBleHBlcmltZW50YWwuIFdlIGhvcGUgdG8gaGF2ZSBhbiBpbml0aWFsIHJlbGVhc2Ugc2NoZWR1 bGVkIGZvciBhZnRlciBPQ2FtbCA1LjENCiBpcyBvdXQuIDwvcD4NCjwvZGl2Pg0KPC9saT48bGk+ PGEgaWQ9Im9yZ2RjMjYwZjgiPjwvYT5TcGxpdHRpbmcgRWlvIENvcmU8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZGMyNjBmOCI+DQo8cD5Jc3N1ZTogPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vaXNzdWVzLzU0NCI+aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vaXNzdWVzLzU0NDwvYT4NCjwvcD4N CjxwPlNvbWV0aGluZyB3ZSBkaXNjdXNzZWQgaW4gb3VyIGRldmVsb3BlciBtZWV0aW5nIGlzIHBv dGVudGlhbGx5IHNwbGl0dGluZyBvdXQgdGhlIGNvcmUgRmliZXIgYXMgYSBzZXBhcmF0ZSBsaWJy YXJ5LiBBIHBvdGVudGlhbCB1c2UtY2FzZSBvZiB0aGlzIG1pZ2h0IGJlIGZvcm1hbGx5IHZlcmlm eWluZyBFaW8gRmliZXJzLiBXaGlsZSBubyBkZWNpc2lvbnMgaGF2ZSBiZWVuIG1hZGUgb24gdGhp cyB5ZXQsIHdl4oCZcmUgaW50ZXJlc3RlZCB0byBrbm93DQogaWYgdGhpcyBjb3VsZCBiZSB1c2Vm dWwgZm9yIGFueXRoaW5nIG5vdCBtZW50aW9uZWQgYWJvdmUuIDwvcD4NCjwvZGl2Pg0KPC9saT48 bGk+PGEgaWQ9Im9yZzkxZGU0MGIiPjwvYT5BcHBsaWNhdGlvbnM8YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnOTFkZTQwYiI+DQo8cD5TZXZlcmFsIGFwcGxpY2F0 aW9ucyBoYXZlIHN0YXJ0ZWQgaGFybmVzc2luZyB0aGUgcG93ZXIgb2YgRWlvLiBCZWxvdyBhcmUg c29tZSB3ZSBrbm93IG9mOg0KPC9wPg0KPHA+PGI+SXJtaW48L2I+IDwvcD4NCjxwPkluIGEgZmly c3QgZm9yIHRoZSBsaWJyYXJ5LCBJcm1pbiBoYXMgYSBzaGlueSBuZXcgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL21pcmFnZS9pcm1pbi90cmVlL2VpbyI+DQpFaW8gYmFja2VuZDwvYT4uIEly bWluLCB0aGUgZGlzdHJpYnV0ZWQgZGF0YWJhc2UgKHdoaWNoIGlzIHVzZWQgYXMgc3RvcmFnZSBz eXN0ZW0gZm9yIFRlem9zLCBhbW9uZ3N0IG90aGVycyksIGhhcyBzdGFydGVkIG1pZ3JhdGluZyB0 byBFaW8gd2l0aCB0aGUgZXZlbnR1YWwgZ29hbCBvZiBzdXBwb3J0aW5nIG11bHRpY29yZSBJcm1p bi4gU3RheSB0dW5lZCB0byBoZWFyIG1vcmUgYWJvdXQgdGhpcyBmcm9tIHRoZSBJcm1pbiB0ZWFt Lg0KPC9wPg0KPHA+PGI+V2F5bGFuZDwvYj4gPC9wPg0KPHA+RWlvIDAuMTIgYWRkZWQgc3VwcG9y dCBmb3IgU0NNX1JJR0hUUy4gVGhpcyBhbGxvd2VkIGNvbnZlcnNpb24gb2YgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS90YWxleDUvb2NhbWwtd2F5bGFuZC90cmVlL2VpbyI+DQpvY2Ft bC13YXlsYW5kPC9hPiBsaWJyYXJ5IHRvIEVpby4gVGhhdCwgaW4gdHVybiwgYWxsb3dlZCBhbiBF aW8gcG9ydCBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGFsZXg1L3dheWxhbmQtcHJv eHktdmlydHdsL3RyZWUvZWlvIj4NCndheWxhbmQtcHJveHktdmlydHdsPC9hPi4gVGhlc2UgcG9y dHMgc2hvdWxkIGJlIG1lcmdlZCBhbmQgcmVsZWFzZWQgc29vbi4gPC9wPg0KPHA+PGI+T0NhbWwt Z3JwYzwvYj4gPC9wPg0KPHA+UmVwb3NpdG9yeTogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2RpYWxvaHEvb2NhbWwtZ3JwYyI+aHR0cHM6Ly9naXRodWIuY29tL2RpYWxvaHEvb2NhbWwtZ3Jw YzwvYT4NCjwvcD4NCjxwPjxjb2RlPm9jYW1sLWdycGM8L2NvZGU+IG5vdyBpbmNsdWRlcyBhbiBF aW8gbW9kZS4gQHF1ZXJuZCByZXBvcnRlZCB0aGF0IGl0IGhhcyBiZWVuIGRlcGxveWVkIGluIHRo ZWlyIHByb2R1Y3Rpb24gc3lzdGVtcyBhbmQgaXMgd29ya2luZyBxdWl0ZSB3ZWxsLg0KPC9wPg0K PHA+PGI+U29sdmVyIFNlcnZpY2U8L2I+IDwvcD4NCjxwPk9DYW1sIENJ4oCZcyBzb2x2ZXIgc2Vy dmljZSBpcyBub3cgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L3NvbHZlci1z ZXJ2aWNlL3B1bGwvNzEiPg0KcG93ZXJlZCBieSBFaW88L2E+LiBUaGlzIGhhcyBhbHNvIG1hZGUg dGhlIHNvbHZlciBzZXJ2aWNlIG11bHRpY29yZS4gVGhlIEx3dCB2ZXJzaW9uIGlzIHN0aWxsIGFj dGl2ZSBiZWNhdXNlIHdlIGFyZSBzdGlsbCBkZWJ1Z2dpbmcgc29tZSBwZXJmb3JtYW5jZSBpc3N1 ZXMgd2l0aCB0aGUgRWlvIHZlcnNpb24uDQo8L3A+DQo8cD48Yj5FaW8tc29sbzU8L2I+IDwvcD4N CjxwPkF2YWlsYWJsZSBhdDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1RoZUxvcnRleC9l aW8tc29sbzUiPmh0dHBzOi8vZ2l0aHViLmNvbS9UaGVMb3J0ZXgvZWlvLXNvbG81PC9hPg0KPC9w Pg0KPHA+V2XigJlyZSBjb21taXR0ZWQgdG8gcHJlc2VydmluZyBFaW/igJlzIGNvbXBhdGliaWxp dHkgd2l0aCB0aGUgbGFyZ2VyIE1pcmFnZSBlY29zeXN0ZW0uIFdpdGggdGhhdCBpbiBtaW5kLA0K PGNvZGU+ZWlvLXNvbG81PC9jb2RlPiBpcyBhIHNtYWxsIGV4cGVyaW1lbnQgdGhhdCBkZW1vbnN0 cmF0ZXMgRHJlYW0gcnVubmluZyBvdmVyIEVpbyBhbmQgTWlyYWdlIGxpYnJhcmllcy4NCjwvcD4N CjxwPjxiPk5peHBhY2thZ2VzPC9iPiA8L3A+DQo8cD5QUjogPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL05peE9TL25peHBrZ3MvcHVsbC8yMzAyNzAiPmh0dHBzOi8vZ2l0aHViLmNvbS9OaXhP Uy9uaXhwa2dzL3B1bGwvMjMwMjcwPC9hPg0KPC9wPg0KPHA+VGhhbmtzIHRvIEB0b2FzdGFsLCBF aW8gYW5kIHN1Yi1wYWNrYWdlcyBhcmUgbm93IGF2YWlsYWJsZSBhdCBOaXggcGFja2FnZXMuIDwv cD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzk3NjU5MGUiPjwvYT5DYWxsIHRvIEFjdGlv bjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc5NzY1OTBlIj4N CjxwPjxiPldpbmRvd3M8L2I+IDwvcD4NCjxwPlRoZSBnb29kIG5ld3MgaXMgdGhhdCB3ZSBoYXZl IGEgZnVuY3Rpb25hbCBXaW5kb3dzIGJhY2tlbmQgZm9yIEVpbyAoc2hvdXQtb3V0IHRvIEBwYXRy aWNvZmVycmlzKS4gTm90IHNvIGdvb2QgbmV3cyBpcyB0aGF0IHdlIGhhdmVu4oCZdCBkb25lIGFu IGF3ZnVsIGxvdCBvZiBzdHJlc3MgdGVzdGluZyBvbiBpdC4gSWYgeW91IGFyZSBydW5uaW5nIEVp byBvbiBXaW5kb3dzLCB3ZeKAmXJlIGVhZ2VyIHRvIGhlYXIgd2hhdCB3b3JrcywgYW5kIG1vcmUg aW1wb3J0YW50bHkNCiB3aGF0IGRvZXNu4oCZdC4gV2UgaW50ZW5kIGZvciB0aGUgV2luZG93cyBi YWNrZW5kIHRvIGJlIGEgZmlyc3QgY2xhc3MgY2l0aXplbiwgaW4gYWxpZ25tZW50IHdpdGggdGhl IG92ZXJhcmNoaW5nIG9iamVjdGl2ZSBvZiB1cGhvbGRpbmcgV2luZG93cyBhcyBhIHByaW1hcnkg cGxhdGZvcm0gd2l0aGluIHRoZSBPQ2FtbCBlY29zeXN0ZW0uIFRoYXQgbWVhbnMgcmVzb2x2aW5n IGJ1Z3MgYW5kIGltcHJvdmluZyB3b3JrZmxvd3MsIHNvIHBsZWFzZSBsZXQNCiB1cyBrbm93IGFi b3V0IHlvdXIgZXhwZXJpZW5jZSB1c2luZyBFaW8gb24gV2luZG93cy4gPC9wPg0KPC9kaXY+DQo8 L2xpPjxsaT48YSBpZD0ib3JnNTE5NTlkZiI+PC9hPkxlYXJuIE1vcmU8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNTE5NTlkZiI+DQo8cD5PdXIgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8iPlJFQURNRTwvYT4gb2ZmZXJz IGEgY29tcHJlaGVuc2l2ZSBnZXR0aW5nLXN0YXJ0ZWQgZ3VpZGUgZm9yIEVpby4gRm9yIHRoZSBt b3JlIGN1cmlvdXMgcmVhZGVycyB3YW50aW5nIGFkZGl0aW9uYWwgaW5mb3JtYXRpb246DQo8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+THd0IHRvIEVpbyB0dXRvcmlhbCBhdCBJQ0ZQ IDIwMjM8L2I+OiBUaG9tYXMgTGVvbmFyZCAoQHRhbGV4NSkgYW5kIEpvbiBMdWRsYW0gKEBqb25s dWRsYW0pIGFyZQ0KPGEgaHJlZj0iaHR0cHM6Ly9pY2ZwMjMuc2lncGxhbi5vcmcvZGV0YWlscy9p Y2ZwLTIwMjMtdHV0b3JpYWxzLzQvUG9ydGluZy1Md3QtYXBwbGljYXRpb25zLXRvLU9DYW1sLTUt YW5kLUVpbyI+DQpydW5uaW5nIGEgdHV0b3JpYWw8L2E+IGF0IElDRlAgb24gbWlncmF0aW5nIEx3 dCBhcHBsaWNhdGlvbnMgdG8gRWlvLiBNYXRlcmlhbHMgYXJlIGF2YWlsYWJsZQ0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9pY2ZwLTIwMjMtZWlvLXR1dG9yaWFs Ij5oZXJlPC9hPi4gPC9saT48bGk+PGI+QXdlc29tZSBtdWx0aWNvcmUgT0NhbWw8L2I+OiA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2F3ZXNvbWUtbXVsdGljb3Jl LW9jYW1sI3JlYWRtZSI+DQphd2Vzb21lLW11bHRpY29yZS1vY2FtbDwvYT4gaXMgYSBjb2xsZWN0 aW9uIG9mIGFsbCByZXNvdXJjZXMgcmVsYXRlZCB0byBNdWx0aWNvcmUgYW5kIGVmZmVjdCBoYW5k bGVycy4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjMiPkhlbHAgcmV2YW1waW5nIHRoZSBnZXR0aW5nIHN0YXJ0ZWQgdHV0b3JpYWxzIGlu IG9jYW1sLm9yZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaGVscC1y ZXZhbXBpbmctdGhlLWdldHRpbmctc3RhcnRlZC10dXRvcmlhbHMtaW4tb2NhbWwtb3JnLzEyNzQ5 LzQiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hlbHAtcmV2YW1waW5nLXRoZS1nZXR0 aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWluLW9jYW1sLW9yZy8xMjc0OS80PC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0MGQwZmQyIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnNDBkMGZkMiI+Q3VpaHRsYXVhYyBBbHZhcmFkbyBhbm5vdW5jZWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQwZDBmZDIiPg0K PHA+VGhlIHB1bGwgcmVxdWVzdCBjb3JyZXNwb25kaW5nIHRvIHRoZXNlIHR1dG9yaWFscyBoYXMg YmVlbiB1cGRhdGVkIHdpdGggdGhlIGZlZWRiYWNrIHdl4oCZdmUgcmVjZWl2ZWQuDQo8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9wdWxsLzE0MzEiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8xNDMxPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9y Zy9kb2NzL2EtdG91ci1vZi1vY2FtbCI+aHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL2Et dG91ci1vZi1vY2FtbDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc3RhZ2luZy5vY2Ft bC5vcmcvZG9jcy9ob3ctdG8td3JpdGUtYW4tb2NhbWwtcHJvZ3JhbSI+aHR0cHM6Ly9zdGFnaW5n Lm9jYW1sLm9yZy9kb2NzL2hvdy10by13cml0ZS1hbi1vY2FtbC1wcm9ncmFtPC9hPg0KPC9saT48 L3VsPg0KPHA+V2UgYXJlIGNvbnNpZGVyaW5nIHB1Ymxpc2hpbmcgc29vbiBidXQgYXJlIHN0aWxs IGFjY2VwdGluZyBmZWVkYmFjay4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPnBj cmUyLW9jYW1sLjcuNS4xIHJlbGVhc2VkPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tcGNyZTItb2NhbWwtNy01LTEtcmVsZWFzZWQvMTI5NzIvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBjcmUyLW9jYW1sLTctNS0xLXJlbGVhc2VkLzEyOTcy LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjQxNTc2 YSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzY0MTU3NmEiPkNoZXQgTXVydGh5IGFu bm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNjQx NTc2YSI+DQo8cD5IaSwgSeKAmXZlIGp1c3QgcmVsZWFzZWQgPGNvZGU+cGNyZTItb2NhbWw8L2Nv ZGU+LCBhIHdyYXBwZXIgYXJvdW5kIHRoZSBEZWJpYW4gcGFja2FnZQ0KPGNvZGU+cGNyZTI8L2Nv ZGU+IChmb3IgUENSRSBuZXcgdmVyc2lvbiAjMiwgUENSRTIpLiA8Y29kZT5wY3JlLW9jYW1sPC9j b2RlPiwgdGhlIGxvbmctc3RhbmRpbmcgdmVyc2lvbiBieSBNYXJrdXMgTW90dGwgd2lsbCBiZWNv bWUgb2Jzb2xldGUgYi9jIERlYmlhbiBpcyByZW1vdmluZyBzdXBwb3J0IGZvciB0aGUgdW5kZXJs eWluZyBEZWJpYW4gcGFja2FnZQ0KPGNvZGU+cGNyZTM8L2NvZGU+IChQQ1JFIG9sZCB2ZXJzaW9u ICMxLCBQQ1JFMSkuIDwvcD4NCjxwPlt5ZXMsIHRoaXMgaXMgY29uZnVzaW5nLl0gPC9wPg0KPHA+ VGhpcyBpcyBhIHBvcnQgYnkgQHRvYmlsNHNrIChkb27igJl0IGtub3cgdGhlaXIgSUQgb24gdGhp cyBmb3J1bSk6IEnigJltIChmb3Igbm93KSBqdXN0IG1haW50YWluaW5nIGl0Lg0KPC9wPg0KPHA+ PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NhbWxwNS9wY3JlMi1vY2FtbCI+aHR0cHM6Ly9n aXRodWIuY29tL2NhbWxwNS9wY3JlMi1vY2FtbDwvYT4NCjwvcD4NCjxwPkl0IHNob3VsZCBiZSBh dmFpbGFibGUgaW4gb3BhbSBieSBub3cuIDwvcD4NCjxwPknigJl2ZSBhbHJlYWR5IGZvdW5kIGEg YnVnIChjb3VydGVzeSBvZiBAdmlyaXRyaWxiaWEgKSBhbmQgaGF2ZSBhIGZpeCB3aXRoIHRoZSBi ZWdpbm5pbmcgb2YgdW5pdC10ZXN0cyByZWFkeSB0byByZWxlYXNlLg0KPC9wPg0KPHA+SWYgYW55 Ym9keSBoYXMgYW55IGludGVyZXN0IGluIGpvaW5pbmcgaW4gdG8gbWFpbnRhaW4gdGhpcyBwYWNr YWdlLCBwbGVhc2UgZG8gY29udGFjdCBtZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI1Ij5UaGlyZCAoYW5kIGhvcGVmdWxseSBsYXN0KSByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgT0Nh bWwgNS4xLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3RoaXJkLWFu ZC1ob3BlZnVsbHktbGFzdC1yZWxlYXNlLWNhbmRpZGF0ZS1mb3Itb2NhbWwtNS0xLTAvMTI5NzUv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhpcmQtYW5kLWhvcGVmdWxseS1sYXN0 LXJlbGVhc2UtY2FuZGlkYXRlLWZvci1vY2FtbC01LTEtMC8xMjk3NS8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNTU2NGZlIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMjU1NjRmZSI+b2N0YWNocm9uIGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMjU1NjRmZSI+DQo8cD5TaW5jZSBs YXN0IHdlZWssIHRoZXJlIHdlcmUgdHdvIHNpZ25pZmljYW50IGJ1Z3MgZml4ZWQgaW4gdGhlIE9D YW1sIDUuMS4wIHJ1bnRpbWUgKG9uZSBvdmVyZmxvdyBidWcsIGFuZCBhIHN0YWNrIGNvcnJ1cHRp b24gYnVnIGluIHRoZSBzMzkweCBwb3J0KS4gU2luY2UgdGhvc2UgYnVnIGZpeGVzIGFyZSBhcyBz bWFsbCBhcyB0aGV5IGFyZSBzdWJ0bGUsIHRoZXkgd2VyZSBkZWVtZWQgd29ydGh5IG9mIGEgcmVs ZWFzZSBvZiBhIHRoaXJkIHJlbGVhc2UNCiBjYW5kaWRhdGUgZm9yIE9DYW1sIDUuMS4wLiA8L3A+ DQo8cD5JZiB0aGVyZSBhcmUgbm8gbW9yZSBzdXJwcmlzZXMgdGhpcyB3ZWVrLCB0aGUgcmVsZWFz ZSBvZiBPQ2FtbCA1LjEuMCBzaGFsbCBoYXBwZW4gbmV4dCB3ZWVrLg0KPC9wPg0KPHA+SWYgeW91 IGZpbmQgYW55IGJ1Z3MsIHBsZWFzZSByZXBvcnQgdGhlbSBvbiA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzIj4NCk9DYW1s4oCZcyBpc3N1ZSB0cmFja2VyPC9h Pi4gPC9wPg0KPHA+VGhlIGZ1bGwgY2hhbmdlbG9nIGZvciBPQ2FtbCA1LjEuMCBpcyBhdmFpbGFi bGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNS4xL0NoYW5n ZXMiPg0Kb24gR2l0SHViPC9hPiA8L3A+DQo8cD5BIHNob3J0IHN1bW1hcnkgb2YgdGhlIHR3byBm aXhlZCBidWdzIGluIHRoaXMgcmVsZWFzZSBjYW5kaWRhdGUgaXMgYWxzbyBhdmFpbGFibGUgYmVs b3cuDQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQ2YTU2OTQi IGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc0NmE1Njk0Ij5JbnN0YWxsYXRpb24gSW5z dHJ1Y3Rpb25zPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc0 NmE1Njk0Ij4NCjxwPlRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3Bh bSBzd2l0Y2ggd2l0aCB0aGUgZm9sbG93aW5nIGNvbW1hbmRzIG9uIG9wYW0gMi4xIGFuZCBsYXRl cjoNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNy YyBzcmMtc2hlbGwiPm9wYW0gdXBkYXRlDQpvcGFtIHN3aXRjaCBjcmVhdGUgNS4xLjB+cmMzDQo8 L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVsZWFzZSBjYW5kaWRh dGUgaXMgYWxzbyBkaXJlY3RseSBhdmFpbGFibGUgb246IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVs Ij4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS81 LjEuMC1yYzMudGFyLmd6Ij5HaXRIdWI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vY2Ft bC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjEvb2NhbWwtNS4xLjB+cmMzLnRhci5neiI+ T0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWE8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZDhiMDMwMyI+PC9hPkZpbmUtVHVuZWQgQ29tcGls ZXIgQ29uZmlndXJhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4 dC1vcmdkOGIwMzAzIj4NCjxwPklmIHlvdSB3YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1cmF0aW9u IG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBzd2l0Y2ggdG8gdGhlIG9wdGlvbiB2YXJpYW50IHdp dGg6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJz cmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlICZsdDtzd2l0Y2hf bmFtZSZndDsgb2NhbWwtdmFyaWFudHMuNS4xLjB+cmMzJiM0MztvcHRpb25zICZsdDtvcHRpb25f bGlzdCZndDsNCjwvcHJlPg0KPC9kaXY+DQo8cD53aGVyZSA8Y29kZT4mbHQ7b3B0aW9uX2xpc3Qm Z3Q7PC9jb2RlPiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIDxjb2RlPm9jYW1sLW9wdGlv bi0qPC9jb2RlPiBwYWNrYWdlcy4gRm9yIGluc3RhbmNlLCBmb3IgYQ0KPGNvZGU+ZmxhbWJkYTwv Y29kZT4gYW5kIDxjb2RlPm5vLWZsYXQtZmxvYXQtYXJyYXk8L2NvZGU+IHN3aXRjaDogPC9wPg0K PGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVs bCI+b3BhbSBzd2l0Y2ggY3JlYXRlIDUuMS4wfnJjMyYjNDM7ZmxhbWJkYSYjNDM7bmZmYSBvY2Ft bC12YXJpYW50cy41LjEuMH5yYzMmIzQzO29wdGlvbnMgb2NhbWwtb3B0aW9uLWZsYW1iZGENCm9j YW1sLW9wdGlvbi1uby1mbGF0LWZsb2F0LWFycmF5DQo8L3ByZT4NCjwvZGl2Pg0KPHA+QWxsIGF2 YWlsYWJsZSBvcHRpb25zIGNhbiBiZSBsaXN0ZWQgd2l0aCA8Y29kZT5vcGFtIHNlYXJjaCBvY2Ft bC1vcHRpb248L2NvZGU+Lg0KPC9wPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y2MGQyNWQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdmNjBkMjVkIj5MYXN0IFNlY29uZCBCdWcgRml4ZXM8L2g0Pg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2Y2MGQyNWQiPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTEy ODQiPiMxMTI4NDwvYT4sICYjNDM7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy8xMjUyNSI+IzEyNTI1PC9hPjogVXNlIGNvbXByZXNzaW9uIG9mIGVudHJpZXMg c2NoZW1lIHdoZW4gcHJ1bmluZyBtYXJrIHN0YWNrLiBDYW4gZGVjcmVhc2UgbWVtb3J5IHVzYWdl IGZvciBzb21lIHdvcmtsb2Fkcywgb3RoZXJ3aXNlIHNob3VsZA0KIGJlIHVub2JzZXJ2YWJsZS4g KFRvbSBLZWxseSwgcmV2aWV3IGJ5IFNhYmluZSBTY2htYWx0eiwgU2FkaXEgSmFmZmVyIGFuZCBE YW1pZW4gRG9saWdleikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTI0ODYiPiMxMjQ4NjwvYT46IEZpeCBkZWxpdmVyeSBvZiB1bmhhbmRs ZWQgZWZmZWN0IGV4Y2VwdGlvbnMgb24gczM5MHggKE1pb2QgVmFsbGF0LCByZXBvcnQgYnkgSmFu IE1pZHRnYWFyZCwgcmV2aWV3IGJ5IFZpbmNlbnQgTGF2aXJvbiBhbmQgWGF2aWVyIExlcm95KQ0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+T2NhbWwub3Jn IHR1dG9yaWFsIHJldmFtcGluZywgY29udOKAmWQgLSBCYXNpYyBEYXRhdHlwZXM8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy10dXRvcmlhbC1yZXZhbXBp bmctY29udGQtYmFzaWMtZGF0YXR5cGVzLzEyOTg1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L29jYW1sLW9yZy10dXRvcmlhbC1yZXZhbXBpbmctY29udGQtYmFzaWMtZGF0YXR5cGVz LzEyOTg1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2MwMWIxODciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdjMDFiMTg3Ij5DdWlodGxh dWFjIEFsdmFyYWRvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnYzAxYjE4NyI+DQo8cD5VcGRhdGUgb2YgdGhlIG9jYW1sLm9yZyB0dXRvcmlh bHMgY29udGludWVzLiA8L3A+DQo8cD5XZeKAmWQgbGlrZSB0byBoYXZlIHlvdXIgb3BpbmlvbiBv biB0aGlzIG5ldyBvbmU6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5TdGFnaW5nOiA8 YSBocmVmPSJodHRwczovL3N0YWdpbmcub2NhbWwub3JnL2RvY3MvYmFzaWMtZGF0YS10eXBlcyI+ aHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL2Jhc2ljLWRhdGEtdHlwZXM8L2E+DQo8L2xp PjxsaT5HaXRIdWIgUFI6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xNTE0Ij5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUx NDwvYT4NCjwvbGk+PC91bD4NCjxwPkl0IGFkZHJlc3NlcyBkYXRhdHlwZXMgYmFzaWMgY29uY2Vw dHMuIEl0IGNvdmVycyB0aGUgbW9zdCBjb21tb24gcHJlZGVmaW5lZCBkYXRhdHlwZXMsIHZhcmlh bnRzLCBhbmQgcmVjb3Jkcy4NCjwvcD4NCjxwPk11dGFiaWxpdHkgYW5kIHJlZmVyZW5jZXMgYXJl IG5vdCBjb3ZlcmVkLCBhbmQgcG9seW1vcnBoaWMgdmFyaWFudHMgYXJlIG5laXRoZXIgKHdl4oCZ cmUgcGxhbm5pbmcgdG8gd29yayBvbiB0aGVzZSBhcyBzdGFuZC1hbG9uZSB0dXRvcmlhbHMpLg0K PC9wPg0KPHA+V2UgbG92ZSBmZWVkYmFjaywgd2UgbmVlZCBpdC4gPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjciPlByaW50aW5nLCBtb2R1bGFyIGltcGxpY2l0cyBhbmQgdGhlIFN0ZGxp YjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHJpbnRpbmctbW9kdWxh ci1pbXBsaWNpdHMtYW5kLXRoZS1zdGRsaWIvMTMwMDIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcHJpbnRpbmctbW9kdWxhci1pbXBsaWNpdHMtYW5kLXRoZS1zdGRsaWIvMTMwMDIv MTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNmUxMzdh YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzZlMTM3YWMiPkVtaWxlIFRyb3RpZ25v biBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzZlMTM3YWMiPg0KPHA+SSB3YW50ZWQgdG8gc2hhcmUgdGhvdWdodHMgSSBoYWQgb24gdGhlIHRo b3JueSDigJxwcmludGluZyBxdWVzdGlvbuKAnSB3aXRoIHRoZSBjb21tdW5pdHkuIEkgaGF2ZSB3 cml0dGVuIGEgc21hbGwgYmxvZyBwb3N0DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRW1p bGVUcm90aWdub24vYmxvZy9ibG9iL21hc3Rlci9wcmludGluZ19hbmRfb2NhbWwubWQiPg0KaGVy ZTwvYT4sIGFuZCBJIHdvdWxkIGVuam95IGRpc2N1c3NpbmcgdGhlIHF1ZXN0aW9ucyByYWlzZWQg aGVyZS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPk9jYW1sLm9yZyB0dXRvcmlh bCByZXZhbXBpbmcsIGNvbuKAmWQgLSBWYWx1ZXMgYW5kIEZ1bmN0aW9uczwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLXR1dG9yaWFsLXJldmFtcGluZy1j b25kLXZhbHVlcy1hbmQtZnVuY3Rpb25zLzEzMDA1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L29jYW1sLW9yZy10dXRvcmlhbC1yZXZhbXBpbmctY29uZC12YWx1ZXMtYW5kLWZ1bmN0 aW9ucy8xMzAwNS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmcxZjFhOTM3IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMWYxYTkzNyI+Q3Vp aHRsYXVhYyBBbHZhcmFkbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzFmMWE5MzciPg0KPHA+SGVyZSBpcyBhIG5ldyBlcGlzb2RlIGluIHRo ZSBzZXJpZXMgb2YgdXBkYXRlcyBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL29jYW1sLm9yZy8iPg0K b2NhbWwub3JnPC9hPiB0dXRvcmlhbHMgPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNTEyIj5odHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUxMjwvYT4NCjwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vc3RhZ2luZy5vY2FtbC5vcmcvZG9jcy92YWx1ZXMtYW5kLWZ1bmN0aW9u cyI+aHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL3ZhbHVlcy1hbmQtZnVuY3Rpb25zPC9h Pg0KPC9saT48L3VsPg0KPHA+SXQgYWRkcmVzc2VzIHZhbHVlcywgZnVuY3Rpb25zLCBlbnZpcm9u bWVudCwgc2NvcGUsIGNsb3N1cmVzLCBzaGFkb3dpbmcgYW5kIGZyaWVuZHMuDQo8L3A+DQo8cD5B cyBmb3IgdGhlIHByZXZpb3VzIG9uZSwgd2XigJlkIGxvdmUgdG8ga25vdyB3aGF0IHlvdSB0aGlu ayBhYm91dCBpdC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnODAzMzJhNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzgw MzMyYTciPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LW9yZzgwMzMyYTciPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxh IGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBh IG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJj aGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3du L2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3Ug YWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNj cmliZSA8YSBocmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13 ZWVrbHkvIj4NCm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJv cmdjOWM0ZTk4Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5B bGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9i b2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 5 Sep 2023 10:01:30 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 5 Sep 2023 10:01:29 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 5 Sep 2023 10:01:29 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38591143005201 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 5 Sep 2023 10:01:01 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 38590o3P005186 for ; Tue, 5 Sep 2023 10:00:50 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 Sep 2023 11:00:49 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 0FE24E0CD1; Tue, 5 Sep 2023 11:00:49 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id BF43EE0CCA for ; Tue, 5 Sep 2023 11:00:43 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Sep 2023 11:00:32 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E8C48561289; Tue, 5 Sep 2023 11:00:22 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ39eP1CYwse/jf0SLCMen9fnwXg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 5 Sep 2023 10:00:22 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 9737fcd6-dbd6-4979-09cd-08dbadeeb1c7 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.02,229,1688421600"; d="scan'208,217";a="124359207" x-spam-flag: No, tests=bogofilter, spamicity=0.311835, queueID=4896856128A x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <59501B236CEDF447BA50E9234A19BBE0@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOS0wNSBUdWUgMTA6NTggLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDguMjkuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOS4xMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEF1Z3VzdCAyOSB0byBTZXB0ZW1iZXIgMDUs IDIwMjMuDQo8L3A+DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+ DQo8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250 ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPmlvc3RyZWFtIDAu MTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPlNlY29uZCByZWxlYXNlIGNhbmRpZGF0ZSBmb3Ig T0NhbWwgNS4xLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5vY2FtbGdyYXBoIDIuMS4wPC9h PiA8L2xpPjxsaT48YSBocmVmPSIjNCI+TGlxdWlkIE1MIC0gQSB0ZW1wbGF0aW5nIGxhbmd1YWdl IHVzZWQgYnkgU2hvcGlmeSwgR2l0aHViIFBhZ2VzIGFuZCBtb3JlITwvYT4NCjwvbGk+PGxpPjxh IGhyZWY9IiM1Ij5tb29ucG9vbCAwLjQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5PeGlkaXpp bmcgT0NhbWwsIGFuZCBhIG5ldyBvcGFtIHN3aXRjaDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzci Pk91dHJlYWNoeSBEZWNlbWJlciAyMDIzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+TmV3IHJl bGVhc2Ugb2YgUFByaW50ICgyMDIzODMwKTwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZzY2ZGY5 YjgiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+aW9zdHJlYW0g MC4xPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFy Y2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taW9zdHJlYW0t MC0xLzEyOTIyLzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taW9zdHJlYW0tMC0x LzEyOTIyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2UxMTg0YjMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlMTE4NGIzIj5TaW1vbiBD cnVhbmVzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnZTExODRiMyI+DQo8cD5J4oCZdmUganVzdCByZWxlYXNlZCBpb3N0cmVhbSAwLjEuIGlv c3RyZWFtIGlzIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9vY2FtbC1pb3N0 cmVhbSI+DQpsaWJyYXJ5PC9hPiB0aGF0IHByb3ZpZGVzIGNvbXBvc2FibGUgYWJzdHJhY3Rpb25z IGZvciBpbnB1dC9vdXRwdXQgc3RyZWFtcyBvZiBieXRlcy4gSGVyZSBjb21wb3NhYmlsaXR5IG1l YW5zIHRoYXQgdXNlcnMgY2FuIGNyZWF0ZSB0aGVpciBvd24gc3RyZWFtcywgd2hpY2ggbWFrZXMg YQ0KPGNvZGU+SW9zdHJlYW0uT3V0LnQ8L2NvZGU+IG1vcmUgcG93ZXJmdWwgdGhhbiB0aGUgc3Rh bmRhcmQgPGNvZGU+b3V0X2NoYW5uZWw8L2NvZGU+IGJlY2F1c2UgaXQgaXMgYW4gYWJzdHJhY3Rp b24gdGhhdCBtaWdodCBwZXJmb3JtIGNvbXByZXNzaW9uIGJlZm9yZSB3cml0aW5nIHRvIGENCjxj b2RlPkJ1ZmZlci50PC9jb2RlPiwgb3Igd3JpdGVzIHRvIGEgc29ja2V0LCBvciB3cml0ZSBub3do ZXJlLCBvciBzZW5kIHRoZSBieXRlcyB0byBtdWx0aXBsZSBvdGhlciBvdXRwdXRzLg0KPC9wPg0K PHA+VGhlcmUgYWxyZWFkeSBleGlzdCBzb21lIHNpbWlsYXIgYWJzdHJhY3Rpb25zIGluIHRoZSBl Y29zeXN0ZW0sIHN1Y2ggYXMgQmF0dGVyaWVz4oCZDQo8Y29kZT5CYXRJTzwvY29kZT4sIGFuIG9i amVjdCBiYXNlZCB2ZXJzaW9uIG9mIHRoaXMgaW4gb2NhbWxuZXQsIGFuZCBwcm9iYWJseSB1bmNv dW50YWJseSBtYW55IG90aGVyIHByb2plY3RzLiBJIGhhdmUgYW5jZXN0b3IgdmVyc2lvbnMgb2Yg dGhpcyBpbiBtYW55IG9mIG15IG93biBwcm9qZWN0cy4gVGhpcyBpcyBteSB3YXkgb2YgZGVhbGlu ZyB3aXRoIG15IGZhaWx1cmUgdG8gaW1wbGVtZW50DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvUkZDcy9wdWxsLzE5Ij5SRkMxOTwvYT4gaW4gT0NhbWwgaXRzZWxmIChhIHdvcnRo eSByZWFkIGFib3V0IHRyYWRlb2ZmcyBhbmQgdXNlIGNhc2VzLCBmb3IgYW55b25lIGludGVyZXN0 ZWQpLiBJbiBvdGhlciBsYW5ndWFnZXMgeW91IGNhbiBmaW5kIFJ1c3TigJlzDQo8YSBocmVmPSJo dHRwczovL2RvYy5ydXN0LWxhbmcub3JnL3N0ZC9pby90cmFpdC5SZWFkLmh0bWwiPlJlYWQ8L2E+ LCA8YSBocmVmPSJodHRwczovL2RvYy5ydXN0LWxhbmcub3JnL3N0ZC9pby90cmFpdC5CdWZSZWFk Lmh0bWwiPg0KQnVmUmVhZDwvYT4sIGFuZCA8YSBocmVmPSJodHRwczovL2RvYy5ydXN0LWxhbmcu b3JnL3N0ZC9pby90cmFpdC5Xcml0ZS5odG1sIj5Xcml0ZTwvYT4gdHJhaXRzOyBhbmQgR2/igJlz DQo8YSBocmVmPSJodHRwczovL3BrZy5nby5kZXYvaW8jUmVhZGVyIj5SZWFkZXI8L2E+IGFuZCA8 YSBocmVmPSJodHRwczovL3BrZy5nby5kZXYvaW8jV3JpdGVyIj4NCldyaXRlcjwvYT4gaW50ZXJm YWNlcy4gPC9wPg0KPHA+QSBkZXNpZ24gbm90ZTogaW4gPGNvZGU+aW9zdHJlYW08L2NvZGU+IHRo ZXJlIGlzIGEgc2VwYXJhdGlvbiBiZXR3ZWVuIDxjb2RlPklvc3RyZWFtLkluLnQ8L2NvZGU+ICh3 aGljaCBpcyBiYXNpY2FsbHkgbGlrZSBhIHVuaXggRkQgb3IgcnVzdOKAmXMNCjxjb2RlPlJlYWQ8 L2NvZGU+OiBpdCBnaXZlcyB5b3UgPGNvZGU+cmVhZDogYnl0ZXMgLSZndDsgaW50IC0mZ3Q7IGlu dCAtJmd0OyBpbnQ8L2NvZGU+KSwgYW5kDQo8Y29kZT5Jb3N0cmVhbS5Jbl9idWYudDwvY29kZT4g KHRoZSBlcXVpdmFsZW50IG9mIHJ1c3TigJlzIDxjb2RlPkJ1ZlJlYWQ8L2NvZGU+OiBpdCBoYXMg aXRzIG93biBidWZmZXIgYW5kIGdpdmVzIHlvdSBhY2Nlc3MgdG8gaXQuIFVubGlrZQ0KPGNvZGU+ aW5fY2hhbm5lbDwvY29kZT7igJlzIG1hZ2ljIG1ldGhvZHMgZm9yIDxjb2RlPmlucHV0X2xpbmU8 L2NvZGU+LCB5b3UgY2FuIGluc3BlY3QgdGhlIGJ1ZmZlciB0byBsb29rIGFoZWFkIGFuZCBjb25z dW1lIGV4YWN0bHkgdGhlIGFtb3VudCBvZiBpbnB1dCB5b3UgbmVlZCwgbm8gbGVmdG92ZXJzKS4N CjwvcD4NCjxwPlRoZSBsaWJyYXJ5IGlzIHVuZGVyIHRoZSBNSVQgbGljZW5zZS4gVGhlIG9ubGlu ZSBkb2NzIGFyZSA8YSBocmVmPSJodHRwczovL2MtY3ViZS5naXRodWIuaW8vb2NhbWwtaW9zdHJl YW0vZGV2L2lvc3RyZWFtL2luZGV4Lmh0bWwiPg0KaGVyZTwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3ZjhmZDFkIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnN2Y4ZmQxZCI+UnVkaSBHcmluYmVyZyBhc2tlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2Y4ZmQxZCI+DQo8cD5Mb29rcyBs aWtlIGFuIGludGVyZXN0aW5nIGxpYnJhcnkgdG8gbWUuIEkgaGF2ZSBhIGZldyBjb21tZW50cyBv ciBxdWVzdGlvbnM6IDwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5JcyB0aGVyZSBnb2lu ZyB0byBiZSBzdXBwb3J0IGZvciBiaWdhcnJheXMgb3IgZG8geW91IG5vdCBzdXBwb3J0IHRoZW0g b24gcHVycG9zZT8NCjwvbGk+PGxpPlRoZSBkb2N1bWVudGF0aW9uIHN0YXRlcyB0aGF0IDxjb2Rl PmNsb3NlPC9jb2RlPiDigJxtdXN0IGJlIGlkZW1wb3RlbnTigJ0gZm9yIG91dHB1dCBzdHJlYW1z IGFuZCBpcyDigJxpZGVtcG90ZW504oCdIGZvciBpbnB1dCBzdHJlYW1zLiBDb3VsZCB5b3UgY2xh cmlmeSB0aGUgZGlzdGluY3Rpb24gaGVyZT8gQWxzbywgZGlkIHlvdSBjb25zaWRlciBqdXN0IG1h a2luZyBzdXJlIHRoYXQgeW91ciBtb2R1bGVzIG5ldmVyIGNhbGwgdGhlc2UgZnVuY3Rpb25zDQog bW9yZSB0aGFuIG9uY2U/IFNlZW1zIGxpa2UgdGhhdCB3b3VsZCBiZSBtb3JlIGhlbHBmdWwgdG8g dXNlcnMgb2YgdGhlIGxpYnJhcnkuIDwvbGk+PGxpPkRpZCB5b3UgY29uc2lkZXIgc3BsaXR0aW5n IHRoZSBwYXJ0cyB0aGF0IGRlcGVuZCBvbiBVbml4IGludG8gYSBzdWIgbGlicmFyeT8gPC9saT48 L29sPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg2MTc0 YzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4NjE3NGMyIj5TaW1vbiBDcnVhbmVz IHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzg2 MTc0YzIiPg0KPHA+VGhlc2UgYXJlIGdvb2QgcXVlc3Rpb25zLCB0aGFua3MuIEl04oCZcyBub3Qg ZWFzeSB0byB3cml0ZSBpbnRlcmZhY2VzIHdpdGggc3VjaCBhIGdlbmVyYWwgcHVycG9zZSBzY29w ZSA6c3dlYXRfc21pbGU6DQo8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+SSBkaWRu4oCZ dCBzZWUgYSBnb29kIHdheSB0byBzdXBwb3J0IGJvdGggYnl0ZXMgYW5kIGJpZ2FycmF5cyBpbiB0 aGUgc2FtZSBpbnRlcmZhY2Ugwq3igJQgYXNraW5nIGltcGxlbWVudG9ycyB0byBoYXZlIGJvdGgN Cjxjb2RlPnJlYWQ8L2NvZGU+IGFuZCA8Y29kZT5yZWFkX2JpZ3N0cmluZzwvY29kZT4gd291bGQg YmUgYW5ub3lpbmcsIGZvciBleGFtcGxlLiBIb3dldmVyIGEgZ29vZCBjaHVuayBvZiB0aGUgZWNv c3lzdGVtIGRvZXMgcmVseSBvbiBiaWdhcnJheXMgc28gaXQgaXMgYW4gaW1wb3J0YW50IHRvcGlj LiBJIGNhbiBpbWFnaW5lIHR3byBzb2x1dGlvbnMgb24gdGhlIHRvcCBvZiBteSBoZWFkOg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPmhhdmUgPGNvZGU+cmVhZF9iaWdzdHJpbmc8L2NvZGU+LCA8 Y29kZT53cml0ZV9iaWdzdHJpbmc8L2NvZGU+IHdpdGggZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMg anVzdCBnb2luZyB0aHJvdWdoIGFuIGludGVybWVkaWF0ZSBsYXllciBvZg0KPGNvZGU+Ynl0ZXM8 L2NvZGU+LCBhbmQgdGhlIHBvc3NpYmlsaXR5IGZvciB0aGUgaW1wbGVtZW50b3Igb2YgdGhlIHN0 cmVhbSB0byB3cml0ZSBhIGN1c3RvbSB2ZXJzaW9uDQo8L2xpPjxsaT5wYXJhbWV0cml6ZSB0aGUg c3RyZWFtIHR5cGVzIHdpdGggdGhlIHVuZGVybHlpbmcgdHlwZSwgaS5lIGhhdmUgPGNvZGU+Ynl0 ZXMgSW9zdHJlYW0uSW4udDwvY29kZT4gYXMgd2VsbCBhcw0KPGNvZGU+Ymlnc3RyaW5nIH5Jb3N0 cmVhbS5Jbi50PC9jb2RlPi4gQnV0IGhlcmUgdGhlIGRpZmZpY3VsdHkgaXMgdGhhdCBhbGwgdGhl IGNvbnZlbmllbmNlIGNvbWJpbmF0b3JzIGluIHRoZSBsaWJyYXJ5IGJlY29tZSBpbXBvc3NpYmxl IHRvIHdyaXRlLCBvciBzcGVjaWFsaXplZCBqdXN0IGZvciAoc2F5KSB0aGUNCjxjb2RlPmJ5dGVz PC9jb2RlPiB2ZXJzaW9uLiA8L2xpPjwvdWw+DQo8L2xpPjxsaT48Y29kZT5jbG9zZTwvY29kZT4g c2hvdWxkIGJlIGlkZW1wb3RlbnQgZm9yIGJvdGgsIGkuZSBjbG9zaW5nIHR3aWNlIHNob3VsZG7i gJl0IGZhaWwuIFRoZSByZWFzb24gaXMgdGhhdCBpdOKAmXMganVzdCB0b28gaGFyZCB0byBrZWVw IHRyYWNrIG9mIHdoZXRoZXIgeW91IGNsb3NlZCBhbHJlYWR5LCBlc3BlY2lhbGx5IGlmIHlvdSBt aXggZXhwbGljaXQgY2xvc2luZyAoY2xvc2luZyBhIGNvbm5lY3Rpb24pIHdpdGggcmVzb3VyY2Ug aGFuZGxlcnMgc3VjaA0KIGFzIDxjb2RlPndpdGhfaW4gOiDigKY8L2NvZGU+IG9yIDxjb2RlPkZ1 bi5wcm90ZWN0PC9jb2RlPiB0aGF0IHdpbGwgZW5zdXJlIHByb3BlciBkaXNwb3NhbCBvZiByZXNv dXJjZXMuDQo8L2xpPjxsaT5Ib3cgZG8geW91IHByb3ZpZGUgYW4gaW50ZXJmYWNlIHdpdGggYSA8 Y29kZT5hc19mZCA6IHVuaXQgLSZndDsgVW5peC5maWxlX2Rlc2NyIG9wdGlvbjwvY29kZT4gaW4g YSBzdWItbGlicmFyeT8gSXQgaGFzIHRvIGJlIHBhcnQgb2YgdGhlIGNvcmUgaW50ZXJmYWNlLCBv ciBub3QgYmUgdGhlcmUgYXQgYWxsLiBUaGlzIHBhcnQgY29tZXMgZnJvbSB0aGUgaW5pdGlhbCBn b2FsLCBpbiBSRkMgMTksIHRvIHJlcGxhY2Ugc3RhbmRhcmQgY2hhbm5lbHMNCiAod2hpY2ggcHJv dmlkZSB0aGluZ3MgbGlrZSA8Y29kZT5zZWVrPC9jb2RlPiBhbmQgPGNvZGU+cG9zPC9jb2RlPiks IGJ1dCBJIGFncmVlIGl04oCZcyBhbm5veWluZyB0byBkZXBlbmQgb24NCjxjb2RlPlVuaXg8L2Nv ZGU+LiA8L2xpPjwvb2w+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+U2Vjb25kIHJlbGVh c2UgY2FuZGlkYXRlIGZvciBPQ2FtbCA1LjEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3Qvc2Vjb25kLXJlbGVhc2UtY2FuZGlkYXRlLWZvci1vY2FtbC01LTEtMC8xMjky OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZWNvbmQtcmVsZWFzZS1jYW5kaWRh dGUtZm9yLW9jYW1sLTUtMS0wLzEyOTI4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnYjZhOGJmZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2I2YThiZmUiPm9jdGFjaHJvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2I2YThiZmUiPg0KPHA+SW4gdGhlIGxhc3QgdHdvIHdlZWtzLCB0 d28gc2lnbmlmaWNhbnQgYnVncyBoYXZlIGJlZW4gZGlzY292ZXJlZCBpbiB0aGUgcmVsZWFzZSBj YW5kaWRhdGUgZm9yIE9DYW1sIDUuMS4wIChvbmUgYWZmZWN0aW5nIHRoZSB0eXBlIHN5c3RlbSwg YW5vdGhlciBpbiB0aGUgcnVudGltZSkuDQo8L3A+DQo8cD5UaG9zZSBidWdzIGFyZSBub3cgZml4 ZWQgYW5kIHdlIGFyZSBwdWJsaXNoaW5nIGEgc2Vjb25kIHJlbGVhc2UgY2FuZGlkYXRlIHRvIGNo ZWNrIHRoYXQgZXZlcnl0aGluZyBpcyBpbiBvcmRlciBiZWZvcmUgdGhlIHJlbGVhc2UgaW4gdGhl IHVwY29taW5nIHdlZWsuDQo8L3A+DQo8cD5JZiB5b3UgZmluZCBhbnkgYnVncywgcGxlYXNlIHJl cG9ydCB0aGVtIG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMiPg0KT0NhbWzigJlzIGlzc3VlIHRyYWNrZXI8L2E+LiA8L3A+DQo8cD5UaGUgZnVsbCBjaGFu Z2UgbG9nIGZvciBPQ2FtbCA1LjEuMCBpcyBhdmFpbGFibGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNS4xL0NoYW5nZXMiPg0Kb24gR2l0SHViPC9hPi4gQSBz aG9ydCBzdW1tYXJ5IG9mIHRoZSB0d28gZml4ZWQgYnVncyBpbiB0aGlzIHJlbGVhc2UgY2FuZGlk YXRlIGlzIGFsc28gYXZhaWxhYmxlIGJlbG93Lg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmczNGQ2MGY0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3Jn MzRkNjBmNCI+SW5zdGFsbGF0aW9uIEluc3RydWN0aW9uczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMzRkNjBmNCI+DQo8cD5UaGUgYmFzZSBjb21waWxlciBj YW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dpdGNoIHdpdGggdGhlIGZvbGxvd2luZyBjb21t YW5kcyBvbiBvcGFtIDIuMSBhbmQgbGF0ZXI6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNv bnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBz d2l0Y2ggY3JlYXRlIDUuMS4wfnJjMg0KPC9wcmU+DQo8L2Rpdj4NCjxwPlRoZSBzb3VyY2UgY29k ZSBmb3IgdGhlIHJlbGVhc2UgY2FuZGlkYXRlIGlzIGFsc28gZGlyZWN0bHkgYXZhaWxhYmxlIG9u OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS4xLjAtcmMyLnRhci5neiI+R2l0SHViPC9hPiA8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNS4x L29jYW1sLTUuMS4wfnJjMi50YXIuZ3oiPk9DYW1sIGFyY2hpdmVzIGF0IElucmlhPC9hPg0KPC9s aT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2I4MjUx NjYiPjwvYT5GaW5lLVR1bmVkIENvbXBpbGVyIENvbmZpZ3VyYXRpb248YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYjgyNTE2NiI+DQo8cD5JZiB5b3Ugd2FudCB0 byB0d2VhayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc3dpdGNo IHRvIHRoZSBvcHRpb24gdmFyaWFudCB3aXRoOg0KPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1j b250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+b3BhbSB1cGRhdGUNCm9wYW0g c3dpdGNoIGNyZWF0ZSAmbHQ7c3dpdGNoX25hbWUmZ3Q7IG9jYW1sLXZhcmlhbnRzLjUuMS4wfnJj MiYjNDM7b3B0aW9ucyAmbHQ7b3B0aW9uX2xpc3QmZ3Q7DQo8L3ByZT4NCjwvZGl2Pg0KPHA+d2hl cmUgPGNvZGU+Jmx0O29wdGlvbl9saXN0Jmd0OzwvY29kZT4gaXMgYSBjb21tYS1zZXBhcmF0ZWQg bGlzdCBvZiA8Y29kZT5vY2FtbC1vcHRpb24tKjwvY29kZT4gcGFja2FnZXMuIEZvciBpbnN0YW5j ZSwgZm9yIGENCjxjb2RlPmZsYW1iZGE8L2NvZGU+IGFuZCA8Y29kZT5uby1mbGF0LWZsb2F0LWFy cmF5PC9jb2RlPiBzd2l0Y2g6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4N CjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0gc3dpdGNoIGNyZWF0ZSA1LjEuMH5yYzIm IzQzO2ZsYW1iZGEmIzQzO25mZmEgb2NhbWwtdmFyaWFudHMuNS4xLjB+cmMyJiM0MztvcHRpb25z IG9jYW1sLW9wdGlvbi1mbGFtYmRhDQpvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0K PC9wcmU+DQo8L2Rpdj4NCjxwPkFsbCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdp dGggPGNvZGU+b3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9uPC9jb2RlPi4NCjwvcD4NCjwvZGl2Pg0K PC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkNTMwMTNi IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZDUzMDEzYiI+TGFzdCBNaW51dGUgQnVn IEZpeGVzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdkNTMw MTNiIj48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZWE5MTY5OCI+ PC9hPlR5cGUgU3lzdGVtOjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4 dC1vcmdlYTkxNjk4Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT4oPGI+YnJlYWtpbmcgY2hh bmdlPC9iPikgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy82 OTQxIj4NCiM2OTQxPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L2lzc3Vlcy8xMTE4NyI+IzExMTg3PC9hPiwgJiM0Mzs8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNDgzIj4jMTI0ODM8L2E+OiBwcm9oaWJpdCB1c2luZyBj bGFzc2VzIHRocm91Z2ggcmVjdXJzaXZlIG1vZHVsZXMgaW5oZXJpdGluZyBvciBpbmNsdWRpbmcg YSBjbGFzcyBiZWxvbmdpbmcgdG8gYSBtdXR1YWxseS1yZWN1cnNpdmUNCiBtb2R1bGUgd291bGQg cHJldmlvdXMgYmVoYXZlIGluY29ycmVjdGx5LCBhbmQgbm93IHJlc3VsdHMgaW4gYSBjbGVhbiBl cnJvci4gKExlbyBXaGl0ZSwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlciBhbmQgRmxvcmlhbiBB bmdlbGV0dGkpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc2NjNkMDY3 Ij48L2E+UnVudGltZTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1v cmc2NjNkMDY3Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNDgxIj4jMTI0ODE8L2E+LCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNTA1Ij4NCiMxMjUwNTwvYT46 IEZpeCBpbmNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb2YgYXJyYXkgZXhwcmVzc2lvbnMgPGNvZGU+ W3xlMTsuLi47ZU58XTwvY29kZT4gd2hlbg0KPGNvZGU+TjwvY29kZT4gaXMgbGFyZ2UgZW5vdWdo IHRvIHJlcXVpcmUgbWFqb3IgaGVhcCBhbGxvY2F0aW9uLiAoWGF2aWVyIExlcm95LCByZXBvcnQg YnkgQW5kcmV5IFBvcHAsIGFuYWx5c2lzIGJ5IEtDIFNpdmFyYW1ha3Jpc2huYW4gYW5kIFZpbmNl bnQgTGF2aXJvbiwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJlcikNCjwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPm9jYW1sZ3JhcGggMi4x LjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbGdyYXBo LTItMS0wLzEyOTM3LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxncmFw aC0yLTEtMC8xMjkzNy8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmcwODQ1MmNmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMDg0NTJjZiI+ SmVhbiBDaHJpc3RvcGhlIEZpbGxpYXRyZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzA4NDUyY2YiPg0KPHA+SXQgaXMgbXkgcGxlYXN1cmUg dG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v YmFja3RyYWNraW5nL29jYW1sZ3JhcGgiPg0KT0NhbWxHcmFwaDwvYT4sIGEgZ3JhcGggbGlicmFy eSBmb3IgT0NhbWwuIEl0IGlzIGFscmVhZHkgYXZhaWxhYmxlIGluIG9wYW0gYW5kIGl0IGlzIGRv Y3VtZW50ZWQNCjxhIGhyZWY9Imh0dHA6Ly9iYWNrdHJhY2tpbmcuZ2l0aHViLmlvL29jYW1sZ3Jh cGgvIj5oZXJlPC9hPi4gPC9wPg0KPHA+QW1vbmcgb3RoZXIgdGhpbmdzLCB0aGlzIHJlbGVhc2Ug Zml4ZXMgYW4gZW1iYXJyYXNzaW5nIGJ1ZyBpbiBmdW5jdGlvbnMgPGNvZGU+DQpEZnMuZm9sZDwv Y29kZT4gYW5kIDxjb2RlPkRmcy5mb2xkX2NvbXBvbmVudDwvY29kZT4sIHdoaWNoIHdlcmUgYWN0 dWFsbHkgbm90IGltcGxlbWVudGluZyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCAoeWV0IGEgZ3Jh cGggdHJhdmVyc2FsKS4gU2VlIHRoZSBleGNlbGxlbnQgcG9zdA0KPGEgaHJlZj0iaHR0cHM6Ly8x MTAxMTExMC5naXRodWIuaW8vYmxvZy8yMDEzLzEyLzE3L3N0YWNrLWJhc2VkLWdyYXBoLXRyYXZl cnNhbC5odG1sIj4NClN0YWNrLWJhc2VkIERGUyBpcyB0cmlja3kgdG8gZ2V0IHJpZ2h0PC9hPiBm b3IgYW4gZXhwbGFuYXRpb24uIDwvcD4NCjxwPk5vdGU6IFdlIGhhdmUgZGVwcmVjYXRlZCB0aGUg c3VwcG9ydCBvZiBwYWNrYWdlIDxjb2RlPm9jYW1sZ3JhcGhfZ3RrPC9jb2RlPiwgYSB0b29sIHRv IGRpc3BsYXkgZ3JhcGhzIHVzaW5nIEdUSy4gSWYgeW91IGFyZSB1c2luZyB0aGlzIHBhY2thZ2Us IHBsZWFzZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JhY2t0cmFja2luZy9vY2FtbGdy YXBoL2lzc3VlcyI+bWFrZSBhbiBpc3N1ZTwvYT4gYW5kIHdl4oCZbGwgZGlzY3VzcyB0aGUgb3B0 aW9ucy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5MaXF1aWQgTUwgLSBBIHRl bXBsYXRpbmcgbGFuZ3VhZ2UgdXNlZCBieSBTaG9waWZ5LCBHaXRodWIgUGFnZXMgYW5kIG1vcmUh PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbGlxdWlkLW1sLWEt dGVtcGxhdGluZy1sYW5ndWFnZS11c2VkLWJ5LXNob3BpZnktZ2l0aHViLXBhZ2VzLWFuZC1tb3Jl LzEyOTQwLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1saXF1aWQtbWwtYS10 ZW1wbGF0aW5nLWxhbmd1YWdlLXVzZWQtYnktc2hvcGlmeS1naXRodWItcGFnZXMtYW5kLW1vcmUv MTI5NDAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn ODE4ZDI2NSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzgxOGQyNjUiPkJlbiBGYWVy YmVyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnODE4ZDI2NSI+DQo8cD5IZWxsbyBldmVyeW9uZSwgSSBhbSBleGNpdGVkIHRvIGFubm91bmNl IHRoZSByZWxlYXNlIG9mIG15IGZpcnN0IE9QQU0gcGFja2FnZSBsaXF1aWRfbWwuIFNob3BpZnni gJlzIExpcXVpZCBUZW1wbGF0aW5nIGxhbmd1YWdlIGZvciBPQ2FtbC4gQ2hlY2sgaXQgb3V0IGhl cmU6DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYmVuZmFlcmJlci9saXF1aWQtbWwiPmh0 dHBzOi8vZ2l0aHViLmNvbS9iZW5mYWVyYmVyL2xpcXVpZC1tbDwvYT4NCjwvcD4NCjxwPkxlYXJu IExpcXVpZCBzeW50YXggaGVyZTogPGEgaHJlZj0iaHR0cHM6Ly9zaG9waWZ5LmdpdGh1Yi5pby9s aXF1aWQvIj5odHRwczovL3Nob3BpZnkuZ2l0aHViLmlvL2xpcXVpZC88L2E+DQo8L3A+DQo8cD5U aGUgTGlxdWlkIHRlbXBsYXRpbmcgbGFuZ3VhZ2UgaXMgdXNlZCBhbGwgb3ZlciBpbmNsdWRpbmcg U2hvcGlmeSBhbmQgR2l0aHViIHBhZ2VzLiBUaGUgUnVzdCBwb3J0IG9mIHRoZSBsYW5ndWFnZSBp cyB2ZXJ5IHBvcHVsYXIgZm9yIHN0YXRpYyBzaXRlIGFuZCBkb2N1bWVudGF0aW9uIGdlbmVyYXRp b24uIElmIGFueW9uZSBoYXMgYW55IHN1Z2dlc3Rpb25zIG9yIHdhbnRzIHRvIGhlbHAgaW1wcm92 ZSB0aGUgcHJvamVjdCBJIHdlbGNvbWUgcHVsbA0KIHJlcXVlc3RzISA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iNSI+bW9vbnBvb2wgMC40PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tbW9vbnBvb2wtMC00LzEyOTQxLzEiPmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tbW9vbnBvb2wtMC00LzEyOTQxLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2M4MzczZmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmdjODM3M2ZjIj5TaW1vbiBDcnVhbmVzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzgzNzNmYyI+DQo8cD5Nb29ucG9vbCA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL21vb25wb29sL3JlbGVhc2VzL3RhZy92 MC40Ij4wLjQ8L2E+IHdhcyByZWxlYXNlZCBvbiBvcGFtIGEgZmV3IGRheXMgYWdvLg0KPC9wPg0K PHA+VGhlcmUgYXJlIG5vdCBhIGxvdCBvZiBuZXcgZmVhdHVyZXMsIGJ1dCBNb29ucG9vbCBpcyBu b3cgYSBiZXR0ZXIgY2l0aXplbiB3cnQgcmVzb3VyY2UgdXNhZ2U6IGlmIG5vIHBvb2wgaXMgYWN0 aXZlLCBiYWNrZ3JvdW5kIGRvbWFpbnMgd2lsbCBzaHV0IGRvd24gKHRvIGJlIHNwdW4gYmFjayBh Z2FpbiBsYXRlciBpZiB0aGV54oCZcmUgbmVlZGVkKS4gVGhpcyB3YXMgdHJpY2tpZXIgdG8gZ2V0 IHJpZ2h0IHRoYW4gSSBleHBlY3RlZCBhbmQgYSBsYXN0DQogYnVnIHdhcyBmb3VuZCA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjQzMDYiPmR1 cmluZyB0aGUgcmVsZWFzZSBwcm9jZXNzPC9hPiBhbmQgZml4ZWQgd2l0aCB0aGUgaGVscCBvZiBA YXZzbSwgQGRyYTI3IGFuZA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL210ZWx2ZXJzIj5N YXJrIFRlbHZlcnM8L2E+KS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk94aWRp emluZyBPQ2FtbCwgYW5kIGEgbmV3IG9wYW0gc3dpdGNoPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9veGlkaXppbmctb2NhbWwtYW5kLWEtbmV3LW9wYW0tc3dpdGNoLzEy OTQyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L294aWRpemluZy1vY2FtbC1hbmQt YS1uZXctb3BhbS1zd2l0Y2gvMTI5NDIvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdiZjI1ZTYzIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn YmYyNWU2MyI+WWFyb24gTWluc2t5IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnYmYyNWU2MyI+DQo8cD5XZSBqdXN0IHBvc3RlZCB0aGUgdGhy aWxsaW5nIGNvbmNsdXNpb24gdG8gb3VyIGJsb2cgdHJpbG9neSBvbiBPeGlkaXppbmcgT0NhbWws IHdoaWNoIHRhbGtzIGFib3V0IHNvbWUgb2YgdGhlIHRoaW5ncyB3ZeKAmXZlIGJlZW4gd29ya2lu ZyBvbiAoYW5kIHNvbWUgb2Ygb3VyIHNwYWNlLWFnZSBwbGFucykgYXJvdW5kIGV4dGVuZGluZyBP Q2FtbCB0byBzdXBwb3J0IHNvbWUgb2YgdGhlIHNhbWUga2luZHMgb2YgdGhpbmdzIHRoYXQgUnVz dCBsZXRzDQogeW91IGRvLCBidXQgaW4gYSBkaXN0aW5jdGx5IE9DYW1sLWlzaCB3YXkuIDwvcD4N CjxwPkhlcmUgYXJlIHRoZSBwb3N0czogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxh IGhyZWY9Imh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9veGlkaXppbmctb2NhbWwtbG9jYWxp dHkvIj5Mb2NhbGl0eTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmphbmVzdHJl ZXQuY29tL294aWRpemluZy1vY2FtbC1vd25lcnNoaXAvIj5SdXN0IFN0eWxlIE93bmVyc2hpcDwv YT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9veGlkaXpp bmctb2NhbWwtcGFyYWxsZWxpc20vIj5EYXRhIFJhY2UgRnJlZWRvbTwvYT4NCjwvbGk+PC91bD4N CjxwPk1heWJlIG1vcmUgZXhjaXRpbmdseSwgeW91IGNhbiBwbGF5IGFyb3VuZCB3aXRoIHRoZSB2 ZXJzaW9uIG9mIG91ciBpbnRlcm5hbCBjb21waWxlciB0aGF0IGhhcyB0aGUgYml0cyBvZiB0aGlz IHdl4oCZdmUgaW1wbGVtZW50ZWQgdGh1cyBmYXIgKG1vc3RseSwgdGhlIGxvY2FsL2dsb2JhbCBz dHVmZiwgYnV0IHRoZSBiZWdpbm5pbmdzIG9mIHVuaXF1ZW5lc3MgYXMgd2VsbCkgYXMgd2VsbCBh cyBvdXIgb3Blbi1zb3VyY2UgbGlicmFyaWVzLCB2aWENCiBhbiA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vamFuZXN0cmVldC9vcGFtLXJlcG9zaXRvcnkvdHJlZS93aXRoLWV4dGVuc2lvbnMi Pg0Kb3BhbSBzd2l0Y2g8L2E+LiA8L3A+DQo8cD5UaGlzIGlzIHZlcnkgbXVjaCBhIGJsZWVkaW5n LWVkZ2UsIHVuc3RhYmxlIHZlcnNpb24uIFdlIHVzZSBpdCBpbnRlcm5hbGx5IGZvciByZWFsIHdv cmssIGJ1dCB3ZSByZWZhY3RvciBpdCBtZXJjaWxlc3NseSwgYW5kIHRoZSBsYW5ndWFnZSBmZWF0 dXJlcyBhcmUgbW9zdCBkZWZpbml0ZWx5IG5vdCBzdGFibGUuIFdlIGhvcGUgb25lIGRheSB0byBw cm9wb3NlIGEgbG90IG9mIHRoaXMgdXBzdHJlYW0sIGJ1dCBmb3Igbm93LCBpdOKAmXMganVzdCBh DQogcHJldmlldyBvZiBzb21lIGludGVyZXN0aW5nIGV4cGVyaW1lbnRzLiA8L3A+DQo8cD5UaGUg dGhpbmcgSeKAmW0gbW9zdCBleGNpdGVkIGFib3V0IGFsbCBvZiB0aGlzIGlzIHRoZSBwcm9zcGVj dCBvZiBkYXRhLXJhY2UgZnJlZSBPQ2FtbC4gVGhlIGFiaWxpdHkgdG8gbGV2ZXJhZ2UgdGhlIGdy ZWF0IHdvcmsgZG9uZSBieSB0aGUgTXVsdGljb3JlIHRlYW0sIGJ1dCBzYWZlbHksIGlzIGEgcHJv c3BlY3QgSeKAmW0gdmVyeSBtdWNoIGxvb2tpbmcgZm9yd2FyZCB0by4NCjwvcD4NCjxwPkFsc28s IGEgYnVuY2ggb2YgSmFuZSBTdHJlZXQgY29tcGlsZXIgZm9sayB3aWxsIGJlIGF0IElDRlAgbmV4 dCB3ZWVrLiBJZiB5b3XigJlyZSBpbnRlcmVzdGVkIGluIGxlYXJuaW5nIG1vcmUsIHRoYXTigJlz IGEgZ29vZCB0aW1lIHRvIGdyYWIgb25lIG9mIHVzLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjciPk91dHJlYWNoeSBEZWNlbWJlciAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktZGVjZW1iZXItMjAyMy8xMjk0OS8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktZGVjZW1iZXItMjAyMy8xMjk0OS8xPC9h PiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzFkYzRiYzIiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxZGM0YmMyIj5QYXRyaWNrIEZlcnJpcyBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFkYzRi YzIiPg0KPHA+V2l0aCB0aGUgY29uY2x1c2lvbiBvZiB0aGUgcHJldmlvdXMgT3V0cmVhY2h5IHJv dW5kIChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2VuZC1vZi1pbnRl cm5zaGlwLWRlbW8tc2Vzc2lvbi8xMjkyNy8iPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2VuZC1vZi1pbnRlcm5zaGlwLWRlbW8tc2Vzc2lvbi8xMjkyNy88L2E+KSwgdGhlIG5leHQgcm91 bmQgaXMgZmFzdCBhcHByb2FjaGluZyBhbmQgdGhlIE9DYW1sIGNvbW11bml0eSBoYXMgc2lnbmVk IHVwIGFnYWluIHRvIHBhcnRpY2lwYXRlIQ0KPC9wPg0KPHA+VGhlIGRlYWRsaW5lIGZvciBtZW50 b3JzIHRvIDxhIGhyZWY9Imh0dHBzOi8vd3d3Lm91dHJlYWNoeS5vcmcvY29tbXVuaXRpZXMvY2Zw LyI+DQpzaWdudXA8L2E+IGlzIDxiPlNlcHRlbWJlciAyOSAyMDIzPC9iPi4gVGhlIE9DYW1sIGNv bW11bml0eSBoYXMgZGVjaWRlZCB0byB0cnkgYSBzbGlnaHRseSBkaWZmZXJlbnQgYXBwcm9hY2gg dGhhdCBoYXMgd29ya2VkIHZlcnkgd2VsbCBpbiB0aGUgcHJldmlvdXMgcm91bmQuIFdlIG5vdGlj ZWQgcXVpdGUgYSBmZXcgcGVvcGxlIHdvdWxkIGxpa2UgdG8gYmUgaW52b2x2ZWQgaW4gYW4gaW50 ZXJuc2hpcCBidXQgd2l0aG91dCB3b3JyeWluZyB0b28gbXVjaA0KIGFib3V0IHRoZSBkZXRhaWxz IG9mIE91dHJlYWNoeSBpdHNlbGYuIElmIHBlb3BsZSBhcmUgc2ltcGx5IGludGVyZXN0ZWQgaW4g bWVudG9yaW5nIGFuZCB0aGV5IG1haW50YWluIGFuIG9wZW4tc291cmNlIHByb2plY3QsIHRoZW4g dGhleSBjYW4gcmVhY2ggb3V0IGRpcmVjdGx5IHRvIEBwaXRhZyBvciBteXNlbGYgYW5kIHdlIGNh biBoZWxwIHNjb3BlIGEgcHJvamVjdCwgZXhwbGFpbiB0aGUgY29udHJpYnV0aW9uIHBlcmlvZCBh bmQgcHJvdmlkZQ0KIGFzIG11Y2ggb3RoZXIgaGVscCBhcyB3ZSBjYW4hIDwvcD4NCjxwPldoZW4g c2lnbmluZyB1cCBtZW50b3JzIHByb3Bvc2UgYW4gb3Blbi1zb3VyY2UgcHJvamVjdCB3aGVyZSBw cm9zcGVjdGl2ZSBpbnRlcm5zIHN1Ym1pdCBQUnMgZHVyaW5nIHRoZSDigJxjb250cmlidXRpb24g cGhhc2Vz4oCdIGFzIHBhcnQgb2YgdGhlaXIgYXBwbGljYXRpb24uIE1lbnRvcnMgd2lsbCB0aGVu IGNob29zZSBhbiBpbnRlcm4gdG8gd29yayB3aXRoIGZvciAzIG1vbnRocy4gQSBtb3JlIGRldGFp bGVkIGV4cGxhbmF0aW9uIGlzIGF2YWlsYWJsZQ0KPGEgaHJlZj0iaHR0cHM6Ly93d3cub3V0cmVh Y2h5Lm9yZy9tZW50b3IvI21lbnRvciI+b24gdGhlIE91dHJlYWNoeSBtZW50b3Igc2VjdGlvbjwv YT4uDQo8L3A+DQo8cD5GaW5hbGx5LCA8YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tIj5UYXJp ZGVzPC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1zZi5vcmciPg0KT0NhbWwgU29mdHdh cmUgRm91bmRhdGlvbjwvYT4gaGF2ZSBiZWVuIHZlcnkgZ2VuZXJvdXMgc28gZmFyIGZ1bmRpbmcg b3VyIGVmZm9ydHMgb24gdGhlIGludGVybiBzaWRlLiBTaW5jZSB0aGUgcHJldmlvdXMgcm91bmQs IEphbmUgU3RyZWV0IGFuZCBUYXJpZGVzIGhhdmUgZ29uZSBhIHN0ZXAgZnVydGhlciBhbmQgaGF2 ZSBhbHNvIHByb3ZpZGVkIGZ1bmRpbmcgZm9yIHRoZSBtZW50b3Igc2lkZSEgTWVudG9yaW5nIGRv ZXMgdGFrZSB0aW1lLCBidXQNCiB5b3UgZ2V0IGEgbG90IGJhY2sgZnJvbSBpdCBvbiBkaWZmZXJl bnQgbGV2ZWxzIGFuZCBob3BlZnVsbHkgdGhpcyBmaW5hbmNpYWwgaGVscCBjYW4gbG93ZXIgdGhl IGJhcnJpZXJzIHRvIGJlaW5nIGEgbWVudG9yLg0KPC9wPg0KPHA+QXMgYWx3YXlzIGlmIHlvdSBo YXZlIGFueSBnZW5lcmFsIHF1ZXN0aW9ucyBvciBtZW50b3JpbmcgaWRlYXMgZG8gY29tbWVudCBv biB0aGlzIHRocmVhZCBvciByZWFjaCBvdXQgdG8gdXMgZGlyZWN0bHkuDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iOCI+TmV3IHJlbGVhc2Ugb2YgUFByaW50ICgyMDIzODMwKTwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxlYXNlLW9mLXBw cmludC0yMDIzODMwLzEyOTU0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1u ZXctcmVsZWFzZS1vZi1wcHJpbnQtMjAyMzgzMC8xMjk1NC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2EyOWRkMjUiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmdhMjlkZDI1Ij5GcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2EyOWRkMjUiPg0KPHA+SXQgaXMg bXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBvZiBQUHJpbnQsIHRoZSBwcmV0 dHktcHJpbnRpbmcgbGlicmFyeSwgd2l0aCB0aGUgZm9sbG93aW5nIGFkZGl0aW9uczoNCjwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGUgbmV3IGZ1bmN0aW9uIDxjb2RlPmlzX2VtcHR5 PC9jb2RlPiBhbGxvd3MgdGVzdGluZyAoaW4gY29uc3RhbnQgdGltZSkgd2hldGhlciBhIGRvY3Vt ZW50IGlzIGVtcHR5Lg0KPC9saT48bGk+RG9jdW1lbnRhdGlvbjogYWRkIGEgd2FybmluZyBhYm91 dCB0aGUgdGltZSBhbmQgc3BhY2UgY29tcGxleGl0eSBvZiBhIG5haXZlIHVzZSBvZg0KPGNvZGU+ aWZmbGF0PC9jb2RlPi4gPC9saT48L3VsPg0KPHA+VGhlIGxpYnJhcnkgbm93IHJlcXVpcmVzIE9D YW1sIDQuMDMgb3IgbmV3ZXIuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzY2ZGY5YjgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSJvcmc2NmRmOWI4Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC1vcmc2NmRmOWI4Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91 IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNl bmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0K dGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+ SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1h eSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1s LW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1l IiBpZD0ib3JnM2E2NzYzOCI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 29 Aug 2023 14:05:13 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 29 Aug 2023 14:05:13 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 29 Aug 2023 14:05:13 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37TD4fxs008528 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 29 Aug 2023 14:04:41 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37TD4R2g008514 for ; Tue, 29 Aug 2023 14:04:28 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Aug 2023 15:04:25 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 68C2FE0CD4; Tue, 29 Aug 2023 15:04:25 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 4719BE0AF1 for ; Tue, 29 Aug 2023 15:04:13 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Aug 2023 15:04:10 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EF8665646EA; Tue, 29 Aug 2023 15:04:07 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ2nlyio4pCSc20EK9Muu+A8d29A== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 29 Aug 2023 14:04:07 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: f894b01c-4b09-4742-fdb4-08dba89094f6 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.02,210,1688421600"; d="scan'208,217";a="64534254" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499990, queueID=548165646EC x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOC0yOSBUdWUgMTU6MDEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDguMjIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOS4wNS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEF1Z3VzdCAyMiB0byAyOSwgMjAyMy4gPC9w Pg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxl IG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9 ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5Ib3cgc3VpdGFibGUgaXMgT0NhbWwg Zm9yIGZ1bGwgc3RhY2sgd2ViIGRldmVsb3BtZW50PzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIi PkNhcXRpIDIuMC4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+THd0LjUuNy4wPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNCI+UmVsZWFzZSBvZiBvY2FtbC1zZi9sZWFybi1vY2FtbDowLjE1LjA8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5GaXJzdCByZWxlYXNlIG9mIG9wYW0tY2hlY2stbnBt LWRlcHMgcGx1Z2luIDEuMC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+RGVwbG95IGRyZWFt IG9uIHJhaWx3YXkuYXBwIHZpYSB0ZW1wbGF0ZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPkRv YyBSZXZpZXc6IFVwZGF0aW5nIFMtRXhwcmVzc2lvbnMgVHV0b3JpYWw8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM4Ij5OZXcgcHJvamVjdCwgb2xkIHRlY2huaXF1ZTogRGtTREsgRkZJIE9DYW1sPC9h PiA8L2xpPjxsaT48YSBocmVmPSIjOSI+UHJhY3RpY2FsIE9DYW1sPC9hPiA8L2xpPjxsaT48YSBo cmVmPSIjMTAiPlN0YXRpYyBhbmFseXNpcyBpbiBGbGFtYmRhIDIgLSBUYWxrcyBhdCB0aGUgQ2Ft Yml1bSBTZW1pbmFyPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzExIj5Eb2MgUmV2aWV3OiBJbnN0 YWxsIE9DYW1sIGFuZCBHZXR0aW5nIFN0YXJ0ZWQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMiI+ T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZ2JkMjY4MjgiPk9sZCBD V048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+SG93IHN1aXRhYmxlIGlzIE9D YW1sIGZvciBmdWxsIHN0YWNrIHdlYiBkZXZlbG9wbWVudD88L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2hvdy1zdWl0YWJsZS1pcy1vY2FtbC1mb3ItZnVsbC1zdGFjay13 ZWItZGV2ZWxvcG1lbnQvMTI4NzkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaG93 LXN1aXRhYmxlLWlzLW9jYW1sLWZvci1mdWxsLXN0YWNrLXdlYi1kZXZlbG9wbWVudC8xMjg3OS8x PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlMzY2YzQz IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZTM2NmM0MyI+YmVtZW1vbCBhc2tlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTM2NmM0MyI+DQo8 cD5J4oCZbSBsb29raW5nIGludG8gZ2V0dGluZyBtb3JlIGludG8gYSBmdWxsIHN0YWNrIHdlYiBk ZXZlbG9wbWVudC4gSSBkbyBsb3RzIGFuZCBsb3RzIG9mIGJhY2tlbmQgc2VydmljZXMgYnV0IEkg cmVhbGx5IHdvdWxkIGxpa2UgdG8gY3Jvc3MgdGhlIHJlZ2lvbiB0byB0aGUgZnJvbnRlbmQgYXMg d2VsbCBhbmQgSSB3b3VsZCBsaWtlIHRvIGF2b2lkIGFzIG11Y2ggSlMgYXMgcG9zc2libGUuIEh0 bXggY2F1Z2h0IG15IGF0dGVudGlvbiBidXQgSSBzdGlsbA0KIG5lZWQgc29tZSBmcm9udGVuZCBj b2RlIGZvciBtb3JlIGR5bmFtaWMgcGFydHMgb2YgbXkgd2ViYXBwLiBUaGlzIGNhbiBiZSBwdXJl IEpTIG9yIHdhc20uIEhvdyBkb2VzIE9DYW1sIHBlcmZvcm0gYXQgdGhpcyBraW5kIG9mIHNpdHVh dGlvbj8gTXkgaWRlYWwgc2NlbmFyaW8gd291bGQgYmUgc29tZXRoaW5nIGxpa2UgT0NhbWwgJiM0 MzsgSHRteCBmb3IgbW9zdCBwYWdlcyBhbmQgYXQgc29tZSBwYWdlcyBzb21lIGtpbmQgb2YgY29t cGlsYXRpb24gdG8NCiBKUyBvciB3YXNtIGZvciB0aGUgZHluYW1pYyBwYXJ0cy4gPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZmMzY0MmMiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmZjM2NDJjIj5ZYXdhciBBbWluIHJlcGxpZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2ZmMzY0MmMiPg0KPHA+ SSByZWNvbW1lbmQgY2hlY2tpbmcgb3V0IG15IGxpYnJhcnkgdG8gd3JpdGUgSFRNIGVzcGVjaWFs bHkgYXMgaXQgc2hpcHMgd2l0aCB0aGUgaHRteCBhdHRyaWJ1dGVzIG91dCBvZiB0aGUgYm94Og0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhd2FyYW1pbi9kcmVhbS1odG1sIj5odHRwczov L2dpdGh1Yi5jb20veWF3YXJhbWluL2RyZWFtLWh0bWw8L2E+DQo8L3A+DQo8cD5JZiB5b3Ugd2Fu dCB0byBjb21waWxlIHRvIEpTLCB0aGVyZSBhcmUgYSBjb3VwbGUgb2Ygb3B0aW9ucy4gVGhlIGZp cnN0IGFuZCBzaW1wbGVzdCBvbmUgeW91IHNob3VsZCBwcm9iYWJseSBsb29rIGF0IGlzIFJlU2Ny aXB0LiBJdOKAmXMgYW4gT0NhbWwgZGVyaXZhdGl2ZSB0aGF0IGhhcyBiZWVuIG1vZGlmaWVkIHRv IGxvb2sgbW9yZSBsaWtlIFR5cGVTY3JpcHQgd2hpbGUga2VlcGluZyB0aGUgY29tcGlsZSBzcGVl ZCBhbmQgdHlwZSBzYWZldHkNCiBvZiBPQ2FtbC4gVGhlcmUgYXJlIGEgY291cGxlIG9mIG90aGVy IG9wdGlvbnMgYnV0IEnigJlsbCBsZXQgb3RoZXJzIGdpdmUgZGV0YWlscyBhYm91dCB0aG9zZS4N CjwvcD4NCjxwPkxhc3RseSwgZm9yIHNsaWdodGx5IG1vcmUgY2xpZW50LXNpZGUgaW50ZXJhY3Rp b24gdGhhbiB3aGF0IGh0bXggZG9lcywgY2hlY2sgb3V0IEFscGluZUpTLCB3aGljaCBpcyBhIGxp YnJhcnkgd2hpY2ggdXNlcyBhdHRyaWJ1dGVzIHNpbWlsYXIgdG8gaHRteCBidXQgaXMgZnJvbnRl bmQgb25seS4gSXQgY2FuIHByb2JhYmx5IGdpdmUgeW91IGEgbG90IG1vcmUgZnVuY3Rpb25hbGl0 eSB3aXRoIHZlcnkgbGl0dGxlIGN1c3RvbS13cml0dGVuIEpTLg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE4NDNlODMiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmcxODQzZTgzIj5EYW5pZWwgQsO8bnpsaSB0aGVuIHNhaWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE4NDNlODMiPg0KPGJsb2Nr cXVvdGU+DQo8cD5UaGUgZmlyc3QgYW5kIHNpbXBsZXN0IG9uZSB5b3Ugc2hvdWxkIHByb2JhYmx5 IGxvb2sgYXQgaXMgUmVTY3JpcHQuIDwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPldlbGwgaWYgeW91 IHdhbnQgdG8gZG8gZnVsbCBzdGFjayBkZXZlbG9wbWVudCBpbiBPQ2FtbCB5b3UgcHJvYmFibHkg ZG9u4oCZdCB3YW50IHRvIGFkZCB5ZXQNCjxpPmFub3RoZXI8L2k+IGxhbmd1YWdlLiBTbyB0aGUg 4oCcZmlyc3QgYW5kIHNpbXBsZXN04oCdIHdvdWxkIHJhdGhlciBiZSB0byB1c2U6IDxhIGhyZWY9 Imh0dHA6Ly9vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC9sYXRlc3QvbWFudWFsL292ZXJ2aWV3Ij4N CmpzX29mX29jYW1sPC9hPiB3aGljaCBpcyBhIHZlcnkgc3RhYmxlIGFuZCBmdW5kZWQgT0NhbWwg dG8gSmF2YVNjcmlwdCBjb21waWxlciBjbG9zZWx5IGZvbGxvd2luZyB0aGUgbGF0ZXN0IGNvbXBp bGVyIGRldmVsb3BtZW50cy4NCjwvcD4NCjxwPkhvd2V2ZXIgaWYgeW91IGRvbuKAmXQgd2FudCB0 byBsb3NlIHlvdXIgdGltZSBJ4oCZZCBwZXJzb25hbGx5IGFkdmlzZSB0byBzdGVlciBhd2F5IGZy b20ganNfb2Zfb2NhbWwgRkZJIGFuZCBicm93c2VyIEFQSXMgYW5kIHVzZQ0KPGEgaHJlZj0iaHR0 cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyIj48Y29kZT5icnI8L2NvZGU+PC9hPiBpbnN0 ZWFkIHdoaWNoIGlzIGFuIG9yZGVyIG9mIG1hZ25pdHVkZSBtb3JlIGVyZ29ub21pYyBhbmQgZG9j dW1lbnRlZC4gQnV0IEnigJltIGJpYXNlZC4NCjwvcD4NCjxwPkFsc28gaWYgeW91IHdhbnQgdG8g Z2V0IGFuIGlkZWEgb24gaG93IHRoYXQgY291bGQgbG9vayBsaWtlIHlvdSBjYW4gaGF2ZSBhIGxv b2sNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS9oeXBlcmJpYiI+aGVyZTwv YT4gKHRob3VnaCBJ4oCZbSBub3QgaGFwcHkgd2l0aCBhbGwgdGhlIHdheSB0aGUgY29kZSBsb29r cyBsaWtlIHRoZXJlIDotKS4gVGhpcyBpcyBhIGZ1bGx5IHdvcmtpbmcgYW5kIGFjdGl2ZWx5IHVz ZWQgYXBwbGljYXRpb24gdGhhdCBjbG9zZWx5IG1hdGNoZXMgdGhlIGRlc2NyaXB0aW9uIG9mIHdo YXQgeW91IGFyZSBhZnRlci4gSXTigJlzIGEgYmFzaWMgQ1JVRA0KIGFwcCBub3QgdXNpbmcgPGNv ZGU+aHRteDwvY29kZT4gYnV0IGEgPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdh cmUvaHRtbGFjdCI+DQpkZXJpdmF0aXZlPC9hPiB0aGF0IHRyaWVzIHRvIGFkZHJlc3Mgc29tZSBv ZiBpdHMgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2h0bXgtaHRtbGFjdC13 ZWItZGV2ZWxvcG1lbnQtYXBwcm9hY2gvOTk5My84P3U9ZGJ1ZW56bGkiPg0Kc2hvcnRjb21pbmdz PC9hPiwgYWxvbmcgd2l0aCBhIGxpdHRsZSB0aW55IGJpdCBvZiBjdXN0b20gZnJvbnQgZW5kIGNv ZGUuIFRob3VnaCB0aGV5IHdpbGwgZXZlbnR1YWxseSBiZSwgbm90IGV2ZXJ5IGxpYnJhcnkgSeKA mW0gdXNpbmcgdGhlcmUgaXMgZm9ybWFsbHkgZGlzdHJpYnV0ZWQgeWV0LCBzbyB5b3UgbWF5IGhh dmUgdG8gdXNlIG90aGVyIGNvbXBvbmVudHMgYnV0IGl0IGNhbiBnaXZlIHlvdSBhbiBpZGVhLg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VjZmJl MzEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlY2ZiZTMxIj5WaW5jZW50IEJhbGF0 IGFsc28gcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnZWNmYmUzMSI+DQo8cD5UaGUgT2NzaWdlbiBwcm9qZWN0IHByb3ZpZGVzIGEgZnVsbCBzZXQg b2YgdG9vbHMgZm9yIGZ1bGwgc3RhY2sgV2ViIGRldmVsb3BtZW50LCBhbW9uZyB3aGljaDoNCjwv cD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL29jc2lnZW4ub3Jn L2pzX29mX29jYW1sIj5Kc19vZl9vY2FtbDwvYT4sIGEgY29tcGlsZXIgZnJvbSBPQ2FtbCB0byBK Uw0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY3NpZ2VuLm9yZy9lbGlvbSI+RWxpb208L2E+ LCBhIDEwMCUgZnVsbCBzdGFjayBXZWIgZnJhbWV3b3JrICh0cmFkaXRpb25hbCBXZWIgcHJvZ3Jh bW1pbmcgJiM0MzsgaW50ZWdyYXRlZCBjbGllbnQvc2VydmVyIHByb2dyYW1taW5nLCBnZW5lcmF0 aW9uIG9mIHBhZ2VzIGVpdGhlciBvbiBzZXJ2ZXIgb3IgY2xpZW50LCBtb2JpbGUgYXBwcyBmb3Ig QW5kcm9pZCBhbmQgaU9TKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY3NpZ2VuLm9yZy9v Y3NpZ2VuLXRvb2xraXQiPk9jc2lnZW4gVG9vbGtpdDwvYT4sIGEgc2V0IG9mIGNsaWVudC1zZXJ2 ZXIgd2lkZ2V0cyBmb3IgV2ViIGFuZCBtb2JpbGUgYXBwbGljYXRpb25zDQo8L2xpPjwvdWw+DQo8 cD5UaGUgcHJvamVjdCBpcyBtYXR1cmUgYW5kIHVzZWQgYnkgcmVhbCB3b3JsZCBhcHBsaWNhdGlv bnMgKGVzcGVjaWFsbHkgPGEgaHJlZj0iaHR0cHM6Ly9iZXNwb3J0LmNvbS9uZXdzIj4NCkJlIFNw b3J0PC9hPikuIDwvcD4NCjxwPllvdSBjYW4gZmluZCB0aGUgbWFpbiBkb2N1bWVudGF0aW9uIDxh IGhyZWY9Imh0dHBzOi8vb2NzaWdlbi5vcmcvdHV0by9sYXRlc3QvbWFudWFsL2Jhc2ljcyI+DQpo ZXJlPC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnYTRiZDc4OSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2E0YmQ3ODkiPlhhdmll ciBWYW4gZGUgV29lc3R5bmUgYWxzbyByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmdhNGJkNzg5Ij4NCjxwPkFuZCwgYSBsaXR0bGUgc2hhbWVsZXNz IHBsdWcsIHdlIGFyZSBjdXJyZW50bHkgZGV2ZWxvcGluZyBhIG1pbmltYWxpc3Qgc29sdXRpb24g KGJhc2VkIG9uIHNldmVyYWwgcHJvdmVuIGJ1aWxkaW5nIGJsb2NrcyBmcm9tIHRoZSBPQ2FtbCBj b21tdW5pdHkpIGZvciBidWlsZGluZyB3ZWIgYXBwbGljYXRpb25zIHdpdGggT0NhbWwsIGVhc2ls eToNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vZnVua3l3b3JrL25pZ2h0bWFyZSI+aHR0cHM6Ly9naXRodWIuY29tL2Z1bmt5d29yay9u aWdodG1hcmU8L2E+IHdoaWNoIGNvdmVycyB0aGUgYmFja2VuZCAoY3VycmVudGx5LCBhYm92ZSBE cmVhbSkgYW5kIHRoZSBmcm9udGVuZCAoYWJvdmUgSnNfb2Zfb2NhbWwgYW5kIGFuIG92ZXJsYXkg dG8gT0NhbWwtdmRvbSBhbmQgVHl4bWwpIHdoaWNoIGFsbG93cyB5b3UgdG8gcXVpY2tseSBjcmVh dGUNCiBBUElzIGFuZCBjbGllbnRzICh3ZSBhcmUgY3VycmVudGx5IHdvcmtpbmcgb24gdGhlIGFi c3RyYWN0aW9uIG9mIGZvcm1zKSA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v ZnVua3l3b3JrL3lvdXJib25lcyI+aHR0cHM6Ly9naXRodWIuY29tL2Z1bmt5d29yay95b3VyYm9u ZXM8L2E+IEV2ZW4gaWYgaXTigJlzIG5vdCBlbnRpcmVseSByZWxhdGVkIHRvIHdlYiBkZXZlbG9w bWVudCwgYmxvY2tjaGFpbnMgY2FuIGFjdCBhcyBhIDR0aCB0aWVyLCBhbmQgdGhpcyBsaWJyYXJ5 IChXSVApIHdvcmtzIHdlbGwgd2l0aCBOaWdodG1hcmUgdG8gaW50ZXJhY3Qgd2l0aCBUZXpvcw0K ICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZnVua3l3b3JrL3Rlem9zLWRhcHBzLWV4YW1w bGVzIj5leGFtcGxlPC9hPikuIDwvbGk+PC91bD4NCjxwPkxhc3QgeWVhciwgd2UgZGV2ZWxvcGVk IGEgZm9ydW0gaW4gT0NhbWw6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS94dncvbXVob2th bWEiPg0KaHR0cHM6Ly9naXRodWIuY29tL3h2dy9tdWhva2FtYTwvYT4gTGFzdCB5ZWFyLCB3ZSBk ZXZlbG9wZWQgYSBmb3J1bSBpbiBPQ2FtbDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3h2 dy9tdWhva2FtYSI+DQpodHRwczovL2dpdGh1Yi5jb20veHZ3L211aG9rYW1hPC9hPiB3aGljaCBw cm92ZXMgdGhhdCBPQ2FtbCBpcyBwZXJmZWN0bHkgc3VpdGVkIHRvIHdlYiBkZXZlbG9wbWVudCwg YW5kIHRoZSBwcm9wb3NhbHMgbWFkZSBieSBteSBwcmVkZWNlc3NvcnMgc2hvdyB0aGF0IGluIGFk ZGl0aW9uIHRvIGJlaW5nIHN1aXRlZCwgT0NhbWwgaXMNCjxiPmVmZmVjdGl2ZTwvYj4gKEkga25v dyBvZiBmZXcgZnJhbWV3b3JrcyBhcyBhbWJpdGlvdXMgYXMgT2NzaWdlbiBmb3IgZXhhbXBsZSwg d2hpY2ggYXQgdGhlIHRpbWUgYW5kIHN0aWxsIHRvZGF5IGlzIHBhcnRpY3VsYXJseSByZXZvbHV0 aW9uYXJ5KS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdiY2Q3OWM0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmNkNzljNCI+cHNi IGFsc28gcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnYmNkNzljNCI+DQo8cD5IYXZlIGEgbG9vayBhdCBSZWFzb24sIFJlYXNvblJlYWN0IGFuZCBN ZWxhbmdlOiA8YSBocmVmPSJodHRwczovL3JlYXNvbm1sLmdpdGh1Yi5pby9yZWFzb24tcmVhY3Qv YmxvZy8yMDIzLzA2LzExL3JlYm9ybiI+DQpodHRwczovL3JlYXNvbm1sLmdpdGh1Yi5pby9yZWFz b24tcmVhY3QvYmxvZy8yMDIzLzA2LzExL3JlYm9ybjwvYT4gPC9wPg0KPHA+QWhyZWZzIGlzIGJ1 aWx0IHdpdGggTWVsYW5nZTogPGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL2FocmVmcy9haHJl ZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS1iMTRmNWVjNTZkZjQiPg0KaHR0cHM6Ly9tZWRp dW0uY29tL2FocmVmcy9haHJlZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS1iMTRmNWVjNTZk ZjQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5DYXF0aSAyLjAuMTwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNhcXRpLTItMC0xLzEyODg1 LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2FxdGktMi0wLTEvMTI4ODUvMTwv YT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnM2QxYzY4MCIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzNkMWM2ODAiPlBldHRlciBBLiBVcmtlZGFs IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn M2QxYzY4MCI+DQo8cD5JIGFtIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wYXVya2VkYWwvb2NhbWwtY2FxdGkvIj4NCkNhcXRpPC9h PiAyLjAuMS4gQ2FxdGkgaXMgYW4gYWJzdHJhY3Rpb24gb3ZlciBtdWx0aXBsZSBkYXRhYmFzZSBj bGllbnQgbGlicmFyaWVzLCBwcm92aWRpbmcgYSB1bmlmaWVkIGFwcHJvYWNoIHRvIHBhc3Npbmcg cGFyYW1ldGVycyBhbmQgZGVjb2RpbmcgcmVzdWx0IHJvd3MsIGJ1dCBvdGhlcndpc2UgbW9yZSBs b3cgbGV2ZWwgdGhhbiBvYmplY3QtcmVsYXRpb25hbCBtYXBwZXJzIGxpa2UNCjxhIGhyZWY9Imh0 dHBzOi8vd3d3LnNxbGFsY2hlbXkub3JnLyI+U1FMQWNoZW15PC9hPi4gPC9wPg0KPHA+VGhpcyBp cyB0aGUgZmlyc3QgT1BBTSByZWxlYXNlIGluIHRoZSAyLjAgc2VyaWVzLiBJdCBpbmNsdWRlcyBl eHBlcmltZW50YWwgRUlPIGFuZCBNaXJhZ2VPUyBzdXBwb3J0LiBUaGUgbGF0dGVyIGRlcGVuZHMg b24gdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXJlbmFkb3Rpby9wZ3giPlBHWDwv YT4gcHVyZS1PQ2FtbCBQb3N0Z3JlU1FMIGxpYnJhcnksIGFuZCB3b3JrIGZvciB1cGNvbWluZyBt aW5vciByZWxlYXNlcyBsaWtlIFRMUyBzdXBwb3J0IHNob3VsZCBtYWtlIGl0IGZlYXNpYmxlIGZv ciBwcm9kdWN0aW9uIHVzZS4gT3RoZXIgY2hhbmdlcyB0byBub3RlIGlzIHRoZSBhZGRpdGlvbiBv Zg0KPGNvZGU+cHJpbnRmPC9jb2RlPi1zdHlsZSBxdWVyeS1zdHJpbmcgY29uc3RydWN0aW9uIGNv bnRyaWJ1dGVkIGJ5IEJhc2lsZSBDbMOpbWVudCwgYW5kIGJldHRlciByZWNvcmQgYW5kIHR1cGxl IGhhbmRsaW5nLiBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGluIHRoZQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BhdXJrZWRhbC9vY2FtbC1jYXF0aS9yZWxlYXNl cy90YWcvdjIuMC4wIj5yZWxlYXNlIG5vdGVzIGZvciBDYXF0aSAyLjAuMDwvYT4uDQo8L3A+DQo8 cD5JIHdvdWxkIGxpa2UgdG8gdGhhbmsgdGhlIE9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb24gZm9y IHRoZSBlY29ub21pYyBzdXBwb3J0LCBhbmQgZXZlcnlvbmUgd2hvIGhhdmUgY29udHJpYnV0ZWQg d2l0aCBjb2RlIG9yIGRvY3VtZW50YXRpb24sIG9yIGhlbHBlZCBpZGVudGlmeSBpc3N1ZXMuDQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0z IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+THd0LjUuNy4wPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbHd0LTUtNy0wLzEyODkwLzEiPmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbHd0LTUtNy0wLzEyODkwLzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2E3M2RjMjYiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdhNzNkYzI2Ij5SYXBoYcOrbCBQcm91c3QgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhNzNkYzI2Ij4NCjxwPkl0 IGlzIGEgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgTHd0IHZlcnNpb24gNS43 LjAuIFRoaXMgcmVsZWFzZSBmaXhlcyBzb21lIGNvbXBhdGliaWxpdHkgaXNzdWVzIHdpdGggT0Nh bWwgNSwgcmVtb3ZlcyBzb21lIGRlcHJlY2F0ZWQgZnVuY3Rpb25zLCBhbmQgb2ZmZXJzIG5ldyBm ZWF0dXJlcyB0byBpbXByb3ZlIGV4Y2VwdGlvbiBtYW5hZ2VtZW50IGluIGRvd25zdHJlYW0gdXNl ciBjb2RlLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0 L3JlbGVhc2VzL3RhZy81LjcuMCI+aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3JlbGVh c2VzL3RhZy81LjcuMDwvYT4NCjwvcD4NCjxwPlRoYW5rIHlvdSB0byBhbGwgdGhlIGNvbnRyaWJ1 dG9ycyB3aG8gcGFydGljaXBhdGUgaW4gdGhlIGRldmVsb3BtZW50IG9mIEx3dC4gPC9wPg0KPHA+ Q2hlY2sgb3V0IHRoZSByZWxlYXNlIHBhZ2UgZm9yIGEgZnVsbCBsaXN0IG9mIGNoYW5nZXMsIGlu Y2x1ZGluZyBicmVha2luZyBBUEkgY2hhbmdlcy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSI0Ij5SZWxlYXNlIG9mIG9jYW1sLXNmL2xlYXJuLW9jYW1sOjAuMTUuMDwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Utb2Ytb2NhbWwtc2YtbGVh cm4tb2NhbWwtMC0xNS0wLzEyODkyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1yZWxlYXNlLW9mLW9jYW1sLXNmLWxlYXJuLW9jYW1sLTAtMTUtMC8xMjg5Mi8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhMmNkMTc2IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYTJjZDE3NiI+RXJpayBNYXJ0aW4tRG9yZWwgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhMmNkMTc2 Ij4NCjxwPldlIGFyZSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBsYXRlc3Qgc3RhYmxlIHJlbGVh c2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXNmL2xlYXJuLW9jYW1sIj4N CkxlYXJuLU9DYW1sIDwvYT4sIHZlcnNpb24gPGNvZGU+MC4xNS4wPC9jb2RlPi4gPC9wPg0KPHA+ TWFueSB0aGFua3MgdG8gYWxsIHVzZXJzIHdobyBjb250cmlidXRlZCBidWdzIHJlcG9ydHMsIGZp eGVzLCBhbmQgZW5oYW5jZW1lbnRzIQ0KPC9wPg0KPHA+QSBjb21wcmVoZW5zaXZlIGxpc3Qgb2Yg dGhlIGZpeGVzIGFuZCBlbmhhbmNlbWVudHMgb2ZmZXJlZCBieSB0aGlzIHJlbGVhc2UgaXMgYXZh aWxhYmxlIGluDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2Nh bWwvcmVsZWFzZXMvdGFnL3YwLjE1LjAiPnRoZSBSZWxlYXNlIE5vdGVzPC9hPiB3aXRoIGFsc28g Z2F0aGVycyBzdGF0aWMgYmluYXJpZXMgZm9yIExpbnV4IGFuZCBtYWNPUywgdGhlIGNvcnJlc3Bv bmRpbmcNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkv cHVsbC8yNDMwNSI+b3BhbS1yZXBvc2l0b3J5IHB1bGwgcmVxdWVzdDwvYT4gaXMgcGVuZGluZywg YW5kIHRoZSBEb2NrZXIgaW1hZ2VzIG9mDQo8YSBocmVmPSJodHRwczovL2h1Yi5kb2NrZXIuY29t L3Ivb2NhbWxzZi9sZWFybi1vY2FtbC90YWdzIj5sZWFybi1vY2FtbDwvYT4gYW5kIDxhIGhyZWY9 Imh0dHBzOi8vaHViLmRvY2tlci5jb20vci9vY2FtbHNmL2xlYXJuLW9jYW1sLWNsaWVudC90YWdz Ij4NCmxlYXJuLW9jYW1sLWNsaWVudDwvYT4gYXJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSBvbiBE b2NrZXIgaHViIDwvcD4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWFpbnRhaW4gYSA8Y29kZT5sZWFy bi1vY2FtbDwvY29kZT4gc2VydmVyLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UgdXBk YXRlIHlvdXIgdmVyc2lvbiB0bw0KPGNvZGU+MC4xNS4wPC9jb2RlPiB0byBiZW5lZml0IGZyb20g aW1wb3J0YW50IGZpeGVzIChpbmNsdWRpbmcgYSBwYXRoIHRyYXZlcnNhbCB2dWxuZXJhYmlsaXR5 IGZpeCksIGFzIHdlbGwgYXMgbmV3ZXN0IGZlYXR1cmVzLg0KPC9wPg0KPHA+Jmd0O0Zyb20gYSB0 ZWFjaGVyIHBvaW50LW9mLXZpZXcsIHRoaXMgcmVsZWFzZSBpbXByb3ZlcyB0aGUgVUkvVVggZm9y IHRoZSDigJx0ZWFjaGVyIHRhYuKAnSBhcyB3ZWxsIGFzIHRoZSDigJxwYXJ0aXRpb24gdmlld+KA nSBwYWdlcy4NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT4NCjxwPnNlZSBlLmcuIHRo ZSBmb2xsb3dpbmcgc2NyZWVuc2hvdCB0aGF0IGlsbHVzdHJhdGVzIHRoZSBhYmlsaXR5IHRvIGhp ZGUgUElJIChlaXRoZXIgdG9rZW5zIG9yIG5pY2tuYW1lcykgaW4gdGhpcyB3ZWIgcGFnZSwgd2hp Y2ggY2FuIHRoZW4gYmUgc2hhcmVkIHdpdGggc3R1ZGVudHMgaW4gYSBiZWFtZXIgY29udGV4dDoN CjwvcD4NCjxwIHdpZHRoPSI4MCUiPjxpbWcgc3JjPSJodHRwczovL3VzZXItaW1hZ2VzLmdpdGh1 YnVzZXJjb250ZW50LmNvbS8xMDM2NzI1NC8yMzUzNzc4OTQtMmU3MGRmNmQtMzQxNC00NGJlLTkw ZGYtYmNkMjU3NDUyNzRjLnBuZyIgYWx0PSIyMzUzNzc4OTQtMmU3MGRmNmQtMzQxNC00NGJlLTkw ZGYtYmNkMjU3NDUyNzRjLnBuZyIgd2lkdGg9IjgwJSI+DQo8YnI+DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2NhbWwvcHVsbC81NDAjaXNzdWVjb21tZW50LTE1 MjkxNDc1NzgiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1zZi9sZWFybi1vY2FtbC9wdWxsLzU0 MCNpc3N1ZWNvbW1lbnQtMTUyOTE0NzU3ODwvYT4NCjwvcD4NCjwvbGk+PGxpPnNlZSBhbHNvIHRo ZSA8YSBocmVmPSJodHRwOi8vb2NhbWwtc2Yub3JnL2xlYXJuLW9jYW1sL2hvd3RvLWNsYXNzaWZ5 LXN0dWRlbnRzLWFuc3dlcnMuaHRtbCI+DQpvbmxpbmUgZG9jIG9mIHBhcnRpdGlvbi12aWV3PC9h PiBmb3IgbW9yZSBkZXRhaWxzLiA8L2xpPjwvdWw+DQo8cD5JZiBuZWVkIGJlLCBmZWVsIGZyZWUg dG8gb3BlbiBpc3N1ZXMgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1z Zi9sZWFybi1vY2FtbC9pc3N1ZXMvbmV3L2Nob29zZSI+DQpMZWFybi1PQ2FtbCBidWcgdHJhY2tl ciA8L2E+b3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wZml0YXhlbC9sZWFybi1v Y2FtbC5lbC9pc3N1ZXMiPg0KbGVhcm4tb2NhbWwuZWwgYnVnIHRyYWNrZXI8L2E+LCBvciBwb3N0 IGluIHRoaXMgdGhyZWFkIHRvIHNoYXJlIGNvbW1lbnRzLiA8L3A+DQo8cD5IYXBweSBPQ2FtbCBs ZWFybmluZyBhbmQgdGVhY2hpbmcsIGFuZCBzdGF5IHR1bmVkIGZvciB0aGUgbmV4dCByZWxlYXNl ISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+Rmlyc3QgcmVsZWFzZSBvZiBvcGFt LWNoZWNrLW5wbS1kZXBzIHBsdWdpbiAxLjAuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2Ytb3BhbS1jaGVjay1ucG0tZGVwcy1wbHVn aW4tMS0wLTAvMTI4OTgvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0 LXJlbGVhc2Utb2Ytb3BhbS1jaGVjay1ucG0tZGVwcy1wbHVnaW4tMS0wLTAvMTI4OTgvMTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGIzMzNiNiIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRiMzMzYjYiPkphdmllciBDaMOhdmFycmkgYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0YjMz M2I2Ij4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2Ugb24gYmVoYWxmIG9mIHRoZSBBaHJlZnMg YW5kIE1lbGFuZ2UgdGVhbXMgdGhlIGZpcnN0IHJlbGVhc2UgMS4wLjAgb2YgdGhlDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vamNoYXZhcnJpL29wYW0tY2hlY2stbnBtLWRlcHMvIj5vcGFt LWNoZWNrLW5wbS1kZXBzPC9hPiBvcGFtIHBsdWdpbi4NCjwvcD4NCjxwPlRoaXMgcGx1Z2luIGFp bXMgdG8gc29sdmUgYSBzaW1wbGUgbGltaXRhdGlvbjogaG93IHRvIGFsbG93IGxpYnJhcmllcyB3 cml0dGVuIGZvciBlaXRoZXINCjxhIGhyZWY9Imh0dHBzOi8vbWVsYW5nZS5yZS8iPk1lbGFuZ2U8 L2E+IG9yIDxhIGhyZWY9Imh0dHA6Ly9vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbCI+DQpKc19vZl9v Y2FtbDwvYT4gdG8gZGVmaW5lIGRlcGVuZGVuY2llcyB0byBKYXZhU2NyaXB0IHBhY2thZ2VzLiBJ dCBhZGRyZXNzZXMgdGhlIHByb2JsZW0gYnkgZW5hYmxpbmcgbGlicmFyeSBhdXRob3JzIHRvIGxl dmVyYWdlIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9kb2MvTWFudWFsLmh0 bWwjb3BhbWZpZWxkLWRlcGV4dHMiPmRlcGV4dHMgZmllbGQ8L2E+IGluIG9wYW0gZmlsZXMgdG8g ZGVmaW5lIGRlcGVuZGVuY2llcyBvbg0KPGEgaHJlZj0iaHR0cHM6Ly93d3cubnBtanMuY29tLyI+ bnBtPC9hPiBwYWNrYWdlcy4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc3NDFjN2IwIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNzQxYzdiMCI+Rm9y IGxpYnJhcnkgYXV0aG9yczogZGVmaW5pbmcgY29uc3RyYWludHM8L2g0Pg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzc0MWM3YjAiPg0KPHA+Q29uc3RyYWludHMgYXJl IGRlZmluZWQgYnkgYWRkaW5nIGFuIGVudHJ5IHRvIDxjb2RlPmRlcGV4dHM8L2NvZGU+IHdpdGgg dGhlIG5wbSBwYWNrYWdlIG5hbWUgYXMgdGhlIOKAnHN5c3RlbSBwYWNrYWdl4oCdIGFuZCBhbiBl cXVhbGl0eSBmb3JtdWxhIHRoYXQgbWF0Y2hlcyB0aGUNCjxjb2RlPm5wbS12ZXJzaW9uPC9jb2Rl PiB2YXJpYWJsZSB0byBhIHZlcnNpb24gcmFuZ2UuIFRoaXMgcmFuZ2UgY2FuIGJlIGRlZmluZWQg dXNpbmcgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZQ0KPGNvZGU+ZGVwZW5kZW5jaWVzPC9jb2RlPiBm aWVsZCBpbiBhIDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5ucG1qcy5jb20vY2xpL3Y4L2NvbmZpZ3Vy aW5nLW5wbS9wYWNrYWdlLWpzb24jZGVwZW5kZW5jaWVzIj4NCnBhY2thZ2UuanNvbjwvYT4gZmls ZSBbXjFdLiA8L3A+DQo8cD5Gb3IgZXhhbXBsZSwgdGhlIDxjb2RlPnJlYXNvbi1yZWFjdDwvY29k ZT4gYmluZGluZ3MgY2FuIGRlZmluZSB0aGVpciBkZXBlbmRlbmN5IG9uIHRoZQ0KPGNvZGU+cmVh Y3Q8L2NvZGU+IGFuZCA8Y29kZT5yZWFjdC1kb208L2NvZGU+IG5wbSBwYWNrYWdlcyBsaWtlIHRo aXM6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdlNzI5NTQ0Ij4NCmRlcGV4dHM6 IFsNCiAgWyZxdW90O3JlYWN0JnF1b3Q7XSB7bnBtLXZlcnNpb24gPSAmcXVvdDteMTYuMC4wIHx8 IF4xNy4wLjAmcXVvdDt9DQogIFsmcXVvdDtyZWFjdC1kb20mcXVvdDtdIHtucG0tdmVyc2lvbiA9 ICZxdW90O14xNi4wLjAgfHwgXjE3LjAuMCZxdW90O30NCl0NCjwvcHJlPg0KPHA+T3IsIHRvIHNp bXBsaWZ5OiA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnMDA3NWY1YSI+DQpkZXBl eHRzOiBbDQogIFsmcXVvdDtyZWFjdCZxdW90OyAmcXVvdDtyZWFjdC1kb20mcXVvdDtdIHtucG0t dmVyc2lvbiA9ICZxdW90O14xNi4wLjAgfHwgXjE3LjAuMCZxdW90O30NCl0NCjwvcHJlPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y1MThmZWMiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdmNTE4ZmVjIj5Gb3IgbGlicmFyeSB1c2VyczogY2hl Y2tpbmcgbnBtIGRlcGVuZGVuY2llcyBzdGF0dXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2Y1MThmZWMiPg0KPHA+VXNlcnMgY2FuIGNoZWNrIHRoZSBzdGF0 ZSBvZiB0aGUgbnBtIGRlcGVuZGVuY2llcyBieSBydW5uaW5nIHRoZSBwbHVnaW46IDwvcD4NCjxw cmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdhZDhjODYwIj4NCiQgb3BhbS1jaGVjay1ucG0tZGVw cw0KT2s6IG9wYW0gcGFja2FnZSAmcXVvdDt0ZXN0LmRldiZxdW90OyByZXF1aXJlcyBucG0gcGFj a2FnZTogJnF1b3Q7cmVhY3QmcXVvdDsgd2l0aCBjb25zdHJhaW50ICZxdW90O14xNi4wLjAgfHwg XjE3LjAuMCZxdW90OywgdmVyc2lvbiBpbnN0YWxsZWQ6DQomcXVvdDsxNy4wLjImcXVvdDsNCk9r OiBvcGFtIHBhY2thZ2UgJnF1b3Q7dGVzdC5kZXYmcXVvdDsgcmVxdWlyZXMgbnBtIHBhY2thZ2U6 ICZxdW90O3JlYWN0LWRvbSZxdW90OyB3aXRoIGNvbnN0cmFpbnQgJnF1b3Q7XjE2LjAuMCB8fCBe MTcuMC4wJnF1b3Q7LCB2ZXJzaW9uDQppbnN0YWxsZWQ6ICZxdW90OzE3LjAuMiZxdW90Ow0KPC9w cmU+DQo8cD5UaGUgcGx1Z2luIHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiB3aGVuIGVycm9ycyBv Y2N1cjogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzhmNTk2NDciPg0KJCBvcGFt LWNoZWNrLW5wbS1kZXBzDQpFcnJvcjogb3BhbSBwYWNrYWdlICZxdW90O3Rlc3QuZGV2JnF1b3Q7 IHJlcXVpcmVzIG5wbSBwYWNrYWdlICZxdW90O3JlYWN0JnF1b3Q7IHdpdGggY29uc3RyYWludCAm cXVvdDteMTYuMC4wIHx8IF4xNy4wLjAmcXVvdDssIGJ1dCB0aGUgdmVyc2lvbg0KaW5zdGFsbGVk IGZvdW5kIGluIGZpbGUgJnF1b3Q7bm9kZV9tb2R1bGVzL3JlYWN0L3BhY2thZ2UuanNvbiZxdW90 OyBpcyAmcXVvdDsxOC4yLjAmcXVvdDsNCkVycm9yOiBvcGFtIHBhY2thZ2UgJnF1b3Q7dGVzdC5k ZXYmcXVvdDsgcmVxdWlyZXMgbnBtIHBhY2thZ2UgJnF1b3Q7cmVhY3QtZG9tJnF1b3Q7IHdpdGgg Y29uc3RyYWludCAmcXVvdDteMTYuMC4wIHx8IF4xNy4wLjAmcXVvdDssIGJ1dCB0aGUNCnZlcnNp b24gaW5zdGFsbGVkIGZvdW5kIGluIGZpbGUgJnF1b3Q7bm9kZV9tb2R1bGVzL3JlYWN0LWRvbS9w YWNrYWdlLmpzb24mcXVvdDsgaXMgJnF1b3Q7MTguMi4wJnF1b3Q7DQo8L3ByZT4NCjxwPldoZW4g cnVubmluZyB0aGUgcGx1Z2luLCBpdCBjaGVja3MgdGhlIGN1cnJlbnQgb3BhbSBzd2l0Y2ggdG8g cmVhZCBhbGwgPGNvZGU+ZGVwZXh0czwvY29kZT4gZmllbGRzIHRoYXQgdXNlIHRoZQ0KPGNvZGU+ bnBtLXZlcnNpb248L2NvZGU+IHZhcmlhYmxlLCBhbmQgdGhlbiByZWFkcyB0aGUgPGNvZGU+bm9k ZV9tb2R1bGVzPC9jb2RlPiBmb2xkZXIgdG8gZGV0ZXJtaW5lIGlmIHRoZSBjb25zdHJhaW50cyBh cmUgc2F0aXNmaWVkLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzI4ODM4YTciIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcyODgzOGE3 Ij5Db21wYXRpYmlsaXR5PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4 dC1vcmcyODgzOGE3Ij4NCjxwPlRoZSBwbHVnaW4gaXMgY3VycmVudGx5IGNvbXBhdGlibGUgd2l0 aCB2ZXJzaW9uIDIuMSBvZiBvcGFtLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnZThiMjQ3ZiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y Z2U4YjI0N2YiPlVwY29taW5nIHBsYW5zIGFuZCBlY29zeXN0ZW0gY29sbGFib3JhdGlvbjwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZThiMjQ3ZiI+DQo8cD5P dXIgbmV4dCBzdGVwcyB3aWxsIGludm9sdmUgdGVzdGluZyB0aGlzIGluaXRpYWwgdmVyc2lvbiB3 aXRoIE1lbGFuZ2UgbGlicmFyaWVzIGFuZCBwcm9qZWN0cywgYW5kIGdhdGhlcmluZyBmZWVkYmFj ayBmcm9tIHRoZSBjb21tdW5pdHkgYWJvdXQgdXNlIGNhc2VzIGFuZCBmdW5jdGlvbmFsaXR5LiBX ZSB3aWxsIGFsc28ga2VlcCBhbiBleWUgb24gdGhlIHJlbGVhc2Ugb2Ygb3BhbSAyLjIgZm9yIGFu IHVwZ3JhZGUuIElmIHlvdSBoYXZlIHN1Z2dlc3Rpb25zDQogYWJvdXQgaG93IHRvIGltcHJvdmUg dGhlIHBsdWdpbiBvciBmaW5kIGFueSBidWdzLCBwbGVhc2UgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2pjaGF2YXJyaS9vcGFtLWNoZWNrLW5wbS1kZXBzL2lzc3Vlcy9uZXciPg0Kb3BlbiBh biBpc3N1ZTwvYT4gaW4gdGhlIHByb2plY3QgcmVwb3NpdG9yeS4gPC9wPg0KPHA+SXQgaXMgZXhj aXRpbmcgdG8gcmVsZWFzZSBhIHRvb2wgdGhhdCBjYW4gYmUgdXNlZnVsIGZvciBib3RoIEpzX29m X29jYW1sIGFuZCBNZWxhbmdlIGRldmVsb3BlcnMuIEkgaG9wZSB0aGF0IGJvdGggZWNvc3lzdGVt cyBkaXNjb3ZlciBtb3JlIGFyZWFzIGZvciBwb3RlbnRpYWwgY29udmVyZ2VuY2UgaW4gdGhlIGZ1 dHVyZS4NCjwvcD4NCjxwPkhhcHB5IGNvZGluZyEgPC9wPg0KPHA+W14xXTogU3BlY2lhbCB0aGFu a3MgdG8gdGhlIGVzeSBhdXRob3JzIGFuZCBjb250cmlidXRvcnMsIGFzIHRoZSBwbHVnaW4gcmV1 c2VzIG1hbnkgb2YgZXN54oCZcyBsaWJyYXJpZXMgdG8gYW5hbHl6ZSBjb25zdHJhaW50cyBpbiBh IGZvcm1hdCBjb21wYXRpYmxlIHdpdGgNCjxjb2RlPnBhY2thZ2UuanNvbjwvY29kZT4gZmlsZXMu IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPkRlcGxveSBkcmVhbSBv biByYWlsd2F5LmFwcCB2aWEgdGVtcGxhdGU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2RlcGxveS1kcmVhbS1vbi1yYWlsd2F5LWFwcC12aWEtdGVtcGxhdGUvMTI5MDIv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZGVwbG95LWRyZWFtLW9uLXJhaWx3YXkt YXBwLXZpYS10ZW1wbGF0ZS8xMjkwMi8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2JjYzI0ZDQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdi Y2MyNGQ0Ij5EZW5uaXMgRGFuZyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2JjYzI0ZDQiPg0KPHA+SGV5bywgc2hhcmluZyB0aGlzIHRlbXBs YXRlIEkgbWFkZSB0byBkZXBsb3kgPGEgaHJlZj0iaHR0cHM6Ly9hYW50cm9uLmdpdGh1Yi5pby9k cmVhbS8iPg0KZHJlYW08L2E+IGFwcHMgb24gPGEgaHJlZj0iaHR0cHM6Ly9yYWlsd2F5LmFwcCI+ aHR0cHM6Ly9yYWlsd2F5LmFwcDwvYT4uIDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vcmFpbHdh eS5hcHAvdGVtcGxhdGUvbXhFU3pTIj5odHRwczovL3JhaWx3YXkuYXBwL3RlbXBsYXRlL214RVN6 UzwvYT4NCjwvcD4NCjxwPlNoYXJlZCBpdCBpbiB0aGUgb2NhbWxsYWJzIHNsYWNrLCBhbmQgZmln dXJlZCBpdCBjb3VsZCBiZSBoZWxwZnVsIGhlcmUgdG9vLiBJ4oCZdmUgYmVlbiB0aHJvd2luZyBt eSBleHBlcmltZW50cyB3aXRoIG9jYW1sJiM0MztkcmVhbSBvbnRvIHJhaWx3YXkgYmVjYXVzZSB0 aGVpciAkNSBVU0QvbW8gaG9iYnkgdGllciBmaXRzIG1lIGJlc3QuIEZseS5pbyB3b3JrcyBidXQg aXTigJlzIGFubm95aW5nIGhhdmluZyB0byBzZXR1cCBnaXRodWIgY2kgcGVyIG5ldw0KIGlkZWEs IGFuZCB0aGVuIFJlbmRlciBjb3N0cyAkNy9tby9wcm9qZWN0LiBSYWlsd2F5IGNoYXJnZXMgYmFz ZWQgb24gdXNhZ2UsIHNpbWlsYXIgdG8gRmx5LmlvLg0KPC9wPg0KPHA+RnVsbCBkaXNjbG9zdXJl OiBpZiB5b3UgZGVwbG95IHdpdGggdGhlIHRlbXBsYXRlIGFuZCBlbmQgdXAgc3Vic2NyaWJpbmcs IEkgYmVsaWV2ZSBJIGdldCBob3N0aW5nIGNyZWRpdHMuIEJ1dCB5b3UgZG9u4oCZdCBoYXZlIHRv IGRvIHRoYXQhIEp1c3QgZm9yayB0aGUgbGlua2VkIGdpdGh1YiByZXBvLCBhbmQgZGVwbG95IGl0 IG9uIHlvdXIgb3duLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPkRvYyBSZXZp ZXc6IFVwZGF0aW5nIFMtRXhwcmVzc2lvbnMgVHV0b3JpYWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2RvYy1yZXZpZXctdXBkYXRpbmctcy1leHByZXNzaW9ucy10dXRv cmlhbC8xMjkwNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kb2MtcmV2aWV3LXVw ZGF0aW5nLXMtZXhwcmVzc2lvbnMtdHV0b3JpYWwvMTI5MDYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTE1MjdjOCIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzUxNTI3YzgiPkNocmlzdGluZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzUxNTI3YzgiPg0KPHA+V2XigJl2ZSBiZWVu IHdvcmtpbmcgb24gdXBkYXRpbmcgYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8xNTA3Ij4NCmltcHJvdmluZyB0aGUgTGVhcm4gZG9jdW1lbnRzPC9h PiBvbiBPQ2FtbC5vcmcsIGFuZCB3ZSB3b3VsZCBsb3ZlIHlvdXIgaGVscCBhbmQgZmVlZGJhY2sg aW4gcmV2aWV3aW5nIHRoZW0uDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTUwNyI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzE1MDc8L2E+DQo8L3A+DQo8cD5EaWQgd2UgbWlzcyBhbnl0aGluZz8gRG9lcyBz b21ldGhpbmcgbmVlZCBjbGFyaWZpY2F0aW9uPyA8L3A+DQo8cD5XZeKAmXJlIGFsc28gc3RpbGwg aG9waW5nIGZvciBmZWVkYmFjayBhbmQgY29tbWVudHMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MzEiPg0Kb24gdGhlIHVwZGF0ZWQgR2V0dGluZyBT dGFydGVkIGRvY3VtZW50czwvYT46IDxpPkEgVG91ciBvZiBPQ2FtbDwvaT4gYW5kIDxpPkhvdyB0 byBXcml0ZSBhbiBPQ2FtbCBQcm9ncmFtLjwvaT4gVGhlDQo8aT5JbnN0YWxsIE9DYW1sPC9pPiB0 dXRvcmlhbCB3aWxsIGJlIGNvbWluZyBzb29uIGZvciBjb21tdW5pdHkgZmVlZGJhY2suIDwvcD4N CjxwPkxldOKAmXMgc2hhcGUgdGhlc2UgdXAgc28gbmV3Y29tZXJzIGNhbiBxdWlja2x5IGdldCB1 cCBhbmQgcnVubmluZyBhbmQgbWluaW1pc2UgY29uZnVzaW9uIGFyb3VuZCBhZG9wdGluZyBPQ2Ft bC4NCjwvcD4NCjxwPlRoYW5rcyBmb3IgeW91ciBoZWxwISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iOCI+TmV3IHByb2plY3QsIG9sZCB0ZWNobmlxdWU6IERrU0RLIEZGSSBPQ2FtbDwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1wcm9qZWN0LW9s ZC10ZWNobmlxdWUtZGtzZGstZmZpLW9jYW1sLzEyOTA5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1uZXctcHJvamVjdC1vbGQtdGVjaG5pcXVlLWRrc2RrLWZmaS1vY2FtbC8x MjkwOS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2 NmExMjkwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjZhMTI5MCI+amJlY2tmb3Jk IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn NjZhMTI5MCI+DQo8cD48Yj5Qcm9ibGVtPC9iPjogTGV04oCZcyBzYXkgeW91IHdhbnQgdG8gd3Jp dGUgY29kZSBpbiBhbiBvYnNjdXJlLCA8YSBocmVmPSJodHRwczovL3NwZWN0cnVtLmllZWUub3Jn L3RvcC1wcm9ncmFtbWluZy1sYW5ndWFnZXMtMjAyMiI+DQpyYXJlbHkgYnJlYWtzIHRvcCA1MCBw b3B1bGFyaXR5PC9hPiBwcm9ncmFtbWluZyBsYW5ndWFnZS4gWW91ciBjb21waWxlZCBjb2RlIG11 c3QgcnVuIGluIGRpdmVyc2UgcnVudGltZSBlbnZpcm9ubWVudHM6IEFuZHJvaWQsIGlPUywgZGVz a3RvcCwgZXRjLiBCdXQgeW91IGFyZSBsb2F0aGUgdG8gdGhyb3cgYXdheSB0aGUgbnVtZXJvdXMg bGlicmFyaWVzIGFuZCB0aGUgdmFzdCBlY29zeXN0ZW0gb2YgdG9vbHMgdGhhdCBhcmUgaW4gdGhl IGRvbWluYW50DQogSmF2YSwgU3dpZnQsIGFuZCBDJiM0MzsmIzQzOyAoZXRjLikgZW52aXJvbm1l bnRzLiA8L3A+DQo8cD5Ea1NESyBGRkkgaXMgYSBmcmFtZXdvcmsgdGhhdCBzb2x2ZXMgdGhlIGFi b3ZlIHByb2JsZW0uIE9uZSBmcmFtZXdvcmsgY29tcG9uZW50LCBEa1NESyBGRkkgT0NhbWwsIGlz IGJlaW5nIHJlbGVhc2VkIG5vdyAocGVuZGluZw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzI0MzE2Ij5vY2FtbC9vcGFtLXJlcG9zaXRvcnkg UFIyNDMxNjwvYT4pLCBhbmQgb3RoZXIgZnJhbWV3b3JrIGNvbXBvbmVudHMgbGlrZSBEa1NESyBG RkkgSmF2YSB3aWxsIGJlIHJlbGVhc2VkIGluIHRoZSBmdXR1cmUuIExldOKAmXMgbG9vayBhdCBz b21lIGV4YW1wbGUgY29kZSB3cml0dGVuIGluIE9DYW1sLCBidXQgYmVhciBpbiBtaW5kIHR3byB0 aGluZ3M6DQo8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+RWFjaCBvZiB0aGUgdHdvIGV4 YW1wbGVzIGJlbG93IGNhbiBiZSB3cml0dGVuIGluIDxpPmFueTwvaT4gRGtTREsgRkZJIGxhbmd1 YWdlLg0KPC9saT48bGk+SeKAmWxsIGV4cGxhaW4gd2hhdCBpcyBnb2luZyBvbiA8aT5hZnRlcjwv aT4gdGhlIGV4YW1wbGVzLiA8L2xpPjwvb2w+DQo8cD5IZXJlIGlzIGFuIGV4YW1wbGUgb2YgcmVn aXN0ZXJpbmcgYSBEa1NESyBGRkkg4oCcQ09NIG9iamVjdOKAnSBpbiBPQ2FtbC4gU2Nyb2xsIGRv d24gdG8gc2VlIHRoZSBmdWxsIGV4YW1wbGUuDQo8L3A+DQo8YmxvY2txdW90ZT4NCjxwPldoZW4g RGtTREsgRkZJIEphdmEgaXMgcmVsZWFzZWQsIHRoaXMgZXhhbXBsZSBjb3VsZCBiZSB3cml0dGVu IGluIEphdmEuIFdoZW4gRGtTREsgRkZJIFN3aWZ0IGlzIHJlbGVhc2VkLCB0aGlzIGV4YW1wbGUg Y291bGQgYmUgd3JpdHRlbiBpbiBTd2lmdC4gQW5kIHNvIG9uLg0KPC9wPg0KPC9ibG9ja3F1b3Rl Pg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1v Y2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNzA4MDkwOyI+I3VzZTwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7dG9wZmluZCZxdW90Ozwvc3Bhbj48c3BhbiBzdHls ZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzcwODA5 MDsiPiNyZXF1aXJlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtE a1NES0ZGSU9DYW1sX1N0ZCZxdW90Ozwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7 Ij47Ozwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkRrU0RLRkZJ T0NhbWxfU3RkPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4N Cg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4g PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNvbVN0YW5kYXJkU2NoZW1hLk1h a2U8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db21NZXNzYWdlLjwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5DPC9zcGFuPikNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db20uTWFrZUNs YXNzQnVpbGRlcjwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNvbU1lc3Nh Z2UuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjog I2ZjZjdlZjsiPkM8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bh bj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxl dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+Y29tPC9zcGFuPiA9IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNvbS48L3NwYW4+Y3JlYXRlX2MgKCkgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog I2E3NjAxZjsiPmNyZWF0ZV9vYmplY3Q8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5 ZjsiPnJldHVybjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YXJnczwvc3Bh bj4gPQ0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm51bWJlcjwvc3Bhbj4g PSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZWFkZXIuU2kzMi48L3NwYW4+KGkxX2dl dCAob2ZfbWVzc2FnZSBhcmdzKSkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgIHJldHVybiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAj MjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+TmV3PC9zcGFuPg0KICAgICAgICAo PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJpbnRmLjwvc3Bhbj5zcHJpbnRmDQogICAg ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2luc3RhbmNlIGNvbnN0cnVj dGVkIHdpdGggY3JlYXRlX29iamVjdChhcmdzID0gJWxkKSZxdW90Ozwvc3Bhbj4NCiAgICAgICAg bnVtYmVyKSkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQoNCjxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmFzazwvc3Bhbj4gfjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPnNlbGY8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnJl dHVybjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YXJnczwvc3Bhbj4gPQ0K ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnF1ZXN0aW9uPC9zcGFuPiA9IDxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJlYWRlci5TdC48L3NwYW4+KGkxX2dldCAob2Zf bWVzc2FnZSBhcmdzKSkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPmluPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnJl dDwvc3Bhbj4gPQ0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJpbnRmLjwv c3Bhbj5zcHJpbnRmIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O0kgYW0gYW4g JXMgYW5kIEkgd2FzIGFza2VkOiAlcyZxdW90Ozwvc3Bhbj4gc2VsZiBxdWVzdGlvbg0KICAgIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4N CiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0 PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5ibGRyPC9zcGFuPiA9IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkJ1aWxkZXIuU3QuPC9zcGFuPig8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij5yPC9zcGFuPiA9IGluaXRfcm9vdCAoKSA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+IGkxX3NldCByIHJl dDsgcikgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmlu PC9zcGFuPg0KICAgIHJldHVybiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZmNmN2VmOyI+Q2FwbnA8L3NwYW4+IGJsZHIpIDxzcGFuIHN0eWxlPSJjb2xv cjogI2ZmNDUwMDsiPjs7PC9zcGFuPg0KDQpyZWdpc3RlciBjb20gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA4MjRmOyI+fmNsYXNzbmFtZTwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAw OyI+JnF1b3Q7QmFzaWM6OlF1ZXN0aW9uOjpUYWtlciZxdW90Ozwvc3Bhbj4NCiAgICAgIFsNCiAg ICAgICAgY2xhc3NfbWV0aG9kIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5uYW1lPC9z cGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtjcmVhdGVfb2JqZWN0JnF1 b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+Zjwvc3Bhbj46Y3JlYXRl X29iamVjdCAoKTsNCiAgICAgICAgaW5zdGFuY2VfbWV0aG9kIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPn5uYW1lPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVv dDthc2smcXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5mPC9zcGFu Pjphc2sgKCk7DQogICAgICBdIDxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsiPjs7PC9zcGFu Pg0KPC9wcmU+DQo8L2Rpdj4NCjxwPkhlcmUgaXMgYW4gZXhhbXBsZSBvZiB1c2luZyB0aGF0IHJl Z2lzdGVyZWQgRGtTREsgRkZJIENPTSBvYmplY3QgZnJvbSBPQ2FtbC4gPC9wPg0KPGJsb2NrcXVv dGU+DQo8cD5XaGVuIERrU0RLIEZGSSBKYXZhIGlzIHJlbGVhc2VkLCB0aGlzIGV4YW1wbGUgY291 bGQgYmUgd3JpdHRlbiBpbiBKYXZhLiBBbmQgc28gb24uDQo8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8 ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1s Ij48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxl PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5CYXNpY1F1ZXN0aW9uVGFrZXI8 L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PnN0cnVjdDwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdo dDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNvbVN0 YW5kYXJkU2NoZW1hLk1ha2U8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5D b21NZXNzYWdlLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQt Y29sb3I6ICNmY2Y3ZWY7Ij5DPC9zcGFuPikNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2 MDFmOyI+Y3JlYXRlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jb208L3Nw YW4+ID0NCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNvbS48L3NwYW4+Ym9y cm93X2NsYXNzX3VudGlsX2ZpbmFsaXplZCBjb20gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAw OyI+JnF1b3Q7QmFzaWM6OlF1ZXN0aW9uOjpUYWtlciZxdW90Ozwvc3Bhbj4NCiAgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bWV0aG9kX2NyZWF0ZV9vYmplY3Q8L3NwYW4+ID0gPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q29tLjwvc3Bhbj5tZXRob2RfaWQgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7Y3JlYXRlX29iamVjdCZxdW90Ozwvc3Bhbj4NCiAg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bWV0aG9kX2Fzazwvc3Bhbj4gPSA8c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db20uPC9zcGFuPm1ldGhvZF9pZCA8c3BhbiBzdHls ZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDthc2smcXVvdDs8L3NwYW4+DQoNCiAgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmNsYXNzPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5xdWVzdGlvbnRha2VyPC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij5fY2xheno8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPmluc3Q8L3NwYW4+ID0NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+b2JqZWN0PC9zcGFuPg0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm1ldGhvZDwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjYTc2MDFmOyI+YXNrPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5xdWVzdGlvbjwvc3Bhbj4gPQ0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5hcmdzPC9zcGFuPiA9DQogICAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPkJ1aWxkZXIuU3Q8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5ydzwvc3Bhbj4gPSBpbml0X3Jvb3QgKCkgPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPiBpMV9zZXQgcncgcXVl c3Rpb247IHRvX21lc3NhZ2UgcncNCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5yZXRfcHRyPC9zcGFuPiA9DQogICAgICAgICAgICA8c3BhbiBzdHls ZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db20uPC9zcGFuPmNhbGxfaW5zdGFuY2VfbWV0aG9kIGluc3Qg bWV0aG9kX2FzayBhcmdzDQogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+UmVhZGVyLlN0Ljwvc3Bhbj5pMV9nZXQgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPlJlYWRlci48L3NwYW4+b2ZfcG9pbnRlciByZXRfcHRyKQ0KICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbmQ8L3NwYW4+DQoNCiAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+bmV3X3F1ZXN0aW9udGFrZXI8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmNsYXp6PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDdhOWY7Ij5udW1iZXI8L3NwYW4+ID0NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5hcmdzPC9zcGFuPiA9DQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b3BlbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+QnVpbGRlci5TaTMyPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5yPC9zcGFuPiA9IGluaXRfcm9vdCAoKSA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+IGkxX3NldF9pbnRfZXhu IHIgbnVtYmVyOyB0b19tZXNzYWdlIHINCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+Q29tLjwvc3Bhbj5jYWxsX2NsYXNzX2NvbnN0cnVjdG9yDQogICAgICBjbGF6eiBt ZXRob2RfY3JlYXRlX29iamVjdCAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdl aWdodDogYm9sZDsiPm5ldzwvc3Bhbj4gcXVlc3Rpb250YWtlciBjbGF6eikgYXJncw0KPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmVuZDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnF1ZXN0aW9udGFrZXJfY2xheno8L3NwYW4+ID0gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+QmFzaWNRdWVzdGlvblRha2VyLjwvc3Bhbj5jcmVhdGUgY29tDQo8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5xdWVzdGlvbnRha2VyPC9zcGFuPiA9DQog IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkJhc2ljUXVlc3Rpb25UYWtlci48L3NwYW4+ bmV3X3F1ZXN0aW9udGFrZXIgcXVlc3Rpb250YWtlcl9jbGF6eiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij4zNzwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3Nw YW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5s ZXQ8L3NwYW4+ICgpID0gcHJpbnRfZW5kbGluZSAocXVlc3Rpb250YWtlciNhc2sgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7V2hhdCBhbSBJPyZxdW90Ozwvc3Bhbj4pIDxzcGFu IHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsiPjs7PC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6 ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29s b3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPk91dHB1dDo8L3NwYW4+DQo8c3BhbiBz dHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAgICBJIGFtIGFuIGlu c3RhbmNlIGNvbnN0cnVjdGVkIHdpdGggY3JlYXRlX29iamVjdChhcmdzID0gMzcpPC9zcGFuPg0K PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICAgYW5k IEkgd2FzIGFza2VkOiBXaGF0IGFtIEk/PC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2 ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4qKTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+DQo8cD48 Yj5Db250ZXh0PC9iPjogQSBsb25nIHRpbWUgYWdvIGluIGEgZ2FsYXh5IGZhciwgZmFyIGF3YXks IE1pY3Jvc29mdCBpbnZlbnRlZCB0aGUgQ29tcG9uZW50IE9iamVjdCBNb2RlbCAo4oCcQ09N4oCd KSBmb3IgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIGxpa2UgVmlzdWFsIEJhc2ljLCBDIGFuZCBEZWxw aGkgdG8gaW50ZXJvcGVyYXRlIG9uIHRoZSBzYW1lIG1hY2hpbmUuIENPTSB3YXMgYW4gYXBwbGlj YXRpb24gYmluYXJ5IGludGVyZmFjZSAoQUJJKQ0KIHdoZXJlIENPTSDigJxvYmplY3Rz4oCdIHdl cmUgZ2l2ZW4gQyYjNDM7JiM0Mzsgc3R5bGUgdmlydHVhbCB0YWJsZXM7IHN1YnNlcXVlbnRseSB0 aGVzZSBDT00gb2JqZWN0cyBoYWQgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc2ltcGxlIEMmIzQzOyYj NDM7IG9iamVjdHMgd2l0aG91dCBuZWVkaW5nIEMmIzQzOyYjNDM7LiBUaGVzZSBDT00gb2JqZWN0 cyBhbHNvIHNvbHZlZCBjcm9zcy1sYW5ndWFnZSBtZW1vcnkgbWFuYWdlbWVudCB1c2luZyBtYW51 YWwgcmVmZXJlbmNlIGNvdW50aW5nLiBBbmQgdGhlbg0KIE1pY3Jvc29mdCB3ZW50IGNyYXp5IHRy eWluZyB0byBleHBhbmQgaXRzIHJlYWNoLCBhbmQgdW5zdWNjZXNzZnVsbHkgcHVzaGVkIGZvciBh IENPTSBlbmhhbmNlbWVudCAoQWN0aXZlWCkgdG8gYmUgdGhlIGJhY2tib25lIG9mIHRoZSDigJxX b3JsZCBXaWRlIFdlYuKAnS4gQnV0IENPTSBzdXJ2aXZlZCBpbiBzZXZlcmFsIHBsYWNlcyBsaWtl IERpcmVjdFgsIEFwcGxlIENvcmUgRm91bmRhdGlvbiwgYW5kIE1vemlsbGEgWFBDT00uDQo8L3A+ DQo8cD48Yj5Db250ZXh0PC9iPjogVGhlcmUgaXMgYSBuZWF0IHJlbW90ZSBwcm9jZWR1cmUgY2Fs bCAo4oCcUlBD4oCdKSBzeXN0ZW0gY2FsbGVkIENhcCBu4oCZIFByb3RvIFJQQy4gSXQgZmVhdHVy ZXMNCjxhIGhyZWY9Imh0dHBzOi8vY2FwbnByb3RvLm9yZy8iPnplcm8gb3ZlcmhlYWQgZm9yIGVu Y29kaW5nIGFuZCBkZWNvZGluZzwvYT4sIGJpbmRpbmdzIHRvIG1hbnkgcHJvZ3JhbW1pbmcgbGFu Z3VhZ2VzLCBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vY2FwbnByb3RvLm9yZy9ycGMuaHRtbCI+cHJv bWlzZSBwaXBlbGluaW5nPC9hPiB0byBzb2x2ZSB0aGUgZGlzdHJpYnV0ZWQsIGNhc2NhZGluZyBs YXRlbmN5IHByb2JsZW0gdGhhdCBpbnNwaXJlZCBHcmFwaFFMLiBUaGluayBvZiBDYXAgbuKAmSBQ cm90byBhcyBhIHZlcnkgZmFzdCBKU09OIGZyYW1ld29yayBjb21iaW5lZCAob3B0aW9uYWxseSkg d2l0aCByZW1vdGUgcHJvY2VkdXJlIGNhbGxzLg0KPC9wPg0KPHA+PGI+QSBjb25jcmV0ZSBleGFt cGxlPC9iPjogWW91IG1ha2UgYW4gQW5kcm9pZCBhcHBsaWNhdGlvbiB1c2luZyBKYXZhIGluIEFu ZHJvaWQgU3R1ZGlvLCB3aXRoIHRoZSBidXNpbmVzcyBsb2dpYyAob3IgZGF0YSBsYXllciBvciDi gJxNb2RlbOKAnSBvYmplY3RzKSB3cml0dGVuIGluIGFuIG9ic2N1cmUgbGFuZ3VhZ2UgbGlrZSBP Q2FtbC4gQW5kIGFuIGlPUyBhcHBsaWNhdGlvbiB1c2luZyBTd2lmdCBpbiBYY29kZSwgcmUtdXNp bmcgdGhlIHNhbWUNCiBidXNpbmVzcyBsb2dpYyB5b3UgYWxyZWFkeSB3cm90ZSBpbiBPQ2FtbC4g QW5kIGEgZGVza3RvcCBhcHBsaWNhdGlvbiB1c2luZyBhIEMmIzQzOyYjNDM7IEdVSSBmcmFtZXdv cmssIHJlLXVzaW5nIHRoZSBzYW1lIGJ1c2luZXNzIGxvZ2ljLiBXcmFwcGluZyB5b3VyIE9DYW1s IG9iamVjdHMgYXMgQ09NIG9iamVjdHMgaXMgb25lIHdheSBmb3Igb2JqZWN0LW9yaWVudGVkIGxh bmd1YWdlcyBsaWtlIEphdmEsIFN3aWZ0IGFuZCBDJiM0MzsmIzQzOyB0byBjb21tdW5pY2F0ZSB3 aXRoDQogeW91ciBPQ2FtbCBjb2RlLiBCdXQgdGhhdCBzb3VuZHMgbGlrZSBhIGxvdCBvZiB3b3Jr LCBhbmQgaXQgY291bGQgYmUhIEFuZCBJIGhhdmVu4oCZdCBldmVuIG1lbnRpb25lZCB0aGUgb3Zl cmhlYWQgb2YgY2FsbGluZyBtZXRob2RzIHVzaW5nIGEgQy9DJiM0MzsmIzQzOyBjYWxsaW5nIGNv bnZlbnRpb24gZnJvbSBhIGZvcmVpZ24gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuDQo8L3A+DQo8cD48 Yj5FbnRlciB0aGUgRGtTREsgRkZJIGZyYW1ld29yazwvYj46IERrU0RLIEZGSSBjb21iaW5lcyBi b3RoIENPTSBhbmQgQ2FwIG7igJkgUHJvdG8gZm9yDQo8Yj5zYW1lLXByb2Nlc3M8L2I+IGludGVy b3BlcmFiaWxpdHkuIFdlIGdldCByaWQgb2YgQ09N4oCZcyBDL0MmIzQzOyYjNDM7IGNhbGxpbmcg Y29udmVudGlvbi4gVGhhdCBtZWFucyB0aGVyZSBpcyBubyBzdGFjay1hbGxvY2F0aW5nIGVhY2gg ZnVuY3Rpb24gcGFyYW1ldGVyIGFuZCBlbmNvZGluZy9kZWNvZGluZyBlYWNoIGZvcmVpZ24gbGFu Z3VhZ2UgdHlwZSBhcyBhIEMgbmF0aXZlIHR5cGUuIEluc3RlYWQgZWFjaCBmdW5jdGlvbiBjYWxs IGhhcyBhIHNpbmdsZQ0KIGFyZ3VtZW50IOKApiBhIENhcCBu4oCZIFByb3RvIOKAnFN0cnVjdOKA nSAodGhpbmsgb2YgaXQgYXMgYSBKU09OIG9iamVjdCB3aXRoIGxpdHRsZSBvciBubyBlbmNvZGlu ZyBvdmVyaGVhZCkg4oCmIGFuZCBhIHNpbmdsZSDigJxTdHJ1Y3TigJ0gcmV0dXJuIHZhbHVlLiBM aWtlIENPTSwgRGtTREsgRkZJIG9iamVjdHMgYXJlIHJlZmVyZW5jZSBjb3VudGVkLiBVbmxpa2Ug Q09NLCBEa1NESyBGRkkgYXJndW1lbnRzIGFuZCByZXR1cm4gdmFsdWVzIGFyZSBhbHNvIHJlZmVy ZW5jZQ0KIGNvdW50ZWQuIEluIG90aGVyIHdvcmRzLCBEa1NESyBGRkkgY29yZSBjb25jZXB0cyBh cmUgc2ltcGxlLCB1bmlmb3JtLCBhY2Nlc3NpYmxlIGluIG1hbnkgcHJvZ3JhbW1pbmcgbGFuZ3Vh Z2VzLCBhbmQgaGF2ZSBiZWVuIHNob3duIHRvIHdvcmsgb3ZlciBkZWNhZGVzLg0KPC9wPg0KPHA+ VG9kYXkgdGhpcyBhbm5vdW5jZW1lbnQgaXMgYSBwcmV2aWV3IGZvciBPQ2FtbC1lcnMuIEV2ZW4g dGhvdWdoIERrU0RLIEZGSSBjYW4gYmUgdXNlZCwgZm9yIGV4YW1wbGUsIHRvIGludGVyb3BlcmF0 ZSBiZXR3ZWVuIEphdmEgYW5kIFN3aWZ0LCB0aGUgT0NhbWwgbGFuZ3VhZ2UgaGFzIHNsaWdodCBw cml2aWxlZ2VzIG92ZXIgb3RoZXIgbGFuZ3VhZ2VzLg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPkZpcnN0IGlzIGluIGxpY2Vuc2luZy4gV2hlbiBEa1NESyBGRkkgSmF2YSBpcyByZWxl YXNlZCBpbiBhIGZldyBtb250aHMgdG8gdGhlIHByZWRvbWluYW50IOKAnE1hdmVu4oCdIEphdmEg YmluYXJ5IHBhY2thZ2UgbWFuYWdlciwgdGhlIGJpbmRpbmcgc291cmNlIGNvZGUgYW5kIEphdmEN Cjxjb2RlPi5zbzwvY29kZT4gYW5kIDxjb2RlPi5kbGw8L2NvZGU+IHNoYXJlZCBsaWJyYXJpZXMg d2lsbCBiZSBhdmFpbGFibGUgdW5kZXIgYW4NCjxhIGhyZWY9Imh0dHBzOi8vb3BlbnNvdXJjZS5v cmcvbGljZW5zZS9vc2wtMy0wLXBocC8iPuKAnE9TTC0zLjDigJ0gT1NJLWFwcHJvdmVkPC9hPiBv cGVuIHNvdXJjZSBsaWNlbnNlLCBidXQgb25seSBmb3Igb25lIE9TIGFyY2hpdGVjdHVyZSAocHJv YmFibHkgTGludXggeDg2XzY0IHNpbmNlIGVhc3kgdG8gcnVuIHdpdGggRG9ja2VyKS4gSWYgeW91 IG5lZWQgb3RoZXIgT1MgYXJjaGl0ZWN0dXJlcyB5b3UgY2FuIHB1cmNoYXNlIHRoZSBmdWxsIHNv dXJjZQ0KIGNvZGUgd2l0aCBhIDxhIGhyZWY9Imh0dHBzOi8vZGlza3V2LmNvbS9wcmljaW5nIj5E a1NESyBsaWNlbnNlPC9hPiwgb3IgZ2V0IGl0IGZyZWUgb24gcmVxdWVzdCBpZiB5b3UgYXJlIGEg c2VjdXJpdHkgZW5naW5lZXIsIGVkdWNhdG9yIG9yIGEgcmVsYXRlZC1maWVsZCBhY2FkZW1pYyBy ZXNlYXJjaGVyLiBBbmQgd2hlbiBEa1NESyBGRkkgU3dpZnQgaXMgcmVsZWFzZWQgbmV4dCB5ZWFy LCBpdCB3aWxsIGJlIE9TTC0zLjAgbGljZW5zZWQgb25seQ0KIGZvciBvbmUgT1MgYXJjaGl0ZWN0 dXJlIChwcm9iYWJseSBEYXJ3aW4gYXJtNjQpLiA8Yj5Ea1NESyBGRkkgT0NhbWw/PC9iPiBJdCB3 aWxsIGJlIE9TTC0zLjAgbGljZW5zZWQgc28gaXQgY2FuIGJlIHVzZWQgYWxvbmdzaWRlDQo8Yj5h bGw8L2I+IG90aGVyIHJlbGVhc2VkIE9TTC0zLjAgYXJjaGl0ZWN0dXJlcyAoZXguIExpbnV4IHg4 Nl82NCwgRGFyd2luIGFybTY0IGFuZCBzbyBvbikuDQo8L2xpPjxsaT5TZWNvbmQsIHRoZXJlIG1h eSBiZSBzb21lIGxlYWt5IGFic3RyYWN0aW9ucyBpbiBEa1NESyBGRkkgdGhhdCBoZWxwIE9DYW1s LiBPbmUgZXhhbXBsZSBpcyBEa1NESyBGRkkgbWV0aG9kIGlkZW50aWZpZXJzIGFyZSAzMS1iaXQg aWRlbnRpZmllcnMuDQo8L2xpPjwvdWw+DQo8cD5Zb3XigJlsbCBuZWVkIHRvIHdhaXQgZm9yIHlv dXIgZm9yZWlnbiBwcm9ncmFtbWluZyBsYW5ndWFnZSAoSmF2YSwgZXRjLikgdG8gYmUgaW1wbGVt ZW50ZWQgaW4gRGtTREsgRkZJLiBSZWZlcmVuY2UgbWF0ZXJpYWwgYW5kIHRpbWVsaW5lcyBhcmU6 DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+RGtTREsgRkZJIE9DYW1sIC0gPGEgaHJl Zj0iaHR0cHM6Ly9kaXNrdXYuZ2l0bGFiLmlvL2Rpc3RyaWJ1dGlvbnMvMS4wL2Rrc2RrLWZmaS1v Y2FtbC9Ea1NES0ZGSU9DYW1sX1N0ZC9Ea1NES0ZGSU9DYW1sX1N0ZC9pbmRleC5odG1sIj4NCmh0 dHBzOi8vZGlza3V2LmdpdGxhYi5pby9kaXN0cmlidXRpb25zLzEuMC9ka3Nkay1mZmktb2NhbWwv RGtTREtGRklPQ2FtbF9TdGQvRGtTREtGRklPQ2FtbF9TdGQvaW5kZXguaHRtbDwvYT4uIElmIHlv dSBicm93c2UgdGhhdA0KPGNvZGU+b2RvYzwvY29kZT4gZG9jdW1lbnRhdGlvbiwgYmUgc3VyZSB0 byBjbGljayBvbiBpdHMgbGlua3MgdG8gbW9kdWxlcy4gVGhlcmUgaXMgYSBsb3Qgb2YgZG9jdW1l bnRhdGlvbiBpbiB0aGVyZSwgYnV0IEkgaGF2ZW7igJl0IHlldCBvcmdhbml6ZWQgaXQgbmFycmF0 aXZlbHkuDQo8L2xpPjxsaT5Ea1NESyBGRkkgQyAtIDxhIGhyZWY9Imh0dHBzOi8vZGlza3V2LmNv bS9mZmktYy9oZWxwL2xhdGVzdC8iPmh0dHBzOi8vZGlza3V2LmNvbS9mZmktYy9oZWxwL2xhdGVz dC88L2E+LiBUaGlzIGlzIHRoZSBhbHJlYWR5LWNvbXBsZXRlZCBrZXJuZWwgb2YgdGhlIERrU0RL IEZGSSBwbGF0Zm9ybS4gT3RoZXIgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb25zIGxpa2UgRGtTREsg RkZJIE9DYW1sIHVzZSBpdC4gSG93ZXZlciwgSSBkb27igJl0IHRoaW5rIGl0DQogbWFrZXMgc2Vu c2UgZm9yIGFuIGVuZC11c2VyIHRvIHVzZSBpdCBkaXJlY3RseTogd3JpdGluZyBDT00gb2JqZWN0 cyBpbiBhIGxhbmd1YWdlIHdpdGhvdXQgb2JqZWN0cyBsaWtlIEMgaXMgdmVyYm9zZSwgYW5kIHRo ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lhbGxvcC9vY2FtbC1jdHlwZXMiPm9jYW1s LWN0eXBlczwvYT4gbGlicmFyeSBpcyBtYXR1cmUgYW5kIHJlbGF0aXZlbHkgZWFzeSB0byB1c2Uu IEJ1dCB0aGUgRkZJIEMgZG9jdW1lbnRhdGlvbiB3aWxsIGhlbHAgeW91IGRlYnVnIHN0YWNrIHRy YWNlcyBhbmQgZ2VuZXJhbGx5IHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4gQW5kIGlmIHlv dSB3YW50IGl0LCBmdWxsIHNvdXJjZSBpcyBhdmFpbGFibGUNCiB0b2RheSB3aXRoIGEgPGEgaHJl Zj0iaHR0cHM6Ly9kaXNrdXYuY29tL3ByaWNpbmciPkRrU0RLIGxpY2Vuc2U8L2E+IDwvbGk+PGxp PkRrU0RLIEZGSSBDJiM0MzsmIzQzOywgSmF2YSwgU3dpZnQgLSBXaGVuIHRoZXNlIGFyZSByZWFk eSBmb3IgcHVibGljIHJlbGVhc2UgSeKAmWxsIHNlbmQgYW5ub3VuY2VtZW50cy4gRWFybGllc3Qg d2lsbCBiZSBKYXZhIGluIGEgZmV3IG1vbnRocy4NCjwvbGk+PGxpPkRrU0RLIEZGSSBSdXN0LCBX ZWIgKFdBU00pLCBQeXRob24gLSBTaW5jZSB0aGUga2VybmVsIERrU0RLIEZGSSBDIGlzIEMxMSBz dGFuZGFyZHMgY29tcGxpYW50IGFuZCBpcyBhIGdsb3JpZmllZCBtYW5pcHVsYXRvciBvZiBtZW1v cnkgYnVmZmVycywgRGtTREsgRkZJIHNob3VsZCBoYXZlIGEgc3RyYWlnaHRmb3J3YXJkIFdBU00g aW1wbGVtZW50YXRpb24uIEJ1dCBJ4oCZbSBub3Qgc3VyZSBpZiB0aGVzZSB3aWxsIGdldCBkb25l IGJlY2F1c2UgSQ0KIGRvbuKAmXQgcGVyc29uYWxseSBuZWVkIHRoZXNlLiBJZiBhIGZldyBEa1NE SyBzdWJzY3JpYmVycyBuZWVkIHRoZW0sIEnigJlsbCBwcmlvcml0aXplIHRoZW0uDQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+UHJhY3RpY2FsIE9DYW1sPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHJhY3RpY2FsLW9jYW1sLzEyOTE3 LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHJhY3RpY2FsLW9jYW1sLzEyOTE3 LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2QyZThm MjkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkMmU4ZjI5Ij5vc3RlcmEgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkMmU4ZjI5 Ij4NCjxwPknigJl2ZSBiZWVuIHdyaXRpbmcgPGEgaHJlZj0iaHR0cHM6Ly9wcmFjdGljYWxvY2Ft bC5jb20iPlByYWN0aWNhbCBPQ2FtbDwvYT4gZm9yIGEgZmV3IHdlZWtzLCBhIGJsb2cgd2hlcmUg SeKAmXZlIGJlZW4gZXhwbG9yaW5nIGRpZmZlcmVudCBhc3BlY3RzIG9mIE9DYW1sLiBIZXJl4oCZ cyBzb21lIG9mIHRoZSBjb250ZW50IEnigJl2ZSBwdWJsaXNoZWQgc28gZmFyOg0KPC9wPg0KPHA+ PGEgaHJlZj0iaHR0cHM6Ly9wcmFjdGljYWxvY2FtbC5jb20vaG93LWktZXhwbG9yZS1kb21haW4t cHJvYmxlbXMtZmFzdGVyLWFuZC1jaGVhcGx5LWluLW9jYW1sLyI+aHR0cHM6Ly9wcmFjdGljYWxv Y2FtbC5jb20vaG93LWktZXhwbG9yZS1kb21haW4tcHJvYmxlbXMtZmFzdGVyLWFuZC1jaGVhcGx5 LWluLW9jYW1sLzwvYT4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vcHJhY3RpY2Fsb2NhbWwu Y29tL2EtcXVpY2stZ3VpZGUtdG8tZ2FkdHMtYW5kLXdoeS15b3UtYWludC1nb25uYS1uZWVkLXRo ZW0vIj5odHRwczovL3ByYWN0aWNhbG9jYW1sLmNvbS9hLXF1aWNrLWd1aWRlLXRvLWdhZHRzLWFu ZC13aHkteW91LWFpbnQtZ29ubmEtbmVlZC10aGVtLzwvYT4NCjwvcD4NCjxwPkp1c3QgdGhvdWdo dCB0aGF0IHNvbWUgb2YgeW91IG1heSBlbmpveSB0aGlzIDpwcmF5OiDigJMgSeKAmXZlIGdvdCBt b3JlIGluIHRoZSBwaXBlbGluZSwgYXMgeW91IGNhbiByZWFkDQo8YSBocmVmPSJodHRwczovL3By YWN0aWNhbG9jYW1sLmNvbS9oZWxsby13b3JsZC8iPmhlcmU8L2E+LiA8L3A+DQo8cD5Ib3BlIHlv dSBsaWtlIGl0IGFuZCBmZWVsIGZyZWUgdG8gc3ByZWFkIHRoZSB3b3JkIGVsc2V3aGVyZSA6c3Bl YWtpbmdfaGVhZDogPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+U3RhdGljIGFu YWx5c2lzIGluIEZsYW1iZGEgMiAtIFRhbGtzIGF0IHRoZSBDYW1iaXVtIFNlbWluYXI8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zdGF0aWMtYW5hbHlzaXMtaW4tZmxh bWJkYS0yLXRhbGtzLWF0LXRoZS1jYW1iaXVtLXNlbWluYXIvMTI5MTMvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvc3RhdGljLWFuYWx5c2lzLWluLWZsYW1iZGEtMi10YWxrcy1hdC10 aGUtY2FtYml1bS1zZW1pbmFyLzEyOTEzLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2I3YjExNzciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdiN2IxMTc3Ij5PQ2FtbFBybyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2I3YjExNzciPg0KPHA+V2UgYXJlIGRlbGlnaHRlZCB0byBhbm5v dW5jZSB0aGF0IHRoZXJlIGlzIGEgc2VtaW5hciBpbiB0aGUgQ2FtYml1bSB0ZWFtIGF0IElucmlh IHRvZGF5IGF0IDExYW0gQ0VTVCwgUGFyaXMsIHJlbGF0ZWQgdG8gRmxhbWJkYSAyLiBUaGUgc2Vt aW5hciBpcyBhY2Nlc3NpYmxlIG9ubGluZSBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9iYmIuaW5yaWEu ZnIvcG90LXhiOC1jcTQteTZ3Ij5odHRwczovL2JiYi5pbnJpYS5mci9wb3QteGI4LWNxNC15Nnc8 L2E+DQo8L3A+DQo8cD5UaGlzIHRhbGsgZm9sbG93cyBvdXIgPGEgaHJlZj0iaHR0cDovL2NhbWJp dW0uaW5yaWEuZnIvc2VtaW5haXJlcy90cmFuc3BhcmVudHMvMjAyMzA2MjYuVmluY2VudC5MYXZp cm9uLnBkZiI+DQpwcmV2aW91cyB0YWxrPC9hPiB3aGVyZSB3ZSBzaG93ZWQgd2hhdCBtb3RpdmF0 ZWQgb3VyIHdvcmsgb24gRmxhbWJkYSAyIHdpdGggSmFuZSBTdHJlZXQsIGFuZCBob3cgd2UgZGVz aWduZWQgaXQgdG8gYmUgbWFpbnRhaW5hYmxlLCBlZmZpY2llbnQsIHBvd2VyZnVsLCBhbmQgZXh0 ZW5zaWJsZS4gV2UgcHJlc2VudGVkIHNvbWUgY29uY3JldGUgYmVuZWZpdHMgb2YgdGhpcyBkZXNp Z246IG5ldyBvcHRpbWl6YXRpb25zLCBidXQgYWxzbyB0aGUgYWJpbGl0eQ0KIHRvIGVhc2lseSBp bnRlZ3JhdGUgbmV3IGxhbmd1YWdlIGZlYXR1cmVzLiA8L3A+DQo8cD5BbGwgQ2FtYml1bSBzZW1p bmFycyBhcmUgYW5ub3VuY2VkIGhlcmU6IDxhIGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZy L3NlbWluYXIuaHRtbCI+DQpodHRwOi8vY2FtYml1bS5pbnJpYS5mci9zZW1pbmFyLmh0bWw8L2E+ IDwvcD4NCjxwPkRlc2NyaXB0aW9uIG9mIHRvZGF54oCZcyB0YWxrOiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+VGl0bGU6IFN0YXRpYyBhbmFseXNpcyBpbiBGbGFtYmRhIDIgPC9saT48 bGk+RGF0ZTogTW9uZGF5IDI4dGggb2YgQXVndXN0LCAxMSBhbSAoUGFyaXMpIDwvbGk+PGxpPlNw ZWFrZXJzOiBWaW5jZW50IExhdmlyb24sIFBpZXJyZSBDaGFtYmFydCwgT0NhbWxQcm8gPC9saT48 bGk+QWJzdHJhY3Q6IEZvbGxvd2luZyBvdXIgcHJldmlvdXMgdGFsayBvbiBGbGFtYmRhIDIsIHdl IHdpbGwgcHJlc2VudCB0aGUgYW5hbHlzaXMgdXNlZCBieSBGbGFtYmRhIDIuIEl0IGlzIGZvcm1h bGl6ZWQgYXMgYW4gYWJzdHJhY3QgZG9tYWluLCBhbmQgd2Ugd2lsbCBwcmVzZW50IGl0cyBtYWpv ciBjaGFyYWN0ZXJpc3RpY3MgYW5kIGZlYXR1cmVzOiBzdXBwb3J0IGZvciBjb25zdGFudCBwcm9w YWdhdGlvbiBhbmQgaW1tdXRhYmxlIGJsb2NrDQogc2hhcGVzLCBhcyB3ZWxsIGFzIHJlbGF0aW9u YWwgcHJvcGVydGllcyBzdWNoIGFzIGFsaWFzZXMgYW5kIHByb2plY3Rpb25zLCBhbmQgc3VwcG9y dCBmb3IgaGlnaGVyLW9yZGVyIHZhbHVlcyB0aHJvdWdoIGNsb3N1cmVzIGFuZCBmdW5jdGlvbiBz dW1tYXJpZXMuIFdlIHdpbGwgc2hvdyBob3cgaXQgaW50ZWdyYXRlcyB3aXRoIHRoZSByZXN0IG9m IEZsYW1iZGEgMiwgYW5kIGluIHBhcnRpY3VsYXIgaG93IGl0IGFsbG93cyB1cyB0byBvcHRpbWl6 ZQ0KIHZhcmlvdXMgY29uY3JldGUgcGllY2VzIG9mIGNvZGUuIDwvbGk+PC91bD4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxYjJjYmFjIiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnMWIyY2JhYyI+T0NhbWxQcm8gbGF0ZXIgYWRkZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFiMmNiYWMiPg0KPHA+VGhl IHRhbGvigJlzIDxhIGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL3NlbWluYWlyZXMvdHJh bnNwYXJlbnRzLzIwMjMwODI4LlZpbmNlbnQuTGF2aXJvbi5wZGYiPg0Kc2xpZGVzPC9hPiBoYXZl IGJlZW4gcHVibGlzaGVkIG9uIHRoZSA8YSBocmVmPSJodHRwOi8vY2FtYml1bS5pbnJpYS5mci9z ZW1pbmFyLmh0bWwjcGFzdCI+DQpDYW1iaXVtIHNlbWluYXIgcGFnZTwvYT4uIDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iMTEiPkRvYyBSZXZpZXc6IEluc3RhbGwgT0NhbWwgYW5kIEdl dHRpbmcgU3RhcnRlZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Rv Yy1yZXZpZXctaW5zdGFsbC1vY2FtbC1nZXR0aW5nLXN0YXJ0ZWQvMTI5MjAvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZG9jLXJldmlldy1pbnN0YWxsLW9jYW1sLWdldHRpbmctc3Rh cnRlZC8xMjkyMC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzY0Y2JiNjMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2NGNiYjYzIj5DaHJp c3RpbmUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc2NGNiYjYzIj4NCjxwPldl4oCZcmUgbm93IHJlYWR5IGZvciBDb21tdW5pdHkgZmVlZGJh Y2sgb24gdGhlIEluc3RhbGwgT0NhbWwgdHV0b3JpYWwuIFRoaXMgb25lIGlzIHZlcnkgaW1wb3J0 YW50IGZvciBuZXdjb21lcnMuIFdl4oCZZCBsb3ZlIHlvdXIgaGVscCB0byBlbnN1cmUgdGhlIElu c3RhbGwgcGFnZSBpcyBjbGVhciwgc3RyYWlnaHRmb3J3YXJkLCBhbmQgY29tcGxldGUgZm9yIG5l d2NvbWVycy4NCjwvcD4NCjxwPkhlcmUgaXMgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDc1Ij5JbnN0YWxsIE9DYW1sIFBSPC9hPi4gTG9va2lu ZyBmb3J3YXJkIHRvIHlvdXIgZmVlZGJhY2shDQo8L3A+DQo8cD5BZnRlciB0aGF0LCBpdCB3b3Vs ZCBiZSBncmVhdCBpZiB5b3UgaGFkIHRpbWUgdG8gYWxzbyA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQzMSI+DQpyZXZpZXcgdGhlIG5leHQgdHdvIOKA nEdldHRpbmcgU3RhcnRlZOKAnSBkb2N1bWVudHM8L2E+OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+QSBUb3VyIG9mIE9DYW1sIDwvbGk+PGxpPkhvdyB0byBXcml0ZSBhbiBPQ2FtbCBQ cm9ncmFtIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLTEyIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTIiPk90aGVyIE9D YW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEyIj48 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVmNTcyNzUiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc1ZjU3Mjc1Ij5Gcm9tIHRoZSBvY2FtbC5vcmcgYmxvZzwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWY1NzI3NSI+DQo8cD5I ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCA8YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJsb2c8L2E+LiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tZWRpdW0uY29tL0Bw bGF5ZXJzcmViaXJ0aC9idWlsZGluZy10aGUtb2NhbWwtZ3B0LWxpYnJhcnktNjUwYzAwYjRkNzJi Ij5CdWlsZGluZyB0aGUgT0NhbWwgR1BUIGxpYnJhcnk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyMy0wOC0xNy15b3VyLXByb2dyYW1taW5nLWxhbmd1 YWdlLWFuZC1pdHMtaW1wYWN0LW9uLXRoZS1jeWJlcnNlY3VyaXR5LW9mLXlvdXItYXBwbGljYXRp b24iPllvdXIgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgYW5kIGl0cyBJbXBhY3Qgb24gdGhlIEN5YmVy c2VjdXJpdHkgb2YgWW91ciBBcHBsaWNhdGlvbjwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vc2lnbmFscy10aHJlYWRzLnNpbXBsZWNhc3QuY29tL2VwaXNvZGVzL2EtcG9ldHMtZ3VpZGUt dG8tcHJvZHVjdC1tYW5hZ2VtZW50LXdpdGgtcGV0ZXItYm9nYXJ0LWpvaG5zb24tX3NBSUZ6c1Mi PkEgUG9ldOKAmXMgR3VpZGUgdG8gUHJvZHVjdCBNYW5hZ2VtZW50IHdpdGggUGV0ZXIgQm9nYXJ0 LUpvaG5zb248L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwOi8vbWF0aC5hbmRyZWouY29tLzIw MjMvMDgvMTMvb24taW5kZW5maW5pdGUtdHJ1dGgtdmFsdWVzLyI+T24gaW5kZWZpbml0ZSB0cnV0 aCB2YWx1ZXM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyMy0wOC0xMC1rY2FzLWJ1aWxkaW5nLWEtbG9jay1mcmVlLXN0bS1mb3Itb2NhbWwtMi0yIj5L Y2FzOiBCdWlsZGluZyBhIExvY2stRnJlZSBTVE0gZm9yIE9DYW1sICgyLzIpPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDgtMDcta2Nhcy1idWls ZGluZy1hLWxvY2stZnJlZS1zdG0tZm9yLW9jYW1sLTEtMiI+S2NhczogQnVpbGRpbmcgYSBsb2Nr LWZyZWUgU1RNIGZvciBPQ2FtbCAoMS8yKTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v ZGV2LnRvL2J1cm5sZXlkZXYvb3V0cmVhY2h5LW1pZC1wb2ludC1wcm9ncmVzcy1lYTUiPk91dHJl YWNoeSBNaWQtUG9pbnQgUHJvZ3Jlc3M8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3Rh cmlkZXMuY29tL2Jsb2cvMjAyMy0wOC0wMi1vYnVpbGRlci1vbi1tYWNvcyI+T0J1aWxkZXIgb24g bWFjT1M8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAy My0wNy0zMS1vY2FtbC1pbi1zcGFjZS13ZWxjb21lLXNwYWNlb3MiPk9DYW1sIGluIFNwYWNlIC0g V2VsY29tZSBTcGFjZU9TITwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9tYXRoLmFuZHJl ai5jb20vMjAyMy8wNy8yOC92YXJpYXRpb25zLW9uLXdlaWhyYXVjaC1kZWdyZWVzLyI+VmFyaWF0 aW9ucyBvbiBXZWlocmF1Y2ggZGVncmVlcyAoQ2lFIDIwMjMpPC9hPg0KPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDctMjctcmVmbGVjdGlvbnMtb24tdGhl LW1pcmFnZW9zLXJldHJlYXQtaW4tbW9yb2NjbyI+UmVmbGVjdGlvbnMgb24gdGhlIE1pcmFnZU9T IFJldHJlYXQgaW4gTW9yb2NjbzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vbWVkaXVt LmNvbS9AYXJ5YW5nb2RhcmFfMTk4ODcvc2V0dGluZy11cC1vcGFtLWFuZC1taXJhZ2Vvcy1vbi1t YWNvcy12ZW50dXJhLW9uLWFwcGxlLXNpbGljb24tNTc4MTkwNjk5OTFhIj5TZXR0aW5nIHVwIE9w YW0gYW5kIE1pcmFnZU9TIG9uIE1hY09TIFZlbnR1cmEsIG9uIEFwcGxlIFNpbGljb248L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL21lZGl1bS5jb20vQGFyeWFuZ29kYXJhXzE5ODg3L3Vk cC1jbGllbnQtYW5kLXNlcnZlci1pbi1vY2FtbC1lMjAzMTE2YTk5N2MiPkNyZWF0aW5nIGEgVURQ IHNlcnZlciBhbmQgY2xpZW50IGluIE9DYW1sPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDctMTktc2FuZG1hcmstYm9vc3RpbmctbXVsdGljb3Jl LXByb2plY3RzLXdpdGgtcGVyZm9ybWFuY2UtYmVuY2htYXJraW5nIj5TYW5kbWFyazogQm9vc3Rp bmcgTXVsdGljb3JlIFByb2plY3RzIHdpdGggUGVyZm9ybWFuY2UgQmVuY2htYXJraW5nPC9hPg0K PC9saT48bGk+PGEgaHJlZj0iaHR0cDovL21hdGguYW5kcmVqLmNvbS8yMDIzLzA3LzE5L2NvbnRp bnVpdHktcHJpbmNpcGxlcy1hbmQtdGhlLWtsc3QtdGhlb3JlbS8iPkNvbnRpbnVpdHkgcHJpbmNp cGxlcyBhbmQgdGhlIEtMU1QgdGhlb3JlbTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v ZnJhbWEtYy5jb20vZmMtdmVyc2lvbnMvY29iYWx0Lmh0bWwiPlJlbGVhc2Ugb2YgRnJhbWEtQyAy Ny4xIChDb2JhbHQpPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9i bG9nLzIwMjMtMDctMTItb2NhbWwtY2ktcmVub3ZhdGVkIj5PQ2FtbC1DSSBSZW5vdmF0ZWQ8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyMy0wNy0wNy1t YWtpbmctb2NhbWwtNS1zdWNjZWVkLWZvci1kZXZlbG9wZXJzLWFuZC1vcmdhbmlzYXRpb25zIj5N YWtpbmcgT0NhbWwgNSBTdWNjZWVkIGZvciBEZXZlbG9wZXJzIGFuZCBPcmdhbmlzYXRpb25zPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3dlcmUtc3Bv bnNvcmluZy1zb21lMy8iPldl4oCZcmUgc3BvbnNvcmluZyBTb01FMzwvYT4NCjwvbGk+PGxpPjxh IGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL2Jsb2cvZmxvcmlhbi1jb21waWxlci13ZWVr bHktMjAyMy0wNy0wNSI+RmxvcmlhbuKAmXMgT0NhbWwgY29tcGlsZXIgd2Vla2x5LCA1IEp1bHkg MjAyMzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIz LTA3LTA1LXplcm8tZGF5LWF0dGFja3Mtd2hhdC1hcmUtdGhleS1hbmQtY2FuLWEtbGFuZ3VhZ2Ut bGlrZS1vY2FtbC1wcm90ZWN0LXlvdSI+WmVyby1EYXkgQXR0YWNrczogV2hhdCBBcmUgVGhleSwg YW5kIENhbiBhIExhbmd1YWdlIExpa2UgT0NhbWwgUHJvdGVjdCBZb3U/PC9hPg0KPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn YmQyNjgyOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZ2JkMjY4MjgiPk9sZCBDV048 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZ2JkMjY4MjgiPg0K PHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFu ZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhl IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVmPSJo dHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9ubGlu ZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmczYmY4NWI0Ij4NCjxw PjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+ IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Mailbox Transport; Tue, 22 Aug 2023 10:22:21 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Tue, 22 Aug 2023 10:22:20 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.32 via Frontend Transport; Tue, 22 Aug 2023 10:22:20 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37M9LkH1009787 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 22 Aug 2023 10:21:46 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37M9LYIK009772 for ; Tue, 22 Aug 2023 10:21:35 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 22 Aug 2023 11:21:32 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1E959E0BE9; Tue, 22 Aug 2023 11:21:31 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 76876E0133 for ; Tue, 22 Aug 2023 11:21:25 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Aug 2023 11:21:24 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 473455611CA; Tue, 22 Aug 2023 11:21:15 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZ1NonXJqiTF36yUiS0lre1MvoJg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 22 Aug 2023 10:20:38 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: d37624fe-9ada-4d45-3bf5-08dba2f14995 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,192,1684792800"; d="scan'208,217";a="121957113" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.469368, queueID=7B7AB5611D5 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOC0yMiBUdWUgMTE6MTggLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDguMTUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOC4yOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEF1Z3VzdCAxNSB0byAyMiwgMjAyMy4gPC9w Pg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxl IG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9 ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5vbml4IDAuMC41PC9hPiA8L2xpPjxs aT48YSBocmVmPSIjMiI+T0NhbWwgUGxhdGZvcm0gTmV3c2xldHRlcjogSnVseSAyMDIzPC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjMyI+QSBSb2FkbWFwIGZvciB0aGUgT0NhbWwgUGxhdGZvcm0gLSBT ZWVraW5nIFlvdXIgRmVlZGJhY2s8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmdiN2M1MjZkIj5P bGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPm9uaXggMC4wLjU8L2gy Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vbml4LTAtMC01LzEyODMx LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb25peC0wLTAtNS8xMjgzMS8xPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5NTljODA2IiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOTU5YzgwNiI+Uml6byBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzk1OWM4MDYiPg0KPHA+ SGkgYWxsISBJdCBpcyBteSBwbGVhc3VyZSB0byBhbm5vdW5jZSBhIHByb2plY3QgSSBoYXZlIGJl ZW4gd29ya2luZyBvbiBhbmQgdXNpbmcgZm9yIHNvbWUgdGltZS4NCjwvcD4NCjxwPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL29uaXgiPk9uaXg8L2E+IGlzIGEgdG9vbCBmb3IgYnVp bGRpbmcgT0NhbWwgcHJvamVjdHMgd2l0aA0KPGEgaHJlZj0iaHR0cHM6Ly9uaXhvcy5vcmcvIj5O aXg8L2E+LiBPbml4IHByb3ZpZGVzIGFuIGFsdGVybmF0aXZlIHRvIG9wYW0gYW5kIGtlZXBzIGZ1 bGwgY29tcGF0aWJpbGl0eSB3aXRoIG9wYW0gcmVwb3NpdG9yeSBhbmQgb3BhbSBmaWxlcy4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYmFkZGQ5MiIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2JhZGRkOTIiPkZlYXR1cmVzPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdiYWRkZDkyIj4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5GdWxseSBoZXJtZXRpYyBhbmQgZGV0ZXJtaW5pc3RpYyBidWlsZHMgYmFzZWQg b24gYSBsb2NrIGZpbGUuIFRoZSBsb2NrZmlsZSBpbmNsdWRlcyBwcmVjaXNlIHBhY2thZ2UgdmVy c2lvbnMgZ2VuZXJhdGVkIGZyb20geW91ciBvcGFtIGZpbGVzLCBzb3VyY2UgaGFzaGVzIGFuZCB0 aGUgR2l0IHJldmlzaW9uIG9mIHRoZSBvcGFtIHJlcG9zaXRvcnkgdXNlZCB0byBwZXJmb3JtIHRo ZSByZXNvbHV0aW9uLiBTZWUgYW4gZXhhbXBsZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L3Jpem8vb25peC1leGFtcGxlcy9ibG9iLzhiYTA2NDgzMTZjMWRkYjBiMDQxMTgxNWJiNzgwZDI1 ZjVkNGZjOTIvb2NhbWwtYmFzZS1jb21waWxlci9vbml4LWxvY2suanNvbiI+DQpoZXJlPC9hPi4g PC9saT48bGk+Um9idXN0IGNyb3NzLXByb2plY3QgY2FjaGUgcG93ZXJlZCBieSBOaXggc3RvcmUu IDwvbGk+PGxpPlN1cHBvcnQgZm9yIDxjb2RlPnBpbi1kZXBlbmRzPC9jb2RlPiB0byBhZGQgcGFj a2FnZXMgb3V0c2lkZSBvZiB0aGUgb3BhbSByZXBvc2l0b3J5ICh0aGlzIGNhbiBiZSB1c2VkIHRv IHRlc3QgZXhwZXJpbWVudGFsIHBhY2thZ2VzIG9yIHB1bGwgcmVxdWVzdHMsIGZvciBleGFtcGxl KS4NCjwvbGk+PGxpPlN1cHBvcnQgZm9yIGF1dG9tYXRlZCA8Y29kZT5kZXBleHRzPC9jb2RlPiBp bnN0YWxsYXRpb24gZnJvbSBuaXhwa2dzLiA8L2xpPjxsaT5Db25kaXRpb25hbCBjb21waWxhdGlv biBvZiA8Y29kZT53aXRoLXRlc3Q8L2NvZGU+LCA8Y29kZT53aXRoLWRvYzwvY29kZT4gYW5kIDxj b2RlPg0Kd2l0aC1kZXYtc2V0dXA8L2NvZGU+IGRlcGVuZGVuY2llcy4gSW4gcGFydGljdWxhciB0 byBzdXBwb3J0IGxvY2FsIGRldmVsb3BtZW50IHdvcmtmbG93cyB3aXRoDQo8Y29kZT5vY2FtbGZv cm1hdDwvY29kZT4sIDxjb2RlPm9jYW1sLWxzcC1zZXJ2ZXI8L2NvZGU+LCBldGMuIDwvbGk+PGxp PlN1cHBvcnQgZm9yIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9leHBlcmlt ZW50YWwtbmV3LWxheW91dC1mb3ItdGhlLW9jYW1sLXZhcmlhbnRzLXBhY2thZ2VzLWluLW9wYW0t cmVwb3NpdG9yeS82Nzc5Ij4NCmNvbXBpbGVyIHZhcmlhbnRzPC9hPiBzaW1pbGFyIHRvIG9wYW0g KGZvciBleGFtcGxlLCB0aGUgZmxhbWJkYSBjb21waWxlciBjYW4gYmUgYnVpbHQpLg0KPC9saT48 bGk+Q29tcGlsYXRpb24gb2YgbG9jYWxseSB2ZW5kb3JlZCBwYWNrYWdlcy4gSSB1c2UgdGhpcyB3 b3JrZmxvdyB0byB0ZXN0IHBhdGNoZXMgdG8gcHJvamVjdCBkZXBlbmRlbmNpZXMgYmVmb3JlIHN1 Ym1pdHRpbmcgUFJzLg0KPC9saT48bGk+R2VuZXJhdGlvbiBvZiBvcGFtLWNvbXBhdGlibGUg4oCc bG9ja2Vk4oCdIGZpbGVzLiBUaGlzIHdheSBhbnkgb25peCBwcm9qZWN0IGNhbiBhbHNvIGJlIHVz ZWQgZGlyZWN0bHkgd2l0aCBvcGFtLg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzhkMTQxMjMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmc4ZDE0MTIzIj5Nb3RpdmF0aW9uPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmc4ZDE0MTIzIj4NCjxwPk9uIGEgbW9yZSBwZXJzb25hbCBub3RlLCBJ IHN0YXJ0ZWQgd29ya2luZyBvbiBvbml4IG91dCBvZiBmcnVzdHJhdGlvbiB3aXRoIHRoZSBleGlz dGluZyB0b29scyBsaWtlIG9wYW0sIGVzeSwgbW9ub3JlcG8sIG9wYW0ybml4IGFuZCBvcGFtLW5p eC4gUGFydGlhbGx5IGJlY2F1c2UgdGhlIFVYIGZvciB3b3JraW5nIHdpdGggbG9jYWwgcHJvamVj dHMgaW4gYSByZXByb2R1Y2libGUgd2F5IGlzIG5vdCBncmVhdCwgYW5kIHBhcnRpYWxseSBiZWNh dXNlDQogSSBoYWQgYSBuZWVkIHRvIHByZWNpc2VseSBtYW5hZ2Ugc3lzdGVtIGRlcGVuZGVuY2ll cyB3aGljaCBpcyBvbmx5IHBvc3NpYmxlIHdpdGggTml4LiBJbiB0aGUgZW5kLCBJIGRlY2lkZWQg dG8gYnVpbGQgc29tZXRoaW5nIHRoYXQgaXMgaGlnaGx5IGZsZXhpYmxlIGFuZCB5ZXQgcmVxdWly ZXMgYWxtb3N0IG5vIE5peCBrbm93bGVkZ2UgYW5kIChob3BlZnVsbHkpIGlzIGVhc3kgdG8gdXNl LiBFdmVuIHRob3VnaCB0aGVyZSBhcmUgc3RpbGwgc29tZQ0KIHJvdWdoIGVkZ2VzLCBJ4oCZbSBj dXJyZW50bHkgdXNpbmcgb25peCBpbiBhbG1vc3QgYWxsIG9mIG15IE9DYW1sIHByb2plY3RzLiA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWQxZDkz MyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2VkMWQ5MzMiPkR1bmUtY29tcGF0aWJp bGl0eSBhbmQgZnV0dXJlIHdvcms8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlk PSJ0ZXh0LW9yZ2VkMWQ5MzMiPg0KPHA+SSBrbm93IHRoZXJlIGlzIHdvcmsgYmVpbmcgZG9uZSB0 byBpbmNsdWRlIGxvY2stZmlsZSBnZW5lcmF0aW9uIGFuZCBwYWNrYWdlIGZldGNoaW5nIGluIGR1 bmUgYW5kIEkgaG9wZSB0aGVyZSB3aWxsIGJlIGEgd2F5IHRvIGZpbmQgY29tcGF0aWJpbGl0eSBi ZXR3ZWVuIHRoZSBvbml4IGxvY2sgZm9ybWF0IGFuZCB0aGUgZHVuZSBsb2NrIGZvcm1hdC4gSSBk byBub3QgdGhpbmsgdGhhdCB0aGlzIG5ldyBkaXJlY3Rpb24gaW4gZHVuZSB3aWxsIGVsaW1pbmF0 ZQ0KIHRoZSBuZWVkIGZvciBvbml4IGJlY2F1c2UgZHVuZSB3aWxsIG5vdCBtYW5hZ2Ugc3lzdGVt IGRlcGVuZGVuY2llcyBpbiB0aGUgc2FtZSBkZXRlcm1pbmlzdGljIHdheSBhcyBOaXguIEZvciBp bnN0YW5jZSwgaW4gdGhlIFJ1c3QgY29tbXVuaXR5IHRoZXJlIGlzIGFuIGFidW5kYW5jZSBvZiBu aXgtYmFzZWQgdG9vbHMgdG8gd29yayB3aXRoIENhcmdv4oCZcyBsb2NrLWZpbGVzLiBJ4oCZbSB2 ZXJ5IGV4Y2l0ZWQgdG8gc2VlIGhvdyBkdW5lIHNvbHZlcyB0aGlzDQogcHJvYmxlbSBhbmQgd2Fu dCB0byBrZWVwIG9uaXggaW4gc3luYyB3aXRoIHRoaXMgZWZmb3J0LiA8L3A+DQo8cD5UaGVyZSBh cmUgc29tZSBvdGhlciBhcmVhcyB0aGF0IEnigJlkIGxpa2UgdG8gZXhwbG9yZSBpbiB0aGUgZnV0 dXJlIHRoYXQgaGF2ZW7igJl0IGJlZW4gYSBwcmlvcml0eSBmb3IgbWUsIG5hbWVseToNCjwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BZGRpbmcgc3VwcG9ydCBmb3IgY3Jvc3MtY29tcGls YXRpb24gKHdoaWNoIGFscmVhZHkgd29ya3MgZm9yIG5peCB3aXRoIEBhbm1vbnRlaXJv4oCZcyBl eGNlbGxlbnQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9uaXgtb2NhbWwvbml4LW92ZXJs YXlzIj5odHRwczovL2dpdGh1Yi5jb20vbml4LW9jYW1sL25peC1vdmVybGF5czwvYT4pLg0KPC9s aT48bGk+SW1wcm92aW5nIHN1cHBvcnQgZm9yIGZsYWtlcyBhbmQg4oCccHVyZeKAnSBwcm9qZWN0 IGJ1aWxkcy4gPC9saT48bGk+UHJvdmlkZSBhIE5peCBjYWNoZSB3aXRoIHByZS1idWlsdCBvcGFt IHBhY2thZ2VzLiA8L2xpPjxsaT5DcmVhdGUgYSBzaW1wbGUgQ0xJIHdpdGggY29tbWFuZHMgbGlr ZSA8Y29kZT5vbml4IGxvY2s8L2NvZGU+IGFuZCA8Y29kZT5vbml4IHNoZWxsPC9jb2RlPiB0aGF0 IGZ1bGx5IGFic3RyYWN0IG5peC4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjOWNkMzk5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBp ZD0ib3JnYzljZDM5OSI+RmluYWwgdGhvdWdodHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2M5Y2QzOTkiPg0KPHA+Tm90ZSB0aGF0IHRoaXMgcmVsZWFzZSBp cyBub3QgcHVibGlzaGVkIG9uIG9wYW0gYXMgY3VycmVudGx5IHRoZSB3b3JrZmxvdyBpcyBmdWxs eSBkcml2ZW4gYnkgTml4LiBTbyBmb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiB0aGUNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL29uaXgvdHJlZS9tYXN0ZXIjdXNhZ2UiPlJFQURN RTwvYT4gaWYgeW91IHdvdWxkIGxpa2UgdG8gZ2l2ZSBvbml4IGEgdHJ5LiBUaGVyZSBpcyBhbHNv IGEgZGVkaWNhdGVkIHJlcG9zaXRvcnkgd2l0aCBleGFtcGxlcyB0byBzaG93Y2FzZSBtb3JlIGFk dmFuY2VkIHVzZSBjYXNlczoNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL29uaXgt ZXhhbXBsZXMiPmh0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL29uaXgtZXhhbXBsZXM8L2E+Lg0KPC9w Pg0KPHA+SG9wZSBzb21lb25lIGZpbmRzIG9uaXggdXNlZnVsIGFuZCBoYXBweSB0byBhbnN3ZXIg YW55IHF1ZXN0aW9ucy4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnNmE1Yjc1NiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzZhNWI3NTYiPkJpa2FsIExlbSBhc2tlZCBhbmQgUml6byByZXBsaWVkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2YTViNzU2Ij4NCjxibG9ja3F1b3RlPg0K PHA+TmljZS4gPC9wPg0KPHA+UXVpY2sgcXVlc3Rpb24sIHdpdGggcmVnYXJkcyB0byBPQ2FtbCBj b21waWxlciBhbmQgcGFja2FnZXMsIGRvZXMgPGNvZGU+b255eDwvY29kZT4gZ2V0IGl0IGZyb20g b3BhbSByZXBvIGFuZCBub3QgdGhlIG5peHBrZ3M/IElmIHNvLCBob3cgdG8gZG8gSSB1c2UgdGhl IE9DYW1sIDUuMSByYzE/IExpa2UgYmVsb3cgcGVyaGFwcyA/DQo8L3A+DQo8cHJlIGNsYXNzPSJl eGFtcGxlIiBpZD0ib3JnZmQwMjUyMCI+DQppbiBvbml4LmVudiB7DQogIHBhdGggPSAuLy47DQog IGRlcHMgPSB7ICZxdW90O29jYW1sJnF1b3Q7ID0gJnF1b3Q7NS4xLjB+cmMxJnF1b3Q7OyB9Ow0K fQ0KPC9wcmU+DQo8cD5IbW1tIOKApiBwZXJocGFzIHRoaXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL3Jpem8vb25peC1leGFtcGxlcy9ibG9iL21hc3Rlci9vY2FtbC12YXJpYW50cy9kZWZh dWx0Lm5peCI+DQpodHRwczovL2dpdGh1Yi5jb20vcml6by9vbml4LWV4YW1wbGVzL2Jsb2IvbWFz dGVyL29jYW1sLXZhcmlhbnRzL2RlZmF1bHQubml4PC9hPiA/DQo8L3A+DQo8L2Jsb2NrcXVvdGU+ DQo8cD5IaSBAQmlrYWxHdXJ1bmcuIE9uaXggd29ya3Mgd2l0aCB0aGUgb3BhbSByZXBvc2l0b3J5 LCBidXQgY2FuIGFsc28gdXNlIHRoZSBvY2FtbCBjb21waWxlciBwYWNrYWdlIGZyb20gbml4cGtn cyB3aGVuIGFuIGVxdWl2YWxlbnQgdmVyc2lvbiBpcyBhdmFpbGFibGUuDQo8L3A+DQo8cD5IZXJl IGFyZSBzb21lIGFkZGl0aW9uYWwgY29uc2lkZXJhdGlvbnM6IDwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5UaGUgbml4cGtncyByZXBvc2l0b3J5IHdpbGwgYWx3YXlzIGxhZyBiZWhpbmQg b3BhbSByZXBvc2l0b3J5IHNvIHJlY2VudCBvY2FtbCBjb21waWxlciB2ZXJzaW9ucyB3aWxsIG5v dCBiZSBhdmFpbGFibGU7DQo8L2xpPjxsaT5UaGUgPGNvZGU+b2NhbWw8L2NvZGU+IHBhY2thZ2Ug b24gb3BhbSBpcyBhIHZpcnR1YWwgcGFja2FnZSBhbmQgcmVxdWlyZXMgdGhhdCBhIGNvbmNyZXRl IGNvbXBpbGVyIHBhY2thZ2UgaXMgaW5zdGFsbGVkOg0KPGNvZGU+b2NhbWwtc3lzdGVtPC9jb2Rl PiwgPGNvZGU+b2NhbWwtdmFyaWFudHM8L2NvZGU+IG9yIDxjb2RlPm9jYW1sLWJhc2UtY29tcGls ZXI8L2NvZGU+Lg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkZvciBtb3N0IHVzZXJzIHRoaXMg c2hvdWxkIGJlIDxjb2RlPm9jYW1sLWJhc2UtY29tcGlsZXI8L2NvZGU+IHNpbmNlIHRoYXTigJlz IHdoYXQgb3BhbSB1c2VzIGJ5IGRlZmF1bHQuDQo8L2xpPjxsaT5JZiB5b3Ugd2FudCB0byBidWls ZCBhIGN1c3RvbSBjb21waWxlciB2YXJpYW50LCB1c2UgPGNvZGU+b2NhbWwtdmFyaWFudHM8L2Nv ZGU+Lg0KPC9saT48bGk+SWYgdGhlIGNvbXBpbGVyIHZlcnNpb24geW91IHdpc2ggdG8gdXNlIGlz IG9uIG5peHBrZ3MsIGZlZWwgZnJlZSB0byB1c2UgdGhhdCBvbmUgdG8gYXZvaWQgYnVpbGRpbmcg dGhlIGNvbXBpbGVyIGZyb20gc291cmNlLg0KPC9saT48L3VsPg0KPC9saT48bGk+VGhlIGNvbWJp bmF0aW9ucyBvZiB2ZXJzaW9ucyBhbmQgb3B0aW9ucyBmb3IgdGhlIGRpZmZlcmVudCBjb21waWxl ciB2YXJpYW50cyBvZmZlciBhIGxvdCBvZiBmbGV4aWJpbGl0eSBidXQgY2FuIGJlIGEgYml0IGhh cmQgdG8gdW5kZXJzdGFuZC4gQ2hlY2sgdGhlIHZlcnNpb25zIGFuZCBkZXBlbmRlbmNpZXMgZm9y IGVhY2ggY29tcGlsZXIgcGFja2FnZSBpZiB5b3UgaGF2ZSB2ZXJ5IHNwZWNpZmljIG5lZWRzLg0K PC9saT48L3VsPg0KPHA+Tm90ZSB0aGF0IHRoZXJlIGlzIG5vIDxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwub3JnL3Avb2NhbWwvbGF0ZXN0Ij48Y29kZT5vY2FtbDwvY29kZT48L2E+IHBhY2thZ2Ugd2l0 aCB2ZXJzaW9uDQo8Y29kZT41LjEuMH5yYzE8L2NvZGU+LCBidXQgdGhlcmUgaXMgYSA8YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9wL29jYW1sLWJhc2UtY29tcGlsZXIvNS4xLjB+cmMxIj4NCjxj b2RlPm9jYW1sLWJhc2UtY29tcGlsZXI8L2NvZGU+PC9hPiBwYWNrYWdlIHdpdGggdGhhdCB2ZXJz aW9uLiBTbywgaW4gc2hvcnQsIHlvdSBzaG91bGQgdHJ5Og0KPC9wPg0KPHByZSBjbGFzcz0iZXhh bXBsZSIgaWQ9Im9yZzRlYWFjMzEiPg0Kb25peC5lbnYgew0KICBwYXRoID0gLi8uOw0KICBkZXBz ID0geyAmcXVvdDtvY2FtbC1iYXNlLWNvbXBpbGVyJnF1b3Q7ID0gJnF1b3Q7NS4xLjB+cmMxJnF1 b3Q7OyB9Ow0KfQ0KPC9wcmU+DQo8cD5JIGhhdmUgdXBkYXRlZCB0aGUgaW5zdHJ1Y3Rpb25zIGlu IHRoZSBSRUFETUUgdG8gbWFrZSB0aGlzIGEgbGl0dGxlIGJpdCBjbGVhcmVyOg0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3Jpem8vb25peCNzcGVjaWZ5aW5nLWFuLW9jYW1sLWNvbXBpbGVy LXBhY2thZ2UiPmh0dHBzOi8vZ2l0aHViLmNvbS9yaXpvL29uaXgjc3BlY2lmeWluZy1hbi1vY2Ft bC1jb21waWxlci1wYWNrYWdlPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIi Pk9DYW1sIFBsYXRmb3JtIE5ld3NsZXR0ZXI6IEp1bHkgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci1qdWx5LTIwMjMv MTI4NzIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3 c2xldHRlci1qdWx5LTIwMjMvMTI4NzIvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmczNjBlZTc1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn MzYwZWU3NSI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmczNjBlZTc1Ij4NCjxwPldlbGNvbWUgdG8gdGhlIGZvdXJ0 aCBpbnN0YWxsbWVudCBvZiB0aGUgT0NhbWwgUGxhdGZvcm0gbmV3c2xldHRlciEgPC9wPg0KPHA+ VGhpcyBlZGl0aW9uIGJyaW5ncyB0aGUgbGF0ZXN0IGltcHJvdmVtZW50cyBtYWRlIGluIEp1bHkg dG8gaW1wcm92ZSB0aGUgT0NhbWwgZGV2ZWxvcGVyIGV4cGVyaWVuY2Ugd2l0aCB0aGUNCjxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxhdGZvcm0iPk9DYW1sIFBsYXRmb3JtPC9hPi4g QXMgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL3BsYXRmb3Jt LW5ld3NsZXR0ZXIiPg0KcHJldmlvdXMgdXBkYXRlczwvYT4sIHRoZSBuZXdzbGV0dGVyIGZlYXR1 cmVzIHRoZSBkZXZlbG9wbWVudCB3b3JrZmxvd3MgY3VycmVudGx5IGJlaW5nIGV4cGxvcmVkIG9y IGVuaGFuY2VkLg0KPC9wPg0KPHA+VGhpcyBpc3N1ZSBlbmRlZCB1cCBhIGJpdCBzaG9ydGVyIHRo YW4gdGhlIHByZXZpb3VzIG9uZXMsIGFzIHdl4oCZcmUgZW50ZXJpbmcgc3VtbWVydGltZSBpbiBF dXJvcGUuIFN0aWxsLCB0aGlzIG1vbnRoIHNhdyBzb21lIGdyZWF0IHByb2dyZXNzIG9uIHN1cHBv cnQgZm9yIHBhY2thZ2UgbWFuYWdlbWVudCBpbiBEdW5lLCB3aXRoIG9ubHkgYSBmZXcNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy84MDk2Ij5yZW1haW5pbmcg YmxvY2tlcnM8L2E+IHRvIGJ1aWxkIHNpbXBsZSBvcGFtIHBhY2thZ2VzLiBXZSBhbHNvIHNhdyB0 aGUgcmVsZWFzZSBvZiB0aGUgc2Vjb25kIGFscGhhIG9mIHRoZSBtb3N0IGFudGljaXBhdGVkIG9w YW0gMi4yLCB3aGljaCBjb21lcyB3aXRoIGFuIGF1dG9tYXRlZCBpbnN0YWxsYXRpb24gb2YgQ3ln d2luIG9uIFdpbmRvd3MsIGFsbG93aW5nDQogdXNlcnMgdG8gaW5zdGFsbCBhIGNvbXBsZXRlIGRl dmVsb3BtZW50IGVudmlyb25tZW50IHVzaW5nIG9wYW3igJlzIGluc3RhbGxhdGlvbiBzY3JpcHQg YWxvbmUhDQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QnVpbGRpbmcgUGFja2FnZXMN Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5bRHVuZV0gRXhwbG9yaW5nIFBhY2thZ2UgTWFuYWdl bWVudCBpbiBEdW5lIDwvbGk+PGxpPltvcGFtXSBOYXRpdmUgU3VwcG9ydCBmb3IgV2luZG93cyBp biBvcGFtIDIuMiA8L2xpPjxsaT5bRHVuZV0gZHVuZSBtb25pdG9yOiBDb25uZWN0IHRvIGEgUnVu bmluZyBEdW5lIGJ1aWxkIDwvbGk+PC91bD4NCjwvbGk+PGxpPkdlbmVyYXRpbmcgRG9jdW1lbnRh dGlvbg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPltvZG9jXSBBZGQgU2VhcmNoIENhcGFiaWxp dGllcyB0byBvZG9jIDwvbGk+PGxpPltvZG9jXSBTeW50YXggZm9yIEltYWdlcyBhbmQgQXNzZXRz IGluIG9kb2MgPC9saT48L3VsPg0KPC9saT48bGk+RWRpdGluZyBhbmQgUmVmYWN0b3JpbmcgQ29k ZQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPltNZXJsaW5dIFN1cHBvcnQgZm9yIFByb2plY3Qt V2lkZSBSZWZlcmVuY2VzIGluIE1lcmxpbiA8L2xpPjxsaT5bTWVybGluXSBJbXByb3ZpbmcgTWVy bGlu4oCZcyBQZXJmb3JtYW5jZSA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg5M2ViYzYiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmc4OTNlYmM2Ij5SZWxlYXNlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NCIgaWQ9InRleHQtb3JnODkzZWJjNiI+DQo8cD5IZXJlIGFyZSBhbGwgdGhlIG5ldyB2ZXJzaW9u cyBvZiBQbGF0Zm9ybSB0b29scyB0aGF0IHdlcmUgcmVsZWFzZWQgdGhpcyBtb250aC4gSGF2ZSBh IGxvb2sgYXQgdGhlDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2ciPk9DYW1s IENoYW5nZWxvZzwvYT4gdG8gcmVhZCByZWxlYXNlIGFubm91bmNlbWVudHMhDQo8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9n LzIwMjMtMDctMDQtdXRvcC0yLjEzLjAiPlVUb3AgMi4xMy4wPC9hPiA8L2xpPjxsaT48YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyMy0wNy0xMS11dG9wLTIuMTMuMSI+VVRv cCAyLjEzLjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxv Zy8yMDIzLTA3LTA2LWR1bmUtMy45LjEiPkR1bmUgMy45LjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDIzLTA3LTI1LWR1bmUtMy45LjIiPkR1bmUg My45LjI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8y MDIzLTA3LTI2LW9wYW0tMi0yLTAtYWxwaGEyIj5vcGFtIDIuMi4wfmFscGhhMjwvYT4NCjwvbGk+ PGxpPjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDIzLTA3LTIwLW9jYW1s Zm9ybWF0LTAuMjYuMCI+T0NhbWxGb3JtYXQgMC4yNi4wPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzc3OTQzNGQiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc3Nzk0MzRkIj5CdWlsZGluZyBQYWNrYWdlczwvaDQ+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNzc5NDM0ZCI+PC9kaXY+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzhhMGNkYjQiPjwvYT48Yj5bRHVuZV08 L2I+IEV4cGxvcmluZyBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZTxicj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc4YTBjZGI0Ij4NCjxwPkNvbnRyaWJ1dG9yczog QHJncmluYmVyZyAoVGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJViAoVGFyaWRlcyksIEBncmlk YnVncyAoVGFyaWRlcyksIEBraXQtdHkta2F0ZSAoVGFyaWRlcykNCjwvcD4NCjxwPkluIEp1bHks IHRoZSBEdW5lIFBhY2thZ2UgTWFuYWdlbWVudCB0ZWFtIHdvcmtlZCBvbiBhdXRvbWF0aWNhbGx5 IGRvd25sb2FkaW5nIHRoZQ0KPGNvZGU+b3BhbS1yZXBvc2l0b3J5PC9jb2RlPiB0byBlbnN1cmUg aXQgaXMgcmVhZGlseSBhdmFpbGFibGUgZm9yIGxvY2tpbmcgd2hlbiBubyBvdGhlciBzb3VyY2Ug b2YNCjxjb2RlPm9wYW0tcmVwb3NpdG9yeTwvY29kZT4gaXMgc3BlY2lmaWVkLiA8L3A+DQo8cD5U aGUgRHVuZSB2ZXJzaW9uIG9mIG9wYW0gPGNvZGU+c3Vic3RzPC9jb2RlPiBzdXBwb3J0IHdhcyBp bXBsZW1lbnRlZCwgYW5kIHRoZSB2YXJpYWJsZSBlbnZpcm9ubWVudCB3YXMgZW5oYW5jZWQgd2hl biBleHBhbmRpbmcgb3BhbSBwYWNrYWdlIGZpbHRlcnMgaW4gdGhlIHNvbHZlci4NCjwvcD4NCjxw PlN1cHBvcnQgZm9yIHN5c3RlbSB2YXJpYWJsZXMgd2FzIGFsc28gYWRkZWQsIHdoaWNoIGNhbiBi ZSByZWFkIGZyb20gdGhlIHdvcmtzcGFjZSBmaWxlIG9yIGluZmVycmVkIGZyb20gdGhlIGN1cnJl bnQgc3lzdGVtLiBOb3RhYmx5LCB1bnNldCBzeXN0ZW0gdmFyaWFibGVzIGFyZSBub3cgdHJlYXRl ZCBhcyB3aWxkY2FyZHMgYnkgdGhlIHNvbHZlciwgYWxsb3dpbmcgdGhlIGdlbmVyYXRpb24gb2Yg YSBzaW5nbGUNCjxjb2RlPmxvY2tkaXI8L2NvZGU+IHN1aXRhYmxlIGZvciBhIHJhbmdlIG9mIHN5 c3RlbXMuIFRoaXMgY2hhbmdlIGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIGRpZmZlcmVudA0KPGNv ZGU+bG9ja2RpcnM8L2NvZGU+IGZvciB2YXJpb3VzIHN5c3RlbXMsIHN1Y2ggYXMgbWFjT1MgYW5k IExpbnV4LiA8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkFkZCBmaWVsZCB0byBpbmRpY2F0ZSBPQ2FtbCBwYWNrYWdlIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzgwNzkiPg0Kb2NhbWwvZHVuZSM4 MDc5PC9hPiA8L2xpPjxsaT5DcmVhdGVkIGlzc3VlcyB0byB0cmFjayByZW1haW5pbmcgd29yayBi dWlsZGluZyBvcGFtIHBhY2thZ2VzIGluIER1bmUsIGFsb25nIHdpdGggYQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzLzgwOTYiPm1ldGEgaXNzdWU8L2E+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+UGF0Y2ggZmlsZXMgaW4gPGNvZGU+bG9ja2RpcjwvY29k ZT4g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy84MDkz Ij4NCm9jYW1sL2R1bmUjODA5MzwvYT4gPC9saT48bGk+T3BhbSB2YXJpYWJsZSBpbnRlcnBvbGF0 aW9uIHdoaWxlIGJ1aWxkaW5nIHBhY2thZ2VzIHdpdGggRHVuZSDigJMgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzLzgwOTQiPg0Kb2NhbWwvZHVuZSM4MDk0PC9h PiA8L2xpPjxsaT5QZXItcGFja2FnZSBmaWxlcyBmcm9tIDxjb2RlPm9wYW0tcmVwb3NpdG9yeTwv Y29kZT4gaW4gPGNvZGU+bG9ja2RpcjwvY29kZT4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvZHVuZS9pc3N1ZXMvODA5NSI+b2NhbWwvZHVuZSM4MDk1PC9hPiA8L2xpPjxs aT5PcGFtIDxjb2RlPmJ1aWxkPC9jb2RlPiBhbmQgPGNvZGU+aW5zdGFsbDwvY29kZT4gY29tbWFu ZHMgaW4gRHVuZSA8Y29kZT5sb2NrZGlyPC9jb2RlPiDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy84MTU0Ij5vY2FtbC9kdW5lIzgxNTQ8L2E+IDwvbGk+ PC91bD4NCjwvbGk+PGxpPkNvbmRpdGlvbmFsIGRlcGVuZGVuY2llcyBpbiA8Y29kZT5sb2NrZGly PC9jb2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC84 MDUwIj4NCm9jYW1sL2R1bmUjODA1MDwvYT4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5DaGFp biBvZiBjb21taXRzIHJlYWR5IHRvIGdvIGludG8gbmV3IFBScyBvbmNlIHRoaXMgaXMgbWVyZ2Vk LCB3aGljaCB3aWxsIGV4dGVuZCB0aGlzIHRvIGFsbG93IHVzZXJzIHRvIHBsYWNlIGNvbnN0cmFp bnRzIG9uIHN5c3RlbQ0KPGNvZGU+ZW52IHZhcnM8L2NvZGU+IGluIGJ1aWxkIGNvbnRleHRzIGFu ZCB0byBzb2x2ZSBmb3IgYSByYW5nZSBvZiBzeXN0ZW1zIGF0IG9uY2UuIEZvciBleGFtcGxlLCB0 aGlzIGNhbiBiZSB1c2VkIHRvIGdlbmVyYXRlIGENCjxjb2RlPmxvY2tkaXIgfnRoYXQgd29ya3Mg b24gYm90aCBtYWNPUyBhbmQgTGludXggb3IgZ2VuZXJhdGUgYSB+bG9ja2RpcjwvY29kZT4gZm9y IG1hY09TIHdoaWxlIHJ1bm5pbmcgb24gYSBMaW51eCBtYWNoaW5lLg0KPC9saT48L3VsPg0KPC9s aT48bGk+U29sdmVyIGNhbiBzb2x2ZSBmb3IgbXVsdGlwbGUgZW52aXJvbm1lbnRzIGluIHNpbmds ZSA8Y29kZT5sb2NrZGlyPC9jb2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL2R1bmUvcHVsbC84MTg4Ij4NCm9jYW1sL2R1bmUjODE4ODwvYT4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5UaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gdXNlIGEgc2luZ2xlIDxjb2RlPmxv Y2tkaXI8L2NvZGU+IGFjcm9zcyBtdWx0aXBsZSBkaWZmZXJlbnQgZW52aXJvbm1lbnRzIChlLmcu LCBkaWZmZXJlbnQgb3BlcmF0aW5nIHN5c3RlbXMpLg0KPC9saT48L3VsPg0KPC9saT48bGk+SW1w bGVtZW50IGF1dG9tYXRpYyBkb3dubG9hZCBvZiA8Y29kZT5vcGFtLXJlcG9zaXRvcnk8L2NvZGU+ IHdpdGggdGhlIG9wdGlvbiB0byB1c2UgYW4gZXhpc3RpbmcgZm9sZGVyIG9yIGN1c3RvbWlzaW5n IHRoZSBkZWZhdWx0IFVSTCAoZGVmYXVsdGluZyB0byB0aGUNCjxjb2RlPm9wYW0tcmVwb3NpdG9y eTwvY29kZT4gdGFyYmFsbCksIHRodXMgcmVtb3ZpbmcgdGhlIG5lZWQgdG8gcGlnZ3liYWNrIG9u IHRoZQ0KPGNvZGU+b3BhbS1yZXBvc2l0b3J5PC9jb2RlPiBvZiBhIHN3aXRjaCBhbmQgcmVtb3Zp bmcgc3VwcG9ydCBmb3IgaXQsIHNvbWV3aGF0IHNpbXBsaWZ5aW5nIHRoZSB3YXkgdGhlDQo8Y29k ZT4waW5zdGFsbDwvY29kZT4gc29sdmVyIGlzIHJ1biDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvcHVsbC84MTA1Ij4NCm9jYW1sL2R1bmUjODEwNTwvYT4gPC9saT48 bGk+V29yayBvbiBpbXBsZW1lbnRpbmcgdGhlIHN1YnN0aXR1dGlvbiBzdXBwb3J0IGZyb20gb3Bh bSBhcyBwYXJ0IG9mIER1bmUgYnkgaG9va2luZyB1cCB0aGUgZnVuY3Rpb25zIGZyb20gdGhlIG9w YW0gQVBJIHdpdGggdGhlIER1bmUgcnVsZXMg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS9wdWxsLzgyMjUiPm9jYW1sL2R1bmUjODIyNTwvYT4gPC9saT48bGk+Q3Jl YXRpb24gb2YgZmlsZXMgZnJvbSA8Y29kZT4uaW48L2NvZGU+IHRlbXBsYXRlcyB0byBtYXRjaCB0 aGUgb3BhbSA8Y29kZT5zdWJzdHM8L2NvZGU+IGZpZWxkL2ZlYXR1cmUg4oCTDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzgyMjUiPm9jYW1sL2R1bmUjODIyNTwv YT4gPC9saT48bGk+UHJvZ3Jlc3Mgb24gY3JlYXRpbmcgYSB2YXJpYWJsZSBlbnZpcm9ubWVudCBm b3IgcGFja2FnZSBzb2x2aW5nOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlNldCB0aGUgPGNv ZGU+b3BhbS12ZXJzaW9uPC9jb2RlPiB2YXJpYWJsZSBkdXJpbmcgc29sdmluZyDigJMgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC84MjY3Ij4NCm9jYW1sL2R1bmUj ODI2NzwvYT4gPC9saT48bGk+RG9u4oCZdCB3YXJuIG9uIHVuZGVmaW5lZCBvcGFtIHZhcmlhYmxl cyB3aGVuIHNvbHZpbmcg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L3B1bGwvODI3NSI+DQpvY2FtbC9kdW5lIzgyNzU8L2E+IDwvbGk+PC91bD4NCjwvbGk+PC91bD4N CjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzk5MzBiMDQiPjwvYT48Yj5bb3BhbV08L2I+IE5h dGl2ZSBTdXBwb3J0IGZvciBXaW5kb3dzIGluIG9wYW0gMi4yPGJyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzk5MzBiMDQiPg0KPHA+Q29udHJpYnV0b3JzOiBAcmpi b3UgKE9DYW1sUHJvKSwgQGtpdC10eS1rYXRlIChUYXJpZGVzKSwgQGRyYTI3IChUYXJpZGVzKSwg QEFsdEdyIChPQ2FtbFBybykNCjwvcD4NCjxwPlRoZSBmaXJzdCBhbHBoYSBvZiB0aGUgaGlnaGx5 LWFudGljaXBhdGVkIG9wYW0gMi4yIHdhcyByZWxlYXNlZCBsYXN0IG1vbnRoLiBUaGUgc2Vjb25k IGFscGhhIG9mIG9wYW0gMi4yIHdhcyByZWxlYXNlZCB0aGlzIG1vbnRoLg0KPC9wPg0KPHA+V2hp bGUgdGhlIGZpcnN0IGFscGhhIGludHJvZHVjZWQgbmF0aXZlIFdpbmRvd3MgY29tcGF0aWJpbGl0 eSwgdGhlIHNlY29uZCBhbHBoYSBvZmZlcnMgc2ltcGxlciBpbml0aWFsaXNhdGlvbiBmb3IgV2lu ZG93cywgZWxpbWluYXRpbmcgdGhlIGRlcGVuZGVuY3kgb24gYSBwcmVleGlzdGluZyBDeWd3aW4g VU5JWC1saWtlIGVudmlyb25tZW50LiBJbnN0ZWFkLCBvcGFtIG5vdyBvZmZlcnMgYW4gZW1iZWRk ZWQsIGZ1bGx5LW1hbmFnZWQgQ3lnd2luDQogaW5zdGFsbCBkdXJpbmcgaW5pdGlhbGlzYXRpb24u IDwvcD4NCjxwPkhhdmUgYSBsb29rIGF0IHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9j aGFuZ2Vsb2cvMjAyMy0wNy0yNi1vcGFtLTItMi0wLWFscGhhMiI+DQpyZWxlYXNlIGFubm91bmNl bWVudDwvYT4gZm9yIG1vcmUgZGV0YWlscywgYW5kIGpvaW4gdGhlIGRpc2N1c3Npb24gdG8gc2hh cmUgeW91ciBmZWVkYmFjayBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1vcGFtLTItMi0wLWFscGhhMi1yZWxlYXNlLzEyNjk5Ij5EaXNjdXNzPC9hPi4NCjwvcD4N CjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+TWFr ZSA8Y29kZT5vcGFtIGluaXQ8L2NvZGU+IGludGVybmFsbHkgaW5zdGFsbCBDeWd3aW4gYXV0b21h dGljYWxseSBieSBkZWZhdWx0IGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIHRvIGluc3RhbGwg aXQgbWFudWFsbHkg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9w dWxsLzU1NDUiPm9wYW0jNTU0NTwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBp ZD0ib3JnNGMyMGI5NSI+PC9hPjxiPltEdW5lXTwvYj4gPGNvZGU+ZHVuZSBtb25pdG9yPC9jb2Rl PjogQ29ubmVjdCB0byBhIFJ1bm5pbmcgRHVuZSBidWlsZDxicj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC01IiBpZD0idGV4dC1vcmc0YzIwYjk1Ij4NCjxwPkNvbnRyaWJ1dG9yczogQEFsaXp0 ZXIgPC9wPg0KPHA+VGhpcyBtb250aCwgQEFsaXp0ZXIgc3RhcnRlZCB3b3JraW5nIG9uIGEgbmV3 IDxjb2RlPmR1bmUgbW9uaXRvcjwvY29kZT4gY29tbWFuZCB0aGF0IGNvbm5lY3RzIHRvIGEgRHVu ZSBidWlsZCB0aGF04oCZcyBydW5uaW5nIGluIHdhdGNoIG1vZGUgKHZpYSBEdW5lIFJQQykgYW5k IGJlaGF2ZXMgYXMgaWYgeW91IGV4ZWN1dGVkDQo8Y29kZT5kdW5lIGJ1aWxkIC13PC9jb2RlPi4g PC9wPg0KPHA+SW4gdGhlIGZ1dHVyZSwgdGhlIHBsYW4gaXMgdG8gbWVyZ2UgPGNvZGU+ZHVuZSBt b25pdG9yPC9jb2RlPiBpbnRvIHRoZSA8Y29kZT5kdW5lIGJ1aWxkPC9jb2RlPiBjb21tYW5kLCBz byBydW5uaW5nIGEgYnVpbGQgd2lsbCBzcGF3biBhbiBSUEMgc2VydmVyIGJ5IGRlZmF1bHQgYW5k IGFueSBzdWJzZXF1ZW50IGJ1aWxkIHdpbGwgY29ubmVjdCB0byB0aGUgUlBDIHNlcnZlciB0byBk aXNwbGF5IHRoZSBidWlsZCBpbmZvcm1hdGlvbi4NCjwvcD4NCjxwPlRoaXMgaXMgZXNwZWNpYWxs eSBleGNpdGluZyBpbiB0aGUgY29udGV4dCBvZiBEdW5lIHBhY2thZ2UgbWFuYWdlbWVudC4gRWRp dG9ycyB3aWxsIGJlIGFibGUgdG8gY29ubmVjdCB0byBhIHJ1bm5pbmcgRHVuZSBSUEMgc2VydmVy IChkaXJlY3RseSBvciB0aHJvdWdoIE9DYW1sIExTUCkgdG8gcHJvdmlkZSB0aGUgcmVsZXZhbnQg ZWRpdG9yc+KAmSBmZWF0dXJlcy4gV2l0aA0KPGNvZGU+ZHVuZSBtb25pdG9yPC9jb2RlPiwgdGhl cmUgd2lsbCBub3QgYmUgbGltaXRhdGlvbnMgaW4gdGhlIG51bWJlciBvZiBlZGl0b3JzIHlvdSBj YW4gb3BlbiBmb3IgdGhlIHNhbWUgcHJvamVjdCENCjwvcD4NCjxwPldpdGggcmVjZW50IHdvcmsg b24gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXBsYXRmb3JtLW5l d3NsZXR0ZXItYXByaWwtMjAyMy8xMjE4NyNkdW5lLWR1bmUtdGVybWluYWwtdXNlci1pbnRlcmZh Y2UtNyI+DQpEdW5lIFRlcm1pbmFsIFVJPC9hPiwgZXhwZWN0IHRoZSBleHBlcmllbmNlIG9mIHJ1 bm5pbmcgbXVsdGlwbGUgYnVpbGQgY29tbWFuZHMgdG8gaW1wcm92ZSBxdWl0ZSBhIGxvdCBpbiB0 aGUgbmVhciBmdXR1cmUhDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnMmQ4NjZhMCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQg aWQ9Im9yZzJkODY2YTAiPkdlbmVyYXRpbmcgRG9jdW1lbnRhdGlvbjwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMmQ4NjZhMCI+PC9kaXY+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzY4ZjdmMjciPjwvYT48Yj5bb2RvY108L2I+IEFkZCBT ZWFyY2ggQ2FwYWJpbGl0aWVzIHRvIDxjb2RlPm9kb2M8L2NvZGU+PGJyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzY4ZjdmMjciPg0KPHA+Q29udHJpYnV0b3JzOiBA cGFuZ2xlc2QgKFRhcmlkZXMpLCBARW1pbGVUcm90aWdub24gKFRhcmlkZXMpLCBAdHJlZmlzIChU YXJpZGVzKQ0KPC9wPg0KPHA+VGhlIDxjb2RlPm9kb2M8L2NvZGU+IHRlYW0gY29udGludWVkIHRv IG1ha2UgcHJvZ3Jlc3Mgb24gZ2VuZXJhdGluZyBhIHNlYXJjaCBpbmRleCBmcm9tIG9kb2MgYW5k IGFkZGluZyBzZWFyY2ggY2FwYWJpbGl0aWVzIHRvIHRoZSBIVE1MIGJhY2tlbmQuDQo8L3A+DQo8 cD5Tb21lIGlzc3VlcyBoYXZlIGJlZW4gZm91bmQgZHVyaW5nIHRlc3RpbmcgYW5kIGhhdmUgYmVl biBhZGRyZXNzZWQsIGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXJ0LXcvc2hlcmxv ZG9jL3RyZWUvanNvbyI+DQpTaGVybG9kb2M8L2E+IHdhcyB1cGRhdGVkIHRvIGJlIGNvbXBhdGli bGUgd2l0aCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgPGNvZGU+b2RvYzwvY29kZT4sIHdoaWNoIG5v dyBwcm92aWRlcw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2MvcHVsbC85 NzUiPmJhc2ljIHN1cHBvcnQgZm9yIGFzc2V0czwvYT4gdXNlZCB0byBzZWxlY3QgdGhlIHNlYXJj aCBKYXZhU2NyaXB0IHNjcmlwdCBmaWxlLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwv cD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5TdXBwb3J0IGZvciBzZWFyY2ggaW4gPGNvZGU+ b2RvYzwvY29kZT4g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1 bGwvOTcyIj4NCm9jYW1sL29kb2MjOTcyPC9hPiA8L2xpPjxsaT5Db2xsZWN0IG9jY3VycmVuY2Vz IGluZm9ybWF0aW9uIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9w dWxsLzk3NiI+DQpvY2FtbC9vZG9jIzk3NjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxs aT48YSBpZD0ib3JnMmU5MjViNiI+PC9hPjxiPltvZG9jXTwvYj4gU3ludGF4IGZvciBJbWFnZXMg YW5kIEFzc2V0cyBpbiA8Y29kZT5vZG9jPC9jb2RlPjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmcyZTkyNWI2Ij4NCjxwPkNvbnRyaWJ1dG9yczogQHBhbmdsZXNk IChUYXJpZGVzKSA8L3A+DQo8cD5BcyBwYXJ0IG9mIHRoZSB3b3JrIHRvIG1ha2UgPGNvZGU+b2Rv YzwvY29kZT4gc3VpdGFibGUgdG8gY3JlYXRlIHJpY2ggbWFudWFscywgdGhlDQo8Y29kZT5vZG9j PC9jb2RlPiB0ZWFtIHN0YXJ0ZWQgd29ya2luZyBvbiBhZGRpbmcgc3BlY2lhbCBzdXBwb3J0IGZv ciBpbWFnZXMgYW5kIGFzc2V0cyEgVGhpcyBpbml0aWF0aXZlIHdpbGwgYnJpbmcgaW1hZ2Ugc3Vw cG9ydCB0byBPQ2FtbC5vcmfigJlzIGNlbnRyYWwgcGFja2FnZSBkb2N1bWVudGF0aW9uLg0KPC9w Pg0KPHA+SW4gdGhlIHVwY29taW5nIHdlZWtzLCB0aGUgc3ludGF4IGFuZCBkZXNpZ24gd2lsbCBi ZSBkaXNjdXNzZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2MvaXNz dWVzLzk4NSI+DQp0aGUgUkZDPC9hPiB0aGF0IHdhcyBvcGVuIGluIEp1bHksIHdpdGggaW1wbGVt ZW50YXRpb24gc2V0IHRvIGJlZ2luIGFzIHNvb24gYXMgdGhlcmUgaXMgYSBjb25zZW5zdXMgb24g dGhlIGRlc2lnbi4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+SW1wbGVtZW50ZWQgYXNzZXQgcmVmZXJlbmNlcyAodXNpbmcgdGhlIDxj b2RlPmFzc2V0LSo8L2NvZGU+IHF1YWxpZmljYXRpb24gaW4gcmVmZXJlbmNlcyksIGFzIHdlbGwg YXMgdGhlaXIgcmVzb2x2aW5nIChzZWUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wYW5n bGVzZC9vZG9jL3RyZWUvYXNzZXQtcmVmZXJlbmNpbmciPmJyYW5jaDwvYT4pLiA8L2xpPjxsaT5P cGVuZWQgYW4gaXNzdWUgdG8gZGlzY3VzcyB0aGUgc3ludGF4IGZvciBpbWFnZXMsIHdpdGggYW4g aW5pdGlhbCBwcm9wb3NhbC4g4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2RvYy9pc3N1ZXMvOTg1Ij5vY2FtbC9vZG9jIzk4NTwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8 L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzgzZjQzNTki IGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4M2Y0MzU5Ij5FZGl0aW5nIGFuZCBSZWZh Y3RvcmluZyBDb2RlPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1v cmc4M2Y0MzU5Ij48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnYjc5 ZWQ3MSI+PC9hPjxiPltNZXJsaW5dPC9iPiBTdXBwb3J0IGZvciBQcm9qZWN0LVdpZGUgUmVmZXJl bmNlcyBpbiBNZXJsaW48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQt b3JnYjc5ZWQ3MSI+DQo8cD5Db250cmlidXRvcnM6IEB2b29kb29zIChUYXJpZGVzKSwgQGxldC1k ZWYgKFRhcmlkZXMpIDwvcD4NCjxwPlRoaXMgbW9udGgsIHdvcmsgb24gcHJvamVjdC13aWRlIHJl ZmVyZW5jZXMgZm9jdXNlZCBvbiBpbXByb3ZpbmcgYWxpYXMgaGFuZGxpbmcsIGZpeGluZyBpc3N1 ZXMgcmVsYXRlZCB0byBVSUQsIGFuZCBlbmhhbmNpbmcgdGhlIGJlaGF2aW9yIHdpdGggbW9kdWxl cyBhbmQgY29uc3RydWN0b3JzLg0KPC9wPg0KPHA+RXZlcnkgTWVybGluIHRlc3QgaXMgbm93IHBh c3NpbmcgKDp0YWRhOiEpLCBzbyB0aGUgdGVhbSBpbnRlbmRzIHRvIGZvY3VzIG9uIGdldHRpbmcg dGhlIGNvbXBpbGVyIHBhdGNoZXMgdXBzdHJlYW1lZCwgd2hpY2ggd2lsbCBpbiB0dXJuIHVubG9j ayB0aGUgdXBzdHJlYW1pbmcgb2YgdGhlIHJlc3Qgb2YgdGhlIHN0YWNrIChpLmUuLCBNZXJsaW4s IER1bmUsIGFuZCBPQ2FtbCBMU1ApLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Db21waWxlciBzdXBwb3J0IGZvciBwcm9qZWN0LXdp ZGUgb2NjdXJyZW5jZXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92b29kb29zL29j YW1sL3B1bGwvMSI+DQp2b29kb29zL29jYW1sIzE8L2E+IDwvbGk+PGxpPlVzZSBuZXcgY29tcGls ZSBpbmZvcm1hdGlvbiBpbiBDTVQgZmlsZXMgdG8gYnVpbGQgYW5kIGFnZ3JlZ2F0ZSBpbmRleGVz IOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9vY2FtbC11aWRlcHMvcHVs bC81Ij4NCnZvb2Rvb3Mvb2NhbWwtdWlkZXBzIzU8L2E+IDwvbGk+PGxpPkR1bmUgb3JjaGVzdHJh dGVzIGluZGV4IGdlbmVyYXRpb24g4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS92b29k b29zL2R1bmUvcHVsbC8xIj4NCnZvb2Rvb3MvZHVuZSMxPC9hPiA8L2xpPjxsaT5Vc2UgbmV3IENN VCBpbmZvIHRvIHByb3ZpZGUgYnVmZmVyIG9jY3VycmVuY2VzIGFuZCBpbmRleGVzIGZvciBwcm9q ZWN0LXdpZGUgb2NjdXJyZW5jZXMg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdm9v ZG9vcy9tZXJsaW4vcHVsbC83Ij52b29kb29zL21lcmxpbiM3PC9hPiA8L2xpPjxsaT5TdXBwb3J0 IHByb2plY3Qtd2lkZSBvY2N1cnJlbmNlcyBpbiA8Y29kZT5vY2FtbC1sc3A8L2NvZGU+IOKAkyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9vY2FtbC1sc3AvcHVsbC8xIj4NCnZv b2Rvb3Mvb2NhbWwtbHNwIzE8L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9 Im9yZ2M2ODBkYjUiPjwvYT48Yj5bTWVybGluXTwvYj4gSW1wcm92aW5nIE1lcmxpbuKAmXMgUGVy Zm9ybWFuY2U8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYzY4 MGRiNSI+DQo8cD5Db250cmlidXRlZCBieTogQHBpdGFnLWhhIChUYXJpZGVzKSwgQDNSYWZhbCAo VGFyaWRlcyksIEB2b29kb29zIChUYXJpZGVzKSwgQGxldC1kZWYgKFRhcmlkZXMpDQo8L3A+DQo8 cD5MYXN0IG1vbnRoLCB3ZSByZXBvcnRlZCB0aGF0IHRoZSBQUiB0byA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTY0MCI+DQpjb250aW51b3VzbHkgYmVuY2ht YXJrIE1lcmxpbjwvYT4gd2FzIG1lcmdlZC4gVGhlIG5leHQgc3RhZ2UgaW52b2x2ZWQgaW1wbGVt ZW50aW5nIGEgZnV6enktdGVzdGluZyBQUiB0byBtb25pdG9yIGJlaGF2aW9yIHJlZ3Jlc3Npb24u IEluIEp1bHksDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwv MTY1NyI+YW4gUkZDPC9hPiBvZiB0aGlzIGJlaGF2aW91ciByZWdyZXNzaW9uIENJLCBhY2NvbXBh bmllZCBieSBhbiBpbml0aWFsIGltcGxlbWVudGF0aW9uLCB3YXMgaW50cm9kdWNlZCB0byBkaXNj dXNzIHRoZSBkZXNpZ27igJlzIHRyYWRlLW9mZnMuDQo8L3A+DQo8cD5VcG9uIG1lcmdpbmcsIHRo ZSBmb3VuZGF0aW9uYWwgd29yayBvbiBNZXJsaW7igJlzIENJIHN5c3RlbSB3aWxsIGJlIGNvbXBs ZXRlLCBhbmQgdGhlIE1lcmxpbiB0ZWFtIGludGVuZHMgdG8gc2hpZnQgdGhlaXIgZm9jdXMgdG8g cGVyZm9ybWFuY2Ugb3B0aW1pc2F0aW9ucy4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+T3BlbmVkIGFuIFJGQyBmb3IgdGhlIEJlaGF2 aW9yIENJcyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9wdWxs LzE2NTciPg0Kb2NhbWwvbWVybGluIzE2NTc8L2E+IDwvbGk+PGxpPkltcHJvdmVkIGVycm9yIGRp c2NvdmVyeSBpbiA8Y29kZT5tZXJsLWFuPC9jb2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL3BpdGFnLWhhL21lcmwtYW4vcHVsbC8zMyI+DQpwaXRhZy1oYS9tZXJsLWFuIzMzPC9h PiA8L2xpPjxsaT5JbXByb3ZlZCA8Y29kZT5tZXJsLWFuPC9jb2RlPiBmb3IgdGhlIEJlaGF2aW9y IENJcw0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZCA8Y29kZT4taW5kZXggMDwvY29kZT4g dG8gdHlwZS1lbmNsb3NpbmcgY21kIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcGl0 YWctaGEvbWVybC1hbi9wdWxsLzMwIj4NCnBpdGFnLWhhL21lcmwtYW4jMzA8L2E+IDwvbGk+PGxp PlJlbW92ZSA8Y29kZT4taW5kZXggMDwvY29kZT4gZnJvbSBsb2NhdGUgY21kIC0tPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3BpdGFnLWhhL21lcmwtYW4vcHVsbC8zMSI+cGl0YWctaGEvbWVy bC1hbiMzMTwvYT4NCjwvbGk+PGxpPkltcHJvdmUgdGhlIFtiZWhhdmlvcl0gY21kIOKAkyA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vcGl0YWctaGEvbWVybC1hbi9wdWxsLzM0Ij4NCnBpdGFn LWhhL21lcmwtYW4jMzQ8L2E+IDwvbGk+PGxpPkJlaGF2aW9yIGNtZCBjYXQgZGF0YSDigJMgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BpdGFnLWhhL21lcmwtYW4vcHVsbC8zNyI+DQpwaXRh Zy1oYS9tZXJsLWFuIzM3PC9hPiA8L2xpPjxsaT5BbGxvdyBvbmx5IG9uZSBNZXJsaW4gdmVyc2lv biDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BpdGFnLWhhL21lcmwtYW4vcHVsbC80 MCI+DQpwaXRhZy1oYS9tZXJsLWFuIzQwPC9hPiA8L2xpPjxsaT5JbXByb3ZlIHBlcmYg4oCTIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9waXRhZy1oYS9tZXJsLWFuL3B1bGwvNDEiPnBpdGFn LWhhL21lcmwtYW4jNDE8L2E+DQo8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5BIFJvYWRtYXAgZm9yIHRoZSBPQ2Ft bCBQbGF0Zm9ybSAtIFNlZWtpbmcgWW91ciBGZWVkYmFjazwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYS1yb2FkbWFwLWZvci10aGUtb2NhbWwtcGxhdGZvcm0tc2Vla2lu Zy15b3VyLWZlZWRiYWNrLzEyMjM4LzMwIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h LXJvYWRtYXAtZm9yLXRoZS1vY2FtbC1wbGF0Zm9ybS1zZWVraW5nLXlvdXItZmVlZGJhY2svMTIy MzgvMzA8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Fl MTQ0ZWEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhZTE0NGVhIj5UaGliYXV0IE1h dHRpbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZ2FlMTQ0ZWEiPg0KPHA+SSBoYXZlIG1lcmdlZCB0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS11c2VycyI+DQpVc2VyIFBl cnNvbmE8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXBy aW5jaXBsZXMiPkd1aWRpbmcgUHJpbmNpcGxlczwvYT4gaW4gT0NhbWwub3JnLCB0aGV5IGFyZSBh dmFpbGFibGUgaW4gdGhlDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3Jt Ij5QbGF0Zm9ybSBUb29scyBzZWN0aW9uPC9hPiBvZiB0aGUgTGVhcm4gYXJlYS4NCjwvcD4NCjxw PlRoZWlyIGJlaW5nIG1lcmdlZCBkb2VzbuKAmXQgbWVhbiB0aGUgZmVlZGJhY2sgcGhhc2UgaXMg b3ZlciwgaG93ZXZlciEgVGhleSBhcmUgbGl2aW5nIGRvY3VtZW50cyB0aGF0IHdpbGwgY29udGlu dWUgdG8gZXZvbHZlIGFsb25nc2lkZSB0aGUgT0NhbWwgUGxhdGZvcm0uIElmIHlvdSBoYXZlIGFu eSBjb21tZW50cyBvciBzdWdnZXN0aW9ucywgZG9u4oCZdCBoZXNpdGF0ZSB0byBzaGFyZSB0aGVt IGhlcmUgb3Igb3BlbiBhIFBSLg0KPC9wPg0KPHA+QW5kIG5vdywgSeKAmW0gcmVhbGx5IGV4Y2l0 ZWQgdG8gc2hhcmUgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSByb2FkbWFwOiB0aGUgZ29hbHMgYW5k IGRldmVsb3BtZW50IHdvcmtmbG93cyB3ZSBwbGFuIHRvIGJ1aWxkIGluIHRoZSBjb21pbmcgdGhy ZWUgeWVhcnMuDQo8L3A+DQo8cD5Zb3UgY2FuIHNlZSB0aGUgZG9jdW1lbnQgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL3RhcmlkZXMvb2NhbWwtcGxhdGZvcm0tcm9hZG1hcC9ibG9iL21haW4v cm9hZG1hcC5tZCI+DQpoZXJlPC9hPiBhbmQgb24gdGhlIGFjY29tcGFueWluZyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTUwNSI+DQpPQ2FtbC5vcmfi gJlzIFBSPC9hPi4gPC9wPg0KPHA+VGhlIHJvYWRtYXAgaXMgdGhlIHJlc3VsdCBvZiBtYW55IGRp c2N1c3Npb25zIHdpdGggdGhlIFBsYXRmb3JtIHByb2plY3RzIG1haW50YWluZXJzLCBjYXJlZnVs IHJldmlld3Mgb2YgT0NhbWwgc3VydmV5IHJlc3VsdHMsIHN5bnRoZXNpcyBvZiB2YXJpb3VzIERp c2N1c3MgdGhyZWFkcyBhbmQgYmxvZyBwb3N0cywgYW5kIHVzZXIgcmVzZWFyY2ggd2l0aCBib3Ro IGluZHVzdHJpYWwgdXNlcnMgYW5kIGluZGl2aWR1YWwgZGV2ZWxvcGVycyBhbGlrZS4NCjwvcD4N CjxwPldlIGV4cGVjdCBpdCB0byByZXByZXNlbnQgdGhlIGNvbW11bml0eeKAmXMgbmVlZHMgcmVs YXRpdmVseSB3ZWxsLCBob3dldmVyLCB0aGlzIGlzIHRoZSBmaXJzdCBwdWJsaWMgZHJhZnQuIFdl IGV4cGVjdCB0byBnbyB0aHJvdWdoIGEgZmV3IGl0ZXJhdGlvbnMgYmVmb3JlIGl0IGlzIHJlYWR5 IHRvIGJlIGFkb3B0ZWQuDQo8L3A+DQo8cD5TbyBub3cgaXMgdGhlIHRpbWUgdG8gc2hhcmUgeW91 ciBmZWVkYmFjayBvbmNlIGFnYWluISBIZXJlIGFyZSBhIGNvdXBsZSBvZiBxdWVzdGlvbnMgeW91 IGNhbiB0cnkgdG8gYW5zd2VyIHdoaWxlIHJlYWRpbmcgdGhlIHJvYWRtYXA6DQo8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+V291bGQgeW91IHVzZSB0aGVzZSBkZXZlbG9wbWVudCB3b3Jr Zmxvd3M/IElmIHNvLCB3aGljaCBvbmVzPyBJcyB0aGVyZSBhbnkgbWlzc2luZyB3b3JrZmxvdyB5 b3Ugd291bGQgZXhwZWN0IHRoZSBPQ2FtbCBQbGF0Zm9ybSB0byBwcm92aWRlPw0KPC9saT48bGk+ V291bGQgeW91IHVzZSAoYWxsIG9yIHBhcnRzIG9mKSB0aGUgT0NhbWwgUGxhdGZvcm0gYXMgc3Bl Y2lmaWVkIGluIHRoZSByb2FkbWFwIHlvdXJzZWxmLCBpbiB5b3VyIG9yZ2FuaXphdGlvbj8gSWYg bm90LCB3aGF0IGFyZSB0aGUgYmxvY2tlcnM/IEhvdyB3b3VsZCB5b3UgbWVhc3VyZSBzdWNjZXNz IGZvciBQbGF0Zm9ybSBhZG9wdGlvbiBpbiB0aGUgY29tbXVuaXR5IG9yIGluIHlvdXIgb3JnYW5p emF0aW9uPw0KPC9saT48L3VsPg0KPHA+TG9va2luZyBmb3J3YXJkIHRvIHRha2luZyBldmVyeW9u ZeKAmXMgaW5zaWdodCBpbnRvIGFjY291bnQgYW5kIGl0ZXJhdGluZyBvbiB0aGUgcm9hZG1hcCEN CjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2I3YzUyNmQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmdiN2M1MjZkIj5PbGQg Q1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmdiN2M1MjZk Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWls dG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9h PiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVm PSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9y IHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5S U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0 byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgPGEgaHJl Zj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpv bmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnNjg4MDc5NCI+ DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0 PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRt bD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 15 Aug 2023 17:35:09 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 15 Aug 2023 17:35:09 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 15 Aug 2023 17:35:09 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37FGYTES030684 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 15 Aug 2023 17:34:29 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 37FGYGcw030671 for ; Tue, 15 Aug 2023 17:34:16 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 15 Aug 2023 18:34:13 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 46C61E0141; Tue, 15 Aug 2023 18:34:13 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5B419E0133 for ; Tue, 15 Aug 2023 18:34:10 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Aug 2023 18:34:08 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2792C5613AB; Tue, 15 Aug 2023 18:33:59 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZz5Z0pMEZiRLgNE+4fHU6YiC5QA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 15 Aug 2023 17:33:58 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 26fab3e9-5681-4f84-035f-08db9dad972c X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,175,1684792800"; d="scan'208,217";a="121118413" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.496294, queueID=76C105613B0 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOC0xNSBUdWUgMTg6MzIgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDguMDguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOC4yMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEF1Z3VzdCAwOCB0byAxNSwgMjAyMy4gPC9w Pg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxl IG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9 ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5kZWNpbWFsIDEuMC4wPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjMiI+cnRyZWUgMC4xLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5T aHV0dGxlIDAuOS4xIHJlbGVhc2VkPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+ZHJlYW0taHRt bCAxLjAuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPnRpbnlfaHR0cGQgMC4xNDwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzYiPmtjYXMgYW5kIGtjYXNfZGF0YSAwLjYuMTogU1RNIGFuZCBjb21w b3NpdGlvbmFsIGxvY2stZHJlZSBkYXRhIHN0cnVjdHVyZXM8L2E+DQo8L2xpPjxsaT48YSBocmVm PSIjNyI+cHB4X3VwZGF0ZSAwLjgxPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+SXMgYSBtdXRh YmxlIHByb2plY3Qgc3RydWN0dXJlIGluaGVyZW50bHkgc2xvd2VyPzwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzkiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBKdWx5IDIwMjM8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiMxMCI+VXNpbmcgPGNvZGU+W0Bwb2xsIGVycm9yXTwvY29kZT4gYXR0cmlidXRlIHRv IGltcGxlbWVudCBzeXN0aHJlYWQgc2FmZSBkYXRhIHN0cnVjdHVyZXM8L2E+DQo8L2xpPjxsaT48 YSBocmVmPSIjMTEiPmZvcmVzdGVyIDIuMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZ2Y1MGRm MWEiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+ZGVjaW1hbCAx LjAuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRlY2ltYWwt MS0wLTAvMTI3MzkvMiI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kZWNpbWFsLTEt MC0wLzEyNzM5LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzZjZDU3YWIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2Y2Q1N2FiIj5ZYXdh ciBBbWluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnNmNkNTdhYiI+DQo8cD5TbWFsbCB1cGRhdGUgdGhhdCB3ZSBoYXZlIHJlbGVhc2VkIGEg YnVnZml4IDEuMC4xOiA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL2RlY2ltYWwvbGF0ZXN0 Ij4NCmh0dHBzOi8vb2NhbWwub3JnL3AvZGVjaW1hbC9sYXRlc3Q8L2E+IDwvcD4NCjxwPlRoaXMg Zml4ZXMgdGhlIHBhcnNpbmcgb2YgZmxvYXRpbmctcG9pbnQgbnVtYmVycyBpbnRvIGRlY2ltYWwu IEl0IHdhcyBvZmYgYnkgYW4gb3JkZXIgb2YgbWFnbml0dWRlLiBZaWtlcyENCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5ydHJlZSAwLjEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXJ0cmVlLTAtMS0wLzEyNzg1LzEiPmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tcnRyZWUtMC0xLTAvMTI3ODUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOGM4ZjZhNyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzhjOGY2YTciPlBhdHJpY2sgRmVycmlzIGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOGM4ZjZhNyI+DQo8cD5IZWxsbyA6 d2F2ZTogPC9wPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2Ugb24gYmVoYWxmIG9mIHRoZSA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2VvY2FtbCI+R2VvY2FtbDwvYT4gb3JnYW5pc2F0 aW9uLCBhIHB1cmUgT0NhbWwNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nZW9jYW1sL29j YW1sLXJ0cmVlIj5SLXRyZWUgbGlicmFyeTwvYT4uIFRoaXMgbGlicmFyeSBpcyBhbiB1cGRhdGVk IHZlcnNpb24gb2YNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tYXJpdXNhZS9vY2FtbC1y dHJlZSI+aHR0cHM6Ly9naXRodWIuY29tL21hcml1c2FlL29jYW1sLXJ0cmVlPC9hPiBhbmQgeW91 IGNhbiByZWFkIGEgbGl0dGxlIGFib3V0IGl0IGluDQo8YSBocmVmPSJodHRwczovL3BhdHJpY2su c2lycmVmLm9yZy9wb3N0cy9vY2FtbC1ydHJlZS5odG1sIj50aGlzIHNob3J0IGJsb2cgcG9zdDwv YT4uIEl0IHN1cHBvcnRzDQo8YSBocmVmPSJodHRwczovL2NldXItd3Mub3JnL1ZvbC03NC9maWxl cy9GT1JVTV8xOC5wZGYiPk9NVC1zdHlsZTwvYT4gYnVsay1sb2FkaW5nIGZvciBwcm9kdWNpbmcg ZWZmaWNpZW50IHRyZWVzLg0KPC9wPg0KPHA+SGFwcHkgaGFja2luZyA6ZGVjaWR1b3VzX3RyZWU6 IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5TaHV0dGxlIDAuOS4xIHJlbGVhc2Vk PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc2h1dHRsZS0wLTkt MS1yZWxlYXNlZC8xMTI5Mi8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc2h1 dHRsZS0wLTktMS1yZWxlYXNlZC8xMTI5Mi8yPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzM0ZjUwYzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmczNGY1MGMyIj5BbnVyYWcgU29uaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzM0ZjUwYzIiPg0KPHA+U29tZSBuZXcgdXBkYXRlcyBzaW5j ZSB0aGUgbGFzdCByZWxlYXNlOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGNvZGU+ c2h1dHRsZV9odHRwPC9jb2RlPiBub3cgc3VwcG9ydHMgSFRUUC8xLjEgc2VydmVycyB0aGF0IHVz ZSA8Y29kZT5hc3luY19zc2w8L2NvZGU+IGJhc2VkIGVuY3J5cHRlZCBjb25uZWN0aW9ucy4NCjwv bGk+PGxpPkEgc2VydmVyIGNvbnRleHQgaXMgZm9yd2FyZGVkIHRvIGh0dHAgc2VydmljZXMuIFRo aXMgY29udGV4dCBjYW4gYmUgdXNlZCB0byBsb29rdXAgcGVlciBjbGllbnTigJlzIGFkZHJlc3Ms IGNoZWNrIGlmIHRoZSBodHRwIHNlcnZpY2UgaXMgcnVubmluZyBvbiBhIFNTTCBlbmNyeXB0ZWQg c2VydmVyLCBhbmQgaWYgU1NMIGlzIHVzZWQgbG9va3VwIHBlZXIgY2xpZW504oCZcyBTU0wgY2Vy dGlmaWNhdGVzLg0KPC9saT48bGk+DQo8cD5IVFRQIHNlcnZlcnMgc3VwcG9ydCB3ZWIgc29ja2V0 IHVwZ3JhZGVzIG5vdy4gVGhlIGltcGxlbWVudGF0aW9uIGlzIGJhc2VkIG9uIEphbmVzdHJlZXTi gJlzIHdlYiBzb2NrZXQgbGlicmFyeSAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVz dHJlZXQvYXN5bmNfd2Vic29ja2V0Ij5odHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9hc3lu Y193ZWJzb2NrZXQ8L2E+KSwgYW5kIHNodXR0bGUgaGFzIGEgY29tcGFuaW9uIGxpYnJhcnkNCjxj b2RlPnNodXR0bGVfd2Vic29ja2V0PC9jb2RlPiB0aGF0IHByb3ZpZGVzIHRoZSB3ZWIgc29ja2V0 IHVwZ3JhZGUgbmVnb3RpYXRpb24gZm9yIHNlcnZlcnMsIGFuZCBhbGxvd3MgY29udmVydGluZyBh IHdlYiBzb2NrZXQgaGFuZGxlciB0byBhDQo8Y29kZT5yZXF1ZXN0IC0mZ3Q7IHJlc3BvbnNlIHBy b21pc2U8L2NvZGU+IGJhc2VkIGh0dHAgc2VydmljZSB0aGF0IGNhbiBiZSB1c2VkIGJ5IDxjb2Rl Pg0Kc2h1dHRsZV9odHRwPC9jb2RlPi4gPC9wPg0KPHA+RXhhbXBsZSBmb3IgYSBodHRwIHNlcnZp Y2UgdGhhdCBzZXJ2ZXMgd2ViIHNvY2tldCB0cmFmZmljIG9uIHNvbWUgcmVxdWVzdHM6IDwvcD4N CjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2Nh bWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVu ISA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q29yZTwvc3Bhbj4NCjxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVuISA8L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+QXN5bmM8L3NwYW4+DQo8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b3BlbiA8L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2h1dHRsZV9odHRwPC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij53ZWJzb2NrZXRfaGFuZGxlcjwvc3Bhbj4gPQ0KICA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TaHV0dGxlX3dlYnNvY2tldC48L3NwYW4+Y3JlYXRlICg8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij53czwvc3Bhbj4gLSZndDsNCiAgICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5yZDwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPndyPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPldl YnNvY2tldC48L3NwYW4+cGlwZXMgd3MgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPlBpcGUuPC9zcGFuPnRyYW5zZmVyX2lkIHJkIHdyKQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj ZmY0NTAwOyI+Ozs8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnNl cnZpY2U8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmNvbnRleHQ8L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnJlcXVlc3Q8L3NwYW4+ID0NCiAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TG9nLkdsb2JhbC48L3NwYW4+aW5mbyA8c3BhbiBzdHls ZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtQZWVyIGFkZHJlc3M6ICVzJnF1b3Q7PC9zcGFuPiAo PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U29ja2V0LkFkZHJlc3MuPC9zcGFuPnRvX3N0 cmluZyAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2VydmVyLjwvc3Bhbj5wZWVyX2Fk ZHIgY29udGV4dCkpOw0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bWF0Y2g8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJlcXVl c3QuPC9zcGFuPnBhdGggcmVxdWVzdCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+d2l0aDwvc3Bhbj4NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0 MDA7Ij4mcXVvdDsvd2Vic29ja2V0JnF1b3Q7PC9zcGFuPi0mZ3Q7IHdlYnNvY2tldF9oYW5kbGVy IHJlcXVlc3QNCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDsvJnF1b3Q7 PC9zcGFuPiAtJmd0OyByZXR1cm4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJlc3Bv bnNlLjwvc3Bhbj5jcmVhdGUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+fmJvZHk8L3Nw YW4+Oig8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Cb2R5Ljwvc3Bhbj5zdHJpbmcgPHNw YW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGVsbG8gV29ybGQmcXVvdDs8L3NwYW4+ KSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5gT2s8L3NwYW4+KQ0KICB8IF8gLSZndDsgcmV0dXJuICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5SZXNwb25zZS48L3NwYW4+Y3JlYXRlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUy MTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPmBOb3RfZm91bmQ8L3NwYW4+KQ0KPHNwYW4g c3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhl IGxhdGVzdCByZWxlYXNlIGhhcyBiZWVuIHB1Ymxpc2hlZCB0byB0aGUgb3BhbSBwYWNrYWdlIHJl cG9zaXRvcnksIGFuZCBjYW4gYmUgaW5zdGFsbGVkIHZpYSBvcGFtOg0KPC9wPg0KPHByZSBjbGFz cz0iZXhhbXBsZSIgaWQ9Im9yZzJjMTg0YjYiPg0Kb3BhbSBpbnN0YWxsIHNodXR0bGVfaHR0cA0K b3BhbSBpbnN0YWxsIHNodXR0bGVfd2Vic29ja2V0DQo8L3ByZT4NCjwvbGk+PGxpPkdpdCByZXBv c2l0b3J5OiA8YSBocmVmPSJodHRwczovL2dpdC5zci5odC9+c29uaS9zaHV0dGxlX2h0dHAiPmh0 dHBzOi8vZ2l0LnNyLmh0L35zb25pL3NodXR0bGVfaHR0cDwvYT4NCjwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5kcmVhbS1odG1sIDEuMC4wPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0xLTAtMC8xMjc4Ny8xIj5odHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRyZWFtLWh0bWwtMS0wLTAvMTI3ODcvMTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYmJjMzNmZCIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2JiYzMzZmQiPllhd2FyIEFtaW4gYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiYmMzM2ZkIj4N CjxwPkhpLCBkcmVhbS1odG1sIDEuMC4wIGhhcyBiZWVuIHJlbGVhc2VkIHRvIG9wYW06IDxhIGhy ZWY9Imh0dHBzOi8vb2NhbWwub3JnL3AvZHJlYW0taHRtbCI+DQpodHRwczovL29jYW1sLm9yZy9w L2RyZWFtLWh0bWw8L2E+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5SZXBvOiA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20veWF3YXJhbWluL2RyZWFtLWh0bWwiPmh0dHBzOi8vZ2l0 aHViLmNvbS95YXdhcmFtaW4vZHJlYW0taHRtbDwvYT4NCjwvbGk+PGxpPkFQSSBkb2NzOiA8YSBo cmVmPSJodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9kcmVhbS1odG1sL0Ry ZWFtX2h0bWwvaW5kZXguaHRtbCI+DQpodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0t aHRtbC9kcmVhbS1odG1sL0RyZWFtX2h0bWwvaW5kZXguaHRtbDwvYT4gPC9saT48L3VsPg0KPHA+ RHJlYW0taHRtbCBpcyBhIGxpYnJhcnkgZm9yIGdlbmVyYXRpbmcgSFRNTCwgY2xvc2VseSBpbnRl Z3JhdGVkIHdpdGggRHJlYW0uIEl0IGNhbiBiZSB1c2VkIGFzIGFuIGFsdGVybmF0aXZlIHRvIERy ZWFt4oCZcyBidWlsdC1pbiBFbWJlZGRlZCBNTCB0ZW1wbGF0aW5nIGxhbmd1YWdlLiBIZXJl4oCZ cyB0aGUgRHJlYW0gaG9tZSBwYWdlIGV4YW1wbGUgdXNpbmcgZHJlYW0taHRtbDoNCjwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmhlbGxvPC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij53aG88L3NwYW4+ID0NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPkRyZWFtX2h0bWw8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkhUTUw8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgaHRtbCA8c3BhbiBzdHlsZT0iY29s b3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5bXTwvc3Bhbj4gWw0KICAg IGJvZHkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNm N2VmOyI+W108L3NwYW4+IFsNCiAgICAgIGgxIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsg YmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiBbdHh0IDxzcGFuIHN0eWxlPSJj b2xvcjogI2NhMzQwMDsiPiZxdW90O0hlbGxvLCAlcyEmcXVvdDs8L3NwYW4+IHdob11dXQ0KDQo8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFu PiAoKSA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkRyZWFtLjwvc3Bhbj5ydW4N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPkRyZWFtLjwvc3Bhbj5sb2dnZXINCiAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkRyZWFt Ljwvc3Bhbj5yb3V0ZXIgWzxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkRyZWFtLjwvc3Bh bj5nZXQgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7LyZxdW90Ozwvc3Bhbj4g KDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPl88L3NwYW4+IC0mZ3Q7IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkRyZWFtX2h0bWwuPC9zcGFuPnJlc3BvbmQgKGhlbGxvIDxz cGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O3dvcmxkJnF1b3Q7PC9zcGFuPikpXQ0K PC9wcmU+DQo8L2Rpdj4NCjxwPkluIHRoaXMgcmVsZWFzZSwgSSBtYWRlIGEgYnJlYWtpbmcgY2hh bmdlIChoZW5jZSBtYWpvciB2ZXJzaW9uIGJ1bXApIHRvIGdyb3VwIGFsbCBIVE1MIHRhZ3MgYW5k IGF0dHJpYnV0ZXMgdW5kZXIgdGhlIHNhbWUNCjxjb2RlPkhUTUw8L2NvZGU+IG1vZHVsZSwgc28g b25seSB0d28gfm9wZW5+cyBhcmUgbmVlZGVkIHRvIGFjY2VzcyBhbGwgSFRNTCBmdW5jdGlvbmFs aXR5IGRpcmVjdGx5Lg0KPC9wPg0KPHA+QW5vdGhlciBzbWFsbGVyIGltcHJvdmVtZW50IGlzIG1v cmUgZ3JhbnVsYXIgZXNjYXBpbmcgb2YgSFRNTCB0ZXh0IG5vZGVzIGFuZCBhdHRyaWJ1dGUgdmFs dWVzLCBmb2xsb3dpbmcgYnJvd3NlciBydWxlcyBtb3JlIGNsb3NlbHkuIEUuZy4gSeKAmW0gbm8g bG9uZ2VyIGVzY2FwaW5nDQo8Y29kZT4nPC9jb2RlPiBhbmQgPGNvZGU+JnF1b3Q7PC9jb2RlPiBp biB0ZXh0IG5vZGVzLCBhbmQgbm90IGVzY2FwaW5nIDxjb2RlPiZhbXA7PC9jb2RlPiwNCjxjb2Rl PiZsdDs8L2NvZGU+LCA8Y29kZT4mZ3Q7PC9jb2RlPiBpbiBhdHRyaWJ1dGUgdmFsdWVzLiA8L3A+ DQo8cD5Nb3JlIGRldGFpbHMgaW4gdGhlIHJlcG8gcmVhZG1lIGFuZCBkb2N1bWVudGF0aW9uLiBF bmpveSEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPnRpbnlfaHR0cGQgMC4xNDwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRpbnktaHR0cGQtMC0x NC8xMjc4OC8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRpbnktaHR0cGQtMC0x NC8xMjc4OC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc5Yzc5NDk4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOWM3OTQ5OCI+U2ltb24g Q3J1YW5lcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzljNzk0OTgiPg0KPHA+Qm9uam91ciBib25qb3VyLCA8L3A+DQo8cD5JdOKAmXMgd2l0 aCBkZWxlY3RhdGlvbiB0aGF0IEkgYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgdGlueV9odHRwZCAw LjE0LiBUaW55X2h0dHBkIGlzIGENCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUv dGlueV9odHRwZCI+d2ViIHNlcnZlciBsaWJyYXJ5PC9hPiB0aGF0IHJlbGllcyBvbiB0aHJlYWRz W14xXSB0byBoYW5kbGUgY2xpZW50IGNvbm5lY3Rpb25zLiBPdmVyYWxsIFRpbnlfaHR0cGQgYWlt cyBhdCBiZWluZyBzZWxmIGNvbnRhaW5lZCwgcmVhc29uYWJseSBzaW1wbGUsIGFuZCBwZXJmb3Jt YW50IGVub3VnaCBmb3Igbm9uLWdvb2dsZSBzY2FsZS4NCjwvcD4NCjxwPlRoaXMgcmVsZWFzZSBi cmluZ3MgYSBzaWduaWZpY2FudCBhbW91bnQgb2YgaW1wcm92ZW1lbnRzOiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+YSA8Y29kZT5UaW55X2h0dHBkX2lvPC9jb2RlPiBtb2R1bGUgcHJv dmlkZXMgZXh0ZW5zaWJsZSBpbnB1dCBhbmQgb3V0cHV0IGNoYW5uZWxzIChhcyByZWNvcmRzIG9m IGZ1bmN0aW9ucykNCjwvbGk+PGxpPg0KPHA+SW4gdGVybXMgb2YgZmxleGliaWxpdHksIGEgcmVx dWVzdCBoYW5kbGVyIGNhbiBub3cgY2hvb3NlIHRvIG9idGFpbiBhbiBvdXRwdXQgY2hhbm5lbCAo ZnJvbSB0aGUNCjxjb2RlPlRpbnlfaHR0cGRfaW88L2NvZGU+IG1vZHVsZSBhYm92ZSkgaW50byB3 aGljaCB0byB3cml0ZSB0aGUgcmVzcG9uc2XigJlzIGJvZHk7IGFzIG9wcG9zZWQgdG8gb25seSBi ZWluZyBhYmxlIHRvIHJldHVybmluZyBhIHN0cmluZyBvciBhIHN0cmVhbSAoYXMgcG93ZXJmdWwg YnV0IHRoZSBpbnZlcnNpb24gb2YgY29udHJvbCBpc27igJl0IGFzIGVhc3kgdG8gcHJvZHVjZSku IFRoaXMgbWVhbnMgdGhhdCByZWFkaW5nIGEgZmlsZSB0byByZXR1cm4gaXQNCiBjYW4gbG9vayBs aWtlIHRoaXM6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xh c3M9InNyYyBzcmMtb2NhbWwiPiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VGlueV9o dHRwZF9zZXJ2ZXIuPC9zcGFuPihhZGRfcm91dGVfaGFuZGxlciBzZXJ2ZXINCiAgICAgIDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlJvdXRlLjwvc3Bhbj4oZXhhY3QgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7cGFzc3dkJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNTJhMmE7Ij5ALzwvc3Bhbj4gcmV0dXJuKSkNCiAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICNhNTJhMmE7Ij5AQDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250 LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ X3JlcTwvc3Bhbj4gLSZndDsNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQt c3R5bGU6IGl0YWxpYzsiPigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPnN0cmVhbSB0aGUgY29udGVudCBvZiB0aGUgZmlsZTwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bh bj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij53cml0ZTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+b2M8L3NwYW4+ID0NCiAgICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmJ1Zjwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5CeXRlcy48L3NwYW4+Y3JlYXRlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi PjQwOTY8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5pbjwvc3Bhbj4NCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmlj PC9zcGFuPiA9IG9wZW5faW4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7L2V0 Yy9wYXNzd2QmcXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPkZ1bi48L3NwYW4+cHJvdGVjdCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+Zmlu YWxseTwvc3Bhbj46KDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7IGNsb3NlX2luX25vZXJyIGljKQ0KICAgICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw NmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7DQogICAgICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+d2hpbGU8L3NwYW4+ DQogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+ID0gaW5w dXQgaWMgYnVmIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjA8L3NwYW4+ICg8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5CeXRlcy48L3NwYW4+bGVuZ3RoIGJ1ZikgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgICAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8L3Nw YW4+IG4gJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SU8uT3V0cHV0Ljwvc3Bhbj5vdXRwdXQgb2MgYnVm IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjA8L3NwYW4+IG47DQogICAgICAgIG4gJmd0 OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9zcGFuPg0KICAgICAgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmRvPC9zcGFuPg0KICAgICAg ICAoKQ0KICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9s ZDsiPmRvbmU8L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KDQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+d3JpdGVyPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPklPLldy aXRlci48L3NwYW4+bWFrZSB+d3JpdGUgKCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPlJlc3BvbnNlLjwvc3Bhbj5tYWtlX3dyaXRlciA8c3BhbiBzdHlsZT0iY29sb3I6ICNh NTJhMmE7Ij5AQDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5k LWNvbG9yOiAjZmNmN2VmOyI+T2s8L3NwYW4+IHdyaXRlcikNCjwvcHJlPg0KPC9kaXY+DQo8L2xp PjxsaT5jbGllbnQgYWRkcmVzcyBpcyBwYXNzZWQgdG8gdGhlIGhhbmRsZXIgdGhyb3VnaHQgdGhl IDxjb2RlPlJlcXVlc3QudDwvY29kZT4gb2JqZWN0Ow0KPC9saT48bGk+cGVyZm9ybWFuY2Ugd2Fz IGltcHJvdmVkIGJ5IHNldHRpbmcgPGNvZGU+VENQX05PREVMQVk8L2NvZGU+IG9uIHRoZSBzb2Nr ZXRzIGFuZCBieSBhZGRpbmcgYSBidWZmZXIgcG9vbCB0byByZWR1Y2UgbWVtb3J5IGNodXJuOw0K PC9saT48bGk+c29tZSBpbXByb3ZlbWVudHMgdG8gdGVybWluYXRpb24gYmVoYXZpb3Igd2VyZSBp bXBsZW1lbnRlZCBieSBAVlBoYW50b20sIHNvIHRoYXQgdGhlIG1haW4gdGhyZWFkIHdhaXRzIGZv ciBhbGwgY29ubmVjdGlvbnMgdG8gdGVybWluYXRlIGJlZm9yZSByZXR1cm5pbmcsIGFuZCBhbHNv IGhhbmRsaW5nIHNpZ25hbHMgYmV0dGVyLg0KPC9saT48L3VsPg0KPHA+RnVsbCBjaGFuZ2Vsb2cg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS90aW55X2h0dHBkL3JlbGVhc2VzL3Rh Zy8wLjE0Ij4NCmhlcmU8L2E+LiA8L3A+DQo8cD5DaGVlcmlvISA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iNiI+a2NhcyBhbmQga2Nhc19kYXRhIDAuNi4xOiBTVE0gYW5kIGNvbXBvc2l0 aW9uYWwgbG9jay1kcmVlIGRhdGEgc3RydWN0dXJlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWtjYXMtYW5kLWtjYXMtZGF0YS0wLTYtMS1zdG0tYW5kLWNvbXBv c2l0aW9uYWwtbG9jay1kcmVlLWRhdGEtc3RydWN0dXJlcy8xMjY3NC8zIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4ta2Nhcy1hbmQta2Nhcy1kYXRhLTAtNi0xLXN0bS1hbmQtY29t cG9zaXRpb25hbC1sb2NrLWRyZWUtZGF0YS1zdHJ1Y3R1cmVzLzEyNjc0LzM8L2E+DQo8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzBiNGEzNWQiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmcwYjRhMzVkIj5WZXNhIEthcnZvbmVuIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGI0YTM1ZCI+DQo8cD5B bmQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSBibG9nIHBvc3QgPGEgaHJlZj0iaHR0cHM6Ly90YXJp ZGVzLmNvbS9ibG9nLzIwMjMtMDgtMTAta2Nhcy1idWlsZGluZy1hLWxvY2stZnJlZS1zdG0tZm9y LW9jYW1sLTItMi8iPg0KS2NhczogQnVpbGRpbmcgYSBsb2NrLWZyZWUgU1RNIGZvciBPQ2FtbDwv YT4gaXMgbm93IG9ubGluZSBhcyB3ZWxsLiA8L3A+DQo8cD5JZiB5b3UgaGF2ZSBhbnkgZmVlZGJh Y2sgb3IgcXVlc3Rpb25zIG9uIEtjYXMsIEnigJltIGhhcHB5IHRvIGRpc2N1c3MuIDwvcD4NCjxw PkZlZWwgZnJlZSB0byBhc2sgaGVyZSBvciBvbiBPQ2FtbCBEaXNjb3JkLCBmb3IgZXhhbXBsZS4g PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt NyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPnBweF91cGRhdGUgMC44MTwvaDI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBweC11cGRhdGUtMC04MS8xMjc5 NC8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBweC11cGRhdGUtMC04MS8xMjc5 NC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczNDRk MmExIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzQ0ZDJhMSI+WW90YW0gQmFybm95 IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn MzQ0ZDJhMSI+DQo8cD5IaSBndXlzLiBJIHdhbnRlZCB0byBsZXQgeW91IGtub3cgYWJvdXQgPGNv ZGU+cHB4X3VwZGF0ZTwvY29kZT4uIFRoaXMgaXMgYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vYmx1ZGR5L3BweF91cGRhdGUiPg0Kc21hbGwgdXRpbGl0eSBwcHg8L2E+IHRoYXQgcmV3cml0 ZXMgc29tZSByZWNvcmQgdXBkYXRlIGV4cHJlc3Npb25zIHRvIG1ha2UgdGhlbSBtb3JlIGVmZmlj aWVudC4NCjwvcD4NCjxwPldoZW4gdXBkYXRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgcmVjb3JkIGZ1 bmN0aW9uYWxseSwgb25lIG1pZ2h0IHdhbnQgdG8gYXZvaWQgcmVhbGxvY2F0aW5nIHRoZSByZWNv cmQgaWYgdGhlIGNvbnRlbnRzIGhhdmVu4oCZdCBjaGFuZ2VkLiBTaW1pbGFybHksIHdoZW4gdXBk YXRpbmcgdGhlIGNvbnRlbnRzIG9mIGEgbXV0YWJsZSBmaWVsZCBvZiBhIHJlY29yZCwgb25lIG1p Z2h0IHdhbnQgdG8gYXZvaWQgdGhlIGNvc3Qgb2YgdGhlIHdyaXRlIGJhcnJpZXINCiBpbiBjYXNl IHRoZSBmaWVsZCBjb250ZW50IGhhc27igJl0IGNoYW5nZWQuIEluc3RlYWQgb2YgaGF2aW5nIHRv IHdyaXRlIGVycm9yLXByb25lIGNvZGUgY2hlY2tpbmcgZWFjaCBmaWVsZCB3aXRoIHBoeXNpY2Fs IGVxdWFsaXR5LA0KPGNvZGU+cHB4X3VwZGF0ZTwvY29kZT4gZG9lcyB0aGUgYWRkZWQgcGh5c2lj YWwgY29tcGFyaXNvbnMgZm9yIHlvdSBiZWhpbmQgdGhlIHNjZW5lcy4NCjwvcD4NCjxwPllvdSBj YW4gaW5zdGFsbCA8Y29kZT5wcHhfdXBkYXRlPC9jb2RlPiB2aWEgPGNvZGU+b3BhbTwvY29kZT4g YW5kIGVhc2lseSBhcHBseSBpdCB0byB5b3VyIGNvZGUgd2l0aA0KPGNvZGU+ZHVuZTwvY29kZT4u IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5JcyBhIG11dGFibGUgcHJvamVjdCBz dHJ1Y3R1cmUgaW5oZXJlbnRseSBzbG93ZXI/PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9pcy1hLW11dGFibGUtcHJvamVjdC1zdHJ1Y3R1cmUtaW5oZXJlbnRseS1zbG93 ZXIvMTI3OTAvOSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaXMtYS1tdXRhYmxlLXBy b2plY3Qtc3RydWN0dXJlLWluaGVyZW50bHktc2xvd2VyLzEyNzkwLzk8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Q3MDc1OGMiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdkNzA3NThjIj5EZWVwIGluIHRoaXMgdGhyZWFkLCBEYW5pZWwgQsO8 bnpsaSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdk NzA3NThjIj4NCjxwPkJ0dy4gdGhlcmUgYXJlIGEgZmV3IGdhbWVib3kgZW11bGF0b3JzIHdyaXR0 ZW4gaW4gT0NhbWwgeW91IG1heSB3YW50IHRvIGNoZWNrIG91dCB3aGF0IHRoZXkgZG86DQo8L3A+ DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9saW5vc2NvcGUuZ2l0 aHViLmlvL3dyaXRpbmctYS1nYW1lLWJveS1lbXVsYXRvci1pbi1vY2FtbC8iPmh0dHBzOi8vbGlu b3Njb3BlLmdpdGh1Yi5pby93cml0aW5nLWEtZ2FtZS1ib3ktZW11bGF0b3ItaW4tb2NhbWwvPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0VuZ2lsL0dvb2Rib3kiPmh0 dHBzOi8vZ2l0aHViLmNvbS9FbmdpbC9Hb29kYm95PC9hPg0KPC9saT48L29sPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjkiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBKdWx5IDIwMjM8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy1uZXdzbGV0dGVyLWp1 bHktMjAyMy8xMjc5OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1vcmct bmV3c2xldHRlci1qdWx5LTIwMjMvMTI3OTgvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmc0YTQ5OWY4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnNGE0OTlmOCI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0YTQ5OWY4Ij4NCjxwPldlbGNvbWUgdG8gdGhlIEp1 bHkgMjAyMyBlZGl0aW9uIG9mIHRoZSBPQ2FtbC5vcmcgbmV3c2xldHRlciEgQXMgd2l0aCB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvb2NhbWxvcmctbmV3c2xldHRl ciI+DQpwcmV2aW91cyBpc3N1ZXM8L2E+LCB0aGlzIHVwZGF0ZSBoYXMgYmVlbiBjb21waWxlZCBi eSBAc2FiaW5lIGFuZCBAdG1hdHRpby4gPC9wPg0KPHA+T3VyIGdvYWwgaXMgdG8gbWFrZSBPQ2Ft bC5vcmcgdGhlIGJlc3QgcmVzb3VyY2UgZm9yIGFueW9uZSB3aG8gd2FudHMgdG8gZ2V0IHN0YXJ0 ZWQgYW5kIGJlIHByb2R1Y3RpdmUgaW4gT0NhbWwuIFRoZSBPQ2FtbC5vcmcgbmV3c2xldHRlciBw cm92aWRlcyBhbiB1cGRhdGUgb2Ygb3VyIHByb2dyZXNzIHRvd2FyZHMgdGhhdCBnb2FsIGFuZCBh biBvdmVydmlldyBvZiBjaGFuZ2VzIHdlIGFyZSB3b3JraW5nIG9uLg0KPC9wPg0KPHA+V2UgY291 bGRu4oCZdCBkbyBpdCB3aXRob3V0IGFsbCB0aGUgYW1hemluZyBPQ2FtbCBjb21tdW5pdHkgbWVt YmVycyB3aG8gaGVscCB1cyByZXZpZXcsIHJldmlzZSwgYW5kIGNyZWF0ZSBiZXR0ZXIgT0NhbWwg ZG9jdW1lbnRhdGlvbi4gWW91ciBmZWVkYmFjayBlbmFibGVzIHVzIHRvIGJldHRlciBwcmlvcml0 aXNlIG91ciB3b3JrIGFuZCBtYWtlIHByb2dyZXNzIHRvd2FyZHMgb3VyIGdvYWwuIFRoYW5rIHlv dSENCjwvcD4NCjxwPlRoaXMgbW9udGgsIG91ciBwcmlvcml0aWVzIHdlcmU6IDwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5MZWFybiBBcmVhOjwvYj4gV2XigJlyZSB3b3JraW5nIHRv d2FyZHMgbWFraW5nIE9DYW1sLm9yZyBhIGdyZWF0IHJlc291cmNlIHRvIGxlYXJuIE9DYW1sIGFu ZCBkaXNjb3ZlciBpdHMgZWNvc3lzdGVtLiBUaGlzIG1vbnRoLCB3ZSBjb250aW51ZWQgd3JpdGlu ZyB0aGUgbmV3IGRvY3VtZW50YXRpb24gY29udGVudCBhbmQgaXRlcmF0aW5nIG9uIGNvbW11bml0 eSBmZWVkYmFjay4gV2UgYWxzbyBmaW5hbGlzZWQgdGhlIEZpZ21hIGxpZ2h0IGRlc2t0b3ANCiBk ZXNpZ25zIGFuZCBzdGFydGVkIGltcGxlbWVudGluZyB0aGUgVUkuIDwvbGk+PGxpPjxiPkphdmFT Y3JpcHQgVG9wbGV2ZWxzPC9iPjogV2Ugc3RhcnRlZCBleHBsb3JpbmcgaG93IHRvIGdlbmVyYXRl IEphdmFTY3JpcHQgdG9wbGV2ZWxzIGZvciBPQ2FtbCBwYWNrYWdlcywgd2l0aCB0aGUgZ29hbCBv ZiBhbGxvd2luZyB1c2VycyB0byBsb2FkIHBhY2thZ2VzIGludG8gdGhlDQo8YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9wbGF5Ij5PQ2FtbCBQbGF5Z3JvdW5kPC9hPiwgYW5kIGFkZGluZyBhIG5l dyB0b3BsZXZlbCBmZWF0dXJlIHRvIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcGFj a2FnZXMiPk9DYW1sIFBhY2thZ2VzIGFyZWE8L2E+LiBVbHRpbWF0ZWx5LCB3ZSBhaW0gdG8gbWFr ZSBldmVyeSBjb2RlIGJsb2NrIG9uIE9DYW1sLm9yZyBpbnRlcmFjdGl2ZSENCjwvbGk+PGxpPjxi PkdlbmVyYWwgSW1wcm92ZW1lbnRzOjwvYj4gQXMgdXN1YWwsIHdlIGFsc28gd29ya2VkIG9uIGdl bmVyYWwgbWFpbnRlbmFuY2UgYW5kIGltcHJvdmVtZW50cyBiYXNlZCBvbiB1c2VyIGZlZWRiYWNr LCBhbmQgd2XigJlyZSBoaWdobGlnaHRpbmcgc29tZSBvZiBvdXIgd29yay4NCjwvbGk+PC91bD4N CjxwPkluIGFkZGl0aW9uIHRvIG91ciB3b3JrIG9uIHRoZSBzaXRlLCB3ZSBpbnRyb2R1Y2VkIG5l dyB3YXlzIGZvciB0aGUgdGVhbSB0byBpbnRlcmFjdCB3aXRoIHRoZSBjb21tdW5pdHkuIFdl4oCZ dmUgY3JlYXRlZCBhbg0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjb3JkLmNvbS9jaGFubmVscy80MzY1 NjgwNjAyODgxNzIwNDIvMTEyNjQzMzkwNjk3NjExMjcwMCI+I29jYW1sLm9yZyBEaXNjb3JkIGNo YW5uZWw8L2E+LCBhbmQgd2Ugc3RhcnRlZCBob2xkaW5nDQo8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QveW91LWNhbi1hdHRlbmQtdGhlLW5ldy1vY2FtbC1vcmctY29tbXVuaXR5 LW1lZXRpbmdzLzEyNjU2LzEiPg0KcHVibGljIE9DYW1sLm9yZyBkZXYgbWVldGluZ3M8L2E+LiBE b27igJl0IGhlc2l0YXRlIHRvIHJlYWNoIG91dCB0byB1cyBvbiBEaXNjb3JkIGFuZCBqb2luIHRo ZSBkZXYgbWVldGluZ3MuIFdl4oCZcmUgYWx3YXlzIGxvb2tpbmcgZm9yIG5ldyBpbnNpZ2h0cyBv biB0aGluZ3MgdG8gaW1wcm92ZSENCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnOGU1MGM1ZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzhlNTBjNWQi PkxlYXJuIEFyZWE8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y ZzhlNTBjNWQiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmcwNWNh M2VhIj48L2E+MS4gUmVkZXNpZ24gb2YgdGhlIExlYXJuIEFyZWE8YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMDVjYTNlYSI+DQo8cD5BcyB0aGUgZGVzaWducyBm b3IgdGhlIG5ldyBMZWFybiBhcmVhIGFyZSBuZWFyaW5nIGNvbXBsZXRpb24sIHdlIHN0YXJ0ZWQg aW1wbGVtZW50aW5nIHRoZSBVSS4gSWYgeW91IGhhdmUgdmlzaXRlZCB0aGUgZG9jdW1lbnRhdGlv biBpbiB0aGUgcGFzdCBmZXcgd2Vla3MsIHlvdeKAmXZlIHByb2JhYmx5IG5vdGljZWQgYSBmZXcg Y2hhbmdlcy4gVGhlIG1vc3QgcHJvbWluZW50IG9uZSBiZWluZyB0aGUgbmV3IHRhYnMgdG8gbmF2 aWdhdGUgdGhlIGRpZmZlcmVudA0KIHBhcnRzIG9mIHRoZSBkb2N1bWVudGF0aW9uLiA8L3A+DQo8 cD5PbiB0aGUgZGVzaWduIGZyb250LCBvdXIgZm9jdXMgd2lsbCBub3cgYmUgZGlyZWN0ZWQgdG8g dGhlIG1vYmlsZSB2aWV3cyBhbmQgZGFyayBtb2RlLg0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJz IGFuZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkNvbnRp bnVlZCB3b3JrIG9uIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmZpZ21hLmNvbS9maWxlL0FxazV5MDNm c2FDdWhUU3l3bW1ZMDYvT0NhbWwub3JnLVB1YmxpYy1EZXNpZ25zP3R5cGU9ZGVzaWduJmFtcDtu b2RlLWlkPTEzMC03NTQmYW1wO21vZGU9ZGVzaWduJmFtcDt0PVh2VkNNdWtxNUFSM294UmYtMCI+ DQpGaWdtYSBVWC9VSSBkZXNpZ25zPC9hPiBmb3IgdGhlIG5ldyBMZWFybiBhcmVhOg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPkZpbmFsaXNlZCB0aGUgbGlnaHQgdGhlbWUgZGVzaWducyA8L2xp PjxsaT5DcmVhdGVkIGNvbG9yIHZhcmlhbnRzIGFuZCBhIGNvbG9yIHBhbGV0dGUgaW4gRmlnbWEs IGFpbWluZyBmb3IgY29uc2lzdGVuY3kgd2l0aCBGaWdtYSB0byB0aGUgVGFpbHdpbmQgY29uZmln dXJhdGlvbiwgYW5kIGVzdGFibGlzaGVkIG5hbWluZyBjb252ZW50aW9ucyBmb3IgbGlnaHQgYW5k IGRhcmsgbW9kZSBjb2xvcnMuDQo8L2xpPjxsaT5EZXNpZ25lZCB2YXJpb3VzIGJ1dHRvbiB2YXJp YW50cyBvbiBGaWdtYSwgaW5jbHVkaW5nIEV4dHJhIGxhcmdlLCBMYXJnZSwgU21hbGwsIExhcmdl IEdob3N0LCBHaG9zdCwgYW5kIExldmVsIHRhZyBzdHlsZXMuDQo8L2xpPjwvdWw+DQo8L2xpPjxs aT5TdGFydGVkIGltcGxlbWVudGluZyBuZXcgY29tcG9uZW50cyBmb3IgdGhlIExlYXJuIEFyZWE6 DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGFiIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTM4OSI+b2NhbWwvb2NhbWwub3JnIzEzODk8L2E+ DQo8L2xpPjxsaT5UdXRvcmlhbCBibG9jayDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzEzODciPm9jYW1sL29jYW1sLm9yZyMxMzg3PC9hPg0KPC9s aT48bGk+TGFuZ3VhZ2UgTWFudWFsIGJhbm5lciDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MDYiPg0Kb2NhbWwvb2NhbWwub3JnIzE0MDY8L2E+ IDwvbGk+PGxpPlNraWxsIGxldmVsIHRhZyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MjciPm9jYW1sL29jYW1sLm9yZyMxNDI3PC9hPg0KPC9s aT48L3VsPg0KPC9saT48bGk+SW50cm9kdWNlZCBuZXcgdGFicyB0byBuYXZpZ2F0ZSB0aGUgT0Nh bWwgZG9jdW1lbnRhdGlvbiBieSBzZWN0aW9uIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQyOSI+DQpvY2FtbC9vY2FtbC5vcmcjMTQyOTwvYT4g PC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnZDUwMWVjOSI+PC9hPjIuIE9D YW1sIERvY3VtZW50YXRpb248YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRl eHQtb3JnZDUwMWVjOSI+DQo8cD5XZSBhbHNvIGNvbnRpbnVlZCB0aGUgd29yayBvbiB0aGUgbmV3 IGRvY3VtZW50YXRpb24gY29udGVudC4gQXMgd2XigJl2ZSBiZWVuIHRocm91Z2ggdGhlIGxpZmVj eWNsZSBvZiBuZXcgcGFnZXMgYSBjb3VwbGUgdGltZXMsIHdl4oCZcmUgZ2V0dGluZyBtb3JlIHN0 cnVjdHVyZWQuIEVhY2ggbmV3IHBhZ2UgZ29lcyB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgc3RlcHM6 IE91dGxpbmUgQXBwcm92YWwsIERyYWZ0aW5nLCBJbnRlcm5hbCBSZXZpZXcgYW5kLA0KIGZpbmFs bHksIENvbW11bml0eSBSZXZpZXcuIFdlIGhhdmUgdHdvIG5ldyBwYWdlcyB0aGF0IGFyZSBpbiB0 aGUgZmluYWwgc3RhZ2UgKGNvbW11bml0eSByZXZpZXcpLCBuYW1lbHkgdGhlIEZpbGUgTWFuaXB1 bGF0aW9uIHR1dG9yaWFsIGFuZCBBcnJheXMgZ3VpZGUuIFRoZXkgc2hvdWxkIGJlIHJlYWR5IHRv IG1lcmdlIGluIHRoZSBjb21pbmcgd2Vla3MuIFdlIGFsc28gaGF2ZSBhIGNvbXBsZXRlbHkgbmV3 IEdldHRpbmcgU3RhcnRlZCB0dXRvcmlhbA0KIHRoYXQgYWltcyB0byByZXBsYWNlIHRoZSBleGlz dGluZyDigJxZb3VyIEZpcnN0IERheSB3aXRoIE9DYW1sLuKAnSBJdOKAmXMgY3VycmVudGx5IGlu IHRoZSBpbnRlcm5hbCByZXZpZXcgc3RhZ2UgYW5kIHNob3VsZCBiZSBzaGFyZWQgb24gRGlzY3Vz cyBmb3IgY29tbXVuaXR5IHJldmlldyBzb29uLg0KPC9wPg0KPHA+UGx1cywgd2XigJl2ZSBnb3Qg YSBsb3QgbW9yZSBjb250ZW50IGluIHRoZSBkcmFmdGluZyBzdGFnZS4gPC9wPg0KPHA+U3RheSB0 dW5lZCwgYXMgd2XigJlsbCBiZSBzaGFyaW5nIG1vcmUgYW5kIG1vcmUgbmV3IGRvY3VtZW50YXRp b24gcGFnZXMgZm9yIGNvbW11bml0eSByZXZpZXchDQo8L3A+DQo8cD48Yj5SZWxldmFudCBQUnMg YW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q3JlYXRl ZCBhIHRlbnRhdGl2ZSA8YSBocmVmPSJodHRwczovL2hhY2ttZC5pby9wLUpIRFFVQ1NTNnozbjJO WWE4UXp3P3ZpZXciPmhpZ2gtbGV2ZWwgb3V0bGluZTwvYT4gYW5kIFttZXRhLWlzc3VlXSgoPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9pc3N1ZXMvMTQxNSI+aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9pc3N1ZXMvMTQxNTwvYT4pKSB0byB0cmFj ayBvdXIgcHJvZ3Jlc3MuDQo8L2xpPjxsaT5Xb3JrZWQgb24gdGhlIG5ldyBkb2N1bWVudGF0aW9u IGNvbnRlbnQNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaWxlIE1hbmlwdWxhdGlvbiAoc3Rh dHVzOiBjb21tdW5pdHkgcmV2aWV3KQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDAwIj5QdWxsIFJlcXVl c3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9oZWxw LXJldmlldy10aGUtbmV3LWZpbGUtbWFuaXB1bGF0aW9uLXR1dG9yaWFsLW9uLW9jYW1sLW9yZy8x MjYzOCI+RGlzY3VzcyB0aHJlYWQ8L2E+DQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5OZXcgQXJyYXlz IHR1dG9yaWFsIChzdGF0dXM6IGNvbW11bml0eSByZXZpZXcpDQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0 MDUiPlB1bGwgUmVxdWVzdDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2ZlZWRiYWNrLW5lZWRlZC1uZXctYXJyYXlzLXR1dG9yaWFsLW9uLW9jYW1sLW9y Zy8xMjY4MyI+RGlzY3VzcyB0aHJlYWQ8L2E+DQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5Ub3VyIG9m IE9DYW1sIChzdGF0dXM6IGludGVybmFsIHJldmlldykNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQzMSI+ UHVsbCBSZXF1ZXN0PC9hPiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5TLUV4cHJlc3Npb25zIHR1dG9y aWFsIChpbnRlcm5hbCByZXZpZXcpIDwvbGk+PGxpPk1hcHMgYW5kIFNldHMgZ3VpZGVzIChzdGF0 dXM6IGRyYWZ0aW5nKSA8L2xpPjxsaT5CYXNpYyBEYXRhdHlwZXMgZ3VpZGUgKHN0YXR1czogZHJh ZnRpbmcpIDwvbGk+PC91bD4NCjwvbGk+PGxpPldhdGNoZWQgVGhlVmltZWFnZW4gPGEgaHJlZj0i aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1taGtvV3A1QWt3dyI+4oCcTGVhcm5pbmcg T0NhbWwgUGFydCAx4oCdPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29t L3dhdGNoP3Y9RWdpZ1FYcGFkRnciPuKAnExlYXJuIE9DYW1sIFBhcnQgMuKAnTwvYT4uIFN1YnNl cXVlbnRseSwgbWFkZSBpdCBjbGVhcmVyIGhvdyB0byBhY3RpdmF0ZSB0aGUgb3BhbSBzd2l0Y2gg b24gdGhlIGluc3RhbGwgcGFnZSDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8xMzkwIj5vY2FtbC9vY2FtbC5vcmcjMTM5MDwvYT4gPC9saT48bGk+ SW5jb3Jwb3JhdGluZyBmZWVkYmFjayBmcm9tIHJldmlld3M6DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+SW5jbHVkZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ21ldmVsIj5AZ21ldmVs PC9hPiBwcm9vZi1yZWFkaW5nIG9mIFNlcSB0dXRvcmlhbA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEzNzYiPm9jYW1sL29jYW1sLm9yZyMxMzc2PC9h PiA8L2xpPjwvdWw+DQo8L2xpPjxsaT5PdGhlciBkb2N1bWVudGF0aW9uIGltcHJvdmVtZW50cw0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxpbmUgZWRpdHMgb24gZXhpc3RpbmcgTGFiZWxzIHR1 dG9yaWFsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x MDQwIj4NCm9jYW1sLm9yZyMxMDQwPC9hPiA8L2xpPjxsaT5Nb3ZlZCB0aGUgRXJyb3IgSGFuZGxp bmcgZ3VpZGUgZnJvbSBMYW5ndWFnZSB0byB0aGUgR3VpZGVzIHNlY3Rpb24g4oCTIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMzgzIj4NCm9jYW1sLm9y ZyMxMzgzPC9hPiA8L2xpPjxsaT5Db252ZXJ0ZWQgZXhhbXBsZSBmcm9tIExhVGVYIHRvIG1hcmtk b3duIGluIHRoZSBJZiBTdGF0ZW1lbnRzLCBMb29wcywgYW5kIFJlY3Vyc2lvbiB0dXRvcmlhbCDi gJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDM5 Ij5vY2FtbC5vcmcjMTQzOTwvYT4gPC9saT48bGk+UmVwbGFjZWQgPGNvZGU+ZHVuZSBidWlsZCBA cnVudGVzdDwvY29kZT4gYnkgPGNvZGU+ZHVuZSBydW50ZXN0PC9jb2RlPiBpbiB0aGUgUnVubmlu ZyBFeGVjdXRhYmxlcyBhbmQgVGVzdHMgd2l0aCBEdW5lIHR1dG9yaWFsIOKAkw0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MzAiPm9jYW1sLm9yZyMx NDMwPC9hPiA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJv cmdjODhiYmFmIj48L2E+My4gUHJlcGFyaW5nIHRoZSBNb3ZlIG9mIHRoZSBvcGFtIERvY3VtZW50 YXRpb24gdG8gT0NhbWwub3JnPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0 ZXh0LW9yZ2M4OGJiYWYiPg0KPHA+VGhlIG5leHQgc3RlcCBmb3IgdGhlIGNlbnRyYWxpc2VkIHBh Y2thZ2UgZG9jdW1lbnRhdGlvbiBpcyB0byBzZXJ2ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjcml0 aWNhbCBPQ2FtbCBwYWNrYWdlcywgaW5jbHVkaW5nIHRoZSBPQ2FtbCBtYW51YWwgYW5kIHRoZSBQ bGF0Zm9ybSB0b29scyBkb2N1bWVudGF0aW9uLiBUaGlzIHJlcXVpcmVzIGEgbG90IG9mIHdvcmsg b24NCjxjb2RlPm9kb2M8L2NvZGU+IHRvIHJlbW92ZSB0aGUgYmxvY2tlcnMgdGhhdCBwcmV2ZW50 cyBwcm9qZWN0IGZyb20gbW92aW5nIGZyb20gdGhlaXIgY3VycmVudCBkb2N1bWVudGF0aW9uIGdl bmVyYXRvciB0bw0KPGNvZGU+b2RvYzwvY29kZT4uIEFzIGFuIGludGVybWVkaWF0ZSBzdGVwLCB3 ZeKAmWxsIGJlIG1vdmluZyB0aGUgb3BhbSBkb2N1bWVudGF0aW9uIHRvIE9DYW1sLm9yZ+KAmXMg TGVhcm4gYXJlYSwgc28gd2UgY2FuIHJldGlyZSB0aGUgZnJvbnRlbmQgb2Ygb3BhbS5vY2FtbC5v cmcgYW5kIHJlZGlyZWN0IGFsbCB0aGUgdHJhZmljIHRvIG9jYW1sLm9yZy4NCjwvcD4NCjxwPldl 4oCZdmUgYmVlbiB3b3JraW5nIHRvd2FyZHMgdGhlc2UgZ29hbHMgdGhpcyBtb250aC4gWW91IGNh biBmb2xsb3cgb3VyIHByb2dyZXNzIG9uDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTM2NyI+dGhpcyBQUjwvYT4uIDwvcD4NCjxwPjxiPlJlbGV2YW50 IFBScyBhbmQgQWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5v Y2FtbC9vcGFtOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk1vdmUgb3BhbSBkb2N1bWVudGF0 aW9uIGZyb20gb3BhbS5vY2FtbC5vcmcgdG8gb2NhbWwub3JnIOKAkyA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTM2NyI+DQpvY2FtbC9vY2FtbC5vcmcj MTM2NzwvYT4gPC9saT48bGk+Q29udmVydCBtYW4gcGFnZXMgdG8gTWFya2Rvd24gd2l0aCBZQU1M IGhlYWRlciDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81 NTk0Ij4NCm9jYW1sL29wYW0jNTU5NDwvYT4gPC9saT48bGk+Q2hhbmdpbmcgdGhlIE1hcmtkb3du IGZpbGVzIGluIDxjb2RlPmRvYy9wYWdlczwvY29kZT4gdG8gYmUgYW1lbmFibGUgZm9yIHVzZSBv biBPQ2FtbC5vcmcg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9w dWxsLzU1OTMiPm9jYW1sL29wYW0jNTU5MzwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+b2NhbWwt b3BhbS9vcGFtMndlYjoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5SZWFycmFuZ2UgPGNvZGU+ b3BhbTJ3ZWI8L2NvZGU+IHRvIHJlbW92ZSBhbGwgcGFja2FnZSBpbmZvLCBidWlsZCBvbmx5IG9w YW0gYXJjaGl2ZSwga2VlcCBwdWJsaWMga2V5LCBhbmQgY3JlYXRlIHJlZGlyZWN0aW9ucyBmcm9t IG9wYW0ub2NhbWxvcmcgdG8gb2NhbWwub3JnIGluIGEgQ2FkZHlmaWxlLiBDdXJyZW50IFdJUCBi cmFuY2ggYXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUvb3BhbTJ3ZWIvdHJl ZS9zdHJpcF90b19iYXJlX21pbmltdW0iPmh0dHBzOi8vZ2l0aHViLmNvbS9zYWJpbmUvb3BhbTJ3 ZWIvdHJlZS9zdHJpcF90b19iYXJlX21pbmltdW08L2E+DQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5v Y2FtbC9vY2FtbC5vcmc6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0NTkiPkdpdmUgTG9jYWwgQmxvZ3Mg YSBQYWdlIGFuZCBSU1MgRmVlZHM8L2E+LiBUaGlzIGludHJvZHVjZXMgdGhlIGNvbmNlcHQgb2Yg YSDigJxibG9nIGhvc3RlZCBvbiBPQ2FtbC5vcmcu4oCdIFRoaXMgd2F5LCB3ZSBjYW4gaG9zdCB0 aGUgbm9uLWNoYW5nZWxvZyBwb3N0cyBvZiB0aGUgb3BhbSBibG9nIGluIHN1Y2ggYSB3YXkgdGhh dCB3ZSBjYW4gcmVkaXJlY3QNCjxjb2RlPm9wYW0ub2NhbWwub3JnL2Jsb2cvZmVlZC54bWw8L2Nv ZGU+IHRvIDxjb2RlPm9jYW1sLm9yZy9ibG9nL29wYW0vZmVlZC54bWw8L2NvZGU+DQo8L2xpPjwv dWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnOGRiNWYzOSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzhkYjVmMzkiPkphdmFTY3JpcHQgVG9wbGV2ZWxzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmc4ZGI1ZjM5Ij4NCjxwPkFsd2F5cyB3aXRoIHRoZSBhaW0gdG8g aW1wcm92ZSB0aGUgbGVhcm5pbmcgZXhwZXJpZW5jZSwgd2XigJlyZSBleHBsb3JpbmcgaG93IHRv IGdlbmVyYXRlIEphdmFTY3JpcHQgdG9wbGV2ZWxzIGZvciBhbGwgdGhlIE9DYW1sIHBhY2thZ2Vz ICh0aGUgb25lcyB0aGF0IGFyZSBKYXZhU2NyaXB0LWNvbXBhdGlibGUsIHRoYXQgaXMpLg0KPC9w Pg0KPHA+VGhpcyB3b3VsZCBlbmFibGUgYSBmZXcgdmVyeSBuZWF0IG5ldyBmZWF0dXJlczogPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxvYWRpbmcgT0NhbWwgcGFja2FnZXMgZnJvbSB0 aGUgT0NhbWwgUGxheWdyb3VuZDogdG8gZW5hYmxlIHRoZSB1c2Ugb2YgYW55IEphdmFTY3JpcHQt Y29tcGF0aWJsZSBwYWNrYWdlLiBUaGlzIGlzIHZlcnkgaGFuZHkgdG8gc2hhcmUgY29kZSBzbmlw cGV0cyB0byBiZWdpbm5lcnMsIHdoaWNoIGlzIGN1cnJlbnRseSBsaW1pdGVkIHRvIHVzaW5nIHRo ZSBzdGFuZGFyZCBsaWJyYXJ5Lg0KPC9saT48bGk+VG9wbGV2ZWxzIGZvciBPQ2FtbCBwYWNrYWdl cyBvbiB0aGUgY2VudHJhbGlzZWQgZG9jdW1lbnRhdGlvbjogdG8gc3Bhd24gYSB0b3BsZXZlbCB3 aGlsZSBuYXZpZ2F0aW5nIHRoZSBkb2N1bWVudGF0aW9uLg0KPC9saT48bGk+SW50ZXJhY3RpdmUg dG9wbGV2ZWxzIGZvciBldmVyeSBjb2RlIGJsb2NrOiBUaGlzIGluY2x1ZGVzIHRoZSBPQ2FtbCBw YWNrYWdlcyB0aGF0IGNvbnRhaW4gY29kZSBleGFtcGxlcywgYnV0IGFsc28gZXZlcnkgY29kZSBi bG9jayBhbmQgZXhlcmNpY2VzIG9uIHRoZSBMZWFybiBhcmVhLiBZb3XigJlkIGJlIGFibGUgdG8g cnVuIHRoZSBjb2RlLCBlZGl0IGl0LCBydW4gaXQgYWdhaW4gYW5kIGluc3BlY3QgdGhlIHJlc3Vs dCBkaXJlY3RseSBmcm9tDQogdGhlIGJyb3dzZXIuIEV2ZXJ5IGRvY3VtZW50YXRpb24gcGFnZSBi ZWNvbWVzIGEgSnVweXRlciBub3RlYm9vayEgPC9saT48L3VsPg0KPHA+V2XigJlyZSB2ZXJ5IGV4 Y2l0ZWQgYXQgdGhlIHBvc3NpYmlsaXRpZXMgdGhpcyBicmluZ3MgdG8gaW1wcm92aW5nIHRoZSBs ZWFybmluZyBleHBlcmllbmNlLiBMZXQgdXMga25vdyB3aGF0IHlvdSB0aGluaywgYW5kIHN0YXkg dHVuZWQgZm9yIHVwZGF0ZXMgb24gb3VyIGV4cGxvcmF0aW9ucyENCjwvcD4NCjxwPjxiPlJlbGV2 YW50IFBScyBhbmQgQWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5Qcm9jZXNzIDxjb2RlPi5jbWE8L2NvZGU+4oCZcywgPGNvZGU+LmNtaTwvY29kZT7igJlzIGFu ZCB0b3BsZXZlbCA8Y29kZT4uanM8L2NvZGU+IGZpbGVzIOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLWRvYy92b29kb28vcHVsbC8xMTQiPm9jYW1sLWRvYy92b29kb28jMTE0 PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnYmQ1N2M3YSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2JkNTdjN2EiPkdl bmVyYWwgSW1wcm92ZW1lbnRzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmdiZDU3YzdhIj4NCjxwPlRoaXMgbW9udGgsIHdl4oCZcmUgd2VsY29taW5nIG5vIGxl c3MgdGhhbiA0IG5ldyBjb250cmlidXRvcnM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29udGlmaWNhdGUiPkBjb250aWZpY2F0ZTwv YT4gaW1wcm92ZWQgdGhlIE9DYW1sIFBsYXlncm91bmQgbGF5b3V0IHdpdGgNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9TdG9uZWRIZXN1cyI+QFN0b25lZEhlc3VzPC9hPiBkb2luZyBhIHJl dmlldyA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vanVzdC1tYXgiPkBqdXN0 LW1heDwvYT4gZml4ZWQgYW4gaXNzdWUgd2l0aCBjb2RlIHNoYXJpbmcgb24gdGhlIE9DYW1sIFBs YXlncm91bmQNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9Bc2hpbmVGb3N0 ZXIiPkBBc2hpbmVGb3N0ZXI8L2E+IHVwZGF0ZWQgdGhlIGRldiBzZXR1cCB0byBiZSBhYmxlIHRv IHJ1biB0aGUgc2l0ZSB3aXRob3V0IGFuIGludGVybmV0IGNvbm5lY3Rpb24uDQo8L2xpPjxsaT48 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGhldGVhY2hyIj5AdGhldGVhY2hyPC9hPiBjb250 cmlidXRlZCBhIHR5cG8gZml4IHRvIHRoZSBob21lcGFnZS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9icmFuZG9uY2MiPkBicmFuZG9uY2M8L2E+IGNvbnRyaWJ1dGVkIGEg dHlwbyBmaXggdG8gdGhlIEZpcnN0IERheSB3aXRoIE9DYW1sIHR1dG9yaWFsDQo8L2xpPjwvdWw+ DQo8cD5UaGFua3MgYSBsb3QgdG8gYWxsIHRoZSBjb250cmlidXRvcnMgdGhpcyBtb250aCEgSXTi gJlzIGxvdmVseSB0byBzZWUgbW9yZSBhbmQgbW9yZSBwZW9wbGUgbWFraW5nIGNvbnRyaWJ1dGlv bnMgdG8gdGhlIHNpdGUhDQo8L3A+DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6 PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+T0NhbWwgUGxheWdyb3VuZDoNCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vY29udGlm aWNhdGUiPkBjb250aWZpY2F0ZTwvYT4gcmVzb2x2ZWQgdGhlIGxheW91dCBwcm9ibGVtIG9mIHRo ZSBwbGF5Z3JvdW5k4oCZcyBib3R0b20gYmFyIGFuZCB0aG9yb3VnaGx5IHRlc3RlZCBpdCBpbiBk aWZmZXJlbnQgYnJvd3NlcnMgd2l0aCBhIHJldmlldyBmcm9tDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vU3RvbmVkSGVzdXMiPkBTdG9uZWRIZXN1czwvYT4g4oCTIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMzg0Ij4NCm9jYW1sLm9yZyMxMzg0 PC9hPiA8L2xpPjxsaT5CdWlsZGluZyB0aGUgcGxheWdyb3VuZCB3YXMgY2hhbGxlbmdpbmcgZHVl IHRvIGEgc2NyaXB0IGluY29tcGF0aWJpbGl0eSB3aXRoIFBPU0lYIOKAkw0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0NTYiPm9jYW1sLm9yZyMxNDU2 PC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vanVzdC1tYXgiPkBqdXN0 LW1heDwvYT4gZGlzY292ZXJlZCBhbmQgcmVzb2x2ZWQgYW4gaXNzdWUgd2l0aCBCYXNlNjQtZW5j b2RlZCBVUkxzIGdlbmVyYXRlZCBieSB0aGUgUGxheWdyb3VuZCBzaGFyZSBidXR0b24sIGVuc3Vy aW5nIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkg4oCTDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTQzNCI+b2NhbWwub3JnIzE0MzQ8L2E+IDwvbGk+PC91 bD4NCjwvbGk+PGxpPk9DYW1sLm9yZyBwYWNrYWdlIGRvY3VtZW50YXRpb246DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+Vm9vZG9vIG91dHB1dCBmb3JtYXQgd2FzIHVwZGF0ZWQgdG8gbGlzdCBS RUFETUUvTElDRU5TRS9DSEFOR0VMT0cgYXMgcGFydCBvZiA8Y29kZT4NCnN0YXR1cy5qc29uPC9j b2RlPiDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWRvYy92b29kb28vcHVs bC82OCI+dm9vZG9vIzY4PC9hPiwNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8xNDM1Ij5vY2FtbC5vcmcjMTQzNTwvYT4gPC9saT48bGk+Vm9vZG9vIG5v dyBpbmNsdWRlcyBhIDxjb2RlPlZvb2Rvb19zZXJpYWxpemU8L2NvZGU+IG1vZHVsZSBmb3IgZGF0 YSBzZXJpYWxpc2F0aW9uIGFuZCBkZXNlcmlhbGlzYXRpb24g4oCTDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtZG9jL3Zvb2Rvby9wdWxsLzEwMyI+dm9vZG9vIzEwMzwvYT4sIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDQyIj4NCm9j YW1sLm9yZyMxNDQyPC9hPiA8L2xpPjxsaT5Db21waWxlIHN0ZXAgaXNzdWVzIHdpdGggZG9jdW1l bnRhdGlvbiBwaXBlbGluZSBnZW5lcmF0aW9uIHRvb2wgYWRkcmVzc2VkIOKAkyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZG9jL3Zvb2Rvby9wdWxsLzExNSI+DQp2b29kb28jMTE1 PC9hPiA8L2xpPjxsaT5JbiBjYXNlIG9mIG1pc3NpbmcgZG9jdW1lbnRhdGlvbiwgdXNlcnMgYXJl IG5vdyByZWRpcmVjdGVkIHRvIHRoZSBsYXN0IGRvY3VtZW50ZWQgdmVyc2lvbiDigJMNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDM4Ij5vY2FtbC5v cmcjMTQzODwvYT4gPC9saT48L3VsPg0KPC9saT48bGk+QnVnIGZpeGVzIGFuZCBtaXNjZWxsYW5l b3VzIGltcHJvdmVtZW50czoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vQXNoaW5lRm9zdGVyIj5AQXNoaW5lRm9zdGVyPC9hPiBtYWRlIG9jYW1s Lm9yZyBydW4gb2ZmbGluZSBkdXJpbmcgZGV2ZWxvcG1lbnQg4oCTDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTM2NiI+b2NhbWwub3JnIzEzNjY8L2E+ IDwvbGk+PGxpPk9DYW1sIENoYW5nZWxvZyBpcyBubyBsb25nZXIgZXhwZXJpbWVudGFsIOKAkyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTM2OSI+DQpv Y2FtbC5vcmcjMTM2OTwvYT4gPC9saT48bGk+UmVzb2x2ZWQgT0NhbWwgQ2hhbmdlbG9nIHRhZ3Pi gJkgb3ZlcmZsb3cgaXNzdWUg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8xMzU4Ij4NCm9jYW1sLm9yZyMxMzU4PC9hPiA8L2xpPjxsaT5GaXhlZCB1 bnJlYWRhYmxlIGNvbXBvbmVudHMgZHVlIHRvIHRhaWx3aW5kIGNvbmZpZ3VyYXRpb24gY2hhbmdl cyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEz NzUiPg0Kb2NhbWwub3JnIzEzNzU8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTM3NyI+b2NhbWwub3JnIzEzNzc8L2E+LA0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzE0MjgiPm9jYW1sLm9yZyMxNDI4 PC9hPiA8L2xpPjxsaT5EYXJrIG1vZGUgbmF2aWdhdGlvbuKAmXMgbG9nbyBjb2xvciB3YXMgY29y cmVjdGVkIGZvciBtb2JpbGUgdmlldyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzEzODUiPg0Kb2NhbWwub3JnIzEzODU8L2E+IDwvbGk+PGxpPkFw cGxpZWQgPGNvZGU+b2RvYzwvY29kZT7igJlzIHN0eWxlcyB0byBwYWNrYWdlIGRvY3VtZW50YXRp b24gcGFnZXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8xMzc4Ij4NCm9jYW1sLm9yZyMxMzc4PC9hPiA8L2xpPjxsaT5JbXByb3ZlZCBDT05UUklC VVRJTkcubWQgaW5zdHJ1Y3Rpb25zIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTM2NSI+DQpvY2FtbC5vcmcjMTM2NTwvYT4gPC9saT48bGk+QWRk ZWQgYSBCZSBTcG9ydCBzb2NpYWwgbmV0d29yayBzdWNjZXNzIHN0b3J5IOKAkyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTM2MiI+DQpvY2FtbC5vcmcj MTM2MjwvYT4gPC9saT48bGk+UHVibGlzaGVkIOKAnEludml0YXRpb24gdG8gQ29udHJpYnV0ZSB0 byBPQ2FtbC5vcmfigJ0gbmV3cyBlbnRyeSDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzEzNjMiPg0Kb2NhbWwub3JnIzEzNjM8L2E+IDwvbGk+PGxp PlVSTHMgaW4gdGhlIDxjb2RlPmRhdGEvPC9jb2RlPiBmb2xkZXIgYXJlIG5vdyByb3V0aW5lbHkg Y2hlY2tlZCBieSA8Y29kZT50YXJpZGVzL29saW5rY2hlY2s8L2NvZGU+Lg0KPC9saT48L3VsPg0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj5Vc2luZyA8 Y29kZT5bQHBvbGwgZXJyb3JdPC9jb2RlPiBhdHRyaWJ1dGUgdG8gaW1wbGVtZW50IHN5c3RocmVh ZCBzYWZlIGRhdGEgc3RydWN0dXJlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3VzaW5nLXBvbGwtZXJyb3ItYXR0cmlidXRlLXRvLWltcGxlbWVudC1zeXN0aHJlYWQt c2FmZS1kYXRhLXN0cnVjdHVyZXMvMTI4MDQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvdXNpbmctcG9sbC1lcnJvci1hdHRyaWJ1dGUtdG8taW1wbGVtZW50LXN5c3RocmVhZC1zYWZl LWRhdGEtc3RydWN0dXJlcy8xMjgwNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc1ZjlmNzk1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn NWY5Zjc5NSI+VmVzYSBLYXJ2b25lbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVmOWY3OTUiPg0KPHA+Rm9yIGEgbG9uZyB0aW1lIE9DYW1s IGhhcyBzdXBwb3J0ZWQgbGlnaHR3ZWlnaHQgdGhyZWFkcyBleHBvc2VkIHZpYSB0aGUgPGEgaHJl Zj0iaHR0cHM6Ly92Mi5vY2FtbC5vcmcvYXBpL1RocmVhZC5odG1sIj4NClRocmVhZDwvYT4gbW9k dWxlLiBUaGVzZSB0aHJlYWRzIGFyZSBvZnRlbiBjYWxsZWQg4oCcc3lzdGhyZWFkc+KAnSwgYnV0 IEkgd2lsbCBzaW1wbHkgY2FsbCB0aGVtIOKAnHRocmVhZHPigJ0gaW4gdGhpcyBwb3N0Lg0KPC9w Pg0KPHA+VGhlIE9DYW1sIFN0ZGxpYiBhbHNvIHByb3ZpZGVzIG1hbnkgbXV0YWJsZSBkYXRhIHN0 cnVjdHVyZXMgc3VjaCBhcyA8YSBocmVmPSJodHRwczovL3YyLm9jYW1sLm9yZy9hcGkvSGFzaHRi bC5odG1sIj4NCkhhc2h0Ymw8L2E+LCA8YSBocmVmPSJodHRwczovL3YyLm9jYW1sLm9yZy9hcGkv UXVldWUuaHRtbCI+UXVldWU8L2E+LCBhbmQgPGEgaHJlZj0iaHR0cHM6Ly92Mi5vY2FtbC5vcmcv YXBpL1N0YWNrLmh0bWwiPg0KU3RhY2s8L2E+LiBBcyB0aGUgZG9jdW1lbnRhdGlvbiBhbGVydHMs IG5vbmUgb2YgdGhlc2UgYXJlIHRocmVhZC1zYWZlLiA8L3A+DQo8cD5JbiB0aGlzIHBvc3QgSSB3 aWxsIHZlcnkgYnJpZWZseSBkZXNjcmliZSBhbiBhcHByb2FjaCB0byBpbXBsZW1lbnRpbmcgbG9j ay1mcmVlIHRocmVhZC1zYWZlIGRhdGEgc3RydWN0dXJlcy4NCjwvcD4NCjxwPkluIE9DYW1sIDQg YW5kIGluIE9DYW1sIDUsIHdpdGhpbiBhIHNpbmdsZSA8YSBocmVmPSJodHRwczovL3YyLm9jYW1s Lm9yZy9hcGkvRG9tYWluLmh0bWwiPg0KRG9tYWluPC9hPiwgb25seSBhIHNpbmdsZSB0aHJlYWQg bWF5IHJ1biBhdCBhIHRpbWUuIEluIG90aGVyIHdvcmRzLCB0aHJlYWRzIGRvIG5vdCBydW4gaW4g cGFyYWxsZWwgZXhjZXB0IHdoZW4gdGhleSBydW4gaW4gZGlmZmVyZW50IGRvbWFpbnMgaW4gT0Nh bWwgNS4gVGhlIE9DYW1sIHJ1bnRpbWUgc2NoZWR1bGVzIHRocmVhZHMgYW5kIHNlbWkgcHJlLWVt cHRpdmVseSBzd2l0Y2hlcyAod2l0aGluIGEgZG9tYWluKSBiZXR3ZWVuIHRocmVhZHMgKGNyZWF0 ZWQNCiB3aXRoaW4gdGhlIGRvbWFpbikgZHVyaW5nIOKAnHNhZmUgcG9pbnRz4oCdLiBJbiBvdGhl ciB3b3JkcywgdGhyZWFkIHN3aXRjaGVzIGNhbm5vdCBoYXBwZW4gYXQgYXJiaXRyYXJ5IHBvaW50 cyAmYW1wO21kYXNoOyB0aGV5IG1heSBvbmx5IGhhcHBlbiBhdCBzYWZlIHBvaW50cy4gTWVtb3J5 IGFsbG9jYXRpb25zIGFyZSBzYWZlIHBvaW50cy4gQWRkaXRpb25hbCBzYWZlIHBvaW50cyAod2hl cmUgbm8gYWN0dWFsIG1lbW9yeSBhbGxvY2F0aW9uIGhhcHBlbnMpIGFyZQ0KIGluc2VydGVkIGlu dG8gdmFyaW91cyBjb25zdHJ1Y3RzIHN1Y2ggYXMgbG9vcHMuIDwvcD4NCjxwPlRoaXMgbWVhbnMg dGhhdCB3aXRoaW4gYSBibG9jayBvZiBjb2RlIHdoZXJlIHRoZXJlIGFyZSBubyBzYWZlIHBvaW50 cyBpdCBpcyBwb3NzaWJsZSB0byBtYWtlIG11bHRpcGxlIHJlYWQgYW5kIHdyaXRlIGFjY2Vzc2Vz IGF0b21pY2FsbHkgd2l0aCByZXNwZWN0IHRvIHRocmVhZHMgKHdpdGhpbiB0aGUgZG9tYWluKS4N CjwvcD4NCjxwPkhvdyBkb2VzIG9uZSBlbnN1cmUgdGhhdCBhIGJsb2NrIG9mIGNvZGUgZG9lcyBu b3QgaW5jbHVkZSBhIHNhZmUgcG9pbnQ/IDwvcD4NCjxwPlRoZSBPQ2FtbCBjb21waWxlciBwcm92 aWRlcyBhbiBhbm5vdGF0aW9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9wdWxsLzEwNDYyIj4NCjxjb2RlPltAcG9sbCBlcnJvcl08L2NvZGU+PC9hPiB0aGF0IG9uZSBj YW4gdXNlIG9uIGEgZnVuY3Rpb24gdG8gZW5zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIGRvZXMgbm90 IGluY2x1ZGUgYSBzYWZlIHBvaW50Lg0KPC9wPg0KPHA+SU9XLCB1c2luZyA8Y29kZT5bQHBvbGwg ZXJyb3JdPC9jb2RlPiBvbmUgY2FuIGVzc2VudGlhbGx5IGNyZWF0ZSBmdW5jdGlvbnMgdGhhdCBh cmUgZXhlY3V0ZWQgYXRvbWljYWxseSB3aXRoIHJlc3BlY3QgdG8gdGhyZWFkcyAod2l0aGluIGEg ZG9tYWluKS4NCjwvcD4NCjxwPldpdGggYSBwYXJ0aWN1bGFyIGFwcGxpY2F0aW9uIGluIG1pbmQs IEkgaGF2ZSBjcmVhdGVkIGEgbG9jay1mcmVlIHRocmVhZC1zYWZlIChpbnRlZ2VyIGtleWVkKSBo YXNoIHRhYmxlLA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS90 aHJlYWQtdGFibGUvdHJlZS9tYWluIj50aHJlYWQtdGFibGU8L2E+Lg0KPC9wPg0KPHA+QXMgbWVu dGlvbmVkIGluIHRoZSBSRUFETUUsIHRoZSBpbXBsZW1lbnRhdGlvbiBoYXMg4oCcemVybyBzeW5j aHJvbml6YXRpb24gb3ZlcmhlYWQgb24gbG9va3Vwc+KAnS4gSW5kZWVkLCBpZiB5b3UgbG9vayBh dCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvdGhyZWFk LXRhYmxlL2Jsb2IvZDk4ODQ4ZGU0NTRmZjU1ZmQ3NzFlMDEyNmU2ZjkyM2JmM2MzZGYzNi9zcmMv dGhyZWFkX3RhYmxlLm1sI0w1Ni1MNjEiPg0KPGNvZGU+ZmluZDwvY29kZT4gb3BlcmF0aW9uPC9h PiBpbXBsZW1lbnRhdGlvbiA8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8 cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7 Ij5maW5kPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij50PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5rJzwvc3Bhbj4gPQ0KICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5oPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi Pk1peC48L3NwYW4+aW50IGsnIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ YnVja2V0czwvc3Bhbj4gPSB0LmJ1Y2tldHMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDdhOWY7Ij5uPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwv c3Bhbj5sZW5ndGggYnVja2V0cyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5Zjsi Pmk8L3NwYW4+ID0gaCA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5sYW5kPC9zcGFuPiAo biAtIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8L3NwYW4+KSA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIGZpbmQgaycg KDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwvc3Bhbj51bnNhZmVfZ2V0IGJ1 Y2tldHMgaSkNCjwvcHJlPg0KPC9kaXY+DQo8cD5pdCBpbmNsdWRlcyBubyBzeW5jaHJvbml6YXRp b24uIEluIHRoaXMgY2FzZSBub3QgZXZlbiBhIDxjb2RlPltAcG9sbCBlcnJvcl08L2NvZGU+IGF0 dHJpYnV0ZSBpcyBuZWVkZWQuDQo8L3A+DQo8cD5Gb3Igb3RoZXIgb3BlcmF0aW9ucyB0aGUgdGhy ZWFkLXRhYmxlIGltcGxlbWVudGF0aW9uIHVzZXMgZnVuY3Rpb25zIGFubm90YXRlZCB3aXRoIHRo ZQ0KPGNvZGU+W0Bwb2xsIGVycm9yXTwvY29kZT4gYXR0cmlidXRlICh0byBtYWtlIGF0b21pYyB1 cGRhdGVzKSBhbmQgZmFtaWxpYXIgbG9jay1mcmVlIHByb2dyYW1taW5nIHBhdHRlcm5zIHN1Y2gg YXMgcmV0cnkgbG9vcHMgYW5kIGNvb3BlcmF0aW9uIHRvIGF2b2lkIHN0YXJ2YXRpb24uIEFzIGFu IGV4YW1wbGUsIHNlZSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0 aWNvcmUvdGhyZWFkLXRhYmxlL2Jsb2IvZDk4ODQ4ZGU0NTRmZjU1ZmQ3NzFlMDEyNmU2ZjkyM2Jm M2MzZGYzNi9zcmMvdGhyZWFkX3RhYmxlLm1sI0wxMjAtTDEzOSI+DQo8Y29kZT5hZGQ8L2NvZGU+ IG9wZXJhdGlvbjwvYT4gaW1wbGVtZW50YXRpb246IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMt Y29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjYTI2MDRmOyI+W0Bwb2xsIGVycm9yXTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj YTc2MDFmOyI+YWRkX2F0b21pY2FsbHk8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5 ZjsiPnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmJ1Y2tldHM8L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPm48L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPmk8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmJlZm9y ZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YWZ0ZXI8L3NwYW4+ID0NCiAg dC5yZWhhc2ggPSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4mYW1wOyZhbXA7PC9zcGFuPiBidWNrZXRzID09IHQuYnVj a2V0cw0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4mYW1wOyZhbXA7PC9zcGFuPiBi ZWZvcmUgPT0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+QXJyYXkuPC9zcGFuPnVuc2Fm ZV9nZXQgYnVja2V0cyBpDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiZhbXA7JmFt cDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5iZWdpbjwvc3Bhbj4NCiAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJh eS48L3NwYW4+dW5zYWZlX3NldCBidWNrZXRzIGkgYWZ0ZXI7DQogICAgICAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA3YTlmOyI+bGVuZ3RoPC9zcGFuPiA9IHQubGVuZ3RoICYjNDM7IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICB0Lmxlbmd0aCAmbHQ7 LSBsZW5ndGg7DQogICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdo dDogYm9sZDsiPmlmPC9zcGFuPiBuICZsdDsgbGVuZ3RoIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1 MmEyYTsiPiZhbXA7JmFtcDs8L3NwYW4+IG4gJmx0OyBtYXhfYnVja2V0c19kaXZfMiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bhbj4gdC5y ZWhhc2ggJmx0Oy0gbiAqIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjI8L3NwYW4+Ow0K ICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPnRydWU8L3NwYW4+DQogICAgIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbmQ8L3NwYW4+ DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5y ZWM8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmFkZDwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+ayc8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnYnPC9zcGFuPiA9 DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmg8L3NwYW4+ID0gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TWl4Ljwvc3Bhbj5pbnQgaycgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICBtYXliZV9yZWhhc2gg dDsNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxl dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YnVja2V0czwvc3Bhbj4gPSB0 LmJ1Y2tldHMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5uPC9zcGFuPiA9 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkFycmF5Ljwvc3Bhbj5sZW5ndGggYnVja2V0 cyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3Nw YW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5s ZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmk8L3NwYW4+ID0gaCA8c3Bh biBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5sYW5kPC9zcGFuPiAobiAtIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwODI0ZjsiPjE8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPmJlZm9yZTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5BcnJh eS48L3NwYW4+dW5zYWZlX2dldCBidWNrZXRzIGkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5hZnRlcjwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Db25zPC9zcGFuPiAoaycsIHYnLCBiZWZvcmUpIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmlmPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5ub3Q8L3NwYW4+IChhZGRfYXRvbWlj YWxseSB0IGJ1Y2tldHMgbiBpIGJlZm9yZSBhZnRlcikgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2 ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPnRoZW48L3NwYW4+IGFkZCB0IGsnIHYnDQo8L3ByZT4N CjwvZGl2Pg0KPHA+Q29tcGFyZWQgdG8gZS5nLiB1c2luZyBhIFN0ZGxpYiA8YSBocmVmPSJodHRw czovL3YyLm9jYW1sLm9yZy9hcGkvTXV0ZXguaHRtbCI+DQo8Y29kZT5NdXRleDwvY29kZT48L2E+ IHRvIHByb3RlY3QgYSBkYXRhIHN0cnVjdHVyZSBhZ2FpbnN0IGNvbmN1cnJlbnQgYWNjZXNzZXMg YnkgdGhyZWFkcywgdGhpcyBzb3J0IG9mIGxvY2stZnJlZSBpbXBsZW1lbnRhdGlvbiBjYW4gZ2l2 ZSBiZXR0ZXIgcGVyZm9ybWFuY2UgKGVzcGVjaWFsbHkgZm9yIHJlYWQtb25seSBvcGVyYXRpb25z KSBhbmQgYWxzbyBhbGxvd3MgdXNlIG9mIHRoZSBvcGVyYXRpb25zIGluIGNvbnRleHRzLCBzdWNo IGFzIHNpZ25hbA0KIGhhbmRsZXJzLCB3aGVyZSBsb2NrcyBhcmUgbm90IGFwcHJvcHJpYXRlLiA8 L3A+DQo8cD5Ob3RlIHRoYXQgdGhpcyB0ZWNobmlxdWUgaXMgbm90IHN1ZmZpY2llbnQgZm9yIHBh cmFsbGVsaXNtLXNhZmUgaW1wbGVtZW50YXRpb24gb2YgZGF0YSBzdHJ1Y3R1cmVzLg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM5Y2FjMDUiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczOWNhYzA1Ij5HdWlsbGF1bWUgTXVuY2gtTWFj Y2Fnbm9uaSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmczOWNhYzA1Ij4NCjxwPlRoYW5rcyBmb3IgdGhlIHdyaXRlLXVwISBJIGRvIG5vdCByZW1lbWJl ciBzb21lb25lIHdyaXRpbmcgYWJvdXQgdGhpcyBiZWZvcmUuIDwvcD4NCjxwPlRoaXMgdHJpY2sg aXMgdXNlZCBpbiBKYW5lU3RyZWV04oCZcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFu ZXN0cmVldC9jb3JlX3VuaXgvYmxvYi9tYXN0ZXIvbmFub19tdXRleC9zcmMvbmFub19tdXRleC5t bGkiPg0KTmFub19tdXRleDwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5l c3RyZWV0L2NvcmVfa2VybmVsL2Jsb2IvbWFzdGVyL3RocmVhZF9zYWZlX3F1ZXVlL3NyYy90aHJl YWRfc2FmZV9xdWV1ZS5tbGkiPg0KVGhyZWFkX3NhZmVfcXVldWU8L2E+LiA8Y29kZT5bQHBvbGwg ZXJyb3JdPC9jb2RlPiB3YXMgaW4gZmFjdCBtb3RpdmF0ZWQgYnkgdGhlc2UgdXNlLWNhc2VzIChh bmQgSSBhbSBzdXJwcmlzZWQgbm90IHRvIHNlZSB0aGVtIHVzZWQgaW4gdGhlIGxhdGVzdCB2ZXJz aW9uIG9mIEphbmVTdHJlZXTigJlzIGxpYnJhcmllcykuDQo8L3A+DQo8cD5BcyB5b3Ugbm90ZSwg d2l0aCBtdWx0aWNvcmUgT0NhbWwsIHRoZXNlIGRhdGEgc3RydWN0dXJlcyBzaG91bGQgbmV2ZXIg YmUgc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IGRvbWFpbnMsIGJ1dCB0aGUgdGVjaG5pcXVlIHJl bWFpbnMgdmFsaWQgYW5kIHVzZWZ1bCBmb3IgZGF0YSBzdHJ1Y3R1cmVzIGRlc2lnbmVkIHRvIHN0 YXkgb24gYSBzaW5nbGUgZG9tYWluLg0KPC9wPg0KPHA+QmUgY2FyZWZ1bCB0aGF0IDxjb2RlPltA cG9sbCBlcnJvcl08L2NvZGU+IGlzIGEgcmVjZW50IGFkZGl0aW9uIChPQ2FtbCA0LjE0KS4gRWFy bGllciB2ZXJzaW9uIG9mIE9DYW1sIHJlcXVpcmUgYXR0cmlidXRlcyB0bw0KPGI+ZGlzYWJsZSBp bmxpbmluZzwvYj4gKGFtb25nIG90aGVyIHRoaW5ncyksIHRvIGF2b2lkIHRoYXQgcG9sbGluZyBw b2ludHMgY291bGQgYmUgYWRkZWQgZHVyaW5nIGNvbXBpbGF0aW9uIHZpYSBjb2RlIHRyYW5zZm9y bWF0aW9ucy4NCjxjb2RlPltAcG9sbCBlcnJvcl08L2NvZGU+IGhhcyB0aGUgY29ycmVjdCBzZW1h bnRpY3MgaW4gdGhpcyByZWdhcmQgaW4gT0NhbWwgNC4xNCwgYnV0IGVhcmxpZXIgT0NhbWwgdmVy c2lvbnMgd2lsbCBkaXNyZWdhcmQgdGhlIGF0dHJpYnV0ZSBhbmQgcG90ZW50aWFsbHkgcHJvZHVj ZSBpbmNvcnJlY3QgY29kZSBpbiB0aGUgYWJzZW5jZSBvZiBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMu IEFsc28sIEkgd291bGQgbm90IHJlY29tbWVuZCB0cnlpbmcgdG8NCiBkbyB3aXRob3V0IHRoZSA8 Y29kZT5bQHBvbGwgZXJyb3JdPC9jb2RlPiBhdHRyaWJ1dGUsIGJlY2F1c2UgdGhpcyBpcyBlcnJv ci1wcm9uZSBhbmQgcmVxdWlyZXMga25vd2xlZGdlIG9mIHRoZSBjb21waWxlci4NCjwvcD4NCjxw Pjxjb2RlPltAcG9sbCBlcnJvcl08L2NvZGU+IGlzIGFsc28gaW5vcGVyYW50IGluIGJ5dGVjb2Rl ICh3aGljaCBpcyB0cmlja2llciBiZWNhdXNlIGl0IGhhcyBtb3JlIHBvbGxpbmcgbG9jYXRpb25z KS4NCjwvcD4NCjxwPkxhc3RseSwgaXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgPGNvZGU+W0Bwb2xs IGVycm9yXTwvY29kZT4gaXMgdmVyeSBpbmV4cHJlc3NpdmUgaW4gdGhlIGtpbmQgb2YgY29kZSB0 aGF0IGl0IGFjY2VwdHMuIFRoZSByZWFzb25pbmctYWJvdXQtcG9sbGluZy1sb2NhdGlvbnMgdHJp Y2sgaXMgYWxzbyB1c2VkIGluIHBhcnRzIG9mIHRoZSBzdGRsaWIsIGZvciB3aGljaA0KPGNvZGU+ W0Bwb2xsIGVycm9yXTwvY29kZT4gaXMgbm90IGV4cHJlc3NpdmUgZW5vdWdoLiBJIHByb3Bvc2Vk IGEgbW9yZSBleHByZXNzaXZlIGF0dHJpYnV0ZSB0byBoYW5kbGUgdGhvc2UgY2FzZXMsIGJ1dCBp dCB3YXMgbm90IGFjY2VwdGVkLiBUaGVyZSBpcyBhbHNvIGEgcHJvcG9zYWwgdG8gZGVsYXkgdGhl IHBvbGxpbmcgd2l0aCDigJxtYXNraW5n4oCdIGR1cmluZyBjcml0aWNhbCBzZWN0aW9ucywgYXQg cnVudGltZSAoaGVuY2UgZXZlbiBtb3JlIGV4cHJlc3NpdmUpLg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzZlNTc3MTkiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmc2ZTU3NzE5Ij5DYWxhc2NpYmV0dGEgUm9tYWluIGFza2VkIGFuZCBW ZXNhIEthcnZvbmVuIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZzZlNTc3MTkiPg0KPGJsb2NrcXVvdGU+DQo8cD5BcyBmYXIgYXMgSSB1bmRlcnN0 YW5kLCB0aGUgdXNhZ2Ugb2YgPGNvZGU+W3BvbGwgZXJyb3JdPC9jb2RlPiBzdGFydHMgdG8gYmUg aW50ZXJlc3Rpbmcgd2hlbiB3ZSBzdGFydCB0byB1c2UgYSBtaXggb2YNCjxjb2RlPlRocmVhZDwv Y29kZT4gYW5kIDxjb2RlPkRvbWFpbjwvY29kZT4/IDwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPlll cywgYW5kIGFsc28gd2hlbiB1c2luZyBvbmx5IDxjb2RlPlRocmVhZDwvY29kZT7igItzIChhbmQg bm8gPGNvZGU+RG9tYWluPC9jb2RlPuKAi3MpLg0KPC9wPg0KPHA+T25lIG1pZ2h0IGFzayB3aHkg b25lIHdvdWxkIHVzZSA8Y29kZT5UaHJlYWQ8L2NvZGU+4oCLcyB3aGVuIHdlIGhhdmUgPGNvZGU+ RG9tYWluPC9jb2RlPuKAi3MgYW5kIGVmZmVjdHM/DQo8L3A+DQo8cD5NeSBjb21tZW50IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIzODUjaXNzdWVjb21t ZW50LTE2NDA5NTQwMDMiPg0KaGVyZTwvYT4gaG9wZWZ1bGx5IHByb3ZpZGVzIHNvbWUgaWRlYXMg d2hlcmUgdGhyZWFkcyBjb3VsZCBzdGlsbCBiZSB2ZXJ5IHVzZWZ1bC4gVGhlIHRsO2RyIGlzIHRo YXQgdGhyZWFkcyBjb3VsZCBiZSB1c2VkIHRvIGFsbG93IGVmZmVjdHMgYmFzZWQgc2NoZWR1bGVy cyB0byBlZmZlY3RpdmVseSBzaGFyZSBkb21haW5zIGFuZCB0aHJlYWRzIGNvdWxkIGFsc28gYmUg dXNlZCwgaW4gcGFydCwgdG8gZS5nLiBpbXBsZW1lbnQgSU8gaW4gc3VjaCBhIHdheQ0KIHRoYXQg aXQgYmVjb21lcyBzY2hlZHVsZXIgaW5kZXBlbmRlbnQuIElmIHdlIGRvIHVzZSB0aHJlYWRzLCB0 aGVuIGl0IHdpbGwgbGlrZWx5IGJlIHZlcnkgdXNlZnVsIHRvIGJlIGFibGUgdG8gaW1wbGVtZW50 IGNvbW11bmljYXRpb24gYmV0d2VlbiB0aHJlYWRzIHdpdGhpbiBhIGRvbWFpbiB3aXRoIGFzIGxp dHRsZSBzeW5jaHJvbml6YXRpb24gYXMgcG9zc2libGUuDQo8L3A+DQo8YmxvY2txdW90ZT4NCjxw PkZvciBpbnN0YW5jZSwgaWYgd2UgYWxsb2NhdGUgb25seSA8Y29kZT5Eb21haW48L2NvZGU+4oCL cywgdGhlIHVzYWdlIG9mIGFuIDxjb2RlPg0KSGFzaHRibDwvY29kZT4gaW50byBvbmUgKGFuZCB1 bmlxdWVseSBvbmUsIHRoZSA8Y29kZT5IYXNodGJsPC9jb2RlPiBpcyBub3Qgc2hhcmVkIGJldHdl ZW4NCjxjb2RlPkRvbWFpbjwvY29kZT7igItzKSBpcyDigJxzYWZl4oCdPyBNb3Jlb3ZlciwgPGNv ZGU+TXV0ZXg8L2NvZGU+IHN0aWxsIGlzIHRoZSBiZXN0IHByYWN0aWNlIChyZWdhcmRsZXNzDQo8 Y29kZT5Eb21haW48L2NvZGU+IG9yIDxjb2RlPlRocmVhZDwvY29kZT4pIHRvIHByb3RlY3QgYW4g PGNvZGU+SGFzaHRibDwvY29kZT4gYWdhaW5zdCBkYXRhLXJhY2UgY29uZGl0b24/DQo8L3A+DQo8 L2Jsb2NrcXVvdGU+DQo8cD5JZiB5b3UgbWVhbiB0aGUgU3RkbGliIDxjb2RlPkhhc2h0Ymw8L2Nv ZGU+LCB0aGVuLCB5ZXMsIGl0IGlzIG5laXRoZXIgdGhyZWFkLXNhZmUgbm9yIHBhcmFsbGVsaXNt LXNhZmUgYW5kIG9uZSB3aWxsIG5lZWQgdG8gZS5nLiB1c2UgYQ0KPGNvZGU+TXV0ZXg8L2NvZGU+ IHRvIHByb3RlY3QgaXQgd2hlbiBpdCBtaWdodCBiZSBhY2Nlc3NlZCBmcm9tIG11bHRpcGxlIHRo cmVhZHMgY29uY3VycmVudGx5IG9yIGZyb20gbXVsdGlwbGUgZG9tYWlucyBpbiBwYXJhbGxlbC4N CjwvcD4NCjxwPkFzIGFub3RoZXIgY3VycmVudGx5IGF2YWlsYWJsZSBhbHRlcm5hdGl2ZSwgdGhl IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9rY2FzLyI+DQpLY2Fz PC9hPiBsaWJyYXJ5IGNvbWVzIHdpdGggYSBjb21wYW5pb24gcGFja2FnZSBvZiBsb2NrLWZyZWUg YW5kIHBhcmFsbGVsaXNtLXNhZmUgKGFuZCBhbHNvIHRocmVhZC1zYWZlKSBkYXRhIHN0cnVjdHVy ZXMgaW5jbHVkaW5nIGENCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5p by9rY2FzL2RvYy9rY2FzX2RhdGEvS2Nhc19kYXRhL0hhc2h0YmwvaW5kZXguaHRtbCI+DQo8Y29k ZT5IYXNodGJsPC9jb2RlPjwvYT4gaW1wbGVtZW50YXRpb24gdGhhdCBpcyBkZXNpZ25lZCB0byBi ZSBhbiBhbG1vc3QgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgdGhlIFN0ZGxpYg0KPGNvZGU+SGFz aHRibDwvY29kZT4uIFdoZW4gdXNlZCBpbiBwYXJhbGxlbCBmcm9tIG11bHRpcGxlIGRvbWFpbnMg aXQgc2hvdWxkIHByb3ZpZGUgYmV0dGVyIHBlcmZvcm1hbmNlIHRoYW4gU3RkbGliDQo8Y29kZT5I YXNodGJsPC9jb2RlPiBwcm90ZWN0ZWQgYnkgYSA8Y29kZT5NdXRleDwvY29kZT4uIEl0IGlzIGFs c28gPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2tjYXMvZG9jL2tj YXNfZGF0YS9LY2FzX2RhdGEvaW5kZXguaHRtbCI+DQpjb21wb3NhYmxlPC9hPiAocmVhZCBmcm9t IOKAnEJ1dCB3aHkgc2hvdWxkIHlvdSBjYXJlIGFib3V0IGNvbXBvc2FiaWxpdHk/4oCdKSwgd2hp Y2ggY2FuIG1ha2UgdGhlIGltcGxlbWVudGF0aW9uIG9mIG1vcmUgaW50ZXJlc3RpbmcgdXNlIGNh c2VzIGEgYnJlZXplIGNvbXBhcmVkIHRvIHRoZSB1c2Ugb2Ygbm9uLWNvbXBvc2FibGUgY29uY3Vy cmVudCBwcm9ncmFtbWluZyB0ZWNobmlxdWVzLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZiOWZjMzgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmdmYjlmYzM4Ij5DYWxhc2NpYmV0dGEgUm9tYWluIGFza2VkIGFuZCBWZXNhIEthcnZv bmVuIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2ZiOWZjMzgiPg0KPGJsb2NrcXVvdGU+DQo8cD5EaWQgeW91IGNvbnNpZGVyIHRoZSBpZGVhIHRv IGludGVncmF0ZSB0aGF0IGRpcmVjdGx5IGludG8gdGhlIFN0ZGxpYuKAmXMgPGNvZGU+SGFzaHRi bDwvY29kZT4/DQo8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5ZZXMsIGFuZCBub3QgcmVhbGx5LiA8 L3A+DQo8cD5UaGUgQVBJIG9mIFN0ZGxpYiA8Y29kZT5IYXNodGJsPC9jb2RlPiBpcyBub3QgZGVz aWduZWQgZm9yIGNvbmN1cnJlbnQgcHJvZ3JhbW1pbmcuIEluIHNlcXVlbnRpYWwgdXNlIGNhc2Vz IGl0IHdpbGwgYmUgZmFzdGVyIHRoYW4gYW55IHBhcmFsbGVsaXNtIHNhZmUgaW1wbGVtZW50YXRp b24gdGhhdCBzdXBwb3J0cyB0aGUgZnVsbCBBUEkuDQo8L3A+DQo8cD5UaGUgcmVhc29uIGZvciBt aW1pY2tpbmcgdGhlIFN0ZGxpYiA8Y29kZT5IYXNodGJsPC9jb2RlPiBBUEkgaW4gS2NhcyBpcyB0 byBhbGxvdyBmb3IgZWFzaWVyIGxlYXJuaW5nIGN1cnZlIGFuZCB0byBwb3RlbnRpYWxseSBtYWtl IGl0IGVhc2llciB0byBwb3J0IGFuIGV4aXN0aW5nIGFwcGxpY2F0aW9uIHRvIHBhcmFsbGVsaXNt LXNhZmUgT0NhbWwgNS4NCjwvcD4NCjxwPkluIHRoZSBmdXR1cmUgSSBleHBlY3QgdGhlcmUgd2ls bCBiZSBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgZGVzaWduZWQgZnJvbSB0aGUgc3RhcnQgZm9y IGNvbmN1cnJlbnQgcHJvZ3JhbW1pbmcgYW5kIHdpbGwgZS5nLiBhdm9pZCBvciBkZS1lbXBoYXNp emUgZmVhdHVyZXMgd2l0aCBpbmhlcmVudCBzZXF1ZW50aWFsIGJvdHRsZW5lY2tzIChzdWNoIGFz IG1haW50ZW5hbmNlIG9mIGV4YWN0IGxlbmd0aCkgYW5kIG9wZXJhdGlvbnMgd2l0aCBpbmhlcmVu dA0KIHJpc2sgb2Ygc3RhcnZhdGlvbiAoc3VjaCBhcyBiZWluZyBhYmxlIHRvIChhdG9taWNhbGx5 KSBpbnNlcnQgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBlbGVtZW50cyB0byBhIGRhdGEgc3RydWN0 dXJlKSBhbmQgcHJvdmlkZSBmdXNlZCBvcGVyYXRpb25zIHRoYXQgc3VwcG9ydCBjb21tb24gdXNl IGNhc2VzIChzdWNoIGFzIGdldC1vci1hZGQpLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSIxMSI+Zm9yZXN0ZXIgMi4zPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC0xMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWZvcmVzdGVyLTItMy8xMjgxNS8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWZvcmVzdGVyLTItMy8xMjgxNS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmcwNDc0OWQzIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnMDQ3NDlkMyI+Sm9uIFN0ZXJsaW5nIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMDQ3NDlkMyI+DQo8cD5JIHdvdWxkIGxpa2UgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb24gb3BhbSBvZiA8YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwu b3JnL3BhY2thZ2VzL2ZvcmVzdGVyLyI+DQpmb3Jlc3RlciAyLjM8L2E+LiBpcyBhbiBPQ2FtbCB1 dGlsaXR5IHRvIGRldmVsb3Ag4oCcRm9yZXN0c+KAnSwgd2hpY2ggYXJlIGRlbnNlbHkgaW50ZXJs aW5rZWQgc2NpZW50aWZpYyB3ZWJzaXRlcyAvIFpldHRlbGvDpHN0ZW4gc2ltaWxhciB0byB0aGUg U3RhY2tzIFByb2plY3Qgb3IgS2Vyb2Rvbi4gQW4gZXhhbXBsZSBvZiBhIOKAnEZvcmVzdOKAnSBp cyBteQ0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuam9ubXN0ZXJsaW5nLmNvbS8iPm93biB3ZWJzaXRl PC9hPi4gPC9wPg0KPHA+VGhpcyBpcyBhIG1ham9yIHJlbGVhc2UgaW52b2x2aW5nIGNoYW5nZXMg dG8gdGhlIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UsIGFtb25nIG90aGVyIHRoaW5ncy4gUGxlYXNl IHNlZSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vd3d3Lmpvbm1zdGVybGluZy5jb20vam1zLTAwNlou eG1sIj5mdWxsIGNoYW5nZWxvZzwvYT4gZm9yIGEgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhl IGNoYW5nZXMuIEJlbG93IEkgZ2l2ZSBhIGJyaWVmIHN1bW1hcnk6DQo8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+VGhlIGV4aXN0aW5nIGJlaGF2aW9yIG9mIHRoZSA8Y29kZT5mb3Jlc3Rl cjwvY29kZT4gY29tbWFuZCBpcyBub3cgbG9jYXRlZCB1bmRlcg0KPGNvZGU+Zm9yZXN0ZXIgYnVp bGQ8L2NvZGU+LiA8L2xpPjxsaT5BIG5ldyA8Y29kZT5mb3Jlc3RlciBuZXc8L2NvZGU+IGNvbW1h bmQgdG8gY3JlYXRlIHRoZSDigJxuZXh04oCdIHRyZWUgdW5kZXIgdGhlIGJhc2UtMzYgdHJlZSBh ZGRyZXNzaW5nIHNjaGVtZS4NCjwvbGk+PGxpPkEgbmV3IDxjb2RlPmZvcmVzdGVyIGNvbXBsZXRl PC9jb2RlPiBjb21tYW5kIGZvciBjb21wbGV0aW5nIHRyZWUgdGl0bGVzLCB0byBmYWNpbGl0YXRl IHRvb2wgc3VwcG9ydC4NCjwvbGk+PGxpPlJ1ZGltZW50YXJ5IHN1cHBvcnQgZm9yIGVtaXR0aW5n IFhNTCBhdHRyaWJ1dGVzLiA8L2xpPjxsaT5TdWJkaXJlY3RvcmllcyBvZiBpbnB1dCBkaXJlY3Rv cmllcyB3aWxsIG5vdyBiZSB0cmF2ZXJzZWQgYXV0b21hdGljYWxseTsgbm90ZSB0aGF0IHRoZSB0 cmVlIGFkZHJlc3MgbW9kZWwgcmVtYWlucyBmbGF0LCBhbmQgc3ViZGlyZWN0b3JpZXMgYXJlIHBy ZXNlbnQgb25seSBmb3IgY29udmVuaWVuY2UuDQo8L2xpPjxsaT5BZGRlZCBhIG5pY2VyIGNvbW1h bmQgbGluZSBpbnRlcmZhY2Ugd2l0aCA8Y29kZT4tLWhlbHA8L2NvZGU+IGRvY3VtZW50YXRpb24u IDwvbGk+PGxpPkkgaGF2ZSBtaWdyYXRlZCBtdWNoIG9mIHRoZSBzeXN0ZW0gY29kZSB0byB1c2Ug dGhlIGV4cGVyaW1lbnRhbCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGlj b3JlL2VpbyI+DQpFaW8gbGlicmFyeTwvYT4gZm9yIGltcHJvdmVkIHBvcnRhYmlsaXR5LiA8L2xp PjxsaT5UaGUgZXhhbXBsZSBmb3Jlc3QgaGFzIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBtYWluIHJl cG9zaXRvcnksIGFuZCBtb3ZlZCBpbnRvIGEgc2VwYXJhdGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 LnNyLmh0L35qb25zdGVybGluZy9mb3Jlc3QtdGVtcGxhdGUiPnRlbXBsYXRlIHJlcG9zaXRvcnk8 L2E+Lg0KPC9saT48L3VsPg0KPHA+TXkgdGhhbmtzIHRvIEFybWHDq2wgR3XDqW5lYXUsIFJpbGV5 IFNoYWhhciwgYW5kIE1hc2Fub3JpIE9naW5vIGZvciB0aGVpciBjb250cmlidXRpb25zIG9mIGNv ZGUgYW5kIGlkZWFzIHRoYXQgbWFkZSBpdCBpbnRvIHRoaXMgcmVsZWFzZS4NCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y1MGRmMWEi IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmdmNTBkZjFhIj5PbGQgQ1dOPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmdmNTBkZjFhIj4NCjxwPklmIHlv dSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxs IG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVm PSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0 aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0 IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xp c3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8 L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnNDk5Y2E5NyI+DQo8cD48YSBocmVm PSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 8 Aug 2023 09:54:48 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 8 Aug 2023 09:54:48 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 8 Aug 2023 09:54:48 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3788s7IM009524 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 8 Aug 2023 09:54:07 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3788ru0G009508 for ; Tue, 8 Aug 2023 09:53:57 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Aug 2023 10:53:55 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 02881E0149; Tue, 8 Aug 2023 10:53:55 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id D43C3E0133 for ; Tue, 8 Aug 2023 10:53:51 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Aug 2023 10:53:51 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 259855645FE; Tue, 8 Aug 2023 10:53:49 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZydX8zpV3x58NGkKjL6ebDxbCew== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 8 Aug 2023 09:53:48 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 12b802b6-9830-4d90-d70f-08db97ed1ed7 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,263,1684792800"; d="scan'208,217";a="120479898" x-spam-flag: No, tests=bogofilter, spamicity=0.434402, queueID=9FB6C5645FF x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOC0wOCBUdWUgMTA6NTAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDguMDEuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOC4xNS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEF1Z3VzdCAwMSB0byAwOCwgMjAyMy4gPC9w Pg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxl IG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9 ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5kdW5lIDMuOS4wPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjMiI+RHVuZSAzLjEwLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5kZWNp bWFsIDEuMC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+ZWFybHliaXJkIDEuMi4wIOKAkyBy ZXZpdmFsIG9mIGEgZGVidWdnZXI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5GaXJzdCByZWxl YXNlIGNhbmRpZGF0ZSBmb3IgT0NhbWwgNS4xLjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5S ZXZhbXAgdGhlIGdldHRpbmcgc3RhcnRlZCB0dXRvcmlhbHMgaW4gb2NhbWwub3JnPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNyI+Rmlyc3QgYWxwaGEgcmVsZWFzZSBvZiBTaW1wbGVfaHR0cGQ8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5DYWlybjogQSBkZXJpdmF0aW9uIGV4cGxvcmVyIGFuZCBs b2dnZXIgZm9yIE1lbmhpciBQYXJzZXI8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5PQ2FtbCBX b3Jrc2hvcCAyMDIzIOKAkyBwcmVzZW50YXRpb24gZGVhZGxpbmUgb24gSnVuZSAxc3QsIG9ubGlu ZSBhdHRlbmRhbmNlIG9wdGlvbjwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+MTN0aCBNaXJh Z2VPUyByZXRyZWF0IGluIE1hcnJha2VzaCwgTW9yb2NjbyAoTm92ZW1iZXIgMjB0aCAtIDI2dGgg MjAyMyk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjMTEiPmtjYXMgYW5kIGtjYXNfZGF0YSAwLjYu MTogU1RNIGFuZCBjb21wb3NpdGlvbmFsIGxvY2stZHJlZSBkYXRhIHN0cnVjdHVyZXM8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSIjb3JnNjg0MTUwZCI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIxIj5kdW5lIDMuOS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZHVuZS0zLTktMC8xMjUzMC81Ij5odHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWR1bmUtMy05LTAvMTI1MzAvNTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnMGRhMmU1NSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzBkYTJlNTUiPkV0aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGRhMmU1NSI+DQo8cD5BbmQgdG8gY29uY2x1ZGUg dGhlIDMuOS54IHNlcmllczogPC9wPg0KPHA+VGhlIGZpeCB0byA8Y29kZT5zZW5kZmlsZTwvY29k ZT4gaW4gMy45LjIgd2FzIG5vdCBxdWl0ZSBlbm91Z2ggc28gaGVyZSBpcyB0aGUgbGFzdCBwYXJ0 IG9mIHRoZSBmaXguIEl0IGJyaW5ncyBjb21wYXRpYmlsaXR5IHdpdGggZmlsZXN5c3RlbXMgd2hl cmUNCjxjb2RlPnNlbmRmaWxlPC9jb2RlPiBpcyBub3QgYXZhaWxhYmxlLCBpbiBwYXJ0aWN1bGFy IHdoZW4gPGNvZGU+ZWNyeXB0ZnM8L2NvZGU+IGlzIHVzZWQuDQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2IzMWZjOTUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdiMzFmYzk1Ij5GaXhlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnYjMxZmM5NSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Rml4IGZsdXNo aW5nIHdoZW4gdXNpbmcgPGNvZGU+c2VuZGZpbGU8L2NvZGU+IGZhbGxiYWNrICgjODI4OCwgZml4 ZXMgIzgyODQsIEBhbGFuLWotaHUpDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSIyIj5EdW5lIDMuMTAuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWR1bmUtMy0xMC0wLzEyNzM4LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZHVuZS0zLTEwLTAvMTI3MzgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnODA4MDFjMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzgwODAxYzIiPkV0aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODA4MDFjMiI+DQo8cD5XZeKAmXJlIGhhcHB5IHRv IGFubm91bmNlIHRoZSByZWxlYXNlIG9mIER1bmUgMy4xMC4wLiBJdCBjb21lcyB3aXRoIHNvbWUg aW50ZXJuYWwgZml4ZXMgYXMgd2VsbCBhcyBzb21lIGludGVyZXN0aW5nIGZlYXR1cmVzOg0KPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnNvbWUgY2hhbmdlcyBpbiA8Y29kZT5kdW5lIGRl c2NyaWJlPC9jb2RlPiB0aGF0IHdpbGwgYWxsb3cgYSBiZXR0ZXIgaW1wbGVtZW50YXRpb24gb2YN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY3VycmVudC9vcGFtLWR1bmUtbGludCI+b3Bh bS1kdW5lLWxpbnQ8L2E+IHRvIGNoZWNrIHRoZSBjb25zaXN0ZW5jeSBiZXR3ZWVuIGxpYnJhcnkg YW5kIHBhY2thZ2UgZGVwZW5kZW5jaWVzDQo8L2xpPjxsaT5tb3JlIGNvbW1hbmRzIG1hZGUgYXZh aWxhYmxlIHVuZGVyIDxjb2RlPmR1bmUgc2hvdzwvY29kZT4gZm9yIGEgbW9yZSBjb25zaXN0ZW50 IGNvbW1hbmQgbGluZSBpbnRlcmZhY2UNCjwvbGk+PC91bD4NCjxwPkhlcmUgaXMgdGhlIGZ1bGwg Y2hhbmdlbG9nOiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzc4 ZGQyZmIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc3OGRkMmZiIj5BZGRlZDwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNzhkZDJmYiI+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+QWRkIDxjb2RlPmR1bmUgc2hvdyBydWxlczwvY29kZT4gYXMg YWxpYXMgb2YgdGhlIDxjb2RlPmR1bmUgcnVsZXM8L2NvZGU+IGNvbW1hbmQuICgjODAwMCwgQEFs aXp0ZXIpDQo8L2xpPjxsaT5BZGQgPGNvZGU+ZHVuZSBzaG93IGluc3RhbGxlZC1saWJyYXJpZXM8 L2NvZGU+IGFzIGFuIGFsaWFzIG9mIHRoZSA8Y29kZT5kdW5lIGluc3RhbGxlZC1saWJyYXJpZXM8 L2NvZGU+IGNvbW1hbmQuICgjODEzNSwgQEFsaXp0ZXIpDQo8L2xpPjxsaT5BZGQgPGNvZGU+ZHVu ZSBidWlsZCAtLWR1bXAtZ2Mtc3RhdHMgRklMRTwvY29kZT4gYXJndW1lbnQgdG8gZHVtcCBnYXJi YWdlIGNvbGxlY3Rpb24gc3RhdHMgdG8gYSBuYW1lZCBmaWxlLiAoIzgwNzIsIEBBbGl6dGVyKQ0K PC9saT48bGk+QWRkIDxjb2RlPmR1bmUgZGVzY3JpYmUgcGFja2FnZS1lbnRyaWVzPC9jb2RlPiB0 byBwcmludCBhbGwgcGFja2FnZSBlbnRyaWVzICgjNzQ4MCwgQG1veW9kaWFsbG8pDQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTBjZTU5 MCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2UwY2U1OTAiPkZpeGVkPC9oND4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdlMGNlNTkwIj4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5GaXggPGNvZGU+JXtkZXBzfTwvY29kZT4gdG8gZXhwYW5kIHByb3Bl cmx5IGluIDxjb2RlPihjYXQgLi4uKTwvY29kZT4gd2hlbiBjb250YWluaW5nIDIgb3IgbW9yZSBp dGVtcy4gKCM4MTk2LCBAQWxpenRlcikNCjwvbGk+PGxpPkZpeCB0aGUgPGNvZGU+c2V2ZXJpdHk8 L2NvZGU+IG9mIGVycm9yIG1lc3NhZ2VzIHNlbnQgb3ZlciBSUEMgd2hpY2ggd2FzIG1pc3Npbmcu ICgjODE5MywgQEFsaXp0ZXIpDQo8L2xpPjxsaT5GaXggYnVnIHdpdGggcHB4IGFuZCBSZWFzb24g c3ludGF4IGR1ZSB0byBtaXNzaW5nIGRlcGVuZGVuY3kgaW4gc2FuZGJveGVkIGFjdGlvbiAoIzc5 MzIsIGZpeGVzICM3OTMwLCBAQWxpenRlcikNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNGMwZjRhIiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnMjRjMGY0YSI+Q2hhbmdlZDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnMjRjMGY0YSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW1w cm92ZSA8Y29kZT5kdW5lIGRlc2NyaWJlIGV4dGVybmFsLWxpYi1kZXBzPC9jb2RlPiBieSBhZGRp bmcgdGhlIGludGVybmFsIGRlcGVuZGVuY2llcyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4gKCM3NDc4 LCBAbW95b2RpYWxsbykNCjwvbGk+PGxpPlJlLWVuYWJsZSBiYWNrZ3JvdW5kIGZpbGUgZGlnZXN0 cyBvbiBXaW5kb3dzLiBUaGUgZmlsZXMgYXJlIG5vdyBvcGVuIGluIGEgd2F5IHRoYXQgcHJldmVu dHMgcmFjZSBjb25kaXRpb24gYXJvdW5kIGRlbGV0aW9uLiAoIzgyNjIsIGZpeGVzICM4MjY4LCBA ZW1pbGxvbikNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMi PmRlY2ltYWwgMS4wLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1kZWNpbWFsLTEtMC0wLzEyNzM5LzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t ZGVjaW1hbC0xLTAtMC8xMjczOS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc0YWM4OTM5IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNGFj ODkzOSI+WWF3YXIgQW1pbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzRhYzg5MzkiPg0KPHA+SGksIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5j ZSB0aGF0IGRlY2ltYWwgMS4wLjAgaGFzIGJlZW4gcmVsZWFzZWQgb24gb3BhbS1yZXBvc2l0b3J5 Og0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9kZWNpbWFsLzEuMC4wIj5odHRwczovL29j YW1sLm9yZy9wL2RlY2ltYWwvMS4wLjA8L2E+DQo8L3A+DQo8cD4oZGVjaW1hbCBpcyBhIHNvbWV3 aGF0LWNvbXBsZXRlIHBvcnQgdG8gT0NhbWwgb2YgdGhlIFB5dGhvbiA8YSBocmVmPSJodHRwczov L2RvY3MucHl0aG9uLm9yZy8zL2xpYnJhcnkvZGVjaW1hbC5odG1sIj4NCjxjb2RlPmRlY2ltYWw8 L2NvZGU+PC9hPiBtb2R1bGUsIGNvbnRyaWJ1dGlvbnMgd2VsY29tZSB0byBwb3J0IG1vcmUgZnVu Y3Rpb25hbGl0eSEpDQo8L3A+DQo8cD5UaGVyZSBpcyBhIGJyZWFraW5nIGNoYW5nZSBpbiB0aGlz IHJlbGVhc2UuIFdlIGhhdmUgcmVtb3ZlZCB0aGUgPGNvZGU+P2VuZzpib29sPC9jb2RlPiBwYXJh bWV0ZXIgZnJvbSB0aGUNCjxjb2RlPkRlY2ltYWwudG9fc3RyaW5nPC9jb2RlPiBmdW5jdGlvbiwg YW5kIHJlcGxhY2VkIGl0IHdpdGggYSBtb3JlIGdlbmVyYWwtcHVycG9zZQ0KPGNvZGU+P2Zvcm1h dDwvY29kZT4gcGFyYW1ldGVyOiA8YSBocmVmPSJodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8v b2NhbWwtZGVjaW1hbC9kZWNpbWFsL0RlY2ltYWwvaW5kZXguaHRtbCN2YWwtdG9fc3RyaW5nIj4N Cmh0dHBzOi8veWF3YXJhbWluLmdpdGh1Yi5pby9vY2FtbC1kZWNpbWFsL2RlY2ltYWwvRGVjaW1h bC9pbmRleC5odG1sI3ZhbC10b19zdHJpbmc8L2E+DQo8L3A+DQo8cD5Ob3cgdGhlIGZ1biBwYXJ0 OiBAemJheWxpbiBoYXMgYWRkZWQgYSBuZXcgPGNvZGU+cHB4X2RlY2ltYWw8L2NvZGU+IHdoaWNo IGVuYWJsZXMgYSBjb252ZW5pZW50IGxpdGVyYWwgc3ludGF4IGZvciBkZWNpbWFsczogZS5nLg0K PGNvZGU+MS4xbTwvY29kZT4gaXMgYXV0b21hdGljYWxseSBkZXN1Z2FyZWQgdG8gPGNvZGU+RGVj aW1hbC5vZl9zdHJpbmcgJnF1b3Q7MS4xJnF1b3Q7PC9jb2RlPi4gVGhhbmtzIFphY2ghDQo8L3A+ DQo8cD5BbHNvIHRoYW5rcyBAYW5tb250ZWlybyBmb3Igc2hvd2luZyBtZSBhIGR1bmUgdHJpY2sg dG8gaGVscCBldmVyeXRoaW5nIGJ1aWxkIHN1Y2Nlc3NmdWxseSBpbiBPcGFtIENJLg0KPC9wPg0K PHA+RW5qb3khIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5lYXJseWJpcmQgMS4y LjAg4oCTIHJldml2YWwgb2YgYSBkZWJ1Z2dlcjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWVhcmx5YmlyZC0xLTItMC1yZXZpdmFsLW9mLWEtZGVidWdnZXIvMTI3 NDEvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWVhcmx5YmlyZC0xLTItMC1y ZXZpdmFsLW9mLWEtZGVidWdnZXIvMTI3NDEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnYWU4NGNkMCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2FlODRjZDAiPlNpbW1vIFNhYW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhZTg0Y2QwIj4NCjxwPlRoZSBsYWNraW5nIHN0YXRlIG9m IE9DYW1sIGRlYnVnZ2VycyBoYXMgYmVlbiBhIHJhdGhlciBob3QgdG9waWMgcmVjZW50bHksIHNv IEnigJltIHBhcnRpY3VsYXJseSBleGNpdGVkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaGFja3dhbHkvb2NhbWxlYXJseWJpcmQiPmVhcmx5 YmlyZCAxLjIuMDwvYT4uIDwvcD4NCjxwPk1hbnkgb2YgeW91IG1pZ2h0IGJlIGZhbWlsaWFyIHdp dGggT0NhbWwgZWFybHliaXJkOiBhIGRlYnVnZ2VyIHdoaWNoIHN1cHBvcnRzIERlYnVnIEFkYXB0 ZXIgUHJvdG9jb2wsIGFsbG93aW5nIGl0IHRvIGJlIHVzZWQgZGlyZWN0bHkgZnJvbSBWUyBDb2Rl 4oCZcyBidWlsdGluIGRlYnVnZ2luZyBHVUkgKGFtb25nIHBvc3NpYmx5IG90aGVyIElERXMpLiBU aGlzIHBoZW5vbWVuYWwgdG9vbCB3YXMgZGV2ZWxvcGVkIGJ5IEBoYWNrd2FseS4NCjwvcD4NCjxw PlVuZm9ydHVuYXRlbHksIGZvciBhIGxvbmcgdGltZSBpdCB3YXNu4oCZdCB1cGRhdGVkIHRvIHN1 cHBvcnQgbmV3ZXIgdmVyc2lvbnMgb2YgT0NhbWwgYW5kIGZlbGwgaW50byBkZXNwYWlyLiBTaW5j ZSB0aGVyZeKAmXMgc3RpbGwgKG9yIGV2ZW4gbW9yZXNvKSBuZWVkIGZvciBPQ2FtbCBkZWJ1Z2dp bmcgdG9vbHMsIGl0IHdvdWxkIGJlIGEgcmVhbCBzaGFtZSBpZiBlYXJseWJpcmQgd2FzIGRlYWQg Zm9yZXZlci4gVGhlcmVmb3JlLCByZWNlbnRseSBJDQogdm9sdW50ZWVyZWQgdG8gcGljayB1cCBp dHMgbWFpbnRlbmFuY2UgYW5kIGdldCBpdCB1cCBhbmQgcnVubmluZyBhZ2Fpbi4gPC9wPg0KPHA+ SeKAmW0gaGVyZWJ5IGFubm91bmNpbmcgdGhlIHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2hhY2t3YWx5L29jYW1sZWFybHliaXJkIj4NCmVhcmx5YmlyZCAxLjIuMDwvYT4g d2hpY2ggc3VwcG9ydHMgT0NhbWwgNC4xMiwgNC4xMywgNC4xNCBhbmQgNS4wLiBNb3Jlb3Zlciwg SSBleHRlbmRlZCB0aGUgVlMgQ29kZSBPQ2FtbCBQbGF0Zm9ybSBleHRlbnNpb24gKHNpbmNlIHZl cnNpb24gMS4xMykgdG8gZGlyZWN0bHkgYmUgYWJsZSB0byBsYXVuY2ggZWFybHliaXJkOg0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0v I2RlYnVnZ2luZy1vY2FtbC1wcm9ncmFtcy1leHBlcmltZW50YWwiPg0KaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0vI2RlYnVnZ2luZy1vY2FtbC1wcm9n cmFtcy1leHBlcmltZW50YWw8L2E+LiBUaGlzIGJyaW5ncyB0aGUgaGFuZGxpbmcgb2YgYSBEQVAg Zm9yIE9DYW1sIGludG8gdGhlIHNhbWUgZXh0ZW5zaW9uIHdoaWNoIGhhbmRsZXMgdGhlIExTUCBm b3IgT0NhbWwuDQo8Yj5JbnN0cnVjdGlvbnMgYXJlIGF2YWlsYWJsZSBhdCB0aGUgYWJvdmUgbGlu ayE8L2I+IDwvcD4NCjxwPk5vdGUgdGhhdCB0aGUgT0NhbWwgUGxhdGZvcm0gaW50ZWdyYXRpb24g aXMgc3RpbGwgZXhwZXJpbWVudGFsLiBJIGludml0ZSBldmVyeW9uZSB0byB0cnkgb3V0IHRoZSBu ZXcgcmVsZWFzZSBvZiBlYXJseWJpcmQgdmlhIHRoZSBuZXcgVlMgQ29kZSBpbnRlZ3JhdGlvbi4g VGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIGFubm91bmNlbWVudCBpcyB0byBnZXQgcmVhbC13b3Js ZCB0ZXN0aW5nIGZvciBib3RoIHNpZGVzIGFuZCBob3BlZnVsbHkgYWxzbw0KIGdldCBtb3JlIHBl b3BsZSBpbnRlcmVzdGVkL2ludm9sdmVkLiA8L3A+DQo8cD5CZXdhcmUgdGhhdCB0aGlzIHJldml2 YWwgb2YgZWFybHliaXJkIGNvbWVzIHB1cmVseSBvdXQgb2YgbXkgZnJlZSB0aW1lLCBzbyBkb27i gJl0IGV4cGVjdCBhbnkgYmlnIGRldmVsb3BtZW50cyBub3cuIFNvIGZhciBJIGRpZCB3aGF0IEkg Y291bGQgdG8gZ2V0IGVhcmx5YmlyZCByZWFzb25hYmx5IHdvcmtpbmcgYWdhaW4gYW5kIEnigJls bCBkbyBteSBiZXN0IHRvIGtlZXAgaXQgZnJvbSBkZWdyYWRpbmcuIEkgdGhpbmsgaXTigJlzIHN0 aWxsIHZhbHVhYmxlDQogdG8gaGF2ZSBlYXJseWJpcmQgaW4gdGhlIGVjb3N5c3RlbSB1bnRpbCBt YXliZSBzb21ldGhpbmcgYmV0dGVyIGNvbWVzIGFsb25nLiBIb3dldmVyLCBpZiB3b3JraW5nIG9u IGVhcmx5YmlyZCBzcGFya3MgYW55b25l4oCZcyBpbnRlcmVzdCwgSeKAmWxsIGdsYWRseSBhY2Nl cHQgYnVnIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMsIGFsbCB0b3dhcmRzIGEgYmV0dGVyIE9DYW1s IGVjb3N5c3RlbS4NCjwvcD4NCjxwPkEgZmluYWwgbm90ZSBhYm91dCBlYXJseWJpcmQ6IGl0IHVz ZXMgdGhlICh1bmRvY3VtZW50ZWQpIHByb3RvY29sIG9mIDxjb2RlPm9jYW1sZGVidWc8L2NvZGU+ IHRvIGNvbW11bmljYXRlIHdpdGggYSBieXRlY29kZSBleGVjdXRhYmxlLiBUaHVzLCBpdCBjb21l cyB3aXRoIGFsbCB0aGUgbGltaXRhdGlvbnMgdGhhdA0KPGNvZGU+b2NhbWxkZWJ1ZzwvY29kZT4g YW5kIGl0cyBwcm90b2NvbCBoYXZlLiBOb3RhYmx5LCBkb27igJl0IGdldCB0b28gZXhjaXRlZCBh Ym91dCBPQ2FtbCA1LjAgc3VwcG9ydDogZGVidWdnaW5nIGlzIHN1cHBvcnRlZCBvbmx5IHVudGls IGEgZG9tYWluIGlzIHNwYXduZWQgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9wdWxsLzExMDY1I3B1bGxyZXF1ZXN0cmV2aWV3LTk3NTM4MzQ2NCI+aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTEwNjUjcHVsbHJlcXVlc3RyZXZpZXctOTc1MzgzNDY0 PC9hPikuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+Rmlyc3QgcmVsZWFzZSBj YW5kaWRhdGUgZm9yIE9DYW1sIDUuMS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9maXJzdC1yZWxlYXNlLWNhbmRpZGF0ZS1mb3Itb2NhbWwtNS0xLTAvMTI3NDIvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtcmVsZWFzZS1jYW5kaWRhdGUtZm9y LW9jYW1sLTUtMS0wLzEyNzQyLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnMzcwZjU3OCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzM3MGY1 NzgiPm9jdGFjaHJvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzM3MGY1NzgiPg0KPHA+VGhlIHJlbGVhc2Ugb2YgT0NhbWwgNS4xLjAgaXMg aW1taW5lbnQuIEFzIGEgZmluYWwgc3RlcCwgd2UgYXJlIHB1Ymxpc2hpbmcgYSByZWxlYXNlIGNh bmRpZGF0ZSB0byBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4gb3JkZXIgYmVmb3JlIHRoZSBy ZWxlYXNlIGluIHRoZSB1cGNvbWluZyB3ZWVrKHMpLg0KPC9wPg0KPHA+SWYgeW91IGZpbmQgYW55 IGJ1Z3MsIHBsZWFzZSByZXBvcnQgdGhlbSBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzIj4NCk9DYW1s4oCZcyBpc3N1ZSB0cmFja2VyPC9hPi4gPC9wPg0K PHA+Q29tcGFyZWQgdG8gdGhlIGJldGEgcmVsZWFzZSwgdGhpcyByZWxlYXNlIGNvbnRhaW5zIG9u ZSBzYWZlIHJ1bnRpbWUgZml4LCBhbmQgdHdvIGNvbmZpZ3VyYXRpb24gdHdlYWtzLg0KPC9wPg0K PHA+VGhlIGZ1bGwgY2hhbmdlIGxvZyBmb3IgT0NhbWwgNS4xLjAgaXMgYXZhaWxhYmxlIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iLzUuMS9DaGFuZ2VzIj4NCm9u IEdpdEh1YjwvYT4gQSBzaG9ydCBzdW1tYXJ5IG9mIHRoZSBjaGFuZ2VzIHNpbmNlIHRoZSBiZXRh IHJlbGVhc2UgaXMgYWxzbyBhdmFpbGFibGUgYmVsb3cuDQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzFiNjY3Y2YiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlk PSJvcmcxYjY2N2NmIj5JbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zPC9oND4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxYjY2N2NmIj4NCjxwPlRoZSBiYXNlIGNvbXBp bGVyIGNhbiBiZSBpbnN0YWxsZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUgZm9sbG93aW5n IGNvbW1hbmRzIG9uIG9wYW0gMi4xIGFuZCBsYXRlcjoNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1z cmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0gdXBkYXRlDQpv cGFtIHN3aXRjaCBjcmVhdGUgNS4xLjB+cmMxDQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIHNvdXJj ZSBjb2RlIGZvciB0aGUgcmVsZWFzZSBjYW5kaWRhdGUgaXMgYWxzbyBkaXJlY3RseSBhdmFpbGFi bGUgb246IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS81LjEuMC1yYzEudGFyLmd6Ij5HaXRIdWI8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2Ft bC01LjEvb2NhbWwtNS4xLjB+cmMxLnRhci5neiI+T0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWE8L2E+ DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3Jn OTNkN2ZmMiI+PC9hPkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29uZmlndXJhdGlvbjxicj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc5M2Q3ZmYyIj4NCjxwPklmIHlvdSB3 YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBz d2l0Y2ggdG8gdGhlIG9wdGlvbiB2YXJpYW50IHdpdGg6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmct c3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0K b3BhbSBzd2l0Y2ggY3JlYXRlICZsdDtzd2l0Y2hfbmFtZSZndDsgb2NhbWwtdmFyaWFudHMuNS4x LjB+cmMxJiM0MztvcHRpb25zICZsdDtvcHRpb25fbGlzdCZndDsNCjwvcHJlPg0KPC9kaXY+DQo8 cD53aGVyZSA8Y29kZT4mbHQ7b3B0aW9uX2xpc3QmZ3Q7PC9jb2RlPiBpcyBhIGNvbW1hLXNlcGFy YXRlZCBsaXN0IG9mIDxjb2RlPm9jYW1sLW9wdGlvbi0qPC9jb2RlPiBwYWNrYWdlcy4gRm9yIGlu c3RhbmNlLCBmb3IgYQ0KPGNvZGU+ZmxhbWJkYTwvY29kZT4gYW5kIDxjb2RlPm5vLWZsYXQtZmxv YXQtYXJyYXk8L2NvZGU+IHN3aXRjaDogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWlu ZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+b3BhbSBzd2l0Y2ggY3JlYXRlIDUuMS4w fnJjMSYjNDM7ZmxhbWJkYSYjNDM7bmZmYSBvY2FtbC12YXJpYW50cy41LjEuMH5yYzEmIzQzO29w dGlvbnMgb2NhbWwtb3B0aW9uLWZsYW1iZGENCm9jYW1sLW9wdGlvbi1uby1mbGF0LWZsb2F0LWFy cmF5DQo8L3ByZT4NCjwvZGl2Pg0KPHA+QWxsIGF2YWlsYWJsZSBvcHRpb25zIGNhbiBiZSBsaXN0 ZWQgd2l0aCA8Y29kZT5vcGFtIHNlYXJjaCBvY2FtbC1vcHRpb248L2NvZGU+Lg0KPC9wPg0KPC9k aXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2M4 YzcwNjkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdjOGM3MDY5Ij5DaGFuZ2VzIFNp bmNlIHRoZSBCZXRhIFJlbGVhc2U8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlk PSJ0ZXh0LW9yZ2M4YzcwNjkiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlk PSJvcmdlMWY3N2NmIj48L2E+QnVnIEZpeDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01 IiBpZD0idGV4dC1vcmdlMWY3N2NmIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyNDQ1Ij4jMTI0NDU8L2E+ OiBtaXNzaW5nIEdDIHJvb3QgcmVnaXN0cmF0aW9ucyBpbiBydW50aW1lL2lvLmMgKEdhYnJpZWwg U2NoZXJlciwgcmV2aWV3IGJ5IFhhdmllciBMZXJveSBhbmQgSmVyZW15IFlhbGxvcCkNCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzJhZWEyMDgiPjwvYT5Db25maWd1cmF0 aW9uIEZpeCAob3BlbkJTRCk8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRl eHQtb3JnMmFlYTIwOCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjM3MiI+IzEyMzcyPC9hPjogUGFzcyBv cHRpb24gLW5vLWV4ZWN1dGUtb25seSB0byB0aGUgbGlua2VyIGZvciBPcGVuQlNEICZndDs9IDcu MyBzbyB0aGF0IGNvZGUgc2VjdGlvbnMgcmVtYWluIHJlYWRhYmxlLCBhcyBuZWVkZWQgZm9yIGNs b3N1cmUgbWFyc2hhbGluZy4gKFhhdmllciBMZXJveSBhbmQgQW5pbCBNYWRoYXZhcGVkZHksIHJl dmlldyBieSBBbmlsDQogTWFkaGF2YXBlZGR5IGFuZCBTw6liYXN0aWVuIEhpbmRlcmVyKSA8L2xp PjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdhZjZmZGE4Ij48L2E+VG9vbCBGaXgg KG9jYW1sbWt0b3ApPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9y Z2FmNmZkYTgiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPg0KPHA+IzExNzQ1LCAmIzQzOzxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIzNTgiPiMxMjM1 ODwvYT46IERlYnVnZ2VyIGFuZCB0b3BsZXZlbHM6IGVtYmVkIHByaW50ZXIgdHlwZXMgcmF0aGVy IHRoYW4gcmVhZGluZyB0aGVpciByZXByZXNlbnRhdGlvbnMgZnJvbSB0b3BkaXJzLmNtaSBhdCBy dW50aW1lLiBUaGlzIGNoYW5nZSBhbHNvIHJlbW92ZXMgdGhlIG9jYW1sbWt0b3AgaW5pdGlhbGl6 YXRpb24gbW9kdWxlIGludHJvZHVjZWQNCiBpbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzExMzgyIj4jMTEzODI8L2E+IHdoaWNoIHdhcyBubyBsb25nZXIg dXNlZnVsLiBUaGlzIGNoYW5nZSBicmVha3MgdG9wbGV2ZWwgc2NyaXB0cyByZWx5aW5nIG9uIHRo ZSB2aXNpYmlsaXR5IG9mDQo8Y29kZT5Ub3BkaXJzPC9jb2RlPiBpbiB0aGUgaW5pdGlhbCB0b3Bs ZXZlbCBlbnZpcm9ubWVudCB3aXRob3V0IGxvYWRpbmcgPGNvZGU+dG9wZmluZDwvY29kZT4uIFNp bmNlIHRoZSBvcGFtIGRlZmF1bHQNCjxjb2RlPi5vY2FtbGluaXQ8L2NvZGU+IGZpbGUgbG9hZHMg PGNvZGU+dG9wZmluZDwvY29kZT4sIGl0IGlzIGV4cGVjdGVkIHRoYXQgb25seSBzY3JpcHRzIHJ1 biB3aXRoDQo8Y29kZT5vY2FtbCAtbm9pbml0PC9jb2RlPiBhcmUgYWZmZWN0ZWQuIEZvciB0aG9z ZSBzY3JpcHRzLCBhY2Nlc3NpbmcgPGNvZGU+VG9wZGlyczwvY29kZT4gbm93IHJlcXVpcmVzIHRo ZQ0KPGNvZGU+Y29tcGlsZXItbGliczwvY29kZT4gZGlyZWN0b3J5IHRvIGJlIGFkZGVkIHRvIHRo ZSB0b3BsZXZlbCBzZWFyY2ggcGF0aCB3aXRoDQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBp ZD0ib3JnYTFhMDIzYSI+DQogICAgICAjZGlyZWN0b3J5ICZxdW90OyYjNDM7Y29tcGlsZXItbGli cyZxdW90Ozs7DQo8L3ByZT4NCjxwPmFzIHdhcyBhbHJlYWR5IHRoZSBjYXNlIGZvciB0aGUgb3Ro ZXIgbW9kdWxlcyBpbiB0aGUgdG9wbGV2ZWwgaW50ZXJmYWNlIGxpYnJhcnkuIChTw6liYXN0aWVu IEhpbmRlcmVyLCByZXZpZXcgYnkgRmxvcmlhbiBBbmdlbGV0dGksIE5pY29sw6FzIE9qZWRhIELD pHIgYW5kIEdhYnJpZWwgU2NoZXJlcikNCjwvcD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48 bGk+PGEgaWQ9Im9yZzY0MjBhN2EiPjwvYT5Eb2N1bWVudGF0aW9uIENoYW5nZXM8YnI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNjQyMGE3YSI+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMjIwMSI+IzEyMjAxPC9hPjogaW4gdGhlIHR1dG9yaWFsIG9uIG1vZHVsZXMsIHJlcGxh Y2UgcHJpb3JpdHkgcXVldWUgZXhhbXBsZSBieSBhIHNpbXBsZXIgZXhhbXBsZSBiYXNlZCBvbiBG SUZPIHF1ZXVlcy4gKFhhdmllciBMZXJveSwgcmV2aWV3IGJ5IEFuaWwgTWFkaGF2YXBlZGR5IGFu ZCBOaWNvbMOhcyBPamVkYSBCw6RyKS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIzNTIiPiMxMjM1MjwvYT46IEZpeCBhIHR5cG8gaW4g dGhlIGRvY3VtZW50YXRpb24gb2YgQXJnLndyaXRlX2FyZyAoQ2hyaXN0b3BoZSBSYWZmYWxsaSwg cmV2aWV3IGJ5IEZsb3JpYW4gQW5nZWxldHRpKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+UmV2YW1wIHRoZSBnZXR0aW5nIHN0YXJ0 ZWQgdHV0b3JpYWxzIGluIG9jYW1sLm9yZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcmV2YW1wLXRoZS1nZXR0aW5nLXN0YXJ0ZWQtdHV0b3JpYWxzLWluLW9jYW1sLW9y Zy8xMjc0OS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9yZXZhbXAtdGhlLWdldHRp bmctc3RhcnRlZC10dXRvcmlhbHMtaW4tb2NhbWwtb3JnLzEyNzQ5LzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNiYTM5OTciIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmczYmEzOTk3Ij5DdWlodGxhdWFjIEFsdmFyYWRvIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnM2JhMzk5NyI+DQo8 cD5XaXRoIHRoZSBoZWxwIG9mIG1hbnksIGJ1dCBtb3N0bHkgQHNhYmluZSwgQHByb2Zlc3Nvci5y b3NlIGFuZCBAdG1hdHRpbywgSeKAmXZlIGF0dGVtcHRlZCB0byByZXZhbXAgdHdvIG9mIHRoZSDi gJxnZXR0aW5nIHN0YXJ0ZWTigJ0gdHV0b3JpYWxzIGZyb20gb2NhbWwub3JnDQo8L3A+DQo8cD5U aGlzIFBSIGNvbnRhaW5zIHRoZSBzdGF0ZSBvZiB0aGlzIHdvcms6IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDMxIj4NCmh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xNDMxPC9hPiA8L3A+DQo8cD5JbiBvdXIgb3Bpbmlvbiwg dGhlIGdldHRpbmcgc3RhcnRlZCB0dXRvcmlhbHMgc2hvdWxkIGluY2x1ZGUgdGhyZWUgbWFuZGF0 b3J5IHR1dG9yaWFscw0KPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPkluc3RhbGwgPC9s aT48bGk+QSBUb3VyIG9mIE9DYW1sIDwvbGk+PGxpPkhvdyB0byBXcml0ZSBhbiBPQ2FtbCBQcm9n cmFtIDwvbGk+PC9vbD4NCjxwPlRoZSBmb3VydGgsIGRlYWxpbmcgd2l0aCBpbnN0YWxsYXRpb24g b3B0aW9ucyBvbiBXaW5kb3dzLCBiZWluZyBvcHRpb25hbCBmb3IgYXBwYXJlbnQgcmVhc29ucy4N CjwvcD4NCjxwPlRoaXMgUFIgb25seSBjb3ZlcnMgcGFydHMgMiAmYW1wOyAzIGJlY2F1c2UgdGhl eSB3ZXJlIG1vc3RseSB3cml0dGVuIGZyb20gc2NyYXRjaC4gV2XigJlyZSBhbHNvIHdvcmtpbmcg b24gYW4gdXBkYXRlIG9mIHRoZSBJbnN0YWxsIHR1dG9yaWFsLCBidXQgc2luY2UgaXQgaXMgbm90 IGEgcmV3cml0ZSwgaXQgZmVsdCBtb3JlIG5hdHVyYWwgdG8gcHV0IGl0IGluIGEgc2VwYXJhdGUg UFIuIEFsdGhvdWdoIGl0IGlzIG5vdCBhIGRyYWZ0LCBJIG11c3Qgc2F5DQogdGhhdCB0aGlzIGlz IGFuIGVhcmx5IHZlcnNpb24gb2YgdGhlIHRleHQuIEkgaG9wZSB5b3Ugd2lsbCB1bmRlcnN0YW5k LiA8L3A+DQo8cD5IZXJlIGlzIHRoZSBtYWluIGxlYXJuaW5nIGlkZWEuIFRoYXTigJlzIGEgYnJl YWR0aC1maXJzdCB0cmF2ZXJzYWwgb2YgdGhlIHJhYmJpdCBob2xlcy4NCjwvcD4NCjxwPkEgVG91 ciBvZiBPQ2FtbCBwcm92aWRlcyBhbiBvdmVydmlldyBvZiB0aGUgYmFzaWMgbGFuZ3VhZ2UgZmVh dHVyZXMuIEhlcmUsIHRoZSBnb2FsIGlzIG5vdCB0byBhZGRyZXNzIG1vcmUgdG9waWNzIGJ1dCB0 byByZWR1Y2UgdG8gdGhlIGNvcmUgb2Ygd2hhdCBjYW4gYmUgbGVhcm50IGZhc3QsIG9ubHkgdXNp bmcgdXRvcCwgd2lsbCBhbHdheXMgYmUgdXNlZnVsIGxhdGVyIGFuZCBoZWxwcyBidWlsZGluZyBh biBvdmVyYWxsIHZpZXcgb2YgT0NhbWwuDQo8L3A+DQo8cD5Ib3cgdG8gV3JpdGUgYW4gT0NhbWwg UHJvZ3JhbSBoYXMgdGhlIHNhbWUgYXBwcm9hY2gsIGV4Y2VwdCBpbnN0ZWFkIG9mIHVzaW5nIHV0 b3AsIHRoZSByZWFkZXIgc2hvdWxkIHdyaXRlIGZpbGVzIGFuZCBjb21tYW5kIGxpbmVzLiBJdOKA mXMgYSBjb21waWxlciBzdG9yeSwgd2hpbGUgdGhlIHByZXZpb3VzIG9uZSB3YXMgYW4gaW50ZXJw cmV0ZXIgc3RvcnkuDQo8L3A+DQo8cD5JdCBpcyBlYXJseSBBdWd1c3QuIEluIHRoZSBub3J0aGVy biBoZW1pc3BoZXJlLCB3ZSBzaG91bGQgZW5qb3kgdGhlIHNlYSwgdGhlIG1vdW50YWlucywgb3Vy IGZyaWVuZHMgb3IgY3VsdHVyZS4gSSB3aWxsIGJlIGhpa2luZyBzb29uLiBSZXZpZXdpbmcgdHV0 b3JpYWxzIGlzIHByb2JhYmx5IG5vdCB0aGUgZ3JlYXRlc3Qgc3VtbWVyIHJlYWQgKE9mZiB0b3Bp YzogSeKAmW0gaW4gTWFydGhhIFdlbGxzIE11cmRlcmJvdCBEaWFyaWVzIGFuZCBlbmpveWluZw0K IGl0KS4gQnV0IGlmIHlvdeKAmXJlIGluIHRoZSBtb29kIGZvciB0aGlzLCB3ZeKAmWQgbG92ZSB5 b3VyIGZlZWRiYWNrLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+Rmlyc3QgYWxw aGEgcmVsZWFzZSBvZiBTaW1wbGVfaHR0cGQ8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2ZpcnN0LWFscGhhLXJlbGVhc2Utb2Ytc2ltcGxlLWh0dHBkLzEyNzUzLzEiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZpcnN0LWFscGhhLXJlbGVhc2Utb2Ytc2ltcGxl LWh0dHBkLzEyNzUzLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnZTA4MzVhZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2UwODM1YWYiPkNo cmlzdG9waGUgUmFmZmFsbGkgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmdlMDgzNWFmIj4NCjxwPkkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0 aGUgZmlyc3QgYWxwaGEgcmVsZWFzZSBvZiBTaW1wbGVfaHR0cGQsIGF2YWlsYWJsZSBvbiBnaXRo dWIgYW5kIG9wYW0uIEl0IGlzIGEgbGlicmFyeSB0byBwcm9kdWNlIHdlYiBzZXJ2ZXIgYW5kIHNp dGVzLg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkRvY3VtZW50YXRpb246IDxhIGhy ZWY9Imh0dHBzOi8vcmFmZmFsbGkuZXUvc2ltcGxlX2h0dHBkL3NpbXBsZV9odHRwZCI+aHR0cHM6 Ly9yYWZmYWxsaS5ldS9zaW1wbGVfaHR0cGQvc2ltcGxlX2h0dHBkPC9hPg0KPC9saT48bGk+R2l0 aHViIDogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NyYWZmL3NpbXBsZV9odHRwZCI+aHR0 cHM6Ly9naXRodWIuY29tL2NyYWZmL3NpbXBsZV9odHRwZDwvYT4NCjwvbGk+PC91bD4NCjxwPldB Uk5JTkc6IGN1cnJlbnRseSB3ZSBuZWVkIHRoZSBsYXRlc3QgbWFzdGVyIG9mIG9jYW1sLXNzbC4g SXQgcmVxdWlyZXMgTGludXggYW5kIE9DYW1sIDUuMCwgaWYgeW91IGhhdmUgdGhpcywgeW91IGNh biBpbnN0YWxsIHdpdGg6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnYWM5MTM2 NSI+DQogIG9wYW0gcGluIGFkZCBodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2FtbC1zc2wj bWFzdGVyIC1rIGdpdA0KICBvcGFtIHBpbiBhZGQgaHR0cHM6Ly9naXRodWIuY29tL2NyYWZmL3Np bXBsZV9odHRwZCAtayBnaXQNCjwvcHJlPg0KPHA+QW5kIHRlc3QgdGhlIHRlbXBsYXRlIHNpdGUg KHZlcnkgc2ltcGxlLCBhcyBpdCBpcyBhbiBlbXB0eSBzaGVsbCB0byBzdGFydCBmcm9tKSB3aXRo DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnZmNkNjU3MSI+DQogIGNkIHNvdXJj ZV9kaXIvdGVtcGxhdGUNCiAgZHVuZSBleGVjIC0tIC4vc2VydmVyLmV4ZSAtLWxvZy1mb2xkZXIg Li9sb2cNCjwvcHJlPg0KPHA+VGhlIHRlbXBsYXRlIGlzIGFsc28gZG9jdW1lbnRlZCBhdCA8YSBo cmVmPSJodHRwczovL3JhZmZhbGxpLmV1L3NpbXBsZV9odHRwZC9zaW1wbGVfaHR0cGQvdGVtcGxh dGUuaHRtbCI+DQpodHRwczovL3JhZmZhbGxpLmV1L3NpbXBsZV9odHRwZC9zaW1wbGVfaHR0cGQv dGVtcGxhdGUuaHRtbDwvYT4gPC9wPg0KPHA+SXQgYWltcyBhdCA8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+QmVpbmcgc2ltcGxlIHRvIHVzZSBhbmQgcmF0aGVyIGNvbXBsZXRlIChzdXBw b3J0IHNzbCwgPGI+Y2hhbWw8L2I+OiBhbiBlcXVpdmFsZW50IG9mIHBocCwgYnV0IGluIE9DYW1s IGFuZCBjb21waWxlZCwgc3RhdHVzIGFuZCBzdGF0aXN0aWNzLCBhdXRoZW50aWNhdGlvbiwgY29v a2llcywg4oCmKS4NCjwvbGk+PGxpPg0KPHA+QmVpbmcgZmFzdDogb3VyIGxhdGVuY2llcyBhbmQg bnVtYmVyIG9mIHJlcXVlc3RzIHBlciBzZWNvbmRzIGFyZSB2ZXJ5IGdvb2QsIHRoYW5rcyB0byB1 c2luZyBsaW51eCBlcG9sbCwgZXZlbnRmZCwgT0NhbWzigJlzIGVmZmVjdHMgYW5kIGRvbWFpbnMs IOKApiBUaGUgZmlyc3QgcGFnZSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBzaG93cyBzb21lIGdyYXBo aWNzLCBidXQgaGVyZSBpcyBhIHNtYWxsIGNvbXBhcmlzb24gb2YgbGF0ZW5jaWVzIGZvciBhIHNt YWxsDQogMWtiIGZpbGU6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdmY2QwMzk3 Ij4NCiAgICAgICAgICAgICAgICAgbWluICAgICAgICBtZWFuICAgICAgNTAlICAgICAgIDkwJSAg ICAgICA5NSUgICAgICA5OSUgICAgICBtYXgNCiAgU2ltcGxlX2h0dHBkICA3OS40NzjCtXMgMjQy LjAwNsK1cyAyMzcuNTc2wrVzIDI5NC44MDLCtXMgMzA1LjY4wrVzIDMyOS4zNTLCtXMgIDMuMDQ5 bXMNCiAgTmdpbnggICAgICAgIDE3MC41NTHCtXMgMzI4LjkwNMK1cyAzMDkuNTc3wrVzIDM4NC4z MTPCtXMgNDAwLjUxwrVzIDQ4Mi45ODfCtXMgNDIuMDAzbXMNCiAgQXBhY2hlcyAgICAgIDE5Ni4z MjHCtXMgNDY2LjQzOcK1cyA0NTIuMjY1wrVzIDU0NS4xMjHCtXMgNTkwLjA1wrVzIDkxMy41MjfC tXMgIDYuMzcybXMNCjwvcHJlPg0KPHA+QW5kIGEgc21hbGwgPGk+Y2hhbWw8L2k+IChvdXIgZXF1 aXZhbGVudCBvZiBwaHApIGFnYWluc3QgPGk+cGhwLWZwbTwvaT4gZnJvbSA8aT4NCmFwYWNoZTwv aT4gYW5kIDxpPm5naW54PC9pPjogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzNk NGVmNDkiPg0KICBTaW1wbGVfaHR0cGQgMTQ2Ljk0NMK1cyAyODUuMDQ0wrVzIDI4MC41NTLCtXMg MzQxLjE3NcK1cyAzNTYuNDk3wrVzIDUwNy4zMDXCtXMgIDguMDY5bXMNCiAgTmdpbnggICAgICAg IDQxMS4xNTHCtXMgNzkzLjQzN8K1cyA2NTMuMTMxwrVzIDc5Ni4zMDDCtXMgODgyLjI2OMK1cyAg ICAgMi45bXMgNDQuNTA0bXMNCiAgQXBhY2hlICAgICAgIDY4OC43NjXCtXMgICAyLjM0Mm1zIDk1 MC42NDfCtXMgICAxLjIwMW1zICAgMS4zMjFtcyAgIDUuODQ0bXMgICAxLjE3MXMNCjwvcHJlPg0K PHA+VGhlc2Ugd2VyZSBvYnRhaW5lZCB3aXRoIHZlZ2V0YSBhdCAxMDAwIHJlcXVlc3RzL3MuIFNp bXBsZV9odHRwZCBvZmZlcnMgbXVjaCBtb3JlIHN0YWJsZSBsYXRlbmNpZXMgdW5kZXIgY2hhcmdl IHRoYW4gbmdpbnggb3IgYXBhY2hlLg0KPC9wPg0KPHA+SWYgeW91IHdhbnQgeW91ciBvd24gbWVh c3VybWVudHMsIHlvdSBuZWVkIHRvIHNldHVwIG5naW54L3BocCBvbiBwb3J0cyA3MDgwIGFuZCA3 NDQzLCBhbiBhcGFjaGUvcGhwIG9uIHBvcnQgODAgYW5kIDQ0My4gVGhlbiwgeW91IGNhbiBydW4g Wy4vYmVuY2guc2hdIGZyb20gdGhlIFt0ZXN0c10gZm9sZGVyIG9mIHRoZSBzb3VyY2UgdHJlZS4g SSB3b3VsZCBiZSBoYXBweSB0byBoYXZlIG1lYXN1cm1lbnRzIGZvciBhIGJpZyBzZXJ2ZXIgd2l0 aA0KIG1vcmUgdGhhbiAyMCBjb3Jlcy4gPC9wPg0KPC9saT48bGk+Q3VycmVudGx5IG9ubHkgbGlu dXggaXMgc3VwcG9ydGVkLiA8L2xpPjwvdWw+DQo8cD5IZWxwLCBjb21tZW50cywgYnVnIHJlcG9y dHMsIOKApiB3b3VsZCBiZSBncmVhdGx5IGFwcHJlY2lhdGVkLCBhcyB0aGlzIGlzIGFscGhhIHJl bGVhc2UsIGl0IGlzIHRpbWUgZm9yIHlvdSB0byBwcm9wb3NlIGNoYW5nZSBpbiB0aGUgZGVzaWdu IG9mIHRoZSBsaWJyYXJ5Lg0KPC9wPg0KPHA+TXkgd2Vic2l0ZSA8YSBocmVmPSJodHRwczovL3Jh ZmZhbGxpLmV1Ij5odHRwczovL3JhZmZhbGxpLmV1PC9hPiBhbmQgdGhlcmVmb3JlIHNpbXBsZV9o dHRwZCBkb2N1bWVudGF0aW9uIGFyZSBwb3dlcmVkIGJ5IHNpbXBsZV9odHRwZCAoZG8gd2UgbmFt ZSB0aGlzIGJvb3RzdHJhcCA7LSkgPw0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2E2Y2YzNWMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdhNmNmMzVjIj5TaW1vbiBDcnVhbmVzIGFza2VkIGFuZCBDaHJpc3RvcGhlIFJhZmZhbGxpIHJl cGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2E2Y2Yz NWMiPg0KPGJsb2NrcXVvdGU+DQo8cD5JdOKAmXMgYmUgaW50ZXJlc3RpbmcgdG8gY29tcGFyZSBz aW1wbGVfaHR0cGQgd2l0aCB0aW55X2h0dHBkICYjNDM7IG1vb25wb29sIChzZWU6IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvdGlueS1odHRwZC1tb29ucG9vbC1iZW5jaC8iPg0K aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS90aW55LWh0dHBkLW1vb25wb29sLWJlbmNoLzwvYT4p IDotKS4gSSB3b25kZXIgaG93IG11Y2ggdGhlIHR3byBkaXZlcmdlZCwgSSB3YXNu4oCZdCBleHBl Y3Rpbmcgc2ltcGxlX2h0dHBkIHRvIHVzZSBlcG9sbCENCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxw PlZlcnkgd2VsbCBpbmRlZWQuIEhlcmUgaXMgYm90aCBsYXRlbmNpZXMgYXQgMjUwMCByZXEvcyB1 c2luZyB2ZWdldGE6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT4NCjxwPlRpbnkgaHR0 cGQmIzQzO21vb25wb29sIDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmcwM2I0YWI4 Ij4NCiAgTGF0ZW5jaWVzICAgICBbbWluLCBtZWFuLCA1MCwgOTAsIDk1LCA5OSwgbWF4XSAgOTcu ODQ1wrVzLCAxOTcuMcK1cywgMTk0Ljg0OMK1cywgMjUxLjMzM8K1cywgMjY1Ljk2McK1cywgNDcw LjM0N8K1cywgMS42MjFtcw0KPC9wcmU+DQo8L2xpPjxsaT4NCjxwPlNpbXBsZV9odHRwZCA8L3A+ DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNGEyMjFkOCI+DQogIExhdGVuY2llcyAgICAg W21pbiwgbWVhbiwgNTAsIDkwLCA5NSwgOTksIG1heF0gIDk4LjI3wrVzLCAxNzYuNDc4wrVzLCAx NjkuNjc0wrVzLCAyMjkuNDQzwrVzLCAyNDMuODg4wrVzLCAyNzkuOTM3wrVzLCAyLjAwOG1zDQo8 L3ByZT4NCjwvbGk+PC91bD4NCjxwPkZvciB0aGUgbnVtYmVyIG9mIHJlcXVlc3RzIHBlciBzZWNv bmRzIHdpdGggd3JrLCB3ZSBhcmUgYXQgMTM5Njc1IGZvciB0aW55JiM0Mzttb29ucG9vbCBhbmQg MTY3ODE5IGZvciBzaW1wbGVfaHR0cGQuDQo8L3A+DQo8cD5UaW55IGlzIGEgYml0IGJldHRlciBm b3IgdGhlIHdvcnN0IGNhc2UuIFNpbXBsZV9odHRwZCBpcyBiZXR0ZXIgaW4gYXZlcmFnZSBhbmQg Zm9yIGFsbCBxdWFudGlsZS4gSSB0aGluayBJIGFtIG1pc3NpbmcgYSBwcmVlbXB0aXZlIHNjaGVk dWxlciB0aGF0IEkgY291bGQgZ2V0IGlmIHRoZXJlIHdoZXJlIHNvbWUgd2F5IHRvIHBlcmZvcm0g YW4gZWZmZWN0IHBlcmlvZGljYWxseSBpbiBPQ2FtbC4NCjwvcD4NCjxwPk1vb25wb29sIGlzIGEg dmVyeSBnb29kIGlkZWEgYWN0dWFsbHkgdG8gZ2V0IGEgcHJlZW1wdGl2ZSBzY2hlZHVsZXIgd2l0 aCBkb21haW5zICENCjwvcD4NCjxwPkkgc2hvdWxkIGFsc28gc2F5IHRoYXQgc2ltcGxlX2h0dHBk IHJvdXRpbmcgaXMgbm93IGxvb2tpbmcgYXQgdGhlIEhvc3QgZmllbGQsIGFkZHJlc3MgYW5kIHBv cnQsIG5vdCBvbmx5IHRoZSBwYXRoIGFuZCBtZXRob2QsIEl0IGhhcyBsb2dnaW5nIGJ5IHR5cGUg YW5kIGxldmVsIChub3QganVzdCBvbi9vZmYpIGFuZCBtYXliZSBhIGZldyBvdGhlciBleHRyYSBm ZWF0dXJlIHRoYXQgZG8gbm90IGNvbWUgdG8gbXkgbWluZCBub3cgYnV0IGhhdmUNCiBhbiBpbXBh Y3QgZm9yIGFuIGhlbGxvIHJlcXVlc3QuIDwvcD4NCjxwPk9uIHRoZSBzaWRlIG9mIG1lbW9yeSwg VlNaPTEwMzI5MDhLbyBSU1M9Mjc0OTJLbyBmb3Igc2ltcGxlX2h0dHBzIGFuZCBWU1o9OTk5Mjg4 S28gUlNTPTQwMTgwNEtvIGZvciB0aW55IEFsbCB0aGlzIGlzIHZlcnkgcmVhc29ubmFibGUgYnV0 IHRocmVhZHMgdXNlIG11Y2ggbW9yZSByZXNpZGVudCBtZW1vcnkuDQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iOCI+Q2Fpcm46IEEgZGVyaXZhdGlvbiBleHBsb3JlciBhbmQgbG9nZ2Vy IGZvciBNZW5oaXIgUGFyc2VyPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9jYWlybi1hLWRlcml2YXRpb24tZXhwbG9yZXItYW5kLWxvZ2dlci1mb3ItbWVuaGlyLXBhcnNl ci8xMjc1Ny8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWlybi1hLWRlcml2YXRp b24tZXhwbG9yZXItYW5kLWxvZ2dlci1mb3ItbWVuaGlyLXBhcnNlci8xMjc1Ny8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhODE5ZmU5IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYTgxOWZlOSI+VmluY2VudCBQZW5lbGxlIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTgxOWZlOSI+ DQo8cD5JIGFtIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIGEgc21hbGwgdG9vbCBJ 4oCZdmUgaW1wbGVtZW50ZWQgZm9yIGV4cGxhaW5pbmcgaG93IGEgTFIgcGFyc2VyIHdvcmtzIGZv ciBteSBzdHVkZW50cy4gVGhlIHRvb2wgaXMgY2FsbGVkIGNhaXJuLCBhbmQgbGV0cyB5b3Ugdmlz dWFsaXplIHRoZSBzdGVwIGJ5IHN0ZXAgYnVpbGRpbmcgb2YgdGhlIHBhcnNpbmcgdHJlZSBvZiB0 aGUgaW5wdXQgb2YgYSBwYXJzZXIsIGFuZCBjYW4gYmUNCiB1c2VkIHdpdGggYW55IGdyYW1tYXIg d3JpdHRlbiB3aXRoIG1lbmhpciAoYmFzaWNhbGx5LCB5b3UgcHJvdmlkZSBtZW5oaXIgZ2VuZXJh dGVkIG1vZHVsZXMgYW5kIGNtbHkgZmlsZSB0byBhIGZ1bmN0b3IgZnJvbSBjYWlybiBhbmQgeW91 4oCZcmUgYWxsIHNldCkuIEl0IGNhbiBlaXRoZXIgZ2VuZXJhdGUgYSB0ZXh0IGZpbGUgb3IgbGF1 bmNoIGEgc21hbGwgdGVybWluYWwgdXNlciBpbnRlcmZhY2UgdG8gZXhwbG9yZSB0aGUgZXhlY3V0 aW9uIG9mIHRoZQ0KIHBhcnNlciBzdGVwIGJ5IHN0ZXAuIEl0IGlzIHByb2JhYmx5IG9ubHkgdXNl ZnVsIG9uIHNtYWxsIGlucHV0cywgYW5kIG1haW5seSBmb3IgdGVhY2hpbmcgcHVycG9zZXMsIGJ1 dCBJIHRob3VnaHQgaXQgbWlnaHQgYmUgdXNlZnVsIHRvIHNoYXJlLg0KPC9wPg0KPHA+VGhlIGhv bWVwYWdlIG9mIHRoZSBwcm9qZWN0IGlzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9WaW5j ZW50UGVuZWxsZS9jYWlybiI+DQp0aGVyZTwvYT4sIGFuZCBpdCBjYW4gYmUgaW5zdGFsbGVkIGRp cmVjdGx5IHRocm91Z2ggb3BhbSB3aXRoIDogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9 Im9yZzMzOGVmMTYiPg0Kb3BhbSBpbnN0YWxsIGNhaXJuDQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI5Ij5PQ2FtbCBXb3Jrc2hvcCAyMDIzIOKAkyBwcmVzZW50YXRpb24gZGVhZGxp bmUgb24gSnVuZSAxc3QsIG9ubGluZSBhdHRlbmRhbmNlIG9wdGlvbjwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtd29ya3Nob3AtMjAyMy1wcmVzZW50YXRpb24t ZGVhZGxpbmUtb24tanVuZS0xc3Qtb25saW5lLWF0dGVuZGFuY2Utb3B0aW9uLzEyMjI2LzYiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjMtcHJlc2VudGF0 aW9uLWRlYWRsaW5lLW9uLWp1bmUtMXN0LW9ubGluZS1hdHRlbmRhbmNlLW9wdGlvbi8xMjIyNi82 PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2YmMwZTgw IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNmJjMGU4MCI+Z2FzY2hlIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNmJjMGU4MCI+ DQo8cD5BIHRlbXBvcmFyeSBsaXN0IG9mIGFjY2VwdGVkIHByZXNlbnRhdGlvbnMgaXMgYXZhaWxh YmxlOiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2ljZnAyMy5zaWdwbGFuLm9yZy9ob21lL29j YW1sLTIwMjMjZXZlbnQtb3ZlcnZpZXciPmh0dHBzOi8vaWNmcDIzLnNpZ3BsYW4ub3JnL2hvbWUv b2NhbWwtMjAyMyNldmVudC1vdmVydmlldzwvYT4NCjwvcD4NCjxwPldlIGFyZSBpbiBkaXNjdXNz aW9uIHdpdGggdGhlIE1MIHdvcmtzaG9wIHRvIG1vdmUgc29tZSBvZiB0aGVzZSB0YWxrcyB0byB0 aGUgTUwgd29ya3Nob3BzLCBzbyB0aGUgcHJvZ3JhbSBtYXkgY2hhbmdlIHNsaWdodGx5IGluIHRo ZSBmb2xsb3dpbmcgd2Vla3MuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj4x M3RoIE1pcmFnZU9TIHJldHJlYXQgaW4gTWFycmFrZXNoLCBNb3JvY2NvIChOb3ZlbWJlciAyMHRo IC0gMjZ0aCAyMDIzKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzEz dGgtbWlyYWdlb3MtcmV0cmVhdC1pbi1tYXJyYWtlc2gtbW9yb2Njby1ub3ZlbWJlci0yMHRoLTI2 dGgtMjAyMy8xMjc4MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC8xM3RoLW1pcmFn ZW9zLXJldHJlYXQtaW4tbWFycmFrZXNoLW1vcm9jY28tbm92ZW1iZXItMjB0aC0yNnRoLTIwMjMv MTI3ODEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn MjY5NGZiYSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzI2OTRmYmEiPkhhbm5lcyBN ZWhuZXJ0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnMjY5NGZiYSI+DQo8cD5pbiBOb3ZlbWJlciB0aGVyZeKAmWxsIGJlIHRoZSBuZXh0IHJl dHJlYXQgdGFraW5nIHBsYWNlIGluIE1hcnJha2VzaCwgTW9yb2Njby4gSGFwcHkgdG8gc2VlIG9s ZCBhbmQgbmV3IGZhY2VzIHRoZXJlLCBldmVyeW9uZSBpcyB3ZWxjb21lIChhbiBpbnRlcmVzdCBp biBPQ2FtbC9NaXJhZ2VPUyBpcyBuaWNlIHRvIGJyaW5nIHdpdGggeW91KS4NCjwvcD4NCjxwPkZ1 cnRoZXIgaW5mb3JtYXRpb24gYXQgPGEgaHJlZj0iaHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pbyI+ aHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pbzwvYT4NCjwvcD4NCjxwPkluIGNhc2UgeW91IGhhdmUg c29tZSBxdWVzdGlvbnMsIGRvbuKAmXQgaGVzaXRhdGUgdG8gcmVhY2ggb3V0IHRvIG1lLiA8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMSIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5rY2FzIGFuZCBrY2FzX2RhdGEgMC42LjE6 IFNUTSBhbmQgY29tcG9zaXRpb25hbCBsb2NrLWRyZWUgZGF0YSBzdHJ1Y3R1cmVzPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMSI+DQo8cD5BcmNoaXZlOiA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWtjYXMtYW5kLWtjYXMtZGF0YS0w LTYtMS1zdG0tYW5kLWNvbXBvc2l0aW9uYWwtbG9jay1kcmVlLWRhdGEtc3RydWN0dXJlcy8xMjY3 NC8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4ta2Nhcy1hbmQta2Nhcy1kYXRh LTAtNi0xLXN0bS1hbmQtY29tcG9zaXRpb25hbC1sb2NrLWRyZWUtZGF0YS1zdHJ1Y3R1cmVzLzEy Njc0LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE3 MDg3NTUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxNzA4NzU1Ij5WZXNhIEthcnZv bmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnMTcwODc1NSI+DQo8cD5BbmQgc3BlYWtpbmcgb2YgbmV3cywgZmlyc3QgcGFydCBvZiBibG9n IHBvc3QgPGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDgtMDcta2Nhcy1i dWlsZGluZy1hLWxvY2stZnJlZS1zdG0tZm9yLW9jYW1sLTEtMi8iPg0KS2NhczogQnVpbGRpbmcg YSBsb2NrLWZyZWUgU1RNIGZvciBPQ2FtbDwvYT4gaXMgbm93IG9ubGluZS4gPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjg0MTUwZCIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzY4NDE1MGQiPk9sZCBDV048L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzY4NDE1MGQiPg0KPHA+SWYgeW91 IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1p dHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwg bWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRo ZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQg ZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVmPSJodHRwOi8vbGlz dHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9ubGluZTwvYT4uIDwv cD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmdiZGMwNDk5Ij4NCjxwPjxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 1 Aug 2023 08:15:06 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 1 Aug 2023 08:15:06 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 1 Aug 2023 08:15:06 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3717EP47021576 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 1 Aug 2023 08:14:25 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3717EEUA021560 for ; Tue, 1 Aug 2023 08:14:14 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Aug 2023 09:14:13 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id B1488E013D; Tue, 1 Aug 2023 09:14:13 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 21A63E004E for ; Tue, 1 Aug 2023 09:14:07 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Aug 2023 09:14:05 +0200 Received: from TM.local (91-172-170-163.subs.proxad.net [91.172.170.163]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id CDA5E56125F; Tue, 1 Aug 2023 09:14:01 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZxEfm5BfFhMk2a06ed/smrFkXzw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 1 Aug 2023 08:13:51 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: da5e2a99-175d-4dff-4c5b-08db925f088b X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,246,1684792800"; d="scan'208,217";a="119768903" x-spam-flag: No, tests=bogofilter, spamicity=0.396964, queueID=873FC561261 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wOC0wMSBUdWUgMDk6MTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDcuMjUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOC4wOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bHkgMjUgdG8gQXVndXN0IDAxLCAyMDIz Lg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgy PlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMi IHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5vcGFtIDIuMi4wIGFscGhh MiByZWxlYXNlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+Q3Jvc3MtY29tcGlsaW5nIE9DYW1s IHdpdGggR2l0SHViIEFjdGlvbnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5SZWxlYXNlIG9w YW0tc3dpdGNoLW1vZGUgMS43IHdpdGggVHVhcmVnJiM0MztNZXJsaW4gc3VwcG9ydDwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzQiPmR1bmUgMy45LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5E a01MIDIuMC54IFJlbGVhc2VzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+QW5ub3VuY2luZyB0 aGUgb2NhbWwtd2FzbSBvcmdhbmlzYXRpb248L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5CcnIg MC4wLjYgYW5kIE5vdGUgMC4wLjM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5IaWxpdGUgMC4z LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5odG1saXQgMC4xLjAg4oCTIEhUTUwgZ2VuZXJh dGlvbiBjb21iaW5hdG9ycyBmb3IgT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+Zm9y ZXN0ZXIgMi4yLjEgcmVsZWFzZTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5NdWx0aWNvcmUg bGlicmFyaWVzOiBuZXcgcmVsZWFzZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmczNzI4NDVh Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPm9wYW0gMi4yLjAg YWxwaGEyIHJlbGVhc2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1vcGFtLTItMi0wLWFscGhhMi1yZWxlYXNlLzEyNjk5LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1vcGFtLTItMi0wLWFscGhhMi1yZWxlYXNlLzEyNjk5LzE8L2E+IDwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMTE3ODEzNyIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzExNzgxMzciPlIuIEJvdWpiZWwgYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxMTc4MTM3Ij4NCjxwPk9u IGJlaGFsZiBvZiB0aGUgb3BhbSBkZXYgdGVhbSwgSeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgeW91 IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcv Mi4yLjAtYWxwaGEyIj4NCjJuZCBhbHBoYSByZWxlYXNlIG9mIG9wYW0gMi4yLjA8L2E+LiA8L3A+ DQo8cD5UaGlzIGFscGhhIGludHJvZHVjZXMgYSBuZXcgb3B0aW9uIHRvIGluaXRpYWxpc2Ugb3Bh bSBvbiBXaW5kb3dzOiByZW1vdmUgdGhlIG5lZWQgb2YgYSBwcmVleGlzdGluZyBDeWd3aW4gYW5k IHByb3Bvc2UgdG8gaW5zdGFsbCBhbiBpbnRlcm5hbCBDeWd3aW4gaW5zdGFsbCBtYW5hZ2VkIGJ5 IG9wYW0uDQo8L3A+DQo8cD5Zb3XigJlsbCBmaW5kIG1vcmUgaW5mb3JtYXRpb24gaW4gPGEgaHJl Zj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAtYWxwaGEyLyI+DQp0aGUg YmxvZyBwb3N0PC9hPiBhbmQgYSBtb3JlIGRldGFpbGVkIHZpZXcgaW4gdGhlIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjIuMC1hbHBoYTIiPg0K cmVsZWFzZSBub3RlPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPkNyb3Nz LWNvbXBpbGluZyBPQ2FtbCB3aXRoIEdpdEh1YiBBY3Rpb25zPC9oMj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9jcm9zcy1jb21waWxpbmctb2NhbWwtd2l0aC1naXRodWItYWN0 aW9ucy85MTU0LzYiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Nyb3NzLWNvbXBpbGlu Zy1vY2FtbC13aXRoLWdpdGh1Yi1hY3Rpb25zLzkxNTQvNjwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1ZTg3MzM5IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnNWU4NzMzOSI+amJlY2tmb3JkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWU4NzMzOSI+DQo8cD5BcyBtZW50aW9uZWQgaW4g dGhlIG9yaWdpbmFsIHBvc3QsIHRoYXQgd2FzIGEgcHJldmlldyBmb3IgYSBmZXcgbW9udGhzLiBK YW4gMjAyMiB3YXMgbG9uZyBhZ28sIGFuZCBJIGRpZG7igJl0IGdldCBhbnkgZmVlZGJhY2sgdGhh dCBhbnlib2R5IHdhcyB1c2luZyBpdC4NCjwvcD4NCjxwPlJlZ2FyZGxlc3MsIEkgcm9sbGVkIHVw IHRoZSBjcm9zcy1jb21waWxpbmcgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSA8Y29kZT5ka21sLWJh c2UtY29tcGlsZXI8L2NvZGU+IHBhY2thZ2UuIEJ1dCBhIGh1Z2UgZG9zZSBvZiBjYXV0aW9uIOKA piBjcm9zcy1jb21waWxpbmcgaXMgbm90IG9mZmljaWFsbHkgc3VwcG9ydGVkIGJ5IE9DYW1sISBB bmQgdW5saWtlIHdoZW4gSSBvcmlnaW5hbGx5IHdyb3RlIHRoZSBwb3N0LCBJIG5vdyBhY3RpdmVs eSB1c2UNCiBteSBub24tZnJlZSA8YSBocmVmPSJodHRwczovL2Rpc2t1di5jb20vY21ha2UvaGVs cC9sYXRlc3QvIj5Ea1NESyBDTWFrZTwvYT4gcHJvZHVjdCBiZWNhdXNlLCBhbW9uZyBvdGhlciB0 aGluZ3MsIGl0IHdyYXBzDQo8Y29kZT5ka21sLWJhc2UtY29tcGlsZXI8L2NvZGU+IGNyb3NzLWNv bXBpbGluZyBpbnRvIGEg4oCcbm9ybWFs4oCdIElERSBwdXNoLWJ1dHRvbiBleHBlcmllbmNlIChp biBmYWN0LCBhcyB3ZSBzcGVhayBJ4oCZbSBoZWxwaW5nIHNvbWUgaGlnaCBzY2hvb2xlcnMgdXNl IEFuZHJvaWQgU3R1ZGlvIHRvIGNyb3NzLWNvbXBpbGUgT0NhbWwgaW50byB0aGVpciBBbmRyb2lk IEphdmEgYXBwKS4gU28gaWYgeW91IHVzZQ0KPGNvZGU+ZGttbC1iYXNlLWNvbXBpbGVyPC9jb2Rl PiBmb3IgaXRzIGNyb3NzLWNvbXBpbGluZyBmZWF0dXJlcywgbWFrZSBzdXJlIHlvdSBoYXZlIGlu dGVybWVkaWF0ZS1hZHZhbmNlZCBjb21mb3J0IHdpdGggdGhlIE9DYW1sIGNvbXBpbGVyLCBhbmQg YmUgY29tZm9ydGFibGUgd2l0aCBnZXR0aW5nIHlvdXIgb3duIHN1cHBvcnQuDQo8L3A+DQo8cD5I ZXJlIGlzIHdoYXQgeW914oCZbGwgbmVlZCBpZiB5b3UgKG9yIGFueW9uZSBzZWFyY2hpbmcgaW4g dGhlIGZ1dHVyZSkgYXJlIHRoYXQgaW50ZXJtZWRpYXRlLWFkdmFuY2VkIGNvbXBpbGVyIHVzZXIg YW5kIHdhbnQgdG8gZ2V0DQo8Y29kZT5ka21sLWJhc2UtY29tcGlsZXI8L2NvZGU+IHdvcmtpbmcg aW4geW91ciBlbnZpcm9ubWVudDogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk1ha2Ug c3VyZSB5b3UgcmVhZCBhbmQgdW5kZXJzdGFuZCA8YSBocmVmPSJodHRwczovL2Rpc2t1di1vY2Ft bC5naXRsYWIuaW8vZGlzdHJpYnV0aW9ucy9ka21sL2RvYy9Db21waWxpbmdJbkRlcHRoLmh0bWwi Pg0KaHR0cHM6Ly9kaXNrdXYtb2NhbWwuZ2l0bGFiLmlvL2Rpc3RyaWJ1dGlvbnMvZGttbC9kb2Mv Q29tcGlsaW5nSW5EZXB0aC5odG1sPC9hPi4gVGhlcmUgYXJlIHNoYXJwIGVkZ2VzLiBJZiB0aGF0 IGNvbnRlbnQgaXMgdG9vIGRpZmZpY3VsdCB0byBmb2xsb3csIHlvdSBzaG91bGQgcmV0aGluayB3 aGV0aGVyIHlvdSB3YW50IHRvIGRvIGNyb3NzLWNvbXBpbGF0aW9uIHVzaW5nDQo8Y29kZT5ka21s LWJhc2UtY29tcGlsZXI8L2NvZGU+IGRpcmVjdGx5IDwvbGk+PGxpPlRoZSA8YSBocmVmPSJodHRw czovL2dpdGxhYi5jb20vZGlza3V2L3NhbXBsZXMvRGtIZWxsb1dvcmxkLy0vcGlwZWxpbmVzP3Nj b3BlPWFsbCZhbXA7cGFnZT0xJmFtcDtyZWY9MS4wIj4NCjEuMCBicmFuY2ggb2YgdGhlIG5vbi1m cmVlIERrSGVsbG9Xb3JsZCBwcm9qZWN0PC9hPiBoYXMgd2hpY2ggZW52aXJvbm1lbnRzIGNhbiBj cm9zcy1jb21waWxlLiBGb3IgZXhhbXBsZSwNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9k aXNrdXYvc2FtcGxlcy9Ea0hlbGxvV29ybGQvLS9waXBlbGluZXMvODczNTA3NjkwIj5waXBlbGlu ZSA4NzM1MDc2OTA8L2E+ICh3aGljaCB3aWxsIGRpc2FwcGVhcikgc2hvd3MgQW5kcm9pZCBhbmQg bWFjT1MgeC1jb21waWxlcy4gSWYgeW91IGFyZSBsb29raW5nIGF0IHRoaXMgcG9zdCBpbiB0aGUg ZGlzdGFudCBmdXR1cmUgdG8gc2VlIHdoYXQgb3RoZXIgZW52aXJvbm1lbnRzIGhhdmUgYmVlbiBh ZGRlZCwNCiB0cnkgbG9va2luZyBmb3IgZnV0dXJlIDxjb2RlPjEuMTwvY29kZT4gYW5kIDxjb2Rl PjIuMDwvY29kZT4gKGV0Yy4pIGJyYW5jaGVzIDwvbGk+PGxpPlNpbmNlIEkgZG9u4oCZdCB5ZXQg c3luY2hyb25pemUgRGtNTCB3aXRoIHRoZSBjZW50cmFsIG9wYW0gcmVwb3NpdG9yeSwgYnVpbGQg dGhlIGxhdGVzdA0KPGNvZGU+ZGttbC1iYXNlLWNvbXBpbGVyPC9jb2RlPiBieSBhZGRpbmcgdGhl IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGlza3V2LW9wYW0tcmVwb3NpdG9y eSNyZWFkbWUiPg0KaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9kaXNrdXYtb3BhbS1yZXBvc2l0 b3J5I3JlYWRtZTwvYT4gcmVwb3NpdG9yeSA8L2xpPjxsaT5UaGUgbWFpbiBzb3VyY2UgY29kZSBp cyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlza3V2L2RrbWwtY29tcGlsZXIjcmVhZG1l Ij4NCmh0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGttbC1jb21waWxlciNyZWFkbWU8L2E+IDwv bGk+PGxpPkl0IGRpZCAoYW5kIHNob3VsZCkgYnVpbGQgb24gYWxsIHRoZSBvcGFtIHBsYXRmb3Jt cywgcGx1cyBXaW5kb3dzIE1TVkMuIEJ1dCBmb3IgdGhlDQo8Y29kZT5ka21sLWJhc2UtY29tcGls ZXI8L2NvZGU+IHBhY2thZ2UsIGFuZCBtYW55IG90aGVyIERrTUwgcGFja2FnZXMsIEkgZG9u4oCZ dCB0cnkgdG8gbWFpbnRhaW4gR2l0SHViIEFjdGlvbnMgLyBHaXRMYWIgQ0kgYW55bW9yZS4gRG9p bmcgQ0kgb24gbXkgaW50ZXJuYWwgbWFjaGluZXMgaXMgdmFzdGx5IG1vcmUgZWZmaWNpZW50LCBh bmQgSSBjYW7igJl0IGp1c3RpZnkgZG9pbmcgdGhhdCBsZXZlbCBvZiB3YXN0ZS4NCjwvbGk+PC91 bD4NCjxwPkFsbCB0aGUgYmVzdCEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPlJl bGVhc2Ugb3BhbS1zd2l0Y2gtbW9kZSAxLjcgd2l0aCBUdWFyZWcmIzQzO01lcmxpbiBzdXBwb3J0 PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vcGFt LXN3aXRjaC1tb2RlLTEtNy13aXRoLXR1YXJlZy1tZXJsaW4tc3VwcG9ydC8xMjcwMy8xIj4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vcGFtLXN3aXRjaC1tb2RlLTEt Ny13aXRoLXR1YXJlZy1tZXJsaW4tc3VwcG9ydC8xMjcwMy8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhYWE5OGM4IiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnYWFhOThjOCI+RXJpayBNYXJ0aW4tRG9yZWwgYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhYWE5OGM4Ij48L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzY5Mzc2NWEiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmc2OTM3NjVhIj5FbWFjczogbmV3IG1pbm9yIG1vZGUgZm9yIG9wYW0gdXNlcnM8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzY5Mzc2NWEiPg0K PHA+RGVhciBhbGwsIDwvcD4NCjxwPjxiPklmIHlvdSBoYXBwZW4gdG8gdXNlIHVzZSBzZXZlcmFs IG9wYW0gc3dpdGNoZXMgYW5kIEVtYWNzIGFzIGFuIElERTo8L2I+IHlvdSBtYXkgYmUgaW50ZXJl c3RlZCBpbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1Byb29mR2VuZXJhbC9vcGFtLXN3 aXRjaC1tb2RlIj5vcGFtLXN3aXRjaC1tb2RlPC9hPiA8aT4NCih3aGljaCBvdmVybGFwcyB0dWFy ZWctbW9kZeKAmXMgPGNvZGU+TS14IHR1YXJlZy1vcGFtLXVwZGF0ZS1lbnY8L2NvZGU+IGZ1bmN0 aW9uIGJ1dCBwcm92aWRlcyBzZXZlcmFsIGFkZGl0aW9uYWwgZmVhdHVyZXMpPC9pPi4NCjwvcD4N CjxwPlRvIGJlIG1vcmUgcHJlY2lzZTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnRo aXMgbWlub3IgbW9kZSByZXF1aXJlcyBHTlUgRW1hY3MgMjUuMSBhbmQgaXMgYXZhaWxhYmxlIGlu IDxhIGhyZWY9Imh0dHBzOi8vbWVscGEub3JnLyMvb3BhbS1zd2l0Y2gtbW9kZSI+DQpNRUxQQTwv YT4sIDxhIGhyZWY9Imh0dHBzOi8vc3RhYmxlLm1lbHBhLm9yZy8jL29wYW0tc3dpdGNoLW1vZGUi Pk1FTFBBIFN0YWJsZTwvYT4sDQo8YSBocmVmPSJodHRwczovL2VscGEubm9uZ251Lm9yZy9ub25n bnUtZGV2ZWwvb3BhbS1zd2l0Y2gtbW9kZS5odG1sIj5Ob25HTlUtZGV2ZWw8L2E+LA0KPGEgaHJl Zj0iaHR0cHM6Ly9lbHBhLm5vbmdudS5vcmcvbm9uZ251L29wYW0tc3dpdGNoLW1vZGUuaHRtbCI+ Tm9uR05VPC9hPjsgPC9saT48bGk+aXQgZGlzcGxheXMgdGhlIGN1cnJlbnRseSBjaG9zZW4gc3dp dGNoIGluIHRoZSBtb2RlLWxpbmU7IDwvbGk+PGxpPml0IHByb3ZpZGVzIGFuIDxiPjxiPk9QU1c8 L2I+PC9iPiBtZW51LWJhciAoYWxzbyB3b3JraW5nIGluIFRUWSkgYW5kIGFuIDxiPjxiPk9QU1c8 L2I+PC9iPiBtb2RlLWJhciBtZW51LCBhcyB3ZWxsIGFzIGEgfk0teCBvcGFtLXN3aXRjaC1zZXQt c3dpdGNofmZ1bmN0aW9uOw0KPC9saT48bGk+YWxsIG9mIHRoZXNlIGFsbG93IHRvIHNlbGVjdCBh IHJlZ3VsYXIgb3BhbSBzd2l0Y2ggb3IgYSA8Yj48Yj5sb2NhbDwvYj48L2I+IG9wYW0gc3dpdGNo Ow0KPC9saT48bGk+dGhleSB0cmlnZ2VyIGJlZm9yZS9hZnRlciB0aGUgb3BhbSBzd2l0Y2ggY2hh bmdlLCB0aGUgZnVuY3Rpb25zIHJlZ2lzdGVyZWQgaW4gdGhlIGhvb2tzDQo8Y29kZT4nb3BhbS1z d2l0Y2gtYmVmb3JlLWNoYW5nZS1vcGFtLXN3aXRjaC1ob29rPC9jb2RlPiBhbmQgPGNvZGU+J29w YW0tc3dpdGNoLWNoYW5nZS1vcGFtLXN3aXRjaC1ob29rPC9jb2RlPg0KPC9saT48bGk+dGhlc2Ug aG9va3MgYXJlIGludGVybmFsbHkgdXNlZCBieSBUdWFyZWcsIE1lcmxpbiA8Yj4ob3IgUHJvb2ZH ZW5lcmFsIGZvciBDb3EpPC9iPiB0byBraWxsIHRoZSBPQ2FtbCB0b3BsZXZlbCBvciB0aGUgTWVy bGluIHNlcnZlcjogc28gdGhhdCB0aGUgbmV4dCBldmFsIG9yIHNhdmUgYWN0aW9uIHVzZXMgdGhl IGFwcHJvcHJpYXRlIGJpbmFyeSBmcm9tIHRoZSBuZXcgc3dpdGNoOw0KPC9saT48bGk+YW5kIGZp bmFsbHksIHRoZSBtaW5vciBtb2RlIHN0b3JlcyB0aGUgaW5pdGlhbCBlbnZpcm9ubWVudCAoYmVm b3JlIHRoZSBtb2RlIGlzIGVuYWJsZWQpLCBwcm92aWRpbmcgYSBSZXNldCBmZWF0dXJlIHRvIGJh Y2t0cmFjayB0byB0aGUgaW5pdGlhbGx5IGNob3NlbiBzd2l0Y2guDQo8L2xpPjwvdWw+DQo8cD5I ZXJlIGlzIGEgc2NyZWVuc2hvdCBvZiB0aGUgb3BhbS1zd2l0Y2gtbW9kZSBpbiBHTlUgRW1hY3Mg MjcuMTogPC9wPg0KPGRpdiBpZD0ib3JnMzUyMjE1OCIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1n IHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMv b2NhbWwvb3JpZ2luYWwvMlgvNi82NTg1N2ZlNDQyNDc0NDdiYzZmMzkyN2MwOWE5ZWI4NTE2YWJl ZmNjLnBuZyIgYWx0PSI2NTg1N2ZlNDQyNDc0NDdiYzZmMzkyN2MwOWE5ZWI4NTE2YWJlZmNjLnBu ZyI+DQo8L3A+DQo8L2Rpdj4NCjxwPkhhcHB5IGhhY2tpbmchIDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPmR1bmUgMy45LjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1kdW5lLTMtOS0wLzEyNTMwLzQiPmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZHVuZS0zLTktMC8xMjUzMC80PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNDE0NWZmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnMTQxNDVmZiI+RXRpZW5uZSBNaWxsb24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxNDE0NWZmIj4NCjxwPldlIGp1c3QgcmVs ZWFzZWQgZHVuZSAzLjkuMi4gVGhpcyBidWdmaXgtb25seSByZWxlYXNlIGNvbnRhaW5zIHR3byBw bGF0Zm9ybS1zcGVjaWZpYyBjaGFuZ2VzOiBvbmUgZml4ZXMgdGhlIER1bmUgY2FjaGUgb24gV2lu ZG93cywgYW5kIHRoZSBvdGhlciBvbmUgY29tcGxldGVzIHRoZSBmaXggb24gTGludXggd2hlbg0K PGNvZGU+c2VuZGZpbGU8L2NvZGU+IGlzIG5vdCBhdmFpbGFibGUuIFRoaXMgbWFrZXMgRHVuZSBh dmFpbGFibGUgd2hlcmUgdXNlciBkaXJlY3RvcmllcyBhcmUgZW5jcnlwdGVkIHVzaW5nDQo8Y29k ZT5lY3J5cHRmczwvY29kZT4gZm9yIGV4YW1wbGUuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnNjM4MjgzNCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzYzODI4MzQiPkZpeGVzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4 dC1vcmc2MzgyODM0Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5EaXNhYmxlIGJhY2tncm91 bmQgZGlnZXN0cyBvbiBXaW5kb3dzLiBUaGlzIHByZXZlbnRzIGFuIGlzc3VlIHdoZXJlIHVucmVt b3ZhYmxlIGZpbGVzIHdvdWxkIG1ha2UgZHVuZSBjcmFzaCB3aGVuIHRoZSBzaGFyZWQgY2FjaGUg aXMgZW5hYmxlZC4gKCM4MjQzLCBmaXhlcyAjODIyOCwgQGVtaWxsb24pDQo8L2xpPjxsaT5GaXgg cGVybWlzc2lvbiBlcnJvcnMgd2hlbiA8Y29kZT5zZW5kZmlsZTwvY29kZT4gaXMgbm90IGF2YWls YWJsZSAoIzgyMzQsIGZpeGVzICM4MjEwLCBAZW1pbGxvbikNCjwvbGk+PC91bD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPkRrTUwgMi4wLnggUmVsZWFzZXM8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21sLTItMC14LXJlbGVhc2VzLzEy NjQyLzgiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21sLTItMC14LXJlbGVh c2VzLzEyNjQyLzg8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnNWNkMzhiYyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzVjZDM4YmMiPmpiZWNr Zm9yZCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzVjZDM4YmMiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODc0MmM3 NSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzg3NDJjNzUiPkRrTUwgMi4wLjI8L2g0 Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzg3NDJjNzUiPg0KPHA+ Q29uc2lkZXIgMi4wLjIgdG8gYmUgYSBwcmV2aWV3IHJlbGVhc2UuIFRoZSA8YSBocmVmPSJodHRw czovL2dpdGxhYi5jb20vZGlza3V2LW9jYW1sL2Rpc3RyaWJ1dGlvbnMvZGttbC8tL3JlbGVhc2Vz LzIuMC4yIj4NCjIuMC4yIGluc3RhbGxlcnMgYW5kIHJlbGVhc2Ugbm90ZXMgYXJlIGhlcmU8L2E+ IDwvcD4NCjxwPlRoZSBtYWpvciBjaGFuZ2UgaXMgdGhlcmUgaXMgYSBzdGFuZGFsb25lIOKAnEJ5 dGVjb2RlIEVkaXRpb27igJ0gaW5zdGFsbGVyOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGNvZGU+dXRvcDwvY29kZT4sIDxjb2RlPm9jYW1sYzwvY29kZT4sIDxjb2RlPm9jYW1sZmlu ZDwvY29kZT4gd29yayB3aXRoIDxjb2RlPg0KYmFzZTwvY29kZT4sIDxjb2RlPnJlZmw8L2NvZGU+ LCA8Y29kZT5ncmFwaGljczwvY29kZT4gYW5kIDxjb2RlPnNxbGl0ZTM8L2NvZGU+LiAoSSBpbnRl bmQgbGF0ZXIgdG8gYWRkIHRoZQ0KPGNvZGU+dHNkbDwvY29kZT4gcmVsYXRlZCBwYWNrYWdlcykg PC9saT48bGk+Tm8gPGNvZGU+b3BhbTwvY29kZT4sIFZpc3VhbCBTdHVkaW8sIEdpdCBvciBNU1lT Mi4gVGhhdCBpcyBhIGZhc3QgaW5zdGFsbCAoc2VlIEFuc3dlcnMgYmVsb3cpLg0KPC9saT48bGk+ Q29tZXMgZW1iZWRkZWQgd2l0aCBhIGJ5dGVjb2RlIHN5c3RlbSBPQ2FtbCBjb21waWxlciBhbmQg cHJlLWNvbXBpbGVkIHBhY2thZ2VzICg8Y29kZT5iYXNlPC9jb2RlPiwgZXRjLikNCjwvbGk+PGxp Pjxjb2RlPmR1bmU8L2NvZGU+IHdvcmtzIHRvIHRoZSBleHRlbnQgRHVuZSB3b3JrcyB3aXRoIGJ5 dGVjb2RlOiB5b3UgaGF2ZSB0byBzZXQgZXhwbGljaXQNCjxjb2RlPihtb2RlcyAuLi4gYnl0ZSk8 L2NvZGU+LCBhbmQgeW91IGhhdmUgdG8gZXhwbGljaXRseSBhc2sgZm9yIHRoZSBieXRlY29kZSBh cnRpZmFjdHMgd2l0aA0KPGNvZGU+ZHVuZSBidWlsZCB4L3kvei5iYzwvY29kZT4gPC9saT48bGk+ VlMgQ29kZSB3b3JrcyB3aXRoIHRoZSBPQ2FtbCBQbGF0Zm9ybSBleHRlbnNpb24gKGllLiA8Y29k ZT5vY2FtbGxzcDwvY29kZT4gd29ya3MgYWxvbmdzaWRlDQo8Y29kZT5kdW5lIGJ1aWxkIHgveS96 LmJjPC9jb2RlPikgPC9saT48L3VsPg0KPHA+SWYgcGVvcGxlIHRoaW5rIHRoZXnigJlsbCB1c2Ug aXQsIG5vdyBpcyB0aGUgdGltZSB0byBzYXkgc28hIDxiPkkgZG9u4oCZdCBpbnRlbmQgdG8gc3Vw cG9ydCBzb21ldGhpbmcgdmVyeSBmZXcgcGVvcGxlIHdpbGwgdXNlLjwvYj4NCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczY2M4MTE1IiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnM2NjODExNSI+QW5zd2VyczwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnM2NjODExNSI+DQo8YmxvY2txdW90ZT4NCjxw PkZZSSwgVGhlIOKAnHdpbmRvd3MgNjQtYml0IGluc3RhbGxlcuKAnSBpbiA8YSBocmVmPSJodHRw czovL2dpdGxhYi5jb20vZGlza3V2LW9jYW1sL2Rpc3RyaWJ1dGlvbnMvZGttbC8tL3JlbGVhc2Vz LzIuMC4xIj4NCnRoaXMgcGFnZSA8L2E+aXMgYSBkZWFkIGxpbmsuIDwvcD4NCjwvYmxvY2txdW90 ZT4NCjxwPlRoYW5rcyEgRGtNTCAyLjAuMiBzaG91bGQgaGF2ZSBsaXZlIGxpbmtzLCB1bmxpa2Ug Mi4wLjEgPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5kbyB5b3UgaGF2ZSBhIGd1ZXNzdGltYXRlIG9u IHRoZSBpbnN0YWxsIHRpbWUgZm9yIHRoaXMgYnl0ZWNvZGUtb25seSBiYXNlIHN5c3RlbSBvbiBz dGFuZGFyZCBtYWNoaW5lcz8NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPlRoZSDigJxCeXRlY29k ZSBFZGl0aW9u4oCdIGlzIHVuZGVyIDUgbWludXRlcyB0byBkb3dubG9hZCAofjIwME1pQiksIGFu ZCB1bmRlciA1IG1pbnV0ZXMgdG8gaW5zdGFsbC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjYiPkFubm91bmNpbmcgdGhlIG9jYW1sLXdhc20gb3JnYW5pc2F0aW9uPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5nLXRoZS1vY2Ft bC13YXNtLW9yZ2FuaXNhdGlvbi8xMjY3Ni8zIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm5vdW5jaW5nLXRoZS1vY2FtbC13YXNtLW9yZ2FuaXNhdGlvbi8xMjY3Ni8zPC9hPiA8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzIzOWVmOTAiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyMzllZjkwIj5EZWVwIGluIHRoaXMgdGhyZWFkLCB6YXBh c2hjYW5vbiBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmcyMzllZjkwIj4NCjxwPkkgYWRkZWQgYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtd2FzbS93YXNvY2FtbCNxdWlja3N0YXJ0Ij5mZXcgbm90ZXM8L2E+IG9uIGhvdyB0byB0cnkg V2Fzb2NhbWwuIERvbuKAmXQgZXhwZWN0IGV2ZXJ5dGhpbmcgdG8gd29yayBub3cgYXMgdGhpcyB3 YXMgaW5kZWVkIGEgcXVpY2sgcHJvdG90eXBlIChtb3JlIG9uIHRoaXMgYmVsb3cpLg0KPC9wPg0K PHA+VGhlIGdvYWwgb2YgV2Fzb2NhbWwgd2FzIHRvIGNvbnZpbmNlIHRoZSBXYXNtLUdDIHdvcmtp bmcgZ3JvdXAgb2YgdGhlIHVzZWZ1bG5lc3Mgb2YNCjxjb2RlPmkzMXJlZjwvY29kZT4gYmVjYXVz ZSB3ZSBrbmV3IGl0IHdvdWxkIGJlIG5lZWRlZCBieSBPQ2FtbC4gV2l0aG91dCB0aGlzIHdvcmsN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9nYy9pc3N1ZXMvMzIwIj50 aGV5IG1heSBoYWQgYmVlbiByZW1vdmVkIGZyb20gdGhlIHByb3Bvc2FsPC9hPi4gV2UNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9tZWV0aW5ncy9ibG9iL21haW4vZ2Mv MjAyMy9HQy0wMS0xMC5tZCI+cHJlc2VudGVkPC9hPiB0aGUgd29yayBpbiBKYW51YXJ5IHRvIHRo ZSB3b3JraW5nIGdyb3VwLiBJbiBNYXJjaCB3ZSBhbHNvIHByZXNlbnRlZCB0aGlzIHdvcmsgYXQg dGhlIERhZ3N0dWhsIHNlbWluYXIgb24gdGhlDQo8YSBocmVmPSJodHRwczovL3d3dy5kYWdzdHVo bC5kZS9kZS9zZW1pbmFycy9zZW1pbmFyLWNhbGVuZGFyL3NlbWluYXItZGV0YWlscy8yMzEwMSI+ DQpmb3VuZGF0aW9ucyBvZiBXZWJBc3NlbWJ5PC9hPiB3aGljaCB3YXMgdGhlIG9wcG9ydHVuaXR5 IHRvIGRpc2N1c3Mgd2l0aCBzb21lIGFjdGl2ZSBtZW1iZXJzIG9mIHRoZSBXYXNtIGNvbW11bml0 eSBzdWNoIGFzIEFuZHJlYXMgUm9zc2JlcmcsIEJlbiBUaXR6ZXIgYW5kIENvbnJhZCBXYXR0LiBJ biBBcHJpbCwgdGhlIEd1aWxlIGNvbXBpbGVyIHRvIFdhc20tR0Mgd2FzIGFsc28NCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9tZWV0aW5ncy9ibG9iL21haW4vZ2MvMjAy My9HQy0wNC0xOC5tZCI+cHJlc2VudGVkPC9hPiBhbmQgaXQgd2FzIGFsc28gdXNpbmcNCjxjb2Rl PmkzMXJlZjwvY29kZT4uIEhhdmluZyB0d28gbGFuZ3VhZ2VzIHVzaW5nIDxjb2RlPmkzMXJlZjwv Y29kZT4gY29udmluY2VkIHRoZSB3b3JraW5nIGdyb3VwLiBUaGlzIGlzIHdoYXQgYWxsb3dzIFdh c21fb2Zfb2NhbWwgdG8gdXNlDQo8Y29kZT5pMzFyZWY8L2NvZGU+IHRvZGF5LiA6c2xpZ2h0X3Nt aWxlOiA8L3A+DQo8cD5XYXNvY2FtbCBpcyBhbHNvIHRoZSBmaXJzdCBjb21waWxlciBmb3IgYSBy ZWFsLXdvcmxkIGZ1bmN0aW9uYWwgbGFuZ3VhZ2VzIHRvIFdhc20tR0MuIFdlIGRldmVsb3BlZCBt YW55IHN0cmF0ZWdpZXMgZm9yIHRoZSBtZW1vcnkgcmVwcmVzZW50YXRpb24gb2YgdmFsdWVzLiBG b3Igbm93IHdlIG9ubHkgcHJlc2VudGVkIHR3byBvZiB0aGVtIChtb3JlIGFyZSBjb21pbmchKSBh bmQgdGhleSBzaG91bGQgd29yayBmb3Igb3RoZXIgbGFuZ3VhZ2VzL2NvbXBpbGVycy4NCiBXYXNt X29mX29jYW1sIGFuZCBHdWlsZSBhcmUgdXNpbmcgc2ltaWxhciB0ZWNobmlxdWVzIHRvIHdoYXQg d2UgcHJlc2VudGVkLiA8L3A+DQo8cD5BIGxpdHRsZSBiaXQgbW9yZSBhYm91dCB0aGUgZGlmZmVy ZW5jZXMgYmV0d2VlbiBXYXNvY2FtbCBhbmQgV2FzbV9vZl9vY2FtbOKApiBGaXJzdCwgV2FzbV9v Zl9vY2FtbCBiZWluZyBhIHRvb2wgZXh0ZXJuYWwgdG8gdGhlIGNvbXBpbGVyLCBpdCBpcyBvZiBj b3Vyc2UgZWFzaWVyIHRvIGRlcGxveSBxdWlja2x5LiBXYXNvY2FtbCBzdGFydHMgZnJvbSBGbGFt YmRhIGFuZCB3aWxsIHRodXMgYmVuZWZpdCBhbGwgdGhlIG9wdGltaXphdGlvbnMgdGhhdA0KIGFy ZSBtaXNzaW5nIGZyb20gdGhlIGJ5dGVjb2RlLiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v V2ViQXNzZW1ibHkvYmluYXJ5ZW4iPg0KQmluYXJ5ZW48L2E+IHdpbGwgYmUgYWJsZSB0byByZWNv dmVyIHNvbWUgcGVyZm9ybWFuY2VzIGJ1dCBpdCBoYXMgaXRzIGxpbWl0cy4gTW9yZW92ZXIsIFdh c29jYW1sIGlzIGdvaW5nIHRvIHBsYXkgbmljZWx5IHdpdGggc2VwYXJhdGUgY29tcGlsYXRpb24u IEFsc28sIFdhc21fb2Zfb2NhbWwgaXMgbGltaXRlZCBpbiBpdHMgdmFsdWUgcmVwcmVzZW50YXRp b24gY2hvaWNlIChpdCBtdXN0IHJlcHJlc2VudCBibG9ja3MgYXMgYW4NCjxjb2RlPmVxcmVmIGFy cmF5PC9jb2RlPikgd2hlcmVhcyBXYXNvY2FtbCBjYW4gdXNlIG1vcmUgc29waGlzdGljYXRlZCBy ZXByZXNlbnRhdGlvbnMuDQo8L3A+DQo8cD5BbHNvIG5vdGUgdGhhdCBub25lIG9mIHRoZSB0d28g YXJlIGFjdHVhbGx5IHVzYWJsZSBpbiBhIHByb2R1Y3Rpb24gdG9kYXkuIFRoZXkgYm90aCBkZXBl bmRzIG9uIG1hbnkgV2FzbSBleHRlbnN0aW9ucyAodHlwZWQgZnVuY3Rpb24gcmVmZXJlbmNlcywg R0MsIHRhaWwtY2FsbCwgZXhjZXB0aW9uIGhhbmRsaW5nLCBzdHJpbmcgcmVmZXJlbmNl4oCmKSB0 aGF0IGFyZSBub3QgeWV0IGF2YWlsYWJsZSBpbiBicm93c2VycyAoeW91IGNhbiB1c2UgdGhlbQ0K IGluIGNocm9tZSBpZiB5b3UgdHVybiBzb21lIGV4cGVyaW1lbnRhbCBmbGFncyBvbikuIDwvcD4N CjxwPkFsb25nc2lkZSBhbGwgdGhlIGZ1dHVyZSB3b3JrcyB0aGF0IEBsZWZlc3NhbiBkZXNjcmli ZWQsIEnigJltIGFsc28gZm9ybWFsaXppbmcgdGhlIGNvbXBpbGF0aW9uIG9mIGZsYW1iZGEgdG8g V2FzbS1HQyB3aXRoIGEgcHJvcGVyIHNlbWFudGljcy4NCjwvcD4NCjxwPk9uIGEgcmVsYXRlZCBu b3RlLCB3ZSBpbmRlZWQgaW1wbGVtZW50ZWQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL09D YW1sUHJvL293aSI+DQpPd2k8L2E+LCBhIFdhc20gaW50ZXJwcmV0ZXIgd3JpdHRlbiBpbiBPQ2Ft bC4gSXQgd2FzIGEgd2F5IHRvIGV4cGVyaW1lbnQgd2l0aCBsYW5ndWFnZSBleHRlbnNpb25zLiBD dXJyZW50bHksIG91ciBtYWluIHdvcmsgb24gdGhlIGludGVycHJldGVyIGlzIHRvIGFkZCB0aGUg cG9zc2liaWxpdHkgdG8gZG8gc3ltYm9saWMgZXhlY3V0aW9uIG9mIFdhc20gY29kZSAoYWthIHdo aXRlYm94IGZ1enppbmcpLiBUaGlzIGFsbG93cyB0byBhdXRvbWF0aWNhbGx5DQogZmluZCBpbnB1 dCB2YWx1ZXMgdGhhdCBsZWFkIHRvIGEgY3Jhc2ggaW4gdGhlIHByb2dyYW0uIFRoZSBuaWNlIHRo aW5nIGlzIHRoYXQgaXQgYWxsb3dzIHRvIGZpbmQgYnVncyBpbiBjb2RlIHdyaXR0ZW4gaW4gYW5v dGhlciBsYW5ndWFnZSBhbmQgY29tcGlsZWQgdG8gV2FzbSAoZS5nLiBDKS4NCjwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5CcnIgMC4wLjYgYW5kIE5vdGUgMC4wLjM8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1icnItMC0wLTYtYW5kLW5vdGUtMC0w LTMvMTI3MTgvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJyci0wLTAtNi1h bmQtbm90ZS0wLTAtMy8xMjcxOC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzVkZWJkY2EiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1ZGVi ZGNhIj5EYW5pZWwgQsO8bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVkZWJkY2EiPg0KPHA+VGhlcmXigJlzIGEgbmV3IHJlbGVhc2Ug b2YgQnJyIGFuZCBOb3RlLiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2VycmF0aXF1ZS5jaC9z b2Z0d2FyZS9icnIiPkJycjwvYT4gaXMgYW4gSVNDIGxpY2VuY2VkIHRvb2xraXQgZm9yIHByb2dy YW1taW5nIGJyb3dzZXJzIHdpdGggdGhlIGpzX29mX29jYW1sIGNvbXBpbGVyLg0KPGEgaHJlZj0i aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvbm90ZSI+Tm90ZTwvYT4gaXMgYW4gZXhwZXJp bWVudGFsIElTQyBsaWNlbnNlZCBsaWJyYXJ5IGZvciBmdW5jdGlvbmFsIHJlYWN0aXZlIHByb2dy YW1taW5nLg0KPC9wPg0KPHA+SWYgZmluYWxseSBnb3QgdG8gc3BsaXQgYXdheSB0aGUgTm90ZSBG UlAgc3R1ZmYgZnJvbSBCcnIuIFRoZSA8Y29kZT5icnI8L2NvZGU+IHBhY2thZ2UgdGhlcmVmb3Jl IG5vIGxvbmdlciBkZXBlbmRzIG9uIHRoZQ0KPGNvZGU+bm90ZTwvY29kZT4gcGFja2FnZS4gSWYg eW91IHVzZWQgdGhlIDxjb2RlPmJyci5ub3RlPC9jb2RlPiBsaWJyYXJ5IGl0IG5vdyBsaXZlcyBp bg0KPGNvZGU+bm90ZS5icnI8L2NvZGU+LiBBY2NvcmRpbmdseSB0aGUgdG9wbGV2ZWwgbW9kdWxl IG5hbWVzIHdlcmUgY2hhbmdlZCBmcm9tIDxjb2RlPg0KQnJyX25vdGUqPC9jb2RlPiB0byA8Y29k ZT5Ob3RlX2Jycio8L2NvZGU+LiA8L3A+DQo8cD5BbW9uZyBvdGhlciB0aGluZ3MsIHRoZSBCcnIg cmVsZWFzZSBhbHNvIGJyaW5ncyBhIHJldmFtcGVkIDxjb2RlPlVyaTwvY29kZT4gbW9kdWxlIHdo aWNoIHdhcw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2Jyci9pc3N1ZXMv NTAiPmEgYml0IGJyb2tlbjwvYT4uIEhhdmUgYSBsb29rIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2RidWVuemxpL2Jyci9ibG9iL21hc3Rlci9DSEFOR0VTLm1kI3YwMDYtMjAyMy0w Ny0yOS16YWdyZWIiPg0KcmVsZWFzZSBub3RlczwvYT4gYmVmb3JlIHVwZ3JhZGluZyBpZiB5b3Ug YXJlIHVzaW5nIGl0LiBUaGFua3MgdG8gTWF4IExhbmcgZm9yIG5vdGljaW5nIGFuZCBoZWxwaW5n IHRvIGZpeCB0aGF0Lg0KPC9wPg0KPHA+QmVzdCwgPC9wPg0KPHA+RGFuaWVsIDwvcD4NCjxwPkEg YmlnIHRoYW5rcyB0byBteSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvZGJ1 ZW56bGkiPmRvbmF0b3JzPC9hPi4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5I aWxpdGUgMC4zLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1o aWxpdGUtMC0zLTAvMTI3MjMvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1oaWxp dGUtMC0zLTAvMTI3MjMvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnMDNmYmY2NiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzAzZmJmNjYi PlBhdHJpY2sgRmVycmlzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnMDNmYmY2NiI+DQo8cD5IYXBweSB0byBhbm5vdW5jZSBhIG5ldyByZWxl YXNlIG9mIDxjb2RlPmhpbGl0ZTwvY29kZT4sIGEgc21hbGwgbGlicmFyeSB0byBwZXJmb3JtIGJ1 aWxkLXRpbWUgc3ludGF4IGhpZ2hsaWdodGluZyBvZiBzb21lDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vcGF0cmljb2ZlcnJpcy9oaWxpdGUvYmxvYi8zNDhjNzZhMGZhYWYyYWRkZmU1ZWUw YzY1N2UwMDdkM2Q5ZGY0MjU0L3NyYy9tZC5tbCNMMSI+DQpjb21tb24gKGluIHRoZSBPQ2FtbCB3 b3JsZCkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzPC9hPi4gSGlsaXRlIHBlcmZvcm1zIHRoZSBzeW50 YXggaGlnaGxpZ2h0aW5nIG9uIE9DYW1sLm9yZyAoc2VlIGZvciBleGFtcGxlDQo8YSBocmVmPSJo dHRwczovL29jYW1sLm9yZy9kb2NzL2xpc3RzIj5odHRwczovL29jYW1sLm9yZy9kb2NzL2xpc3Rz PC9hPikuIEl0IGhhcyBhIHVzZWZ1bA0KPGNvZGU+SGlsaXRlLk1kLnRyYW5zZm9ybTwvY29kZT4g ZnVuY3Rpb24gd2hpY2ggd2lsbCByZXdyaXRlIGNvZGUgYmxvY2tzIGZvciB5b3UgKGkuZS4NCjxj b2RlPnRyYW5zZm9ybSA6IE9tZC5kb2MgLSZndDsgT21kLmRvYzwvY29kZT4pLiBJIG1heSwgaW4g dGhlIG5vdCB0b28gZGlzdGFudCBmdXR1cmUsIGRyb3ANCjxjb2RlPk9tZDwvY29kZT4gaW4gZmF2 b3VyIG9mIDxjb2RlPkNtYXJraXQ8L2NvZGU+LiA8L3A+DQo8cD5IYXBweSBoaWdobGlnaHRpbmcg OmNhbWVsOiA6YXJ0OiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+aHRtbGl0IDAu MS4wIOKAkyBIVE1MIGdlbmVyYXRpb24gY29tYmluYXRvcnMgZm9yIE9DYW1sPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taHRtbGl0LTAtMS0wLWh0bWwtZ2VuZXJh dGlvbi1jb21iaW5hdG9ycy1mb3Itb2NhbWwvMTI3MjQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWh0bWxpdC0wLTEtMC1odG1sLWdlbmVyYXRpb24tY29tYmluYXRvcnMtZm9y LW9jYW1sLzEyNzI0LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzFjOTMwOGQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxYzkzMDhkIj5E YW5pZWwgQsO8bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzFjOTMwOGQiPg0KPHA+SeKAmWQgbGlrZSB0byBhbm5vdW5jZSB0aGUgZmly c3QgcmVsZWFzZSBvZiA8YSBocmVmPSJodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9odG1s aXQiPg0KaHRtbGl0PC9hPiAoPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUv aHRtbGl0L2RvYy8iPmRvY3M8L2E+KTogPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5IdG1saXQgaXMg YW4gT0NhbWwgbGlicmFyeSBwcm92aWRpbmcgc2ltcGxlIGJ1dCBzdWJ0bGUgY29tYmluYXRvcnMg Zm9yIGdlbmVyYXRpbmcgSFRNTCBmcmFnbWVudHMgYW5kIHBhZ2VzLg0KPC9wPg0KPHA+SHRtbGl0 IGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBJU0MgbGljZW5zZS4gSXQgaGFzIG5vIGRlcGVuZGVu Y2llcy4gPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+SW5zdGFsbDogPGNvZGU+b3BhbSBpbnN0YWxs IGh0bWxpdDwvY29kZT4gKG9uY2UgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0tcmVwb3NpdG9yeS9wdWxsLzI0MTgwIj4NCnRoaXMgUFI8L2E+IGlzIG1lcmdlZCkuIDwvcD4N CjxwPkJlc3QsIDwvcD4NCjxwPkRhbmllbCA8L3A+DQo8cD5BIGJpZyB0aGFua3MgdG8gbXkgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpIj5kb25hdG9yczwvYT4u DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzQz YTY3MiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc0M2E2NzIiPmp1bXBuYnJvd253 ZWFzZWwgYXNrZWQgYW5kIERhbmllbCBCw7xuemxpIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc0M2E2NzIiPg0KPGJsb2NrcXVvdGU+DQo8cD5I b3cgd291bGQgeW91IGNvbXBhcmUgSHRtbGl0IHRvIHR5eG1sLCA8L3A+DQo8L2Jsb2NrcXVvdGU+ DQo8cD5IdG1saXQgZG9lcyBub3QgdHJ5IHRvIHR5cGUgeW91ciBIVE1MLiBUbyBnZXQgYSBnb29k IGNvbXBvc2l0aW9uYWxpdHkgc3RvcnksIGl0IGRvZXMgYSBmZXcgdHJpY2tzIG9uDQo8Y29kZT5j bGFzczwvY29kZT4gYW5kIDxjb2RlPnN0eWxlPC9jb2RlPiBhdHRyaWJ1dGUgc3BlY2lmaWNhdGlv bnMgYW5kIHN1cHBvcnRzIGRpcmVjdCBmcmFnbWVudCBzcGxpY2luZyBpbiBlbGVtZW50IGNoaWxk cmVucy4NCjwvcD4NCjxwPjxjb2RlPnR5eG1sPC9jb2RlPiB0cmllcyB0byB0eXBlIHlvdXIgSFRN TCB3aGljaCBJIGZpbmQgdG90YWxseSB1bnVzYWJsZSBpbiBwcmFjdGljZS4gSSB0cmllZCB0aGUN Cjxjb2RlPnR5eG1sPC9jb2RlPiBhcHByb2FjaCBkdXJpbmcgc29tZSB0aW1lIGluIGZpcnN0IGRl Y2FkZSBvZiB0aGUgY2VudHVyeSBhZnRlciBAdGhvbWVnYQ0KPGEgaHJlZj0iaHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vMjAwMy4wNS4wNi5odG1sIzEiPmNhbWUgdXA8L2E+IHdpdGgg dGhlIHRlY2huaXF1ZSB0d2VudHkgeWVhcnMgYWdvLg0KPC9wPg0KPHA+SSBtb3ZlZCBhd2F5IGZy b20gaXQgcXVpdGUgcXVpY2tseSB0byBwcmVmZXIgdG8gdHJlYXQgSFRNTCBhcyBhbiB1bnR5cGVk IGFzc2VtYmx5IGxhbmd1YWdlIHJhdGhlciB0aGFuIHRyeSB0byBwdXQgbGlwc3RpY2sgb24gYSBw aWcuIEluIG15IG9waW5pb24gdGhlIHRlY2huaXF1ZSBoYXMgdGVycmlibGUgdHlwZSBhbmQgcmVm YWN0b3JpbmcgdXNhYmlsaXR5IGFuZCBzdGlsbCBkb2VzbuKAmXQgcHJldmVudCB5b3Ugb2YgZ2Vu ZXJhdGluZyBpbnZhbGlkDQogSFRNTCAoZS5nLiBubyBndWFyYW50ZWUgb24gaWQgdW5pcXVlbmVz cykuIEhvbmVzdGx5IHdoZW4geW91IGFyZSBkZWFsaW5nIHdpdGggdGhlIHdlYiwgZ2VuZXJhdGlu ZyB2YWxpZCBIVE1MIGlzIHRoZSBsZWFzdCBvZiB5b3VyIHByb2JsZW0uDQo8L3A+DQo8YmxvY2tx dW90ZT4NCjxwPndoYXQgd2FzIHRoZSBtb3RpdmF0aW9uIGZvciBjcmVhdGluZyBIdG1saXQ/IDwv cD4NCjwvYmxvY2txdW90ZT4NCjxwPlRoYXQgd2FzIGEgbG9uZyB0aW1lIGFnbzsgdGhlIGNvcHly aWdodCBzYXlzIDIwMTYgYnV0IEnigJltIHByZXR0eSBzdXJlIEkgdXNlZCB0aGF0IGluIHNvbWUg bW9yZSBwcmltaXRpdmUgZm9ybSBtdWNoIGJlZm9yZS4gVGhlIG1vdGl2YXRpb24gaXMgaW4gdGhl IHN1bW1hcnk6IHRvIGhhdmUgYSBzaW1wbGUgYW5kIHVzYWJsZSBsaWJyYXJ5IGZvciBnZW5lcmF0 aW5nIEhUTUwgZnJhZ21lbnRzIG9yIHBhZ2VzIHRvIHNlbmQgb3ZlciB0aGUgd2lyZQ0KIG9yIHN0 b3JlIG9uIHlvdXIgZmlsZSBzeXN0ZW0uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEwIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MTAiPmZvcmVzdGVyIDIuMi4xIHJlbGVhc2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZm9yZXN0ZXItMi0yLTEtcmVsZWFzZS8xMjcyOC8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZm9yZXN0ZXItMi0yLTEtcmVsZWFzZS8xMjcyOC8xPC9h PiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZjN2M3ZmUiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmYzdjN2ZlIj5Kb24gU3RlcmxpbmcgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmYzdjN2Zl Ij4NCjxwPkkgd291bGQgbGlrZSB0byBhZHZlcnRpc2UgdGhlIHJlbGVhc2Ugb2YgRm9yZXN0ZXIg Mi4yLjEgb24gb3BhbSwgd2hpY2ggaXMgYW4gT0NhbWwgdXRpbGl0eSB0byBkZXZlbG9wIOKAnEZv cmVzdHPigJ0sIHdoaWNoIGFyZSBkZW5zZWx5IGludGVybGlua2VkIG1hdGhlbWF0aWNhbCB3ZWJz aXRlcyAvIFpldHRlbGvDpHN0ZW4gc2ltaWxhciB0byB0aGUgU3RhY2tzIFByb2plY3Qgb3IgS2Vy b2Rvbi4gQW4gZXhhbXBsZSBvZiBhIOKAnEZvcmVzdOKAnSBpcyBteQ0KPGEgaHJlZj0iaHR0cHM6 Ly93d3cuam9ubXN0ZXJsaW5nLmNvbS8iPm93biB3ZWJzaXRlPC9hPi4gPC9wPg0KPHA+UGFja2Fn ZTogPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLTUub2NhbWwub3JnL3BhY2thZ2VzL2ZvcmVzdGVyLyI+ aHR0cHM6Ly9vcGFtLTUub2NhbWwub3JnL3BhY2thZ2VzL2ZvcmVzdGVyLzwvYT4NCjwvcD4NCjxw PkZvcmVzdGVyIGlzIHBvdGVudGlhbGx5IG9mIHRlY2huaWNhbCBpbnRlcmVzdCB0byB0aGlzIGNv bW11bml0eSBhcyBpdCBtYWtlcyB1c2Ugb2YgbmV3IE9DYW1sIDUgZmVhdHVyZXMgbGlrZSBlZmZl Y3QgaGFuZGxlcnMsIGFzIHdlbGwgYXMgY2VydGFpbiBmdW5jdGlvbnMgZnJvbQ0KPGNvZGU+ZG9t YWluc2xpYjwvY29kZT4uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTExIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTEiPk11bHRp Y29yZSBsaWJyYXJpZXM6IG5ldyByZWxlYXNlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1tdWx0aWNvcmUtbGlicmFyaWVzLW5ldy1yZWxlYXNlcy8xMjczNC8x Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbXVsdGljb3JlLWxpYnJhcmllcy1u ZXctcmVsZWFzZXMvMTI3MzQvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdhYmZhYjRiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYWJmYWI0 YiI+U3VkaGEgUGFyaW1hbGEgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmdhYmZhYjRiIj4NCjxwPkhpIGV2ZXJ5b25lISBJ4oCZbSBoYXBweSB0 byBzaGFyZSB1cGRhdGVzIG9uIG5ldyByZWxlYXNlcyBvZiBtdWx0aWNvcmUgbGlicmFyaWVzLg0K PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDctMDctbWFraW5nLW9jYW1s LTUtc3VjY2VlZC1mb3ItZGV2ZWxvcGVycy1hbmQtb3JnYW5pc2F0aW9ucy8iPg0KS0PigJlzIGJs b2cgcG9zdDwvYT4gcHJvdmlkZXMgYW4gZXhjZWxsZW50IG92ZXJ2aWV3IG9mIHRoZSBiaWcgcGlj dHVyZSBhbmQgaG93IHRoZSBkZXZlbG9wbWVudHMgaW4gdGhlIGNvbXBpbGVyLCBsaWJyYXJpZXMg YW5kIHRvb2xpbmcgZml0IHRvZ2V0aGVyLg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc2NDNlMjE0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNjQz ZTIxNCI+U2F0dXJuIGFuZCBTYXR1cm5fbG9ja2ZyZWUgKDAuNC4wKTwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNjQzZTIxNCI+DQo8cD5J4oCZbSBkZWxpZ2h0 ZWQgdG8gcHJlc2VudCB0byBteSBmZWxsb3cgY2FtbGVycyA8YSBocmVmPSJodHRwczovL29wYW0u b2NhbWwub3JnL3BhY2thZ2VzL3NhdHVybi8iPg0KU2F0dXJuPC9hPiBhbmQgPGEgaHJlZj0iaHR0 cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9zYXR1cm5fbG9ja2ZyZWUvc2F0dXJuX2xvY2tm cmVlLjAuNC4wLyI+DQpTYXR1cm5fbG9ja2ZyZWU8L2E+LCBub3cgYXZhaWxhYmxlIGluIG9wYW0t cmVwb3NpdG9yeS4gU2F0dXJuIGlzIHRoZSBuZXcgYWx0ZXIgZWdvIG9mIG91ciBvbGQgZnJpZW5k DQo8YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL2xvY2tmcmVlLyI+bG9j a2ZyZWU8L2E+LiBTYXR1cm4gKGFuZCBpdHMgc3ViLWxpYnJhcmllcykgc3Vic3VtZSBsb2NrZnJl ZSwgYW5kIGFpbSB0byBiZSBhIGNvbGxlY3Rpb24gb2YgcGFyYWxsZWxpc20tc2FmZSBkYXRhIHN0 cnVjdHVyZXMgZm9yIE9DYW1sIDUuDQo8Y29kZT5TYXR1cm5fbG9ja2ZyZWU8L2NvZGU+IHByb3Zp ZGVzIGEgc2V0IG9mIGxvY2tmcmVlIGRhdGEgc3RydWN0dXJlcyB0aGF0IGFyZSB3ZWxsIHRlc3Rl ZC4gRnVydGhlcm1vcmUsDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv cHVsbC8xMjIxMiI+Y2FjaGUtYWxpZ25lZCBhdG9taWNzPC9hPiByZWNlbnRseSBsYW5kZWQgb24g dHJ1bmsgT0NhbWwsIHdoaWNoIG9wZW5zIHVwIGV4Y2l0aW5nIHBvc3NpYmlsaXRpZXMgdG8gZXhw bG9yZSBmb3IgbG9jay1mcmVlIGFsZ29yaXRobXMuDQo8L3A+DQo8cD5UaGUgcmVuYW1pbmcgc3Rl bXMgZnJvbSBhIGRlc2lyZSB0byBleHBhbmQgdGhlIHNjb3BlIG9mIHRoZSBsaWJyYXJ5IHRvIGJl IG1vcmUgdGhhbiBqdXN0IGxvY2tmcmVlLiBFc3NlbnRpYWxseSBhIGRhdGEtc3RydWN0dXJlIGNh biBiZSBibG9ja2luZywgbG9jay1mcmVlIG9yIHNvbWV0aW1lcyBwYXJ0aWFsbHkgbG9jay1mcmVl ICggYW5kIG5vdCBkZWZpbmVkIGluIG90aGVyIHRpbWVzKS4gV2UgcmFuIGludG8gaW50cmlndWlu ZyBxdWVzdGlvbnMNCiBzdWNoIGFzIOKAnFdoZW4gaXMgYSBzdHJ1Y3R1cmUgbG9jay1mcmVlLCBy ZWFsbHk/4oCdIGluIHRoZSBwcm9jZXNzIG9mIGRldmVsb3BpbmcgdGhlbS4NCjwvcD4NCjxwPkNv bnNpZGVyaW5nIHRoZSBwZXJzcGVjdGl2ZSBvZiBhIHVzZXIgb2YgcGFyYWxsZWxpc20tc2FmZSBk YXRhIHN0cnVjdHVyZXMsIHdoZXRoZXIgdGhleSBhcmUgdHJhbnNpdGlvbmluZyB0aGVpciBsaWJy YXJpZXMgdG8gT0NhbWwgNSBvciBidWlsZGluZyBzb21ldGhpbmcgZnJvbSBzY3JhdGNoLCBpdOKA mXMgcmVhc29uYWJsZSB0byBhc3N1bWUgdGhhdCB0aGVpciBwcmltYXJ5IGNvbmNlcm5zIHdvdWxk IGJlIHRoZSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UNCiBvZiB0aGVzZSBzdHJ1Y3R1cmVz LCByYXRoZXIgdGhhbiB0aGUgbml0dHktZ3JpdHRpZXMgb2YgPGEgaHJlZj0iaHR0cHM6Ly9lbi53 aWtpcGVkaWEub3JnL3dpa2kvTm9uLWJsb2NraW5nX2FsZ29yaXRobSI+DQpwcm9ncmVzcyBjb25k aXRpb25zPC9hPi4gVGhlc2Ugc3RydWN0dXJlcyBhcmUgbW9kZWwtY2hlY2tlZCBhbmQgaGF2ZSBh IGdvb2Qgc2V0IG9mIHByb3BlcnR5IGJhc2VkIHRlc3RzLiBUaGV5IGhhdmUgc29tZSBiZW5jaG1h cmtzIHdpdGggbW9yZSBvbiB0aGUgd2F5LiBTYXR1cm4gYWltcyB0byBiZSBhIGNvbGxlY3Rpb24g b2YgcmVsaWFibGUgYW5kIHBlcmZvcm1hbnQgcGFyYWxsZWxpc20tc2FmZSBkYXRhIHN0cnVjdHVy ZXMuDQo8L3A+DQo8cD5BbW9uZ3N0IG90aGVyIHRoaW5ncywgU2F0dXJuIHdpbGwgaG9zdDogPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxvY2tmcmVlIHN0cnVjdHVyZXMgPC9saT48bGk+ Q29tcG9zYWJsZSBsb2NrZnJlZSBzdHJ1Y3R1cmVzIGZyb20gPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLW11bHRpY29yZS9rY2FzL3RyZWUvbWFpbi9zcmMva2Nhc19kYXRhIj4NCmtj YXNfZGF0YTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0RlbHRhQ3Vi ZTIzL211bHRpY2FtbERTIj5Mb2NrLWJhc2VkIHBhcmFsbGVsaXNtLXNhZmUgZGF0YSBzdHJ1Y3R1 cmVzPC9hPg0KPC9saT48L3VsPg0KPHA+VGhlIFJFQURNRSBoYXMgY29tcHJlaGVuc2l2ZSBkZXNj cmlwdGlvbnMgZm9yIHRoZSBhYm92ZS1tZW50aW9uZWQgaXRlbXMgKGFzIHdlbGwgYXMgbW9yZSBk ZXRhaWxzIGNvbWluZyBzb29uKS4gSGVyZSBpcyB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC1tdWx0aWNvcmUvc2F0dXJuL3JlbGVhc2VzL3RhZy8wLjQuMCI+Y2hhbmdlbG9n PC9hPi4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc3ZDUzMzk3IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnN2Q1MzM5NyI+RFNDaGVj ayAoMC4zLjApPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc3 ZDUzMzk3Ij4NCjxwPkRTQ2hlY2sgaXMgYW4gZXhwZXJpbWVudGFsIG1vZGVsIGNoZWNrZXIgZm9y IHRlc3RpbmcgY29uY3VycmVudCBwcm9ncmFtcy4gQ29uY3VycmVuY3kgYnVncyBjYW4gYmUgbm90 b3Jpb3VzbHkgaGFyZCB0byB0cmFjayBkb3duLiBEU2NoZWNrIGV4cGxvcmVzIHRoZSBwb3NzaWJs ZSBpbnRlcmxlYXZpbmdzIG9mIGNvbmN1cnJlbnQgcHJvZ3JhbXMsIHRoZXJlYnkgaGVscGluZyB1 cyBjYXRjaCBwb3RlbnRpYWwgYnVncyBlYXJseSBvbi4gSXQgbWFuYWdlcw0KIHRvIGRvIHRoaXMg YnkgYSBuZWF0IGNvbWJpbmF0aW9uIG9mIGV4cGxvcmluZyBicmFuY2hlcyBuZWVkcyB0byBiZSBl eHBsb3JlZCwgYW5kIG1vY2tpbmcgcGFyYWxsZWxpc20gd2l0aCBlZmZlY3QgaGFuZGxlcnMuDQo8 L3A+DQo8cD5DaGFuZ2Vsb2cgZm9yIHRoZSBsYXRlc3QgcmVsZWFzZSBpcyA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2RzY2hlY2svcmVsZWFzZXMvdGFnLzAuMi4w Ij4NCmhlcmU8L2E+LiBUaGUgbWFqb3IgaW1wcm92ZW1lbnQgdGhpcyByZWxlYXNlIGNvbnRhaW5z IGlzIHRoZSA8YSBocmVmPSJodHRwczovL3VzZXIuaXQudXUuc2UvfnBhcm9zaC9wdWJsaWNhdGlv bnMvcGFwZXJzL2phY20xNy5wZGYiPg0KU291cmNlIFNldHM8L2E+IGFwcHJvYWNoIGZvciBvcHRp bWFsIHJlZHVjdGlvbi4gVGhpcyBpcyBoYXMgaHVnZWx5IHJlZHVjZWQgdGhlIG51bWJlciBvZiBi cmFuY2hlcyB0byBleHBsb3JlIGluIHRoZSB0cmVlIG9mIHBvc3NpYmxlIGludGVybGVhdmluZ3Ms IGFuZCB0aGVyZWJ5IGltcHJvdmluZyB0aGUgcGVyZm9ybWFuY2UgYnkgYSBncmVhdCBtYXJnaW4u IFRoZSBuZXh0IHJlbGVhc2Ugd2lsbCBob3BlZnVsbHkgaW5jbHVkZQ0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9kc2NoZWNrL3B1bGwvMjIiPmdyYW51bGFyIGRl cGVuZGVuY3kgcmVsYXRpb248L2E+IGZvciB0aGUgRFBvUiBhbGdvcml0aG0sIHdoaWNoIGZ1cnRo ZXIgc3BlZWRzIHVwIHRoZSBkc2NoZWNrIHRlc3RzIGJ5IG92ZXIgNXguDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZGZjYTFhNyIgY2xhc3M9Im91 dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2RmY2ExYTciPkRvbWFpbnNsaWIgKDAuNS4xKTwvaDQ+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZGZjYTFhNyI+DQo8cD5Eb21h aW5zbGliIHByb3ZpZGVzIGVhc3kgd2F5cyB0byB3cml0ZSBuZXN0ZWQgcGFyYWxsZWwgcHJvZ3Jh bXMgaW4gT0NhbWwgNS4gQW1vbmdzdCBvdGhlciB0aGluZ3MsIHRoZQ0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9kb21haW5zbGliL3JlbGVhc2VzL3RhZy8wLjUu MSI+MC41LjEgcmVsZWFzZTwvYT4gc3VwcG9ydHMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1tdWx0aWNvcmUvZG9tYWluLWxvY2FsLWF3YWl0Ij5kb21haW4tbG9jYWwtYXdhaXQ8 L2E+IChETEEpLCBlbmFibGluZyBzbW9vdGggaW50ZXJvcGVyYWJpbGl0eSB3aXRoIG90aGVyIGxp YnJhcmllcyBzdXBwb3J0aW5nIERMQSBzdWNoIGFzIEVpbywgS2NhcywgTW9vbnBvb2wgYW5kIHNv IG9uLiBUaGlzIG9wZW5zIHVwIGludGVyZXN0aW5nIHBvc3NpYmlsaXRpZXMgdG8ganV4dGFwb3Nl IGRvbWFpbnNsaWINCiBmb3IgcGFyYWxsZWxpc20gYW5kIEVpbyBmb3IgSU8sIGluIHRoZSBzYW1l IGFwcGxpY2F0aW9uLiBGdXJ0aGVybW9yZSwgdGhpcyByZWxlYXNlIGluY2x1ZGVzIGENCjxjb2Rl PnBhcmFsbGVsX2ZpbmQ8L2NvZGU+IHdoaWNoIGhlbHBzIHByb3BhZ2F0ZSBleGNlcHRpb25zLiA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzQ4YTA1 ZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzM0OGEwNWUiPkVpbyAoMC4xMS4wKTwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMzQ4YTA1ZSI+DQo8 cD5UaGlzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvL3Jl bGVhc2VzL3RhZy92MC4xMSI+bmV3IHJlbGVhc2U8L2E+IGNvbnRhaW5zIGZlYXR1cmUgYWRkaXRp b25zIHN1Y2ggYXMgZXh0ZW5kaW5nDQo8Y29kZT5FaW8uQ29uZGl0aW9uPC9jb2RlPiwgcmVtb3Zp bmcgZGVwcmVjYXRlZCBmdW5jdGlvbnMgYW5kIGJ1ZyBmaXhlcy4gQXMgd2XigJlyZSBoZWFkaW5n IHRvd2FyZHMgYSAxLjAgcmVsZWFzZSBvZiBFaW8sIHdlIGhvcGUgdG8gc2hhcmUgbW9yZSBmcmVx dWVudCB1cGRhdGVzIG9uIEVpby4NCjwvcD4NCjxwPkluIHRhbmRlbSwgYSBudW1iZXIgb2YgYXBw bGljYXRpb25zIGFyZSBtaWdyYXRpbmcgdG8gRWlvIHRvIGV4cGxvaXQgT0NhbWwgNSBmZWF0dXJl cy4gWW91IGNhbiBmaW5kIG1hbnkgb2YgdGhlbSBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLW11bHRpY29yZS9hd2Vzb21lLW11bHRpY29yZS1vY2FtbCI+YXdlc29tZS1tdWx0 aWNvcmUtb2NhbWw8L2E+LiBGb3IgZm9sa3MgaW50ZXJlc3RlZCBpbiB0aGlzLCBAdGFsZXg1IGFu ZCBAam9ubHVkbGFtIGFyZSBydW5uaW5nIGEgdHV0b3JpYWwgYXQgSUNGUCBvbiB0aGUNCjxhIGhy ZWY9Imh0dHBzOi8vaWNmcDIzLnNpZ3BsYW4ub3JnL2RldGFpbHMvaWNmcC0yMDIzLXR1dG9yaWFs cy80L1BvcnRpbmctTHd0LWFwcGxpY2F0aW9ucy10by1PQ2FtbC01LWFuZC1FaW8iPg0Kc2FtZSBz dWJqZWN0PC9hPi4gPC9wPg0KPHA+SGFwcHkgaGFja2luZyEgOmNhbWVsOiA8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM3 Mjg0NWEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmczNzI4NDVhIj5PbGQgQ1dOPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmczNzI4NDVhIj4NCjxw PklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQg SeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8 YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVl ZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNl aXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0 cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8 L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnZDY2NDM3ZCI+DQo8cD48 YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 25 Jul 2023 09:47:10 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 25 Jul 2023 09:47:09 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 25 Jul 2023 09:47:09 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 36P8kS7Z008757 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 25 Jul 2023 09:46:28 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 36P8kEGs008732 for ; Tue, 25 Jul 2023 09:46:14 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Jul 2023 10:46:12 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 236DAE0138; Tue, 25 Jul 2023 10:46:12 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DBE7CE004E for ; Tue, 25 Jul 2023 10:46:01 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jul 2023 10:45:59 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id ADFF156069E; Tue, 25 Jul 2023 10:45:57 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZvtSZtHbHktXNhE6KGOVCm6qxPQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 25 Jul 2023 09:45:47 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: a8bfd0db-e37f-4021-10cf-08db8cebbbc3 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,230,1684792800"; d="scan'208,217";a="118957790" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.466565, queueID=7C9AC56069F x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <3054C80DDE935D4197F47650BB78B45C@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNy0yNSBUdWUgMTA6NDQgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDcuMTguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wOC4wMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bHkgMTggdG8gMjUsIDIwMjMuIDwvcD4N CjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJsZSBv ZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJk b2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+UHB4bGliIGRldiBtZWV0aW5nczwvYT4g PC9saT48bGk+PGEgaHJlZj0iIzIiPk9jYW1scyBzcG90dGVkIGluIHRoZSB3aWxkPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjMyI+RGtNTCAyLjAuMCBQcmV2aWV3IFJlbGVhc2U8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM0Ij5OZXh0IHByaW9yaXR5IGZvciBPQ2FtbD88L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiM1Ij5FeHBsb3JhdGlvbnMgb24gUGFja2FnZSBNYW5hZ2VtZW50IGluIER1bmU8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiM2Ij5PQ2FtbEZvcm1hdCAwLjI2LjA8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiM3Ij5UYXJpZGVzIE9mZmljZSBIb3VyczogQmVuY2htYXJrIFRvb2xpbmc8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM4Ij5Zb3UgQ2FuIEF0dGVuZCB0aGUgTmV3IE9DYW1sLm9yZyBDb21tdW5p dHkgTWVldGluZ3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5ldWxlciwgYW4gYXJpdGhtZXRp YyBsaWJyYXJ5IGZvciBuYXRpdmUgaW50ZWdlcnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+ RGtNTCBJbnN0YWxsIEFQSSAwLjQuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5MaXF1aWRz b2FwIDIuMi4wIGlzIG91dCEg8J+OiTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEyIj5rY2FzIGFu ZCBrY2FzX2RhdGEgMC42LjE6IFNUTSBhbmQgY29tcG9zaXRpb25hbCBsb2NrLWRyZWUgZGF0YSBz dHJ1Y3R1cmVzPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzEzIj5jdHlwZXMgMC4yMS4xLCBub3cg d2l0aCBkdW5lIHN1cHBvcnQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxNCI+QW5ub3VuY2luZyB0 aGUgb2NhbWwtd2FzbSBvcmdhbmlzYXRpb248L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxNSI+RmVl ZGJhY2sgTmVlZGVkOiBOZXcg4oCcQXJyYXlz4oCdIFR1dG9yaWFsIG9uIE9DYW1sLm9yZzwvYT4g PC9saT48bGk+PGEgaHJlZj0iI29yZzYzOTkyZTQiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iMSI+UHB4bGliIGRldiBtZWV0aW5nczwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5ncy8xMjQ0MS81Ij5odHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1tZWV0aW5ncy8xMjQ0MS81PC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwZTliMWI3IiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMGU5YjFiNyI+Q29udGludWluZyB0aGlzIHRocmVhZCwg U29uamEgSGVpbnplIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnMGU5YjFiNyI+DQo8cD5IZXJlIGFyZSB0aGUgbWVldGluZyBub3RlcyBvZiB0 aGUgSnVseSBtZWV0aW5nOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L3Bw eGxpYi93aWtpL0Rldi1tZWV0aW5nLTE4LTA3LTIwMjMiPg0KaHR0cHM6Ly9naXRodWIuY29tL29j YW1sLXBweC9wcHhsaWIvd2lraS9EZXYtbWVldGluZy0xOC0wNy0yMDIzPC9hPiA8L3A+DQo8cD5B cyBhIGhlYWRzLXVwOiBUaGVyZSB3b27igJl0IGJlIGEgbWVldGluZyBpbiBBdWd1c3QsIHNvIHRo ZSBuZXh0IG9uZSB3aWxsIGJlIGluIFNlcHRlbWJlci4gSGF2ZSBhIG5pY2Ugc3VtbWVyL3dpbnRl ci9vdGhlciBzZWFzb24gZXZlcnlvbmUhIDopDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMiI+T2NhbWxzIHNwb3R0ZWQgaW4gdGhlIHdpbGQ8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29jYW1scy1zcG90dGVkLWluLXRoZS13aWxkLzEyNjQxLzEiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1scy1zcG90dGVkLWluLXRoZS13aWxkLzEyNjQx LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTQzMTRl MCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U0MzE0ZTAiPlRob3JzdGVuIE9obCBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2U0 MzE0ZTAiPg0KPHA+SGVyZeKAmXMgYSBwYXBlciBvbiBhbGdvcml0aG1zIGZvciB0aGVvcmV0aWNh bCBwYXJ0aWNsZSBwaHlzaWNzIHJlZmVycmluZyB0byBvY2FtbCBwdWJsaXNoZWQgdG9kYXk6DQo8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2xpbmsuc3ByaW5nZXIuY29tL2FydGljbGUvMTAuMTE0 MC9lcGpjL3MxMDA1Mi0wMjMtMTE3ODctMiI+RnVuY3Rpb25hbCBkaXJlY3RlZCBhY3ljbGljYWwg Z3JhcGhzIGZvciBzY2F0dGVyaW5nIGFtcGxpdHVkZXMgaW4gcGVydHVyYmF0aW9uIHRoZW9yeTwv YT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3 OTQ0MjlmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNzk0NDI5ZiI+Z2FzY2hlIHRo ZW4gYWRkZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc5 NDQyOWYiPg0KPHA+SXQgbG9va3MgbGlrZSB0aGlzIHBhcGVyIGJ1aWxkcyBvbiBwcmV2aW91cyB3 b3JrIGltcGxlbWVudGluZyBhIHRvb2wgY2FsbGVkIE9tZWdhIGluIE9DYW1sLCB3aGljaCBoYXMg YmVlbiBhcm91bmQgc2luY2UgMjAwMToNCjwvcD4NCjxwPk/igJlNZWdhOiBBbiBPcHRpbWl6aW5n IE1hdHJpeCBFbGVtZW50IEdlbmVyYXRvcjxicj4NCk1hdXJvIE1vcmV0dGksIFRob3JzdGVuIE9o bCwgSsO8cmdlbiBSZXV0ZXIsIDIwMDE8YnI+DQo8YSBocmVmPSJodHRwczovL2FyeGl2Lm9yZy9h YnMvaGVwLXBoLzAxMDIxOTUiPmh0dHBzOi8vYXJ4aXYub3JnL2Ficy9oZXAtcGgvMDEwMjE5NTwv YT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5Ea01MIDIuMC4wIFByZXZpZXcg UmVsZWFzZTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRrbWwt Mi0wLTAtcHJldmlldy1yZWxlYXNlLzEyNjQyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1ka21sLTItMC0wLXByZXZpZXctcmVsZWFzZS8xMjY0Mi8xPC9hPiA8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzcxYWZlYTMiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmc3MWFmZWEzIj5qYmVja2ZvcmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3MWFmZWEzIj4NCjxwPlRoZXJlIGFy ZSBzZXZlcmFsIG1ham9yIGNoYW5nZXMgaW4gdmVyc2lvbiAyLjAuMCBvZiBEa01MLCBhIE9DYW1s IGRpc3RyaWJ1dGlvbiB0aGF0IHVzZXMgVmlzdWFsIFN0dWRpbyBvbiBXaW5kb3dzLiBGdWxsIERr TUwgMi4wLjAgUmVsZWFzZSBOb3RlcyBhcmUgYXZhaWxhYmxlLCBhbmQgdGhlIGluc3RhbGxlciBp cw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRsYWIuY29tL2Rpc2t1di1vY2FtbC9kaXN0cmlidXRpb25z L2RrbWwvLS9yZWxlYXNlcy8yLjAuMC9kb3dubG9hZHMvc2V0dXA2NHUuZXhlIj4NCmh0dHBzOi8v Z2l0bGFiLmNvbS9kaXNrdXYtb2NhbWwvZGlzdHJpYnV0aW9ucy9ka21sLy0vcmVsZWFzZXMvMi4w LjAvZG93bmxvYWRzL3NldHVwNjR1LmV4ZTwvYT4uDQo8L3A+DQo8cD5Db25zaWRlciAyLjAuMCBh IHByZXZpZXcgcmVsZWFzZS4gSWYgeW91IGFyZSByaXNrLWF2ZXJzZSB5b3UgbWF5IHdhbnQgdG8g d2FpdCBmb3IgMi4wLjEuDQo8L3A+DQo8cD5Ea01MIDIuMC4wIFJlbGVhc2UgTm90ZXM6IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYtb2NhbWwvZGlzdHJpYnV0aW9ucy9ka21sLy0v cmVsZWFzZXMjMi4wLjAiPg0KaHR0cHM6Ly9naXRsYWIuY29tL2Rpc2t1di1vY2FtbC9kaXN0cmli dXRpb25zL2RrbWwvLS9yZWxlYXNlcyMyLjAuMDwvYT4gPC9wPg0KPHA+PGI+QnJlYWtpbmcgY2hh bmdlPC9iPjogVGhlIGdsb2JhbCBlbnZpcm9ubWVudCAod2hlcmUgeW91IGNhbiBydW4gPGNvZGU+ ZHVuZTwvY29kZT4sDQo8Y29kZT51dG9wPC9jb2RlPiwgPGNvZGU+b2NhbWxvcHQ8L2NvZGU+IGFu ZCBhIGZldyBvdGhlciBjcml0aWNhbCBPQ2FtbCBleGVjdXRhYmxlcyB3aXRob3V0IGhhdmluZyB0 byBpbnN0YWxsIHlvdXIgb3duIG9wYW0gc3dpdGNoKSBoYXMgY2hhbmdlZCBzaWduaWZpY2FudGx5 LiBbRGtNTCAyLjAuMCBSZWxlYXNlIE5vdGVzXSBkZXNjcmliZXMgdGhvc2UgY2hhbmdlcyBpbiBk ZXRhaWwuDQo8L3A+DQo8cD5XaHkgZG8gdGhpcyBicmVha2luZyBjaGFuZ2U/IDwvcD4NCjxvbCBj bGFzcz0ib3JnLW9sIj4NCjxsaT4yLjAuMCYjNDM7IGluc3RhbGxhdGlvbnMgYXJlIGZhc3RlciBi ZWNhdXNlIHRoZSBnbG9iYWwgZXhlY3V0YWJsZXMgZG8gbm90IGhhdmUgdG8gYmUgY29tcGlsZWQu DQo8L2xpPjxsaT5JdCBnZXRzIHRoZSBEa01MIGRpc3RyaWJ1dGlvbiB2ZXJ5IGNsb3NlIHRvIGhh dmluZyBhIGxpdGUg4oCcYnl0ZWNvZGUgb25seeKAnSBpbnN0YWxsZXIgdGhhdCBkb2VzIG5vdCBu ZWVkIHRvIGluc3RhbGwgKGhlYXZ5ISkgVmlzdWFsIFN0dWRpbywgTVNZUzIgYW5kIEdpdC4NCjxp PlRoaXMgdXBjb21pbmcgbGl0ZSBpbnN0YWxsZXIgY291bGQgYmUgYSBnb29kIGZpdCBmb3IgZWR1 Y2F0aW9uYWwgc2V0dGluZ3MsIHNvIGZlZWRiYWNrIGZyb20gZWR1Y2F0b3JzIGlzIGFwcHJlY2lh dGVkLjwvaT4NCjwvbGk+PC9vbD4NCjxwPk1ham9yIG5vbi1icmVha2luZyBjaGFuZ2VzOiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIGRlcHJlY2F0ZWQgPGNvZGU+ZmRvcGVuPC9j b2RlPiByZXBvc2l0b3J5IGlzIG5vIGxvbmdlciB1c2VkLiBQcmV2aW91c2x5IERrTUwgaW5zdGFs bGVkIGEgc21hbGxlciBhbmQgc21hbGxlciBwb3J0aW9uIG9mIHRoZQ0KPGNvZGU+ZmRvcGVuPC9j b2RlPiByZXBvc2l0b3J5IHdpdGggZWFjaCBzdWJzZXF1ZW50IHZlcnNpb24uIE5vdyBEa01MIDIu eC54IHJlbGllcyBvbmx5IG9uIHRoZSBjZW50cmFsIG9wYW0gcmVwb3NpdG9yeSBhbmQgdGhlIERr TUwgb3BhbSByZXBvc2l0b3J5Lg0KPC9saT48bGk+RHVuZSB1cGdyYWRlZCB0byAzLjguMy4gQW1v bmcgb3RoZXIgdGhpbmdzLCB0aGUgaW5zdGFsbGVyIG5vIGxvbmdlciBpbnN0YWxscyBhIEMjIGZp bGUgd2F0Y2hlciBwcm94eSBmb3INCjxjb2RlPmR1bmUgYnVpbGQgLXc8L2NvZGU+OyBpbnN0ZWFk IER1bmUgdXNlcyBpdHMgb3duIG5hdGl2ZSBXaW5kb3dzIGZpbGUgd2F0Y2hlci4NCjwvbGk+PGxp PlRoZSBzZXQgb2YgcGlubmVkIHBhY2thZ2VzIGR1cmluZyBhIDxjb2RlPmRrbWwgaW5pdDwvY29k ZT4gbG9jYWwgc3dpdGNoIGhhcyBnb25lIGRvd24gZnJvbSBhcHByb3hpbWF0ZWx5IDQwMDAgdG8g MjAwLiBSYXRoZXIgdGhhbiBwaW5uaW5nIGVhY2ggcGFja2FnZSBpbiB0aGUgb3BhbSB1bml2ZXJz ZSB0byBhIGhldXJpc3RpY2FsbHktZGV0ZXJtaW5lZCB2ZXJzaW9uLCB3ZSBwaW4gb25seSBwYWNr YWdlcyB0aGF0IHdlIHN1Y2Nlc3NmdWxseQ0KIGJ1aWxkIG9uIFdpbmRvd3MuIDwvbGk+PGxpPlRo ZSBmb2xsb3dpbmcgcGFja2FnZXMgYXJlIGFjY2Vzc2libGUgYnkganVzdCB0eXBpbmcgPGNvZGU+ dXRvcDwvY29kZT4gd2l0aG91dCBpbnN0YWxsaW5nIGEgc3dpdGNoOg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90aGllcnJ5LW1hcnRpbmV6L3Jl ZmwjcmVhZG1lIj48Y29kZT5yZWZsPC9jb2RlPjwvYT4gcmVmbGVjdGlvbiBwYWNrYWdlDQo8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZ3JhcGhpY3MjcmVhZG1lIj48 Y29kZT5ncmFwaGljczwvY29kZT48L2E+IHBhY2thZ2UNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2UjcmVhZG1lIj48Y29kZT5iYXNlPC9jb2RlPjwv YT4gcGFja2FnZQ0KPC9saT48L3VsPg0KPC9saT48L3VsPg0KPHA+QnVnIGZpeGVzOiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIGluc3RhbGxlciBjYW4gbm93IHJlc3RhcnQgYWZ0 ZXIgYSBmYWlsZWQgaW5zdGFsbGF0aW9uLCB3aXRob3V0IGhhdmluZyB0byB1c2UgdGhlIHVuaW5z dGFsbGVyLg0KPC9saT48bGk+QWxsb3cgc2V0dXAgdG8gc3VjY2VlZCBvbiBXaW5kb3dzIGZpbGVz eXN0ZW1zIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlIHNldHRpbmcgb2YgZmlsZSBhdHRyaWJ1dGVz DQo8L2xpPjxsaT5GbGV4RExMIG9iamVjdCBmaWxlcyA8Y29kZT5mbGV4ZGxsX2luaXRlcl9tc3Zj NjQub2JqPC9jb2RlPiBhbmQgPGNvZGU+ZmxleGRsbF9tc3ZjNjQub2JqPC9jb2RlPiAob3IgMzIt Yml0IHZhcmlhbnQgb24gMzItYml0IGluc3RhbGxzKSBhcmUgaW5zdGFsbGVkIGFsb25nc2lkZQ0K PGNvZGU+ZmxleGxpbmsuZXhlPC9jb2RlPiBzbyBmbGV4bGluayBjYW4gYmUgdXNlZCBieSBpdHNl bGYgd2l0aG91dCBzZXR0aW5nIDxjb2RlPg0KRkxFWERJUjwvY29kZT4gZW52aXJvbm1lbnQgdmFy aWFibGUuIDwvbGk+PC91bD4NCjxwPkNoYW5nZWQgcGFja2FnZXM6IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT4NCjxwPk1hbnkgcGFja2FnZXMgYXJlIHVwZ3JhZGVkLiBIZXJlIGlzIGEg c2FtcGxpbmcgb2YgdGhvc2UgdXBncmFkZXM6IDwvcD4NCjx0YWJsZSBib3JkZXI9IjIiIGNlbGxz cGFjaW5nPSIwIiBjZWxscGFkZGluZz0iNiIgcnVsZXM9Imdyb3VwcyIgZnJhbWU9ImhzaWRlcyI+ DQo8Y29sZ3JvdXA+PGNvbCBjbGFzcz0ib3JnLWxlZnQiPjxjb2wgY2xhc3M9Im9yZy1yaWdodCI+ PGNvbCBjbGFzcz0ib3JnLXJpZ2h0Ij48L2NvbGdyb3VwPg0KPHRoZWFkPg0KPHRyPg0KPHRoIHNj b3BlPSJjb2wiIGNsYXNzPSJvcmctbGVmdCI+UGFja2FnZTwvdGg+DQo8dGggc2NvcGU9ImNvbCIg Y2xhc3M9Im9yZy1yaWdodCI+RnJvbTwvdGg+DQo8dGggc2NvcGU9ImNvbCIgY2xhc3M9Im9yZy1y aWdodCI+VG88L3RoPg0KPC90cj4NCjwvdGhlYWQ+DQo8dGJvZHk+DQo8dHI+DQo8dGQgY2xhc3M9 Im9yZy1sZWZ0Ij5kdW5lPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4zLjYuMjwvdGQ+DQo8 dGQgY2xhc3M9Im9yZy1yaWdodCI+My44LjM8L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0i b3JnLWxlZnQiPnV0b3A8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQiPjIuMTAuMDwvdGQ+DQo8 dGQgY2xhc3M9Im9yZy1yaWdodCI+Mi4xMy4xPC90ZD4NCjwvdHI+DQo8dHI+DQo8dGQgY2xhc3M9 Im9yZy1sZWZ0Ij5wdGltZTwvdGQ+DQo8dGQgY2xhc3M9Im9yZy1yaWdodCI+MC44LjYtbXN2Y3N1 cHBvcnQ8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQiPjEuMS4wPC90ZD4NCjwvdHI+DQo8dHI+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5mbGV4ZGxsPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0 Ij4wLjQyPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4wLjQzPC90ZD4NCjwvdHI+DQo8dHI+ DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij5iYXNlPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij52 MC4xNS4xPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij52MC4xNi4xPC90ZD4NCjwvdHI+DQo8 dHI+DQo8dGQgY2xhc3M9Im9yZy1sZWZ0Ij55b2pzb248L3RkPg0KPHRkIGNsYXNzPSJvcmctcmln aHQiPjIuMC4yPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4yLjEuMDwvdGQ+DQo8L3RyPg0K PHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+c3RkY29tcGF0PC90ZD4NCjx0ZCBjbGFzcz0ib3Jn LXJpZ2h0Ij4mbmJzcDs8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQiPjE5JiM0MztvcHRhdXRv Y29uZjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmctbGVmdCI+bWV0YXBwPC90ZD4N Cjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4mbmJzcDs8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQi PjAuNC40JiM0Mzt3aW48L3RkPg0KPC90cj4NCjx0cj4NCjx0ZCBjbGFzcz0ib3JnLWxlZnQiPm9j YW1sZm9ybWF0PC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4wLjI0LjE8L3RkPg0KPHRkIGNs YXNzPSJvcmctcmlnaHQiPjAuMjUuMTwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+bHNwPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4xLjEyLjI8L3RkPg0KPHRkIGNs YXNzPSJvcmctcmlnaHQiPjEuMTYuMjwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJvcmct bGVmdCI+Y21kbGluZXI8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQiPjEuMS4xPC90ZD4NCjx0 ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4xLjIuMDwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNzPSJv cmctbGVmdCI+YWxjb3Rlc3Q8L3RkPg0KPHRkIGNsYXNzPSJvcmctcmlnaHQiPjEuNi4wPC90ZD4N Cjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4xLjcuMDwvdGQ+DQo8L3RyPg0KPHRyPg0KPHRkIGNsYXNz PSJvcmctbGVmdCI+b2NhbWxmaW5kPC90ZD4NCjx0ZCBjbGFzcz0ib3JnLXJpZ2h0Ij4xLjkuMTwv dGQ+DQo8dGQgY2xhc3M9Im9yZy1yaWdodCI+MS45LjU8L3RkPg0KPC90cj4NCjwvdGJvZHk+DQo8 L3RhYmxlPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzIwN2E1NjAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyMDdhNTYw Ij5sYXRlciBvbiwgamJlY2tmb3JkIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmcyMDdhNTYwIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzNlYzU5ODAiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczZWM1OTgwIj5E a01MIDIuMC4xPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcz ZWM1OTgwIj4NCjxwPlZlcnNpb24gMi4wLjEgaXMgYXZhaWxhYmxlIHdpdGggYW4gaW5zdGFsbGVy IGFuZCByZWxlYXNlIG5vdGVzIGF0IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNv bS9kaXNrdXYtb2NhbWwvZGlzdHJpYnV0aW9ucy9ka21sLy0vcmVsZWFzZXMvMi4wLjEiPmh0dHBz Oi8vZ2l0bGFiLmNvbS9kaXNrdXYtb2NhbWwvZGlzdHJpYnV0aW9ucy9ka21sLy0vcmVsZWFzZXMv Mi4wLjE8L2E+DQo8L3A+DQo8cD5JdHMgbWFpbiBuZXcgZmVhdHVyZSBpcyB0aGF0IHRoZSBPQ2Ft bCBwYWNrYWdlIDxjb2RlPnNxbGl0ZTM8L2NvZGU+IGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBnbG9i YWwgZW52aXJvbm1lbnQuIEV4YW1wbGVzIG9mDQo8Y29kZT5zcWxpdGUzPC9jb2RlPiBhcmUgaW4g dGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYtb2NhbWwvZGlzdHJpYnV0aW9u cy9ka21sI3F1aWNrLXN0YXJ0Ij4NClF1aWNrIFN0YXJ0PC9hPi4gPC9wPg0KPHA+SWYgeW91IGlu c3RhbGxlZCAyLjAuMCB5b3Ugc2hvdWxkIHVwZ3JhZGUgdG8gMi4wLjEgZm9yIHRoZSBidWcgZml4 ZXMuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPk5leHQgcHJpb3Jp dHkgZm9yIE9DYW1sPzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt NCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbmV4 dC1wcmlvcml0eS1mb3Itb2NhbWwvMTI1NjEvNjIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L25leHQtcHJpb3JpdHktZm9yLW9jYW1sLzEyNTYxLzYyPC9hPiA8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzY5MDY2NmYiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmc2OTA2NjZmIj5EZWVwIGluIHRoaXMgdGhyZWFkLCBnYXNjaGUgc2FpZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNjkwNjY2ZiI+DQo8cD5J IHdvdWxkIGJlIGhhcmQgcHJlc3NlZCB0byBtZW50aW9uIDxpPm9uZTwvaT4gcHJpb3JpdHkgZm9y IE9DYW1sLCBiZWNhdXNlIEkgdGhpbmsgdGhhdCBtYW55IHRoaW5ncyBhcmUgaW1wb3J0YW50IOKA kyBhbmQgaW1wb3J0YW50IGluIGRpZmZlcmVudCB3YXlzIGZvciBkaWZmZXJlbnQgcGVvcGxlLiBJ IHRob3VnaHQgdGhhdCBJIGNvdWxkIGdpdmUgc29tZSBpbmZvcm1hdGlvbiBvbiB3aGF0IHN1cHBv cnQgSSBoYXZlIGJlZW4gaW52b2x2ZWQgaW4sDQogZWl0aGVyIGFzIGEgY29tcGlsZXIgbWFpbnRh aW5lciBvciBhcyBhIG1lbWJlciBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1zZi5vcmcv Ij4NCk9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb248L2E+LCBvbiBzb21lIG9mIHRoZSB0b3BpY3Mg dGhhdCBoYXZlIGJlZW4gbWVudGlvbmVkIGhlcmUuDQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+TW9kdWxhciBpbXBsaWNpdHM6IHdl4oCZdmUgYmVlbiB0cnlpbmcgdG8gZmluZCBwZW9w bGUgd2UgY291bGQgZnVuZCB0byBtYWtlIHByb2dyZXNzIG9uIHRoaXMsIGJ1dCBpdCBpcyBkaWZm aWN1bHQg4oCTIGl0IHJlcXVpcmVzIGEgbG90IG9mIHR5cGUtc3lzdGVtIGV4cGVydGlzZSwgYW5k IHRpbWUuIFdlIGFyZSBmdW5kaW5nIGludGVybnNoaXBzIHdpdGggQHlhbGxvcCBpbiBDYW1icmlk Z2UgdG8gZXhwZXJpbWVudCB3aXRoIHRoZSBzeXN0ZW0sIGFuZA0KIEkgYW0gdGhpbmtpbmcgb2Yg Z2V0dGluZyBteSBoYW5kcyBkaXJ0eSBkdXJpbmcgdGhlIG5leHQgc2Nob29sIHllYXIgd2l0aCBz b21lIG1vZHVsZS1zaWRlIGltcGxlbWVudGF0aW9uIHdvcmsg4oCTIHBvc3NpYmx5IGRpdmluZyBp bnRvIHRoZSBQUnMgb2YgTWF0dGhldyBSeWFuLg0KPC9saT48bGk+VHlwZSBzeXN0ZW0gZm9yIGVm ZmVjdHM6IEkgaGF2ZSBkZWNpZGVkIHRvIHNldHVwIGFuIGluZm9ybWFsIHdvcmtpbmcgZ3JvdXAg Zm9yIHBlb3BsZSBpbnRlcmVzdGVkIGluIHdvcmtpbmcgb24gdGhpcyAobW9zdGx5IGFjYWRlbWlj cywgYWxzbyBKYW5lIFN0cmVldCkgdG8gZXhjaGFuZ2UgaW5mb3JtYXRpb24sIGFuZCBpbiBwYXJ0 aWN1bGFyIHRvIGRlY2lkZSBhIGNvbW1vbiBzZXQgb2YgZXZhbHVhdGlvbiBjcml0ZXJpYSDigJMg d2l0aCBjb21wYXRpYmlsaXR5DQogd2l0aCBleGlzdGluZyBub24tZWZmZWN0LXVzaW5nIE9DYW1s IGNvZGUgYXMgYSB0b3AgcHJpb3JpdHkuIEkgaG9wZSB0byBhbm5vdW5jZSBzb21ldGhpbmcgbW9y ZSBzdHJ1Y3R1cmVkIG5leHQgU2VwdGVtYmVyLCB3aXRoIHRoZSBhaW0gb2YgZ2V0dGluZyBhIGNs ZWFyZXIgaWRlYSBvZiBwb3RlbnRpYWwgZGVzaWduIHByb3Bvc2FscyBieSB0aGUgZW5kIG9mIHRo ZSBhY2FkZW1pYyB5ZWFycy4NCjwvbGk+PGxpPkRlYnVnZ2VyczogdGhlIE9DYW1sIEZvdW5kYXRp b24gZnVuZGVkIG9jYW1sZWFybHliaXJk4oCZcyBhdXRob3IgaW4gMjAyMC0yMDIxLCBoYWNrd2Fs eSwgYmVmb3JlIHRoZXkgc3RvcHBlZCB0byB3b3JrIGZ1bGwtdGltZSBmb3IgYSBzdGFydHVwLiAo PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbGVhcmx5YmlyZC1u b3ctYW4tb2NhbWwtc29mdHdhcmUtZm91bmRhdGlvbi1zdXBwb3J0ZWQtcHJvamVjdC82ODM0Ij5o dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sZWFybHliaXJkLW5vdy1hbi1vY2Ft bC1zb2Z0d2FyZS1mb3VuZGF0aW9uLXN1cHBvcnRlZC1wcm9qZWN0LzY4MzQ8L2E+DQogLCA8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sZWFybHliaXJkLTEtMC0w LWJldGExLzcxODAiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxlYXJseWJp cmQtMS0wLTAtYmV0YTEvNzE4MDwvYT4gLCBldGMuICkgSSBsZWFybmVkIGEgd2VlayBhZ28gdGhh dCBAc2ltNjQyIGlzIGludGVyZXN0ZWQgaW4gY29udGludWluZyBtYWludGVuYW5jZSBvZiB0aGUg cHJvamVjdCwgYW5kIHdlIGFyZSBsb29raW5nDQogYXQgZnVuZGluZyBoaXMgd29yay4gKG9jYW1s ZWFybHliaXJkIGlzIGEgYnl0ZWNvZGUgZGVidWdnZXIsIHNpbWlsYXIgdG8gdGhlIHZlbmVyYWJs ZQ0KPGNvZGU+b2NhbWxkZWJ1ZzwvY29kZT4g4oCTIGl0IGlzIGEgY2xpZW50IGZvciB0aGUgc2Ft ZSBkZWJ1Z2dlciBwcm90b2NvbC4gU2VwYXJhdGVseSB3ZSB3b3VsZCBpZGVhbGx5IGhhdmUgZ29v ZCBkZWJ1Z2dpbmcgc3VwcG9ydCB3aXRoIHRoZSBuYXRpdmUgY29tcGlsZXIuIFRoYXQgYXNwZWN0 IG9mIHRoZSBkZWJ1Z2dpbmcgc3RvcnkgaGFzIGJlZW4gd29ya2VkIG9uIGJ5IE1hcmsgU2hpbndl bGwgaW4gdGhlIHBhc3QsIGJ1dCB0aGVyZSBpcyBhIGRpc2FncmVlbWVudA0KIGFtb25nIGNvbXBp bGVyIG1haW50YWluZXJzIGFib3V0IHdoYXQgaXMgdGhlIHJpZ2h0IHRlY2huaWNhbCBhcHByb2Fj aCB0byBzdXBwb3J0IERXQVJGIGluZm9ybWF0aW9uIGluIHRoZSBjb21waWxlciDigJMgaXQgaXMg YSBjb21wbGV4IGZvcm1hdCB0aGF0IGlzIG5vdCBuZWNlc3NhcmlseSBhIGdvb2QgbWF0Y2ggZm9y IE9DYW1sLCBhbmQgYWRkaW5nIGl0IHRvIHRoZSBjb21waWxlciBiYWNrZW5kIGlzIGZhaXJseSBp bnZhc2l2ZS4pDQo8L2xpPjxsaT5BIHByaW9yaXR5IHRoYXQgcGVvcGxlIGRvbuKAmXQga25vdyBh Ym91dCwgYnV0IGluIG15IG1pbmQgY29tZXMgYmVmb3JlIOKAnHR5cGVkIGVmZmVjdHPigJ0sIGlz IHRvIHJlZmFjdG9yIGFuZCBjbGVhbnVwIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgT0NhbWwg dHlwZSBjaGVja2VyLCB3aGljaCBoYXMgaGlzdG9yaWNhbGx5IGJlZW4gYSBwbGFjZSBvZiB0ZWNo bmljYWwgZGVidCBpbiB0aGUgY29tcGlsZXIuIFRoZXJlIGhhcyBiZWVuIGEgZmFpciBhbW91bnQN CiBvZiB3b3JrIG9uIHRoaXMgaW4gdGhlIGxhc3QgeWVhciwgZHJpdmVuIGJ5IEphY3F1ZXMgR2Fy cmlndWUgYXMgaGlzIGdyb3VwIGF0IE5hZ295YSAoIGluIHBhcnRpY3VsYXIgVGFrYWZ1bWkgU2Fp a2F3YSApLCB3aXRoIEZsb3JpYW4gQW5nZWxldHRpIGFuZCBteXNlbGYgb24gdGhlIHJldmlld2Vy IHNpZGUsIGFuZCBpbiB0aGUgbGFzdCBmZXcgbW9udGhzIHNvbWUgdmVyeSB3ZWxjb21lIGhlbHAg ZnJvbSB0aGUgSmFuZSBTdHJlZXQgZ3JvdXAgd29ya2luZw0KIG9uIGxhbmd1YWdlIGZlYXR1cmVz IChpbiBwYXJ0aWN1bGFyIFJpY2hhcmQgRWlzZW5iZXJnLCBDaHJpcyBDYXNpbmdoaW5vLCBOaWNr IFJvYmVydHMpIHdobyBoYXZlIGJlZW4gbGVuZGluZyBhIGhhbmQgb24gcmVmYWN0b3JpbmcgYW5k IHJlZmFjdG9yaW5nLXJldmlld2luZyB3b3JrLiBNb3JlIGdlbmVyYWxseSwgSSBoYXZlIGJlZW4g d29ycmllZCB0aGlzIHllYXIgYWJvdXQgbWFpbnRlbmFuY2Ugd29ya2ZvcmNlIGZvciB0aGUgT0Nh bWwgY29tcGlsZXINCiBjb2RlYmFzZSAoPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L21haW50ZW5hbmNlLWJvdHRsZW5lY2tzLWluLXRoZS1jb21waWxlci1kaXN0cmlidXRpb24v MTEwNDUiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tYWludGVuYW5jZS1ib3R0bGVuZWNr cy1pbi10aGUtY29tcGlsZXItZGlzdHJpYnV0aW9uLzExMDQ1PC9hPiApLiBJIHRoaW5rIHRoYXQg c29sdmluZyB0aGlzIGlzc3VlIGlzIGFsc28gYSBwcmlvcml0eSwgYXQNCiB0aGUgbGV2ZWwgb2Yg dGhlIGNvbXBpbGVyIGRpc3RyaWJ1dGlvbi4gV2UgaGF2ZSBtYWRlIHNvbWUgcHJvZ3Jlc3MsIHdp dGggbm90YWJseSBtYWludGVuYW5jZSBjb250cmlidXRpb25zIGZyb20gT0NhbWxQcm8gYW5kIEph bmUgU3RyZWV0LCBidXQgSSB0aGluayB0aGF0IHRoZSBzaXR1YXRpb24gc3RpbGwgcmVxdWlyZXMg Y2FyZWZ1bCBtb25pdG9yaW5nLg0KPC9saT48bGk+UmVsb2NhdGFiaWxpdHk6IEkgYWdyZWUgd2l0 aCBAc21vcmltb3RvIHRoYXQgdGhpcyBpcyBpbXBvcnRhbnQuIEkgd291bGQgd2FudCBhbGwgT0Nh bWwgcGFja2FnZXMgdG8gYmUgcmVsb2NhdGFibGUsIG5vdGFibHkgYXMgdGhlIHJpZ2h0IGZpcnN0 IHN0ZXAgdG8gZW5hYmxlIGNhY2hpbmcgb3IgZXZlbiBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIE9D YW1sIHBhY2thZ2UgYnVpbGQgYXJ0aWZhY3RzLiBUaGVyZSBoYXMgYmVlbiB3b3JrIGluIHRoaXMN CiBkaXJlY3Rpb24gZnJvbSBEYXZpZCBBbGxzb3BwIGluIHRoZSBsYXN0IGZldyB5ZWFycywgd2hp Y2ggSSB1bmRlcnN0YW5kIGdldHMgY2xvc2VyIGV2ZXJ5IHllYXIgdG8gYmVpbmcgaW4gYSBzdGF0 ZSB0aGF0IGNvdWxkIGJlIHN1Ym1pdHRlZCBhcyB1cHN0cmVhbSBQUnMuIE15IHN0cmF0ZWd5IHNv IGZhciBpcyB0byB3YWl0IGZvciB0aGlzIHRvIG1ha2UgcHJvZ3Jlc3MuDQo8L2xpPjxsaT5Ub29s aW5nLCB0aGluZ3MgdGhhdCBkaXJlY3RseSBjb21lIHRvIG1pbmQgYXJlOg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPmRldmVsb3BtZW50LWVudmlyb25tZW50IHRvb2xzIHdob3NlIHJlY29tbWVu ZGVkIHdvcmtmbG93IGlzIHRvIGhhdmUgc2VwYXJhdGUvaXNvbGF0ZWQgZGV2ZWxvcG1lbnQgZW52 aXJvbm1lbnQocykgZm9yIGVhY2ggcHJvamVjdC4gVGhlDQo8Y29kZT5vcGFtPC9jb2RlPiBjbGll bnQgYWxsb3dzIHRoaXMgd2l0aCBsb2NhbCBzd2l0Y2hlcywgYnV0IEkgdGhpbmsgdGhlIFVJIGNv dWxkIGJlIHN0cmVhbWxpbmVkIGEgYml0IHRvIG1ha2UgdGhpcyB0aGUgZWFzeSBkZWZhdWx0LiAo Rm9yIGV4YW1wbGUsIG5vdCBldmVyeW9uZSBrbm93cyBob3cgdG8gYnVpbGQgYSBsb2NhbCBzd2l0 Y2ggd2l0aCBvbmx5IHRoZSBkZXBlbmRlbmNpZXMgb2YgdGhlIHByb2plY3QgaW5zdGFsbGVkLCB0 byBzdGFydA0KIGhhY2tpbmcgb24gaXQuKSBJZGVhbGx5IHdlIHdvdWxkIGhhdmUgY2FjaGluZyBv ZiBwYWNrYWdlIGJ1aWxkcyBhY3Jvc3MgdGhvc2UgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLCBh bmQgbWF5YmUgZXZlbiBzb21lIGRpc3RyaWJ1dGVkIGNhY2hpbmcgb2YgYnVpbGQgYXJ0aWZhY3Rz IChhc3N1bWluZyByZWxvY2F0YWJpbGl0eSkuDQo8L2xpPjxsaT5hIOKAnGNvZGUgdXBncmFkZeKA nSB0b29sIHRvIHdoaWNoIEkgY2FuIHNwZWNpZnkgcHJvZ3JhbSB0cmFuc2Zvcm1hdGlvbnMgKGZv ciBleGFtcGxlOiDigJxyZXdyaXRlDQo8Y29kZT5Tb21lTGliLnNvbWVmdW4gJGJhciAkYmF6PC9j b2RlPiBpbnRvIDxjb2RlPlNvbWVMaWIuc29tZWZ1biAkYmFyIChTb21lbGliLmNvbnZlcnQgJGJh eik8L2NvZGU+4oCdLCBhbmQgaXQgYXBwbGllcyBpdCB0byBteSBzb3VyY2UgY29kZSBpbiBhIGRp ZmYtZnJpZW5kbHkgd2F5Lg0KPC9saT48L3VsPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjUiPkV4cGxvcmF0aW9ucyBvbiBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZTwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZXhwbG9yYXRpb25zLW9uLXBh Y2thZ2UtbWFuYWdlbWVudC1pbi1kdW5lLzEyMTAxLzI1Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9leHBsb3JhdGlvbnMtb24tcGFja2FnZS1tYW5hZ2VtZW50LWluLWR1bmUvMTIxMDEv MjU8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzAzYTkz MjkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwM2E5MzI5Ij5EZWVwIGluIHRoaXMg dGhyZWFkLCBUaG9tYXMgR2F6YWduYWlyZSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmcwM2E5MzI5Ij4NCjxwPk15IHZpZXcgb24gdGhpcy4gV2hlbiBw ZW9wbGUgdGFsayBhYm91dCBPcGFtLCB0aGlzIGNvdmVycyBkaWZmZXJlbnQgYXNwZWN0cy4gPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnRoZSBvcGFtIGZpbGVzIGFuZCBmaWxlcyByZXBv c2l0b3JpZXMuIFRoZSBtYWluIHJlcG9zaXRvcnkgaXMgKGZvciB1cyBPQ2FtbGVycykNCjxjb2Rl Pm9jYW1sL29wYW0tcmVwb3NpdG9yeTwvY29kZT4sIGJ1dCB0aGUgW0NvcSBjb21tdW5pdHkgYWxz byBoYXMgb25lXSg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS93aWtpL0Rl di1NZWV0aW5nLTIwMjAuMTEuMDYtKG9wYW0tYW5kLWNvcS1yZXBvcykiPmh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtL3dpa2kvRGV2LU1lZXRpbmctMjAyMC4xMS4wNi0ob3BhbS1hbmQtY29x LXJlcG9zKTwvYT4pLCBhbmQgbWFueSBjb21wYW5pZXMNCiB1c2UgdGhlaXIgcHJpdmF0ZSByZXBv c2l0b3J5LiBXZSBkbyBub3Qgd2FudCB0byBicmVhayB0aGlzIHdvcmtmbG93LiBUaGUgRHVuZSBw YWNrYWdlIG1hbmFnZW1lbnQgcHJvcG9zYWxzIGFpbSB0byBzdGF5IGZ1bGx5IGNvbXBhdGlibGUg d2l0aCB0aGlzIHdvcmtmbG93IGFuZCB3b3JrIHdpdGggYW55IG9wYW0gcGFja2FnZXMgKHVzaW5n DQo8Y29kZT5kdW5lPC9jb2RlPiBvciBub3QpLiBUaGVyZeKAmXMgYWxzbyBleGNpdGluZyBvbmdv aW5nIHdvcmsgZm9yIFtwYWNrYWdlIHNpZ25pbmddKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vcGFtL3dpa2kvRGV2LU1lZXRpbmctMjAyMS4wNi4xMS0oQ29uZXgpIj5odHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS93aWtpL0Rldi1NZWV0aW5nLTIwMjEuMDYuMTEtKENvbmV4 KTwvYT4pIHRoYXQgd2UgZG8gd2FudCB0byBzZWUgbGFuZA0KIGF0IG9uZSBwb2ludC4gV2UgaGF2 ZSBhbHNvIGJ1aWx0IGFuZCBhcmUgb3BlcmF0aW5nIGFuIGV4dGVuc2l2ZSBDSSBpbmZyYXN0cnVj dHVyZSBhcm91bmQgdGhlc2UgcmVwb3NpdG9yaWVzIOKAkyBmb3IgaW5zdGFuY2UsDQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb3BhbS1yZXBvLWNpIj5vY2FtbC1yZXBvLWNp PC9hPiBpcyBidWlsZGluZyAxMDAsMDAwIGpvYnMgZGFpbHkgb24gYWxsIHRoZSBUaWVyMSBzdXBw b3J0ZWQgcGxhdGZvcm1zIGZvciBPQ2FtbC4gV2UgZG8gbm90IHdhbnQgdG8gcmVidWlsZCB0aGlz IG9uY2UgbW9yZSB0aW1lIQ0KPC9saT48bGk+dGhlIG9wYW0gY2xpZW50KHMpLiBUaGUgbWFpbiBv bmUgaXMgdGhlIDxjb2RlPm9wYW08L2NvZGU+IENMSSwgYnV0IG1hbnkgbW9yZSB0b29scyB1c2Ug dGhlIG9wYW0gZmlsZXMgbWV0YWRhdGEuIFRoZXJlIGFyZSBhIFtmZXcgdGVudGF0aXZlc10oPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vd2lraS9EZXYtTWVldGluZy0yMDIw LjEwLjIzLShvcGFtMm5peCkiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3dpa2kvRGV2 LU1lZXRpbmctMjAyMC4xMC4yMy0ob3BhbTJuaXgpPC9hPikNCiBvZiBnZW5lcmF0aW5nIDxjb2Rl Pm5peDwvY29kZT4gZGVyaXZhdGlvbnMgZm9yIHRob3NlIGZpbGVzLiBUaGVyZeKAmXMgYWxzbyBb ZXN5XSg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS93aWtpL0Rldi1NZWV0 aW5nLTIwMjAuMTIuMDQtKGVzeS1kcm9tKSI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0v d2lraS9EZXYtTWVldGluZy0yMDIwLjEyLjA0LShlc3ktZHJvbSk8L2E+KSBhbmQgdGhlIHBhY2th Z2UgbWFuYWdlcnMNCiB0aGF0IHRyeSB0byBjbG9zZSB0aGUgZ2FwIGJldHdlZW4gdGhlIE9DYW1s IGFuZCBKYXZhU2NyaXB0IGVjb3N5c3RlbXMuIFRoZSBjbGllbnQgaXMgYnVpbHQgYXJvdW5kIGEg bGlicmFyeSAoPGNvZGU+b3BhbS1saWI8L2NvZGU+KSwgYnV0IHRoaXMgaGFzIG5ldmVyIGJlZW4g ZGVzaWduZWQgcHJvcGVybHkuIFdoZW4gSSB3cm90ZSBvcGFtIGluaXRpYWxseSwgaXQgd2FzIG9u bHkgZm9jdXNlZCBvbiB0aGUgQ0xJLiBMYXRlciB3aXRoIEBBbHRHciwNCiB3ZSB0cmllZCB0byBz cGxpdCBpdCBhIGJpdCBtb3JlIGNsZWFubHksIGJ1dCB0aGUgQVBJIGlzIHN0aWxsIHBhaW5mdWwg dG8gdXNlIChmb3IgaW5zdGFuY2UsIGV2ZXJ5IGZ1bmN0aW9uIHRoYXQgbmVlZHMgdG8gbG9hZCB0 aGUgZmlsZXN5c3RlbSBuZWVkcyBhIHZhbHVlIHRoYXQgaG9sZHMgdGhhdCBzdGF0ZSB0aGF0IHdv dWxkIHRha2UgZG96ZW5zIG9mIGFyZ3VtZW50cyAtIHRoZW4sIGFzIHRoZXNlIGZ1bmN0aW9ucyBw ZXJmb3JtIGZpbGUtc3lzdGVtDQogb3IgbmV0d29yayBlZmZlY3RzLCB5b3Ugc29tZWhvdyBuZWVk IHRvIGtlZXAgdGhlc2UgdmFsdWVzIHN5bmNocm9uaXNlZCB3aXRoIHRoZSBuZXcgZmlsZXN5c3Rl bSBzdGF0ZSDigJMgdGhhdOKAmXMgcGFpbmZ1bCBhbmQgZXJyb3IgcHJvbmUpLiBUaGlzIEFQSSBj YW4gc29tZWhvdyBiZSBzcGxpdCBpbnRvIHZhcmlvdXMgcGFydHM6DQo8b2wgY2xhc3M9Im9yZy1v bCI+DQo8bGk+UmVhZGluZyB0aGUgb3BhbSByZXBvc2l0b3J5IHN0YXRlOiBwYXJzaW5nIG9wYW0g ZmlsZXMsIGJ1aWxkaW5nIGEgZGVwZW5kZW5jeSBncmFwaCAodGhhdOKAmXMgdGhlIHBhcnQgeW91 IG1lbnRpb24gQGdhc2NoZSkNCjwvbGk+PGxpPlJlc29sdmluZyBjb25zdHJhaW50czogb3BhbSBo YXMgYSBwbHVnZ2FibGUgaW50ZXJmYWNlIGZvciBjb25zdHJhaW50IHNvbHZpbmcsIGFuZCBieSBk ZWZhdWx0LCBpdCB3aWxsIHVzZSB3aGF0IHNvbHZlciBpcyBpbnN0YWxsZWQgb24geW91ciBzeXN0 ZW0gKG9yIHNvbWUgaW50ZXJuYWwgaGV1cmlzdGljcyB3aGljaCB1c2VkIHRvIGJlIHZlcnkgbmFp dmUgYnV0IHNlZW1zIG11Y2ggYmV0dGVyIG5vd2FkYXlzKS4gT3BhbSBuZWVkcyB0byBzZXJpYWxp c2UNCiBhbmQgcGFyc2Ugc29sdmVyIHJlcXVlc3RzLCBpbmNsdWRpbmcgc29sdmVyIGVycm9ycyB0 aGF0IG5lZWQgdG8gYmUgc29tZWhvdyBwcmV0dHkgcHJpbnRlZCB0byB0aGUgdXNlci4NCjwvbGk+ PGxpPklmIHRoZSBzb2x2ZXIgY2FuIGRldmlzZSBhIGJ1aWxkaW5nIHBsYW4sIHBhcnNlIGl0IGFu ZCBwcmVwYXJlIGl0IGJ5IGRvd25sb2FkaW5nIChhbmQgY2FjaGluZykgdGhlIGJ1aWxkL3BhY2th Z2Ugc291cmNlcy4NCjwvbGk+PGxpPnJ1biB0aGUgYnVpbGQgY29tbWFuZHMgZm9yIGFsbCB0aGUg cGFja2FnZXMgYW5kIGluc3RhbGwgdGhlbSBsb2NhbGx5LiA8L2xpPjwvb2w+DQo8L2xpPjwvdWw+ DQo8cD5Ob3dhZGF5cywgbW9zdCBwYWNrYWdlIG1hbmFnZXJzIGFsc28gaGF2ZSB0aGUgb3B0aW9u IHRvIHNuYXBzaG90IHRoZSBzdGF0ZSBvZiB0aGUgYnVpbGQgcGxhbiBiZXR3ZWVuIDIuIGFuZCAz LiBUaGF04oCZcyBmb3IgaW5zdGFuY2UsIHdoYXQgdG9vbHMgbGlrZQ0KPGNvZGU+b3BhbS1tb25v cmVwbyBsb2NrPC9jb2RlPiBvciA8Y29kZT5vcGFtIGxvY2s8L2NvZGU+IGFyZSBkb2luZy4gQnV0 IHdoZW4geW91IGRvDQo8Y29kZT5vcGFtIGluc3RhbGwgLS1sb2NrZWQ8L2NvZGU+LCA8Y29kZT5v cGFtPC9jb2RlPiBzdGlsbCBjYWxscyB0aGUgc29sdmVyICh0byBjaGVjayB0aGF0IHlvdXIgbG9j ayBmaWxlIGlzIGNvbnNpc3RlbnQgYW5kIGNvbXBsZXRlKSwgc28gZG9pbmcgMy0yLTMtNC4gQW5k DQo8Y29kZT5vcGFtLW1vbm9yZXBvIHB1bGw8L2NvZGU+IGRvZXMgMy4gYW5kIGRlbGVnYXRlIDQu IHRvIDxjb2RlPmR1bmUgYnVpbGQ8L2NvZGU+IChzbyBhbGwgeW91ciBkZXBlbmRlbmNpZXMgbmVl ZCB0byB1c2UNCjxjb2RlPmR1bmU8L2NvZGU+IGFuZCBiZSBjby1pbnN0YWxsYWJsZSBpbiBhIDxj b2RlPmR1bmU8L2NvZGU+IHdvcmtzcGFjZSkuIDwvcD4NCjxwPlNvIHRvIGNvbWUgYmFjayB0byB5 b3VyIHF1ZXN0aW9uIEBnYXNjaGU6IFRoZSBEdW5lIHBhY2thZ2UgbWFuYWdlbWVudCBleHBlcmlt ZW50IHdpbGwgYmUgdXNpbmcNCjxjb2RlPm9wYW0tbGliPC9jb2RlPiB0byBkbyAxLCAyIGFuZCAz ICh3aGV0aGVyIGl04oCZcyB0aGUgY3VycmVudCA8Y29kZT5vcGFtLWxpYjwvY29kZT4gb3IgYW4g aW1wcm92ZWQgdmVyc2lvbiB0aGF0IHJlbGllcyBhIGJpdCBsZXNzIG9uIGZpbGVzeXN0ZW0gc3Rh dGUgaXMgc3RpbGwgaW4gZGlzY3Vzc2lvbnMgLSB3aGF0ZXZlciB0aGUgcmVzdWx0IGlzIGl0IHdp bGwgYmUgdXBzdHJlYW1lZCkuIEFuZCBpdCB3aWxsIGJlIHVzaW5nIHRoZQ0KPGNvZGU+ZHVuZTwv Y29kZT4gc2NoZWR1bGVyIHRvIGRvIDQgKGJ1dCBzdGlsbCB1c2luZyB0aGUgb3BhbSBidWlsZCBp bnN0cnVjdGlvbnMpLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk9DYW1sRm9y bWF0IDAuMjYuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9j YW1sZm9ybWF0LTAtMjYtMC8xMjY0OS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxmb3JtYXQtMC0yNi0wLzEyNjQ5LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnYTA4OTExMyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2EwODkxMTMiPkp1bGVzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnYTA4OTExMyI+DQo8cD5XZSBhcmUgaGFwcHkgdG8gYW5ub3VuY2Ug dGhlIHJlbGVhc2Ugb2YgT0NhbWxGb3JtYXQgMC4yNi4wLCB0aGUgYXV0by1mb3JtYXR0ZXIgZm9y IE9DYW1sIGNvZGUuDQo8L3A+DQo8cD5UaGlzIHJlbGVhc2UgY29udGFpbnMgY2hhbmdlcyB0aGF0 IG1pZ2h0IGFmZmVjdCB5b3VyIGNvZGUgYW5kIG92ZXJhbGwgcHJvamVjdHMuIEl0IGNvdWxkIGlu Y2x1ZGUgaW1wYWN0IHRvIG1vZHVsZSBhcmd1bWVudHMsDQo8Y29kZT5mdW48L2NvZGU+IHBhc3Nl ZCBhcyBhIGxhYmVsbGVkIGFyZ3VtZW50LCBhbmQgaW5kZW50YXRpb24gd2l0aGluIHBhcmVudGhl c2VzLg0KPC9wPg0KPHA+VGhlIGNvbXBsZXRlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1wcHgvb2NhbWxmb3JtYXQvcmVsZWFzZXMvdGFnLzAuMjYuMCI+DQpsaXN0IG9mIGNoYW5n ZXMgaXMgaGVyZTwvYT4uIEl0ZW1zIG1hcmtlZCB3aXRoIGEgPGNvZGU+KjwvY29kZT4gYXJlIGxp a2VseSB0byBjaGFuZ2UgeW91ciBjb2RlLg0KPC9wPg0KPHA+VGhlIE9DYW1sRm9ybWF0IGRldiB0 ZWFtIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5UYXJpZGVzIE9mZmljZSBIb3Vy czogQmVuY2htYXJrIFRvb2xpbmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi10YXJpZGVzLW9mZmljZS1ob3Vycy1iZW5jaG1hcmstdG9vbGluZy8xMjY1NS8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGFyaWRlcy1vZmZpY2UtaG91cnMtYmVu Y2htYXJrLXRvb2xpbmcvMTI2NTUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYzk1OWY0NCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2M5 NTlmNDQiPlNoYWt0aGkgS2FubmFuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnYzk1OWY0NCI+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jdXJyZW50L2N1cnJlbnQtYmVuY2giPmN1cnJlbnQtYmVuY2g8L2E+IGluZnJh c3RydWN0dXJlIGFuZCBwaXBlbGluZSBhcmUgdXNlZCBmb3IgYmVuY2htYXJraW5nIHRoZSBPQ2Ft bCBjb21waWxlciBhbmQgZWNvc3lzdGVtIHByb2plY3RzLiBJdCB1c2VzIHRoZQ0KPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L29jdXJyZW50Ij5PQ3VycmVudDwvYT4gcGlwZWxp bmUgdG8gcnVuIHByZWRpY3RhYmxlLCBJL08tYm91bmQgYmVuY2htYXJrcyBmb3IgdGhlIHJlc3Bl Y3RpdmUgT0NhbWwgcHJvamVjdHMuDQo8L3A+DQo8cD5XZSBoYXZlIHN1Y2Nlc3NmdWxseSBhZGRl ZCBiZW5jaG1hcmtzIGZvciBEdW5lLCBMb2NrZnJlZSwgb2RvYywgTWVybGluLCBFaW8sIG9wYW0s IGV0Yy4sIHByb2plY3RzIGF0DQo8YSBocmVmPSJodHRwczovL2F1dHVtbi5vY2FtbGxhYnMuaW8i Pmh0dHBzOi8vYXV0dW1uLm9jYW1sbGFicy5pbzwvYT4uIFdlIHdvdWxkIG5vdyBsaWtlIHRvIG1h a2Ugb3VyIGluZnJhc3RydWN0dXJlIGF2YWlsYWJsZSB0byB0aGUgbGFyZ2VyIGNvbW11bml0eSB0 byBpbmNyZWFzZSBhZG9wdGlvbiBhbmQgY29udGludWUgb3VyIHdvcmsgb24gcGVyZm9ybWFuY2Ug YW5hbHlzaXMsIHRvb2xpbmcsIGFuZCBiZW5jaG1hcmtpbmcuDQo8L3A+DQo8cD5Zb3UgY2FuIGZv bGxvdyB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBjdXJyZW50LWJlbmNoIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY3VycmVudC9jdXJyZW50LWJlbmNoL2Jsb2IvbWFpbi9SRUFETUUubWQj ZW5yb2xsLXlvdXItcmVwb3NpdG9yeSI+DQpSRUFETUU8L2E+IHRvIGNyZWF0ZSBhIGJlbmNobWFy ayBmb3IgeW91ciBwcm9qZWN0IGFuZCBpbnN0YWxsIHRoZSBHaXRIdWIgYXBwbGljYXRpb24gdG8g b25ib2FyZCB5b3VyIE9DYW1sIHByb2plY3QgdG8gY3VycmVudC1iZW5jaC4NCjwvcD4NCjxwPlRo ZSBUYXJpZGVzIEJlbmNobWFyayBUb29saW5nIHRlYW0gaXMgYWxzbyBtYWtpbmcgb3BlbiBvZmZp Y2UgaG91cnMgYXZhaWxhYmxlIGZvciB5b3UgdG8gZW5nYWdlLCBhc2sgcXVlc3Rpb25zLCBhbmQg d29yayB3aXRoIHVzIG9uIGJlbmNobWFya2luZyBPQ2FtbCBwcm9qZWN0cy4gV2Ugd2lsbCBiZSBh dmFpbGFibGUgb25saW5lLCBldmVyeSBNb25kYXksIGJldHdlZW4gMTAzMCBhbmQgMTEzMCBDRVQg b24gR29vZ2xlIE1lZXQgYXMgbWVudGlvbmVkDQogYmVsb3c6IDwvcD4NCjxwPlRhcmlkZXMgT2Zm aWNlIEhvdXJzOiBPQ2FtbCBCZW5jaG1hcmtpbmcgU3RhcnRpbmcgTW9uZGF5LCBKdWx5IDI0LCAy MDIzICgxMDMwIC0gMTEzMCBDRVQpICgxNDAwIOKAkyAxNTAwIElTVCkNCjwvcD4NCjxwPkdvb2ds ZSBNZWV0IGpvaW5pbmcgaW5mbzogVmlkZW8gY2FsbCBsaW5rOiA8YSBocmVmPSJodHRwczovL21l ZXQuZ29vZ2xlLmNvbS9yY3Utd2pway1qeWgiPg0KaHR0cHM6Ly9tZWV0Lmdvb2dsZS5jb20vcmN1 LXdqcGstanloPC9hPiBPciBkaWFsOiDigKooVVMpICYjNDM7MSA0NDAtNTQ5LTQ4MDjigKwgUElO OiDigKo1ODQgMzMxIDkwMuKArCMNCjwvcD4NCjxwPk1vcmUgcGhvbmUgbnVtYmVyczogPGEgaHJl Zj0iaHR0cHM6Ly90ZWwubWVldC9yY3Utd2pway1qeWg/cGluPTQ0Nzk1ODQ3MDYxMTgiPg0KaHR0 cHM6Ly90ZWwubWVldC9yY3Utd2pway1qeWg/cGluPTQ0Nzk1ODQ3MDYxMTg8L2E+IDwvcD4NCjxw PlBsZWFzZSBmZWVsIGZyZWUgdG8gam9pbiBvdXIgd2Vla2x5IE1vbmRheSBzZXNzaW9ucywgYW5k IHdlIHdpbGwgYmUgaGFwcHkgdG8gaW50ZXJhY3Qgd2l0aCB0aGUgY29tbXVuaXR5IGFuZCBlbmhh bmNlIG91ciBiZW5jaG1hcmtpbmcgZWZmb3J0cyBmb3IgT0NhbWwhDQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iOCI+WW91IENhbiBBdHRlbmQgdGhlIE5ldyBPQ2FtbC5vcmcgQ29tbXVu aXR5IE1lZXRpbmdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC04 Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC95b3Ut Y2FuLWF0dGVuZC10aGUtbmV3LW9jYW1sLW9yZy1jb21tdW5pdHktbWVldGluZ3MvMTI2NTYvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QveW91LWNhbi1hdHRlbmQtdGhlLW5ldy1vY2Ft bC1vcmctY29tbXVuaXR5LW1lZXRpbmdzLzEyNjU2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzgxNzIxYjIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc4MTcyMWIyIj5TYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4MTcyMWIyIj4NCjxwPnRoZSBPQ2FtbC5v cmcgbWFpbnRhaW5lcnMgYXJlIG5vdyBob2xkaW5nIGNvbW11bml0eSBtZWV0aW5ncywgb24gTW9u ZGF5cyBldmVyeSB0d28gd2Vla3Mgb24gWm9vbS4NCjwvcD4NCjxwPkhlcmUgYXJlIHNvbWUgZGF0 ZXMgZm9yIHRoZSB1cGNvbWluZyBtZWV0aW5ncyA8YSBocmVmPSJodHRwczovL2NhbGVuZGFyLmdv b2dsZS5jb20vY2FsZW5kYXIvdS8wP2NpZD1ZMTh3TW1VME1XSXlZV1F3TURFMk5XSTBNRFEzT0Rs bVlXUTNZelZrWmpkbFlUTmhOR0ZsTmpJM05EUmpNVE16TURkbFpUZG1Zak5tWkRjek9ESm1NV1Jr UUdkeWIzVndMbU5oYkdWdVpHRnlMbWR2YjJkc1pTNWpiMjAiPg0KKHNjaGVkdWxlZCBvbiBHb29n bGUgQ2FsZW5kYXIpPC9hPjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjI0IEp1bCAy MDIzLCBNb24gMTg6MDAg4oCTIDE5OjAwIENFU1QgPC9saT48bGk+NyBBdWcgMjAyMywgTW9uIDE4 OjAwIOKAkyAxOTowMCBDRVNUIDwvbGk+PGxpPjIxIEF1ZyAyMDIzLCBNb24gMTg6MDAg4oCTIDE5 OjAwIENFU1QgPC9saT48bGk+NCBTZXB0IDIwMjMsIE1vbiAxODowMCDigJMgMTk6MDAgQ0VTVCA8 L2xpPjwvdWw+DQo8cD5Ub3BpY3MgbWF5IGluY2x1ZGU6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVs Ij4NCjxsaT5Qcm9wb3NhbHMgeW91IHdhbnQgdG8gY2hhbXBpb24gPC9saT48bGk+USZhbXA7QSBz ZXNzaW9ucyBhYm91dCB0aGUgcHJvamVjdCA8L2xpPjxsaT5HdWlkYW5jZSBvbiBjb250cmlidXRp bmcgPC9saT48L3VsPg0KPHA+QnV0IHdl4oCZcmUgbm90IGxpbWl0aW5nIHRvcGljcyB0byBqdXN0 IHRoZXNlLiBNYW55IG1vcmUgdG9waWNzIHJlbGV2YW50IHRvIE9DYW1sLm9yZyBhbmQgaG93IHRv IGJlc3QgbWFrZSB1c2Ugb2YgaXQgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBPQ2FtbCBjb21tdW5p dHkgY2FuIGFsc28gYmUgZGlzY3Vzc2VkLiBJZiB5b3XigJlkIGxpa2UgdG8gYWRkIGEgdG9waWMv aXNzdWUgdG8gdGhlIGRpc2N1c3Npb24gZm9yIGEgc3BlY2lmaWMgbWVldGluZywNCiBwbGVhc2Ug Y29udGFjdCBTYWJpbmUgb24gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy91L3Nh YmluZSI+T0NhbWwgRGlzY3VzczwvYT4gb3IgdGhlDQo8YSBocmVmPSJodHRwczovL2Rpc2NvcmQu Y29tL2NoYW5uZWxzLzQzNjU2ODA2MDI4ODE3MjA0Mi8xMTI2NDMzOTA2OTc2MTEyNzAwIj5PQ2Ft bC5vcmcgRGlzY29yZCBjaGFubmVsPC9hPiwgb3INCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzIj5vcGVuIGFuIGlzc3VlIG9uIHRoZSBvY2FtbC9vY2Ft bC5vcmcgR2l0SHViIFJlcG9zaXRvcnk8L2E+DQo8L3A+DQo8cD5QLlMuOiA8YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9uZXdzL2ludml0YXRpb24tdG8tY29udHJpYnV0ZSI+aHR0cHM6Ly9vY2Ft bC5vcmcvbmV3cy9pbnZpdGF0aW9uLXRvLWNvbnRyaWJ1dGU8L2E+DQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0iOSI+ZXVsZXIsIGFuIGFyaXRobWV0aWMgbGlicmFyeSBmb3IgbmF0aXZl IGludGVnZXJzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4N CjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZXVs ZXItYW4tYXJpdGhtZXRpYy1saWJyYXJ5LWZvci1uYXRpdmUtaW50ZWdlcnMvMTI0ODIvMTAiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ldWxlci1hbi1hcml0aG1ldGljLWxpYnJh cnktZm9yLW5hdGl2ZS1pbnRlZ2Vycy8xMjQ4Mi8xMDwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnZDk3NWM2OCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZ2Q5NzVjNjgiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIGdsZW4gYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkOTc1YzY4Ij4NCjxw PlRoYW5rcyB0byBAbXNlcmksIDxjb2RlPmV1bGVyPC9jb2RlPiBpcyBub3cgb24gb3BhbSEgQW5k IGluIHRoZSBtZWFudGltZSBpdCBoYXMgZ2FpbmVkIG1vcmUgZnVuY3Rpb25zLCB0aGUgbW9zdCBz dHJpa2luZyBvZiB3aGljaCBiZWluZw0KPGEgaHJlZj0iaHR0cHM6Ly9nbWV2ZWwuZ2l0aHViLmlv L2V1bGVyLWxpYi9pbmRleC5odG1sL2V1bGVyL0V1bGVyL1ByaW1lcy9pbmRleC5odG1sI3ZhbC1w cmltZV9zZXEiPg0KPGNvZGU+UHJpbWVzLnByaW1lX3NlcSA6IGludCAtJmd0OyBpbnQgU2VxLnQ8 L2NvZGU+PC9hPiAodGhhbmsgQGN1aWh0bGF1YWMgZm9yIHBvaW50aW5nIG1lIHRvIHRoZSBhbGdv cml0aG0hKSBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ21ldmVsLmdpdGh1Yi5pby9ldWxlci1saWIv aW5kZXguaHRtbC9ldWxlci9FdWxlci9Bcml0aC9pbmRleC5odG1sI3ZhbC1zbWFsbGVzdF9yb290 Ij4NCjxjb2RlPkFyaXRoLnNtYWxsZXN0X3Jvb3QgOiBpbnQgLSZndDsgaW50ICogaW50PC9jb2Rl PjwvYT4gKHRoZSBsYXR0ZXIgaW4gdGhlIG5leHQgcmVsZWFzZSwgMy4wLCBub3Qgb24gb3BhbSB5 ZXQpLg0KPC9wPg0KPHA+QWxzbywgc2luY2UgSSBzdGlsbCBjYW5ub3QgZWRpdCB0aGUgZmlyc3Qg cG9zdCwgdGhpcyBpcyBhIHJlbWluZGVyIHRoYXQgdGhlIHByb2plY3QgaGFzIG1vdmVkIHRvIEdp dEh1YjoNCjxiPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nbWV2ZWwvZXVsZXItbGliIj5y ZXBvPC9hPjwvYj4sIDxiPjxhIGhyZWY9Imh0dHBzOi8vZ21ldmVsLmdpdGh1Yi5pby9ldWxlci1s aWIvaW5kZXguaHRtbC9ldWxlci9FdWxlci8iPmRvYzwvYT48L2I+LiBUaGUgbGlua3MgaW4gbXkg Zmlyc3QgbWVzc2FnZSB3b27igJl0IGJlIHVwZGF0ZWQuDQo8L3A+DQo8YmxvY2txdW90ZT4NCjxw Pkkgd29uZGVyIGlmIHRoaXMgaXMgYSB1c2VmdWwgYWRkaXRpb24gdG8gPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL293bGJhcm4vb3dsIj4NCk93bCA8L2E+LCB0aGUgb2NhbWwg4oCcZmF04oCd IG1hdGggbGlicmFyeS4gPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+UGVyaGFwcz8gSSBhbSBub3Qg dmVyeSBmYW1pbGlhciB3aXRoIE93bCAoYXNrIE93bOKAmXMgQmVuZXZvbGVudCBEaWN0YXRvcnMg Rm9yIExpZmU/IDstKSApLiBFdWxlciBpcyBhbiBpbnRlZ2VyIGFyaXRobWV0aWMgbGlicmFyeSB3 aGVyZWFzLCBhcyBJIHVuZGVyc3RhbmQgaXQsIE93bCBpcyBtYWlubHkgYSBmbG9hdGluZy1wb2lu dCBtYXRoIGxpYnJhcnkgZm9yIHNjaWVudGlmaWMgY29tcHV0aW5nIChsaW5lYXIgYWxnZWJyYSwg ZGlmZmVyZW50aWF0aW9uLA0KIHN0YXRpc3RpY3MgYW5kIGFuZCBzdWNoKS4gSSB3b3VsZCBndWVz cyB0aGF0IHByaW1lIG51bWJlcnMgYW5kIGZyaWVuZHMgYXJlIHJhdGhlciByZW1vdGUgY29uY2Vy bnMgZm9yIE93bCB1c2VycywgYnV0IHBlcmhhcHMgT3dsIGlzIGludGVyZXN0ZWQgaW4gZXhwYW5k aW5nIGl0cyBkb21haW5zPyBJIGRpZCBzcG90DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b3dsYmFybi9vd2wvYmxvYi80ODQzNGVhL3NyYy9vd2wvbWF0aHMvb3dsX21hdGhzLm1saSNMNTg3 LUw2MDciPg0KYSBzbWFsbCBudW1iZXIgb2YgaW50ZWdlciBhcml0aG1ldGljIGZ1bmN0aW9ucyBp biBPd2w8L2E+LCBtb3N0IG9mIHdoaWNoIGFyZSBhbHNvIGZvdW5kIGluIEV1bGVyLg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTAiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+RGtNTCBJbnN0YWxsIEFQSSAwLjQuMDwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTAiPg0KPHA+QXJjaGl2ZTog PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21sLWluc3RhbGwtYXBp LTAtNC0wLzEyNjY1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ka21sLWlu c3RhbGwtYXBpLTAtNC0wLzEyNjY1LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYmUwZDg3YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2Jl MGQ4N2MiPmpiZWNrZm9yZCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2JlMGQ4N2MiPg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0 aGF0IERrTUwgSW5zdGFsbCBBUEkgMC40LjAgaXMgYXZhaWxhYmxlIG9uIG9wYW0uIFRoaXMgbGli cmFyeSBpcyB3aGF0IEnigJl2ZSBiZWVuIHVzaW5nIHRvIGNyZWF0ZSB0aGUgRGtNTCBXaW5kb3dz IGRpc3RyaWJ1dGlvbiBpbnN0YWxsZXIuDQo8L3A+DQo8cD5UTERSOiBUbyBjcmVhdGUgeW91ciBv d24gaW5zdGFsbGVyIGZvciB5b3VyIG93biBzb2Z0d2FyZSwgeW91IGRlZmluZSDigJxjb21wb25l bnRz4oCdIHdoaWNoIGhhdmUgZGVwZW5kZW5jaWVzIG9uIG90aGVyIGNvbXBvbmVudHMuIEEgY29t cG9uZW50IGlzIGFuIE9DYW1sIG1vZHVsZSB5b3UgY3JlYXRlIHdpdGggZm91ciBlc3NlbnRpYWwg ZnVuY3Rpb25zOg0KPGNvZGU+YWRtaW5faW5zdGFsbDwvY29kZT4gYW5kIDxjb2RlPmFkbWluX3Vu aW5zdGFsbDwvY29kZT4gZm9yIGVzY2FsYXRlZCBwcml2aWxlZ2VzLCBhbmQNCjxjb2RlPnVzZXJf aW5zdGFsbDwvY29kZT4gYW5kIDxjb2RlPnVzZXJfdW5pbnN0YWxsPC9jb2RlPiBmb3Igbm9ybWFs IHVzZXIgcHJpdmlsZWdlcy4gRWFjaCBjb21wb25lbnQgYWxtb3N0IGFsd2F5cyBuZWVkcyB0byBh Y2Nlc3MgYXNzZXRzIHdoaWNoIGNhbiBiZSBkZWZpbmVkIGluIHRoZQ0KPGNvZGU+aW5zdGFsbDpb XTwvY29kZT4gc2VjdGlvbiBvZiBhbiA8Y29kZT4ub3BhbTwvY29kZT4gZmlsZS4gVGhlIG5ldCBl ZmZlY3QgaXMgeW91IGNhbiB1c2Ugb3BhbSBhbmQgT0NhbWwgdG8gZGVmaW5lIHlvdXIgb3duIHJl cHJvZHVjaWJsZSBpbnN0YWxsZXIuDQo8L3A+DQo8cD5UaGVyZSBpcyBhIHdhbGstdGhyb3VnaCBh dCA8YSBocmVmPSJodHRwczovL2Rpc2t1di5naXRodWIuaW8vZGttbC1pbnN0YWxsLWFwaS9kb2Mv cGFja2FnZXMvQ29uc29sZS5odG1sIj4NCmh0dHBzOi8vZGlza3V2LmdpdGh1Yi5pby9ka21sLWlu c3RhbGwtYXBpL2RvYy9wYWNrYWdlcy9Db25zb2xlLmh0bWw8L2E+IGFuZCBtb3JlIGdlbmVyYWwg ZG9jdW1lbnRhdGlvbiBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21s LWluc3RhbGwtYXBpI3JlYWRtZSI+aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka21sLWluc3Rh bGwtYXBpI3JlYWRtZTwvYT4NCjwvcD4NCjxwPlRoZSBsaWJyYXJ5IHdvcmtzIHdlbGwgZm9yIHRo ZSBEa01MIFdpbmRvd3MgZGlzdHJpYnV0aW9uLCBhbHRob3VnaCBpdCBpcyB0b28gY29tcGxpY2F0 ZWQgdG8gcmVjb21tZW5kIGZvciBjYXN1YWwgdXNlIHRvZGF5LiBSZWdhcmRsZXNzLCBpZiBzb21l b25lIGhhcyBhIGJ1cm5pbmcgZGVzaXJlIHRvIGNyZWF0ZSB0aGVpciBvd24gaW5zdGFsbGVyLCBh bmQgdGhhdCBpbnN0YWxsZXIgaGFzIHJlYXNvbmFibHkgY29tcGxleCBsb2dpYyB0aGF0IG5lZWRz DQogdG8gcnVuIG9uIHRoZSBlbmQtdXNlciBtYWNoaW5lLCB0aGVuIHRha2UgYSBsb29rIGF0IERr TUwgSW5zdGFsbCBBUEkhIDxpPkV4cGVjdCB0byBzZWUgYSBzdGVhZHkgYnV0IHNsb3cgc2VyaWVz IG9mIGNoYW5nZXMgdG8gdGhlIEFQSSB1bnRpbCBpdCBoaXRzIDEuMC4wLjwvaT4NCjwvcD4NCjxw PkxpbWl0YXRpb25zOiBUb2RheSBpdCBjYW4gbWFrZSBhbiBlbmQtdG8tZW5kIGluc3RhbGxlciBm b3IgV2luZG93cy4gSSBoYXZlbuKAmXQgbmVlZGVkIHlldCB0byBjcmVhdGUgbWFjT1MgYW5kIExp bnV4IGluc3RhbGxlcnMsIGFsdGhvdWdoIDk1JSBvZiB0aGUgcGllY2VzIGFyZSBwcmVzZW50LiBJ ZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gY3JlYXRpbmcgdGhlIGZpbmFsIHBhY2thZ2luZyBzdGVw IGZvciB0aG9zZSBPUy1lcyAoZXguIGENCjxjb2RlPi5kZWI8L2NvZGU+IGFwdCBwYWNrYWdlciBm b3IgRGViaWFuKSwgZmVlbCBmcmVlIHRvIGNvbnRyaWJ1dGUgYSBQUiEgPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTEiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSIxMSI+TGlxdWlkc29hcCAyLjIuMCBpcyBvdXQhIPCfjok8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbGlxdWlkc29hcC0yLTItMC1p cy1vdXQvMTI2NjcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWxpcXVpZHNv YXAtMi0yLTAtaXMtb3V0LzEyNjY3LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnNzFlYzZlNSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzcx ZWM2ZTUiPlJvbWFpbiBCZWF1eGlzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnNzFlYzZlNSI+DQo8cD5XZSBhcmUgZGVsaWdodGVkIHRvIGFu bm91bmNlIHRoZSByZWxlYXNlIG9mIDxiPjxiPkxpcXVpZHNvYXAgMi4yLjA8L2I+PC9iPiEgSXQg aXMgbm93IGF2YWlsYWJsZSBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nhdm9uZXQv bGlxdWlkc29hcC9yZWxlYXNlcy90YWcvdjIuMi4wIj5vdXIgcmVsZWFzZSBwYWdlPC9hPiBhbmQg c2hvdWxkIGJlIGF2YWlsYWJsZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNr YWdlcy9saXF1aWRzb2FwIj52aWEgb3BhbTwvYT4gc2hvcnRseSEgPC9wPg0KPHA+TGlxdWlkc29h cCBpcyBhIHN0YXRpY2FsbHkgdHlwZWQgc2NyaXB0aW5nIGdlbmVyYWwtcHVycG9zZSBsYW5ndWFn ZSB3aXRoIGRlZGljYXRlZCBvcGVyYXRvcnMgYW5kIGJhY2tlbmQgZm9yIGFsbCB0aGluZyBtZWRp YSwgc3RyZWFtaW5nLCBmaWxlIGdlbmVyYXRpb24sIGF1dG9tYXRpb24sIEhUVFAgYmFja2VuZCBh bmQgbW9yZS4NCjwvcD4NCjxwPlRoaXMgcmVsZWFzZSBjb21lcyBhbG1vc3QgNCBtb250aHMgYWZ0 ZXIgdGhlIGxhc3Qgc3RhYmxlIHJlbGVhc2UgZnJvbSB0aGUgPGNvZGU+DQoyLjEueDwvY29kZT4g cmVsZWFzZSBjeWNsZSBhbmQgMTQgbW9udGhzICghKSBhZnRlciBmb3JraW5nIHRoZSA8Y29kZT4y LjIueDwvY29kZT4gcmVsZWFzZSBicmFuY2ghIEl0IGluY2x1ZGVzIHNvbWUgZXhjaXRpbmcgY2hh bmdlcyBpbiB0cmFjayBtdXhpbmcvZGVtdXhpbmcsIEhMUywgc291bmQgcHJvY2Vzc2luZyBhbmQg bW9yZS4gU2VlIGJlbG93IGZvciBhIGRldGFpbGVkIGxpc3QhDQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzdmNzkxYzYiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmc3Zjc5MWM2Ij7inKggTmV3IGZlYXR1cmVzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc3Zjc5MWM2Ij4NCjxwPkhlcmUgYXJlIHRoZSBoaWdobGln aHRzOiA8L3A+DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnYzU3 MmVlNCI+PC9hPvCfjpvvuI8gTXVsdGl0cmFjazxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC01IiBpZD0idGV4dC1vcmdjNTcyZWU0Ij4NCjxwPlRoaXMgaXMgYnkgZmFyIHRoZSBiaWdnZXN0 IGNoYW5nZSBpbiB0aGlzIHJlbGFzZSEgVGhpcyBicmluZ3MgdGhlIGFiaWxpdHkgdG8gZGVtdXgg YW5kIHJlbXV4IHRyYWNrcyBpbnNpZGUgc291cmNlcywgbWFraW5nIGl0IHBvc3NpYmxlIHRvOg0K PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkVuY29kZSB2aWRlbyB3aXRoIG11bHRpcGxl IGF1ZGlvIHRyYWNrcyA8L2xpPjxsaT5DcmVhdGUgYXVkaW8tb25seSBhbmQgYXVkaW8vdmlkZW8g c3RyZWFtcyBmcm9tIHRoZSBzYW1lIGNvbnRlbnQsIGZvciBpbnN0YW5jZSBhIHJlZ3VsYXIgYXVk aW8gc3RyZWFtIGFuZCBvbmUgd2l0aCB0aGUgc3R1ZGlv4oCZcyB2aWRlby4NCjwvbGk+PGxpPkRy b3Agb3Igc3BlY2lmeSB3aGljaCBtZXRhZGF0YSBvciB0cmFjayBtYXJrcyB0cmFjayBzaG91bGQg YmUgdXNlZC4gPC9saT48bGk+QXBwbHkgc3BlY2lmaWMgYXVkaW8gZWZmZWN0IG9yIGVuY29kaW5n IHRvIGRpZmZlcmVudCB0cmFja3MgPC9saT48L3VsPg0KPHA+QW5kIG11Y2ggbW9yZSEgVGhlIGZ1 bGwgZG9jdW1lbnRhdGlvbiBpcyA8YSBocmVmPSJodHRwczovL3d3dy5saXF1aWRzb2FwLmluZm8v ZG9jLTIuMi4wL211bHRpdHJhY2suaHRtbCI+DQpoZXJlPC9hPi4gV2UgcGxhbiBvbiBleHBhbmRp bmcgdGhpcyBzdXBwb3J0IGluIHRoZSBmdXR1cmUgaW4gcGFydGljdWxhciB0byBhbGxvdyB0cmFj ayBzZWxlY3Rpb24gYmFzZWQgb24gbGFuZ3VhZ2UsIGVuY29kZWQgY29udGVudCBldGMuDQo8L3A+ DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc0ZGJhZjg3Ij48L2E+8J+Pt++4jyBITFMgbWV0 YWRhdGE8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNGRiYWY4 NyI+DQo8cD5BdCBsYXN0ISBXZSBub3cgc3VwcG9ydCBtZXRhZGF0YSBpbiBITFMgc3RyZWFtcyB1 c2luZyBhIHRpbWVkIElEMyBzdHJlYW0gZm9yIDxjb2RlPg0KbXBlZ3RzPC9jb2RlPiBjb250YWlu ZXIgYW5kIHBsYWluIElEM3YyIHRhZ3MgZm9yIDxjb2RlPmFkdHM8L2NvZGU+LCA8Y29kZT5tcDM8 L2NvZGU+LA0KPGNvZGU+YWMzPC9jb2RlPiBhbmQgPGNvZGU+ZWFjMzwvY29kZT4gZm9ybWF0cy4g VGhlcmUgaXMgY3VycmVudGx5IG5vIHN1cHBvcnQgZm9yIG1ldGFkYXRhIHdpdGgNCjxjb2RlPm1w NDwvY29kZT4gY29udGFpbmVycy4gPC9wPg0KPHA+VGhpcyBmZWF0dXJlIGlzIDxiPmVuYWJsZWQg YnkgZGVmYXVsdDwvYj4gc28geW91IG1pZ2h0IHdhbnQgdG8gY2hlY2sgaWYgaXQgaW1wYWN0cyB5 b3VyIGxpc3RlbmVycyBiZWZvcmUgcHVzaGluZyBpdCB0byBwcm9kdWN0aW9uLiBJdCBjYW4gYmUg dHVybmVkIG9mZiBieSBzZXR0aW5nDQo8Y29kZT5pZDM8L2NvZGU+IHRvIGZhbHNlIG9uIHlvdXIg SExTIHN0cmVhbXMuIDwvcD4NCjxwPkZ1bGwgZG9jdW1lbnRhdGlvbiBpcyA8YSBocmVmPSJodHRw czovL3d3dy5saXF1aWRzb2FwLmluZm8vZG9jLTIuMi4wL2hsc19vdXRwdXQuaHRtbCNtZXRhZGF0 YSI+DQpoZXJlPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNjJjODU0MyI+ PC9hPvCfjqggQ29sb3JlZCBsb2dzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlk PSJ0ZXh0LW9yZzYyYzg1NDMiPg0KPHA+U21hbGwgY2hhbmdlIGJ1dCBub3QgdGhlIGxlYXN0IGlt cG9ydGFudCEgTG9ncyBhcmUgbm93IGNvbG9yZWQgYnkgZGVmYXVsdCB3aGVuIHByaW50ZWQgb24g dGhlIGNvbnNvbGUuIFRoaXMgZmluYWxseSBtYWtlcyBpdCBwb3NzaWJsZSB0byByZWFkIGxvZ3Mg d2l0aCBoaWdoIGxldmVsIG9mIGRldGFpbHMhDQo8L3A+DQo8cD5XZSBhcmUgYXdhcmUgb2YgdGhl IG5lZWQgZm9yIG1vcmUgZGV2ZWxvcGVyIHRvb2xpbmcgYW5kIHF1YWxpdHkgb2YgbGlmZSBpbXBy b3ZlbWVudHMhIEluIHRoZSBuZXh0IHJlbGVhc2UgY3ljbGUsIHdlIGhvcGUgdG8gd29yayBvbiBj b2RlIGZvcm1hdHRpbmcsIGhpZ2hsaWdodGluZyBhbmQgbW9yZSENCjwvcD4NCjwvZGl2Pg0KPC9s aT48bGk+PGEgaWQ9Im9yZzcwNmM3NmEiPjwvYT7wn5W477iPIE5ldyBIVFRQIEFQSTxicj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc3MDZjNzZhIj4NCjxwPkludGVy YWN0aW5nIHdpdGggeW91ciBzY3JpcHRzIGlzIGVzc2VudGlhbCBhbmQsIGZvciB0aGlzLCB3ZWIg aW50ZXJmYWNlcyBhbmQgQVBJcyBhcmUgcmVhbGx5IHVzZWZ1bC4gSW4gb3JkZXIgdG8gbWFrZSBv dXIgSFRUUCBzZXJ2ZXIgZWFzaWVyIHRvIHVzZSwgd2Ugd3JvdGUgYSBuZXcgd2ViIEFQSSB0aGF0 IGlzIHZlcnkgY2xvc2UgdG8gbm9kZSBleHByZXNz4oCZIEFQSSBhbmQgc2hvdWxkIGJlIGZhaXJs eSBlYXN5IHRvIHVzZSEgVGhlIGRvY3VtZW50YXRpb24NCiBpcyA8YSBocmVmPSJodHRwczovL3d3 dy5saXF1aWRzb2FwLmluZm8vZG9jLTIuMi4wL2hhcmJvcl9odHRwLmh0bWwjbm9kZWV4cHJlc3Mt YXBpIj4NCmhlcmU8L2E+IDwvcD4NCjxwPlRoZXNlIGNoYW5nZXMgYWxzbyBpbmNsdWRlZCBhIHJl dmFtcGluZyBvZiBvdXIgU1NMIHN1cHBvcnQgd2hpY2ggaXMgbm93IG1vZHVsYXIgYW5kIHdpdGgg YSBuZXcgVExTIG9wdGlvbmFsIHN1cHBvcnQhDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlk PSJvcmc0ZThkZTEyIj48L2E+8J+Omu+4jyBOYXRpdmUgc3RlcmVvdG9vbCBzdXBwb3J0PGJyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzRlOGRlMTIiPg0KPHA+V2hp bGUgY29tbWl0ZWQgdG8gb3Blbi1zb3VyY2UgdGhyb3VnaCBhbmQgdGhyb3VnaCwgd2UgYWxzbyBk byB3YW50IHRvIG1lZXQgb3VyIHVzZXJzIHdoZXJlIHRoZXkgYXJlLiBUbyB0aGlzIGVuZCwgaXQg c2VlbXMgdGhhdCBhIGxvZiBvZiB0aGVtIHdhbnQgdG8gdXNlIHRoZSBwcm9wcmlldGFyeSBzdGVy ZW90b29sIGF1ZGlvIHByb2Nlc3NpbmcuIFVwIHVudGlsIHRoaXMgdmVyc2lvbiwgdGhlIG9ubHkg b3B0aW9uIHdhcyB2aWEgdGhlIGV4dGVybmFsDQogY29tbWFuZCBsaW5lIGVuY29kZXIgYW5kIHRo aXMgd2FzIG5vdCBzYXRpc2ZhY3RvcnkuIDwvcD4NCjxwPldpdGggdGhpcyByZWxlYXNlLCBpdCBp cyBub3cgcG9zc2libGUgdG8gdXNlIHRoZSBzaGFyZWQgbGlicmFyeSBkaXN0cmlidXRlZCBieSB0 aGUgYXV0aG9yLCB3aGljaCBwcm92aWRlcyBzdXBwb3J0IGZvciBhbiBuZXcNCjxjb2RlPnN0ZXJl b3Rvb2w8L2NvZGU+IGludGVybmFsIG9wZXJhdG9yIHRoYXQgaXMgbXVjaCBlYXNpZXIgdG8gaW50 ZWdyYXRlLiBTZWUgdGhlIGRvY3VtZW50YXRpb24NCjxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpcXVp ZHNvYXAuaW5mby9kb2MtMi4yLjAvc3RlcmVvdG9vbC5odG1sIj5oZXJlPC9hPi4gPC9wPg0KPC9k aXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnYmRiNzA0NSI+PC9hPvCfk58gUmVjb3JkcyBlbmhhbmNl bWVudHM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYmRiNzA0 NSI+DQo8cD5BcyBwYXJ0IG9mIHRoZSBsYW5ndWFnZSBjaGFuZ2VzIHJlcXVyZWQgZm9yIG11bHRp dHJhY2ssIHdlIG5vdyBzdXBwb3J0IHRoZSBmb2xsb3dpbmcgb3BlcmF0aW9ucyBvbiByZWNvcmRz Og0KPC9wPg0KPHA+UmVjb3JkIHNwcmVhZDogPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9 Im9yZzU5Y2RlMjQiPg0KbGV0IHtmb28sIGJhciwgLi4ucmVzdH0gPSBzb21lUmVjb3JkDQoNCmxl dCBvdGhlclJlY29yZCA9IHsgYmxhID0gJnF1b3Q7YmxvJnF1b3Q7LCAuLi5zb21lUmVjb3JkIH0N CjwvcHJlPg0KPHA+QWRkaXRpb25hbGx5LCB3ZSBub3cgc3VwcG9ydCBvcHRpb25hbCByZWNvcmQg bWV0aG9kcywgZm9yIGluc3RhbmNlOiA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3Jn Y2IyZDNiMCI+DQpkZWYgZih4KSA9DQogIGlmIHg/LmZvbyA9PSBudWxsKCkgdGhlbg0KICAgIHBy aW50KCZxdW90O3ggZG9lcyBub3QgaGF2ZSBtZXRob2QgZm9vJnF1b3Q7KQ0KICBlbHNlDQogICAg cHJpbnQoJnF1b3Q7eCBoYXMgbWV0aG9kIGZvbyZxdW90OykNCiAgZW5kDQplbmQNCjwvcHJlPg0K PC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnN2IwNWJhMiI+PC9hPvCfqqIgU3VwcG9ydCBmb3Ig WUFNTCBwYXJzaW5nL3JlbmRlcmluZzxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmc3YjA1YmEyIj4NCjxwPkZvbGxvd2luZyB0aGUgcmVjZW50IDxhIGhyZWY9Imh0 dHBzOi8vd3d3LmxpcXVpZHNvYXAuaW5mby9kb2MtMi4yLjAvanNvbi5odG1sIj4NCkpTT04gcGFy c2luZzwvYT4gZmVhdHVyZSwgd2Ugbm93IHN1cHBvcnQgPGEgaHJlZj0iaHR0cHM6Ly93d3cubGlx dWlkc29hcC5pbmZvL2RvYy0yLjIuMC95YW1sLmh0bWwiPg0KWUFNTCBwYXJzaW5nPC9hPiBpbiBh IHZlcnkgc2ltaWxhciB3YXkgYXMganNvbi4gPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0i b3JnNDEyMzVjYSI+PC9hPvCflK4gTWVtb3J5IG9wdGltaXphdGlvbjxicj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc0MTIzNWNhIj4NCjxwPldoaWxlIHdlIGFyZSBh d2FyZSB0aGF0IG1lbW9yeSBjb25zdW1wdGlvbiB3aXRoIHRoaXMgcmVsZWFzZSBtYXkgaGF2ZSBp bmNyZWFzZWQgYSBiaXQgZHVlIHRvIG9uLWdvaW5nIGNoYW5nZXMsIHdlIGhhdmUgZG9uZSBvdXIg YmVzdCB0byBpbnRyb2R1Y2UgbW9yZSB3YXlzIHRvIGNvbnRyb2wgaXQgYW5kIHVuZGVyc3RhbmQg aXRzIHVzYWdlLg0KPC9wPg0KPHA+SW4gcGFydGljdWxhciwgd2Ugbm93IHN1cHBvcnQgdGhlIGFs dGVybmF0aXZlIFtqZW1hbGxvY10oKSBtZW1vcnkgYWxsb2NhdG9yLCBlbmFibGVkIGluIGFsbCBv dXIgcmVsZWFzZSBhc3NldHMgYW5kIGNvbmZpZ3VyYWJsZSB2aWEgdGhlIGludGVybmFsIHNldHRp bmdzLg0KPC9wPg0KPHA+V2UgYWxzbyBpbnRyb2R1Y2VkIHR3byBuZXcgYXVkaW8gY29udGVudCBm b3JtYXRzLCA8Y29kZT5wY21fczE2PC9jb2RlPiBhbmQgPGNvZGU+DQpwY21fZjMyPC9jb2RlPiB0 aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIGF1ZGlvIGludGVybmFsbHkgYXMsIHJlc3AuLCAxNi1i aXQgc2lnbmVkIGludGVnZXJzIG9yIDMyLWJpdCBmbG9hdGluZyBwb2ludCBudW1iZXJzLiBPdXIg ZGVmYXVsdCBpbnRlcm5hbCBmb3JtYXQgYmVpbmcgT0NhbWzigJlzIG5hdGl2ZSA2NC1iaXQgZmxv YXRpbmcgcG9pbnQgbnVtYmVycy4NCjwvcD4NCjxwPldlIGFsc28gYWRkZWQgYSBuZXcgPGNvZGU+ dHJhY2suYXVkaW8uZGVmZXI8L2NvZGU+IG9wZXJhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gYnVm ZmVyIGxhcmdlIGFtb3VudCBvZiBhdWRpbyBkYXRhIHdpdGhvdXQgaW1wYWN0aW5nIHBlcmZvcm1h bmNlcy4NCjwvcD4NCjxwPllvdSBjYW4gcmVhZCBtb3JlIGFib3V0IG1lbW9yeSB1dGlsaXphdGlv biBpbiBsaXF1aWRzb2FwIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpcXVpZHNvYXAuaW5mby9kb2Mt Mi4yLjAvbWVtb3J5Lmh0bWwiPg0KaGVyZTwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEg aWQ9Im9yZzNkYWQ2ZjAiPjwvYT7wn5CqIFN3aXRjaCB0byA8Y29kZT5kdW5lPC9jb2RlPiBhbmQg amF2YXNjcmlwdCBydW50aW1lPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0 ZXh0LW9yZzNkYWQ2ZjAiPg0KPHA+V2hpbGUgcGVyaGFwcyBtb3JlIGV4Y2l0aW5nIHRvIGRldmVs b3BlcnMsIHRoZSBwcm9qZWN0IGhhcyBub3cgZnVsbHkgbW92ZWQgdG8gdGhlIE9DYW1sDQo8Y29k ZT5kdW5lPC9jb2RlPiBidWlsZGVyLiBUaGlzIHByb3ZpZGVzIGFuIGV4dHJhIGxldmVsIG9mIGZs ZXhpYmlsaXR5LCBJbiBwYXJ0aWN1bGFyLCB3ZSB3ZXJlIGFibGUgdG8gZXh0cmFjdCB0aGUgY29k ZSB0aGF0IGlzIHNwZWNpZmljIHRvIHRoZSBsaXF1aWRzb2FwIGxhbmd1YWdlLCB0aGF0IGlzIGV2 ZXJ5dGhpbmcgdGhhdCBwZXJ0YWlucyB0byBwYXJzaW5nL2V2YWx1YXRpbmcvdHlwZSBjaGVja2lu ZyB3aXRob3V0IHRoZSBzdHJlYW1pbmcgYW5kDQogc3lzdGVtIHNwZWNpZmljIG9wZXJhdG9ycyBh bmQgZXhwb3J0IGl0IGFzIGFuIDxhIGhyZWY9Imh0dHBzOi8vd3d3LmxpcXVpZHNvYXAuaW5mby90 cnkvIj4NCm9ubGluZSBwbGF5Z3JvdW5kPC9hPi4gV2XigJlyZSBub3Qgc3VyZSB5ZXQgd2hhdCB3 ZeKAmWxsIGRvIHdpdGggaXQuIEl0IG1pZ2h0IGJlIHBvc3NpYmxlLCBmb3IgaW5zdGFuY2UsIHRv IHdyaXRlIGEgamF2YXNjcmlwdCBiYWNrZW5kIHRvIHVzZSBsaXF1aWRzb2FwIHNjcmlwdHMgd2l0 aCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3Mv V2ViL01lZGlhIj5XZWIgbWVkaWEgQVBJczwvYT4hIDwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwZjRiYTJjIiBjbGFzcz0ib3V0 bGluZS00Ij4NCjxoNCBpZD0ib3JnMGY0YmEyYyI+8J+Vte+4jyBWZXJzaW9uaW5nIGFuZCByZWxl YXNlIGFzc2V0czwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn MGY0YmEyYyI+DQo8cD5Gb3IgYSBsaXR0bGUgb3ZlciBhIHllYXIgbm93LCB3ZSBoYXZlIHN3aXRj aGVkIHRvIDxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPnJvbGxpbmcgcmVsZWFzZSBjeWNsZXM8L3Nw YW4+IHdpdGggbWFpbnRlbmFuY2UgYW5kIGJ1Z2ZpeGVzIGFwcGx5aW5nIG9ubHkgdG8gdGhlIGN1 cnJlbnQgcmVsZWFzZSBjeWNsZS4gUmVndWxhciByZWxlYXNlcyBhcmUgdGFnZ2VkDQo8Y29kZT52 WC5ZLlo8L2NvZGU+IChmb3IgaW5zdGFuY2UgPGNvZGU+djIuMi4wPC9jb2RlPikgb24gZ2l0aHVi IGFuZCBkb2NrZXIgd2hpbGUgb24tZ29pbmcgcmVsZWFzZXMgYXJlIHRhZ2dlZA0KPGNvZGU+cm9s bGluZy1yZWxlYXNlLXZYLlkuWjwvY29kZT4uIDwvcD4NCjxwPldoZW4gYW4gaW5pdGlhbCByZWxl YXNlLCBmb3IgaW5zdGFuY2UgPGNvZGU+Mi4yLjA8L2NvZGU+LCBpcyBiZWluZyB3b3JrZWQgb24s IGJ1Z2ZpeGVzIGFuZCB1c2VyIGlzc3VlcyB3ZXJlIGJlaW5nIGFkZHJlc3NlZCBmb3IgdXNlcnMg dXNpbmcgdGhlDQo8Y29kZT4yLjEueDwvY29kZT4gcmVsZWFzZXMuIFdoaWxlIHdlIHdvdWxkIGxp a2UgdG8gZXh0ZW5kIHN1cHBvcnQsIHRoaXMgaXMgdGhlIGJlc3QgdGhhdCB3ZSBjYW4gZG8gd2l0 aCBvdXIgbGltaXRlZCByZXNvdXJjZXMhDQo8L3A+DQo8cD5BdCBhbnkgZ2l2ZW4gdGltZSwgdGhl IDxjb2RlPnJvbGxpbmctcmVsZWFzZS12WC5ZLlo8L2NvZGU+IGRlbm90ZXMgdGhlIHJlbGVhc2Vk IGJlaW5nIHdvcmtlZCBvbi4gRm9yIHN0YWJsZSByZWxlYXNlcyBicmFuY2hlcywgdGhpcyB3b3Vs ZCBiZSBmb3IgaW5zdGFuY2UsDQo8Y29kZT5yb2xsaW5nLXJlbGVhc2UtdjIuMi4xPC9jb2RlPiBh ZnRlciByZWxlYXNlIDxjb2RlPnYyLjIuMDwvY29kZT4uIEZvciBhIHlldC10by1iZSByZWxlYXNl ZCBpbml0aWFsIHZlcnNpb24sIHRoaXMgd291bGQgYmUgZm9yIGluc3RhbmNlDQo8Y29kZT5yb2xs aW5nLXJlbGVhc2UtdjIuMy54PC9jb2RlPi4gV2UgdHJ5IG91ciBiZXN0IHRvIG1ha2UgdGhvc2Ug cmVsZWFzZXMgYXMgYnVnLWZyZWUgYXMgcG9zc2libGUuIFVzaW5nIG9uZSBvZiB0aGVtIHRvIHRl c3QgeW91ciBwcm9kdWN0aW9uIHNjcmlwdCBhbHNvIGd1YXJhbnRlZXMgdGhlIGZhc3Rlc3QgcmVz cG9uc2UgdG8gYnVncyBhbmQgaXNzdWVzIQ0KPC9wPg0KPHA+Rm9yIHJlbGVhc2UgYXNzZXRzLCB3 ZSB0cnkgdG8gbWFpbnRhaW4gdHdvIHBhY2thZ2VzIGZvciBkZWJpYW4gYW5kIHVidW50dSBkaXN0 cmlidXRpb25zLCBvbmUgd2l0aCB0aGUgbGF0ZXN0IExUUyBvciBzdGFibGUgYW5kIG9uZSB3aXRo IGEgcmVjZW50IHJlbGVhc2UuIFRoZSBuZXcNCjxjb2RlPm1pbmltYWw8L2NvZGU+IGFzc2V0cyBh cmUsIGFzIHRoZSBuYW1lIHN1Z2dlc3RzLCA8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5taW5pbWFs PC9zcGFuPiBidWlsZHMuIFRoZXkgY29udGFpbiBhIGxpbWl0ZWQgc2V0IG9mIGZlYXR1cmVzIGFu ZCBzdGFuZGFyZCBsaWJyYXJ5IG9wZXJhdG9ycy4gTWluaW1hbCBidWlsZHMgYXJlIGludGVuZGVk IGZvciBtb3N0IHByb2R1Y3Rpb24gcnVuIGFuZCBzaG91bGQgbGltaXQgdGhlIHJpc2sgZm9yIGlz c3Vlcw0KIHN1Y2ggYXMgc2VnZmF1bHQgYW5kIGV0Yy4gSWYgeW91ciBzY3JpcHQgY2FuIHJ1biB3 aXRoIGl0LCB3ZSByZWNvbW1lbmQgaXQgb3ZlciB0aGUgZnVsbHkgZmVhdHVyZWQgYnVpbGRzLg0K PC9wPg0KPHA+Rm9yIGVhY2ggcmVsZWFzZSBhc3NldCwgeW91IGNhbiBjb25zdWx0IHRoZSBhc3Nv Y2lhdGVkIDxjb2RlPi5jb25maWc8L2NvZGU+IGZpbGUgdG8gc2VlIHdoaWNoIGZlYXR1cmVzIGFy ZSBlbmFibGVkLg0KPC9wPg0KPHA+RG9ja2VyIHJlbGVhc2UgaW1hZ2VzIGFyZSBsb2NhdGVkIGF0 OiA8Y29kZT5zYXZvbmV0L2xpcXVpZHNvYXA6djIuMi4wPC9jb2RlPi4gVGhlIHJlbGVhc2UgdGFn IG1heSBiZSB1cGRhdGVkIGlmIG5lZWRlZC4gWW91IGNhbiB1c2UgZ2l0IHNoYS1iYXNlZCBpbWFn ZXMgdG8gcGljayBhIGZpeGVkIGJ1aWxkLCBlLmcuDQo8Y29kZT5zYXZvbmV0L2xpcXVpZHNvYXA6 Jmx0O3NoYSZndDs8L2NvZGU+IDwvcD4NCjxwPkxhc3RseSwgd2UgbWF5IHVwZGF0ZSB0aGUgbGlz dCBvZiByZWxlYXNlIGFzc2V0cyBvbiB0aGUgZ2l0aHViIHJlbGVhc2UgcGFnZS4gSWYgeW91IGFy ZSBsb29raW5nIGZvciBwZXJtYW5lbnQgcmVsZWFzZSBhc3NldCBsaW5rcyBtYWtlIHN1cmUgdG8g Y2hlY2tvdXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYXZvbmV0L2xpcXVpZHNvYXAt cmVsZWFzZS1hc3NldHMiPnNhdm9uZXQvbGlxdWlkc29hcC1yZWxlYXNlLWFzc2V0czwvYT4uDQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMDRiZDdh NyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzA0YmQ3YTciPvCfp64gTWlncmF0aW9u IGd1aWRlPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcwNGJk N2E3Ij4NCjxwPldlIGxpc3RlZCBtb3N0IG9mIHRoZSBtaWdyYXRpb24gaXNzdWVzIHlvdSBtaWdo dCBydW4gaW50byBvbiA8YSBocmVmPSJodHRwczovL3d3dy5saXF1aWRzb2FwLmluZm8vZG9jLTIu Mi4wL21pZ3JhdGluZy5odG1sIj4NCnRoaXMgcGFnZTwvYT4uIFRoZSBkZXRhaWxlZCBjaGFuZ2Vs b2cgYmVsb3cgbWF5IGFsc28gaGVscC4gPC9wPg0KPHA+QXMgYSByZW1pbmRlciwgd2Ugc3Ryb25n bHkgcmVjb21tZW5kIHRvIHRlc3QgeW91ciBzY3JpcHQgaW4gYSBzdGFnZ2luZyBlbnZpcm9ubWVu dCwgZXZlbiBiZXR3ZWVuIG1pbm9yIHJlbGVhc2VzLCB0byBtYWtlIHN1cmUgdGhhdCBldmVyeXRo aW5nIGlzIHdvcmtpbmcgY29ycmVjdGx5IGJlZm9yZSBwdXNoaW5nIGEgbmV3IGxpcXVpZHNvYXAg dmVyc2lvbiB0byBwcm9kdWN0aW9uIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjEyIj5rY2FzIGFuZCBrY2FzX2RhdGEgMC42LjE6IFNUTSBhbmQgY29tcG9zaXRpb25h bCBsb2NrLWRyZWUgZGF0YSBzdHJ1Y3R1cmVzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC0xMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWtjYXMtYW5kLWtjYXMtZGF0YS0wLTYtMS1zdG0tYW5kLWNvbXBvc2l0 aW9uYWwtbG9jay1kcmVlLWRhdGEtc3RydWN0dXJlcy8xMjY3NC8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4ta2Nhcy1hbmQta2Nhcy1kYXRhLTAtNi0xLXN0bS1hbmQtY29tcG9z aXRpb25hbC1sb2NrLWRyZWUtZGF0YS1zdHJ1Y3R1cmVzLzEyNjc0LzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzBhYTY3ZDYiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmcwYWE2N2Q2Ij5WZXNhIEthcnZvbmVuIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGFhNjdkNiI+DQo8cD5J4oCZ bSBoYXBweSB0byBhbm5vdW5jZSB0aGF0IHZlcnNpb24gMC42LjEgb2YgPGNvZGU+a2NhczwvY29k ZT4gYW5kIDxjb2RlPmtjYXNfZGF0YTwvY29kZT4gaGFzIGJlZW4gcmVsZWFzZWQgb24gb3BhbS4N CjwvcD4NCjxwPlNlZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9rY2FzLyNyZWFkbWUiPktjYXM8L2E+IHByb2plY3QgZm9yIG1vcmUgZGV0YWlscywgYnV0 IGJyaWVmbHkNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9rY2Fz L2RvYy9rY2FzL0tjYXMvaW5kZXguaHRtbCI+PGI+a2NhczwvYj48L2E+IHByb3ZpZGVzIGEgc29m dHdhcmUgdHJhbnNhY3Rpb25hbCBtZW1vcnkgKFNUTSkgaW1wbGVtZW50YXRpb24gYW5kDQo8YSBo cmVmPSJodHRwczovL29jYW1sLW11bHRpY29yZS5naXRodWIuaW8va2Nhcy9kb2Mva2Nhc19kYXRh L0tjYXNfZGF0YS9pbmRleC5odG1sIj4NCjxiPmtjYXNfZGF0YTwvYj48L2E+IHByb3ZpZGVzIGNv bXBvc2l0aW9uYWwgbG9jay1mcmVlIGRhdGEgc3RydWN0dXJlcyBpbXBsZW1lbnRlZCB1c2luZyBL Y2FzLiBUb2dldGhlciB0aGVzZSBsaWJyYXJpZXMgYWxsb3cgb25lIHRvIGltcGxlbWVudCBzYWZl IGNvbmN1cnJlbnQgYWJzdHJhY3Rpb25zIGNvbXBvc2l0aW9uYWxseS4NCjwvcD4NCjxwPkFzaWRl IGZyb20gaW50ZXJuYWwgaW1wcm92ZW1lbnRzLCBub3RhYmxlIGZlYXR1cmVzIGFkZGVkIHNpbmNl IHRoZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWtjYXMtYW5kLWtj YXMtZGF0YS0wLTMtMC1zb2Z0d2FyZS10cmFuc2FjdGlvbmFsLW1lbW9yeS8xMjA4NSI+DQpwcmV2 aW91c2x5IGFubm91bmNlZCAwLjMuMDwvYT4gdmVyc2lvbiBpbmNsdWRlOiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+RG91Ymx5IGxpbmtlZCBsaXN0IDxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwtbXVsdGljb3JlLmdpdGh1Yi5pby9rY2FzL2RvYy9rY2FzX2RhdGEvS2Nhc19kYXRhL0RsbGlz dC9pbmRleC5odG1sIj4NCjxjb2RlPkRsbGlzdDwvY29kZT48L2E+LCBzZWUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9rY2FzI2EtdHJhbnNhY3Rpb25hbC1scnUt Y2FjaGUiPg0KZXhhbXBsZTwvYT4uIDwvbGk+PGxpPlN5bmNocm9uaXppbmcgdmFyaWFibGUgPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2tjYXMvZG9jL2tjYXNfZGF0 YS9LY2FzX2RhdGEvTXZhci9pbmRleC5odG1sIj4NCjxjb2RlPk1WYXI8L2NvZGU+PC9hPiwgc2Vl IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUva2NhcyN0aGUtZGlu aW5nLXBoaWxvc29waGVycy1wcm9ibGVtIj4NCmV4YW1wbGU8L2E+LiA8L2xpPjxsaT48YSBocmVm PSJodHRwczovL29jYW1sLW11bHRpY29yZS5naXRodWIuaW8va2Nhcy9kb2Mva2Nhcy9LY2FzL1h0 L2luZGV4Lmh0bWwjbmVzdGVkLXRyYW5zYWN0aW9ucyI+TmVzdGVkIGNvbmRpdGlvbmFsIHRyYW5z YWN0aW9uczwvYT4sIHNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9rY2FzI2xvZy11cGRhdGVzLW9wdGltaXN0aWNhbGx5Ij5leGFtcGxlPC9hPi4NCjwvbGk+ PGxpPlRpbWVvdXRzLCBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9rY2FzI3RpbWVvdXRzIj5leGFtcGxlPC9hPi4NCjwvbGk+PGxpPlN1cHBvcnQgZm9yIE9D YW1sIDQuMTQsIGFsbG93aW5nIEtjYXMgdG8gYmUgdXNlZCB0byBpbXBsZW1lbnQgc3lzdGhyZWFk IGFuZCBwYXJhbGxlbGlzbSBzYWZlIGNvZGUgYW5kIGhlbHAgcHJvamVjdHMgcmVxdWlyaW5nIE9D YW1sIDQgc3VwcG9ydCBvbiB0aGVpciB3YXkgdG8gT0NhbWwgNS4NCjwvbGk+PC91bD4NCjxwPlN0 YXkgdHVuZWQgZm9yIG1vcmUgbmV3cyBvbiBLY2FzISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjEzIj5jdHlwZXMgMC4yMS4xLCBub3cgd2l0aCBkdW5lIHN1cHBvcnQ8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEzIj4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3R5cGVzLTAtMjEtMS1ub3ctd2l0 aC1kdW5lLXN1cHBvcnQvMTI2NzUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWN0eXBlcy0wLTIxLTEtbm93LXdpdGgtZHVuZS1zdXBwb3J0LzEyNjc1LzE8L2E+IDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzBlY2ViNCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzMwZWNlYjQiPnlhbGxvcCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzMwZWNlYjQiPg0KPHA+SeKAmW0gaGFw cHkgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20veWFsbG9wL29jYW1sLWN0eXBlcy8iPg0KY3R5cGVzPC9hPiwgMC4yMS4xLCBhdmFpbGFibGUg Zm9yIGluc3RhbGxhdGlvbiB2aWEgT1BBTS4gPC9wPg0KPHA+Y3R5cGVzIGlzIGEgbGlicmFyeSBm b3IgYmluZGluZyB0byBDIGxpYnJhcmllcyB1c2luZyBwdXJlIE9DYW1sLCB3aXRoIHRoZSBwcmlt YXJ5IGFpbSBvZiBtYWtlIHdyaXRpbmcgQyBleHRlbnNpb25zIGFzIHN0cmFpZ2h0Zm9yd2FyZCBh cyBwb3NzaWJsZS4NCjwvcD4NCjxwPlRoZSBjb3JlIG9mIGN0eXBlcyBpcyBhIHNldCBvZiBjb21i aW5hdG9ycyBmb3IgZGVzY3JpYmluZyB0aGUgc3RydWN0dXJlIG9mIEMgdHlwZXMg4oCTIG51bWVy aWMgdHlwZXMsIGFycmF5cywgcG9pbnRlcnMsIHN0cnVjdHMsIHVuaW9ucyBhbmQgZnVuY3Rpb25z LiBZb3UgY2FuIHVzZSB0aGVzZSBjb21iaW5hdG9ycyB0byBkZXNjcmliZSB0aGUgdHlwZXMgb2Yg dGhlIGZ1bmN0aW9ucyB0aGF0IHlvdSB3YW50IHRvIGNhbGwsIHRoZW4gYmluZCBkaXJlY3RseQ0K IHRvIHRob3NlIGZ1bmN0aW9ucyDigJMgYWxsIHdpdGhvdXQgd3JpdGluZyBhbnkgQyEgPC9wPg0K PHA+VGhlIG1ham9yIGNoYW5nZSBpbiB0aGlzIHJlbGVhc2UgaXMgYSBzd2l0Y2ggdG8gdGhlIGR1 bmUgYnVpbGQgc3lzdGVtLCBjb250cmlidXRlZCBieSBBbmlsIE1hZGhhdmFwZWRkeSAoQGF2c20p IGFuZCBFdGllbm5lIE1pbGxvbiAoQGVtaWxsb24pLiBUaGUgYmVuZWZpdHMgb2YgdGhpcyBjaGFu Z2UgZm9yIHVzZXJzIG9mIGN0eXBlcyBhcmUgZGVzY3JpYmVkIGluDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20veWFsbG9wL29jYW1sLWN0eXBlcy9wdWxsLzU4OCI+dGhlIHB1bGwgcmVxdWVz dCBpbXBsZW1lbnRpbmcgdGhlIGNoYW5nZTwvYT47IGluIHN1bW1hcnk6DQo8L3A+DQo8YmxvY2tx dW90ZT4NCjxwPldpdGggYSBwb3J0IHRvIDxjb2RlPmR1bmU8L2NvZGU+LCB0aGUgY3R5cGVzIGxp YnJhcnkgY2FuIGJlIGVtYmVkZGVkIGluIGxhcmdlciBkdW5lIHByb2plY3RzIHNpbXBseSBieSBp bmNsdWRpbmcgaXQgaW4gdGhlIGRpcmVjdG9yeSB0cmVlIG9mIHRoZSBiaWdnZXIgcHJvamVjdC4N CjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v eWFsbG9wL29jYW1sLWN0eXBlcy9ibG9iLzAuMjEuMS9DSEFOR0VTLm1kIj5yZWxlYXNlIG5vdGVz PC9hPiBoYXZlIGZ1cnRoZXIgZGV0YWlscyBvZiB0aGUgY2hhbmdlcyBpbiB0aGlzIHJlbGVhc2Ug YW5kIHJlY2VudCBwb2ludCByZWxlYXNlcy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTE0IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMTQiPkFubm91bmNpbmcgdGhlIG9jYW1sLXdhc20gb3JnYW5pc2F0aW9uPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5ub3VuY2luZy10aGUtb2NhbWwtd2FzbS1v cmdhbmlzYXRpb24vMTI2NzYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5ub3Vu Y2luZy10aGUtb2NhbWwtd2FzbS1vcmdhbmlzYXRpb24vMTI2NzYvMTwvYT4gPC9wPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4NGNiYzQ4IiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnODRjYmM0OCI+S0MgU2l2YXJhbWFrcmlzaG5hbiBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzg0Y2JjNDgiPg0KPHA+ V2UgYXJlIGhhcHB5IHRvIGFubm91bmNlIHRoZSBjcmVhdGlvbiBvZiB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLXdhc20iPg0Kb2NhbWwtd2FzbTwvYT4gR2l0aHViIG9yZ2Fu aXNhdGlvbiB3aGljaCB3aWxsIHdvcmsgdG93YXJkcyA8YSBocmVmPSJodHRwczovL3dlYmFzc2Vt Ymx5Lm9yZy8iPg0KV2ViQXNzZW1ibHk8L2E+IChXYXNtKSBzdXBwb3J0IGZvciBPQ2FtbC4gVGhl IGdvYWwgb2YgdGhlIG9yZ2FuaXNhdGlvbiBpcyB0byBlbmFibGUgdXNlcnMgdG8gYnVpbGQgaGln aC1wZXJmb3JtYW5jZSBhbmQgc2VjdXJlIGFwcGxpY2F0aW9ucyBmb3IgdGhlIFdhc20gcGxhdGZv cm0gdXNpbmcgdGhlIE9DYW1sIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCB0aGUgcGxhdGZvcm0g dG9vbHMuDQo8L3A+DQo8cD5XYXNtIGlzIGEgYmluYXJ5IGluc3RydWN0aW9uIGZvcm1hdCwgZGVz aWduZWQgYXMgYSBwb3J0YWJsZSBjb21waWxhdGlvbiB0YXJnZXQgZm9yIHByb2dyYW1taW5nIGxh bmd1YWdlcywgZW5hYmxpbmcgZGVwbG95bWVudCBvbiB0aGUgV2ViIGZvciBjbGllbnQgYW5kIHNl cnZlciBhcHBsaWNhdGlvbnMuIEl0IHByb3ZpZGVzIGEgc2FuZGJveGVkIGV4ZWN1dGlvbiBlbnZp cm9ubWVudCwgd2hpY2ggYWxzbyBtYWtlcyBpdCBhdHRyYWN0aXZlIGZvcg0KIGJvdGggYmxvY2tj aGFpbnMgYW5kIENsb3VkIGRlcGxveW1lbnQuIEZvciBleGFtcGxlLCBGYXN0bHnigJlzIDxhIGhy ZWY9Imh0dHBzOi8vZG9jcy5mYXN0bHkuY29tL3Byb2R1Y3RzL2NvbXB1dGUtYXQtZWRnZSI+DQpD b21wdXRlQEVkZ2UgcGxhdGZvcm08L2E+IGlzIGJhc2VkIG9uIFdlYkFzc2VtYmx5LiA8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVhYjc1ZjIiIGNsYXNzPSJvdXRs aW5lLTQiPg0KPGg0IGlkPSJvcmc1YWI3NWYyIj5Db21waWxlcnM8L2g0Pg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzVhYjc1ZjIiPg0KPHA+VGhlIG9jYW1sLXdhc20g b3JnYW5pc2F0aW9uIGJyaW5ncyB0b2dldGhlciB0aGUgb25nb2luZyBlZmZvcnRzIGF0IGNvbXBp bGluZyBPQ2FtbCB0byBXYXNtLg0KPC9wPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaWQ9Im9yZzc3ZDMzOWUiPjwvYT53YXNvY2FtbDxicj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC01IiBpZD0idGV4dC1vcmc3N2QzMzllIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vb2Nh bWxwcm8uY29tLyI+T0NhbWxQcm88L2E+IGhhcyBiZWVuIGRldmVsb3BpbmcgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLXdhc20vd2Fzb2NhbWwiPg0Kd2Fzb2NhbWw8L2E+LCA8YSBo cmVmPSJodHRwczovL29jYW1scHJvLmNvbS9ibG9nLzIwMjJfMTJfMTRfd2FzbV9hbmRfb2NhbWwv Ij5hbiBleHBlcmltZW50YWwgY29tcGlsZXIgYmFja2VuZDwvYT4gZm9yIE9DYW1sIHRoYXQgdGFy Z2V0cyBXYXNtIHN0YXJ0aW5nIGZyb20gdGhlIGZsYW1iZGEgaW50ZXJtZWRpYXRlIHJlcHJlc2Vu dGF0aW9uIG9mIHRoZSBPQ2FtbCBjb21waWxlci4gT0NhbWxQcm8gZW5naW5lZXJzIGhhdmUgYWxz byBiZWVuIGNvbnRyaWJ1dGluZw0KIHRvIHRoZSBXYXNtIEdDIHdvcmtpbmcgZ3JvdXAgdG8gZW5z dXJlIHRoYXQgdGhlIEdDIGFuZCBvdGhlciBleHRlbnNpb25zIGluIFdhc20gYXJlIGFtZW5hYmxl IHRvIHRhcmdldGluZyBPQ2FtbC4NCjwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzAz ZjlmNTkiPjwvYT53YXNtX29mX29jYW1sPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUi IGlkPSJ0ZXh0LW9yZzAzZjlmNTkiPg0KPHA+QWxvbmdzaWRlIHRoaXMgZWZmb3J0LCA8YSBocmVm PSJodHRwczovL3RhcmlkZXMuY29tLyI+VGFyaWRlczwvYT4gaGFzIGJlZW4gd29ya2luZyBvbiBp bXBsZW1lbnRpbmcNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21f b2Zfb2NhbWwiPndhc21fb2Zfb2NhbWw8L2E+LCBhIHRvb2xjaGFpbiB0byBjb21waWxlIE9DYW1s IHRvIFdlYkFzc2VtYmx5IGJhc2VkIG9uIHRoZSBiYXR0bGUtdGVzdGVkDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NzaWdlbi9qc19vZl9vY2FtbCI+anNfb2Zfb2NhbWw8L2E+IGNvbXBp bGVyLiBCb3RoIGpzX29mX29jYW1sIGFuZCB3YXNtX29mX29jYW1sIHVzZSBPQ2FtbCBieXRlY29k ZSBhcyB0aGUgaW5wdXQgYW5kIGVtaXQgSmF2YVNjcmlwdCBhbmQgV2FzbSByZXNwZWN0aXZlbHku DQo8L3A+DQo8cD5JdCBpcyBub3RhYmxlIHRoYXQgdGhlc2UgZWZmb3J0cyBzdGFydGVkIG9mZiBq b2ludGx5IGEgZmV3IHllYXJzIGFnbyB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9z YWJpbmUvb2NhbWwtdG8td2FzbS1vdmVydmlldy90cmVlL21hc3RlciI+DQphbiBleHBsb3JhdGlv bjwvYT4gYWltZWQgYXQgYWRkaW5nIGEgV2FzbSBiYWNrZW5kIHRvIE9DYW1sLiBBdCB0aGF0IHRp bWUsIGl0IHdhcyBjbGVhciB0aGF0IFdhc20gZGlkIG5vdCBoYXZlIGVub3VnaCBmZWF0dXJlcyB0 byBzdXBwb3J0IE9DYW1sIGVmZmljaWVudGx5LiBXaXRoIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBz ZXZlcmFsIGtleSBXYXNtIGV4dGVuc2lvbnMgaW4gYnJvd3NlciBlbmdpbmVzLCB0aGUgdGltZSBp cyByaWdodCBmb3IgdGhpcw0KIGVmZm9ydC4gPC9wPg0KPHA+VGhlcmUgZXhpc3Qgb3RoZXIgYXBw cm9hY2hlcyB0byBydW5uaW5nIE9DYW1sIHByb2dyYW1zIHVzaW5nIFdhc20gcnVudGltZXMsIHdo ZXJlIHRoZSBzcGVlZCBvZiBnZW5lcmF0ZWQgY29kZSBpcyBsZXNzIG9mIGEgY29uY2Vybi4gRm9y IGV4YW1wbGUsIGEgcmVsYXRpdmVseSBzdHJhaWdodGZvcndhcmQgYXBwcm9hY2ggaXMgdG8gY29t cGlsZSB0aGUgT0NhbWwgYnl0ZWNvZGUgaW50ZXJwcmV0ZXIgdG8gV2FzbSBhbmQgaW50ZXJwcmV0 IHRoZQ0KIGJ5dGVjb2RlIHByb2dyYW1zLiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2Vi bWFya2JhZ2Uvb2NhbWxydW4td2FzbSI+b2NhbWxydW4td2FzbTwvYT4gYW5kDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vcmVtaXhsYWJzL3dhc2ljYW1sIj53YXNpY2FtbDwvYT4gYXJlIHBv cnRzIG9mIHRoZSBPQ2FtbCBieXRlY29kZSBpbnRlcnByZXRlciB0byBXYXNtLiBXYXNpY2FtbCBm dXJ0aGVybW9yZSBoYXMgYSBjb21waWxlciBtb2RlIHNvbWV3aGF0IHNpbWlsYXIgdG8gd2FzbV9v Zl9vY2FtbCAoYnV0IHNpbXBsZXIpIHRoYXQgcGFyc2VzIGEgYnl0ZWNvZGUgZXhlY3V0YWJsZSBh bmQgdHJhbnNsYXRlcyBpdCBpbnRvDQogV2FzbS4gPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBp ZD0ib3JnMmRlZDIzZSI+PC9hPkV2b2x2aW5nIFdhc208YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNSIgaWQ9InRleHQtb3JnMmRlZDIzZSI+DQo8cD5XYXNtIGlzIGFuIGV2b2x2aW5nIHN0 YW5kYXJkLiBXYXNtIDEuMCBmb2N1c2VzIG9uIGxvdy1sZXZlbCBzdXBwb3J0IGZvciBjb21waWxp bmcgbG93LWxldmVsIGxhbmd1YWdlcyBzdWNoIGFzIEMgYW5kIEMmIzQzOyYjNDM7LiBUaGVyZSBh cmUgc2V2ZXJhbCBleHRlbnNpb25zIHVuZGVyIGRldmVsb3BtZW50IHdoaWNoIGFpbSB0byBwcm92 aWRlIHN1cHBvcnQgZm9yIHRhcmdldGluZyBoaWdoLWxldmVsIGxhbmd1YWdlcyBpbmNsdWRpbmcN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9nYyI+Z2FyYmFnZSBjb2xs ZWN0aW9uPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly92OC5kZXYvYmxvZy93YXNtLXRhaWwtY2FsbCI+ DQp0YWlsIGNhbGxzPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1dlYkFzc2VtYmx5 L3N0YWNrLXN3aXRjaGluZyI+c3RhY2sgc3dpdGNoaW5nPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS90aHJlYWRzIj50aHJlYWRzPC9hPi4gSW4gcGFydGlj dWxhciwgdGhlIFdhc20gZGV2ZWxvcG1lbnQgcHJvY2VzcyBpcyBjb21wbGV0ZWx5IG9wZW4gYW5k IGFueW9uZSBjYW4gcGFydGljaXBhdGUgaW4gdGhlIGV2b2x1dGlvbiBvZiBXYXNtLg0KPC9wPg0K PHA+VGhlIE9DYW1sUHJvIGVuZ2luZWVycyA8YSBocmVmPSJodHRwczovL29jYW1scHJvLmNvbS9i bG9nLzIwMjJfMTJfMTRfd2FzbV9hbmRfb2NhbWwvIj4NCmNvbnRyaWJ1dGVkPC9hPiB0byB0aGUg V2FzbSBHQyBleHRlbnNpb24gd2l0aCB0aGUgaGVscCBvZiB0aGVpciBleHBlcmltZW50YWwgZmxh bWJkYSB0byBXYXNtIGNvbXBpbGVyLiBCb3RoIE9DYW1sUHJvIGFuZCBUYXJpZGVzIGVuZ2luZWVy cyBhcmUgYWN0aXZlbHkgaW52b2x2ZWQgd2l0aCB0aGUgV2FzbSBkZXZlbG9wbWVudCBwcm9jZXNz IG9uIG11bHRpcGxlIGZyb250cy4gSGF2aW5nIG1vcmUgdGhhbiBvbmUgYXBwcm9hY2ggdG8gY29t cGlsZSBPQ2FtbA0KIHRvIFdhc20gYWxsb3dzIHVzIHRvIGJ1aWxkIGNvbXByZWhlbnNpdmUgZXZp ZGVuY2UgYW5kIG1ha2UgaW5mb3JtZWQgYXJndW1lbnRzIHRvIGluZmx1ZW5jZSB0aGUgZGVzaWdu IG9mIFdhc20gZXh0ZW5zaW9ucy4gSW4gYWRkaXRpb24sIGEgbWFqb3IgaW1wbGVtZW50YXRpb24g ZWZmb3J0IGlzIHRoZSBydW50aW1lIHN5c3RlbSBzdXBwb3J0IGZvciBXYXNtLWNvbXBpbGVkIE9D YW1sIGNvZGUsIHdoaWNoIHdpbGwgYmUgc2hhcmVkIGJldHdlZW4gdGhlDQogZGlmZmVyZW50IE9D YW1sIHRvIFdhc20gY29tcGlsZXJzLiA8L3A+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYTgxYjFhNiIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZ2E4MWIxYTYiPk9DYW1sLVdhc20gbW9udGhseSB1cGRhdGU8L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2E4MWIxYTYiPg0KPHA+V2Ugd2ls bCBwb3N0IGEgc3VtbWFyeSBvZiB0aGUgd29yayBkb25lIGluIHRoZSA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwtd2FzbSI+DQpvY2FtbC13YXNtPC9hPiBvcmcgb24gPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy8iPk9DYW1sIGRpc2N1c3M8L2E+LiA8L3A+DQo8cD48 aT5IYXBweSBoYWNraW5nITwvaT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjE1Ij5GZWVkYmFjayBOZWVkZWQ6IE5ldyDigJxBcnJheXPigJ0gVHV0b3JpYWwgb24gT0Nh bWwub3JnPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNSI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmVlZGJhY2st bmVlZGVkLW5ldy1hcnJheXMtdHV0b3JpYWwtb24tb2NhbWwtb3JnLzEyNjgzLzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZlZWRiYWNrLW5lZWRlZC1uZXctYXJyYXlzLXR1dG9yaWFs LW9uLW9jYW1sLW9yZy8xMjY4My8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmdhZDk5YzMzIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYWQ5 OWMzMyI+U2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnYWQ5OWMzMyI+DQo8cD5IZXkgZXZlcnlvbmUsIDwvcD4NCjxw PnRoZXJl4oCZcyBhIG5ldyB0dXRvcmlhbCBvbiDigJxBcnJheXPigJ0gYXQgPC9wPg0KPHA+PGEg aHJlZj0iaHR0cHM6Ly9zdGFnaW5nLm9jYW1sLm9yZy9kb2NzL2FycmF5cyI+aHR0cHM6Ly9zdGFn aW5nLm9jYW1sLm9yZy9kb2NzL2FycmF5czwvYT4NCjwvcD4NCjxwPkxvb2tpbmcgZm9yIGNvbnN0 cnVjdGl2ZSBmZWVkYmFjay4gPC9wPg0KPHA+SXMgdGhlcmUgYW55IGluZm9ybWF0aW9uIG1pc3Np bmcgb3IgcXVlc3Rpb25zIHRoYXQgeW91IHdvdWxkIG5lZWQgYW5zd2VyZWQgaW4gb3JkZXIgZm9y IHRoaXMgdHV0b3JpYWwgdG8gYmUgdXNlZnVsPyBBbnl0aGluZyB5b3Ugd291bGQgY2hhbmdlPw0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnNjM5OTJlNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzYzOTkyZTQiPk9sZCBD V048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzYzOTkyZTQi Pg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+ IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3Ig dGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJT UyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRv IHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVm PSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9u bGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmc3ZmNjODFiIj4N CjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8 L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1s Pg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 11 Jul 2023 09:46:16 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 11 Jul 2023 09:46:16 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 11 Jul 2023 09:46:16 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 36B8jY0L007904 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 11 Jul 2023 09:45:34 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 36B8jMXQ007888 for ; Tue, 11 Jul 2023 09:45:22 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Jul 2023 10:45:20 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id AF2E5E0D52; Tue, 11 Jul 2023 10:45:20 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 09AD8E00B6 for ; Tue, 11 Jul 2023 10:45:13 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jul 2023 10:45:10 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D24AA5605EF; Tue, 11 Jul 2023 10:45:08 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZs9Qn9w5pHnrZlUeSj2iHee2AfQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 11 Jul 2023 09:45:08 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 5df4f035-f955-4429-40a3-08db81eb4a4d X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,196,1684792800"; d="scan'208,217";a="61108534" x-spam-flag: No, tests=bogofilter, spamicity=0.295853, queueID=1EBB15605F0 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNy0xMSBUdWUgMTA6NDIgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDcuMDQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNy4xOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bHkgMDQgdG8gMTEsIDIwMjMuIDwvcD4N CjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJsZSBv ZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJk b2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+b3BhbSAyLjIuMH5hbHBoYSByZWxlYXNl ITwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPkluaXRpYWwgRW1pc3Npb25zIE1vbml0b3Jpbmcg b2YgdGhlIE9DYW1sLm9yZyBJbmZyYXN0cnVjdHVyZTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMz Ij5BdXRvZm9uY2UsIGEgbW9kZXJuIHJ1bm5lciBmb3IgR05VIEF1dG90ZXN0cyBzdWl0ZXM8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5GaXJzdCBiZXRhIHJlbGVhc2Ugb2YgT0NhbWwgNS4xLjA8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5EcmVhbS1odG1sIC0gRFNMIHRvIGJ1aWxkIEhUTUws IGludGVncmF0ZWQgd2l0aCBEcmVhbTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzYiPnBweF9zdWJs aW5lciAwLjIuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPmhhcHB5LWV5ZWJhbGxzLCBkbnMs IGh0dHAte2x3dCxtaXJhZ2V9LWNsaWVudCAmIzQzOyYjNDM7IHdyaXRldXAgb2YgaGFwcHktZXll YmFsbHMgaXNzdWUgYW5kIGZpeDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5HZXR0aW5nIHN0 YXJ0ZWQgd2l0aCBSZWFzb25SZWFjdCBhbmQgTWVsYW5nZTwvYT4gPC9saT48bGk+PGEgaHJlZj0i IzkiPk1ha2luZyBPQ2FtbCA1IFN1Y2NlZWQgZm9yIERldmVsb3BlcnMgYW5kIE9yZ2FuaXNhdGlv bnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+TGxhbWEsIGFuIE9DYW1sIGxpYnJhcnkgZm9y IGRlY2xhcmF0aXZlbHkgYnVpbGRpbmcgc29mdHdhcmUtZGVmaW5lZCBtb2R1bGFyIHN5bnRoZXNp emVyczwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMxMSI+ZHVuZSAzLjkuMDwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzEyIj5EZXBlbmRpbmcgb24gbm9uLU9DYW1sIGxhbmd1YWdlcyBmcm9tIHRoZSBv cGFtIHJlcG9zaXRvcnk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMyI+U3RhdHVzIG9mIERrTUwg V2luZG93czwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZ2FkOGI2NzciPk9sZCBDV048L2E+IDwv bGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+b3BhbSAyLjIuMH5hbHBoYSByZWxlYXNlITwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0yLTAtYWxw aGEtcmVsZWFzZS8xMjUzNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb3Bh bS0yLTItMC1hbHBoYS1yZWxlYXNlLzEyNTM2LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnZjg1ZGViMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2Y4NWRlYjIiPlIuIEJvdWpiZWwgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmODVkZWIyIj4NCjxwPk9uIGJlaGFsZiBvZiB0aGUgb3Bh bSBkZXYgdGVhbSwgSeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgeW91IHRoZSA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4yLjAtYWxwaGEiPg0KYWxw aGEgcmVsZWFzZSBvZiBvcGFtIDIuMi4wPC9hPi4gOnRhZGE6IDwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnZjBmYTYyZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQg aWQ9Im9yZ2YwZmE2MmUiPldoYXTigJlzIG5ldyBpbiB0aGlzIGFscGhhID88L2g0Pg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2YwZmE2MmUiPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTIt Mi0wLWFscGhhLyNXaW5kb3dzLVN1cHBvcnQiPvCflJc8L2E+IE5hdGl2ZSBXaW5kb3dzIGNvbXBh dGliaWxpdHksIHlvdSBjYW4gbm93IGxhdW5jaCBvcGFtIGluIHlvdXIgZmF2b3JpdGUgV2luZG93 cyB0ZXJtaW5hbCEgRm9yIHRoZSBtb21lbnQsIGl0IG5lZWRzIGFuIHByZWV4aXN0aW5nIEN5Z3dp biBpbnN0YWxsYXRpb24sIGEgbGltaXRhdGlvbiB0aGF0IHdpbGwgYmUNCiBsaWZ0ZWQgZm9yIHRo ZSBhbHBoYTIuIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9v cGFtLTItMi0wLWFscGhhLyNSZWN1cnNpdmUtUGluIj7wn5SXPC9hPiBSZWN1cnNpdmUgcGlubmlu ZyB0byBoYXZlIG9wYW0gbG9vayBmb3INCjxjb2RlPi5vcGFtPC9jb2RlPiBmaWxlcyBpbiBzdWJk aXJlY3Rvcmllcy4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9n L29wYW0tMi0yLTAtYWxwaGEvI1RyZWUtVmlldyI+8J+UlzwvYT4gVHJlZSB2aWV3IG9mIHlvdXIg aW5zdGFsbGVkIHBhY2thZ2VzIGRlcGVuZGVuY2llcyAoYW5kIHJldmVyc2UgZGVwZW5kZW5jaWVz KS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTIt Mi0wLWFscGhhLyNSZWNvbW1lbmRlZC1EZXZlbG9wbWVudC1Ub29scyI+8J+UlzwvYT4gUmVjb21t ZW5kZWQgZGV2ZWxvcG1lbnQgdG9vbHMgdmFyaWFibGUNCjxjb2RlPnt3aXRoLWRldi1zZXR1cH08 L2NvZGU+IGFuZCBvcHRpb24gPGNvZGU+LS13aXRoLWRldi1zZXR1cDwvY29kZT4uIEl0IGlzIHVz ZWQgdGhlIHNhbWUgd2F5IGFzDQo8Y29kZT53aXRoLWRvYzwvY29kZT4gYW5kIDxjb2RlPndpdGgt dGVzdDwvY29kZT4uIEUuZy4gPGNvZGU+ZGVwZW5kczogWyAmcXVvdDtvY2FtbGZvcm1hdCZxdW90 OyB7d2l0aC1kZXYtc2V0dXAgJmFtcDsgPSAmcXVvdDswLjIzLjAmcXVvdDt9IF08L2NvZGU+Lg0K PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAt YWxwaGEvI1NvZnR3YXJlLUhlcml0YWdlLUJpbmRpbmciPvCflJc8L2E+DQo8YSBocmVmPSJodHRw czovL3d3dy5zb2Z0d2FyZWhlcml0YWdlLm9yZyI+U29mdHdhcmUgSGVyaXRhZ2U8L2E+IGZhbGxi YWNrIGZvciBhcmNoaXZlIHJldHJpZXZhbC4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb3Bh bS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItMi0wLWFscGhhLyNGb3JtdWxhLUV4cGVyaW1lbnRhbCI+ 8J+UlzwvYT4NCjxjb2RlPm9wYW0gaW5zdGFsbDwvY29kZT4gd2l0aCBmb3JtdWxhcywgbGlrZSBm b3IgZm9yIHN3aXRjaCBjcmVhdGlvbi4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9j YW1sLm9yZy9ibG9nL29wYW0tMi0yLTAtYWxwaGEvI05ldy1PcHRpb25zIj7wn5SXPC9hPiBTZXZl cmFsIG5ldyBvcHRpb25zIGZvcg0KPGNvZGU+cGluPC9jb2RlPiwgPGNvZGU+ZXhlYzwvY29kZT4s IDxjb2RlPnNvdXJjZTwvY29kZT4sIDxjb2RlPmNsZWFuPC9jb2RlPiwgPGNvZGU+DQpzd2l0Y2g8 L2NvZGU+LCBhbmQgPGNvZGU+YWRtaW48L2NvZGU+LiA8L2xpPjxsaT5BbmQgb2YgY291cnNlIG51 bWVyb3VzIGVuaGFuY2VtZW50cywgZml4ZXMgYW5kIHVwZGF0ZXMuIDwvbGk+PC91bD4NCjxwPllv deKAmWxsIGZpbmQgdGhlc2UgZmVhdHVyZXMgcHJlc2VudGVkIGluIHRoZSA8YSBocmVmPSJodHRw czovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTItMC1hbHBoYS8iPg0KYmxvZyBwb3N0PC9h PiwgYW5kIGZvciBhIG1vcmUgZGV0YWlsZWQgdmlldyB5b3UgY2FuIHRha2UgYSBsb29rIGF0IHRo ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4y LjAtYWxwaGEiPg0KcmVsZWFzZSBub3RlPC9hPiBvciA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb3BhbS9ibG9iLzIuMi4wLWFscGhhL0NIQU5HRVMiPg0KY2hhbmdlbG9nPC9hPi4g PC9wPg0KPHA+V2UgZW5jb3VyYWdlIHlvdSB0byB0cnkgb3V0IHRoaXMgYWxwaGEgcmVsZWFzZSwg aW5zdHJ1Y3Rpb25zIGFyZSBkZXRhaWxlZCBpbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vb3BhbS5v Y2FtbC5vcmcvYmxvZy9vcGFtLTItMi0wLWFscGhhIj5ibG9nIHBvc3Q8L2E+LCBpbiBwYXJ0aWN1 bGFyIGZvcg0KPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAt YWxwaGEvI0hvdy10by1UZXN0LW9wYW0tb24tV2luZG93cyI+DQpXaW5kb3dzPC9hPi4gPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+SW5pdGlhbCBFbWlzc2lvbnMgTW9u aXRvcmluZyBvZiB0aGUgT0NhbWwub3JnIEluZnJhc3RydWN0dXJlPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9pbml0aWFsLWVtaXNzaW9ucy1tb25pdG9yaW5nLW9mLXRo ZS1vY2FtbC1vcmctaW5mcmFzdHJ1Y3R1cmUvMTIzMzUvNyI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvaW5pdGlhbC1lbWlzc2lvbnMtbW9uaXRvcmluZy1vZi10aGUtb2NhbWwtb3JnLWlu ZnJhc3RydWN0dXJlLzEyMzM1Lzc8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzRlYWIxNzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0ZWFi MTcyIj5QYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzRlYWIxNzIiPg0KPHA+VGhlIGxpYnJhcnkgdXNlZCBmb3IgYWNj ZXNzaW5nIGVtaXNzaW9uIGluZm9ybWF0aW9uIGZyb20gZWxlY3RyaWNpdHkgZ3JpZHMgY2FsbGVk IOKAnDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9nZW9jYW1sL2NhcmJvbi1pbnRlbnNpdHki PmNhcmJvbjwvYT7igJ0gc2hvdWxkIG5vdyBiZSBhdmFpbGFibGUgb24gb3BhbS4gVGhpcyBpcyBh biBpbml0aWFsIHJlbGVhc2UgYW5kIG1pZ2h0IGNoYW5nZSBhIGJpdCAoZS5nLiBpdCBkZXBlbmRz IG9uIGFuDQogYWxwaGEgcmVsZWFzZSBvZiBjb2h0dHAtZWlvKS4gPC9wPg0KPGRpdiBjbGFzcz0i b3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+b3BhbSB1cGRh dGUgJmFtcDsmYW1wOyBvcGFtIGluc3RhbGwgY2FyYm9uDQo8L3ByZT4NCjwvZGl2Pg0KPHA+SGVy ZeKAmXMgYSBzaW1wbGUgZXhhbXBsZSB0byBnZXQgdGhlIGVtaXNzaW9uIG51bWJlcnMgZm9yIEdy ZWF0IEJyaXRhaW4uIDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUg Y2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkVpb19t YWluLjwvc3Bhbj5ydW4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+QEA8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmVudjwvc3Bhbj4gLSZndDsNCjxzcGFuIHN0 eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk1pcmFnZV9jcnlwdG9fcm5nX2Vpby48L3NwYW4+cnVuICg8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5NaXJhZ2VfY3J5cHRvX3JuZy5Gb3J0 dW5hPC9zcGFuPikgZW52IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPkBAPC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5fPC9zcGFuPiAtJmd0Ow0KPHNwYW4gc3R5 bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q2FyYm9uLkdiLjwvc3Bhbj5nZXRfaW50ZW5zaXR5IGVudiNu ZXQNCjxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPnwmZ3Q7PC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICM0NDRmY2Y7Ij5FaW8uPC9zcGFuPnRyYWNlbG4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjY2EzNDAwOyI+JnF1b3Q7JWEmcXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPkNhcmJvbi5HYi5JbnRlbnNpdHkuPC9zcGFuPnBwDQo8L3ByZT4NCjwvZGl2Pg0KPHA+ VGhhbmtzIHRvIEBlbWlsbG9uIGZvciBwcm92aWRpbmcgYSBiYWNrZW5kIGZvciBGcmVuY2ggZGF0 YSBhbmQgdG8gQHJleW5pciBmb3Igc3VnZ2VzdGluZyBpbXBvcnRhbnQgY2hhbmdlcyB0byB0aGUg Q08yLXNpZ25hbCBiYWNrZW5kIGJlZm9yZSB0aGUgcmVsZWFzZS4NCjwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIzIj5BdXRvZm9uY2UsIGEgbW9kZXJuIHJ1bm5lciBmb3IgR05VIEF1dG90 ZXN0cyBzdWl0ZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2F1dG9m b25jZS1hLW1vZGVybi1ydW5uZXItZm9yLWdudS1hdXRvdGVzdHMtc3VpdGVzLzExNzI3LzIiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2F1dG9mb25jZS1hLW1vZGVybi1ydW5uZXItZm9y LWdudS1hdXRvdGVzdHMtc3VpdGVzLzExNzI3LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzJkMzE4ZDYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmcyZDMxOGQ2Ij5GYWJyaWNlIExlIEZlc3NhbnQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyZDMxOGQ2Ij4NCjxwPkEgcmVjZW50IGJs b2cgYXJ0aWNsZSBvbiB0aGUgc3ViamVjdDogPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9vY2Ft bHByby5jb20vYmxvZy8yMDIzXzAzXzE4X2F1dG9mb25jZS8iPmh0dHBzOi8vb2NhbWxwcm8uY29t L2Jsb2cvMjAyM18wM18xOF9hdXRvZm9uY2UvPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjQiPkZpcnN0IGJldGEgcmVsZWFzZSBvZiBPQ2FtbCA1LjEuMDwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtYmV0YS1yZWxlYXNlLW9mLW9jYW1sLTUt MS0wLzEyNTQwLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ZpcnN0LWJldGEtcmVs ZWFzZS1vZi1vY2FtbC01LTEtMC8xMjU0MC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2VkNDkwOGEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdlZDQ5MDhhIj5vY3RhY2hyb24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmdlZDQ5MDhhIj4NCjxwPkFmdGVyIHR3byBhbHBoYSByZWxlYXNl cywgdGhlIHJlbGVhc2Ugb2YgT0NhbWwgNS4xLjAgaXMgZHJhd2luZyBuZWFyLiA8L3A+DQo8cD5X ZSBoYXZlIHRodXMgcmVsZWFzZWQgYSBmaXJzdCBiZXRhIHZlcnNpb24gb2YgT0NhbWwgNS4xLjAg dG8gaGVscCB5b3UgdXBkYXRlIHlvdXIgc29mdHdhcmVzIGFuZCBsaWJyYXJpZXMgYWhlYWQgb2Yg dGhlIHJlbGVhc2UgKHNlZSBiZWxvdyBmb3IgdGhlIGluc3RhbGxhdGlvbiBpbnN0cnVjdGlvbnMp Lg0KPC9wPg0KPHA+Q29tcGFyZWQgdG8gdGhlIGxhc3QgYWxwaGEgcmVsZWFzZSwgdGhpcyBiZXRh IGNvbnRhaW5zIHR3byBzdWJ0bGUgaW50ZXJuYWwgcnVudGltZSBmaXhlcywgYW5kIG9uZSBXaW5k b3dzIGZpeC4gT3ZlcmFsbCwgdGhlIG9wYW0gZWNvc3lzdGVtIGxvb2tzIGluIGEgZ29vZCBzaGFw ZSBmb3IgdGhlIGZpcnN0IGJldGEgcmVsZWFzZS4NCjwvcD4NCjxwPklmIHlvdSBmaW5kIGFueSBi dWdzLCBwbGVhc2UgcmVwb3J0IHRoZW0gb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3VlcyI+DQpPQ2FtbOKAmXMgaXNzdWUgdHJhY2tlcjwvYT4uIDwvcD4NCjxw Pk5lYXJseSBhbGwgY29yZSBkZXZlbG9wbWVudCB0b29scyBzdXBwb3J0cyBPQ2FtbCA1LjEuMCwg YW5kIHlvdSBjYW4gZm9sbG93IHRoZSBsYXN0IHJlbWFpbmluZyB3cmlua2xlcyBvbiB0aGUNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvaXNzdWVzLzIz NjY5Ij5vcGFtIHJlYWRpbmVzcyBmb3IgNS4xLjAgbWV0YS1pc3N1ZTwvYT4uDQo8L3A+DQo8cD5D dXJyZW50bHksIHRoZSByZWxlYXNlIGlzIHBsYW5uZWQgZm9yIHRoZSBlbmQgb2YgSnVseSBvciB0 aGUgYmVnaW5uaW5nIG9mIEF1Z3VzdC4NCjwvcD4NCjxwPklmIHlvdSBhcmUgaW50ZXJlc3RlZCBp biBmdWxsIGxpc3Qgb2YgZmVhdHVyZXMgYW5kIGJ1ZyBmaXhlcyBvZiB0aGUgbmV3IE9DYW1sIHZl cnNpb24sIHRoZSB1cGRhdGVkIGNoYW5nZSBsb2cgZm9yIE9DYW1sIDUuMS4wIGlzIGF2YWlsYWJs ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvNS4xL0NoYW5n ZXMiPm9uIEdpdEh1YjwvYT4uIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMzg4MmQ0NSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzM4ODJkNDUiPklu c3RhbGxhdGlvbiBJbnN0cnVjdGlvbnM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQi IGlkPSJ0ZXh0LW9yZzM4ODJkNDUiPg0KPHA+VGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3Rh bGxlZCBhcyBhbiBvcGFtIHN3aXRjaCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3Bh bSAyLjE6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNz PSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlIDUuMS4wfmJl dGExDQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgYWxwaGEgaXMg YWxzbyBhdmFpbGFibGUgYXQgdGhlc2UgYWRkcmVzc2VzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUv NS4xLjAtYmV0YTEudGFyLmd6Ij5HaXRIdWI8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNS4xL29jYW1sLTUuMS4wfmJldGExLnRh ci5neiI+T0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWE8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnMjUzNDZmMSI+PC9hPkZpbmUtVHVuZWQg Q29tcGlsZXIgQ29uZmlndXJhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmcyNTM0NmYxIj4NCjxwPklmIHlvdSB3YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1 cmF0aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBzd2l0Y2ggdG8gdGhlIG9wdGlvbiB2YXJp YW50IHdpdGg6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNs YXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlICZsdDtz d2l0Y2hfbmFtZSZndDsgb2NhbWwtdmFyaWFudHMuNS4xLjB+YmV0YTEmIzQzO29wdGlvbnMgJmx0 O29wdGlvbl9saXN0Jmd0Ow0KPC9wcmU+DQo8L2Rpdj4NCjxwPndoZXJlIDxjb2RlPm9wdGlvbl9s aXN0PC9jb2RlPiBpcyBhIHNwYWNlLXNlcGFyYXRlZCBsaXN0IG9mIDxjb2RlPm9jYW1sLW9wdGlv bi0qPC9jb2RlPiBwYWNrYWdlcy4gRm9yIGluc3RhbmNlLCBmb3IgYQ0KPGNvZGU+ZmxhbWJkYTwv Y29kZT4gYW5kIDxjb2RlPm5vLWZsYXQtZmxvYXQtYXJyYXk8L2NvZGU+IHN3aXRjaDogPC9wPg0K PGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVs bCI+b3BhbSBzd2l0Y2ggY3JlYXRlIDUuMS4wfmJldGExJiM0MztmbGFtYmRhJiM0MztuZmZhIG9j YW1sLXZhcmlhbnRzLjUuMS4wfmJldGExJiM0MztvcHRpb25zIG9jYW1sLW9wdGlvbi1mbGFtYmRh DQpvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KPC9wcmU+DQo8L2Rpdj4NCjxwPkFs bCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggPGNvZGU+b3BhbSBzZWFyY2gg b2NhbWwtb3B0aW9uPC9jb2RlPi4NCjwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4MDJmOWM4IiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnODAyZjljOCI+Q2hhbmdlcyBzaW5jZSB0aGUgbGFzdCBhbHBoYSByZWxlYXNl OjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnODAyZjljOCI+ PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzE0M2QxMDMiPjwvYT5S dW50aW1lIFN5c3RlbSBCdWdmaXg8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnMTQzZDEwMyI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjAzNyI+IzEyMDM3PC9hPjogRml4 IHNvbWUgZGF0YSByYWNlcyBieSB1c2luZyB2b2xhdGlsZSB3aGVuIG5lY2Vzc2FyeSAoRmFicmlj ZSBCdW9ybyBhbmQgT2xpdmllciBOaWNvbGUsIHJldmlldyBieSBHdWlsbGF1bWUgTXVuY2gtTWFj Y2Fnbm9uaSwgR2FicmllbCBTY2hlcmVyIGFuZCBMdWMgTWFyYW5nZXQpDQo8L2xpPjxsaT48YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMjUzIj4jMTIyNTM8 L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMzQy Ij4NCiMxMjM0MjwvYT46IEZpeCBpbmZpbml0ZSBsb29wIGluIHNpZ25hbCBoYW5kbGluZy4gKEd1 aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pLCByZXBvcnQgYnkgVGhvbWFzIExlb25hcmQsIHJldmll dyBieSBLQyBTaXZhcmFtYWtyaXNobmFuIGFuZCBTYWRpcSBKYWZmZXIpDQo8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdlM2ZhOTYwIj48L2E+V2luZG93cyBCdWdmaXg8YnI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZTNmYTk2MCI+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3Vlcy8xMjE4NCI+IzEyMTg0PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjMyMCI+DQojMTIzMjA8L2E+OiBTeXMucmVuYW1lIFdpbmRv d3MgZml4ZXMgb24gZGlyZWN0b3J5IGNvcm5lciBjYXNlcy4gKEphbiBNaWR0Z2FhcmQsIHJldmll dyBieSBBbmlsIE1hZGhhdmFwZWRkeSkNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQ2NDY5MzYiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0NjQ2OTM2Ij5vY3RhY2hyb24gYWRkZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQ2NDY5MzYiPg0KPHA+ QWZ0ZXIgc3BlbmRpbmcgc29tZSB0aW1lIHRyeWluZyB0byBtYXAgdGhlIGN1cnJlbnQgcGFja2Fn ZSBidWlsZCBmYWlsdXJlcyB3aXRoIHRoZSBjdXJyZW50IGJldGEgcmVsZWFzZSBvbiB0aGUgb3Bh bSByZXBvc2l0b3J5LCBJIGhhdmUgd3JpdHRlbiBkb3duIGEgc2hvcnQgdG9wb2dyYXBoeSBvZiBz dWNoIGJ1aWxkIGZhaWx1cmVzIGF0DQo8YSBocmVmPSJodHRwOi8vZ2FsbGl1bS5pbnJpYS5mci9i bG9nL2Zsb3JpYW4tY29tcGlsZXItd2Vla2x5LTIwMjMtMDctMDUiPmh0dHA6Ly9nYWxsaXVtLmlu cmlhLmZyL2Jsb2cvZmxvcmlhbi1jb21waWxlci13ZWVrbHktMjAyMy0wNy0wNTwvYT4gLg0KPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPkRyZWFtLWh0bWwgLSBEU0wgdG8gYnVpbGQg SFRNTCwgaW50ZWdyYXRlZCB3aXRoIERyZWFtPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC1kc2wtdG8tYnVpbGQtaHRtbC1pbnRlZ3JhdGVkLXdp dGgtZHJlYW0vMTIwMzIvNCI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRyZWFt LWh0bWwtZHNsLXRvLWJ1aWxkLWh0bWwtaW50ZWdyYXRlZC13aXRoLWRyZWFtLzEyMDMyLzQ8L2E+ DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2I3NDllNTMiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiNzQ5ZTUzIj5ZYXdhciBBbWluIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjc0OWU1MyI+ DQo8cD5KdXN0IHJlbGVhc2VkIDAuMS4wIHdpdGggYSBjb3VwbGUgb2Ygc21hbGwgaGVscGVyczog PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxjb2RlPkh4Ll9fPC9jb2RlPiBjYW4gYmUg dXNlZCB0byByZW5kZXIgdGhlIDxjb2RlPl88L2NvZGU+IGF0dHJpYnV0ZSwgd2hpY2ggaXMgdXNl ZCBmb3INCjxhIGhyZWY9Imh0dHBzOi8vaHRteC5vcmcvZG9jcy8jaHlwZXJzY3JpcHQiPkh5cGVy c2NyaXB0PC9hPiA8L2xpPjxsaT48Y29kZT5hdHRyICZxdW90O2F0dHItbmFtZSZxdW90OzwvY29k ZT4gY2FuIGJlIHVzZWQgdG8gY3JlYXRlIGEgbmV3IGF0dHJpYnV0ZSB3aGljaCBkb2VzIG5vdCBj YXJyeSBhIHBheWxvYWQgKHdoYXQgaXMgdXN1YWxseSBjYWxsZWQgYSBib29sZWFuIGF0dHJpYnV0 ZSkNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5wcHhfc3VibGluZXIg MC4yLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtc3Vi bGluZXItMC0yLTAvMTI1NDQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBw eC1zdWJsaW5lci0wLTItMC8xMjU0NC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzRhOTk1YzkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0 YTk5NWM5Ij5Cb25pbmcgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc0YTk5NWM5Ij4NCjxwPkkgYW0gdmVyeSBoYXBweSB0byBhbm5vdW5jZSB0 aGUgc2Vjb25kIHJlbGVhc2UgKDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ibi1kL3BweF9z dWJsaW5lci9yZWxlYXNlcy90YWcvdjAuMi4wIj52MC4yLjA8L2E+KSBvZg0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2JuLWQvcHB4X3N1YmxpbmVyIj48Y29kZT5wcHhfc3VibGluZXI8L2Nv ZGU+IDwvYT4hIFRoZSBuZXcgdmVyc2lvbiBpcyBhdmFpbGFibGUgdGhyb3VnaA0KPGEgaHJlZj0i aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9wcHhfc3VibGluZXIvIj5PUEFNPC9hPi4g PC9wPg0KPHA+VGhlIGV4dGVuc2lvbiBoYWQgYmVlbiBncmVhdGx5IGVuaGFuY2VkIHNpbmNlIHRo ZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Ut b2YtcHB4LXB5Zm9ybWF0LTAtMS0xLzkzMjEiPg0KZmlyc3QgcmVsZWFzZTwvYT4uIDwvcD4NCjxw Pk5vdywgdGhlIHVzZXIgaXMgYWJsZSB0byBnZW5lcmF0ZSBhIG11bHRpLXN1YmNvbW1hbmQgYXBw bGljYXRpb24gZnJvbSBhIHNpbmdsZSB2YXJpYW50IHR5cGUgd2l0aCBpbmxpbmUgcmVjb3Jkcy4g QW5kIHRoZSBuZXcgdmVyc2lvbiBkb2VzIG5vdCBuZWVkIHRvIHJlbHkgb24gb3RoZXIgZXh0ZW5z aW9ucy4NCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9 InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6 IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5wYXJhbXM8 L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+Rm9vPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+b2Y8L3NwYW4+IHsgbXlfYXJnIDogc3RyaW5nIH0gfCA8c3BhbiBzdHlsZT0i Y29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5CYXI8L3NwYW4+DQo8 c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQEBkZXJpdmluZyBzdWJsaW5lcl08L3NwYW4+ DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmhhbmRsZTwvc3Bhbj4gPSA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuY3Rpb248L3Nw YW4+DQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+Rm9vPC9zcGFuPiB7IG15X2FyZyB9IC0mZ3Q7IHByaW50X2VuZGxpbmUgKDxzcGFu IHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O0ZvbyAmcXVvdDs8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogI2E1MmEyYTsiPl48L3NwYW4+IG15X2FyZykNCiAgfCA8c3BhbiBzdHlsZT0i Y29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5CYXI8L3NwYW4+IC0m Z3Q7IHByaW50X2VuZGxpbmUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7QmFy JnF1b3Q7PC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7IGJhY2tncm91bmQt Y29sb3I6ICNlYmViZWI7Ij5bJSVzdWJsaW5lci5jbWRzPC9zcGFuPg0KZXZhbC5wYXJhbXMgJmx0 Oy0gaGFuZGxlPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZWJlYmViOyI+XTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9udC1zdHls ZTogaXRhbGljOyI+KCoqIFNvbWUgZG9jcyAqKTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+DQo8cD5U aGUgdXNlciBpcyBhbHNvIGFibGUgdG8gZ2VuZXJhdGUgPGNvZGU+Q21kbGluZXIuVGVybS50PC9j b2RlPiBmcm9tIGEgcmVjb3JkIHR5cGUsIGFuZCB0aGUgc2lnbmF0dXJlIGlzIGZ1bGx5IGNvbXBh dGlibGUgd2l0aCB0aGUgZ2VuZXJhdGVkIHZhbHVlIG9mDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vaGFtbWVybGFiL3BweF9kZXJpdmluZ19jbWRsaW5lciI+PGNvZGU+cHB4X2Rlcml2aW5n X2NtZGxpbmVyPC9jb2RlPg0KPC9hPi4gVGhlIGRlcml2ZXIgc3VwcG9ydCB2YXJpb3VzIGF0dHJp YnV0ZXMsIHN1Y2ggYXMgPGNvZGU+W0Bwb3NdPC9jb2RlPiwgPGNvZGU+DQpbQHBvc19hbGxdPC9j b2RlPiwgPGNvZGU+W0Bwb3NfbGVmdF08L2NvZGU+LCA8Y29kZT5bQG5vbl9lbXB0eV08L2NvZGU+ LCA8Y29kZT5bQGNvbnZdPC9jb2RlPiwNCjxjb2RlPltAdGVybV08L2NvZGU+LCA8Y29kZT5bQGZp bGVdPC9jb2RlPiwgdG8gc3VwcG9ydCBkaWZmZXJlbnQga2luZHMgb2YgcG9zaXRpb25hbCBhcmd1 bWVudHMgYW5kIHR5cGVzLCBhbmQgZ2l2ZSB0aGUgdXNlciBncmVhdCBmbGV4aWJpbGl0eS4NCjwv cD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMt b2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50 eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5mb288L3NwYW4+ID0geyBt eV9hcmcgOiBzdHJpbmcgfSA8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQEBkZXJpdmlu ZyBzdWJsaW5lcl08L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhpcyByZWxlYXNlIHNob3Vs ZCBjb3ZlciBtYWpvcml0eSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkv Y21kbGluZXIiPg0KPGNvZGU+Q21kbGluZXI8L2NvZGU+PC9hPi4gUGxlYXNlIHNlZSB0aGUgPGEg aHJlZj0iaHR0cHM6Ly9ib25pLm5nL3BweF9zdWJsaW5lci9wcHhfc3VibGluZXIvaW5kZXguaHRt bCI+DQpkb2N1bWVudGF0aW9uIDwvYT5mb3IgdGhlIGZ1bGwgZmVhdHVyZSBzZXQuIDwvcD4NCjxw PkhhcHB5IGhhY2tpbmchIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5oYXBweS1l eWViYWxscywgZG5zLCBodHRwLXtsd3QsbWlyYWdlfS1jbGllbnQgJiM0MzsmIzQzOyB3cml0ZXVw IG9mIGhhcHB5LWV5ZWJhbGxzIGlzc3VlIGFuZCBmaXg8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1oYXBweS1leWViYWxscy1kbnMtaHR0cC1sd3QtbWlyYWdlLWNs aWVudC13cml0ZXVwLW9mLWhhcHB5LWV5ZWJhbGxzLWlzc3VlLWFuZC1maXgvMTI1NTAvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWhhcHB5LWV5ZWJhbGxzLWRucy1odHRwLWx3 dC1taXJhZ2UtY2xpZW50LXdyaXRldXAtb2YtaGFwcHktZXllYmFsbHMtaXNzdWUtYW5kLWZpeC8x MjU1MC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcz NDc0MDBmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzQ3NDAwZiI+SGFubmVzIE1l aG5lcnQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmczNDc0MDBmIj4NCjxwPkRlYXIgT0NhbWwgcGVvcGxlLCA8L3A+DQo8cD5zb21lIHRpbWUg YWdvIHdlIGVuY291bnRlcmVkIGlzc3VlcyBpbiB0aGUgY29ubmVjdGlvbiBlc3RhYmxpc2htZW50 IG9mIGh0dHAtbHd0LWNsaWVudCBpbiBhIEdpdEh1YiBhY3Rpb24gKHVzaW5nIGEgcHJlLWNvbW1p dC5jb20pIGhvb2suIEl0IHdhcyBxdWl0ZSBzb21lIGpvdXJuZXkgZnJvbSBzdXJmYWNpbmcgaXNz dWUg4oCcSFRUUCBjb25uZWN0aW9uIHRpbWVvdXTigJ0gdG8gdGhlIGFjdHVhbCBpc3N1ZSwgc28g d2Ugd3JvdGUgaXQgdXAgYXQNCjxhIGhyZWY9Imh0dHBzOi8vc2VtZ3JlcC5kZXYvYmxvZy8yMDIz L2h0dHAtcmVxdWVzdC1mYWlsZWQtdGltZW91dC1pc3N1ZS1pbi1vY2FtbCI+DQpodHRwczovL3Nl bWdyZXAuZGV2L2Jsb2cvMjAyMy9odHRwLXJlcXVlc3QtZmFpbGVkLXRpbWVvdXQtaXNzdWUtaW4t b2NhbWw8L2E+IOKAkyBpdCByZW1pbmRzIG1lIG9mIGFuIGlzc3VlIHN1cmZhY2luZyBhcyDigJxi YWQgcmVjb3JkIG1hY+KAnSBpbiB0aGUgVExTIHN0YWNrIHNvbWUgeWVhcnMgYWdvIChzZWUNCjxh IGhyZWY9Imh0dHBzOi8vaGFubmVzLnJvYnVyLmNvb3AvUG9zdHMvQmFkUmVjb3JkTWFjIj5odHRw czovL2hhbm5lcy5yb2J1ci5jb29wL1Bvc3RzL0JhZFJlY29yZE1hYzwvYT4pLg0KPC9wPg0KPHA+ VGhpcyBsZWFkIHRvIHRoZSByZWxlYXNlcyBvZiBoYXBweS1leWViYWxsc3ssLWx3dCwtbWlyYWdl fSAwLjYuMCBhbmQgZG5zKiA3LjAuMy4gSW4gcmVsYXRlZCBuZXdzLCB3ZSBqdXN0IHJlbGVhc2Ug aHR0cC1sd3QtY2xpZW50IDAuMi41IHdpdGggZnVydGhlciBmaXhlcyAocmVsYXRlZCB0byBIVFRQ MikgYW5kIGh0dHAtbWlyYWdlLWNsaWVudCAwLjAuNS4NCjwvcD4NCjxwPlRoaXMgZGVidWdnaW5n IGFuZCBmaXhpbmcgd29yayB3YXMgc3BvbnNvcmVkIGJ5IHNlbWdyZXAuY29tIOKAkyBhIGdyZWF0 IG9wZW4gc291cmNlIHV0aWxpdHkgdG8gc3RhdGljYWxseSBhbmFseXNlIHlvdXIgY29kZWJhc2Ug OkQNCjwvcD4NCjxwPkFsbCB0aGUgYmVzdCwgYW5kIHBsZWFzZSByZXBvcnQgaXNzdWVzIGFuZCBm ZWVkYmFjayBlaXRoZXIgaGVyZSwgdmlhIGVNYWlsLCBvciBpbiB0aGUgaXNzdWUgdHJhY2tlcihz KS4gRW5qb3kgeW91ciBkYXkhDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+R2V0 dGluZyBzdGFydGVkIHdpdGggUmVhc29uUmVhY3QgYW5kIE1lbGFuZ2U8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2dldHRpbmctc3RhcnRlZC13aXRoLXJlYXNvbnJlYWN0 LWFuZC1tZWxhbmdlLzEyNTY2LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2dldHRp bmctc3RhcnRlZC13aXRoLXJlYXNvbnJlYWN0LWFuZC1tZWxhbmdlLzEyNTY2LzE8L2E+DQo8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQzYzM2YjQiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0M2MzNmI0Ij5wc2IgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0M2MzNmI0Ij4NCjxwPkEgc2hvcnQg YmxvZyBwb3N0IG9uIGdldHRpbmcgc3RhcnRlZCB3aXRoIFJlYXNvblJlYWN0IGFuZCBNZWxhbmdl OiA8YSBocmVmPSJodHRwczovL2Rldi50by9wc2IvZ2V0dGluZy1zdGFydGVkLXdpdGgtcmVhc29u cmVhY3QtYW5kLW1lbGFuZ2UtMTNoZCI+DQpodHRwczovL2Rldi50by9wc2IvZ2V0dGluZy1zdGFy dGVkLXdpdGgtcmVhc29ucmVhY3QtYW5kLW1lbGFuZ2UtMTNoZDwvYT4gPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjkiPk1ha2luZyBPQ2FtbCA1IFN1Y2NlZWQgZm9yIERldmVsb3BlcnMg YW5kIE9yZ2FuaXNhdGlvbnM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L21ha2luZy1vY2FtbC01LXN1Y2NlZWQtZm9yLWRldmVsb3BlcnMtYW5kLW9yZ2FuaXNhdGlvbnMv MTI1NjcvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWFraW5nLW9jYW1sLTUtc3Vj Y2VlZC1mb3ItZGV2ZWxvcGVycy1hbmQtb3JnYW5pc2F0aW9ucy8xMjU2Ny8xPC9hPg0KPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3NzY0MDBhIiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnNzc2NDAwYSI+S0MgU2l2YXJhbWFrcmlzaG5hbiBhbm5vdW5j ZWQsIHNwYXduaW5nIGEgYmlnIHRocmVhZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MyIgaWQ9InRleHQtb3JnNzc2NDAwYSI+DQo8cD5JIHdyb3RlIHVwIGEgc3VtbWFyeSBvZiB0aGUg dmFyaW91cyBlZmZvcnRzIGF0IFRhcmlkZXMgYWltZWQgYXQgbWFraW5nIE9DYW1sIDUgc3VjY2Vl ZCBmb3IgZGV2ZWxvcGVyczoNCjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIz LTA3LTA3LW1ha2luZy1vY2FtbC01LXN1Y2NlZWQtZm9yLWRldmVsb3BlcnMtYW5kLW9yZ2FuaXNh dGlvbnMvIj4NCmh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTA3LTA3LW1ha2luZy1vY2Ft bC01LXN1Y2NlZWQtZm9yLWRldmVsb3BlcnMtYW5kLW9yZ2FuaXNhdGlvbnMvPC9hPi4NCjwvcD4N CjxwPlRoZSBwb3N0IGdpdmVzIGFuIGlkZWEgb2YgaG93IHdl4oCZdmUgYmVlbiBhcHByb2FjaGlu ZyB0aGlzIGNoYWxsZW5nZS4gSXQgd291bGQgYmUgZ3JlYXQgdG8gaGVhciB3aGF0IHRoZSBjb21t dW5pdHkgdGhpbmtzIGFib3V0IG91ciBhcHByb2FjaCBhbmQgd2hldGhlciB3ZSBhcmUgbWlzc2lu ZyBzb21ldGhpbmcgaW1wYWN0ZnVsIHRoYXQgd2Ugc2hvdWxkIGJlIGZvY3Vzc2luZyBvbi4NCjwv cD4NCjxwPkFsc28sIEkgaG9wZSB5b3UgZ2l2ZSBPQ2FtbCA1IGEgdHJ5IGlmIHlvdSBoYXZlbuKA mXQgYWxyZWFkeSA6LSkgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+TGxhbWEs IGFuIE9DYW1sIGxpYnJhcnkgZm9yIGRlY2xhcmF0aXZlbHkgYnVpbGRpbmcgc29mdHdhcmUtZGVm aW5lZCBtb2R1bGFyIHN5bnRoZXNpemVyczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtMTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2xsYW1hLWFuLW9jYW1sLWxpYnJhcnktZm9yLWRlY2xhcmF0aXZlbHktYnVpbGRp bmctc29mdHdhcmUtZGVmaW5lZC1tb2R1bGFyLXN5bnRoZXNpemVycy8xMjU3OC8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sbGFtYS1hbi1vY2FtbC1saWJyYXJ5LWZvci1kZWNsYXJh dGl2ZWx5LWJ1aWxkaW5nLXNvZnR3YXJlLWRlZmluZWQtbW9kdWxhci1zeW50aGVzaXplcnMvMTI1 NzgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWMz NTJhOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2VjMzUyYTkiPlN0ZXZlIFNoZXJy YXR0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnZWMzNTJhOSI+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ3JpZGJ1Z3MvbGxh bWEiPjxjb2RlPmxsYW1hPC9jb2RlPjwvYT4gaXMgYSBsaWJyYXJ5IGZvciBidWlsZGluZyBhdWRp byBzeW50aGVzaXplcnMgdXNpbmcgYSBkZWNsYXJhdGl2ZSBFRFNMLiBJdCBjb250YWlucyBhIGNv bGxlY3Rpb24gb2YgY29tYmluYXRvcnMgd2hpY2ggY29uc3VtZSBhbmQgcHJvZHVjZSBzdHJlYW1z IG9mIHZhbHVlcyAodXN1YWxseSB+ZmxvYXR+cyBmb3IgYXVkaW8gc2lnbmFscw0KIGFuZCB+Ym9v bH5zIGZvciBjb250cm9sIHNpZ25hbHMpIHdoaWNoIGNhbiBiZSBjb21wb3NlZCBtdWNoIGluIHRo ZSBzYW1lIHdheSBhcyBvbmUgd291bGQNCjxhIGhyZWY9Imh0dHBzOi8vd3d3LnlvdXR1YmUuY29t L3dhdGNoP3Y9VXNXMkVER2JEcWciPnBhdGNoIGEgbW9kdWxhciBzeW50aGVzaXplcjwvYT4uIFRo ZSBsaWJyYXJ5IGFsc28gY29udGFpbnMgYSBwbGF5ZXIgd2hpY2ggY2FuIHBsYXkgYSBzdHJlYW0g b2YgfmZsb2F0fnMgKHRyZWF0ZWQgYXMgYXVkaW8gc2FtcGxlcykgdGhyb3VnaCB5b3VyIHNvdW5k IGNhcmQuDQo8L3A+DQo8cD5BbiBhZGRpdGlvbmFsIGxpYnJhcnkgPGNvZGU+bGxhbWFfaW50ZXJh Y3RpdmU8L2NvZGU+IGNhbiBiZSB1c2VkIHRvIGNvbm5lY3Qgc3ludGhlc2l6ZXJzIHRvIGlucHV0 IGV2ZW50cyBhbmQgdG8gcmVuZGVyIG9zY2lsbG9zY29wZSB2aXN1YWxpemF0aW9uczoNCjwvcD4N CjxkaXYgaWQ9Im9yZ2IzMDA2MDMiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBz Oi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdp bmFsLzJYLzgvOGE1YzZkMTNiNGQ4MTJjYjc5OGE4ZTI3MjU1ZmYxYmIwYjM0MmY5MS5wbmciIGFs dD0iOGE1YzZkMTNiNGQ4MTJjYjc5OGE4ZTI3MjU1ZmYxYmIwYjM0MmY5MS5wbmciPg0KPC9wPg0K PC9kaXY+DQo8cD5Tb21lIGRlbW9zIChmcm9tIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vZ3JpZGJ1Z3MvbGxhbWEvdHJlZS9tYWluL2V4YW1wbGVzIj4NCmV4YW1wbGVzPC9hPiBkaXJl Y3RvcnkpOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly95 b3V0dS5iZS9BOGExRGVtMmVLcyI+TWlkaSBmaWxlIHBsYXllcjwvYT4gPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly95b3V0dS5iZS9POG9jN01oRzR1RSI+SW50ZXJhY3RpdmUgc3ludGggcGxheWVk IHdpdGggY29tcHV0ZXIga2V5Ym9hcmQ8L2E+DQo8L2xpPjwvdWw+DQo8cD5UaGVyZSBhcmUgbW9y ZSBkZW1vIHZpZGVvcyBsaW5rZWQgZnJvbSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2dyaWRidWdzL2xsYW1hL2Jsb2IvbWFpbi9SRUFETUUubWQiPg0KcmVhZG1lPC9hPi4gPC9wPg0K PHA+R2V0IDxjb2RlPmxsYW1hPC9jb2RlPiB3aXRoIDxjb2RlPm9wYW0gaW5zdGFsbCBsbGFtYTwv Y29kZT4gb3IgPGNvZGU+b3BhbSBpbnN0YWxsIGxsYW1hX2ludGVyYWN0aXZlPC9jb2RlPi4gQSB0 aGlyZCBwYWNrYWdlDQo8Y29kZT5sbGFtYV9jb3JlPC9jb2RlPiBjb250YWlucyBqdXN0IHRoZSBj b3JlIHR5cGUgZGVmaW5pdGlvbnMgYW5kIGNvbWJpbmF0b3JzIGJ1dCBub3QgdGhlIHBsYXllci4g VXNlIHRoaXMgaWYgeW91IGp1c3Qgd2FudCB0byBtYWtlIG1vcmUgZWZmZWN0cywgZmlsdGVycywg ZXRjIHdpdGhvdXQgZGVwZW5kaW5nIG9uIGFkZGl0aW9uYWwgcGFja2FnZXMgbmVlZGVkIHRvIHBs YXkgYXVkaW8uDQo8L3A+DQo8cD5Ob3RlIHRoYXQgPGNvZGU+bGxhbWE8L2NvZGU+IChhbmQgPGNv ZGU+bGxhbWFfaW50ZXJhY3RpdmU8L2NvZGU+KSBkZXBlbmRzIG9uIDxjb2RlPg0KY29uZi1ydXN0 LTIwMjE8L2NvZGU+IGFzIGludGVyYWN0aW5nIHdpdGggdGhlIHNvdW5kIGNhcmQgaXMgZG9uZSB1 c2luZyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL2NwYWwiPg0KY3BhbDwv YT4gcnVzdCBsaWJyYXJ5LiBJZiB5b3UgZG9u4oCZdCB3YW50IHRvIGluc3RhbGwgcnVzdCBzeXN0 ZW0td2lkZSAoZS5nLiBiZWNhdXNlIHlvdSB1c2UgcnVzdHVwKSB0aGVuIHJ1bg0KPGNvZGU+b3Bh bSBpbnN0YWxsIGNvbmYtcnVzdC0yMDIxIC0tYXNzdW1lLWRlcGV4dHM8L2NvZGU+IGJlZm9yZSBp bnN0YWxsaW5nIDxjb2RlPg0KbGxhbWE8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2QyZGM1ZDIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJv cmdkMmRjNWQyIj5Db2RlIEV4YW1wbGU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQi IGlkPSJ0ZXh0LW9yZ2QyZGM1ZDIiPg0KPHA+VGhpcyB3aWxsIHBsYXkgcmVwZWF0aW5nIHB1bHNl cyBvZiBhIDQ0MEh6IHNpbmUgd2F2ZS4gPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWlu ZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPkxsYW1hPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PkRzbDwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBp dGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxl OiBpdGFsaWM7Ij5bb3NjXSByZXByZXNlbnRzIGEgc2lnbmFsIHdob3NlIHZhbHVlIHZhcmllcyBi ZXR3ZWVuIC0xIGFuZCAxIGFjY29yZGluZzwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhm NmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICAgdG8gYSA0NDBIeiBzaW5lIHdhdmUuPC9zcGFu PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9z cGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxl dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+b3NjPC9zcGFuPiA6PHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+IGZsb2F0IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5TaWduYWwuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQg PC9zcGFuPj0gb3NjaWxsYXRvciAoY29uc3QgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+U2luZTwvc3Bhbj4pIChjb25zdCA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij40NDAuMDwvc3Bhbj4pDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjog IzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+W25vdGVfY2xvY2tdIHJlcHJlc2VudHMg YSBzaWduYWwgd2hvc2UgdmFsdWUgaXMgZWl0aGVyIFt0cnVlXSBvciBbZmFsc2VdPC9zcGFuPg0K PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICB3aGlj aCBjaGFuZ2VzIGZyb20gW2ZhbHNlXSB0byBbdHJ1ZV0gdHdpY2UgcGVyIHNlY29uZCwgYW5kIHNw ZW5kcyAzMCUgb2YgdGhlPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250 LXN0eWxlOiBpdGFsaWM7Ij4gICB0aW1lIG9uLiBUaGlzIGlzIG9mdGVuIHVzZWQgdG8gY29tbXVu aWNhdGUgdGhlIGZhY3QgdGhhdCBhIGtleSBpcyBwcmVzc2VkIHRvPC9zcGFuPg0KPHNwYW4gc3R5 bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICBhIG1vZHVsZSB0aGF0 IHJlc3BvbmRzIHRvIHN1Y2ggZXZlbnRzLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZm NGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPm5vdGVfY2xvY2s8L3NwYW4+IDo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij4gYm9vbCA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2lnbmFsLjwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij50IDwvc3Bhbj49DQogIHB1bHNlIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5mcmVxdWVuY3lfaHo8L3NwYW4+Oihjb25zdCA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4yLjA8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij5+ZHV0eV8wMTwvc3Bhbj46KGNvbnN0IDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPjAuMzwvc3Bhbj4pDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9u dC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsg Zm9udC1zdHlsZTogaXRhbGljOyI+W2VudmVsb3BlXSBpcyBhIHNpZ25hbCB3aGljaCBpcyAwIHdo aWxlIGl0cyBbZ2F0ZV0gYXJndW1lbnQgaXMgcHJvZHVjaW5nPC9zcGFuPg0KPHNwYW4gc3R5bGU9 ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICBbZmFsc2VdIHZhbHVlcywg YnV0IHdoaWNoIHJhaXNlcyB0byAxIG92ZXIgdGhlIGNvdXJzZSBvZiBbYXR0YWNrX3NdIHNlY29u ZHM8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxp YzsiPiAgIHdoZW4gW2dhdGVdIHRyYW5zaXRpb25zIHRvIFt0cnVlXSwgYW5kIHRyYW5zaXRpb25z IGJhY2sgdG8gW2ZhbHNlXSB3aGVuPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRh OyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICBbZ2F0ZV0gdHJhbnNpdGlvbnMgdG8gW2ZhbHNlXS4g Tm90ZSB0aGF0IGV2ZW4gdGhvdWdoIGl0IGlzIGFsc28gYSBbZmxvYXQ8L3NwYW4+DQo8c3BhbiBz dHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAgIFNpZ25hbC50XSBs aWtlIFtvc2NdIGlzLCBpdCBkb2Vzbid0IGNvbnRhaW4gYXVkaW8gZGF0YS4gSW5zdGVhZCBhbiBl bnZlbG9wZTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+ICAgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbW9kdWxhdGUgYSBzaWduYWwgaW4gcmVz cG9uc2UgdG8gYSBrZXkgcHJlc3MsIHdoaWNoIHdlPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICBhcmUgc2ltdWxhdGluZyBoZXJlIHdp dGggW25vdGVfY2xvY2tdLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQt c3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5 ZjsiPmVudmVsb3BlPC9zcGFuPiA6PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+IGZsb2F0 IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TaWduYWwuPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQgPC9zcGFuPj0NCiAgYXNyX2xpbmVhciA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+Z2F0ZTwvc3Bhbj46bm90ZV9jbG9jayA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij5+YXR0YWNrX3M8L3NwYW4+Oihjb25zdCA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDgyNGY7Ij4wLjAxPC9zcGFuPikgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRm OyI+fnJlbGVhc2Vfczwvc3Bhbj46KGNvbnN0IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi PjAuMjwvc3Bhbj4pDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHls ZTogaXRhbGljOyI+TXVsdGlwbHkgdGhlIG9zY2lsbGF0b3Igd2l0aCB0aGUgZW52ZWxvcGUgdG8g cHJvZHVjZSBhIHJlcGVhdGluZzwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsg Zm9udC1zdHlsZTogaXRhbGljOyI+ICAgYnVyc3Qgb2Ygdm9sdW1lIHdoaWNoIGdyYWR1YWxseSB0 YXBlcnMgb2ZmIHR3aWNlIHBlciBzZWNvbmQuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhm NmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA3YTlmOyI+b3V0cHV0PC9zcGFuPiA6PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+IGZsb2F0IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TaWduYWwuPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQgPC9zcGFuPj0gb3NjICouLiBlbnZl bG9wZQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PigqIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxp YzsiPlBsYXkgdGhlIHNvdW5kITwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+ICgpID0gcGxheV9zaWduYWwgb3V0cHV0 DQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5k dW5lIDMuOS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMSI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1 bmUtMy05LTAvMTI1MzAvMyI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5lLTMt OS0wLzEyNTMwLzM8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2Y4ZWIyOTIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmOGViMjkyIj5Db250 aW51aW5nIHRoaXMgdGhyZWFkLCBUaW0gTWNHaWxjaHJpc3Qgc2FpZCBhbmQgRXRpZW5uZSBNaWxs b24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmdmOGViMjkyIj4NCjxibG9ja3F1b3RlPg0KPHA+VGhhbmsgeW91IHRvIHRoZSBEdW5lIHRlYW0g Zm9yIGFsbCB5b3VyIGZhbnRhc3RpYyB3b3JrLiA8L3A+DQo8cD5Gb3IgYW55b25lIHVzaW5nIG1h Y09TIHRoZXJlIGlzIGEga25vdyBidWcgd2l0aCB0aGlzIHZlcnNpb24gPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzLzgwODMiPg0KaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvaXNzdWVzLzgwODM8L2E+IHRoYXQgeW91IG1pZ2h0IHdhbnQgdG8gaG9sZCBv ZmYgdW50aWwgaXQgaXMgZml4ZWQgYmVmb3JlIHVwZ3JhZGluZy4NCjwvcD4NCjwvYmxvY2txdW90 ZT4NCjxwPlRvIGV4cGFuZCBvbiB0aGF0OiA8L3A+DQo8cD5JbiBEdW5lIDMuOS4wLCB3ZSBhZGRl ZCBhIGZlYXR1cmUgdGhhdCBvZmZsb2FkcyBzb21lIGNvbXB1dGF0aW9ucyB0byBiYWNrZ3JvdW5k IHRocmVhZHMuIFVuZm9ydHVuYXRlbHksIHRoaXMgaGFzIGEgYmFkIGludGVyYWN0aW9uIG9uIG1h Y09TLCB3aGVyZSB3ZSBmb3JrIHByb2Nlc3NlcyB0byBpbXBsZW1lbnQgdGhlIFJQQyBzZXJ2ZXIg YW5kIHdhdGNoIG1vZGUuDQo8L3A+DQo8cD5XZSBtYXJrZWQgRHVuZSAzLjkuMCB1bmF2YWlsYWJs ZSBvbiBtYWNPUywgYW5kIHJlbGVhc2VkIDMuOS4xIHdpdGggc29tZSBtaXRpZ2F0aW9uczogd2Ug ZG9u4oCZdCBvZmZsb2FkIHRoZXNlIGNvbXB1dGF0aW9ucyBvbiBtYWNPUywgYW5kIHdlIG9ubHkg Zm9yayB3aGVuIG5lY2Vzc2FyeS4NCjwvcD4NCjxwPlRoZSBwbGFuIGZvciB0aGUgbmV4dCByZWxl YXNlIGlzIHRvIHN0b3AgZm9ya2luZyBwcm9jZXNzZXMgb24gbWFjT1MuIDwvcD4NCjxwPlRoZSBm aXJzdCBhbHBoYSBmb3IgRHVuZSAzLjEwLjAgaXMgcGxhbm5lZCB0byBoYXBwZW4gYXJvdW5kIDIw MjMtMDctMjUuIDwvcD4NCjxwPkhlcmXigJlzIHRoZSBjaGFuZ2Vsb2cgZm9yIDMuOS4xOiA8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2UyYTVmYzQiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdlMmE1ZmM0Ij5GaXhlczwvaDQ+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZTJhNWZjNCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+RGlzYWJsZSBiYWNrZ3JvdW5kIG9wZXJhdGlvbnMgYW5kIHRocmVhZGVkIGNvbnNvbGUg b24gTWFjT1MgYW5kIG90aGVyIFVuaXhlcyB3aGVyZSB3ZSByZWx5IG9uIGZvcmsuICgjODEwMCwg IzgxMjEsIGZpeGVzICM4MDgzLCBAcmdyaW5iZXJnLCBAZW1pbGxvbikNCjwvbGk+PGxpPkluaXRp YWxpemUgYXN5bmMgSU8gdGhyZWFkIGxhemlseS4gKCM4MTIyLCBAZW1pbGxvbikgPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEyIj5EZXBlbmRpbmcgb24gbm9u LU9DYW1sIGxhbmd1YWdlcyBmcm9tIHRoZSBvcGFtIHJlcG9zaXRvcnk8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEyIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kZXBlbmRpbmctb24tbm9uLW9jYW1sLWxhbmd1YWdl cy1mcm9tLXRoZS1vcGFtLXJlcG9zaXRvcnkvMTI1ODUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvZGVwZW5kaW5nLW9uLW5vbi1vY2FtbC1sYW5ndWFnZXMtZnJvbS10aGUtb3BhbS1y ZXBvc2l0b3J5LzEyNTg1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzY2OTBjMmEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2NjkwYzJh Ij5BbmlsIE1hZGhhdmFwZWRkeSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzY2OTBjMmEiPg0KPHA+SeKAmW0gY3VycmVudGx5IHJldmlld2lu ZyBmZWF0dXJlIHJlcXVlc3RzIGZvciB0aGUgb3BhbSByZXBvc2l0b3J5LCBhbmQgb25lIG9mIHRo ZSBtb3N0IGNvbW1vbiBvbmVzIGlzIGZvciB1cyB0bw0KPGI+c3VwcG9ydCBub24tT0NhbWwgdG9v bGNoYWlucyBhcyBkZXBlbmRlbmNpZXMgZnJvbSBPQ2FtbCBwYWNrYWdlcyBzdWJtaXR0ZWQgdG8g b3VyIHBhY2thZ2UgcmVwb3NpdG9yeTwvYj4uIEluIHJlY2VudCB5ZWFycywgdGhlcmUgaGF2ZSBi ZWVuIGEgbnVtYmVyIG9mIE9DYW1sIGxpYnJhcmllcyB0aGF0IGRlcGVuZCBvbiBSdXN0LCBQeXRo b24gb3IgTm9kZSwgYW5kIGNhbm5vdCBiZSBlYXNpbHkgdGVzdGVkIGluIG91ciBhdXRvbWF0ZWQg aW5mcmFzdHJ1Y3R1cmUNCiAod2hpY2ggY3VycmVudGx5IHVzZXMgYSBmaXhlZCBiYXNlIGltYWdl IHBlciBkaXN0cmlidXRpb24pLiA8L3A+DQo8cD5J4oCZdmUgcHV0IHRvZ2V0aGVyIGEgcHJvdG90 eXBlIHdheSB3ZSBtaWdodCBzb2x2ZSB0aGlzIGVhc2lseSwgd2l0aG91dCB0YWtpbmcgb24gdGhl IGJ1cmRlbiBvZiBtYWludGFpbmluZyBub24tT0NhbWwgdG9vbGNoYWlucyBvdXJzZWx2ZXMgd2l0 aCBsaW1pdGVkIG1haW50YWluZXIgcmVzb3VyY2VzLiBPcGluaW9ucyBhbmQgaWRlYXMgd2VsY29t ZSBvbiB0aGlzIHRocmVhZCwgYW5kIHRoZSByZXBvc2l0b3J5IGlzIGF0Og0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2F2c20vb3BhbS1sYW5nLXJlcG8iPmh0dHBzOi8vZ2l0aHViLmNvbS9h dnNtL29wYW0tbGFuZy1yZXBvPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc1NThmMTkyIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNTU4ZjE5 MiI+QSBtdWx0aS1sYW5ndWFnZSBkZXZjb250YWluZXIgcGFja2FnZSByZXBvc2l0b3J5PC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc1NThmMTkyIj4NCjxwPjxh IGhyZWY9Imh0dHBzOi8vY29udGFpbmVycy5kZXYiPkRldmNvbnRhaW5lcnM8L2E+IGFyZSBhbiBl bWVyZ2luZyBtZWNoYW5pc20gdG8gdXNlIGNvbnRhaW5lciBydW50aW1lcyBhcyBhIGZ1bGwtZmxl ZGdlZCBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4gVGhleSBjYW4gc3VwcG9ydCBtdWx0aXBsZSBw cm9ncmFtbWluZyBsYW5ndWFnZXMgaW4gb25lIGZpbGVzeXN0ZW0gYnkgbWVhbnMgb2YNCjxhIGhy ZWY9Imh0dHBzOi8vY29udGFpbmVycy5kZXYvaW1wbGVtZW50b3JzL2ZlYXR1cmVzLyI+ZmVhdHVy ZXM8L2E+LCB3aGljaCBhbGxvdyBmb3IgdGhlIGFjdGl2YXRpb24gb2YgYSBnaXZlbiB0b29sY2hh aW4gYWxvbmdzaWRlIG90aGVycy4gRm9yIGV4YW1wbGUsIHVzaW5nIGZlYXR1cmVzIGFsbG93cyBm b3IgdGhlIHNpbXVsdGFuZW91cyB1c2Ugb2YgUHl0aG9uLCBSdXN0IGFuZCBPQ2FtbCB3aXRoaW4g b25lIGNvbnRhaW5lciBpbWFnZSwgd2hlcmVhcw0KIHdpdGggdHJhZGl0aW9uYWwgZGV2Y29udGFp bmVycyB0aGVyZSB3b3VsZCBiZSBhIHNlcGFyYXRlIGNvbnRhaW5lciBmb3IgZWFjaCB0b29sY2hh aW4uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn ODI4NWFkNyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzgyODVhZDciPlVzaW5nIHRo ZSBvcGFtIHNvbHZlciB0byBtYW5hZ2UgZmVhdHVyZSBzZWxlY3Rpb248L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzgyODVhZDciPg0KPHA+VGhlIDxhIGhyZWY9 Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmciPm9wYW08L2E+IHBhY2thZ2UgbWFuYWdlciBpbnRlZ3Jh dGVzIGEgYnVpbHRpbiBjb25zdHJhaW50IHNvbHZlciB0aGF0IGFsbG93cyBmb3IgdGhlIHNlbGVj dGlvbiBvZiBhIGNvbXBhdGlibGUgc2V0IG9mIGRlcGVuZGVuY2llcyBmcm9tIGEgcGFja2FnZSBy ZXBvc2l0b3J5IHRoYXQgY29udGFpbnMgYWxsIHJlbGVhc2VkIHZlcnNpb25zIG9mIGFsbCBwYWNr YWdlcy4NCjwvcD4NCjxwPlRoaXMgcmVwb3NpdG9yeSB0cmFuc2xhdGVzIHB1Ymxpc2hlZCBkZXZj b250YWluZXJzIGludG8gb3BhbSBwYWNrYWdlcywgc3VjaCB0aGF0IGRldmNvbnRhaW5lciBmZWF0 dXJlcyBjYW4gYmUgc2VsZWN0ZWQgYnkgc2ltcGx5IGFkZGluZyBkZXBlbmRlbmNpZXMgdG8gYW4g b3BhbSBwYWNrYWdlLiBBZGRpdGlvbmFsbHksIHZlcnNpb24gY29uc3RyYWludHMgb24gdGhlIGRl c2lyZWQgdG9vbGluZyBjYW4gYmUgYWRkZWQgdG8gcGljayB0aGUgcmVxdWlyZWQNCiB2ZXJzaW9u cy4gRm9yIGV4YW1wbGU6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc3MTliZGVi Ij4NCmRlcGVuZHM6IFsgJnF1b3Q7ZGV2LXJ1c3QmcXVvdDsgeyZndDs9JnF1b3Q7MS42OCZxdW90 O30NCiAgICAgICAgICAgJnF1b3Q7ZGV2LW9jYW1sJnF1b3Q7IHsmZ3Q7PSZxdW90OzQuMTImcXVv dDsgJmFtcDsgJmx0OyAmcXVvdDs1LjAmcXVvdDt9DQogICAgICAgICAgICZxdW90O2Rldi1weXRo b24mcXVvdDsNCiAgICAgICAgICAgJnF1b3Q7ZGV2LXB5dGhvbi1vcHRpbWl6ZSZxdW90OyBdDQo8 L3ByZT4NCjxwPlRoaXMgcGlja3MgYSB2ZXJzaW9uIG9mIFJ1c3QgZ3JlYXRlciB0aGFuIDEuNjgs IGFuZCBhbnkgT0NhbWwgY29tcGlsZXIgYmV0d2VlbiA0LjEyLTQuMTQsIGFuZCBhbnkgUHl0aG9u IGNvbXBpbGVyIHdpdGggdGhlDQo8Y29kZT5vcHRpbWl6ZTwvY29kZT4gZmxhZyBhY3RpdmF0ZWQg Zm9yIG1vcmUgZWZmaWNpZW50IGNvZGUgZ2VuZXJhdGlvbi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzlmOGMyMWMiIGNsYXNzPSJvdXRsaW5lLTQi Pg0KPGg0IGlkPSJvcmc5ZjhjMjFjIj5UaGUgR29vZCBOZXdzPC9oND4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc5ZjhjMjFjIj4NCjxwPlRoaXMgc29sdXRpb24gZnJl ZXMgdGhlIG9wYW0tcmVwbyBtYWludGFpbmVycyBmcm9tIGhhdmluZyB0byBzdXBwb3J0IHRoZSBt eXJpYWQgb3RoZXIgdG9vbGNoYWlucywgYW5kIGxldHMgdXMgZGVwZW5kIG9uIHRoZW0gZnJlZWx5 IGZyb20gb3BhbS4gQnkgYWRkaW5nIGV4cGxpY2l0IGRlcGVuZGVuY2llcyBsaWtlIHRoaXMsIHdl IGNhbiBjb250aW51ZSB0byBydW4gYXV0b21hdGVkIGVuZC10by1lbmQgdGVzdHMgZm9yIG5ldyBh bmQgZXhpc3RpbmcNCiBwYWNrYWdlcyBpbiB0aGUgT0NhbWwgZWNvc3lzdGVtLCBldmVuIHdoZW4g dGhleSBkbyBub3QgZXhjbHVzaXZlbHkgdXNlIE9DYW1sLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2YyZGFjOSIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzdmMmRhYzkiPlRoZSBCYWQgTmV3czwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNCIgaWQ9InRleHQtb3JnN2YyZGFjOSI+DQo8cD5UaGVyZSBhcmUgc3RpbGwgc29t ZSBsaW1pdGF0aW9ucyB0byBmaWd1cmUgb3V0IGJlZm9yZSB0aGlzIGlzIHByb2R1Y3Rpb24gd29y dGh5Og0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBkZXZjb250YWluZXIgaW5z dGFsbGF0aW9uIGJ1c3RzIHRoZSBvcGFtIHNlY3VyaXR5IHNhbmRib3gsIGFuZCBzbyBjYW5ub3Qg YmUgaW5zdGFsbGVkIHNpbXVsdGFuZW91c2x5IHdpdGggbm9ybWFsIHBhY2thZ2VzLiBJdCB3b3Vs ZCBiZSBvayBpbiBhIENJIHN5c3RlbSB3aGVyZSBzYW5kYm94aW5nIGlzIG5vcm1hbGx5IGRpc2Fi bGVkLiBBbm90aGVyIG9wdGlvbiBpcyBmb3IgdGhlc2UgcGFja2FnZXMgdG8gbm90IGFjdHVhbGx5 IHBlcmZvcm0NCiB0aGUgaW5zdGFsbGF0aW9uLCBidXQgZ2VuZXJhdGUgYSBzaW5nbGUgPGNvZGU+ aW5zdGFsbC5zaDwvY29kZT4gd2l0aCBhbGwgdGhlIHJpZ2h0IGVudmlyb25tZW50IHZhcmlhYmxl cy4gQW4gaW1hZ2UgZ2VuZXJhdG9yIGNvdWxkIHRoZW4gcnVuIHRoYXQgc2NyaXB0IHRvIGdlbmVy YXRlIGEgYmFzZSBpbWFnZS4NCjwvbGk+PGxpPm9wYW0gZG9lc27igJl0IGN1cnJlbnRseSBzdXBw b3J0IGNvbXBvc2luZyByZW1vdGUgcmVwb3NpdG9yaWVzLCBzbyBzb21lIHN0cmF0ZWd5IGlzIG5l ZWRlZCBmb3IgaG93IHRvIGtlZXAgdGhpcyBnZW5lcmF0ZWQgcmVwbyBpbiBzeW5jIHdpdGggYW55 dGhpbmcgaW5jbHVkZWQgaW4gdGhlIGNlbnRyYWwgcmVwb3NpdG9yeS4NCjwvbGk+PGxpPk5lZWQg dG8gc3VwcG9ydCBkZXZjb250YWluZXIgYm9vbGVhbiBkZWZhdWx0cyBjb3JyZWN0bHkgKGUuZy4g UHl0aG9uIGZlYXR1cmUpLCBhbmQgZmlndXJlIG91dCB3aGF0IHRvIGRvIGFib3V0IGFyYml0cmFy eSBzdHJpbmcgb3B0aW9ucy4gRW52IHZhcmlhYmxlcyBjb3VsZCBiZSB1c2VkIHRvIHBhc3MgaW4g dmFsdWVzLCBidXQgb3BhbSBjYW7igJl0IHJlY29tcGlsZSBpZiB0aGVzZSB2YXJpYWJsZXMgY2hh bmdlLiBEdW5lIGRvZXMgc3VwcG9ydA0KIHN5c3RlbWF0aWMgZW52IHZhcmlhYmxlIHRyYWNraW5n IGFuZCByZWNvbXBpbGUgaWYgaXQgY2hhbmdlcywgc28gdGhpcyB3b3VsZCB3b3JrIGluIGEgbW9u b3JlcG8uDQo8L2xpPjxsaT5OZWVkIHRvIGV4dHJhY3QgZmVhdHVyZSBkZXBlbmRlbmNpZXMgaW50 byB0aGUgb3BhbSBmb3JtdWxhIGFzIHdlbGwuIDwvbGk+PGxpPlNvbWV0aGluZywgc29tZXRoaW5n LCBOaXgsIGluc3RlYWQ/IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgy IGlkPSIxMyI+U3RhdHVzIG9mIERrTUwgV2luZG93czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtMTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3N0YXR1cy1vZi1ka21sLXdpbmRvd3MvMTI1ODkvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RhdHVzLW9mLWRrbWwtd2luZG93cy8xMjU4OS8xPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzIwMzY0MDkiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyMDM2NDA5Ij5qYmVja2ZvcmQgYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyMDM2NDA5Ij4NCjxw PknigJltIHByZXBhcmluZyB0byByZWxlYXNlIHRoZSBuZXh0IHNlbWktYW5udWFsIHZlcnNpb24g b2YgRGtNTCAodGhlIE1TVkMvV2luZG93cyBkaXN0cmlidXRpb24gZm9yIE9DYW1sKS4gQW1vbmcg b3RoZXIgdGhpbmdzIG5ldyBpbiB0aGlzIHZlcnNpb24sIGl0IGhhcyBiZWVuIGNvbXBsZXRlbHkg ZGVjb3VwbGVkIGZyb20gdGhlIGRlcHJlY2F0ZWQgZmRvcGVuIHJlcG9zaXRvcnkgKHRoYW5rcyBA ZmRvcGVuIGZvciBkb2luZyBpdCBmb3Igc28gbG9uZyEpLg0KIEFuZCBmcm9tIG15IHBlcnNwZWN0 aXZlIFdpbmRvd3MgbG9va3MgZ29vZCBmb3IgT0NhbWwgZ29pbmcgZm9yd2FyZDogPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPm9wYW0gMi4yIHdpbGwgYmUgYWJsZSB0byBzdGFuZCB1cCBh IEN5Z3dpbiAvIE9DYW1sIGNvbXBpbGVyIGZyb20gdGhlIG1haW4gb3BhbSByZXBvc2l0b3J5DQo8 L2xpPjxsaT5vcGFtIENJICYjNDM7IHJlcG9zaXRvcnkgYXJlIGdldHRpbmcgbWVjaGFuaXNtcyBz byB0aGF0IHRoZSBudW1iZXIgb2Ygc2FmZS1mb3ItV2luZG93cyBwYWNrYWdlcyBzaG91bGQgZ3Jv dyBvdmVyIHRpbWUNCjwvbGk+PGxpPk9DYW1sIDUgd2lsbCBiZSBnZXR0aW5nIGZ1bGwgTWluR1cg KEdDQykgYW5kIHRoZW4gTVNWQyBzdXBwb3J0IDwvbGk+PGxpPk1hbnkgbWFueSBwYWNrYWdlcyBo YXZlIGFjY2VwdGVkIE1TVkMgcGF0Y2hlcyA8L2xpPjwvdWw+DQo8cD5UaGVyZSBpcyBvbmUgc3Ry dWN0dXJhbCBwcm9ibGVtIHdpdGggRGtNTCDigKYgaXQgaXMgdGlnaHRseSBjb3VwbGVkIHRvIG15 IGNvbXBhbnkgKERpc2t1dikgYW5kIHRoYXQgaXMgbm90IGhlYWx0aHkuIEluIHBhcnRpY3VsYXIs IHNlZW1pbmdseSBtaW5vciBkZWNpc2lvbnMgb24gbXkgcGFydCAoZXguIHN0aWNraW5nIHdpdGgg T0NhbWwgNCBmb3IgdGhlIGZvcmVzZWVhYmxlIGZ1dHVyZSkgaGF2ZSBhIGxhcmdlIGJsYXN0IHJh ZGl1cyBvbiB0aGUNCiBPQ2FtbCBjb21tdW5pdHkuIDwvcD4NCjxwPkFyZSB0aGVyZSBhbnkgV2lu ZG93cyB1c2VycyB3aG8gd2FudCB0byB1c2UgTVNWQyAmIzQzOyBPQ2FtbCA1IG9uIGEgZGFpbHkg YmFzaXMsIGFuZCB3aG8gYXJlIGFsc28gd2lsbGluZyB0byBtYWludGFpbiB0aGUgT0NhbWwgNSBw YXJ0IG9mIHRoZSBkaXN0cmlidXRpb24/IFRoZSBEa01MIGRpc3RyaWJ1dGlvbiB3aWxsDQo8aT5z dGlsbCBiZSBhY3RpdmVseSBkZXZlbG9wZWQ8L2k+IChpZS4gdGhlIHJlcG9zaXRvcnksIGluc3Rh bGxlciwgZWFzZS1vZi11c2Ugc2hpbXMsIGhvc3RpbmcsIHRlc3RpbmcsIGFuZCByZWxlYXNlIHN5 c3RlbSksIHNvIHlvdXIgbWFpbnRlbmFuY2UgcmVzcG9uc2liaWxpdGllcyBzaG91bGQgbm90IGJl IGV4Y2Vzc2l2ZS4gSWYgc28sIHBsZWFzZSBjb250YWN0IG1lIGluIHRoZSBuZXh0IGZldyBkYXlz IHNvIHlvdSBjYW4gc2VlIHdoYXQgZ29lcw0KIGludG8gdGhlIHJlbGVhc2UgcHJvY2Vzcy4gPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn YWQ4YjY3NyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZ2FkOGI2NzciPk9sZCBDV048 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZ2FkOGI2NzciPg0K PHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFu ZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhl IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVmPSJo dHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9ubGlu ZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmcwNTczNzExIj4NCjxw PjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+ IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 4 Jul 2023 10:20:10 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 4 Jul 2023 10:20:10 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 4 Jul 2023 10:20:10 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3649JR3Y012650 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 4 Jul 2023 10:19:27 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3649JH7X012631 for ; Tue, 4 Jul 2023 10:19:17 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Jul 2023 11:19:16 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 56534E0205; Tue, 4 Jul 2023 11:19:16 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 360CCE0205 for ; Tue, 4 Jul 2023 11:19:09 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Jul 2023 11:19:08 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C9ACF560799; Tue, 4 Jul 2023 11:19:05 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZrli7wQvvpThWLUKi26p8mCOIWQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 4 Jul 2023 10:18:50 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 9f4131a0-c634-4509-7519-08db7c6fddb5 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,180,1684792800"; d="scan'208,217";a="60499681" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.491199, queueID=6431E56079B x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <8F069B96D2592948A52B3B372580777B@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNy0wNCBUdWUgMTE6MTcgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDYuMjcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNy4xMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bmUgMjcgdG8gSnVseSAwNCwgMjAyMy4N CjwvcD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5U YWJsZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiBy b2xlPSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+TmV3IHJlbGVhc2Ugb2YgQ0FJ U0FSLCBhIHBsYXRmb3JtIGZvciBjaGFyYWN0ZXJpemluZyBBSSBzYWZldHkgYW5kIHJvYnVzdG5l c3M8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjMiI+c3RkbGliLXJhbmRvbSByZWxlYXNlIDEuMS4w PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+ZHVuZSAzLjguMDwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzQiPnBsb3RseSByZWxlYXNlIDEuMC4wLCBhIHdyYXBwZXIgZm9yIFBsb3RseSBvcGVuIHNv dXJjZSBncmFwaGluZyBsaWJyYXJ5PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzUiPkhlbHAgdXMg TWFrZSB0aGUgTmV3IExlYXJuIEFyZWEgb24gT0NhbWwub3JnIEF3ZXNvbWU8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM2Ij5TZWRsZXggMy4yPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+ZHVuZSAz LjkuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiNvcmczMGY4N2NlIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjEiPk5ldyByZWxlYXNlIG9mIENBSVNBUiwgYSBwbGF0Zm9ybSBmb3IgY2hhcmFj dGVyaXppbmcgQUkgc2FmZXR5IGFuZCByb2J1c3RuZXNzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtY2Fpc2FyLWEtcGxhdGZvcm0tZm9y LWNoYXJhY3Rlcml6aW5nLWFpLXNhZmV0eS1hbmQtcm9idXN0bmVzcy8xMjQ5MS8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtY2Fpc2FyLWEtcGxhdGZv cm0tZm9yLWNoYXJhY3Rlcml6aW5nLWFpLXNhZmV0eS1hbmQtcm9idXN0bmVzcy8xMjQ5MS8xPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhYjE4ZDhmIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYWIxOGQ4ZiI+SnVsaWVuIEdpcmFyZCBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2FiMThk OGYiPg0KPHA+V2UgYXJlIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIENBSVNBUiAw LjIsIHRvIGNlbGVicmF0ZSAod2l0aCBvbmUgd2VlayBkZWxheSkgdGhlIDIzNHRoIGJpcnRoZGF5 IG9mIHRoZSBTZXJtZW50IGR1IGpldSBkZSBQYXVtZS4gT24gdGhpcyBkYXksIGNvdXJhZ2VvdXMg cGVvcGxlIHRvb2sgYSB2b3cgdG8gYWJvbGlzaCBhdXRvY3JhY3kgYW5kIGZpZ2h0IGZvciB0aGVp ciByaWdodHMuDQo8L3A+DQo8cD5UaGlzIHJlbGVhc2UgaXMgdGhlIHJlc3VsdCBvZiBtb3JlIHRo YW4gb25lIHllYXIgb2Ygd29yay4gSGVyZSBhcmUgc29tZSBvZiB0aGUgbW9zdCBwcm9taW5lbnQg Y2hhbmdlcyB0aGF0IHdlIGFyZSBoYXBweSB0byBzaGFyZS4gVGhlIHJlbGVhc2UgaXMgYXZhaWxh YmxlIHVuZGVyIG91cg0KPGEgaHJlZj0iaHR0cHM6Ly9naXQuZnJhbWEtYy5jb20vcHViL2NhaXNh ci8iPmdpdGxhYjwvYT4sIG9uIG9wYW0gYW5kIG9uIERvY2tlcmh1Yi4gWW91IG1heSBjaGVjayBv dXINCjxhIGhyZWY9Imh0dHBzOi8vY2Fpc2FyLXBsYXRmb3JtLmdpdGh1Yi5pby93ZWJzaXRlLyI+ d2Vic2l0ZTwvYT4gZm9yIGFkZGl0aW9uYWwgaW5mb3MuDQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2RmMWIyMDMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlk PSJvcmdkZjFiMjAzIj5OZXcgcHJvdmVyIHN1cHBvcnQ8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2RmMWIyMDMiPg0KPHA+V2UgYWRkZWQgdGhlIHN1cHBvcnQg b2Ygc2V2ZXJhbCBwcm92ZXJzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+dGhlIGFs cGhhLWJldGEtQ1JPV05wcm92ZXI7IHdpbm5lciBvZiB0aGUgMjAyMSBhbmQgMjAyMiBlZGl0aW9u IG9mIHRoZSBWTk4tQ09NUA0KPC9saT48bGk+dGhlIG5uZW51bWh0dHBzOi8vZ2l0aHViLmNvbS9z dGFubGV5YmFrL25uZW51bSkgcHJvdmVyIDwvbGk+PGxpPnRoZSBBSU1PUyBtZXRhbW9ycGhpYyB0 ZXN0aW5nIHByb3ZlciwgZm9yIG5vdyBpbnRlcm5hbGx5IGRldmVsb3BwZWQgYXQgQ0VBIDwvbGk+ PC91bD4NCjxwPldlIGFsc28gYWRkZWQgc3VwcG9ydCB0byB0aGUgVk5OTGliIHN0YW5kYXJkLiBJ biB0aGUgZnV0dXJlLCBhZGRpbmcgYSBWTk5MaWIgY29tcGxpYW50IHByb3ZlciB0byBDQUlTQVIg d291bGQgb25seSByZXF1aXJlIHRvIGVkaXQgdHdvIHNtYWxsIGZpbGVzLCB3aGljaCBpcyBhIGh1 Z2Ugc3RlcCB0b3dhcmRzIGludGVncmF0aW5nIG1vcmUgcHJvdmVycy4gVGhpcyBhbHNvIHJlc3Vs dHMgaW4gc3VwcG9ydGluZyBhbGwgc29sdmVycyB0aGF0IHN1cHBvcnQNCiB0aGUgU01UTElCMiBs YW5ndWFnZSAod2hpY2ggVk5OTGliIGlzIGEgc3Vic2V0IG9mKS4gV2UgaW1wbGVtZW50ZWQgYSBj dXN0b20gdHJhbnNmb3JtYXRpb24gaW4gQ0FJU0FSIHRoYXQgYXV0b21hdGljYWxseSB0cmFuc2xh dGVzIHRoZSBuZXVyYWwgbmV0d29yayBjb250cm9sIGZsb3cgaW50byBhIFNNVCBmb3JtdWxhLiBU aGlzIGN1c3RvbSB0cmFuc2Zvcm1hdGlvbiBoYWQgYmVlbiB0ZXN0ZWQgZm9yIHRoZSBDVkM1IHNv bHZlci4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmcyYzZmNDA2IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMmM2ZjQwNiI+TWFudWFs PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcyYzZmNDA2Ij4N CjxwPlRoZSBmaXJzdCB2ZXJzaW9uIG9mIHRoZSBDQUlTQVIgbWFudWFsIGlzIGF2YWlsYWJsZSB1 bmRlciB0aGUgZG9jdW1lbnRhdGlvbiBzZWN0aW9uIG9mIG91ciB3ZWJzaXRlLiBJdCBpbmNsdWRl cyBkZXRhaWxlZCBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLCBhIHN5bm9wc2lzIG9mIGNvbW1v biBjb21tYW5kcyBhbmQgdHdvIHR1dG9yaWFscyBvbiBjbGFzc2ljYWwgYmVuY2htYXJrcy4gVGhl IGN1cnJlbnQgdmVyc2lvbiBvZiB0aG9zZSB0dXRvcmlhbHMNCiBtYWtlIHVzZSBvZiBleHBlcmlt ZW50YWwgZmVhdHVyZXMgdGhhdCB3ZSBwbGFuIHRvIGRvY3VtZW50IGluIGEgZnV0dXJlIHJlbGVh c2UuIFdlIGhvcGUgdGhpcyBtYW51YWwgd2lsbCBwcm92aWRlIGEgZ29vZCBlbnRyeSBwb2ludCB0 byBDQUlTQVIsIGFuZCBmb3JtYWwgdmVyaWZpY2F0aW9uIG9mIG1hY2hpbmUgbGVhcm5pbmcgcHJv Z3JhbXMgYXQgbGFyZ2UuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNDk1NDhmOCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzQ5NTQ4 ZjgiPlVzYWJpbGl0eTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnNDk1NDhmOCI+DQo8cD5XZSBhZGRlZCB2YXJpb3VzIHV0aWxpdGllcyB0byBtYWtlIENBSVNB UiBzbGlja2VyIHRvIHVzZSwgc3VjaCBhcyBzZXZlcmFsIGxvZ2dpbmcgb3B0aW9ucywgdmVyaWZp Y2F0aW9uIHRocm91Z2ggYSBKU09OIGZpbGUsIGFuZCByZXdvcmtlZCBoZWxwIG1lc3NhZ2VzLg0K PC9wPg0KPHA+V2UgYXJlIGFsc28gbG9va2luZyBmb3IgZml4ZWQtdGVybSBwb3NpdGlvbnMsIGlu dGVybiBhbmQgUGhEIHN0dWRlbnRzIHRvIHdvcmsgb24gQ0FJU0FSLCBjaGVjayBvdXIgd2Vic2l0 ZSBvciB0aGUgb2NhbWwgam9iIGJvYXJkIGZvciBtb3JlIGluZm9zLg0KPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+c3RkbGliLXJhbmRvbSByZWxlYXNlIDEuMS4wPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc3RkbGliLXJhbmRvbS1y ZWxlYXNlLTEtMS0wLzEyNDk1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1z dGRsaWItcmFuZG9tLXJlbGVhc2UtMS0xLTAvMTI0OTUvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhNGYzNjMwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnYTRmMzYzMCI+b2N0YWNocm9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTRmMzYzMCI+DQo8cD5UaGUgbGlicmFyeSA8Y29k ZT5zdGRsaWItcmFuZG9tPC9jb2RlPiBpcyBhIHNtYWxsIGNvbXBhdGliaWxpdHkgbGlicmFyeSB0 aGF0IHByb3ZpZGVzIGNvbXBpbGVyLWluZGVwZW5kZW50IGltcGxlbWVudGF0aW9ucyBvZiB0aGUg UFJOR3MgdXNlZCBpbiB0aGUgaGlzdG9yeSBvZiB0aGUgc3RhbmRhcmQgbGlicmFyeQ0KPGNvZGU+ UmFuZG9tPC9jb2RlPjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnN0ZGxpYi1yYW5k b20udjM6IGltcGxlbWVudCB0aGUgUFJORyB1c2VkIGluIE9DYW1sIDMuMDcgdG8gMy4xMSA8L2xp PjxsaT5zdGRsaWItcmFuZG9tLnY0OiBpbXBsZW1lbnQgdGhlIFBSTkcgdXNlZCBpbiBPQ2FtbCAz LjEyIHRvIDQuMTQgPC9saT48bGk+c3RkbGliLXJhbmRvbS52NTogaW1wbGVtZW50IHRoZSBQUk5H IGN1cnJlbnRseSB1c2VkIGluIE9DYW1sIDUgPC9saT48bGk+c3RkbGliLXJhbmRvbS52NW86IGlt cGxlbWVudCB0aGUgUFJORyBjdXJyZW50bHkgdXNlZCBpbiBPQ2FtbCA1IGluIHB1cmUgT0NhbWwN CjwvbGk+PC91bD4NCjxwPlRoaXMgbGlicmFyeSBpcyB0YXJnZXRlZCB0b3dhcmQgcHJvZ3JhbXMg dGhhdCBuZWVkIGEgZGV0ZXJtaW5pc3RpYyBhbmQgc3RhYmxlIGJlaGF2aW9yIG9mIHRoZQ0KPGNv ZGU+UmFuZG9tPC9jb2RlPiBtb2R1bGUgYWNyb3NzIE9DYW1sIHZlcnNpb25zLiA8L3A+DQo8cD5U aGUgbmV3bHkgcmVsZWFzZWQgdmVyc2lvbiAxLjEuMCB1cGRhdGVzIGFsbCBpbXBsZW1lbnRhdGlv bnMgdG8gcHJvdmlkZSB0aGUgbmV3IFBSTkcgc3RhdGUgc2VyaWFsaXphdGlvbiBmdW5jdGlvbnMg KDxjb2RlPlJhbmRvbS5TdGF0ZS50b19iaW5hcnlfc3RyaW5nPC9jb2RlPiBhbmQNCjxjb2RlPlJh bmRvbS5TdGF0ZS5vZl9iaW5hcnlfc3RyaW5nPC9jb2RlPikgdGhhdCB3aWxsIGJlIGF2YWlsYWJs ZSBpbiBPQ2FtbCA1LjEuMCAuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+ZHVu ZSAzLjguMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUt My04LTAvMTIyOTEvMyI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5lLTMtOC0w LzEyMjkxLzM8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzJiYjRlNGYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyYmI0ZTRmIj5FdGllbm5l IE1pbGxvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzJiYjRlNGYiPg0KPHA+QW5kIGhlcmXigJlzIHRoZSBjaGFuZ2Vsb2cgZm9yIGR1bmUg My44LjMsIGp1c3QgcmVsZWFzZWQsIHdoaWNoIGZpeGVzIHR3byBpbXBvcnRhbnQgYnVncyBvbiBM aW51eCBhbmQgV2luZG93czoNCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnMmI4YjQwZCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzJiOGI0MGQiPjMu OC4zICgyMDIzLTA2LTI3KTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnMmI4YjQwZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Rml4IGRlYWRsb2NrIG9u IFdpbmRvd3MgKCM4MDQ0LCBAbm9qYikgPC9saT48bGk+V2hlbiB1c2luZyA8Y29kZT5zZW5kZmls ZTwvY29kZT4gdG8gY29weSBmaWxlcyBvbiBMaW51eCwgZmFsbCBiYWNrIHRvIHRoZSBwb3J0YWJs ZSB2ZXJzaW9uIGlmIGl0IGZhaWxzIGF0IHJ1bnRpbWUgZm9yIHNvbWUgcmVhc29uIChORlMsIGV0 YykuICgjODA0OSwgZml4ZXMgIzgwNDEsIEBlbWlsbG9uKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+cGxvdGx5IHJlbGVhc2UgMS4wLjAsIGEgd3JhcHBl ciBmb3IgUGxvdGx5IG9wZW4gc291cmNlIGdyYXBoaW5nIGxpYnJhcnk8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wbG90bHktcmVsZWFzZS0xLTAtMC1hLXdyYXBw ZXItZm9yLXBsb3RseS1vcGVuLXNvdXJjZS1ncmFwaGluZy1saWJyYXJ5LzEyNTA2LzEiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wbG90bHktcmVsZWFzZS0xLTAtMC1hLXdyYXBw ZXItZm9yLXBsb3RseS1vcGVuLXNvdXJjZS1ncmFwaGluZy1saWJyYXJ5LzEyNTA2LzE8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVmYmJkZGIiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1ZmJiZGRiIj5KdW4gRnVydXNlIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWZiYmRkYiI+DQo8 cD5JIHJlbGVhc2VkIGFuIE9QQU0gcGFja2FnZSBwbG90bHksIGEgd3JhcHBlciBmb3IgPGEgaHJl Zj0iaHR0cHM6Ly9wbG90bHkuY29tL2dyYXBoaW5nLWxpYnJhcmllcy8iPg0KUGxvdGx5IE9wZW4g U291cmNlIEdyYXBoaW5nIExpYnJhcnk8L2E+LiA8L3A+DQo8cD5JdCBwcm92aWRlcyBpbnRlcmZh Y2VzIGZvciAyIGJhY2tlbmRzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+4oCcUHl0 aG9u4oCdIHZlcnNpb24sIHVzaW5nIHRoZSBQeXRob24gbGlicmFyeSBvZiBQbG90bHkgdmlhIFB5 bWwsIGZvciBzdGFuZGFsb25lIHByb2dyYW1zDQo8L2xpPjxsaT7igJxKU09P4oCdIHZlcnNpb24s IHVzaW5nIHRoZSBKUyBsaWJyYXJ5IG9mIFBsb3RseSB2aWEgSlNPTywgZm9yIGJyb3dzZXJzIDwv bGk+PC91bD4NCjxwPkl0IHN1cHBvcnRzIG9ubHkgYSBmZXcgY2hhcnRzIChzY2F0dGVyLCBzY2F0 dGVyM2QsIGJhciwgcGllKSBhbmQgb3B0aW9ucyBjdXJyZW50bHksIGJ1dCBpdCBzaG91bGQgYmUg ZWFzeSB0byBhZGQgbW9yZS4gRW5qb3khDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnZjA3NjAxZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2YwNzYwMWYiPm40MzIzIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmdmMDc2MDFmIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9j YW1sc3BvdHRlci9wbG90bHktb2NhbWwiPm1pc3Npbmcgc291cmNlIGxpbms8L2E+IDwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5IZWxwIHVzIE1ha2UgdGhlIE5ldyBMZWFybiBBcmVh IG9uIE9DYW1sLm9yZyBBd2Vzb21lPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9oZWxwLXVzLW1ha2UtdGhlLW5ldy1sZWFybi1hcmVhLW9uLW9jYW1sLW9yZy1hd2Vzb21l LzEyNTA4LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hlbHAtdXMtbWFrZS10aGUt bmV3LWxlYXJuLWFyZWEtb24tb2NhbWwtb3JnLWF3ZXNvbWUvMTI1MDgvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDg5MWIxYyIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzQ4OTFiMWMiPlNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzQ4OTFiMWMiPg0KPHA+ SeKAmW0gaGVyZSB0byBkcmF3IG9uIHlvdXIgY29sbGVjdGl2ZSB3aXNkb20gYWdhaW4hIDwvcD4N CjxwPkhlcmXigJlzIGEgd29yay1pbi1wcm9ncmVzcyBkcmFmdCBvZiB0aGUgbmV3IExlYXJuIEFy ZWEgbGFuZGluZyBwYWdlOiA8L3A+DQo8ZGl2IGlkPSJvcmczOGJkNDc4IiBjbGFzcz0iZmlndXJl Ij4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVz czcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvYS9hNzE5MWQ3MmZkNDgzZTY5NGRkZDVlOWU2 NjFkMDJjZDc4ZjY1NDJkXzJfMzA4eDEwMDAucG5nIiBhbHQ9ImE3MTkxZDcyZmQ0ODNlNjk0ZGRk NWU5ZTY2MWQwMmNkNzhmNjU0MmRfMl8zMDh4MTAwMC5wbmciPg0KPC9wPg0KPC9kaXY+DQo8cD48 YSBocmVmPSJodHRwczovL3d3dy5maWdtYS5jb20vcHJvdG8vQXFrNXkwM2ZzYUN1aFRTeXdtbVkw Ni9PQ2FtbC5vcmctUHVibGljLURlc2lnbnM/dHlwZT1kZXNpZ24mYW1wO25vZGUtaWQ9MTMwLTc2 NyZhbXA7dD03SUNBM2dmeEh0ZUZJMGxlLTAmYW1wO3NjYWxpbmc9bWluLXpvb20mYW1wO3BhZ2Ut aWQ9MTMwJTNBNzU0Ij5EZXNpZ24gb24gRmlnbWE8L2E+DQo8L3A+DQo8cD5BcyB5b3UgY2FuIHNl ZSwgdGhlcmXigJlzIHN0aWxsIHdvcmsgdG8gYmUgZG9uZS4gRm9yIGV4YW1wbGUsIHdl4oCZcmUg Z29pbmcgdG8gbWFrZSB0aGUg4oCcRG93bmxvYWTigJ0gYW5kIHRoZSDigJxTdGFuZGFyZCBMaWJy YXJ54oCdIGJveGVzIGEgYml0IHNtYWxsZXIuIEFuZCwgY2xlYXJseSwgdGhpcyBkZXNpZ24gaXMg dXNpbmcgcGxhY2Vob2xkZXIgY29udGVudC4NCjwvcD4NCjxwPkFsbCB0aGUgZGVzaWduIGhhcyBi ZWVuIGRvbmUgd2l0aCBvbmUgdGhpbmcgaW4gbWluZDogRmxleGliaWxpdHkgdG8gYXJyYW5nZSBj b250ZW50IGluIHN1Y2ggYSB3YXkgdGhhdCB3ZSBjYW4gc2hvdyBkaWZmZXJlbnQgZ3JvdXBzIG9m IHVzZXJzIHdoYXQgdGhleSBuZWVkIHRvIHNlZS4gV2UgY2FuIHJlYXJyYW5nZSBhbmQgZXhwZXJp bWVudCB3aXRoIHRoZSBibG9ja3MgeW91IHNlZSBvbiB0aGUgcGFnZS4NCjwvcD4NCjxwPiZndDtG cm9tIHRoZSBmZWVkYmFjayB3ZSBnb3QgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3lvdS1zdGFydGVkLXRvLWxlYXJuLW9jYW1sLWxlc3MtdGhhbi0xMi1tb250aHMtYWdv LXBsZWFzZS1oZWxwLXVzLXdpdGgtb3VyLXVzZXItc3VydmV5LW9uLXRoZS1vY2FtbC1vcmctbGVh cm5pbmctYXJlYS8xMTk0NS8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC95b3Utc3Rh cnRlZC10by1sZWFybi1vY2FtbC1sZXNzLXRoYW4tMTItbW9udGhzLWFnby1wbGVhc2UtaGVscC11 cy13aXRoLW91ci11c2VyLXN1cnZleS1vbi10aGUtb2NhbWwtb3JnLWxlYXJuaW5nLWFyZWEvMTE5 NDUvMjwvYT4sIHdlIGlkZW50aWZpZWQgYSBjb21tb24gcGF0dGVybiB0aGF0IGFsbCBnb29kIHBy b2dyYW1taW5nIGxhbmd1YWdlIGRvY3VtZW50YXRpb24gcGFnZXMgaGF2ZToNCjwvcD4NCjxwPlRo ZXJlIGlzIGEgcHJvZ3Jlc3Npb24gZnJvbSBiZWdpbm5lciBjb250ZW50IHRvIGFkdmFuY2VkIGNv bnRlbnQsIGZvY3VzZWQgY2xlYXJseSBvbiB0aGUgdGhpbmdzIHRoYXQgcGVvcGxlIG5lZWQgdG8g bGVhcm4gdG8gYmUgcHJvZHVjdGl2ZSB3aXRoIHRoZSBsYW5ndWFnZS4NCjwvcD4NCjxwPk5vd+KA piBoZXJl4oCZcyB3aGF0IEkgYXNrIHlvdSB0byBkbzogSW1hZ2luZSA8Yj53aGljaCBkb2N1bWVu dGF0aW9uIGRvIHdlIGhhdmUgdG8gZ2l2ZSBwZW9wbGU8L2I+IGhlcmUgb24gdGhlIG1haW4gcGFn ZSBvZiB0aGUgTGVhcm4gQXJlYQ0KPGI+dG8gbWFrZSB0aGVtIGhhcHB5IGFuZCBwcm9kdWN0aXZl PC9iPiB3aXRoIE9DYW1sOiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+V2hpY2ggdG9w aWNzIHdvdWxkIGhhdmUgdG8gYmUgY292ZXJlZCBieSB0aGUg4oCcdHV0b3JpYWwgYmxvY2tz4oCd PyA8L2xpPjxsaT5XaGljaCBib29rcyBkbyB3ZSBmZWF0dXJlPyA8L2xpPjwvb2w+DQo8cD5UaGUg cG9pbnQgb2YgdGhlIG1haW4gcGFnZSBvZiB0aGUgTGVhcm4gYXJlYSBpcyB0byBxdWlja2x5IGd1 aWRlIHBlb3BsZSBpbnRvIHRoZSBkaXJlY3Rpb24gdGhleSBtYXkgYmUgaW50ZXJlc3RlZCBpbi4N CjwvcD4NCjxwPjxiPllvdXIgZmVlZGJhY2sgZGlyZWN0bHkgaGVscHMgdXMgcHJpb3JpdGl6ZSB0 aGUgY3JlYXRpb24gb2YgbWlzc2luZyBkb2N1bWVudGF0aW9uIGFuZCBoZWxwcyB1cyByZWFycmFu Z2UgJmFtcDsgaW1wcm92ZSB0aGUgZXhpc3RpbmcgZG9jdW1lbnRhdGlvbi48L2I+IFBsZWFzZSBk byBiZSBzcGVjaWZpYyBhbmQgZ2l2ZSB1cyB0aXRsZXMgZm9yIHRoZSBwYWdlcyB5b3Ugd2FudCB0 byBzZWUsIGFzIHdlbGwgYXMgYSBzaG9ydCBkZXNjcmlwdGlvbiBhYm91dA0KIHdoYXQgdGhlIHVz ZXIgd291bGQgZmluZCB0aGVyZS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPlNl ZGxleCAzLjI8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zZWRs ZXgtMy0yLzEyNTEzLzEiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc2VkbGV4LTMt Mi8xMjUxMy8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmczZTk4ZTMyIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnM2U5OGUzMiI+Um9tYWlu IEJlYXV4aXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmczZTk4ZTMyIj4NCjxwPlNlZGxleCAzLjIgaXMgb3V0ISDwn46JIDwvcD4NCjxwPlNl ZGxleCBpcyBhIHVuaWNvZGUtZnJpZW5kbHkgbGV4ZXIgZ2VuZXJhdG9yIGZvciBPQ2FtbCBvcmln aW5hbGx5IHdyaXR0ZW4gYnkgQWxhaW4gRnJpc2NoIGF0IExleGlGaSBhbmQgbm93IG1haW50YWlu ZWQgdW5kZXIgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtY29tbXVuaXR5 Ij5vY2FtbC1jb21tdW5pdHk8L2E+IHVtYnJlbGxhLiA8L3A+DQo8cD5Zb3UgcmVhZCB0aGUgbm90 ZXMgZm9yIHRoaXMgcmVsZWFzZSBoZXJlOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtY29tbXVuaXR5L3NlZGxleC9yZWxlYXNlcy90YWcvdjMuMiI+DQpodHRwczovL2dpdGh1Yi5j b20vb2NhbWwtY29tbXVuaXR5L3NlZGxleC9yZWxlYXNlcy90YWcvdjMuMjwvYT4gYW5kIGFuIHVw ZGF0ZWQgPGNvZGU+DQpvcGFtPC9jb2RlPiBwYWNrYWdlIHNob3VsZCA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjQwMjciPg0KYmUgYXZhaWxh YmxlIHNvb248L2E+LiA8L3A+DQo8cD5UaGlzIHJlbGVhc2UgYnJpbmdzIGltcHJvdmVtZW50cyBv biBhIGNvdXBsZSBvZiBmcm9udHM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5CZXR0 ZXIgcGVyZm9ybWFuY2Ugd2hlbiBwYXJzaW5nIGluLW1lbW9yeSBzdHJpbmdzICh1cCB0byA8Y29k ZT4yMHg8L2NvZGU+IG9uIGxhcmdlIG9uZXMhKQ0KPC9saT48bGk+Q2xlYW5lZCB1cCBsb2dpYyB3 aXRoIGJldHRlciA8Y29kZT5NYWxGb3JtZWQ8L2NvZGU+IGVycm9yIHJlcG9ydGluZyA8L2xpPjxs aT5BIG5ldyBwb3NpdGlvbiBBUEkgcmV0dXJuaW5nIHBvc2l0aW9ucyBpbiBieXRlcyByYXRoZXIg dGhhbiBjb2RlIHBvaW50cy4gPC9saT48L3VsPg0KPHA+VGhlIGxhc3QgcG9pbnQgbWlnaHQgYmUg b2YgaW50ZXJlc3QgdG8gbW9zdCB1c2VycyBvZiB0aGUgbGlicmFyeS4gSXQgaXMgaW4gZmFjdCBx dWl0ZSBsaWtlbHkgdGhhdCBhIGxvdCBvZiB1c2VycyB3ZXJlIGFscmVhZHkgZXhwZWN0aW5nIHRo ZSBleGlzdGluZyBwb3NpdGlvbiBBUEkgdG8gcmV0dXJuIHBvc2l0aW9ucyBpbiBieXRlcy4gSWYg c28sIGZlZWwgZnJlZSB0byB1cGdyYWRlIHRvIHRoaXMgdmVyc2lvbiENCjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI3Ij5kdW5lIDMuOS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTktMC8xMjUzMC8xIj5odHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWR1bmUtMy05LTAvMTI1MzAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnYzg3MDBiMCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZ2M4NzAwYjAiPkV0aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzg3MDBiMCI+DQo8cD5UaGUgRHVuZSB0ZWFt IGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRHVuZSAzLjkuMC4gSXQgY29t ZXMgd2l0aCBtYW55IG5ldyBmZWF0dXJlcywgaW5jbHVkaW5nOg0KPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPmEgbmV3IDxjb2RlPmR1bmUgc2hvdzwvY29kZT4gY29tbWFuZCB0byBkaXNw bGF5IHZhcmlvdXMgcGllY2VzIG9mIGluZm9ybWF0aW9uLg0KPC9saT48bGk+c29tZSBmaXhlcyBp biB0aGUgZGlhbGVjdCBzdXBwb3J0IHRoYXQgd2lsbCBtYWtlIGl0IGVhc2llciB0byB3b3JrIHdp dGggRHJlYW3igJlzIGVtbCBmaWxlcw0KPC9saT48bGk+YSBuZXcgPGNvZGU+KGJ1aWxkX2lmKTwv Y29kZT4gdG9nZ2xlIGluIHRoZSA8Y29kZT4odGVzdCk8L2NvZGU+IHN0YW56YSB3aGljaCB3aWxs IGhlbHAgcGFja2FnaW5nIG5vbnBvcnRhYmxlIHRlc3RzIGFuZCBiZW5jaG1hcmtzLg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3YjA2OGY4IiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnN2IwNjhmOCI+QWRkZWQ8L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzdiMDY4ZjgiPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkluY2x1ZGUgdGhlIHRpbWUgaXQgdGFrZXMgdG8gcmVhZC93cml0ZSBzdGF0ZSBm aWxlcyB3aGVuIDxjb2RlPi0tdHJhY2UtZmlsZTwvY29kZT4gaXMgZW5hYmxlZCAoIzc5NjAsIEBy Z3JpbmJlcmcpDQo8L2xpPjxsaT5JbmNsdWRlIHNvdXJjZSB0cmVlIHNjYW5zIGluIHRoZSB0cmFj ZXMgcHJvZHVjZWQgYnkgPGNvZGU+LS10cmFjZS1maWxlPC9jb2RlPiAoIzc5MzcsIEByZ3JpbmJl cmcpDQo8L2xpPjxsaT5BZGQgPGNvZGU+LS1hbGw8L2NvZGU+IG9wdGlvbiB0byA8Y29kZT5kdW5l IHJwYyBzdGF0dXM8L2NvZGU+IHRvIHNob3cgYWxsIER1bmUgUlBDIHNlcnZlcnMgcnVubmluZy4g KCM4MDExLCBmaXggIzc5MDIsIEBBbGl6dGVyKQ0KPC9saT48bGk+QWRkIGFkZGl0aW9uYWwgbWV0 YWRhdGEgdG8gdGhlIHRyYWNlcyBwcm92aWRlZCBieSA8Y29kZT4tLXRyYWNlLWZpbGU8L2NvZGU+ IHdoZW5ldmVyDQo8Y29kZT4tLXRyYWNlLWV4dGVuZGVkPC9jb2RlPiBpcyBwYXNzZWQgKCM3Nzc4 LCBAcmxlc2hjaGluc2tpeSkgPC9saT48bGk+PGNvZGU+JCBkdW5lIGRlc2NyaWJlPC9jb2RlPiBp cyBub3cgYSBjb21tYW5kIGdyb3VwLCBzbyBhcmd1bWVudHMgdG8gc3ViY29tbWFuZHMgbXVzdCBi ZSBwYXNzZWQgYWZ0ZXIgc3ViY29tbWFuZCBpdHNlbGYuICgjNzkxOSwgQEFsaXp0ZXIpDQo8L2xp PjxsaT5BZGQgPGNvZGU+ZHVuZSBzaG93PC9jb2RlPiBjb21tYW5kIGdyb3VwIHdoaWNoIGlzIGFu IGFsaWFzIG9mIDxjb2RlPmR1bmUgZGVzY3JpYmU8L2NvZGU+LiAoIzc5NDYsIEBBbGl6dGVyKQ0K PC9saT48bGk+QWRkIDxjb2RlPmR1bmUgc2hvdyBlbnY8L2NvZGU+IGNvbW1hbmQgYW5kIG1ha2Ug PGNvZGU+ZHVuZSBwcmludGVudjwvY29kZT4gYW4gYWxpYXMgb2YgaXQuICgjNzk4NSwgQEFsaXp0 ZXIpDQo8L2xpPjxsaT5BZGQgY29tbWFuZHMgPGNvZGU+ZHVuZSBzaG93IHRhcmdldHM8L2NvZGU+ IGFuZCA8Y29kZT5kdW5lIHNob3cgYWxpYXNlczwvY29kZT4gdGhhdCBkaXNwbGF5IGFsbCB0aGUg YXZhaWxhYmxlIHRhcmdldHMgYW5kIGFsaWFzZXMgaW4gYSBnaXZlbiBkaXJlY3RvcnkgcmVzcGVj dGl2ZWx5LiAoIzc3NzAsIGdyYW50cyAjMjY1LCBAQWxpenRlcikNCjwvbGk+PGxpPkV4dGVuc2lv bnMgdXNlZCBpbiA8Y29kZT4oZGlhbGVjdCk8L2NvZGU+IGNhbiBjb250YWluIHBlcmlvZHMgKGUu Zy4sIDxjb2RlPmNwcG8ubWw8L2NvZGU+KS4gKCM3NzgyLCBmaXhlcyAjNzc3NywgQG5vamIpDQo8 L2xpPjxsaT5UaGUgPGNvZGU+aW50ZXJmYWNlPC9jb2RlPiBhbmQgPGNvZGU+aW1wbGVtZW50YXRp b248L2NvZGU+IGZpZWxkcyBvZiBhIDxjb2RlPg0KKGRpYWxlY3QpPC9jb2RlPiBhcmUgbm93IG9w dGlvbmFsICgjNzc1NywgQGdwZXRpb3QpIDwvbGk+PGxpPkFkZCA8Y29kZT4oYnVpbGRfaWYpPC9j b2RlPiB0byB0aGUgPGNvZGU+KHRlc3QpPC9jb2RlPiBzdGFuemEuIFdoZW4gaXQgZXZhbHVhdGVz IHRvIGZhbHNlLCB0aGUgZXhlY3V0YWJsZSBpcyBub3QgYnVpbHQuICgjNzg5OSwgZml4ZXMgIzY5 MzgsIEBlbWlsbG9uKQ0KPC9saT48bGk+QWxsb3cgPGNvZGU+KGluY2x1ZGVfc3ViZGlycyBxdWFs aWZpZWQpPC9jb2RlPiB0byBiZSB1c2VkIHdoZW4gbGlicmFyaWVzIGRlZmluZSBhDQo8Y29kZT4o bW9kdWxlcyAuLi4pPC9jb2RlPiBmaWVsZCAoIzc3OTcsIGZpeGVzICM3NTk3LCBAYW5tb250ZWly bykgPC9saT48bGk+QWxsb3cgbXVsdGlwbGUgZ2xvYnMgaW4gbGlicmFyeeKAmXMgPGNvZGU+KHN0 ZGxpYiAoaW50ZXJuYWxfbW9kdWxlcyAuLikpPC9jb2RlPiAoQGFubW9udGVpcm8sICM3ODc4KQ0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2RhNWU0NzkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdkYTVlNDc5Ij5DaGFuZ2Vk PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdkYTVlNDc5Ij4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5EbyBub3QgcmUtcnVuIE9DYW1sIHN5bnRheCBmaWxl cyBvbiBldmVyeSBpdGVyYXRpb24gb2YgdGhlIHdhdGNoIG1vZGUuIFRoaXMgaXMgdG9vIG1lbW9y eSBjb25zdW1pbmcuICgjNzg5NCwgZml4ICM2OTAwLCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+QXR0 YWNoIG1lbGFuZ2UgcnVsZXMgdG8gdGhlIGRlZmF1bHQgYWxpYXMgKCM3OTI2LCBAaGFvY2hlbngp IDwvbGk+PGxpPkNvbXB1dGUgZGlnZXN0cyBhbmQgbWFuYWdlIHNhbmRib3hlcyBpbiBiYWNrZ3Jv dW5kIHRocmVhZHMgKCM3OTQ3LCBAcmdyaW5iZXJnKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzI4MzEwZTUiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmcyODMxMGU1Ij5GaXhlZDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnMjgzMTBlNSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ VmFsaWRhdGUgZmlsZSBleHRlbnNpb24gZm9yIDxjb2RlPiQgZHVuZSBvY2FtbCB0b3AtbW9kdWxl PC9jb2RlPi4gKCM4MDA1LCBmaXhlcyAjODAwNCwgQDNSYWZhbCkNCjwvbGk+PGxpPkNpbmFwczog VGhlIHByb21vdGlvbiBydWxlcyBmb3IgY2luYXBzIHdvdWxkIG9ubHkgb2ZmZXIgb25lIGZpbGUg YXQgYSB0aW1lIG5vIG1hdHRlciBob3cgbWFueSBwcm9tb3Rpb25zIHdlcmUgYXZhaWxhYmxlLiBO b3cgd2Ugb2ZmZXIgYWxsIHRoZSBwcm9tb3Rpb25zIGF0IG9uY2UgKCM3OTAxLCBAcmdyaW5iZXJn KQ0KPC9saT48bGk+QWRkIG5lY2Vzc2FyeSBwYXJlbnRoZXNlcyBpbiBnZW5lcmF0ZWQgb3BhbSBj b25zdHJhaW50cyAoIzc2ODIsIGZpeGVzICMzNDMxLCBATHVjY2N5bykNCjwvbGk+PC91bD4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyMWRlODQxIiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMjFkZTg0MSI+UmVtb3ZlZDwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMjFkZTg0MSI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+UmVtb3ZlIHNvbWUgY29tcGF0aWJpbGl0eSBjb2RlIGZvciBvbGQgdmVyc2lv biBvZiBkdW5lIHRoYXQgZ2VuZXJhdGVkIDxjb2RlPi5tZXJsaW48L2NvZGU+IGZpbGVzLiBOb3cg ZHVuZSB3aWxsIG5ldmVyIHJlbW92ZQ0KPGNvZGU+Lm1lcmxpbjwvY29kZT4gZmlsZXMgYXV0b21h dGljYWxseSAoIzc1NjIpIDwvbGk+PGxpPkluIG9wYW0gY29uc3RyYWludHMsIHJlamVjdCA8Y29k ZT4oYW5kKTwvY29kZT4gYW5kIDxjb2RlPihvcik8L2NvZGU+IHdpdGggbm8gYXJndW1lbnRzIGF0 IHBhcnNlIHRpbWUgKCM3NzMwLCBAZW1pbGxvbikNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnZTQzZmQxZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U0M2ZkMWUi PkZyb20gdGhlIG9jYW1sLm9yZyBibG9nPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmdlNDNmZDFlIj4NCjxwPkhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2Ft bCBibG9ncyBhZ2dyZWdhdGVkIGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvIj4N CnRoZSBvY2FtbC5vcmcgYmxvZzwvYT4uIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48 YSBocmVmPSJodHRwczovL3RlY2guYWhyZWZzLmNvbS9lbWVsbGV0di10YWxraW5nLXdpdGgtbG91 aXMtcm9jaGUlQ0MlODEtYWJvdXQtb2NhbWwtYW5kLWFocmVmcy03NzY3YWZiZmJkYjkiPkVtZWxs ZVRWOiBUYWxraW5nIHdpdGggTG91aXMgUm9jaGXMgSBhYm91dCBPQ2FtbCBhbmQgQWhyZWZzPC9h Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnMzBmODdjZSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzMwZjg3 Y2UiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9y ZzMwZjg3Y2UiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhy ZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1l c3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0 IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2 ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3 bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZSA8YSBocmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVr bHkvIj4NCm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmdk Mzg1NDgxIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFu IFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5 Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27 via Mailbox Transport; Tue, 27 Jun 2023 09:39:17 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.27; Tue, 27 Jun 2023 09:39:17 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.27 via Frontend Transport; Tue, 27 Jun 2023 09:39:17 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35R8cXGx031661 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 27 Jun 2023 09:38:33 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35R8cL9R031643 for ; Tue, 27 Jun 2023 09:38:21 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 Jun 2023 10:38:19 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 28BCEE0157; Tue, 27 Jun 2023 10:38:20 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 8DFF2E0157 for ; Tue, 27 Jun 2023 10:38:15 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jun 2023 10:38:13 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A43745646C0; Tue, 27 Jun 2023 10:38:12 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZqNLc0GlygK+qaU+TxIZqwbaMag== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 27 Jun 2023 09:38:12 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 61771fcc-cfab-41d4-6cff-08db76e9feaa X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.01,161,1684792800"; d="scan'208,217";a="114824777" x-spam-flag: No, tests=bogofilter, spamicity=0.041964, queueID=037945646C1 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <1FE1AC1FEB409943B113F86D8632D479@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNi0yNyBUdWUgMTA6MzYgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDYuMjAuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNy4wNC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bmUgMjAgdG8gMjcsIDIwMjMuIDwvcD4N CjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJsZSBv ZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJk b2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+ZHVuZSAzLjguMDwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzIiPm1vb25wb29sIDAuMjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPmFlcm9v biwgd3JhcHBlciB0byBBZXJvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPlJlcHJlc2VudGlu ZyBPQ2FtbCBvbiBMZW1teTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPmF3YS1zc2ggcmVsZWFz ZSAwLjM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5QcHhsaWIgZGV2IG1lZXRpbmdzPC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjNyI+VXNlci1mcmllbmRseSBjb250aW51YXRpb25zIG92ZXIgT0Nh bWwgNSBlZmZlY3RzPzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPlJhaXNpbmcgdGhlIG1pbmlt dW0gdGVzdGVkIHZlcnNpb24gb2YgT0NhbWwgdG8gNC4wNSBvciA0LjExIChmcm9tIDQuMDIpPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iIzkiPmd1cm9vYmksIHdyYXBwZXIgdG8gR3Vyb2JpPC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjMTAiPmV1bGVyLCBhbiBhcml0aG1ldGljIGxpYnJhcnkgZm9yIG5h dGl2ZSBpbnRlZ2VyczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzExIj5DRlAgLSBKRkxBIDIwMjQg LSBKb3VybsOpZXMgRnJhbmNvcGhvbmVzIGRlcyBMYW5nYWdlcyBBcHBsaWNhdGlmczwvYT4NCjwv bGk+PGxpPjxhIGhyZWY9IiMxMiI+T0NhbWwub3JnIE5ld3NsZXR0ZXI6IE1heSAyMDIzPC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjMTMiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiNvcmc5YjYyZDJmIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjEiPmR1bmUgMy44LjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1kdW5lLTMtOC0wLzEyMjkxLzIiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVu ZS0zLTgtMC8xMjI5MS8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmcwNDA2ZDA4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMDQwNmQwOCI+ RXRpZW5uZSBNaWxsb24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmcwNDA2ZDA4Ij4NCjxwPjMuOC4yIGlzIG5vdyBhdmFpbGFibGUsIHBsZWFz ZSBmaW5kIHRoZSBjaGFuZ2Vsb2cgYmVsb3cgKHdpdGggdGhhdCBvZiAzLjguMSkuIDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYmJhNzEzZCIgY2xhc3M9Im91dGxp bmUtNCI+DQo8aDQgaWQ9Im9yZ2JiYTcxM2QiPjMuOC4yICgyMDIzLTA2LTE2KTwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYmJhNzEzZCI+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+U3dpdGNoIGJhY2sgdG8gdGhyZWFkZWQgY29uc29sZSBmb3IgYWxsIHN5 c3RlbXM7IGZpeCB1bnJlc3BvbnNpdmUgY29uc29sZSBvbiBXaW5kb3dzICgjNzkwNiwgQG5vamIp DQo8L2xpPjxsaT5SZXNwZWN0IDxjb2RlPi1wPC9jb2RlPiAvIDxjb2RlPi0tb25seS1wYWNrYWdl czwvY29kZT4gZm9yIDxjb2RlPm1lbGFuZ2UuZW1pdDwvY29kZT4gYXJ0aWZhY3RzICgjNzg0OSwg QGFubW9udGVpcm8pDQo8L2xpPjxsaT5GaXggc2Nhbm5pbmcgb2YgQ29xIGluc3RhbGxlZCBmaWxl cyAoQGVqZ2FsbGVnbywgcmVwb3J0ZWQgYnkgQHBhbG1za29nLCAjNzg5NSAsIGZpeGVzICM3ODkz KQ0KPC9saT48bGk+Rml4IFJQQyBidWZmZXIgY29ycnVwdGlvbiBpc3N1ZXMgZHVlIHRvIG11bHRp IHRocmVhZGluZy4gVGhpcyBpc3N1ZSB3YXMgb25seSByZXByb2R1Y2libGUgd2l0aCBsYXJnZSBS UEMgcGF5bG9hZHMgKCM3NDE4KQ0KPC9saT48bGk+Rml4IHByaW50aW5nIGVycm9ycyBmcm9tIGV4 Y2VycHRzIHdoZW5ldmVyIGNoYXJhY3RlciBvZmZzZXRzIHNwYW4gbXVsdGlwbGUgbGluZXMgKCM3 OTUwLCBmaXhlcyAjNzkwNSwgQHJncmluYmVyZykNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2YmMxOGE1IiBjbGFzcz0ib3V0bGluZS00 Ij4NCjxoNCBpZD0ib3JnNmJjMThhNSI+My44LjEgKDIwMjMtMDYtMDUpPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc2YmMxOGE1Ij4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5GaXggYSBjcmFzaCB3aGVuIHVzaW5nIGEgdmVyc2lvbiBvZiBDb3EgJmx0OyA4 LjEzIGR1ZSB0byB0aGUgbmF0aXZlIGNvbXBpbGVyIGNvbmZpZyB2YXJpYWJsZSBiZWluZyBtaXNz aW5nLiBXZSBub3cgZXhwbGljaXRseSBkZWZhdWx0IHRvDQo8Y29kZT4obW9kZSB2byk8L2NvZGU+ IGZvciB0aGVzZSBvbGRlciB2ZXJzaW9ucyBvZiBDb3EuICgjNzg0NywgZml4ZXMgIzc4NDYsIEBB bGl6dGVyKQ0KPC9saT48bGk+RHVwbGljYXRlIGluc3RhbGxlZCBDb3EgdGhlb3JpZXMgYXJlIG5v dyBhbGxvd2VkIHdpdGggdGhlIGZpcnN0IGFwcGVhcmluZyBpbiBDT1FQQVRIIGJlaW5nIHByZWZl cnJlZC4gVGhpcyBpcyBpbmxpbmUgd2l0aCBDb3HigJlzIGxvYWRwYXRoIHNlbWFudGljcy4gVGhp cyBmaXhlcyBhbiBpc3N1ZSB3aXRoIGluc3RhbGwgbGF5b3V0cyBiYXNlZCBvbiBDT1FQQVRIIHN1 Y2ggYXMgdGhvc2UgZm91bmQgaW4gbml4cGtncy4gKCM3NzkwLCBAQWxpenRlcikNCjwvbGk+PGxp PlJldmVydCAjNzQxNSBhbmQgIzc0NTAgKFJlc29sdmUgPGNvZGU+cHB4X3J1bnRpbWVfbGlicmFy aWVzPC9jb2RlPiBpbiB0aGUgdGFyZ2V0IGNvbnRleHQgd2hlbiBjcm9zcyBjb21waWxpbmcpICgj Nzg4NywgZml4ZXMgIzc4NzUsIEBlbWlsbG9uKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iMiI+bW9vbnBvb2wgMC4yPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tbW9vbnBvb2wtMC0yLzEyNDQ3LzEiPmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tbW9vbnBvb2wtMC0yLzEyNDQ3LzE8L2E+DQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2QwMzFkYWMiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmdkMDMxZGFjIj5TaW1vbiBDcnVhbmVzIGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZDAzMWRhYyI+DQo8cD5Nb29ucG9v bCAwLjIganVzdCBoaXQgdGhlIHNoZWx2ZXMsIGZsZXNoaW5nIG91dCB0aGUgZmVhdHVyZSBsaXN0 IGZvciBmdXR1cmVzIGFuZCBwb29scy4gQWxvbmdzaWRlIGEgaGFuZGZ1bCBvZiBidWdmaXhlcyBh bmQgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzLlteMV0gVGhlIGNoYW5nZWxvZyBjYW4gYmUgZm91 bmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvbW9vbnBvb2wvcmVsZWFzZXMv dGFnL3YwLjIiPmhlcmU8L2E+LiA8L3A+DQo8cD5bXjFdOiBub3RhYmxlLCB1c2luZyBtdWx0aXBs ZSBxdWV1ZXMgd2l0aCBzb21lIGJhc2ljIHZlcnNpb24gb2Ygd29yay1zdGVhbGluZyB0byByZWR1 Y2UgY29udGVudGlvbiB1bmRlciBsb2FkLiBUaGUgcXVldWVzIGFyZSBzdGlsbCB1c2luZw0KPGNv ZGU+TXV0ZXgudDwvY29kZT4gZm9yIG5vdywgYnV0IHdpdGggPGNvZGU+dHJ5X2xvY2s8L2NvZGU+ IHRoZXJlIHNob3VsZCBiZSBubyBhY3R1YWwgc3lzY2FsbCwganVzdCBhdG9taWMgb3BlcmF0aW9u cy4NCjwvcD4NCjxwPlNuZWFrIHBlZWsgYXQgdGhlIG5leHQgdmVyc2lvbjogcGxhbnMgaW5jbHVk ZSBzdXBwb3J0IGZvciA8Y29kZT5GdXQuYXdhaXQ8L2NvZGU+IHVzaW5nIGVmZmVjdHMgKG9ubHkg b24gT0NhbWwgNSksIGFuZCBpbnRlcm9wZXJhYmlsaXR5IHdpdGggb3RoZXIgbGlicmFyaWVzIHVz aW5nDQo8Y29kZT5kb21haW4tbG9jYWwtYXdhaXQ8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0y Ij4NCjxoMiBpZD0iMyI+YWVyb29uLCB3cmFwcGVyIHRvIEFlcm9uPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYWVyb29uLXdyYXBwZXItdG8tYWVyb24vMTI0NDgv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWFlcm9vbi13cmFwcGVyLXRvLWFl cm9uLzEyNDQ4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnMTg2ZTZjYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzE4NmU2Y2IiPk1pa2Eg SWxsb3V6IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnMTg2ZTZjYiI+DQo8cD5J4oCZZCBsaWtlIHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxp dHkgb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29uZWNocm9ub3MvYWVyb29uIj4NCmFl cm9vbjwvYT4sIGFuIE9DYW1sIHdyYXBwZXIgdG8gdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9yZWFsLWxvZ2ljL2Flcm9uIj4NCkFlcm9uPC9hPiBDIGxpYnJhcnkuIFR5cGljYWxseSB1 c2VkIGluIGZpbmFuY2lhbCBzeXN0ZW1zIHdpdGggbG93LWxhdGVuY3kgcmVxdWlyZW1lbnRzLCBB ZXJvbiBpcyBhIG11bHRpLXRyYW5zcG9ydCBjb21tdW5pY2F0aW9uIHRvb2xzZXQsIHdpdGggc3Vw cG9ydCBmb3IgQywgQyYjNDM7JiM0MzssIEphdmEsIGFuZCBub3cgT0NhbWwuDQo8L3A+DQo8cD5G ZWVkYmFjayB3ZWxjb21lISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+UmVwcmVz ZW50aW5nIE9DYW1sIG9uIExlbW15PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9yZXByZXNlbnRpbmctb2NhbWwtb24tbGVtbXkvMTI0NTEvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcmVwcmVzZW50aW5nLW9jYW1sLW9uLWxlbW15LzEyNDUxLzE8L2E+IDwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzZmYTg2MyIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc2ZmE4NjMiPkFuZHJlYXMgUG9pc2VsIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNzZmYTg2MyI+ DQo8cD5Tb21lIGRheXMgYWdvIEkgY3JlYXRlZCBhIOKAnGNvbW11bml0eeKAnSBmb3IgT0NhbWwg b24gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLnRjaG5jcy5kZS8iPg0KVGNobmNzPC9hPiAoYSBM ZW1teSBpbnN0YW5jZSk6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy50Y2huY3MuZGUvYy9vY2Ft bCI+Yy9vY2FtbDwvYT4uDQo8L3A+DQo8cD5J4oCZbSBsb29raW5nIGZvcndhcmQgdG8gc2VlaW5n IHlvdXIgbGlua3Mgb3IgY29tbWVudHMuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1 Ij5hd2Etc3NoIHJlbGVhc2UgMC4zPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tYXdhLXNzaC1yZWxlYXNlLTAtMy8xMjQ1NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tYXdhLXNzaC1yZWxlYXNlLTAtMy8xMjQ1NC8xPC9hPiA8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2YwMGYwMjgiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdmMDBmMDI4Ij5IYW5uZXMgTWVobmVydCBhbm5vdW5jZWQ8L2gzPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2YwMGYwMjgiPg0KPHA+SeKA mW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSAwLjMuMCBvZiA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vbWlyYWdlL2F3YS1zc2giPg0KYXdhLXNzaDwvYT4uIFRoaXMgaXMgYSBw dXJlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBTU0ggcHJvdG9jb2wgaW4gT0NhbWwuIEl0IHN0YXJ0 ZWQgb3V0IGFzIGEgc2VydmVyIGltcGxlbWVudGF0aW9uIGJ5IEBoYWVzYmFlcnQsIGFuZCB3YXMg dGhlbiBmdXJ0aGVyIGRldmVsb3BlZCBieSBAaGFubmVzIChjbGllbnQpLCBQaWVycmUgQWxhaW4g KHNzaGZzKSwgQHJleW5pciwgQGRpbm9zYXVyZQ0KPC9wPg0KPHA+VGhlc2UgZGF5cywgaXQgaXMg Ym90aCBhIHNlcnZlciBhbmQgYSBjbGllbnQgaW1wbGVtZW50YXRpb24sIGFuZCBpcyB1c2VkIGlu IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uvb2NhbWwtZ2l0Ij4NCm9jYW1sLWdp dDwvYT4gdG8gZmV0Y2ggZ2l0IHJlcG9zaXRvcmllcyBmcm9tIHNzaCByZW1vdGVzLiA8L3A+DQo8 cD5UaGUgaW5pdGlhbCByZWxlYXNlIGlzIGEgZmV3IHllYXJzIGJhY2sgKHNlZSA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtYXdhLXNzaC83 MDU3Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi1h d2Etc3NoLzcwNTc8L2E+KSwgdGhlIGNvZGUgaXMgZXZlbiBvbGRlciA7KQ0KPC9wPg0KPHA+VGhl IGhpZ2hsaWdodHMgc2luY2UgdGhlIGluaXRpYWwgcmVsZWFzZSBpbmNsdWRlOiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+c3VwcG9ydCBSU0EtU0hBMiBzaWduYXR1cmUgYWxnb3JpdGht cyAoT2N0b2JlciAyMDIxKSA8L2xpPjxsaT5zdXBwb3J0IEVEMjU1MTkgKE9jdG9iZXIgMjAyMSkg PC9saT48bGk+U1NIIHNlcnZlciBzdWJzeXN0ZW0gaW4gTWlyYWdlT1MgKEphbnVhcnkgMjAyMikg PC9saT48bGk+RUNEU0Egc3VwcG9ydCBvZiBOSVNUIGN1cnZlcyAoTWFyY2ggMjAyMykgPC9saT48 bGk+Y2xpZW50OiBwYXNzd29yZCBhdXRoZW50aWNhdGlvbiAocHJldmlvdXNseSwgb25seSBrZXkg YXV0aGVudGljYXRpb24gd2FzIHN1cHBvcnRlZCkgKE1hcmNoIDIwMjMpDQo8L2xpPjxsaT5hZGQg UHR5L1NldF9lbnYvU3RhcnRfc2hlbGwgZXZlbnRzIChNYXJjaCAyMDIzKSA8L2xpPjxsaT5zZXJ2 ZXI6IGhhbmRsZSB1bmtub3duIHB1YmxpYyBrZXlzIChKdW5lIDIwMjMpIDwvbGk+PGxpPnNlcnZl cjogZml4IHJla2V5IChsZWFkaW5nIHRvIG91dCBvZiBtZW1vcnkpIChKdW5lIDIwMjMpIDwvbGk+ PGxpPnNlcnZlcjogd2luZG93IGNoYW5nZSBldmVudHMgKEp1bmUgMjAyMykgPC9saT48bGk+c2Vy dmVyOiBpbXBsZW1lbnQgZXh0LWluZm8gYW5kIHNlcnZlci1zaWctYWxncyBleHRlbnNpb25zIChK dW5lIDIwMjMpIDwvbGk+PC91bD4NCjxwPk9uZSBleGFtcGxlIGFwcGxpY2F0aW9uIGlzIGEgY2hh dCBzeXN0ZW0gd2l0aCB0cnVzdCBvbiBmaXJzdCB1c2UgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL3JleW5pci9iYW5hd2EtY2hhdC8iPg0KYmFuYXdhLWNoYXQ8L2E+LCBhcyBkZXNjcmliZWQg aW4gPGEgaHJlZj0iaHR0cHM6Ly9yZXluLmlyL3Bvc3RzLzIwMjMtMDUtMTctYmFuYXdhLWNoYXQu aHRtbCI+DQp0aGlzIGFydGljbGU8L2E+IOKAkyBqb2luIHVzIGZvciBkaXNjdXNzaW9uIGF0IDxj b2RlPnNzaCBbLWkgcGF0aC90by9rZXlfZWQyNTUxOV0gbXl1c2VybmFtZUBjaGF0LnJleW4uaXI8 L2NvZGU+Lg0KPC9wPg0KPHA+VGhlIHBhc3N3b3JkIGF1dGhlbnRpY2F0aW9uIGFsbG93cyBhd2Eg dG8gYmUgdXNlZCBmb3IgbmV0d29yayBpbmZyYXN0cnVjdHVyZSBtb25pdG9yaW5nIGFuZCBtYW5h Z2VtZW50ICh3aGljaCB1c3VhbGx5IGRvIG5vdCBzdXBwb3J0IGtleS1iYXNlZCBhdXRoZW50aWNh dGlvbikuDQo8L3A+DQo8cD5UaGVyZeKAmXMgYWxzbyBhIHdvcmstaW4tcHJvZ3Jlc3MgSVJDIGNs aWVudCBhcyBNaXJhZ2VPUyB1bmlrZXJuZWwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Jv YnVyaW8vY2F0dHkiPg0KY2F0dHk8L2E+LCB3aGljaCB1c2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9sZXQtZGVmL2x3ZCI+bHdkPC9hPiBmb3IgdXNlciBpbnRlcmFjdGlvbi4NCjwvcD4N CjxwPlRoZXJl4oCZcyBhbHNvIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3BhbGFpbnAv bWlyYWdlLXNzaGZzLyI+c3NoZnMgdW5pa2VybmVsPC9hPi4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI2Ij5QcHhsaWIgZGV2IG1lZXRpbmdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzMiPmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzM8L2E+DQo8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzliOTBhNmYiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc5YjkwYTZmIj5Db250aW51aW5nIHRoaXMgdGhyZWFkLCBTb25q YSBIZWluemUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmc5YjkwYTZmIj4NCjxwPkFzIGEgZm9sbG93LXVwOiBJdCBoYXMgYmVlbiBAcGFuZ2xl c2QsIEBCdXJubGV5IGFuZCBtZSBpbiB0aGUgbWVldGluZyB0b2RheS4gU28gbm9ib2R5IOKAnGZy b20gb3V0c2lkZeKAnSBoYXMgam9pbmVkLiBTdGlsbCwgd2UgdGhpbmsgaXTigJlzIGdvb2QgdGhh dCB0aGUgZGVjaXNpb24gbm90IHRvIHBhcnRpY2lwYXRlIGlzIHRha2VuIGJ5IGVhY2ggY29tbXVu aXR5IG1lbWJlciwgbm90IGJ5IHVzLiBTbyB3ZeKAmWxsIGtlZXAgdGhlIG1lZXRpbmdzIG9wZW4u DQogWW91IGNhbiA8YSBocmVmPSJodHRwczovL2NhbGVuZGFyLmdvb2dsZS5jb20vY2FsZW5kYXIv ZXZlbnQ/YWN0aW9uPVRFTVBMQVRFJmFtcDt0bWVpZD1ZMmd5WW1acGNXdDBjV0kyZEdnek5HRnFj emh4WldoeVpIQmZNakF5TXpBMk1qQlVNVFl3TURBd1dpQmpYemxoTVdKaU9XVmxZbVF6TmpNNVlU SmtZamd5Tmpoak16WmhNalprWmpWaU1tUTROMlZtWTJKaFpqTTVZVEpqTUdFeVpERTBZemxoWTJK a01USmxObVpBWncmYW1wO3Rtc3JjPWNfOWExYmI5ZWViZDM2MzlhMmRiODI2OGMzNmEyNmRmNWIy ZDg3ZWZjYmFmMzlhMmMwYTJkMTRjOWFjYmQxMmU2ZiU0MGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5j b20mYW1wO3NjcD1BTEwiPg0KYWRkIHRoZSBtb250aGx5IGV2ZW50IHRvIHlvdXIgR29vZ2xlIGNh bGVuZGFyPC9hPiwgYW5kIHdlIHdpbGwgdHJ5IHRvIHNlbmQgYSBub3RpZmljYXRpb24gaGVyZSBv biBkaXNjdXNzIGVhY2ggbW9udGguDQo8L3A+DQo8cD5BbmQgaGVyZSBhcmUgdG9kYXnigJlzIG1l ZXRpbmcgbm90ZXM6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGli L3dpa2kvRGV2LW1lZXRpbmctMjItMDYtMjAyMyI+DQpodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt cHB4L3BweGxpYi93aWtpL0Rldi1tZWV0aW5nLTIyLTA2LTIwMjM8L2E+IDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSI3Ij5Vc2VyLWZyaWVuZGx5IGNvbnRpbnVhdGlvbnMgb3ZlciBPQ2Ft bCA1IGVmZmVjdHM/PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03 Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91c2Vy LWZyaWVuZGx5LWNvbnRpbnVhdGlvbnMtb3Zlci1vY2FtbC01LWVmZmVjdHMvMTI0MDcvMTIiPg0K aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3VzZXItZnJpZW5kbHktY29udGludWF0aW9ucy1v dmVyLW9jYW1sLTUtZWZmZWN0cy8xMjQwNy8xMjwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnZGJjMzJmMSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2RiYzMyZjEiPktDIFNpdmFyYW1ha3Jpc2huYW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkYmMzMmYxIj4NCjxwPlRoZSBwYWNrYWdl IGlzIG5vdyBvbiBvcGFtIDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcv cGFja2FnZXMvZGVsaW1jY19vZl9meGhhbmRsZXIvIj5odHRwczovL29wYW0ub2NhbWwub3JnL3Bh Y2thZ2VzL2RlbGltY2Nfb2ZfZnhoYW5kbGVyLzwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSI4Ij5SYWlzaW5nIHRoZSBtaW5pbXVtIHRlc3RlZCB2ZXJzaW9uIG9mIE9DYW1sIHRv IDQuMDUgb3IgNC4xMSAoZnJvbSA0LjAyKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvcmFpc2luZy10aGUtbWluaW11bS10ZXN0ZWQtdmVyc2lvbi1vZi1vY2FtbC10by00 LTA1LW9yLTQtMTEtZnJvbS00LTAyLzEyNDY0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3JhaXNpbmctdGhlLW1pbmltdW0tdGVzdGVkLXZlcnNpb24tb2Ytb2NhbWwtdG8tNC0wNS1v ci00LTExLWZyb20tNC0wMi8xMjQ2NC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc3MjczNDVhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn NzI3MzQ1YSI+QW5pbCBNYWRoYXZhcGVkZHkgYXNrZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzcyNzM0NWEiPg0KPHA+SW4gdGhlIG9wYW0gcmVwb3NpdG9y eSwgd2UgaGF2ZSBiZWVuIHRlc3Rpbmcgc3VibWl0dGVkIHBhY2thZ2VzIG9uIGFsbCB2ZXJzaW9u cyBvZiBPQ2FtbCBmcm9tIDQuMDIuMyBvbndhcmRzLCBhbGwgdGhlIHdheSB1cCB0byA1LjItdHJ1 bmsuIFdlIG5lZWQgdG8gY29tZSB1cCBhIHdheSB0byByZWR1Y2UgdGhpcyB0ZXN0aW5nIG1hdHJp eCwgYW5kIGluIHBhcnRpY3VsYXIgZGV0ZXJtaW5lIGlmIHRoZXJlIGFyZSBhIG5vbi16ZXJvIG51 bWJlcg0KIG9mIHVzZXJzIHdobyBuZWVkIHRoZXNlIGhpc3RvcmljYWwgcmVsZWFzZXMgdGVzdGVk LiBUaGVyZSBhcmUgdGhvdXNhbmRzIG9mIHBvdGVudGlhbGx5IHVubmVjZXNzYXJ5IGJ1aWxkcyBy dW5uaW5nIGF0IHRoZSBtb21lbnQgaWYgdGhlc2UgcmVzdWx0cyBhcmUgbm90IG5lZWRlZC4NCjwv cD4NCjxwPlRoZSBsYXRlc3QgcmVsZWFzZSBvZiBPQ2FtbCA0LjAyIHdhcyBpbiAyMDE0LCBhbmQg SSBhbSBub3cgcHJvcG9zaW5nIHRvIGluY3JlYXNlIHRoZSDigJxmbG9vcuKAnSB0ZXN0ZWQgcmVs ZWFzZSBvZiBPQ2FtbCB0byA0LjA1LCB3aGljaCBpcyB0aGUgdmVyc2lvbiBkaXN0cmlidXRlZCBp biBEZWJpYW4gMTAg4oCcYnVzdGVy4oCdLiBUaGlzIGlzIGEgY29uc2VydmF0aXZlIGNob2ljZSwg c2luY2UgRGViaWFuIDEwIOKAnGJ1c3RlcuKAnSBpcyBhbHJlYWR5IGF0IGl0cw0KPGEgaHJlZj0i aHR0cHM6Ly93aWtpLmRlYmlhbi5vcmcvRGViaWFuUmVsZWFzZXMiPmVuZCBvZiBsaWZlPC9hPiwg d2l0aCB0aGUgbG9uZy10ZXJtIHN1cHBvcnQgY29taW5nIHRvIGFuIGVuZCBpbiBtaWQtMjAyNC4N CjwvcD4NCjxwPklmIHdlIG1vdmUgb250byBEZWJpYW4gMTEg4oCcYm9va3dvcm3igJ0sIHRoaXMg cGFja2FnZXMgdXAgT0NhbWwgNC4xMSwgd2hpY2ggY2FuIGJlY29tZSB0aGUgbmV4dCDigJxmbG9v cuKAnSB0YXJnZXQgZm9yIHN1cHBvcnRlZCBPQ2FtbCB2ZXJzaW9ucyBpbiAyMDI0Lg0KPC9wPg0K PHA+U28gbXkgcXVlc3Rpb24gdG8gdGhlIGNvbW11bml0eSBpczogPGI+YXJlIGFueSBvZiB5b3Ug c3RpbGwgdXNpbmcgT0NhbWwgcmVsZWFzZXMgZWFybGllciB0aGFuIDQuMTE/PC9iPiBJZiBzbywg d2hpY2ggdmVyc2lvbiwgYW5kIHdoYXQgY29uZmlndXJhdGlvbnMvcGxhdGZvcm1zIGFyZSBvZiBt b3N0IGludGVyZXN0IHRvIHlvdT8NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdmOGFiYTU4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn ZjhhYmE1OCI+QWZ0ZXIgbWFueSByZXBsaWVzLCBBbmlsIE1hZGhhdmFwZWRkeSBzYWlkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmOGFiYTU4Ij4NCjxwPlRo YW5rcyBldmVyeW9uZTsgc291bmRzIGxpa2UgNC4xMSBpcyB0b28gbXVjaCBvZiBhIGxlYXAsIGJ1 dCA0LjA4IGlzIGEgcmVhc29uYWJsZSBjaG9pY2UuDQo8L3A+DQo8cD48Yj5JZiBhbnlvbmUgaXMg dXNpbmcgYW4gT0NhbWwgdmVyc2lvbiBiZXR3ZWVuIDQuMDUgYW5kIDQuMDgsIHBsZWFzZSBkbyBj aGlycCB1cCBpbiB0aGUgbmV4dCBmZXcgd2Vla3MuPC9iPiBPdGhlcndpc2UsIHdl4oCZcmUgY29u dmVyZ2luZyBvbiBPQ2FtbCA0LjA4IGJlaW5nIHRoZSBuZXcgbWluaW11bSB2ZXJzaW9uIHRlc3Rl ZC4NCjwvcD4NCjxwPkZvciB0aG9zZSBjdXJpb3VzIGFib3V0IHRoZSB2ZXJzaW9ucyBvZiBPQ2Ft bCBzaGlwcGVkIGluIGRpc3Ryb3Mgb3RoZXIgdGhhbiBVYnVudHUgYW5kIERlYmlhbiwgdGhlcmXi gJlzIGENCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hdnNtL29jYW1sLWRvY2tlcmZpbGUv YmxvYi9tYXN0ZXIvc3JjLW9wYW0vZGlzdHJvLm1sI0w3NzEtTDg1MSI+DQptYXBwaW5nIGluIE9D YW1sLURvY2tlcmZpbGU8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+Z3Vy b29iaSwgd3JhcHBlciB0byBHdXJvYmk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1ndXJvb2JpLXdyYXBwZXItdG8tZ3Vyb2JpLzEyNDgxLzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ndXJvb2JpLXdyYXBwZXItdG8tZ3Vyb2JpLzEyNDgxLzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMGU0NzM1MyIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzBlNDczNTMiPk1pa2EgSWxsb3V6IGFubm91 bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGU0NzM1 MyI+DQo8cD5J4oCZZCBsaWtlIHRvIGFubm91bmNlIHRoZSBhdmFpbGFiaWxpdHkgb2YgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29uZWNocm9ub3MvZ3Vyb29iaSI+DQpndXJvb2JpPC9hPiwg YW4gT0NhbWwgd3JhcHBlciB0byB0aGUgKGNvbW1lcmNpYWwpIDxhIGhyZWY9Imh0dHBzOi8vd3d3 Lmd1cm9iaS5jb20iPg0KR3Vyb2JpPC9hPiBvcHRpbWl6YXRpb24gbGlicmFyeS4gPC9wPg0KPHA+ RmVlZGJhY2sgd2VsY29tZSEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+ZXVs ZXIsIGFuIGFyaXRobWV0aWMgbGlicmFyeSBmb3IgbmF0aXZlIGludGVnZXJzPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWV1bGVyLWFuLWFyaXRobWV0aWMtbGli cmFyeS1mb3ItbmF0aXZlLWludGVnZXJzLzEyNDgyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1ldWxlci1hbi1hcml0aG1ldGljLWxpYnJhcnktZm9yLW5hdGl2ZS1pbnRlZ2Vy cy8xMjQ4Mi8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmcxNWFmM2U1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMTVhZjNlNSI+Z2xlbiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE1 YWYzZTUiPg0KPHA+SW4gY2FzZSBhbnlvbmUgaXMgaW50ZXJlc3RlZCwgSSBsZXQgeW91IGtub3cg b2YgPGNvZGU+ZXVsZXI8L2NvZGU+LCBhIHNtYWxsIGFyaXRobWV0aWMgbGlicmFyeSBvZiBtaW5l LiBVbmZvcnR1bmF0ZWx5IGl0IGlzIG5vdCBwdWJsaXNoZWQgb24gb3BhbSAoYnV0IHRoZXJlIGlz IGFuIG9wYW0gZmlsZSksIGFuZCBJIHdvbuKAmXQgYmUgd29ya2luZyBvbiBpdCBhbnltb3JlLCBz byBhbnlvbmUgaXMgd2VsY29tZSB0byB0YWtlIG92ZXIgdGhlIHByb2plY3QNCiBvciBqdXN0IHN0 ZWFsIGNvZGUgZnJvbSBpdC4gSWYgeW91IHNlZSBmdW4gaW4gaXQsIEkgbGVmdCBwbGVudHkgb2Yg VE9ET3MhIDotKSA8L3A+DQo8cD5UaGUgbGlicmFyeSBpcyBkb2N1bWVudGVkLCB3aXRoIGEgZm9j dXMgb24gYWxnb3JpdGhtaWMgY29tcGxleGl0aWVzLCBhbmQgaW1wbGVtZW50YXRpb24gY29kZSBo YXMgYSBsb3Qgb2YgY29tbWVudHMgdG9vLg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PltyZXBvXTogPGEgaHJlZj0iaHR0cHM6Ly9naXRsYWIuY3JhbnMub3JnL21ldmVsL2V1bGVyLWxp YiI+aHR0cHM6Ly9naXRsYWIuY3JhbnMub3JnL21ldmVsL2V1bGVyLWxpYjwvYT4NCjwvbGk+PGxp Pltkb2NdOiA8YSBocmVmPSJodHRwczovL3BlcnNvLmNyYW5zLm9yZy9tZXZlbC9vZG9jL2V1bGVy L0V1bGVyLyI+aHR0cHM6Ly9wZXJzby5jcmFucy5vcmcvbWV2ZWwvb2RvYy9ldWxlci9FdWxlci88 L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVk OWFiNTYiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc1ZDlhYjU2Ij5XaGF04oCZcyBp biBpdD88L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzVkOWFi NTYiPg0KPHA+PGNvZGU+ZXVsZXI8L2NvZGU+IGlzIGEgbGlicmFyeSBmb3IgZG9pbmcgaW50ZWdl ciBhcml0aG1ldGljIHdpdGggT0NhbWzigJlzIHN0YW5kYXJkIGludGVnZXJzICgzMSBvciA2MyBi aXRzKS4gSXQgcHJvdmlkZXM6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+RHJvcC1p biwgPGI+b3ZlcmZsb3ctZGV0ZWN0aW5nPC9iPiBiYXNlIGFyaXRobWV0aWM6IGlmIHlvdSBhcmUg cGFyYW5vaWQgYWJvdXQgdmljaW91cyBidWdzIHNuZWFraW5nIGluIHNpbGVudGx5LCB0aGlzIGxp YnJhcnkgZGV0ZWN0cyBvdmVyZmxvd3MgYW5kIHNpZ25hbCB0aGVtIGJ5IHRocm93aW5nIGFuIGV4 Y2VwdGlvbjsgdGhlIG1vZHVsZSBjYW4gYmUgdXNlZCBhcyBhIGRyb3AtaW4gcmVwbGFjZW1lbnQg Zm9yIHRoZSBzdGFuZGFyZCBsaWJyYXJ5DQogKGJld2FyZSB0aGF0IDxjb2RlPkV1bGVyLkFyaXRo Lm1pbl9pbnQ8L2NvZGU+IGRpZmZlcnMgZnJvbSA8Y29kZT5TdGRsaWIubWluX2ludDwvY29kZT4s IHRoZSBsYXR0ZXIgYmVpbmcgYSBmb3JiaWRkZW4gdmFsdWUpLiBUaGVyZSBhcmUgYWxzbyBhIGZl dyBhZGRpdGlvbmFsIGZ1bmN0aW9ucyBzdWNoIGFzIGludGVnZXIgbG9nYXJpdGhtcyBhbmQgc3F1 YXJlIHJvb3RzLg0KPC9saT48bGk+TW9yZSA8Yj5hZHZhbmNlZCBhcml0aG1ldGljPC9iPjogZm9y IHRoZSB3ZWlyZCBmb2xrcyAobGlrZSBteXNlbGYpIHdobyBhcmUgaW50ZXJlc3RlZCBpbiBhZHZh bmNlZCBhcml0aG1ldGljIGJ1dCBkbyBub3QgY2FyZSBhYm91dCBpbnRlZ2VycyBsYXJnZXIgdGhh biAyJmx0O3N1cCZndDs2MiZsdDsvc3VwJmd0OywgYW5kIHRodXMgZG8gbm90IHdhbnQgdGhlIGJ1 cmRlbiBvZiB1c2luZyBhbiBhcmJpdHJhcnktcHJlY2lzaW9uIGxpYnJhcnkgKHphcml0aCBvZiBH TVApLA0KIHRoZXJlIHlvdSBhcmUuIFRoZSBsaWJyYXJ5IHByb3ZpZGVzIHNvbWUgY2xhc3NpYyBm dW5jdGlvbnMgc3VjaCBhcw0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPnRoZSBHQ0QsIDwvbGk+ PGxpPnRoZSBKYWNvYmkgc3ltYm9sLCA8L2xpPjxsaT5wcmltYWxpdHkgdGVzdGluZyAoZmFzdCA8 Yj5hbmQ8L2I+IGRldGVybWluaXN0aWMgZm9yIGFsbCA2My1iaXQgaW50ZWdlcnMhKSwgPC9saT48 bGk+aW50ZWdlciBmYWN0b3JpemF0aW9uIChpbXBsZW1lbnRpbmcgTGVuc3RyYeKAmXMgZWxsaXB0 aWMgY3VydmUgZmFjdG9yaXphdGlvbiwgd2hpY2ggd2FzIGFwcGFyZW50bHkgb25lIG9mIHRoZSBi ZXN0IGtub3duIGFsZ29yaXRobXMgYmFjayB3aGVuIEkgd3JvdGUgdGhhdCBjb2RlLCBidXQgb2J2 aW91c2x5IGl0IGlzIHN0aWxsIHZlcnkgc2xvdyEg4oCUIGFuZCBJIG11c3Qgc2F5IEkgdW5kZXJz dGFuZCB2ZXJ5IGxpdHRsZSBhYm91dCBpdOKApiksDQo8L2xpPjxsaT5hIHByaW1lIHNpZXZlICho ZWF2aWx5IG9wdGltaXplZCkgYW5kIGEgZmFjdG9yaXphdGlvbiBzaWV2ZSwgPC9saT48bGk+RXVs ZXLigJlzIHRvdGllbnQgZnVuY3Rpb24gKHNsb3cgdG9vLCBvZiBjb3Vyc2UpLCA8L2xpPjxsaT5h bmQgc28gb24uIDwvbGk+PC91bD4NCjwvbGk+PGxpPlNvbHZlcnMgZm9yIHNvbWUgZm9ybXMgb2Yg PGI+aW50ZWdlciBlcXVhdGlvbnM8L2I+IChzby1jYWxsZWQg4oCcRGlvcGhhbnRpbmUgZXF1YXRp b25z4oCdKToNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5saW5lYXIgY29uZ3J1ZW5jZSBzeXN0 ZW1zICh0aGUgQ2hpbmVzZSByZW1haW5kZXIgdGhlb3JlbSksIDwvbGk+PGxpPlBlbGwtRmVybWF0 4oCZcyBlcXVhdGlvbnMgKHRoZSBDaGFrcmF2YWxhIG1ldGhvZCkg4oCUIHByZWxpbWluYXJ5IGNv ZGUgdGhhdCBqdXN0IG5lZWRzIHNvbWUgcGFja2FnaW5nIGVmZm9ydCkuDQo8L2xpPjwvdWw+DQo8 L2xpPjxsaT4NCjxwPjxiPk1vZHVsYXIgYXJpdGhtZXRpYzwvYj46IGluY2x1ZGluZyBmaW5kaW5n IG1vZHVsYXIgaW52ZXJzZXMgKGFuZCBwc2V1ZG8taW52ZXJzZXMpLiBBIG5pY2UgZnVuY3Rvcmlh bCBpbnRlcmZhY2UgcHJvdmlkZXMgY29udmVuaWVudCBub3RhdGlvbnMgYW5kIHVzZXMgYSBwcml2 YXRlIHR5cGUgdG8gZW5mb3JjZSB0aGF0IHZhbHVlcyBhcmUgYWx3YXlzIG5vcm1hbGl6ZWQgaW4g dGhlIHJhbmdlIDAuLiptKuKIkjEgd2hlcmUNCjxiPm08L2I+IGlzIHRoZSBtb2R1bHVzLiBFeGFt cGxlIHVzZTogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFz cz0ic3JjIHNyYy1vY2FtbCI+ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5tb2R1bGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi Pk08L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RXVsZXIuTW9kdWxhci5N YWtlPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9s ZDsiPnN0cnVjdDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdo dDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bW9kdWxv PC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjQyPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZW5kPC9zcGFuPikNCiAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9z cGFuPiAoKSA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5hc3NlcnQ8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5NLjwvc3Bhbj4o IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiE6PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwODI0ZjsiPjE8L3NwYW4+IC86ICg8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4h Ojwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4zMzwvc3Bhbj4gJiM0Mzs6IDxz cGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiE6PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPjQ8L3NwYW4+KSA9IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiE6PC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjU8L3NwYW4+ICoqOigtPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDwvc3Bhbj4pICkpDQogICAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5zYWlkIG90aGVyd2lzZSwgbW9kdWxv IDQyLCB0aGUgaW52ZXJzZSBvZiAoMzMgJiM0MzsgNCkgaXMgZXF1YWwgdG8gNV4o4oiSNCk8L3Nw YW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8 L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM4MDIxYzMiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmczODAyMWMzIj5CdXQgd2h5PzwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NCIgaWQ9InRleHQtb3JnMzgwMjFjMyI+DQo8cD5Xcml0aW5nIHRoaXMgbGlicmFyeSB3YXMgZnVu IGFuZCBlZHVjYXRpdmUgZm9yIG1lLCBhbmQgYWxsb3dlZCBtZSB0byBzb2xpZGlmeSBteSBtYXRo IHRyYWluaW5nIGluIGNvZGUuIEluIGZhY3QsIGFzIHRoZSBuYW1lIHN1Z2dlc3RzLCB0aGUgaW5p dGlhbCBpbmNlbnRpdmUgd2FzIHBsYXlpbmcgd2l0aCBQcm9qZWN0IEV1bGVyIChoZW5jZSB0aGUg Zm9jdXMgb24gaW50ZWdlcnMgdGhhdCBmaXQgaW4gYSBtYWNoaW5lIHdvcmQpIHdoaWxlIHNwYXJp bmcNCiBtZSB0aGUgYm9yZWRvbSBvZiBpbXBsZW1lbnRpbmcgYSBwcmltZSBzaWV2ZSBmb3IgdGhl IGh1bmRyZWR0aCB0aW1lLiA8L3A+DQo8cD5OZXZlcnRoZWxlc3MsIEkgYmVsaWV2ZSA8Y29kZT5l dWxlcjwvY29kZT4gbWlnaHQgcHJvdmUgYWN0dWFsbHkgdXNlZnVsIG91dHNpZGUgb2YgdGhlIHBs YXlncm91bmQuIE92ZXJmbG93IGRldGVjdGlvbiBpcyBhbiBhY3R1YWwgbmVlZCBpbiBzb21lIHNv ZnR3YXJlLCBhbmQgaW1wbGVtZW50aW5nIGl0IGlzIG5vdCB0cml2aWFsLCBldmVuIGxlc3Mgc28g YWZ0ZXIgc29tZSBhbW91bnQgb2YgbWljcm8tb3B0aW1pemF0aW9uIChzZWUgY29kZSkuDQogTW9k dWxhciBhcml0aG1ldGljIGlzIG5vdCB0cml2aWFsIGVpdGhlciAoZS5nLiBtdWx0aXBsaWNhdGlv biBpcyBub3QgYXMgc2ltcGxlIGFzDQo8Y29kZT4oYSAqIGIpIG1vZCBtPC9jb2RlPiBiZWNhdXNl IHRoaXMgY29tcHV0YXRpb24gbWlnaHQgb3ZlcmZsb3cpLiBBbmQgd2VsbCwgZXZlbiBpbnRlZ2Vy IGxvZ2FyaXRobXMgYW5kIHNxdWFyZSByb290cyBhcmUgaGFuZHkgYXQgdGltZXMsIGFuZCBhZ2Fp biB0aGV5IG5vdCB0cml2aWFsIHRvIGltcGxlbWVudCAoYXMgdXNpbmcgdGhlaXIgZmxvYXRpbmct cG9pbnQgY291bnRlcnBhcnQgZ2l2ZXMgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIGxhcmdlDQogaW50 ZWdlcnMpLiA8L3A+DQo8cD5wcm9qZWN0LWV1bGVyOiA8YSBocmVmPSJodHRwczovL3Byb2plY3Rl dWxlci5uZXQvIj5odHRwczovL3Byb2plY3RldWxlci5uZXQvPC9hPg0KPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMSIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjExIj5DRlAgLSBKRkxBIDIwMjQgLSBKb3VybsOpZXMg RnJhbmNvcGhvbmVzIGRlcyBMYW5nYWdlcyBBcHBsaWNhdGlmczwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NmcC1qZmxhLTIwMjQtam91cm5lZXMtZnJhbmNvcGhvbmVz LWRlcy1sYW5nYWdlcy1hcHBsaWNhdGlmcy8xMjQ4My8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9jZnAtamZsYS0yMDI0LWpvdXJuZWVzLWZyYW5jb3Bob25lcy1kZXMtbGFuZ2FnZXMt YXBwbGljYXRpZnMvMTI0ODMvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnZDIzMDAyMSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2QyMzAw MjEiPmFkcmd0IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnZDIzMDAyMSI+DQo8cD48aT5UaGlzIG1lc3NhZ2UgaXMgaW50ZW50aW9uYWxseSB3 cml0dGVuIGluIEZyZW5jaC4gSXQgaXMgYSBjYWxsIGZvciBwYXBlcnMgZm9yIHRoZSDigJxGcmFu Y29waG9uZSBEYXlzIG9uIEZ1bmN0aW9uYWwgTGFuZ3VhZ2Vz4oCdIHRvIGJlIGhlbGQgYXQgdGhl IGVuZCBvZiBKYW51YXJ5IDIwMjQgaW4gQnJpdHRhbnkuIFBhcGVycyBjYW4gYmUgd3JpdHRlbiBp biBFbmdsaXNoLCBidXQgdGhlIHByZXNlbnRhdGlvbnMgdGhlbXNlbHZlcyBhcmUgZXhwZWN0ZWQN CiB0byBiZSBnaXZlbiBpbiBGcmVuY2guPC9pPiA8L3A+DQo8cD48aT5NZXJjaSBkZSBmYWlyZSBj aXJjdWxlciA6IHByZW1pZXIgYXBwZWwgw6AgY29tbXVuaWNhdGlvbnM8L2k+IDwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjNhYTRmOSIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZ2IzYWE0ZjkiPkpGTEEgMjAyNCA6IEpvdXJuw6llcyBGcmFuY29waG9u ZXMgZGVzIExhbmdhZ2VzIEFwcGxpY2F0aWZzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmdiM2FhNGY5Ij4NCjxwPjxhIGhyZWY9Imh0dHA6Ly9qZmxhLmlucmlh LmZyL2pmbGEyMDI0Lmh0bWwiPmh0dHA6Ly9qZmxhLmlucmlhLmZyL2pmbGEyMDI0Lmh0bWw8L2E+ DQo8L3A+DQo8cD4zMCBqYW52aWVyIGF1IDIgZsOpdnJpZXIgMjAyNCA8L3A+DQo8cD5BYmJheWUg ZGUgU2FpbnQtSmFjdXQsIFNhaW50LUphY3V0LWRlLWxhLU1lciA8L3A+DQo8cD5MZXMgMzVlcyBK b3VybsOpZXMgRnJhbmNvcGhvbmVzIGRlcyBMYW5nYWdlcyBBcHBsaWNhdGlmcyAoSkZMQSkgc2Ug dGllbmRyb250IGVuIEJyZXRhZ25lLCDDoCBTYWludC1KYWN1dC1kZS1sYS1NZXIgKEPDtHRlcy1k 4oCZQXJtb3IpLCBkdSBtYXJkaSAzMCBqYW52aWVyIDIwMjQgYXUgdmVuZHJlZGkgMiBmw6l2cmll ciAyMDI0Lg0KPC9wPg0KPHA+TGVzIEpGTEEgcsOpdW5pc3NlbnQgY29uY2VwdGV1cnMsIHV0aWxp c2F0ZXVycyBldCB0aMOpb3JpY2llbnMgOyBlbGxlcyBvbnQgcG91ciBhbWJpdGlvbiBkZSBjb3V2 cmlyIGxlcyBkb21haW5lcyBkZXMgbGFuZ2FnZXMgYXBwbGljYXRpZnMsIGRlIGxhIHByZXV2ZSBm b3JtZWxsZSwgZGUgbGEgdsOpcmlmaWNhdGlvbiBkZSBwcm9ncmFtbWVzLCBldCBkZXMgb2JqZXRz IG1hdGjDqW1hdGlxdWVzIHF1aSBzb3VzLXRlbmRlbnQgY2VzIG91dGlscy4gQ2VzDQogZG9tYWlu ZXMgZG9pdmVudCDDqnRyZSBwcmlzIGF1IHNlbnMgbGFyZ2UgOiBub3VzIHNvdWhhaXRvbnMgcHJv bW91dm9pciBsZXMgcG9udHMgZW50cmUgbGVzIGRpZmbDqXJlbnRlcyB0aMOpbWF0aXF1ZXMuDQo8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+TGFuZ2FnZXMgZm9uY3Rpb25uZWxzIGV0IGFw cGxpY2F0aWZzIDogc8OpbWFudGlxdWUsIGNvbXBpbGF0aW9uLCBvcHRpbWlzYXRpb24sIHR5cGFn ZSwgbWVzdXJlcywgZXh0ZW5zaW9ucyDDoCBk4oCZYXV0cmVzIHBhcmFkaWdtZXMuDQo8L2xpPjxs aT5Bc3Npc3RhbnRzIGRlIHByZXV2ZSA6IGltcGzDqW1lbnRhdGlvbiwgbm91dmVsbGVzIHRhY3Rp cXVlcywgZMOpdmVsb3BwZW1lbnRzIHByw6lzZW50YW50IHVuIGludMOpcsOqdCB0aMOpb3JpcXVl LCB0ZWNobmlxdWUgb3UgbcOpdGhvZG9sb2dpcXVlLg0KPC9saT48bGk+TG9naXF1ZSwgY29ycmVz cG9uZGFuY2UgZGUgQ3VycnktSG93YXJkLCByw6lhbGlzYWJpbGl0w6ksIGV4dHJhY3Rpb24gZGUg cHJvZ3JhbW1lcywgbW9kw6hsZXMuDQo8L2xpPjxsaT5TcMOpY2lmaWNhdGlvbiwgcHJvdG90eXBh Z2UsIGTDqXZlbG9wcGVtZW50cyBmb3JtZWxzIGTigJlhbGdvcml0aG1lcy4gPC9saT48bGk+VsOp cmlmaWNhdGlvbiBkZSBwcm9ncmFtbWVzIG91IGRlIG1vZMOobGVzLCB2w6lyaWZpY2F0aW9uIGTD qWR1Y3RpdmUsIGludGVycHLDqXRhdGlvbiBhYnN0cmFpdGUsIHJhZmZpbmVtZW50Lg0KPC9saT48 bGk+VXRpbGlzYXRpb24gaW5kdXN0cmllbGxlIGRlcyBsYW5nYWdlcyBmb25jdGlvbm5lbHMgZXQg YXBwbGljYXRpZnMsIG91IGRlcyBtw6l0aG9kZXMgaXNzdWVzIGRlIGxhIGNvbW11bmF1dMOpIHNj aWVudGlmaXF1ZS4gT3V0aWxzIGV0IHBsYXRlZm9ybWVzIHBvdXIgbGUgd2ViLg0KPC9saT48bGk+ UHJvYmzDqW1hdGlxdWVzIGTigJllbnNlaWduZW1lbnQsIGRlIGZvcm1hdGlvbiwgb3UgZGUgZGlm ZnVzaW9uIGRlcyBsYW5nYWdlcyBmb25jdGlvbm5lbHMgZXQgYXBwbGljYXRpZnMuIEVudmlyb25u ZW1lbnRzIGV0IG3DqXRob2RvbG9naWVzIGRlIGTDqXZlbG9wcGVtZW50LCByZXRvdXJzIGTigJll eHDDqXJpZW5jZS4NCjwvbGk+PC91bD4NCjxwPkxlcyBhcnRpY2xlcyBzb3VtaXMgYXV4IEpGTEEg c29udCByZWx1cyBwYXIgYXUgbW9pbnMgZGV1eCBwZXJzb25uZXMgc+KAmWlscyBzb250IGFjY2Vw dMOpcywgZXQgYXUgbW9pbnMgdHJvaXMgcGVyc29ubmVzIHPigJlpbHMgc29udCByZWpldMOpcy4g TGVzIGNyaXRpcXVlcyBkZXMgcmVsZWN0ZXVycyBzb250IHRvdWpvdXJzIGJpZW52ZWlsbGFudGVz IGV0IGxhIHBsdXBhcnQgZHUgdGVtcHMgZW5jb3VyYWdlYW50ZXMgZXQgY29uc3RydWN0aXZlcywg bcOqbWUNCiBlbiBjYXMgZGUgcmVqZXQuIDwvcD4NCjxwPklsIG7igJl5IGEgZG9uYyBwYXMgZGUg cmFpc29uIGRlIG5lIHBhcyBzb3VtZXR0cmUgYXV4IEpGTEEgISA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTUyZGFlZiIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzk1MmRhZWYiPkRhdGVzIGltcG9ydGFudGVzPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc5NTJkYWVmIj4NCjxwPjxiPkF0dGVudGlv biA6IGxlcyBkYXRlcyBsaW1pdGVzIHNvbnQgZmVybWVzIGV0IGTDqWZpbml0aXZlcy4gSWwgbuKA mXkgYXVyYSBwYXMgZOKAmWV4dGVuc2lvbi48L2I+DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGk+U291bWlzc2lvbiBkZXMgcsOpc3Vtw6lzIGV0IGFydGljbGVzPC9pPiA6IDE5IG9j dG9icmUgMjAyMywgQW9FIDwvbGk+PGxpPjxpPk5vdGlmaWNhdGlvbiBhdXggYXV0ZXVyczwvaT4g OiAxZXIgZMOpY2VtYnJlIDIwMjMsIEFvRSA8L2xpPjxsaT48aT5WZXJzaW9uIGZpbmFsZSBkZXMg YXJ0aWNsZXM8L2k+IDogMTggZMOpY2VtYnJlIDIwMjMsIEFvRSA8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnY2ZjN2NkZSIgY2xhc3M9Im91 dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2NmYzdjZGUiPlNvdW1pc3Npb25zPC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjZmM3Y2RlIj4NCjxwPk5vdXMgYWNjZXB0 b25zIHF1YXRyZSB0eXBlcyBkZSBzb3VtaXNzaW9ucyA6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVs Ij4NCjxsaT5BcnRpY2xlIGRlIHJlY2hlcmNoZSAoMTggcGFnZXMgbWF4LikgcG9ydGFudCBzdXIg ZGVzIHRyYXZhdXggb3JpZ2luYXV4LiBOb3VzIGFjY2VwdG9ucyBkZXMgdHJhdmF1eCBlbiBjb3Vy cywgcG91ciBsZXNxdWVscyBs4oCZYXNwZWN0IHJlY2hlcmNoZSBu4oCZZXN0IHBhcyBlbnRpw6hy ZW1lbnQgZmluYWxpc8OpLiBOb3VzIGVuY291cmFnZW9ucyBhdXNzaSBsYSBzb3VtaXNzaW9uIGTi gJlhcnRpY2xlcyBwcsOpc2VudGFudCBhdmVjIMOpbMOpZ2FuY2UgdW4gcsOpc3VsdGF0DQogY29u bnUgc291cyB1biBhbmdsZSBub3V2ZWF1LiA8L2xpPjxsaT5BcnRpY2xlIGNvdXJ0ICg5IHBhZ2Vz IG1heC4pIGTDqWNyaXZhbnQgdW4gcHJvYmzDqG1lIHBhcnRpY3VsaWVyLCBsZXMgcGlzdGVzIGVu IGNvdXJzIGTigJlpbnZlc3RpZ2F0aW9uLCBldCB2aXNhbnQgw6AgcmVjaGVyY2hlciBkZSBs4oCZ YWlkZSBkZSBsYSBwYXJ0IGRlIGxhIGNvbW11bmF1dMOpLiBMZXMgYXJ0aWNsZXMgY291cnRzIHBl dXZlbnQgw6lnYWxlbWVudCBwcsOpc2VudGVyIGRlIG1hbmnDqHJlIHN5bnRow6l0aXF1ZSBldCBj b2jDqXJlbnRlIHVuIG91DQogcGx1c2lldXJzIHLDqXN1bHRhdHMgZMOpasOgIHB1Ymxpw6kocyku IDwvbGk+PGxpPlR1dG9yaWVsICgzIHBhZ2VzIG1heC4pIGV4cG9zYW50IGNsYWlyZW1lbnQgbGVz IG9iamVjdGlmcyBldCBs4oCZaW50w6lyw6p0IGRlIGxhIHByw6lzZW50YXRpb24sIGFpbnNpIHF1 ZSBs4oCZZW52aXJvbm5lbWVudCBpbmZvcm1hdGlxdWUgbsOpY2Vzc2FpcmUgw6Agc2EgcsOpYWxp c2F0aW9uLg0KPC9saT48bGk+RMOpbW9uc3RyYXRpb24gZGUgbG9naWNpZWwgKDMgcGFnZXMgbWF4 LikgZMOpY3JpdmFudCBs4oCZaW50w6lyw6p0IGR1IGxvZ2ljaWVsLCBxdeKAmWlsIHNvaXQgcHJv dG90eXBpcXVlIG91IGFib3V0aSwgYWluc2kgcXVlIHNlcyBzcMOpY2lmaWNpdMOpcy4NCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2ZTkz MTEwIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNmU5MzExMCI+Q29uc2lnbmVzIGF1 eCBhdXRldXJzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc2 ZTkzMTEwIj4NCjxwPkxlcyBhcnRpY2xlcyBwZXV2ZW50IMOqdHJlIHLDqWRpZ8OpcyBlbiBmcmFu w6dhaXMgb3UgZW4gYW5nbGFpcy4gPC9wPg0KPHA+TGEgZm9ybWUgZGUgbOKAmWFydGljbGUgZG9p dCDDqnRyZSBzb2lnbsOpZSwgZXQgbGUgY29udGVudSByw6lkaWfDqSBkZSBtYW5pw6hyZSBzdHJ1 Y3R1csOpZSBldCBjbGFpcmUuDQo8L3A+DQo8cD5MZSBzdHlsZSBMYVRlWCBqZmxhcnQgZG9pdCBp bXDDqXJhdGl2ZW1lbnQgw6p0cmUgdXRpbGlzw6kgc2FucyBtb2RpZmljYXRpb24gZGUgbGEgbWlz ZSBlbiBwYWdlLiBMZSBzdHlsZSBMYVRlWCBldCBzYSBkb2N1bWVudGF0aW9uIHNvbnQgZGlzcG9u aWJsZXMgZGVwdWlzIGxlIHNpdGUgd2ViIGRlIGxhIGNvbmbDqXJlbmNlLg0KPC9wPg0KPHA+TGVz IGxpbWl0ZXMgZGUgcGFnZXMgc29udCBzdHJpY3Rlcy4gTGVzIHLDqWbDqXJlbmNlcyBiaWJsaW9n cmFwaGlxdWVzIG5lIHNvbnQgcGFzIGNvbXB0YWJpbGlzw6llcyBkYW5zIGxhIGxpbWl0ZSBkZSBw YWdlcy4gTGVzIGFubmV4ZXMgYXV4IGFydGljbGVzIG5lIHNvbnQgcGFzIGF1dG9yaXPDqWVzLg0K PC9wPg0KPHA+TGVzIGF1dGV1cnMgcGV1dmVudCBzb3VtZXR0cmUgZHUgbWF0w6lyaWVsIHN1cHBs w6ltZW50YWlyZSwgc8OpcGFyw6kgZGUgbOKAmWFydGljbGUgc291bWlzLCBzb3VzIGZvcm1lIGRl IHRleHRlICh2ZXJzaW9uIGxvbmd1ZSwgc2FucyBsaW1pdGUgZGUgcGFnZXMpIGV0L291IGRlIGTD qXZlbG9wcGVtZW50IGxvZ2ljaWVsLiBM4oCZw6l2YWx1YXRpb24gZGUgY2UgbWF0w6lyaWVsIHN1 cHBsw6ltZW50YWlyZSBlc3Qgw6AgbGEgZGlzY3LDqXRpb24gZGVzIHJlbGVjdGV1cnMuDQogTGVz IGFydGljbGVzIHNvdW1pcyBkb2l2ZW50IGRvbmMgw6p0cmUgYXV0by1jb250ZW51cyBldCDDqXZh bHVhYmxlcyBzYW5zIGNlIG1hdMOpcmllbCBzdXBwbMOpbWVudGFpcmUuDQo8L3A+DQo8cD5MZXMg c291bWlzc2lvbnMgcGFyYWxsw6hsZXMgZGFucyBk4oCZYXV0cmVzIGNvbmbDqXJlbmNlcywgam91 cm5hdXggb3Ugd29ya3Nob3BzIGF2ZWMgYWN0ZXMgbmUgc29udCBwYXMgYXV0b3Jpc8OpZXMuDQo8 L3A+DQo8cD5MZXMgbWVtYnJlcyBkdSBjb21pdMOpIGRlIHByb2dyYW1tZSBzb250IGF1dG9yaXPD qXMgw6Agc291bWV0dHJlIHVuIGFydGljbGUuIExlcyBwcsOpc2lkZW50cyBkdSBjb21pdMOpIG5l IGxlIHNvbnQgcGFzLg0KPC9wPg0KPHA+TGVzIGFydGljbGVzIGRvaXZlbnQgw6p0cmUgc291bWlz IHZpYSA8YSBocmVmPSJodHRwczovL2pmbGEyMDI0LmhvdGNycC5jb20iPkhvdENSUDwvYT4uDQo8 L3A+DQo8cD5M4oCZw6l2YWx1YXRpb24gZGVzIGFydGljbGVzIHN1aXQgdW4gcHJvY2Vzc3VzIGVu IHNpbXBsZS1hdmV1Z2xlIDogbGVzIHJlbGVjdGV1cnMgZGVzIGFydGljbGVzIHNvbnQgYW5vbnlt ZXMsIG1haXMgcGFzIGxlcyBhdXRldXJzLg0KPC9wPg0KPHA+TGVzIGFydGljbGVzIGFjY2VwdMOp cyBzZXJvbnQgcHVibGnDqXMgZGFucyBsZXMgYWN0ZXMgZGUgbGEgY29uZsOpcmVuY2UsIHN1ciBI QUwgKHBvcnRhaWwgaW5zdGl0dXRpb25uZWwgSW5yaWEpLCBldCBsZXMgYXV0ZXVycyBlbiBkb25u ZXJvbnQgdW5lIHByw6lzZW50YXRpb24gbG9ycyBkZXMgam91cm7DqWVzLiBMZXMgcHLDqXNlbnRh dGlvbnMgc2Vyb250LCBkZSBwcsOpZsOpcmVuY2UsIGRvbm7DqWVzIGVuIGZyYW7Dp2Fpcy4NCjwv cD4NCjxwPkRlbHBoaW5lIERlbWFuZ2UgZXQgQWRyaWVuIEd1YXR0bywgSkZMQSAyMDI0IDwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItMTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMiI+T0NhbWwub3JnIE5ld3NsZXR0 ZXI6IE1heSAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0x MiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2Nh bWwtb3JnLW5ld3NsZXR0ZXItbWF5LTIwMjMvMTI0ODUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItbWF5LTIwMjMvMTI0ODUvMTwvYT4gPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiNzVjNDk1IiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnYjc1YzQ5NSI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiNzVjNDk1Ij4NCjxw PldlbGNvbWUgdG8gdGhlIE1heSAyMDIzIGVkaXRpb24gb2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0 dGVyISBBcyB3aXRoIHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9uZXdzL29jYW1sb3Jn LTIwMjMtMDQiPg0KcHJldmlvdXMgdXBkYXRlPC9hPiwgdGhpcyBoYXMgYmVlbiBjb21waWxlZCBi eSBAc2FiaW5lIGFuZCBAdG1hdHRpby4gPC9wPg0KPHA+VGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVy IHByb3ZpZGVzIGFuIG92ZXJ2aWV3IG9mIGNoYW5nZXMgb24gdGhlIE9DYW1sLm9yZyB3ZWJzaXRl IGFuZCBnaXZlcyB5b3UgYSBnbGltcHNlIGludG8gd2hhdCBoYXMgYmVlbiBnb2luZyBvbiBiZWhp bmQgdGhlIHNjZW5lcy4gWW91IGNhbiBmaW5kIGENCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdGFnL29jYW1sb3JnLW5ld3NsZXR0ZXIiPmxpc3Qgb2YgcHJldmlvdXMgaXNzdWVz IGhlcmU8L2E+Lg0KPC9wPg0KPHA+T3VyIGdvYWwgaXMgdG8gbWFrZSBPQ2FtbC5vcmcgdGhlIGJl c3QgcmVzb3VyY2UgZm9yIGFueW9uZSB3aG8gd2FudHMgdG8gZ2V0IHN0YXJ0ZWQgYW5kIGJlIHBy b2R1Y3RpdmUgaW4gT0NhbWwuIFdlIGNvdWxkbuKAmXQgZG8gaXQgd2l0aG91dCBhbGwgdGhlIGFt YXppbmcgT0NhbWwgY29tbXVuaXR5IG1lbWJlcnMgd2hvIGhlbHAgdXMgcmV2aWV3LCByZXZpc2Us IGFuZCBjcmVhdGUgYmV0dGVyIE9DYW1sIGRvY3VtZW50YXRpb24uIFlvdXIgZmVlZGJhY2sNCiBl bmFibGVzIHVzIHRvIGJldHRlciBwcmlvcml0aXNlIG91ciB3b3JrIGFuZCBtYWtlIHByb2dyZXNz IHRvd2FyZHMgb3VyIGdvYWwuIFRoYW5rIHlvdSENCjwvcD4NCjxwPldlIHByZXNlbnQgdGhlIHdv cmsgd2XigJl2ZSBiZWVuIGRvaW5nIHRoaXMgbW9udGggaW4gdGhyZWUgc2VjdGlvbnM6IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5MZWFybiBhcmVhOjwvYj4gV2XigJlyZSB3b3Jr aW5nIHRvd2FyZHMgbWFraW5nIE9DYW1sLm9yZyBhIGdyZWF0IHJlc291cmNlIHRvIGxlYXJuIE9D YW1sIGFuZCBkaXNjb3ZlciBpdHMgZWNvc3lzdGVtLiBUaGlzIG1vbnRoLCB3ZSB3b3JrZWQgb24g dGhlIGZpcnN0IHdpcmVmcmFtZXMgb2YgdGhlIG5ldyBMZWFybiBzZWN0aW9uLCBhbmQgd2UgcHVi bGlzaGVkIGEgY291cGxlIG9mIG5ldyBkb2N1bWVudGF0aW9uIHBhZ2VzLg0KPC9saT48bGk+PGI+ UGFja2FnZSBkb2N1bWVudGF0aW9uIHNlYXJjaDo8L2I+IEluLXBhY2thZ2Ugc2VhcmNoIGlzIG5v dyBhdmFpbGFibGUgZm9yIGV2ZXJ5IHBhY2thZ2Ugb24gT0NhbWwub3JnISBXZSByZWxlYXNlZCB0 aGUgZmlyc3QsIG1pbmltYWwgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZSBhbmQgd2lsbCBjb250aW51 ZSB0byBpbXByb3ZlIGl0IGluIHRoZSBjb21pbmcgbW9udGhzLg0KPC9saT48bGk+PGI+R2VuZXJh bCBJbXByb3ZlbWVudHM6PC9iPiBXZSBhbHNvIHdvcmtlZCBvbiBnZW5lcmFsIG1haW50ZW5hbmNl IGFuZCBpbXByb3ZlbWVudHMuIFdl4oCZbGwgaGlnaGxpZ2h0IHNvbWUgb2YgdGhlbSBpbiB0aGlz IG5ld3NsZXR0ZXIuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzQxYWViYTQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc0MWFlYmE0Ij5M ZWFybiBBcmVhPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc0 MWFlYmE0Ij48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZTE2M2Ji YiI+PC9hPjEuIFJlZGVzaWduIG9mIHRoZSBMZWFybiBBcmVhPGJyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2UxNjNiYmIiPg0KPHA+QXMgcGFydCBvZiBvdXIgZWZm b3J0IHRvIG1ha2UgT0NhbWwub3JnIGEgZ3JlYXQgcmVzb3VyY2UgdG8gbGVhcm4gT0NhbWwsIHdl IHB1Ymxpc2hlZCBhIHN1cnZleSB0byBjb25kdWN0IHVzZXIgcmVzZWFyY2ggaW4gQXByaWwuIFdl IHJlY2VpdmVkIHRvbnMgb2YgaW5zaWdodGZ1bCBmZWVkYmFjay4gVGhpcyBtb250aCwgd2UgYW5h bHlzZWQgYWxsIHRoZSByZXN1bHRzIHdlIGdvdCAoNTcgYW5zd2VycyEpIGFuZCB3ZSBjb25kdWN0 ZWQgdXNlcg0KIGludGVydmlld3Mgd2l0aCB0aG9zZSB3aG8gdm9sdW50ZWVyZWQgdG8gYmUgaW50 ZXJ2aWV3ZWQuIDwvcD4NCjxwPkFzIGEgZm9sbG93LXVwIHRvIHRoZSB1c2VyIHN1cnZleSBjb25k dWN0ZWQgbGFzdCBtb250aCwgd2UgcG9zdGVkIGEgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3lvdS1zdGFydGVkLXRvLWxlYXJuLW9jYW1sLWxlc3MtdGhhbi0xMi1tb250aHMt YWdvLXBsZWFzZS1oZWxwLXVzLXdpdGgtb3VyLXVzZXItc3VydmV5LW9uLXRoZS1vY2FtbC1vcmct bGVhcm5pbmctYXJlYS8xMTk0NS8yIj4NCnN1bW1hcnkgZm9yIHRoZSBMZWFybiBhcmVhIHN1cnZl eTwvYT4uIDwvcD4NCjxwPkFmdGVyIHdlIGFuYWx5c2VkIHRoZSBpbnRlcnZpZXcgZGF0YSwgY3Jl YXRlZCB1c2VyIGluc2lnaHQgY2FyZHMsIGFuZCB3ZW50IHRocm91Z2ggYWxsIHRoZSByZXNvdXJj ZXMgcmVjb21tZW5kZWQgYnkgdGhlIHN1cnZleSByZXNwb25zZXMsIHdlIHByaW9yaXRpc2VkIHRh c2tzIGFuZCBiZWdhbiBjcmVhdGluZyB3aXJlZnJhbWVzIGZvciB0aGUgTGVhcm4gc2VjdGlvbi4g VGhlIHdvcmstaW4tcHJvZ3Jlc3Mgd2lyZWZyYW1lcyBhcmUgYWNjZXNzaWJsZQ0KIG9uIDxhIGhy ZWY9Imh0dHBzOi8vd3d3LmZpZ21hLmNvbS9maWxlL0FxazV5MDNmc2FDdWhUU3l3bW1ZMDYvT0Nh bWwub3JnLVB1YmxpYy1EZXNpZ25zP3R5cGU9ZGVzaWduJmFtcDtub2RlLWlkPTExNC0xNzUmYW1w O21vZGU9ZGVzaWduIj4NCkZpZ21hPC9hPi4gPC9wPg0KPHA+SW4gSnVuZSwgd2XigJlsbCBzdGFy dCBnYXRoZXJpbmcgdXNlciBmZWVkYmFjayBvbiB0aGUgd2lyZWZyYW1lcyBhbmQgZXZlbnR1YWxs eSBzdGFydCBjcmVhdGluZyBkZXNpZ25zIGZvciB0aGUgbmV3IExlYXJuIHBhZ2VzLg0KPC9wPg0K PC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNDI5NmM4OSI+PC9hPjIuIE9DYW1sIERvY3VtZW50 YXRpb248YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNDI5NmM4 OSI+DQo8cD5XZSBjb21wbGV0ZWQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3Mv c2VxdWVuY2VzIj5TZXF1ZW5jZXM8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9k b2NzL2Vycm9yLWhhbmRsaW5nIj4NCkVycm9yIEhhbmRsaW5nPC9hPiB0dXRvcmlhbHMuIFRoZSA8 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9pbnN0YWxsIj5JbnN0YWxsIHBhZ2U8L2E+IHdlbnQg bGl2ZSwgYW5kIGltcHJvdmVtZW50cyB3ZXJlIG1hZGUgdG8gdGhlDQo8YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9kb2NzL2ZpcnN0LWhvdXIiPkZpcnN0IERheSB0dXRvcmlhbDwvYT4uIDwvcD4N CjxwPkFza2luZyB0aGUgY29tbXVuaXR5IHRvIGhlbHAgcmV2aWV3IHRoZSBpbml0aWFsIHZlcnNp b25zIG9mIHRoZSBuZXcgZG9jdW1lbnRhdGlvbiBwYWdlIGhhcyBiZWVuIHN1Y2Nlc3NmdWwsIHNv IHdl4oCZcmUgcGxhbm5pbmcgb24gb3BlbmluZyBtb3JlIERpc2N1c3MgcG9zdHMgZm9yIHBhZ2Vz IHRoYXQgYXJlIHJlYWR5IHRvIHJldmlldyBpbiB0aGUgY29taW5nIG1vbnRocy4NCjwvcD4NCjxw Pldl4oCZcmUgZGVlcGx5IGdyYXRlZnVsIHRvIGFsbCB0aGUgY29udHJpYnV0b3JzIHdobyBoZWxw ZWQgcmV2aWV3IHRoZSBkb2N1bWVudGF0aW9uLCBlaXRoZXIgYnkgc2hhcmluZyBpbnNpZ2h0cyBv biBEaXNjdXNzIG9yIHBhcnRpY2lwYXRpbmcgaW4gdGhlIFBSIHJldmlldyBvbiBHaXRIdWIuIFRo aXMgaXMgZXhhY3RseSBob3cgd2UgZW52aXNpb25lZCB0aGUgZWZmb3J0IG9uIGNyZWF0aW5nIHRo ZSBuZXcgT0NhbWwub3JnIERvY3VtZW50YXRpb24sDQogc28gd2XigJlyZSBhcHByZWNpYXRpdmUg b2YgZXZlcnlvbmUgd2hvIGVuZ2FnZWQgdG8gbWFrZSB0aGlzIGEgY29tbXVuaXR5IGluaXRpYXRp dmUhDQo8L3A+DQo8cD48Yj5SZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+UmVhY2hlZCBvdXQgZm9yIGNvbW11bml0eSBmZWVkYmFj ayBvbiB0aGUgbmV3IDxiPkVycm9yIEhhbmRsaW5nPC9iPiBkb2N1bWVudGF0aW9uIHBhZ2UNCjxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91cGRhdGluZy10aGUtZXJyb3ItaGFu ZGxpbmctdHV0b3JpYWwvMTIwMjIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3VwZGF0 aW5nLXRoZS1lcnJvci1oYW5kbGluZy10dXRvcmlhbC8xMjAyMjwvYT4gPC9saT48bGk+PGI+Rmly c3QgSG91cjwvYj4gaW1wcm92ZW1lbnQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9wdWxsLzExNTMiPg0Kb2NhbWwvb2NhbWwub3JnIzExNTM8L2E+IDwvbGk+PGxp PkxpbmUgZWRpdGluZyBmb3IgPGI+RnVuY3RvcnM8L2I+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMTI3Ij4NCm9jYW1sL29jYW1sLm9yZyMxMTI3PC9h PiA8L2xpPjxsaT5SZXdyaXRlIDxiPkZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmc8L2I+IGRvYyBpbnRy b2R1Y3Rpb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs Lzk3MSI+DQpvY2FtbC9vY2FtbC5vcmcjOTcxPC9hPiA8L2xpPjxsaT5JbXBvcnQgcmV3cml0dGVu IFNldCB0dXRvcmlhbCBmcm9tIFYyIFBSIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC85NDgiPg0Kb2NhbWwvb2NhbWwub3JnIzk0ODwvYT4gPC9saT48bGk+ RG9jdW1lbnRhdGlvbjogPGI+U2VxdWVuY2VzPC9iPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvNzkxIj4NCm9jYW1sL29jYW1sLm9yZyM3OTE8L2E+IDwv bGk+PGxpPkFkZCBhIGRlZGljYXRlZCDigJlpbnN0YWxs4oCZIHBhZ2UgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEwMzgiPg0Kb2NhbWwvb2NhbWwub3Jn IzEwMzg8L2E+IDwvbGk+PGxpPkVkaXRpbmcvdGVzdGluZyA8Yj5JZiBTdGF0ZW1lbnRzPC9iPiA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvOTc0Ij4NCm9j YW1sL29jYW1sLm9yZyM5NzQ8L2E+IDwvbGk+PGxpPlVwZGF0ZSA8Yj5MYWJlbHM8L2I+IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDQwIj5vY2FtbC9v Y2FtbC5vcmcjMTA0MDwvYT4NCjwvbGk+PGxpPlJlbW92ZSA8Y29kZT5wcGEvYXZzbTwvY29kZT4g cGFja2FnZSBmcm9tIGluc3RhbGwgaW5zdHJ1Y3Rpb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzExODYiPg0Kb2NhbWwvb2NhbWwub3JnIzExODY8L2E+ IDwvbGk+PGxpPkJ5IEV4dGVybmFsIENvbnRyaWJ1dG9yczoNCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5UeXBvIGluIDxiPlVwLWFuZC1SdW5uaW5nPC9iPiA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTE2MiI+DQpvY2FtbC9vY2FtbC5vcmcjMTE2Mjwv YT4gPC9saT48bGk+Rml4IGEgY291cGxlIGdyYW1tYXIgYnVncyA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTE4OCI+DQpvY2FtbC9vY2FtbC5vcmcjMTE4 ODwvYT4gPC9saT48bGk+VXBkYXRlZCB0ZXh0IHRvIHJlbW92ZSByZWZlcmVuY2VzIHRvIGhpZ2hs aWdodGVkIGNvZGUgdGhhdCB3YXMgbm90IGhpZ2hsaWdodGVkLg0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEyMTMiPm9jYW1sL29jYW1sLm9yZyMxMjEz PC9hPiA8L2xpPjxsaT5GaXggPGNvZGU+U3lzLmdldGVudl9vcHQ8L2NvZGU+IHR5cGUgc2lnbmF0 dXJlIGluIHR1dG9yaWFsIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xMjI4Ij4NCm9jYW1sL29jYW1sLm9yZyMxMjI4PC9hPiA8L2xpPjxsaT5VcGRhdGUg PGI+TWV0YXByb2dyYW1taW5nPC9iPiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMTIzMiI+DQpvY2FtbC9vY2FtbC5vcmcjMTIzMjwvYT4gPC9saT48L3Vs Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2ZiZDEwYTAiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdm YmQxMGEwIj5Jbi1QYWNrYWdlIERvY3VtZW50YXRpb24gU2VhcmNoPC9oND4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdmYmQxMGEwIj4NCjxwPkluIEFwcmlsLCB3ZSBz dGFydGVkIHdvcmtpbmcgb24gYnVpbGRpbmcgYW4gaW4tcGFja2FnZSBzZWFyY2ggZmVhdHVyZSBm b3IgT0NhbWwgcGFja2FnZXMgb24gT0NhbWwub3JnLiBXZSBjb250aW51ZWQgdGhpcyBlZmZvcnQg dGhyb3VnaCBNYXksIGFuZCB3ZSByZWxlYXNlZCB0aGUgZmVhdHVyZSBhdCB0aGUgZW5kIG9mIHRo ZSBtb250aC4gSW4tcGFja2FnZSBzZWFyY2ggaXMgbm93IGFjY2Vzc2libGUgZm9yIGV2ZXJ5IHBh Y2thZ2Ugb24gT0NhbWwub3JnIQ0KIDp0YWRhOiA8L3A+DQo8cD5Ob3RlIHRoYXQgdGhpcyBpcyB0 aGUgZmlyc3QsIG1pbmltYWwgdmVyc2lvbiBvZiB0aGUgZmVhdHVyZS4gV2XigJlyZSBwbGFubmlu ZyBtYW55IGltcHJvdmVtZW50cyBpbiB0aGUgY29taW5nIG1vbnRocywgZXNwZWNpYWxseSBhcyB0 aGUNCjxjb2RlPm9kb2M8L2NvZGU+IHRlYW0gaXMgY3VycmVudGx5IHdvcmtpbmcgb24gYWRkaW5n IHNlYXJjaCBjYXBhYmlsaXRpZXMgdG8gPGNvZGU+DQpvZG9jPC9jb2RlPi4gPC9wPg0KPHA+PGI+ UmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPkZpeCBpbmNvbXBsZXRlIHNlYXJjaCBpbmRleCA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtZG9jL3Zvb2Rvby9wdWxsLzU5I3B1bGxyZXF1ZXN0cmV2aWV3LTE0MDg3NTM5 MDMiPg0Kb2NhbWwtZG9jL3Zvb2RvbyM1OTwvYT4gPC9saT48bGk+SW50ZWdyYXRlIGV4cGVyaW1l bnRhbCBpbi1icm93c2VyIHNlYXJjaCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMTE2NSI+DQpvY2FtbC9vY2FtbC5vcmcjMTE2NTwvYT4gPC9saT48bGk+ R2V0IGNvbW11bml0eSBmZWVkYmFjayBmb3IgdGhlIG1pbmltYWwgcHJvdG90eXBlIG9mIGluLXBh Y2thZ2Ugc2VhcmNoIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLW1pbmlt YWwtcHJvdG90eXBlLW9mLWluLXBhY2thZ2Utc2VhcmNoLWlzLW9uLXN0YWdpbmctb2NhbWwtb3Jn LzEyMTYzLzEiPg0Kb24gRGlzY3VzczwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2UwZGM1ZjIiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmdlMGRjNWYyIj5HZW5lcmFsIEltcHJvdmVtZW50czwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZTBkYzVmMiI+DQo8cD5XZSBhcHByb3ZlZCBh bmQgbWVyZ2VkIG51bWVyb3VzIGNoYW5nZXMsIGluY2x1ZGluZyBzZXJ2aW5nIE9DYW1sLm9yZ+KA mXMgc3RhdGljIGFzc2V0cyB1bmRlciBjYWNoZS1idXN0aW5nIFVSTHMsIHJlZmFjdG9yaW5ncyBm b3IgYmV0dGVyIGNvZGUgaGVhbHRoLCBhbmQgc2NyYXBpbmcgT0NhbWwgUGxhbmV0IGZlZWRzIGlu ZGl2aWR1YWxseS4gQSBiaWcgdGhhbmsgeW91IHRvIHRoZSBjb250cmlidXRvcnMhDQo8L3A+DQo8 cD5XZSBpbml0aWF0ZWQgd29yayBvbiBhIGRlc2lnbiBzeXN0ZW0gZm9yIE9DYW1sLm9yZywgZW1w aGFzaXNpbmcgYnV0dG9ucywgZHJvcGRvd25zLCBhbmQgdHlwb2dyYXBoeS4gQXMgcGFydCBvZiB0 aGlzIHdvcmssIHdlIGludmVzdGVkIHRpbWUgcmVzZWFyY2hpbmcgcG90ZW50aWFsIGltcHJvdmVt ZW50cyB0byBvdXIgQ1NTLCBpbmNsdWRpbmcgYSBwb3RlbnRpYWwgbWlncmF0aW9uIGZyb20gVGFp bHdpbmQgdG8gVW5vQ1NTIGZvciBiZXR0ZXIgY3VzdG9tDQogcnVsZXMgc3VwcG9ydC4gV2Ugb3Bl bmVkIGFuIGlzc3VlIHdpdGggVW5vQ1NTIHRvIGV4cGxvcmUgb3B0aW9ucyBmb3IgYSBzdGFuZGFs b25lIENMSSBhbmQgaGF2ZSBiZWd1biB0byBjcmVhdGUgRHJlYW0gY29tcG9uZW50cyBmb3IgVUkg ZWxlbWVudHMgdGhhdCBvY2N1ciByZXBlYXRlZGx5Lg0KPC9wPg0KPHA+V2UgYmVnYW4gd29ya2lu ZyBvbiBhZGRpbmcgdGFncyB0byBmYWNpbGl0YXRlIGJsb2cgc2VhcmNoIGFuZCBhZGRlZCBzZXZl cmFsIFJTUyBmZWVkcyBmcm9tIHRoZSBvbGQgT0NhbWwgUGxhbmV0IHRvIHRoZSBPQ2FtbCBibG9n LiBBcyBhIGNvbnNlcXVlbmNlLCB3ZSBoYWQgdG8gYWRkcmVzcyBpc3N1ZXMgcmVsYXRpbmcgdG8g dGhlc2UgbmV3IFJTUyBzb3VyY2VzLg0KPC9wPg0KPHA+PGI+UmVsZXZhbnQgUFJzIGFuZCBBY3Rp dml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkJ1Z2ZpeGVzOg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPkNsb3NlIDxjb2RlPmZvcm08L2NvZGU+IHRhZyBpbiBjaGFu Z2Vsb2cuZW1sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xMTU1Ij4NCm9jYW1sL29jYW1sLm9yZyMxMTU1PC9hPiA8L2xpPjxsaT5JbnN0YWxsIHBhZ2U6 IG9ubHkgZGlzdGluZ3Vpc2ggYmV0d2VlbiBXaW5kb3dzIGFuZCBldmVyeXRoaW5nIGVsc2U7IGZp eCB3cm9uZyBkZWZhdWx0IHNlbGVjdGlvbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzExOTEiPm9jYW1sL29jYW1sLm9yZyMxMTkxPC9hPiA8L2xpPjwv dWw+DQo8L2xpPjxsaT5EYXRhOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkJ1bXAgQWhyZWZz IGpvYiwgYXMgaXTigJlzIHN0aWxsIHJlbGV2YW50IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMTY4Ij4NCm9jYW1sL29jYW1sLm9yZyMxMTY4PC9hPiA8 L2xpPjwvdWw+DQo8L2xpPjxsaT5CeSBFeHRlcm5hbCBDb250cmlidXRvcnM6DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+VXNlIDxjb2RlPk9DYW1sb3JnX3N0YXRpYy5NZWRpYS51cmw8L2NvZGU+ IGZvciBtZWRpYSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMTE2MyNwdWxscmVxdWVzdHJldmlldy0xNDI3OTU0MTUyIj4NCm9jYW1sL29jYW1sLm9yZyMx MTYzPC9hPiA8L2xpPjxsaT5BZGQgTygxKSBsYWJzIGluIEluZHVzdHJpYWwgVXNlciBwYWdlIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMTgwI3B1bGxy ZXF1ZXN0cmV2aWV3LTE0Mjc4NDEzNjUiPg0Kb2NhbWwvb2NhbWwub3JnIzExODA8L2E+IDwvbGk+ PC91bD4NCjwvbGk+PGxpPk9DYW1sIFBsYW5ldDoNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5B ZGQgU2lnbmFsIGFuZCBUaHJlYWRzIGFzIGFuIFJTUyBzb3VyY2UgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzExOTciPg0Kb2NhbWwvb2NhbWwub3JnIzEx OTc8L2E+IDwvbGk+PGxpPkZpeCBSU1Mgc291cmNlcyBmaWxlbmFtZSA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTE5OCI+DQpvY2FtbC9vY2FtbC5vcmcj MTE5ODwvYT4gPC9saT48bGk+Q3JlYXRlIFJTUyBmZWVkIDxjb2RlPnBsYW5ldDwvY29kZT4gZm9s ZGVyLCBpZiBtaXNzaW5nIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8xMjAwIj4NCm9jYW1sL29jYW1sLm9yZyMxMjAwPC9hPiA8L2xpPjxsaT5BZGQgQXJj aGl2ZXMgb2YgT0NhbWwgV2Vla2x5IE5ld3MgdG8gPGNvZGU+L2Jsb2c8L2NvZGU+IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMjAxIj4NCm9jYW1sL29j YW1sLm9yZyMxMjAxPC9hPiA8L2xpPjxsaT5GaXggc2NyYXBpbmcgcGF0aCBtYW5hZ2VtZW50IDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMjA0Ij4NCm9j YW1sL29jYW1sLm9yZyMxMjA0PC9hPiA8L2xpPjxsaT5BZGQgQ2FtbCBXZWVrbHkgTmV3cyBSU1Mg ZmVlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTIw NyI+DQpvY2FtbC9vY2FtbC5vcmcjMTIwNzwvYT4gPC9saT48bGk+QWRkIFNpZ25hbCBhbmQgVGhy ZWFkcyBSU1MgZmVlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTIwOSI+DQpvY2FtbC9vY2FtbC5vcmcjMTIwOTwvYT4gPC9saT48bGk+QWRkIGVtZWxs ZS50diBSU1MgZmVlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTIxNyI+DQpvY2FtbC9vY2FtbC5vcmcjMTIxNzwvYT4gPC9saT48bGk+QWRkIG9jYW1s Lm9yZyBoYW5kLXBpY2tlZCBSU1MgZmVlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMTIxOCI+DQpvY2FtbC9vY2FtbC5vcmcjMTIxODwvYT4gPC9saT48 L3VsPg0KPC9saT48bGk+T3RoZXI6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+U2VydmUgZGFz aGJvYXJkIGFzc2V0cyBmcm9tIGZpbGUgc3lzdGVtIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMTY3Ij4NCm9jYW1sL29jYW1sLm9yZyMxMTY3PC9hPiA8 L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEzIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MTMiPk90aGVyIE9DYW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTEzIj48L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzlkNmViNGQi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5ZDZlYjRkIj5Gcm9tIHRoZSBvY2FtbC5v cmcgYmxvZzwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOWQ2 ZWI0ZCI+DQo8cD5IZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJs b2c8L2E+LiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9i bG9nLmphbmVzdHJlZXQuY29tL294aWRpemluZy1vY2FtbC1vd25lcnNoaXAvIj5PeGlkaXppbmcg T0NhbWw6IFJ1c3QtU3R5bGUgT3duZXJzaGlwPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cDov L2NhbWJpdW0uaW5yaWEuZnIvYmxvZy9mbG9yaWFuLWNvbXBpbGVyLXdlZWtseS0yMDIzLTA2LTIw Ij5GbG9yaWFu4oCZcyBPQ2FtbCBjb21waWxlciB3ZWVrbHksIDIwIEp1bmUgMjAyMzwvYT4NCjwv bGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTA2LTIwLW9jYW1s LXJlY2VpdmVzLXRoZS1hY20tcHJvZ3JhbW1pbmctbGFuZ3VhZ2VzLXNvZnR3YXJlLWF3YXJkIj5P Q2FtbCBSZWNlaXZlcyB0aGUgQUNNIFNJR1BMQU4gUHJvZ3JhbW1pbmcgTGFuZ3VhZ2VzIFNvZnR3 YXJlIEF3YXJkPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnOWI2MmQyZiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9Im9yZzliNjJkMmYiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LW9yZzliNjJkMmYiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0K c2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRh a2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+ DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8 cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3Ug bWF5IHN1YnNjcmliZSA8YSBocmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2Nh bWwtbmV3cy13ZWVrbHkvIj4NCm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5h bWUiIGlkPSJvcmcxMzI0M2VmIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 20 Jun 2023 10:53:31 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 20 Jun 2023 10:53:30 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 20 Jun 2023 10:53:30 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35K9qkIA002882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 20 Jun 2023 10:52:46 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35K9qX1R002862 for ; Tue, 20 Jun 2023 10:52:33 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 Jun 2023 11:52:28 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 79B37E0A8D; Tue, 20 Jun 2023 11:52:28 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 28196E0157 for ; Tue, 20 Jun 2023 11:52:21 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Jun 2023 11:52:18 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B2234561294; Tue, 20 Jun 2023 11:52:16 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZo10Rb03fGBLgYkq3+rAKdsVNtw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 20 Jun 2023 10:52:16 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: e48fe7f0-6d7f-4dc4-1cac-08db71743436 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.00,256,1681164000"; d="scan'208,217";a="59226578" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499999, queueID=39BCD561295 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNi0yMCBUdWUgMTE6NTAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDYuMTMuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNi4yNy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bmUgMTMgdG8gMjAsIDIwMjMuIDwvcD4N CjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJsZSBv ZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJk b2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+UGFja2FnaW5nIGFuIGV4ZWN1dGFibGUg Zm9yIGhvbWVicmV3IGluc3RhbGwgZm9yIG5vbi1PQ2FtbCB1c2VyczwvYT4NCjwvbGk+PGxpPjxh IGhyZWY9IiMyIj52MC4xNiByZWxlYXNlIG9mIEphbmUgU3RyZWV0IHBhY2thZ2VzPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjMyI+TmV3IHJlbGVhc2Ugb2YgTWVuaGlyICgyMDIzMDYwOCk8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiM0Ij5EcmVhbS1odG1sIC0gRFNMIHRvIGJ1aWxkIEhUTUwsIGludGVn cmF0ZWQgd2l0aCBEcmVhbTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPnJlbGVhc2Ugb2YgbWlu aXNhdCAwLjU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5XaGljaCBmaWx0ZXJzIHdvdWxkIHlv dSBsaWtlIHRvIHNlZSBvbiB0aGUgT0NhbWwgYmxvZyBhdCBPQ2FtbC5vcmc/PC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iIzciPk9DYW1sIFBsYXRmb3JtIE5ld3NsZXR0ZXIsIE1heSAyMDIzPC9hPiA8 L2xpPjxsaT48YSBocmVmPSIjOCI+Q29uZ3JhdHVsYXRpb24gdG8gdGhlIE9DYW1sIHRlYW0gZm9y IHRoZSAyMDIzIFNJR1BMQU4gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHNvZnR3YXJlIGF3YXJkISDw n4+GPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzkiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiNvcmdkMGMyZjc1Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjEiPlBhY2thZ2luZyBhbiBleGVjdXRhYmxlIGZvciBob21lYnJldyBpbnN0YWxs IGZvciBub24tT0NhbWwgdXNlcnM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3BhY2thZ2luZy1hbi1leGVjdXRhYmxlLWZvci1ob21lYnJldy1pbnN0YWxsLWZvci1ub24t b2NhbWwtdXNlcnMvMTIzODgvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcGFja2Fn aW5nLWFuLWV4ZWN1dGFibGUtZm9yLWhvbWVicmV3LWluc3RhbGwtZm9yLW5vbi1vY2FtbC11c2Vy cy8xMjM4OC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmdkZDNhZjYxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZGQzYWY2MSI+SmFtZXMg R2VkZGVzIGFza2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmdkZDNhZjYxIj4NCjxwPldvdWxkIGFueW9uZSBoYXZlIGFuIGV4YW1wbGUgSSBjb3VsZCBsb29r IGF0IG9mIGEgaG9tZWJyZXcg4oCcZm9ybXVsYeKAnSBmb3IgYW4gT0NhbWwgcHJvZ3JhbT8gSeKA mW0gbG9va2luZyB0byBkaXN0cmlidXRlIGFuIGV4ZWN1dGFibGUgdG8gY29sbGVhZ3VlcyB3aG8g YXJlIG5vdCBPQ2FtbCB1c2Vycy4NCjwvcD4NCjxwPihUaGVyZSBzZWVtIHRvIGJlIGxvdHMgb2Yg bW92aW5nIHBhcnRzIGFuZCBJ4oCZbSBub3Qgc3VyZSB3aGljaCBvbmUgaGFzIHN0b3BwZWQgbW92 aW5nISkuDQo8L3A+DQo8cD5NYW55IHRoYW5rcy4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNiZjY0MDQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmczYmY2NDA0Ij5Sb2xhbmQgQ3Nhc3phciByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczYmY2NDA0Ij4NCjxwPkFsbCBvZmZpY2lhbCBI b21lYnJldyBmb3JtdWxhcyBhcmUgbG9jYXRlZCBpbiB0aGlzIEdpdEh1YiByZXBvOiA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vSG9tZWJyZXcvaG9tZWJyZXctY29yZS90cmVlL21hc3Rlci9G b3JtdWxhIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9Ib21lYnJldy9ob21lYnJldy1jb3JlL3RyZWUv bWFzdGVyL0Zvcm11bGE8L2E+IDwvcD4NCjxwPlRoZSBpbnRlcmVzdGluZyBwYXJ0IGlzIDxjb2Rl Pmluc3RhbGw8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzM2ZDEyNzQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczNmQxMjc0Ij5FeGFt cGxlcyB1c2luZyA8Y29kZT5tYWtlPC9jb2RlPjo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZzM2ZDEyNzQiPg0KPHA+RHVuZTogPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL0hvbWVicmV3L2hvbWVicmV3LWNvcmUvYmxvYi9lZWUyM2MwMTc2ZjEyODE0YTU1 OTdlMTRmMzRkNTdkNTk2YzgyZTg4L0Zvcm11bGEvZHVuZS5yYiI+DQpodHRwczovL2dpdGh1Yi5j b20vSG9tZWJyZXcvaG9tZWJyZXctY29yZS9ibG9iL2VlZTIzYzAxNzZmMTI4MTRhNTU5N2UxNGYz NGQ1N2Q1OTZjODJlODgvRm9ybXVsYS9kdW5lLnJiPC9hPg0KPC9wPg0KPHA+T3BhbTogPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL0hvbWVicmV3L2hvbWVicmV3LWNvcmUvYmxvYi9lZWUyM2Mw MTc2ZjEyODE0YTU1OTdlMTRmMzRkNTdkNTk2YzgyZTg4L0Zvcm11bGEvb3BhbS5yYiI+DQpodHRw czovL2dpdGh1Yi5jb20vSG9tZWJyZXcvaG9tZWJyZXctY29yZS9ibG9iL2VlZTIzYzAxNzZmMTI4 MTRhNTU5N2UxNGYzNGQ1N2Q1OTZjODJlODgvRm9ybXVsYS9vcGFtLnJiPC9hPg0KPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2FkNjk1MWQiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhZDY5NTFkIj5FeGFtcGxlcyB1c2luZyA8Y29kZT5k dW5lPC9jb2RlPjo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9y Z2FkNjk1MWQiPg0KPHA+Q29xOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vSG9tZWJyZXcv aG9tZWJyZXctY29yZS9ibG9iLzQ5YjYzYmI4NjdiNWQ5NjYzMzFmODFiNGI3MzkyOWIyOTViZTMz YzEvRm9ybXVsYS9jb3EucmIiPg0KaHR0cHM6Ly9naXRodWIuY29tL0hvbWVicmV3L2hvbWVicmV3 LWNvcmUvYmxvYi80OWI2M2JiODY3YjVkOTY2MzMxZjgxYjRiNzM5MjliMjk1YmUzM2MxL0Zvcm11 bGEvY29xLnJiPC9hPg0KPC9wPg0KPHA+TWVuaGlyOiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vSG9tZWJyZXcvaG9tZWJyZXctY29yZS9ibG9iLzQ5YjYzYmI4NjdiNWQ5NjYzMzFmODFiNGI3 MzkyOWIyOTViZTMzYzEvRm9ybXVsYS9tZW5oaXIucmIiPg0KaHR0cHM6Ly9naXRodWIuY29tL0hv bWVicmV3L2hvbWVicmV3LWNvcmUvYmxvYi80OWI2M2JiODY3YjVkOTY2MzMxZjgxYjRiNzM5Mjli Mjk1YmUzM2MxL0Zvcm11bGEvbWVuaGlyLnJiPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzA4MGVhY2IiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmcwODBlYWNiIj5FeGFtcGxlcyB1c2luZyBPcGFtIGFuZCBzb21ldGhpbmcgZWxz ZTo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzA4MGVhY2Ii Pg0KPHA+U2VtZ3JlcCAoT3BhbSAmYW1wOyBQeXRob24pOiA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vSG9tZWJyZXcvaG9tZWJyZXctY29yZS9ibG9iLzQ5YjYzYmI4NjdiNWQ5NjYzMzFmODFi NGI3MzkyOWIyOTViZTMzYzEvRm9ybXVsYS9zZW1ncmVwLnJiIj4NCmh0dHBzOi8vZ2l0aHViLmNv bS9Ib21lYnJldy9ob21lYnJldy1jb3JlL2Jsb2IvNDliNjNiYjg2N2I1ZDk2NjMzMWY4MWI0Yjcz OTI5YjI5NWJlMzNjMS9Gb3JtdWxhL3NlbWdyZXAucmI8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjRhZDE5MCIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzY0YWQxOTAiPlJlZmVyZW5jZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNjRhZDE5MCI+DQo8cD5Ib21lYnJld+KAmXMgRm9ybXVs YSByZWZlcmVuY2U6IDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5icmV3LnNoL0Zvcm11bGEtQ29va2Jv b2siPg0KaHR0cHM6Ly9kb2NzLmJyZXcuc2gvRm9ybXVsYS1Db29rYm9vazwvYT4gPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0y IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+djAuMTYgcmVsZWFzZSBvZiBKYW5lIFN0 cmVldCBwYWNrYWdlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXYwLTE2LXJlbGVhc2Utb2YtamFuZS1zdHJlZXQtcGFja2FnZXMvMTIzOTgvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXYwLTE2LXJlbGVhc2Utb2YtamFuZS1zdHJlZXQtcGFj a2FnZXMvMTIzOTgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnM2JiYjgyNSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzNiYmI4MjUiPkRp YW5hIEthbGluaWNoZW5rbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzNiYmI4MjUiPg0KPHA+RGVhciBPQ2FtbCBkZXZlbG9wZXJzLCA8L3A+ DQo8cD5XZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgdjAuMTYgcmVsZWFzZSBvZiBKYW5l IFN0cmVldCBwYWNrYWdlcyEgPC9wPg0KPHA+VGhpcyByZWxlYXNlIGNvbWVzIHdpdGggMzQgbmV3 IHBhY2thZ2VzIGFuZCBhIHBsZXRob3JhIG9mIG5ldyBmZWF0dXJlcywgZml4ZXMsIGFuZCBlbmhh bmNlbWVudHMuDQo8L3A+DQo8cD5UaGUgcmVtYWluZGVyIG9mIHRoaXMgcG9zdCBoaWdobGlnaHRz IHRoZSBtYWluIGNoYW5nZXMgc2luY2UgdGhlIHYwLjE1IHJlbGVhc2UuDQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2U0OGU5NjYiIGNsYXNzPSJvdXRsaW5lLTQi Pg0KPGg0IGlkPSJvcmdlNDhlOTY2Ij5SZWxlYXNlLXdpZGUgY2hhbmdlczwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZTQ4ZTk2NiI+PC9kaXY+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2JhMGY4MjQiPjwvYT5Td2l0Y2ggdG8gT0NhbWwg NC4xNDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdiYTBmODI0 Ij4NCjxwPldlIGFyZSBzd2l0Y2hpbmcgQmFzZSBhbmQgYWxsIG91ciBwYWNrYWdlcywgZXhjZXB0 IHNleHBsaWIwLCB0byBPQ2FtbCA0LjE0IGFuZCBhYm92ZS4NCjwvcD4NCjxwPlByZXZpb3VzbHks IEJhc2Ugc3VwcG9ydGVkIHRoZSBmb3VyIGxhdGVzdCBPQ2FtbCB2ZXJzaW9ucy4gVGhlIHByaW1l IHJlYXNvbiBmb3IgaXQgd2FzIHRvIGVuc3VyZSB0aGF0IGEgc2luZ2xlIHBweGxpYiByZWxlYXNl IHdvdWxkIHdvcmsgYWNyb3NzIG11bHRpcGxlIGNvbXBpbGVycy4gSG93ZXZlciwgcHB4bGliIG5v dyBkZXBlbmRzIHNvbGVseSBvbiBzZXhwbGliMCwgbm90IEJhc2UuDQo8L3A+DQo8cD5NZWFud2hp bGUsIHdlIGFyZSBtYWtpbmcgYSBjb25zaWRlcmFibGUgZWZmb3J0IHRvIGludGVncmF0ZSB0aGUg bGF0ZXN0IE9DYW1sIGZlYXR1cmVzLiBXZeKAmXZlIGFscmVhZHkgYWRkZWQgZmVhdHVyZXMgbGlr ZSB0aGUNCjxjb2RlPkluX2NoYW5uZWw8L2NvZGU+IG1vZHVsZSBmcm9tIHRoZSA0LjE0IHN0YW5k YXJkIGxpYnJhcnkgdG8gQmFzZSwgYW5kIHdl4oCZcmUgd29ya2luZyBvbiBzd2l0Y2hpbmcgdG8g dGhlIDUuMCBjb21waWxlciBpbnRlcm5hbGx5Lg0KPC9wPg0KPHA+QXMgYSByZXN1bHQsIHdlIGRl Y2lkZWQgdG8gcmVtb3ZlIHRoZSBzdHJpY3QgcmVxdWlyZW1lbnQgZm9yIEJhc2XigJlzIGJhY2t3 YXJkIGNvbXBhdGliaWxpdHkuIEluc3RlYWQsIHdlIGhvcGUgdG8gcHJvdmlkZSBhIG1vcmUgY29t cHJlaGVuc2l2ZSBTdGRsaWIgcmVwbGFjZW1lbnQgYW5kIGJldHRlciB0ZXN0aW5nIGZvciByZWNl bnQgY29tcGlsZXIgdmVyc2lvbnMuIFdlIHBsYW4gdG8gZXZlbnR1YWxseSBhZGQgc3VwcG9ydCBm b3IgT0NhbWwgNQ0KIHByaW1pdGl2ZXMgaW4gQmFzZSwgc3RhcnRpbmcgd2l0aCByZWxlYXNlcyB2 MC4xNyBvciB2MC4xOC4gPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnMjVjODRhOCI+ PC9hPjMyLWJpdCBwbGF0Zm9ybSBzdXBwb3J0PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTUiIGlkPSJ0ZXh0LW9yZzI1Yzg0YTgiPg0KPHA+QXMgc3RhdGVkIDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9qYW5lLXN0cmVldC1wYWNrYWdlcy1kcm9wcGluZy1zdXBwb3J0 LWZvci0zMi1iaXQvODYyMSI+DQpwcmV2aW91c2x5PC9hPiwgd2UgYXJlIG5vIGxvbmdlciB0ZXN0 aW5nIG9uIDMyLWJpdCBwbGF0Zm9ybXMuIFRoYXQgc2FpZCwgd2UgZXhwZWN0IHRoYXQgb3VyIHBh Y2thZ2VzIHdpbGwgbW9zdGx5IGNvbnRpbnVlIHRvIGZ1bmN0aW9uIG9uIDMyLWJpdCwgYW5kIHdl IHN0cml2ZSB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5LiBJbiBwYXJ0aWN1bGFyLCB3ZSB3aWxs IGtlZXAgcmVzcG9uZGluZyB0byBidWcgcmVwb3J0cyBhbmQgYWNjZXB0aW5nIDMyLWJpdA0KIGNv bXBhdGliaWxpdHkgcGF0Y2hlcy4gV2XigJlyZSBhbHNvIGhvcGluZyB0aGF0IFRhcmlkZXPigJkg d29yayBpbiB0aGlzIGFyZWEgd2lsbCBpbXByb3ZlIHRoZSB0ZXN0aW5nIG9mIG91ciBwYWNrYWdl cyBhY3Jvc3MgbWFueSBwbGF0Zm9ybXMsIGluY2x1ZGluZyAzMi1iaXQgYnl0ZWNvZGUuDQo8L3A+ DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc1NWIwNWI2Ij48L2E+RGVwcmVjYXRpb24gb2Yg PGNvZGU+Q2FtbDwvY29kZT4gaW4gZmF2b3Igb2YgPGNvZGU+U3RkbGliPC9jb2RlPjxicj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc1NWIwNWI2Ij4NCjxwPldlIGFy ZSBkZXByZWNhdGluZyBvdXIgPGNvZGU+Q2FtbDwvY29kZT4gYWxpYXMgZm9yIHRoZSBPQ2FtbCBz dGFuZGFyZCBsaWJyYXJ5LCBpbiBmYXZvciBvZiB1c2luZyB0aGUgZGVmYXVsdCBtb2R1bGUsDQo8 Y29kZT5TdGRsaWI8L2NvZGU+LiBUaGlzIGFsbG93cyB3cml0aW5nIGNvZGUgdGhhdCByZWZlcmVu Y2VzIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBCYXNlIGlzIG9w ZW5lZCBvciBub3QuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdiNTY2OGMzIj48 L2E+TG9jYWwgYWxsb2NhdGlvbnM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnYjU2NjhjMyI+DQo8cD5XZeKAmXZlIGluY2x1ZGVkIGFubm90YXRpb25zIGZvciBs b2NhbCBhbGxvY2F0aW9ucyBpbiBvdXIgcHVibGljIHJlbGVhc2UgY29kZTsgaG93ZXZlciwgdGhl c2UgYW5ub3RhdGlvbnMgYXJlIG5vdCByZWNvZ25pemVkIGJ5IHRoZSBzdG9jayBPQ2FtbCBjb21w aWxlci4gTW9yZSBpbmZvcm1hdGlvbiBvbiBsb2NhbCBhbGxvY2F0aW9ucyBjYW4gYmUgZm91bmQg aW4gb3VyIGJsb2cgcG9zdCBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29t L294aWRpemluZy1vY2FtbC1sb2NhbGl0eS8iPmh0dHBzOi8vYmxvZy5qYW5lc3RyZWV0LmNvbS9v eGlkaXppbmctb2NhbWwtbG9jYWxpdHkvPC9hPi4NCjwvcD4NCjxwPkZvciB0aG9zZSBpbnRlcmVz dGVkIGluIGV4cGVyaW1lbnRpbmcgd2l0aCBsb2NhbCBhbGxvY2F0aW9ucywgb3VyIE9DYW1sIGZv cmsgd2l0aCBsb2NhbCBhbGxvY2F0aW9uIHN1cHBvcnQgY2FuIGJlIGZvdW5kDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZmxhbWJkYS9vY2FtbC1qc3QiPmhlcmU8L2E+LiBQbGVh c2UgYmUgYXdhcmUgdGhhdCB0aGlzIGlzIGhpZ2hseSBleHBlcmltZW50YWwgYW5kIG5vdCBndWFy YW50ZWVkIHRvIGZ1bmN0aW9uIG91dHNpZGUgb2YgSmFuZSBTdHJlZXQuDQo8L3A+DQo8L2Rpdj4N CjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjE2M2Uz ZiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzIxNjNlM2YiPkZ1dHVyZSBwbGFuczwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMjE2M2UzZiI+PC9k aXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzU4YmE3NGEiPjwvYT5TaGFk b3dpbmcgPGNvZGU+U3RkbGliPC9jb2RlPjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01 IiBpZD0idGV4dC1vcmc1OGJhNzRhIj4NCjxwPldlIHBsYW4gdG8gc3RvcCBzaGFkb3dpbmcgU3Rk bGliIGluIEJhc2UuIFdlIGFsc28gcGxhbiB0byBhZGQgYSBmbGFnIHRvIER1bmUgdG8gZW5hYmxl DQo8Y29kZT4tbm9wZXJ2YXNpdmVzPC9jb2RlPiBkdXJpbmcgY29tcGlsYXRpb24sIHdoaWNoIHBy ZXZlbnRzIDxjb2RlPlN0ZGxpYjwvY29kZT4gZnJvbSBiZWluZyBvcGVuZWQgYXV0b21hdGljYWxs eS4gVGhlIHByZXZpb3VzIHByYWN0aWNlIG9mIHNoYWRvd2luZyBTdGRsaWIgaW4gQmFzZSBoYXMg Y2F1c2VkIGlzc3VlcywgYW5kIHdlIGhvcGUgdGhpcyBuZXcgYXBwcm9hY2ggd2lsbCBwcm92ZSBt b3JlIHJlc2lsaWVudC4NCjwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzFlNjcyMWQi PjwvYT5PQ2FtbCBleHRlbnNpb25zPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlk PSJ0ZXh0LW9yZzFlNjcyMWQiPg0KPHA+V2UgaW50ZW5kIHRvIGNyZWF0ZSBhbiBleHBlcmltZW50 YWwgT3BhbSByZXBvc2l0b3J5IHdpdGggb3VyIGludGVybmFsIGNvbXBpbGVyIGZvciBhIG1vcmUg c3RyYWlnaHRmb3J3YXJkIHNldHVwLiBUaGlzIHdpbGwgYWxsb3cgdXNlcnMgdG8gZXhwZXJpbWVu dCB3aXRoIG91ciBuZXcgbGFuZ3VhZ2UgZXh0ZW5zaW9ucyBiZWZvcmUgdGhleSBhcmUgaW50ZWdy YXRlZCBpbnRvIG1haW5zdHJlYW0gT0NhbWwuDQo8L3A+DQo8cD5BdCBwcmVzZW50LCB3ZSBjb252 ZXJ0IG91ciBuYXRpdmUgc3ludGF4IGZvciBPQ2FtbCBleHRlbnNpb25zIGludG8gYW5ub3RhdGlv bnMuIEhvd2V2ZXIsIG9uY2Ugd2UgdHJhbnNpdGlvbiB0byB0aGUgZXhwZXJpbWVudGFsIHJlcG8s IHdlIHdpbGwgcmVsZWFzZSB0aGUgdW5tb2RpZmllZCBjb2RlIGZlYXR1cmluZyB0aGUgcHJlZmVy cmVkDQo8Y29kZT5sb2NhbF88L2NvZGU+IHN5bnRheC4gPC9wPg0KPC9kaXY+DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2E5MTZjZDYiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhOTE2Y2Q2Ij5NYW55LCBtYW55IG90aGVyIGNoYW5nZXM8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2E5MTZjZDYiPg0K PHA+U2luY2Ugb3VyIGxhc3QgcmVsZWFzZSwgd2UgaGF2ZSBmb2N1c2VkIG9uIGRlbGl2ZXJpbmcg aW1wcm92ZWQgY2hhbmdlbG9ncyBmb3Igb3VyIHVzZXJzLCBhbmQgd2UgcGxhbiB0byBtYWludGFp biB0aGVzZSBlZmZvcnRzIG1vdmluZyBmb3J3YXJkLiBNb3N0IG9mIG91ciBsaWJyYXJpZXMgbm93 IGluY2x1ZGUgY2hhbmdlbG9nIGZpbGVzIHRoYXQgb3V0bGluZSBjaGFuZ2VzIHNpbmNlIHRoZSB2 MC4xNSByZWxlYXNlLiBCcm93c2UNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3Ry ZWV0Ij5vdXIgR2l0SHViIHJlcG9zaXRvcmllczwvYT4gYW5kIGFjY2VzcyB0aGUgcmVzcGVjdGl2 ZQ0KPGNvZGU+Q0hBTkdFUy5tZDwvY29kZT4gZmlsZXMgZm9yIG1vcmUgaW5mb3JtYXRpb24uIDwv cD4NCjxwPkZvciBleGFtcGxlcywgc2VlIGNoYW5nZWxvZ3MgZm9yIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2UvYmxvYi9tYXN0ZXIvQ0hBTkdFUy5tZCI+DQpCYXNl PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvYXN5bmNfa2VybmVs L2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQiPg0KQXN5bmNfa2VybmVsPC9hPiwgYW5kIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3ZjYW1sL2Jsb2IvbWFzdGVyL0NIQU5HRVMu bWQiPg0KVkNhbWw8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnYTllOGU1MCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2E5ZThl NTAiPk5ldyBwYWNrYWdlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnYTllOGU1MCI+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVl dC9iYXNlX3RyaWUiPmJhc2VfdHJpZTwvYT4g4oCTIHRyaWUgZGF0YSBzdHJ1Y3R1cmUgbGlicmFy eSBmb3IgQmFzZS4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3Ry ZWV0L2JpZGlyZWN0aW9uYWxfbWFwIj5iaWRpcmVjdGlvbmFsX21hcDwvYT4g4oCTIGEgbGlicmFy eSBmb3IgYmlkaXJlY3Rpb25hbCBtYXBzIGFuZCBtdWx0aW1hcHMuDQo8L3A+DQo8cD48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9jb250ZW50X3NlY3VyaXR5X3BvbGljeSI+ Y29udGVudF9zZWN1cml0eV9wb2xpY3k8L2E+IOKAkyBhIGxpYnJhcnkgZm9yIGJ1aWxkaW5nIGNv bnRlbnQtc2VjdXJpdHkgcG9saWNpZXMgZm9yIHRoZSBXZWIuDQo8L3A+DQo8cD48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9jcHVpZCI+Y3B1aWQ8L2E+IOKAkyBhIGxpYnJh cnkgZm9yIHBhcnNpbmcgQ1BVIGNhcGFiaWxpdGllcyBmcm9tIHRoZQ0KPGNvZGU+Y3B1aWQ8L2Nv ZGU+IGluc3RydWN0aW9uLiA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFu ZXN0cmVldC9qYW5lc3RyZWV0X2NzdiI+Y3N2PC9hPiDigJMgdG9vbHMgZm9yIHdvcmtpbmcgd2l0 aCBDU1ZzIG9uIHRoZSBjb21tYW5kIGxpbmUNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9qYW5lc3RyZWV0L2RlZGVudCI+ZGVkZW50PC9hPiDigJMgYSBsaWJyYXJ5IGZvciBp bXByb3ZpbmcgdGhlIHJlYWRhYmlsaXR5IG9mIG11bHRpLWxpbmUgc3RyaW5nIGNvbnN0YW50cyBp biBjb2RlLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQv ZGlmZmFibGUiPmRpZmZhYmxlPC9hPiDigJMgYW4gaW50ZXJmYWNlIGZvciBkaWZmYWJsZSBkYXRh IHN0cnVjdHVyZXMuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0 cmVldC9lbnZfY29uZmlnIj5lbnZfY29uZmlnPC9hPiDigJMgYSBoZWxwZXIgbGlicmFyeSBmb3Ig cmV0cmlldmluZyBjb25maWd1cmF0aW9uIGZyb20gYW4gZW52aXJvbm1lbnQgdmFyaWFibGUuDQo8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9h eGkiPmhhcmRjYW1sX2F4aTwvYT4g4oCTIEhhcmRjYW1sIEFYSSBpbnRlcmZhY2UgdHlwZXMuDQo8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9j Ij5oYXJkY2FtbF9jPC9hPiDigJMgSGFyZGNhbWwgQyBzaW11bGF0aW9uIGJhY2tlbmQuDQo8L3A+ DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9oYXJkY2FtbF9oYW5k c2hha2UiPmhhcmRjYW1sX2hhbmRzaGFrZTwvYT4g4oCTIEhhcmRjYW1sIGhhbmRzaGFrZSBjb21w b25lbnQuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9p bmRlbnRhdGlvbl9idWZmZXIiPmluZGVudGF0aW9uX2J1ZmZlcjwvYT4g4oCTIGEgbGlicmFyeSBm b3IgYnVpbGRpbmcgc3RyaW5ncyB3aXRoIGluZGVudGF0aW9uLg0KPC9wPg0KPHA+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvamFuZV9yb3BlIj5qYW5lX3JvcGU8L2E+IOKA kyBzdHJpbmcgcmVwcmVzZW50YXRpb24gd2l0aCBjaGVhcCBjb25jYXRlbmF0aW9uLg0KPC9wPg0K PHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvanNfb2Zfb2NhbWxfcGF0 Y2hlcyI+anNfb2Zfb2NhbWxfcGF0Y2hlczwvYT4g4oCTIGFkZGl0aW9ucyB0byBqc19vZl9vY2Ft bOKAmXMgc3RhbmRhcmQgbGlicmFyeSB0aGF0IGFyZSByZXF1aXJlZCBieSBKYW5lIFN0cmVldCBs aWJyYXJpZXMuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVl dC9scnVfY2FjaGUiPmxydV9jYWNoZTwvYT4g4oCTIGFuIExSVSBDYWNoZSBpbXBsZW1lbnRhdGlv biBmb3IgQ29yZS4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3Ry ZWV0L21hbl9pbl90aGVfbWlkZGxlX2RlYnVnZ2VyIj5tYW5faW5fdGhlX21pZGRsZV9kZWJ1Z2dl cjwvYT4g4oCTIGEgbWFuLWluLXRoZS1taWRkbGUgZGVidWdnaW5nIGxpYnJhcnkgZm9yIEFzeW5j IHJlYWRlcnMgYW5kIHdyaXRlcnMuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vamFuZXN0cmVldC9uX2FyeSI+bl9hcnk8L2E+IOKAkyBhIGxpYnJhcnkgZm9yIE4tYXJ5IGRh dGF0eXBlcyBhbmQgb3BlcmF0aW9ucywgZ2VuZXJhbGl6aW5nIGVudW1lcmF0aW9ucywgdmFyaWFu dHMsIHR1cGxlcywgYW5kIGxpc3RzLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL2phbmVzdHJlZXQvbnVtZXJpY19zdHJpbmciPm51bWVyaWNfc3RyaW5nPC9hPiDigJMgYSBj b21wYXJpc29uIGZ1bmN0aW9uIHRoYXQgc29ydHMgbnVtZXJpYyBmcmFnbWVudHMgb2Ygc3RyaW5n cyBhY2NvcmRpbmcgdG8gdGhlaXIgbnVtZXJpYyB2YWx1ZS4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L29mX2pzb24iPm9mX2pzb248L2E+IOKAkyBhIGZy aWVuZGx5IGFwcGxpY2F0aXZlIGludGVyZmFjZSBmb3IgSnNvbmFmLg0KPC9wPg0KPHA+PGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvb3JkaW5hbF9hYmJyZXZpYXRpb24iPm9y ZGluYWxfYWJicmV2aWF0aW9uPC9hPiDigJMgYSBtaW5pbWFsIGxpYnJhcnkgZm9yIGdlbmVyYXRp bmcgb3JkaW5hbCBuYW1lcyBvZiBpbnRlZ2Vycy4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9qYW5lc3RyZWV0L3BvbGxpbmdfc3RhdGVfcnBjIj5wb2xsaW5nX3N0YXRlX3Jw YzwvYT4g4oCTIGFuIFJQQyB3aGljaCB0cmFja3MgdGhlIHN0YXRlIG9uIHRoZSBjbGllbnQgYW5k IHNlcnZlciBzbyBpdCBvbmx5IG5lZWRzIHRvIHNlbmQgZGlmZnMgYWNyb3NzIHRoZSB3aXJlLg0K PC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X2RlbW8i PnBweF9kZW1vPC9hPiDigJMgYSBQUFggdGhhdCBleHBvc2VzIHRoZSBzb3VyY2UgY29kZSBzdHJp bmcgb2YgYW4gZXhwcmVzc2lvbi9tb2R1bGUgc3RydWN0dXJlLg0KPC9wPg0KPHA+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X2Rlcml2ZV9hdF9ydW50aW1lIj5wcHhf ZGVyaXZlX2F0X3J1bnRpbWU8L2E+IOKAkyBkZWZpbmluZyBhIG5ldyBQUFggZGVyaXZlciBieSBu YW1pbmcgYSBydW50aW1lIG1vZHVsZS4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9qYW5lc3RyZWV0L3BweF9nbG9iYWxpemUiPnBweF9nbG9iYWxpemU8L2E+IOKAkyBhIFBQ WCByZXdyaXRlciB0aGF0IGdlbmVyYXRlcyBmdW5jdGlvbnMgdG8gY29weSBsb2NhbCB2YWx1ZXMg dG8gdGhlIGdsb2JhbCBoZWFwLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2phbmVzdHJlZXQvcHB4X3NleHBfY29udiI+cHB4X3NleHBfY29udjwvYT4g4oCTIGdlbmVyYXRp b24gb2YgUy1leHByZXNzaW9uIGNvbnZlcnNpb24gZnVuY3Rpb25zIGZyb20gdHlwZSBkZWZpbml0 aW9ucy4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3Bw eF9zdGFibGVfd2l0bmVzcyI+cHB4X3N0YWJsZV93aXRuZXNzPC9hPiDigJMgYSBQUFggZXh0ZW5z aW9uIGZvciBkZXJpdmluZyBhIHdpdG5lc3MgdGhhdCBhIHR5cGUgaXMgaW50ZW5kZWQgdG8gYmUg c3RhYmxlLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQv cHB4X3R5ZGkiPnBweF90eWRpPC9hPiDigJMgbGV0IGV4cHJlc3Npb25zIGluZmVycmluZyBwYXR0 ZXJuIHR5cGUgZnJvbSBleHByZXNzaW9uLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvcmVnZXhfcGFyc2VyX2ludGYiPnJlZ2V4X3BhcnNlcl9pbnRmPC9h PiDigJMgaW50ZXJmYWNlIHNoYXJlZCBieQ0KPGNvZGU+UmVfcGFyc2VyPC9jb2RlPiBhbmQgPGNv ZGU+UmUyLlBhcnNlcjwvY29kZT4gPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2phbmVzdHJlZXQvcmVfcGFyc2VyIj5yZV9wYXJzZXI8L2E+IOKAkyB0eXBlZCBwYXJzaW5nIHVz aW5nIHJlZ3VsYXIgZXhwcmVzc2lvbnMuDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vamFuZXN0cmVldC9zZW1hbnRpY192ZXJzaW9uIj5zZW1hbnRpY192ZXJzaW9uPC9hPiDi gJMgc2VtYW50aWMgdmVyc2lvbmluZyBkYXRhIHN0cnVjdHVyZS4NCjwvcD4NCjxwPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3N0b3JlZF9yZXZlcnNlZCI+c3RvcmVkX3Jl dmVyc2VkPC9hPiDigJMgYSBsaWJyYXJ5IGZvciByZXByZXNlbnRpbmcgYSBsaXN0IHRlbXBvcmFy aWx5IHN0b3JlZCBpbiByZXZlcnNlIG9yZGVyLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2phbmVzdHJlZXQvc3RyZWFtYWJsZSI+c3RyZWFtYWJsZTwvYT4g4oCTIGEgY29s bGVjdGlvbiBvZiB0eXBlcyBzdWl0YWJsZSBmb3IgaW5jcmVtZW50YWwgc2VyaWFsaXphdGlvbi4N CjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3RpbGRlX2Yi PnRpbGRlX2Y8L2E+IOKAkyBwcm92aWRlcyBhIGxldC1zeW50YXggZm9yIGNvbnRpbnVhdGlvbi1w YXNzaW5nIHN0eWxlLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVz dHJlZXQvdG9yY2giPnRvcmNoPC9hPiDigJMgd2UgYXJlIHRha2luZyBvdmVyIHRoZSBkZXZlbG9w bWVudCBvZiBvY2FtbC10b3JjaCBmcm9tIExhdXJlbnQgTWF6YXJlLiBNYW55IHRoYW5rcyB0byBo aW0gZm9yIGhpcyBvcmlnaW5hbCB3b3JrIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMyI+TmV3IHJlbGVhc2Ugb2YgTWVuaGlyICgyMDIzMDYwOCk8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctcmVsZWFzZS1vZi1tZW5oaXItMjAy MzA2MDgvMTIzOTkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxl YXNlLW9mLW1lbmhpci0yMDIzMDYwOC8xMjM5OS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2FjYWY5ZWIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmdhY2FmOWViIj5GcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2FjYWY5ZWIiPg0KPHA+RGVhciB1c2VycyBv ZiBNZW5oaXIsIDwvcD4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBv ZiBNZW5oaXIsIHdpdGggc2V2ZXJhbCBtaW5vciBjaGFuZ2VzIGFuZCBidWcgZml4ZXMsIGxpc3Rl ZCBiZWxvdy4NCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdkYTBlZTVlIj4NCiAg b3BhbSB1cGRhdGUNCiAgb3BhbSB1cGdyYWRlIG1lbmhpcg0KPC9wcmU+DQo8cD5IYXBweSBwYXJz aW5nLCBGcmFuw6dvaXMgUG90dGllciBmcmFuY29pcy5wb3R0aWVyQGlucmlhLmZyIDxhIGhyZWY9 Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci8iPg0KaHR0cDovL2NhbWJpdW0uaW5y aWEuZnIvfmZwb3R0aWVyLzwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdlMTA0ZWEyIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZTEwNGVhMiI+ MjAyMy8wNi8wODwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn ZTEwNGVhMiI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIG5ldyBjb21tYW5kIGxpbmUg c3dpdGNoIDxjb2RlPi0tZHVtcC1tZW5oaXJMaWIgJmx0O2RpcmVjdG9yeSZndDs8L2NvZGU+IGNh dXNlcyB0aGUgc291cmNlIGZpbGVzDQo8Y29kZT5tZW5oaXJMaWIubWw8L2NvZGU+IGFuZCA8Y29k ZT5tZW5oaXJMaWIubWxpPC9jb2RlPiB0byBiZSBjcmVhdGVkIGluIHRoZSBkZXNpZ25hdGVkIGRp cmVjdG9yeS4gVGhpcyBjb21tYW5kIGNhbiBiZSB1c2VmdWwgdG8gdXNlcnMgd2l0aCBzcGVjaWFs IG5lZWRzIHdobyB3aXNoIHRvIHVzZQ0KPGNvZGU+bWVuaGlyTGliPC9jb2RlPiBidXQgZG8gbm90 IHdhbnQgdG8gcmVseSBvbiBpdCBiZWluZyBpbnN0YWxsZWQgc29tZXdoZXJlIGluIHRoZSBmaWxl IHN5c3RlbS4gKENvbnRyaWJ1dGVkIGJ5IE5pY29sw6FzIE9qZWRhIELDpHIuKQ0KPC9saT48bGk+ Q2hhbmdlcyBpbiB0aGUgcHVibGljIEFQSSBvZiB0aGUgbGlicmFyeSA8Y29kZT5NZW5oaXJTZGs8 L2NvZGU+LiAoQ29udHJpYnV0ZWQgYnkgRnLDqWTDqXJpYyBCb3VyLikNCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5UaGUgZnVuY3Rpb24gPGNvZGU+THIxLnJlZHVjdGlvbnM8L2NvZGU+LCB3aG9z ZSB0eXBlIGlzIDxjb2RlPnQgLSZndDsgKHRlcm1pbmFsICogcHJvZHVjdGlvbiBsaXN0KSBsaXN0 PC9jb2RlPiwgaXMgc3RpbGwgcHJlc2VudCBidXQgaXMgbm93IGRlcHJlY2F0ZWQuIFRoZSBmdW5j dGlvbg0KPGNvZGU+THIxLmdldF9yZWR1Y3Rpb25zPC9jb2RlPiwgd2hvc2UgdHlwZSBpcyA8Y29k ZT50IC0mZ3Q7ICh0ZXJtaW5hbCAqIHByb2R1Y3Rpb24pIGxpc3Q8L2NvZGU+LCBzaG91bGQgYmUg dXNlZCBpbnN0ZWFkLiBUaGUgbGlicmFyeSBvZmZlcnMgYSB2aWV3IG9mIHRoZSBhdXRvbWF0b24g YWZ0ZXIgY29uZmxpY3QgcmVzb2x1dGlvbiwgc28sIGZvciBlYWNoIHRva2VuLCBhdCBtb3N0IG9u ZSBwcm9kdWN0aW9uIGNhbiBiZSByZWR1Y2VkLg0KPC9saT48bGk+VGhlIGZ1bmN0aW9uIDxjb2Rl PkxyMS5kZWZhdWx0X3JlZHVjdGlvbiA6IExyMS50IC0mZ3Q7IHByb2R1Y3Rpb24gb3B0aW9uPC9j b2RlPiBhcHBlYXJzLiBUaGlzIGZ1bmN0aW9uIGluZGljYXRlcyB3aGljaCBzdGF0ZXMgaGF2ZSBh IGRlZmF1bHQgcmVkdWN0aW9uLg0KPC9saT48bGk+VGhlIGZ1bmN0aW9uIDxjb2RlPkNtbHlfcmVh ZC5yZWFkX2NoYW5uZWw8L2NvZGU+IGFwcGVhcnMuIDwvbGk+PGxpPlRoZSBtb2R1bGUgPGNvZGU+ Q21seV9yZWFkLkxpZnQ8L2NvZGU+IGFwcGVhcnMuIDwvbGk+PC91bD4NCjwvbGk+PGxpPlRoZSBu ZXcgZXhwZXJpbWVudGFsIGZsYWcgPGNvZGU+LS1zcGVjaWFsaXplLXRva2VuPC9jb2RlPiBjYXVz ZXMgdGhlIGNvZGUgYmFjay1lbmQgdG8gcGVyZm9ybSBjb2RlIHNwZWNpYWxpemF0aW9uIHNvIGFz IHRvIGd1YXJhbnRlZSB0aGF0IGVhY2ggdG9rZW4gaXMgZXhhbWluZWQgZXhhY3RseSBvbmNlICh0 aHVzIG5ldmVyIG1vcmUgdGhhbiBvbmNlKSBieSB0aGUgcGFyc2VyLiBUaGlzIGNhdXNlcyBhbiBp bmNyZWFzZSBpbiBjb2RlIHNpemUNCiBhbmQgZG9lcyBub3QgKHlldCkgYWxsb3cgYSBwZXJmb3Jt YW5jZSBpbmNyZWFzZS4gVGhpcyBmZWF0dXJlIGlzIGluZGVwZW5kZW50IG9mIHRoZSBjaG9pY2Ug YmV0d2Vlbg0KPGNvZGU+LU8gMDwvY29kZT4sIDxjb2RlPi1PIDE8L2NvZGU+IGFuZCA8Y29kZT4t TyAyPC9jb2RlPi4gSXQgbWF5IGRpc2FwcGVhciBpbiB0aGUgZnV0dXJlLg0KPC9saT48bGk+SW5j b25zaXN0ZW50IHR5cGUgZGVmaW5pdGlvbnMgdXNlZCB0byBiZSBwcm9kdWNlZCB3aGVuIDxjb2Rl Pi0tb25seS10b2tlbnM8L2NvZGU+IGFuZA0KPGNvZGU+LS1pbnNwZWN0aW9uPC9jb2RlPiB3ZXJl IHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGUgdHlwZSA8Y29kZT50ZXJtaW5hbDwvY29k ZT4gd2FzIGRlZmluZWQgYXQgdGhlIHRvcGxldmVsLCB3aGVyZWFzIGl0IHNob3VsZCBhbHdheXMg YmUgZGVmaW5lZCBpbnNpZGUgdGhlIHN1Ym1vZHVsZQ0KPGNvZGU+TWVuaGlySW50ZXJwcmV0ZXI8 L2NvZGU+LiAoUmVwb3J0ZWQgYW5kIGZpeGVkIGJ5IEZyw6lkw6lyaWMgQm91ci4pIDwvbGk+PGxp Pk1hbGZvcm1lZCBjb2RlIGFuZCB0eXBlIGRlZmluaXRpb25zIHVzZWQgdG8gYmUgcHJvZHVjZWQg d2hlbiA8Y29kZT4tLWV4dGVybmFsLXRva2VuczwvY29kZT4gYW5kDQo8Y29kZT4tLWluc3BlY3Rp b248L2NvZGU+IHdlcmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuIEZpeGVkLiAoUmVwb3J0 ZWQgYnkgTWF4aW1lIETDqW7DqHMuKQ0KPC9saT48bGk+RW5hYmxlIE9DYW1sIHdhcm5pbmcgMzkg KHVudXNlZCByZWMgZmxhZykgaW4gdGhlIE9DYW1sIGNvZGUgcHJvZHVjZWQgYnkgTWVuaGly4oCZ cyBjb2RlIGJhY2stZW5kLiBNZW5oaXIgbm93IGNhcmVmdWxseSBlbWl0cw0KPGNvZGU+bGV0PC9j b2RlPiBpbnN0ZWFkIG9mIDxjb2RlPmxldCByZWM8L2NvZGU+IHdoZW4gYSBmdW5jdGlvbiBpcyBu b3QgcmVjdXJzaXZlLg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iNCI+RHJlYW0taHRtbCAtIERTTCB0byBidWlsZCBIVE1MLCBpbnRlZ3JhdGVkIHdpdGggRHJl YW08L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1s LWRzbC10by1idWlsZC1odG1sLWludGVncmF0ZWQtd2l0aC1kcmVhbS8xMjAzMi8zIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC1kc2wtdG8tYnVpbGQtaHRtbC1p bnRlZ3JhdGVkLXdpdGgtZHJlYW0vMTIwMzIvMzwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnNmJkNTFjNCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzZiZDUxYzQiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFlhd2FyIEFtaW4gYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2YmQ1MWM0Ij4N CjxwPkp1c3QgYW4gdXBkYXRlIHRoYXQgdGhpcyBpcyBub3cgaW4gb3BhbSByZXBvc2l0b3J5OiA8 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL2RyZWFtLWh0bWwvbGF0ZXN0Ij4NCmh0dHBzOi8v b2NhbWwub3JnL3AvZHJlYW0taHRtbC9sYXRlc3Q8L2E+IDwvcD4NCjxwPlJlcG86IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS95YXdhcmFtaW4vZHJlYW0taHRtbCI+aHR0cHM6Ly9naXRodWIu Y29tL3lhd2FyYW1pbi9kcmVhbS1odG1sPC9hPg0KPC9wPg0KPHA+RG9jczogPGEgaHJlZj0iaHR0 cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJlYW0taHRtbC9EcmVhbV9odG1s L2luZGV4Lmh0bWwiPg0KaHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJl YW0taHRtbC9EcmVhbV9odG1sL2luZGV4Lmh0bWw8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSI1Ij5yZWxlYXNlIG9mIG1pbmlzYXQgMC41PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1taW5pc2F0LTAtNS8xMjMzNi82Ij4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1taW5pc2F0LTAtNS8xMjMz Ni82PC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzBmMzQ5 YTEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwZjM0OWExIj5TaW1vbiBDcnVhbmVz IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn MGYzNDlhMSI+DQo8cD5JdCBkaWRu4oCZdCB0YWtlIGxvbmcsIGJ1dCBoZXJl4oCZcyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjM5MjIiPg0K bWluaXNhdCAwLjY8L2E+IHdoaWNoIGFjdHVhbGx5IHN3aXRjaGVzIHRvIHRoZSBDJiM0MzsmIzQz OyBtaW5pc2F0IGZyb20gdGhlIEMgbWluaXNhdCB0aGF0IHdhcyB1c2VkIHNvIGZhci4gVGhhdCBt ZWFucyBuZXcgZnVuY3Rpb25zIHN1Y2ggYXMNCjxjb2RlPnVuc2F0X2NvcmU8L2NvZGU+IGFyZSBu b3cgYXZhaWxhYmxlISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+V2hpY2ggZmls dGVycyB3b3VsZCB5b3UgbGlrZSB0byBzZWUgb24gdGhlIE9DYW1sIGJsb2cgYXQgT0NhbWwub3Jn PzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2hpY2gtZmlsdGVycy13 b3VsZC15b3UtbGlrZS10by1zZWUtb24tdGhlLW9jYW1sLWJsb2ctYXQtb2NhbWwtb3JnLzEyNDI5 LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3doaWNoLWZpbHRlcnMtd291bGQteW91 LWxpa2UtdG8tc2VlLW9uLXRoZS1vY2FtbC1ibG9nLWF0LW9jYW1sLW9yZy8xMjQyOS8xPC9hPg0K PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3YzM5NDM4IiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnN2MzOTQzOCI+WmluZWIgSmFtYmluIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2MzOTQzOCI+ DQo8cD5EZWFyIE9DYW1sIHVzZXJzLCA8L3A+DQo8cD5JIGFtIGN1cnJlbnRseSB3b3JraW5nIHdp dGggdGhlIE9DYW1sLm9yZyBtYWludGFpbmVycyBvbiBpbXByb3ZpbmcgdGhlIGJsb2cgc2VjdGlv biBvZiB0aGUgT0NhbWwub3JnIHdlYnNpdGUuIFNwZWNpZmljYWxseSwgSSBhbSBhZGRpbmcgZmls dGVycyB0aGF0IGVuYWJsZSB5b3UgdG8gcXVpY2tseSBmaW5kIHJlbGV2YW50IGFydGljbGVzIGZy b20gdGhlIE9DYW1sIGNvbW11bml0eS4NCjwvcD4NCjxwPlRvIG1ha2UgdGhpcyBmZWF0dXJlIHRy dWx5IHVzZWZ1bCwgaXQgaXMgZXNzZW50aWFsIHRoYXQgd2UgYWRkIHJlbGV2YW50IGFuZCB1c2Vm dWwgdGFncyB0byB0aGUgYmxvZyBwb3N0cy4gSSB3b3VsZCBsaWtlIHRvIGhlYXIgeW91ciBmZWVk YmFjayBvbiB3aGljaCBzcGVjaWZpYyB0YWdzIHlvdSB3b3VsZCBsaWtlIHRvIHNlZS4NCjwvcD4N CjxwPllvdXIgb3BpbmlvbiBpcyB2ZXJ5IGltcG9ydGFudCB0byB1cy4gSGVyZSBhcmUgc29tZSBp ZGVhcyBmb3IgcG9zc2libGUgdGFncy9maWx0ZXJzOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPkJ5IGF1dGhvcnMgPC9saT48bGk+SW5kdXN0cnkgdnMgUGVyc29uYWwgYmxvZyAvIGtp bmQgb2YgYmxvZyBzb3VyY2UgPC9saT48bGk+cmVsYXRpbmcgdG8gbGlicmFyaWVzIGFuZCBwYWNr YWdlcyA8L2xpPjwvdWw+DQo8cD7igKYgPC9wPg0KPHA+RmVlbCBmcmVlIHRvIGFkZCB5b3VyIG93 biB0YWcgc3VnZ2VzdGlvbnMgb3IgY29tbWVudCBvbiB0aG9zZSB0aGF0IGhhdmUgYWxyZWFkeSBi ZWVuIHByb3Bvc2VkLiBXaGljaCBmaWx0ZXJzIGFyZSBtb3N0IGltcG9ydGFudCB0byB5b3U/IFlv dXIgZmVlZGJhY2sgd2lsbCBoZWxwIHVzIGltcHJvdmUgdGhlIHNlYXJjaCBleHBlcmllbmNlIGFu ZCBtYWtlIG9jYW1sLm9yZyBtb3JlIHVzZXItZnJpZW5kbHkgZm9yIGV2ZXJ5b25lLg0KPC9wPg0K PHA+VGhhbmsgeW91IGluIGFkdmFuY2UgZm9yIHlvdXIgcGFydGljaXBhdGlvbiBhbmQgY29udHJp YnV0aW9uISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+T0NhbWwgUGxhdGZvcm0g TmV3c2xldHRlciwgTWF5IDIwMjM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXBsYXRmb3JtLW5ld3NsZXR0ZXItbWF5LTIwMjMvMTI0MzEvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci1tYXktMjAyMy8x MjQzMS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Fl YTM2YzciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhZWEzNmM3Ij5UaGliYXV0IE1h dHRpbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZ2FlYTM2YzciPg0KPHA+V2VsY29tZSB0byB0aGUgc2Vjb25kIGlzc3VlIG9mIHRoZSBPQ2Ft bCBQbGF0Zm9ybSBuZXdzbGV0dGVyISA8L3A+DQo8cD5XZeKAmXJlIGV4Y2l0ZWQgdG8gc2hhcmUg dGhlIHdvcmsgd2XigJl2ZSBkb25lIGluIE1heSBvbiBpbXByb3ZpbmcgT0NhbWwgZGV2ZWxvcGVy IGV4cGVyaWVuY2Ugd2l0aCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvcGxh dGZvcm0iPk9DYW1sIFBsYXRmb3JtPC9hPi4gU2ltaWxhciB0byB0aGUgPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXBsYXRmb3JtLW5ld3NsZXR0ZXItYXByaWwtMjAy My8xMjE4NyI+DQpwcmV2aW91cyB1cGRhdGU8L2E+LCB0aGlzIGlzc3VlIGlzIHN0cnVjdHVyZWQg YXJvdW5kIHRoZSBkZXZlbG9wbWVudCB3b3JrZmxvdyB3ZeKAmXJlIGN1cnJlbnRseSBleHBsb3Jp bmcgb3IgaW1wcm92aW5nLg0KPC9wPg0KPHA+VGhlIGhpZ2hsaWdodCBvZiB0aGlzIG1vbnRoIGlz IHRoZSBwdWJsaWNhdGlvbiBvZiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Etcm9hZG1hcC1mb3ItdGhlLW9jYW1sLXBsYXRmb3JtLXNlZWtpbmcteW91ci1mZWVkYmFj ay8xMjIzOCI+DQp3b3JrLWluLXByb2dyZXNzIHJvYWRtYXAgZm9yIHRoZSBPQ2FtbCBQbGF0Zm9y bTwvYT4uIFdlIHB1Ymxpc2hlZCBpdCB0byBzdGFydCBnYXRoZXJpbmcgY29tbXVuaXR5IGZlZWRi YWNrIG9uIHRoZSBEZXNpZ24gUHJpbmNpcGxlcyBhbmQgUGVyc29uYSBvZiB0aGUgUGxhdGZvcm0u IFRoZSBmZWVkYmFjayB3aWxsIGJlIHVzZWQgdG8gZXN0YWJsaXNoIG91ciBwbGFucyBmb3IgdGhl IG5leHQgdGhyZWUgeWVhcnMuIFdl4oCZdmUgcmVjZWl2ZWQgdG9ucyBvZg0KIHZlcnkgaW5zaWdo dGZ1bCBhbmQgY29uc3RydWN0aXZlIGZlZWRiYWNrIGFscmVhZHksIGFuZCBpbiB0aGUgY29taW5n IHdlZWtzIGFuZCBtb250aHMsIHdl4oCZbGwgcmV2aXNlIHRoZSByb2FkbWFwIGJhc2VkIG9uIHRo YXQgZmVlZGJhY2suIEFzIGEgbmV4dCBzdGVwLCB3ZeKAmWxsIHNoYXJlIHRoZSBmaXJzdCB2ZXJz aW9uIG9mIHRoZSBwcm9wb3NlZCBkZXZlbG9wZXIgd29ya2Zsb3dzLg0KPC9wPg0KPHA+QW5vdGhl ciBpbXBvcnRhbnQgbWlsZXN0b25lIHRoaXMgbW9udGggaXMgdGhlIHJlbGVhc2Ugb2YgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcmVsZWFzZXMvdGFnLzMuOC4wIj4NCkR1 bmUgMy44PC9hPi4gVGhlIHJlbGVhc2UgY29tZXMgd2l0aCBzdXBwb3J0IGZvciBjb21waWxpbmcg T0NhbWwgcHJvamVjdHMgdG8gSmF2YVNjcmlwdCB1c2luZyBNZWxhbmdlLCB3aGljaCBoYXMgc2Vl biBpdHMNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWVsYW5nZS0x LTAtY29tcGlsZS1vY2FtbC1yZWFzb25tbC10by1qYXZhc2NyaXB0LzEyMzA1Ij4NCmZpcnN0IHN0 YWJsZSByZWxlYXNlPC9hPiB0aGlzIG1vbnRoISBJdCBhbHNvIGNvbnRhaW5zIHNldmVyYWwgaW1w b3J0YW50IGZlYXR1cmVzIGFuZCBpbXByb3ZlbWVudHMgdGhhdCBoYXZlIGJlZW4gaW4gdGhlIHdv cmsgZm9yIHNvbWUgdGltZSwgbGlrZSB0aGUgbmV3DQo8Y29kZT5jb25jdXJyZW50PC9jb2RlPiBh Y3Rpb24gYW5kIHRoZSBjb21wb3NpdGlvbiBvZiBDb3EgcnVsZXMuIDwvcD4NCjxwPkFzIGEgbGFz dCBoaWdobGlnaHQsIHRoZSBmaXJzdCBhbHBoYSBvZiBvcGFtIDIuMiBpcyBnZXR0aW5nIHZlcnkg Y2xvc2UuIFRoZXJlIHdlcmUgc29tZSB1bmV4cGVjdGVkIGlzc3VlcyB3aGlsZSBwcmVwYXJpbmcg dGhlIHJlbGVhc2UgdGhpcyBtb250aCwgYnV0IHRoZSBvcGFtIHRlYW0gaXMgc3RpbGwgYWltaW5n IGZvciBhIHJlbGVhc2UgaW4gSnVuZS4NCjwvcD4NCjxwPlRoZXJl4oCZcyBhIGxvdCBvZiBvdGhl ciB2ZXJ5IGV4Y2l0aW5nIHdvcmsgdG8gdGFsayBhYm91dCwgc28gbGV04oCZcyBkZWx2ZSBpbnRv IGl0IQ0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkJ1aWxkaW5nIFBhY2thZ2VzDQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+RHVuZTwvYj4gRXhwbG9yaW5nIFBhY2thZ2UgTWFu YWdlbWVudCBpbiBEdW5lIDwvbGk+PGxpPjxiPm9wYW08L2I+IE5hdGl2ZSBTdXBwb3J0IGZvciBX aW5kb3dzIGluIG9wYW0gMi4yIDwvbGk+PGxpPjxiPkR1bmU8L2I+IEltcHJvdmluZyBEdW5l4oCZ cyBEb2N1bWVudGF0aW9uIDwvbGk+PGxpPjxiPkR1bmU8L2I+IENvbXBvc2luZyBpbnN0YWxsZWQg Q29xIHRoZW9yaWVzIDwvbGk+PGxpPjxiPkR1bmU8L2I+IFJ1bm5pbmcgQWN0aW9ucyBDb25jdXJy ZW50bHkgPC9saT48bGk+PGI+RHVuZTwvYj4gQmVuY2htYXJraW5nIER1bmUgb24gTGFyZ2UgQ29k ZSBCYXNlcyA8L2xpPjwvdWw+DQo8L2xpPjxsaT5Db21waWxpbmcgdG8gSmF2YVNjcmlwdA0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPkR1bmU8L2I+IENvbXBpbGUgdG8gSmF2YVNjcmlwdCB3 aXRoIE1lbGFuZ2UgaW4gRHVuZSA8L2xpPjwvdWw+DQo8L2xpPjxsaT5HZW5lcmF0aW5nIERvY3Vt ZW50YXRpb24NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5PZG9jPC9iPiBBZGQgU2VhcmNo IENhcGFiaWxpdGllcyB0byA8Y29kZT5vZG9jPC9jb2RlPiA8L2xpPjxsaT48Yj5PZG9jPC9iPiBT dXBwb3J0IGZvciBUYWJsZXMgaW4gPGNvZGU+b2RvYzwvY29kZT4gPC9saT48L3VsPg0KPC9saT48 bGk+RWRpdGluZyBhbmQgUmVmYWN0b3JpbmcgQ29kZQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp Pk1lcmxpbiogU3VwcG9ydCBmb3IgUHJvamVjdC1XaWRlIFJlZmVyZW5jZXMgaW4gTWVybGluIDwv bGk+PGxpPk1lcmxpbiogSW1wcm92aW5nIE1lcmxpbuKAmXMgUGVyZm9ybWFuY2UgPC9saT48bGk+ T0NhbWwgTFNQKiBVc2luZyBEdW5lIFJQQyBvbiBXaW5kb3dzIDwvbGk+PGxpPk9DYW1sIExTUCog VXBzdHJlYW1pbmcgT0NhbWwgTFNQ4oCZcyBGb3JrIG9mIE1lcmxpbiA8L2xpPjwvdWw+DQo8L2xp PjxsaT5Gb3JtYXR0aW5nIENvZGUNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5PQ2FtbEZv cm1hdDwvYj4gQ2xvc2luZyB0aGUgR2FwIEJldHdlZW4gT0NhbWxGb3JtYXQgYW5kIDxjb2RlPm9j cC1pbmRlbnQ8L2NvZGU+DQo8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2E2MGU0ODQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlk PSJvcmdhNjBlNDg0Ij5SZWxlYXNlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnYTYwZTQ4NCI+DQo8cD5IZXJlIGFyZSB0aGUgbmV3IHZlcnNpb25zIG9mIFBs YXRmb3JtIHRvb2xzIHdlIHJlbGVhc2VkIGluIEFwcmlsLiBIYXZlIGEgbG9vayBhdCB0aGUNCjxh IGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZyI+T0NhbWwgQ2hhbmdlbG9nPC9hPiB0 byByZWFkIGFubm91bmNlbWVudHMgYW5kIGZlYXR1cmUgaGlnaGxpZ2h0cyENCjwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVu ZS9yZWxlYXNlcy90YWcvMy44LjAiPkR1bmUgMy44LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjEuNSI+b3BhbSAyLjEu NTwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9y ZWxlYXNlcy90YWcvdjQuOS01MDAiPk1lcmxpbiA0Ljk8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOWY4MWFiMyIgY2xhc3M9Im91 dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzlmODFhYjMiPkJ1aWxkaW5nIFBhY2thZ2VzPC9oND4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc5ZjgxYWIzIj48L2Rpdj4NCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnMjc2MTUzMCI+PC9hPjxiPkR1bmU8L2I+ IEV4cGxvcmluZyBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZTxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcyNzYxNTMwIj4NCjxwPkNvbnRyaWJ1dG9yczogQHJn cmluYmVyZyAoVGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJViAoVGFyaWRlcyksIEBncmlkYnVn cyAoVGFyaWRlcyksIEBraXQtdHkta2F0ZSAoVGFyaWRlcykNCjwvcD4NCjxwPkV4cGxvcmF0aW9u cyBjb250aW51ZSBvbiBhZGRpbmcgcGFja2FnZSBtYW5hZ2VtZW50IHN1cHBvcnQgdG8gRHVuZS4g VGhpcyBtb250aCBwcm9ncmVzcyBoYXMgYmVlbiBtYWRlIG9uIHNldmVyYWwgZnJvbnRzOg0KPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSB3b3JrIG9uIHRoZSBzb2x2ZXIgaGFzIGJl ZW4gc3RhcnRlZCwgaW5jbHVkaW5nIHZlbmRvcmluZyB0aGUgb3BhbS0waW5zdGFsbCBzb2x2ZXIg Zm9yIHNvbHZpbmcgZGVwZW5kZW5jaWVzIHdoZW4gZ2VuZXJhdGluZyBEdW5lIGxvY2tmaWxlcy4g QSB3b3JrLWluLXByb2dyZXNzIGltcGxlbWVudGF0aW9uIG9mIGxvY2tmaWxlIGdlbmVyYXRpb24g aXMgYXZhaWxhYmxlIG9uIHRoZQ0KPGNvZGU+bWFpbjwvY29kZT4gYnJhbmNoLiA8L2xpPjxsaT5U aGUgc291cmNlIHRyZWUgaGFuZGxpbmcgaGFzIHVuZGVyZ29uZSBhIHJlZmFjdG9yIHRvIGV2ZW50 dWFsbHkgYWxsb3cgbXVsdGlwbGUgY29udGV4dC1zcGVjaWZpYyBsb2NrZmlsZXMuDQo8L2xpPjxs aT5UaGUgc291cmNlIGZldGNoaW5nIGltcGxlbWVudGF0aW9uIGhhcyBzZWVuIGltcHJvdmVtZW50 cywgaW5jbHVkaW5nIGNoZWNrc3VtIGhhbmRsaW5nIGFuZCBhIGJldHRlciBGZXRjaCBBUEkuIFRo aXMgcmVzdWx0cyBpbiBhIGNsZWFuZXIgaW50ZXJmYWNlIGZvciBidWlsZGluZyBvcGFtIHBhY2th Z2VzLg0KPC9saT48bGk+V29yayBjb250aW51ZXMgb24gcHJvdG90eXBpbmcgdGhlIGJ1aWxkaW5n IG9mIG9wYW0gcGFja2FnZXMsIHdoaWNoIGluY2x1ZGVzIHRoZSBhZGRpdGlvbiBvZiBuZXcNCjxj b2RlPlBhdGNoPC9jb2RlPiBhbmQgPGNvZGU+U3Vic3RpdHV0ZTwvY29kZT4gYWN0aW9ucy4gVGhp cyBoYXMgaW5jcmVhc2VkIHRoZSBzdWJzZXQgb2Ygb3BhbSBwYWNrYWdlcyB0aGF0IGNhbiBub3cg YmUgYnVpbHQuDQo8L2xpPjwvdWw+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPk1lcmdlZCB0aGUgUFIgdGhhdCBhZGRlZCB0aGUgYWJpbGl0eSB0 byBidWlsZCBvcGFtIHBhY2thZ2VzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvZHVuZS9wdWxsLzc2MjYiPg0Kb2NhbWwvZHVuZSM3NjI2PC9hPi4gPC9saT48bGk+QWRkZWQg c2FmZXR5IG1lY2hhbmlzbXMgaW4gbG9jayBkaXJlY3RvcnkgcmVnZW5lcmF0aW9uIOKAkyA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc4MzIiPg0Kb2NhbWwvZHVu ZSM3ODMyPC9hPi4gPC9saT48bGk+SW50cm9kdWNlZCBmZWF0dXJlIHRvIHNldCBlbnZpcm9ubWVu dCBpbiBidWlsZCBydWxlcyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvcHVsbC83NzQyIj4NCm9jYW1sL2R1bmUjNzc0MjwvYT4uIDwvbGk+PGxpPk1lcmdlIHRoZSBQ UiB0aGF0IGFkZGVkIGNvbnNlcnZhdGl2ZSBsb2NrZmlsZSBnZW5lcmF0aW9uIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc3MzIiPg0Kb2NhbWwvZHVuZSM3 NzMyPC9hPi4gPC9saT48bGk+U2ltcGxpZmllZCBlbnRyaWVzIGluIGNvb2tpZSDigJMgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83NzAxIj4NCm9jYW1sL2R1bmUj NzcwMTwvYT4uIDwvbGk+PGxpPkZpeGVkIGxvY2F0aW9uIGhhbmRsaW5nIGZvciBzb3VyY2UgY29w aWVzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc2OTci Pg0Kb2NhbWwvZHVuZSM3Njk3PC9hPi4gPC9saT48bGk+SW1wcm92ZWQgY2hlY2tzdW0gaGFuZGxp bmcg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzY5NiI+ DQpvY2FtbC9kdW5lIzc2OTY8L2E+LiA8L2xpPjxsaT5UZXN0ZWQgaW5zdGFsbCBhY3Rpb24g4oCT IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzY5NSI+b2NhbWwv ZHVuZSM3Njk1PC9hPi4NCjwvbGk+PGxpPlZlcnNpb25lZCBsb2NrIGRpcmVjdG9yeSBmb3JtYXQg 4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzY5MyI+DQpv Y2FtbC9kdW5lIzc2OTM8L2E+LiA8L2xpPjxsaT5DcmVhdGVkIGEgYmV0dGVyIEFQSSBmb3IgZmV0 Y2gg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzY3NSI+ DQpvY2FtbC9kdW5lIzc2NzU8L2E+LiA8L2xpPjxsaT5WZW5kb3JlZCBvcGFtLTBpbnN0YWxsIOKA kyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc2NjgiPm9jYW1s L2R1bmUjNzY2ODwvYT4uDQo8L2xpPjxsaT5PcGVuIGEgUFIgYWRkaW5nIGEgZmVhdHVyZSB0byBy ZXR1cm4gdGhlIHJldHJpZXZlZCBjaGVja3N1bXMgb24gZmFpbHVyZSBmb3IgY2hlY2tzdW0gdmVy aWZpY2F0aW9uIOKAkw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVs bC81NTUyIj5vY2FtbC9kdW5lIzU1NTI8L2E+LiA8L2xpPjxsaT5DYXJyaWVkIG91dCBhIHJlZmFj dG9yIHRvIGFsbG93IHBhc3NpbmcgaW4gYSBjdXN0b20gcnVubmVyIHRvIDxjb2RlPk9wYW1TdGQu U3lzPC9jb2RlPiDigJMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1 bGwvNTU0OSI+b2NhbWwvZHVuZSM1NTQ5PC9hPi4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxs aT48YSBpZD0ib3JnNGQ1ZDU0MCI+PC9hPjxiPm9wYW08L2I+IE5hdGl2ZSBTdXBwb3J0IGZvciBX aW5kb3dzIGluIG9wYW0gMi4yPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0 ZXh0LW9yZzRkNWQ1NDAiPg0KPHA+Q29udHJpYnV0b3JzOiBAcmpib3UgKE9DYW1sUHJvKSwgQGtp dC10eS1rYXRlIChUYXJpZGVzKSwgQGRyYTI3IChUYXJpZGVzKSwgQGVtaWxsb24gKFRhcmlkZXMp LCBATGVvbmlkYXMtZnJvbS1YSVYgKFRhcmlkZXMpDQo8L3A+DQo8cD5UaHJvdWdob3V0IE1heSwg dGhlIG9wYW0gdGVhbSBoYXMgZm9jdXNlZCBvbiByZXZpZXdpbmcgYW5kIGZpeGluZyByZW1haW5p bmcgUFJzIGZvciB0aGUgMi4yIGFscGhhIHJlbGVhc2UuIFRoaXMgZWZmb3J0IGRlYnVnZ2VkIGFu ZCByZXNvbHZlZCBpc3N1ZXMgZm91bmQgZHVyaW5nIHRlc3RpbmcsIGFuZCB0aGUgdGVhbSBpcyBu b3cgd29ya2luZyB0aHJvdWdoIHRoZSBoYW5kZnVsIFBScyBwZW5kaW5nIHJldmlldy4NCjwvcD4N CjxwPkEgbmV3IHJlbGVhc2UsIG9wYW0gMi4xLjUgcG9pbnQgcmVsZWFzZSwgaGFzIGFsc28gYmVl biByb2xsZWQgb3V0LCBiYWNrcG9ydGluZyBzZXZlcmFsIGZpeGVzIGZyb20gdGhlIHVwY29taW5n IDIuMiByZWxlYXNlLCBhbmQgYW4gaW1wb3J0YW50IHNlY3VyaXR5IGZpeC4gWW91IGNhbiByZWFk IHRoZSBhbm5vdW5jZW1lbnQgb24gdGhlDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFu Z2Vsb2c/dD1vcGFtIj5PQ2FtbCBDaGFuZ2Vsb2c8L2E+LiA8L3A+DQo8cD48Yj5BY3Rpdml0aWVz OjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkluc3RhbGxlZCBjeWd3aW4gaW50 ZXJuYWxseSBkdXJpbmcgaW5pdCDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29wYW0vcHVsbC81NTQ1Ij4NCm9jYW1sL29wYW0jNTU0NTwvYT4uIDwvbGk+PGxpPkFkZGVkIGN5 Z3dpbiBzdXBwb3J0IHRvIGRlcGV4dHMg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vcGFtL3B1bGwvNTU0MiI+DQpvY2FtbC9vcGFtIzU1NDI8L2E+LiA8L2xpPjxsaT5JbXBs ZW1lbnRlZCBmdWxseSByZXZlcnRpYmxlIGVudmlyb25tZW50IHVwZGF0ZXMg4oCTIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTQxNyI+DQpvY2FtbC9vcGFtIzU0 MTc8L2E+LiA8L2xpPjxsaT5Tb21lIHdpbmRvd3Mgc2hlbGwgdXBkYXRlcyDigJMgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTQxIj4NCm9jYW1sL29wYW0jNTU0 MTwvYT4uIDwvbGk+PGxpPkJldHRlciBjeWd3aW4gc3VwcG9ydCBpbiBjb3JlIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzU1NDMiPg0Kb2NhbWwvb3BhbSM1 NTQzPC9hPi4gPC9saT48bGk+aW5pdDogZGV0ZWN0IGxvY2FsIGN5Z3dpbiBpbnN0YWxsYXRpb24g 4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTU0NCI+DQpv Y2FtbC9vcGFtIzU1NDQ8L2E+LiA8L2xpPjxsaT5pbml0OiBpbnN0YWxsIGN5Z3dpbiBpbnRlcm5h bGx5IC0gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTQ1Ij4N Cm9jYW1sL29wYW0jNTU0NTwvYT4uIDwvbGk+PGxpPlVzZWQgT0NhbWwgY29kZSB0byBjb3B5L21v dmUvcmVtb3ZlIGRpcmVjdG9yaWVzIGluc3RlYWQgb2YgdW5peCBjb21tYW5kcyDigJMgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC80ODIzIj4NCm9jYW1sL29wYW0j NDgyMzwvYT4uIDwvbGk+PGxpPkZpeCBwZXJmb3JtYW5jZSByZWdyZXNzaW9uIGluIG9wYW0gaW5z dGFsbC9yZW1vdmUvdXBncmFkZS9yZWluc3RhbGwg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtL3B1bGwvNTUwMyI+DQpvY2FtbC9vcGFtIzU1MDM8L2E+LiA8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcyZDhlYzcxIj48L2E+PGI+RHVuZTwvYj4g SW1wcm92aW5nIER1bmXigJlzIERvY3VtZW50YXRpb248YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNSIgaWQ9InRleHQtb3JnMmQ4ZWM3MSI+DQo8cD5Db250cmlidXRvcnM6IEBlbWlsbG9u IChUYXJpZGVzKSA8L3A+DQo8cD5Ud28gRHVuZSBsaWJyYXJpZXMgbm93IGhhdmUgYSBkb2N1bWVu dGF0aW9uIHBhZ2Ugb24gT0NhbWwub3JnOiBib3RoIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3Jn L3AvZHVuZS1idWlsZC1pbmZvL2xhdGVzdC9kb2MvaW5kZXguaHRtbCI+DQpkdW5lLWJ1aWxkLWlu Zm88L2E+IGFuZCA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL2R1bmUtY29uZmlndXJhdG9y L2xhdGVzdC9kb2MvaW5kZXguaHRtbCI+DQpkdW5lLWNvbmZpZ3VyYXRvcjwvYT4gbm93IGhhdmUg dGhlaXIgQVBJIGRvY3VtZW50YXRpb24gZGlyZWN0bHkgb24gdGhlaXIgcGFja2FnZSBwYWdlLCBh bmQgZm9yIER1bmUgaXRzZWxmLCBhIGxpbmsgdG8gaXRzIG9mZmljaWFsIGRvY3VtZW50YXRpb24g aGFzIGJlZW4gaW5jbHVkZWQuDQo8L3A+DQo8cD5BIG5ldyA8Y29kZT5hY3Rpb246PC9jb2RlPiBk aXJlY3RpdmUgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIER1bmUgU3BoaW54IGRvbWFpbiwgYWxsb3dp bmcgZm9yIGltcHJvdmVkIGNyb3NzLXJlZmVyZW5jaW5nLiBGaW5hbGx5LCB0aGUgb2xkDQo8Y29k ZT4ub3JnPC9jb2RlPiBmb3JtYXQgRHVuZSBleGFtcGxlIGRvY3MgaGF2ZSBiZWVuIGNvbnZlcnRl ZCB0byBNYXJrZG93biB0byBzdGFuZGFyZGl6ZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3JtYXQgZnVy dGhlci4NCjwvcD4NCjxwPlRoZSBpbXByb3ZlbWVudHMgdG8gdGhlIGRvY3VtZW50YXRpb24gaGF2 ZSBiZWVuIHB1Ymxpc2hlZCBhcyBwYXJ0IG9mIHRoZSBEdW5lIDMuOCByZWxlYXNlLiBUaGUgbmV3 IHN0cnVjdHVyZSBhbmQgbWFueSBpbXByb3ZlbWVudHMgY2FuIGJlIHZpZXdlZCBvbg0KPGEgaHJl Zj0iaHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS8iPkR1bmUgZG9jdW1lbnRh dGlvbjwvYT4uIDwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+UGxhY2VkIHVuY2F0ZWdvcml6ZWQgcGFnZXMgdW5kZXIgdGhlIG1vc3QgYXBw cm9wcmlhdGUgaGVhZGVyIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVu ZS9wdWxsLzc2ODMiPg0Kb2NhbWwvZHVuZSM3NjgzPC9hPi4gPC9saT48bGk+Q29udmVydGVkIFJF QURNRS5vcmcgaW4gZXhhbXBsZSB0byBtYXJrZG93biDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvcHVsbC83NzM4Ij4NCm9jYW1sL2R1bmUjNzczODwvYT4uIDwvbGk+ PGxpPkFkZGVkIEFQSSBkb2N1bWVudGF0aW9uIGZvciBkdW5lLWJ1aWxkLWluZm8g4oCTIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzczOSI+DQpvY2FtbC9kdW5l Izc3Mzk8L2E+LiA8L2xpPjxsaT5EaXJlY3RlZCByZWFkZXJzIHRvIHRoZSBvZmZpY2lhbCBkb2Nz IGluIG9kb2Mg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwv Nzc0NiI+DQpvY2FtbC9kdW5lIzc3NDY8L2E+LiA8L2xpPjxsaT5BZGRlZCBhbiBvZG9jIGluZGV4 IGZvciBjb25maWd1cmF0b3Ig4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9k dW5lL3B1bGwvNzc0OSI+DQpvY2FtbC9kdW5lIzc3NDk8L2E+LiA8L2xpPjxsaT5Db3JyZWN0ZWQg dGhlIGRvY3VtZW50YXRpb24gZm9yIDxjb2RlPihtYXBfd29ya3NwYWNlX3Jvb3QpPC9jb2RlPiDi gJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83Nzc1Ij4NCm9j YW1sL2R1bmUjNzc3NTwvYT4uIDwvbGk+PGxpPkV4cGFuZGVkIGFjdGlvbnMgZG9jdW1lbnRhdGlv biB3aXRoIGEgc3BlY2lhbCBkaXJlY3RpdmUg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL3B1bGwvNzgwNCI+DQpvY2FtbC9kdW5lIzc4MDQ8L2E+LiA8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcxMzllOTI0Ij48L2E+PGI+RHVuZTwvYj4gQ29t cG9zaW5nIGluc3RhbGxlZCBDb3EgdGhlb3JpZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNSIgaWQ9InRleHQtb3JnMTM5ZTkyNCI+DQo8cD5Db250cmlidXRvcnM6IEBBbGl6dGVyIGFu ZCBAZWpnYWxsZWdvIChJUklGKSA8L3A+DQo8cD5MYXN0IG1vbnRoLCB0aGUgUFIgdGhhdCBicmlu Z3MgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83MDQ3Ij4NCnN1 cHBvcnQgZm9yIGNvbXBvc2luZyBDb3EgdGhlb3JpZXMgd2l0aCBEdW5lPC9hPiB3YXMgbWVyZ2Vk LiA8L3A+DQo8cD5UaGlzIGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIHJlbGVhc2Ugb2YgRHVuZSAz LjguMCEgRnJvbSB0aGlzIHBvaW50IG9ud2FyZHMsIENvcSB1c2VycyBjYW4gdXRpbGl6ZSBEdW5l IHRvIGJ1aWxkIENvcSBwcm9qZWN0cyBldmVuIGlmIHRoZXkgZGVwZW5kIG9uIENvcSBwcm9qZWN0 cyB0aGF0IHVzZSBvdGhlciBidWlsZCBzeXN0ZW1zIQ0KPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48 YSBpZD0ib3JnNTM1MTRkZSI+PC9hPjxiPkR1bmU8L2I+IFJ1bm5pbmcgQWN0aW9ucyBDb25jdXJy ZW50bHk8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNTM1MTRk ZSI+DQo8cD5Db250cmlidXRvcnM6IEBBbGl6dGVyIGFuZCBAaGh1Z28gKE5vbWFkaWMgTGFicykg PC9wPg0KPHA+TGFzdCBtb250aCwgYSBjb3VwbGUgb2YgUFJzIHdlcmUgbWVyZ2VkIGludG8gRHVu ZSB0byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzY5MzMiPg0K YWRkIGEgbmV3IGNvbmN1cnJlbnQgYWN0aW9uPC9hPiBhbmQgaXQgd2FzIHV0aWxpemVkIHRvIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzAxMiI+DQpydW4gaW5s aW5lIHRlc3RzIGNvbmN1cnJlbnRseTwvYT4uIDwvcD4NCjxwPlRoZXNlIHBhdGNoZXMgYXJlIHBh cnQgb2YgRHVuZSAzLjguMCByZWxlYXNlLCBzdGFydGluZyBub3csIHlvdSBjYW4gdXNlIHRoZSBu ZXcNCjxjb2RlPmNvbmN1cnJlbnQ8L2NvZGU+IGFjdGlvbiBpbiB5b3VyIER1bmUgcnVsZXM6IDwv cD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmczMjMwYzYyIj4NCihydWxlDQogKGFjdGlv bg0KICAoY29uY3VycmVudA0KICAgKHJ1biAmbHQ7cHJvZyZndDsgJmx0O2FyZ3MmZ3Q7KQ0KICAg KHJ1biAmbHQ7cHJvZyZndDsgJmx0O2FyZ3MmZ3Q7KSkpKQ0KPC9wcmU+DQo8L2Rpdj4NCjwvbGk+ PGxpPjxhIGlkPSJvcmc1YWIxNmI0Ij48L2E+PGI+RHVuZTwvYj4gQmVuY2htYXJraW5nIER1bmUg b24gTGFyZ2UgQ29kZSBCYXNlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmc1YWIxNmI0Ij4NCjxwPkNvbnRyaWJ1dG9yczogQGdyaWRidWdzIChUYXJpZGVzKSwg QExlb25pZGFzLWZyb20tWElWIChUYXJpZGVzKSA8L3A+DQo8cD5UaGUgcXVhbGl0eSBvZiB0aGUg ZHVuZSBiZW5jaG1hcmsgcmVzdWx0cyBoYXMgYmVlbiBpbXByb3ZlZCwgYXZlcmFnaW5nIG91dCB0 aGUgdmFyaWFuY2Ugc2VlbiBpbiBzaG9ydCB0ZXN0cyBieSBydW5uaW5nIHRoZW0gbXVsdGlwbGUg dGltZXMuIFRoaXMgZW5oYW5jZW1lbnQgYWltcyB0byByZWR1Y2UgdGhlIGVmZmVjdCBvZiB0aGUg YmFja2dyb3VuZCBub2lzZSBpbmhlcmVudCBpbiB0aGUgZW52aXJvbm1lbnQuDQo8L3A+DQo8cD5U aGUgZHVuZSBiZW5jaG1hcmtzIGFsc28gZXhwb3NlZCB0d28gYnJva2VuIHBhY2thZ2VzOiB0aGUg aGFzaCBvZiA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wL3BweF9yYXBwZXIvMy4xLjAiPg0K cHB4X3JhcHBlciAoMy4xLjApPC9hPiBhcnRlZmFjdCBoYXMgYmVlbiB1cGRhdGVkIGFzIGl0IGhh ZCBjaGFuZ2VkIGluIHBsYWNlLCBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9vY2Ft bGNvZG9jL2xhdGVzdCI+DQpvY2FtbGNvZG9jPC9hPiBhcnRlZmFjdHMgaGF2ZSBiZWVuIGFkZGVk IHRvIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1zb3VyY2UtYXJj aGl2ZXMiPg0Kb3BhbS1zb3VyY2UtYXJjaGl2ZXM8L2E+IGFzIHRoZSBvcmlnaW5hbCBVUkwgaXMg bm8gbG9uZ2VyIHJlYWNoYWJsZS4gPC9wPg0KPHA+TW9yZW92ZXIsIGEgc3RhY2sgb3ZlcmZsb3cg aW4gPGNvZGU+ZHVuZS1ycGMtbHd0PC9jb2RlPiBleHBvc2VkIGJ5IHRoZSBiZW5jaG1hcmtzIGhh cyBiZWVuIGZpeGVkLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5SYW4gc2hvcnQgbW9ub3JlcG8gYmVuY2htYXJrcyBtdWx0aXBsZSB0 aW1lcyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83Nzk4 Ij4NCm9jYW1sL2R1bmUjNzc5ODwvYT4uIDwvbGk+PGxpPkZpeGVkIGlzc3VlcyBpbiBtb25vcmVw byBiZW5jaG1hcmtzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9w dWxsLzc3ODYiPg0Kb2NhbWwvZHVuZSM3Nzg2PC9hPi4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0tc291cmNlLWFyY2hpdmVzL3B1bGwvMjEiPkFkZGVkPC9h PiBvY2FtbGNvZG9jIHRvIG9wYW0tc291cmNlLWFyY2hpdmVzIGFuZA0KPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzIzODAxIj51cGRhdGVkPC9h PiBvcGFtLXJlcG9zaXRvcnkuDQo8L2xpPjxsaT5PcGVuZWQgYW4gPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL3JvZGR5eWFnYS9wcHhfcmFwcGVyL2lzc3Vlcy8zNCI+aXNzdWU8L2E+IGFib3V0 DQo8Y29kZT5wcHhfcmFwcGVyLjMuMS4wPC9jb2RlPiBwYWNrYWdlIGNoYW5naW5nIGluIHBsYWNl LiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnNGIyNTg0OSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzRi MjU4NDkiPkNvbXBpbGluZyB0byBKYXZhU2NyaXB0PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC00IiBpZD0idGV4dC1vcmc0YjI1ODQ5Ij48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBpZD0ib3JnNGY4NjUzOSI+PC9hPjxiPkR1bmU8L2I+IENvbXBpbGUgdG8gSmF2YVNj cmlwdCB3aXRoIE1lbGFuZ2UgaW4gRHVuZTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01 IiBpZD0idGV4dC1vcmc0Zjg2NTM5Ij4NCjxwPkNvbnRyaWJ1dG9yczogQGFubW9udGVpcm8sIEBq Y2hhdmFycmkgKEFocmVmcyksIEByZ3JpbmJlcmcgKFRhcmlkZXMpIDwvcD4NCjxwPldl4oCZcmUg dGhyaWxsZWQgdG8gc2VlIHRoZSBqb2ludCByZWxlYXNlIG9mIER1bmUgMy44LjAgYW5kIDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWVsYW5nZS0xLTAtY29tcGlsZS1v Y2FtbC1yZWFzb25tbC10by1qYXZhc2NyaXB0LzEyMzA1Ij4NCk1lbGFuZ2UgMS4wPC9hPiB0aGlz IG1vbnRoISA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVsYW5nZS1yZS9t ZWxhbmdlIj5NZWxhbmdlPC9hPiBpcyBhIGNvbXBpbGVyIGZyb20gT0NhbWwgdG8gSmF2YVNjcmlw dCB3aXRoIHRoZSB2aXNpb24gb2YgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIE9DYW1s IGFuZCBwcm92aWRpbmcgdGhlIGJlc3QgT0NhbWwgZXhwZXJpZW5jZSB3aXRoaW4gdGhlIG1vZGVy biBKYXZhU2NyaXB0IGVjb3N5c3RlbS4NCjwvcD4NCjxwPkhhdmUgYSBsb29rIGF0IHRoZSA8YSBo cmVmPSJodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L21lbGFuZ2UuaHRtbCI+ DQpEdW5lIGRvY3VtZW50YXRpb248L2E+IGFuZCA8YSBocmVmPSJodHRwczovL21lbGFuZ2UucmUv djEuMC4wLyI+TWVsYW5nZSBkb2N1bWVudGF0aW9uPC9hPiB0byBsZWFybiBob3cgdG8gZ2V0IHN0 YXJ0ZWQgdXNpbmcgTWVsYW5nZSB0byBjb21waWxlIHlvdXIgT0NhbWwgcHJvamVjdHMgdG8gSmF2 YVNjcmlwdC4NCjwvcD4NCjxwPllvdSBjYW4gYWxzbyByZWZlciB0byB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZS1vcGFtLXRlbXBsYXRlIj4NCnRlbXBs YXRlPC9hPiB0byBnZXQgc3RhcnRlZC4gPC9wPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzk1NDI3MzYiIGNsYXNzPSJvdXRsaW5lLTQi Pg0KPGg0IGlkPSJvcmc5NTQyNzM2Ij5HZW5lcmF0aW5nIERvY3VtZW50YXRpb248L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzk1NDI3MzYiPjwvZGl2Pg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmc2OTI3ZmQ3Ij48L2E+PGI+T2RvYzwvYj4g QWRkIFNlYXJjaCBDYXBhYmlsaXRpZXMgdG8gPGNvZGU+b2RvYzwvY29kZT48YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNjkyN2ZkNyI+DQo8cD5Db250cmlidXRv cnM6IEBwYW5nbGVzZCAoVGFyaWRlcyksIEBFbWlsZVRyb3RpZ25vbiAoVGFyaWRlcyksIEB0cmVm aXMgKFRhcmlkZXMpDQo8L3A+DQo8cD5UaGUgb2RvYyB0ZWFtIGlzIG1ha2luZyBzdGVhZHkgcHJv Z3Jlc3Mgb24gYWRkaW5nIGEgc2VhcmNoIGJhciB0byBvZG9j4oCZcyBnZW5lcmF0ZWQgZG9jdW1l bnRhdGlvbi4NCjwvcD4NCjxwPkluIE1heSwgYW4gaW50ZXJmYWNlIGZvciBpbnRlcmFjdGlvbiBi ZXR3ZWVuIG9kb2MgYW5kIHNlYXJjaCBlbmdpbmVzIHdhcyBkZXNpZ25lZC4NCjxhIGhyZWY9Imh0 dHBzOi8vZG9jLnNoZXJsb2NvZGUuY29tLyI+U2hlcmxvZG9jPC9hPiwgd2hpY2ggY2FuIG5vdyBy dW4gaW4gdGhlIGJyb3dzZXIsIHdhcyB1cGRhdGVkIHRvIHVzZSB0aGUgbmV3IGludGVyZmFjZSBl eHBvc2VkIGJ5IG9kb2MuIEltcHJvdmVtZW50cyB3ZXJlIGFsc28gbWFkZSB0bw0KPGNvZGU+c2hl cmxvZG9jPC9jb2RlPiBpdHNlbGYgdG8gZW5hYmxlIHNlYXJjaGluZyBmb3IgY29uc3RydWN0b3Jz IGFuZCByZWNvcmQgZmllbGRzLCBhcyB3ZWxsIGFzIGluIGRvY3N0cmluZ3MuIFRoZSBsYXJnZXIg ZGF0YWJhc2UgZnJvbSBhbGwgdGhpcyBleHRyYSBpbmRleGluZyBwcm9tcHRlZCB3b3JrIG9uIHBy b2ZpbGluZyBpdCBhbmQgaW1wbGVtZW50aW5nIG9wdGltaXphdGlvbnMuDQo8L3A+DQo8cD5BbnRp Y2lwYXRpbmcgdGhlIEp1bmUgdXBkYXRlLCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29kb2MvcHVsbC85NzIiPg0Kb2RvYyBQUjwvYT4gdGhhdCB3YXMgb3BlbiBhIGZldyBk YXlzIGFnbyBjYW4gYmUgY2hlY2tlZCBvdXQuIDwvcD4NCjxwPkluIHBhcmFsbGVsLCBhIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wYW5nbGVzZC9vZG9jL3RyZWUvb2NjdXJyZW5jZXMtaW4t b2RvYyI+DQp3b3JraW5nIHByb3RvdHlwZTwvYT4gb2YgY291bnRpbmcgb2NjdXJyZW5jZXMgaW4g b2RvYyB3YXMgZGV2ZWxvcGVkLiBUaGUgYWltIGlzIHRvIGFkZCB1c2FnZSBzdGF0aXN0aWNzIGlu IHRoZSBnZW5lcmF0ZWQgaW5kZXgsIHNvIHRoYXQgc2VhcmNoIGVuZ2luZXMgY2FuIHVzZSBpdCB0 byBzb3J0IHNlYXJjaCByZXN1bHRzLiBJdCB3aWxsIGFsc28gYWxsb3cgZm9yIGEg4oCcanVtcC10 by1kb2N1bWVudGF0aW9u4oCdIGZlYXR1cmUgaW4gdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2RvYy9wdWxsLzkwOSI+cmVuZGVyZWQgc291cmNlIGNvZGU8L2E+IHRoYXQg d2FzIG1lcmdlZCBpbiBNYXJjaC4NCjwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzE2 ODAxZDYiPjwvYT48Yj5PZG9jPC9iPiBTdXBwb3J0IGZvciBUYWJsZXMgaW4gPGNvZGU+b2RvYzwv Y29kZT48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMTY4MDFk NiI+DQo8cD5Db250cmlidXRvcnM6IEBncGV0aW90IChUYXJpZGVzKSwgQHBhbmdsZXNkIChUYXJp ZGVzKSwgQEp1bG93IChUYXJpZGVzKSwgQGpvbmx1ZGxhbSAoVGFyaWRlcyksIEB0cmVmaXMgKFRh cmlkZXMpDQo8L3A+DQo8cD5UaGUgUFJzIGFkZGluZyBzdXBwb3J0IGZvciBhIG5ldyBzeW50YXgg dG8gY3JlYXRlIHRhYmxlcyBpbiBPZG9jIGhhdmUgYmVlbiBtZXJnZWQhDQo8L3A+DQo8cD5BcyBh IHJlbWluZGVyLCB0aGlzIG5ldyBmZWF0dXJlIHdpbGwgZW5hYmxlIHRoZSBjcmVhdGlvbiBvZiB0 YWJsZXMgdXNpbmcgYSBzeW50YXggc2ltaWxhciB0byBNYXJrZG93bjoNCjwvcD4NCjxwcmUgY2xh c3M9ImV4YW1wbGUiIGlkPSJvcmczZDYyOGIzIj4NCnt0DQogIGEgIHwgYiB8IGMgfCBkDQogIC0t LXw6LS18LS06fDotOg0KICBhICB8IGIgfCBjIHwgZA0KfQ0KPC9wcmU+DQo8cD5PZG9jIHdpbGwg Z2VuZXJhdGUgdGFibGVzIGZvciBkaWZmZXJlbnQgYmFja2VuZHMsIGluY2x1ZGluZyBMYVRleCBh bmQgSFRNTC4gVGhpcyBuZXcgc3ludGF4IHdpbGwgYmUgYXZhaWxhYmxlIGluIHRoZSB1cGNvbWlu ZyByZWxlYXNlIG9mIE9kb2MgMi4zLjAuIFN0YXkgdHVuZWQhDQo8L3A+DQo8cD48Yj5BY3Rpdml0 aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPk1lcmdlZCB0aGUgUFIgdGhh dCBhZGRzIGEgbmV3IHN5bnRheCBmb3IgdGFibGVzIGluIG9kb2MtcGFyc2VyIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZG9jL29kb2MtcGFyc2VyL3B1bGwvMTEiPg0Kb2Nh bWwtZG9jL29kb2MtcGFyc2VyIzExPC9hPiA8L2xpPjxsaT5NZXJnZWQgdGhlIFBSIHRoYXQgYWRk cyBzdXBwb3J0IGZvciB0YWJsZXMgdG8gb2RvYyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29kb2MvcHVsbC84OTMiPg0Kb2NhbWwvb2RvYyM4OTM8L2E+IDwvbGk+PC91bD4N CjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc4MjIyOTI3IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnODIyMjkyNyI+RWRpdGlu ZyBhbmQgUmVmYWN0b3JpbmcgQ29kZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnODIyMjkyNyI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aWQ9Im9yZ2E5YmZjNmQiPjwvYT48Yj5NZXJsaW48L2I+IFN1cHBvcnQgZm9yIFByb2plY3QtV2lk ZSBSZWZlcmVuY2VzIGluIE1lcmxpbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmdhOWJmYzZkIj4NCjxwPkNvbnRyaWJ1dG9yczogQHZvb2Rvb3MgKFRhcmlkZXMp LCBAbGV0LWRlZiAoVGFyaWRlcykgPC9wPg0KPHA+Tm90IG11Y2ggcHJvZ3Jlc3Mgd2FzIG1hZGUg b24gdGhlIHN1cHBvcnQgZm9yIHByb2plY3Qtd2lkZSBvY2N1cnJlbmNlcyBpbiBNZXJsaW4gdGhp cyBtb250aCBkdWUgdG8gdGhlIE1lcmxpbiB0ZWFt4oCZcyBmb2N1cyBvbiBwZXJmb3JtYW5jZSBp bXByb3ZlbWVudHMsIGZpeGluZyB1c2VyLXJlcG9ydGVkIGJ1Z3MsIGNvbXBhdGliaWxpdHkgd2l0 aCBPQ2FtbCA1LjEsIGFuZCB0aGUgcmVsZWFzZSBvZiBNZXJsaW4gNC45DQo8L3A+DQo8cD5UaGUg cmVtYWluaW5nIGlzc3Vlcywgc3VjaCBhcyBtb2R1bGUgYWxpYXNlcyB0cmF2ZXJzYWwgYW5kIGlu ZGV4IGZpbHRlcmluZywgd2VyZSBkaXNjdXNzZWQsIHdpdGggdGhlIGltcGxlbWVudGF0aW9uIG9m IGlkZW50aWZpZWQgc29sdXRpb25zIHNldCB0byBjb21tZW5jZSBzb29uLg0KPC9wPg0KPC9kaXY+ DQo8L2xpPjxsaT48YSBpZD0ib3JnMDA1NGFhYyI+PC9hPjxiPk1lcmxpbjwvYj4gSW1wcm92aW5n IE1lcmxpbuKAmXMgUGVyZm9ybWFuY2U8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIg aWQ9InRleHQtb3JnMDA1NGFhYyI+DQo8cD5Db250cmlidXRlZCBieTogQHBpdGFnLWhhIChUYXJp ZGVzKSwgQDNSYWZhbCAoVGFyaWRlcyksIEB2b29kb29zIChUYXJpZGVzKSwgQGxldC1kZWYgKFRh cmlkZXMpDQo8L3A+DQo8cD5UaGUgZmluYWwgc3RhZ2VzIG9mIHdvcmsgb24gYmVuY2htYXJraW5n IE1lcmxpbiBhcmUgaW4gcHJvZ3Jlc3MsIHdpdGggdGhlIE1lcmxpbiB0ZWFtIGZvY3VzaW5nIG9u IGludGVncmF0aW5nIHRoZSBkZXZlbG9wZWQgYmVuY2htYXJraW5nIHRvb2xpbmcgaW50byBNZXJs aW7igJlzIENJIHVzaW5nDQo8Y29kZT5jdXJyZW50LWJlbmNoPC9jb2RlPi4gVGhlIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9waXRhZy1oYS9tZXJsLWFuL3B1bGwvMiI+DQpQUjwvYT4gb24g PGNvZGU+bWVybC1hbjwvY29kZT4gaGFzIGJlZW4gb3BlbmVkIHRvIGFkZCBhIG5ldyBjdXJyZW50 LWJlbmNoIGNvbXBhdGlibGUgYmFja2VuZCBhbmQgd29yayBoYXMgc3RhcnRlZCBvbiBhZGRpbmcg bWVtb3J5IHVzYWdlIGluZm9ybWF0aW9uIHRvIE1lcmxpbuKAmXMgdGVsZW1ldHJ5Lg0KPC9wPg0K PHA+T24gdGhlIHBlcmZvcm1hbmNlIG9wdGltaXNhdGlvbnMgZnJvbnQsIHRoZSBQUFggcGhhc2Ug Y2FjaGUgaW4gTWVybGluIHdhcyBjb21wbGV0ZWQgYW5kIG1lcmdlZC4gSXNzdWVzIHdlcmUgb3Bl bmVkIHVwc3RyZWFtIG9uIGhvdyB0b29scyB0aGF0IHVzZSBNZXJsaW4gY2FuIGJlbmVmaXQgZnJv bSB0aGUgbmV3IFBQWCBjYWNoZS4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW1wbGVtZW50ZWQgYSBza2V0Y2ggb2YgPGNvZGU+Y3Vy cmVudC1iZW5jaDwvY29kZT4gYmFja2VuZCBpbiA8Y29kZT5tZXJsLWFuPC9jb2RlPiDigJMNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9waXRhZy1oYS9tZXJsLWFuL3B1bGwvMiI+cGl0YWct aGEvbWVybC1hbiMyPC9hPi4gPC9saT48bGk+U3RhcnRlZCB3b3JrIG9uIGFkZGluZyBtZW1vcnkg dXNhZ2UgaW5mb3JtYXRpb24gdG8gTWVybGlu4oCZcyB0ZWxlbWV0cnkuIDwvbGk+PGxpPkNvbXBs ZXRlZCBhbmQgbWVyZ2VkIHRoZSBQUFggcGhhc2UgY2FjaGUgUFIg4oCTIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcHVsbC8xNTg0Ij4NCm9jYW1sL21lcmxpbiMxNTg0 PC9hPi4gLSBPcGVuZWQgaXNzdWVzIGF0IDxjb2RlPmR1bmU8L2NvZGU+IGFuZCA8Y29kZT5vY2Ft bC1sc3Atc2VydmVyPC9jb2RlPiB0byBrZWVwIHJlY29yZCBvZiB0aGUgbmVjZXNzaXRpZXMgdG8g ZW5hYmxlIHRoZSBQUFggcGhhc2UgY2FjaGUNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5JbiBE dW5lOiA8Y29kZT5kdW5lIG9jYW1sLW1lcmxpbjwvY29kZT46IGVuYWJsZSBQUFggcGhhc2UgY2Fj aGUg4oCTIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy83NzMx Ij4NCm9jYW1sL2R1bmUjNzczMTwvYT4uIDwvbGk+PGxpPkluIE9DYW1sIExTUDogSGFuZGxlIE1l cmxpbuKAmXMgUFBYIHBoYXNlIGNhY2hlIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwtbHNwL2lzc3Vlcy8xMDk1Ij4NCm9jYW1sL29jYW1sLWxzcCMxMDk1PC9hPi4g PC9saT48L3VsPg0KPC9saT48bGk+SWRlbnRpZmllZCBhbmQgZml4ZWQgYSBtZW1vcnkg4oCcbGVh a+KAnSByZWxhdGVkIHRvIHRoZSA8Y29kZT4oRiBBKS50PC9jb2RlPiBzeW50YXgsIGNhdXNpbmcg dW5jb250cm9sbGVkIG1lbW9pemF0aW9uIHRhYmxlIGdyb3d0aCDigJMNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcHVsbC8xNjA5Ij5vY2FtbC9tZXJsaW4jMTYwOTwv YT4uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzJmM2E1OTQiPjwvYT48 Yj5PQ2FtbCBMU1A8L2I+IFVzaW5nIER1bmUgUlBDIG9uIFdpbmRvd3M8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMmYzYTU5NCI+DQo8cD5Db250cmlidXRvcnM6 IEBub2piIChMZXhpRmkpIDwvcD4NCjxwPkluIE1heSwgYSBjb3VwbGUgb2YgcGF0Y2hlcyB0aGF0 IGJ1aWxkIG9uIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxs LzcwMTAiPg0Kc3VwcG9ydCBmb3Igd2F0Y2ggbW9kZSBvbiBXaW5kb3dzPC9hPiBpbnRyb2R1Y2Vk IGluIER1bmUgMy43LjAgd2VyZSBtZXJnZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvcHVsbC83NjY2Ij4NCkR1bmU8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwtbHNwL3B1bGwvMTA3OSI+T0NhbWwgTFNQPC9hPiB0byBhbGxv dyBPQ2FtbCBMU1AgdG8gdXNlIER1bmUgUlBDLiBUaGUgYWltIGlzIHRvIGVuYWJsZSBXaW5kb3dz IHVzZXJzIHRvIGxldmVyYWdlIER1bmUgUlBDIGFuZCByZWNlaXZlIGJ1aWxkIHN0YXR1c2VzIGFu ZCBtb3JlIGV4aGF1c3RpdmUgYnVpbGQgZXJyb3JzIGluIHRoZSBlZGl0b3Igd2hlbiBEdW5lDQog aXMgcnVubmluZyBpbiB3YXRjaCBtb2RlLiA8L3A+DQo8cD5EdW5lIDMuOC4wIHdhcyByZWxlYXNl ZCB3aXRoIHRoZSBhYm92ZSBwYXRjaGVzIGFuZCBhIHJlbGVhc2Ugb2YgT0NhbWwgTFNQIHdpbGwg Zm9sbG93IGluIHRoZSBjb21pbmcgd2Vla3MuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlk PSJvcmcyNTAxMjBlIj48L2E+PGI+T0NhbWwgTFNQPC9iPiBVcHN0cmVhbWluZyBPQ2FtbCBMU1Di gJlzIEZvcmsgb2YgTWVybGluPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0 ZXh0LW9yZzI1MDEyMGUiPg0KPHA+Q29udHJpYnV0b3JzOiBAdm9vZG9vcyAoVGFyaWRlcyksIEAz UmFmYWwgKFRhcmlkZXMpIDwvcD4NCjxwPlRoZSBlZmZvcnQgdG8gdXBzdHJlYW0gT0NhbWwgTFNQ 4oCZcyBmb3JrIG9mIG1lcmxpbiBjb250aW51ZWQuIE5lY2Vzc2FyeSBwYXRjaGVzIGluIE1lcmxp biBoYXZlIGJlZW4gcmV2aWV3ZWQgYW5kIG1lcmdlZC4gV29yayBhbHNvIGNvbnRpbnVlZCBvbiB0 aGUgUFIgdG8gdXNlIE1lcmxpbiBhcyBhIGxpYnJhcnkgaW4gT0NhbWwgTFNQLg0KPC9wPg0KPHA+ PGI+QWN0aXZpdGllczo8L2I+IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5SZXZpZXdl ZCBhbmQgbWVyZ2VkIHRoZSBQUiBlbmFibGluZyBjb25maWd1cmFibGUgTWVybGluIFBQL1BQWCBz cGF3bmluZyDigJMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9wdWxs LzE1ODUiPg0Kb2NhbWwvbWVybGluIzE1ODU8L2E+LiA8L2xpPjxsaT5Db250aW51ZWQgd29ya2lu ZyBvbiB0aGUgUFIgdG8gdXNlIE1lcmxpbiBhcyBhIGxpYnJhcnkgaW4gTFNQIOKAkyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtbHNwL3B1bGwvMTA3MCI+DQpvY2FtbC9v Y2FtbC1sc3AjMTA3MDwvYT4uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMGY0Njc4IiBjbGFzcz0ib3V0bGluZS00 Ij4NCjxoNCBpZD0ib3JnMzBmNDY3OCI+Rm9ybWF0dGluZyBDb2RlPC9oND4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczMGY0Njc4Ij48L2Rpdj4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZTBmNDllMSI+PC9hPjxiPk9DYW1sRm9ybWF0PC9iPiBD bG9zaW5nIHRoZSBHYXAgQmV0d2VlbiBPQ2FtbEZvcm1hdCBhbmQNCjxjb2RlPm9jcC1pbmRlbnQ8 L2NvZGU+PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2UwZjQ5 ZTEiPg0KPHA+Q29udHJpYnV0b3JzOiBAZ3BldGlvdCAoVGFyaWRlcykgYW5kIEBFbWlsZVRyb3Rp Z25vbiAoVGFyaWRlcyksIEBKdWxvdyAoVGFyaWRlcyksIEBjZWFzdGx1bmQgKEphbmUgU3RyZWV0 KQ0KPC9wPg0KPHA+VGhlIGVmZm9ydCBjb250aW51ZWQgdG8gdHVuZSB0aGUgPGNvZGU+amFuZXN0 cmVldDwvY29kZT4gcHJvZmlsZSBzbyB0aGF0IGl0IGFsaWducyBiZXR0ZXIgd2l0aCB0aGUgb3V0 cHV0IG9mDQo8Y29kZT5vY3AtaW5kZW50PC9jb2RlPi4gRGVzcGl0ZSBlbmNvdW50ZXJpbmcgZGlm ZmljdWx0aWVzIHdpdGggZm9ybWF0dGluZyDigJxjaW5hcHPigJ0gY29tbWVudHMsIGNvbnNpZGVy YWJsZSBwcm9ncmVzcyB3YXMgbWFkZSBpbiBNYXkgYW5kIHdvcmsgd2lsbCBjb250aW51ZSB0aHJv dWdob3V0IEp1bmUuDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPkFsaWduIHBhdHRlcm4gYWxpYXMg4oCTIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQvcHVsbC8yMzU5Ij4NCm9jYW1sLXBweC9v Y2FtbGZvcm1hdCMyMzU5PC9hPiA8L2xpPjxsaT5Eb2NrIDxjb2RlPmZ1bn4vfmZ1bmN0aW9uPC9j b2RlPiBvbmx5IGlmIGl0IHN0YXJ0cyBvbiB0aGUgZmlyc3QgbGluZSBvZiB0aGUgYXBwbHkg4oCT DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwv MjM2MiI+b2NhbWwtcHB4L29jYW1sZm9ybWF0IzIzNjI8L2E+DQo8L2xpPjxsaT5BbGlnbiBtb2R1 bGUgYXJndW1lbnRzIOKAkyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29j YW1sZm9ybWF0L3B1bGwvMjM2MyI+DQpvY2FtbC1wcHgvb2NhbWxmb3JtYXQjMjM2MzwvYT4gPC9s aT48bGk+UmVtb3ZlIGV4dHJhIG5ld2xpbmUgaW4gZW1wdHkgY29tbWVudHMg4oCTIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQvcHVsbC8yMzY1Ij4NCm9j YW1sLXBweC9vY2FtbGZvcm1hdCMyMzY1PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91 bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgi IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5Db25ncmF0dWxhdGlvbiB0byB0aGUgT0Nh bWwgdGVhbSBmb3IgdGhlIDIwMjMgU0lHUExBTiBwcm9ncmFtbWluZyBsYW5ndWFnZXMgc29mdHdh cmUgYXdhcmQhIPCfj4Y8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Nv bmdyYXR1bGF0aW9uLXRvLXRoZS1vY2FtbC10ZWFtLWZvci10aGUtMjAyMy1zaWdwbGFuLXByb2dy YW1taW5nLWxhbmd1YWdlcy1zb2Z0d2FyZS1hd2FyZC8xMjQzNy8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9jb25ncmF0dWxhdGlvbi10by10aGUtb2NhbWwtdGVhbS1mb3ItdGhlLTIw MjMtc2lncGxhbi1wcm9ncmFtbWluZy1sYW5ndWFnZXMtc29mdHdhcmUtYXdhcmQvMTI0MzcvMTwv YT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjc3ODllOCIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzY3Nzg5ZTgiPlN0ZXBoZW4gRGUgR2Ficmll bGxlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnNjc3ODllOCI+DQo8cD5Db25ncmF0dWxhdGlvbiB0byB0aGUgT0NhbWwgdGVhbSBmb3IgdGhl IDxiPjIwMjMgU0lHUExBTiBwcm9ncmFtbWluZyBsYW5ndWFnZXMgc29mdHdhcmUgYXdhcmQhPC9i PiDwn4+G4oCLDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL3d3dy5zaWdwbGFuLm9yZy9Bd2Fy ZHMvU29mdHdhcmUvIj5odHRwczovL3d3dy5zaWdwbGFuLm9yZy9Bd2FyZHMvU29mdHdhcmUvPC9h Pg0KPC9wPg0KPHA+KEp1c3QgYW5ub3VuY2VkIGF0IFNJR1BMQU46IEF3YXJkcyBMdW5jaCBhdCBQ TERJMjMpIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTkiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI5Ij5PdGhlciBPQ2FtbCBOZXdz PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij48L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2U3MmRkNjMiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmdlNzJkZDYzIj5Gcm9tIHRoZSBvY2FtbC5vcmcgYmxvZzwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTcyZGQ2MyI+DQo8cD5IZXJlIGFyZSBs aW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCA8YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJsb2c8L2E+LiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy12ZXJzaW9u cy9jb2JhbHQuaHRtbCI+UmVsZWFzZSBvZiBGcmFtYS1DIDI3LjAgKENvYmFsdCk8L2E+DQo8L2xp PjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdkMGMyZjc1IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnZDBjMmY3NSI+T2xk IENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnZDBjMmY3 NSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFp bHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwv YT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBv ciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+ UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2gg dG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhy ZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8iPg0K b25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZzE2ZjM4YmQi Pg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0 dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0 bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 13 Jun 2023 08:10:44 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 13 Jun 2023 08:10:44 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 13 Jun 2023 08:10:44 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35D79xFZ025323 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 13 Jun 2023 08:09:59 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 35D79naO025308 for ; Tue, 13 Jun 2023 08:09:50 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 Jun 2023 09:09:48 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 2908EE00BA; Tue, 13 Jun 2023 09:09:49 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 994F8E00BA for ; Tue, 13 Jun 2023 09:09:41 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Jun 2023 09:09:39 +0200 Received: from TM.local (eth-west-pareq2-46-193-4-180.wb.wifirst.net [46.193.4.180]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0121356006B; Tue, 13 Jun 2023 09:09:38 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZncYrBYQkWfo0akq1jCwCxsru+A== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 13 Jun 2023 08:09:38 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 0b3509e7-2fbb-4f51-844b-08db6bdd4df4 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.00,238,1681164000"; d="scan'208,217";a="112559828" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499995, queueID=57569560078 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNi0xMyBUdWUgMDk6MDcgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDYuMDYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNi4yMC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEp1bmUgMDYgdG8gMTMsIDIwMjMuIDwvcD4N CjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJsZSBv ZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJk b2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+cmVsZWFzZSBvZiBtaW5pc2F0IDAuNTwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPmNvbnRhaW5lcnMgMy4xMjwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzMiPlJlY2VudCB0YXIgcmVsZWFzZXMgKDIuNS4wLCAyLjQuMCwg4oCmKTwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzQiPm1wcC4wLjMuNiwgd2hpY2ggYWRkcyBjb21wYXRpYmlsaXR5IHdp dGggT0NhbWwgNSwgaXMgbm93IGluIG9wYW08L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNSI+dHJh Y2UgMC4xLCB0cmFjeS1jbGllbnQgMC4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+QSBzaG9y dCByZXZpZXcgb2YgZm1saWJfYnJvd3NlciAod2ViIGZyb250ZW5kIGxpYnJhcnkpPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNyI+bW9vbnBvb2wgMC4xPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+ T3RoZXIgT0NhbWwgTmV3czwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZzE4Y2MyZjYiPk9sZCBD V048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+cmVsZWFzZSBvZiBtaW5pc2F0 IDAuNTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Ut b2YtbWluaXNhdC0wLTUvMTIzMzYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXJlbGVhc2Utb2YtbWluaXNhdC0wLTUvMTIzMzYvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmZWRhMjViIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnZmVkYTI1YiI+U2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2ZlZGEyNWIiPg0KPHA+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL2MtY3ViZS9vY2FtbC1taW5pc2F0LyI+T0NhbWwtbWluaXNhdDwvYT4gMC41 IGp1c3QgbGFuZGVkIG9uIG9wYW0uDQo8L3A+DQo8cD5UaGlzIGxpYnJhcnkgaGFzIGJpbmRpbmdz IHRvIHRoZSBjbGFzc2ljIDxhIGhyZWY9Imh0dHA6Ly9taW5pc2F0LnNlLyI+bWluaXNhdDwvYT4g U0FUIHNvbHZlci4gSXQgc2hvdWxkIGhhdmUgZGVjZW50bHkgbG93IG92ZXJoZWFkIChubyBjdHlw ZXMsIHJ1bnRpbWUgbG9jayByZWxlYXNlZCwgZXRjLikgYW5kIGJlIHVzZWZ1bCBmb3IgZ2VuZXJh bCBwdXJwb3NlIFNBVCBzb2x2aW5nLiBNaW5pc2F0IGlzIG5vdCByZWFsbHkgc3RhdGUgb2YgdGhl DQogYXJ0IGFueW1vcmUsIGJ1dCBpdOKAmXMgc3RpbGwgcHJldHR5IGRhbW4gZ29vZCBmb3IgYSBs b3Qgb2YgdXNlIGNhc2VzLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnMjMzZGM5MSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzIzM2Rj OTEiPkRhcml1cyBhc2tlZCBhbmQgU2ltb24gQ3J1YW5lcyByZXBsaWVkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyMzNkYzkxIj4NCjxibG9ja3F1b3RlPg0K PHA+SnVzdCBvdXQgb2YgaW50ZXJlc3QsIHdoYXQgaXMgdGhlIHN0YXRlIG9mIHRoZSBhcnQsIGFu ZCB3aGF0IGFyZSB0aGVzZSB1c2UgY2FzZXM/DQo8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5TdGF0 ZSBvZiB0aGUgYXJ0IGlzLCByb3VnaGx5LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYXJt aW5iaWVyZS9jYWRpY2FsIj4NCkNhZGljYWw8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vYXJtaW5iaWVyZS9raXNzYXQiPktpc3NhPC9hPiAoeWVzLCBib3RoIGFyZSBmcm9tIEFy bWluIEJpZXJlKS4gVGhleeKAmXJlIGJldHRlciBvbiBoYXJkIFNBVCBpbnN0YW5jZXMsIHRoZSBv bmVzIHRoYXQgc3RpbGwgdGFrZSBhIHdoaWxlIHRvIHNvbHZlLg0KPC9wPg0KPHA+VGhlc2UgbWlu aXNhdCBiaW5kaW5ncyBjb3VsZCBiZSB1cGRhdGVkIGF0IGxlYXN0IHRvIEdsdWNvc2UgKGEga25v d24gcGF0Y2ggdG8gbWluaXNhdCB3aXRoIGJldHRlciBoZXVyaXN0aWNzKSwgbWF5YmUgSeKAmWxs IGRvIHRoYXQgYXQgc29tZSBwb2ludC4NCjwvcD4NCjxwPlRoZSB1c2UgY2FzZXM6IGFueXRoaW5n IHdoZXJlIHlvdSB3YW50IHRvIHNvbHZlIGEgTlAtY29tcGxldGUgcHJvYmxlbSAocmVnaXN0ZXIg YWxsb2NhdGlvbiBmb3IgZXhhbXBsZTsgc3Vkb2t1IHNvbHZpbmc7IGFsc28gYSBsb3Qgb2YgdmVy aWZpY2F0aW9uIHByb2JsZW1zIGNhbiBiZW5lZml0IGZyb20gYSBTQVQgZW5jb2Rpbmcgc29tZXdo ZXJlKS4gVXNpbmcgYW4gQVBJIGluc3RlYWQgb2YgY2FsbGluZyBhIHByb2Nlc3MgaXMgdXNlZnVs IGJlY2F1c2UNCiB5b3UgY2FuIGFjY2VzcyBtb3JlIHRoaW5ncyBhbmQgcGVyZm9ybSBpbmNyZW1l bnRhbCBzb2x2aW5nIGVhc2lseTogaW5zdGVhZCBvZiBzb2x2aW5nIGEgc2luZ2xlIFNBVCBwcm9i bGVtLCB5b3UgY2FuIHNvbHZlIGEgc2VyaWVzIG9mIGluY3JlYXNpbmdseSBiaWcgcHJvYmxlbXMg d2l0aG91dCBzdGFydGluZyBmcm9tIHNjcmF0Y2ggZWFjaCB0aW1lLg0KPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjIiPmNvbnRhaW5lcnMgMy4xMjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0xMi8xMjMzNy8xIj5odHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWNvbnRhaW5lcnMtMy0xMi8xMjMzNy8xPC9hPg0KPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4N2M1NGRiIiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnODdjNTRkYiI+U2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzg3YzU0ZGIiPg0KPHA+ SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2MtY3ViZS9vY2FtbC1jb250YWluZXJzL3JlbGVhc2VzL3RhZy92My4xMiI+DQpj b250YWluZXJzIDMuMTI8L2E+LiA8L3A+DQo8cD5Db250YWluZXJzIGlzIGEgbGlnaHR3ZWlnaHQg YW5kIG1vZHVsYXIgZXh0ZW5zaW9uIG9mIHRoZSBzdGFuZGFyZCBsaWJyYXJ5LiBJdCBlbnJpY2hl cyBleGlzdGluZyBtb2R1bGVzIGFuZCBhZGRzIGEgZmV3IHRoYXQgYXJlIG1pc3NpbmcuDQo8L3A+ DQo8cD5JbiB0aGlzIHJlbGVhc2UsIHRoZSBoaWdobGlnaHRzIGFyZTogPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPm1vcmUgZnVuY3Rpb25zIGluIDxjb2RlPlNldDwvY29kZT4gYW5kIDxj b2RlPkFycmF5PC9jb2RlPiA8L2xpPjxsaT5hIG5ldyA8Y29kZT5jb250YWluZXJzLnBwPC9jb2Rl PiBzdWJsaWJyYXJ5LCB3aXRoIFdhZGxlci1zdHlsZSBwcmV0dHkgcHJpbnRpbmcgY29tYmluYXRv cnMNCjwvbGk+PGxpPmltcHJvdmVtZW50cyB0byB0aGUgcGFyc2VyIGNvbWJpbmF0b3JzICg8Y29k ZT5DQ1BhcnNlPC9jb2RlPikgPC9saT48bGk+YSB3aG9sZSBidWNrZXQgb2YgYnVnZml4ZXMgPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPlJlY2VudCB0YXIgcmVsZWFzZXMg KDIuNS4wLCAyLjQuMCwg4oCmKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvcmVjZW50LXRhci1yZWxlYXNlcy0yLTUtMC0yLTQtMC8xMjM2Mi8xIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9yZWNlbnQtdGFyLXJlbGVhc2VzLTItNS0wLTItNC0wLzEyMzYyLzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzVkMzM0ZSIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc1ZDMzNGUiPlJleW5pciBCasO2cm5zc29u IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn NzVkMzM0ZSI+DQo8cD5J4oCZbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHRh ci4yLjUuMCBlYXJsaWVyIHRoaXMgd2Vlay4gPC9wPg0KPHA+VGhpcyByZWxlYXNlIGFuZCB0aGUg cHJldmlvdXMgcmVsZWFzZSBpbXByb3ZlcyBQQVggc3VwcG9ydCwgbWlyYWdlIGtleS12YWx1ZSB3 cml0ZSBzdXBwb3J0IGFuZCBidWcgZml4ZXM6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+aW4gMi40LjAgdGhlIHBheCBnbG9iYWwgaGVhZGVyIGlzIHByb3Blcmx5IHNraXBwZWQgd2hl biByZWFkaW5nIC0gcHJldmlvdXMgcmVsZWFzZXMgZGlkIG5vdCBza2lwIHRoZSBoZWFkZXIgcHJv cGVybHkgd2hpY2ggd291bGQgcmVzdWx0IGluIGEgY29ycnVwdCByZWFkLiBJbiBhIGZ1dHVyZSBy ZWxlYXNlIHRoZSBnbG9iYWwgaGVhZGVyIHdpbGwgYmUgcmVhZCBhbmQgdXNlZC4gTW9yZSBvbiB0 aGF0IGxhdGVyLg0KPC9saT48bGk+aW4gMi41LjAgdGhlIGZpbGUgbmFtZSBhbmQgbGluayBuYW1l IGFyZSB1c2VkIGZyb20gcGVyLWZpbGUgcGF4IGhlYWRlcnMsIGlmIHByZXNlbnQuDQo8L2xpPjxs aT5pbiAyLjQuMCB0aGUgdXN0YXIgdmVyc2lvbiBpcyBjb3JyZWN0bHkgZW5jb2RlZCB3aGlsZSB3 cml0aW5nLiBUaGlzIGRpZCBub3Qgc2VlbSB0byBjYXVzZSBhbnkgaXNzdWVzIHdpdGggb3RoZXIg aW1wbGVtZW50YXRpb25zLiBVbmZvcnR1bmF0ZWx5LCB0aGlzIGlzIGEgYnJlYWtpbmcgY2hhbmdl LCBhbmQgbWF5IGJyZWFrIHJlcHJvZHVjaWJpbGl0eSBvZiBhcmNoaXZlcyB3cml0dGVuIHdpdGgg cHJpb3IgdmVyc2lvbnMgb2Ygb2NhbWwtdGFyLg0KPC9saT48bGk+ZWFybGllciByZWxlYXNlcyB0 aGUgcGFzdCB5ZWFyIGhhdmUgYmVlbiBmb2N1c2VkIG9uIGFkZGluZyB3cml0ZSBzdXBwb3J0IHRv IHRoZSB0YXItYmFja2VkIG1pcmFnZSBrZXktdmFsdWUgc3RvcmUNCjxjb2RlPnRhci1taXJhZ2U8 L2NvZGU+LiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzJlMjQ4OTUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcyZTI0ODk1Ij5GdXR1cmUg cmVsZWFzZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMmUy NDg5NSI+DQo8cD5JIGFtIHdvcmtpbmcgb24gdGhlIG5leHQgcmVsZWFzZSB3aGljaCB3aWxsIHN1 cHBvcnQgdGhlIGdsb2JhbCBQQVggaGVhZGVyLiBUaGlzIGludHJvZHVjZXMgYWRkaXRpb25hbCBn bG9iYWwgc3RhdGUgaW4gdGhlIHJlYWRlciwgYW5kIHdpbGwgYmUgYSBicmVha2luZyBjaGFuZ2Uu IEFkZGl0aW9uYWxseSwgb2xkIGFuZCAobW9zdGx5KSB1bnVzZWQgbW9kdWxlcyBhbmQgZnVuY3Rp b25zIHdpbGwgYmUgcmVtb3ZlZC4gSWYgeW91IHVzZSBhbnkgb2YNCiB0aGUgYml0cyBiZWluZyBy ZW1vdmVkIHBsZWFzZSBmZWVsIGZyZWUgdG8gY2hpbWUgaW4gYW5kIGNvbW1lbnQgb24gd2hhdCB5 b3XigJlkIGxpa2UgdG8gc2VlIGtlcHQuIFRoZSB3b3JrIGluIHByb2dyZXNzIGNhbiBiZSB2aWV3 ZWQgYXQ6DQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL29jYW1sLXRhci9wdWxs LzEyNyI+aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9vY2FtbC10YXIvcHVsbC8xMjc8L2E+DQo8 L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5tcHAuMC4zLjYsIHdoaWNo IGFkZHMgY29tcGF0aWJpbGl0eSB3aXRoIE9DYW1sIDUsIGlzIG5vdyBpbiBvcGFtPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbXBwLTAtMy02LXdoaWNoLWFkZHMt Y29tcGF0aWJpbGl0eS13aXRoLW9jYW1sLTUtaXMtbm93LWluLW9wYW0vMTIzNzYvMSI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1wcC0wLTMtNi13aGljaC1hZGRzLWNvbXBhdGli aWxpdHktd2l0aC1vY2FtbC01LWlzLW5vdy1pbi1vcGFtLzEyMzc2LzE8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2RmYTZiZWEiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmdkZmE2YmVhIj5QaGlsaXBwZSBXYW5nIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZGZhNmJlYSI+DQo8cD5tcHAu MC4zLjYsIHdoaWNoIGFkZHMgY29tcGF0aWJpbGl0eSB3aXRoIE9DYW1sIDUsIGlzIG5vdyBpbiBv cGFtISA8L3A+DQo8cD48Yj5NUFAgaXMgYSBwcmVwcm9jZXNzb3IsIGFuZCBhbHNvIGEgbWV0YXBy ZXByb2Nlc3Nvci48L2I+IDwvcD4NCjxwPkFzIGEgcHJlcHJvY2Vzc29yLCBpdOKAmXMgcXVpdGUg c2ltcGxlIGFuZCBtYXliZSBldmVuIG1pbmltYWxpc3RpYy4gPC9wPg0KPHA+QXMgYSBtZXRhIHBy ZXByb2Nlc3NvciwgaXTigJlzIHZlcnkgcG93ZXJmdWwsIHNpbmNlIGl0IGFsbG93cyB5b3UgdG8g c2ltcGx5IHVzZSBPQ2FtbCAoYW5kIGFsbW9zdCBhbnkgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UpIGFz IHlvdXIgcHJlcHJvY2Vzc2luZyBsYW5ndWFnZS4NCjwvcD4NCjxwPkhhdmUgZnVuISA8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+dHJhY2UgMC4xLCB0cmFjeS1jbGllbnQgMC4xPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdHJhY2UtMC0xLXRyYWN5 LWNsaWVudC0wLTEvMTIzODMvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRy YWNlLTAtMS10cmFjeS1jbGllbnQtMC0xLzEyMzgzLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnNDliMmRlMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzQ5YjJkZTIiPlNpbW9uIENydWFuZXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0OWIyZGUyIj4NCjxwPknigJltIHF1aXRlIGdp ZGR5IHRvIGFubm91bmNlIHRoZSBpbml0aWFsIHJlbGVhc2Ugb2YgbXkgbGlicmFyeSA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3RyYWNlIj4NCnRyYWNlPC9hPiwgYW5kIG9mIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9pbWFuZHJhLWFpL29jYW1sLXRyYWN5Ij50cmFjeS1j bGllbnQ8L2E+IChzcG9uc29yZWQgYnkgbXkgZW1wbG95ZXIsIEltYW5kcmEpLg0KPC9wPg0KPHA+ VHJhY2UgaXMgYSBsaWdodHdlaWdodCBsaWJyYXJ5IGRlc2lnbmVkIGZvciBpbnN0cnVtZW50aW5n IGxpYnJhcnkgYW5kIGV4ZWN1dGFibGUgY29kZSB3aXRoIGEgbG93IGRlcGVuZGVuY3kgY29zdC4g SXQgcHJvdmlkZXMgYWJzdHJhY3Rpb25zIGZvciBiYXNpYyBsb2dnaW5nLCB0cmFjZXMgKHNwYW5z KSwgYW5kIG1ldHJpY3MsIHdpdGggYSBsb3cgZm9vdHByaW50LiBUaGUgZ29hbCBpcyB0aGF0IGl0 4oCZcyBvayB0byBkZXBlbmQgb24gaXQgaW4gbGlicmFyaWVzLA0KIGFuZCBpdCBjb3N0cyBhbG1v c3Qgbm90aGluZyBhdCBydW50aW1lIGluIHRoZSBhYnNlbmNlIG9mIGEgY29sbGVjdG9yLiBUaGUg Y29zdCBvZiBhIGNhbGwgaW4gdGhlIGFic2VuY2Ugb2YgYSBjb2xsZWN0b3IgaXMgYmFzaWNhbGx5 IGFuIGF0b21pYyBsb2FkIGFuZCBhIGNvbXBhcmlzb24gdG8NCjxjb2RlPk5vbmU8L2NvZGU+LiA8 L3A+DQo8cD5BIGNvbGxlY3RvciBpcyBhIGJhY2tlbmQgdGhhdCBpcyB0eXBpY2FsbHkgcmVnaXN0 ZXJlZCBhdCBwcm9ncmFtIHN0YXJ0dXAuIE9ubHkgYXBwbGljYXRpb25zIHNob3VsZCBldmVyIHNw ZWNpZnkgYSBiYWNrZW5kLiBUaGVyZSBpcyBhIHNpbXBsZQ0KPGNvZGU+dHJhY2UtdGVmPC9jb2Rl PiBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgYSBiYWNrZW5kIHRoYXQgd3JpdGVzIGludG8gYSAuanNv biBmaWxlIGluIHRoZSBDYXRhcHVsdC9URUYgZm9ybWF0IChjb21wYXRpYmxlIHdpdGgNCjxjb2Rl PmNocm9tZTovL3RyYWNpbmc8L2NvZGU+IGluIGNocm9tZSwgYW5kIHdpdGggPGEgaHJlZj0iaHR0 cHM6Ly91aS5wZXJmZXR0by5kZXYvIj4NCnBlcmZldHRvPC9hPikuIDwvcD4NCjxwPldoaWNoIGJy aW5ncyBtZSB0byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaW1hbmRyYS1haS9vY2FtbC10 cmFjeSI+dHJhY3ktY2xpZW50PC9hPi4gSXQgaXMgYSBsaWJyYXJ5IHRoYXQgcHJvdmlkZXMgZGly ZWN0IGJpbmRpbmdzIHRvIHRoZSBleGNlbGxlbnQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS93b2xmcGxkL3RyYWN5Ij5UcmFjeTwvYT4gcHJvamVjdC4gSXQgYWxzbyBjb21lcyB3aXRoIFt0 cmFjeS1jbGllbnQudHJhY2VdLCB3aGljaCBwcm92aWRlcyBhIFRyYWNlIGJhY2tlbmQgdGhhdCBm b3J3YXJkcyBldmVudHMgdG8gVHJhY3kgb3ZlciB0aGUgbmV0d29yayAod2hpbGUgdGhlIHByb2dy YW0gaXMgcnVubmluZykuIEl0IGNhbiBiZSBxdWl0ZSB1c2VmdWwgZm9yIGludGVyYWN0aXZlIHBy b2dyYW1zDQogc3VjaCBhcyBnYW1lcywgYnV0IGFsc28gZm9yIENQVS1vcmllbnRlZCBwcm9ncmFt cyBpbiBnZW5lcmFsLiBUaGUgYmluZGluZ3Mgd29yaywgYnV0IHRoZXkgZG9u4oCZdCBjb3ZlciB0 aGUgZnVsbCBleHRlbnQgb2YgVHJhY3kgeWV0ICh3aGljaCBub3RhYmx5IGluY2x1ZGUgZnJhbWVz IGZvciBncmFwaGljIHByb2dyYW1zKS4NCjwvcD4NCjxwPlNvIGZhciB0aGVzZSBhcmUgdGhlIHR3 byByZWxlYXNlZCBiYWNrZW5kcyBmb3IgVHJhY2UsIGJ1dCBJIGhhdmUgYSBPcGVudGVsZW1ldHJ5 IGJhY2tlbmQgaW4gdGhlIHdvcmtzOyBpdCB3b27igJl0IGNvdmVyIHRoZSBkZXB0aCBvZiBvcHRp b25zIG9mIE9URUwgYnV0IGl0IHdpbGwgbWFrZSBpdCBwb3NzaWJsZSB0byByZXVzZSB0cmFjZS1i YXNlZCBpbnN0cnVtZW50YXRpb24gd2l0aCBhbnkgT1RFTCBjb2xsZWN0b3IuIEFub3RoZXIgZXhj aXRpbmcNCiBwb3NzaWJpbGl0eSB3aXRoIE9DYW1sIDUuMSBpcyB0byB1c2UgdGhlIHVwY29taW5n IDxjb2RlPlJ1bnRpbWVfZXZlbnRzPC9jb2RlPiAoYW5kIGN1c3RvbSB1c2VyIGV2ZW50cykgdG8g Zm9yd2FyZCB0cmFjZSBldmVudHMgdG8gYW4gZXh0ZXJuYWwgbG9nZ2VyIHdpdGggbG93IG92ZXJo ZWFkLg0KPC9wPg0KPHA+RG9jcyBmb3IgVHJhY2UgY2FuIGJlIGZvdW5kIDxhIGhyZWY9Imh0dHBz Oi8vYy1jdWJlLmdpdGh1Yi5pby90cmFjZS8iPmhlcmU8L2E+LiBUcmFjZSBpcyBsaWNlbnNlZCB1 bmRlciB0aGUgTUlUIGxpY2Vuc2UsIGFuZCB0cmFjeS1jbGllbnQgdW5kZXIgQlNELTMuDQo8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+QSBzaG9ydCByZXZpZXcgb2YgZm1saWJfYnJv d3NlciAod2ViIGZyb250ZW5kIGxpYnJhcnkpPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hLXNob3J0LXJldmlldy1vZi1mbWxpYi1icm93c2VyLXdlYi1mcm9udGVuZC1s aWJyYXJ5LzEyMzg0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Etc2hvcnQtcmV2 aWV3LW9mLWZtbGliLWJyb3dzZXItd2ViLWZyb250ZW5kLWxpYnJhcnkvMTIzODQvMTwvYT4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2FhMTE1NiIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzdhYTExNTYiPlJpY2hhcmQgSHV4dG9uIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2FhMTE1NiI+ DQo8cD5UaGlzIGlzIHByb2JhYmx5IGJldHRlciBhcyBhIGJsb2cgYXJ0aWNsZSwgYnV0IEnigJlt IGd1ZXNzaW5nIGFueW9uZSB3aG8gaXMgaW50ZXJlc3RlZCBpcyBxdWl0ZSBsaWtlbHkgdG8gZmlu ZCBpdCBoZXJlLiBJdOKAmXMganVzdCBzb21lIHNob3J0IG5vdGVzIG9uIG15IGZpcnN0IGltcHJl c3Npb25zIChhcyBhbiBvY2FtbCBiZWdpbm5lcikgb2YgdGhlDQo8YSBocmVmPSJodHRwczovL2hi ci5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxpYl9icm93c2VyLyI+Zm1saWJfYnJvd3NlcjwvYT4g d2ViLWFwcCBsaWJyYXJ5Lg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc5NjhhYzVlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnOTY4YWM1ZSI+U3Vt bWFyeTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOTY4YWM1 ZSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+UG9ydCBvZiA8YSBocmVmPSJodHRwczovL2Vs bS1sYW5nLm9yZy8iPkVsbTwvYT4gdG8gb2NhbWwgJiM0MzsganNfb2Zfb2NhbWwgPC9saT48bGk+ QXZhaWxhYmxlIG9uIG9wYW0gd2l0aCBzb3VyY2Ugb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL2hici9mbWxpYiI+aHR0cHM6Ly9naXRodWIuY29tL2hici9mbWxpYjwvYT4NCjwvbGk+PGxp PlNlZW1zIGxpa2UgYW4gYWNjdXJhdGUgcG9ydCAtIGNvdmVycyBhbGwgdGhlIGJhc2ljcyA8L2xp PjxsaT5Hb29kIGRvY3VtZW50YXRpb24gPC9saT48bGk+RWFzeSB0byBzdGFydCB1c2luZyA8L2xp PjxsaT5Eb27igJl0IGZvcmdldCB0byBidWlsZCB3aXRoIDxjb2RlPi0tcHJvZmlsZT1yZWxlYXNl PC9jb2RlPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnMmM4MTJkYyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzJjODEyZGMi PkVsbSBhbmQgdGhlIGJhc2ljcyBvZiB0aGUgcG9ydDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnMmM4MTJkYyI+DQo8cD48YSBocmVmPSJodHRwczovL2VsbS1s YW5nLm9yZy8iPkVsbTwvYT4gaXMgcGVyaGFwcyB0aGUgYmVzdCBrbm93biBvZiB0aGUgZnVuY3Rp b25hbCBjb21waWxlLXRvLWphdmFzY3JpcHQgbGFuZ3VhZ2VzIGFuZCBpcyBwYXJ0aWN1bGFybHkg YXR0cmFjdGl2ZSB0byBmdW5jdGlvbmFsIGJlZ2lubmVycy4gSXQgaGFzIGEgZm9jdXMgb24gZ29v ZCBlcnJvciBtZXNzYWdlcyBhbmQgc2ltcGxpY2l0eS4gSXTigJlzIG92ZXJhbGwgYXJjaGl0ZWN0 dXJlIChnbG9iYWwNCiBtb2RlbCwgbm8gc2lkZSBlZmZlY3RzLCB1cGRhdGUgbWVzc2FnZXMpIGhh cyBiZWVuIGNvcGllZCBtYW55IHRpbWVzLiA8L3A+DQo8cD5UaGUgZm1saWJfYnJvd3NlciBwYWNr YWdlIGlzIHBhcnQgb2YgYSBmYW1pbHkgb2YgZnVuY3Rpb25hbC9tYW5hZ2VkLWVmZmVjdCBsaWJy YXJpZXMgZnJvbSB0aGUgc2FtZSBhdXRob3IuIEl0IGhhcyBiYXNpY2FsbHkgdGhlIHNhbWUgc3Ry dWN0dXJlIGFzIEVsbSwganVzdCB0cmFuc2xhdGVkIGludG8gb2NhbWwgd2hpY2ggaXMgdGhlbiBj b21waWxlZCB0byBqYXZhc2NyaXB0IHdpdGgganNfb2Zfb2NhbWwuDQo8L3A+DQo8cD5J4oCZbGwg bm90IHJlcGVhdCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2Mv Zm1saWJfYnJvd3Nlci9kb2MuaHRtbCI+DQpleGNlbGxlbnQgZG9jdW1lbnRhdGlvbjwvYT4gYW5k IGluIGFueSBjYXNlIGZvciBhIGdlbmVyYWwgb3ZlcnZpZXcgeW91IGNhbiBwcm9iYWJseSByZWx5 IG9uIHRoZSBFbG0gaW50cm9kdWN0b3J5IG1hdGVyaWFsIHRvby4NCjwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczZDYzZDYwIiBjbGFzcz0ib3V0bGlu ZS00Ij4NCjxoNCBpZD0ib3JnM2Q2M2Q2MCI+SW4gdXNlPC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmczZDYzZDYwIj4NCjxwPkJvcmluZyBpbiB0aGUgYmVzdCB3 YXkuIERvZXMgd2hhdCBpdCBzYXlzIG9uIHRoZSB0aW4uIFRoZXJlIGFyZSBzb21lIGRvY3Mgb24g aG9va2luZyBpdCB1cCB0byBkdW5lIGFuZCBpdCB3b3JrcyB3aXRoIG9jYW1sIDUuMC4NCjwvcD4N CjxwPkNvbXBpbGF0aW9uIHNlZW1zIHByZXR0eSBmYXN0LCBidXQgYmUgYXdhcmUgdGhhdCBieSBk ZWZhdWx0IHlvdSB3aWxsIGdldCBhIGphdmFzY3JpcHQgZmlsZSB0aGF0IHN0YXJ0cyBhdCBhYm91 dCA1TUIuIElmIHlvdSBydW4NCjxjb2RlPmR1bmUgYnVpbGQgLS1wcm9maWxlPXJlbGVhc2U8L2Nv ZGU+IHRoZW4gdGhlIG91dHB1dCB3aWxsIGJlIHN0cmlwcGVkIGFuZCBtaW5pbWlzZWQgYW5kIHlv dSB3aWxsIGJlIGNsb3NlciB0byAxMDBLQi4gV2hlbiBnemlwcGVkIGZvciB0cmFuc2ZlciB0aGlz IHdpbGwgY29tZSBkb3duIHRvIGFib3V0IDMzS0IgYXMgYSBzdGFydGluZyBwb2ludC4NCjwvcD4N CjxwPlRoYXQgc291bmRzIGxhcmdlLCBidXQgaXQgaW5jcmVhc2VzIGZhaXJseSBzbG93bHkgZnJv bSB0aGF0IHBvaW50IGFzIHlvdSBhZGQgYWN0dWFsIGNvZGUuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2M4NjhhZSIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzdjODY4YWUiPldobyBpcyB0aGlzIGZvcj88L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzdjODY4YWUiPg0KPHA+SWYgeW91IGxpa2Ug dGhlIGlkZWEgb2YgRWxtLCBhcmUgYWxyZWFkeSB3b3JraW5nIGluIE9DYW1sIGFuZCBkb27igJl0 IG5lZWQgYSBsYXJnZSBlY29zeXN0ZW0gdGhpcyBtaWdodCBkbyB3aGF0IHlvdSB3YW50LiBJdOKA mXMgbm90IHN1aXRlZCB0byBzbWFsbCBwbHVnaW5zIGJ1dCBmb3IgYSBkYXNoYm9hcmQgb3Igb3Ro ZXIgYXBwbGljYXRpb24geW91IHdvdWxkIGxlYXZlIG9wZW4gZm9yIGEgbG9uZyB0aW1lIHNob3Vs ZCB3b3JrIGZpbmUuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5t b29ucG9vbCAwLjE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTci Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1t b29ucG9vbC0wLTEvMTIzODcvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tb29u cG9vbC0wLTEvMTIzODcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnODFmYzlkNSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzgxZmM5ZDUi PlNpbW9uIENydWFuZXMgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc4MWZjOWQ1Ij4NCjxwPknigJltIGhhcHB5IHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvbW9vbnBvb2wvIj4N Cm1vb25wb29sPC9hPiAwLjEuIE1vb25wb29sLCBzbyBmYXIsIGlzIG1vc3RseSBhbiBleHBlcmlt ZW50LCBidXQgaXMgaW4gYSB1c2FibGUgc3RhdGUgYWxyZWFkeS4NCjwvcD4NCjxwPlNvIHdoYXQg aXMgbW9vbnBvb2w/IEl04oCZcyBteSBnbyBhdCBzdGFydGluZyB0byBsZXZlcmFnZSBPQ2FtbCA1 IGZvciBtdWx0aWNvcmUgY29tcHV0YXRpb25zLiBVbmxpa2Ugb3RoZXIgYXBwcm9hY2hlcywgaXQg cmVsaWVzDQo8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5oZWF2aWx5PC9zcGFuPiBvbiBjbGFzc2lj IDxjb2RlPlRocmVhZC50PC9jb2RlPiwgYmVjYXVzZSB1bmxpa2UgZG9tYWlucyBpdOKAmXMgb2sg dG8gY3JlYXRlIG1hbnkgb2YgdGhlbSBhbmQgaGF2ZSBzb21lIGJsb2NrIG9uIElPIG9yIGxvbmcg cnVubmluZyBDIGNhbGxzLiBBIHBvb2wgcHJvdmlkZXMgYQ0KPGNvZGU+cnVuOiAodW5pdCAtJmd0 OyB1bml0KSAtJmd0OyB1bml0PC9jb2RlPiBmdW5jdGlvbiB0aGF0IHJ1bnMgdGhlIHRhc2sgKGl0 cyBhcmd1bWVudCkgb250byBvbmUgb2YgdGhlIHBvb2zigJlzIHdvcmtlcnMgYXQgYSBsYXRlciBk YXRlLg0KPC9wPg0KPHA+TW9vbnBvb2wgd29ya3MgYnkgYWxsb2NhdGluZywgYXQgc3RhcnR1cCwg YSBmaXhlZCBwb29sIG9mIGRvbWFpbnMsIG9mIHRoZSByZWNvbW1lbmRlZCBzaXplLlteMV0gRnJv bSB0aGVyZSwgdGhlIHVzZXIgY2FuIGNyZWF0ZSBhIG51bWJlciBvZiByZWd1bGFyDQo8YSBocmVm PSJodHRwczovL2MtY3ViZS5naXRodWIuaW8vbW9vbnBvb2wvbW9vbnBvb2wvTW9vbnBvb2wvUG9v bC9pbmRleC5odG1sIj50aHJlYWQgcG9vbHM8L2E+LCBlYWNoIG9mIHdoaWNoIHdpbGwgYmUgZGlz dHJpYnV0ZWQgb3ZlciB0aGUgcG9vbCBvZiBkb21haW5zIHNvIHRoYXQgdGhlIHRocmVhZHMgY2Fu IHJ1biBpbiBwYXJhbGxlbC4gSXTigJlzIHBlcmZlY3RseSBwb3NzaWJsZSB0byBoYXZlLCBvbiBh IDE2IGNvcmUgbWFjaGluZSwgYSBwb29sDQogb2YgNTAgSU8gdGhyZWFkcyBmb3Igc29tZSBzZXJ2 ZXIsIGFsb25nIHdpdGggYSBwb29sIG9mIDE2IGNvbXB1dGUgdGhyZWFkcy4gPC9wPg0KPHA+TW9v bnBvb2wgYWxzbyBwcm92aWRlcyBhIDxhIGhyZWY9Imh0dHBzOi8vYy1jdWJlLmdpdGh1Yi5pby9t b29ucG9vbC9tb29ucG9vbC9Nb29ucG9vbC9GdXQvaW5kZXguaHRtbCI+DQpGdXQ8L2E+dXJlIGFi c3RyYWN0aW9uLiBUaGVzZSBmdXR1cmVzIGFyZSB0aHJlYWQgc2FmZTsgdGhlIGNvbWJpbmF0b3Jz IHN1Y2ggYXMgPGNvZGU+DQptYXA8L2NvZGU+LCA8Y29kZT5iaW5kPC9jb2RlPiwgZXRjLiBjYW4g dGhlbXNlbHZlcyBydW4gb24gcG9vbHMuIEZ1dHVyZXMgYXJlIHF1aXRlIGxpZ2h0d2VpZ2h0IGFu ZCB1c2UgYW4NCjxjb2RlPkF0b21pYy50PC9jb2RlPiB2YXJpYWJsZSBmb3Igc3RvcmFnZSwgbm8g bG9jayBuZWVkZWQuW14yXSA8L3A+DQo8cD5MYXN0bHk6IG1vb25wb29sIDxzcGFuIGNsYXNzPSJ1 bmRlcmxpbmUiPmFsc288L3NwYW4+IHdvcmtzIG9uIE9DYW1sICZndDs9IDQuMDgsIGJ5IHNpbXBs eSByZWR1Y2luZyB0byByZWd1bGFyIHRocmVhZCBwb29scyBydW5uaW5nIG9uIGEgc2luZ2xlIGRv bWFpbi4gVGhpcyBzaG91bGQgYWxsb3cgdXNlcnMgdG8gdXNlIG1vb25wb29sIG9uIDQueHgsIGJl Zm9yZSBtaWdyYXRpbmcgdG8gNS54eCBvbiB0aGVpciBvd24gdGltZS4NCjwvcD4NCjxwPkRvY3Vt ZW50YXRpb24gaXMgPGEgaHJlZj0iaHR0cHM6Ly9jLWN1YmUuZ2l0aHViLmlvL21vb25wb29sLyI+ aGVyZTwvYT4uIEl04oCZcyByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuDQo8L3A+DQo8 cD5Db250cmlidXRpb25zIG9yIGRpc2N1c3Npb25zIGFyZSB2ZXJ5IHdlbGNvbWUuIFRoaXMgaXMg dmVyeSBlYXJseSBkYXlzIGZvciB0aGlzIHByb2plY3QsIGFuZCBJIGhhdmUgbG90cyB0byBsZWFy bi4gVGhlIHRhc2sgc2NoZWR1bGVyIGlzIHF1aXRlIHNpbXBsZSBhbmQgd2lsbCBwcm9iYWJseSBu b3QgY29tcGV0ZSB3aXRoIGRvbWFpbnNsaWIgb24gc3VwZXItZmluZSBncmFpbmVkIHRhc2tzOyBi dXQgZm9yIHVzZSBjYXNlcyB3aGVyZSB0YXNrcw0KIGFyZSBub3QgdGhhdCB0aW55IEkgdGhpbmsg aXQgd29ya3MgcGVyZmVjdGx5IGZpbmUgYWxyZWFkeS4gPC9wPg0KPHA+W14xXTogYmFzaWNhbGx5 IDxjb2RlPkRvbWFpbi5yZWNvbW1lbmRlZF9kb21haW5fY291bnQoKS0xPC9jb2RlPiBvbiBPQ2Ft bCA1LiA8L3A+DQo8cD5bXjJdOiBleGNlcHQgZm9yIDxjb2RlPkZ1dC53YWl0X2Jsb2NrPC9jb2Rl Piwgd2hpY2ggaXMgbGlrZSBhbiBlbnRyeXBvaW50IGFuZCBzaG91bGQgYmUgY2FsbGVkIOKAnGZy b20gdGhlIG91dHNpZGXigJ0uIE1vcmUgaW4gdGhlIGRvY3VtZW50YXRpb24uDQo8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+T3RoZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdiYTdkYmFmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmE3ZGJh ZiI+RnJvbSB0aGUgb2NhbWwub3JnIGJsb2c8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2JhN2RiYWYiPg0KPHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9D YW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8i Pg0KdGhlIG9jYW1sLm9yZyBibG9nPC9hPi4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PjxhIGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL2Jsb2cvZmxvcmlhbi1jb21waWxlci13 ZWVrbHktMjAyMy0wNS0wNiI+RmxvcmlhbuKAmXMgT0NhbWwgY29tcGlsZXIgd2Vla2x5LCA1IEp1 bmUgMjAyMzwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzE4Y2MyZjYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSJvcmcxOGNjMmY2Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC1vcmcxOGNjMmY2Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91 IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNl bmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0K dGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+ SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1h eSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1s LW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1l IiBpZD0ib3JnNTEyNGRlZSI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 6 Jun 2023 15:23:35 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 6 Jun 2023 15:23:34 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 6 Jun 2023 15:23:34 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 356EMnT8013886 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 6 Jun 2023 15:22:49 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 356EMYwH013869 for ; Tue, 6 Jun 2023 15:22:34 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 06 Jun 2023 16:22:32 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 24FC7E0CE1; Tue, 6 Jun 2023 16:22:32 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 3905CE00BA for ; Tue, 6 Jun 2023 16:22:26 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jun 2023 16:22:23 +0200 Received: from TM.local (unknown [131.254.161.230]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 33B5E564617; Tue, 6 Jun 2023 16:22:22 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZmIJ69VKLik1PnUyDfJ8P5mEkFA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 6 Jun 2023 15:22:10 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 7894e649-7191-4f7e-297d-08db66999cc4 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.00,221,1681164000"; d="scan'208,217";a="111529962" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499998, queueID=A81EF564621 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <212B64C44DDA8449B2F7C7A67A406DBA@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNi0wNiBUdWUgMTY6MjAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDUuMzAuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNi4xMy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1heSAzMCB0byBKdW5lIDA2LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5NZWV0dXAgZ3JvdXAgaW4gTmV3 IFlvcmsgQ2l0eTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPkNyZWF0aW5nIGEgdHV0b3JpYWwg b24gc2VxdWVuY2VzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+bmV3IHJlbGVhc2U6IE1lcmxp biA0Ljk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5UYWtpbmcgSW52ZW50b3J5IG9mIHRoZSBP Q2FtbCBFY29zeXN0ZW0gb24gT0NhbWwub3JnPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNSI+TmV3 IHJlbGVhc2U6IERvY3VMaWIgMS4zLjU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5vcGFtIDIu MS41IHJlbGVhc2UhPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+ZHVuZSAzLjguMDwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzgiPlNlY29uZCBhbHBoYSByZWxlYXNlIG9mIE9DYW1sIDUuMS4wPC9h PiA8L2xpPjxsaT48YSBocmVmPSIjOSI+TUzigJkyMzogQUNNIFNJR1BMQU4gTUwgRmFtaWx5IFdv cmtzaG9wIOKAlCBDYWxsIGZvciBwcmVzZW50YXRpb25zPC9hPg0KPC9saT48bGk+PGEgaHJlZj0i IzEwIj5xY2hlY2stbGluIGFuZCBxY2hlY2stc3RtIDAuMjwvYT4gPC9saT48bGk+PGEgaHJlZj0i IzExIj5NZWxhbmdlIDEuMCDigJMgY29tcGlsZSBPQ2FtbCAvIFJlYXNvbk1MIHRvIEphdmFTY3Jp cHQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMiI+RGVidWdnaW5nIE5hdGl2ZSBDb2RlIGluIOKA nFNlY29uZCBPQ2FtbOKAnSBZb3VUdWJlIFZpZGVvPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTMi PlNhbmRtYXJrIG5pZ2h0bHkgbm93IHN1cHBvcnRzIGxhdGVuY3kgcHJvZmlsaW5nPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjMTQiPlVwZGF0ZSBvbiBFaW8gKGVmZmVjdHMtYmFzZWQgZGlyZWN0LXN0 eWxlIElPIGZvciBPQ2FtbCA1KTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzE1Ij5Jbml0aWFsIEVt aXNzaW9ucyBNb25pdG9yaW5nIG9mIHRoZSBPQ2FtbC5vcmcgSW5mcmFzdHJ1Y3R1cmU8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSIjMTYiPk90aGVyIE9DYW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiNvcmc3YWJhNTE4Ij5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjEiPk1lZXR1cCBncm91cCBpbiBOZXcgWW9yayBDaXR5PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9tZWV0dXAtZ3JvdXAtaW4tbmV3LXlvcmstY2l0eS8xMjI3MC8xIj4N Cmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tZWV0dXAtZ3JvdXAtaW4tbmV3LXlvcmstY2l0 eS8xMjI3MC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Zzk1YTA2ZGQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5NWEwNmRkIj5Bc2hpc2gg QWdhcndhbCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzk1YTA2ZGQiPg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGF0IHRoZSA8 YSBocmVmPSJodHRwczovL3d3dy5tZWV0dXAuY29tL255Yy1vY2FtbC8iPk9DYW1sIE5ZQyBNZWV0 dXA8L2E+IGlzIGJhY2shIFdlIGhhdmUgc2NoZWR1bGVkIG91ciBmaXJzdCBuZXcgZXZlbnQgZm9y IEp1bmUgMjB0aCwgd2hlcmUgd2Ugd2lsbCBkaXNjdXNzIHRoZSB1c2Ugb2YgT0NhbWwgaW4gVGV6 b3MuIFBsZWFzZSBqb2luIHRoZSBtZWV0dXAgZ3JvdXAgdG8gc3RheSBpbmZvcm1lZA0KIGFib3V0 IGZ1dHVyZSBldmVudHMuIFdlIG5vcm1hbGx5IHdpbGwgbm90IHBvc3QgdG8gdGhpcyBmb3J1bS4g PC9wPg0KPHA+V2UgYXJlIGFsd2F5cyBsb29raW5nIGZvciBzcGVha2Vycy4gUGxlYXNlIHJlYWNo IG91dCB0byBtZSBpZiB5b3UgYXJlIGluIHRoZSBOZXcgWW9yayBDaXR5IGFyZWEgYW5kIGFyZSBp bnRlcmVzdGVkIGluIGdpdmluZyBhIHRhbGsuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMiI+Q3JlYXRpbmcgYSB0dXRvcmlhbCBvbiBzZXF1ZW5jZXM8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NyZWF0aW5nLWEtdHV0b3JpYWwtb24tc2VxdWVuY2VzLzEy MDkxLzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NyZWF0aW5nLWEtdHV0b3JpYWwt b24tc2VxdWVuY2VzLzEyMDkxLzI8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNjUwYTAwYSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzY1MGEw MGEiPkN1aWh0bGF1YWMgQWx2YXJhZG8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2NTBhMDBhIj4NCjxwPlRoaXMgdHV0b3JpYWwgaXMgbm93 IG9ubGluZTogPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9zZXF1ZW5jZXMiPmh0dHBz Oi8vb2NhbWwub3JnL2RvY3Mvc2VxdWVuY2VzPC9hPg0KPC9wPg0KPHA+VGhhbmtzIHRvIE1pb2Qg VmFsbGF0LCBTYXlvIEJhbWlnZGFkZSAoQFNheVNheW8pLCBDaHJpc3RpbmUgUm9zZSAoQHByb2Zl c3Nvci5yb3NlKSwgU2FiaW5lIFNjaG1hbHR6IChAc2FiaW5lKSwgR3VpbGxhdW1lIFBldGlvdCAo QGdwZXRpb3QpLCBYYXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3KSBhbmQgU2ltb24gQ3J1YW5l cyAoQGMtY3ViZSApIGZvciB0aGVpciBmZWVkYmFjaw0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjMiPm5ldyByZWxlYXNlOiBNZXJsaW4gNC45PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2UtbWVybGluLTQtOS8xMjI3Ny8xIj4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2UtbWVybGluLTQtOS8xMjI3 Ny8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzkxNzQ3 NTYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5MTc0NzU2Ij52ZHMgYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc5MTc0NzU2Ij4N CjxwPkkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIG5ldyByZWxlYXNlIG9mIE1lcmxpbiEgPC9w Pg0KPHA+TWVybGluIGlzIGFuIGVkaXRvciBzZXJ2aWNlIHRoYXQgcHJvdmlkZXMgbW9kZXJuIElE RSBmZWF0dXJlcyBmb3IgT0NhbWwuIDwvcD4NCjxwPlRoaXMgbmV3IHJlbGVhc2UgYnJpbmdzIGEg bnVtYmVyIG9mIGltcHJvdmVtZW50cyBhbmQgYnVnIGZpeGVzLiBJbiBwYXJ0aWN1bGFyIHdlIGlk ZW50aWZpZWQgYW5kIHBhdGNoZWQgYW4gaW1wb3J0YW50IG1lbW9yeSBjb25zdW1wdGlvbiBpc3N1 ZSB0aGF0IGNvdWxkIGdyZWF0bHkgYWZmZWN0IE1lcmxpbuKAmXMgcGVyZm9ybWFuY2UgaW4gaGVh dmlseSBmdW5jdG9yaXplZCBwcm9qZWN0cy4NCjwvcD4NCjxwPkZ1bGwgY2hhbmdlbG9nOiA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL2Jsb2IvbWFzdGVyL0NIQU5HRVMu bWQjbWVybGluLTQ5Ij4NCmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vYmxvYi9tYXN0 ZXIvQ0hBTkdFUy5tZCNtZXJsaW4tNDk8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI0Ij5UYWtpbmcgSW52ZW50b3J5IG9mIHRoZSBPQ2FtbCBFY29zeXN0ZW0gb24gT0NhbWwub3Jn PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90YWtpbmctaW52ZW50b3J5 LW9mLXRoZS1vY2FtbC1lY29zeXN0ZW0tb24tb2NhbWwtb3JnLzEyMjc4LzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3Rha2luZy1pbnZlbnRvcnktb2YtdGhlLW9jYW1sLWVjb3N5c3Rl bS1vbi1vY2FtbC1vcmcvMTIyNzgvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYzMzZWIwMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2Mz M2ViMDIiPlNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2MzM2ViMDIiPg0KPHA+d2UgaGF2ZSBhbiBvcGVuIFBSIG9u IG9jYW1sL29jYW1sLm9yZyAoPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzEyMjYiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8x MjI2PC9hPikgdG8gc2hvdyBhbiBhcHByb3hpbWF0aW9uIG9mIHdoYXQgdGhlIHN0YXRlIG9mIHRo ZSBPQ2FtbCBlY29zeXN0ZW0gaXMgd2l0aCByZXNwZWN0IHRvIGRpZmZlcmVudCB0b3BpY3MgLyB1 c2UgY2FzZXMuDQo8L3A+DQo8cD5UaGlzIGFkZGl0aW9uIGlzIGluc3BpcmVkIGJ5IFJ1c3TigJlz IGV4Y2VsbGVudCDigJxBcmUgd2UgWCB5ZXQ/4oCdIHBhZ2VzIHdoaWNoIDwvcD4NCjxvbCBjbGFz cz0ib3JnLW9sIj4NCjxsaT48Yj5oaWdobGlnaHQgbGlicmFyaWVzPC9iPiB0aGF0IGFyZSBwcm9k dWN0aW9uLXJlYWR5LCB3ZWxsLWRvY3VtZW50ZWQsIGFuZCBoYXZlIGEgbmljZSBBUEkgaW4gdGhl IGRpZmZlcmVudCBjYXRlZ29yaWVzLiBUaGlzIGlzIGENCjxiPnNob3djYXNlIHdoZXJlIHdlIHdh bnQgdG8gcHJvdWRseSBwb2ludCBuZXdjb21lcnMgdG88L2I+LiA8L2xpPjxsaT5vZmZlciBhIGhp Z2gtbGV2ZWwgb3ZlcnZpZXcgb2YgdGhlIHVzYWJpbGl0eSBvZiB0aGUgbGFuZ3VhZ2UgZm9yIGNl cnRhaW4gYXBwbGljYXRpb25zLiBUaGlzDQo8Yj5tYWtlcyB2aXNpYmxlIHdoZXJlIGNvbnRyaWJ1 dGlvbnMgdG8gdGhlIGVjb3N5c3RlbSB3b3VsZCBiZSBwYXJ0aWN1bGFybHkgdmFsdWFibGU8L2I+ IHRvIHRoZSBPQ2FtbCBjb21tdW5pdHkuIFRoZXkgcHJvdmlkZSBhIHN0YXJ0aW5nIHBvaW50IGZv ciAocHJvc3BlY3RpdmUpIHBhY2thZ2UgYXV0aG9ycyB0byBzZWUgd2hlcmUgZ2FwcyBpbiB0aGUg ZWNvc3lzdGVtIGFyZSwgc28gdGhleSBjYW4NCjxiPmNyZWF0ZSBzdWNjZXNzZnVsIG9wZW4gc291 cmNlIHByb2plY3RzIHRoYXQgbWVldCBjb21tdW5pdHkgZGVtYW5kPC9iPiEgKEkga25vdyBhdCBs ZWFzdCBvbmUgY29tcGFueSB3aGljaCBpcyBpbnRlcmVzdGVkIGluIGNvbnRyaWJ1dGluZyB0byBm dW5kaW5nIHN1Y2ggcHJvamVjdHMuIDp3aW5rOikNCjwvbGk+PC9vbD4NCjxwPlRoaXMgaXMgd2hl cmUgeW91IGNvbWUgaW46IDwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT48Yj5QbGVhc2Ug aGVscCB1cyBnaXZlIHRoZXNlIHBhZ2VzIGFuIGljb25pYyBuYW1lIC8gdGl0bGU8L2I+LiBHb3Qg YW4gaWRlYT8gUmVwbHkgdG8gdGhpcyBwb3N0ISBNYWtlIGl0IG1lbW9yYWJsZS4NCjwvbGk+PGxp PjxiPkFyZSB0aGVyZSBhbnkgaW1wb3J0YW50IGNhdGVnb3JpZXMgbWlzc2luZz88L2I+IDwvbGk+ PGxpPkNvbnRyaWJ1dGlvbnMgYXJlIGFsd2F5cyB3ZWxjb21lIC0gbm9uZSBvZiB1c2UgaGVyZSBp cyBhbiBleHBlcnQgb24gdGhlIGV2ZXItZ3Jvd2luZyBPQ2FtbCBlY29zeXN0ZW0hDQo8L2xpPjwv b2w+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01 IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+TmV3IHJlbGVhc2U6IERvY3VMaWIgMS4z LjU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctcmVsZWFz ZS1kb2N1bGliLTEtMy01LzEyMjg2LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1uZXctcmVsZWFzZS1kb2N1bGliLTEtMy01LzEyMjg2LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZjRiNTk1MCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZ2Y0YjU5NTAiPm5ndWVybW9uZCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Y0YjU5NTAiPg0KPHA+SeKAmW0gaGFwcHkgdG8g YW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBvZiBEb2N1TGliIG9uIE9QQU0sIGEgbGlnaHR3ZWlnaHQg YW5kIGVhc3kgdG8gdXNlIEdVSSBmb3IgbG9jYWxseSBtYW5hZ2luZyBtZXRhZGF0YSBmb3IgYm9v a3MsIHRleHRib29rcywgYW5kIGFydGljbGVzIChraW5kIG9mIGxpa2UgWm90ZXJvKS4gVGhpcyBy ZWxlYXNlIGlzIG1vc3RseSBmb3IgbWlub3IgZml4ZXMgYnV0IEkgd2FudCB0byB0YWtlIHRoZSBv cHBvcnR1bml0eSB0bw0KIGFkdmVydGlzZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbmd1 ZXJtb25kL2RvY3VsaWIiPkRvY3VMaWI8L2E+IGFnYWluLiA8L3A+DQo8cD5JdHMgY29yZSBmZWF0 dXJlcyBhcmUgPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmZhY2lsaXRhdGluZyBsb29r aW5nIHVwIG1ldGFkYXRhIHdpdGggYW4gaW50ZXJmYWNlIHRvIG9wZW5saWJyYXJ5Lm9yZywgc2Vt YW50aWNzY2hvbGFyLm9yZywgYW5kIGJpYnRleCByZWZlcmVuY2VzIHRocm91Z2ggY3Jvc3NyZWYu b3JnDQo8L2xpPjxsaT5hdXRvbWF0aWNhbGx5IGRldGVjdGluZyBkdXBsaWNhdGVzIChieSBtZDUg aGFzaCksIGZpbGUgcmVuYW1pbmdzLCBhbmQgZmlsZXMgbW92ZWQgYmV0d2VlbiBsaWJyYXJpZXMg d2l0aG91dCBsb3NpbmcgbWV0YWRhdGENCjwvbGk+PGxpPmtlZXBpbmcgdHJhY2sgb2YgYXV0aG9y cywgdGl0bGUsIHRhZ3MsIHBlcnNvbmFsIG5vdGVzLCBkYXRlLCBET0kvSVNCTiA8L2xpPjxsaT5l cnJvciBwZXJtaXNzaXZlIHNlYXJjaCA8L2xpPjwvdWw+DQo8cD5Gb3IgYSBmdWxsIGxpc3Qgb2Yg Y2hhbmdlcyBzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL25ndWVybW9uZC9kb2N1bGli L2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQiPg0KQ0hBTkdFUzwvYT4gPC9wPg0KPHA+RmVlbCBmcmVl IHRvIG1ha2Ugc3VnZ2VzdGlvbnMgaW4gdGhlIGNvbW1lbnRzISA8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTVhNjBiYSIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZzk1YTYwYmEiPktpcmFuIEdvcGluYXRoYW4gYXNrZWQgYW5kIG5ndWVy bW9uZCByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmc5NWE2MGJhIj4NCjxibG9ja3F1b3RlPg0KPHA+Q291bGQgeW91IGNvbW1lbnQgYSBiaXQgbW9y ZSBvbiB0aGUgY29tcGFyaXNvbiB0byB6b3Rlcm8/IEFyZSB0aGVyZSBjZXJ0YWluIGZlYXR1cmVz IGluIGRvY3VsaWIgdGhhdCB5b3UgY2Fu4oCZdCBlYXNpbHkgYWNoaWV2ZSBpbiB6b3Rlcm8/DQo8 L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5UaGUgYmlnZ2VzdCBkaWZmZXJlbmNlIGlzIHRoZSB3YXkg ZGF0YSBpcyBzdG9yZWQ6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5ab3Rlcm8gcHV0 cyBhIHByaW9yaXR5IG9uIG1ldGFkYXRhIGVudHJpZXMgd2hlcmUgYSBwaHlzaWNhbCBmaWxlIGlz IGEgY2hpbGQgb2YgdGhhdCBlbnRyeSBpZiBpdCBleGlzdHMsIHdoZXJlYXMgRG9jdUxpYiBlbnRy aWVzIGFyZSBvbmUtdG8tb25lIHdpdGggcGh5c2ljYWwgZmlsZXMgb24geW91ciBjb21wdXRlcg0K PC9saT48bGk+ZmlsZXMgYWRkZWQgdG8gWm90ZXJvIGFyZSBlaXRoZXIgc3RvcmVkIGluIGEgWm90 ZXJvIGRhdGEgZGlyZWN0b3J5IChvdmVyIHdoaWNoIHlvdSBoYXZlIG5vIGNvbnRyb2wpIG9yIGEg bGluayB0byBhIGZpbGUgb24geW91ciBjb21wdXRlciAod2hpY2ggeW91IGhhdmUgdG8ga2VlcCB0 cmFjayBvZiBtYW51YWxseSwgc28gY2xlYXJseSBub3QgdGhlIHByZWZlcnJlZCBtZXRob2QpLCB3 aGVyZWFzIERvY3VMaWIgZmlsZXMgYXJlIHN0b3JlZCBpbg0KIGxpYnJhcmllcywgb2Ygd2hpY2gg eW91IGNhbiBoYXZlIG11bHRpcGxlLiBBIGxpYnJhcnkgaXMgYSBkaXJlY3RvcnkgY29udGFpbmlu ZyBmaWxlcyB5b3Ugd2FudCBEb2N1TGliIHRvIGluZGV4LCBidXQgbWV0YWRhdGEgZm9yIHRoYXQg bGlicmFyeSBpcyBhbHNvIHN0b3JlZCBpbiB0aGF0IGxpYnJhcnkuVGhpcyBtZWFucyBsaWJyYXJp ZXMgYXJlIHBvcnRhYmxlLCBzbyB5b3UgY2FuIHNoYXJlIHRoZW0gb3Igc3luYyB0aGVtIGluZGVw ZW5kZW50bHkNCiBvZiBEb2N1TGliLiA8L2xpPjxsaT5ab3Rlcm8gc3RvcmVzIG1ldGFkYXRhIGlu IGEgZGF0YWJhc2UsIHdoZXJlYXMgRG9jdUxpYiBzdG9yZXMgbWV0YWRhdGEgYXMganNvbiBmaWxl cyBvbmUtdG8tb25lIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZG9jdW1lbnQNCjwvbGk+PC91bD4N CjxwPlNvIGluIHNob3J0LCB1c2UgRG9jdUxpYiBpZiB5b3UgYXJlIGEgZG9jdW1lbnQgaG9hcmRl ciBhbmQgd2FudCBsb2NhbCBjb250cm9sIG92ZXIgeW91ciBmaWxlcy4gSeKAmWQgc2F5IGNyZWF0 aW5nIGJpYmxpb2dyYXBoaWMgcmVmZXJlbmNlcyBpcyBub3QgdGhlIHByaW1hcnkgZm9jdXMgb2Yg RG9jdUxpYiwgd2hlcmVhcyBpdCBpcyBmb3IgWm90ZXJvLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjYiPm9wYW0gMi4xLjUgcmVsZWFzZSE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItMS01LXJlbGVhc2UvMTIyOTAvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0xLTUtcmVsZWFzZS8xMjI5MC8xPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzEyMzUzNTAiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxMjM1MzUwIj5SLiBCb3VqYmVsIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMTIzNTM1MCI+DQo8 cD5XZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcGF0Y2ggcmVsZWFzZSBvZiA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4xLjUiPg0Kb3Bh bSAyLjEuNTwvYT4uIDwvcD4NCjxwPlRoaXMgb3BhbSByZWxlYXNlIGNvbnNpc3RzIG9mIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NDQ0Ij4NCmJhY2twb3J0 ZWQ8L2E+IGJ1ZyBmaXhlcyAmYW1wOyBhIHNlY3VyaXR5IGZpeC4gPC9wPg0KPHA+WW914oCZbGwg ZmluZCBtb3JlIGluZm9ybWF0aW9uIGluIHRoZSA8YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwu b3JnL2Jsb2cvb3BhbS0yLTEtNSI+DQpyZWxlYXNlIGJsb2cgcG9zdDwvYT4sIGFuZCB0aGUgbG9j YWwgY2FjaGUgY29ycnVwdGlvbiBpc3N1ZSBpbiA8YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwu b3JnL2Jsb2cvb3BhbS0yLTEtNS1sb2NhbC1jYWNoZSI+DQp0aGUgc2VjdXJpdHkgcG9zdDwvYT4u IDwvcD4NCjxwPlRoYW5rcyB0byA8YSBocmVmPSJodHRwczovL3JvYnVyLmNvb3AiPnJvYnVyPC9h PiBmb3IgdGhlIHNlY3VyaXR5IHJldmlldyEgPC9wPg0KPHA+VG8gdXBncmFkZSBzaW1wbHkgcnVu OiA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnMTEwNWVkNiI+DQpiYXNoIC1jICZx dW90O3NoICZsdDsoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20v b2NhbWwvb3BhbS9tYXN0ZXIvc2hlbGwvaW5zdGFsbC5zaCkgLS12ZXJzaW9uIDIuMS41JnF1b3Q7 DQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5kdW5lIDMuOC4wPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTgtMC8xMjI5MS8xIj5o dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMy04LTAvMTIyOTEvMTwvYT4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzkzN2E3YiIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzM5MzdhN2IiPkV0aWVubmUgTWlsbG9uIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMzkzN2E3YiI+ DQo8cD5UaGUgZHVuZSB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Yg RHVuZSAzLjguMC4gPC9wPg0KPHA+SXQgaXMgbm93IGF2YWlsYWJsZSBpbiBvcGFtLXJlcG9zaXRv cnkuIEFzIHVzdWFsLCBpdCBzaG91bGQgYWx3YXlzIGJlIHNhZmUgdG8gdXBncmFkZSB5b3VyDQo8 Y29kZT5kdW5lPC9jb2RlPiBwYWNrYWdlOiBuZXcgZmVhdHVyZXMgYW5kIGRlcHJlY2F0aW9ucyBh cmUgb25seSBhdmFpbGJsZSBpZiB5b3UgdXBncmFkZSB0aGUgbGFuZ3VhZ2UgdmVyc2lvbiBpbiB5 b3VyDQo8Y29kZT5kdW5lLXByb2plY3Q8L2NvZGU+IGZpbGVzLiA8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Y5ZGM5NTAiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdmOWRjOTUwIj5BZGRlZDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnZjlkYzk1MCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SW50cm9kdWNl IG1keCBzdGFuemEgMC40IHJlcXVpcmluZyBtZHggJmd0Oz0gMi4zLjAgd2hpY2ggdXBkYXRlcyB0 aGUgZGVmYXVsdCBsaXN0IG9mIGZpbGVzIHRvIGluY2x1ZGUNCjxjb2RlPioubWxkPC9jb2RlPiBm aWxlcyAoIzc1ODIsIEBMZW9uaWRhcy1mcm9tLVhJVikgPC9saT48bGk+QWxsb3cgPGNvZGU+KHN0 ZGxpYiAuLi4pPC9jb2RlPiB0byBiZSB1c2VkIHdpdGggPGNvZGU+KHdyYXBwZWQgZmFsc2UpPC9j b2RlPiBpbiBsaWJyYXJ5IHN0YW56YXMgKCM3MTM5LCBAYW5tb250ZWlybykuDQo8L2xpPjxsaT5B bGxvdyB0aGUgbWFpbiBtb2R1bGUgb2YgYSBsaWJyYXJ5IHdpdGggPGNvZGU+KHN0ZGxpYiAuLi4p PC9jb2RlPiB0byBkZXBlbmQgb24gb3RoZXIgbGlicmFyaWVzICgjNzE1NCwgQGFubW9udGVpcm8p Lg0KPC9saT48bGk+U3VwcG9ydCA8Y29kZT4obGlua19mbGFncyAuLi4pPC9jb2RlPiBpbiA8Y29k ZT4oY2luYXBzIC4uLik8L2NvZGU+IHN0YW56YS4gKCM3NDIzLCBmaXhlcyAjNzQxNiwgQG5vamIp DQo8L2xpPjxsaT5BbGxvdyA8Y29kZT4ocGFja2FnZSAuLi4pPC9jb2RlPiBpbiBhbnkgcG9zaXRp b24gd2l0aGluIDxjb2RlPihydWxlIC4uLik8L2NvZGU+IHN0YW56YSAoIzc0NDUsIEBMZW9uaWRh cy1mcm9tLVhJVikNCjwvbGk+PGxpPkFkZGVkIGEgbmV3IHVzZXIgYWN0aW9uIDxjb2RlPihjb25j dXJyZW50ICk8L2NvZGU+IHdoaWNoIGlzIGxpa2UgPGNvZGU+KHByb2duICk8L2NvZGU+IGJ1dCBy dW5zIHRoZSBhY3Rpb25zIGNvbmN1cnJlbnRseS4gKCM2OTMzLCBAQWxpenRlcikNCjwvbGk+PGxp PkFjY2VwdCB0aGUgT3JkZXJlZCBTZXQgTGFuZ3VhZ2UgZm9yIHRoZSA8Y29kZT5tb2RlczwvY29k ZT4gZmllbGQgaW4gPGNvZGU+bGlicmFyeTwvY29kZT4gc3RhbnphcyAoIzY2MTEsIEBhbm1vbnRl aXJvKS4NCjwvbGk+PGxpPkFsbG93IHBhcmFsbGVsIGV4ZWN1dGlvbiBvZiBpbmxpbmUgdGVzdHMg cGFydGl0aW9ucyAoIzcwMTIsIEBoaHVnbykgPC9saT48bGk+QWRkIHRoZSA8Y29kZT4tLWRpc3Bs YXktc2VwYXJhdGUtbWVzc2FnZXM8L2NvZGU+IGZsYWcgdG8gc2VwYXJhdGUgdGhlIGVycm9yIG1l c3NhZ2VzIHByb2R1Y2VkIGJ5IGNvbW1hbmRzIHdpdGggYSBibGFuayBsaW5lLiAoIzY4MjMsIGZp eGVzICM2MTU4LCBAZXNvcGUpDQo8L2xpPjxsaT5BZGQgPGNvZGU+LS13YXRjaC1leGNsdXNpb25z PC9jb2RlPiB0byBEdW5lIGJ1aWxkIG9wdGlvbnMgKCM3MjE2LCBAam9uYWhiZWNrZm9yZCkNCjwv bGk+PGxpPkFkZHMgc3VwcG9ydCBmb3IgbG9hZGluZyBwbHVnaW5zIGluIHRvcGxldmVscyAoIzYw ODIsIGZpeGVzICM2MDgxLCBAaXZnLCBAcmljaGFyZGxmb3JkKQ0KPC9saT48bGk+SW50cm9kdWNl IGEgPGNvZGU+cHVibGljX2hlYWRlcnM8L2NvZGU+IGZpZWxkIG9uIGxpYnJhcmllcy4gVGhpcyBm aWVsZCBpcyBsaWtlDQo8Y29kZT5pbnN0YWxsX2NfaGVhZGVyczwvY29kZT4sIGJ1dCBpdCBhbGxv d3MgdG8gY2hvb3NlIHRoZSBleHRlbnNpb24gYW5kIGNob29zZSB0aGUgcGF0aHMgZm9yIHRoZSBp bnN0YWxsZWQgaGVhZGVycy4gKCM3NTEyLCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+RHVuZSBjYW4g bm93IGRldGVjdCBDb3EgdGhlb3JpZXMgZnJvbSBvdXRzaWRlIHRoZSB3b3Jrc3BhY2UuIFRoaXMg YWxsb3dzIGZvciBjb21wb3NpdGlvbiB3aXRoIGluc3RhbGxlZCB0aGVvcmllcyAobm90IG5lY2Vz c2FyaWx5IGluc3RhbGxlZCB3aXRoIER1bmUpLiAoIzcwNDcsIEBBbGl6dGVyLCBAZWpnYWxsZWdv KQ0KPC9saT48bGk+QWRkZWQgYSA8Y29kZT4tLW5vLWJ1aWxkPC9jb2RlPiBvcHRpb24gdG8gPGNv ZGU+ZHVuZSBjb3EgdG9wPC9jb2RlPiBmb3IgYXZvaWRpbmcgcmVidWlsZHMgKCM3MzgwLCBmaXhl cyAjNzM1NSwgQEFsaXp0ZXIpDQo8L2xpPjxsaT5BZGQgYSA8Y29kZT5jb3Fkb2NfZmxhZ3M8L2Nv ZGU+IGZpZWxkIHRvIHRoZSA8Y29kZT5jb3EudGhlb3J5PC9jb2RlPiBzdGFuemEgYWxsb3dpbmcg dGhlIHVzZXIgdG8gcGFzcyBleHRyYSBhcmd1bWVudHMgdG8NCjxjb2RlPmNvcWRvYzwvY29kZT4u ICgjNzY3NiwgZml4ZXMgIzc5NTQgQEFsaXp0ZXIpIDwvbGk+PGxpPlByZWxpbWluYXJ5IHN1cHBv cnQgZm9yIENvcSBjb21waWxlZCBpbnRlZmFjZXMgKDxjb2RlPi52b3M8L2NvZGU+IGZpbGVzKSBl bmFibGVkIHZpYQ0KPGNvZGU+KG1vZGUgdm9zKTwvY29kZT4gaW4gPGNvZGU+Y29xLnRoZW9yeTwv Y29kZT4gc3Rhbnphcy4gVGhpcyBjYW4gYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoDQo8Y29k ZT5kdW5lIGNvcSB0b3A8L2NvZGU+IHRvIG9idGFpbiBmYXN0IHJlLWJ1aWxkaW5nIG9mIGRlcGVu ZGVuY2llcyAod2l0aCBubyBjaGVja2luZyBvZiBwcm9vZnMpIHByaW9yIHRvIHN0ZXBwaW5nIGlu dG8gYSBmaWxlLiAoIzc0MDYsIEBybGVwaWdyZSkNCjwvbGk+PGxpPlJlYWQgPGNvZGU+cGtnLWNv bmZpZzwvY29kZT4gYXJndW1lbnRzIGZyb20gdGhlIDxjb2RlPlBLR19DT05GSUdfQVJHTjwvY29k ZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgKCMxNDkyLCAjNzczNCwgQGFubW9udGVpcm8pDQo8L2xp PjxsaT5Vc2UgPGNvZGU+JFBLR19DT05GSUc8L2NvZGU+LCB3aGVuIHNldCwgdG8gZmluZCB0aGUg PGNvZGU+cGtnLWNvbmZpZzwvY29kZT4gYmluYXJ5ICgjNzQ2OSwgZml4ZXMgIzI1NzIsIEBhbm1v bnRlaXJvKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2Y0MDEwODEiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdmNDAxMDgx Ij5DaGFuZ2VkPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdm NDAxMDgxIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Cb290c3RyYXA6IHJlbW92ZSByZWxp YW5jZSBvbiBzaGVsbC4gUHJldmlvdXNseSwgd2XigJlkIHVzZSB0aGUgc2hlbGwgdG8gZ2V0IHRo ZSBudW1iZXIgb2YgcHJvY2Vzc29ycy4gKCM3Mjc0LCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+Tm9u LXVzZXIgcHJvY2Nlc3NlcyBzdWNoIGFzIHZlcnNpb24gY29udHJvbCBvciBjb25maWcgY2hlY2tp bmcgYXJlIG5vdyBydW4gc2lsZW50bHkuICgjNjk5NCwgZml4ZXMgIzQwNjYsIEBBbGl6dGVyKQ0K PC9saT48bGk+Qnl0ZWNvZGUgZXhlY3V0YWJsZXMgYnVpbHQgZm9yIEpTT08gYXJlIGxpbmtlZCB3 aXRoIDxjb2RlPi1ub2F1dG9saW5rPC9jb2RlPiBhbmQgbm8gbG9uZ2VyIGRlcGVuZCBvbiB0aGUg c2hhcmVkIHN0dWJzIG9mIHRoZWlyIGRlcGVuZGVudCBsaWJyYXJpZXMgKCM3MTU2LCBAbm9qYikN CjwvbGk+PGxpPkFsd2F5cyBpbmNsdWRlIDxjb2RlPm9wYW08L2NvZGU+IGZpbGVzIGluIHRoZSBn ZW5lcmF0ZWQgPGNvZGU+Lmluc3RhbGw8L2NvZGU+IGZpbGUuIFByZXZpb3VzbHksIGl0IHdvdWxk IG5vdCBiZSBpbmNsdWRlZCB3aGVuZXZlcg0KPGNvZGU+KGdlbmVyYXRlX29wYW1fZmlsZXMgdHJ1 ZSk8L2NvZGU+IHdhcyBzZXQgYW5kIHRoZSA8Y29kZT4uaW5zdGFsbDwvY29kZT4gZmlsZSB3YXNu 4oCZdCB5ZXQgZ2VuZXJhdGVkLiAoIzc1NDcsIEByZ3JpbmJlcmcpDQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODg4NDAwZCIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzg4ODQwMGQiPkRlcHJlY2F0ZWQ8L2g0Pg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzg4ODQwMGQiPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPk1vZHVsZXMgdGhhdCB3ZXJlIGRlY2xhcmVkIGluIDxjb2RlPihtb2R1bGVz X3dpdGhvdXRfaW1wbGVtZW50YXRpb24pPC9jb2RlPiwgPGNvZGU+DQoocHJpdmF0ZV9tb2R1bGVz KTwvY29kZT4gb3IgPGNvZGU+KHZpcnR1YWxfbW9kdWxlcyk8L2NvZGU+IGJ1dCBub3QgZGVjbGFy ZWQgaW4gPGNvZGU+DQoobW9kdWxlcyk8L2NvZGU+IHdpbGwgY2F1c2UgRHVuZSB0byBlbWl0IGEg d2FybmluZyB3aGljaCB3aWxsIGJlY29tZSBhbiBlcnJvciBpbiAzLjkuICgjNzYwOCwgZml4ZXMg IzcwMjYsIEBBbGl6dGVyKQ0KPC9saT48bGk+Q29xIGxhbmd1YWdlIHZlcnNpb25zIGxlc3MgMC44 IGFyZSBkZXByZWNhdGVkLCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGFuIHVwY29taW5nIER1bmUg dmVyc2lvbi4gQWxsIHVzZXJzIGFyZSByZXF1aXJlZCB0byBtaWdyYXRlIHRvDQo8Y29kZT4oY29x IGxhbmcgMC44KTwvY29kZT4gd2hpY2ggcHJvdmlkZXMgdGhlIHJpZ2h0IHNlbWFudGljcyBmb3Ig dGhlb3JpZXMgdGhhdCBoYXZlIGJlZW4gZ2xvYmFsbHkgaW5zdGFsbGVkLCBzdWNoIGFzIHRob3Nl IGNvbWluZyBmcm9tIG9wYW0gKEBlamdhbGxlZ28sIEBBbGl6dGVyKQ0KPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzcyYzllOTUiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc3MmM5ZTk1Ij5GaXhlZDwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnNzJjOWU5NSI+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+RmluZCA8Y29kZT5wcHM8L2NvZGU+IGRlcGVuZGVuY2llcyBpbiB0aGUgaG9zdCBj b250ZXh0IHdoZW4gY3Jvc3MtY29tcGlsaW5nLCAoIzc0MTUsIGZpeGVzICM0MTU2LCBAYW5tb250 ZWlybykNCjwvbGk+PGxpPkZpeCBwbHVnaW4gbG9hZGluZyB3aXRoIGZpbmRsaWIuIFRoZSBmdW5j dGlvbmFsaXR5IHdhcyBicm9rZW4gaW4gMy43LjAuICgjNzU1NiwgQGFubW9udGVpcm8pDQo8L2xp PjxsaT5Mb2FkIHRoZSBob3N0IGNvbnRleHQgPGNvZGU+ZmluZGxpYi5jb25mPC9jb2RlPiB3aGVu IGNyb3NzLWNvbXBpbGluZyAoIzc0MjgsIGZpeGVzICMxNzAxLCBAcmdyaW5iZXJnLCBAYW5tb250 ZWlybykNCjwvbGk+PGxpPkFsbG93IG92ZXJyaWRpbmcgdGhlIDxjb2RlPm9jYW1sPC9jb2RlPiBi aW5hcnkgd2l0aCBmaW5kbGliIGNvbmZpZ3VyYXRpb24gKCM3NjQ4LCBAcmdyaW5iZXJnKQ0KPC9s aT48bGk+UmVzb2x2ZSA8Y29kZT5wcHhfcnVudGltZV9saWJyYXJpZXM8L2NvZGU+IGluIHRoZSB0 YXJnZXQgY29udGV4dCB3aGVuIGNyb3NzIGNvbXBpbGluZyAoIzc0NTAsIGZpeGVzICMyNzk0LCBA YW5tb250ZWlybykNCjwvbGk+PGxpPkZpeCA8Y29kZT5kdW5lIGluc3RhbGw8L2NvZGU+IHdoZW4g Y3Jvc3MgY29tcGlsaW5nICgjNzQxMCwgZml4ZXMgIzYxOTEsIEBhbm1vbnRlaXJvLCBAcml6bykN CjwvbGk+PGxpPkZpeCBzdHJpbmcgcXVvdGluZyBpbiB0aGUganNvbiBmaWxlIHdyaXR0ZW4gYnkg PGNvZGU+LS10cmFjZS1maWxlPC9jb2RlPiAoIzc3NzMsIEBybGVzaGNoaW5za2l5KQ0KPC9saT48 bGk+Q29ycmVjdGx5IHNldCA8Y29kZT5NQU5QQVRIPC9jb2RlPiBpbiA8Y29kZT5kdW5lIGV4ZWM8 L2NvZGU+LiBQcmV2aW91c2x5LCB3ZSB3b3VsZCB1c2UgdGhlDQo8Y29kZT5iaW4vPC9jb2RlPiBk aXJlY3Rvcnkgb2YgdGhlIGNvbnRleHQuICgjNzY1NSwgQHJncmluYmVyZykgPC9saT48bGk+bWVy bGluOiBpZ25vcmUgaW5zdHJ1bWVudGF0aW9uIHNldHRpbmdzIGZvciBwcmVwcm9jZXNzaW5nLiAo Izc2MDYsIGZpeGVzICM3NDY1LCBAQWxpenRlcikNCjwvbGk+PGxpPldoZW4gYSBydWxl4oCZcyBh Y3Rpb24gaXMgaW50ZXJydXB0ZWQsIGRlbGV0ZSBhbnkgbGVmdG92ZXIgZGlyZWN0b3J5IHRhcmdl dHMuIFRoaXMgaXMgY29uc2lzdGVudCB3aXRoIGhvdyB3ZSB0cmVhdCBmaWxlIHRhcmdldHMuICgj NzU2NCwgQHJncmluYmVyZykNCjwvbGk+PGxpPkZpeCBkdW5lIGNyYXNoaW5nIG9uIE1hY09TIGlu IHdhdGNoIG1vZGUgd2hlbmV2ZXIgPGNvZGU+JFBBVEg8L2NvZGU+IGNvbnRhaW5zDQo8Y29kZT4k UFdEPC9jb2RlPiAoIzc0NDEsIGZpeGVzICM2OTA3LCBAcmdyaW5iZXJnKSA8L2xpPjxsaT5EdW5l IGluIHdhdGNoIG1vZGUgbm8gbG9uZ2VyIGJ1aWxkcyBjb25jdXJyZW50IHJ1bGVzIGluIHNlcmlh bCAoIzczOTUgQHJncmluYmVyZywgQGpjaGF2YXJyaSkNCjwvbGk+PGxpPjxjb2RlPmR1bmUgY29x IHRvcDwvY29kZT4gbm93IGNvcnJlY3RseSByZXNwZWN0cyB0aGUgcHJvamVjdCByb290IHdoZW4g Y2FsbGVkIGZyb20gYSBzdWJkaXJlY3RvcnkuIEhvd2V2ZXIsIGFic29sdXRlIGZpbGVuYW1lcyBw YXNzZWQgdG8NCjxjb2RlPmR1bmUgY29xIHRvcDwvY29kZT4gYXJlIG5vIGxvbmdlciBzdXBwb3J0 ZWQgKGR1ZSB0byBiZWluZyBidWdneSkgKCM3MzU3LCBmaXhlcyAjNzM0NCwgQHJsZXBpZ3JlIGFu ZCBAQWxpenRlcikNCjwvbGk+PGxpPlJQQzogSWdub3JlIFNJR1BJUEUgd2hlbiBjbGllbnRzIHN1 ZGRlbmx5IGRpc2Nvbm5lY3QgKCM3Mjk5LCAjNzMxOSwgZml4ZXMgIzY4NzksIEByZ3JpbmJlcmcp DQo8L2xpPjxsaT5BbHdheXMgY2xlYW4gdXAgdGhlIFVJIG9uIGV4aXQuICgjNzI3MSwgZml4ZXMg IzcxNDIgQHJncmluYmVyZykgPC9saT48bGk+Qm9vdHN0cmFwOiBjb3JyZWN0bHkgZGV0ZWN0IHRo ZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBieSBhbGxvd2luZyA8Y29kZT5ucHJvYzwvY29kZT4gdG8g YmUgbG9va2VkIHVwIGluDQo8Y29kZT4kUEFUSDwvY29kZT4gKCM3MjcyLCBAQWxpenRlcikgPC9s aT48bGk+U3BlZWQgdXAgZmlsZSBjb3B5aW5nIG9uIG1hY29zIGJ5IHVzaW5nIDxjb2RlPmNsb25l ZmlsZTwvY29kZT4gd2hlbiBhdmFpbGFibGUgKEByZ3JpbmJlcmcsICM3MjEwKQ0KPC9saT48bGk+ U3VwcG9ydCBjb21tYW5kcyB0aGF0IG91dHB1dCA4LWJpdCBhbmQgMjQtYml0IGNvbG9ycyBpbiB0 aGUgdGVybWluYWwgKCM3MTg4LCBAQWxpenRlcikNCjwvbGk+PGxpPlNwZWVkIHVwIHJ1bGUgZ2Vu ZXJhdGlvbiBmb3IgbGlicmFyaWVzIGFuZCBleGVjdXRhYmxlcyB3aXRoIG1hbnkgbW9kdWxlcyAo IzcxODcsIEBqY2hhdmFycmkpDQo8L2xpPjxsaT5EbyBub3QgcmUtcmVuZGVyIFVJIG9uIGV2ZXJ5 IGZyYW1lIGlmIHRoZSBVSSBkb2VzbuKAmXQgY2hhbmdlICgjNzE4NiwgZml4ICM3MTg0LCBAcmdy aW5iZXJnKQ0KPC9saT48bGk+TWFrZSA8Y29kZT5jb3FfZGI8L2NvZGU+IGNyZWF0aW9uIGluIHNj b3BlIGxhenkgKEBlamdhbGxlZ28sICM3MTMzKSA8L2xpPjxsaT5kdW5lIGluc3RhbGwgbm93IHJl c3BlY3RzIOKAk2Rpc3BsYXkgcXVpZXQgbW9kZSAoIzcxMTYsIGZpeGVzICM0NTczLCBmaXhlcyAj NzEwNiwgQEFsaXp0ZXIpDQo8L2xpPjxsaT5TdHViIHNoYXJlZCBsaWJyYXJpZXMgKDxjb2RlPmRs bFhYWF9zdHVicy5zbzwvY29kZT4pIGluIER1bmUtaW5zdGFsbGVkIGxpYnJhcmllcyBjb3VsZCBu b3QgYmUgdXNlZCBhcyBkZXBlbmRlbmNpZXMgb2YgbGlicmFyaWVzIGluIHRoZSB3b3Jrc3BhY2Ug KGVnIHdoZW4gY29tcGlsaW5nIHRvIGJ5dGVjb2RlIGFuZC9vciBKYXZhc2NyaXB0KS4gVGhpcyBp cyBub3cgZml4ZWQuICgjNzE1MSwgQG5vamIpDQo8L2xpPjxsaT5GaXggcmVncmVzc2lvbiB3aGVy ZSBNZXJsaW4gd2FzIHVuYWJsZSB0byBoYW5kbGUgZmlsZW5hbWVzIHdpdGggdXBwZXJjYXNlIGxl dHRlcnMgdW5kZXIgV2luZG93cy4gKCM3NTc3LCBAbm9qYikNCjwvbGk+PGxpPk9uIG5peCYjNDM7 bWFjb3MsIHBhc3MgPGNvZGU+LWY8L2NvZGU+IHRvIHRoZSBjb2Rlc2lnbiBob29rIHRvIGF2b2lk IGVycm9ycyB3aGVuIHRoZSBiaW5hcnkgaXMgYWxyZWFkeSBzaWduZWQgKCM3MTgzLCBmaXhlcyAj NjI2NSwgQGdyZWVkeSkNCjwvbGk+PGxpPkZpeCBidWcgd2hlcmUgUlBDIGNsaWVudHMgYnVpbHQg d2l0aCBkdW5lLXJwYy1sd3Qgd291bGQgY3Jhc2ggd2hlbiBjbG9zaW5nIHRoZWlyIGNvbm5lY3Rp b24gdG8gdGhlIHNlcnZlciAoIzc1ODEsIEBncmlkYnVncykNCjwvbGk+PGxpPkZpeCBSUEMgc2Vy dmVyIG9uIFdpbmRvd3MgKHVzZWQgZm9yIE9DYW1sLUxTUCkuICgjNzY2NiwgQG5vamIpIDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPlNlY29uZCBhbHBoYSBy ZWxlYXNlIG9mIE9DYW1sIDUuMS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9zZWNvbmQtYWxwaGEtcmVsZWFzZS1vZi1vY2FtbC01LTEtMC8xMjI5OS8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZWNvbmQtYWxwaGEtcmVsZWFzZS1vZi1vY2FtbC01LTEt MC8xMjI5OS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y ZzgyYjMwYjEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4MmIzMGIxIj5vY3RhY2hy b24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmc4MmIzMGIxIj4NCjxwPldpdGggdGhlIHByb2dyZXNzIG9mIHRoZSBvbmdvaW5nIHN0YWJpbGlz YXRpb24gZWZmb3J0IGZvciBPQ2FtbCA1LjEuMCwgSSBhbSBoYXBweSB0byBhbm5vdW5jZSBhIHNl Y29uZCBhbHBoYSByZWxlYXNlIGZvciBPQ2FtbCA1LjEuMC4NCjwvcD4NCjxwPlRoaXMgc2Vjb25k IGFscGhhIHJlbGVhc2UgY29udGFpbnMgbWFueSBub3Rld29ydGh5IGZpeGVzOiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+YSBsb25nLWF3YWl0ZWQgR0MgZml4IDwvbGk+PGxpPmEgV2lu ZG93cyBBQkkgZml4IDwvbGk+PC91bD4NCjxwPmFzIGFubm91bmNlZCBpbiB0aGUgZmlyc3QgYWxw aGEgYnV0IGFsc28gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmEgY29tcGlsZXItbGli cyAocGFyc2V0cmVlKSBmaXggPC9saT48bGk+YSB0eXBlIHN5c3RlbSBjb21wYXRpYmlsaXR5IGVu aGFuY2VtZW50IGNoYW5nZSA8L2xpPjxsaT5hIHJlc3RvcmVkIGJhY2tlZCBmb3IgczM5MHgvSUJN IFogPC9saT48L3VsPg0KPHA+VGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIHNpbmNlIHRoZSBmaXJz dCBhbHBoYSBpcyBhdmFpbGFibGUgYmVsb3cuIDwvcD4NCjxwPk9uY2UgbW9zdCBtYWpvciBPQ2Ft bCB0b29scyBhcmUgdXBkYXRlZCB0byB0aGUgbGFzdCBjb21waWxlci1saWJzIGNoYW5nZXMsIHdl IHdpbGwgc3dpdGNoIHRvIGJldGEgcmVsZWFzZXMuIEhvcGVmdWxseSwgdGhpcyB3aWxsIGhhcHBl biBpbiB0aGUgdXBjb21pbmcgd2Vla3MuIFRoZSBwcm9ncmVzcyBvbiBzdGFiaWxpc2luZyB0aGUg ZWNvc3lzdGVtIGlzIHRyYWNrZWQgb24gdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8yMzY2OSI+b3BhbSByZWFkaW5lc3MgZm9yIDUu MS4wIG1ldGEtaXNzdWU8L2E+Lg0KPC9wPg0KPHA+Q3VycmVudGx5LCB0aGUgcmVsZWFzZSBpcyBz dGlsbCBwbGFubmVkIGZvciBhcm91bmQgSnVseS4gPC9wPg0KPHA+SWYgeW91IGZpbmQgYW55IGJ1 Z3MsIHBsZWFzZSByZXBvcnQgdGhlbSBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzIj4NCk9DYW1s4oCZcyBpc3N1ZSB0cmFja2VyPC9hPi4gPC9wPg0KPHA+ SWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoZSBvbmdvaW5nIGxpc3Qgb2YgbmV3IGZlYXR1cmVz IGFuZCBidWcgZml4ZXMsIHRoZSB1cGRhdGVkIGNoYW5nZSBsb2cgZm9yIE9DYW1sIDUuMS4wIGlz IGF2YWlsYWJsZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2Iv NS4xL0NoYW5nZXMiPm9uIEdpdEh1YjwvYT4uIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYWVkNjE3MCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2Fl ZDYxNzAiPkluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2FlZDYxNzAiPg0KPHA+VGhlIGJhc2UgY29tcGlsZXIgY2Fu IGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3aXRjaCB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFu ZHMgb24gb3BhbSAyLjE6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8 cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRl IDUuMS4wfmFscGhhMg0KPC9wcmU+DQo8L2Rpdj4NCjxwPlRoZSBzb3VyY2UgY29kZSBmb3IgdGhl IGFscGhhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFkZHJlc3NlczogPC9wPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9hcmNoaXZlLzUuMS4wLWFscGhhMi50YXIuZ3oiPkdpdEh1YjwvYT4NCjwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjEvb2NhbWwtNS4x LjB+YWxwaGEyLnRhci5neiI+T0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWE8L2E+DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnNjBkNTg2YyI+PC9h PkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29uZmlndXJhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC01IiBpZD0idGV4dC1vcmc2MGQ1ODZjIj4NCjxwPklmIHlvdSB3YW50IHRvIHR3ZWFr IHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21waWxlciwgeW91IGNhbiBzd2l0Y2ggdG8gdGhl IG9wdGlvbiB2YXJpYW50IHdpdGg6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5l ciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2gg Y3JlYXRlICZsdDtzd2l0Y2hfbmFtZSZndDsgb2NhbWwtdmFyaWFudHMuNS4xLjB+YWxwaGEyJiM0 MztvcHRpb25zICZsdDtvcHRpb25fbGlzdCZndDsNCjwvcHJlPg0KPC9kaXY+DQo8cD53aGVyZSA8 Y29kZT5vcHRpb25fbGlzdDwvY29kZT4gaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiA8Y29k ZT5vY2FtbC1vcHRpb24tKjwvY29kZT4gcGFja2FnZXMuIEZvciBpbnN0YW5jZSwgZm9yIGEgZmxh bWJkYSBhbmQgbm8tZmxhdC1mbG9hdC1hcnJheSBzd2l0Y2g6DQo8L3A+DQo8ZGl2IGNsYXNzPSJv cmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxsIj5vcGFtIHN3aXRj aCBjcmVhdGUgNS4xLjB+YWxwaGEyJiM0MztmbGFtYmRhJiM0MztuZmZhIG9jYW1sLXZhcmlhbnRz LjUuMS4wfmFscGhhMiYjNDM7b3B0aW9ucyBvY2FtbC1vcHRpb24tZmxhbWJkYSBvY2FtbC1vcHRp b24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KPC9wcmU+DQo8L2Rpdj4NCjxwPkFsbCBhdmFpbGFibGUg b3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggPGNvZGU+b3BhbSBzZWFyY2ggb2NhbWwtb3B0aW9u PC9jb2RlPi4NCjwvcD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc5OTQxODg2IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3Jn OTk0MTg4NiI+Q2hhbmdlcyBDb21wYXJlZCBUbyBUaGUgRmlyc3QgQWxwaGEgUmVsZWFzZTwvaDQ+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOTk0MTg4NiI+PC9kaXY+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzBkZWNmYTEiPjwvYT5SdW50aW1l IFN5c3RlbTo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMGRl Y2ZhMSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTU4OSI+IzExNTg5PC9hPiwgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTkwMyI+DQojMTE5MDM8L2E+OiBNb2Rp ZnkgdGhlIEdDIHBhY2luZyBjb2RlIHRvIG1ha2Ugc3VyZSB0aGUgR0Mga2VlcHMgdXAgd2l0aCBh bGxvY2F0aW9ucyBpbiB0aGUgcHJlc2VuY2Ugb2YgaWRsZSBkb21haW5zLiAoRGFtaWVuIERvbGln ZXogYW5kIFN0ZXBoZW4gRG9sYW4sIHJlcG9ydCBieSBGbG9yaWFuIEFuZ2VsZXR0aSwgcmV2aWV3 IGJ5IEtDIFNpdmFyYW1ha3Jpc2huYW4gYW5kIFNhZGlxIEphZmZlcikNCjwvbGk+PGxpPig8Yj5i cmVha2luZyBjaGFuZ2U8L2I+KSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzExODY1Ij4NCiMxMTg2NTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE4NjgiPiMxMTg2ODwvYT4sIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE4NzYiPg0KIzExODc2PC9hPjogQ2xhcmlm eSB0aGF0IHRoZSBvcGVyYXRpb25zIG9mIGEgY3VzdG9tIGJsb2NrIG11c3QgbmV2ZXIgYWNjZXNz IHRoZSBPQ2FtbCBydW50aW1lLiBUaGUgcHJldmlvdXMgZG9jdW1lbnRhdGlvbiBvbmx5IG1lbnRp b25lZCB0aGUgbWFpbiBpbGxpY2l0IHVzYWdlcy4gSW4gcGFydGljdWxhciwgc2luY2UgT0NhbWwg NS4wLCBpdCBpcyBubyBsb25nZXIgc2FmZSB0byBjYWxsDQo8Y29kZT5jYW1sX3JlbW92ZV9nbG9i YWxfcm9vdDwvY29kZT4gb3IgPGNvZGU+Y2FtbF9yZW1vdmVfZ2VuZXJhdGlvbmFsX2dsb2JhbF9y b290PC9jb2RlPiBmcm9tIHdpdGhpbiB0aGUgQyBmaW5hbGl6ZXIgb2YgYSBjdXN0b20gYmxvY2ss IG9yIHdpdGhpbiB0aGUgZmluYWxpemF0aW9uIGZ1bmN0aW9uIHBhc3NlZCB0bw0KPGNvZGU+Y2Ft bF9hbGxvY19maW5hbDwvY29kZT4uIEFzIGEgd29ya2Fyb3VuZCwgc3VjaCBhIGZpbmFsaXphdGlv biBvcGVyYXRpb24gY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aA0KPGNvZGU+R2MuZmluYWxpemU8L2Nv ZGU+IGluc3RlYWQsIHdoaWNoIGd1YXJhbnRlZXMgdG8gcnVuIHRoZSBmaW5hbGl6ZXIgYXQgYSBz YWZlIHBvaW50LiAoUmVwb3J0IGJ5IFRpbW90aHkgQm91cmtlLCBkaXNjdXNzaW9uIGJ5IFlvdGFt IEJhcm5veSwgVGltb3RoeSBCb3Vya2UsIFNhZGlxIEphZmZlciwgWGF2aWVyIExlcm95LCBHdWls bGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSwgYW5kIEdhYnJpZWwgU2NoZXJlcikNCjwvbGk+PGxpPjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE4MjciPiMxMTgy NzwvYT4sICYjNDM7PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMjI0OSI+IzEyMjQ5PC9hPjogUmVzdG9yZSBwcmVmZXRjaGluZyBmb3IgR0MgbWFya2luZyAo RmFicmljZSBCdW9ybyBhbmQgU3RlcGhlbiBEb2xhbiwgcmV2aWV3IGJ5IEdhYnJpZWwgU2NoZXJl ciBhbmQgU2FkaXEgSmFmZmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjEzMSI+IzEyMTMxPC9hPjogU2ltcGxpZnkgaW1wbGVtZW50 YXRpb24gb2Ygd2VhayBoYXNoIHNldHMsIGZpeGluZyBhIHBlcmZvcm1hbmNlIHJlZ3Jlc3Npb24u IChOaWNrIEJhcm5lcywgcmV2aWV3IGJ5IEZyYW7Dp29pcyBCb2JvdCwgQWxhaW4gRnJpc2NoIGFu ZCBEYW1pZW4gRG9saWdleikuDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEyMjMxIj4jMTIyMzE8L2E+OiBTdXBwb3J0IE1pbkdXLXc2NCAx MS4wIHdpbnB0aHJlYWRzIGxpYnJhcnksIHdoZXJlIHRoZSBtYWNybyB0byBzZXQgdXAgdG8gZ2V0 IGZsZXhkbGwgd29ya2luZyBjaGFuZ2VkIChEYXZpZCBBbGxzb3BwIGFuZCBTYW11ZWwgSHltLCBs aWdodCByZXZpZXcgYnkgWGF2aWVyIExlcm95KQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxs aT48YSBpZD0ib3JnM2IyOTU1ZSI+PC9hPlR5cGUgU3lzdGVtOjxicj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmczYjI5NTVlIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT4oPGI+YnJlYWtpbmcgY2hhbmdlPC9iPikgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjE4OSI+DQojMTIxODk8L2E+LCA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMjExIj4jMTIyMTE8L2E+OiBhbm9ueW1v dXMgcm93IHZhcmlhYmxlcyBpbiBleHBsaWNpdGx5IHBvbHltb3JwaGljIHR5cGUgYW5ub3RhdGlv biwgZS5nLg0KPGNvZGU+J2EuIFsmbHQ7IFggb2YgJ2EgXSAtJmd0OyAnYTwvY29kZT4sIGFyZSBu b3cgaW1wbGljaXRseSB1bml2ZXJzYWxseSBxdWFudGlmaWVkIChpbiBvdGhlciB3b3JkcywgdGhl IGV4YW1wbGUgYWJvdmUgaXMgbm93IHJlYWQgYXMNCjxjb2RlPidhICdyLiAoWyZsdDsgWCBvZiAn YSBdIGFzICdyKSAtJmd0OyAnYTwvY29kZT4pLiAoRmxvcmlhbiBBbmdlbGV0dGkgYW5kIEdhYnJp ZWwgU2NoZXJlciwgcmV2aWV3IGJ5IEphY3F1ZXMgR2FycmlndWUpDQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvbGk+PGxpPjxhIGlkPSJvcmczODE5OTJjIj48L2E+Q29kZSBHZW5lcmF0aW9uIEFuZCBP cHRpbWl6YXRpb25zOjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1v cmczODE5OTJjIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNzEyIj4jMTE3MTI8L2E+LCA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEyMjU4Ij4NCiMxMjI1ODwvYT4s IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIyNjEiPiMx MjI2MTwvYT46IHMzOTB4IC8gSUJNIFogbXVsdGljb3JlIHN1cHBvcnQ6IE9DYW1sICZhbXA7IEMg c3RhY2sgc2VwYXJhdGlvbjsgZHluYW1pYyBzdGFjayBzaXplIGNoZWNrczsgZmliZXIgYW5kIGVm ZmVjdHMgc3VwcG9ydC4gKEFsZWtzZWkgTmlraWZvcm92LCB3aXRoIGhlbHAgZnJvbSBWaW5jZW50 IExhdmlyb24gYW5kIFhhdmllciBMZXJveSwNCiBhZGRpdGlvbmFsIHN1Z2dlc3Rpb25zIGJ5IEx1 YyBNYXJhbmdldCwgcmV2aWV3IGJ5IHRoZSBzYW1lIGFuZCBLQyBTaXZhcmFtYWtyaXNobmFuKQ0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnMTY2NTc5OSI+PC9hPkludGVy bmFsL2NvbXBpbGVyLWxpYnMgQ2hhbmdlczo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NSIgaWQ9InRleHQtb3JnMTY2NTc5OSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjExOSI+IzEyMTE5PC9h PiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMjE4OCI+ DQojMTIxODg8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzEyMTkxIj4jMTIxOTE8L2E+OiBtaXJyb3IgdHlwZSBjb25zdHJhaW50cyBvbiB2YWx1ZSBi aW5kaW5nIGluIHRoZSBwYXJzZXRyZWU6IHRoZSBjb25zdHJhaW50DQo8Y29kZT50eXA8L2NvZGU+ IGluIDxjb2RlPmxldCBwYXQgOiB0eXAgPSBleHA8L2NvZGU+IGlzIG5vdyBkaXJlY3RseSBzdG9y ZWQgaW4gdGhlIHZhbHVlIGJpbmRpbmcgbm9kZSBpbiB0aGUgcGFyc2V0cmVlLiAoRmxvcmlhbiBB bmdlbGV0dGksIHJldmlldyBieSBSaWNoYXJkIEVpc2VuYmVyZykNCjwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2E3NzRkNWQiPjwvYT5CdWcgRml4ZXM8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYTc3NGQ1ZCI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMTg0NiI+IzExODQ2PC9hPjogTWFyayByYnggYXMgZGVzdHJveWVkIGF0IEMgY2FsbCBmb3Ig V2luNjQgKG1pbmd3LXc2NCBhbmQgQ3lnd2luNjQpLiBSZXNlcnZlIHRoZSBzaGFkb3cgc3RvcmUg Zm9yIHRoZSBBQkkgaW4gdGhlIGNfc3RhY2tfbGluayBzdHJ1Y3QgaW5zdGVhZCBvZiBleHBsaWN0 bHkgd2hlbiBjYWxsaW5nIEMgZnVuY3Rpb25zLiBUaGlzIHNpbXVsdGFuZW91c2x5DQogcmVkdWNl cyB0aGUgbnVtYmVyIG9mIHN0YWNrIHBvaW50ZXIgbWFuaXB1bGF0aW9ucyBhbmQgYWxzbyBmaXhl cyBhIGJ1ZyB3aGVuIGNhbGxpbmcgbm9hbGxvYyBmdW5jdGlvbnMgd2hlcmUgdGhlIHNoYWRvdyBz dG9yZSB3YXMgbm90IGJlaW5nIHJlc2VydmVkLiAoRGF2aWQgQWxsc29wcCwgcmVwb3J0IGJ5IFZl c2EgS2Fydm9uZW4sIHJldmlldyBieSBYYXZpZXIgTGVyb3kgYW5kIEtDIFNpdmFyYW1ha3Jpc2hu YW4pDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzEyMTcwIj4jMTIxNzA8L2E+OiBmaXggcHRocmVhZF9nZWFmZmluaXR5X25wIGNvbmZpZ3Vy ZSBjaGVjayBmb3IgYW5kcm9pZCAoRGF2aWQgQWxsc29wcCwgcmV2aWV3IGJ5IFPDqWJhc3RpZW4g SGluZGVyZXIpDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyMjUyIj4jMTIyNTI8L2E+OiBGaXggc2hhcmVkIGxpYnJhcnkgYnVpbGQgZXJy b3Igb24gUklTQy1WLiAoRWR3aW4gVMO2csO2aywgcmV2aWV3IGJ5IE5pY29sw6FzIE9qZWRhIELD pHIgYW5kIFhhdmllciBMZXJveSkNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIyNTUiPiMxMjI1NTwvYT4sIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTIyNTYiPg0KIzEyMjU2PC9hPjogSGFuZGxl IGxhcmdlIHNpZ25hbCBudW1iZXJzIGNvcnJlY3RseSAoTmljayBCYXJuZXMsIHJldmlldyBieSBE YXZpZCBBbGxzb3BwKS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTIyNzciPiMxMjI3NzwvYT46IEFSTTY0LCBmaXggYSBwb3RlbnRpYWwg YXNzZW1ibGVyIGVycm9yIGZvciB2ZXJ5IGxhcmdlIGZ1bmN0aW9ucyBieSBlbWl0dGluZyBzdGFj ayByZWFsbG9jYXRpb24gY29kZSBiZWZvcmUgdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLiAoWGF2 aWVyIExlcm95LCByZXZpZXcgYnkgS0MgU2l2YXJhbWFrcmlzaG5hbikNCjwvbGk+PC91bD4NCjwv ZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPk1M4oCZMjM6IEFD TSBTSUdQTEFOIE1MIEZhbWlseSBXb3Jrc2hvcCDigJQgQ2FsbCBmb3IgcHJlc2VudGF0aW9uczwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWwyMy1hY20tc2lncGxhbi1t bC1mYW1pbHktd29ya3Nob3AtY2FsbC1mb3ItcHJlc2VudGF0aW9ucy8xMjIyNC8yIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9tbDIzLWFjbS1zaWdwbGFuLW1sLWZhbWlseS13b3Jrc2hv cC1jYWxsLWZvci1wcmVzZW50YXRpb25zLzEyMjI0LzI8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2YyOGMwMTgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmdmMjhjMDE4Ij5HdWlsbGF1bWUgTXVuY2gtTWFjY2Fnbm9uaSBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2YyOGMwMTgiPg0KPHA+ SeKAmW0gbGV0dGluZyB5b3Uga25vdyB0aGF0IHRoZSBkZWFkbGluZSBoYXMgYmVlbiBleHRlbmRl ZCB0byBKdW5lIDh0aCAoQW9FKS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItMTAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMCI+ cWNoZWNrLWxpbiBhbmQgcWNoZWNrLXN0bSAwLjI8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tcWNoZWNrLWxpbi1hbmQtcWNoZWNrLXN0bS0wLTIvMTIzMDEvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXFjaGVjay1saW4tYW5kLXFjaGVjay1z dG0tMC0yLzEyMzAxLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnZWVjZmJkZCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2VlY2ZiZGQiPkph biBNaWR0Z2FhcmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBp ZD0idGV4dC1vcmdlZWNmYmRkIj4NCjxwPknigJltIGhhcHB5IHRvIHNoYXJlIHJlbGVhc2UgMC4y IG9mIDxjb2RlPnFjaGVjay1saW48L2NvZGU+IGFuZCA8Y29kZT5xY2hlY2stc3RtPC9jb2RlPiBm b3IgYmxhY2stYm94IHByb3BlcnR5LWJhc2VkIHRlc3RpbmcuDQo8L3A+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+PGNvZGU+cWNoZWNrLWxpbjwvY29kZT4gcmVxdWlyZXMgbGl0dGxlIG1vcmUg dGhhbiBhbiBpbnRlcmZhY2UgZGVzY3JpcHRpb24uIEl0IGFsbG93cyB0byB0ZXN0IGEgbGlicmFy eSBmb3Igc2VxdWVudGlhbCBjb25zaXN0ZW5jeSwgdGhhdCBpcywgd2hldGhlciByZXN1bHRzIG9i dGFpbmVkIGZyb20gdXNpbmcgaXQgaW4gcGFyYWxsZWwgYWdyZWUgd2l0aCBzb21lIGxpbmVhciwg c2luZ2xlIGRvbWFpbiBleGVjdXRpb24uDQo8L2xpPjxsaT48Y29kZT5xY2hlY2stc3RtPC9jb2Rl PiBpcyBhIG1vZGVsLWJhc2VkLCBzdGF0ZS1tYWNoaW5lIGZyYW1ld29yayBmb3IgYm90aCBzZXF1 ZW50aWFsIGFuZCBwYXJhbGxlbCB0ZXN0aW5nLiBJdCBhbGxvd3MgdG8gdGVzdCBhbiBpbXBlcmF0 aXZlIGludGVyZmFjZSBhZ2FpbnN0IGEgcHVyZSBtb2RlbCBkZXNjcmlwdGlvbiwgYW5kIHRoZXJl YnkgYWxsb3dzIHRvIGV4cHJlc3MgYW5kIHRlc3QgaW50ZW5kZWQgYmVoYXZpb3VyIGJleW9uZCBh IHNpZ25hdHVyZQ0KIGRlc2NyaXB0aW9uLiA8L2xpPjwvdWw+DQo8cD5Gb3IgZXhhbXBsZSwgaGVy ZeKAmXMgYSBtaW5pbWFsIDxjb2RlPnFjaGVjay1saW48L2NvZGU+IHRlc3Qgb2YgYSBzZWxlY3Rp b24gb2YgdGhlDQo8Y29kZT5TdGRsaWI8L2NvZGU+IDxjb2RlPkhhc2h0Ymw8L2NvZGU+IGludGVy ZmFjZTogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0i c3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPm1vZHVsZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SGFzaHRi bFNpZzwvc3Bhbj4gPQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPnN0cnVjdDwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250 LXdlaWdodDogYm9sZDsiPnR5cGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PnQ8L3NwYW4+ID0gKGNoYXIsIGludCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SGFz aHRibC48L3NwYW4+dA0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5pbml0PC9z cGFuPiAoKSA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkhhc2h0YmwuPC9zcGFuPmNy ZWF0ZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+cmFuZG9tPC9zcGFuPjo8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5mYWxzZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA4MjRmOyI+NDI8L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmNs ZWFudXA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPl88L3NwYW4+ID0gKCkN Cg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b3Bl biA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TGluPC9zcGFuPg0KICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hPC9zcGFuPiw8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5iPC9zcGFuPiA9IGNoYXJfcHJpbnRhYmxlLG5hdF9zbWFsbA0KICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hcGk8L3NwYW4+ID0NCiAgICBbIHZhbF8gPHNwYW4g c3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGFzaHRibC5hZGQmcXVvdDs8L3NwYW4+ICAg IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkhhc2h0YmwuPC9zcGFuPmFkZCAgICAodCA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5ALSZndDs8L3NwYW4+IGEgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjYTUyYTJhOyI+QC0mZ3Q7PC9zcGFuPiBiIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1 MmEyYTsiPkAtJmd0Ozwvc3Bhbj4gcmV0dXJuaW5nIHVuaXQpOw0KICAgICAgdmFsXyA8c3BhbiBz dHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtIYXNodGJsLnJlbW92ZSZxdW90Ozwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SGFzaHRibC48L3NwYW4+cmVtb3ZlICh0IDxz cGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPkAtJmd0Ozwvc3Bhbj4gYSA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNTJhMmE7Ij5ALSZndDs8L3NwYW4+IHJldHVybmluZyB1bml0KTsNCiAgICAgIHZh bF8gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGFzaHRibC5maW5kJnF1b3Q7 PC9zcGFuPiAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkhhc2h0YmwuPC9zcGFuPmZp bmQgICAodCA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5ALSZndDs8L3NwYW4+IGEgPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+QC0mZ3Q7PC9zcGFuPiByZXR1cm5pbmdfb3JfZXhj IGIpOw0KICAgICAgdmFsXyA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtIYXNo dGJsLm1lbSZxdW90Ozwvc3Bhbj4gICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SGFz aHRibC48L3NwYW4+bWVtICAgICh0IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPkAtJmd0 Ozwvc3Bhbj4gYSA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5ALSZndDs8L3NwYW4+IHJl dHVybmluZyBib29sKTsNCiAgICAgIHZhbF8gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+ JnF1b3Q7SGFzaHRibC5sZW5ndGgmcXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPkhhc2h0YmwuPC9zcGFuPmxlbmd0aCAodCA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJh MmE7Ij5ALSZndDs8L3NwYW4+IHJldHVybmluZyBpbnQpOyBdDQo8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZW5kPC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5IVDwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5MaW5fZG9tYWluLk1ha2UoSGFzaHRibFNpZyk8L3NwYW4+DQo8c3BhbiBzdHlsZT0i Y29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PlFDaGVja19iYXNlX3J1bm5lci48L3NwYW4+cnVuX3Rlc3RzX21haW4gWw0KICA8c3BhbiBzdHls ZT0iY29sb3I6ICM0NDRmY2Y7Ij5IVC48L3NwYW4+bGluX3Rlc3QgPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA4MjRmOyI+fmNvdW50PC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4x MDAwPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+bmFtZTwvc3Bhbj46PHNw YW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGFzaHRibCBEU0wgdGVzdCZxdW90Ozwv c3Bhbj47DQpdDQo8L3ByZT4NCjwvZGl2Pg0KPHA+UnVubmluZyB0aGlzIHRlc3QgcXVpY2tseSBm aW5kcyBhIG1pbmltYWwgY291bnRlcmV4YW1wbGUgdG8gaWxsdXN0cmF0ZSB0aGF0IDxjb2RlPg0K SGFzaHRibDwvY29kZT4gaXMgbm90IHNhZmUgdG8gdXNlIGluIHBhcmFsbGVsOiA8L3A+DQo8cHJl IGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnZDAwMWJhMCI+DQpNZXNzYWdlcyBmb3IgdGVzdCBIYXNo dGJsIERTTCB0ZXN0Og0KDQogIFJlc3VsdHMgaW5jb21wYXRpYmxlIHdpdGggc2VxdWVudGlhbCBl eGVjdXRpb24NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfA0KICAgICAg ICAgICAgICAgICAgICAgICAgSGFzaHRibC5hZGQgdCAnJmx0OycgMCA6ICgpDQogICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICAgICAgICAgICAgICAgIC4tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0uDQogICAgICAgICAgICAgICAgIHwgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICB8DQogICAgIEhhc2h0YmwuYWRkIHQgJ2EnIDAgOiAo KSAgICAgICAgICAgICBIYXNodGJsLnJlbW92ZSB0ICcmbHQ7JyA6ICgpDQogICAgICAgSGFzaHRi bC5sZW5ndGggdCA6IDANCjwvcHJlPg0KPHA+V2UgcHJlc2VudGVkIHByZWxpbWluYXJ5IHdvcmsg b24gYm90aCB0aGVzZSBsaWJyYXJpZXMgYXQgdGhlIE9DYW1sIFdvcmtzaG9wIDIwMjIuIFRoZSBs aWJyYXJpZXMgZnVydGhlcm1vcmUgdW5kZXJsaWUgb3VyIGNvbnRpbnVpbmcgZWZmb3J0IHRvIHRl c3QgdGhlIG11bHRpY29yZSBydW50aW1lIG9mIE9DYW1sIDUueCwgYW5kIGhhdmUgaGVscGVkIGlk ZW50aWZ5IHNldmVyYWwgaXNzdWVzLg0KPC9wPg0KPHA+VGhlIDAuMiByZWxlYXNlIGFkZHMgYSBy YW5nZSBvZiBmZWF0dXJlcyBhbmQgYnVnZml4ZXMsIGluY2x1ZGluZyBzdXBwb3J0IGZvciBPQ2Ft bCA0LjEyLngsIDQuMTMueCBhbmQgNC4xNC54IHdpdGhvdXQgdGhlDQo8Y29kZT5Eb21haW48L2Nv ZGU+IGFuZCA8Y29kZT5FZmZlY3Q8L2NvZGU+IG1vZGVzLiA8L3A+DQo8cD5EZXRhaWxlZCByZWxl YXNlIG5vdGVzIGFuZCBtb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBHaXRI dWIgcmVwb3NpdG9yeToNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNv cmUvbXVsdGljb3JldGVzdHMiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbXVs dGljb3JldGVzdHM8L2E+DQo8L3A+DQo8cD5IYXBweSB0ZXN0aW5nISA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjExIj5NZWxhbmdlIDEuMCDigJMgY29tcGlsZSBPQ2FtbCAvIFJlYXNv bk1MIHRvIEphdmFTY3JpcHQ8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0 ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tbWVsYW5nZS0xLTAtY29tcGlsZS1vY2FtbC1yZWFzb25tbC10by1qYXZhc2NyaXB0LzEy MzA1LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tZWxhbmdlLTEtMC1jb21w aWxlLW9jYW1sLXJlYXNvbm1sLXRvLWphdmFzY3JpcHQvMTIzMDUvMTwvYT4NCjwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjc5ZDFiNyIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZzI3OWQxYjciPkFudG9uaW8gTnVubyBNb250ZWlybyBhbm5vdW5jZWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzI3OWQxYjciPg0K PHA+VGhlIE1lbGFuZ2UgdGVhbSBhbmQgSSBhcmUgdGhyaWxsZWQgdG8gYW5ub3VuY2UgdGhlIHJl bGVhc2Ugb2YgTWVsYW5nZSAxLjAgdG9kYXksIG1hcmtpbmcgYSBtYWpvciBtaWxlc3RvbmUgaW4g dGhlIGxpZmUgb2YgdGhlIHByb2plY3QuIFRoaXMgcmVsZWFzZSByZXByZXNlbnRzIHRoZSBjdWxt aW5hdGlvbiBvZiBtYW55IG1vbnRocyBvZiBoYXJkIHdvcmsgYW5kIGluY3JlZGlibGUgY29sbGFi b3JhdGlvbi4NCjwvcD4NCjxwPk1lbGFuZ2UsIHdoaWNoIDxhIGhyZWY9Imh0dHBzOi8vYW5tb250 ZWlyby5jb20vMjAyMS8wMy9vbi1vY2FtbC1hbmQtdGhlLWpzLXBsYXRmb3JtLyI+DQpzdGFydGVk IGFzIGEgZm9yayBvZiBCdWNrbGVTY3JpcHQ8L2E+LCB3YXMgY3JlYXRlZCB3aXRoIHRoZSB2aXNp b24gb2YgbWFpbnRhaW5pbmcgY29tcGF0aWJpbGl0eSB3aXRoIE9DYW1sIGFuZCBwcm92aWRpbmcg dGhlIGJlc3QgT0NhbWwgZXhwZXJpZW5jZSB3aXRoaW4gdGhlIG1vZGVybiBKYXZhU2NyaXB0IGVj b3N5c3RlbS4gVG9kYXksIHdlIGFyZSBwcm91ZCB0byBwcmVzZW50IE1lbGFuZ2UgMS4wLCBhIG1h dHVyZSBhbmQgcmVsaWFibGUgdG9vbA0KIGZvciBjb21waWxpbmcgT0NhbWwgdG8gZWZmaWNpZW50 IGFuZCByZWFkYWJsZSBKYXZhU2NyaXB0IHRoYXQgdGVhbXMgcmVseSBvbiA8YSBocmVmPSJodHRw czovL3RlY2guYWhyZWZzLmNvbS9haHJlZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS1iMTRm NWVjNTZkZjQiPg0KdG8gZGVsaXZlciBjb21wbGV4IE9DYW1sIC8gUmVhc29uTUwgYXBwbGljYXRp b25zPC9hPi4gPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9tZWxhbmdlLzEu MC4wIj5HZXQgaXQgbm93PC9hPjogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIi Pg0KPHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+JCBvcGFtIGluc3RhbGwgbWVsYW5nZS4xLjAu MA0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn OWUzMGMyZiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzllMzBjMmYiPkhpZ2hsaWdo dHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzllMzBjMmYi Pg0KPHA+TWVsYW5nZSAxLjAgcmFkaWNhbGx5IGltcHJvdmVzIHVzZXIgZXhwZXJpZW5jZS4gVGhp cyByZWxlYXNlIGZvY3VzZXMgb24gcm9idXN0bmVzcywgT0NhbWwgY29tcGF0aWJpbGl0eSBhbmQg ZGV2ZWxvcGVyIGV4cGVyaWVuY2U6IE1lbGFuZ2UgaXMgZnVsbHkgZW1icmFjaW5nIHRoZQ0KPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybSI+T0NhbWwgUGxhdGZvcm08L2E+ IHRvIG1ha2UgaXQgZWFzeSBhbmQgcmVsaWFibGUgZm9yIE9DYW1sIHVzZXJzIHRvIHRhcmdldCBK YXZhU2NyaXB0Lg0KPC9wPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9 Im9yZ2YwZDIzNDQiPjwvYT5EdW5lIEludGVncmF0aW9uPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2YwZDIzNDQiPg0KPHA+SW50ZWdyYXRpbmcgd2l0aCBEdW5l IHdhcyBvdXIgYmlnZ2VzdCBwcmlvcml0eS4gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1kdW5lLTMtOC0wLzEyMjkxIj4NCkR1bmUgMy44PC9hPiwgcmVsZWFzZWQgdmVy eSByZWNlbnRseSwgYWRkcyBNZWxhbmdlIHN1cHBvcnQgYnkgdW5kZXJzdGFuZGluZyB0aGUgZm9s bG93aW5nIHR5cGVzIG9mIHN0YW56YXM6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRh aW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLWxpc3AiPihsaWJyYXJ5DQogIChtb2RlcyBtZWxh bmdlKSA8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPjs7 IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PiZsdDstIG5ldyBNZWxhbmdlIG1vZGU8L3NwYW4+DQopDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjog IzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+OzsgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ZW1pdCBKUyB0byB+anMtb3V0cHV0fiBm b2xkZXIgaW4gdGhpczwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1z dHlsZTogaXRhbGljOyI+OzsgPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9u dC1zdHlsZTogaXRhbGljOyI+ZGlyZWN0b3J5PC9zcGFuPg0KKG1lbGFuZ2UuZW1pdA0KICh0YXJn ZXQganMtb3V0cHV0KSkNCjwvcHJlPg0KPC9kaXY+DQo8cD5JbiBNZWxhbmdlIDEuMCwgdGhlIER1 bmUgaW50ZWdyYXRpb24gaXMgdGhlIG9mZmljaWFsbHkgc3VwcG9ydGVkIHdvcmtmbG93IHRvIGJ1 aWxkIE1lbGFuZ2UgcHJvamVjdHMuIEl0IHByb3ZpZGVzIHJvYnVzdCBydWxlIGdlbmVyYXRpb24s IHN0YXRpYyBhc3NldHMgc3VwcG9ydCAoeW91ciBIVE1MIC8gQ1NTIC8gU1ZHIC8gaW1hZ2VzKSwg c2VhbWxlc3MgZWRpdG9yIGludGVncmF0aW9uIChlLmcuIHdpdGggT0NhbWwgTFNQIG9yIE1lcmxp bikuDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcwNzU1YzZjIj48L2E+RG9jdW1l bnRhdGlvbjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcwNzU1 YzZjIj4NCjxwPldpdGggTWVsYW5nZSAxLjAsIHdl4oCZcmUgYWxzbyBsYXVuY2hpbmcgYSBuZXcg ZG9jdW1lbnRhdGlvbiBlZmZvcnQsIDxhIGhyZWY9Imh0dHBzOi8vbWVsYW5nZS5yZSI+DQptZWxh bmdlLnJlPC9hPi4gVGhpcyB3ZWJzaXRlIHNob3VsZCBjdXJyZW50bHkgYmUgY29uc2lkZXJlZCBh IHdvcmsgaW4gcHJvZ3Jlc3MsIGFuZCB3ZeKAmXJlIGxvb2tpbmcgZm9yIGZlZWRiYWNrIG9uIGhv dyB0byBiZXN0IGV4cGxhaW4gdGhlIE1lbGFuZ2Ugd29ya2Zsb3cgYW5kIGl0cyBhdmFpbGFibGUg ZmVhdHVyZXMuIEZlZWwgZnJlZSB0byBnZXQgaW4gdG91Y2ggaW4gdGhlDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vbWVsYW5nZS1yZS9tZWxhbmdlLXJlLmdpdGh1Yi5pbyI+T1NTIHJlcG9z aXRvcnk8L2E+LiA8L3A+DQo8cD5BZGRpdGlvbmFsbHksIHRoZSBEdW5lIGRvY3VtZW50YXRpb24g aW5jbHVkZXMgPGEgaHJlZj0iaHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL2xhdGVzdC9t ZWxhbmdlLmh0bWwiPg0KcmVmZXJlbmNlIG1hdGVyaWFsczwvYT4gc3BlY2lmaWMgdG8gdXNpbmcg TWVsYW5nZSB3aXRoIER1bmUuIDwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2QyNjRi ODciPjwvYT5FdmVyeXRoaW5nIGVsc2U8YnI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEg aWQ9Im9yZzRkZjAwNzMiPjwvYT5XaWRlciBPQ2FtbCB2ZXJzaW9uIHN1cHBvcnQ8YnI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNiIgaWQ9InRleHQtb3JnNGRmMDA3MyI+DQo8cD5NZWxhbmdl IHdhcyBwcmV2aW91c2x5IG9ubHkgYXZhaWxhYmxlIG9uIE9DYW1sIDQuMTQuIEluIHRoaXMgcmVs ZWFzZSwgd2XigJl2ZSB3aWRlbmVkIHRoYXQgcmFuZ2UgdG8gdmVyc2lvbnMgb2YgT0NhbWwgc3Rh cnRpbmcgZnJvbSB2ZXJzaW9uIDQuMTMuIFRoaXMgaW5jbHVkZXMgdGhlIE9DYW1sIDUgcmVsZWFz ZSBsaW5lIGFuZCBhbGxvd3MgTWVsYW5nZSBwcm9qZWN0cyB0byBzaGFyZSB0aGUgc2FtZSBPQ2Ft bCBjb21waWxlciBzd2l0Y2ggYXMNCiBlLmcuIHNlcnZlci1zaWRlIHByb2plY3RzLiA8L3A+DQo8 cD5FZGl0b3IgaW50ZWdyYXRpb24gaXMgdGhlIG9ubHkgY2F2ZWF0OiBpdCBvbmx5IHdvcmtzIG9u IE9DYW1sIDQuMTQsIHNpbmNlIE1lbGFuZ2UgZW1pdHMNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwu b3JnL3Avb2NhbWwtYmFzZS1jb21waWxlci80LjE0LjEvZG9jL0NtdF9mb3JtYXQvaW5kZXguaHRt bCI+DQo8Y29kZT4uY210PC9jb2RlPiBhcnRpZmFjdHM8L2E+ICh1c2VkIGJ5IGUuZy4gTFNQKSB0 YXJnZXRpbmcgdGhlIE9DYW1sIDQuMTQgYmluYXJ5IGZvcm1hdC4NCjwvcD4NCjwvZGl2Pg0KPC9s aT48bGk+PGEgaWQ9Im9yZzc3MWM0YzciPjwvYT5NdWx0aXBsZSBzeW50YXhlczxicj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC02IiBpZD0idGV4dC1vcmc3NzFjNGM3Ij4NCjxwPkR1bmUgc3Vw cG9ydHMgPGEgaHJlZj0iaHR0cHM6Ly9yZWFzb25tbC5naXRodWIuaW8vIj5SZWFzb25NTDwvYT4g b3V0IG9mIHRoZSBib3ggdmlhDQo8YSBocmVmPSJodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8v ZW4vc3RhYmxlL292ZXJ2aWV3Lmh0bWwjdGVybS1kaWFsZWN0Ij5kaWFsZWN0czwvYT4sIGtlZXBp bmcgUmVhc29uTUwgc3VwcG9ydCBpbiBNZWxhbmdlIHVuY2hhbmdlZCBmcm9tIGEgdXNlciBwZXJz cGVjdGl2ZS4gSW50ZXJuYWxseSwgaG93ZXZlciwgTWVsYW5nZSAxLjAgaGFzIGRyb3BwZWQgYW55 IGtub3dsZWRnZSBvZiBSZWFzb25NTCwgcmVseWluZyBvbiB0aGUgZXhpc3RpbmcsDQogYmF0dGxl LXRlc3RlZCBEdW5lIHN1cHBvcnQgZm9yIGRpYWxlY3RzIGluc3RlYWQuIDwvcD4NCjxwPkEgPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9yZXNjcmlwdC1zeW50YXgvMS4wLjAiPjxjb2RlPnJl c2NyaXB0LXN5bnRheDwvY29kZT48L2E+IHBhY2thZ2UgaXMgcGFydCBvZiB0aGUgTWVsYW5nZSBy ZWxlYXNlIHRvby4gSXQgZW5hYmxlcyBzdXBwb3J0IGZvciBSZVNjcmlwdCBzeW50YXggaW4gTWVs YW5nZSwgd2hpY2ggRHVuZSBhbHNvIHN1cHBvcnRzLiBLZWVwIGluIG1pbmQsIGhvd2V2ZXIsIHRo YXQgbmV3ZXIgUmVTY3JpcHQgZmVhdHVyZXMNCiBhcmUgdW5saWtlbHkgdG8gYmUgc3VwcG9ydGVk IGJ5IHRoaXMgYmVzdC1lZmZvcnQgY29tcGF0aWJpbGl0eSBwYWNrYWdlLiA8L3A+DQo8L2Rpdj4N CjwvbGk+PGxpPjxhIGlkPSJvcmdmYTQ4YzE3Ij48L2E+U2VwYXJhdGUgUFBYPGJyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTYiIGlkPSJ0ZXh0LW9yZ2ZhNDhjMTciPg0KPHA+QSBiaWcgYmVu ZWZpdCBvZiBkZWVwIGludGVncmF0aW9uIHdpdGggdGhlIE9DYW1sIHBsYXRmb3JtIGlzIGhhdmlu ZyB0aGUgZnJlZWRvbSB0byBhc3N1bWUgdGhhdCBhIG5hdGl2ZSB0b29sY2hhaW4gaXMgcHJlc2Vu dC4gVGhhdCBtYWRlIGl0IHBvc3NpYmxlIHRvIHVuYnVuZGxlIHRoZSBNZWxhbmdlIGRpc3RyaWJ1 dGlvbiBpbnRvIGEgZmV3IHNlcGFyYXRlIGNvbXBvbmVudHMuDQo8L3A+DQo8cD5NZWxhbmdlIG5v dyBzaGlwcyB3aXRoIGEgPGNvZGU+bWVsYW5nZS5wcHg8L2NvZGU+IHByZXByb2Nlc3NvciBiYXNl ZCBvbiA8YSBocmVmPSJodHRwczovL29jYW1sLXBweC5naXRodWIuaW8vcHB4bGliIj4NClBweGxp YjwvYT4gdGhhdCBjYW4gYmUgYWRkZWQgdG8gPGNvZGU+KHByZXByb2Nlc3MgKHBwcyBtZWxhbmdl LnBweCkpPC9jb2RlPiwgYXMgcGVyDQo8YSBocmVmPSJodHRwczovL2R1bmUucmVhZHRoZWRvY3Mu aW8vZW4vc3RhYmxlL3JlZmVyZW5jZS9wcmVwcm9jZXNzaW5nLXNwZWMuaHRtbCI+DQpEdW5l4oCZ cyBwcmVwcm9jZXNzaW5nIHNwZWNpZmljYXRpb248L2E+LiA8L3A+DQo8cD5UaGUgUmVhY3QgSlMg UFBYIChmb3IgUmVhc29uICYjNDM7IEpTWCkgaGFzIGFsc28gYmVlbiBleHRyYWN0ZWQgYW5kIGlz IG5vdyBkaXN0cmlidXRlZCBzZXBhcmF0ZWx5IGFzDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9y Zy9wL3JlYWN0anMtanN4LXBweC8xLjAuMCI+PGNvZGU+cmVhY3Rqcy1qc3gtcHB4PC9jb2RlPjwv YT4uDQo8L3A+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdjNzc3MjE1Ij48L2E+RW5hYmxp bmcgbW9kZXJuIEpTIHdvcmtmbG93czxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC02IiBp ZD0idGV4dC1vcmdjNzc3MjE1Ij4NCjxwPlRoZSBNZWxhbmdlIGRlc2lnbiBpbiBEdW5lIHdhcyBk ZXNpZ25lZCBmcm9tIGRheSBvbmUgd2l0aCB0aGUgZ29hbCBvZiBlbWJyYWNpbmcgdGhlIEphdmFT Y3JpcHQgcGxhdGZvcm06DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VGhlIER1bmUg aW50ZWdyYXRpb24gZ2VuZXJhdGVzIEphdmFTY3JpcHQgZmlsZXMgaW4gYSBwcmVkaWN0YWJsZSB3 YXkNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGUgcmVzdWx0aW5nIGxheW91dCB3b3JrcyB3 ZWxsIHdpdGggdGhlIE5vZGUuanMgPGEgaHJlZj0iaHR0cHM6Ly9ub2RlanMub3JnL2FwaS9tb2R1 bGVzLmh0bWwjYWxsLXRvZ2V0aGVyIj4NCm1vZHVsZSByZXNvbHV0aW9uIGFsZ29yaXRobTwvYT4s IHdoaWNoIG1vc3QgYnVuZGxlcnMgdW5kZXJzdGFuZC4gPC9saT48bGk+VGhlIEpTIG91dHB1dCBs YXlvdXQgaXMgPGEgaHJlZj0iaHR0cHM6Ly9tZWxhbmdlLnJlL3YxLjAuMC9idWlsZC1zeXN0ZW0v I2phdmFzY3JpcHQtYXJ0aWZhY3RzLWxheW91dCI+DQpkb2N1bWVudGVkIGhlcmU8L2E+LiA8L2xp PjwvdWw+DQo8L2xpPjxsaT5UbyBleGVyY2lzZSBtb2Rlcm4gd29ya2Zsb3dzLCBNZWxhbmdlIGhh cyBiZWVuIHRlc3RlZCBpbiBhIDxhIGhyZWY9Imh0dHBzOi8vbmV4dGpzLm9yZy8iPg0KTmV4dC5q czwvYT4gYXBwbGljYXRpb24gdXNpbmcgPGEgaHJlZj0iaHR0cHM6Ly9yZWFjdC5kZXYvYmxvZy8y MDIwLzEyLzIxL2RhdGEtZmV0Y2hpbmctd2l0aC1yZWFjdC1zZXJ2ZXItY29tcG9uZW50cyI+DQpS ZWFjdCBTZXJ2ZXIgQ29tcG9uZW50czwvYT4sIGFuZCB0aGUgYXZhaWxhYmxlIGNvbnN0cnVjdHMg d2VyZSBkZWVtZWQgc3VmZmljaWVudCB0byBlbmFibGUgc2ltaWxhciB1c2UgY2FzZXMuDQo8L2xp PjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdkYjYxOWFhIj48L2E+RnVsbCBsaXN0 IG9mIGNoYW5nZXM6PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTYiIGlkPSJ0ZXh0LW9y Z2RiNjE5YWEiPg0KPHA+VGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIGNhbiBiZSBjb25zdWx0ZWQg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZS9ibG9iL21haW4v Q2hhbmdlcy5tZCI+DQpoZXJlPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2EzMDMyMmQiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhMzAzMjJkIj5TdXBwb3J0ICZhbXA7IFNwb25zb3Jz aGlwPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdhMzAzMjJk Ij4NCjxwPlRoZSBlZmZvcnQgdGhhdCB3ZW50IGludG8gdGhpcyByZWxlYXNlIHdvdWxkIG5vdCBo YXZlIGJlZW4gcG9zc2libGUgd2l0aG91dCB0aGUgc3VwcG9ydCBvZiBtYW55Lg0KPC9wPg0KPHA+ V2XigJlkIGxpa2UgdG8gdGhhbmsgZXZlcnlvbmUgd2hvIG1hZGUgaXQgcG9zc2libGU6IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2FocmVmcy5jb20vIj5B aHJlZnM8L2E+IGhhcyBzaG93biBpbnRlcmVzdCBpbiBNZWxhbmdlIDxhIGhyZWY9Imh0dHBzOi8v dGVjaC5haHJlZnMuY29tL2J1aWxkaW5nLWFocmVmcy1jb2RlYmFzZS13aXRoLW1lbGFuZ2UtOWY4 ODFmNmQwMjJiIj4NCnNpbmNlIGl0cyBmaXJzdCBhbm5vdW5jZW1lbnQ8L2E+LiBTaW5jZSBPY3Rv YmVyIDIwMjIsIEFocmVmc+KAmXMgY3J1Y2lhbCBzcG9uc29yc2hpcCBoYXMgbWFkZSBpdCBwb3Nz aWJsZSB0bw0KPGEgaHJlZj0iaHR0cHM6Ly90ZWNoLmFocmVmcy5jb20vYWhyZWZzLWlzLW5vdy1i dWlsdC13aXRoLW1lbGFuZ2UtYjE0ZjVlYzU2ZGY0Ij5idWlsZCBpdHMgY29kZWJhc2Ugd2l0aCBN ZWxhbmdlPC9hPiBhbmQgd29yayBvbiB0aGlzIHJlbGVhc2UuDQo8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL3d3dy5xd2ljay5jb20vIj5Rd2ljazwvYT4sIHdobyBoYXMgYmVlbiBydW5uaW5nIE1l bGFuZ2Ugc2luY2UgTm92ZW1iZXIgMjAyMiwgcHJvdmlkaW5nIGludmFsdWFibGUgZmVlZGJhY2ss IGZpbmFuY2lhbCBiYWNraW5nIGFuZCBhbiBvcGVuLW1pbmRlZCB0ZWFtIHdpbGxpbmcgdG8gdHJ5 IG5ldyBkaXJlY3Rpb25zLg0KPC9saT48bGk+VGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtc2Yu b3JnLyI+T0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gcHJldmlvdXNseSA8YSBocmVmPSJo dHRwczovL3R3aXR0ZXIuY29tL19hbm1vbnRlaXJvL3N0YXR1cy8xNTg5MDQ0MzUyNDc5MDM1Mzkz Ij4NCmNvbW1pdHRlZCBmdW5kaW5nPC9hPiBmb3IgdGhlIE1lbGFuZ2UgcHJvamVjdCBpbiBPY3Rv YmVyIDIwMjIsIGFuZCBoYXMgcmVjZW50bHkgYXBwcm92ZWQgYSBuZXcgcm91bmQgb2YgT1NTIHNw b25zb3JzaGlwLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3Jz L2FubW9udGVpcm8vIj5NeSAoQW50b25pbykgc3BvbnNvcnM8L2E+IG9uIEdpdEh1YiwgYm90aCBw YXN0IGFuZCBwcmVzZW50DQo8L2xpPjwvdWw+DQo8cD5XZeKAmWQgYWxzbyBsaWtlIHRvIHRoYW5r IHRoZSBmb2xsb3dpbmcgbm90YWJsZSBjb250cmlidXRvcnMgdG8gdGhpcyByZWxlYXNlOiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Jn cmluYmVyZyI+UnVkaSBHcmluYmVyZzwvYT4sIGZvciBoaXMgaW5kaXNwZW5zYWJsZSBndWlkYW5j ZSBhbmQgZGlyZWN0aW9uIG9uIHRoZSBkZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIG9mIHRoZSBE dW5lIGludGVncmF0aW9uLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2pj aGF2YXJyaSI+SmF2aWVyIENow6F2YXJyaTwvYT4sIGZvciBtaWdyYXRpbmcgYSBodWdlIHByb2R1 Y3Rpb24gY29kZWJhc2UgYXQgQWhyZWZzIHRvIE1lbGFuZ2UsIHdvcmtpbmcgb24gdGhlIER1bmUg aW50ZWdyYXRpb24sIHRoZSBNZWxhbmdlIGRvY3VtZW50YXRpb24gZWZmb3J0IGFuZCBwcm92aWRp bmcgdml0YWwgZmVlZGJhY2sgdG8gdGhlIHByb2plY3QuDQo8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vZGF2ZXNueCI+RGF2aWQgU2FuY2hvPC9hPiwgZm9yIHRyeWluZyBvdXQg b3VyIG1vc3QgYmxlZWRpbmcgZWRnZSBpZGVhcyBhbmQgcHJvdmlkaW5nIGVhcmx5IGZlZWRiYWNr IG9uIGhvdyB0byBtb3ZlIGZvcndhcmQgd2l0aCB3YXlzIHRoYXQgZW5jb21wYXNzIHRoZSB3aG9s ZSBlY29zeXN0ZW0uDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnOTQ3ZGUxMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzk0 N2RlMTMiPkxvb2tpbmcgRm9yd2FyZDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnOTQ3ZGUxMyI+DQo8cD5XZSBhcmUgZW50aHVzaWFzdGljIGFib3V0IHRoZSBw cm9ncmVzcyB3ZSBoYXZlIG1hZGUgYW5kIHRoZSBwb3NpdGl2ZSBmZWVkYmFjayB3ZSBoYXZlIHJl Y2VpdmVkIGZyb20gdGhlIGNvbW11bml0eS4gV2UgcmVtYWluIGNvbW1pdHRlZCB0byBjb250aW51 b3VzbHkgaW1wcm92aW5nIE1lbGFuZ2UsIGVuc3VyaW5nIGl0IHJlbWFpbnMgYSByb2J1c3QgYW5k IGVmZmljaWVudCB0b29sIGZvciBPQ2FtbCBkZXZlbG9wZXJzIHRhcmdldGluZyB0aGUgSmF2YVNj cmlwdA0KIHBsYXRmb3JtLiA8L3A+DQo8cD5PdXIgPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLmdvb2ds ZS5jb20vZG9jdW1lbnQvZC8xMjc5ZXVUOUxlSklrd0FVWXFhenFlaDJsYzhjN1RMUWFwMl8ydkJO Y0s0dy8iPg0KUTIgMjAyMyByb2FkbWFwPC9hPiBpbmNsdWRlcyBtb3N0IG9mIHRoZSBnb2FscyB0 aGF0IHdlIHNldCBvdXQgdG8gYWNoaWV2ZSBvdmVyIHRoZSBwYXN0IGZldyBtb250aHMsIGFuZCBz b21lIG9mIHdoYXQgd2XigJlyZSB0aGlua2luZyBhYm91dCB3b3JraW5nIGluIHRoZSBtb250aHMg YWhlYWQuIE1lbGFuZ2UgMS4wIG9ubHkgbWFya3MgdGhlIGJlZ2lubmluZyBvZiBvdXIgam91cm5l eSB0b3dhcmRzIHRoZSBiZXN0IE9DYW1sIGV4cGVyaWVuY2Ugb24gdGhlDQogSlMgcGxhdGZvcm0u IDwvcD4NCjxwPkZpbmFsbHksIHdlIHdvdWxkIGxpa2UgdG8gZXh0ZW5kIG91ciBkZWVwZXN0IHRo YW5rcyB0byBldmVyeW9uZSB3aG8gaGFzIHN1cHBvcnRlZCB0aGUgcHJvamVjdCwgd2hldGhlciB0 aHJvdWdoIGNvZGUgY29udHJpYnV0aW9ucywgdGVzdGluZywgb3IgcHJvdmlkaW5nIGZlZWRiYWNr LiBUaGlzIGlzIHlvdXIgYWNoaWV2ZW1lbnQgYXMgbXVjaCBhcyBpdCBpcyBvdXJzLCBhbmQgd2Ug bG9vayBmb3J3YXJkIHRvIGNvbnRpbnVpbmcgdGhpcyBqb3VybmV5DQogdG9nZXRoZXIuIDwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItMTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMiI+RGVidWdnaW5nIE5hdGl2ZSBD b2RlIGluIOKAnFNlY29uZCBPQ2FtbOKAnSBZb3VUdWJlIFZpZGVvPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRlYnVnZ2luZy1uYXRpdmUtY29kZS1pbi1zZWNv bmQtb2NhbWwteW91dHViZS12aWRlby8xMjMxNS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZGVidWdnaW5nLW5hdGl2ZS1jb2RlLWluLXNlY29uZC1vY2FtbC15b3V0dWJlLXZp ZGVvLzEyMzE1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzY0YzllNTYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2NGM5ZTU2Ij5qYmVj a2ZvcmQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc2NGM5ZTU2Ij4NCjxwPkluIHJlc3BvbnNlIHRvIGFuIGVhcmxpZXIgcG9zdCAoPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2VuaGFuY2luZy1vY2FtbC1kZWJ1Z2dpbmct ZXhwZXJpZW5jZS1pbi12aXN1YWwtc3R1ZGlvLWNvZGUvMTIyMzYvND91PWpiZWNrZm9yZCI+aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2VuaGFuY2luZy1vY2FtbC1kZWJ1Z2dpbmctZXhwZXJp ZW5jZS1pbi12aXN1YWwtc3R1ZGlvLWNvZGUvMTIyMzYvND91PWpiZWNrZm9yZDwvYT4pDQogSeKA mXZlIHVwbG9hZGVkIGEgdmlkZW8gb24gWW91VHViZS4gPC9wPg0KPHA+RGlyZWN0IExpbms6IDxh IGhyZWY9Imh0dHBzOi8veW91dHUuYmUvT1YxOV9GcUFVQ3ciPmh0dHBzOi8veW91dHUuYmUvT1Yx OV9GcUFVQ3c8L2E+DQo8L3A+DQo8cD5RdWljayBTdW1tYXJ5OiBQcmUtcmVxdWlzaXRlIHNraWxs IGlzIHRoZSBhYmlsaXR5IHRvIGNvbXBpbGUgeW91ciBvd24gT0NhbWwgY29tcGlsZXIuIE9ubHkg bWFjT1MgYW5kIExpbnV4LiBCcmVha3BvaW50cyBhbmQgc2luZ2xlLXN0ZXBwaW5nOyBubyBkaXNw bGF5IG9mIE9DYW1sIHZhbHVlcy4NCjwvcD4NCjxwPkhvcGVmdWxseSBpdCB3aWxsIGJlIHRoZSBm aXJzdCBvZiBzZXZlcmFsIGlmIGEgZmV3IHBlb3BsZSBzdWJzY3JpYmUgb3IgY29tbWVudC4gVGhl IHZpZGVvLCBhbmQgb3RoZXJzIHRoYXQgSSBtYXkgbWFrZSBmb3IgdGhhdCBuZXcgY2hhbm5lbCwg YXJlDQo8Yj5ub3QgZm9yIE9DYW1sIGJlZ2lubmVyczwvYj4uIDwvcD4NCjxwPjxpPkFzaWRlOiBQ ZXJzb25hbGx5LCBJIGRvbuKAmXQgYmVjb21lIGEgYmVnaW5uZXIgaW4gYSBuZXcgc3ViamVjdCB3 aXRob3V0IGZpcnN0IGhhdmluZyBhIGdsaW1wc2Ugb2Ygd2hhdCBJIGNhbiBhY2NvbXBsaXNoIGlu IHRoYXQgc3ViamVjdC4gTXkgZXhwZWN0YXRpb24gaXMgdGhhdCB0aGUgcGVvcGxlIGN1cmlvdXMg YWJvdXQgT0NhbWwgbWF5IGxhbmQgb24gYSBmZXcgdmlkZW9zIGFuZCB0aGVuIGJlY29tZSBiZWdp bm5lcnMuPC9pPg0KPC9wPg0KPHA+U2luY2UgdGhpcyBpcyBteSB2ZXJ5IGZpcnN0IFlvdVR1YmUg dmlkZW8sIEnigJlkIGFwcHJlY2lhdGUgZmVlZGJhY2shIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEzIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMTMiPlNhbmRtYXJrIG5pZ2h0bHkgbm93IHN1cHBvcnRzIGxhdGVuY3kgcHJvZmls aW5nPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMyI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNhbmRtYXJr LW5pZ2h0bHktbm93LXN1cHBvcnRzLWxhdGVuY3ktcHJvZmlsaW5nLzEyMzE4LzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zYW5kbWFyay1uaWdodGx5LW5vdy1zdXBwb3J0cy1s YXRlbmN5LXByb2ZpbGluZy8xMjMxOC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdiOWU4Yjk0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn YjllOGI5NCI+UHVuZWV0aCBDaGFnYW50aSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2I5ZThiOTQiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9z YW5kbWFyay50YXJpZGVzLmNvbS8iPlNhbmRtYXJrIG5pZ2h0bHk8L2E+IG5vdyBtb25pdG9ycyB0 YWlsIGxhdGVuY3kgb2Ygc2VxdWVudGlhbCBhbmQgcGFyYWxsZWwgYXBwbGljYXRpb25zIGVuYWJs ZWQgYnkgbmV3IGZlYXR1cmVzIGluIE9DYW1sIDUuDQo8L3A+DQo8ZGl2IGlkPSJvcmc4ZGFjYTdj IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2Ut Y2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvMi8yOGJlZDVhZmI1 NWY0ZDgxODJmN2I4MzkxM2Q3ZDczZDY2NmViODM1XzJfMTM4MHg0MDQucG5nIiBhbHQ9IjI4YmVk NWFmYjU1ZjRkODE4MmY3YjgzOTEzZDdkNzNkNjY2ZWI4MzVfMl8xMzgweDQwNC5wbmciPg0KPC9w Pg0KPC9kaXY+DQo8cD48YSBocmVmPSJodHRwczovL3NhbmRtYXJrLnRhcmlkZXMuY29tLz9hcHA9 c2VxdWVudGlhbC1sYXRlbmN5JmFtcDtwYXVzZXRpbWVzX3NlcV8wMD10dXJpbmcmYW1wO3BhdXNl dGltZXNfc2VxX2ZpbmRfYnk9aG9zdG5hbWUmYW1wO3BhdXNldGltZXNfc2VxXzEwPXR1cmluZyZh bXA7cGF1c2V0aW1lc19zZXFfMDE9MjAyMzA2MDEmYW1wO3BhdXNldGltZXNfc2VxXzEyPSU1QiUy N3R1cmluZ181LjIuMCUyQnRydW5rJTJCYmFydG9zem1vZGVsc2tpJTJCcHIxMjIxMiUyQnBhdXNl dGltZXNfc2VxXzIwMjMwNTMwX2E2ZjMwOWYlMjclNUQmYW1wO3BhdXNldGltZXNfc2VxXzExPTIw MjMwNTMwJmFtcDtwYXVzZXRpbWVzX3NlcV8wMj10dXJpbmdfNS4yLjAlMkJ0cnVuayUyQnBhdXNl dGltZXNfc2VxXzIwMjMwNjAxXzIyNGMxNGMmYW1wO3BhdXNldGltZXNfc2VxX251bV92YXJpYW50 cz0yIj5DbGljaw0KIHRvIHNlZSB0aGUgU2VxdWVudGlhbCBsYXRlbmN5IGJlbmNobWFyayBydW48 L2E+IDwvcD4NCjxkaXYgaWQ9Im9yZzQzNTQ4ZDMiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBz cmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29j YW1sL29wdGltaXplZC8yWC9iL2I4NDljMjMxNjAyNmY0M2QwYzJjZjI4NTVkZjI5ODE3NzMzOWQx YzdfMl8xMzgweDkzOC5qcGVnIiBhbHQ9ImI4NDljMjMxNjAyNmY0M2QwYzJjZjI4NTVkZjI5ODE3 NzMzOWQxYzdfMl8xMzgweDkzOC5qcGVnIj4NCjwvcD4NCjwvZGl2Pg0KPHA+PGEgaHJlZj0iaHR0 cHM6Ly9zYW5kbWFyay50YXJpZGVzLmNvbS8/YXBwPXBhcmFsbGVsLWxhdGVuY3kmYW1wO3BhdXNl dGltZXNfcGFyX251bV92YXJpYW50cz0yJmFtcDtwYXVzZXRpbWVzX3Bhcl8wMT0yMDIzMDUzMSZh bXA7cGF1c2V0aW1lc19wYXJfZmluZF9ieT1ob3N0bmFtZSZhbXA7cGF1c2V0aW1lc19wYXJfMDI9 bmF2YWpvXzUuMi4wJTJCdHJ1bmslMkJwYXVzZXRpbWVzX3Bhcl8yMDIzMDUzMV8yMjRjMTRjJmFt cDtwYXVzZXRpbWVzX3Bhcl8wMD1uYXZham8mYW1wO3BhdXNldGltZXNfcGFyXzEyPW5hdmFqb181 LjIuMCUyQnRydW5rJTJCcGF1c2V0aW1lc19wYXJfMjAyMzA1MjZfODc3ODc4MCZhbXA7cGF1c2V0 aW1lc19wYXJfMTA9bmF2YWpvJmFtcDtwYXVzZXRpbWVzX3Bhcl8xMT0yMDIzMDUyNiI+Q2xpY2sN CiBoZXJlIHRvIHNlZSB0aGUgUGFyYWxsZWwgbGF0ZW5jeSBiZW5jaG1hcmsgcnVuPC9hPiA8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg1NzBlNjciIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4NTcwZTY3Ij5JbnN0cnVtZW50ZWQgcnVudGltZSBvZiB0 aGUgcGFzdDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnODU3 MGU2NyI+DQo8cD5JbiB0aGUgcGFzdCwgU2FuZG1hcmsgdXNlZCB0byBzdXBwb3J0IG1vbml0b3Jp bmcgR0MgbGF0ZW5jaWVzIHVzaW5nIHRoZSBpbnN0cnVtZW50ZWQgcnVudGltZSB0aGF0IHdhcyBw cmVzZW50IGluIE9DYW1sIDQuIEJ1dCB0aGlzIEdDIGxhdGVuY3kgZmVhdHVyZSB3YXMgZGlzYWJs ZWQgZHVlIHRvIGJyZWFraW5nIGNoYW5nZXMgaW4gU2FuZG1hcmsgd2hlbiBtb3ZpbmcgZnJvbSBP Q2FtbCA0IHRvIE9DYW1sIDUuIEl0IGlzIGFsc28gdXNlZnVsDQogdG8gbm90ZSB0aGF0IHRoZSBp bnN0cnVtZW50ZWQgcnVudGltZSB3cm90ZSB0byBhIGZpbGUsIGFuZCBoYWQgYSBub3RpY2VhYmxl IGltcGFjdCBvbiB0aGUgcHJvZ3JhbSBzcGVlZC4gQXMgYSByZXN1bHQsIHRoaXMgaW5zdHJ1bWVu dGF0aW9uIGhhZCB0byBiZSBlbmFibGVkIHdpdGggYSBjb21waWxlLXRpbWUgZmxhZyB0aGF0IGxp bmtlZCB0aGUgaW5zdHJ1bWVudGVkIHJ1bnRpbWUgd2l0aCB0aGUgYXBwbGljYXRpb24gcmF0aGVy IHRoYW4gdGhlDQogZGVmYXVsdCBydW50aW1lLiBUaGUgaW5zdHJ1bWVudGVkIHJ1bnRpbWUgd2Fz IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGdyYXBocyB0aGF0IHdlcmUgdXNlZCBpbiB0aGUgSUNGUCBw YXBlciwNCjxhIGhyZWY9Imh0dHBzOi8va2NzcmsuaW5mby9wYXBlcnMvcmV0cm8tcGFyYWxsZWxf aWNmcF8yMC5wZGYiPlJldHJvZml0dGluZyBQYXJhbGxlbGlzbSBvbnRvIE9DYW1sPC9hPiAoRmln IDEwIGFuZCBGaWcgMTIpLiBIb3dldmVyLCBnaXZlbiBpdHMgY29zdCwgdGhlIGluc3RydW1lbnRl ZCBydW50aW1lIHdhcyBzZWVuIGFzIG9ubHkgdG8gYmUgdXNlZCBieSBHQyBoYWNrZXJzIGZvciBw ZXJmb3JtYW5jZSBkZWJ1Z2dpbmcuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnMTY2NzExNSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzE2NjcxMTUiPkxhdGVuY3kgcHJvZmlsaW5nIHRocm91Z2ggb2xseTwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMTY2NzExNSI+DQo8cD5PQ2FtbCA1IHN1cHBv cnRzIDxhIGhyZWY9Imh0dHBzOi8vdjIub2NhbWwub3JnL3JlbGVhc2VzLzUuMC9hcGkvUnVudGlt ZV9ldmVudHMuaHRtbCI+DQpSdW50aW1lIEV2ZW50czwvYT4g4oCUIGEgbmV3IGZlYXR1cmUgdGhh dCBlbmFibGVzIGNvbnRpbnVvdXMgbW9uaXRvcmluZyBvZiBwcm9kdWN0aW9uIGFwcGxpY2F0aW9u cy4gVGhlIGtleSBkaWZmZXJlbmNlcyB0byB0aGUgZWFybGllciBpbnN0cnVtZW50ZWQgcnVudGlt ZSBhcHByb2FjaCBhcmUNCjwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5JbnN0ZWFkIG9m IGEgZmlsZSwgdGhlIGV2ZW50cyBhcmUgbm93IHdyaXR0ZW4gdG8gYSBzaGFyZWQgaW4tbWVtb3J5 IHJpbmcuIFRoZSBldmVudHMgbWF5IGJlIHJlYWQgb3V0IGJ5IGFuIGV4dGVybmFsIHByb2Nlc3Mg ZnJvbSB0aGlzIHJpbmcuDQo8L2xpPjxsaT5Tb21lIG9mIHRoZSBmcmVxdWVudCAoZXhwZW5zaXZl KSBwcm9iZXMgYXNzb2NpYXRlZCBhcmUgZXNjaGV3ZWQgdG8ga2VlcCB0aGUgY29zdHMgbG93LiBU aGUgZXhwZW5zaXZlIHByb2JlcyBhcmUgc3RpbGwgYXZhaWxhYmxlIHVzaW5nIHRoZSBpbnN0cnVt ZW50ZWQgcnVudGltZS4NCjwvbGk+PC9vbD4NCjxwPkR1ZSB0byB0aGlzIGRlc2lnbiwgZXZlcnkg T0NhbWwgNSBwcm9ncmFtIG1heSBiZSBjb250aW51b3VzbHkgbW9uaXRvcmVkIGZvciBwZXJmb3Jt YW5jZSwgbm90IGp1c3QgdGhlIG9uZXMgY29tcGlsZWQgd2l0aCB0aGUgaW5zdHJ1bWVudGVkIHJ1 bnRpbWUuIE9uIHRvcCBvZiB0aGlzIHJ1bnRpbWUgZXZlbnRzIGZlYXR1cmUsIHdlIGhhdmUgYnVp bHQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90YXJpZGVzL3J1bnRpbWVfZXZlbnRzX3Rv b2xzIj5vbGx5PC9hPiwgYW4gb2JzZXJ2YWJpbGl0eSB0b29sIGZvciBPQ2FtbCBwcm9ncmFtcy4g T2xseSBjYW4gZXh0cmFjdCB0cmFjZXMgb2YgR0MgZXZlbnRzIHRoYXQgY2FuIGJlIHZpZXdlZCBi eQ0KPGEgaHJlZj0iaHR0cHM6Ly9wZXJmZXR0by5kZXYvIj5QZXJmZXR0bzwvYT4gYW5kIGFsc28g cHJvZHVjZSBhIHNob3J0IHJlcG9ydCBvbiBHQyBiZWhhdmlvdXIgaW5jbHVkaW5nIHRhaWwgbGF0 ZW5jeSBwcm9maWxlcy4NCjwvcD4NCjxwPlRoZSBTYW5kbWFyayB0ZWFtIGhhcyBub3cgcmVwbGFj ZWQgdGhlIG9sZCBsYXRlbmN5IHByb2ZpbGluZyBmZWF0dXJlIGRldmVsb3BlZCBvdmVyIE9DYW1s IDQgaW5zdHJ1bWVudGVkIHJ1bnRpbWVzIHRvIHVzaW5nIG9sbHkgdG8gZ2VuZXJhdGUgdGhlIHBy b2ZpbGVzLiAoU2VlIFNhbmRtYXJrIFBSDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtYmVuY2gvc2FuZG1hcmsvcHVsbC80MjQiPmhlcmU8L2E+KS4gTm93LCB0aGUgT0NhbWwgY29t cGlsZXIgaXMgY29udGludW91c2x5IG1vbml0b3JlZCBub3Qgb25seSBmb3Igc3BlZWQgYW5kIG1l bW9yeSB1c2FnZSwgYnV0IGFsc28gZm9yIGxhdGVuY3kuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOGEyYzBiYSIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzhhMmMwYmEiPkNhbGwgZm9yIGFjdGlvbjwvaDQ+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOGEyYzBiYSI+DQo8cD5JZiB5b3UgYXJlIGludGVy ZXN0ZWQgaW4gcHJvZmlsaW5nIGFuZCBhbmFseXNpbmcgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBk ZXZlbG9wbWVudCBicmFuY2ggb2YgdGhlIE9DYW1sIGNvbXBpbGVyLCBwbGVhc2Ugc3VibWl0IHlv dXIgYnJhbmNoIHRocm91Z2gNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1iZW5j aC9zYW5kbWFyay1uaWdodGx5LWNvbmZpZy8iPlNhbmRtYXJrIE5pZ2h0bHkgQ29uZmlnPC9hPi4N CjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxNCI+VXBkYXRlIG9uIEVp byAoZWZmZWN0cy1iYXNlZCBkaXJlY3Qtc3R5bGUgSU8gZm9yIE9DYW1sIDUpPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXBkYXRlLW9uLWVpby1lZmZlY3RzLWJhc2Vk LWRpcmVjdC1zdHlsZS1pby1mb3Itb2NhbWwtNS8xMDM5NS8zIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC91cGRhdGUtb24tZWlvLWVmZmVjdHMtYmFzZWQtZGlyZWN0LXN0eWxlLWlvLWZv ci1vY2FtbC01LzEwMzk1LzM8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2YwNTg0OTciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmMDU4NDk3 Ij5UaG9tYXMgTGVvbmFyZCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2YwNTg0OTciPg0KPHA+V2l0aCBFaW8gMC4xMCBqdXN0IHJlbGVhc2Vk LCBpdOKAmXMgdGltZSBmb3IgYW5vdGhlciB1cGRhdGUhIFNpbmNlIHRoZSBhYm92ZSBwb3N0ICh3 aGljaCB3YXMgZm9yIEVpbyAwLjUpLCBzb21lIG9mIHRoZSBiaWdnZXIgY2hhbmdlcyBhcmU6DQo8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QSBuZXcgZWlvX3Bvc2l4IGJhY2tlZCBmb3Ig VW5peC10eXBlIHN5c3RlbXMgcHJvdmlkZXMgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB0 aGUgb2xkIGxpYnV2IG9uZS4gUmVtb3ZpbmcgbGlidXYgaGFzIGFsc28gbWFkZSBpdCBzYWZlIHRv IHNoYXJlIGZpbGUtZGVzY3JpcHRvcnMgYmV0d2VlbiBkb21haW5zLCBzbyB5b3UgY2FuIG5vdyBh Y2NlcHQgYSBjb25uZWN0aW9uIHdpdGggb25lIGRvbWFpbiBhbmQgaGFuZGxlIGl0IHdpdGggYW5v dGhlciwNCiBmb3IgZXhhbXBsZS4gPC9saT48bGk+VGhlcmUgaXMgbm93IGFuIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvI3J1bm5pbmctcHJvY2Vzc2VzIj4N CkFQSSBmb3Igc3Bhd25pbmcgc3ViLXByb2Nlc3NlczwvYT4uIDwvbGk+PGxpPk5ldHdvcmtpbmcg Y2hhbmdlcyBpbmNsdWRlIGJldHRlciBzdXBwb3J0IGZvciBkYXRhZ3JhbSBzb2NrZXRzIGFuZCB0 aGUgbmV3IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9laW8vZWlv L0Vpby9OZXQvaW5kZXguaHRtbCNydW5uaW5nLXNlcnZlcnMiPg0KRWlvLk5ldC5ydW5fc2VydmVy PC9hPiBjb252ZW5pZW5jZSBmdW5jdGlvbi4gPC9saT48bGk+TWFueSBvZiB0aGUgZGF0YS1zdHJ1 Y3R1cmVzIChwcm9taXNlcywgY29uZGl0aW9ucywgc2VtYXBob3JlcyBhbmQgc3luY2hyb25vdXMg c3RyZWFtcykgYXJlIG5vdyBsb2NrLWZyZWUsIG1ha2luZyB0aGVtIGZhc3RlciB0byB1c2UgYWNy b3NzIG11bHRpcGxlIGRvbWFpbnMuDQo8L2xpPjxsaT5JdCBpcyBzYWZlIHRvIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvI2V4YW1wbGUtc2lnbmFsLWhhbmRs ZXJzIj4NCmhhbmRsZSBzaWduYWxzIGluIEVpbzwvYT4gbm93IHRoYXQgPGNvZGU+RWlvLkNvbmRp dGlvbi5icm9hZGNhc3Q8L2NvZGU+IGlzIGxvY2stZnJlZSAoc2lnbmFsIGhhbmRsZXJzIGNhbuKA mXQgdGFrZSBsb2Nrcywgc2luY2UgdGhleSBtYXkgaGF2ZSBpbnRlcnJ1cHRlZCB0aGUgdGhyZWFk IGhvbGRpbmcgdGhlIGxvY2spLiBUaG91Z2ggbm90ZSB0aGF0IHJlbGlhYmxlIHNpZ25hbCBoYW5k bGluZyBvbiBPQ2FtbCA1IHJlcXVpcmVzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzEyMjUzIj5PQ2FtbCMxMjI1MzwvYT4gdG8gYmUgZml4ZWQgdG9vLg0K PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2Vpby9l aW8vRWlvL0ZpYmVyL2luZGV4Lmh0bWwjdmFsLWZvcmtfc2VxIj5GaWJlci5mb3JrX3NlcTwvYT4g cHJvdmlkZXMgYW4gZWFzeSB3YXkgdG8gY3JlYXRlIGdlbmVyYXRvciBmdW5jdGlvbnMuDQo8L2xp PjxsaT5FaW8gbm93IHN1cHBvcnRzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUvZG9tYWluLWxvY2FsLWF3YWl0Ij4NCmRvbWFpbi1sb2NhbC1hd2FpdDwvYT4sIHdo aWNoIGFsbG93cyBzaGFyaW5nIGUuZy4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s LW11bHRpY29yZS9rY2FzIj4NCmtjYXM8L2E+IGRhdGEtc3RydWN0dXJlcyBhY3Jvc3MgRWlvIGFu ZCBEb21haW5zbGliIGRvbWFpbnMuIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1tdWx0aWNvcmUvZWlvL2Jsb2IvbWFpbi9SRUFETUUubWQjZXJyb3ItaGFuZGxpbmci PkVycm9yIGhhbmRsaW5nPC9hPiBoYXMgYmVlbiBpbXByb3ZlZC4gWW91IGNhbiBub3cgYWRkIGV4 dHJhIGNvbnRleHQgaW5mb3JtYXRpb24gdG8gZXJyb3JzIChlLmcuIGFuIGVycm9yIG9wZW5pbmcg YSBtaXNzaW5nIGZpbGUgd2lsbCBub3cgaW5jbHVkZSB0aGUgcGF0aCBvZiB0aGUgZmlsZSkuIFlv dQ0KIGNhbiBhbHNvIGNob29zZSBob3cgc3BlY2lmaWMgdG8gYmU6IGUuZy4geW91IGNhbiBjYXRj aCBhbGwgSU8gZXJyb3JzLCBhbGwgbmV0d29yayBlcnJvcnMsIG9yIGFsbCBjb25uZWN0aW9uIHJl c2V0IGVycm9ycy4NCjwvbGk+PGxpPlRoZXJlIGFyZSBhbHNvIHNvbWUgZXhwZXJpbWVudGFsIGJh Y2tlbmRzIHVuZGVyIGRldmVsb3BtZW50Og0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9UaGVMb3J0ZXgvZWlvLXNvbG81Ij5laW9fc29sbzU8L2E+ IGlzIGZvciBNaXJhZ2VPUyB1bmlrZXJuZWxzLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vcHVsbC80MDUiPmVpb19qczwvYT4gaXMgZm9y IGJyb3dzZXJzLg0KPC9saT48bGk+ZWlvX3dpbmRvd3MgaXMgZm9yIFdpbmRvd3MgLSBzZWUgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vaXNzdWVzLzEyNSI+ DQojMTI1PC9hPiBpZiB5b3XigJlkIGxpa2UgdG8gaGVscCBvdXQuIDwvbGk+PC91bD4NCjwvbGk+ PC91bD4NCjxwPkEgbW9yZSBkZXRhaWxlZCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGlu IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpby9yZWxl YXNlcyI+DQpyZWxlYXNlIG5vdGVzPC9hPi4gPC9wPg0KPHA+RWlv4oCZcyA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpby9ibG9iL21haW4vUkVBRE1FLm1kIj5S RUFETUUubWQ8L2E+IHByb3ZpZGVzIGFuIGludHJvZHVjdGlvbiB0byBtb3N0IG9mIHRoZSBmZWF0 dXJlcy4NCjwvcD4NCjxwPklmIHlvdeKAmWQgbGlrZSB0byBnZXQgaW52b2x2ZWQsIHRoZSBuZXcg PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vYmxvYi9tYWlu L0hBQ0tJTkcubWQiPg0KSEFDS0lORy5tZDwvYT4gZG9jdW1lbnQgZXhwbGFpbnMgdGhlIHN0cnVj dHVyZSBvZiB0aGUgY29kZSBmb3IgcGVvcGxlIHdobyB3YW50IHRvIGNvbnRyaWJ1dGUgdG8gRWlv LCBhbmQgdGhlcmUgYXJlIHJlZ3VsYXINCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9laW8tZGV2ZWxvcGVyLW1lZXRpbmdzLzEyMjA3Ij5FaW8gZGV2ZWxvcGVyIG1lZXRpbmdz PC9hPiBmb3IgYW55b25lIHdobyB3YW50cyB0byBnZXQgaW52b2x2ZWQuDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xNSIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjE1Ij5Jbml0aWFsIEVtaXNzaW9ucyBNb25pdG9yaW5nIG9mIHRo ZSBPQ2FtbC5vcmcgSW5mcmFzdHJ1Y3R1cmU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTE1Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9pbml0aWFsLWVtaXNzaW9ucy1tb25pdG9yaW5nLW9mLXRoZS1vY2FtbC1vcmct aW5mcmFzdHJ1Y3R1cmUvMTIzMzUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW5p dGlhbC1lbWlzc2lvbnMtbW9uaXRvcmluZy1vZi10aGUtb2NhbWwtb3JnLWluZnJhc3RydWN0dXJl LzEyMzM1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2ViNzYxZjYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlYjc2MWY2Ij5QYXRyaWNr IEZlcnJpcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZ2ViNzYxZjYiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhhdCBzb21lIGlu aXRpYWwgZW1pc3Npb25zIG1vbml0b3JpbmcgaGFzIGJlZW4gYWRkZWQgdG8gdGhlIE9DYW1sLm9y ZyBpbmZyYXN0cnVjdHVyZS4gQSBtb3JlIGRldGFpbGVkIHdyaXRlIHVwIGNhbiBiZSBmb3VuZCBh dA0KPGEgaHJlZj0iaHR0cHM6Ly9pbmZyYS5vY2FtbC5vcmcvMjAyMy8wNS8zMC9lbWlzc2lvbnMt bW9uaXRvcmluZy5odG1sIj5odHRwczovL2luZnJhLm9jYW1sLm9yZy8yMDIzLzA1LzMwL2VtaXNz aW9ucy1tb25pdG9yaW5nLmh0bWw8L2E+LiBUaGlzIGlzIGEgZmlyc3Qgc3RlcCBpbiBhY2N1cmF0 ZWx5IG1lYXN1cmluZyB0aGUgYW1vdW50IG9mIGVtaXNzaW9ucyB3ZSBhcmUgZ2VuZXJhdGluZy4g VGhlcmUgd2FzIGEgZGlzY3VzcyB0aHJlYWQgdG91Y2hpbmcNCiBvbiBzb21lIG9mIHRoaXMgYSB3 aGlsZSBhZ28gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWNhcmJv bi1mb290cHJpbnQvODU4MCI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtY2Fy Ym9uLWZvb3RwcmludC84NTgwPC9hPi4gPC9wPg0KPHA+SSB0aGluayB0aGVyZSBhcmUgdHdvIGlt cG9ydGFudCBuZXh0IHRhc2tzOiBnZXR0aW5nIGZ1bGwgY292ZXJhZ2Ugb2YgYWxsIG9mIHRoZSBp bmZyYXN0cnVjdHVyZSBtYWNoaW5lcyBhbmQgbWFraW5nIHRoZSBkYXRhIHB1YmxpY2x5IGF2YWls YWJsZS4gSSBob3BlIHRvIHdvcmsgb24gdGhpcyAoaW4gYW4gb3Blbi1zb3VyY2Ugd2F5KSBpbiB0 aGUgZnV0dXJlLCBpZiBhbnlvbmUgZWxzZSBpcyBpbnRlcmVzdGVkIGRvIGxldCBtZSBrbm93IQ0K PC9wPg0KPHA+VGhhbmtzIHRvIDxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20iPlRhcmlkZXM8 L2E+ICh3aG8gZnVuZGVkIHRoZSBpbml0aWFsIHdvcmsgb24gdGhpcykgYW5kIHRvIEBsYW1iZGFf Zm9vLCBNYXJrIEVsdmVycyBhbmQgQGF2c20gZm9yIGhlbHBpbmcgd2l0aCB0aGUgZGVwbG95bWVu dCBhbmQgaWRlYXMgZm9yIG1lYXN1cmluZyBlbWlzc2lvbnMuIFRoZXJlIGlzIGFuIGlzc3VlIG9u IHRoZSBvY2FtbC9pbmZyYXN0cnVjdHVyZSByZXBvc2l0b3J5DQogZm9yIHRoZSBuZXh0IHN0ZXBz IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9pbmZyYXN0cnVjdHVyZS9pc3N1ZXMv NDciPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9pbmZyYXN0cnVjdHVyZS9pc3N1ZXMvNDc8L2E+ IDpzZWVkbGluZzoNCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLTE2IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTYiPk90aGVyIE9D YW1sIE5ld3M8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTE2Ij48 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg4MDhjYmIiIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc4ODA4Y2JiIj5Gcm9tIHRoZSBvY2FtbC5vcmcgYmxvZzwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODgwOGNiYiI+DQo8cD5I ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCA8YSBocmVm PSJodHRwczovL29jYW1sLm9yZy9ibG9nLyI+DQp0aGUgb2NhbWwub3JnIGJsb2c8L2E+LiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cDovL2NhbWJpdW0uaW5yaWEu ZnIvYmxvZy90d28tdmFyaWFudHMtb2YtdGhlLWJpbmQtcnVsZSI+VHdvIHZhcmlhbnRzIG9mIHRo ZSBCaW5kIHJ1bGU8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2Jsb2cuamFuZXN0cmVl dC5jb20vb3hpZGl6aW5nLW9jYW1sLWxvY2FsaXR5LyI+T3hpZGl6aW5nIE9DYW1sOiBMb2NhbGl0 eTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vc2lnbmFscy10aHJlYWRzLnNpbXBsZWNh c3QuY29tL2VwaXNvZGVzL3RoZS1mdXR1cmUtb2YtcHJvZ3JhbW1pbmctd2l0aC1yaWNoYXJkLWVp c2VuYmVyZy1wT2t0cFpfZSI+VGhlIEZ1dHVyZSBvZiBQcm9ncmFtbWluZyB3aXRoIFJpY2hhcmQg RWlzZW5iZXJnPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy12 ZXJzaW9ucy9jb2JhbHQuaHRtbCI+QmV0YSByZWxlYXNlIG9mIEZyYW1hLUMgMjcuMH5iZXRhIChD b2JhbHQpPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cDovL2dhbGxpdW0uaW5yaWEuZnIvYmxv Zy9mdW5jdGlvbi1zcGVjcy0yMDIzLTA1LTEyIj5TcGVjaWZ5aW5nIEZ1bmN0aW9uczogVHdvIFN0 eWxlczwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzdhYmE1MTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJv cmc3YWJhNTE4Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC1vcmc3YWJhNTE4Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQg bWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhl IGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5l d3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBp ZD0ib3JnOTdjNzQ1MyI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 30 May 2023 16:44:27 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 30 May 2023 16:44:27 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 30 May 2023 16:44:27 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34UFhgbn025910 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 30 May 2023 16:43:42 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34UFhWer025896 for ; Tue, 30 May 2023 16:43:32 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 May 2023 17:43:31 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9CA8FE0090; Tue, 30 May 2023 17:43:30 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C7A32E0090 for ; Tue, 30 May 2023 17:43:24 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 May 2023 17:43:23 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B94BC5605E7; Tue, 30 May 2023 17:43:22 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZkw2dN51XLnQ6P0uWkLact46mIg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 30 May 2023 16:43:22 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: d845124b-ac6b-4df8-8aca-08db6124c016 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.00,204,1681164000"; d="scan'208,217";a="110334731" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.494012, queueID=206A85605E8 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <7B6F9A45AC80AE41B401EBEADA48CE1B@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNS0zMCBUdWUgMTc6NDEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDUuMjMuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNi4wNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1heSAyMyB0byAzMCwgMjAyMy4gPC9wPg0K PGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxlIG9m IENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRv Yy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5NTOKAmTIzOiBBQ00gU0lHUExBTiBNTCBG YW1pbHkgV29ya3Nob3Ag4oCUIENhbGwgZm9yIHByZXNlbnRhdGlvbnM8L2E+DQo8L2xpPjxsaT48 YSBocmVmPSIjMiI+T0NhbWwgV29ya3Nob3AgMjAyMyDigJMgcHJlc2VudGF0aW9uIGRlYWRsaW5l IG9uIEp1bmUgMXN0LCBvbmxpbmUgYXR0ZW5kYW5jZSBvcHRpb248L2E+DQo8L2xpPjxsaT48YSBo cmVmPSIjMyI+QSBSb2FkbWFwIGZvciB0aGUgT0NhbWwgUGxhdGZvcm0gLSBTZWVraW5nIFlvdXIg RmVlZGJhY2s8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5uZXcgcmVsZWFzZTogdGlueV9odHRw ZCAwLjEzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnNmQxYmM3OCI+T2xkIENXTjwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5NTOKAmTIzOiBBQ00gU0lHUExBTiBNTCBGYW1p bHkgV29ya3Nob3Ag4oCUIENhbGwgZm9yIHByZXNlbnRhdGlvbnM8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L21sMjMtYWNtLXNpZ3BsYW4tbWwtZmFtaWx5LXdvcmtzaG9w LWNhbGwtZm9yLXByZXNlbnRhdGlvbnMvMTIyMjQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvbWwyMy1hY20tc2lncGxhbi1tbC1mYW1pbHktd29ya3Nob3AtY2FsbC1mb3ItcHJlc2Vu dGF0aW9ucy8xMjIyNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdmMDdhMjBhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZjA3YTIwYSI+ R3VpbGxhdW1lIE11bmNoLU1hY2NhZ25vbmkgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmMDdhMjBhIj4NCjxwPldlIGFyZSBoYXBweSB0byBp bnZpdGUgc3VibWlzc2lvbnMgdG8gdGhlIDxiPk1MIEZhbWlseSBXb3Jrc2hvcCAyMDIzPC9iPjog PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhZDAyMWRkIiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYWQwMjFkZCI+SGlnaGVyLW9yZGVyLCBUeXBlZCwg SW5mZXJyZWQsIFN0cmljdDogQUNNIFNJR1BMQU4gTUwgRmFtaWx5IFdvcmtzaG9wPC9oND4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdhZDAyMWRkIj4NCjxwPkNvLWxv Y2F0ZWQgd2l0aCA8YSBocmVmPSJodHRwczovL2ljZnAyMy5zaWdwbGFuLm9yZy8iPklDRlA8L2E+ IDwvcD4NCjxwPjxiPkRhdGU8L2I+OiBTZXB0ZW1iZXIgOCwgMjAyMyAoRnJpZGF5KSA8L3A+DQo8 cD48Yj5Mb2NhdGlvbjwvYj46IFNlYXR0bGUsIFdBLCBVU0EgKGRheSBhZnRlciBtYWluIElDRlAp IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vaWNmcDIzLnNpZ3BsYW4ub3JnL2hvbWUvbWx3b3Jr c2hvcC0yMDIzIj5DYWxsIGZvciBwcmVzZW50YXRpb25zPC9hPg0KPC9wPg0KPHA+TUwgKG9yaWdp bmFsbHksIOKAnE1ldGEgTGFuZ3VhZ2XigJ0pIGlzIGEgZmFtaWx5IG9mIHByb2dyYW1taW5nIGxh bmd1YWdlcyB0aGF0IGluY2x1ZGVzIGRpYWxlY3RzIGtub3duIGFzIFN0YW5kYXJkIE1MLCBPQ2Ft bCwgYW5kIEYjLCBhbW9uZyBvdGhlcnMuIFRoZSBkZXZlbG9wbWVudCBvZiB0aGVzZSBsYW5ndWFn ZXMgaGFzIGluc3BpcmVkIGEgbGFyZ2UgYW1vdW50IG9mIGNvbXB1dGVyIHNjaWVuY2UgcmVzZWFy Y2gsIGJvdGggcHJhY3RpY2FsIGFuZA0KIHRoZW9yZXRpY2FsLiA8L3A+DQo8cD5UaGUgTUwgRmFt aWx5IFdvcmtzaG9wIGlzIGFuIGVzdGFibGlzaGVkIGluZm9ybWFsIHdvcmtzaG9wIGFpbWluZyB0 byByZWNvZ25pemUgdGhlIGVudGlyZSBleHRlbmRlZCBNTCBmYW1pbHkgYW5kIHRvIHByb3ZpZGUg dGhlIGZvcnVtIHRvIHByZXNlbnQgYW5kIGRpc2N1c3MgY29tbW9uIGlzc3VlczogYWxsIGFzcGVj dHMgb2YgdGhlIGRlc2lnbiwgc2VtYW50aWNzLCB0aGVvcnksIGFwcGxpY2F0aW9uLCBpbXBsZW1l bnRhdGlvbiwgYW5kIHRlYWNoaW5nDQogb2YgdGhlIG1lbWJlcnMgb2YgdGhlIE1MIGZhbWlseS4g V2UgYWxzbyBlbmNvdXJhZ2UgcHJlc2VudGF0aW9ucyBmcm9tIHJlbGF0ZWQgbGFuZ3VhZ2VzIChz dWNoIGFzIEhhc2tlbGwsIFNjYWxhLCBSdXN0LCBOZW1lcmxlLCBMaW5rcywgS29rYSwgRiosIEVm ZiwgQVRTLCBldGMpLCB0byBwcm9tb3RlIHRoZSBleGNoYW5nZSBvZiBpZGVhcyBhbmQgZXhwZXJp ZW5jZS4gVGhlIE1MIGZhbWlseSB3b3Jrc2hvcCB3aWxsIGJlIGhlbGQgaW4gY2xvc2UgY29vcmRp bmF0aW9uDQogd2l0aCB0aGUgT0NhbWwgVXNlcnMgYW5kIERldmVsb3BlcnMgV29ya3Nob3AuIDwv cD4NCjxwPldlIHBsYW4gdGhlIHdvcmtzaG9wIHRvIGJlIGFuIGluLXBlcnNvbiBldmVudCB3aXRo IHJlbW90ZSBwYXJ0aWNpcGF0aW9uIChzdHJlYW1lZCBsaXZlKS4gU3BlYWtlcnMgYXJlIGdlbmVy YWxseSBleHBlY3RlZCB0byBwcmVzZW50IGluIHBlcnNvbiAod2Ugd2lsbCB3b3JrIHRvIG1ha2Ug cmVtb3RlIHByZXNlbnRhdGlvbnMgcG9zc2libGUpLg0KPC9wPg0KPHA+V2Ugc29saWNpdCBwcm9w b3NhbHMgZm9yIGNvbnRyaWJ1dGVkIHRhbGtzLCBpbiBQREYgZm9ybWF0LCB3aXRoIGEgc2hvcnQg c3VtbWFyeSBhdCB0aGUgYmVnaW5uaW5nIGFuZCB0aGUgaW5kaWNhdGlvbiBvZiB0aGUgc3VibWlz c2lvbiBjYXRlZ29yeTogUmVzZWFyY2ggUHJlc2VudGF0aW9ucywgRXhwZXJpZW5jZSBSZXBvcnRz LCBEZW1vcywgYW5kIEluZm9ybWVkIFBvc2l0aW9ucy4gVGhlIHBvaW50IG9mIHRoZSBzdWJtaXNz aW9uIHNob3VsZA0KIGJlIGNsZWFyIGZyb20gaXRzIGZpcnN0IHR3byBwYWdlcyAoUEMgbWVtYmVy cyBhcmUgbm90IG9ibGlnYXRlZCB0byByZWFkIGFueSBmdXJ0aGVyLikgV2UgcGFydGljdWxhcmx5 IGVuY291cmFnZSB0YWxrcyBhYm91dCB3b3JrcyBpbiBwcm9ncmVzcywgcHJlc2VudGF0aW9ucyBv ZiBuZWdhdGl2ZSByZXN1bHRzICh0aGluZ3MgdGhhdCB3ZXJlIGV4cGVjdGVkIHRvIGJ1dCBkaWQg bm90IHF1aXRlIHdvcmsgb3V0KSBhbmQgaW5mb3JtZWQgcG9zaXRpb25zLg0KPC9wPg0KPHA+U2Vl IHRoZSA8YSBocmVmPSJodHRwczovL2ljZnAyMy5zaWdwbGFuLm9yZy9ob21lL21sd29ya3Nob3At MjAyMyNDYWxsLWZvci1QcmVzZW50YXRpb25zIj4NCmZ1bGwgY2FsbCBmb3IgcHJlc2VudGF0aW9u czwvYT4gZm9yIHN1Ym1pc3Npb24gaW5zdHJ1Y3Rpb25zLiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+RGVhZGxpbmUgZm9yIHRhbGsgcHJvcG9zYWxzOiA8Yj5UaHVyc2RheSwgSnVuZSAx LCAyMDIzPC9iPiA8L2xpPjxsaT5Ob3RpZmljYXRpb24gb2YgYWNjZXB0YW5jZTogPGI+VGh1cnNk YXksIEp1bHkgNiwgMjAyMzwvYj4gPC9saT48bGk+V29ya3Nob3A6IDxiPkZyaWRheSwgU2VwdGVt YmVyIDgsIDIwMjM8L2I+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmcxZTBmMGY3IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3Jn MWUwZjBmNyI+UHJvZ3JhbSBDb21taXR0ZWU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZzFlMGYwZjciPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxhcnMg QmVyZ3N0cm9tLCBHb29nbGUsIFVTQSA8L2xpPjxsaT5NYXJ0aW4gRWxzbWFuLCBVbml2ZXJzaXR5 IG9mIENvcGVuaGFnZW4sIERlbm1hcmsgPC9saT48bGk+TWF0dGhldyBGbHVldCwgUm9jaGVzdGVy IEluc3RpdHV0ZSBvZiBUZWNobm9sb2d5LCBVU0EgPC9saT48bGk+SmFjcXVlcyBHYXJyaWd1ZSwg TmFnb3lhIFVuaXZlcnNpdHksIEphcGFuIDwvbGk+PGxpPk9sZWcgS2lzZWx5b3YsIFRvaG9rdSBV bml2ZXJzaXR5LCBKYXBhbiAoQ2hhaXIpIDwvbGk+PGxpPkp1bGlhIExhd2FsbCwgSW5yaWEgUGFy aXMsIEZyYW5jZSA8L2xpPjxsaT5BbmRyZXkgTW9raG92LCBKYW5lIFN0cmVldCwgVUsgPC9saT48 bGk+QmVub8OudCBNb250YWd1LCBJbnJpYSBSZW5uZXMsIEZyYW5jZSA8L2xpPjxsaT5HdWlsbGF1 bWUgTXVuY2gtTWFjY2Fnbm9uaSwgSW5yaWEgUmVubmVzLCBGcmFuY2UgPC9saT48bGk+TWF0aWph IFByZXRuYXIsIFVuaXZlcnNpdHkgb2YgTGp1YmxqYW5hLCBTbG92ZW5pYSA8L2xpPjxsaT5BbmRy ZWFzIFJvc3NiZXJnLCBHZXJtYW55IDwvbGk+PGxpPkdhYnJpZWwgU2NoZXJlciwgSW5yaWEgU2Fj bGF5LCBGcmFuY2UgPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MiI+T0NhbWwgV29ya3Nob3AgMjAyMyDigJMgcHJlc2VudGF0aW9uIGRlYWRsaW5lIG9uIEp1bmUg MXN0LCBvbmxpbmUgYXR0ZW5kYW5jZSBvcHRpb248L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjMtcHJlc2VudGF0aW9uLWRlYWRsaW5lLW9u LWp1bmUtMXN0LW9ubGluZS1hdHRlbmRhbmNlLW9wdGlvbi8xMjIyNi8xIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC13b3Jrc2hvcC0yMDIzLXByZXNlbnRhdGlvbi1kZWFkbGlu ZS1vbi1qdW5lLTFzdC1vbmxpbmUtYXR0ZW5kYW5jZS1vcHRpb24vMTIyMjYvMTwvYT4NCjwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYmU5Mjk3YSIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2JlOTI5N2EiPmdhc2NoZSBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2JlOTI5N2EiPg0KPHA+VGhlIE9D YW1sIFdvcmtzaG9wIGlzIGhhcHBlbmluZyBldmVyeSB5ZWFyLCBjby1sb2NhdGVkIHdpdGggdGhl IElDRlAgY29uZmVyZW5jZSAodGhlIG1haW4gYWNhZGVtaWMgY29uZmVyZW5jZSBvbiBmdW5jdGlv bmFsIHByb2dyYW1taW5nKS4gVGhpcyB5ZWFyIHRoZSBtZWV0aW5nIHdpbGwgaGFwcGVuIGluIFNl YXR0bGUgb24NCjxiPlNhdHVyZGF5IFNlcHRlbWJlciA5dGg8L2I+LiBJdCBzaG91bGQgYmUgaHli cmlkOiBpdCB3aWxsIGJlIHBvc3NpYmxlIHRvIGF0dGVuZCBhbmQgZXZlbiBnaXZlIHRhbGtzIHJl bW90ZWx5Lg0KPC9wPg0KPHA+VG8gZ2V0IGEgc2Vuc2Ugb2YgdGhlIE9DYW1sIFdvcmtzaG9wIHN0 eWxlLCB0b3BpY3MgYW5kIGNvbnRlbnQsIG9jYW1sLm9yZyBoYXMgYSBwYWdlIGFib3V0IHByZXZp b3VzIGVkaXRpb25zLCB3aXRoIHRoZSBsaXN0IG9mIHRhbGtzIGFuZCBsaW5rcyB0byB0aGUgZGVz Y3JpcHRpb25zIGFuZCB0YWxrIHJlY29yZGluZ3Mgd2hlbiBhdmFpbGFibGU6DQo8YSBocmVmPSJo dHRwczovL29jYW1sLm9yZy9jb21tdW5pdHkjd29ya3Nob3BzIj5PQ2FtbCBXb3Jrc2hvcHM8L2E+ LiA8L3A+DQo8cD5UaGUgZGVhZGxpbmUgZm9yIHN1Ym1pdHRpbmcgYSB0YWxrIHByb3Bvc2FsIGlz IDxiPjxiPkp1bmUgMXN0PC9iPjwvYj4sIGNvbWluZyBzb29uLiBQbGVhc2UgY29uc2lkZXIgc3Vi bWl0dGluZyBhIHByb3Bvc2FsIHRvIHByZXNlbnQgeW91ciBPQ2FtbCB3b3JrIGF0IHRoZSB3b3Jr c2hvcCENCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2lj ZnAyMy5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIwMjMjQ2FsbC1mb3ItUHJlc2VudGF0aW9ucyI+ Q2FsbCBmb3IgcHJlc2VudGF0aW9uczwvYT4gKGRlc2NyaXB0aW9uIG9mIHRoZSBleHBlY3RlZCBm b3JtYXQsIGV0Yy4pDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2ljZnAyMy1vY2FtbC5ob3Rj cnAuY29tLyI+U3VibWlzc2lvbiB3ZWJzaXRlIGZvciB0YWxrIHByb3Bvc2FsczwvYT4g4oCTIHBs ZWFzZSByZWFkIHRoZSDigJxDYWxsIGZvciBwcmVzZW50YXRpb25z4oCdIGZpcnN0Lg0KPC9saT48 L3VsPg0KPHA+QSBtYWpvciBjaGFuZ2UgY29tcGFyZWQgdG8gcHJldmlvdXMgZWRpdGlvbnMgb2Yg dGhlIHdvcmtzaG9wIGlzIHRoYXQgPGI+PGI+b25saW5lIGF0dGVuZGFuY2Ugc2hvdWxkIGJlIGZy ZWU8L2I+PC9iPi4gKFRoZSBjb3N0IGlzIGRlY2lkZWQgYnkgdGhlIElDRlAgb3JnYW5pemVycywg YW5kIGl0IGlzIHN0aWxsIHBvc3NpYmxlIHRoYXQgdGhpcyB3b3VsZCBjaGFuZ2UgYmVmb3JlIHRo ZSB3b3Jrc2hvcC4pIEV2ZXJ5b25lIGlzIG9mIGNvdXJzZQ0KIHdlbGNvbWUgdG8gYXR0ZW5kIHJl bW90ZWx5LCBhbnl3aGVyZSBvbiBlYXJ0aC4gV2UgYXJlIHZlcnkgZXhjaXRlZCB0aGF0IHRoaXMg Y291bGQgYmUgdGhlIG1vc3QgYWNjZXNzaWJsZSBPQ2FtbCB3b3Jrc2hvcCwgcmVhY2hpbmcgdGhl IGJyb2FkZXN0IHBvc3NpYmxlIGF1ZGllbmNlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjMiPkEgUm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBsYXRmb3JtIC0gU2Vla2luZyBZb3VyIEZl ZWRiYWNrPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxw PkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLXJvYWRtYXAt Zm9yLXRoZS1vY2FtbC1wbGF0Zm9ybS1zZWVraW5nLXlvdXItZmVlZGJhY2svMTIyMzgvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYS1yb2FkbWFwLWZvci10aGUtb2NhbWwtcGxhdGZv cm0tc2Vla2luZy15b3VyLWZlZWRiYWNrLzEyMjM4LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzdhZjcxZTciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc3YWY3MWU3Ij5UaGliYXV0IE1hdHRpbyBhbm5vdW5jZWQsIHNwYXduaW5nIGEgYmln IHRocmVhZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnN2Fm NzFlNyI+DQo8cD5UaHJlZSB5ZWFycyBhZ28sIEBhdnNtIGFuZCB0aGUgT0NhbWwgUGxhdGZvcm0g dGVhbSBwcmVzZW50ZWQgYSA8YSBocmVmPSJodHRwczovL3dhdGNoLm9jYW1sLm9yZy93LzJLYmZS TnYyb0x0a0tYa2JkNXU5RjEiPg0Kcm9hZG1hcCBmb3IgdGhlIE9DYW1sIFBsYXRmb3JtPC9hPi4g VGhlIHZpc2lvbiB3ZSBoYWQgb2YgdGhlIFBsYXRmb3JtIGluIDIwMjAgd2FzIG9uZSBvZiBhIHNl YW1sZXNzIGVkaXRvciBpbnRlZ3JhdGlvbiwgd2hlcmUgdXNlcnMgY291bGQgb3BlbiB0aGVpciBl ZGl0b3JzIGFuZCBpbnN0YW50bHkgYmUgcHJvZHVjdGl2ZSB3aXRoIE9DYW1sLg0KPC9wPg0KPHA+ V2hpbGUgdGhlcmXigJlzIHN0aWxsIGEgbG9uZyByb2FkIGFoZWFkIHRvIGFjaGlldmUgdGhpcyB2 aXNpb24sIHdl4oCZdmUgbWFkZSBhIGxvdCBvZiBwcm9ncmVzcy4gVGhlIHRvb2xpbmcgbGFuZHNj YXBlIGFuZCBkZXZlbG9wZXIgZXhwZXJpZW5jZSB3aXRoIE9DYW1sIGhhdmUgY2hhbmdlZCBxdWl0 ZSBhIGxvdCBpbiB0aGUgcGFzdCAzIHllYXJzIGFuZCB3ZeKAmXZlIG1hZGUgc2lnbmlmaWNhbnQg cHJvZ3Jlc3Mgb24gYWxsIHRoZSB0b29scyBvZiB0aGUNCiBQbGF0Zm9ybTogPC9wPg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPkR1bmUgaXMgbm93IHRoZSBwcmltYXJ5IGJ1aWxkIHN5c3RlbSB1 c2VkIGJ5IE9DYW1sIGRldmVsb3BlcnMsIHdpdGggNjUlIG9mIHBhY2thZ2VzIG9uIHRoZSBvcGFt IHJlcG9zaXRvcnkgdXNpbmcgRHVuZSBhcyB0aGVpciBidWlsZCBzeXN0ZW0uDQo8L2xpPjxsaT5Q cHhsaWIgaGFzIGJlY29tZSB0aGUgYmVzdCB3YXkgdG8gd3JpdGUgUFBYIGFuZCBtb3N0IFBQWCBo YXZlIGJlZW4gbWlncmF0ZWQgdG8gUHB4bGliLiBUbyBnZXQgYSBzZW5zZSBvZiB0aGUgZWZmb3J0 IHRoYXQgd2VudCBpbnRvIHRoaXMsIHlvdSBjYW4gcmVhZCB0aGUgdXBkYXRlcyBmcm9tDQo8YSBo cmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXBkYXRlLW9uLXRoZS1iaWctcHB4LXJl ZmFjdG9yaW5nLXByb2plY3QvNDQyOCI+DQoyMDE5PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3BweC1vbXAtMi0wLTAtYW5kLW5leHQtc3RlcHMvNjIzMSI+DQoyMDIw PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FuLXVwZGF0ZS1vbi10 aGUtc3RhdGUtb2YtdGhlLXBweC1lY29zeXN0ZW0tYW5kLXBweGxpYi1zLXRyYW5zaXRpb24vODIw MCI+DQoyMDIxPC9hPi4gPC9saT48bGk+V2XigJl2ZSBidWlsdCBhIDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtbHNwLXByZXZpZXcvNDg3NiI+DQpMYW5ndWFn ZSBTZXJ2ZXIgUHJvdG9jb2wgKExTUCkgc2VydmVyPC9hPiBmb3IgT0NhbWwsIHRoYXQgcG93ZXJz IHRoZSA8YSBocmVmPSJodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/ aXRlbU5hbWU9b2NhbWxsYWJzLm9jYW1sLXBsYXRmb3JtIj4NCk9DYW1sIFZTQ29kZSBleHRlbnNp b248L2E+IHdoaWNoIGhhcyBub3cgYmVlbiBkb3dubG9hZGVkIDEwMEsgdGltZXMuIDwvbGk+PGxp Pldl4oCZdmUgYnVpbHQgYW4gUlBDIHByb3RvY29sIGluIER1bmUgdGhhdCB3YXMgPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5lLTMtMC0wLzkzNzQiPg0KcmVsZWFz ZWQgaW4gRHVuZSAzLjA8L2E+IGFuZCBhbm90aGVyIG9uZSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMTU4NiI+DQpmb3IgT0NhbWxGb3JtYXQ8 L2E+LiBUaGVzZSBwcm90b2NvbHMgYXJlIGludGVncmF0ZWQgd2l0aCBPQ2FtbCBMU1AgdG8gc3Vw cG9ydCBzb21lIG9mIGl0cyBmZWF0dXJlcy4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1vZG9jLTItMC0wLzg1ODIiPk9kb2MgMi4w LjAgd2FzIHJlbGVhc2VkPC9hPiB3aXRoIGEgY29tcGxldGUgcmUtd3JpdGUgb2YgdGhlIGxhbmd1 YWdlIG1vZGVsIHRvIG1ha2UgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG1vcmUgYWNjdXJh dGUsIGFuZCBhbHNvIGNvbWVzIHdpdGggYSBuZXcgcmVuZGVyaW5nIGxheWVyIHRvIGFsbG93aW5n IG91dHB1dA0KIGluIGRpZmZlcmVudCBmb3JtYXRzIGluY2x1ZGluZyBIVE1MLCBMYVRleCBhbmQg bWFucGFnZS4gT2RvYyBpcyBhbHNvIG5vdyB1c2VkIHRvIGdlbmVyYXRlIHRoZQ0KPGEgaHJlZj0i aHR0cHM6Ly9vY2FtbC5vcmcvcGFja2FnZXMiPmRvY3VtZW50YXRpb24gb2YgZXZlcnkgT0NhbWwg cGFja2FnZSBvbiBvY2FtbC5vcmc8L2E+Lg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItMS0wLzgyNTUiPk9wYW0gMi4xLjAgd2FzIHJlbGVh c2VkPC9hPiB3aXRoIHNpZ25pZmljYW50IGltcHJvdmVtZW50cyBsaWtlIHRoZSBpbnRlZ3JhdGVk IGRlcGV4dCBzeXN0ZW0gYW5kIHRoZSBnZW5lcmF0aW9uIG9mIGxvY2sgZmlsZXMuDQo8L2xpPjxs aT5XZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTQzMSI+ cmUtaW1wbGVtZW50ZWQgdGhlIHdheSB3ZSBsb2NhdGUgT0NhbWwgdGVybXM8L2E+IGluIE1lcmxp biB3aGljaCBncmVhdGx5IGltcHJvdmVkIHRoZSBhY2N1cmFjeSBvZiB0aGUgYGxvY2F0ZWAgcXVl cnkgYW5kIHBhdmVkIHRoZSB3YXkgZm9yIHRoZSB3b3JrIG9uDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vdm9vZG9vcy9tZXJsaW4tb2NjdXJyZW5jZXMtc3dpdGNoIj5wcm9qZWN0LXdpZGUg cmVmZXJlbmNlczwvYT4uIFRvIGFjaGlldmUgdGhpcywgd2UNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwODI1Ij5hZGRlZCBhIG5ldyByZXByZXNlbnRhdGlv biBvZiB0aGUgbW9kdWxlIHN0cnVjdHVyZTwvYT4gaW4gdGhlIE9DYW1sIGNvbXBpbGVyIGNhbGxl ZCDigJxTaGFwZXPigJ0uIFNoYXBlcyBhcmUgbm93IHVzZWQgaW4gTWVybGluLCBidXQgYWxzbyBl bmFibGUgZmVhdHVyZXMgaW4gb3RoZXIgUGxhdGZvcm0gdG9vbHMsIGxpa2UNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvOTA5Ij5saW5raW5nIHRvIHNvdXJjZSBj b2RlIGluIE9kb2M8L2E+Lg0KPC9saT48L3VsPg0KPHA+SW4gdGhlIG1lYW50aW1lLCB0aGluZ3Mg aGF2ZSBhbHNvIGNoYW5nZWQgZm9yIHRoZSBicm9hZGVyIE9DYW1sIGVjb3N5c3RlbS4gT0NhbWwg NSB3YXMNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC01LTAtMC1p cy1vdXQvMTA5NzQiPnJlbGVhc2VkPC9hPiB3aXRoIHN1cHBvcnQgZm9yDQo8YSBocmVmPSJodHRw czovL3YyLm9jYW1sLm9yZy9yZWxlYXNlcy81LjAvbWFudWFsL3BhcmFsbGVsaXNtLmh0bWwiPnNo YXJlZCBtZW1vcnkgcGFyYWxsZWxpc208L2E+IGFuZA0KPGEgaHJlZj0iaHR0cHM6Ly92Mi5vY2Ft bC5vcmcvcmVsZWFzZXMvNS4wL21hbnVhbC9lZmZlY3RzLmh0bWwiPmVmZmVjdCBoYW5kbGVyczwv YT47IGFuZCB3ZSBzYXcgYQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Yz LW9jYW1sLW9yZy13ZS1hcmUtbGl2ZS85NzQ3Ij5uZXcgdmVyc2lvbiBvZiBPQ2FtbC5vcmcgZ29p bmcgbGl2ZTwvYT4gd2l0aCBhDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9wYWNrYWdlcyI+ Y2VudHJhbGlzZWQgcGFja2FnZSBkb2N1bWVudGF0aW9uPC9hPiwgYSA8YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9qb2JzIj4NCmpvYiBib2FyZDwvYT4sIGFuIDxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwub3JnL3BsYXkiPmludGVyYWN0aXZlIHBsYXlncm91bmQ8L2E+LCBhbmQgbW9yZS4NCjwvcD4N CjxwPkZvbGxvd2luZyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29j YW1sLW9yZy1yZWNhcHBpbmctMjAyMi1hbmQtcXVlcmllcy1vbi10aGUtZmVkaXZlcnNlLzExMDk5 Ij4NCnRocmVlIHByaW9yaXRpZXMgd2UgYWRvcHRlZCBpbiAyMDIyPC9hPiwgd2Ugbm93IHdhbnQg dG8gaW50ZW5zaWZ5IG91ciBlZmZvcnRzIG9uIHByb3RvdHlwaW5nIG5ldyB3b3JrZmxvd3MgZm9y IE9DYW1sIGRldmVsb3BtZW50LiBJdCBpcyB0aW1lIHRvIHJlZmxlY3QgYmFjayBvbiBldmVyeXRo aW5nIHdl4oCZdmUgZG9uZSBhbmQgbGF5IGRvd24gYSByb2FkbWFwIGZvciB0aGUgbmV4dCB0aHJl ZSB5ZWFycy4NCjwvcD4NCjxwPkluIHRoZSBwYXN0IGZldyBtb250aHMsIHdl4oCZdmUgYmVlbiB3 b3JraW5nIG9uIGVzdGFibGlzaGluZyBhIHZpc2lvbiBmb3IgdGhlIGZ1dHVyZSBvZiB0aGUgT0Nh bWwgUGxhdGZvcm0uIFdlIHJldmlld2VkIGFzIG11Y2ggY29tbXVuaXR5IGZlZWRiYWNrIGFzIHBv c3NpYmxlLCBvcmdhbmlzZWQgZGlzY3Vzc2lvbnMgd2l0aCB0aGUgbWFpbnRhaW5lcnMgb2YgdGhl IFBsYXRmb3JtIHRvb2xzLCBtZXQgd2l0aCBpbmR1c3RyaWFsIHVzZXJzIG9mIE9DYW1sDQogdG8g dW5kZXJzdGFuZCB0aGVpciBuZWVkcyBhbmQgcGFpbiBwb2ludHMsIGFuZCB3ZSBjb2xsZWN0aXZl bHkgdGhvdWdodCBvZiB3aGF0IHRoZSBpZGVhbCBkZXZlbG9wZXIgZXhwZXJpZW5jZSB3aXRoIE9D YW1sIG91Z2h0IHRvIGJlLg0KPC9wPg0KPHA+V2Ugd2FudCB0aGUgT0NhbWwgUGxhdGZvcm0gdG8g YmUgZHJpdmVuIGJ5IHRoZSBjb21tdW5pdHkuIFNvIHRvZGF5LCBJ4oCZbSBleGNpdGVkIHRvIHNo YXJlIHRoZSBmaXJzdCBwYXJ0cyBvZiB0aGUgcm9hZG1hcCB0byBzdGFydCBjb2xsZWN0aW5nIGZl ZWRiYWNrIGFuZCBpdGVyYXRpbmcgb24gdGhlbS4NCjwvcD4NCjxwPllvdSBjYW4gc2VlIHRoZSB3 b3JrLWluLXByb2dyZXNzIHJvYWRtYXAgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Rhcmlk ZXMvb2NhbWwtcGxhdGZvcm0tcm9hZG1hcCI+DQpvbiBHaXRIdWI8L2E+LiBUaGUgcmVwb3NpdG9y eSBjdXJyZW50bHkgY29udGFpbnMgdHdvIGRvY3VtZW50czogPC9wPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPjxiPkRlc2lnbiBQcmluY2lwbGVzPC9iPjogVGhlIHByaW5jaXBsZXMgdGhhdCB3 aWxsIGd1aWRlIHRoZSBkZXNpcmVkIE9DYW1sIGRldmVsb3BlciBleHBlcmllbmNlLg0KPC9saT48 bGk+PGI+VXNlcnM8L2I+OiBUaGUgZGlmZmVyZW50IHVzZXIgcGVyc29uYXMgd2l0aGluIHRoZSBP Q2FtbCBlY29zeXN0ZW0gc2VydmUgYXMgYSBndWlkZSBmb3IgdGhlIHJvYWRtYXAsIGVuc3VyaW5n IHRoYXQgaXQgYWRkcmVzc2VzIHRoZSB1bmlxdWUgcmVxdWlyZW1lbnRzIG9mIGVhY2ggYXJjaGV0 eXBlLg0KPC9saT48L3VsPg0KPHA+RmVlbCBmcmVlIHRvIHJlYWQgdGhyb3VnaCB0aGVtIGFuZCBz aGFyZSB5b3VyIHRob3VnaHRzLCBpbiBwYXJ0aWN1bGFyOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+RG8geW91IGFncmVlIHdpdGggdGhlIFByaW5jaXBsZXMgb2YgdGhlIFBsYXRmb3Jt PyA8L2xpPjxsaT5EbyB5b3Ugc2VlIHlvdXJzZWxmIHJlcHJlc2VudGVkIGluIHRoZSBVc2Vycz8g PC9saT48L3VsPg0KPHA+T25jZSB3ZeKAmXZlIGl0ZXJhdGVkIG9uIHRoZSBmZWVkYmFjayBhbmQg YXJlIHJlYWR5IHRvIGFkb3B0IHRoZXNlIGhpZ2gtbGV2ZWwgZ3VpZGVsaW5lcywgd2XigJlsbCBy ZWZpbmUgdGhlIGRldmVsb3BlciB3b3JrZmxvd3Mgd2UgYWltIHRvIGJ1aWxkIGluIHRoZSBjb21p bmcgeWVhcnMuIFNpbWlsYXJseSB0byB0aGUgZmlyc3Qgc2VjdGlvbnMsIHdl4oCZbGwgcG9zdCB0 aGVtIG9uIERpc2N1c3MgdG8gZGlzY3VzcyB0aGVtIHdpdGggdGhlIGNvbW11bml0eQ0KIGFuZCB1 bHRpbWF0ZWx5IGFkb3B0IGEgZmlyc3QgdmVyc2lvbiBvZiB0aGUgUGxhdGZvcm0gcm9hZG1hcC4g PC9wPg0KPHA+SeKAmW0gbG9va2luZyBmb3J3YXJkIHRvIGV2ZXJ5b25l4oCZcyBmZWVkYmFjayBh bmQgYnVpbGRpbmcgdGhpcyByb2FkbWFwIHRvZ2V0aGVyIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjQiPm5ldyByZWxlYXNlOiB0aW55X2h0dHBkIDAuMTM8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctcmVsZWFzZS10aW55LWh0dHBkLTAtMTMv MTIyNjgvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxlYXNlLXRp bnktaHR0cGQtMC0xMy8xMjI2OC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzA2YzcwYWMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwNmM3 MGFjIj5TaW1vbiBDcnVhbmVzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnMDZjNzBhYyI+DQo8cD5J4oCZbSBoYXBweSB0byBhbm5vdW5jZSB0 aGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvdGlueV9odHRwZCI+dGlueV9o dHRwZDwvYT4gZ290IGEgbmV3IFtyZWxlYXNlXSgNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9jLWN1YmUvdGlueV9odHRwZC9yZWxlYXNlcy90YWcvdjAuMTMiPmh0dHBzOi8vZ2l0aHViLmNv bS9jLWN1YmUvdGlueV9odHRwZC9yZWxlYXNlcy90YWcvdjAuMTM8L2E+ICkuDQo8L3A+DQo8cD5U aW55X2h0dHBkIGlzIGEgc21hbGwgYW5kIHJlYXNvbmFibHkgc2ltcGxlIEhUVFAgMS4xIHNlcnZl ciB0aGF0IHJlbGllcyBvbiB0aHJlYWRzIChvciBhIHRocmVhZCBwb29sKSByYXRoZXIgdGhhbiBh c3luYy9jb29wZXJhdGl2ZSBtdWx0aXRhc2tpbmcuIEl04oCZcyBwZXJoYXBzIGEgYml0IHJlYWN0 aW9uYXJ5W14xXSBidXQgaXQgY2FuIGJlIHF1aXRlIHVzZWZ1bCB0byBhZGQgYW4gZW1iZWRkZWQg d2ViIFVJL3dlYiBzZXJ2ZXIgdG8gZXhpc3RpbmcNCiBjb2RlICh0aGluayBhZGRpbmcgYSBodHRw ZCB0byBvY2FtbG9wdCBvciBDb3Egb3IgQkFQIG9y4oCmKS4gSG93ZXZlciwgdGlueV9odHRwZCBk b2VzIGNvbWUgd2l0aCBhIGJhc2ljIHR5cGUtc2FmZSByb3V0ZXIsIEhUTUwgY29tYmluYXRvcnMs DQo8YSBocmVmPSJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9B UEkvU2VydmVyLXNlbnRfZXZlbnRzIj5TU0U8L2E+IGVuZHBvaW50cywgYSBwYWNraW5nIHRvb2wg Zm9yIGFzc2V0cywgc3RyZWFtaW5nIGludGVyZmFjZSAod2l0aCBjaHVua2luZykgdG8gcmVhZC93 cml0ZSBsb25nIGJvZGllcyBpbiBjb25zdGFudCBtZW1vcnksIGFuZCBhbiBvcHRpb25hbCBkZWZs YXRlIG1pZGRsZXdhcmUgYmFzZWQgb24gY2FtbHppcC4NCjwvcD4NCjxwPlteMV06IPCfkbTwn5Oi 8J+Squ+4j+KYge+4jyA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc2ZDFiYzc4IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3Jn NmQxYmM3OCI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtb3JnNmQxYmM3OCI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4g PGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1l IGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBh cmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdz LXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9 Im9yZ2YzODJmODIiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8i PkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 23 May 2023 10:43:12 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 23 May 2023 10:43:12 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 23 May 2023 10:43:12 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34N9gRSG026570 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 23 May 2023 10:42:27 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34N9g8KY026546 for ; Tue, 23 May 2023 10:42:08 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 May 2023 11:42:06 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9C75DE731B; Tue, 23 May 2023 11:42:06 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id F2A43E00A8 for ; Tue, 23 May 2023 11:41:56 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 May 2023 11:41:53 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 276A55605C5; Tue, 23 May 2023 11:41:53 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZjVr9Nx8d6DZq606YYWKWrSqODg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 23 May 2023 10:41:52 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 90c75d05-937f-40cf-fc26-08db5b721fea X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="6.00,185,1681164000"; d="scan'208,217";a="109206495" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=722065605C8 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <943BFEE6005A104A87025744059D0B47@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNS0yMyBUdWUgMTE6MzkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDUuMTYuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNS4zMC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1heSAxNiB0byAyMywgMjAyMy4gPC9wPg0K PGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxlIG9m IENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRv Yy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5Mb29raW5nIGZvciBleGFtcGxlIHRzZGwg Z2FtZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5PQ2FtbC5vcmcgTmV3c2xldHRlcjogQXBy aWwgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkEgYmVzdGlhcnkgb2YgR0FEVCBleGFt cGxlcz88L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij4yMDIzIFN0YWNrT3ZlcmZsb3cgRGV2ZWxv cGVyIFN1cnZleTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPlJlbGVhc2UgMC41LjQgb2YgPGNv ZGU+Rm1saWJfYnJvd3NlcjwvY29kZT48L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5PQ2FtbCBQ bGF0Zm9ybSBOZXdzbGV0dGVyOiBBcHJpbCAyMDIzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+ RWlvIERldmVsb3BlciBNZWV0aW5nczwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPk5ldyBtYWpv ciByZWxlYXNlIG9mIFBhcmFueSAodjE0LjAuMCk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmcy MmUxNjdiIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPkxvb2tp bmcgZm9yIGV4YW1wbGUgdHNkbCBnYW1lczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt MiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvbG9va2luZy1mb3ItZXhhbXBsZS10c2RsLWdhbWVzLzM4ODAvMTIiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xvb2tpbmctZm9yLWV4YW1wbGUtdHNkbC1nYW1lcy8zODgw LzEyPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2I4Zjli MDUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiOGY5YjA1Ij5CZW5qYW1pbiBUaG9t YXMgc2FpZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjhm OWIwNSI+DQo8cD5UaGlzIG9uZSBpcyBmb3IgdGhlIHNlYXJjaCBlbmdpbmVz4oCmIDwvcD4NCjxw Pkkgd2FzIGxvb2tpbmcgZm9yIGEgd2F5IHRvIHNldHVwIGEg4oCccHJvcGVy4oCdIGdhbWUgbG9v cCwgZnVuY3Rpb25hbCBzdHlsZS4gPC9wPg0KPHA+TG9va2luZyBhdCB0aGUgPGNvZGU+dHNkbDwv Y29kZT4gcmVwbywgSSBub3RpY2VkIHRoZSBleGFtcGxlcyBpbiB0aGUgdGVzdCBmb2xkZXIgbWFr ZSBoZWF2eSB1c2Ugb2YgbWF0Y2ggZXhwcmVzc2lvbnMuIFJlcGxpY2F0aW5nIHRoYXQgc3R5bGUg cXVpY2tseSBsZWQgbWUgdG8gYSDigJxjYWxsYmFjayBoZWxs4oCdIHR5cGUgb2YgcHJvYmxlbSB0 aG91Z2guDQo8L3A+DQo8cD5Bbnlob3csIHRoaXMgaXMgbXkgdGFrZSBvbiBzZXR0aW5nIHVwIGEg YmFzaWMgZ2FtZSBsb29wOiA8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8 cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZv bnQtc3R5bGU6IGl0YWxpYzsiPigqPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRh OyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKiBkdW5lIGV4ZWMgLS1kaXNwbGF5PXF1aWV0IGJpbi9t YWluLmV4ZTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+ICopPC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bW9kdWxlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7 Ij5TZGw8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VHNkbC5TZGw8L3Nw YW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bW9k dWxlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5XaW5kb3c8L3NwYW4+ID0g PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLldpbmRvdzwvc3Bhbj4NCjxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5tb2R1bGU8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkV2ZW50PC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPlNkbC5FdmVudDwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gKCA8c3BhbiBzdHlsZT0iY29s b3I6ICNhNzYwMWY7Ij5sZXQqPC9zcGFuPiApID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+UmVzdWx0Ljwvc3Bhbj5iaW5kDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7 Ij5lcnJvcl9jdHg8L3NwYW4+ID0NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5QYXJ0aWFsPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b2Y8L3NwYW4+IHsgd2luZG93IDogPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLjwvc3Bhbj53aW5kb3cgfQ0KICB8IDxzcGFu IHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkZ1bGw8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5v Zjwvc3Bhbj4geyB3aW5kb3cgOiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwuPC9z cGFuPndpbmRvdzsgcmVuZGVyZXIgOiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwu PC9zcGFuPnJlbmRlcmVyIH0NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0 eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250 LXN0eWxlOiBpdGFsaWM7Ij5BdHRhY2ggZXh0cmEgY29udGV4dCB0byB0aGUgb3JpZ2luYWwgZXJy b3IuPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFs aWM7Ij4gKiBVc2VkIGZvciByZXNvdXJjZSBjbGVhbnVwIG9uIHByb2dyYW0gZXhpdC48L3NwYW4+ DQo8c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwv c3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5s ZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPndpdGhfZXJyX2N0eDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+Y3R4PC9zcGFuPiA9IDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPlJlc3VsdC48L3NwYW4+bWFwX2Vycm9yICg8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij5lcnI8L3NwYW4+IC0mZ3Q7IChlcnIsIGN0eCkpDQoNCjxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmluaXRfd2luZG93PC9zcGFuPiAoKSA9DQogIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQqPC9zcGFu PiAoKSA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+aW5pdCA8c3Bh biBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwuSW5pdC48L3NwYW4+KGF1ZGlvICYjNDM7IHZp ZGVvKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48 L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5sZXQqPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij53aW5kb3c8L3NwYW4+ ID0NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwuPC9zcGFuPmNyZWF0ZV93 aW5kb3cgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7T0NhbWwvVFNETDogQ0hB TkdFX01FJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+eDwvc3Bh bj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+V2luZG93Ljwvc3Bhbj5wb3NfY2VudGVy ZWQNCiAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn55PC9zcGFuPjo8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5XaW5kb3cuPC9zcGFuPnBvc19jZW50ZXJlZCA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+dzwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4 MjRmOyI+NjQwPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+aDwvc3Bhbj46 PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDgwPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5XaW5kb3cuPC9zcGFuPnNob3duDQogIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCg0KICA8c3BhbiBzdHlsZT0i Y29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Pazwvc3Bhbj4gd2lu ZG93DQo8c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4NCg0KPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+cmVuZGVyX2ZyYW1lPC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5yZW5kZXJlcjwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPng8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij55PC9zcGFuPikg PQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0 Kjwvc3Bhbj4gKCkgPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwuPC9zcGFuPnNl dF9yZW5kZXJfZHJhd19jb2xvciByZW5kZXJlciA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7 Ij4yNTU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjEyNzwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPjI1NTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+bGV0Kjwvc3Bhbj4gKCkgPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5TZGwuPC9zcGFuPnJlbmRlcl9jbGVhciByZW5kZXJlciA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQqPC9zcGFuPiAoKSA9IDxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+c2V0X3JlbmRlcl9kcmF3X2Nv bG9yIHJlbmRlcmVyIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjI1NTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA4MjRmOyI+MDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MjU1PC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3Nw YW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5s ZXQqPC9zcGFuPiAoKSA9DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLjwv c3Bhbj5yZW5kZXJfZmlsbF9yZWN0IHJlbmRlcmVyICg8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lPC9zcGFuPiAoPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLlJlY3QuPC9zcGFuPmNyZWF0ZSB+eCB+eSA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDgyNGY7Ij5+dzwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRm OyI+NzA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5oPC9zcGFuPjo8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij43MDwvc3Bhbj4pKQ0KICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICgpDQogIDsgPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLjwvc3Bhbj5yZW5kZXJfcHJlc2VudCByZW5k ZXJlcg0KICA7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjog I2ZjZjdlZjsiPk9rPC9zcGFuPiAoKQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8 L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5zdGF0ZTwvc3Bhbj4g PSB7IHF1aXQgOiBib29sOyBwb3MgOiBpbnQgKiBpbnQgfQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDdhOWY7Ij5pbml0aWFsX3N0YXRlPC9zcGFuPiA9IHsgcXVpdCA9IDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPmZhbHNlPC9zcGFuPjsgcG9zID0gKDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwODI0ZjsiPjA8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4wPC9z cGFuPikgfQ0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5wb2xsPC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5ldnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPnN0YXRlPC9zcGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDdhOWY7Ij54PC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+eTwvc3Bhbj4p ID0gc3RhdGUucG9zIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdo dDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZGVmYXVs dDwvc3Bhbj4gPSB7IHN0YXRlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij53aXRoPC9zcGFuPiBwb3MgPSAoeCAmIzQzOyA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij4yPC9zcGFuPiwgeSAmIzQzOyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7 Ij4xPC9zcGFuPikgfSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+aW48L3NwYW4+DQoNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdl aWdodDogYm9sZDsiPmlmPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TZGwu PC9zcGFuPnBvbGxfZXZlbnQgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPlNvbWU8L3NwYW4+IGV2dCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPnRoZW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPm1hdGNoPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5FdmVudC48L3NwYW4+KGVudW0gKGdldCBldnQgdHlwKSkg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPndpdGg8L3Nw YW4+DQogICAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5gUXVpdDwvc3Bhbj4gLSZndDsgeyBzdGF0ZSA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+d2l0aDwvc3Bhbj4gcXVpdCA9IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwODI0ZjsiPnRydWU8L3NwYW4+IH0NCiAgICB8IF8gLSZndDsgZGVmYXVs dA0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZWxz ZTwvc3Bhbj4NCiAgICBkZWZhdWx0DQo8c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwv c3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+cnVuX2dhbWVfbG9vcDwv c3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cmVuZGVyZXI8L3NwYW4+ID0NCiAg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnJlYzwv c3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+bG9vcDwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZXZ0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5zdGF0ZTwvc3Bhbj4gPQ0KICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pZjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+ bm90PC9zcGFuPiBzdGF0ZS5xdWl0IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij50aGVuPC9zcGFuPiAoDQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5zdGF0ZTwvc3Bhbj4gPSBwb2xsIGV2dCBzdGF0ZSA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0Kjwvc3Bhbj4gKCkg PSByZW5kZXJfZnJhbWUgcmVuZGVyZXIgc3RhdGUucG9zIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw MDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICgpDQogICAgICA7IDxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+ZGVsYXkgMTdsIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFu IHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+YXBwcm94IDYwIEZQ Uzwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsi PiAqKTwvc3Bhbj4NCiAgICAgIDsgbG9vcCBldnQgc3RhdGUNCiAgICApIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbHNlPC9zcGFuPg0KICAgICAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+T2s8 L3NwYW4+ICgpDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5pbjwvc3Bhbj4NCg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5ldnQ8 L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RXZlbnQuPC9zcGFuPmNyZWF0 ZSAoKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48 L3NwYW4+DQogIGxvb3AgZXZ0IGluaXRpYWxfc3RhdGUNCjxzcGFuIHN0eWxlPSJjb2xvcjogI2Zm NDUwMDsiPjs7PC9zcGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5zdGFy dF9nYW1lPC9zcGFuPiAoKSA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQqPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij53 aW5kb3c8L3NwYW4+ID0gaW5pdF93aW5kb3cgKCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJh OyI+fCZndDs8L3NwYW4+IHdpdGhfZXJyX2N0eCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7 IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Ob25lPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQqPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5yZW5kZXJlcjwvc3Bhbj4gPQ0KICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+Y3JlYXRlX3JlbmRlcmVyIHdpbmRvdyA8c3Bh biBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij58Jmd0Ozwvc3Bhbj4gd2l0aF9lcnJfY3R4ICg8c3Bh biBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21l PC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+UGFydGlhbDwvc3Bhbj4geyB3aW5kb3cgfSkpDQogIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldCo8L3NwYW4+ICgpID0NCiAg ICBydW5fZ2FtZV9sb29wIHJlbmRlcmVyIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPnwm Z3Q7PC9zcGFuPiB3aXRoX2Vycl9jdHggKDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFj a2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPlNvbWU8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6 ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5GdWxsPC9zcGFuPiB7IHdpbmRv dzsgcmVuZGVyZXIgfSkpDQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Pazwvc3Bhbj4gKHdpbmRvdywgcmVuZGVyZXIpDQo8 c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnJlYzwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjYTc2MDFmOyI+ZGVzdHJveV9yZXNvdXJjZXM8L3NwYW4+ID0gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bmN0aW9uPC9zcGFuPg0K ICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPlNvbWU8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQt Y29sb3I6ICNmY2Y3ZWY7Ij5GdWxsPC9zcGFuPiB7IHdpbmRvdzsgcmVuZGVyZXIgfSkgLSZndDsN CiAgICAgICgpDQogICAgICA7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3Nw YW4+ZGVzdHJveV9yZW5kZXJlciByZW5kZXJlcg0KICAgICAgOyBkZXN0cm95X3Jlc291cmNlcyA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5AQDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+U29tZTwvc3Bhbj4gKDxzcGFu IHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPlBhcnRp YWw8L3NwYW4+IHsgd2luZG93IH0pDQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+U29tZTwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xv cjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPlBhcnRpYWw8L3NwYW4+IHsg d2luZG93IH0pIC0mZ3Q7DQogICAgICAoKQ0KICAgICAgOyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij5TZGwuPC9zcGFuPmRlc3Ryb3lfd2luZG93IHdpbmRvdw0KICB8IDxzcGFuIHN0eWxl PSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPk5vbmU8L3NwYW4+ IC0mZ3Q7ICgpDQo8c3BhbiBzdHlsZT0iY29sb3I6ICNmZjQ1MDA7Ij47Ozwvc3Bhbj4NCg0KPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4g KCkgPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bWF0Y2g8L3NwYW4+IHN0YXJ0X2dhbWUgKCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBm b250LXdlaWdodDogYm9sZDsiPndpdGg8L3NwYW4+DQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+T2s8L3NwYW4+ICh3aW5kb3csIHJl bmRlcmVyKSAtJmd0Ow0KICAgICAgKCkNCiAgICAgIDsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0 ZmNmOyI+U2RsLjwvc3Bhbj5kZXN0cm95X3JlbmRlcmVyIHJlbmRlcmVyDQogICAgICA7IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+ZGVzdHJveV93aW5kb3cgd2luZG93 DQogICAgICA7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+cXVpdCAo KQ0KICAgICAgOyA8c3BhbiBzdHlsZT0iY29sb3I6ICM1NTc0MDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+ZXhpdDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDwvc3Bhbj4NCiAg fCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5FcnJvcjwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1j b2xvcjogI2ZjZjdlZjsiPmBNc2c8L3NwYW4+IG1zZywgY3R4KSAtJmd0Ow0KICAgICAgKCkNCiAg ICAgIDsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2RsLjwvc3Bhbj5sb2cgPHNwYW4g c3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7RXJyb3I6ICVzJnF1b3Q7PC9zcGFuPiBtc2cN CiAgICAgIDsgZGVzdHJveV9yZXNvdXJjZXMgY3R4DQogICAgICA7IDxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPlNkbC48L3NwYW4+cXVpdCAoKQ0KICAgICAgOyA8c3BhbiBzdHlsZT0iY29s b3I6ICM1NTc0MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZXhpdDwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsi Pjs7PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxwPkl0IHRvb2sgYSBiaXQgb2YgZmlkZGxpbmcg YmVmb3JlIGZpbmRpbmcgc29tZXRoaW5nIEkgd2FzIGhhcHB5IHdpdGgsIEnigJlsbCBnbGFkbHkg dGFrZSBhbnkgY3JpdGljaXNtL2ZlZWRiYWNrIDopDQo8L3A+DQo8cD5JZiB5b3UgaGF2ZSBtYWRl IGEgZ2FtZSBvciBwcm9qZWN0IHdpdGggPGNvZGU+dHNkbDwvY29kZT4sIHBsZWFzZSBkbyB0ZWxs IHVzIGFib3V0IGl0IQ0KPC9wPg0KPHA+KHBlcnNvbmFsbHksIEnigJltIGdvaW5nIHRocm91Z2gg dGhlIOKAnE5hdHVyZSBvZiBDb2Rl4oCdIGJvb2sgYW5kIHdhbnQgdG8gaW1wbGVtZW50IHRoZSBl eGVyY2lzZXMgaW4gbWFueSBsYW5ndWFnZXMvbGlicmFyaWVzKQ0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzcyMzhkODMiIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmc3MjM4ZDgzIj5Zb3RhbSBCYXJub3kgdGhlbiBzYWlkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3MjM4ZDgzIj4NCjxwPlRha2Ug YSBsb29rIGF0IG15IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9ibHVkZHkvcmFpbHMiPlJh aWxyb2FkIFR5Y29vbiByZWltcGxlbWVudGF0aW9uPC9hPi4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSIyIj5PQ2FtbC5vcmcgTmV3c2xldHRlcjogQXByaWwgMjAyMzwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItYXByaWwt MjAyMy8xMjE3My8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1vcmctbmV3 c2xldHRlci1hcHJpbC0yMDIzLzEyMTczLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnM2Q0YTg4YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y ZzNkNGE4OGMiPlRoaWJhdXQgTWF0dGlvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnM2Q0YTg4YyI+DQo8cD5XZWxjb21lIHRvIHRoZSBBcHJp bCAyMDIzIGVkaXRpb24gb2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyISBBcyB3aXRoIHRoZSA8 YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9uZXdzL29jYW1sb3JnLTIwMjMtMDMiPg0KcHJldmlv dXMgdXBkYXRlPC9hPiwgdGhpcyBoYXMgYmVlbiBjb21waWxlZCBieSBAc2FiaW5lIGFuZCBAdG1h dHRpby4gPC9wPg0KPHA+VGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyIHByb3ZpZGVzIGFuIG92ZXJ2 aWV3IG9mIGNoYW5nZXMgb24gdGhlIE9DYW1sLm9yZyB3ZWJzaXRlIGFuZCBnaXZlcyB5b3UgYSBn bGltcHNlIGludG8gd2hhdCBoYXMgYmVlbiBnb2luZyBvbiBiZWhpbmQgdGhlIHNjZW5lcy4gWW91 IGNhbiBmaW5kIGENCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL29jYW1s b3JnLW5ld3NsZXR0ZXIiPmxpc3Qgb2YgcHJldmlvdXMgaXNzdWVzIGhlcmU8L2E+Lg0KPC9wPg0K PHA+T3VyIGdvYWwgaXMgdG8gbWFrZSBPQ2FtbC5vcmcgdGhlIGJlc3QgcmVzb3VyY2UgZm9yIGFu eW9uZSB3aG8gd2FudHMgdG8gZ2V0IHN0YXJ0ZWQgYW5kIGJlIHByb2R1Y3RpdmUgaW4gT0NhbWwu IFdlIGNvdWxkbuKAmXQgZG8gaXQgd2l0aG91dCBhbGwgdGhlIGFtYXppbmcgT0NhbWwgY29tbXVu aXR5IG1lbWJlcnMgd2hvIGhlbHAgdXMgcmV2aWV3LCByZXZpc2UgYW5kIGNyZWF0ZSBiZXR0ZXIg T0NhbWwgZG9jdW1lbnRhdGlvbi4gWW91ciBmZWVkYmFjaw0KIGVuYWJsZXMgdXMgdG8gYmV0dGVy IHByaW9yaXRpc2Ugb3VyIHdvcmsgYW5kIG1ha2UgcHJvZ3Jlc3MgdG93YXJkcyBvdXIgZ29hbC4g VGhhbmsgeW91IQ0KPC9wPg0KPHA+V2UgcHJlc2VudCB0aGUgd29yayB3ZeKAmXZlIGJlZW4gZG9p bmcgdGhpcyBtb250aCBpbiB0aHJlZSBzZWN0aW9uczogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPjxiPkxlYXJuIGFyZWE6PC9iPiBUbyBtYWtlIHN1cmUgdGhhdCB3ZSBmb2N1cyBvbiB0 aGUgY2hhbmdlcyB0aGF0IHRydWx5IGhhdmUgYW4gaW1wYWN0IG9uIHRoZSBzdWNjZXNzIG9mIE9D YW1sIGFuZCBpdHMgY29tbXVuaXR5LCB3ZSBjb25kdWN0ZWQgYSB1c2VyIHN1cnZleSB0YXJnZXRl ZCBhdCBPQ2FtbCBuZXdjb21lcnMuIFRoZSBzdXJ2ZXkgYWxsb3dlZCB1cyB0byBiZXR0ZXIgdW5k ZXJzdGFuZCB0aGVpciBvdXRsb29rIG9uIHRoZSBleGlzdGluZw0KIHNpdGUgYW5kIHRoZWlyIG5l ZWRzIGFuZCB3aXNoZXMgZm9yIHRoZSB1cGNvbWluZyBjaGFuZ2VzLiA8L2xpPjxsaT48Yj5QYWNr YWdlIGRvY3VtZW50YXRpb246PC9iPiBGb2xsb3dpbmcgdGhlIHJlY2VudCBjaGFuZ2VzIHRvIHRo ZSBwYWNrYWdlIGFyZWEsIHdl4oCZdmUgY29udGludWVkIHRvIG1ha2UgaW1wcm92ZW1lbnRzIHRv IHRoZSB1c2FiaWxpdHkgb2YgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgYW5kIGRvY3VtZW50YXRpb24g cGFnZXMuDQo8L2xpPjxsaT48Yj5HZW5lcmFsIEltcHJvdmVtZW50czo8L2I+IFdlIGFsc28gd29y a2VkIG9uIGdlbmVyYWwgbWFpbnRlbmFuY2UgYW5kIGltcHJvdmVtZW50cywgYW5kIHdl4oCZbGwg aGlnaGxpZ2h0IHNvbWUgb2YgdGhlbS4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnMDEwMjQyNSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzAxMDI0MjUiPkxlYXJuIEFyZWE8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlk PSJ0ZXh0LW9yZzAxMDI0MjUiPjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlk PSJvcmc5OWVhMTY4Ij48L2E+MS4gVXNlciBTdXJ2ZXk8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNSIgaWQ9InRleHQtb3JnOTllYTE2OCI+DQo8cD5UaGlzIG1vbnRoLCB3ZSBwdWJsaXNo ZWQgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3lvdS1zdGFydGVkLXRvLWxl YXJuLW9jYW1sLWxlc3MtdGhhbi0xMi1tb250aHMtYWdvLXBsZWFzZS1oZWxwLXVzLXdpdGgtb3Vy LXVzZXItc3VydmV5LW9uLXRoZS1vY2FtbC1vcmctbGVhcm5pbmctYXJlYS8xMTk0NSI+DQp0aGUg c3VydmV5PC9hPiB0aGF0IHdlIHN0YXJ0ZWQgcHJlcGFyaW5nIGluIE1hcmNoLiBUaGUgc3VydmV5 IHdhcyBwcm9tb3RlZCBvbiB2YXJpb3VzIHBsYXRmb3JtcywgaW5jbHVkaW5nIHRoZSBvZmZpY2lh bCBPQ2FtbCBEaXNjdXNzIHBsYXRmb3JtLCBEaXNjb3JkLCBMaW5rZWRJbiwgVHdpdHRlciwgYW5k IHJlY2VpdmVkIGEgbG90IG9mIGVuZ2FnZW1lbnQ6IGluIHRvdGFsLCB3ZSBnb3QgNTcgcmVzcG9u c2VzIGJlZm9yZSB3ZSBoYWQgdG8gY2xvc2UNCiB0aGUgc3VydmV5IGluIG9yZGVyIHRvIGFuYWx5 emUgdGhlIHJlc3VsdHMgYWRlcXVhdGVseS4gPC9wPg0KPHA+QXBhcnQgZnJvbSB0aGlzLCB3ZSBy ZXZpZXdlZCByZWNvcmRpbmdzIG9mIHRoZSBwcmV2aW91cyByb3VuZCBvZiB1c2VyIGludGVydmll d3Mgd2UgZGlkIG9uIHRoZSBMZWFybiBhbmQgUGFja2FnZSBhcmVhcywgdG8gZ3JvdXAgYW5kIHBy aW9yaXRpc2UgdGhlIHVzZXIgZmVlZGJhY2sgZm9yIHVzZSBpbiB1cGNvbWluZyB1c2VyIGludGVy dmlld3MuIFdlIGFsc28gcHJvdmlkZWQgYQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3lvdS1zdGFydGVkLXRvLWxlYXJuLW9jYW1sLWxlc3MtdGhhbi0xMi1tb250aHMtYWdv LXBsZWFzZS1oZWxwLXVzLXdpdGgtb3VyLXVzZXItc3VydmV5LW9uLXRoZS1vY2FtbC1vcmctbGVh cm5pbmctYXJlYS8xMTk0NS8yIj4NCnB1YmxpYyBzdW1tYXJ5IG9mIHRoZSBzdXJ2ZXkgcmVzdWx0 cyBvbiB0aGUgT0NhbWwgRGlzY3VzczwvYT4uIDwvcD4NCjxwPk92ZXJhbGwsIHdl4oCZcmUgbm93 IGluIGEgdmVyeSBnb29kIHBvc2l0aW9uIHRvIHVuZGVyc3RhbmQgd2hpY2ggY2hhbmdlcyBzaG91 bGQgYmUgbWFkZSB0byB0aGUgTGVhcm4gYXJlYSBpbiBvcmRlciB0byBpbXByb3ZlIHRoZSBsZWFy bmluZyBleHBlcmllbmNlIG9uIE9DYW1sLm9yZy4gT3VyIHdvcmsgd2lsbCBjb250aW51ZSBpbiBN YXkgd2l0aCB0aGUgZmlyc3Qgd2lyZWZyYW1lcyBmb3IgdGhlIG5ldyBMZWFybiBhcmVhLg0KPC9w Pg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnYzhkMDIxOSI+PC9hPjIuIFdvcmstaW4tcHJv Z3Jlc3MgSW1wcm92ZW1lbnRzIG9uIERvY3VtZW50YXRpb24gUGFnZXM8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYzhkMDIxOSI+DQo8cD5JbiBhZGRpdGlvbiB0 byB0aGUgaGlnaC1sZXZlbCBvdmVyaGF1bCBvZiB0aGUgTGVhcm4gYXJlYSB3ZeKAmXJlIHdvcmtp bmcgb24sIG91dGxpbmVkIGFib3ZlLCB3ZSBhbHNvIG1hZGUgc2V2ZXJhbCBzbWFsbGVyIGltcHJv dmVtZW50cyBvbiB0aGUgZG9jdW1lbnRhdGlvbiB0byBjb250aW51b3VzbHkgaW1wcm92ZSB0aGUg Y29udGVudCBvZiB0aGUgZG9jdW1lbnRhdGlvbi4NCjwvcD4NCjxwPk1hbnkgb2YgdGhlIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzP3E9aXMlM0FwciYj NDM7aXMlM0FvcGVuJiM0MztsYWJlbCUzQWRvY3VtZW50YXRpb24iPg0Kb3V0c3RhbmRpbmcgcHVs bCByZXF1ZXN0cyBvbiBvY2FtbC9vY2FtbC5vcmc8L2E+IGNvbnRhaW4gdXBkYXRlcyB0byB0aGUg ZXhpc3RpbmcgZG9jdW1lbnRhdGlvbiBwYWdlcyBvZiB0aGUgTGVhcm4gYXJlYS4gV2UgYWltIHRv IG1lcmdlIHRoZSBtYWpvcml0eSBvZiB0aGVzZSBpbiBNYXkuDQo8L3A+DQo8cD5XZSBhcmUgaW5j cmVkaWJseSB0aGFua2Z1bCBmb3IgeW91ciBmZWVkYmFjaywgc3VnZ2VzdGlvbnMsIGFuZCBoZWxw IGFsb25nIHRoZSB3YXkuIFdlIGFyZSBzdHJpdmluZyB0byBtYWtlIGxlYXJuaW5nIE9DYW1sIGZy aWN0aW9ubGVzcyBieSBwcm92aWRpbmcgaGlnaC1xdWFsaXR5IGNvbnRlbnQgb24gT0NhbWwub3Jn LiBJdOKAmXMgcXVpdGUgYSBiaWcgdGFzaywgYW5kIGV2ZXJ5b25l4oCZcyBoZWxwIGlzIGVzc2Vu dGlhbCB0byBhbGxvdyB1cyB0bw0KIG1ha2UgdGhpcyBoYXBwZW4uIDwvcD4NCjwvZGl2Pg0KPC9s aT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczZjUyNDIzIiBj bGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnM2Y1MjQyMyI+UGFja2FnZSBEb2N1bWVudGF0 aW9uPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczZjUyNDIz Ij4NCjxwPkZvbGxvd2luZyB0aGUgcmVjZW50IGNoYW5nZXMgaW4gdGhlIHBhY2thZ2UgYXJlYSwg d2UgY29udGludWVkIHRvIG1ha2UgaW1wcm92ZW1lbnRzIHRvIHRoZSBsYXlvdXQuIE5vdGFibHks IHdlIGFkZGVkIGEgc21hbGwgZm9vdGVyIHRvIHRoZSBMZWFybiBhbmQgUGFja2FnZSBzZWN0aW9u cywgd2hpY2ggc29sdmVzIHRoZSBpc3N1ZSBvZiBzdGlja3ktcG9zaXRpb25lZCBzaWRlYmFycyBt b3Zpbmcgb3V0IG9mIHRoZSBzY3JlZW4gd2hlbiBzY3JvbGxpbmcNCiBpbnRvIHRoZSBmb290ZXIu IFRvIGJldHRlciBoaWdobGlnaHQgdGhlIGN1cnJlbnRseSBhY3RpdmUgc2VjdGlvbiB3aGVuIHNj cm9sbGluZyB0aHJvdWdoIHRoZSBkb2N1bWVudCwgd2UgcmV3b3JrZWQgdGhlIHRhYmxlIG9mIGNv bnRlbnRzIFVJIGluIGJvdGggdGhlIFBhY2thZ2UgYW5kIExlYXJuIHNlY3Rpb25zLg0KPC9wPg0K PHA+V2Ugbm93IGNvbGxhcHNlIHRoZSByZXZlcnNlIGRlcGVuZGVuY2llcyBzZWN0aW9uIG9uIHRo ZSBwYWNrYWdlIG92ZXJ2aWV3IHBhZ2Ugd2hlbiBpdCBoYXMgbW9yZSB0aGFuIDEwMCBlbnRyaWVz LiBUbyBtYWtlIHJvb20gZm9yIHVwY29taW5nIHBhY2thZ2Ugc3RhdHVzIGJhZGdlcywgd2UgbW92 ZWQgdGhlIGJyZWFkY3J1bWJzIGluIHRoZSBwYWNrYWdlIGFyZWEgYWJvdmUgdGhlIG1haW4gY29u dGVudCBhcmVhIGluIGxpbmUgd2l0aCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vd3d3LmZpZ21hLmNv bS9maWxlL0FxazV5MDNmc2FDdWhUU3l3bW1ZMDYvT0NhbWwub3JnLVB1YmxpYy1EZXNpZ25zP3R5 cGU9ZGVzaWduJmFtcDtub2RlLWlkPTAlM0ExJmFtcDt0PVhZeGlsQ2I1aEhrNG1yRGstMSI+DQpG aWdtYSBkZXNpZ25zPC9hPi4gV2UgYWxzbyB1cGRhdGVkIHRoZSBzdHlsZXMgb2YgdGhlIHBhY2th Z2Ugc2VhcmNoIHJlc3VsdHMgcGFnZSB0byBiZSBtb3JlIGNvbXBhY3QsIGNvbGxhcHNpbmcgYXV0 aG9yIGxpc3RzIHdpdGggbW9yZSB0aGFuIGZpdmUgaXRlbXMsIHN0eWxpbmcgcGFja2FnZSB0YWdz IHRoZSBzYW1lIGFzIG9uIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IHBhZ2UsIGFuZCB3ZSBhZGRlZCBh IGxpbmsgdG8gZ28gZGlyZWN0bHkgdG8gdGhlDQogcGFja2FnZSBkb2N1bWVudGF0aW9uLiA8L3A+ DQo8cD5SZWxldmFudCBQUnMvSXNzdWVzOiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+ VGhlIExlYXJuIHNlY3Rpb24gYW5kIHRoZSBQYWNrYWdlIHNlY3Rpb24gbm93IGhhdmUgYSA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAxOCI+DQpzbWFs bCBmb290ZXIgYXR0YWNoZWQgdG8gdGhlIGJvdHRvbSBvZiB0aGUgc2NyZWVuIChvY2FtbC9vY2Ft bC5vcmcjMTAxOCk8L2E+LiBUaGlzIHJlc29sdmVzIHRoZSBVWCBpc3N1ZSB3aGVyZSB0aGUgc3Rp Y2t5LXBvc2l0aW9uZWQgc2lkZWJhcnMgd291bGQgbW92ZSB1cHdhcmRzIG91dCBvZiB0aGUgc2Ny ZWVuIHdoZW4gc2Nyb2xsaW5nIGludG8gdGhlIGZvb3Rlci4gQW4gYWx0ZXJuYXRpdmUgc29sdXRp b24gd2hlcmUgdGhlIHNpZGViYXJzIHNocmluaw0KIGFzIHRoZSBmb290ZXIgY29tZXMgaW50byB2 aWV3IGhhcyBiZWVuIGV4cGxvcmVkIGJ1dCB1bHRpbWF0ZWx5IGRpc2NhcmRlZCBkdWUgdG8gaGln aGVyIGNvbXBsZXhpdHkgYW5kIG1haW50ZW5hbmNlIG5lZWRzLg0KPC9saT48bGk+VGhlIHRhYmxl IG9mIGNvbnRlbnRzIFVJIGluIHRoZSBQYWNrYWdlIHNlY3Rpb24gYXMgd2VsbCBhcyBpbiB0aGUg TGVhcm4gc2VjdGlvbiBpcyByZXdvcmtlZCB0bw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzEwOTQiPmhpZ2hsaWdodCB0aGUgY3VycmVudGx5IGFjdGl2 ZSBzZWN0aW9uIHdoZW4gc2Nyb2xsaW5nIHRocm91Z2ggdGhlIGRvY3VtZW50IChvY2FtbC9vY2Ft bC5vcmcjMTA5NCk8L2E+LiBUaGlzIG1ha2VzIGl0IGVhc2llciB0byBzZWUgcHJvZ3Jlc3MgaW4g cmVhZGluZyB0aGUgY29udGVudCBhbmQgZWFzaWVyIHRvIHJlbGF0ZSB0byB3aGVyZSB3ZSBhcmUg aW4NCiBhIGxhcmdlciBkb2N1bWVudC4gPC9saT48bGk+VGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDk3Ij5sYXlvdXQgb2YgdGhlIHBhY2thZ2Ug ZG9jdW1lbnRhdGlvbiBzZWN0aW9uIGlzIG5vdyB3aWRlIChvY2FtbC9vY2FtbC5vcmcjMTA5Nyk8 L2E+LCB3aXRoIGFuIGluY3JlYXNlZCBnYXAgb24gdGhlDQo8Y29kZT54bDwvY29kZT4gc2NyZWVu IHNpemUuIDwvbGk+PGxpPlNpbmNlIHRoZXJlIGNhbiBiZSBodW5kcmVkcyBvciBldmVuIHRob3Vz YW5kcyBvZiByZXZlcnNlIGRlcGVuZGVuY2llcyBmb3IgYSBwYWNrYWdlLCB3ZeKAmXJlIG5vdw0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzExMDEiPmNv bGxhcHNpbmcgdGhlIHJldmVyc2UgZGVwZW5kZW5jaWVzIHNlY3Rpb24gd2hlbiB0aGVyZSBhcmUg bW9yZSB0aGFuIDEwMCBpdGVtcyAob2NhbWwvb2NhbWwub3JnIzExMDEpPC9hPi4NCjwvbGk+PGxp PlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTEz MyI+YnJlYWRjcnVtYnMgaW4gdGhlIHBhY2thZ2UgYXJlYSBhcmUgbm93IGFib3ZlIHRoZSBtYWlu IGNvbnRlbnQgYXJlYSAob2NhbWwvb2NhbWwub3JnIzExMzMpPC9hPiB3aXRoIHRoZSBpbnRlbnQg dG8gbWFrZSByb29tIG5leHQgdG8gdGhlIHBhY2thZ2UgbmFtZSBmb3IgdXBjb21pbmcgYmFkZ2Vz IHRoYXQsIGUuZy4sIHByb3ZpZGUgaW5mb3JtYXRpb24NCiBvbiB0aGUgYnVpbGQgc3RhdHVzLiA8 L2xpPjxsaT5XZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMTEzNCI+dXBkYXRlZCB0aGUgc3R5bGVzIG9mIHRoZSBwYWNrYWdlIHNlYXJjaCByZXN1bHRz IHBhZ2UgdG8gYmUgbW9yZSBjb21wYWN0IChvY2FtbC9vY2FtbC5vcmcjMTEzNCk8L2E+OiAoYSkg YXV0aG9yIGxpc3RzIHdpdGggbW9yZSB0aGFuIGZpdmUgaXRlbXMgYXJlIGNvbGxhcHNlZCBieSBs aXN0aW5nIHRoZSBmaXJzdCBmaXZlIGF1dGhvcnMgYW5kDQog4oCcZXQgYWwu4oCdLCAoYikgcGFj a2FnZSB0YWdzIGFyZSBub3cgc3R5bGVkIHRoZSBzYW1lIGFzIG9uIHRoZSBwYWNrYWdlIG92ZXJ2 aWV3IHBhZ2UsIChjKSBhIGxpbmsgdG8gZ28gZGlyZWN0bHkgdG8gdGhlIHBhY2thZ2UgZG9jdW1l bnRhdGlvbiBpcyBwcm92aWRlZC4NCjwvbGk+PC9vbD4NCjwvZGl2Pg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPjxhIGlkPSJvcmc2YmYzYzYzIj48L2E+V29yayBpbiBQcm9ncmVzczogQmFzaWMg SW4tUGFja2FnZSBTZWFyY2g8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRl eHQtb3JnNmJmM2M2MyI+DQo8cD5EdXJpbmcgdGhlIGxhc3QgbW9udGgsIHdlIG1hZGUgcHJvZ3Jl c3Mgb24gYnJpbmdpbmcgYmFzaWMgaW4tcGFja2FnZSBzZWFyY2ggZnVuY3Rpb25hbGl0eSB0byB0 aGUgT0NhbWwub3JnIHBhY2thZ2UgZG9jdW1lbnRhdGlvbi4gV29yayBvbiBhIHByb3RvdHlwZSBp cyBvbmdvaW5nIG9uDQo8YSBocmVmPSJodHRwczovL3N0YWdpbmcub2NhbWwub3JnIj5zdGFnaW5n Lm9jYW1sLm9yZzwvYT4gKHNlZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YS1taW5pbWFsLXByb3RvdHlwZS1vZi1pbi1wYWNrYWdlLXNlYXJjaC1pcy1vbi1zdGFnaW5nLW9j YW1sLW9yZy8xMjE2MyI+DQp0aGlzIERpc2N1c3MgcG9zdDwvYT4pLCBhbmQgd2UgcGxhbiB0byBy b2xsIG91dCBhIHJ1ZGltZW50YXJ5IHZlcnNpb24gb2YgaW4tcGFja2FnZSBzZWFyY2ggaW4gTWF5 Lg0KPC9wPg0KPHA+V2XigJlsbCBiZSByb2xsaW5nIG91dCB0aGUgaW5pdGlhbCB2ZXJzaW9uIGFz IGV4cGVyaW1lbnRhbCwgc28gaXQgbWF5IGhhdmUgc29tZSBpc3N1ZXMgYW5kIHdpbGwgYmUgcXVp dGUgbGltaXRlZC4gV2UgYXJlIHJlbGVhc2luZyB0aGlzIGVhcmx5LCBhcyB3ZSBmaW5kIHRoYXQg aGF2aW5nIGluLXBhY2thZ2Ugc2VhcmNoIGlzIHZpdGFsIGZvciB0aGUgdXNhYmlsaXR5IG9mIHRo ZSBwYWNrYWdlIGRvY3VtZW50YXRpb24uIFRoZSB1cHNpZGUgb2YgdGhpcw0KIHByb2Nlc3MgaXMg dGhhdCB3ZeKAmXJlIGFibGUgdG8gYWRhcHQgdG8geW91ciBmZWVkYmFjayBhbmQgaWRlYXMgYXMg d2UgZGVzaWduIHRoZSBmaW5hbCBwcm9kdWN0IGxhdGVyIG9uLg0KPC9wPg0KPC9kaXY+DQo8L2xp PjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2EwZmQzNzYiIGNs YXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhMGZkMzc2Ij5HZW5lcmFsIEltcHJvdmVtZW50 czwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYTBmZDM3NiI+ DQo8cD5XZSBtYWRlIGltcHJvdmVtZW50cyB0byB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5v cmcvZGFzaGJvYXJkIj5PQ2FtbC5vcmcgZGFzaGJvYXJkPC9hPiBhbmQgR2l0SHViIGFjdGlvbnMg d29ya2Zsb3dzLiBUaGUgZGFzaGJvYXJkIG5vdyBkaXNwbGF5cyB0aGUgR2l0IGNvbW1pdCBoYXNo IGFuZCBtZW1vcnkgY29uc3VtcHRpb24gaW4gYnl0ZXMuIFdlIHdvcmtlZCBvbiBmaXhpbmcgdGhl IFJTUyBmZWVkIHNjcmFwaW5nIHdvcmtmbG93LCB3aGljaA0KIHJlc3VsdGVkIGluIHRoZSBhYmls aXR5IHRvIHRyaWdnZXIgdGhlIHNjcmFwZXIgdG8gcnVuIHZpYSB0aGUgR2l0SHViIFVJIGFuZCB0 aGUgYWJpbGl0eSB0byBydW4gd29ya2Zsb3dzIG9uIGEgbG9jYWwgbWFjaGluZS4gVGhlIHNjcmFw aW5nIHdvcmtmbG93IHdhcyBtYWRlIG1vcmUgcm9idXN0IGFnYWluc3QgdGhlIHRlbXBvcmFyeSB1 bmF2YWlsYWJpbGl0eSBvZiBzb3VyY2VzLCBhbmQgaW5kaXZpZHVhbCBmZWVkcyBmb3IgdGhlIEJs b2cgcGFnZQ0KIGFyZSBub3cgc2NyYXBlZCBzZXBhcmF0ZWx5IGFuZCBtZXJnZWQgaW50byBhIGds b2JhbCBmZWVkLiA8L3A+DQo8cD5XZSBhcmUgY3VycmVudGx5IHdvcmtpbmcgb24gZXhwb3Npbmcg dGhlIGJ1aWxkIHN0YXR1cyBkYXRhIGZvciBwYWNrYWdlcyBvbiB0aGUgcGFja2FnZSBvdmVydmll dyBwYWdlcy4gV2UgYWxzbyBzdGFydGVkIHRvIHdvcmsgb24gYSBkZWRpY2F0ZWQg4oCcSW5zdGFs bOKAnSBwYWdlIGZvciBPQ2FtbCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBPQ2FtbCBjb21tdW5pdHku IFRoZSBuZXcgcGFnZSB3aWxsIHByb3ZpZGUgc2hvcnRlciBpbnN0cnVjdGlvbnMgb24NCiBob3cg dG8gc2V0IHVwIE9DYW1sIHF1aWNrbHkgYW5kIHRoZSBjb3JyZXNwb25kaW5nIHBhdGNoIGluY2x1 ZGVzIGFuIG92ZXJhbGwgcmV2aXNpb24gb2YgdGhlIOKAnEdldCBVcCBhbmQgUnVubmluZ+KAnSBk b2N1bWVudGF0aW9uLg0KPC9wPg0KPHA+SW4gYWRkaXRpb24gdG8gYWxsIG9mIHRoaXMsIHRoZSB0 ZWFtIGhhcyBkaWxpZ2VudGx5IHRhY2tsZWQgbnVtZXJvdXMgYnVnIGZpeGVzIGFuZCBxdWFsaXR5 LW9mLWxpZmUgaW1wcm92ZW1lbnRzIHRvIGVuaGFuY2UgdGhlIG92ZXJhbGwgdXNlciBleHBlcmll bmNlLg0KPC9wPg0KPHA+UmVsZXZhbnQgUFJzL0lzc3VlczogPC9wPg0KPG9sIGNsYXNzPSJvcmct b2wiPg0KPGxpPldlIGltcHJvdmVkIHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kYXNo Ym9hcmQiPm9jYW1sLm9yZyBkYXNoYm9hcmQ8L2E+IHRvDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTEzNiI+ZGlzcGxheSB0aGUgR2l0IGNvbW1pdCBo YXNoIGZyb20gd2hpY2ggdGhlIGN1cnJlbnRseSBydW5uaW5nIGluc3RhbmNlIGhhcyBiZWVuIGJ1 aWx0IChvY2FtbC9vY2FtbC5vcmcjMTEzNik8L2E+LCBhbmQgdG8NCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDYwIj5kaXNwbGF5IHRoZSBtZW1vcnkg Y29uc3VtcHRpb24gaW4gYnl0ZXMgKG9jYW1sL29jYW1sLm9yZyMxMDYwKTwvYT4uIEZvciB0aGlz LCB0aGUgYnVpbGQgbmVlZGVkIHRvIGhhcHBlbiBpbiBhIEdpdC1lbmFibGVkIGZvbGRlciB3aGlj aCByZXF1aXJlZA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L29jdXJyZW50 LWRlcGxveWVyL3B1bGwvMTg0Ij5lbmFibGluZyB0aGUg4oCcaW5jbHVkZSBHaXTigJ0gb3B0aW9u IG9uIHRoZSBkZXBsb3ltZW50IHBpcGVsaW5lIChvY3VycmVudC9vY3VycmVudC1kZXBsb3llciMx ODQpPC9hPi4NCjwvbGk+PGxpPlJTUyBmZWVkIHNjcmFwaW5nICh3aGljaCBwcm92aWRlcyB0aGUg ZGF0YSB3ZSBkaXNwbGF5IG9uIHRoZSDigJxCbG9n4oCdIHBhZ2UpIGJyb2tlIGluIEphbnVhcnkg d2hlbiBHaXQgTEZTIHdhcyBpbnRyb2R1Y2VkIHRvIHN0b3JlIHRoZSBPQ2FtbCBQbGF5Z3JvdW5k IGFzc2V0cy4gQW5vdGhlciBpc3N1ZSB3ZSBvYnNlcnZlZCB3YXMgdGhhdA0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL2theWNlZXNyay9yaXZlci9pc3N1ZXMvOCI+SFRUUCByZXF1ZXN0cyB0 byBzb21lIHNvdXJjZXMgd291bGQgdGltZSBvdXQgKGtheWNlZXNyay9yaXZlciM4KTwvYT4uIFdl IHdvcmtlZCBvbiBmaXhpbmcgdGhlIHNjcmFwaW5nIHdvcmtmbG93IGFuZCB1bHRpbWF0ZWx5IHN1 Y2NlZWRlZC4gQXMgYSBjb25zZXF1ZW5jZSBvZiB0aGlzIHdvcmssIHdlIG5vdyBlbmpveSBpbXBy b3ZlbWVudHMgdG8gdGhlIEdpdEh1Yg0KIGFjdGlvbnMgd29ya2Zsb3dzLCBzdWNoIGFzIHRoZSBh YmlsaXR5IHRvIHRyaWdnZXIgdGhlIHNjcmFwZXIgdG8gcnVuIHZpYSB0aGUgR2l0SHViIFVJLCBh bmQgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTA2OCI+YWJpbGl0eSB0byBydW4gd29ya2Zsb3dzIG9uIGEgbG9jYWwgbWFjaGluZSAob2NhbWwv b2NhbWwub3JnIzEwNjgpPC9hPi4gU3Vic2VxdWVudGx5LCB0aGUgc2NyYXBpbmcgd29ya2Zsb3cg d2FzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTEy MCI+bWFkZSBtb3JlIHJvYnVzdCBhZ2FpbnN0IHRlbXBvcmFyeSB1bmF2YWlsYWJpbGl0eSBvZiBz b3VyY2VzIChvY2FtbC9vY2FtbC5vcmcjMTEyMCk8L2E+LCBhbmQsIGluc3RlYWQgb2YgYnVpbGRp bmcgYSBnbG9iYWwgZmVlZCBieSBzY3JhcGluZyBhbGwgc291cmNlcyBhdCB0aGUgc2FtZSB0aW1l LA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzExNDQi PmluZGl2aWR1YWwgZmVlZHMgYXJlIG5vdyBzY3JhcGVkIHNlcGFyYXRlbHkgYW5kIG1lcmdlZCBp bnRvIGEgZ2xvYmFsIGZlZWQgKG9jYW1sL29jYW1sLm9yZyMxMTQ0KTwvYT4uDQo8L2xpPjxsaT5X ZSBhcmUgd29ya2luZyBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvOTc3I3B1bGxyZXF1ZXN0cmV2aWV3LTE0MDQzNDM2MTIiPg0KZXhwb3NpbmcgdGhl IGJ1aWxkIHN0YXR1cyBkYXRhIGZvciBwYWNrYWdlcyBvbiB0aGUgcGFja2FnZSBvdmVydmlldyBw YWdlcyAob2NhbWwvb2NhbWwub3JnIzk3Nyk8L2E+LiBBcyBwYXJ0IG9mIHRoaXMgZWZmb3J0LA0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2luZnJhc3RydWN0dXJlL2lzc3Vlcy80 MCI+Y2hlY2sub2NhbWxsYWJzLmlvIGhhcyBhbHJlYWR5IGJlZW4gbW92ZWQgdG8gY2hlY2suY2ku b2NhbWwub3JnIChvY2FtbC9pbmZyYXN0cnVjdHVyZSM0MCk8L2E+IGJ5IHRoZSBpbmZyYXN0cnVj dHVyZSB0ZWFtLg0KPC9saT48bGk+VG8gcHJvdmlkZSBiZXR0ZXIgc3RhdGlzdGljcyBvbiB0aGUg cHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzIHVzZWQgaW4gdGhlIG9jYW1sL29jYW1sLm9yZyByZXBvc2l0 b3J5LCB3ZSBub3cNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8xMDc0Ij5leGNsdWRlIHZlbmRvcmVkIGZpbGVzIGZyb20gc3RhdHMgKG9jYW1sL29jYW1s Lm9yZyMxMDc0KTwvYT4uDQo8L2xpPjxsaT5Tb21lIEFscGluZUpTLXJlbGF0ZWQgYnVnZml4ZXMg YW5kIGNsZWFudXBzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwub3JnL3B1bGwvMTA2OSI+DQpzZWFyY2ggZHJvcGRvd24gKG9jYW1sL29jYW1sLm9yZyMxMDY5 KTwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8xMDYxIj4NCnNpZGViYXIgKG9jYW1sL29jYW1sLm9yZyMxMDYxKTwvYT4uIDwvbGk+PGxpPlVw Z3JhZGUgQWxwaW5lSlMgdG8gMy4xMi4wLCBIVE1YIHRvIDEuOS4wIChyZXNvbHZlcyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL2lzc3Vlcy84NzciPg0Kb2NhbWwv b2NhbWwub3JnIzg3NzwvYT4pLiA8L2xpPjxsaT5XZSBzdGFydGVkIHdvcmtpbmcgb24gYW4g4oCc SW5zdGFsbOKAnSBwYWdlIGZvciBPQ2FtbCB3aXRoIHRoZSBoZWxwIG9mIHRoZSBPQ2FtbCBjb21t dW5pdHkgYXQNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wbGVhc2UtaW1w cm92ZS1teS1kcmFmdC1vZi1hbi1pbnN0YWxsLXBhZ2Utb24tb2NhbWwtb3JnLzExODM3Ij4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wbGVhc2UtaW1wcm92ZS1teS1kcmFmdC1vZi1hbi1p bnN0YWxsLXBhZ2Utb24tb2NhbWwtb3JnLzExODM3PC9hPi4gVGhlIGludGVudCBvZiB0aGlzIHBh Z2UgaXMgdG8gcHJvdmlkZSBzaG9ydCBpbnN0cnVjdGlvbnMgb24gaG93IHRvIHNldCB1cCBPQ2Ft bCBxdWlja2x5IGJ5IGxldmVyYWdpbmcgT1MgZGV0ZWN0aW9uIHZpYSBKYXZhU2NyaXB0LiBUaGUg dXBjb21pbmcgcGF0Y2ggaW5jbHVkZXMgYW4NCiBvdmVyYWxsIHJldmlzaW9uIG9mIHRoZSDigJxH ZXQgVXAgYW5kIFJ1bm5pbmfigJ0gZG9jdW1lbnRhdGlvbiB0byBwcm92aWRlIGJldHRlciBzZWN0 aW9uIGhlYWRpbmdzIGFuZCB0byBjbGFyaWZ5IGluc3RydWN0aW9ucyB3aGlsZSByZW1vdmluZyBu b2lzZSBmcm9tIHRoZSBkb2N1bWVudC4NCjwvbGk+PGxpPkluIHJlc3BvbnNlIHRvIGFuIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzLzEwNDIiPmlucXVp cnkgYWJvdXQgcGFja2FnZSBkb2N1bWVudGF0aW9uIGZhaWxpbmcgdG8gYnVpbGQ8L2E+LCB0aGUg Q0kgdGVhbSBoZWxwZWQgdXMgYnkgaW52ZXN0aWdhdGluZyB3aHkgdGhlIHNvbHZlciBmYWlscyBm b3IgdGhlIHBhY2thZ2UgaW4gcXVlc3Rpb24uIEl0IHR1cm5zIG91dCB0aGF0LCBjdXJyZW50bHks IHRoZQ0KIHNvbHZlciBhcHBlYXJzIHRvIG9ubHkgdXNlIHR3byBPQ2FtbCB2ZXJzaW9uczogNC4x NCBhbmQgNS4wLjAuIFVudGlsIHRoaXMgY2hhbmdlcywgYW55IHBhY2thZ2UgdGhhdCBkb2VzIG5v dCB3b3JrIHdpdGggZWl0aGVyIG9mIHRoZXNlIE9DYW1sIHZlcnNpb25zIHdpbGwgbm90IGhhdmUg aXRzIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBidWlsdCBzdWNjZXNzZnVsbHkuDQo8L2xpPjxsaT5B IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDA5I3B1 bGxyZXF1ZXN0cmV2aWV3LTEzODA4MjQyMjQiPg0KbmV3IHBhZ2UgdGhhdCBoaWdobGlnaHRzIGFs bCB0aGUgcHJldmlvdXMgT3V0cmVhY2h5IGludGVybnNoaXBzIGNvbmR1Y3RlZCBieSB0aGUgT0Nh bWwgY29tbXVuaXR5IChvY2FtbC9vY2FtbC5vcmcjMTAwOSk8L2E+IGhhcyBiZWVuIGFkZGVkIHRv IHRoZSBDb21tdW5pdHkgc2VjdGlvbi4NCjwvbGk+PGxpPldlIGltcHJvdmVkIHRoZSBIQUNLSU5H Lm1kIGRvY3VtZW50YXRpb24gdG8gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzExMDIiPg0KbWVudGlvbiBwcmVyZXF1aXNpdGVzIG9uIHRoZSBkZXZlbG9w bWVudCBlbnZpcm9ubWVudCBhbmQgdG8gbGluayB0byB0aGUgRG9ja2VyIGltYWdlcyBidWlsdCBi eSB0aGUgQ0kgd2hpY2ggYXJlIHN0b3JlZCBvbiBEb2NrZXIgSHViIChvY2FtbC9vY2FtbC5vcmcj MTEwMik8L2E+LiBUaGUgaW50ZW50IG9mIHRoaXMgaXMgdG8gbWFrZSBpdCBzaW1wbGVyIGZvciBu ZXcgY29udHJpYnV0b3JzIHRvIGpvaW4gdGhlIHByb2plY3QuDQo8L2xpPjxsaT48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTA4MiI+UmVhcnJhbmdlZCB0 aGUg4oCcZmVhdHVyZWTigJ0gc2VjdGlvbiBvbiB0aGUgQmxvZyBwYWdlIHRvIGFsbG93IGZlYXR1 cmluZyBsZXNzIHRoYW4gdGhyZWUgcG9zdHMgKG9jYW1sL29jYW1sLm9yZyMxMDgyKTwvYT4uDQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MTA4MyI+QnVnZml4IGZvciBhIFVuaWNvZGUgcmVuZGVyaW5nIHByb2JsZW0gKG9jYW1sL29jYW1s Lm9yZyMxMDgzKTwvYT4gd2hlbiBzZWFyY2hpbmcgZm9yIHRoZSBlbXB0eSBzdHJpbmcgb24gdGhl IHBhY2thZ2Ugc2VhcmNoIHJlc3VsdHMgcGFnZS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDg1Ij5BZGRlZCDigJlSb2JvdG8gTW9u b+KAmSBhcyBhIGRlZGljYXRlZCBtb25vc3BhY2UgZm9udCAob2NhbWwvb2NhbWwub3JnIzEwODUp PC9hPiB0byBhY2hpZXZlIGEgY29uc2lzdGVudCBkaXNwbGF5IG9mIGNvZGUgc2VjdGlvbnMgZm9y IGFsbCB1c2Vycy4NCjwvbGk+PGxpPkVycm9ycyBpbiB0aGUgZG9jdW1lbnRhdGlvbiB3ZXJlIHJl cG9ydGVkIGJ5IE9DYW1sIHVzZXJzLiBUaGFuayB5b3UhIFdlIGZpeGVkIHRoZW0gaW1tZWRpYXRl bHk6ICgxKSBSZXNvbHZlIHVudXNlZCBmb3ItbG9vcCBpbmRleCBpIEVycm9yDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTA4NCI+b2NhbWwvb2NhbWwu b3JnIzEwODQ8L2E+LCAoMikgcmVtb3ZlIGluY29ycmVjdCBtZW50aW9uIG9mIHV0b3ANCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMDg2Ij5vY2FtbC9v Y2FtbC5vcmcjMTA4NjwvYT4sIGFuZCAoMykgRXhwbGFpbiBob3cgdG8gYWN0aXZhdGUgLWR0eXBl ZHRyZWUgaW4NCjxjb2RlPnV0b3AtZnVsbDwvY29kZT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzEwODkiPm9jYW1sL29jYW1sLm9yZyMxMDg5PC9hPg0K PC9saT48bGk+V2UgdmVuZG9yZWQgYW4gZXhwZXJpbWVudGFsIFlBTUwgcGFyc2luZyB0b29sIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL3lvc2hpIj4NCnRtYXR0aW8veW9zaGk8 L2E+IGludG8gdGhlIG9jYW1sLm9yZyByZXBvc2l0b3J5IHRvIGV4cGxvcmUgaWYgdGhhdCBpcyBh IHN1aXRhYmxlIHdheSB0byBzaW1wbGlmeSB0aGUgWUFNTCBwYXJzaW5nIGFzcGVjdCBvZiB0aGUg Y3VycmVudA0KPGNvZGU+b29kLWdlbjwvY29kZT4gdG9vbCBvZiBvY2FtbC5vcmcuIDwvbGk+PGxp PlRoZSBwYWNrYWdlIGF1dG9jb21wbGV0ZSBzZWFyY2ggaW5wdXQgaW4gdGhlIHRvcCBuYXZpZ2F0 aW9uIGJhciBub3cgcmVhY3RzIGZhc3RlciBzaW5jZSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8xMTIyIj50aHJvdHRsaW5nIGRlbGF5IGhhcyBi ZWVuIHJlbW92ZWQgKG9jYW1sL29jYW1sLm9yZyMxMTIyKTwvYT4uDQo8L2xpPjxsaT5XZSBtYWRl IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTEx NyI+c2hhcmUgYnV0dG9uIG9mIHRoZSBPQ2FtbCBQbGF5Z3JvdW5kIG1vcmUgb2J2aW91cyAob2Nh bWwvb2NhbWwub3JnIzExMTcpPC9hPiBieSBhZGRpbmcgYSBjYXB0aW9uLg0KPC9saT48bGk+V2Ug d29ya2VkIG9uIHRoZSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2ciPmV4cGVy aW1lbnRhbCBjaGFuZ2Vsb2cgcGFnZTwvYT4uDQo8L2xpPjxsaT5Db25zaWRlcmluZyB0aGF0IHRo ZXJlIGFyZSBzb21lIHVubWV0IGNhY2hpbmcgbmVlZHMgaW4gb3VyIHdlYiBzdGFjayAoZS5nLiwg aW4gdGhlIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBzZWN0aW9uOiBsb29raW5nIGF0IHRoZSBtYW55 IEhUVFAgcmVxdWVzdHMgYW5kIHJlbmRlcmluZyB0aGUgbW9kdWxlIHRyZWUgbWVudSksIHdlDQo8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaXMtdGhlcmUtYS1kcm9wLWluLXNv bHV0aW9uLWZvci1zZXJ2aW5nLXJlc3BvbnNlcy1mcm9tLWNhY2hlLWluLWRyZWFtLzExOTg1Ij4N CnJlYWNoZWQgb3V0IHRvIHRoZSBPQ2FtbCBjb21tdW5pdHk8L2E+IHRvIHVuZGVyc3RhbmQgd2hh dCB0aGUgZWNvc3lzdGVtIGlzIGxpa2UgYXQgdGhlIG1vbWVudCBhbmQgaWYgdGhlcmUgaXMgYSBt ZWFuaW5nZnVsIG9wcG9ydHVuaXR5IHRvIGNvbnRyaWJ1dGUgdG8gdGhlIE9DYW1sIGVjb3N5c3Rl bSBhcyBwYXJ0IG9mIG91ciB3b3JrIG9uIE9DYW1sLm9yZy4NCjwvbGk+PGxpPlRoZXJlIGlzIGFu IG9wZW4gUFIgZm9yIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8xMTI2Ij4NCmFkZGluZyBXSVAgZGV2LWNvbnRhaW5lcjwvYT4gdGhhdCBjYW4gbWFrZSBp dCBlYXNpZXIgdG8gZ2V0IHN0YXJ0ZWQgZGV2ZWxvcGluZyBvbiB0aGUgb2NhbWwvb2NhbWwub3Jn IHJlcG9zaXRvcnkuDQo8L2xpPjxsaT5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzExMzkiPuKAnENvbnRyaWJ1dGXigJ0gbGluayBvbiB0aGUgZG9j dW1lbnRhdGlvbiBwYWdlcyBub3cgbGlua3MgdG8gdGhlIGNvbW1pdCBmcm9tIHdoaWNoIHRoZSBj b250ZW50IHdhcyByZW5kZXJlZCAob2NhbWwvb2NhbWwub3JnIzExMzk8L2E+DQo8L2xpPjxsaT5U aGUgT0NhbWwub3JnIHByb2plY3QgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzExMzUiPg0Kb2ZmaWNpYWxseSBhZG9wdGVkIHRoZSBPQ2FtbCBDb2RlIG9m IENvbmR1Y3QgYnkgYWRkaW5nIDxjb2RlPkNPREVfT0ZfQ09ORFVDVC5tZDwvY29kZT4gdG8gaXRz IEdpdEh1YiByZXBvc2l0b3J5IChvY2FtbC9vY2FtbC5vcmcjMTEzNSk8L2E+IGFuZCBieQ0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2NvZGUtb2YtY29uZHVjdC9wdWxsLzYiPmFk ZGluZyBvY2FtbC9vY2FtbC5vcmcgdG8gdGhlIGxpc3Qgb2YgYWRvcHRlcnMgKG9jYW1sL2NvZGUt b2YtY29uZHVjdCM2KTwvYT4NCjwvbGk+PGxpPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTE0MSNwdWxscmVxdWVzdHJldmlldy0xNDAzOTIzMzI5 Ij4NCnByb2JsZW1zIGluIHRoZSBleGVyY2lzZXMgc2VjdGlvbiBvZiB0aGUgTGVhcm4gYXJlYSBj YW4gbm93IGJlIGZpbHRlcmVkIGJ5IGRpZmZpY3VsdHkgKG9jYW1sL29jYW1sLm9yZyMxMTQxKTwv YT4uDQo8L2xpPjxsaT5CdWdmaXg6IHRoZSBwcm9ibGVtIGRpZmZpY3VsdHkgc3ltYm9scyBpbiB0 aGUgZXhlcmNpc2Ugc2VjdGlvbiB3b3VsZCBiZSBjdXQgb2ZmIGluIHRoZSB0b28tc21hbGwgbWFy Z2lucy4gTm93IHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzExMzgiPnByb2JsZW0gZGlmZmljdWx0eSBzeW1ib2xzIGluIHRoZSBleGVyY2lzZXMg c2VjdGlvbiBvbmx5IHNob3cgdXAgaW4gdGhlIG1hcmdpbiBvbg0KPGNvZGU+eGw8L2NvZGU+IHNj cmVlbiBzaXplIChvY2FtbC9vY2FtbC5vcmcjMTEzOCkuPC9hPiA8L2xpPjwvb2w+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5BIGJlc3RpYXJ5IG9mIEdBRFQgZXhhbXBsZXM/ PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hLWJlc3RpYXJ5LW9mLWdh ZHQtZXhhbXBsZXMvMTIxNDMvMTEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2EtYmVz dGlhcnktb2YtZ2FkdC1leGFtcGxlcy8xMjE0My8xMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyOWVjNGZiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnMjllYzRmYiI+Q29udGludWluZyB0aGlzIHRocmVhZCBmcm9tIGxhc3Qgd2VlaywgUmV1 YmVuIFJvd2Ugc2FpZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnMjllYzRmYiI+DQo8cD5JIGhhdmUgdXNlZCBHQURUcyBpbiA8YSBocmVmPSJodHRwczovL2dp dGxhYi5jb20vdHJ1c3R3b3J0aHktcmVmYWN0b3JpbmcvcmVmYWN0b3JlciI+DQpyb3RvcjwvYT4g dG8gaW1wbGVtZW50IGEgcmljaCBpZGVudGlmaWVyIHR5cGUgZm9yIGRpZmZlcmVudCBzeW50YWN0 aWMgZWxlbWVudHMgb2YgdGhlIE9DYW1sIGxhbmd1YWdlLCBhcyB3ZWxsIGFzIHNvbWUgY3VzdG9t IHppcHBlciB0eXBlcyBvdmVyIHRoZSBPQ2FtbCBjb21waWxlciB0eXBlZCBBU1QuDQo8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+MjAyMyBTdGFja092ZXJmbG93IERldmVsb3BlciBT dXJ2ZXk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzIwMjMtc3RhY2tv dmVyZmxvdy1kZXZlbG9wZXItc3VydmV5LzEyMTc0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90LzIwMjMtc3RhY2tvdmVyZmxvdy1kZXZlbG9wZXItc3VydmV5LzEyMTc0LzE8L2E+IDwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTYzOWRhMSIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzU2MzlkYTEiPlRob21hcyBHYXphZ25haXJlIGFubm91 bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNTYzOWRh MSI+DQo8cD5UaGlzIHllYXIsIE9DYW1sIGlzIG9uIHRoZSBsaXN0IG9mIGxhbmd1YWdlcyAod2hp bGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3N0YWNrb3ZlcmZsb3ctZGV2 ZWxvcGVyLXN1cnZleS83OTYxIj4NCml0IHdhc27igJl0IGluIDIwMjE8L2E+ISkuIDwvcD4NCjxw PlNvIG5vdyB3ZSBjYW4gdGVsbCB0aGUgd29ybGQgdGhhdCB3ZSBldmVyeW9uZSBpcyB1c2luZyAo YW5kIGhvcGVmdWxseSB3YW50IHRvIGNvbnRpbnVlIHRvIHVzZSkgT0NhbWw6DQo8YSBocmVmPSJo dHRwczovL3N0YWNrb3ZlcmZsb3cuYmxvZy8yMDIzLzA1LzA4L3RoZS0yMDIzLWRldmVsb3Blci1z dXJ2ZXktaXMtbm93LWxpdmUvIj4NCmh0dHBzOi8vc3RhY2tvdmVyZmxvdy5ibG9nLzIwMjMvMDUv MDgvdGhlLTIwMjMtZGV2ZWxvcGVyLXN1cnZleS1pcy1ub3ctbGl2ZS88L2E+IDpjYW1lbDoNCjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUi IGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5SZWxlYXNlIDAuNS40IG9mIDxjb2RlPkZt bGliX2Jyb3dzZXI8L2NvZGU+PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tcmVsZWFzZS0wLTUtNC1vZi1mbWxpYi1icm93c2VyLzEyMTg0LzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1yZWxlYXNlLTAtNS00LW9mLWZtbGliLWJyb3dzZXIvMTIx ODQvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2Y2Qx M2ZkIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNmNkMTNmZCI+SGVsbXV0IGFubm91 bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNmNkMTNm ZCI+DQo8cD5JdCBpcyBhIHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIDAuNS40IG9m IDxjb2RlPkZtbGliX2Jyb3dzZXI8L2NvZGU+LiBUaGUgbGlicmFyeSBoZWxwcyB0byB3cml0ZSBp bnRlcmFjdGl2ZSB3ZWJhcHBsaWNhdGlvbnMgcnVubmluZyBpbiB0aGUgYnJvd3Nlci4gSXQgaXMg cXVpdGUgZWFzeSB0byB3cml0ZSBpbnRlcmFjdGl2ZSB3ZWJhcHBsaWNhdGlvbnMgd2l0aCB0aGUg aGVscCBvZiB0aGlzIGxpYnJhcnkuIFRoZSB1c2VyIGNvZGUNCiBpcyBwdXJlbHkgZGVzY3JpcHRp dmUgKGFrYSBmdW5jdGlvbmFsKSB3aGljaCBhdm9pZHMgbWFueSBjb21tb24gZXJyb3JzLiA8L3A+ DQo8cD5Zb3UgY2FuIGZpbmQgc29tZSBzaW1wbGUgZXhhbXBsZXMgPGEgaHJlZj0iaHR0cHM6Ly9o YnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvZm1saWJfYnJvd3Nlci9pbmRleC5odG1sIj4NCmhlcmU8 L2E+IGFuZCBpbiA8YSBocmVmPSJodHRwczovL2hici5naXRodWIuaW8vZm1saWIvb2RvYy9mbWxp Yl9icm93c2VyL2RvY19vdmVydmlldy5odG1sIj4NCnRoZSBvdmVydmlldzwvYT4uIDwvcD4NCjxw Pkluc3RhbGwgdGhlIGxpYnJhcnkgd2l0aCA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0i b3JnODllODZmYiI+DQogICAgb3BhbSBpbnN0YWxsIGZtbGliX2Jyb3dzZXINCjwvcHJlPg0KPHA+ VGhlIG5ldyByZWxlYXNlIDAuNS40IGZpeGVzIHNvbWUgYnVncyBpbiB0aGUgaW5pdGlhbCB2ZXJz aW9uIDAuNS4zIGFuZCBoYXMgc29tZSBtaW5vciBhZGRlZCBmdW5jdGlvbmFsaXR5Lg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk9DYW1sIFBsYXRmb3JtIE5ld3NsZXR0ZXI6IEFw cmlsIDIwMjM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXBs YXRmb3JtLW5ld3NsZXR0ZXItYXByaWwtMjAyMy8xMjE4Ny8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVyLWFwcmlsLTIwMjMvMTIxODcvMTwv YT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMTczYWJhIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzE3M2FiYSI+VGhpYmF1dCBNYXR0aW8gYW5u b3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczMTcz YWJhIj4NCjxwPldlbGNvbWUgdG8gdGhlIGZpcnN0IGlzc3VlIG9mIHRoZSBPQ2FtbCBQbGF0Zm9y bSBuZXdzbGV0dGVyISA8L3A+DQo8cD5Gb2xsb3dpbmcgaW4gdGhlIGZvb3RzdGVwcyBvZiB0aGUg T0NhbWwub3JnIG5ld3NsZXR0ZXIgYW5kIGluc3BpcmVkIGJ5IHRoZSBNdWx0aWNvcmUgYW5kIENv bXBpbGVyIG5ld3NsZXR0ZXJzLCB3ZeKAmXJlIGV4Y2l0ZWQgdG8gYnJpbmcgeW91IG1vbnRobHkg dXBkYXRlcyBvbiB0aGUgcHJvZ3Jlc3Mgd2XigJlyZSBtYWtpbmcgaW4gaW1wcm92aW5nIHRoZSBP Q2FtbCBEZXZlbG9wZXIgRXhwZXJpZW5jZS4NCjwvcD4NCjxwPlRoZSA8YSBocmVmPSJodHRwczov L29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtIj5PQ2FtbCBQbGF0Zm9ybTwvYT4gaXMgdGhlIHJlY29t bWVuZGVkIHNldCBvZiB0b29scyB0byB3b3JrIGFuZCBiZSBwcm9kdWN0aXZlIHdpdGggT0NhbWwu IFRoZSBQbGF0Zm9ybSB0b29scyBmaWxsIGdhcHMgaW4gdGhlIE9DYW1sIGRldmVsb3BlciBleHBl cmllbmNlIGFuZCBhbGxvdyBkZXZlbG9wZXJzIHRvIHBlcmZvcm0gc3BlY2lmaWMgd29ya2Zsb3dz IChlLmcuDQogYnVpbGRpbmcgcGFja2FnZXMsIGZvcm1hdHRpbmcgY29kZSwgZ2VuZXJhdGluZyBk b2N1bWVudGF0aW9uLCByZWxlYXNpbmcgcGFja2FnZXMsIGV0Yy4pLg0KPC9wPg0KPHA+QXQgdGhl IGVuZCBvZiB0aGUgZGF5LCBhbGwgdGhlIHdvcmsgd2XigJlyZSBkb2luZyBvbiB0aGUgT0NhbWwg UGxhdGZvcm0gaGFzIG9uZSBvYmplY3RpdmU6IGltcHJvdmluZyB0aGUgT0NhbWwgZGV2ZWxvcGVy IGV4cGVyaWVuY2UsIHNvIGluIHRoaXMgbmV3c2xldHRlciwgd2XigJlsbCBwcmVzZW50IHRoZSBw cm9ncmVzcyB3ZeKAmXJlIG1ha2luZyBvbiB0aGUgZGlmZmVyZW50IHByb2plY3RzIGZyb20gdGhl IGxlbnMgb2YgdGhlc2UgZGV2ZWxvcGVyIHdvcmtmbG93cy4NCiBCYXNlZCBvbiB0aGUgcmVzdWx0 cyBvZiB0aGUgT0NhbWwgc3VydmV5cyAoPGEgaHJlZj0iaHR0cHM6Ly93d3cuZHJvcGJveC5jb20v cy9vbWJhMWQ4dmhsam5yY24vT0NhbWwtdXNlci1zdXJ2ZXktMjAyMC5wZGY/ZGw9MCI+MjAyMDwv YT4gYW5kDQo8YSBocmVmPSJodHRwczovL29jYW1sLXNmLm9yZy9kb2NzLzIwMjIvb2NhbWwtdXNl ci1zdXJ2ZXktMjAyMi5wZGYiPjIwMjI8L2E+KSwgZGlzY3Vzc2lvbnMgd2l0aCBpbmR1c3RyaWFs IHVzZXJzLCBjb250aW51b3VzIGNvbW11bml0eSBmZWVkYmFjayBvbiBEaXNjdXNzLCBhbmQgb3Ro ZXIgc291cmNlcyBvZiB1c2VyIGlucHV0LCBoZXJlIGFyZSB0aGUgd29ya2Zsb3dzIHdl4oCZcmUg Y3VycmVudGx5IHdvcmtpbmcgb246DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+ QnVpbGRpbmcgUGFja2FnZXM6PC9iPiBPdXIgaW1tZWRpYXRlIGdvYWwgZm9yIHRoZSBidWlsZCB3 b3JrZmxvdyBpcyB0byByZW1vdmUgdGhlIGZyaWN0aW9uIGFzc29jaWF0ZWQgdG8gdXNpbmcgdHdv IGRpZmZlcmVudCB0b29scyBmb3IgcGFja2FnZSBtYW5hZ2VtZW50IGFuZCBidWlsZCBzeXN0ZW0u IFRvIHRoaXMgZW5kLCB3ZQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2V4 cGxvcmF0aW9ucy1vbi1wYWNrYWdlLW1hbmFnZW1lbnQtaW4tZHVuZS8xMjEwMSI+DQpwbGFuIG9u IGludGVncmF0aW5nIG9wYW0gY2FwYWJpbGl0aWVzIGRpcmVjdGx5IGludG8gRHVuZTwvYT4sIGVz dGFibGlzaGluZyBpdCBhcyB0aGUgc2luZ3VsYXIgdG9vbCBuZWVkZWQgdG8gYnVpbGQgT0NhbWwg cHJvamVjdHMuIEFzIGEgYnktcHJvZHVjdCBvZiB0aGlzIGludGVncmF0aW9uLCB3ZSBhaW0gdG8g aW1wcm92ZSBvdGhlciB3b3JrZmxvd3Mgc3VjaCBhcyB3b3JraW5nIG9uIG11bHRpcGxlIHByb2pl Y3RzLCBjcm9zcy1jb21waWxhdGlvbiwNCiBhbmQgaW1wcm92aW5nIHRoZSBvdmVyYWxsIGV4cGVy aWVuY2UgdG8gZ2V0IHN0YXJ0ZWQgd2l0aCBPQ2FtbC4gPC9saT48bGk+PGI+Q29tcGlsaW5nIHRv IEphdmFTY3JpcHQ6PC9iPiBXZeKAmXJlIGNvbnRpbnVvdXNseSBzdXBwb3J0aW5nIHRvb2xzIHRv IGNvbXBpbGUgT0NhbWwgdG8gSmF2YVNjcmlwdC4gRHVuZSBpbnRlZ3JhdGVzIHdlbGwgd2l0aCBK c19vZl9vY2FtbCBhbmQgd2XigJl2ZSBiZWVuIHdvcmtpbmcgb24gYW4gaW50ZWdyYXRpb24gb2Yg RHVuZSBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tZWxhbmdlLXJlL21lbGFuZ2Ui Pk1lbGFuZ2U8L2E+LCBhIHJlY2VudCBmb3JrIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9yZXNjcmlwdC1sYW5nL3Jlc2NyaXB0LWNvbXBpbGVyIj4NClJlU2NyaXB0PC9hPiB0aGF0IGFp bXMgdG8gYnJpbmcgdG8gaW50ZWdyYXRlIGNsb3NlbHkgd2l0aCB0aGUgT0NhbWwgZWNvc3lzdGVt LiA8L2xpPjxsaT48Yj5HZW5lcmF0aW5nIERvY3VtZW50YXRpb246PC9iPiBUaGUgc3RhdGUgb2Yg dGhlIE9DYW1sIFBhY2thZ2VzIGRvY3VtZW50YXRpb24gaXMgcmVwb3J0ZWQgYXMgYSBtYWpvciBw YWluIHBvaW50IGluIHRoZSBPQ2FtbCBzdXJ2ZXlzICg8YSBocmVmPSJodHRwczovL3d3dy5kcm9w Ym94LmNvbS9zL29tYmExZDh2aGxqbnJjbi9PQ2FtbC11c2VyLXN1cnZleS0yMDIwLnBkZj9kbD0w Ij4yMDIwPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtc2Yub3JnL2RvY3MvMjAyMi9v Y2FtbC11c2VyLXN1cnZleS0yMDIyLnBkZiI+MjAyMjwvYT4pLiBXZeKAmXJlIHdvcmtpbmcgdG93 YXJkcyBlbXBvd2VyaW5nIE9DYW1sIGRldmVsb3BlcnMgdG8gY3JlYXRlIGhpZ2gtcXVhbGl0eSBk b2N1bWVudGF0aW9uIGZvciB0aGVpciBwYWNrYWdlcy4gTm93IHRoYXQgdGhlIGRvY3VtZW50YXRp b24gb2YgcGFja2FnZXMgaXMNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL3BhY2thZ2VzIj5y ZWFkaWx5IGF2YWlsYWJsZSBvbiBPQ2FtbC5vcmc8L2E+LCB3ZSB3YW50IHRvIG1ha2Ugd3JpdGlu ZyBkb2N1bWVudGF0aW9uIHJld2FyZGluZyBhbmQgc3RyYWlnaHRmb3J3YXJkLiBXZeKAmXJlIHdv cmtpbmcgdG93YXJkcyBtYWtpbmcgT2RvYyBzdWl0YWJsZSB0byBjcmVhdGUgbWFudWFscyBieSBh ZGRpbmcgbmV3IGZlYXR1cmVzLCBpbXByb3ZpbmcgdGhlIG5hdmlnYXRpb24sIGFuZA0KIGV4cGFu ZGluZyB0aGUgb2RvYyBtYXJrdXAgc3ludGF4IHRvIHN1cHBvcnQgcmljaCBjb250ZW50IHN1Y2gg YXMgdGFibGVzLCBpbWFnZXMgYW5kIGdyYXBocy4NCjwvbGk+PGxpPjxiPkVkaXRpbmcgYW5kIFJl ZmFjdG9yaW5nIENvZGU6PC9iPiBXZSBhaW0gdG8gZW5yaWNoIHRoZSBPQ2FtbCBlZGl0b3Igc3Vw cG9ydCB3aXRoIG1vcmUgd29ya2Zsb3dzIHRvIGltcHJvdmUgY29kZSBuYXZpZ2F0aW9uIGFuZCBh dXRvbWF0ZSByZWZhY3RvcmluZy4gT3VyIG1haW4gZm9jdXMgY3VycmVudGx5IGlzIG9uIGFkZGlu ZyBzdXBwb3J0IGZvciBwcm9qZWN0LXdpZGUgcmVmZXJlbmNlcyB0byBNZXJsaW4uIEZ1dHVyZSB3 b3JrIHdpbGwNCiBpbmNsdWRlIGltcGxlbWVudGluZyBhIHByb2plY3Qtd2lkZSByZW5hbWUgcXVl cnkgYW5kIHF1ZXJpZXMgc3VjaCBhcyByZW5hbWluZyBhcmd1bWVudHMuIFdlIGFyZSBhbHNvIHdv cmtpbmcgdG93YXJkcyBicmluZ2luZyB0aGUgZWRpdG9yIHN1cHBvcnQgZm9yIE9DYW1sIHRvIHRo ZSB3ZWIgYW5kIHRoaXJkLXBhcnR5IHBsYXRmb3JtcyBzdWNoIGFzIE9DYW1sIFBsYXlncm91bmQs IFJlcGxJdCwgYW5kIEdpdEh1YiBDb2Rlc3BhY2VzLg0KPC9saT48bGk+PGI+Rm9ybWF0dGluZyBD b2RlOjwvYj4gT3VyIGdvYWwgZm9yIGZvcm1hdHRpbmcgY29kZSBpcyBmb2N1c2VkIG9uIGltcHJv dmluZyBhY2N1cmFjeSwgcGFydGljdWxhcmx5IGZvciB0aGUgdG8gY29tbWVudHMuIFdlIGFsc28g d2FudCB0byBzdHJpa2UgdGhlIHJpZ2h0IGJhbGFuY2UgYmV0d2VlbiBwcm92aWRpbmcgYSBkZWZh dWx0IHByb2ZpbGUgdGhhdCBhcHBlYWxzIHRvIG1vc3QgdXNlcnMgYW5kIG5vdCByZXF1aXJpbmcg Y29uZmlndXJhdGlvbg0KIHRvIGZvcm1hdCB5b3VyIE9DYW1sIHByb2plY3RzLCB3aGlsZSBzdGls bCBtYWludGFpbmluZyBhIGZ1bGx5IGNvbmZpZ3VyYWJsZSBmb3JtYXR0ZXIuIEFkZGl0aW9uYWxs eSwgd2UgcGxhbiB0byBlbmhhbmNlIHRoZSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9mIG9jYW1s Zm9ybWF0IGFuZCBiZXR0ZXIgaW50ZWdyYXRlIER1bmUgYW5kIG9jYW1sZm9ybWF0Lg0KPC9saT48 L3VsPg0KPHA+SeKAmWxsIGFsc28gdGFrZSB0aGUgb3Bwb3J0dW5pdHkgdG8gY2FsbCBmb3IgbmV3 IGNvbnRyaWJ1dG9ycy4gUGxhdGZvcm0gcHJvamVjdHMgYXJlIGFsd2F5cyBsb29raW5nIGZvciBu ZXcgbWFpbnRhaW5lcnMgYW5kIGNvbnRyaWJ1dG9ycywgc28gaWYgeW914oCZcmUgaW50ZXJlc3Rl ZCBpbiB0aGUgZnV0dXJlIG9mIE9DYW1s4oCZcyBkZXZlbG9wZXIgZXhwZXJpZW5jZSBhbmQgd291 bGQgbGlrZSB0byBzaGFwZSB0aGF0IGZ1dHVyZSB3aXRoIHVzLCBwbGVhc2UNCiByZWFjaCBvdXQg dG8gbWUgb3IgYW55IFBsYXRmb3JtIG1haW50YWluZXJzLiBJZiB5b3XigJlyZSBhbiBpbmR1c3Ry aWFsIHVzZXIgbG9va2luZyBmb3Igc3VwcG9ydCBvbiB0aGUgT0NhbWwgUGxhdGZvcm0gYW5kIHdv dWxkIGxpa2UgdG8gZnVuZCB0aGUgbWFpbnRhaW5lcnMgYW5kIHRoZSBkZXZlbG9wbWVudHMgb24g dGhlIFBsYXRmb3JtIHRvb2xzLCBhbHNvIGRvbuKAmXQgaGVzaXRhdGUgdG8gW3JlYWNoIG91dCB0 byBtZV0oPGEgaHJlZj0ibWFpbHRvOnRoaWJhdXRAdGFyaWRlcy5jb20iPm1haWx0bzp0aGliYXV0 QHRhcmlkZXMuY29tPC9hPikuDQo8L3A+DQo8cD5BcHJpbCBoYXMgc2VlbiBhIGZsdXJyeSBvZiBh Y3Rpdml0eSwgYW5kIHdlIGNhbuKAmXQgd2FpdCB0byBzaGFyZSBvdXIgcHJvZ3Jlc3Mgd2l0aCB5 b3UuIFNvIGxldOKAmXMgZ2V0IHJpZ2h0IHRvIGl0IQ0KPC9wPg0KPHA+SW4gdGhpcyBpbmF1Z3Vy YWwgaXNzdWUsIHdl4oCZbGwgYmUgZGlzY3Vzc2luZyBwcm9ncmVzcyBvbiB0aGUgZm9sbG93aW5n IHByb2plY3RzOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkJ1aWxkaW5nIFBhY2th Z2VzDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGI+W0R1bmVdPC9iPiBFeHBsb3JpbmcgUGFj a2FnZSBNYW5hZ2VtZW50IGluIER1bmUgPC9saT48bGk+PGI+W29wYW1dPC9iPiBOYXRpdmUgU3Vw cG9ydCBmb3IgV2luZG93cyBpbiBvcGFtIDIuMiA8L2xpPjxsaT48Yj5bRHVuZV08L2I+IEltcHJv dmluZyBEdW5l4oCZcyBEb2N1bWVudGF0aW9uIDwvbGk+PGxpPjxiPltEdW5lXTwvYj4gQ29tcG9z aW5nIGluc3RhbGxlZCBDb3EgdGhlb3JpZXMgPC9saT48bGk+PGI+W0R1bmVdPC9iPiBEdW5lIFRl cm1pbmFsIFVzZXIgSW50ZXJmYWNlIDwvbGk+PGxpPjxiPltEdW5lXTwvYj4gUnVubmluZyBBY3Rp b25zIENvbmN1cnJlbnRseSA8L2xpPjxsaT48Yj5bRHVuZV08L2I+IEJlbmNobWFya2luZyBEdW5l IG9uIExhcmdlIENvZGUgQmFzZXMgPC9saT48L3VsPg0KPC9saT48bGk+Q29tcGlsaW5nIHRvIEph dmFTY3JpcHQNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5bRHVuZV08L2I+IENvbXBpbGUg dG8gSmF2YVNjcmlwdCB3aXRoIE1lbGFuZ2UgaW4gRHVuZSA8L2xpPjwvdWw+DQo8L2xpPjxsaT5H ZW5lcmF0aW5nIERvY3VtZW50YXRpb24NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Yj5bT2Rv Y108L2I+IEFkZCBTZWFyY2ggQ2FwYWJpbGl0aWVzIHRvIDxjb2RlPm9kb2M8L2NvZGU+IDwvbGk+ PGxpPjxiPltEdW5lXTwvYj4gVXNlci1GcmllbmRseSBDb21tYW5kIHRvIEdlbmVyYXRlIERvY3Vt ZW50YXRpb24gPC9saT48bGk+PGI+W09kb2NdPC9iPiBTdXBwb3J0IGZvciBUYWJsZXMgaW4gPGNv ZGU+b2RvYzwvY29kZT4gPC9saT48L3VsPg0KPC9saT48bGk+RWRpdGluZyBhbmQgUmVmYWN0b3Jp bmcgQ29kZQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPltNZXJsaW5dPC9iPiBTdXBwb3J0 IGZvciBQcm9qZWN0LVdpZGUgUmVmZXJlbmNlcyBpbiBNZXJsaW4gPC9saT48bGk+PGI+W01lcmxp bl08L2I+IEltcHJvdmluZyBNZXJsaW7igJlzIFBlcmZvcm1hbmNlIDwvbGk+PGxpPjxiPltPQ2Ft bCBMU1BdPC9iPiBVc2luZyBEdW5lIFJQQyBvbiBXaW5kb3dzIDwvbGk+PGxpPjxiPltPQ2FtbCBM U1BdPC9iPiBVcHN0cmVhbWluZyBPQ2FtbCBMU1DigJlzIEZvcmsgb2YgTWVybGluIDwvbGk+PC91 bD4NCjwvbGk+PGxpPkZvcm1hdHRpbmcgQ29kZQ0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxi PltPQ2FtbEZvcm1hdF08L2I+IE1pZ3JhdGUgT0NhbWxGb3JtYXQgZnJvbSBhbiBBU1QgdG8gYSBD U1QgPC9saT48bGk+PGI+W09DYW1sRm9ybWF0XTwvYj4gQ2xvc2luZyB0aGUgR2FwIEJldHdlZW4g T0NhbWxGb3JtYXQgYW5kIDxjb2RlPm9jcC1pbmRlbnQ8L2NvZGU+DQo8L2xpPjwvdWw+DQo8L2xp PjwvdWw+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZmZGM5NDkiIGNs YXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdmZmRjOTQ5Ij5SZWxlYXNlczwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZmZkYzk0OSI+DQo8cD5IZXJlIGFy ZSB0aGUgbmV3IHZlcnNpb25zIG9mIFBsYXRmb3JtIHRvb2xzIHdlIHJlbGVhc2VkIGluIEFwcmls LiBIYXZlIGEgbG9vayBhdCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxv ZyI+T0NhbWwgQ2hhbmdlbG9nPC9hPiB0byByZWFkIGFubm91bmNlbWVudHMgYW5kIGZlYXR1cmUg aGlnaGxpZ2h0cyENCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtY29tbXVuaXR5L3V0b3AvcmVsZWFzZXMvdGFnLzIuMTIuMCI+ VVRvcCAyLjEyLjA8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtY29tbXVuaXR5L3V0b3AvcmVsZWFzZXMvdGFnLzIuMTIuMSI+VVRvcCAyLjEyLjE8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcmVhbHdvcmxkb2NhbWwvbWR4L3Jl bGVhc2VzL3RhZy8yLjMuMCI+TURYIDIuMzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9kdW5lL3JlbGVhc2VzL3RhZy8zLjcuMSI+RHVuZSAzLjcuMTwvYT4g PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9y Z2UwM2JhZTIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdlMDNiYWUyIj5CdWlsZGlu ZyBQYWNrYWdlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3Jn ZTAzYmFlMiI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2IwODdm YTMiPjwvYT48Yj5bRHVuZV08L2I+IEV4cGxvcmluZyBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVu ZTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdiMDg3ZmEzIj4N CjxwPkNvbnRyaWJ1dG9yczogQHJncmluYmVyZyAoVGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJ ViAoVGFyaWRlcyksIEBncmlkYnVncyAoVGFyaWRlcyksIEBraXQtdHkta2F0ZSAoVGFyaWRlcykN CjwvcD4NCjxwPkVhcmxpZXIgdGhpcyBtb250aCwgd2UgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2V4cGxvcmF0aW9ucy1vbi1wYWNrYWdlLW1hbmFnZW1lbnQtaW4tZHVuZS8x MjEwMSI+DQphbm5vdW5jZWQ8L2E+IHRoYXQgd2XigJl2ZSBzdGFydGVkIGV4cGxvcmluZyBwYWNr YWdlIG1hbmFnZW1lbnQgaW4gRHVuZS4gWW91IGNhbiByZWFkIHRoZSBSZXF1ZXN0IGZvciBDb21t ZW50IChSRkMpIHRoYXQgZGV0YWlscyBvdXIgd29yay1pbi1wcm9ncmVzcyBwbGFucyBmb3IgdGhl IGZlYXR1cmUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy83 NjgwIj5vbiBHaXRIdWI8L2E+LiA8L3A+DQo8cD5XZeKAmXJlIGN1cnJlbnRseSBmb2N1c2VkIG9u IGJ1aWxkaW5nIHByb3RvdHlwZXMgZm9yIGRpZmZlcmVudCBwYXJ0cyBvZiB0aGUgRHVuZSB3b3Jr Zmxvdzogc291cmNlIGZldGNoaW5nLCBidWlsZGluZyBub24tRHVuZSBvcGFtIHBhY2thZ2VzLCBh bmQgZ2VuZXJhdGluZyBhIGxvY2sgZmlsZS4NCjwvcD4NCjxwPkluIEFwcmlsLCB3ZSBtZXJnZWQg YSBmaXJzdCB2ZXJzaW9uIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L3B1bGwvNzE3OSI+DQpTb3VyY2UgRmV0Y2hpbmc8L2E+LiBXZSBhbHNvIHN0YXJ0ZWQgdGhpbmtp bmcgYWJvdXQgaG93IER1bmUgY291bGQgYnVpbGQgb3BhbSBwYWNrYWdlcyBhbmQNCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzYyNiI+bWVyZ2VkIGEgUFI8L2E+ IGxheWluZyB0aGUgZm91bmRhdGlvbiBmb3IgdGhlIHJ1bGVzIG9uIGJ1aWxkaW5nIHRoZW0gaW4g RHVuZS4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM8L2I+OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+Q29tcGxldGVkIGFuZCBtZXJnZWQgYSBmaXJzdCB2ZXJzaW9uIG9mIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzE3OSI+DQpTb3VyY2UgRmV0Y2hp bmc8L2E+IDwvbGk+PGxpPlVwc3RyZWFtZWQgYSBwYXRjaCBpbiBvcGFtIHRvIDxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTUwOCI+DQpyZW1vdmUgcHJlcHJvY2Vz c2luZyBvZiBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSBjb2RlPC9hPi4gVGhpcyBoZWxwZWQgdG8g cmVkdWNlIHRoZSBudW1iZXIgb2YgZGVwZW5kZW5jaWVzIHRvIHZlbmRvciBpbiBEdW5lIHdoZW4g dmVuZG9yaW5nIG9wYW0uDQo8L2xpPjxsaT5XZSBtZXJnZWQgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvcHVsbC83NjI2Ij5hIFBSPC9hPiB0aGF0IGxheXMgdGhlIGZvdW5k YXRpb24gYW5kIHByb3ZpZGVzIGEgc2tlbGV0b24gZm9yIHRoZSBmZWF0dXJlcyByZWxhdGVkIHRv IGJ1aWxkaW5nIG9wYW0gcGFja2FnZXMuDQo8L2xpPjxsaT5Gb2xsb3dpbmcgd29yayBvbiA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtb3BhbS9vcGFtLTBpbnN0YWxsLXNvbHZlciI+ DQowaW5zdGFsbC1zb2x2ZXI8L2E+LCB3aGljaCB3ZeKAmWxsIHVzZSBhcyBhIHNvbHZlciBpbiBE dW5lIDQsIHdlIG9wZW4gYSBQUiBvbiA8Y29kZT4NCm9jYW1sL29wYW0tcmVwb3NpdG9yeTwvY29k ZT4gdG8gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9w dWxsLzIzNzM2Ij4NCnJlbW92ZSBjb25zdHJhaW50cyBvbiBwYWNrYWdlIHZlcnNpb25zIGluIGNv bmZsaWN0czwvYT4gYW5kIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0v cHVsbC81NTM1Ij4NCnBhdGNoIG9uIG9wYW08L2E+IGZvciB0aGUgc2FtZSBjb25mbGljdC4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnZThhM2Y0ZCI+PC9hPjxiPltvcGFt XTwvYj4gTmF0aXZlIFN1cHBvcnQgZm9yIFdpbmRvd3MgaW4gb3BhbSAyLjI8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZThhM2Y0ZCI+DQo8cD5Db250cmlidXRv cnM6IEByamJvdSAoT0NhbWxQcm8pLCBAa2l0LXR5LWthdGUgKFRhcmlkZXMpLCBAZHJhMjcgKFRh cmlkZXMpLCBAZW1pbGxvbiAoVGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJViAoVGFyaWRlcykN CjwvcD4NCjxwPkJyaW5naW5nIFRpZXItMSBzdXBwb3J0IGZvciBXaW5kb3dzIGhhcyBiZWVuIGEg ZHJlYW0gZm9yIHNvbWUgdGltZSBhbmQgQXByaWwgaGFzIHNlZW4gdXMgZ2V0IGNsb3NlciB0aGFu IGV2ZXIgYmVmb3JlIHRvIHRoZSBmaXJzdCBhbHBoYSBvZiBvcGFtIDIuMiwgd2hpY2ggd2UgZXhw ZWN0IGluIE1heS4gVGhpcyBlYXJseSBhbHBoYSBpcyBhIGJpZyBzdGVwIHRvd2FyZHMgdGhlIHJl bGVhc2Ugb2Ygb3BhbSAyLjIgd2l0aCBuYXRpdmUgV2luZG93cw0KIHN1cHBvcnQsIGFuZCBpcyB0 aGUgcmVzdWx0IG9mIGEgaHVtb25nb3VzIGFtb3VudCBvZiBlZmZvcnQgYnJpbmdpbmcgdG9nZXRo ZXIgdGhlIHdvcmsgb2YgbWFueSBwZW9wbGUgZG9uZSBvdmVyIHRoZSB5ZWFycy4NCjwvcD4NCjxw PjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q29uZmln dXJlOiBFbnN1cmUgYSBjb21wbGVtZW50YXJ5ICgzMmJpdCBvbiA2NGJpdCBwbGF0Zm9ybXMgYW5k IDY0Yml0IG9uIDMyYml0IHBsYXRmb3JtcykgQyBjb21waWxlciBpcyBpbnN0YWxsZWQgb24gV2lu ZG93cw0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTIyIj5v Y2FtbC9vcGFtIzU1MjI8L2E+IDwvbGk+PGxpPkRvIG5vdCBzaWxlbnRseSBkaXNhYmxlIE1DQ1Mg aWYgYSBDJiM0MzsmIzQzOyBjb21waWxlciBpcyBub3QgcHJlc2VudCA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzU1MjciPg0Kb2NhbWwvb3BhbSM1NTI3PC9hPiA8 L2xpPjxsaT5Nb3ZlIHRoZSA8Y29kZT4ub2NhbWxpbml0PC9jb2RlPiBzY3JpcHQgb3V0IG9mIHRo ZSByb290IGRpcmVjdG9yeSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9w dWxsLzU1MjYiPg0Kb2NhbWwvb3BhbSM1NTI2PC9hPiA8L2xpPjxsaT5NQ0NTIG9uIFdpbmRvd3Mg ZG9lcyBub3QgcmVzcGVjdCBhdm9pZC12ZXJzaW9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vcGFtL2lzc3Vlcy81NTIzIj4NCm9jYW1sL29wYW0jNTUyMzwvYT4gPC9saT48bGk+ U2V0dXAgYmVuY2htYXJraW5nIHVzaW5nIGN1cnJlbnQtYmVuY2ggPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTI1Ij4NCm9jYW1sL29wYW0jNTUyNTwvYT4gPC9s aT48bGk+VXBkYXRlIHRvIGxhdGVzdCA8Y29kZT5tc3ZzLWRldGVjdDwvY29kZT4gPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTE0Ij4NCm9jYW1sL29wYW0jNTUx NDwvYT4gPC9saT48bGk+Rml4IHRoZSBjb21waWxhdGlvbiBvZiA8Y29kZT5jYW1saGVhZGVyPC9j b2RlPiB3aGVuIEJJTkRJUiBjb250YWlucyBlc2NhcGluZyBjaGFyYWN0ZXJzDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMjIxNCI+b2NhbWwvb3BhbSMxMjIx NDwvYT4gPC9saT48bGk+ZG9jOiA/IGV2YWx1YXRlcyB0byB0cnVlIGlmIGRlZmluZWQgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTEyIj4NCm9jYW1sL29wYW0j NTUxMjwvYT4gPC9saT48bGk+U3RvcCB0aGUgY29uZmlndXJlIHNjcmlwdCBmcm9tIGRvd25sb2Fk aW5nIGFuZCB2ZW5kb3JpbmcgZGVwZW5kZW5jaWVzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vcGFtL3B1bGwvNTUxMSI+DQpvY2FtbC9vcGFtIzU1MTE8L2E+IDwvbGk+PGxpPlJl bW92ZSBwcmVwcm9jZXNzaW5nIG9mIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IGNvZGUgPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NTA4Ij4NCm9jYW1sL29wYW0j NTUwODwvYT4gPC9saT48bGk+Rml4IGxpbnRpbmcgb24gPGNvZGU+b3BhbS1jcm93YmFyLm9wYW08 L2NvZGU+IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTUwNyI+ DQpvY2FtbC9vcGFtIzU1MDc8L2E+IDwvbGk+PGxpPmRlcGV4dHM6IHJld29yZCBtZXNzYWdlIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTQ5OSI+b2NhbWwvb3Bh bSM1NDk5PC9hPg0KPC9saT48bGk+UmVwbGFjZSB1c2FnZSBvZiBDUFBPIDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwvNTQ5OCI+b2NhbWwvb3BhbSM1NDk4PC9hPg0K PC9saT48bGk+Q2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBzd2hpZF9jb3JlIGluIHRoZSBjb25m aWd1cmUgc2NyaXB0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3B1bGwv NTQ5NyI+DQpvY2FtbC9vcGFtIzU0OTc8L2E+IDwvbGk+PGxpPkFkZCBwYWNrYWdlIHN0YW56YSBv biBhbGwgcnVsZXMgdGhhdCBkZXBlbmQgb24gPGNvZGU+b3BhbU1haW4uZXhlLmV4ZTwvY29kZT4g PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcHVsbC81NDk2Ij4NCm9jYW1s L29wYW0jNTQ5NjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNjEx YjIxMCI+PC9hPjxiPltEdW5lXTwvYj4gSW1wcm92aW5nIER1bmXigJlzIERvY3VtZW50YXRpb248 YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNjExYjIxMCI+DQo8 cD5Db250cmlidXRvcnM6IEBlbWlsbG9uIChUYXJpZGVzKSA8L3A+DQo8cD5JbiBNYXJjaCwgd2Ug c3RhcnRlZCByZXN0cnVjdHVyaW5nIHRoZSBEdW5lIGRvY3VtZW50YXRpb24gYWNjb3JkaW5nIHRv IHRoZSA8YSBocmVmPSJodHRwczovL2RpYXRheGlzLmZyLyI+DQpEaWF0YXhpcyBmcmFtZXdvcms8 L2E+LiBXZSBvcGVuZWQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC83MzI1Ij4NCmEgZHJhZnQgUFI8L2E+IHRvIGRlbW9uc3RyYXRlIHRoZSBvdmVyYWxsIHRhcmdl dCBzdHJ1Y3R1cmUuIFRoZSBuZXcgc3RydWN0dXJlIHdpbGwgaW1wcm92ZSB0aGUgdXNhYmlsaXR5 IG9mIHRoZSBkb2N1bWVudGF0aW9uLCBhbGxvd2luZyB1c2VycyB0byBmaW5kIHRoZSBpbmZvcm1h dGlvbiB0aGF0IHRoZXkgYXJlIGxvb2tpbmcgZm9yLCBhcyB3ZWxsIGFzIGVuYWJsZSB1cyB0byBi ZXR0ZXIgaWRlbnRpZnkgZ2FwcyB0aGF0IG5lZWQgdG8gYmUgYWRkcmVzc2VkLg0KPC9wPg0KPHA+ SW4gQXByaWwgd2XigJl2ZSBjb250aW51ZWQgdGhpcyB3b3JrLCBmaWxsaW5nIGluIHNvbWUgb2Yg dGhvc2UgZ2FwcyBhcyB3ZWxsIGFzIHJld3JpdGluZyBkb2N1bWVudHMgdG8gYmV0dGVyIGZpdCBp biB0aGUgaW50ZW5kZWQgcXVhZHJhbnQgb2YgdGhlIGZyYW1ld29yay4NCjwvcD4NCjxwPjxiPkFj dGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+VHVybiDigJxBdXRv bWF0aWMgRm9ybWF0dGluZ+KAnSBpbnRvIGEgaG93LXRvIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9kdW5lL3B1bGwvNzQ3OSI+DQpvY2FtbC9kdW5lIzc0Nzk8L2E+IDwvbGk+PGxp Pk1vdmUgbGV4aWNhbCBjb252ZW50aW9ucyB0byByZWZlcmVuY2UgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83NDk5Ij4NCm9jYW1sL2R1bmUjNzQ5OTwvYT4gPC9s aT48bGk+VHVybiA8Y29kZT5vcGFtLnJzdDwvY29kZT4gaW50byAzIGd1aWRlcyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc1MTUiPg0Kb2NhbWwvZHVuZSM3NTE1 PC9hPiA8L2xpPjxsaT5BZGQgc29tZSBpbmZvIGFib3V0IHdyaXRpbmcgZG9jcyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc1MzciPg0Kb2NhbWwvZHVuZSM3NTM3 PC9hPiA8L2xpPjxsaT5NZXJnZSA8Y29kZT5jbGFzc2ljYWwtcHB4PC9jb2RlPiBpbnRvIDxjb2Rl PnByZXByb2Nlc3Npbmctc3BlYzwvY29kZT4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL2R1bmUvcHVsbC83NTM4Ij4NCm9jYW1sL2R1bmUjNzUzODwvYT4gPC9saT48bGk+TWVyZ2Ug cmVmZXJlbmNlIGluZm8gYWJvdXQgZmluZGxpYiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvZHVuZS9wdWxsLzc1NjciPg0Kb2NhbWwvZHVuZSM3NTY3PC9hPiA8L2xpPjxsaT5BZGQg YSBsZXhlciBmb3Igb3BhbSBmaWxlcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9wdWxsLzc1NzQiPg0Kb2NhbWwvZHVuZSM3NTc0PC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4N CjwvbGk+PGxpPjxhIGlkPSJvcmdlODQ5NWEyIj48L2E+PGI+W0R1bmVdPC9iPiBDb21wb3Npbmcg aW5zdGFsbGVkIENvcSB0aGVvcmllczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmdlODQ5NWEyIj4NCjxwPkNvbnRyaWJ1dG9yczogQEFsaXp0ZXIgYW5kIEBlamdh bGxlZ28gKElSSUYpIDwvcD4NCjxwPldl4oCZdmUgbWVyZ2VkIHRoZSBQUiB0aGF0IGJyaW5ncyA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzcwNDciPg0Kc3VwcG9y dCBmb3IgY29tcG9zaW5nIENvcSB0aGVvcmllcyB3aXRoIER1bmU8L2E+ISA8L3A+DQo8cD5UaGlz IHdhcyBhIGh1Z2UgZWZmb3J0IGxlYWQgYnkgQWxpIENhZ2xheWFuIGFuZCBFbWlsaW8gSmVzw7pz IEdhbGxlZ28gQXJpYXMgdGhhdCBzdGFydGVkIGVhcmxpZXIgdGhpcyB5ZWFyLiBTdGFydGluZyBp biBEdW5lIDMuOCwgQ29xIHVzZXJzIHdpbGwgYmUgYWJsZSB0byB1c2UgRHVuZSBldmVuIGlmIHRo ZXkgZGVwZW5kIG9uIENvcSBwcm9qZWN0cyB0aGF0IHVzZSBvdGhlciBidWlsZCBzeXN0ZW1zIChz dWNoIGFzIG1ha2UpLg0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczwvYj46IDwvcD4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5NZXJnZWQgdGhlIFBSIHRoYXQgYWRkcyA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzcwNDciPnN1cHBvcnQgZm9yIGNvbXBvc2l0aW9u IHdpdGggaW5zdGFsbGVkIHRoZW9yaWVzIHRvIHRoZSBDb3EgcnVsZXM8L2E+DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc2MTM0ZWU4Ij48L2E+PGI+W0R1bmVdPC9iPiBE dW5lIFRlcm1pbmFsIFVzZXIgSW50ZXJmYWNlPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTUiIGlkPSJ0ZXh0LW9yZzYxMzRlZTgiPg0KPHA+Q29udHJpYnV0b3JzOiBAQWxpenRlciwgQHJn cmluYmVyZyAoVGFyaWRlcykgPC9wPg0KPHA+V2XigJlyZSB3b3JraW5nIG9uIGEgbmV3IFRlcm1p bmFsIFVzZXIgSW50ZXJmYWNlIChUVUkpIG1vZGUgZm9yIER1bmUuIE91ciBnb2FsIGlzIHRvIGdp dmUgRHVuZSB1c2VycyBhbiBpbnRlcmFjdGl2ZSBHVUktbGlrZSBleHBlcmllbmNlIHJpZ2h0IGZy b20gdGhlIHRlcm1pbmFsLCBtYWtpbmcgaXQgZWFzaWVyIHRvIGludGVyYWN0IHdpdGggYnVpbGQg dGFyZ2V0cywgb2JzZXJ2ZSBwcm9jZXNzZXMsIGFuZCBtb3JlLiBUaGUgd29yayBpcyBzdGlsbA0K IHZlcnkgbXVjaCBpbiBwcm9ncmVzcywgYnV0IGV4cGVjdCBncmFkdWFsIGltcHJvdmVtZW50cyBv ZiA8Y29kZT5kdW5lIGJ1aWxkIC0tZGlzcGxheSB0dWk8L2NvZGU+IGluIHRoZSBjb21pbmcgbW9u dGhzLg0KPC9wPg0KPGRpdiBpZD0ib3JnZjc2MzFlZiIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1n IHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMv b2NhbWwvb3JpZ2luYWwvMlgvZS9lZTFkNjBjYzNiNGQyOWI3OTViZGFmZGQ2ODU3YjkzMDcyOTc1 MzEwLnBuZyIgYWx0PSJlZTFkNjBjYzNiNGQyOWI3OTViZGFmZGQ2ODU3YjkzMDcyOTc1MzEwLnBu ZyI+DQo8L3A+DQo8L2Rpdj4NCjxwPjxiPkFjdGl2aXRpZXM8L2I+OiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+SW50cm9kdWNlZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvcHVsbC82OTk2Ij5uZXcgPGNvZGU+dHVpPC9jb2RlPiBtb2RlPC9hPiBmb3Ig RHVuZS4NCjwvbGk+PGxpPkVuYWJsZWQgRHVuZSB0byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS9wdWxsLzcxODgiPnJlZGlzcGxheSAyNC1iaXQgY29sb3Igb3V0cHV0PC9h Pi4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzM2NTExYWIiPjwvYT48 Yj5bRHVuZV08L2I+IFJ1bm5pbmcgQWN0aW9ucyBDb25jdXJyZW50bHk8YnI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMzY1MTFhYiI+DQo8cD5Db250cmlidXRvcnM6 IEBBbGl6dGVyIGFuZCBAaGh1Z28gKE5vbWFkaWMgTGFicykgPC9wPg0KPHA+SW4gSmFudWFyeSwg d2UgYmVnYW4gd29ya2luZyBvbiBhbGxvd2luZyBEdW5lIHRvIGV4ZWN1dGUgYWN0aW9ucyBhbmQg cnVuIGlubGluZSB0ZXN0cyBjb25jdXJyZW50bHkuIFRoaXMgbW9udGgsIHdlIG1lcmdlZCB0aGUg dHdvIFBScyBhbmQgdGhlIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIHVwY29taW5n IER1bmUgMy44LiBXZeKAmXJlIGVzcGVjaWFsbHkgZXhjaXRlZCBhYm91dCB0aGUgYWJpbGl0eSB0 byBydW4gaW5saW5lIHRlc3RzDQogY29uY3VycmVudGx5IHRvIHNwZWVkIHVwIHRlc3QgY3ljbGVz ISA8L3A+DQo8cD48Yj5BY3Rpdml0aWVzPC9iPjogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPldl4oCZdmUgbWVyZ2VkIHRoZSBQUiB0aGF0IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL3B1bGwvNjkzMyI+aW1wbGVtZW50cyBhIG5ldyBjb25jdXJyZW50IGFjdGlv bjwvYT4gaW4gRHVuZSwgd2hpY2ggYWxsb3dzIHlvdSB0byBleGVjdXRlIGFjdGlvbnMgY29uY3Vy cmVudGx5Lg0KPC9saT48bGk+V2UgYWxzbyBtZXJnZWQgdGhlIFBSIHRoYXQgYnVpbHQgb24gdGhp cyBmZWF0dXJlIHRvIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwv NzAxMiI+DQplbmFibGVkIER1bmUgdG8gcnVuIGlubGluZSB0ZXN0cyBjb25jdXJyZW50bHk8L2E+ LiA8L2xpPjxsaT5XZeKAmXZlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0 L3BweF9pbmxpbmVfdGVzdC9wdWxsLzQwIj5wYXRjaGVkDQo8Y29kZT5wcHhfaW5saW5lX3Rlc3Q8 L2NvZGU+PC9hPiB0byBsZXZlcmFnZSB0aGUgbmV3IGZlYXR1cmUuIDwvbGk+PC91bD4NCjwvZGl2 Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzQ1MjJkMjgiPjwvYT48Yj5bRHVuZV08L2I+IEJlbmNobWFy a2luZyBEdW5lIG9uIExhcmdlIENvZGUgQmFzZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNSIgaWQ9InRleHQtb3JnNDUyMmQyOCI+DQo8cD5Db250cmlidXRvcnM6IEBncmlkYnVncyAo VGFyaWRlcyksIEBMZW9uaWRhcy1mcm9tLVhJViAoVGFyaWRlcykgPC9wPg0KPHA+SW4gTWFyY2gg d2UgYWRkZWQgPGEgaHJlZj0iaHR0cHM6Ly9hdXR1bW4ub2NhbWxsYWJzLmlvL29jYW1sL2R1bmUv YnJhbmNoL21haW4/d29ya2VyPWZlcm1hdCZhbXA7aW1hZ2U9YmVuY2glMkZtb25vcmVwbyUyRmJl bmNoLkRvY2tlcmZpbGUiPg0KY29udGlub3VzIGJlbmNobWFya2luZzwvYT4gb2YgRHVuZSBidWls ZHMgb24gYSA0OCBjb3JlIGJhcmVtZXRhbCBzeXN0ZW0uIFRoaXMgaXMgdGhlIHJlc3VsdCBvZiBh IGxvdCBvZiB3b3JrIHRoYXQgaW5jbHVkZWQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1kdW5lL29jYW1sLW1vbm9yZXBvLWJlbmNobWFyayI+YnVpbGRpbmcgYSBiaWcgbW9ub3Jl cG8gZm9yIG9wYW0gcGFja2FnZXM8L2E+IGFsbG93aW5nIHVzZXJzIHRvIHJ1biBEdW5lIGJlbmNo bWFya3Mgb24gbGFyZ2UgY29kZSBiYXNlcy4NCjwvcD4NCjxwPkluIEFwcmlsIHdlIGFkZGVkIHN1 cHBvcnQgZm9yIGJlbmNobWFya2luZyBidWlsZHMgaW4gd2F0Y2ggbW9kZSBhcyB3ZWxsLiBUaGlz IGFsbG93cyB1cyB0byBtb25pdG9yIGZvciByZWdyZXNzaW9ucyBhcyB3ZSBtb3ZlIGZvcndhcmQg d2l0aCBtYWpvciBpbml0aWF0aXZlcywgc3VjaCBhcyBwYWNrYWdlIG1hbmFnZW1lbnQuDQo8L3A+ DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFk ZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzc1NTIiPndhdGNo LW1vZGUgYmVuY2htYXJrczwvYT4gb2YgZHVuZSBtb25vcmVwbyB1c2luZyBEdW5l4oCZcyBzdHJl YW1pbmcgUlBDIGludGVyZmFjZQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2I4ZGVhNWIiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmdiOGRlYTViIj5Db21waWxpbmcgdG8gSmF2YVNjcmlwdDwvaDQ+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYjhkZWE1YiI+PC9kaXY+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzQ1OWM2YTQiPjwvYT48Yj5bRHVuZV08 L2I+IENvbXBpbGUgdG8gSmF2YVNjcmlwdCB3aXRoIE1lbGFuZ2UgaW4gRHVuZTxicj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc0NTljNmE0Ij4NCjxwPkNvbnRyaWJ1 dG9yczogQGFubW9udGVpcm8sIEBqY2hhdmFycmkgKEFocmVmcyksIEByZ3JpbmJlcmcgKFRhcmlk ZXMpIDwvcD4NCjxwPllvdSBtYXkgaGF2ZSByZWFkIHRoYXQgPGEgaHJlZj0iaHR0cHM6Ly9tZWRp dW0uY29tL2FocmVmcy9haHJlZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS1iMTRmNWVjNTZk ZjQiPg0KQWhyZWZzIG1pZ3JhdGVkIGl0cyBjb2RlYmFzZSBmcm9tIFJlU2NyaXB0IHRvIE1lbGFu Z2U8L2E+LCBhIG5ldyBPQ2FtbC10by1KYXZhU2NyaXB0IGNvbXBpbGVyIGJhc2VkIG9uIFJlU2Ny aXB0Lg0KPC9wPg0KPHA+VGhlIGdvYWwgb2YgTWVsYW5nZSBpcyB0byBvZmZlciBhbiBhbHRlcm5h dGl2ZSB0byBSZVNjcmlwdCB0aGF0IHBhaXJzIHdlbGwgd2l0aCB0aGUgT0NhbWwgZWNvc3lzdGVt LiBUbyB0aGF0IGVuZCwgQW50b25pbyBOdW5vIE1vbnRlaXJvIGFuZCBKYXZpZXIgQ2jDoXZhcnJp IGhhdmUgYmVlbiB3b3JraW5nIG9uIGludGVncmF0aW5nIE1lbGFuZ2UgYW5kIER1bmUsIGFsbG93 aW5nIGl0IHRvIGVhc2lseSBjb21waWxlIE9DYW1sIHByb2plY3RzIHRvDQogSmF2YVNjcmlwdCB3 aXRoIE1lbGFuZ2UuIDwvcD4NCjxwPlRoZSBmZWF0dXJlIHdpbGwgYmUgYXZhaWxhYmxlIGluIHRo ZSB1cGNvbWluZyBEdW5lIDMuOC4gWW91IGNhbiBhbHJlYWR5IDxhIGhyZWY9Imh0dHBzOi8vZHVu ZS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvbWVsYW5nZS5odG1sIj4NCnJlYWQgdGhlIGRvY3Vt ZW50YXRpb248L2E+IGluIER1bmXigJlzIG1hbnVhbCB0byBnZXQgYSBnbGltcHNlIG9mIGhvdyB0 aGUgZmVhdHVyZSB3aWxsIHdvcmsuIFlvdSBjYW4gYWxzbyBoYXZlIGEgbG9vayBhdCB0aGUNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tZWxhbmdlLXJlL21lbGFuZ2Utb3BhbS10ZW1wbGF0 ZSI+b3BhbSBNZWxhbmdlIHRlbXBsYXRlPC9hPiBidWlsdCBieSB0aGUgTWVsYW5nZSB0ZWFtLg0K PC9wPg0KPHA+PGI+QWN0aXZpdGllczwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PldyaXRlIGEgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83NDc3 Ij5tYW51YWwgcGFnZTwvYT4gaW4gRHVuZSB0byBjb21waWxlIHRvIEphdmFTY3JpcHQgdXNpbmcg TWVsYW5nZS4NCjwvbGk+PGxpPk1ha2UgTWVsYW5nZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vbWVsYW5nZS1yZS9tZWxhbmdlL3B1bGwvNTQ4Ij53b3JrIG9uIDQuMTMtNS4xPC9hPiByYXRo ZXIgdGhhbiBqdXN0IDQuMTQNCjwvbGk+PGxpPkluIGFkZGl0aW9uIHRvIHdoYXQgd2UgZGlkIGlu IEFwcmlsLCBoZXJlIGFyZSBzb21lIG5vdGV3b3J0aHkgUFJzIHRoYXQgd2VyZSB3b3JrZWQgb24g aW4gcHJldmlvdXMgbW9udGhzOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZGVkIGEgPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83MjM0Ij5uZXcgZmllbGQg PGNvZGU+bWVsYW5nZS5ydW50aW1lX2RlcHM8L2NvZGU+PC9hPiB0byBsaWJyYXJpZXMsIHNvIHRo YXQgTWVsYW5nZSBsaWJyYXJ5IGF1dGhvcnMgY2FuIHRlbGwgRHVuZSB3aGljaCBmcm9udGVuZCBh c3NldHMgKGxpa2UgQ1NTIG9yIGltYWdlIGZpbGVzLCBmb250cyBldGMpIGhhdmUgdG8gYmUgaW5z dGFsbGVkIHdpdGggdGhlaXINCiBsaWJyYXJ5IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvNzE4Ny8iPlNwZWVkIHVwIHJ1bGUgZ2VuZXJhdGlvbjwv YT4gZm9yIGxpYnJhcmllc3MgYW5kIGV4ZWN1dGFibGVzLiBUaGlzIHdhcyB1c2VmdWwgZm9yIE1l bGFuZ2UsIGJ1dCBiZW5lZml0cyBldmVyeSBEdW5lIHByb2plY3QuDQo8L2xpPjxsaT48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vbWVsYW5nZS1yZS9tZWxhbmdlL3B1bGwvNTE3Ij5NYWtlIHJl YWN0anMtanN4LXBweCBhIHN0YW5kYWxvbmUgcHB4PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83MTkzIj5JbXBsZW1lbnRlZCBhIDxjb2Rl Pm1vZHVsZV9zeXN0ZW08L2NvZGU+IGZpZWxkPC9hPiBmb3IgdGhlIG1lbGFuZ2Ugc3RhbnphIChl LmcuDQo8Y29kZT4obW9kdWxlX3N5c3RlbXMgKGVzNiBtanMpIChjb21tb25qcyBqcykgKGNvbW1v bmpzIGNqcykpPC9jb2RlPiB3aGljaCBhbGxvd3MgdG8gb3V0cHV0IG11bHRpcGxlIG1vZHVsZSBz eXN0ZW1zIC8ganMgZXh0ZW5zaW9ucyBhdCB0aGUgc2FtZSB0aW1lIHRvIHRoZSBtZWxhbmdlIG91 dHB1dCBmb2xkZXINCjwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNjA2OTJiIiBjbGFzcz0ib3V0 bGluZS00Ij4NCjxoNCBpZD0ib3JnMTYwNjkyYiI+R2VuZXJhdGluZyBEb2N1bWVudGF0aW9uPC9o ND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxNjA2OTJiIj48L2Rp dj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnMWUwNTQ3NyI+PC9hPjxiPltP ZG9jXTwvYj4gQWRkIFNlYXJjaCBDYXBhYmlsaXRpZXMgdG8gPGNvZGU+b2RvYzwvY29kZT48YnI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMWUwNTQ3NyI+DQo8cD5D b250cmlidXRvcnM6IEBwYW5nbGVzZCAoVGFyaWRlcyksIEBFbWlsZVRyb3RpZ25vbiAoVGFyaWRl cykgPC9wPg0KPHA+V2XigJlyZSB3b3JraW5nIG9uIGdlbmVyYXRpbmcgYSBzZWFyY2ggaW5kZXgg YW5kIGFkZGluZyBhIHNlYXJjaCBiYXIgdG8gPGNvZGU+b2RvYzwvY29kZT4tZ2VuZXJhdGVkIGRv Y3VtZW50YXRpb24uIFdl4oCZcmUgc3RpbGwgZXhwbG9yaW5nIHRoZSBkaWZmZXJlbnQgYXBwcm9h Y2hlcyBhbmQgd2UgYXJlIHdvcmtpbmcgd2l0aCB0aGUgT0NhbWwub3JnIHRlYW0gdG8gaW1wbGVt ZW50IGEgc2VhcmNoIGJhciBvbiB0aGUgT0NhbWwgcGFja2FnZXMgZG9jdW1lbnRhdGlvbi4NCjwv cD4NCjxkaXYgaWQ9Im9yZ2EzYjliMWIiIGNsYXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0 dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29w dGltaXplZC8yWC9kL2Q3N2ZlMjc4MzgzMGJmMDI0NTQ4N2ZmMzIzYWRmMjc3OTRmNzZiNGVfMl8x MzgweDk0Mi5wbmciIGFsdD0iZDc3ZmUyNzgzODMwYmYwMjQ1NDg3ZmYzMjNhZGYyNzc5NGY3NmI0 ZV8yXzEzODB4OTQyLnBuZyI+DQo8L3A+DQo8L2Rpdj4NCjxwPjxiPkFjdGl2aXRpZXM8L2I+OiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2Ugc3RhcnRlZCA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vcGFuZ2xlc2Qvb2RvYy90cmVlL3NlYXJjaC1iYXIiPnByb3RvdHlwaW5nPC9h PiB0aGUgc2VhcmNoIGluZGV4IGFuZCBzZWFyY2ggYmFyIGFuZCB3ZeKAmXJlIGRpc2N1c3Npbmcg dGhlIGRlc2lnbiBvZiBpdC4gSW4gcGFydGljdWxhciwgd2XigJl2ZSB1c2VkIHRoZSBjb21waWxl ciBTaGFwZXMgaW4gdGhlIHByb3RvdHlwZSBhbmQgd2XigJlsbCBleHBsb3JlIHVzaW5nIG9kb2Pi gJlzIHBhdGgNCiByZXNvbHZlciBpbnN0ZWFkIGFzIGEgbmV4dCBzdGVwLiA8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdmYTIxMTgyIj48L2E+PGI+W0R1bmVdPC9iPiBVc2Vy LUZyaWVuZGx5IENvbW1hbmQgdG8gR2VuZXJhdGUgRG9jdW1lbnRhdGlvbjxicj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdmYTIxMTgyIj4NCjxwPkNvbnRyaWJ1dG9y OiBARW1pbGVUcm90aWdub24gKFRhcmlkZXMpLCBAam9ubHVkbGFtIChUYXJpZGVzKSA8L3A+DQo8 cD5XZeKAmXJlIHdvcmtpbmcgdG93YXJkcyBtYWtpbmcgZ2VuZXJhdGluZyBkb2N1bWVudGF0aW9u IGluIER1bmUgbW9yZSBhY2Nlc3NpYmxlLCBlc3BlY2lhbGx5IGZvciBuZXdjb21lcnMuIEN1cnJl bnRseSwgdGhlDQo8Y29kZT5kdW5lIGJ1aWxkIEBkb2M8L2NvZGU+IGNvbW1hbmQgZ2VuZXJhdGVz IGRvY3VtZW50YXRpb24gaW4gdGhlIDxjb2RlPl9idWlsZDwvY29kZT4gZGlyZWN0b3J5LCBhbmQg dXNlcnMgc2ltcGx5IGhhdmUgdG8ga25vdyB0aGF0IHRoZXkgbmVlZCB0bw0KPGNvZGU+b3BlbiBf YnVpbGQvZGVmYXVsdC9fZG9jL19odG1sL2luZGV4Lmh0bWw8L2NvZGU+LiBUbyB3b3JrIGFyb3Vu ZCB0aGlzLCB3ZeKAmXJlIHdvcmtpbmcgb24gYSBuZXcNCjxjb2RlPmR1bmUgb2NhbWwgZG9jPC9j b2RlPiBjb21tYW5kIHRvIGdlbmVyYXRlIGRvY3VtZW50YXRpb24gYW5kIG9wZW4gaXQgaW4gdGhl IGJyb3dzZXIgZGlyZWN0bHkuDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzPC9iPjogPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPldlIG9wZW5lZCBhIFBSIHRoYXQgPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83MjYyIj5pbXBsZW1lbnRzIHRoZQ0KPGNvZGU+ ZHVuZSBvY2FtbCBkb2M8L2NvZGU+PC9hPiBjb21tYW5kIGluIE1hcmNoLiBUaGlzIG1vbnRoLCB3 ZSB0ZXN0ZWQgdGhlIGZlYXR1cmUgb24gbWFjT1MuIFdlIGFyZSBub3cgd29ya2luZyB0b3dhcmRz IGNvbXBsZXRpbmcgdGhlIFdpbmRvd3MgdGVzdHMuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+ PGxpPjxhIGlkPSJvcmc4Y2MwZTkwIj48L2E+PGI+W09kb2NdPC9iPiBTdXBwb3J0IGZvciBUYWJs ZXMgaW4gPGNvZGU+b2RvYzwvY29kZT48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIg aWQ9InRleHQtb3JnOGNjMGU5MCI+DQo8cD5Db250cmlidXRvcnM6IEBncGV0aW90IChUYXJpZGVz KSwgQHBhbmdsZXNkIChUYXJpZGVzKSwgQEp1bG93IChUYXJpZGVzKSwgQGpvbmx1ZGxhbSAoVGFy aWRlcykNCjwvcD4NCjxwPkN1cnJlbnRseSwgdGhlIG9ubHkgd2F5IHRvIGNyZWF0ZSB0YWJsZXMg d2l0aCBvZG9jIGlzIHRvIGlubGluZSBIVE1MIGNvZGUgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRp cyBpcyBub3QgaWRlYWwgYXMgdGhlIEhUTUwgdGFibGUgc3ludGF4IGlzIG5vdCB3ZWxsLXN1aXRl ZCBhcyBkb2N1bWVudGF0aW9uIG1hcmt1cCBhbmQgdGhlIHRhYmxlcyBjYW4gb25seSBiZSByZW5k ZXJlZCBieSB0aGUgSFRNTCByZW5kZXJlciAoc28gdGFibGVzIGFyZSBub3QNCiBhdmFpbGFibGUg aW4gTGFUZXggYW5kIG1hbnBhZ2VzKS4gV2XigJlyZSB3b3JraW5nIHRvd2FyZHMgYSBuZXcgc3Bl Y2lhbCBzeW50YXggaW4gb2RvYyBmb3IgY3JlYXRpbmcgdGFibGVzIHRoYXQgaXMgZWFzaWVyIHRv IHVzZSBhbmQgY2FuIGJlIHJlbmRlcmVkIGJ5IGFsbCByZW5kZXJlcnMuDQo8L3A+DQo8cD5UaGUg c3ludGF4IHN1cHBvcnQgaGFzIGJlZW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s LWRvYy9vZG9jLXBhcnNlci9wdWxsLzExIj4NCm1lcmdlZCBpbiBvZG9jLXBhcnNlcjwvYT4uIEl0 IHByb3ZpZGVzIGEgaGVhdnktc3ludGF4LCBhbmQgYSBsaWdoLXN5bnRheCBpbnNwaXJlZCBieSBN YXJrZG93bjoNCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmc3YWQxN2EzIj4NCnt0 DQogIGEgIHwgYiB8IGMgfCBkDQogIC0tLXw6LS18LS06fDotOg0KICBhICB8IGIgfCBjIHwgZA0K fQ0KPC9wcmU+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2Mv cHVsbC84OTMiPnN1cHBvcnQgZm9yIHRoZSBmZWF0dXJlIGluIG9kb2M8L2E+IGlzbuKAmXQgbWVy Z2VkIHlldCwgYnV0IHNob3VsZCBiZSBhdmFpbGFibGUgaW4gdGhlIG5leHQgb2RvYyB2ZXJzaW9u IQ0KPC9wPg0KPHA+PGI+QWN0aXZpdGllczwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPk5vIG5ldyBhY3Rpdml0eSBpbiBNYXJjaCwgYnV0IGhlcmUgYXJlIFB1bGwgUmVxdWVzdHMg d2UgaGF2ZSBiZWVuIHdvcmtpbmcgb24gdW50aWwgbm93Og0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPkFkZCBhIG5ldyBzeW50YXggZm9yIHRhYmxlcyBpbiBvZG9jLXBhcnNlciAoPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWRvYy9vZG9jLXBhcnNlci9wdWxsLzExIj5vZG9jLXBh cnNlciMxMTwvYT4pDQo8L2xpPjxsaT5GaXggbGlnaHQgdGFibGUgcGFyc2luZyAoPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWRvYy9vZG9jLXBhcnNlci9wdWxsLzE0Ij5vZG9jLXBh cnNlciMxNDwvYT4pDQo8L2xpPjxsaT5BZGQgc3VwcG9ydCBmb3IgdGFibGVzIHRvIG9kb2MgKDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvODkzIj5vZG9jIzg5Mzwv YT4pDQo8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTg0MzNjNiIgY2xhc3M9Im91dGxpbmUtNCI+ DQo8aDQgaWQ9Im9yZzk4NDMzYzYiPkVkaXRpbmcgYW5kIFJlZmFjdG9yaW5nIENvZGU8L2g0Pg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzk4NDMzYzYiPjwvZGl2Pg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmcwNTkzNmU5Ij48L2E+PGI+W01lcmxp bl08L2I+IFN1cHBvcnQgZm9yIFByb2plY3QtV2lkZSBSZWZlcmVuY2VzIGluIE1lcmxpbjxicj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcwNTkzNmU5Ij4NCjxwPkNv bnRyaWJ1dG9yczogQHZvb2Rvb3MgKFRhcmlkZXMpIDwvcD4NCjxwPk91ciB3b3JrIG9uIE1lcmxp biBmb2N1c2VzIG9uIHRoZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc2Vh cmNoLWZvci1vY2N1cnJlbmNlcy1vZi1hLXN5bWJvbC1pbi1hLXByb2plY3QtZmlsZS11c2luZy1t ZXJsaW4tb2NhbWwtbHNwLzEwNzU2Lzc/dT10bWF0dGlvIj4NCmxvbmctc3RhbmRpbmc8L2E+IHBy b2plY3QgdG8gYWRkIHByb2plY3Qtd2lkZSBvY2N1cnJlbmNlcyBzdXBwb3J0IHRvIE1lcmxpbi4g SW4gQXByaWwsIHdlIGNvbnRpbnVlZCB0byB3b3JrIG9uIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTIxNDIiPmNvbXBpbGVyIHBhdGNoZXM8L2E+IHRo YXQgYWxsb3cgdG8gZ2VuZXJhdGUgdGhlIGluZGV4IGZyb20gdGhlIGNvbXBpbGVyLCBhbmQgd2Ug dXBkYXRlZCB0aGUgTWVybGluIHBhdGNoZXMgdG8gd29yayB3aXRoIHRoZSBjb21waWxlciBwYXRj aGVzLCBzaW1wbGlmeWluZyB0aGUgTWVybGluIGxvZ2ljIHRoYXQgY2FuIG5vdyByZWx5IG9uIHRo ZSBjb21waWxlci4NCjwvcD4NCjxwPlRoZSBmZWF0dXJlIHJlcXVpcmVzIHBhdGNoZXMgZm9yIHRo ZSBPQ2FtbCBjb21waWxlciwgRHVuZSwgYW5kIE1lcmxpbiB0aGF0IGFyZSBzdGlsbCB1bnJlbGVh c2VkLCBidXQgaWYgeW914oCZcmUgY291cmFnZW91cywgeW91IGNhbiBnaXZlIGl0IGEgdHJ5IGJ5 IGZvbGxvd2luZyB0aGUgZG9jdW1lbnRhdGlvbiBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL3Zvb2Rvb3MvbWVybGluLW9jY3VycmVuY2VzLXN3aXRjaCI+PGNvZGU+dm9vZG9vcy9tZXJs aW4tb2NjdXJyZW5jZXMtc3dpdGNoPC9jb2RlPjwvYT4uDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVz PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2UgYmFja3BvcnRlZCB0aGUgY29t cGlsZXItc2lkZS1pbmRleGF0aW9uIHRvIDQuMTQuIFdlIHBlcmZvcm1lZCBiZW5jaG1hcmtzIHRv IGV2YWx1YXRlIHRoZSBpbXBhY3Qgb24gYnVpbGQgdGltZSBhbmQgdGhlIHNpemUgb2YgdGhlIGlu c3RhbGxlZCB+Y210fnMuIFdlIHBvc3RlZCB0aGUgcmVzdWx0cyBvbiB0aGUgUFIsIGZvciBib3Ro IHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTIxNDIj aXNzdWVjb21tZW50LTE1MDQwMDYwOTMiPmJ1aWxkIHRpbWU8L2E+IGFuZA0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTIxNDIjaXNzdWVjb21tZW50LTE1MDU1 MzY0ODQiPmNtdHMgc2l6ZTwvYT4uDQo8L2xpPjxsaT5XZSBhbHNvIHJld29ya2VkIHRoZSBpdGVy YXRvciBwZXJmb3JtaW5nIGluZGV4YXRpb24gYW5kIGFkZGVkIG1vc3Qgb2YgdGhlIG1pc3Npbmcg Y2FzZXMgdG8gdGhlIGluZGV4ZXIuIEhvd2V2ZXIsIHNvbWUgZWxlbWVudHMgcmVtYWluIHVuaW5k ZXhlZCBkdWUgdG8gY29uc3RyYWludHMgd2l0aCB0aGUNCjxjb2RlPlR5cGVkdHJlZTwvY29kZT4u IDwvbGk+PGxpPldlIHVwZGF0ZWQgdGhlIOKAnGluZGV4aW5n4oCdIGV4dGVybmFsIHRvb2wgZm9s bG93aW5nIHBhcnRpYWwgaW5kZXhhdGlvbiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgY29tcGlsZXIu DQo8L2xpPjxsaT5XZSBhbHNvIHBvcnRlZCBuZXcgY29tcGlsZXIgY2hhbmdlcyB0byBNZXJsaW4g b24gdGhlIE9DYW1sIDUuMSBwcmV2aWV3LCB3aGljaCB3aWxsIGFsbG93IHVzIHRvIHdvcmsgb24g cHJvamVjdC13aWRlIG9jY3VycmVuY2VzIHN1cHBvcnQuDQo8L2xpPjxsaT5GaW5hbGx5LCB3ZSBz dGFydGVkIHJlZmFjdG9yaW5nIGFuZCBzaW1wbGlmeWluZyB0aGUgTWVybGluIHBhdGNoZXMgdG8g cXVlcnkgdGhlIGluZGV4IG5vdyB0aGF0IG1vcmUgd29yayBpcyBkb25lIGJ5IHRoZSBjb21waWxl ci4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzkzMDU4ZjgiPjwvYT48 Yj5bTWVybGluXTwvYj4gSW1wcm92aW5nIE1lcmxpbuKAmXMgUGVyZm9ybWFuY2U8YnI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnOTMwNThmOCI+DQo8cD5Db250cmli dXRlZCBieTogQHBpdGFnLWhhIChUYXJpZGVzKSA8L3A+DQo8cD5Gb2xsb3dpbmcgcmVwb3J0cyB0 aGF0IE1lcmxpbiBwZXJmb3JtYW5jZSBzY2FsZWQgcG9vcmx5IGluIGxhcmdlIGNvZGUgYmFzZXMs IHdlIGhhZCBiZWVuIHdvcmtpbmcgb24NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9waXRh Zy1oYS9tZXJsLWFuIj5NZXJsLWFuPC9hPiwgYSB0b29sIHRvIG1lYXN1cmUgdGhlIHBlcmZvcm1h bmNlIG9mIGRpZmZlcmVudCBNZXJsaW4gcmVxdWVzdHMuDQo8L3A+DQo8cD5JbiBNYXJjaCwgd2Ug d2VyZSBhYmxlIHRvIHVzZSBpdCB0byBpZGVudGlmeSB0aGUgbWFqb3IgcGVyZm9ybWFuY2UgYm90 dGxlbmVja3MsIHRoZSBiaWdnZXN0IG9uZSBiZWluZyB0aGUgUFBYIHBoYXNlLiBXZSBpbXBsZW1l bnRlZCBhDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTU4 NCI+Y2FjaGluZyBzdHJhdGVneSBmb3IgUFBYPC9hPiBhbmQgY29udGludWVkIHRvIHdvcmsgb24g aXQgdGhyb3VnaG91dCBBcHJpbC4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2Ugd29ya2VkIG9uIGZpeGluZyB0aGUgUFBYIGNhY2hl IGFuZCBleHBsb3JlZCBtZWNoYW5pc21zIHRvIHRvZ2dsZSB0aGUgUFBYIHBoYXNlIGNhY2hlLiBX ZSBlbmRlZCB1cCBpbXBsZW1lbnRpbmcgYQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL21lcmxpbi9wdWxsLzE1ODQvY29tbWl0cy9jNTRkMTA5MjdmMjhmOTYzNzJiZGIxYzVjNTBi NWU4Mzk5MDlhNTFlIj4NCmZsYWctYmFzZWQgYXBwcm9hY2g8L2E+LiA8L2xpPjxsaT5XZSA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1bGwvMTU4NC9jb21taXRzLzk5 YmJhNDAzYTFhOTQ2YzNhZmUzZDE1YzAyMTI4ZjQzMjE5MDQxMjkiPg0KYWRkZWQgc2l4IHRlc3Rz PC9hPiB0aGF0IGNvdmVyIGRlZmF1bHQgYmVoYXZpb3IsIGNhY2hlIGhpdHMsIGNhY2hlIGludmFs aWRhdGlvbiBvZiB0aHJlZSBraW5kcywgYW5kIGJlaGF2aW9yIGluIGNhc2Ugb2YgUFBYIGRlcGVu ZGVuY2llcy4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2I5OWY2NGIi PjwvYT48Yj5bT0NhbWwgTFNQXTwvYj4gVXNpbmcgRHVuZSBSUEMgb24gV2luZG93czxicj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdiOTlmNjRiIj4NCjxwPkNvbnRy aWJ1dG9yczogQG5vamIgKExleGlGaSkgPC9wPg0KPHA+SW4gRmVicnVhcnksIHdlIHJlbGVhc2Vk IER1bmUgMy43LjAgd2l0aCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9w dWxsLzcwMTAiPg0Kc3VwcG9ydCBmb3Igd2F0Y2ggbW9kZSBvbiBXaW5kb3dzPC9hPi4gQnVpbGRp bmcgb24gdGhpcyB3b3JrLCB0aGlzIG1vbnRoIHdlIGZpeGVkIGEgY291cGxlIG9mIGlzc3VlcyBp biBEdW5lIGFuZCBPQ2FtbCBMU1AgdG8gYWxsb3cgT0NhbWwgTFNQIHRvIHVzZSBEdW5lIFJQQy4g VGhpcyBhbGxvd3MgVlNDb2RlIHVzZXJzIHRvIGxldmVyYWdlIER1bmUgUlBDIGFuZCBnZXQgYnVp bGQgc3RhdHVzZXMgYW5kIG1vcmUgZXhoYXVzdGl2ZSBidWlsZCBlcnJvcnMNCiBpbiB0aGUgZWRp dG9yIHdoZW4gRHVuZSBpcyBydW5uaW5nIGluIHdhdGNoIG1vZGUuIFRoZSBmaXhlcyBhcmUgbm90 IHJlbGVhc2VkIHlldCwgYnV0IHRoZXkgd2lsbCBiZSBhdmFpbGFibGUgb24gdGhlIHVwY29taW5n IHJlbGVhc2VzIG9mIER1bmUgYW5kIE9DYW1sIExTUC4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM8 L2I+OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+V2UgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83NjY2Ij5tYWRlIGEgcGF0Y2g8L2E+IGluIER1bmUg dG8gdXNlIHRoZSBSUEMgcHJvdG9jb2wgb24gV2luZG93cy4NCjwvbGk+PGxpPldlIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1sc3AvcHVsbC8xMDc5Ij5maXhlZCBhIGJ1 ZzwvYT4gaW4gT0NhbWwtTFNQIHRvIGVuYWJsZSB0aGUgY29tbXVuaWNhdGlvbiB3aXRoIER1bmUg UlBDIG9uIFdpbmRvd3MuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcw MDdmMGMxIj48L2E+PGI+W09DYW1sIExTUF08L2I+IFVwc3RyZWFtaW5nIE9DYW1sIExTUOKAmXMg Rm9yayBvZiBNZXJsaW48YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQt b3JnMDA3ZjBjMSI+DQo8cD5Db250cmlidXRvcnM6IEB2b29kb29zIChUYXJpZGVzKSwgQDNSYWZh bCAoVGFyaWRlcykgPC9wPg0KPHA+V2XigJlyZSBhdCB0aGUgZmluaXNoIGxpbmUgb2Ygb3VyIGVm Zm9ydHMgdG8gY2xvc2UgdGhlIGdhcCBiZXR3ZWVuIE1lcmxpbiBhbmQgT0NhbWwgTFNQIGJ5IHVw c3RyZWFtaW5nIE9DYW1sIExTUOKAmXMgZm9yayBvZiBNZXJsaW4hIFRoaXMgbW9udGgsIHdlIGNv bnRpbnVlZCBvbiB0aGUgTWVybGluIFBSIHRoYXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9tZXJsaW4vcHVsbC8xNTg1Ij5hZGRzIGEgaG9vayB0byBPQ2FtbCBMU1AgbGV0dGlu ZyBpdCBydW4gc3lzdGVtIGNvbW1hbmRzPC9hPi4gV2UgYWxzbyBvcGVuZWQNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1sc3AvcHVsbC8xMDcwIj5hIFBSIG9uIDxjb2Rl Pm9jYW1sLWxzcDwvY29kZT48L2E+IHRvIHVzZSB0aGUgYWJvdmUgcGF0Y2ggYW5kIHJlbW92ZSBN ZXJsaW7igJlzIGZvcmsgZW50aXJlbHkuIFdl4oCZcmUgZXhwZWN0aW5nIHRvIHJlbGVhc2UgYSB2 ZXJzaW9uIG9mIE9DYW1sIExTUCB0aGF0IHVzZXMgTWVybGluIGFzIGEgbGlicmFyeSB2ZXJ5IHNv b24uDQo8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPldlIGRpc2N1c3NlZCBhbmQgcmV2aWV3ZWQgY2hhbmdlcyB0aGF0IGxldCB5b3UgY29u ZmlndXJlIHRoZSBwcm9jZXNzIHNwYXduIGZvciBQUFhzIHdoZW4gdXNpbmcgTWVybGluIGFzIGEg bGlicmFyeS4gVGhpcyBsZWQgdXMgdG8gaW1wbGVtZW50IGlkZWFzIGNvbmNlcm5pbmcgdGhlIGV4 cG9zZWQgaG9vayBmb3IgUFBYIHByb2Nlc3Mgc3Bhd25pbmcuIFN1YnNlcXVlbnRseSwgd2UNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vYmxvYi9tYXN0ZXIvc3JjL3V0 aWxzL2xpYl9jb25maWcubWxpI0wyMiI+DQpkb2N1bWVudGVkIHRoZSBjb21wbGV4aXRpZXM8L2E+ IG9mIHNwbGl0dGluZyBhIFBQWCBjb21tYW5kIGJldHdlZW4gcHJvZ3JhbSBhbmQgYXJndW1lbnRz Lg0KPC9saT48bGk+V2Ugb3BlbmVkIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC1sc3AvcHVsbC8xMDcwIj5hIFBSIG9uIDxjb2RlPg0Kb2NhbWwtbHNwPC9jb2RlPjwvYT4g dG8gcmVtb3ZlIE1lcmxpbuKAmXMgZm9yayBhbmQgdXNlIE1lcmxpbiBhcyBhIGxpYnJhcnkuIDwv bGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdmYTBkZmU5IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZmEwZGZl OSI+Rm9ybWF0dGluZyBDb2RlPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmdmYTBkZmU5Ij48L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0i b3JnN2MyZWQ1NCI+PC9hPjxiPltPQ2FtbEZvcm1hdF08L2I+IE1pZ3JhdGUgT0NhbWxGb3JtYXQg ZnJvbSBhbiBBU1QgdG8gYSBDU1Q8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnN2MyZWQ1NCI+DQo8cD5Db250cmlidXRvcnM6IEBncGV0aW90IChUYXJpZGVzKSwg QEVtaWxlVHJvdGlnbm9uIChUYXJpZGVzKSA8L3A+DQo8cD5CYWNrIGluIDIwMjIsIEB0cmVmaXMg YnVpbHQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RhcmlkZXMvb2NhbWxmb3JtYXQtbmci Pg0KYSBwcm90b3R5cGUgb2YgYSBuZXcgT0NhbWwgZm9ybWF0dGVyPC9hPiB0aGF0IHVzZXMgYSBD b25yZXRlIFN5bnRheCBUcmVlIChDU1QpIGluc3RlYWQgb2YgYW4gQWJzdHJhY3QgU3ludGF4IFRy ZWUgKEFTVCkuIFRoaXMgbW9kZSByZXRhaW5zIG1vcmUgaW5mb3JtYXRpb24gYW5kIHJlc3VsdHMg aW4gbW9yZSBhY2N1cmF0ZSBmb3JtYXR0aW5nIGluIGEgbG90IG9mIGNhc2VzLCBtb3N0IGVzcGVj aWFsbHkgd2hlbiBmb3JtYXR0aW5nIGNvbW1lbnRzIHdoaWNoDQogaXMgYSBiaWcgcGFpbiBwb2lu dCB3aXRoIE9DYW1sRm9ybWF0LiA8L3A+DQo8cD5TaW5jZSB0aGVuLCB3ZeKAmXZlIHdvcmtlZCBv biBtaWdyYXRpbmcgT0NhbWxGb3JtYXTigJlzIHN5bnRheCB0cmVlIHRvIHRoaXMgQ1NULiBXZSBj aG9zZSBub3QgdG8gbWlncmF0ZSBldmVyeXRoaW5nIGF0IG9uY2UgdG8gbWluaW1pemUgdGhlIGlt cGFjdCBvbiB1c2VycyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBtYWtpbmcgc3VyZSB0aGF0IHdlIG1h a2UgZm9ybWF0dGluZyBjaGFuZ2VzIG9ubHkgd2hlbiB0aGV5IGFyZSBidWcgZml4ZXMgb3IgY2xl YXINCiBpbXByb3ZlbWVudHMuIDwvcD4NCjxwPllvdSBjYW4gdHJhY2sgb3VyIHByb2dyZXNzIGlu IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQvcHVsbC8y MjEzIj4NCnRoaXMgUFI8L2E+LCB3aGljaCBzaG93cyBhIGRpZmYgb2YgdGhlIGN1cnJlbnQgc3lu dGF4IHRyZWUgYW5kIHRoZSB0YXJnZXQgQ1NULiA8L3A+DQo8cD48Yj5BY3Rpdml0aWVzOjwvYj4g PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPldlIG1hZGUgcHJvZ3Jlc3Mgb24gdGhlIHdv cmstaW4tcHJvZ3Jlc3MgUFIgdG8gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBw eC9vY2FtbGZvcm1hdC9wdWxsLzIzMzIiPg0KcHJlc2VydmUgY29tbWVudHMgYXR0YWNoZWQgdG8g bGFiZWxsZWQgYXJnczwvYT4sIGZpeGluZyBtb3JlIHJlZ3Jlc3Npb25zLiA8L2xpPjxsaT5XZSBp bXBsZW1lbnRlZCBhIGNoYW5nZSB0byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt cHB4L29jYW1sZm9ybWF0L3B1bGwvMjM0MyI+DQprZWVwIGxpdGVyYWwgY2hhciB2YWx1ZSBkdXJp bmcgcGFyc2luZzwvYT4uIDwvbGk+PGxpPldlIHdvcmtlZCBvbiA8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMjM0NSI+cHJlc2VydmluZyB0aGUg ZnVuY3RvciBjb25jcmV0ZSBzeW50YXggaW4gdGhlIFBhcnNldHJlZTwvYT4uDQo8L2xpPjxsaT5X ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwv MjM1MCI+bm9ybWFsaXplZCBmdW5jdGlvbnMgaW4gdGhlIHBhcnNlcjwvYT4uDQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdhMzM4MzRiIj48L2E+PGI+W09DYW1sRm9ybWF0 XTwvYj4gQ2xvc2luZyB0aGUgR2FwIEJldHdlZW4gT0NhbWxGb3JtYXQgYW5kDQo8Y29kZT5vY3At aW5kZW50PC9jb2RlPjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1v cmdhMzM4MzRiIj4NCjxwPkNvbnRyaWJ1dG9yczogQGdwZXRpb3QgKFRhcmlkZXMpLCBARW1pbGVU cm90aWdub24gKFRhcmlkZXMpLCBASnVsb3cgKFRhcmlkZXMpIDwvcD4NCjxwPlRoZSBPQ2FtbEZv cm1hdCB0ZWFtIGhhcyBiZWVuIHdvcmtpbmcgd2l0aCB0aGUgSmFuZSBTdHJlZXQgdGVhbXMgdG8g bWlncmF0ZSBKYW5lIFN0cmVldOKAmXMgY29kZSBiYXNlIGZyb20gb2NwLWluZGVudCB0byBPQ2Ft bEZvcm1hdC4gQXMgYSByZXN1bHQsIHdl4oCZdmUgbWFkZSB0b25zIG9mIGNoYW5nZXMgdG8gdGhl DQo8Y29kZT5qYW5lc3RyZWV0PC9jb2RlPiBwcm9maWxlIGluIHJlY2VudCBtb250aHMuIFBlcmhh cHMgbW9zdCBub3RhYmx5LCB0aGlzIHdvcmsgaGFzIGFsbG93ZWQgdXMgdG8gaWRlbnRpZnkgaXNz dWVzIHRoYXQgd2VyZSBub3Qgc3BlY2lmaWMgdG8gdGhlDQo8Y29kZT5qYW5lc3RyZWV0PC9jb2Rl PiBwcm9maWxlLCBhbmQgY29uc2VxdWVudGx5IHdl4oCZdmUgYmVlbiBmaXhpbmcgYnVncyBhbmQg aW1wbGVtZW50aW5nIGZvcm1hdHRpbmcgaW1wcm92ZW1lbnRzIGFjcm9zcyB0aGUgYm9hcmQuDQo8 L3A+DQo8cD5XZeKAmXJlIG5lYXJpbmcgdGhlIGVuZCBvZiB0aGlzIHByb2plY3QsIGJ1dCBBcHJp bCBoYXMgc2VlbiBhIGxvdCBvZiBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0aGF0IHdlIGRl dGFpbCBiZWxvdy4NCjwvcD4NCjxwPjxiPkFjdGl2aXRpZXM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+V2UgYWRqdXN0ZWQgdGhlIGluZGVudGF0aW9uIGZvciBzZXZlcmFsIGxh bmd1YWdlIGZlYXR1cmVzLCBpbmNsdWRpbmcgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29j YW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzMzAiPg0KZXh0ZW5zaW9uczwvYT4sIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQvcHVsbC8yMzI4Ij5jbGFz cy1leHByIGZ1bmN0aW9uIGJvZGllczwvYT4sIGFuZA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzMjMiPm1vZHVsZS1leHByIGV4dGVuc2lv bnM8L2E+Lg0KPC9saT48bGk+V2UgZml4ZWQgaXNzdWVzIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzMjEiPg0Kb2NwLWluZGVudCBj b21wYXRpYmlsaXR5PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJv L29jcC1pbmRlbnQvcHVsbC8zMjQiPg0KTGV0IHZzIExldEluIGRldGVjdGlvbiBhZnRlciDigJlz dHJ1Y3TigJk8L2E+LiA8L2xpPjxsaT5XZSBpbXByb3ZlZCB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzMjIiPg0KZm9ybWF0dGluZyBv ZiBtb2R1bGUgYXJndW1lbnRzPC9hPiBhbmQgd29ya2VkIG9uIDxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQvcHVsbC8yMzMyIj4NCnByZXNlcnZpbmcgY29t bWVudHMgYXR0YWNoZWQgdG8gbGFiZWxsZWQgYXJnczwvYT4uIDwvbGk+PGxpPldlIGZpeGVkIGlz c3VlcyBjYXVzaW5nIGNoYW5nZXMgdG8gdGhlIEFTVCBkdWUgdG8gc3RyaW5ncyBpbiA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMjMzOCI+DQpj b2RlIGJsb2NrczwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgv b2NhbWxmb3JtYXQvcHVsbC8yMzQ0Ij4NCmNvbW1lbnRzPC9hPi4gPC9saT48bGk+V2UgaW1wcm92 ZWQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxmb3JtYXQv cHVsbC8yMzQ5Ij4NCmZvcm1hdHRpbmcgb2YgY2luYXBzIGNvbW1lbnRzIHdpdGggc3RyaW5nczwv YT4gYW5kIHdvcmtlZCBvbiBwYXJzaW5nIGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtcHB4L29jYW1sZm9ybWF0L3B1bGwvMjM1NCI+DQpub3JtYWxpemluZyBjaW5hcHMgY29t bWVudHM8L2E+LiA8L2xpPjxsaT5XZSBtYWRlIGFkanVzdG1lbnRzIHRvIHRoZSBoYW5kbGluZyBv ZiBjZXJ0YWluIGxhbmd1YWdlIGNvbnN0cnVjdHMsIHN1Y2ggYXMgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzNTIiPg0KcHJvdGVjdGluZyBt YXRjaCBhZnRlciA8Y29kZT5mdW4gXyA6IF8gLSZndDs8L2NvZGU+PC9hPiBhbmQgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9vY2FtbGZvcm1hdC9wdWxsLzIzNDciPg0KY29u c2lzdGVudGx5IHdyYXBwaW5nICg6Oik8L2E+LiA8L2xpPjxsaT5XZSBleHRlbmRlZCBvdXIgdGVz dCBzdWl0ZSB3aXRoIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvb2NhbWxm b3JtYXQvcHVsbC8yMzU1Ij4NCm51bXN0YXQgYW5kIGEgc2luZ2xlIHJ1biBvZiBvY3AtaW5kZW50 PC9hPi4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNyI+RWlvIERldmVsb3BlciBNZWV0aW5nczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvZWlvLWRldmVsb3Blci1tZWV0aW5ncy8xMjIwNy8xIj4NCmh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9laW8tZGV2ZWxvcGVyLW1lZXRpbmdzLzEyMjA3LzE8L2E+IDwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNWQ0Y2M1ZCIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzVkNGNjNWQiPlN1ZGhhIFBhcmltYWxhIGFubm91bmNl ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNWQ0Y2M1ZCI+ DQo8cD5IaSBhbGwhIFdl4oCZdmUgc3RhcnRlZCBoYXZpbmcgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLW11bHRpY29yZS9laW8iPg0KRWlvPC9hPiBkZXZlbG9wZXIgbWVldGluZ3Mg b25saW5lLCBvbmNlIGV2ZXJ5IHR3byB3ZWVrcy4gVGhlIG1lZXRpbmcgaXMgb3BlbiB0byBldmVy eW9uZS4gVGhvc2UgaW50ZXJlc3RlZCB0byBmb2xsb3cgRWlv4oCZcyBkZXZlbG9wbWVudHMgYXJl IHdlbGNvbWUgdG8gam9pbi4NCjwvcD4NCjxwPjxiPkFnZW5kYTwvYj4gPC9wPg0KPHA+VGhlIG1l ZXRpbmdzIGFyZSBmb3IgcGxhbm5pbmcgdGhlIGRldmVsb3BtZW50IG9mIEVpby4gVGhlIGN1cnJl bnQgc3RhdHVzIGFuZCBwbGFucyBmb3IgRWlvIDEuMCBhcmUgYmVpbmcgdHJhY2tlZCBhdA0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vaXNzdWVzLzM4OCI+ RWlvIzM4ODwvYT4uIDwvcD4NCjxwPldl4oCZcmUgYWxzbyBlYWdlciB0byBoZWFyIGZlZWRiYWNr IG9uIEVpbyBmcm9tIHVzZXJzLCBhbmQgdGhlaXIgZXhwZXJpZW5jZSBvZiBtaWdyYXRpbmcgYXBw bGljYXRpb25zIHRvIEVpby4gVGhpcyB3aWxsIGdyZWF0bHkgaGVscCB1cyB0byBtYWtlIHRoZSBl eHBlcmllbmNlIG1vcmUgcGxlYXNhbnQgYW5kIGNsb3NlIGdhcHMsIGlmIGFueS4gSWYgeW914oCZ cmUgbG9va2luZyB0byBnZXQgc3RhcnRlZCwgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwtbXVsdGljb3JlL2VpbyNyZWFkbWUiPlJFQURNRTwvYT4gaXMgYSBnb29kIHBsYWNl IHRvIHN0YXJ0Lg0KPC9wPg0KPHA+PGI+VGltaW5nczwvYj4gPC9wPg0KPHA+VGhlIG1lZXRpbmcg dGFrZXMgcGxhY2Ugb24gYWx0ZXJuYXRlIE1vbmRheXMsIGF0IDEwOjAwIFVLLiA8L3A+DQo8dWwg Y2xhc3M9Im9yZy11bCI+DQo8bGk+TmV4dCBtZWV0aW5nOiBKdW5lIDUsIE1vbmRheSA8L2xpPjxs aT5UaW1lOiAxMDowMCBBTSAtIDExOjAwIEFNIEJTVCAoOTowMCBBTSAtIDEwOjAwIEFNIFVUQykg PC9saT48bGk+TGluayB0byBtZWV0aW5nOiA8YSBocmVmPSJodHRwOi8vbWVldC5nb29nbGUuY29t L2J5by1kZml6LWRvdSI+bWVldC5nb29nbGUuY29tL2J5by1kZml6LWRvdTwvYT4NCjwvbGk+PGxp Pk1lZXRpbmcgbm90ZXM6IDxhIGhyZWY9Imh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50 L2QvMVpCZmJqQWt2RWt2OWxkdW1wWlY1VlhyRWNfSHBQZVlqSFBXX1Rpd0plNFEvIj4NCmh0dHBz Oi8vZG9jcy5nb29nbGUuY29tL2RvY3VtZW50L2QvMVpCZmJqQWt2RWt2OWxkdW1wWlY1VlhyRWNf SHBQZVlqSFBXX1Rpd0plNFEvPC9hPg0KPC9saT48bGk+VXNlIHRoaXMgY2FsZW5kYXIgbGluayB0 byBhZGQgaXQgdG8geW91ciBjYWxlbmRhciAtIDxhIGhyZWY9Imh0dHBzOi8vY2FsZW5kYXIuZ29v Z2xlLmNvbS9jYWxlbmRhci91LzQ/Y2lkPVkxOWlNREE1WkRBNE1EZzBZekl3WVdNek1EUTROakpo TjJGa1pXSmlZamRtT1RVME5HSXhZekV3TW1VME1ETXlNVEF6TURGaVkyWmhZamN3TURCbU1qTmxR R2R5YjNWd0xtTmhiR1Z1WkdGeUxtZHZiMmRzWlM1amIyMCI+DQpFaW8gRGV2ZWxvcGVyIE1lZXRp bmdzPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+TmV3IG1ham9y IHJlbGVhc2Ugb2YgUGFyYW55ICh2MTQuMC4wKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvbmV3LW1ham9yLXJlbGVhc2Utb2YtcGFyYW55LXYxNC0wLTAvMTIyMDgvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbmV3LW1ham9yLXJlbGVhc2Utb2YtcGFyYW55 LXYxNC0wLTAvMTIyMDgvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdhYTY1NTRjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYWE2NTU0YyI+ VW5peEp1bmtpZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZ2FhNjU1NGMiPg0KPHByZSBjbGFzcz0iZXhhbXBsZSIgaWQ9Im9yZzdhZjNhYjQi Pg0KIyBvcGFtIHNlYXJjaCBwYXJhbnkNClsuLi5dDQpwYXJhbnkgMTQuMC4wICAgICAgUGFyYWxs ZWxpemUgYW55IGNvbXB1dGF0aW9uDQo8L3ByZT4NCjxwPkkgc3dpdGNoZWQgYmFjayB0aGUgcnVu dGltZSB0byBmb3JrJiM0MzttYXJzaGFsLiBBcyB3YXMgdGhlIGNhc2UgYmVmb3JlIHZlcnNpb24g MTMuMC4wLiBWZXJzaW9ucyAxMy4qICh1cCB0byAxNC4wLjAgZXhjbHVkZWQpIHVzZSBvY2FtbDUt dGhyZWFkcyB0byBwYXJhbGxlbGl6ZSBjb21wdXRhdGlvbnMuDQo8L3A+DQo8cD48YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vVW5peEp1bmtpZS9wYXJhbnkiPmh0dHBzOi8vZ2l0aHViLmNvbS9V bml4SnVua2llL3BhcmFueTwvYT4NCjwvcD4NCjxwPlRoZXJlIGlzIGEgYnJhbmNoIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9Vbml4SnVua2llL3BhcmFueS90cmVlL29jYW1sNV90aHJlYWRz Ij4NCmh0dHBzOi8vZ2l0aHViLmNvbS9Vbml4SnVua2llL3BhcmFueS90cmVlL29jYW1sNV90aHJl YWRzPC9hPiBpZiBhbnlib2R5IHdhbnRzIHRvIG1haW50YWluIHRoaXMgYmFja2VuZC4NCjwvcD4N CjxwPlRoZSBQYXJhbnkuUGFybWFwIG1vZHVsZSBoYXMgbmV3IGZ1bmN0aW9ucyBmb3IgYXJyYXlz OiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vVW5peEp1bmtpZS9wYXJhbnkvYmxvYi9tYXN0 ZXIvc3JjL3BhcmFueS5tbGkiPg0KaHR0cHM6Ly9naXRodWIuY29tL1VuaXhKdW5raWUvcGFyYW55 L2Jsb2IvbWFzdGVyL3NyYy9wYXJhbnkubWxpPC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyMmUxNjdiIiBjbGFzcz0ib3V0bGlu ZS0yIj4NCjxoMiBpZD0ib3JnMjJlMTY3YiI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtb3JnMjJlMTY3YiI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1p c3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5p cXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlv dSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9h Pi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5 IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcv bGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFz cz0iYXV0aG9ybmFtZSIgaWQ9Im9yZzZmMzgxNjAiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 16 May 2023 14:06:22 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 16 May 2023 14:06:22 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 16 May 2023 14:06:22 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34GD5b5b016969 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 16 May 2023 14:05:37 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34GD5Osx016946 for ; Tue, 16 May 2023 14:05:24 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 May 2023 15:05:22 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id D6B96E731E; Tue, 16 May 2023 15:05:21 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id F0605E0298 for ; Tue, 16 May 2023 15:05:13 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 May 2023 15:05:12 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1D06B564773; Tue, 16 May 2023 15:05:10 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZh/c2D4stwyGEhUSq6RiDAtVFZg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 16 May 2023 14:05:09 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 3012183e-abe3-482f-5141-08db560e58f1 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.99,278,1677538800"; d="scan'208,217";a="56221866" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.478102, queueID=7A554564774 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <22B9EB1476D80C4EAE02B5F8AD94EAFF@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNS0xNiBUdWUgMTU6MDQgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDUuMDkuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNS4yMy5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1heSAwOSB0byAxNiwgMjAyMy4gPC9wPg0K PGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxlIG9m IENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRv Yy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5SZW5kZXJpbmcgUmVhY3QgaW4gT0NhbWw8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5BaHJlZnMgaXMgSGlyaW5nPC9hPiA8L2xpPjxsaT48 YSBocmVmPSIjMyI+dG14OiBJbXBvcnQgMkQgZ2FtZSBtYXBzIHdpdGggZWFzZTwvYT4gPC9saT48 bGk+PGEgaHJlZj0iIzQiPkJyciAwLjAuNSwgdGhlIFdlYkdQVSBlZGl0aW9uPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjNSI+QSBiZXN0aWFyeSBvZiBHQURUIGV4YW1wbGVzPzwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzYiPk9wZW4tc291cmNlIHRvb2wgdG8gbWFrZSBhIHN0YXRpYyBibG9nIGluIE9D YW1sPzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzciPkJFUiBNZXRhT0NhbWwgTjExNCwgZm9yIE9D YW1sIDQuMTQuMTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPkJ1aWxkaW5nIGlPUyBhcHBzIHdp dGggT0NhbWw/PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+QSBNaW5pbWFsIFByb3RvdHlwZSBv ZiBJbi1QYWNrYWdlIFNlYXJjaCBpcyBvbiBzdGFnaW5nLm9jYW1sLm9yZzwvYT4NCjwvbGk+PGxp PjxhIGhyZWY9IiMxMCI+TmV3IHJlbGVhc2Ugb2YgRml4ICgyMDIzMDUwNSk8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiMxMSI+UUNoZWNrIDAuMjE8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc4YTUx ZWIxIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPlJlbmRlcmlu ZyBSZWFjdCBpbiBPQ2FtbDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXJlbmRlcmluZy1yZWFjdC1pbi1vY2FtbC8xMjEzMy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tcmVuZGVyaW5nLXJlYWN0LWluLW9jYW1sLzEyMTMzLzE8L2E+IDwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMDc1N2FkMCIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzA3NTdhZDAiPkRhdmlkIFNhbmNobyBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzA3NTdhZDAiPg0KPHA+ SGVyZSBpcyA8Y29kZT5zZXJ2ZXItcmVhc29uLXJlYWN0PC9jb2RlPiwgdGhlIE9DYW1sIGltcGxl bWVudGF0aW9uIG9mIFJlYWN0IEkgaGF2ZSBiZWVuIHdvcmtpbmcgb246DQo8YSBocmVmPSJodHRw czovL3NhbmNoby5kZXYvYmxvZy9zZXJ2ZXItc2lkZS1yZW5kZXJpbmctcmVhY3QtaW4tb2NhbWwi Pmh0dHBzOi8vc2FuY2hvLmRldi9ibG9nL3NlcnZlci1zaWRlLXJlbmRlcmluZy1yZWFjdC1pbi1v Y2FtbDwvYT4NCjwvcD4NCjxwPlRoZSBibG9nIHBvc3QgaXMgdGFyZ2V0ZWQgZm9yIGEgRnJvbnRl bmQvSlMgZGV2LCBidXQgSSBiZWxpZXZlIGl0IGNhbiBiZSBpbnRlcmVzdGluZyBmcm9tIHRoZSBP Q2FtbCBzaXRlIGFzIHdlbGwuDQo8L3A+DQo8cD48Y29kZT5zZXJ2ZXItcmVhc29uLXJlYWN0PC9j b2RlPiBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiA8Y29kZT5yZWFjdC1kb20vc2VydmVyPC9jb2Rl PiBhbmQgc29tZSBvZiBSZWFjdOKAmXMgaW50ZXJuYWxzIGluIE9DYW1sLiBUaGUgcHVycG9zZSBp cyB0byByZW5kZXIgSFRNTCBtYXJrdXAgZnJvbSB0aGUgc2VydmVyIGZvciBhIFJlYXNvbiBSZWFj dCBhcHBsaWNhdGlvbiBuYXRpdmVseS4NCjwvcD4NCjxkaXYgaWQ9Im9yZzkwZmFjZGYiIGNsYXNz PSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29t L2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC9mL2ZhMzU0NGUzY2U5MzNkZWQ3 MzVhYzllNzdjNTcwY2ZmM2YxODcwZjVfMl8xMzgweDgxNC5qcGVnIiBhbHQ9ImZhMzU0NGUzY2U5 MzNkZWQ3MzVhYzllNzdjNTcwY2ZmM2YxODcwZjVfMl8xMzgweDgxNC5qcGVnIj4NCjwvcD4NCjwv ZGl2Pg0KPHA+SXQgc3VwcG9ydHMgaHlkcmF0aW9uIChyZW5kZXJUb1N0cmluZykgYW5kIGZ1bGwg cmVuZGVyIChyZW5kZXJUb1N0YXRpY01hcmt1cCkgYW5kIG1vc3QgdW5pdCB0ZXN0cyBmcm9tIFJl YWN0RE9NU2VydmVyIGFyZSBtaWdyYXRlZCBhcyB3ZWxsLiBCYXNpY2FsbHksIHRvIGVuc3VyZSBo eWRyYXRpb24g4oCcaGFja3PigJ0gd29yayB0aGUgc2FtZSB3YXkgYXMgcmVhY3TigJlzIERPTSAo aW4gSmF2YVNjcmlwdCkuDQo8L3A+DQo8cD5JdOKAmXMgb2J2aW91c2x5IGZhc3QsIHRhbGtpbmcg YWJvdXQgcmVxL3M6IHgxMCBhZ2FpbnN0IE5vZGUgYW5kIHg2IGFnYWluc3QgQnVuIG9uIHRoZSBz YW1lIGNvZGViYXNlLiBQZXJmb3JtYW5jZSBpcyBub3QgdGhlIHByaW9yaXR5LCB0aG91Z2guIEkg ZGlkIDAgcGVyZiB3b3JrIGJ1dCBpcyBjb29sLiBJZiB5b3Ugd2FudCB0byBoZWxwIG1ha2luZyBp dCB2ZXJ5IGZhc3QsIGxldCBtZSBrbm93IQ0KPC9wPg0KPHA+VGhlIHByaW9yaXR5IGlzIHRvIGlt cGxlbWVudCBzdHJlYW1pbmcgYW5kIGxhdGVyIFJTQy4gQ2Fu4oCZdCB3YWl0IHRvIHRyeSBPQ2Ft bCBtdWx0aWNvcmUgd2l0aCBTZXJ2ZXIgY29tcG9uZW50cy4NCjwvcD4NCjxwPkFsbCBvZiB0aGlz IGlzIHRoYW5rcyB0byBNZWxhbmdlLCBhbmQgSeKAmW0gZ3JhdGVmdWwgdG8gd29yayB3aXRoIDxh IGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vX2FubW9udGVpcm8iPg0KQF9hbm1vbnRlaXJvPC9h PiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly90d2l0dGVyLmNvbS9qYXZpZXJ3Y2hhdmFycmkiPkBqYXZp ZXJ3Y2hhdmFycmk8L2E+Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPkFocmVm cyBpcyBIaXJpbmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FocmVm cy1pcy1oaXJpbmcvMTIxMzYvMSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FocmVmcy1p cy1oaXJpbmcvMTIxMzYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnOWJhYTNiMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzliYWEzYjIi PmJlbm1vbm9wb2xpIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnOWJhYTNiMiI+DQo8cD5BcyBhbHdheXMgaGVyZSBhdCBBaHJlZnMgd2XigJly ZSBvbiB0aGUgbG9va291dCBmb3IgT0NhbWwgZGV2cy4gPC9wPg0KPHA+V2UgYXJlIGhlYWRxdWFy dGVyZWQgaW4gU2luZ2Fwb3JlIGJ1dCBvdXIgdGVhbSBpcyBkb3R0ZWQgYWxsIG92ZXIgdGhlIHBs YWNlIHNvIHdl4oCZcmUgb3BlbiB0byByZW1vdGUgdG9vLg0KPC9wPg0KPHA+Q2hlY2sgb3V0IG91 ciBwb3N0aW5nIDxhIGhyZWY9Imh0dHBzOi8vYWhyZWZzLmNvbS9qb2JzL29jYW1sLWRldmVsb3Bl ciI+aGVyZTwvYT4NCjwvcD4NCjxwPkZlZWwgZnJlZSB0byByZWFjaCBvdXQgZm9yIG1vcmUgaW5m by4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzJl MWMzZWEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcyZTFjM2VhIj5Mb3VpcyBSb2No w6kgdGhlbiBhZGRlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnMmUxYzNlYSI+DQo8cD5UbyB0cnkgdG8gZ2l2ZSBzb21lIGNvbnRleHQgYXMgdGhlIGpvYiBw b3N0IG9uIHRoZSB3ZWJzaXRlIGlzIHByZXR0eSBkcnkgPC9wPg0KPHA+QWhyZWZzIGlzIGhlYXZp bHkgaW52ZXN0ZWQgaW4gTWVsYW5nZSB0byBjb21waWxlIG9jYW1sIHRvIGphdmFzY3JpcHQuIFdp dGggaXQgdGhlIGNvbXBhbnkgaXMgYWxzbyBwdXR0aW5nIHJlc291cmNlcyB0byBtYWludGFpbiB0 aGUgcHJvamVjdHMgcmVsYXRlZCB0byByZWFzb25tbC4gU29tZSByZWNlbnQgcG9zdHMgZnJvbSBA amNoYXZhcnJpIGFuZCBAZGF2ZXNueDoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWhyZWZzLWlzLW5vdy1idWlsdC13 aXRoLW1lbGFuZ2UvMTIxMDciPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9haHJlZnMtaXMt bm93LWJ1aWx0LXdpdGgtbWVsYW5nZS8xMjEwNzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVuZGVyaW5nLXJlYWN0LWluLW9jYW1sLzEyMTMz Ij5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbmRlcmluZy1yZWFjdC1pbi1vY2Ft bC8xMjEzMzwvYT4NCjwvbGk+PC91bD4NCjxwPkEgYnVuY2ggb2YgY29tbW9ubHkgdXNlZCBsaWJy YXJpZXMgdGhhdCB5b3UgcHJvYmFibHkgaGF2ZSBoZWFyZCBhYm91dCBhcmUgbWFpbnRhaW5lZCBi eSBhaHJlZnMgb3Igd2l0aCB0aGUgaGVscCBvZiBhaHJlZnMNCjwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZCI+aHR0cHM6 Ly9naXRodWIuY29tL2FocmVmcy9hdGQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9haHJlZnMvb2NhbWwtc29kaXVtIj5odHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL29j YW1sLXNvZGl1bTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXZl c254L3N0eWxlZC1wcHgiPmh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlc254L3N0eWxlZC1wcHg8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20veWdyZWsvb2NhbWwtZXh0bGli Ij5odHRwczovL2dpdGh1Yi5jb20veWdyZWsvb2NhbWwtZXh0bGliPC9hPg0KPC9saT48L3VsPg0K PHA+VGhlcmXigJlzIG1vcmUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2FocmVmcyI+ aHR0cHM6Ly9naXRodWIuY29tL2FocmVmczwvYT4NCjwvcD4NCjxwPldoZW4gbm90IG1haW50YWlu aW5nIHdlIHRyeSB0byBjb250cmlidXRlLiBPbmUgZXhhbXBsZSBpcyA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtbHNwLyI+DQpvY2FtbC1sc3A8L2E+IDwvcD4NCjxwPldl IGFyZSBhbHNvIHNwb25zb3JpbmcgcHJvamVjdHM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb3dsYmFybi9vd2wiPmh0dHBzOi8vZ2l0 aHViLmNvbS9vd2xiYXJuL293bDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ha2FiZS5n aXRodWIuaW8vb2NhbWwtanVweXRlci8iPmh0dHBzOi8vYWthYmUuZ2l0aHViLmlvL29jYW1sLWp1 cHl0ZXIvPC9hPg0KPC9saT48L3VsPg0KPHA+Q29uZmVyZW5jZXM6IDwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2ljZnAyMy5zaWdwbGFuLm9yZy8iPmh0dHBz Oi8vaWNmcDIzLnNpZ3BsYW4ub3JnLzwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9wb3Bs MjMuc2lncGxhbi5vcmcvIj5odHRwczovL3BvcGwyMy5zaWdwbGFuLm9yZy88L2E+IDwvbGk+PC91 bD4NCjxwPihhbHNvIHRoZSByZWFzb25tbCBjb25mZXJlbmNlcyBpbiB0aGUgcGFzdCkgPC9wPg0K PHA+QW5kIGxhc3QgYnV0IG5vdCBsZWFzdCB0aGUgT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbiA8 YSBocmVmPSJodHRwczovL29jYW1sLXNmLm9yZy8iPg0KaHR0cHM6Ly9vY2FtbC1zZi5vcmcvPC9h PiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+dG14OiBJbXBvcnQgMkQgZ2FtZSBt YXBzIHdpdGggZWFzZTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXRteC1pbXBvcnQtMmQtZ2FtZS1tYXBzLXdpdGgtZWFzZS8xMjEzOC8xIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tdG14LWltcG9ydC0yZC1nYW1lLW1hcHMtd2l0aC1lYXNlLzEy MTM4LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTgy NTBlYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U4MjUwZWIiPmZpc2h5ZnJpZW5k IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn ZTgyNTBlYiI+DQo8cD48Y29kZT50bXg8L2NvZGU+IGlzIGFuIE9DYW1sIGxpYnJhcnkgZm9yIHJl YWRpbmcgZGF0YSBmaWxlcyBmcm9tIHRoZSAyRCBnYW1lIG1hcCBlZGl0b3INCjxhIGhyZWY9Imh0 dHA6Ly9tYXBlZGl0b3Iub3JnIj5UaWxlZDwvYT4uIDwvcD4NCjxwPlRoZSBsaWJyYXJ5IGFpbXMg Zm9yIGJyb2FkIGNvdmVyYWdlIG9mIFRpbGVk4oCZcyA8YSBocmVmPSJodHRwczovL2RvYy5tYXBl ZGl0b3Iub3JnL2VuL3N0YWJsZS9yZWZlcmVuY2UvdG14LW1hcC1mb3JtYXQvIyI+DQpUTVggZmls ZSBmb3JtYXRzPC9hPi4gSXQgcHJvdmlkZXMgYW4gaW1wZXJhdGl2ZSBjb250ZXh0IGZvciBsb2Fk aW5nIFRNWCBkYXRhIGZpbGVzIGFuZCBhIGNvbGxlY3Rpb24gb2YgaW1tdXRhYmxlIHR5cGVzIGNv cnJlc3BvbmRpbmcgdG8gVE1YIGRhdGEgc3RydWN0dXJlcy4NCjwvcD4NCjxwPjxjb2RlPnRteDwv Y29kZT4gZW11bGF0ZXMgdGhlIHNlbWFudGljcyBvZiBUTVggZGF0YSBzdHJ1Y3R1cmVzIGFzIHRo ZXkgZXhpc3QgaW4gdGhlIFRpbGVkIGRlc2t0b3AgYXBwbGljYXRpb24sIGluY2x1ZGluZyBwcm9w ZXIgYXBwbGljYXRpb24gb2YNCjxhIGhyZWY9Imh0dHBzOi8vZG9jLm1hcGVkaXRvci5vcmcvZW4v c3RhYmxlL21hbnVhbC9jdXN0b20tcHJvcGVydGllcy8iPmN1c3RvbSBwcm9wZXJ0eTwvYT4gaW5o ZXJpdGFuY2UgYW5kDQo8YSBocmVmPSJodHRwczovL2RvYy5tYXBlZGl0b3Iub3JnL2VuL3N0YWJs ZS9yZWZlcmVuY2UvdG14LW1hcC1mb3JtYXQvI3RlbXBsYXRlLWZpbGVzIj4NCm9iamVjdCB0ZW1w bGF0ZXM8L2E+LiBUaGlzIGFsbG93cyB0aGUgYXR0cmlidXRlcyBvZiBnYW1lIHJlc291cmNlcyBp biBPQ2FtbCB0byBtYXRjaCBleGFjdGx5IHdoYXQgaXMgb2JzZXJ2ZWQgaW4gdGhlIGVkaXRvci4N CjwvcD4NCjxwPkNoZWNrIG91dCB0aGUgPGEgaHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vZmlzaHlm cmllbmQvdG14Ij5wcm9qZWN0IHBhZ2U8L2E+IGZvciBtb3JlLg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjQiPkJyciAwLjAuNSwgdGhlIFdlYkdQVSBlZGl0aW9uPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYnJyLTAtMC01LXRoZS13ZWJncHUtZWRp dGlvbi8xMjE0MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYnJyLTAtMC01 LXRoZS13ZWJncHUtZWRpdGlvbi8xMjE0MS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzA4ZjhlYmEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmcwOGY4ZWJhIj5EYW5pZWwgQsO8bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzA4ZjhlYmEiPg0KPHA+VGhlcmXigJlzIGEgbmV3IHJl bGVhc2Ugb2YgQnJyLiBCcnIgaXMgYW4gSVNDIGxpY2VuY2VkIHRvb2xraXQgZm9yIHByb2dyYW1t aW5nIGJyb3dzZXJzIHdpdGggdGhlIGpzX29mX29jYW1sIGNvbXBpbGVyLg0KPC9wPg0KPHA+VGhl IGhpZ2hsaWdodCBvZiB0aGlzIHJlbGVhc2UgaXMgc3VwcG9ydCBmb3IgdGhlIG5ldyA8YSBocmVm PSJodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvV2ViR1BV X0FQSSI+DQpXZWJHUFUgQVBJPC9hPiB0aGF0IGlzIGdyYWR1YWxseSBiZWluZyByb2xsZWQgb3V0 IGluIGJyb3dzZXJzLiBZb3UgY2FuIGZpbmQgaXQgaW4gdGhlDQo8YSBocmVmPSJodHRwczovL2Vy cmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jL0Jycl93ZWJncHUvR3B1L2luZGV4Lmh0bWwiPjxj b2RlPkJycl93ZWJncHUuR3B1PC9jb2RlPjwvYT4gbW9kdWxlIOKAkyB0aGUgYmluZGluZyBpcyBs YXJnZSBhbmQgaGFzIGJlZW4gbGl0dGxlIHRlc3RlZCBzbyBmYXIsIGVhcmx5IGFkb3B0ZXJzIG1h eSBydW4gaW50byBnbGl0Y2hlcy4gQnV0IHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2RidWVuemxpL2Jyci9ibG9iL21hc3Rlci90ZXN0L3Rlc3RfZ3B1Lm1sIj4yNTAgbGluZXMgZXhh bXBsZTwvYT4gdG8gcmVuZGVyIHRoZSB1c3VhbCB0cmlhbmdsZSB3b3Jrcy4NCjwvcD4NCjxwPlRo ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYnJyL2Jsb2IvbWFzdGVyL0NI QU5HRVMubWQjdjAwNS0yMDIzLTA1LTEwLWxhLWZvcmNsYXotdnMiPg0KcmVsZWFzZSBub3Rlczwv YT4gaGF2ZSB0aGUgb3RoZXIgY2hhbmdlcy4gPC9wPg0KPHA+VGhlIFdlYkdQVSBiaW5kaW5nIHdv cmsgd2FzIHN1cHBvcnRlZCBieSBhIGdyYW50IGZyb20gdGhlIDxhIGhyZWY9Imh0dHA6Ly9vY2Ft bC1zZi5vcmcvIj4NCk9DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb248L2E+LiBBIGJpZyB0aGFuayB0 byBteSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvZGJ1ZW56bGkiPg0KZG9u YXRvcnM8L2E+IGFzd2VsbCwgSSB3ZWxjb21lIGFuZCB0aGFuayBhIG5ldyBwcml2YXRlIGRvbmF0 b3IuIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Ib21lcGFnZTogPGEgaHJlZj0iaHR0 cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyIj5odHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0 d2FyZS9icnI8L2E+DQo8L2xpPjxsaT5Eb2NzOiA8YSBocmVmPSJodHRwczovL2VycmF0aXF1ZS5j aC9zb2Z0d2FyZS9icnIvZG9jIj5odHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9j PC9hPiAob3INCjxjb2RlPm9kaWcgZG9jIGJycjwvY29kZT4pIDwvbGk+PGxpPkluc3RhbGw6IDxj b2RlPm9wYW0gaW5zdGFsbCBicnI8L2NvZGU+IChvbmNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yMzc3NCI+DQp0aGlzIFBSPC9hPiBoYXMg YmVlbiBtZXJnZWQpIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5BIGJl c3RpYXJ5IG9mIEdBRFQgZXhhbXBsZXM/PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hLWJlc3RpYXJ5LW9mLWdhZHQtZXhhbXBsZXMvMTIxNDMvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYS1iZXN0aWFyeS1vZi1nYWR0LWV4YW1wbGVzLzEyMTQzLzE8L2E+ IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjJjNjI3ZSIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2IyYzYyN2UiPkNoZXQgTXVydGh5IGFza2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdiMmM2MjdlIj4NCjxw PklzIHRoZXJlIHNvbWVwbGFjZSBhIGJlc3RpYXJ5IG9mIEdBRFQgZXhhbXBsZXMgPyBJ4oCZZCBs aWtlIHRvIGZpbmQgc3VjaCBhIHRoaW5nIGluIG9yZGVyIHRvIG1vcmUtZnVsbHkgdW5kZXJzdGFu ZCB0aGUgdW5pdmVyc2Ugb2YgcG9zc2liaWxpdGllcyBmb3IgdXNpbmcgR0FEVHMgaW4gcHJvZ3Jh bW1pbmcuIEnigJl2ZSBuZXZlciB1c2VkIOKAmWVtLCBhbmQgd2hpbGUsIHN1cmUsIHJlYWRpbmcg YWJvdXQgdGhlIHRoZW9yeSBpcyBncmVhdCwgYW5kIHJlYWRpbmcNCiBhIGZldyBleGFtcGxlIGlz IGNvb2wsIGl0IHdvdWxkIGJlIGNvbXBsZW1lbnRhcnkgdG8gaGF2ZSBhIGJvdHRvbS11cCB1bmRl cnN0YW5kaW5nIChsb3RzIG9mIGV4YW1wbGVzKSBhcyB3ZWxsIGFzIGEgdG9wLWRvd24gb25lLg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2FhNjVi NjQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhYTY1YjY0Ij5ZYXdhciBBbWluIHJl cGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2FhNjVi NjQiPg0KPHA+V2UgZG8gc2VlbSB0byBoYXZlIGEgaG9tZS1ncm93biDigJlHQURU4oCZLWlhcnk6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNvdXJjZS1wcm9qZWN0 cy11c2luZy1nYWR0cy85NjQwIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNv dXJjZS1wcm9qZWN0cy11c2luZy1nYWR0cy85NjQwPC9hPiA8L3A+DQo8cD5BIGNvdXBsZSBvZiBu ZXcgYW5kIGludGVyZXN0aW5nIG9uZXMgc2luY2UgdGhhdCB0aHJlYWQ6IDwvcD4NCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXBldHJvbC0xLTAtMC1hLWhpZ2gtbGV2ZWwtdHlwZWQtc3FsLWFwaS1mb3Itb2NhbWwtZGVzaWdu ZWQtdG8tZ28tZmFzdC8xMTE2NiI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wZXRy b2wtMS0wLTAtYS1oaWdoLWxldmVsLXR5cGVkLXNxbC1hcGktZm9yLW9jYW1sLWRlc2lnbmVkLXRv LWdvLWZhc3QvMTExNjY8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v eWF3YXJhbWluL29jYW1sX3NxbF9xdWVyeS9ibG9iLzA1MTZlYTZjN2Q4MGE2ZmNmNjFjNGQ5YmE1 NTFiOWYwYjc4MGQ5ZmYvbGliL3NxbC5tbCNMMjEiPmh0dHBzOi8vZ2l0aHViLmNvbS95YXdhcmFt aW4vb2NhbWxfc3FsX3F1ZXJ5L2Jsb2IvMDUxNmVhNmM3ZDgwYTZmY2Y2MWM0ZDliYTU1MWI5ZjBi NzgwZDlmZi9saWIvc3FsLm1sI0wyMTwvYT4gYnkgeW91cnMgdHJ1bHkgdG8gbW9kZWwg4oCZYQ0K IHF1ZXJ5IGNhbiByZXR1cm4gZWl0aGVyIG5vdGhpbmcgb3Igc29tZSByZXN1bHRzZXTigJkgPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Zl ZGFhODciIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmZWRhYTg3Ij5LaXJhbiBHb3Bp bmF0aGFuIGFsc28gcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnZmVkYWE4NyI+DQo8cD5JIGhhdmVu4oCZdCBnb3Qgcm91bmQgdG8gcHJvcGVybHkg cHVibGljaXNpbmcgaXQsIGJ1dCBJIGFjdHVhbGx5IHdyb3RlIGJsb2cgcG9zdCBhYm91dCB0aGUg aW50ZXJuYWwgZGV2ZWxvcG1lbnQgcHJvY2VzcyBvZiBQZXRyb2wsIGFuZCBob3cgSSBncmFkdWFs bHkgbW92ZWQgZnJvbSBDYXF0aSwgdG8gbWFjcm9zLCB0byBHQURUcyB3aGljaCBtYXkgYmUgdXNl ZnVsOg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9nb3BpYW5kY29kZS51ay9sb2dzL2xvZy13 YXlzLW9mLXNxbC1pbi1vY2FtbC5odG1sIj5odHRwczovL2dvcGlhbmRjb2RlLnVrL2xvZ3MvbG9n LXdheXMtb2Ytc3FsLWluLW9jYW1sLmh0bWw8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZjJkMmE1NyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZ2YyZDJhNTciPkFybWFlbCBhbHNvIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2YyZDJhNTciPg0KPHA+Tm90IGV4YWN0bHkgZXhh bXBsZXMgb2YgR0FEVHMg4oCcaW4gdGhlIHdpbGTigJ0sIGJ1dCBJ4oCZdmUgZm91bmQgQHlhbGxv cCDigJlzIHNsaWRlcyAoZnJvbSB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vd3d3LmNsLmNhbS5hYy51 ay90ZWFjaGluZy8xNjE3L0wyOC9tYXRlcmlhbHMuaHRtbCI+QWR2YW5jZWQgRnVuY3Rpb25hbCBQ cm9ncmFtbWluZyBjb3Vyc2UgYXQgQ2FtYnJpZGdlPC9hPikgdG8gYmUgaW50ZXJlc3RpbmcgZm9y IHNlZWluZyDigJxHQURUIGRlc2lnbiBwYXR0ZXJuc+KAnToNCjxhIGhyZWY9Imh0dHBzOi8vd3d3 LmNsLmNhbS5hYy51ay90ZWFjaGluZy8xNjE3L0wyOC9sZWN0dXJlLTgtc2xpZGVzLnBkZiI+aHR0 cHM6Ly93d3cuY2wuY2FtLmFjLnVrL3RlYWNoaW5nLzE2MTcvTDI4L2xlY3R1cmUtOC1zbGlkZXMu cGRmPC9hPiAsDQo8YSBocmVmPSJodHRwczovL3d3dy5jbC5jYW0uYWMudWsvdGVhY2hpbmcvMTYx Ny9MMjgvbGVjdHVyZS05YS1zbGlkZXMucGRmIj5odHRwczovL3d3dy5jbC5jYW0uYWMudWsvdGVh Y2hpbmcvMTYxNy9MMjgvbGVjdHVyZS05YS1zbGlkZXMucGRmPC9hPi4gKEkgaG9wZSBpdCBpcyBP SyB0byBsaW5rIHRob3NlIGhlcmUhKQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2UxMzRmYjAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdlMTM0ZmIwIj5HYcOrdGFuIEdpbGJlcnQgYWxzbyByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdlMTM0ZmIwIj4NCjxwPldlIHVzZSBhIGxvdCBv ZiBHQURUcyBpbiBDb3EgRm9yIGluc3RhbmNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9j b3EvY29xL2Jsb2IvMTQ5NDZlYjBjYmNlMDljMWE2M2QzNmFhYzIxY2NiMTE2MWZiZDg2OS9wbHVn aW5zL2x0YWMyL3RhYzJmZmkubWwjTDE2LUwxOCI+DQpodHRwczovL2dpdGh1Yi5jb20vY29xL2Nv cS9ibG9iLzE0OTQ2ZWIwY2JjZTA5YzFhNjNkMzZhYWMyMWNjYjExNjFmYmQ4NjkvcGx1Z2lucy9s dGFjMi90YWMyZmZpLm1sI0wxNi1MMTg8L2E+IHVzZWQgdG8gaGF2ZSBhcmJpdHJhcnktYXJpdHkg ZnVuY3Rpb25zIFNsaWdodGx5IHNpbXBsaWZpZWQ6DQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3Jj LWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlwZTwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+KCdhcmcsJ3Jlc3VsdCwnZikgYXJpdHk8L3NwYW4+ID0NCiAgfCA8 c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5P bmU8L3NwYW4+IDogKCdhcmcsICdyZXN1bHQsICdhcmcgLSZndDsgJ3Jlc3VsdCkgYXJpdHkNCiAg fCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5Nb3JlPC9zcGFuPiA6ICgnYXJnLCAncmVzdWx0LCAnZikgYXJpdHkgLSZndDsgKCdhcmcsICdy ZXN1bHQsICdhcmcgLSZndDsgJ2YpIGFyaXR5DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0 NDRmY2Y7Ij4oJ2FyZywgJ3Jlc3VsdCkgbmFyeTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6 ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5OYXJ5PC9zcGFuPiA6ICgnYXJn LCAncmVzdWx0LCAnZikgYXJpdHkgKiAnZiAtJmd0OyAoJ2FyZywgJ3Jlc3VsdCkgbmFyeQ0KDQo8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlwZTwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+dmFsdWU8L3NwYW4+ID0NCiAgfCA8c3Bh biBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5DbG9z dXJlPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+b2Y8L3NwYW4+ICh2YWx1ZSwgdmFsdWUpIG5hcnkNCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6 ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lSW50PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+b2Y8L3NwYW4+IGlu dA0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0 PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij50b19uYXJ5PC9zcGFuPiA9IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW5jdGlvbjwv c3Bhbj4NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5DbG9zdXJlPC9zcGFuPiBmIC0mZ3Q7IGYNCiAgfCA8c3BhbiBzdHlsZT0iY29s b3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lSW50PC9zcGFuPiBf IC0mZ3Q7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzU1NzQwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5m YWlsd2l0aDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7Y2FuJ3Qg YXBwbHkgc29tZWludCZxdW90Ozwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPnJlYzwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA3YTlmOyI+YXBwbHk8L3NwYW4+IDo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij4gPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij50eXBl PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPiBmLiAodmFsdWUsdmFsdWUsZikg YXJpdHkgLSZndDsgZiAtJmd0OyB2YWx1ZSBsaXN0IC0mZ3Q7IHZhbHVlIDwvc3Bhbj49DQogIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmFyaXR5PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5mPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5h cmdzPC9zcGFuPiAtJmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bWF0Y2g8L3NwYW4+IGFyZ3MsIGFyaXR5IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw NmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij53aXRoPC9zcGFuPg0KICB8IDxzcGFuIHN0eWxlPSJj b2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPltdPC9zcGFuPiwgXyAt Jmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5DbG9zdXJlPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZmNmN2VmOyI+TmFyeTwvc3Bhbj4gKGFyaXR5LCBmKSkNCiAgfCBbYXJnXSwg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+ T25lPC9zcGFuPiAtJmd0OyBmIGFyZw0KICB8IGFyZyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij46Ojwvc3Bhbj4gYXJncywgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+TW9yZTwvc3Bh bj4gYXJpdHkgLSZndDsgYXBwbHkgYXJpdHkgKGYgYXJnKSBhcmdzDQogIHwgYXJnIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPjo6PC9zcGFu PiBhcmdzLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNm Y2Y3ZWY7Ij5PbmU8L3NwYW4+IC0mZ3Q7DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+Zjwvc3Bhbj4gPSBmIGFyZyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQy NTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+TmFyeTwvc3Bhbj4gKDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwN2E5ZjsiPmFyaXR5PC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+Zjwvc3Bhbj4pID0gdG9fbmFyeSBmIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICBhcHBseSBhcml0eSBmIGFyZ3MNCg0K PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bh bj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+YXBwbHlfdmFsPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5mPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5hcmdzPC9zcGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFj a2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPk5hcnk8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5hcml0eTwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmY8 L3NwYW4+KSA9IHRvX25hcnkgZiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+aW48L3NwYW4+DQogIGFwcGx5IGFyaXR5IGYgYXJncw0KDQo8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5hZGRmPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDdhOWY7Ij54PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij55PC9zcGFuPiA9 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5tYXRjaDwv c3Bhbj4geCwgeSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+d2l0aDwvc3Bhbj4NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91 bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lSW50PC9zcGFuPiB4LCA8c3BhbiBzdHlsZT0iY29sb3I6 ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lSW50PC9zcGFuPiB5IC0m Z3Q7IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPlNvbWVJbnQ8L3NwYW4+ICh4ICYjNDM7IHkpDQogIHwgXyAtJmd0OyA8c3BhbiBzdHlsZT0i Y29sb3I6ICM1NTc0MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZmFpbHdpdGg8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2FkZGYgZ290IG5vbi1pbnRzJnF1b3Q7PC9z cGFuPg0KDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hZGR2YWw8L3NwYW4+ID0N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2Vm OyI+Q2xvc3VyZTwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPk5hcnk8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Nb3JlPC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5PbmU8L3NwYW4+LCBh ZGRmKSkNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+YWRkdmFsJzwvc3Bhbj4g PQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5DbG9zdXJlPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZmNmN2VmOyI+TmFyeTwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0 MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPk9uZTwvc3Bhbj4sIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwN2E5ZjsiPng8L3NwYW4+IC0mZ3Q7IDxzcGFuIHN0eWxlPSJjb2xvcjog IzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkNsb3N1cmU8L3NwYW4+ICg8c3Bh biBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5OYXJ5 PC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+T25lPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdl aWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+eTwv c3Bhbj4gLSZndDsgYWRkZiB4IHkpKSkpDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+ICgpID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmFzc2VydDwvc3Bhbj4NCiAgKGFwcGx5X3ZhbCBh ZGR2YWwgWzxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2Zj ZjdlZjsiPlNvbWVJbnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8L3Nw YW4+OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5Tb21lSW50PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4yPC9zcGFu Pl0gPQ0KICAgYXBwbHlfdmFsIGFkZHZhbCcgWzxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsg YmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPlNvbWVJbnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwODI0ZjsiPjE8L3NwYW4+OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5Tb21lSW50PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij4yPC9zcGFuPl0pDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+ICgpID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmFzc2VydDwvc3Bhbj4NCiAgKGFwcGx5X3ZhbCBh ZGR2YWwgWzxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2Zj ZjdlZjsiPlNvbWVJbnQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjE8L3Nw YW4+OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3 ZWY7Ij5Tb21lSW50PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4yPC9zcGFu Pl0gPQ0KICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+U29tZUludDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+Mzwv c3Bhbj4pDQo8L3ByZT4NCjwvZGl2Pg0KPHA+T3IgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2NvcS9jb3EvYmxvYi8xNDk0NmViMGNiY2UwOWMxYTYzZDM2YWFjMjFjY2IxMTYxZmJkODY5L2Vu Z2luZS9ldmQubWwjTDIwOC1MMjMwIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9jb3EvY29xL2Jsb2Iv MTQ5NDZlYjBjYmNlMDljMWE2M2QzNmFhYzIxY2NiMTE2MWZiZDg2OS9lbmdpbmUvZXZkLm1sI0wy MDgtTDIzMDwvYT4gYSByZWNvcmQgd2hlcmUgc29tZSBmaWVsZHMgYXJlIG5vbnRyaXZpYWwgaWYg YW5kIG9ubHkgaWYgc29tZSBvdGhlciBmaWVsZCBpcyBub250cml2aWFsDQo8L3A+DQo8cD5vciBh cm91bmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NvcS9jb3EvYmxvYi8xNDk0NmViMGNi Y2UwOWMxYTYzZDM2YWFjMjFjY2IxMTYxZmJkODY5L2dyYW1saWIvZ3JhbW1hci5tbCNMMjAxIj4N Cmh0dHBzOi8vZ2l0aHViLmNvbS9jb3EvY29xL2Jsb2IvMTQ5NDZlYjBjYmNlMDljMWE2M2QzNmFh YzIxY2NiMTE2MWZiZDg2OS9ncmFtbGliL2dyYW1tYXIubWwjTDIwMTwvYT4gd2hpY2ggcmVwbGFj ZWQgc29tZSBPYmoubWFnaWMgaW4gdGhlIGNhbWxwNSBlbmdpbmUgdGhpcyBmaWxlIGlzIGRlcml2 ZWQgZnJvbS4NCjwvcD4NCjxwPkkgZ3Vlc3MgeW91IGNhbiBmaW5kIG1vcmUgYnkgbG9va2luZyBh dCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2VhcmNoP3E9cmVwbyUzQWNvcSUyRmNvcSYj NDM7R0FEVCZhbXA7dHlwZT1jb21taXRzIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9zZWFyY2g/cT1y ZXBvJTNBY29xJTJGY29xJiM0MztHQURUJmFtcDt0eXBlPWNvbW1pdHM8L2E+IDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwNDUzMDgxIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMDQ1MzA4MSI+QW50b24gQmFjaGluIGFsc28gcmVwbGll ZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMDQ1MzA4MSI+ DQo8cD48Y29kZT4nYSBMd3QudDwvY29kZT4gcHJvbWlzZSBzdGF0ZXMgYW5kIHNldmVyYWwgb3Ro ZXIgdHlwZXMgaW4gTHd0IGFyZSBpbnRlcm5hbGx5IEdBRFRzLiBTZWUNCjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9ibG9iL2NjMDVlMmJkYTZjMzQxMjZhM2ZkOGQxNTBl ZTdjZGRiM2I4YTQ0MGIvc3JjL2NvcmUvbHd0Lm1sI0wzMjEtTDM0MCI+DQpodHRwczovL2dpdGh1 Yi5jb20vb2NzaWdlbi9sd3QvYmxvYi9jYzA1ZTJiZGE2YzM0MTI2YTNmZDhkMTUwZWU3Y2RkYjNi OGE0NDBiL3NyYy9jb3JlL2x3dC5tbCNMMzIxLUwzNDA8L2E+LiBUaGlzIGlzIG1haW5seSB0byB1 c2UgdGhlIGV4aXN0ZW50aWFsIHR5cGVzIGNhcGFiaWxpdHkgb2YgR0FEVHMuDQo8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzhmYzZiMyIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc4ZmM2YjMiPkNhbGFzY2liZXR0YSBSb21haW4gYWxz byByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3 OGZjNmIzIj4NCjxwPllvdSBjYW4gYWxzbyBjaGVjayBhIHByb3RvY29sIGltcGxlbWVudGF0aW9u IHdpdGggR0FEVCBoZXJlICh3aGljaCBwcm92ZXMgdGhhdCBhIGNsaWVudCBzaG91bGQgbmV2ZXIg c2VuZCBzb21ldGhpbmcgdG8gYW5vdGhlciBjbGllbnQpOg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9ib2IvYmxvYi9tYWluL2xpYi9zdGF0ZS5tbCI+aHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9ib2IvYmxvYi9tYWluL2xpYi9zdGF0ZS5tbDwvYT4uIEEgZGV0YWls bGVkIGFydGljbGUgaXMgYXZhaWxhYmxlIGhlcmU6DQo8YSBocmVmPSJodHRwczovL2Jsb2cub3Nh dS5yZS9hcnRpY2xlcy9nYWR0X2FuZF9zdGF0ZV9tYWNoaW5lLmh0bWwiPmh0dHBzOi8vYmxvZy5v c2F1LnJlL2FydGljbGVzL2dhZHRfYW5kX3N0YXRlX21hY2hpbmUuaHRtbDwvYT4NCjwvcD4NCjxw PkFsc28sIEkgcmUtaW1wbGVtZW50ZWQgYSA8Y29kZT5wcmludGY8L2NvZGU+IGZ1bmN0aW9uIHdp dGggYSA8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj4NCnByb21vdGlvbjwvc3Bhbj4gbWVjaGFuaXNt IG9mIGNlcnRhaW5zIHZhbHVlcyAow6AgbGEgQykgaGVyZTogPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL21pcmFnZS9jb25hbi9ibG9iL21haW4vc3JjL2ZtdC5tbCI+DQpodHRwczovL2dpdGh1 Yi5jb20vbWlyYWdlL2NvbmFuL2Jsb2IvbWFpbi9zcmMvZm10Lm1sPC9hPi4gWW91IGNhbiBhbHNv IGNoZWNrIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZGVjaXNpb24gdHJlZSB3aGljaCBoZWxw cyB1cyB0byByZWdvZ25pemUgTUlNRSB0eXBlLCBpdOKAmXMgYSBHQURUIHRvbzoNCjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvY29uYW4vYmxvYi9tYWluL3NyYy90cmVlLm1sI0wx MCI+aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9jb25hbi9ibG9iL21haW4vc3JjL3RyZWUubWwj TDEwPC9hPi4NCjwvcD4NCjxwPkZpbmFsbHksIHlvdSBjYW4gY2hlY2sgdGhpcyB0eXBlZCBsYW1i ZGEgY2FsY3VsdXM6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWxh bWJkYS9ibG9iL2E4OWIyNjViNTUyZjhiNjNmZjcyNWZjOTQyZjQxYTI3NmZhYmI0ZjUvc3JjL3R5 cGVkdHJlZS5tbCNMNDM2Ij4NCmh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLWxhbWJk YS9ibG9iL2E4OWIyNjViNTUyZjhiNjNmZjcyNWZjOTQyZjQxYTI3NmZhYmI0ZjUvc3JjL3R5cGVk dHJlZS5tbCNMNDM2PC9hPiBhbmQgdGhlIHRyYW5zZm9ybWF0aW9uIGZyb20gYSBzaW1wbGUgbGFt YmRhLWNhbGN1bHVzIHdpdGggYSB0eXBlZCBvbmUgKGFuZCB3aGVyZSB3ZSBwcm92ZSB0aGF0IHZh cmlhYmxlcyBhcmUgYm91bmRzIHZpYSB0aGUgRGUtQnJ1aWpuIGluZGljZSkuDQo8L3A+DQo8cD5F RElUOiBBaCBhbmQgcHJvYmFibHkgdGhlIG1vc3QgY29tcGxpY2F0ZWQgR0FEVCBJIGV2ZXIgc2Vl IHdoaWNoIGhhcyBhIHJlYWwgYXBwbGljYXRpb24sDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vT2N0YWNocm9uL2NvZGVwdC9ibG9iL21hc3Rlci9saWIvemlwcGVyX2RlZi5tbCI+YSB6aXBw ZXIgb24gYW4gQVNUIHdoZXJlIHRoZQ0KPHNwYW4gY2xhc3M9InVuZGVybGluZSI+cGF0aDwvc3Bh bj4gaXMgYSBHQURUPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZ2Y2ODFhODMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdmNjgx YTgzIj5FbWlsZSBUcm90aWdub24gYWxzbyByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmNjgxYTgzIj4NCjxwPk1lbmhpciBnZW5lcmF0ZXMgY29k ZSB3aXRoIGdhZHRzIHVzaW5nIHRoZSBtZXRob2QgZGVzY3JpYmVkIGluIDxhIGhyZWY9Imh0dHA6 Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9wdWJsaXMvZnBvdHRpZXItcmVnaXMtZ2lhbmFz LXR5cGVkLWxyLnBkZiI+DQp0aGlzIHBhcGVyPC9hPiA8L3A+DQo8cD5JbiB0aGF0IGNhc2UsIHRo ZSBzcGVjaWZpYyB0ZWNobmlxdWUgdXNlZCBpcyBBRFRzIHdpdGhvdXQgYWxsb2NhdGlvbiwgb2Yg d2hpY2ggYSBtb3JlIHNpbXBsZSBleGFtcGxlIGlzIHRoZSBmb2xsb3dpbmcgOg0KPC9wPg0KPGRp diBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5cGU8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPidhIG51bWJlcjwvc3Bhbj4gPQ0KICB8 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsi PkZsb2F0PC9zcGFuPiA6IGZsb2F0IG51bWJlcg0KICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0 MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkludDwvc3Bhbj4gOiBpbnQgbnVtYmVy DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnNob3dfbnVtYmVyPC9zcGFuPiA6 PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+IDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dHlwZTwvc3Bhbj48c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij4gbi4gbiBudW1iZXIgLSZndDsgbiAtJmd0OyBzdHJpbmcgPC9zcGFuPj0N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwv c3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+d2l0bmVzczwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bjwvc3Bhbj4gLSZndDsNCiAgICA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bWF0Y2g8L3NwYW4+IHdpdG5lc3Mg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPndpdGg8L3Nw YW4+DQogICAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5GbG9hdDwvc3Bhbj4gLSZndDsgc3RyaW5nX29mX2Zsb2F0IG4NCiAgICB8IDxz cGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPklu dDwvc3Bhbj4gLSZndDsgc3RyaW5nX29mX2ludCBuDQo8L3ByZT4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVkNzUyYjciIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc1ZDc1MmI3Ij56YXBhc2hjYW5vbiBhbHNvIHJlcGxpZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVkNzUyYjciPg0KPHA+ SW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1scHJvL293aSI+b3dpPC9hPiwgdG8g YWxsb3cgdGhlIHVzZXIgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL09DYW1sUHJvL293aS90 cmVlL21haW4vZXhhbXBsZSN1c2luZy1hbmQtZGVmaW5pbmctZXh0ZXJuYWwtZnVuY3Rpb25zLWhv c3QtZnVuY3Rpb25zIj4NCnRvIGRlZmluZSBob3N0IGZ1bmN0aW9uczwvYT4gdXNhYmxlIGZyb20g V2FzbSwgd2UgYWxzbyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vT0NhbWxQcm8vb3dpL2Js b2IvbWFpbi9zcmMvdmFsdWUubWwjTDEtTDEwNCI+DQp1c2UgR0FEVHM8L2E+LiA8L3A+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTZmYWI0NiIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U2ZmFiNDYiPkplYW4gQ2hyaXN0b3BoZSBGaWxsaWF0 cmUgYWxzbyByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmdlNmZhYjQ2Ij4NCjxwPkFydGh1ciBXZW5kbGluZyAoVGFyaWRlcykgaGFzIGFuIGltcGxl bWVudGF0aW9uIG9mIEthcGxhbi9UYXJqYW4gOTkgKFB1cmVseSBGdW5jdGlvbmFsLCBSZWFsLVRp bWUgRGVxdWVzIHdpdGggQ2F0ZW5hdGlvbiksIHdoaWNoIG1ha2VzIGEgbm9uLXRyaXZpYWwgdXNl IG9mIE9DYW1s4oCZcyBHQURULiBTZWUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hcnQt dy9kZXF1ZSI+aHR0cHM6Ly9naXRodWIuY29tL2FydC13L2RlcXVlPC9hPiA8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iNiI+T3Blbi1zb3VyY2UgdG9vbCB0byBtYWtlIGEgc3RhdGljIGJs b2cgaW4gT0NhbWw/PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02 Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVu LXNvdXJjZS10b29sLXRvLW1ha2UtYS1zdGF0aWMtYmxvZy1pbi1vY2FtbC8xMTk2Ny84Ij4NCmh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGVuLXNvdXJjZS10b29sLXRvLW1ha2UtYS1zdGF0 aWMtYmxvZy1pbi1vY2FtbC8xMTk2Ny84PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmdiMjJhNGM4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn YjIyYTRjOCI+ZGVlcCBpbiB0aGlzIHRocmVhZCwgcm9kZHkgc2FpZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjIyYTRjOCI+DQo8cD5NeSB0b29sIDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yb2RkeXlhZ2EvZmluY2giPmZpbmNoPC9hPiBtZWV0cyBt b3N0IG9mIHRoZXNlIHJlcXVpcmVtZW50cy4gSSB0aGluayBpdCBpcyBtdWNoIG1vcmUgSHVnby9K ZWt5bGwtbGlrZSB0aGFuIFlPQ2FtbCBvciBTb3VwYXVsdC4gSXQgc2hvdWxkIGJlIGVhc3kgZm9y IHlvdSB0byBhZGQgYW55IGZlYXR1cmVzIHlvdSBuZWVkLCBpdOKAmXMgJmx0OzYwMCBsaW5lcyBv ZiBzdHJhaWdodGZvcndhcmQNCiBPQ2FtbC4gPC9wPg0KPHA+VHdvIGV4YW1wbGVzIG9mIGl0cyB1 c2UgYXJlIDxhIGhyZWY9Imh0dHBzOi8vcm9kZHl5YWdhLmdpdGh1Yi5pby9maW5jaC8iPml0cyBk b2N1bWVudGF0aW9uPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vcm9kZHltYWNzd2Vlbi5jby51 ayI+bXkgbWVhZ3JlIHdlYnNpdGU8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i NyI+QkVSIE1ldGFPQ2FtbCBOMTE0LCBmb3IgT0NhbWwgNC4xNC4xPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8yMDIzLTA1L21zZzAwMDA5Lmh0 bWwiPg0KaHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjMtMDUv bXNnMDAwMDkuaHRtbDwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc2YTEzOGI4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNmExMzhiOCI+T2xl ZyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzZhMTM4YjgiPg0KPHA+QkVSIE1ldGFPQ2FtbCBOMTE0IGlzIGEgc3RyaWN0IHN1cGVyc2V0IG9m IE9DYW1sIDQuMTQuMSBmb3IgYGB3cml0aW5nIHByb2dyYW1zIHRoYXQgZ2VuZXJhdGUgcHJvZ3Jh bXPigJnigJkuIEJFUiBNZXRhT0NhbWwgYWRkcyB0byBPQ2FtbCB0aGUgdHlwZSBvZiBjb2RlIHZh bHVlcyAoZGVub3RpbmcgYGBwcm9ncmFtIGNvZGXigJnigJksIG9yIGZ1dHVyZS1zdGFnZSBjb21w dXRhdGlvbnMpLCBhbmQgdHdvIGJhc2ljIGNvbnN0cnVjdHMgdG8gYnVpbGQgdGhlbToNCiBxdW90 aW5nIGFuZCBzcGxpY2luZy4gVGhlIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSBwcmludGVkLCBzdG9y ZWQgaW4gYSBmaWxlIOKAkyBvciBjb21waWxlZCBhbmQgbGlua2VkLWJhY2sgdG8gdGhlIHJ1bm5p bmcgcHJvZ3JhbSwgdGh1cyBpbXBsZW1lbnRpbmcgcnVuLXRpbWUgY29kZSBvcHRpbWl6YXRpb24u IEEgc3Vic2V0IG9mIHRoZSBnZW5lcmF0ZWQgT0NhbWwgY29kZSBjYW4gYWxzbyBiZSBjb252ZXJ0 ZWQgdG8gQywgdmlhIG9mZnNob3JpbmcuIChUaGUNCiBnZW5lcmF0ZWQgQyBuZWVkcyBubyBwYXJ0 aWN1bGFyIHJ1bnRpbWUgb3IgR0MuKSBBIHdlbGwtdHlwZWQgQkVSIE1ldGFPQ2FtbCBwcm9ncmFt IGdlbmVyYXRlcyBvbmx5IHdlbGwtc2NvcGVkIGFuZCB3ZWxsLXR5cGVkIHByb2dyYW1zOiBUaGUg Z2VuZXJhdGVkIGNvZGUgc2hhbGwgY29tcGlsZSB3aXRob3V0IHR5cGUgZXJyb3JzLiBTdGFnaW5n LWFubm90YXRpb27igJNmcmVlIEJFUiBNZXRhT0NhbWwgaXMgaWRlbnRpY2FsIHRvIE9DYW1sOyBC RVIgTWV0YU9DYW1sDQogY2FuIGxpbmsgdG8gYW55IE9DYW1sLWNvbXBpbGVkIGxpYnJhcnkgKGFu ZCB2aWNlIHZlcnNhKS4gPC9wPg0KPHA+VGhlIG1haW4gY2hhbmdlcyBpbiB2ZXJzaW9uIE4xMTQg YXJlIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5zbW9vdGhpbmcgdGhlIHBhdGggZm9y IHRoZSBwb3NzaWJsZSBmdXR1cmUgaW50ZWdyYXRpb24gaW50byBPQ2FtbDsgPC9saT48bGk+c3Rh cnRpbmcgYW5kIGFsbW9zdCBmaW5pc2hpbmcgdGhlIGNvbXBsZXRlIHNvbHV0aW9uIHRvIHRoZSBs b25nLXN0YW5kaW5nIENTUCBwcm9ibGVtOw0KPC9saT48bGk+Y29tcGxldGUgc3VwcG9ydCBmb3Ig b2Zmc2hvcmluZyA8L2xpPjwvdWw+DQo8cD5UaGUgcHJvYmxlbXMgb2Ygc3ludGF4IGFyZSBzYWlk IHRvIGNvbW1hbmQgdGhlIG1vc3QgZGlzY3Vzc2lvbi4gVGhpcyBtZXNzYWdlIGlzIG5vIGV4Y2Vw dGlvbi4gSW4gTWV0YU9DYW1sLCBjb2RlIHRvIGJlIGdlbmVyYXRlZCBpcyBlbmNsb3NlZCBpbiBi cmFja2V0czogLiZsdDsxICYjNDM7IDImZ3Q7LiAod2hpY2ggbWF5IGNvbnRhaW4gYGhvbGVz4oCZ LCB0byBiZSBmaWxsZWQgd2l0aCBjb2RlOiBmdW4gaCAtJmd0OyAuJmx0OzEgJiM0MzsgLn5oJmd0 Oy4gd2hlcmUgLn4sIGFuYWxvZ291cw0KIHRvIHVucXVvdGF0aW9uIGluIExpc3AsIGlzIGNhbGxl ZCBlc2NhcGUpLiBBbHRob3VnaCBgLiZsdDvigJkgYW5kIGAufuKAmSBhcmUgbm90IHZhbGlkIGlu IE9DYW1sIGFuZCBoZW5jZSBjYW7igJl0IGJlIGNvbmZ1c2VkLCBgJmd0Oy7igJkgaXMgYSBhIHZh bGlkIE9DYW1sIG9wZXJhdG9yIChhbmQgc28gYXJlIHRoZSBvcGVyYXRvcnMgdGhhdCBzdGFydCB3 aXRoIHRoYXQgY2hhcmFjdGVyIHNlcXVlbmNlLCBsaWtlIGAmZ3Q7Li7igJkgYW5kIGAmZ3Q7LiZn dDsu4oCZKS4gSW4gZmFjdCwgdGhlcmUNCiBhcmUgc29tZSBsaWJyYXJpZXMgdGhhdCBkbyBkZWZp bmUgdGhlIG9wZXJhdG9yIGAmZ3Q7LuKAmSBhbmQgd2hpY2ggdGhlcmVmb3JlIGNhbm5vdCBiZSB1 c2VkIGluIE1ldGFPQ2FtbCBjb2RlLiBWZXJzaW9uIE4xMTQgaW50cm9kdWNlcyBhbiBhZGFwdGl2 ZSBsZXhlciwgd2hpY2ggdHJlYXRzIGAmZ3Q7LuKAmSBpZGVudGljYWxseSB0byBvcmRpbmFyeSBP Q2FtbCwgdW50aWwgaXQgc2VlcyB0aGUgZmlyc3QgYC4mbHQ74oCZLiBJZiBvbmUgYXJyYW5nZXMg dGhlIGNvZGUgc3VjaA0KIHRoYXQgYWxsIG9jY3VycmVuY2VzIG9mIHRoZSBvcGVyYXRvciBgJmd0 Oy7igJkgY29tZSBiZWZvcmUgdGhlIG9wZW5pbmcgYnJhY2tldCwgb25lIGNhbiB1c2UgdGhlIG9w ZXJhdG9yIGV2ZW4gaW4gdGhlIHNhbWUgZmlsZSBhcyBicmFja2V0cy4gSWYgb25lIGNhbm5vdCBh cnJhbmdlIGNvZGUgc3VjaCB3YXksIG9yIG11c3QgdXNlIGAmZ3Q7LuKAmSB3aXRoaW4gYnJhY2tl dHMsIG9uZSBoYXMgdG8gdXNlIHRoZSBhbHRlcm5hdGl2ZSBzeW50YXggZm9yIGJyYWNrZXRzDQog YW5kIGVzY2FwZXM6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUg Y2xhc3M9InNyYyBzcmMtb2NhbWwiPiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAw OyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3 YTlmOyI+aDwvc3Bhbj4gLSZndDsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZWJlYmViOyI+WyVtZXRhb2NhbWwuYnJhY2tldDwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA4MjRmOyI+MTwvc3Bhbj4gJmd0Oy4gWzxzcGFuIHN0eWxlPSJjb2xvcjog I2E1MmEyYTsiPiU8L3NwYW4+bWV0YW9jYW1sLmVzY2FwZSBoXTxzcGFuIHN0eWxlPSJjb2xvcjog I2EyNjA0ZjsgYmFja2dyb3VuZC1jb2xvcjogI2ViZWJlYjsiPl08L3NwYW4+DQo8L3ByZT4NCjwv ZGl2Pg0KPHA+YWx0aG91Z2ggb25lIG1heSBwcmVmZXIgPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNy Yy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+ICAgICAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5oPC9zcGFuPiAtJmd0OyA8c3BhbiBzdHlsZT0iY29s b3I6ICNhMjYwNGY7IGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7Ij5bJW1ldGFvY2FtbC5icmFj a2V0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij4xPC9zcGFuPiAmZ3Q7LiAu fmg8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7IGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7 Ij5dPC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxwPkZvciBtb3JlIGV4cGxhbmF0aW9ucywgcGxl YXNlIHNlZSA8YSBocmVmPSJodHRwczovL29rbWlqLm9yZy9mdHAvTUwvTWV0YU9DYW1sLmh0bWwi Pg0KaHR0cHM6Ly9va21pai5vcmcvZnRwL01ML01ldGFPQ2FtbC5odG1sPC9hPiBwYXJ0aWN1bGFy bHkgYWJvdXQgQ1NQLCBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9va21pai5vcmcvZnRwL21ldGEtcHJv Z3JhbW1pbmcvdHV0b3JpYWwvZ2VuYy5odG1sIj4NCmh0dHBzOi8vb2ttaWoub3JnL2Z0cC9tZXRh LXByb2dyYW1taW5nL3R1dG9yaWFsL2dlbmMuaHRtbDwvYT4gYWJvdXQgb2Zmc2hvcmluZy4gU2Vl IGFsc28gQ2hhbmdlTG9nIGFuZCBOT1RFUy50eHQgaW4gdGhlIEJFUiBNZXRhT0NhbWwgZGlzdHJp YnV0aW9uLg0KPC9wPg0KPHA+QkVSIE1ldGFPQ2FtbCBOMTE0IHNob3VsZCBiZSBhdmFpbGFibGUg dGhyb3VnaCBPUEFNLCBob3BlZnVsbHkgc29vbi4gSW4gdGhlIG1lYW53aGlsZSwgaXQgaXMgYXZh aWxhYmxlIGFzIGEgc2V0IG9mIHBhdGNoZXMgdG8gdGhlIE9DYW1sIDQuMTQuMSBkaXN0cmlidXRp b24uDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL29rbWlqLm9yZy9mdHAvTUwvYmVyLW1ldGFv Y2FtbC50YXIuZ3oiPmh0dHBzOi8vb2ttaWoub3JnL2Z0cC9NTC9iZXItbWV0YW9jYW1sLnRhci5n ejwvYT4NCjwvcD4NCjxwPlNlZSB0aGUgSU5TVEFMTCBkb2N1bWVudCBpbiB0aGF0IGFyY2hpdmUu IFlvdSBuZWVkIHRoZSBzb3VyY2UgZGlzdHJpYnV0aW9uIG9mIE9DYW1sIDQuMTQuMS4NCjwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5CdWlsZGluZyBpT1MgYXBwcyB3aXRoIE9DYW1s PzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYnVpbGRpbmctaW9zLWFw cHMtd2l0aC1vY2FtbC8xMjE1My8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9idWls ZGluZy1pb3MtYXBwcy13aXRoLW9jYW1sLzEyMTUzLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnOTY5YTc3MCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzk2OWE3NzAiPlJvYmVydE4gYXNrZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzk2OWE3NzAiPg0KPHA+SXMgaXQgcG9zc2libGUgdG8gY3JlYXRl IGlPUyBhcHBzIHdpdGggT0NhbWw/IEkga25vdyBpdCBtaWdodCB0YWtlIHNvbWUgZXh0cmEgd29y ayB0byB1c2UgYSBmb3JlaWduLWZ1bmN0aW9uIGludGVyZmFjZSB0byBjYWxsIE9iamVjdGl2ZS1D IGZ1bmN0aW9ucyB0byBjcmVhdGUgdGhlIFVJIG9iamVjdHMuIEJ1dCBJ4oCZbSB3b25kZXJpbmcg aWYgSSBjYW4gY3Jvc3MgY29tcGlsZSBmb3IgQVJNIGFuZCBzZW5kIGEgYmluYXJ5IHRvIG15IGlQ aG9uZSwNCiBhbmQgZXZlbnR1YWxseSB0aGUgQXBwIFN0b3JlLiBJ4oCZbGwgYmUgd29ya2luZyBm cm9tIG1hY09TICh4ODYpLiA8L3A+DQo8cD5J4oCZbSBhbHNvIGludGVyZXN0ZWQgaW4gbWFjT1Mg YXBwcyBmb3IgdGhlIEFwcCBTdG9yZSwgd2hpY2ggcHJvYmFibHkgcmVxdWlyZSBjcm9zcy1jb21w aWxpbmcgdG8gbWFrZSBhbiBBUk0mIzQzO3g4NiBiaW5hcnkgb2Ygc29tZSBraW5kLg0KPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2UxYzY1YzgiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlMWM2NWM4Ij5EYW5pZWwgQsO8bnpsaSByZXBs aWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdlMWM2NWM4 Ij4NCjxwPkRvbuKAmXQga25vdyB3aGF0IHRoZSBzdGF0ZSBvZiB0aGF0IGlzIGJ1dCBhdCBsZWFz dCBpdCBoYXMgYmVlbiA8YSBocmVmPSJodHRwOi8vcHNlbGxvcy5jb20vb2NhbWwvY29tcGlsZS10 by1pcGhvbmUuaHRtbCI+DQpkb25lPC9hPiBhdCBzb21lIHBvaW50LiA8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnM2I2ZmU4YyIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzNiNmZlOGMiPk5hdGhhbiBGYWxsZXQgYWxzbyByZXBsaWVkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczYjZmZThjIj4NCjxw PknigJl2ZSBhbHJlYWR5IHNlZW4gcGVvcGxlIHRyeWluZyB0byBkbyB0aGF0LiA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vZGJvcmlzL29jYW1sLWNvY29hL2Jsb2IvbWFzdGVyL2V4YW1wbGVz L2NvdW50X2NsaWNrcy5tbCI+DQpIZXJlIGlzIGFuIGV4YW1wbGU8L2E+LiA8L3A+DQo8cD5JdOKA mXMgbm90IGZyb20gbWUgYnV0IGl04oCZcyBhbiBleGFtcGxlIEkgZ290IHNob3duIHdoZW4gSSBi dWlsdCBteSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3Blbi1zb3VyY2Ut ZWRpdG9yLWZvci1pb3MtaXBhZG9zLWFuZC1tYWNvcy83NjI0LzIxIj4NCk9DYW1sIGVkaXRvciBm b3IgaU9TL2lQYWRPUy9tYWNPUzwvYT4uIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmc2ZjhkYWU0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnNmY4ZGFlNCI+amJlY2tmb3JkIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc2ZjhkYWU0Ij4NCjxwPkNvdXBsZSBtb3JlIG9wdGlvbnMg4oCmIDwv cD4NCjxwPk9wdGlvbiAxOiBJIG1lbnRpb25lZCBsYXN0IHdlZWsgaW4gYW4gdW5yZWxhdGVkIHRo cmVhZCB0aGF0IHRoZXJlIGlzIGFuIG9wYW0gcGFja2FnZSBgZGttbC1iYXNlLWNvbXBpbGVyYCB0 aGF0IGRvZXMgY3Jvc3MtY29tcGlsYXRpb24uIEl0IHN1cHBvcnRzIG1vc3Qgb2YgdGhlIEFuZHJv aWQgY3Jvc3MtY29tcGlsZSBtYXRyaXggKGV4LiB4ODYgLSZndDsgYXJtMzIpLCBhbmQgdGhlIG1h Y09TIChleC4geDg2XzY0IC0mZ3Q7IGFybTY0KS4gSSBoYXZlbuKAmXQNCiB1cGRhdGVkIHRoZSBv ZmZpY2lhbCBvcGFtIHBhY2thZ2UgdG8gZG8gaU9TIGNyb3NzLWNvbXBpbGVzIGIvYyBtb3N0IG9m IG15IG9wZW4tc291cmNlIHRpbWUgY29tbWl0bWVudCBoYXMgYmVlbiBmb3IgV2luZG93cy4gSWYg eW91IGtub3cgaG93IHRvIGNvbXBpbGUgdGhlIE9DYW1sIGNvbXBpbGVyLCBwbGVhc2UgZXh0ZW5k IHRoYXQgcGFja2FnZSEgVGhlIGJpdHMgd2lsbCBiZSB2ZXJ5IHNpbWlsYXIgdG8gdGhlIG1hY09T IGNyb3NzLWNvbXBpbGVyLA0KIGFuZCBJIGNhbiBndWlkZSB5b3UuIFNlZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2hvdy10by1jb21waWxlLW9jYW1sLXByb2dyYW0tb24t bGludXgtZm9yLXJ1bm5pbmctb24tZnJlZWJzZC8xMjExMC80P3U9amJlY2tmb3JkIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctdG8tY29tcGlsZS1vY2FtbC1wcm9ncmFtLW9uLWxp bnV4LWZvci1ydW5uaW5nLW9uLWZyZWVic2QvMTIxMTAvND91PWpiZWNrZm9yZDwvYT4NCjwvcD4N CjxwPk9wdGlvbiAyOiBJZiB5b3Ugd2FudCBhIG1vcmUgb3V0LW9mLXRoZS1ib3ggc29sdXRpb24s IHlvdSBjYW4gdXNlIG15IGNvbW1lcmNpYWwNCjxhIGhyZWY9Imh0dHBzOi8vZGlza3V2LmNvbS9j bWFrZS9oZWxwL2xhdGVzdC8iPkRrU0RLPC9hPiBuYXRpdmUgZGV2ZWxvcG1lbnQga2l0LiBGcm9t IGFuIE9DYW1sIHBlcnNwZWN0aXZlLCBpdCBpcyBhIE9DYW1sLWJlZ2lubmVyIGZyaWVuZGx5IGtp dCB0aGF0IGVtYmVkcyBPQ2FtbCBpbnRvIG90aGVyIGxhbmd1YWdlcyBhbmQgZnJhbWV3b3Jrcy4g VHdvIHNob3J0LXRlcm0gdGhpbmdzIGFyZSByZWxldmFudC4gMSkgVGhlIGRvY3MgbWVudGlvbnMN CiBDIGEgbG90LCBidXQgb25seSBiZWNhdXNlIEkgaGF2ZW7igJl0IGZpbmlzaGVkIHdyaXRpbmcg aXRzIEZGSS4gSXQgd2lsbCBzdXBwb3J0IE9DYW1sIG9iamVjdHMgJmx0O+KAkyZndDsgT2JqZWN0 aXZlLUMvU3dpZnQgb2JqZWN0cyB1c2luZyBBcHBsZeKAmXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9hcHBsZS9zd2lmdC1jb3JlbGlicy1mb3VuZGF0aW9uL3RyZWUvbWFpbiNyZWFkbWUi PkZvdW5kYXRpb248L2E+IGxpYnJhcnkuIDIpIEkgaW5hZHZlcnRlbnRseSBicm9rZSBzdXBwb3J0 IGZvciBYY29kZSBidWlsZHMsIGJ1dCB0aGF0IHdpbGwgZ2V0IGZpeGVkIHNvb25lciBvciBsYXRl ciAoZGVwZW5kaW5nIG9uIHRoZSBpbnRlcmVzdCkuDQo8L3A+DQo8cD5Bbnl3YXksIHBpbmcgbWUg cHJpdmF0ZWx5IGlmIE9iamVjdGl2ZS1DL1N3aWZ0IGRldiBpbiBYY29kZSB3aXRoIHRoZSBSdW4g YnV0dG9uIGF1dG9tYXRpY2FsbHkgYnVpbGRpbmcgRkZJLXN1cHBvcnRlZCBPQ2FtbCBjb2RlIHNv dW5kcyBsaWtlIGEgZml0Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZ2I5ZTViMzMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdiOWU1 YjMzIj5WaW5jZW50IEJhbGF0IGFsc28gcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnYjllNWIzMyI+DQo8cD5CZSBTcG9ydCBhcHAgaXMgd3JpdHRl biBpbiBPQ2FtbCAoaU9TLCBBbmRyb2lkLCBXZWIgY2xpZW50IGFuZCBzZXJ2ZXIpIHdpdGggT2Nz aWdlbiAoRWxpb20sIEpzX29mX29jYW1sLCBPY3NpZ2VuIFN0YXJ04oCmKSBhcyBhbiBIVE1MNSBh cHAgKHdpdGggQ29yZG92YSkNCjxhIGhyZWY9Imh0dHBzOi8vYXBwcy5hcHBsZS5jb20vZnIvYXBw L2JlLXNwb3J0L2lkMTEwNDIxNjkyMiI+aHR0cHM6Ly9hcHBzLmFwcGxlLmNvbS9mci9hcHAvYmUt c3BvcnQvaWQxMTA0MjE2OTIyPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Ijki PkEgTWluaW1hbCBQcm90b3R5cGUgb2YgSW4tUGFja2FnZSBTZWFyY2ggaXMgb24gc3RhZ2luZy5v Y2FtbC5vcmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2EtbWluaW1h bC1wcm90b3R5cGUtb2YtaW4tcGFja2FnZS1zZWFyY2gtaXMtb24tc3RhZ2luZy1vY2FtbC1vcmcv MTIxNjMvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYS1taW5pbWFsLXByb3RvdHlw ZS1vZi1pbi1wYWNrYWdlLXNlYXJjaC1pcy1vbi1zdGFnaW5nLW9jYW1sLW9yZy8xMjE2My8xPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjYTQ5YzZiIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnY2E0OWM2YiI+U2FiaW5lIFNjaG1hbHR6IGFu bm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnY2E0 OWM2YiI+DQo8cD5XZSBhZGRlZCBhbiBleHBlcmltZW50YWwsIGluY29tcGxldGUgYW5kIGJhc2lj IGluLXBhY2thZ2Ugc2VhcmNoIHRvIDxhIGhyZWY9Imh0dHA6Ly9zdGFnaW5nLm9jYW1sLm9yZy8i Pg0Kc3RhZ2luZy5vY2FtbC5vcmc8L2E+LiA6Y2FtZWw6IFRoZSBjdXJyZW50IHByb3RvdHlwZSBp bXBsZW1lbnRhdGlvbiB1c2VzIGFuIGV4aXN0aW5nIEphdmFTY3JpcHQgbGlicmFyeS4gVGhhdCB0 dXJuZWQgb3V0IHRvIGJlIHRoZSBxdWlja2VzdCAvIGxlYXN0LWVmZm9ydCB3YXkgdG8gZ2V0IHNv bWV0aGluZyB1cCBhbmQgcnVubmluZyB3aGlsZSB3ZSB3b3JrIGJlaGluZCB0aGUgc2NlbmVzIG9u IHNvbWV0aGluZyBtb3JlIHJlZmluZWQuDQo8L3A+DQo8cD5PbiA8YSBocmVmPSJodHRwczovL3N0 YWdpbmcub2NhbWwub3JnL3AvZHJlYW0vbGF0ZXN0Ij5odHRwczovL3N0YWdpbmcub2NhbWwub3Jn L3AvZHJlYW0vbGF0ZXN0PC9hPiAob3IgYW55IG90aGVyIHBhY2thZ2UgZm9yIHdoaWNoIGRvY3Vt ZW50YXRpb24gaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IGJ1aWx0IGJ5IHRoZSBkb2N1bWVudGF0aW9u IHBpcGVsaW5lKSB5b3Ugc2hvdWxkIHNlZSBhIHNlYXJjaCBiYXIgdGhhdCBhbGxvd3MgeW91IHRv IHNlYXJjaA0KIGlkZW50aWZpZXJzIHdpdGhpbiB0aGUgcGFja2FnZS4gPC9wPg0KPHA+VGhlIGdv YWwgZnJvbSBvdXIgc2lkZSBpcyB0byBicmluZyBhIOKAnG1pbmltdW0gdXNlZnVsIHByb2R1Y3Ti gJ0gdG8geW91IHF1aWNrbHkuIFBsZWFzZSBsZXQgdXMga25vdyBpZiB0aGVyZSBhcmUgYW55IHBy b2JsZW1zIG9yIHdpc2hlcyBmb3IgYSDigJx2ZXJzaW9uIDEuMC4w4oCdIG9mIHRoZSBzZWFyY2gu DQo8L3A+DQo8cD5JZiBubyBzaG93LXN0b3BwaW5nIGlzc3VlcyBhcmUgdW5jb3ZlcmVkLCB3ZeKA mWxsIGdvIGFoZWFkIGFuZCBhcHBseSBhIHBhdGNoIHRvIHRoZSBsaXZlIHNpdGUgYXQgb2NhbWwu b3JnIGJ5IGVuZCBvZiB0aGUgd2VlayBvciBlYXJseSBuZXh0IHdlZWsuIDpzbGlnaHRfc21pbGU6 DQo8L3A+DQo8cD5UaGFuayB5b3UgQHBhbmdsZXNkLCBARW1pbGVUcm90aWdub24sIGFuZCBAYXJ0 LXcgZm9yIGVuYWJsaW5nIHRoaXMhIEkgc3BlbnQgc3VycHJpc2luZ2x5IGxpdHRsZSB0aW1lIG9u IHRoZSBpbnRlZ3JhdGlvbiBpbnRvIHN0YWdpbmcub2NhbWwub3JnIHNvIGZhciwgc28gaXTigJlz IGdvaW5nIHRvIGJlIGZ1biB0byBzZWUgd2hlcmUgdGhpcyBnb2VzLg0KPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzZjYzVlMTciIGNsYXNzPSJvdXRs aW5lLTMiPg0KPGgzIGlkPSJvcmc2Y2M1ZTE3Ij5CYXJpc2VyZSBKb25hdGhhbiBhc2tlZCBhbmQg U2FiaW5lIFNjaG1hbHR6IHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzZjYzVlMTciPg0KPGJsb2NrcXVvdGU+DQo8cD5JcyBpdCBwb3NzaWJsZSB0 byBydW4gdGhlIGRvY3MgVUkgbG9jYWxseSwganVzdCBhcyA8YSBocmVmPSJodHRwczovL2RvY3Mu cmFja2V0LWxhbmcub3JnIj4NClJhY2tldDwvYT4gZG9lcz8gPC9wPg0KPC9ibG9ja3F1b3RlPg0K PHA+SXQgaXMgcG9zc2libGUgdG8gdXNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vZG9jIj5vZG9jPC9hPiBsb2NhbGx5IHRvIHJlbmRlciBhbmQgY29uc3VtZSBkb2N1bWVudGF0 aW9uLg0KPC9wPg0KPHA+SG93ZXZlciwgc2VhcmNoIGhhcyBub3QgeWV0IGJlZW4gYWRkZWQgdG8g PGNvZGU+b2RvYzwvY29kZT4uIDwvcD4NCjxwPlRoaXMgcGFydGljdWxhciBwcm90b3R5cGUgb2Yg c2VhcmNoIGlzIG9ubHkgb24gc3RhZ2luZy5vY2FtbC5vcmcgYXQgdGhlIG1vbWVudC4NCjwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0MWMzYmI0IiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNDFjM2JiNCI+U2lkIEtzaGF0cml5YSB0aGVu IGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0MWMz YmI0Ij4NCjxwPlRvIHN1cGxlbWVudCB0byB3aGF0IEBzYWJpbmUgbWVudGlvbmVkLCBJIHdvdWxk IGxpa2UgdG8gcmVjb21tZW5kIDxjb2RlPm9kaWc8L2NvZGU+Lg0KPC9wPg0KPHA+PGNvZGU+b2Rp ZzwvY29kZT4gaXMgYSB2ZXJ5IGVhc3kgd2F5IHRvIGludm9rZSA8Y29kZT5vZG9jPC9jb2RlPiBv biB5b3VyIGxvY2FsIG1hY2hpbmUuIFNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9lcnJhdGlxdWUuY2gv c29mdHdhcmUvb2RpZyI+aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvb2RpZzwvYT4NCjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEw IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTAiPk5ldyByZWxlYXNlIG9mIEZpeCAoMjAy MzA1MDUpPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xMCI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1y ZWxlYXNlLW9mLWZpeC0yMDIzMDUwNS8xMjE2OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtZml4LTIwMjMwNTA1LzEyMTY4LzE8L2E+IDwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMGRiZGE5ZiIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzBkYmRhOWYiPkZyYW7Dp29pcyBQb3R0aWVyIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGRiZGE5ZiI+DQo8 cD5GcsOpZMOpcmljIEJvdXIgYW5kIEkgYXJlIHBsZWFzZWQgdG8gYW5ub3VuY2UgYSBuZXcgcmVs ZWFzZSBvZiBGaXguIDwvcD4NCjxwPkluIHNob3J0LCBGaXggaXMgYSB0b29sa2l0IHRoYXQgaGVs cHMgcGVyZm9ybSBtZW1vaXphdGlvbiBhbmQgZml4ZWQgcG9pbnQgY29tcHV0YXRpb25zIChpbmNs dWRpbmcgZGF0YSBmbG93IGFuYWx5c2VzKS4gTW9yZSBnZW5lcmFsbHksIGl0IG9mZmVycyBhIG51 bWJlciBvZiBiYXNpYyBhbGdvcml0aG1pYyBidWlsZGluZyBibG9ja3MgdGhhdCBjYW4gYmUgdXNl ZnVsIGluIG1hbnkgY2lyY3Vtc3RhbmNlcy4NCjwvcD4NCjxwPkluIHRoaXMgcmVsZWFzZSwgdHdv IG5ldyBtb2R1bGVzIGhhdmUgYmVlbiBhZGRlZDogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPjxhIGhyZWY9Imh0dHA6Ly9jYW1iaXVtLmlucmlhLmZyL35mcG90dGllci9maXgvZG9jL2Zp eC9GaXgvTWluaW1pemUvIj5GaXguTWluaW1pemU8L2E+IG9mZmVycyBhIG1pbmltaXphdGlvbiBh bGdvcml0aG0gZm9yIGRldGVybWluaXN0aWMgZmluaXRlIGF1dG9tYXRhIChERkFzKS4gSXQgaXMg YmFzZWQgb24gQW50dGkgVmFsbWFyaeKAmXMgMjAxMiBwYXBlciwg4oCcRmFzdCBicmllZiBwcmFj dGljYWwgREZBIG1pbmltaXphdGlvbuKAnS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHA6Ly9jYW1i aXVtLmlucmlhLmZyL35mcG90dGllci9maXgvZG9jL2ZpeC9GaXgvUGFydGl0aW9uLyI+Rml4LlBh cnRpdGlvbjwvYT4gb2ZmZXJzIGEgcGFydGl0aW9uIHJlZmluZW1lbnQgZGF0YSBzdHJ1Y3R1cmUs IHdoaWNoIGlzIHVzZWQgYnkgdGhlIG1pbmltaXphdGlvbiBhbGdvcml0aG0sIGFuZCBjb3VsZCBi ZSB1c2VmdWwgaW4gb3RoZXIgYWxnb3JpdGhtcy4NCjwvbGk+PC91bD4NCjxwPlRoZXJlIGFyZSBv dGhlciBtaW5vciA8YSBocmVmPSJodHRwczovL2dpdGxhYi5pbnJpYS5mci9mcG90dGllci9maXgv LS9ibG9iL21hc3Rlci9DSEFOR0VTLm1kIj4NCmNoYW5nZXM8L2E+LiA8L3A+DQo8cD5UaGUgbGli cmFyeSBjYW4gYmUgaW5zdGFsbGVkIGFzIGZvbGxvd3M6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1w bGUiIGlkPSJvcmcwZjA1YjNkIj4NCiAgb3BhbSB1cGRhdGUNCiAgb3BhbSBpbnN0YWxsIGZpeC4y MDIzMDUwNQ0KPC9wcmU+DQo8cD48YSBocmVmPSJodHRwOi8vY2FtYml1bS5pbnJpYS5mci9+ZnBv dHRpZXIvZml4L2RvYy9maXgvIj5Eb2N1bWVudGF0aW9uPC9hPiBpcyBhdmFpbGFibGUgb25saW5l Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItMTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxMSI+UUNoZWNrIDAuMjE8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTExIj4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcWNoZWNrLTAtMjEvMTIxNjkv MSI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1xY2hlY2stMC0yMS8xMjE2OS8xPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5YzdiMmE4IiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOWM3YjJhOCI+SmFuIE1pZHRnYWFyZCBhbm5v dW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzljN2Iy YTgiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgUUNoZWNrIDAu MjEsIGEgcHJvcGVydHktYmFzZWQgdGVzdGluZyBsaWJyYXJ5IGluIHRoZSBzdHlsZSBvZiBIYXNr ZWxs4oCZcyBRdWlja0NoZWNrIDp0YWRhOiBNb3JlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBp biB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrIj5RQ2hlY2sg R2l0aHViIHJlcG9zaXRvcnk8L2E+IGFuZCBpbiB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vYy1jdWJl LmdpdGh1Yi5pby9xY2hlY2svIj5wYWNrYWdlIGRvY3VtZW50YXRpb248L2E+LiA8L3A+DQo8cD5U aGUgMC4yMSByZWxlYXNlIG9mZmVycyBiZXR0ZXIgbmVnYXRpdmUgdGVzdCBpbnRlZ3JhdGlvbiBh bmQgZnVydGhlcm1vcmUgZml4ZXMgYSBjb3VwbGUgb2YgYnVncyBpbg0KPGNvZGU+UUNoZWNrLlNo cmluazwvY29kZT4gYW5kIGluIDxjb2RlPnBweF9kZXJpdmluZ19xY2hlY2s8L2NvZGU+OiA8L3A+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+bWFrZSA8Y29kZT5UZXN0LmNoZWNrX3Jlc3VsdDwv Y29kZT4sIDxjb2RlPlRlc3QuY2hlY2tfY2VsbF9leG48L2NvZGU+LCBhbmQgPGNvZGU+DQpUZXN0 LmNoZWNrX2V4bjwvY29kZT4gaG9ub3IgdGVzdCBwb2xhcml0eSBieSByYWlzaW5nIDxjb2RlPlRl c3RfdW5leHBlY3RlZF9zdWNjZXNzPC9jb2RlPiB3aGVuIGEgbmVnYXRpdmUgdGVzdCAoZXhwZWN0 ZWQgdG8gaGF2ZSBhIGNvdW50ZXIgZXhhbXBsZSksIHVuZXhwZWN0ZWRseSBzdWNjZWVkcy4NCjwv bGk+PGxpPmZpeCBpc3N1ZSB3aXRoIDxjb2RlPnBweF9kZXJpdmluZ19xY2hlY2s8L2NvZGU+IGRl cml2aW5nIGEgZ2VuZXJhdG9yIHdpdGggdW5ib3VuZA0KPGNvZGU+Z2VuPC9jb2RlPiBmb3IgcmVj dXJzaXZlIHR5cGVzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL2lz c3Vlcy8yNjkiPg0KIzI2OTwvYT4gYW5kIGEgcmVsYXRlZCBpc3N1ZSB3aGVuIGRlcml2aW5nIGEg Z2VuZXJhdG9yIGZvciBhIHJlY29yZCB0eXBlIDwvbGk+PGxpPmZpeCAjMjQxIGNhdXNpbmcgPGNv ZGU+UUNoZWNrLlNocmluay5pbnQqPC9jb2RlPiB0byBlbWl0IGR1cGxpY2F0ZXMsIGFsc28gYWZm ZWN0aW5nDQo8Y29kZT5RQ2hlY2suU2hyaW5rLntjaGFyLHN0cmluZ308L2NvZGU+IDwvbGk+PGxp PmZpeCBhIGNvcm5lcmNhc2Ugd2hlcmUgPGNvZGU+U2hyaW5rLmxpc3Rfc3BpbmU8L2NvZGU+IHdv dWxkIGVtaXQgZHVwbGljYXRlcyA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4YTUxZWIxIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0ib3JnOGE1MWViMSI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtb3JnOGE1MWViMSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBD V04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y ZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3Ig Z28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwv cD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWws IHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGlu Zm8vY2FtbC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0 aG9ybmFtZSIgaWQ9Im9yZzY3YWZkMWYiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 9 May 2023 12:50:40 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 9 May 2023 12:50:40 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 9 May 2023 12:50:40 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 349BnsPW024839 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 9 May 2023 12:49:54 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 349BndaM024822 for ; Tue, 9 May 2023 12:49:40 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 May 2023 13:49:38 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 52427E0D55; Tue, 9 May 2023 13:49:38 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C6404E0D44 for ; Tue, 9 May 2023 13:49:31 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 May 2023 13:49:26 +0200 Received: from TM.local (unknown [88.128.88.10]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 69614561215 for ; Tue, 9 May 2023 13:49:24 +0200 (CEST) From: Alan Schmitt To: "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZgmx6tczWpm3lPE6XM8C31cGikg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 9 May 2023 12:49:23 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 30dd9d0e-4479-4eb9-50b2-08db50839ca7 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.99,262,1677538800"; d="scan'208,217";a="55513189" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=D5560561227 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNS0wOSBUdWUgMDg6NDQgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDUuMDIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNS4xNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1heSAwMiB0byAwOSwgMjAyMy4gPC9wPg0K PGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRhYmxlIG9m IENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRv Yy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5PdmVydmlldyBvZiBsaWJyYXJpZXMgZm9y IHNob3dpbmcgT0NhbWwgdmFsdWVzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+a2NhcyBhbmQg a2Nhc19kYXRhIDAuMy4wOiBTb2Z0d2FyZSBUcmFuc2FjdGlvbmFsIE1lbW9yeTwvYT4gPC9saT48 bGk+PGEgaHJlZj0iIzMiPk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBNYXJjaCAyMDIzPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNCI+Q3JlYXRpbmcgYSB0dXRvcmlhbCBvbiBzZXF1ZW5jZXM8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiM1Ij5Zb3Ugc3RhcnRlZCB0byBsZWFybiBPQ2FtbCBsZXNzIHRoYW4g MTIgbW9udGhzIGFnbz8gUGxlYXNlIGhlbHAgdXMgd2l0aCBvdXIgdXNlciBzdXJ2ZXkgb24gdGhl IE9DYW1sLm9yZyBMZWFybmluZyBBcmVhPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzYiPkV4cGxv cmF0aW9ucyBvbiBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZTwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzciPkZ1bmN0aW9uYWwgd2ViIGFwcGxpY2F0aW9ucyBydW5uaW5nIGluIHRoZSBicm93c2Vy PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+QWhyZWZzIGlzIG5vdyBidWlsdCB3aXRoIE1lbGFu Z2U8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM5Ij5PdGhlciBPQ2FtbCBOZXdzPC9hPiA8L2xpPjxs aT48YSBocmVmPSIjb3JnOGI5MzliMCI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSIxIj5PdmVydmlldyBvZiBsaWJyYXJpZXMgZm9yIHNob3dpbmcgT0NhbWwgdmFsdWVz PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdmVydmlldy1vZi1saWJy YXJpZXMtZm9yLXNob3dpbmctb2NhbWwtdmFsdWVzLzEyMDc2LzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L292ZXJ2aWV3LW9mLWxpYnJhcmllcy1mb3Itc2hvd2luZy1vY2FtbC12YWx1 ZXMvMTIwNzYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnYTcyOTUyZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2E3Mjk1MmUiPkFudG9u IEJhY2hpbiBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmdhNzI5NTJlIj4NCjxwPkluIGxpZ2h0IG9mIHRoZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvaWRlYS1zdGFuZGFyZC1vY2FtbC1ydW50aW1lLXR5cGUtcmVwcmVzZW50YXRp b24vMTIwNTEvMiI+DQpyZWNlbnQgdGhyZWFkPC9hPiBvbiwgYW1vbmcgb3RoZXIgdGhpbmdzLCBz aG93aW5nIE9DYW1sIHZhbHVlcywgYW5kIGJlY2F1c2Ugb2YgRHJlYW3igJlzDQo8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vYWFudHJvbi9kcmVhbS93aWtpL1JvYWRtYXAjbG9nZ2luZyI+bG9u Zy1zdGFuZGluZyBuZWVkPC9hPiBmb3IgdGhpcyB0byBleGlzdCBpbiBPQ2FtbCwgSeKAmXZlIGRv bmUsIGFzDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaWRlYS1zdGFuZGFy ZC1vY2FtbC1ydW50aW1lLXR5cGUtcmVwcmVzZW50YXRpb24vMTIwNTEvNiI+DQpzdWdnZXN0ZWQ8 L2E+LCBhIGNvbXBhcmlzb24gb2YgdGhlIGF2YWlsYWJsZSBsaWJyYXJpZXMuIFRoZXkgc2VlbSB0 byBmYWxsIGludG8gdGhyZWUgY2F0ZWdvcmllcy4NCjwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4N CjxsaT4NCjxwPkxpYnJhcmllcyB0aGF0IHdhbGsgdGhlIHJ1bnRpbWUgcmVwcmVzZW50YXRpb24g b2YgdmFsdWVzIGFuZCBkdW1wIGl0LiA8L3A+DQo8cD5UaGVzZSBwcm92aWRlIGEgPGI+PGNvZGU+ J2EgLSZndDsgc3RyaW5nPC9jb2RlPjwvYj4gZnVuY3Rpb25zIHRoYXQgY2FuIGltbWVkaWF0ZWx5 IHByaW50IGFueSB2YWx1ZSwgYW5kIGFyZSB0aGUgZWFzaWVzdCB0byB1c2UuIFRoZXkgYXJlIHdo YXQgSSBuZWVkIGluIERyZWFtIOKAkyBzb21ldGhpbmcgdGhhdCBhIG5vcm1hbCBwZXJzb24gY2Fu IHVzZSBmb3IgZGVidWdnaW5nIHdpdGhvdXQgYW55IGJvaWxlcnBsYXRlLiBUaGUNCjxiPmFjY3Vy YWN5PC9iPiBvZiB0aGVzZSBsaWJyYXJpZXMgaXMgPGI+bGltaXRlZDwvYj4gYmVjYXVzZSB0aGUg dHlwZSBpbmZvcm1hdGlvbiBwcmVzZXJ2ZWQgaW4gdGhlIHJ1bnRpbWUgaXMgdmVyeSBiYXJlLg0K PC9wPg0KPHA+VGhlc2UgYXJlOiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+cmVhc29u LW5hdGl2ZeKAmXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3JlYXNvbm1sL3JlYXNvbi1u YXRpdmUvdHJlZS9tYXN0ZXIvc3JjL2NvbnNvbGUjY29uc29sZWxvZ2FueXRoaW5nIj4NCjxiPjxj b2RlPkNvbnNvbGUubG9nPC9jb2RlPjwvYj48L2E+LiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vbWphbWJvbi9kdW0jcmVhZG1lIj48Yj5EdW08L2I+PC9hPiA8L2xpPjxsaT48 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20va3JvaHJlci9jYW1sLWluc3BlY3QjcmVhZG1lIj48 Yj5JbnNwZWN0PC9iPjwvYT4gPC9saT48L29sPg0KPHA+VGhlcmUgaXMgYWxzbyA8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vZ2J1cnkvb2NhbWwtbWVtZ3JhcGgiPk1lbWdyYXBoPC9hPiwgYnV0 IHRoaXMgYXBwZWFycyB0byBvbmx5IG91dHB1dCBET1QgZ3JhcGhzLCBzbyBJIGRpZG7igJl0IGxv b2sgaW50byBpdCBpbiBkZXRhaWwuDQo8L3A+DQo8cD5TaW5jZSBJIGFtIGludGVyZXN0ZWQgaW4g dGhlc2UgZm9yIG15IHB1cnBvc2VzLCBJIHdyb3RlIGEgdGVzdGVyIHRoYXQgY29tcGFyZXMgdGhl aXIgb3V0cHV0cywgYW5kIHVwbG9hZGVkIGl0IGludG8gYQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXN0 LmdpdGh1Yi5jb20vYWFudHJvbi9hNjUwOThiMGZlYmIzYWMzNGNiNjNlYTkyODVkOTMxNiNmaWxl LXRlc3QtbWwiPg0KZ2lzdDwvYT4uIFNlZSB0aGUgb3V0cHV0cyBmb3IgPGEgaHJlZj0iaHR0cHM6 Ly9naXN0LmdpdGh1Yi5jb20vYWFudHJvbi9hNjUwOThiMGZlYmIzYWMzNGNiNjNlYTkyODVkOTMx NiNmaWxlLXotY29uc29sZS1sb2ctdHh0Ij4NCjxjb2RlPkNvbnNvbGUubG9nPC9jb2RlPjwvYT4s IDxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2FhbnRyb24vYTY1MDk4YjBmZWJiM2Fj MzRjYjYzZWE5Mjg1ZDkzMTYjZmlsZS16LWR1bS10eHQiPg0KRHVtPC9hPiwgPGEgaHJlZj0iaHR0 cHM6Ly9naXN0LmdpdGh1Yi5jb20vYWFudHJvbi9hNjUwOThiMGZlYmIzYWMzNGNiNjNlYTkyODVk OTMxNiNmaWxlLXotaW5zcGVjdC10eHQiPg0KSW5zcGVjdDwvYT4uIFRoZXkgYXJlIGFsbCB2YXJp YW50cyBvZiBlYWNoIG90aGVyLiBFYWNoIGhhcyBpdHMgb3duIHF1aXJrcyBhbmQgYnVncywgYnV0 IHRoZXkgYWxsIGxvb2sgcm91Z2hseSBsaWtlIHRoaXM6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFt cGxlIiBpZD0ib3JnNDIzNGFiNSI+DQogICAgJmd0OyBDb25zb2xlLmxvZyAmcXVvdDthYmMmcXVv dDsNCiAgICAmcXVvdDthYmMmcXVvdDsNCiAgICAmZ3Q7IENvbnNvbGUubG9nIDQyDQogICAgNDIN CiAgICAmZ3Q7IENvbnNvbGUubG9nIHthID0gJnF1b3Q7YWJjJnF1b3Q7OyBiID0gNDJ9DQogICAg eyZxdW90O2FiYyZxdW90OzsgNDJ9DQo8L3ByZT4NCjxwPkludGVyZXN0aW5nbHkgKGJ1dCBwcmVk aWN0YWJseSksIGZvciBleHRlbnNpYmxlIHZhcmlhbnRzIGxpa2UgPGNvZGU+ZXhuPC9jb2RlPiwg dGhlc2UgZHVtcGVycyBhcmUgYWJsZSB0byBwcmludCB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9u IG9mIHZhcmlhbnQgY29uc3RydWN0b3JzIGV2ZW4gd2l0aCBPQ2FtbOKAmXMgY3VycmVudCBydW50 aW1lLg0KPC9wPg0KPC9saT48bGk+DQo8cD5MaWJyYXJpZXMsIHN1Y2ggYXMgPGNvZGU+cHB4X2Rl cml2aW5nPC9jb2RlPiwgdGhhdCBoYXZlIGEgUFBYIGdlbmVyYXRlLCBvciB0aGUgdXNlciBtYW51 YWxseSBwcm92aWRlLCBpbmZvcm1hdGlvbiBhYm91dCB0eXBlcyDigJMgdGhhdCBpcywgcHJvdmlk ZSBoZWxwZXIgdmFsdWVzIHRoYXQgZGVzY3JpYmUgdHlwZXMsIGFuZCB0aGVuIGFzayB0aGUgdXNl ciB0byBwcm92aWRlIHRoYXQgaW5mb3JtYXRpb24gdG8gd2FsayB2YWx1ZXMgYW5kIGR1bXANCiB0 aGVtLiA8L3A+DQo8cD5UaGVzZSBhcmUgdW5zdWl0YWJsZSBmb3IgbXkgZ29hbHMuIEFsbCBvZiB0 aGVzZSByZXF1aXJlIHRoZSB1c2VyIHRvIHBhc3MgaW4gdGhlIHR5cGUgaW5mb3JtYXRpb24gdG8g dGhlIHByaW50aW5nIGZ1bmN0aW9uIGF0IGVhY2ggY2FsbCBzaXRlLCBiZWNhdXNlIGluIHRoZSBh YnNlbmNlIG9mIG1vZHVsYXIgaW1wbGljaXRzIG9yIHR5cGUgY2xhc3NlcywgdGhlIGNvbXBpbGVy IGNhbm5vdCBhdXRvbWF0aWNhbGx5IGFzc29jaWF0ZSB0aGUgdHlwZQ0KIGluZm9ybWF0aW9uIHdp dGggdGhlIHZhbHVlcy4gVGhleSBwcm92aWRlLCByb3VnaGx5LCA8Yj48Y29kZT4oJ2EgLSZndDsg c3RyaW5nKSAtJmd0OyAnYSAtJmd0OyBzdHJpbmc8L2NvZGU+PC9iPiBmdW5jdGlvbnMuIFRoZSB1 c2VyIGhhcyB0byBwcm92aWRlIHRoZQ0KPGNvZGU+J2EgLSZndDsgc3RyaW5nPC9jb2RlPiBmb3Ig ZWFjaCA8Y29kZT4nYTwvY29kZT4gZWFjaCB0aW1lIHRoZXkgd291bGQgbGlrZSB0byBwcmludCBh bg0KPGNvZGU+J2E8L2NvZGU+LiA8L3A+DQo8cD5JZiA8Y29kZT4nYTwvY29kZT4gaXMgYSDigJxj b250YWluZXLigJ0gdHlwZSwgdGhlIHJlcXVpcmVkIGZ1bmN0aW9uIGlzIGEgaGlnaGVyLW9yZGVy IGZ1bmN0aW9uIHRoYXQgbmVlZHMgYWRkaXRpb25hbCBmdW5jdGlvbihzKSBmb3IgdGhlIGVsZW1l bnQgdHlwZXMuIFRoaXMgaXMNCjxiPm5vdCBlcmdvbm9taWM8L2I+LCBhcyBlYWNoIGNhbGwgc2l0 ZSB3aGVyZSBvbmUgd291bGQgbGlrZSB0byBzaG93IGEgdmFsdWUgbmVlZHMgYm9pbGVycGxhdGUu IEV2ZW4gaWYgdGhlDQo8Y29kZT4nYSAtJmd0OyBzdHJpbmc8L2NvZGU+IGlzIHByZWNvbXBvc2Vk LCBpdCByZXF1aXJlcyB0aGUgdXNlciB0byByZW1lbWJlciB3aGF0IGl0IGlzIGNhbGxlZCwgcGlj ayB0aGUgcmlnaHQgb25lLCBhbmQgaXMgbm90IHJlc2lzdGFudCB0byB2YXJpb3VzIHJlZmFjdG9y aW5ncyBzdWNoIGFzIHdyYXBwaW5nIGluDQo8Y29kZT5vcHRpb248L2NvZGU+LiBCdXQgc3VjaCBs aWJyYXJpZXMgYXJlIGFjY3VyYXRlLCBiZWNhdXNlIHRoZSB0eXBlIGluZm9ybWF0aW9uIHByb3Zp ZGVkIGluIHRoZSBib2lsZXJwbGF0ZSBjYW4gYmUgcHJlY2lzZS4NCjwvcD4NCjxwPlRoZXNlIGFy ZTogPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC1wcHgvcHB4X2Rlcml2aW5nI3VzYWdlIj48Yj5wcHhfZGVyaXZpbmc8L2I+PC9h PuKAmXMNCjxjb2RlPltAQGRlcml2aW5nIHNob3ddPC9jb2RlPi4gPC9saT48bGk+PGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3RoaWVycnktbWFydGluZXovcmVmbCNiYXNpYy11c2FnZSI+PGI+ cmVmbDwvYj48L2E+LCBhIHBweF9kZXJpdmluZy1saWtlLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL0xleGlGaS9scnQjZ2V0dGluZy1zdGFydGVkIj48Yj5scnQ8L2I+PC9h PiwgYW5vdGhlciBwcHhfZGVyaXZpbmctbGlrZS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9wcXd5L3RwZiNyZWFkbWUiPjxiPnRwZjwvYj48L2E+LCBhZ2FpbiBhIHBweF9k ZXJpdmluZy1saWtlLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVz dHJlZXQvdHlwZXJlcCI+PGI+dHlwZXJlcDwvYj48L2E+LCBwcm9iYWJseSBhIHBweF9kZXJpdmlu Zy1saWtlIHdpdGggcHB4X3R5cGVyZXBfY29udi4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8v bWlyYWdlLmdpdGh1Yi5pby9yZXByL3JlcHIvUmVwci9pbmRleC5odG1sI3ZhbC1wcF9qc29uIj48 Yj5yZXByPC9iPjwvYT4sIHdoaWNoIGFwcGVhcnMgdG8gaGF2ZSB0aGUgdXNlciBidWlsZCB0aGUg dHlwZSByZXByZXNlbnRhdGlvbiBtYW51YWxseSBmcm9tIGNvbWJpbmF0b3JzIGFuZCB0aGVuIGFs c28gcGFzcyBpdCB3aGVyZSBuZWVkIGl0Lg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRs YWIuY29tL25vbWFkaWMtbGFicy9kYXRhLWVuY29kaW5nLy0vYmxvYi9tYXN0ZXIvc3JjL3R1dG9y aWFsLm1kI2hvdy10by1idWlsZC1hbi1lbmNvZGluZyI+PGI+ZGF0YS1lbmNvZGluZzwvYj48L2E+ LCBhbHNvIGZ1bGx5IG1hbnVhbC4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9sZXQtZGVmL2Ntb24jZG9jdW1lbnRhdGlvbiI+PGI+Y21vbjwvYj48L2E+LCBmdWxseSBtYW51 YWwuDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9ibG9i LzRiOTVjZDNkMWIzYTYyZTY5YTlhOWRiMmJjNGFmMmY5ZmQyZTU2ZDgvb3RoZXJsaWJzL2R5bi9k eW4ubWxpIj48Yj5keW48L2I+PC9hPiBpbiBEdW5lLiBBcHBlYXJzIHRvIGFsc28gYmUgZnVsbHkg bWFudWFsLg0KPC9saT48L29sPg0KPHA+SSBkaWRu4oCZdCB0cnkgdGhlc2Ugb3V0IGluIGRldGFp bCBiZWNhdXNlIHRoZXkgYXJlIGFsbCB1bnN1aXRhYmxlIGFzIDxjb2RlPkNvbnNvbGUubG9nPC9j b2RlPi1hbGlrZXMgZm9yIGluc3BlY3RpbmcgT0NhbWwgdmFsdWVzIHdpdGhvdXQgZXhjZXNzaXZl IGJvaWxlcnBsYXRlLiBBcyBjYW4gYmUgc2VlbiBmcm9tIHRoZWlyIGRvY3VtZW50YXRpb24sIHRo ZXkgYWxsIHJlcXVpcmUgYm9pbGVycGxhdGUgaW4gdGhlIGZvcm0gb2YgZnVuY3Rpb25zL3dpdG5l c3Nlcy9jYWxsaW5nDQogdGhlIHJpZ2h0IGZ1bmN0aW9uLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUs IGF0IHRoZSBwbGFjZSB3aGVyZSB5b3XigJlkIGxpa2UgdG8gc2hvdyBhIHZhbHVlLiBUaGUgbGFz dCBmb3VyIGFsc28gcmVxdWlyZSB0aGUgdXNlciB0byBtYW51YWxseSBidWlsZCB1cCB0aGUgdHlw ZSByZXByZXNlbnRhdGlvbiB1c2luZyBjb21iaW5hdG9ycy4NCjwvcD4NCjxkaXYgY2xhc3M9Im9y Zy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPiAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5NLjwvc3Bhbj5zaG93X215ZnBjbGFzcyA8c3BhbiBzdHls ZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5GUF9ub3JtYWw8 L3NwYW4+ICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRh bGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+cHB4X2Rlcml2aW5nOiBrbm93IHRoZSBmdW5jdGlvbi48L3NwYW4+PHNwYW4gc3R5 bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+DQoNCiAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZWZsLjwvc3Bhbj5zaG93IDxzcGFuIHN0 eWxlPSJjb2xvcjogI2EyNjA0ZjsgYmFja2dyb3VuZC1jb2xvcjogI2ViZWJlYjsiPlslcmVmbDwv c3Bhbj46IChzdHJpbmcgKiBpbnQpIGxpc3Q8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7IGJh Y2tncm91bmQtY29sb3I6ICNlYmViZWI7Ij5dPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMy NDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5bXTwvc3Bhbj4gWzxzcGFuIHN0eWxl PSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2EmcXVvdDs8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij4xPC9zcGFuPjsgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1 b3Q7YiZxdW90Ozwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjI8L3NwYW4+ XTxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsiPjs7PC9zcGFuPg0KICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1z dHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9u dC1zdHlsZTogaXRhbGljOyI+cmVmbDogZGVzY3JpYmUgdGhlIHR5cGUuPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KICAg IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlByaW50Ljwvc3Bhbj5zaG93IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwODI0ZjsiPn50PC9zcGFuPjpuYXRfdCAoPHNwYW4gc3R5bGU9ImNvbG9y OiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+Uzwvc3Bhbj4gKDxzcGFuIHN0 eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPlM8L3NwYW4+ ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5TPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5aPC9zcGFuPikpKQ0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCog PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ bHJ0OiBwcm92aWRlIHRoZSB0eXBlIGluZm8uPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhm NmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxlPSJj b2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+VGhlIGRvY3MgZm9yIHRwZiBh cmUgdG9vIG9ic2N1cmUsIGJ1dCBpdCdzIHRoZSBzYW1lIGtpbmQgb2YgbGlicmFyeS48L3NwYW4+ PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3Nw YW4+DQoNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5GbXQuPC9zcGFuPnN0ciA8 c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDslYVxuJnF1b3Q7PC9zcGFuPiAocHAg dCkgeyBmb28gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5Ob25lPC9zcGFuPjsgYmFyID0gWyA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0 MDA7Ij4mcXVvdDtmb28mcXVvdDs8L3NwYW4+IF0gfQ0KICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRh bGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+cmVwcjogYnVpbGQgJmFtcDsgcHJvdmlkZSB0aGUgdHlwZSBpbmZvLjwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bh bj4NCjwvcHJlPg0KPC9kaXY+DQo8cD5ldGMuIFRoZXNlIGtpbmRzIG9mIGFwcHJvYWNoZXMgYXJl IHByb2JhYmx5IGFsc28gcHJlc2VudCBpbiBvdGhlciBsaWJyYXJpZXMgdGhhdCBkbyBlLmcuIEpT T04gZW5jb2RpbmcuDQo8L3A+DQo8L2xpPjxsaT4NCjxwPkxpYnJhcmllcyB0aGF0IHVzZSBhIFBQ WCBhdCB0aGUgY2FsbCBzaXRlIHRvIHByb3ZpZGUgd2hhdCBsb29rcyBsaWtlIGFuIDxjb2RlPg0K J2EgLSZndDsgc3RyaW5nPC9jb2RlPiBmdW5jdGlvbiBhcyBpbiAoMSksIGJ1dCB0cnkgdG8gaW5m ZXIgdGhlIHR5cGUgb2YgdGhlIHZhbHVlIGJlaW5nIHNob3duIGFuZCBkZXJpdmUgaXRzIHByaW50 ZXIgYXMgaW4gKDIpLg0KPC9wPg0KPHA+VGhlc2UgZG9u4oCZdCBzZWVtIHRvIGhhbmRsZSBzZXBh cmF0ZSBjb21waWxhdGlvbiB3ZWxsLCBhcyBjb3VsZCBiZSBleHBlY3RlZCwgYW5kIGdlbmVyYWxs eSBhcHBlYXIgZnJhZ2lsZS4NCjwvcD4NCjxwPlRoZXNlIGFyZTogPC9wPg0KPG9sIGNsYXNzPSJv cmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wcm9nbWFuMS9nZW5wcmlu dGxpYiNyZWFkbWUiPjxiPkdlbnByaW50PC9iPjwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL3RzdWJhbWUtc3Avb2NhbWxfYXRfcCNyZWFkbWUiPjxiPk9DYW1sQHA8L2I+ PC9hPiA8L2xpPjwvb2w+DQo8L2xpPjwvb2w+DQo8cD5JbiBteSBvcGluaW9uLCBmb3IgdGhlIG5l ZWRzIEkgc2VlLCB0aGUgYmVzdCBhcHByb2FjaCB3b3VsZCBiZSBydW50aW1lIHByaW50aW5nIGFz IGluICgxKSB3aXRoIHJ1bnRpbWUgdHlwZSBpbmZvcm1hdGlvbiB0aGF0IGlzIGFjY2Vzc2libGUg dGhyb3VnaCBwb2ludGVycyBvciBpbmRpY2VzIHN0b3JlZCBpbiBPQ2FtbCBibG9ja3MuIEkgd29u ZGVyIGlmIHRoaXMgaXMgd2hhdCB0aGUgTGV4aUZpDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvaWRlYS1zdGFuZGFyZC1vY2FtbC1ydW50aW1lLXR5cGUtcmVwcmVzZW50YXRp b24vMTIwNTEvMiI+DQpmb3JrPC9hPiBkb2VzLiBAbm9qYj8gPC9wPg0KPHA+Rm9yIHRob3NlIGlu dGVyZXN0ZWQsIHdlIGRpZCB0aGUgbWFpbiBwYXJ0IG9mIHRoZSBjb21wYXJpc29uIG9uIDxhIGhy ZWY9Imh0dHBzOi8vd3d3LnR3aXRjaC50di92aWRlb3MvMTgwOTQzMzY3OT90PTAwaDE0bTIxcyI+ DQpzdHJlYW08L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnZTAzMjM2NyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2UwMzIzNjci Pk5pY29sYXMgT2plZGEgQmFyIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2UwMzIzNjciPg0KPGJsb2NrcXVvdGU+DQo8cD5JIHdvbmRlciBpZiB0 aGlzIGlzIHdoYXQgdGhlIExleGlGaSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvaWRlYS1zdGFuZGFyZC1vY2FtbC1ydW50aW1lLXR5cGUtcmVwcmVzZW50YXRpb24vMTIwNTEv MiI+DQpmb3JrIDwvYT5kb2VzLiBAbm9qYj8gPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+Tm90IGV4 YWN0bHkuIDwvcD4NCjxwPldlIGRvbuKAmXQgYXR0YWNoIHR5cGUgaW5mb3JtYXRpb24gdG8gdmFs dWVzIGRpcmVjdGx5LCBhcyB3ZSBkb27igJl0IHdhbnQgdG8gbW9kaWZ5IHRoZSBydW50aW1lIG1v ZGVsIG9mIE9DYW1sIChhbHNvLCB0aGlzIHdvdWxkIG9ubHkgd29yayB3aXRoIGhlYXAtYWxsb2Nh dGVkIHZhbHVlcywgd2hpY2ggd291bGQgYWxsIGJlY29tZSBsYXJnZXIpLg0KPC9wPg0KPHA+V2hh dCB3ZSBkbyBpbnN0ZWFkIGlzIHRoYXQgd2hlbiBhIGZ1bmN0aW9uIGhhcyBhIGxhYmVsZWQsIDxz cGFuIGNsYXNzPSJ1bmRlcmxpbmUiPg0Kbm9uLW9wdGlvbmFsPC9zcGFuPiBhcmd1bWVudCBvZiB0 eXBlIDxjb2RlPidhIHR0eXBlPC9jb2RlPiAoaGVyZSA8Y29kZT4nYSB0dHlwZTwvY29kZT4gaXMg dGhlIOKAnHR5cGUgb2YgdHlwZXPigJ0gd2l0aCBjb25zdHJ1Y3RvcnMgY29ycmVzcG9uZGluZyB0 byBlYWNoIGtpbmQgb2YgdHlwZSBpbiBPQ2FtbCkgYW5kIHRoZSBhcmd1bWVudCBpcyBub3QgcGFz c2VkIGV4cGxpY2l0bHksIHRoZW4gdGhlIGNvbXBpbGVyIHN5bnRoZXRpemVzIGl0IGF0IGVhY2gN CiBjYWxsc2l0ZS4gPC9wPg0KPHA+Q29uY3JldGVseSwgaWYgd2UgZGVmaW5lIGEgZnVuY3Rpb24g b2YgdGhlIGZvcm0gPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBj bGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+c2hv dzwvc3Bhbj4gfig8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij50PC9zcGFuPjo8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij4gJ2EgdHR5cGU8L3NwYW4+KSAoPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA3YTlmOyI+eDwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ICdh PC9zcGFuPikgOjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPiBzdHJpbmcgPC9zcGFuPj0N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPm1hdGNo PC9zcGFuPiB0IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij53aXRoPC9zcGFuPg0KICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3Vu ZC1jb2xvcjogI2ZjZjdlZjsiPkludDwvc3Bhbj4gLSZndDsgc3RyaW5nX29mX2ludCB4DQogIHwg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+ U3RyaW5nPC9zcGFuPiAtJmd0OyB4DQogIHwgLi4uDQo8L3ByZT4NCjwvZGl2Pg0KPHA+QW5kIHdl IGNhbGwgaXQgd2l0aCA8Y29kZT5zaG93IDQyPC9jb2RlPiwgdGhlIGNvbXBpbGVyIGluc2VydHMg PGNvZGU+fnQ6SW50PC9jb2RlPiBhcyBmaXJzdCBhcmd1bWVudC4gRm9yIGVmZmljaWVuY3ksIHR5 cGUgd2l0bmVzc2VzICh0aGUgdmFsdWVzIG9mIHR5cGUNCjxjb2RlPidhIHR0eXBlPC9jb2RlPikg YXJlIGFjdHVhbGx5IGNvbXB1dGVkIGF0IGNvbXBpbGF0aW9uLXRpbWUgd2hlbmV2ZXIgcG9zc2li bGUuDQo8L3A+DQo8cD5NYWtlcyBzZW5zZT8gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZzc2M2ZmYzgiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmc3NjNmZmM4Ij5MYXRlciBvbiwgTmljb2xhcyBPamVkYSBCYXIgc2FpZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNzYzZmZjOCI+DQo8cD5JIHNlZSB0 aGVyZSBpcyBhIGxvdCBvZiBlbnRodXNpYXNtIGZvciBhZGRpbmcgc29tZSBmb3JtIG9mIHR5cGUg cmVmbGVjdGlvbiB0byBPQ2FtbDsgdGhhdOKAmXMgZ3JlYXQhIEl0IGlzIHRydWUgdGhhdCBhdCBM ZXhpRmkgd2UgaGF2ZSBhIHRyaWVkLWFuZC10ZXN0ZWQgc3lzdGVtIGluIHVzZSBmb3IgYSBsb25n IHRpbWUuIExldCBtZSB0cnkgdG8gZ2l2ZSBzb21lIHBlcnNwZWN0aXZlIGFib3V0IGl0IGFuZCBh bnN3ZXIgc29tZSBvZiB0aGUgcXVlc3Rpb25zDQogdGhhdCBjYW1lIHVwOiA8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+VGhlIExleGlGaSBwYXRjaCBhY3R1YWxseSBjb25zaXN0cyBvZiB0 d28gcGFydHM6IDEpIHRoZSByZXByZXNlbnRhdGlvbiBvZiB0eXBlcyBhcyBhbiBPQ2FtbCBkYXRh dHlwZTsgMikgYSBwYXRjaCB0byB0aGUgdHlwZWNoZWNrZXIvbWlkZGxlIGVuZCB0byBoYXZlIHRo ZSBjb21waWxlciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIHR5cGUgd2l0bmVzc2VzIChhcyBza2V0 Y2hlZA0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L292ZXJ2aWV3LW9mLWxp YnJhcmllcy1mb3Itc2hvd2luZy1vY2FtbC12YWx1ZXMvMTIwNzYvMj91PW5vamIiPg0KYWJvdmU8 L2E+KS4gPC9saT48bGk+SXQgaXMgaW1wb3J0YW50IHRvIG5vdGUgdGhhdCAxKSBpcyB0byBhbiBl eHRlbnQgaW5kZXBlbmRlbnQgb2YgMik7IGl0IGNvbWVzIGRvd24gdG8gZ2l2aW5nIGEgc3VpdGFi bGUgZGVmaW5pdGlvbiBvZiB0aGUg4oCcdHlwZSBvZiB0eXBlc+KAnS4gSSB1bmRlcnN0YW5kIGZy b20gcGFzdCBkaXNjdXNzaW9uIHRoYXQgcHJvcG9zYWxzIGluIHRoaXMgZGlyZWN0aW9uIHdvdWxk IGJlIHdlbGNvbWUgYnkgdGhlIE9DYW1sIGRldiB0ZWFtLiBBY2NvcmRpbmdseSwNCiBvbmUgc2hv dWxkIGNvbmNlbnRyYXRlIGZvciB0aGUgbW9zdCBwYXJ0IGluIDEpIHRvIG1ha2UgcHJvZ3Jlc3Mu IDwvbGk+PGxpPkZvciBoaXN0b3JpY2FsIHJlYXNvbnMgdGhlIExleGlGaSB2ZXJzaW9uIG9mIDEp IChpZSB0aGUgdHlwZSByZXByZXNlbnRhdGlvbiwgc2VlDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vTGV4aUZpL2xydC9ibG9iLzAzOGZmOTYzYmQwNjZjOWQ5NGNmZmI5ODk2YjA0YjZiODY5 NmYxMzYvbGliL3N0eXBlLm1saSNMMTItTDI1Ij4NCmhlcmU8L2E+IGFuZCA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vTGV4aUZpL2xydC9ibG9iLzAzOGZmOTYzYmQwNjZjOWQ5NGNmZmI5ODk2 YjA0YjZiODY5NmYxMzYvbGliL3h0eXBlLm1saSNMMTYtTDM2Ij4NCmhlcmU8L2E+KSBoYXMgYSBu dW1iZXIgb2YgcXVpcmtzLiBGdXJ0aGVybW9yZSwgaXQgbWFrZXMgZGVzaWduIGNob2ljZXMgdGhh dCBtYXkgbm90IGJlIHRoZSBiZXN0IG9uZXMgaW4gZ2VuZXJhbC4gRm9yIGV4YW1wbGUsIGl0IG9u bHkgcmVwcmVzZW50cyBjbG9zZWQgdHlwZXM6IG5vIHR5cGUgY29uc3RydWN0b3JzIG9yIHR5cGUg dmFyaWFibGVzIGNhbiBiZSByZXByZXNlbnRlZCwgYW5kIHNvIGluIHBhcnRpY3VsYXIgbmVpdGhl ciBjYW4gZXhvdGljDQogdHlwZXMgc3VjaCBhcyBHQURUcywgZmlyc3QtY2xhc3MgbW9kdWxlcywg ZXh0ZW5zaWJsZSB0eXBlcywgcG9seW1vcnBoaWMgdmFyaWFudHMsIGV0Yy4NCjwvbGk+PGxpPlRo ZSA8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5tYWluPC9zcGFuPiBjaGFsbGVuZ2UgaW4gZGV2aXNp bmcgYSBzdWl0YWJsZSByZXByZXNlbnRhdGlvbiBvZiB0eXBlcyBpcyBkZWNpZGluZyBob3cgdG8g aGFuZGxlIGFic3RyYWN0IHR5cGVzIChzZWUgdGhlDQo8YSBocmVmPSJodHRwczovL3YyLm9jYW1s Lm9yZy9tZWV0aW5ncy9vY2FtbC8yMDEzL3Byb3Bvc2Fscy9ydW50aW1lLXR5cGVzLnBkZiI+cGFw ZXI8L2E+IGFuZCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vdjIub2NhbWwub3JnL21lZXRpbmdzL29j YW1sLzIwMTMvc2xpZGVzL2hlbnJ5LnBkZiI+c2xpZGVzPC9hPiBJIGxpbmtlZCB0byBpbg0KPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2lkZWEtc3RhbmRhcmQtb2NhbWwtcnVu dGltZS10eXBlLXJlcHJlc2VudGF0aW9uLzEyMDUxLzI/dT1ub2piIj4NCnRoZSBvdGhlciB0aHJl YWQ8L2E+KS4gQXQgTGV4aUZpIGFic3RyYWN0IHR5cGVzIGFyZSByZXByZXNlbnRlZCB2aWEg4oCc Z2xvYmFsIG5hbWVz4oCdIChpZSB3ZSBpZGVudGlmeSBhbiBhYnN0cmFjdCB0eXBlDQo8Y29kZT5N LnQ8L2NvZGU+IGJ5IGl0cyBuYW1lIDxjb2RlPiZxdW90O00udCZxdW90OzwvY29kZT4pLiBUaGlz IHdvcmtzIHJlYXNvbmFibHkgd2VsbCBpbiBwcmFjdGljZSwgYnV0IGlzIG5vdCBhIGdvb2Qgc29s dXRpb24gaW4gZ2VuZXJhbCAodGhlIG5vdGlvbiBvZiDigJxuYW1l4oCdIGZvciBhbiBhYnN0cmFj dCB0eXBlIGlzIG5vdCB3ZWxsLWRlZmluZWQpLiBJIHN1c3BlY3QgdGhlIGFuc3dlciBtYXkgYmUg c29tZXRoaW5nIG9mIGEgcmVzZWFyY2ggcHJvYmxlbeKApg0KPC9saT48bGk+TGV4aUZpIGRpZCBk aXNjdXNzIHVwc3RyZWFtaW5nIGEgdmVyc2lvbiBvZiBpdHMgZm9yayBsb25nIHRpbWUgYWdvICh+ MjAxMSksIGJ1dCBJIHN1c3BlY3QgaXQgd2FzbuKAmXQgZG9uZSBtYWlubHkgYmVjYXVzZSBvZiB0 aGUgdGhlb3JldGljYWwgc2hvcnRjb21pbmdzIG9mIHRoZSBjdXJyZW50IGltcGxlbWVudGF0aW9u IChlZyBoYW5kbGluZyBvZiBhYnN0cmFjdCB0eXBlcykuDQo8L2xpPjxsaT5BY2NvcmRpbmdseSwg dGhlIExleGlGaSBmb3JrIGlzIG5vdCBvcGVuLXNvdXJjZTogd2UgZG9u4oCZdCBoYXZlIHRoZSBt YW5wb3dlciB0byBzdXBwb3J0IGl0IGFzIGFuIG9wZW4tc291cmNlIHByb2plY3QsIHdlIGRvbuKA mXQgd2FudCB0byByZWxlYXNlIGEgdmVyc2lvbiBvZiB0aGlzIHRlY2hub2xvZ3kgd2hpY2ggaGFz IGtub3duIGxpbWl0YXRpb25zIHRoYXQgbWFrZSBpdCBlYXN5IHRvIHNob3QgeW91cnNlbGYgaW4g dGhlIGZvb3QgaWYgeW91DQogZG9u4oCZdCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgYW5kIGZp bmFsbHkgdGhlcmUgYXJlIHNvbWUgY29tbWVyY2lhbCBjb25zaWRlcmF0aW9ucyB0byB0YWtlIGlu dG8gYWNjb3VudCAoYnV0IG15IGltcHJlc3Npb24gaXMgdGhhdCBpZiB0aGlzIHRlY2hub2xvZ3kg d2FzIHBvbGlzaGVkIGVub3VnaCB0aGF0IGl0IGNvdWxkIGJlIGFjY2VwdGVkIHVwc3RyZWFtLCBM ZXhpRmkgd291bGQgYmUgaGFwcHkgdG8gZG8gc28pLg0KPC9saT48bGk+UGVyc29uYWxseSwgZnJv bSBhIGRpc3RhbmNlLCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vdGhpZXJyeS1tYXJ0aW5l ei9yZWZsIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS90aGllcnJ5LW1hcnRpbmV6L3JlZmw8L2E+IGxv b2tzIHJhdGhlciBpbnRlcmVzdGluZywgYnV0IGl0cyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vdGhpZXJyeS1tYXJ0aW5lei9yZWZsL2Jsb2IvbWFzdGVyL3J1bnRpbWUvZGVzYy5tbCI+DQp0 eXBlIHJlcHJlc2VudGF0aW9uPC9hPiBpcyBxdWl0ZSBjb21wbGV4IGFuZCBpcyBub3QgY2xlYXIg aXQgY2FuIGJlIG1hZGUgc3VpdGFibGUgZm9yIOKAnHByYWN0aWNhbOKAnSB1c2UuDQo8L2xpPjwv dWw+DQo8cD5JIGhvcGUgdGhpcyBhbnN3ZXJzIHNvbWUgb2YgdGhlIHF1ZXN0aW9ucyEgPC9wPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPmtjYXMgYW5kIGtjYXNfZGF0YSAwLjMuMDogU29m dHdhcmUgVHJhbnNhY3Rpb25hbCBNZW1vcnk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1rY2FzLWFuZC1rY2FzLWRhdGEtMC0zLTAtc29mdHdhcmUtdHJhbnNhY3Rp b25hbC1tZW1vcnkvMTIwODUvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWtj YXMtYW5kLWtjYXMtZGF0YS0wLTMtMC1zb2Z0d2FyZS10cmFuc2FjdGlvbmFsLW1lbW9yeS8xMjA4 NS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhODNi Njg2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYTgzYjY4NiI+VmVzYSBLYXJ2b25l biBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2E4M2I2ODYiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhhdCwgYXMgb2YgdmVyc2lv biAwLjMuMCwgPGEgaHJlZj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9rY2FzLyI+ DQo8Y29kZT5rY2FzPC9jb2RlPjwvYT4gY2FuIGJlIGNvbnNpZGVyZWQgdG8gYmUgYSBzb2Z0d2Fy ZSB0cmFuc2FjdGlvbmFsIG1lbW9yeSAoU1RNKSBpbXBsZW1lbnRhdGlvbiBiYXNlZCBvbiBsb2Nr LWZyZWUgbXVsdGktd29yZCBjb21wYXJlLWFuZC1zZXQgKE1DQVMpLg0KPC9wPg0KPHA+VGhlIG1h aW4gZmVhdHVyZSBhZGRlZCBpbiAwLjMuMCBpcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwtbXVsdGljb3JlL2tjYXMvI2Jsb2NraW5nLXRyYW5zYWN0aW9ucyI+DQp0aGUgYWJpbGl0 eSB0byBibG9jazwvYT4g4oCUIGluIGEgc2NoZWR1bGVyIGZyaWVuZGx5IG1hbm5lciDigJQgYXdh aXRpbmcgZm9yIGNoYW5nZXMgdG8gc2hhcmVkIG1lbW9yeSBsb2NhdGlvbnMuDQo8L3A+DQo8cD5M ZXTigJlzIGV4cGxvcmUgdGhpcyBieSB3cml0aW5nIGEgc2hvcnQgZXhhbXBsZSB3aXRoIHRoZSBo ZWxwIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yZWFsd29ybGRvY2FtbC9tZHgiPg0K TURYPC9hPi4gKFllcywgSeKAmW0gYWN0dWFsbHkgdGVzdGluZyB0aGlzIGFubm91bmNlbWVudC4p IDwvcD4NCjxwPkZpcnN0IHdl4oCZbGwgcmVxdWlyZSBhbmQgb3BlbiB0aGUgPGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2tjYXMvZG9jL2tjYXNfZGF0YS9LY2FzX2Rh dGEvaW5kZXguaHRtbCI+DQo8Y29kZT5rY2FzX2RhdGE8L2NvZGU+PC9hPiBsaWJyYXJ5OiA8L3A+ DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9j YW1sIj4jICNyZXF1aXJlIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2tjYXNf ZGF0YSZxdW90Ozwvc3Bhbj4NCiMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPktj YXNfZGF0YTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+DQo8cD48Y29kZT5rY2FzX2RhdGE8L2NvZGU+ IGdpdmVzIHVzIGEgbnVtYmVyIG9mIGRvbWFpbiBzYWZlIGFuZCBjb21wb3NhYmxlIGRhdGEgc3Ry dWN0dXJlcyBhbmQgY29tbXVuaWNhdGlvbiBhbmQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMs IHN1Y2ggYXMgYQ0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0aWNvcmUuZ2l0aHViLmlvL2tj YXMvZG9jL2tjYXNfZGF0YS9LY2FzX2RhdGEvUXVldWUvaW5kZXguaHRtbCI+DQo8Y29kZT5RdWV1 ZTwvY29kZT48L2E+IGFuZCBhIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1 Yi5pby9rY2FzL2RvYy9rY2FzX2RhdGEvS2Nhc19kYXRhL1Byb21pc2UvaW5kZXguaHRtbCI+DQo8 Y29kZT5Qcm9taXNlPC9jb2RlPjwvYT4sIGZvciBjb25jdXJyZW50IHByb2dyYW1taW5nLiA8L3A+ DQo8cD5MZXTigJlzIHRoZW4gY3JlYXRlIGEgbWVzc2FnZSBxdWV1ZTogPC9wPg0KPGRpdiBjbGFz cz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+IyA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5ncmVldGVyX3F1ZXVlPC9zcGFuPiA9IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlF1ZXVlLjwvc3Bhbj5jcmVhdGUgKCkNCjxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij52YWw8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPmdyZWV0ZXJfcXVldWU8L3NwYW4+IDogJ193ZWFrMSA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5LY2FzX2RhdGEuUXVldWUuPC9zcGFuPnQgPSAm bHQ7YWJzdHImZ3Q7DQo8L3ByZT4NCjwvZGl2Pg0KPHA+QW5kIHNwYXduIGEg4oCcZ3JlZXRlcuKA nSBkb21haW4gdGhhdCByZXNwb25kcyB0byBtZXNzYWdlcyB3aXRoIGEgZ3JlZXRpbmc6IDwvcD4N CjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2Nh bWwiPiMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxl dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+Z3JlZXRlcl9kb21haW48L3Nw YW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RG9tYWluLjwvc3Bhbj5zcGF3biA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij5AQDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gKCkgLSZndDsNCiAgICA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFu PiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+cmVjPC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5sb29wPC9zcGFuPiAoKSA9DQogICAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bWF0Y2g8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlF1ZXVlLjwvc3Bhbj50YWtlX2Js b2NraW5nIGdyZWV0ZXJfcXVldWUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdl aWdodDogYm9sZDsiPndpdGg8L3NwYW4+DQogICAgICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0 MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPmBDbG9zZTwvc3Bhbj4gLSZndDsgKCkN CiAgICAgIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAj ZmNmN2VmOyI+YEdyZWV0PC9zcGFuPiAodGFyZ2V0LCByZXNvbHZlcikgLSZndDsNCiAgICAgICAg PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJvbWlzZS48L3NwYW4+cmVzb2x2ZSByZXNv bHZlciAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJpbnRmLjwvc3Bhbj5zcHJpbnRm IDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O0hlbGxvLCAlcyEmcXVvdDs8L3Nw YW4+IHRhcmdldCk7DQogICAgICAgIGxvb3AgKCkNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgbG9vcCAoKQ0KPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnZhbDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+Z3JlZXRlcl9kb21haW48L3NwYW4+IDogdW5pdCA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Eb21haW4uPC9zcGFuPnQgPSAmbHQ7YWJzdHIm Z3Q7DQo8L3ByZT4NCjwvZGl2Pg0KPHA+TGV04oCZcyBhbHNvIGNyZWF0ZSBhIGhlbHBlciBmdW5j dGlvbiwgPGNvZGU+Z3JlZXQ8L2NvZGU+LCB0byBpbnRlcmFjdCB3aXRoIHRoZSBncmVldGVyOg0K PC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNy Yy1vY2FtbCI+IyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5ncmVldDwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+dGFyZ2V0PC9zcGFuPiA9DQogICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cHJvbWlzZTwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnJlc29sdmVyPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPlByb21pc2UuPC9zcGFuPmNyZWF0ZSAoKSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+UXVldWUuPC9zcGFuPmFkZCAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIx OyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+YEdyZWV0PC9zcGFuPiAodGFyZ2V0LCByZXNv bHZlcikpIGdyZWV0ZXJfcXVldWU7DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ UHJvbWlzZS48L3NwYW4+YXdhaXQgcHJvbWlzZQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAw OyBmb250LXdlaWdodDogYm9sZDsiPnZhbDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2 MDFmOyI+Z3JlZXQ8L3NwYW4+IDogc3RyaW5nIC0mZ3Q7IHN0cmluZyA9ICZsdDs8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiZndDsNCjwv cHJlPg0KPC9kaXY+DQo8cD5Ob3cgd2UgY2FuIGNhbGwgdGhlIGdyZWV0ZXIsIHdoaWNoIGlzIHJ1 bm5pbmcgaW4gYW5vdGhlciBkb21haW4sIGFzIGlmIGl0IHdhcyBhIHJlZ3VsYXIgZnVuY3Rpb24u IFNvLCBoZXJlIGlzIHRvIHlvdToNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVy Ij4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPiMgZ3JlZXQgPHNwYW4gc3R5bGU9ImNvbG9y OiAjY2EzNDAwOyI+JnF1b3Q7ZmVsbG93IGNvbmN1cnJlbnQgcHJvZ3JhbW1lciZxdW90Ozwvc3Bh bj4NCi0gOiBzdHJpbmcgPSA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtIZWxs bywgZmVsbG93IGNvbmN1cnJlbnQgcHJvZ3JhbW1lciEmcXVvdDs8L3NwYW4+DQo8L3ByZT4NCjwv ZGl2Pg0KPHA+QW5kIGV2ZXJ5b25lIGVsc2U6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29u dGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPiMgZ3JlZXQgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7dGhlIHJlc3Qgb2YgdGhlIHdvcmxkJnF1b3Q7PC9zcGFu Pg0KLSA6IHN0cmluZyA9IDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O0hlbGxv LCB0aGUgcmVzdCBvZiB0aGUgd29ybGQhJnF1b3Q7PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxw PkxldOKAmXMgbm90IGZvcmdldCB0byBjbGVhbiB1cDogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNy Yy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+IyA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5RdWV1ZS48L3NwYW4+YWRkIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0 MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPmBDbG9zZTwvc3Bhbj4gZ3JlZXRlcl9x dWV1ZQ0KLSA6IHVuaXQgPSAoKQ0KIyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Eb21h aW4uPC9zcGFuPmpvaW4gZ3JlZXRlcl9kb21haW4NCi0gOiB1bml0ID0gKCkNCjwvcHJlPg0KPC9k aXY+DQo8cD5UaGUgYmxvY2tpbmcgbWVjaGFuaXNtIGluIDxjb2RlPmtjYXM8L2NvZGU+IGRvZXMg bm90IG9ubHkgd29yayB3aXRoIHBsYWluIGRvbWFpbnMgYW5kIHN5c3RocmVhZHMuIEl0IGNhbiBh bHNvIHdvcmsgYWNyb3NzIHNjaGVkdWxlcnMgc3VjaCBhcw0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2ludGVyYWN0aW9uLWJldHdlZW4tZWlvLWFuZC1kb21haW5zbGliLXVu aGFuZGxlZC1leGNlcHRpb25zLzExOTcxLzEwIj4NCkVpbyBhbmQgRG9tYWluc2xpYjwvYT4sIHdo aWNoIGJvdGggcmVjZW50bHkgbWVyZ2VkIHN1cHBvcnQgZm9yIGl0IGFuZCBzaG91bGQgc29vbiBo YXZlIHRoZSBuZWNlc3Nhcnkgc3VwcG9ydCBvdXQtb2YtdGhlLWJveC4NCjwvcD4NCjxwPkZpbmFs bHksIG9uZSBtaWdodCBhc2sgd2hhdCBpcyB0aGUgY29zdCBvZiBhbGwgdGhpcz8gPC9wPg0KPHA+ SXQgdHVybnMgb3V0IHRoYXQgYWZ0ZXIgc29tZSBjYXJlZnVsIG9wdGltaXphdGlvbnMsIDxjb2Rl PmtjYXM8L2NvZGU+IHBlcmZvcm1zIHByZXR0eSBtdWNoIGFzIHdlbGwgYXMgaXQgdXNlZCB0by4g QXMgYSByYW5kb20gZGF0YSBwb2ludCwgYXQgdGhlIHRpbWUgb2Ygd3JpdGluZyB0aGlzLCB0aGUN Cjxjb2RlPlF1ZXVlPC9jb2RlPiBwcm92aWRlZCBieSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgPGNv ZGU+a2Nhc19kYXRhPC9jb2RlPiBjYW4gYWN0dWFsbHkgYmUgZmFzdGVyIHRoYW4gdGhlIE1pY2hh ZWwtU2NvdHQgcXVldWUgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgbGF0ZXN0IHZlcnNpb24gb2YN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbG9ja2ZyZWUiPjxj b2RlPmxvY2tmcmVlPC9jb2RlPjwvYT46IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJv cmc0YzcwMzJhIj4NCktjYXNfZGF0YS5RdWV1ZSA6IG1lYW4gPSAwLjAwNTk4NSwgc2QgPSAwLjAw MDAwMSB0cD01MDEyMTkzNy44MTIxOTQNCkxvY2tmcmVlLk1TUXVldWU6IG1lYW4gPSAwLjAxMzk3 Niwgc2QgPSAwLjAwMDAwMSB0cD0yMTQ2NTAwMC4zNTgyMzYNCjwvcHJlPg0KPHA+RG9u4oCZdCBi ZSBmb29sZWQsIGhvd2V2ZXIuIEl0IGlzIGNsZWFyIHRoYXQgdGhlIGNvbXBvc2FiaWxpdHkgb2Yg PGNvZGU+a2NhczwvY29kZT4gYWRkcyBvdmVyaGVhZCDigJQgcHJvYmFibHkgc29tZXRoaW5nIGdl bmVyYWxseSBiZXR3ZWVuIDF4IHRvIDR4IGluIHRpbWUgYW5kIHNwYWNlIOKAlCBjb21wYXJlZCB0 byBub24tY29tcG9zYWJsZSBsb2NrLWZyZWUgZGF0YSBzdHJ1Y3R1cmVzIHVzaW5nIHBsYWluIH5B dG9taWN+cyBhbmQgaXQgaGFzIGFscmVhZHkNCiBiZWVuIGRlbW9uc3RyYXRlZCB0aGF0IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbG9ja2ZyZWUvcHVsbC8zNSNp c3N1ZWNvbW1lbnQtMTQ3OTg4MzAyMiI+DQphIG11Y2ggZmFzdGVyIHZlcnNpb24gb2YgdGhlIE1p Y2hhZWwtU2NvdHQgcXVldWU8L2E+IGNvdWxkIGJlIGltcGxlbWVudGVkLiA8L3A+DQo8cD5OZXZl cnRoZWxlc3MsIHRoZSB0YWtlIGhvbWUgbWVzc2FnZSBpcyB0aGF0IFNUTSBjb3VsZCB2ZXJ5IHdl bGwgYmUgZmFzdCBlbm91Z2ggZm9yIHlvdXIgYXBwbGljYXRpb24uIFRoZSBleHRyYSBuYW5vc2Vj b25kcyBhcmUgcHJvYmFibHkgbm90IGdvaW5nIHRvIGJlIHRoZSBtYWluIGJvdHRsZW5lY2tzIGlu IG1vc3QgY29uY3VycmVudCBwcm9ncmFtcy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjNDdjYTRiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnYzQ3Y2E0YiI+U2lkIEtzaGF0cml5YSBhc2tlZCBhbmQgVmVzYSBLYXJ2b25lbiByZXBs aWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjNDdjYTRi Ij4NCjxibG9ja3F1b3RlPg0KPHA+VGhhbmtzIGZvciB0aGUgcmVhZGFibGUgZXhhbXBsZSEgQWxz byB2ZXJ5IGludGVyZXN0aW5nIHRvIHJlYWQgYmxvY2tpbmcgdHJhbnNhY3Rpb25zIHBvcnRpb24g ZXNwZWNpYWxseSBvZg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29y ZS9rY2FzLyNibG9ja2luZy10cmFuc2FjdGlvbnMiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t dWx0aWNvcmUva2Nhcy8jYmxvY2tpbmctdHJhbnNhY3Rpb25zPC9hPiAhDQo8L3A+DQo8cD5DYW4g eW91IGV4cGxhaW4gaG93IHRoaXMgaXMgaW50ZWdyYXRlZCB3aXRoIEVpbyBicmllZmx5IOKAkyBJ IGtub3cgeW91IGhhdmUgYWRkZWQgYSBsaW5rIGJ1dCB0aGUgZGlzY3Vzc2lvbiB0aGVyZSBpcyBx dWl0ZSBkZXRhaWxlZOKApg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+SXQgaXMgcHJldHR5IHNp bXBsZS4gPC9wPg0KPHA+RExBICg8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL2RvbWFpbi1sb2NhbC1hd2FpdC8iPmRvbWFpbi1sb2NhbC1hd2FpdDwvYT4pIGJhc2lj YWxseSBzdG9yZXMsIGluIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly92Mi5vY2FtbC5vcmcvYXBpL0Rv bWFpbi5ETFMuaHRtbCI+RExTPC9hPiwgYSBkb21haW4gKG9yIHN5c3RocmVhZCkgc3BlY2lmaWMg ZnVuY3Rpb24gdGhhdCBpbXBsZW1lbnRzIHRoZSBibG9ja2luZyBtZWNoYW5pc20uIEluc2lkZSBh IHNjaGVkdWxlciBsaWtlIEVpbyAoYW5kIERvbWFpbnNsaWIgYW5kIHByZXR0eSBtdWNoIGFueSBp bWFnaW5hYmxlIHNjaGVkdWxlcikgdGhlcmUgaXMgYSBsb29wIChydW5uaW5nIGluIGVhY2gNCiBk b21haW4gbWFuYWdlZCBieSB0aGUgc2NoZWR1bGVyKSB0aGF0IHRha2VzIHJlYWR5IGZpYmVycyBm cm9tIGEgcXVldWUgb3Igc29tZSBvdGhlciBjb2xsZWN0aW9uIGFuZCBydW5zIHRoZW0gb24gdGhl IGRvbWFpbi4gSnVzdCBiZWZvcmUgZW50ZXJpbmcgdGhhdCBsb29wLCBFaW8gaW5zdGFsbHMgYW4g RWlvIHNwZWNpZmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBibG9ja2luZyBtZWNoYW5pc20gZm9y IERMQS4gVGhhdCBFaW8gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24NCiBvZiBibG9ja2luZyB1c2Vz IHRoZSBhbGdlYnJhaWMgZWZmZWN0cyAoYW5kIGNhbmNlbGxhdGlvbiBwcm90b2NvbCkgdGhhdCBF aW8gbm9ybWFsbHkgdXNlcyBmb3IgYmxvY2tpbmcuIFRoZSBzdXBwb3J0IGZvciBEb21haW5zbGli IHdvcmtzIHRoZSBzYW1lIHdheSDigJQgYmVmb3JlIGRvbWFpbnNsaWIgZW50ZXJzIHRoZSBsb29w IHJ1bm5pbmcgcmVhZHkgRG9tYWluc2xpYiB0YXNrcywgYSBEb21haW5zbGliIHNwZWNpZmljIGJs b2NraW5nIGltcGxlbWVudGF0aW9uDQogaXMgaW5zdGFsbGVkIGZvciBETEEuIDwvcD4NCjxwPkEg c2luZ2xlIHByb2dyYW0gY2FuIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IGRvbWFpbnMgcnVubmlu ZyBkaWZmZXJlbnQgc2NoZWR1bGVycy4gQSBsaWJyYXJ5IGxpa2UNCjxjb2RlPmtjYXM8L2NvZGU+ LCB0aGF0IGp1c3Qgd2FudHMgdG8gYmUgYWJsZSB0byBibG9jaywgY2FuIHRoZW4gb2J0YWluIHRo ZSBibG9ja2luZyBpbXBsZW1lbnRhdGlvbiBmcm9tIERMQSB3aXRob3V0IGRpcmVjdGx5IGRlcGVu ZGluZyBvbiB0aGUgc2NoZWR1bGVyLg0KPC9wPg0KPHA+TW9zdCBwZW9wbGUgc2hvdWxkIG5vdCBu ZWVkIHRvIGtub3cgYW55dGhpbmcgYWJvdXQgRExBLiBJdCBzaG91bGQgYmUgY29uc2lkZXJlZCBh biBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgYW5kLCBpbiB0aGUgZnV0dXJlLCB3ZSBt aWdodCB1c2Ugc29tZSBvdGhlciBzdGFuZGFyZCBibG9ja2luZyBtZWNoYW5pc20uIEFuIGFkdmFu dGFnZSBvZiBETEEgaXMgdGhhdCBpdCBjYW4gYmUgbWFkZSB0byB3b3JrIHRvZGF5IHdpdGhvdXQg Y2hhbmdlcw0KIHRvIHRoZSBydW50aW1lIG9yIFN0ZGxpYi4gRExBIGlzIGFsc28gcmVsYXRpdmVs eSBub24taW50cnVzaXZlLiBJdCBkb2VzbuKAmXQgcmVxdWlyZSBtYWtpbmcgZXh0ZW5zaXZlIGNo YW5nZXMgdG8gYSBzY2hlZHVsZXIgYW5kIGluc3RhbGxpbmcgdGhlIHN1cHBvcnQgaXMgZXNzZW50 aWFsbHkgZnJlZSDigJQgaXQganVzdCB0YWtlcyBhIGZldyB3b3JkcyBvZiBtZW1vcnkgcGVyIGRv bWFpbi4gRExBIHNob3VsZCBhbHNvIGJlIGZ1dHVyZSBwcm9vZiBzdWNoDQogdGhhdCBvbmNlIGEg c3RhbmRhcmQgYmxvY2tpbmcgYXBwcm9hY2ggZW1lcmdlcywgaXQgc2hvdWxkIGJlIHBvc3NpYmxl IHRvIGNoYW5nZSB0aGUgZGVmYXVsdCBETEEgaW1wbGVtZW50YXRpb24gdG8gdXNlIHRoZSBzdGFu ZGFyZCBibG9ja2luZyBtZWNoYW5pc20uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MyI+T0NhbWwub3JnIE5ld3NsZXR0ZXI6IE1hcmNoIDIwMjM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy1uZXdzbGV0dGVyLW1hcmNoLTIwMjMvMTIwOTAv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3NsZXR0ZXItbWFy Y2gtMjAyMy8xMjA5MC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzlhYjhmMzQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc5YWI4ZjM0Ij5U aGliYXV0IE1hdHRpbyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzlhYjhmMzQiPg0KPHA+V2VsY29tZSB0byB0aGUgaW5hdWd1cmFsIGVkaXRp b24gb2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyISA8L3A+DQo8cD5Gb2xsb3dpbmcgdGhlIGV4 YW1wbGUgb2YgdGhlIG5vdy1yZXRpcmVkIE11bHRpY29yZSBtb250aGxpZXMsIGFuZCB0aGUgQ29t cGlsZXIgbmV3c2xldHRlciwgd2XigJlsbCBiZSBydW5uaW5nIGEgbW9udGhseSBuZXdzbGV0dGVy IG9uIHRoZSBwcm9ncmVzcyB3ZeKAmXJlIG1ha2luZyBvbiB0aGUgZGV2ZWxvcG1lbnQgb2YgT0Nh bWwub3JnLg0KPC9wPg0KPHA+VGhpcyBuZXdzbGV0dGVyIGhhcyBiZWVuIGNvbXBpbGVkIGJ5IEBz YWJpbmUgYW5kIEB0bWF0dGlvIGFuZCBvZmZlcnMgYSByZWNhcOKAmSBvZiB0aGUgd29yayB3ZeKA mXZlIGJlZW4gZG9pbmcgb24gT0NhbWwub3JnIGluIE1hcmNoLg0KPC9wPg0KPHA+V2UgaGlnaGxp Z2h0IHRoZSB3b3JrIHdl4oCZdmUgYmVlbiBkb2luZyBpbiB0aHJlZSBkaXN0aW5jdCBhcmVhczog PC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxiPlBhY2thZ2UgRG9jdW1lbnRhdGlvbjwv Yj46IEZvbGxvd2luZyB1c2VyIGZlZWRiYWNrLCBpbiB0aGUgcGFzdCBtb250aHMsIHdl4oCZdmUg YmVlbiBmb2N1c2luZyBvbiBpbXByb3ZpbmcgdGhlIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBhcmVh LiBJdCBzdGFydGVkIGVhcmxpZXIgdGhpcyB5ZWFyIHdpdGggdGhlIHRlYW0gcnVubmluZyBhIHN1 cnZleSBhbmQgdXNlciBpbnRlcnZpZXdzLCBhbmQgd2XigJlyZSBuZWFyaW5nIHRoZSBlbmQgb2Yg dGhlDQogaW1wcm92ZW1lbnRzLiA8L2xpPjxsaT48Yj5MZWFybiBBcmVhPC9iPjogQXMgYSBuZXh0 IG1pbGVzdG9uZSBhZnRlciBpbXByb3ZpbmcgdGhlIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiwgd2Ug c3RhcnRlZCB3b3JrIG9uIHRoZSBsZWFybiBhcmVhIHdpdGggdGhlIGFpbSB0byBpbXByb3ZlIHRo ZSBsZWFybmluZyBleHBlcmllbmNlIG9mIG5ldyBPQ2FtbCB1c2VycyBhbmQgb2ZmZXIgbmV3IGRv Y3VtZW50YXRpb24gcmVzb3VyY2VzIHRvIGJvdGggYmVnaW5uZXJzIGFuZCBleHBlcmllbmNlZA0K IGRldmVsb3BlcnMuIDwvbGk+PGxpPjxiPkdlbmVyYWwgTWFpbnRlbmFuY2U8L2I+OiBXZSBhbHNv IHdvcmtlZCBvbiBnZW5lcmFsIG1haW50ZW5hbmNlIGFuZCBpbXByb3ZlbWVudHMsIGFuZCB3ZeKA mWxsIGhpZ2hsaWdodCBzb21lIG9mIHRoZW0uDQo8L2xpPjwvdWw+DQo8cD5NYW55IHRoYW5rcyB0 byBhbGwgb2YgdGhlIGNvbW11bml0eSBtZW1iZXJzIHdobyBjb250cmlidXRlZCBieSBwYXJ0aWNp cGF0aW5nIGluIHN1cnZleXMsIGdpdmluZyBmZWVkYmFjayBvbiBEaXNjdXNzLCBhbmQgb3Blbmlu ZyBpc3N1ZXMgYW5kIFB1bGwgUmVxdWVzdHMhIFlvdXIgY29udHJpYnV0aW9ucyBhbmQgZmVlZGJh Y2sgZW5hYmxlIHVzIHRvIG1ha2UgcHJvZ3Jlc3Mgb24gbWFraW5nIE9DYW1sLm9yZyB0aGUgYmVz dCByZXNvdXJjZSB0bw0KIGxlYXJuIE9DYW1sIGFuZCBkaXNjb3ZlciBPQ2FtbCBwYWNrYWdlcyEg PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwMmUzODk2IiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMDJlMzg5NiI+UGFja2FnZSBEb2N1bWVudGF0aW9u PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcwMmUzODk2Ij4N CjxwPldoZW4gd2Ugc3RhcnRlZCB0byB3b3JrIG9uIHRoZSBwYWNrYWdlIGRvY3VtZW50YXRpb24g bmF2aWdhdGlvbiwgd2UgcmVhY2hlZCBvdXQgdG8gdGhlIGNvbW11bml0eSBvbiB0aGUgT0NhbWwg RGlzY3VzcyBmb3J1bXMgd2l0aCBhIHN1cnZleSBvbiB0aGUgUGFja2FnZSBhbmQgTGVhcm4gYXJl YXMgb24gT0NhbWwub3JnLiBUaGUgZ29hbCBiZWhpbmQgdGhpcyB3YXMgdG8gZW5hYmxlIG91ciBu ZXcgdGVhbSBtZW1iZXIsIGEgVVgvVUkgZGVzaWduZXIsDQogdG8gcXVpY2tseSBnZXQgdXAgdG8g c3BlZWQgYW5kIG1ha2UgaW1wYWN0ZnVsIGNvbnRyaWJ1dGlvbnMgdG8gT0NhbWwub3JnLiBUaGFu a3MgdG8gdGhlIGFjdGl2ZSBwYXJ0aWNpcGF0aW9uIG9mIHRoZSBjb21tdW5pdHksIHRoaXMgdHVy bmVkIG91dCB0byBiZSBhIGhpZ2hseSBlZmZlY3RpdmUgbWV0aG9kIHRvIGlkZW50aWZ5IHRoZSBt b3N0IGltcGFjdGZ1bCBpc3N1ZXMgdG8gd29yayBvbi4NCjwvcD4NCjxwPlRoaXMgbW9udGgsIHdl IGNvbXBsZXRlZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3Ry ZWUvbWFpbi9kb2MvcGVyc29uYXMubWQiPg0KcGVyc29uYXM8L2E+IHJlcHJlc2VudGluZyBkaWZm ZXJlbnQgdHlwZXMgb2YgdXNlcnMgd2hpY2ggaW5jbHVkZXMgbWlkLWxldmVsIGRldmVsb3Blciwg c3R1ZGVudCwgdGVhbSBsZWFkLCBzZW5pb3IgZGV2ZWxvcGVyLCBhY2FkZW1pYyBpbnN0cnVjdG9y L3Jlc2VhcmNoZXIuDQo8L3A+DQo8cD5XZSBkZXNpZ25lZCB0aGUgVUkgYW5kIHVzZXIgZmxvd3Mg Zm9yIHR3byBwb3NzaWJsZSBkZXNpZ24gb3B0aW9ucyBvZiB0aGUgcGFja2FnZSBzZWN0aW9uICh3 aGljaCBpbmNsdWRlcyB0aGUgcGFja2FnZSBvdmVydmlldyBwYWdlLCBwYWNrYWdlIGRvY3VtZW50 YXRpb24sIHRoZSBwYWNrYWdlIHNlYXJjaCByZXN1bHRzLCBhcyB3ZWxsIGFzIGFuIHVwY29taW5n IHBhZ2UgdGhhdCBsaXN0cyBhbGwgdmVyc2lvbnMgb2YgYSBwYWNrYWdlKS4gWW91DQogY2FuIGFj Y2VzcyB0aGUgZGVzaWducyBvbiA8YSBocmVmPSJodHRwczovL3d3dy5maWdtYS5jb20vZmlsZS9B cWs1eTAzZnNhQ3VoVFN5d21tWTA2L09DYW1sLm9yZy1QdWJsaWMtRGVzaWducyI+DQpGaWdtYTwv YT4uIDwvcD4NCjxwPldl4oCZdmUgYmVlbiBtYWtpbmcgZ29vZCBwcm9ncmVzcyBvbiBhIChsb3ct ZmlkZWxpdHkpIGltcGxlbWVudGF0aW9uIG9mIHRoZSBkZXNpZ25zIHdlIGhhdmUgaW4gRmlnbWEs IGFuZCB3ZSBzdGlsbCBoYXZlIGEgZmV3IFVJIGVsZW1lbnRzIHRvIHJld29yayB0byBhbGlnbiB0 aGUgc2l0ZSB0byB0aGUgZGVzaWducy4NCjwvcD4NCjxwPlJlbGV2YW50IFBScy9Jc3N1ZXM6IDwv cD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5XZSBub3cgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzk5NCI+ZGlzcGxheSBSRUFETUUvQ0hBTkdFTE9H L0xJQ0VOU0Ugb24gdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgbGF5b3V0PC9hPiwgaW5zdGVhZCBvZiB3 aXRoaW4gdGhlIGRvY3VtZW50YXRpb24gbGF5b3V0LiBUaGlzIGJldHRlciByZWZsZWN0cyB0aGVp ciBzdGF0dXMgYXMg4oCcZmlsZXMgdGhhdCBhY2NvbXBhbnkgdGhlIHBhY2thZ2XigJ0uDQo8L2xp PjxsaT5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs Lzk4NiI+c291cmNlIGNvZGUgZG93bmxvYWQgYnV0dG9uIGFuZCBzb3VyY2UgaGFzaCBkaXNwbGF5 IHdhcyByZXdvcmtlZDwvYT4gdG8gaGF2ZSBhIGJldHRlciBVWC4NCjwvbGk+PGxpPjxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC85ODciPlRoZSBwYWNrYWdl IG92ZXJ2aWV3IHBhZ2Ugd2FzIHJlYXJyYW5nZWQ8L2E+LiBUaGlzIGltcHJvdmVzIHRoZSBzdHls aW5nIGFuZCBwbGFjZW1lbnQgb2YgZGVwZW5kZW5jaWVzLCB0YWdzLCBkZXNjcmlwdGlvbiwgcHVi bGljYXRpb24gZGF0ZS4NCjwvbGk+PGxpPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTAwMSI+YXV0aG9ycy9tYWludGFpbmVycyBkaXNwbGF5IHdh cyBpbXByb3ZlZDwvYT4gdG8gKDEpIHJlbmRlciBhbiBhdXRvbWF0aWNhbGx5LWdlbmVyYXRlZCBh dmF0YXIgaWYgd2UgZG9u4oCZdCBoYXZlIG9uZSBmb3IgdGhlIGdpdmVuIHVzZXIsIGFuZCAoMikg aGlkZSBleGNlc3NpdmUgYW1vdW50cyBvZiBhdXRob3JzL21haW50YWluZXJzIGJlaGluZA0KIGEg 4oCcc2hvdyBtb3Jl4oCdIGJ1dHRvbi4gPC9saT48bGk+VG8gbWFrZSBpdCBlYXNpZXIgdG8gc2Nh biBmb3IgcmVsZXZhbnQgZGVwZW5kZW5jaWVzLCB3ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAwNiI+DQpzZXBhcmF0ZSB0aGUgZGVwZW5kZW5jaWVz IGludG8g4oCcZGV2ZWxvcG1lbnQgZGVwZW5kZW5jaWVz4oCdIGFuZCByZWd1bGFyIGRlcGVuZGVu Y2llczwvYT4NCjwvbGk+PGxpPkFmdGVyIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8xMDAzIj5tb3ZpbmcgdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgc2lkZWJh ciB0byB0aGUgbGVmdDwvYT4sIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IHBhZ2UgYW5kIHRoZSBwYWNr YWdlIGRvY3VtZW50YXRpb24gcGFnZSB3ZXJlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTAxNSI+dW5pZmllZCB0byB1c2UgdGhlIHNhbWUgbGF5b3V0 PC9hPg0KPC9saT48bGk+V2Ugbm93IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8xMDE3Ij5yZW5kZXIgYSB0YWJsZSBvZiBjb250ZW50cyBvbiB0aGUgcGFj a2FnZSBvdmVydmlldyBwYWdlczwvYT4NCjwvbGk+PC9vbD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmMzQwZTRkIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnZjM0MGU0ZCI+TGVhcm4gQXJlYTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnZjM0MGU0ZCI+DQo8cD5XZSBzdGFydGVkIHRoZSBkaXNjb3Zlcnkg cGhhc2UgaW4gd2hpY2ggd2UgYXJlIHRha2luZyBpbnZlbnRvcnkgb2YgdGhlIGN1cnJlbnQgY29u dGVudCBhbmQgc3RydWN0dXJlIG9mIHRoZSBPQ2FtbC5vcmcgTGVhcm4gYXJlYS4gV2UgcmV2aWV3 ZWQgdGhlIHVzZXIgaW50ZXJ2aWV3IHZpZGVvcyBmcm9tIHRoZSBRMSBzdXJ2ZXkgb24gdGhlIExl YXJuIGFuZCBQYWNrYWdlIGFyZWFzIHRvIGV4dHJhY3QgdXNlciBuZWVkcyBhbmQgcGFpbiBwb2lu dHMuDQogV2UgYWxzbyBzdGFydGVkIHByZXBhcmluZyBhIHN1cnZleSB0aGF0IHNwZWNpZmljYWxs eSB0YXJnZXRzIG5ldyBPQ2FtbCB1c2VycyAoYm90aCBwcm9ncmFtbWluZyBiZWdpbm5lcnMgYW5k IGV4cGVyaWVuY2VkIGRldmVsb3BlcnMpLiBBdCB0aGUgdGltZSB3ZSBwdWJsaXNoIHRoaXMgbmV3 c2xldHRlciwgd2XigJl2ZSBhbHJlYWR5IGNvbXBsZXRlZCB0aGUgc3VydmV5IGFuZCB3ZeKAmWxs IGJlIHNoYXJpbmcgdGhlIHJlc3VsdHMgaW4gdGhlIG5leHQgaXNzdWUNCiBvZiB0aGlzIG5ld3Ns ZXR0ZXIuIDwvcD4NCjxwPkltcHJvdmluZyB0aGUgTGVhcm4gQXJlYSB3aWxsIGJlIG91ciBiaWdn ZXN0IGZvY3VzIGluIHRoZSBjb21pbmcgbW9udGhzLCBzbyBleHBlY3QgbW9yZSB1cGRhdGVzIG9u IHRoaXMgaW4gdGhlIGZvbGxvd2luZyBuZXdzbGV0dGVycy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdlNWRhNWJlIiBjbGFzcz0ib3V0bGluZS00 Ij4NCjxoNCBpZD0ib3JnZTVkYTViZSI+R2VuZXJhbCBNYWludGVuYW5jZTwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZTVkYTViZSI+PC9kaXY+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzYyMmQ2MzUiPjwvYT5Vc2VyLWZhY2luZyBjaGFu Z2VzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzYyMmQ2MzUi Pg0KPG9sIGNsYXNzPSJvcmctb2wiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC85OTQiPkRpc3BsYXkgb2YgUkVBRE1FL0xJQ0VOU0UvQ0hBTkdF TE9HIG5vdyB1c2VzIHRoZSBwYWNrYWdlIG92ZXJ2aWV3IHBhZ2UgbGF5b3V0PC9hPiwgaW5zdGVh ZCBvZiB0aGUgZG9jdW1lbnRhdGlvbiBsYXlvdXQuDQo8L2xpPjxsaT5AWWFzc2luZUhhb3V6YW5l IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC85NTUiPmFk ZGVkIHRoZSBkaXNwbGF5IG9mIGV4ZXJjaXNlIGRpZmZpY3VsdHk8L2E+IHRvIHRoZSBwcm9ibGVt cyBpbiB0aGUgZXhlcmNpc2VzIHNlY3Rpb24uIFRoYW5rIHlvdSB2ZXJ5IG11Y2ghDQo8L2xpPjxs aT5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzk3 OCI+cGFja2FnZSBzZWFyY2ggZHJvcGRvd24gaW4gdGhlIHRvcCBuYXZpZ2F0aW9uIGJhciBub3cg YWxsb3dzIHlvdSB0byBuYXZpZ2F0ZSB0aGUgc2VhcmNoIHJlc3VsdHMgdXNpbmcgeW91ciBrZXli b2FyZDwvYT4uDQo8L2xpPjxsaT5XaGVuIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC85ODMiPnVzaW5nIHRoZSB2ZXJzaW9uIHN3aXRjaGVyIGRyb3Bkb3du IG9uIHRoZSBwYWNrYWdlIGRvY3VtZW50YXRpb24gcGFnZXMsIHRoZSBjdXJyZW50IHBhdGggd2l0 aGluIHRoZSBkb2NzIGlzIG5vdyBwcmVzZXJ2ZWQ8L2E+Lg0KPC9saT48bGk+KFdJUCkgV2UgbWFk ZSBwcm9ncmVzcyBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMTAwOSI+DQphZGRpbmcgYSBwYWdlIHRvIHRoZSBjb21tdW5pdHkgc2VjdGlvbiB0aGF0 IGhpZ2hsaWdodHMgdGhlIE91dHJlYWNoeSBpbnRlcm5zaGlwIHByb2plY3RzPC9hPi4NCjwvbGk+ PGxpPihXSVApIFdlIG1hZGUgcHJvZ3Jlc3Mgb24gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzk3NyI+DQpleHBvc2luZyBjaGVjay5vY2FtbGxhYnMuaW8g YnVpbGQgaW5mb3JtYXRpb24gb24gdGhlIHBhY2thZ2Ugb3ZlcnZpZXcgcGFnZTwvYT4uIDwvbGk+ PGxpPihXSVApIFdlIHN0YXJ0ZWQgd29yayBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMTAzOCI+DQphZGRpbmcgYSBkZWRpY2F0ZWQg4oCcSW5zdGFs bOKAnSBwYWdlPC9hPiwgdG9nZXRoZXIgd2l0aCB0aGUgY29tbXVuaXR5OiBEaXNjdXNzIHRocmVh ZA0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BsZWFzZS1pbXByb3ZlLW15 LWRyYWZ0LW9mLWFuLWluc3RhbGwtcGFnZS1vbi1vY2FtbC1vcmcvMTE4MzciPg0KUGxlYXNlIElt cHJvdmUgbXkgRHJhZnQgb2YgYW4g4oCcSW5zdGFsbOKAnSBQYWdlIG9uIE9DYW1sLm9yZzwvYT4u IDwvbGk+PC9vbD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzBmMWJhNGMiPjwvYT5VcGRh dGVzIHRvIE9DYW1sLm9yZ+KAmXMgZGF0YTo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQt NSIgaWQ9InRleHQtb3JnMGYxYmE0YyI+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+Rm9sbG93 aW5nIHRoZSBhbm5vdW5jZW1lbnQgb2YgdGhlIGpvYnMgc2VjdGlvbiBvbiB0aGUgT0NhbWwgRGlz Y3VzcyBmb3J1bXMsIHRoZSB0ZWFtIHJldmlld2VkIGFuZCBtZXJnZWQgam9iIGxpc3RpbmdzIHN1 Ym1pdHRlZCBieSBleHRlcm5hbCBjb250cmlidXRvcnMuIFRoYW5rIHlvdSBldmVyeW9uZSENCjwv bGk+PGxpPlRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvOTcwIj52aWRlb3MgZm9yIHRoZSBPdXRyZWFjaHkgcHJvamVjdHMgaGF2ZSBiZWVuIGFkZGVk PC9hPiBidXQgYXJlIG5vdCB5ZXQgZXhwb3NlZCB2aWEgYSBkZWRpY2F0ZWQgcGFnZS4NCjwvbGk+ PC9vbD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2JkYTYwNWMiPjwvYT5JbnRlcm5hbCBt YWludGVuYW5jZSwgY29kZSBoZWFsdGgsIGFuZCBidWcgZml4ZXM8YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnYmRhNjA1YyI+DQo8b2wgY2xhc3M9Im9yZy1vbCI+ DQo8bGk+VGhlIGNvZGUgb2Yg4oCcb29k4oCdIChPQ2FtbC5vcmfigJlzIGRhdGEgbGlicmFyeSBh bmQgZGF0YSBwYXJzZXIpIHJlY2VpdmVkIHNvbWUgcmVmYWN0b3JpbmcgaW4gb3JkZXIgdG8gbWFr ZSBpdCBlYXNpZXIgZm9yIHBlb3BsZSB0byBjb250cmlidXRlIHRvIE9DYW1sLm9yZy4NCjwvbGk+ PGxpPkFsbCBpbnRlcm5hbCBsaW5rcyB0byAoc3ViZG9tYWlucyBvZikgb2NhbWwub3JnIHdlcmUg Y2hhbmdlZCB0byB1c2UgaHR0cHMgaW4gb3JkZXIgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmVkaXJl Y3RzLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzk4NSI+UkVBRE1FL0xJQ0VOU0UvQ0hBTkdFTE9HIGZpbGVzIHdlcmUgbm90IHByb3Bl cmx5IHBpY2tlZCB1cDwvYT4gYnkgT0NhbWwub3JnIGFmdGVyIHRoZSBvZG9jIHVwZ3JhZGUuIE5v dyB0aGV5IGFyZS4NCjwvbGk+PGxpPkB2b29kb29zIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC85OTYiPmZpeGVkIHRoZSBub24tb3BlcmF0aW9uYWwgTWVy bGluIGluIHRoZSBPQ2FtbCBQbGF5Z3JvdW5kPC9hPi4NCjwvbGk+PGxpPldoZW4gYSBuZXcgYnVp bGQgd2FzIGRlcGxveWVkLCBwYWNrYWdlIGluZm9ybWF0aW9uIHVzZWQgdG8gYmUgdW5hdmFpbGFi bGUgZm9yIGFyb3VuZCBhIG1pbnV0ZS4gTm93LCB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzLzk4MCI+SXNzdWU6IFdoZW4gcGFja2FnZSBpbmZv IGlzIHJlZ2VuZXJhdGluZywgcGFja2FnZSBpbmZvIGlzIHVuYXZhaWxhYmxlPC9hPiBoYXMgYmVl biBmaXhlZC4NCjwvbGk+PGxpPkJ1ZyBmaXg6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC85ODkiPmRvbuKAmXQgY3Jhc2ggb24gcGFja2FnZXMgdGhhdCBo YXZlIGF2b2lkLXZlcnNpb24gb24gYWxsIHZlcnNpb25zPC9hPi4NCjwvbGk+PGxpPlRoZSA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAwMCI+cGFja2Fn ZSBicmVhZGNydW1icyB0ZW1wbGF0ZSBub3cgdXNlcyB0aGUgYnJlYWRjcnVtYnMgZGF0YSBjb21p bmcgZnJvbSBvZG9jPC9hPi4NCjwvbGk+PGxpPkludHJvZHVjZWQgYSBzaG9ydC1jaXJjdWl0aW5n IDQwNCBsZXQtYmluZGluZyBvcGVyYXRvciB0byB0aGUgaGFuZGxlciBmdW5jdGlvbnM6DQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAxMCI+UFI6IFJl dHVybiA0MDQgb24gbm90IGZvdW5kPC9hPi4NCjwvbGk+PGxpPldlIGtlcHQgaGF2aW5nIHNwdXJp b3VzIENJIGJ1aWxkIGZhaWx1cmVzIGJlY2F1c2UgdGhlIENJIHdvdWxkIHVzZSB0aGUgbW9zdCBj dXJyZW50IHZlcnNpb24gb2Ygb3BhbS1yZXBvc2l0b3J5LiBOb3csIHdlIHBpbiBvcGFtLXJlcG9z aXRvcnkgaW4gYWxsIHRocmVlIHBsYWNlczogMSkgTWFrZWZpbGUsIDIpIERvY2tlcmZpbGUsIDMp IEdpdEh1YiBhY3Rpb25zLg0KPC9saT48bGk+VmVyc2lvbiB1cGdyYWRlczogb2NhbWwgdG8gNC4x NC4xLCBhY3Rpb25zL2NoZWNrb3V0QHYzIGluIEdpdEh1YiBBY3Rpb25zLCBkdW5lIHRvIDMuNi4N CjwvbGk+PGxpPkFmdGVyIHZpc3VhbGx5IGhpZ2hsaWdodGluZyB0YXJnZXRlZCBoZWFkaW5ncyB3 YXMgYWRkZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzYyOCI+DQojNjI4PC9hPiwgdGhlcmUgd2VyZSB0d28gc2V0cyBvZiBob3ZlciBzdHlsZXMg YmVpbmcgYXBwbGllZCB0byB0aGUgYW5jaG9yIHRhcmdldHMgaW4gdGhlIGhlYWRpbmdzIG9mIHRo ZSBwYWNrYWdlIGRvY3VtZW50YXRpb24uIFRoaXMgaGFzIGJlZW4gcmVzb2x2ZWQ6DQo8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAxNCI+UFI6IFJlbW92 ZSBkdXBsaWNhdGUgZG9jLmNzcyBhbmNob3IgdGFyZ2V0IHN0eWxlcywgYWRqdXN0IGhvdmVyIHN0 eWxlczwvYT4uDQo8L2xpPjxsaT5UaGVyZSB3YXMgYSBwcm9ibGVtIHdpdGggdGhlIHJpZ2h0IHNp ZGViYXIgbm90IHNob3dpbmcgdXAgd2hlbiB5b3UgbmF2aWdhdGVkIHRvIHRoZSB0dXRvcmlhbCBj b21pbmcgZnJvbSB0aGUg4oCcTGVhcm7igJ0gcGFnZS4gVGhhbmtzIHRvDQo8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAyMSI+IzEwMjE8L2E+IGFuZCA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTA0MSI+DQoj MTA0MTwvYT4sIHRoZSBzaWRlYmFyIG5vdyB3b3JrcyBwcm9wZXJseSB3aXRoIHRoZSBBSkFYLW5h dmlnYXRpb24gcHJvdmlkZWQgYnkgSFRNWC4NCjwvbGk+PGxpPkEgdXNlciByZXBvcnRlZCBwcm9i bGVtcyB3aXRoIGZvbnQtc2l6aW5nIC8gbGF5b3V0LiBXZSA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMTAzMiI+DQpjaGFuZ2VkIFRhaWx3aW5k4oCZcyBw eC1iYXNlZCBicmVha3BvaW50cyB0byBlbS1iYXNlZCBicmVha3BvaW50czwvYT4gLSBpbiBvcmRl ciB0byByZXNwZWN0IHBlb3BsZeKAmXMgYnJvd3NlciBhbmQgT1MgZm9udCBzaXplIHNldHRpbmdz Lg0KPC9saT48bGk+KFdJUCkgV29yayBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvODMwIj5hZGRpbmcgYSBzaXRlbWFwLnhtbDwvYT4gdG8gaGVscCBz ZWFyY2ggZW5naW5lcyB0byBpbmRleCBhbGwgb2YgT0NhbWwub3Jn4oCZcyBwYWdlcyBpcyBpbiBw cm9ncmVzcy4NCjwvbGk+PC9vbD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjQiPkNyZWF0aW5nIGEgdHV0b3JpYWwgb24gc2VxdWVuY2VzPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jcmVhdGluZy1hLXR1dG9yaWFsLW9uLXNlcXVl bmNlcy8xMjA5MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jcmVhdGluZy1hLXR1 dG9yaWFsLW9uLXNlcXVlbmNlcy8xMjA5MS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzg5ZmU5MWEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmc4OWZlOTFhIj5DdWlodGxhdWFjIEFsdmFyYWRvIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODlmZTkxYSI+DQo8cD5Gb2xsb3dpbmcgdXAg b24gb2NhbWwub3JnIHR1dG9yaWFsIHVwZGF0ZXMsIEnigJl2ZSBjcmVhdGVkIG9uZSBvbiBzZXF1 ZW5jZXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5PbmxpbmUgdHV0b3JpYWw6IDxh IGhyZWY9Imh0dHBzOi8vc3RhZ2luZy5vY2FtbC5vcmcvZG9jcy9zZXF1ZW5jZXMiPmh0dHBzOi8v c3RhZ2luZy5vY2FtbC5vcmcvZG9jcy9zZXF1ZW5jZXM8L2E+DQo8L2xpPjxsaT5HaXRIdWIgUFI6 IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC83OTEiPmh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC83OTE8L2E+DQo8L2xpPjwvdWw+ DQo8cD5BZ2FpbiwgZmVlZGJhY2sgaXMgaGlnaGx5IHdlbGNvbWUgPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjUiPllvdSBzdGFydGVkIHRvIGxlYXJuIE9DYW1sIGxlc3MgdGhhbiAxMiBt b250aHMgYWdvPyBQbGVhc2UgaGVscCB1cyB3aXRoIG91ciB1c2VyIHN1cnZleSBvbiB0aGUgT0Nh bWwub3JnIExlYXJuaW5nIEFyZWE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3lvdS1zdGFydGVkLXRvLWxlYXJuLW9jYW1sLWxlc3MtdGhhbi0xMi1tb250aHMtYWdvLXBs ZWFzZS1oZWxwLXVzLXdpdGgtb3VyLXVzZXItc3VydmV5LW9uLXRoZS1vY2FtbC1vcmctbGVhcm5p bmctYXJlYS8xMTk0NS8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC95b3Utc3RhcnRl ZC10by1sZWFybi1vY2FtbC1sZXNzLXRoYW4tMTItbW9udGhzLWFnby1wbGVhc2UtaGVscC11cy13 aXRoLW91ci11c2VyLXN1cnZleS1vbi10aGUtb2NhbWwtb3JnLWxlYXJuaW5nLWFyZWEvMTE5NDUv MjwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMWE0NDA4 YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzFhNDQwOGMiPlNhYmluZSBTY2htYWx0 eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzFhNDQwOGMiPg0KPHA+SGVyZeKAmXMgdGhlIHByb21pc2VkIHVwZGF0ZSBvbiB3aGF0IGtpbmQg b2YgZmVlZGJhY2sgd2UgZ290IG91dCBvZiB0aGUgc3VydmV5LiA8L3A+DQo8cD5XZSBkaXN0cmli dXRlZCB0aGUgc3VydmV5ICgxKSBoZXJlIG9uIHRoZSBPQ2FtbCBEaXNjdXNzLCBhbmQgKDIpIG9u IHRoZSBPQ2FtbCBEaXNjb3JkIHNlcnZlci4gVGhlIHN1cnZleSB3YXMgYWxzbyBzaGFyZWQgdmlh ICgzKSBMaW5rZWRJbiwgKDQpIFR3aXR0ZXIsIGFuZCBwb3NzaWJseSBtb3JlIGNoYW5uZWxzLiBX ZSBhc2tlZCBuZXdjb21lcnMgdG8gT0NhbWwgdG8gcGFydGljaXBhdGUuDQo8L3A+DQo8cD41NyBw ZW9wbGUgcmVzcG9uZGVkIHRvIHRoZSBzdXJ2ZXkgYW5kIHdlIGhhZCB0byBjbG9zZSB0aGUgc3Vy dmV5IGVhcmx5IHNvIHRoYXQgd2UgaGF2ZSB0aGUgY2FwYWNpdHkgdG8gcHJvcGVybHkgYW5hbHl6 ZSBhbmQgY2F0ZWdvcml6ZSBhbGwgZmVlZGJhY2suDQo8L3A+DQo8cD5JbnZpdGVzIGhhdmUgYmVl biBzZW50IG91dCBieSBDbGFpcmUgdG8gdGhlIHBhcnRpY2lwYW50cyB3aG8gdm9sdW50ZWVyZWQg dG8gYmUgaW50ZXJ2aWV3ZWQuDQo8L3A+DQo8cD5XZSBoYXZlIGZvdW5kIGxhc3QgdGltZSB0aGF0 IHRoZSBpbnRlcnZpZXdzIGhlbHBlZCB1cyB1bmRlcnN0YW5kIHRoZSBzdGF0dXMgcXVvIGFuZCB0 aGUgcG90ZW50aWFsIGltcHJvdmVtZW50cyBmcm9tIHRoZSBjb21tdW5pdHnigJlzIHZhcmllZCBw ZXJzcGVjdGl2ZXMgbXVjaCBiZXR0ZXIgdGhhbiB3ZSBkaWQgb25seSBmcm9tIHRoZSBzdXJ2ZXku IEkgZmVlbCB0aGlzIGhhcyBiZWVuIGEgY3JpdGljYWwgZmFjdG9yIHRvIGVuYWJsZSB1cyB0byBj aGFuZ2UNCiB0aGluZ3MgZm9yIHRoZSBiZXR0ZXIuIDwvcD4NCjxwPlNvIHRoYW5rIHlvdSBmb3Ig dGFraW5nIHRoZSB0aW1lIHRvIGhlbHAgdXMhIDpjYW1lbDogPC9wPg0KPHA+PGk+RWRpdG9y4oCZ cyBub3RlOiB0aGlzIHBvc3QgaXMgdmVyeSBsb25nLCBwbGVhc2UgZm9sbG93IHRoZSBsaW5rIGFi b3ZlIHRvIHJlYWQgaXQuPC9pPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPkV4 cGxvcmF0aW9ucyBvbiBQYWNrYWdlIE1hbmFnZW1lbnQgaW4gRHVuZTwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZXhwbG9yYXRpb25zLW9uLXBhY2thZ2UtbWFuYWdlbWVu dC1pbi1kdW5lLzEyMTAxLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2V4cGxvcmF0 aW9ucy1vbi1wYWNrYWdlLW1hbmFnZW1lbnQtaW4tZHVuZS8xMjEwMS8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwNjY4NThiIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMDY2ODU4YiI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwNjY4NThiIj4NCjxwPlRo ZSBPQ2FtbCBQbGF0Zm9ybSB0ZWFtIGlzIGV4Y2l0ZWQgdG8gYW5ub3VuY2UgdGhhdCB3ZSBoYXZl IHN0YXJ0ZWQgZXhwbG9yYXRpb25zIHRvIGFkZCBzdXBwb3J0IGZvciBwYWNrYWdlIG1hbmFnZW1l bnQgaW4gRHVuZS4NCjwvcD4NCjxwPlRoaXMgam9pbnQgd29yayBsZWQgYnkgdGhlIER1bmUsIG9w YW0gYW5kIG9wYW0tbW9ub3JlcG8gdGVhbXMsIHN0YXJ0ZWQgYSBmZXcgbW9udGhzIGFnbyB3aXRo IGRpc2N1c3Npb25zIG9uIGhvdyB0byBhZGRyZXNzIHdoYXQgaXMgb25lIG9mIHRoZSBtb3N0IGlt cG9ydGFudCBwYWluIHBvaW50cw0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuZHJvcGJveC5jb20vcy9v bWJhMWQ4dmhsam5yY24vT0NhbWwtdXNlci1zdXJ2ZXktMjAyMC5wZGY/ZGw9MCI+DQpyZXBvcnRl ZCBieSB0aGUgY29tbXVuaXR5PC9hPi4gVGhpcyBpcyB0aGUgY29udGludWF0aW9uIG9mIHRoZSBm b2N1cyB3ZSBoYWQgaW4gMjAyMiBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLW9yZy1yZWNhcHBpbmctMjAyMi1hbmQtcXVlcmllcy1vbi10aGUtZmVkaXZlcnNl LzExMDk5I3Byb3RvdHlwZS1uZXctd29ya2Zsb3dzLWZvci1vY2FtbC1kZXZlbG9wbWVudC0zIj4N CnByb3RvdHlwaW5nIG5ldyBkZXZlbG9wZXIgd29ya2Zsb3dzPC9hPiBhbmQgd2XigJlsbCBleHBs b3JlIG5ldyB3b3JrZmxvd3MgdGhpcyBpbnRlZ3JhdGlvbiBlbmFibGVzIHRocm91Z2hvdXQgMjAy My4gSW4gcGFydGljdWxhciwgd2XigJl2ZSBiZWVuIGRldmVsb3Bpbmcgc2ltaWxhciB3b3JrZmxv d3Mgd2l0aA0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3RhcmlkZXMvb3BhbS1tb25vcmVw byI+b3BhbS1tb25vcmVwbzwvYT4gYW5kIHdl4oCZcmUgYnVpbGRpbmcgb24gb3VyIGV4cGVyaWVu Y2Ugb2YgdGhlIHBhc3QgMyB5ZWFycyB0byBleHBsb3JlIGhvdyB0byBpbXBsZW1lbnQgdGhlc2Ug d29ya2Zsb3dzIGluIER1bmUuDQo8L3A+DQo8cD5BcyB3ZSB3YW50IHRvIGludm9sdmUgdGhlIGNv bW11bml0eSBhcyBtdWNoIGFzIHBvc3NpYmxlIGFuZCBzdGFydCBnYXRoZXJpbmcgZmVlZGJhY2sg ZWFybHksIHdlIHdyb3RlIGFuDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVu ZS9pc3N1ZXMvNzY4MCI+UkZDIG9uIEdpdEh1YjwvYT4gdGhhdCBsYXlzIGRvd24gYSBoaWdoLWxl dmVsIG92ZXJ2aWV3IG9mIHRoZSBkaWZmZXJlbnQgZmVhdHVyZXMuDQo8L3A+DQo8cD5UaGUgcHJv amVjdCBpcyBpbiB0aGUgcHJvdG90eXBpbmcgc3RhZ2UsIHNvIHRoZSBnb2FsIG9mIHRoZSBSRkMg aXMgdG8gaW52aXRlIGZlZWRiYWNrIGFuZCBkaXNjdXNzaW9uIGZyb20gdGhlIGNvbW11bml0eSwg cmF0aGVyIHRoYW4gc2VydmUgYXMgYSBkZWZpbml0aXZlIHNwZWMgb2YgcGFja2FnZSBtYW5hZ2Vt ZW50IGluIER1bmUuIFdlIHdpbGwgYmUgb3BlbmluZyBzZXBhcmF0ZSBSRkNzIGZvciB0aGUgZGlm ZmVyZW50IHBhcnRzIGFzIHdlDQogY29udGludWUgb3VyIGV4cGxvcmF0aW9ucy4gPC9wPg0KPHA+ SWYgeW91IHdhbnQgdG8gZm9sbG93IG91ciB3b3JrLCB5b3UgY2FuIGxvb2sgYXQgaXNzdWVzIGFu ZCBQdWxsIFJlcXVlc3RzIHRhZ2dlZCBhcyBgcGFja2FnZS1tYW5hZ2VtZW50YCBpbg0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvbGFiZWxzL3BhY2thZ2UlMjBtYW5hZ2Vt ZW50Ij5EdW5lPC9hPi4gWW91IGNhbiBhbHNvIGhhdmUgYSBsb29rIGF0IHRoZSBkZXYgbWVldGlu ZyBtaW51dGVzIGZvcg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lr aSI+RHVuZTwvYT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3dp a2kiPg0Kb3BhbTwvYT4uIDwvcD4NCjxwPkl04oCZcyB0aGUgYmVnaW5uaW5nIG9mIHF1aXRlIGEg Yml0IHByb2plY3QsIHdpdGggbWFueSBwZW9wbGUgaW52b2x2ZWQsIHNvIEkgd2FudCB0byB0YWtl IGEgbW9tZW50IHRvIGFja25vd2xlZGdlIHRoZSBjb250cmlidXRpb25zIG9mIGV2ZXJ5b25lLiBU aGUgaW5pdGlhdGl2ZSBpcyBzcGVhcmhlYWRlZCBieSBUYXJpZGVzIGFuZCB0aGUgRHVuZSwgb3Bh bSBhbmQgb3BhbS1tb25vcmVwbyBkZXZlbG9wbWVudCB0ZWFtcyBhcmUgbGVhZGluZyB0aGUNCiBw cm9qZWN0LiBXZSBhcmUgYWxzbyBncmF0ZWZ1bCBmb3IgdGhlIGdlbmVyb3VzIGZ1bmRpbmcgcHJv dmlkZWQgYnkgSmFuZSBTdHJlZXQsIHdob3NlIHN1cHBvcnQgaXMgaW5zdHJ1bWVudGFsIHRvIGNv bnRpbnVvdXNseSBpbXByb3ZlIHRoZSBPQ2FtbCBQbGF0Zm9ybS4NCjwvcD4NCjxwPkhhcHB5IGNv ZGluZyEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPkZ1bmN0aW9uYWwgd2ViIGFw cGxpY2F0aW9ucyBydW5uaW5nIGluIHRoZSBicm93c2VyPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tZnVuY3Rpb25hbC13ZWItYXBwbGljYXRpb25zLXJ1bm5pbmct aW4tdGhlLWJyb3dzZXIvMTE5ODQvNiI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWZ1bmN0aW9uYWwtd2ViLWFwcGxpY2F0aW9ucy1ydW5uaW5nLWluLXRoZS1icm93c2VyLzExOTg0 LzY8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzFhMWRl NDMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxYTFkZTQzIj5Db250aW51aW5nIHRo aXMgdGhyZWFkLCBIZWxtdXQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmcxYTFkZTQzIj4NCjxibG9ja3F1b3RlPg0KPHA+U291bmRzIGNvbXBl bGxpbmcgOnNsaWdodF9zbWlsZTogPC9wPg0KPHA+SWYgeW91IGhhdmUgdGhlIHRpbWUsIGl04oCZ ZCBiZSBncmVhdCBpZiB5b3UgY291bGQgaW1wbGVtZW50IHRoZSA3IEdVSXMgdGFza3MgdG8gc2Vy dmUgYXMgZXhhbXBsZSBjb2RlIHRvIHlvdXIgbGliLg0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6 Ly9ldWdlbmtpc3MuZ2l0aHViLmlvLzdndWlzLyI+aHR0cHM6Ly9ldWdlbmtpc3MuZ2l0aHViLmlv LzdndWlzLw0KPC9hPjwvcD4NCjxwPkkgZmluZCB0aGlzIGJlbmNobWFyayBxdWl0ZSBnb29kOiBz bWFsbCBlbm91Z2ggaW4gc2NvcGUgbm90IHRvIGJlIGEgdGltZSBzaW5rLCBidXQgY29tcGxleCBl bm91Z2ggdG8gbWFrZSBvbmUgdW5kZXJzdGFuZCB0aGUgbGltaXRhdGlvbnMgb3IgYWR2YW50YWdl cyBvZiBhIGxhbmd1YWdlIG9yIGxpYnJhcnkNCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPkkgaGF2 ZSBpbXBsZW1lbnRlZCBzb21lIG9mIHRoZSBleGFtcGxlczogPC9wPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkNvdW50ZXI6IGFscmVhZHkgcGFydCBvZiB0aGUgZGVtbyA8YSBocmVmPSJodHRw czovL2hici5naXRodWIuaW8vZm1saWIvd2ViYXBwL2luZGV4Lmh0bWwiPg0KaHR0cHM6Ly9oYnIu Z2l0aHViLmlvL2ZtbGliL3dlYmFwcC9pbmRleC5odG1sPC9hPiA8L2xpPjxsaT5UZW1wZXJhdHVy ZSBDb252ZXJ0ZXI6IDxhIGhyZWY9Imh0dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi93ZWJhcHAv dGVtcGVyYXR1cmUuaHRtbCI+DQpodHRwczovL2hici5naXRodWIuaW8vZm1saWIvd2ViYXBwL3Rl bXBlcmF0dXJlLmh0bWw8L2E+IDwvbGk+PGxpPlRpbWVyOiA8YSBocmVmPSJodHRwczovL2hici5n aXRodWIuaW8vZm1saWIvd2ViYXBwL3RpbWVyLmh0bWwiPmh0dHBzOi8vaGJyLmdpdGh1Yi5pby9m bWxpYi93ZWJhcHAvdGltZXIuaHRtbDwvYT4NCjwvbGk+PGxpPkZsaWdodCBCb29raW5nOiA8YSBo cmVmPSJodHRwczovL2hici5naXRodWIuaW8vZm1saWIvd2ViYXBwL2ZsaWdodC5odG1sIj5odHRw czovL2hici5naXRodWIuaW8vZm1saWIvd2ViYXBwL2ZsaWdodC5odG1sPC9hPg0KPC9saT48bGk+ RHJhdyBDaXJjbGVzOiA8YSBocmVmPSJodHRwczovL2hici5naXRodWIuaW8vZm1saWIvd2ViYXBw L2NpcmNsZXMuaHRtbCI+aHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL3dlYmFwcC9jaXJjbGVz Lmh0bWw8L2E+DQo8L2xpPjwvdWw+DQo8cD5UaGUgbGFzdCB0d28gZXhhbXBsZXMgb2YgdGhlIGJl bmNobWFyayBhcmUgc3RpbGwgbWlzc2luZy4gWW91IGNhbiBmaW5kIHRoZSBzb3VyY2VzIGF0Og0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2hici9mbWxpYi90cmVlL2Jyb3dzZXIvc3JjL2V4 YW1wbGVzL2Jyb3dzZXIiPmh0dHBzOi8vZ2l0aHViLmNvbS9oYnIvZm1saWIvdHJlZS9icm93c2Vy L3NyYy9leGFtcGxlcy9icm93c2VyPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjgiPkFocmVmcyBpcyBub3cgYnVpbHQgd2l0aCBNZWxhbmdlPC9oMj4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9haHJlZnMtaXMtbm93LWJ1aWx0LXdpdGgtbWVsYW5nZS8xMjEw Ny8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9haHJlZnMtaXMtbm93LWJ1aWx0LXdp dGgtbWVsYW5nZS8xMjEwNy8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2VhYjcwZDYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlYWI3MGQ2 Ij5KYXZpZXIgQ2jDoXZhcnJpIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnZWFiNzBkNiI+DQo8cD5TaW5jZSBsYXN0IFNlcHRlbWJlciwgdGhl IE1lbGFuZ2UsIER1bmUsIGFuZCBBaHJlZnMgZGV2ZWxvcG1lbnQgdGVhbXMgaGF2ZSBiZWVuIHdv cmtpbmcgdG8gZW5oYW5jZSB0aGUgaW50ZWdyYXRpb24gYmV0d2VlbiBEdW5lIGFuZA0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZSI+TWVsYW5nZTwvYT4uIEFz IGEgY29tcGFueSB0aGF0IHVzZXMgYSBsb3Qgb2YgT0NhbWwgaW4gdGhlIGJhY2tlbmQsIEFocmVm cyBzYXcgYW4gb3Bwb3J0dW5pdHkgdG8gYnJpbmcgaXRzIGZyb250ZW5kIHN0YWNrIGNsb3NlciB0 byBPQ2FtbCBieSB1c2luZyBNZWxhbmdlIHdoaWxlIHN0aWxsIGludGVncmF0aW5nIHdpdGggdGhl IEphdmFTY3JpcHQgZWNvc3lzdGVtIG9mDQogVUkgbGlicmFyaWVzLiBUaHVzLCB0aGUgY29tcGFu eSBkZWNpZGVkIHRvIGludmVzdCBhbmQgYWN0aXZlbHkgcGFydGljaXBhdGUgdG8gbWFrZSB0aGlz IGludGVncmF0aW9uIGhhcHBlbi4NCjwvcD4NCjxwPkkgYW0gaGFwcHkgdG8gYW5ub3VuY2Ugd2Ug YWNoaWV2ZWQgYSBzaWduaWZpY2FudCBtaWxlc3RvbmUgaW4gdGhpcyBpbnRlZ3JhdGlvbiBwcm9j ZXNzOiB3ZSB0cmFuc2l0aW9uZWQgYWxsIEFocmVmcyBmcm9udGVuZCBwcm9qZWN0cyB0byB1c2Ug TWVsYW5nZS4gV2UgaGF2ZSBleHBsYWluZWQgdGhpcyB0cmFuc2l0aW9uIGluIGRldGFpbCBpbiBh IGJsb2cgcG9zdDoNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vdGVjaC5haHJlZnMuY29tL2Fo cmVmcy1pcy1ub3ctYnVpbHQtd2l0aC1tZWxhbmdlLWIxNGY1ZWM1NmRmNCI+aHR0cHM6Ly90ZWNo LmFocmVmcy5jb20vYWhyZWZzLWlzLW5vdy1idWlsdC13aXRoLW1lbGFuZ2UtYjE0ZjVlYzU2ZGY0 PC9hPg0KPC9wPg0KPHA+UmVnYXJkaW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIE1lbGFuZ2UsIGl0 4oCZcyB3b3J0aCBub3RpbmcgdGhhdCBvdXIgZm9jdXMgdGh1cyBmYXIgaGFzIGJlZW4gb24gZGVz aWduaW5nIGFuZCBpbXBsZW1lbnRpbmcgdGhlIER1bmUtTWVsYW5nZSBpbnRlZ3JhdGlvbiBhbmQg YXBwbHlpbmcgaXQgd2l0aGluIEFocmVmcy4gVGhlIGdvYWwgaGFzIGJlZW4gdG8gZGVtb25zdHJh dGUgdGhhdCB0aGUgdG9vbGNoYWluIGNhbiBzY2FsZSBhbmQgYmUgdXNlZA0KIGluIG1pZC1sYXJn ZSBjb2RlYmFzZXMsIGFuZCB0aGUgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWwgc28gZmFyLiBU aGUgcHJvY2VzcyBoYXMgYmVlbiBiZW5lZmljaWFsIG5vdCBvbmx5IGZvciBNZWxhbmdlIGJ1dCBh bHNvIGZvciBEdW5lIGl0c2VsZiwgYXMgd2Ugd2VyZSBhYmxlIHRvIGlkZW50aWZ5IGFuZCBhZGRy ZXNzIHNvbWUgcGVyZm9ybWFuY2UgaXNzdWVzLCBpbmNsdWRpbmcgYSBzaWduaWZpY2FudA0KPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC83MTg3Ij5wZXJmb3JtYW5j ZSBmaXg8L2E+IHRoYXQgbWFkZSBzb21lIGJ1aWxkIGNvbW1hbmRzIG5lYXJseSAxMCB0aW1lcyBm YXN0ZXIgaW4gb3VyIGNhc2UuDQo8L3A+DQo8cD5XaGlsZSB3ZeKAmXZlIG1hZGUgc2lnbmlmaWNh bnQgcHJvZ3Jlc3Mgd2l0aCB0aGUgRHVuZS1NZWxhbmdlIGludGVncmF0aW9uLCB3ZSByZWNvZ25p emUgdGhhdCB0aGVyZSBpcyBzdGlsbCB3b3JrIHRvIGJlIGRvbmUgdG8gaW1wcm92ZSB0aGUgZG9j dW1lbnRhdGlvbiBhbmQgZGV2ZWxvcGVyIGV4cGVyaWVuY2UuIEN1cnJlbnRseSwgTWVsYW5nZSBs YWNrcyBhIGRlZGljYXRlZCBkb2N1bWVudGF0aW9uIHNpdGUsIGFuZCB0aGUgbGF0ZXN0IGZ1bmN0 aW9uYWxpdHkNCiBpc27igJl0IHlldCBhdmFpbGFibGUgaW4gcHVibGlzaGVkIHZlcnNpb25zIG9m IER1bmUgYW5kIE1lbGFuZ2Ugb24gdGhlIG9wYW0gcmVwb3NpdG9yeS4NCjwvcD4NCjxwPldl4oCZ cmUgYWN0aXZlbHkgd29ya2luZyB0byBhZGRyZXNzIHRoaXMsIGJ1dCBpbiB0aGUgbWVhbnRpbWUs IHdlIGludml0ZSB0aG9zZSB3aG8gYXJlIGFkdmVudHVyb3VzIHRvIGV4cGxvcmUgdGhlDQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVsYW5nZS1yZS9tZWxhbmdlLW9wYW0tdGVtcGxhdGUi Pm1lbGFuZ2Utb3BhbS10ZW1wbGF0ZTwvYT4gYW5kIHJldmlldyB0aGUgbmV3bHkgYWRkZWQNCjxj b2RlPm1lbGFuZ2UuZW1pdDwvY29kZT4gc3RhbnphIGRvY3VtZW50YXRpb24gZm91bmQgaW4gdGhl IGxhdGVzdCB2ZXJzaW9uIG9mIDxhIGhyZWY9Imh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9l bi9sYXRlc3QvbWVsYW5nZS5odG1sIj4NCkR1bmXigJlzIGRvY3VtZW50YXRpb248L2E+LiBJZiB5 b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLCBlbmNvdW50ZXIgYW55IGlzc3Vlcywgb3Igb3RoZXJ3aXNl IHdhbnQgdG8gcGFydGljaXBhdGUgaW4gYW55IHdheSwgd2UgaW52aXRlIHlvdSB0byBqb2luIHRo ZQ0KPGNvZGU+I21lbGFuZ2U8L2NvZGU+IGNoYW5uZWwgaW4gdGhlIDxhIGhyZWY9Imh0dHBzOi8v ZGlzY29yZC5nZy9yZWFzb25tbCI+UmVhc29uIERpc2NvcmQ8L2E+Lg0KPC9wPg0KPHA+VGhhbmsg eW91IGZvciB0YWtpbmcgdGhlIHRpbWUgdG8gcmVhZCBhYm91dCBvdXIgcHJvZ3Jlc3Mgd2l0aCB0 aGUgRHVuZS1NZWxhbmdlIGludGVncmF0aW9uLiBXZSBob3BlIHlvdSBzaGFyZSBvdXIgZXhjaXRl bWVudCBhYm91dCB0aGlzIHByb2plY3QhDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i OSI+T3RoZXIgT0NhbWwgTmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtOSI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNzk3YTJlIiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMTc5N2EyZSI+RnJvbSB0aGUgb2NhbWwub3Jn IGJsb2c8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE3OTdh MmUiPg0KPHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQg YXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9yZyBibG9n PC9hPi4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDIzLTA1LTA1LW9wdGltaXNpbmctYXJjaGl2ZS1ub2RlLXN0b3JhZ2Ut Zm9yLXRlem9zIj5PcHRpbWlzaW5nIEFyY2hpdmUgTm9kZSBTdG9yYWdlIGZvciBUZXpvczwvYT4N CjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vdGVjaC5haHJlZnMuY29tL2FocmVmcy1pcy1ub3ct YnVpbHQtd2l0aC1tZWxhbmdlLWIxNGY1ZWM1NmRmND9zb3VyY2U9cnNzLS0tLTMwMzY2MmQ4OGJh ZS0tb2NhbWwiPkFocmVmcyBpcyBub3cgYnVpbHQgd2l0aCBNZWxhbmdlPC9hPg0KPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDQtMjgtb2NhbWwtYXQtbWlu aWRlYmNvbmYtdG4tMjAyMyI+T0NhbWwgYXQgTWluaWRlYkNvbmYgVE4gMjAyMzwvYT4NCjwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzhiOTM5YjAiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmc4YjkzOWIwIj5PbGQg Q1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmc4YjkzOWIw Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWls dG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9h PiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVm PSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9y IHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5S U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0 byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUgPGEgaHJl Zj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpv bmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnYWJlOGZmNyI+ DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0 PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRt bD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 2 May 2023 09:02:33 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 2 May 2023 09:02:32 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 2 May 2023 09:02:32 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34281k50022276 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 2 May 2023 09:01:46 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 34281b83022258 for ; Tue, 2 May 2023 09:01:37 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 May 2023 10:01:34 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 44867E0D40; Tue, 2 May 2023 10:01:33 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id AC85FE0D40 for ; Tue, 2 May 2023 10:01:26 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 May 2023 10:01:25 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3E0BA564623; Tue, 2 May 2023 10:01:23 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZfMxzkSHmiDvUgE+V20Bd8jPisw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 2 May 2023 09:01:22 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 1dbaf2e3-3275-42af-19b0-08db4ae39571 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.99,243,1677538800"; d="scan'208,217";a="54825440" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499704, queueID=87C96564656 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <2CE798EC9059224DADB95C910B21844E@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNS0wMiBUdWUgMDk6NTggLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDQuMjUuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNS4wOS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEFwcmlsIDI1IHRvIE1heSAwMiwgMjAyMy4N CjwvcD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5U YWJsZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiBy b2xlPSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+TGFtYmRhIENhcGFiaWxpdGll czwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPk15IFRob3VnaHRzIG9uIE9DYW1sIHZzIEhhc2tl bGwvUnVzdCBpbiAyMDIzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+SW50ZXJlc3RpbmcgT0Nh bWwgQXJ0aWNsZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5EcmVhbS1odG1sIC0gRFNMIHRv IGJ1aWxkIEhUTUwsIGludGVncmF0ZWQgd2l0aCBEcmVhbTwvYT4gPC9saT48bGk+PGEgaHJlZj0i IzUiPlRyeWluZyB0aGUgN0dVSXMgd2l0aCBMYWJsR1RLMy9PQ2FtbDwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzYiPkNhbGwgZm9yIG5ldyBvcGFtLXJlcG9zaXRvcnkgbWFpbnRhaW5lcnM8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiNvcmcwZGNkMmNlIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjEiPkxhbWJkYSBDYXBhYmlsaXRpZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2xhbWJkYS1jYXBhYmlsaXRpZXMvMTIwMjEvMSI+aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2xhbWJkYS1jYXBhYmlsaXRpZXMvMTIwMjEvMTwvYT4NCjwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODc0MjJhZiIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzg3NDIyYWYiPlRob21hcyBMZW9uYXJkIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODc0MjJhZiI+DQo8 cD5TZXZlcmFsIHBlb3BsZSwgYWZ0ZXIgcmVhZGluZyB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLW11bHRpY29yZS9laW8vYmxvYi9tYWluL1JFQURNRS5tZCI+DQpFaW8gdHV0 b3JpYWw8L2E+LCBoYXZlIGFza2VkIGZvciBtb3JlIGRldGFpbHMgYWJvdXQgd2hhdCDigJxjYXBh YmlsaXRpZXPigJ0gYXJlIChhbmQgd2h5IHRoZXkgc2hvdWxkIGNhcmUpLiBJIGNvdWxkbuKAmXQg ZmluZCBhbiBpbnRyb2R1Y3Rpb24gYWltZWQgYXQgZnVuY3Rpb25hbCBwcm9ncmFtbWVycywgc28g SSBoYWQgYSBnbyBhdCB3cml0aW5nIG15IG93bjoNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8v cm9zY2lkdXMuY29tL2Jsb2cvYmxvZy8yMDIzLzA0LzI2L2xhbWJkYS1jYXBhYmlsaXRpZXMvIj5o dHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAyMy8wNC8yNi9sYW1iZGEtY2FwYWJpbGl0 aWVzLzwvYT4NCjwvcD4NCjxwPlBsZWFzZSBsZXQgbWUga25vdyBpZiBhbnl0aGluZyBpcyB1bmNs ZWFyISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+TXkgVGhvdWdodHMgb24gT0Nh bWwgdnMgSGFza2VsbC9SdXN0IGluIDIwMjM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L215LXRob3VnaHRzLW9uLW9jYW1sLXZzLWhhc2tlbGwtcnVzdC1pbi0yMDIzLzEy MDI3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L215LXRob3VnaHRzLW9uLW9jYW1s LXZzLWhhc2tlbGwtcnVzdC1pbi0yMDIzLzEyMDI3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQxMjYwMDUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc0MTI2MDA1Ij5TaWQgS3NoYXRyaXlhIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNDEyNjAwNSI+DQo8cD5SZWNlbnRseSwgb3Nh MeKAmXMgPGEgaHJlZj0iaHR0cHM6Ly9vc2ExLm5ldC9wb3N0cy8yMDIzLTA0LTI0LW9jYW1sLXRo b3VnaHRzLmh0bWwiPg0KTXkgVGhvdWdodHMgb24gT0NhbWw8L2E+IGdlbmVyYXRlZCBxdWl0ZSBh IDxhIGhyZWY9Imh0dHBzOi8vbmV3cy55Y29tYmluYXRvci5jb20vaXRlbT9pZD0zNTY5OTY5NyI+ DQpyb2J1c3Q8L2E+IGNvbnZlcnNhdGlvbiBvbiBIYWNrZXIgTmV3cy4gT3ZlcmFsbCBJIGZlbHQg dGhlIGJsb2cgcG9zdCB3YXMgYSBiaXQgdG9vIGNyaXRpY2FsIGFib3V0IE9DYW1sLiBIb3dldmVy LCBldmVyeW9uZSBoYXMgYSByaWdodCB0byB0aGVpciBvcGluaW9ucyBhbmQgSSByZXNwZWN0IHdo YXRldmVyIGhhcyBiZWVuIHdyaXR0ZW4uDQo8L3A+DQo8cD5FeGNlcHQgZm9yIGEgY291cGxlIG9m IHBvaW50cywgdGhhdCBwb3N0IDxpPmRpZG7igJl0PC9pPiByZXNvbmF0ZSB3aXRoIG1lLCBzbyBJ IHRob3VnaHQgSSBzaG91bGQgcGVuIGRvd24gbXkgZ29vZC9iYWQgZXhwZXJpZW5jZXMgd2l0aCBP Q2FtbCBhbmQgc2VlIGlmIG90aGVycyBoYXZlIGZlbHQgdGhlIHNhbWUgd2F5IGFzIG1lLg0KPC9w Pg0KPHA+PGI+SeKAmXZlIHdyaXR0ZW4gYSBsb25naXNoIGJsb2cgcG9zdCA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vc2lka3NoYXRyaXlhL21lL2Jsb2IvbWFzdGVyLzAwNy1NeS1UaG91Z2h0 cy1vbi1PQ2FtbC12cy1IYXNrZWxsLVJ1c3QtMjAyMy5tZCI+DQpoZXJlPC9hPjwvYj4gYXMgc29y dCBteSByZXBvbnNlISBQbGVhc2UgY2hlY2sgaXQgb3V0ISA8L3A+DQo8cD5Zb3VyIGZlZWRiYWNr IGFuZCBjb21tZW50cyB3b3VsZCBiZSB1c2VmdWwhIDwvcD4NCjxwPklmIHBlb3BsZSB0aGluayB0 aGlzIGlzIGEgd29ydGh5IGJsb2cgcG9zdCwgSeKAmWQgbGlrZSB0byBwb3N0IG15IGJsb2cgb24g SGFja2VyIG5ld3MgYWxzbyA6LSkuIElmIGFueWJvZHkgZmVlbHMgZW50aHVzaWFzdGljIGFib3V0 IHRoaXMgd3JpdGUgdXAgZG8gZmVlbCBmcmVlIHRvIHB1dCBpdCB1cCBvbiBIYWNrZXJuZXdzIHlv dXJzZWxmIHRvbyENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmc2MmEwM2U5IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjJhMDNlOSI+ VGltIE1jR2lsY2hyaXN0IGxhdGVyIHNhaWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzYyYTAzZTkiPg0KPHA+QW5vdGhlciB0YWtlIG9uIHRoZSBjdXJyZW50 IHN0YXRlIG9mIE9DYW1sIGZyb20gPGEgaHJlZj0iaHR0cHM6Ly9ib3JyZXR0aS5tZS9hcnRpY2xl L3R3by15ZWFycy1vY2FtbCI+DQpodHRwczovL2JvcnJldHRpLm1lL2FydGljbGUvdHdvLXllYXJz LW9jYW1sPC9hPi4gVGhlcmUgYXJlIG1hbnkgcG9pbnRzIEkgZG8gYW5kIGRvbuKAmXQgYWdyZWUg d2l0aCBmcm9tIGJvdGgsIGJ1dCBJIHRoaW5rIGl0IGlzIGltcG9ydGFudCB0byByZWZsZWN0IG9u IHRoZSBsYW5ndWFnZSBhbmQgdG9vbGluZy4gVGhlc2UgZnJlc2ggdGFrZXMgb24gdGhpbmdzIGFy ZSB1c2VmdWwgdG8gcmVhZC4gVGhhbmtzIEBzaWQgZm9yIHRha2luZyB0aGUgdGltZSB0bw0KIHdy aXRlIHlvdXIgdmVyc2lvbiB1cC4gPC9wPg0KPHA+Rm9yIG1lIHBlcnNvbmFsbHkgSSB3b3VsZCBs aWtlIGEgdmVyc2lvbiBvZiBtb2R1bGFyIGltcGxpY2l0cyB0byBsYW5kIGFuZCB0byBoYXZlIGEg dHlwZWQgZWZmZWN0IHN5c3RlbSB0byBnbyBhbG9uZyB3aXRoIG15IEVJTy9NdWx0aWNvcmUuIEkg c2hvdWxkIHdyaXRldXAgYSBsb25nZXIgdmVyc2lvbiBnaXZlbiBteSBiYWNrZ3JvdW5kIHdpdGgg SGFza2VsbCBhbmQgT0NhbWwuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+SW50 ZXJlc3RpbmcgT0NhbWwgQXJ0aWNsZXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2ludGVyZXN0aW5nLW9jYW1sLWFydGljbGVzLzE4NjcvMTAyIj4NCmh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9pbnRlcmVzdGluZy1vY2FtbC1hcnRpY2xlcy8xODY3LzEwMjwvYT4g PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwMmNiZWQwIiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMDJjYmVkMCI+Tm9tYWRpY0xhYnMgYW5ub3VuY2Vk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwMmNiZWQwIj4N CjxwPldlIHB1Ymxpc2hlZCBhIGJsb2cgcG9zdCB0aGF0IG1pZ2h0IGJlIGludGVyZXN0aW5nIHRv IE9DYW1sIGRldnMuIFdoZW4gd29ya2luZyB3aXRoIGxhcmdlIGNvZGViYXNlcyBzdWNoIGFzIFRl em9zIE9jdGV6LCBpdCBpcyBpbXBvcnRhbnQgdG8gbWFrZSB0aGUgY29kZSBoaWdobHkgcmVhZGFi bGUuIERpc2NvdmVyIOKAnGxhYmVsbGVkIHR5cGUgcGFyYW1ldGVyc+KAnSAtIGEgbGVzc2VyLWtu b3duIE9DYW1sIHRyaWNrIHVzZWQgYnkgTm9tYWRpYyBMYWJzDQogZGV2cyB0byByZWFjaCB0aGlz IG9iamVjdGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9yZXNlYXJjaC1kZXZlbG9wbWVudC5ub21hZGlj LWxhYnMuY29tL2xhYmVsbGVkLXR5cGUtcGFyYW1ldGVycy1pbi1vY2FtbC5odG1sIj4NCmh0dHBz Oi8vcmVzZWFyY2gtZGV2ZWxvcG1lbnQubm9tYWRpYy1sYWJzLmNvbS9sYWJlbGxlZC10eXBlLXBh cmFtZXRlcnMtaW4tb2NhbWwuaHRtbDwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlk PSI0Ij5EcmVhbS1odG1sIC0gRFNMIHRvIGJ1aWxkIEhUTUwsIGludGVncmF0ZWQgd2l0aCBEcmVh bTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHJlLXJlbGVhc2UtZHJl YW0taHRtbC1kc2wtdG8tYnVpbGQtaHRtbC1pbnRlZ3JhdGVkLXdpdGgtZHJlYW0vMTIwMzIvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHJlLXJlbGVhc2UtZHJlYW0taHRtbC1kc2wt dG8tYnVpbGQtaHRtbC1pbnRlZ3JhdGVkLXdpdGgtZHJlYW0vMTIwMzIvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNzQ5NzdlZCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzc0OTc3ZWQiPllhd2FyIEFtaW4gYW5ub3VuY2VkPC9oMz4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3NDk3N2VkIj4NCjxwPkhpLCBJ IGhhdmUgYmVlbiB3b3JraW5nIG9uIGEg4oCZc2ltcGxl4oCZIE9DYW1sIGxpYnJhcnkgdG8gZ2Vu ZXJhdGUgSFRNTCwgd2l0aCBjbG9zZSBpbnRlZ3JhdGlvbiB3aXRoIERyZWFtLiBJIGFtIGFscmVh ZHkgdXNpbmcgaXQgb24gYQ0KPGEgaHJlZj0iaHR0cHM6Ly96ZXR0ZWxraXQueHl6LyI+c2lkZSBw cm9qZWN0PC9hPiBhbmQgdGhpbmsgaXTigJlzIG5lYXJpbmcgcHJvZHVjdGlvbiBsZXZlbCBmb3Ig Z2VuZXJhbCB1c2UuIEkgd2FudGVkIHRvIGdpdmUgYSBwcmV2aWV3IGhlcmUgaW4gY2FzZSBhbnlv bmUgaXMgaW50ZXJlc3RlZC4NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5SZXBvOiA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20veWF3YXJhbWluL2RyZWFtLWh0bWwiPmh0dHBzOi8v Z2l0aHViLmNvbS95YXdhcmFtaW4vZHJlYW0taHRtbDwvYT4NCjwvbGk+PGxpPkRvYzogPGEgaHJl Zj0iaHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJlYW0taHRtbC9EcmVh bV9odG1sL2luZGV4Lmh0bWwiPg0KaHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0 bWwvZHJlYW0taHRtbC9EcmVhbV9odG1sL2luZGV4Lmh0bWw8L2E+IDwvbGk+PC91bD4NCjxwPklu IHRlcm1zIG9mIGFwcHJvYWNoIHRha2VuLCBpdCBpcyBjbG9zZXIgdG8gPGEgaHJlZj0iaHR0cHM6 Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvd2Vicy9kb2MvV2Vic19odG1sL0VsL2luZGV4Lmh0bWwi Pg0KV2Vic19odG1sPC9hPiB0aGFuIHRvIFR5WE1MLiBUaGluZ3MgdGhhdCBhcmUgc3RhdGljYWxs eSB0eXBlY2hlY2tlZDogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPuKAmVN0YW5kYXJk 4oCZIHRhZ3MgaGF2ZSBhdHRyaWJ1dGVzIGFuZCBjaGlsZHJlbiA8L2xpPjxsaT5Wb2lkIGVsZW1l bnRzIGhhdmUgbm8gY2hpbGRyZW4gPC9saT48bGk+U29tZSB0YWdzIGNhbiBjb250YWluIG9ubHkg YSBzaW5nbGUgdGV4dCBub2RlIDwvbGk+PGxpPkF0dHJpYnV0ZXMgd2l0aCBib29sZWFuLCBpbnQs IG9yIGVudW1lcmF0ZWQgc3RyaW5nIHZhbHVlcyA8L2xpPjwvdWw+DQo8cD5BbGwgYXR0cmlidXRl cyBhbmQgdGV4dCBub2RlcyBzdXBwb3J0IGZvcm1hdCBzdHJpbmdzIGkuZS4gaW50ZXJwb2xhdGlv bi4gU28gbm8gbmVlZCB0byBwdWxsIGluDQo8Y29kZT5QcmludGYuc3ByaW50ZjwvY29kZT4uIEhU TUwgY29tbWVudHMgYXJlIGFsc28gc3VwcG9ydGVkLiBIVE1MIGVzY2FwaW5nIGlzIGRvbmUgZm9y IGFsbW9zdCBhbGwgdGV4dCBub2RlcyBhbmQgYXR0cmlidXRlIHZhbHVlcywgbGVhdmluZyBhc2lk ZSB0aGUgb25lcyB0aGF0IGFyZW7igJl0IHN1cHBvcnRlZCBieSBEcmVhbeKAmXMgZXNjYXBpbmcg aS5lLiBKYXZhU2NyaXB0IGFuZCBDU1MgY29udGVudC4NCjwvcD4NCjxwPk9oLCBvbmUgbW9yZSB0 aGluZy4gSSBhbHNvIGFkZGVkIHRoZSBjb3JlIGh0bXggYXR0cmlidXRlcyBzaW5jZSBJ4oCZbSB1 c2luZyBodG14Lg0KPC9wPg0KPHA+Q2hlY2sgb3V0IHRoZSB0ZXN0IGZpbGUgZm9yIGEgc2xpZ2h0 bHkgbGFyZ2VyIGlkaW9tYXRpYyB1c2FnZTogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3lh d2FyYW1pbi9kcmVhbS1odG1sL2Jsb2IvbWFpbi90ZXN0L2RyZWFtX2h0bWxfdGVzdC5tbCI+DQpo dHRwczovL2dpdGh1Yi5jb20veWF3YXJhbWluL2RyZWFtLWh0bWwvYmxvYi9tYWluL3Rlc3QvZHJl YW1faHRtbF90ZXN0Lm1sPC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnNWU4MGQwYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzVl ODBkMGIiPlNpbW9uIENydWFuZXMgdGhlbiBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmc1ZTgwZDBiIj4NCjxwPlZlcnkgbmljZSEgSSBsaWtlIHRoaXMg Y29tYmluYXRvci1iYXNlZCBhcHByb2FjaCwgSSBoYXZlIDxhIGhyZWY9Imh0dHBzOi8vYy1jdWJl LmdpdGh1Yi5pby90aW55X2h0dHBkLzAuMTIvdGlueV9odHRwZC9UaW55X2h0dHBkX2h0bWwvaW5k ZXguaHRtbCI+DQphIHNpbWlsYXIgdGhpbmc8L2E+IGluIHRpbnlfaHR0cGQuIEkgdGhpbmsgaXTi gJlzIGEgbmljZSBiYWxhbmNlIGJldHdlZW4gc2ltcGxpY2l0eSBhbmQgZXhwcmVzc2l2ZW5lc3Mu DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+VHJ5aW5nIHRoZSA3R1VJcyB3aXRo IExhYmxHVEszL09DYW1sPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4 dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90 cnlpbmctdGhlLTdndWlzLXdpdGgtbGFibGd0azMtb2NhbWwvMTIwMzMvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvdHJ5aW5nLXRoZS03Z3Vpcy13aXRoLWxhYmxndGszLW9jYW1sLzEy MDMzLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYzJi ZTY0YSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2MyYmU2NGEiPkZyw6lkw6lyaWMg TG95ZXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmdjMmJlNjRhIj4NCjxwPkkgaGF2ZSB0cmllZCB0byBpbXBsZW1lbnQgdGhlIDdHVUlzICg8 YSBocmVmPSJodHRwczovL2V1Z2Vua2lzcy5naXRodWIuaW8vN2d1aXMvIj5odHRwczovL2V1Z2Vu a2lzcy5naXRodWIuaW8vN2d1aXMvPC9hPikgd2l0aCBMYWJsR1RLMy9PQ2FtbC4NCjwvcD4NCjxw PlRoZSBmaXJzdCA2IGFyZSBkb25lIChidXQgd291bGQgbmVlZCBzb21lIHBvbGlzaGluZykuIFRo ZSBsYXN0IG9uZSB3b27igJl0IGJlIHBvc3NpYmxlICh0aGVyZSBhcmUgbm8gcmVhbCBUYWJsZSB3 aWRnZXQgaW4gR3Rr4oCmIHRoZW4gdGhlDQo8Y29kZT5ndGtzaGVldDwvY29kZT4gZXhhbXBsZSBp cyByYXRoZXIgYmlnKS4gPC9wPg0KPHA+SSBoaGF2ZSB0byBhZG1pdCB0aGF0IGZpbmRpbmcgc29t ZSBmdW5jdGlvbnMvbWV0aG9kIHdhcyBub3QgYWx3YXlzIGVhc3kuIEZvciBjaGFuZ2luZyB0aGUg YmFja2dyb3VuZCBvZiBhIHdpZGdldCwgbXVsdGlwbGUgbWV0aG9kcyBleGlzdCBhbmQgb25seSBv bmUgd29ya3MuIFNvbWUgbWV0aG9kcyBhcmUgaGlkZGVuIGluIGENCjxjb2RlPiNtaXNjPC9jb2Rl PiBzdWZmaXggKDxjb2RlPmRyYXdpbmcjbWlzYyNxdWV1ZV9kcmF3PC9jb2RlPuKApiksIEkgaGFk IHRvIGhhY2sgc29tZSB3YXkgdG8gY3JlYXRlIGENCjxjb2RlPkdNaXNjLmRyYXdpbmdfYXJlYTwv Y29kZT4gb2YgYSBnaXZlbiBkaW1lbnNpb24gc2luY2UgdGhpcyBjb25zdHJ1Y3RvciBkb2VzbuKA mXQgbGlrZQ0KPGNvZGU+fndpZHRoPC9jb2RlPiBvciA8Y29kZT5+aGVpZ2h0PC9jb2RlPi4gQnV0 IHRoZSBsaWJyYXJ5IHNlZW1zIHRvIGJlIHJhdGhlciBjb252ZW5pZW50IGFuZCBjb21wbGV0ZS4N CjwvcD4NCjxwPlNlZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vRi1sb3llci83Z3Vpcy1v Y2FtbC1sYWJsZ3RrMyI+SW1wbGVtZW50YXRpb24gb2YgN0dVSXMgaW4gT0NhbWwgd2l0aCBMYWJs R3RrMzwvYT4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc2MGVkYzExIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjBlZGMxMSI+TGF0 ZXIgb24sIEZyw6lkw6lyaWMgTG95ZXIgc2FpZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnNjBlZGMxMSI+DQo8cD5JIGd1ZXNzIHRoZSA8Y29kZT5DZWxsczwv Y29kZT4gaXMgbmVhcmx5IHJlYWR5IHdpdGggb25lIGZ1bmN0aW9uIChTVU0pIHdoaWNoIHN1cHBv cnQgcmFuZ2UgYW5kIGxpc3Qgb2YgcmFuZ2UsIHRoZSA0IGFyaXRobWV0aWMgb3BlcmF0b3JzICYj NDM7IDIgdW5hcnkgb3BlcmF0b3JzLiBUaGVyZSBhcmUgc29tZSBsYWNraW5nIGVuaGFuY2VtZW50 IChOdWxsVmFsdWVzIGNvdWxkIGJlIHNlZW4gYXMgMOKApikuDQo8L3A+DQo8cD5UaGUgbnVtYmVy IG9mIGxpbmVzIG9mIGNvZGUgaXM6IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdj YWU1NTBjIj4NCiAgIDIxIGxleGVyLm1sbA0KICAgNDMgcGFyc2VyLm1seQ0KICAxODkgZXhwci5t bA0KICAgNzMgY2VsbHMubWwNCiAgMzI2IHRvdGFsDQo8L3ByZT4NCjxwPlRoZSA3dGggaXMgbmVh cmx5IGFzIGJpZyBhcyB0aGUgNiBmaXJzdCB0b2dldGhlciEgPC9wPg0KPHA+V2hlcmUgYWxsIHRo ZSBzcHJlYWRzaGVldCBlbmdpbmUgaXMgaW4gPGNvZGU+ZXhwci5tbDwvY29kZT4gQ2VsbHMgZGVh bHMgd2l0aCB0aGUgR1VJIChhbmQgdGhlIFBhcnNlciBjYWxscyBzaW5jZSBJIGNhbiBoYXZlIGEg ZGVwYW5jeSBjaXJjbGUgUGFyc2VyJmx0Oy0mZ3Q7RXhwcikuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjYwZTYzMiIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZzI2MGU2MzIiPkZyw6lkw6lyaWMgTG95ZXIgYWRkZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzI2MGU2MzIiPg0KPHA+Tm90ZSwg dGhlIHNpdGUgaGFzIG1pZ3JhdGVkIGhlcmUgOiA8YSBocmVmPSJodHRwczovLzdndWlzLmdpdGh1 Yi5pby83Z3Vpcy9pbXBsZW1lbnRhdGlvbnMvIj4NCmh0dHBzOi8vN2d1aXMuZ2l0aHViLmlvLzdn dWlzL2ltcGxlbWVudGF0aW9ucy88L2E+IDwvcD4NCjxwPkkgaG9wZSBteSBwdWxsIHJlcXVlc3Qg d2lsbCBiZSBoYW5kbGVkIHNvb24gYW5kIG1ha2VzIG15IGNvbnRyaWJ1dGlvbiByZWZlcmVuY2Vk Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPkNhbGwgZm9yIG5ldyBvcGFtLXJl cG9zaXRvcnkgbWFpbnRhaW5lcnM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2NhbGwtZm9yLW5ldy1vcGFtLXJlcG9zaXRvcnktbWFpbnRhaW5lcnMvMTIwNDEvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY2FsbC1mb3ItbmV3LW9wYW0tcmVwb3NpdG9yeS1t YWludGFpbmVycy8xMjA0MS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzRlYjZmYjEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0ZWI2ZmIx Ij5LYXRlIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnNGViNmZiMSI+DQo8cD5Db21lIGFuZCBoZWxwIG1haW50ZW5hbmNlIG9mIHRoZSA8Y29k ZT5vcGFtLXJlcG9zaXRvcnk8L2NvZGU+ISA8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5Ij5vcGFtLXJlcG9zaXRvcnk8L2E+IGlzIHRoZSBv ZmZpY2lhbCBzdG9yZSBvZiBwYWNrYWdlIGRlc2NyaXB0aW9ucyBmb3IgdGhlIE9DYW1sIGVjb3N5 c3RlbS4gSXQgYWxsb3dzIGV2ZXJ5b25lIHRvIGVhc2lseSBpbnN0YWxsIHdoYXRldmVyIGRlcGVu ZGVuY3kgdGhlaXIgcHJvamVjdCBtaWdodCBuZWVkLiBJdCBhbHNvIGFsbG93cyBldmVyeW9uZSwg YnkganVzdA0KIG9wZW5pbmcgYSBQUiwgdG8gZWFzaWx5IG1ha2UgdGhlaXIgY29kZSBhdmFpbGFi bGUgdG8gdGhlIGNvbW11bml0eSBhdCBsYXJnZS4gPC9wPg0KPHA+VGhlIHJlcG9zaXRvcnkgaXMg bWFpbnRhaW5lZCBieSBhIGhhbmRmdWwgb2YgcGVvcGxlIHdobyB3b3JrIHRvZ2V0aGVyIHRvIGVu c3VyZSB0aGF0IHRoZSBwYWNrYWdlcyBhcmUgdXAtdG8tZGF0ZSwgaGlnaC1xdWFsaXR5LCBhbmQg dGhlaXIgbWV0YWRhdGEgYXJlIGNvbnNpc3RlbnQuDQo8Yj48Yj5XZSBhcmUgbG9va2luZyBmb3Ig bmV3IGNvbnRyaWJ1dG9ycyB0byBoZWxwIHVzIG1haW50YWluIHRoZSByZXBvc2l0b3J5IGFuZCBr ZWVwIGl0IHJ1bm5pbmcgc21vb3RobHkuPC9iPjwvYj4NCjwvcD4NCjxwPllvdSBkb27igJl0IG5l ZWQgdG8gYmUgYW4gZXhwZXJ0IGluIE9DYW1sIG9yIDxjb2RlPm9wYW08L2NvZGU+IHRvIGdldCBp bnZvbHZlZCDigJMgYWxsIHlvdSBuZWVkIGlzIGEgd2lsbGluZ25lc3MgdG8gbGVhcm4gYW5kIGEg ZGVzaXJlIHRvIGNvbnRyaWJ1dGUgKGFuZCBhIGdpdGh1YiBhY2NvdW50IDpzd2VhdF9zbWlsZTop LiBBcyBhIG5ldyBtYWludGFpbmVyLCB5b3XigJlsbCBzdGFydCB3aXRoIHRyaWFnaW5nIGFjY2Vz cywgd2hpY2ggbWVhbnMgeW914oCZbGwNCiBiZSBhYmxlIHRvIHJldmlldyBhbmQgYXBwcm92ZSBj aGFuZ2VzIHRvIHRoZSByZXBvc2l0b3J5LiBBZnRlciBhIGZldyB3ZWVrcyBvZiBzdWNjZXNzZnVs IHRyaWFnaW5nLCB5b3UgY2FuIGRlY2lkZSB0byBzdGljayBhcm91bmQgYW5kIHlvdeKAmWxsIGJl IGdyYW50ZWQgZnVsbCBhY2Nlc3MuDQo8L3A+DQo8cD5MZXQgdXMga25vdyBpZiB5b3UgaGF2ZSBh bnkgcXVlc3Rpb25zIG9yIGlmIHlvdSB3YW50IHRvIHRyeSBpdCBvdXQhIDwvcD4NCjxwPkthdGUs IE1hcmNlbGxvLCBSYXBoYcOrbCA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwZGNkMmNlIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0ib3JnMGRjZDJjZSI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtb3JnMGRjZDJjZSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpz ZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4N CnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxw PklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBt YXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2Ft bC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFt ZSIgaWQ9Im9yZzU4MGNkNTciPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 25 Apr 2023 10:27:08 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 25 Apr 2023 10:27:07 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 25 Apr 2023 10:27:07 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33P9QLhM028364 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 25 Apr 2023 10:26:21 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33P9QAUt028351 for ; Tue, 25 Apr 2023 10:26:10 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Apr 2023 11:26:09 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 4BB4DE0277; Tue, 25 Apr 2023 11:26:09 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C1DE1E019E for ; Tue, 25 Apr 2023 11:26:03 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Apr 2023 11:26:01 +0200 Received: from TM (static-176-183-135-2.ncc.abo.bbox.fr [176.183.135.2]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id CB4F856469A; Tue, 25 Apr 2023 11:25:59 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZd1gbdLfh/zknhE6Xt31e1VaGBw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 25 Apr 2023 10:25:59 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 14dff88e-49e6-4660-c7d0-08db456f3d84 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.99,225,1677538800"; d="scan'208,217";a="54296723" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.468877, queueID=6C44D5646A9 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <0EA10AE5DD6A8843B04B70E1EEE72D4B@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNC0yNSBUdWUgMTE6MjMgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDQuMTguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNS4wMi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEFwcmlsIDE4IHRvIDI1LCAyMDIzLiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPkRyZWFtIGRldmVsb3BtZW50IHN0cmVh bSAmIzQzOyBPQ2FtbCBvZmZpY2UgaG91cnM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5OZXcg cmVsZWFzZSBvZiBNZW5oaXIgKDIwMjMwNDE1KTwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkZ1 bmN0aW9uYWwgd2ViIGFwcGxpY2F0aW9ucyBydW5uaW5nIGluIHRoZSBicm93c2VyPC9hPiA8L2xp PjxsaT48YSBocmVmPSIjNCI+VGltbXkgMS4wLjAsIGEgaGlnaCBsZXZlbCB0aW1lIGFuZCBjYWxl bmRhciBsaWJyYXJ5PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNSI+V2VkLCBBcHIgMTkgQCA3cG0g VS5TLiBDZW50cmFsOiBKb25haCBCZWNrZm9yZCBvbiDigJxXaGF0IGRpc3RyaWJ1dGluZyBPQ2Ft bCBvbiBXaW5kb3dzIGdhdmUgbWUgKGFuZCB5b3Up4oCdPC9hPg0KPC9saT48bGk+PGEgaHJlZj0i IzYiPlRoZSBPQ2FtbCBDaGFuZ2Vsb2c8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5PVVBTIG1l ZXR1cCBtYXkgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzgiPjMteWVhciBlbmdpbmVlcmlu ZyBwb3NpdGlvbiBpbiBEZWR1Y3RlYW0sIElucmlhIFBhcmlzLVNhY2xheSwgRnJhbmNlPC9hPg0K PC9saT48bGk+PGEgaHJlZj0iIzkiPlJGQyBmb3IgYSBkaXN0cmlidXRlZCBwcm9jZXNzL2FjdG9y IG1vZGVsIGxpYnJhcnk8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMxMCI+Y2ZnZW4gcHJldmlldyBy ZWxlYXNlIHYxLjAuMC1hbHBoYS4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMTEiPk90aGVyIE9D YW1sIE5ld3M8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmdhYzE1OTk3Ij5PbGQgQ1dOPC9hPiA8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPkRyZWFtIGRldmVsb3BtZW50IHN0cmVhbSAm IzQzOyBPQ2FtbCBvZmZpY2UgaG91cnM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2RyZWFtLWRldmVsb3BtZW50LXN0cmVhbS1vY2FtbC1vZmZpY2UtaG91cnMvMTE5Nzcv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZHJlYW0tZGV2ZWxvcG1lbnQtc3RyZWFt LW9jYW1sLW9mZmljZS1ob3Vycy8xMTk3Ny8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmc5NmVmYWEyIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnOTZlZmFhMiI+QW50b24gQmFjaGluIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTZlZmFhMiI+DQo8cD5DaGF0IHdpdGggbWUgd2hpbGUg SSBkZXZlbG9wIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hYW50cm9uL2RyZWFtI3JlYWRt ZSI+DQpEcmVhbTwvYT4sIGJ1dCBhbHNvIGFzayBhbnkgcXVlc3Rpb25zIGF0IGFsbCBhYm91dCBP Q2FtbCEgPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD48YSBocmVmPSJodHRwczovL3d3dy50d2l0Y2gu dHYvYW50cm9uX01MIj48Yj48L2E+PGEgaHJlZj0iaHR0cHM6Ly93d3cudHdpdGNoLnR2L2FudHJv bl9NTCI+aHR0cHM6Ly93d3cudHdpdGNoLnR2L2FudHJvbl9NTDwvYT48L2I+DQo8L3A+DQo8L2Js b2NrcXVvdGU+DQo8cD5J4oCZbGwgYmUgc3RyZWFtaW5nIERyZWFtIGRldmVsb3BtZW50IG9uIFR3 aXRjaCBhdCAxNDowMCBDRVNUIChQYXJpcyB0aW1lKSBvbiBtb3N0IHdlZWtkYXlzLCBhbmQgZGVm aW5pdGVseSBvbiBldmVyeSBUaHVyc2RheS4gRWFjaCB0aW1lLCBJ4oCZbGwgc3RyZWFtIGZvciBh dCBsZWFzdCBvbmUgaG91ci4NCjwvcD4NCjxwPlRvbW9ycm93LCBvbiBXZWRuZXNkYXksIEFwcmls IDE5dGgsIGF0IDE0OjAwIENFU1QsIEkgd2lsbCBiZSBjb250aW51aW5nIHRvIHJldmlldyB0aGUN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hYW50cm9uL2RyZWFtL3B1bGwvMjU0Ij5EcmVh bSBFaW8gUFI8L2E+IGJ5IEB0YWxleDUgYW5kIEBXaWxsZW5icmluaywgYWRkaW5nIG1vcmUgZGV0 YWlsIHRvIGFuZCByZXZpc2luZyB0aGUNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hYW50 cm9uL2RyZWFtL3dpa2kvMS4wLVJvYWRtYXAtRHJhZnQiPkRyZWFtIDEuMCByb2FkbWFwPC9hPiwg YW5kIGdlbmVyYWxseSBqdXN0IGJlIGF2YWlsYWJsZSB0byB0YWxrIGFib3V0IGFueXRoaW5nIHJl bGF0ZWQgdG8gT0NhbWwuIFdlIGNhbiBidWlsZCB0b3kgcHJvamVjdHMsIGRlbW9zLCB3b3JrIG91 dCBjb25jZXB0cywgZXRjLiBJZiB5b3XigJlkIGxpa2UgdG8gY29udHJpYnV0ZSB0byBEcmVhbSwN CiB3ZSBjYW4gZGlzY3VzcyBnb29kIGZpcnN0IGlzc3VlcywgcmV2aWV3IHlvdXIgUFJzLCBhbmQg Y29sbGFiYXJvdGUgb3RoZXJ3aXNlISA8L3A+DQo8cD5PdXRzaWRlIHRoZSBzdHJlYW0sIEkgY2Fu IGJlIHJlYWNoZWQgaW4gI3dlYmRldiBvbiB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjb3JkLmdn L25lRmdRYnNIIj4NCk9DYW1sIERpc2NvcmQ8L2E+IG9yICNkcmVhbSBvbiB0aGUgPGEgaHJlZj0i aHR0cHM6Ly9kaXNjb3JkLmdnL3JlYXNvbm1sIj5SZWFzb24gRGlzY29yZDwvYT4uIE15IG5pY2tu YW1lIG9uIGJvdGggaXMNCjxiPmFudHJvbjwvYj4uIDwvcD4NCjxwPkluIHRoZSBmdXR1cmUsIEni gJlkIGJlIGhhcHB5IHRvIGNvbnNpZGVyIHNvbWV0aGluZyBtb3JlIGludGVyYWN0aXZlIHRoYW4g YSBUd2l0Y2ggc3RyZWFtIOKAkyBzb21ldGhpbmcgd2hlcmUgcGVvcGxlIGNhbiB0YWxrIGJhY2ss IHByb2JhYmx5IHNvbWUgc29ydCBvZiBkZXZlbG9wZXIgb3IgY29udHJpYnV0b3IgbWVldGluZy4g QnV0IGl0IHNlZW1zIHRoYXQgVHdpdGNoIGlzIHRoZSByaWdodCBwbGFjZSB0byBnZXQgc3RhcnRl ZC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2 NDVlZmFmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjQ1ZWZhZiI+QW50b24gQmFj aGluIGxhdGVyIHNhaWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzY0NWVmYWYiPg0KPHA+VGhhbmtzIHRvIGV2ZXJ5b25lIGZvciBjb21pbmcgdG8gdGhlIHN0 cmVhbSB0b2RheSEgV2UgaGFkIGEgcHJldHR5IGdvb2Qgdmlld2Vyc2hpcCEgVGhlIG5leHQgc3Ry ZWFtIGlzIHRvbW9ycm93LCBUaHVyc2RheSwgQXByaWwgMjB0aCwgYXQgdGhlIHNhbWUgdGltZTog MTQ6MDAgQ0VTVC4NCjwvcD4NCjxwPlRvZGF5LCB3ZSBnb3QgdGhlIEVpbyBQUiBidWlsZGluZywg YW5kIGZvdW5kIHNvbWUgcHJvYmxlbXMgd2l0aCBpdCDigJMgZml4aW5nIHRob3NlIHByb2JsZW1z IG9mZmxpbmUgYW5kIGR1cmluZyB0aGUgbmV4dCBzdHJlYW0gd2lsbCBiZSBhIGdvb2Qgd2F5IHRv IHN0YXJ0IHJldmlld2luZyB0aGUgaW50ZXJuYWwgY2hhbmdlcyBpbiBkZXRhaWwhIFdlIGFsc28g dGFsa2VkIGFib3V0IHBsYW5zIGZvciBEcmVhbSBhbmQgZGlzY3Vzc2VkIHNvbWUgb2YNCiBEcmVh beKAmXMgZGVwZW5kZW5jaWVzIGFuZCBkZXZlbG9wZXIgdG9vbHMuIDwvcD4NCjxwPkkgcG9zdCB0 aGUgbmV4dCBzdHJlYW0gdGltZSBhbmQgaXRzIHRvcGljIGluIHRoZSBiYW5uZXIgaW1hZ2Ugb2Yg dGhlIDxhIGhyZWY9Imh0dHBzOi8vd3d3LnR3aXRjaC50di9hbnRyb25fTUwiPg0Kc3RyZWFtPC9h Piwgc28geW91IGNhbiBlYXNpbHkgZmluZCBvdXQgd2hlbiBpdOKAmXMgcGxhbm5lZCBldmVuIHdo ZW4gdGhlIHN0cmVhbSBpcyBvZmZsaW5lLiBQbGFubmVkIHN0cmVhbXMgYXJlIGFsc28gaW4gdGhl DQo8YSBocmVmPSJodHRwczovL3d3dy50d2l0Y2gudHYvYW50cm9uX01ML3NjaGVkdWxlIj5zY2hl ZHVsZTwvYT4uIEZvciB3ZWVrZGF5cyBiZXNpZGVzIFRodXJzZGF5LCBJ4oCZbGwgZGVjaWRlIGFi b3V0IHN0cmVhbWluZyBhIGZldyBkYXlzIGluIGFkdmFuY2UuDQo8L3A+DQo8cD5TdWdnZXN0aW9u cyBmb3IgaG93IHRvIG1ha2UgdGhlIHN0cmVhbSBuaWNlciBhcmUgd2VsY29tZSA6KSBJIHRyeSB0 byBtYWludGFpbiBhIGdvb2QgbG9vayBmb3IgbXkgd2luZG93cyBhbmQgdXNlIHNvbWUgZ29vZnkg VlNDb2RlIGV4dGVuc2lvbnMuIElmIHdlIHN0YXJ0IGRvaW5nIGxvbmcsIGJvcmluZyBidWlsZHMs IHdlIGNhbiBtYXliZSBhZGQgZ2FtZXMgZm9yIHZpZXdlcnMgdG8gcGxheSBvciBldmVuIGEgY2F0 IGNhbSwgdGhvdWdoIEkgdGhpbmsNCiB0aGF0IGlzIGEgc3RyZXRjaCBhdCB0aGlzIHBvaW50IDop IFNvIGZhciwgSeKAmXZlIGJlZW4gYWJsZSB0byBkbyBhbGwgdGhlIHZlcnkgc2xvdyBzdHVmZiBv ZmZsaW5lLg0KPC9wPg0KPHA+QXMgdGhlIHN0cmVhbSBiZWNvbWVzIG1vcmUgb2YgYSByZWd1bGFy IG9jY3VycmVuY2UsIEnigJlsbCBzdG9wIHBvc3RpbmcgYWJvdXQgaXQgaGVyZSwgYnV0IEnigJls bCBwcm9iYWJseSBjb250aW51ZSB0byBhbm5vdW5jZSBpdCBpbiB0aGUNCjxhIGhyZWY9Imh0dHBz Oi8vZGlzY29yZC5nZy9yZWFzb25tbCI+UmVhc29uPC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9k aXNjb3JkLmdnL25lRmdRYnNIIj4NCk9DYW1sIERpc2NvcmRzPC9hPiwgb25jZSBJIGZpZ3VyZSBv dXQgd2hhdCBjaGFubmVscyBhcmUgYXBwcm9wcmlhdGUgZm9yIHRoYXQuIFByb2JhYmx5ICNkcmVh bSBhbmQgI3dlYmRldiwgcmVzcGVjdGl2ZWx5Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjIiPk5ldyByZWxlYXNlIG9mIE1lbmhpciAoMjAyMzA0MTUpPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2YtbWVuaGlyLTIwMjMwNDE1 LzExOTgzLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctcmVsZWFzZS1v Zi1tZW5oaXItMjAyMzA0MTUvMTE5ODMvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc0NzE3OGE4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn NDcxNzhhOCI+RnJhbsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0NzE3OGE4Ij4NCjxwPkl0IGlzIG15IHBsZWFzdXJl IHRvIGFubm91bmNlIGEgbmV3IHJlbGVhc2Ugb2YgTWVuaGlyLCB3aXRoIGEgbnVtYmVyIG9mIG1p bm9yIGltcHJvdmVtZW50cy4NCjwvcD4NCjxwPlRoZSBjaGFuZ2UgbG9nIGFwcGVhcnMgYmVsb3cu IFRoZSBtYWluIHBvaW50IG9mIG5vdGljZSBpcyB0aGF0ICh3aGVuIHVzaW5nIHRoZSBjb2RlIGJh Y2stZW5kKSB0aGUgZGVmYXVsdCBvcHRpbWl6YXRpb24gbGV2ZWwgaGFzIGJlZW4gY2hhbmdlZCBm cm9tDQo8Y29kZT4tTyAyPC9jb2RlPiB0byA8Y29kZT4tTyAxPC9jb2RlPi4gU28sIGlmIHlvdSBu ZWVkIHRvIGtlZXAgaWRlbnRpY2FsIGdlbmVyYXRlZCBjb2RlIGFuZCBwZXJmb3JtYW5jZSwgeW91 IHNob3VsZCBub3cgZXhwbGljaXRseSBwYXNzDQo8Y29kZT4tTyAyPC9jb2RlPiB0byBNZW5oaXIu IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdkNDMxZWYwIj4NCiAgb3BhbSB1cGRh dGUNCiAgb3BhbSBpbnN0YWxsIG1lbmhpci4yMDIzMDQxNQ0KPC9wcmU+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2IzZjc2ZjAiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdiM2Y3NmYwIj4yMDIzLzA0LzE1PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC00IiBpZD0idGV4dC1vcmdiM2Y3NmYwIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XaGVu IHVzaW5nIHRoZSBjb2RlIGJhY2stZW5kLCB0aGUgZGVmYXVsdCBvcHRpbWl6YXRpb24gbGV2ZWwg aXMgbm93IDxjb2RlPi1PIDE8L2NvZGU+IGluc3RlYWQgb2YNCjxjb2RlPi1PIDI8L2NvZGU+LiBT b21lIHVzZXJzIHJlcG9ydGVkIHRoYXQgPGNvZGU+LU8gMjwvY29kZT4gaXMgdG9vIGFnZ3Jlc3Np dmUgYW5kIGNhbiBjYXVzZSBhIGJsb3ctdXAgaW4gdGhlIHNpemUgb2YgdGhlIGNvZGUuDQo8L2xp PjxsaT5Ud2VhayB0aGUgY29kZSBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIE9DYW1sIDUuMS4gKENv bnRyaWJ1dGVkIGJ5IEZsb3JpYW4gQW5nZWxldHRpLikNCjwvbGk+PGxpPlRoZSBuZXcgZnVuY3Rp b24gPGNvZGU+TWVuaGlyTGliLkxleGVyVXRpbC50YWJ1bGF0ZTwvY29kZT4gbWFrZXMgaXQgZWFz eSB0byBydW4gdGhlIGxleGVyIGFuZCBwYXJzZXIgaW4gdHdvIHNlcGFyYXRlIHBoYXNlcy4gVGhp cyBjYW4gYmUgdXNlZnVsIHdoZW4gb25lIHdpc2hlcyB0byBiZW5jaG1hcmsgdGhlbSBzZXBhcmF0 ZWx5Lg0KPC9saT48bGk+VG8gdXNlIHRoZSBpbnRlcnByZXRlciBhbmQgcHJpbnQgYSBjb25jcmV0 ZSBzeW50YXggdHJlZSwgaXQgdXNlZCB0byBiZSBuZWNlc3NhcnkgdG8gcGFzcyBib3RoDQo8Y29k ZT4tLWludGVycHJldDwvY29kZT4gYW5kIDxjb2RlPi0taW50ZXJwcmV0LXNob3ctY3N0PC9jb2Rl Pi4gSXQgaXMgbm93IHN1ZmZpY2llbnQgdG8gcGFzcyBqdXN0DQo8Y29kZT4tLWludGVycHJldC1z aG93LWNzdDwvY29kZT4uIChJZiBib3RoIGFyZSBwYXNzZWQsIHRoZW4gb25seSB0aGUgbGFzdCBv bmUgaXMgb2JleWVkLikgVGhpcyBmaXhlcyB0aGUgYXNzZXJ0aW9uIGZhaWx1cmUgdGhhdCB3b3Vs ZCBiZSBvYnNlcnZlZCB3aGVuDQo8Y29kZT4tLWludGVycHJldC1zaG93LWNzdDwvY29kZT4gYWxv bmUgd2FzIHVzZWQuIChSZXBvcnRlZCBieSBSZWVkIE11bGxhbml4LikgPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0z IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMyI+RnVuY3Rpb25hbCB3ZWIgYXBwbGljYXRp b25zIHJ1bm5pbmcgaW4gdGhlIGJyb3dzZXI8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1mdW5jdGlvbmFsLXdlYi1hcHBsaWNhdGlvbnMtcnVubmluZy1pbi10aGUt YnJvd3Nlci8xMTk4NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZnVuY3Rp b25hbC13ZWItYXBwbGljYXRpb25zLXJ1bm5pbmctaW4tdGhlLWJyb3dzZXIvMTE5ODQvMTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzFkZWFkZiIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzMxZGVhZGYiPkhlbG11dCBhbm5vdW5jZWQ8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzMxZGVhZGYiPg0KPHA+ SSBhbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5 IDxhIGhyZWY9Imh0dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi9vZG9jL2ZtbGliX2Jyb3dzZXIv Ij4NCmZtbGliX2Jyb3dzZXI8L2E+LiA8L3A+DQo8cD5JZiB5b3Ugd2FudCB0byB3cml0ZSBmdW5j dGlvbmFsIHdlYiBhcHBsaWNhdGlvbnMgcnVubmluZyBpbiB0aGUgYnJvd3NlciB0aGUgbGlicmFy eQ0KPGEgaHJlZj0iaHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvZm1saWJfYnJvd3Nl ci8iPmZtbGliX2Jyb3dzZXI8L2E+IG1pZ2h0IGludGVyZXN0IHlvdS4gSXQgYWxsb3dzIHdlYiBh cHBsaWNhdGlvbnMgaW4gdGhlDQo8YSBocmVmPSJodHRwczovL2VsbS1sYW5nLm9yZy8iPmVsbTwv YT4gc3R5bGUgdXNpbmcgdGhlIG11Y2ggbW9yZSBwb3dlcmZ1bCBsYW5ndWFnZSBvY2FtbC4NCjwv cD4NCjxwPkkgaGF2ZSBkaXNjb3ZlcmVkIHRoZSBlbG0gbGFuZ3VhZ2Ugc29tZSB5ZWFycyBhZ28g YW5kIEkgYW0gY29udmluY2VkIHRoYXQgdGhpcyBraW5kIHRvIHdyaXRlIHdlYiBhcHBsaWNhdGlv bnMgaXMgb25lIGltcG9ydGFudCBmdXR1cmUgd2F5IHRvIGRldmVsb3Agd2ViIGFwcGxpY2F0aW9u cy4gU28gSSB3YW50ZWQgdG8gaGF2ZSB0aGUgc2FtZSBpbiB0aGUgb2NhbWwgbGFuZ3VhZ2UuIFRo ZXJlZm9yZSBJIGhhdmUgZGV2ZWxvcGVkIHRoaXMgbGlicmFyeQ0KIChhbmQgb2YgY291cnNlIHVz aW5nIGpzX29mX29jYW1sIGFzIHRoZSBjb21waWxlciB0byBqYXZhc2NyaXB0KSBhbmQgSSBhbSBx dWl0ZSBoYXBweSB0aGF0IGl0IHdvcmtzIHdlbGwuDQo8L3A+DQo8cD5Tb21lIDxhIGhyZWY9Imh0 dHBzOi8vaGJyLmdpdGh1Yi5pby9mbWxpYi93ZWJhcHAvaW5kZXguaHRtbCI+c2ltcGxlIGV4YW1w bGVzPC9hPiBvZiB3ZWIgYXBwbGljYXRpb25zIGFuZCB0aGUgY29ycmVzcG9uZGluZw0KPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL2hici9mbWxpYi9ibG9iL21hc3Rlci9zcmMvZXhhbXBsZXMv YnJvd3Nlci93ZWJhcHAubWwiPg0Kc291cmNlIGNvZGU8L2E+IHdyaXR0ZW4gYnkgdXNpbmcgdGhl IGxpYnJhcnkgPGEgaHJlZj0iaHR0cHM6Ly9oYnIuZ2l0aHViLmlvL2ZtbGliL29kb2MvZm1saWJf YnJvd3Nlci8iPg0KZm1saWJfYnJvd3NlcjwvYT4uIDwvcD4NCjxwPkluc3RhbGwgdGhlIGxpYnJh cnkgdmlhIG9wYW0gYnkgaXNzdWluZyB0aGUgY29tbWFuZCA8L3A+DQo8cHJlIGNsYXNzPSJleGFt cGxlIiBpZD0ib3JnZDk5ODU3NSI+DQogICAgb3BhbSBpbnN0YWxsIGZtbGliX2Jyb3dzZXINCjwv cHJlPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VhY2I1 NGYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdlYWNiNTRmIj5CZW5qYW1pbiBUaG9t YXMgYXNrZWQgYW5kIEhlbG11dCByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmdlYWNiNTRmIj4NCjxibG9ja3F1b3RlPg0KPHA+SGVsbG8gQGhiciwg dGhhbmtzIGZvciBzaGFyaW5nIHlvdXIgcHJvamVjdCA6KSA8L3A+DQo8cD5EaWQgeW91IGtub3cg YWJvdXQgb2NhbWwtdmRvbSBiZWZvcmUgY3JlYXRpbmcgdGhpcyBsaWI/IDwvcD4NCjxwPjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9MZXhpRmkvb2NhbWwtdmRvbSI+aHR0cHM6Ly9naXRodWIu Y29tL0xleGlGaS9vY2FtbC12ZG9tPC9hPg0KPC9wPg0KPHA+SWYgeWVzLCB3aHkgZGlkIHlvdSBj cmVhdGUgaXQ/IEhvdyBkb2VzIGl0IGRpZmZlcj8gPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+QGJl bmphbWluLXRob21hczogSSBrbm93IHRoZSBwcm9qZWN0IDxjb2RlPm9jYW1sLXZkb208L2NvZGU+ IGFuZCB0aGUgYmFzaWMgaWRlYSB3aXRoIHJlc3BlY3QgdG8gdmlydHVhbCBkb21lIGlzIHZlcnkg c2ltaWxhci4gSG93ZXZlciBJIHdhbnRlZCB0byBoYXZlIHNvbWV0aGluZyBtb3JlIGdlbmVyaWMu DQo8L3A+DQo8cD5JZiB5b3UgbG9vayBpbnRvIHRoZSBpbnRlcmZhY2Ugb2YgPGNvZGU+b2NhbWwt dmRvbTwvY29kZT4geW91IHNlZSB0aGF0IGUuZy4gdGhlIGV2ZW50IGhhbmRsZXJzIGFyZSBsaW1p dGVkIHRvIHRoZSBkZWZpbml0aW9ucyBpbiB0aGUgbGlicmFyeS4gV2l0aA0KPGNvZGU+Rm1saWJf YnJvd3NlcjwvY29kZT4geW91IGNhbiBjdXN0b21pemUgeW91ciBldmVudCBoYW5kbGVycyBjb21w bGV0ZWx5LiBNeSBldmVudCBoYW5kbGVycyB1c2UgZWxt4oCZcyBnZW5lcmljIGNvbmNlcHQgb2Yg ZGVjb2RlcnMgdG8gc3VjayBhbnkgaW5mb3JtYXRpb24geW91IHdhbnQgZnJvbSB0aGUgZXZlbnRz Lg0KPC9wPg0KPHA+VGhlIHByb3BlcnRpZXMgaW4gbXkgbGlicmFyeSBhcmUgZ2VuZXJpYy4gWW91 IGNhbiBjcmVhdGUgYXJiaXRyYXJ5IGphdmFzY3JpcHQgdmFsdWUgaW5jbHVkaW5nIG9iamVjdHMg YW5kIGFycmF5cy4gSW4NCjxjb2RlPm9jYW1sLXZkb208L2NvZGU+IHlvdSBhcmUgbGltaXRlZCB0 byBwcmltaXRpdmUgdmFsdWVzIGxpa2UgPGNvZGU+aW50PC9jb2RlPiwNCjxjb2RlPmZsb2F0PC9j b2RlPiwgPGNvZGU+c3RyaW5nPC9jb2RlPiBhbmQgPGNvZGU+Ym9vbDwvY29kZT4uIDwvcD4NCjxw PkZ1cnRoZXJtb3JlIEkgd2FudGVkIHRvIGhhdmUgYSBwcmV0dHkgZ2VuZXJpYyBpbnRlcmZhY2Ug YmV0d2VlbiB0aGUgamF2YXNjcmlwdCB3b3JsZCBhbmQgdGhlIG9jYW1sIHdvcmxkLg0KPC9wPg0K PHA+VGhlIGNvbmNlcHQgb2YgPGNvZGU+Rm1saWJfYnJvd3NlcjwvY29kZT4gaXMgZXh0ZW5kaWJs ZS4gSW4gdGhlIGZ1dHVyZSBJIHdhbnQgdG8gYWRkIGZlYXR1cmVzIGUuZy4gdG8gc3RhcnQgd2Vi IHdvcmtlcnMsIGludGVncmF0ZSBjdXN0b20gZWxlbWVudHMgdG8gaGF2ZSBhY2Nlc3MgZS5nLiB0 bw0KPGNvZGU+Y29kZSBtaXJyb3I8L2NvZGU+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iNCI+VGltbXkgMS4wLjAsIGEgaGlnaCBsZXZlbCB0aW1lIGFuZCBjYWxlbmRhciBsaWJyYXJ5 PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGltbXktMS0wLTAt YS1oaWdoLWxldmVsLXRpbWUtYW5kLWNhbGVuZGFyLWxpYnJhcnkvMTE5ODYvMSI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRpbW15LTEtMC0wLWEtaGlnaC1sZXZlbC10aW1lLWFu ZC1jYWxlbmRhci1saWJyYXJ5LzExOTg2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZzcyZDdmNmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmc3MmQ3ZjZjIj5tZWZ5bCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZzcyZDdmNmMiPg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0 aGUgYXZhaWxhYmlsaXR5IG9uIE9QQU0gb2YgdGhlIGZpcnN0IHN0YWJsZSB2ZXJzaW9uIG9mDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vbWVmeWwvdGltbXkiPlRpbW15PC9hPiwgdGhlIGxp YnJhcnkgdGhhdCBwb3dlcnMgYWxsIHRoZSB0aW1lIGFuZCBjYWxlbmRhciBvcGVyYXRpb25zIHdl IHBlcmZvcm0gYXQgUm91dGluZS4NCjwvcD4NCjxwPkl0IHByb3ZpZGVzIGFtb25nc3Qgb3RoZXIg dGhpbmdzOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SGlnaGVyIGxldmVsIHR5cGVz IGZvciB0aW1lIGFuZCBjYWxlbmRhciB2YWx1ZXMuIDwvbGk+PGxpPlVuY29tcHJvbWlzaW5nIHRp bWV6b25lIHNhZmV0eS4gPC9saT48bGk+VGltZXpvbmUgd2l0aCBEU1Qgc3VwcG9ydC4gPC9saT48 bGk+SVNPIHdlZWtzIHN1cHBvcnQuIDwvbGk+PGxpPlF1YWxpdHkgb2YgbGlmZSBvcGVyYXRvcnMg YW5kIGNvbW1vbiBjb21wdXRhdGlvbnMgb24gbW9zdCBvYmplY3RzLiA8L2xpPjxsaT5KYXZhU2Ny aXB0IGJhY2sgYW5kIGZvcnRoIGNvbnZlcnNpb25zLiA8L2xpPjwvdWw+DQo8cD5UaGUgcGhpbG9z b3BoeSBhbmQgcmF0aW9uYWxlIGZvciB0aGUgbGlicmFyeSBpcyA8YSBocmVmPSJodHRwczovL21l ZnlsLmdpdGh1Yi5pby90aW1teS90aW1teS9pbmRleC5odG1sIj4NCmV4cGxhaW5lZCBhdCBsZW5n dGggaW4gaXRzIHJvb3QgbW9kdWxlIGRvY3VtZW50YXRpb24gPC9hPi4gQ29tbWVudHMgYW5kIGNv bnRyaWJ1dGlvbnMgdmVyeSB3ZWxjb21lLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjUiPldlZCwgQXByIDE5IEAgN3BtIFUuUy4gQ2VudHJhbDogSm9uYWggQmVja2ZvcmQgb24g4oCc V2hhdCBkaXN0cmlidXRpbmcgT0NhbWwgb24gV2luZG93cyBnYXZlIG1lIChhbmQgeW91KeKAnTwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2VkLWFwci0xOS03cG0tdS1z LWNlbnRyYWwtam9uYWgtYmVja2ZvcmQtb24td2hhdC1kaXN0cmlidXRpbmctb2NhbWwtb24td2lu ZG93cy1nYXZlLW1lLWFuZC15b3UvMTE5MjYvNiI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvd2VkLWFwci0xOS03cG0tdS1zLWNlbnRyYWwtam9uYWgtYmVja2ZvcmQtb24td2hhdC1kaXN0 cmlidXRpbmctb2NhbWwtb24td2luZG93cy1nYXZlLW1lLWFuZC15b3UvMTE5MjYvNjwvYT4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnODk1YWE1ZSIgY2xhc3M9 Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzg5NWFhNWUiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQs IGpiZWNrZm9yZCBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc4OTVhYTVlIj4NCjxwPlRoYW5rcy4gUmVtaW5kcyBtZSB0byBzaGFyZSB0aGUgc2xpZGVz OiA8YSBocmVmPSJodHRwczovL2Rpc2t1di5naXRsYWIuaW8vYm9va3MvRGtQcmVzZW50YXRpb25z L1ByZXNlbnRhdGlvbnMvMjAyMy0wNC0xOS1oZnB1Zy8iPg0KaHR0cHM6Ly9kaXNrdXYuZ2l0bGFi LmlvL2Jvb2tzL0RrUHJlc2VudGF0aW9ucy9QcmVzZW50YXRpb25zLzIwMjMtMDQtMTktaGZwdWcv PC9hPg0KPC9wPg0KPHA+SSB0aGluayB0aGUgcmVjb3JkaW5nIHdpbGwgYmUgYXZhaWxhYmxlIGlu IHNldmVyYWwgZGF5cy4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2QxNGQ4Y2QiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkMTRkOGNk Ij5DbGF1ZGUgSmFnZXItUnViaW5zb24gbGF0ZXIgYWRkZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2QxNGQ4Y2QiPg0KPHA+VGhlIHZpZGVvIGlzIG5vdyBh dmFpbGFibGUgb24gdGhlIEhGUFVHIHdlYnNpdGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9oZnB1Zy5v cmcvMjAyMy8wNC8yMS9qb25haC1iZWNrZm9yZC13aGF0LWRpc3RyaWJ1dGluZy1vY2FtbC1vbi13 aW5kb3dzLWdhdmUtbWUtYW5kLXlvdS8iPg0KaHR0cHM6Ly9oZnB1Zy5vcmcvMjAyMy8wNC8yMS9q b25haC1iZWNrZm9yZC13aGF0LWRpc3RyaWJ1dGluZy1vY2FtbC1vbi13aW5kb3dzLWdhdmUtbWUt YW5kLXlvdS88L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+VGhlIE9DYW1s IENoYW5nZWxvZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhlLW9j YW1sLWNoYW5nZWxvZy8xMTk5OC8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhlLW9j YW1sLWNoYW5nZWxvZy8xMTk5OC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmcyMzM5MTE2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMjMz OTExNiI+VGhpYmF1dCBNYXR0aW8gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmcyMzM5MTE2Ij4NCjxwPlRoZSBPQ2FtbC5vcmcgdGVhbSBpcyBo YXBweSB0byBhbm5vdW5jZSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9n Ij4NCk9DYW1sIENoYW5nZWxvZzwvYT46IGEgZmVlZCBvZiB0aGUgbGF0ZXN0IHJlbGVhc2VzIGFu ZCBmZWF0dXJlIGhpZ2hsaWdodHMgb2YgdGhlIE9DYW1sIENvbXBpbGVyLCBPQ2FtbCBQbGF0Zm9y bSB0b29scywgYW5kIG90aGVyIGNvcmUgcHJvamVjdHMuDQo8L3A+DQo8cD5CZXlvbmQgYmVpbmcg dGhlIGVhc2llc3Qgd2F5IHRvIHN0YXkgdXAgdG8gZGF0ZSB3aXRoIHRoZSBhY3Rpdml0eSBvZiBv ZmZpY2lhbCBwcm9qZWN0cywgdGhlIENoYW5nZWxvZyBzZXJ2ZXMgYXMgYSB3YXkgdG8gZGlzY292 ZXIgaW1wb3J0YW50IG5ldyBmZWF0dXJlcyB0aGF0IG1pZ2h0IG90aGVyd2lzZSBnbyB1bm5vdGlj ZWQuIEZvciBpbnN0YW5jZSwgZGlkIHlvdSBrbm93IHRoYXQgRHVuZSAzLjcgaW50cm9kdWNlZCBu YXRpdmUgcG9sbGluZw0KIG1vZGUgZm9yIFdpbmRvd3MsIGVmZmVjdGl2ZWx5IG1ha2luZyB3YXRj aCBtb2RlIGF2YWlsYWJsZSBvbiBXaW5kb3dzIChjb250cmlidXRlZCBieSBAbm9qYiBhbmQNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS95YW1zLXlhbXMiPkB5YW1zLXlhbXM8L2E+KT8gT3Ig dGhhdCB3ZSByZWNlbnRseSByZWxlYXNlZCBNZHggMi4zLjAgd2l0aCBzdXBwb3J0IGZvciBydW5u aW5nIGNvZGUgYmxvY2tzIGluIG1sZCBmaWxlcyAoY29udHJpYnV0ZWQgYnkgQGpvbmx1ZGxhbSk/ IE9yIHRoYXQgd2UgYWRkZWQgbmV3IG9wdGlvbnMgaW4gT0NhbWxGb3JtYXQgZm9yIG1vcmUgY29u c2lzdGVudCB2ZXJ0aWNhbCBmb3JtYXR0aW5nDQogb2YgaWYtZWxzZSBhbmQgbWF0Y2ggc3RhdGVt ZW50cyAoY29udHJpYnV0ZWQgYnkgQGdwZXRpb3QpPyA8L3A+DQo8cD5UbyB0aGF0IGVuZCwgd2Xi gJlyZSBoaWdobGlnaHRpbmcgaW1wb3J0YW50IGZlYXR1cmVzIGZyb20gdGhlIHJlbGVhc2VzIHdp dGggdmlzdWFsIGRlbW9zIGFuZCBleHBsYW5hdGlvbnMgb2YgaG93IHRvIHVzZSB0aGVtLg0KPC9w Pg0KPHA+SeKAmWxsIG5vdGUgdGhhdCB0aGUgQ2hhbmdlbG9nIGlzIHN0aWxsIGV4cGVyaW1lbnRh bCBhdCB0aGlzIHBvaW50LiBXZeKAmXZlIHRhbGtlZCB3aXRoIHNvbWUgbWFpbnRhaW5lcnMgb2Yg dGhlIHByb2plY3RzIGZlYXR1cmVkIG9uIHRoZSBDaGFuZ2Vsb2csIGJ1dCB3ZeKAmWxsIG5lZWQg dG8gYWdyZWUgd2l0aCBldmVyeW9uZSBvbiB3aGF0IHRoZSByZWxlYXNlIHByb2Nlc3Mgb2YgdGhl IHRvb2xzIHdpbGwgbG9vayBsaWtlIGlmIHdlIGNvbW1pdCB0bw0KIG1haW50YWluaW5nIHRoZSBD aGFuZ2Vsb2cgaW4gdGhlIGxvbmcgdGVybS4gVW50aWwgd2XigJl2ZSByZWFjaGVkIGEgY29uc2Vu c3VzLCB0aGUgT0NhbWwub3JnIHRlYW0gd2lsbCBiZSBtb25pdG9yaW5nIHRoZSBhY3Rpdml0eSBv ZiB0aGUgcHJvamVjdHMgYW5kIGNyZWF0ZSB0aGUgY2hhbmdlbG9nIGVudHJpZXMsIGV2ZW50dWFs bHkgcmVhY2hpbmcgb3V0IHRvIG1haW50YWluZXJzIHRvIHdyaXRlIGFubm91bmNlbWVudHMgYW5k IGZlYXR1cmUgaGlnaGxpZ2h0cy4NCjwvcD4NCjxwPkluIHRoZSBtZWFud2hpbGUsIGxldCB1cyBr bm93IHdoYXQgeW91IHRoaW5rIGFuZCBob3cgd2UgY2FuIGltcHJvdmUgdGhlIENoYW5nZWxvZywg d2XigJlyZSBleGNpdGVkIHRvIGdldCB5b3VyIGZlZWRiYWNrIQ0KPC9wPg0KPHA+SGFwcHkgcmVh ZGluZyEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjciPk9VUFMgbWVldHVwIG1heSAy MDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFy Y2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXBzLW1lZXR1cC1t YXktMjAyMy8xMTk5OS8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3Vwcy1tZWV0dXAt bWF5LTIwMjMvMTE5OTkvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnZTMyNzYyYiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2UzMjc2MmIi PnphcGFzaGNhbm9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnZTMyNzYyYiI+DQo8cD5UaGUgbmV4dCBPVVBTIG1lZXR1cCB3aWxsIHRha2Ug cGxhY2Ugb24gPGI+VGh1cnNkYXksIDExdGggb2YgTWF5PC9iPiAyMDIzLiBJdCB3aWxsIHN0YXJ0 IGF0DQo8Yj43cG08L2I+IGF0IHRoZSA8Yj40IHBsYWNlIEp1c3NpZXU8L2I+IGluIFBhcmlzLiA8 L3A+DQo8cD46d2FybmluZzogOnRydW1wZXQ6IEl0IHdpbGwgYmUgaW4gdGhlIGluIHRoZSA8Yj5I ZXJwaW4gYW1waGl0aGVhdGVyPC9iPiBpbiB0aGUNCjxiPkVzY2xhbmdvbiBidWlsZGluZzwvYj4u IDp0cnVtcGV0OiA6d2FybmluZzogPC9wPg0KPHA+UGxlYXNlLCA8Yj48YSBocmVmPSJodHRwczov L3d3dy5tZWV0dXAuY29tL2ZyLUZSL29jYW1sLXBhcmlzL2V2ZW50cy8yOTI5NzIxNTMiPnJlZ2lz dGVyIG9uIG1lZXR1cDwvYT48L2I+IGFzIHNvb24gYXMgcG9zc2libGUgdG8gbGV0IHVzIGtub3cg aG93IG1hbnkgcGl6emEgd2Ugc2hvdWxkIG9yZGVyLg0KPC9wPg0KPHA+Rm9yIG1vcmUgZGV0YWls cywgeW91IG1heSBjaGVjayB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vdXBzLmZyYW1hLmlvIj5PVVBT 4oCZIHdlYnNpdGUNCjwvYT4uIDwvcD4NCjxwPlRoaXMgbW9udGggd2lsbCBmZWF0dXJlIHRoZSBm b2xsb3dpbmcgdGFsa3MgOiA8L3A+DQo8cD48Yj5SZXRyb2ZpdHRpbmcgT0NhbWwgTW9kdWxlcyDi gJMgQ2zDqW1lbnQgQmxhdWRlYXU8L2I+IDwvcD4NCjxwPk1MIG1vZHVsZXMgb2ZmZXIgbGFyZ2Ut c2NhbGUgbm90aW9ucyBvZiBjb21wb3NpdGlvbiBhbmQgbW9kdWxhcml0eS4gUHJvdmlkZWQgYXMg YW4gYWRkaXRpb25hbCBsYXllciBvbiB0b3Agb2YgdGhlIGNvcmUgbGFuZ3VhZ2UsIHRoZXkgaGF2 ZSBwcm92ZW4gYm90aCB2aXRhbCB0byB0aGUgd29ya2luZyBPQ2FtbCBhbmQgU01MIHByb2dyYW1t ZXJzLCBhbmQgaW5zcGlyaW5nIHRvIG90aGVyIHVzZS1jYXNlcyBhbmQgbGFuZ3VhZ2VzLiBVbmZv cnR1bmF0ZWx5LA0KIHRoZWlyIG1ldGEtdGhlb3J5IHJlbWFpbnMgZGlmZmljdWx0IHRvIGNvbXBy ZWhlbmQsIGFuZCBtb3JlIHJlY2VudCBleHRlbnNpb25zIChhYnN0cmFjdCBzaWduYXR1cmVzLCBt b2R1bGUgYWxpYXNlcykgbGFjayBhIGNvbXBsZXRlIGZvcm1hbGl6YXRpb24uIEJ1aWxkaW5nIG9u IGEgcHJldmlvdXMgdHJhbnNsYXRpb24gZnJvbSBNTCBtb2R1bGVzIHRvIEbPiSwgd2UgcHJvcG9z ZSBhIG5ldyBjb21wcmVoZW5zaXZlIGRlc2NyaXB0aW9uIG9mIGEgc2lnbmlmaWNhbnQNCiBzdWJz ZXQgb2YgT0NhbWwgbW9kdWxlcywgaW5jbHVkaW5nIGJvdGggYXBwbGljYXRpdmUgYW5kIGdlbmVy YXRpdmUgZnVuY3RvcnMgYW5kIHRyYW5zcGFyZW50IGFzY3JpcHRpb24g4oCTIGEgdXNlZnVsIG5l dyBmZWF0dXJlLiBCeSBleHBsb3JpbmcgdGhlIHRyYW5zbGF0aW9ucyBib3RoIHRvIGFuZCBmcm9t IEbPiSwgd2UgcHJvdmlkZSBhIGNvbXBsZXRlIGRlc2NyaXB0aW9uIG9mIHRoZSBzaWduYXR1cmUg YXZvaWRhbmNlIGlzc3VlLCBhcyB3ZWxsIGFzDQogaW5zaWdodHMgb24gdGhlIGxpbWl0YXRpb25z IGFuZCBiZW5lZml0cyBvZiB0aGUgcGF0aC1iYXNlZCBhcHByb2FjaCBvZiBPQ2FtbCB0eXBlLXNo YXJpbmcuDQo8L3A+DQo8cD48Yj5Gb3JtYWwgcmVhc29uaW5nIHJ1bGVzIGZvciB0aGUgT0NhbWwg RkZJIC0tPC9iPiA8Yj5Bcm1hw6tsIEd1w6luZWF1PC9iPiAoQEFybWFlbCkNCjwvcD4NCjxwPk9D YW1sIHByb3ZpZGVzIGFuIEZGSSBtZWNoYW5pc20gKEZvcmVpZ24gRnVuY3Rpb24gSW50ZXJmYWNl KSBhbGxvd2luZyBPQ2FtbCBwcm9ncmFtcyB0byBjYWxsIGV4dGVybmFsIGZ1bmN0aW9ucyBpbXBs ZW1lbnRlZCBpbiBDLCB0eXBpY2FsbHkgYnkgd3JpdGluZyDigJxnbHVlIGNvZGXigJ0gaGVscGlu ZyBicmlkZ2UgdGhlIHR3byBsYW5ndWFnZXMuIFRoaXMg4oCcZ2x1ZSBjb2Rl4oCdIG5lZWRzIHRv IGJlIGNhcmVmdWxseSB3cml0dGVuIGFuZCBvYmV5IGENCiBudW1iZXIgb2YgcnVsZXMgd2hlbiBp bnRlcmFjdGluZyB3aXRoIHRoZSBPQ2FtbCBydW50aW1lIChjZiBjaGFwdGVyIDIyIG9mIHRoZSBt YW51YWwpLiBGYWlsdXJlIHRvIGZvbGxvdyBvbmUgb2YgdGhlc2UgcnVsZXMgdHlwaWNhbGx5IHJl c3VsdCBpbiBzaWxlbnQgY29ycnVwdGlvbiBvZiB0aGUgcHJvZ3JhbSBtZW1vcnksIHJlc3VsdGlu ZyBpbiBmYXRhbCBhbmQgaGFyZCB0byBkZWJ1ZyBjcmFzaGVzLiBUaGlzIHByZXNlbnRhdGlvbiB3 aWxsIHByZXNlbnQNCiBvbmdvaW5nIHJlc2VhcmNoIG9uIDxiPmZvcm1hbGl6aW5nPC9iPiB0aGUg cnVsZXMgb25lIG5lZWQgdG8gZm9sbG93IHRvIGNvcnJlY3RseSB1c2UgdGhlIE9DYW1sIEZGSS4g V2Ugd2lsbCBzZWUgaG93IGEgc21hbGwgbnVtYmVyIG9mDQo8Yj5wZXJtaXNzaW9uczwvYj4gY2Fu IGNhcHR1cmUgdGhlIHJlcXVpcmVtZW50cyBvbmUgbXVzdCBvYmV5IGluIG9yZGVyIHRvIHdyaXRl IGJ1Zy1mcmVlIGdsdWUgY29kZS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij4z LXllYXIgZW5naW5lZXJpbmcgcG9zaXRpb24gaW4gRGVkdWN0ZWFtLCBJbnJpYSBQYXJpcy1TYWNs YXksIEZyYW5jZTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOCI+ DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvMy15ZWFy LWVuZ2luZWVyaW5nLXBvc2l0aW9uLWluLWRlZHVjdGVhbS1pbnJpYS1wYXJpcy1zYWNsYXktZnJh bmNlLzEyMDAxLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzMteWVhci1lbmdpbmVl cmluZy1wb3NpdGlvbi1pbi1kZWR1Y3RlYW0taW5yaWEtcGFyaXMtc2FjbGF5LWZyYW5jZS8xMjAw MS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyZTk3 ZDAxIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMmU5N2QwMSI+RnLDqWTDqXJpYyBC bGFucXVpIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnMmU5N2QwMSI+DQo8cD5EZWR1Y3RlYW0gaXMgb2ZmZXJpbmcgYSAzLXllYXIgZW5naW5l ZXJpbmcgcG9zaXRpb24gdG8gaGVscCBkZXZlbG9wLCB0ZXN0IGFuZCBtYWludGFpbiB0b29scyBm b3IgcHJvb2Ygc3lzdGVtIGludGVyb3BlcmFiaWxpdHkgKGNvbnRpbnVvdXMgaW50ZWdyYXRpb24s IHByb29mIGxpYnJhcmllcyBtYW5hZ2VtZW50LCBzZWFyY2hpbmcgdG9vbHMsIFZTQ29kZSBpbnRl cmZhY2UsIGV0Yy4pLiBOZXQgdGF4YWJsZSBtb250aGx5IHNhbGFyeSBiZXR3ZWVuDQogMjE0OCBh bmQgNDQxMiBldXJvcyBkZXBlbmRpbmcgb24gZXhwZXJpZW5jZSwgaW5jbHVkaW5nIHNvY2lhbCBz ZWN1cml0eSBhbmQgOSB3ZWVrcyBob2xpZGF5cy95ZWFyLg0KPC9wPg0KPHA+SW50ZXJlc3RlZCBw ZW9wbGUgc2hvdWxkIHNlbmQgbWUgdGhlaXIgQ1YgYmVmb3JlIDxiPjMwIEp1bHkgMjAyMzwvYj4u IEFwcGxpY2F0aW9ucyB3aWxsIGJlIGV4YW1pbmVkIG92ZXIgdGltZS4NCjwvcD4NCjxwPkJlc3Qg cmVnYXJkcywgRnLDqWTDqXJpYyBCbGFucXVpLCBjaGFpciBvZiBFdXJvUHJvb2ZOZXQuIDxhIGhy ZWY9Imh0dHBzOi8vYmxhbnF1aS5naXRsYWJwYWdlcy5pbnJpYS5mci8iPg0KaHR0cHM6Ly9ibGFu cXVpLmdpdGxhYnBhZ2VzLmlucmlhLmZyLzwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjkiPlJGQyBmb3IgYSBkaXN0cmlidXRlZCBwcm9jZXNzL2FjdG9yIG1vZGVsIGxpYnJhcnk8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JmYy1mb3ItYS1kaXN0cmli dXRlZC1wcm9jZXNzLWFjdG9yLW1vZGVsLWxpYnJhcnkvMTIwMDQvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvcmZjLWZvci1hLWRpc3RyaWJ1dGVkLXByb2Nlc3MtYWN0b3ItbW9kZWwt bGlicmFyeS8xMjAwNC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmc2MGQ4ZTE2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjBkOGUxNiI+ RGFycmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnNjBkOGUxNiI+DQo8cD5JIHJlY2VudGx5IHdyb3RlIGRvd24gd2hhdOKAmXMgYmVlbiBi cmV3aW5nIGluIG15IG1pbmQgZm9yIGEgYml0OiBhIEVybGFuZyBzdHlsZSBwcm9jZXNzL2FjdG9y IG1vZGVsIGxpYnJhcnkgaW4gdGhlIG5ldyBPQ2FtbCA1IGxhbmRzY2FwZS4gSXQgaXMgYmVnaW5u aW5nIHRvIHJlc2VtYmxlIHNvbWV0aGluZyBJ4oCZZCB1c2UsIGJ1dCBJ4oCZbSBjdXJpb3VzIGFi b3V0IHdoYXQgb3RoZXJzIHRoaW5rLg0KPC9wPg0KPHA+VGhlIHJlcG8gb2YgdGhlIHByb3RvdHlw ZSBpcyBhdmFpbGFibGUgYXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhcnJlbmxkbC9k aXN0cnByb2MiPg0KaGVyZTwvYT4gPC9wPg0KPHA+VGhlIGxpYnJhcnkgaXMgYnVpbHQgb24gdG9w IG9mIEVpbyBhbmQgc2hvdWxkIHBsYWNlIG5pY2VseSB3aXRoIEVpbyBwcmltaXRpdmVzLiBTbmlw cGV0IG9mIGEgcnVubmFibGUgZXhhbXBsZSBpcyBzaG93biBiZWxvdyAoPGNvZGU+ZGVidWcvbWFp bi5tbDwvY29kZT4gaW4gdGhlIHJlcG8pLg0KPC9wPg0KPHA+T3ZlcnZpZXc6IDwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48Y29kZT5HYXRld2F5PC9jb2RlPiBwbGF5cyByb3VnaGx5IHRo ZSByb2xlIG9mIEVybGFuZ+KAmXMgQkVBTSBWTS4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5J bnRlbnRpb24gaXMgdXNlciBjYW4gZXN0YWJsaXNoIFRMUyB0dW5uZWxzIHRvIG90aGVyIGdhdGV3 YXlzIHRvIGFsbG93IGRpc3RyaWJ1dGlvbi4NCjwvbGk+PC91bD4NCjwvbGk+PGxpPjxjb2RlPk1h aWxib3guTG9jYWw8L2NvZGU+IEFQSSBhbGxvd3Mgc2tpcHBpbmcgdGhlIHNlcmlhbGl6YXRpb24g Y29zdCB3aGVuIHNlbmRpbmcgdGhpbmdzIGludGVybmFsbHkNCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48Y29kZT5NYWlsYm94Lkdsb2JhbC50PC9jb2RlPiAod2hlbiBpbXBsZW1lbnRlZCkgY29u dmVyc2VseSBkZW1hbmRzIHNlcmlhbGl6YXRpb24gcHJvY2VkdXJlcyBkdXJpbmcgY29uc3RydWN0 aW9uLg0KPC9saT48L3VsPg0KPC9saT48bGk+UHJvY2VzcyA8Yj5hPC9iPiB1c2VzIHNlbGVjdGl2 ZSByZWNlaXZlIGludGVyZmFjZSAoPGNvZGU+U2VsZWN0aXZlLnJlY3Y8L2NvZGU+IGFuZA0KPGNv ZGU+U2VsZWN0aXZlLlJlY3YuKjwvY29kZT4pIHRvIGhhbmRsZSB0aW1lb3V0IGFuZCBndWFyZHMv bWVzc2FnZSBmaWx0ZXJpbmcuDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QSBzYXZlIHF1ZXVl IGlzIHVzZWQgdW5kZXJuZWF0aCBwZXIgbWFpbGJveCBmb3IgbWVzc2FnZXMgcmVqZWN0ZWQgKGZv ciBub3cpLCBmb2xsb3dpbmcgRXJsYW5n4oCZcyBkZXNpZ24uDQo8L2xpPjxsaT5Eb2VzbuKAmXQg c2VlbSBwb3NzaWJsZSB0byBoYXZlIGEgZ2xvYmFsIHNhdmUgcXVldWUgd2l0aG91dCBhbHNvIHNl cmlhbGlzaW5nIGV2ZXJ5dGhpbmcuDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5Qcm9jZXNzIDxiPmI8 L2I+IHNlbmRzIGEgYnVuY2ggb2YgdGhpbmdzIDxiPmE8L2I+IGRvZXMgbm90IGNhcmUgYWJvdXQs IHdhaXQsIHRoZW4gZmluYWxseSBzZW5kcyBzb21ldGhpbmcNCjxiPmE8L2I+IGlzIGxvb2tpbmcg Zm9yLiA8L2xpPjxsaT5Qcm9jZXNzIDxiPmNvbnRyb2xsZXI8L2I+IGlzIGp1c3QgbGFyZ2VseSB0 aGVyZSB0byBkZW1vbnN0cmF0ZSBvbmUgY2FuIHJlZGlyZWN0IHByb2Nlc3Nlcy4NCjwvbGk+PC91 bD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZmNjMTQ2MyIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2ZjYzE0NjMiPkNvZGUgc25pcHBldDwvaDQ+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZmNjMTQ2MyI+DQo8cD4oPGNvZGU+ ZGVidWcvbWFpbi5tbDwvY29kZT4gb24gcmVwbykgPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1j b250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9y OiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gKCkgPQ0KICA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5waWRfbWFpbGJveDwvc3Bhbj4gOjxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ UHJvYy5QaWQuPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQgPC9zcGFuPjxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk1haWxib3guTG9jYWwuPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnQgPC9zcGFuPj0NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5NYWlsYm94LkxvY2FsLjwvc3Bhbj5tYWtlICgpDQogIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TWFpbGJveC5Mb2NhbC48L3NwYW4+eyBzZW5kID0gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+c2VuZF9waWQ8L3NwYW4+OyByZWN2ID0gPHNwYW4g c3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cmVjdl9waWQ8L3NwYW4+IH0gPSA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5NYWlsYm94LkxvY2FsLjwvc3Bhbj5pbnRlcmZhY2UNCnBpZF9tYWls Ym94IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwv c3Bhbj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+eF9tYWlsYm94PC9zcGFu PiAgOjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPiB4IDwvc3Bhbj48c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5NYWlsYm94LkxvY2FsLjwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij50IDwvc3Bhbj49DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ TWFpbGJveC5Mb2NhbC48L3NwYW4+bWFrZSAoKQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPk1haWxib3guTG9jYWwuPC9zcGFuPnsgc2VuZCA9IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnNlbmRfeDwvc3Bhbj47IHJlY3YgPSA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDdhOWY7Ij5yZWN2X3g8L3NwYW4+IH0gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7 Ij5NYWlsYm94LkxvY2FsLjwvc3Bhbj5pbnRlcmZhY2UNCnhfbWFpbGJveCA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmE8L3NwYW4+ID0NCiAgICA8c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5HYXRld2F5Ljwvc3Bhbj5zcGF3biAoPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA3YTlmOyI+aDwvc3Bhbj4gLSZndDsNCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+Rm10Ljwvc3Bhbj5lcHIgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1 b3Q7YTogbXkgcGlkIGlzICVhQC4mcXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPlByb2MuUGlkLjwvc3Bhbj5wcCAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+ UHJvYy5IYW5kbGUuPC9zcGFuPnBpZCBoKTsNCg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDdhOWY7Ij5fPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+c2Vu ZF90bzwvc3Bhbj4gPSByZWN2X3BpZCBoIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+Rm10Ljwvc3Bhbj5lcHIgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1 b3Q7YTogcmVjZWl2ZWQgaW5zdHJ1Y3Rpb24gdG8gc2VuZCB0byAlYUAuJnF1b3Q7PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Qcm9jLlBpZC48L3NwYW4+cHAgc2VuZF90bzsN CiAgICAgICAgc2VuZF94IGggKHNlbmRfdG8sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsg YmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkE8L3NwYW4+KTsNCiAgICAgICAgc2VuZF94IGgg KHNlbmRfdG8sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjog I2ZjZjdlZjsiPkE8L3NwYW4+KTsNCiAgICAgICAgc2VuZF94IGggKHNlbmRfdG8sIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkE8L3NwYW4+ KTsNCg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+cmVjPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5hdXg8L3Nw YW4+ICgpID0NCiAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2Vp Z2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5zdWNj ZXNzPC9zcGFuPiA9DQogICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5T ZWxlY3RpdmUuPC9zcGFuPnJlY3YgaA0KICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij5+dGltZW91dDwvc3Bhbj46KDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi PjEuMDwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7DQogICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5GbXQuPC9zcGFuPmVwciA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0 MDA7Ij4mcXVvdDthOiBJIGhhdmVuJ3QgcmVjZWl2ZWQgYW55dGhpbmcgdXNlZnVsIHlldEAuJnF1 b3Q7PC9zcGFuPjsNCiAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0 ZjsiPmZhbHNlPC9zcGFuPg0KICAgICAgICAgICAgICAgICkNCiAgICAgICAgICAgICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U2VsZWN0aXZlLlJlY3YuPC9zcGFuPlsNCiAgICAgICAg ICAgICAgICBjYXNlX2xvY2FsIHhfbWFpbGJveA0KICAgICAgICAgICAgICAgICAgWw0KICAgICAg ICAgICAgICAgICAgICBlbnRyeSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+Z3VhcmQ8 L3NwYW4+Oig8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ ZnVuPC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZnJvbTwvc3Bhbj4sIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPng8L3NwYW4+KSAtJmd0OyB4ID0gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+QTwvc3Bhbj4p DQogICAgICAgICAgICAgICAgICAgICAgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5mcm9tPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bXNnPC9zcGFuPikg LSZndDsNCiAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5GbXQuPC9zcGFuPmVwciA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDth OiByZWNlaXZlZCAlYSBmcm9tICVhQC4mcXVvdDs8L3NwYW4+IHBwX3ggbXNnIDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPlByb2MuUGlkLjwvc3Bhbj5wcA0KZnJvbTsNCiAgICAgICAgICAg ICAgICAgICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij50cnVlPC9zcGFuPg0K ICAgICAgICAgICAgICAgICAgICAgICk7DQogICAgICAgICAgICAgICAgICAgIGVudHJ5IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5ndWFyZDwvc3Bhbj46KDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW48L3NwYW4+ICg8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5mcm9tPC9zcGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlm OyI+eDwvc3Bhbj4pIC0mZ3Q7IHggPSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tn cm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5CPC9zcGFuPikNCiAgICAgICAgICAgICAgICAgICAgICAo PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bh bj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmZyb208L3NwYW4+LCA8c3BhbiBzdHls ZT0iY29sb3I6ICMwMDdhOWY7Ij5tc2c8L3NwYW4+KSAtJmd0Ow0KICAgICAgICAgICAgICAgICAg ICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkZtdC48L3NwYW4+ZXByIDxzcGFu IHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2E6IHJlY2VpdmVkICVhIGZyb20gJWFALiZx dW90Ozwvc3Bhbj4gcHBfeCBtc2cgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJvYy5Q aWQuPC9zcGFuPnBwDQpmcm9tOw0KICAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPnRydWU8L3NwYW4+DQogICAgICAgICAgICAgICAgICAgICAgKTsN CiAgICAgICAgICAgICAgICAgIF0NCiAgICAgICAgICAgICAgXQ0KICAgICAgICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAg ICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aWY8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPm5vdDwvc3Bhbj4gc3VjY2VzcyA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+dGhlbjwvc3Bh bj4NCiAgICAgICAgICAgIGF1eCAoKQ0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICAgIGF1eCAoKQ0KICAgICAg KQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48 L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmI8L3NwYW4+ID0NCiAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5HYXRld2F5Ljwvc3Bhbj5zcGF3biAoPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+aDwvc3Bhbj4gLSZndDsNCiAgICAgICAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Rm10Ljwvc3Bhbj5lcHIgPHNwYW4gc3R5bGU9ImNv bG9yOiAjY2EzNDAwOyI+JnF1b3Q7YjogbXkgcGlkIGlzICVhQC4mcXVvdDs8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlByb2MuUGlkLjwvc3Bhbj5wcCAoPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+UHJvYy5IYW5kbGUuPC9zcGFuPnBpZCBoKTsNCiAgICAgICAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+Xzwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPnNlbmRfdG88L3NwYW4+ID0gcmVjdl9waWQgaCA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICAgIDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkZtdC48L3NwYW4+ZXByIDxzcGFuIHN0eWxlPSJjb2xv cjogI2NhMzQwMDsiPiZxdW90O2I6IHJlY2VpdmVkIGluc3RydWN0aW9uIHRvIHNlbmQgdG8gJWFA LiZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UHJvYy5QaWQuPC9z cGFuPnBwIHNlbmRfdG87DQoNCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlm OyI+Y2xvY2s8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RWlvLlN0ZGVu di48L3NwYW4+Y2xvY2sgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlByb2MuSGFuZGxl Ljwvc3Bhbj5lbnYgaCkgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDog Ym9sZDsiPmluPC9zcGFuPg0KDQogICAgICAgIHNlbmRfeCBoIChzZW5kX3RvLCA8c3BhbiBzdHls ZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5DPC9zcGFuPik7 DQogICAgICAgIHNlbmRfeCBoIChzZW5kX3RvLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7 IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5DPC9zcGFuPik7DQogICAgICAgIHNlbmRfeCBo IChzZW5kX3RvLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5DPC9zcGFuPik7DQogICAgICAgIHNlbmRfeCBoIChzZW5kX3RvLCA8c3BhbiBz dHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5DPC9zcGFu Pik7DQogICAgICAgIHNlbmRfeCBoIChzZW5kX3RvLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5DPC9zcGFuPik7DQogICAgICAgIHNlbmRf eCBoIChzZW5kX3RvLCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29s b3I6ICNmY2Y3ZWY7Ij5DPC9zcGFuPik7DQoNCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj NDQ0ZmNmOyI+RWlvLlRpbWUuPC9zcGFuPnNsZWVwIGNsb2NrIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwODI0ZjsiPjUuMDwvc3Bhbj47DQoNCiAgICAgICAgc2VuZF94IGggKHNlbmRfdG8sIDxzcGFu IHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkE8L3Nw YW4+KTsNCg0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5mcm9tPC9z cGFuPiwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bXNnPC9zcGFuPiA9IHJlY3ZfeCBo IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bh bj4NCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Rm10Ljwvc3Bhbj5lcHIg PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7YjogcmVjZWl2ZWQgJWEgZnJvbSAl YUAuJnF1b3Q7PC9zcGFuPiBwcF94IG1zZyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Q cm9jLlBpZC48L3NwYW4+cHAgZnJvbTsNCiAgICAgICkNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDdhOWY7Ij5fY29udHJvbGxlcjwvc3Bhbj4gPQ0KICAgIDxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPkdhdGV3YXkuPC9zcGFuPnNwYXduICg8c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDdhOWY7Ij5oPC9zcGFuPiAtJmd0Ow0KICAgICAgICA8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5GbXQuPC9zcGFuPmVwciA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4m cXVvdDtjb250cm9sbGVyOiBteSBwaWQgaXMgJWFALiZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+UHJvYy5QaWQuPC9zcGFuPnBwICg8c3BhbiBzdHlsZT0iY29sb3I6 ICM0NDRmY2Y7Ij5Qcm9jLkhhbmRsZS48L3NwYW4+cGlkIGgpOw0KICAgICAgICBzZW5kX3BpZCBo IChhLCBiKTsNCiAgICAgICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Rm10Ljwvc3Bh bj5lcHIgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7Y29udHJvbGxlcjogc2Vu dCBpbnN0cnVjdGlvbnMgdG8gYUAuJnF1b3Q7PC9zcGFuPjsNCiAgICAgICAgc2VuZF9waWQgaCAo YiwgYSk7DQogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkZtdC48L3NwYW4+ ZXByIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2NvbnRyb2xsZXI6IHNlbnQg aW5zdHJ1Y3Rpb25zIHRvIGJALiZxdW90Ozwvc3Bhbj47DQogICAgICApDQogIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RWlvX21haW4uPC9zcGFuPnJ1biA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5HYXRld2F5Ljwvc3Bhbj5tYWluDQo8L3ByZT4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzA3YjY3NzEiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcwN2I2NzcxIj5FeGFtcGxlIG91dHB1dDwvaDQ+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMDdiNjc3MSI+DQo8cHJlIGNs YXNzPSJleGFtcGxlIiBpZD0ib3JnYTJhMTA0YSI+DQogIGE6IG15IHBpZCBpcyAoMCwgMykNCiAg YjogbXkgcGlkIGlzICgwLCA0KQ0KICBjb250cm9sbGVyOiBteSBwaWQgaXMgKDAsIDUpDQogIGE6 IHJlY2VpdmVkIGluc3RydWN0aW9uIHRvIHNlbmQgdG8gKDAsIDQpDQogIGNvbnRyb2xsZXI6IHNl bnQgaW5zdHJ1Y3Rpb25zIHRvIGENCiAgYjogcmVjZWl2ZWQgaW5zdHJ1Y3Rpb24gdG8gc2VuZCB0 byAoMCwgMykNCiAgY29udHJvbGxlcjogc2VudCBpbnN0cnVjdGlvbnMgdG8gYg0KICBhOiBJIGhh dmVuJ3QgcmVjZWl2ZWQgYW55dGhpbmcgdXNlZnVsIHlldA0KICBhOiBJIGhhdmVuJ3QgcmVjZWl2 ZWQgYW55dGhpbmcgdXNlZnVsIHlldA0KICBhOiBJIGhhdmVuJ3QgcmVjZWl2ZWQgYW55dGhpbmcg dXNlZnVsIHlldA0KICBhOiBJIGhhdmVuJ3QgcmVjZWl2ZWQgYW55dGhpbmcgdXNlZnVsIHlldA0K ICBiOiByZWNlaXZlZCBBIGZyb20gKDAsIDMpDQogIGE6IEkgaGF2ZW4ndCByZWNlaXZlZCBhbnl0 aGluZyB1c2VmdWwgeWV0DQogIGE6IHJlY2VpdmVkIEEgZnJvbSAoMCwgNCkNCjwvcHJlPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0x MCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj5jZmdlbiBwcmV2aWV3IHJlbGVhc2Ug djEuMC4wLWFscGhhLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tY2ZnZW4tcHJldmlldy1yZWxlYXNlLXYxLTAtMC1hbHBoYS0wLzEyMDE2LzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jZmdlbi1wcmV2aWV3LXJlbGVhc2UtdjEtMC0wLWFs cGhhLTAvMTIwMTYvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdjNmY4NjM4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYzZmODYzOCI+Q2hy aXMgQXJtc3Ryb25nIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIg aWQ9InRleHQtb3JnYzZmODYzOCI+DQo8cD5J4oCZbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgZmly c3QgcHJlLXJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NocmlzLWFybXN0 cm9uZy9vY2FtbC1jZmdlbiI+DQo8Yj5jZmdlbjwvYj48L2E+LCBhIGxpYnJhcnkgZm9yIHdyaXRp bmcgQVdTIENsb3VkRm9ybWF0aW9uIGRlZmluaXRpb25zIGluIE9DYW1sIGFuZCBnZW5lcmF0aW5n IHdvcmtpbmcgQ2xvdWRGb3JtYXRpb24gdGVtcGxhdGVzLg0KPC9wPg0KPHA+SXQgaXMgdXNhYmxl IGluIGl0cyBjdXJyZW50IGZvcm0sIGJ1dCBzdGlsbCB1bmRlciBkZXZlbG9wbWVudC4gVGhpcyBy ZWxlYXNlIGlzIHRvIGdhdGhlciBmZWVkYmFjayBhbmQgZ2F1Z2UgY29tbXVuaXR5IGludGVyZXN0 IGluIGl0cyBjb250aW51ZWQgZGV2ZWxvcG1lbnQuDQo8L3A+DQo8cD5QbGVhc2Ugc2VlIHRoZSA8 YSBocmVmPSJodHRwczovL2NocmlzLWFybXN0cm9uZy5naXRodWIuaW8vb2NhbWwtY2ZnZW4vY2Zn ZW4vdHV0b3JpYWwiPg0KdHV0b3JpYWw8L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2NocmlzLWFy bXN0cm9uZy5naXRodWIuaW8vb2NhbWwtY2ZnZW4vY2ZnZW4vaW5kZXguaHRtbCI+DQpkb2N1bWVu dGF0aW9uPC9hPiB0byBnZXQgYW4gdW5kZXJzdGFuZGluZyBvZiBob3cgaXQgd29ya3MgYW5kIGl0 cyBjdXJyZW50IGZlYXR1cmUgc2V0Lg0KPC9wPg0KPHA+WW91IGNhbiBjdXJyZW50bHkgaW5zdGFs bCBpdCBkaXJlY3RseSBmcm9tIGdpdCB1c2luZyBvcGFtIHdpdGggdGhlIHRhZyA8Y29kZT52MS4w LjAtYWxwaGEuMDwvY29kZT4NCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9j aHJpcy1hcm1zdHJvbmcvb2NhbWwtY2ZnZW4iPmh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpcy1hcm1z dHJvbmcvb2NhbWwtY2ZnZW48L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEx Ij5PdGhlciBPQ2FtbCBOZXdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC0xMSI+PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiMjE5NTk5IiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYjIxOTU5OSI+RnJvbSB0aGUgb2NhbWwub3Jn IGJsb2c8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2IyMTk1 OTkiPg0KPHA+SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQg YXQgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9yZyBibG9n PC9hPi4gPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vYmxv Zy5qYW5lc3RyZWV0LmNvbS9idWlsZGluZy1yZXByb2R1Y2libGUtcHl0aG9uLWVudmlyb25tZW50 cy13aXRoLXhhcnMvIj5CdWlsZGluZyByZXByb2R1Y2libGUgUHl0aG9uIGVudmlyb25tZW50cyB3 aXRoIFhBUnM8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhYzE1OTk3IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0ib3JnYWMxNTk5NyI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtb3JnYWMxNTk5NyI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpz ZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFr ZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4N CnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxw PklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBt YXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2Ft bC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFt ZSIgaWQ9Im9yZzA1ZDZiNzAiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 18 Apr 2023 09:51:15 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 18 Apr 2023 09:51:15 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 18 Apr 2023 09:51:15 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33I8oTPm012882 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 18 Apr 2023 09:50:29 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33I8oKAN012865 for ; Tue, 18 Apr 2023 09:50:20 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Apr 2023 10:50:18 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A304EE7317; Tue, 18 Apr 2023 10:50:17 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 20326E00A8 for ; Tue, 18 Apr 2023 10:50:10 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Apr 2023 10:50:09 +0200 Received: from TM.local (unknown [131.254.252.106]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 037C45613B4; Tue, 18 Apr 2023 10:50:06 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZcdLvwVeLQngDukSEHUTaNW+zJA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 18 Apr 2023 09:50:06 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: bcf4b1ae-4b79-4bb8-da0d-08db3fea1188 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.99,206,1677538800"; d="scan'208,217";a="53630971" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.473231, queueID=EE9C55613B5 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 OCaml Weekly News

    OCaml Weekly News

    Previous We= ek Up Next We= ek

    Hello

    Here is the latest OCaml Weekly News, for the week of April 11 to 18, 20= 23.

    You started to learn OCaml less than 12 months ago? Please hel= p us with our user survey on the OCaml.org Learning Area

    Sabine Schmaltz asked

    We=92re asking specifically for you, if your experience of learning OCam= l is still ongoing or so recent that you still remember

    1. what you struggled with (or still feel like you=92re struggling),
    2. =
    3. how the current materials failed you,
    4. what other materials hel= ped you understand.

    if you have previous experience in other languages, we also find it high= ly interesting to learn about resources that you found particularly effecti= ve/engaging/educational and why you think they are particularly great.

    Our goal is to improve the =93Learn=94 area of OCaml.org - and this is a= pretty broad topic in the sense that we want to provide a framework on OCa= ml.org where content is organised properly in such a way that information i= s easy to find and effective to use for various people with different backgrounds and learning styles.

    The survey is here: http= s://forms.gle/L1oQgEs3N9D6qx5v9

    If you indicate you=92re available for interview, our UX designer Claire= may contact you to schedule a video call with you.

    There will be a summary of the points brought up no later than May 5 in = this thread.

    First alpha release of OCaml 5.1.0

    octachron announced

    Four months after the release of OCaml 5.0.0, the set of new features fo= r the future version 5.1.0 of OCaml has been frozen. I am thus happy to ann= ounce the first alpha release for OCaml 5.1.0 .

    This alpha version is here to help fellow hackers join us early in our b= ug hunting and opam ecosystem fixing fun (see below for the installation in= structions). You can see the progress on this front at

    https:= //github.com/ocaml/opam-repository/issues/23669

    If you find any bugs, please report them here:

    https://github.com/oca= ml/ocaml/issues

    Note that this early alpha version is missing two important fixes for th= e garbage collector and Windows support. Those fixes will be available befo= re the beta. The full release is expected to happen in July.

    If you are interested by the ongoing list of new features and bug fixes,= the updated change log for OCaml 5.1.0 is available at:

    https://gith= ub.com/ocaml/ocaml/blob/5.1/Changes

    Installation Instructions

    The base compiler can be installed as an opam switch with the following = commands on opam 2.1:

    opam update
    opam switch create 5.1.0~alpha1
    

    For previous version of opam, the switch creation command line is slight= ly more verbose:

    opam update
    opam switch create 5.1.0~alpha1
    --repositories=3Ddefault,beta=3Dgit&=
    #43;https://github.com/ocaml/ocaml-beta-repository.git
    

    If you want to tweak the configuration of the compiler, you can switch t= o the option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.1.0~alpha1+opti=
    ons <option_list>
    

    where option_list is a comma separated list of ocaml-option= -* packages. For instance, for a flambda and no-flat-float-array switch:

    opam switch create 5.1.0~alpha1+flambda=
    3;nffa ocaml-variants.5.1.0~alpha1+options
    ocaml-option-flambda ocaml-option-no-flat-float-array
    

    The command line above is slightly more complicated for opam version ant= erior to 2.1:

    opam update
    opam switch create <switch_name>
    --packages=3Docaml-variants.5.1.0~alpha1+options,<option_list>
    --repositories=3Ddefault,beta=3Dgit&=
    #43;https://github.com/ocaml/ocaml-beta-repository.git
    

    In both cases, all available options can be listed with =93opam search o= caml-option=94.

    The source code for the alpha is also available at these addresses:

    Interesting OCaml Articles

    james woodyatt announced

    Our @yallop is one of the authors of this paper about parsing.

    flap: A Deterministic Parse= r with Fused Lexing

    Lexers and parsers are typically defined separately and connected by a t= oken stream. This separate definition is important for modularity and reduc= es the potential for parsing ambiguity. However, materializing tokens as da= ta structures and case-switching on tokens comes with a cost. We show how to fuse separately-defined lexers= and parsers, drastically improving performance without compromising modula= rity or increasing ambiguity. We propose a deterministic variant of Greibac= h Normal Form that ensures deterministic parsing with a single token of lookahead and makes fusion strikingly simpl= e, and prove that normalizing context free expressions into the determinist= ic normal form is semantics-preserving. Our staged parser combinator librar= y, flap, provides a standard interface, but generates specialized token-free code that runs two to six times faste= r than ocamlyacc on a range of benchmarks.

    Porting a OCaml3-based game to the latest version of OCaml

    nova4216 asked

    Guys, there is not a trivial task.

    There is a game engine on OCaml + a game written on this game engine= . This was all written about 10 years ago, on version Ocaml 3. Camplp4 was = used as a preprocessor. And the compiler was patched to correctly generate = ARM code for iOS.

    The task is to port the engine and the game to the latest version of Oca= ml which supports arm64 on all platforms by default.

    We can make the engine Open Source - maybe it will help the Ocaml commun= ity to release more games in their favorite language for mobile platforms.

    If anyone is interested in the task - feel free to contact me, and we wi= ll be glad to discuss the details! Of course, there will be a reward for su= ccessful completion of the task.

    nova4216@gmail.com

    nova4216 later added

    The game itself is called The Big Farm Theory. The engine in this thread= is Lightning:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I=92ll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 11 Apr 2023 13:42:46 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 11 Apr 2023 13:42:46 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 11 Apr 2023 13:42:46 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33BCfxqi024521 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 11 Apr 2023 13:41:59 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 33BCfmrH024506 for ; Tue, 11 Apr 2023 13:41:48 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Apr 2023 14:41:47 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8EB3BE7315; Tue, 11 Apr 2023 14:41:47 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6BFFBE72F8 for ; Tue, 11 Apr 2023 14:41:41 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Apr 2023 14:41:39 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 55F915605B9; Tue, 11 Apr 2023 14:41:37 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZbHMdYYYVEgLeK0C5IOU6l8YHYA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 11 Apr 2023 13:41:37 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: fba88f00-731e-4f61-ae60-08db3a8a4043 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,336,1673910000"; d="scan'208,217";a="53088468" x-spam-flag: No, tests=bogofilter, spamicity=0.222700, queueID=0E35A5605BC x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <6C5BB74FB3DAE246A7DD5F26ED4D1190@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNC0xMSBUdWUgMTQ6MzkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDQuMDQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNC4xOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEFwcmlsIDA0IHRvIDExLCAyMDIzLiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPk9DQU1M4oCZMjM6IFRoZSBPQ2FtbCBV c2VycyBhbmQgRGV2ZWxvcGVycyBXb3Jrc2hvcDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzIiPkxk cCAwLjEuMDwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPkR1bmUgMy43LjA8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM0Ij5jbWFya2l0IDAuMS4wIOKAkyBDb21tb25NYXJrIHBhcnNlciBhbmQgcmVu ZGVyZXIgZm9yIE9DYW1sPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNSI+b2NhbWxtYXJrIOKAkyBB biBvY2FtbGRvYyB0byBDb21tb25NYXJrIGJpLWRpcmVjdGlvbmFsIHRyYW5zbGF0aW9uPC9hPg0K PC9saT48bGk+PGEgaHJlZj0iIzYiPmtjYXMgYW5kIGtjYXNfZGF0YSAwLjIuNCBmb3IgbG9jay1m cmVlIGNvbmN1cnJlbnQgcHJvZ3JhbW1pbmc8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNyI+TG93 LWhhbmdpbmcgZnJ1aXQgZm9yIGEgUFIgY29udHJpYnV0aW9uIHRvIHRoZSBPQ2FtbCBydW50aW1l IGNvZGUgKEMgY29kZSk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjOCI+V2VkLCBBcHIgMTIgQCA3 cG0gVS5TLiBDZW50cmFsOiBKb25haCBCZWNrZm9yZCBvbiDigJxXaGF0IGRpc3RyaWJ1dGluZyBP Q2FtbCBvbiBXaW5kb3dzIGdhdmUgbWUgKGFuZCB5b3Up4oCdPC9hPg0KPC9saT48bGk+PGEgaHJl Zj0iIzkiPnpiZzogWmVybyBCdWxsc2hpdCBHaXQ8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmcy ZDYyOGMxIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPk9DQU1M 4oCZMjM6IFRoZSBPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBXb3Jrc2hvcDwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMjAyMy0wNC9tc2cw MDAwNC5odG1sIj4NCmh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2NhbWwtbGlzdC8y MDIzLTA0L21zZzAwMDA0Lmh0bWw8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNTJkYzE2NyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzUyZGMx NjciPk9sZWcgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmc1MmRjMTY3Ij4NCjxwPlRoZSBPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBXb3Jr c2hvcDogQUNNIFNJR1BMQU4gV29ya3Nob3AgU2VwdGVtYmVyIDksIDIwMjMgKFNhdHVyZGF5KSBT ZWF0dGxlLCBXQSwgVVNBIGFuZCBhbHNvIG9ubGluZSAodHdvIGRheXMgYWZ0ZXIgbWFpbiBJQ0ZQ KQ0KPC9wPg0KPHA+Q2FsbCBmb3IgcHJlc2VudGF0aW9uczogPGEgaHJlZj0iaHR0cHM6Ly9pY2Zw MjMuc2lncGxhbi5vcmcvaG9tZS9vY2FtbC0yMDIzIj5odHRwczovL2ljZnAyMy5zaWdwbGFuLm9y Zy9ob21lL29jYW1sLTIwMjM8L2E+IFRhbGsgcHJvcG9zYWwgc3VibWlzc2lvbiBkZWFkbGluZTog VGh1cnNkYXkgSnVuZSAxc3QsIDIwMjMNCjwvcD4NCjxwPihQbGVhc2UgcmVkaXN0cmlidXRlIHdp ZGVseS4pIDwvcD4NCjxwPlRoZSBPQ2FtbCBVc2VycyBhbmQgRGV2ZWxvcGVycyBXb3Jrc2hvcCBi cmluZ3MgdG9nZXRoZXIgdGhlIE9DYW1sIGNvbW11bml0eSwgaW5jbHVkaW5nIHVzZXJzIG9mIE9D YW1sIGluIGluZHVzdHJ5LCBhY2FkZW1pYSwgaG9iYnlpc3RzIGFuZCB0aGUgZnJlZSBzb2Z0d2Fy ZSBjb21tdW5pdHkuDQo8L3A+DQo8cD5PQ2FtbCAyMDIzIHdpbGwgYmUgY28tbG9jYXRlZCB3aXRo IElDRlAgMjAyMywgd2hpY2ggd2lsbCB0YWtlIHBsYWNlIGluIFNlYXR0bGUsIFVTLiBXZSBhaW0g dG8gb3JnYW5pemUgaXQgYXMgYSBoeWJyaWQgZXZlbnQsIHNvIHRoYXQgcGVvcGxlIGNhbiBhdHRl bmQgYW5kIGV2ZW4gZ2l2ZSB0YWxrcyByZW1vdGVseTogdGFsa3Mgd2lsbCBiZSBzdHJlYW1lZCBp biByZWFsLXRpbWUsIGFuZCB2aXJ0dWFsIHBhcnRpY2lwYW50cyB3aWxsIGJlIGFibGUNCiB0byBj aGF0IGFuZCBhc2sgcXVlc3Rpb25zIGluIHdyaXRpbmcuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnYTUzMDgwYiIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9 Im9yZ2E1MzA4MGIiPlNjb3BlPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0i dGV4dC1vcmdhNTMwODBiIj4NCjxwPlByZXNlbnRhdGlvbnMgYW5kIGRpc2N1c3Npb25zIHdpbGwg Zm9jdXMgb24gdGhlIE9DYW1sIHByb2dyYW1taW5nIGxhbmd1YWdlIGFuZCBpdHMgY29tbXVuaXR5 LiBXZSBhaW0gdG8gc29saWNpdCB0YWxrcyBvbiBhbGwgYXNwZWN0cyByZWxhdGVkIHRvIGltcHJv dmluZyB0aGUgdXNlIG9yIGRldmVsb3BtZW50IG9mIHRoZSBsYW5ndWFnZSBhbmQgaXRzIHByb2dy YW1taW5nIGVudmlyb25tZW50LCBpbmNsdWRpbmcsIGZvciBleGFtcGxlIChidXQNCiBub3QgbGlt aXRlZCB0byk6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5jb21waWxlciBkZXZlbG9w bWVudHMsIG5ldyBiYWNrZW5kcywgcnVudGltZSBhbmQgYXJjaGl0ZWN0dXJlcyA8L2xpPjxsaT5w cmFjdGljYWwgdHlwZSBzeXN0ZW0gaW1wcm92ZW1lbnRzLCBzdWNoIGFzIChidXQgbm90IGxpbWl0 ZWQgdG8pIEdBRFRzLCBmaXJzdC1jbGFzcyBtb2R1bGVzLCBnZW5lcmljIHByb2dyYW1taW5nLCBv ciBkZXBlbmRlbnQgdHlwZXMNCjwvbGk+PGxpPm5ldyBsaWJyYXJ5IG9yIGFwcGxpY2F0aW9uIHJl bGVhc2VzLCBhbmQgdGhlaXIgZGVzaWduIHJhdGlvbmFsZXMgPC9saT48bGk+dG9vbHMgYW5kIGlu ZnJhc3RydWN0dXJlIHNlcnZpY2VzLCBhbmQgdGhlaXIgZW5oYW5jZW1lbnRzIDwvbGk+PGxpPnBy b21pbmVudCBpbmR1c3RyaWFsIG9yIGV4cGVyaW1lbnRhbCB1c2VzIG9mIE9DYW1sLCBvciBkZXBs b3ltZW50cyBpbiB1bnVzdWFsIHNpdHVhdGlvbnMuDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNGIxOWJhMyIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzRiMTliYTMiPlByZXNlbnRhdGlvbnM8L2g0Pg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzRiMTliYTMiPg0KPHA+SXQgd2lsbCBiZSBhbiBp bmZvcm1hbCBtZWV0aW5nIHdpdGggbm8gZm9ybWFsIHByb2NlZWRpbmdzLiBUaGUgcHJlc2VudGF0 aW9uIG1hdGVyaWFsIHdpbGwgYmUgYXZhaWxhYmxlIG9ubGluZSBmcm9tIHRoZSB3b3Jrc2hvcCBo b21lcGFnZS4gVGhlIHByZXNlbnRhdGlvbnMgbWF5IGJlIHJlY29yZGVkLCBhbmQgbWFkZSBhdmFp bGFibGUgYXQgYSBsYXRlciB0aW1lLg0KPC9wPg0KPHA+VGhlIG1haW4gcHJlc2VudGF0aW9uIGZv cm1hdCBpcyBhIHdvcmtzaG9wIHRhbGssIHRyYWRpdGlvbmFsbHkgYXJvdW5kIDIwIG1pbnV0ZXMg aW4gbGVuZ3RoLCBwbHVzIHF1ZXN0aW9uIHRpbWUsIGJ1dCB3ZSBhbHNvIGhhdmUgYSBwb3N0ZXIg c2Vzc2lvbiBkdXJpbmcgdGhlIHdvcmtzaG9wIOKAkyB0aGlzIGFsbG93cyB0byBwcmVzZW50IG1v cmUgZGl2ZXJzZSB3b3JrLCBhbmQgZ2l2ZXMgdGltZSBmb3IgZGlzY3Vzc2lvbi4gVGhlIHByb2dy YW0gY29tbWl0dGVlDQogd2lsbCBkZWNpZGUgd2hpY2ggcHJlc2VudGF0aW9ucyBzaG91bGQgYmUg ZGVsaXZlcmVkIGFzIHBvc3RlcnMgb3IgdGFsa3MuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjZTdiNzZkIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnY2U3Yjc2ZCI+U3VibWlzc2lvbjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtNCIgaWQ9InRleHQtb3JnY2U3Yjc2ZCI+DQo8cD5UbyBzdWJtaXQgYSBwcmVzZW50YXRpb24s IHBsZWFzZSByZWdpc3RlciBhIGRlc2NyaXB0aW9uIG9mIHRoZSB0YWxrIChhYm91dCAyIHBhZ2Vz IGxvbmcpIGF0DQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL2ljZnAyMy1vY2FtbC5ob3RjcnAu Y29tLyI+aHR0cHM6Ly9pY2ZwMjMtb2NhbWwuaG90Y3JwLmNvbS88L2E+DQo8L3A+DQo8cD5wcm92 aWRpbmcgYSBjbGVhciBzdGF0ZW1lbnQgb2Ygd2hhdCB3aWxsIGJlIHByb3ZpZGVkIGJ5IHRoZSBw cmVzZW50YXRpb246IHRoZSBwcm9ibGVtcyB0aGF0IGFyZSBhZGRyZXNzZWQsIHRoZSBzb2x1dGlv bnMgb3IgbWV0aG9kcyB0aGF0IGFyZSBwcm9wb3NlZC4NCjwvcD4NCjxwPkxhVGVYLXByb2R1Y2Vk IFBERnMgYXJlIGEgY29tbW9uIGFuZCB3ZWxjb21lIHN1Ym1pc3Npb24gZm9ybWF0LiBGb3IgYWNj ZXNzaWJpbGl0eSBwdXJwb3Nlcywgd2UgYXNrIFBERiBzdWJtaXR0ZXJzIHRvIGFsc28gcHJvdmlk ZSB0aGUgc291cmNlcyBvZiB0aGVpciBzdWJtaXNzaW9uIGluIGEgdGV4dHVhbCBmb3JtYXQsIHN1 Y2ggYXMgLnRleCBzb3VyY2VzLiBSZXZpZXdlcnMgbWF5IHJlYWQgZWl0aGVyIHRoZSBzdWJtaXR0 ZWQgUERGIG9yIHRoZQ0KIHRleHQgdmVyc2lvbi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VlNDc2N2YiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0 IGlkPSJvcmdlZTQ3NjdmIj5JbXBvcnRhbnQgZGF0ZXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2VlNDc2N2YiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PlRodXJzZGF5IDFzdCBKdW5lIChhbnkgdGltZSB6b25lKTogQWJzdHJhY3Qgc3VibWlzc2lvbiBk ZWFkbGluZSA8L2xpPjxsaT5UaHVyc2RheSA2aCBKdWx5OiBBdXRob3Igbm90aWZpY2F0aW9uIDwv bGk+PGxpPlNhdHVyZGF5IDl0aCBTZXB0ZW1iZXI6IE9DYW1sIFdvcmtzaG9wIDwvbGk+PC91bD4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5NmMyYjQ4IiBj bGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnOTZjMmI0OCI+TUwgZmFtaWx5IHdvcmtzaG9w IGFuZCBwb3N0LXByb2NlZWRpbmdzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBp ZD0idGV4dC1vcmc5NmMyYjQ4Ij4NCjxwPlRoZSBNTCBmYW1pbHkgd29ya3Nob3AsIGhlbGQgb24g dGhlIHByZXZpb3VzIGRheSwgZGVhbHMgd2l0aCBnZW5lcmFsIGlzc3VlcyBvZiB0aGUgTUwtc3R5 bGUgcHJvZ3JhbW1pbmcgYW5kIHR5cGUgc3lzdGVtcywgZm9jdXNlcyBvbiBtb3JlIHJlc2VhcmNo LW9yaWVudGVkIHdvcmsgdGhhdCBpcyBsZXNzIHNwZWNpZmljIHRvIGEgbGFuZ3VhZ2UgaW4gcGFy dGljdWxhciAoT0NhbWwpLiBUaGVyZSBpcyBhbiBvdmVybGFwIGJldHdlZW4gdGhlIHR3bw0KIHdv cmtzaG9wcywgYW5kIHdlIGhhdmUgb2NjYXNpb25hbGx5IHRyYW5zZmVycmVkIHByZXNlbnRhdGlv bnMgZnJvbSBvbmUgdG8gdGhlIG90aGVyIGluIHRoZSBwYXN0LiBUaGUgYXV0aG9ycyB3aG8gZmVl bCB0aGVpciBzdWJtaXNzaW9uIGZpdHMgYm90aCB3b3Jrc2hvcHMgYXJlIGVuY291cmFnZWQgdG8g bWVudGlvbiBpdCBhdCBzdWJtaXNzaW9uIHRpbWUgYW5kL29yIGNvbnRhY3QgdGhlIFByb2dyYW0g Q2hhaXJzLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzYwOWNlYzkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc2MDljZWM5Ij5Qcm9n cmFtIENvbW1pdHRlZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnNjA5Y2VjOSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+S2VuaWNoaSBBc2FpIChPY2hh bm9taXp1IFVuaXZlcnNpdHksIEphcGFuKSA8L2xpPjxsaT5Kb25haCBCZWNrZm9yZCAoRGlza3V2 IEluYywgVVMpIDwvbGk+PGxpPlJhamEgQm91amJlbCAoT0NhbWxQcm8sIEZyYW5jZSkgPC9saT48 bGk+Q2hyaXMgQ2FzaW5naGlubyAoSmFuZXN0cmVldCwgVVMpIDwvbGk+PGxpPk5hdGhhbmFlbGxl IENvdXJhbnQgKE9DYW1sUHJvLCBGcmFuY2UpIDwvbGk+PGxpPkphY3F1ZXMgR2FycmlndWUgKFVu aXZlcnNpdHkgb2YgTmFnb3lhLCBKYXBhbikgPC9saT48bGk+S2lyYW4gR29waW5hdGhhbiAoTmF0 aW9uYWwgVW5pdmVyc2l0eSBvZiBTaW5nYXBvcmUsIFNpbmdhcG9yZSkgPC9saT48bGk+T2xlZyBL aXNlbHlvdiAoVG9ob2t1IFVuaXZlcnNpdHksIEphcGFuKSA8L2xpPjxsaT5CZW5vaXQgTW9udGFn dSAoSU5SSUEsIEZyYW5jZSkgPC9saT48bGk+U3VkaGEgUGFyaW1hbGEgKFRhcmlkZXMsIEluZGlh KSA8L2xpPjxsaT5NYXRpamEgUHJldG5hciAoVW5pdmVyc2l0eSBvZiBManVibGphbmEsIFNsb3Zl bmlhKSA8L2xpPjxsaT5Kb25hdGhhbiBQcm90emVua28gKE1pY3Jvc29mdCBSZXNlYXJjaCBSZWRt b25kLCBVUykgPC9saT48bGk+Q2xhdWRlIFJ1Ymluc29uIChVbml2ZXJzaXR5IG9mIEFyaXpvbmEs IFVTKSA8L2xpPjxsaT5HYWJyaWVsIFNjaGVyZXIgKElOUklBLCBGcmFuY2UpIDwvbGk+PC91bD4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxNDY4MTA4IiBj bGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMTQ2ODEwOCI+UXVlc3Rpb25zIGFuZCBjb250 YWN0PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcxNDY4MTA4 Ij4NCjxwPlBsZWFzZSBzZW5kIGFueSBxdWVzdGlvbnMgdG8gdGhlIGNoYWlyOiA8L3A+DQo8cD5H YWJyaWVsIFNjaGVyZXIgKGdhYnJpZWwuc2NoZXJlckBnbWFpbC5jb20pIDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIiPkxkcCAwLjEuMDwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWxkcC0wLTEtMC8xMTg5NS8xIj5odHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLWxkcC0wLTEtMC8xMTg5NS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwZmJiNjA0IiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnMGZiYjYwNCI+Wm9nZ3kgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwZmJiNjA0Ij4NCjxwPknigJltIHBsZWFzZWQgdG8g YW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9mcmFtYWdpdC5v cmcvem9nZ3kvb2NhbWwtbGRwIj4NCk9DYW1sLWxkcDwvYT4sIHdoaWNoIGluY2x1ZGVzIDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT50aGUgPGEgaHJlZj0iaHR0cHM6Ly96b2dneS5mcmFt YS5pby9vY2FtbC1sZHAvcmVmZG9jL2xkcC9pbmRleC5odG1sIj48Y29kZT5sZHA8L2NvZGU+PC9h PiBwYWNrYWdlIHRvIGJ1aWxkDQo8YSBocmVmPSJodHRwOi8vd3d3LnczLm9yZy9UUi9sZHAvIj5M RFA8L2E+IChMaW5rZWQgRGF0YSBQbGF0Zm9ybSkgYXBwbGljYXRpb25zLCBydW5uYWJsZSBlaXRo ZXIgaW4gc3RhbmRhbG9uZSBwcm9ncmFtICh1c2luZyBwYWNrYWdlcw0KPGEgaHJlZj0iaHR0cHM6 Ly96b2dneS5mcmFtYS5pby9vY2FtbC1sZHAvcmVmZG9jL2xkcF90bHMvaW5kZXguaHRtbCI+PGNv ZGU+bGRwX3RsczwvY29kZT48L2E+IG9yDQo8YSBocmVmPSJodHRwczovL3pvZ2d5LmZyYW1hLmlv L29jYW1sLWxkcC9yZWZkb2MvbGRwX2N1cmwvaW5kZXguaHRtbCI+PGNvZGU+bGRwX2N1cmw8L2Nv ZGU+PC9hPikgb3IgaW4gdGhlIGJyb3dzZXIgKHVzaW5nIHBhY2thZ2UNCjxhIGhyZWY9Imh0dHBz Oi8vem9nZ3kuZnJhbWEuaW8vb2NhbWwtbGRwL3JlZmRvYy9sZHBfanMvaW5kZXguaHRtbCI+PGNv ZGU+bGRwX2pzPC9jb2RlPjwvYT4gd2l0aCBqc19vZl9vY2FtbCkuDQo8L2xpPjxsaT50aGUgPGEg aHJlZj0iaHR0cHM6Ly96b2dneS5mcmFtYS5pby9vY2FtbC1sZHAvcmVmZG9jL3NvbGlkL2luZGV4 Lmh0bWwiPjxjb2RlPnNvbGlkPC9jb2RlPjwvYT4gcGFja2FnZSwgcHJvdmlkaW5nIGEgbGlicmFy eSB0byBpbnRlcmFjdCB3aXRoDQo8YSBocmVmPSJodHRwczovL3NvbGlkcHJvamVjdC5vcmcvIj5T T0xJRDwvYT4gcG9kcywgPC9saT48bGk+dGhlIDxhIGhyZWY9Imh0dHBzOi8vem9nZ3kuZnJhbWEu aW8vb2NhbWwtbGRwL3JlZmRvYy9zb2xpZF9zZXJ2ZXIvaW5kZXguaHRtbCI+DQo8Y29kZT5zb2xp ZF9zZXJ2ZXI8L2NvZGU+PC9hPiBwYWNrYWdlLCBwcm92aWRpbmcgYW4gZXhwZXJpbWVudGFsIFNP TElEIHNlcnZlciwgPC9saT48bGk+dGhlIDxhIGhyZWY9Imh0dHBzOi8vem9nZ3kuZnJhbWEuaW8v b2NhbWwtbGRwL3JlZmRvYy9zb2xpZF90b29scy9pbmRleC5odG1sIj4NCjxjb2RlPnNvbGlkX3Rv b2xzPC9jb2RlPjwvYT4gcGFja2FnZSwgaW5jbHVkaW5nIHNvbWUgYmFzaWMgY29tbWFuZC1saW5l IHRvb2xzIHRvIGludGVyZmFjdCB3aXRoIFNPTElEIHNlcnZlcnMgYW5kIGEgbGlicmFyeSB0byBk ZXZlbG9wIG90aGVyIHRvb2xzLg0KPC9saT48L3VsPg0KPHA+VGhlIHBhY2thZ2VzIHNob3VsZCBi ZSBhdmFpbGFibGUgaW4gb3BhbSBzb29uLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MyI+RHVuZSAzLjcuMDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWR1bmUtMy03LTAvMTE0NzQvNCI+aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5l LTMtNy0wLzExNDc0LzQ8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzg0ZDE4M2MiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4NGQxODNjIj5F dGllbm5lIE1pbGxvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzg0ZDE4M2MiPg0KPHA+V2UganVzdCByZWxlYXNlZCBhIHBvaW50IHJlbGVh c2UgdGhhdCBmaXhlcyBzb21lIGlzc3VlczogPC9wPg0KPHA+My44LjAgaXMgcGxhbm5lZCB0byBi ZSByZWxlYXNlZCBpbiBNYXkuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnYTQ5MGI5ZSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2E0OTBiOWUiPjMu Ny4xICgyMDIzLTA0LTA0KTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnYTQ5MGI5ZSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Rml4IHNlZ2ZhdWx0IG9u IE1hY09TIHdoZW4gZHVuZSB3YXMgYmVpbmcgc2h1dGRvd24gd2hpbGUgaW4gd2F0Y2ggbW9kZS4g KCM3MzEyLCBmaXhlcyAjNjE1MSwgQGdyaWRidWdzLCBAZW1pbGxvbikNCjwvbGk+PGxpPkZpeCBw cmVsdWRlcyBub3QgYmVpbmcgcmVjb3JkZWQgYXMgZGVwZW5kZW5jaWVzIGluIHRoZSBgKG1keClg IHN0YW56YSAoIzcxMDksIGZpeGVzICM3MDc3LCBAZW1pbGxvbikuDQo8L2xpPjxsaT5QYXNzIGNv cnJlY3QgZmxhZ3Mgd2hlbiBjb21waWxpbmcgYHN0ZGxpYi5tbGAuICgjNzI0MSwgQGVtaWxsb24p IDwvbGk+PGxpPkhhbmRsZSDigJxUb28gbWFueSBsaW5rc+KAnSBlcnJvcnMgd2hlbiB1c2luZyBE dW5lIGNhY2hlIG9uIFdpbmRvd3MuIFRoZSBmaXggaW4gMy43LjAgZm9yIHRoaXMgc2FtZSBpc3N1 ZSB3YXMgbm90IGVmZmVjdGl2ZSBkdWUgdG8gYSB0eXBvLiAoIzc0NzIsIEBub2piKQ0KPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+Y21hcmtpdCAwLjEuMCDi gJMgQ29tbW9uTWFyayBwYXJzZXIgYW5kIHJlbmRlcmVyIGZvciBPQ2FtbDwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNtYXJraXQtMC0xLTAtY29tbW9ubWFyay1w YXJzZXItYW5kLXJlbmRlcmVyLWZvci1vY2FtbC8xMTkwMC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tY21hcmtpdC0wLTEtMC1jb21tb25tYXJrLXBhcnNlci1hbmQtcmVuZGVy ZXItZm9yLW9jYW1sLzExOTAwLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZzFkODAyZTEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxZDgw MmUxIj5EYW5pZWwgQsO8bnpsaSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFkODAyZTEiPg0KPHA+SXTigJlzIG15IHBsZWFzdXJlIHRvIGFu bm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIHRoZSBDbWFya2l0IGxpYnJhcnkuIDwvcD4NCjxw PkNtYXJraXQgcGFyc2VzIHRoZSBbQ29tbW9uTWFyayBzcGVjaWZpY2F0aW9uXS4gSXQgcHJvdmlk ZXM6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BIENvbW1vbk1hcmsgcGFyc2VyIGZv ciBVVEYtOCBlbmNvZGVkIGRvY3VtZW50cy4gTGluayBsYWJlbCByZXNvbHV0aW9uIGNhbiBiZSBj dXN0b21pemVkIGFuZCBhIG5vbi1zdHJpY3QgcGFyc2luZyBtb2RlIGNhbiBiZSBhY3RpdmF0ZWQg dG8gYWRkOiBzdHJpa2V0aHJvdWdoLCBMYVRlWCBtYXRoLCBmb290bm90ZXMsIHRhc2sgaXRlbXMg YW5kIHRhYmxlcy4NCjwvbGk+PGxpPkFuIGV4dGVuc2libGUgYWJzdHJhY3Qgc3ludGF4IHRyZWUg Zm9yIENvbW1vbk1hcmsgZG9jdW1lbnRzIHdpdGggc291cmNlIGxvY2F0aW9uIHRyYWNraW5nIGFu ZCBiZXN0LWVmZm9ydCBzb3VyY2UgbGF5b3V0IHByZXNlcnZhdGlvbi4NCjwvbGk+PGxpPkFic3Ry YWN0IHN5bnRheCB0cmVlIG1hcHBlciBhbmQgZm9sZGVyIGFic3RyYWN0aW9ucyBmb3IgcXVpY2sg YW5kIGNvbmNpc2UgdHJlZSB0cmFuc2Zvcm1hdGlvbnMuDQo8L2xpPjxsaT5FeHRlbnNpYmxlIHJl bmRlcmVycyBmb3IgSFRNTCwgTGFUZVggYW5kIENvbW1vbk1hcmsgd2l0aCBzb3VyY2UgbGF5b3V0 IHByZXNlcnZhdGlvbi4NCjwvbGk+PC91bD4NCjxwPkNtYXJraXQgaXMgZGlzdHJpYnV0ZWQgdW5k ZXIgdGhlIElTQyBsaWNlbnNlLiBJdCBoYXMgbm8gZGVwZW5kZW5jaWVzLiA8L3A+DQo8cD5UaGlz IGZpcnN0IHJlbGVhc2UgYmVuZWZpdGVkIGZyb20gYSBncmFudCBmcm9tIHRoZSBbT0NhbWwgc29m dHdhcmUgZm91bmRhdGlvbl0uIEZ1bmRpbmcgZnJvbSBteSBmZXcgYnV0IGZhaXRoZnVsbCBbZG9u YXRvcnNdIGlzIGFsc28gcGFyYW1vdW50IHRvIGdldCB0aGVzZSB0ZWRpb3VzIGJpdHMgb3V0IGZv ciByZWxlYXNlLiBUaGFuayB5b3UgYWxsIGZvciB5b3VyIHN1cHBvcnQuDQo8L3A+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+SG9tZXBhZ2U6IDxhIGhyZWY9Imh0dHBzOi8vZXJyYXRpcXVlLmNo L3NvZnR3YXJlL2NtYXJraXQiPmh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtYXJraXQ8 L2E+DQo8L2xpPjxsaT5Eb2NzOiA8YSBocmVmPSJodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2Fy ZS9jbWFya2l0L2RvYyI+aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21hcmtpdC9kb2M8 L2E+IChvcg0KPGNvZGU+b2RpZyBkb2MgY21hcmtpdDwvY29kZT4pIDwvbGk+PGxpPkluc3RhbGw6 IDxjb2RlPm9wYW0gaW5zdGFsbCBjbWFya2l0PC9jb2RlPiAob25jZSB0aGlzIFtQUl0gaXMgbWVy Z2VkKSA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnZDg5ODVmMiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2Q4OTg1ZjIiPkRh bmllbCBCw7xuemxpIHRoZW4gYWRkZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZ2Q4OTg1ZjIiPg0KPHA+U2luY2Ugc29tZW9uZSBpcyBnb2luZyB0byBhc2sg aGVyZeKAmXMgbXkgYmlhc2VkIGNvbXBhcmlzb24gYmV0d2VlbiA8Y29kZT5jbWFya2l0PC9jb2Rl PiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vbWQiPjxjb2RlPm9tZDwv Y29kZT48L2E+LCB0aGUgb25seSBvdGhlciBPQ2FtbCBjb21tb25tYXJrIHBhcnNlciBJ4oCZbSBh d2FyZSBvZi4NCjwvcD4NCjxwPlRoaXMgaXMgYmFzZWQgb24gd2hhdCBJIHNlZSA8YSBocmVmPSJo dHRwczovL29jYW1sLm9yZy9wL29tZC9sYXRlc3QvZG9jL09tZC9pbmRleC5odG1sIj4NCmhlcmU8 L2E+IGFuZCB3aGF0IEkgZmVsbCBvbiBpbiB1c2luZyB0aGUgPGNvZGU+b21kPC9jb2RlPiB0b29s LiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+PGNvZGU+Y21hcmtpdDwvY29kZT4gdGFr ZXMgdGhlIHdob2xlIGRvY3VtZW50IGFzIGlucHV0LCA8Y29kZT5vbWQ8L2NvZGU+IGNhbiB3b3Jr IGxpbmUgYnkgbGluZSBvbiBpbnB1dCBjaGFubmVscy4gTm90ZSBob3dldmVyIHRoYXQgaW4gcHJh Y3RpY2UgZHVlIHRvIGhvdyBDb21tb25NYXJrIHBhcnNpbmcgd29ya3MgeW91IG5lZWQgaXQgaW4g bWVtb3J5IGFueXdheXMgYW5kIHdhaXQgZm9yIHRoZSBlbmQgb2YgaW5wdXQgdG8gdHJpZ2dlciBp bmxpbmUNCiBwYXJzaW5nLiA8L2xpPjxsaT48Y29kZT5jbWFya2l0PC9jb2RlPiBzaG91bGQgY29u Zm9ybSB0byB0aGUgQ29tbW9uTWFyayBzcGVjLCBhbGwgY29uZm9ybWFuY2UgdGVzdHMgcGFzcy4g SSBkb27igJl0IHRoaW5rDQo8Y29kZT5vbWQ8L2NvZGU+IGRvZXMgc2luY2UgVSYjNDM7MDAwMCBk b2VzbuKAmXQgc2VlbSB0byBiZSByZXBsYWNlZCBieSBVJiM0MztGRkZEIGFuZCBpbiBnZW5lcmFs IGl0IHNlZW1zIHRvIGZvcmdvIFVURiBkZWNvZGluZy4NCjwvbGk+PGxpPjxjb2RlPmNtYXJraXQ8 L2NvZGU+IHByb3ZpZGVzIGxvY2F0aW9uIHRyYWNraW5nIGFuZCBzb3VyY2UgbGF5b3V0IGluZm9y bWF0aW9uIGluIHRoZSBBU1QNCjxjb2RlPm9tZDwvY29kZT4gZG9lcyBub3QuIDwvbGk+PGxpPjxj b2RlPmNtYXJraXQ8L2NvZGU+IGZhaWxzIG9uIDMvMjIgKDIvMjIgaW4gT0NhbWwgNSkgb2YgdGhl IDxjb2RlPmNtYXJrPC9jb2RlPg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxp L2NtYXJraXQvYmxvYi9tYWluL3Rlc3QvcGF0aG9sb2dpY2FsLm1sIj5wYXRob2xvZ2ljYWwgdGVz dHM8L2E+Lg0KPGNvZGU+b21kPC9jb2RlPiBmYWlscyBvbiAxNy8yMiBvZiB0aGVtLiA8L2xpPjxs aT5Gcm9tIGNvbW1vbm1hcmsgdG8gaHRtbCBvbiBhIGxhcmdlIDEyTW8gbWQgZmlsZSwgPGNvZGU+ Y21hcmtpdDwvY29kZT4gc2VlbXMgc2xpZ2h0bHkgZmFzdGVyICgyNiUpIHRoYW4NCjxjb2RlPm9t ZDwvY29kZT4gKGV2ZW4gd2hlbiBsb2NzIGFuZCBsYXlvdXQgaXTigJlzIHN0aWxsIDEwJSBmYXN0 ZXIpLiBCdXQgbm8gc2NpZW50aWZpYyBiZW5jaG1hcmsgd2FzIHBlcmZvcm1lZC4gTm9yIHBhcnRp Y3VsYXIgYXR0ZW50aW9uIHdhcyBwYWlkIHRvIHRoYXQuIE5vciBpcyBpdCBsaWtlbHkgdG8gYmUg aW1wb3J0YW50IGluIHByYWN0aWNlICh1bmxlc3MgeW91IGFyZSBpbiBjaGFyZ2Ugb2YgcmVuZGVy aW5nIGFsbCB0aGUgUkVBRE1FcyBvZg0KIGEgY29kZSBob3N0aW5nIHBsYXRmb3JtKS4gPC9saT48 bGk+PGNvZGU+Y21hcmtpdDwvY29kZT4gaGFzIHJlbmRlcmVycyB0byBDb21tb25NYXJrIChsYXlv dXQgcHJlc2VydmluZykgYW5kIExhVGVYLg0KPGNvZGU+b21kPC9jb2RlPiBoYXNu4oCZdCwgYnV0 IGl0IGhhcyBvbmUgdG8gc2V4cCB3aGljaCA8Y29kZT5jbWFya2l0PC9jb2RlPiBoYXNu4oCZdC4N CjwvbGk+PGxpPjxjb2RlPmNtYXJraXQ8L2NvZGU+IHJlbmRlcmVycyBhcmUgZXh0ZW5zaWJsZSBh bmQgcGFydGlhbGx5IHJlZGVmaW5hYmxlLiA8Y29kZT4NCm9tZDwvY29kZT4gb25lcyBhcmVu4oCZ dC4gPC9saT48bGk+PGNvZGU+Y21hcmtpdDwvY29kZT4gbGV0cyBjbGllbnQgY3VzdG9taXplIGxp bmsgbGFiZWwgZGVmaW5pdGlvbiBhbmQgcmVzb2x1dGlvbiB3aGljaCBhbGxvd3MgdG8gZW1iZWQg ZGF0YSBiaW5kaW5nIERTTHMgaW4gdGhlIHZlcnkgZmxleGlibGUgbGFiZWwgc3ludGF4Lg0KPGNv ZGU+b21kPC9jb2RlPiBoYXMgbm8gc3VjaCB0aGluZy4gPC9saT48bGk+PGNvZGU+Y21hcmtpdDwv Y29kZT7igJlzIEFTVCBpcyBleHRlbnNpYmxlLiA8Y29kZT5vbWQ8L2NvZGU+4oCZcyBvbmUgaXMg bm90LiA8L2xpPjxsaT48Y29kZT5jbWFya2l0PC9jb2RlPiBhcyBwZXIgbm9kZSBleHRlbnNpYmxl IG1ldGFkYXRhLiA8Y29kZT5vbWQ8L2NvZGU+IHVzZXMgYSBwb2x5bW9ycGhpYyBzY2hlbWUuDQo8 L2xpPjxsaT48Y29kZT5jbWFya2l0PC9jb2RlPiBoYXMgQVNUIG1hcHBlcnMgYW5kIGZvbGRlcnMu IDxjb2RlPm9tZDwvY29kZT4gaGFzIG5vIHN1Y2ggdGhpbmcuDQo8L2xpPjxsaT48Y29kZT5jbWFy a2l0PC9jb2RlPiBoYXMgbm8gZGVwZW5kZW5jaWVzLiA8Y29kZT5vbWQ8L2NvZGU+IGRlcGVuZHMg b24gYSBidW5jaCBvZiBvdGhlciBwYWNrYWdlcy4NCjwvbGk+PGxpPjxjb2RlPmNtYXJraXQ8L2Nv ZGU+IGFuZCA8Y29kZT5vbWQ8L2NvZGU+IHN1cHBvcnQgZGlmZmVyZW50IHN5bnRheCBleHRlbnNp b25zLiBJdCBpcyB1bmNsZWFyIHdoaWNoIG9uZXMgYXJlIHN1cHBvcnRlZCBieQ0KPGNvZGU+b21k PC9jb2RlPiwgZm9yIDxjb2RlPmNtYXJraXQ8L2NvZGU+IHNlZSB0aGUgZG9jcy4gPC9saT48bGk+ PGNvZGU+Y21hcmtpdDwvY29kZT4gcmV1c2VzIHRoZSBDb21tb25NYXJrIHNwZWMgdm9jYWJ1bGFy eSBhbmQgdGhlIGRvY3MgYXJlIGZ1bGx5IGh5cGVybGlua2VkIGludG8gdGhlIHNwZWNpZmljYXRp b24gdG8gaGVscCB5b3UgdW5kZXJzdGFuZCB0aGUgdGVycmlibGUgbW9yYXNzIHlvdSBhcmUgZGVh bGluZyB3aXRoLg0KPC9saT48bGk+PGNvZGU+Y21hcmtpdDwvY29kZT4sIHRoZSB0b29sIHByb3Zp ZGVkIHdpdGggdGhlIGxpYnJhcnksIGlzIGEgYml0IG1vcmUgZmVhdHVyZWZ1bCB0aGFuIHRoZQ0K PGNvZGU+b21kPC9jb2RlPiAob3IgcmVmZXJlbmNlIDxjb2RlPmNtYXJrPC9jb2RlPikgdG9vbC4g Tm90YWJseSAod2l0aCBlbm91Z2ggb3B0aW9ucyBzcGVjaWZpZWQgOuKAkykgc3VwcG9ydCBpcyBw cm92aWRlZCB0byBvdXRwdXQgZnVsbCBIVE1MIGFuZCBMYVRlWCBkb2N1bWVudHMgdGhhdCBhcmUg cmVhZHkgdG8gcmVhZCBhbmQgcmVuZGVyLg0KPC9saT48L29sPg0KPHA+SW4gZ2VuZXJhbCBJ4oCZ ZCBzYXkgPGNvZGU+b21kPC9jb2RlPiBpcyBmaW5lIGlmIHlvdSBhcmUganVzdCBpbnRlcmVzdGVk IGluIHRha2luZyBhIENvbW1vbk1hcmsgc3RyaW5nIHRvIGEgZGVmYXVsdCBDb21tb25NYXJrIHJl bmRlcmluZy4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIG1ha2luZyBzeXN0ZW1zIHRoYXQgaW50 ZWdyYXRlIENvbW1vbk1hcmsgYXMgYSBtZWRpdW0gdGhhdCB5b3UgcHJvY2VzcyBhbmQgcGxheSB3 aXRoIHlvdSB3aWxsDQogYmUgYmV0dGVyIG9mZiB3aXRoIDxjb2RlPmNtYXJraXQ8L2NvZGU+LiA8 L3A+DQo8cD5GaW5hbGx5IGl0IHNob3VsZCBiZSBub3RlZCB0aGF0IDxjb2RlPm9tZDwvY29kZT4g d2FzIHN0YXJ0ZWQgaW4gZGFya2VyIHRpbWVzIHdoZW4gbm8gQ29tbW9uTWFyayBzcGVjaWZpY2F0 aW9uIGV4aXN0ZWQuIEhhdmluZyBzcGVudCBhIHNpZ25pZmljYW50IGFtb3VudCBvZiB0aW1lIG9u DQo8Y29kZT5jbWFya2l0PC9jb2RlPiA8aT53aXRoPC9pPiBhIHNwZWNpZmljYXRpb24gb25lIGNh biBvbmx5IGFwcHJlY2lhdGUgdGhlIHRob3VnaG5lc3Mgb2YgdGhlIGluaXRpYWwgZWZmb3J0Lg0K PC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt NSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPm9jYW1sbWFyayDigJMgQW4gb2NhbWxk b2MgdG8gQ29tbW9uTWFyayBiaS1kaXJlY3Rpb25hbCB0cmFuc2xhdGlvbjwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcG9jLW9jYW1sbWFyay1hbi1vY2FtbGRvYy10by1j b21tb25tYXJrLWJpLWRpcmVjdGlvbmFsLXRyYW5zbGF0aW9uLzExOTAxLzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3BvYy1vY2FtbG1hcmstYW4tb2NhbWxkb2MtdG8tY29tbW9ubWFy ay1iaS1kaXJlY3Rpb25hbC10cmFuc2xhdGlvbi8xMTkwMS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5YmZmNTUzIiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnOWJmZjU1MyI+RGFuaWVsIELDvG56bGkgYW5ub3VuY2VkPC9oMz4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc5YmZmNTUzIj4NCjxwPkFzIGEgc2hv dy1vZmYgZm9yIHRoZSA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNt YXJraXQtMC0xLTAtY29tbW9ubWFyay1wYXJzZXItYW5kLXJlbmRlcmVyLWZvci1vY2FtbC8xMTkw MD91PWRidWVuemxpIj4NCnJlY2VudGx5IGFubm91bmNlZCBjbWFya2l0PC9hPi4gSSBoYXZlIGRl dmlzZWQgPGNvZGU+b2NhbWxtYXJrPC9jb2RlPiwgYSBiaS1kaXJlY3Rpb25hbCB0cmFuc2xhdGlv biBiZXR3ZWVuDQo8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9tYW51YWwvb2NhbWxkb2MuaHRt bCNzczpvY2FtbGRvYy1zeW50YXgiPjxjb2RlPm9jYW1sZG9jPC9jb2RlPjwvYT4gYW5kDQo8YSBo cmVmPSJodHRwczovL3NwZWMuY29tbW9ubWFyay5vcmcvY3VycmVudCI+Q29tbW9uTWFyazwvYT4g d2l0aCB0aGUgbGVhc3QgYW1vdW50IG9mIENvbW1vbk1hcmsgZXh0ZW5zaW9ucyBwb3NzaWJsZS4N CjwvcD4NCjxwPkl0IGlzIGRlZmluZWQgaW4gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2Ri dWVuemxpL29kb2MtcGFyc2VyL2Jsb2Ivb2NhbWxtYXJrL2RvYy9vY2FtbG1hcmsubWQiPg0KdGhp cyBkb2N1bWVudDwvYT4uIDwvcD4NCjxwPlRoaXMgdW5yZWFzb25hYmxlIGhhY2sgYmVuZWZpdGVk IGZyb20gYSBncmFudCBvZiB0aGUgPGEgaHJlZj0iaHR0cDovL29jYW1sLXNmLm9yZy8iPg0KT0Nh bWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4uIEl0IHdhcyBob3dldmVyIG5vdCBzb2xpY2l0ZWQg YnkgVGhlIEZvdW5kYXRpb24gYW5kIGRvZXMgbm90IHJlcHJlc2VudCBhbnkgZW5kb3JzZW1lbnQg YnkgVGhlIEZvdW5kYXRpb24uDQo8L3A+DQo8cD5BIGZ1bGx5IGZ1bmN0aW9uYWwgcHJvb2Ygb2Yg Y29uY2VwdFteMV0gaW1wbGVtZW50YXRpb24gb24gPGNvZGU+b2RvYy1wYXJzZXI8L2NvZGU+IGNh biBiZSBmb3VuZCBpbg0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWRvYy9vZG9j LXBhcnNlci9wdWxsLzE1Ij50aGlzIFBSPC9hPi4gSWYgeW91IHdhbnQgdG8gdHJ5IGl0IHlvdSBz aG91bGQgYmUgYWJsZSB0bzoNCjwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdjMjMx NWU5Ij4NCm9wYW0gcGluIG9kb2MgLS1kZXYNCm9wYW0gcGluIGFkZCBjbWFya2l0IGh0dHBzOi8v ZXJyYXRpcXVlLmNoL3JlcG9zL2NtYXJraXQuZ2l0ICMgb3Igb3BhbSBpbnN0YWxsIGNtYXJraXQN Cm9wYW0gcGluIGFkZCBvZG9jLXBhcnNlciBodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvb2Rv Yy1wYXJzZXIjb2NhbWxtYXJrDQo8L3ByZT4NCjxwPkl0IGFsbG93cyB5b3UgdG8gd3JpdGUgeW91 ciBPQ2FtbCBkb2NzdHJpbmdzIGFuZCA8Y29kZT4ubWxkPC9jb2RlPiBmaWxlcyBpbiA8Y29kZT4N Cm9jYW1sbWFyazwvY29kZT4uIEJvdGggPGNvZGU+b2NhbWxtYXJrPC9jb2RlPiBhbmQgPGNvZGU+ b2NhbWxkb2M8L2NvZGU+IHN5bnRheGVzIGFyZSBzdXBwb3J0ZWQgdHJhbnNwYXJlbnRseSBieQ0K PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL29kb2MtcGFyc2VyL2Jsb2IvZWNm OGYwNmM4YjA4YTBjMzY2YjY5Y2ZmNzk5YmZhMGIzNjQ4OTI4MS9zcmMvb2NhbWxtYXJrLm1sI0w0 LUw0MiI+DQpzbmlmZmluZzwvYT4gZWFjaCBjb21tZW50IGZvciBhIHN5bnRheC4gPC9wPg0KPHA+ SWYgPGNvZGU+b2NhbWxtYXJrPC9jb2RlPiBpcyBkZXRlY3RlZCwgPGNvZGU+Y21hcmtpdDwvY29k ZT4gaXMgdXNlZCB0byBwYXJzZSB0aGUgY29tbWVudCBhbmQgdGhlIHJlc3VsdGluZyBhYnN0cmFj dCBzeW50YXggdHJlZSBpcyB0cmFuc2xhdGVkIHRvDQo8Y29kZT5vY2FtbGRvYzwvY29kZT7igJlz IG9uZS4gVGhhbmtzIHRvIHByZWNpc2Ugc291cmNlIGxvY2F0aW9uIHRyYWNraW5nIG9uIGJvdGgg c2lkZXMgYWxsIGVycm9ycyByZXBvcnRlZCBieQ0KPGNvZGU+b2RvYzwvY29kZT4gc2hvdWxkIGJl IHJlcG9ydGVkIGNvcnJlY3RseSBpbiA8Y29kZT5vY2FtbG1hcms8L2NvZGU+IGNvbnN0cnVjdHMu DQo8L3A+DQo8cD5UaGlzIHNob3dzIGhvdyB0byB1c2UgPGNvZGU+Y21hcmtpdDwvY29kZT7igJlz IGxhYmVsIDxhIGhyZWY9Imh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtYXJraXQvZG9j L0NtYXJraXQvTGFiZWwvaW5kZXguaHRtbCNyZXNvbHZlcnMiPg0KcmVzb2x2ZXJzPC9hPiB0byBn b29kIGVmZmVjdC4gTmFtZWx5IHRvIHByb3ZpZGUgdGhlIGNvdW50ZXIgcGFydCB0byA8Y29kZT5v Y2FtbGRvYzwvY29kZT4gZXh0ZW5zaXZlIGNyb3NzLXJlZmVyZW5jZSBsaW5raW5nIGNhcGFiaWxp dGllcyBieSBhbGxvd2luZyB0byBzcGVjaWZ5IHRoZW0gd2l0aCB0aGUgc2FtZSBzeW50YXgg4oCT IHNhdmUgZm9yIHRoZSBicmFjZXMg4oCTIGluIENvbW1vbk1hcmvigJlzIGxpbmsgbGFiZWxzLg0K PC9wPg0KPHA+UGVyc29uYWxseSBJ4oCZbSBub3QgcmVhbGx5IGNvbnZpbmNlZCBpdOKAmXMgYSBn b29kIGlkZWEsIGRvYyBRQSBhbmQgcmVhZGFiaWxpdHkgYXJlIGNvbmNlcm5zLCBzZWUgdGhlDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvb2RvYy1wYXJzZXIvYmxvYi9vY2Ft bG1hcmsvZG9jL29jYW1sbWFyay5tZCNhZHZhbnRhZ2VzIj4NCnRyYWRlb2ZmczwvYT4uIEJ1dCBJ 4oCZZCBqdXN0IHRob3VnaHQgSeKAmWQgcHV0IHRoYXQgb24gdGhlIHRhYmxlIGZvciBkaXNjdXNz aW9uOyBzb21ldGltZXMgaXTigJlzIGJldHRlciB0byB0aGluayB3ZSBjb3VsZCBoYXZlIGl0IHJh dGhlciB0aGFuIGhhdmUgaXQgO+KAkykNCjwvcD4NCjxwPlteMV06IEV4Y2VwdCBmb3IgbWlzc2lu ZyBzdXBwb3J0IGZvciBALXRhZ3MgYW5kIDxjb2RlPm9kb2M8L2NvZGU+IGxhdGVzdCBhZGRpdGlv biAobWF0aCBhbmQgdGFibGVzLCBidXQgdGhleSBhcmUgc3VwcG9ydGVkIGJ5DQo8Y29kZT5jbWFy a2l0PC9jb2RlPikgaXQgaXMgcmVhc29uYWJseSBjb21wbGV0ZS4gPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjYiPmtjYXMgYW5kIGtjYXNfZGF0YSAwLjIuNCBmb3IgbG9jay1mcmVlIGNv bmN1cnJlbnQgcHJvZ3JhbW1pbmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1rY2FzLWFuZC1rY2FzLWRhdGEtMC0yLTQtZm9yLWxvY2stZnJlZS1jb25jdXJyZW50 LXByb2dyYW1taW5nLzExOTA3LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1r Y2FzLWFuZC1rY2FzLWRhdGEtMC0yLTQtZm9yLWxvY2stZnJlZS1jb25jdXJyZW50LXByb2dyYW1t aW5nLzExOTA3LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2E0ZmZiOWEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdhNGZmYjlhIj5WZXNh IEthcnZvbmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnYTRmZmI5YSI+DQo8cD5J4oCZbSBoYXBweSB0byBhbm5vdW5jZSB0aGF0IHRoZSA8 YSBocmVmPSJodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL2tjYXMvIj4NCjxjb2RlPmtj YXM8L2NvZGU+PC9hPiBwYWNrYWdlIG5vdyBoYXMgYSA8YSBocmVmPSJodHRwczovL29wYW0ub2Nh bWwub3JnL3BhY2thZ2VzL2tjYXNfZGF0YS8iPg0KPGNvZGU+a2Nhc19kYXRhPC9jb2RlPjwvYT4g Y29tcGFuaW9uIHBhY2thZ2UgdGhhdCBwcm92aWRlcyBpbXBsZW1lbnRhdGlvbnMgb2YgY29tcG9z aXRpb25hbCBsb2NrLWZyZWUgZGF0YSBzdHJ1Y3R1cmVzIGltcGxlbWVudGVkIHVzaW5nDQo8Y29k ZT5rY2FzPC9jb2RlPi4gPC9wPg0KPHA+V2hhdCBpcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwtbXVsdGljb3JlL2tjYXMvI3JlYWRtZSI+PGNvZGU+a2NhczwvY29kZT48L2E+Pw0K PC9wPg0KPGJsb2NrcXVvdGU+DQo8cD48Yj5rY2FzPC9iPiBwcm92aWRlcyBhbiBpbXBsZW1lbnRh dGlvbiBvZiBhdG9taWMgbG9jay1mcmVlIG11bHRpLXdvcmQgY29tcGFyZS1hbmQtc2V0IChNQ0FT KSwgd2hpY2ggaXMgYSBwb3dlcmZ1bCB0b29sIGZvciBkZXNpZ25pbmcgY29uY3VycmVudCBhbGdv cml0aG1zLg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+T24gdG9wIG9mIHRoZSBlZmZpY2llbnQg bXVsdGktd29yZCBjb21wYXJlLWFuZC1zZXQgYWxnb3JpdGhtLCA8Y29kZT5rY2FzPC9jb2RlPiBw cm92aWRlcyBjb21wb3NpdGlvbmFsIHRyYW5zYWN0aW9uYWwgcHJvZ3JhbW1pbmcgaW50ZXJmYWNl cyB0aGF0IGNhbiBtYWtlIGl0IG11Y2ggZWFzaWVyIHRvIGltcGxlbWVudCBjb25jdXJyZW50IGFs Z29yaXRobXMuDQo8L3A+DQo8cD5UaGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUgbmV3IDxhIGhyZWY9 Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9rY2FzLzAuMi40L2tjYXNfZGF0YS9L Y2FzX2RhdGEvaW5kZXguaHRtbCI+DQo8Y29kZT5rY2FzX2RhdGE8L2NvZGU+PC9hPiBwYWNrYWdl IGluY2x1ZGVzIGRvbWFpbiBzYWZlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdp dGh1Yi5pby9rY2FzLzAuMi40L2tjYXNfZGF0YS9LY2FzX2RhdGEvSGFzaHRibC9pbmRleC5odG1s Ij4NCjxjb2RlPkhhc2h0Ymw8L2NvZGU+PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1tdWx0 aWNvcmUuZ2l0aHViLmlvL2tjYXMvMC4yLjQva2Nhc19kYXRhL0tjYXNfZGF0YS9RdWV1ZS9pbmRl eC5odG1sIj4NCjxjb2RlPlF1ZXVlPC9jb2RlPjwvYT4sIGFuZCA8YSBocmVmPSJodHRwczovL29j YW1sLW11bHRpY29yZS5naXRodWIuaW8va2Nhcy8wLjIuNC9rY2FzX2RhdGEvS2Nhc19kYXRhL1N0 YWNrL2luZGV4Lmh0bWwiPg0KPGNvZGU+U3RhY2s8L2NvZGU+PC9hPiBkYXRhIHN0cnVjdHVyZXMg dGhhdCBhbGwgbWltaWMgdGhlIGNvcnJlc3BvbmRpbmcgPGNvZGU+U3RkbGliPC9jb2RlPiBtb2R1 bGUgaW50ZXJmYWNlcyBhbmQgY2FuIGJlIG1vcmUgb3IgbGVzcyBiZSB1c2VkIGFzIGRyb3AtaW4g cmVwbGFjZW1lbnRzDQo8Yj53aGVuIGRvbWFpbiBzYWZldHkgaXMgbmVlZGVkPC9iPi4gPC9wPg0K PHA+VGhlIDxjb2RlPmtjYXNfZGF0YTwvY29kZT4gZGF0YSBzdHJ1Y3R1cmVzIGFsc28gcHJvdmlk ZSB0cmFuc2FjdGlvbmFsIGludGVyZmFjZXMgdGhhdCBhbGxvdyBvbmUgdG8gY29tcG9zZSBuZXcg bG9jay1mcmVlIG9wZXJhdGlvbnMgd2l0aCBhbnkgb3RoZXINCjxjb2RlPmtjYXM8L2NvZGU+IGJh c2VkIHRyYW5zYWN0aW9ucy4gRm9yIGV4YW1wbGUsIGdpdmVuIGEgPGNvZGU+cXVldWU8L2NvZGU+ IGFuZCBhDQo8Y29kZT5zdGFjazwvY29kZT4gb25lIGNhbiBhdG9taWNhbGx5IHRha2UgYW4gZWxl bWVudCBmcm9tIHRoZSA8Y29kZT5xdWV1ZTwvY29kZT4gYW5kIHB1c2ggaXQgdG8gdGhlDQo8Y29k ZT5zdGFjazwvY29kZT4gdXNpbmcgYSB0cmFuc2FjdGlvbiB3cml0dGVuIGluIGRpcmVjdCBzdHls ZSB2aWEgZXhwbGljaXQgdHJhbnNhY3Rpb24gbG9nIHBhc3NpbmcgYXMgZm9sbG93czoNCjwvcD4N CjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2Nh bWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnR4PC9zcGFuPiB+PHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA3YTlmOyI+eHQ8L3NwYW4+ID0NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPm1hdGNoPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5RdWV1ZS5YdC48L3NwYW4+dGFrZV9vcHQgfnh0IHF1ZXVlIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij53aXRoPC9zcGFuPg0KICB8 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsi Pk5vbmU8L3NwYW4+IC0mZ3Q7ICgpDQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+U29tZTwvc3Bhbj4gdmFsdWUgLSZndDsNCiAgICA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5TdGFjay5YdC48L3NwYW4+cHVzaCB+eHQgc3Rh Y2sgdmFsdWUNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7 Ij5pbjwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlh0Ljwvc3Bhbj5jb21t aXQgeyB0eCB9DQo8L3ByZT4NCjwvZGl2Pg0KPHA+QXNpZGUgZnJvbSBvZmZlcmluZyBjb21wb3Nh YmlsaXR5LCB0aGUgcHJvdmlkZWQgZGF0YSBzdHJ1Y3R1cmVzIHNob3VsZCBnaXZlIGdvb2QgcGVy Zm9ybWFuY2UgYW5kIHNjYWxhYmlsaXR5IGNvbXBhcmVkIHRvIHByb3RlY3RpbmcgYWxsIGFjY2Vz c2VzIG9mIHVuc3luY2hyb25pemVkDQo8Y29kZT5TdGRsaWI8L2NvZGU+IGRhdGEgc3RydWN0dXJl cyB1c2luZyBsb2Nrcy4gPC9wPg0KPHA+RmVlbCBmcmVlIHRvIGdpdmUgdGhlIG5ldyA8Y29kZT5r Y2FzX2RhdGE8L2NvZGU+IHBhY2thZ2UgYSBzcGluISA8L3A+DQo8cD5JIHdvdWxkIGFsc28gbGlr ZSB0byBlbmNvdXJhZ2UgcGVvcGxlIHRvIHRyeSBhbmQgaW1wbGVtZW50IG1vcmUgY29tcG9zaXRp b25hbCBsb2NrLWZyZWUgZGF0YSBzdHJ1Y3R1cmVzIHVzaW5nDQo8Y29kZT5rY2FzPC9jb2RlPi4g SXQgaXMgZmFpcmx5IHN0cmFpZ2h0Zm9yd2FyZCB0byB0cmFuc2xhdGUgdGV4dGJvb2sgaW1wZXJh dGl2ZSBkYXRhIHN0cnVjdHVyZXMgdXNpbmcNCjxjb2RlPmtjYXM8L2NvZGU+IHRvIG1ha2UgdGhl bSBkb21haW4gc2FmZSBhbmQgbG9jay1mcmVlIGFuZCB0aGUgcHJvamVjdCA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2tjYXMvdHJlZS8wLjIuNCNyZWFkbWUiPg0K UkVBRE1FPC9hPiBjb21lcyB3aXRoIG1hbnkgZXhhbXBsZXMuIDwvcD4NCjxwPk5vdGUgdGhhdCB3 aGlsZSB0aGUgPGNvZGU+a2Nhc19kYXRhPC9jb2RlPiBwYWNrYWdlIGlzIGN1cnJlbnRseSBpbiB0 aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9rY2FzIj4NCjxj b2RlPmtjYXM8L2NvZGU+PC9hPiByZXBvc2l0b3J5LCBpdCBtaWdodCBsYXRlciBiZSBtb3ZlZCB0 byBiZSBhIHBhcnQgb2YgdGhlIHJlcG9zaXRvcnkgdGhhdCBpcyBjdXJyZW50bHkgY2FsbGVkDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2xvY2tmcmVlL3B1bGwv NjciPjxjb2RlPmxvY2tmcmVlPC9jb2RlPjwvYT4uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNyI+TG93LWhhbmdpbmcgZnJ1aXQgZm9yIGEgUFIgY29udHJpYnV0aW9uIHRvIHRoZSBP Q2FtbCBydW50aW1lIGNvZGUgKEMgY29kZSk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2xvdy1oYW5naW5nLWZydWl0LWZvci1hLXByLWNvbnRyaWJ1dGlvbi10by10aGUt b2NhbWwtcnVudGltZS1jb2RlLWMtY29kZS8xMTkxNC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9sb3ctaGFuZ2luZy1mcnVpdC1mb3ItYS1wci1jb250cmlidXRpb24tdG8tdGhlLW9j YW1sLXJ1bnRpbWUtY29kZS1jLWNvZGUvMTE5MTQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnNzUyN2UzNyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzc1MjdlMzciPmdhc2NoZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzc1MjdlMzciPg0KPHA+SeKAmW0gdGhlIHNoZXBoZXJkIGZv ciB0aGUgdXBzdHJlYW0gY29tcGlsZXIgaXNzdWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMjAzNyI+DQpodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEyMDM3PC9hPiAsIHdoaWNoIGlzIGFib3V0IGEgcG90ZW50aWFsIGNvZGUgaW1w cm92ZW1lbnQgbm90aWNlZCBieQ0KPGNvZGU+Z2NjIC1mYW5hbHl6ZXI8L2NvZGU+LiBUaGUgaXNz dWUgaGFzIHNvbWV3aGF0LWRldGFpbGVkIGV4cGxhbmF0aW9ucyBvZiB3aGF0IGNvdWxkIGJlIGRv bmUgdG8gc29sdmUgaXQgbmljZWx5Lg0KPC9wPg0KPHA+SWYgeW91IGhhdmUgYmVlbiBsb29raW5n IGZvciBhbiBvcHBvcnR1bml0eSB0byBjb250cmlidXRlIHRvIHRoZSB1cHN0cmVhbSBPQ2FtbCBj b21waWxlciwgdGhpcyBtYXkgYmUgb25lLiBUaGlzIGlzIGluIHRoZSBydW50aW1lIGNvZGUsIGlt cGxlbWVudGVkIGluIEMsIGFuZA0KPGNvZGU+ZXh0ZXJuLmM8L2NvZGU+IGlzIHRoZSBtYXJzaGFs bGVyICh3aGF0IHJ1bnMgd2hlbiB5b3UgdXNlIDxjb2RlPm91dHB1dF92YWx1ZTwvY29kZT4gb3IN Cjxjb2RlPk1hcmhzYWwudG9fc3RyaW5nPC9jb2RlPikuIDwvcD4NCjxwPkFzc3VtaW5nIHlvdSBh cmUgYWxyZWFkeSBmYW1pbGlhciB3aXRoIEMgYW5kIHR5cGljYWwgZ2l0JiM0MztnaXRodWIgd29y a2Zsb3dzLCBidXQgaGF2ZSBuZXZlciBjb250cmlidXRlZCB0byB0aGUgT0NhbWwgY29tcGlsZXIg Y29kZWJhc2UsIGhlcmUgd291bGQgYmUgYSB0aW1lIGVzdGltYXRlOg0KPC9wPg0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPjFoIHRvIGdldCBmYW1pbGlhciB3aXRoIHRoZSBnaXRodWIvb2NhbWwg cmVwb3NpdG9yeSAoY2xvbmUgaXQsIGNvbmZpZ3VyZSBpdCwgYnVpbGQgaXQsIGV0Yy47IEkgYW0g YXNzdW1pbmcgdGhhdCB5b3UgYXJlIG5vdCB0cnlpbmcgdG8gcHJvZ3JhbSBmcm9tIGEgV2luZG93 cyBtYWNoaW5lLCB3aGljaCBtYXkgYmUgaGFyZGVyKSwgd2hpY2ggaW5jbHVkZXMgc2tpbW1pbmcN CjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL3RydW5rL0NPTlRS SUJVVElORy5tZCI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Jsb2IvdHJ1bmsvQ09O VFJJQlVUSU5HLm1kPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9ibG9iL3RydW5rL0hBQ0tJTkcuYWRvYyI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2Jsb2IvdHJ1bmsvSEFDS0lORy5hZG9jPC9hPg0KPC9saT48bGk+MWgtMmggdG8gd3JpdGUg YW4gaW5pdGlhbCBwYXRjaCB0aGF0IHlvdSBhcmUgaGFwcHkgd2l0aCBhbmQgc2VuZCBhIFBSIDwv bGk+PGxpPjFoLTNoIG9mIGFkZHJlc3NpbmcgQ0kgaXNzdWVzIGFuZCByZXZpZXcgY29tbWVudHMg PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPldlZCwgQXByIDEyIEAgN3Bt IFUuUy4gQ2VudHJhbDogSm9uYWggQmVja2ZvcmQgb24g4oCcV2hhdCBkaXN0cmlidXRpbmcgT0Nh bWwgb24gV2luZG93cyBnYXZlIG1lIChhbmQgeW91KeKAnTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvd2VkLWFwci0xMi03cG0tdS1zLWNlbnRyYWwtam9uYWgtYmVja2Zv cmQtb24td2hhdC1kaXN0cmlidXRpbmctb2NhbWwtb24td2luZG93cy1nYXZlLW1lLWFuZC15b3Uv MTE5MjYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2VkLWFwci0xMi03cG0tdS1z LWNlbnRyYWwtam9uYWgtYmVja2ZvcmQtb24td2hhdC1kaXN0cmlidXRpbmctb2NhbWwtb24td2lu ZG93cy1nYXZlLW1lLWFuZC15b3UvMTE5MjYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnMjA0NTYxNCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzIwNDU2MTQiPkNsYXVkZSBKYWdlci1SdWJpbnNvbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzIwNDU2MTQiPg0KPHA+UGxlYXNlIGpv aW4gdGhlIEhvdXN0b24gRnVuY3Rpb25hbCBQcm9ncmFtbWluZyBVc2VyIEdyb3VwIG5leHQgV2Vk bmVzZGF5LCBBcHJpbCAxOSBhdCA3cG0gVS5TLiBDZW50cmFsIHRpbWUgKG1pZG5pZ2h0IFVUQykg d2hlbiBKb25haCBCZWNrZm9yZCAoQGpiZWNrZm9yZCkgd2lsbCBkaXNjdXNzIGhpcyB3b3JrIG9u IGRldmVsb3BpbmcgRGlza3V2IE9DYW1sIChEa01MKS4NCjwvcD4NCjxwPkFzIGV2ZXJ5Ym9keSB3 aG/igJlzIGJlZW4gZm9sbG93aW5nIERrTUzigJlzIGRldmVsb3BtZW50IGlzIGF3YXJlLCBKb25h aOKAmXMgd29yayBvbiBicmluZ2luZyBPQ2FtbCBhbmQgaXTigJlzIHRvb2xjaGFpbiB0byBXaW5k b3dzIGlzIGluY3JlZGlibHkgaW1wcmVzc2l2ZS4gSW4gdGhpcyB0YWxrLCBoZeKAmWxsIGRpc2N1 c3Mgd2h5IGhlIGRlY2lkZWQgdXBvbiB0aGlzIHBhdGgsIHRoZSBjaGFsbGVuZ2VzIHRoYXQgaGUg ZmFjZWQgYW5kIGhvdyBoZSBvdmVyY2FtZQ0KIHRoZW0sIGFuZCBoaXMgb25nb2luZyBhbmQgZnV0 dXJlIHdvcmssIGluY2x1ZGluZyB0aGUgT0NhbWwgU0RLIHRoYXQgaGUgd2lsbCByZWxlYXNlIHRo aXMgeWVhci4NCjwvcD4NCjxwPklmIHlvdeKAmXJlIGluIHRoZSBIb3VzdG9uIGFyZWEsIHlvdSBj YW4gam9pbiB1cyBpbiBwZXJzb24uIE90aGVyd2lzZSwgcGxlYXNlIGpvaW4gdXMgdmlhIFpvb20u IENvbXBldGUgZGV0YWlscywgaW5jbHVkaW5nIGhpcyBhYnN0cmFjdCBhbmQgWm9vbSBjb25uZWN0 aW9uIGluZm8gYXJlIGF2YWlsYWJsZSBvbiBvdXIgd2Vic2l0ZSBhdA0KPGEgaHJlZj0iaHR0cHM6 Ly9oZnB1Zy5vcmciPmh0dHBzOi8vaGZwdWcub3JnPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjkiPnpiZzogWmVybyBCdWxsc2hpdCBHaXQ8L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi16YmctemVyby1idWxsc2hpdC1naXQvMTE5MjkvMSI+DQpo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXpiZy16ZXJvLWJ1bGxzaGl0LWdpdC8xMTky OS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzRhOTZk MGUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0YTk2ZDBlIj5EbWl0cmlpIEtvdmFu aWtvdiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0 LW9yZzRhOTZkMGUiPg0KPHA+R29vZCBtb3JuaW5nIGV2ZXJ5b25lISA6c3VucmlzZTogPC9wPg0K PHA+SeKAmXZlIHN0YXJ0ZWQgbGVhcm5pbmcgT0NhbWwgb25seSByZWNlbnRseSwgYW5kIEkgd291 bGQgbGlrZSB0byBzaGFyZSBteSBPU1MgcHJvamVjdCB3aXRoIGV2ZXJ5b25lOg0KPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9jaHNoZXJz aC96YmciPjpzcGFya2xlczogPGNvZGU+emJnPC9jb2RlPiDigJQgWmVybyBCdWxsc2hpdCBHaXQ8 L2E+DQo8L2xpPjwvdWw+DQo8cD5J4oCZdmUgYmVlbiB1c2luZyA8Y29kZT5naXQ8L2NvZGU+IGZv ciBtYW55IHllYXJzLCBhbmQgSSBjYW1lIHVwIHdpdGggYSB3b3JrZmxvdyB0aGF0IHdvcmtzIHBl cmZlY3RseSBmb3IgbWUgYnV0IGl0IHdhcyB0ZWRpb3VzIHRvIHR5cGUgYWxsIHRoZSBjb21tYW5k cyBtYW51YWxseSwgYW5kDQo8Y29kZT4uZ2l0Y29uZmlnPC9jb2RlPiBhbGlhc2VzIHdlcmVu4oCZ dCBwb3dlcmZ1bCBlbm91Z2guIFNvIEkgZGVjaWRlZCB0byBwYWNrYWdlIG15IHdvcmtmbG93IGlu dG8gYSBDTEkgdG9vbC4gSSBhbHNvIGFkZGVkIHByZXR0aWVyIHZlcnNpb25zIG9mIHNvbWUgY29t bWFuZHMuIE1heWJlIHlvdeKAmWxsIGVuam95IHRoZW0gdG9vIDpodWdzOg0KPC9wPg0KPHA+SSBz dGFydGVkIGxlYXJuaW5nIE9DYW1sIG9ubHkgcmVjZW50bHk7IHRoaXMgaXMgbXkgZmlyc3QgT1NT IHByb2plY3Qgd2l0aCBPQ2FtbC4gQmVmb3JlIHRoYXQsIEkgd2FzIG1vc3RseSB1c2luZyBIYXNr ZWxsIGZvciB0aGUgbGFzdCA3IHllYXJzLiBTdGlsbCwgSSB3b3VsZCBncmVhdGx5IGFwcHJlY2lh dGUgc3VnZ2VzdGlvbnMgb24gaW1wcm92aW5nIHRoZSBjb2RlLCBtYWtpbmcgaXQgbW9yZSBpZGlv bWF0aWMsIHV0aWxpemluZyBPQ2FtbA0KIHRvb2xpbmcsIGFuZCBldmVyeXRoaW5nIGVsc2UuIEZl ZWRiYWNrIGlzIHdlbGNvbWUhIDwvcD4NCjxwPlRoZXJl4oCZcyBzdGlsbCBzb21lIHdvcmsgdG8g YmUgZG9uZSBpbiA8Y29kZT56Ymc8L2NvZGU+LCBzbyBpZiB5b3Ugd2FudCB0byBoYXZlIGZ1biBh bmQgam9pbiB0aGUgZGV2ZWxvcG1lbnQsIGhhdmUgYSBsb29rIGF0DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vY2hzaGVyc2gvemJnL2lzc3VlcyI+b3BlbiBpc3N1ZXM8L2E+LiA8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyZDYy OGMxIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0ib3JnMmQ2MjhjMSI+T2xkIENXTjwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtb3JnMmQ2MjhjMSI+DQo8cD5J ZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4u c2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEni gJlsbCBtYWlsIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEg aHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQg b2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwvcD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2 ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6 Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGluZm8vY2FtbC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9h Pi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0aG9ybmFtZSIgaWQ9Im9yZzViMzczNDciPg0KPHA+PGEg aHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 4 Apr 2023 09:46:04 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 4 Apr 2023 09:46:04 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 4 Apr 2023 09:46:04 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3348jIqa006266 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 4 Apr 2023 09:45:18 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3348j9rf006249 for ; Tue, 4 Apr 2023 09:45:09 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Apr 2023 10:45:08 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 293E2E0275; Tue, 4 Apr 2023 10:45:08 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B8808E00CE for ; Tue, 4 Apr 2023 10:45:05 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Apr 2023 10:45:04 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A41555605E8; Tue, 4 Apr 2023 10:45:03 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZZtHk6BEn1MOTk0GoKZ2Qd7T4oA== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 4 Apr 2023 09:45:03 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 8a718de1-9aff-4e66-4d55-08db34e9066a X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,317,1673910000"; d="scan'208,217";a="100599935" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.497906, queueID=156DD5605EA x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wNC0wNCBUdWUgMTA6MzcgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDMuMjguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNC4xMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1hcmNoIDI4IHRvIEFwcmlsIDA0LCAyMDIz Lg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgy PlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMi IHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5PQ2FtbC1jc3MgMC4xLjA8 L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMyIj5Cb2d1ZSB0dXRvcmlhbHMgMC4xLjA8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiMzIj5FbWJlZGRlZCBPY2FtbCBUZW1wbGF0ZXMgMC44PC9hPiA8L2xpPjxs aT48YSBocmVmPSIjNCI+QXZhaWxhYmxlIGZvciBIaXJlIC0gUTImIzQzOzMmIzQzOzQgMjAyMzwv YT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPkZvcm1hdCBzdHJpbmdzIGFuZCB0aGUgT0NhbWwgY29t cGlsZXIgZXJyb3IgbWVzc2FnZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5PdGhlciBPQ2Ft bCBOZXdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnZDFlNGJhMyI+T2xkIENXTjwvYT4gPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNs YXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5PQ2FtbC1jc3MgMC4xLjA8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1jc3MtMC0xLTAvMTE4MDkvMSI+ aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1jc3MtMC0xLTAvMTE4MDkvMTwv YT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYzE2YmUzOCIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2MxNmJlMzgiPlpvZ2d5IGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYzE2YmUzOCI+DQo8 cD5J4oCZbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIDxhIGhyZWY9 Imh0dHBzOi8vem9nZ3kuZnJhbWEuaW8vb2NhbWwtY3NzLyI+DQpPQ2FtbC1jc3M8L2E+LCBhIGxp YnJhcnkgdG8gcGFyc2UgYW5kIHByaW50IENTUy4gSXQgY2FuIGFsc28gZXhwYW5kIG5hbWVzcGFj ZXMgYW5kIHBlcmZvcm0gY29tcHV0YXRpb25zIG9uIHByb3BlcnR5IHZhbHVlcy4NCjwvcD4NCjxw PlBhcnNpbmcgdXNlcyA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vaW5oYWJpdGVkdHlwZS9h bmdzdHJvbS8iPkFuZ3N0cm9tPC9hPiB0byBkeW5hbWljYWxseSBjaG9vc2UgdGhlIHBhcnNlciB3 aGVuIGVuY291bnRlcmluZyBhIHByb3BlcnR5IGRlY2xhcmF0aW9uLiBOb3QgYWxsIHByb3BlcnRp ZXMgYXJlIGhhbmRsZWQgeWV0IGJ1dCB0aGUgcGFyc2VyIGNhbiBiZSBleHRlbmRlZCBieSBkZWZp bmluZyBhZGRpdGlvbmFsIHByb3BlcnRpZXMuDQogU29tZSBzaG9ydGhhbmQgcHJvcGVydGllcyBh cmUgaGFuZGxlZCB0b28uIFNvbWUgfkBydWxlfnMgYXJlIG5vdCBoYW5kbGVkIGJ5IG5vdywgdGhl eSBhcmUgcGFyc2VkIGFuZCByZXR1cm5lZCBhcyBzdHJpbmdzLCB3aXRoIGEgd2FybmluZyBpbiBs b2cuDQo8L3A+DQo8cD5UaGUgPGNvZGU+Y3NzPC9jb2RlPiBwYWNrYWdlIHNob3VsZCBiZSBhdmFp bGFibGUgc29vbiBpbiBvcGFtLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+Qm9n dWUgdHV0b3JpYWxzIDAuMS4wPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tYm9ndWUtdHV0b3JpYWxzLTAtMS0wLzExODE2LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1ib2d1ZS10dXRvcmlhbHMtMC0xLTAvMTE4MTYvMTwvYT4gPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxOGY3ZDUwIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMThmN2Q1MCI+c2FuZXR0ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzE4ZjdkNTAiPg0KPHA+SGksIEnigJlt IHBsZWFzZWQgdG8gYW5ub3VuY2UgYW4gb25nb2luZyBzZXJpZXMgb2YgdHV0b3JpYWxzIGZvciA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2FuZXR0ZS9ib2d1ZSI+DQpCb2d1ZTwvYT4gKHRo ZSBEZXNrdG9wIEdVSSBsaWJyYXJ5IGZvciBPQ2FtbCk6IDwvcD4NCjxwPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9zYW5ldHRlL2JvZ3VlLXR1dG9yaWFscyI+aHR0cHM6Ly9naXRodWIuY29t L3NhbmV0dGUvYm9ndWUtdHV0b3JpYWxzPC9hPg0KPC9wPg0KPHA+U28gZmFyIG9ubHkgdGhyZWUg YXJlIHdyaXR0ZW46IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRw czovL3NhbmV0dGUuZ2l0aHViLmlvL2JvZ3VlLXR1dG9yaWFscy9ib2d1ZS10dXRvcmlhbHMvaGVs bG8uaHRtbCI+SGVsbG8gd29ybGQ8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3NhbmV0 dGUuZ2l0aHViLmlvL2JvZ3VlLXR1dG9yaWFscy9ib2d1ZS10dXRvcmlhbHMvY291bnRlci5odG1s Ij5BIHNpbXBsZSBjb3VudGVyPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9zYW5ldHRl LmdpdGh1Yi5pby9ib2d1ZS10dXRvcmlhbHMvYm9ndWUtdHV0b3JpYWxzL21vZGlmX3BhcmVudC5o dG1sIj5TZWxmLW1vZGlmeWluZyBsYXlvdXRzPC9hPg0KPC9saT48L3VsPg0KPHA+TW9yZSB3aWxs IGNvbWUgd2hlbiB0aW1lIHBlcm1pdHMhIDwvcD4NCjxwPkVhY2ggdHV0b3JpYWwgaW5jbHVkZXMg Y29kZSB0aGF0IGNhbiBlaXRoZXIgYmUgcGFzdGVkIG9udG8gYSB0b3BsZXZlbCwgb3IgYXV0b21h dGljYWxseSBleGVjdXRlZCAodGhlIGV4ZWN1dGFibGVzIGFyZSBzaGlwcGVkIGluIHRoZQ0KPGNv ZGU+b2NhbWwtdHV0b3JpYWxzPC9jb2RlPiBvcGFtIHBhY2thZ2UuIDwvcD4NCjxwPkZlZWRiYWNr IGFwcHJlY2lhdGVkISAoaG9wZWZ1bGx5IGNvbnN0cnVjdGl2ZSA7KSApIDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTMiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSIzIj5FbWJlZGRlZCBPY2FtbCBUZW1wbGF0ZXMgMC44PC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZW1iZWRkZWQtb2NhbWwtdGVtcGxh dGVzLTAtOC8xMTg0OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZW1iZWRk ZWQtb2NhbWwtdGVtcGxhdGVzLTAtOC8xMTg0OC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2Q1ZTI5NDQiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmdkNWUyOTQ0Ij5FbWlsZSBUcm90aWdub24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkNWUyOTQ0Ij4NCjxwPkkgYW0gcXVpdGUgaGFw cHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRU1MIDAuOC4gRU1MIGlzIGEgc2ltcGxlIHRl bXBsYXRpbmcgbGFuZ3VhZ2UgdGhhdCBsZXRzIHlvdSBnZW5lcmF0ZSB0ZXh0IHdpdGggcGxhaW4g T0NhbWwuIEl0IGlzIGFuYWxvZ291cyB0byB0aGUgd2F5IHlvdSB3b3VsZCB3cml0ZSBQSFAgcGFn ZXMsIGJ1dCB0aGUgbGFuZ3VhZ2UgYmVpbmcgT2NhbWwgaW5zdGVhZC4NCjwvcD4NCjxwPlRoZXJl IGFyZSB0d28gd2F5cyBvZiB1c2luZyBpdCwgdGhlIGZpcnN0IG9uZSBpcyBpbiBhIHN0YW5kYWxv bmUgZmlsZSwgZm9yIGluc3RhbmNlDQo8Y29kZT5yZXN1bWUuZW1sLnRleDwvY29kZT4gOiA8L3A+ DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnMGQ4YjE5MSI+DQombHQ7JSMgZmlyc3RuYW1l IGxhc3RuYW1lIGVtYWlsIGJpcnRoZGF0ZSBwaG9uZW51bWJlciBmb3JtYXRpb25zICUmZ3Q7DQpc ZG9jdW1lbnRjbGFzc1sxMHB0LCBhNHBhcGVyLCByb21hbiwgZnJlbmNoXXttb2Rlcm5jdn0NClx1 c2VwYWNrYWdle2JhYmVsfQ0KXGZpcnN0bmFtZXsgJmx0OyUtZmlyc3RuYW1lJSZndDsgfQ0KXGZh bWlseW5hbWV7ICZsdDslLWxhc3RuYW1lJSZndDsgfQ0KXG1vYmlsZXsmbHQ7JS0gcGhvbmVudW1i ZXIlJmd0O30NClxleHRyYWluZm97Qm9ybiAmbHQ7JS1iaXJ0aGRhdGUlJmd0OyB9DQpcZW1haWx7 ICZsdDslLWVtYWlsJSZndDsgfQ0KXGJlZ2lue2RvY3VtZW50fQ0KCVxtYWtlY3Z0aXRsZQ0KCVxz ZWN0aW9ue0Zvcm1hdGlvbn0NCgkgJmx0OyUgTGlzdC5pdGVyaSAoZnVuIGkgKGRhdGVfc3RhcnQs IGRhdGVfZW5kLCBkaXBsb21hLCBzY2hvb2wpIC0mZ3Q7JSZndDsNCgkJXGN2ZW50cnl7ICZsdDsl aS0gaSAlJmd0OyAmbHQ7JS1kYXRlX3N0YXJ0JSZndDsgLS0gJmx0OyUtZGF0ZV9lbmQlJmd0O317 Jmx0OyUtZGlwbG9tYSUmZ3Q7fXsmbHQ7JS1zY2hvb2wlJmd0O317fXt9e30NCgkgJmx0OyUpIGZv cm1hdGlvbnMgOyUmZ3Q7DQpcZW5ke2RvY3VtZW50fQ0KPC9wcmU+DQo8cD5UaGVyZSBpcyBhbHNv IHN1cHBvcnQgZm9yIGNvbXBpbGluZyBhIHdob2xlIHJlY3Vyc2l2ZSBkaXJlY3Rvcnkgb2YgdGVt cGxhdGluZyBmaWxlcyB3aXRoIGEgc2luZ2xlIGR1bmUgcnVsZS4NCjwvcD4NCjxwPlRoZSBvdGhl ciBvbmUgd291bGQgYmUgaW4gT0NhbWwgY29kZSB3aXRoIGEgUFBYIDogPC9wPg0KPGRpdiBjbGFz cz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFmOyI+cmVzdW1lPC9zcGFuPiAgPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA3YTlmOyI+Zmlyc3RuYW1lPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdh OWY7Ij5sYXN0bmFtZTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZW1haWw8 L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmJpcnRoZGF0ZTwvc3Bhbj4gPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cGhvbmVudW1iZXI8L3NwYW4+IDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwN2E5ZjsiPmZvcm1hdGlvbnM8L3NwYW4+ID0NCiAgezxzcGFuIHN0eWxlPSJj b2xvcjogI2E1MmEyYTsiPiU8L3NwYW4+ZW1sfA0KXGRvY3VtZW50Y2xhc3NbMTBwdCwgYTRwYXBl ciwgcm9tYW4sIGZyZW5jaF17bW9kZXJuY3Z9DQpcdXNlcGFja2FnZXtiYWJlbH0NClxmaXJzdG5h bWV7ICZsdDs8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lLTwvc3Bhbj5maXJzdG5hbWU8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj4gfQ0KXGZhbWlseW5hbWV7 ICZsdDs8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lLTwvc3Bhbj5sYXN0bmFtZTxzcGFu IHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiUmZ3Q7PC9zcGFuPiB9DQpcbW9iaWxleyZsdDs8c3Bh biBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lLTwvc3Bhbj4gcGhvbmVudW1iZXI8c3BhbiBzdHls ZT0iY29sb3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj59DQpcZXh0cmFpbmZvezxzcGFuIHN0eWxl PSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkJvcm48L3NwYW4+ ICZsdDs8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lLTwvc3Bhbj5iaXJ0aGRhdGU8c3Bh biBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj4gfQ0KXGVtYWlseyAmbHQ7PHNw YW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JS08L3NwYW4+ZW1haWw8c3BhbiBzdHlsZT0iY29s b3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj4gfQ0KXDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5iZWdpbjwvc3Bhbj57ZG9jdW1lbnR9DQogICAgXG1ha2Vj dnRpdGxlDQogICAgXHNlY3Rpb257PHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3Jv dW5kLWNvbG9yOiAjZmNmN2VmOyI+Rm9ybWF0aW9uPC9zcGFuPn0NCiAgICAgJmx0OzxzcGFuIHN0 eWxlPSJjb2xvcjogI2E1MmEyYTsiPiU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPkxpc3QuPC9zcGFuPml0ZXJpICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5p PC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZGF0ZV9zdGFydDwvc3Bhbj4s IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmRhdGVfZW5kPC9zcGFuPiwgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZGlwbG9tYTwvc3Bhbj4sIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwN2E5ZjsiPnNjaG9vbDwvc3Bhbj4pIC0mZ3Q7PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJh OyI+JSZndDs8L3NwYW4+DQogICAgICAgIFxjdmVudHJ5eyAmbHQ7PHNwYW4gc3R5bGU9ImNvbG9y OiAjYTUyYTJhOyI+JTwvc3Bhbj5pLSBpIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiUm Z3Q7PC9zcGFuPiAmbHQ7PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JS08L3NwYW4+ZGF0 ZV9zdGFydDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPiUmZ3Q7PC9zcGFuPiAtLSAmbHQ7 PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JS08L3NwYW4+ZGF0ZV9lbmQ8c3BhbiBzdHls ZT0iY29sb3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj59eyZsdDs8c3BhbiBzdHlsZT0iY29sb3I6 ICNhNTJhMmE7Ij4lLTwvc3Bhbj5kaXBsb21hPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+ JSZndDs8L3NwYW4+fXsmbHQ7PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JS08L3NwYW4+ c2Nob29sPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JSZndDs8L3NwYW4+fXt9e317fQ0K ICAgICAmbHQ7PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+JTwvc3Bhbj4gKSBmb3JtYXRp b25zIDs8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4lJmd0Ozwvc3Bhbj4NClw8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZW5kPC9zcGFuPntkb2N1 bWVudH0NCnx9DQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIHBweCBpcyBhbHNvIHN1aXRhYmxlIGZv ciBzaW1wbGUgc3RyaW5nIGludGVycG9sYXRpb24uIDwvcD4NCjxwPkEgc2ltaWxhciB0ZW1wbGF0 aW5nIGFuZCBob21vbnltb3VzIHRlbXBsYXRpbmcgZW5naW5lIGlzIHByZXNlbnQgaW4gdGhlIERy ZWFtIGZyYW1ld29yay4gRHJlYW0uRU1MIGhhcyBhIHNsaWdodGx5IGRpZmZlcmVudCBzeW50YXgs IG1pbmUgaXMgbGVzcyBnZWFyZWQgdG93YXJkIEhUTUwgYW5kIG1vcmUgc3VpdGFibGUgZm9yIGdl bmVyYWwgdGVtcGxhdGluZy4gRHJlYW0gYWxzbyBkb2VzIG5vdCBzdXBwb3J0IGNvbXBpbGluZyBt dWx0aXBsZSB0ZW1wbGF0ZXMNCiB3aXRoIGEgc2luZ2xlIGR1bmUgcnVsZS4gPC9wPg0KPHA+SW4g MC44LCB0aGUgbG9jYXRpb25zIGluIHRoZSBQUFggYXJlIGZpbmFsbHkgY29ycmVjdC4gVGhpcyBt ZWFucyB0aGF0IHR5cGUgZXJyb3JzIHdpbGwgc2hvdyB1cCBpbiB0aGVpciBjb3JyZWN0IHBsYWNl LCB3aGljaCBpcyB2ZXJ5IG5pY2UgKG9uY2UgYSBzbWFsbCBidWdmaXggaW4gbWVybGluIGlzIG1l cmdlZCAodGhlIGVycm9yIG1lc3NhZ2UgaXMgc3RpbGwgY29ycmVjdCkpLiBJIGFsc28gZ290IHJp ZCBvZiBhIGRlcGVuY3kgb24gTWVuaGlyLg0KPC9wPg0KPHA+SXQgaXMgYXZhaWxhYmxlIG9uIG9w YW0gYXMgdGhlIDxjb2RlPmVtYmVkZGVkX29jYW1sX3RlbXBsYXRlczwvY29kZT4gcGFja2FnZSwg YW5kIHRoZSBkb2MgaXMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9FbWlsZVRyb3RpZ25v bi9lbWJlZGRlZF9vY2FtbF90ZW1wbGF0ZXMvYmxvYi9tYXN0ZXIvUkVBRE1FLm1kIj4NCmhlcmU8 L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5BdmFpbGFibGUgZm9yIEhpcmUg LSBRMiYjNDM7MyYjNDM7NCAyMDIzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBp ZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hdmFpbGFibGUtZm9yLWhpcmUtcTItMy00LTIwMjMvMTE4NjcvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYXZhaWxhYmxlLWZvci1oaXJlLXEyLTMtNC0yMDIzLzExODY3LzE8 L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMWQ4MGNjMiIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzFkODBjYzIiPlNhYmluZSBTY2htYWx0eiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFk ODBjYzIiPg0KPHA+SGVyZeKAmXMgYSB0aHJlYWQgdG8gYW5ub3VuY2UgeW91ciBhdmFpbGFiaWxp dHkgYXMgYW4gT0NhbWwgZGV2ZWxvcGVyIGxvb2tpbmcgZm9yIGFuIE9DYW1sIGpvYi4gOnJvY2tl dDoNCjwvcD4NCjxwPkZyZWVsYW5jZXJzLCBjb250cmFjdG9ycyBhbmQgam9iLXNlZWtlcnMsIGRv IGFkdmVydGlzZSB5b3VyIHNlcnZpY2VzIGFuZCBleHBlcmllbmNlIGhlcmUuDQo8L3A+DQo8cD5T aW5jZSB0aGUgdm9sdW1lIG9uIHRoZXNlIHRocmVhZHMgaXMgc3RpbGwgZmFpcmx5IGxvdywgbGV0 4oCZcyBnbyB3aXRoIG9uZSB0aHJlYWQgZm9yIHRoZSByZXN0IG9mIDIwMjMgdGhhdCBJIHdpbGwg YnVtcCBldmVyeSBxdWFydGVyLg0KPC9wPg0KPHA+PGk+ZWRpdG9y4oCZcyBub3RlOiBwbGVhc2Ug Zm9sbG93IHRoZSBsaW5rIGFib3ZlIHRvIHNlZSB0aGUgcmVwbGllcyB0byB0aGlzIHRocmVhZC48 L2k+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+Rm9ybWF0IHN0cmluZ3MgYW5k IHRoZSBPQ2FtbCBjb21waWxlciBlcnJvciBtZXNzYWdlczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvZm9ybWF0LXN0cmluZ3MtYW5kLXRoZS1vY2FtbC1jb21waWxlci1l cnJvci1tZXNzYWdlcy8xMTg3MC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9mb3Jt YXQtc3RyaW5ncy1hbmQtdGhlLW9jYW1sLWNvbXBpbGVyLWVycm9yLW1lc3NhZ2VzLzExODcwLzE8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzdkMDJiZGYi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc3ZDAyYmRmIj5vY3RhY2hyb24gYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc3ZDAyYmRm Ij4NCjxwPkkgYW0gY3VycmVudGx5IHRyeWluZyBteSBoYW5kIGF0IHdyaXRpbmcgZG93biBteSB3 ZWVrbHkgYWN0aXZpdHkgb24gdGhlIE9DYW1sIGNvbXBpbGVyIGFzIGJsb2cgcG9zdCBvbiB0aGUg Q2FtYml1bSB0ZWFtIGJsb2c6DQo8L3A+DQo8cD48YSBocmVmPSJodHRwOi8vZ2FsbGl1bS5pbnJp YS5mci9ibG9nL2Zsb3JpYW4td2Vla2x5LTIwMjMtMDQtMDMiPmh0dHA6Ly9nYWxsaXVtLmlucmlh LmZyL2Jsb2cvZmxvcmlhbi13ZWVrbHktMjAyMy0wNC0wMzwvYT4NCjwvcD4NCjxwPlRoaXMgd2Vl ayB0aGUgbWFpbiBhbmQgb25seSB0b3BpY3MgaXMgc29tZSBvbmdvaW5nIHdvcmsgb24gbWluZSBv biBhbiBhbHRlcm5hdGl2ZSBoYW5kbGluZyBmb3IgcGFydGlhbCBlcnJvciBtZXNzYWdlcyBpbiB0 aGUgY29tcGlsZXIuIFRoZSBtZWRpdW0tdGVybSBvYmplY3RpdmUgaXMgdG8gbW92ZSBzbG93bHkg dG93YXJkcyBtYWNoaW5lLXJlYWRhYmxlIGVycm9yIG1lc3NhZ2UgYnkgbWFraW5nIHRoYXQgYWxs IHRoZSB0eXBlIHVzZWQgaW4NCiBlcnJvciByZXBvcnQgaW50ZXJuYWxseSBpbiB0aGUgY29tcGls ZXIgYXJlIHNlcmlhbGl6YWJsZS4gVGhpcyBoYXMgbGVhZCB0b3dhcmRzIGEgZnVuIHBhdGggb2Yg aW1wbGVtZW50aW5nIGFuIGFsdGVybmF0aXZlIGZvcm1hdCBzdHJpbmcgaW50ZXJwcmV0ZXIgdGhh dCB5b3UgY2FuIHNlZSBpbiBhY3Rpb24gYXQNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9P Y3RhY2hyb24vZm9ybWF0LWRvYyI+aHR0cHM6Ly9naXRodWIuY29tL09jdGFjaHJvbi9mb3JtYXQt ZG9jPC9hPiAuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+T3RoZXIgT0NhbWwg TmV3czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+PC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1YTMwNThmIiBjbGFzcz0ib3V0bGluZS0z Ij4NCjxoMyBpZD0ib3JnNWEzMDU4ZiI+RnJvbSB0aGUgb2NhbWwub3JnIGJsb2c8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVhMzA1OGYiPg0KPHA+SGVyZSBh cmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgPGEgaHJlZj0iaHR0 cHM6Ly9vY2FtbC5vcmcvYmxvZy8iPg0KdGhlIG9jYW1sLm9yZyBibG9nPC9hPi4gPC9wPg0KPHVs IGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8y MDIzLTAzLTIyLWNvbXBpbGVyLWhhY2tpbmctaW4tY2FtYnJpZGdlLWlzLWJhY2siPkNvbXBpbGVy IEhhY2tpbmcgaW4gQ2FtYnJpZGdlIGlzIEJhY2shPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDMtMDgtbW9yZS10aGFuLWEtZGF5LWhvdy1kb2Vz LXRhcmlkZXMtcHJvbW90ZS13b21lbi1pbi10ZWNoIj5Nb3JlIFRoYW4gYSBEYXk6IEhvdyBEb2Vz IFRhcmlkZXMgUHJvbW90ZSBXb21lbiBpbiBUZWNoPzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTAzLTAyLXRoZS1qb3VybmV5LXRvLW9jYW1sLW11 bHRpY29yZS1icmluZ2luZy1iaWctaWRlYXMtdG8tbGlmZSI+VGhlIEpvdXJuZXkgdG8gT0NhbWwg TXVsdGljb3JlOiBCcmluZ2luZyBCaWcgSWRlYXMgdG8gTGlmZTwvYT4NCjwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDIzLTAxLTEyLWxhbWJkYS1yZXRyZWF0LXJl cG9ydCI+TGFtYmRhIFJldHJlYXQgUmVwb3J0PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6 Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjMtMDEtMTAtZW5naW5lZXItc3BvdGxpZ2h0LXN1ZGhhLXBh cmltYWxhIj5FbmdpbmVlciBTcG90bGlnaHQ6IFN1ZGhhIFBhcmltYWxhPC9hPg0KPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmphbmVzdHJlZXQuY29tL3RoZS1qb3ktb2YtZXhwZWN0LXRl c3RzLyI+V2hhdCBpZiB3cml0aW5nIHRlc3RzIHdhcyBhIGpveWZ1bCBleHBlcmllbmNlPzwvYT4N CjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZ2QxZTRiYTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJvcmdkMWU0YmEz Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC1vcmdk MWU0YmEzIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiA8YSBocmVm PSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQgbWUgYSBtZXNz YWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8 YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8 L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24u cnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28g d2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUg PGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5 LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBpZD0ib3JnZjky NDUyYiI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0LyI+QWxhbiBT Y2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4N CjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 28 Mar 2023 08:23:03 +0100 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 28 Mar 2023 08:23:03 +0100 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 28 Mar 2023 08:23:03 +0100 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32S7MHc3007469 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 28 Mar 2023 08:22:17 +0100 Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32S7M6p0007450 for ; Tue, 28 Mar 2023 08:22:06 +0100 Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Mar 2023 09:22:05 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id AC9FBE0D46; Tue, 28 Mar 2023 09:22:05 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E263CE0D40 for ; Tue, 28 Mar 2023 09:21:58 +0200 (CEST) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Mar 2023 09:21:57 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A050E56079F; Tue, 28 Mar 2023 09:21:56 +0200 (CEST) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZYUYiRmI9AcDfUkme+0LZmlccng== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 28 Mar 2023 08:21:56 +0100 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 78870768-9014-41ec-e04f-08db2f5d4492 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,296,1673910000"; d="scan'208,217";a="99437440" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.498883, queueID=EB23B56123A x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMy0yOCBUdWUgMDk6MTkgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDMuMjEuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wNC4wNC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1hcmNoIDIxIHRvIDI4LCAyMDIzLiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPlZPQ2FtbDogYWRkIGFuZCByZW1vdmUg dHlwZSBhbm5vdGF0aW9ucyBpbiBWUyBDb2RlPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+bmV3 IHZlcnNpb25zIG9mIFZTIENvZGUgZXh0ZW5zaW9ucyBBbGNvdGVzdCBhbmQgRXhwZWN0IGFuZCBJ bmxpbmUgdGVzdHMsIG5vdyBvbiBPcGVuIFZTWCB0b288L2E+DQo8L2xpPjxsaT48YSBocmVmPSIj MyI+RG9jZmQ6IFRVSSBmdXp6eSBkb2N1bWVudCBmaW5kZXIgMC4yLjM8L2E+IDwvbGk+PGxpPjxh IGhyZWY9IiM0Ij5DYW1vbWlsZSAyLjAuMCBpcyBvdXQhPC9hPiA8L2xpPjxsaT48YSBocmVmPSIj NSI+Y2lkIDAuMS4wIC0gQ29udGVudCBJZGVudGlmaWVycyBpbiBPQ2FtbDwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzYiPlN0ayAwLjEuMCAoU0RMLWJhc2VkIEdVSSB0b29sa2l0KSBhbmQgQ2hhbW8g NC4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+Q3liZXItaGFja2F0aG9uIEZyYW1hLUMgJiM0 MzsgQmluc2VjIG5lYXIgUGFyaXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5aYW51ZGEg4oCT IE9DYW1sIGxpbnRlciBleHBlcmltZW50PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnYTk5ZDNi YiI+T2xkIENXTjwvYT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5WT0NhbWw6IGFk ZCBhbmQgcmVtb3ZlIHR5cGUgYW5ub3RhdGlvbnMgaW4gVlMgQ29kZTwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvdm9jYW1sLWFkZC1hbmQtcmVtb3ZlLXR5cGUtYW5ub3Rh dGlvbnMtaW4tdnMtY29kZS8xMTYxOC82Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC92 b2NhbWwtYWRkLWFuZC1yZW1vdmUtdHlwZS1hbm5vdGF0aW9ucy1pbi12cy1jb2RlLzExNjE4LzY8 L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2NlMDU4OTEi IGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdjZTA1ODkxIj5MdWthc3ogU3RhZmluaWFr IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3Jn Y2UwNTg5MSI+DQo8cD5BIG5ldyB2ZXJzaW9uIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9sdWtzdGFmaS92b2NhbWwvcmVsZWFzZXMvdGFnLzEuMS4xIj4NClZPQ2FtbCDigJMgMS4xLjE8 L2E+IGlzIG91dCAoPGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29t L2l0ZW1zP2l0ZW1OYW1lPWx1a3N0YWZpLnZvY2FtbCI+TWFya2V0cGxhY2U8L2E+KS4gTXVsdGls aW5lIHR5cGVzIHdvcmsgbm93LCBhbHNvIGxhYmVsZWQgYXJndW1lbnRzIChhbmQgb3B0aW9uYWwg d2l0aG91dCBkZWZhdWx0cyksIHVuaXQgdmFsdWUgcGF0dGVybi4NCjwvcD4NCjwvZGl2Pg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSIyIj5uZXcgdmVyc2lvbnMgb2YgVlMgQ29kZSBleHRlbnNpb25zIEFsY290 ZXN0IGFuZCBFeHBlY3QgYW5kIElubGluZSB0ZXN0cywgbm93IG9uIE9wZW4gVlNYIHRvbzwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy12ZXJzaW9ucy1vZi12 cy1jb2RlLWV4dGVuc2lvbnMtYWxjb3Rlc3QtYW5kLWV4cGVjdC1pbmxpbmUtdGVzdHMtbm93LW9u LW9wZW4tdnN4LXRvby8xMTcwMC8yIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t bmV3LXZlcnNpb25zLW9mLXZzLWNvZGUtZXh0ZW5zaW9ucy1hbGNvdGVzdC1hbmQtZXhwZWN0LWlu bGluZS10ZXN0cy1ub3ctb24tb3Blbi12c3gtdG9vLzExNzAwLzI8L2E+DQo8L3A+DQo8L2Rpdj4N CjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzViNTljN2UiIGNsYXNzPSJvdXRsaW5lLTMi Pg0KPGgzIGlkPSJvcmc1YjU5YzdlIj5Sb2xhbmQgQ3Nhc3phciBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzViNTljN2UiPg0KPHA+TmV3IHZl cnNpb25zIGZvciBib3RoIGV4dGVuc2lvbnMgdGhhdCBmaXggYSBjcml0aWNhbCBidWc6IHVudGls IG5vdyBpZiB0aGVyZSBoYWQgYmVlbiBtb3JlIHRoYW4gb25lIHRlc3QgcnVubmVyIHRoZSB0ZXN0 cyBmcm9tIGFsbCBvdGhlciBydW5uZXJzIGhhZCBiZWVuIGRlbGV0ZWQgZHVyaW5nIHRlc3QgZGlz Y292ZXJ5Lg0KPC9wPg0KPHA+SW1wb3J0YW50IGZlYXR1cmUgYWRkZWQgdG8gdGhlIEV4cGVjdCBh bmQgSW5saW5lIGV4dGVuc2lvbjogb24gc3RhcnR1cCBhbmQgPGNvZGU+DQpSZWZyZXNoIFRlc3Rz PC9jb2RlPiBub3cgdGhlIHRlc3RzIGFyZSBub3QgcnVuLCBidXQgb25seSBhIGxpc3Qgb2YgdGVz dHMgaXMgZ2VuZXJhdGVkLiBUaGlzIHNwZWVkcyB1cCB0ZXN0IGRpc2NvdmVyeSBzaWduaWZpY2Fu dGx5IChhbmQgbm93IGJvdGggZXh0ZW5zaW9ucyB3b3JrIHRoZSBzYW1lKS4NCjwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZDY5NmM4OCIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZ2Q2OTZjODgiPkFsY290ZXN0IFRlc3QgRXhwbG9yZXIgVmVyc2lvbiAw LjYuMDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZDY5NmM4 OCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFj ZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29k ZS1vY2FtbC1hbGNvdGVzdC10ZXN0LWFkYXB0ZXIiPlZTIENvZGUgTWFya2V0cGxhY2U8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL29wZW4tdnN4Lm9yZy9leHRlbnNpb24vUmVsZWFzZS1D YW5kaWRhdGUvdnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+T3BlbiBWU1g8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1DYW5kaWRhdGUv dnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+R2l0SHViPC9hPg0KPC9saT48L3Vs Pg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZzk2NzE5NWYiPjwv YT5DaGFuZ2Vsb2c8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3Jn OTY3MTk1ZiI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+TWFrZSB0aGUgcGF0aCB0byB0aGUg RHVuZSBleGVjdXRhYmxlIGNvbmZpZ3VyYWJsZS4gQ2FuIG5vdyBiZSBlaXRoZXIgYW4gYWJzb2x1 dGUgcGF0aCwgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSBwcm9qZWN0IHJvb3Qgb3IganVzdA0KPGNv ZGU+ZHVuZTwvY29kZT4sIHdoaWNoIGlzIGxvb2tlZCB1cCBpbiB0aGUgbG9jYWwgT3BhbSBlbnZp cm9ubWVudCBvciB0aGUgPGNvZGU+DQpQQVRIPC9jb2RlPi4gPC9saT48bGk+QWRkIGEgbWVzc2Fn ZSB3aW5kb3cgdG8gYXNrIGZvciBhIHJlbG9hZCBpZiBhIGNvbmZpZ3VyYXRpb24gdmFsdWUgaGFz IGNoYW5nZWQuDQo8L2xpPjxsaT5VcGRhdGUgZG9jdW1lbnRhdGlvbiA8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdkYzU4ZmY5Ij48L2E+QnVnZml4ZXM8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZGM1OGZmOSI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+RG8gbm90IGRlbGV0ZSB0aGUgdGVzdCBncm91cHMgb2YgYWxsIG90aGVyIHRl c3QgcnVubmVycyBpZiB0aGVyZSBleGlzdHMgbW9yZSB0aGFuIG9uZSB0ZXN0IHJ1bm5lci4NCjwv bGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdhYjAxYWQ4IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYWIwMWFk OCI+RXhwZWN0IGFuZCBJbmxpbmUgVGVzdHMgVmVyc2lvbiAwLjUuMDwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnYWIwMWFkOCI+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0 ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1vY2FtbC1leHBlY3QtaW5saW5l Ij5WUyBDb2RlIE1hcmtldHBsYWNlPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9vcGVu LXZzeC5vcmcvZXh0ZW5zaW9uL1JlbGVhc2UtQ2FuZGlkYXRlL3ZzY29kZS1vY2FtbC1leHBlY3Qt aW5saW5lIj5PcGVuIFZTWDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtZXhwZWN0LWlubGluZSI+R2l0SHViPC9h Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9y Z2JmZDg5N2MiPjwvYT5DaGFuZ2Vsb2c8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIg aWQ9InRleHQtb3JnYmZkODk3YyI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Tm8gbmVlZCB0 byBydW4gYWxsIHRlc3RzIGF0IHN0YXJ0dXAgb3IgcmVmcmVzaC4gVXNlIHRoZSA8Y29kZT4tbGlz dC10ZXN0LW5hbWVzPC9jb2RlPiBhcmd1bWVudCBvZiB0aGUgaW5saW5lIHRlc3QgcnVubmVycy4N CjwvbGk+PGxpPk5ldyBjb25maWd1cmF0aW9uIHZhbHVlczoNCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT48Y29kZT5leHBlY3RwcHguZGlzY292ZXJJblNvdXJjZXM8L2NvZGU+IC0gV2hldGhlciB0 byBwYXJzZSBzb3VyY2UgZmlsZXMgb24gb3BlbiBhbmQgc2F2ZSBmb3IgdGVzdHMgYW5kIHVwZGF0 ZSB0aGUgVGVzdCBFeHBsb3JlciB0cmVlLiBTaG91bGQgYmUgc2V0IHRvDQo8Y29kZT50cnVlPC9j b2RlPiBpZiA8Y29kZT5leHBlY3RwcHguZGlzY292ZXJPblN0YXJ0dXA8L2NvZGU+IGlzIDxjb2Rl PmZhbHNlPC9jb2RlPi4NCjwvbGk+PGxpPjxjb2RlPmV4cGVjdHBweC5kdW5lUGF0aDwvY29kZT4g LSBTZXQgYW4gYWJzb2x1dGUgcGF0aCBvciBhIHBhdGggcmVsYXRpdmUgdG8gdGhlIHByb2plY3Qg cm9vdCBvZiB0aGUgRHVuZSBleGVjdXRhYmxlLiBEZWZhdWx0Og0KPGNvZGU+ZHVuZTwvY29kZT4g LSB1c2UgdGhlIG9uZSBpbiB0aGUgbG9jYWwgT3BhbSBlbnZpcm9ubWVudCBvciBpbiA8Y29kZT5Q QVRIPC9jb2RlPi4gU2VlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1DYW5k aWRhdGUvdnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUvaXNzdWVzLzMiPg0KSXNzdWUgIzM8L2E+ LiA8L2xpPjxsaT48Y29kZT5leHBlY3RwcHguZXhjbHVkZVJ1bm5lcnM8L2NvZGU+IC0gQSBsaXN0 IG9mIGlubGluZSB0ZXN0IHJ1bm5lciBuYW1lcyB0byBiZSBleGNsdWRlZCBmcm9tIHRlc3QgZGlz Y292ZXJ5IGFuIHN0YXJ0dXAgb3IgcmVmcmVzaCwgZS5nLiBiZWNhdXNlIHRoZXkgdGFrZSB0b28g bG9uZyB0byBmaW5pc2guDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5BZGQgYSBtZXNzYWdlIHdpbmRv dyB0byBhc2sgZm9yIGEgcmVsb2FkIGlmIGEgY29uZmlndXJhdGlvbiB2YWx1ZSBoYXMgY2hhbmdl ZC4NCjwvbGk+PGxpPkRpc2FibGUgQU5TSSBjb2xvciBlc2NhcGUgc2VxdWVuY2VzIGluIG91dHB1 dCBvZiB0ZXN0IGZhaWx1cmVzLiA8L2xpPjxsaT5VcGRhdGUgdGhlIGRvY3VtZW50YXRpb24uIDwv bGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2NlZGUxYWIiPjwvYT5CdWdmaXhl czxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdjZWRlMWFiIj4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5GaXggYnVnIHdoZW4gdGVzdHMgZnJvbSBvdGhlciB0 ZXN0IHJ1bm5lcnMgYXJlIGRlbGV0ZWQgb24gc3RhcnR1cCBvciByZWZyZXNoIGhhdmluZyBtb3Jl IHRoYW4gb25lIGlubGluZSB0ZXN0IHJ1bm5lci4gU2VlDQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vUmVsZWFzZS1DYW5kaWRhdGUvdnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUvaXNzdWVz LzMiPg0KSXNzdWUgIzM8L2E+LiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJv cmdiNThjZDIxIj48L2E+SW50ZXJuYWwgQ2hhbmdlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmdiNThjZDIxIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5S ZW1vdmUgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGZyb20gdGVzdCBmaXh0dXJlcy4gPC9saT48bGk+ QWRkIHlhcm4gdGFyZ2V0IGZvciB0aGUgT3BlbiBWU1ggUmVnaXN0cnkuIDwvbGk+PC91bD4NCjwv ZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzhjNWVmYTIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4YzVlZmEyIj5S b2xhbmQgQ3Nhc3phciBsYXRlciBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzhjNWVmYTIiPg0KPHA+SeKAmXZlIGp1c3QgcmVsZWFzZWQgYSBu ZXcgdmVyc2lvbiBvZiB0aGUgRXhwZWN0IHRlc3RpbmcgZXh0ZW5zaW9uLiBUaGUgRXhwZWN0IHRl c3QgcmVzdWx0IG9mIGEgZmFpbGVkIHRlc3Qgbm93IHVzZXMgVlMgQ29kZeKAmXMgZGlmZiB2aWV3 LiBUaGUgYWN0dWFsIHJlc3VsdCBvdXRwdXQgb2YgdGhlIHRlc3QgY2FuIGJlIGRpc3BsYXllZCBi eSBob3ZlcmluZyB0aGUgc3RhbnphDQo8Y29kZT5sZXQlZXhwZWN0X3Rlc3Q8L2NvZGU+LiA8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzgwMTUzMTYiIGNsYXNzPSJv dXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4MDE1MzE2Ij5FeHBlY3QgYW5kIElubGluZSBUZXN0cyBW ZXJzaW9uIDAuNi4wPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1v cmc4MDE1MzE2Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL21h cmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9cmVsZWFzZS1jYW5kaWRh dGUudnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUiPlZTIENvZGUgTWFya2V0cGxhY2U8L2E+DQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL29wZW4tdnN4Lm9yZy9leHRlbnNpb24vUmVsZWFzZS1D YW5kaWRhdGUvdnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUiPk9wZW4gVlNYPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlbGVhc2UtQ2FuZGlkYXRlL3ZzY29kZS1v Y2FtbC1leHBlY3QtaW5saW5lIj5HaXRIdWI8L2E+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnZWJjZTZlYSI+PC9hPkNoYW5nZWxvZzxicj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmdlYmNlNmVhIj4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5TaG93IHRoZSBleHBlY3RlZCBhbmQgYWN0dWFsIHZhbHVlcyBv ZiBFeHBlY3QgdGVzdHMgaW4gVlMgQ29kZXPigJkgZGlmZiB2aWV3LiBTZWUNCjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtZXhwZWN0LWlu bGluZS9pc3N1ZXMvNiI+DQpJc3N1ZSAjNjwvYT4uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzU2ZGRl NzMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1NmRkZTczIj5Sb2xhbmQgQ3Nhc3ph ciBmaW5hbGx5IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnNTZkZGU3MyI+DQo8cD5UaGVzZSByZWxlYXNlcyBvZiBib3RoIGV4dGVuc2lvbnMg cHJvdmlkZSBiZXR0ZXIgaGFuZGxpbmcgb2YgRHVuZSBsb2Nrcy4gPC9wPg0KPHA+VGhlIG5ldyB2 ZXJzaW9ucyBmaXggYSBidWcgd2hlcmUgYSBkdW5lIHByb2Nlc3Mgd2FpdGluZyB0byBhY3F1aXJl IHRoZSBsb2NrIGNvdWxkbuKAmXQgYmUgY2FuY2VsbGVkLiBBbmQgYWZ0ZXIgMzBzIG9mIG5vdCBh Y3F1aXJpbmcgdGhlIER1bmUgbG9jayBhbiBlcnJvciBtZXNzYWdlIGlzIGRpc3BsYXllZC4NCjwv cD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZGRkN2VlYyIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2RkZDdlZWMiPkFsY290ZXN0IFRlc3QgRXhwbG9yZXIg VmVyc2lvbiAwLjcuMDwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQt b3JnZGRkN2VlYyI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9t YXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlk YXRlLnZzY29kZS1vY2FtbC1hbGNvdGVzdC10ZXN0LWFkYXB0ZXIiPlZTIENvZGUgTWFya2V0cGxh Y2U8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29wZW4tdnN4Lm9yZy9leHRlbnNpb24v UmVsZWFzZS1DYW5kaWRhdGUvdnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+T3Bl biBWU1g8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1D YW5kaWRhdGUvdnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+R2l0SHViPC9hPg0K PC9saT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2Vm NGExMWQiPjwvYT5DaGFuZ2Vsb2c8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9 InRleHQtb3JnZWY0YTExZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+SWYgdGhlIGR1bmUg bG9jayBjYW7igJl0IGJlIGFjcXVpcmVkIGZvciAzMHMsIHJhaXNlIGFuIGVycm9yIHdpbmRvdyBh bmQgYXNrIHRoZSB1c2VyIHdoYXQgdG8gZG8uDQo8L2xpPjxsaT5VcGRhdGUgdGhlIGRvY3VtZW50 YXRpb24uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzUwMTllODUiPjwv YT5CdWdmaXhlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc1 MDE5ZTg1Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5NYWtlIDxjb2RlPkNhbmNlbCBUZXN0 IFJ1bjwvY29kZT4gc3RvcCBEdW5lIHByb2Nlc3NlcyB3YWl0aW5nIGZvciB0aGUgbG9jayB0b28u IFNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlbGVhc2UtQ2FuZGlkYXRlL3ZzY29k ZS1vY2FtbC1leHBlY3QtaW5saW5lL2lzc3Vlcy85Ij4NCklzc3VlICM5PC9hPi4gPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNjgxNDExYSI+PC9hPkludGVybmFsIENoYW5n ZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNjgxNDExYSI+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+QWRkIHlhcm4gdGFyZ2V0IGZvciB0aGUgT3BlbiBW U1ggUmVnaXN0cnkuIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkZmEwNWFlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnZGZhMDVhZSI+RXhwZWN0IGFuZCBJbmxpbmUgVGVzdHMgVmVyc2lvbiAwLjcuMDwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZGZhMDVhZSI+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1 YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1vY2Ft bC1leHBlY3QtaW5saW5lIj5WUyBDb2RlIE1hcmtldHBsYWNlPC9hPg0KPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9vcGVuLXZzeC5vcmcvZXh0ZW5zaW9uL1JlbGVhc2UtQ2FuZGlkYXRlL3ZzY29k ZS1vY2FtbC1leHBlY3QtaW5saW5lIj5PcGVuIFZTWDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtZXhwZWN0LWlu bGluZSI+R2l0SHViPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGEgaWQ9Im9yZzE2ODMwZTgiPjwvYT5DaGFuZ2Vsb2c8YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMTY4MzBlOCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+SWYgdGhlIGR1bmUgbG9jayBjYW7igJl0IGJlIGFjcXVpcmVkIGZvciAzMHMsIHJhaXNl IGFuIGVycm9yIHdpbmRvdyBhbmQgYXNrIHRoZSB1c2VyIHdoYXQgdG8gZG8uDQo8L2xpPjxsaT5V cGRhdGUgdGhlIGRvY3VtZW50YXRpb24uIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEg aWQ9Im9yZzBlMDE2YWEiPjwvYT5CdWdmaXhlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC01IiBpZD0idGV4dC1vcmcwZTAxNmFhIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5NYWtl IDxjb2RlPkNhbmNlbCBUZXN0IFJ1bjwvY29kZT4gc3RvcCBEdW5lIHByb2Nlc3NlcyB3YWl0aW5n IGZvciB0aGUgbG9jayB0b28uIFNlZQ0KPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL1JlbGVh c2UtQ2FuZGlkYXRlL3ZzY29kZS1vY2FtbC1leHBlY3QtaW5saW5lL2lzc3Vlcy85Ij4NCklzc3Vl ICM5PC9hPi4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0iMyI+RG9jZmQ6IFRVSSBmdXp6eSBkb2N1bWVudCBmaW5kZXIgMC4yLjM8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kb2NmZC10dWktZnV6enktZG9j dW1lbnQtZmluZGVyLTAtMi0zLzExNjk4LzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1kb2NmZC10dWktZnV6enktZG9jdW1lbnQtZmluZGVyLTAtMi0zLzExNjk4LzI8L2E+DQo8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzNkYjU2YWUiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmczZGI1NmFlIj5EYXJyZW4gYW5ub3VuY2VkPC9oMz4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmczZGI1NmFlIj4NCjxwPkRv Y2ZkIDAuMi42IGhhcyBqdXN0IGJlZW4gcmVsZWFzZWQuIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVs Ij4NCjxsaT5Tb21lIGxpbWl0cyB3ZXJlIHB1dCBpbiBwbGFjZXMgdG8gc3BlZWQgdXAgY29udGVu dCBzZWFyY2ggYW5kIGF2b2lkIGl0IGJlY29taW5nIHZlcnkgc2xvdyBpbiBsYXJnZSBkb2N1bWVu dHMNCjwvbGk+PGxpPkFkanVzdGVkIHRoZSBjb21tYW5kIGxpbmUgdG8gYWNjZXB0IG11bHRpcGxl IHBhdGhzLCBlYWNoIHBhdGggY2FuIGJlIGZpbGUgb3IgZGlyZWN0b3J5DQo8L2xpPjxsaT5TaW5n bGUgZmlsZSBtb2RlIGlzIGFkZGVkIChzZWUgc2NyZWVuc2hvdHMgYmVsb3cpIDwvbGk+PC91bD4N CjxwPlNlYXJjaGluZyA8Y29kZT5pcyBsZWZ0PC9jb2RlPiBhZnRlciA8Y29kZT5kb2NmZCBSRUFE TUUubWQ8L2NvZGU+IDwvcD4NCjxkaXYgaWQ9Im9yZzE3MTJiZDQiIGNsYXNzPSJmaWd1cmUiPg0K PHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91 cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzUvNTQzZTY3NzIzYzIxZjQ5NWNkOWMwZjhhNWIzNTgw NDEwMzMxNzdjZC5wbmciIGFsdD0iNTQzZTY3NzIzYzIxZjQ5NWNkOWMwZjhhNWIzNTgwNDEwMzMx NzdjZC5wbmciPg0KPC9wPg0KPC9kaXY+DQo8cD5TZWFyY2hpbmcgPGNvZGU+W2dpdGh1Yl08L2Nv ZGU+IGFmdGVyIDxjb2RlPmRvY2ZkIFJFQURNRS5tZDwvY29kZT4gPC9wPg0KPGRpdiBpZD0ib3Jn YTVjNWZmMCIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6Ly9nbG9iYWwuZGlz Y291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNC80MzMy NDUyNTE0OWNmYmJhNWQxZDY3OGU3Y2FiMDk0NGZlNmRhZGExLnBuZyIgYWx0PSI0MzMyNDUyNTE0 OWNmYmJhNWQxZDY3OGU3Y2FiMDk0NGZlNmRhZGExLnBuZyI+DQo8L3A+DQo8L2Rpdj4NCjxwPkZl ZWwgZnJlZSB0byBsZWF2ZSBmZWVkYmFjayEgPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjQiPkNhbW9taWxlIDIuMC4wIGlzIG91dCE8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1jYW1vbWlsZS0yLTAtMC1pcy1vdXQvMTE3NTEvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLWNhbW9taWxlLTItMC0wLWlzLW91dC8xMTc1MS8xPC9hPiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzFmM2Y3MjUiIGNsYXNz PSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcxZjNmNzI1Ij5Sb21haW4gQmVhdXhpcyBhbm5vdW5j ZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzFmM2Y3MjUi Pg0KPHA+Q2Ftb21pbGUgPGNvZGU+Mi4wLjA8L2NvZGU+IGlzIG91dCBhbmQgc2hvdWxkIGJlIGF2 YWlsYWJsZSBpbiB0aGUgPGNvZGU+b3BhbTwvY29kZT4gcmVwb3NpdG9yeS4g8J+OiQ0KPC9wPg0K PHA+VGhpcyByZWxlYXNlcyBicmluZ3MgY29tcGF0aWJpbGl0eSB3aXRoIDxjb2RlPk9DYW1sPC9j b2RlPiA1IHRvIDxjb2RlPmNhbW9taWxlPC9jb2RlPiBhbmQgYWxsIHByb2plY3RzIHVzaW5nIGl0 IGFzIHdlbGwgYXMgYSBjbGVhbnVwIG9mIHRoZSBBUEkgYW5kIGJ1aWxkIHN5c3RlbS4NCjwvcD4N CjxwPldlIGhhdmUgdXNlZCA8Y29kZT5jYW1vbWlsZTwvY29kZT4gZm9yIHllYXJzIHdpdGggPGNv ZGU+bGlxdWlkc29hcDwvY29kZT4gYW5kLCBhZnRlcg0KPGNvZGU+T0NhbWw8L2NvZGU+IDUgY2Ft ZSBvdXQsIHRoZSBsaWJyYXJ5IHdhcyBub3QgYnVpbGRpbmcgd2l0aCBpdCBhbmQgYXBwZWFyZWQg dW5tYWludGFpbmVkLiBIb3dldmVyLCBhZnRlciBsb29raW5nIGZvciBhbHRlcm5hdGl2ZXMsIGl0 IGFwcGVhcmVkIHRoYXQgdGhlcmUgd2VyZSDimqDvuI8NCjxiPjxiPm5vIGFsdGVybmF0aXZlcyB0 byBjb252ZXJ0IGZyb20gPGNvZGU+VVRGLTg8L2NvZGU+IHRvIG91dGRhdGVkIHN0cmluZyBlbmNv ZGluZ3Mgc3VjaCBhcw0KPGNvZGU+SVNPLTg4NTktMTwvY29kZT48L2I+PC9iPiDimqDvuI8gPC9w Pg0KPHA+V2hpbGUgdGhlcmUgYXJlIG1vZHVsZXMgdGhhdCBhbGxvdyB0byBkbyB0aGUgb3Bwb3Np dGUsIHdlIGJlbGlldmUgdGhhdCwgaW4gb3JkZXIgdG8gYmUgc3VjY2Vzc2Z1bCBhbmQgd2lkZXNw cmVhZCwgdGhlIE9DYW1sIGVjb3N5c3RlbSBuZWVkcyB0byBiZSBhYmxlIHRvIGFjY29tbW9kYXRl IHRvIGxlZ2FjeSBjb21wdXRlciBzeXN0ZW1zIGFuZCBwcm90b2NvbHMgYW5kLCBpbiBwYXJ0aWN1 bGFyLCBiZSBhYmxlIHRvIG91dHB1dCBzdHJpbmdzIHRvDQogbGVnYWN5IHN0cmluZyBlbmNvZGlu Z3Mgc28gd2UgZGVjaWRlZCB0byBzZWUgYWJvdXQgYnJpbmdpbmcgPGNvZGU+Y2Ftb21pbGU8L2Nv ZGU+IHVwLXRvIHNwZWVkIHdpdGggdGhlIGxhdGVzdA0KPGNvZGU+T0NhbWw8L2NvZGU+IGNvbXBp bGVyIGFuZCB0b29saW5nLiA8L3A+DQo8cD5UaGUgZm9yayBpcyBjdXJyZW50bHkgbG9jYXRlZCBh dCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9DYW1vbWlsZSI+DQpodHRwczov L2dpdGh1Yi5jb20vc2F2b25ldC9DYW1vbWlsZTwvYT4gYW5kIHdhcyBhcHByb3ZlZCBieSB0aGUg b3JpZ2luYWwgYXV0aG9yIDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdS95b3Jp eXVraSI+DQp5b3JpeXVraTwvYT4uIFdlIGFyZSBpbW1lbnNlbHkgZ3JhdGVmdWwgZm9yIGhpcyB3 b3JrIHVwLXRvIHRoaXMgcG9pbnQuIDwvcD4NCjxwPk1ha2Ugbm8gbWlzdGFrZSwgdGhvdWdoOiB0 aGUgbW9kdWxlIGlzIHN0aWxsIGluIGRpcmUgbmVlZCBvZiBtYWludGFpbmVycy4gSWRlYWxseSwg d2Ugd291bGQgbGlrZSB0byBtb3ZlIHRoZSBtb2R1bGUgdG8NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1jb21tdW5pdHkvbWV0YS9pc3N1ZXMvMzkiPm9jYW1sLWNvbW11bml0eTwv YT4gYW5kIGJyaW5nIG1vcmUgcGVvcGxlIG9uYm9hcmQgdG8gaGVscCB3aXRoIGl0Lg0KPC9wPg0K PHA+VG8gcmVmbGVjdCBiYWNrIHRvIHRoZSBsYXN0IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tY2Ftb21pbGUtMS0wLTAtaXMtcmVsZWFzZWQvMTgyNS8xIj4NCmFjdHVh bCByZWxlYXNlPC9hPiwgdGhpbmdzIHRoYXQgc2hvdWxkIGJlIHdvcmtlZCBvbiBuZXh0IGFyZSBh cmUgbGVhc3Q6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5zcGxpdCB0aGUgbW9kdWxl IGludG8gc2V2ZXJhbCBsaWJyYXJpZXMsIHNvIHRoYXQgYSB1c2VyIGRvIG5vdCBuZWVkIHRvIGlu c3RhbGwgdGhlIGVudGlyZSAoc2V2ZXJhbCBtZWdhYnl0ZXMpIGxpYnJhcmllcw0KPC9saT48bGk+ c3VwcG9ydCBsYXRlc3QgVW5pY29kZSBzdGFuZGFyZCAoaXQgaXMgPGI+PGI+dmVyeTwvYj48L2I+ IG91dGRhdGVkKSA8L2xpPjwvdWw+DQo8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgaW4gaGVscGlu ZyB3aXRoIGl0LCBwbGVhc2UgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMgb3Igc2VuZCBzb21lIFBS cyBvdXIgd2F5IQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPmNpZCAwLjEuMCAt IENvbnRlbnQgSWRlbnRpZmllcnMgaW4gT0NhbWw8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1jaWQtMC0xLTAtY29udGVudC1pZGVudGlmaWVycy1pbi1vY2FtbC8x MTc2MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2lkLTAtMS0wLWNvbnRl bnQtaWRlbnRpZmllcnMtaW4tb2NhbWwvMTE3NjEvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnZTRlNjNkOCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZ2U0ZTYzZDgiPlBhdHJpY2sgRmVycmlzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTRlNjNkOCI+DQo8cD5J4oCZbSBoYXBweSB0 byBhbm5vdW5jZSB0aGUgaW5pdGlhbCByZWxlYXNlIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9wYXRyaWNvZmVycmlzL29jYW1sLWNpZCI+DQpjaWQ8L2E+LCBhbiBPQ2FtbCBsaWJyYXJ5 IGZvciB3b3JraW5nIHdpdGggPGEgaHJlZj0iaHR0cHM6Ly9kb2NzLmlwZnMudGVjaC9jb25jZXB0 cy9jb250ZW50LWFkZHJlc3NpbmcvIj4NCkNvbnRlbnQgSWRlbnRpZmllcnM8L2E+LiBUaGVzZSBh cmUgbGlrZSB5b3VyIHVzdWFsIGhhc2gtYmFzZWQgaWRlbnRpZmllcnMgdXNlZCBpbiBjb250ZW50 LWFkZHJlc3NhYmxlIHN0b3JlcywgYnV0IGFyZSBidWlsdCBvbg0KPGEgaHJlZj0iaHR0cHM6Ly9t dWx0aWZvcm1hdHMuaW8iPm11bHRpZm9ybWF0PC9hPiBsaWJyYXJpZXMuIFNlZSA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW11bHRpY29kZWMtbXVsdGliYXNlLW11bHRp aGFzaC1hbmQtbXVsdGloYXNoLWRpZ2VzdGlmLzEwNjg2Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tbXVsdGljb2RlYy1tdWx0aWJhc2UtbXVsdGloYXNoLWFuZC1tdWx0aWhhc2gt ZGlnZXN0aWYvMTA2ODY8L2E+IGZvciB0aGUgaW5pdGlhbCByZWxlYXNlIG9mIHRoZSBPQ2FtbCB2 ZXJzaW9ucyBvZiB0aGVzZSBsaWJyYXJpZXMuDQo8L3A+DQo8cD5UaGUgbWFpbiB0YWtlYXdheSBp cyB0aGF0IHRoZSBpZGVudGlmaWVycyBhcmUgc2VsZi1kZXNjcmliaW5nIGhlbHBpbmcgYnVpbGQg bW9yZSBwZXJtYW5lbnQgYW5kIGludGVyb3BlcmFibGUgY29udGVudC1hZGRyZXNzZWQgc3lzdGVt cyAoZS5nLiB0aGV5IGFyZSB1c2VkIGluIHRoZSBJUEZTIHByb3RvY29sKS4NCjwvcD4NCjxkaXYg Y2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+ ICgpID0NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+czwvc3Bhbj4gPSA8c3Bh biBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtmb28mcXVvdDs8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+aGFzaDwvc3Bhbj4gPQ0KICAgIDxzcGFuIHN0 eWxlPSJjb2xvcjogIzQ0NGZjZjsiPk11bHRpaGFzaF9kaWdlc3RpZi48L3NwYW4+b2ZfY3N0cnVj dCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7 Ij5gU2hhM18yNTY8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Dc3RydWN0 Ljwvc3Bhbj5vZl9zdHJpbmcgcykNCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij58 Jmd0Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UmVzdWx0Ljwvc3Bhbj5n ZXRfb2sNCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsi PmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBi b2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5jaWQ8L3NwYW4+ ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q2lkLjwvc3Bhbj52IDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwODI0ZjsiPn52ZXJzaW9uPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICMy NDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5gQ2lkdjE8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5jb2RlYzwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAj MjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+YFJhdzwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDA4MjRmOyI+fmJhc2U8L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzI0 MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPmBCYXNlMzI8L3NwYW4+IH5oYXNoIDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Rm9ybWF0Ljwvc3Bhbj5wcmludGYgPHNw YW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7QmFzZSBlbmNvZGVkOiAlc1xuSHVtYW46 ICVhJnF1b3Q7PC9zcGFuPg0KICAgICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5DaWQu PC9zcGFuPnRvX3N0cmluZyBjaWQpIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNpZC48 L3NwYW4+cHBfaHVtYW4gY2lkDQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dy b3VuZC1jb2xvcjogI2ZjZjdlZjsiPkJhc2U8L3NwYW4+IGVuY29kZWQ6IGJhZmtybWlkdzJvNmVk c3B2cmQzN3p1Z3Z4NWRycjZoeWptb2VkbXFpcWp5ZGNhZno1b2tiaGFkNGFlDQo8c3BhbiBzdHls ZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5IdW1hbjwvc3Bh bj46IGNpZHYxIC0gYmFzZTMyIC0gcmF3IC0gaWRlbnQoc2hhMy08c3BhbiBzdHlsZT0iY29sb3I6 ICMwMDgyNGY7Ij4yNTY8L3NwYW4+KSBsZW5ndGgoPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRm OyI+MzI8L3NwYW4+KSBkaWdlc3QoDQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij43Njwv c3Bhbj4gZDMgYmMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDE8L3NwYW4+IGM5IGY1 IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjg4PC9zcGFuPiBmNyAgZmMgZDAgZDUgYmYg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+NDc8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwODI0ZjsiPjE4PC9zcGFuPiBmOCBmOA0KNGIgMWMgPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA4MjRmOyI+NDE8L3NwYW4+IGIyIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjA4PC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij44Mjwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+NzA8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi PjMxPC9zcGFuPiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+MDA8L3NwYW4+IGI5IGVi IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjk0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij4xMzwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+ODA8 L3NwYW4+IDdjIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjAxPC9zcGFuPg0KKQ0KPC9w cmU+DQo8L2Rpdj4NCjxwPlRoZXJl4oCZcyBhbHNvIGEgc21hbGwgZXhhbXBsZSB0aGUgcmVwb3Np dG9yeSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcGF0cmljb2ZlcnJpcy9vY2FtbC1j aWQvYmxvYi9tYWluL3Rlc3QvaXJtaW5fY2lkLm1sIj4NCnJlcGxhY2luZyBJcm1pbuKAmXMgZGVm YXVsdCBoYXNoIGltcGxlbWVudGF0aW9uIHRvIHVzZSBjaWQ8L2E+LiA8L3A+DQo8cD5IYXBweSBI YWNraW5nIDpjYW1lbDogPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPlN0ayAwLjEu MCAoU0RMLWJhc2VkIEdVSSB0b29sa2l0KSBhbmQgQ2hhbW8gNC4wPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tc3RrLTAtMS0wLXNkbC1iYXNlZC1ndWktdG9vbGtp dC1hbmQtY2hhbW8tNC0wLzExNzcwLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1zdGstMC0xLTAtc2RsLWJhc2VkLWd1aS10b29sa2l0LWFuZC1jaGFtby00LTAvMTE3NzAvMTwv YT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMGQ0YWM4MiIg Y2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzBkNGFjODIiPlpvZ2d5IGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMGQ0YWM4MiI+DQo8 cD5JIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgU3RrLCBhIFNE TC1iYXNlZCBncmFwaGljYWwgdXNlciBpbnRlcmZhY2UgdG9vbGtpdC4gSXRzIGludGVyZmFjZSBp cyBpbnNwaXJlZCBieSBHdGsgYW5kIHNob3VsZCBsb29rIGZhbWlsaWFyIHRvIGRldmVsb3BlcnMg dXNpbmcgTGFibGd0ay4gVGhlIHByb2plY3QgcGFnZToNCjxhIGhyZWY9Imh0dHBzOi8vem9nZ3ku ZnJhbWEuaW8vb2NhbWwtc3RrLyI+aHR0cHM6Ly96b2dneS5mcmFtYS5pby9vY2FtbC1zdGsvPC9h Pg0KPC9wPg0KPHA+Q2hhbW8sIGEgZGV2ZWxvcG1lbnQtb3JpZW50ZWQgdGV4dCBlZGl0b3IsIGlz IG5vdyBiYXNlZCBvbiBTdGsgcmF0aGVyIHRoYW4gTGFibGd0ayBzaW5jZSByZWxlYXNlIDQuMC4g Q2hhbW8gaG9tZXBhZ2U6DQo8YSBocmVmPSJodHRwczovL3pvZ2d5LmZyYW1hLmlvL2NoYW1vLyI+ aHR0cHM6Ly96b2dneS5mcmFtYS5pby9jaGFtby88L2E+IC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjciPkN5YmVyLWhhY2thdGhvbiBGcmFtYS1DICYjNDM7IEJpbnNlYyBuZWFyIFBh cmlzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFy Y2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jeWJlci1oYWNrYXRo b24tZnJhbWEtYy1iaW5zZWMtbmVhci1wYXJpcy8xMTc3Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9jeWJlci1oYWNrYXRob24tZnJhbWEtYy1iaW5zZWMtbmVhci1wYXJpcy8xMTc3 Ni8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjNzM1 ZGI2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYzczNWRiNiI+YW1hcm8gYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjNzM1ZGI2 Ij4NCjxwPigqIFRoaXMgaXMgYW4gZXZlbnQgcmVsYXRlZCB0byB0b29scyBkZXZlbG9wZWQgaW4g T0NhbWwsIGFsdGhvdWdoIHRoZSB0b29scyB0aGVtc2VsdmVzIGFyZSBhcHBsaWVkIHRvIEMgYW5k IGFzc2VtYmx5LiAqKQ0KPC9wPg0KPHA+SWYgeW91IGFyZSBuZWFyIFBhcmlzLCBjb21lIHRvIHRo ZSA8Yj5DeWJlci1oYWNrYXRob24gPGEgaHJlZj0iaHR0cHM6Ly93d3cuZnJhbWEtYy5jb20vIj4N CkZyYW1hLUM8L2E+ICYjNDM7IDxhIGhyZWY9Imh0dHBzOi8vYmluc2VjLmdpdGh1Yi5pby8iPkJp bnNlYzwvYT48L2I+LCBvbiA8Yj4yOC8wNDwvYj4gZnJvbQ0KPGI+OWggdG8gMTdoPC9iPiwgYXQg PGEgaHJlZj0iaHR0cHM6Ly9saXN0LmNlYS5mciI+Q0VBIExpc3Q8L2E+LCBpbiB0aGUgUGFyaXMt U2FjbGF5IGNhbXB1cyAoPGEgaHJlZj0iaHR0cHM6Ly93d3cub3BlbnN0cmVldG1hcC5vcmcvP21s YXQ9NDguNzEyNjQmYW1wO21sb249Mi4xOTIxOCNtYXA9MTcvNDguNzEyNjQvMi4xOTIxOCZhbXA7 bGF5ZXJzPUgiPk5hbm8tSW5ub3YsIDIgYmQgVGhvbWFzIEdvYmVydCwgOTExMjAgUGFsYWlzZWF1 PC9hPikhDQo8L3A+DQo8cD5UaGlzIGlzIGFuIGV2ZW50IGRlZGljYXRlZCB0byBmb3JtYWwgbWV0 aG9kcywgY29kZSBhbmFseXNpcywgY3liZXJzZWN1cml0eSBhbmQgcmV2ZXJzZSBlbmdpbmVlcmlu Zywgd2l0aCB0aGUgaGVscCBvZiB0aGUgRnJhbWEtQyBhbmQgQmluc2VjIGZyYW1ld29ya3MuDQo8 L3A+DQo8cD5EdXJpbmcgdGhpcyBkYXksIHlvdSB3aWxsIGJlIGFibGUgdG86IDwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5CcmluZyB5b3VyIG93biBDIGNvZGUgdG8gaGF2ZSBpdCBhbmFs eXplZCBieSB0aGUgRnJhbWEtQyB0ZWFtOyA8L2xpPjxsaT5QYXJ0aWNpcGF0ZSBpbiB0aGUgdHV0 b3JpYWxzIGFuZCBjb2RlIGFuYWx5c2lzIGNoYWxsZW5nZXMgd2l0aCBGcmFtYS1DOyA8L2xpPjxs aT5QYXJ0aWNpcGF0ZSBpbiB0aGUgY3JhY2ttZSBhbmQgcmV2ZXJzZSBjaGFsbGVuZ2VzIHdpdGgg dGhlIEJpbnNlYyB0b29sOyA8L2xpPjxsaT5MZWFybiBob3cgdG8gdXNlIEZyYW1hLUMvQmluc2Vj LCBvciBiZWNvbWUgcHJvZmljaWVudCB3aXRoIHRoZW07IDwvbGk+PGxpPlBhcnRpY2lwYXRlIGlu IHRoZSBkZXZlbG9wbWVudCBvZiB0aGVzZSBvcGVuLXNvdXJjZSBwbGF0Zm9ybXMsIGRldmVsb3Bl ZCBtYWlubHkgaW4gT0NhbWwuDQo8L2xpPjwvdWw+DQo8cD5QbGVhc2UgcmVnaXN0ZXIgaGVyZTog PGEgaHJlZj0iaHR0cHM6Ly9mcmFtYWZvcm1zLm9yZy9pbnNjcmlwdGlvbi1jeWJlci1oYWNrYXRo b24tZnJhbWEtYy1iaW5zZWMtMTY3ODgxNTM3MCI+DQpodHRwczovL2ZyYW1hZm9ybXMub3JnL2lu c2NyaXB0aW9uLWN5YmVyLWhhY2thdGhvbi1mcmFtYS1jLWJpbnNlYy0xNjc4ODE1MzcwPC9hPiAo PGk+dGhlIGZvcm0gaXMgaW4gRnJlbmNoLCBidXQgZmVlbCBmcmVlIHRvIGNvbnRhY3QgdXMgZGly ZWN0bHkgaW4gRW5nbGlzaCBpZiB5b3UgcHJlZmVyPC9pPikuDQo8L3A+DQo8cD5CeSB0aGUgd2F5 LCB0aGUgRnJhbWEtQyBhbmQgQmluc2VjIHRlYW1zIGFyZSBoaXJpbmchIEludGVybnMsIFBoRHMs IHBvc3Rkb2NzLCB0ZW1wb3JhcnktIGFuZCBmaXhlZC10ZXJtIHJlc2VhcmNoZXJz4oCmIGRyb3Ag YnkgaWYgeW91IGFyZSBpbnRlcmVzdGVkIQ0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 IjgiPlphbnVkYSDigJMgT0NhbWwgbGludGVyIGV4cGVyaW1lbnQ8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi16YW51ZGEtb2NhbWwtbGludGVyLWV4cGVyaW1lbnQv MTE3ODQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXphbnVkYS1vY2FtbC1s aW50ZXItZXhwZXJpbWVudC8xMTc4NC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2FhZjZjNmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdh YWY2YzZjIj5LYWthZHUgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmdhYWY2YzZjIj4NCjxwPkkgZGV2ZWxvcGVkIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9LYWthZHUvemFudWRhIj5hIGxpbnRlcjwvYT4gZm9yIG15IEZQIGNvdXJzZSBp biBteSBsb2NhbCB1bml2ZXJzaXR5LiBJdCBhbmFseXplZCAobW9zdGx5KSB0eXBlZCB0cmVlIGFu ZCBwZXJmb3JtcyB2YXJpb3VzIGNoZWNrcyAoYS5rLmEuIGxpbnRzKS4gVGhlIGxpc3Qgb2YgYXZh aWxhYmxlIGxpbnRzIGNvdWxkIGJlIGZvdW5kDQo8YSBocmVmPSJodHRwczovL2tha2FkdS5naXRo dWIuaW8vemFudWRhL2xpbnRzL2luZGV4Lmh0bWwiPmhlcmU8L2E+LiA8L3A+DQo8cD5UaGUgZGlz Y3Vzc2lvbiBhYm91dCBhIGFic2VuY2Ugb2YgbGl0bmVyIGFyaXNlIGZyb20gdGltZSB0byB0aW1l IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ob3ctcG9zc2libGUtaXMtYS1j bGlwcHktbGlrZS1saW50ZXItZm9yLW9jYW1sIj4NCkhvdyBwb3NzaWJsZSBpcyBhIGNsaXBweS1s aWtlIGxpbnRlciBmb3IgT0NhbWw/PC9hPiBhbmQgc29tZXdoZXJlIGluIDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93aGF0LWFyZS10aGUtYmlnZ2VzdC1yZWFzb25zLW5ld2Nv bWVycy1naXZlLXVwLW9uLW9jYW1sLzEwOTU4LzI5OSI+DQpXaGF0IGFyZSB0aGUgYmlnZ2VzdCBy ZWFzb25zIG5ld2NvbWVycyBnaXZlIHVwIG9uIE9DYW1sPzwvYT4gSeKAmW0gbm90IHN1cmUgdGhh dCB1c2FnZSBvZiBPQ2FtbCBsaW50ZXIgZm9yIG5vbi10ZWFjaGluZyBwdXJwb3NlcyBpcyB3aXNl LCBidXQgaWYgbXkgd29yayB3aWxsIGdhaW4gc29tZSB0cmFjdGlvbiwgbm9ib2R5IHdpbGwgYmUg YWJsZSB0byBhY2N1c2UgT0NhbWwgdGhhdCBpdCBkb2VzbuKAmXQgaGF2ZSBhIGxpbnRlci4NCjwv cD4NCjxwPlF1ZXN0aW9ucywgdXNlciByZXBvcnRzIGFuZCBQUnMgd2lsbCBiZSBhcHByZWNpYXRl ZC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWlu ZXItb3JnYTk5ZDNiYiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZ2E5OWQzYmIiPk9s ZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZ2E5OWQz YmIiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1h aWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8 L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhy ZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4g b3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3Mi PlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNo IHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBo cmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4N Cm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmc5OGM2OTI1 Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1p dHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9o dG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23 via Mailbox Transport; Tue, 21 Mar 2023 10:08:28 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.23; Tue, 21 Mar 2023 10:08:28 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.23 via Frontend Transport; Tue, 21 Mar 2023 10:08:28 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32LA7fRs009096 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 21 Mar 2023 10:07:41 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32LA7VZO009070 for ; Tue, 21 Mar 2023 10:07:32 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Mar 2023 11:07:30 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 101F4E02E4; Tue, 21 Mar 2023 11:07:31 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 1D50DE0131 for ; Tue, 21 Mar 2023 11:07:28 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Mar 2023 11:07:06 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3DF41564873; Tue, 21 Mar 2023 11:07:04 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZW90VXEK3YeTfOkuYZFaFqXG9jg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 21 Mar 2023 10:07:03 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 06a8ee0f-1113-4044-d5a7-08db29f43761 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,278,1673910000"; d="scan'208,217";a="50787032" x-spam-flag: No, tests=bogofilter, spamicity=0.339676, queueID=9E9A7564877 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMy0yMSBUdWUgMTE6MDYgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDMuMTQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMy4yOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1hcmNoIDE0IHRvIDIxLCAyMDIzLiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPkpzX29mX29jYW1sIDUuMTwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzIiPlBldHJvbCAxLjIuMCByZWxlYXNlIC0gUG9zdGdyZXMgU3VwcG9y dCAmIzQzOyBVc2VyLWV4dGVuc2libGUgdHlwZXM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjMyI+ RG9jZmQ6IFRVSSBmdXp6eSBkb2N1bWVudCBmaW5kZXIgMC4yLjM8L2E+IDwvbGk+PGxpPjxhIGhy ZWY9IiM0Ij5PQ2FtbG90IC0gQWN0aXZpdHlwdWIgc2VydmVyIHdyaXR0ZW4gaW4gT0NhbWw8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5uZXcgdmVyc2lvbnMgb2YgVlMgQ29kZSBleHRlbnNpb25z IEFsY290ZXN0IGFuZCBFeHBlY3QgYW5kIElubGluZSB0ZXN0cywgbm93IG9uIE9wZW4gVlNYIHRv bzwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM2Ij5BdXRvZm9uY2UsIGEgbW9kZXJuIHJ1bm5lciBm b3IgR05VIEF1dG90ZXN0cyBzdWl0ZXM8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5SZWxlYXNl IG9mIHBpZWNlX3JvcGUgMC45LjA8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc1N2MwOTRiIj5P bGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEiPkpzX29mX29jYW1sIDUu MTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpzLW9mLW9jYW1s LTUtMS8xMTY2Mi8xIj5odHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpzLW9mLW9jYW1s LTUtMS8xMTY2Mi8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdiNDFjNDA3IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYjQxYzQwNyI+SGh1 Z28gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1v cmdiNDFjNDA3Ij4NCjxwPknigJltIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Yg anNfb2Zfb2NhbWwgNS4xLiBJdCBzaG91bGQgc29vbiBiZSBhYmxlIGF2YWlsYWJsZSBpbiBvcGFt Lg0KPC9wPg0KPHA+SnNfb2Zfb2NhbWwgaXMgYSBjb21waWxlciBmcm9tIE9DYW1sIGJ5dGVjb2Rl IHRvIEphdmFTY3JpcHQuIEl0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJ1biBwdXJlIE9DYW1sIHBy b2dyYW1zIGluIEphdmFTY3JpcHQgZW52aXJvbm1lbnQgbGlrZSBicm93c2VycyBhbmQgTm9kZS5q cy4NCjwvcD4NCjxwPlRoaXMgcmVsZWFzZSBpbmNsdWRlcyBtYW55IHNpZ25pZmljYW50IGNoYW5n ZXMuIEhlcmUgYXJlIHNvbWUgb2YgdGhlIG5vdGFibGUgb25lczoNCjwvcD4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT5Kc19vZl9vY2FtbCBub3cgdW5kZXJzdGFuZHMgbW9zdCA8Y29kZT5lczY8 L2NvZGU+IGZlYXR1cmVzIChidXQgPGNvZGU+aW1wb3J0PC9jb2RlPiBhbmQNCjxjb2RlPmV4cG9y dDwvY29kZT4pIDwvbGk+PGxpPkphdmFTY3JpcHQgZmlsZXMgZ2VuZXJhdGVkIGJ5IGpzX29mX29j YW1sIGFyZSBub3cgVVRGLTggZW5jb2RlZC4gPC9saT48bGk+Q2hhbmdlIHRoZSBtZW1vcnkgcmVw cmVzZW50YXRpb24gb2YgT0NhbWwgc3RyaW5ncyB0byB1c2UgSlMgb25lcy4gU3RyaW5nIHN0aWxs IHJlcHJlc2VudCBzZXF1ZW5jZXMgb2YgYnl0ZXMgYW5kIG9ubHkgY29udGFpbnMgY29kZXBvaW50 cyBpbiB0aGUgcmFuZ2UNCjxjb2RlPlswLTI1NV08L2NvZGU+LiA8L2xpPjxsaT5JbXByb3ZlZCBz dXBwb3J0IGZvciBPQ2FtbCA1IGVmZmVjdHMsIHBlcmZvcm1pbmcgcGFydGlhbCBDUFMgdHJhbnNm b3JtYXRpb24gdG8gc2lnbmlmaWNhbnRseSBpbXByb3ZlIHBlcmZzIChzZWUNCjxhIGhyZWY9Imh0 dHA6Ly9vY3NpZ2VuLm9yZy9qc19vZl9vY2FtbC81LjEuMC9tYW51YWwvcGVyZm9ybWFuY2VzIj5o dHRwOi8vb2NzaWdlbi5vcmcvanNfb2Zfb2NhbWwvNS4xLjAvbWFudWFsL3BlcmZvcm1hbmNlczwv YT4pDQo8L2xpPjxsaT5WYXJpb3VzIGltcHJvdmVtZW50cyB0byBtYWtlIHRoZSBjb21waWxlciBm YXN0ZXIuIDwvbGk+PGxpPlNlcGFyYXRlIGNvbXBpbGF0aW9uIG9ubHkgbGluayBjb21waWxhdGlv biB1bml0cyB0aGF0IGFyZSBuZWVkZWQsIHNpbWlsYXIgdG8gPGNvZGU+DQpvY2FtbGM8L2NvZGU+ LCBhbmQgZ2VuZXJhdGUgbXVjaCBzbWFsbGVyIGpzIGZpbGVzIDwvbGk+PC91bD4NCjxwPlNlZSB0 aGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vanNfb2Zfb2NhbWwvYmxvYi9t YXN0ZXIvQ0hBTkdFUy5tZCI+DQpDaGFuZ2Vsb2c8L2E+IGZvciBvdGhlciBjaGFuZ2VzLiA8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+UGV0cm9sIDEuMi4wIHJlbGVhc2UgLSBQb3N0 Z3JlcyBTdXBwb3J0ICYjNDM7IFVzZXItZXh0ZW5zaWJsZSB0eXBlczwvaDI+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXBldHJvbC0xLTItMC1yZWxlYXNlLXBvc3RncmVz LXN1cHBvcnQtdXNlci1leHRlbnNpYmxlLXR5cGVzLzExNjkxLzEiPg0KaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1wZXRyb2wtMS0yLTAtcmVsZWFzZS1wb3N0Z3Jlcy1zdXBwb3J0LXVz ZXItZXh0ZW5zaWJsZS10eXBlcy8xMTY5MS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmcyZDgxZWQzIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnMmQ4MWVkMyI+S2lyYW4gR29waW5hdGhhbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzJkODFlZDMiPg0KPHA+SeKAmW0gcGxlYXNlZCB0 byBhbm5vdW5jZSB0aGUgbGF0ZXN0IHJlbGVhc2Ugb2YgUGV0cm9sIC0gPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL0dvcGlhbmRjb2RlL3BldHJvbCI+DQpBIGhpZ2ggbGV2ZWwgdHlwZWQgU1FM IEFQSSBmb3IgT0NhbWw8L2E+IChpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBwdWJsaXNoZWQgdG8g b3BhbSkuDQo8L3A+DQo8cD5UaGlzIGxhdGVzdCByZWxlYXNlIGlzIGV4Y2l0aW5nIGFzIGl0IG5v dyBhZGRzIFBvc3RncmVzcWwgc3VwcG9ydCAocHJldmlvdXNseSBQZXRyb2wgb25seSBzdXBwb3J0 ZWQgU3FsaXRlMykuDQo8L3A+DQo8cD5QZXRyb2wgbWFrZXMgdXNpbmcgU1FMIGZyb20gT0NhbWwg YSBicmVlemU6IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xh c3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWln aHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5QZXRy b2w8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xk OyI+b3BlbiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UGV0cm9sLlNxbGl0 ZTM8L3NwYW4+DQoNCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRh bGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTog aXRhbGljOyI+ZGVmaW5lIGEgbmV3IHNjaGVtYTwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4 ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xv cjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPnNjaGVtYTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5TdGF0aWNTY2hlbWEuPC9zcGFuPmluaXQgKCkNCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj OGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4oKiA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9y OiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij5kZWNsYXJlIGEgdGFibGU8L3NwYW4+PHNw YW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gKik8L3NwYW4+ DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5leGFtcGxlX3RhYmxlPC9zcGFuPiwg PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+RXhwci48L3NwYW4+WzxzcGFuIHN0eWxlPSJj b2xvcjogIzAwN2E5ZjsiPm5hbWU8L3NwYW4+OyA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5hZ2U8L3NwYW4+XSA9DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+U3RhdGlj U2NoZW1hLjwvc3Bhbj5kZWNsYXJlX3RhYmxlIHNjaGVtYSA8c3BhbiBzdHlsZT0iY29sb3I6ICMw MDgyNGY7Ij5+bmFtZTwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7 ZXhhbXBsZSZxdW90Ozwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5T Y2hlbWEuPC9zcGFuPlsNCiAgICAgICAgZmllbGQgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAw OyI+JnF1b3Q7bmFtZSZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+ fnR5PC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5UeXBlLjwvc3Bhbj50ZXh0 Ow0KICAgICAgICBmaWVsZCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDthZ2Um cXVvdDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn50eTwvc3Bhbj46PHNw YW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VHlwZS48L3NwYW4+aW50DQogICAgXQ0KPC9wcmU+ DQo8L2Rpdj4NCjxwPmFuZCBoZXJl4oCZcyBob3cgeW91IHdyaXRlIHF1ZXJpZXM6IDwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Y3Jl YXRlIGEgcXVlcnk8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjOGY2ZjRhOyBmb250LXN0eWxl OiBpdGFsaWM7Ij4gKik8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNzYwMWY7Ij5p bnNlcnRfcGVyc29uPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+bmFtZTwv c3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+bjwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA4MjRmOyI+fmFnZTwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlm OyI+YTwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+ZGI8L3NwYW4+ID0NCiAg ICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5RdWVyeS48L3NwYW4+aW5zZXJ0IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn50YWJsZTwvc3Bhbj46ZXhhbXBsZV90YWJsZQ0KICAg ICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+dmFsdWVzPC9zcGFuPjo8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5FeHByLjwvc3Bhbj5bDQogICAgICAgICAgICBuYW1lIDo9 IHMgbjsNCiAgICAgICAgICAgIGFnZSA6PSBpIGENCiAgICAgICAgIF0NCiAgICA8c3BhbiBzdHls ZT0iY29sb3I6ICNhNTJhMmE7Ij58Jmd0Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0 ZmNmOyI+UmVxdWVzdC48L3NwYW4+bWFrZV96ZXJvDQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAj YTUyYTJhOyI+fCZndDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlBldHJv bC48L3NwYW4+ZXhlYyBkYg0KPC9wcmU+DQo8L2Rpdj4NCjxwPlBldHJvbCBjb21waWxlcyBkb3du IHRvIENhcXRpIHF1ZXJpZXMgdW5kZXIgdGhlIGhvb2QsIGFuZCBjb21lcyB3aXRoIGEgbmlmdHkg bWlncmF0aW9uIHN5c3RlbSBidWlsdC1pbiwgc28geW91IGNhbiBzZWFtbGVzbHkgdXBkYXRlIHlv dXIgZGF0YWJhc2UgdGFibGVzIHdpdGhvdXQgZGlzcnVwdGluZyBlbmQgdXNlcnM6DQo8L3A+DQo8 ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1s Ij48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPigqIDwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPmRl Y2xhcmUgYSB0YWJsZSB3aXRoIGEgbWlncmF0aW9uIGZvciBhIG5ldyBbYWdlXSBjb2x1bW4gaW4g dmVyc2lvbiAxLjIuMDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5 bGU6IGl0YWxpYzsiPiAqKTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5Zjsi PnQ8L3NwYW4+LCA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5FeHByLjwvc3Bhbj5bPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+aWQ8L3NwYW4+OzxzcGFuIHN0eWxlPSJjb2xvcjog IzAwN2E5ZjsiPmFnZTwvc3Bhbj47PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+dXJsPC9z cGFuPl0gPQ0KICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+VmVyc2lvbmVkU2NoZW1h Ljwvc3Bhbj5kZWNsYXJlX3RhYmxlIGRiIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5u YW1lPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtwZXJzb24mcXVv dDs8L3NwYW4+DQogICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlNjaGVtYS48L3Nw YW4+Ww0KICAgICAgIGZpZWxkIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5jb25zdHJh aW50czwvc3Bhbj46W3ByaW1hcnlfa2V5IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5u YW1lPC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtib29rbWFya19p ZCZxdW90Ozwvc3Bhbj4gKCldIDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O2lk JnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+dHk8L3NwYW4+Ojxz cGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPlR5cGUuPC9zcGFuPmludDsNCiAgICAgICBmaWVs ZCA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDthZ2UmcXVvdDs8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn50eTwvc3Bhbj46PHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+VHlwZS48L3NwYW4+aW50Ow0KICAgICAgIGZpZWxkIDxzcGFuIHN0eWxlPSJj b2xvcjogI2NhMzQwMDsiPiZxdW90O3VybCZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjMDA4MjRmOyI+fnR5PC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5UeXBl Ljwvc3Bhbj50ZXh0Ow0KICAgICBdDQogICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0Zjsi Pn5taWdyYXRpb25zPC9zcGFuPjpbdl8xXzJfMCwgWw0KICAgICAgIDxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPkNhcXRpX3JlcXVlc3QuSW5maXguPC9zcGFuPig8c3BhbiBzdHlsZT0iY29s b3I6ICM0NDRmY2Y7Ij5DYXF0aV90eXBlLjwvc3Bhbj51bml0IC0mZ3Q7LiA8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5DYXF0aV90eXBlLjwvc3Bhbj51bml0KQ0KICAgICAgICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+e3NxbHxBTFRFUiBUQUJMRSBwZXJzb24gQUREIENPTFVN TiBhZ2UgSU5URUdFUiBERUZBVUxUIDEwMDB8c3FsfTwvc3Bhbj4NCiAgICAgXV0NCjwvcHJlPg0K PC9kaXY+DQo8cD5UaGlzIGFuZCBtb3JlIGlzIGV4cGxhaW5lZCBpbiB0aGUgZG9jdW1lbnRhdGlv biwgYWxvbmcgd2l0aCBhIG5pZnR5IHF1aWNrLXN0YXJ0ZXIgZ3VpZGU6DQo8YSBocmVmPSJodHRw czovL2dvcGlhbmRjb2RlLmdpdGh1Yi5pby9wZXRyb2wvcGV0cm9sL2luZGV4Lmh0bWwiPmh0dHBz Oi8vZ29waWFuZGNvZGUuZ2l0aHViLmlvL3BldHJvbC9wZXRyb2wvaW5kZXguaHRtbDwvYT4NCjwv cD4NCjxwPknigJl2ZSBzcGVudCBzb21lIHRpbWUgdHVuaW5nIHRoZSBkb2N1bWVudGF0aW9uIHRv IG1ha2UgaXQgZWFzeSB0byBwaWNrIHVwISA8L3A+DQo8cD5Zb3UgbWF5IGFsc28gd2FudCB0byBj aGVjayBvdXQgdGhlIHRlc3RzIHRvIHNlZSBpdCBpbiBhY3Rpb246IDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9Hb3BpYW5kY29kZS9wZXRyb2wvdHJlZS9tYXN0ZXIvdGVzdCI+DQpodHRwczov L2dpdGh1Yi5jb20vR29waWFuZGNvZGUvcGV0cm9sL3RyZWUvbWFzdGVyL3Rlc3Q8L2E+IDwvcD4N CjxwPlByZXZpb3VzIGRpc2N1c3Npb246IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tcGV0cm9sLTEtMC0wLWEtaGlnaC1sZXZlbC10eXBlZC1zcWwtYXBpLWZvci1vY2Ft bC1kZXNpZ25lZC10by1nby1mYXN0LzExMTY2Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tcGV0cm9sLTEtMC0wLWEtaGlnaC1sZXZlbC10eXBlZC1zcWwtYXBpLWZvci1vY2FtbC1k ZXNpZ25lZC10by1nby1mYXN0LzExMTY2PC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjMiPkRvY2ZkOiBUVUkgZnV6enkgZG9jdW1lbnQgZmluZGVyIDAuMi4zPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0zIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZG9jZmQtdHVpLWZ1enp5LWRvY3VtZW50 LWZpbmRlci0wLTItMy8xMTY5OC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t ZG9jZmQtdHVpLWZ1enp5LWRvY3VtZW50LWZpbmRlci0wLTItMy8xMTY5OC8xPC9hPg0KPC9wPg0K PC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc0NGIxYzk0IiBjbGFzcz0ib3V0 bGluZS0zIj4NCjxoMyBpZD0ib3JnNDRiMWM5NCI+RGFycmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNDRiMWM5NCI+DQo8cD5J4oCZbSBo YXBweSB0byBzaGFyZSBEb2NmZCwgYW4gaW50ZXJhY3RpdmUgVFVJIHRvb2wgZmluZGluZyB0aGUg dGV4dCBmaWxlIHlvdSBuZWVkIHF1aWNrbHkuDQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhcnJlbmxkbC9kb2NmZCI+UmVwbzwvYT4g PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2RhcnJlbmxkbC9kb2NmZC9yZWxl YXNlcy90YWcvMC4yLjMiPlN0YXRpY2FsbHkgbGlua2VkIGJpbmFyeTwvYT4NCjwvbGk+PC91bD4N CjxwPihXaWxsIHN1Ym1pdCB0byBvcGFtIHdoZW4gdGltZSBmcmVlcyB1cCBhIGJpdC4pIDwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnN2EzZThlYyIgY2xhc3M9Im91 dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzdhM2U4ZWMiPlNjcmVlbnNob3RzIGFuZCBpbnRlcmZhY2U8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzdhM2U4ZWMiPg0K PHA+U2VhcmNoaW5nIDxjb2RlPmxlZnQgaXM8L2NvZGU+IGluIHRoZSByZXBvIHJvb3QgPC9wPg0K PGRpdiBpZD0ib3JnNjRlNTk0ZiIgY2xhc3M9ImZpZ3VyZSI+DQo8cD48aW1nIHNyYz0iaHR0cHM6 Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwvb3JpZ2lu YWwvMlgvOS85YWZhZDgwNWYyYjY0N2M5MjI5MTE2YjdiNzY0ODEwNWJjYjg0YTllLnBuZyIgYWx0 PSI5YWZhZDgwNWYyYjY0N2M5MjI5MTE2YjdiNzY0ODEwNWJjYjg0YTllLnBuZyI+DQo8L3A+DQo8 L2Rpdj4NCjxwPlNlYXJjaGluZyA8Y29kZT5bZ2l0aHViXTwvY29kZT4gaW4gdGhlIHJlcG8gcm9v dCA8L3A+DQo8ZGl2IGlkPSJvcmc0YTNiMGUyIiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3Jj PSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2Ft bC9vcmlnaW5hbC8yWC85Lzk2MjNkMjU5Yzg5YmJhYWY1ZmViMTA5YTQyZmFmN2UxZGRlNjAxMGYu cG5nIiBhbHQ9Ijk2MjNkMjU5Yzg5YmJhYWY1ZmViMTA5YTQyZmFmN2UxZGRlNjAxMGYucG5nIj4N CjwvcD4NCjwvZGl2Pg0KPHA+VGhlIFRVSSBpcyBkaXZpZGVkIGludG8gdGhyZWUgc2VjdGlvbnM6 IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5MZWZ0IGlzIHRoZSBsaXN0IG9mIGRvY3Vt ZW50cyB3aGljaCBzYXRpc2Z5IHRoZSBzZWFyY2ggY29uc3RyYWludHMgPC9saT48bGk+VG9wIHJp Z2h0IGlzIHRoZSBwcmV2aWV3IG9mIHRoZSBkb2N1bWVudCA8L2xpPjxsaT5Cb3R0b20gcmlnaHQg aXMgdGhlIHJhbmtlZCBjb250ZW50IHNlYXJjaCByZXN1bHQgbGlzdCA8L2xpPjxsaT5Cb3R0b20g YmFyIGlzIHRoZSBzZWFyY2ggaW50ZXJmYWNlIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2MWE2NmFmIiBjbGFzcz0ib3V0bGluZS00Ij4N CjxoNCBpZD0ib3JnNjFhNjZhZiI+Q29udHJvbHM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZzYxYTY2YWYiPg0KPHA+RG9jZmQgb3BlcmF0ZXMgaW4gbW9kZXMs IHRoZSBpbml0aWFsIG1vZGUgaXMgPGNvZGU+TkFWSUdBVElPTjwvY29kZT4gbW9kZSA8L3A+DQo8 cD48Y29kZT5OQVZJR0FUSU9OPC9jb2RlPiBtb2RlIDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5TY3JvbGwgZG93biB0aGUgZG9jdW1lbnQgbGlzdA0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPjxjb2RlPmo8L2NvZGU+IG9yIGRvd24gYXJyb3cgPC9saT48bGk+U2Nyb2xsIGRvd24gd2l0 aCBtb3VzZSB3aGVlbCB3aGVuIGhvdmVyaW5nIGFib3ZlIHRoZSBhcmVhIDwvbGk+PC91bD4NCjwv bGk+PGxpPlNjcm9sbCB1cCB0aGUgZG9jdW1lbnQgbGlzdA0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPjxjb2RlPms8L2NvZGU+IG9yIHVwIGFycm93IDwvbGk+PGxpPlNjcm9sbCB1cCB3aXRoIG1v dXNlIHdoZWVsIHdoZW4gaG92ZXJpbmcgYWJvdmUgdGhlIGFyZWEgPC9saT48L3VsPg0KPC9saT48 bGk+U2Nyb2xsIGRvd24gdGhlIGNvbnRlbnQgc2VhcmNoIHJlc3VsdCBsaXN0DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+PGNvZGU+U2hpZnR+JiM0Mzt+ajwvY29kZT4gb3IgflNoaWZ0fiYjNDM7 RG93biBhcnJvdyA8L2xpPjxsaT5TY3JvbGwgZG93biB3aXRoIG1vdXNlIHdoZWVsIHdoZW4gaG92 ZXJpbmcgYWJvdmUgdGhlIGFyZWEgPC9saT48L3VsPg0KPC9saT48bGk+U2Nyb2xsIHVwIHRoZSBk b2N1bWVudCBsaXN0DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGNvZGU+U2hpZnR+JiM0Mzt+ azwvY29kZT4gb3IgflNoaWZ0fiYjNDM7VXAgYXJyb3cgPC9saT48bGk+U2Nyb2xsIHVwIHdpdGgg bW91c2Ugd2hlZWwgd2hlbiBob3ZlcmluZyBhYm92ZSB0aGUgYXJlYSA8L2xpPjwvdWw+DQo8L2xp PjxsaT5PcGVuIGRvY3VtZW50DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGNvZGU+RW50ZXI8 L2NvZGU+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+RG9jZmQgdHJpZXMgdG8gdXNlIDxjb2Rl PiRWSVNVQUw8L2NvZGU+IGZpcnN0LCBpZiB0aGF0IGZhaWxzIHRoZW4gRG9jZmQgdHJpZXMNCjxj b2RlPiRFRElUT1I8L2NvZGU+IDwvbGk+PC91bD4NCjwvbGk+PC91bD4NCjwvbGk+PGxpPlN3aXRj aCB0byA8Y29kZT5DT05URU5UIFNFQVJDSDwvY29kZT4gbW9kZQ0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPjxjb2RlPi88L2NvZGU+IDwvbGk+PC91bD4NCjwvbGk+PGxpPkV4aXQgRG9jZmQNCjx1 bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48Y29kZT5xPC9jb2RlPiBvciA8Y29kZT5DdHJsJiM0Mztj PC9jb2RlPiA8L2xpPjwvdWw+DQo8L2xpPjwvdWw+DQo8cD48Y29kZT5DT05URU5UIFNFQVJDSDwv Y29kZT4gbW9kZSA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q29udGVudCBzZWFyY2gg ZmllbGQgaXMgYWN0aXZlIGluIHRoaXMgbW9kZSA8L2xpPjxsaT48Y29kZT5FbnRlcjwvY29kZT4g dG8gY29uZmlybSBzZWFyY2ggY29uc3RyYWludHMgYW5kIGV4aXQgc2VhcmNoIG1vZGUgPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg2YWVj NWIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc4NmFlYzViIj5MaW1pdGF0aW9uczwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnODZhZWM1YiI+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+RG9jZmQgaXMgZm9jdXNlZCBvbiB0eXBpY2FsIGRlc2t0 b3AgdXNlLCBzbyBzaW1wbGljaXR5IG9mIGNvbXBvbmVudHMgaXMgb2Z0ZW4gZmF2b3VyZWQgb3Zl ciBzdHJpY3QgcGVyZm9ybWFuY2UNCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UaGF0IGJlaW5n IHNhaWQsIHRoZSBpbi1tZW1vcnkgaW5kZXggYW5kIHNlYXJjaCBzaG91bGQgc3RpbGwgYmUgcGVy Zm9ybWFudCBlbm91Z2gNCjwvbGk+PC91bD4NCjwvbGk+PGxpPk5vIG9uLWRpc2sgaW5kZXggaXMg YnVpbHQgPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+T0Nh bWxvdCAtIEFjdGl2aXR5cHViIHNlcnZlciB3cml0dGVuIGluIE9DYW1sPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWxvdC1hY3Rpdml0eXB1Yi1zZXJ2ZXIt d3JpdHRlbi1pbi1vY2FtbC8xMTY5OS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWxvdC1hY3Rpdml0eXB1Yi1zZXJ2ZXItd3JpdHRlbi1pbi1vY2FtbC8xMTY5OS8xPC9h Pg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczZjFjY2Y5IiBj bGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnM2YxY2NmOSI+S2lyYW4gR29waW5hdGhhbiBh bm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzNm MWNjZjkiPg0KPHA+SeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBhIHBy b2plY3QgdGhhdCBJ4oCZdmUgYmVlbiB3b3JraW5nIG9uLCBvbi1hbmQtb2ZmIGZvciBhIHdoaWxl IG5vdzogYW4gYWN0aXZpdHlwdWIgc2VydmVyIGluIE9DYW1sIOKAlCBPQ2FtbG90Lg0KPC9wPg0K PHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL0dvcGlhbmRjb2RlL29jYW1sb3QiPmh0dHBz Oi8vZ2l0aHViLmNvbS9Hb3BpYW5kY29kZS9vY2FtbG90PC9hPg0KPC9wPg0KPHA+SXTigJlzIHdp bGRseSBpbmNvbXBsZXRlLCBhbmQgY3VycmVudGx5IG9ubHkgdGhlIGJhcmUtYm9uZXMgbWluaW11 bSB0byBiZSBhIGNvbnNpZGVyZWQgYW4gYWN0aXZpdHlwdWIgc2VydmVyLCBidXQgaXTigJlzIGNv bWluZyBhbG9uZyBuaWNlbHkuDQo8L3A+DQo8cD5DdXJyZW50bHkgaXQgc3VwcG9ydHM6IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5wcm9maWxlcywgY3VzdG9tIHByb2ZpbGUgcGljdHVy ZXMsIGFib3V0IDwvbGk+PGxpPmxpa2VzLCByZXBvc3RzIDwvbGk+PGxpPnJlcGxpZXMgPC9saT48 L3VsPg0KPHA+YW5kIHRoYXTigJlzIGFsbC4gPC9wPg0KPHA+U29tZSBzY3JlZW5zaG90czogPC9w Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkZlZWQgPGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFs LmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC82 LzY1ZThjYmIyOTFjOTNmNmJiMTU5MmU3YWJhODYxYTA5ODc5NTU5YTlfMl8xMDM0eDQ4NC5wbmci IGFsdD0iNjVlOGNiYjI5MWM5M2Y2YmIxNTkyZTdhYmE4NjFhMDk4Nzk1NTlhOV8yXzEwMzR4NDg0 LnBuZyI+DQo8L2xpPjxsaT5Xcml0aW5nIHJlcGxpZXM6IDxpbWcgc3JjPSJodHRwczovL2dsb2Jh bC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgv Yi9iZTUwYzEyOTNhYjlmZDQyNGMxMGI1ODU1YTBhYjA0MDI2OTVlNTZjXzJfMTAzNHg0MzAucG5n IiBhbHQ9ImJlNTBjMTI5M2FiOWZkNDI0YzEwYjU4NTVhMGFiMDQwMjY5NWU1NmNfMl8xMDM0eDQz MC5wbmciPg0KPC9saT48bGk+TGlzdGluZyB1c2VyczogPGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFs LmRpc2NvdXJzZS1jZG4uY29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC84 Lzg2MWMwNmQ5NjMyMGQ4MGRmN2NkZmNlMzM4MjVhYjNkZDkxMWE3YzhfMl8xMDM0eDIxNC5wbmci IGFsdD0iODYxYzA2ZDk2MzIwZDgwZGY3Y2RmY2UzMzgyNWFiM2RkOTExYTdjOF8yXzEwMzR4MjE0 LnBuZyI+DQo8L2xpPjxsaT5Qcm9maWxlIHBhZ2U6IDxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5k aXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvYy9j YTVkMTg1NzlhZjM4ZDQ0YzU3ZmIyZDFhODEzY2E1Y2E1YWM4NWMzXzJfMTAzNHgzODYucG5nIiBh bHQ9ImNhNWQxODU3OWFmMzhkNDRjNTdmYjJkMWE4MTNjYTVjYTVhYzg1YzNfMl8xMDM0eDM4Ni5w bmciPg0KPC9saT48bGk+UG9zdCByZXBsaWVzIDxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNj b3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvMC8wNzlm NDdiMzFmZDhmNTRiZjNkNGZjMTk0MzY2MmZiNDQzNTVhZjE5XzJfMTAzNHgzOTgucG5nIiBhbHQ9 IjA3OWY0N2IzMWZkOGY1NGJmM2Q0ZmMxOTQzNjYyZmI0NDM1NWFmMTlfMl8xMDM0eDM5OC5wbmci Pg0KPC9saT48L3VsPg0KPHA+Tm93LCB0aGUgdGhpbmdzIHRoYXQgdGhpcyBjb21tdW5pdHkgd291 bGQgY2FyZSBhYm91dDogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBzZXJ2ZXIg aXMgaW1wbGVtZW50ZWQgdXNpbmcgZHJlYW06IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9H b3BpYW5kY29kZS9vY2FtbG90L2Jsb2IvbWFzdGVyL2xpYi9zZXJ2ZXIvc2VydmVyLm1sIj4NCmh0 dHBzOi8vZ2l0aHViLmNvbS9Hb3BpYW5kY29kZS9vY2FtbG90L2Jsb2IvbWFzdGVyL2xpYi9zZXJ2 ZXIvc2VydmVyLm1sPC9hPiA8L2xpPjxsaT5UaGUgdW5kZXJseWluZyBkYXRhYmFzZSBpcyBQb3N0 Z3JlcyAob3IgU3FsaXRlKSwgYWNjZXNzZWQgZnJvbSBPQ2FtbCB1c2luZyBDYXF0aSAmIzQzOw0K PGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wZXRyb2wtMS0yLTAtcmVs ZWFzZS1wb3N0Z3Jlcy1zdXBwb3J0LXVzZXItZXh0ZW5zaWJsZS10eXBlcy8xMTY5MSI+DQpQZXRy b2w8L2E+OiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vR29waWFuZGNvZGUvb2NhbWxvdC9i bG9iL21hc3Rlci9saWIvZGF0YWJhc2UvdGFibGVzLm1sIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9H b3BpYW5kY29kZS9vY2FtbG90L2Jsb2IvbWFzdGVyL2xpYi9kYXRhYmFzZS90YWJsZXMubWw8L2E+ IDwvbGk+PGxpPkluZ2VzdGluZyBhbmQgcHJvZHVjaW5nIGFjdGl2aXR5cHViIGVudGl0aWVzIGlz IGRvbmUgdXNpbmcgdGhlIGRlY29kZXJzIGxpYnJhcnk6DQo8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vR29waWFuZGNvZGUvb2NhbWxvdC9ibG9iL21hc3Rlci9saWIvYWN0aXZpdHlwdWIvdHlw ZXMubWwiPg0KaHR0cHM6Ly9naXRodWIuY29tL0dvcGlhbmRjb2RlL29jYW1sb3QvYmxvYi9tYXN0 ZXIvbGliL2FjdGl2aXR5cHViL3R5cGVzLm1sPC9hPiA8L2xpPjxsaT5SZW5kZXJpbmcgaXMgYWxs IGRvbmUgc2VydmVyLXNpZGUgdXNpbmcgdHl4bWw6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9Hb3BpYW5kY29kZS9vY2FtbG90L3RyZWUvbWFzdGVyL2xpYi92aWV3Ij4NCmh0dHBzOi8vZ2l0 aHViLmNvbS9Hb3BpYW5kY29kZS9vY2FtbG90L3RyZWUvbWFzdGVyL2xpYi92aWV3PC9hPiA8L2xp PjwvdWw+DQo8cD5TZWVpbmcgYXMgdGhlcmUgaGFzIGJlZW4gc29tZSBpbnRlcmVzdCBpbiB0aGlz IGNvbW11bml0eSByZWNlbnRseSBhYm91dCBhY3Rpdml0eXB1YiBpbnRlZ3JhdGlvbiBpbiBPQ2Ft bCwgSSBmaWd1cmVkIHRoaXMgbWlnaHQgYmUgaW50ZXJlc3RpbmcuDQo8L3A+DQo8cD5JIGhhdmUg YW4gaW5zdGFuY2UgcnVubmluZyBvbiBvdmVyIGF0IDxhIGhyZWY9Imh0dHBzOi8vb2NhbWxvdC54 eXoiPmh0dHBzOi8vb2NhbWxvdC54eXo8L2E+IOKAkyBhcyBhIHdhcm5pbmcsIEnigJl2ZSBkb25l IG1vc3Qgb2YgbXkgdGVzdGluZyBsb2NhbGx5IHVzaW5nIHBsZXJvbWEsIHNvIHRoZXJlIG1heSBi ZSBzb21lIHNsaWdodCBpc3N1ZXMgaW50ZXJhY3Rpbmcgd2l0aCBvdGhlciBzZXJ2ZXIgaW1wbGVt ZW50YXRpb25zIGF0IHRoZSBtb21lbnQuDQo8L3A+DQo8cD5BbHNvIHdvdWxkIGJlIGhhcHB5IHRv IGZpZWxkIGFueSBxdWVzdGlvbnMgcmVnYXJkaW5nIG5hdmlnYXRpbmcgdGhlIGFjdGl2aXR5cHVi IHNwZWMgYXMgd2VsbC4gSSBwbGFuIHRvIHdyaXRlIHVwIG15IGV4cGVyaWVuY2VzIHNvbWV3aGVy ZSBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNSI+bmV3IHZlcnNpb25zIG9mIFZTIENvZGUgZXh0ZW5zaW9ucyBBbGNvdGVzdCBhbmQg RXhwZWN0IGFuZCBJbmxpbmUgdGVzdHMsIG5vdyBvbiBPcGVuIFZTWCB0b288L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1uZXctdmVyc2lvbnMtb2YtdnMtY29kZS1l eHRlbnNpb25zLWFsY290ZXN0LWFuZC1leHBlY3QtaW5saW5lLXRlc3RzLW5vdy1vbi1vcGVuLXZz eC10b28vMTE3MDAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy12ZXJz aW9ucy1vZi12cy1jb2RlLWV4dGVuc2lvbnMtYWxjb3Rlc3QtYW5kLWV4cGVjdC1pbmxpbmUtdGVz dHMtbm93LW9uLW9wZW4tdnN4LXRvby8xMTcwMC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNTZhYjgwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnMjU2YWI4MCI+Um9sYW5kIENzYXN6YXIgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyNTZhYjgwIj4NCjxwPknigJl2ZSBqdXN0IHVw ZGF0ZWQgYm90aCBWUyBDb2RlIHRlc3RpbmcgZXh0ZW5zaW9ucywgYXMgb2Ygbm93IHRoZXkgYXJl IGF2YWlsYWJsZSBhdCB0aGUgT3BlbiBWU1ggUmVnaXN0cnkgdG9vLg0KPC9wPg0KPHA+QnVnZml4 ZXM6IFRoZSBPcGFtIGVudmlyb25tZW50IG9mIHRoZSBwcm9qZWN04oCZcyByb290IGlzIHVzZWQs IHNvIHRoZSBEdW5lIGV4ZWN1dGFibGUgaW4gdGhlIHNhbmRib3ggb2YgdGhlIHByb2plY3QgZGly ZWN0b3J5IGlzIHVzZWQgYnkgZGVmYXVsdCBpZiBzdWNoIGEgc2FuZGJveCBleGlzdHMuIE90aGVy d2lzZSB0aGUgZW52aXJvbm1lbnQgb2YgdGhlIGN1cnJlbnQgT3BhbSBzd2l0Y2guIElmIER1bmUg ZG9lcyBub3Qgd29yayAoYSBjYWxsDQogb2YgPGNvZGU+ZHVuZSAtLXZlcnNpb248L2NvZGU+IGZh aWxzKSwgYW4gZXJyb3IgbWVzc2FnZSBib3ggaXMgZGlzcGxheWVkLiA8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzIzYzBjZTAiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmcyM2MwY2UwIj5FeHBlY3QgJmFtcDsgSW5saW5lIFBQWDwvaDQ+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMjNjMGNlMCI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29t L2l0ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1vY2FtbC1leHBlY3QtaW5s aW5lIj5WUyBNYXJrZXRwbGFjZTwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vb3Blbi12 c3gub3JnL2V4dGVuc2lvbi9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtZXhwZWN0LWlu bGluZSI+T3BlbiBWU1g8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20v UmVsZWFzZS1DYW5kaWRhdGUvdnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUiPkdpdEh1YjwvYT4N CjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmc1NDllZDdkIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNTQ5ZWQ3ZCI+QWxjb3Rl c3QgJmFtcDsgSW5saW5lIEFsY290ZXN0PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00 IiBpZD0idGV4dC1vcmc1NDllZDdkIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVm PSJodHRwczovL21hcmtldHBsYWNlLnZpc3VhbHN0dWRpby5jb20vaXRlbXM/aXRlbU5hbWU9cmVs ZWFzZS1jYW5kaWRhdGUudnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+VlMgTWFy a2V0cGxhY2U8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL29wZW4tdnN4Lm9yZy9leHRl bnNpb24vUmVsZWFzZS1DYW5kaWRhdGUvdnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRl ciI+T3BlbiBWU1g8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVs ZWFzZS1DYW5kaWRhdGUvdnNjb2RlLW9jYW1sLWFsY290ZXN0LXRlc3QtYWRhcHRlciI+R2l0SHVi PC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzMwNmE2YTAiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczMDZhNmEwIj5D aGFuZ2Vsb2c8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzMw NmE2YTAiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFkZCBlcnJvciBtZXNzYWdlIHdpbmRv dyBpZiA8Y29kZT5kdW5lPC9jb2RlPiBkb2VzIG5vdCB3b3JrIGluIGEgd29ya3NwYWNlLiA8L2xp PjwvdWw+DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnNzE1ZjNl OCI+PC9hPkJ1Z2ZpeGVzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0 LW9yZzcxNWYzZTgiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlVzZSB0aGUgY3VycmVudCBP cGFtIGVudmlyb25tZW50IHRvIGJlIGFibGUgdG8gdXNlIGxvY2FsIGV4ZWN1dGFibGVzIGxpa2Ug PGNvZGU+DQpkdW5lPC9jb2RlPi4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0i b3JnNjQ0NTRjZCI+PC9hPkludGVybmFsIENoYW5nZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNSIgaWQ9InRleHQtb3JnNjQ0NTRjZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ QWRkIHRlc3RzIHRvIGNoZWNrIHRoZSBwYXJzaW5nIG9mIDxjb2RlPm9wYW0gZW52PC9jb2RlPi4g PC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i NiI+QXV0b2ZvbmNlLCBhIG1vZGVybiBydW5uZXIgZm9yIEdOVSBBdXRvdGVzdHMgc3VpdGVzPC9o Mj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6 IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hdXRvZm9uY2UtYS1tb2Rlcm4t cnVubmVyLWZvci1nbnUtYXV0b3Rlc3RzLXN1aXRlcy8xMTcyNy8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hdXRvZm9uY2UtYS1tb2Rlcm4tcnVubmVyLWZvci1nbnUtYXV0b3Rlc3Rz LXN1aXRlcy8xMTcyNy8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmdmYmQ4M2M2IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZmJkODNjNiI+ RmFicmljZSBMZSBGZXNzYW50IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnZmJkODNjNiI+DQo8cD5JIGFtIG5vdCBzdXJlIGl0IG1pZ2h0IGJl IGhlbHBmdWwgdG8gdGhlIE9DYW1sIGNvbW11bml0eSwgYXMgd2UgYWxyZWFkeSBoYXZlIHdlbGwg aW50ZWdyYXRlZCB0ZXN0IGZyYW1ld29ya3MsIGJ1dCBoZXJlIGlzIGEgdG9vbCBJIHdyb3RlIGlu IE9DYW1sIHRvIHdvcmsgd2l0aCBHTlUgcHJvamVjdHM6DQo8Y29kZT5hdXRvZm9uY2U8L2NvZGU+ IGlzIGEgbW9kZXJuIHJ1bm5lciBmb3IgdGVzdHN1aXRlcyBjcmVhdGVkIGZvciB0aGUgR05VIEF1 dG9jb25mIHRvb2xzLg0KPC9wPg0KPHA+Q29tcGFyZWQgdG8gQXV0b2NvbmYgdG9vbHMsIGl0cyBt YWluIGZlYXR1cmVzIGFyZTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPmltcHJvdmVk IHRlcm1pbmFsIG91dHB1dCA8L2xpPjxsaT5hdXRvbWF0aWMgcGFyYWxsZWwgZXhlY3V0aW9uIDwv bGk+PGxpPnByb21vdGlvbiBvZiB0ZXN0cyByZXN1bHRzIHRvIGZpeCB0ZXN0cyA8L2xpPjxsaT5l eHRlbmRlZCBzeW50YXggPC9saT48bGk+ZmlsdGVyaW5nIGJ5IGtleXdvcmRzLCBudW1iZXJzIGFu ZCByYW5nZXMgPC9saT48bGk+ZXhlY3V0aW9uIGZyb20gYW55IHByb2plY3QgZGlyZWN0b3J5IDwv bGk+PC91bD4NCjxwPkEgdHlwaWNhbCBBdXRvY29uZiB0ZXN0IGxvb2tzIGxpa2U6IDwvcD4NCjxw cmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJvcmdjNDU4YmI2Ij4NCiMgU3RhcnQgb2YgYSB0ZXN0LCBh bmQgdGhlIG5hbWUgdGhhdCB3aWxsIGJlIGRpc3BsYXllZA0KQVRfU0VUVVAoW0V4YW1wbGUgdGVz dF0pDQoNCiMgY2FuIGJlIHVzZWQgdG8gc2VsZWN0IHRlc3RzIHRvIHJ1bjoNCkFUX0tFWVdPUkRT KFtleGFtcGxlIHRlc3QgYXV0b2ZvbmNlXSkNCg0KIyBjcmVhdGUgYSBmaWxlIH5maWxlfiB3aXRo IGl0cyBjb250ZW50DQpBVF9EQVRBKFtmaWxlXSwgWw0KY29udGVudCBvZiBmaWxlDQpvbiBtdWx0 aXBsZSBsaW5lcw0KXSkNCg0KIyBjYWxsIHNvbWUgY29tbWFuZCwgY2hlY2sgaXRzIGV4aXQgY29k ZSwgc3Rkb3V0LCBzdGRlcnINCkFUX0NIRUNLKFtjYXQgZmlsZV0sIFswXSwgW3N0ZG91dCBvZiBt eSBjb21tYW5kXSwgW3N0ZGVyciBvZiBteSBjb21tYW5kXSkNCiMgeW91IGNhbiBkbyBtb3JlLCBp Z25vcmUgc29tZSByZXN1bHRzLCBydW4gbW9yZSB0ZXN0cyBpbiBjYXNlIG9mIGZhaWx1cmUsIGV0 Yy4NCg0KIyBlbmQgb2YgdGhlIHRlc3QNCkFUX0NMRUFOVVANCjwvcHJlPg0KPHA+SSBwZXJzb25h bGx5IGxpa2UgdGhlIHN5bnRheCBiZXR0ZXIgdGhhbiB0aGUgb25lIG9mIDxjb2RlPmNyYW08L2Nv ZGU+IHRlc3RzLCB0aG91Z2ggdGhlcmUgaXMgc29tZSB3ZWlyZCBlc2NhcGluZyBpc3N1ZXMgd2l0 aCBicmFja2V0cyAoc2VlIHRoZSBzZWN0aW9uIGluIHRoZSBkb2MpLg0KPC9wPg0KPHA+Q29tcGF0 aWJpbGl0eSB3aXRoIEF1dG9jb25mIGlzIG9ubHkgcGFydGlhbCwgYXMgaXQgdXNlcyBhIGdyYW1t YXIgaW50ZXJwcmV0YXRpb24gb2Ygd2hhdCBzaG91bGQgYWN0dWFsbHkgYmUNCjxjb2RlPm00PC9j b2RlPiBtYWNyb3MsIGJ1dCBpdCB3YXMgZ29vZCBlbm91Z2ggdG8gcnVuIHRoZSBmdWxsIEdudUNP Qk9MIHRlc3RzdWl0ZSBhZnRlciBhIGZldyBmaXhlcyAodGhhdCBhY3R1YWxseSBpbXByb3ZlZCB0 aGUgdGVzdHN1aXRlKS4NCjwvcD4NCjxwPlRoZSBwYWNrYWdlIGlzIG9uIE9wYW0sIGJ1dCBzb3Vy Y2VzLCBkb2N1bWVudGF0aW9uIGFuZCBzdGF0aWMgYmluYXJpZXMgYXJlIGF2YWlsYWJsZSBmcm9t IEdpdGh1YjoNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbHByby9h dXRvZm9uY2UiPmh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbHByby9hdXRvZm9uY2U8L2E+DQo8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+UmVsZWFzZSBvZiBwaWVjZV9yb3BlIDAuOS4w PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hp dmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1w aWVjZS1yb3BlLTAtOS0wLzExNzM0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1yZWxlYXNlLW9mLXBpZWNlLXJvcGUtMC05LTAvMTE3MzQvMTwvYT4gPC9wPg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdjYWVkZjVkIiBjbGFzcz0ib3V0bGluZS0zIj4N CjxoMyBpZD0ib3JnY2FlZGY1ZCI+SHVtemEgU2hhaGlkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnY2FlZGY1ZCI+DQo8cD5J4oCZbSBub3Qg c3VyZSBob3cgdXNlZnVsIHRoaXMgaXMgdG8gb3RoZXJzLCBidXQgSSBwdWJsaXNoZWQgbXkgZmly c3Qgb3BlbiBzb3VyY2UgcGFja2FnZSB0byBvcGFtIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGFueW9u ZSBpbnRlcmVzdGVkIGluIGl0Lg0KPC9wPg0KPHA+SXQgaXMgdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1 cmUgdXNlZCBmb3IgZWRpdGluZyB0ZXh0IGluIFZTIENvZGUgWzFdIGFuZCBBYmlXb3JkIFsyXSwg d2l0aCBhIGZldyBtb2RpZmljYXRpb25zIHRvIG1ha2UgaXQgcGVyc2lzdGVudCBhbmQgZnVuY3Rp b25hbC4NCjwvcD4NCjxwPkl0IHByb3ZpZGVzIHNvbWUgbmljZSBmZWF0dXJlcyBvbiB0b3Agd2hp Y2ggaW5jbHVkZTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlNlcmlhbGlzaW5nIGFu ZCBkZXNlcmlhbGlzaW5nIHRoZSBzdHJ1Y3R1cmUgdG8gYSBmaWxlIGZvciBwZXJzaXN0ZW50IHVu ZG8vcmVkby4NCjwvbGk+PGxpPlRyYW5zbGF0aW5nIGJldHdlZW4gb2Zmc2V0cyBvZiBkaWZmZXJl bnQgVW5pY29kZSBlbmNvZGluZ3MgKFVURi04LCBVVEYtMTYgYW5kIFVURi0zMikgZm9yIGludGVy YWN0aW9uIHdpdGggZXh0ZXJuYWwgc3lzdGVtcyBhbmQgbGFuZ3VhZ2VzLg0KPC9saT48bGk+VGhl cmUgaXMgYSBjb21wdXRhdGlvbmFsbHkgZXhwZW5zaXZlIGZ1bmN0aW9uIHRvIHJlYnVpbGQgdGhl IHN0cnVjdHVyZSwgb3B0aW1pc2luZyBpdCBmb3IgbWVtb3J5IHVzYWdlIGFuZCBwZXJmb3JtYW5j ZS4gKFRoZSBpZGVhIHdhcyB0byB1c2UgdGhpcyBpbiBhIEdVSSBhcHAgd2hlbiB0aGUgdXNlciBp cyBpbmFjdGl2ZSBhbmQgcmVidWlsZGluZyBpbiB0aGF0IGNhc2UgLSB0aGUgY29yZSBzdHJ1Y3R1 cmUgaXMgZmFzdCBidXQgdGhlIHBlcmZlY3Rpb25pc3QNCiBpbiBtZSB3YW50ZWQgaXQgdG8gYmUg YXMgZmFzdCBhbmQgbGVhbiBpbiBtZW1vcnkgYXMgcG9zc2libGUuKSA8L2xpPjwvdWw+DQo8cD5U aGVyZSBhcmUgc29tZSBzaW1pbGFyIHBhY2thZ2VzIG90aGVycyBtYXkgZmluZCB1c2VmdWwgbGlr ZSBaZWQgd2hpY2ggYXJlIGEgbW9yZSBiYXR0bGUtdGVzdGVkIGltcGxlbWVudGF0aW9uIG9mIGEg c2ltaWxhci1idXQtbm90LXF1aXRlLXRoZS1zYW1lIGRhdGEgc3RydWN0dXJlIGFzIHRoaXMgaXMg YSBuZXcgaW1wbGVtZW50YXRpb24uDQo8L3A+DQo8cD5GZWVsIGZyZWUgdG8gY29tbWVudCBvciBv cGVuIGlzc3VlcyBmb3IgYW55IGJ1Z3MgeW91IGZpbmQgZHVyaW5nIHVzYWdlLiBIb3BlZnVsbHkg c29tZW9uZSBlbHNlIG91dCB0aGVyZSB3aWxsIGZpbmQgdGhpcyB1c2VmdWwgdG9vLg0KPC9wPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlsxXSA8YSBocmVmPSJodHRwczovL2NvZGUudmlzdWFs c3R1ZGlvLmNvbS9ibG9ncy8yMDE4LzAzLzIzL3RleHQtYnVmZmVyLXJlaW1wbGVtZW50YXRpb24i Pg0KaHR0cHM6Ly9jb2RlLnZpc3VhbHN0dWRpby5jb20vYmxvZ3MvMjAxOC8wMy8yMy90ZXh0LWJ1 ZmZlci1yZWltcGxlbWVudGF0aW9uPC9hPiA8L2xpPjxsaT5bMl0gPGEgaHJlZj0iaHR0cDovL2U5 OGN1ZW5jLmZyZWUuZnIvd29yZHByb2Nlc3Nvci9waWVjZXRhYmxlLmh0bWwiPmh0dHA6Ly9lOThj dWVuYy5mcmVlLmZyL3dvcmRwcm9jZXNzb3IvcGllY2V0YWJsZS5odG1sPC9hPg0KPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn NTdjMDk0YiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzU3YzA5NGIiPk9sZCBDV048 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzU3YzA5NGIiPg0K PHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFu ZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhl IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVmPSJo dHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9ubGlu ZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmcxZDQ1ZjVkIj4NCjxw PjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+ IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Mailbox Transport; Tue, 14 Mar 2023 09:53:27 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 14 Mar 2023 09:53:27 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.21 via Frontend Transport; Tue, 14 Mar 2023 09:53:27 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32E9qfOP025174 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 14 Mar 2023 09:52:41 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32E9qSIl025156 for ; Tue, 14 Mar 2023 09:52:29 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Mar 2023 10:52:27 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 969A1E0C95; Tue, 14 Mar 2023 10:52:27 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DBC05E0010 for ; Tue, 14 Mar 2023 10:52:20 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Mar 2023 10:52:16 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id ABCE75612B6; Tue, 14 Mar 2023 10:52:15 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZVlrTylARqJhlj0OvwtrWvPLI+Q== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 14 Mar 2023 09:52:15 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 838449c7-9a82-48a2-0df9-08db2471f5b6 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,259,1673910000"; d="scan'208,217";a="97049611" x-spam-flag: No, tests=bogofilter, spamicity=0.117306, queueID=E4F225612E1 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMy0xNCBUdWUgMTA6NTAgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDMuMDcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMy4yMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE1hcmNoIDA3IHRvIDE0LCAyMDIzLiA8L3A+ DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8aDI+VGFibGUg b2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250ZW50cyIgcm9sZT0i ZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPk15IGV4cGVyaWVuY2UgY29udHJpYnV0 aW5nIHRvIHRoZSBMTFZNIGJpbmRpbmdzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+V2hpY2gg YmluZGluZyBzaG91bGQgaSB1c2UgZm9yIHNxbGl0ZSAsIGZvciBtYXJpYWRiIGFuZCBmb3IgcG9z dGdyZXNxbDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9IiMzIj5Nb25kYXksIDZ0aCBNYXJjaCAtIE91 dHJlYWNoeSBJbnRlcm4gUHJlc2VudGF0aW9uIChEZWMg4oCZMjIgUm91bmQpPC9hPg0KPC9saT48 bGk+PGEgaHJlZj0iIzQiPkZpcnN0IHJlbGVhc2Ugb2YgcHB4X3N1YmxpbmVyLCBhIHBweCBkZXJp dmVyIGFuZCByZXdyaXRlciBmb3IgQ21sZGxpbmVyIHN1Yi1jb21tYW5kPC9hPg0KPC9saT48bGk+ PGEgaHJlZj0iIzUiPkNyb3NzLWNvbXBpbGluZyBmb3IgRW1iZWRkZWQgYXJtMzIgVGFyZ2V0IChS UDIwNDAgLyBDb3J0ZXgtTTAmIzQzOyk8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNiI+Vk9DYW1s OiBhZGQgYW5kIHJlbW92ZSB0eXBlIGFubm90YXRpb25zIGluIFZTIENvZGU8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM3Ij5TdW5zZXR0aW5nIG9wYW0tcmVwb3NpdG9yeS1taW5ndzwvYT4gPC9saT48 bGk+PGEgaHJlZj0iIzgiPk91dHJlYWNoeSBTdW1tZXIgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJl Zj0iIzkiPlZTIENvZGUgZXh0ZW5zaW9uIEFsY290ZXN0IFRlc3QgRXhwbG9yZXIgMC40LjA8L2E+ IDwvbGk+PGxpPjxhIGhyZWY9IiNvcmc4ZGE0YjVhIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjEiPk15IGV4cGVyaWVuY2UgY29udHJpYnV0aW5nIHRvIHRoZSBMTFZN IGJpbmRpbmdzPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4N CjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9teS1leHBl cmllbmNlLWNvbnRyaWJ1dGluZy10by10aGUtbGx2bS1iaW5kaW5ncy8xMTU5OS8xIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9teS1leHBlcmllbmNlLWNvbnRyaWJ1dGluZy10by10aGUt bGx2bS1iaW5kaW5ncy8xMTU5OS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmdmNTA0NzIwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZjUw NDcyMCI+YWxhbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZ2Y1MDQ3MjAiPg0KPHA+T3ZlciB0aGUgcGFzdCBmZXcgbW9udGhzLCBJ4oCZdmUg YmVlbiBjb250cmlidXRpbmcgcGF0Y2hlcyB0byB0aGUgTExWTSBiaW5kaW5ncy4gSW4gcGFydGlj dWxhciwgSSBwb3J0ZWQgdGhlIGJpbmRpbmdzIHRvIE9DYW1sIDUsIHdoaWNoIGludm9sdmVkIHJl bW92aW5nIG5ha2VkIHBvaW50ZXJzLiBJIHdyb3RlIGFib3V0IHdoYXQgSSBsZWFybmVkDQo8YSBo cmVmPSJodHRwczovL2FsYW4tai1odS5naXRodWIuaW8vd3JpdGluZy9sbHZtLW9jYW1sLmh0bWwi PmhlcmU8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+V2hpY2ggYmluZGlu ZyBzaG91bGQgaSB1c2UgZm9yIHNxbGl0ZSAsIGZvciBtYXJpYWRiIGFuZCBmb3IgcG9zdGdyZXNx bDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNo aXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2hpY2gtYmluZGluZy1z aG91bGQtaS11c2UtZm9yLXNxbGl0ZS1mb3ItbWFyaWFkYi1mb3ItcG9zdGdyZXNxbC8xMTYwNS8y Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC93aGljaC1iaW5kaW5nLXNob3VsZC1pLXVz ZS1mb3Itc3FsaXRlLWZvci1tYXJpYWRiLWZvci1wb3N0Z3Jlc3FsLzExNjA1LzI8L2E+DQo8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzUyMDllYzAiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc1MjA5ZWMwIj5BbGFpbiBEZSBWb3MgYXNrZWQgYW5kIE5p Y29sYXMgT2plZGEgQmFyIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzUyMDllYzAiPg0KPGJsb2NrcXVvdGU+DQo8cD5XaGljaCBiaW5kaW5nIHNo b3VsZCBpIHVzZSBmb3Igc3FsaXRlICwgZm9yIG1hcmlhZGIgJmFtcDsgZm9yIHBvc3RncmVzcWwg PyA8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5BdCBMZXhpRmkgd2UgaGF2ZSB1c2VkIDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9tbW90dGwvcG9zdGdyZXNxbC1vY2FtbCI+aHR0cHM6Ly9naXRo dWIuY29tL21tb3R0bC9wb3N0Z3Jlc3FsLW9jYW1sPC9hPiBmb3IgUG9zdGdyZVNRTCBhbmQNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9tbW90dGwvc3FsaXRlMy1vY2FtbCI+aHR0cHM6Ly9n aXRodWIuY29tL21tb3R0bC9zcWxpdGUzLW9jYW1sPC9hPiBmb3IgU1FMaXRlIGZvciBhIGxvbmcg dGltZSBhbmQgZm91bmQgdGhlbSBzb2xpZC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkMWJmMGExIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBp ZD0ib3JnZDFiZjBhMSI+S2ltIE5ndXnhu4VuIGFsc28gcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZDFiZjBhMSI+DQo8cD5JZiB5b3UgYXJlIGxv b2tpbmcgZm9yIGEgdW5pZmllZCBBUEksIHRoZXJlIGlzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9wYXVya2VkYWwvb2NhbWwtY2FxdGkiPg0KQ2FxdGk8L2E+LiBJdCB1c2VzIHRoZSBsb3dl ciBsZXZlbCBiaW5kaW5ncyBtZW50aW9uZWQgYnkgQG5vamIgKGFuZCBhbHNvIHN1cHBvcnRzIE1h cmlhREIgdXNpbmcNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZW50aC9vY2FtbC1t YXJpYWRiIj5tYXJpYWRiLW9jYW1sPC9hPi4gSXQgZmVlbHMgbGlrZSB0aGUg4oCcamRiYyBmb3Ig T0NhbWzigJ0gYnV0IHdpdGggbXVjaCBtb3JlIQ0KPC9wPg0KPHA+SXQgcHJvdmlkZXMgdGhyZWUg aGlnaC1sZXZlbCBBUEksIGVpdGhlciBhIHN0YW5kYXJkIGJsb2NraW5nIGludGVyZmFjZSwgb3Ig YXN5bmNocm9ub3VzIHdpdGggTHd0IG9yIGFzeW5jaHJvbm91cyB3aXRoIEphbmVzdHJlZXTigJlz IEFzeW5jKS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc3NGMzN2NkIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNzRjMzdjZCI+RnLD qWTDqXJpYyBMb3llciB0aGVuIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc3NGMzN2NkIj4NCjxwPkNhcXRpIGlzIG5pY2UgYW5kIGNhbiBiZSBjb21w bGV0ZWQgbmljZWx5IHdpdGggcHB4X3JhcHBlciB3aGljaCB0cmFuc2Zvcm1zIGEgY29tbWVudGVk IFNRTCBzdHJpbmcgaW50byBhIHR5cGVkIHdyYXBwZXIuDQo8L3A+DQo8cD5TZWUgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL3JvZGR5eWFnYS9wcHhfcmFwcGVyIj5odHRwczovL2dpdGh1Yi5j b20vcm9kZHl5YWdhL3BweF9yYXBwZXI8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iMyI+TW9uZGF5LCA2dGggTWFyY2ggLSBPdXRyZWFjaHkgSW50ZXJuIFByZXNlbnRhdGlvbiAo RGVjIOKAmTIyIFJvdW5kKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRl eHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv bW9uZGF5LTZ0aC1tYXJjaC1vdXRyZWFjaHktaW50ZXJuLXByZXNlbnRhdGlvbi1kZWMtMjItcm91 bmQvMTE1NjQvNSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbW9uZGF5LTZ0aC1tYXJj aC1vdXRyZWFjaHktaW50ZXJuLXByZXNlbnRhdGlvbi1kZWMtMjItcm91bmQvMTE1NjQvNTwvYT4N CjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTZmMTRhNCIgY2xh c3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzk2ZjE0YTQiPlBhdHJpY2sgRmVycmlzIGFubm91 bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTZmMTRh NCI+DQo8cD5UaGUgcHJlc2VudGF0aW9uIGlzIG5vdyBvbmxpbmU6IDxhIGhyZWY9Imh0dHBzOi8v d2F0Y2gub2NhbWwub3JnL3cvcFFTQWZaOWtEU3NTbnI4Qnh6b2NuMyI+DQpodHRwczovL3dhdGNo Lm9jYW1sLm9yZy93L3BRU0FmWjlrRFNzU25yOEJ4em9jbjM8L2E+IDwvcD4NCjxwPlRoYW5rIHlv dSBAUHJpc2NhIGZvciB0aGUgdGFsayBhbmQgZXZlcnlib2R5IGZvciBqb2luaW5nIGxpdmUuIFdl IHRvb2sgdGhpcyBvcHBvcnR1bml0eSB0byByZXVwbG9hZCBldmVyeXRoaW5nIHRvIHRoZSBPQ2Ft bCBPdXRyZWFjaHkgY2hhbm5lbCB1bmRlciB0aGUNCjxjb2RlPmJhY3RyaWFuPC9jb2RlPiB1c2Vy OiA8YSBocmVmPSJodHRwczovL3dhdGNoLm9jYW1sLm9yZy9jL291dHJlYWNoeV9vY2FtbC92aWRl b3MiPg0KaHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvYy9vdXRyZWFjaHlfb2NhbWwvdmlkZW9zPC9h PiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTU1 MTIwZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U1NTEyMGUiPkFuaWwgTWFkaGF2 YXBlZGR5IGFza2VkIGFuZCBQcmlzY2EgcmVwbGllZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnZTU1MTIwZSI+DQo8YmxvY2txdW90ZT4NCjxwPllvdXIgc2xp ZGVzIGxvb2sgZ3JlYXQsIHdpdGggbG90cyBvZiBuaWNlIE9DYW1sL1RvcG9KU09OIGNvZGUgZnJh Z21lbnRzOyBtaWdodCB5b3UgY29uc2lkZXIgbWFraW5nIHRoZW0gYXZhaWxhYmxlIG9ubGluZSBz b21ld2hlcmU/IE1ha2luZyB5b3Vyc2VsZiBhIGhvbWVwYWdlLCBvciB1c2luZyBzb21ldGhpbmcg bGlrZSBTcGVha2VyZGVjayBhcmUgYm90aCBnb29kIG9wdGlvbnMuDQo8L3A+DQo8L2Jsb2NrcXVv dGU+DQo8cD5AYXZzbSBUaGFuayB5b3UgdmVyeSBtdWNoIGZvciB0aGUga2luZCB3b3Jkcy4gSSBq dXN0IGRpZC4gVGhpcyBpcyB0aGUgbGluayA8YSBocmVmPSJodHRwczovL3NwZWFrZXJkZWNrLmNv bS9wcmljZWxlc3MvcHJlc2VudGF0aW9uIj4NCmh0dHBzOi8vc3BlYWtlcmRlY2suY29tL3ByaWNl bGVzcy9wcmVzZW50YXRpb248L2E+IDwvcD4NCjxibG9ja3F1b3RlPg0KPHA+SSBub3RpY2VkIHlv dSBwdWJsaXNoZWQgYSByZWxlYXNlIG9mIHRoZSBsaWJyYXJ5IHRvIG9wYW0g4oCTIHlvdSBzaG91 bGQgYWRkIHlvdXJzZWxmIHRvIHRoZSBhdXRob3JzIGxpc3QgaW4NCjxjb2RlPmR1bmUtcHJvamVj dDwvY29kZT4sIHNvIHRoYXQgeW91IGFyZSBjcmVkaXRlZCBpbiA8YSBocmVmPSJodHRwczovL29j YW1sLm9yZy9wL3RvcG9qc29uL2xhdGVzdCI+DQp0aGUgZG9jdW1lbnRhdGlvbiBwYWdlIGZvciBU b3BvSlNPTiA8L2E+LiA8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5UaGFuayB5b3UgZm9yIHBvaW50 aW5nIHRoYXQgb3V0IGFzIHdlbGwuIEBwYXRyaWNrZmVycmlzIGFuZCBJIHdpbGwgY29ycmVjdCBp dC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5GaXJzdCByZWxlYXNlIG9mIHBw eF9zdWJsaW5lciwgYSBwcHggZGVyaXZlciBhbmQgcmV3cml0ZXIgZm9yIENtbGRsaW5lciBzdWIt Y29tbWFuZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0 LXJlbGVhc2Utb2YtcHB4LXN1YmxpbmVyLWEtcHB4LWRlcml2ZXItYW5kLXJld3JpdGVyLWZvci1j bWxkbGluZXItc3ViLWNvbW1hbmQvMTE2MTAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtcHB4LXN1YmxpbmVyLWEtcHB4LWRlcml2ZXItYW5kLXJl d3JpdGVyLWZvci1jbWxkbGluZXItc3ViLWNvbW1hbmQvMTE2MTAvMTwvYT4NCjwvcD4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWJmYzE4NCIgY2xhc3M9Im91dGxpbmUt MyI+DQo8aDMgaWQ9Im9yZ2ViZmMxODQiPkJvbmluZyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2ViZmMxODQiPg0KPHA+SSBhbSB2ZXJ5IHBs ZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2JuLWQvcHB4X3N1YmxpbmVyIj4NCjxjb2RlPnBweF9zdWJsaW5lcjwvY29kZT48 L2E+ISBUaGUgcGFja2FnZSBpcyBub3cgYXZhaWxhYmxlIHRocm91Z2ggPGEgaHJlZj0iaHR0cHM6 Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9wcHhfc3VibGluZXIvIj4NCk9QQU08L2E+LiA8L3A+ DQo8cD5JIGFtIGFsd2F5cyBhIGJpZyBmYW4gb2YgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L2hhbW1lcmxhYi9wcHhfZGVyaXZpbmdfY21kbGluZXIiPg0KPGNvZGU+cHB4X2Rlcml2aW5nX2Nt ZGxpbmVyPC9jb2RlPjwvYT4uIEl0IGhlbHBzIHlvdSBjb25zdHJ1Y3QgPGNvZGU+Q21kbGluZXIu VGVybS50PC9jb2RlPiBmcm9tIHJlY29yZCB0eXBlcyBhbmQgbWFrZXMgd3JpdGluZyBjbGkgcGFy c2luZyBpbnR1aXRpdmUgYW5kIHBhaW5sZXNzLiBCdXQgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8g Z2VuZXJhdGUgdmFsdWVzIGZvciBzdWItY29tbWFuZCBncm91cHMgYW5kIHRoZSBmaW5hbA0KPGNv ZGU+Q21kbGluZXI8L2NvZGU+IGV2YWx1YXRpb25zLiBUaGVyZWZvcmUsIDxjb2RlPnBweF9zdWJs aW5lcjwvY29kZT4gY29tZXMgdG8gbGlmZS4NCjwvcD4NCjxwPjxjb2RlPnBweF9zdWJsaW5lcjwv Y29kZT4gY2FuIHdvcmsgd2l0aCA8Y29kZT5wcHhfZGVyaXZpbmdfY21kbGluZXI8L2NvZGU+IHRv IGdlbmVyYXRlIHN1Yi1jb21tYW5kIGdyb3Vwcy4gWW91IGNhbiBkbyBzbyBieSBzaW1wbHkgdGFn Z2luZyB0aGUgZXh0ZW5zaW9uIHRvIGEgdmFyaWFudCB0eXBlLg0KPC9wPg0KPGRpdiBjbGFzcz0i b3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5cGU8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPmZvbzwvc3Bhbj4gPSB7IG15X2FyZyA6IHN0cmluZyB9 IDxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAQGRlcml2aW5nIGNtZGxpbmVyXTwvc3Bh bj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPnR5 cGU8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPnBhcmFtczwvc3Bhbj4gPQ0K ICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPkZvbzwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDog Ym9sZDsiPm9mPC9zcGFuPiBmb28NCiAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5CYXI8L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6 ICNhMjYwNGY7Ij5bQEBkZXJpdmluZ19pbmxpbmUgc3VibGluZXJdPC9zcGFuPg0KPHNwYW4gc3R5 bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluY2x1ZGU8L3NwYW4+DQog IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5zaWc8L3Nw YW4+DQogICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+W0BAQG9jYW1sLndhcm5pbmcg PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90Oy0zMiZxdW90Ozwvc3Bh bj48c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5dPC9zcGFuPg0KICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij52YWw8L3NwYW4+IDxzcGFuIHN0 eWxlPSJjb2xvcjogI2E3NjAxZjsiPnBhcmFtc19jbWRsaW5lcl9ncm91cF9jbWRzPC9zcGFuPiA6 IChwYXJhbXMgLSZndDsgJ2EpIC0mZ3Q7ICdhIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsi PkNtZGxpbmVyLkNtZC48L3NwYW4+dCBsaXN0DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAw MDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5lbmQ8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2 MDRmOyI+W0BAb2NhbWwuZG9jIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4m cXVvdDtAaW5saW5lJnF1b3Q7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPl08 L3NwYW4+DQo8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7Ij5bQEBAZW5kXTwvc3Bhbj4NCjwv cHJlPg0KPC9kaXY+DQo8cD5JdCB3aWxsIGdlbmVyYXRlIGEgZnVuY3Rpb24gd2hpY2ggdGFrZXMg aW4gYSBoYW5kbGUgZnVuY3Rpb24gYW5kIHJldHVybiB0aGUgc3ViLWNvbW1hbmQgbGlzdC4gSGVy ZSBpcyBhIHNpbXBsZSBoYW5kbGUgZnVuY3Rpb24uDQo8L3A+DQo8ZGl2IGNsYXNzPSJvcmctc3Jj LWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29s b3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNzYwMWY7Ij5oYW5kbGU8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA2 ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bmN0aW9uPC9zcGFuPg0KICB8IDxzcGFuIHN0eWxl PSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdlZjsiPkZvbzwvc3Bhbj4g eyBteV9hcmcgfSAtJmd0OyBwcmludF9lbmRsaW5lICg8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0 MDA7Ij4mcXVvdDtGb28gJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7 Ij5ePC9zcGFuPiBteV9hcmcpDQogIHwgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBiYWNr Z3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+QmFyPC9zcGFuPiAtJmd0OyBwcmludF9lbmRsaW5lIDxz cGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90O0JhciZxdW90Ozwvc3Bhbj4NCjwvcHJl Pg0KPC9kaXY+DQo8cD4mZ3Q7RnJvbSBoZXJlLCB5b3UgZWl0aGVyIGNvbnN0cnVjdCB0aGUgZmlu YWwgZXZhbHVhdGlvbiBtYW51YWxseTogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWlu ZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDA3YTlmOyI+Y21kPC9zcGFuPiA9DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9u dC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5vcGVuIDwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5DbWRsaW5lcjwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdl aWdodDogYm9sZDsiPmluPC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZv bnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7 Ij5kb2M8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7U29tZSBk b2NzJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0 OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13 ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPmlu Zm88L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q21kLjwvc3Bhbj5pbmZv IH5kb2MgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7Zm9vYmFyJnF1b3Q7PC9z cGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48 L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNtZC48L3NwYW4+Z3JvdXAg aW5mbyAocGFyYW1zX2NtZGxpbmVyX2dyb3VwX2NtZHMgaGFuZGxlKQ0KDQo8c3BhbiBzdHlsZT0i Y29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiAoKSA9IDxzcGFu IHN0eWxlPSJjb2xvcjogIzU1NzQwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5leGl0PC9zcGFuPiAo PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q21kbGluZXIuPC9zcGFuPmV2YWwgY21kKQ0K PC9wcmU+DQo8L2Rpdj4NCjxwPm9yIHVzZSB0aGUgPGNvZGU+WyUlc3VibGluZXIuY21kc108L2Nv ZGU+IHJld3JpdGVyLCB3aGljaCByZXVzZXMgdGhlIHNldGZpZWxkIHN5bnRheDoNCjwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9z cGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+e2V2 YWwgZnVuY3Rpb259Lnt0eXBlIG5hbWV9ICZsdDstIHtmdW5jdGlvbiBleHByZXNzaW9uJmd0Ozwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAq KTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+DQo8ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+ DQo8cHJlIGNsYXNzPSJzcmMgc3JjLW9jYW1sIj48c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7 IGJhY2tncm91bmQtY29sb3I6ICNlYmViZWI7Ij5bJSVzdWJsaW5lci5jbWRzPC9zcGFuPiBldmFs LnBhcmFtcyAmbHQ7LSBoYW5kbGU8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7IGJhY2tncm91 bmQtY29sb3I6ICNlYmViZWI7Ij5dPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRm OyI+W0BAbmFtZSA8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7Zm9v YmFyJnF1b3Q7PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPl08L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPltAQHZlcnNpb24gPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjogI2NhMzQwMDsiPiZxdW90OzMuMTQmcXVvdDs8L3NwYW4+PHNwYW4gc3R5bGU9ImNv bG9yOiAjYTI2MDRmOyI+XTwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzRmNjc3ZjsgZm9u dC1zdHlsZTogaXRhbGljOyI+KCoqIFNvbWUgZG9jcyAqKTwvc3Bhbj4NCjwvcHJlPg0KPC9kaXY+ DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnMDc5ZjY1YiI+DQokIGZvb2Jhci5leGUgZm9v IC0tbXktYXJnIDEyMw0KRm9vIDEyMw0KPC9wcmU+DQo8cD5Cb3RoIHRoZSBkZXJpdmVyIGFuZCBy ZXdyaXRlciB3aWxsIHJlc3BlY3QgdGhlIE9DYW1sIGRvY3N0cmluZy4gWW91IGNhbiBhbHNvIHVz ZQ0KPGNvZGU+W0BuYW1lXTwvY29kZT4sIDxjb2RlPltAbWFuXTwvY29kZT4sIDxjb2RlPltAZW52 c108L2NvZGU+IGV0YyB0byBjb25maWd1cmUgYWxsIGFzcGVjdHMgb2YgdGhlIHVuZGVybHlpbmcN Cjxjb2RlPkNtZGxpbmVyLkNtZC5pbmZvPC9jb2RlPiB2YWx1ZS4gPC9wPg0KPHA+WW91IGNhbiBh bHNvIHVzZSBkaWZmZXJlbnQgZXZhbHVhdGlvbiBmdW5jdGlvbiBhbmQgc2V0IG9wdGlvbmFsIGFy Z3VtZW50czogPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFz cz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyBiYWNrZ3JvdW5k LWNvbG9yOiAjZWJlYmViOyI+WyUlc3VibGluZXIuY21kczwvc3Bhbj4gKGV2YWxfcmVzdWx0IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5jYXRjaDwvc3Bhbj46PHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA4MjRmOyI+ZmFsc2U8L3NwYW4+KS5wYXJhbXMgJmx0Oy0NCiAgKDxzcGFuIHN0eWxl PSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5mdW5jdGlvbjwvc3Bhbj4NCiAg ICB8IDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPkZvbzwvc3Bhbj4geyBteV9hcmcgfSAtJmd0OyBwcmludF9lbmRsaW5lICg8c3BhbiBzdHls ZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtGb28gJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNTJhMmE7Ij5ePC9zcGFuPiBteV9hcmcpIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1 MmEyYTsiPnwmZ3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZXN1bHQu PC9zcGFuPm9rDQogICAgfCA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQt Y29sb3I6ICNmY2Y3ZWY7Ij5CYXI8L3NwYW4+IC0mZ3Q7IHByaW50X2VuZGxpbmUgPHNwYW4gc3R5 bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7QmFyJnF1b3Q7PC9zcGFuPiA8c3BhbiBzdHlsZT0i Y29sb3I6ICNhNTJhMmE7Ij58Jmd0Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+UmVzdWx0Ljwvc3Bhbj5vayk8c3BhbiBzdHlsZT0iY29sb3I6ICNhMjYwNGY7IGJhY2tncm91 bmQtY29sb3I6ICNlYmViZWI7Ij5dPC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxwPlBsZWFzZSBz ZWUgbW9yZSBkZXRhaWxzIGluIHRoZSA8YSBocmVmPSJodHRwczovL2JvbmkubmcvcHB4X3N1Ymxp bmVyL3BweF9zdWJsaW5lci9pbmRleC5odG1sIj4NCmRvY3VtZW50YXRpb248L2E+LiA8L3A+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM0MmM1ZTEiIGNsYXNzPSJvdXRs aW5lLTQiPg0KPGg0IGlkPSJvcmczNDJjNWUxIj5XaGF04oCZcyBuZXh0PC9oND4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczNDJjNWUxIj4NCjxwPkkgd2FudCB0byBz dXBwb3J0IGlubGluZSByZWNvcmQgYW5kIGVudW0gYXMgYXJnIGluIHRoZSBmdXR1cmUsIGFuZCBt YXliZSByZXBsaWNhdGUgc29tZSBvZg0KPGNvZGU+cHB4X2Rlcml2aW5nX2NtZGxpbmVyPC9jb2Rl PuKAmXMgZnVuY3Rpb25hbGl0eSwgYnV0IGJldHRlciBzdXBwb3J0IGZvciA8Y29kZT4NCmRlcml2 aW5nX2lubGluZTwvY29kZT4sIGxpc3RzIChpZS4gPGNvZGU+LUkgbGliYSAtSSBsaWJiPC9jb2Rl PiBpbnN0ZWFkIG9mIDxjb2RlPg0KLUkgbGliYSxsaWJiPC9jb2RlPiksIHBvc2l0aW9uYWwgYXJn dW1lbnRzIGFuZCBtb3JlIGNvbXBpbGUgdGltZSB2YWxpZGF0aW9uLiBXZSBzaGFsbCBzZWUuDQo8 L3A+DQo8cD5Ib3BlIHRoaXMgaXMgaGVscGZ1bC4gSGFwcHkgaGFja2luZyEgPC9wPg0KPHA+PGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2JuLWQvcHB4X3N1YmxpbmVyIj5odHRwczovL2dpdGh1 Yi5jb20vYm4tZC9wcHhfc3VibGluZXI8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIi Pg0KPGgyIGlkPSI1Ij5Dcm9zcy1jb21waWxpbmcgZm9yIEVtYmVkZGVkIGFybTMyIFRhcmdldCAo UlAyMDQwIC8gQ29ydGV4LU0wJiM0MzspPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9jcm9zcy1jb21waWxpbmctZm9yLWVtYmVkZGVkLWFybTMyLXRhcmdldC1ycDIwNDAt Y29ydGV4LW0wLzExNTg1LzgiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Nyb3NzLWNv bXBpbGluZy1mb3ItZW1iZWRkZWQtYXJtMzItdGFyZ2V0LXJwMjA0MC1jb3J0ZXgtbTAvMTE1ODUv ODwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTI3ZmQ0 MyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzkyN2ZkNDMiPkRlZXAgaW4gdGhpcyB0 aHJlYWQsIENhbGFzY2liZXR0YSBSb21haW4gc2FpZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMyIgaWQ9InRleHQtb3JnOTI3ZmQ0MyI+DQo8cD5Ob3RlIHRoYXQgeW91IHByb2JhYmx5 IHNob3VsZCB0YWtlIGEgbG9vayBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlub3Nh dXJlL2dpbGJyYWx0YXIiPg0KZ2lsYnJhbHRhcjwvYT4gd2hpY2ggaXMgYSBmdWxsIE9DYW1sIHJ1 bnRpbWUgZm9yIFJhc3BlcnJ5IFBpIDQgKGFybTY0KS4gV2UgYWxyZWFkeSBkaWQgc2V2ZXJhbCB3 b3JrcyBvbiB0aGlzDQo8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5vY2FtbCB0b29sY2hhaW48L3Nw YW4+LCBhIDxhIGhyZWY9Imh0dHBzOi8vdHdpdHRlci5jb20vRGlub29zYXVyZS9zdGF0dXMvMTQ3 MTEyODU5NTE1NDIzMTMwMCI+DQrigJxndWlybGFuZGUgT1PigJ08L2E+IG9yIGEgPGEgaHJlZj0i aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjItMTAtMjgtdGhlLW1pcmFnZW9zLXJldHJlYXQt YS1qb3VybmV5LW9mLWZvb2QtY2F0cy1hbmQtdW5pa2VybmVscyNpbXBsZW1lbnRpbmctYS1qYWNr LXBvcnQtZHJpdmVyLW9yLWhvdy10by1tYWtlLWEtdW5pa2VybmVsLXNpbmctYmFyZS1tZXRhbCI+ DQptdXNpYyBwbGF5ZXIgT1MgdmlhIEphY2s8L2E+LiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iNiI+Vk9DYW1sOiBhZGQgYW5kIHJlbW92ZSB0eXBlIGFubm90YXRpb25zIGluIFZTIENv ZGU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJj aGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3ZvY2FtbC1hZGQtYW5k LXJlbW92ZS10eXBlLWFubm90YXRpb25zLWluLXZzLWNvZGUvMTE2MTgvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvdm9jYW1sLWFkZC1hbmQtcmVtb3ZlLXR5cGUtYW5ub3RhdGlvbnMt aW4tdnMtY29kZS8xMTYxOC8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmdhNjExNWUwIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYTYxMTVl MCI+THVrYXN6IFN0YWZpbmlhayBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2E2MTE1ZTAiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2Ug PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1O YW1lPWx1a3N0YWZpLnZvY2FtbCI+DQphIFZTIENvZGUgZXh0ZW5zaW9uIFZPQ2FtbDwvYT4gKDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9sdWtzdGFmaS92b2NhbWwvcmVsZWFzZXMvdGFnLzEu MC4wIj5HaXRIdWIgcmVsZWFzZTwvYT4pIHdoZXJlIEnigJlsbCBiZSBwdXR0aW5nIG15IE9DYW1s IGNvZGluZyBoZWxwZXJzLiBDdXJyZW50bHksIGl0IGhhcyB0aHJlZSBjb21tYW5kczoNCjwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48aT5WT0NhbWw6IEFkZCBUeXBlIEFubm90YXRpb25z PC9pPiBpbnNlcnRzIHR5cGUgYW5ub3RhdGlvbnMgYXJvdW5kIGxldCBiaW5kaW5ncy4NCjwvbGk+ PGxpPjxpPlZPQ2FtbDogUmVtb3ZlIFR5cGUgQW5ub3RhdGlvbnM8L2k+IHJlbW92ZXMgdHlwZSBh bm5vdGF0aW9ucyBmcm9tIGxldCBiaW5kaW5ncy4NCjwvbGk+PGxpPjxpPlZPQ2FtbDogVmlzaXQg RmlsZSBmcm9tIEN1cnJlbnQgTGluZTwvaT4gdHJpZ2dlcnMgYSA8Yj5RdWljayBPcGVuPC9iPiBk aWFsb2cgcG9wdWxhdGVkIHdpdGggYSBmaWxlIGFuZCBsaW5lIG51bWJlciByZXRyaWV2ZWQgZnJv bSB0aGUgbGluZSBhdCBjdXJzb3IgcG9zaXRpb24uDQo8L2xpPjwvdWw+DQo8cD5WT0NhbWwgaXMg YSBjb21wYW5pb24gdG8gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2x1a3N0YWZpL3BweF9t aW5pZGVidWciPjxjb2RlPnBweF9taW5pZGVidWc8L2NvZGU+PC9hPiwgYnV0IGl0IGNhbiBiZSB1 c2VkIGZvciBpdHMgb3duIG1lcml0cy4gSXQgaGFzIHNvbWUgbGltaXRhdGlvbnMsIHJlcG9ydCBp c3N1ZXMgaWYgeW91IHRyeSBpdCENCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI3Ij5T dW5zZXR0aW5nIG9wYW0tcmVwb3NpdG9yeS1taW5ndzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvc3Vuc2V0dGluZy1vcGFtLXJlcG9zaXRvcnktbWluZ3cvMTE2MzIvMSI+ DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3Vuc2V0dGluZy1vcGFtLXJlcG9zaXRvcnkt bWluZ3cvMTE2MzIvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmdlODg4NjM3IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZTg4ODYzNyI+RGF2 aWQgQWxsc29wcCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlk PSJ0ZXh0LW9yZ2U4ODg2MzciPg0KPHA+QXMgPGEgaHJlZj0iaHR0cHM6Ly9mZG9wZW4uZ2l0aHVi LmlvL29wYW0tcmVwb3NpdG9yeS1taW5ndy8yMDIxLzAyLzI2L3JlcG8tZGlzY29udGludWVkIj4N CnByZXZpb3VzbHkgYW5ub3VuY2VkPC9hPiwg4oCcb3BhbS1yZXBvc2l0b3J5LW1pbmd34oCdIGlz IG5vIGxvbmdlciByZWNlaXZpbmcgdXBkYXRlcy4NCjwvcD4NCjxwPldl4oCZcmUgYWN0aXZlbHkg d29ya2luZyBvbiBnZXR0aW5nIHRoZSBXaW5kb3dzIGNvbXBpbGVyIHBhY2thZ2VzIGludG8gPGEg aHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeSI+DQpvY2FtbC9v cGFtLXJlcG9zaXRvcnk8L2E+LiBUaGVyZSBhcmUgdHdvIGlzc3VlcyB3aGljaCBhcmUgdGFraW5n IChtZSkgYSBsaXR0bGUgd2hpbGUgdG8gZmluaXNoIHNvbHZpbmcsIGJ1dCBtb3JlIG9uIHRoYXQg ZnVydGhlciBiZWxvdy4NCjwvcD4NCjxwPkluIHRoZSBnYXAgLSBvZiBob3BlZnVsbHkgb25seSBh IG1vbnRoIG9yIHNvIC0gZm9yIHRoaXMgYmVpbmcgcmVhZHksIHRoZXJl4oCZcyBpcyBhbiBpc3N1 ZSB0aGF0IG5ldyByZWxlYXNlcyBhcmUgb2YgY291cnNlIG5vdCBhdmFpbGFibGUgd2hlbiBvcGFt LXJlcG9zaXRvcnktbWluZ3cgaXMgYmVpbmcgdXNlZCB3aXRoDQo8YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvc2V0dXAtb2NhbWwiPjxjb2RlPm9jYW1sL3NldHVwLW9jYW1sQHYyPC9j b2RlPjwvYT4gR2l0SHViIGFjdGlvbnMgd29ya2Zsb3dzLiBJ4oCZbSBob3BpbmcgaGVyZSB0byBz ZXQgb3V0IHdoYXTigJlzIGhhcHBlbmluZywgYW5kIHdoYXQgc3RlcHMgeW91IG1heSBuZWVkIHRv IHRha2UgdG8ga2VlcCB5b3VyIEdpdEh1YiBBY3Rpb25zIFdpbmRvd3Mgd29ya2Zsb3dzIHJ1bm5p bmcgc21vb3RobHkgb3Zlcg0KIHRoZSBuZXh0IGZldyBtb250aHMuIDwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYzFiODM3NCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8 aDQgaWQ9Im9yZ2MxYjgzNzQiPldoYXTigJlzIGhhcHBlbmluZyByaWdodCBub3c/PC9oND4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjMWI4Mzc0Ij4NCjxwPldl4oCZ dmUgdXBkYXRlZCBzZXR1cC1vY2FtbCB0byB1c2UgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L29jYW1sLW9wYW0vb3BhbS1yZXBvc2l0b3J5LW1pbmd3Ij4NCm9jYW1sLW9wYW0vb3BhbS1yZXBv c2l0b3J5LW1pbmd3PC9hPiBpbnN0ZWFkIG9mIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9m ZG9wZW4vb3BhbS1yZXBvc2l0b3J5LW1pbmd3Ij4NCmZkb3Blbi9vcGFtLXJlcG9zaXRvcnktbWlu Z3c8L2E+IChzZWUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL3NldHVwLW9jYW1s L3B1bGwvNjUxIj4NCm9jYW1sL3NldHVwLW9jYW1sIzY1MTwvYT4pLiBUaGlzIGNsb25lIGhhcyBi ZWVuIGF1Z21lbnRlZCB3aXRoOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+T0NhbWwg NC4xNC4xIHBhY2thZ2VzLCBpbiB0aGUgc2FtZSBzdHlsZSBhcyB0aGUgNC4xNC4wIGZvcmtlZCBw YWNrYWdlcyAodGhlIOKAnHByZS1jb21waWxlZOKAnSBwYWNrYWdlIHZhcmlhbnRzIGV4aXN0LCBi dXQgdGhleeKAmXJlIG5vdCBwcmUtY29tcGlsZWQpDQo8L2xpPjxsaT5DaGFuZ2VzIHRvIHRoZSBj b25zdHJhaW50cyBmb3IgPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ZXhpc3Rpbmc8L3NwYW4+IHBh Y2thZ2VzIG9ubHkNCjwvbGk+PC91bD4NCjxwPklmIHlvdeKAmXJlIHVzaW5nIHNldHVwLW9jYW1s IGluIGl0cyBkZWZhdWx0IGNvbmZpZ3VyYXRpb24sIHlvdSBzaG91bGQgbm90aWNlIG5vIGNoYW5n ZSBleGNlcHQgdGhhdA0KPGNvZGU+NC4xNC54PC9jb2RlPiBidWlsZHMgc2hvdWxkIG5vdyB1c2Ug NC4xNC4xIGFuZCB0aGUgaW5pdGlhbCBidWlsZCB3aWxsIGJlIGEgbGl0dGxlIHNsb3dlciBhcyBp dCBidWlsZHMgZnJvbSBzb3VyY2VzIChHaXRIdWIgQWN0aW9ucyBjYWNoaW5nIHdpbGwgdGhlbiB0 YWtlIG92ZXIgZm9yIHN1YnNlcXVlbnQgcnVucykuDQo8L3A+DQo8cD5Gb3IgbmV3IHJlbGVhc2Vz IG9mIHBhY2thZ2VzLCBpdOKAmXMgbmVjZXNzYXJ5IHRvIDxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUi PmFkZDwvc3Bhbj4gb3BhbS1yZXBvc2l0b3J5IHRvIHRoZSByZXBvc2l0b3JpZXMgc2VsZWN0aW9u cyBmb3IgdGhlIHN3aXRjaGVzLiBJdOKAmXMgaW1wb3J0YW50IHRoYXQgb3BhbS1yZXBvc2l0b3J5 IGlzIGF0IGENCjxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPmxvd2VyIHByaW9yaXR5PC9zcGFuPiB0 aGFuIG9wYW0tcmVwb3NpdG9yeS1taW5ndyBmb3IgZXhpc3RpbmcgcGFja2FnZXMsIHNvIGl04oCZ cyBiZXR0ZXIgdG8gdXNlIHRoZXNlIGxpbmVzIGluIHlvdXINCjxjb2RlPm9jYW1sL3NldHVwLW9j YW1sQHYyPC9jb2RlPiBzdGVwIHRoYW4gdG8gaXNzdWUgPGNvZGU+b3BhbSByZXBvIGFkZCAtLXJh bms9MTAwMDwvY29kZT4gbGF0ZXI6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3Jn Njc5NmQwOSI+DQp1c2VzOiBvY2FtbC9zZXR1cC1vY2FtbEB2Mg0Kd2l0aDoNCiAgb3BhbS1yZXBv c2l0b3JpZXM6IHwNCiAgICBvcGFtLXJlcG9zaXRvcnktbWluZ3c6IGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1vcGFtL29wYW0tcmVwb3NpdG9yeS1taW5ndy5naXQjc3Vuc2V0DQogICAgZGVmYXVs dDogaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS5naXQNCjwvcHJlPg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzI3Yjk1NDQiIGNs YXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcyN2I5NTQ0Ij5XaGF0IGRvIEkgZG8gd2hlbiB0 aGluZ3MgYXJlIGJyb2tlbj88L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0 ZXh0LW9yZzI3Yjk1NDQiPg0KPHA+VGhlcmXigJlzIGFuIGlzc3VlIHRyYWNrZXIgb24gPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW9wYW0vb3BhbS1yZXBvc2l0b3J5LW1pbmd3L2lz c3VlcyI+DQpvY2FtbC1vcGFtL29wYW0tcmVwb3NpdG9yeS1taW5ndzwvYT4sIGFuZCB0aGlzIGlz IGEgdmVyeSBnb29kIHBsYWNlIHRvIHN0YXJ0LiA8L3A+DQo8cD5JZiBhIHZlcnNpb24gb2YgYSBw YWNrYWdlIGlzbuKAmXQgYnVpbGRpbmcsIHRoZXJlIGFyZSB0aHJlZSBwb3NzaWJsZSByZW1lZGll czogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlByZXZpb3VzIHZlcnNpb25zIG9mIHRo ZSBwYWNrYWdlIG1heSBoYXZlIGNhcnJpZWQgbm9uLXVwc3RyZWFtZWQgcGF0Y2hlcyBpbiBvcGFt LXJlcG9zaXRvcnktbWluZ3cuDQo8L2xpPjwvdWw+DQo8cD5vcGFtLXJlcG9zaXRvcnnigJlzIHBv bGljeSBpcyBub3QgdG8gY2Fycnkgc3VjaCBwYXRjaGVzLiBJbiB0aGlzIGNhc2UsIHRoZSBwYWNr YWdlIGFjdHVhbGx5IGRvZXNu4oCZdCB3b3JrIG9uIFdpbmRvd3MuDQo8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+b3BhbS1yZXBvc2l0b3J5IHNob3VsZCBiZSB1cGRhdGVkIHRvIGhhdmUg PGNvZGU+b3MgIT0gJnF1b3Q7d2luMzImcXVvdDs8L2NvZGU+IGFkZGVkIHRvIHRoZQ0KPGNvZGU+ YXZhaWxhYmxlPC9jb2RlPiBmaWVsZCBmb3IgdGhlIHBhY2thZ2UgPC9saT48bGk+QW4gaXNzdWUg b24gdGhlIHBhY2thZ2XigJlzIHVwc3RyZWFtIHJlcG8gc2hvdWxkIGJlIG9wZW5lZCBoaWdobGln aHRpbmcgdGhlIG5lZWQgdG8gdXBzdHJlYW0gcGF0Y2hlcyAob3IgZXZlbiBhIHB1bGwgcmVxdWVz dCB3aXRoIHRoZW0hKQ0KPC9saT48bGk+VGhlIHBhdGNoZXMgaW4gb3BhbS1yZXBvc2l0b3J5LW1p bmd3IG1ha2UgY2hhbmdlcyB3aGljaCBtYXkgbm90IG5lY2Vzc2FyaWx5IGJlIGFjY2VwdGVkL2Fj Y2VwdGFibGUgdXBzdHJlYW0gaW4gdGhlaXIgY3VycmVudCBmb3JtLCBzbyB0aGUgaXNzdWUgbWF5 IGJlIGEgYmV0dGVyIHN0YXJ0aW5nIHBvaW50IHRoYW4gc2ltcGx5IHRha2luZyBhIHBhdGNoIGFu ZCBvcGVuaW5nIGEgcHVsbCByZXF1ZXN0IGZvciBpdCAoZm9yIGV4YW1wbGUsIHRoZQ0KPGNvZGU+ dXRvcDwvY29kZT4gcGFja2FnZSBjb250YWlucyBwYXRjaGVzIHdoaWNoIG1heSByZXF1aXJlIGZ1 cnRoZXIgd29yayBhbmQgcmV2aWV3KQ0KPC9saT48L3VsPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0K PGxpPlRoZSBwYWNrYWdlIHJlbGllcyBvbiBlbnZpcm9ubWVudCBjaGFuZ2VzIGluIOKAnE9DYW1s IGZvciBXaW5kb3dz4oCdLiBGb3IgZXhhbXBsZSwgdGhlIFphcml0aCBwYWNrYWdlIHdvcmtzIGlu IOKAnE9DYW1sIGZvciBXaW5kb3dz4oCdIGJlY2F1c2UgdGhlIGNvbXBpbGVyIHBhY2thZ2VzIHVu Y29uZGl0aW9uYWxseSBzZXQgdGhlDQo8Y29kZT5DQzwvY29kZT4gZW52aXJvbm1lbnQgdmFyaWFi bGUuIFRoaXMgY2hhbmdlIGlzIGJvdGggbm90IHBhcnRpY3VsYXJseSBkZXNpcmFibGUgY2hhbmdl IHRvIHVwc3RyZWFtIChpdCBpcw0KPHNwYW4gY2xhc3M9InVuZGVybGluZSI+dmVyeTwvc3Bhbj4g Y29uZnVzaW5nLCBmb3IgZXhhbXBsZSwgd2hlbiB3b3JraW5nIG9uIHRoZSBjb21waWxlciBpdHNl bGYpIGFuZCBhbHNvIGV4dHJlbWVseSBkaWZmaWN1bHQgdG8gdXBzdHJlYW0sIHNvIHRoZSBmaXgg aGVyZSBpcyBpbnN0ZWFkIHRvIGNoYW5nZSB0aGUgcGFja2FnZeKAmXMgYXZhaWxhYmlsaXR5IHdp dGgNCjxjb2RlPihvcyAhPSAmcXVvdDt3aW4zMiZxdW90OyB8IG9zLWRpc3RyaWJ1dGlvbiA9ICZx dW90O2N5Z3dpbnBvcnRzJnF1b3Q7KTwvY29kZT4gYW5kIGNvbnN0cmFpbiBhd2F5IE9DYW1sIDUg b24gV2luZG93cyAoPGNvZGU+JnF1b3Q7b2NhbWwmcXVvdDsgeyZsdDsgJnF1b3Q7NS4wJnF1b3Q7 IHwgb3MgIT0gJnF1b3Q7d2luMzImcXVvdDt9PC9jb2RlPikNCjwvbGk+PGxpPlBhY2thZ2UgY29u c3RyYWludHMgb24gPHNwYW4gY2xhc3M9InVuZGVybGluZSI+ZXhpc3RpbmcgcGFja2FnZXM8L3Nw YW4+IG5lZWQgdXBkYXRpbmcgaW4gb2NhbWwtb3BhbS9vcGFtLXJlcG9zaXRvcnktbWluZ3cuIEZv ciBleGFtcGxlLCB0aGUgcmVsZWFzZSBvZiBwcHhsaWIgMC4yOSByZXF1aXJlZCBzb21lIGV4aXN0 aW5nIHBhY2thZ2VzIHRvIGhhdmUgdXBwZXJib3VuZHMgYWRkZWQuDQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDNlOWY3YiIgY2xhc3M9 Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzQzZTlmN2IiPldoYXQgYWJvdXQgT0NhbWwgNS4wLjA/ PC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc0M2U5ZjdiIj4N CjxwPk9DYW1sIDUuMC4wIHdhcyByZWxlYXNlZCB3aXRoIHN1cHBvcnQgZm9yIHRoZSBtaW5ndy13 NjQgcG9ydCBvbmx5LCBob3dldmVyLCB0aGVyZeKAmXMgYSBxdWl0ZSBtYWpvciBidWcgd2hpY2gg d2FzbuKAmXQgY2F1Z2h0IGJ5IE9DYW1s4oCZcyB0ZXN0c3VpdGUsIGJ1dCBpcyByZWxhdGl2ZWx5 IGVhc2lseSB0cmlnZ2VyZWQgYnkgb3BhbSBwYWNrYWdlcy4gSeKAmXZlDQo8YSBocmVmPSJodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHJlLWFubi1pbnN0YWxsaW5nLXdpbmRvd3Mtb2NhbWwt NS0wLTAtaW4tb3BhbS8xMTE1MCI+DQpwcmV2aW91c2x5IGFubm91bmNlZDwvYT4gaG93IHRvIGFk ZCBPQ2FtbCA1IHRvIGEgd29ya2Zsb3cuIEZvciB0aGUgdGltZSBiZWluZywgdGhlIHBhY2thZ2Vz IGZvciBPQ2FtbCA1IGFyZW7igJl0IGF1dG9tYXRpY2FsbHkgbWFkZSBhdmFpbGFibGUuDQo8L3A+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYzI4NjVhYyIg Y2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2MyODY1YWMiPldoYXTigJlzIG5leHQ/PC9o ND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdjMjg2NWFjIj4NCjxw PlRoZSB1bHRpbWF0ZSBnb2FsIGlzIHRvIGJlIHVzaW5nIGFuIHVwc3RyZWFtIGJ1aWxkIG9mIDxj b2RlPm9wYW0uZXhlPC9jb2RlPiB3aXRoIG9jYW1sL29wYW0tcmVwb3NpdG9yeSwganVzdCBhcyBv biBVbml4LiBPbmNlIG9wYW0gMi4yIGlzIGdlbmVyYWxseSBhdmFpbGFibGUgKHdl4oCZcmUgYWlt aW5nIGZvciBhbiBhbHBoYSByZWxlYXNlIGF0IHRoZSBlbmQgb2YgTWFyY2gpIGFuZCB0aGUgY29t cGlsZXIgcGFja2FnZXMgaW4gb3BhbS1yZXBvc2l0b3J5DQogc3VwcG9ydCB0aGUgV2luZG93cyBi dWlsZHMsIHdlIHdpbGwgcmVjb21tZW5kIHN0b3BwaW5nIHVzZSBvZiBvcGFtLXJlcG9zaXRvcnkt bWluZ3cgY29tcGxldGVseS4gVGhlIGRlZmF1bHQgaW4gc2V0dXAtb2NhbWwgd29u4oCZdCBjaGFu Z2Ugc3RyYWlnaHQgYXdheSwgc2luY2UgdGhhdCByaXNrcyBicmVha2luZyBleGlzdGluZyB3b3Jr Zmxvd3MuDQo8L3A+DQo8cD5XaXRoIHVwc3RyZWFtIGNvbXBpbGVyIHN1cHBvcnQsIHdl4oCZbGwg YmUgYWJsZSB0byBleHRlbmQgc29tZSBvZiB0aGUgZXhpc3RpbmcgYnVsayBidWlsZCBzdXBwb3J0 IGFscmVhZHkgYmVpbmcgZG9uZSBmb3IgTGludXggdG8gV2luZG93cyBhbmQgc3RhcnQgdG8gY2xv c2UgdGhlIGdhcCBvZiBwYXRjaGVzIGluIG9wYW0tcmVwb3NpdG9yeS1taW5ndy4NCjwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmZDhiYTkyIiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZmQ4YmE5MiI+V2luZG93cyBjb21waWxlciBwYWNr YWdlczwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnZmQ4YmE5 MiI+DQo8cD5JIG1lbnRpb25lZCBlYXJsaWVyIHRoZSBwcm9ibGVtcyB3aXRoIG1vdmluZyB0aGUg Y29tcGlsZXIgcGFja2FnZXMgaW50byBvcGFtLXJlcG9zaXRvcnksIGFuZCBqdXN0IGZvciBnZW5l cmFsIGludGVyZXN0IHRoaXMgZWxhYm9yYXRlcyBvbiB0aGVtLg0KPC9wPg0KPHA+VGhlIGZpcnN0 IGlzc3VlIGFmZmVjdHMgdGhlIHVzZSBvZiB0aGUgVmlzdWFsIFN0dWRpbyBwb3J0ICjigJxNU1ZD 4oCdKSBhbmQgaXMgYSBjb25zZXF1ZW5jZSBvZiB0aGUgc29tZXdoYXQgc3RyYW5nZSB3YXkgdGhh dCB0aGUgQyBjb21waWxlciBpcyBhZGRlZCB0byB0aGUgZW52aXJvbm1lbnQgd2hlbiB1c2luZyB0 aGUgVmlzdWFsIFN0dWRpbyBDIGNvbXBpbGVyLiDigJxPQ2FtbCBmb3IgV2luZG93c+KAnSAoYXMg d2VsbCBhcyBEaXNrdXYpIHVzZSBhIHdyYXBwZXINCiBjb21tYW5kIChpdOKAmXMgPGNvZGU+b2Nh bWwtZW52PC9jb2RlPiBpbiDigJxPQ2FtbCBmb3IgV2luZG93c+KAnSBhbmQgPGNvZGU+d2l0aC1k a21sPC9jb2RlPiBpbiBEaXNrdXYpLiBUaG9zZSBjb21tYW5kcyBhcmUgV2luZG93cy1zcGVjaWZp Yywgd2hpY2ggaXMgYW4gaXNzdWUgZm9yIHVwc3RyZWFtIG9wYW0uIFRoZXJl4oCZcyBhbiBhbHRl cm5hdGUgd2F5IHdoaWNoIHNldHMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBpbiBhIG1vcmUg b3BhbS1saWtlIHdheS4NCiBEb2luZyBpdCB0aGF0IHdheSwgdGhvdWdoLCByZXF1aXJlcyBhbiBp bXByb3ZlbWVudCB0byBvcGFt4oCZcyBlbnZpcm9ubWVudCBoYW5kbGluZyB3aGljaCBpcyBpbiBv cGFtIDIuMiwgb3RoZXJ3aXNlIHRoZXJl4oCZcyBhbiBlYXN5IHJpc2sgb2Yg4oCcYmxvd2luZ+KA nSB0aGUgZW52aXJvbm1lbnQuDQo8L3A+DQo8cD5UaGUgc2Vjb25kIGlzc3VlIGlzIHNlbGVjdGlu ZyB0aGUgQyBjb21waWxlci4gT24gVW5peCwgdGhpcyBpcyBlYXN5IHdpdGggPGNvZGU+DQpvY2Ft bC1iYXNlLWNvbXBpbGVyPC9jb2RlPiBiZWNhdXNlIHRoZXJlIGlzIG9ubHkgb25lIOKAnHN5c3Rl beKAnSBDIGNvbXBpbGVyLiBXaW5kb3dzIGhhcyB0d28gcG9ydHMgb2YgT0NhbWwsIGFuZCB0aGUg Y29uZmlndXJhdGlvbiByZXF1aXJlcyBpdCB0byBiZSBleHBsaWNpdGx5IHNlbGVjdGVkLiBUaGF0 IHJlcXVpcmVzIGlucHV0IGZyb20gdGhlIHVzZXIgb24gc3dpdGNoIGNyZWF0aW9uIGZvciBhIFdp bmRvd3Mgc3dpdGNoLg0KPC9wPg0KPHA+4oCcT0NhbWwgZm9yIFdpbmRvd3PigJ0gc29sdmVzIHRo aXMgYnkgcGFja2FnaW5nIHRoZSBXaW5kb3dzIGNvbXBpbGVycyB3aXRoIHRoZSB2YXJpYW50IG5h bWUgYXBwZW5kZWQsIGp1c3QgYXMgb3BhbS1yZXBvc2l0b3J5IHVzZWQgdG8sIHNvDQo8Y29kZT5v Y2FtbC12YXJpYW50cy40LjE0LjEmIzQzO21pbmd3NjQ8L2NvZGU+IHNlbGVjdHMgdGhlIHRoZSBt aW5ndy13NjQgcG9ydCBhbmQgPGNvZGU+DQpvY2FtbC12YXJpYW50cy40LjE0LjEmIzQzO21zdmM2 NDwvY29kZT4gc2VsZWN0cyB0aGUgTVNWQzY0IHBvcnQuIFRoZSBwcm9ibGVtLCBhcyB3ZSBhbHJl YWR5IGhhZCBpbiBvcGFtLXJlcG9zaXRvcnksIGlzIHRoYXQgdGhpcyBhZGRzIDQgcGFja2FnZXMg Zm9yIGVhY2ggcmVsZWFzZSBvZiBPQ2FtbCBpbg0KPGNvZGU+b2NhbWwtdmFyaWFudHM8L2NvZGU+ LCBhbmQgbGVhZHMgdG8gYSBjb21iaW5hdG9yaWFsIGV4cGxvc2lvbiB3aGVuIHdlIHN0YXJ0IGNv bnNpZGVyaW5nIGZsYW1iZGEgYW5kIG90aGVyIHJlbGV2YW50IGNvbXBpbGVyIG9wdGlvbnMuDQo8 L3A+DQo8cD5vcGFtLXJlcG9zaXRvcnkgc3dpdGNoZWQgdG8gdXNpbmcgdGhlIDxjb2RlPm9jYW1s LW9wdGlvbi08L2NvZGU+IHBhY2thZ2VzIHRvIHNvbHZlIHRoZSBjb21iaW5hdG9yaWFsIGV4cGxv c2lvbiB3aGljaCB3YXMgYWxyZWFkeSBwcmVzZW50IGluIG9wYW0tcmVwb3NpdG9yeS4gVGhlIGRl bW9uc3RyYXRpb24gcmVwbyBmb3IgT0NhbWwgNSBvbiBXaW5kb3dzIGlzIGFscmVhZHkgdXNpbmcg YW4gYWRhcHRlZCB2ZXJzaW9uIG9mIHRoaXMgc28gdGhhdA0KPGNvZGU+b2NhbWwtb3B0aW9uLW1p bmd3PC9jb2RlPiBzZWxlY3RzIHRoZSBtaW5ndy13NjQgcG9ydCAoYnkgZGVmYXVsdCA2NC1iaXQs IHdpdGgNCjxjb2RlPm9jYW1sLW9wdGlvbi0zMmJpdDwvY29kZT4gdGhlbiBzZWxlY3RpbmcgdGhl IDMyLWJpdCBwb3J0KS4gPC9wPg0KPHA+VGhpcyB3b3JrIGlzIGFsbCBpbiBwcm9ncmVzcyBhbmQg YmVpbmcgdGVzdGVkIGFsb25nc2lkZSBjaGFuZ2VzIGluIG9wYW0gMi4yIHRvIHN1cHBvcnQgdGhl DQo8c3BhbiBjbGFzcz0idW5kZXJsaW5lIj5kZXBleHQ8L3NwYW4+IGV4cGVyaWVuY2Ugb24gV2lu ZG93cy4gVGhlIG9ubHkgcmVhc29uIHRoYXTigJlzIG5vdCBiZWluZyB1cHN0cmVhbWVkIHBpZWNl bWVhbCBpcyB0aGF0IGNoYW5nZXMgdG8gdGhlIGNvbXBpbGVyIHBhY2thZ2VzIGluIG9wYW0tcmVw b3NpdG9yeSB0cmlnZ2VyIHN3aXRjaCByZWJ1aWxkcyBhbGwgb3ZlciB0aGUgd29ybGQsIHNvIHdl IGRvbuKAmXQgd2FudCB0byB0aGF0IHVudGlsIHdl4oCZcmUgc3VyZQ0KIHRoYXQgdGhlIHBhY2th Z2VzIGFyZSBjb3JyZWN0LiBUaGUgaW50ZW50aW9uIGlzIHRvIGRvIHRoaXMgYXJvdW5kIHRoZSB0 aW1lIG9mIHRoZSBhbHBoYSByZWxlYXNlIG9mIG9wYW0gMi4yLCBvbmNlIHRoZSB3b3JrIGluIG9w YW0gaXRzZWxmIGhhcyBzZXR0bGVkIGRvd24uDQo8L3A+DQo8cD5UaGFua3MgZm9yIGdldHRpbmcg dG8gdGhlIGVuZCwgYW5kIGhhcHB5IFdpbmRvd3MgQ0kgdGVzdGluZyEgPC9wPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+T3V0cmVhY2h5IFN1bW1lciAyMDIzPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC04Ij4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktc3VtbWVyLTIwMjMvMTEx NTkvMTAiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291dHJlYWNoeS1zdW1tZXItMjAy My8xMTE1OS8xMDwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1v cmczYmJiMzQ0IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnM2JiYjM0NCI+UGF1bC1F bGxpb3QgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmczYmJiMzQ0Ij4NCjxwPkp1c3Qgd2FudGVkIHRvIHNheSB0aGF0IEkgYWxzbyBzdWJtaXR0 ZWQgYW4gT0NhbWwgT3V0cmVhY2h5IHByb2plY3QhIDwvcD4NCjxwPlRoZSBnb2FsIG9mIHRoZSBw cm9qZWN0IGlzIHRvIGltcHJvdmUgdGhlIGVycm9yIHJlcG9ydGluZyBpbiB0aGUgUFBYcyBlY29z eXN0ZW0uIFRoaXMgaW5jbHVkZXMgYm90aCBtb2RpZnlpbmcgcHB4bGli4oCZcyBiZWhhdmlvciB3 aGVuIGNhdGNoaW5nIGFuIGV4Y2VwdGlvbiByYWlzZWQgYnkgYSByZXdyaXRlcjsgYW5kIG1vZGlm eSBleGlzdGluZyBQUFhzIHRvIGJldHRlciByZXBvcnQgZXJyb3IgKGJ5IGVtYmVkZGluZyB0aGVt IGluc2lkZSB0aGUNCiBBU1Qgd2hlbiByZWxldmFudCwgYWxsb3dpbmcgZm9yIGJvdGggbXVsdGlw bGUgZXJyb3IgcmVwb3J0aW5nLCBhbmQgY3JlYXRpb24gb2YgYSBwYXJ0aWFsIEFTVCB0aGF0IGNv bnRhaW5zIGFsbCBpbmZvcm1hdGlvbiB0aGF0IGNvdWxkIGJlIGNyZWF0ZWQpLg0KPC9wPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPlZTIENvZGUgZXh0ZW5zaW9uIEFsY290ZXN0IFRlc3Qg RXhwbG9yZXIgMC40LjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0 LTkiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi12cy1jb2RlLWV4dGVuc2lvbi1hbGNvdGVzdC10ZXN0LWV4cGxvcmVyLTAtNC0wLzExNjM2LzEi Pg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi12cy1jb2RlLWV4dGVuc2lvbi1hbGNv dGVzdC10ZXN0LWV4cGxvcmVyLTAtNC0wLzExNjM2LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzVhNDNjM2IiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc1YTQzYzNiIj5Sb2xhbmQgQ3Nhc3phciBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzVhNDNjM2IiPg0KPHA+VGhhbmtzIHRvIEBN dXFpdS1IYW4gYSBzZXZlcmUgYnVnIGhhcyBiZWVuIGZpeGVkOiBhbiBleGNlcHRpb24gcmFpc2Vk IGJ5IDxjb2RlPg0KZmFpbHdpdGg8L2NvZGU+IHdhc27igJl0IHJlY29nbml6ZWQgYXMgZmFpbHVy ZSBhbmQgdGhlIHRlc3QgcmVzdWx0IGhhZCBiZWVuIHNldCB0byDigJlwYXNzZWTigJkuDQo8L3A+ DQo8cD5DaGFuZ2Vsb2c6IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnZWNmNWZmOCIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2VjZjVmZjgiPlZlcnNp b24gMC40LjAgKDIwMjMtMDMtMTApPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBp ZD0idGV4dC1vcmdlY2Y1ZmY4Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5NYXJrIGEgdGVz dCBjYXNlIGFzIGZhaWxlZCBpZiBhIDxjb2RlPltGQUlMXTwvY29kZT4gdGFnIGlzIHByZXNlbnQs IGV2ZW4gaWYgdGhlIGFjdHVhbCBlcnJvciBtZXNzYWdlIGNhbuKAmXQgYmUgcGFyc2VkLg0KPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE5 MzljODgiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcxOTM5Yzg4Ij5CdWdmaXhlczwv aDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnMTkzOWM4OCI+DQo8 dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+TWFrZSB0aGUgZXJyb3IgcGFyc2VyIHJlY29nbml6ZSB0 aGUgZXhjZXB0aW9uIGdlbmVyYXRlZCBieSA8Y29kZT5mYWlsd2l0aDwvY29kZT4uIChGaXgNCjxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwt YWxjb3Rlc3QtdGVzdC1hZGFwdGVyL2lzc3Vlcy8xIj4NCiMxPC9hPikgPC9saT48L3VsPg0KPC9k aXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2U4YjRmYjQiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdlOGI0ZmI0Ij5JbnRlcm5hbCBDaGFuZ2VzPC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmdlOGI0ZmI0Ij4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT5BZGQgdGVzdCBjYXNlcyB0byBjaGVjayB0aGF0IHRoZSBjaGFu Z2VzIGFjdHVhbGx5IHdvcmsuIDwvbGk+PGxpPkZpeCB0eXBvIGluIGlzc3VlIHRlbXBsYXRlLiA8 L2xpPjxsaT5Db3JyZWN0IHRoZSBqb2IgbmFtZSBpbiB0aGUgPGNvZGU+cmVsZWFzZTwvY29kZT4g R2l0SHViIHdvcmtmbG93LiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzhkYTRiNWEiIGNsYXNzPSJvdXRsaW5l LTIiPg0KPGgyIGlkPSJvcmc4ZGE0YjVhIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC1vcmc4ZGE0YjVhIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlz cyBhIENXTiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlx dWUub3JnIj4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91 LCBvciBnbyB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+ Lg0KPC9wPg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkg bWFpbCwgeW91IG1heSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9s aXN0aW5mby9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNz PSJhdXRob3JuYW1lIiBpZD0ib3JnZGQ5OGIyOCI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Mailbox Transport; Tue, 7 Mar 2023 09:03:47 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 7 Mar 2023 09:03:47 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.21 via Frontend Transport; Tue, 7 Mar 2023 09:03:47 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 327931Fp030891 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 7 Mar 2023 09:03:01 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 32792pQh030875 for ; Tue, 7 Mar 2023 09:02:51 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Mar 2023 10:02:47 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id DFFB3E4EC2; Tue, 7 Mar 2023 10:02:48 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 28D8EE0385 for ; Tue, 7 Mar 2023 10:02:46 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Mar 2023 10:02:45 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EF9085647CD; Tue, 7 Mar 2023 10:02:42 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZUNO65IfdgngVzkioHq7/6gxhlw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 7 Mar 2023 09:02:33 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 8ca7357a-cb28-462b-2b02-08db1eeadc9d X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,240,1673910000"; d="scan'208,217";a="49420189" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499903, queueID=3D5D85647D0 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <93C55E838C554C4DA91F56444E0296BB@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMy0wNyBUdWUgMDk6NTQgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDIuMjguaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMy4xNC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDI4IHRvIE1hcmNoIDA3LCAy MDIzLg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0K PGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVu dHMiIHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5XYXRjaC5vY2FtbC5v cmc6IG91dCBvZiBiZXRhLCBhbmQgYSBjYWxsIGZvciBuZXcgdmlkZW9zPC9hPiA8L2xpPjxsaT48 YSBocmVmPSIjMiI+Q29tcGFuaWVzIHVzaW5nIE9DYW1s4oCTc3RhZmZpbmcvcmVjcnVpdG1lbnQv dHJhaW5pbmc/PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMyI+RHVuZSAzLjcuMOKAmXMgbmF0aXZl IHN1cHBvcnQgZm9yIHdhdGNoIG1vZGUgb24gV2luZG93cyAoYmxvZyBwb3N0KTwvYT4NCjwvbGk+ PGxpPjxhIGhyZWY9IiM0Ij5JbnRyb2R1Y3Rpb24gdG8gRWlvICh2aWRlbyk8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiM1Ij5NaXJhZ2VPUyByZXRyZWF0IGluIE1hcnJha2VjaCBNYXkgMXN0IC0gN3Ro PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+TGlxdWlkc29hcCAyLjEuNCBhbmQgcm9sbGluZyBy ZWxlYXNlIDIuMi54IGFyZSBvdXQhPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNyI+VXNlcnMgb2Yg b3BhbS1yZXBvOiB3aGF0IHNvcnQgb2YgY2hhbmdlIHRyYWNraW5nIHdvdWxkIHlvdSBsaWtlPzwv YT4NCjwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5WUyBDb2RlIEV4cGVjdCBhbmQgSW5saW5lIFRlc3Rz IGV4dGVuc2lvbjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzkiPjxjb2RlPnBweF9taW5pZGVidWc8 L2NvZGU+IGF1dG9tYXRlcyB0aGUgcHJpbnRmIGluIHByaW50Zi1zdHlsZSBkZWJ1Z2dpbmc8L2E+ DQo8L2xpPjxsaT48YSBocmVmPSIjMTAiPlZTIENvZGUgdGVzdGluZyBleHRlbnNpb24gZm9yIEFs Y290ZXN0IGFuZCBpbmxpbmUgQWxjb3Rlc3QgUFBYIDAuMS4wIC0gaW5pdGlhbCByZWxlYXNlPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iI29yZzUwOGIyODUiPk9sZCBDV048L2E+IDwvbGk+PC91bD4N CjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0 bGluZS0yIj4NCjxoMiBpZD0iMSI+V2F0Y2gub2NhbWwub3JnOiBvdXQgb2YgYmV0YSwgYW5kIGEg Y2FsbCBmb3IgbmV3IHZpZGVvczwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvd2F0Y2gtb2NhbWwtb3JnLW91dC1vZi1iZXRhLWFuZC1hLWNhbGwtZm9yLW5ldy12aWRlb3Mv MTE1NjEvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2F0Y2gtb2NhbWwtb3JnLW91 dC1vZi1iZXRhLWFuZC1hLWNhbGwtZm9yLW5ldy12aWRlb3MvMTE1NjEvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjRjNTNmOSIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZzI0YzUzZjkiPkFuaWwgTWFkaGF2YXBlZGR5IGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMjRjNTNmOSI+DQo8 cD5UaGUgPGI+PGEgaHJlZj0iaHR0cHM6Ly93YXRjaC5vY2FtbC5vcmciPmh0dHBzOi8vd2F0Y2gu b2NhbWwub3JnPC9hPjwvYj4gdmlkZW8gc2l0ZSBpcyBub3cgcHJvbW90ZWQgdG8gYSBwcm9kdWN0 aW9uIHF1YWxpdHkgb2NhbWwub3JnIHNpdGUsIGFzDQo8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3Qvb2NhbWwtb3JnLXJlY2FwcGluZy0yMDIyLWFuZC1xdWVyaWVzLW9uLXRoZS1m ZWRpdmVyc2UvMTEwOTkiPg0KZGlzY3Vzc2VkPC9hPiBhdCB0aGUgc3RhcnQgb2YgdGhlIHllYXIg KGRvZXNu4oCZdCB0aGF0IHNlZW0gbGlrZSBhIGxvbmcgdGltZSBhZ28/KSBGb3IgdGhvc2UgaW50 ZXJlc3RlZCwgdGhpcyBtZWFucyB0aGF0IHRoZSBzb2Z0d2FyZSBzdGFjayBpcyBub3cgcGFydCBv ZiB0aGUgZGVwbG95LmNpLm9jYW1sLm9yZyBwaXBlbGluZSAoc2VlDQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvaW5mcmFzdHJ1Y3R1cmUvaXNzdWVzLzIzIj5vY2FtbC9pbmZyYXN0 cnVjdHVyZSMyMzwvYT4gYW5kIHRoZQ0KPGEgaHJlZj0iaHR0cDovL2luZnJhLm9jYW1sLm9yZy8y MDIzLzAyLzI3L3dhdGNoLW9jYW1sLW9yZy5odG1sIj5pbmZyYUBvY2FtbCBibG9ncG9zdDwvYT4u KQ0KPC9wPg0KPHA+Tm93IHRoYXQgdGhpcyBpcyBkb25lLCBpdOKAmXMgYSBnb29kIHRpbWUgdG8g cHV0IGEgY2FsbCBvdXQgdG8gYW55IG90aGVyIGludGVyZXN0ZWQgT0NhbWwgbWVldHVwcywgd29y a3Nob3BzIG9yIGNvbmZlcmVuY2VzIHRoYXQgYWxzbyB3YW50IHRvIGhvc3QgT0NhbWwgcmVsYXRl ZCBjb250ZW50LiBTZWUgdGhlDQo8YSBocmVmPSJodHRwczovL3dhdGNoLm9jYW1sLm9yZy9hYm91 dC9pbnN0YW5jZSN0ZXJtcyI+d2F0Y2gvYWJvdXQ8L2E+IHBhZ2UgZm9yIG1vcmUgaW5mb3JtYXRp b24gYWJvdXQgaG93IHRoYXQgd29ya3MuIElmIHlvdSBkbyBoYXZlIGEgc3RyZWFtIG9mIHZpZGVv cyAoaGlzdG9yaWNhbCwgb3IgcmVjZW50LCBib3RoIGFyZSBnb29kKSwgdGhlbiB3ZSBjYW4gbWly cm9yIGl0IHRoZXJlIG9yIGhvc3QgaXQgZGlyZWN0bHkuIEFzIGEgcmVtaW5kZXIsDQogYW55b25l IG9uIGEgQWN0aXZpdHlQdWItY29tcGxpYW50IHNlcnZpY2UgKHN1Y2ggYXMgTWFzdG9kb24pIGNh biBmb2xsb3cgY2hhbm5lbHMgaG9zdGVkIG9uIHRoZSBzZXJ2aWNlIGFuZCBsZWF2ZSBjb21tZW50 cy4NCjwvcD4NCjxwPlRoYW5rcyB0byBAbXRlbHZlcnMgQHBhdHJpY29mZXJyaXMgQGN1aWh0bGF1 YWMgQHNhYmluZSBmb3IgbG9hZHMgb2Ygb2NhbWwub3JnIHVwZGF0ZXMgYXMgd2VsbCB0byBtYWtl IHRoaXMgcG9zc2libGUhIFRoYXQgd2FzIGxvdHMgb2Ygd29yaywgYnV0DQo8YSBocmVmPSJodHRw czovL29jYW1sLm9yZy9jb21tdW5pdHkiPmh0dHBzOi8vb2NhbWwub3JnL2NvbW11bml0eTwvYT4g bm93IGxpbmtzIHRvIHRoZSBzaXRlIGFuZCBlYWNoIHdvcmtzaG9wIHBhZ2Ugc2hvdWxkIGJlIHVw LXRvLWRhdGUgYmFjayB0byAyMDEyLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjIi PkNvbXBhbmllcyB1c2luZyBPQ2FtbOKAk3N0YWZmaW5nL3JlY3J1aXRtZW50L3RyYWluaW5nPzwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY29tcGFuaWVzLXVzaW5nLW9j YW1sLXN0YWZmaW5nLXJlY3J1aXRtZW50LXRyYWluaW5nLzExNTYyLzIiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2NvbXBhbmllcy11c2luZy1vY2FtbC1zdGFmZmluZy1yZWNydWl0bWVu dC10cmFpbmluZy8xMTU2Mi8yPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc1M2MzMTVjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNTNjMzE1 YyI+WWF3YXIgQW1pbiBhc2tlZCBhbmQgTmljb2xhcyBPamVkYSBCYXIgcmVwbGllZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNTNjMzE1YyI+DQo8YmxvY2tx dW90ZT4NCjxwPkkgYW0gY3VyaW91cyBhYm91dCBzb21ldGhpbmcuIFRoZXJlIGFyZSBtYW55IGNv bXBhbmllcyB1c2luZyBPQ2FtbCwgc29tZSBvZiB0aGVtIHZlcnkgc3VjY2Vzc2Z1bCBhbmQgZmFt b3VzLiBPdGhlcnMgbW9yZSBvYnNjdXJlLiBUaGV5IGFsbCBvYnZpb3VzbHkgaGF2ZSBvbmUgdGhp bmcgaW4gY29tbW9u4oCTdGhleSBuZWVkIHRvIGVtcGxveSBkZXZlbG9wZXJzIHRvIG1haW50YWlu IHRoZWlyIE9DYW1sIGNvZGViYXNlLg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+SSBjYW4gdGVs bCB5b3UgYSBsaXR0bGUgYml0IGZyb20gbXkgZXhwZXJpZW5jZSBhdCBMZXhpRmkuIChUaGlzIGlz IHN0cmljdGx5IG15IHBlcnNvbmFsIG9waW5pb24sIGFuZCBpbiBubyB3YXkgaXQgc2hvdWxkIGJl IHVuZGVyc3Rvb2QgYXMgYW4gb2ZmaWNpYWwgc3RhdGVtZW50IG9mIGFueSBraW5kLikNCjwvcD4N CjxibG9ja3F1b3RlPg0KPHA+TXkgcXVlc3Rpb24gaXMsIGhvdyBoYXZlIHRoZXkgYmVlbiBmaW5k aW5nIGRldmVsb3BlcnMgZm9yIGEgbmljaGUgbGFuZ3VhZ2U/IDwvcD4NCjwvYmxvY2txdW90ZT4N CjxwPk1vc3QgcHJvZ3JhbW1lcnMgaGlyZWQgYXQgTGV4aUZpIGFscmVhZHkga25vdyBzb21lIChv ciBhIGxvdCkgb2YgT0NhbWwuIE9mdGVuLCB0aGV5IGhhdmUgYSB0d28teWVhciBNYXN0ZXIgcHJv Z3JhbSBpbiBDUyAoY2FsbGVkIOKAnE0y4oCdIGluIEZyYW5jZSkgb3IgYW4gRW5naW5lZXJpbmcg ZGVncmVlIHVuZGVyIHRoZWlyIGJlbHQsIHdoZXJlIHRoZXkgbGVhcm4gT0NhbWwsIGJ1dCB0aGlz IGlzIG5vdCBhIHJlcXVpcmVtZW50LiBUeXBpY2FsbHksDQogd2UgYWR2ZXJ0aXNlIHRoZSBwb3Np dGlvbiBpbiB0aGUgdXN1YWwgcGxhY2VzLCBhbmQgY2FuZGlkYXRlcyBzZW5kIGluIHRoZWlyIGFw cGxpY2F0aW9ucy4gQSBmZXcgcmVtYXJrczoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5Gb3IgdGhlIGxhc3QgY291cGxlIG9mIHllYXJzLCBoaXJpbmcgd2FzIG5vdGljZWFibHkgdGln aHQuIE15IGZlZWxpbmcgaXMgdGhhdCB0aGlzIHdhcyBpbiBsYXJnZSBwYXJ0IGR1ZSB0byBjZXJ0 YWluIGJsb2NrY2hhaW4tYmFja2VkIGNvbXBhbmllcyBpbiBGcmFuY2Ugc2lwaG9uaW5nIGEgZGlz cHJvcG9ydGlvbmFsbHkgbGFyZ2UgbnVtYmVyIG9mIE9DYW1sIHByb2dyYW1tZXJzIG9mZiB0aGUg bWFya2V0LiBJIHNheSDigJx3YXPigJ0gYmVjYXVzZQ0KIHNpbmNlIHRoZSByZWNlbnQgYml0Y29p biBkb3dudHVybiwgd2UgaGF2ZSBzZWVuIGEgbm90aWNlYWJsZSBpbmNyZWFzZSBpbiB0aGUgbnVt YmVyIG9mIGdvb2QgY2FuZGlkYXRlcywgYW5kIGhpcmluZyBoYXMgbG9vc2VuZWQgdXAgYWdhaW4u DQo8L2xpPjxsaT5XZSBhcmUgYSBzbWFsbCB0ZWFtLCBzbyBkb27igJl0IG5lZWQgdG8gaGlyZSBt b3JlIHRoYW4gb25lIG9yIHR3byBwZW9wbGUgYXQgYSB0aW1lLiBJIGFtIG5vdCBzdXJlIHdoYXQg dGhlIHNpdHVhdGlvbiB3b3VsZCBsb29rIGxpa2UgaWYgd2Ugd2lzaGVkIHRvIGhpcmUgdGVucyBv ZiBwcm9ncmFtbWVycyBhdCBvbmUgdGltZS4NCjwvbGk+PC91bD4NCjxwPkFsc28sIG91ciBleHBl cmllbmNlIG1heSBiZSBhIGJpdCBwYXJ0aWN1bGFyIGJlY2F1c2Ugd2UgYXJlIGJhc2VkIGluIEZy YW5jZSwgd2hlcmUgKEkgZ3Vlc3MpIHRoZSBzdXBwbHkgb2YgT0NhbWwgcHJvZ3JhbW1lcnMgaXMg aGlnaGVyIHRoYW4gYXZlcmFnZS4NCjwvcD4NCjxibG9ja3F1b3RlPg0KPHA+SeKAmXZlIGhlYXJk IHRoYXQgSmFuZSBTdHJlZXQgaGFzIGRldmVsb3BlZCBhIDItd2VlayBjcmFzaCBjb3Vyc2UgYW5k IG1hbnkgaW50ZXJuYWwgdG9vbHMsIGlkaW9tcywgYW5kIGJlc3QgcHJhY3RpY2VzLg0KPC9wPg0K PC9ibG9ja3F1b3RlPg0KPHA+V2UgaGF2ZW7igJl0IGhhZCB0byBvbmJvYXJkIG1hbnkgcHJvZ3Jh bW1lcnMgd2hvIGRpZCBub3Qga25vdyBPQ2FtbCBiZWZvcmUsIHNvIHdlIGRvbuKAmXQgaGF2ZSBh IGRlZGljYXRlZCB0cmFpbmluZyBwcm9ncmFtLiBXZSB0cnkgdG8gZG9jdW1lbnQgd29ya2Zsb3dz LCBidXQgdGhlIHRydXRoIGlzIHRoYXQgYSBsb3Qgb2YgdGhlIGluc3RpdHV0aW9uYWwga25vd2xl ZGdlIGFib3V0IHRoZSBjb2RlIGlzIG5vdCB3cml0dGVuIGRvd24gYW55d2hlcmUsDQogYW5kIG5l dyBoaXJlcyBsZWFybiBpdCBieSB0YWxraW5nIHRvIHBlb3BsZSBhcm91bmQgdGhlbS4gVGhpcyBw cm9iYWJseSB3b3JrcyBhcyBsb25nIGFzIHlvdXIgdGVhbSBpcyByZWxhdGl2ZWx5IHNtYWxsLCBi dXQgd2lsbCBub3Qgc2NhbGUgYmV5b25kIGEgY2VydGFpbiBwb2ludCwgd2hpY2ggaXMgd2h5IG1v cmUgc3RydWN0dXJlZCBvbmJvYXJkaW5nIHByb2Nlc3NlcyBhcmUgbmVlZGVkIGluIGxhcmdlciBj b21wYW5pZXMuDQo8L3A+DQo8cD5BcyBhbm90aGVyIGRhdGEgcG9pbnQsIG91ciDigJxxdWFudOKA nSB0ZWFtLCB3aGljaCBjb25zaXN0cyBlbnRpcmVseSBvZiBxdWFudGl0YXRpdmUgcHJvZ3JhbW1l cnMgd2hpY2ggdHlwaWNhbGx5IGFycml2ZSB0byBMZXhpRmkgd2l0aCBsaXR0bGUgb3Igbm8gT0Nh bWwgZXhwZXJpZW5jZSwgZGV2ZWxvcGVkIGEg4oCcY3Jhc2ggY291cnNlIGluIE9DYW1s4oCdLiBO ZXcgYXJyaXZhbHMgdHlwaWNhbGx5IGdvIHRocm91Z2ggaXQgdG8gZ2V0IHVwIHRvIHNwZWVkDQog c28gdGhhdCB0aGV5IGNhbiBzdGFydCBjb250cmlidXRpbmcgdG8gdGhlIGNvZGViYXNlLiBPbiB0 aGUgb3RoZXIgaGFuZCwgcXVhbnQgcHJvZ3JhbW1lcnMgaGF2ZSB2ZXJ5IHNwZWNpZmljIHNraWxs cyBhbmQgZG9u4oCZdCB0eXBpY2FsbHkg4oCccm9hbeKAnSBvdmVyIHRoZSB3aG9sZSBjb2RlYmFz ZSwgc28gaXQgaXMgZWFzaWVyIHRvIHR1bmUgdGhlaXIgdHJhaW5pbmcgZm9yIHRoZSBraW5kIG9m IHRhc2tzIHRoZXkgd2lsbCBiZSBkb2luZy4NCjwvcD4NCjxibG9ja3F1b3RlPg0KPHA+SeKAmXZl IGFsc28gaGVhcmQgb2Ygc29tZSBjb21wYW5pZXMgd2hpY2ggaGFkIHRvIG1vdmUgYXdheSBmcm9t IE9DYW1sIChvciBSZWFzb24vUmVTY3JpcHQpIGNvZGViYXNlcyBkdWUgdG8gdGhlIHVzdWFsbHkg Y2l0ZWQgcmVhc29u4oCTbGFjayBvZiBzdXBwb3J0Lg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+ VGhpcyB3b3VsZCBiZSB1bnRoaW5rYWJsZSBhdCBMZXhpRmk7IHdlIHVzZSBPQ2FtbCBmb3IgZXZl cnl0aGluZywgYXJlIGFyZSBmdWxseSBpbnZlc3RlZCBpbiBpdC4gQnV0IEkgY2FuIHNlZSBob3cg dGhpcyBjb3VsZCBiZSBhIHByb2JsZW0gaW4gYSBjb21wYW55IHdoZXJlIE9DYW1sIGtub3dsZWRn ZSBpcyB0aGUgcmVzZXJ2ZSBvZiBhIHNtYWxsIG51bWJlciBvZiBwZW9wbGUuDQo8L3A+DQo8Ymxv Y2txdW90ZT4NCjxwPkhvdyBhcmUgY29tcGFuaWVzIGluIGdlbmVyYWwgY29udmluY2luZyBnb29k IGRldmVsb3BlcnMgdG8gam9pbiwgbGVhcm4gT0NhbWwsIHN0YXkgb24gaW4gdGhlIGpvYiBpbnN0 ZWFkIG9mIGZseWluZyB0byBncmVlbmVyIHBhc3R1cmVzLCBhbmQgYnVpbGRpbmcgdXAgZW5naW5l ZXJpbmcgY29udGludWl0eSB3aXRoIHRyYWluaW5nL2RvY3VtZW50YXRpb24gc28gdGhhdCB0aGVp ciB3aG9sZSBPQ2FtbCBjb2RlYmFzZSBpcyBub3QgYXQgdGhlIG1lcmN5DQogb2Ygb25lIG9yIHR3 byBlbmdpbmVlcnMgZGVjaWRpbmcgdG8gc3RheSBvciBsZWF2ZT8gPC9wPg0KPC9ibG9ja3F1b3Rl Pg0KPHA+SSBjYW4gb25seSBoeXBvdGhlc2l6ZSBhYm91dCBteSBjb2xsZWFndWVzLCBidXQgbXkg cGVyc29uYWwgZmVlbGluZyBpcyB0aGF0IEnigJltIHF1aXRlIGhhcHB5IHRvIGJlIGFibGUgdG8g bWFrZSBhIGxpdmluZyBwcm9ncmFtbWluZyBpbiBPQ2FtbCwgc28gdGhpcyBhY3RzIGFzIGFuIGlu Y2VudGl2ZSB0byByZW1haW4sIHJhdGhlciB0aGFuIHRvIGxlYXZlLiBNb3JlIGdlbmVyYWxseSwg Zm9yIHdoYXRldmVyIHJlYXNvbiwgdGhlIHR1cm5vdmVyDQogYXQgTGV4aUZpIGlzIGV4dHJlbWVs eSBsb3csIHNvIHdlIGhhdmVu4oCZdCBoYWQgdG8gZGVhbCB3aXRoIGlzc3VlcyBzdGVtbWluZyBm cm9tIGhpZ2ggY2h1cm4gcmF0ZS4gSSB0aGluayBpdCB3b3VsZCBkZWZpbml0aXZlbHkgYmUgYSBw cm9ibGVtIGlmIHRoaXMgd2VyZSB0byBoYXBwZW4uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxo MiBpZD0iMyI+RHVuZSAzLjcuMOKAmXMgbmF0aXZlIHN1cHBvcnQgZm9yIHdhdGNoIG1vZGUgb24g V2luZG93cyAoYmxvZyBwb3N0KTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvZHVuZS0zLTctMHMtbmF0aXZlLXN1cHBvcnQtZm9yLXdhdGNoLW1vZGUtb24td2luZG93cy1i bG9nLXBvc3QvMTE1NjYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZHVuZS0zLTct MHMtbmF0aXZlLXN1cHBvcnQtZm9yLXdhdGNoLW1vZGUtb24td2luZG93cy1ibG9nLXBvc3QvMTE1 NjYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWY5 YThhZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2VmOWE4YWYiPk5pY29sYXMgT2pl ZGEgQmFyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnZWY5YThhZiI+DQo8cD5UaGUgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1kdW5lLTMtNy0wLzExNDc0Ij5yZWNlbnRseSByZWxlYXNlZDwvYT4gRHVuZSAzLjcu MCBpbmNsdWRlcyBuYXRpdmUgc3VwcG9ydCBmb3INCjxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPndh dGNoIG1vZGU8L3NwYW4+IG9uIFdpbmRvd3MuIFRoaXMgZmVhdHVyZSB3YXMgaW1wbGVtZW50ZWQg YnkgYSBzdHVkZW50LCBVbWEgS290aHVyaSBvZiB0aGUgVVMsIHdobyBpbnRlcm5lZCBhdCBMZXhp RmkgbGFzdCB5ZWFyIGZvciB0aGlzIHByb2plY3QuDQo8L3A+DQo8cD5UbyBtYXJrIHRoZSA8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzcwMTAiPnVwc3RyZWFtaW5n PC9hPiBvZiB0aGUgZmVhdHVyZSwgd2Ugd3JvdGUgYSBicmllZiB0ZWNobmljYWwgbm90ZSBhYm91 dCBpdCwgd2hpY2ggeW91IGNhbiBmaW5kIGF0DQo8YSBocmVmPSJodHRwczovL3d3dy5sZXhpZmku Y29tL2Jsb2cvb2NhbWwvZHVuZS13YXRjaC1tb2RlLXdpbmRvd3MvIj5odHRwczovL3d3dy5sZXhp ZmkuY29tL2Jsb2cvb2NhbWwvZHVuZS13YXRjaC1tb2RlLXdpbmRvd3MvPC9hPi4gRG9u4oCZdCBo ZXNpdGF0ZSB0byB0YWtlIGEgbG9vayBpZiB5b3Ugd291bGQgbGlrZSB0byBnZXQgYW4gb3ZlcnZp ZXcgb2YgaG93IHRoZSBmZWF0dXJlIGlzIGltcGxlbWVudGVkLg0KPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjQiPkludHJvZHVjdGlvbiB0byBFaW8gKHZpZGVvKTwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaW50cm9kdWN0aW9uLXRvLWVpby12aWRlby8xMTU3 MS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9pbnRyb2R1Y3Rpb24tdG8tZWlvLXZp ZGVvLzExNTcxLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnYjA5ZjA2MiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2IwOWYwNjIiPlRob21h cyBMZW9uYXJkIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9 InRleHQtb3JnYjA5ZjA2MiI+DQo8cD5JIGdhdmUgYW4gaW50cm9kdWN0aW9uIHRvIEVpbyB0YWxr IGF0IFRhcmlkZXMgbGFzdCB3ZWVrLCBhbmQgYWZ0ZXJ3YXJkcyB3ZSB0aG91Z2h0IGl0IG1pZ2h0 IGJlIHdvcnRoIHNoYXJpbmcgaXQgbW9yZSB3aWRlbHkuIEkgY292ZXJlZCBtb3JlIGFib3V0IGhv dyBFaW8gY29tcGFyZXMgd2l0aCBMd3QgdGhhbiB0aGUgUkVBRE1FIGRvZXMsIGFuZCB0aGUgdmlk ZW8gaW5jbHVkZXMgYSBzaG9ydCBleGFtcGxlIGF0IHRoZSBzdGFydCBvZiBtZSBjb252ZXJ0aW5n DQogc29tZSBleGlzdGluZyBjb2RlIHRvIHVzZSBlZmZlY3RzOiA8L3A+DQo8cD48YSBocmVmPSJo dHRwczovL3dhdGNoLm9jYW1sLm9yZy93LzAyYTdhY2NjLTJhMmMtNDRkNS04ODllLWQ3NWUxNDg5 OTQ2ZSI+aHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdy8wMmE3YWNjYy0yYTJjLTQ0ZDUtODg5ZS1k NzVlMTQ4OTk0NmU8L2E+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNSI+TWlyYWdl T1MgcmV0cmVhdCBpbiBNYXJyYWtlY2ggTWF5IDFzdCAtIDd0aDwvaDI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvbWlyYWdlb3MtcmV0cmVhdC1pbi1tYXJyYWtlY2gtbWF5LTFz dC03dGgvMTE1NzIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWlyYWdlb3MtcmV0 cmVhdC1pbi1tYXJyYWtlY2gtbWF5LTFzdC03dGgvMTE1NzIvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNTlkMTUyNyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzU5ZDE1MjciPkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNTlkMTUyNyI+DQo8cD5EZWFyIChh c3BpcmluZykgPGEgaHJlZj0iaHR0cHM6Ly9taXJhZ2UuaW8iPk1pcmFnZU9TPC9hPiBoYWNrZXIs IDwvcD4NCjxwPml0IGlzIG15IHBsZWFzZSB0byBhbm5vdW5jZSB0aGF0IHRoZXJlIHdpbGwgYmUg dGhlIDEydGggTWlyYWdlT1MgcmV0cmVhdCBpbiBlYXJseSBPY3RvYmVyIGluIE1hcnJha2VjaCwg TW9yb2Njby4gUGxlYXNlIGZpbmQgbW9yZSBkZXRhaWxzLCBpbmNsdWRpbmcgd3JpdGV1cHMgb2Yg ZWFybGllciByZXRyZWF0cyBhdA0KPGEgaHJlZj0iaHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pbyI+ aHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pbzwvYT4uIDwvcD4NCjxwPkV2ZXJ5b25lIGlzIHdlbGNv bWUsIGJlIGtpbmQgdG8gZWFjaCBvdGhlci4gVGhlcmUgd29u4oCZdCBiZSBtdWNoIEludGVybmV0 IGNvbm5lY3Rpdml0eSDigJMgYnV0IHRoZXJl4oCZcyBwbGVudHkgb2Ygc3VuLCBkaXNjdXNzaW9u cywgaW1wcm9tcHR1IHRhbGtzLCBhbmQgYSBsb2NhbCBuZXR3b3JrIG1haW5seSBjb25zdHJ1Y3Rl ZCBieSBNaXJhZ2VPUyB1bmlrZXJuZWxzLg0KPC9wPg0KPHA+SWYgeW91IGhhdmUgcXVlc3Rpb25z LCBkb27igJl0IGhlc2l0YXRlIHRvIGFzayB0aGVtIGhlcmUgaW4gdGhpcyB0aHJlYWQsIG9yIGNv bnRhY3QgbWUgZGlyZWN0bHkgdmlhIGVNYWlsIOKAnG15IGZpcnN0IG5hbWXigJ0gYXQgbWVobmVy dCBET1Qgb3JnDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+TGlxdWlkc29hcCAy LjEuNCBhbmQgcm9sbGluZyByZWxlYXNlIDIuMi54IGFyZSBvdXQhPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9saXF1aWRzb2FwLTItMS00LWFuZC1yb2xsaW5nLXJlbGVh c2UtMi0yLXgtYXJlLW91dC8xMTU3Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9s aXF1aWRzb2FwLTItMS00LWFuZC1yb2xsaW5nLXJlbGVhc2UtMi0yLXgtYXJlLW91dC8xMTU3Ni8x PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkNzJkYzRm IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZDcyZGM0ZiI+Um9tYWluIEJlYXV4aXMg YW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdk NzJkYzRmIj4NCjxwPkhpIGFsbCEgPC9wPg0KPHA+TGlxdWlkc29hcCA8Y29kZT4yLjEuNDwvY29k ZT4gaXMgb3V0OiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9saXF1aWRzb2Fw L3JlbGVhc2VzL3RhZy92Mi4xLjQiPg0KaHR0cHM6Ly9naXRodWIuY29tL3Nhdm9uZXQvbGlxdWlk c29hcC9yZWxlYXNlcy90YWcvdjIuMS40PC9hPiAhIPCfjokgPC9wPg0KPHA+TGlxdWlkc29hcCBS b2xsaW5nIFJlbGVhc2UgPGNvZGU+Mi4yLng8L2NvZGU+IGlzIG5vdyBhdmFpbGFibGU6IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zYXZvbmV0L2xpcXVpZHNvYXAvcmVsZWFzZXMvdGFnL3Jv bGxpbmctcmVsZWFzZS12Mi4yLngiPg0KaHR0cHM6Ly9naXRodWIuY29tL3Nhdm9uZXQvbGlxdWlk c29hcC9yZWxlYXNlcy90YWcvcm9sbGluZy1yZWxlYXNlLXYyLjIueDwvYT4gISDwn46JDQo8L3A+ DQo8cD5UaGUgPGNvZGU+Mi4xLjQ8L2NvZGU+IHJlbGVhc2UgY29udGFpbnMgaW1wb3J0YW50IGJ1 ZyBmaXhlcywgaW5jbHVkaW5nIGEgbGFzdC1taW51dGUgbWVtb3J5IGlzc3VlIHdpdGggaHR0cCBy ZXF1ZXN0cyBhbmQgcXVlcmllcyB0aGF0IHdhcyBpbnRyb2R1Y2VkIGluDQo8Y29kZT4yLjEuMzwv Y29kZT4uIEFsbCB1c2VycyBhcmUgZW5jb3VyYWdlZCB0byBtaWdyYXRlIHRvIGl0IGJ1dCBtYWtl IHN1cmUgdG8gdXNlIGEgc3RhZ2luZyBlbnZpcm9ubWVudCBiZWZvcmUgcHVzaGluZyB0byBwcm9k dWN0aW9uIGp1c3QgaW4gY2FzZSEgRnVsbCBjaGFuZ2Vsb2cgaXMNCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9zYXZvbmV0L2xpcXVpZHNvYXAvYmxvYi92Mi4xLjQvQ0hBTkdFUy5tZCMyMTQt MjAyMi0wMy0wMSI+DQpoZXJlPC9hPiA8L3A+DQo8cD5OZXh0LCB3ZSB3b3VsZCBsaWtlIHRvIHNo aWZ0IG91ciBmb2N1cyB0byB0aGUgPGNvZGU+Mi4yLng8L2NvZGU+IHJlbGVhc2UgY3ljbGUuIFdl IGFyZSBkb25lIHdpdGggdGhlIGNoYW5nZXMgdGhlcmUgYW5kIHdpbGwgbm93IGZvY3VzIG9uIGZp eGluZyBpc3N1ZXMgdGhlcmUuIFdlIGRvIGVuY291cmFnZSBuZXcgcHJvamVjdHMgdG8gc3RhcnQg d2l0aCBpdCBhbmQgdXNlcnMgdG8gcmVwb3J0IGlzc3Vlcy4gV2Ugd2lsbCBwcmlvcml0aXplIHRo ZXNlDQogaXNzdWVzIG92ZXIgb3RoZXIgb25lcy4gPC9wPg0KPHA+VGhlIDxjb2RlPjIuMi54PC9j b2RlPiByZWxlYXNlIGNvbnRhaW5zIHNvbWUgZXhjaXRpbmcgY2hhbmdlcywgaW4gcGFydGljdWxh ciBhIHN3aXRjaCB0bw0KPGNvZGU+ZHVuZTwvY29kZT4gYXMgdGhlIGJ1aWxkIHN5c3RlbSBhbmQg YSBuZXcgc3VwcG9ydCBmb3IgbXVsdGl0cmFjayBkZWNvZGVyL2RlbXV4aW5nL211eGluZy9lbmNv ZGluZy4gWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaXQNCjxhIGhyZWY9Imh0dHBzOi8vd3d3Lmxp cXVpZHNvYXAuaW5mby9kb2MtZGV2L211bHRpdHJhY2suaHRtbCI+aGVyZTwvYT4uIEZ1bGwgY2hh bmdlbG9nIGlzDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9saXF1aWRzb2Fw L2Jsb2IvbWFpbi9DSEFOR0VTLm1kIzIyMC11bnJlbGVhc2VkIj4NCmhlcmU8L2E+LiA8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+VXNlcnMgb2Ygb3BhbS1yZXBvOiB3aGF0IHNvcnQg b2YgY2hhbmdlIHRyYWNraW5nIHdvdWxkIHlvdSBsaWtlPzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtNyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvdXNlcnMtb2Ytb3BhbS1yZXBvLXdoYXQtc29ydC1vZi1jaGFuZ2Ut dHJhY2tpbmctd291bGQteW91LWxpa2UvMTE1OTAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvdXNlcnMtb2Ytb3BhbS1yZXBvLXdoYXQtc29ydC1vZi1jaGFuZ2UtdHJhY2tpbmctd291 bGQteW91LWxpa2UvMTE1OTAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItb3JnNzBmYjU3YyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzcwZmI1 N2MiPkFuaWwgTWFkaGF2YXBlZGR5IGFza2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc3MGZiNTdjIj4NCjxwPkRlYXIgdXNlcnMgKG9mIHRoZSBvcGFtLXJl cG9zaXRvcnkgaW4gcGFydGljdWxhciwgYnV0IGFsc28gb2YgdGhlIGNvbnRhaW5lciBpbWFnZXMg YW5kIHZhcmlvdXMgb3RoZXIgcGllY2VzIG9mIGluZnJhc3RydWN0dXJlIHRoYXQgd2UgcHVibGlz aCBmcm9tIG9jYW1sLm9yZyksDQo8L3A+DQo8cD5BZnRlciB0aGF0IG1vdXRoZnVsIG9mIGFuIGlu dHJvLCBqdXN0IGEgYnJpZWYgbm90ZSB0byBzb2xpY2l0IG9waW5pb25zIG92ZXIgYXQNCjxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9pbmZyYXN0cnVjdHVyZS9pc3N1ZXMvMjAjaXNz dWVjb21tZW50LTE0NTUxNTA5OTgiPg0Kb2NhbWwvaW5mcmFzdHJ1Y3R1cmUjMjA8L2E+IG9uIHdo YXQgd291bGQgYmUgbW9zdCB1c2VmdWwgdG8gdXNlcnMgb2YgdGhlIG9wYW0tcmVwbyBvbiB3aGF0 IHNvcnQgb2YgY2hhbmdlIHRyYWNraW5nIHdvdWxkIGJlIG1vc3QgdXNlZnVsIGZvciB5b3UgdG8g ZmluZCBvdXQgd2hhdOKAmXMgYnJlYWtpbmcgKG9yIGhhcyBiZWVuIGZpeGVkKSBhcyB0aGUgbGl2 ZSBpbmZyYXN0cnVjdHVyZSBldm9sdmVzLg0KPC9wPg0KPHA+VGhlcmXigJlzIGEgbG90IG9mIGlt cHJvdmVtZW50cyBnb2luZyBpbiB0aGFua3MgdG8gYWxsIHRoZSBjb250cmlidXRpb25zIHRvIHRo ZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb3ZlcnZpZXciPg0KdmFyaW91 cyBDSXM8L2E+LCBhbmQgeW91ciBpbnB1dHMgb24gdGhhdCBpc3N1ZSwgb3IgdGhpcyB0aHJlYWQs IHdvdWxkIGJlIHdlbGNvbWUuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci04IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOCI+VlMg Q29kZSBFeHBlY3QgYW5kIElubGluZSBUZXN0cyBleHRlbnNpb248L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi12cy1jb2RlLWV4cGVjdC1hbmQtaW5saW5lLXRlc3Rz LWV4dGVuc2lvbi8xMTU5My8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdnMt Y29kZS1leHBlY3QtYW5kLWlubGluZS10ZXN0cy1leHRlbnNpb24vMTE1OTMvMTwvYT4NCjwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMzRlYjlkNSIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzM0ZWI5ZDUiPlJvbGFuZCBDc2FzemFyIGFubm91bmNlZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMzRlYjlkNSI+DQo8 cD5IaSwgSeKAmXZlIGp1c3QgcmVsZWFzZWQgYSBWUyBDb2RlIGV4dGVuc2lvbiB0byBpbnRlZ3Jh dGUgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4X2V4cGVjdCI+DQpQ UFggRXhwZWN0PC9hPiBhbmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQv cHB4X2lubGluZV90ZXN0Ij5QUFggSW5saW5lIFRlc3Q8L2E+IHRvIFZTIENvZGUuIEl0IGFsc28g d29ya3MgaW4gY29tYmluYXRpb24gd2l0aA0KPGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52 aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1v Y2FtbC1hbGNvdGVzdC10ZXN0LWFkYXB0ZXIiPg0KQWxjb3Rlc3QgVGVzdCBFeHBsb3JlcjwvYT4g PC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0 ZW1zP2l0ZW1OYW1lPXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1vY2FtbC1leHBlY3QtaW5saW5l Ij5FeHBlY3QgYW5kIElubGluZSBUZXN0czwvYT4NCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtZXhwZWN0LWlubGluZSI+R2l0SHViOiBW UyBDb2RlIEV4cGVjdCBhbmQgSW5saW5lIFRlc3RzPC9hPg0KPC9wPg0KPHA+SXQgYWx3YXlzIGFk ZHMvdXBkYXRlcy9kZWxldGVzIGV4cGVjdCBhbmQgaW5saW5lIHRlc3RzIHdoZW4gb3BlbmluZyBv ciBzYXZpbmcgYW4gT0NhbWwgc291cmNlIGZpbGUuIEJ5IGRlZmF1bHQsIGl0IGFsc28gcnVucyBh bGwgaW5saW5lIHRlc3RzIG9mIGFsbCBpbmxpbmUgdGVzdCBydW5uZXJzIHRvIGRpc2NvdmVyIHRl c3RzIG9uIHN0YXJ0dXAuIElmIHRoaXMgdGFrZXMgdG9vIGxvbmcgb3IgeW91IGRvbuKAmXQgbGlr ZSB0aGF0LCB5b3UgY2FuDQogZGlzYWJsZSB0aGF0IGJlaGF2aW9yIGluIHRoZSBzZXR0aW5ncy4g VGhlIDxjb2RlPlJlZnJlc2ggVGVzdHM8L2NvZGU+IGJ1dHRvbiBpbiB0aGUgdXBwZXIgcmlnaHQg b2YgdGhlIFRlc3QgRXhwbG9yZXIgdmlldyBhbHNvIHJ1bnMgYWxsIGV4cGVjdCBhbmQgaW5saW5l IHRlc3RzIHRvIGZpbGwgdGhlIHRyZWUuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnYWNiN2NhMSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2FjYjdjYTEiPlJvbGFuZCBDc2FzemFyIGxhdGVyIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdhY2I3Y2ExIj4NCjxwPkhpLCBhIG5ldyB2ZXJz aW9uIC0gMC4yLjAgLSBvZiB0aGUgRXhwZWN0IGFuZCBJbmxpbmUgUFBYIGV4dGVuc2lvbiB3aXRo IG1pbm9yIGNvc21ldGljIGNoYW5nZXMgaXMgcmVhZHkgZm9yIHlvdS4NCjwvcD4NCjxwPjxhIGhy ZWY9Imh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVtcz9pdGVtTmFtZT1y ZWxlYXNlLWNhbmRpZGF0ZS52c2NvZGUtb2NhbWwtZXhwZWN0LWlubGluZSI+RXhwZWN0IGFuZCBJ bmxpbmUgVGVzdHMNCjwvYT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vUmVsZWFzZS1DYW5k aWRhdGUvdnNjb2RlLW9jYW1sLWV4cGVjdC1pbmxpbmUiPkdpdEh1YjogVlMgQ29kZSBFeHBlY3Qg YW5kIElubGluZSBUZXN0cw0KPC9hPjwvcD4NCjxwPknigJl2ZSBhbHNvIHJlbGVhc2VkIGEgbmV3 IHZlcnNpb24gLSAwLjMuMCAtIG9mIHRoZSBBbGNvdGVzdCBleHRlbnNpb24gKHdpdGggbW9yZSBz dWJzdGFudGlhbCBjaGFuZ2VzKS4gU2VlOg0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi12cy1jb2RlLXRlc3RpbmctZXh0ZW5zaW9uLWZvci1hbGNvdGVzdC1hbmQtaW5s aW5lLWFsY290ZXN0LXBweC0wLTEtMC1pbml0aWFsLXJlbGVhc2UvMTE1MTQvNj91PXJlbGVhc2Ut Y2FuZGlkYXRlIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdnMtY29kZS10ZXN0 aW5nLWV4dGVuc2lvbi1mb3ItYWxjb3Rlc3QtYW5kLWlubGluZS1hbGNvdGVzdC1wcHgtMC0xLTAt aW5pdGlhbC1yZWxlYXNlLzExNTE0LzY/dT1yZWxlYXNlLWNhbmRpZGF0ZTwvYT4NCjwvcD4NCjxw PkNoYW5nZWxvZzogPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3 ZmNiZTdlIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnN2ZjYmU3ZSI+VmVyc2lvbiAw LjIuMCAoMjAyMy0wMy0wNik8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0 ZXh0LW9yZzdmY2JlN2UiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlJlbW92ZSB1bm5lY2Vz c2FyeSBub2RlIOKAmUV4cGVjdCBhbmQgSW5saW5lIFRlc3Rz4oCZIGluIHRoZSBUZXN0IEV4cGxv cmVyIHRyZWUuIDwvbGk+PGxpPkNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwcm9maWxlIHRv IOKAmVJ1biBFeHBlY3QgYW5kIElubGluZSBQUFggdGVzdHPigJkuIDwvbGk+PGxpPkFkZCBkb2N1 bWVudGF0aW9uIG9mIOKAmVJ1biBQcm9maWxlc+KAmS4gPC9saT48bGk+QWRkIEdpdEh1YiBJc3N1 ZSBUZW1wbGF0ZS4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i OSI+PGNvZGU+cHB4X21pbmlkZWJ1ZzwvY29kZT4gYXV0b21hdGVzIHRoZSBwcmludGYgaW4gcHJp bnRmLXN0eWxlIGRlYnVnZ2luZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtOSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvcHB4LW1pbmlkZWJ1Zy1hdXRvbWF0ZXMtdGhlLXByaW50Zi1pbi1wcmludGYtc3R5bGUtZGVi dWdnaW5nLzExNTk2LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweC1taW5pZGVi dWctYXV0b21hdGVzLXRoZS1wcmludGYtaW4tcHJpbnRmLXN0eWxlLWRlYnVnZ2luZy8xMTU5Ni8x PC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc1ZDM4Yjlm IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNWQzOGI5ZiI+THVrYXN6IFN0YWZpbmlh ayBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y ZzVkMzhiOWYiPg0KPHA+SeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgPGEgaHJlZj0iaHR0cHM6Ly9n aXRodWIuY29tL2x1a3N0YWZpL3BweF9taW5pZGVidWciPjxjb2RlPnBweF9taW5pZGVidWc8L2Nv ZGU+PC9hPjoNCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5XaGljaCBpcyBhIHN5bnRh eCBleHRlbnNpb24gdG8gaW5zdHJ1bWVudCB0eXBlLWFubm90YXRlZCBiaW5kaW5ncyBhbmQgZnVu Y3Rpb25zIHdpdGggbG9nZ2luZy4NCjwvbGk+PGxpPlRoZSBleHRlbnNpb24gc3VwcG9ydHMgMyB2 YWx1ZSBjb252ZXJzaW9uIG1lY2hhbmlzbXM6IDxjb2RlPnBwPC9jb2RlPiBhbmQgPGNvZGU+DQpz aG93PC9jb2RlPiBmcm9tIDxjb2RlPmRlcml2aW5nLnNob3c8L2NvZGU+LCBhbmQgPGNvZGU+c2V4 cDwvY29kZT4gZnJvbSA8Y29kZT5wcHhfc2V4cF9jb252PC9jb2RlPi4NCjwvbGk+PGxpPlRoZSA8 Y29kZT5taW5pZGVidWdfcnVudGltZTwvY29kZT4gcGFja2FnZSBwcm92aWRlcyAzIGxvZ2dpbmcg YmFja2VuZHM6IDxjb2RlPg0KRm9ybWF0PC9jb2RlPiBiYXNlZCBwdXJlbHkgb24gZm9ybWF0dGVy cywgPGNvZGU+Rmx1c2hpbmc8L2NvZGU+IHRoYXQgY29udmVydHMgdG8gc3RyaW5ncyBmaXJzdCBh bmQgZmx1c2hlcyBvdXRwdXQgYWZ0ZXIgZXZlcnkgZW50cnksIGFuZA0KPGNvZGU+UHJpbnRCb3g8 L2NvZGU+IHRoYXQgcHJldHR5LXByaW50cyBhcyB0cmVlcyB1c2luZyB0aGUgPGNvZGU+cHJpbnRi b3g8L2NvZGU+IHBhY2thZ2UuDQo8L2xpPjxsaT5JIHJlZmVyZW5jZSBhIFZTIENvZGUgZXh0ZW5z aW9uIHRoYXQgYnVpbGRzIGZsYW1lIGdyYXBocyBmb3IgdGhlIDxjb2RlPkZsdXNoaW5nPC9jb2Rl PiBsb2dnZXIgb3V0LW9mLXRoZS1ib3guDQo8L2xpPjwvdWw+DQo8ZGl2IGlkPSJvcmdhZTM1YTky IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2JhbC5kaXNjb3Vyc2Ut Y2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcHRpbWl6ZWQvMlgvYS9hYzA5YmViNWNm OWE4YWVlMzRjNWVhZDI5YzI2YTJjMjZhOTg4YzZjXzJfMTM4MHg1OTIucG5nIiBhbHQ9ImFjMDli ZWI1Y2Y5YThhZWUzNGM1ZWFkMjljMjZhMmMyNmE5ODhjNmNfMl8xMzgweDU5Mi5wbmciPg0KPC9w Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjEwIj5WUyBDb2RlIHRlc3Rpbmcg ZXh0ZW5zaW9uIGZvciBBbGNvdGVzdCBhbmQgaW5saW5lIEFsY290ZXN0IFBQWCAwLjEuMCAtIGlu aXRpYWwgcmVsZWFzZTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQt MTAiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi12cy1jb2RlLXRlc3RpbmctZXh0ZW5zaW9uLWZvci1hbGNvdGVzdC1hbmQtaW5saW5lLWFsY290 ZXN0LXBweC0wLTEtMC1pbml0aWFsLXJlbGVhc2UvMTE1MTQvNiI+DQpodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLXZzLWNvZGUtdGVzdGluZy1leHRlbnNpb24tZm9yLWFsY290ZXN0LWFu ZC1pbmxpbmUtYWxjb3Rlc3QtcHB4LTAtMS0wLWluaXRpYWwtcmVsZWFzZS8xMTUxNC82PC9hPg0K PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4N2RmYTk4IiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnODdkZmE5OCI+Um9sYW5kIENzYXN6YXIgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4N2RmYTk4 Ij4NCjxwPkhpLCBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBBbGNvdGVzdCBleHRlbnNpb24sIDAuMy4w LCBub3cgcmV0cmllcyBydW5uaW5nIGR1bmUgZXZlcnkgMi41cyBpZiBhbm90aGVyIHByb2Nlc3Mg aG9sZHMgdGhlIGRpcmVjdG9yeSBsb2NrLiBUaGVyZSBhcmUgYWxzbyBzb21lIGFkZGl0aW9uYWws IG1pbm9yLCBjaGFuZ2VzLg0KPC9wPg0KPHA+SeKAmXZlIGFsc28gcmVsZWFzZWQgYSBuZXcgdmVy c2lvbiAtIDAuMi4wIC0gb2YgdGhlIEV4cGVjdCBhbmQgSW5saW5lIFBQWCBleHRlbnNpb24uIFNl ZToNCjxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdnMtY29kZS1leHBl Y3QtYW5kLWlubGluZS10ZXN0cy1leHRlbnNpb24vMTE1OTMvMj91PXJlbGVhc2UtY2FuZGlkYXRl Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdnMtY29kZS1leHBlY3QtYW5kLWlu bGluZS10ZXN0cy1leHRlbnNpb24vMTE1OTMvMj91PXJlbGVhc2UtY2FuZGlkYXRlPC9hPg0KPC9w Pg0KPHA+Q2hhbmdlbG9nOiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2QzY2I4MWQiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdkM2NiODFkIj5WZXJz aW9uIDAuMy4wICgyMDIzLTAzLTA2KTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIg aWQ9InRleHQtb3JnZDNjYjgxZCI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+UmV0cnkgZHVu ZSBjb21tYW5kcyBldmVyeSAyLjVzIGlmIGFub3RoZXIgcHJvY2VzcyBob2xkcyB0aGUgZHVuZSBk aXJlY3RvcnkgbG9jay4NCjwvbGk+PGxpPkNoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdGVzdCBwcm9m aWxlIHRvIOKAmVJ1biBBbGNvdGVzdCB0ZXN0c+KAmS4gPC9saT48bGk+U2V0IHRoZSB0ZXN0cyBz dGF0ZSB0byDigJlydW7igJkgYmVmb3JlIHByb2Nlc3NpbmcgdGhlIHRlc3RzLiA8L2xpPjxsaT5B ZGQgZG9jdW1lbnRhdGlvbiBvZiDigJlSdW4gUHJvZmlsZXPigJkuIDwvbGk+PC91bD4NCjwvZGl2 Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmc0YzEzOGU4Ij48L2E+SW50ZXJu YWwgQ2hhbmdlczxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc0 YzEzOGU4Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BZGQgR2l0SHViIHRlc3QgYWN0aW9u LiA8L2xpPjxsaT5BZGQgR2l0SHViIElzc3VlIFRlbXBsYXRlLiA8L2xpPjxsaT5BZGQganNkb2Mg cGx1Z2luIGZvciBFc2xpbnQuIDwvbGk+PGxpPkZpeCB2YXJpb3VzIGpzZG9jIGVycm9ycy4gPC9s aT48bGk+VXNlIGZ1bmN0aW9uIDxjb2RlPndvcmtzcGFjZUxhYmVsPC9jb2RlPiB0byBzZXQgdGhl IHdvcmtzcGFjZSBub2RlIGxhYmVsIGFuZCBpZC4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48 L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnNTA4YjI4NSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9Im9yZzUwOGIyODUiPk9sZCBD V048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzUwOGIyODUi Pg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+ IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9 Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3Ig dGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJT UyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRv IHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVm PSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9u bGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUiIGlkPSJvcmdiY2UzOTNjIj4N CjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8 L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1s Pg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21 via Mailbox Transport; Tue, 28 Feb 2023 14:39:32 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.21; Tue, 28 Feb 2023 14:39:32 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.21 via Frontend Transport; Tue, 28 Feb 2023 14:39:32 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31SEckbw026689 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 28 Feb 2023 14:38:46 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31SEcbqI026673 for ; Tue, 28 Feb 2023 14:38:37 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Feb 2023 15:38:31 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6C72CE0BFD; Tue, 28 Feb 2023 15:38:26 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 9273AE00BD for ; Tue, 28 Feb 2023 15:38:20 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Feb 2023 15:38:19 +0100 Received: from TM.local (unknown [131.254.252.70]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id ABAF756488B; Tue, 28 Feb 2023 15:38:16 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZS4J45b4lGLEiTkCGPU89kitWTQ== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 28 Feb 2023 14:38:16 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,Marked bulk,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: c8ef0f2d-5894-4b4e-ec7c-08db19999b02 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.98,222,1673910000"; d="scan'208,217";a="48840779" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.467661, queueID=A48EC56488C x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMi0yOCBUdWUgMTU6MzcgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+PHNjcmlwdD4NCiAgd2luZG93 Lk1hdGhKYXggPSB7DQogICAgdGV4OiB7DQogICAgICBhbXM6IHsNCiAgICAgICAgbXVsdGxpbmVX aWR0aDogJzg1JScNCiAgICAgIH0sDQogICAgICB0YWdzOiAnYW1zJywNCiAgICAgIHRhZ1NpZGU6 ICdyaWdodCcsDQogICAgICB0YWdJbmRlbnQ6ICcuOGVtJw0KICAgIH0sDQogICAgY2h0bWw6IHsN CiAgICAgIHNjYWxlOiAxLjAsDQogICAgICBkaXNwbGF5QWxpZ246ICdjZW50ZXInLA0KICAgICAg ZGlzcGxheUluZGVudDogJzBlbScNCiAgICB9LA0KICAgIHN2Zzogew0KICAgICAgc2NhbGU6IDEu MCwNCiAgICAgIGRpc3BsYXlBbGlnbjogJ2NlbnRlcicsDQogICAgICBkaXNwbGF5SW5kZW50OiAn MGVtJw0KICAgIH0sDQogICAgb3V0cHV0OiB7DQogICAgICBmb250OiAnbWF0aGpheC1tb2Rlcm4n LA0KICAgICAgZGlzcGxheU92ZXJmbG93OiAnb3ZlcmZsb3cnDQogICAgfQ0KICB9Ow0KPC9zY3Jp cHQ+PHNjcmlwdCBpZD0iTWF0aEpheC1zY3JpcHQiIGFzeW5jPSIiIHNyYz0iaHR0cHM6Ly9jZG4u anNkZWxpdnIubmV0L25wbS9tYXRoamF4QDMvZXM1L3RleC1tbWwtY2h0bWwuanMiPg0KPC9zY3Jp cHQ+DQo8L2hlYWQ+DQo8Ym9keT4NCjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4N CjxoMSBjbGFzcz0idGl0bGUiPk9DYW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLzIwMjMuMDIuMjEuaHRtbCI+UHJldmlvdXMg V2VlazwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXgu aHRtbCI+DQpVcDwvYT4gPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24v MjAyMy4wMy4wNy5odG1sIj5OZXh0IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhl cmUgaXMgdGhlIGxhdGVzdCBPQ2FtbCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1 YXJ5IDIxIHRvIDI4LCAyMDIzLg0KPC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPGgyPlRhYmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQt dGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMx Ij5Mb29raW5nIGZvciBJZGVhcyBmb3IgdGhlIFBhY2thZ2UgT3ZlcnZpZXcgUGFnZSBvbiBPQ2Ft bC5vcmc8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjMiI+Vm90ZSBpbiB0aGlzIHRvcGljOiBPQ2Ft bC5vcmcgcGFja2FnZSBsYXRlc3QgdmVyc2lvbiBwZXJtYWxpbmsgVVJMPC9hPg0KPC9saT48bGk+ PGEgaHJlZj0iIzMiPm9tYWtlLTAuMTAuNjwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPlZTIENv ZGUgdGVzdGluZyBleHRlbnNpb24gZm9yIEFsY290ZXN0IGFuZCBpbmxpbmUgQWxjb3Rlc3QgUFBY IDAuMS4wIC0gaW5pdGlhbCByZWxlYXNlPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzUiPkNvbnRh aW5lcnMgaXMgMTAgeWVhcnMgb2xkITwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzYiPk91dHJlYWNo eSBTdW1tZXIgMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZzlhMWFiNTUiPk9sZCBDV048 L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+TG9va2luZyBmb3IgSWRlYXMgZm9y IHRoZSBQYWNrYWdlIE92ZXJ2aWV3IFBhZ2Ugb24gT0NhbWwub3JnPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sb29raW5nLWZvci1pZGVhcy1mb3ItdGhlLXBhY2thZ2Ut b3ZlcnZpZXctcGFnZS1vbi1vY2FtbC1vcmcvMTE0MTYvNTAiPg0KaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2xvb2tpbmctZm9yLWlkZWFzLWZvci10aGUtcGFja2FnZS1vdmVydmlldy1wYWdl LW9uLW9jYW1sLW9yZy8xMTQxNi81MDwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnYzc0MDExYSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2M3 NDAxMWEiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFNhYmluZSBTY2htYWx0eiBzdW1tYXJpemVk PC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdjNzQwMTFhIj4N CjxwPk9rLCBzbyB0aGF0IHdhcyBxdWl0ZSBhIGJpdCB0byBkaWdlc3QuIEhlcmXigJlzIGEgc3Vt bWFyeTogPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdmMzlkMWRj IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnZjM5ZDFkYyI+MS0gRGViYXRlIGFib3V0 IHBhY2thZ2UgcXVhbGl0eSBtZXRyaWNzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00 IiBpZD0idGV4dC1vcmdmMzlkMWRjIj4NCjxwPkhhdmluZyDigJxsYXN0IHB1Ymxpc2hlZOKAnSBh bmQgcHVibGljYXRpb24gZGF0ZSBpbiBnZW5lcmFsIGRpc3BsYXllZCBvbiB0aGUgcGFnZSBtaWdo dCBpbnRlcmZlcmUgd2l0aCB0aGUgdmlzaWJpbGl0eSBvZiBzdGFibGUgcGFja2FnZXMgdGhhdCBk byBub3QgbmVlZCBpbXByb3ZlbWVudC4NCjwvcD4NCjxwPklkZWFzIGZvciBvdGhlciBtZXRyaWNz OiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+KG1hbnVhbCkgc2VsZi1hc3Nlc3NtZW50 IG9mIHBhY2thZ2UgYXV0aG9yLiAoQ29kZSBxdWFsaXR5LCBwZXJmb3JtYW5jZSwgbWFpbnRhaW5h YmlsaXR5LCBldm9sdXRpb24sIHZlcnNpb24gJmd0Oz0gMS4wLjAgZXRjLikNCjwvbGk+PGxpPiht YW51YWwpIE1haW50ZW5hbmNlLXJlbGF0ZWQgdGFnZ2luZzogc2lnbmFsIHRoZSBuZWVkIGZvciBh ZGRpdGlvbmFsIG1haW50YWluZXJzLCBzaWduYWwgdGhhdCBhIHBhY2thZ2UgbmVlZHMgbWFpbnRl bmFuY2UNCjwvbGk+PGxpPihhdXRvbWF0ZWQpIFNpZ25hbCBicm9rZW4gcGFja2FnZXMuIDwvbGk+ PGxpPihhdXRvbWF0ZWQpIE1ldHJpY3MgZnJvbSBleHRlcm5hbCBzb3VyZWNzOiBlLmcuIEdpdEh1 YiBOdW1iZXIgb2YgaXNzdWVzIC8gcHVsbCByZXF1ZXN0cyAvIHN0YXIgY291bnQNCjx1bCBjbGFz cz0ib3JnLXVsIj4NCjxsaT5Db250cmFwb2ludDogc3VwcG9ydGluZyBhbGwgb3B0aW9ucywgaW5j bHVkaW5nIHBvcHVsYXIgb3BlbiBzb3VyY2Ugc2VsZi1ob3N0ZWQgb3B0aW9uc2lzIGEgaHVnZSB3 b3JrIGl0ZW0sIGFuZCBjaG9vc2luZyBqdXN0IGEgZmV3IGlzIGluaGVyZW50bHkgdW5mYWlyDQo8 L2xpPjwvdWw+DQo8L2xpPjxsaT4oYXV0b21hdGVkKSBXZWVrbHkgZG93bmxvYWQgc3RhdGlzdGlj cyA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnZjMwZGRjNyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2YzMGRkYzciPjItIERl YmF0ZSBhYm91dCBkaXNwbGF5aW5nIG9yIG5vdCBkaXNwbGF5aW5nIFJFQURNRSAvIG9wYW0gZGVz Y3JpcHRpb24gLyBpbmRleC5tbGQgb24gcGFja2FnZSBvdmVydmlldzo8L2g0Pg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2YzMGRkYzciPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPlNpbmNlIFJFQURNRSBpcyBwdWJsaWNseSBkaXNwbGF5ZWQgb24gR2l0SHViL0dp dExhYiBldGMsIG1hbnkgcGVvcGxlIGN1cnJlbnRseSB1c2UgaXQgYXMgYSDigJxwdWJsaWMgbGFu ZGluZyBwYWdl4oCdIG9mIHRoZSBwYWNrYWdlLg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkVz c2VudGlhbGx5LCB0aGVzZSBvdGhlciBzZXJ2aWNlcyBlbmNvdXJhZ2Ugd3JpdGluZyBSRUFETUUg aW4gYSBjZXJ0YWluIHdheSAtIGluIG9yZGVyIHRvIGVzdGFibGlzaCBwcm9wZXIgY29udGV4dCB3 aXRoaW4gdGhhdCBvdGhlciBzZXJ2aWNlDQo8L2xpPjwvdWw+DQo8L2xpPjxsaT5DaGFsbGVuZ2U6 IElkZWFsbHksIHBhY2thZ2UgYXV0aG9ycyBzaG91bGQgbm90IGhhdmUgdG8gcmVwZWF0IHRoZSBz YW1lIGluZm8gaW4gc2V2ZXJhbCBwbGFjZXMuDQo8L2xpPjxsaT5Bc3BlY3RzIHRvIGNvbnNpZGVy IHdydCBSRUFETUU6DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ZGlmZmVyZW50IHJlbmRlcmVy cyBvbiBkaWZmZXJlbnQgc2l0ZXMgKGUuZy4gR2l0TGFiLCBHaXRIdWIsIFNvdXJjZUh1dCwgUHln bWVudHMsIGV0Yy4pIHN1cHBvcnQgZGlmZmVyZW50IG1hcmtkb3duIGZlYXR1cmVzDQo8L2xpPjxs aT5Ob3dhZGF5cyBtb3JlIGFuZCBtb3JlIFJFQURNRXMgY29udGFpbiBpbWFnZXMgb3IgZXZlbiB2 aWRlb3MsIGFzIHdlbGwgYXMgdG9ucyBvZiBiYWRnZXMNCjwvbGk+PC91bD4NCjwvbGk+PGxpPklk ZWFzOg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlNob3cgYSBjb2xsYXBzaWJsZSBSRUFETUUg b24gcGFja2FnZSBvdmVydmlldyA8L2xpPjxsaT5JbnN0ZWFkIG9mIHJlbmRlcmluZyBSRUFETUUg b24gcGFja2FnZSBvdmVydmlldzogYWRkIGEgbGluayB0byB0aGUgUkVBRE1FIChidXQgd2hlcmUg dG8sIHRvIHRoZSBob3N0ZWQgcmVwb3NpdG9yeSBvciB0byBvY2FtbC5vcmfigJlzIHJlbmRpdGlv biBvZiBSRUFETUU/KQ0KPC9saT48L3VsPg0KPC9saT48bGk+SW5kZXgubWxkIGFuZCBvdGhlciAu bWxkIGZpbGVzIGNvdWxkIGJlIGRpc3BsYXllZCBpbnN0ZWFkIG9mIFJFQURNRS4gQWRkaXRpb25h bGx5LCBsaW5rcyBmb3IgQVBJIGRvY3VtZW50YXRpb24gYW5kIHR1dG9yaWFscw0KPHVsIGNsYXNz PSJvcmctdWwiPg0KPGxpPk5vdGU6IGlmIHlvdSBkb27igJl0IHNwZWNpZnkgYW4gPGNvZGU+b3Bh bTwvY29kZT4gPGNvZGU+c3lub3BzaXM8L2NvZGU+IGFuZC9vciA8Y29kZT4NCmRlc2NyaXB0aW9u PC9jb2RlPiB5b3Vyc2VsZiwgPGNvZGU+ZHVuZS1yZWxlYXNlPC9jb2RlPiBkZXJpdmVzIHRob3Nl IGZyb20geW91ciBSRUFETUUgYXMgZGVzY3JpYmVkIGluDQo8YSBocmVmPSJodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvbG9va2luZy1mb3ItaWRlYXMtZm9yLXRoZS1wYWNrYWdlLW92ZXJ2aWV3 LXBhZ2Utb24tb2NhbWwtb3JnLzExNDE2LzQwIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9sb29raW5nLWZvci1pZGVhcy1mb3ItdGhlLXBhY2thZ2Utb3ZlcnZpZXctcGFnZS1vbi1vY2Ft bC1vcmcvMTE0MTYvNDA8L2E+LiBIb3dldmVyLCB3aGVuIHlvdSB3YW50IHRvIGxpbmsgc29tZXdo ZXJlIGZyb20gd2l0aGluIHRoZQ0KPGNvZGU+JChERVNDUklQVElPTik8L2NvZGU+IGJsb2NrLCB0 aGF0IHdpbGwgbm90IHdvcmsgYXQgdGhlIHNhbWUgdGltZSBvbiBHaXRIdWIgYXMgd2VsbCBhcyBp biBvdGhlciBkb2N1bWVudGF0aW9uIGNvbnRleHRzIChlLmcuIGxvY2FsbHktYnVpbHQgb2ZmbGlu ZSBkb2N1bWVudGF0aW9uIHZzIG9jYW1sLm9yZyB2cyBHaXRIdWIpLg0KPC9saT48L3VsPg0KPC9s aT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzI5 Nzc3MWEiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmcyOTc3NzFhIj4zLSBQbGF5Z3Jv dW5kIGZ1bmN0aW9uYWxpdHk8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0 ZXh0LW9yZzI5Nzc3MWEiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPuKAnFRlc3RlZCBleGFt cGxlc+KAnSwgaS5lLiBhYmlsaXR5IHRvIHdyaXRlIGNvZGUgc2VjdGlvbnMgaW4gdGhlIHBhY2th Z2UgZG9jcyB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgYXMgdGVzdHMgZHVyaW5nIHRoZSBkb2N1bWVu dGF0aW9uIGJ1aWxkIC0gaGVscHMgcGFja2FnZSB1c2VycyBhc3Nlc3Mgd2hldGhlciB0aGUgZG9j dW1lbnRhdGlvbiBpcyB1cCB0byBkYXRlIGFuZCBtYWtlcyBpdCBlYXNpZXIgZm9yIHBhY2thZ2Ug YXV0aG9ycyB0byB1cGRhdGUNCiB0aGUgZG9jcyB3aGVuIGZ1bmN0aW9uYWxpdHkgY2hhbmdlZCA8 L2xpPjxsaT5BYmlsaXR5IHRvIHJ1biBjb2RlIGV4YW1wbGVzIGZyb20gcGFja2FnZXMgaW4gdGhl IHBsYXlncm91bmQgPC9saT48bGk+4oCcUnVubmFibGUgZXhhbXBsZXPigJ0gbGlrZSA8YSBocmVm PSJodHRwczovL2dvLmRldi9ibG9nL2V4YW1wbGVzIj5odHRwczovL2dvLmRldi9ibG9nL2V4YW1w bGVzPC9hPiAtIGFiaWxpdHkgdG8gd3JpdGUgY29kZSBzZWN0aW9ucyBpbiB0aGUgZG9jcyB0aGF0 IHdpbGwgKDEpIHJ1biBhcyB0ZXN0cyBkdXJpbmcgdGhlIHBhY2thZ2UgZG9jdW1lbnRhdGlvbiBi dWlsZCBzdGVwLCBhbmQgKDIpIHJlbmRlciBhcyBhbiDigJxpbmxpbmUtcGxheWdyb3VuZOKAnQ0K IHdpdGhpbiB0aGUgc3Vycm91bmRpbmcgZG9jdW1lbnRhdGlvbiBwYWdlIDwvbGk+PC91bD4NCjwv ZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiNjg3YTVjIiBjbGFz cz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYjY4N2E1YyI+NC0gT3RoZXIgRmVlZGJhY2svSWRl YXM8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2I2ODdhNWMi Pg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkFsbG93IFVSTHMgbGlrZSA8Y29kZT5bW2h0dHBz Oi8vb2NhbWwub3JnL3AvJTdCUEFDS0FHRSU3RC4lN0JWRVJTSU9OXVtodHRwczovL29jYW1sLm9y Zy9wL3tQQUNLQUdFfS57VkVSU0lPTl1dfTwvY29kZT4NCjwvbGk+PGxpPk9uIHBhY2thZ2UgdmVy c2lvbiBkcm9wZG93biAtIEFkZCBwdWJsaXNoZWQgZGF0ZSBmb3IgZWFjaCB2ZXJzaW9uIDwvbGk+ PGxpPlNlY3VyaXR5IGFkdmlzb3JpZXMgLyByZXBvcnQgcGFja2FnZSB2dWxuZXJhYmlsaXR5IDwv bGk+PGxpPkl0IHdvdWxkIGJlIG5pY2UgdG8gaGF2ZSBiYWRnZXMgZm9yIHlvdXIgcGFja2FnZSB0 byBkaXNwbGF5IG9uIHRoZSBSRUFETUUgc28gdGhhdCB0aGUgcGFja2FnZSByZXBvc2l0b3J5IGxv b2tzIGF0dHJhY3RpdmUgb24gdGhlIHZlcnNpb24gY29udHJvbCB3ZWJzaXRlIHdoZXJlIGl0IGlz IGhvc3RlZA0KPC9saT48bGk+UGFja2FnZSBvdmVydmlldyBzaG91bGQgc2hvdyBhbGwgdGhlIDxj b2RlPmZpbmRsaWI8L2NvZGU+IGxpYnJhcnkgbmFtZXMgPC9saT48bGk+RGVwZW5kZW5jaWVzLCBS ZXZlcnNlIERlcGVuZGVuY2llcyBhbmQgQ29uZmxpY3RzIG5lZWQgbW9yZSBzcGFjZSwgYXMgdGhl eSBjYW4gYmUgcXVpdGUgbmFycm93IGFuZCB0YWxsDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMjRjMzIzZSIgY2xhc3M9Im91dGxpbmUt NCI+DQo8aDQgaWQ9Im9yZzI0YzMyM2UiPjUtIFBhY2thZ2Ugb3ZlcnZpZXcgcGFnZXMgaW5zcGly YXRpb248L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzI0YzMy M2UiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPjxhIGhyZWY9Imh0dHBzOi8vY3JhdGVzLmlv L2NyYXRlcy90b2tpbyI+aHR0cHM6Ly9jcmF0ZXMuaW8vY3JhdGVzL3Rva2lvPC9hPiA8L2xpPjxs aT48YSBocmVmPSJodHRwczovL3J1YnlnZW1zLm9yZy9nZW1zL3J1Ym9jb3AiPmh0dHBzOi8vcnVi eWdlbXMub3JnL2dlbXMvcnVib2NvcDwvYT4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3 Lm5wbWpzLmNvbS9wYWNrYWdlL3BhcnRpYWwubGVuc2VzP2FjdGl2ZVRhYj1yZWFkbWUiPmh0dHBz Oi8vd3d3Lm5wbWpzLmNvbS9wYWNrYWdlL3BhcnRpYWwubGVuc2VzP2FjdGl2ZVRhYj1yZWFkbWU8 L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL3BrZy5nby5kZXYvZ2l0aHViLmNvbS9nby1y ZWRpcy9yZWRpcy92OCI+aHR0cHM6Ly9wa2cuZ28uZGV2L2dpdGh1Yi5jb20vZ28tcmVkaXMvcmVk aXMvdjg8L2E+DQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2hleC5wbS9wYWNrYWdlcy9waG9l bml4Ij5odHRwczovL2hleC5wbS9wYWNrYWdlcy9waG9lbml4PC9hPg0KPC9saT48bGk+PGEgaHJl Zj0iaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9jb25kdWl0LW1pcmFnZS9jb25kdWl0 LW1pcmFnZS42LjIuMC8iPmh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMvY29uZHVpdC1t aXJhZ2UvY29uZHVpdC1taXJhZ2UuNi4yLjAvPC9hPg0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0i b3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+Vm90ZSBpbiB0aGlzIHRvcGljOiBPQ2FtbC5vcmcgcGFj a2FnZSBsYXRlc3QgdmVyc2lvbiBwZXJtYWxpbmsgVVJMPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC0yIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC92b3RlLWluLXRoaXMtdG9waWMtb2NhbWwtb3JnLXBhY2thZ2UtbGF0 ZXN0LXZlcnNpb24tcGVybWFsaW5rLXVybC8xMTIwMS8xNCI+DQpodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3Qvdm90ZS1pbi10aGlzLXRvcGljLW9jYW1sLW9yZy1wYWNrYWdlLWxhdGVzdC12ZXJz aW9uLXBlcm1hbGluay11cmwvMTEyMDEvMTQ8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2RlNWUxMzIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJv cmdkZTVlMTMyIj5TYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkZTVlMTMyIj4NCjxwPkkgaGVyZWJ5IGFubm91bmNl IHRoYXQgcGFja2FnZSBkb2N1bWVudGF0aW9uIGxhdGVzdCB2ZXJzaW9uIHBlcm1hbGluayBVUkxz IGFyZSBub3cgbGl2ZSBvbiBvY2FtbC5vcmcuIFBhY2thZ2Ugc2VhcmNoIHJlc3VsdHMgbGluayB0 byB0aGUgbGF0ZXN0IHZlcnNpb24gVVJMLg0KPC9wPg0KPHA+T3VyIGNvbnRyaWJ1dG9yIFNheW8g aGFzIHdvcmtlZCBoYXJkIGFuZCBsZWFybmVkIGEgbG90IGR1cmluZyB0aGUgcHJvY2VzcyBhcyBz aGUgdGFja2xlZCB0aGlzIHByb2plY3QuIENvbnNpZGVyaW5nIGFsbCB0aGUgaW50ZXJuYWwgbGlu a3MsIHRoZSBjYW5vbmljYWwgdGFnIGZvciB0aGUgc2VhcmNoIGVuZ2luZXMgYW5kIGNob29zaW5n IHRoZSBjb3JyZWN0IGxhdGVzdCB2ZXJzaW9uIGJ5IGF2b2lkaW5nIHRoZQ0KPGNvZGU+YXZvaWQt dmVyc2lvbjwvY29kZT4gb3BhbS1mbGFnIG1hZGUgdGhpcyBhIHNpemVhYmxlIHByb2plY3QhIDwv cD4NCjxwPkFkZCB0byB0aGF0IHRoYXQgd2Uga2VwdCBtYWtpbmcgc28gbWFueSBvdGhlciBjaGFu Z2VzIGFsbCBhY3Jvc3MgPGEgaHJlZj0iaHR0cDovL29jYW1sLm9yZy8iPg0Kb2NhbWwub3JnPC9h PuKAmXMgdGVtcGxhdGVzIHRoYXQgc2hlIGhhZCB0byBnaXQgcmViYXNlIHRocm91Z2ggYSBsb3Qg b2YgcGF0Y2hlc+KApiBJIGFtIGhhcHB5IHRvIHNlZSBob3cgc2hlIGhhcyBncm93biBhbmQgdGhh dCB3ZSBnb3Qgc3VjaCBhIHVzZWZ1bCBmZWF0dXJlIGNvbXBsZXRlZCEgOnRhZGE6IDpjb25mZXR0 aV9iYWxsOg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1j b250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPm9tYWtlLTAuMTAuNjwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMjAy My0wMi9tc2cwMDAwNy5odG1sIj4NCmh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvYXJjL2Nh bWwtbGlzdC8yMDIzLTAyL21zZzAwMDA3Lmh0bWw8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnY2M0MGE1ZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZ2NjNDBhNWUiPkdlcmQgU3RvbHBtYW5uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnY2M0MGE1ZSI+DQo8cD5JIGp1c3QgcmVsZWFzZWQg b21ha2UtMC4xMC42LCB0aGUgYnVpbGQgdXRpbGl0eTogPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPlN1cHBvcnQgZm9yIE9DYW1sLTUgPC9saT48bGk+Rml4IGEgcmVncmVzc2lvbjogb21h a2UgY2FuIGJlIGJ1aWx0IHdpdGhvdXQgb2NhbWxvcHQgPC9saT48L3VsPg0KPHA+Rm9yIGRvY3Mg YW5kIHRoZSBkb3dubG9hZCBsaW5rIHNlZSA8YSBocmVmPSJodHRwOi8vcHJvamVjdHMuY2FtbGNp dHkub3JnL3Byb2plY3RzL29tYWtlLmh0bWwiPg0KaHR0cDovL3Byb2plY3RzLmNhbWxjaXR5Lm9y Zy9wcm9qZWN0cy9vbWFrZS5odG1sPC9hPi4gb3BhbSBpcyB1bmRlcndheS4gPC9wPg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xhc3M9Im91 dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPlZTIENvZGUgdGVzdGluZyBleHRlbnNpb24gZm9yIEFsY290 ZXN0IGFuZCBpbmxpbmUgQWxjb3Rlc3QgUFBYIDAuMS4wIC0gaW5pdGlhbCByZWxlYXNlPC9oMj4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxh IGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdnMtY29kZS10ZXN0aW5nLWV4 dGVuc2lvbi1mb3ItYWxjb3Rlc3QtYW5kLWlubGluZS1hbGNvdGVzdC1wcHgtMC0xLTAtaW5pdGlh bC1yZWxlYXNlLzExNTE0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi12cy1j b2RlLXRlc3RpbmctZXh0ZW5zaW9uLWZvci1hbGNvdGVzdC1hbmQtaW5saW5lLWFsY290ZXN0LXBw eC0wLTEtMC1pbml0aWFsLXJlbGVhc2UvMTE1MTQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnYjQ5YThhMSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZ2I0OWE4YTEiPlJvbGFuZCBDc2FzemFyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYjQ5YThhMSI+DQo8cD5J4oCZdmUganVzdCBy ZWxlYXNlZCBhIFZTIENvZGUgZXh0ZW5zaW9uIHRvIGludGVncmF0ZSA8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vbWlyYWdlL2FsY290ZXN0Ij4NCkFsY290ZXN0PC9hPiBhbmQgPGEgaHJlZj0i aHR0cHM6Ly9naXRsYWIuY29tL2dvcGlhbmRjb2RlL3BweC1pbmxpbmUtYWxjb3Rlc3QiPmlubGlu ZSBBbGNvdGVzdDwvYT4gdGVzdHMgd2l0aCBWUyBDb2RlLiBJdCBzdXBwb3J0cyBtdWx0aXBsZSB3 b3Jrc3BhY2VzL2ZvbGRlcnMgYW5kIHVzZXMgdGhlIOKAmW5hdGl2ZeKAmSBUZXN0IEV4cGxvcmVy IG9mIENvZGUsIG5vdCB0aGUNCjxpPlRlc3QgRXhwbG9yZXIgVUk8L2k+IGV4dGVuc2lvbi4gPGEg aHJlZj0iaHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1l PXJlbGVhc2UtY2FuZGlkYXRlLnZzY29kZS1vY2FtbC1hbGNvdGVzdC10ZXN0LWFkYXB0ZXIiPg0K T0NhbWwgQWxjb3Rlc3QgVGVzdCBFeHBsb3JlciBleHRlbnNpb248L2E+IDxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9SZWxlYXNlLUNhbmRpZGF0ZS92c2NvZGUtb2NhbWwtYWxjb3Rlc3QtdGVz dC1hZGFwdGVyIj4NCkdpdEh1YiByZXBvPC9hPiBJdCBvbmx5IGRpc2NvdmVycyB0ZXN0cyB3aGVu IHRoZSBleHRlbnNpb24gaXMgc3RhcnRlZCBvciBhIHRlc3QgaXMgcnVuLCBubyBmaWxlIHdhdGNo aW5nIChJIGRvbuKAmXQgbGlrZSBleHRlbnNpb25zIGRvaW5nIHRoaXMgb24gdGhlaXIgb3duKS4g SeKAmWxsIGFkZCBhIOKAmXJlZnJlc2jigJkgYnV0dG9uIHRvIHRoZSBUZXN0IEV4cGxvcmVyIHZp ZXcsIEkgZ3Vlc3MsIHNvbWV0aW1lLiBUaGUgb3V0cHV0IG9mIEFsY290ZXN04oCZcyBsaXN0DQog b2YgdGVzdCBjYXNlcyBpcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSB0ZXN0IHRyZWUsIHNvIHRoaXMg aXMgYWx3YXlzIGluIHN5bmMgd2l0aCB0aGUgdGVzdHMgdGhlIHJ1bm5lcnMg4oCZa25vd+KAmSBv Zi4gTXkgY29tcHJvbWlzZSBpcyB0aGUgbWFwcGluZyBvZiBhIHRlc3QgY2FzZSB0byBpdHMgc291 cmNlIGxvY2F0aW9uLCBJIGp1c3QgZ3JlcCBmb3IgdGhlIHRlc3QgY2FzZSBuYW1lICh3aGljaCBj YW4gYmUgdHJ1bmNhdGVkIGJ5IEFsY290ZXN0KSBpbg0KIHNvdXJjZSBmaWxlcyBhbmQgcGljayB0 aGUgZmlyc3QgbWF0Y2ggLSB3aGljaCBjYW4gYmUgb2ZmIGZyb20gdGhlIOKAmXJlYWzigJkgbG9j YXRpb24uIEkgcGVyc29uYWxseSBwcmVmZXIgaGF2aW5nIGEgY29ycmVjdCBUZXN0IEV4cGxvcmVy IHRyZWUgdG8gaGF2aW5nIGEgY29ycmVjdCBzb3VyY2UgbG9jYXRpb24uIEluIG15IGV4cGVyaWVu Y2Ugd2l0aCBvdGhlciB0ZXN0IGV4dGVuc2lvbnMgc29tZXRpbWVzIGJvdGggdGhlIHRyZWUgYW5k IHRoZSBzb3VyY2UNCiBsb2NhdGlvbnMgYXJlIGluY29ycmVjdC4gPC9wPg0KPHA+PGI+U29tZSBR dWVzdGlvbnM6PC9iPiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Q3VycmVudGx5IGl0 IG9ubHkgd29ya3Mgd2l0aCBkdW5lLCB0byBydW4gdGhlIHRlc3QgcnVubmVycyBhbmQgYmVjYXVz ZSBkdW5lIGZpbGVzIGFyZSBwYXJzZWQgZm9yIHRoZSBuYW1lIG9mIHRoZSB0ZXN0IHJ1bm5lcnMu IFNvIG15IHF1ZXN0aW9uIGlzIHdoYXQgaXQgd291bGQgdGFrZSB0byBtYWtlIGl0IHdvcmsgd2l0 aCBvdGhlciBidWlsZCBzeXN0ZW1zLiBNYWtpbmcgdGhlIGNvbW1hbmRzIHRvIGNvbXBpbGUgYW5k L29yIHJ1biBhIHRlc3QNCiBydW5uZXIgYW5kIHRoZSBwYXRocyB0byBzZWFyY2ggZm9yIHRlc3Qg cnVubmVyIGV4ZWN1dGFibGVzIGNvbmZpZ3VyYWJsZSBpcyBlYXN5LiBNYWtpbmcgdGhlIHBhcnNp bmcgb2YgYXJiaXRyYXJ5IGJ1aWxkIGZpbGVzIGZvciB0aGUgcmlnaHQgdGFyZ2V0cyBjb25maWd1 cmFibGUgaXMgbGVzcyBlYXN5LCBpZiBpdCBpcyBmZWFzaWJsZSBhdCBhbGwuIE9mIGNvdXJzZSB5 b3UgY291bGQgYWx3YXlzIGZvcmsgb2YgdGhlIGV4dGVuc2lvbiB0byBleGFjdGx5DQogZml0IHlv dXIgbmVlZHMgPC9saT48bGk+dGhlIGV4dGVuc2lvbiBqdXN0IGNhbGxzIGR1bmUgaW4gdGhlIHJv b3Qgb2YgZWFjaCB3b3Jrc3BhY2UgYW5kIGl0IGRvZXMgPGI+dGhlIHJpZ2h0IHRoaW5nPC9iPiB3 aXRoIG15IHByb2plY3RzLiBNeSBxdWVzdGlvbiBpcyBpZiB0aGUgcmlnaHQgZW52aXJvbm1lbnQg KHNhbmRib3gpIGlzIHVzZWQgYXV0b21hdGljYWxseSB3aGVuIHVzaW5nIHRoZQ0KPGk+T0NhbWwg UGxhdGZvcm08L2k+IGV4dGVuc2lvbj8gPC9saT48bGk+V291bGQgYWRkIGRpc2FibGluZyB0aGUg Z3JlcHBpbmcgZm9yIHRoZSBzb3VyY2UgbG9jYXRpb25zIG1ha2Ugc2Vuc2UgZm9yIHlvdT8gU28g eW91IGp1c3QgdXNlIHRoZSAoY29ycmVjdCkgdGVzdCB0cmVlIHRvIHN0YXJ0IGFuZCBmaWx0ZXIg dGVzdHMgYW5kIG5vdCB3YXN0ZSB0aW1lIHNlYXJjaGluZyB0aHJvdWdoIGFsbCBzb3VyY2UgZmls ZXMsIHdoaWNoIGNvdWxkIHRha2UgdG9vIGxvbmcgYW5kIGRvZXNu4oCZdCBnaXZlIHRoZSBjb3Jy ZWN0DQogcmVzdWx0IGFueXdheS4gPC9saT48L3VsPg0KPHA+VGhlIGV4dGVuc2lvbiBzaG91bGQg YWxzbyBiZSBxdWl0ZSBlYXN5IHRvIGFkYXB0IHRvIG90aGVyIHRlc3RpbmcgZnJhbWV3b3JrcyAo aW5saW5lIHRlc3QgcnVubmVycyksIGFzIGxvbmcgYXMgdGhleSBzdXBwb3J0IHNvbWUga2luZCBv Zg0KPGI+bGlzdCB0ZXN0PC9iPiBjb21tYW5kIGxpbmUgYXJndW1lbnQuIDwvcD4NCjxwPkFuZCBz b3JyeSwgdGhlIGxpbmsgdG8gPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL21pcmFnZS9hbGNv dGVzdCI+QWxjb3Rlc3Q8L2E+IGlzIGJyb2tlbiBpbiB0aGUgUkVBRE1FLCBJ4oCZbSBnb2luZyB0 byBmaXggdGhpcyBpcyB0aGUgbmV4dCByZWxlYXNlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg5MjRlMmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmc4OTI0ZTJjIj5Sb2xhbmQgQ3Nhc3phciBsYXRlciBhZGRlZDwvaDM+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODkyNGUyYyI+DQo8cD5J4oCZdmUg anVzdCB1cGxvYWRlZCB0aGUgdmVyc2lvbiAwLjIuMCA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2M1MTFlZjkiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJv cmdjNTExZWY5Ij5DaGFuZ2VzOjwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9 InRleHQtb3JnYzUxMWVmOSI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+RHJvcCBzdXBwb3J0 IGZvciBWUyBDb2RlIHZlcnNpb25zICZsdDsgMS42NSAoRmVicnVhcnkgMjAyMikgYmVjYXVzZSBv ZiA8YSBocmVmPSJodHRwczovL2NvZGUudmlzdWFsc3R1ZGlvLmNvbS91cGRhdGVzL3YxXzY1I190 ZXN0aW5nLXJlZnJlc2gtYWN0aW9uLWFuZC1zb3J0dGV4dCI+DQpUZXN0aW5nIHJlZnJlc2ggYWN0 aW9uPC9hPiA8L2xpPjxsaT5UZXN0IGRpc2NvdmVyeSBjYW4gYmUgdHJpZ2dlcmVkIGJ5IHRoZSDi gJlSZWZyZXNo4oCZIGJ1dHRvbiBpbiB0aGUgVGVzdCBFeHBsb3JlciB2aWV3DQo8L2xpPjwvdWw+ DQo8L2Rpdj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnMzIxYmY0MyI+PC9h PkJ1Z2ZpeGVzPGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzMy MWJmNDMiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlJlbW92ZSBkZWxldGVkIHRlc3RzIGZy b20gdGhlIFRlc3QgRXhwbG9yZXIgdHJlZSA8L2xpPjxsaT5GaW5kIG11bHRpbGluZSBpbmxpbmUg dGVzdCBjYXNlIG5hbWVzIGxpa2UgYGxldCV0ZXN0XG5URVNUX0NBU0VfTkFNRWAgPC9saT48bGk+ UkVBRE1FLm1kOiBmaXggbGluayB0byBBbGNvdGVzdCA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+ PGxpPjxhIGlkPSJvcmcyYzM3N2I1Ij48L2E+SW50ZXJuYWwgQ2hhbmdlczxicj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmcyYzM3N2I1Ij4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5SZWZhY3RvciB0ZXN0IG5hbWUgcGFyc2luZyBpbiBzb3VyY2UgZmlsZXMgdG8g bmV3IGZ1bmN0aW9uIGluIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9SZWxlYXNlLUNhbmRp ZGF0ZS92c2NvZGUtb2NhbWwtYWxjb3Rlc3QtdGVzdC1hZGFwdGVyL2Jsb2IvN2YzNmQ4OTUxN2Y2 ZWQ1YjNhM2ZhMTIyMzViZDBmZDljODU3MTgxOS9zcmMvcGFyc2luZy50cyI+DQouL3NyYy9wYXJz aW5nLnRzPC9hPiBhbmQgYWRkIHRlc3RzIDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUiPkNvbnRhaW5lcnMgaXMgMTAgeWVhcnMgb2xkITwv aDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZl OiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY29udGFpbmVycy1pcy0xMC15 ZWFycy1vbGQvMTE1MjYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY29udGFpbmVy cy1pcy0xMC15ZWFycy1vbGQvMTE1MjYvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRs aW5lLWNvbnRhaW5lci1vcmc4MDFjZTFhIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3Jn ODAxY2UxYSI+U2ltb24gQ3J1YW5lcyBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGlu ZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzgwMWNlMWEiPg0KPHA+VG9kYXkgbWFya3MgdGhlIDEwIHll YXJzIG1hcmsgc2luY2UgdGhlIGZpcnN0IGNvbW1pdCBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1 Yi5jb20vYy1jdWJlL29jYW1sLWNvbnRhaW5lcnMvIj4NCmNvbnRhaW5lcnM8L2E+IFteMV0gd2Fz IGNyZWF0ZWQgOnRhZGE6IDpwYXJ0eWluZ19mYWNlOi4gSXTigJlzIGJlZW4gcXVpdGUgYSByaWRl ISBJ4oCZbSBncmF0ZWZ1bCB0byBhbGwgdXNlcnMgYW5kIGNvbnRyaWJ1dG9ycywgd2l0aG91dCB3 aG9tIHRoZSBsaWJyYXJ5IHdvdWxkbuKAmXQgaGF2ZSByZWFjaGVkIGl0cyBjdXJyZW50IHZlcnNp b24gb2YgMy4xMSBhZnRlciByb3VnaGx5IDcyIHJlbGVhc2VzISENCjwvcD4NCjxwPkhhcHB5IGJp cnRoZGF5IDpjYW1lbDotOnBhY2thZ2U6ISA6KSA8L3A+DQo8cD5bXjFdOiBjb250YWluZXJzIGlz IGFuIGV4dGVuc2lvbiBvZiB0aGUgc3RkbGliLCB0cnlpbmcgdG8gY29tcGxlbWVudCBpdCByYXRo ZXIgdGhhbiByZXBsYWNlIGl0Lg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk91 dHJlYWNoeSBTdW1tZXIgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9 InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3Qvb3V0cmVhY2h5LXN1bW1lci0yMDIzLzExMTU5LzUiPmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vdXRyZWFjaHktc3VtbWVyLTIwMjMvMTExNTkvNTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWU5NjY1NyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZ2VlOTY2NTciPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIE1vYXp6YW0gTW9yaWFu aSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9y Z2VlOTY2NTciPg0KPHA+SGkhIEkgaGF2ZSBqb2luZWQgQHJleW5pciwgQHBpdGFnLCBAcmFuZCBh bmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL211c2hhNjhrIj4NCk9za2FyPC9hPiB0byBj by1tZW50b3IgZm9yIHRoaXMgT3V0cmVhY2h5IHJvdW5kLiBXZSBoYXZlIGEgdG90YWwgb2YgdGhy ZWUgPGEgaHJlZj0iaHR0cHM6Ly9taXJhZ2UuaW8vIj4NCk1pcmFnZTwvYT4tcmVsYXRlZCBwcm9q ZWN0cyB0aGlzIHJvdW5kOiA8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8bGk+UGVyc2lzdGVu dCBTdG9yYWdlIGluIE1pcmFnZU9TIDwvbGk+PGxpPkV4dGVuZCB0aGUgbmV0d29yayB0ZXN0aW5n IHRvb2wgY29ubnRlc3Qgd2l0aCB2aXN1YWxpemF0aW9ucyA8L2xpPjxsaT5NSURJIHdpdGggTWly YWdlT1MgPC9saT48L29sPg0KPHA+SGF2aW5nIHRocmVlIHByb2plY3RzIHJldm9sdmUgYXJvdW5k IGEgY29tbW9uIHRoZW1lIGhhcyBnaXZlbiB1cyB0aGUgb3B0aW9uIHRvIGJlIGJpdCBmbGV4aWJs ZSB3aXRoIGhvdyB3ZeKAmXJlIGFsbG9jYXRpbmcgbWVudG9yIHRpbWUuDQo8L3A+DQo8cD5JLCBt eXNlbGYsIGFtIGEgc29tZXdoYXQgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L291dHJlYWNoeS1zdW1tZXItMjItY2xvc2luZy1jb21tZW1vcmF0aW9uLXNlc3Npb24tb24tMjNy ZC1zZXB0LzEwNDUwLzUiPg0KcmVjZW50PC9hPiBPdXRyZWFjaHkgYWx1bS4gSSBob3BlIHRvIHVz ZSBteSBzb21ld2hhdCByZWNlbnQgZXhwZXJpZW5jZSBhcyBhbiBpbnRlcm4gdG8gdHJ5IHRvIGhl bHAgcG90ZW50aWFsIG5ldy1jb21lcnMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5YTFhYjU1IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0ib3JnOWExYWI1NSI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtb3JnOWExYWI1NSI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBD V04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y ZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3Ig Z28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwv cD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWws IHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGlu Zm8vY2FtbC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0 aG9ybmFtZSIgaWQ9Im9yZzA1YTY4MmQiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 21 Feb 2023 10:20:48 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 21 Feb 2023 10:20:48 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 21 Feb 2023 10:20:48 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31LAK31P009212 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 21 Feb 2023 10:20:03 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31LAJnaY009188 for ; Tue, 21 Feb 2023 10:19:49 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Feb 2023 11:19:48 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 05FE8E0159; Tue, 21 Feb 2023 11:19:46 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 02C4AE00A1 for ; Tue, 21 Feb 2023 11:19:39 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Feb 2023 11:19:38 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1FA43561238; Tue, 21 Feb 2023 11:19:36 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZRd4qt3mviaatD0y87EaDlEWXsg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 21 Feb 2023 10:19:27 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 8a329d29-b1d2-4549-0c45-08db13f54d28 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,315,1669071600"; d="scan'208,217";a="48252567" x-spam-flag: No, tests=bogofilter, spamicity=0.394021, queueID=8743E56123A x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <03B261A438B9E242B3619F26E876C408@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMi0yMSBUdWUgMTE6MTUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDIuMTQuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMi4yOC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDE0IHRvIDIxLCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5Mb29raW5nIGZvciBJZGVhcyBm b3IgdGhlIFBhY2thZ2UgT3ZlcnZpZXcgUGFnZSBvbiBPQ2FtbC5vcmc8L2E+DQo8L2xpPjxsaT48 YSBocmVmPSIjMiI+cHJyLCBhIGZvcmsgb2YgYnJyIGZvciBub24tYnJvd3NlciBKYXZhU2NyaXB0 IGVudmlyb25tZW50czwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzMiPklDRlAgMjAyMyBBcnRpZmFj dCBFdmFsdWF0aW9uIENvbW1pdHRlZTogY2FsbCBmb3Igbm9taW5hdGlvbnM8L2E+DQo8L2xpPjxs aT48YSBocmVmPSIjNCI+TmV3IE93bCBib29rOiBBcmNoaXRlY3R1cmUgb2YgQWR2YW5jZWQgTnVt ZXJpY2FsIEFuYWx5c2lzIFN5c3RlbXM8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNSI+SW1wcm92 ZW1lbnQgb24gdGhlIFBQWCBlY29zeXN0ZW0gZG9jdW1lbnRhdGlvbjwvYT4gPC9saT48bGk+PGEg aHJlZj0iIzYiPlRoZSBjb2xvciBhc3NvY2lhdGVkIHdpdGggT0NhbWwgb24gR2l0aHViIGlzIGJh ZC4gTGV04oCZcyBtYWtlIGl0IGdvb2Q8L2E+DQo8L2xpPjxsaT48YSBocmVmPSIjNyI+UGF1bCBC aWdnYXIgb24gRGFya2xhbmc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5NYWpvciB1cGRhdGVz IHRvIGtjYXMgaW4gMC4xLjggYW5kIDAuMi4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOSI+T1VQ UyBtZWV0dXAgbWFyY2ggMjAyMzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzEwIj5EdW5lIDMuNy4w PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnZmE5NDE5YyI+T2xkIENXTjwvYT4gPC9saT48L3Vs Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEiIGNsYXNzPSJv dXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5Mb29raW5nIGZvciBJZGVhcyBmb3IgdGhlIFBhY2thZ2Ug T3ZlcnZpZXcgUGFnZSBvbiBPQ2FtbC5vcmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2xvb2tpbmctZm9yLWlkZWFzLWZvci10aGUtcGFja2FnZS1vdmVydmlldy1wYWdl LW9uLW9jYW1sLW9yZy8xMTQxNi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sb29r aW5nLWZvci1pZGVhcy1mb3ItdGhlLXBhY2thZ2Utb3ZlcnZpZXctcGFnZS1vbi1vY2FtbC1vcmcv MTE0MTYvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn YjFkNjUxNCIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2IxZDY1MTQiPlNhYmluZSBT Y2htYWx0eiBhc2tlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQt b3JnYjFkNjUxNCI+DQo8cD5XZSBhcmUgbG9va2luZyBpbnRvIGltcHJvdmluZyB0aGUg4oCcT3Zl cnZpZXcvRGVzY3JpcHRpb27igJ0gcGFnZSBvZiBhIHBhY2thZ2UuIFNpbmNlIHRoaXMgaXMgYmFz aWNhbGx5IHRoZSDigJxsYW5kaW5nIHBhZ2XigJ0gb2YgdGhlIHBhY2thZ2UsIGl0IG5lZWRzIHRv IGJvdGggbG9vayBncmVhdCBhbmQgaW5jbHVkZSB0aGUgbW9zdCByZWxldmFudCBpbmZvLiBXZSB3 YW50IHlvdSB0byBiZSBhYmxlIHRvIGVzdGltYXRlIGF0IGEgZ2xhbmNlIHdoZXRoZXINCiB0aGUg cGFja2FnZSBpcyBvbmUgdGhhdCB5b3UgbWlnaHQgd2FudCB0byB1c2UsIGFuZCB0byBmaW5kIHRo ZSBtb3N0IGltcG9ydGFudCBsYW5kbWFya3MgKGUuZy4gQ0hBTkdFUy5tZCwgTElDRU5TRS5tZCwg RG9jdW1lbnRhdGlvbiwgcGFja2FnZSBob21lcGFnZSkgb2YgdGhlIHBhY2thZ2UgZWFzaWx5Lg0K PC9wPg0KPHA+U2hhcmUgeW91ciB0aG91Z2h0cyBhYm91dCBpdCEgPC9wPg0KPHVsIGNsYXNzPSJv cmctdWwiPg0KPGxpPldoYXQgd291bGQgYmUgdXNlZnVsIHRvIHNlZSBhcHBlYXJpbmcgb24gdGhl IHBhZ2Ugb3ZlcnZpZXcgcGFnZT8gPC9saT48bGk+V2XigJlyZSBhbHNvIHZlcnkgaW50ZXJlc3Rl ZCBpbiB5b3VyIGZhdm9yaXRlIHBhY2thZ2Ugb3ZlcnZpZXcgcGFnZXMgZnJvbSBvdGhlciBsYW5n dWFnZXMuIFBsZWFzZSBkbyBzaGFyZSBzY3JlZW5zaG90cyBvZiBwYWNrYWdlIG92ZXJ2aWV3IHBh Z2VzIHRoYXQgeW91IHJlYWxseSBsaWtlIHRvIHVzZSBpbiB0aGlzIHRocmVhZC4gV2UgYXJlIGNv bXBpbGluZyBhIG1vb2Rib2FyZCBpbiBvcmRlciB0byBzeXN0ZW1hdGljYWxseSBhbmFseXplIGhv dw0KIHRvIGJlc3QgYXJyYW5nZSB0aGUgY29udGVudCB0aGF0IHdlIGhhdmUgYW5kIHRvIGJlIGlu c3BpcmVkIG9uIHdoYXQgbG9va3MgZ3JlYXQgd2hpbGUgYmVpbmcgdXNhYmxlIGF0IHRoZSBzYW1l IHRpbWUuDQo8L2xpPjwvdWw+DQo8cD5Zb3VyIG9waW5pb25zIG1hdHRlciBhbmQgeW91ciBmZWVk YmFjayBpcyB1c2VkIHRvIGltcHJvdmUgb3VyIHdvcmsuIDwvcD4NCjxwPjxpPkVkaXRvcuKAmXMg bm90ZTogdGhlcmUgd2VyZSBtYW55IHJlcGxpZXMsIHBsZWFzZSBmb2xsb3cgdGhlIGFyY2hpdmUg bGluayBhYm92ZSB0byByZWFkIHRoZW0uPC9pPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjIiPnByciwgYSBmb3JrIG9mIGJyciBmb3Igbm9uLWJyb3dzZXIgSmF2YVNjcmlwdCBlbnZp cm9ubWVudHM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wcnIt YS1mb3JrLW9mLWJyci1mb3Itbm9uLWJyb3dzZXItamF2YXNjcmlwdC1lbnZpcm9ubWVudHMvMTE0 MTkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXByci1hLWZvcmstb2YtYnJy LWZvci1ub24tYnJvd3Nlci1qYXZhc2NyaXB0LWVudmlyb25tZW50cy8xMTQxOS8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc2OGEzNGFkIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjhhMzRhZCI+SGFvY2hlbiBLb3RvaS1YaWUgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc2OGEzNGFk Ij4NCjxwPknigJltIHBsZWFzZSB0byBhbm5vdW5jZSB0aGUgZmlyc3QgcmVsZWFzZSBvZiB0aGUg PGEgaHJlZj0iaHR0cHM6Ly9reGMuZGV2L3ByciI+DQpwcnI8L2E+IGxpYnJhcnk6IDxhIGhyZWY9 Imh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFja2FnZXMvcHJyL3Byci4wLjEuMS8iPnByci4wLjEu MTwvYT4uDQo8L3A+DQo8cD5QcnIgaXMgYSBmb3JrIGFuZCBhIHN0cmlwcGVkLWRvd24gdmVyc2lv biBvZiB0aGUgd2lkZWx5IHVzZWQgSmF2YVNjcmlwdCBGRkkgbGlicmFyeQ0KPGEgaHJlZj0iaHR0 cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvYnJyIj5icnI8L2E+LCB3aGljaCBpcyBvcmlnaW5h bGx5IGJ1aWx0IGJ5IEBkYnVlbnpsaS4NCjwvcD4NCjxwPlRoZXJlIGFyZSB0d28gbWFqb3IgZGlm ZmVyZW5jZXMgYmV0d2VlbiBicnIgYW5kIHBycjogPC9wPg0KPG9sIGNsYXNzPSJvcmctb2wiPg0K PGxpPnByciB1c2VzIGR1bmUgYXMgaXRzIGJ1aWxkIHN5c3RlbS4gVGhpcyBhbGxvd3MgZWFzaWVy IHZlbmRvcmluZyB0aHJvdWdoIGR1bmXigJlzDQo8YSBocmVmPSJodHRwczovL2R1bmUucmVhZHRo ZWRvY3MuaW8vZW4vc3RhYmxlL2R1bmUtZmlsZXMuaHRtbCN2ZW5kb3JlZC1kaXJzLXNpbmNlLTEt MTEiPg0KdmVuZG9yaW5nIHN1cHBvcnQ8L2E+LiA8L2xpPjxsaT5wcnIgaW5jbHVkZXMgb25seSBu b24tYnJvd3NlciBzcGVjaWZpYyBjb21wb25lbnRzIG9mIGJyciwgc28gdGhhdCBpdCBjb3VsZCBi ZSBzYWZlbHkgdXNlZCBpbiBKYXZhU2NyaXB0IGVudmlyb25tZW50cyBsaWtlIHRob3NlIG9mIE5v ZGUuanMgYW5kIFJlYWN0IE5hdGl2ZSBwcm9qZWN0cywgaW4gYWRkaXRpb24gdG8gdGFyZ2V0aW5n IHdlYi4gKEluIGZhY3QgdGhpcyBpcyBvdXIgbW90aXZhdGlvbiB0byBmb3JrIGJyciBpbiB0aGUg Zmlyc3QNCiBwbGFjZS4pDQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+cHJy4oCZcyA8YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20va3hjZGV2L3Byci9ibG9iL21haW4vUkVBRE1FLm1kIj5SRUFE TUU8L2E+IGdpdmVzIGFuIG92ZXJ2aWV3IG9mIHdoYXQgaXMgaW5jbHVkZWQgYW5kIHdoYXQgaXMg bm90Lg0KPC9saT48L3VsPg0KPC9saT48L29sPg0KPHA+Tm8gbmVlZCB0byBzYXkgdGhhdCB3ZSBh cmUgYmFzaWNhbGx5IGZyZWVsb2FkaW5nIEBkYnVlbnpsaSBhbmQgYnJyIGNvbnRyaWJ1dG9yc+KA mSBlZmZvcnRzIGluIGJ1aWxkaW5nIHN1Y2ggYSB3b25kZXJmdWwgRkZJIGxpYnJhcnkgc28gc3Bl Y2lhbCB0aGFua3MgdG8gdGhlIGNvbnRyaWJ1dG9ycyBvZiBicnIuDQo8L3A+DQo8cD48YSBocmVm PSJodHRwczovL2t4Yy5kZXYiPldlPC9hPiB3aWxsIGJlIGFjdGl2ZWx5IG1haW50YWluIGNvbXBh dGliaWxpdHkgYmV0d2VlbiBwcnIgYW5kIGJyciBhbmQgY2xvc2VseSBmb2xsb3cgdGhlIGRldmVs b3BtZW50cyBvZiBicnIuDQo8L3A+DQo8cD5UbyBpbnN0YWxsLCBzaW1wbGUgcnVuIDxjb2RlPm9w YW0gaW5zdGFsbCBwcnI8L2NvZGU+LCBsaXN0IDxjb2RlPnBycjwvY29kZT4gYXMgYSBkZXBlbmRl bmN5IG9mIHlvdXIgcHJvamVjdCwgYW5kDQo8Y29kZT5vcGVuIFBycjwvY29kZT4uIENvZGUgdGhh dCBwcmV2aW91c2x5IGRlcGVuZHMgb24gPGNvZGU+YnJyPC9jb2RlPiBzaG91bGQgd29yayB3aXRo b3V0IG1vZGlmaWNhdGlvbiBpZiBubyBhY2Nlc3MgdG8gYnJvd3NlciBzcGVjaWZpYyBBUElzIGlz IHVzZWQuDQo8L3A+DQo8cD5Db21tZW50cyBhbmQgc3VnZ2VzdGlvbnMgYXJlIG1vc3RseSB3ZWxj b21lZC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMiPklDRlAgMjAyMyBBcnRpZmFj dCBFdmFsdWF0aW9uIENvbW1pdHRlZTogY2FsbCBmb3Igbm9taW5hdGlvbnM8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ljZnAtMjAyMy1hcnRpZmFjdC1ldmFsdWF0aW9u LWNvbW1pdHRlZS1jYWxsLWZvci1ub21pbmF0aW9ucy8xMTQzMC8xIj4NCmh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9pY2ZwLTIwMjMtYXJ0aWZhY3QtZXZhbHVhdGlvbi1jb21taXR0ZWUtY2Fs bC1mb3Itbm9taW5hdGlvbnMvMTE0MzAvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnZjBjM2ViOSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9y Z2YwYzNlYjkiPlF1ZW50aW4gU3Rpw6l2ZW5hcnQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdmMGMzZWI5Ij4NCjxwPldlIGFyZSBsb29raW5n IGZvciBtb3RpdmF0ZWQgcGVvcGxlIHRvIGJlIG1lbWJlcnMgb2YgdGhlIElDRlAgMjAyMyBBcnRp ZmFjdCBFdmFsdWF0aW9uIENvbW1pdHRlZSAoQUVDKS4gU3R1ZGVudHMsIHJlc2VhcmNoZXJzIGFu ZCBwZW9wbGUgZnJvbSB0aGUgaW5kdXN0cnkgb3IgdGhlIGZyZWUgc29mdHdhcmUgY29tbXVuaXR5 IGFyZSBhbGwgd2VsY29tZS4gVGhlIGFydGlmYWN0IGV2YWx1YXRpb24gcHJvY2VzcyBhaW1zIHRv IGltcHJvdmUgdGhlDQogcXVhbGl0eSBhbmQgcmVwcm9kdWNpYmlsaXR5IG9mIHJlc2VhcmNoIGFy dGlmYWN0cyBmb3IgSUNGUCBwYXBlcnMuIEluIGNhc2UgeW91IHdhbnQgdG8gbm9taW5hdGUgc29t ZW9uZSBlbHNlIChzdHVkZW50cywgY29sbGVhZ3VlcywgZXRjLiksIHBsZWFzZSBzZW5kIHRoZW0g dGhlIG5vbWluYXRpb24gZm9ybS4NCjwvcD4NCjxwPk5vbWluYXRpb24gZm9ybTogPGEgaHJlZj0i aHR0cHM6Ly9mb3Jtcy5nbGUvUkRvbW9ITHYzOVJuakJVQzYiPmh0dHBzOi8vZm9ybXMuZ2xlL1JE b21vSEx2MzlSbmpCVUM2PC9hPg0KPC9wPg0KPHA+Rm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSB0 aGUgQUVDIHdlYnBhZ2U6IDxhIGhyZWY9Imh0dHBzOi8vaWNmcDIzLnNpZ3BsYW4ub3JnL3RyYWNr L2ljZnAtMjAyMy1hcnRpZmFjdC1ldmFsdWF0aW9uIj4NCmh0dHBzOi8vaWNmcDIzLnNpZ3BsYW4u b3JnL3RyYWNrL2ljZnAtMjAyMy1hcnRpZmFjdC1ldmFsdWF0aW9uPC9hPiA8L3A+DQo8cD5UaGUg cHJpbWFyeSByZXNwb25zaWJpbGl0eSBvZiBjb21taXR0ZWUgbWVtYmVycyBpcyB0byByZXZpZXcg dGhlIGFydGlmYWN0cyBzdWJtaXR0ZWQgY29ycmVzcG9uZGluZyB0byB0aGUgYWxyZWFkeSBjb25k aXRpb25hbGx5IGFjY2VwdGVkIHBhcGVycyBpbiB0aGUgbWFpbiByZXNlYXJjaCB0cmFjay4gSW4g cGFydGljdWxhciwgcnVuIHRoZSBhc3NvY2lhdGVkIHRvb2wgb3IgYmVuY2htYXJrLCBjaGVjayB3 aGV0aGVyIHRoZSByZXN1bHRzIGluDQogdGhlIHBhcGVyIGNhbiBiZSByZXByb2R1Y2VkLCBhbmQg aW5zcGVjdCB0aGUgdG9vbCBhbmQgdGhlIGRhdGEuIDwvcD4NCjxwPldlIGV4cGVjdCBldmFsdWF0 aW9uIG9mIG9uZSBhcnRpZmFjdCB0byB0YWtlIGFib3V0IGEgZnVsbCBkYXkuIEVhY2ggY29tbWl0 dGVlIG1lbWJlciB3aWxsIHJlY2VpdmUgMiB0byAzIGFydGlmYWN0cyB0byByZXZpZXcuDQo8L3A+ DQo8cD5BbGwgb2YgdGhlIEFFQyB3b3JrIHdpbGwgYmUgZG9uZSByZW1vdGVseS9vbmxpbmUuIFRo ZSBBRUMgd2lsbCB3b3JrIGluIEp1bmUsIHdpdGggdGhlIHJldmlldyB3b3JrIGhhcHBlbmluZyBi ZXR3ZWVuIEp1bmUgNXRoIGFuZCBKdW5lIDI5dGguDQo8L3A+DQo8cD5Db21lIGpvaW4gdXMgaW4g aW1wcm92aW5nIHRoZSBxdWFsaXR5IG9mIHJlc2VhcmNoIGluIG91ciBmaWVsZCEgPC9wPg0KPHA+ QmVzdCwgdGhlIEFydGlmYWN0IEV2YWx1YXRpb24gY2hhaXJzOiBKYW5uaXMgTGltcGVyZyBhbmQg UXVlbnRpbiBTdGnDqXZlbmFydCA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+TmV3 IE93bCBib29rOiBBcmNoaXRlY3R1cmUgb2YgQWR2YW5jZWQgTnVtZXJpY2FsIEFuYWx5c2lzIFN5 c3RlbXM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy1vd2wtYm9v ay1hcmNoaXRlY3R1cmUtb2YtYWR2YW5jZWQtbnVtZXJpY2FsLWFuYWx5c2lzLXN5c3RlbXMvMTE0 MzQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbmV3LW93bC1ib29rLWFyY2hpdGVj dHVyZS1vZi1hZHZhbmNlZC1udW1lcmljYWwtYW5hbHlzaXMtc3lzdGVtcy8xMTQzNC8xPC9hPg0K PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyNDgxYjRkIiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMjQ4MWI0ZCI+QW5kcmVhcyBQb2lzZWwgYW5ub3Vu Y2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcyNDgxYjRk Ij4NCjxwPlRoZXJlIGlzIGEgc2Vjb25kIGJvb2sgb24gT3dsOiA8YSBocmVmPSJodHRwczovL2xp bmsuc3ByaW5nZXIuY29tL2Jvb2svMTAuMTAwNy85NzgtMS00ODQyLTg4NTMtNSI+DQpBcmNoaXRl Y3R1cmUgb2YgQWR2YW5jZWQgTnVtZXJpY2FsIEFuYWx5c2lzIFN5c3RlbXMgLSBEZXNpZ25pbmcg YSBTY2llbnRpZmljIENvbXB1dGluZyBTeXN0ZW0gdXNpbmcgT0NhbWw8L2E+Lg0KPC9wPg0KPHA+ RnJlZSBkb3dubG9hZCBpbiBQREYgYW5kIGVQdWIgZm9ybWF0cyEgPC9wPg0KPC9kaXY+DQo8L2Rp dj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUt MiI+DQo8aDIgaWQ9IjUiPkltcHJvdmVtZW50IG9uIHRoZSBQUFggZWNvc3lzdGVtIGRvY3VtZW50 YXRpb248L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+ QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1pbXByb3Zl bWVudC1vbi10aGUtcHB4LWVjb3N5c3RlbS1kb2N1bWVudGF0aW9uLzExNDM4LzEiPg0KaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1pbXByb3ZlbWVudC1vbi10aGUtcHB4LWVjb3N5c3Rl bS1kb2N1bWVudGF0aW9uLzExNDM4LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZ2Y2YzVkN2YiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdm NmM1ZDdmIj5QYXVsLUVsbGlvdCBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Y2YzVkN2YiPg0KPHA+Jmd0O0Zyb20gdGhlIE9DYW1sIHN1cnZl eSBhbmQgc2V2ZXJhbCBkaXNjdXNzIHRocmVhZHMsIGl0IHNlZW1zIGNsZWFyIHRoYXQgZG9jdW1l bnRhdGlvbiBpcyBhbiBpbXBvcnRhbnQgaXNzdWUgaW4gT0NhbWwsIGVzcGVjaWFsbHkgd2l0aCBQ UFhzLiBJ4oCZbSBwbGVhc2VkIHRvIGFubm91bmNlIHR3byBpbXByb3ZlbWVudHMgb24gdGhpcyBz aWRlOiB0aGUgcHVibGljYXRpb24gKGxhc3Qgc3VtbWVyKSBvZiBvdXIgbmV3IOKAnFByZXByb2Nl c3NvcnMgYW5kDQogUFBYc+KAnSA8YSBocmVmPSJodHRwczovL29jYW1sLm9yZy9kb2NzL21ldGFw cm9ncmFtbWluZyI+Z3VpZGU8L2E+IG9uIE9DYW1sLm9yZywgYW5kIHRoZSB2YXN0IGVuaGFuY2Vt ZW50IG9mIHRoZQ0KPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9wcHhsaWIvMC4yOS4xL2Rv Yy9pbmRleC5odG1sIj5wcHhsaWIgZG9jdW1lbnRhdGlvbjwvYT4gKHZlcnkgcmVjZW50bHkpLg0K PC9wPg0KPHA+VGhlIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2RvY3MvbWV0YXByb2dyYW1t aW5nIj5vY2FtbC5vcmcgZ3VpZGU8L2E+IGlzIHRhcmdldGVkIGF0IG5ld2NvbWVycyB3aG8gZG9u 4oCZdCBrbm93IHdoYXQgYSBQUFggaXMsIG5vciBob3cgdG8gdXNlIHRoZW0uDQo8L3A+DQo8cD5U aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvcC9wcHhsaWIvMC4yOS4xL2RvYy9pbmRleC5o dG1sIj5wcHhsaWLigJlzIGRvY3VtZW50YXRpb248L2E+IGlzIHRhcmdldGVkIGF0IFBQWCBhdXRo b3JzLCBhcyB3ZWxsIGFzIFBQWCB1c2VycyB3aG8gd2FudCB0byBrbm93IG1vcmUgYWJvdXQgdGhl IGFkdmFudGFnZXMsIGFuZCB3aGF04oCZcyB1bmRlciB0aGUgaG9vZCwgb2YNCjxjb2RlPnBweGxp YjwvY29kZT4uIDwvcD4NCjxwPlRoZSBpbXByb3ZlbWVudHMgaW4gdGhlIHBweGxpYuKAmXMgZG9j dW1lbnRhdGlvbiBhcmU6IDwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5Nb3JlIGNvbnRl bnQ6IG1hbnkgbmV3IHNlY3Rpb25zIGFuZCBleHBsYW5hdGlvbnMgd2VyZSBhZGRlZC4gPC9saT48 bGk+TW9yZSBkaXNjb3ZlcmFiaWxpdHk6IEluc3RlYWQgb2YgYmVpbmcgc3ByZWFkIGluIG1hbnkg QVBJIHBhZ2VzLCB0aGUg4oCcZ2VuZXJhbOKAnSBkb2N1bWVudGF0aW9uIGlzIGdhdGhlcmVkIGlu DQo8Y29kZT4ubWxkPC9jb2RlPiBwYWdlcyBmb2N1c2VkIG9uIGEgc3BlY2lmaWMgdG9waWMsIHN1 Y2ggYXMg4oCcbWF0Y2hpbmcgY29kZeKAnSwg4oCcZ29vZCBwcmFjdGljZXPigJ0sIGV0Yy4gQVBJ IHBhZ2VzIGFyZSBmb2N1c2VkIG9uIHRoZSBBUEkgaXRzZWxmLCB3aXRoIGxpbmtzIHRvIHRoZSBy ZWxldmFudCBzZWN0aW9ucyBvZiB0aGUgbWFudWFsLg0KPC9saT48bGk+VGhhbmtzIHRvIDxjb2Rl Pm9kb2M8L2NvZGU+LCBJIGNvdWxkIGFsc28gZWFzaWx5IGFkZCBtYW55IGxpbmtzIGZyb20gdGhl IG1hbnVhbCB0byB0aGUgQVBJIGl0ZW1zLg0KPC9saT48bGk+TWFueSBjb2RlIHNuaXBwZXRzIGRp ZCBub3QgY29tcGlsZSwgZHVlIHRvIHByb2dyYW1taW5nIHR5cG9zIG9yIG91dGRhdGVkIEFQSS4g VGhvc2Ugd2VyZSBjb3JyZWN0ZWQgYW5kIGltcHJvdmVkLg0KPC9saT48bGk+VGhlIEFQSSBsYW5k aW5nIHBhZ2Ugd2FzIHZlcnkgZGlmZmljdWx0IHRvIG5hdmlnYXRlLiBJdCBpcyBub3cgbW9yZSBv cmdhbml6ZWQsIHdpdGggc2VjdGlvbnMsIGFuZCBkb2NzdHJpbmdzIGZvciBldmVyeSB0b3BsZXZl bCBtb2R1bGVzLg0KPC9saT48L3VsPg0KPHA+VGhlIG1hbnVhbCBjYW4gc3RpbGwgYmUgaW1wcm92 ZWQgaW4gbWFueSB3YXlzLiBUaGVyZSBhcmUgbWFueSBzZWN0aW9ucyB0aGF0IGNvdWxkIGJlIGFk ZGVkIG9yIGltcHJvdmVkLiBBIGdsb2JhbCBuYXZpZ2F0aW9uIGJhciB3b3VsZCBoZWxwIGEgbG90 IHRoZSBuYXZpZ2F0aW9uIGluIHRoZSBtbGQgcGFnZXMuIEkgd2lsbCBhbHNvIGFkZCBzb29uIGEg Y2hlY2sgdGhhdCBjb2RlIHNuaXBwZXRzIGRvbuKAmXQgZ28gb3V0ZGF0ZWQsIHVzaW5nDQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vcmVhbHdvcmxkb2NhbWwvbWR4Ij5tZHg8L2E+IChvbiA8 Y29kZT4ubWxpPC9jb2RlPiBmaXJzdCwgYnV0IGFsc28gb24NCjxjb2RlPi5tbGQ8L2NvZGU+IGFz IHNvb24gYXMgdGhlIHJlbGV2YW50IG1keCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vcmVh bHdvcmxkb2NhbWwvbWR4L3B1bGwvMzc3Ij4NClBSPC9hPiBpcyBmaW5pc2hlZCBhbmQgbWVyZ2Vk ISkuIDwvcD4NCjxwPk92ZXJhbGwsIHdyaXRpbmcgZG9jdW1lbnRhdGlvbiBoYXMgYmVlbiB2ZXJ5 IHNtb290aCBmb3IgbWUuIEkgd291bGQgZW5jb3VyYWdlIHRoZSBjb21tdW5pdHkgdG8gY29udHJp YnV0ZSB0byB0aGUgZG9jdW1lbnRhdGlvbiBlZmZvcnQ6IFBScyBmb3IgaW1wcm92ZW1lbnRzIG9m DQo8Y29kZT5wcHhsaWI8L2NvZGU+4oCZcyBkb2NzIGFyZSB3YXJtbHkgd2VsY29tZSwgYW5kIEni gJltIHN1cmUgdGhhdOKAmXMgdGhlIGNhc2UgZm9yIG1hbnkgcGFja2FnZXMhIEl0IGlzIHJlYWxs eSBhIGtpbGxlciBmZWF0dXJlIHRvIGhhdmUgYWxsIGRvY3MgY2VudHJhbGl6ZWQgb24gb2NhbWwu b3JnLCBhbmQNCjxjb2RlPm9kb2M8L2NvZGU+IGlzIGEgZ3JlYXQgdG9vbCBmb3Igd3JpdGluZyBi b3RoIGFuIEFQSSBhbmQgYSBtYW51YWwgd2l0aCBpbnRlcmNvbm5lY3RlZCBsaW5rczsgTGV04oCZ cyBtYWtlIHRoZSBiZXN0IHVzZSBvZiB0aGlzIQ0KPC9wPg0KPHA+VGhhbmtzIGEgbG90IHRvIEBw aXRhZyBhbmQgQHByb2Zlc3Nvci5yb3NlIGZvciB0aGUgdmVyeSB2YWx1YWJsZSBhbmQgY29tcHJl aGVuc2l2ZSByZXZpZXdzLCByZXNwZWN0aXZlbHkgb24gY29udGVudCBhbmQgZm9ybSwgd2hpY2gg aGlnaGx5IGltcHJvdmVkIHRoZSBxdWFsaXR5IG9mIHRoZSBkb2N1bWVudHMhIFRoYW5rcyBhbHNv IGEgbG90IHRvIFRhcmlkZXMgYW5kIEphbmUgU3RyZWV0IGZvciBzcG9uc29yaW5nIG1lIHRvIHdv cmsgb24gdGhpcw0KIHRhc2shIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLTYiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI2Ij5UaGUg Y29sb3IgYXNzb2NpYXRlZCB3aXRoIE9DYW1sIG9uIEdpdGh1YiBpcyBiYWQuIExldOKAmXMgbWFr ZSBpdCBnb29kPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC02Ij4N CjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90aGUtY29s b3ItYXNzb2NpYXRlZC13aXRoLW9jYW1sLW9uLWdpdGh1Yi1pcy1iYWQtbGV0cy1tYWtlLWl0LWdv b2QvNTU5Ny8xOSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhlLWNvbG9yLWFzc29j aWF0ZWQtd2l0aC1vY2FtbC1vbi1naXRodWItaXMtYmFkLWxldHMtbWFrZS1pdC1nb29kLzU1OTcv MTk8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzhlYzlh YzAiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4ZWM5YWMwIj5nYXNjaGUgc2FpZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOGVjOWFjMCI+DQo8 cD5J4oCZbSByZXZpdmluZyB0aGlzIHRvcGljIGJlY2F1c2UgdGhlcmUgaXMgbm93IGEgY29uY3Jl dGUgcHJvcG9zYWwgdG8gY2hhbmdlIHRoZSBHaXRodWIgTGluZ3Vpc3QgY29sb3IgZm9yIE9DYW1s IGZyb20g4oCcbmVvbiBncmVlbuKAnQ0KPGEgaHJlZj0iaHR0cHM6Ly93d3cuY29sb3ItaGV4LmNv bS9jb2xvci8zYmUxMzMiPjNiZTEzMzwvYT4gdG8g4oCcb3Jhbmdl4oCdIDxhIGhyZWY9Imh0dHBz Oi8vd3d3LmNvbG9yLWhleC5jb20vY29sb3IvZWU2YTFhIj4NCmVlNmExYTwvYT4uIFRoZSBwZXJz b24gcHJvcG9zaW5nIHRoZSBjaGFuZ2Ugd2FudHMgdG8ga25vdyB3aGV0aGVyIOKAnHRoZSBPQ2Ft bCBjb21tdW5pdHnigJ0gYWdyZWVzIHdpdGggdGhlIHByb3Bvc2FsIGFuZCBvcGVuZWQgYSBwb2xs Og0KPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2Rpc2N1 c3Npb25zLzEyMDEzIj5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvZGlzY3Vzc2lvbnMv MTIwMTM8L2E+DQo8L3A+DQo8cD5QbGVhc2UgZ28gdGhlcmUgaWYgeW91IHdhbnQgdG8gZ2l2ZSB5 b3VyIG9waW5pb24gb24gdGhlIHByb3Bvc2VkIGNoYW5nZS4gPC9wPg0KPHA+Tm90ZTog4oCcZ2l0 aHViIGxpbmd1aXN04oCdIGlzIHVzZWQgdG8gZGV0ZWN0IHdoaWNoIGxhbmd1YWdlcyBhcmUgdXNl ZCBpbiBnaXQgcmVwb3NpdG9yaWVzLCB3aXRoIHN1bW1hcmllcyBzaG93biBhdXRvbWljYWxseSBh bmQgYSBjb2xvciBjb2RlIHRvIGRpc3BsYXkgdGhlIHByb3BvcnRpb25zLiBUaGlzIGlzIHVzZWQg b24gYm90aCBHaXRodWIgYW5kIEdpdGxhYi4gU2VlIGZvciBleGFtcGxlIHRoZSDigJxMYW5ndWFn ZXPigJ0gc2VjdGlvbiBhdCB0aGUgZW5kDQogb2YgdGhlIHJpZ2h0IGNvbHVtbiBvbiB0aGUgd2Vi cGFnZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwiPmh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbDwvYT4uDQo8L3A+DQo8cD5Ob3RlOiBwYXN0IGRpc2N1c3Npb25z IGluIHRoZSBwcmVzZW50IHRocmVhZCBhcmUgaXJyaXRhdGVkIGJ5IGEgbGltaXRhdGlvbiB0aGF0 IG9uZSBpcyBub3QgYWxsb3dlZCB0byBwaWNrIGEgY29sb3IgY2xvc2UgdG8gYW4gZXhpc3Rpbmcg bGFuZ3VhZ2XigJlzIGNvbG9yLiBNeSB1bmRlcnN0YW5kaW5nIGlzIHRoYXQgdGhpcyBsaW1pdGF0 aW9uIGhhcyBzaW5jZSBiZWVuIHJlbW92ZWQsIHNvIGFueSBjaG9pY2Ugb2YgY29sb3IgZm9yIE9D YW1sIHdvdWxkDQogZG8uIDwvcD4NCjxwPkBnbGVubnNsIHlvdSBwcmV2aW91c2x5IHByb3Bvc2Vk IGEgc2xpZ2h0bHkgZGlmZmVyZW50IHNoYWRlIG9mIG9yYW5nZSwgPGEgaHJlZj0iaHR0cHM6Ly93 d3cuY29sb3ItaGV4LmNvbS9jb2xvci9lZjdhMDgiPg0KZWY3YTA4PC9hPiByYXRoZXIgdGhhbiA8 YSBocmVmPSJodHRwczovL3d3dy5jb2xvci1oZXguY29tL2NvbG9yL2VlNmExYSI+ZWU2YTFhPC9h Pi4gSWYgeW91IGhhcHBlbiB0byBoYXZlIGEgc3Ryb25nIG9waW5pb24gb24gb25lIHJhdGhlciB0 aGFuIHRoZSBvdGhlciwgbm93IHdvdWxkIGJlIGEgZ29vZCB3YXkgdG8gdm9pY2UgaXQgb24gdGhl IHBvbGwvZGlzY3Vzc2lvbiB0aHJlYWQuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i NyI+UGF1bCBCaWdnYXIgb24gRGFya2xhbmc8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3BhdWwtYmlnZ2FyLW9uLWRhcmtsYW5nLzExMzcwLzYiPg0KaHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L3BhdWwtYmlnZ2FyLW9uLWRhcmtsYW5nLzExMzcwLzY8L2E+IDwvcD4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNDI1MDQxMSIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzQyNTA0MTEiPkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIENs YXVkZSBKYWdlci1SdWJpbnNvbiBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmc0MjUwNDExIj4NCjxwPlRoZSByZWNvcmRpbmcgb2YgUGF1bOKAmXMgdGFs ayBpcyBub3cgYXZhaWxhYmxlIG9uIG91ciB3ZWJzaXRlIGF0IDxhIGhyZWY9Imh0dHBzOi8vaGZw dWcub3JnIj4NCmh0dHBzOi8vaGZwdWcub3JnPC9hPi4gSGUgZGlzY3Vzc2VzIHJld3JpdGluZyB0 aGUgT0NhbWwgY29kZWJhc2UgYXQgYWJvdXQgMzAgbWludXRlcyBpbi4gSGlzIGJhc2ljIGFyZ3Vt ZW50IHdhcyB0aGF0IHRoZSBGIyBlY29zeXN0ZW0gd2FzIG11Y2ggc3Ryb25nZXIg4oCTIGxpYnJh cmllcywgdG9vbGluZywgZXRjLiBXaGF0IHdhcyBtb3JlIGludGVyZXN0aW5nIHRvIG1lIHdlcmUg c29tZSBvZiBoaXMgY3JpdGljaXNtcyBvZiBSdXN0ICh3aGljaCBpcw0KIGFsc28gdGhlIHN1Ympl Y3Qgb2Ygb25lIG9mIGhpcyBibG9nIHBvc3RzKS4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIg aWQ9IjgiPk1ham9yIHVwZGF0ZXMgdG8ga2NhcyBpbiAwLjEuOCBhbmQgMC4yLjA8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tYWpvci11cGRhdGVzLXRvLWtjYXMt aW4tMC0xLTgtYW5kLTAtMi0wLzExMzkyLzIiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1tYWpvci11cGRhdGVzLXRvLWtjYXMtaW4tMC0xLTgtYW5kLTAtMi0wLzExMzkyLzI8L2E+ DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzA3MGIzYjEiIGNs YXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwNzBiM2IxIj5Db250aW51aW5nIHRoaXMgdGhy ZWFkLCBWZXNhIEthcnZvbmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnMDcwYjNiMSI+DQo8cD5JIHJlY2VudGx5IGhlbGQgYSB0YWxrIG9u IHRoZSB3b3JrOiA8L3A+DQo8YmxvY2txdW90ZT4NCjxwPmstQ0FTIGZvciBzd2VhdC1mcmVlIGNv bmN1cnJlbnQgcHJvZ3JhbW1pbmcgPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+U2VlIHRoZSA8YSBo cmVmPSJodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTF6OFBzaHZXT0Y4Ij52aWRlbzwv YT4gYW5kIDxhIGhyZWY9Imh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3BvbHl0eXBpYy8zMjE0Mzg5 YWQ2OWIxNmQyOGI5NTdjZWQ4NmUxYjFhNCNrLWNhcy1mb3Itc3dlYXQtZnJlZS1jb25jdXJyZW50 LXByb2dyYW1taW5nIj4NCnNsaWRlczwvYT4sIGluY2x1ZGluZyBmdWxsIHNwZWFrZXLigJlzIG5v dGVzLiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci05IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iOSI+T1VQUyBtZWV0dXAgbWFyY2gg MjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtOSI+DQo8cD5B cmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3Vwcy1tZWV0dXAt bWFyY2gtMjAyMy8xMTQ3MC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXBzLW1l ZXR1cC1tYXJjaC0yMDIzLzExNDcwLzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItb3JnZjUxZGNiYyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2Y1 MWRjYmMiPnphcGFzaGNhbm9uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnZjUxZGNiYyI+DQo8cD5UaGUgbmV4dCBPVVBTIG1lZXR1cCB3aWxs IHRha2UgcGxhY2Ugb24gPGI+VGh1cnNkYXksIDE2dGggb2YgTWFyY2g8L2I+IDIwMjMuIEl0IHdp bGwgc3RhcnQgYXQNCjxiPjdwbTwvYj4gYXQgdGhlIDxiPjQgcGxhY2UgSnVzc2lldTwvYj4sIDc1 MDA1IFBhcmlzLiA8L3A+DQo8cD46d2FybmluZzogOnRydW1wZXQ6IEl0IHdpbGwgYmUgaW4gdGhl IGluIHRoZSA8Yj5Bc3RpZXIgYW1waGl0aGVhdGVyPC9iPiBpbiB0aGUNCjxiPkVzY2xhbmdvbiBi dWlsZGluZzwvYj4uIDp0cnVtcGV0OiA6d2FybmluZzogPC9wPg0KPHA+UGxlYXNlLCA8Yj48YSBo cmVmPSJodHRwczovL3d3dy5tZWV0dXAuY29tL2ZyLUZSL29jYW1sLXBhcmlzL2V2ZW50cy8yOTE2 MzczNzAiPnJlZ2lzdGVyIG9uIG1lZXR1cA0KPC9hPjwvYj5hcyBzb29uIGFzIHBvc3NpYmxlIHRv IGxldCB1cyBrbm93IGhvdyBtYW55IHBpenphIHdlIHNob3VsZCBvcmRlci4gPC9wPg0KPHA+Rm9y IG1vcmUgZGV0YWlscywgeW91IG1heSBjaGVjayB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vdXBzLmZy YW1hLmlvIj5PVVBT4oCZIHdlYnNpdGUNCjwvYT4uIDwvcD4NCjxwPlRoaXMgbW9udGggd2lsbCBm ZWF0dXJlIHRoZSBmb2xsb3dpbmcgdGFsa3MgOiA8L3A+DQo8cD48Yj5EZXV4IG1vdGV1cnMgZGUg cmVjaGVyY2hlIHBvdXIgbOKAmWVjb3N5c3TDqG1lIE9DYW1sIOKAkyBBcnRodXIgV2VuZGxpbmc8 L2I+IDwvcD4NCjxwPlNoZXJsb2NvZGUgZXQgU2hlcmxvZG9jIHNvbnQgZGV1eCBwZXRpdHMgb3V0 aWxzIHBvdXIgZXhwbG9yZXIgbGVzIG5vbWJyZXV4IHByb2pldHMgcHVibGnDqXMgc3VyIG9wYW0u IExlIHByZW1pZXIgcGVybWV0IGRlIGBncmVwYCBlbiB0ZW1wcyByw6llbCBsZXVyIGNvZGUgc291 cmNlLCB0YW5kaXMgcXVlIGxlIHNlY29uZCBmYWNpbGl0ZSBsYSByZWNoZXJjaGUgZGFucyBsZXVy IGRvY3VtZW50YXRpb24gKMOgIGxhIEhvb2dsZSkuIER1cmFudCBsYSBwcsOpc2VudGF0aW9uLA0K IG9uIHZlcnJhIHF1ZSBjZXMgb3V0aWxzIGV4aXN0ZW50IHBvdXIgc2F0aXNmYWlyZSBkZXV4IGVu dmllcyA6IHLDqXBvbmRyZSDDoCBkZXMgcXVlc3Rpb25zIHRvcmR1ZXMgc3VyIGzigJl1c2FnZSBk 4oCZT0NhbWwsIG1haXMgYXVzc2kgYXBwcmVuZHJlIMOgIGNvZGVyIGNlIHR5cGUgZGUgbW90ZXVy IGRlIHJlY2hlcmNoZS4gT24gZXhwbGlxdWVyYSBkb25jIGNvbW1lbnQgbGVzIHJlY2hlcmNoZXMg cGFyIHJlZ2V4IGV0IHBhciB0eXBlIG9udCDDqXTDqSBpbXBsw6ltZW50w6llcywNCiBncsOiY2Ug w6AgZGVzIGFzdHVjZXMgw6lsw6lnYW50ZXMgZW1wcnVudMOpZXMgw6AgbGEgbGl0dMOpcmF0dXJl 4oCmIGV0IGRlcyBoYWNrcyBkb3V0ZXV4IHF14oCZaWwgdmF1ZHJhaXQgbWlldXggbmUgcGFzIMOp YnJ1aXRlci4NCjwvcD4NCjxwPjxiPkNyZXVzb3QgYSBwcm9waGV0aWMgdmVyaWZpZXIgZm9yIFJ1 c3Qg4oCTIFhhdmllciBEZW5pczwvYj4gPC9wPg0KPHA+UnVzdCBpcyBhIGZhaXJseSByZWNlbnQg cHJvZ3JhbW1pbmcgbGFuZ3VhZ2UgZm9yIHN5c3RlbSBwcm9ncmFtbWluZywgYnJpbmdpbmcgc3Rh dGljIGd1YXJhbnRlZXMgb2YgbWVtb3J5IHNhZmV0eSB0aHJvdWdoIGEgc3Ryb25nIG93bmVyc2hp cCBwb2xpY3kuIFRoaXMgZmVhdHVyZSBvcGVucyBwcm9taXNpbmcgYWR2YW5jZXMgZm9yIGRlZHVj dGl2ZSB2ZXJpZmljYXRpb24sIHdoaWNoIGFpbXMgYXQgcHJvdmluZyB0aGUgY29uZm9ybWl0eSBv Zg0KIFJ1c3QgY29kZSB3aXRoIHJlc3BlY3QgdG8gYSBzcGVjaWZpY2F0aW9uIG9mIGl0cyBpbnRl bmRlZCBiZWhhdmlvci4gV2UgcHJlc2VudCBDcmV1c290LCBhIHRvb2wgZm9yIHRoZSBmb3JtYWwg c3BlY2lmaWNhdGlvbiBhbmQgZGVkdWN0aXZlIHZlcmlmaWNhdGlvbiBvZiBSdXN0LiBDcmV1c290 4oCZcyBzcGVjaWZpY2F0aW9uIGxhbmd1YWdlIGZlYXR1cmVzIGEgbm90aW9uIG9mIHByb3BoZWNp ZXMgdG8gcmVhc29uIGFib3V0IG1lbW9yeSBtdXRhdGlvbi4NCiBSdXN0IHByb3ZpZGVzIGFkdmFu Y2VkIGFic3RyYWN0aW9uIGZlYXR1cmVzIGJhc2VkIG9uIGEgbm90aW9uIG9mIHRyYWl0cywgZXh0 ZW5zaXZlbHkgdXNlZCBpbiB0aGUgc3RhbmRhcmQgbGlicmFyeSBhbmQgaW4gdXNlciBjb2RlLiBU aGUgc3VwcG9ydCBmb3IgdHJhaXRzIGlzIGF0IHRoZSBoZWFydCBvZiBDcmV1c2904oCZcyBhcHBy b2FjaCBvZiB2ZXJpZmljYXRpb24gYW5kIHNwZWNpZmljYXRpb24gb2YgcHJvZ3JhbXMNCjwvcD4N CjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTEwIiBj bGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMTAiPkR1bmUgMy43LjA8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEwIj4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTctMC8xMTQ3NC8xIj5odHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMy03LTAvMTE0NzQvMTwvYT4NCjwvcD4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYWFjMDg3MCIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZ2FhYzA4NzAiPkV0aWVubmUgTWlsbG9uIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYWFjMDg3MCI+DQo8cD5U aGUgZHVuZSB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRHVuZSAz LjcuMC4gPC9wPg0KPHA+QXMgaW4gPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1kdW5lLTMtNi0wLzEwODExIj50aGUgcHJldmlvdXMgYW5ub3VuY2U8L2E+LCBoZXJlIGlz IGEgY2hhbmdlbG9nIHNwbGl0IGluIHNldmVyYWwgcGFydHM6IGNoYW5nZXMgdG8gdGhlDQo8Y29k ZT5kdW5lPC9jb2RlPiBleGVjdXRhYmxlIGl0c2VsZiAobmV3IGNvbW1hbmRzIG9yIG9wdGlvbnMs IGV0YykgYW5kIGNoYW5nZXMgdG8gdGhlIGR1bmUgbGFuZ3VhZ2UuIE1vc3Qgb2YgdGhlIGNoYW5n ZXMgdG8gdGhlIGxhdHRlciBhcmUgb25seSBlbmFibGVkIHdoZW4geW91IG9wdC1pbiB0byB0aGUg bmV3IHZlcnNpb24gYnkgc3BlY2lmeWluZw0KPGNvZGU+KGxhbmcgZHVuZSAzLjcpPC9jb2RlPiBp biB0aGUgY29ycmVzcG9uZGluZyA8Y29kZT5kdW5lLXByb2plY3Q8L2NvZGU+IGZpbGUuIEluIG90 aGVyIHdvcmRzLCBpdCBzaG91bGQgYWx3YXlzIGJlIHNhZmUgdG8gdXBncmFkZSB0aGUNCjxjb2Rl PmR1bmU8L2NvZGU+IHBhY2thZ2UuIDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnNTJhYzdjMyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzUyYWM3YzMi PmR1bmUgZXhlY3V0YWJsZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNCIgaWQ9InRl eHQtb3JnNTJhYzdjMyI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9y ZzIxZDQ5ZDkiPjwvYT5BZGRlZDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBpZD0i dGV4dC1vcmcyMWQ0OWQ5Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5BbGxvdyBydW5uaW5n IDxjb2RlPiQgZHVuZSBleGVjPC9jb2RlPiBpbiB3YXRjaCBtb2RlICh3aXRoIHRoZSA8Y29kZT4t dzwvY29kZT4gZmxhZykuIEluIHdhdGNoIG1vZGUsDQo8Y29kZT4kIGR1bmUgZXhlYzwvY29kZT4g dGhlIGV4ZWN1dGVkIGJpbmFyeSB3aGVuZXZlciBpdCBpcyByZWNvbXBpbGVkLiAoIzY5NjYsIEBn cmlkYnVncykNCjwvbGk+PGxpPkFkZCBhIDxjb2RlPmR1bmUgY2FjaGUgc2l6ZTwvY29kZT4gY29t bWFuZCBmb3IgZGlzcGxheWluZyB0aGUgc2l6ZSBvZiB0aGUgY2FjaGUgKCM2NjM4LCBAQWxpenRl cikNCjwvbGk+PGxpPkFsbG93IDxjb2RlPiQgZHVuZSBvY2FtbCBkdW1wLWRvdC1tZXJsaW48L2Nv ZGU+IHRvIHJ1biBpbiB3YXRjaCBtb2RlLiBBbHNvIHRoaXMgY29tbWFuZCBzaG91bGRu4oCZdCBw cmludCDigJxFbnRlcmluZyBEaXJlY3RvcnnigJ0gbWVzYWdlcy4gKCM2NDk3LCBAcmdyaW5iZXJn KQ0KPC9saT48bGk+QWRkIG5hdGl2ZSBzdXBwb3J0IGZvciBwb2xsaW5nIG1vZGUgb24gV2luZG93 cyAoIzcwMTAsIEB5YW1zLXlhbXMsIEBub2piLCByZXZpZXcgYnkgQFJ1Y2lraXIgYW5kIEBqYmVj a2ZvcmQpDQo8L2xpPjxsaT5BdXRvLWRldGVjdCA8Y29kZT5kdW5lLXdvcmtzcGFjZTwvY29kZT4g ZmlsZXMgYXMgPGNvZGU+ZHVuZTwvY29kZT4gZmlsZXMgaW4gRW1hY3MgKCM3MDYxLCBAaWxhbmty aSkNCjwvbGk+PGxpPkFsbG93IDxjb2RlPiQgZHVuZSB1dG9wPC9jb2RlPiB0byBsb2FkIGxpYnJh cmllcyBkZWZpbmVkIGluIGRhdGEgb25seSBkaXJlY3RvcmllcyBkZWZpbmVkIHVzaW5nDQo8Y29k ZT4oc3ViZGlyIC4uKTwvY29kZT4gKCM2NjMxLCBAcmdyaW5iZXJnKSA8L2xpPjwvdWw+DQo8L2Rp dj4NCjwvbGk+PGxpPjxhIGlkPSJvcmc1ZmNiZWQwIj48L2E+Q2hhbmdlZDxicj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC01IiBpZD0idGV4dC1vcmc1ZmNiZWQwIj4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT5NYWtlIDxjb2RlPmR1bmUgZGVzY3JpYmUgd29ya3NwYWNlPC9jb2RlPiByZXR1 cm4gY29uc2lzdGVudCBkZXBlbmRlbmNpZXMgZm9yIGV4ZWN1dGFibGVzIGFuZCBmb3IgbGlicmFy aWVzLiBCeSBkZWZhdWx0LCBjb21waWxlLXRpbWUgZGVwZW5kZW5jaWVzIHRvd2FyZHMgUFBYLXJl d3JpdGVycyBhcmUgZnJvbSBub3cgbm90IHRha2VuIGludG8gYWNjb3VudCAoYnV0IHJ1bnRpbWUg ZGVwZW5kZW5jaWVzIGFsd2F5cyBhcmUpLiBDb21waWxlLXRpbWUNCiBkZXBlbmRlbmNpZXMgdG93 YXJkcyBQUFgtcmV3cml0ZXJzIGNhbiBiZSB0YWtlbiBpbnRvIGFjY291bnQgYnkgcHJvdmlkaW5n IHRoZSA8Y29kZT4NCi0td2l0aC1wcHM8L2NvZGU+IGZsYWcuICgjNjcyNywgZml4ZXMgIzY0ODYs IEBlc29wZSkgPC9saT48bGk+VXNlIGNvbG9yZWQgb3V0cHV0IHdpdGggTURYIHdoZW4gRHVuZSBj b2xvcnMgYXJlIGVuYWJsZWQuICgjNjQ2MiwgQE1pc3RlckRBKSA8L2xpPjxsaT5Vc2UgY29sb3Jl ZCBvdXRwdXQgd2l0aCBHQ0MgYW5kIENsYW5nIHdoZW4gY29tcGlsaW5nIEMgc3R1YnMuIFRoZSBm bGFnIDxjb2RlPg0KLWZkaWFnbm9zdGljcy1jb2xvcj1hbHdheXM8L2NvZGU+IGlzIGFkZGVkIHRv IHRoZSA8Y29kZT46c3RhbmRhcmQ8L2NvZGU+IHNldCBvZiBmbGFncy4gKCM0MDgzLCBATWlzdGVy REEpDQo8L2xpPjxsaT5Nb3ZlIDxjb2RlPiQgZHVuZSBvY2FtbC1tZXJsaW4gLWR1bXAtY29uZmln PSRkaXI8L2NvZGU+IHRvIDxjb2RlPiQgZHVuZSBvY2FtbCBtZXJsaW4gZHVtcC1jb25maWcgJGRp cjwvY29kZT4uICgjNjU0NywgQHJncmluYmVyZykNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48 bGk+PGEgaWQ9Im9yZzU2OTlhMmEiPjwvYT5GaXhlZDxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmc1Njk5YTJhIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5G aXggcGFyc2luZyBvZiBPQ2FtbCBlcnJvcnMgdGhhdCBjb250YWluIGNvZGUgZXhjZXJwdHMgd2l0 aCA8Y29kZT4uLi48L2NvZGU+IGluIHRoZW0uICgjNzAwOCwgQHJncmluYmVyZykNCjwvbGk+PGxp PkZpeCA8Y29kZT4tLXRyYWNlLWZpbGU8L2NvZGU+IG91dHB1dC4gRHVuZSBub3cgZW1pdHMgYSBz aW5nbGUgPGI+Y29tcGxldGU8L2I+IGV2ZW50IGZvciBldmVyeSBleGVjdXRlZCBwcm9jZXNzLiBV bnRlcm1pbmF0ZWQNCjxiPmFzeW5jPC9iPiBldmVudHMgYXJlIG5vIGxvbmdlciB3cml0dGVuLiAo IzY4OTIsIEByZ3JpbmJlcmcpIDwvbGk+PGxpPlByaW50IG1pc3NpbmcgbmV3bGluZSBhZnRlciA8 Y29kZT4kIGR1bmUgZXhlYzwvY29kZT4uICgjNjgyMSwgZml4ZXMgIzY3MDAsIEByZ3JpbmJlcmcs IEBBbGl6dGVyKQ0KPC9saT48bGk+Rml4IGJpbmFyeSBjb3JydXB0aW9uIHdoZW4gaW5zdGFsbGlu ZyBvciBwcm9tb3RpbmcgaW4gcGFyYWxsZWwgKCM2NjY5LCBmaXhlcyAjNjY2OCwgQGVkd2ludG9y b2spDQo8L2xpPjxsaT5SZXBvcnQgYW4gZXJyb3IgaWYgPGNvZGU+ZHVuZSBpbml0IC4uLjwvY29k ZT4gd291bGQgY3JlYXRlIGEg4oCcZHVuZeKAnSBmaWxlIGluIGEgbG9jYXRpb24gd2hpY2ggYWxy ZWFkeSBjb250YWlucyBhIOKAnGR1bmXigJ0gZGlyZWN0b3J5ICgjNjcwNSwgQGdyaWRidWdzKQ0K PC9saT48bGk+Rml4IHRoZSBwYXJzaW5nIG9mIGFsZXJ0cy4gVGhleSB3aWxsIG5vdyBzaG93IHVw IGluIGRpYWdub3N0aWNzIGNvcnJlY3RseS4gKCM2Njc4LCBAcmdpbmJlcmcpDQo8L2xpPjxsaT5Q cmludCDigJxMZWF2aW5nIERpcmVjdG9yeeKAnSB3aGVuZXZlciDigJxFbnRlcmluZyBEaXJlY3Rv cnnigJ0gaXMgcHJpbnRlZC4gKCM2NDE5LCBmaXhlcyAjMTM4LCBAY3BpdGNsYXVkZWwsIEByZ3Jp bmJlcmcpDQo8L2xpPjxsaT5SZW1vdmUg4oCcRW50ZXJpbmcgRGlyZWN0b3J54oCdIG1lc3NhZ2Vz IGZvciA8Y29kZT4kIGR1bmUgaW5zdGFsbDwvY29kZT4uICgjNjUxMywgQHJncmluYmVyZykNCjwv bGk+PGxpPjxjb2RlPmR1bmUgY2xlYW48L2NvZGU+IHNob3VsZCBubyBsb25nZXIgZmFpbCB1bmRl ciBXaW5kb3dzIGR1ZSB0byB0aGUgaW5hYmlsaXR5IHRvIHJlbW92ZSB0aGUNCjxjb2RlPi5sb2Nr PC9jb2RlPiBmaWxlLiBBbHNvLCBicmluZyB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGdsb2Jh bCBsb2NrIHVuZGVyIFdpbmRvd3MgY2xvc2VyIHRvIHRoYXQgb2YgVW5peC4gKCM2NTIzLCBAbm9q YikNCjwvbGk+PGxpPkZpeCBtaXNzaW5nIGRlcGVuZGVuY2llcyB3aGVuIGRldGVjdGluZyB0aGUg a2luZCBvZiBDIGNvbXBpbGVyIHdl4oCZcmUgdXNpbmcgKCM2NjEwLCBmaXhlcyAjNjQxNSwgQGVt aWxsb24pDQo8L2xpPjxsaT5SZW1vdmUgc3B1cmlvdXMgYnVpbGQgZGlyIGNyZWF0ZWQgd2hlbiBy dW5uaW5nIDxjb2RlPmR1bmUgaW5pdCBwcm9qIC4uLjwvY29kZT4gKCM2NzA3LCBmaXhlcyAjNTQy OSwgQGdyaWRidWdzKQ0KPC9saT48bGk+VmFsaWRhdGUgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVu dHMgZm9yIDxjb2RlPiQgZHVuZSBvY2FtbCB0b3AtbW9kdWxlPC9jb2RlPi4gVGhpcyBjb21tYW5k IHJlcXVpcmVzIG9uZSBwb3NpdGlvbmFsIGFyZ3VtZW50ICgjNjc5NiwgZml4ZXMgIzY3OTMsIEBy Z3JpbmJlcmcpDQo8L2xpPjxsaT5GaXggZGVwZW5kZW5jeSBjeWNsZSB3aGVuIGluc3RhbGxpbmcg ZmlsZXMgdG8gdGhlIGJpbiBzZWN0aW9uIHdpdGggPGNvZGU+Z2xvYl9maWxlczwvY29kZT4gKCM2 NzY0LCBmaXhlcyAjNjcwOCwgQGdyaWRidWdzKQ0KPC9saT48bGk+SGFuZGxlIOKAnFRvbyBtYW55 IGxpbmtz4oCdIGVycm9ycyB3aGVuIHVzaW5nIER1bmUgY2FjaGUgb24gV2luZG93cyAoIzY5OTMs IEBub2piKQ0KPC9saT48bGk+UHJlLWVtcHRpdmVseSBjbGVhciBzY3JlZW4gaW4gd2F0Y2ggbW9k ZSAoIzY5ODcsIGZpeGVzICM2ODg0LCBAcmdyaW5iZXJnKSA8L2xpPjxsaT5BbGxvdyA8Y29kZT4t LXNhbmRib3g8L2NvZGU+IHRvIGFmZmVjdCA8Y29kZT5vY2FtbGRlcDwvY29kZT4gaW52b2NhdGlv bnMuIFByZXZpb3VzbHksIHRoZXkgd2VyZSB3cm9uZ2x5IG1hcmtlZCBhcyBpbmNvbXBhdGlibGUg KCM2NzQ5LCBAcmdyaW5iZXJnKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjwvdWw+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM0ODQxYTEiIGNsYXNzPSJvdXRsaW5l LTQiPg0KPGg0IGlkPSJvcmczNDg0MWExIj5kdW5lIGxhbmd1YWdlPC9oND4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczNDg0MWExIj48L2Rpdj4NCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnYjdhNzVjMiI+PC9hPkFkZGVkPGJyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZ2I3YTc1YzIiPg0KPHVsIGNsYXNzPSJvcmct dWwiPg0KPGxpPkFsbG93IDxjb2RlPihpbmNsdWRlX3N1YmRpcnMgcXVhbGlmaWVkKTwvY29kZT4g Zm9yIE9DYW1sIHByb2plY3RzLiAoIzY1OTQsIGZpeGVzICMxMDg0LCBAcmdyaW5iZXJnKQ0KPC9s aT48bGk+Rm9ybWF0IGR1bmUgZmlsZXMgd2hlbiB0aGV5IGFyZSBuYW1lZCA8Y29kZT5kdW5lLWZp bGU8L2NvZGU+LiBUaGlzIG9jY3VycyB3aGVuIHdlIGVuYWJsZSB0aGUgYWx0ZXJuYXRpdmUgZmls ZSBuYW1lcyBwcm9qZWN0IG9wdGlvbi4gKCM2NTY2LCBAcmdyaW5iZXJnKQ0KPC9saT48bGk+QWRk IDxjb2RlPm1hcF93b3Jrc3BhY2Vfcm9vdDwvY29kZT4gZHVuZS1wcm9qZWN0IHN0YW56YSB0byBh bGxvdyBkaXNhYmxpbmcgb2YgbWFwcGluZyBvZiB3b3Jrc3BhY2Ugcm9vdCB0bw0KPGNvZGU+L3dv cmtzcGFjZV9yb290PC9jb2RlPi4gKCM2OTg4LCBmaXhlcyAjNjkyOSwgQHJpY2hhcmRsZm9yZCkg PC9saT48bGk+QWxsb3cgdGhlIDxjb2RlPmNpbmFwczwvY29kZT4gc3RhbnphIHRvIHNldCBhIGN1 c3RvbSBhbGlhcy4gQnkgZGVmYXVsdCwgaWYgdGhlIGFsaWFzIGlzIG5vdCBzZXQgdGhlbiB0aGUg Y2luYXBzIGFjdGlvbnMgd2lsbCBiZSBhdHRhY2hlZCB0byBib3RoDQo8Y29kZT5AY2luYXBzPC9j b2RlPiBhbmQgPGNvZGU+QHJ1bnRlc3Q8L2NvZGU+ICgjNjk5MSwgQHJncmluYmVyZykgPC9saT48 bGk+QWRkIDxjb2RlPih1c2luZyBjdHlwZXMgMC4zKTwvY29kZT4uIFdoZW4gdXNlZCwgcGF0aHMg aW4gPGNvZGU+KGN0eXBlcyk8L2NvZGU+IGFyZSBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB3aGVy ZSB0aGUgc3RhbnphIGlzIGRlZmluZWQuICgjNjg4MywgZml4ZXMgIzUzMjUsIEBlbWlsbG9uKQ0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3JnNzE5OWM1YiI+PC9hPkNoYW5n ZWQ8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnNzE5OWM1YiI+ DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+U3RvcCBwYXNzaW5nIDxjb2RlPi1xPC9jb2RlPiBm bGFnIGluIDxjb2RlPmR1bmUgY29xIHRvcDwvY29kZT4sIHdoaWNoIGFsbG93cyBmb3INCjxjb2Rl Pi5jb3FyYzwvY29kZT4gdG8gYmUgbG9hZGVkLiAoIzY4NDgsIGZpeGVzICM2ODQ3LCBAQWxpenRl cikgPC9saT48bGk+Q29xIG5hdGl2ZSBtb2RlIGlzIG5vdyBhdXRvbWF0aWNhbGx5IGRldGVjdGVk IGJ5IER1bmUgc3RhcnRpbmcgd2l0aCBDb3EgbGFuZyAwLjcuDQo8Y29kZT4obW9kZSBuYXRpdmUp PC9jb2RlPiBoYXMgYmVlbiBkZXByZWNhdGVkIGluIGZhdm91ciBvZiBkZXRlY3Rpb24gZnJvbSB0 aGUgY29uZmlndXJhdGlvbiBvZiBDb3EuICgjNjQwOSwgQEFsaXp0ZXIpDQo8L2xpPjxsaT5BY2N1 cmF0ZWx5IGRldGVybWluZSBtZXJsaW4gY29uZmlndXJhdGlvbiBmb3IgYWxsIHNvdXJjZXMgc2Vs ZWN0ZWQgd2l0aCA8Y29kZT4NCmNvcHkjPC9jb2RlPiBhbmQgPGNvZGU+Y29weV9maWxlcyM8L2Nv ZGU+LiBUaGUgb2xkIGhldXJpc3RpYyBvZiBsb29raW5nIGZvciBhIG1vZHVsZSBpbiBwYXJlbnQg ZGlyZWN0b3JpZXMgaXMgcmVtb3ZlZCAoIzY1OTQsIEByZ3JpbmJlcmcpDQo8L2xpPjwvdWw+DQo8 L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmcxMjUxZjVhIj48L2E+Rml4ZWQ8YnI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMTI1MWY1YSI+DQo8dWwgY2xhc3M9Im9y Zy11bCI+DQo8bGk+Rml4IHBhcnNpbmcgb2YgdGhlIDxjb2RlPiZsdDs9PC9jb2RlPiBvcGVyYXRv ciBpbiA8Yj5ibGFuZzwvYj4gZXhwcmVzc2lvbnMgb2YgPGNvZGU+DQpkdW5lPC9jb2RlPiBmaWxl cy4gUHJldmlvdXNseSwgdGhlIG9wZXJhdG9yIHdvdWxkIGJlIGludGVycHJldGVkIGFzIDxjb2Rl PiZsdDs8L2NvZGU+LiAoIzY5MjgsIEB0YXRjaGkpDQo8L2xpPjxsaT5GaXggcHJlcHJvY2Vzc2lu ZyB3aXRoIDxjb2RlPnN0YWdlZF9wcHM8L2NvZGU+ICgjNjc0OCwgZml4ZXMgIzY2NDQsIEByZ3Jp bmJlcmcpDQo8L2xpPjxsaT5GaXggdGhlIHBhcnNpbmcgb2YgZGVjaW1hbCBhbmQgaGV4YWRlY2lt YWwgZXNjYXBlIGxpdGVyYWxzIGluIDxjb2RlPmR1bmU8L2NvZGU+LA0KPGNvZGU+ZHVuZS1wYWNr YWdlPC9jb2RlPiwgYW5kIG90aGVyIGR1bmUgcy1leHByZXNzaW9uIGJhc2VkIGZpbGVzICgjNjcx MCwgQHNoeW0pDQo8L2xpPjxsaT5GaXggY3Jvc3MgY29tcGlsYXRpb24gY29uZmlndXJhdGlvbiB3 aGVuIGEgY29udGV4dCB3aXRoIHRhcmdldHMgaXMgaXRzZWxmIGEgaG9zdCBvZiBhbm90aGVyIGNv bnRleHQgKCM2OTU4LCBmaXhlcyAjNjg0MywgQHJncmluYmVyZykNCjwvbGk+PGxpPkFsbG93IGNv bXBpbGF0aW9uIHJ1bGVzIHRvIGJlIGltcGFjdGVkIGJ5IDxjb2RlPihlbnYgLi4pPC9jb2RlPiBz dGFuemFzIHRoYXQgbW9kaWZ5IHRoZSBlbnZpcm9ubWVudCBvciBzZXQgYmluYXJpZXMuICgjNjUy NywgQHJncmluYmVyZykNCjwvbGk+PGxpPkZpeCBoYW5kbGluZyBvZiBzdXBwb3J0IGZpbGVzIGdl bmVyYXRlZCBieSBvZG9jLiAoIzY5MTMsIEBqb25sdWRsYW0pIDwvbGk+PGxpPkZpeCB0aGUgY29t cGlsYXRpb24gb2YgbW9kdWxlcyBnZW5lcmF0ZWQgYXQgbGluayB0aW1lIHdoZW4gPGNvZGU+aW1w bGljaXRfdHJhbnNpdGl2ZV9kZXBzPC9jb2RlPiBpcyBlbmFibGVkICgjNjY0MiwgQHJncmluYmVy ZykNCjwvbGk+PGxpPkZpeCBpbmxpbmUgdGVzdHMgd2l0aCA8Yj5qc19vZl9vY2FtbDwvYj4gYW5k IHdob2xlIHByb2dyYW0gY29tcGlsYXRpb24gbW9kZSBlbmFibGVkICgjNjY0NSwgQGhodWdvKQ0K PC9saT48bGk+Rml4IDxiPmpzX29mX29jYW1sPC9iPiBzZXBhcmF0ZSBjb21waWxhdGlvbiBydWxl cyB3aGVuIDxjb2RlPi0tZW5hYmxlPWVmZmVjdHM8L2NvZGU+ICx+4oCTZW5hYmxlPXVzZS1qcy1z dHJpbmd+IG9yDQo8Y29kZT4tLXRvcGxldmVsPC9jb2RlPiBpcyB1c2VkLiAoIzY3MTQsICM2ODI4 LCAjNjkyMCwgQGhodWdvKSA8L2xpPjxsaT5GaXggPGI+anNfb2Zfb2NhbWw8L2I+IHNlcGFyYXRl IGNvbXBpbGF0aW9uIGluIHByZXNlbmNlIG9mIGxpbmthbGwgKCM2ODMyLCAjNjkxNiwgQGhodWdv KQ0KPC9saT48bGk+PGNvZGU+Y29xZGVwPC9jb2RlPiBpcyBub3cgY2FsbGVkIG9uY2UgcGVyIHRo ZW9yeSwgaW5zdGVhZCBvZiBvbmUgdGltZSBwZXIgQ29xIGZpbGUuIFRoaXMgc2hvdWxkIHNpZ25p ZmljYW50bHkgc3BlZWQgdXAgc29tZSBidWlsZHMsIGFzDQo8Y29kZT5jb3FkZXA8L2NvZGU+IHN0 YXJ0dXAgdGltZSBpcyBvZnRlbiBoZWF2eSAoIzcwNDgsIEBBbGl6dGVyLCBAZWpnYWxsZWdvKSA8 L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2ZhOTQxOWMiIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSJvcmdmYTk0MTljIj5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0yIiBpZD0idGV4dC1vcmdmYTk0MTljIj4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENX TiwgeW91IGNhbiA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Ij4NCnNlbmQgbWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBn byB0YWtlIGEgbG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3 bi8iPg0KdGhlIGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9w Pg0KPHA+SWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwg eW91IG1heSBzdWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5m by9jYW1sLW5ld3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRo b3JuYW1lIiBpZD0ib3JnOTYwMmJjYSI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 14 Feb 2023 08:14:01 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 14 Feb 2023 08:14:01 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 14 Feb 2023 08:14:01 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31E8DG3B016562 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 14 Feb 2023 08:13:16 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 31E8D6Fa016541 for ; Tue, 14 Feb 2023 08:13:06 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Feb 2023 09:13:04 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 94B52E0216; Tue, 14 Feb 2023 09:13:03 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id EBC6EE0128 for ; Tue, 14 Feb 2023 09:12:57 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Feb 2023 09:12:57 +0100 Received: from eduroam-085c.sophia.inria.fr (eduroam-085c.sophia.inria.fr [138.96.49.85]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8227D560692; Tue, 14 Feb 2023 09:12:54 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZQExL1w3vCo7sbEKxhM+dBul4Sg== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 14 Feb 2023 08:12:47 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 269c517a-17b4-4870-2c08-08db0e636e0c X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,296,1669071600"; d="scan'208,217";a="47658129" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499808, queueID=17C73560696 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMi0xNCBUdWUgMDk6MTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDIuMDcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMi4yMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEZlYnJ1YXJ5IDA3IHRvIDE0LCAyMDIzLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5Db3VsZCBtZXJsaW4gYmUgY29t cGlsZWQgd2l0aCBqc19vZl9vY2FtbCBhbmQgd29yayBpbiB0aGUgYnJvd3NlcjwvYT4NCjwvbGk+ PGxpPjxhIGhyZWY9IiMyIj5PcGluZSAwLjEuMCAtIFB5dGhvbiBzb3VyY2UgY29kZSB0cmFuc2Zv cm1hdGlvbnMgaW4gT0NhbWw8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiMzIj5QYXVsIEJpZ2dhciBv biBEYXJrbGFuZzwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzQiPlNlcHBvLlNvY2lhbCB2MC4xIGFu ZCBSZXF1ZXN0IGZvciBDb21tZW50czwvYT4gPC9saT48bGk+PGEgaHJlZj0iIzUiPkxpc3QgeW91 ciBvcGVuIE9DYW1sIHBvc2l0aW9ucyBvbiB0aGUgT0NhbWwub3JnIGpvYiBib2FyZDwvYT4gPC9s aT48bGk+PGEgaHJlZj0iIzYiPkF2YWlsYWJsZSBmb3IgSGlyZSAtIFExIDIwMjM8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM3Ij5UaW1lZGVzYyAxLjAuMCAtIG1vZGVybiBkYXRlIHRpbWUgaGFuZGxp bmc8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM4Ij5NYWpvciB1cGRhdGVzIHRvIGtjYXMgaW4gMC4x LjggYW5kIDAuMi4wPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjb3JnOTQ3YzgwNyI+T2xkIENXTjwv YT4gPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LTEiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIxIj5Db3VsZCBtZXJsaW4gYmUgY29tcGls ZWQgd2l0aCBqc19vZl9vY2FtbCBhbmQgd29yayBpbiB0aGUgYnJvd3NlcjwvaDI+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvY291bGQtbWVybGluLWJlLWNvbXBpbGVkLXdpdGgt anMtb2Ytb2NhbWwtYW5kLXdvcmstaW4tdGhlLWJyb3dzZXIvMTEzNjQvMSI+DQpodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvY291bGQtbWVybGluLWJlLWNvbXBpbGVkLXdpdGgtanMtb2Ytb2Nh bWwtYW5kLXdvcmstaW4tdGhlLWJyb3dzZXIvMTEzNjQvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMGY5NjExYyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZzBmOTYxMWMiPkhhb2NoZW4gS290b2ktWGllIGFza2VkPC9oMz4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcwZjk2MTFjIj4NCjxwPkFzIHRoZSB0aXRs ZSBhc2tzOiBjb3VsZCBtZXJsaW4gYmUgY29tcGlsZWQgd2l0aCBqc19vZl9vY2FtbCBhbmQgd29y ayBpbiB0aGUgYnJvd3Nlcj8gSGFzIGFueW9uZSBhdHRlbXB0ZWQgaXQ/DQo8L3A+DQo8cD5CYWNr Z3JvdW5kOiB3ZeKAmWQgbGlrZSB0byBtYWtlIGEgcmVhbCB3ZWIgb25seSBlZGl0b3IgZm9yIHNp bXBsZSBvY2FtbCBwcm9qZWN0cy4gVGhlIGZlYXR1cmVzIHdlIGFyZSBsb29raW5nIHRvIHByb3Zp ZGUgd2l0aCBtZXJsaW4gaXMgYWN1cmF0ZSB0eXBlIGF3YXJlIGNvbXBsZXRpb24gYW5kIGRpc3Bs YXkgb2YgbW9kdWxlIHNpZ25hdHVyZXMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnOTMxYjJhNiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9 Im9yZzkzMWIyYTYiPlBhdHJpY2sgRmVycmlzIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzkzMWIyYTYiPg0KPHA+WWVzISBTZWUgdGhlIGdyZWF0 IHdvcmsgaGVyZTogPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL3Zvb2Rvb3MvbWVybGluLWpz Ij5odHRwczovL2dpdGh1Yi5jb20vdm9vZG9vcy9tZXJsaW4tanM8L2E+IHdpdGggYW4gZXhhbXBs ZQ0KPGEgaHJlZj0iaHR0cHM6Ly92b29kb29zLmdpdGh1Yi5pby9tZXJsaW4tanMvIj5odHRwczov L3Zvb2Rvb3MuZ2l0aHViLmlvL21lcmxpbi1qcy88L2E+LiBJ4oCZdmUgdXNlZCBpdCB3aXRoDQo8 YSBocmVmPSJodHRwczovL3BhdHJpY29mZXJyaXMuZ2l0aHViLmlvL3RyeS1laW8vIj5odHRwczov L3BhdHJpY29mZXJyaXMuZ2l0aHViLmlvL3RyeS1laW8vPC9hPiB0b28uDQo8L3A+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMWRlNmNmMiIgY2xhc3M9Im91 dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzFkZTZjZjIiPlBhdHJpY2sgRmVycmlzIHRoZW4gc2FpZDwv aDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMWRlNmNmMiI+DQo8 cD5UaGFuayB5b3UsIGdsYWQgeW91IGxpa2UgaXQhIFdl4oCZdmUgZW5kZWQgdXAgd2hlcmUgd2Ug YXJlIHRoYW5rcyB0byB2YXJpb3VzIGJpdHMgb2YgaGFja2luZyBmcm9tIEB0bWF0dGlvLCBAam9u bHVkbGFtLCBAdm9vZG9vcyAoYW5kIEnigJltIHN1cmUgb3RoZXJzISkgYW5kIG9mIGNvdXJzZSB0 aGUganNvbyBjb250cmlidXRvcnMuIFRoaXMgaXMgaG93IHRoZSBPQ2FtbC5vcmcgcGxheWdyb3Vu ZCB3b3JrcyAoYWx0aG91Z2ggSSB0aGluayBpdCBsb3N0DQogbWVybGluLmpzIGluIHRoZSBzd2l0 Y2ggdG8gT0NhbWwgNSkuIDwvcD4NCjxwPkFub3RoZXIgbmljZSBmZWF0dXJlICh0aGFua3MgdG8g QGpvbmx1ZGxhbSEpIHRoYXQgbWlnaHQgbm90IGJlIGltbWVkaWF0ZWx5IGFwcGFyZW50IGlzIHRo YXQgYWxsIG9mIHRoZSBPQ2FtbCBldmFsdWF0aW9uIGlzIGhhcHBlbmluZyBpbiBhIGJyb3dzZXIN CjxiPndvcmtlcjwvYj4gbWVhbmluZyBpdCBuZXZlciBibG9ja3MgdGhlIFVJICh0aGUgYWR2ZW50 dXJvdXMgY2FuIHRyeSA8Y29kZT53aGlsZSB0cnVlIGRvICgpIGRvbmU8L2NvZGU+IF5eKSwgd2hp Y2ggaGFzIG5pY2Ugc3RvcnkgaWYgd2UgY29tcGlsZWQgbm90ZWJvb2sgc3R5bGUgZXhlcmNpc2Vz IHRvIHRoZSBicm93c2VyIG9yIHNvbWV0aGluZyBsaWtlIHRoYXQuDQo8L3A+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZWQxMDhiZiIgY2xhc3M9Im91dGxp bmUtMyI+DQo8aDMgaWQ9Im9yZ2VkMTA4YmYiPkxhdGVyIG9uLCBMb3VpcyBHZXNiZXJ0IHNhaWQ8 L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2VkMTA4YmYiPg0K PHA+Tm90IGV4YWN0bHkgd2hhdCB5b3UgYXJlIGFza2luZyBmb3IsIGJ1dCA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtc2YvbGVhcm4tb2NhbWwvIj4NCmxlYXJuLW9jYW1sPC9hPiBk b2VzIDxzcGFuIGNsYXNzPSJ1bmRlcmxpbmUiPnRoYXQga2luZDwvc3Bhbj4gb2Ygc3R1ZmYsIHRh a2luZyB1c2VyLXN1cHBsaWVkIG1sIGNvZGUsIGFwcGx5aW5nIHNvbWUgY3VzdG9tIHZhbGlkYXRp b25zIHRvIGl0cyBBU1QsIHRoZW4gY29tcGlsaW5nIGFuZCBydW5uaW5nIGl0IGFnYWluc3QgYSBw cmUtZGVmaW5lZCBzb2x1dGlvbi4gVGhpcyBhbmQgaXRzIHNpYmxpbmcNCjxhIGhyZWY9Imh0dHBz Oi8vdHJ5Lm9jYW1sLnBybyI+dHJ5LW9jYW1sPC9hPiBoYXZlIGhhZCBldmFsdWF0aW9uIGluIGEg d29ya2VyIGZvciBhIGxvbmcgdGltZSB0b28g4oCUIHlvdSBjYW7igJl0IHJlYWxseSBhc2sgc3R1 ZGVudHMgdG8gcmVsb2FkIHRoZSBwYWdlIGFmdGVyIGFuIGFjY2lkZW50YWwgaW5maW5pdGUgcmVj dXJzaW9uLg0KPC9wPg0KPHA+VGhleSBsYWNrIHRoZSBtZXJsaW4gaW50ZWdyYXRpb24gdGhvdWdo IDpzbGlnaHRfc21pbGU6IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5PcGluZSAw LjEuMCAtIFB5dGhvbiBzb3VyY2UgY29kZSB0cmFuc2Zvcm1hdGlvbnMgaW4gT0NhbWw8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGluZS0wLTEtMC1weXRob24t c291cmNlLWNvZGUtdHJhbnNmb3JtYXRpb25zLWluLW9jYW1sLzExMzY1LzEiPg0KaHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGluZS0wLTEtMC1weXRob24tc291cmNlLWNvZGUtdHJh bnNmb3JtYXRpb25zLWluLW9jYW1sLzExMzY1LzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9 Im91dGxpbmUtY29udGFpbmVyLW9yZ2RlYTY3MjIiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlk PSJvcmdkZWE2NzIyIj5BcnVsIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMyIgaWQ9InRleHQtb3JnZGVhNjcyMiI+DQo8cD48YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vZ3JpZXZlamlhL3B5cmUtYXN0Ij5weXJlLWFzdDwvYT4gaXMgYW4gT0NhbWwgbGlicmFyeSB0 aGF0IHByb3ZpZGVzIHB5dGhvbiBBU1QgcmVwcmVzZW50YXRpb24gaW4gT0NhbWwuDQo8L3A+DQo8 cD5JIGhhZCBhIG5lZWQgdG8gZG8gcHl0aG9uIHNvdXJjZSBjb2RlIHRyYW5zZm9ybWF0aW9ucyBp biBPQ2FtbC4gU28sIEkgbWFkZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vQXJ1bHNlbHZh bk1hZGhhdmFuL29waW5lIj4NCk9waW5lPC9hPiB0byBkbyB0cmFuc2Zvcm1hdGlvbnMgb24gdGhl IEFTVCBhbmQgY29udmVydCBpdCBiYWNrIHRvIHB5dGhvbi4gU28sIGluIE9DYW1sLCB5b3UgY2Fu IHdyaXRlIHB5dGhvbiBjb2RlIG5vdywgaWYgeW91IGV2ZXIgbmVlZCB0by4NCjwvcD4NCjxwPlAu Uy4gSXQgc3RpbGwgZG9lc27igJl0IHN1cHBvcnQgdGhlIGVudGlyZSBweXRob24gc3ludGF4IDEw MCUuIEkgaGF2ZW7igJl0IGFkZGVkIHN1cHBvcnQgZm9yIHRoaW5ncyBsaWtlIGZvci1jb21wcmVo ZW5zaW9uIGJ1dCBpdCBzaG91bGQgYmUgZmFpcmx5IGVhc3kgdG8gYWRkIGl0LiBJIHBsYW4gdG8g YWRkIHN1cHBvcnQgZm9yIHRoZSBtaXNzaW5nIG9uZXMgYXMgSSBuZWVkIGl0IGZvciBteSBwcm9q ZWN0cy4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTMiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIzIj5QYXVsIEJpZ2dhciBvbiBE YXJrbGFuZzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMyI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcGF1bC1iaWdn YXItb24tZGFya2xhbmcvMTEzNzAvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcGF1 bC1iaWdnYXItb24tZGFya2xhbmcvMTEzNzAvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmczOWNhNWE1IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnMzljYTVhNSI+Q2xhdWRlIEphZ2VyLVJ1Ymluc29uIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMzljYTVhNSI+DQo8cD5Zb3UgbWF5IHJl bWVtYmVyIFBhdWwgQmlnZ2Fy4oCZcyBzZXJpZXMgb2YgYmxvZyBwb3N0cyBvbiB0aGUgcHJvY2Vz cyBhbmQgZGVjaXNpb24gdG8gcmV3cml0ZSBoaXMgRGFyayBwcm9ncmFtbWluZyBsYW5ndWFnZSBp biBGIywgd2hpY2ggd2FzIG9yaWdpbmFsbHkgd3JpdHRlbiBpbiBPQ2FtbDoNCjwvcD4NCjx1bCBj bGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2Jsb2cuZGFya2xhbmcuY29tL2xl YXZpbmctb2NhbWwvIj5odHRwczovL2Jsb2cuZGFya2xhbmcuY29tL2xlYXZpbmctb2NhbWwvPC9h Pg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmRhcmtsYW5nLmNvbS93aHktZGFyay1k aWRudC1jaG9vc2UtcnVzdC8iPmh0dHBzOi8vYmxvZy5kYXJrbGFuZy5jb20vd2h5LWRhcmstZGlk bnQtY2hvb3NlLXJ1c3QvPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9ibG9nLmRhcmts YW5nLmNvbS9uZXctYmFja2VuZC1mc2hhcnAvIj5odHRwczovL2Jsb2cuZGFya2xhbmcuY29tL25l dy1iYWNrZW5kLWZzaGFycC88L2E+DQo8L2xpPjwvdWw+DQo8cD5QYXVsIHdpbGwgYmUgc3BlYWtp bmcgYWJvdXQgRGFyayBhdCBuZXh0IHdlZWvigJlzIG1lZXRpbmcgb2YgdGhlIEhvdXN0b24gRnVu Y3Rpb25hbCBQcm9ncmFtbWluZyBVc2Vyc+KAmSBHcm91cC4gQWx0aG91Z2ggaGXigJlzIG5vdCBw bGFubmluZyB0byBzcGVjaWZpY2FsbHkgZm9jdXMgb24gdGhlIE9DYW1sIC0mZ3Q7IEYjIHJld3Jp dGU7IEnigJltIGNlcnRhaW5seSBwbGFubmluZyB0byBhc2sgaGltIGFib3V0IHRoZSBleHBlcmll bmNlLCBjb3N0cyBhbmQgYmVuZWZpdHMsDQogZXRjLiA6d2luazogSWYgeW914oCZcmUgaW4gdGhl IEhvdXN0b24gYXJlYSwgcGxlYXNlIGpvaW4gdXMgaW4gcGVyc29uIGF0IEltcHJvdmluZy4gRXZl cnlib2R5IGVsc2UgY2FuIGpvaW4gdXMgb25saW5lLCB2aWEgWm9vbS4gQ29tcGxldGUgZGV0YWls cyBhbmQgY29ubmVjdGlvbiBpbmZvIGFyZSBhdmFpbGFibGUgb24gb3VyIHdlYnNpdGUgYXQNCjxh IGhyZWY9Imh0dHBzOi8vaGZwdWcub3JnIj5odHRwczovL2hmcHVnLm9yZzwvYT4uIDwvcD4NCjwv ZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTQiIGNsYXNz PSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5TZXBwby5Tb2NpYWwgdjAuMSBhbmQgUmVxdWVzdCBm b3IgQ29tbWVudHM8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1z ZXBwby1zb2NpYWwtdjAtMS1hbmQtcmVxdWVzdC1mb3ItY29tbWVudHMvMTEzNzUvMSI+DQpodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNlcHBvLXNvY2lhbC12MC0xLWFuZC1yZXF1ZXN0 LWZvci1jb21tZW50cy8xMTM3NS8xPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5l LWNvbnRhaW5lci1vcmc2MTFmZWRmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNjEx ZmVkZiI+8J+MjSBNYXJjdXMgUm9ocm1vc2VyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnNjExZmVkZiI+DQo8cD5JIGFtIGhhcHB5IHRvIGFu bm91bmNlIHRoZSBwcmVtaWVyZSByZWxlYXNlIG9mICNTZXBwbyEsIFBlcnNvbmFsIFNvY2lhbCBN ZWRpYSB1bmRlciBmdW5kaW5nIG9mIE5MbmV0Lm5sLg0KPC9wPg0KPHA+RmluZCBpdCBhdCA8YSBo cmVmPSJodHRwczovL3NlcHBvLnNvY2lhbC9kb3dubG9hZHMvIj5odHRwczovL3NlcHBvLnNvY2lh bC9kb3dubG9hZHMvPC9hPg0KPC9wPg0KPHA+SXQgaGFzIG5vIG5vdGFibGUgdXNlciBmYWNpbmcg QWN0aXZpdHlQdWIgZmVhdHVyZXMgc28gZmFyLCBidXQgPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwi Pg0KPGxpPmVhc3kgc2V0dXAgb2YgaW5zdGFuY2UgJmFtcDsgYWNjb3VudCwgPC9saT48bGk+d2Vi ZmluZ2VyIGRpc2NvdmVyYWJpbGl0eSAoZnJvbSBlLmcuIG1hc3RvZG9uIHNlYXJjaCksIDwvbGk+ PGxpPmEgd2VsY29taW5nLCBsb25nLXRlcm0gcmVsaWFibGUgd2Vic2l0ZS4gPC9saT48L3VsPg0K PHA+SSBtYWRlIHRoaXMgZW1iYXJyYXNzaW5nbHkgbGltaXRlZCByZWxlYXNlIHRvIGJ1aWxkIGF3 YXJlbmVzcyBmb3IgbG93LWJhcnJpZXItZW50cnkgaW50ZXJuZXQgc2VydmljZXMgaW4gZ2VuZXJh bCBhbmQgZXNwZWNpYWxseSBpbiB0aGUgZmllbGQgb2YgcGVyc29uYWwgY29tbXVuaWNhdGlvbiBh cyB3ZWxsIGFzIGxldHRpbmcgdGhlICNmZWRpdmVyc2UgYW5kIHBlcm1hY29tcHV0aW5nIGNvbW11 bml0aWVzIGtub3cuDQo8L3A+DQo8cD5Zb3VyIGNvbW1lbnRzIGFyZSB2ZXJ5IG11Y2ggYXBwcmVj aWF0ZWQuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5MaXN0IHlvdXIgb3BlbiBP Q2FtbCBwb3NpdGlvbnMgb24gdGhlIE9DYW1sLm9yZyBqb2IgYm9hcmQ8L2gyPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTUiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xpc3QteW91ci1vcGVuLW9jYW1sLXBvc2l0aW9ucy1v bi10aGUtb2NhbWwtb3JnLWpvYi1ib2FyZC8xMTM3Ny8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9saXN0LXlvdXItb3Blbi1vY2FtbC1wb3NpdGlvbnMtb24tdGhlLW9jYW1sLW9yZy1q b2ItYm9hcmQvMTEzNzcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItb3JnZTcxMGFiZiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZ2U3MTBhYmYi PlNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTMiIGlkPSJ0ZXh0LW9yZ2U3MTBhYmYiPg0KPHA+Sm9iIHBvc3RpbmdzIGZvciBPQ2FtbCBwcm9n cmFtbWVycyBhcmUgd2VsY29tZSBvbiB0aGUgb2ZmaWNpYWwgT0NhbWwgd2Vic2l0ZSBhdA0KPGEg aHJlZj0iaHR0cHM6Ly9vY2FtbC5vcmcvam9icyI+aHR0cHM6Ly9vY2FtbC5vcmcvam9iczwvYT4u IDwvcD4NCjxvbCBjbGFzcz0ib3JnLW9sIj4NCjxsaT5Qb3N0aW5ncyBtdXN0IGJlIGZvciBqb2Jz IHRoYXQgcHJpbWFyaWx5IGludm9sdmUgd29ya2luZyB3aXRoIHRoZSBPQ2FtbCBsYW5ndWFnZSBh bmQgc2hvdWxkIGxpbmsgdG8gYSBkZXRhaWxlZCBqb2IgZGVzY3JpcHRpb24uDQo8L2xpPjxsaT48 Yj5Qb3N0aW5ncyBieSBvdXRzaWRlIHJlY3J1aXRlcnMgYXJlIG5vdCBwZXJtaXR0ZWQgdW5kZXIg YW55IGNpcmN1bXN0YW5jZXMuIFlvdSBtYXkgb25seSBwb3N0IGpvYnMgYXQgeW91ciBvd24gZmly bS48L2I+DQo8L2xpPjxsaT5JdCBpcyBwZXJtaXR0ZWQgdG8gaGF2ZSBvbmUg4oCcc3BvbnRhbmVv dXMgYXBwbGljYXRpb27igJ0gbGlzdGluZyBwZXIgY29tcGFueS4gPC9saT48L29sPg0KPHA+VG8g YWRkIGEgam9iIGxpc3RpbmcsIGVkaXQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9ibG9iL21haW4vZGF0YS9qb2JzLnltbCI+DQpodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL2Jsb2IvbWFpbi9kYXRhL2pvYnMueW1sPC9hPiBhbmQgbWFrZSBhIHB1 bGwgcmVxdWVzdC4NCjwvcD4NCjxwPkFsdGVybmF0aXZlbHksIGZvciB0aGUgdGltZSBiZWluZywg eW91IGNhbiBmaWxsIGluIHRoZSB0ZW1wbGF0ZSBhbmQgcmVwbHkgdG8gdGhpcyB0aHJlYWQuIEhl cmXigJlzIGFuIGV4YW1wbGU6DQo8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNjE1 NDk2MiI+DQp0aXRsZTogU3BvbnRhbmVvdXMgQXBwbGljYXRpb24NCmxpbms6IGh0dHBzOi8vdGFy aWRlcy5jb20vam9icy9zcG9udGFuZW91cy1hcHBsaWNhdGlvbg0KbG9jYXRpb246IFJlbW90ZQ0K cHVibGljYXRpb25fZGF0ZTogMjAyMS0xMC0xNw0KY29tcGFueTogVGFyaWRlcw0KY29tcGFueV9s b2dvOiBodHRwczovL3RhcmlkZXMuY29tL3N0YXRpYy9sb2dvX3RhcmlkZXMtNTJmOTFiNTlhODY1 N2Q3NjhlMDEzMTI5ODk2YjYzZTAucG5nDQo8L3ByZT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vb2Nh bWwub3JnL2pvYnMiPmh0dHBzOi8vb2NhbWwub3JnL2pvYnM8L2E+IDwvcD4NCjxwPldlIHNoYW1l bGVzc2x5IHRvb2sgaW5zcGlyYXRpb24gZnJvbSB0aGUgam9icyBjYXRlZ29yeSBkZXNjcmlwdGlv biBhdCA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWJvdXQtdGhlLWpvYnMt Y2F0ZWdvcnkvMTEyMCI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWJvdXQtdGhlLWpv YnMtY2F0ZWdvcnkvMTEyMDwvYT4uIDopIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJv dXRsaW5lLWNvbnRhaW5lci1vcmcxNzUzYmNlIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0i b3JnMTc1M2JjZSI+U2FiaW5lIFNjaG1hbHR6IGxhdGVyIGFkZGVkPC9oMz4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmcxNzUzYmNlIj4NCjxwPkl04oCZcyBmaW5lIHRv IGFkdmVydGlzZSBwYWlkIHByb2plY3RzIGFpbWVkIGF0IGNvbnRyYWN0b3JzIG9yIGZyZWVsYW5j ZXJzIG9uIHRoZSBqb2IgYm9hcmQuIFlvdSBkb27igJl0IG5lZWQgdG8gb2ZmZXIgZnVsbC10aW1l IG9yIGV2ZW4gcGFydC10aW1lIGVtcGxveW1lbnQuIChJ4oCZbGwgbWVudGlvbiB0aGF0IGluIHRo ZSBndWlkZWxpbmVzIGFib3ZlLikNCjwvcD4NCjxwPkkgd291bGQgc3VnZ2VzdCB0byB1c2Ug4oCc Q29udHJhY3TigJ0sIOKAnFByb2plY3TigJ0sIG9yIOKAnEZyZWVsYW5jZeKAnSBpbiB0aGUgam9i IHRpdGxlLCBkZXBlbmRpbmcgb24gdGhlIGV4YWN0IG5hdHVyZSBvZiB0aGUgd29yayAtIHRvIG1h a2UgaXQgb2J2aW91cyB0byBwZW9wbGUgbG9va2luZyBmb3Igb3Bwb3J0dW5pdGllcyB0aGF0IGl0 4oCZcyBub3QgYSBsb25nLXRlcm0gcG9zaXRpb24uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZDliMTZlZSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8 aDMgaWQ9Im9yZ2Q5YjE2ZWUiPkZhYnJpY2UgTGUgRmVzc2FudCBhbm5vdW5jZWQ8L2gzPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2Q5YjE2ZWUiPg0KPHA+SGVyZSBp cyBhbiBvZmZlciBmb3IgT0NhbWxQcm86IDwvcD4NCjxwcmUgY2xhc3M9ImV4YW1wbGUiIGlkPSJv cmc3YjRiMDVkIj4NCnRpdGxlOiBKb2JzIGF0IE9DYW1sUHJvDQpsaW5rOiBodHRwczovL29jYW1s cHJvLmNvbS9qb2JzLw0KbG9jYXRpb246IEZyYW5jZQ0KcHVibGljYXRpb25fZGF0ZTogMjAyMy0w Mi0xMA0KY29tcGFueTogT0NhbWxQcm8NCmNvbXBhbnlfbG9nbzogaHR0cHM6Ly9vY2FtbHByby5j b20vYXNzZXRzL2ltZy9sb2dvX29jYW1scHJvLnBuZw0KPC9wcmU+DQo8cD5UaGFua3MgYSBsb3Qg ISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+QXZhaWxhYmxlIGZvciBIaXJlIC0g UTEgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYXZhaWxhYmxl LWZvci1oaXJlLXExLTIwMjMvMTEzODkvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YXZhaWxhYmxlLWZvci1oaXJlLXExLTIwMjMvMTEzODkvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdhMGY3ZWNmIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxo MyBpZD0ib3JnYTBmN2VjZiI+U2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnYTBmN2VjZiI+DQo8cD5IZXJl4oCZcyBh IHRocmVhZCB0byBhbm5vdW5jZSB5b3VyIGF2YWlsYWJpbGl0eSBhcyBhbiBPQ2FtbCBkZXZlbG9w ZXIgbG9va2luZyBmb3IgYW4gT0NhbWwgam9iLiA6cm9ja2V0Og0KPC9wPg0KPHA+RnJlZWxhbmNl cnMsIGNvbnRyYWN0b3JzIGFuZCBqb2Itc2Vla2VycywgZG8gYWR2ZXJ0aXNlIHlvdXIgc2Vydmlj ZXMgYW5kIGV4cGVyaWVuY2UgaGVyZS4NCjwvcD4NCjxwPkxldOKAmXMgc3RhcnQgdGhpcyBvZmYg d2l0aCBxdWFydGVybHkgdGhyZWFkcy4gSWYgd2UgZmluZCBpdCBnZXRzIHRvbyBzcGFtbXksIHdl IGNhbiBhbHdheXMgc3dpdGNoIHRvIGEgbW9udGhseSBmb3JtYXQgbGF0ZXIuIDpzbWlsZToNCjwv cD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmczMjdiZjk3 IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMzI3YmY5NyI+QXhlbCBCYXVkb3Q8L2gz Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzMyN2JmOTciPg0KPHA+ U29mdHdhcmUgZW5naW5lZXIgd2l0aCBleHBlcmllbmNlIGluIEJhY2tlbmQgZGV2ZWxvcG1lbnQu IDwvcD4NCjxwPkxvb2tpbmcgZm9yIGEgcG9zaXRpb24gYXMgQmFja2VuZCBvciBGdWxsc3RhY2sg RW5naW5lZXIgdXNpbmcgT0NhbWwgb3IgcmVsYXRlZCB0ZWNoLiBIYXBweSB0byB3b3JrIG9uIHRv b2xpbmcgb3IgUiZhbXA7RCBzdWJqZWN0cyBwcm9qZWN0cyB0b28uDQo8L3A+DQo8cD5JIHdpc2gg dG8gd29yayByZW1vdGVseSBhbmQgd2lsbCBiZSBsb2NhdGVkIGluIE1vbnRyZWFsIHNvb24uIE5v IHByb2JsZW0gd2l0aCBhc3luYyBvciBwYXJ0aWFsIHdvcmtkYXkgb3ZlcmxhcCBvbiBteSBzaWRl Lg0KPC9wPg0KPHA+UHJvZmVzc2lvbmFsIGV4cGVyaWVuY2U6IEVzc2VudGlhbGx5IGJhY2tlbmQg ZGV2ZWxvcG1lbnQgaW4gUHl0aG9uL0RqYW5nby4gU29tZSBzeXN0ZW0gZGVzaWduIGFuZCBpbnRl Z3JhdGlvbiBvbiBhdXRvbm9tb3VzIGRyb25lcyBhbmQgYmxpbXBzIGF0IEFpcmJ1cy4NCjwvcD4N CjxwPkZ1bmN0aW9uYWwgZXhwZXJpZW5jZTogSSBoYXZlIHRhdWdodCBFbG0gdG8gaGlnaCBzY2hv b2xlcnMgYW5kIHVzZWQgU01MLCBDYW1sIExpdGUgaW4gYWNhZGVtaWMgc2V0dGluZ3MuIFdvcmtp bmcgb24gdGhlIGNhcHN0b25lIHByb2plY3Qgb2YgdGhlIFNjYWxhIHNwZWNpYWxpemF0aW9uIG9u IENvdXJzZXJhIHRoZXNlIGRheXMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci03IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNyI+ VGltZWRlc2MgMS4wLjAgLSBtb2Rlcm4gZGF0ZSB0aW1lIGhhbmRsaW5nPC9oMj4NCjxkaXYgY2xh c3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGltZWRlc2MtMS0wLTAtbW9kZXJuLWRhdGUt dGltZS1oYW5kbGluZy8xMTM4Ni8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t dGltZWRlc2MtMS0wLTAtbW9kZXJuLWRhdGUtdGltZS1oYW5kbGluZy8xMTM4Ni8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcxODRhOGNmIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMTg0YThjZiI+RGFycmVuIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMTg0YThjZiI+DQo8cD5J4oCZ bSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIFRpbWVkZXNjIDEuMC4wIDwvcD4N CjxwPlRpbWVkZXNjIGlzIGEgdmVyeSBjb21wcmVoZW5zaXZlIGRhdGUgdGltZSBoYW5kbGluZyBs aWJyYXJ5IHdpdGggZ29vZCBzdXBwb3J0IG9mIHRpbWUgem9uZXMuDQo8L3A+DQo8cD48YSBocmVm PSJodHRwczovL2dpdGh1Yi5jb20vZGF5cGFjay1kZXYvdGltZXJlIj5Ib21lcGFnZTwvYT4gPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiMjUyNDY3IiBjbGFzcz0i b3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnYjI1MjQ2NyI+RmVhdHVyZXMgKGJlZm9yZSAxLjAuMCk8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2IyNTI0NjciPg0K PHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRpbWVzdGFtcCBhbmQgZGF0ZSB0aW1lIGhhbmRsaW5n IHdpdGggcGxhdGZvcm0gaW5kZXBlbmRlbnQgdGltZSB6b25lIHN1cHBvcnQNCjx1bCBjbGFzcz0i b3JnLXVsIj4NCjxsaT5TdWJzZXQgb2YgdGhlIElBTkEgdGltZSB6b25lIGRhdGFiYXNlIGlzIGJ1 aWx0IGludG8gdGhpcyBsaWJyYXJ5IDwvbGk+PC91bD4NCjwvbGk+PGxpPlN1cHBvcnRzIEdyZWdv cmlhbiBjYWxlbmRhciBkYXRlLCBJU08gd2VlayBkYXRlLCBhbmQgSVNPIG9yZGluYWwgZGF0ZSA8 L2xpPjxsaT5TdXBwb3J0cyBuYW5vc2Vjb25kIHByZWNpc2lvbiA8L2xpPjxsaT5JU084NjAxIHBh cnNpbmcgYW5kIFJGQzMzMzkgcHJpbnRpbmcgPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzk5NjljYjIiIGNsYXNzPSJvdXRsaW5lLTQiPg0K PGg0IGlkPSJvcmc5OTY5Y2IyIj5OZXcgZmVhdHVyZSBpbiAxLjAuMDwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnOTk2OWNiMiI+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+UkZDOTExMCAoSFRUUCkgZGF0ZSB0aW1lIHBhcnNpbmcgYW5kIHByaW50aW5nIDwv bGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGlu ZS1jb250YWluZXItOCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPk1ham9yIHVwZGF0 ZXMgdG8ga2NhcyBpbiAwLjEuOCBhbmQgMC4yLjA8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2Fubi1tYWpvci11cGRhdGVzLXRvLWtjYXMtaW4tMC0xLTgtYW5kLTAtMi0w LzExMzkyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tYWpvci11cGRhdGVz LXRvLWtjYXMtaW4tMC0xLTgtYW5kLTAtMi0wLzExMzkyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzE1MjdhMDciIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmcxNTI3YTA3Ij5WZXNhIEthcnZvbmVuIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMTUyN2EwNyI+DQo8cD5J4oCZbSBoYXBw eSB0byBhbm5vdW5jZSB0aGF0IHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt bXVsdGljb3JlL2tjYXMvIj4NCmtjYXM8L2E+IGxpYnJhcnkgaGFzIHJlY2VpdmVkIG1ham9yIHVw ZGF0ZXMuIDwvcD4NCjxwPldoYXQgaXMga2Nhcz8gPC9wPg0KPGJsb2NrcXVvdGU+DQo8cD5rY2Fz IHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIGF0b21pYyBsb2NrLWZyZWUgbXVsdGktd29y ZCBjb21wYXJlLWFuZC1zd2FwIChNQ0FTKSwgd2hpY2ggaXMgYSBwb3dlcmZ1bCB0b29sIGZvciBk ZXNpZ25pbmcgY29uY3VycmVudCBhbGdvcml0aG1zLg0KPC9wPg0KPC9ibG9ja3F1b3RlPg0KPHA+ Rmlyc3QsIGtjYXMgbm93IHVzZXMgYSBuZXcgbG9jay1mcmVlIGFsZ29yaXRobSB0aGF0IGltcHJv dmVzIHBlcmZvcm1hbmNlIG9mIGtjYXMgc2lnbmlmaWNhbnRseSBvdmVyIHRoZSBwcmV2aW91c2x5 IHVzZWQgYWxnb3JpdGhtLiBUaGUgbmV3IGFsZ29yaXRobSBpcyBwcm92aWRlZCBpbiBrY2FzIHZl cnNpb24gMC4xLjggd2l0aCBhbiBBUEkgY29tcGF0aWJsZSB3aXRoIHByZXZpb3VzIHZlcnNpb25z IG9mIGtjYXMuDQo8L3A+DQo8cD5TZWNvbmQsIHRoZSBsYXRlc3QgdmVyc2lvbiBvZiBrY2FzLCAw LjIuMCwgd2VudCB0aHJvdWdoIGEgbWFqb3IgQVBJIHJlZGVzaWduLiBUaGUgc2FtZSBmdW5jdGlv bmFsaXR5IGFzIGNhbiBiZSBmb3VuZCBpbiBwcmV2aW91cyB2ZXJzaW9ucyBpcyBub3cgYXZhaWxh YmxlIHRocm91Z2ggY2xlYW5lZC11cCBtb2R1bGVzLiBBZGRpdGlvbmFsbHksIHRoZSBsYXRlc3Qg bGlicmFyeSBvZmZlcnMNCjxhIGhyZWY9Imh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5p by9rY2FzL2RvYy9rY2FzL0tjYXMvVHgvaW5kZXguaHRtbCI+YSBuZXcgdHJhbnNhY3Rpb25hbCBB UEk8L2E+LCBlc3NlbnRpYWxseSBhIGJhc2ljIGZvcm0gb2YgU1RNIG9yIFNvZnR3YXJlIFRyYW5z YWN0aW9uYWwgTWVtb3J5LCB0aGF0IGNhbiBtYWtlIGl0IHNpZ25pZmljYW50bHkgZWFzaWVyIHRv IHByb2dyYW0gbG9jay1mcmVlIGFsZ29yaXRobXMuDQo8L3A+DQo8cD5UaGlyZCwgZG9jdW1lbnRh dGlvbiBoYXMgYWxzbyBiZWVuIG92ZXJoYXVsZWQgYW5kIHRoZXJlIGlzIG5vdyBib3RoIGFuIGlu dHJvZHVjdGlvbiB0byB0aGUgdXNlIG9mIHRoZSBsaWJyYXJ5IGFzIHdlbGwgYXMgYSByZWZlcmVu Y2UgbWFudWFsLg0KPC9wPg0KPHA+U28sIGNsaWNrIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1tdWx0aWNvcmUva2Nhcy8jcmVhZG1lIj5oZXJlPC9hPiwgY2hlY2sgb3V0IHRoZSBu ZXcgZG9jdW1lbnRhdGlvbiwgdGhlIG5ldyB0cmFuc2FjdGlvbmFsIEFQSSwgYW5kIGVuam95IHRo ZSBwZXJmb3JtYW5jZSENCjwvcD4NCjxwPkxhc3QsIHRoZXJlIGlzIHN0aWxsIG1vcmUgdG8gY29t ZS4gVGhlIGFyZSBwbGFucyB0byBleHRlbmQgdGhlIHJhbmdlIG9mIHRoZSBsaWJyYXJ5IGZ1cnRo ZXIgdmlhDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL2tjYXMv cHVsbC8yNCI+YSBicmFuZC1uZXcgYWxnb3JpdGhtPC9hPiBhbmQNCjxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUva2Nhcy9pc3N1ZXMvMjUiPmV4dGVuZGVkIHN1cHBv cnQgZm9yIHRyYW5zYWN0aW9uczwvYT4uDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5NDdjODA3IiBjbGFzcz0ib3V0bGluZS0yIj4N CjxoMiBpZD0ib3JnOTQ3YzgwNyI+T2xkIENXTjwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtb3JnOTQ3YzgwNyI+DQo8cD5JZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBD V04sIHlvdSBjYW4gPGEgaHJlZj0ibWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y ZyI+DQpzZW5kIG1lIGEgbWVzc2FnZTwvYT4gYW5kIEnigJlsbCBtYWlsIGl0IHRvIHlvdSwgb3Ig Z28gdGFrZSBhIGxvb2sgYXQgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9j d24vIj4NCnRoZSBhcmNoaXZlPC9hPiBvciB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcyI+UlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzPC9hPi4NCjwv cD4NCjxwPklmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWws IHlvdSBtYXkgc3Vic2NyaWJlIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5pZHlsbC5vcmcvbGlzdGlu Zm8vY2FtbC1uZXdzLXdlZWtseS8iPg0Kb25saW5lPC9hPi4gPC9wPg0KPGRpdiBjbGFzcz0iYXV0 aG9ybmFtZSIgaWQ9Im9yZzFkZmZjZGEiPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC8iPkFsYW4gU2NobWl0dDwvYT4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+DQo= From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 7 Feb 2023 08:18:06 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 7 Feb 2023 08:18:06 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 7 Feb 2023 08:18:06 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3178HLJY019895 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 7 Feb 2023 08:17:21 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 3178HCKW019879 for ; Tue, 7 Feb 2023 08:17:12 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Feb 2023 09:17:11 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6AD25E03B6; Tue, 7 Feb 2023 09:17:10 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B91FBE03B6 for ; Tue, 7 Feb 2023 09:16:59 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Feb 2023 09:16:35 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3A5CD56078C; Tue, 7 Feb 2023 09:16:33 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZOsy1gnZ4YH4XzkWsFpLyXR3Kaw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 7 Feb 2023 08:16:32 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 25b1ce4e-27c8-4106-13cf-08db08e3d762 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,278,1669071600"; d="scan'208,217";a="47052410" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499746, queueID=7A69C56078D x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <6F51985C0AA3A94292182CD69D1D6DDF@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMi0wNyBUdWUgMDk6MTUgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDEuMzEuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMi4xNC5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMzEgdG8gRmVicnVhcnkgMDcs IDIwMjMuDQo8L3A+DQo8ZGl2IGlkPSJ0YWJsZS1vZi1jb250ZW50cyIgcm9sZT0iZG9jLXRvYyI+ DQo8aDI+VGFibGUgb2YgQ29udGVudHM8L2gyPg0KPGRpdiBpZD0idGV4dC10YWJsZS1vZi1jb250 ZW50cyIgcm9sZT0iZG9jLXRvYyI+DQo8dWw+DQo8bGk+PGEgaHJlZj0iIzEiPlRlenQgMy4wLjAs IG5vdyBKUy1jb21wYXRpYmxlIGFuZCBpbiBpdHMgb3duIHJlcG9zaXRvcnk8L2E+IDwvbGk+PGxp PjxhIGhyZWY9IiMyIj5TaHV0dGxlIDAuOS4xIHJlbGVhc2VkPC9hPiA8L2xpPjxsaT48YSBocmVm PSIjMyI+T3V0cmVhY2h5IFN1bW1lciAyMDIzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNCI+VXNh YmlsaXR5IGltcHJvdmVtZW50cyBpbiB0aGUgT0NhbWwgY29tcGlsZXIgY29kZWJhc2U8L2E+IDwv bGk+PGxpPjxhIGhyZWY9IiM1Ij5MZWFybmluZyB0byB3cml0ZSBQUFggZXh0ZW5kZXJzOiBzb21l IGxpbmtzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+U3RyYW1vbiAwLjMuMCAtIFByb2Nlc3Mg YmVoYXZpb3IgbW9uaXRvcmluZyB1dGlsaXR5IGJhc2VkIG9uIHN0cmFjZTwvYT4NCjwvbGk+PGxp PjxhIGhyZWY9IiNvcmcxMmM5ZWZhIj5PbGQgQ1dOPC9hPiA8L2xpPjwvdWw+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8 aDIgaWQ9IjEiPlRlenQgMy4wLjAsIG5vdyBKUy1jb21wYXRpYmxlIGFuZCBpbiBpdHMgb3duIHJl cG9zaXRvcnk8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10ZXp0 LTMtMC0wLW5vdy1qcy1jb21wYXRpYmxlLWFuZC1pbi1pdHMtb3duLXJlcG9zaXRvcnkvMTEyODMv MSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRlenQtMy0wLTAtbm93LWpzLWNv bXBhdGlibGUtYW5kLWluLWl0cy1vd24tcmVwb3NpdG9yeS8xMTI4My8xPC9hPg0KPC9wPg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyMTUwNjlmIiBjbGFzcz0ib3V0bGlu ZS0zIj4NCjxoMyBpZD0ib3JnMjE1MDY5ZiI+cmJhcmRvdSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzIxNTA2OWYiPg0KPHA+SXQgaXMgbXkg cGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgdmVyc2lvbiAzLjAuMCBvZiBUZXp0 LCBhIHRlc3QgZnJhbWV3b3JrIGZvciBPQ2FtbCB3aGljaCBpcyB3ZWxsIHN1aXRlZCBmb3IgdW5p dCwgaW50ZWdyYXRpb24gYW5kIHJlZ3Jlc3Npb24gdGVzdHMgaW4gcGFydGljdWxhci4NCjwvcD4N CjxwPlRlenQgbm93IGxpdmVzIGluIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGlj LWxhYnMvdGV6dCI+aXRzIG93biByZXBvc2l0b3J5PC9hPiAoaXQgdXNlZCB0byBiZSBwYXJ0IG9m DQo8YSBocmVmPSJodHRwczovL2dpdGxhYi5jb20vdGV6b3MvdGV6b3MvIj5PY3RlejwvYT4pLiBU aGlzIHNob3VsZCBtYWtlIGRvY3VtZW50YXRpb24gZWFzaWVyIHRvIGZpbmQsIGJ1Z3MgZWFzaWVy IHRvIHJlcG9ydCBhbmQgZmVhdHVyZXMgZWFzaWVyIHRvIHN1Z2dlc3QuIEl0IGFsc28gbWFrZXMg aXQgZmFzdGVyIHRvIGRvd25sb2FkIGFuZCBpbnN0YWxsLg0KPC9wPg0KPHA+VGhlIG1haW4gaGln aGxpZ2h0cyBvZiB0aGlzIG1ham9yIHJlbGVhc2UgYXJlOiA8L3A+DQo8dWwgY2xhc3M9Im9yZy11 bCI+DQo8bGk+SmF2YVNjcmlwdCBjb21wYXRpYmlsaXR5OiB0aGUgbGlicmFyeSBoYXMgYmVlbiBz cGxpdCBpbnRvIGEgVW5peC1vbmx5IHBhcnQgKDxjb2RlPnRlenQ8L2NvZGU+KSwgYSBuZXcgSmF2 YVNjcmlwdC1vbmx5IHBhcnQgKDxjb2RlPnRlenQuanM8L2NvZGU+KSwgYW5kIGEgY29tbW9uIHBh cnQgKDxjb2RlPnRlenQuY29yZTwvY29kZT4pOw0KPC9saT48bGk+b3V0cHV0IGZpbGVzIGZvciBy ZWdyZXNzaW9uIHRlc3RzIGFyZSBub3cgbG9jYXRlZCBuZXh0IHRvIHRoZWlyIHRlc3QgYnkgZGVm YXVsdCwgaW4gYW4NCjxjb2RlPmV4cGVjdGVkPC9jb2RlPiBzdWJkaXJlY3RvcnksIHdoaWNoIGlu IHBhcnRpY3VsYXIgbWFrZXMgaXQgZWFzaWVyIHRvIHNwbGl0IHRlc3RzIGFjcm9zcyBhIGNvZGVi YXNlOw0KPC9saT48bGk+b25lIGNhbiBub3cgcmVzdW1lIGZyb20gYSBwcmV2aW91cyBydW4gdG8g YXZvaWQgcnVubmluZyB0ZXN0cyB0aGF0IGhhZCBzdWNjZWVkZWQuDQo8L2xpPjwvdWw+DQo8cD5T ZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0bGFiLmNvbS9ub21hZGljLWxhYnMvdGV6dC8tL2Js b2IvbWFzdGVyL0NIQU5HRVMubWQjdmVyc2lvbi0zMDAiPg0KY2hhbmdlbG9nPC9hPiBmb3IgdGhl IGZ1bGwgbGlzdCBvZiBjaGFuZ2VzLCBhbmQgdGhlIDxhIGhyZWY9Imh0dHBzOi8vbm9tYWRpYy1s YWJzLmdpdGxhYi5pby90ZXp0L2Rldi90ZXp0L1RlenQvaW5kZXguaHRtbCI+DQpBUEkgRG9jdW1l bnRhdGlvbjwvYT4gZm9yIG1vcmUgZGV0YWlscy4gPC9wPg0KPHA+WW91IGNhbiBpbnN0YWxsIFRl enQgd2l0aCBvcGFtOiA8L3A+DQo8cHJlIGNsYXNzPSJleGFtcGxlIiBpZD0ib3JnNGJmZTM1MCI+ DQpvcGFtIGluc3RhbGwgdGV6dA0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0yIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMiI+ U2h1dHRsZSAwLjkuMSByZWxlYXNlZDwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMiI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLXNodXR0bGUtMC05LTEtcmVsZWFzZWQvMTEyOTIvMSI+DQpodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLXNodXR0bGUtMC05LTEtcmVsZWFzZWQvMTEyOTIvMTwvYT4gPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4YzA5MWJhIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOGMwOTFiYSI+QW51cmFnIFNvbmkgYW5ub3VuY2VkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc4YzA5MWJhIj4NCjxw PknigJlkIGxpa2UgdG8gYW5ub3VuY2UgYSBuZXcgcG9pbnQgcmVsZWFzZSAoMC45LjEpIGZvciA8 Y29kZT5zaHV0dGxlPC9jb2RlPiBhbmQgaXRzIGNvbXBhbmlvbiBsaWJyYXJpZXMuIFRoZXkgYXJl IGF2YWlsYWJsZSB0byBpbnN0YWxsIHZpYSBvcGFtOg0KPC9wPg0KPHByZSBjbGFzcz0iZXhhbXBs ZSIgaWQ9Im9yZzg2NmQ5NzAiPg0Kb3BhbSBpbnN0YWxsIHNodXR0bGUgc2h1dHRsZV9zc2wgc2h1 dHRsZV9odHRwDQo8L3ByZT4NCjxwPlRoZSBjb2RlIGlzIGhvc3RlZCBvbiA8YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vYW51cmFnc29uaS9zaHV0dGxlIj5naXRodWI8L2E+LCBhbmQgdGhlIGRv Y3VtZW50YXRpb24gY2FuIGJlIHNlZW4gb25saW5lIG9uDQo8YSBocmVmPSJodHRwczovL29jYW1s Lm9yZy9wL3NodXR0bGVfaHR0cC8wLjkuMS9kb2MvaW5kZXguaHRtbCI+b2NhbWzigJlzIHBhY2th Z2UgcmVnaXN0cnk8L2E+Lg0KPC9wPg0KPHA+PGI+U2h1dHRsZTwvYj4gaXMgYSBzbWFsbCBsaWJy YXJ5IHRoYXQgaXMgYSB3cmFwcGVyIGFyb3VuZCBmaWxlIGRlc2NyaXB0b3JzIHRoYXQgcHJvdmlk ZXMgYW4gQVBJIGZvciBidWZmZXJlZCBjaGFubmVscyB1c2luZw0KPGEgaHJlZj0iaHR0cHM6Ly9v cGVuc291cmNlLmphbmVzdHJlZXQuY29tL2FzeW5jLyI+YXN5bmM8L2E+LiA8L3A+DQo8cD48Yj5T aHV0dGxlX3NzbDwvYj4gcHJvdmlkZXMgc3NsIHN1cHBvcnQgZm9yIDxjb2RlPnNodXR0bGU8L2Nv ZGU+IGFuZCBpcyBidWlsdCBvbiB0b3Agb2YNCjxjb2RlPmFzeW5jX3NzbDwvY29kZT4gKGFzeW5j IGJpbmRpbmdzIGZvciBPcGVuU1NMKS4gPC9wPg0KPHA+PGI+U2h1dHRsZV9odHRwPC9iPiBpcyBh IGxpYnJhcnkgdGhhdCBpbXBsZW1lbnRzIHRvIGhlbHAgd3JpdGUgSFRUUC8xLjEgc2VydmVycyBh bmQgY2xpZW50cy4NCjwvcD4NCjxwPlNodXR0bGVfaHR0cCBpcyB0aGUgbGlicmFyeSB0aGF0IGhh cyBzZWVuIHRoZSBtb3N0IGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlOiA8L3A+DQo8dWwgY2xhc3M9 Im9yZy11bCI+DQo8bGk+SW1wcm92ZWQgc3RyZWFtaW5nIHJlc3BvbnNlIGJvZHkgaGFuZGxpbmcu IFRoZSBsaWJyYXJ5IHdpbGwgcmVsaWFibHkgc2NoZWR1bGUgYSBjbGVhbnVwIGFjdGlvbiB0aGF0 IHdpbGwgcnVuIGlmIHRoZSB1bmRlcmx5aW5nIHNvY2tldCBpcyBjbG9zZWQgYmVmb3JlIHRoZSBl bnRpcmUgcmVzcG9uc2UgYm9keSB3YXMgY29uc3VtZWQuDQo8L2xpPjxsaT5TdXBwb3J0IGZvciBv bmUtc2hvdCBIVFRQLzEuMSBjbGllbnRzLiBUaGVzZSBkb27igJl0IHN1cHBvcnQga2VlcC1hbGl2 ZXMgYW5kIHRoZSB1bmRlcmx5aW5nIHNvY2tldCB3aWxsIGJlIGNsb3NlZCBhZnRlciBvbmUgcmVx dWVzdCAtJmd0OyByZXNwb25zZSBjeWNsZS4NCjwvbGk+PGxpPlN1cHBvcnQgZm9yIEhUVFAvMS4x IGNsaWVudHMgdGhhdCBzdXBwb3J0IGtlZXAtYWxpdmVzLiBDbGllbnQgY29ubmVjdGlvbiB3aWxs IGJlIGtlcHQgb3BlbiBpZiBib3RoIGNsaWVudCBhbmQgc2VydmVyIGluZGljYXRlIHRoYXQgdGhl IGNvbm5lY3Rpb24gc3VwcG9ydHMga2VlcC1hbGl2ZS4gVGhpcyBhbGxvd3MgdGhlIHNhbWUgY29u bmVjdGlvbiB0byBiZSByZS11c2VkIGZvciBtdWx0aXBsZSByZXF1ZXN0IC0mZ3Q7IHJlc3BvbnNl IGN5Y2xlcy4NCiBUaGUgY29ubmVjdGlvbiBvYmplY3QgZW5zdXJlcyB0aGF0IG91dGdvaW5nIHJl cXVlc3RzIGFyZSBzZXJpYWxpemVkIHRvIHJlc3BlY3QgdGhhdCBIVFRQLzEuMSBkb2VzbuKAmXQg c3VwcG9ydCBtdWx0aXBsZXhpbmcuDQo8L2xpPjxsaT5TdXBwb3J0IGZvciBwZXJzaXN0ZW50IEhU VFAgY2xpZW50cy4gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggPGNvZGU+SFRUUCBwZXJzaXN0ZW50 IGNvbm5lY3Rpb248L2NvZGU+LiBQZXJzaXN0ZW50IGluIHRoaXMgY2FzZSByZWZlcnMgdG8gZHVy YWJsZSBjbGllbnRzIHRoYXQgd2lsbCBhbHdheXMgaGFuZCB0aGUgdXNlciBhbiBvcGVuIGNvbm5l Y3Rpb24sIGFuZCBhdHRlbXB0cyB0byByZWNvbm5lY3QgaWYgdGhlIHVuZGVybHlpbmcgY29ubmVj dGlvbg0KIGlzIGxvc3QuIFRoaXMgbGV2ZXJhZ2VzIEFzeW5j4oCZcyBwZXJzaXN0ZW50IG1vZHVs ZSB0byBwcm92aWRlIGFuIEhUVFAgZmxhdm9yZWQgcGVyc2lzdGVudCBjb25uZWN0aW9uLg0KPC9s aT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcwNGY0NDdjIiBj bGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMDRmNDQ3YyI+VXNlcyBhbmQgZXhhbXBsZXM8 L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzA0ZjQ0N2MiPg0K PHA+PGI+QSBoZWxsbyB3b3JsZCBodHRwIHNlcnZlcjwvYj4gPC9wPg0KPGRpdiBjbGFzcz0ib3Jn LXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4hIDwvc3Bhbj48c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db3JlPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj MDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPkFzeW5jPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPlNodXR0bGVfaHR0cDwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBm b250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjYTc2MDFm OyI+aGVsbG9fd29ybGQ8L3NwYW4+ICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hZGRy ZXNzPC9zcGFuPiA6PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+IFNvY2tldC5BZGRyZXNz LkluZXQudDwvc3Bhbj4pICg8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5yZXF1ZXN0PC9z cGFuPiA6PHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+IFJlcXVlc3QudDwvc3Bhbj4pID0N CiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TG9nLkdsb2JhbC48L3NwYW4+aW5mbyA8 c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij4hPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog I2NhMzQwMDsiPiZxdW90OyV7c2V4cDogU29ja2V0LkFkZHJlc3MuSW5ldC50fSAtICVzJnF1b3Q7 PC9zcGFuPiBhZGRyZXNzICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZXF1ZXN0Ljwv c3Bhbj5wYXRoIHJlcXVlc3QpOw0KICByZXR1cm4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPlJlc3BvbnNlLjwvc3Bhbj5jcmVhdGUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+ fmJvZHk8L3NwYW4+Oig8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Cb2R5Ljwvc3Bhbj5z dHJpbmcgPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGVsbG8gV29ybGQmcXVv dDs8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJhY2tncm91bmQtY29sb3I6 ICNmY2Y3ZWY7Ij5gT2s8L3NwYW4+KQ0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8 L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0KPHA+PGI+QW4gZXhhbXBsZSBvZiBhIGh0dHAgaGFuZGxl ciB0aGF0IHJlc3BvbmRzIHdpdGggYSBzdHJlYW1pbmcgYm9keTwvYj4gPC9wPg0KPGRpdiBjbGFz cz0ib3JnLXNyYy1jb250YWluZXIiPg0KPHByZSBjbGFzcz0ic3JjIHNyYy1vY2FtbCI+PHNwYW4g c3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4hIDwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Db3JlPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkFzeW5jPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPm9wZW4gPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPlNodXR0bGVfaHR0cDwvc3Bhbj4NCg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAw MDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAj YTc2MDFmOyI+bXlfc2VydmljZTwvc3Bhbj4gKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5Zjsi PmFkZHJlc3M8L3NwYW4+IDo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij4gU29ja2V0LkFk ZHJlc3MuSW5ldC50PC9zcGFuPikgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnJlcXVl c3Q8L3NwYW4+IDo8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij4gUmVxdWVzdC50PC9zcGFu PikgPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ bGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPiVtYXA8L3NwYW4+IDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwN2E5ZjsiPnJlYWRlcjwvc3Bhbj4gPQ0KICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+VGhpcyBhbiBleGFtcGxl IHRvIHNob3cgYSBzdHJlYW0gdGhhdCB3b3JrcyB3aXRoIGFuIGV4dGVybmFsIHJlc291cmNlLjwv c3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAq KTwvc3Bhbj4NCiAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZWFkZXIuPC9zcGFu Pm9wZW5fZmlsZSA8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDsmbHQ7c29tZSBm aWxlIHBhdGgmZ3Q7JnF1b3Q7PC9zcGFuPg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhm NmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjog IzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+Q3JlYXRlIGEgcGlwZSBmcm9tIHRoZSByZWFk ZXIgdGhhdCB3ZSB3aWxsIHVzZSBhcyBhIHN0cmVhbWluZyByZXNwb25zZSBib2R5Ljwvc3Bhbj48 c3BhbiBzdHlsZT0iY29sb3I6ICM4ZjZmNGE7IGZvbnQtc3R5bGU6IGl0YWxpYzsiPiAqKTwvc3Bh bj4NCiAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxl dDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA3YTlmOyI+cmVhZGVyX3BpcGU8L3NwYW4+ ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UmVhZGVyLjwvc3Bhbj5waXBlIHJlYWRl ciA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3Nw YW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ KCogPC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGlj OyI+Q3JlYXRlIGEgcmVzcG9uc2UgZnJvbSB0aGUgcmVhZGVyJ3MgcGlwZS4gSWYgdGhlIHNlcnZl ciBpcyBjbG9zZWQgYmVmb3JlIHRoZSBmdWxsPC9zcGFuPg0KPHNwYW4gc3R5bGU9ImNvbG9yOiAj OGY2ZjRhOyBmb250LXN0eWxlOiBpdGFsaWM7Ij4gICAgIHJlc3BvbnNlIHdhcyBzZXJ2ZWQsIHRo ZSBwaXBlIHdpbGwgYmUgY2xvc2VkIHdoaWNoIGluLXR1cm4gd2lsbCBjbG9zZSB0aGUgcmVhZGVy IGFuZDwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRh bGljOyI+ICAgICB0aGUgdW5kZXJseWluZyBmaWxlIGRlc2NyaXB0b3IuPC9zcGFuPjxzcGFuIHN0 eWxlPSJjb2xvcjogIzhmNmY0YTsgZm9udC1zdHlsZTogaXRhbGljOyI+ICopPC9zcGFuPg0KICA8 c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5SZXNwb25zZS48L3NwYW4+Y3JlYXRlIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5ib2R5PC9zcGFuPjooPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+Qm9keS48L3NwYW4+b2ZfcGlwZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1 MjE7IGJhY2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5gQ2h1bmtlZDwvc3Bhbj4gcmVhZGVyX3Bp cGUpIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2ZjZjdl ZjsiPmBPazwvc3Bhbj4NCjxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsiPjs7PC9zcGFuPg0K PC9wcmU+DQo8L2Rpdj4NCjxwPjxiPkEgb25lLXNob3QgaHR0cCBjbGllbnQ8L2I+IDwvcD4NCjxk aXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwi PjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3Nw YW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAxZjsiPnJ1bjwvc3Bhbj4gKCkgPQ0KICA8c3Bh biBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8 c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5hZGRyZXNzPC9zcGFuPiA9DQogICAgPHNwYW4g c3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q2xpZW50LkFkZHJlc3MuPC9zcGFuPm9mX2hvc3RfYW5k X3BvcnQgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkhvc3RfYW5kX3BvcnQuPC9zcGFu PmNyZWF0ZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+aG9zdDwvc3Bhbj46PHNwYW4g c3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7aHR0cGJpbi5vcmcmcXVvdDs8L3NwYW4+IDxz cGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5wb3J0PC9zcGFuPjo8c3BhbiBzdHlsZT0iY29s b3I6ICMwMDgyNGY7Ij40NDM8L3NwYW4+KQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7 IGZvbnQtd2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0 NGZjZjsiPkNsaWVudC5PbmVzaG90Ljwvc3Bhbj5jYWxsIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw ODI0ZjsiPn5zc2w8L3NwYW4+Oig8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5DbGllbnQu U3NsLjwvc3Bhbj5jcmVhdGUgKCkpIGFkZHJlc3MgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPlJlcXVlc3QuPC9zcGFuPmNyZWF0ZSA8c3BhbiBzdHlsZT0iY29sb3I6ICMyNDI1MjE7IGJh Y2tncm91bmQtY29sb3I6ICNmY2Y3ZWY7Ij5gR0VUPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6 ICNjYTM0MDA7Ij4mcXVvdDsvZ2V0JnF1b3Q7PC9zcGFuPikNCjxzcGFuIHN0eWxlPSJjb2xvcjog I2ZmNDUwMDsiPjs7PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxwPjxiPkNsaWVudCBzdXBwb3J0 aW5nIGtlZXAtYWxpdmU8L2I+IDwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4N CjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwMDAwMDsg Zm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2E3NjAx ZjsiPnJ1bjwvc3Bhbj4gKCkgPQ0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5z dGRvdXQ8L3NwYW4+ID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+TGF6eS48L3NwYW4+ Zm9yY2UgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+V3JpdGVyLjwvc3Bhbj5zdGRvdXQg PHNwYW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFu Pg0KICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0 PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2EyNjA0ZjsiPiViaW5kPC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5odHRwYmluPC9zcGFuPiA9DQogICAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjNDQ0ZmNmOyI+RGVmZXJyZWQuT3JfZXJyb3IuPC9zcGFuPm9rX2V4bg0KICAgICAg KDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNsaWVudC48L3NwYW4+Y3JlYXRlDQogICAg ICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDgyNGY7Ij5+c3NsPC9zcGFuPjooPHNwYW4gc3R5 bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+Q2xpZW50LlNzbC48L3NwYW4+Y3JlYXRlICgpKQ0KICAgICAg ICAgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPkNsaWVudC5BZGRyZXNzLjwvc3Bhbj5v Zl9ob3N0X2FuZF9wb3J0DQogICAgICAgICAgICAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+SG9zdF9hbmRfcG9ydC48L3NwYW4+Y3JlYXRlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0 ZjsiPn5ob3N0PC9zcGFuPjo8c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVvdDtodHRw YmluLm9yZyZxdW90Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+fnBvcnQ8 L3NwYW4+OjxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPjQ0Mzwvc3Bhbj4pKSkNCiAgPHNw YW4gc3R5bGU9ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmluPC9zcGFuPg0K ICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Nb25pdG9yLjwvc3Bhbj5wcm90ZWN0DQog ICAgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMDA4MjRmOyI+fmZpbmFsbHk8L3NwYW4+Oig8c3BhbiBz dHlsZT0iY29sb3I6ICMwMDZmMDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+ZnVuPC9zcGFuPiAoKSAt Jmd0OyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5DbGllbnQuPC9zcGFuPmNsb3NlIGh0 dHBiaW4pDQogICAgKDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwNmYwMDsgZm9udC13ZWlnaHQ6IGJv bGQ7Ij5mdW48L3NwYW4+ICgpIC0mZ3Q7DQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2Ey NjA0ZjsiPiViaW5kPC9zcGFuPiA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDdhOWY7Ij5yZXNwb25z ZTwvc3Bhbj4gPSA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5DbGllbnQuPC9zcGFuPmNh bGwgaHR0cGJpbiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+UmVxdWVzdC48L3NwYW4+ Y3JlYXRlIDxzcGFuIHN0eWxlPSJjb2xvcjogIzI0MjUyMTsgYmFja2dyb3VuZC1jb2xvcjogI2Zj ZjdlZjsiPmBHRVQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjogI2NhMzQwMDsiPiZxdW90Oy9z dHJlYW0vMjAmcXVvdDs8L3NwYW4+KSA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5Mb2cuR2xvYmFsLjwvc3Bhbj5pbmZvIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsi PiE8L3NwYW4+PHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7SGVhZGVyczogJXtz ZXhwOiBIZWFkZXJzLnR9JnF1b3Q7PC9zcGFuPiAoPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNm OyI+UmVzcG9uc2UuPC9zcGFuPmhlYWRlcnMgcmVzcG9uc2UpOw0KICAgICAgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsiPmxldDwvc3Bhbj4gPHNwYW4gc3R5 bGU9ImNvbG9yOiAjYTc2MDFmOyI+bG9nX2JvZHk8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwN2E5ZjsiPnJlc3BvbnNlPC9zcGFuPiA9DQogICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjog IzQ0NGZjZjsiPkJvZHkuU3RyZWFtLjwvc3Bhbj5pdGVyDQogICAgICAgICAgKDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkJvZHkuPC9zcGFuPnRvX3N0cmVhbSAoPHNwYW4gc3R5bGU9ImNv bG9yOiAjNDQ0ZmNmOyI+UmVzcG9uc2UuPC9zcGFuPmJvZHkgcmVzcG9uc2UpKQ0KICAgICAgICAg IDxzcGFuIHN0eWxlPSJjb2xvcjogIzAwODI0ZjsiPn5mPC9zcGFuPjooPHNwYW4gc3R5bGU9ImNv bG9yOiAjMDA2ZjAwOyBmb250LXdlaWdodDogYm9sZDsiPmZ1bjwvc3Bhbj4gPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMDA3YTlmOyI+Y2h1bms8L3NwYW4+IC0mZ3Q7DQogICAgICAgICAgICA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5Xcml0ZXIuPC9zcGFuPndyaXRlIHN0ZG91dCBjaHVuazsN CiAgICAgICAgICAgIDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZjZjsiPldyaXRlci48L3NwYW4+ Zmx1c2hlZCBzdGRvdXQpDQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAwMDA7IGZvbnQt d2VpZ2h0OiBib2xkOyI+aW48L3NwYW4+DQogICAgICA8c3BhbiBzdHlsZT0iY29sb3I6ICMwMDAw MDA7IGZvbnQtd2VpZ2h0OiBib2xkOyI+bGV0PC9zcGFuPjxzcGFuIHN0eWxlPSJjb2xvcjogI2Ey NjA0ZjsiPiViaW5kPC9zcGFuPiAoKSA9IGxvZ19ib2R5IHJlc3BvbnNlIDxzcGFuIHN0eWxlPSJj b2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgIDxzcGFu IHN0eWxlPSJjb2xvcjogIzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5sZXQ8L3NwYW4+PHNw YW4gc3R5bGU9ImNvbG9yOiAjYTI2MDRmOyI+JWJpbmQ8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzAwN2E5ZjsiPnJlc3BvbnNlPC9zcGFuPiA9IDxzcGFuIHN0eWxlPSJjb2xvcjogIzQ0NGZj ZjsiPkNsaWVudC48L3NwYW4+Y2FsbCBodHRwYmluICg8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRm Y2Y7Ij5SZXF1ZXN0Ljwvc3Bhbj5jcmVhdGUgPHNwYW4gc3R5bGU9ImNvbG9yOiAjMjQyNTIxOyBi YWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+YEdFVDwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9y OiAjY2EzNDAwOyI+JnF1b3Q7L2dldCZxdW90Ozwvc3Bhbj4pIDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwMDAwMDsgZm9udC13ZWlnaHQ6IGJvbGQ7Ij5pbjwvc3Bhbj4NCiAgICAgIDxzcGFuIHN0eWxl PSJjb2xvcjogIzQ0NGZjZjsiPkxvZy5HbG9iYWwuPC9zcGFuPmluZm8gPHNwYW4gc3R5bGU9ImNv bG9yOiAjYTUyYTJhOyI+ITwvc3Bhbj48c3BhbiBzdHlsZT0iY29sb3I6ICNjYTM0MDA7Ij4mcXVv dDtIZWFkZXJzOiAle3NleHA6IEhlYWRlcnMudH0mcXVvdDs8L3NwYW4+ICg8c3BhbiBzdHlsZT0i Y29sb3I6ICM0NDRmY2Y7Ij5SZXNwb25zZS48L3NwYW4+aGVhZGVycyByZXNwb25zZSk7DQogICAg ICBsb2dfYm9keSByZXNwb25zZSkNCjxzcGFuIHN0eWxlPSJjb2xvcjogI2ZmNDUwMDsiPjs7PC9z cGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjMi Pk91dHJlYWNoeSBTdW1tZXIgMjAyMzwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIg aWQ9InRleHQtMyI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb3V0cmVhY2h5LXN1bW1lci0yMDIzLzExMTU5LzQiPmh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vdXRyZWFjaHktc3VtbWVyLTIwMjMvMTExNTkvNDwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnOTU0NzdiZiIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzk1NDc3YmYiPlJleW5pciBCasO2cm5zc29uIGFubm91bmNlZDwvaDM+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOTU0NzdiZiI+DQo8cD5IZWxs byEgTWUsIEByYW5kIGFuZCBAcGl0YWcgaW50ZW5kIHRvIGNvLW1lbnRvciBvbiB0d28gcHJvamVj dHMgcmVsYXRlZCB0byA8YSBocmVmPSJodHRwczovL21pcmFnZS5pby8iPg0KTWlyYWdlPC9hPi4g V2UgaGF2ZSBub3Qgc2V0IGluIHN0b25lIHdoYXQgdGhlIHByb2plY3RzIHdpbGwgYmUsIGJ1dCB3 ZSBoYXZlIHNvbWUgaWRlYXMuIFN1Z2dlc3Rpb25zIGFuZCBmZWVkYmFjayBpcyB2ZXJ5IHdlbGNv bWUuDQo8L3A+DQo8cD5PbmUgaWRlYSBpcyB0byB3b3JrIG9uIHRoZSBzdG9yeSBvZiBwZXJzaXN0 ZW50IHN0b3JhZ2UgaW4gT0NhbWwuIFNwZWNpZmljYWxseSwNCjwvcD4NCjx1bCBjbGFzcz0ib3Jn LXVsIj4NCjxsaT53cml0ZSB0ZXN0cyBhbmQgZXhhbXBsZSB1bmlrZXJuZWxzIGZvciBleGlzdGlu ZyBsaWJyYXJpZXMgKE1CUiwgdGFyLCAuLiksIDwvbGk+PGxpPndvcmsgb24gYSBncHQgaW1wbGVt ZW50YXRpb24gKGFuIG9sZCBub24tZnVuY3Rpb25hbCBpbXBsZW1lbnRhdGlvbiBleGlzdHMpLCA8 L2xpPjxsaT5hIHNjcmF0Y2ggc3BhY2UgLyBzd2FwLWxpa2UgbGlicmFyeSBmb3Iga2VlcGluZyB0 cmFjayBpbiBtZW1vcnkgb2YgdGVtcG9yYXJ5IGFsbG9jYXRpb25zIG9uIGEgYmxvY2sgZGV2aWNl LiBUaGlzIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggTUJSIG9yIEdQVCBhbmQgdGhl IHRhciBmaWxlc3lzdGVtLiBUaGUgdGFyIGZpbGVzeXN0ZW0gaXMgYXBwZW5kLW9ubHksIGFuZCBm b3IgdGhhdCByZWFzb24gdGhlIHNjcmF0Y2ggc3BhY2UNCiBjYW4gYmUgdXNlZnVsIGZvciB0ZW1w b3JhcmlseSBzdG9yaW5nIGZpbGVzIGRvd25sb2FkZWQgb3ZlciBodHRwIGJlZm9yZSBjb21taXR0 aW5nIHRoZW0gdG8gdGhlIGZpbGVzeXN0ZW0gb25jZSB0aGUgZmluYWwgc2l6ZSBpcyBrbm93biBv ciB0aGUgY2hlY2tzdW0gbWF0Y2hlcyBhbiBleHBlY3RlZCBoYXNoLg0KPC9saT48L3VsPg0KPHA+ V2UgaGF2ZSBhcyB3ZWxsIGEgZmV3IGlkZWFzIGFib3V0IChiZXR0ZXIpIHN1cHBvcnQgZm9yIE1p cmFnZU9TIG9uIG1pY3JvIGNvbnRyb2xsZXJzIGFuZCBSYXNwYmVycnkgUGkuIFdlIGFyZSBpbnZl c3RpZ2F0aW5nIHRoZSBwb3NzaWJpbGl0eSBvZiBzaGlwcGluZyBoYXJkd2FyZSB0byBpbnRlcm5z IGFuZCB3aGF0IG1pY3JvIGNvbnRyb2xsZXJzIGNvdWxkIGJlIHJlbGV2YW50Lg0KPC9wPg0KPHA+ T3RoZXIgaWRlYXMgaXMgcGlja2luZyB1cCBhbiBvbGQgbnRwLWNsaWVudCBwcm9qZWN0IG9yIHdv cmtpbmcgb24gY29ubnRlc3Q6IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9yYW5kMDAvY29u bnRlc3QvIj4NCmh0dHBzOi8vZ2l0aHViLmNvbS9yYW5kMDAvY29ubnRlc3QvPC9hPiA8L3A+DQo8 L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci00IiBjbGFz cz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNCI+VXNhYmlsaXR5IGltcHJvdmVtZW50cyBpbiB0aGUg T0NhbWwgY29tcGlsZXIgY29kZWJhc2U8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIi IGlkPSJ0ZXh0LTQiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L3VzYWJpbGl0eS1pbXByb3ZlbWVudHMtaW4tdGhlLW9jYW1sLWNvbXBpbGVyLWNvZGVi YXNlLzExMzEyLzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3VzYWJpbGl0eS1pbXBy b3ZlbWVudHMtaW4tdGhlLW9jYW1sLWNvbXBpbGVyLWNvZGViYXNlLzExMzEyLzE8L2E+DQo8L3A+ DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzgyZGM2ZTYiIGNsYXNzPSJv dXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc4MmRjNmU2Ij5nYXNjaGUgc2FpZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnODJkYzZlNiI+DQo8cD5JbiB0aGUgbW9u c3RlciB0aHJlYWQgPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3doYXQtYXJl LXRoZS1iaWdnZXN0LXJlYXNvbnMtbmV3Y29tZXJzLWdpdmUtdXAtb24tb2NhbWwvMTA5NTgvMjQx Ij4NCldoYXQgYXJlIHRoZSBiaWdnZXN0IHJlYXNvbnMgbmV3Y29tZXJzIGdpdmUgdXAgb24gT0Nh bWw/PC9hPiwgQHBhdHJpY29mZXJyaXMgPGEgaHJlZj0iaHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20v cGF0cmljb2ZlcnJpcy81OGFjMTI0N2FkMTdkNDM1ZTk1MmNjYjlhMzM5NDUwYiI+DQpwb3N0ZWQg YSBzdHJ1Y3R1cmVkIHN1bW1hcnk8L2E+IGFuZCB0aGVuIHNhaWQgdGhlIGZvbGxvd2luZzogPC9w Pg0KPGJsb2NrcXVvdGU+DQo8cD5GaXJzdGx5LCB0aGVyZeKAmXMgYWN0dWFsbHkgYSB0cmVtZW5k b3VzIGFtb3VudCBvZiBleGNlbGxlbnQgd29yayBoYXBwZW5pbmcgKGFuZCB0aGF0IGhhcyBoYXBw ZW5lZCkgdG8gaW1wcm92ZSB0aGUgc2l0dWF0aW9uIGZvciBuZXdjb21lcnMgY29taW5nIHRvIE9D YW1sLCB3aGljaCBpcyBncmVhdCBhbmQgc2hvdWxkIGJlIGNlbGVicmF0ZWQhIEhvd2V2ZXIsIGl0 IHByb2JhYmx5IGhhc27igJl0IGJlZW4gY29tbXVuaWNhdGVkIGVmZmVjdGl2ZWx5IHdpdGgNCiB0 aGUgYnJvYWRlciBjb21tdW5pdHkuIFvigKZdIFdvcmtpbmcgb3V0IGJldHRlciB3YXlzIHRvIGNv bW11bmljYXRlIHRoYXQgc3VzdGFpbmFibHkgbWlnaHQgYmUgZ29vZC4NCjwvcD4NCjwvYmxvY2tx dW90ZT4NCjxwPkkgY2Fu4oCZdCBzcGVhayBmb3IgdGhlIHdob2xlIHRvb2xpbmcgZWNvc3lzdGVt IGZvciBPQ2FtbCwgYnV0IHdpdGggbXkgY29tcGlsZXIgY29udHJpYnV0b3IgaGF0LCBJIGRlY2lk ZWQgdG8gcGxheSBhbG9uZyBhbmQgY29tbXVuaWNhdGUgb24gdGhlIGZhY3QgdGhhdCwgeWVzLCBw ZW9wbGUgYXJlIGNvbnN0YW50bHkgd29ya2luZyB0byBpbXByb3ZlIHRoZSB1c2FiaWxpdHkgb2Yg dGhlIGxhbmd1YWdlIGltcGxlbWVudGF0aW9uLg0KPC9wPg0KPHA+TWFueSBjaGFuZ2VzIHRvIHRo ZSBsYW5ndWFnZSBhbmQgc3RhbmRhcmQgbGlicmFyeSBwYXJ0aWNpcGF0ZSB0byB1c2FiaWxpdHks IGJ1dCBpZiB3ZSByZXN0cmljdCB0byB0aGUgdXNhYmlsaXR5IG9mIHRoZSBjb21waWxlciBpdHNl bGYgYW5kIGl0cyBkb2N1bWVudGF0aW9uLCBvbmUgd2F5IHRvIHNlZSB0aGUgYWN0aW9uIGlzIHRv IGxvb2sgYXQgdGhlDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxv Yi90cnVuay9DaGFuZ2VzIj5jb21waWxlciBjaGFuZ2Vsb2c8L2E+LCBpbiBwYXJ0aWN1bGFyIHNl Y3Rpb25zIOKAnE1hbnVhbCBhbmQgZG9jdW1lbnRhdGlvbuKAnSBhbmQg4oCcQ29tcGlsZXIgdXNl ci1pbnRlcmZhY2UgYW5kIHdhcm5pbmdz4oCdLg0KPC9wPg0KPHA+QmVsb3cgYXJlIHRob3NlIHR3 byBzZWN0aW9ucyBpbiB0aGUgbGFzdCB0d28geWVhcnMgb2YgT0NhbWwgcmVsZWFzZXMuIChJIHRy aW1tZWQgc29tZSBlbnRyaWVzIHdoaWNoIEkgYmVsaWV2ZSBhcmUgbGVzcyBpbW1lZGlhdGVseSBy ZWxhdGVkIHRvIHVzYWJpbGl0eS4pDQo8L3A+DQo8cD48aT5FZGl0b3LigJlzIG5vdGU6IHBsZWFz ZSBmb2xsb3cgdGhlIGFyY2hpdmUgbGluayBhYm92ZSB0byByZWFkIHRoZSBodWdlIGxpc3QgdGhh dCBHYWJyaWVsIGNvbGxlY3RlZC48L2k+DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci01IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i NSI+TGVhcm5pbmcgdG8gd3JpdGUgUFBYIGV4dGVuZGVyczogc29tZSBsaW5rczwvaDI+DQo8ZGl2 IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVm PSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbGVhcm5pbmctdG8td3JpdGUtcHB4LWV4dGVu ZGVycy1zb21lLWxpbmtzLzExMzM0LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xl YXJuaW5nLXRvLXdyaXRlLXBweC1leHRlbmRlcnMtc29tZS1saW5rcy8xMTMzNC8xPC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdkYTc0ZmViIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnZGE3NGZlYiI+THVrYXN6IFN0YWZpbmlhayBzYWlkPC9o Mz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkYTc0ZmViIj4NCjxw PkhpISBUaGlzIGlzIGp1c3QgdG8gc2lnbmFsIGJvb3N0IGEgY291cGxlIG9mIFBQWCBleHRlbnNp b24gZXhhbXBsZXMsIGZvciBleHRlbmRlcnMgc3BlY2lmaWNhbGx5LCB0aGF0IEkgZm91bmQgdXNl ZnVsIGluIG15IGxlYXJuaW5nLiBTb3JyeSBmb3Igbm90IHNlbGVjdGluZyBvdGhlcnMsIEkgc3R1 bWJsZWQgdXBvbiB0aGVzZS4NCjwvcD4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVm PSJodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAxOS0wNS0wOS1hbi1pbnRyb2R1Y3Rpb24tdG8t b2NhbWwtcHB4LWVjb3N5c3RlbSI+QmxvZyBwb3N0IGJ5IE5hdGhhbiBmcm9tIFRhcmlkZXM8L2E+ IGlzIHRvIGdvLXRvIHR1dG9yaWFsIHRoYXQgSSBvbmx5IGRpc2NvdmVyZWQgdG9kYXkuDQo8L2xp PjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vYm9iYXRrZXkvcHB4LW1vbm9pZC9ibG9i L21hc3Rlci9zcmMvcHB4X21vbm9pZC5tbCI+cHB4LW1vbm9pZDwvYT4gaXMgcmVjdXJzaXZlbHkg dHJhbnNsYXRpbmcgdGhlIGV4cHJlc3Npb24gcGFydHMgb2YgaW50ZXJlc3Qgd2hpbGUga2VlcGlu ZyBvdGhlcnMgdW5jaGFuZ2VkLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29t L09jdGFjaHJvbi90ZW5zb3JpdHkvYmxvYi9tYXN0ZXIvcHB4L3BweF90ZW5zb3JpdHkubWwiPnRl bnNvcml0eTwvYT4gaXMgcmVpbnRlcnByZXRpbmcgb3BlcmF0b3JzIGdsb2JhbGx5Lg0KPC9saT48 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2NyYWZmL3BhY29tYi9ibG9iL21hc3Rlci9w cHgvcHB4X3BhY29tYi5tbCI+cGFjb21iPC9hPiBpcyBhbiBleGFtcGxlIG9mIOKAnG1hcHBlcnPi gJ0sIGFwcGx5aW5nIG1hdGNoaW5nIGNoYW5nZXMgYW55d2hlcmUgaW4gdGhlIGV4cHJlc3Npb24u DQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iNiI+U3RyYW1vbiAwLjMuMCAt IFByb2Nlc3MgYmVoYXZpb3IgbW9uaXRvcmluZyB1dGlsaXR5IGJhc2VkIG9uIHN0cmFjZTwvaDI+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtNiI+DQo8cD5BcmNoaXZlOiA8 YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXN0cmFtb24tMC0zLTAtcHJv Y2Vzcy1iZWhhdmlvci1tb25pdG9yaW5nLXV0aWxpdHktYmFzZWQtb24tc3RyYWNlLzExMzM1LzEi Pg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zdHJhbW9uLTAtMy0wLXByb2Nlc3Mt YmVoYXZpb3ItbW9uaXRvcmluZy11dGlsaXR5LWJhc2VkLW9uLXN0cmFjZS8xMTMzNS8xPC9hPg0K PC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmcyYzI3OTBkIiBjbGFz cz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnMmMyNzkwZCI+RGFycmVuIGFubm91bmNlZDwvaDM+ DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnMmMyNzkwZCI+DQo8cD5J IGFtIGhhcHB5IHRvIGFubm91bmNlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9kYXJyZW5s ZGwvc3RyYW1vbiI+U3RyYW1vbjwvYT4gMC4zLjAsIHdoaWNoIG5vdyBoYXMgcGlkIGFuZCBjb21t YW5kIHRyYWNraW5nLg0KPC9wPg0KPHA+U3RyYW1vbiBpbnZva2VzIHN0cmFjZSB1bmRlcm5lYXRo LCBhbmFseXplcyB0aGUgb3V0cHV0IGFuZCBzdW1tYXJpemUgdGhlIGZpbmRpbmdzIGludG8gYSBK U09OIGZpbGUgd2hlbiB0aGUgY29tbWFuZCBmaW5pc2hlcy4NCjwvcD4NCjxwPkFuIGV4YW1wbGUg SlNPTiBjcmVhdGVkIGJ5IHJ1bm5pbmcgRmlyZWZveCB2aWEgU3RyYW1vbiBjYW4gYmUgc2VlbiA8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGFycmVubGRsL3N0cmFtb24vYmxvYi9tYWluL2V4 YW1wbGVzL2ZpcmVmb3guanNvbiI+DQpoZXJlPC9hPi4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwv ZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMTJjOWVmYSIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9Im9yZzEyYzllZmEiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0 bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LW9yZzEyYzllZmEiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBt aXNzIGEgQ1dOLCB5b3UgY2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmciPg0Kc2VuZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLyI+DQp0aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwv YT4uDQo8L3A+DQo8cD5JZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBi eSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZSA8YSBocmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3Jn L2xpc3RpbmZvL2NhbWwtbmV3cy13ZWVrbHkvIj4NCm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xh c3M9ImF1dGhvcm5hbWUiIGlkPSJvcmc1OGNiMDUwIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+ DQo8L2Rpdj4NCjwvZGl2Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 31 Jan 2023 06:45:59 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 31 Jan 2023 06:45:59 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 31 Jan 2023 06:45:59 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30V6jEZo025523 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 31 Jan 2023 06:45:14 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30V6j5fe025507 for ; Tue, 31 Jan 2023 06:45:05 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 31 Jan 2023 07:45:03 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9CC55E745F; Tue, 31 Jan 2023 07:45:01 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id A5613E743E for ; Tue, 31 Jan 2023 07:44:56 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Jan 2023 07:44:35 +0100 Received: from TM.local (unknown [109.190.253.14]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B5B5156069E; Tue, 31 Jan 2023 07:44:32 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZNT+teqfD6KXmHEqOrxN1Dt/nkw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 31 Jan 2023 06:44:31 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: b7a1587e-fe7d-4888-9842-08db0356cfde X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,259,1669071600"; d="scan'208,217";a="46427459" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499493, queueID=68FA35606A8 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 OCaml Weekly News

    OCaml Weekly News

    Previous We= ek Up Next We= ek

    Hello

    Here is the latest OCaml Weekly News, for the week of January 24 to 31, = 2023.

    Stramon 0.2.2 - Process behavior monitoring utility based on s= trace

    Darren announced

    I=92m happy to announce Stramon (right now mainly distributed as statically built binary here).

    Stramon is primarily created to make usage of strace and the analysis of= strace output easier.

    Stramon invokes strace underneath, analyzes the piped output and summari= zes the findings into a JSON file when the command finishes.

    An example JSON created by running Firefox via Stramon can be seen here. (Network access section is trimmed.)

    Diskuv OCaml 1.2.0 (Windows, MSVC)

    jbeckford announced

    There is a new release of the Diskuv OCaml installer available for Windo= ws users at https://github.com/diskuv/dkml-installer-ocaml/releases/tag/v1.2.0.= It contains critical changes that were blocking some Windows users from co= mpleting the install, and some performance improvements thanks in large part to @edwin. The release notes have been r= eproduced immediately below. It will be available using winget install Diskuv.OCaml in a week or so.

    Upgrading? First uninstall the old Diskuv OCaml version using =93= Add or remove programs=94 in the Control Panel.

    Callout to VirtualBox users: You=92ll need a workaround for a not-yet backported FMA fix by doing the following in a PowerShell ter= minal inside VirtualBox before running the installer:

    mkdir "$env:ProgramData\DiskuvOCaml\conf\"
    Set-Content -Path "$env:ProgramData\DiskuvOCaml\conf\ocamlcompiler.sex=
    p" -Value "((feature_flag_imprecise_c99_float_ops))"
    

    Critical changes:

    • Switch from the official MSYS2 msys2-base install, plus a = set of MSYS2 Internet updates, to a standalone msys2-dkml-base that has all the MSYS2 packages needed during installat= ion. That removes the Internet, GPG keys, proxies, etc. as a source of fail= ures during the MSYS2 sub-installation.
    • Special handling for Scoop package manager on Windows which coming= les a conflicting bash.exe and git.exe in the same directory. A prior scoop install git should no longer present a problem during in= stallation.
    • Fixed: No longer need to do opam pin remove ... to in= stall merlin and ocaml-lsp.

    Performance improvements:

    • Plumb the number of cpus to the compiler jobs. [@edwin]
    • Skip o= ver cross-compiling support when no target ABIs specified.
    • Overall= shaved ~15 minutes from installation on a 3-CPU machine (80m instead of 95= m), with additional savings if you have more CPUs. Timings in https://gi= thub.com/diskuv/dkml-runtime-common/pull/1

    Open source help wanted:

    • Byte-code only installation. That will be fast and simple and light, an= d is likely the best option for students. The existing installer already sh= ips with a functioning ocamlrun and standard library, and is =93component=94-based so= pieces can be added or removed. No Visual Studio, no MSYS2, no spending ti= me compiling code during installation. However a shim would need to be deve= loped so that ocaml, ocamlc, utop, etc. work witho= ut setting required OCaml environment variables. Almost all of this new byt= e-code only installation can be developed on macOS or Linux. If you would l= ike to contribute post your github username on https://github.com/diskuv/dkml-installer-ocaml/issues/35

    Component upgrades:

    • Bump utop from 2.9.0 to 2.10.0.
    • ocur= rent ocaml/opam CI Docker image (a source of pins) updated from 2022-02-28 = to 2022-11-22; numerous pins updated.

    Bug fixes:

    • dkml-runtime-common-native works with spaces in the Window= s home directory
    • Removed incorrect ptime.0.8.6 pin during dkml i= nit; now ptime.1.1.0

    Doc fixes:

    • Create dune-project in Beyond Basics documentation alongsi= de existing dune init exe to adhere to Dune 3.x behavior. (Dune 3.6 was ad= ded in DKML 1.1.0)

    Deprecations:

    • The dkml --build-type build type option will be removed ne= xt release. It was originally created for Linux builds (perf and AFL varian= ts), and can be resurrected and simplified if and when Linux support is add= ed.

    Internal changes:

    • Added Jane Street=92s base package to global utop. In particular, base is now part of the dkml switch created durin= g installation. core is too expensive (52 packages) to install automaticall= y, but you can install utop and core in your own switch. For now this i= s not that useful. The lib/stublibs directory of the dkml switch needs t= o be in the PATH for #require "base";; to work in global utop. That would help readers of the Real World OCaml book. A future release w= ill automate the PATH change.
    • Removed digestif.1.1.2+msvc pin since MSVC change= s upstreamed to 1.1.3.
    • The bytecode *.bc embedded in the installer is compil= ed with 4.14.0 and its embedded runtime is also 4.14.0.
    • When using opam option setenv+=3D stop removing t= he environment file to force a rebuild of the environment.
    • Pin omd.1.3.1
    • Print timestamp for many loggi= ng operations to aid performance comparisons

    Patches:

    Simple installation of packages without network

    Anthony Scemama announced

    I have access to machines that don=92t allow me to download anything fro= m the web, so I had difficulties installing software with Opam. With the he= lp of Raja from OCamlPro, I came to a practical solution that solved my pro= blem, and I turned it into a script: https://github.com/scemama/= OpamPack It is a simple script that makes a tar.gz on your local machin= e with all the dependencies you need, and then you can copy the tar.gz o the remote isolated machine and install everything us= ing Opam without needing the network.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I=92ll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 24 Jan 2023 08:58:18 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 24 Jan 2023 08:58:18 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 24 Jan 2023 08:58:18 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30O8vYNd014206 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 24 Jan 2023 08:57:34 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30O8vMT0014189 for ; Tue, 24 Jan 2023 08:57:23 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Jan 2023 09:57:21 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7A028E7357; Tue, 24 Jan 2023 09:57:21 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CE98DE0076 for ; Tue, 24 Jan 2023 09:57:15 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jan 2023 09:57:02 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 6B7A35646B4; Tue, 24 Jan 2023 09:57:01 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZL9IAAzN1xiAtC0KRGansvXv78Q== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 24 Jan 2023 08:57:00 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: bc389373-d244-4bc6-d814-08dafde92325 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,242,1669071600"; d="scan'208,217";a="89109183" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499917, queueID=CF5BE5646B7 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMy0wMS0yNCBUdWUgMDk6NTYgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjMuMDEuMTcuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMy4wMS4zMS5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIEphbnVhcnkgMTcgdG8gMjQsIDIwMjMuIDwv cD4NCjxkaXYgaWQ9InRhYmxlLW9mLWNvbnRlbnRzIiByb2xlPSJkb2MtdG9jIj4NCjxoMj5UYWJs ZSBvZiBDb250ZW50czwvaDI+DQo8ZGl2IGlkPSJ0ZXh0LXRhYmxlLW9mLWNvbnRlbnRzIiByb2xl PSJkb2MtdG9jIj4NCjx1bD4NCjxsaT48YSBocmVmPSIjMSI+VGhlIEdyb3d0aCBvZiB0aGUgT0Nh bWwgKEJpbmFyeSkgRGlzdHJpYnV0aW9uPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjMiI+T2NhbWwg NS4wLjAgaW4gUHlyZSAtIG1vc3RseSBzbW9vdGggc2FpbGluZywgR2Muc3RhdCByZWdyZXNzaW9u PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzMiPkFkb3B0aW5nIHRoZSBPQ2FtbCBDb2RlIG9mIENv bmR1Y3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM0Ij5Fc3BlcmFudG8sIHdoZW4gT0NhbWwgbWVl dHMgQ29zbW9wb2xpdGFuPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNSI+TG9va2luZyBmb3IgUGFy dGljaXBhbnRzIGZvciBVc2VyIFN1cnZleSBvbiBvY2FtbC5vcmcgUGFja2FnZSBEb2N1bWVudGF0 aW9uIGFuZCBMZWFybiBBcmVhPC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzYiPk9DYW1sIFNvZnR3 YXJlIEZvdW5kYXRpb246IEphbnVhcnkgMjAyMyB1cGRhdGU8L2E+IDwvbGk+PGxpPjxhIGhyZWY9 IiM3Ij5BbiBFbWFjcyBtb2RlIGZvciBDcmFtIHRlc3RzPC9hPiA8L2xpPjxsaT48YSBocmVmPSIj OCI+VGFraW5nIGEgbG9vazogc29tZSBvcGVuIE9DYW1sIFB1bGwgUmVxdWVzdHM8L2E+IDwvbGk+ PGxpPjxhIGhyZWY9IiM5Ij5vZGVwIGluaXRpYWwgcmVsZWFzZTwvYT4gPC9saT48bGk+PGEgaHJl Zj0iI29yZ2Q1MjNhMzgiPk9sZCBDV048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MSI+VGhlIEdyb3d0aCBvZiB0aGUgT0NhbWwgKEJpbmFyeSkgRGlzdHJpYnV0aW9uPC9oMj4NCjxk aXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC0xIj4NCjxwPkFyY2hpdmU6IDxhIGhy ZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ibG9nLXRoZS1ncm93dGgtb2YtdGhlLW9j YW1sLWJpbmFyeS1kaXN0cmlidXRpb24vMTEyMDIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYmxvZy10aGUtZ3Jvd3RoLW9mLXRoZS1vY2FtbC1iaW5hcnktZGlzdHJpYnV0aW9uLzEx MjAyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2Qx N2RmOTkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdkMTdkZjk5Ij5GYWJyaWNlIExl IEZlc3NhbnQgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0i dGV4dC1vcmdkMTdkZjk5Ij4NCjxwPkhlcmUgaXMgYSBibG9nIHBvc3QgdGhhdCBJIHdyb3RlIHJl Y2VudGx5LCBhYm91dCB0aGUgaW5jcmVhc2Ugb2YgdGhlIHNpemUgb2YgdGhlIE9DYW1sIERpc3Ry aWJ1dGlvbiBvdmVyIHRoZSByZWNlbnQgeWVhcnM6DQo8L3A+DQo8cD48YSBocmVmPSJodHRwczov L29jYW1scHJvLmNvbS9ibG9nLzIwMjNfMDFfMDJfb2NhbWxfZGlzdHJpYnV0aW9uIj5odHRwczov L29jYW1scHJvLmNvbS9ibG9nLzIwMjNfMDFfMDJfb2NhbWxfZGlzdHJpYnV0aW9uPC9hPg0KPC9w Pg0KPHA+SG9wZSBpdCBjYW4gYmUgaW50ZXJlc3RpbmcgdG8gcmVhZCAhIDwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTIiIGNsYXNzPSJvdXRs aW5lLTIiPg0KPGgyIGlkPSIyIj5PY2FtbCA1LjAuMCBpbiBQeXJlIC0gbW9zdGx5IHNtb290aCBz YWlsaW5nLCBHYy5zdGF0IHJlZ3Jlc3Npb248L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTIiIGlkPSJ0ZXh0LTIiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L29jYW1sLTUtMC0wLWluLXB5cmUtbW9zdGx5LXNtb290aC1zYWlsaW5nLWdjLXN0 YXQtcmVncmVzc2lvbi8xMTIwNS8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2Ft bC01LTAtMC1pbi1weXJlLW1vc3RseS1zbW9vdGgtc2FpbGluZy1nYy1zdGF0LXJlZ3Jlc3Npb24v MTEyMDUvMTwvYT4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3Jn NzQ5M2JmYyIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzc0OTNiZmMiPlN0ZXZlbiBU cm94bGVyIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRl eHQtb3JnNzQ5M2JmYyI+DQo8cD5QeXJlIHJlY2VudGx5IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHVi LmNvbS9mYWNlYm9vay9weXJlLWNoZWNrL2NvbW1pdC9kMTBkZWM0M2NjZDE0ODk2NTdkMzMyNTg5 OGNlYzM1MDhkNDVkNDdlIj4NCnN3aXRjaGVkIG91ciBiYWNrZW5kIGJ1aWxkIHRvIE9jYW1sIDUu MC4wPC9hPi4gPC9wPg0KPHA+SXQgd2FzIGEgc21vb3RoIHN3aXRjaCBmb3IgdGhlIG1vc3QgcGFy dC4gSSBrbm93IGEgbG90IG9mIHdvcmsgd2VudCBpbnRvIHRoaXMgYW5kIHdlIGFwcHJlY2lhdGUg aXQhDQo8L3A+DQo8cD5XZSBkaWQgbm90aWNlIG9uZSBzdXJwcmlzaW5nIHJlZ3Jlc3Npb24gLSB3 ZSBoYWQgdG8gcmVtb3ZlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9mYWNlYm9vay9weXJl LWNoZWNrL2NvbW1pdC85MWViYTYzMTQ3ZDIwMmZkMjcyYzE1ZDAxZGEwZDM5YzNjMWE3MWZjIj4N CmEgY2FsbCB0byBHYy5zdGF0PC9hPiB0aGF0IHdlIGhhZCBmb3IgdGVsZW1ldHJ5IHRyYWNraW5n LiA8L3A+DQo8cD5UaGUgcHJvYmxlbSB3YXMgdGhhdCB3aGVuIHdlIHR5cGUtY2hlY2tlZCBvdXIg bGFyZ2VzdCBQeXRob24gY29kZWJhc2UsIHRoYXQgY2FsbCB3YXMgdGFraW5nIG1vcmUgdGhhbiA1 MCBzZWNvbmRzIChpbiA0LjE0LCB0aGUgc2FtZSBjYWxsIHRvb2sgd2VsbCB1bmRlciAxIHNlY29u ZCkuDQo8L3A+DQo8cD5BZnRlciBhc2tpbmcgYXJvdW5kIHdl4oCZdmUgbGVhcm5lZCB0aGF0OiA8 L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+dGhlIEdjLnN0YXQgaW1wbGVtZW50YXRpb24g ZGlkIGNoYW5nZSBhbmQgc29tZSByZWdyZXNzaW9uIGlzIGV4cGVjdGVkIDwvbGk+PGxpPndlIHNo b3VsZCBoYXZlIGJlZW4gdXNpbmcgR2MucXVpY2tfc3RhdCBhbnl3YXksIHdoaWNoIGlzIGEgY2hh bmdlIEnigJlsbCBtYWtlIHNvb24NCjwvbGk+PC91bD4NCjxwPk5vbmV0aGVsZXNzIHdlIHRob3Vn aHQgaXQgbWlnaHQgYmUgZ29vZCB0byByZXBvcnQgdGhpcyBpbiBjYXNlIHRoZSBzbG93bmVzcyB3 ZSBleHBlcmllbmNlZCBjb21lcyBhcyBhIHN1cnByaXNlLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4N CjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItMyIgY2xhc3M9Im91dGxpbmUtMiI+ DQo8aDIgaWQ9IjMiPkFkb3B0aW5nIHRoZSBPQ2FtbCBDb2RlIG9mIENvbmR1Y3Q8L2gyPg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0KPHA+QXJjaGl2ZTogPGEgaHJl Zj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fkb3B0aW5nLXRoZS1vY2FtbC1jb2RlLW9m LWNvbmR1Y3QvMTA4NzAvMiI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYWRvcHRpbmct dGhlLW9jYW1sLWNvZGUtb2YtY29uZHVjdC8xMDg3MC8yPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzg4MTY3YmMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmc4ODE2N2JjIj5TdWRoYSBQYXJpbWFsYSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzg4MTY3YmMiPg0KPHA+TGV04oCZcyB1c2Ug dGhpcyB0aHJlYWQgdG8gdHJhY2sgcHJvZ3Jlc3Mgb2YgdGhlIHZhcmlvdXMgcHJvamVjdHMgYWRv cHRpbmcgdGhpcyBDb2RlIG9mIENvbmR1Y3QuIFNvIGZhciwgaXQgaGFzIGJlZW4gYWRvcHRlZCBi eSB0aGUgZm9sbG93aW5nIHByb2plY3RzOg0KPC9wPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxp PjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzExNzYxIj5vY2Ft bC9vY2FtbDwvYT4gPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvcHVsbC82ODc1Ij5vY2FtbC9kdW5lPC9hPiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzU0MTkiPm9jYW1sL29wYW08L2E+IDwvbGk+PC91bD4N CjxwPkdpdEh1YiBoYXMgYSBuaWNlIGljb24gdG8gaW5kaWNhdGUgaXQgLSA8L3A+DQo8ZGl2IGlk PSJvcmcwNmIyYmY1IiBjbGFzcz0iZmlndXJlIj4NCjxwPjxpbWcgc3JjPSJodHRwczovL2dsb2Jh bC5kaXNjb3Vyc2UtY2RuLmNvbS9idXNpbmVzczcvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9j L2M0YWU2MmNhYjU1NTUzMWU2Mzc0MGQ1YTY5NDljYzY4Y2VkYTEwM2UuZ2lmIiBhbHQ9ImM0YWU2 MmNhYjU1NTUzMWU2Mzc0MGQ1YTY5NDljYzY4Y2VkYTEwM2UuZ2lmIj4NCjwvcD4NCjwvZGl2Pg0K PC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNCIgY2xh c3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjQiPkVzcGVyYW50bywgd2hlbiBPQ2FtbCBtZWV0cyBD b3Ntb3BvbGl0YW48L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTQi Pg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1l c3BlcmFudG8td2hlbi1vY2FtbC1tZWV0cy1jb3Ntb3BvbGl0YW4vMTA1MDEvMyI+DQpodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWVzcGVyYW50by13aGVuLW9jYW1sLW1lZXRzLWNvc21v cG9saXRhbi8xMDUwMS8zPC9hPg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmc1NjI2ZjZjIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnNTYyNmY2YyI+ Q2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTMiIGlkPSJ0ZXh0LW9yZzU2MjZmNmMiPg0KPHA+QWZ0ZXIgYSBsb25nIHRpbWUsIEVzcGVy YW50byA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJlL2VzcGVyYW50by9yZWxl YXNlcy90YWcvdjAuMC4yIj4NCndhcyB1cGdyYWRlZDwvYT4gd2l0aCB0aGUgbGFzdCB2ZXJzaW9u IG9mIENvc21vcG9saXRhbiB3aGljaCBpbmNsdWRlcyA8Y29kZT50aHJlYWRzLmNteGE8L2NvZGU+ IG5vdy4gQSBQUiBvbg0KPGNvZGU+bHd0PC9jb2RlPiAodG8gc3VwcG9ydCBFc3BlcmFudG8pIDxh IGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC9wdWxsLzk0NSI+DQppcyBwZW5k aW5nPC9hPiBidXQgd2UgZm91bmQgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvaXNzdWVzLzY4NDMiPmFuIGlzc3VlPC9hPiB3aXRoDQo8Y29kZT5kdW5lPC9jb2RlPiB3aGVu IHdlIHRyaWVkIHRvIGNvbXBpbGUgYSBzbWFsbCBwcm9ncmFtLiBUaGlzIHBhdmVzIHRoZSB3YXkg Zm9yIE9DYW1sIDUgYnV0LCBpbiB0aGUgbWVhbnRpbWUsIG1vc3QgT0NhbWwgYXBwbGljYXRpb25z IGNhbiBiZSBjb21waWxlZCB3aXRoIHRoaXMgbmV3IHRvb2xjaGFpbiAoaWYgdGhlIEMgZmlsZXMg YXJlIG5vdCB0b28gZmFuY3kpLiBBIHNhbXBsZSBhcHBsaWNhdGlvbiBpcyBjdXJyZW50bHkgYXZh aWxhYmxlDQogaGVyZTogPGEgaHJlZj0iaHR0cHM6Ly9ib2Iub3NhdS5yZSI+Qm9iPC9hPi4gWW91 IGNhbiBhbHNvIHNlZSB0aGUgcmVwcm9kdWNpYmlsaXR5IG9mIHRoZSBzb2Z0d2FyZQ0KPGEgaHJl Zj0iaHR0cHM6Ly9idWlsZHMub3NhdS5yZS9qb2IvYm9iL2J1aWxkL2FjMjBkZmNlLTU4YjUtNGI4 MS05ZTUzLTRmZDExZjQ4NDA2NCI+DQpoZXJlPC9hPiAoPGEgaHJlZj0iaHR0cHM6Ly9ibG9nLm9z YXUucmUvYXJ0aWNsZXMvcmVwcm9kdWNpYmxlLmh0bWwiPmhlcmU8L2E+IGlzIGFuIGFydGljbGUg Zm9yIG1vcmUgaW5mb3JtYXRpb24pLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRp diBpZD0ib3V0bGluZS1jb250YWluZXItNSIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjUi Pkxvb2tpbmcgZm9yIFBhcnRpY2lwYW50cyBmb3IgVXNlciBTdXJ2ZXkgb24gb2NhbWwub3JnIFBh Y2thZ2UgRG9jdW1lbnRhdGlvbiBhbmQgTGVhcm4gQXJlYTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRs aW5lLXRleHQtMiIgaWQ9InRleHQtNSI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvbG9va2luZy1mb3ItcGFydGljaXBhbnRzLWZvci11c2VyLXN1cnZl eS1vbi1vY2FtbC1vcmctcGFja2FnZS1kb2N1bWVudGF0aW9uLWFuZC1sZWFybi1hcmVhLzExMTI4 LzM2Ij4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9sb29raW5nLWZvci1wYXJ0aWNpcGFu dHMtZm9yLXVzZXItc3VydmV5LW9uLW9jYW1sLW9yZy1wYWNrYWdlLWRvY3VtZW50YXRpb24tYW5k LWxlYXJuLWFyZWEvMTExMjgvMzY8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUt Y29udGFpbmVyLW9yZ2MyOWI0YzUiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmdjMjli NGM1Ij5TYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC0zIiBpZD0idGV4dC1vcmdjMjliNGM1Ij4NCjxwPkhlcmXigJlzIHRoZSBwcm9taXNlZCB1 cGRhdGUgb24gd2hhdCBraW5kIG9mIGZlZWRiYWNrIHdlIGdvdCBvdXQgb2YgdGhlIHVzZXIgc3Vy dmV5LiBJIHRyaWVkIHRvIGRpc3RpbGwgYXMgYmVzdCBhcyBJIGNvdWxkLCB0aGVyZSB3YXMgc28g bXVjaCBmZWVkYmFjayEgOikNCjwvcD4NCjxwPldlIGhhdmUgcmVzcG9uc2VzIGZyb20gMjAgcGVv cGxlIGluIHRvdGFsLCBhbmQgYSBsb3Qgb2YgdGhvc2UgaGF2ZSB2b2x1bnRlZXJlZCB0byBiZSBp bnRlcnZpZXdlZCBieSBDbGFpcmUuIFNvIHRoaXMgaXMgZXhjZWxsZW50ISBJbiB0aGUgaW50ZXJl c3Qgb2YgZ2V0dGluZyBhIGdvb2Qgb3ZlcnZpZXcgb2YgdGhlIHVzZXJiYXNlLCBDbGFpcmUgd2ls bCBzZWxlY3QgcGVvcGxlIGFuZCBzZW5kIG91dCBpbnZpdGVzLg0KPC9wPg0KPC9kaXY+DQo8ZGl2 IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc5MzI0OWVhIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxo NCBpZD0ib3JnOTMyNDllYSI+U3VtbWFyeTo8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0 LTQiIGlkPSJ0ZXh0LW9yZzkzMjQ5ZWEiPg0KPHA+MTcgcGVvcGxlIGFyZSB1c2luZyBPQ2FtbCBm b3IgcGVyc29uYWwgcHJvamVjdHMsIDcgZm9yIGJ1c2luZXNzIHB1cnBvc2VzLCBhbmQgNiB1c2Ug T0NhbWwgZm9yIHJlc2VhcmNoIHB1cnBvc2VzLg0KPC9wPg0KPHA+V2UgaGF2ZSBhIGdvb2QgbWl4 IG9mIGp1bmlvciBhbmQgc2VuaW9yIHNvZnR3YXJlIGRldmVsb3BtZW50IGFuZCByZXNlYXJjaCBy b2xlcywgYXMgd2VsbCBhcyBvcmdhbmlzYXRpb25zIG9mIHZhcnlpbmcgc2l6ZXMgYW5kIGEgYnJv YWQgbWl4IG9mIHRhc2tzIHBlb3BsZSB3b3JrIG9uLiBJIGRvIG5vdCBsaXN0IHRoZXNlIGluZGl2 aWR1YWxseS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc0YzQwODBkIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnNGM0MDgwZCI+UGFp biBwb2ludHMgLyBwYWNrYWdlIGRvY3VtZW50YXRpb246PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc0YzQwODBkIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5NaXNzaW5nIGNvbnRlbnQgZnJvbSBvZG9jLWdlbmVyYXRlZCBwYWNrYWdlIGRvY3VtZW50YXRp b246IHByZWFtYmxlLCBpbWFnZXMsIGd1aWRlcy90dXRvcmlhbHMgbm90IHZpc2libGUgb24gdGhl IG5hdmlnYXRpb24NCjwvbGk+PGxpPkxhY2sgb2Ygc2VhcmNoIC8gaW5kZXhlZCBuYXZpZ2F0aW9u IDwvbGk+PGxpPk5lZWQgdG8gYmUgYWJsZSB0byBsaW5rIHRvIHRoZSBsYXRlc3QgdmVyc2lvbiBv ZiBhIHBhY2thZ2UgdG8gd3JpdGUgZ29vZCBwYWNrYWdlIGRvY3VtZW50YXRpb24gaW4gUkVBRE1F cw0KPC9saT48bGk+UHJvYmxlbXMgd2l0aCB0aGUgcmVuZGVyaW5nIG9mIGRvY3VtZW50YXRpb24g b2YgbW9kdWxlcyBpbmNsdWRlZCB3aXRoaW4gYW5vdGhlciBtb2R1bGUuDQo8L2xpPjxsaT5Qcm9i bGVtcyB3aXRoIHdoaXRlIHNwYWNlLCBmb250IHNpemUsIGxheW91dCBhbmQgY29sb3IsIGFuZCBh Y2Nlc3NpYmlsaXR5IGUuZy4gc2NhbGluZyB1cCB0aGUgcGFnZSBnaXZlcyB0aGUgbW9iaWxlIGxh eW91dA0KPC9saT48bGk+RG9jdW1lbnRhdGlvbiBsaW5rIG9uIHBhY2thZ2Ugb3ZlciB2aWV3IHBh Z2UgaXMgaGFyZCB0byBzcG90IDwvbGk+PGxpPkxhY2sgb2Yg4oCcanVtcCB0byBzb3VyY2UgY29k ZeKAnS1saW5rcyA8L2xpPjxsaT5MYWNrIG9mIHByb3BlciBkYXJrIG1vZGUgPC9saT48bGk+TGFj ayBvZiBzeW50YXggaGlnaGxpZ2h0aW5nIGZvciBPQ2FtbCBjb2RlIGluIHRoZSB0ZXh0IC0gYXV0 aG9ycyB3b3VsZCBiZSBtb3JlIGVuY291cmFnZWQgdG8gYWRkIGV4YW1wbGVzIGlmIHRoZXkgcmVu ZGVyZWQgYmVhdXRpZnVsbHkNCjwvbGk+PGxpPlRyZWUgdmlldyBjYW4gZ2V0IHZlcnkgYnVzeSBm b3IgcGFja2FnZXMgd2l0aCBsb3RzIG9mIGl0ZW1zIDwvbGk+PC91bD4NCjwvZGl2Pg0KPHVsIGNs YXNzPSJvcmctdWwiPg0KPGxpPjxhIGlkPSJvcmc4NzcwM2RlIj48L2E+SWRlYXMvc3VnZ2VzdGlv bnMgcGFja2FnZSBkb2N1bWVudGF0aW9uOjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01 IiBpZD0idGV4dC1vcmc4NzcwM2RlIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5UcmVlIG5h dmlnYXRpb24gc2hvdWxkIGJlIGltcHJvdmVkLCBlLmcuIGxpYnJhcnkgdnMgdG9wbGV2ZWwgbW9k dWxlIHNob3VsZCBiZSBjb25zb2xpZGF0ZWQsIGhpZGluZyBvdGhlciBsaWJyYXJpZXMgd2hlbiBn b2luZyBkb3duIGludG8gYSBtb2R1bGUgc2hvdWxkIGJlIHJlbW92ZWQNCjwvbGk+PGxpPkluZGV4 IGZvciBkZWNsYXJhdGlvbnMgKHZhbHVlcywgdHlwZXMsIGV4Y2VwdGlvbnMsIGV0Yy4pIG9mIGEg bW9kdWxlIGNvdWxkIGJlIGRpc3BsYXllZCBpbiBwbGFjZSBvZiB0aGUgZW1wdHkgVE9DIC8gYXBw ZW5kZWQgdG8gdGhlIFRPQw0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3Jn MDZjNmM5ZiI+PC9hPlByb2JsZW1zIHdpdGggY29udGVudCBhbmQgZG9jdW1lbnRhdGlvbiB3cml0 aW5nIGV4cGVyaWVuY2U6PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0 LW9yZzA2YzZjOWYiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPkxhY2sgb2YgZXhhbXBsZSBj b2RlLCBxdWFsaXR5IG9mIGRvY3VtZW50YXRpb24gb24gcGFja2FnZSBkb2NzIGRpc3BsYXllZCBv biBvY2FtbC5vcmcNCjwvbGk+PGxpPlVJL1VYIG9mIG9kb2MgZm9yIHdyaXRpbmcgcGFja2FnZSBk b2N1bWVudGF0aW9uIGNvdWxkIGJlIGltcHJvdmVkIDwvbGk+PGxpPmhhcmQgdG8gaW5jb3Jwb3Jh dGUgb2NhbWxkb2MgYW5kIG1hcmtkb3duIHdoZW4gd3JpdGluZyBkb2N1bWVudGF0aW9uIDwvbGk+ PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmcyNWQ3OGU2IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMjVkNzhlNiI+ V29ya2Fyb3VuZHMgLyBwYWNrYWdlIGRvY3VtZW50YXRpb246PC9oND4NCjxkaXYgY2xhc3M9Im91 dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcyNWQ3OGU2Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4N CjxsaT5pbnNwZWN0IHNvdXJjZSBjb2RlIDwvbGk+PGxpPm9kaWcsIHNoZXJsb2NvZGUuY29tLCBv cGFtIGdyZXAgPC9saT48bGk+bG9vayBhdCBwYWNrYWdl4oCZcyB0ZXN0cyA8L2xpPjxsaT5zZWFy Y2ggaW4gZm9ydW1zLCBTdGFja092ZXJmbG93LCBsb29rIGZvciBsaW5rcyB0byBwYWNrYWdlIGF1 dGhvcuKAmXMgZG9jdW1lbnRhdGlvbiBzaXRlIGluIHBhY2thZ2XigJlzIHB1YmxpYyBnaXQgcmVw b3NpdG9yeQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzYyYTk4YzYiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmc2MmE5OGM2 Ij5QYWluIHBvaW50cyAvIGxlYXJuaW5nIHNlY3Rpb246PC9oND4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC00IiBpZD0idGV4dC1vcmc2MmE5OGM2Ij4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxs aT5MYXlvdXQvc2Nyb2xsIHByb2JsZW1zIG9uIDxhIGhyZWY9Imh0dHBzOi8vb2NhbWwub3JnL2Rv YyI+aHR0cHM6Ly9vY2FtbC5vcmcvZG9jPC9hPi4gUGVvcGxlIG5lZWQgdG8gc2Nyb2xsIHRvbyBt dWNoIHRvIHNlZSB0aGUgY29udGVudC4gU2Nyb2xsaW5nIGRvd24gdGhlIHBhZ2UgZG9lcyBub3Qg c2hvdyB0aGUgdHV0b3JpYWxzIGFuZCBndWlkZXMgc2VjdGlvbiwgc2Nyb2xsaW5nIGRvd24gdGhl IG5hdmJhciBvbiB0aGUgbGVmdCBpdCBpcyBoYXJkDQogdG8gc2Nyb2xsIGRvd24gdG8g4oCcY29t bW9uIGVycm9yIG1lc3NhZ2Vz4oCdLCDigJxiZXN0IHByYWN0aWNlc+KAnSBhbmQg4oCcT0NhbWwg cGxhdGZvcm3igJ0NCjwvbGk+PGxpPkFjY2Vzc2liaWxpdHkgcHJvYmxlbXMgdy92aXN1YWwgY29u dHJhc3QgPC9saT48bGk+RGlmZmljdWx0eSBsZXZlbC9wcmVyZXF1aXNpdGVzIG9mIHR1dG9yaWFs cyBub3QgYWx3YXlzIGNsZWFyIDwvbGk+PGxpPkxhY2sgb2YgaW1wb3J0YW50IGNvbnRlbnQgKGUu Zy4g4oCcc2luZ2xlLXBhZ2Ugc3ludGF4IGludHJvZHVjdGlvbuKAnSwgZHVuZSBhbmQgb3BhbSBn dWlkZSwgdGFzay1vcmllbnRlZCBleGFtcGxlcyBmb3IgZGlmZmVyZW50IGxldmVscyBvZiBsYW5n dWFnZSBsZWFybmluZykNCjwvbGk+PGxpPlN0eWxpbmcgZGlmZmVyZW5jZSBiZXR3ZWVuIG1hbnVh bC9zdGRsaWIgQVBJIGFuZCBtYWluIHBhZ2VzIDwvbGk+PGxpPuKAnFN0YW5kYXJkIExpYnJhcnkg QVBJ4oCdIGxpbmsgZ29lcyB0byB0aGUgaW5kZXggaW5zdGVhZCBvZiB0byBDaGFwdGVyIDI4IG9m IHRoZSBPQ2FtbCBtYW51YWwgKG1hbnVhbCBnaXZlcyBhIG1vcmUgYWRlcXVhdGUgaW50cm9kdWN0 aW9uIHRvIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGZvciBiZWdpbm5lcnMgYW5kIGRvZXMgbm90IGV4 cG9zZSBpbnRlcm5hbCBmdW5jdGlvbnMgbGlrZSB0aGUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQg aW5kZXggZG9lcykNCjwvbGk+PGxpPlByb2JsZW1zIHdpdGggb3V0ZGF0ZWQgaW5mb3JtYXRpb24g PC9saT48L3VsPg0KPC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaWQ9Im9yZ2My ODJjZWMiPjwvYT5QYWluIHBvaW50cyBvdmVyYWxsOjxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUt dGV4dC01IiBpZD0idGV4dC1vcmdjMjgyY2VjIj4NCjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT5T aXRlIGRvZXNu4oCZdCBtb3RpdmF0ZSBwZW9wbGUgZW5vdWdoIHRvIHVzZSBPQ2FtbCBieSBzaG93 aW5nIGhvdyBPQ2FtbCBpcyBjb29sLCBpbnRlcmVzdGluZywgbmljZSB0byB1c2UgYW5kIGhvdyB1 c2luZyBpdCBtYWtlcyB5b3UgYSBiZXR0ZXIgcHJvZ3JhbW1lcg0KPC9saT48L3VsPg0KPC9kaXY+ DQo8L2xpPjxsaT48YSBpZD0ib3JnMGYyN2U0OSI+PC9hPklkZWFzL3N1Z2dlc3Rpb25zIGxlYXJu aW5nIHNlY3Rpb246PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9y ZzBmMjdlNDkiPg0KPHVsIGNsYXNzPSJvcmctdWwiPg0KPGxpPlRoZSBtb3JlIGJhc2ljIHNlY3Rp b25zLCBlLmcuIGlmIHN0YXRlbWVudHMsIHBvaW50ZXJzLCBjb3VsZCBiZSBtZXJnZWQgb3IgbWFk ZSBjb2xsYXBzaWJsZSB0byBtYWtlIGl0IGVhc2llciB0byBzZWUgYWxsIGl0ZW1zIG9uIHRoZSBz aWRlIG5hdmlnYXRpb24NCjwvbGk+PGxpPuKAnFBhcGVyc+KAnSBzZWN0aW9uIGlzIG5vdCBzbyBy ZWxldmFudCB0byBtb3N0IE9DYW1sIGJlZ2lubmVycyBhbmQgc2hvdWxkIGJlIG1vdmVkIGJlbG93 IOKAnEJvb2tz4oCdDQo8L2xpPjxsaT5IYXZlIGEg4oCcYmVnaW5uZXLigJ0v4oCcYWR2YW5jZWTi gJ0gdG9nZ2xlIGF0IHRoZSB0b3Agb2YgdGhlIGxlYXJuIHBhZ2UgdGhhdCBzd2l0Y2hlcyB0aGUg Y29udGVudCBhcmVhIHRvIGJlIHRhaWxvcmVkIGJldHRlciB0byB0aGUgZGlmZmVyZW50IHVzZSBj YXNlcw0KPC9saT48bGk+YWRkIG1vcmUgY29udGV4dCBvbiB3aG8gc2hvdWxkIHJlYWQgYSBwYXJ0 aWN1bGFyIGJvb2sgKGUuZy4gcHJlcmVxdWlzaXRlcywgdG9waWNzIGNvdmVyZWQpDQo8L2xpPjwv dWw+DQo8L2Rpdj4NCjwvbGk+PGxpPjxhIGlkPSJvcmdjMmYxNDJmIj48L2E+V29ya2Fyb3VuZHMg bGVhcm5pbmcgc2VjdGlvbjo8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRl eHQtb3JnYzJmMTQyZiI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+ZGlyZWN0bHkgZ28gdG8g dGhlIG1hbnVhbCA8L2xpPjxsaT5ib29rcywgYmxvZ3MsIG90aGVyIHNpdGVzIDwvbGk+PGxpPmFz ayBvbiBmb3J1bS9kaXNjb3JkL1N0YWNrT3ZlcmZsb3cgPC9saT48bGk+Y2hlY2sgb2NhbWx2ZXJz ZSA8L2xpPjwvdWw+DQo8cD5UYmgsIHRoaXMgdG9vayBhIGJpdCBsb25nZXIgdGhhbiBJIHRob3Vn aHQ6IHRoZXJlIGlzIHNvIG11Y2ggdXNlZnVsIGluZm8gaW4geW91ciBmZWVkYmFjayEgSSB3YW50 IHRvIGFkZCBsaW5rcyB0byBjb3JyZXNwb25kaW5nIGlzc3VlcywgYnV0IHRoaXMgd2lsbCBoYXZl IHRvIHdhaXQgdW50aWwgSSBlZGl0IHRoaXMgcG9zdCB0b21vcnJvdy4NCjwvcD4NCjwvZGl2Pg0K PC9saT48L3VsPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250 YWluZXItNiIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjYiPk9DYW1sIFNvZnR3YXJlIEZv dW5kYXRpb246IEphbnVhcnkgMjAyMyB1cGRhdGU8L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L29jYW1sLXNvZnR3YXJlLWZvdW5kYXRpb24tamFudWFyeS0yMDIzLXVwZGF0 ZS8xMTIxNy8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1zb2Z0d2FyZS1m b3VuZGF0aW9uLWphbnVhcnktMjAyMy11cGRhdGUvMTEyMTcvMTwvYT4NCjwvcD4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnNjAwY2IyYyIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZzYwMGNiMmMiPmdhc2NoZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzYwMGNiMmMiPg0KPHA+QSBxdWljayB1cGRhdGUg b24gcmVjZW50IHdvcmtzIG9mIHRoZSA8YSBocmVmPSJodHRwOi8vb2NhbWwtc2Yub3JnLyI+T0Nh bWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4uIEl0IGlzIGEgbm9uLXByb2ZpdCBmb3VuZGF0aW9u ICg8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXRoZS1vY2FtbC1zb2Z0 d2FyZS1mb3VuZGF0aW9uLzQ0NzYiPmVhcmxpZXIgdGhyZWFkPC9hPikgdGhhdCByZWNlaXZlcyBm dW5kaW5nIGZyb20NCjxhIGhyZWY9Imh0dHA6Ly9vY2FtbC1zZi5vcmcvI3Nwb25zb3JzIj5vdXIg aW5kdXN0cmlhbCBzcG9uc29yczwvYT4gZWFjaCB5ZWFyLCBhbmQgdHJpZXMgaXRzIGJlc3QgdG8g c3BlbmQgaXQgdG8gc3VwcG9ydCBhbmQgc3RyZW5ndGhlbiB0aGUgT0NhbWwgZWNvc3lzdGVtIGFu ZCBjb21tdW5pdHkuDQo8L3A+DQo8cD4oUHJldmlvdXMgdXBkYXRlOiA8YSBocmVmPSJodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtc29mdHdhcmUtZm91bmRhdGlvbi1zdW1tZXItMjAy Mi11cGRhdGUvMTAyMzQiPg0Kc3VtbWVyIDIwMjI8L2E+LikgPC9wPg0KPHA+VGhlIGZ1bmRpbmcg dm9sdW1lIHdlIHJlY2VpdmUgZWFjaCB5ZWFyIGlzIGFyb3VuZCAyMDBL4oKsLiAoRm9yIGNvbXBh cmlzb246IHRoaXMgaXMgdGhlIHllYXJseSBjb3N0IG9mIG9uZSBleHBlcmllbmNlZCBmdWxsLXRp bWUgc29mdHdhcmUgZW5naW5lZXIgaW4gbWFueSBwYXJ0cyBvZiB0aGUgd29ybGQuKSBXZSBkbyBu b3QgZnVuZCBwZW9wbGUgZnVsbC10aW1lIGZvciBsb25nIHBlcmlvZHMuIE1vc3QgYWN0aW9ucyBy ZWNlaXZlIGZyb20gM0vigqwNCiB0byAyMEvigqwuIFRoZSB3b3JrIHRvIHByZXBhcmUgYW5kIGV4 ZWN1dGUgYWN0aW9ucyBpcyBtb3N0bHkgZG9uZSBieSB0aGUgKHVucGFpZCkgPGEgaHJlZj0iaHR0 cDovL29jYW1sLXNmLm9yZy9hYm91dC11cy8iPg0KRXhlY3V0aXZlZSBDb21taXR0ZWU8L2E+LiBJ dCBpcyBjdXJyZW50bHkgZm9ybWVkIGJ5IE5pY29sw6FzIE9qZWRhIELDpHIgKOKAmW5vamLigJkp LCBEYW1pZW4gRG9saWdleiwgWGF2aWVyIExlcm95LCBLaW0gTmd1eeG7hW4sIEFsYW4gU2NobWl0 dCBhbmQgbXlzZWxmLCB3aXRoIGFkbWluaXN0cmF0aXZlIHBlcnNvbmVsIHByb3ZpZGVkIGJ5DQo8 YSBocmVmPSJodHRwczovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9GcmVuY2hfSW5zdGl0dXRlX2Zv cl9SZXNlYXJjaF9pbl9Db21wdXRlcl9TY2llbmNlX2FuZF9BdXRvbWF0aW9uIj4NCklOUklBPC9h Pi4gKEFsYW4gU2NobWl0dCBpcyBhIG5ldyBtZW1iZXIgdGhpcyB5ZWFyLCBoZSBhZ3JlZWQgdG8g d29yayBhcyBhbiDigJxpbnRlcmltIGRpcmVjdG9y4oCdIGZyb20gU2VwdGVtYmVyIHRvIE1hcmNo IHRvIHJlZHVjZSBteSBvd24gRm91bmRhdGlvbiB3b3JrbG9hZCBhIGJpdC4gVGhhbmtzIEFsYW4u KQ0KPC9wPg0KPHA+T3VyIGN1cnJlbnQgc3BvbnNvcnMgKHRoYW5rcyEpIGFyZSA8YSBocmVmPSJo dHRwczovL2FocmVmcy5jb20vIj5haHJlZnM8L2E+LCA8YSBocmVmPSJodHRwczovL2phbmVzdHJl ZXQuY29tLyI+DQpKYW5lIFN0cmVldDwvYT4sIDxhIGhyZWY9Imh0dHBzOi8vdGV6b3MuY29tLyI+ VGV6b3M8L2E+LCA8YSBocmVmPSJodHRwczovL2Jsb29tYmVyZy5jb20vIj4NCkJsb29tYmVyZzwv YT4sIDxhIGhyZWY9Imh0dHBzOi8vbGV4aWZpLmNvbS8iPkxleGlmaTwvYT4sIDxhIGhyZWY9Imh0 dHBzOi8vc2ltY29ycC5jb20vIj4NClNpbUNvcnA8L2E+LCA8YSBocmVmPSJodHRwczovL3d3dy5t aXRzdWJpc2hpZWxlY3RyaWMtcmNlLmV1LyI+TUVSQ0U8L2E+IGFuZCA8YSBocmVmPSJodHRwczov L3RhcmlkZXMuY29tLyI+DQpUYXJpZGVzPC9hPi4gKElmIHlvdXIgY29tcGFueSB3b3VsZCBsaWtl IHRvIGpvaW4gYXMgYSBzcG9uc29yLCBwbGVhc2UgPGEgaHJlZj0iaHR0cDovL29jYW1sLXNmLm9y Zy9iZWNvbWluZy1hLXNwb25zb3IvIj4NCmdldCBpbiB0b3VjaDwvYT4uIFVuZm9ydHVuYXRlbHks IHdlIHN0aWxsIGNhbm5vdCBlZmZpY2llbnRseSBwcm9jZXNzIHNtYWxsIGRvbmF0aW9ucywgc28g d2UgYXJlIG5vdCBjYWxsaW5nIGZvciBpbmRpdmlkdWFsIGRvbmF0aW9ucy4pDQo8L3A+DQo8cD5G ZWVsIGZyZWUgdG8gdXNlIHRoaXMgdGhyZWFkIGZvciBxdWVzdGlvbnMvc3VnZ2VzdGlvbnMgOi0p IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnMDg0OGIyNiIgY2xh c3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZzA4NDhiMjYiPlJlY2VudCBhY3Rpb25zPC9oND4N CjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcwODQ4YjI2Ij48L2Rpdj4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBpZD0ib3JnNzdjYjBjMSI+PC9hPk91dHJlYWNo PGJyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTUiIGlkPSJ0ZXh0LW9yZzc3Y2IwYzEiPg0K PHA+VGhlIE9DYW1sIEZvdW5kYXRpb24gaXMgZnVuZGluZyB0aGUgT0NhbWwgVXNlciBNZWV0aW5n IGluIFBhcmlzLCB3aGljaCByZWNlbnRseQ0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90LzEwLXllYXJzLW9mLW91cHMtbWVldHVwLWphbnVhcnktMjAyMy8xMTE0MCI+DQpjZWxl YnJhdGVkIGl0cyAxMHRoIGFubml2ZXJzYXJ5PC9hPi4gV2UgYXJlIGludGVyZXN0ZWQgaW4gc3Vw cG9ydGluZyBPQ2FtbCBtZWV0dXBzIGFuZCBldmVudHMgYWxsIG92ZXIgdGhlIHdvcmxkLCBwbGVh c2UgbGV0IHVzIGtub3cgaWYgeW91IGFyZSBvcmdhbml6aW5nIHNvbWV0aGluZy4NCjwvcD4NCjxw PldlIHdpbGwgYWxzbyBzcG9uc29yIHRoZSAyMDIzIGVkaXRpb24gb2YgSUNGUCwgdGhlIEludGVy bmF0aW9uYWwgQ29uZmVyZW5jZSBvbiBGdW5jdGlvbmFsIFByb2dyYW1taW5nLiBJdCBpcyB0aGUg YWNhZGVtaWMgY29uZmVyZW5jZSB0aGF0IGhvc3RzIHRoZSBPQ2FtbCBXb3Jrc2hvcCwgYW5kIGlz IGF0dGVuZGVkIGJ5IHJlc2VhcmNoIGFuZCBpbmR1c3RyaWFsIHVzZXJzIG9mIG1hbnkgb2Ygb3Vy IG5laWdoYm9yIGxhbmd1YWdlcyAoSGFza2VsbCwNCiBGIywgU2NhbGEsIEVybGFuZywgUnVzdCwg ZXRjLikuIDwvcD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZzEyYzJmMWUiPjwvYT5Db21t dW5pdHk8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnMTJjMmYx ZSI+DQo8cD5XZSB3b3JrZWQgYSBmZXcgeWVhcnMgYWdvIG9uIHRyeWluZyB0byBidWlsZCBhIGdy b3VwIG9mIE9DYW1sZXJzIHRvIGVzdGFibGlzaCBhIENvZGUgb2YgQ29uZHVjdCAoQ29DKSB0aGF0 IGNvdWxkIGJlIGFkb3B0ZWQgYnkgaW50ZXJlc3RlZCBvcmdhbml6YXRpb25zIHdpdGhpbiB0aGUg T0NhbWwgY29tbXVuaXR5LCBidXQgdGhpcyBlZmZvcnQgd2FzIG9uIGhvbGQuIFdlIGZ1bmRlZCBT dWRoYSBQYXJpbWFsYSB0byByZWJ1aWxkIHRoaXMg4oCcY29kZQ0KIG9mIGNvbmR1Y3QgY29tbWl0 dGVl4oCdIGFuZCBkZWxpdmVyIGEgQ29kZSBvZiBDb25kdWN0IHRoYXQgY291bGQgYmUgYWRvcHRl ZC4gPC9wPg0KPHA+U3VkaGEgYW5kIHRoZSBjb21taXR0ZWUgbWVtYmVycyAod2hvIGFyZSBub3Qg cGFpZCBieSB0aGUgRm91bmRhdGlvbiBmb3IgdGhlaXIgd29yaykNCjxhIGhyZWY9Imh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1jb21tdW5pdHktY29kZS1vZi1jb25kdWN0LzEwNDk0 LzEiPnByb3Bvc2VkPC9hPiBhIENvQyB0ZXh0LCByZWNlaXZlZCBhIHRvbiBvZiAoc29tZXRpbWVz IHRlbnNlKSBmZWVkYmFjayBmcm9tIHRoZSBjb21tdW5pdHksIGFuZCBpdGVyYXRlZCB0byBnZXQg YSBmaW5hbCB2ZXJzaW9uIHRoYXQgd2FzIGZlbHQgYWNjZXB0YWJsZSBieSBtb3N0IG1lbWJlcnMg b2YgdGhlIGNvbW11bml0eSwNCiBhbmQgaXMgYWxyZWFkeSBhZG9wdGVkIGJ5IHNldmVyYWwgb3Jn YW5pemF0aW9ucyAoaW5jbHVkaW5nIHRoaXMgRGlzY3VzcykuIFRoaXMgd2FzIGEgZGVsaWNhdGUs IGNvbnRyb3ZlcnNpYWwgZWZmb3J0LCBhbmQgaXQgaXMgdG9vIHNvb24gdG8gc2F5IGlmIGhhcyBy ZWFsbHkgbWFkZSBvdXIgY29tbXVuaXR5IHN0cm9uZ2VyIHlldCwgYnV0IHdlIGhvcGUgdGhhdCBp dCB3aWxsIGJlIHRoZSBjYXNlIGFuZCB3ZXJlIGltcHJlc3NlZCBieSB0aGUgd29yaw0KIG9mIFN1 ZGhhIFBhcmltYWxhIGFuZCB0aGUgY29tbWl0dGVlIG1lbWJlcnMgKGN1cnJlbnRseTogTG91aXMg Um9jaMOpLCBNYXJjZWxsbyBTZXJpLCBSYWphIEJvdWpiZWwsIFNpbW9uIENydWFuZXMgYW5kIFNv bmphIEhlaW56ZSkuDQo8L3A+DQo8cD5TZWUgdGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9jb2RlLW9mLWNvbmR1Y3QiPk9DYW1sIGNvZGUgb2YgY29uZHVjdDwvYT4gcmVwb3Np dG9yeSBmb3IgbW9yZSBkZXRhaWxzLg0KPC9wPg0KPC9kaXY+DQo8L2xpPjxsaT48YSBpZD0ib3Jn MGViMGYyOCI+PC9hPkVjb3N5c3RlbTxicj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC01IiBp ZD0idGV4dC1vcmcwZWIwZjI4Ij4NCjxwPldlIGFyZSBjdXJyZW50bHkgKHBhcnRpYWxseSkgc3Vw cG9ydGluZyB0aGUgd29yayBvZiBzZXZlcmFsIGNvbnRyaWJ1dG9ycyB0byB0aGUgT0NhbWwgZWNv c3lzdGVtLCBpbmNsdWRpbmc6DQo8L3A+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+Sm9uYWgg QmVja2ZvcmQgYW5kIGhpcyA8YSBocmVmPSJodHRwczovL2Rpc2t1di1vY2FtbC5naXRsYWIuaW8v ZGlzdHJpYnV0aW9ucy9ka21sL2luZGV4Lmh0bWwiPg0KRGlza3V2IE9DYW1sIGRpc3RyaWJ1dGlv bjwvYT4gZm9yIFdpbmRvd3MsIDwvbGk+PGxpPkRhbmllbCBCw7xuemxpIGZvciBtYW55IG9uZ29p bmcgY29udHJpYnV0aW9ucyB0byB0aGUgT0NhbWwgZWNvc3lzdGVtLCA8L2xpPjxsaT5LaXJhbiBH b3BpbmF0aGFuIGZvciA8YSBocmVmPSJodHRwczovL2dpdGxhYi5jb20vZ29waWFuZGNvZGUvZ29w Y2FtbC1tb2RlIj5Hb3BjYW1sLW1vZGU8L2E+IGFuZCBvdGhlciBjb250cmlidXRpb25zIHRvIHRo ZSBlY29zeXN0ZW0sDQo8L2xpPjxsaT5BbnRvbmlvIE1vbnRlcm/igJlzIHdvcmsgb24gPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL21lbGFuZ2UtcmUvbWVsYW5nZSI+TWVsYW5nZTwvYT4sDQo8 L2xpPjxsaT5aYWNoIFNoaXBrbyBvbiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20venNoaXBr by9vY2FtbC1ycyI+b2NhbWwtcnM8L2E+LCBhbmQNCjwvbGk+PGxpPlBldHRlciBVcmtlZGFsIG9u IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9wYXVya2VkYWwvb2NhbWwtY2FxdGkvIj5DYXF0 aTwvYT4uDQo8L2xpPjwvdWw+DQo8L2Rpdj4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8 L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLTciIGNsYXNzPSJvdXRsaW5lLTIiPg0K PGgyIGlkPSI3Ij5BbiBFbWFjcyBtb2RlIGZvciBDcmFtIHRlc3RzPC9oMj4NCjxkaXYgY2xhc3M9 Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC03Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbi1lbWFjcy1tb2RlLWZvci1jcmFtLXRlc3RzLzExMjIx LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FuLWVtYWNzLW1vZGUtZm9yLWNyYW0t dGVzdHMvMTEyMjEvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5l ci1vcmc5ODBiNmNiIiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOTgwYjZjYiI+S2ly YW4gR29waW5hdGhhbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMi IGlkPSJ0ZXh0LW9yZzk4MGI2Y2IiPg0KPHA+SGkgYWxsISBSZWNlbnRseSBJ4oCZdmUgYmVlbiBw bGF5aW5nIHdpdGggdGVzdHMsIGFuZCBoYXZlIGZhbGxlbiBpbiBsb3ZlIHdpdGggZHVuZeKAmXMg Y3JhbSB0ZXN0cyA6aGVhcnQ6DQo8L3A+DQo8cD5BcyBJIHdhc27igJl0IGFibGUgdG8gZmluZCBh bnkgc3VwcG9ydCBmb3IgaXQgZWxzZXdoZXJlLCBJ4oCZdmUgd3JpdHRlbiBhIHNtYWxsIEVtYWNz IG1vZGUgdG8gaGlnaGxpZ2h0IGNyYW0gdGVzdHMgdG8gbWFrZSBpdCBhIGxpdHRsZSBlYXNpZXIg dG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBjb21tZW50cywgY29tbWFuZHMgYW5kIG91dHB1dHM6DQo8 L3A+DQo8cD48YSBocmVmPSJodHRwczovL2dpc3QuZ2l0aHViLmNvbS9Hb3BpYW5kY29kZS9iMTdl MTViMDljMjhlNzBhYTE4NDUzYTE2NTgwMjFkYyI+aHR0cHM6Ly9naXN0LmdpdGh1Yi5jb20vR29w aWFuZGNvZGUvYjE3ZTE1YjA5YzI4ZTcwYWExODQ1M2ExNjU4MDIxZGM8L2E+DQo8L3A+DQo8cD5I ZXJl4oCZcyB3aGF0IGl0IGxvb2tzIGxpa2U6IDwvcD4NCjxkaXYgaWQ9Im9yZzIyOWZmNjEiIGNs YXNzPSJmaWd1cmUiPg0KPHA+PGltZyBzcmM9Imh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4u Y29tL2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYLzMvMzE5OTQ1ZmYxNWNkZDJj NjFmNTkxYTA5MjYxODkyMWZlZTgyNDQyMi5wbmciIGFsdD0iMzE5OTQ1ZmYxNWNkZDJjNjFmNTkx YTA5MjYxODkyMWZlZTgyNDQyMi5wbmciPg0KPC9wPg0KPC9kaXY+DQo8cD5UaGVyZeKAmXMgcHJv YmFibHkgc29tZSB0aGluZ3MgdGhhdCBJ4oCZbSBub3QgZG9pbmcgcHJvcGVybHkgdy5yLnQgdG8g RW1hY3MgY29udmVudGlvbnMsIGJ1dCBJ4oCZdmUgZm91bmQgaXQgd29ya3Mgd2VsbCBlbm91Z2gg Zm9yIG15IHVzZWNhc2VzLg0KPC9wPg0KPHA+QXNpZGU6IENyYW0gdGVzdHMgcmVhbGx5IGFyZSBh d2Vzb21lISBJIHRoaW5rIHRoZXnigJlyZSB0aGUgYmVzdCBtZXRob2Qgb2Ygd3JpdGluZyB0ZXN0 cyB0aGF0IEnigJl2ZSBmb3VuZCBpbiBPQ2FtbCwgYW5kIEnigJltIG9ubHkgc2FkZGVuZWQgdGhh dCBJIGRpZG7igJl0IHRyeSBpdCBlYXJsaWVyISBUaGUgZWFzZSBvZiBjcmVhdGluZyBuZXcgdGVz dHMgKHNpbXBseSBhIG5ldyBmaWxlLCBubyBib2lsZXJwbGF0ZSBuZWVkZWQpLCB1cGRhdGluZyBl eHBlY3RlZA0KIG91dHB1dHMgKDxjb2RlPmR1bmUgcnVudGVzdCAtLWF1dG9wcm9tb3RlPC9jb2Rl PiksIGVuYWJsaW5nIGEgcmVzdWx0IHRvIGJlIHRlc3RlZCAoc2ltcGx5IG1ha2Ugc3VyZSBpdCBo YXMgYSBjb252ZXJzaW9uIHRvIHN0cmluZyDigJMgbm8gbmVlZCB0byBoYXNzbGUgYXJvdW5kIHdp dGggZGVyaXZpbmcgZXF1YWxpdHkgZXRjLikgYXJlIGxlYWd1ZXMgYWJvdmUgdGhlIG90aGVyIGFw cHJvYWNoZXMgSeKAmXZlIHVzZWQgc28gZmFyLg0KPC9wPg0KPHA+TXkgY3VycmVudCBhcHByb2Fj aCB0byB0ZXN0aW5nIG15IHByb2plY3RzIC0gKHNvIGZhciwgbWFpbmx5IFNRTC1iYWNrZWQgYXBw bGljYXRpb25zKSwgaXMgdG8gZmlyc3Qgd3JpdGUgYSBydW5uZXIgYmluYXJ5IHRoYXQgY2FsbHMg dGhlIGFwcHJvcHJpYXRlIGxpYnJhcnkgZnVuY3Rpb25zIGJhc2VkIG9uIGl0cyBhcmd1bWVudHMg YW5kIHByaW50cyB0aGUgcmVzdWx0IChzb21ldGltZXMgSSBnZW5lcmF0ZSB0aGlzIHByb2dyYW1t YXRpY2FsbHkNCiBmcm9tIHRoZSB0eXBlcyBvZiBteSBBUElzKSwgYW5kIHRoZW4gd3JpdGUgY3Jh bSB0ZXN0cyB0byBkb2N1bWVudCB0aGUgZGlmZmVyZW50IGludGVyYWN0aW9ucyBiZXR3ZWVuIGNh bGxzIHRoYXQgSSBleHBlY3QuIEVzcGVjaWFsbHkgd2hlbiBpbnRlcmFjdGluZyB3aXRoIEx3dCwg SeKAmXZlIGZvdW5kIG15IGNyYW0gdGVzdHMgdG8gYmUgZmFyIG1vcmUgcmVhZGFibGUgdGhhbiB0 aGUgY29ycmVzcG9uZGluZyB1bml0IHRlc3RzIHRoYXQgSSBtaWdodA0KIHdyaXRlIHdpdGggQWxj b3Rlc3QuIDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI4Ij5UYWtpbmcgYSBsb29rOiBz b21lIG9wZW4gT0NhbWwgUHVsbCBSZXF1ZXN0czwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRl eHQtMiIgaWQ9InRleHQtOCI+DQo8cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvdGFraW5nLWEtbG9vay1zb21lLW9wZW4tb2NhbWwtcHVsbC1yZXF1ZXN0cy8x MTIyMi8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90YWtpbmctYS1sb29rLXNvbWUt b3Blbi1vY2FtbC1wdWxsLXJlcXVlc3RzLzExMjIyLzE8L2E+DQo8L3A+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2VjNmM4NTMiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgz IGlkPSJvcmdlYzZjODUzIj5MdWthc3ogU3RhZmluaWFrIHNhaWQ8L2gzPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZ2VjNmM4NTMiPg0KPHA+SGkhIENvbWluZyBiYWNr IHRvIE9DYW1sIGFmdGVyIDcmIzQzOyB5ZWFycywgdG9kYXkgSSBkZWNpZGVkIHRvIGxvb2sgYXQg dGhlIG9wZW4gUFJzIHRvIHNlZSB3aGVyZSB0aGUgbGFuZ3VhZ2UgaXMgaGVhZGVkLiBNYXliZSBz b21lb25lIGZpbmRzIGl0IHVzZWZ1bC4gSeKAmW0gbW9zdGx5IG9taXR0aW5nIFN0ZGxpYiBjaGFu Z2VzLiBUaGVzZSBzdG9vZCBvdXQgdG8gbWU6DQo8L3A+DQo8b2wgY2xhc3M9Im9yZy1vbCI+DQo8 bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMjg1Ij5CaWRp cmVjdGlvbmFsIHR5cGUgY2hlY2tpbmc8L2E+OiBtb3JlIHR5cGUgcHJvcGFnYXRpb24gZHVyaW5n IGluZmVyZW5jZSwgaW1wcm92ZXMgYXV0b2NvbXBsZXRpb24gKGUuZy4gZm9yIE9PIGNvZGUpLg0K PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTk1 NSI+TW9uYWRpYyBzeW50YXggZm9yIDxjb2RlPm1hdGNoPC9jb2RlPjwvYT4uIEFsc286DQo8YSBo cmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xOTU1I2lzc3VlY29tbWVu dC0xMDkwNDY4MzU2Ij5KYW5lIFN0cmVldCBub3QgdXNpbmcgYmluZGluZyBvcGVyYXRvcnMsIGJ1 dCB0aGUgb2xkIFBQWDwvYT4g4oaQIGlzIGl0IHN0aWxsIHRydWU/DQo8YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8yMTIyIj5UaGUgPGNvZGU+bGV0PC9jb2RlPiBz eW50YXhlcyBhcmUgbm90IGZ1bGx5IG1hZGUgdXNlIG9mPC9hPi4NCjwvbGk+PGxpPkJpZ2FycmF5 OiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8zODkiPmZyZWU8 L2E+IGFuZCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC84NjE4 Ij4NCm92ZXJsYXA8L2E+LiA8L2xpPjxsaT5VbndpbmQtcHJvdGVjdCBtZWNoYW5pc20gPGEgaHJl Zj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvODk2MiI+PGNvZGU+RnVuLndp dGhfcmVzb3VyY2U8L2NvZGU+PC9hPiDihpIgaW4gZHJhZnQuDQo8L2xpPjxsaT5CdWlsdC1pbiBz eW50YXggPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvOTAwNSI+ UHJvbW90ZSBjb25zdHJ1Y3RvcnMgdG8gZnVuY3Rpb25zPC9hPiDihpIgY29udGVzdGVkIHVzZSBv ZiBjdXJyaWVkIGZ1bmN0aW9ucy4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9wdWxsLzkwNDIiPlVuaXF1ZSB0eXBlczwvYT4gdG8gbWFrZSBtb3JlIGFi c3RyYWN0IHR5cGVzIHdvcmsgd2VsbCB3aXRoIEdBRFRzDQo8L2xpPjxsaT48YSBocmVmPSJodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC85MTg3Ij5Nb2R1bGFyIGV4cGxpY2l0czwv YT4sIG1vZHVsYXIgaW1wbGljaXRzIHdpdGhvdXQgdGhlIGltcGxpY2l0IGFwcGxpY2F0aW9uIHBh cnQuIFRoaXMgaGFzIHRoZSBwb3dlciBvZiBmaXJzdC1jbGFzcyBmdW5jdG9ycywgYnV0IHdpdGgg bXVjaCBtb3JlIGNvbmNpc2Ugc3ludGF4LCBhdm9pZHMgZXhwbGljaXQgc2lnbmF0dXJlcywgYW5k IGFsbG93cyBsb2NhbA0KIHR5cGUgYW5ub3RhdGlvbnMgbGlrZSA8Y29kZT5sZXQgZiB7bW9kdWxl IE0gOiBTfSAoeCA6IE0udCkgPSB4PC9jb2RlPiA8L2xpPjxsaT5NZXRhT0NhbWw6IDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEwMTMwIj5yZXNlcnZlIDxjb2Rl Pg0KJmd0Oy48L2NvZGU+PC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL3B1bGwvMTAxMzEiPnN5bnRheCBmb3IgPGNvZGU+DQouJmx0O2UmZ3Q7LjwvY29kZT4sIDxj b2RlPi5+ZTwvY29kZT48L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvcHVsbC8xMDEzMiI+DQpwcHJpbnRhc3Q8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvcHVsbC8xMTg3MSI+c3VwcG9ydCBmb3IgPGNvZGU+DQouJmx0O2UmZ3Q7 LjwvY29kZT4sIDxjb2RlPi5+ZTwvY29kZT48L2E+LiA8L2xpPjxsaT48YSBocmVmPSJodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDYxMiI+4oCcU3VidHlwaW5nIHN5bnRheOKA nSBmb3IgbW9kdWxlczwvYT4gZW5hYmxlcyB0aGluZ3MgbGlrZQ0KPGNvZGU+aW5jbHVkZSAoTSA6 Jmd0OyBTKTwvY29kZT4uIDwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9wdWxsLzEwNzc1Ij5IYWxmLXByZWNpc2lvbiBmbG9hdHMgaW4gPGNvZGU+DQpCaWdh cnJheTwvY29kZT48L2E+LiA8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvcHVsbC8xMDc5OCI+PGNvZGU+QXRvbWljLm1vZGlmeTwvY29kZT48L2E+Lg0KPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTA5Nzki Pn5sZXQub3AgeCA9IH4gYmluZGluZ3M8L2E+IHBhcmFtZXRlcml6ZWQgYnkgdGhlDQo8Y29kZT5v cDwvY29kZT4sIGNvbXBsZW1lbnRpbmcgdGhlIGN1cnJlbnQgPGNvZGU+bGV0JiM0MzsgeCA9PC9j b2RlPiBhbmQgPGNvZGU+bGV0KiB4ID08L2NvZGU+IGJpbmRpbmcgc3ludGF4ZXMuDQo8L2xpPjxs aT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xMDk5NSI+T0Nh bWwgbWVtb3J5IG1vZGVsPC9hPiBkb2N1bWVudGF0aW9uLg0KPC9saT48bGk+PGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTEyNTIiPlR1cm4ga2V5d29yZHMgdG8g aWRlbnRpZmllcnM8L2E+IChtYWlubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpLg0KPC9s aT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1bGwvMTEzMjki PlNlcmlhbGl6ZSA8Y29kZT5SYW5kb20uU3RhdGUudDwvY29kZT48L2E+Lg0KPC9saT48bGk+QnVp bHQtaW4gc3ludGF4IDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxs LzExNDA3Ij5Qcm9tb3RlIGZpZWxkcyB0byBmdW5jdGlvbnM8L2E+Lg0KPC9saT48L29sPg0KPC9k aXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOSIgY2xhc3M9 Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjkiPm9kZXAgaW5pdGlhbCByZWxlYXNlPC9oMj4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0idGV4dC05Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9 Imh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2RlcC1pbml0aWFsLXJlbGVhc2UvMTEy MzYvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9kZXAtaW5pdGlhbC1yZWxl YXNlLzExMjM2LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXIt b3JnNGM3ODk2NSIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMgaWQ9Im9yZzRjNzg5NjUiPlNpbW1v IFNhYW4gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4 dC1vcmc0Yzc4OTY1Ij4NCjxwPknigJltIGdsYWQgdG8gYW5ub3VuY2UgdGhlIGluaXRpYWwgcmVs ZWFzZSBvZiA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vc2ltNjQyL29kZXAiPg0Kb2RlcDwv YT4g4oCTIGRlcGVuZGVuY3kgZ3JhcGhzIGdlbmVyYXRvciBmb3IgT0NhbWwgbW9kdWxlcywgbGli cmFyaWVzIGFuZCBwYWNrYWdlcy4NCjwvcD4NCjxwPlNvbWUgbW9udGhzIGFnbyBJIHdhcyBmcnVz dHJhdGVkIHdpdGggdGhlIGxhY2sgb2Ygc3VjaCBtb2Rlcm4gdG9vbCAoPGEgaHJlZj0iaHR0cHM6 Ly9naXRodWIuY29tL3NpbTY0Mi9vZGVwI290aGVyLXRvb2xzIj5saXN0IG9mIHNpbWlsYXIgb25l cyBJIGZvdW5kPC9hPikgYW5kIGRlY2lkZWQgdG8gY29kZSB1cA0KPGEgaHJlZj0iaHR0cHM6Ly94 a2NkLmNvbS85MjcvIj5vbmUgdW5pdmVyc2FsIHRvb2wgdGhhdCBjb3ZlcnMgYWxsIHRoZSB1c2Ug Y2FzZXMgKHhrY2QgcmVmZXJlbmNlKTwvYT4uIEFmdGVyIGludGVyZXN0IGZyb20gdGhlIGNvbW11 bml0eSwgSSBoYXZlIG5vdyBtYWRlIGEgcHJvcGVyIHJlbGVhc2Ugb2YgdGhlIHRvb2wgb24gb3Bh bS4NCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnYjdjYmEzNSIg Y2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2I3Y2JhMzUiPkV4YW1wbGU8L2g0Pg0KPGRp diBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2I3Y2JhMzUiPg0KPHA+UnVubmlu ZyA8Y29kZT5vZGVwIGR1bmUgfCBkb3QgLVRzdmc8L2NvZGU+IGluIHRoZSBwcm9qZWN04oCZcyBv d24gcmVwb3NpdG9yeSBwcm9kdWNlcyB0aGUgZm9sbG93aW5nIGNvbXByZWhlbnNpdmUgZ3JhcGgu IEl0IHNob3dzIG1vZHVsZXMgaW4gdGhlIHByb2plY3QgaXRzZWxmLCBjbHVzdGVyZWQgYnkgZHVu ZSBsaWJyYXJpZXMsIGFuZCBvdGhlciBmaW5kbGliIGxpYnJhcmllcywgY2x1c3RlcmVkIGJ5IG9w YW0gcGFja2FnZXMuIFRoaXMgaW5mb3JtYXRpb24NCiBpcyBnYXRoZXJlZCBhbmQgY29tYmluZWQg ZnJvbSA8Y29kZT5kdW5lIGRlc2NyaWJlIHdvcmtzcGFjZSAtLXdpdGgtZGVwczwvY29kZT4sIGZp bmRsaWIgYW5kIG9wYW0uDQo8L3A+DQo8cD48YSBocmVmPSJodHRwczovL3Jhdy5naXRodWJ1c2Vy Y29udGVudC5jb20vc2ltNjQyL29kZXAvbWFzdGVyL2ltZy9kdW5lLW9kZXAuc3ZnIj5kdW5lLW9k ZXAuc3ZnPC9hPg0KPC9wPg0KPHA+U2VlIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9zaW02 NDIvb2RlcCNleGFtcGxlcyI+UkVBRE1FIG9uIEdpdEh1YjwvYT4gZm9yIG1vcmUgdXNhZ2UgZXhh bXBsZXMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLW9yZ2Q1MjNhMzgiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSJv cmdkNTIzYTM4Ij5PbGQgQ1dOPC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0yIiBpZD0i dGV4dC1vcmdkNTIzYTM4Ij4NCjxwPklmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biA8YSBocmVmPSJtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnIj4NCnNlbmQg bWUgYSBtZXNzYWdlPC9hPiBhbmQgSeKAmWxsIG1haWwgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8iPg0KdGhl IGFyY2hpdmU8L2E+IG9yIHRoZSA8YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzIj5SU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXM8L2E+Lg0KPC9wPg0KPHA+SWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmlkeWxsLm9yZy9saXN0aW5mby9jYW1sLW5l d3Mtd2Vla2x5LyI+DQpvbmxpbmU8L2E+LiA8L3A+DQo8ZGl2IGNsYXNzPSJhdXRob3JuYW1lIiBp ZD0ib3JnNjgzNDNlYSI+DQo8cD48YSBocmVmPSJodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 LyI+QWxhbiBTY2htaXR0PC9hPiA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4N CjwvYm9keT4NCjwvaHRtbD4NCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17 via Mailbox Transport; Tue, 17 Jan 2023 08:38:47 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.17; Tue, 17 Jan 2023 08:38:47 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2507.17 via Frontend Transport; Tue, 17 Jan 2023 08:38:47 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30H8c4N8022811 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 17 Jan 2023 08:38:04 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 30H8bsXD022794 for ; Tue, 17 Jan 2023 08:37:54 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Jan 2023 09:37:51 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id D1619E034E; Tue, 17 Jan 2023 09:37:52 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 8241BE016E for ; Tue, 17 Jan 2023 09:37:45 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jan 2023 09:37:43 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8C1A3564A5B; Tue, 17 Jan 2023 09:37:43 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZKk8e5q1706wcgES7TiuaQv3dyw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 17 Jan 2023 08:37:43 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: 39265420-1e92-493d-f112-08daf866406c X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.97,222,1669071600"; d="scan'208,217";a="87965279" x-spam-flag: Unsure, tests=bogofilter, spamicity=0.499014, queueID=D7C4A564A5C x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="Windows-1252" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 OCaml Weekly News

    OCaml Weekly News

    Previous We= ek Up Next We= ek

    Hello

    Here is the latest OCaml Weekly News, for the week of January 10 to 17, = 2023.

    Installing Windows OCaml 5.0.0 in opam

    David Allsopp announced

    One of opam 2.2=92s headline features is that both =93upstream=94 opam (= i.e. opam built from un-patched sources from ocaml/opam) and =93un-forked= =94 opam-repository (i.e. ocaml/opam-repository<= /a>) finally provide native Windows opam switches. We=92re aiming to get an= alpha release of this out in the coming weeks, but I=92ve had various requ= ests directly for how to use OCaml 5.0 with opam-repository-mingw in the meantime, so I=92m just sharing this tem= porary solution, in case it=92s of use to others.

    I have a demonstration workflow at https://github.com/dra27/ocaml5-ci-demo with setup-ocaml. It shows the commands necessary for local use:

          - run: opam repo add dra27 git+https:=
    //github.com/dra27/opam-repository#windows-5.0 --all --set-default
          - run: opam switch create 5.0 --packages=3Docaml.5.0.0,ocaml-option-m=
    ingw
          - run: opam exec --switch=3D5.0 -- ocamlopt -config
          - run: opam install --switch=3D5.0 utop
    

    and also how to use it directly in a workflow:

          - name: Set-up OCaml
            uses: ocaml/setup-ocaml@v2
            with:
              ocaml-compiler: ocaml.5.0.0,ocaml-option-mingw
              opam-repositories: |
                dra27: https://github.com/dra27/opam-repository.git#windows-5.0
                default: https://github.com/fdopen/opam-repository-mingw.git#op=
    am2
    

    The windows-5.0 branch adds just enough to provide the OCam= l 5.0.0 package for mingw-w64 by patching ocaml-variants.5.0.0+options (rather than providing = ocaml-variants.5.0.0+mingw64). Unless you expressly select ocaml-variants.5.0.0+options, it=92ll actually pick up a v= ersion patched with ocaml/ocaml#11846= .

    The only change once the alpha release comes out should be the removal o= f the opam repo add dra27 part.

    Release of Mehari 0.1

    Tim ats announced

    @artichaut and I are very pleased to announce the first release of Mehar= i.

    Mehari was created w= ith the aim of offering a cross-platform framework to create Gemini applications.

    Gemini is a lightweight alternative protocol to HTTP and Gopher, which r= uns on top of TLS.

    On the =93Geminispace=94, there are mainly static content like blogs and= other applications like games, BBS, etc.

    Mehari API=92s is largely inspired by Dream: it consists of a single module, and is pretty similar, there are= handlers, routes, middlewares, etc.

    Among the features, there are:

    • Cross-platform: the library provides many IO modules (Lwt, Mirage, Eio)=
    • MIME type inference (using experimental Conan support)
    • Rate limit : it is easy to rate limit access to= a route or to the whole server
    • Virtual hosting : hostname verification with SNI or request URL
    • Proxy: Ability to act as a proxy
    • CGI support with environme= nt variables
    • Long-running TCP connection : incremental creation of= the response body

    Examples of use are available on the GitHub repository.

    Documentation is available online with a short tutorial explaining the basics.

    Currently, the library is in its infancy, the API is subject to change, = so we are open to feedback and contribution, especially in terms of securit= y.

    Mehari is our first MirageOS-compatib= le library, so the creation of unikernels is experimental, and we=92d love = to get feedback on it.

    Outreachy Summer 2023

    Patrick Ferris announced

    Yep, it=92s that time of the year again! Outreachy has officially starte= d asking for organisations and mentors for the Summer 2023 round.

    What is Outreachy?

    Outreachy is a paid, remote internship program. Outreachy promotes diver= sity in open source and open science. Our internships are for people who fa= ce under-representation, and discrimination or systemic bias in the technol= ogy industry of their country.

    Given the long discussion in https://discuss.ocaml.org/t/what-are-the-biggest-reasons-newcomers-give-up-= on-ocaml/10958 I can guarantee you that if you want some more really go= od answers, participating in Outreachy is one way to do that!

    To help get a feel for what is to be a mentor, Outreachy will be holding= a livestreamed call with previous mentors taking part which should be avai= lable on peertube (I=92ll post links when available).

    Important Dates

    • Jan. 17 at 3pm UTC - Mentor chat on YouTube and PeerTube
    • Feb. = 6 at 3pm UTC - Mentor chat on YouTube and PeerTube
    • Feb. 10 at 4pm = UTC - Deadline for open source and open science communities to sign up to b= e an Outreachy mentoring organization
    • Feb. 24 at 4pm UTC - Deadline for mentors to submit project descri= ptions for May 2023 interns to work on

    This round

    We had some excellent proposals for projects working on the compiler but= unfortunately in the end no intern was found for it, please don=92t be dis= heartened by this and I hope to see more projects suggested.

    I=92ve had the great fortune of working with Prisca on ocaml-t= opojson which has come on leaps and bounds thanks to her work! We=92ll = have a proper debrief towards the end of the project like the previous two = rounds, although it may be a little shorter given the OCaml community only has one intern this round.

    The older, but still relevant post https://discuss.ocaml.org/t/become-an-outreachy-mentor-support-the-growth-a= nd-diversity-of-the-ocaml-community/8213 contains some more information= about being a mentor which you may want to take a look at.

    Please uses this thread for any questions, ideas or thoughts. Thank you = :camel: !

    Patrick Ferris later added

    Friendly reminder the live chat will take place on https://diode.zone/a/outreachy tomorrow (17th Jan. 2023) at 3pm UTC. Wh= ilst primarily focused on helping prospective applicants, it is still super= useful for mentors to understand the process to help them out when the tim= e comes.

    Petrol 1.0.0 - A high-level typed SQL API for OCaml designed t= o go fast!

    Kiran Gopinathan announced

    Heyo! Pleased to annouce the release of a new library that I=92ve been w= orking on for some personal projects, but thought might be useful for other= s.

    Petrol is a Free software library that provides a high-level OCam= l API for interacting with SQL databases. The aim of this interface is to p= rovide a type-safe API to allow developers to define their SQL tables and q= ueries directly in OCaml, thereby avoiding the impedence mismatch and fragility that comes with having to di= rectly write SQL code, as is typical in a normal Caqti-based project.

    open Petrol
    
    (* define a new schema *)
    let schema =3D Stat=
    icSchema.init ()
    
    (* declare a table *)
    let example_table, =
    Expr.[name; age] =3D
        StaticSchema.declare_table schem=
    a ~name:"example"
        Schema.[
            field "name" ~ty:Type.=
    text;
            field "age" ~ty:Type.<=
    /span>int
        ]
    

    Petrol=92s DSL allows you to express complex SQL queries as simple OCaml= function compositions:

    (* create =
    a query *)
    let insert_person ~=
    name:n ~age:a db =3D
        Query.insert ~table:example_table
            ~values:Expr.[
                name :=3D s n;
                age :=3D i a
             ]
        |> Request.make_zero
        |> Petrol.exec db
    

    Another selling point of Petrol is that it comes out of the box with a v= ersioning system to gracefully allow changing the schemas in your applicati= on over time - this and more is described in the documentation.

    https://github.com/gop= iandcode/petrol

    Anyway, as usual, I=92ve tried to spend some quality time tuning the doc= umentation to make it as easy to pick up as possible, so feel free to have = a gander: https://= gopiandcode.github.io/petrol/petrol/index.html

    ocaml-search 0.1.1 - In-memory Search Index for OCaml values

    Patrick Ferris announced

    I=92m happy to announce the release of a little OCaml library for doing = in-memory searches over OCaml values: ocaml-search.=

    Here=92s a quick example:

    module Book =3D struct
      type t =3D {
        title : string;
        author : string;
      }
    end
    
    let books : =
    Book.t list =3D
      [
        { title =3D "Dune"; au=
    thor =3D "Frank Herbet" };
        { title =3D "The Day of the Triffi=
    ds"; author =3D "John Wynd=
    ham" };
        { title =3D "The Remains of the Da=
    y"; author =3D "Kazuo Ishi=
    guro" }
      ]
    
    module Mono =3D Searc=
    h.Tfidf.Mono (Search.Uids.String) (Book)
    let search =3D Mono=
    .empty ()
    

    You can then add an index to your search index along with the documents.=

    Mono.ad=
    d_index search (fun t -> t.title);
    List.iter (fun doc -> Mono.add_document search =
    doc.Book.title doc) books
    

    Before finally being able to search.

    Mono.se=
    arch search "day";;
    - : Mono.doc list =3D
    [{Book.title =3D "The Remains of the Day"; author =3D "Kazuo Ishiguro"};
     {Book.title =3D "The Day of the Triffids"; author =3D "John Wyndham"}]
    

    The README= provides more thorough documentation and also explains how it can also pro= vide a heterogeneous search index should you want it. I have plans to make = the library more easily extendible with your own search strategies, but thought the initial TF-IDF implementa= tion might already be useful.

    This library is heavily inspired by js-search without which it wouldn=92t exist.

    Happy Hacking :camel:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I=92ll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe online.

    From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34 via Mailbox Transport; Tue, 29 Nov 2022 14:55:08 +0000 Received: from Hermes.metastack.local (172.16.0.8) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.34; Tue, 29 Nov 2022 14:55:08 +0000 Received: from exchange.romulus.metastack.com (172.16.0.21) by Hermes.metastack.local (172.16.0.8) with Microsoft SMTP Server (version=TLS1_0, cipher=TLS_RSA_WITH_AES_256_CBC_SHA) id 15.1.2375.34 via Frontend Transport; Tue, 29 Nov 2022 14:55:08 +0000 Received: from romulus.metastack.com ([172.16.0.20]) by exchange.romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 2ATEsRiA026793 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO) for ; Tue, 29 Nov 2022 14:54:27 GMT Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by romulus.metastack.com (8.14.2/8.14.2) with ESMTP id 2ATEs3nV026769 for ; Tue, 29 Nov 2022 14:54:04 GMT Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Nov 2022 15:54:02 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id A67EFE039D; Tue, 29 Nov 2022 15:54:01 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CA3CAE028F for ; Tue, 29 Nov 2022 15:53:58 +0100 (CET) Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Nov 2022 15:53:57 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1F41A5612C0; Tue, 29 Nov 2022 15:53:56 +0100 (CET) From: Alan Schmitt To: lwn , cwn , "caml-list@inria.fr" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Topic: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Thread-Index: AQHZBAKSLpwX69tvfUGmdPr301G+mw== Sender: "caml-list-request@inria.fr" X-MS-Exchange-MessageSentRepresentingType: 2 Date: Tue, 29 Nov 2022 14:53:55 +0000 Message-ID: Keywords: Sent to dra-news@metastack.com,MetaStack - Lists,MetaStack List-Help: List-Subscribe: List-Unsubscribe: Reply-To: Alan Schmitt Content-Language: en-GB X-MS-Exchange-Organization-AuthAs: Anonymous X-MS-Exchange-Organization-AuthSource: Hermes.metastack.local X-MS-Has-Attach: X-Auto-Response-Suppress: All X-MS-Exchange-Organization-Network-Message-Id: a1801eba-16a5-4b70-f85c-08dad219b534 X-MS-TNEF-Correlator: X-MS-Exchange-Organization-RecordReviewCfmType: 0 x-scanned-by: MIMEDefang 2.65 on 62.31.23.242 received-spf: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only x-ironport-av: E=Sophos;i="5.96,203,1665439200"; d="scan'208,217";a="80802690" x-spam-flag: No, tests=bogofilter, spamicity=0.100861, queueID=AC60A5612D0 x-ironport-anti-spam-filtered: true x-loop: caml-list@inria.fr x-no-archive: yes Content-Type: text/html; charset="utf-8" Content-ID: <3CEC0D2EBE4FE14595EF7EE20B3C780F@metastack.local> Content-Transfer-Encoding: base64 MIME-Version: 1.0 PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhRE9DVFlQRSBodG1sIFBV QkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFN0cmljdC8vRU4iDQoiaHR0cDovL3d3dy53My5v cmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+DQo8aHRtbCB4bWxucz0iaHR0cDov L3d3dy53My5vcmcvMTk5OS94aHRtbCIgbGFuZz0iZW4iIHhtbDpsYW5nPSJlbiI+DQo8aGVhZD4N CjwhLS0gMjAyMi0xMS0yOSBUdWUgMTU6NTEgLS0+DQo8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50 LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD11dGYtOCI+DQo8bWV0YSBuYW1lPSJ2 aWV3cG9ydCIgY29udGVudD0id2lkdGg9ZGV2aWNlLXdpZHRoLCBpbml0aWFsLXNjYWxlPTEiPg0K PHRpdGxlPk9DYW1sIFdlZWtseSBOZXdzPC90aXRsZT4NCjxtZXRhIG5hbWU9ImdlbmVyYXRvciIg Y29udGVudD0iT3JnIE1vZGUiPg0KPHN0eWxlPg0KICAjY29udGVudCB7IG1heC13aWR0aDogNjBl bTsgbWFyZ2luOiBhdXRvOyB9DQogIC50aXRsZSAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAg ICAgICAgICAgbWFyZ2luLWJvdHRvbTogLjJlbTsgfQ0KICAuc3VidGl0bGUgeyB0ZXh0LWFsaWdu OiBjZW50ZXI7DQogICAgICAgICAgICAgIGZvbnQtc2l6ZTogbWVkaXVtOw0KICAgICAgICAgICAg ICBmb250LXdlaWdodDogYm9sZDsNCiAgICAgICAgICAgICAgbWFyZ2luLXRvcDowOyB9DQogIC50 b2RvICAgeyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogcmVkOyB9DQogIC5kb25lICAg eyBmb250LWZhbWlseTogbW9ub3NwYWNlOyBjb2xvcjogZ3JlZW47IH0NCiAgLnByaW9yaXR5IHsg Zm9udC1mYW1pbHk6IG1vbm9zcGFjZTsgY29sb3I6IG9yYW5nZTsgfQ0KICAudGFnICAgIHsgYmFj a2dyb3VuZC1jb2xvcjogI2VlZTsgZm9udC1mYW1pbHk6IG1vbm9zcGFjZTsNCiAgICAgICAgICAg IHBhZGRpbmc6IDJweDsgZm9udC1zaXplOiA4MCU7IGZvbnQtd2VpZ2h0OiBub3JtYWw7IH0NCiAg LnRpbWVzdGFtcCB7IGNvbG9yOiAjYmViZWJlOyB9DQogIC50aW1lc3RhbXAta3dkIHsgY29sb3I6 ICM1ZjllYTA7IH0NCiAgLm9yZy1yaWdodCAgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJp Z2h0OiAwcHg7ICB0ZXh0LWFsaWduOiByaWdodDsgfQ0KICAub3JnLWxlZnQgICB7IG1hcmdpbi1s ZWZ0OiAwcHg7ICBtYXJnaW4tcmlnaHQ6IGF1dG87IHRleHQtYWxpZ246IGxlZnQ7IH0NCiAgLm9y Zy1jZW50ZXIgeyBtYXJnaW4tbGVmdDogYXV0bzsgbWFyZ2luLXJpZ2h0OiBhdXRvOyB0ZXh0LWFs aWduOiBjZW50ZXI7IH0NCiAgLnVuZGVybGluZSB7IHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5l OyB9DQogICNwb3N0YW1ibGUgcCwgI3ByZWFtYmxlIHAgeyBmb250LXNpemU6IDkwJTsgbWFyZ2lu OiAuMmVtOyB9DQogIHAudmVyc2UgeyBtYXJnaW4tbGVmdDogMyU7IH0NCiAgcHJlIHsNCiAgICBi b3JkZXI6IDFweCBzb2xpZCAjZTZlNmU2Ow0KICAgIGJvcmRlci1yYWRpdXM6IDNweDsNCiAgICBi YWNrZ3JvdW5kLWNvbG9yOiAjZjJmMmYyOw0KICAgIHBhZGRpbmc6IDhwdDsNCiAgICBmb250LWZh bWlseTogbW9ub3NwYWNlOw0KICAgIG92ZXJmbG93OiBhdXRvOw0KICAgIG1hcmdpbjogMS4yZW07 DQogIH0NCiAgcHJlLnNyYyB7DQogICAgcG9zaXRpb246IHJlbGF0aXZlOw0KICAgIG92ZXJmbG93 OiBhdXRvOw0KICB9DQogIHByZS5zcmM6YmVmb3JlIHsNCiAgICBkaXNwbGF5OiBub25lOw0KICAg IHBvc2l0aW9uOiBhYnNvbHV0ZTsNCiAgICB0b3A6IC04cHg7DQogICAgcmlnaHQ6IDEycHg7DQog ICAgcGFkZGluZzogM3B4Ow0KICAgIGNvbG9yOiAjNTU1Ow0KICAgIGJhY2tncm91bmQtY29sb3I6 ICNmMmYyZjI5OTsNCiAgfQ0KICBwcmUuc3JjOmhvdmVyOmJlZm9yZSB7IGRpc3BsYXk6IGlubGlu ZTsgbWFyZ2luLXRvcDogMTRweDt9DQogIC8qIExhbmd1YWdlcyBwZXIgT3JnIG1hbnVhbCAqLw0K ICBwcmUuc3JjLWFzeW1wdG90ZTpiZWZvcmUgeyBjb250ZW50OiAnQXN5bXB0b3RlJzsgfQ0KICBw cmUuc3JjLWF3azpiZWZvcmUgeyBjb250ZW50OiAnQXdrJzsgfQ0KICBwcmUuc3JjLWF1dGhpbmZv OjpiZWZvcmUgeyBjb250ZW50OiAnQXV0aGluZm8nOyB9DQogIHByZS5zcmMtQzpiZWZvcmUgeyBj b250ZW50OiAnQyc7IH0NCiAgLyogcHJlLnNyYy1DKysgZG9lc24ndCB3b3JrIGluIENTUyAqLw0K ICBwcmUuc3JjLWNsb2p1cmU6YmVmb3JlIHsgY29udGVudDogJ0Nsb2p1cmUnOyB9DQogIHByZS5z cmMtY3NzOmJlZm9yZSB7IGNvbnRlbnQ6ICdDU1MnOyB9DQogIHByZS5zcmMtRDpiZWZvcmUgeyBj b250ZW50OiAnRCc7IH0NCiAgcHJlLnNyYy1kaXRhYTpiZWZvcmUgeyBjb250ZW50OiAnZGl0YWEn OyB9DQogIHByZS5zcmMtZG90OmJlZm9yZSB7IGNvbnRlbnQ6ICdHcmFwaHZpeic7IH0NCiAgcHJl LnNyYy1jYWxjOmJlZm9yZSB7IGNvbnRlbnQ6ICdFbWFjcyBDYWxjJzsgfQ0KICBwcmUuc3JjLWVt YWNzLWxpc3A6YmVmb3JlIHsgY29udGVudDogJ0VtYWNzIExpc3AnOyB9DQogIHByZS5zcmMtZm9y dHJhbjpiZWZvcmUgeyBjb250ZW50OiAnRm9ydHJhbic7IH0NCiAgcHJlLnNyYy1nbnVwbG90OmJl Zm9yZSB7IGNvbnRlbnQ6ICdnbnVwbG90JzsgfQ0KICBwcmUuc3JjLWhhc2tlbGw6YmVmb3JlIHsg Y29udGVudDogJ0hhc2tlbGwnOyB9DQogIHByZS5zcmMtaGxlZGdlcjpiZWZvcmUgeyBjb250ZW50 OiAnaGxlZGdlcic7IH0NCiAgcHJlLnNyYy1qYXZhOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhJzsg fQ0KICBwcmUuc3JjLWpzOmJlZm9yZSB7IGNvbnRlbnQ6ICdKYXZhc2NyaXB0JzsgfQ0KICBwcmUu c3JjLWxhdGV4OmJlZm9yZSB7IGNvbnRlbnQ6ICdMYVRlWCc7IH0NCiAgcHJlLnNyYy1sZWRnZXI6 YmVmb3JlIHsgY29udGVudDogJ0xlZGdlcic7IH0NCiAgcHJlLnNyYy1saXNwOmJlZm9yZSB7IGNv bnRlbnQ6ICdMaXNwJzsgfQ0KICBwcmUuc3JjLWxpbHlwb25kOmJlZm9yZSB7IGNvbnRlbnQ6ICdM aWx5cG9uZCc7IH0NCiAgcHJlLnNyYy1sdWE6YmVmb3JlIHsgY29udGVudDogJ0x1YSc7IH0NCiAg cHJlLnNyYy1tYXRsYWI6YmVmb3JlIHsgY29udGVudDogJ01BVExBQic7IH0NCiAgcHJlLnNyYy1t c2NnZW46YmVmb3JlIHsgY29udGVudDogJ01zY2dlbic7IH0NCiAgcHJlLnNyYy1vY2FtbDpiZWZv cmUgeyBjb250ZW50OiAnT2JqZWN0aXZlIENhbWwnOyB9DQogIHByZS5zcmMtb2N0YXZlOmJlZm9y ZSB7IGNvbnRlbnQ6ICdPY3RhdmUnOyB9DQogIHByZS5zcmMtb3JnOmJlZm9yZSB7IGNvbnRlbnQ6 ICdPcmcgbW9kZSc7IH0NCiAgcHJlLnNyYy1vejpiZWZvcmUgeyBjb250ZW50OiAnT1onOyB9DQog IHByZS5zcmMtcGxhbnR1bWw6YmVmb3JlIHsgY29udGVudDogJ1BsYW50dW1sJzsgfQ0KICBwcmUu c3JjLXByb2Nlc3Npbmc6YmVmb3JlIHsgY29udGVudDogJ1Byb2Nlc3NpbmcuanMnOyB9DQogIHBy ZS5zcmMtcHl0aG9uOmJlZm9yZSB7IGNvbnRlbnQ6ICdQeXRob24nOyB9DQogIHByZS5zcmMtUjpi ZWZvcmUgeyBjb250ZW50OiAnUic7IH0NCiAgcHJlLnNyYy1ydWJ5OmJlZm9yZSB7IGNvbnRlbnQ6 ICdSdWJ5JzsgfQ0KICBwcmUuc3JjLXNhc3M6YmVmb3JlIHsgY29udGVudDogJ1Nhc3MnOyB9DQog IHByZS5zcmMtc2NoZW1lOmJlZm9yZSB7IGNvbnRlbnQ6ICdTY2hlbWUnOyB9DQogIHByZS5zcmMt c2NyZWVuOmJlZm9yZSB7IGNvbnRlbnQ6ICdHbnUgU2NyZWVuJzsgfQ0KICBwcmUuc3JjLXNlZDpi ZWZvcmUgeyBjb250ZW50OiAnU2VkJzsgfQ0KICBwcmUuc3JjLXNoOmJlZm9yZSB7IGNvbnRlbnQ6 ICdzaGVsbCc7IH0NCiAgcHJlLnNyYy1zcWw6YmVmb3JlIHsgY29udGVudDogJ1NRTCc7IH0NCiAg cHJlLnNyYy1zcWxpdGU6YmVmb3JlIHsgY29udGVudDogJ1NRTGl0ZSc7IH0NCiAgLyogYWRkaXRp b25hbCBsYW5ndWFnZXMgaW4gb3JnLmVsJ3Mgb3JnLWJhYmVsLWxvYWQtbGFuZ3VhZ2VzIGFsaXN0 ICovDQogIHByZS5zcmMtZm9ydGg6YmVmb3JlIHsgY29udGVudDogJ0ZvcnRoJzsgfQ0KICBwcmUu c3JjLWlvOmJlZm9yZSB7IGNvbnRlbnQ6ICdJTyc7IH0NCiAgcHJlLnNyYy1KOmJlZm9yZSB7IGNv bnRlbnQ6ICdKJzsgfQ0KICBwcmUuc3JjLW1ha2VmaWxlOmJlZm9yZSB7IGNvbnRlbnQ6ICdNYWtl ZmlsZSc7IH0NCiAgcHJlLnNyYy1tYXhpbWE6YmVmb3JlIHsgY29udGVudDogJ01heGltYSc7IH0N CiAgcHJlLnNyYy1wZXJsOmJlZm9yZSB7IGNvbnRlbnQ6ICdQZXJsJzsgfQ0KICBwcmUuc3JjLXBp Y29saXNwOmJlZm9yZSB7IGNvbnRlbnQ6ICdQaWNvIExpc3AnOyB9DQogIHByZS5zcmMtc2NhbGE6 YmVmb3JlIHsgY29udGVudDogJ1NjYWxhJzsgfQ0KICBwcmUuc3JjLXNoZWxsOmJlZm9yZSB7IGNv bnRlbnQ6ICdTaGVsbCBTY3JpcHQnOyB9DQogIHByZS5zcmMtZWJuZjJwczpiZWZvcmUgeyBjb250 ZW50OiAnZWJmbjJwcyc7IH0NCiAgLyogYWRkaXRpb25hbCBsYW5ndWFnZSBpZGVudGlmaWVycyBw ZXIgImRlZnVuIG9yZy1iYWJlbC1leGVjdXRlIg0KICAgICAgIGluIG9iLSouZWwgKi8NCiAgcHJl LnNyYy1jcHA6YmVmb3JlICB7IGNvbnRlbnQ6ICdDKysnOyB9DQogIHByZS5zcmMtYWJjOmJlZm9y ZSAgeyBjb250ZW50OiAnQUJDJzsgfQ0KICBwcmUuc3JjLWNvcTpiZWZvcmUgIHsgY29udGVudDog J0NvcSc7IH0NCiAgcHJlLnNyYy1ncm9vdnk6YmVmb3JlICB7IGNvbnRlbnQ6ICdHcm9vdnknOyB9 DQogIC8qIGFkZGl0aW9uYWwgbGFuZ3VhZ2UgaWRlbnRpZmllcnMgZnJvbSBvcmctYmFiZWwtc2hl bGwtbmFtZXMgaW4NCiAgICAgb2Itc2hlbGwuZWw6IG9iLXNoZWxsIGlzIHRoZSBvbmx5IGJhYmVs IGxhbmd1YWdlIHVzaW5nIGEgbGFtYmRhIHRvIHB1dA0KICAgICB0aGUgZXhlY3V0aW9uIGZ1bmN0 aW9uIG5hbWUgdG9nZXRoZXIuICovDQogIHByZS5zcmMtYmFzaDpiZWZvcmUgIHsgY29udGVudDog J2Jhc2gnOyB9DQogIHByZS5zcmMtY3NoOmJlZm9yZSAgeyBjb250ZW50OiAnY3NoJzsgfQ0KICBw cmUuc3JjLWFzaDpiZWZvcmUgIHsgY29udGVudDogJ2FzaCc7IH0NCiAgcHJlLnNyYy1kYXNoOmJl Zm9yZSAgeyBjb250ZW50OiAnZGFzaCc7IH0NCiAgcHJlLnNyYy1rc2g6YmVmb3JlICB7IGNvbnRl bnQ6ICdrc2gnOyB9DQogIHByZS5zcmMtbWtzaDpiZWZvcmUgIHsgY29udGVudDogJ21rc2gnOyB9 DQogIHByZS5zcmMtcG9zaDpiZWZvcmUgIHsgY29udGVudDogJ3Bvc2gnOyB9DQogIC8qIEFkZGl0 aW9uYWwgRW1hY3MgbW9kZXMgYWxzbyBzdXBwb3J0ZWQgYnkgdGhlIExhVGVYIGxpc3RpbmdzIHBh Y2thZ2UgKi8NCiAgcHJlLnNyYy1hZGE6YmVmb3JlIHsgY29udGVudDogJ0FkYSc7IH0NCiAgcHJl LnNyYy1hc206YmVmb3JlIHsgY29udGVudDogJ0Fzc2VtYmxlcic7IH0NCiAgcHJlLnNyYy1jYW1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdDYW1sJzsgfQ0KICBwcmUuc3JjLWRlbHBoaTpiZWZvcmUgeyBj b250ZW50OiAnRGVscGhpJzsgfQ0KICBwcmUuc3JjLWh0bWw6YmVmb3JlIHsgY29udGVudDogJ0hU TUwnOyB9DQogIHByZS5zcmMtaWRsOmJlZm9yZSB7IGNvbnRlbnQ6ICdJREwnOyB9DQogIHByZS5z cmMtbWVyY3VyeTpiZWZvcmUgeyBjb250ZW50OiAnTWVyY3VyeSc7IH0NCiAgcHJlLnNyYy1tZXRh cG9zdDpiZWZvcmUgeyBjb250ZW50OiAnTWV0YVBvc3QnOyB9DQogIHByZS5zcmMtbW9kdWxhLTI6 YmVmb3JlIHsgY29udGVudDogJ01vZHVsYS0yJzsgfQ0KICBwcmUuc3JjLXBhc2NhbDpiZWZvcmUg eyBjb250ZW50OiAnUGFzY2FsJzsgfQ0KICBwcmUuc3JjLXBzOmJlZm9yZSB7IGNvbnRlbnQ6ICdQ b3N0U2NyaXB0JzsgfQ0KICBwcmUuc3JjLXByb2xvZzpiZWZvcmUgeyBjb250ZW50OiAnUHJvbG9n JzsgfQ0KICBwcmUuc3JjLXNpbXVsYTpiZWZvcmUgeyBjb250ZW50OiAnU2ltdWxhJzsgfQ0KICBw cmUuc3JjLXRjbDpiZWZvcmUgeyBjb250ZW50OiAndGNsJzsgfQ0KICBwcmUuc3JjLXRleDpiZWZv cmUgeyBjb250ZW50OiAnVGVYJzsgfQ0KICBwcmUuc3JjLXBsYWluLXRleDpiZWZvcmUgeyBjb250 ZW50OiAnUGxhaW4gVGVYJzsgfQ0KICBwcmUuc3JjLXZlcmlsb2c6YmVmb3JlIHsgY29udGVudDog J1Zlcmlsb2cnOyB9DQogIHByZS5zcmMtdmhkbDpiZWZvcmUgeyBjb250ZW50OiAnVkhETCc7IH0N CiAgcHJlLnNyYy14bWw6YmVmb3JlIHsgY29udGVudDogJ1hNTCc7IH0NCiAgcHJlLnNyYy1ueG1s OmJlZm9yZSB7IGNvbnRlbnQ6ICdYTUwnOyB9DQogIC8qIGFkZCBhIGdlbmVyaWMgY29uZmlndXJh dGlvbiBtb2RlOyBMYVRlWCBleHBvcnQgbmVlZHMgYW4gYWRkaXRpb25hbA0KICAgICAoYWRkLXRv LWxpc3QgJ29yZy1sYXRleC1saXN0aW5ncy1sYW5ncyAnKGNvbmYgIiAiKSkgaW4gLmVtYWNzICov DQogIHByZS5zcmMtY29uZjpiZWZvcmUgeyBjb250ZW50OiAnQ29uZmlndXJhdGlvbiBGaWxlJzsg fQ0KDQogIHRhYmxlIHsgYm9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlOyB9DQogIGNhcHRpb24udC1h Ym92ZSB7IGNhcHRpb24tc2lkZTogdG9wOyB9DQogIGNhcHRpb24udC1ib3R0b20geyBjYXB0aW9u LXNpZGU6IGJvdHRvbTsgfQ0KICB0ZCwgdGggeyB2ZXJ0aWNhbC1hbGlnbjp0b3A7ICB9DQogIHRo Lm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiBjZW50ZXI7ICB9DQogIHRoLm9yZy1sZWZ0ICAgeyB0 ZXh0LWFsaWduOiBjZW50ZXI7ICAgfQ0KICB0aC5vcmctY2VudGVyIHsgdGV4dC1hbGlnbjogY2Vu dGVyOyB9DQogIHRkLm9yZy1yaWdodCAgeyB0ZXh0LWFsaWduOiByaWdodDsgIH0NCiAgdGQub3Jn LWxlZnQgICB7IHRleHQtYWxpZ246IGxlZnQ7ICAgfQ0KICB0ZC5vcmctY2VudGVyIHsgdGV4dC1h bGlnbjogY2VudGVyOyB9DQogIGR0IHsgZm9udC13ZWlnaHQ6IGJvbGQ7IH0NCiAgLmZvb3RwYXJh IHsgZGlzcGxheTogaW5saW5lOyB9DQogIC5mb290ZGVmICB7IG1hcmdpbi1ib3R0b206IDFlbTsg fQ0KICAuZmlndXJlIHsgcGFkZGluZzogMWVtOyB9DQogIC5maWd1cmUgcCB7IHRleHQtYWxpZ246 IGNlbnRlcjsgfQ0KICAuZXF1YXRpb24tY29udGFpbmVyIHsNCiAgICBkaXNwbGF5OiB0YWJsZTsN CiAgICB0ZXh0LWFsaWduOiBjZW50ZXI7DQogICAgd2lkdGg6IDEwMCU7DQogIH0NCiAgLmVxdWF0 aW9uIHsNCiAgICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5lcXVhdGlvbi1sYWJl bCB7DQogICAgZGlzcGxheTogdGFibGUtY2VsbDsNCiAgICB0ZXh0LWFsaWduOiByaWdodDsNCiAg ICB2ZXJ0aWNhbC1hbGlnbjogbWlkZGxlOw0KICB9DQogIC5pbmxpbmV0YXNrIHsNCiAgICBwYWRk aW5nOiAxMHB4Ow0KICAgIGJvcmRlcjogMnB4IHNvbGlkIGdyYXk7DQogICAgbWFyZ2luOiAxMHB4 Ow0KICAgIGJhY2tncm91bmQ6ICNmZmZmY2M7DQogIH0NCiAgI29yZy1kaXYtaG9tZS1hbmQtdXAN CiAgIHsgdGV4dC1hbGlnbjogcmlnaHQ7IGZvbnQtc2l6ZTogNzAlOyB3aGl0ZS1zcGFjZTogbm93 cmFwOyB9DQogIHRleHRhcmVhIHsgb3ZlcmZsb3cteDogYXV0bzsgfQ0KICAubGluZW5yIHsgZm9u dC1zaXplOiBzbWFsbGVyIH0NCiAgLmNvZGUtaGlnaGxpZ2h0ZWQgeyBiYWNrZ3JvdW5kLWNvbG9y OiAjZmZmZjAwOyB9DQogIC5vcmctaW5mby1qc19pbmZvLW5hdmlnYXRpb24geyBib3JkZXItc3R5 bGU6IG5vbmU7IH0NCiAgI29yZy1pbmZvLWpzX2NvbnNvbGUtbGFiZWwNCiAgICB7IGZvbnQtc2l6 ZTogMTBweDsgZm9udC13ZWlnaHQ6IGJvbGQ7IHdoaXRlLXNwYWNlOiBub3dyYXA7IH0NCiAgLm9y Zy1pbmZvLWpzX3NlYXJjaC1oaWdobGlnaHQNCiAgICB7IGJhY2tncm91bmQtY29sb3I6ICNmZmZm MDA7IGNvbG9yOiAjMDAwMDAwOyBmb250LXdlaWdodDogYm9sZDsgfQ0KICAub3JnLXN2ZyB7IH0N Cjwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4jdGFibGUtb2YtY29udGVudHMgaDIgeyBk aXNwbGF5OiBub25lIH0gLnRpdGxlIHsgZGlzcGxheTogbm9uZSB9IC5hdXRob3JuYW1lIHsgdGV4 dC1hbGlnbjogcmlnaHQgfTwvc3R5bGU+PHN0eWxlIHR5cGU9InRleHQvY3NzIj4ub3V0bGluZS0y IHtib3JkZXItdG9wOiAxcHggc29saWQgYmxhY2s7fTwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4N CjxkaXYgaWQ9ImNvbnRlbnQiIGNsYXNzPSJjb250ZW50Ij4NCjxoMSBjbGFzcz0idGl0bGUiPk9D YW1sIFdlZWtseSBOZXdzPC9oMT4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLzIwMjIuMTEuMjIuaHRtbCI+UHJldmlvdXMgV2VlazwvYT4gPGEgaHJlZj0iaHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vaW5kZXguaHRtbCI+DQpVcDwvYT4gPGEgaHJl Zj0iaHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vMjAyMi4xMi4wNi5odG1sIj5OZXh0 IFdlZWs8L2E+IDwvcD4NCjxwPkhlbGxvIDwvcD4NCjxwPkhlcmUgaXMgdGhlIGxhdGVzdCBPQ2Ft bCBXZWVrbHkgTmV3cywgZm9yIHRoZSB3ZWVrIG9mIE5vdmVtYmVyIDIyIHRvIDI5LCAyMDIyLg0K PC9wPg0KPGRpdiBpZD0idGFibGUtb2YtY29udGVudHMiIHJvbGU9ImRvYy10b2MiPg0KPGgyPlRh YmxlIG9mIENvbnRlbnRzPC9oMj4NCjxkaXYgaWQ9InRleHQtdGFibGUtb2YtY29udGVudHMiIHJv bGU9ImRvYy10b2MiPg0KPHVsPg0KPGxpPjxhIGhyZWY9IiMxIj5CwrdvwrdCLCBhbiB1bml2ZXJz YWwgYW5kIHNlY3VyZSBwZWVyLXRvLXBlZXIgZmlsZS10cmFuc2ZlciBpbiBPQ2FtbDwvYT4NCjwv bGk+PGxpPjxhIGhyZWY9IiMyIj5JU08zMTY2IChDb3VudHJ5IENvZGVzKTwvYT4gPC9saT48bGk+ PGEgaHJlZj0iIzMiPklzIHRoZXJlIGFueSB3YXkgdG8gZ2V0IGxpdmUgcHJldmlldyBvZiBwbG90 cyBmcm9tIE93bF9wbHBsb3Q/PC9hPg0KPC9saT48bGk+PGEgaHJlZj0iIzQiPk9DYW1sIENvbW11 bml0eSBDb2RlIG9mIENvbmR1Y3Q8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM1Ij5BZG9wdGluZyB0 aGUgT0NhbWwgQ29kZSBvZiBDb25kdWN0PC9hPiA8L2xpPjxsaT48YSBocmVmPSIjNiI+T0NhbWwg NS4wLjAsIHNlY29uZCBiZXRhIHJlbGVhc2U8L2E+IDwvbGk+PGxpPjxhIGhyZWY9IiM3Ij5PVVBT IG1lZXR1cCBkZWNlbWJlciAyMDIyPC9hPiA8L2xpPjxsaT48YSBocmVmPSIjOCI+T3B0aW1pc2lu ZyBhbiBpbnRlcnByZXRlcjwvYT4gPC9saT48bGk+PGEgaHJlZj0iI29yZzdmYmIxYTAiPk9sZCBD V048L2E+IDwvbGk+PC91bD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci0xIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0iMSI+QsK3b8K3QiwgYW4gdW5pdmVy c2FsIGFuZCBzZWN1cmUgcGVlci10by1wZWVyIGZpbGUtdHJhbnNmZXIgaW4gT0NhbWw8L2gyPg0K PGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTEiPg0KPHA+QXJjaGl2ZTogPGEg aHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1iLW8tYi1hbi11bml2ZXJzYWwt c2VjdXJlLXBlZXItdG8tcGVlci1maWxlLXRyYW5zZmVyLWluLW9jYW1sLzEwODMzLzMiPg0KaHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1iLW8tYi1hbi11bml2ZXJzYWwtc2VjdXJlLXBl ZXItdG8tcGVlci1maWxlLXRyYW5zZmVyLWluLW9jYW1sLzEwODMzLzM8L2E+DQo8L3A+DQo8L2Rp dj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzMxNTczNTciIGNsYXNzPSJvdXRsaW5l LTMiPg0KPGgzIGlkPSJvcmczMTU3MzU3Ij5Db250aW51aW5nIHRoaXMgdGhyZWFkLCBZYXdhciBB bWluIGFza2VkIGFuZCBDYWxhc2NpYmV0dGEgUm9tYWluIHJlcGxpZWQ8L2gzPg0KPGRpdiBjbGFz cz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0ZXh0LW9yZzMxNTczNTciPg0KPHA+SGVsbG8gYW5kIHRo YW5rIHlvdSBmb3IgeW91ciBpbnRlcmVzdCBpbiB0aGUgcHJvamVjdCEgPC9wPg0KPGJsb2NrcXVv dGU+DQo8cD5Eb2VzIHRoaXMgbWVhbiB0aGF0IHVuY29tcHJlc3NlZCBmaWxlcyBhcmUgc2VudCB3 aXRob3V0IGVuY3J5cHRpb24/IDwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPkFueSBkb2N1bWVudHMg c2VudCB3aXRoIEJvYiBpcyBlbmNyeXB0ZWQgOikgLiBXaGF0IHdlIGRvbuKAmXQgd2FudCB0byBk byBpcyBpbmZlciB0aGUgTUlNRSB0eXBlIG9mIHdoYXQgdGhlIHVzZXIgd2FudHMgdG8gc2VuZCAt IGluIHRoaXMgd2UgYXJlIG5vdCB0cnlpbmcgdG8gaW50cm9zcGVjdCB0aGUgY29udGVudCBvZiB0 aGUgZG9jdW1lbnQuIFRoZSB0cmFkZS1vZmYgaXMgdGhhdCB3ZSBjYW7igJl0IGluZmVyIHdoZXRo ZXIgaXQgd291bGQgbWFrZQ0KIHNlbnNlIHRvIGNvbXByZXNzIHRoZSBkb2N1bWVudCBvciBub3Qu IEZvciBleGFtcGxlLCBhIHVzZXIgbWlnaHQgZXhwZWN0IEJvYiB0byBiZSBzbWFydCBlbm91Z2gg dG8gcmVjb2duaXNlIHRoZSBkb2N1bWVudCBhcyBhIHZpZGVvIGFuZCwgaW4gdGhhdCBjYXNlLCBu b3QgY29tcHJlc3MgdGhlIGRvY3VtZW50LiBUaGlzIGlzIG5vdCB0aGUgY2FzZSwgaG93ZXZlciwg aWYgeW91IGRvIG5vdCB3YW50IHRvIGludHJvc3BlY3QgdGhlIE1JTUUgdHlwZQ0KIG9mIHRoZSBk b2N1bWVudCB0byBiZSBzZW50LiA8L3A+DQo8cD5JbiBvdGhlciB3b3JkcywgdGhlIHVzZXIgbXVz dCBiZSBhd2FyZSBvZiB3aGF0IGlzIHRyeWluZyB0byBiZSBzZW50IGFuZCB1c2UgPGNvZGU+DQot LW5vLWNvbXByZXNzaW9uPC9jb2RlPiBvciBub3QgYWNjb3JkaW5nbHkuIEFnYWluLCB0aGUgbGF0 dGVyIG9wdGlvbiBkb2VzIG5vdCBvdmVycmlkZSB0aGUgZW5jcnlwdGlvbiA6KSAuDQo8L3A+DQo8 YmxvY2txdW90ZT4NCjxwPldvdWxkIGl0IGJlIHBvc3NpYmxlIHRvIHVzZSB0aGUgcmVsYXkgb25s eSBmb3IgZXN0YWJsaXNoaW5nIHRoZSBjb25uZWN0aW9uIGFuZCBhZnRlciB0aGF0IGlzIGRvbmUg Zm9yIHRoZSByZWxheSB0byBjb25uZWN0IHRoZSB0d28gcGVlcnMgZGlyZWN0bHksIHJlbW92aW5n IGl0c2VsZiBmcm9tIHRoZSBtaWRkbGU/DQo8L3A+DQo8L2Jsb2NrcXVvdGU+DQo8cD5PbmUgb2Yg dGhlIGltcHJvdmVtZW50cyB3ZSB3YW50IHRvIG1ha2UgaXMgdGhlIGFiaWxpdHkgZm9yIEJvYiB0 byBhY3R1YWxseSBkbyDigJxwZWVyLXRvIC1wZWVy4oCdIC0gYW5kIG5vdCBnbyB0aHJvdWdoIHRo ZSByZWxheS4gSG93ZXZlciwgd2Ugd291bGQgbGlrZSB0byBrZWVwIHRoZSBkZWZhdWx0IG9mIHVz aW5nIHRoZSByZWxheSBmb3Igc2ltcGxpY2l0eS4gVGhlIHBlZXItdG8tcGVlciBjYXNlIHByb2Jh Ymx5IHJlcXVpcmVzIGEgbmV0d29yaw0KIHN0YXRlIChvcGVuIHBvcnRzLCBhY2Nlc3NpYmxlIHBl ZXIpIHRoYXQgbWFueSBkb27igJl0IGhhdmUgZm9yIHZhcmlvdXMgcmVhc29ucyAtIGNvbnZlcnNl bHksIHdlIGtub3cgdGhhdCBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgbm90IHRvIGhhdmUg YWNjZXNzIHRvIG91ciByZWxheSAoYnV0IHRvIGhhdmUgYWNjZXNzIHRvIHRoZSBwZWVyKSBhbmQg aXQgaXMgaW4gdGhpcyBjYXNlIHRoYXQgd2Ugd291bGQgbGlrZSB0byBkbyB0cnVlIHBlZXItdG8t cGVlci4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLTIiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSIyIj5JU08zMTY2IChDb3VudHJ5 IENvZGVzKTwvaDI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtMiIgaWQ9InRleHQtMiI+DQo8 cD5BcmNoaXZlOiA8YSBocmVmPSJodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWlzbzMx NjYtY291bnRyeS1jb2Rlcy8xMDg1NC8xIj4NCmh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4taXNvMzE2Ni1jb3VudHJ5LWNvZGVzLzEwODU0LzE8L2E+IDwvcD4NCjwvZGl2Pg0KPGRpdiBp ZD0ib3V0bGluZS1jb250YWluZXItb3JnOWM0OTNlNiIgY2xhc3M9Im91dGxpbmUtMyI+DQo8aDMg aWQ9Im9yZzljNDkzZTYiPlBhdHJpY2sgRmVycmlzIGFubm91bmNlZDwvaDM+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnOWM0OTNlNiI+DQo8cD5IZWxsbyA6d2F2ZTog PC9wPg0KPHA+T24gYmVoYWxmIG9mIHRoZSA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2Vv Y2FtbCI+Z2VvY2FtbDwvYT4gb3JnYW5pc2F0aW9uLCBJ4oCZbSBoYXBweSB0byBhbm5vdW5jZSB0 aGUgaW5pdGlhbCByZWxlYXNlIG9mDQo8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vZ2VvY2Ft bC9JU08zMTY2Ij5JU08zMTY2PC9hPiwgYSB2ZXJ5IHNpbXBsZSBsaWJyYXJ5IGZvciB3b3JraW5n IHdpdGgg4oCcY291bnRyeSBjb2Rlc+KAnS4NCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29u dGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtb2NhbWwiPiMgPHNwYW4gc3R5bGU9ImNvbG9y OiAjNDQ0ZmNmOyI+SVNPMzE2Ni48L3NwYW4+YWxwaGEzX3RvX2NvdW50cnkgPHNwYW4gc3R5bGU9 ImNvbG9yOiAjMjQyNTIxOyBiYWNrZ3JvdW5kLWNvbG9yOiAjZmNmN2VmOyI+YElSTDwvc3Bhbj4g PHNwYW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+fCZndDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJj b2xvcjogIzQ0NGZjZjsiPklTTzMxNjYuQ291bnRyeS48L3NwYW4+bmFtZTxzcGFuIHN0eWxlPSJj b2xvcjogI2ZmNDUwMDsiPjs7PC9zcGFuPg0KLSA6IHN0cmluZyA9IDxzcGFuIHN0eWxlPSJjb2xv cjogI2NhMzQwMDsiPiZxdW90O0lyZWxhbmQmcXVvdDs8L3NwYW4+DQo8L3ByZT4NCjwvZGl2Pg0K PHA+VGhlIDxjb2RlPkNvdW50cnk8L2NvZGU+IG1vZHVsZSBhbHJlYWR5IGNvbnRhaW5zIGFsbCBv ZiB0aGUgY291bnRyaWVzIGZvciBjb252ZW5pZW5jZSBuYW1lZCBhZnRlciB0aGUgYWxwaGEyIGNv dW50cnkgY29kZS4NCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUg Y2xhc3M9InNyYyBzcmMtb2NhbWwiPiMgPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SVNP MzE2Ni5Db3VudHJ5Ljwvc3Bhbj5mciA8c3BhbiBzdHlsZT0iY29sb3I6ICNhNTJhMmE7Ij58Jmd0 Ozwvc3Bhbj4gPHNwYW4gc3R5bGU9ImNvbG9yOiAjNDQ0ZmNmOyI+SVNPMzE2Ni5Db3VudHJ5Ljwv c3Bhbj5uYW1lPHNwYW4gc3R5bGU9ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQotIDogc3Ry aW5nID0gPHNwYW4gc3R5bGU9ImNvbG9yOiAjY2EzNDAwOyI+JnF1b3Q7RnJhbmNlJnF1b3Q7PC9z cGFuPg0KIyA8c3BhbiBzdHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5JU08zMTY2LkNvdW50cnkuPC9z cGFuPmZyIDxzcGFuIHN0eWxlPSJjb2xvcjogI2E1MmEyYTsiPnwmZ3Q7PC9zcGFuPiA8c3BhbiBz dHlsZT0iY29sb3I6ICM0NDRmY2Y7Ij5JU08zMTY2LkNvdW50cnkuPC9zcGFuPm51bWVyaWMgPHNw YW4gc3R5bGU9ImNvbG9yOiAjYTUyYTJhOyI+fCZndDs8L3NwYW4+IDxzcGFuIHN0eWxlPSJjb2xv cjogIzQ0NGZjZjsiPklTTzMxNjYuPC9zcGFuPm51bWVyaWNfdG9fc3RyaW5nPHNwYW4gc3R5bGU9 ImNvbG9yOiAjZmY0NTAwOyI+Ozs8L3NwYW4+DQotIDogc3RyaW5nID0gPHNwYW4gc3R5bGU9ImNv bG9yOiAjY2EzNDAwOyI+JnF1b3Q7MjUwJnF1b3Q7PC9zcGFuPg0KPC9wcmU+DQo8L2Rpdj4NCjxw PlRoaXMgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL2x1a2VzL0lTTy0zMTY2LUNvdW50cmll cy13aXRoLVJlZ2lvbmFsLUNvZGVzIj4NCmlzIHRoZSBkYXRhIHNvdXJjZTwvYT4sIHJlYWQgaXQg d2l0aCBjYXJlIGlmIHlvdSB3YW50IHRvIHVzZSB0aGlzIGxpYnJhcnkgaW4geW91ciBjb2RlLg0K PC9wPg0KPHA+SGFwcHkgY29kaW5nIDopKSA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8 ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci0zIiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBpZD0i MyI+SXMgdGhlcmUgYW55IHdheSB0byBnZXQgbGl2ZSBwcmV2aWV3IG9mIHBsb3RzIGZyb20gT3ds X3BscGxvdD88L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTMiPg0K PHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2lzLXRoZXJl LWFueS13YXktdG8tZ2V0LWxpdmUtcHJldmlldy1vZi1wbG90cy1mcm9tLW93bC1wbHBsb3QvMTA3 ODcvNiI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaXMtdGhlcmUtYW55LXdheS10by1n ZXQtbGl2ZS1wcmV2aWV3LW9mLXBsb3RzLWZyb20tb3dsLXBscGxvdC8xMDc4Ny82PC9hPg0KPC9w Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmdiZmI2MDZiIiBjbGFzcz0i b3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnYmZiNjA2YiI+Q29udGludWluZyB0aGlzIHRocmVhZCwg c2FuZXR0ZSBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZ2JmYjYwNmIiPg0KPHA+RG9uZSEgPC9wPg0KPHA+dmVyc2lvbiAwLjYgKDxhIGhyZWY9 Imh0dHBzOi8vZ2l0aHViLmNvbS9zYW5ldHRlL29wbG90Ij5naXRodWI8L2E+KSBub3cgdXNlcyBT REwyICh2aWEgdHNkbCkNCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91 dGxpbmUtY29udGFpbmVyLTQiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI0Ij5PQ2FtbCBD b21tdW5pdHkgQ29kZSBvZiBDb25kdWN0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0y IiBpZD0idGV4dC00Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1jb21tdW5pdHktY29kZS1vZi1jb25kdWN0LzEwNDk0LzgwIj4NCmh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1jb21tdW5pdHktY29kZS1vZi1jb25kdWN0LzEw NDk0LzgwPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzQz ZDExNDYiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc0M2QxMTQ2Ij5TdWRoYSBQYXJp bWFsYSBzYWlkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBpZD0idGV4dC1vcmc0 M2QxMTQ2Ij4NCjxwPk9uY2UgYWdhaW4sIHRoYW5rcyBldmVyeW9uZSBmb3IgYWxsIHRoZSBmZWVk YmFjayBoZXJlIGFuZCBvdmVyIERNcy4gUmVhbGx5IGFwcHJlY2lhdGUgZXZlcnlvbmXigJlzIGlu dm9sdmVtZW50IGluIHRoaXMuIEJlbG93IGlzIG91ciByZXNwb25zZS4gRmVlbCBmcmVlIHRvIG51 ZGdlIHVzIGlmIHdlIG1pc3NlZCBzb21ldGhpZyENCjwvcD4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0 bGluZS1jb250YWluZXItb3JnOWZiMzkwNyIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9y ZzlmYjM5MDciPlNjb3BlIG9mIHRoZSBDb2RlIG9mIENvbmR1Y3Q8L2g0Pg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZzlmYjM5MDciPg0KPHA+VGhlIGxpc3Qgb2Ygc3Bh Y2VzIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGJldHRlciBjYXB0dXJlIHRoZSBlc3NlbmNlIG9mIHRo ZSBzcGFjZXMgdGhpcyBDb2RlIG9mIENvbmR1Y3QgYXBwbGllcyB0byAodGhhbmtzIHRvIFhhdmll ciAmYW1wOyBHYWJyaWVsIGZvciB0aGUgd29yZGluZykNCjwvcD4NCjxibG9ja3F1b3RlPg0KPHA+ VGhlc2UgcnVsZXMgYXBwbHkgdG8gdGhlIHByb2plY3RzIGhvc3RlZCBpbiB0aGUgPGEgaHJlZj0i aHR0cDovL2dpdGh1Yi5jb20vb2NhbWwiPg0KR2l0SHViIG9jYW1sIG9yZ2FuaXphdGlvbjwvYT4s IHRoZSA8YSBocmVmPSJodHRwOi8vZGlzY3Vzcy5vY2FtbC5vcmcvIj5kaXNjdXNzLm9jYW1sLm9y ZzwvYT4gZm9ydW0sIHRoZSBbY2FtbC1saXN0QGlucmlhLmZyXSg8YSBocmVmPSJtYWlsdG86Y2Ft bC1saXN0QGlucmlhLmZyIj5tYWlsdG86Y2FtbC1saXN0QGlucmlhLmZyPC9hPikgbWFpbGluZyBs aXN0LCBbT0NhbWwgSVJDXShpcmM6Ly9pcmMubGliZXJhLmNoYXQ6NjY5Ny8jb2NhbWwpLA0KPGEg aHJlZj0iaHR0cHM6Ly9kaXNjb3JkLmdnL2NDWVFicU4iPk9DYW1sIGRpc2NvcmQ8L2E+LCBwaHlz aWNhbCBldmVudHMgbGlrZSBPQ2FtbCBXb3Jrc2hvcCwgYW5kIGFueSBvdGhlciBPQ2FtbC1yZWxh dGVkIHNwYWNlIHRoYXQgYWRvcHRlZCB0aGlzIENvZGUgb2YgQ29uZHVjdC4gQSBtb3JlIGNvbXBy ZWhlbnNpdmUgbGlzdCBvZiBzcGFjZXMgaXMgYXZhaWxhYmxlIGF0IHRoZQ0KPGEgaHJlZj0iaHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL2NvZGUtb2YtY29uZHVjdCI+Y29kZS1vZi1jb25kdWN0PC9h PiBHaXRIdWIgcmVwb3NpdG9yeS4NCjwvcD4NCjwvYmxvY2txdW90ZT4NCjxwPjxiPkJ1aWx0LWlu IG1vZGVyYXRpb24gdG9vbHM8L2I+IDwvcD4NCjxwPlBsYXRmb3JtcyBzdWNoIGFzIGRpc2N1c3Mg aGF2ZSBidWlsdC1pbiBtb2RlcmF0aW9uIHRvb2xzIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJyaW5n IHNvbWV0aGluZyB0byB0aGUgYXR0ZW50aW9uIG9mIHRoZSBtb2RlcmF0b3JzLiBBdCB0aGUgbW9t ZW50LCB3ZSB0aGluayBpdCBtaWdodCBiZSBiZXN0IHRvIGtlZXAgYWRtaW4gYWN0aXZpdGllcyBz dWNoIGFzIHNwYW0gZmlsdGVyaW5nIGFuZCBDb2RlIG9mIENvbmR1Y3QgdmlvbGF0aW9ucyBzZXBh cmF0ZS4NCiBXZSBtYXkgd2FudCB0byBkaXNwbGF5IENvZGUgb2YgQ29uZHVjdCBkZXRhaWxzIGF0 IHBsYXRmb3JtcyBsaWtlIGRpc2N1c3MvZGlzY29yZCBldGMuIEhhcHB5IHRvIHN5bmMgb24gdGhp cyB3aXRoIHRoZSBhZG1pbnMgYW5kIG1vZGVyYXRvcnMgb2YgdGhlIHZhcmlvdXMgcGxhdGZvcm1z IG9uIHRoaXMuDQo8L3A+DQo8cD48Yj5PZmZsaW5lIGV2ZW50czwvYj4gPC9wPg0KPHA+VGhpcyBj b2RlIG9mIGNvbmR1Y3QgZG9jdW1lbnQgY2FuIHNlcnZlIGFzIGEgZ29vZCBwbGFjZSB0byBzdGFy dCBmb3Igb2ZmbGluZSBldmVudHMgc3VjaCBhcyBPQ2FtbCB3b3Jrc2hvcCwgTWlyYWdlIHJldHJl YXQsIGxvY2FsIG1lZXR1cHMgZXRjLiwgYnV0IGl0IG1heSBub3QgYmUgc3VmZmljaWVudCB0byBj b3ZlciBhbGwgdGhlIG5lZWRzIGZvciBwaHlzaWNhbCBldmVudHMuIFRoZSBDb2RlIG9mIENvbmR1 Y3QgdGVhbSBpcyB3aWxsaW5nIHRvDQogd29yayB3aXRoIG9yZ2FuaXNlcnMgb2YgT0NhbWwgcmVs YXRlZCBwaHlzaWNhbCBldmVudHMgdG8gaW1wcm92ZSB0aGUgdGV4dCBhbmQgaGVscCB3aXRoIG1v ZGVyYXRpb24uDQo8L3A+DQo8cD48Yj5WaW9sYXRpb25zIG91dHNpZGUgY29tbXVuaXR5IHNwYWNl czwvYj4gPC9wPg0KPHA+V2UgdW5kZXJzdGFuZCBpbmhpYml0aW9ucyBhYm91dCBpbmNsdWRpbmcg dmlvbGF0aW9ucyBvdXRzaWRlIGNvbW11bml0eSBzcGFjZXMsIHRob3VnaCB3ZSB0aGluayBpdOKA mXMgaW1wb3J0YW50IG5vdCB0byBza2lwIGl0IGluIHRoZSB0ZXh0LiBJdCBpcyBpbiBvcmRlciB0 byBhY2NvdW50IGZvciBpbnRlcmFjdGlvbnMgbm90IHdpdGhpbiB0aGUgcGxhY2VzIHdl4oCZdmUg bGlzdGVkIGV4cGxpY2l0bHk7IHN1Y2ggYXMgZGlyZWN0IG1lc3NhZ2VzLCBwcml2YXRlDQogbWFp bGluZyBsaXN0cyBldGMuIGluIHRoZSBjb250ZXh0IG9mIE9DYW1sIGNvbW11bml0eS4gSG9wZWZ1 bGx5IHdlIGhhdmUgbGl0dGxlIG5lZWQgdG8gZmFsbCBiYWNrIHRvIHRoaXMgY2xhdXNlLCBhbmQg ZXZlbiB3aGVuIHRoZXJlIGlzIGl0IHdpbGwgYmUgZXZhbHVhdGVkIGluIGEgY2FzZSBieSBjYXNl IGJhc2lzLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZ2FjNjkzZjIiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmdhYzY5M2YyIj5SZXBv cnRpbmc8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2FjNjkz ZjIiPg0KPHA+QXMgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudCBpdHNlbGYsIHRoZSBydWxlcyBh cHBseSB0byBldmVyeW9uZSBpbiB0aGUgY29tbXVuaXR5LiBXZSB3b3VsZCBsaWtlIHRvIG1ha2Ug aXQgY2xlYXIgdGhhdCB0aGVyZSBhcmUgbm8gZXhjZXB0aW9ucyB0byB0aGlzLCBpbmNsdWRpbmcg Q29kZSBvZiBDb25kdWN0IGNvbW1pdHRlZSBtZW1iZXJzLiBJZiBhIHJlcG9ydCBpcyBzdWJtaXR0 ZWQgb24gYSBjb21taXR0ZWUgbWVtYmVyLCB0aGUgcmVwb3J0DQogd2lsbCBiZSB0cmVhdGVkIGFz IGFueSBvdGhlciByZXBvcnQsIHRoZSBjb21taXR0ZWUgY29tcG9zZWQgYnkgYWxsIG1lbWJlcnMg ZXhjZXB0IHRoZSBvbmUgcmVwb3J0ZWQgYWdhaW5zdC4gSWYgYW55IG90aGVyIG1lbWJlciB3YW50 cyB0byByZWN1c2UgdGhlbXNlbHZlcyBmb3Igd2hhdGV2ZXIgcmVhc29uLCB0aGV5IHdpbGwgYmUg ZnJlZSB0byBkbyBzby4gSW4gZmFjdCwgbWVtYmVycyB3aWxsIGJlIGZyZWUgdG8gcmVjdXNlIHRo ZW1zZWx2ZXMgZm9yDQogYW55IHJlcG9ydCBiZWZvcmUgdGhlIGRpc2N1c3Npb25zIHN0YXJ0LCBl LmcuIGlmIHRoZSByZXBvcnRlciBvciB0aGUgcGVyc29uIHdob20gaXQgaXMgcmVwb3J0ZWQgYWdh aW5zdCBpcyBjbG9zZSB0byB0aGUgbWVtYmVyLiBUaGlzIGlzIG9uZSBvZiB0aGUgcmVhc29ucyBp bmRpdmlkdWFsIGVtYWlscyB0byBjb250YWN0IG1lbWJlcnMgYXJlIG1hZGUgYXZhaWxhYmxlLCBw ZW9wbGUgYXJlIGZyZWUgdG8gY29udGFjdCBhIHN1YnNldCBvZiB0aGUgY29tbWl0dGVlDQogbWVt YmVycyB0byBzdWJtaXQgYSB2aW9sYXRpb24gcmVwb3J0LiBBZ2FpbiwgdGhlIG1lbWJlciB3aWxs IHJlY3VzZSBmcm9tIHRoZSBwcm9jZXNzIHdoZW4gdGhleSB0aGVtc2VsdmVzIGFyZSByZXBvcnRp bmcgYSB2aW9sYXRpb24uIElmIGEgbWVtYmVy4oCZcyBhY3Rpb25zIGFyZSBmb3VuZCB0byBiZSBp biBzdHJvbmcgdmlvbGF0aW9uIG9mIHRoZSBDb0MsIGFmdGVyIG5lY2Vzc2FyeSBzdGVwcyBhcmUg dGFrZW4sIHRoZXkgbWF5IGFsc28gYmUgYXNrZWQNCiB0byByZXNpZ24gYW5kIGEgbmV3IG1lbWJl ciBpbmR1Y3RlZC4gPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFp bmVyLW9yZzNiNDExMWUiIGNsYXNzPSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczYjQxMTFlIj5O ZXh0IHN0ZXBzPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmcz YjQxMTFlIj4NCjxwPlRoZSB0ZXh0IGhhcyBhIG1vcmUgcGVybWFuZW50IHBsYWNlIGF0IDxhIGhy ZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9jb2RlLW9mLWNvbmR1Y3QiPg0KaHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL2NvZGUtb2YtY29uZHVjdDwvYT4uIFlvdSBhcmUgd2VsY29tZSB0byB1 c2UgaXQgZm9yIHlvdXIgT0NhbWwgcHJvamVjdHMuIFJlY29tbWVuZGF0aW9ucyBmb3IgdXNpbmcg dGhpcyBDb2RlIG9mIENvbmR1Y3QgY2FuIGJlIGZvdW5kIGluIHRoZSByZXBvc2l0b3J5LiBGZWVs IGZyZWUgdG8gZ2V0IGluIHRvdWNoIG9yIHVzZSB0aGUgaXNzdWUgdHJhY2tlciBpZiB5b3UgaGF2 ZSBxdWVzdGlvbnMuDQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjxkaXYg aWQ9Im91dGxpbmUtY29udGFpbmVyLTUiIGNsYXNzPSJvdXRsaW5lLTIiPg0KPGgyIGlkPSI1Ij5B ZG9wdGluZyB0aGUgT0NhbWwgQ29kZSBvZiBDb25kdWN0PC9oMj4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0yIiBpZD0idGV4dC01Ij4NCjxwPkFyY2hpdmU6IDxhIGhyZWY9Imh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hZG9wdGluZy10aGUtb2NhbWwtY29kZS1vZi1jb25kdWN0LzEwODcw LzEiPg0KaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fkb3B0aW5nLXRoZS1vY2FtbC1jb2Rl LW9mLWNvbmR1Y3QvMTA4NzAvMTwvYT4gPC9wPg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc4ZDVlMzU4IiBjbGFzcz0ib3V0bGluZS0zIj4NCjxoMyBpZD0ib3JnOGQ1ZTM1 OCI+U3VkaGEgUGFyaW1hbGEgYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4 dC0zIiBpZD0idGV4dC1vcmc4ZDVlMzU4Ij4NCjxwPkhlbGxvIGV2ZXJ5b25lISA8L3A+DQo8cD5U aGUgT0NhbWwgQ29tbXVuaXR5IENvZGUgb2YgQ29uZHVjdCBpcyBob3N0ZWQgYXQgPGEgaHJlZj0i aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2NvZGUtb2YtY29uZHVjdCI+DQpodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvY29kZS1vZi1jb25kdWN0PC9hPi4gVGhlIGNvZGUgb2YgY29uZHVjdCBhcHBs aWVzIHRvIHRoZSBzcGFjZXMgbGlzdGVkIGluIHRoZSBkb2N1bWVudCwgbmFtZWx5IHRoZQ0KPGEg aHJlZj0iaHR0cDovL2dpdGh1Yi5jb20vb2NhbWwiPkdpdEh1YiBvY2FtbCBvcmdhbml6YXRpb248 L2E+LCB0aGUgPGEgaHJlZj0iaHR0cDovL2Rpc2N1c3Mub2NhbWwub3JnLyI+DQpkaXNjdXNzLm9j YW1sLm9yZzwvYT4gZm9ydW0sIHRoZSBbY2FtbC1saXN0QGlucmlhLmZyXSg8YSBocmVmPSJtYWls dG86Y2FtbC1saXN0QGlucmlhLmZyIj5tYWlsdG86Y2FtbC1saXN0QGlucmlhLmZyPC9hPikgbWFp bGluZyBsaXN0LCBbT0NhbWwgSVJDXShpcmM6Ly9pcmMubGliZXJhLmNoYXQ6NjY5Ny8jb2NhbWwp LA0KPGEgaHJlZj0iaHR0cHM6Ly9kaXNjb3JkLmdnL2NDWVFicU4iPk9DYW1sIGRpc2NvcmQ8L2E+ LCBwaHlzaWNhbCBldmVudHMgbGlrZSBPQ2FtbCBXb3Jrc2hvcC4NCjwvcD4NCjxwPkluIGFkZGl0 aW9uIHRvIHRoaXMsIE9DYW1sIG9wZW4gc291cmNlIHByb2plY3RzIGFuZCBPQ2FtbCBjb21tdW5p dHkgc3BhY2VzIDxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9jb2RlLW9mLWNvbmR1 Y3QjYWRvcHRpbmctdGhpcy1jb2RlLW9mLWNvbmR1Y3QiPg0KYXJlIHdlbGNvbWUgdG8gYWRvcHQ8 L2E+IHRoaXMgQ29kZSBvZiBDb25kdWN0LiBXaGVuIHlvdSBhZG9wdCB0aGlzIGNvZGUgb2YgY29u ZHVjdCBmb3IgeW91ciBwcm9qZWN0LCB5b3UgY2FuIGFkZCB5b3VyIHByb2plY3QgdG8gdGhlDQo8 YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvY29kZS1vZi1jb25kdWN0L2Jsb2IvbWFp bi9saXN0LW9mLWFkb3B0ZXJzLm1kIj4NCmxpc3Qgb2YgYWRvcHRlcnM8L2E+LiA8L3A+DQo8cD5Z b3UgYXJlIHJlcXVlc3RlZCB0byBhZGQgeW91ciBjb250YWN0IGRldGFpbHMgZm9yIHJlcG9ydGlu ZyB2aW9sYXRpb25zLCBhbmQvb3IgeW91IG1heSBhbHNvIGFkZCB0aGUgQ29kZSBvZiBDb25kdWN0 IHRlYW3igJlzIGNvbnRhY3QgZGV0YWlscyBmb3IgcmVwb3J0aW5nIHZpb2xhdGlvbnMgaWYgeW91 IHdpc2guIFNvbWUgcmVjb21tZW5kYXRpb25zIHRvIGFkZCB0aGUgQ29kZSBvZiBDb25kdWN0IHRv IHlvdXIgcHJvamVjdHMNCjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9jb2RlLW9m LWNvbmR1Y3QjYWRvcHRpbmctdGhpcy1jb2RlLW9mLWNvbmR1Y3QiPg0KaGVyZTwvYT4uIDwvcD4N CjxwPkhhcHB5IGluY2x1c2l2ZSBjYW1saW5nISA8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPC9kaXY+ DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci02IiBjbGFzcz0ib3V0bGluZS0yIj4NCjxoMiBp ZD0iNiI+T0NhbWwgNS4wLjAsIHNlY29uZCBiZXRhIHJlbGVhc2U8L2gyPg0KPGRpdiBjbGFzcz0i b3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTYiPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0iaHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMC0wLXNlY29uZC1iZXRhLXJlbGVhc2UvMTA4 NzEvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0wLTAtc2Vjb25kLWJl dGEtcmVsZWFzZS8xMDg3MS8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29u dGFpbmVyLW9yZzAzMjAxZGEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcwMzIwMWRh Ij5vY3RhY2hyb24gYW5ub3VuY2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0zIiBp ZD0idGV4dC1vcmcwMzIwMWRhIj4NCjxwPlRoZSByZWxlYXNlIG9mIE9DYW1sIDUuMC4wIGlzIGRy YXdpbmcgY2xvc2UuIDwvcD4NCjxwPkluIG9yZGVyIHRvIHRlc3QgdGhlIG1vc3QgcmVjZW50IGJ1 ZyBmaXhlcyBhbmQgdG8gaGVscCB5b3UgdXBkYXRlIHlvdXIgc29mdHdhcmUgYW5kIGxpYnJhcmll cyBhaGVhZCBvZiB0aGUgcmVsZWFzZSwgd2UgaGF2ZSByZWxlYXNlZCBhIHNlY29uZCBiZXRhIHZl cnNpb24gb2YgT0NhbWwgNS4wLjAsIChzZWUgYmVsb3cgZm9yIHRoZSBpbnN0YWxsYXRpb24gaW5z dHJ1Y3Rpb25zKS4NCjwvcD4NCjxwPklmIHlvdSBmaW5kIGFueSBidWdzLCBwbGVhc2UgcmVwb3J0 IHRoZW0gaGVyZTogPC9wPg0KPHA+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sL2lzc3VlcyI+aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3VlczwvYT4NCjwv cD4NCjxwPkNvbXBhcmVkIHRvIHRoZSBmaXJzdCBiZXRhIHJlbGVhc2UsIHRoaXMgc2Vjb25kIGJl dGEgY29udGFpbnMgbWFueSBzbWFsbCBpbnRlcm5hbCBzdGFuZGFyZCBsaWJyYXJ5IGZpeGVzLCBv bmUgY29uZmlndXJhdGlvbiBmaXggYW5kIG1hbnkgc21hbGwgYnVnIGZpeGVzLg0KPC9wPg0KPHA+ V2UgYWxzbyBoYXZlIGZldyB1cGRhdGVzIG9mIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaCBpbnRy b2R1Y2UgdHdvIG5ldyBhbGVydHM6IG9uZSBmb3IgdGhlDQo8Y29kZT51bnN0YWJsZTwvY29kZT4g bW9kdWxlcyA8Y29kZT5Eb21haW48L2NvZGU+IGFuZCA8Y29kZT5FZmZlY3Q8L2NvZGU+LCBhbmQg YW5vdGhlciBmb3IgZnVuY3Rpb25zIGRvaW5nDQo8Y29kZT51bnN5bmNocm9uaXplZF9hY2Nlc3M8 L2NvZGU+IHRvIG11dGFibGUgc3RhdGUgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkuIFRob3NlIHR3 byBhbGVydHMgYXJlIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJ1dCBhcmUgYXZhaWxhYmxlIGZvciBp bnRlcmVzdGVkIHVzZXJzLg0KPC9wPg0KPHA+VGhlIGZpcnN0IHJlbGVhc2UgY2FuZGlkYXRlIGZv ciBPQ2FtbCA1LjAuMCBpcyBleHBlY3RlZCB0byBmb2xsb3cgY2xvc2VseSB0aGlzIHNlY29uZCBi ZXRhIHJlbGVhc2UuDQo8L3A+DQo8cD5JZiB5b3UgYXJlIGludGVyZXN0ZWQgYnkgdGhlIG9uZ29p bmcgbGlzdCBvZiBidWcgZml4ZXMsIHRoZSB1cGRhdGVkIGNoYW5nZSBsb2cgZm9yIE9DYW1sIDUu MC4wIGlzIGF2YWlsYWJsZSBhdDoNCjwvcD4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9ibG9iLzUuMC9DaGFuZ2VzIj5odHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvYmxvYi81LjAvQ2hhbmdlczwvYT4NCjwvcD4NCjxwPllvdSBjYW4gYWxzbyBmb2xsb3cg dGhlIHN0YXRlIG9mIHRoZSBvcGFtIGVjb3N5c3RlbSBvbiA8L3A+DQo8cD48YSBocmVmPSJodHRw Oi8vY2hlY2sub2NhbWxsYWJzLmlvLyI+aHR0cDovL2NoZWNrLm9jYW1sbGFicy5pby88L2E+IDwv cD4NCjxwPkEgc2hvcnQgc3VtbWFyeSBvZiB0aGUgY2hhbmdlcyBzaW5jZSB0aGUgZmlyc3QgYmV0 YSByZWxlYXNlIGlzIGFsc28gYXZhaWxhYmxlIGJlbG93Lg0KPC9wPg0KPC9kaXY+DQo8ZGl2IGlk PSJvdXRsaW5lLWNvbnRhaW5lci1vcmc4NmY0YjFjIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBp ZD0ib3JnODZmNGIxYyI+SW5zdGFsbGF0aW9uIGluc3RydWN0aW9uczwvaDQ+DQo8ZGl2IGNsYXNz PSJvdXRsaW5lLXRleHQtNCIgaWQ9InRleHQtb3JnODZmNGIxYyI+DQo8cD5UaGUgYmFzZSBjb21w aWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dpdGNoIHdpdGggdGhlIGZvbGxvd2lu ZyBjb21tYW5kcyBvbiBvcGFtIDIuMToNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFp bmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0gdXBkYXRlDQpvcGFtIHN3aXRj aCBjcmVhdGUgNS4wLjB+YmV0YTINCjwvcHJlPg0KPC9kaXY+DQo8cD5Gb3IgcHJldmlvdXMgdmVy c2lvbnMgb2Ygb3BhbSwgdGhlIHN3aXRjaCBjcmVhdGlvbiBjb21tYW5kIGxpbmUgaXMgc2xpZ2h0 bHkgbW9yZSB2ZXJib3NlOg0KPC9wPg0KPGRpdiBjbGFzcz0ib3JnLXNyYy1jb250YWluZXIiPg0K PHByZSBjbGFzcz0ic3JjIHNyYy1zaGVsbCI+b3BhbSB1cGRhdGUNCm9wYW0gc3dpdGNoIGNyZWF0 ZSA1LjAuMH5iZXRhMiAtLXJlcG9zaXRvcmllcz1kZWZhdWx0LDxzcGFuIHN0eWxlPSJjb2xvcjog IzAwN2E5ZjsiPmJldGE8L3NwYW4+PWdpdCYjNDM7aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLWJldGEtcmVwb3NpdG9yeS5naXQNCjwvcHJlPg0KPC9kaXY+DQo8cD5JdCBtaWdodCBiZSBh bHNvIGludGVyZXN0aW5nIHRvIGNoZWNrIHRoZSBuZXcgc3VwcG9ydCBmb3IgcGFyYWxsZWxpc20g YnkgaW5zdGFsbGluZyB0aGUgZG9tYWluc2xpYiBsaWJyYXJ5IHdpdGgNCjwvcD4NCjxkaXYgY2xh c3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxwcmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0g aW5zdGFsbCBkb21haW5zbGliDQo8L3ByZT4NCjwvZGl2Pg0KPHA+VGhlIHNvdXJjZSBjb2RlIGZv ciB0aGUgYmV0YSByZWxlYXNlIGlzIGF2YWlsYWJsZSBhdCB0aGVzZSBhZGRyZXNzZXM6IDwvcD4N Cjx1bCBjbGFzcz0ib3JnLXVsIj4NCjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvYXJjaGl2ZS81LjAuMC1iZXRhMi50YXIuZ3oiPmh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9hcmNoaXZlLzUuMC4wLWJldGEyLnRhci5nejwvYT4NCjwvbGk+PGxpPjxhIGhy ZWY9Imh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjAvb2NhbWwtNS4w LjB+YmV0YTIudGFyLmd6Ij5odHRwczovL2NhbWwuaW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwt NS4wL29jYW1sLTUuMC4wfmJldGEyLnRhci5nejwvYT4NCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9k aXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRhaW5lci1vcmc3ZGE1YjJhIiBjbGFzcz0ib3V0bGlu ZS00Ij4NCjxoNCBpZD0ib3JnN2RhNWIyYSI+RmluZS10dW5lZCBjb21waWxlciBjb25maWd1cmF0 aW9uPC9oND4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmc3ZGE1YjJh Ij4NCjxwPklmIHlvdSB3YW50IHRvIHR3ZWFrIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjb21w aWxlciwgeW91IGNhbiBzd2l0Y2ggdG8gdGhlIG9wdGlvbiB2YXJpYW50IHdpdGg6DQo8L3A+DQo8 ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxs Ij5vcGFtIHVwZGF0c2UNCm9wYW0gc3dpdGNoIGNyZWF0ZSAmbHQ7c3dpdGNoX25hbWUmZ3Q7IG9j YW1sLXZhcmlhbnRzLjUuMC4wfmJldGEyJiM0MztvcHRpb25zICZsdDtvcHRpb25fbGlzdCZndDsN CjwvcHJlPg0KPC9kaXY+DQo8cD53aGVyZSA8Y29kZT4mbHQ7b3B0aW9uX2xpc3QmZ3Q7PC9jb2Rl PiBpcyBhIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIDxjb2RlPm9jYW1sLW9wdGlvbi0qPC9jb2Rl PiBwYWNrYWdlcy4gRm9yIGluc3RhbmNlLCBmb3IgYSBmbGFtYmRhIGFuZCBuby1mbGF0LWZsb2F0 LWFycmF5IHN3aXRjaDoNCjwvcD4NCjxkaXYgY2xhc3M9Im9yZy1zcmMtY29udGFpbmVyIj4NCjxw cmUgY2xhc3M9InNyYyBzcmMtc2hlbGwiPm9wYW0gc3dpdGNoIGNyZWF0ZSA1LjAuMH5iZXRhMiYj NDM7ZmxhbWJkYSYjNDM7bmZmYSBvY2FtbC12YXJpYW50cy41LjAuMH5iZXRhMiYjNDM7b3B0aW9u cyBvY2FtbC1vcHRpb24tZmxhbWJkYSBvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0K PC9wcmU+DQo8L2Rpdj4NCjxwPlRoZSBjb21tYW5kIGxpbmUgYWJvdmUgaXMgc2xpZ2h0bHkgbW9y ZSBjb21wbGljYXRlZCBmb3Igb3BhbSB2ZXJzaW9ucyBhbnRlcmlvciB0byAyLjE6DQo8L3A+DQo8 ZGl2IGNsYXNzPSJvcmctc3JjLWNvbnRhaW5lciI+DQo8cHJlIGNsYXNzPSJzcmMgc3JjLXNoZWxs Ij5vcGFtIHVwZGF0ZQ0Kb3BhbSBzd2l0Y2ggY3JlYXRlICZsdDtzd2l0Y2hfbmFtZSZndDsgLS1w YWNrYWdlcz1vY2FtbC12YXJpYW50cy41LjAuMH5iZXRhMiYjNDM7b3B0aW9ucywmbHQ7b3B0aW9u X2xpc3QmZ3Q7DQotLXJlcG9zaXRvcmllcz1kZWZhdWx0LDxzcGFuIHN0eWxlPSJjb2xvcjogIzAw N2E5ZjsiPmJldGE8L3NwYW4+PWdpdCYjNDM7aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s LWJldGEtcmVwb3NpdG9yeS5naXQNCjwvcHJlPg0KPC9kaXY+DQo8cD5JbiBib3RoIGNhc2VzLCBh bGwgYXZhaWxhYmxlIG9wdGlvbnMgY2FuIGJlIGxpc3RlZCB3aXRoIOKAnG9wYW0gc2VhcmNoIG9j YW1sLW9wdGlvbuKAnS4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNv bnRhaW5lci1vcmc4Y2I4YjBjIiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnOGNiOGIw YyI+Q2hhbmdlcyBzaW5jZSB0aGUgZmlyc3QgYmV0YTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnOGNiOGIwYyI+PC9kaXY+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGEgaWQ9Im9yZzdlZGJkOGYiPjwvYT5Db25maWd1cmF0aW9uIGNoYW5nZXM8YnI+DQo8 ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnN2VkYmQ4ZiI+DQo8dWwgY2xh c3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L2lzc3Vlcy8xMTA5NyI+IzExMDk3PC9hPjogQnVpbGQgbmF0aXZlLWNvZGUgY29tcGlsZXJzIG9u IE5ldEJTRC9hYXJjaDY0IChLYXRlIERlcGxhaXgsIHJldmlldyBieSBBbmlsIE1hZGhhdmFwZWRk eSkNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48bGk+PGEgaWQ9Im9yZ2YwYTgyMjIiPjwvYT5C dWcgZml4ZXM8YnI+DQo8ZGl2IGNsYXNzPSJvdXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnZjBh ODIyMiI+DQo8dWwgY2xhc3M9Im9yZy11bCI+DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMDg3NSI+IzEwODc1PC9hPiwgJiM0Mzs8YSBocmVmPSJo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNzMxIj4jMTE3MzE8L2E+OiBB ZGQgb3B0aW9uIHRvIGFsbG9jYXRlIGZpYmVyIHN0YWNrcyBhbmQgc2lnYWx0c3RhY2tzIHdpdGgg bW1hcChNQVBfU1RBQ0spIGluc3RlYWQgb2YgbWFsbG9jLiBUaGlzIGlzIGV4cG9zZWQgdmlhIGEg Y29uZmlndXJlDQog4oCTZW5hYmxlLW1tYXAtbWFwLXN0YWNrIG9wdGlvbiwgYW5kIGlzIGVuYWJs ZWQgYnkgZGVmYXVsdCBvbiBPcGVuQlNEIHdoZXJlIGl0IGlzIG1hbmRhdG9yeS4gKEFuaWwgTWFk aGF2YXBlZGR5LCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyLCBUb20gS2VsbHksIE1pY2hhZWwg SGVuZHJpY2tzIGFuZCBLQyBTaXZhcmFtYWtyaXNobmFuKS4NCjwvbGk+PGxpPjxhIGhyZWY9Imh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE2NTIiPiMxMTY1MjwvYT46IEZp eCBiZW5pZ24gb2ZmLWJ5LW9uZSBlcnJvciBpbiBXaW5kb3dzIGltcGxlbWVudGF0aW9uIG9mIGNh bWxfbWVtX21hcC4gKERhdmlkIEFsbHNvcHAsIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQo8 L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEx NjY5Ij4jMTE2Njk8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv aXNzdWVzLzExNzA0Ij4NCiMxMTcwNDwvYT46IEZpeCBjb25zdHJ1Y3Rpb24gb2YgRWZmZWN0LlVu aGFuZGxlZCBleGNlcHRpb25zIGluIHRoZSBieXRlY29kZSBpbnRlcnByZXRlci4gKERhdmlkIEFs bHNvcHAgYW5kIFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IFNhbXVlbCBIeW0sIHJldmlldyBieSBY YXZpZXIgTGVyb3kgYW5kIEdhYnJpZWwgU2NoZXJlcikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTExODQiPiMxMTE4NDwvYT4sICYjNDM7 PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTY3MCI+IzEx NjcwPC9hPjogU3RvcCBjYWxsaW5nIHJhbmxpYiBvbiBjcmVhdGVkIC8gaW5zdGFsbGVkIGxpYnJh cmllcyAoU8OpYmFzdGllbiBIaW5kZXJlciBhbmQgWGF2aWVyIExlcm95LCByZXZpZXcgYnkgdGhl IHNhbWUpDQo8L2xpPjxsaT48YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv aXNzdWVzLzExMTk0Ij4jMTExOTQ8L2E+LCA8YSBocmVmPSJodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzExNjA5Ij4NCiMxMTYwOTwvYT46IEZpeCBpbmNvbnNpc3RlbnQgdHlw ZSB2YXJpYWJsZSBuYW1lcyBpbiDigJx1bmJvdW5kIHR5cGUgdmFy4oCdIG1lc3NhZ2VzIChVbHlz c2UgR8OpcmFyZCBhbmQgRmxvcmlhbiBBbmdlbGV0dGksIHJldmlldyBGbG9yaWFuIEFuZ2VsZXR0 aSBhbmQgR2FicmllbCBTY2hlcmVyKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTYyMiI+IzExNjIyPC9hPjogUHJldmVudCBzdGFjayBv dmVyZmxvdyB3aGVuIHByaW50aW5nIGEgY29uc3RydWN0b3Igb3IgcmVjb3JkIG1pc21hdGNoIGVy cm9yIGludm9sdmluZyByZWN1cnNpdmUgdHlwZXMuIChGbG9yaWFuIEFuZ2VsZXR0aSwgcmV2aWV3 IGJ5IEdhYnJpZWwgU2NoZXJlcikNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE2NjIiPiMxMTY2MjwvYT4sIDxhIGhyZWY9Imh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE2NzMiPg0KIzExNjczPC9hPjogZml4IGEg bWVtb3J5IGxlYWsgd2hlbiB1c2luZyBEeW5saW5rLCB0aGUgYnVnIHdhcyBvbmx5IHByZXNlbnQg aW4gZGV2ZWxvcG1lbnQgdmVyc2lvbiBvZiBPQ2FtbCA1LiAoU3RlcGhlbiBEb2xhbiwgcmVwb3J0 IGJ5IEFuZHJlIE1hcm9uZXplLCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KPC9saT48bGk+ PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTczMiI+IzEx NzMyPC9hPjogRW5zdXJlIHRoYXQgdHlwZXMgZnJvbSBwYWNrZWQgbW9kdWxlcyBhcmUgYWx3YXlz IGdlbmVyYWxpc2VkIChTdGVwaGVuIERvbGFuIGFuZCBMZW8gV2hpdGUsIHJldmlldyBieSBKYWNx dWVzIEdhcnJpZ3VlKQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlcy8xMTczNyI+IzExNzM3PC9hPjogRml4IHNlZ2ZhdWx0IGNvbmRpdGlvbiBp biBVbml4LnN0YXQgdW5kZXIgV2luZG93cyBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUgdGhy ZWFkcy4gKE1hcmMgTGFzc29uLCBOaWNvbMOhcyBPamVkYSBCw6RyLCByZXZpZXcgYnkgR2Ficmll bCBTY2hlcmVyIGFuZCBEYXZpZCBBbGxzb3BwKQ0KPC9saT48L3VsPg0KPC9kaXY+DQo8L2xpPjxs aT48YSBpZD0ib3JnY2I1ZTAzYyI+PC9hPkRvY3VtZW50YXRpb248YnI+DQo8ZGl2IGNsYXNzPSJv dXRsaW5lLXRleHQtNSIgaWQ9InRleHQtb3JnY2I1ZTAzYyI+DQo8dWwgY2xhc3M9Im9yZy11bCI+ DQo8bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMTE5 MyI+IzExMTkzPC9hPiwgPGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMTIyNyI+DQojMTEyMjc8L2E+OiBkb2N1bWVudGF0aW9uIG9uIGNvbmN1cnJlbmN5IHNh ZmV0eSBmb3IgbXV0YWJsZSBkYXRhIHR5cGVzIGFuZCBzdGF0ZXMgaW4gdGhlIHN0YW5kYXJkIGxp YnJhcnkuIEENCjxjb2RlPnVuc3luY2hyb25pemVkX2FjY2VzczwvY29kZT4gYWxlcnQgaGF2ZSBi ZWVuIGFkZGVkIGZvciBmdW5jdGlvbnMgdGhhdCByZXF1aXJlIHVzZXIgc3luY2hyb25pemF0aW9u cyBvbiBjb25jdXJyZW50IGFjY2Vzcy4gVGhlIG5ldyBhbGVydCBpcyBkaWFibGVkIGJ5IGRlZmF1 bHQuIChGbG9yaWFuIEFuZ2VsZXR0aSwgcmV2aWV3IGJ5IEZyYW7Dp29pcyBQb3R0aWVyIGFuZCBL QyBTaXZhcmFtYWtyaXNobmFuICkNCjwvbGk+PGxpPjxhIGhyZWY9Imh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTE1MjYiPiMxMTUyNjwvYT4sIGFkZCBhIDxjb2RlPg0KdW5z dGFibGU8L2NvZGU+IGFsZXJ0IHRvIHRoZSBEb21haW4gYW5kIEVmZmVjdCBtb2R1bGVzLiBUaGUg bmV3IGFsZXJ0IGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQuIChGbG9yaWFuIEFuZ2VsZXR0aSwgcmV2 aWV3IGJ5IE5pY29sw6FzIE9qZWRhIELDpHIsIERhbmllbCBCw7xuemxpLCBhbmQgS2F0ZSBEZXBs YWl4KQ0KPC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xMTY0MCI+IzExNjQwPC9hPjogQWRkIEZsYW1iZGEgY29tbW9ubHktdXNlZCBvcHRpb25z IHRvIHRoZSBvY2FtbG9wdCBtYW5wYWdlIChBbWFuZGluZSBOYW5nYWgsIHJldmlldyBieSBEYXZp ZCBBbGxzb3BwLCBGbG9yaWFuIEFuZ2VsZXR0aSwgU8OpYmFzdGllbiBIaW5kZXJlciwgYW5kIFZp bmNlbnQgTGF2aXJvbikNCjwvbGk+PC91bD4NCjwvZGl2Pg0KPC9saT48L3VsPg0KPC9kaXY+DQo8 L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItNyIgY2xhc3M9Im91dGxp bmUtMiI+DQo8aDIgaWQ9IjciPk9VUFMgbWVldHVwIGRlY2VtYmVyIDIwMjI8L2gyPg0KPGRpdiBj bGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTciPg0KPHA+QXJjaGl2ZTogPGEgaHJlZj0i aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291cHMtbWVldHVwLWRlY2VtYmVyLTIwMjIvMTA4 NzIvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3Vwcy1tZWV0dXAtZGVjZW1iZXIt MjAyMi8xMDg3Mi8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVy LW9yZzY0Y2I1NDEiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmc2NGNiNTQxIj56YXBh c2hjYW5vbiBhbm5vdW5jZWQ8L2gzPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTMiIGlkPSJ0 ZXh0LW9yZzY0Y2I1NDEiPg0KPHA+VGhlIG5leHQgT1VQUyBtZWV0dXAgd2lsbCB0YWtlIHBsYWNl IG9uIDxiPlRodXJzZGF5LCA4dGggb2YgRGVjZW1iZXI8L2I+IDIwMjIuIEl0IHdpbGwgc3RhcnQg YXQNCjxiPjdwbTwvYj4gYXQgdGhlIDxiPjQgcGxhY2UgSnVzc2lldTwvYj4sIDc1MDA1IFBhcmlz LiA8L3A+DQo8cD46d2FybmluZzogOnRydW1wZXQ6IEl0IDxiPndvbuKAmXQ8L2I+IGJlIGluIHRo ZSB1c3VhbCByb29tIGJ1dCBpbiB0aGUgPGI+QXN0aWVyIGFtcGhpdGhlYXRlcjwvYj4gaW4gdGhl DQo8Yj5Fc2NsYW5nb24gYnVpbGRpbmc8L2I+LiA6dHJ1bXBldDogOndhcm5pbmc6IDwvcD4NCjxw PlBsZWFzZSwgPGI+PGEgaHJlZj0iaHR0cHM6Ly93d3cubWVldHVwLmNvbS9mci1GUi9vY2FtbC1w YXJpcy9ldmVudHMvMjg5OTA5Mzc0Ij5yZWdpc3RlciBvbiBtZWV0dXA8L2E+PC9iPiBhcyBzb29u IGFzIHBvc3NpYmxlIHRvIGxldCB1cyBrbm93IGhvdyBtYW55IHBpenphIHdlIHNob3VsZCBvcmRl ci4NCjwvcD4NCjxwPkFzIHVzdWFsLCBwcmVzZW50YXRpb25zIHdpbGwgYmUgc3RyZWFtZWQgb24g dGhlIDxhIGhyZWY9Imh0dHBzOi8vZ2FsZW5lLmlyaWxsLm9yZy9ncm91cC9vdXBzIj4NCk9VUFPi gJkgZ2Fsw6huZTwvYT4uIDwvcD4NCjxwPkZvciBtb3JlIGRldGFpbHMsIHlvdSBtYXkgY2hlY2sg dGhlIDxhIGhyZWY9Imh0dHBzOi8vb3Vwcy5mcmFtYS5pbyI+T1VQU+KAmSB3ZWJzaXRlPC9hPi4N CjwvcD4NCjxwPlRoaXMgbW9udGggd2lsbCBmZWF0dXJlIHRoZSBmb2xsb3dpbmcgdGFsa3MgOiA8 L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZzM4NmNhNGIiIGNsYXNz PSJvdXRsaW5lLTQiPg0KPGg0IGlkPSJvcmczODZjYTRiIj5DYW1sYm9vdDogZGVib290c3RyYXBw aW5nIHRoZSBPQ2FtbCBjb21waWxlciAtIE5hdGhhbmHDq2xsZSBDb3VyYW50PC9oND4NCjxkaXYg Y2xhc3M9Im91dGxpbmUtdGV4dC00IiBpZD0idGV4dC1vcmczODZjYTRiIj4NCjxwPkluIHRoaXMg dGFsaywgSSB3aWxsIHByZXNlbnQgQ2FtbGJvb3QsIGEgcHJvamVjdCB3aGljaCBkZWJvb3RzdHJh cHMgdGhlIE9DYW1sIGNvbXBpbGVyLCB0aGF0IGlzLCBpcyBhYmxlIHRvIGNvbXBpbGUgdGhlIE9D YW1sIGNvbXBpbGVyIHdpdGhvdXQgdXNpbmcgdGhlIGJvb3RzdHJhcCBiaW5hcnkuIENhbWxib290 IGNvbnNpc3RzIGluIGEgbmHDr3ZlIGNvbXBpbGVyIGZvciBhIHN1YnNldCBvZiBPQ2FtbCBjYWxs ZWQgTWluaU1MLCBhbmQgYW4gaW50ZXJwcmV0ZXINCiBmb3IgT0NhbWwgd3JpdHRlbiBpbiBNaW5p TUwuIEkgd2lsbCBmaXJzdCBqdXN0aWZ5IHRoZSBpbnRlcmVzdCBvZiBkZWJvb3RzdHJhcHBpbmcs IHRoZW4gZXhwbGFpbiB0aGUgYXJjaGl0ZWN0dXJlIGFuZCBwYXJ0cyBvZiBDYW1sYm9vdCwgYW5k IGZpbmFsbHkgcHJlc2VudCB0aGUgZXhwZXJpbWVudGFsIHZhbGlkYXRpb24gb2YgQ2FtbGJvb3Qu DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTU1 NWMwMSIgY2xhc3M9Im91dGxpbmUtNCI+DQo8aDQgaWQ9Im9yZ2U1NTVjMDEiPlRoZSBDYW1lbOKA mXMgVm9pY2UgLSBFbmd1ZXJyYW5kIERlY29ybmU8L2g0Pg0KPGRpdiBjbGFzcz0ib3V0bGluZS10 ZXh0LTQiIGlkPSJ0ZXh0LW9yZ2U1NTVjMDEiPg0KPHA+VGhpcyBwcmVzZW50YXRpb24gd2lsbCBi ZSBhbiBpbmZvcm1hbCBhbmQgc2ltcGxpc3RpYyBpbnRyb2R1Y3Rpb24gdG8gbXVzaWMgcHJvZ3Jh bW1pbmcgdmlhIGEgY29tcHV0ZXIuIFRoZXJlIGFyZSBtYW55IOKAnGxpdmUgY29kaW5n4oCdIGxh bmd1YWdlcyAoU29uaWNQaSwgVGlkYWxDeWNsZXMpLCBidXQgaXQgaXMgYWxzbyBxdWl0ZSBwb3Nz aWJsZSB0byBleHBlcmltZW50IHdpdGggaGF2aW5nIGZ1biB3aXRoIG91ciBmYXZvcml0ZSBsYW5n dWFnZSENCiBJIHdpbGwgcHJlc2VudCB2YXJpb3VzIHByb2plY3RzIG9uIHdoaWNoIEkgaGF2ZSBl eHBlcmltZW50ZWQsIHdpdGggYWNjb21wYW55aW5nIHNvdW5kIGRlbW9uc3RyYXRpb25zLiBEaXNj bGFpbWVyOiBUaGlzIHByZXNlbnRhdGlvbiBjb250YWlucyBjb21wbGltZW50cyB0byB0aGUgTUlE SSBwcm90b2NvbC4NCjwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8ZGl2IGlkPSJvdXRsaW5lLWNvbnRh aW5lci1vcmcwMDM3ZWY0IiBjbGFzcz0ib3V0bGluZS00Ij4NCjxoNCBpZD0ib3JnMDAzN2VmNCI+ WU9jYW1sIC0gWGF2aWVyIFZhbiBkZSBXb2VzdHluZTwvaDQ+DQo8ZGl2IGNsYXNzPSJvdXRsaW5l LXRleHQtNCIgaWQ9InRleHQtb3JnMDAzN2VmNCI+DQo8cD5ZT0NhbWwgaXMgYSBzdGF0aWMgYmxv ZyBnZW5lcmF0b3IgdGhhdCB3YXMgZGV2ZWxvcGVkIHRvIHRlc3QgdGhlIFByZWZhY2UgbGlicmFy eS4gSXQgaXMgcmVsYXRpdmVseSBpbXByYWdtYXRpYywgcGFydGlhbGx5IHBvb3JseSBkb2N1bWVu dGVkLCBhbmQgaGFzIG5vIGVmZmVjdGl2ZSBjYWNoaW5nIHN0cmF0ZWd5LiBIb3dldmVyLCBpdHMg Z2VuZXNpcyBpcyBmdW4gKGFuZCB0cmllcyB0byB1c2UgdG9vbHMgbm90IHZlcnkgcHJlc2VudCBp biB0aGUNCiB3b3JsZCBvZiBPQ2FtbCkgYW5kIHNvbWUgZXh0ZXJuYWwgY29udHJpYnV0aW9ucyBo YXZlIG1hZGUgaXQgcXVpdGUgZXhwbGljaXRseSBjb3VwbGluZyB3aXRoIE1pcmFnZU9TLiBJbiB0 aGlzIHByZXNlbnRhdGlvbiwgSSBpbnZpdGUgeW91IHRvIGRpc2NvdmVyIGl0cyBnZW5lcmFsIG9w ZXJhdGlvbiwgc29tZSBkZXNpZ24gY2hvaWNlcyBhbmQgYSBicmllZiB0dXRvcmlhbCBvbiBob3cg dG8gdXNlIGl0Lg0KPC9wPg0KPHA+QWZ0ZXIgdGhlIHByZXNlbnRhdGlvbnMsIHRoZXJlIHdpbGwg YmUgc29tZSBwaXp6YXMgb2ZmZXJlZCBieSB0aGUgPGEgaHJlZj0iaHR0cHM6Ly9vY2FtbC1zZi5v cmciPg0KT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbjwvYT4gISA6cGl6emE6IDwvcD4NCjwvZGl2 Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItOCIg Y2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9IjgiPk9wdGltaXNpbmcgYW4gaW50ZXJwcmV0ZXI8 L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlkPSJ0ZXh0LTgiPg0KPHA+QXJjaGl2 ZTogPGEgaHJlZj0iaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29wdGltaXNpbmctYW4taW50 ZXJwcmV0ZXIvMTA4NzQvMSI+DQpodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3B0aW1pc2lu Zy1hbi1pbnRlcnByZXRlci8xMDg3NC8xPC9hPiA8L3A+DQo8L2Rpdj4NCjxkaXYgaWQ9Im91dGxp bmUtY29udGFpbmVyLW9yZzJiMzU5MzkiIGNsYXNzPSJvdXRsaW5lLTMiPg0KPGgzIGlkPSJvcmcy YjM1OTM5Ij5Kb24gSGFycm9wIGFza2VkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxpbmUtdGV4dC0z IiBpZD0idGV4dC1vcmcyYjM1OTM5Ij4NCjxwPklmIEkgaGF2ZSBhbiBpbnRlcnByZXRlciB3cml0 dGVuIGluIE9DYW1sIGFuZCBJIHdhbnQgaXQgdG8gcnVuIGNvZGUgZmFzdGVyIHdpdGhvdXQgdGhl IGJ1cmRlbiBvZiBoYXZpbmcgdG8gd3JpdGUgYSBjb21waWxlciB3aGF0IGFyZSBteSBvcHRpb25z Pw0KPC9wPg0KPHA+SSBjb3VsZCB1c2UgTWV0YU9DYW1sIGFuZCBkbyBzdGFnZWQgbWV0YXByb2dy YW1taW5nLiBTaG91bGQgYmUgZWFzeSBhbmQgYWNoaWV2ZSBhIHZlcnkgcmVzcGVjdGFibGUgc3Bl ZWR1cCBidXQgTWV0YU9DYW1sIGlzIG9ic2N1cmUgc28gSSBhc3N1bWUgZGV2IHRvb2xzIHdvdWxk IG5vIGxvbmdlciB3b3JrPw0KPC9wPg0KPHA+SWYgSSBydW4gbXkgaW50ZXJwcmV0ZXIgYXMgYnl0 ZWNvZGUgY2FuIEkgZ2VuZXJhdGUgYnl0ZWNvZGUgb24tdGhlLWZseSBhbmQgaGF2ZSBpdCBleGVj dXRlZD8gSWYgc28sIGhvdz8gQ2FuIG1hbGZ1bmN0aW9uIGRvIHRoaXMgc29ydCBvZiB0aGluZz8N CjwvcD4NCjxwPkFyZSB0aGVyZSBhbnkgbGlicmFyaWVzIHRoYXQgbWlnaHQgaGVscCBsaWtlIGV4 cHJlc3Npb24gdHJlZXMgdG8gTExWTSBjb21waWxlcnM/DQo8L3A+DQo8L2Rpdj4NCjwvZGl2Pg0K PGRpdiBpZD0ib3V0bGluZS1jb250YWluZXItb3JnZTljNTkyZCIgY2xhc3M9Im91dGxpbmUtMyI+ DQo8aDMgaWQ9Im9yZ2U5YzU5MmQiPkRpZGllciBXZW56ZWsgcmVwbGllZDwvaDM+DQo8ZGl2IGNs YXNzPSJvdXRsaW5lLXRleHQtMyIgaWQ9InRleHQtb3JnZTljNTkyZCI+DQo8cD5UaGlzIHNlcmll cyBvZiBwb3N0cyBtaWdodCBoZWxwIHlvdTogPGEgaHJlZj0iaHR0cHM6Ly9tdWt1bHJhdGhpLmNv bS9jcmVhdGUteW91ci1vd24tcHJvZ3JhbW1pbmctbGFuZ3VhZ2UvaW50cm8tdG8tY29tcGlsZXIv Ij4NCkhvdyBJIHdyb3RlIG15IG93biDigJxwcm9wZXLigJ0gcHJvZ3JhbW1pbmcgbGFuZ3VhZ2U8 L2E+LiBUaGlzIHVzZXMgYSBjb21iaW5hdGlvbiBvZiBPQ2FtbC9DJiM0MzsmIzQzOy9MTFZNLiBT byBub3QgZXhhY3RseSB3aGF0IHlvdSBhcmUgbG9va2luZyBmb3IsIGJ1dCBkZWZpbml0ZWx5IGEg dmFsdWFibGUgc291cmNlIG9mIGluc3BpcmF0aW9uLg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjxk aXYgaWQ9Im91dGxpbmUtY29udGFpbmVyLW9yZ2RmN2E3YWIiIGNsYXNzPSJvdXRsaW5lLTMiPg0K PGgzIGlkPSJvcmdkZjdhN2FiIj55Z3JlayByZXBsaWVkPC9oMz4NCjxkaXYgY2xhc3M9Im91dGxp bmUtdGV4dC0zIiBpZD0idGV4dC1vcmdkZjdhN2FiIj4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vZ2l0 aHViLmNvbS9zdGVkb2xhbi9tYWxmdW5jdGlvbiI+aHR0cHM6Ly9naXRodWIuY29tL3N0ZWRvbGFu L21hbGZ1bmN0aW9uPC9hPg0KPC9wPg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2Pg0KPGRpdiBpZD0i b3V0bGluZS1jb250YWluZXItb3JnN2ZiYjFhMCIgY2xhc3M9Im91dGxpbmUtMiI+DQo8aDIgaWQ9 Im9yZzdmYmIxYTAiPk9sZCBDV048L2gyPg0KPGRpdiBjbGFzcz0ib3V0bGluZS10ZXh0LTIiIGlk PSJ0ZXh0LW9yZzdmYmIxYTAiPg0KPHA+SWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3Ug Y2FuIDxhIGhyZWY9Im1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmciPg0Kc2Vu ZCBtZSBhIG1lc3NhZ2U8L2E+IGFuZCBJ4oCZbGwgbWFpbCBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLyI+DQp0 aGUgYXJjaGl2ZTwvYT4gb3IgdGhlIDxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvY3duL2N3bi5yc3MiPlJTUyBmZWVkIG9mIHRoZSBhcmNoaXZlczwvYT4uDQo8L3A+DQo8cD5J ZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5 IHN1YnNjcmliZSA8YSBocmVmPSJodHRwOi8vbGlzdHMuaWR5bGwub3JnL2xpc3RpbmZvL2NhbWwt bmV3cy13ZWVrbHkvIj4NCm9ubGluZTwvYT4uIDwvcD4NCjxkaXYgY2xhc3M9ImF1dGhvcm5hbWUi IGlkPSJvcmcyZDBkYzI4Ij4NCjxwPjxhIGhyZWY9Imh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvIj5BbGFuIFNjaG1pdHQ8L2E+IDwvcD4NCjwvZGl2Pg0KPC9kaXY+DQo8L2Rpdj4NCjwvZGl2 Pg0KPC9ib2R5Pg0KPC9odG1sPg0K From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=vP6iBCe5; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=XeRRDLnq; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 08441B80123 for ; Tue, 26 Mar 2024 07:11:12 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=olh3nqCV5UM3i/O0Wad/IBj+vLKQTdTSNRQxnJZPj4Y=; b=vP6iBCe5GGZXLo4J6pZmBY5qfEsl+OhuP5Vk0mJMA+qstODdQ/X4A8QC EvGShvpLbIjtcFfR9TBp0xy3h9LdOXpNmHzHdalnQCeJJfCpro0PAeSGF D/C24OOa2cuPCd9EmyGyctBLy8lr4Wa4f3mnfiMm9sQMbf0DWuHjZEoco M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,155,1708383600"; d="scan'208,217";a="158438658" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 26 Mar 2024 08:11:11 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 88EDBE0149; Tue, 26 Mar 2024 08:11:11 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5D2B7E0147 for ; Tue, 26 Mar 2024 08:11:09 +0100 (CET) IronPort-SDR: 66026c64_zXxFfIZSlY2D4CIjP3fbfIjp+xiDIB0I44xFPiadeFA/8HY m7HIZ+BIg4SILwN7xwKsvPUOiGBixcdgFZqMDyQ== X-IPAS-Result: =?us-ascii?q?A0EiBgCfcwJmjCIeaIFaFoJCgTaBAxkBYlYyBwhIhFaDT?= =?us-ascii?q?44YgRaJM4k0hyiBD4FWFIEPHRYjFAEDAQ0uAQ4EAQIEAQEDAQIBgguCdAKIB?= =?us-ascii?q?gIfBgEEMQgOAQIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBQ?= =?us-ascii?q?BA1hWwNgkouI2tlCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQECCAQBGYEDCQoTAQEpBwgYIwMJBwQBBgMCEQE1FwESFAaCZ?= =?us-ascii?q?gGCGkUDBAEMBpU7mzp6gTKBAYIKAQEGgQg+AwEKAgUBDgkmrweBRxoJgTAYi?= =?us-ascii?q?AwaAWpoAoQhhDwnD4FVRIEVgihKBQJvggI9CxcBAQEBgRcNBBQBAQJLCQmDH?= =?us-ascii?q?IJogUBWgSobgRtXgWBEVIFbBoUOJoFRIQGFXANWFQ+CXoICcGACBg2GV4FMI?= =?us-ascii?q?gN9CGsbEB43ERATDQMIbh0CMToDBQMEMgoSDAsfBVQDQwZICwMCGgUDAwSBL?= =?us-ascii?q?QULGgIQLCYDAxJJAhAUAzgDAwYDCjEuT0EMUANnHzEJPA8MGgIbFA0kIwIsP?= =?us-ascii?q?gMJChACFgMdFgQwEQkLJgMqBjYCEgwGBgZcIBYJBCMDCAQDUAMgcBEDBBoEC?= =?us-ascii?q?wd2gUiBdQQTRAMQgTKHQYJVgz+CIIQ7SANEHUADC209NRQbKKNqeQIBLIE9L?= =?us-ascii?q?w44BgIsYgcDCQgQFwkCDScCOAsCFxkbFRYfCwsCLZJqKgJzjiaOBJRNNAeEF?= =?us-ascii?q?oFbBgyIe4EkiFaCf4ZAg1WEBYFWiyaReoc0IphAIII0hxyBJQmBbGmKAol1g?= =?us-ascii?q?UmFUIFlATiBXDMaMEOCZwlGHA9XjVUWg1iBPi2CbjuKZAJCNQIBATcCBwEKA?= =?us-ascii?q?QEDCYVFHQEBgz6BSAEB?= IronPort-PHdr: A9a23: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 p5Y1nnj IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:yQE/WaqPGt9hLwdWBf1qQ0kaV5o5eYIsimQD101hICG9E/b5qy nAppsmPHPP4wr5O0tApTnoAsDpfZq2z/NICP4qUYtKMjONhEKYaK1DqbHP5BDNIGnXz9c178 ldT5Q= X-Talos-CUID: 9a23:CmmZGmx3+1dXavktWCXcBgUXFp57U3H/4EvNAB+7LGxEVp+JU2S5rfY= X-Talos-MUID: 9a23:kDNM8gW7m76dyBPq/Ba8ihc6G+BH2vyRDhwPnZw0mZigCBUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,155,1708383600"; d="scan'208,217";a="83090791" X-MGA-submission: =?us-ascii?q?MDHVCNuOmftB0IrSzbVId2rk8fhEfk5NrfFyl1?= =?us-ascii?q?HXsqUdu84l7QzjVIA2snFC5BOLvr4gvsOndACw57N2bQCCn3306leOMa?= =?us-ascii?q?kHW0r18Izz1/CmlAvQkyptbYFV7YDEkjZV9wp4RsEa9XokN+Jo1FpOlI?= =?us-ascii?q?fFi607ygdvGh6x47s+OCQegw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Mar 2024 07:32:12 +0100 Received: from TM.local (unknown [90.85.64.46]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E21AE5646DB; Tue, 26 Mar 2024 07:32:12 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1711434733; bh=13paivHn6/tYXF221qUfoElyKJzXxdVfANVd+AI8oRI=; h=From:To:Subject:Date:Message-ID; b=XeRRDLnqwFfq3yMMMeVlk0A3oPhOkyZcCW7zEkyywYDOVoCdpg03XOs7+w4cO+OL5 UCv1J2N86cplMkmiBYPyS6+HpjMw5zrwyWPtTcCls2SWgbSOGv7+aUBaHf00zK/XQW 6vH+U23h5ZtJ/62YCP7L/5qN0aRrCttFPr1tuioQ= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 26 Mar 2024 07:32:10 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 26 07:32:13 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.405734, queueID=8D29A5646DC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19104 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 19 to 26, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The Flambda2 Snippets, by OCamlPro Eio 1.0: First major release ppx_minidebug 1.3.0: toward a logging framework Academic OCaml Users Testimonials! Volunteers for ICFP 2024 Artifact Evaluation Committee (AEC) First beta release for OCaml 5.2.0 Other OCaml News Old CWN The Flambda2 Snippets, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Greetings Cameleers, Today, we are excited to share with you a first glance at some redactional work that has been brewing behind at the scenes at OCamlPro for quite a some time now! We are starting a series of blogposts on the Flambda2 project. The goals are plenty, one of them being to give all readers an idea of the inner workings of this great piece of software, 10 years of research & development in the making. The first two episodes are rather special to the series: =E2=80=A2 [Episode 0] gives context and broader information on both the Flambda2 Optimising Compiler project, and the series of blogposts itself. =E2=80=A2 [Episode 1], on the other hand, steps right into the subject at= hand and covers some of the foundational design decisions of this compiler. We await your feedback below, and hope that you will enjoy reading these posts, and all ensuing ones! Kind regards, The OCamlPro Team [Episode 0] [Episode 1] Eio 1.0: First major release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Sudha Parimala announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the release of [Eio 1.0], its first major release. Eio started as an experimental effects-based library by the same team that was working on Multicore OCaml. We did not initially plan on upstreaming effects with OCaml 5.0. However, thanks to the efforts from the multicore team and OCaml core developers, effect handlers shipped with OCaml 5.0 (making it one of the first mainstream languages to do so). This presented the opportunity to develop effect-based concurrency libraries for OCaml, and Eio was the first of the lot.. Find more about the journey of Eio in this post =E2=80=93 [ Eio 1.0 Relea= se: Introducing a new Effects-Based I/O Library for OCaml] This is the beginning of the journey towards effect-based schedulers! We are keen to hear from you all to shape up what would be Eio 2.0. If you're looking to get started with Eio, the [README] is a good place to start. Additionally, @talex5's [video introduction], and [tutorial to port your Lwt applications to Eio] serve as good primers. I'd like to thank all the contributors for their work and users for their thoughtful feedback. As always, happy to hear feedback about Eio. Happy hacking! [Eio 1.0] [ Eio 1.0 Release: Introducing a new Effects-Based I/O Library for OCaml] [README] [video introduction] [tutorial to port your Lwt applications to Eio] ppx_minidebug 1.3.0: toward a logging framework =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Lukasz Stafiniak announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Happy to announce ppx_minidebug 1.5.0. It should soon propagate to the opam repository. Two new features since 1.4.0: =E2=80=A2 `[%log_entry header_string; body...]' syntax to explicitly crea= te log subtrees without polluting with source location information. Note that if you want the source location you could always do `let _for_debug : type... =3D body... in...'. =E2=80=A2 Minimalistic flame graphs. Example: (Note that the output is very configurable, e.g. by default the `at elapsed' time information is not printed.) Academic OCaml Users Testimonials! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Claire Vandenberghe announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 *Are you an academic user of OCaml?* By sharing your testimonial, you're not only showcasing your expertise and experience but also contributing to the OCaml community. Your insights can help prospective users understand the academic value of OCaml and inspire them to explore its potential further. Your testimonial will be featured on our academic user page, inspiring others to explore OCaml's potential. *Tell us:* 1. Your name and academic affiliation. 2. A brief description of how you=E2=80=99ve used OCaml in your academic endeavors. 3. Your thoughts on the benefits and challenges of using OCaml. Thanks OCaml.org Team UnixJunkie then replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Some years ago, I wrote a testimonial in an invited paper: Chemoinformatics and structural bioinformatics in OCaml Volunteers for ICFP 2024 Artifact Evaluation Committee (AEC) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Beno=C3=AEt Montagu announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear all, We are looking for motivated people to be members of the ICFP 2024 Artifact Evaluation Committee (AEC). Students, researchers and people from the industry or the free software community are all welcome. The artifact evaluation process aims to improve the quality and reproducibility of research artifacts for ICFP papers. In case you want to nominate someone else (students, colleagues, etc.), please send them the nomination form. Nomination form: Deadline for nominations: Mon April 8th 2024 For more information, see the AEC webpage: The primary responsibility of committee members is to review the artifacts submitted corresponding to the already conditionally accepted papers in the main research track. In particular, run the associated tool or benchmark, check whether the results in the paper can be reproduced, and inspect the tool and the data. We expect evaluation of one artifact to take about a full day. Each committee member will receive 2 to 3 artifacts to review. All of the AEC work will be done remotely/online. The AEC will work in June, with the review work happening between June 5th and July 5th. Come join us in improving the quality of research in our field! Best, the Artifact Evaluation chairs: Quentin Sti=C3=A9venart and Beno=C3= =AEt Montagu First beta release for OCaml 5.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Nearly two months after the first alpha release, the release of OCaml 5.2.0 is drawing near. We have thus released a first beta version of OCaml 5.2.0 to help you update your softwares and libraries ahead of the release (see below for the installation instructions). Compared to the alpha release, this beta contains a majority of runtime system fixes, and a handful of other fixes across many subsystems. Overall, the opam ecosystem looks in a good shape for the first beta release. Most core development tools support OCaml 5.2.0 or have compatibility patch under review (for `odoc' and `ocamlformat'), and you can follow the last remaining wrinkles on the [opam readiness for 5.2.0 meta-issue]. If you find any bugs, please report them on [OCaml's issue tracker]. Currently, the release is planned for the end of April or the beginning of May. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.2.0 is available [on GitHub]. [opam readiness for 5.2.0 meta-issue] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.2.0~beta1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the alpha is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.2.0~beta1+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.2.0~beta1+flambda+nffa ocaml-variants.5.2.= 0~beta1+options =E2=94=82 ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes since the first alpha =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Runtime System Fixes =E2=80=A2 [#12875], [#12879], [#12882]: Execute preemptive systhread swit= ching as a delayed pending action. This ensures that one can reason within the FFI that no mutation happens on the same domain when allocating on the OCaml heap from C, consistently with OCaml 4. This also fixes further bugs with the multicore systhreads implementation. (Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark Shinwell, review by Nick Barnes and Stephen Dolan) =E2=80=A2 [#12876]: Port ThreadSanitizer support to Linux on POWER (Miod Vallat, review by Tim McGilchrist) =E2=80=A2 [#12678], [#12898]: free channel buffers on close rather than on finalization (Damien Doligez, review by Jan Midtgaard and Gabriel Scherer, report by Jan Midtgaard) =E2=80=A2 [#12915]: Port ThreadSanitizer support to Linux on s390x (Miod Vallat, review by Tim McGilchrist) =E2=80=A2 [#12914]: Slightly change the s390x assembly dialect in order to build with Clang's integrated assembler. (Miod Vallat, review by Gabriel Scherer) =E2=80=A2 [#12897]: fix locking bugs in Runtime_events (Gabriel Scherer a= nd Thomas Leonard, review by Olivier Nicole, Vincent Laviron and Damien Doligez, report by Thomas Leonard) =E2=80=A2 [#12860]: Fix an assertion that wasn't taking into account the possibility of an ephemeron pointing at static data. (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan) =E2=80=A2 [#11040], [#12894]: Silence false data race observed between caml_shared_try_alloc and oldify. Introduces macros to call tsan annotations which help annotate a ~~happens before'' relationship. (Hari Hara Naveen S and Olivier Nicole, review by Gabriel Scherer and Miod Vallat) =E2=80=A2 [#12919]: Fix register corruption in caml_callback2_asm on s390= x. (Miod Vallat, review by Gabriel Scherer) =E2=80=A2 [#12969]: Fix a data race in caml_darken_cont (Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer and Miod Vallat) [#12875] [#12879] [#12882] [#12876] [#12678] [#12898] [#12915] [#12914] [#12897] [#12860] [#11040] [#12894] [#12919] [#12969] =E2=97=8A Standard Library Fix =E2=80=A2 [#12677], [#12889]: make Domain.DLS thread-safe (Gabriel Schere= r, review by Olivier Nicole and Damien Doligez, report by Vesa Karvonen) [#12677] [#12889] =E2=97=8A Type System Fix =E2=80=A2 [#12924], [#12930]: Rework package constraint checking to impro= ve interaction with immediacy (Chris Casinghino and Florian Angeletti, review by Florian Angeletti and Richard Eisenberg) [#12924] [#12930] =E2=97=8A Compiler User-Interface Fix =E2=80=A2 [#12971], [#12974]: fix an uncaught Ctype.Escape exception on s= ome invalid programs forming recursive types. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani) [#12971] [#12974] =E2=97=8A Build System Fixes =E2=80=A2 [#12198], [#12321], [#12586], [#12616], [#12706], [#13048]: con= tinue the merge of the sub-makefiles into the root Makefile started with [#11243], [#11248], [#11268], [#11420] and [#11675]. (S=C3=A9bastien Hinderer, review by David Allsopp and Florian Angeletti) =E2=80=A2 [#12768], [#13030]: Detect mingw-w64 coupling with GCC or LLVM, detect clang-cl, and fix C compiler feature detection on macOS. (Antonin D=C3=A9cimo, review by Miod Vallat and S=C3=A9bastien Hinderer) =E2=80=A2 [#13019]: Remove linking instructions for the Unix library from threads.cma (this was done for threads.cmxa in OCaml 3.11). Eliminates warnings from new lld when using threads.cma of duplicated libraries. (David Allsopp, review by Nicol=C3=A1s Ojeda B= =C3=A4r) =E2=80=A2 [#12758], [#12998]: Remove the `Marshal.Compression' flag to the `Marshal.to_*' functions. The compilers are still able to use ZSTD compression for compilation artefacts. This is a forward port and clean-up of the emergency fix that was introduced [#12198] [#12321] [#12586] [#12616] [#12706] [#13048] [#11243] [#11248] [#11268] [#11420] [#11675] [#12768] [#13030] [#13019] [#12758] [#12998] =E2=97=8A Compiler Internals Fix =E2=80=A2 [#12389], [#12544], [#12984], +[#12987]: centralize the handlin= g of metadata for compilation units and artifacts in preparation for better unicode support for OCaml source files. (Florian Angeletti, review by Vincent Laviron and Gabriel Scherer) [#12389] [#12544] [#12984] [#12987] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Eio 1.0 Release: Introducing a new Effects-Based I/O Library f= or OCaml] =E2=80=A2 [CPS Representation and Foundational Design Decisions in Flambd= a2] =E2=80=A2 [The Flambda2 Snippets, Episode 0 ] [the ocaml.org blog] [Eio 1.0 Release: Introducing a new Effects-Based I/O Library for OCaml] [CPS Representation and Foundational Design Decisions in Flambda2] [The Flambda2 Snippets, Episode 0 ] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 19 to 26, 2024.

    The Flambda2 Snippets, by OCamlPro

    OCamlPro announced

    Greetings Cameleers,

    Today, we are excited to share with you a first glance at some redactional = work that has been brewing behind at the scenes at OCamlPro for quite a some time now!

    We are starting a series of blogposts on the Flambda2 project. The goals are plenty, one of them being to give all readers an idea of the inner workings= of this great piece of software, 10 years of research & development in the= making.

    The first two episodes are rather special to the series:

    • Episode 0 gives context and broader information on both the Flambda2= Optimising Compiler project, and the series of blogposts itself.
    • Episode 1, on the other hand, steps right into the subject at hand a= nd covers some of the foundational design decisions of this compiler.

    We await your feedback below, and hope that you will enjoy reading these po= sts, and all ensuing ones!

    Kind regards, The OCamlPro Team

    Eio 1.0: First major release

    Sudha Parimala announced

    I'm happy to announce the release of Eio 1.0, its first major release. Eio started as an experimental effects-based library by the same team that was = working on Multicore OCaml. We did not initially plan on upstreaming effects with OCaml 5.0. How= ever, thanks to the efforts from the multicore team and OCaml core developers, effect handlers = shipped with OCaml 5.0 (making it one of the first mainstream languages to do so). This presented = the opportunity to develop effect-based concurrency libraries for OCaml, and Eio was the first= of the lot..

    Find more about the journey of Eio in this post – Eio 1.0 Release: Introducing a new Effects-Based I/O Library for OCaml

    This is the beginning of the journey towards effect-based schedulers! We ar= e keen to hear from you all to shape up what would be Eio 2.0.

    If you're looking to get started with Eio, the READ= ME is a good place to start. Additionally, @talex5's video introduction, and t= utorial to port your Lwt applications to Eio serve as good primers.

    I'd like to thank all the contributors for their work and users for their t= houghtful feedback. As always, happy to hear feedback about Eio.

    Happy hacking!

    ppx_minidebug 1.3.0: toward a logging framework

    Lukasz Stafiniak announced

    Happy to announce ppx_minidebug 1.5.0. It should soon propagate to the opam= repository. Two new features since 1.4.0:

    • [%log_entry header_string; body...] syntax to explicitly c= reate log subtrees without polluting with source location information. Note= that if you want the source location you could always do let _for_de= bug : type... =3D body... in....
    • Minimalistic flame graphs. Example:

      3D=

      (Note that the output is very configurable, e.g. by default the at el= apsed time information is not printed.)

    Academic OCaml Users Testimonials!

    Claire Vandenberghe announced

    Are you an academic user of OCaml?

    By sharing your testimonial, you're not only showcasing your expertise and = experience but also contributing to the OCaml community.

    Your insights can help prospective users understand the academic value of O= Caml and inspire them to explore its potential further.

    Your testimonial will be featured on our academic user page, inspiring othe= rs to explore OCaml's potential.=20

    Tell us:

    1. Your name and academic affiliation.
    2. A brief description of how you=E2=80=99ve used OCaml in your academic e= ndeavors.
    3. Your thoughts on the benefits and challenges of using OCaml.

    Thanks

    OCaml.org Team

    UnixJunkie then replied

    Some years ago, I wrote a testimonial in an invited paper:

    Chemoinformatics and structural bioinformatics in OCaml https://jcheminf.biomedcentral.com/articles/10.1186/s13321-019-0332-= 0

    Volunteers for ICFP 2024 Artifact Evaluation Committee (AEC)

    Beno=C3=AEt Montagu announced

    Dear all,

    We are looking for motivated people to be members of the ICFP 2024 Artifact Evaluation Committee (AEC). Students, researchers and people from the industry or the free software community are all welcome. The artifact evaluation process aims to improve the quality and reproducibility of research artifacts for ICFP papers. In case you want to nominate someone else (students, colleagues, etc.), please send them the nomination form.

    Nomination form: https://forms.gle/KJAjtDz= hm5VLxjVf9

    Deadline for nominations: Mon April 8th 2024

    For more information, see the AEC webpage: https://icfp24.sigplan.org/track/icfp-2024-artifact-evaluation

    The primary responsibility of committee members is to review the artifacts submitted corresponding to the already conditionally accepted papers in the main research track. In particular, run the associated tool or benchmark, check whether the results in the paper can be reproduced, and inspect the tool and the data.

    We expect evaluation of one artifact to take about a full day. Each committee member will receive 2 to 3 artifacts to review.

    All of the AEC work will be done remotely/online. The AEC will work in June, with the review work happening between June 5th and July 5th.

    Come join us in improving the quality of research in our field!

    Best, the Artifact Evaluation chairs: Quentin Sti=C3=A9venart and Beno=C3=AEt Mon= tagu

    First beta release for OCaml 5.2.0

    octachron announced

    Nearly two months after the first alpha release, the release of OCaml 5.2.0= is drawing near.

    We have thus released a first beta version of OCaml 5.2.0 to help you updat= e your softwares and libraries ahead of the release (see below for the installation instructions= ).

    Compared to the alpha release, this beta contains a majority of runtime sys= tem fixes, and a handful of other fixes across many subsystems.

    Overall, the opam ecosystem looks in a good shape for the first beta releas= e. Most core development tools support OCaml 5.2.0 or have compatibility patch= under review (for odoc and ocamlformat), and you can follow the las= t remaining wrinkles on the opam read= iness for 5.2.0 meta-issue.

    If you find any bugs, please report them on OCaml's issue tracker.

    Currently, the release is planned for the end of April or the beginning of = May.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.2.0 is available on GitHub.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1:

    opam update
    opam switch create 5.2.0~beta1
    

    The source code for the alpha is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.2.0~beta1+options &=
      lt;option_list>
      

      where option_list is a space-separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array switch:

      opam switch create 5.2.0~beta1+flambda+nffa oc=
      aml-variants.5.2.0~beta1+options
      ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Changes since the first alpha

    • Runtime System Fixes
      • #12875, #12879, #12882: Execute preemptiv= e systhread switching as a delayed pending action. This ensures that one can reason within the FFI that no mutation happens on the same domain when allocating on the OCaml heap from C, consistently with OCaml 4. This also fixes further bugs with the multicore systhreads implementation. (Guillaume Munch-Maccagnoni, bug reports and suggestion by Mark Shinwell, review by Nick Barnes and Stephen Dolan)
      • #12876: Por= t ThreadSanitizer support to Linux on POWER (Miod Vallat, review by Tim McGilchrist)
      • #12678, #12898: free chann= el buffers on close rather than on finalization (Damien Doligez, review by Jan Midtgaard and Gabriel Scherer, report by Jan Midtgaard)
      • #12915: Por= t ThreadSanitizer support to Linux on s390x (Miod Vallat, review by Tim McGilchrist)
      • #12914: Sli= ghtly change the s390x assembly dialect in order to build with Clang's integrated assembler. (Miod Vallat, review by Gabriel Scherer)
      • #12897: fix= locking bugs in Runtime_events (Gabriel Scherer and Thomas Leonard, review by Olivier Nicole, Vincent Laviron and Damien Doligez, report by Thomas Leonard)
      • #12860: Fix= an assertion that wasn't taking into account the possibility of an ephemeron pointing at static data. (Mark Shinwell, review by Gabriel Scherer and KC Sivaramakrishnan)
      • #11040, #12894: Silence fa= lse data race observed between caml_shared_try_alloc and oldify. Introduces macros to call tsan annotations which help annotate a ~~happens before'' relationship. (Hari Hara Naveen S and Olivier Nicole, review by Gabriel Scherer and Miod Vallat)
      • #12919: Fix= register corruption in caml_callback2_asm on s390x. (Miod Vallat, review by Gabriel Scherer)
      • #12969: Fix= a data race in caml_darken_cont (Fabrice Buoro and Olivier Nicole, review by Gabriel Scherer and Miod Valla= t)
    • Standard Library Fix
      • #12677, #12889: make Domai= n.DLS thread-safe (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Vesa Karvonen)
    • Type System Fix
      • #12924, #12930: Rework pac= kage constraint checking to improve interaction with immediacy (Chris Casinghino and Florian Angeletti, review by Florian Angeletti and Richard Eisenberg)
    • Compiler User-Interface Fix
      • #12971, #12974: fix an unc= aught Ctype.Escape exception on some invalid programs forming recursive types. (Gabriel Scherer, review by Florian Angeletti, report by Neven Villani)
    • Build System Fixes
      • #12198, #12321, #12586, #12616, #12706, #13048: continue the merge of the sub-makefile= s into the root Makefile started with #11243, #11248, #11268, #1= 1420 and #11675= . (S=C3=A9bastien Hinderer, review by David Allsopp and Florian Angelet= ti)
      • #12768, #13030: Detect min= gw-w64 coupling with GCC or LLVM, detect clang-cl, and fix C compiler feature detection on macOS. (Antonin D=C3=A9cimo, review by Miod Vallat and S=C3=A9bastien Hinderer)
      • #13019: Rem= ove linking instructions for the Unix library from threads.cma (this was done for threads.cmxa in OCaml 3.11). Eliminates warnings from new lld when using threads.cma of duplicated libraries. (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r)
      • #12758, #12998: Remove the= Marshal.Compression flag to the Marshal.to_* functions. The compilers are still able to use ZSTD compression for compilation artefacts. This is a forward port and clean-up of the emergency fix that was introduce= d
    • Compiler Internals Fix
      • #12389, #12544, #12984, +#12987: centralize the handling= of metadata for compilation units and artifacts in preparation for better unicode support f= or OCaml source files. (Florian Angeletti, review by Vincent Laviron and Gabriel Scherer)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=ugobJim4; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=DXQBGwja; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A1EA9B80123 for ; Tue, 2 Apr 2024 15:31:31 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=pXRd2SNdZbQ4HmTlRUQSvM3nfgt6oVKqGM30I2QSnz4=; b=ugobJim4PZeqDYCBnk0Q83LwPhiHMa8/fV12GETNCVzyWjhyD4bM+IL9 TjRydiWramhPP2Oc2m1zaCPywpQbVTsw6Oky+3CeTH/1caGYlZ9dW50q6 hPQEJ5KSwIV/0wnIzqVzhHDunVaWd+RY++ud3kWG92w9Qy3B2kcmUj6cF o=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,175,1708383600"; d="scan'208,217";a="159539827" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 Apr 2024 16:31:31 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id B1BF1E0157; Tue, 2 Apr 2024 16:31:30 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id F012DE0131 for ; Tue, 2 Apr 2024 16:31:27 +0200 (CEST) IronPort-SDR: 660c16bd_wyTnIlbWeAFiQCokYzjlroXbX4WK6Z/6rTolxfQru79FV8e ge2xuG+mbGGdnSxM0oa+fMDRNFFSVUZ84YUHD5Q== X-IPAS-Result: =?us-ascii?q?A0GVEABfFQxmlyIeaIFQChZ/gnlbKBkBYlYyBwhIA2uDa?= =?us-ascii?q?INPjTRkgRaQL4g/gjCBaoEsFiMEEAEDAQ0uAQ4EAQIEAQEDAQIBgguCdAJPC?= =?us-ascii?q?YcvAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBA?= =?us-ascii?q?QEBAQE3BRA1hW0NgkoZFSNrgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQECCAQBJQQzASMaAgECBgoTAQEmDAYYIwMJCwEGA?= =?us-ascii?q?wIRATUDARMBEhQGgmYBgl8DBQwGP5Jhmzp6gTKBAYIKAQEGew0+AwIJAgIDA?= =?us-ascii?q?Q4JJQGvB4FhCYEwGIgNGgFqaAKEIwmENCcPgVVEgRU1gXNKB2+BUAFNIQsXA?= =?us-ascii?q?gEBGH0CCQkBBwoCAQMFAhAPJAkJgxyCaIEXKVaBKoEANjEmgQpWRAMDTmt2h?= =?us-ascii?q?A9+JoFyAYVOElcKCw9bggNmggpgAQEHDYEdhm2BTIEiCGsbEB43ERATDQMIb?= =?us-ascii?q?h0CMToDBQMEMgoSDAsfBVQDQAZICwMCGgUDAwSBLAULGgIQLCYDAxJJAhAUA?= =?us-ascii?q?zgDAwYDCjEuT0EMUANkHzEJPA8MGgIbFA0kIwIsPgMJChACFgMdFAQwEQkLJ?= =?us-ascii?q?gMqBjYCEgwGBgZcIBYJBCMDCAQDUAMgcBEDBBoECwd2gUiBdQQTRAMQgTKHQ?= =?us-ascii?q?oJYgz+CIIQ4ToFWLwNEHUADC209NRQbKKUUDQFvAgGBcwolDgouBgEBFRA0B?= =?us-ascii?q?xMHDgMCAQcMCAoEAhMNAi4EBAgRGwUKBQ8TCw0EAQkCARIHDxkGCQILAi0Dk?= =?us-ascii?q?jMMBAwYKgNysAxsNAeEFoFbBgyIe4EkkhWDVYQFgVaLJhqZFSKYQCCCNIZJU?= =?us-ascii?q?wqBGwmCVZUUJgYEE4U5gXsjbD8eDAczGjBDDQiCUgkWMBwPV4dKhy0BCIIbK?= =?us-ascii?q?IE+gRgOgXU7gkWULgNBNQEBAQEJLgIHAQoBAQMJhWIBAWmCIQEnBAiBSAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:fRayKa0BprZrCUgTsQ7TVQqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-Talos-CUID: =?us-ascii?q?9a23=3A6Kz9FWucC4/PAzW2/MstsgWt6Is5e2OM83zAfHa?= =?us-ascii?q?hMl4uWuCqTwO26oRNxp8=3D?= X-Talos-MUID: 9a23:4ZIUnARUL0BkkV7uRXTcjQg8CdhIz52AGWQdnZ8Pv8CCMg5vbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,175,1708383600"; d="scan'208,217";a="83673855" X-MGA-submission: =?us-ascii?q?MDGwNT1hxqvnWDbXb5VnFaas4dIC3lCTtabiAe?= =?us-ascii?q?N1yw4+OQ+yPGoFphBd5uAky9MwwH3xz6cW9QqYS+ln9YBI4cv2Q/IbNp?= =?us-ascii?q?sl/1t/A5S5yrHzc3/Py90ABxg7vF07JaZ4vFN6pzHthQCMxUuFD48ong?= =?us-ascii?q?jv5t4rKIcQ+a0OyKotqWSABA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Apr 2024 16:31:25 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1227E5648D4; Tue, 2 Apr 2024 16:31:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1712068284; bh=rq4JqMrgO/KTyxLP2WPmlQZkswpkBAXpsP4+uDNq8KU=; h=From:To:Subject:Date:Message-ID; b=DXQBGwjawaMiPd9NudaXgtLY9o4mheA8YDSRHGr7F9wzmmKfF1Cf6OAj9myTAOqlj 6bXl9YnLJxtKwkfpzbhCzyUNMRNs9ZPDO/A+q2jVSmOYQ8HDzc7iGVyoLNzcAbqfba 3pYlt1xvqLqbI8Tanv9hIf4n+7Fuh96wfs7bkxoo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 02 Apr 2024 16:31:22 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 2 16:31:24 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499360, queueID=5578A5648D6 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19106 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 26 to April 02, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Odoc 3.0 planning OCaml Platform Newsletter: February 2024 Your Feedback Needed on OCaml Home Page Wireframe! OCaml Workshop 2024 at ICFP =E2=80=93 announcement and call for proposals down.0.2.0 and omod.0.4.0 stdlib-random 1.2 Other OCaml News Old CWN Odoc 3.0 planning =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Jon Ludlam announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 For many years we've had a team here at Tarides working away on Odoc, quietly adding new features, fixing bugs, speeding things up and generally enabling OCaml package mantainers to write good documentation. Up until recently, those improvements have mostly been incremental, but with the recent addition of some larger new features like search and source rendering we've found we need to think a bit more broadly and consider how these changes will fit into the larger ecosystem. We're also thinking of how to extend the abilities of Odoc to handle more structure in the documentation, with better support for images, an improved sidebar, and a better ability to link to the docs of other packages. We've therefore started the process that's going to lead to Odoc 3.0, which will involve not only work on odoc itself, but also on ocaml.org, the documentation pipeline that produces the docs for ocaml.org, dune, and odig. It's being done incrementally, so we've started with the core issues of how to structure your docs, how to do references both within the docs and across packages, what the output file structure will look like and how the breadcrumbs will reflect that. What we've posted so far is by no means the final version, and we'd love to get feedback on the suggestions we've got so far. Getting this right is surprisingly complicated, so the more people we have thinking about it, the better our chances of success! So if you're interested in writing or reading docs, I encourage you to head on over to [the discussion] we've just started on [ocaml/odoc] and join in the conversation! [the discussion] [ocaml/odoc] OCaml Platform Newsletter: February 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the tenth edition of the OCaml Platform newsletter! In this February 2024 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in [previous editions]. To understand the direction we're headed, especially regarding development workflows and user experience improvements, check out our [roadmap]. *Highlights:* =E2=80=A2 The OCaml Platform tools have added support for OCaml 5.2. It's available in the temporary releases =E2=80=A2 [`Merlin 4.14-502~preview'] (@voodoos (Tarides)) =E2=80=A2 [`Ocaml-lsp-server 1.18.0~5.2preview'] (@voodoos (Tarides)) =E2=80=A2 [`Ppxlib 0.32.1~5.2preview'] (@NathanReb (partly funded by the OCaml Software Foundation)). *Releases:* =E2=80=A2 [UTop 2.14.0] =E2=80=A2 [Merlin 4.14] =E2=80=A2 [Dune 3.14.0] =E2=80=A2 [Ppxlib 0.31.2] =E2=80=A2 [Dune 3.13.1] [previous editions] [roadmap] [`Merlin 4.14-502~preview'] [`Ocaml-lsp-server 1.18.0~5.2preview'] [`Ppxlib 0.32.1~5.2preview'] [UTop 2.14.0] [Merlin 4.14] [Dune 3.14.0] [Ppxlib 0.31.2] [Dune 3.13.1] *[Dune]* Exploring Package Management in Dune ([W4]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C *Contributed by:* @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @kit-ty-kate (Tarides), @Alizter *Why:* Unify OCaml tooling under a single command line for all development workflows. This addresses one of the most important pain points [reported by the community]. *What:* Prototyping the integration of package management into Dune using opam as a library. We're introducing a `dune pkg lock' command to generate a lock file and enhancing `dune build' to handle dependencies in the lock file. More details in the [Dune RFC]. *Activities:* =E2=80=A2 One of the main remaining blockers to make Dune package managem= ent usable in real world project is to make some of the low level dependencies, notably OCamlFind and the OCaml compiler, relocatable. =E2=80=93 [ocaml/ocamlfind#72] =E2=80=A2 We experimented with a Coq-platform patch to make OCamlFind relocatable, but we faced issues with packages using `topkg' due to `ocamlbuild' build failures. This led to identifying an error with directory symlink handling in Dune [ocaml/dune#9873], [ocaml/dune#9937] =E2=80=A2 To track the buildability of opam packages with Dune package management, we worked on a GitHub action that effectively provides us with a dashboard of opam packages coverage on a select set of packages. The repository is available at [gridbugs/dune-pkg-dashboard]. =E2=80=A2 Based on the findings from the above, several issues were opene= d on the Dune issue tracker. All the known issues are now tracked in the [Package Management MVP] milestone on Dune's issue tracker. =E2=80=A2 We also focused on improving features that were previously implemented. Noteworthy changes include the addition of [workspace package pins] and enhancements for correct path handling in packages =E2=80=93 [ocaml/dune#9940] =E2=80=A2 Work included updates and refactorings to improve source fetchi= ng, particularly the removal of a rudimentary Git config parser in favor of using `git config' directly ([ocaml/dune#9905]), and enhancements to how Dune handles Git repositories, such as the checking out of Git repos via `rev_store' ([ocaml/dune#10060]). =E2=80=A2 Contributions also focused on refining and testing Dune's packa= ge handling, including a fix to ensure that opam's untar code is not used ([ocaml/dune#10085]), and improvements to Dune's handling of recursive submodules in Git repos ([ocaml/dune#10130]). [W4] [reported by the community] [Dune RFC] [ocaml/ocamlfind#72] [ocaml/dune#9873] [ocaml/dune#9937] [gridbugs/dune-pkg-dashboard] [Package Management MVP] [workspace package pins] [ocaml/dune#9940] [ocaml/dune#9905] [ocaml/dune#10060] [ocaml/dune#10085] [ocaml/dune#10130] *[opam]* Native Support for Windows in opam 2.2 ([W5]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @rjbou (OCamlPro), @kit-ty-kate (Tarides), @dra27 (Tarides), @AltGr (OCamlPro) *Why:* Enhance OCaml's viability on Windows by integrating native opam and `opam-repository' support, fostering a larger community, and more Windows-friendly packages. *What:* Releasing opam 2.2 with native Windows support, making the official `opam-repository' usable on Windows platforms. *Activities:* =E2=80=A2 Addressed the issue where the Windows loader would display bloc= king dialogue boxes upon failing to find DLLs, adhering to best practices by suppressing these dialogs, and opting for exit codes instead. This enhancement eliminates disruptive interruptions, ensuring a more seamless operation for automated tasks and CI environments. =E2=80=93 [#5828] =E2=80=A2 Fixed shell detection issues when opam is invoked via Cygwin's `/usr/bin/env', enhancing compatibility and user experience for those utilising Cygwin alongside `cmd' or PowerShell. =E2=80=93 [#5797] =E2=80=A2 Recommend Developer Mode on Windows. To optimise storage and al= ign with best practices, Developer Mode is recommended for enabling symlink support. =E2=80=93 [#5831] =E2=80=A2 Resolved issues related to environment variable handling, specifically fixing bugs where updates or additions to environment variables would incorrectly remove or alter them. =E2=80=93 [#5837] =E2=80=A2 Addressed early loading of git location information, particular= ly benefiting Windows users by ensuring correct retrieval and application of git-related configurations. =E2=80=93 [#5842] =E2=80=A2 Disabled ACL in Cygwin. By setting `noacl' in `/etc/fstab' for `/cygdrive' mount, this change avoids permission mismatch errors, enhancing reliability and usability for Cygwin users. =E2=80=93 [#5796] =E2=80=A2 Introduced the ability to define the package manager path at initialisation, improving customisation and integration capabilities for Windows users. =E2=80=93 [#5847] =E2=80=A2 Added `winsymlinks:native' to the Cygwin environment variable, improving compatibility within the Cygwin ecosystem. =E2=80=93 [#5793] =E2=80=A2 Fixed script generation issues related to path quoting, ensuring smoother initialisation and setup processes, especially in mixed-environment scenarios like Cygwin. =E2=80=93 [#5841] =E2=80=A2 Corrected the precedence and handling of `git-location' configurations during initialisation, streamlining Git integration and providing clearer control over Git settings. =E2=80=93 [#5848] =E2=80=A2 Extended the use of eval-variables to internal Cygwin installat= ions and adjusted the setup to better accommodate Windows-specific requirements, enhancing flexibility and system compiler integration. =E2=80=93 [#5829] [W5] [#5828] [#5797] [#5831] [#5837] [#5842] [#5796] [#5847] [#5793] [#5841] [#5848] [#5829] *[=E2=80=8B`odoc'=E2=80=8B]* Unify OCaml.org and Local Package Documentatio= n ([W25]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides), Luke Maurer (Jane Street) *Why:* Improving local documentation generation workflow will help package authors write better documentation for their packages, and consolidating the different `odoc' documentation generators will help make continuous improvements to `odoc' available to a larger audience. *What:* We will write conventions that drivers must follow to ensure that their output will be functional. Once established, we will update the Dune rules to follow these rules, access new `odoc' features (e.g., source rendering), and provide similar functionalities to docs.ocaml.org (a navigational sidebar, for instance). This will effectively make Dune usable to generate OCaml.org package documentation. *Activities:* =E2=80=A2 Work continued on the design for the new `odoc' drivers convent= ions shared by Dune and OCaml.org, and we plan to publish the RFC in March. =E2=80=A2 We also started comparing and prototyping various approaches to= add sidebar support to `odoc'. Several prototypes have been developed and discussed with the team, and we will resume work on the sidebar implementation once the driver conventions have been adopted. [W25] *[=E2=80=8B`odoc'=E2=80=8B]* Add Search Capabilities to `odoc' ([W25]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C *Contributed by:* @panglesd (Tarides), @EmileTrotignon (Tarides), @julow (Tarides), @jonludlam (Tarides) *Why:* Improve usability and navigability in OCaml packages documentation, both locally and on OCaml.org, by offering advanced search options like type-based queries. *What:* Implementing a search engine interface in `odoc', complete with a UI and a search index. Additionally, we're developing a default client-side search engine based on Sherlodoc. *Activities:* =E2=80=A2 The implementation and refinement of sherlodoc's integration wi= th odoc were our major focuses, this included making sherlodoc pass opam CI on different architectures and adjusting the dune rules for better usability =E2=80=93 [ocaml/dune#9956] =E2=80=A2 After the big sherlodoc PR was merged and sherlodoc released la= st month, work continued on refining the dune rules for sherlodoc and on adjusting the search bar's scope based on discussions with the team. =E2=80=A2 We implemented keyboard navigation in the search bar to improve= its usability =E2=80=93 [ocaml/odoc#1088] [W25] [ocaml/dune#9956] [ocaml/odoc#1088] *[=E2=80=8B`odoc'=E2=80=8B]* Improving `odoc' Performance ([W25]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @jonludlam (Tarides), @julow (Tarides), @gpetiot (Tarides) *Why:* Address performance issues in `odoc', particularly for large-scale documentation, to enhance efficiency and user experience and unlock local documentation generation in large code bases. *What:* Profiling `odoc' to identify the main performance bottlenecks and optimising `odoc' with the findings. *Activities:* =E2=80=A2 Performance improvements were achieved by addressing issues with source location lookups for non-existent identifiers, significantly improving link time for large codebases. =E2=80=A2 Several PRs from the module-type-of work were opened, including fixes and tests aimed at enhancing `odoc''s handling of transitive library dependencies, shape lookup, and module-type-of expansions =E2= =80=93 [ocaml/odoc#1078], [ocaml/odoc#1081] =E2=80=A2 Improve the efficiency of finding `odoc' files in accessible pa= ths, cutting the time to generate documentation by two in some of our tests =E2=80=93 [ocaml/odoc#1075] [W25] [ocaml/odoc#1078] [ocaml/odoc#1081] [ocaml/odoc#1075] *[Merlin]* Support for Project-Wide References in Merlin ([W19]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @voodoos (Tarides) *Why:* Enhance code navigation and refactoring for developers by providing project-wide reference editor features, aligning OCaml with the editor experience found in other languages. *What:* Introducing `ocamlmerlin server occurrences' and LSP `textDocument/references' support, extending compiler's Shapes for global occurrences and integrating these features in Dune, Merlin, and OCaml LSP. *Activities:* =E2=80=A2 Continued investigations and improvements on Dune rules to addr= ess configuration issues =E2=80=A2 After adding support for OCaml 5.2 to `merlin-lib', we've rebas= ed the project-wide occurrences work over it. =E2=80=A2 We also started work with the Jane Stree team to test project w= ide references at scale in their monorepo. Following our initial integration, we focused on refining Merlin's indexing and occurrence query capabilities, including addressing bottlenecks and regressions in shape reductions =E2=80=93 [ocaml/ocaml#13001] [W19] [ocaml/ocaml#13001] *[Merlin]* Improving Merlin's Performance ([W19]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @pitag (Tarides), @Engil (Tarides) *Why:* Some Merlin queries have been shown to scale poorly in large codebases, making the editor experience subpar. Users report that they sometimes must wait a few seconds to get the answer. This is obviously a major issue that hurts developer experience, so we're working on improving Merlin performance when it falls short. *What:* Developing benchmarking tools and optimising Merlin's performance through targeted improvements based on profiling and analysis of benchmark results. *Activities:* =E2=80=A2 In `merlin-lib', we've continued the work on a prototype to pro= cess the buffer in parallel with the query computation. Parallelism refers to OCaml 5 parallelism (domains). [W19] Your Feedback Needed on OCaml Home Page Wireframe! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Claire Vandenberghe announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm reaching out to ask for a few minutes of your time to review the wireframe designs for the OCaml Home, Industrial, and Academic pages. After conducting user interviews with OCaml enthusiasts, we've gathered valuable insights on what information newcomers find most helpful when visiting the OCaml home. As a result, we've been working on restructuring these three major pages to better cater to user needs. (*Please note that these wireframes primarily focus on navigation, layout, and content, rather than the User Interface (UI).*) Your feedback is crucial at this stage, so please feel free to leave comments directly on Figma, via email, or let's schedule a quick call to discuss. Thank you for taking part in this review. *Figma Link*: OCaml Workshop 2024 at ICFP =E2=80=93 announcement and call for proposals =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sonja Heinze announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This year, [ICFP] (the International Conference on Functional Programming) is going to take place in beautiful Milan. Such as every year since 2012, on the last day of that conference, i.e. on *September 7th (Saturday)*, we'll hold a workshop on OCaml. The workshop is intended to cover all different kinds of aspects of the OCaml programming language as well as the OCaml ecosystem and its community, such as scientific and/or research-oriented, engineering and/or user-oriented, as well as social and/or community-oriented. [ICFP] Call for talk proposals =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The [call for talk proposals] for the workshop is open. [call for talk proposals] =E2=97=8A Dates Here are the important dates: =E2=80=A2 Talk proposal submission deadline: May 30th (Thursday) =E2=80=A2 Author notification: July 4th (Thursday) =E2=80=A2 Workshop: September 7th (Saturday) =E2=97=8A Submissions Submissions are typically around 2 pages long (flexible), describing the motivations of the work and what the presentation would be about. We encourage everyone who might be interested in giving a talk to submit a proposal! We truly mean everyone, and also have strongly anyone in mind who belongs to a group that's traditionally underrepresented at OCaml workshops, e.g. due to your gender(s) or non-gender, where you're from or based or whatever other kinds of characteristics you might have. You should all be able to find all information you'll need to submit a proposal on the official [call for talk proposals]. However, if you have any question, don't hesitate to ask us. [call for talk proposals] =E2=97=8A Quota on accepted talks per affiliation Even though none of us is a fan of quotas, last year's workshop experimented with a quota of a maximum of four talks given by speakers with the same company/university/institute affiliation. In order to guarantee a coverage of a diverse range of topics and perspectives, we'll experiment with the same affiliation quota again. Do not hesitate to submit your talk proposal in any case: quotas, if needed, will be taken into account by the PC after reviewing all submissions, so there's no reason to self-select upfront. About the workshop itself =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C So far, we've only talked about talk proposals and formalities. The really exciting part will be the workshop itself! It's going to be a whole-day workshop and, similarly to previous years, it's likely going to have four sessions of about four talks each. It's a rather informal and interactive environment, where people engage in all kinds of conversations about OCaml during the breaks and after the workshop. =E2=97=8A Hybrid attendance and cost for speakers We're aiming to make the workshop hybrid with the same streaming modalities as last year, meaning that *talks as well as participation can be either in-person or remote*, and *remote attendance will be free*. To promote a good atmosphere, communication and engagement, we prefer to have most talks in-person, but remote talks will be most welcome as well. We know that giving the talk in-person comes with an economic cost. We're very happy to announce that thanks to the [OCaml Software Foundation], *registration fees will be covered for speakers* in case they can't get them funded by other means (e.g. their employer). We will do our best to provide the best workshop experience possible for remote participants, within the constraints of the hybrid format. While attending in-person does come with advantages, it also comes with an environmental cost, and we strongly support transitioning to a less plane-intensive organization for conferences and community events :deciduous_tree: . [OCaml Software Foundation] =E2=97=8A Related events The day before the OCaml workshop, i.e. Sep 6th (Friday), is the day of the [ML workshop], with focus on more theoretical aspects of OCaml and the whole family of ML languages in general. The ML workshop [has already been announced on the OCaml discuss] and tends to be very interesting for OCaml lovers as well. We're looking forward to the the talk submissions and to the workshop! Let us know if you have any questions. @Armael and @pitag [ML workshop] [has already been announced on the OCaml discuss] down.0.2.0 and omod.0.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's my pleasure to announce new releases for [down] and [omod] which provide a nice `ocaml' toplevel user experience upgrade. Simply add to your `.ocamlinit': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #use "down.top" =E2=94=82 #use "omod.top"=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And enjoy all the benefits you can learn about in the [down manual] and in the [omod tutorial]. These are mainly maintenance releases but if you ever though that down was a bit slow when pasting code, it now (well for almost two years=E2=80= =A6) implements [bracketed pastes]. Thanks to @emillon for the reference. [down] [omod] [down manual] [omod tutorial] [bracketed pastes] stdlib-random 1.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The library `stdlib-random' is a small compatibility library that provides compiler-independent implementations of the PRNGs used in the history of the standard library `Random': =E2=80=A2 stdlib-random.v3: implement the PRNG used in OCaml 3.07 to 3.11 =E2=80=A2 stdlib-random.v4: implement the PRNG used in OCaml 3.12 to 4.14 =E2=80=A2 stdlib-random.v5: implement the PRNG currently used in OCaml 5 =E2=80=A2 stdlib-random.v5o: implement the PRNG currently used in OCaml 5= in pure OCaml This library is targeted toward programs that need a deterministic and stable behaviour of the `Random' module across OCaml versions. The newly released version 1.2.0 updates all implementations to provide the new `int_in_range' function (and its `int32_in_range', `nativeint_in_range', `int64_in_range' variants) that will be available in OCaml 5.2.0. Note however that the implementations on the pre-OCaml 5 PRNGs are not optimal, since I prioritised the maintenance cost over performance, but that could be changed if required. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [NetHSM: Bringing Open Source to the World of Hardware Security Modules] =E2=80=A2 [Frama-Clang v0.0.15 for Frama-C 28.0 Nickel] [the ocaml.org blog] [NetHSM: Bringing Open Source to the World of Hardware Security Modules] [Frama-Clang v0.0.15 for Frama-C 28.0 Nickel] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 26 to April 02,= 2024.

    Odoc 3.0 planning

    Jon Ludlam announced

    For many years we've had a team here at Tarides working away on Odoc, quiet= ly adding new features, fixing bugs, speeding things up and generally enabling OCaml package mantainers to write good documentation= . Up until recently, those improvements have mostly been incremental, but with the recent addition of some larger new features like = search and source rendering we've found we need to think a bit more broadly and consider how these changes will fit into the larger ec= osystem. We're also thinking of how to extend the abilities of Odoc to handle more structure in the documentation, with bette= r support for images, an improved sidebar, and a better ability to link to the docs of other packages.

    We've therefore started the process that's going to lead to Odoc 3.0, which= will involve not only work on odoc itself, but also on ocaml.org, the documentation pipeline that produces the docs for ocaml.org,= dune, and odig. It's being done incrementally, so we've started with the core issues of how to structure your docs, how to do refer= ences both within the docs and across packages, what the output file structure will look like and how the breadcrumbs will reflect t= hat. What we've posted so far is by no means the final version, and we'd love to get feedback on the suggestions we've got so far.= Getting this right is surprisingly complicated, so the more people we have thinking about it, the better our chances of success!

    So if you're interested in writing or reading docs, I encourage you to head= on over to the discussion we've just started on ocaml/odoc and join in the conversation!

    OCaml Platform Newsletter: February 2024

    Thibaut Mattio announced

    Welcome to the tenth edition of the OCaml Platform newsletter!

    In this February 2024 edition, we are excited to bring you the latest on th= e OCaml Platform, continuing our tradition of highlighting recent developments as seen in previous editions. To understand the direction we're headed, especially regarding development workflows and user experienc= e improvements, check out our roadmap.

    Highlights:

    Releases:

    [Dune] Exploring Package Management in Dune (<= a href=3D"https://ocaml.org/docs/platform-roadmap#w4-build-a-project">W4)

    Contributed by: @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), = @gridbugs (Tarides), @kit-ty-kate (Tarides), @Alizter

    Why: Unify OCaml tooling under a single command line for all develop= ment workflows. This addresses one of the most important pain points reported by the community.

    What: Prototyping the integration of package management into Dune us= ing opam as a library. We're introducing a dune pkg lock command to generate a lock file and enhancing dune build to ha= ndle dependencies in the lock file. More details in the Dune RFC.

    Activities:

    • One of the main remaining blockers to make Dune package management usab= le in real world project is to make some of the low level dependencies, not= ably OCamlFind and the OCaml compiler, relocatable. – ocaml/ocamlfind#72
    • We experimented with a Coq-platform patch to make OCamlFind relocatable= , but we faced issues with packages using topkg due to o= camlbuild build failures. This led to identifying an error with dire= ctory symlink handling in Dune ocaml/dune#9873, ocaml/dune#9937
    • To track the buildability of opam packages with Dune package management= , we worked on a GitHub action that effectively provides us with a dashboar= d of opam packages coverage on a select set of packages. The repository is = available at gri= dbugs/dune-pkg-dashboard.
    • Based on the findings from the above, several issues were opened on the= Dune issue tracker. All the known issues are now tracked in the Package Management MVP milestone on Dune'= s issue tracker.
    • We also focused on improving features that were previously implemented.= Noteworthy changes include the addition of workspace package pins and enhancements for corre= ct path handling in packages – ocaml/dune#9940
    • Work included updates and refactorings to improve source fetching, part= icularly the removal of a rudimentary Git config parser in favor of using <= code>git config directly (ocaml/dune#9905), and enhancements to how Dune handles Git re= positories, such as the checking out of Git repos via rev_store (ocaml/dune#10060).
    • Contributions also focused on refining and testing Dune's package handl= ing, including a fix to ensure that opam's untar code is not used (ocaml/dune#10085), and im= provements to Dune's handling of recursive submodules in Git repos (ocaml/dune#10130).

    [opam] Native Support for Windows in opam 2.2 = (W5)

    Contributed by: @rjbou (OCamlPro), @kit-ty-kate (Tarides), @dra27 (T= arides), @AltGr (OCamlPro)

    Why: Enhance OCaml's viability on Windows by integrating native opam= and opam-repository support, fostering a larger community, and more Windows-friendly packages.

    What: Releasing opam 2.2 with native Windows support, making the off= icial opam-repository usable on Windows platforms.

    Activities:

    • Addressed the issue where the Windows loader would display blocking dia= logue boxes upon failing to find DLLs, adhering to best practices by suppre= ssing these dialogs, and opting for exit codes instead. This enhancement el= iminates disruptive interruptions, ensuring a more seamless operation for a= utomated tasks and CI environments. – #5828
    • Fixed shell detection issues when opam is invoked via Cygwin's /u= sr/bin/env, enhancing compatibility and user experience for those ut= ilising Cygwin alongside cmd or PowerShell. – #5797
    • Recommend Developer Mode on Windows. To optimise storage and align with= best practices, Developer Mode is recommended for enabling symlink support= . – #5831
    • Resolved issues related to environment variable handling, specifically = fixing bugs where updates or additions to environment variables would incor= rectly remove or alter them. – #5837
    • Addressed early loading of git location information, particularly benef= iting Windows users by ensuring correct retrieval and application of git-re= lated configurations. – #5842
    • Disabled ACL in Cygwin. By setting noacl in /etc/fst= ab for /cygdrive mount, this change avoids permission m= ismatch errors, enhancing reliability and usability for Cygwin users. = 13; #5796
    • Introduced the ability to define the package manager path at initialisa= tion, improving customisation and integration capabilities for Windows user= s. – #5847
    • Added winsymlinks:native to the Cygwin environment variabl= e, improving compatibility within the Cygwin ecosystem. – #5793
    • Fixed script generation issues related to path quoting, ensuring smooth= er initialisation and setup processes, especially in mixed-environment scen= arios like Cygwin. – #5841
    • Corrected the precedence and handling of git-location conf= igurations during initialisation, streamlining Git integration and providin= g clearer control over Git settings. – #5848
    • Extended the use of eval-variables to internal Cygwin installations and= adjusted the setup to better accommodate Windows-specific requirements, en= hancing flexibility and system compiler integration. – #5829

    [=E2=80=8Bodoc=E2=80=8B] Unify OC= aml.org and Local Package Documentation (W25)

    Contributed by: @jonludlam (Tarides), @julow (Tarides), @panglesd (T= arides), Luke Maurer (Jane Street)

    Why: Improving local documentation generation workflow will help pac= kage authors write better documentation for their packages, and consolidating the different odoc documentation generators = will help make continuous improvements to odoc available to a larger audience.

    What: We will write conventions that drivers must follow to ensure t= hat their output will be functional. Once established, we will update the Dune rules to follow these rules, access new odoc features (e.g., source rendering), and provide similar functionalities to docs.ocaml.org (a navigational sidebar, for instance). T= his will effectively make Dune usable to generate OCaml.org package documentation.

    Activities:

    • Work continued on the design for the new odoc drivers conv= entions shared by Dune and OCaml.org, and we plan to publish the RFC in Mar= ch.
    • We also started comparing and prototyping various approaches to add sid= ebar support to odoc. Several prototypes have been developed a= nd discussed with the team, and we will resume work on the sidebar implemen= tation once the driver conventions have been adopted.

    [=E2=80=8Bodoc=E2=80=8B] Add Sear= ch Capabilities to odoc (W25)

    Contributed by: @panglesd (Tarides), @EmileTrotignon (Tarides), @jul= ow (Tarides), @jonludlam (Tarides)

    Why: Improve usability and navigability in OCaml packages documentat= ion, both locally and on OCaml.org, by offering advanced search options like type-based queries.

    What: Implementing a search engine interface in odoc, c= omplete with a UI and a search index. Additionally, we're developing a default client-side search engine based on Sherlodoc.

    Activities:

    • The implementation and refinement of sherlodoc's integration with odoc = were our major focuses, this included making sherlodoc pass opam CI on diff= erent architectures and adjusting the dune rules for better usability = 13; ocaml/dune#9956=
    • After the big sherlodoc PR was merged and sherlodoc released last month= , work continued on refining the dune rules for sherlodoc and on adjusting = the search bar's scope based on discussions with the team.
    • We implemented keyboard navigation in the search bar to improve its usa= bility – ocaml/o= doc#1088

    [=E2=80=8Bodoc=E2=80=8B] Improvin= g odoc Performance (W25)

    Contributed by: @jonludlam (Tarides), @julow (Tarides), @gpetiot (Ta= rides)

    Why: Address performance issues in odoc, particularly f= or large-scale documentation, to enhance efficiency and user experience and unlock local documentation generation in large code bases.

    What: Profiling odoc to identify the main performance b= ottlenecks and optimising odoc with the findings.

    Activities:

    • Performance improvements were achieved by addressing issues with source= location lookups for non-existent identifiers, significantly improving lin= k time for large codebases.
    • Several PRs from the module-type-of work were opened, including fixes a= nd tests aimed at enhancing odoc's handling of transitive libr= ary dependencies, shape lookup, and module-type-of expansions – ocaml/odoc#1078, ocaml/odoc#1081
    • Improve the efficiency of finding odoc files in accessible= paths, cutting the time to generate documentation by two in some of our te= sts – ocaml/odoc= #1075

    [Merlin] Support for Project-Wide References i= n Merlin (W19)

    Contributed by: @voodoos (Tarides)

    Why: Enhance code navigation and refactoring for developers by provi= ding project-wide reference editor features, aligning OCaml with the editor experience found in other languages.

    What: Introducing ocamlmerlin server occurrences and LS= P textDocument/references support, extending compiler's Shapes= for global occurrences and integrating these features in Dune, Merlin, and OCam= l LSP.

    Activities:

    • Continued investigations and improvements on Dune rules to address conf= iguration issues
    • After adding support for OCaml 5.2 to merlin-lib, we've re= based the project-wide occurrences work over it.
    • We also started work with the Jane Stree team to test project wide refe= rences at scale in their monorepo. Following our initial integration, we fo= cused on refining Merlin's indexing and occurrence query capabilities, incl= uding addressing bottlenecks and regressions in shape reductions – <= a href=3D"https://github.com/ocaml/ocaml/pull/13001">ocaml/ocaml#13001<= /li>

    [Merlin] Improving Merlin's Performance (W19)

    Contributed by: @pitag (Tarides), @Engil (Tarides)

    Why: Some Merlin queries have been shown to scale poorly in large co= debases, making the editor experience subpar. Users report that they sometimes must wait a few seconds to get the answer. This is obvi= ously a major issue that hurts developer experience, so we're working on improving Merlin performance when it falls short.

    What: Developing benchmarking tools and optimising Merlin's performa= nce through targeted improvements based on profiling and analysis of benchmark results.

    Activities:

    • In merlin-lib, we've continued the work on a prototype to = process the buffer in parallel with the query computation. Parallelism refe= rs to OCaml 5 parallelism (domains).

    Your Feedback Needed on OCaml Home Page Wireframe!

    Claire Vandenberghe announced

    I'm reaching out to ask for a few minutes of your time to review the wirefr= ame designs for the OCaml Home, Industrial, and Academic pages.

    After conducting user interviews with OCaml enthusiasts, we've gathered val= uable insights on what information newcomers find most helpful when visiting the OCaml home.

    As a result, we've been working on restructuring these three major pages to= better cater to user needs.=20

    (Please note that these wireframes primarily focus on navigation, layout= , and content, rather than the User Interface (UI).)

    Your feedback is crucial at this stage, so please feel free to leave commen= ts directly on Figma, via email, or let's schedule a quick call to discuss. Thank you for taking part in this review.=20

    Figma Link: https://www.figma.com/file/eLNSdvayxqvvfBsRsdbJXN/OCaml-Home-Page= ?type=3Ddesign&node-id=3D5%3A2500&mode=3Ddesign&t=3DhHclskuVpoO= zKP2u-1

    OCaml Workshop 2024 at ICFP – announcement and call for= proposals

    Sonja Heinze announced

    This year, ICFP (the Internatio= nal Conference on Functional Programming) is going to take place in beautiful Milan.

    3D"rJIS7LPAT.j=

    Such as every year since 2012, on the last day of that conference, i.e. on = September 7th (Saturday), we'll hold a workshop on OCaml. The workshop is intended to cover all different kinds of aspects of = the OCaml programming language as well as the OCaml ecosystem and its community, such as scientific and/or research-oriented, e= ngineering and/or user-oriented, as well as social and/or community-oriented.

    Call for talk proposals

    The = call for talk proposals for the workshop is open.

    • Dates

      Here are the important dates:

      • Talk proposal submission deadline: May 30th (Thursday)
      • Author notification: July 4th (Thursday)
      • Workshop: September 7th (Saturday)
    • Submissions

      Submissions are typically around 2 pages long (flexible), describing the mo= tivations of the work and what the presentation would be about.

      We encourage everyone who might be interested in giving a talk to submit a = proposal! We truly mean everyone, and also have strongly anyone in mind who belongs to a group that's traditionally underrepresented= at OCaml workshops, e.g. due to your gender(s) or non-gender, where you're from or based or whatever other kinds of character= istics you might have. You should all be able to find all information you'll need to submit a proposal on the official call for talk proposals. However, if you have any question, don't hesitate to ask us.

    • Quota on accepted talks per affiliation

      Even though none of us is a fan of quotas, last year's workshop experimente= d with a quota of a maximum of four talks given by speakers with the same company/university/institute affiliation. In order t= o guarantee a coverage of a diverse range of topics and perspectives, we'll experiment with the same affiliation quota again.

      Do not hesitate to submit your talk proposal in any case: quotas, if needed= , will be taken into account by the PC after reviewing all submissions, so there's no reason to self-select upfront.

    About the workshop itself

    So far, we've only talked about talk proposals and formalities. The really = exciting part will be the workshop itself! It's going to be a whole-day workshop and, similarly to previous years, it's likely going= to have four sessions of about four talks each. It's a rather informal and interactive environment, where people engage in all kin= ds of conversations about OCaml during the breaks and after the workshop.

    • Hybrid attendance and cost for speakers

      We're aiming to make the workshop hybrid with the same streaming modalities= as last year, meaning that talks as well as participation can be either in-person or remote, and remote attendan= ce will be free. To promote a good atmosphere, communication and engagement, we prefer to have most talks in-person, but r= emote talks will be most welcome as well.

      We know that giving the talk in-person comes with an economic cost. We're v= ery happy to announce that thanks to the = OCaml Software Foundation, registration fees will be covered for speakers in ca= se they can't get them funded by other means (e.g. their employer).

      We will do our best to provide the best workshop experience possible for re= mote participants, within the constraints of the hybrid format. While attending in-person does come with advantages, it also comes = with an environmental cost, and we strongly support transitioning to a less plane-intensive organization for conferences and co= mmunity events :deciduous_tree: .

    • Related events

      The day before the OCaml workshop, i.e. Sep 6th (Friday), is the day of the= ML workshop, with focus on more theoretical aspects of OCaml and the whole= family of ML languages in general. The ML workshop h= as already been announced on the OCaml discuss and tends to be very interesting for OCaml lovers as well.

      We're looking forward to the the talk submissions and to the workshop! Let us know if you have any questions. @Armael and @pitag

    down.0.2.0 and omod.0.4.0

    Daniel B=C3=BCnzli announced

    It's my pleasure to announce new releases for down and omod which provide a nic= e ocaml toplevel user experience upgrade. Simply add to your .ocamlinit:=20

    #use "down.top"
    #use "omod.top"=20
    

    And enjoy all the benefits you can learn about in the down manual and in the omod tutor= ial.

    These are mainly maintenance releases but if you ever though that down was = a bit slow when pasting code, it now (well for almost two years=E2=80=A6) implements bracketed pastes. Thanks to @emillon for the reference.

    stdlib-random 1.2

    octachron announced

    The library stdlib-random is a small compatibility library tha= t provides compiler-independent implementations of the PRNGs used in the history of the standard library Random:

    • stdlib-random.v3: implement the PRNG used in OCaml 3.07 to 3.11
    • stdlib-random.v4: implement the PRNG used in OCaml 3.12 to 4.14
    • stdlib-random.v5: implement the PRNG currently used in OCaml 5
    • stdlib-random.v5o: implement the PRNG currently used in OCaml 5 in pure= OCaml

    This library is targeted toward programs that need a deterministic and stab= le behaviour of the Random module across OCaml versions.

    The newly released version 1.2.0 updates all implementations to provide the= new int_in_range function (and its int32_in_range, nativeint_in_range, int64_in_range variants) tha= t will be available in OCaml 5.2.0.

    Note however that the implementations on the pre-OCaml 5 PRNGs are not opti= mal, since I prioritised the maintenance cost over performance, but that could be changed if required.

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=oWls1kR1; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=pkm056/b; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 9A5CCB80123 for ; Tue, 9 Apr 2024 10:16:07 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=rOnfB/ZVJ0pFevzEpBeYN3wDEoYEcmZkghOW3SUngaQ=; b=oWls1kR176ThsiGlnMYULTzypjdEHdLf1bOWAGlGZ4beYdnQPrYE64eI tH+LxFVgSwZubM76Y+AtE9XvKPx69IFs5JAaRYYwEclTghBuZs2xqGoCq 4NGhq7arhvhTOri59sX9sjg4l3SHVMZh6wQTK5cVqQc8E7qxqFACcQGPm Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,189,1708383600"; d="scan'208,217";a="160635266" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Apr 2024 11:16:06 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id BAAE1E0AF6; Tue, 9 Apr 2024 11:16:06 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id EDEC7E0BE9 for ; Tue, 9 Apr 2024 11:16:01 +0200 (CEST) IronPort-SDR: 66150750_2DgnjPyOo/QclM9fRSptdgivWoZO1Uvb5QyavzUC6LNZ48b 4C3N+DzCMpbu6LxDskqvNYaUvenqJOlehsoPRKQ== X-IPAS-Result: =?us-ascii?q?A0F3BABIBhVmlyIeaIFahBlbKBkBYlYyBwhIAwGEUoNPj?= =?us-ascii?q?hiBN4U1iBqCP4g/gTF/gWqBEQMYFiMUAQMBDS4BDgQBAgQBAQMBA4ILgi5GA?= =?us-ascii?q?ogVAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBA?= =?us-ascii?q?QEBAQE3BRA1hTsGLA2CSi4jURpeAwICAwMDBgEBAQEBAQEBAQIBAQEiAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBBwIIBAEjEAQJXAEIB?= =?us-ascii?q?AYTAQElBgIEBxgjAwkLAQYDAhEBNRcBEhQGAYINWAGCXwMFDAaTYkuab3p/M?= =?us-ascii?q?4EBggoBAQaBCD4CAQEBCQIFAQ4JJtoDgUcaCYFIiA0aAWpoAoQjCYQ0Jw+BV?= =?us-ascii?q?USBFTWBc1FvgVBvCxcBAQEBGH8SARECAQgCEA8kCQmDHIJogVsCcIQPfiaBc?= =?us-ascii?q?QGFWwRPCBUPgl4lQYEPSTFeAQEHDoEOSwMMA1oIAgiBHoUzgUtLMxQPEwFVF?= =?us-ascii?q?Q4wCToPDBoCGxQNJCMCLD4DCQoQAhYDHRQEMBEJCyYDKgY2AhIMBgYGWyAWC?= =?us-ascii?q?QQjAwgEA1ADIHARAwQaBAsHdYFIgXUEE0QDEIEyh0GCWIM/giCENE2EVANEH?= =?us-ascii?q?UADC209NRQbKJ0PAToCAYF9LQ4LLQYBBhBKAQIcCgUBCgkIDQEBASACDRcIA?= =?us-ascii?q?ggFBA8LCgUCBQcDAgMQBBEIAw4BBQQVBgEBDgwBAREJAgsCFBkDkjkHAhAYH?= =?us-ascii?q?AkFAgFyjiaOBJNHHGw0B4QWgVsGDIgUaYEkiFaFSYdLhAVMgQqFN4VxhnqSN?= =?us-ascii?q?iKYQCCCNIcdCoEbCYFsaYhpjBw5AxMDEoUogXsjPDA/HgwHMxowQw0QgkoJC?= =?us-ascii?q?jwcD1eLHYIKKwMWgQwBB4I+BhCBLoEmCoEyOTuCQZQJQTUCAQEOKQIHAQoBA?= =?us-ascii?q?QMJhWIBAWmCIQEDJAyBSAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 gSR3g== IronPort-HdrOrdr: A9a23:xeCYI6BdcH/NXG/lHel155DYdb4zR+YMi2TDtnoBNCC9F/byqy nAppUmPGDP+VAssR0b9exoe5PwOE80jKQFmrX5ZI3SJjUO21HYUL2Kj7GD/9SIIUSXnNK1s5 0OT0EUMrDN5DZB4/oTnWGDYq4dKQ28gcKVbZu39QYLcegTUdAC0+6PMHf+LqTefngiOaYE X-Talos-CUID: =?us-ascii?q?9a23=3ATZ2wtGk74kwYGW7KGPPB3KlsmbnXOX78yHjbBVK?= =?us-ascii?q?3Mz10Te3NTnTB37loj8U7zg=3D=3D?= X-Talos-MUID: 9a23:ed+BBAUnpz4hO8/q/BPloDNcL+Va34e/LwM3yb4PuufbFDMlbg== X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.07,189,1708383600"; d="scan'208,217";a="160635183" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHKw0GUJZwfydjdTBxGBpASxR1VIdB0WgSEmK?= =?us-ascii?q?zwywuRYWXIkFazsV0TFAsdWhZR7/+vEXdY8QzTPanp9Pqi0WJQVMfIpW?= =?us-ascii?q?WBOV2ZPmE4kObo/MjWJHPgSYZdTms1KQeLmRXA5LBZGJRIFASoyqIRSQ?= =?us-ascii?q?p582LMMEAVW03nnozwB7Qsqw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Apr 2024 11:16:00 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 009B3561200; Tue, 9 Apr 2024 11:15:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1712654159; bh=r/vvdpsO2UhqVQ37f0ecmOjq89ouBu9A01xxLnxFvec=; h=From:To:Subject:Date:Message-ID; b=pkm056/bfyjX4asPPk2N3P9hBTval7bXyHMi3V5TUgwuuavXrbIGptCVce4LGQ4Hx fCGdFVkCHpuZ3qK+0uRzIwI6oPU4CFOIqxDPITGQAMECYmoc0t7IoPU3QG+g9cP9// 9ky6BiUipD7pbjn3oaYVjbQLZlzdJeM0/Eu4jut8= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 09 Apr 2024 11:15:58 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 9 11:15:59 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499816, queueID=3F18056124E X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19108 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 02 to 09, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 moonpool 0.6 sqids 0.1.0 OCaml Retreat at Auroville, India (March 10th - March 15th) Miou, a simple scheduler for OCaml 5 OCaml.org Newsletter: March 2024 Opam 102: Pinning Packages, by OCamlPro dune 3.15 Ocsigen: summary of recent releases Js_of_ocaml 5.7 Eio Developer Meetings Ocaml developer at Routine, Paris dream-html 3.0.0 Other OCaml News Old CWN moonpool 0.6 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dearest friends of the dual hump, I'm happy to announce the release of [moonpool 0.6]. Moonpool is a library of schedulers and concurrency primitives for OCaml 4.xx and 5.xx, based on threads (possibly spread on multiple domains). Previous release announcements ([0.5], [0.4], [0.3], [0.2], [0.1]) contain more details. This release is fairly large and contains some new libraries. The biggest improvement is the addition of `moonpool.fib' (OCaml 5 only): it defines lightweight _fibers_ with structured concurrency, where the fibers can run on a thread pool chosen by the user. Fibers also come with fiber-local storage and a notion of cancellation that is propagated to children fibers. Overall, fibers are a nicer abstraction than bare futures (especially with monadic combinators). There are currently no cooperative IO primitives provided by the scheduler but I have plans. Another new, more experimental library is `moonpool-lwt' (OCaml 5 only) which allows for interoperability between Lwt and moonpool: a moonpool future (or fiber) can be turned into a Lwt promise; and it becomes possible to `await' a Lwt promise from moonpool, in a thread-safe way. Docs: =E2=80=A2 [moonpool] =E2=80=A2 [moonpool-lwt] [moonpool 0.6] [0.5] [0.4] [0.3] [0.2] [0.1] [moonpool] [moonpool-lwt] sqids 0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Leo Soares announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the first release (0.1.0) of the [official OCaml port of Sqids]. Sqids (pronounced "squids") is an open-source library that lets you generate short unique identifiers from numbers. These IDs are URL-safe, can encode several numbers, and do not contain common profanity words. [official OCaml port of Sqids] OCaml Retreat at Auroville, India (March 10th - March 15th) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Sudha Parimala announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to share the experience report from the first OCaml Retreat: . Thanks to all the participants for contributing to the magic of the event. We hope to run more such retreats in the future! Miou, a simple scheduler for OCaml 5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am delighted to announce the release of `miou.0.1.0'. This release is undoubtedly the culmination and synthesis of the work of several individuals to offer a library that best fits our needs. We're quite convinced by the API we're proposing and quite happy with the implementation. As such, we're coming out of beta to offer version 0.1.0. Above all, this means that the API will change very little, and the library is now ready for use. However, we are not yet in 1.0.0 because we would like to give you time to use Miou, to observe possible bugs, and to give us time to correct these possible bugs in order to prepare version 1.0.0 with peace of mind. You can install the package via OPAM (it will be available soon): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install miou =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We would sincerely like to thank all individuals who have contributed, whether directly or indirectly, to the project. Furthermore, this new version of Miou builds upon the excellent work of @polytypic and his [picos] project. We have incorporated certain elements that are suitable for implementing a scheduler, and we hope that our efforts will lead to a certain standardization of the effects used by different schedulers in OCaml. This rewrite has been carried out while trying to maintain the same semantics and API as what we offered in version `0.0.1~beta2' (however, it is the nature of a beta to potentially break versions). This rewrite culminated in the reimplementation of an [HTTP client and server] (supporting http/1.1 or h2 with TLS which can handle [200k req/sec]) as well as our good old [happy-eyeballs] example. Moreover, the outcome of these implementations is more satisfying to us than their previous versions. At least for now, considering the various changes our cooperative has embarked on=C2=B9, we will not yet release them. We also took the time to integrate a version of the priority queue verified using [Why3]. We would like to thank @Armael and @backtracking (as well as the individuals who contributed to and maintained the [Vocal] project) for their assistance. Finally, I would like to personally thank the [Robur] cooperative for providing me with the necessary time to evolve this project. This release further confirms what we aim to offer to users, and in this regard, we have taken the time to write a small book explaining the use of Miou. This can also be seen as an introduction to asynchronous programming and effects. It is available [here] and is part of the Miou distribution. For any questions or assistance, we are available via email, this forum, or Discord. Happy hacking! *=C2=B9*: As explained in [this article], we try to replace `Cstruct.t' by `string' and it requires obviously a deep change across severals packages. [picos] [HTTP client and server] [200k req/sec] [happy-eyeballs] [Why3] [Vocal] [Robur] [here] [this article] OCaml.org Newsletter: March 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the March 2024 edition of the OCaml.org newsletter! This update has been compiled by the OCaml.org team. You can find [previous updates] on Discuss. Our goal is to make OCaml.org the best resource for anyone who wants to get started and be productive in OCaml. The OCaml.org newsletter provides an update on our progress towards that goal and an overview of the changes we are working on. We couldn't do it without all the amazing OCaml community members who help us review, revise, and create better OCaml documentation. Your feedback enables us to better prioritise our work. Thank you! This newsletter covers: =E2=80=A2 *OCaml Cookbook:* A prototype of an OCaml cookbook that provides short code examples that solve practical problems using packages from the OCaml ecosystem is on staging.ocaml.org/cookbook. =E2=80=A2 *Dark Mode:* We enabled the dark mode on all pages of OCaml.org, based on your operating system / browser settings. =E2=80=A2 *Community & Marketing Pages Rework:* We are seeking feedback on wireframes for the community section and for the marketing-related pages. =E2=80=A2 *General Improvements:* As usual, we also worked on general maintenance and improvements based on user feedback, so we're highlighting some of our work below. [previous updates] Open Issues for Contributors =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C You can find [open issues for contributors here]! [open issues for contributors here] Upcoming OCaml Cookbook =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We're in the process of adding a community-driven section to the Learn area: the OCaml Cookbook. This cookbook is designed as a collection of recipes, offering code samples for tackling real-world tasks using packages from the OCaml ecosystem. It's a practical effort to enrich our learning resources, making them more applicable and useful for our community. This month, our focus shifted towards finalizing the cookbook for release. This includes =E2=80=A2 restructuring the directory structure and placement of recipe f= iles, and =E2=80=A2 adding tasks to the cookbook, so that you can contribute recipe= s for these tasks (we took inspiration from the excellent [Rust Cookbook]). It will always be possible to propose more tasks for the OCaml Cookbook. The main criteria here are: 1. task must require more than just a single Standard Library function call to solve, 2. task must be focused on common problems that occur when trying to build products, 3. if in doubt, make the task more specific, instead of more generic. A good place to give feedback on the cookbook is [this discuss thread]. *Relevant PRs and Activities:* =E2=80=A2 [(WIP) Cookbook compression / decompression] by @F-Loyer =E2=80=A2 [Cookbook : fix in Lwt (type mismatch with iter_s/iter_p functi= ons)] by @F-Loyer =E2=80=A2 [Update 00-caqti-ppx-rapper.ml - fix caqti-driver-sqlite -> caqti-driver-sqlite3] by @F-Loyer [Rust Cookbook] [this discuss thread] [(WIP) Cookbook compression / decompression] [Cookbook : fix in Lwt (type mismatch with iter_s/iter_p functions)] [Update 00-caqti-ppx-rapper.ml - fix caqti-driver-sqlite -> caqti-driver-sqlite3] Dark Mode Released =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C We're happy to anounce that we shipped the Dark Mode for OCaml.org. Dark mode is activated based on your operating system / browser settings. If you see anything wrong, please open an issue and include the URL on which you're seeing a problem. *Relevant PRs and Activities:* =E2=80=A2 [Announce Dark Mode on Discuss] =E2=80=A2 [Add Preliminary Dark Mode for Package Documentation] by @sabine =E2=80=A2 [Fix: dark text color on blue background] by @amarachigoodness74 =E2=80=A2 [(dark mode) adjust breadcrumbs text color] by @sabine =E2=80=A2 [(ui) Activate Dark Mode] by @sabine =E2=80=A2 [Correctly invert text on "Is OCaml Web" page] by @SquidDev =E2=80=A2 [fix: add missing darkmode styles for in-package search results= ] by @sabine =E2=80=A2 [Remove legacy tailwind colors and styles, tidy up darkmode col= ors] by @sabine [Announce Dark Mode on Discuss] [Add Preliminary Dark Mode for Package Documentation] [Fix: dark text color on blue background] [(dark mode) adjust breadcrumbs text color] [(ui) Activate Dark Mode] [Correctly invert text on "Is OCaml Web" page] [fix: add missing darkmode styles for in-package search results] [Remove legacy tailwind colors and styles, tidy up darkmode colors] Homepage & Marketing Pages Rework =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The Home page project kicked off with an analysis of user surveys and interviews, and the development of an initial wireframe for the homepage and the "Industrial Users" and "Academic Users" pages. We've been [reaching out to the community on Discuss] and Twitter to find what people say about OCaml, so we can give a bit more context through testimonials on the "Academic Users" page. Besides this, we've been [asking on Twitter for ideas for the main tagline of the homepage] You can comment on the wireframes in Figma [here]. If you have opinions on the homepage, feel free to share them in [this discuss thread]! [reaching out to the community on Discuss] [asking on Twitter for ideas for the main tagline of the homepage] [here] [this discuss thread] Community Section Rework =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This week, we focused on creating wireframes for the Event, Job, Internship, and Workshop pages, followed by soliciting feedback from the community via Discuss. Concurrently, work commenced on the UI design for the Community Landing page, as well as the Event and Job pages. We also made some improvements to the Events section on the Community page. This involves better treatment of start/end times of events, as well as listing more upcoming events. If you have opinions on the community section, feel free to share them in [this discuss thread]! *Relevant PRs and Activities:* =E2=80=A2 Invite people to add events to events directory: =E2=80=A2 [Improve Events Directory] by @sabine =E2=80=A2 [Fix template bug on upcoming events list] by @sabine =E2=80=A2 [Make clear upcoming event time is UTC] by @sabine =E2=80=A2 Data contributed to events: =E2=80=A2 [(data) Add S-REPLS event] by @sabine =E2=80=A2 [(data) fix wrong date on event] by @sabine =E2=80=A2 [(data) Add OCaml Retreat Auroville] by @D8kTwoXfSUWLdpXruFrQ= iw =E2=80=A2 [(data) add OCaml Manila Meetup] by @sabine [this discuss thread] [Improve Events Directory] [Fix template bug on upcoming events list] [Make clear upcoming event time is UTC] [(data) Add S-REPLS event] [(data) fix wrong date on event] [(data) Add OCaml Retreat Auroville] [(data) add OCaml Manila Meetup] Outreachy Application Period & Internship =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In March, OCaml.org hosted the application period for one [Outreachy internship] on creating an interactive experience for solving OCaml exercises. The process of selecting an Outreachy intern involved creating and managing 15 issues, reviewing 61 pull requests from 8 applicants. The tasks were similar in nature and dealt with restructuring the exercises to enable an interactive experience, adding test cases and solutions (where missing). *Relevant PRs and Activities:* =E2=80=A2 [Create practice folder] by @cuihtlauac =E2=80=A2 [Sort exercises by slug before emitting template] by @csaltachin =E2=80=A2 Turning exercises into practice @Ozyugoo, @mnaibei, @divyankachaudhari, @Kxrishx03, @maha-sachin, @MissJae, @jahielkomu, @Appleeyes [Outreachy internship] [Create practice folder] [Sort exercises by slug before emitting template] General Improvements and Data Additions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Relevant PRs and Activities:* =E2=80=A2 (WIP) we're moving the OCaml Language Manual from v2.ocaml.org = to ocaml.org =E2=80=A2 set up dlvr.it to automatically post RSS feed items from OCaml Planet and OCaml Changelog to new ocaml_org Twitter account =E2=80=A2 [Link to recently added videos on watch.ocaml.org] by @sabine =E2=80=A2 [Change twitter account from OCamlLang to ocaml_org] by @sabine =E2=80=A2 [fix: small improvements on news.eml] by @sabine =E2=80=A2 [is yet category slug] by @cuihtlauac =E2=80=A2 [Add a badge from the green web foundation to the carbon footpr= int page] by @0xrotense =E2=80=A2 Deployment of odoc 2.4.1 to package documentation pipeline: =E2=80=A2 [Compatibility with odoc.2.4.1] by @gpetiot =E2=80=A2 [Patch for voodoo / odoc 2.4.1 upgrade] by @sabine =E2=80=A2 [chore: set doc url to live, after voodoo upgrade] by @sabine =E2=80=A2 Data: =E2=80=A2 [(data) add ocaml.org newsletter February] by @sabine =E2=80=A2 [Changelog entry for OCaml 4.14.2~rc1] by @Octachron =E2=80=A2 [Add dune.3.14.2 announcement] by @Leonidas-from-XIV =E2=80=A2 [OCaml 4.14.2 release and changelog pages] by @Octachron =E2=80=A2 [OCaml 4.14.2: fix release year] by @edwintorok =E2=80=A2 [Add Platform changelogs for February 2024] by @tmattio =E2=80=A2 [Changelog entry for OCaml 5.2.0~beta1] by @Octachron =E2=80=A2 [Add Outreachy winter 2023 round] by @patricoferris =E2=80=A2 Documentation: =E2=80=A2 [DOC: note about windows ppx_show] by @heathhenley =E2=80=A2 [(docs) Fix small typos] by @kenranunderscore =E2=80=A2 [(docs) Add link for instances of Array] by @rmeis06 =E2=80=A2 [Linking exercise to tutorials] by @rmeis06 =E2=80=A2 [Explain why t-first works with labels ] by @mikhailazaryan =E2=80=A2 [Document that begin =E2=80=A6 end use] by @rmeis06 =E2=80=A2 [Use uniform syntax for eval steps] by @cuihtlauac =E2=80=A2 [Linking mentions of atomic module to doc] by @rmeis06 =E2=80=A2 [Linking Bigarray references] by @rmeis06 =E2=80=A2 [(docs) fix example in 'Libraries With Dune'] by @0xRamsi =E2=80=A2 [Fix typo in 4ad_01_operators.md] by @vog =E2=80=A2 [(docs) Use DkML 2.1.0] by @jonahbeckford [Link to recently added videos on watch.ocaml.org] [Change twitter account from OCamlLang to ocaml_org] [fix: small improvements on news.eml] [is yet category slug] [Add a badge from the green web foundation to the carbon footprint page] [Compatibility with odoc.2.4.1] [Patch for voodoo / odoc 2.4.1 upgrade] [chore: set doc url to live, after voodoo upgrade] [(data) add ocaml.org newsletter February] [Changelog entry for OCaml 4.14.2~rc1] [Add dune.3.14.2 announcement] [OCaml 4.14.2 release and changelog pages] [OCaml 4.14.2: fix release year] [Add Platform changelogs for February 2024] [Changelog entry for OCaml 5.2.0~beta1] [Add Outreachy winter 2023 round] [DOC: note about windows ppx_show] [(docs) Fix small typos] [(docs) Add link for instances of Array] [Linking exercise to tutorials] [Explain why t-first works with labels ] [Document that begin =E2=80=A6 end use] [Use uniform syntax for eval steps] [Linking mentions of atomic module to doc] [Linking Bigarray references] [(docs) fix example in 'Libraries With Dune'] [Fix typo in 4ad_01_operators.md] [(docs) Use DkML 2.1.0] Opam 102: Pinning Packages, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Greetings Cameleers, Here=E2=80=99s another heads up for all opam users: [Opam 102: Pinning Packages], our latest blog post breaking down opam for the community; as a keen eye would have already guessed, today's subject is package pinning! We hope that this may be useful to anybody curious about getting acquainted with opam's pins. This article is made for whom wonders how they work and when they are useful to be aware of. Hoping that it may serve as a reference for all newcomers to the ecosystem. We appreciate and are thankful for every reader, we welcome all your feedback, right here, in this thread. :smile: Kind regards, The OCamlPro Team [Opam 102: Pinning Packages] dune 3.15 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Marek Kubica announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce that Dune 3.15.0 is now available. This feature has many fixes and new features that you can find in the changelog. There are a few new features that we would like to specially highlight. Removal of previous limitations in many forms =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C Prior to Dune 3.15 there were a number of limitations where percent forms like `%{env:...}' could be used to expand to useful values. In this release, @rgrinberg put some effort to relax a lot of these restrictions where possible. In the new version some of these limitations have been lifted, so for example `{env:...}' can be used in `install' stanzas ([#10160]). Likewise there was no consistency where `%{cma:...}' or `%{cmo:...}' could be used. With [#10169], these forms should work consistently everywhere. Similarly the variables allowed in `enabled_if' fields have been expanded in [#10250], from just allowing variables that can be computed from the context to now allowing all variables as long as expanding these variables does not introduce dependency cycles. These relaxed rules can also be combined to enable a library depending on environment variables, e.g. `(enabled_if %{env:ENABLE_LIBFOO=3Dfalse}))'. [#10160] [#10169] [#10250] Overlapping names in different contexts =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Continuing the theme of conditionally enabling or disabling code to be built, @jchavarri and @rgrinberg's work on [#10220] makes it possible to have overlapping names between `executable' and `melange.emit' targets. This can be useful when a name is to be shared in different contexts (e.g. one context with native compilation and one emitting code for the browser). [#10220] Properly output UTF-8 encoded text when formatting =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Dune does not assume an encoding of dune files, however when files were formatted the formatter would err on the safe side and escape bytes outside the ASCII range. This means that UTF-8 characters outside of ASCII would get escaped into decimal escape sequences. This was especially annoying in places where the user would write natural language texts, which is common when defining Opam packages in `dune-project' files. For example a discussion of a paper by Paul Erd=C5=91s, Peter Frankl, Vojt=C4=9Bch R=C3=B6dl would upon reformatting = be turned into Paul Erd\\197\\145s, Peter Frankl, Vojt\\196\\155 R\\195\\182, which does a disservice to these scientists and is hard to read. Thanks to the work of @moyodiallo in [#9728] starting with Dune 3.15 the original encoding will be preserved, so your package descriptions will be more readable. [#9728] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Added =E2=80=A2 Add link flags to to `ocamlmklib' for ctypes stubs (#8784, @frejsoya) =E2=80=A2 Remove some unnecessary limitations in the expansions of percent forms in install stanza. For example, the `%{env:..}' form can be used to select files to be installed. (#10160, @rgrinberg) =E2=80=A2 Allow artifact expansion percent forms (`%{cma:..}', `%{cmo:..}= ', etc.) in more contexts. Previously, they would be randomly forbidden in some fields. (#10169, @rgrinberg) =E2=80=A2 Allow `%{inline_tests}' in more contexts (#10191, @rgrinberg) =E2=80=A2 Remove limitations on percent forms in the `(enabled_if ..)' fi= eld of libraries (#10250, @rgrinberg) =E2=80=A2 Support dialects in `dune describe pp' (#10283, @emillon) =E2=80=A2 Allow defining executables or melange emit stanzas with the same name in the same folder under different contexts. (#10220, @rgrinberg, @jchavarri) =E2=97=8A Fixed =E2=80=A2 coq: Delay Coq rule setup checks so OCaml-only packages can bui= ld in hybrid Coq/OCaml projects when `coqc' is not present. Thanks to @vzaliva for the test case and report (#9845, fixes #9818, @rgrinberg, @ejgallego) =E2=80=A2 Fix conditional source selection with `select' on `bigarray' in OCaml 5 (#10011, @moyodiallo) =E2=80=A2 melange: fix inconsistency in virtual library implementation. Concrete modules within a virtual library can now refer to its virtual modules too (#10051, fixes #7104, @anmonteiro) =E2=80=A2 melange: fix a bug that would cause stale `import' paths to be emitted when moving source files within `(include_subdirs ..)' (#10286, fixes #9190, @anmonteiro) =E2=80=A2 Dune file formatting: output utf8 if input is correctly encoded (#10113, fixes #9728, @moyodiallo) =E2=80=A2 Fix expanding dependencies and locks specified in the cram stanza. Previously, they would be installed in the context of the cram test, rather than the cram stanza itself (#10165, @rgrinberg) =E2=80=A2 Fix bug with `dune exec --watch' where the working directory wo= uld always be set to the project root rather than the directory where the command was run (#10262, @gridbugs) =E2=80=A2 Regression fix: sign executables that are promoted into the sou= rce tree (#10263, fixes #9272, @emillon) =E2=80=A2 Fix crash when decoding dune-package for libraries with `(include_subdirs qualified)' (#10269, fixes #10264, @emillon) Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Remove the `--react-to-insignificant-changes' option. (#10083, @rgrinberg) Ocsigen: summary of recent releases =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Vincent Balat announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Eliom 10.4: =E2=80=A2 Basic client-server distillery template: sqlite is now the defa= ult backend =E2=80=A2 Basic template now has license unlicense =E2=80=A2 Basic template fixes =E2=80=A2 Compatibility with Tyxml >=3D 4.6.0 (by Vincent Laporte) Ocsigen Start 6.3 =E2=80=A2 Adding license Unlicense to the template =E2=80=A2 Dependecy to Tyxml >=3D 4.6 Js_of_ocaml 5.7 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hhugo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Js_of_ocaml 5.7.2 was released recently. It adds missing primitives required by OCaml 5.2.0~beta Eio Developer Meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sudha Parimala announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Following the release of Eio 1.0 (), Eio goes into maintenance mode for a bit. We've decided to pause the Eio developer meetings until further notice. Meanwhile, we remain active on the [issue tracker] and the [matrix channel]. I encourage folks to try out Eio and report their findings. [issue tracker] [matrix channel] Ocaml developer at Routine, Paris =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: mefyl announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Routine ([https://routine.co ]) is once more looking for OCaml developers. Routine is a personal productivity assistant and knowledge manager. The technological stack revolves heavily around OCaml which represents 80% of the codebase, both client and server side. The remaining 20% are the UIs in various frontend framework: =E2=80=A2 Browser and desktop (Linux/Macos/Windows) through electron, usi= ng Js_of_ocaml (eyeing on WASM). =E2=80=A2 iOS via Swift bindings. =E2=80=A2 Android via JVM bindings (upcoming). Our technological and academic background leads us to use designs that, I think, can pique the interest of seasoned Ocaml developer. Amongst other things : =E2=80=A2 Type-driven programming based on ppx derivers that produces typescript declaration for frontend bindings, JSON schema to expose and consume external REST APIs (Google, Notion, =E2=80=A6), automatic S= QL bindings, etc. =E2=80=A2 Automatic API and foreign binding generation for the different = front end technology, cross compilation. =E2=80=A2 [Incremental ] based state updates to refresh minimal subsets o= f the app. =E2=80=A2 Integrated graph query language to query and manipulate all the= app data, including defining custom data types and workflows. =E2=80=A2 Highly concurrent implementation through Lwt and Eio - migratin= g to the later as we go. Exception-free design. OCaml 5 with all the goodies. =E2=80=A2 Angstrom based parsing for the interactive console with highlig= hting and completion. =E2=80=A2 Everything is very much library-oriented, with loads of reusabl= e and scaffolded packages. Most of the work is intended to be open sources, or already has been published. =E2=80=A2 An obsession for compile-time checks and type safety. We use state of the art CI/CD and development processes. Salary is up to market standard depending on the profile, plus usual options package, to be discussed. We have a preference for presential work in our Paris 11th office (Charonne, 3 days a week) to help foster team spirit but we won't pass on talented remote individuals. We're looking to extend the team with talented and passionate engineers who see the global picture and will work through all layers of the project to see it succeed and create something we're proud of. While we expect great OCaml and general computer science proficiency, we=E2=80=99re open to most levels of experience. Thoroughnes= s and a love for well rounded, robust and beautiful software design is a must have - but that comes bundled with OCaml love, right ? Do not hesitate to reach out for any question here, at [quentin.hocquet@routine.co]() or refer this to someone who may be interested. Thanks for your time and happy hacking ! [https://routine.co ] [Incremental ] dream-html 3.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 [ANN] dream-html 3.3.1 Add `to_xml' and `pp_xml' functions to render in XML style Normally, dream-html defaults to rendering nodes in HTML style, meaning that void elements are rendered just like opening tags. Eg `
    '. With the new `to_xml' and `pp_xml' functions, we can now render nodes in XML style, meaning `
    '. This allows XML parsers to successfully parse the output. So eg you can use dream-html to author an ePub book. Escape URI attributes like `href' with normal attribute escaping rules in addition to percent-encoding. Most significantly, ampersands are encoded now, eg `/foo?a=3D1&b=3D2' is rendered as `/foo?a=3D1&b=3D2'. Change where line breaks are inserted into the output markup, so that there is no chance of injecting spurious whitespace into the rendered page. This gives complete control over whitespace to the user. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Updates to OCaml.org's Learn Section: Enhancing UI and UX] [the ocaml.org blog] [Updates to OCaml.org's Learn Section: Enhancing UI and UX] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 02 to 09, 2024.

    moonpool 0.6

    Simon Cruanes announced

    Dearest friends of the dual hump,

    I'm happy to announce the release of moonpool 0.6. Moonpool is a library of schedulers and concurrency primitives for OCaml 4.xx and 5.xx, based on thr= eads (possibly spread on multiple domains). Previous release announcements (0.5, 0.4, 0.3, 0.2, 0.1) contai= n more details.

    This release is fairly large and contains some new libraries. The biggest i= mprovement is the addition of moonpool.fib (OCaml 5 only): it defines lightweight fibers with = structured concurrency, where the fibers can run on a thread pool chosen by= the user. Fibers also come with fiber-local storage and a notion of cancellation that= is propagated to children fibers. Overall, fibers are a nicer abstraction than bare futures (especially with monadic combinators). = There are currently no cooperative IO primitives provided by the scheduler but I have plans.

    Another new, more experimental library is moonpool-lwt (OCaml = 5 only) which allows for interoperability between Lwt and moonpool: a moonpool future (or fiber) can be turned into a Lwt promise; and it becomes= possible to await a Lwt promise from moonpool, in a thread-safe way.

    Docs:

    sqids 0.1.0

    Leo Soares announced

    I'm happy to announce the first release (0.1.0) of the official OCaml port of Sqids.

    Sqids (pronounced "squids") is an open-source library that lets you generat= e short unique identifiers from numbers. These IDs are URL-safe, can encode several numbers, and do not contain common profanity w= ords.

    https://opam.ocaml.org/pa= ckages/sqids

    OCaml Retreat at Auroville, India (March 10th - March 15th)

    Sudha Parimala announced

    I'm happy to share the experience report from the first OCaml Retreat: https:/= /ocamlretreat.org/2024/03/24/retreat-experience.html. Thanks to all the participants for contributing to the magic of the event. = We hope to run more such retreats in the future!

    Miou, a simple scheduler for OCaml 5

    Calascibetta Romain announced

    I am delighted to announce the release of miou.0.1.0. This rel= ease is undoubtedly the culmination and synthesis of the work of several individuals to offer a library that best fits our needs. We're quit= e convinced by the API we're proposing and quite happy with the implementation. As such, we're coming out of beta to offer version= 0.1.0. Above all, this means that the API will change very little, and the library is now ready for use. However, we are not yet = in 1.0.0 because we would like to give you time to use Miou, to observe possible bugs, and to give us time to correct these possib= le bugs in order to prepare version 1.0.0 with peace of mind. You can install the package via OPAM (it will be available soon):

    $ opam install miou
    

    We would sincerely like to thank all individuals who have contributed, whet= her directly or indirectly, to the project.

    Furthermore, this new version of Miou builds upon the excellent work of @po= lytypic and his picos<= /a> project. We have incorporated certain elements that are suitable for implementing a schedule= r, and we hope that our efforts will lead to a certain standardization of the effects used by different schedulers in OCaml.

    This rewrite has been carried out while trying to maintain the same semanti= cs and API as what we offered in version 0.0.1~beta2 (however, it is the nature of a beta to potentially break versions). This r= ewrite culminated in the reimplementation of an HTTP client and server (supporting http/1.1 or h2 with TLS which can handle 200k req/sec) as well as our good old happy-eyeballs= example. Moreover, the outcome of these implementations is more satisfying to us than their previous versi= ons. At least for now, considering the various changes our cooperative has embarked on=C2=B9, we will not yet release them.

    We also took the time to integrate a version of the priority queue verified= using Why3. We would like to thank @= Armael and @backtracking (as well as the individuals who contributed to and maintained= the Vocal project) f= or their assistance.

    Finally, I would like to personally thank the Robur cooperative for providing me with the necessary time to evolve= this project.

    This release further confirms what we aim to offer to users, and in this re= gard, we have taken the time to write a small book explaining the use of Miou. This can also be seen as an introduction to asy= nchronous programming and effects. It is available here and is part of the = Miou distribution.

    For any questions or assistance, we are available via email, this forum, or= Discord.

    Happy hacking!

    =C2=B9: As explained in this article, we try to replace Cstruct.= t by string and it requires obviously a deep change across severals packages.

    OCaml.org Newsletter: March 2024

    Sabine Schmaltz announced

    Welcome to the March 2024 edition of the OCaml.org newsletter! This update = has been compiled by the OCaml.org team. You can find previous upda= tes on Discuss.

    Our goal is to make OCaml.org the best resource for anyone who wants to get= started and be productive in OCaml. The OCaml.org newsletter provides an update on our progress towards that goal and an over= view of the changes we are working on.

    We couldn't do it without all the amazing OCaml community members who help = us review, revise, and create better OCaml documentation. Your feedback enables us to better prioritise our work. Thank you!

    This newsletter covers:

    • OCaml Cookbook: A prototype of an OCaml cookbook that provides s= hort code examples that solve practical problems using packages from the OC= aml ecosystem is on staging.ocaml.org/cookbook.
    • Dark Mode: We enabled the dark mode on all pages of OCaml.org, b= ased on your operating system / browser settings.
    • Community & Marketing Pages Rework: We are seeking feedback = on wireframes for the community section and for the marketing-related pages= .
    • General Improvements: As usual, we also worked on general mainte= nance and improvements based on user feedback, so we're highlighting some o= f our work below.

    Open Issues for Contributors

    Upcoming OCaml Cookbook

    We're in the process of adding a community-driven section to the Learn area= : the OCaml Cookbook. This cookbook is designed as a collection of recipes, offering code samples for tackling real-world tasks = using packages from the OCaml ecosystem. It's a practical effort to enrich our learning resources, making them more applicable and us= eful for our community.

    This month, our focus shifted towards finalizing the cookbook for release. = This includes

    • restructuring the directory structure and placement of recipe files, an= d
    • adding tasks to the cookbook, so that you can contribute recipes for th= ese tasks (we took inspiration from the excellent Rust Cookbook).

    It will always be possible to propose more tasks for the OCaml Cookbook. Th= e main criteria here are:

    1. task must require more than just a single Standard Library function cal= l to solve,
    2. task must be focused on common problems that occur when trying to build= products,
    3. if in doubt, make the task more specific, instead of more generic.

    A good place to give feedback on the cookbook is this discuss thread.

    Relevant PRs and Activities:

    Dark Mode Released

    We're happy to anounce that we shipped the Dark Mode for OCaml.org. Dark mo= de is activated based on your operating system / browser settings. If you see anything wrong, please open an issue and include the U= RL on which you're seeing a problem.

    Relevant PRs and Activities:

    Homepage & Marketing Pages Rework

    The Home page project kicked off with an analysis of user surveys and inter= views, and the development of an initial wireframe for the homepage and the "Industrial Users" and "Academic Users" pages.

    We've been reaching out to the community on Discuss and Twitter to find what people say about OCaml, so we can give a bit more cont= ext through testimonials on the "Academic Users" page.

    Besides this, we've been asking on Twitter for ideas for the main tagline of the homepage

    You can comment on the wireframes in Figma here.

    If you have opinions on the homepage, feel free to share them in this discuss thread!

    Community Section Rework

    This week, we focused on creating wireframes for the Event, Job, Internship= , and Workshop pages, followed by soliciting feedback from the community via Discuss. Concurrently, work commenced on the UI design fo= r the Community Landing page, as well as the Event and Job pages.

    We also made some improvements to the Events section on the Community page.= This involves better treatment of start/end times of events, as well as listing more upcoming events.

    If you have opinions on the community section, feel free to share them in <= a href=3D"https://discuss.ocaml.org/t/looking-for-ideas-for-the-community-p= age-at-ocaml-org/14032/9">this discuss thread!

    Relevant PRs and Activities:

    Outreachy Application Period & Internship

    In March, OCaml.org hosted the application period for one Outreachy internship on creating an interactive experience for solving OCaml exercises.

    The process of selecting an Outreachy intern involved creating and managing= 15 issues, reviewing 61 pull requests from 8 applicants. The tasks were similar in nature and dealt with restructuring the exercises= to enable an interactive experience, adding test cases and solutions (where missing).

    Relevant PRs and Activities:

    General Improvements and Data Additions

    Relevant PRs and Activities:

    Opam 102: Pinning Packages, by OCamlPro

    OCamlPro announced

    Greetings Cameleers,

    Here=E2=80=99s another heads up for all opam users: Opam 102: Pinning Packages, our latest blog post breaking down opam for the community; as a keen eye would have already guessed, today's subject is pac= kage pinning!

    We hope that this may be useful to anybody curious about getting acquainted= with opam's pins. This article is made for whom wonders how they work and when they are useful to be aware of.

    Hoping that it may serve as a reference for all newcomers to the ecosystem.

    We appreciate and are thankful for every reader, we welcome all your feedba= ck, right here, in this thread. :smile:=20

    Kind regards, The OCamlPro Team

    dune 3.15

    Marek Kubica announced

    We're happy to announce that Dune 3.15.0 is now available. This feature has= many fixes and new features that you can find in the changelog.

    There are a few new features that we would like to specially highlight.

    Removal of previous limitations in many forms

    Prior to Dune 3.15 there were a number of limitations where percent forms l= ike %{env:...} could be used to expand to useful values. In this release, @rgrinberg put some effort to relax a lot of these restric= tions where possible.

    In the new version some of these limitations have been lifted, so for examp= le {env:...} can be used in install stanzas (#10160).

    Likewise there was no consistency where %{cma:...} or %{= cmo:...} could be used. With #10169, these form= s should work consistently everywhere.

    Similarly the variables allowed in enabled_if fields have been= expanded in #10250, from just allowing variables that can be computed from the context to now allowi= ng all variables as long as expanding these variables does not introduce dependency cycles.

    These relaxed rules can also be combined to enable a library depending on e= nvironment variables, e.g. (enabled_if %{env:ENABLE_LIBFOO=3Dfalse})).

    Overlapping names in different contexts

    Continuing the theme of conditionally enabling or disabling code to be buil= t, @jchavarri and @rgrinberg's work on #10220 makes it possible to have overlapping names between executable and melange.emit targets. This= can be useful when a name is to be shared in different contexts (e.g. one context with native compilation and one emitting code for the browser).

    Properly output UTF-8 encoded text when formatting

    Dune does not assume an encoding of dune files, however when files were for= matted the formatter would err on the safe side and escape bytes outside the ASCII range. This means that UTF-8 characters outside of = ASCII would get escaped into decimal escape sequences.

    This was especially annoying in places where the user would write natural l= anguage texts, which is common when defining Opam packages in dune-project files. For example a discussion of a paper by = Paul Erd=C5=91s, Peter Frankl, Vojt=C4=9Bch R=C3=B6dl would upon reformatti= ng be turned into Paul Erd\\197\\145s, Peter Frankl, Vojt\\196\\155 R\\195\\182, = which does a disservice to these scientists and is hard to read.

    Thanks to the work of @moyodiallo in #9728 starting with Dune 3.15 the original encoding will be preserved, so your package descriptions will be more readable.

    Changelog

    • Added
      • Add link flags to to ocamlmklib for ctypes stubs (#8784, @= frejsoya)
      • Remove some unnecessary limitations in the expansions of percent forms = in install stanza. For example, the %{env:..} form can be used= to select files to be installed. (#10160, @rgrinberg)
      • Allow artifact expansion percent forms (%{cma:..}, %= {cmo:..}, etc.) in more contexts. Previously, they would be randomly= forbidden in some fields. (#10169, @rgrinberg)
      • Allow %{inline_tests} in more contexts (#10191, @rgrinberg= )
      • Remove limitations on percent forms in the (enabled_if ..)= field of libraries (#10250, @rgrinberg)
      • Support dialects in dune describe pp (#10283, @emillon)
      • Allow defining executables or melange emit stanzas with the same name i= n the same folder under different contexts. (#10220, @rgrinberg, @jchavarri= )
    • Fixed
      • coq: Delay Coq rule setup checks so OCaml-only packages can build in hy= brid Coq/OCaml projects when coqc is not present. Thanks to @v= zaliva for the test case and report (#9845, fixes #9818, @rgrinberg, @ejgal= lego)
      • Fix conditional source selection with select on biga= rray in OCaml 5 (#10011, @moyodiallo)
      • melange: fix inconsistency in virtual library implementation. Concrete = modules within a virtual library can now refer to its virtual modules too (= #10051, fixes #7104, @anmonteiro)
      • melange: fix a bug that would cause stale import paths to = be emitted when moving source files within (include_subdirs ..) (#10286, fixes #9190, @anmonteiro)
      • Dune file formatting: output utf8 if input is correctly encoded (#10113= , fixes #9728, @moyodiallo)
      • Fix expanding dependencies and locks specified in the cram stanza. Prev= iously, they would be installed in the context of the cram test, rather tha= n the cram stanza itself (#10165, @rgrinberg)
      • Fix bug with dune exec --watch where the working directory= would always be set to the project root rather than the directory where th= e command was run (#10262, @gridbugs)
      • Regression fix: sign executables that are promoted into the source tree= (#10263, fixes #9272, @emillon)
      • Fix crash when decoding dune-package for libraries with (include_= subdirs qualified) (#10269, fixes #10264, @emillon)

    Changed

    • Remove the --react-to-insignificant-changes option. (#1008= 3, @rgrinberg)

    Ocsigen: summary of recent releases

    Vincent Balat announced

    Eliom 10.4:

    • Basic client-server distillery template: sqlite is now the default back= end
    • Basic template now has license unlicense
    • Basic template fixes
    • Compatibility with Tyxml >=3D 4.6.0 (by Vincent Laporte)

    Ocsigen Start 6.3

    • Adding license Unlicense to the template
    • Dependecy to Tyxml >=3D 4.6

    Js_of_ocaml 5.7

    Hhugo announced

    Js_of_ocaml 5.7.2 was released recently. It adds missing primitives require= d by OCaml 5.2.0~beta

    Eio Developer Meetings

    Sudha Parimala announced

    Following the release of Eio 1.0 (https://discuss.ocaml.org/t/ann-eio-1-= 0-first-major-release/14334), Eio goes into maintenance mode for a bit. We've decided to pause the Eio developer meetings until further = notice. Meanwhile, we remain active on the issue tracker and the mat= rix channel. I encourage folks to try out Eio and report their findings.

    Ocaml developer at Routine, Paris

    mefyl announced

    Routine (https://routine.co ) is once mo= re looking for OCaml developers.

    Routine is a personal productivity assistant and knowledge manager. The tec= hnological stack revolves heavily around OCaml which represents 80% of the codebase, both client and server side. The remaining = 20% are the UIs in various frontend framework:

    • Browser and desktop (Linux/Macos/Windows) through electron, using Js_of= _ocaml (eyeing on WASM).
    • iOS via Swift bindings.
    • Android via JVM bindings (upcoming).

    Our technological and academic background leads us to use designs that, I t= hink, can pique the interest of seasoned Ocaml developer. Amongst other things :

    • Type-driven programming based on ppx derivers that produces typescript = declaration for frontend bindings, JSON schema to expose and consume extern= al REST APIs (Google, Notion, =E2=80=A6), automatic SQL bindings, etc.
    • Automatic API and foreign binding generation for the different front en= d technology, cross compilation.
    • Incremental = based state updates to refresh minimal subsets of the app.
    • Integrated graph query language to query and manipulate all the app dat= a, including defining custom data types and workflows.
    • Highly concurrent implementation through Lwt and Eio - migrating to the= later as we go. Exception-free design. OCaml 5 with all the goodies.
    • Angstrom based parsing for the interactive console with highlighting an= d completion.
    • Everything is very much library-oriented, with loads of reusable and sc= affolded packages. Most of the work is intended to be open sources, or alre= ady has been published.
    • An obsession for compile-time checks and type safety.

    We use state of the art CI/CD and development processes. Salary is up to ma= rket standard depending on the profile, plus usual options package, to be discussed. We have a preference for presential work in our P= aris 11th office (Charonne, 3 days a week) to help foster team spirit but we won't pass on talented remote individuals.

    We're looking to extend the team with talented and passionate engineers who= see the global picture and will work through all layers of the project to see it succeed and create something we're proud of. While= we expect great OCaml and general computer science proficiency, we=E2=80=99re open to most levels of experience. Thoroughness = and a love for well rounded, robust and beautiful software design is a must have - but that comes bundled with OCaml love, right ?

    Do not hesitate to reach out for any question here, at [quentin.hocquet@rou= tine.co](mailto:quentin.hocqu= et@routine.co) or refer this to someone who may be interested.

    Thanks for your time and happy hacking !

    dream-html 3.0.0

    Yawar Amin announced

    [ANN] dream-html 3.3.1

    Add to_xml and pp_xml functions to render in XML = style

    Normally, dream-html defaults to rendering nodes in HTML style, meaning tha= t void elements are rendered just like opening tags. Eg <br>. With the new to_xml and pp_xml<= /code> functions, we can now render nodes in XML style, meaning <b= r />. This allows XML parsers to successfully parse the output. So eg you can use dream-html to author an= ePub book.

    Escape URI attributes like href with normal attribute escaping= rules in addition to percent-encoding. Most significantly, ampersands are encoded now, eg /foo?a=3D1&b=3D2 is rendere= d as /foo?a=3D1&amp;b=3D2.

    Change where line breaks are inserted into the output markup, so that there= is no chance of injecting spurious whitespace into the rendered page. This gives complete control over whitespace to the user.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=fE5pXq+f; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=ThWqhOWt; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 24A70B80123 for ; Tue, 16 Apr 2024 13:00:13 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=+V+qPDGawK0555VCrEOzgPKot33RUCEODch46xJZ8XI=; b=fE5pXq+fbnOCh75Ts7/O/uPrw1dNCB4cBHasNP9l6cUQ17x5PWjdJ5wR LsBveRRLcRkNqyM/ERJkGr5AFqL4C9DMBQo5sX0KyNBt5eApFFMEldo4A gOIEILX+wmpYixz4lMwUYcQzVKqB4HZs0nmjYJc4vyXXK7IXMb4qoYgR9 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,205,1708383600"; d="scan'208,217";a="161847289" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Apr 2024 14:00:11 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3582CE0D68; Tue, 16 Apr 2024 14:00:10 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 365C3E0035 for ; Tue, 16 Apr 2024 14:00:07 +0200 (CEST) IronPort-SDR: 661e6846_JH/THq6hF7oIzQ26pthsxaK0FMEHxFRZm+dYraScC78T3wv gpYKPmJs5UlbPu+Ib6TiMIHr9OBRLEytKaIxHMQ== X-IPAS-Result: =?us-ascii?q?A0GwAgDVZh5mjCIeaIFaHgEBCxIMggQLgUGBAxkBYlYzB?= =?us-ascii?q?whIA4RTg0+OGZFFhi6BOIMKgVYUgREDGBYjFAEDAQ0uAQ4EAQIEAQEDAQIBg?= =?us-ascii?q?guCdAIWiAQCHwYBBDAJDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGA?= =?us-ascii?q?QIQAQEBAUAQNYVtDYJKLiM2NWUJBgEBAQEBAQEBAQIBAQEiAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIIBAGBHAEIChMBA?= =?us-ascii?q?SsNGCMDFAEGAwIEDQE1AwETARIUBgGCZQGCGkUDBQwGlzqbOnqBMoEBggoBA?= =?us-ascii?q?QaBCD4DCwIFDy/aBIFhCYFIiBQaASRIUBkChCUJhDcnD4FVRIEVNYJEb4I/C?= =?us-ascii?q?xcCAQFcYAEBBgs8CYMlgmiCFYRESCaBbwGFXU8IFWqCaTiBUV8SgQ4vGRJhF?= =?us-ascii?q?oJPhiOBS0szMgFVEyIPDBoCGxQNJCMCKT4DCQoQAhYDHRQEMBEJCyYDKgY2A?= =?us-ascii?q?hIMBgYGWyAWCQQjAwgEA1ADIHARAwQaBAsHdYFEgXUEE0QDEIEyhz+CVoM9g?= =?us-ascii?q?iCEMkuFDYFgA0QdQAMLbT01FBsonWkEOAIBgh8VDgskCQIEBykOFhQUDQEFA?= =?us-ascii?q?RMWAiACNhghCgQRBBEIDQsDAxgBAQENAR4JAgcEAgQpA5IuFAkcAwUlA3KOJ?= =?us-ascii?q?oNPiW5IkkKBIWw0B4QWgVsGDIh9gSSHHo5OhAWBVolMgVyGeoNOjUg9ZCKYQ?= =?us-ascii?q?CCCNIcdgSUJgWxplQUQLAQEFAGFM4FkOoFHDgczGjBDgmcJRhwPjiAMFoNYg?= =?us-ascii?q?T6BJoF1O1qQJEE1AgEBDikCBwEKAQEDCYViAQGDDDKBSAEB?= IronPort-PHdr: A9a23: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 slisw== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:tMKkTaPh08H5O8BcT0D155DYdb4zR+YMi2TDiHoddfUFSKalfp 6V98jzjSWE8Ar4WBkb+exoS5PwOk80kqQFqrX5XI3SFDUO11HYSL2KgbGN/9SkIVyGygc/79 YrT0EdMqyWMbESt6+TjGaF+pQbsb+6GcuT9ITjJgJWPGRXgtZbnmVE42igc3FedU1jP94UBZ Cc7s1Iq36LYnIMdPm2AXEDQqzqu8DLvIiOW29LOzcXrC21yR+44r/zFBaVmj0EVSlU/Lsk+W /Z1yTk+6SYte2hwBO07R6d030Woqqu9jJwPr3NtiEnEESutu9uXvUiZ1S2hkF1nAho0idurD CDmWZlAy050QKqQoj8m2qR5+Cn6kdi15aq8y7mvZPuzPaJOA4SGo5Pg5lUfQDe7FdltNZg0L hT12bcrJZPCwjc9R6NkOQgeisa43Zcm0BS5dI7njhaS88TebVRpYsQ8AdcF4oBBjvz7MQiHP N1BM/R6f5KeRfCBkqp91VH0ZipRDA+Dx2GSk8Ntoic1CVXhmlwyw8dyNYElnkN+ZohQ91P5v jCMK5viLZSJ/VmG55VFaMEW4+6G2bNSRXDPCabJknmDrgOPzbXp5v+8NwOlZOXkVwzvegPcb j6ISNlXDQJCjzT4OW1rex2ziw= X-Talos-CUID: =?us-ascii?q?9a23=3AxDMdimr9UwbYZ/X/TQ6TM5jmUckbUEeMnU3rGXS?= =?us-ascii?q?xJjhKU4aHUkeJ1Lwxxg=3D=3D?= X-Talos-MUID: 9a23:U85Q8ARNuYKV/9pnRXTQnGk/DOhI8Z/2FUEXl8o8neSGMzx/bmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,205,1708383600"; d="scan'208,217";a="161847213" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHumCqObetqcij8kaqG77ZPdQ5o5f+ITSE/87?= =?us-ascii?q?hQLOtwy35EcaMmy0rYsWAS1M+WfOananl+b4qgIdMZYLf1QvNm/7b4bR?= =?us-ascii?q?pjQuMnCmMj+4i/7GwmDqjoZQfiF6kYgxCHOT2nDs7oN1RXe5KpOIKl7L?= =?us-ascii?q?cxlDZy6Ru1YNVJIKOmwNut+Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Apr 2024 14:00:06 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EE9345647D9; Tue, 16 Apr 2024 14:00:04 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1713268805; bh=LrJbbygNuXltKTzJAUAa5E6N5YIa0xYrvUK49XQbHRY=; h=From:To:Subject:Date:Message-ID; b=ThWqhOWtkZtZ8K59NYhQ/ZP+/6Qo8+7PiLGxO35m4arkM4jiqAN8QN+WzNRh1NCQr 5euzWTFm13aIJxR+EZoZGBYtXEPIKjF9ns0jcSTcVx00e/bJ7SSucwBj50AoAXSnC2 DORSWEB1G76oZX0Ad9k9fBlZRqwofjDcK7Lzyw8Q= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 16 Apr 2024 14:00:02 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 16 14:00:05 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499185, queueID=373D95647DA X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19112 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMDkgdG8gMTYsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk1lbGFuZ2Ug MjAyNCBQcm9ncmVzcyBVcGRhdGUNClBweGxpYiBtYWludGVuYW5jZSBzdW1tYXJ5DQpUaGUgT0Nh bWwgY29tbXVuaXR5IGlzIHNpZ25lZCB1cCBmb3IgT3V0cmVhY2h5IQ0Kb3BhbSAyLjIuMH5iZXRh Mg0KR29zcGVsIDAuMy4wDQpGcmVkIDAuMS4wIC0gRmVkZXJhbCBSZXNlcnZlIEVjb25vbWljIERh dGEgQVBJDQpPQ0FOTkwgMC4zLjE6IGEgZnJvbS1zY3JhdGNoIGRlZXAgbGVhcm5pbmcgKGkuZS4g ZGVuc2UgdGVuc29yIG9wdGltaXphdGlvbikgZnJhbWV3b3JrDQpPdGhlciBPQ2FtbCBOZXdzDQpP bGQgQ1dODQoNCg0KTWVsYW5nZSAyMDI0IFByb2dyZXNzIFVwZGF0ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9ibG9nLW1lbGFuZ2UtMjAyNC1wcm9ncmVzcy11cGRhdGUvMTQ0NTcvMT4NCg0KDQpBbnRvbmlv IE51bm8gTW9udGVpcm8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICB3ZSByZWNlbnRseSBzaGFyZWQgd2hhdCB3ZSd2ZSBiZWVuIHVwIHRvIGFyb3Vu ZCBNZWxhbmdlICYgZWNvc3lzdGVtIGluDQogIGEgYmxvZyBwb3N0IHdoaWNoIHlvdSBjYW4gZmlu ZCBoZXJlOg0KDQogIDxodHRwczovL21lbGFuZ2UucmUvYmxvZy9wb3N0cy93aGF0cy0yMDI0LWJy b3VnaHQtdG8tbWVsYW5nZS1zby1mYXI+DQoNCiAgSSBob3BlIHlvdSBmaW5kIHRoZSBhYm92ZSBp bmZvcm1hdGl2ZS4gTG9va2luZyBmb3J3YXJkIHRvIHlvdXINCiAgdGhvdWdodHMuDQoNCg0KUHB4 bGliIG1haW50ZW5hbmNlIHN1bW1hcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHB4bGliLW1haW50ZW5hbmNlLXN1 bW1hcnkvMTQ0NTgvMT4NCg0KDQpOYXRoYW4gUmVib3VycyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEkgcmVjZW50bHkgc3RhcnRlZCB3b3JraW5nIG9uIHBweGxpYiBhZ2FpbiB0aGFu a3MgdG8gdGhlIE9DYW1sDQogIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhbnRlZCB0byByZXBv cnQgYmFjayB0byB0aGUgY29tbXVuaXR5IGFsbCB0aGUNCiAgd29yayB0aGVpciBmdW5kaW5nIG1h ZGUgcG9zc2libGUgc28gZmFyIGFsb25nIHdpdGggdGhlIHBsYW4gZm9yIHRoZQ0KICBuZXh0IHN0 ZXBzLg0KDQogIEtub3cgdGhhdCBPQ1NGIGlzIG9ubHkgZnVuZGluZyBtZSBwYXJ0IHRpbWUgb24g dGhpcyBhbmQgdGhhdCBJJ20gb3Blbg0KICB0byBtb3JlIE9DYW1sIGZyZWVsYW5jZSB3b3JrIQ0K DQoNClN1bW1hcnkgb2YgdGhlIHdvcmsNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogSW1wcm92ZWQgZXJyb3IgcmVwb3J0aW5n DQoNCiAgUHB4bGliIGhhcyBhbiBgLWVtYmVkLWVycm9yJyBmbGFnIHRoYXQgaXMgbW9zdCB1c2Vm dWwgdG8gbWVybGluIGFzIGl0DQogIGFsbG93cyBpdCB0byBhbHdheXMgZ2V0IGFuIEFTVCBvdXQg b2YgdGhlIGRyaXZlciBhbmQgYWxsb3dzIGl0IHRvIGtlZXANCiAgb3BlcmF0aW5nIG5vcm1hbGx5 IHdoZW4gYSBwcHggcmFpc2VzIGEgbG9jYXRlZCBleGNlcHRpb24gKGFzIGluIHJhaXNlZA0KICB3 aXRoIGBMb2NhdGlvbi5yYWlzZV9lcnJvcmYnKSBhcyBpdCB3b3VsZCBhbHdheXMgZ2V0IGFuIEFT VCBvdXQgb2YgdGhlDQogIGRyaXZlciBydW4uDQoNCiAgVGhlIHByb2JsZW0gd2l0aCB0aGlzIG1v ZGUgd2FzIHRoYXQgaXQgZGlkbid0IHRyeSB0byByZWNvdmVyIGZyb20gc3VjaA0KICBleGNlcHRp b25zIGFuZCB3b3VsZCBzdG9wIGFwcGx5aW5nIHRyYW5zZm9ybWF0aW9ucy4gVGhlIGVycm9yIHdh cw0KICBwcm9wZXJseSByZXBvcnRlZCBieSBtZXJsaW4gYW5kIGl0IHN0aWxsIGhhZCBhIHZhbGlk IEFTVCB0byB3b3JrIHdpdGgNCiAgYnV0IG5vbmUgb2YgdGhlIHBvdGVudGlhbCBlcnJvcnMgZnJv bSBzdWJzZXF1ZW50IHJld3JpdGluZyBvciBjb2RlIGdlbg0KICB3b3VsZCBiZSByZXBvcnRlZC4g IFRoaXMgbGVhZCB0byBhIHRlZGlvdXMgd29ya2Zsb3cgd2hlcmUgdGhlIHVzZXINCiAgd291bGQg Zml4IG9uZSBlcnJvciwgc2F2ZSB0aGUgZmlsZSwgc2VlIGEgbmV3IGVycm9yIHJlcG9ydGVkIGJ5 DQogIG1lcmxpbiwgZml4IGl0LCBzYXZlLCBhbmQgc28gb24uDQoNCiAgVGhlcmUgd2FzIGEgc2Vy aWVzIG9mIFBScyBieSBAQnVybmxleWRldjEgbG9uZyBwZW5kaW5nIHJldmlldyB0aGF0DQogIHdl cmUgZml4aW5nIHRoaXMgYnkgY29sbGVjdGluZyBhbGwgc3VjaCBleGNlcHRpb25zIHdoaWxlIGtl ZXBpbmcgb24NCiAgdGhlIHJld3JpdGluZyBwaGFzZXMgdXNpbmcgdGhlIGxhc3QgdmFsaWQgQVNU IG9yIG5vZGUuDQoNCiAgSSByZXZpZXdlZCBhbmQgZml4ZWQgdGhvc2UgUFJzIChbIzQ0N10sIFsj NDUzXSBhbmQgWyM0NTddKSBhbmQgd29ya2VkDQogIG9uIGEgY291cGxlIGZpeGVzIGFuZCBpbXBy b3ZlbWVudHMgdG8gZXJyb3IgcmVwb3J0aW5nIHJlbGF0ZWQgdG8gdGhpcw0KICB3b3JrLg0KDQoN CiAgWyM0NDddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L3BweGxpYi9wdWxsLzQ0Nz4N Cg0KICBbIzQ1M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGliL3B1bGwvNDYz Pg0KDQogIFsjNDU3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXBweC9wcHhsaWIvcHVsbC80 NTc+DQoNCg0K4peKIERyaXZlciBtb2RlIGZvciBkdW5lDQoNCiAgRHVuZSBoYXMgb25nb2luZyBp bnRlcm5hbCB3b3JrIHRvIGJlIGFibGUgdG8gdXNlIHBweCBpbg0KICBkZXZlbG9wbWVudC4gU2lu Y2UgaXQgY2Fubm90IGRlcGVuZCBvbiBwcHhsaWIgb3IgYW55IHBweCBhdCBidWlsZA0KICB0aW1l LCB0aGVpciBzb2x1dGlvbiByZWxpZXMgb24gdXNpbmcgcHB4bGliIGFuZCBwcHggbm9ybWFsbHkg aW4NCiAgZGV2ZWxvcG1lbnQgYnV0IHVzaW5nIGFscmVhZHkgcHJlcHJvY2Vzc2VkIGNvcGllcyBv ZiBzb3VyY2UgZmlsZXMgdGhhdA0KICByZXF1aXJlIHJld3JpdGluZyBmb3IgYm9vdHN0cmFwcGlu ZywgbWFraW5nIHRoZWlyIG9wYW0gYnVpbGQgcHB4LWZyZWUuDQoNCiAgVGhleSByZXF1aXJlIGEg c3BlY2lhbCBkcml2ZXIgbW9kZSB0aGF0IHdyaXRlcyB0byB0aGUgb3V0cHV0IGZpbGUgb25seQ0K ICBpZiBhbnkgYWN0dWFsIHJld3JpdGluZyBoYXBwZW5lZC4NCg0KICBJIHdvcmtlZCBvbiBhIGZp cnN0IHByb3RvdHlwZSBvZiB0aGlzIHVzaW5nIGEgcHJlLWV4aXN0aW5nIGhvb2sgY2FsbGVkDQog IGZvciBlYWNoIGdlbmVyYXRlZCBBU1Qgbm9kZS4NCg0KDQril4ogNS4yIGNvbXBhdCBvbiB0cnVu ay1zdXBwb3J0DQoNCiAgVGhlIG1haW4gdGFzayBzaW5jZSBJIHN0YXJ0ZWQgd29ya2luZyBvbiBw cHhsaWIgd2FzIHRoZSA1LjINCiAgc3VwcG9ydC4gQXMgT0NhbWwgNS4yIGlzIGNvbWluZyBvdXQg c29vbiBhbmQgcHB4bGliIGlzIGEgY2VudHJhbCBwaWVjZQ0KICBpbiB0aGUgT0NhbWwgZWNvc3lz dGVtLCBpdCdzIGltcG9ydGFudCB0aGF0IHBweGxpYiBoYXMgYSBjb21wYXRpYmxlDQogIHZlcnNp b24gYXZhaWxhYmxlIGZvciB0ZXN0aW5nIG91dCB0aGUgbmV3IGNvbXBpbGVyLiBXaXRob3V0IGl0 LCBhIGxvdA0KICBvZiBvcGFtIHBhY2thZ2VzIGNhbid0IGJlIGJ1aWx0IHdpdGggdGhlIGFscGhh IGFuZCBiZXRhIHJlbGVhc2VzIG9mDQogIHRoZSBjb21waWxlciBiZWNhdXNlIG9mIHRoZWlyIHBw eCBkZXBlbmRlbmNpZXMuDQoNCiAgcHB4bGliIGhhcyBhIGB0cnVuay1zdXBwb3J0JyBicmFuY2gg dGhhdCBpcyBtZWFudCB0byBiZSBrZXB0IHVwIHRvDQogIGRhdGUgZm9yIHN1Y2ggb2NjYXNpb25z LiBXaGlsZSBpdCBhbHJlYWR5IGNvbnRhaW5lZCB0aGUgQVNUIG1pZ3JhdGlvbg0KICBmcm9tL3Rv IHRoZSA1LjIgdmVyc2lvbiwgaXQgd2FzIG91dCBvZiBzeW5jIHdpdGggdGhlIG1haW4gYnJhbmNo IG9mDQogIHBweGxpYi4NCg0KICBJIHJlYmFzZWQgdGhlIDUuMiByZWxldmFudCBwYXJ0cyBvZiB0 aGUgYnJhbmNoIG9uIHRvcCBvZiBvdXIgbWFpbg0KICBicmFuY2ggdG8gYmUgYWJsZSB0byBjdXQg YSBmaXJzdCBwcmV2aWV3IHZlcnNpb24gd2l0aCA1LjIgY29tcGF0IGFuZA0KICBmaXhlZCBhIGNv dXBsZSBvZiBidWdzIGFuZCBxdWlya3MgaW4gdGhlIGNvZGUgYmFzZSB0aGF0IHByZXZlbnRlZCB0 aGUNCiAgdGVzdCBzdWl0ZSBmcm9tIHJ1bm5pbmcgcHJvcGVybHkgd2l0aCB0aGUgNS4yIHN1cHBv cnQuDQoNCiAgQWZ0ZXIgdGhlIGZpcnN0IHJlbGVhc2Ugb2YgdGhlIHByZXZpZXcgdmVyc2lvbiB3 ZSBkaXNjb3ZlcmVkIGEgc2VyaWVzDQogIG9mIGJ1Z3Mgd2l0aCB0aGUgaGVscCBvZiBAa2l0LXR5 LWthdGUsIEBvY3RhY2hyb24gYW5kIEBhbm1vbnRlaXJvLiBUaGUNCiAgbW9zdCBpbXBvcnRhbnQg YW1vbmcgdGhvc2UgYmVpbmc6DQogIOKAoiBBIGJ1ZyBpbiB0aGUgcm91bmQgdHJpcCBtaWdyYXRp b24gb2YgdGhlIG5ldyBgUGV4cF9mdW5jdGlvbicgbm9kZQ0KICAgIGZyb20gNS4yIHRoYXQgd2Fz IGNhdXNpbmcgY29tcGlsYXRpb24gZXJyb3JzIHdoZW4gdGhlIGZ1bmN0aW9uJ3MNCiAgcmV0dXJu IHR5cGUgd2FzIGNvZXJjZWQuDQogIOKAoiBUaGUgbmV3IHN5bnRheCBmb3IgYG9jYW1sLnBweC5j b250ZXh0JyB3YXMgY2F1c2luZyBkcml2ZXIgY3Jhc2hlcw0KICAgIHdoZW4gcmVhZGluZyBzb21l IGJpbmFyeSBBU1RzLiBJIHdyb3RlIGEgbWlncmF0aW9uIGZvciB0aG9zZQ0KICBhdHRyaWJ1dGVz IHRoYXQgZml4ZWQgdGhlIGlzc3VlLg0KICDigKIgVGhlIGRyaXZlciB3YXMgc2lsZW50bHkgcmVs eWluZyBvbiB0aGUgY29tcGlsZXIgdG8gcmUtb3BlbiBmaWxlcyB0bw0KICAgIGRpc3BsYXkgc291 cmNlIHF1b3RhdGlvbiB3aGVuIHJlcG9ydGluZyBsb2NhdGVkIGV4Y2VwdGlvbnMuDQogIFNpbmNl IHRoaXMgd2FzIHJlbW92ZWQgZnJvbSB0aGUgY29tcGlsZXIgaW4gNS4yLCBJIGZpeGVkIHRoZSBk cml2ZXIgdG8NCiAgcHJvcGVybHkgc2V0IGBMb2NhdGlvbi5pbnB1dF9sZXhidWYnIGFuZCByZS1l bmFibGUgc291cmNlLXF1b3RhdGlvbi4NCg0KDQril4ogcHB4X2Rlcml2aW5nIG1haW50ZW5hbmNl DQoNCiAgYHBweF9kZXJpdmluZycgaXMgcXVpdGUgYSBjZW50cmFsIHBpZWNlIG9mIHRoZSBwcHgg ZWNvc3lzdGVtLA0KICBlc3BlY2lhbGx5IGZvciB0aGUgc2V0IG9mIHN0YW5kYXJkIGRlcml2ZXJz IGl0IHByb3ZpZGVzDQogIChwcmV0dHktcHJpbnRlcnMsIGVxdWFsaXR5IGFuZCBjb21wYXJpc29u IGZ1bmN0aW9ucywgZXRjLikuDQoNCiAgVGhlIHByb2plY3Qgd2FzIGxhY2tpbmcgbWFpbnRhaW5l cnMgd2l0aCBlbm91Z2ggdGltZSB0byByZXZpZXcgYW4NCiAgaW1wb3J0YW50IFBSIG1pZ3JhdGlu ZyB0aG9zZSBzdGFuZGFyZCBkZXJpdmVycyB0byBwcHhsaWIuIFRoaXMgaXMNCiAgaW1wb3J0YW50 IGJlY2F1c2UgaXQgbWFrZXMgdGhvc2UgcXVpdGUgYnJvYWRseSB1c2VkIGRlcml2ZXJzIGJldHRl cg0KICBpbnRlZ3JhdGVkIHdpdGggcHB4bGliIGZlYXR1cmVzIGFuZCBpbXByb3ZlcyBib3RoIHBl cmZvcm1hbmNlcyBhbmQNCiAgZXJyb3IgcmVwb3J0aW5nIGZvciB0aGVpciB1c2VycyBhcyB0aGV5 IGFyZSBub3cgYXBwbGllZCBhcyBwYXJ0IG9mIHRoZQ0KICBtYWluIHBweGxpYiBkcml2ZXIgQVNU IHRyYXZlcnNhbC4NCg0KICBJIHJldmlld2VkIHRoZSBQUiBhbmQgY2xlYW5lZCB1cCB0aGUgcmVw byBhIGJpdCB0byBhdHRlbXB0IGEgcmVsZWFzZSwNCiAgc29tZXRoaW5nIHRoYXQgaGFzIG5vdCBo YXBwZW5lZCBmb3IgMyB5ZWFycyBmb3IgdGhpcyBwYWNrYWdlLg0KDQogIFRoZSBpbml0aWFsIHJl bGVhc2UgZmFpbGVkIGZvciB0d28gcmVhc29uczoNCiAg4oCiIGBwcHhfZGVyaXZpbmcuc2hvdycn cyBkZXJpdmVyIGFjY2VwdHMgYW4gYXJndW1lbnQgdGhhdCBzcGVjaWZpZXMgaG93DQogICAgdGhl IGltcGxlbWVudGF0aW9uIHNob3VsZCBiZWhhdmUgd2l0aG91dCBpbXBhY3RpbmcgdGhlDQogIGZ1 bmN0aW9uIHNpZ25hdHVyZS4gSW4gdGhlIHBweGxpYiBwb3J0IHdlIGRpZCBub3QgcmVnaXN0ZXIg dGhpcw0KICBhcmd1bWVudCBmb3IgdGhlIHNpZ25hdHVyZSBkZXJpdmVyIHNpbmNlIGl0IGhhZCBu byBpbXBhY3Qgb24gdGhlDQogIGdlbmVyYXRlZCBjb2RlIHRoZXJlLiBJdCB0dXJucyBvdXQgYXQg bGVhc3Qgb25lIG9wYW0gcGFja2FnZSB1c2VkIHRoZQ0KICBhcmd1bWVudCBpbiBhbiBgLm1saScg ZmlsZSBzbyB3ZSBhZGRlZCBpdCBmb3IgY29tcGF0aWJpbGl0eSBhcw0KICBgcHB4X2Rlcml2aW5n JyBkdXBsaWNhdGVkIHRoZSBzZXQgb2YgYXJndW1lbnRzIGZvciBpbXBsZW1lbnRhdGlvbiBhbmQN CiAgaW50ZXJmYWNlcw0KICDigKIgYHBweF9kZXJpdmluZycgdXNlZCB0byBhdXRvbWF0aWNhbGx5 IHJlZ2lzdGVyIGV4dGVuc2lvbnMgZm9yIGVhY2gNCiAgICBkZXJpdmVycyB0aGF0IGNhbiBiZSB1 c2VkIHRvIGlubGluZSB0aGUgZGVyaXZlZCBmdW5jdGlvbiBmb3IgYQ0KICBnaXZlbiB0eXBlIGlu IGFuIGV4cHJlc3Npb24uIFdlIHByZXNlcnZlZCB0aGlzIGluIHRoZSBwcHhsaWIgcG9ydCBidXQN CiAgaXQgY2F1c2VkIGEgY29uZmxpY3Qgd2l0aCBgcHB4X2xldCcuIFRoaXMgY29uZmxpY3Qgc2hv dWxkIGJlIHJlc29sdmVkDQogIG9uIGBwcHhfbGV0JydzIHNpZGUgYXMgdGhleSB3ZXJlIGRlY2xh cmluZyBhbiBleHRlbnNpb24gbmFtZWQgYG1hcCcNCiAgd2l0aG91dCBhbnkgcG9zc2libGUgcHJl Zml4IHN1Y2ggYXMgYHBweF9sZXQubWFwJyB3aGljaCBpcyB0aGUNCiAgcmVjb21tZW5kZWQgd2F5 LiBVc2luZyBhIHByZWZpeCBhbGxvd3MgdGhlIHVzZXIgdG8gZGlzYW1iaWd1YXRlIGlmDQogIHNl dmVyYWwgcHB4IGRlY2xhcmUgYW4gZXh0ZW5zaW9uIHdpdGggdGhlIHNhbWUgYmFzZSBuYW1lLg0K DQogIFdlIGhhZCB0byBjYW5jZWwgdGhlIHJlbGVhc2UgdG8gZml4IHRob3NlIGlzc3VlcyBiZWZv cmUgYXR0ZW1wdGluZw0KICBhZ2Fpbi4NCg0KDQril4ogR2VuZXJhbCBtYWludGVuYW5jZQ0KDQog IFRoZXJlIHdhcyBhbHNvIHNvbWUgcmVndWxhciBtYWludGVuYW5jZSBzdWNoIGFzIGltcHJvdmlu ZyBvdXIgaG9tZW1hZGUNCiAgZXhwZWN0IHRlc3QgcnVubmVyIHRvIGJlIGFibGUgdG8gYmV0dGVy IHJ1biBvdXIgdGVzdHMgYWNyb3NzIGFsbA0KICBzdXBwb3J0ZWQgY29tcGlsZXIgdmVyc2lvbnMs IHJldmlld2luZyBhbGwgcGVuZGluZyBQUnMsIHVwZ3JhZGluZw0KICBvY2FtbGZvcm1hdCBhbmQg Y3V0dGluZyBhIHJlbGVhc2Ugb2YgcHB4bGliIHdpdGggdGhlIGxhdGVzdCBmZWF0dXJlcy4NCg0K DQpOZXh0IHN0ZXBzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBbG9uZyB3 aXRoIHRoZSBnZW5lcmFsIG1haW50ZW5hbmNlIG9mIHRoZSBwcm9qZWN0IHRoZXJlIGFyZSB0d28g dGhpbmdzDQogIHRoYXQgd291bGQgZ3JlYXRseSByZWR1Y2UgdGhlIG1haW50ZW5hbmNlIGJ1cmRl biBvbiBwcHhsaWIgYW5kIHdvdWxkDQogIGltcHJvdmUgdGhlIHN0YXRlIG9mIHRoZSBlY29zeXN0 ZW0gZm9yIHRoZSBjb21tdW5pdHkgdGhhdCB3ZSB3b3VsZA0KICBsaWtlIHRvIHdvcmsgb24uDQoN Cg0K4peKIFVwc3RyZWFtaW5nIEFzdGxpYiB0byB0aGUgY29tcGlsZXINCg0KICBUaGlzIGhhcyBi ZWVuIGluIHRoZSB3b3JrcyBmb3IgcXVpdGUgYSBsb25nIHRpbWUgYnV0IHRoZSBwcmV2aW91cw0K ICBtYWludGFpbmVycyBoYXZlbid0IGhhZCB0aGUgY2hhbmNlIHRvIHNlZSBpdCB0aHJvdWdoLg0K DQogIFRoZSBwbGFuIGlzIHRvIHVwc3RyZWFtIGEgc21hbGwgcGFydCBvZiBwcHhsaWIgaW50byB0 aGUgY29tcGlsZXIgdG8NCiAgZWFzZSB0aGUgcmVsZWFzZSBwcm9jZXNzIGZvciBuZXcgY29tcGls ZXJzLg0KDQogIFRoaXMgc21hbGwgbGlicmFyeSBzaG91bGQgY29udGFpbiB0aGUgbWluaW1hbCBz dWJzZXQgb2Ygc3RhYmxlIEFQSQ0KICBwcHhsaWIgbmVlZHMgdG8gcHJvcGVybHkgZnVuY3Rpb24g YW5kLCBtb3N0IGltcG9ydGFudGx5LCB0aGUgQVNUDQogIG1pZ3JhdGlvbnMgZnJvbSB0aGUgY3Vy cmVudCB2ZXJzaW9uIG9mIHRoZSBjb21waWxlciB0byB0aGUgcHJldmlvdXMNCiAgdmVyc2lvbiBh bmQgYmFjay4gVGhlIGlkZWEgaXMgdGhhdCB0cnVuayB3b3VsZCB0aGVuIHByb3ZpZGUgdGhlDQog IG1pZ3JhdGlvbiB0byB0aGUgbGF0ZXN0IHJlbGVhc2VkIHZlcnNpb24gYXQgYWxsIHRpbWUgYW5k IHBweGxpYiB3b3VsZA0KICBiZSBhYmxlIHRvIHVzZSB0aG9zZSBpZiBpdCBkb2VzIG5vdCBuYXRp dmVseSBzdXBwb3J0cyB0aGVtIHlldC4gIFRoYXQNCiAgd291bGQgbWFrZSB0ZXN0aW5nIHRoZSBj b21waWxlciBvbiBvcGFtIHdvcmsgd2l0aG91dCByZXF1aXJpbmcgYQ0KICBzcGVjaWFsIHJlbGVh c2Ugb2YgcHB4bGliIGFuZCB3b3VsZCBhbHNvIGVhc2UgdGhlIG1pZ3JhdGlvbiB3cml0aW5nDQog IHByb2Nlc3MgYXMgdGhleSB3b3VsZCBiZSB3cml0dGVuIGF0IHRoZSB0aW1lIG9mIHRoZSBBU1Qg Y2hhbmdlIGJ5IHRoZQ0KICBwZXJzb24gd2hvIG1vZGlmaWVkIGl0IGFuZCB0aGVyZWZvcmUgdGhh dCBpcyBtb3N0IHF1YWxpZmllZCB0byBkbyBzby4NCg0KICBJbmRlZWQgdGhlIG1pZ3JhdGlvbiB3 cml0aW5nIHByb2Nlc3MgaXMgdGltZSBjb25zdW1pbmcgYXQgdGhlIG1vbWVudA0KICBiZWNhdXNl IGl0IGlzIGRvbmUgYnkgcHB4bGliIG1haW50YWluZXJzIHdoZW4gdGhlIG5leHQgb2NhbWwgcmVs ZWFzaW5nDQogIGlzIGNsb3NpbmcgaW4gYW5kIHJlcXVpcmVzIHVzIHRvIGRpdmUgaW50byBjaGFu Z2VzIHdlIGFyZSBub3QNCiAgbmVjZXNzYXJpbHkgZmFtaWxpYXIgd2l0aC4NCg0KICBEdXJpbmcg dGhlIGNvbXBpbGVyIHJlbGVhc2UgcHJvY2VzcywgcHB4bGliIHdvdWxkIGluY29ycG9yYXRlIHRo b3NlDQogIG5ldyBtaWdyYXRpb24gdG8gdGhlIGVudGlyZSBzZXQgb2YgbWlncmF0aW9ucyBpdCBz dXBwb3J0cywgYWxsb3dpbmcgaXQNCiAgdG8gYmUgY29tcGF0aWJsZSB3aXRoIHRoZSAibmV3IiB0 cnVuayB1bnRpbCB0aGUgbmV4dCByZWxlYXNlLg0KDQogIFRoZSBjb3JlIG9mIHRoaXMgd29yayBp cyB0byBmb3JtYWxseSB3cml0ZSBkb3duIHRoaXMgcHJvY2VzcyBhbmQgc3RhcnQNCiAgdGhlIGRp c2N1c3Npb24gd2l0aCB0aGUgY29tcGlsZXIgdGVhbS4gT25jZSB3ZSBhZ3JlZSBvbiBhIHBsYW4s IEkNCiAgZG9uJ3QgZXhwZWN0IHRoZXJlIGlzIGEgbG90IG9mIGNvZGUgdG8gd3JpdGUgZm9yIHRo aXMgYXMgYWxsIG9mIGl0DQogIGFscmVhZHkgbGl2ZXMgaW5zaWRlIHBweGxpYi4NCg0KDQril4og UmVmaW5pbmcgdGhlIHJlbGVhc2UgcHJvY2VzcyBmb3IgcHB4bGliIHdpdGggYW4gQVNUIGJ1bXAN Cg0KICBQYXJ0IG9mIHRoZSBwcHhsaWIgY29udHJhY3QgaXMgdGhhdCBhbGwgcHB4LWVzIHdyaXR0 ZW4gd2l0aCBwcHhsaWINCiAgbXVzdCB1c2UgdGhlIHNhbWUgdmVyc2lvbiBvZiB0aGUgQVNUIGNo b3NlbiBieSBwcHhsaWIuIFRoaXMgYWxsb3dzIGZvcg0KICBiZXR0ZXIgcGVyZm9ybWFuY2VzIGFu ZCBzZW1hbnRpY3Mgb2YgcmV3cml0aW5nLiBUaGlzIHZlcnNpb24gaXMNCiAgdXN1YWxseSB0aGUg bGF0ZXN0IHN1cHBvcnRlZCB2ZXJzaW9uIGFzIGl0IGlzIHJlcXVpcmVkIGZvciBwcHgtZXMgdG8N CiAgc3VwcG9ydCBhbGwgdGhlIG5ldyBsYW5ndWFnZSBmZWF0dXJlcy4gSXQgc29tZXRpbWVzIGhh cHBlbiB0aGF0IHRoZQ0KICBpbnRlcm5hbCBBU1QgdmVyc2lvbiBsYWdzIGJlaGluZCBpZiBubyBu ZXcgZmVhdHVyZXMgd291bGQgYmUNCiAgInVubG9ja2VkIiBieSB1cGdyYWRpbmcgdGhlIEFTVCwg YXMgaXQgaGFzIGJlZW4gdGhlIGNhc2Ugc2luY2UgNC4xNC4NCg0KICBFdmVyeSBub3cgYW5kIHRo ZW4gcHB4bGliIGhhcyB0byBidW1wIGl0cyBpbnRlcm5hbCBBU1QgdGhvdWdoLA0KICBwb3RlbnRp YWxseSBicmVha2luZyBpdHMgQVBJIGFuZCB0aGVyZWZvcmUgYSBmZXcgb2YgaXRzIHJldmVyc2UN CiAgZGVwZW5kZW5jaWVzLg0KDQogIEluIHRoZSBwYXN0IGZldyB5ZWFycywgd2UgZGVjaWRlZCB0 byBidWlsZCB0aGUgZW50aXJlIHNldCBvZiByZXZlcnNlDQogIGRlcGVuZGVuY2llcyBldmVyeSB0 aW1lIHdlcmUgcmVsZWFzaW5nIHN1Y2ggYSBjaGFuZ2UgYW5kIHRvIHNlbmQgUFJzDQogIHRvIGZp eCByZXZkZXBzIHRvIGhlbHAga2VlcCB0aGUgcHB4IGVjb3N5c3RlbSBzYW5lIGFuZCBhdm9pZCBw dXR0aW5nDQogIHRvIG11Y2ggcHJlc3N1cmUgb24gaW5kaXZpZHVhbCBwcHgtZXMgbWFpbnRhaW5l cnMuDQoNCiAgV2Uga25vdyB0aGF0IHdlIHdpbGwgaGF2ZSB0byBkbyB0aGlzIGZvciB0aGUgNS4z IHJlbGVhc2UgYXMgaXQgd2lsbCBiZQ0KICBhZGRpbmcgZWZmZWN0cyBzeW50YXguDQoNCiAgVGhl IGN1cnJlbnQgd29ya2Zsb3cgcmVsaWVzIG9uIGJ1aWxkaW5nIGEgImR1bml2ZXJzZSIgaS5lLiBz b21lIHNvcnQNCiAgb2YgbGFyZ2UgZHVuZS1wcm9qZWN0IGNvbnRhaW5pbmcgcHB4bGliIGFuZCBh IGNsb25lIG9mIGFsbCBpdHMgcmV2ZXJzZQ0KICBkZXBlbmRlbmNpZXMuIFRoaXMgcHJvdmVzIHF1 aXRlIGEgY2hhbGxlbmdlIGFzIGl0IGlzIG9mdGVuIGhhcmQgdG8gZ2V0DQogIGV2ZXJ5dGhpbmcg dG8gYnVpbGQgdG9nZXRoZXIuICBBbiBpZGVhbCBzb2x1dGlvbiB3b3VsZCBiZSB0byByZWx5IG1v cmUNCiAgb24gYG9wYW0tY2knIGZvciB0aGlzIGJ1dCBpbiBpdHMgY3VycmVudCBzdGF0ZSBpdCBp cyBub3QgdmVyeQ0KICByZWxpYWJsZS4NCg0KICBJJ2QgbGlrZSB0byBzcGVuZCBzb21lIHRpbWUg b24gaW1wcm92aW5nIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nDQogIHJldmRlcHMgb2YgcHB4bGli IGFuZCBzdWJtaXR0aW5nIFBScyBhbmQgZXhwZXJpbWVudCB0byBwcmVwYXJlIGZvciB0aGUNCiAg bmV4dCBidW1wIHdoaWNoIHdpbGwgaW5jbHVkZSB0aGUgNS4yIGNoYW5nZXMgdG8gYFBleHBfZnVu Y3Rpb24nIHRoYXQNCiAgd2UgZXhwZWN0IHRvIHBvdGVudGlhbGx5IGJyZWFrIHF1aXRlIGEgbG90 IG9mIHJldmVyc2UgZGVwZW5kZW5jaWVzLg0KDQoNClRoZSBPQ2FtbCBjb21tdW5pdHkgaXMgc2ln bmVkIHVwIGZvciBPdXRyZWFjaHkhDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3RoZS1vY2FtbC1jb21tdW5p dHktaXMtc2lnbmVkLXVwLWZvci1vdXRyZWFjaHkvMTM4OTIvMTg+DQoNCg0KTmF0aGFuIFJlYm91 cnMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gYSBiaXQgbGF0ZSB0byB0aGUg cGFydHkgYnV0IHN0aWxsIHdhbnRlZCB0byBsZXQgeW91IGtub3cgYWJvdXQgdGhlDQogIHByb2pl Y3Qgd2Ugc3VibWl0dGVkIHdpdGggQHNob25mZWRlciBhbmQgQGRpbmFrYWpveS4NCg0KICBbb2Nh bWwtYXBpLXdhdGNoXSBpcyBhIGZyZXNoIHByb2plY3QgdGhhdCBhaW1zIGF0IHByb3ZpZGluZyBh IHN1aXRlIG9mDQogIHRvb2xzIHRvIGhlbHAgT0NhbWwgbGlicmFyeSBtYWludGFpbmVycyBhbmQg dXNlcnMgZGVhbCB3aXRoIGNoYW5nZXMgaW4NCiAgdGhlIHB1YmxpYyBBUEkgb2YgdGhlaXIgbGli cmFyaWVzIG9yIHRoZSBvbmVzIHRoZXkgdXNlLiBUaGlzIGluY2x1ZGVzDQogIGxpYnJhcmllcyBh bmQgQ0xJIHRvb2xzIHRvIGRldGVjdCBwb3RlbnRpYWxseSB1bndhbnRlZCBicmVha2luZw0KICBj aGFuZ2VzIGJlZm9yZSByZWxlYXNpbmcgYSBuZXcgdmVyc2lvbiBvciB0byBkZXRlcm1pbmUgdGhl IHZlcnNpb24gb2YNCiAgYSBsaWJyYXJ5IHRoYXQgaW50cm9kdWNlZCBhIG5ldyBmdW5jdGlvbi4N Cg0KICBUaGUgZ29hbCBvZiB0aGUgaW50ZXJuc2hpcCBpcyB0byBkZXZlbG9wIGEgbGlicmFyeSBh bmQgdG9vbCBwYWlyIHRoYXQNCiAgZGV0ZWN0cyBjaGFuZ2VzIGluIHRoZSBwdWJsaWMgQVBJIG9m IGEgbGlicmFyeSwgYnVpbGQgYW4gaW50ZXJuYWwNCiAgcmVwcmVzZW50YXRpb24gb2YgdGhlbSBh bmQgZGlzcGxheXMgdGhlbSBpbiBhIGh1bWFuIHJlYWRhYmxlLCBnaXQNCiAgZGlmZi1saWtlIGZv cm1hdC4NCg0KICBUaGUgYXBwbGljYXRpb24gcGVyaW9kIHdlbnQgcmVhbGx5IHdlbGwgYW5kIHdl IGhhdmUgc2V2ZXJhbCBzdHJvbmcNCiAgY2FuZGlkYXRlcy4gV2UndmUgYmVlbiBleHRyZW1lbHkg aGFwcHkgdG8gd29yayB3aXRoIGFsbCBvZiB0aGVtIGFuZA0KICBhcmUgbG9va2luZyBmb3J3YXJk IHRvIHRoZSBpbnRlcm5zaGlwLg0KDQoNCltvY2FtbC1hcGktd2F0Y2hdIDxodHRwczovL2dpdGh1 Yi5jb20vTmF0aGFuUmViL29jYW1sLWFwaS13YXRjaD4NCg0KDQpvcGFtIDIuMi4wfmJldGEyDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItMi0wLWJldGEyLzE0 NDYxLzE+DQoNCg0KS2F0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdlJ3JlIHZlcnkgZXhjaXRlZCB0byBhbm5vdW5jZSB0aGlzIHNl Y29uZCBiZXRhIGZvciBvcGFtIDIuMi4wLg0KDQoNCldoYXTigJlzIG5ldyBpbiB0aGlzIGJldGE/ DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICDigKIgKldpbmRvd3Mgc3VwcG9ydCo6IHRoaXMgYmV0YSBp bnRyb2R1Y2VzIGEgYnVuY2ggb2YgY2hhbmdlcyBuZWNlc3NhcnkNCiAgICAgdG8gYmUgYWJsZSB0 byBtYWtlIHRoZSBkZWZhdWx0IG9wYW0tcmVwb3NpdG9yeSBzdXBwb3J0IFdpbmRvd3Mgb3V0DQog ICAgIG9mIHRoZSBib3guIFdlIHdpbGwgd3JpdGUgYSBkZWRpY2F0ZWQgYmxvZyBwb3N0IHZlcnkg c29vbiBvbiB0aGlzLA0KICAgICBvbmNlIHdlIGhhdmUgZmluYWxpc2VkIHRoZSBQUi9icmFuY2gg dGhhdCB5b3UgY2FuIHRlc3QuDQogIOKAoiAqb3BhbS1yZXBvc2l0b3J5IHNjYWxhYmlsaXR5Kjog VGhlIGN1cnJlbnQgZHJhZnQgcmVzb2x1dGlvbg0KICAgICByZXN1bHRpbmcgZnJvbSB0aGUgZGlz Y3Vzc2lvbiBpbiBbb2NhbWwvb3BhbS1yZXBvc2l0b3J5IzIzNzg5XQ0KICAgICBpbmNsdWRlcyB0 aGUgcmVtb3ZhbCBvZiBwYWNrYWdlcyBmcm9tIG9wYW0tcmVwb3NpdG9yeS4gQ3VycmVudGx5DQog ICAgIG9wYW0gY2FuIG1pc2JlaGF2ZSAoaW4gcGFydGljdWxhciBvbiBtYWNPUykgd2hlbiBleHBv c2VkIHRvIGZpbGUNCiAgICAgZGVsZXRpb25zIGluIHJlcG9zaXRvcmllcyBkdWUgdG8gdGhlIHVz ZSBvZiB0aGUgc3lzdGVtIGBwYXRjaGANCiAgICAgY29tbWFuZC4gVG8gZml4IHRoaXMsIGFzIGEg c3RvcCBnYXAsIGFmdGVyIG1hbnkgdHJpYWxzIGFuZCBlcnJvcnMsDQogICAgIG9wYW0gbm93IHdh cm5zIHdoZW4gR05VIHBhdGNoIGlzIG5vdCBkZXRlY3RlZCBvbiB5b3VyIHN5c3RlbS4gVGhlc2UN CiAgICAgY2hhbmdlcyB3aWxsIG1ha2UgdGhlaXIgd2F5IHRvIHRoZSB1cGNvbWluZyBvcGFtIDIu MS42LCBpbiBhIGZldw0KICAgICB3ZWVrcy4NCiAg4oCiIE1hbnkgKnJlZ3Jlc3Npb24gZml4ZXMq LCAqcGVyZm9ybWFuY2UqIGFuZCBnZW5lcmFsICppbXByb3ZlbWVudHMqDQoNCiAgOm9wZW5fYm9v azogWW91IGNhbiByZWFkIG91ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91 dA0KICB0aGVzZSBjaGFuZ2VzIGFuZCBtb3JlLCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlv dSBjYW4gdGFrZSBhIGxvb2sNCiAgYXQgdGhlIFtyZWxlYXNlIG5vdGVdIG9yIHRoZSBbY2hhbmdl bG9nXS4NCg0KDQpbb2NhbWwvb3BhbS1yZXBvc2l0b3J5IzIzNzg5XQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvaXNzdWVzLzIzNzg5Pg0KDQpbYmxvZyBwb3N0XSA8 aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAtYmV0YTIvPg0KDQpbcmVsZWFz ZSBub3RlXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vcmVsZWFzZXMvdGFnLzIuMi4w LWJldGEyPg0KDQpbY2hhbmdlbG9nXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vYmxv Yi8yLjIuMC1iZXRhMi9DSEFOR0VTPg0KDQoNCkhvdyB0byB1cGdyYWRlDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRm9yIFdpbmRvd3Mgd2Ugd2ls bCB3cml0ZSBhIGRlZGljYXRlZCBibG9nIHBvc3QgdG8gc2hvdyBob3cgdG8NCiAgICBpbnN0YWxs IGFuZCB1c2Ugb3BhbSBvbiBXaW5kb3dzIHZlcnkgc29vbi4gU3RheSB0dW5lZCENCiAg4oCiIE9u IFVuaXgtbGlrZSBzeXN0ZW1zLCB0byB1cGdyYWRlLCBzaW1wbHkgcnVuOg0KICAgIOKUjOKUgOKU gOKUgOKUgA0KICAgIOKUgiBiYXNoIC1jICJzaCA8KGN1cmwgLWZzU0wgaHR0cHM6Ly9yYXcuZ2l0 aHVidXNlcmNvbnRlbnQuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL2luc3RhbGwuc2gpIC0t dmVyc2lvbiAyLjIuMH5iZXRhMiINCiAgICDilJTilIDilIDilIDilIANCg0KICBXZSdyZSBvbiB0 aGUgaG9tZSBzdHJldGNoIGZvciB0aGUgZmluYWwgcmVsZWFzZSBvZiBvcGFtIDIuMi4wLCBzbyBm ZWVsDQogIGZyZWUgdG8gcmVwb3J0IGFueSBpc3N1ZSB5b3UgZW5jb3VudGVyIG9uIG91ciBbYnVn LXRyYWNrZXJdLg0KDQogIEhhcHB5IGhhY2tpbmcsICo8PiA8PiBUaGUgb3BhbSB0ZWFtIDw+IDw+ KiA6Y2FtZWw6DQoNCg0KW2J1Zy10cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0vaXNzdWVzPg0KDQoNCkdvc3BlbCAwLjMuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t Z29zcGVsLTAtMy0wLzE0NDgwLzE+DQoNCg0KTmljb2xhcyBPc2Jvcm5lIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkhIFdlIGFyZSB2ZXJ5IGhhcHB5IHRvIGFubm91bmNlIHRo ZSByZWxlYXNlIG9mIGBnb3NwZWwuMC4zLjAnDQoNCiAgR29zcGVsIGlzIGEgdG9vbC1hZ25vc3Rp YyBiZWhhdmlvdXJhbCBzcGVjaWZpY2F0aW9uIGxhbmd1YWdlIGZvcg0KICBPQ2FtbC4gSXQgYWxs b3dzIHlvdSB0byB3cml0ZSBzdHJvbmdseSB0eXBlZCBjb250cmFjdC1iYXNlZA0KICBzcGVjaWZp Y2F0aW9ucyBmb3IgeW91ciBPQ2FtbCBsaWJyYXJpZXMgKGZvciBhIHJlYXNvbmFibGUgc3Vic2V0 IG9mDQogIE9DYW1sKS4gR29zcGVs4oCZcyBzeW50YXggaGFzIGJlZW4gZGVzaWduZWQgdG8gYmUg ZWFzeSB0byBsZWFybiBmb3IgYW4NCiAgT0NhbWwgcHJvZ3JhbW1lci4gWW91IGNhbiBhY2Nlc3Mg dGhlIGRvY3VtZW50YXRpb24gW2hlcmVdDQoNCiAgQXBhcnQgZnJvbSBzb21lIGJ1ZyBmaXhlcywg dGhpcyByZWxlYXNlIGJyaW5ncyB0d28gbWFpbiBpbXByb3ZlbWVudHM6DQoNCiAg4oCiIE1ha2Ug dGhlIHR5cGUtY2hlY2tlciBzYXZlIHR5cGUgaW5mb3JtYXRpb24gaW4gYSBgLmdvc3BlbCcgZmls ZQ0KICDigKIgTWFrZSB0aGUgYHdpdGgnIGtleXdvcmQgbmVjZXNzYXJ5IHdoZW4gZGVjbGFyaW5n IHR5cGUgaW52YXJpYW50cw0KDQogIEJld2FyZSB0aGF0IGBvcnRhYy4wLjEuMCcgaXMgbm90IGNv bXBhdGlibGUgd2l0aCB0aGlzIHZlcnNpb24sIHBsZWFzZQ0KICB1c2UgT3J0YWMgZGV2ZWxvcG1l bnQgdmVyc2lvbiBmcm9tIHRoZSBnaXQgcmVwb3NpdG9yeSB1bnRpbCB0aGUgbmV4dA0KICBPcnRh YyByZWxlYXNlLg0KDQoNCltoZXJlXSA8aHR0cHM6Ly9vY2FtbC1nb3NwZWwuZ2l0aHViLmlvL2dv c3BlbC8+DQoNCg0KRnJlZCAwLjEuMCAtIEZlZGVyYWwgUmVzZXJ2ZSBFY29ub21pYyBEYXRhIEFQ SQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tZnJlZC0wLTEtMC1mZWRlcmFsLXJlc2VydmUtZWNvbm9taWMt ZGF0YS1hcGkvMTQ0ODkvMT4NCg0KDQpHZW9mZnJleSBCb3JvdWdoIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZm9sa3MgaG93ZHkhIEkganVzdCByZWxlYXNlIHRoZSBm aXJzdCB2ZXJzaW9uIG9mIEZyZWQsIGEgbGlicmFyeQ0KICBmb3IgdGhlIEZlZGVyYWwgUmVzZXJ2 ZSBFY29ub21pYyBEYXRhIEFQSSBiaW5kaW5nLiBJIG1hZGUgdGhpcyB0bw0KICBmYWNpbGl0YXRl IG9uZSBvZiBteSBwZXJzb25hbCBwcm9qZWN0IGJ1dCBJIGhvcGUgb3RoZXJzIHdvdWxkIGZpbmQN CiAgdGhpcyBsaWJyYXJ5IHVzZWZ1bCBpbiBzb21lIHdheS4NCg0KICBTb3VyY2UgY29kZTogPGh0 dHBzOi8vZ2l0aHViLmNvbS9nYm9yb3VnaC9mcmVkPg0KDQogIERvY3VtZW50YXRpb246IDxodHRw czovL2dib3JvdWdoLmdpdGh1Yi5pby9mcmVkL2ZyZWQvZnJlZC9pbmRleC5odG1sPg0KDQogIE9w YW0gcmVwbyBwdWJsaXNoIG9uIHRoZSB3YXkNCg0KDQpPQ0FOTkwgMC4zLjE6IGEgZnJvbS1zY3Jh dGNoIGRlZXAgbGVhcm5pbmcgKGkuZS4gZGVuc2UgdGVuc29yIG9wdGltaXphdGlvbikgZnJhbWV3 b3JrDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FubmwtMC0zLTEtYS1mcm9tLXNjcmF0Y2gtZGVl cC1sZWFybmluZy1pLWUtZGVuc2UtdGVuc29yLW9wdGltaXphdGlvbi1mcmFtZXdvcmsvMTQ0OTIv MT4NCg0KDQpMdWthc3ogU3RhZmluaWFrIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgSGkhIEknbSBoYXBweSB0byBhbm5vdW5jZSByZWxlYXNlIDAuMy4xIG9mIE9DQU5OTCwg YSB0ZW5zb3INCiAgb3B0aW1pemF0aW9uIGZyYW1ld29yayB3aXRoOg0KDQogIOKAoiBjb25jaXNl IG5vdGF0aW9uIHZpYSBQUFhzLA0KICDigKIgcG93ZXJmdWwgc2hhcGUgaW5mZXJlbmNlLA0KICDi gKIgYmFja3Byb3BhZ2F0aW9uIChmaXJzdC1vcmRlciBhdXRvbWF0aWMgZGlmZmVyZW50aWF0aW9u KSwNCiAg4oCiIGxvdy1sZXZlbCBiYWNrZW5kcyDigJMgY3VycmVudGx5IG9ubHkgb25lLCBDUFUg dmlhIGBnY2NqaXRgLCBidXQgQ3VkYQ0KICAgIGlzIG9uIHRoZSBob3Jpem9uLg0KDQogIE9DQU5O TCBpcyBzcG9uc29yZWQgYnkgW0FocmVmc10uIChbQWhyZWZzIHdlYnNpdGVdLikNCg0KICBbYWhy ZWZzL29jYW5ubDogT0NBTk5MOiBPQ2FtbCBDb21waWxlcyBBbGdvcml0aG1zIGZvciBOZXVyYWwg TmV0d29ya3MNCiAgTGVhcm5pbmcgKGdpdGh1Yi5jb20pXQ0KDQogIEkgYW0gbm90IHN1Ym1pdHRp bmcgaXQgdG8gT3BhbSB5ZXQgYXMgT0NBTk5MIGlzIGluc3VmZmljaWVudGx5DQogIGRvY3VtZW50 ZWQgYXQgdGhlIG1vbWVudC4gSSB3ZWxjb21lIHlvdXIgZmVlZGJhY2sgaWYgeW91IGRlY2lkZSB0 bw0KICB0YWtlIGEgbG9vayENCg0KDQpbQWhyZWZzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvc3VjY2Vz cy1zdG9yaWVzL3BldGEtYnl0ZS1zY2FsZS13ZWItY3Jhd2xlcj4NCg0KW0FocmVmcyB3ZWJzaXRl XSA8aHR0cHM6Ly9haHJlZnMuY29tLz4NCg0KW2FocmVmcy9vY2Fubmw6IE9DQU5OTDogT0NhbWwg Q29tcGlsZXMgQWxnb3JpdGhtcyBmb3IgTmV1cmFsIE5ldHdvcmtzDQpMZWFybmluZyAoZ2l0aHVi LmNvbSldIDxodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL29jYW5ubD4NCg0KDQpPdGhlciBPQ2Ft bCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxp bmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQog IGJsb2ddLg0KDQogIOKAoiBbTXVsdGljb3JlIFRlc3RpbmcgVG9vbHM6IERTQ2hlY2sgUHQgMl0N Cg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltN dWx0aWNvcmUgVGVzdGluZyBUb29sczogRFNDaGVjayBQdCAyXQ0KPGh0dHBzOi8vdGFyaWRlcy5j b20vYmxvZy8yMDI0LTA0LTEwLW11bHRpY29yZS10ZXN0aW5nLXRvb2xzLWRzY2hlY2stcHQtMj4N Cg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRv IG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQog IGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JT UyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNl aXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtj YW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8 bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8 aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFy Y2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2Nh bWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoN CltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 09 to 16, 2024.

    Melange 2024 Progress Update

    Antonio Nuno Monteiro announced

    we recently shared what we've been up to around Melange & ecosystem in = a blog post which you can find here:

    https://melange.re/blog/posts/whats-2024-brought-to-melange-so-far

    I hope you find the above informative. Looking forward to your thoughts.

    Ppxlib maintenance summary

    Nathan Rebours announced

    I recently started working on ppxlib again thanks to the OCaml Software Fou= ndation and wanted to report back to the community all the work their funding made possible so far along with the plan for the next st= eps.

    Know that OCSF is only funding me part time on this and that I'm open to mo= re OCaml freelance work!

    Summary of the work

    • Improved error reporting

      Ppxlib has an -embed-error flag that is most useful to merlin = as it allows it to always get an AST out of the driver and allows it to keep operating normally when a ppx raises a located exception (as in rai= sed with Location.raise_errorf) as it would always get an AST out of the driver run.

      The problem with this mode was that it didn't try to recover from such exce= ptions and would stop applying transformations. The error was properly reported by merlin and it still had a valid AST to work with b= ut none of the potential errors from subsequent rewriting or code gen would be reported. This lead to a tedious workflow where the user would fix one error, save th= e file, see a new error reported by merlin, fix it, save, and so on.

      There was a series of PRs by @Burnleydev1 long pending review that were fix= ing this by collecting all such exceptions while keeping on the rewriting phases using the last valid AST or node.

      I reviewed and fixed those PRs (#447, #453 and #457) and worked on= a couple fixes and improvements to error reporting related to this work.

    • Driver mode for dune

      Dune has ongoing internal work to be able to use ppx in development. Since = it cannot depend on ppxlib or any ppx at build time, their solution relies on using ppxlib and ppx normally in development but using a= lready preprocessed copies of source files that require rewriting for bootstrapping, making their opam build ppx-free.

      They require a special driver mode that writes to the output file only if a= ny actual rewriting happened.

      I worked on a first prototype of this using a pre-existing hook called for = each generated AST node.

    • 5.2 compat on trunk-support

      The main task since I started working on ppxlib was the 5.2 support. As OCa= ml 5.2 is coming out soon and ppxlib is a central piece in the OCaml ecosystem, it's important that ppxlib has a compatible version av= ailable for testing out the new compiler. Without it, a lot of opam packages can't be built with the alpha and beta releases of the= compiler because of their ppx dependencies.

      ppxlib has a trunk-support branch that is meant to be kept up = to date for such occasions. While it already contained the AST migration from/to the 5.2 version, it was out of sync with the main branch = of ppxlib.

      I rebased the 5.2 relevant parts of the branch on top of our main branch to= be able to cut a first preview version with 5.2 compat and fixed a couple of bugs and quirks in the code base that prevented the t= est suite from running properly with the 5.2 support.

      After the first release of the preview version we discovered a series of bu= gs with the help of @kit-ty-kate, @octachron and @anmonteiro. The most important among those being:

      • A bug in the round trip migration of the new Pexp_function= node from 5.2 that was causing compilation errors when the function's

      return type was coerced.

      • The new syntax for ocaml.ppx.context was causing driver cr= ashes when reading some binary ASTs. I wrote a migration for those

      attributes that fixed the issue.

      • The driver was silently relying on the compiler to re-open files to dis= play source quotation when reporting located exceptions.

      Since this was removed from the compiler in 5.2, I fixed the driver to prop= erly set Location.input_lexbuf and re-enable source-quotation.

    • ppx_deriving maintenance

      ppx_deriving is quite a central piece of the ppx ecosystem, es= pecially for the set of standard derivers it provides (pretty-printers, equality and comparison functions, etc.).

      The project was lacking maintainers with enough time to review an important= PR migrating those standard derivers to ppxlib. This is important because it makes those quite broadly used derivers better integra= ted with ppxlib features and improves both performances and error reporting for their users as they are now applied as part of the = main ppxlib driver AST traversal.

      I reviewed the PR and cleaned up the repo a bit to attempt a release, somet= hing that has not happened for 3 years for this package.

      The initial release failed for two reasons:

      • ppx_deriving.show's deriver accepts an argument that speci= fies how the implementation should behave without impacting the

      function signature. In the ppxlib port we did not register this argument fo= r the signature deriver since it had no impact on the generated code there. It turns out at least one opam package used the argum= ent in an .mli file so we added it for compatibility as ppx_deriving duplicated the set of arguments for implementatio= n and interfaces

      • ppx_deriving used to automatically register extensions for= each derivers that can be used to inline the derived function for a

      given type in an expression. We preserved this in the ppxlib port but it ca= used a conflict with ppx_let. This conflict should be resolved on ppx_let's side as they were declaring an extension= named map without any possible prefix such as ppx_let.m= ap which is the recommended way. Using a prefix allows the user to disambiguate if s= everal ppx declare an extension with the same base name.

      We had to cancel the release to fix those issues before attempting again.

    • General maintenance

      There was also some regular maintenance such as improving our homemade expe= ct test runner to be able to better run our tests across all supported compiler versions, reviewing all pending PRs, upgrading ocaml= format and cutting a release of ppxlib with the latest features.

    Next steps

    Along with the general maintenance of the project there are two things that= would greatly reduce the maintenance burden on ppxlib and would improve the state of the ecosystem for the community that we would li= ke to work on.

    • Upstreaming Astlib to the compiler

      This has been in the works for quite a long time but the previous maintaine= rs haven't had the chance to see it through.

      The plan is to upstream a small part of ppxlib into the compiler to ease th= e release process for new compilers.

      This small library should contain the minimal subset of stable API ppxlib n= eeds to properly function and, most importantly, the AST migrations from the current version of the compiler to the previous version= and back. The idea is that trunk would then provide the migration to the latest released version at all time and ppxlib would be ab= le to use those if it does not natively supports them yet. That would make testing the compiler on opam work without requiring a speci= al release of ppxlib and would also ease the migration writing process as they would be written at the time of the AST change by t= he person who modified it and therefore that is most qualified to do so.

      Indeed the migration writing process is time consuming at the moment becaus= e it is done by ppxlib maintainers when the next ocaml releasing is closing in and requires us to dive into changes we are not nec= essarily familiar with.

      During the compiler release process, ppxlib would incorporate those new mig= ration to the entire set of migrations it supports, allowing it to be compatible with the "new" trunk until the next release.

      The core of this work is to formally write down this process and start the = discussion with the compiler team. Once we agree on a plan, I don't expect there is a lot of code to write for this as all of it = already lives inside ppxlib.

    • Refining the release process for ppxlib with a= n AST bump

      Part of the ppxlib contract is that all ppx-es written with ppxlib must use= the same version of the AST chosen by ppxlib. This allows for better performances and semantics of rewriting. This version is usually= the latest supported version as it is required for ppx-es to support all the new language features. It sometimes happen that the inte= rnal AST version lags behind if no new features would be "unlocked" by upgrading the AST, as it has been the case since 4.1= 4.

      Every now and then ppxlib has to bump its internal AST though, potentially = breaking its API and therefore a few of its reverse dependencies.

      In the past few years, we decided to build the entire set of reverse depend= encies every time were releasing such a change and to send PRs to fix revdeps to help keep the ppx ecosystem sane and avoid putting to= much pressure on individual ppx-es maintainers.

      We know that we will have to do this for the 5.3 release as it will be addi= ng effects syntax.

      The current workflow relies on building a "duniverse" i.e. some sort of lar= ge dune-project containing ppxlib and a clone of all its reverse dependencies. This proves quite a challenge as it is often hard to = get everything to build together. An ideal solution would be to rely more on opam-ci for this bu= t in its current state it is not very reliable.

      I'd like to spend some time on improving the process of building revdeps of= ppxlib and submitting PRs and experiment to prepare for the next bump which will include the 5.2 changes to Pexp_function that we expect to potentially break quite a lot of reverse dependencies.

    opam 2.2.0~beta2

    Kate announced

    We're very excited to announce this second beta for opam 2.2.0.

    What=E2=80=99s new in this beta?

    • Windows support: this beta introduces a bunch of changes necessa= ry to be able to make the default opam-repository support Windows out of th= e box. We will write a dedicated blog post very soon on this, once we have = finalised the PR/branch that you can test.
    • opam-repository scalability: The current draft resolution result= ing from the discussion in ocaml/opam-repository#23789 includes the removal of p= ackages from opam-repository. Currently opam can misbehave (in particular o= n macOS) when exposed to file deletions in repositories due to the use of t= he system `patch` command. To fix this, as a stop gap, after many trials an= d errors, opam now warns when GNU patch is not detected on your system. The= se changes will make their way to the upcoming opam 2.1.6, in a few weeks.<= /li>
    • Many regression fixes, performance and general improve= ments

    :open_book: You can read our blog post for more information about these changes and more, and for even more details you can take a look at the release note or the chan= gelog.

    How to upgrade

    • For Windows we will write a dedicated blog post to show how to install = and use opam on Windows very soon. Stay tuned!
    • On Unix-like systems, to upgrade, simply run:

      bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
      ster/shell/install.sh) --version 2.2.0~beta2"
      

    We're on the home stretch for the final release of opam 2.2.0, so feel free= to report any issue you encounter on our bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    Gospel 0.3.0

    Nicolas Osborne announced

    Hi! We are very happy to announce the release of gospel.0.3.0

    Gospel is a tool-agnostic behavioural specification language for OCaml. It = allows you to write strongly typed contract-based specifications for your OCaml libraries (for a reasonable subset of OCaml).= Gospel=E2=80=99s syntax has been designed to be easy to learn for an OCaml programmer. You can access the documentation here

    Apart from some bug fixes, this release brings two main improvements:

    • Make the type-checker save type information in a .gospel f= ile
    • Make the with keyword necessary when declaring type invari= ants

    Beware that ortac.0.1.0 is not compatible with this version, p= lease use Ortac development version from the git repository until the next Ortac release.

    Fred 0.1.0 - Federal Reserve Economic Data API

    Geoffrey Borough announced

    Hi folks howdy! I just release the first version of Fred, a library for the= Federal Reserve Economic Data API binding. I made this to facilitate one of my personal project but I hope others would find this lib= rary useful in some way.

    Source code: https://github.co= m/gborough/fred

    Documentation: https://gborough.github.io/fred/fred/fred/index.html

    Opam repo publish on the way

    OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor = optimization) framework

    Lukasz Stafiniak announced

    Hi! I'm happy to announce release 0.3.1 of OCANNL, a tensor optimization fr= amework with:

    • concise notation via PPXs,
    • powerful shape inference,
    • backpropagation (first-order automatic differentiation),
    • low-level backends – currently only one, CPU via `gccjit`, but C= uda is on the horizon.

    OCANNL is sponsored by Ahrefs. (Ahrefs website.)

    ahrefs/ocannl: OCANNL: OCaml C= ompiles Algorithms for Neural Networks Learning (github.com)

    I am not submitting it to Opam yet as OCANNL is insufficiently documented a= t the moment. I welcome your feedback if you decide to take a look!

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=s+KTz5gi; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=TWiSCdw8; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id EA05BB80123 for ; Tue, 23 Apr 2024 13:17:29 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=IcU469DZb01Ww7OkAc+nL1Pahm68fa+NZ6ZVqljQfU0=; b=s+KTz5giz+3eCN5889rqUJCbP61LfDKlEBcBp6rElBE1bJxtYrmb0MDv mGbI/P4V6aYeVGvOLUMet1ZpFKXrOVv0oHPZRWN0N7yVj7B6Q4LqftN3p DfZqkF6YVyb5nEP7ytyYirU6iXaZG4AhmoiAACf2xnPGQ1ZxQ8ycFjzKt g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,222,1708383600"; d="scan'208,217";a="162928978" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Apr 2024 14:17:27 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8112BE0D5E; Tue, 23 Apr 2024 14:17:26 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 99900E0141 for ; Tue, 23 Apr 2024 14:17:20 +0200 (CEST) IronPort-SDR: 6627a6ce_E8ZRt2wksfhPLyd5EHDbSUmP4L1sfLn5J+d2j2pLwFvopmz 6f4M4gL0I7HAsN7bWQkWMiLmiFTwBaK+dEH1Y1g== X-IPAS-Result: =?us-ascii?q?A0FuEAD3pSdmlyIeaIFQChZ/gwRbKBkBYlczBwhIBF0Ng?= =?us-ascii?q?yw8g0+NNWSBFQGQL4FThm6BMYJpgREDGBYjFAEDAQ0uAQ4EAQIEAQEDAQIBg?= =?us-ascii?q?guCdAJPCYdKAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGA?= =?us-ascii?q?QIQAQEBAQEBAQE3BRA1hTsBBS8NgkotASNRGmUJBgEBAQEBAQEBAQIBAQEiA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIIB?= =?us-ascii?q?AEHKQdHAgMLDgEIBAYTAQEjCAEGBhgjAxQBBgMCEQEXHhcBEhqCDlgBgmQDB?= =?us-ascii?q?QwGnBSbOnp/M4EBggwBAQaBCD4CAQIJAgUBDgkm2gSBYQmBSIgLCRoBJEhpA?= =?us-ascii?q?oQlCYQ3Jw+BVUSBFTWCPQdvgVABbgUdAQEBAQEXQkYRBAEGAQEGAwFDCYMlg?= =?us-ascii?q?miCOIMpfiaBbAGFWU4IFWqCJkGBGzoCL18SgQovGW+COwQFBhGBNoY1gUtLM?= =?us-ascii?q?yETAVUTGBANJCMCKT4DCQoQAhYDHRQEMBEJCyYDKgY2AhIMBgYGWyAWCQQjA?= =?us-ascii?q?wgEA1ADIHARAwQaBAsHdYFEgW0EE0QDEIEyhzuCU4M9gh6EJkuFAoF7DmqBH?= =?us-ascii?q?R1AAwttPTUUGyieLwQ4AgEsgXYlDh8ZBgIwDCYYCQUFCAwIDgIgAg0gAQQEC?= =?us-ascii?q?QUVCgwKAgMTAR0DBgUGAwQXAgEFCB8LCwIeDwOSLgsJCQcKCwMqdY4mg0+Jb?= =?us-ascii?q?kiTRxxsNAeEFoFbBgyIfYEkhzOFeog+hAWBVoU3hDSBPYpIhzOFJYIRIphAI?= =?us-ascii?q?II0hx0KgRsJgWweS4hpjBwQLAQPExOFF4F7I4ErAR0MBzMaMEMNAgeCHQEzC?= =?us-ascii?q?Qo8HA+IXIRtYhdwgmgQWlSBGwuBPDk7gkEElmNBNQEBAQEHMAIHAQoBAQMJh?= =?us-ascii?q?WIBAYMKAQEmDIFIAQE?= IronPort-PHdr: A9a23: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 UEL6gBd+A8LlolxZ/3opo3SQ80VowM= IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:SPNJo6zLQMSO41FzlP4hKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: 9a23:U2d0PW/Uccx+WCk9T86Vv0JPB9sHSy368CjJLhPhUCV4R4HFFnbFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3AVcQjhA97cum9PG6DApmegyKQf+kx3JX2CFEurak?= =?us-ascii?q?h5JilFQB8CS2kih3iFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,222,1708383600"; d="scan'208,217";a="162928925" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDGW2Z6nhesSB3c+xhJwy3Ea51yqOoczqEi459?= =?us-ascii?q?mwEgHYmz6I4w2YqeG6f4xNGn90McrRhyIFVvubue/gKo15ySfjI5gGf+?= =?us-ascii?q?dXnxdxLCnSyTAdUGX/RTVstklFJ/Oy8ztUAdefhLZYs9TKXVkovgmrjo?= =?us-ascii?q?BI3fdZ6dy7jaaHqlv1szJaaQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Apr 2024 14:17:18 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 976A5561234; Tue, 23 Apr 2024 14:17:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1713874637; bh=epcQzwOSffBygac57Wi37p4cC6TnuSgVUbva4mOxyA4=; h=From:To:Subject:Date:Message-ID; b=TWiSCdw8gLjHr2vSnLUrW0ZKQJOaWY8ydZGQyVS19rWDVX6oj250ShxheqyBo8LAW fHqqO1d/+s3XFeWHTNeeCEjCr+ltNLOVD7yuQY5s9ThjwtFNjyiOnQnXU95T72vySm HM6+OHPlrI3Q2VJUo4ulQQle/v0vu9XeUT/wqoIk= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 23 Apr 2024 14:17:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 23 14:17:18 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.459420, queueID=D3FB8561235 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19117 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 16 to 23, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 A second beta for OCaml 5.2.0 An implementation of purely functional double-ended queues Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature Picos =E2=80=94 Interoperable effects based concurrency Ppxlib dev meetings Ortac 0.2.0 OUPS meetup april 2024 Mirage 4.5.0 released patricia-tree 0.9.0 - library for patricia tree based maps and sets OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor optimization)= framework Other OCaml News Old CWN A second beta for OCaml 5.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Last week, we merged in the 5.2 branch of OCaml an update to the compiler-libs "shape" API for querying definition information from the compiler. Unfortunately, this small change of API breaks compatibility with at least odoc. Generally, we try to avoid this kind of changes during the beta releases of the compiler. However, after discussions we concluded that it will be easier on the long term to fix the API right now in order to avoid multiplying the number of supported versions of the shape API in the various OCaml developer tools . We have thus released a second beta version of OCaml 5.2.0 to give the time to developer tools to update their 5.2.0 version ahead of the release (see below for the installation instructions). Beyond this changes of API, the new beta contains three minor bug fixes and three documentation updates, which is a good sign in term of stability. As usual, you can follow the last remaining compatibility slags on the [opam readiness for 5.2.0 meta-issue]. If you find any bugs, please report them on [OCaml's issue tracker]. Currently, the release is planned for the beginning of May. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.2.0 is available [on GitHub]. [opam readiness for 5.2.0 meta-issue] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.2.0~beta2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] Fine-Tuned Compiler Configuration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.2.0~beta2+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.2.0~beta2+flambda+nffa ocaml-variants.5.2.= 0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes since the first beta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Compiler-libs API Changes =E2=80=A2 [#13001]: do not read_back entire shapes to get aliases' uids w= hen building the usages index (Ulysse G=C3=A9rard, review by Gabriel Scherer and Nathana=C3=ABlle Courant) [#13001] =E2=97=8A Bug Fixes =E2=80=A2 [#13058]: Add TSan instrumentation to caml_call_gc(), since it = may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer and Miod Vallat) =E2=80=A2 [#13079]: Save and restore frame pointer across Iextcall on ARM= 64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat) =E2=80=A2 [#13094]: Fix undefined behavior of left-shifting a negative nu= mber. (Antonin D=C3=A9cimo, review by Miod Vallat and Nicol=C3=A1s Ojeda B=C3= =A4r) [#13058] [#13079] [#13094] =E2=97=8A Documentation Updates =E2=80=A2 [#13078]: update Format tutorial on structural boxes to mention alignment questions. (Edwin T=C3=B6r=C3=B6k, review by Florian Angelet= ti) =E2=80=A2 [#13092]: document the existence of the `[@@poll error]' built-= in attribute (Florian Angeletti, review by Gabriel Scherer) =E2=80=A2 [#13066], update OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicol=C3=A1s Ojeda B=C3=A4r, = Tim McGilchrist, and Miod Vallat) [#13078] [#13092] [#13066] An implementation of purely functional double-ended queues =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Humza Shahid announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have some code that might be useful to others here. I had the idea of a new purely functional implementation for double ended queues, and I implemented it ()[here]. The idea is pretty simple, and it proves to be quite fast in benchmarks. The idea is to have a record containing: =E2=80=A2 A head array representing the start of the queue, with a limit = on the number of elements it can have. =E2=80=A2 A tail array representing the end of the queue, also with a lim= it on the number of elements it can have. =E2=80=A2 A balanced binary tree based on the rope data structure. (The internal nodes pointing to other nodes contain integer metadata indicating the number of elements on the left and right subtrees, and leaf nodes contain an array of elements.) When trying to insert into either the head or tail array when the array is at max capacity, the array is either appended or prepended to the tree and the array/element we wanted to insert is now either the head or tail. I was looking for some way to test the performance and adapted (this code)[] to use it, and it's pretty fast - only about 4x slower than the standard library's mutable queue. (Although this was really implemented in mind aiming for fast access time rather than fast insertion/removal time.) It has some non-standard functions for double ended queues too, like O(log n) insert/removal/indexing at any arbitrary location (with a constant that makes this faster than on a typical binary tree - a typical binary tree contains on element per node, increasing height, but this contains arrays of elements at the leaves so more data is packed and the height is shorter). Some other people might find it useful, so here it is for others to copy-and-paste. I don't know if it's worth putting on opam (I don't have a use for this myself in any of my projects but curiosity led me to implement it.) Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Cuihtlauac Alvarado announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 We've just updated the cookbook: . We'd love to have your feedback on it. The corresponding PR is still the same: The visual design is not yet final, but it works. It is organized in recipes, tasks and categories. A task is something that needs to be done inside a project. A recipe is a code sample and explanation of how to perform a task using a combination of packages. Some tasks can be performed using different combination of libraries, each is a different recipe. Categories are groups of tasks or categories You'll see most tasks don't have any recipes. We hope to collect the best recipes. Categories are also open for discussion. Picos =E2=80=94 Interoperable effects based concurrency =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: polytypic announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 [Picos] is a framework for building interoperable elements such as =E2=80=A2 schedulers that multiplex large numbers of user level fibers to= run on a small number of system level threads, =E2=80=A2 mechanisms for managing fibers and for structuring concurrency, =E2=80=A2 communication and synchronization primitives, such as mutexes a= nd condition variables, message queues, STMs, and more, and =E2=80=A2 integrations with low level asynchronous IO systems, of effects based cooperative concurrent programming models. [Picos] polytypic then announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce that version 0.2.0 of Picos is now available on opam. A small core [picos] framework allows concurrent abstractions [implemented in Picos] to communicate with [Picos compatible] schedulers. In addition to the core framework, the `picos' package comes with a couple of sample schedulers and some scheduler agnostic libraries as well as bunch of auxiliary libraries. Sample schedulers: =E2=80=A2 [picos.fifos] =E2=80=94 Basic single-threaded effects based Pic= os compatible scheduler for OCaml 5. =E2=80=A2 [picos.threaded] =E2=80=94 Basic Thread based Picos compatible = scheduler for OCaml 4. Scheduler agnostic libraries: =E2=80=A2 [picos.sync] =E2=80=94 Basic communication and synchronization = primitives for Picos. =E2=80=A2 [picos.stdio] =E2=80=94 Basic IO facilities based on OCaml stan= dard libraries for Picos. =E2=80=A2 [picos.select] =E2=80=94 Basic `Unix.select' based IO event loo= p for Picos. Auxiliary libraries: =E2=80=A2 [picos.domain] =E2=80=94 Minimalistic domain API available both= on OCaml 5 and on OCaml 4. =E2=80=A2 [picos.exn_bt] =E2=80=94 Wrapper for exceptions with backtraces. =E2=80=A2 [picos.fd] =E2=80=94 Externally reference counted file descript= ors. =E2=80=A2 [picos.htbl] =E2=80=94 Lock-free hash table. =E2=80=A2 [picos.mpsc_queue] =E2=80=94 Multi-producer, single-consumer qu= eue. =E2=80=A2 [picos.rc] =E2=80=94 External reference counting tables for dis= posable resources. =E2=80=A2 [picos.thread] =E2=80=94 Minimalistic thread API available with= or without `threads.posix'. All of the above are entirely opt-in and you are free to mix-and-match with any other Picos compatible [future] schedulers and libraries implemented in Picos or develop your own. See the [reference manual] for further information. [picos] [implemented in Picos] [Picos compatible] [picos.fifos] [picos.threaded] [picos.sync] [picos.stdio] [picos.select] [picos.domain] [picos.exn_bt] [picos.fd] [picos.htbl] [picos.mpsc_queue] [picos.rc] [picos.thread] [future] [reference manual] Ppxlib dev meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You can find our last meeting's notes [here]. We had three guests yesterday: @shonfeder @lubegasimon and @moazzammoriani. You are always welcome to join whether you have a specific topic you want to bring up or you just want to tag along. We'll post the link here ahead of the meeting. [here] Ortac 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Nicolas Osborne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are very excited to announce this new Ortac release! Ortac is a set of tools that translate Gospel specifications into OCaml code and use these translations to generate programs that check at runtime that the OCaml implementation respects the Gospel specifications. You can find the project on [this repo] and install it via `opam'. This new release contains four packages: =E2=80=A2 `ortac-core' =E2=80=A2 `ortac-runtime' =E2=80=A2 `ortac-qcheck-stm' =E2=80=A2 `ortac-runtime-qcheck-stm' The main improvements that brings this release concern the `ortac-qcheck-stm' plugin (the other three packages are mainly released for compatibility reasons). `ortac-qcheck-stm' provides a plugin for Ortac. It generates QCheck-STM tests for a module specified with Gospel. QCheck-STM is a model-based testing framework and Ortac/QCheck-STM relies on the Gospel models you gave in the specifications to build the QCheck-STM tests. I'd like to highlight two of these improvements. The first one is that type invariants for what we call the system under test are now checked. Let's say you want to generate QCheck-STM tests for a fixed-size container. You can give the following specification to your type: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a t =E2=94=82 (*@ mutable model contents : 'a list =E2=94=82 model size : int =E2=94=82 with t invariant List.length t.contents <=3D t.size *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Now, the generated tests will check that the invariant is respected at initialisation of the system under test (the value of type `'a t') and that it is preserved by the functions being tested. The second improvement concerns the test failure message. In order to make the failure more informative, a message stating which part of the Gospel specifications has been violated and a small OCaml program that demonstrates the unexpected behaviour will be displayed. For example, with an artificial bug in the `Array.length' function, running the Ortac/QCheck-STM-generated test will print the following failure message: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 random seed: 172339461 =E2=94=82 generated error fail pass / total time test name =E2=94=82 [=E2=9C=97] 1 0 1 0 / 1000 0.0s Array STM tests= (generating) =E2=94=82=20 =E2=94=82 --- Failure ---------------------------------------------------= ----------------- =E2=94=82=20 =E2=94=82 Test Array STM tests failed (5 shrink steps): =E2=94=82=20 =E2=94=82 length sut =E2=94=82=20 =E2=94=82 +++ Messages ++++++++++++++++++++++++++++++++++++++++++++++++++= ++++++++++++++++++ =E2=94=82=20 =E2=94=82 Messages for test Array STM tests: =E2=94=82=20 =E2=94=82 Gospel specification violation in function length =E2=94=82=20 =E2=94=82 File "array.mli", line 7, characters 12-22: =E2=94=82 i =3D t.size =E2=94=82=20 =E2=94=82 when executing the following sequence of operations: =E2=94=82=20 =E2=94=82 open Array =E2=94=82 let protect f =3D try Ok (f ()) with e -> Error e =E2=94=82 let sut =3D make 16 'a' =E2=94=82 let r =3D length sut =E2=94=82 assert (r =3D 16) =E2=94=82 (* returned 42 *) =E2=94=82=20 =E2=94=82 =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D= =3D=3D=3D=3D=3D=3D=3D=3D=3D =E2=94=82 failure (1 tests failed, 0 tests errored, ran 1 tests) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Although it has already helped find and fix some bugs, this project is still fairly new. So, feel free to try it and report any [issue]. Happy testing! [this repo] [issue] OUPS meetup april 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: zapashcanon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The next OUPS meetup will take place on *Thursday, 25th of April* 2024. It will start at *7pm* at the *4 place Jussieu* in Paris. :warning: :trumpet: It will be in the in the *Esclangon building* (amphi Astier). :trumpet: :warning: Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. This month will feature the following talks : *Symbolic execution for all with [Owi] and Wasm =E2=80=93 L=C3=A9o Andr= =C3=A8s* WebAssembly (Wasm) is a new binary compilation target adopted by many high-level programming languages such as C/C++, Rust, Java, and Go. Building on this foundation, we present Owi, a toolkit to work with Wasm within the OCaml ecosystem. In particular, Owi features a reference interpreter for Wasm capable of performing both concrete and symbolic execution. In this presentation, we describe how we designed reusable components and a modular interpreter from a concrete one, enabling the sharing of code between the concrete and symbolic interpreters. Additionally, we demonstrate how it is possible to perform symbolic execution of other languages by compiling them to Wasm using the symbolic interpreter. We provide examples of symbolic execution applied to C and Rust code and describe our current work to extend this functionality to support OCaml and other garbage-collected languages by integrating WasmGC into Owi. *[Smt.ml] - A Multi Back-end Front-end for SMT Solvers in OCaml =E2=80=93 Filipe Marques* SMT solvers are crucial tools in fields such as Software Verification, Program Synthesis, and Test-Case Generation. However, using their APIs, especially in typed functional languages like OCaml, can be challenging due to their complexity and lack of user-friendly interfaces. To address this, we propose Smt.ml, an open-source library that serves as a single interface for multiple SMT solvers in OCaml. Currently supporting solvers such as Z3, Colibri2, and Bitwuzla, Smt.ml enables users to seamlessly work with different solvers using one unified syntax. The library incorporates built-in optimizations to handle both concrete and symbolic expressions efficiently. Smt.ml has been successfully integrated with Owi, an interpreter and toolkit for WebAssembly. This integration allowed Owi to perform static symbolic execution and test-case generation for WebAssembly programs. Notably, Owi was able to identify known vulnerabilities in a widely-used C data structure libraries. [register on meetup ] [OUPS=E2=80=99 website ] [Owi] [Smt.ml] Mirage 4.5.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Gazagnaire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 On behalf of the Mirage team, I'm happy to announce the release of MirageOS 4.5.0. This was merged in `opam-repository' last week, so it should be available just in time for the upcoming [14th MirageOS hack retreat]! This release introduces a significant change in the Mirage tool by splitting the definition of command-line arguments used at configure-time and runtime. Command-line arguments used in the configure script (also called 'configuration keys' and defined in the `Key' module) are essential during the setup of module dependencies for the unikernel, allowing for specialized production of a unikernel for a given target runtime environment. On the other hand, command-line arguments that the unikernel can use a runtime (defined in the `Runtime_arg' module) are helpful for customizing deployments without altering the dependencies of the unikernels. =E2=80=A2 API changes: =E2=80=A2 There is no more `~stage' parameter for `Key.Arg.info'. =E2=80=A2 `Key' now define command-line arguments for the configuration tool. =E2=80=A2 There is a new module `Runtime_arg' to define command-line arguments for the unikernel. =E2=80=A2 As there are no more keys type `'Both', users are now expecte= d to create two separated keys in that case (one for configure-time, one for runtime) or decide if the key is useful at runtime of configure-time. =E2=80=A2 Intended use of configuration keys (values of type `'a key'): =E2=80=A2 Used to set up module dependencies of the unikernel, such as = the target (hvt, xen, etc.) and whether to use DHCP or a fixed IP address. =E2=80=A2 Enable the production of specialized unikernels suitable for specific target runtime environments and dedicated network and storage stacks. =E2=80=A2 Similar keys will produce reproducible binaries to be uploade= d to artifact repositories like Docker Hub or . =E2=80=A2 Intended use of command-line runtime arguments (values of type = `a runtime_arg'): =E2=80=A2 Allow users to customize deployments by changing device configuration, like IP addresses, secrets, block device names, etc., post downloading of binaries. =E2=80=A2 These keys don=E2=80=99t alter the dependencies of the uniker= nels. =E2=80=A2 A runtime keys is just a reference to a normal Cmdliner term. =E2=80=A2 `key_gen.ml' is not generated anymore, so users cannot refer to `Key_gen.' directly. =E2=80=A2 Any runtime argument has to be declared (using `runtime_arg' = and registered on the device (using `~runtime_args'). The value of that argument will then be passed as an extra parameter of the `connect' function of that device. =E2=80=A2 Configuration keys are not available at runtime anymore. For instance, `Key_gen.target' has been removed. =E2=80=A2 Code migration: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in config.ml *) =E2=94=82 let key =3D =E2=94=82 let doc =3D Key.Arg.info ~doc:"A Key." ~stage:`Run [ "key"= ] in =E2=94=82 Key.(create "key" Arg.(opt_all ~stage:`Run string doc)) =E2=94=82 let main =3D main ~keys:[abstract hello] .. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in unikernel.ml *) =E2=94=82 let start _ =3D =E2=94=82 let key =3D Key_gen.hello () in =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 becomes: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in config.ml *) =E2=94=82 let hello =3D runtime_arg ~pos:__POS__ "Unikernel.hello" =E2=94=82 let main =3D main ~runtime_args:[hello] ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* in unikernel.ml *) =E2=94=82 open Cmdliner =E2=94=82=20 =E2=94=82 let hello =3D =E2=94=82 let doc =3D Arg.info ~doc:"How to say hello." [ "hello" ] in =E2=94=82 Arg.(value & opt string "Hello World!" doc) =E2=94=82=20 =E2=94=82 let start _ hello =3D =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The [mirage-skeleton] repository and a few tutorials on have been updated and now compile with [mdx] to check for future API breakage. Documentation PRs are very welcome if you find some missing updates. We also welcome more general feedback regarding this API change. I also would like to use this announcement as a reminder that we have restarted the mirage bi-weekly calls. Check the [MirageOS mailing list] or the [MirageOS Matrix channel] for more info. The next one is planned for the 29th of April. If you are using or planning to use MirageOS (or are just curious about the project), feel free to join, it's open to everyone! Happy hacking! [14th MirageOS hack retreat] [mirage-skeleton] [mdx] [MirageOS mailing list] [MirageOS Matrix channel] patricia-tree 0.9.0 - library for patricia tree based maps and sets =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Dorian Lesbre announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the release of a new `patricia-tree' library, version 0.9.0 on opam. This library that implements sets and maps as Patricia Trees, as described in Okasaki and Gill's 1998 paper [/Fast mergeable integer maps/]. It is a space-efficient prefix trie over the big-endian representation of the key's integer identifier. For full details, visit see [the documentation] or [the source on github]. [/Fast mergeable integer maps/] [the documentation] [the source on github] Features =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Similar to OCaml's `Map' and `Set', using the same function nam= es when possible and the same convention for order of arguments. This should allow switching to and from Patricia Tree with minimal effort. =E2=80=A2 The functor parameters (`KEY' module) requires an injective `to= _int : t -> int' function instead of a `compare' function. `to_int' should be fast, injective, and only return positive integers. This works well with [hash-consed] types. =E2=80=A2 The Patricia Tree representation is stable, contrary to maps, inserting nodes in any order will return the same shape. This allows different versions of a map to share more subtrees in memory, and the operations over two maps to benefit from this sharing. The functions in this library attempt to **maximally preserve sharing and benefit from sharing**, allowing very important improvements in complexity and running time when combining maps or sets is a frequent operation. =E2=80=A2 Since our Patricia Tree use big-endian order on keys, the maps = and sets are sorted in increasing order of keys. We only support positive integer keys. This also avoids a bug in Okasaki's paper discussed in [/QuickChecking Patricia Trees/] by Jan Mitgaard. =E2=80=A2 Supports generic maps and sets: a `'m map' that maps `'k key' to `('k, 'm) value'. This is especially useful when using [GADTs] for the type of keys. This is also sometimes called a dependent map. =E2=80=A2 Allows easy and fast operations across different types of maps = and set (e.g. an intersection between a map and a set), since all sets and maps, no matter their key type, are really positive integer sets or maps. =E2=80=A2 Multiple choices for internal representation (`NODE'), which al= lows for efficient storage (no need to store a value for sets), or using weak nodes only (values removed from the tree if no other pointer to it exists). This system can also be extended to store size information in nodes if needed. =E2=80=A2 Exposes a common interface (`view') to allow users to write the= ir own pattern matching on the tree structure without depending on the `NODE' being used. [hash-consed] [/QuickChecking Patricia Trees/] [GADTs] Comparison to other OCaml libraries =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=97=8A ptmap and ptset There are other implementations of Patricia Tree in OCaml, namely [ptmap] and [ptset]. These are smaller and closer to OCaml's built-in Map and Set, however: =E2=80=A2 Our library allows using any type `key' that comes with an inje= ctive `to_int' function, instead of requiring `key =3D int'. =E2=80=A2 We support generic (heterogeneous) types for keys/elements. =E2=80=A2 We support operations between sets and maps of different types. =E2=80=A2 We use a big-endian representation, allowing easy access to min= /max elements of maps and trees. =E2=80=A2 Our interface and implementation tries to maximize the sharing between different versions of the tree, and to benefit from this memory sharing. Theirs do not. =E2=80=A2 These libraries work with older version of OCaml (`>=3D 4.05' I believe), whereas ours requires OCaml `>=3D 4.14' =E2=80=A2 Our keys are limited to positive integers. [ptmap] [ptset] =E2=97=8A dmap Additionally, there is a dependent map library: [dmap]. It allows creating type safe dependent maps similar to our heterogeneous maps. However, its maps aren't Patricia trees. They are binary trees build using a (polymorphic) comparison function, similarly to the maps of the standard library. Another difference is that the type of values in the map is independent of the type of the keys, allowing keys to be associated with different values in different maps. i.e. we map `'a key' to any `('a, 'b) value' type, whereas dmap only maps `'a key' to `'a'. `dmap' also works with OCaml `>=3D 4.12', whereas we require OCaml `>=3D 4.14'. [dmap] OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor optimization)= framework =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Lukasz Stafiniak announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 OCANNL 0.3.2 is out now. Thanks! Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Creating the SyntaxDocumentation Command - Part 1: Merlin] =E2=80=A2 [Speeding up MirageVPN and use it in the wild] =E2=80=A2 [Frama-C Days 2024] [the ocaml.org blog] [Creating the SyntaxDocumentation Command - Part 1: Merlin] [Speeding up MirageVPN and use it in the wild] [Frama-C Days 2024] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 16 to 23, 2024.

    A second beta for OCaml 5.2.0

    octachron announced

    Last week, we merged in the 5.2 branch of OCaml an update to the compiler-l= ibs "shape" API for querying definition information from the compiler.

    Unfortunately, this small change of API breaks compatibility with at least = odoc. Generally, we try to avoid this kind of changes during the beta releases of the compiler. However, after discussions we con= cluded that it will be easier on the long term to fix the API right now in order to avoid multiplying the number of supported version= s of the shape API in the various OCaml developer tools .

    We have thus released a second beta version of OCaml 5.2.0 to give the time= to developer tools to update their 5.2.0 version ahead of the release (see below for the installation instructions).

    Beyond this changes of API, the new beta contains three minor bug fixes and= three documentation updates, which is a good sign in term of stability.

    As usual, you can follow the last remaining compatibility slags on the opam readines= s for 5.2.0 meta-issue.

    If you find any bugs, please report them on OCaml's issue tracker.

    Currently, the release is planned for the beginning of May.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.2.0 is available on GitHub.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1:

    opam update
    opam switch create 5.2.0~beta2
    

    The source code for the beta is also available at these addresses:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.2.0~beta2+options &=
    lt;option_list>
    

    where option_list is a space-separated list of ocaml-opt= ion-* packages. For instance, for a flambda and n= o-flat-float-array switch:

    opam switch create 5.2.0~beta2+flambda+nffa oc=
    aml-variants.5.2.0~beta2+options ocaml-option-flambda ocaml-option-no-flat-=
    float-array
    

    All available options can be listed with opam search ocaml-option.

    Changes since the first beta

    • Compiler-libs API Changes
      • #13001: do = not read_back entire shapes to get aliases' uids when building the usages index (Ulysse G=C3=A9rard, review by Gabriel Scherer and Nathana=C3=ABlle Courant= )
    • Bug Fixes
      • #13058: Add= TSan instrumentation to caml_call_gc(), since it may raise exceptions. (Fabrice Buoro, Olivier Nicole, Gabriel Scherer and Miod Vallat)
      • #13079: Sav= e and restore frame pointer across Iextcall on ARM64 (Tim McGilchrist, review by KC Sivaramakrishnan and Miod Vallat)
      • #13094: Fix= undefined behavior of left-shifting a negative number. (Antonin D=C3=A9cimo, review by Miod Vallat and Nicol=C3=A1s Ojeda B=C3=A4r= )
    • Documentation Updates
      • #13078: upd= ate Format tutorial on structural boxes to mention alignment questions. (Edwin T=C3=B6r=C3=B6k, review by Florian Angeletti)
      • #13092: doc= ument the existence of the [@@poll error] built-in attribute (Florian Angeletti, review by Gabriel Scherer)
      • #13066, upd= ate OCAMLRUNPARAM documentation for the stack size parameter l (Florian Angeletti, review by Nicol=C3=A1s Ojeda B=C3=A4r, Tim McGilchrist,= and Miod Vallat)

    An implementation of purely functional double-ended queues

    Humza Shahid announced

    I have some code that might be useful to others here. I had the idea of a n= ew purely functional implementation for double ended queues, and I implemented it (https://github.com/hummy123/bro-deque)[here].

    The idea is pretty simple, and it proves to be quite fast in benchmarks.=20

    The idea is to have a record containing:=20

    • A head array representing the start of the queue, with a limit on the n= umber of elements it can have.
    • A tail array representing the end of the queue, also with a limit on th= e number of elements it can have.
    • A balanced binary tree based on the rope data structure. (The internal = nodes pointing to other nodes contain integer metadata indicating the numbe= r of elements on the left and right subtrees, and leaf nodes contain an arr= ay of elements.)

    When trying to insert into either the head or tail array when the array is = at max capacity, the array is either appended or prepended to the tree and the array/element we wanted to insert is now either the hea= d or tail.

    I was looking for some way to test the performance and adapted (this code)[https://discuss.ocaml.org/t/ocaml-speed-recursive-fu= nction-optimization/13502/3] to use it, and it's pretty fast - only abo= ut 4x slower than the standard library's mutable queue. (Although this was rea= lly implemented in mind aiming for fast access time rather than fast insertion/removal time.)

    It has some non-standard functions for double ended queues too, like O(log = n) insert/removal/indexing at any arbitrary location (with a constant that makes this faster than on a typical binary tree - a typical= binary tree contains on element per node, increasing height, but this contains arrays of elements at the leaves so more data is = packed and the height is shorter).=20

    Some other people might find it useful, so here it is for others to copy-an= d-paste. I don't know if it's worth putting on opam (I don't have a use for this myself in any of my projects but curiosity led me= to implement it.)

    Feedback / Help Wanted: Upcoming OCaml.org Cookbook Feature

    Cuihtlauac Alvarado announced

    We've just updated the cookbook: https://staging.ocaml.org/cookbook. We'd love to have your feedbac= k on it. The corresponding PR is still the same: ht= tps://github.com/ocaml/ocaml.org/pull/1839

    The visual design is not yet final, but it works. It is organized in recipe= s, tasks and categories.

    A task is something that needs to be done inside a project. A recipe is a c= ode sample and explanation of how to perform a task using a combination of packages. Some tasks can be performed using differen= t combination of libraries, each is a different recipe. Categories are groups of tasks or categories

    You'll see most tasks don't have any recipes. We hope to collect the best r= ecipes. Categories are also open for discussion.

    Picos =E2=80=94 Interoperable effects based concurrency

    polytypic announced

    Picos is a framewo= rk for building interoperable elements such as

    • schedulers that multiplex large numbers of user level fibers to run on = a small number of system level threads,
    • mechanisms for managing fibers and for structuring concurrency,
    • communication and synchronization primitives, such as mutexes and condi= tion variables, message queues, STMs, and more, and
    • integrations with low level asynchronous IO systems,

    of effects based cooperative concurrent programming models.

    polytypic then announced

    I'm happy to announce that version 0.2.0 of Picos is now available on opam.

    A small core picos framework allows concurrent abstractions implemented in Picos to communicate with Picos compatible schedulers.

    In addition to the core framework, the picos package comes wit= h a couple of sample schedulers and some scheduler agnostic libraries as well as bunch of auxiliary libraries.

    Sample schedulers:

    • picos.fifos =E2=80=94 Basic single-threaded effects bas= ed Picos compatible scheduler for OCaml 5.
    • picos.threaded =E2=80=94 Basic Thread based Picos co= mpatible scheduler for OCaml 4.

    Scheduler agnostic libraries:

    • picos.sync =E2=80=94 Basic communication and synchroniza= tion primitives for Picos.
    • picos.stdio =E2=80=94 Basic IO facilities based on OCam= l standard libraries for Picos.
    • picos.select =E2=80=94 Basic Unix.select = based IO event loop for Picos.

    Auxiliary libraries:

    • picos.domain =E2=80=94 Minimalistic domain API availab= le both on OCaml 5 and on OCaml 4.
    • picos.exn_bt =E2=80=94 Wrapper for exceptions with bac= ktraces.
    • picos.fd =E2=80=94 Externally reference counted file descr= iptors.
    • picos.htbl =E2=80=94 Lock-free hash table.
    • picos.mpsc_queue =E2=80=94 Multi-producer, single-= consumer queue.
    • picos.rc =E2=80=94 External reference counting tables for = disposable resources.
    • picos.thread =E2=80=94 Minimalistic thread API availab= le with or without threads.posix.

    All of the above are entirely opt-in and you are free to mix-and-match with= any other Picos compatible future schedulers and libraries implemented in Picos or develop your own.

    See the reference manual for further information.

    Ppxlib dev meetings

    Nathan Rebours announced

    You can find our last meeting's notes here.

    We had three guests yesterday: @shonfeder @lubegasimon and @moazzammoriani.

    You are always welcome to join whether you have a specific topic you want t= o bring up or you just want to tag along. We'll post the link here ahead of the meeting.

    Ortac 0.2.0

    Nicolas Osborne announced

    We are very excited to announce this new Ortac release!

    Ortac is a set of tools that translate Gospel specifications into OCaml cod= e and use these translations to generate programs that check at runtime that the OCaml implementation respects the Gospel specific= ations.

    You can find the project on this repo and install it via opam.

    This new release contains four packages:

    • ortac-core
    • ortac-runtime
    • ortac-qcheck-stm
    • ortac-runtime-qcheck-stm

    The main improvements that brings this release concern the ortac-qche= ck-stm plugin (the other three packages are mainly released for compatibility reasons).

    ortac-qcheck-stm provides a plugin for Ortac. It generates QCh= eck-STM tests for a module specified with Gospel. QCheck-STM is a model-based testing framework and Ortac/QCheck-STM relies on the Gospel mod= els you gave in the specifications to build the QCheck-STM tests.

    I'd like to highlight two of these improvements.

    The first one is that type invariants for what we call the system under tes= t are now checked. Let's say you want to generate QCheck-STM tests for a fixed-size container. You can give the following spe= cification to your type:

    type 'a t
    (*@ mutable model contents : 'a list
        model size : int
        with t invariant Li=
    st.length t.contents <=3D t.size *)
    

    Now, the generated tests will check that the invariant is respected at init= ialisation of the system under test (the value of type 'a t) and that it is preserved by the functions being tested.

    The second improvement concerns the test failure message. In order to make = the failure more informative, a message stating which part of the Gospel specifications has been violated and a small OCaml program th= at demonstrates the unexpected behaviour will be displayed.

    For example, with an artificial bug in the Array.length functi= on, running the Ortac/QCheck-STM-generated test will print the following failure message:

    random seed: 172339461
    generated error fail pass / total     time test name
    [=E2=9C=97]    1    0    1    0 / 1000     0.0s Array STM tests (generating)
    
    --- Failure ---------------------------------------------------------------=
    -----
    
    Test Array STM tests failed (5 shrink steps):
    
       length sut
    
    +++ Messages ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++=
    ++++++
    
    Messages for test Array STM tests:
    
    Gospel specification violation in function length
    
      File "array.mli", line 7, characters 12-22:
        i =3D t.size
    
    when executing the following sequence of operations:
    
      open Array
      let protect f =3D try Ok (f ()) with e -> Error e
      let sut =3D make 16 'a'
      let r =3D length sut
      assert (r =3D 16)
      (* returned 42 *)
    
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
    =3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
    =3D=3D=3D=3D=3D
    failure (1 tests failed, 0 tests errored, ran 1 tests)
    

    Although it has already helped find and fix some bugs, this project is stil= l fairly new. So, feel free to try it and report any issue.

    Happy testing!

    OUPS meetup april 2024

    zapashcanon announced

    The next OUPS meetup will take place on Thursday, 25th of April 2024= . It will start at 7pm at the 4 place Jussieu in Paris.

    :warning: :trumpet: It will be in the in the Esclangon building (amp= hi Astier). :trumpet: :warning:

    Please, register on meetup as soon as possible to let us know how many pizza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    This month will feature the following talks :

    Symbolic execution for all with Owi and Wasm – L=C3=A9o Andr=C3=A8s

    WebAssembly (Wasm) is a new binary compilation target adopted by many high-= level programming languages such as C/C++, Rust, Java, and Go. Building on this foundation, we present Owi, a toolkit to work with Was= m within the OCaml ecosystem. In particular, Owi features a reference interpreter for Wasm capable of performing both concrete and sy= mbolic execution. In this presentation, we describe how we designed reusable components and a= modular interpreter from a concrete one, enabling the sharing of code between the concrete and symbolic interpreters. Additionall= y, we demonstrate how it is possible to perform symbolic execution of other languages by compiling them to Wasm using the symbolic i= nterpreter. We provide examples of symbolic execution applied to C and Rust code and describe our current work to extend this fun= ctionality to support OCaml and other garbage-collected languages by integrating WasmGC into Owi.

    Smt.ml - A Multi B= ack-end Front-end for SMT Solvers in OCaml – Filipe Marques

    SMT solvers are crucial tools in fields such as Software Verification, Prog= ram Synthesis, and Test-Case Generation. However, using their APIs, especially in typed functional languages like OCaml, can be cha= llenging due to their complexity and lack of user-friendly interfaces. To address this, we propose Smt.ml, an open-source library that= serves as a single interface for multiple SMT solvers in OCaml. Currently supporting solvers such as Z3, Colibri2, and Bitwuzla, Smt= .ml enables users to seamlessly work with different solvers using one unified syntax. The library incorporates built-in optimiz= ations to handle both concrete and symbolic expressions efficiently. Smt.ml has been successfully integrated with Owi, an interpret= er and toolkit for WebAssembly. This integration allowed Owi to perform static symbolic execution and test-case generation for WebAs= sembly programs. Notably, Owi was able to identify known vulnerabilities in a widely-used C data structure libraries.

    Mirage 4.5.0 released

    Thomas Gazagnaire announced

    On behalf of the Mirage team, I'm happy to announce the release of MirageOS= 4.5.0. This was merged in opam-repository last week, so it should be available just in time for the upcoming 14th MirageOS hack retreat!

    This release introduces a significant change in the Mirage tool by splittin= g the definition of command-line arguments used at configure-time and runtime. Command-line arguments used in the configure sc= ript (also called 'configuration keys' and defined in the Key module) are essential during the setup of module dependenc= ies for the unikernel, allowing for specialized production of a unikernel for a given target runtime environment. On the other hand, comman= d-line arguments that the unikernel can use a runtime (defined in the Runtime_arg module) are helpful for customizin= g deployments without altering the dependencies of the unikernels.

    • API changes:
      • There is no more ~stage parameter for Key.Arg.info.
      • Key now define command-line arguments for the configuratio= n tool.
      • There is a new module Runtime_arg to define command-line a= rguments for the unikernel.
      • As there are no more keys type 'Both, users are now expect= ed to create two separated keys in that case (one for configure-time, one f= or runtime) or decide if the key is useful at runtime of configure-time.
    • Intended use of configuration keys (values of type 'a key):
      • Used to set up module dependencies of the unikernel, such as the target= (hvt, xen, etc.) and whether to use DHCP or a fixed IP address.
      • Enable the production of specialized unikernels suitable for specific t= arget runtime environments and dedicated network and storage stacks.
      • Similar keys will produce reproducible binaries to be uploaded to artif= act repositories like Docker Hub or = https://builds.robur.coop/.
    • Intended use of command-line runtime arguments (values of type a = runtime_arg):
      • Allow users to customize deployments by changing device configuration, = like IP addresses, secrets, block device names, etc., post downloading of b= inaries.
      • These keys don=E2=80=99t alter the dependencies of the unikernels.
      • A runtime keys is just a reference to a normal Cmdliner term.
    • key_gen.ml is not generated anymore, so users cannot refer= to Key_gen.<key_name> directly.
      • Any runtime argument has to be declared (using runtime_arg= and registered on the device (using ~runtime_args). The value= of that argument will then be passed as an extra parameter of the co= nnect function of that device.
      • Configuration keys are not available at runtime anymore. For instance, = Key_gen.target has been removed.
    • Code migration:

        (* in co=
      nfig.ml *)
       let key =3D
         let doc =3D Key.Ar=
      g.info ~doc:"A Key." ~stage:`Run [ =
      "key" ] in
         Key.(create "key" Arg.(opt_all=
       ~stage:`Run string doc))
      let main =3D main ~=
      keys:[abstract hello] ..
      
      (* in unik=
      ernel.ml *)
      let start _ =
      =3D
        let key =3D Key_gen=
      .hello () in
        ...
      

      becomes:

      (* in conf=
      ig.ml *)
      let hello =3D runtime_arg ~pos:__POS__ "Unikernel.hello"
      let main =3D main ~=
      runtime_args:[hello] ...
      
      (* in unik=
      ernel.ml *)
      open Cmdliner
      
      let hello =3D
        let doc =3D Arg.info ~doc:"How to say hello." [ "hel=
      lo" ] in
        Arg.(value & opt string "Hello Wor=
      ld!" doc)
      
      let start _ =
      hello =3D
        ...
      

    The mirage-skeleton repository and a few tutorials on https://= mirage.io have been updated and now compile with mdx to check for future API breakage. Documentation PRs are very welcome if you find some missing updates. We also welcome more general= feedback regarding this API change.

    I also would like to use this announcement as a reminder that we have resta= rted the mirage bi-weekly calls. Check the MirageOS mailing list or the MirageO= S Matrix channel for more info. The next one is planned for the 29th of April. If you are using or planning to use MirageOS= (or are just curious about the project), feel free to join, it's open to everyone!

    Happy hacking!

    patricia-tree 0.9.0 - library for patricia tree based maps and= sets

    Dorian Lesbre announced

    I'm happy to announce the release of a new patricia-tree libra= ry, version 0.9.0 on opam.

    This library that implements sets and maps as Patricia Trees, as described = in Okasaki and Gill's 1998 paper Fast mergeable integer maps. It is a space-efficient prefix trie over the big-endian representation of the = key's integer identifier.

    For full details, visit see th= e documentation or the source on github.

    Features

    Comparison to other OCaml libraries

    • ptmap and ptset

      There are other implementations of Patricia Tree in OCaml, namely ptmap and ptset. These are smal= ler and closer to OCaml's built-in Map and Set, however:

      • Our library allows using any type key that comes with an i= njective to_int function, instead of requiring key =3D i= nt.
      • We support generic (heterogeneous) types for keys/elements.
      • We support operations between sets and maps of different types.
      • We use a big-endian representation, allowing easy access to min/max ele= ments of maps and trees.
      • Our interface and implementation tries to maximize the sharing between = different versions of the tree, and to benefit from this memory sharing. Th= eirs do not.
      • These libraries work with older version of OCaml (>=3D 4.05 I believe), whereas ours requires OCaml >=3D 4.14
      • Our keys are limited to positive integers.
    • dmap

      Additionally, there is a dependent map library: dmap. It allows creating type safe dependent maps similar to our heterogeneous maps. However, its maps aren't Patricia t= rees. They are binary trees build using a (polymorphic) comparison function, similarly to the maps of the standard library. Another= difference is that the type of values in the map is independent of the type of the keys, allowing keys to be associated with di= fferent values in different maps. i.e. we map 'a key to any ('a, 'b) value type, whereas dmap only maps 'a key to 'a.

      dmap also works with OCaml >=3D 4.12, whereas = we require OCaml >=3D 4.14.

    OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor= optimization) framework

    Lukasz Stafiniak announced

    OCANNL 0.3.2 is out now. Thanks!

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=ssw3Y/ZG; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=YiVJMNVU; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A48D2B80123 for ; Tue, 30 Apr 2024 08:23:10 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=K6AMnLql6caiSSZL3AC+xds0TAdV5jvjyRBGjuJnFMI=; b=ssw3Y/ZGiBIv/4sKuGYEu00aAIekePPdi3acWiL6f1L3hacC/cIl0gED 6uRPMWMaRyTHrnU/WGtlPRGz/MSN5c3Ewq/n9s2Z6wDUAce7XlOCfYzVL 1XgLBpQWEvXMzm4c25A/p41ImQSVz16lIT+bQA/Ia3AmYc49njNFFkhoC g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,241,1708383600"; d="scan'208,217";a="163887478" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Apr 2024 09:23:09 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 79394E0CD0; Tue, 30 Apr 2024 09:23:09 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0C667E0035 for ; Tue, 30 Apr 2024 09:23:08 +0200 (CEST) IronPort-SDR: 66309c54_3fq20EAghZ/1QdJoTPGCZtRrJQzH3FmiGRLV/pEb27EVYTp Xk9kWo7B8h+vf4p5wZnoxnt/8Fpvn2ZDyuOxUbQ== X-IPAS-Result: =?us-ascii?q?A0FTAwAKnDBmlyIeaIFQAgIGgliBQVsoGQFiVxkaBwhIh?= =?us-ascii?q?FaDT44ZikmGfIpxgVYUgQ8CAxgWBR4UAQMBDS4BDgQBAgQBAQMBAgGEOUYCF?= =?us-ascii?q?ogVAh8GAQQyBw4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECEAEBA?= =?us-ascii?q?QEBAQEBNwUQNYVwDYJKLQEjNjVlCQYBAQEBAQEBAQEBAQEBASIBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAggEAYEaAgEIB?= =?us-ascii?q?AYTAQErDRgjAxQBBgMCBA0BNQMBEwEQAhqCZgGCZAMFDAaaQ5s6en8zgQGCD?= =?us-ascii?q?AEBBoEIPgMLAgUBDgkm2gSBYgmBSIgUGgEkSGmEJwmENycPgVVEgUqCPQdvg?= =?us-ascii?q?j8LFwEBAQEYgRkGBQEBBgIIPQmDJYJphRJ9JoFsAYVRVoVogXxIbYIHUYEwb?= =?us-ascii?q?AMDCQEngXuGH4FLSzMyAVUTFws+CRYCFgMbFAQwDwkLJgMqBjYCEgwGBgZZI?= =?us-ascii?q?BYJBCMDCAQDRAMgbxEDBBoECwd1gUSBbQQTRAOBOIcnglODPYIehCBLhQKBe?= =?us-ascii?q?A5mhCkdQAMLbT01FBsonyEEMQKCYQ4LJA8HCCMMD0IBKQEBBR02GSAHAxgBN?= =?us-ascii?q?AIeJAYFBgsCBCySQAIkAQMlB3OOJ44FlE80B4QWgVsGDIh9gSSVa4QFgVaLK?= =?us-ascii?q?JkxIphAIII0hx2BJQmBbGmKAooOdTwEDw0ZhRiBbA0mPIEgMxowQ4IzAQEyC?= =?us-ascii?q?UYcD1eNVRaBDAEIgkOBPi15gXU7oypBBy4CAQEHMAIHAQoBAQMJhWIBAYM+g?= =?us-ascii?q?UgBAQ?= IronPort-PHdr: A9a23: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 3JsBThhL7dzpYDE/win0qtU+ndN2dFO3r8c2EU= IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:IaMOQ6j6KJirRqSYfgwXijWbznBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3Ao76zD2r5mZSIubRdl0g115/mUdB4VnDE8HyKH23?= =?us-ascii?q?7CWV3E4LPQniK5ooxxg=3D=3D?= X-Talos-MUID: 9a23:KiBH7QQVar9Id+1iRXSxtQ9eC9lq2pitBUFKlq4rpOOFLR5ZbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,241,1708383600"; d="scan'208,217";a="86043109" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFyqMLKciRAi1W6Mwz6wReZFXCuOGmBphCfh+?= =?us-ascii?q?8V6XsjkepYEzB1XIjwJUFivEAI/5MtgpuFkOGOo0NK2y7IygEv8gnVPt?= =?us-ascii?q?P18W42/gP57a8eB6Pl2T+Im/RofRUpH2DYE+6Y+vfbjmUu7TCsARDopX?= =?us-ascii?q?HQRfgG/46MUfv95K0DLMN8tw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Apr 2024 09:23:01 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E66E556482A; Tue, 30 Apr 2024 09:22:58 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1714461779; bh=iCUb12fq1nXiftCPrvcDyGSJz5HCNiLsnissSNlCyew=; h=From:To:Subject:Date:Message-ID; b=YiVJMNVUT94XFcdFChArKMXUqCX61i/YeiKDFD7PEEA188zNNhzjN3u1ZWboGu/4m lNeN4vyVGX7kMVZnUR6GdtOR5M7kpQvsNnYCrez+h088xlo+V9MLunU9WFMgeG7P/s OJ+NKHR5FtQdn5Bo/oJ0RCRlBjOBixQOJtPckY7M= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 30 Apr 2024 09:22:57 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 30 09:22:59 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499975, queueID=3458756482B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19119 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjMgdG8gMzAsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9DQU5OTCAw LjMuMTogYSBmcm9tLXNjcmF0Y2ggZGVlcCBsZWFybmluZyAoaS5lLiBkZW5zZSB0ZW5zb3Igb3B0 aW1pemF0aW9uKSBmcmFtZXdvcmsNCkkgcm91Z2hseSB0cmFuc2xhdGVkIFJlYWwgV29ybGQgT0Nh bWwncyBBc3luYyBjb25jdXJyZW5jeSBjaGFwdGVyIHRvIGVpbw0KVXNpbmcgUHJvcGVydHktQmFz ZWQgVGVzdGluZyB0byBUZXN0IE9DYW1sIDUNCk9DYW1sIEJhY2t0cmFjZXMgb24gVW5jYXVnaHQg RXhjZXB0aW9ucywgYnkgT0NhbWxQcm8NCk9DYW1sIFVzZXJzIG9uIFdpbmRvd3M6IFBsZWFzZSBz aGFyZSB5b3VyIGluc2lnaHRzIG9uIG91ciB1c2VyIHN1cnZleQ0KR3JhcGhxbF9qc29vX2NsaWVu dCAwLjEuMCAtIGxpYnJhcnkgZm9yIEdyYXBoUUwgY2xpZW50cyB1c2luZyBXZWJTb2NrdHMNCmRy ZWFtLWh0bWwgMy4wLjANCkRrQ29kZXIgMC4yIC0gU2NyaXB0aW5nIGluIE9DYW1sDQpPY2FtbC1w cm90b2MtcGx1Z2luIDYuMS4wDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KT0NBTk5M IDAuMy4xOiBhIGZyb20tc2NyYXRjaCBkZWVwIGxlYXJuaW5nIChpLmUuIGRlbnNlIHRlbnNvciBv cHRpbWl6YXRpb24pIGZyYW1ld29yaw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2Nhbm5sLTAtMy0x LWEtZnJvbS1zY3JhdGNoLWRlZXAtbGVhcm5pbmctaS1lLWRlbnNlLXRlbnNvci1vcHRpbWl6YXRp b24tZnJhbWV3b3JrLzE0NDkyLzg+DQoNCg0KTHVrYXN6IFN0YWZpbmlhayBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoaXJkIHRpbWUgdGhlIGNoYXJtLiBPQ0FOTkwgMC4z LjMgaXMgb3V0IG5vdy4gSSBtaWdodCBuZWVkIHRvIGNoYW5nZQ0KICB0aGUgbmFtZSBvZiB0aGUg cHJvamVjdCwgYmVjYXVzZSBvZiB0aGUgbGludCB3YXJuaW5nczogUG9zc2libGUgbmFtZQ0KICBj b2xsaXNpb24gd2l0aCBwYWNrYWdlcyAnT0NBRG1sJywgJ29jYWwnLCAnb2NhbWwnPw0KDQoNCkkg cm91Z2hseSB0cmFuc2xhdGVkIFJlYWwgV29ybGQgT0NhbWwncyBBc3luYyBjb25jdXJyZW5jeSBj aGFwdGVyIHRvIGVpbw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9pLXJvdWdo bHktdHJhbnNsYXRlZC1yZWFsLXdvcmxkLW9jYW1scy1hc3luYy1jb25jdXJyZW5jeS1jaGFwdGVy LXRvLWVpby8xNDU0OC8xPg0KDQoNCkRlbm5pcyBEYW5nIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg UmVwbyBhdA0KICA8aHR0cHM6Ly9naXRodWIuY29tL2RhbmdkZW5uaXMvcndvLWVpby9ibG9iL21h aW4vbGliL3J3b19laW8ubWw+DQoNCiAgSSB3YXMgaW5zcGlyZWQgYnkgVGFyaWRlJ3MgW01ha2Ug YW4gRWlvIHZlcnNpb24gb2YgdGhlIEFzeW5jIGV4YW1wbGVzDQogIGluIFJlYWwgV29ybGQgT0Nh bWxdIHRvIHRyYW5zbGF0ZSB0aGUgQXN5bmMgZXhhbXBsZXMgdG8gZWlvIHRvIHRlc3QNCiAgb3V0 IGVpbydzIGNvbmN1cnJlbmN5IHN0b3J5LiAgV2FybmluZywgaXQncyBhIHJvdWdoIHRyYW5zbGF0 aW9uLiBJDQogIGhhcmRseSBrbm93IE9DYW1sIGFuZCBlaW8gYXMgd2VsbCBhcyBJIGtub3cgbXkg ZGF5LWpvYiBsYW5ndWFnZXMNCiAgOnNtaWxlOiAuDQoNCiAgVGhlcmUgYXJlIHN0aWxsIGEgZmV3 IGV4YW1wbGVzIEkgaGF2ZW4ndCBmaWd1cmVkIG91dC4NCiAgMS4gSSBkb24ndCBrbm93IGhvdyB0 byBpbXBsZW1lbnQgW2Bjb3B5X2Jsb2NrcyddLiBJbiBbdGhpcyBzZWN0aW9uXSwNCiAgICAgdGhl IGV4YW1wbGUgdXNlcyBhbiBpbnRlcm1lZGlhdGUgYnVmZmVyIG9mIHNvbWUgc29ydHMgdG8gdGhl biBjb3B5DQogICAgIGZyb20gcmVhZGVyIHRvIHdyaXRlci4gRm9yIG5vdywgSSd2ZSBsZWZ0IHRo YXQgaW50ZXJtZWRpYXRlIGJ1ZmZlcg0KICAgICBvdXQuDQogIDIuIEkgY2FuJ3QgZmluZCBhbiBg aW50ZXJydXB0JyBvcHRpb24gaW4gYGNvaHR0cC1laW8nIGFzIHdlbGwgYXMNCiAgICAgYGNob2lj ZScgYW5kIGBjaG9vc2UnLiBUaGUgYm9vayBleHBsYWlucyB0aGF0IGNvaHR0cC1hc3luYyBjYW4N CiAgICAgY2FuY2VsIGh0dHAgcmVxdWVzdHMgdmlhIGFuIGBpbnRlcnJ1cHQnIChbc2VlIHNlY3Rp b25dKS4NCiAgMy4gRm9yIFtgbG9nX2RlbGF5cyddLCBJIGhhdmUgeWV0IHRvIHNvbHZlIGhvdyB0 byBhd2FpdCBteSBvd24gYGV2ZXJ5Jw0KICAgICB0aWNrZXIgc3VjaCB0aGF0IEkgY2FuIGF3YWl0 IGl0cyBjb21wbGV0aW9uIGFuZCB0aGVuIGxvZyB0aGUgdGltZXINCiAgICAgYXQgdGhlIGVuZC4N Cg0KDQpbTWFrZSBhbiBFaW8gdmVyc2lvbiBvZiB0aGUgQXN5bmMgZXhhbXBsZXMgaW4gUmVhbCBX b3JsZCBPQ2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vdGFyaWRlcy9oYWNrb2NhbWwvaXNzdWVz Lzk+DQoNCltgY29weV9ibG9ja3MnXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9kYW5nZGVubmlzL3J3 by1laW8vYmxvYi9hNjY2ZDhhYWFlZDA4ODQyMThkNzA2Zjk0YjZiYWJlZWQ4NWRlYmVhL2xpYi9y d29fZWlvLm1sI0w4OD4NCg0KW3RoaXMgc2VjdGlvbl0NCjxodHRwczovL2Rldi5yZWFsd29ybGRv Y2FtbC5vcmcvY29uY3VycmVudC1wcm9ncmFtbWluZy5odG1sPg0KDQpbc2VlIHNlY3Rpb25dDQo8 aHR0cHM6Ly9kZXYucmVhbHdvcmxkb2NhbWwub3JnL2NvbmN1cnJlbnQtcHJvZ3JhbW1pbmcuaHRt bD4NCg0KW2Bsb2dfZGVsYXlzJ10NCjxodHRwczovL2dpdGh1Yi5jb20vZGFuZ2Rlbm5pcy9yd28t ZWlvL2Jsb2IvYTY2NmQ4YWFhZWQwODg0MjE4ZDcwNmY5NGI2YmFiZWVkODVkZWJlYS9saWIvcndv X2Vpby5tbCNMMzQ4Pg0KDQoNClVzaW5nIFByb3BlcnR5LUJhc2VkIFRlc3RpbmcgdG8gVGVzdCBP Q2FtbCA1DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Jsb2ctdXNpbmctcHJvcGVydHktYmFzZWQtdGVzdGluZy10by10ZXN0 LW9jYW1sLTUvMTQ1NTAvMT4NCg0KDQpKYW4gTWlkdGdhYXJkIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSGVyZSdzIGEgYmxvZyBwb3N0IGFib3V0IGhvdyB3ZSBoYXZlIGJlZW4gdXNpbmcg cHJvcGVydHktYmFzZWQgdGVzdGluZw0KICB0byB0ZXN0IE9DYW1sIDU6DQogIDxodHRwczovL3Rh cmlkZXMuY29tL2Jsb2cvMjAyNC0wNC0yNC11bmRlci10aGUtaG9vZC1kZXZlbG9waW5nLW11bHRp Y29yZS1wcm9wZXJ0eS1iYXNlZC10ZXN0cy1mb3Itb2NhbWwtNS8+DQoNCg0KT0NhbWwgQmFja3Ry YWNlcyBvbiBVbmNhdWdodCBFeGNlcHRpb25zLCBieSBPQ2FtbFBybw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9ibG9nLW9jYW1sLWJhY2t0cmFjZXMtb24tdW5jYXVnaHQtZXhjZXB0 aW9ucy1ieS1vY2FtbHByby8xNDU1MS8xPg0KDQoNCk9DYW1sUHJvIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVy ZSdzIGFub3RoZXIgb25lIG9mIG91ciBoZWFkcyB1cCBhYm91dCBvdXIgbGF0ZXN0IGJsb2cgcmVs ZWFzZSENCg0KICBUb2RheSdzIHRvcGljIGlzIGFib3V0IGFuIHVuaW50ZW50aW9uYWxseSBoaWRk ZW4gZmVhdHVyZSBvZiB0aGUgT0NhbWwNCiAgZGV2IGVudmlyb25tbWVudDogW2JhY2t0cmFjZXMg b24gdW5jYXVnaHQgZXhjZXB0aW9uXSENCg0KICBXZSBiZWxpZXZlIHRoaXMgd2lsbCBiZSBvbGQg bmV3cyB0byB0aGUgdmV0ZXJhbiBPQ2FtbCBkZXZzIGJ1dCBjb3VsZA0KICBiZSBvZiBtdWNoIHVz ZSB0byB0aGUgbmV3ZXIgQ2FtZWxlZXJzIG91dCB0aGVyZSENCg0KICBIb3BlZnVsbHksIHlvdSB3 aWxsIGxlYXJuIGEgdGhpbmcgb3IgdHdvIGZyb20gcmVhZGluZyB0aGlzIHNob3J0DQogIGFydGlj bGUsIHdlIHdlbGNvbWUgYWxsIGZlZWRiYWNrIGluIHRoaXMgdmVyeSB0aHJlYWQsIHRoYW5rIHlv dSBmb3INCiAgcmVhZGluZyENCg0KDQpbYmFja3RyYWNlcyBvbiB1bmNhdWdodCBleGNlcHRpb25d DQo8aHR0cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzA0XzI1X29jYW1sX2JhY2t0cmFjZXNf b25fdW5jYXVnaHRfZXhjZXB0aW9ucy8+DQoNCg0KT0NhbWwgVXNlcnMgb24gV2luZG93czogUGxl YXNlIHNoYXJlIHlvdXIgaW5zaWdodHMgb24gb3VyIHVzZXIgc3VydmV5DQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L29jYW1sLXVzZXJzLW9uLXdpbmRvd3MtcGxlYXNlLXNoYXJlLXlvdXItaW5z aWdodHMtb24tb3VyLXVzZXItc3VydmV5LzE0NTU0LzE+DQoNCg0KU3VkaGEgUGFyaW1hbGEgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBEbyB5b3UgdXNlIE9DYW1sIG9uIFdpbmRvd3M/ IFdlIHdhbnQgdG8gaGVhciBmcm9tIHlvdSEgUGFydGljaXBhdGUgaW4NCiAgb3VyIHVzZXIgc3Vy dmV5IHRvIHNoYXJlIHlvdXIgZXhwZXJpZW5jZXMgd2l0aCB0aGUgT0NhbWwgZGV2ZWxvcG1lbnQN CiAgZW52aXJvbm1lbnQgb24gV2luZG93cy4gWW91ciBmZWVkYmFjayBpcyBpbXBvcnRhbnQgaW4g aGVscGluZyB1cw0KICB1bmRlcnN0YW5kIHRoZSBjdXJyZW50IHBhaW4gcG9pbnRzIGFuZCBpZGVu dGlmeSBhcmVhcyBmb3INCiAgaW1wcm92ZW1lbnQuIFdoZXRoZXIgeW91J3JlIGEgc2Vhc29uZWQg T0NhbWwgZGV2ZWxvcGVyIG9yIGp1c3QNCiAgc3RhcnRpbmcgb3V0LCB5b3VyIGlucHV0IGNhbiBt YWtlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4NCg0KICBQbGVhc2Ugc2lnbiB1cCBoZXJlIDxo dHRwczovL2Zvcm1zLmdsZS9TeFJ2TmFFWlhnZWR4cm5SOT4sIGFuZCB3ZSdsbA0KICByZWFjaCBv dXQgdG8geW91Lg0KDQoNCkdyYXBocWxfanNvb19jbGllbnQgMC4xLjAgLSBsaWJyYXJ5IGZvciBH cmFwaFFMIGNsaWVudHMgdXNpbmcgV2ViU29ja3RzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2dyYXBocWwtanNvby1jbGllbnQtMC0xLTAtbGlicmFyeS1mb3ItZ3JhcGhxbC1jbGll bnRzLXVzaW5nLXdlYnNvY2t0cy8xNDU1Ny8xPg0KDQoNCkhhbnMgT2xlIFJhZmFlbHNlbiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBnbGFkIHRvIGFubm91 bmNlIHRoZSByZWxlYXNlIG9mIGdyYXBocWxfanNvb19jbGllbnQuDQoNCiAgVGhpcyBpcyB0aGUg Y2xpZW50IHNpZGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtHcmFwaFFMIG92ZXIgV2ViU29ja2V0 DQogIFByb3RvY29sXS4gSXQgaXMgbWFpbmx5IGludGVuZGVkIGZvciB1c2Ugd2l0aCBEcmVhbSwg d2hpY2ggaW1wbGVtZW50cw0KICB0aGUgc2VydmVyIHNpZGUuIFRoaXMgbGlicmFyeSBzdXBwb3J0 cyB3cml0aW5nIGNsaWVudCBjb2RlIGluIE9jYW1sLA0KICB0aGF0IHdpbGwgcnVuIGluIHRoZSBi cm93c2VyLg0KDQogIEl0IGNhbiBiZSBmb3VuZCBbaGVyZV0uDQoNCg0KW0dyYXBoUUwgb3ZlciBX ZWJTb2NrZXQgUHJvdG9jb2xdDQo8aHR0cHM6Ly9naXRodWIuY29tL2VuaXNkZW5qby9ncmFwaHFs LXdzL2Jsb2IvbWFzdGVyL1BST1RPQ09MLm1kPg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9oYW5zb2xlL2dyYXBocWxfanNvb19jbGllbnQ+DQoNCg0KZHJlYW0taHRtbCAzLjAuMA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC0zLTAtMC8xNDAx My84Pg0KDQoNCllhd2FyIEFtaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbQU5OXSBkcmVhbS1odG1s IDMuNC4xDQoNCiAgQWRkICdsaXZlcmVsb2FkJyBzdXBwb3J0IGllIGF1dG9tYXRpY2FsbHkgcmVs b2FkaW5nIHRoZSBwYWdlIGluIHRoZQ0KICBicm93c2VyIHdoZW4gdGhlIERyZWFtIHNlcnZlciBy ZXN0YXJ0cy4gVXNlZnVsIHRvIHJ1biB3aXRoIGR1bmUncw0KICB3YXRjaCBtb2RlIGZvciBhIGZh c3QgZGV2IGN5Y2xlLg0KDQogIFRoaXMgaXMgYWRhcHRlZCBmcm9tIERyZWFtJ3Mgb3duIGxpdmVy ZWxvYWQgbWlkZGxld2FyZSBidXQgd2l0aCBhDQogIHNsaWdodGx5IGRpZmZlcmVudCBhcHByb2Fj aC4gRnVsbCBkZXRhaWxzIGluIHRoZSBtb2R1bGUgZG9jdW1lbnRhdGlvbjoNCiAgPGh0dHBzOi8v eWF3YXJhbWluLmdpdGh1Yi5pby9kcmVhbS1odG1sL2RyZWFtLWh0bWwvRHJlYW1faHRtbC9MaXZl cmVsb2FkLz4NCg0KICBXaHkgcmVpbXBsZW1lbnQgdGhpcz8gSXQgc2VlbXMgdGhhdCBEcmVhbSdz IGJ1aWx0LWluIGxpdmVyZWxvYWQgbmVlZHMNCiAgdG8gcGFyc2UgdGhlIEhUTUwgbWFya3VwLCBm aW5kIGl0cyBgaGVhZCcgdGFnLCBhbmQgZHluYW1pY2FsbHkgaW5qZWN0DQogIHRoZSByZWxvYWRl ciBgc2NyaXB0JyBpbnNpZGUuIFNpbmNlIHBhcnNpbmcgSFRNTCBjYW4gYmUgcHJldHR5IHRyaWNr eQ0KICBhbmQgcG90ZW50aWFsbHkgYnVnZ3ksIEkgZGVjaWRlZCB0byBtYW51YWxseSBhZGQgdGhl IHNjcmlwdCBpbiB0aGUNCiAgYGhlYWQnIHRhZyBhcyBhIHN0cm9uZy10eXBlZCBkcmVhbS1odG1s IGBub2RlJzoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGhlYWQgW10gWw0KICDilIIgICAu Li4NCiAg4pSCICAgTGl2ZXJlbG9hZC5zY3JpcHQ7DQogIOKUgiAgIC4uLg0KICDilIIgXQ0KICDi lJTilIDilIDilIDilIANCg0KDQpEa0NvZGVyIDAuMiAtIFNjcmlwdGluZyBpbiBPQ2FtbA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ka2NvZGVyLTAtMi1zY3JpcHRpbmctaW4tb2NhbWwv MTQ1NjAvMT4NCg0KDQpqYmVja2ZvcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5u b3VuY2UgdGhlIHNlY29uZCByZWxlYXNlIG9mIERrQ29kZXIsIGFuIE9DYW1sDQogIHNjcmlwdGlu ZyB0b29sLg0KDQogIFRoZSBmaXJzdCByZWxlYXNlIHdhcyBhYm91dCAvaW5zdGFsbCBlYXNlLzog YSBjb3VwbGUgY2xpY2tzIGFuZCBmb3VyDQogICg0KSBtaW51dGVzIGxhdGVyIHlvdSBhbmQgeW91 ciBXaW5kb3dzIGFuZCBtYWNPUyB1c2VycyBjYW4gc3RhcnQNCiAgc2NyaXB0aW5nLiBBbGwgdXNl cnMsIGluY2x1ZGluZyBnbGliYy1iYXNlZCBMaW51eCBkZXNrdG9wIHVzZXJzLCBjYW4NCiAgYWxz byB1c2UgdGhlaXIgVW5peCBzaGVsbHMgb3IgV2luZG93cyBQb3dlclNoZWxsLiBPQ2FtbCBkb2Vz ICpub3QqDQogIG5lZWQgdG8gYmUgcHJlLWluc3RhbGxlZC4gSnVzdCBjb3B5IGFuZCBwYXN0ZSB0 d28gbGluZXMgKHlvdSdsbCBzZWUNCiAgc29tZSBpbiB0aGlzIHBvc3QpIGFuZCB5b3VyIHNjcmlw dCBpcyBydW5uaW5nIGFuZCB5b3VyIHByb2plY3QgaXMNCiAgZWRpdGFibGUgd2l0aCBPQ2FtbCBM U1AuDQoNCiAgVGhpcyBzZWNvbmQgcmVsZWFzZSBpcyBhYm91dCAvdGVjaG5pY2FsIGVhc2UvLiBU aGUgdGhyZWUgImJpZyIgaWRlYXMNCiAgaW4gdGhpcyByZWxlYXNlIGFyZToNCg0KICDigKIgWW91 IGRvbid0IHdyaXRlIGJ1aWxkIGZpbGVzLiBJZiB0aGF0IHNvdW5kcyBsaWtlIGAvYmluL3NoJyB0 aGF0IGlzDQogICAgaW50ZW50aW9uYWwuDQogIOKAoiBBbG1vc3QgZXZlcnkgT0NhbWwgZmlsZSBp cyBhIHNjcmlwdCB5b3UgY2FuIHJ1bi4gSWYgdGhhdCBzb3VuZHMgbGlrZQ0KICAgIGhvdyBQeXRo b24gc2NyaXB0cyBhcmUgYWxtb3N0IGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gUHl0aG9uIG1vZHVs ZXMsDQogICAgdGhhdCBpcyBpbnRlbnRpb25hbC4NCiAg4oCiIEFsbW9zdCBldmVyeSBPQ2FtbCBm aWxlIGNhbiBiZSByZWZlcmVuY2VkIHdpdGggYSBmdWxseS1xdWFsaWZpZWQNCiAgICBuYW1lLiBJ ZiB0aGF0IHNvdW5kcyBsaWtlIEphdmEgcGFja2FnZXMgdGhhdCBpcyBpbnRlbnRpb25hbC4NCg0K ICBIZXJlIGFyZSBzb21lIGV4YW1wbGVzOg0KDQogIDEuICgqb25lIG9mIG15IG93biBzY3JpcHRz KikgVGhlIGluY29tcGxldGUgYnV0IGdyb3dpbmcgRGtDb2Rlcg0KICAgICBkb2N1bWVudGF0aW9u IGlzIHdyaXR0ZW4gaW4gYSBzY3JpcHQ6DQogICAgIDxodHRwczovL2Rpc2t1di5jb20vZGtzZGsv Y29kZXIvMjAyNC1pbnRyby1zY3JpcHRpbmcvPi4gL1RoZQ0KICAgICBkb2N1bWVudGF0aW9uIGlz IGEgc2lkZS1lZmZlY3Qgb2YgcnVubmluZyB0ZXN0cy4vDQoNCiAgICAgSW4gYSBVbml4IHNoZWxs IG9yIGluIFBvd2VyU2hlbGwsIHRoZSBmb2xsb3dpbmcgd2lsbCBhKSBydW4gdGVzdHMNCiAgICAg dXNpbmcgW3RlenRdLCBiKSBjb2xsZWN0IG91dHB1dHMsIGMpIGdlbmVyYXRlIEhUTUwgZG9jdW1l bnRhdGlvbiwNCiAgICAgYW5kIHRoZW4gZCkgc2VydmUgdGhlIGRvYyBwYWdlIG9uIGEgW3Rpbnlf aHR0cGRdIHdlYnNlcnZlciBmb3IgYQ0KICAgICBxdWljayBwcmV2aWV3Og0KDQogICAgIOKUjOKU gOKUgOKUgOKUgA0KICAgICDilIIgZ2l0IGNsb25lIC0tYnJhbmNoIFYwXzIgaHR0cHM6Ly9naXRs YWIuY29tL2Rpc2t1di9zYW1wbGVzL2RrY29kZXIvRGtIZWxsb1NjcmlwdC5naXQNCiAgICAg4pSC IA0KICAgICDilIIgLi9Ea0hlbGxvU2NyaXB0L2RrIERrUnVuX1YwXzIuUnVuIC0tIERrSGVsbG9T Y3JpcHRfU3RkLlkzM0FydGljbGUgLS1zZXJ2ZQ0KICAgICDilJTilIDilIDilIDilIANCg0KICAg ICBUaGUgZm9sbG93aW5nIHdpbGwgcHJpbnQgbWl4ZWQgTWFya2Rvd24vSFRNTCB0aGF0IEkgY2Fu IHJlbmRlciBhbmQNCiAgICAgcHVibGlzaCB3aXRoIGEgc3RhdGljIHNpdGUgZ2VuZXJhdG9yIHRv IGEgd2Vic2l0ZToNCg0KICAgICDilIzilIDilIDilIDilIANCiAgICAg4pSCIC4vRGtIZWxsb1Nj cmlwdC9kayBEa1J1bl9WMF8yLlJ1biAtLSBEa0hlbGxvU2NyaXB0X1N0ZC5ZMzNBcnRpY2xlIC0t ZG9jIC0tZG9jLWZvcm1hdCBtYXJrZG93bg0KICAgICDilJTilIDilIDilIDilIANCg0KICAyLiAo KnNvbWVvbmUgZWxzZSdzKikgVGhlIEJvZ3VlIGRlbW8gZ2FtZSBTbm9rZSB3cml0dGVuIGJ5IEBz YW5ldHRlDQogICAgIHdhcyAicG9ydGVkIiB0byBEa0NvZGVyLiAvVGhlIHBvcnQgZGlkIG5vdCBj aGFuZ2UgYSBzaW5nbGUgbGluZSBvZg0KICAgICB0aGUgb3JpZ2luYWwgY29kZS8uIEkgZGlkIHJl LWFycmFuZ2UgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmUNCiAgICAgKHJlY2FsbCB0aGF0IHRoZXJl IGlzIGEgSmF2YS1saWtlIHBhY2thZ2UgbWVjaGFuaXNtIHVuZGVybmVhdGgNCiAgICAgRGtDb2Rl cikgYW5kIEkgZGlkIGFkZCBhbiBleHRyYSBgLm1sJyBmaWxlLiBSdW46DQoNCiAgICAg4pSM4pSA 4pSA4pSA4pSADQogICAgIOKUgiBnaXQgY2xvbmUgLS1icmFuY2ggVjBfMiBodHRwczovL2dpdGxh Yi5jb20vZGlza3V2L3NhbXBsZXMvZGtjb2Rlci9TYW5ldHRlQm9ndWUuZ2l0DQogICAgIOKUgiAN CiAgICAg4pSCIC4vU2FuZXR0ZUJvZ3VlL2RrIERrUnVuX1YwXzIuUnVuIC0tIFNhbmV0dGVCb2d1 ZV9Tbm9rZS5Tbm9rZQ0KICAgICDilJTilIDilIDilIDilIANCg0KICBUaGUgcmVtYWluaW5nIGl0 ZW1zIGZvciBEa0NvZGVyIGJlZm9yZSBhIDEueCByZWxlYXNlOiBhdXRvLWRvd25sb2FkaW5nDQog IHJlbW90ZSBsaWJyYXJpZXMgKG1vc3RseSBkb25lKSwgbWV0YS9jb2RlZ2VuIHRvb2xzIChpbiBw cm9ncmVzcyksDQogIGNvbmRpdGlvbmFsIGNvbXBpbGF0aW9uIChpbiBkZXNpZ24pLCBhbmQgYSBz ZWN1cml0eSBwb2xpY3kgKGluDQogIGRlc2lnbikuDQoNCiAgQnV0IHJpZ2h0IG5vdyBEa0NvZGVy IGlzIGF0IGEgcmVhc29uYWJsZSBlbm91Z2ggcG9pbnQgdGhhdCBJIGNhbiBub3cNCiAgcmVjb21t ZW5kIHVzaW5nIGl0IGZvciB5b3VyIG93biBzY3JpcHRzLiBXaXRoIHRoZSB1c3VhbCBjYXZlYXRz IHRoYXQNCiAgdGhpcyBpcyBhIDAueCByZWxlYXNlLg0KDQogIC9JJ2QgbGlrZSBzb21lIGZlZWRi YWNrLCBlc3BlY2lhbGx5IG9uIHBhaW4gcG9pbnRzIGFuZCBtaXNzaW5nDQogIG11c3QtaGF2ZSBm ZWF0dXJlcy4vDQoNCg0KW3RlenRdIDxodHRwczovL3YzLm9jYW1sLm9yZy9wL3RlenQvbGF0ZXN0 Pg0KDQpbdGlueV9odHRwZF0gPGh0dHBzOi8vdjMub2NhbWwub3JnL3AvdGlueV9odHRwZC9sYXRl c3Q+DQoNClRlY2ggRGV0YWlscyAoaWYgaW50ZXJlc3RlZCkNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIFZlcnkgc2ltcGxpc3RpY2FsbHksIERrQ29kZXIgaXMgYSBoaWdoLWxldmVs IGJ1aWxkIHN5c3RlbSB0aGF0DQogIHRyYW5zcGFyZW50bHkgbWFuYWdlcyBsb3dlci1sZXZlbCBi dWlsZCBzeXN0ZW1zICh0b2RheSB0aGF0IGlzIER1bmUpLg0KICBJIHRoaW5rICg/KSBEa0NvZGVy IGlzIHRoZSBmaXJzdCBidWlsZCBzeXN0ZW0gdG8gdXNlIFt0aGUgYGNvZGVwdCcNCiAgT0NhbWwg ZGVwZW5kZW5jeSBhbmFseXplcl0uIEh1Z2UgaHVnZSB0aGFua3MgdG8gQG9jdGFjaHJvbiBmb3Ig dGhhdA0KICB0b29sLg0KDQogIFRoZSByYXRoZXIgYm9yaW5nIGRyaXZlciBwaXBlbGluZSBpczoN Cg0KICAxLiBTZWVkIGEgInVuaXZlcnNlIiBvZiBtb2R1bGVzIHdpdGggdGhlIHNpbmdsZSBgLm1s JyBmaWxlIHRoZSB1c2VyDQogICAgIHdhbnRzIHRvIHJ1biBmcm9tIHRoZSBgLi9kaycgQ0xJLCBv ciBzZWVkIHdpdGggYWxsIHRoZSBgLm1sJyBmaWxlcw0KICAgICBpZiBydW4gdGhyb3VnaCBPQ2Ft bCBMU1AuDQogIDIuIExldCBgY29kZXB0JyBhbmFseXNlIGFueSBtb2R1bGUgcmVmZXJlbmNlcyBp bnNpZGUgdGhlIGN1cnJlbnQNCiAgICAgdW5pdmVyc2UuIEFueSAqbWlzc2luZyBtb2R1bGVzKiBh cmUgbG9jYXRlZCBhbmQgYWRkZWQgdG8gdGhlDQogICAgIHVuaXZlcnNlLiBSaW5zZSBhbmQgcmVw ZWF0IHVudGlsIHRoZXJlIGlzIGEgY2xvc2VkIHVuaXZlcnNlIHdpdGggbm8NCiAgICAgbW9yZSBt aXNzaW5nIG1vZHVsZSByZWZlcmVuY2VzLg0KICAzLiBHZW5lcmF0ZSBhbmQvb3IgaW5jcmVtZW50 YWxseSB1cGRhdGUgdGhlIGJ1aWxkIGZpbGVzLiBFYWNoIGAubWwnDQogICAgIGZpbGUgaXMgbWFw cGVkIHRvIGEgc2luZ2xlIE9DYW1sIGAuY21hJyBsaWJyYXJ5Lg0KICA0LiBSdW4gdGhlIGNob3Nl biBidWlsZCB0b29sIChpZS4gRHVuZSkgYW5kIGV4ZWN1dGUgdGhlIGNvZGUuDQoNCiAgV2hhdCBk b2VzIHRoYXQgcGlwZWxpbmUgZ2l2ZSB1cz8gRXZlbiBpbiB0aGlzIGVhcmx5IDAuMiByZWxlYXNl IHlvdQ0KICBnZXQgc29tZSB1bnVzdWFsIGJlbmVmaXRzOg0KDQogIOKAoiBTdGVwIDI6IFRoZSAq bWlzc2luZyBtb2R1bGVzKiBjYW4gYmUgY3JlYXRlZCBpbXBsaWNpdGx5LiBUaGUgU25va2UNCiAg ICBnYW1lIGhhcyBmb250LCBpbWFnZSBhbmQgc291bmQgYXNzZXRzLiBCeSB1c2luZyBgVHIxQXNz ZXRzLkxvY2FsRGlyJw0KICAgIGluIHRoZSBjb2RlIERrQ29kZXIgYXV0b21hdGljYWxseSBjcmVh dGVzIGEgbW9kdWxlIHRoYXQgaGFzIGFsbCB0aGUNCiAgICBhc3NldHMgKHRoaW5rIFtvY2FtbC1j cnVuY2hdKS4gSWYgYSBzY3JpcHQgZG9lcyBub3QgbmVlZCB0aGUgYXNzZXRzLA0KICAgIHRoZSBg Y29kZXB0JyBhbmFseXNpcyBrbm93cyBpdCBkb2Vzbid0IHVzZSBgVHIxQXNzZXRzJywgYW5kIHRo ZQ0KICAgIGFzc2V0cyB3b24ndCB3YXN0ZSB0aW1lIGdldHRpbmcgYnVpbHQuDQogIOKAoiBTdGVw IDM6IFRoZSAqb25lLXRvLW9uZSAubWwvLmNtYSBjb3JyZXNwb25kZW5jZSogbWVhbnMgRGtDb2Rl ciBjYW4NCiAgICBhcHBseSBhIHVuaXF1ZSBzZXQgb2YgY29tcGlsZXIgZmxhZ3MgdG8gZWFjaCBg Lm1sJyBmaWxlLiBZb3UgZ2V0IHRoZQ0KICAgIEphdmEtbGlrZSBwYWNrYWdlIHN0cnVjdHVyZSBi eSBvcGVuaW5nIGEgdW5pcXVlIHNldCBvZiBtb2R1bGVzIHBlcg0KICAgIGAubWwnIHdpdGggYC1v cGVuJyBmbGFncyAobml0OiBJIGFsc28gdXNlZCBpbXBsaWNpdGx5IGNyZWF0ZWQNCiAgICBkaXJl Y3RvcnkgbW9kdWxlcyB0byBsZXQgeW91IG5hdmlnYXRlIHRoZSBwYWNrYWdlcyBpbiB5b3VyIHNv dXJjZQ0KICAgIGNvZGUpLg0KICDigKIgU3RlcCA0OiBZb3UgY2FuIHRha2UgdGhlIGdlbmVyYXRl ZCBgZHVuZS1wcm9qZWN0JyBhbmQgYGR1bmUnIGZpbGVzLA0KICAgIHR3ZWFrIHRoZW0gYW5kIHJ1 biB0aGVtIG91dHNpZGUgb2YgRGtDb2Rlci4gL1RoYXQgbWVhbnMgeW91IGFyZSBub3QNCiAgICBs b2NrZWQgaW50byBEa0NvZGVyIS8gWW91IGNhbiBhbHRlcm5hdGl2ZWx5IGRvIHdoYXQgSSBkaWQg d2l0aA0KICAgIFNub2tlOiBtYWtlIHlvdXIgcHJvamVjdCBjb21wYXRpYmxlIHdpdGggYm90aCBy ZWd1bGFyIGR1bmUNCiAgICAoL29jYW1sYnVpbGQvZXRjLikgYW5kIERrQ29kZXIuIEVpdGhlciB3 YXksIHlvdSBvbmx5IG5lZWQgdG8gZGVhbA0KICAgIHdpdGggdHdvIGlzc3VlcyB0aGF0IGFyaXNl IGZyb20gRGtDb2RlcidzIGJ5dGVjb2RlIGNvbXBpbGF0aW9uIGFuZA0KICAgIHByZWJ1aWx0IEMg bGlicmFyaWVzOiBhKSBidWlsZCBDIGRlcGVuZGVuY2llcyB5b3Vyc2VsZiwgYW5kIGIpIHRlbGwN CiAgICBEdW5lIHRvIHN3aXRjaCBmcm9tIGJ5dGVjb2RlIG1vZGUgdG8gbmF0aXZlIGNvZGUgbW9k ZS4gSWYgeW91IGFyZSBhDQogICAgbWlsZGx5IGV4cGVyaWVuY2VkIExpbnV4L09DYW1sIHVzZXIg d2hvIHVuZGVyc3RhbmRzIHRoZSB0ZXJtcw0KICAgICJvcGFtIiwgInBrZy1jb25maWciLCAiZGVw ZXh0cyIsIGFuZCAiZHVuZS1jb25maWd1cmF0b3IiLCB0aGlzIGlzIGENCiAgICBsb3cgYmFyLg0K DQogIFNjcmlwdCByZWZlcmVuY2VzOg0KICDigKIgW2h0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYv c2FtcGxlcy9ka2NvZGVyL0RrSGVsbG9TY3JpcHQuZ2l0XQ0KICDigKIgW2h0dHBzOi8vZ2l0bGFi LmNvbS9kaXNrdXYvc2FtcGxlcy9ka2NvZGVyL1NhbmV0dGVCb2d1ZS5naXRdDQoNCg0KW3RoZSBg Y29kZXB0JyBPQ2FtbCBkZXBlbmRlbmN5IGFuYWx5emVyXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9sb2NhbC1vcGVuLXNlZW1zLXRvLWNvbmZ1c2UtZHVuZXMtZGVwZW5kZW5jeS1jeWNs ZS1kZXRlY3Rvci85NTI5LzI/dT1qYmVja2ZvcmQ+DQoNCltvY2FtbC1jcnVuY2hdIDxodHRwczov L3YzLm9jYW1sLm9yZy9wL2NydW5jaC9sYXRlc3Q+DQoNCltodHRwczovL2dpdGxhYi5jb20vZGlz a3V2L3NhbXBsZXMvZGtjb2Rlci9Ea0hlbGxvU2NyaXB0LmdpdF0NCjxodHRwczovL2dpdGxhYi5j b20vZGlza3V2L3NhbXBsZXMvZGtjb2Rlci9Ea0hlbGxvU2NyaXB0LmdpdD4NCg0KW2h0dHBzOi8v Z2l0bGFiLmNvbS9kaXNrdXYvc2FtcGxlcy9ka2NvZGVyL1NhbmV0dGVCb2d1ZS5naXRdDQo8aHR0 cHM6Ly9naXRsYWIuY29tL2Rpc2t1di9zYW1wbGVzL2RrY29kZXIvU2FuZXR0ZUJvZ3VlLmdpdD4N Cg0KDQpPY2FtbC1wcm90b2MtcGx1Z2luIDYuMS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vY2FtbC1wcm90b2Mt cGx1Z2luLTYtMS0wLzE0NTY2LzE+DQoNCg0KQW5kZXJzIEZ1Z21hbm4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW09j YW1sLXByb3RvYy1wbHVnaW5dIHZlcnNpb24NCiAgNi4xLjAgT2NhbWwtcHJvdG9jLXBsdWdpbmlz IGEgcGx1Z2luIGZvciBnb29nbGUncyBwcm90b2J1ZiBjb21waWxlcg0KICAoYHByb3RvYycpIHRo YXQgZ2VuZXJhdGVzIGFuIGlkb21hdGljIG9jYW1sIG1hcHBpbmcgYW5kDQogIChkZS0pc2VyaWFs aXphdGlvbiBmdW5jdGlvbnMgYmFzZWQgb24gLnByb3RvIGZpbGVzLiBUaGUgbGlicmFyeSBhaW1z DQogIHRvIGJlIDEwMCUgY29tcGxpYW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBwcm90b2J1ZiBz cGVjaWZpY2F0aW9uLg0KDQogIFRoZSA2LjEuMCAoYW5kIDYuMC4wKSByZWxlYXNlIGludHJvZHVj ZXMgSnNvbiBzZXJpYWxpemF0aW9uIGFuZA0KICBkZXNlcmlhbGl6YXRpb24gYmFzZWQgb24gcHJv dG9idWZmZXJzIGd1aWRlbGluZXMgYW5kIHRoZSBhYmlsaXR5IHRvDQogIGNvcHkgY29tbWVudHMg ZnJvbSAucHJvdG8gaW50byBvY2FtbCBnZW5lcmF0ZWQgY29kZSBmb3IgaW1wcm92ZWQNCiAgZG9j dW1lbnRhdGlvbiBhcyB3ZWxsIGFzIG51bWVyb3VzIGJ1ZyBmaXhlcyBhbmQgb3RoZXIgaW1wcm92 ZW1lbnRzLg0KDQogICpGdWxsIGNoYW5nZWxvZyBzaW5jZSByZWxlYXNlIDUuMC4wKg0KDQoNCltP Y2FtbC1wcm90b2MtcGx1Z2luXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRlcnNmdWdtYW5uL29j YW1sLXByb3RvYy1wbHVnaW4+DQoNCjYuMS4wOiAyMDI0LTA0LTI1DQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRml4IG5hbWUgcmVz b2x1dGlvbiBsZWFkaW5nIHRvIHdyb25nbHkgbWFwcGVkIG5hbWVzDQogIOKAoiBGaXggY29kZWdl biBidWcgY2F1c2luZyB0aGUgcGx1Z2luIHRvIHJlamVjdCB2YWxpZCBwcm90b2J1Zg0KICDigKIg QWRkIHByZWxpbWluYXJ5IHN1cHBvcnQgZm9yIG1lbGFuZ2UgdGhvdWdoIGRpc2FibGluZyBlYWdl cg0KICAgIGV2YWx1YXRpb24gb2Ygc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBmdW5jdGlvbnMg d2hlbiBub3QgdXNpbmcNCiAgICBuYXRpdmUgb3IgYnl0ZWNvZGUgYmFja2VuZHMNCiAg4oCiIEZp eCBtaXNzaW5nIGNmbGFncyB3aGVuIGNvbXBpbGluZyB0ZXN0IGMgc3R1Yg0KICDigKIgTWFrZSBN YXAgdGVzdHMgY29tcGF0aWJsZSB3aXRoIG9sZGVyIHZlcnNpb25zIG9mIHByb3RvYw0KICDigKIg Rml4IG5lZ2F0aXZlIGludGVnZXIgdGVzdCBmYWlsdWVzIGR1ZSB0byBhIGJ1ZyBpbiBvbGRlciB2 ZXJzaW9ucyBvZg0KICAgIHByb3RvYnVmIChnb29nbGUpIGMgbGliDQoNCg0KNi4wLjA6IDIwMjQt MDQtMTMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQril4ogTmV3IGZlYXR1cmVzDQoNCiAg4oCiIEltcGxlbWVudCBqc29uIHNlcmlhbGl6YXRp b24gYW5kIGRlc2VyaWFsaXphdGlvbiAoIzUpDQogIOKAoiBTdXBwb3J0IHNwZWNpYWwganNvbiBt YXBwaW5nIGZvciBnb29nbGUgdHlwZXMgKCM5KQ0KICDigKIgQWRkIGRlcHJlY2F0aW9uIGFubm90 YXRpb25zIGZvciBkZXByZWNhdGVkIGZpZWxkcywgc2VydmljZXMgZXRjICgjOCkNCiAg4oCiIEFk ZCBvcHRpb24gdG8gcHJlZml4IGdlbmVyYXRlZCBmaWxlcyB3aXRoIHRoZWlyIHBhY2thZ2UgbmFt ZQ0KICDigKIgQ29weSBkb2N1bWVudGF0aW9uIGZyb20gcHJvdG8gZmlsZXMgaW50byBnZW5lcmF0 ZWQgb2NhbWwgYmluZGluZ3MNCg0KDQril4ogQnVnIGZpeGVzDQoNCiAg4oCiIEZpeCBmaWxlIG91 dHB1dCBuYW1lIGlmIGZpbGVzIGNvbnRhaW5zIGEgJy0nDQogIOKAoiBSZXNvbHZlIGJ1ZyBmb3Ig UmVxdWVzdC9SZXNwb25zZSBtb2R1bGUgYWxpYXNlcyBsZWFkaW5nIHRvDQogICAgZ2VuZXJhdGlu ZyB1bmNvbXBpbGFibGUgY29kZS4gKCMyMSkNCiAg4oCiIEZpeCBjb2RlZ2VuIGJ1ZyBmb3IgbWVz c2FnZXMgd2l0aG91dCBmaWVsZHMgYW5kIHNldHRpbmcNCiAgICBzaW5nbGV0b25fcmVjb3JkcyA9 IHRydWUgKCMyMCkNCiAg4oCiIEluIFNlcnZpY2VzLCB0aGUgcGFja2FnZSBmaWVsZCBpcyBub3cg Y29ycmVjdGx5IHNldCB0byBOb25lIGlmIHRoZQ0KICAgIHNlcnZpY2UgaWYgbm90IGRlZmluZWQg aW4gYSBwYWNrYWdlIHNjb3BlICgjMjQpDQoNCg0K4peKIE1pc2MgY2hhbmdlcw0KDQogIOKAoiBV bmlmeSBzZXJpYWxpemF0aW9uIGFuZCBkZXNlcmlhbGl6YXRpb24gc3BlYyBhbmQgb3B0aW1pemUg b25lb2YNCiAgICBoYW5kbGluZw0KICDigKIgU2ltcGxpZnkgdHlwZXMgdXNlZCBpbiBjb2RlIGdl bmVyYXRpb24gdG8gaW1wcm92ZSByZWFkYWlsaXR5DQogIOKAoiAqUmVwbGFjZSBgdmFsIG5hbWUn OiB1bml0IC0+IHN0cmluZycgd2l0aCBgdmFsIG5hbWU6IHVuaXQgLT4gc3RyaW5nJw0KICAgICB3 aGljaCB3aWxsIG9ubHkgcmV0dXJuIHRoZSBmdWxsIHByb3RvYnVmIG5hbWUNCiAg4oCiIE9wdGlt aXplIG1lcmdlIGZ1bmN0aW9ucyBieSBhcHBseWluZyBlYWdlciBldmFsdWF0aW9uDQogIOKAoiBD aGFuZ2Ugc2lnbmF0dXJlIG9mIGB0b19wcm90bycnIHRvIHJldHVybiB1bml0IGFuZCBub3QgYSB3 cml0ZXINCg0KICAoYConIGluZGljYXRlcyBicmVha2luZyBjaGFuZ2UpDQoNCg0K4peKIE5vdGVz DQoNCiAgYE1lc3NhZ2UubmFtZSc6IHVuaXQgLT4gc3RyaW5nJyBoYXMgYmVlbiByZW5hbWVkIHRv IGBNZXNzYWdlLm5hbWU6DQogICAgdW5pdCAtPiBzdHJpbmcnLCBhbmQgaXMgbm93IGNvbnRhaW5z IHRoZSBmdWxseSBxdWFsaWZpZWQgcHJvdG9idWYNCiAgICBtZXNzYWdlIG5hbWUuIEJlZm9yZSB0 aGUgbmFtZSB3YXMgdGhlIG9jYW1sIG1vZHVsZSBuYW1lIG9mIHRoZQ0KICAgIG1lc3NhZ2UuDQoN CiAgYFNlcnZpY2UuTWVzc2FnZScgc2lnbmF0dXJlIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHJl cGxhY2VkIHdpdGgNCiAgYFNwZWMuTWVzc2FnZScgc2lnbmF0dXJlLiBgU2VydmljZS5NZXNzYWdl JyBpcyBub3cgYW4gYWxpYXMgZm9yDQogIGBTcGVjLk1lc3NhZ2UnIGFuZCB3aWxsIGJlIHJlbW92 ZWQgaW4gZnV0dXJlIHJlbGVhc2VzLg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5v cmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1s IGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtP Q2FtbCBCYWNrdHJhY2VzIG9uIFVuY2F1Z2h0IEV4Y2VwdGlvbnNdDQogIOKAoiBbVW5kZXIgdGhl IEhvb2Q6IERldmVsb3BpbmcgTXVsdGljb3JlIFByb3BlcnR5LUJhc2VkIFRlc3RzIGZvciBPQ2Ft bA0KICAgIDVdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Js b2cvPg0KDQpbT0NhbWwgQmFja3RyYWNlcyBvbiBVbmNhdWdodCBFeGNlcHRpb25zXQ0KPGh0dHBz Oi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAyNF8wNF8yNV9vY2FtbF9iYWNrdHJhY2VzX29uX3VuY2F1 Z2h0X2V4Y2VwdGlvbnM+DQoNCltVbmRlciB0aGUgSG9vZDogRGV2ZWxvcGluZyBNdWx0aWNvcmUg UHJvcGVydHktQmFzZWQgVGVzdHMgZm9yIE9DYW1sIDVdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9i bG9nLzIwMjQtMDQtMjQtdW5kZXItdGhlLWhvb2QtZGV2ZWxvcGluZy1tdWx0aWNvcmUtcHJvcGVy dHktYmFzZWQtdGVzdHMtZm9yLW9jYW1sLTU+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0 XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 23 to 30, 2024.

    OCANNL 0.3.1: a from-scratch deep learning (i.e. dense tensor optimization) framework

    Lukasz Stafiniak announced

    Third time the charm. OCANNL 0.3.3 is out now. I might need to change the name of the project, because of the lint warnings: Possible name collision with packages 'OCADml', 'ocal', 'ocaml'?

    I roughly translated Real World OCaml's Async concurrency chapter to eio

    Dennis Dang announced

    Repo at https://github.com/dangdennis/rwo-eio/blob/main/lib/rwo_eio.ml

    I was inspired by Taride's Make an Eio version of the Async examples in Real World OCaml to translate the Async examples to eio to test out eio's concurrency story. Warning, it's a rough translation. I hardly know OCaml and eio as well as I know my day-job languages :smile: .

    There are still a few examples I haven't figured out.

    1. I don't know how to implement copy_blocks. In this section, the example uses an intermediate buffer of some sorts to then copy from reader to writer. For now, I've left that intermediate buffer out.
    2. I can't find an interrupt option in cohttp-eio as well as choice and choose. The book explains that cohttp-async can cancel http requests via an interrupt (see section).
    3. For log_delays, I have yet to solve how to await my own every ticker such that I can await its completion and then log the timer at the end.

    Using Property-Based Testing to Test OCaml 5

    Jan Midtgaard announced

    Here's a blog post about how we have been using property-based testing to test OCaml 5: https://tarides.com/blog/2024-04-24-under-the-hood-developing-multicore-property-based-tests-for-ocaml-5/

    OCaml Backtraces on Uncaught Exceptions, by OCamlPro

    OCamlPro announced

    Here's another one of our heads up about our latest blog release!

    Today's topic is about an unintentionally hidden feature of the OCaml dev environmment: backtraces on uncaught exception!

    We believe this will be old news to the veteran OCaml devs but could be of much use to the newer Cameleers out there!

    Hopefully, you will learn a thing or two from reading this short article, we welcome all feedback in this very thread, thank you for reading!

    OCaml Users on Windows: Please share your insights on our user survey

    Sudha Parimala announced

    Do you use OCaml on Windows? We want to hear from you! Participate in our user survey to share your experiences with the OCaml development environment on Windows. Your feedback is important in helping us understand the current pain points and identify areas for improvement. Whether you're a seasoned OCaml developer or just starting out, your input can make a significant difference.

    Please sign up here https://forms.gle/SxRvNaEZXgedxrnR9, and we'll reach out to you.

    Graphql_jsoo_client 0.1.0 - library for GraphQL clients using WebSockts

    Hans Ole Rafaelsen announced

    I'm glad to announce the release of graphql_jsoo_client.

    This is the client side implementation of the GraphQL over WebSocket Protocol. It is mainly intended for use with Dream, which implements the server side. This library supports writing client code in Ocaml, that will run in the browser.

    It can be found here.

    dream-html 3.0.0

    Yawar Amin announced

    [ANN] dream-html 3.4.1

    Add 'livereload' support ie automatically reloading the page in the browser when the Dream server restarts. Useful to run with dune's watch mode for a fast dev cycle.

    This is adapted from Dream's own livereload middleware but with a slightly different approach. Full details in the module documentation: https://yawaramin.github.io/dream-html/dream-html/Dream_html/Livereload/

    Why reimplement this? It seems that Dream's built-in livereload needs to parse the HTML markup, find its head tag, and dynamically inject the reloader script inside. Since parsing HTML can be pretty tricky and potentially buggy, I decided to manually add the script in the head tag as a strong-typed dream-html node:

    head [] [
      ...
      Livereload.script;
      ...
    ]
    

    DkCoder 0.2 - Scripting in OCaml

    jbeckford announced

    I'm happy to announce the second release of DkCoder, an OCaml scripting tool.

    The first release was about install ease: a couple clicks and four (4) minutes later you and your Windows and macOS users can start scripting. All users, including glibc-based Linux desktop users, can also use their Unix shells or Windows PowerShell. OCaml does not need to be pre-installed. Just copy and paste two lines (you'll see some in this post) and your script is running and your project is editable with OCaml LSP.

    This second release is about technical ease. The three "big" ideas in this release are:

    • You don't write build files. If that sounds like /bin/sh that is intentional.
    • Almost every OCaml file is a script you can run. If that sounds like how Python scripts are almost indistinguishable from Python modules, that is intentional.
    • Almost every OCaml file can be referenced with a fully-qualified name. If that sounds like Java packages that is intentional.

    Here are some examples:

    1. (one of my own scripts) The incomplete but growing DkCoder documentation is written in a script: https://diskuv.com/dksdk/coder/2024-intro-scripting/. The documentation is a side-effect of running tests.

      In a Unix shell or in PowerShell, the following will a) run tests using tezt, b) collect outputs, c) generate HTML documentation, and then d) serve the doc page on a tiny_httpd webserver for a quick preview:

      git clone --branch V0_2 https://gitlab.com/diskuv/samples/dkcoder/DkHelloScript.git
      
      ./DkHelloScript/dk DkRun_V0_2.Run -- DkHelloScript_Std.Y33Article --serve
      

      The following will print mixed Markdown/HTML that I can render and publish with a static site generator to a website:

      ./DkHelloScript/dk DkRun_V0_2.Run -- DkHelloScript_Std.Y33Article --doc --doc-format markdown
      
    2. (someone else's) The Bogue demo game Snoke written by @sanette was "ported" to DkCoder. The port did not change a single line of the original code. I did re-arrange the directory structure (recall that there is a Java-like package mechanism underneath DkCoder) and I did add an extra .ml file. Run:

      git clone --branch V0_2 https://gitlab.com/diskuv/samples/dkcoder/SanetteBogue.git
      
      ./SanetteBogue/dk DkRun_V0_2.Run -- SanetteBogue_Snoke.Snoke
      

    The remaining items for DkCoder before a 1.x release: auto-downloading remote libraries (mostly done), meta/codegen tools (in progress), conditional compilation (in design), and a security policy (in design).

    But right now DkCoder is at a reasonable enough point that I can now recommend using it for your own scripts. With the usual caveats that this is a 0.x release.

    I'd like some feedback, especially on pain points and missing must-have features.

    Tech Details (if interested)

    Very simplistically, DkCoder is a high-level build system that transparently manages lower-level build systems (today that is Dune). I think (?) DkCoder is the first build system to use the codept OCaml dependency analyzer. Huge huge thanks to @octachron for that tool.

    The rather boring driver pipeline is:

    1. Seed a "universe" of modules with the single .ml file the user wants to run from the ./dk CLI, or seed with all the .ml files if run through OCaml LSP.
    2. Let codept analyse any module references inside the current universe. Any missing modules are located and added to the universe. Rinse and repeat until there is a closed universe with no more missing module references.
    3. Generate and/or incrementally update the build files. Each .ml file is mapped to a single OCaml .cma library.
    4. Run the chosen build tool (ie. Dune) and execute the code.

    What does that pipeline give us? Even in this early 0.2 release you get some unusual benefits:

    • Step 2: The missing modules can be created implicitly. The Snoke game has font, image and sound assets. By using Tr1Assets.LocalDir in the code DkCoder automatically creates a module that has all the assets (think ocaml-crunch). If a script does not need the assets, the codept analysis knows it doesn't use Tr1Assets, and the assets won't waste time getting built.
    • Step 3: The one-to-one .ml/.cma correspondence means DkCoder can apply a unique set of compiler flags to each .ml file. You get the Java-like package structure by opening a unique set of modules per .ml with -open flags (nit: I also used implicitly created directory modules to let you navigate the packages in your source code).
    • Step 4: You can take the generated dune-project and dune files, tweak them and run them outside of DkCoder. That means you are not locked into DkCoder! You can alternatively do what I did with Snoke: make your project compatible with both regular dune (/ocamlbuild/etc.) and DkCoder. Either way, you only need to deal with two issues that arise from DkCoder's bytecode compilation and prebuilt C libraries: a) build C dependencies yourself, and b) tell Dune to switch from bytecode mode to native code mode. If you are a mildly experienced Linux/OCaml user who understands the terms "opam", "pkg-config", "depexts", and "dune-configurator", this is a low bar.

    Script references:

    Ocaml-protoc-plugin 6.1.0

    Anders Fugmann announced

    I'm happy to announce the release of Ocaml-protoc-plugin version 6.1.0 Ocaml-protoc-pluginis a plugin for google's protobuf compiler (protoc) that generates an idomatic ocaml mapping and (de-)serialization functions based on .proto files. The library aims to be 100% compliant implementation of the protobuf specification.

    The 6.1.0 (and 6.0.0) release introduces Json serialization and deserialization based on protobuffers guidelines and the ability to copy comments from .proto into ocaml generated code for improved documentation as well as numerous bug fixes and other improvements.

    Full changelog since release 5.0.0

    6.1.0: 2024-04-25

    • Fix name resolution leading to wrongly mapped names
    • Fix codegen bug causing the plugin to reject valid protobuf
    • Add preliminary support for melange though disabling eager evaluation of serialize and deserialize functions when not using native or bytecode backends
    • Fix missing cflags when compiling test c stub
    • Make Map tests compatible with older versions of protoc
    • Fix negative integer test failues due to a bug in older versions of protobuf (google) c lib

    6.0.0: 2024-04-13

    • New features
      • Implement json serialization and deserialization (#5)
      • Support special json mapping for google types (#9)
      • Add deprecation annotations for deprecated fields, services etc (#8)
      • Add option to prefix generated files with their package name
      • Copy documentation from proto files into generated ocaml bindings
    • Bug fixes
      • Fix file output name if files contains a '-'
      • Resolve bug for Request/Response module aliases leading to generating uncompilable code. (#21)
      • Fix codegen bug for messages without fields and setting singleton_records = true (#20)
      • In Services, the package field is now correctly set to None if the service if not defined in a package scope (#24)
    • Misc changes
      • Unify serialization and deserialization spec and optimize oneof handling
      • Simplify types used in code generation to improve readaility
      • *Replace val name': unit -> string with val name: unit -> string which will only return the full protobuf name
      • Optimize merge functions by applying eager evaluation
      • Change signature of to_proto' to return unit and not a writer

      (* indicates breaking change)

    • Notes

      Message.name': unit -> string has been renamed to Message.name: unit -> string, and is now contains the fully qualified protobuf message name. Before the name was the ocaml module name of the message.

      Service.Message signature has been deprecated and replaced with Spec.Message signature. Service.Message is now an alias for Spec.Message and will be removed in future releases.

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Jk9URAPO; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=JShYe5K7; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 0E143B80123 for ; Tue, 7 May 2024 08:30:29 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MLxvwsvqicG+TPdR3Q/GqUNH5BBDBOxsg50BKoyth0Y=; b=Jk9URAPO41WjWP75sdTBRvb++s/vHSQLLBbdbEGWxmCcBuqtAzpIoDZ7 TI3zNr5YxG0QkLq+Hu5F+G/LkuBFsL+cu5fZhpM3WQ9/I0EK+x7jv52u+ aWMb54ISZF8M2QsMBDle5/wb1dWJu6wypBxB8M0qXZXhh8V0zj3Acn6C5 A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.07,260,1708383600"; d="scan'208,217";a="164792632" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 May 2024 09:30:27 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id B0E89E0CD2; Tue, 7 May 2024 09:30:26 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 572F2E0035 for ; Tue, 7 May 2024 09:30:24 +0200 (CEST) IronPort-SDR: 6639d88e_3RoWMtI4nvOSPF/5Ym0NkcDsJwy/mPV5JyJnJnkUuhXgrgK DI7o0ACazM2xxTfpTj5m65biiICGID9ZEkcVX+Q== X-IPAS-Result: =?us-ascii?q?A0G2AQA91zlmlyIeaIFaFoJCgUFbKBkBYlczBwhIhFaDT?= =?us-ascii?q?44ZgRaQMIpxgWqBEQMYFiMUAQMBDS4BDgQBAgQBAQMBAgGEOUYCFogaAh8GA?= =?us-ascii?q?QQzBg4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECEAEBAQEBAQEBN?= =?us-ascii?q?wUQNYV0DYJKLiNrXgYBCAE2AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIMAQcHIiwBIxoCAwYKEwEBJhIYIwMJCwEGAwIED?= =?us-ascii?q?QE1FwEJCRkBAYINWAGCZAMFDAaXNZs6eoEygQGCDAEBBoEIPgIBCwICAw8uA?= =?us-ascii?q?doEgWIJgUiIFBoBJEhpAoQlCYQ3Jw+BVUSBFTWBBm1KB2+CShcBAQEBXDslA?= =?us-ascii?q?QFNCQmDHIJphhImgWwBhVFWFQ+CXCdBgRc6MV0BEoEKWVsTgiIRgTBsBAEIC?= =?us-ascii?q?AoNCmgqW1kPWgF5gUCFNoFLSzMyAVUTFws+CRYCFgMbFAQwDwkLJgMqBjYCE?= =?us-ascii?q?gwGBgZZIBYJBCMDCAQDRAMgcREDBBoECwd1gUSBbQQTRAOBOIcnglODPYIgh?= =?us-ascii?q?CBLhHaBeA5ih14dQAMLbT01FBsooUQENQIrgkUOPgEBMBsOCSYFARMIDgEBI?= =?us-ascii?q?AI2BRYeDxQZDQUFBBUWDBMYLZJEJQMEshY0B4QWgVsGDIh9gSSVa4QFgVaLK?= =?us-ascii?q?JkxIphAIII0hx2BJQmBbB5LlUIEBIVJgXskgSsBHQwHMxowQw0aggwBMwlGH?= =?us-ascii?q?A9XkUNBKRc9gSYKgWs7gkGVfUE1AgEBNwIHAQoBAQMJhWIBAYM+gSoeAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:NNlfO6/Ouw2clKT3V1Vuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:oRDPc2NBqaa9Yu5DUxhuqWU6AcIfKmSC0jT8PE2kNF5wcejA X-Talos-MUID: 9a23:TCuwawojfwzWHCTidwIezzY8BsZFwIuwM1wQvpNd/JmjFwx+HzjI2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.07,260,1708383600"; d="scan'208,217";a="86530631" X-MGA-submission: =?us-ascii?q?MDGCAkdM0g6KhxuJmoD5A1AhJeitAgSEC4zd4V?= =?us-ascii?q?PED1knHwNJFeluOtkhmQZXakyVeJ1JDmp4Joh1atpifu+2V2a5O+U4ng?= =?us-ascii?q?RPeVcVkYOmiGQ1x+KZe2KDr8gi1aA/UBJZlfMx8Nie+e/7jE3JVQkMQn?= =?us-ascii?q?B+jX3xHAAGFZtns4K5GQf1gQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 May 2024 09:30:23 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id AC0DD564695; Tue, 7 May 2024 09:30:20 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1715067020; bh=nrvI6qPMhBO/JSPEhx0D4ow++rvXs9J46DByaT6Mwlw=; h=From:To:Subject:Date:Message-ID; b=JShYe5K7rt6ROlQSx0J5t02ek5r/Nnn9suTCDcs/TC/riDm1Ik4as0HN6ttqJsnsN jrg5f/EBy/KMBPEntZfkynSMl6ik0RdX/qT5kByPf5ddXwZo3J8nCzLn7Nb9UPwvgD zYm7qzF/2LM4mPqTx3TPcvWWARUmxfaNRaPJW8Ps= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 07 May 2024 09:30:19 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 7 09:30:21 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.462156, queueID=11235564697 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19123 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMzAgdG8gTWF5DQowNywgMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpEZXBs b3lpbmcgT2NzaWdlbiBhcHBsaWNhdGlvbnMNCk9DYW1sIGxpbnRpbmcgdG9vbHMgYW5kIHRlY2hu aXF1ZXMNCmR1bmUgMy4xNQ0KYml0Z2VuZXJhdG9ycyB2MC4xLjANCmNoZWNrZWRfb2ludCB2MC4x LjANCkxpcXVpZHNvYXAgMi4yLjUgaXMgb3V0IQ0KT0NhbWwgNS4yLjAgLSBGaXJzdCBSZWxlYXNl IENhbmRpZGF0ZQ0KQW5ub3VuY2luZyBEQkNhbWwsIFNpbG8sIFNlcmRlIFBvc3RncmVzIGFuZCBh IG5ldyBkcml2ZXIgZm9yIHBvc3RncmVzDQpQcmV0dHkgUHJpbnRpbmcgaW4gT0NhbWw6IEZvcm1h dCBQcmltZXINClNlbmQgdXMgVGFsayBhbmQgV29ya3Nob3AgUHJvcG9zYWxzIGZvciBGdW4gT0Nh bWwgMjAyNCBpbiBCZXJsaW4sIFNlcHRlbWJlciAxNisxNw0KT0NhbWwgV29ya3Nob3AgMjAyNCBh dCBJQ0ZQIOKAkyBhbm5vdW5jZW1lbnQgYW5kIGNhbGwgZm9yIHByb3Bvc2Fscw0KT3RoZXIgT0Nh bWwgTmV3cw0KT2xkIENXTg0KDQoNCkRlcGxveWluZyBPY3NpZ2VuIGFwcGxpY2F0aW9ucw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9kZXBsb3lpbmctb2NzaWdlbi1hcHBsaWNhdGlvbnMvMTQ1NzIv MT4NCg0KDQpIYW5zIE9sZSBSYWZhZWxzZW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJIGhhdmUgd3JpdHRlbiBhIHNob3J0IHRleHQgb24gaG93IE9jc2lnZW4g YXBwbGljYXRpb25zIG1pZ2h0IGJlDQogIHBhY2tlZCBpbiBvcmRlciB0byBiZSBkZXBsb3llZCB0 byBvdGhlciBub2RlcywgdGhhdCBkb24ndCBoYXZlIHlvdXINCiAgZGV2ZWxvcG1lbnQgZW52aXJv bm1lbnQgaW5zdGFsbGVkLg0KDQogIFtEZXBsb3lpbmcgT2NzaWdlbl0NCg0KICBJZiB5b3UgaGFw cGVuIHRvIGhhdmUgYSBiZXR0ZXIgd2F5LCBvciBzb2x1dGlvbnMgdG8gcGFydHMgdGhhdCBJIGhh dmUNCiAgbm90IGJlZW4gYWJsZSB0byBzb2x2ZSwgcGxlYXNlIGxldCBtZSBrbm93Lg0KDQoNCltE ZXBsb3lpbmcgT2NzaWdlbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9oYW5zb2xlL2RlcGxveWluZ19v Y3NpZ2VuPg0KDQoNCk9DYW1sIGxpbnRpbmcgdG9vbHMgYW5kIHRlY2huaXF1ZXMNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1vY2FtbC1saW50aW5nLXRvb2xzLWFuZC10 ZWNobmlxdWVzLzE0NTc0LzE+DQoNCg0KU2ltbW8gU2FhbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFJl Y2VudGx5LCBJIHN0YXJ0ZWQgd29uZGVyaW5nIGFib3V0IGxpbnRpbmcgdG9vbHMgZm9yIE9DYW1s LCBzbyBJIHdlbnQNCiAgbG9va2luZy4gVGhpcyBlbmRlZCB1cCBiZWluZyBhIHF1aXRlIGV4dGVu c2l2ZSBzdXJ2ZXkuICBUaGVyZWZvcmUsIEkNCiAgZGVjaWRlZCB0byBwdWJsaXNoIG15IGZpbmRp bmdzIGluIGEgYmxvZyBwb3N0OiBbT0NhbWwgbGludGluZyB0b29scw0KICBhbmQgdGVjaG5pcXVl c10uDQoNCiAgSW4gcGFydGljdWxhciwgSSBmb2N1c2VkIG9uIGxpbnRpbmcgd2l0aCBkdW5lIGFu ZCBQcHhsaWIgYmVjYXVzZQ0KICB0aGVyZSdzIG1hbnkgdmFyaWF0aW9ucyBvdXQgdGhlcmUuIElu IHRoZSBwb3N0IEkgZGVzY3JpYmUgdGhlDQogIHRlY2huaWNhbCBjaG9pY2VzIHRoYXQgZ28gaW50 byBzdWNoIGxpbnRlcnMgYW5kIHByb3ZpZGUgYW4gb3ZlcnZpZXcgb2YNCiAgdGhvc2UgdGhhdCB3 b3JrIGFuZCBob3cgd2VsbC4gSW4gdGhlIHByb2Nlc3Mgb2YgZXhwZXJpbWVudGluZywgSSB0cmll ZA0KICB0aGVtIG91dCBteXNlbGYgYW5kIHB1Ymxpc2hlZCB0aGVtIGFzIGRlbW9zIG9uIEdpdEh1 YjoNCiAgW3NpbTY0Mi9kdW5lLWxpbnQtZGVtb10uDQoNCiAgRmVlbCBmcmVlIHRvIGxldCBtZSBr bm93IGlmIEkgbWlzc2VkIGFueSB0b29scyBvdXQgdGhlcmUgb3IgeW91IGhhdmUNCiAgYW55IHF1 ZXN0aW9ucy9jb21tZW50cy4gVGhlcmUgaXNuJ3QgbXVjaCBpbmZvcm1hdGlvbiBhYm91dCB0aGlz IG91dA0KICB0aGVyZSAoYW5kIGV4aXN0aW5nIHRvb2wgZG9lcyBpdCBzbGlnaHRseSBkaWZmZXJl bnRseSksIHNvIEkgaG9wZSB0aGlzDQogIG92ZXJ2aWV3IGJlbmVmaXRzIG90aGVycyBhcyB3ZWxs Lg0KDQoNCltPQ2FtbCBsaW50aW5nIHRvb2xzIGFuZCB0ZWNobmlxdWVzXQ0KPGh0dHBzOi8vc2lt NjQyLmV1L2Jsb2cvMjAyNC8wNS8wMS9vY2FtbC1saW50aW5nPg0KDQpbc2ltNjQyL2R1bmUtbGlu dC1kZW1vXSA8aHR0cHM6Ly9naXRodWIuY29tL3NpbTY0Mi9kdW5lLWxpbnQtZGVtbz4NCg0KDQpk dW5lIDMuMTUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtMy0xNS8xNDQzOC8yPg0KDQoNCkV0aWVu bmUgTWlsbG9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UndmUgcmVsZWFzZWQg My4xNS4xIGFuZCAzLjE1LjIuIFRoZSBsYXR0ZXIgaXMgcGFydGljdWxhcmx5IGltcG9ydGFudA0K ICBmb3IgQ29xIHVzZXJzIHNpbmNlIGl0IGZpeGVzIGEgcmVncmVzc2lvbiBpbiBpbmNyZW1lbnRh bCBjb21waWxhdGlvbg0KICBpbnRyb2R1Y2VkIGluIDMuMTMuMC4NCg0KICBIZXJlJ3MgdGhlIGNv bWJpbmVkIGNoYW5nZWxvZzoNCg0KDQpGaXhlZA0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIEZp eCBvdmVyZmxvdyBpbiBzZW5kZmlsZSBzdHVicyAoY29weSBvZiBsYXJnZSBmaWxlcyBjb3VsZCBm YWlsIG9yDQogICAgZW5kIHdpdGggdHJ1bmNhdGVkIGZpbGVzKSAoIzEwMzMzLCBAdG9ueWZldHRl cykNCiAg4oCiIEZpeCBjcmFzaCB3aGVuIGEgcnVsZSB3aXRoIGEgZGlyZWN0b3J5IHRhcmdldCBp cyBkaXNhYmxlZCB3aXRoDQogICAgYGVuYWJsZWRfaWZgICgjMTAzODIsIGZpeGVzICMxMDMxMCwg QGdyaWRidWdzKQ0KICDigKIgbWVsYW5nZTogcmVtb3ZlIGFsbCByZXN0cmljdGlvbnMgYXJvdW5k IHZpcnR1YWwgbGlicmFyaWVzIGluDQogICAgTWVsYW5nZS4gVGhleSBtYXkgYmUgdXNlZCBhcyBv dGhlcndpc2UgaW4gbGlicmFyaWVzIGFuZA0KICAgIGV4ZWN1dGFibGVzLiAoIzEwNDEyLCBAYW5t b250ZWlybykNCiAg4oCiIHNwYXduOiBmaXggY29tcGF0aWJpbGl0eSB3aXRoIFJIRUw3ICgjMTA0 MjgsIEBlbWlsbG9uKQ0KICDigKIgSWYgbm8gZGlyZWN0b3J5IHRhcmdldHMgYXJlIGRlZmluZWQs IHRoZW4gZG8gbm90IGV2YWx1YXRlDQogICAgYGVuYWJsZWRfaWZgICgjMTA0NDIsIEByZ3JpbmJl cmcpDQogIOKAoiBGaXggYSBidWcgd2hlcmUgQ29xIHByb2plY3RzIHdlcmUgYmVpbmcgcmVidWls dCBmcm9tIHNjcmF0Y2ggZWFjaA0KICAgIHRpbWUgdGhlIGRlcGVuZGVuY3kgZ3JhcGggY2hhbmdl ZC4gKCMxMDQ0NiwgZml4ZXMgIzEwMTQ5LCBAYWxpenRlcikNCg0KDQpiaXRnZW5lcmF0b3JzIHYw LjEuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tYml0Z2VuZXJhdG9ycy12MC0xLTAvMTQ1NzcvMT4NCg0KDQp6b2o2MTMgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBl dmVyeW9uZS4gSSdkIGxpa2UgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlbGVhc2Ugb2YNCiAgW2Jp dGdlbmVyYXRvcnNdLiBUaGlzIGxpYnJhcnkgaW1wbGVtZW50cyBhbiBPQ2FtbCBwb3J0IG9mIE51 bVB5J3MNCiAgYml0Z2VuZXJhdG9yIGludGVyZmFjZSBmb3Igd29ya2luZyB3aXRoIFBzdWVkby1y YW5kb20gbnVtYmVycyAoc2VlOg0KICA8aHR0cHM6Ly9udW1weS5vcmcvZG9jL3N0YWJsZS9yZWZl cmVuY2UvcmFuZG9tL2JpdF9nZW5lcmF0b3JzL2luZGV4Lmh0bWw+KS4NCg0KICDigKIgVGhpcyBs aWJyYXJ5IGltcGxlbWVudHMgc2V2ZXJhbCBQUk5HcyB0aGF0IGFyZSBleHBvc2VkIHRocm91Z2gg dGhpcw0KICAgIGNvbW1vbiBpbnRlcmZhY2UuIEl0IGFsc28gaW1wbGVtZW50cyBhbiBgU2VlZFNl cXVlbmNlJyBtb2R1bGUgZm9yDQogICAgc2VlZGluZyBQUk5HcyB1c2luZyBoaWdoIHF1YWxpdHkg aW5pdGlhbCBzdGF0ZXMgYmFzZWQgb24gdGhlIGlkZWFzDQogICAgZGlzY3Vzc2VkIFtoZXJlXS4N CiAg4oCiIE1vcmV2ZXIsIHRoZSBtb2R1bGUgcHJvdmlkZXMgZnVuY3Rpb25zIHRoYXQgaGVscCBl YXNpbHkgZ2VuZXJhdGUNCiAgICBpbmRlcGVuZGVudCBhbmQgbm9uLW92ZXJsYXBwaW5nIGluc3Rh bmNlcyBvZiBhIFBSTkcgZm9yIHVzZSBpbg0KICAgIHBhcmFsbGVsIGNvbXB1dGF0aW9uIGluIGEg L3JlcHJvZHVjaWJsZS8gbWFubmVyLg0KICDigKIgSW1wbGVtZW50ZWQgUFJORydzIGluY2x1ZGUg W1BDRzY0XSwgW1NGQzY0XSwgW1BoaWxveDR4NjRdLA0KICAgIFtYb3NoaXJvMjU2KipdIGFuZCBb Q2hhQ2hhXS4gQWxsIG9mIHdoaWNoIHBhc3Mgc3RyaW5nZW50IHN0YXRpc3RpY2FsDQogICAgcmFu ZG9tbmVzcyB0ZXN0cyBsaWtlIFByYWN0UmFuZCBhbmQgVGVzdHUwMS4NCiAg4oCiIFRoZSBBUEkg ZG9jdW1lbnRhdGlvbiBjYW4gYmUgZm91bmQgW2hlcmVdDQogIOKAoiBUaGUgc291cmNlIGNvZGUg aXMgaG9zdGVkIG9uIGdpdGh1YjoNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3pvajYxMy9iaXRn ZW5lcmF0b3JzPg0KICDigKIgVGhlIFJFQURNRSBmaWxlIGNvbnRhaW5zIGV4YW1wbGVzIG9mIGhv dyB0aGUgbGlicmFyeSBjYW4gYmUgdXNlZC4NCg0KICBUaGlzIGlzIG15IGZpcnN0IE9jYW1sIHBy b2plY3QgYW5kIHRoZXJlZm9yZSBJIHdvdWxkIGhpZ2hseSBhcHByZWNpYXRlDQogIGZlZWRiYWNr IGZyb20gZXhwZXJpZW5jZWQgdXNlcnMgcmVnYXJkaW5nIGl0J3MgdXNlZnVsbmVzcyBhbmQgcG9z c2libHkNCiAgaG93IGl0IGNvdWxkIGJlIGltcHJvdmVkIChlLmcuIHVzYWJpbGl0eSBhbmQgcGVy Zm9ybWFuY2UpLiBJIHRyaWVkIHRvDQogIGtlZXAgdGhlIGltcGxlbWVudGF0aW9uIGFzIGZ1bmN0 aW9uYWwgYXMgcG9zc2libGUsIHRob3VnaCBub3QgdmVyeQ0KICBzdXJlIGlmIHRoYXQncyB0aGUg YmVzdCBhcHByb2FjaCBoZXJlLg0KDQoNCltiaXRnZW5lcmF0b3JzXSA8aHR0cHM6Ly9naXRodWIu Y29tL3pvajYxMy9iaXRnZW5lcmF0b3JzPg0KDQpbaGVyZV0NCjxodHRwczovL3d3dy5wY2ctcmFu ZG9tLm9yZy9wb3N0cy9kZXZlbG9waW5nLWEtc2VlZF9zZXEtYWx0ZXJuYXRpdmUuaHRtbD4NCg0K W1BDRzY0XSA8aHR0cHM6Ly93d3cuY3MuaG1jLmVkdS90ci9obWMtY3MtMjAxNC0wOTA1LnBkZj4N Cg0KW1NGQzY0XSA8aHR0cHM6Ly9wcmFjcmFuZC5zb3VyY2Vmb3JnZS5uZXQvUk5HX2VuZ2luZXMu dHh0Pg0KDQpbUGhpbG94NHg2NF0gPGh0dHBzOi8vaWVlZXhwbG9yZS5pZWVlLm9yZy9kb2N1bWVu dC82MTE0NDI0Lz4NCg0KW1hvc2hpcm8yNTYqKl0gPGh0dHBzOi8vcHJuZy5kaS51bmltaS5pdC8+ DQoNCltDaGFDaGFdIDxodHRwczovL2NyLnlwLnRvL2NoYWNoYS9jaGFjaGEtMjAwODAxMjgucGRm Pg0KDQpbaGVyZV0NCjxodHRwczovL3pvajYxMy5naXRodWIuaW8vYml0Z2VuZXJhdG9ycy9iaXRn ZW5lcmF0b3JzL0JpdGdlbi9pbmRleC5odG1sPg0KDQoNCmNoZWNrZWRfb2ludCB2MC4xLjANCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWNoZWNrZWQtb2lu dC12MC0xLTAvMTQ1ODAvMT4NCg0KDQpTaW1hIEtpbnNhcnQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBJJ2QgbGlrZSB0byBhbm5vdW5jZSBhIG5ldyBsaWJyYXJ5OiBbYGNoZWNrZWRfb2ludCdd LiBJdCBpbXBsZW1lbnRzDQogIGNoZWNrZWQgYXJpdGhtZXRpYyBmb3IgYm90aCBzaWduZWQgYW5k IHVuc2lnbmVkIGludGVnZXJzIG9mIDgsIDE2LCAzMiwNCiAgNjQsIGFuZCAxMjggYml0cy4gVW5s aWtlIGBzdGRpbnQnIG9yIGBvY2FtbC1pbnRlZ2VycycsIHJvdXRpbmVzIGluDQogIHRoaXMgbGli cmFyeSBlaXRoZXIgcmV0dXJuIGFuIG9wdGlvbiBvciByYWlzZSBhbiBleGNlcHRpb24gd2hlbiBh DQogIHJlc3VsdCBvZiBhbiBhcml0aG1ldGljIG9wZXJhdGlvbiBjYW5ub3QgYmUgcmVwcmVzZW50 ZWQgaW4gYSBkZXNpcmVkDQogIGludGVnZXIgdHlwZS4gSW4gYWRkaXRpb24sIGl0IGNvbnRhaW5z IGFic3RyYWN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nDQogIGFyYml0cmFyeSBpbnRlZ2VycyBhbmQg aW50ZWdlciB0eXBlcyBpbiBhIGdlbmVyaWMgYW5kIHR5cGUtc2FmZQ0KICBtYW5uZXIsIHdoaWNo IEkgZmluZCBxdWl0ZSB1c2VmdWwgZm9yIGNvbXBpbGVyL2ludGVycHJldGVyDQogIGltcGxlbWVu dGF0aW9ucy4NCg0KICBVc2FnZSBleGFtcGxlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg b3BlbiBDaGVja2VkX29pbnQNCiAg4pSCIA0KICDilIIgbGV0ICgpID0NCiAg4pSCICAgbGV0IHgg PSBVOC5vZl9pbnRfZXhuIDUwIGluDQogIOKUgiAgIGxldCB5ID0gVTgub2ZfaW50X2V4biA3MCBp bg0KICDilIIgICBhc3NlcnQgKFU4LmVxdWFsIChVOC5hZGRfZXhuIHggeSkgKFU4Lm9mX2ludF9l eG4gMTIwKSk7DQogIOKUgiAgIGFzc2VydCAoT3B0aW9uLmlzX25vbmUgKFU4Lm11bCB4IHkpKQ0K ICDilJTilIDilIDilIDilIANCg0KICBGZWVsIGZyZWUgdG8gYXNrIGFueSBxdWVzdGlvbnMgaW4g dGhlIGNvbW1lbnRzLg0KDQoNCltgY2hlY2tlZF9vaW50J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9I aXJyb2xvdC9jaGVja2VkX29pbnQ+DQoNCg0KTGlxdWlkc29hcCAyLjIuNSBpcyBvdXQhDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1saXF1aWRzb2FwLTItMi01LWlzLW91dC8xNDU4Mi8xPg0KDQoNClJvbWFpbiBCZWF1eGlz IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTGlxdWlkc29hcCBgMi4yLjUnIGhhcyBv dXQhIEZ1bGwgcmVsZWFzZSBkZXRhaWxzIGFyZSBoZXJlOg0KICA8aHR0cHM6Ly9naXRodWIuY29t L3Nhdm9uZXQvbGlxdWlkc29hcC9yZWxlYXNlcy90YWcvdjIuMi41Pg0KDQogIExpcXVpZHNvYXAg aXMgYSBzdGF0aWNhbGx5IHR5cGVkIHNjcmlwdGluZyBnZW5lcmFsLXB1cnBvc2UgbGFuZ3VhZ2UN CiAgd2l0aCBkZWRpY2F0ZWQgb3BlcmF0b3JzIGFuZCBiYWNrZW5kIGZvciBhbGwgdGhpbmcgbWVk aWEsIHN0cmVhbWluZywNCiAgZmlsZSBnZW5lcmF0aW9uLCBhdXRvbWF0aW9uLCBIVFRQIGJhY2tl bmQgYW5kIG1vcmUuDQoNCiAgVGhpcyBpcyBob3BlZnVsbHkgdGhlICpsYXN0KiByZWxlYXNlIG9m IHRoZSBgMi4yLngnIHJlbGVhc2UgY3ljbGUNCiAgYmVmb3JlIHdlIGtpY2sgb2ZmIHRoZSBuZXcg YDIuMy54JyByZWxlYXNlIGN5Y2xlLiBXZSd2ZSBnb3QgYSBjb3VwbGUNCiAgZmVhdHVyZSB0byBi cmluZyB0aGVyZSBhbmQgdGhlbiBpdCdsbCBiZSByZWFkeSBmb3IgbW9yZSB0ZXN0aW5nLg0KDQog IExpcXVpZHNvYXAgYDIuMi41JyBoYXMgc29tZSBnb29kIGJ1Z2ZpeGVzIGFuZCBzb21lIG1pbm9y IGNoYW5nZXMgYnV0DQogIGl0cyBtb3N0IGV4Y2l0aW5nIGZlYXR1cmUgaXMgdGhlICphdXRvY3Vl KiAuIEl0IHdhcyBkZXZlbG9wZWQgaW4gY2xvc2UNCiAgY29sbGFib3JhdGlvbiB3aXRoIHNldmVy YWwgdXNlcnMuIFRoZSBmZWF0dXJlIGlzIGFuIG9wdC1pbiBjcm9zc2ZhZGUNCiAgZXh0ZW5zaW9u IHRoYXQgY29tcHV0ZXMgdGhlIC9wZXJmZWN0LyBjcm9zc2ZhZGUgdHJhbnNpdGlvbnMgZm9yIHlv dXINCiAgdHJhY2tzLg0KDQogIE92ZXIgdGhlIHllYXJzLCBpdCdzIGJlZW4gdmVyeSBpbnRlcmVz dGluZyB0byBtYWludGFpbiBhbiBhcHBsaWNhdGlvbg0KICBhbmQgbGFuZ3VhZ2UgdGhhdCBpcyBu b3cgcHJldHR5IGxhcmdlIGFuZCBjb21wbGV4IHVzaW5nIHRoZSBPQ2FtbA0KICBjb21waWxlciBh bmQgZWNvc3lzdGVtLiBJdCdzIGFtYXppbmcgdG8gc2VlIGhvdyBlYXN5IGl0IGlzIG5vdyB0bw0K ICBidWlsZCBpbnRlZ3JhdGUgbmV3IHBhY2thZ2VzLiBJdCBhbHNvIGJyaW5ncyBpbiBzb21lIGlu dGVyZXN0aW5nLA0KICByZWFsLWxpZmUgY2hhbGxlbmdlcyBzdWNoIGFzIHNvbWUgdmVyeSBzcGVj aWZpYyBbbWVtb3J5IGlzc3Vlc10uDQoNCiAgTmV4dCwgd2Ugd291bGQgbGlrZSB0byB3b3JrIG9u IG9wdGltaXppbmcgdGhlIGxhbmd1YWdlIGJ5IGludHJvZHVjaW5nDQogIG1vZHVsZXMsIHRvIHJl ZHVjZSB0aGUgc3RhbmRhcmQgbGlicmFyeSdzIG1lbW9yeSBmb290cHJpbnQsIGFuZCB0byB1c2UN CiAgdGhlIG5ldyBPQ2FtbCBwYXJhbGxlbGlzbSB0byBmdWxseSBsZXZlcmFnZSBDUFUgYW5kIG1l bW9yeSB1c2FnZSB3aGVuDQogIHN0cmVhbWluZyBsYXJnZSBhbW91bnQgb2YgZGF0YSBzdWNoIGFz IHZpZGVvIHN0cmVhbXMuDQoNCg0KW21lbW9yeSBpc3N1ZXNdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEzMTIzPg0KDQoNCk9DYW1sIDUuMi4wIC0gRmlyc3QgUmVsZWFz ZSBDYW5kaWRhdGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv b2NhbWwtNS0yLTAtZmlyc3QtcmVsZWFzZS1jYW5kaWRhdGUvMTQ1ODQvMT4NCg0KDQpvY3RhY2hy b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGUgcmVsZWFzZSBvZiBPQ2FtbCA1LjIuMCBpcyBpbW1pbmVu dC4gIEFzIGEgZmluYWwgc3RlcCwgd2UgYXJlDQogIHB1Ymxpc2hpbmcgYSByZWxlYXNlIGNhbmRp ZGF0ZSB0byBjaGVjayB0aGF0IGV2ZXJ5dGhpbmcgaXMgaW4gb3JkZXINCiAgYmVmb3JlIHRoZSBy ZWxlYXNlIGluIHRoZSB1cGNvbWluZyB3ZWVrKHMpLg0KDQogIElmIHlvdSBmaW5kIGFueSBidWdz LCBwbGVhc2UgcmVwb3J0IHRoZW0gb24gW09DYW1sJ3MgaXNzdWUgdHJhY2tlcl0uDQoNCiAgQ29t cGFyZWQgdG8gdGhlIHNlY29uZCBiZXRhLCB0aGlzIHJlbGVhc2UgY29udGFpbnMgb25lIHNtYWxs DQogIGNvbXBpbGVyLWxpYnMgcHJpbnRlciBmaXggYW5kIG9uZSBjb25maWd1cmF0aW9uIHR3ZWFr Lg0KDQogIFRoZSBmdWxsIGNoYW5nZSBsb2cgZm9yIE9DYW1sIDUuMi4wIGlzIGF2YWlsYWJsZSBb b24gR2l0SHViXS4gIEEgc2hvcnQNCiAgc3VtbWFyeSBvZiB0aGUgY2hhbmdlcyBzaW5jZSB0aGUg c2Vjb25kIGJldGEgcmVsZWFzZSBpcyBhbHNvIGF2YWlsYWJsZQ0KICBiZWxvdy4NCg0KDQpbT0Nh bWwncyBpc3N1ZSB0cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cz4NCg0KW29uIEdpdEh1Yl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iLzUu Mi9DaGFuZ2VzPg0KDQpJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBUaGUgYmFzZSBjb21waWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9wYW0gc3dp dGNoIHdpdGggdGhlDQogIGZvbGxvd2luZyBjb21tYW5kcyBvbiBvcGFtIDIuMSBhbmQgbGF0ZXI6 DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNo IGNyZWF0ZSA1LjIuMH5yYzENCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIHNvdXJjZSBjb2Rl IGZvciB0aGUgcmVsZWFzZSBjYW5kaWRhdGUgaXMgYWxzbyBkaXJlY3RseSBhdmFpbGFibGUNCiAg b246DQoNCiAg4oCiIFtHaXRIdWJdDQogIOKAoiBbT0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWFdDQoN Cg0KW0dpdEh1Yl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzUuMi4w LXJjMS50YXIuZ3o+DQoNCltPQ2FtbCBhcmNoaXZlcyBhdCBJbnJpYV0NCjxodHRwczovL2NhbWwu aW5yaWEuZnIvcHViL2Rpc3RyaWIvb2NhbWwtNS4yL29jYW1sLTUuMi4wfnJjMS50YXIuZ3o+DQoN Cg0KRmluZS1UdW5lZCBDb21waWxlciBDb25maWd1cmF0aW9uDQrilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJZiB5b3Ugd2FudCB0byB0d2VhayB0aGUgY29u ZmlndXJhdGlvbiBvZiB0aGUgY29tcGlsZXIsIHlvdSBjYW4gc3dpdGNoDQogIHRvIHRoZSBvcHRp b24gdmFyaWFudCB3aXRoOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQog IOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3aXRjaF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjIu MH5yYzErb3B0aW9ucyA8b3B0aW9uX2xpc3Q+DQogIOKUlOKUgOKUgOKUgOKUgA0KICB3aGVyZSBg PG9wdGlvbl9saXN0PicgaXMgYSBzcGFjZS1zZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9u LSonDQogIHBhY2thZ2VzLiBGb3IgaW5zdGFuY2UsIGZvciBhIGBmbGFtYmRhJyBhbmQgYG5vLWZs YXQtZmxvYXQtYXJyYXknDQogIHN3aXRjaDoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFt IHN3aXRjaCBjcmVhdGUgNS4yLjB+cmMxK2ZsYW1iZGErbmZmYSBvY2FtbC12YXJpYW50cy41LjIu MH5yYzErb3B0aW9ucyBvY2FtbC1vcHRpb24tZmxhbWJkYSBvY2FtbC1vcHRpb24tbm8tZmxhdC1m bG9hdC1hcnJheQ0KICDilJTilIDilIDilIDilIANCg0KICBBbGwgYXZhaWxhYmxlIG9wdGlvbnMg Y2FuIGJlIGxpc3RlZCB3aXRoIGBvcGFtIHNlYXJjaCBvY2FtbC1vcHRpb24nLg0KDQoNCkNoYW5n ZXMgc2luY2UgdGhlIHNlY29uZCBiZXRhDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICDigKIgWyMxMzEzMF06IE1pbm9yIGZpeGVzIHRvIGBwcHJpbnRhc3QnIGZvciByYXcgaWRl bnRpZmllcnMgYW5kIGxvY2FsDQogICAgbW9kdWxlIG9wZW4gc3ludGF4IGZvciB0eXBlcy4gKENo ZXQgTXVydGh5LCByZXZpZXcgYnkgR2FicmllbA0KICAgIFNjaGVyZXIpDQogIOKAoiBbIzEzMTAw XSBGaXggZGV0ZWN0aW9uIG9mIGB6c3RkJyB3aGVuIGNvbXBpbGluZyB3aXRoIGBtdXNsLWdjYycN CiAgICAoRGF2aWQgQWxsc29wcCwgcmV2aWV3IGJ5IFNhbXVlbCBIeW0pDQoNCg0KWyMxMzEzMF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTMxMzA+DQoNClsjMTMxMDBd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMTAwPg0KDQoNCkFubm91 bmNpbmcgREJDYW1sLCBTaWxvLCBTZXJkZSBQb3N0Z3JlcyBhbmQgYSBuZXcgZHJpdmVyIGZvciBw b3N0Z3Jlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5nLWRiY2FtbC1zaWxv LXNlcmRlLXBvc3RncmVzLWFuZC1hLW5ldy1kcml2ZXItZm9yLXBvc3RncmVzLzE0NTg1LzE+DQoN Cg0KRW1pbCBQcml2ZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICA8aHR0cHM6Ly9wcml2ZXIuZGV2 L2Jsb2cvZGJjYW1sL2RiY2FtbC1wcm9qZWN0Lz4NCg0KDQpQcmV0dHkgUHJpbnRpbmcgaW4gT0Nh bWw6IEZvcm1hdCBQcmltZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYmxvZy1wcmV0dHktcHJpbnRpbmctaW4tb2NhbWwtZm9ybWF0LXByaW1lci8x NDU5OS8xPg0KDQoNClZsYWRpbWlyIEtlbGVzaGV2IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSGkgZm9sa3MsIEkgd3JvdGUgYW5vdGhlciArbW9uYWQrIEZvcm1hdCB0 dXRvcmlhbC4NCg0KICA8aHR0cHM6Ly9rZWxlc2hldi5jb20vcHJldHR5LXByaW50aW5nLWluLW9j YW1sLWEtZm9ybWF0LXByaW1lcj4NCg0KICBIZXJlJ3Mgc29tZSBvZiBsYXlvdXRzIHRoYXQgYXJl IGNvdmVyZWQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbW10sDQogIOKUgiAgWyJvbmUi LCAidHdvIiwgInRocmVlIl0sDQogIOKUgiAgWyJvbmUiLA0KICDilIIgICAidHdvIiwNCiAg4pSC ICAgInRocmVlIiwNCiAg4pSCICAgImZvdXIiLA0KICDilIIgICAiZml2ZSIsDQogIOKUgiAgICJz aXgiLA0KICDilIIgICAic2V2ZW4iLA0KICDilIIgICAiZWlnaHQiLA0KICDilIIgICAibmluZSIs DQogIOKUgiAgICJ0ZW4iXV0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBbDQogIOKUgiAgIFtdLA0KICDilIIgICBbIm9uZSIsICJ0d28iLCAidGhyZWUiXSwN CiAg4pSCICAgWw0KICDilIIgICAgICJvbmUiLA0KICDilIIgICAgICJ0d28iLA0KICDilIIgICAg ICJ0aHJlZSIsDQogIOKUgiAgICAgImZvdXIiLA0KICDilIIgICAgICJmaXZlIiwNCiAg4pSCICAg ICAic2l4IiwNCiAg4pSCICAgICAic2V2ZW4iLA0KICDilIIgICAgICJlaWdodCIsDQogIOKUgiAg ICAgIm5pbmUiLA0KICDilIIgICAgICJ0ZW4iLA0KICDilIIgICBdDQogIOKUgiBdDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgWyBbXQ0KICDilIIgLCBbICJv bmUiLCAidHdvIiwgInRocmVlIiBdDQogIOKUgiAsIFsgIm9uZSINCiAg4pSCICAgLCAidHdvIg0K ICDilIIgICAsICJ0aHJlZSINCiAg4pSCICAgLCAiZm91ciINCiAg4pSCICAgLCAiZml2ZSINCiAg 4pSCICAgLCAic2l4Ig0KICDilIIgICAsICJzZXZlbiINCiAg4pSCICAgLCAiZWlnaHQiDQogIOKU giAgICwgIm5pbmUiDQogIOKUgiAgICwgInRlbiINCiAg4pSCICAgXQ0KICDilIIgXQ0KICDilJTi lIDilIDilIDilIANCg0KICBJIHRyaWVkIHRvIHNoYXJlIHNvbWUgb2YgbXkgZXhwZXJpZW5jZSB1 c2luZyBGb3JtYXQuIEFzIGEgYm9udXPigJRKU09ODQogIHByZXR0eSBwcmludGVyLg0KDQoNClNl bmQgdXMgVGFsayBhbmQgV29ya3Nob3AgUHJvcG9zYWxzIGZvciBGdW4gT0NhbWwgMjAyNCBpbiBC ZXJsaW4sIFNlcHRlbWJlciAxNisxNw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zZW5kLXVzLXRhbGstYW5kLXdvcmtzaG9wLXBy b3Bvc2Fscy1mb3ItZnVuLW9jYW1sLTIwMjQtaW4tYmVybGluLXNlcHRlbWJlci0xNi0xNy8xNDYw My8xPg0KDQoNClNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogICpGdW4gT0NhbWwgMjAyNCogaXMgYSAqMiBkYXlzIG9wZW4gc291cmNlIGhhY2tpbmcgZXZl bnQqIGRlZGljYXRlZCB0bw0KICAgT0NhbWwgZW50aHVzaWFzdHMgYW5kIHByb2Zlc3Npb25hbHMu IFdlIGZvY3VzIG9uIHRoZSBpbXBhY3QgYW5kDQogICBwb3RlbnRpYWwgb2YgT0NhbWwgZm9yIHNv bHZpbmcgcmVhbC13b3JsZCBwcm9ibGVtcyBhbmQgZ2V0IHRvZ2V0aGVyDQogICBpbiBCZXJsaW4g Zm9yIGEgY29uZmVyZW5jZS9oYWNrYXRob24gb3ZlciB0d28gZGF5czoNCiAg4oCiIERheSAxIChN b25kYXksIFNlcHRlbWJlciAxNik6IHRhbGtzICh3aGljaCBhcmUgbGl2ZS1zdHJlYW1lZCkgYW5k DQogICAgc29jaWFsaXppbmcvaGFja2luZy4NCiAg4oCiIERheSAyIChUdWVzZGF5LCBTZXB0ZW1i ZXIgMTcpOiBXb3Jrc2hvcHMgYW5kIGhhY2tpbmcuDQoNCiAgVG9waWNzIHdlJ3JlIGludGVyZXN0 ZWQgaW46DQogIOKAoiBob3cgeW91IHVzZSBPQ2FtbCBpbiB5b3VyIGJ1c2luZXNzIC8gaW4geW91 ciBwcm9qZWN0cw0KICDigKIgT0NhbWwgbGlicmFyaWVzLCBmcmFtZXdvcmtzLCBhbmQgb3RoZXIg T3BlbiBTb3VyY2UgcHJvamVjdHMgYnVpbHQgb24NCiAgICBPQ2FtbA0KICDigKIgaGFuZHMtb24g ZGVtb25zdHJhdGlvbnMgdGhhdCBlbmNvdXJhZ2UgcGVvcGxlIHRvIHRyeSB0aGluZ3Mgb24gdGhl DQogICAgc2Vjb25kIGRheSBvZiB0aGUgZXZlbnQgb3IgYXQgaG9tZQ0KICDigKIgc2VlaW5nIGFj dHVhbCBjb2RlIGFuZCByZWFzb25pbmcgYmVoaW5kIGRlc2lnbiBkZWNpc2lvbnMNCiAg4oCiIGV4 cGVyaWVuY2UgcmVwb3J0cw0KDQogIEZvciBtb3JlIGRldGFpbHMsIGNoZWNrIG91dCB0aGUgd2Vi c2l0ZSBhbmQgdGhlIENGUCBsaW5rZWQgZnJvbSB0aGVyZToNCg0KICA8aHR0cHM6Ly9mdW4tb2Nh bWwuY29tPg0KDQogIFJlZ2lzdHJhdGlvbiBmb3IgYXR0ZW5kZWVzIHdpbGwgYmUgYW5ub3VuY2Vk IGxhdGVyIHRoaXMgd2VlayBpbg0KICBhZHZhbmNlLCBidXQgaXMgbm90IG9wZW4geWV0Lg0KDQog IFRoYW5rcyEgOnNwYXJrbGVzOiA6b3JhbmdlX2hlYXJ0OiA6Y2FtZWw6DQoNCg0KT0NhbWwgV29y a3Nob3AgMjAyNCBhdCBJQ0ZQIOKAkyBhbm5vdW5jZW1lbnQgYW5kIGNhbGwgZm9yIHByb3Bvc2Fs cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC13b3Jrc2hvcC0yMDI0LWF0LWljZnAtYW5ub3VuY2VtZW50 LWFuZC1jYWxsLWZvci1wcm9wb3NhbHMvMTQzNzEvNT4NCg0KDQpTb25qYSBIZWluemUgY29udGlu dWVkIHRoaXMgdGhyZWFkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBBcyBtZW50aW9uZWQgYWJvdmUsIHRoZSBzdWJtaXNzaW9uIGRlYWRsaW5lIGZv ciB0aGUgT0NhbWwgV29ya3Nob3AgYXQNCiAgSUNGUCBpcyBnZXR0aW5nIGNsb3Nlci4NCg0KICBB cyBhIG5ldyBub3RlOiBBIGZldyB3ZWVrcyBhZnRlciB0aGUgT0NhbWwgV29ya3Nob3AgYXQgSUNG UCwgdGhlcmUnbGwNCiAgYmUgdGhlIG5ldyBpbml0aWF0aXZlIFtGdW4gT0NhbWxdIGluIEJlcmxp bi4gSXQncyBzdXBlciBleGNpdGluZyB0bw0KICBoYXZlIHRocmVlIE9DYW1sLXJlbGF0ZWQgd29y a3Nob3BzIChmaXJzdCB0aGUgTUwgV29ya3Nob3AgYW5kIHRoZQ0KICBPQ2FtbCBXb3Jrc2hvcCBh dCBJQ0ZQLCBhbmQgdGhlbiBGdW4gT0NhbWwpIG92ZXIgdGhlIGNvdXJzZSBvZiBhIGZldw0KICB3 ZWVrcywgYW5kIHdlJ3JlIGFsc28gdmVyeSBtdWNoIGxvb2tpbmcgZm9yd2FyZCB0byBGdW4gT0Nh bWwhDQoNCiAgV2UndmUgYWxyZWFkeSBtZW50aW9uZWQgdGhhdCB3aGVuIHJlYWRpbmcgdGhlIHN1 Ym1pc3Npb25zLCBhcyBldmVyeQ0KICB5ZWFyLCB3ZSdsbCBjb2xsYWJvcmF0ZSBjbG9zZWx5IHdp dGggdGhlIG9yZ2FuaXplcnMgb2YgdGhlIE1MIHdvcmtzaG9wDQogIGF0IElDRlAsIHdoaWNoIGlu dGVyc2VjdHMgd2l0aCB0aGUgT0NhbWwgV29ya3Nob3Agb24gdGFsa3Mgd2l0aCBhDQogIHN0cm9u ZyB0aGVvcmV0aWNhbCBhbmQgcmVzZWFyY2gtb3JpZW50ZWQgZm9jdXMuIFdlJ2xsIGFsc28gY29s bGFib3JhdGUNCiAgd2l0aCB0aGUgb3JnYW5pemVycyBvZiBGdW4gT0NhbWwgdGhpcyB5ZWFyLCB3 aGljaCBtaWdodCBpbnRlcnNlY3Qgb24NCiAgdGFsa3Mgd2l0aCBhIHN0cm9uZyBwcmFjdGljYWwg Zm9jdXMuIFdpdGggY29sbGFib3JhdGlvbiwgd2UgbWFpbmx5DQogIG1lYW4gcG90ZW50aWFsbHkg dHJhbnNmZXJyaW5nIHN1Ym1pc3Npb25zIGZyb20gb25lIHdvcmtzaG9wIHRvIGFub3RoZXINCiAg YWZ0ZXIgY2hlY2tpbmcgaW4gd2l0aCB0aGUgYXV0aG9ycyAoc2lkZS1ub3RlOiBpZiB5b3Ugd2Fu dCB5b3VyDQogIHByZXNlbnRhdGlvbiB0byBiZSB0YWtlbiBpbnRvIGFjY291bnQgZm9yIGEgcG90 ZW50aWFsIHRyYW5zZmVyLCB5b3UNCiAgbmVlZCB0byByZXNwZWN0IHRoZSBlYXJsaWVyIG9mIHRo ZSB0d28gc3VibWlzc2lvbiBkZWFkbGluZXMpLg0KDQogIEJlc3QsIGFuZCBsb29raW5nIGZvcndh cmQgdG8gdGhpcyBleGNpdGluZyB5ZWFyIG9mIE9DYW1sIHdvcmtzaG9wcywNCiAgQEFybWFlbCBh bmQgQHBpdGFnDQoNCg0KW0Z1biBPQ2FtbF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv c2VuZC11cy10YWxrLWFuZC13b3Jrc2hvcC1wcm9wb3NhbHMtZm9yLWZ1bi1vY2FtbC0yMDI0LWlu LWJlcmxpbi1zZXB0ZW1iZXItMTYtMTcvMTQ2MDM+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhl IG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1h bnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0K ICDigKIgW1dlIEhvc3QgT3VyIEZpcnN0IE9DYW1sIFJldHJlYXQgaW4gSW5kaWEhXQ0KDQoNClt0 aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1dlIEhvc3Qg T3VyIEZpcnN0IE9DYW1sIFJldHJlYXQgaW4gSW5kaWEhXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20v YmxvZy8yMDI0LTA1LTAxLXdlLWhvc3Qtb3VyLWZpcnN0LW9jYW1sLXJldHJlYXQtaW4taW5kaWE+ DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0 byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0K ICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtS U1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBb Y2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0g PG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBh cmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltj YW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0K DQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 30 to May 07, 2= 024.

    Deploying Ocsigen applications

    Hans Ole Rafaelsen announced

    I have written a short text on how Ocsigen applications might be packed in = order to be deployed to other nodes, that don't have your development environment installed.

    Deploying Ocsigen<= /a>

    If you happen to have a better way, or solutions to parts that I have not b= een able to solve, please let me know.

    OCaml linting tools and techniques

    Simmo Saan announced

    Recently, I started wondering about linting tools for OCaml, so I went look= ing. This ended up being a quite extensive survey. Therefore, I decided to publish my findings in a blog post: OCaml linting tools and techniques.

    In particular, I focused on linting with dune and Ppxlib because there's ma= ny variations out there. In the post I describe the technical choices that go into such linters and provide an overview of thos= e that work and how well. In the process of experimenting, I tried them out myself and published them as demos on GitHub: sim642/dune-lint-demo.

    Feel free to let me know if I missed any tools out there or you have any qu= estions/comments. There isn't much information about this out there (and existing tool does it slightly differently), so I hope this = overview benefits others as well.

    dune 3.15

    Etienne Millon announced

    We've released 3.15.1 and 3.15.2. The latter is particularly important for = Coq users since it fixes a regression in incremental compilation introduced in 3.13.0.

    Here's the combined changelog:

    Fixed

    • Fix overflow in sendfile stubs (copy of large files could fail or end w= ith truncated files) (#10333, @tonyfettes)
    • Fix crash when a rule with a directory target is disabled with `enabled= _if` (#10382, fixes #10310, @gridbugs)
    • melange: remove all restrictions around virtual libraries in Melange. T= hey may be used as otherwise in libraries and executables. (#10412, @anmont= eiro)
    • spawn: fix compatibility with RHEL7 (#10428, @emillon)
    • If no directory targets are defined, then do not evaluate `enabled_if` = (#10442, @rgrinberg)
    • Fix a bug where Coq projects were being rebuilt from scratch each time = the dependency graph changed. (#10446, fixes #10149, @alizter)

    bitgenerators v0.1.0

    zoj613 announced

    Hi everyone. I'd like to announce the first release of bitgenerators. This library implements = an OCaml port of NumPy's bitgenerator interface for working with Psuedo-ran= dom numbers (see: https://numpy.org/doc/stable/reference/random/bi= t_generators/index.html).=20

    • This library implements several PRNGs that are exposed through this com= mon interface. It also implements an SeedSequence module for s= eeding PRNGs using high quality initial states based on the ideas discussed= here.
    • Morever, the module provides functions that help easily generate indepe= ndent and non-overlapping instances of a PRNG for use in parallel computati= on in a reproducible manner.
    • Implemented PRNG's include PCG64, SFC64, Philox4x64, Xoshiro256** and ChaCha. A= ll of which pass stringent statistical randomness tests like PractRand and = Testu01.
    • The API documentation can be found here
    • The source code is hosted on github: https://github.com/zoj613/bitgenerators
    • The README file contains examples of how the library can be used.

    This is my first Ocaml project and therefore I would highly appreciate feed= back from experienced users regarding it's usefulness and possibly how it c= ould be improved (e.g. usability and performance). I tried to keep the impl= ementation as functional as possible, though not very sure if that's the be= st approach here.

    checked_oint v0.1.0

    Sima Kinsart announced

    I'd like to announce a new library: checked_oint. It implements checked arithmet= ic for both signed and unsigned integers of 8, 16, 32, 64, and 128 bits. Un= like stdint or ocaml-integers, routines in this l= ibrary either return an option or raise an exception when a result of an ar= ithmetic operation cannot be represented in a desired integer type. In addi= tion, it contains abstractions for manipulating arbitrary integers and inte= ger types in a generic and type-safe manner, which I find quite useful for = compiler/interpreter implementations.

    Usage example:

    open Checked_oint
    
    let () =3D
      let x =3D U8.of_int_exn 50 in
      let y =3D U8.of_int_exn 70 in
      assert (U8.equal (U=
    8.add_exn x y) (U8.of_int_exn=
     120));
      assert (Option.is_none (U8.mul x y))
    

    Feel free to ask any questions in the comments.

    Liquidsoap 2.2.5 is out!

    Romain Beauxis announced

    Liquidsoap 2.2.5 has out! Full release details are here: https://gi= thub.com/savonet/liquidsoap/releases/tag/v2.2.5

    Liquidsoap is a statically typed scripting general-purpose language with de= dicated operators and backend for all thing media, streaming, file generati= on, automation, HTTP backend and more.

    This is hopefully the last release of the 2.2.x release= cycle before we kick off the new 2.3.x release cycle. We've g= ot a couple feature to bring there and then it'll be ready for more testing.

    Liquidsoap 2.2.5 has some good bugfixes and some minor changes= but its most exciting feature is the autocue . It was developed in = close collaboration with several users. The feature is an opt-in crossfade = extension that computes the perfect crossfade transitions for your t= racks.

    Over the years, it's been very interesting to maintain an application and l= anguage that is now pretty large and complex using the OCaml compiler and e= cosystem. It's amazing to see how easy it is now to build integrate new pac= kages. It also brings in some interesting, real-life challenges such as som= e very specific mem= ory issues.

    Next, we would like to work on optimizing the language by introducing modul= es, to reduce the standard library's memory footprint, and to use the new O= Caml parallelism to fully leverage CPU and memory usage when streaming larg= e amount of data such as video streams.

    OCaml 5.2.0 - First Release Candidate

    octachron announced

    The release of OCaml 5.2.0 is imminent. As a final step, we are publishing a release candidate to check that everyt= hing is in order before the release in the upcoming week(s).

    If you find any bugs, please report them on OCaml's issue tracker.

    Compared to the second beta, this release contains one small compiler-libs = printer fix and one configuration tweak.

    The full change log for OCaml 5.2.0 is available on GitHub.=20 A short summary of the changes since the second beta release is also availa= ble below.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.2.0~rc1
    

    The source code for the release candidate is also directly available on:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.2.0~rc1+options <=
    ;option_list>
    

    where <option_list> is a space-separated list of o= caml-option-* packages. For instance, for a flambda and= no-flat-float-array switch:

    opam switch create 5.2.0~rc1+flambda+nffa ocam=
    l-variants.5.2.0~rc1+options ocaml-option-flambda ocaml-option-no-flat-floa=
    t-array
    

    All available options can be listed with opam search ocaml-option.

    Changes since the second beta

    • #13130: Min= or fixes to pprintast for raw identifiers and local module ope= n syntax for types. (Chet Murthy, review by Gabriel Scherer)
    • #13100 Fix = detection of zstd when compiling with musl-gcc (D= avid Allsopp, review by Samuel Hym)

    Announcing DBCaml, Silo, Serde Postgres and a new driver for p= ostgres

    Pretty Printing in OCaml: Format Primer

    Vladimir Keleshev announced

    Hi folks, I wrote another monad Format tutorial.

    h= ttps://keleshev.com/pretty-printing-in-ocaml-a-format-primer

    Here's some of layouts that are covered:

    [[],
     ["one", "two", "three"],
     ["one",
      "two",
      "three",
      "four",
      "five",
      "six",
      "seven",
      "eight",
      "nine",
      "ten"]]
    
    [
      [],
      ["one", "two", "three"],
      [
        "one",
        "two",
        "three",
        "four",
        "five",
        "six",
        "seven",
        "eight",
        "nine",
        "ten",
      ]
    ]
    
    [ []
    , [ "one", "two", "three" ]
    , [ "one"
      , "two"
      , "three"
      , "four"
      , "five"
      , "six"
      , "seven"
      , "eight"
      , "nine"
      , "ten"
      ]
    ]
    

    I tried to share some of my experience using Format. As a bonus=E2=80=94JSO= N pretty printer.

    Send us Talk and Workshop Proposals for Fun OCaml 2024 in Ber= lin, September 16+17

    Sabine Schmaltz announced

    Fun OCaml 2024 is a 2 days open source hacking event dedicate= d to OCaml enthusiasts and professionals. We focus on the impact and potent= ial of OCaml for solving real-world problems and get together in Berlin for= a conference/hackathon over two days:

    • Day 1 (Monday, September 16): talks (which are live-streamed) and socia= lizing/hacking.
    • Day 2 (Tuesday, September 17): Workshops and hacking.

    Topics we're interested in:

    • how you use OCaml in your business / in your projects
    • OCaml libraries, frameworks, and other Open Source projects built on OC= aml
    • hands-on demonstrations that encourage people to try things on the seco= nd day of the event or at home
    • seeing actual code and reasoning behind design decisions
    • experience reports

    For more details, check out the website and the CFP linked from there:

    https://fun-ocaml.com

    Registration for attendees will be announced later this week in advance, bu= t is not open yet.

    Thanks! :sparkles: :orange_heart: :camel:

    OCaml Workshop 2024 at ICFP – announcement and call fo= r proposals

    Sonja Heinze continued this thread

    As mentioned above, the submission deadline for the OCaml Workshop at ICFP = is getting closer.

    As a new note: A few weeks after the OCaml Workshop at ICFP, there'll be th= e new initiative Fun OC= aml in Berlin. It's super exciting to have three OCaml-related workshop= s (first the ML Workshop and the OCaml Workshop at ICFP, and then Fun OCaml= ) over the course of a few weeks, and we're also very much looking forward = to Fun OCaml!

    We've already mentioned that when reading the submissions, as every year, w= e'll collaborate closely with the organizers of the ML workshop at ICFP, wh= ich intersects with the OCaml Workshop on talks with a strong theoretical a= nd research-oriented focus. We'll also collaborate with the organizers of F= un OCaml this year, which might intersect on talks with a strong practical = focus. With collaboration, we mainly mean potentially transferring submissi= ons from one workshop to another after checking in with the authors (side-n= ote: if you want your presentation to be taken into account for a potential= transfer, you need to respect the earlier of the two submission deadlines).

    Best, and looking forward to this exciting year of OCaml workshops, @Armael and @pitag

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=hmcJE7JF; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=FwgOPA1u; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 793E3B80123 for ; Tue, 14 May 2024 14:25:53 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=DU7SaaldrLnHtykJSmSdauwNTCfLwXQ/kc1k3iMC4fw=; b=hmcJE7JFzmBr4M6gpQL82FjWiQm8hScfe86cNkqpjFPPdQ2lB9ylDnD0 cYtUt3iiM85JqfZRxOJN8BN8wjf+oKuhHjuglRpo0SNysc4mXWT5Opwds FhH5LzKPP4AEtU4hkZvQgjFWdCqFg12bovCmLUP3+8IG0H3hAXrsACa3D g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,159,1712613600"; d="scan'208,217";a="165668110" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 May 2024 15:25:52 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id B7A7FE0CE2; Tue, 14 May 2024 15:25:51 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 76400E004E for ; Tue, 14 May 2024 15:25:47 +0200 (CEST) IronPort-SDR: 66436659_koSa0hxiJpGXqA7oRdy+TRNNlU5TQTv2gyMNIMf+EyDEHQK HMjR7y2I0F6tpbptO9DiAmDElDJK56Vqhrx6HvA== X-IPAS-Result: =?us-ascii?q?A0FcBABfZUNmkCIeaIFagliBQVsoGQFiWDMHCEgDAYQWP?= =?us-ascii?q?INPjhuBFQGFVoNehnyIQYQpgQAdORQBAwENLgEOBAECBAEBAwECAYILgi5GA?= =?us-ascii?q?haIKgIfBgEEMwYOAQIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABA?= =?us-ascii?q?QEBAQEgHhAOJ4V0DYJKLiNrZQk3AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAgwBgQAODgEIBAYTAQEtBQYYFA8DFAEGAwIED?= =?us-ascii?q?QE1AwEmFAaCDlgBgmQDBQwGlHObO3p/M4EBggwBAQaBCD4CAQIJAgIDAQ4JJ?= =?us-ascii?q?QHaBIFjCQ0CgTmDEYR6CRoBJEgEZQKCJoIIhDcnD4FVRIEVNYFzSgdvghA0B?= =?us-ascii?q?gsMAQEBAQEXRGABAQIGCTwJgyWCaYYQJoFrAYJQgn1XFXKCXoEaa22BCC8Ya?= =?us-ascii?q?4JDK4ECeQIGFggCgQ9ZWQ9agToUQgIMgS1Nhi+BS0szIRMBVRMXCz4JFgIWA?= =?us-ascii?q?xsUBDAPCQsmKgY2AhIMBgYGWSAWCQQjAwgEA0QDIHERAwQaBAsHdYFAgWsEE?= =?us-ascii?q?0QDgTiHH4JWgzuCHoQfS4R0gXYOYYpGHUADC209NRQbKKMRBDUCKoJLDiwFA?= =?us-ascii?q?QwBARo9CRMaAQcDCRYCGAgCJAoILQwKGREIDQUJAwERBwEOHwkCBQYGKZIwC?= =?us-ascii?q?wkQGCoDjxmhaGw0B4QWgVsGDIh9gSSVa4QFgVaJa4E9lyCCESKYQIJUgnOEK?= =?us-ascii?q?gqBGwlegQ5phRiEa4s/E4FEg3qBeyRJYgEBGQEOBzMaMEMNAgQLghUBHBcJF?= =?us-ascii?q?jAcD48zgmhBfS2CbjvDGEE1AgEBBwcpAgcBCgEBAwmFYgEBgwoCJgQIgUgBA?= =?us-ascii?q?Q?= IronPort-PHdr: A9a23:9V8kgBFBJeVLNQb6LLM7b51Gf2lDhN3EVzX9CrIZgr5DOp6u447ld BSGo6k33RmTAduQtqIMotGVmp6jcFRD26rJiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wE ZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZrKeTpAI7SiNm82/yv95HJbAhEmj6wbalsI Bi5rAjduckbjIh/Iast1xXFpWdFdOtRyW50P1yfmAry6Nmt95B56SRQvPwh989EUarkeqkzU KJVAjc7PW0r/cPnrRbMQxeB6XsaSWUWjwFHAxPZ4xHgX5f+qTX1u+xg0ySHJ8L2TLQ0WTO/7 6d3TRLjlSkKOyIl/GzRl8d/i79VoA+6pxxn3YHbfJ2VOvR5fqPYZ9waRGxBVdtVWyFOBo6wa o0CBPcDM+lFtYnwv1sAowWjCweiB+3gxSNHi2Ts0qEmyeksCx3K0BAiEt8IrX/arM/1NKAXU e2t0KTIyS/Mb/VL0jng9IfIchUhofCQXbJsbMHczlMgFwffgVWWs4DlJC+a1uQIs2ia8+pgS fmii3YgqwF1ojmv2tkjhZXJhoITy1DE7Dh5z5gvKd2/Uk57bsepHZ1NvC6VK4V4WNktQ310u Ckk0L0Gv4a2cSsWxJk52hPTd/KJf5aK7x/gUOucPDV1iXx5dL6hmRq+71WtxvDyW8SqzVpGs DdJnsfCuHwQyxDe6ceJR/9h80qnxD2B2QfT6uReLkA1k6rWM4YhzaAslpoSrUTMADf2mELzj K+TaEoo4O6o5Pr7Yrn+oZ+TK5V7igT6Mqg0ncy/G+s4PhABX2ia5eS81KDj8lbjTLpWif02l 7HVsJ/bJcQHpq65HhRa3pw55xmjCDem1cwUnXcGLFJKfRKIlZLlNE3JIPD9Ffu/h06jkDJwy P/bJLLhDJLNLn/ZnLj9erZ97lZQyBYpwtBF5pJbF68OIOnpVkDts9zYCwc1MwKzw+b9DdV9z ZkSWW2LAqCHKK/Svl6I5v4rI+aWf4AZoiryK/8g5/L2g342h0QScrOy3ZsMdn+4G+9pI0GZY Hb2hdcBC2gKshI5TOz0llKCSyBTZ3esUKMy/D07DZ+pAZ/dSYGinLOOwj+7HoFXZmBBDFCMC m3kd4CZVPoKdSmcIddhnyQZWbS/T4ItzwyiuBP1xrZ9IOfY5jcUuJzs2dRt+uHemww++SZqA 8md3GyBVX94kn4SSzMo061ypUpwwUqd3Kh8nvxYDsBT6O1TUgknNJ7dzvJ1BsjuVg/HY9yHU kypQs+8DjE0Vt8xw8EBY0J6G9i6ixDC0DemD6UNl7yMAJw18r7c0GbtKMZ9zXbG1bAhj0Q4T cdVMm2mnKF/+xDSB47PjUqZi76nebkC0CPJ7muP0HaCsU5CXAN+TanJR34Sa0TOodT8/EzCT ruuCbo9MgtGzM6PMrZEZMH0g1laXPrsOsjebmavl2qoAhiG2quBbJLte2UZ3CTdFFYLnBwT/ XaANAg+HzqhrHzEADxpD1LvbFvh/vN6qHyhSE841RqKYFFh17qw+x4VmeCcRugI0bIDpSchr Sl7E0im397MDtqNqAVgcL9bYdMn71dLzWTZuBdlMZy6M69inkIecxhwv072yhl7Ep9AntQyr HM20ApyLrqV309beDOd2ZD8I7nXKmjp/BCzcKPWwVHf0NOO+qgV8vg4qlPjvBuoFkU46Xln3 cNVgDOg4cDBBQ8WFJbwSVof9h5gpricbDNuyZnT0ChFNaCy+gTJ29coGPdtnh+kdtEZK6iEE Q7uD+UCAMy/NOEhm16odw8JeudI+/hnbIuda/Ka1fvzb65blzW8gDEbseiVs2qJ/it4EKvT2 oodhuuf1U2BXiv9i1Gotob2n5pFbHccBDn30jDqUahWYKA6ZoMXESG2OcTiz9F3gdj2UH5d9 UK/L0sB3N61dBGSaV3kwAAW0l4Y8jS8gSXt9zVviHkyq7aHminHwuDsbh0Cb1VxfzE3vEu9e 92RtYUCW0y5cwUilB2k/Fv3ga9Bq/F2K2DVB1xDfy33M31KWKytsLGPeIhKtINutj9YA6yne V7PcrfmuFMB1j/7WWtTwDdubzaxppDwhAB3kkqYPC81tH3daN19zhfZ5cXBSLhWxDVuqDBQr z7RCxD8OtCo+Y/RjJLfqqWkUGnnUJRPcC7txIfGtS2h5GQsDwft1/a00sbqFwQ3y0qZn5FjS DnIoRDgY4Lqy7XyMORpeVNtDUP97MwyE593k485jpUdkXYAgZDd8X0CmGb1edJVvMC2JHMJT DhN2NXV5Qn5xGV7KXaY24/yVnOc29ZsId6gbSJe2y4w6dxLFLbB9KZNzk4X6hKzqQPcZ+Q4n y9IkKF/ridC36dS4Ex2knb4YPhaB0RTMC3ymg7d6tm/qP8Sf2Ozaf2q00E4m9m9DbaEqwUaW XDje55kEzUji6c3eF/KznD37ZnpPdfKatdG/CauqE+VvvQEcscUrK8Sgi52JW/2vXsk0vM2y xt00sSzuIGBbX5m/Ke4HgJwPDroYcge4Xfo0bYYmdyZldPKfN0pCnAQUZ3kQOj9WjsWvPKhL A2OFTwgtl+DHr7OAQKU6EFntm/CVZexODvEQRtRhcUnTx6bKktFhQkSVzhvhZ81GDehw8n5e Vt47DQcjrLhgiNF0fkgdxz2U2OF4Rytdi9xUp+Uahxf8gBF4U7Rd82Y9ON6WS9CrNWtqwmEK 2rTYAotbylBYXa/XwXSIuj0sPz6pvCfAvuiIvDOZ7SXtOEYUO2HkJur240g5D2MM8STIlFoC OA90UdYG3UlC4LegTpqKWRfmy/WbsGdrQux4WUu9JH5qay3Hlm3o9DTQ7JJec1i4RW3nbuOO 6aLiSB1JCwZs/FEjX7Exb4D3UID3iRndj2jC7MF5mbGSKPdnLMSDgZOMnkicpIQs+Rnhk8WZ Z2+6Ju9zLNzg/8rBk0QUFXgnpvsfskWOySnM1iBAk+XNbOALDmNwsftYKr6R6cD6Ycc/xC2p zufFFfuezqZkDy8HSuVCrkZvT3KZkl7gtSldRJ8FWXoTNTncwC2dthtgmg/xbQywGjBNWsdL SRUeURQqLad9mVd3uU5HHZOpCkAT6HMi2OC4u/UJ4xD+8BROXwhpv4LuiEf8e5N6yVVWPF+m C3Tt8Nj5Va8nbyGzjNhFgFFqjNKmJ6jt0J/P67U7d9FBWaC+wgCpzb1aVxCt55uDdvhvLpVw 97EmffoKTtMxNnT+NMVG8neLM/UeGpkKxfiHyTYSRcUVTP+f3+KnFRTybvBkx/d5oh/sJXnn 4ACD6NWREBgXO1PEVxrRZRBIY8rDGp+wPjC1JJOviL490WZB8RC4sKeDKPUWK2zbm3By+IZA nlAifD5NdhBZ9S9ghY7LAcg2t2SRAKTXMgT8Hc5NlZm/BxBqCp3HDI61h+3OF2hvy9BTqXR/ FZ+yQpmP7Z3rG+1sQtuKgKY/XlhzEU8y4e62m6dImGtc//4GIhSD2CcW1EZCprgWE41aASzm RYhLzLYX/dLiLAmc2l3iQjasJ8JGPhGTKQCbgVCjf2QYvwp1xxbpEDFjQdf4vDZDJJ5iAYwW Zu89jRY3AZycNM+JarRPbdEiF9KieqCszSp2eY43AIFbx9XoSXLIHJO4xRObeVuLjHNnKQk8 QGYnjpfZGUAH+EnpP5n7AJ1OuiNyT7hz68WKk21ML/XJKeYtm7c0M+QFwpqhwVRzxUDpuAwi ptwFijcH1oix7aQCRkTYM/LKAUPKtFX6GCWZyGF9+PE3ZNyOYy5UOHuV+6H8qgO0SfGVE4kG ZoB6sMZE9yiykbdeI3cFoVdnCQxtV6+AW/QFPNNaQ6GmzcBotiiwdlwx4YILzUUByNmOiWy5 6rLjgUtnfyIUcxwZysKGIweOThlPa/y0z4cpHlGADSth6gBzxOe6jbnuinKJDzsNpx7Y/OFe R5nCNe34Cgyta+shhSEl/eWb3G/PtNktNjV7OocrJvSEPJYQ452tELEkpVZTXinACbfVMS4L J/qZ8wwfMT5XzykB0enhWt/HKKTdJ69a7KFigbyScNIvZmHiXo9YNSlGGhWEl81ruUHrsqUg CUbZJ4qfRPjtwI/LrGyZgCC3Yf2K45CATFRUv9UwP78YuBHiS02Yb3joJPBZpQqlq+v9kocW JwBjhff3OuuIY5EXnqqckE= IronPort-Data: A9a23:vIIOsK5OTkIjIZDrhNP70AxRtJbDchMFZxGqfqrLsTDasY5as4F+v moXDT/VP/jYamr0eNh0bt6w/BwE6MDTm4UwSAps/39kZn8b8sCt6faxfh6hZXvKRiHgZBs6t JtGMoGowOQcFCK0SsKFa+C5xZVE/fjUAOC6UoYoAwgpLSd8UiAtlBl/rOAwh49skLCRDhiE0 T/Ii5S31GSNhXgsYgr414rZ8Ekz5Kmr42tC1rADTakjUGH2xyF94K03fvnZw0vQGuF8AuO8T uDf+7C1lkuxE8AFV7tJOp6iGqE7aua60Tqm0hK6aID+6vR2nRHe545gXBYqhei7vB3S9zx54 I0lWZVd0m7FNIWU8AgWe0Ew/y2TocSqUVIISJSymZX78qHIT5fj69BlCmUrGZURweApM0Jpz tAfChwPUh/W0opawJrjIgVtrsEzdY/zO4cOpnxrzTfYFOsrB5fZTM0m5/cBhmZ235gSW62GI ZFFAdZsREyojxlnAW0sUMcPgLby01zFJiVfrEOJqKE35WnK0QE316LiZdPRc9rMXs5Vm0eEu krM+Hn/CRwBctnD2XyC6H3EaurnxH2mBtxCTO3gnhJsqGOun3E2JB08bGGQufno0lKnSY9UJ 0NBr0LCqoBpqRD1FYalN/Gim1aPtxsYHt5RCPES8xCI0qOS4gCDB2FCQCQpVTA9nMomHHoy0 VuYg97iBTpuqaCYD3WH+d94sA9eJwAwJmkmeAscRDADvevAh7ofiTDjTOpsRfvdYsLOJRn8x DWDrS4bjroVjNIW26jTwbwhq2z3znQuZlNujjg7Tl6YAhVFiJmNSbbA1LQ2xfNQdcCBSV2Qo HUPm86f9f0DS5aXm0Rhodnh/pn3vZ5p0xWF3zaD+qXNERz3pxZPmqgLuFlDyL9BaJpsRNMQS Ba7VfltzJFSJmC2SqR8fpi8Dc8npYC5So24CKqLPoYUMscpHONiwM2ITRDLt4wKuBV3+ZzTx b/BGSpRJShHVP85pNZIb75HidfHORzSNUuIGMyllEv/uVZvTHOeTrMIeEOJavEl4aiEpgTM7 tsXOtORwA03bQENSnS/zGLnFnhTdSJTLcmv+6R/KLXZSiI4Qz5JNhMk6e99E2CTt/8PzbagE 7DUchMw9WcTclWbcVnTOi8+N+y3NXu9xFpiVRER0Z+T8yBLSe6SAG03LfPbpJF2pbQx/u0+V PQfZcSLD9JGTzmNqXxXboDwoMYmPF6njB6HdXjtKjUuXY9SdyqQ8P/dfyzr6HYvCAizvpAAu LGO7F7QbqcCYAVAN/zoTsyT4Wm/hlUjvd5jflDpJ4BTcXr88YIxJC3WiOQ2Ev42Kh7C52W70 l/KJCxFuuOXs9I53+fLjI/Zt4yZLe9aGxtLLXj69pezDzHRpUC48L9DUcGJXDHTb3z186Ocf tdoz+nwHfkEvVRSua9uOu9P4YNnwPW3vJ5c7ABvPEuTXmSRErk6f0W3h5hehJNC1ppymFWQW HvW3vJ4JL/QGsfuMGBJFTofdu7ZiM0lwGjD388Ufnf/yjR8poeccENoOBKJtixRAZ11PK4hw sYjoMQm0BO+uDV7Lue5ij1oyErUIkwiS6kHsrQoML3vgCcvyXBAZsX4IQ3y65etdd5NExcLJ hm5uan8vIlfl3HyKycLKXvw3ORmlcsvvjJOxwQ8PFinoIfOqcI2+xxzyg4JaDpp4C9J6d8uB VgzBXZJff2P2xxKmPl8W3udHlAdJR+BpW305Vg7tEzYaEiKV2aWEnAMY9if2EVBq293IyZQ+ bqZ7E3HUj/aWt778QVveExiqt3lFcdQ8C+bku+ZPs21JbsIShu7vb2PPE0m8wDGB+E1j235/ dhaxv56M/DHBHRBsp8FBJm//pVObhK9fUhpY+xrpYENFkHiIACC4yCEcR2NS5kcNs7x0BGKD uJ1LZhyTDW47iGFqw4bCYMqI7NZmP0I5sIISoj0JFwp4qeukT50jK3+riTOpncnY9FLo/YPL on8czGjEGvJoVB2n2TLjtdPO0vmQN0iSTD/4tuI87QyJ8peiN1vTEA86avrnnO3NAA8wQmYk jmebIDrzstj679Woa3SLot5CT6ZE+jDDNazzFjrsvBlT8/+DsPVhgZE9njlJ1t3OJUSafRWl JOMksH9hlOYsJkIUWn2xoGKJ5dNwcDjTdhGE9nWKUNClnCoQ/7c4Bok+kG5J6dWkdhb2NKVe gugZOa0dv8XQ914xkAJWxNBEh0YNbv7Xp3gqQy5sf6ILBoXii7DE/+K6l7rajt9WhITGpijF DLxhemi1upYoKtIGhUAIfNsWL18AV37XJoZZ8/DjiaZAkaok2G9lOPbzzR40g7yC16ADMrey rDGTEKndB2N5Yf5/OsAuIl25hAqHHJxhNcrRX0k+vl0tiubCVAXJuFMILQEDZBpyhbJ7q/aX w2UTmUeCnTaZw9mICXMuIGpGk/VA+EVId72KwA4507eOW/8GIqEB6An7St6pWt/fjz41uy8N NUC4TvKMwOsxo1yD/MmjhBhbTyLGtuBrp7Jxaz8ryA2KxMOWPMS03hwAAdGVSrGCtzA0kLRK gDZgEhaFVqjRxeZ/dlIIhZo9NMx5VsDDAnEqQ+Fx8vZsIiAiugc2Lv4Ie6bPngrcpERPLBXL Z/obzLl3o1Vs0D/fYMxvNY4naJ/CfSKB9W3aqj5SmX+Wk12BnsPZ6s/oMbEcC3uFMOz3b8Qe vlALkXS3Hi4FX0= IronPort-HdrOrdr: A9a23:LQhr76EBt0NhxyDlpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:i8Qtcm7nKaCW4s4sdNss0UUSPt0BanTmyiniAGiDJWFLZL+pRgrF X-Talos-MUID: =?us-ascii?q?9a23=3AuG3awQ2c+zJVY+4QZYZVYtjGCjUj3Zn3FWUhkb8?= =?us-ascii?q?/geKcNX0oJy6P0T+7Tdpy?= X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.08,159,1712613600"; d="scan'208,217";a="165668080" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEbNph3e2bNKaI3SqiW7GjMER4Fd5Tf0P+yX0?= =?us-ascii?q?mFldvYHq07viQ1VSdb48e5HkVGzb6HxbFZVQ/0olrRd9R4/qoj5cppWr?= =?us-ascii?q?3cHrIoC/QpMVdKGUxA70JJHwd8R5TK0j29Bn8+RqcRkdQam5rS6ccK3o?= =?us-ascii?q?8JSdc79YD6WPADBo+UG2m2uQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 May 2024 15:25:45 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A88B1564A14 for ; Tue, 14 May 2024 15:25:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1715693144; bh=6eq0mNVyEKdtY/LdLi79KG99RwTpiPRP2dVgPSEdneE=; h=From:To:Subject:Date:Message-ID; b=FwgOPA1u/ex3HjolUG2RsdHwBnluelmC/24Bvqqwuz2iPz/sbuxf+kuNmqgtDWZWH vNo5vyy6iwT8xUcR6XGHiN2KJ73AtebsisrmCqbj1kWY1QjRM9bqiGDtnnGiL5c4V8 /r0rZuA/J4hU3fkjt4O+IOrhN6Gz6zM+IaQyH42g= From: Alan Schmitt To: caml-list@inria.fr Date: Tue, 14 May 2024 15:25:44 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 14 15:25:45 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.438612, queueID=E9CD0564A16 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19128 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDA3IHRvIDE0LA0KMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTb21lIGNvZGUg Zm9yIE1vbGVjdWxhciBNZWNoYW5pY3MgaW4gT0NhbWwNCk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBB cHJpbCAyMDI0DQpFeGFtcGxlIG9mIHVzaW5nIExTUCBzZXJ2ZXIgaW4gRW1hY3MNCkR1bmUgRGV2 ZWxvcGVyIEV4cGVyaWVuY2UgRmVlZGJhY2sgRm9ybQ0KRGtNTCAyLjEuMQ0KQSBNYXkgdXBkYXRl IG9uIHdhc21fb2Zfb2NhbWwNCk9DYW1sIDUuMi4wIHJlbGVhc2VkDQpPbGQgQ1dODQoNCg0KU29t ZSBjb2RlIGZvciBNb2xlY3VsYXIgTWVjaGFuaWNzIGluIE9DYW1sDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NvbWUtY29kZS1mb3It bW9sZWN1bGFyLW1lY2hhbmljcy1pbi1vY2FtbC1hbm4vMTQ2MTAvMT4NCg0KDQpVbml4SnVua2ll IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgUmVjZW50bHksIEkgcmVsZWFzZWQgYSBidW5jaCBvZiBjb2Rl IGZvciBzb21lIE1vbGVjdWxhciBNZWNoYW5pY3MNCiAgY2FsY3VsYXRpb25zIGluIE9DYW1sLg0K DQogIFRoaXMgaXMgcHJldHR5IG11Y2ggYXQgdGhlIGJldGEgc3RhZ2UgZm9yIHRoZSBtb21lbnQu DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9Vbml4SnVua2llL01NTz4NCg0KICBNYXliZSBpbiB0 aGUgZnV0dXJlIEkgd2lsbCBjcmVhdGUgYSBwcm9wZXIgbGlicmFyeSB0byBlbmNhcHN1bGF0ZSB0 aGUNCiAgTW9sIGFuZCBNb2wyIG1vZHVsZXMgaW4gdGhlcmU7IHRoZXkgYWxsb3cgdG8gcGVyZm9y bSBzb21lIG9wZXJhdGlvbnMNCiAgb24gc21hbGwgbW9sZWN1bGVzLg0KDQogIEZvciB0aG9zZSBp bnRlcmVzdGVkLCB0aGVyZSBpcyBhIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlDQogIFVu aXZlcnNhbCBGb3JjZSBGaWVsZCAoVUZGKSBpbiB0aGVyZTsgb25seSB0aGUgcGFydCBjb25jZXJu aW5nDQogIG5vbi1ib25kZWQgaW50ZXJhY3Rpb25zLg0KDQoNCk9DYW1sLm9yZyBOZXdzbGV0dGVy OiBBcHJpbCAyMDI0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLW9yZy1uZXdz bGV0dGVyLWFwcmlsLTIwMjQvMTQ2MTEvMT4NCg0KDQpTYWJpbmUgU2NobWFsdHogYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBXZWxjb21lIHRvIHRoZSBBcHJpbCAyMDI0IGVkaXRp b24gb2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyISBUaGlzDQogIHVwZGF0ZSBoYXMgYmVlbiBj b21waWxlZCBieSB0aGUgT0NhbWwub3JnIHRlYW0uIFlvdSBjYW4gZmluZCBbcHJldmlvdXMNCiAg dXBkYXRlc10gb24gRGlzY3Vzcy4NCg0KICBPdXIgZ29hbCBpcyB0byBtYWtlIE9DYW1sLm9yZyB0 aGUgYmVzdCByZXNvdXJjZSBmb3IgYW55b25lIHdobyB3YW50cw0KICB0byBnZXQgc3RhcnRlZCBh bmQgYmUgcHJvZHVjdGl2ZSBpbiBPQ2FtbC4gVGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyDQogIHBy b3ZpZGVzIGFuIHVwZGF0ZSBvbiBvdXIgcHJvZ3Jlc3MgdG93YXJkcyB0aGF0IGdvYWwgYW5kIGFu IG92ZXJ2aWV3DQogIG9mIHRoZSBjaGFuZ2VzIHdlIGFyZSB3b3JraW5nIG9uLg0KDQogIFdlIGNv dWxkbid0IGRvIGl0IHdpdGhvdXQgYWxsIHRoZSBhbWF6aW5nIHBlb3BsZSB3aG8gaGVscCB1cyBy ZXZpZXcsDQogIHJldmlzZSwgYW5kIGNyZWF0ZSBiZXR0ZXIgT0NhbWwgZG9jdW1lbnRhdGlvbiBh bmQgd29yayBvbiBpc3N1ZXMuIFlvdXINCiAgcGFydGljaXBhdGlvbiBlbmFibGVzIHVzIHRvIHNv IG11Y2ggbW9yZSB0aGFuIHdlIGNvdWxkIGp1c3QgYnkNCiAgb3Vyc2VsdmVzLiBUaGFuayB5b3Uh DQoNCiAgVGhpcyBuZXdzbGV0dGVyIGNvdmVyczoNCiAg4oCiICpPQ2FtbCBDb29rYm9vazoqIFdl IHNoaXBwZWQgYSBuZXcsIGNvbW11bml0eS1kcml2ZW4gc2VjdGlvbiBpbiB0aGUNCiAgICAgTGVh cm4gYXJlYS4gSGVscCB1cyBtYWtlIGl0IHJlYWxseSB1c2VmdWwgYnkgY29udHJpYnV0aW5nIGFu ZA0KICAgICByZXZpZXdpbmcgcmVjaXBlcyBmb3IgY29tbW9uIHRhc2tzIQ0KICDigKIgKkNvbW11 bml0eSAmIE1hcmtldGluZyBQYWdlcyBSZXdvcms6KiBXZSBoYXZlIFVJIGRlc2lnbnMgZm9yIHRo ZQ0KICAgICByZXdvcmtlZCBhbmQgbmV3IHBhZ2VzIG9mIHRoZSBjb21tdW5pdHkgc2VjdGlvbiBh bmQgYXJlIHN0YXJ0aW5nDQogICAgIHdvcmsgdG8gaW1wbGVtZW50IHRoZXNlLg0KICDigKIgKkdl bmVyYWwgSW1wcm92ZW1lbnRzOiogQXMgdXN1YWwsIHdlIGFsc28gd29ya2VkIG9uIGdlbmVyYWwN CiAgICAgbWFpbnRlbmFuY2UgYW5kIGltcHJvdmVtZW50cywgc28gd2UncmUgaGlnaGxpZ2h0aW5n IHNvbWUgb2YgdGhlDQogICAgIHdvcmsgdGhhdCBoYXBwZW5lZCBiZWxvdy4NCg0KDQpbcHJldmlv dXMgdXBkYXRlc10gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL29jYW1sb3JnLW5ld3Ns ZXR0ZXI+DQoNCk9wZW4gSXNzdWVzIGZvciBDb250cmlidXRvcnMNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIFlvdSBjYW4gZmluZCBbb3BlbiBpc3N1ZXMgZm9yIGNvbnRyaWJ1dG9y cyBoZXJlXSENCg0KICBIZXJlJ3Mgc29tZSBuZXcgKGFuZCBhcyBvZiB0aW1lIG9mIHdyaXRpbmcg dGhpcyBuZXdzbGV0dGVyIHN0aWxsIG9wZW4pDQogIGlzc3VlcyB0aGF0IHdlcmUgb3BlbmVkIHRo aXMgbW9udGg6DQoNCiAg4oCiIFBhY2thZ2UgVmVyc2lvbnMgcGFnZSBpcyBtaXNzaW5nIGRhcmsg bW9kZSBzdHlsZXMNCiAgICBbb2NhbWwvb2NhbWwub3JnIzIzNDFdIGJ5IFtAc2FiaW5lXQ0KICDi gKIgKERhdGEpIEV4dGVuZCB0aGUgRGF0YSBNb2RlbCBvZiBBY2FkZW1pYyBJbnN0aXR1dGlvbiB0 byBSZWNvcmQNCiAgICBJbmZvcm1hdGlvbiBhYm91dCBDb3Vyc2UgTWF0ZXJpYWxzIFtvY2FtbC9v Y2FtbC5vcmcjMjMyOF0gYnkNCiAgICBbQHNhYmluZV0NCg0KDQpbb3BlbiBpc3N1ZXMgZm9yIGNv bnRyaWJ1dG9ycyBoZXJlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNz dWVzP3E9aXMlM0Fpc3N1ZStpcyUzQW9wZW4rbGFiZWwlM0ElMjJoZWxwK3dhbnRlZCUyMitubyUz QWFzc2lnbmVlPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzNDFdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL2lzc3Vlcy8yMzQxPg0KDQpbQHNhYmluZV0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9zYWJpbmU+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjMyOF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzLzIzMjg+DQoNCg0KVGhlIE9DYW1sIENvb2tib29rDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICBXZSBzaGlwcGVkIGEgbmV3LCBjb21tdW5pdHktZHJpdmVuIHNlY3Rpb24gaW4gdGhlIExlYXJu IGFyZWE6IHRoZQ0KICBPQ2FtbCBDb29rYm9vayENCg0KICBUaGUgT0NhbWwgQ29va2Jvb2sgaXMg YSBwbGFjZSB3aGVyZSBPQ2FtbCBkZXZlbG9wZXJzIHNoYXJlIGhvdyB0bw0KICBzb2x2ZSBjb21t b24gdGFza3MgdXNpbmcgcGFja2FnZXMgZnJvbSB0aGUgZWNvc3lzdGVtLg0KDQogIEEgdGFzayBp cyBzb21ldGhpbmcgdGhhdCBuZWVkcyB0byBiZSBkb25lIGluc2lkZSBhIHByb2plY3QuIEEgcmVj aXBlDQogIGlzIGEgY29kZSBzYW1wbGUgYW5kIGV4cGxhbmF0aW9ucyBvbiBob3cgdG8gcGVyZm9y bSBhIHRhc2sgdXNpbmcgYQ0KICBjb21iaW5hdGlvbiBvZiBvcGVuIHNvdXJjZSBsaWJyYXJpZXMu DQoNCiAgVGhlIENvb2tib29rIG5vdyBsaXZlIGF0IFtvY2FtbC5vcmcvY29va2Jvb2tdLCBidXQg dGhlcmUgYXJlIG5vdCBhIGxvdA0KICBvZiByZWNpcGVzIHB1Ymxpc2hlZCB5ZXQuDQoNCiAgSGVy ZSdzIGhvdyB3ZSBuZWVkIHlvdXIgaGVscDoNCg0KICAxLiBIZWxwIHJldmlldyBbb3BlbiBwdWxs IHJlcXVlc3RzIGZvciBjb29rYm9vayByZWNpcGVzXSENCiAgMi4gQ29udHJpYnV0ZSBuZXcgcmVj aXBlcyBhbmQgdGFza3MgZm9yIHRoZSBjb29rYm9vayENCiAgMy4gU3VnZ2VzdCBpbXByb3ZlbWVu dHMgdG8gZXhpc3RpbmcgcmVjaXBlcyBhbmQgdGhlIFVJLg0KDQogICpSZWxldmFudCBQUnMgYW5k IEFjdGl2aXRpZXM6Kg0KICDigKIgT3BlbiBQUnMgaW4gbmVlZCBvZiByZXZpZXdlcnM6DQogICAg 4oCiIFBSOiBDb29rYm9vayBnZW9kZXNpYyBbb2NhbWwvb2NhbWwub3JnIzIzODFdIGJ5IFtARi1M b3llcl0NCiAgICDigKIgUFI6IENvb2tib29rIC8gc3VicHJvY2VzcyBjcmVhdGlvbiBbb2NhbWwv b2NhbWwub3JnIzIzODJdIGJ5DQogICAgICBbQEYtTG95ZXJdDQogICAg4oCiIFBSOiBDb29rYm9v ayBnZXRlbnYgW29jYW1sL29jYW1sLm9yZyMyMzgzXSBieSBbQEYtTG95ZXJdDQogICAg4oCiIFBS OiBDb29rYm9vayA6IGxpbmFsZyBbb2NhbWwvb2NhbWwub3JnIzIzODZdIGJ5IFtARi1Mb3llcl0N CiAgICDigKIgUFI6IFVzZSBjYW1semlwIGFuZCB3aXRoX29wZW5fdGV4dCBbb2NhbWwvb2NhbWwu b3JnIzIzNzFdIGJ5DQogICAgICBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBSOiBEZXNlcmlhbGlz ZSBhbmQgcG9zdC1wcm9jZXNzIFlBTUwgcmVjaXBlcw0KICAgICAgW29jYW1sL29jYW1sLm9yZyMy MzcyXSBieSBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBSOiBSZWJhc2VkIGRhdGFiYXNlIHJlY2lw ZXMgW29jYW1sL29jYW1sLm9yZyMyMzc2XSBieQ0KICAgICAgW0BjdWlodGxhdWFjXQ0KICAgIOKA oiBQUjogUmViYXNlZCBiYXNpYyBjb25jdXJyZW5jeSByZWNpcGUgW29jYW1sL29jYW1sLm9yZyMy Mzc3XSBieQ0KICAgICAgW0BjdWlodGxhdWFjXQ0KICAgIOKAoiBQUjogUmViYXNlZCBzb3J0aW5n IHJlY2lwZSBbb2NhbWwvb2NhbWwub3JnIzIzNzhdIGJ5IFtAY3VpaHRsYXVhY10NCiAgICDigKIg UFI6IFJlYmFzZWQgYXNjaWkgYW5kIHV0Zi04IHJlY2lwZXMgW29jYW1sL29jYW1sLm9yZyMyMzc5 XSBieQ0KICAgICAgW0BjdWlodGxhdWFjXQ0KDQoNCltvY2FtbC5vcmcvY29va2Jvb2tdIDxodHRw czovL29jYW1sLm9yZy9jb29rYm9vaz4NCg0KW29wZW4gcHVsbCByZXF1ZXN0cyBmb3IgY29va2Jv b2sgcmVjaXBlc10NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGxzP3E9 aXMlM0FwcitpcyUzQW9wZW4rbGFiZWwlM0FDb29rYm9vaz4NCg0KW29jYW1sL29jYW1sLm9yZyMy MzgxXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIzODE+DQoNCltA Ri1Mb3llcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9GLUxveWVyPg0KDQpbb2NhbWwvb2NhbWwub3Jn IzIzODJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM4Mj4NCg0K W29jYW1sL29jYW1sLm9yZyMyMzgzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzIzODM+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM4Nl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzg2Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzNzFdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM3MT4NCg0KW0BjdWlodGxh dWFjXSA8aHR0cHM6Ly9naXRodWIuY29tL2N1aWh0bGF1YWM+DQoNCltvY2FtbC9vY2FtbC5vcmcj MjM3Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzcyPg0KDQpb b2NhbWwvb2NhbWwub3JnIzIzNzZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjM3Nj4NCg0KW29jYW1sL29jYW1sLm9yZyMyMzc3XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzIzNzc+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM3OF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzc4Pg0KDQpbb2NhbWwvb2Nh bWwub3JnIzIzNzldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM3 OT4NCg0KDQpDb21tdW5pdHkgJiBNYXJrZXRpbmcgUGFnZXMgUmV3b3JrDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBXZSBoYXZlIFtVSSBkZXNpZ25z IGZvciB0aGUgcmV3b3JrZWQgYW5kIG5ldyBwYWdlcyBvZiB0aGUgY29tbXVuaXR5DQogIHNlY3Rp b25dIGFuZCBhcmUgc3RhcnRpbmcgd29yayB0byBpbXBsZW1lbnQgdGhlc2UuIFdlIGFyZSBvcGVu aW5nDQogIHNtYWxsIGlzc3VlcyBmb3IgY29udHJpYnV0b3JzIHRvIGhlbHAuIDpvcmFuZ2VfaGVh cnQ6DQoNCiAgKlJlbGV2YW50IFBScyBhbmQgQWN0aXZpdGllczoqDQogIOKAoiBQUjogVUk6IEFk ZGVkIERhdGVUaW1lIG9mIEV2ZW50IG9uIHRoZSBDbGllbnQgU2lkZSBpbiB0aGUgVXNlcidzDQog ICAgVGltZXpvbmUgW29jYW1sL29jYW1sLm9yZyMyMzM5XSBieSBbQG1haGEtc2FjaGluXQ0KICDi gKIgUFI6IENyZWF0ZSBuZXcgRXZlbnRzIHBhZ2Ugd2l0aCByb3V0aW5nIHVuZGVyIENvbW11bml0 eQ0KICAgIFtvY2FtbC9vY2FtbC5vcmcjMjMzOF0gYnkgW0BzaGFrdGhpbWFhbl0NCiAg4oCiIFBS OiBBZGQgZXZlbnRfdHlwZSBmaWVsZCB0byBFdmVudHMsIGFuZCByZW5kZXIgdGFnIGluIEV2ZW50 IGNhcmRzDQogICAgW29jYW1sL29jYW1sLm9yZyMyMzY2XSBieSBbQGNzYWx0YWNoaW5dDQoNCg0K W1VJIGRlc2lnbnMgZm9yIHRoZSByZXdvcmtlZCBhbmQgbmV3IHBhZ2VzIG9mIHRoZSBjb21tdW5p dHkgc2VjdGlvbl0NCjxodHRwczovL3d3dy5maWdtYS5jb20vZmlsZS83aG1vV2tRUDlQZ0xUZlpD cWlaTVdhL09DYW1sLUNvbW11bml0eS1QYWdlcz90eXBlPWRlc2lnbiZub2RlLWlkPTYzNyUzQTQ1 MzkmbW9kZT1kZXNpZ24mdD1ScFFsR3ZPcGVnMWE5M0FaLTE+DQoNCltvY2FtbC9vY2FtbC5vcmcj MjMzOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzM5Pg0KDQpb QG1haGEtc2FjaGluXSA8aHR0cHM6Ly9naXRodWIuY29tL21haGEtc2FjaGluPg0KDQpbb2NhbWwv b2NhbWwub3JnIzIzMzhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MjMzOD4NCg0KW0BzaGFrdGhpbWFhbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zaGFrdGhpbWFhbj4N Cg0KW29jYW1sL29jYW1sLm9yZyMyMzY2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzIzNjY+DQoNCltAY3NhbHRhY2hpbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jc2Fs dGFjaGluPg0KDQoNCkdlbmVyYWwgSW1wcm92ZW1lbnRzIGFuZCBEYXRhIEFkZGl0aW9ucw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgKlJlbGV2YW50IFBScyBhbmQgQWN0aXZpdGllczoqDQogIOKAoiBCdWdmaXhlcw0KICAg IOKAoiBQUjogZml4OiBhZGQgLm1vZHVsZXMgc3R5bGUgZm9yIG9kb2MtZ2VuZXJhdGVkIGRvY3Vt ZW50YXRpb24gcGFnZXMNCiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjM1NV0gYnkgW0BzYWJpbmVd DQogICAg4oCiIFBSOiBGaXg6IGNvcnJlY3QgdGV4dCBjb2xvciBvbiBjb21tdW5pdHkgcmVzb3Vy Y2UgY2FyZA0KICAgICAgW29jYW1sL29jYW1sLm9yZyMyMzI5XSBieSBbQHNhYmluZV0NCiAgICDi gKIgUFI6IGZpeDogTWFrZSBDb21tdW5pdHkgY2FyZCBhYm91dCBMZWFybk9DYW1sIHBvaW50IHRv IHRoZSBjb3JyZWN0DQogICAgICBVUkwgW29jYW1sL29jYW1sLm9yZyMyMzMxXSBieSBbQHl1cnVn XQ0KICDigKIgRG9jdW1lbnRhdGlvbg0KICAgIOKAoiBQUjogT0NhbWwgVG91cjogLU5ldyBzZWN0 aW9ucy0gSW50cm9kdWN0aW9uIGFuZCBCZWZvcmUgV2UNCiAgICAgIEJlZ2luLiBBZGRlZCBSRVBM IGRlZmluaXRpb24gYW5kIGRvdWJsZSBzZW1pY29sb24gdXNlDQogICAgICBbb2NhbWwvb2NhbWwu b3JnIzIzMzZdIGJ5IFtAQWxmcmVkby1DYXJsb25dDQogICAg4oCiIFBSOiBNaW5vciBsaW5lIGVk aXRpbmcgb24gIlZhbHVlcyBhbmQgRnVuY3Rpb25zIiBUdXRvcmlhbA0KICAgICAgW29jYW1sL29j YW1sLm9yZyMyMzIxXSBieSBbQGpldXhkZWF1XQ0KICDigKIgRGF0YQ0KICAgIOKAoiBQUjogW3Bs YW5ldF06IGFkZCBtZWxhbmdlIGJsb2cgW29jYW1sL29jYW1sLm9yZyMyMzYyXSBieQ0KICAgICAg W0Bhbm1vbnRlaXJvXQ0KICAgIOKAoiBQUjogKGRhdGEpIGFkZCBhcHJpbCBPVVBTIG1lZXR1cCBb b2NhbWwvb2NhbWwub3JnIzIzNjBdIGJ5DQogICAgICBbQHNhYmluZV0NCiAgICDigKIgUFI6IEFk ZCBUVU0gYXMgYW4gYWNhZGVtaWMgaW5zdGl0dXRpb24gW29jYW1sL29jYW1sLm9yZyMyMzQ3XSBi eQ0KICAgICAgW0BQdW1QdW03XQ0KICAgIOKAoiBQUjogQWRkIFJvdXRpbmUgam9iIHBvc3QuIFtv Y2FtbC9vY2FtbC5vcmcjMjMyNV0gYnkgW0BtZWZ5bF0NCiAgICDigKIgUFI6IChkYXRhKSBBZGQg T0NhbWwgV29ya3Nob3AgdG8gVXBjb21pbmcgRXZlbnRzDQogICAgICBbb2NhbWwvb2NhbWwub3Jn IzIzMjZdIGJ5IFtAc2FiaW5lXQ0KICAgIOKAoiBQUjogKGRhdGEpIGFkZCBSZWFzb25TVEhMTSBt ZWV0dXAgW29jYW1sL29jYW1sLm9yZyMyMzA4XSBieQ0KICAgICAgW0BzYWJpbmVdDQogICAg4oCi IFBSOiBBZGQgbWlzc2luZyBNZHggY2hhbmdlbG9ncyBbb2NhbWwvb2NhbWwub3JnIzIzNjhdIGJ5 DQogICAgICBbQHRtYXR0aW9dDQogICAg4oCiIFBSOiBGaXggc21hbGwgdHlwbyBpbiBEdW5lIDMu MTQgYW5ub3VuY2VtZW50DQogICAgICBbb2NhbWwvb2NhbWwub3JnIzIzMTVdIGJ5IFtATGVvbmlk YXMtZnJvbS1YSVZdDQogICAg4oCiIFBSOiBEdW5lIDMuMTUuMCBhbm5vdW5jZW1lbnQgW29jYW1s L29jYW1sLm9yZyMyMzE2XSBieQ0KICAgICAgW0BMZW9uaWRhcy1mcm9tLVhJVl0NCiAgICDigKIg UFI6IE9DYW1sIDUuMi4wLWJldGEyIGNoYW5nZWxvZyBlbnRyeSBbb2NhbWwvb2NhbWwub3JnIzIz NDNdIGJ5DQogICAgICBbQE9jdGFjaHJvbl0NCiAgICDigKIgUFI6IChkYXRhKSBhZGQgTWFyY2gg MjAyNCBPQ2FtbC5vcmcgbmV3c2xldHRlcg0KICAgICAgW29jYW1sL29jYW1sLm9yZyMyMzE3XSBi eSBbQHNhYmluZV0NCiAgICDigKIgUFI6IEFkZCB0aGUgYW5ub3VuZW1lbnQgZm9yIG9wYW0gMi4y LjB+YmV0YTINCiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjMzNF0gYnkgW0BraXQtdHkta2F0ZV0N CiAgICDigKIgUFI6IGpvYnM6IHJlbW92ZSBYZW5TZXJ2ZXIgcG9zaXRpb25zIFtvY2FtbC9vY2Ft bC5vcmcjMjM4N10gYnkNCiAgICAgIFtAZWR3aW50b3Jva10NCiAg4oCiIE1vdmUgb2YgdGhlIE9D YW1sIExhbmd1YWdlIE1hbnVhbCBmcm9tIHYyLm9jYW1sLm9yZyB0byBvY2FtbC5vcmcNCiAgICDi gKIgUFI6IGZpeDogU2VydmUgbWFudWFsIHVuZGVyIC9sdHMgYW5kIC9sYXRlc3QgVVJMcw0KICAg ICAgW29jYW1sL29jYW1sLm9yZyMyMzQ1XSBieSBbQHNhYmluZV0NCiAgICDigKIgUFI6IFJlbW92 ZSAvbWFudWFsL2x0cyBVUkwsIGZpeCBicm9rZW4gcm91dGUgZm9yIC9tYW51YWwvbGF0ZXN0DQog ICAgICBbb2NhbWwvb2NhbWwub3JnIzIzNDhdIGJ5IFtAc2FiaW5lXQ0KICAgIOKAoiBQUjogQWRk IC9hcGkvKiogcmVkaXJlY3Rpb24gW29jYW1sL29jYW1sLm9yZyMyMzUyXSBieSBbQG10ZWx2ZXJz XQ0KICAgIOKAoiBQUjogSGFuZGxlIGx0cywgZGVmYXVsdCBhbmQgbWlzc2luZyB2ZXJzaW9uIGlu IG1pZGRsZXdhcmUNCiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjM1OF0gYnkgW0BjdWlodGxhdWFj XQ0KICAgIOKAoiBQUjogQWRkIHNlcnZlZCBwYWdlcyB0byBzaXRlbWFwIFtvY2FtbC9vY2FtbC5v cmcjMjM2M10gYnkNCiAgICAgIFtAY3VpaHRsYXVhY10NCiAgICDigKIgUFI6IFNraXAgdW5yZWxl YXNlZCBtYW51YWxzIGZyb20gc2l0ZW1hcCBbb2NhbWwvb2NhbWwub3JnIzIzNjddIGJ5DQogICAg ICBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBSOiBUdXJuIHNvbWUgdjIgcmVkaXJlY3RzIGludG8g bG9jYWwgW29jYW1sL29jYW1sLm9yZyMyMzU2XSBieQ0KICAgICAgW0BjdWlodGxhdWFjXQ0KICDi gKIgUmVmYWN0b3IgLyBDb2RlIGhlYWx0aA0KICAgIOKAoiBQUjogUmVtb3ZlIENvbW1pdCBtb2R1 bGUgZnJvbSBHbG9iYWwgW29jYW1sL29jYW1sLm9yZyMyMzE5XSBieQ0KICAgICAgW0BjdWlodGxh dWFjXSAoY3JlYXRlZC9tZXJnZWQ6IDIwMjQtMDQtMDVUMTQ6MTc6MzFaKQ0KICAgIOKAoiBQUjog Y2hvcmU6IHJlbW92ZSBsZWFybl9zaWRlYmFyLmVtbCwgd2hpY2ggd2FzIG5vdCB1c2VkIGFueW1v cmUNCiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjM0Ml0gYnkgW0BzYWJpbmVdDQogICAg4oCiIFBS OiBBZGQgbGluayB0byBkZXBsb3kuY2kub2NhbWwub3JnIGluIEhBQ0tJTkcNCiAgICAgIFtvY2Ft bC9vY2FtbC5vcmcjMjM1NF0gYnkgW0BjdWlodGxhdWFjXQ0KICAgIOKAoiBQUjogVXNlIHR5cGUg YW5ub3RhdGlvbiBmb3IgZGF0YSBwYXJhbWV0ZXJzIFtvY2FtbC9vY2FtbC5vcmcjMjM4NF0NCiAg ICAgIGJ5IFtAY3VpaHRsYXVhY10NCg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzNTVdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM1NT4NCg0KW0BzYWJpbmVdIDxodHRw czovL2dpdGh1Yi5jb20vc2FiaW5lPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzMjldIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjMyOT4NCg0KW29jYW1sL29jYW1sLm9y ZyMyMzMxXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIzMzE+DQoN CltAeXVydWddIDxodHRwczovL2dpdGh1Yi5jb20veXVydWc+DQoNCltvY2FtbC9vY2FtbC5vcmcj MjMzNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzM2Pg0KDQpb QEFsZnJlZG8tQ2FybG9uXSA8aHR0cHM6Ly9naXRodWIuY29tL0FsZnJlZG8tQ2FybG9uPg0KDQpb b2NhbWwvb2NhbWwub3JnIzIzMjFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjMyMT4NCg0KW0BqZXV4ZGVhdV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qZXV4ZGVhdT4N Cg0KW29jYW1sL29jYW1sLm9yZyMyMzYyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzIzNjI+DQoNCltAYW5tb250ZWlyb10gPGh0dHBzOi8vZ2l0aHViLmNvbS9hbm1v bnRlaXJvPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzNjBdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMjM2MD4NCg0KW29jYW1sL29jYW1sLm9yZyMyMzQ3XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIzNDc+DQoNCltAUHVtUHVtN10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9QdW1QdW03Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzMjVdIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjMyNT4NCg0KW0BtZWZ5bF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9tZWZ5bD4NCg0KW29jYW1sL29jYW1sLm9yZyMyMzI2XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIzMjY+DQoNCltvY2FtbC9vY2FtbC5v cmcjMjMwOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzA4Pg0K DQpbb2NhbWwvb2NhbWwub3JnIzIzNjhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMjM2OD4NCg0KW0B0bWF0dGlvXSA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8+ DQoNCltvY2FtbC9vY2FtbC5vcmcjMjMxNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8yMzE1Pg0KDQpbQExlb25pZGFzLWZyb20tWElWXSA8aHR0cHM6Ly9naXRodWIu Y29tL0xlb25pZGFzLWZyb20tWElWPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzMTZdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjMxNj4NCg0KW29jYW1sL29jYW1sLm9y ZyMyMzQzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIzNDM+DQoN CltAT2N0YWNocm9uXSA8aHR0cHM6Ly9naXRodWIuY29tL09jdGFjaHJvbj4NCg0KW29jYW1sL29j YW1sLm9yZyMyMzE3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzIz MTc+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjMzNF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8yMzM0Pg0KDQpbQGtpdC10eS1rYXRlXSA8aHR0cHM6Ly9naXRodWIuY29t L2tpdC10eS1rYXRlPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzODddIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM4Nz4NCg0KW0BlZHdpbnRvcm9rXSA8aHR0cHM6Ly9n aXRodWIuY29tL2Vkd2ludG9yb2s+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM0NV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzQ1Pg0KDQpbb2NhbWwvb2NhbWwub3Jn IzIzNDhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM0OD4NCg0K W29jYW1sL29jYW1sLm9yZyMyMzUyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzIzNTI+DQoNCltAbXRlbHZlcnNdIDxodHRwczovL2dpdGh1Yi5jb20vbXRlbHZlcnM+ DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM1OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8yMzU4Pg0KDQpbQGN1aWh0bGF1YWNdIDxodHRwczovL2dpdGh1Yi5jb20vY3Vp aHRsYXVhYz4NCg0KW29jYW1sL29jYW1sLm9yZyMyMzYzXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzIzNjM+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM2N10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzY3Pg0KDQpbb2NhbWwvb2NhbWwu b3JnIzIzNTZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM1Nj4N Cg0KW29jYW1sL29jYW1sLm9yZyMyMzE5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzIzMTk+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjM0Ml0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yMzQyPg0KDQpbb2NhbWwvb2NhbWwub3JnIzIzNTRd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjM1ND4NCg0KW29jYW1s L29jYW1sLm9yZyMyMzg0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzIzODQ+DQoNCg0KRXhhbXBsZSBvZiB1c2luZyBMU1Agc2VydmVyIGluIEVtYWNzDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2V4YW1wbGUtb2YtdXNpbmctbHNwLXNl cnZlci1pbi1lbWFjcy8xNDYwMS80Pg0KDQoNClRpbSBNY0dpbGNocmlzdCBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd3JvdGUgYSBibG9nIHBvc3QgYWJvdXQgbXkgc2V0dXAN CiAgPGh0dHBzOi8vbGFtYmRhZm9vLmNvbS9wb3N0cy8yMDIyLTA5LTA3LW9jYW1sLXdpdGgtZW1h Y3MtMjAyMi5odG1sPg0KICBUaGUgb25seSBjaGFuZ2UgSSd2ZSBtYWRlIGlzIHRvIHVzZSBgZW52 cmMtbW9kZScgcmF0aGVyIHRoYW4NCiAgYGRpcmVudi1tb2RlJy4NCg0KDQpEdW5lIERldmVsb3Bl ciBFeHBlcmllbmNlIEZlZWRiYWNrIEZvcm0NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZHVuZS1kZXZlbG9wZXItZXhwZXJpZW5jZS1mZWVkYmFjay1m b3JtLzE0NjE3LzE+DQoNCg0Kb3N0ZXJhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIER1bmUgdGVhbSBhdCBbVGFyaWRl c10gaXMgbG9va2luZyB0byBnZXQgaW5wdXRzIGZyb20gYWxsIG9mIHlvdSB0bw0KICBpbXByb3Zl IHRoZSBEdW5lIERYIChkZXZlbG9wZXIgZXhwZXJpZW5jZSksIHNvIHdlJ3ZlIG9wZW5lZCBhIFtz bWFsbCwNCiAgYW5vbnltb3VzLCB1bnN0cnVjdHVyZWQgZmVlZGJhY2sgZm9ybV0gdG8gaGVhciB5 b3VyIGlkZWFzIG9uIGhvdyBEdW5lDQogIGNvdWxkIGJlIGltcHJvdmVkIDpjYW1lbDoNCg0KICBX ZSdyZSBsb29raW5nIGZvcndhcmQgdG8geW91ciBpZGVhcyEgOnNwYXJrbGVzOg0KDQoNCltUYXJp ZGVzXSA8aHR0cHM6Ly90YXJpZGVzLmNvbT4NCg0KW3NtYWxsLCBhbm9ueW1vdXMsIHVuc3RydWN0 dXJlZCBmZWVkYmFjayBmb3JtXQ0KPGh0dHBzOi8vZm9ybXMuZ2xlL2l6ZzV4U3QxWE5wM2k0UmM4 Pg0KDQoNCkRrTUwgMi4xLjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRrbWwtMi0xLTEvMTQ2MjAv MT4NCg0KDQpqYmVja2ZvcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBVc2UgW2h0dHBzOi8vb2NhbWwub3Jn L2luc3RhbGxdIGlmIHlvdSBhcmUgYSBmaXJzdC10aW1lIHVzZXIgKHRoZQ0KICBpbnN0YWxsIHN0 ZXBzIGhhdmVuJ3QgY2hhbmdlZCkuDQoNCiAgVGhlIHVwZ3JhZGUgc3RlcHMgYW5kIHJlbGVhc2Ug bm90ZXMgYXJlIGF2YWlsYWJsZSBhdA0KICA8aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvZGlzdHJp YnV0aW9ucy9ka21sLy0vcmVsZWFzZXMvMi4xLjE+LiBGb3INCiAgdGhvc2Ugd2hvIGFyZSBvbiAy LjEuMCwgdGhlIHVwZ3JhZGUgaXMgdGhlIGZvbGxvd2luZyBpbiBQb3dlclNoZWxsOg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgMS4uNiB8ICUgeyAgQCgiYmFzaCIsInNoIiwid2l0aC1ka21s Iiwib2NhbWxsc3AiLCJnaXQiLCJvcGFtIiwiZHVuZSIsIm9jYW1scnVuIikgfCAlIHsgdGFza2tp bGwgL0YgL0lNICIkXy5leGUiIH07IFN0YXJ0LVNsZWVwIDEgfQ0KICDilIIgd2luZ2V0IHVwZ3Jh ZGUgZGttbA0KICDilJTilIDilIDilIDilIANCg0KDQpbaHR0cHM6Ly9vY2FtbC5vcmcvaW5zdGFs bF0gPGh0dHBzOi8vb2NhbWwub3JnL2luc3RhbGw+DQoNCk1ham9yIENoYW5nZXMNCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBUaGUgb3BhbSByZXBvc2l0 b3J5IGlzIGZpeGVkIHRvIFtjb21taXQNCiAgICA2YzNmNzNmNDI4OTBjYzE5ZjgxZWIxZGVjODAy M2MyY2Q3YjhiNWNkXSBmb3Igc3RhYmlsaXR5LiBJZiB5b3UgbmVlZA0KICAgIGEgbmV3IHZlcnNp b24gb2YgYSBwYWNrYWdlIGFuZCBjYW4ndCB3YWl0IGZvciB0aGUgbmV4dCB2ZXJzaW9uIG9mDQog ICAgRGtNTCwgeW91IGNhbiBwaW4gdGhhdCBwYWNrYWdlJ3MgdXJsIChyZWNvbW1lbmRlZCkgb3Ig ZmxvYXQgdGhlIG9wYW0NCiAgICByZXBvc2l0b3J5IHdpdGggYG9wYW0gcmVwb3NpdG9yeSBzZXQt dXJsIGRlZmF1bHQNCiAgICBnaXQraHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3Np dG9yeS5naXQjbWFpbicuDQogIOKAoiBXaW5kb3dzIFNESyAxMC4wLjIyNjIxLjAgYW5kIFZDIDE3 LjggKDE0LjM4KSBhZGRlZCB0byBhbGxvd2VkDQogICAgbGlzdC4gVGhpcyBzdXBwb3J0cyBWaXN1 YWwgU3R1ZGlvIDIwMjIsIGVzcGVjaWFsbHkgZm9yIEdpdExhYiBDSS4NCiAg4oCiIE5ldyBzdXBw b3J0ZWQgcGFja2FnZTogYHRpbnlfaHR0cGQnDQoNCg0KW2NvbW1pdCA2YzNmNzNmNDI4OTBjYzE5 ZjgxZWIxZGVjODAyM2MyY2Q3YjhiNWNkXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFt LXJlcG9zaXRvcnkvdHJlZS82YzNmNzNmNDI4OTBjYzE5ZjgxZWIxZGVjODAyM2MyY2Q3YjhiNWNk Pg0KDQoNClBhdGNoZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KICAgUGFj a2FnZSAgICAgICAgICAgICAgICAgV2hhdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJ c3N1ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0K ICDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCiAgIGBiYXNlX2JpZ3N0cmluZy52MTYuMCcgIEltcGxlbWVudCBgbWVtbWVtJyBm b3IgV2luZG93cyAgICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2Jhc2VfYmlnc3Ry aW5nL2lzc3Vlcy82PiANCiAgIGBjb3JlX2tlcm5lbC52MC4xNi4wJyAgIE1TVkMgZml4IGRpZG4n dCBtYWtlIGl0IHRvIDAuMTYuMCAgPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L2NvcmVf a2VybmVsL3B1bGwvMTA3PiAgICANCiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQoNCg0KVXBncmFkZWQgUGFja2FnZXMNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KICAgUGFja2Fn ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcm9tICAgICAgICAgICAgICAgICAg ICAgICAgVG8gDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KICAgZHVuZSAoZXQgYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgMy4xMi4xICAg ICAgICAgICAgICAgICAgICAzLjE1LjAgDQogICBvY2FtbCAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICA0LjE0LjAgICAgICAgICAgICAgICAgICAgIDQuMTQuMiANCiAgIG9jYW1sZm9y bWF0IChldCBhbCkgICAgICAgICAgICAgICAgICAgIDAuMjUuMSAgICAgICAgICAgICAgICAgICAg MC4yNi4xIA0KICAgb2RvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIuMi4w ICAgICAgICAgICAgICAgICAgICAgMi40LjEgDQogICBvZG9jLXBhcnNlciAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgMi4wLjAgICAgICAgICAgICAgICAgICAgICAyLjQuMSANCiAgIGxzcCAo ZXQgYWwpICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEuMTYuMiAgICAgICAgICAgICAgICAg ICAgMS4xNy4wIA0KICAgbWR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIu My4wICAgICAgICAgICAgICAgICAgICAgMi40LjEgDQogICBjdHlwZXMgKGV0IGFsKSAgICAgICAw LjE5LjItd2luZG93c3N1cHBvcnQtcjcgIDAuMTkuMi13aW5kb3dzc3VwcG9ydC1yOCANCiAgIHRp bnlfaHR0cGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAwLjE2IA0KICDilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIENCg0KICBUaGFua3MgdG8gT0NhbWwgU29mdHdhcmUgRm91bmRhdGlvbiBmb3Igc3Bv bnNvcmluZyBEa01MIQ0KDQoNCkEgTWF5IHVwZGF0ZSBvbiB3YXNtX29mX29jYW1sDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2EtbWF5LXVwZGF0ZS1vbi13YXNtLW9mLW9jYW1sLzE0NjM1LzE+DQoNCg0K SmFuIE1pZHRnYWFyZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFNwcmluZyBpcyBvdmVy IHVzIGFuZCBzZXZlcmFsIG1vbnRocyBoYXZlIHBhc3NlZCBzaW5jZSB3ZSBsYXN0IHNoYXJlZA0K ICBbYW4gdXBkYXRlIG9uIFdlYkFzc2VtYmx5IGNvbXBpbGF0aW9uXS4NCg0KDQpbYW4gdXBkYXRl IG9uIFdlYkFzc2VtYmx5IGNvbXBpbGF0aW9uXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hLWRlY2VtYmVyLXVwZGF0ZS1mcm9tLXRoZS1vY2FtbC13YXNtLW9yZ2FuaXNhdGlvbi8xMzU2 NT4NCg0KSW50cm9kdWN0aW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICBbYHdhc21fb2Zfb2NhbWwnXSBpcyBhIGNvbXBpbGVyIGZyb20gT0NhbWwgYnl0ZWNvZGUg dG8gW1dlYkFzc2VtYmx5XSwNCiAgc2ltaWxhciB0byBbYGpzX29mX29jYW1sJ10gZnJvbSB3aGlj aCBpdCB3YXMgZm9ya2VkLiBgd2FzbV9vZl9vY2FtbCcNCiAgb2ZmZXJzIGEgZnVuY3Rpb25hbCwg YWxtb3N0IGRyb3AtaW4gcmVwbGFjZW1lbnQgZm9yIGBqc19vZl9vY2FtbCcgLQ0KICB3aXRoIGJl dHRlciBwZXJmb3JtYW5jZS4NCg0KICBGb3Igbm93LCB0aGUgY29tcGlsZXIgdGFyZ2V0cyBhIEph dmFTY3JpcHQtaG9zdGVkIFdlYkFzc2VtYmx5DQogIGVuZ2luZS4gVGhlIHByb2R1Y2VkIGNvZGUg ZnVydGhlcm1vcmUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBbV2FzbQ0KICBleHRlbnNpb25zXSB0 byBydW46DQogIOKAoiBbdGhlIEdDIGV4dGVuc2lvbl0sIGluY2x1ZGluZyBmdW5jdGlvbmFsIHJl ZmVyZW5jZXMgYW5kIDMxLWJpdA0KICAgIGludGVnZXJzDQogIOKAoiBbdGhlIHRhaWwtY2FsbCBl eHRlbnNpb25dDQogIOKAoiBbdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBleHRlbnNpb25dDQoNCg0K W2B3YXNtX29mX29jYW1sJ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zf b2NhbWw+DQoNCltXZWJBc3NlbWJseV0gPGh0dHBzOi8vd2ViYXNzZW1ibHkub3JnLz4NCg0KW2Bq c19vZl9vY2FtbCddIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9qc19vZl9vY2FtbD4NCg0K W1dhc20gZXh0ZW5zaW9uc10gPGh0dHBzOi8vd2ViYXNzZW1ibHkub3JnL3JvYWRtYXAvPg0KDQpb dGhlIEdDIGV4dGVuc2lvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9nYz4NCg0K W3RoZSB0YWlsLWNhbGwgZXh0ZW5zaW9uXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJs eS90YWlsLWNhbGwvYmxvYi9tYWluL3Byb3Bvc2Fscy90YWlsLWNhbGwvT3ZlcnZpZXcubWQ+DQoN Clt0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGV4dGVuc2lvbl0NCjxodHRwczovL2dpdGh1Yi5jb20v V2ViQXNzZW1ibHkvZXhjZXB0aW9uLWhhbmRsaW5nL2Jsb2IvbWFzdGVyL3Byb3Bvc2Fscy9leGNl cHRpb24taGFuZGxpbmcvRXhjZXB0aW9ucy5tZD4NCg0KDQpQbGF0Zm9ybSBzdXBwb3J0DQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgW05v ZGUgMjIgbm93IHN1cHBvcnRzIHRoZSBXYXNtR0MgZXh0ZW5zaW9uXSwgbWVhbmluZyB0aGF0IGl0 IGNhbiBydW4NCiAgICBgd2FzbV9vZl9vY2FtbCcgb3V0cHV0IG91dCBvZiB0aGUgYm94IQ0KICDi gKIgQ2xvdWRGbGFyZSB1c2VzIFtWOCAxMi4wIHNpbmNlIERlYyA0LCAyMDIzXS4gW1RoaXMgY29y cmVzcG9uZHMgdG8NCiAgICBDaHJvbWUgMTIwXSwgYW5kIHRodXMgaW5jbHVkZXMgdGhlIFdhc21H QyBleHRlbnNpb24sIGVmZmVjdGl2ZWx5DQogICAgZW5hYmxpbmcgT0NhbWwgZGV2ZWxvcG1lbnQg b24gQ2xvdWRGbGFyZSEgRm9yIG1vcmUgZGV0YWlscyBzZWUgdGhlDQogICAgW1dlYkFzc2VtYmx5 IENsb3VkRmxhcmUgZG9jc10NCiAg4oCiIFtUaGUgdXBjb21pbmcgMC4xNC4wIHJlbGVhc2VdIG9m IFt0aGUgV2FzbUVkZ2UgV2ViQXNzZW1ibHkgZW5naW5lXQ0KICAgIGFkZHMgV2FzbUdDIHN1cHBv cnQgdG9vLiBBbG9uZyB3aXRoIHRoZSBbanVzdCBtZXJnZWQgZXhjZXB0aW9uDQogICAgc3VwcG9y dF0sIHRoaXMgcGF2ZXMgdGhlIHdheSBmb3IgcnVubmluZyBgd2FzbV9vZl9vY2FtbCcgb3V0cHV0 4oCmDQoNCg0KW05vZGUgMjIgbm93IHN1cHBvcnRzIHRoZSBXYXNtR0MgZXh0ZW5zaW9uXQ0KPGh0 dHBzOi8vbm9kZWpzLm9yZy9lbi9ibG9nL2Fubm91bmNlbWVudHMvdjIyLXJlbGVhc2UtYW5ub3Vu Y2U+DQoNCltWOCAxMi4wIHNpbmNlIERlYyA0LCAyMDIzXQ0KPGh0dHBzOi8vZGV2ZWxvcGVycy5j bG91ZGZsYXJlLmNvbS93b3JrZXJzL3BsYXRmb3JtL2NoYW5nZWxvZy8jMjAyMy0xMi0wND4NCg0K W1RoaXMgY29ycmVzcG9uZHMgdG8gQ2hyb21lIDEyMF0gPGh0dHBzOi8vdjguZGV2L2RvY3MvdmVy c2lvbi1udW1iZXJzPg0KDQpbV2ViQXNzZW1ibHkgQ2xvdWRGbGFyZSBkb2NzXQ0KPGh0dHBzOi8v ZGV2ZWxvcGVycy5jbG91ZGZsYXJlLmNvbS93b3JrZXJzL3J1bnRpbWUtYXBpcy93ZWJhc3NlbWJs eS8+DQoNCltUaGUgdXBjb21pbmcgMC4xNC4wIHJlbGVhc2VdDQo8aHR0cHM6Ly9naXRodWIuY29t L1dhc21FZGdlL1dhc21FZGdlL3JlbGVhc2VzL3RhZy8wLjE0LjAtcmMuND4NCg0KW3RoZSBXYXNt RWRnZSBXZWJBc3NlbWJseSBlbmdpbmVdIDxodHRwczovL2dpdGh1Yi5jb20vV2FzbUVkZ2UvV2Fz bUVkZ2U+DQoNCltqdXN0IG1lcmdlZCBleGNlcHRpb24gc3VwcG9ydF0NCjxodHRwczovL2dpdGh1 Yi5jb20vV2FzbUVkZ2UvV2FzbUVkZ2UvcHVsbC8zMzA2Pg0KDQoNCmB3YXNtX29mX29jYW1sJyBu ZXdzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBTaW5jZSB0aGUgbGFzdCB1cGRhdGUgaW4gRGVjZW1iZXINCiAg4oCiIErD qXLDtG1lIGdhdmUgYSB0YWxrIGFib3V0IGB3YXNtX29mX29jYW1sJyBhdCB0aGUgSU5SSUEgQ2Ft Yml1bQ0KICAgIHNlbWluYXIgLSBbc2xpZGVzIGF2YWlsYWJsZSBoZXJlXQ0KICDigKIgT2xpdmll ciBOaWNvbGUgam9pbmVkIHRoZSBgd2FzbV9vZl9vY2FtbCcgZWZmb3J0DQogIOKAoiBKw6lyw7Rt ZSBhbmQgT2xpdmllciB2aXNpdGVkIEphbmUgU3RyZWV0IHRvIGhlbHAgdGhlbSBhZG9wdA0KICAg IGB3YXNtX29mX29jYW1sJw0KDQogIE5vdGFibGUgZmVhdHVyZXMNCiAg4oCiIFNvdXJjZW1hcCBz dXBwb3J0IHdhcyBhZGRlZCBbb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIzI3XQ0KICAgIOKAoiBU aGlzIHJlcXVpcmVkIGFkZGluZyBzb3VyY2VtYXAgc3VwcG9ydCB0byB0aGUgYHdhc20tbWV0YWRj ZScgYW5kDQogICAgICBgd2FzbS1tZXJnZScgYmluYXJ5ZW4gdG9vbHMgW1dlYkFzc2VtYmx5L2Jp bmFyeWVuIzYzNzJdDQogIOKAoiBBIGZpcnN0IGltcGxlbWVudGF0aW9uIG9mIHNlcGFyYXRlIGNv bXBpbGF0aW9uIHdhcyBjb21wbGV0ZWQNCiAgICBbb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIzM2 XQ0KICAgIOKAoiBPbmUgY2FuIGNvbXBpbGUgY21vIGFuZCBjbWEgZmlsZXMsIHByb2R1Y2luZyBp bnRlcm1lZGlhdGUgYXJjaGl2ZQ0KICAgICAgZmlsZXMNCiAgICDigKIgVGhlbiB0aGUgZmlsZXMg Y2FuIGJlIGxpbmtlZCB0b2dldGhlcjogcmVsZXZhbnQgV2FzbSBtb2R1bGVzIGFyZQ0KICAgICAg cHV0IGluIGEgZGlyZWN0b3J5LCBhbmQgSmF2YVNjcmlwdCBjb2RlIGlzIGdlbmVyYXRlZCB0byBs b2FkIHRoZW0NCiAgICAgIGFuZCBsaW5rIHRoZW0gdG9nZXRoZXINCiAg4oCiIFN0b3JlIGxvbmct bGl2ZWQgdG9wbGV2ZWwgdmFsdWVzIGludG8gZ2xvYmFscw0KICAgIFtvY2FtbC13YXNtL3dhc21f b2Zfb2NhbWwjMzBdDQogICAg4oCiIFRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHByb2R1Y2VkIGJ5 IGB3YXNtX29mX29jYW1sJyBjYW4gYmUgbGFyZ2UNCiAgICAgIGFuZCBjb250YWluIGEgbGFyZ2Ug bnVtYmVyIG9mIHZhcmlhYmxlcy4gVGhpcyBpcyBjaGFsbGVuZ2luZyB0bw0KICAgICAgYm90aCBi aW5hcnllbiB0b29scyBhbmQgdGhlIFdhc20gZW5naW5lcy4gVGhlIHByb2JsZW0gY2FuIGJlDQog ICAgICBhbGxldmlhdGVkIGJ5IHN0b3JpbmcgbG9uZy1saXZlZCB0b3BsZXZlbCB2YWx1ZXMgaW50 byBnbG9iYWwNCiAgICAgIHZhcmlhYmxlcy4gQXMgYW4gc2lkZSBiZW5lZml0LCBtYW55IGNsb3N1 cmVzIGNhbiBiZSBzdGF0aWNhbGx5DQogICAgICBhbGxvY2F0ZWQgKHNpbmNlIHRoZWlyIGZyZWUg dmFyaWFibGVzIGFyZSBub3cgc3RvcmVkIGluIGdsb2JhbHMpLA0KICAgICAgd2hpY2ggYWdhaW4g Y2FuIHByb3ZpZGUgcGVyZm9ybWFuY2UgaW1wcm92ZW1lbnRzIGluIHRoZSByZW1haW5pbmcNCiAg ICAgIHBhcnRzIG9mIHRoZSBjb2RlLg0KICDigKIgVHVwbGUgc3ludGF4IGNoYW5nZXMgW29jYW1s LXdhc20vd2FzbV9vZl9vY2FtbCMzMV0NCiAgICDigKIgUHJlcGFyZWQgdGhlIHN3aXRjaCB0byB0 aGUgbmV3IHZlcnNpb24gb2YgYmluYXJ5ZW4sIHdoaWNoIGhhcw0KICAgICAgc21hbGwgc3ludGF4 IGNoYW5nZXMNCiAg4oCiIFVzZSB0aGUgSlMgU3RyaW5nIEJ1aWx0aW5zIHByb3Bvc2FsIGZvciBz dHJpbmcgY29udmVyc2lvbnMgd2hlbg0KICAgIGF2YWlsYWJsZSBbb2NhbWwtd2FzbS93YXNtX29m X29jYW1sIzMzXQ0KICDigKIgSW1wcm92ZSB0aGUgV0FUIChXYXNtIHRleHQgZm9ybWF0KSBvdXRw dXQgdG8gYmUgbW9yZSByZWFkYWJsZQ0KICAgIFtvY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMzRd DQogICAg4oCiIE5hbWUgbG9jYWwgdmFyaWFibGVzICh0aGV5IHdlcmUganVzdCBudW1iZXJlZCkg YW5kIHVzZSBzaG9ydGVyDQogICAgICBuYW1lcyAodGhlIG5hbWVzIHVzZWQgdG8gYmUgc3lzdGVt YXRpY2FsbHkgc3VmZml4ZWQgdG8gZW5zdXJlIHRoZXkNCiAgICAgIHdlcmUgdW5pcXVlKS4NCg0K ICBPdGhlciBmZWF0dXJlcyBhbmQgZml4ZXMNCiAg4oCiIEZpeGVkIGZpbGUgZGVzY3JpcHRvciBt YW5hZ2VtZW50IHNvIHRoYXQgaXQgd29ya3Mgd2l0aCBsYXJnZSBmaWxlDQogICAgZGVzY3JpcHRv cnMgW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMxOF0NCiAg4oCiIFBSOiBVcGRhdGUgRmlyZWZv eCB2ZXJzaW9uIGluZm9ybWF0aW9uIGluIFJFQURNRSAobm8gbG9uZ2VyIGJldGEpDQogICAgW29j YW1sLXdhc20vd2FzbV9vZl9vY2FtbCMxOV0NCiAg4oCiIFBSOiBGaXggcGluIGJyYW5jaCBpbiBp bnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zDQogICAgW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMy MF0NCiAg4oCiIFBSOiBBZGQgYFN0ZGxpYi5TdHJpbmcuZm9sZF97bGVmdCxyaWdodH0nIHRvIGJ1 aWxkIG9uIE9DYW1sIDwgNC4xMw0KICAgIFtvY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMjFdDQog IOKAoiBQUiB0cmFuc2xhdGluZyBzdHVicyBvZiBgaW50ZWdlcnNfanNfc3R1YnMnIHRvIFdhc20N CiAgICBbbzEtbGFicy9pbnRlZ2Vyc19zdHVic19qcyMxMF0NCiAgICDigKIgVHJhY2tlZCBhIGJ1 ZyBpbiBhIHRlc3Qgb24gdGhlIHJlcG8gW28xLWxhYnMvaW50ZWdlcnNfc3R1YnNfanMjOV0NCiAg 4oCiIFBSOiBHZW5lcmF0ZSB2YWxpZCBXYXNtIGNvZGUgW29jYW1sLXdhc20vd2FzbV9vZl9vY2Ft bCMyMl0NCiAg4oCiIFBSOiBBdm9pZCB1c2luZyBgZXZhbCcgZm9yIHN0YXRpY2FsbHkga25vd24g c3RyaW5ncw0KICAgIFtvY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMjRdDQogIOKAoiBQUjogSGF2 ZSBwaHlzaWNhbCBlcXVhbGl0eSBpbnNwZWN0IEphdmFzY3JpcHQgb2JqZWN0cw0KICAgIFtvY2Ft bC13YXNtL3dhc21fb2Zfb2NhbWwjMjVdDQogIOKAoiBQUjogVHVuZSBvcHRpbWl6YXRpb24gcHJv ZmlsZXMgW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMyNl0NCiAg4oCiIFBSOiBDb3JyZWN0aW9u IGFuZCBwcmVjaXNpb24gYWJvdXQgQmluYXJ5ZW4gdmVyc2lvbg0KICAgIFtvY2FtbC13YXNtL3dh c21fb2Zfb2NhbWwjMjldDQoNCiAgQmluYXJ5ZW4gZml4ZXMNCiAg4oCiIFBSOiB3YXNtLW1lcmdl OiBjaGVjayB0aGF0IHRoZSB0eXBlcyBvZiBpbXBvcnRzIGFuZCBleHBvcnRzDQogICAgbWF0Y2gu IFtXZWJBc3NlbWJseS9iaW5hcnllbiM2NDM3XQ0KICAgIOKAoiBJbXByb3ZlZCBiaW5hcnllbidz IGxpbmtlciB0byBjaGVjayB0aGF0IHRoZSB0eXBlcyBvZiBpbXBvcnRzIGFuZA0KICAgICAgZXhw b3J0cyBtYXRjaC4gRm91bmQgYSB0eXBlIG1pc21hdGNoIGluIHRoZSB3YXNtX29mX29jYW1sIHJ1 bnRpbWUNCiAgICAgIHRoaXMgd2F5Lg0KICDigKIgUFI6IEZpeGVzIHJlZ2FyZGluZyBleHBsaWNp dCBuYW1lcyBbV2ViQXNzZW1ibHkvYmluYXJ5ZW4jNjQ2Nl0NCiAgICDigKIgVGhlIG5hbWUgb2Yg c29tZSBtb2R1bGUgY29tcG9uZW50cyB3ZXJlIGxvc3QgZHVyaW5nIG1vZHVsZSBsaW5raW5nDQog IOKAoiBQUjogRml4IHdyaXRpbmcgb2YgZGF0YSBzZWdtZW50IG5hbWVzIGluIG5hbWUgc2VjdGlv bg0KICAgIFtXZWJBc3NlbWJseS9iaW5hcnllbiM2NDYyXQ0KICAgIOKAoiBCaW5hcnllbiBjb3Vs ZCBhY3R1YWxseSBnZW5lcmF0ZSBhIG1hbGZvcm1lZCBuYW1lIHNlY3Rpb24NCg0KDQpbc2xpZGVz IGF2YWlsYWJsZSBoZXJlXQ0KPGh0dHBzOi8vY2FtYml1bS5pbnJpYS5mci9zZW1pbmFpcmVzL3Ry YW5zcGFyZW50cy8yMDIzMTIxMy5KZXJvbWUuVm91aWxsb24ucGRmPg0KDQpbb2NhbWwtd2FzbS93 YXNtX29mX29jYW1sIzI3XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zf b2NhbWwvcHVsbC8yNz4NCg0KW1dlYkFzc2VtYmx5L2JpbmFyeWVuIzYzNzJdDQo8aHR0cHM6Ly9n aXRodWIuY29tL1dlYkFzc2VtYmx5L2JpbmFyeWVuL3B1bGwvNjM3Mj4NCg0KW29jYW1sLXdhc20v d2FzbV9vZl9vY2FtbCMzNl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29m X29jYW1sL3B1bGwvMzY+DQoNCltvY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMzBdDQo8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbC9wdWxsLzMwPg0KDQpbb2NhbWwt d2FzbS93YXNtX29mX29jYW1sIzMxXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dh c21fb2Zfb2NhbWwvcHVsbC8zMT4NCg0KW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMzM10NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1sL3B1bGwvMzM+DQoNCltv Y2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMzRdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdh c20vd2FzbV9vZl9vY2FtbC9wdWxsLzM0Pg0KDQpbb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIzE4 XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvaXNzdWVzLzE4 Pg0KDQpbb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIzE5XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvcHVsbC8xOT4NCg0KW29jYW1sLXdhc20vd2FzbV9vZl9v Y2FtbCMyMF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1sL3B1 bGwvMjA+DQoNCltvY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMjFdDQo8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbC9wdWxsLzIxPg0KDQpbbzEtbGFicy9pbnRlZ2Vy c19zdHVic19qcyMxMF0NCjxodHRwczovL2dpdGh1Yi5jb20vbzEtbGFicy9pbnRlZ2Vyc19zdHVi c19qcy9wdWxsLzEwPg0KDQpbbzEtbGFicy9pbnRlZ2Vyc19zdHVic19qcyM5XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9vMS1sYWJzL2ludGVnZXJzX3N0dWJzX2pzL2lzc3Vlcy85Pg0KDQpbb2NhbWwt d2FzbS93YXNtX29mX29jYW1sIzIyXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dh c21fb2Zfb2NhbWwvcHVsbC8yMj4NCg0KW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMyNF0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2FzbS93YXNtX29mX29jYW1sL3B1bGwvMjQ+DQoNCltv Y2FtbC13YXNtL3dhc21fb2Zfb2NhbWwjMjVdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdh c20vd2FzbV9vZl9vY2FtbC9wdWxsLzI1Pg0KDQpbb2NhbWwtd2FzbS93YXNtX29mX29jYW1sIzI2 XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC13YXNtL3dhc21fb2Zfb2NhbWwvcHVsbC8yNj4N Cg0KW29jYW1sLXdhc20vd2FzbV9vZl9vY2FtbCMyOV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwtd2FzbS93YXNtX29mX29jYW1sL3B1bGwvMjk+DQoNCltXZWJBc3NlbWJseS9iaW5hcnllbiM2 NDM3XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9iaW5hcnllbi9wdWxsLzY0Mzc+ DQoNCltXZWJBc3NlbWJseS9iaW5hcnllbiM2NDY2XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJB c3NlbWJseS9iaW5hcnllbi9wdWxsLzY0NjY+DQoNCltXZWJBc3NlbWJseS9iaW5hcnllbiM2NDYy XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9XZWJBc3NlbWJseS9iaW5hcnllbi9wdWxsLzY0NjI+DQoN Cg0KT0NhbWwgNS4yLjAgcmVsZWFzZWQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0yLTAtcmVsZWFzZWQvMTQ2MzgvMT4NCg0KDQpvY3RhY2hy b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGUgT0NhbWwgdGVhbSBoYXMgdGhlIHBsZWFzdXJlIG9mIGNl bGVicmF0aW5nIHRoZSBiaXJ0aGRheSBvZiBJbmdlDQogIExlaG1hbm4gYnkgYW5ub3VuY2luZyB0 aGUgcmVsZWFzZSBvZiBPQ2FtbCB2ZXJzaW9uIDUuMi4wLg0KDQogIFNvbWUgb2YgdGhlIGhpZ2hs aWdodHMgaW4gT0NhbWwgNS4yLjAgYXJlOg0KICDigKIgUmUtaW50cm9kdWNlZCBHQyBjb21wYWN0 aW9uDQogICAgR0MgY29tcGFjdGlvbiBjYW4gbm93IGJlIG1hbnVhbGx5IHRyaWdnZXJlZCBieSBj YWxsaW5nIGBHYy5jb21wYWN0DQogICAgKCknIG1hbnVhbGx5LiAgVGhpcyBpcyBleHBlY3RlZCB0 byBiZSBwYXJ0aWN1bGFybHkgdXNlZnVsIGZvcg0KICAgIHByb2dyYW1zIHRoYXQgd2lzaCB0byBy ZWxlYXNlIG1lbW9yeSB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhZnRlciBhDQogICAgdGVtcG9y YXJ5IG1lbW9yeS1pbnRlbnNpdmUgcGhhc2UuDQoNCiAg4oCiIFJlc3RvcmVkIG5hdGl2ZSBiYWNr ZW5kIGZvciBQT1dFUiA2NCBiaXRzDQogICAgV2l0aCB0aGlzIHJlc3RvcmVkIGJhY2tlbmQsIGFs bCA2NCBiaXRzIGFyY2hpdGVjdHVyZSBzdXBwb3J0ZWQgaW4NCiAgICBPQ2FtbCA0IGFyZSBzdXBw b3J0ZWQgYmluIE9DYW1sIDUNCg0KICDigKIgVGhyZWFkIHNhbml0aXplciBzdXBwb3J0DQogICAg VGhyZWFkIHNhbml0aXplciBpcyBhIGR5bmFtaWMgZGF0YSByYWNlIGRldGVjdG9yIHdoaWNoIGlu c3RydW1lbnQNCiAgICBtZW1vcnkgYWNjZXNzZXMgdG8gZGV0ZWN0IGFuZCBleHBsYWluIGRhdGEg cmFjZXMgYXQgZXhlY3V0aW9uDQogICAgdGltZS4gU2luY2UgdGhlIGluc3RydW1lbnRhdGlvbiBp cyBjb3N0bHkgKHdpdGggYSAyeCB0byA3eA0KICAgIHNsb3dkb3duKSwgaXQgbXVzdCBiZSBlbmFi bGVkIHdpdGggdGhlIGBvY2FtbC1vcHRpb24tdHNhbicNCiAgICBjb25maWd1cmF0aW9uIGZsYWcu IChUaGUgcmVmZXJlbmNlIG1hbnVhbCBjb250YWlucyBtb3JlIGluZm9ybWF0aW9uDQogICAgb24g aG93IHRvIHVzZSBUU0FOLikNCg0KICDigKIgTmV3IER5bmFycmF5IG1vZHVsZQ0KICAgIFRoaXMg bmV3IHN0YW5kYXJkIGxpYnJhcnkgbW9kdWxlIHByb3ZpZGVzIGEgc3RhbmRhcmQgaW1wbGVtZW50 YXRpb24NCiAgICBmb3IgcmVzaXplYWJsZSBhcnJheSwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBi ZSBtZW1vcnkgc2FmZSBldmVuIGluDQogICAgcHJlc2VuY2Ugb2YgZGF0YSByYWNlcy4NCg0KICDi gKIgTmV3IC1IIGZsYWcgZm9yIGhpZGRlbiBpbmNsdWRlIGRpcmVjdG9yaWVzDQogICAgVGhpcyBu ZXcgZmxhZyBtYWtlcyBpdCBwb3NzaWJsZSBmb3IgYnVpbGQgdG9vbHMgdG8gc3BsaXQgY2xlYW5s eQ0KICAgIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGRpcmVjdCAodGhlIGRlcGVuZGVuY2llcyBleHBs aWNpdGx5IGFkZGVkIGJ5DQogICAgdGhlIHByb2plY3QpIGFuZCBpbmRpcmVjdCBkZXBlbmRlbmNp ZXMgKHRoZSBkZXBlbmRlbmNpZXMgaW50cm9kdWNlZA0KICAgIGJ5IHRoZSBkaXJlY3QgZGVwZW5k ZW5jaWVzKSB3aXRob3V0IHRoZSBxdWlya3Mgb2YgcHJldmlvdXMNCiAgICBpbXBsZW1lbnRhdGlv bnMuDQoNCiAg4oCiIFByb2plY3Qtd2lkZSBvY2N1cmVuY2UgbWV0YWRhdGEgc3VwcG9ydCBmb3Ig ZGV2ZWxvcGVyIHRvb2xzDQogICAgV2hlbiBjb21waWxpbmcgYSBtb2R1bGUgd2l0aCB0aGUgYC1i aW4tYW5ub3QnIGFuZA0KICAgIGAtYmluLWFubm90LW9jY3VycmVuY2VzJyBmbGFncywgdGhlIGNv bXBpbGVyIHN0b3JlcyBpbiB0aGUgYC5jbXQnDQogICAgZmlsZSBhbiBpbmRleCBvZiBhbGwgb2Nj dXJlbmNlcyBvZiB2YWx1ZXMsIHR5cGVzLCBtb2R1bGVzLCDigKYNCg0KICDigKIgUmF3IGlkZW50 aWZpZXJzDQogICAgVG8gaW1wcm92ZSBPQ2FtbCB1cHdhcmQtY29tcGF0aWJpbGl0eSwgdGhlcmUg aXMgYSBuZXcgc3ludGF4IGZvcg0KICAgIGxvd2VyY2FzZSBpZGVudGlmaWVycywgYGxldCBcI2lm ID0gMCcsIHdoaWNoIHdvcmtzIGV2ZW4gaWYgdGhlDQogICAgaWRlbnRpZmllciBpcyBhIGtleXdv cmQgaW4gc29tZSBPQ2FtbCB2ZXJzaW9ucy4gVGhpcyBjaGFuZ2UgaGFzIGJlZW4NCiAgICBhZG9w dGVkIGluIE9DYW1sIDUuMiBpbiBwcmVwYXJhdGlvbiBvZiB0aGUgaW50cm9kdWN0aW9uIG9mIHRo ZQ0KICAgIGBlZmZlY3QnIGtleXdvcmQgaW4gT0NhbWwgNS4zDQoNCiAg4oCiIExvY2FsIG9wZW4g aW4gdHlwZSBleHByZXNzaW9ucw0KICAgIExvY2FsIG9wZW4gYXJlIG5vdyBhbGxvd2VkIGluIHR5 cGUgZXhwcmVzc2lvbjogYHZhbCAoKyk6IEludDY0Lih0IC0+DQogICAgdCAtPiB0KScuDQoNCiAg QW5kIGEgbG90IG9mIGluY3JlbWVudGFsIGNoYW5nZXM6DQoNCiAg4oCiIEFyb3VuZCAyMCBuZXcg ZnVuY3Rpb25zIGluIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IGJlc2lkZXMgdGhlIG5ldw0KICAgIER5 bmFycmF5IG1vZHVsZSAoaW4gdGhlIGBBcnJheScsIGBGbG9hdCcsIGBGb3JtYXQnLCBgRnVuJywN CiAgICBgSW5fY2hhbm5lbCcsIGBPdXRfY2hhbm5lbCcsIGFuZCBgUmFuZG9tJyBtb2R1bGVzICkN CiAg4oCiIE1hbnkgZml4ZXMgYW5kIGltcHJvdmVtZW50cyBpbiB0aGUgcnVudGltZQ0KICDigKIg TWFueSBidWcgZml4ZXMNCg0KICBPQ2FtbCA1LjIuMCBpcyBzdGlsbCBhIHNvbWV3aGF0IGV4cGVy aW1lbnRhbCByZWxlYXNlIGNvbXBhcmVkIHRvIHRoZQ0KICBPQ2FtbCA0LjE0IGJyYW5jaC4gSW4g cGFydGljdWxhcg0KDQogIOKAoiBUaGUgV2luZG93cyBNU1ZDIHBvcnQgaXMgc3RpbGwgdW5hdmFp bGFibGUuDQogIOKAoiBFcGhlbWVyb24gcGVyZm9ybWFuY2VzIG5lZWQgdG8gYmUgaW52ZXN0aWdh dGVkLg0KICDigKIgYHN0YXRtZW1wcm9mJyBpcyBiZWluZyB0ZXN0ZWQgaW4gdGhlIGRldmVsb3Bl ciBicmFuY2ggb2YgT0NhbWwuDQogIOKAoiBUaGVyZSBhcmUgYSBudW1iZXIgb2Yga25vd24gcnVu dGltZSBjb25jdXJyZW5jeSBvciBHQyBwZXJmb3JtYW5jZQ0KICAgIGJ1Z3MgKHRoYXQgdHJpZ2dl ciB1bmRlciByYXJlIGNpcmN1bXN0YW5jZXMpLg0KDQogIFNpbmNlIHRoZSBXaW5kb3dzIE1TVkMg cG9ydCBhbmQgc3RhdG1lbXByb2YgYXJlIHN0aWxsIG1pc3NpbmcsIHRoZQ0KICBtYWludGVuYW5j ZSBzdXBwb3J0IGZvciBPQ2FtbCA0LjE0IHdpbGwgYmUgZXh0ZW5kZWQgdW50aWwgYXQgbGVhc3Qg dGhlDQogIGVuZCBvZiB0aGUgeWVhci4NCg0KICBQbGVhc2UgcmVwb3J0IGFueSB1bmV4cGVjdGVk IGJlaGF2aW91cnMgb24gdGhlIFtPQ2FtbCBpc3N1ZSB0cmFja2VyXQ0KICBhbmQgcG9zdCBhbnkg cXVlc3Rpb25zIG9yIGNvbW1lbnRzIHlvdSBtaWdodCBoYXZlIGhlcmUgb24gZGlzY3Vzcy4NCg0K ICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgY2FuIGJlIGZvdW5kIGluIHRoZSBjaGFuZ2Vsb2cg YmVsb3cuDQoNCg0KW09DYW1sIGlzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzPg0KDQpJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBUaGUgYmFzZSBjb21waWxlciBjYW4gYmUgaW5zdGFsbGVkIGFzIGFuIG9w YW0gc3dpdGNoIHdpdGggdGhlDQogIGZvbGxvd2luZyBjb21tYW5kczoNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgNS4yLjAN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgcmVsZWFzZSBj YW5kaWRhdGUgaXMgYWxzbyBkaXJlY3RseSBhdmFpbGFibGUNCiAgb246DQoNCiAg4oCiIFtHaXRI dWJdDQogIOKAoiBbT0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWFdDQoNCg0KW0dpdEh1Yl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9hcmNoaXZlLzUuMi4wLnRhci5nej4NCg0KW09DYW1s IGFyY2hpdmVzIGF0IElucmlhXQ0KPGh0dHBzOi8vY2FtbC5pbnJpYS5mci9wdWIvZGlzdHJpYi9v Y2FtbC01LjIvb2NhbWwtNS4yLjAudGFyLmd6Pg0KDQoNCkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29u ZmlndXJhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgSWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVy LCB5b3UgY2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUg PHN3aXRjaF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjEuMCtvcHRpb25zIDxvcHRpb25fbGlzdD4N CiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KICB3aGVyZSBgPG9wdGlvbl9saXN0PicgaXMgYSBzcGFj ZSBzZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9uLSonDQogIHBhY2thZ2VzLiBGb3IgaW5z dGFuY2UsIGZvciBhIGBmbGFtYmRhJyBhbmQgYG5vLWZsYXQtZmxvYXQtYXJyYXknDQogIHN3aXRj aDoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjIuMCtm bGFtYmRhK25mZmEgb2NhbWwtdmFyaWFudHMuNS4yLjArb3B0aW9ucyBvY2FtbC1vcHRpb24tZmxh bWJkYSBvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KICDilJTilIDilIDilIDilIAN Cg0KDQpPQ2FtbCA1LjIuMCBDaGFuZ2Vsb2cgKDEzIE1heSAyMDI0KQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCihDaGFuZ2Vsb2cgZWxpZGVkIHRv IHJlZHVjZSBtZXNzYWdlIHNpemUuIFBsZWFzZSBmb2xsb3cgdGhlIGFyY2hpdmUgbGluaw0KYWJv dmUuKSANCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFw cGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBt YWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0 aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0 byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8g dGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNz YWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNo aXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2Yg dGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4N Cg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxp c3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 07 to 14, 2024.

    Some code for Molecular Mechanics in OCaml

    UnixJunkie announced

    Recently, I released a bunch of code for some Molecular Mechanics calculations in OCaml.

    This is pretty much at the beta stage for the moment.

    https://github.com/UnixJunkie= /MMO

    Maybe in the future I will create a proper library to encapsulate the Mol and Mol2 modules in there; they allow to perform some operations on small molecules.

    For those interested, there is a partial implementation of the Universal Fo= rce Field (UFF) in there; only the part concerning non-bonded interactions.

    OCaml.org Newsletter: April 2024

    Sabine Schmaltz announced

    Welcome to the April 2024 edition of the OCaml.org newsletter! This update = has been compiled by the OCaml.org team. You can find previous updates on Discuss.

    Our goal is to make OCaml.org the best resource for anyone who wants to get= started and be productive in OCaml. The OCaml.org newsletter provides an u= pdate on our progress towards that goal and an overview of the changes we a= re working on.

    We couldn't do it without all the amazing people who help us review, revise= , and create better OCaml documentation and work on issues. Your participat= ion enables us to so much more than we could just by ourselves. Thank you!

    This newsletter covers:

    • OCaml Cookbook: We shipped a new, community-driven section in th= e Learn area. Help us make it really useful by contributing and reviewing r= ecipes for common tasks!
    • Community & Marketing Pages Rework: We have UI designs for t= he reworked and new pages of the community section and are starting work to= implement these.
    • General Improvements: As usual, we also worked on general mainte= nance and improvements, so we're highlighting some of the work that happene= d below.

    Open Issues for Contributors

    You can find open issues for co= ntributors here!

    Here's some new (and as of time of writing this newsletter still open) issu= es that were opened this month:

    The OCaml Cookbook

    We shipped a new, community-driven section in the Learn area: the OCaml Coo= kbook!

    The OCaml Cookbook is a place where OCaml developers share how to solve com= mon tasks using packages from the ecosystem.

    A task is something that needs to be done inside a project. A recipe is a c= ode sample and explanations on how to perform a task using a combination of= open source libraries.

    The Cookbook now live at ocaml.org/c= ookbook, but there are not a lot of recipes published yet.

    Here's how we need your help:

    1. Help review open pull requests for cookbook recipes!
    2. Contribute new recipes and tasks for the cookbook!
    3. Suggest improvements to existing recipes and the UI.

    Relevant PRs and Activities:

    Community & Marketing Pages Rework

    We have UI designs for the reworked and new pages of the = community section and are starting work to implement these. We are open= ing small issues for contributors to help. :orange_heart:=20

    Relevant PRs and Activities:

    General Improvements and Data Additions

    Relevant PRs and Activities:

    Example of using LSP server in Emacs

    Tim McGilchrist announced

    I wrote a blog post about my setup https://lambdafoo.com/posts/2022-09-0= 7-ocaml-with-emacs-2022.html The only change I've made is to use = envrc-mode rather than direnv-mode.

    Dune Developer Experience Feedback Form

    ostera announced

    The Dune team at Tarides is looking to = get inputs from all of you to improve the Dune DX (developer experience), s= o we've opened a small, ano= nymous, unstructured feedback form to hear your ideas on how Dune could= be improved :camel:=20

    We're looking forward to your ideas! :sparkles:=20

    DkML 2.1.1

    jbeckford announced

    Use https://ocaml.org/install if = you are a first-time user (the install steps haven't changed).

    The upgrade steps and release notes are available at https://gitlab.com/dkml/d= istributions/dkml/-/releases/2.1.1. For those who are on 2.1.0, the upg= rade is the following in PowerShell:

    1..6 | % {  @("bash","sh","with-dkml","ocamllsp","git","opam","dune","ocaml=
    run") | % { taskkill /F /IM "$_.exe" }; Start-Sleep 1 }
    winget upgrade dkml
    

    Major Changes

    • The opam repository is fixed to commit 6c3f73f4= 2890cc19f81eb1dec8023c2cd7b8b5cd for stability. If you need a new versi= on of a package and can't wait for the next version of DkML, you can pin th= at package's url (recommended) or float the opam repository with opam= repository set-url default git+https://github.com/ocaml/opam-repository.gi= t#main.
    • Windows SDK 10.0.22621.0 and VC 17.8 (14.38) added to allowed list. Thi= s supports Visual Studio 2022, especially for GitLab CI.
    • New supported package: tiny_httpd

    Patches

    Package What Issue
    base_bigstring.v16.0 Implement memmem for Windows https://github.com/janestreet/base_bigstring/issues/6
    core_kernel.v0.16.0 MSVC fix didn't make it to 0.16.0 https://github.com/janestreet/core_kernel/pull/107

    Upgraded Packages

    Package From To
    dune (et al) 3.12.1 3.15.0
    ocaml 4.14.0 4.14.2
    ocamlformat (et al) 0.25.1 0.26.1
    odoc 2.2.0 2.4.1
    odoc-parser 2.0.0 2.4.1
    lsp (et al) 1.16.2 1.17.0
    mdx 2.3.0 2.4.1
    ctypes (et al) 0.19.2-windowssupport-r7 0.19.2-windowssupport-r8
    tiny_httpd   0.16

    Thanks to OCaml Software Foundation for sponsoring DkML!

    A May update on wasm_of_ocaml

    Jan Midtgaard announced

    Spring is over us and several months have passed since we last shared an update on WebAssembly compilation.

    Introduction

    wasm_of_ocaml= is a compiler from OCaml bytecode to WebAssembly, similar to js_of_ocaml from which it was forked. wasm_of_ocaml offers a functional, almost drop-in replacement for <= code>js_of_ocaml - with better performance.

    For now, the compiler targets a JavaScript-hosted WebAssembly engine. The p= roduced code furthermore requires the following Wasm extensions to run:

    Platform support

    wasm_of_ocaml news

    Since the last update in December

    • J=C3=A9r=C3=B4me gave a talk about wasm_of_ocaml at the IN= RIA Cambium seminar - slides available here
    • Olivier Nicole joined the wasm_of_ocaml effort
    • J=C3=A9r=C3=B4me and Olivier visited Jane Street to help them adopt wasm_of_ocaml

    Notable features

    • Sourcemap support was added ocaml-wasm/wasm_of_ocaml#27
    • A first implementation of separate compilation was completed ocaml-wasm/wasm_of_oc= aml#36
      • One can compile cmo and cma files, producing intermediate archive files=
      • Then the files can be linked together: relevant Wasm modules are put in= a directory, and JavaScript code is generated to load them and link them t= ogether
    • Store long-lived toplevel values into globals ocaml-wasm/wasm_of_ocaml#30
      • The initialization code produced by wasm_of_ocaml can be l= arge and contain a large number of variables. This is challenging to both b= inaryen tools and the Wasm engines. The problem can be alleviated by storin= g long-lived toplevel values into global variables. As an side benefit, man= y closures can be statically allocated (since their free variables are now = stored in globals), which again can provide performance improvements in the= remaining parts of the code.
    • Tuple syntax changes ocaml-wasm/wasm_of_ocaml#31
      • Prepared the switch to the new version of binaryen, which has small syn= tax changes
    • Use the JS String Builtins proposal for string conversions when availab= le ocaml-wa= sm/wasm_of_ocaml#33
    • Improve the WAT (Wasm text format) output to be more readable ocaml-wasm/wasm_of= _ocaml#34
      • Name local variables (they were just numbered) and use shorter names (t= he names used to be systematically suffixed to ensure they were unique).

    Other features and fixes

    Binaryen fixes

    OCaml 5.2.0 released

    octachron announced

    The OCaml team has the pleasure of celebrating the birthday of Inge Lehmann= by announcing the release of OCaml version 5.2.0.

    Some of the highlights in OCaml 5.2.0 are:

    • Re-introduced GC compaction
      GC compaction can now be manually triggered by calling Gc.compact ()<= /code> manually. This is expected to be particularly useful for programs that wish to releas= e memory to the operating system after a temporary memory-intensive phase.
    • Restored native backend for POWER 64 bits
      With this restored backend, all 64 bits architecture supported in OCaml 4 a= re supported bin OCaml 5
    • Thread sanitizer support
      Thread sanitizer is a dynamic data race detector which instrument memory accesses to detect and explain data races at execution time. Since the instrumentation is costly (with a 2x to 7x slowdown), it must be enabled wi= th the ocaml-option-tsan configuration flag. (The reference manua= l contains more information on how to use TSAN.)
    • New Dynarray module
      This new standard library module provides a standard implementation for res= izeable array, which is guaranteed to be memory safe even in presence of data races.
    • New -H flag for hidden include directories
      This new flag makes it possible for build tools to split cleanly dependenci= es between direct (the dependencies explicitly added by the project) and indir= ect dependencies (the dependencies introduced by the direct dependencies) witho= ut the quirks of previous implementations.
    • Project-wide occurence metadata support for developer tools
      When compiling a module with the -bin-annot and -bin-ann= ot-occurrences flags, the compiler stores in the .cmt file an index of all oc= curences of values, types, modules, …
    • Raw identifiers
      To improve OCaml upward-compatibility, there is a new syntax for lowercase identifiers, let \#if =3D 0, which works even if the identifie= r is a keyword in some OCaml versions. This change has been adopted in OCaml 5.2 in preparation of the introduction of the effect keyword in OCaml= 5.3
    • Local open in type expressions
      Local open are now allowed in type expression: val (+): Int64.(t ->= ; t -> t).

    And a lot of incremental changes:

    • Around 20 new functions in the standard library besides the new Dynarra= y module (in the Array, Float, Format, = Fun, In_channel, Out_channel, and Ra= ndom modules )
    • Many fixes and improvements in the runtime
    • Many bug fixes

    OCaml 5.2.0 is still a somewhat experimental release compared to the OCaml 4.14 branch. In particular

    • The Windows MSVC port is still unavailable.
    • Ephemeron performances need to be investigated.
    • statmemprof is being tested in the developer branch of OCa= ml.
    • There are a number of known runtime concurrency or GC performance bugs (that trigger under rare circumstances).

    Since the Windows MSVC port and statmemprof are still missing, the maintena= nce support for OCaml 4.14 will be extended until at least the end of the year.

    Please report any unexpected behaviours on the OCaml issue tracker and post any questions or com= ments you might have here on discuss.

    The full list of changes can be found in the changelog below.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands:

    opam update
    opam switch create 5.2.0
    

    The source code for the release candidate is also directly available on:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.1.0+options <opt=
    ion_list>
    

    where <option_list> is a space separated list of o= caml-option-* packages. For instance, for a flambda and= no-flat-float-array switch:

    opam switch create 5.2.0+flambda+nffa ocaml-variants.5.2.0+options ocaml-op=
    tion-flambda ocaml-option-no-flat-float-array
    

    OCaml 5.2.0 Changelog (13 May 2024)

    (Changelog elided to reduce message size. Please follow the archive link above for the full message.)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=crmv84mO; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Zf+TBMR/; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B1B89B80123 for ; Tue, 21 May 2024 14:07:26 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=rbxm3cn5hxk5OS1xm727gJzQwErEr0L2HQ2b1GPOOZg=; b=crmv84mOGkj8JyLpueyHjMgIUhalYEuclVYoNjHtFS2l7NIJ29rOev1J nivX+SC405ND38XsFWuMkBh2xwfv9NiA4kyNkCpcQWoCRCQfi1Yx87biZ HHW997X3piwAL9kYVAU45o15Qc3EJfyuri0ZsoDF2wLbl0lKlxVuvaT+T 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,177,1712613600"; d="scan'208,217";a="166661573" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 May 2024 15:07:25 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 43F9CE0CD0; Tue, 21 May 2024 15:07:25 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6909DE00B6 for ; Tue, 21 May 2024 15:07:23 +0200 (CEST) IronPort-SDR: 664c9c88_pqle9rxErHYlrYnSOsjjZ0fphRibmMjHBvqWzc0hw0CnNrr vaLD9FBTPiYY/qA1LWFU3SSjf/EPfajkq6WaOfQ== X-IPAS-Result: =?us-ascii?q?A0FlBABQm0xmkCIeaIFQCoQZgQMZAWJaMwcISIRWg0+OG?= =?us-ascii?q?4EWkDCIQYIwgWqBEQMYFiMUAQMBDS4BDgQBAgQBAQMBAgGEOUYCFoguAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBIB4QD?= =?us-ascii?q?ieFdA2CSi4jURpRDQMCAgMDAwYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAggEAR0/AT8BAgYEB?= =?us-ascii?q?hMBATgYIwMUAQYDAgQNATUDARMBEhQGAYJlAYJkAwUMBpI7mzt6fzOBAYIMA?= =?us-ascii?q?QEGgQg+AwsCAgMBDgklAdoEgWMJgUiIFBoBJEhpAoQHHgmENycPgVVEgRU1g?= =?us-ascii?q?j0Hb4FQAW4LFwEBAQEYQkYRCwEBTQmDJYJpgWqEISaBXQGFSVZ+gw1nDBQoL?= =?us-ascii?q?22BCi8YD1GCIgMEBQMUgSsCeAIGFoEWAw9LWQ9ZdUYUQg6BTIgVgUtLMyETA?= =?us-ascii?q?VUTFws+CRYCFgMbFAQwDwkLJioGOQISDAYGBlk0CQQjAwgEA0IDIHERAwQaB?= =?us-ascii?q?AsHdYE8gWkEE0QDgTeHHYJTgzuCHoQeS4RzgXYOYYgbgXOBR0YdQAMLbT01F?= =?us-ascii?q?BsopBwENQKCdA4KAS0IXwEaDhAJCA4CIAIuCAUEMAoVBBkNBQkDEjUIAwIJI?= =?us-ascii?q?A+SMA4GJAQlBZ0hlE80B4QWgVsGDIgUaYEklWuEBYFWiyiZMSKYQCCBCIEsg?= =?us-ascii?q?kAzhCoKgRsJglWVBjwEhU2BfCM8bwEdAQsHMxowIiGCMwEzCRYwHA+OLRaDW?= =?us-ascii?q?BAxfYEmgXU7gWhZxWBBNQIBATcCBwEKAQEDCYViAQGDPoFIAQE?= IronPort-PHdr: A9a23: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 DciCjQdn3dxag== IronPort-Data: A9a23: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 vRAI5TzOahdFH1s5Q== IronPort-HdrOrdr: A9a23:1++JOqpMmRI9v+kB4PW9LhsaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: =?us-ascii?q?9a23=3AgdTMZmob0aM9lipm3fUqA0LmUfxiQHbMkC/dH2y?= =?us-ascii?q?pFkBNVua8c3jPoooxxg=3D=3D?= X-Talos-MUID: 9a23:XVbBWgUBSdz2NAzq/BTnoC9GMMp12PyREm5Xnso5itSZMAUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.08,177,1712613600"; d="scan'208,217";a="87562854" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFXN8ykGZ0rpeI83K6cLhsCEO7yOnBFfla1eG?= =?us-ascii?q?0E4J+KyDsrf6ug7jn6wJfhtpEdTt7HKAqnBU/C986oF1vOHDQaU3A3Jc?= =?us-ascii?q?p5BZuVHmvabbC5wgq2bTlzP7wI5j4WZGRxhP6vdZRISWk+zVpmR5hm+c?= =?us-ascii?q?hiW89SrUCHMP2deGtVjsmOLA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 May 2024 15:07:21 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A72335647FE; Tue, 21 May 2024 15:07:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1716296839; bh=AldhN+MbG1c58JnEqlDZ89VthadCx9feqpSl2tyXuVY=; h=From:To:Subject:Date:Message-ID; b=Zf+TBMR/6Q8Y2siQZ77UqOLkMafFSy9u6qgIS7ihxcy8U8b7zwcUz5EkU7/sob4OC ZTyONzu7oo0ia4iMzL0/D3kngXxDrTomfKuSWs3bPOu1fPJ4Xzzgz1r7AYGCfpYhuS FdPCPT3FhBXQ+0GMPTHHT37So2xLzz+vuwXJAf2U= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 21 May 2024 15:07:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 21 15:07:20 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499064, queueID=DF1CB5647FF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19133 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDE0IHRvIDIxLA0KMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpXZSBXYW50IFlv dXIgRmVlZGJhY2sgb24gdGhlIG9kb2MgRGV2ZWxvcGVyIEV4cGVyaWVuY2UNCldpbmRvd3MgY29t cGlsZXIgc3VwcG9ydCBpbiBvcGFtIDIuMi4wfmJldGEyDQpPQ2FtbCBXb3Jrc2hvcCAyMDI0IGF0 IElDRlAg4oCTIGFubm91bmNlbWVudCBhbmQgY2FsbCBmb3IgcHJvcG9zYWxzDQpPZG9jIHN5bnRh eCBjaGVhdHNoZWV0DQpEa0NvZGVyIDAuMiAtIFNjcmlwdGluZyBpbiBPQ2FtbA0KSW1hbmRyYSBT eXNNTCBUcmFuc3BpbGVyIEludGVybnNoaXAgT3Bwb3J0dW5pdHkhDQpCYW0gLSBBIHByb3BlcnR5 LWJhc2VkIHRlc3Rpbmcgd2l0aCBpbnRlcm5hbCBzaHJpbmtpbmcNClN0aXRjaCAtIE5vdGUgTWFu YWdpbmcgZm9yIFVub3JnYW5pemVkIE1pbmltYWxpc3RzDQo3IE9DYW1sIEdvdGNoYXMNClVzaW5n IE9DYW1sIG9uIHdpbmRvd3Mgd2l0aCBXU0wNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0K DQpXZSBXYW50IFlvdXIgRmVlZGJhY2sgb24gdGhlIG9kb2MgRGV2ZWxvcGVyIEV4cGVyaWVuY2UN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2Utd2FudC15b3VyLWZlZWRi YWNrLW9uLXRoZS1vZG9jLWRldmVsb3Blci1leHBlcmllbmNlLzE0NjQ2LzE+DQoNCg0KU2FiaW5l IFNjaG1hbHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGV5IGFsbCwg8J+n ofCfkKsNCg0KICB0aGUgZG9jdW1lbnRhdGlvbiB0ZWFtIGF0IFtUYXJpZGVzXSBpcyBsb29raW5n IGZvciBpbnB1dCBhbmQgZmVlZGJhY2sNCiAgb24gb2RvYy4NCg0KICBJIHdvdWxkIGJlIHN1cGVy IGhhcHB5IGlmIGV2ZXJ5b25lIHdobyB1c2VzIG9kb2Mgb3Igd291bGQgdXNlIG9kb2MgaWYNCiAg aXQgd29ya2VkIGZvciB0aGVtIGNhbiBkcm9wIGFuIGFuc3dlciBpbiB0aGlzIGZlZWRiYWNrIGZv cm06DQoNCiAgPGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2ZwWkhs bmJRaldvbEFoS0p2bjQxYVQ1UUpjN0diN3VaSlNkdFRUN01aZUFkeU1vdy92aWV3Zm9ybT91c3A9 c2ZfbGluaz4NCg0KDQpbVGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20+DQoNCg0KV2luZG93 cyBjb21waWxlciBzdXBwb3J0IGluIG9wYW0gMi4yLjB+YmV0YTINCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2luZG93cy1j b21waWxlci1zdXBwb3J0LWluLW9wYW0tMi0yLTAtYmV0YTIvMTQ2NDgvMT4NCg0KDQpEYXZpZCBB bGxzb3BwIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBlbnRp cmUgb3BhbSB0ZWFtLCBidXQgYWxzbyB3aXRoIGEgcGVyc29uYWwgc2Vuc2Ugb2YNCiAgcmVsaWVm LCBJJ20gdmVyeSBwbGVhc2VkIHRvIGFubm91bmNlIHRoYXQgdGhlIHByb2Nlc3Mgb2YgdXBzdHJl YW1pbmcNCiAgc3VwcG9ydCBmb3IgV2luZG93cyBPQ2FtbCB0byBvcGFtLXJlcG9zaXRvcnkgaW4N CiAgW29jYW1sL29wYW0tcmVwb3NpdG9yeSMyNTg2MV0gZmluYWxseSBzdGFydGVkIG9uIEZyaWRh eSENCg0KICBUaGVyZSdzIGEgZnVsbCBbYmxvZyBwb3N0XSB3aXRoIGRldGFpbHMgb24gaG93IHlv dSBjYW4gdHJ5IHRoaXMgb3V0DQogIG5vdyB3aXRoIG9wYW0gMi4yLjB+YmV0YTIuIFRoZSBUTDtE UiwgYXNzdW1pbmcgeW91IGhhdmUgd2luZ2V0IG9uIHlvdXINCiAgV2luZG93cyBzeXN0ZW0gKG9w ZW4gdGhlIE1pY3Jvc29mdCBTdG9yZSBhcHAgYW5kIGluc3RhbGwgdGhlIFtBcHANCiAgSW5zdGFs bGVyXSBwYWNrYWdlIGZyb20gTWljcm9zb2Z0IGlmIHlvdSBkb24ndCkgdGhlbiB5b3UgY2FuIGlz c3VlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgd2luZ2V0IGluc3RhbGwgR2l0LkdpdA0K ICDilJTilIDilIDilIDilIANCg0KICBpZiB5b3UgZG9uJ3QgaGF2ZSBHaXQgZm9yIFdpbmRvd3Mg YW5kOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgd2luZ2V0IGluc3RhbGwgb3BhbQ0KICDi lJTilIDilIDilIDilIANCg0KICBpZiB5b3UgZG9uJ3QgeWV0IGhhdmUgdGhlIDIuMi4wfmJldGEy IGJpbmFyeS4gKllvdSBtdXN0IHRoZW4gbGF1bmNoIGENCiAgZnJlc2ggQ29tbWFuZCBQcm9tcHQg LyBQb3dlclNoZWxsIHNlc3Npb24qLiBGb3IgdGhlcmUsIHlvdSBjYW4gdGhlbg0KICBydW46DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluaXQgZ2l0K2h0dHBzOi8vZ2l0aHViLmNv bS9kcmEyNy9vcGFtLXJlcG9zaXRvcnkuZ2l0I3dpbmRvd3MtaW5pdGlhbA0KICDilJTilIDilIDi lIDilIANCg0KICBvcg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBpbml0IC1hIC0t bm8tZ2l0LWxvY2F0aW9uIC0tY3lnd2luLWludGVybmFsLWluc3RhbGwgZ2l0K2h0dHBzOi8vZ2l0 aHViLmNvbS9kcmEyNy9vcGFtLXJlcG9zaXRvcnkuZ2l0I3dpbmRvd3MtaW5pdGlhbA0KICDilJTi lIDilIDilIDilIANCg0KICBpZiB5b3UnZCBsaWtlIHRvIGJlIGFza2VkIGZld2VyIHF1ZXN0aW9u cy4gKlRoZXJlIGlzIGEga25vd24gYW5kIGJpZw0KICBwYXVzZSB3aGVuIHVwZGF0aW5nIHRoZSBy ZXBvc2l0b3J5Ki4gSG93ZXZlciwgYWZ0ZXIgYSBsaXR0bGUgYml0IG9mDQogIHRpbWUgKGNvZmZl ZSwgb3IgW2Egc3dvcmQgYmF0dGxlXSwgaWYgdGhhdCdzIHlvdXIgdGhpbmcpLCB5b3Ugc2hvdWxk DQogIHRoZW4gYmUgZmFjZWQgd2l0aCBhIGZ1bGx5IGluaXRpYWxpc2VkIG9wYW0gd2l0aA0KICBv Y2FtbC1iYXNlLWNvbXBpbGVyLjUuMi4wIGluc3RhbGxlZCBmb3IgdGhlIG1pbmd3LXc2NCBhbWQ2 NCBwb3J0IG9mDQogIG5hdGl2ZSBXaW5kb3dzIG9wYW0uDQoNCiAgVGhpbmdzIHdpdGggZGVwZXh0 cyB3aWxsIGxpa2VseSBub3Qgd29yazogdGhlIGJsb2cgcG9zdCBjb250YWlucw0KICBkZXRhaWxz IG9uIGhvdyB0byBnZXQgc3RhcnRlZCB3aXRoIFBScywgYnV0IGlzc3VlcyBhcmUgYWxzbyBoZWxw ZnVsLg0KDQogIFRoZSBibG9nIHBvc3QgY292ZXJzIHdoYXQgd2UgcmVnYXJkIGFzIHRoZSAiZGVm YXVsdCB1c2UgY2FzZSIgLSB0aGF0DQogIGlzIGEgbmF0aXZlIFdpbmRvd3MgdXNlciBleHBlY3Rp bmcgdG8gdXNlIHRoaXMgbmV3IE9DYW1sIHRoaW5nIHRoZXkNCiAgaGVhcmQgYWJvdXQgbmF0aXZl bHkuIGkuZS4gbm90IHJ1bm5pbmcgaW4gV1NMIG9yIEN5Z3dpbiBvciBNU1lTMiBvcg0KICBhbnkg b3RoZXIgImFyZSB5b3Ugc3VyZSBjYW4ndCBqdXN0IGluc3RhbGwgTGludXggb24gdGhhdD8iIGFw cHJvYWNoLg0KDQogIEhvd2V2ZXIsIGFsbCB0aGUgb3RoZXIgdXNlIGNhc2VzIG1hdHRlciB0b28h IFlvdSdyZSBtZWFudCB0byBiZSBhYmxlDQogIHRvIHJ1biBuYXRpdmUgV2luZG93cyBvcGFtIGZy b20geW91ciBvd24gQ3lnd2luIG9yIE1TWVMyIG1pbnR0eSBiYXNoDQogIHRlcm1pbmFsOyB3ZSBh cmUgYWltaW5nIGZvciB0aGUgb3BhbSAyLjIuMCBiaW5hcnkgdG8gYmUgYSBkcm9wLWluDQogIHJl cGxhY2VtZW50IChhcGFydCBmcm9tIHNldHRpbmcgYG9zLWRpc3RyaWJ1dGlvbicgdG8gYCJjeWd3 aW5wb3J0cyInKQ0KICBmb3IgIk9DYW1sIGZvciBXaW5kb3dzIiBmb3IgbGVnYWN5IHVzZSB3aXRo IFt0aGUgInN1bnNldCIgcmVwb3NpdG9yeV07DQogIHlvdSdyZSBtZWFudCB0byBiZSBhYmxlIHRv IHByb3ZpZGUgeW91ciBvd24gQ3lnd2luIG9yIE1TWVMyDQogIGluc3RhbGxhdGlvbiBpZiB5b3Ug cmVhbGx5IG5lZWQgdG8gKGFuZCB5b3UgcmVhbGx5IG1pZ2h0ISkuIEJ1dCB3ZSBkbw0KICBuZWVk IGhlbHAgdGVzdGluZyBhbGwgb2YgaXQg8J+Zgg0KDQogIFdlIGFudGljaXBhdGUgb25lIGZ1cnRo ZXIgYmV0YSBvZiBvcGFtIDIuMi4wIGJ5IHRoZSBlbmQgb2YgdGhlDQogIG1vbnRoLiBGcm9tIHRo ZSBXaW5kb3dzIHBlcnNwZWN0aXZlLCB0aGlzIHdpbGwgZml4IGEga25vd24gYnVnIGluIHRoZQ0K ICBlbnZpcm9ubWVudCB2YXJpYWJsZSBoYW5kbGluZyAoc2VlIFtvY2FtbC9vcGFtIzU4MzhdKSBi dXQgd2lsbCBhbHNvDQogIGhvcGVmdWxseSBzdHJhaWdodGVuIG91dCB0aGUgYmVoYXZpb3VyIG9m IGBvcGFtIGluaXQnIGZvciBzb21lIG9mDQogIHRoZXNlICJub24tZGVmYXVsdCIgdXNlIGNhc2Vz LiBXZSdyZSB0aGVuIGhvcGluZyB0byByb2NrZXQgdG93YXJkcyBhDQogIHJlbGVhc2UgY2FuZGlk YXRlIGluIEp1bmUg8J+agA0KDQogIEhhcHB5IFdpbmRvd3MgaGFja2luZyEgUGxlYXNlIG9wZW4g aXNzdWVzOyBwbGVhc2UgYXNrIGZvciBmdXJ0aGVyDQogIGhlbHA7IHBsZWFzZSBoYXZlIGZ1biEN Cg0KICBEYXZpZCwgb24gYmVoYWxmIG9mIHRoZSBvcGFtIHRlYW0uDQoNCg0KW29jYW1sL29wYW0t cmVwb3NpdG9yeSMyNTg2MV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0 b3J5L3B1bGwvMjU4NjE+DQoNCltibG9nIHBvc3RdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Js b2cvb3BhbS0yLTItMC13aW5kb3dzLz4NCg0KW0FwcCBJbnN0YWxsZXJdIDxodHRwczovL2FwcHMu bWljcm9zb2Z0LmNvbS9kZXRhaWwvOW5ibGdnaDRubnMxPg0KDQpbYSBzd29yZCBiYXR0bGVdIDxo dHRwczovL3hrY2QuY29tLzMwMy8+DQoNClt0aGUgInN1bnNldCIgcmVwb3NpdG9yeV0NCjxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwtb3BhbS9vcGFtLXJlcG9zaXRvcnktbWluZ3c+DQoNCltvY2Ft bC9vcGFtIzU4MzhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXMvNTgzOD4N Cg0KDQpPQ2FtbCBXb3Jrc2hvcCAyMDI0IGF0IElDRlAg4oCTIGFubm91bmNlbWVudCBhbmQgY2Fs bCBmb3IgcHJvcG9zYWxzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXdvcmtzaG9wLTIwMjQtYXQtaWNm cC1hbm5vdW5jZW1lbnQtYW5kLWNhbGwtZm9yLXByb3Bvc2Fscy8xNDM3MS82Pg0KDQoNCkNvbnRp bnVpbmcgdGhpcyB0aHJlYWQsIFNvbmphIEhlaW56ZSBzYWlkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbmUg bW9yZSB1cGRhdGUsIHRoaXMgdGltZSBhYm91dCBoeWJyaWQgbW9kYWxpdGllczogV2Ugbm93IGhh dmUgdGhlDQogIGNvbmZpcm1hdGlvbiBmcm9tIHNpZ3BsYW4gKHRoZSBvcmdhbml6ZXJzIGJlaGlu ZCBJQ0ZQKSB0aGF0IHdlJ2xsIGhhdmUNCiAgdGhlIHNhbWUgaHlicmlkIG1vZGFsaXRpZXMgYXMg bGFzdCB5ZWFyIDp0YWRhOiBTbyBpbiBwYXJ0aWN1bGFyLA0KICBzcGVha2VycyBjYW4gZ2l2ZSB0 YWxrcyByZW1vdGVseSB2aWEgYSBab29tIGNhbGwuIFdlJ2xsIGFsc28gbWFrZSBzdXJlDQogIHRo aXMgdGltZSB0aGF0IHRoZSByZW1vdGUgc3BlYWtlciBjYW4gc2VlIHRoZSBhdWRpZW5jZSBvdmVy IHRoZQ0KICBjYWxsLiBUbyBwcm9tb3RlIGEgZ29vZCBhdG1vc3BoZXJlLCBjb21tdW5pY2F0aW9u IGFuZCBlbmdhZ2VtZW50LCB3ZQ0KICBkbyBwcmVmZXIgdG8gaGF2ZSBtb3N0IHRhbGtzIGluLXBl cnNvbiwgYnV0IHJlbW90ZSB0YWxrcyB3aWxsIGJlIG1vc3QNCiAgd2VsY29tZSBhcyB3ZWxsLiBT bywgZG9uJ3QgaGVzaXRhdGUgdG8gc3VibWl0IGEgdGFsayBldmVuIGlmIHlvdSBjYW4ndA0KICBt YWtlIGl0IGluIHBlcnNvbi4NCg0KICBDaGVlcnMsIEBBcm1hw6tsIGFuZCBAcGl0YWcNCg0KICBQ RDogT25jZSB0aGUgdGltZSBjb21lcyBjbG9zZXIsIHdlJ2xsIGdpdmUgZGV0YWlsIG9uIHlvdXR1 YmUgbGl2ZSBhbmQNCiAgZGlzY29yZCBsaW5rcyBmb3IgcmVtb3RlIGF0dGVuZGFuY2UgYXMgd2Vs bA0KDQoNCkd1aWxsYXVtZSBNdW5jaC1NYWNjYWdub25pIHRoZW4gYWRkZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcywg dGhpcyB1cGRhdGUgYWJvdXQgaHlicmlkaXR5IHNob3VsZCBhbHNvIGJlIHRydWUgZm9yIHRoZSBN TA0KICB3b3Jrc2hvcC4NCg0KDQpPZG9jIHN5bnRheCBjaGVhdHNoZWV0DQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vZG9jLXN5bnRh eC1jaGVhdHNoZWV0LzE0NjU4LzE+DQoNCg0KUGF1bC1FbGxpb3QgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIZWxsbyENCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGFkZGl0aW9uIG9mIGEg W2NoZWF0c2hlZXRdIGZvciBvZG9jJ3MNCiAgc3ludGF4IQ0KDQogIEkgaG9wZSBpdCB3aWxsIG1h a2UgaXQgbGVzcyBwYWluZnVsIHRvIGxlYXJuIG9yIHJlZnJlc2ggeW91cnNlbGYgb24NCiAgdGhl IHRvcGljLiBUaGUgW2Z1bGwgc3ludGF4IHJlZmVyZW5jZV0gaXMgc3RpbGwgdXNlZnVsIHRvIGhh dmUgc29tZQ0KICBkZXRhaWxzLg0KDQogIEhhdmUge2IgZnVufSA6c2xpZ2h0X3NtaWxlOiAhDQoN Cg0KW2NoZWF0c2hlZXRdIDxodHRwczovL29jYW1sLmdpdGh1Yi5pby9vZG9jL2NoZWF0c2hlZXQu aHRtbD4NCg0KW2Z1bGwgc3ludGF4IHJlZmVyZW5jZV0NCjxodHRwczovL29jYW1sLmdpdGh1Yi5p by9vZG9jL29kb2NfZm9yX2F1dGhvcnMuaHRtbD4NCg0KDQpEa0NvZGVyIDAuMiAtIFNjcmlwdGlu ZyBpbiBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ka2NvZGVyLTAtMi1zY3Jp cHRpbmctaW4tb2NhbWwvMTQ1NjAvMj4NCg0KDQpqYmVja2ZvcmQgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBU aGUgMC4zIHZlcnNpb24gaXMgbm93IGF2YWlsYWJsZS4gSXQgaGFzIGEgcHVibGljbHkgYWNjZXNz aWJsZQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9ka2NvZGVyPiBzbyBpc3N1ZXMgY2Fu IGJlIGZpbGVkLCBhbmQNCiAgYGNvaHR0cCA2LjAuMH5iZXRhMicgaXMgbm93IGJ1bmRsZWQuDQoN CiAgTW9zdCBpbXBvcnRhbnQsIDAuMyB3YXMgc3VmZmljaWVudCB0byBidWlsZCB0aGUgcmVhbCBw cm9kdWN0aW9uDQogIHNlcnZpY2UNCiAgPGh0dHBzOi8vZ2l0bGFiLmNvbS9kaXNrdXYvc2FtcGxl cy9kZXZvcHMvRGtTdWJzY3JpYmVXZWJob29rPi4gSXQgaGFzDQogIGEgRG9ja2VyZmlsZSBhbmQg RG9ja2VyIENvbXBvc2UgZm9yIGVhc3kgZGVwbG95bWVudCB0byBwcm9kdWN0aW9uLCBhbmQNCiAg dGhlIERvY2tlciBjb250YWluZXIgaXMgYmFzZWQgb24gR29vZ2xlJ3MNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9Hb29nbGVDb250YWluZXJUb29scy9kaXN0cm9sZXNzI3JlYWRtZT4gZm9yIGENCiAg InNtYWxsIiBzaXplICh3ZWxsLCAxMDBNQiBpcyBub3Qgc21hbGwgYnV0IGl0IGlzIG5vdCBiaWcg ZWl0aGVyKS4gVGhlDQogIG9ubHkgZXhlY3V0YWJsZSBpbiB0aGUgY29udGFpbmVyIGlzIGBvY2Ft bHJ1bngnIChubyBgL2Jpbi9zaCcsDQogIGV0Yy4pLiBJbiBhbiBpZGVhbCB3b3JsZCB3aGVyZSBJ IGhhZCBtb3JlIHRpbWUgdGhlIHNlcnZpY2Ugd291bGQgYmUNCiAgZW1iZWRkZWQgaW5zaWRlIE1p cmFnZU9TIGluc3RlYWQuDQoNCg0KSW1hbmRyYSBTeXNNTCBUcmFuc3BpbGVyIEludGVybnNoaXAg T3Bwb3J0dW5pdHkhDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ltYW5kcmEtc3lzbWwtdHJhbnNwaWxl ci1pbnRlcm5zaGlwLW9wcG9ydHVuaXR5LzE0NjYwLzE+DQoNCg0KQmVuIEJlbGxpY2sgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJIHdhbnRlZCB0byBzaGFyZSBhbiBvcHBvcnR1bml0eSBmb3IgYSBz dW1tZXIgaW50ZXJuc2hpcCB3aXRoIEltYW5kcmEhDQoNCiAgSWYgeW91J3JlIHNvbWVvbmUgd2l0 aCBhbiBpbnRlcmVzdCBpbiB3cml0aW5nIHByb2R1Y3Rpb24gT0NhbWwgb3INCiAgdXNpbmcgYSBi YXR0bGUtd29ybiBhdXRvbWF0ZWQgdGhlb3JlbSBwcm92ZXIgaW4gYW4gaW5kdXN0cnkgc2V0dGlu ZywNCiAgcGxlYXNlIGFwcGx5IQ0KDQogIEl0IGlzIGJhc2VkIGluIEF1c3RpbiwgVFguDQoNCiAg WW91IGNhbiBmaW5kIG1vcmUgZGV0YWlscyBhbmQgYXBwbHkgW2hlcmVdLg0KDQogIFRoYW5rcyEN Cg0KDQpbaGVyZV0gPGh0dHBzOi8vYXBwbHkud29ya2FibGUuY29tL2ltYW5kcmEvai8xNTM5MkE0 NDQ1Lz4NCg0KDQpCYW0gLSBBIHByb3BlcnR5LWJhc2VkIHRlc3Rpbmcgd2l0aCBpbnRlcm5hbCBz aHJpbmtpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJhbS1h LXByb3BlcnR5LWJhc2VkLXRlc3Rpbmctd2l0aC1pbnRlcm5hbC1zaHJpbmtpbmcvMTQ2NjEvMT4N Cg0KDQpGcmFuw6dvaXMgVGhpcsOpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBh bSBleGNpdGVkIHRvIGludHJvZHVjZSAqQmFtKiwgYSByb2J1c3QgYW5kIHZlcnNhdGlsZSBwcm9w ZXJ0eS1iYXNlZA0KICB0ZXN0aW5nIChQQlQpIGxpYnJhcnkuIEJhbSBzaW1wbGlmaWVzIHRoZSBw cm9jZXNzIG9mIHRlc3RpbmcNCiAgcHJvcGVydGllcyBhY3Jvc3MgYSB3aWRlIHJhbmdlIG9mIHJh bmRvbWx5IGdlbmVyYXRlZCB2YWx1ZXMsIG1ha2luZyBpdA0KICBlYXNpZXIgdG8gaWRlbnRpZnkg YW5kIGRlYnVnIGlzc3VlcyBpbiB5b3VyIGNvZGUuDQoNCg0KS2V5IEZlYXR1cmVzDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgKk1vbmFkLWxpa2UgR2VuZXJh dG9ycyo6IENyZWF0ZSBuZXcgZ2VuZXJhdG9ycyBlYXNpbHkgd2l0aCBhDQogICAgIG1vbmFkLWxp a2UgcGF0dGVybiB0aGF0IHdvcmtzIHNlYW1sZXNzbHkgd2l0aCBzaHJpbmtpbmcgbWVjaGFuaXNt cy4NCiAg4oCiICpQUFggU3VwcG9ydCo6IEF1dG9tYXRpY2FsbHkgZGVyaXZlIGdlbmVyYXRvcnMg YmFzZWQgb24gdHlwZQ0KICAgICBkZXNjcmlwdGlvbnMuIFRoZSBjdXN0b21pemFibGUgZGVyaXZl ciBlbnN1cmVzIHNtb290aCBpbnRlZ3JhdGlvbg0KICAgICBpbnRvIHlvdXIgY29kZWJhc2UuDQog IOKAoiAqVGV6dCBJbnRlZ3JhdGlvbio6IEludGVncmF0ZXMgd2l0aCB0aGUgVGV6dCB0ZXN0IGZy YW1ld29yaywNCiAgICAgcHJvdmlkaW5nIGEgdXNlci1mcmllbmRseSBleHBlcmllbmNlLCBlc3Bl Y2lhbGx5IG5vdGFibGUgaW4NCiAgICAgZGVidWdnaW5nIHNjZW5hcmlvcy4NCiAg4oCiICpJbnRl cm5hbCBTaHJpbmtpbmcqOiBWYXJpb3VzIGRlZmF1bHQgc2hyaW5raW5nIHN0cmF0ZWdpZXMgaGVs cA0KICAgICBlZmZpY2llbnRseSBwaW5wb2ludCBtaW5pbWFsIGNvdW50ZXJleGFtcGxlcy4gSW50 ZXJuYWwgc2hyaW5raW5nDQogICAgIGVuc3VyZXMgdGhhdCBvbmx5ICdzbWFsbGVyJyB2YWx1ZXMg YXJlIHVzZWQgZHVyaW5nIHRoZSBwcm9jZXNzLCBhbmQNCiAgICAgdGhpcyBpcyBkb25lIGluIGEg d2F5IHRoYXQgaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBtb25hZC1saWtlDQogICAgIG9wZXJhdG9y cy4NCiAg4oCiICpDdXN0b20gU2hyaW5raW5nKjogRGVmaW5lIGN1c3RvbSBzaHJpbmtlcnMgdGhh dCB3b3JrIHdlbGwgd2l0aCB0aGUNCiAgICAgZXhpc3Rpbmcgc2hyaW5raW5nIHN0cmF0ZWdpZXMu DQoNCg0KSW5zdGFsbGF0aW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwN Cg0KICBZb3UgY2FuIGluc3RhbGwgQmFtIHVzaW5nIG9wYW06DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBvcGFtIGluc3RhbGwgYmFtIHRlenQtYmFtDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoN CkdldHRpbmcgc3RhcnRlZA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgSGVyZSBpcyBhbiBleGFtcGxlIHRvIGdldCB5b3Ugc3RhcnRlZDoNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIG9wZW4gVGV6dF9iYW0NCiAg4pSCIA0KICDilIIgdHlwZSB0 ID0gRm9vIG9mIHthOiBpbnQ7IGI6IHN0cmluZ30gfCBCYXIgb2YgaW50IGxpc3QgW0BAZGVyaXZp bmcgZ2VuXQ0KICDilIIgKCoqIFRoZSBkZXJpdmVyIGNyZWF0ZXMgYSB2YWx1ZSBbdmFsIGdlbiA6 IHQgQmFtLlN0ZC50XS4gKikNCiAg4pSCIA0KICDilIIgbGV0IHJlZ2lzdGVyICgpID0NCiAg4pSC ICAgbGV0IHByb3BlcnR5ID0gZnVuY3Rpb24NCiAg4pSCICAgICB8IEZvbyB7YTsgYn0gLT4NCiAg 4pSCICAgICAgICAgaWYgYSA+IDFfMDAwICYmIFN0cmluZy5jb250YWlucyBiICd6JyB0aGVuDQog IOKUgiAgICAgICAgICAgRXJyb3IgKGBGYWlsICJBIGNvdW50ZXItZXhhbXBsZSB3YXMgZm91bmQi KQ0KICDilIIgICAgICAgICBlbHNlIE9rICgpDQogIOKUgiAgICAgfCBCYXIgWzE7IDI7IDM7IDRd IC0+DQogIOKUgiAgICAgICAgIEVycm9yIGBCYWRfdmFsdWUNCiAg4pSCICAgICB8IEJhciBfIC0+ DQogIOKUgiAgICAgICAgIE9rICgpDQogIOKUgiAgIGluICANCiAg4pSCICAgUGJ0LnJlZ2lzdGVy IH5fX0ZJTEVfXyB+dGl0bGU6IlNpbXBsZSBleGFtcGxlIG9mIGJhbSIgfnRhZ3M6WyJiYW0iOyAi c2ltcGxlIl0NCiAg4pSCICAgICB+Z2VuIH5wcm9wZXJ0eSAoKQ0KICDilIIgDQogIOKUgiBsZXQg XyA9IA0KICDilIIgICAgIHJlZ2lzdGVyICgpOw0KICDilIIgICAgIFRlc3QucnVuICgpDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIFRoZXJlIGFyZSBzZXZlcmFsIG1vcmUgZGV0YWlsZWQgW2V4YW1w bGVzXSBpbiB0aGUgcmVwb3NpdG9yeSB0byBzaG93DQogIHlvdSBhcm91bmQgdGhlIGxpYnJhcnku DQoNCg0KW2V4YW1wbGVzXSA8aHR0cHM6Ly9naXRodWIuY29tL2ZyYW5jb2lzdGhpcmUvYmFtL3Ry ZWUvbWFzdGVyL2V4YW1wbGU+DQoNCg0KQ29udHJpYnV0aW9ucw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQ29udHJpYnV0aW9ucyBmcm9tIHRoZSBjb21tdW5p dHkgYXJlIHdlbGNvbWUhIElmIHlvdSBoYXZlIGlkZWFzLCBidWcNCiAgcmVwb3J0cywgb3IgaW1w cm92ZW1lbnRzLCBmZWVsIGZyZWUgdG8gc2hhcmUgdGhlbSENCg0KDQpLYWthZHUgYXNrZWQgYW5k IEZyYW7Dp29pcyBUaGlyw6kgcmVwbGllZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgICAgICAgQ2FuIGl0IGJlIGNvbXBh cmVkIHRvIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjay8+DQogICAgICAgID8NCg0K ICBNeSB3b3JrIGFyb3VuZCAvQmFtLyBzdGFydGVkIGFmdGVyIHVzaW5nICJRQ2hlY2siIGFuZCBl c3BlY2lhbGx5DQogICJRQ2hlY2syIiBxdWl0ZSBhIGxvdCBmb3IgdGhlIFRlem9zIHByb2plY3Qu DQoNCiAgV2l0aCByZXNwZWN0IHRvIFFDaGVjaywgUUNoZWNrMiBjYW1lIHdpdGggImludGVncmF0 ZWQiIHNocmlua2luZw0KICBhbGxvd2luZyB0byBkZXJpdmUgYXV0b21hdGljYWxseSBzaHJpbmtl cnMgZm9yIGdlbmVyYXRvcnMuIFRoaXMgYWltIHRvDQogIHNpbXBsaWZ5IGRlYnVnZ2luZyB3aGVu IGEgY291bnRlci1leGFtcGxlIGlzIGZvdW5kLCBzbyB0aGF0IGEgc21hbGxlcg0KICBleGFtcGxl IGlzIHJlcG9ydGVkIHRvIHRoZSB1c2VyLg0KDQogIEhvd2V2ZXIsIHRoaXMgY2FtZSB3aXRoIGEg Y29zdDoNCiAg4oCiIFBlcmZvcm1hbmNlLXdpc2UsIHRoZXJlIHdhcyBhIHJlZ3Jlc3Npb24gZnJv bSAiUUNoZWNrIiwgZXNwZWNpYWxseQ0KICAgIHRoZSB0aW1lIHRha2VuIHRvIHJlcG9ydCBhIGNv dW50ZXItZXhhbXBsZSBiZWNhdXNlIHRoZSBzaHJpbmtpbmcNCiAgICBwcm9jZXNzIHdhcyB0YWtp bmcgYSBsb3Qgb2YgdGltZQ0KICDigKIgQXQgc29tZSBwb2ludCwgd2UgZXZlbiBmYWNlZCBhbiBp c3N1ZSB3ZXJlIHRoZSBzaHJpbmtpbmcgcHJvY2Vzcw0KICAgIG5ldmVyIGVuZGVkLiBXZSBzdGFy dGVkIHRvIGltcGxlbWVudCBhbiBhZC1ob2Mgc2hyaW5rZXIgYnV0IGl0IHdhcw0KICAgIG5vdCB3 b3JraW5nIGVpdGhlciBhbmQgd2UgbmV2ZXIgcmVhbGx5IGZpZ3VyZWQgb3V0LiBUaGUgc29sdXRp b24gd2FzDQogICAgdG8gZGVhY3RpdmF0ZSBzaHJpbmtpbmcNCiAg4oCiIFRoZXJlIGFyZSBvdGhl ciBVWCBjb25zaWRlcmF0aW9uczogZGVidWdnaW5nIGNhbiBiZSB0ZWRpb3VzDQogICAgKGVzcGVj aWFsbHkgImhlbGxvIiBkZWJ1Z2dpbmcpDQoNCiAgU28gYmFzaWNhbGx5IC9CYW0vIHN0YXJ0ZWQg YXMgYW4gZXhwZXJpbWVudCB0byB1bmRlcnN0YW5kIHNocmlua2luZw0KICBhbmQgY29tZSB1cCB3 aXRoIHNvbWV0aGluZyBlYXNpZXIgdG8gdW5kZXJzdGFuZCBhbmQgY29tcG9zZQ0KICBiZXR0ZXIu IFRoaXMgaXMgd2h5IC9iYW0vIHJlbGllcyBtYWlubHkgb24gbW9uYWRpYyBvcGVyYXRvcnMuDQoN CiAgVGhpcyBtYWtlcyB0aGUgd3JpdGluZyBvZiBnZW5lcmF0b3JzIGVhc2llciwgdGhlIHNocmlu a2luZyBpcw0KICAvaW50ZXJuYWwvIGVuc3VyaW5nIHRoZSBzaHJpbmtpbmcgd29uJ3QgY3JlYXRl IG5ldyB2YWx1ZS4gSWYgeW91IHVzZQ0KICB0aGUgbW9uZGljIG9wZXJhdG9yIG9mIFFDaGVjazIs IGxhc3QgdGltZSBJIGNoZWNrZWQgaXQgd2FzIG5vdCB0aGUNCiAgY2FzZS4gVGhpcyBpcyB3aHkg dG8gY3JlYXRlIGEgZ2VuZXJhdG9yIGZvciBhIHBhaXIsIGl0IGlzIHJlY29tbWVuZGVkDQogIHRv IHVzZSBgdHVwMicgaW5zdGVhZCBvZiBtb25hZGljIG9wZXJhdG9ycy4NCg0KICBVc2luZyBtb25h ZGljLW9wZXJhdG9ycyBhbGxvd3MgeW91IGFsc28gdG8gaGF2ZSBhIHNtYWxsZXIga2VybmVsIHRo YXQNCiAgaXMgaG9wZWZ1bGx5IGVhc2llciB0byBtYWludGFpbi4NCg0KICBJIGFsc28gZGV2ZWxv cHBlZCB0aGUgaW50ZWdyYXRpb24gb2YgL2JhbS8gd2l0aCBUZXp0IGluIGEgd2F5IHRvIGF2b2lk DQogIGN1cnJlbnRseSBwaXRmYWxscyB3ZSBoYWQgd2l0aCBgUUNoZWNrMic6DQogIOKAoiBZb3Ug Y2FuIGVhc2lseSBjb250cm9sIHRoZSBzdG9wcGluZyBjb25kaXRpb24gb2YgdGhlIHRlc3QNCiAg 4oCiIFRoZSB0ZXN0IGNhbiBiZSBlYXNpbHkgcnVuIGluIHBhcmFsbGVsIG9yIGluIGEgbG9vcCBt b2RlIHRvIGhlbHAgeW91DQogICAgZmluZCBhIGNvdW50ZXItZXhhbXBsZSBxdWlja2VyDQogIOKA oiBUaGUgcnVubmVyIGNhbiBmYWlsIGlmIG5vdCBlbm91Z2ggdmFsdWVzIHdlcmUgZ2VuZXJhdGVk IG9yIGV4ZWN1dGlvbg0KICAgIHdhcyB0b28gbG9uZyAobGlrZWx5IGR1ZSB0byBhIHJlZ3Jlc3Np b24pDQogIOKAoiBJdCBjYXB0dXJlcyB0aGUgb3V0cHV0LCBzbyB0aGF0IG9ubHkgdGhlIG9uZSBm b3IgdGhlIGNvdW50ZXItZXhhbXBsZQ0KICAgIHByaW50ZWQgaXMgc2hvd24uIFRoaXMgaXMgdmVy eSBoYW5keSBkdXJpbmcgZGVidWdnaW5nLiBPdGhlcndpc2UsIGl0DQogICAgaXMgcXVpdGUgdGVk aW91cyB0byB1bmRlcnN0YW5kIHdoaWNoIGxpbmUgY29tZXMgZnJvbSB3aGljaCBhdHRlbXB0DQog IOKAoiBJdCBpcyBlYXN5IHRvIG9wdC1vdXQgZnJvbSBzaHJpbmtpbmcgaWYgaXQgdGFrZXMgdG9v IG11Y2ggdGltZS4gQ2FuDQogICAgYmUgdXNlZnVsIGZvciBhIENJLiBTaHJpbmtpbmcgb25seSBu ZWVkcyB0byBiZSBleGVjdXRlZCBsb2NhbGx5DQogICAgKGFzc3VtaW5nIHRoZSBwcm9wZXJ0eSBp cyBkZXRlcm1pbmlzdGljKSB3aXRoIGEgZ2l2ZW4gc2VlZA0KDQogIEkgYWxzbyBoYWQgc29tZSBm dW4gdHJ5aW5nIHRvIGRlZmluZSBzaHJpbmtpbmcgc3RyYXRlZ2llcyBhbGxvd2luZyB5b3UNCiAg dG8gc2tpcCBlbGVtZW50cyBpbiBhIGxpc3QuIFRoaXMgaXMgdmVyeSBoYW5keSB3aGVuIHlvdXIg cHJvcGVydHkgaXMNCiAgYWJvdXQgcnVubmluZyBhIHNjZW5hcmlvIG1hZGUgb2YgYSBsaXN0IG9m IGFjdGlvbnMgKGEgdXNlLWNhc2UgdmVyeQ0KICBjbG9zZSB0byB0aGUgbW9ub2xpdGggbGlicmFy eSBmcm9tIEZyYW7Dp29pcyBQb3R0aWVyKS4gIEluIGdlbmVyYWwgdGhlDQogIGluaXRpYWwgY291 bnRlci1leGFtcGxlIGNvbnRhaW5zIHN1cGVyZmx1b3VzIGFjdGlvbnMuIFN1Y2ggYSBzdHJhdGVn eQ0KICBhbGxvd3MgeW91IHRvIHJlbW92ZSB0aGVtIHRvIGVhc3kgdGhlIGRlYnVnZ2luZy4NCg0K ICBJIGRvbid0IGhhdmUgY29uY3JldGUgZGF0YSB0byBjb21wYXJlIEJhbSB3aXRoIFFDaGVjazIg YXQgdGhlDQogIG1vbWVudC4gTGV0IG1lIGtub3cgaWYgeW91IGhhdmUgaWRlYXMgdG8gbWFrZSBh biBvYmplY3RpdmUgY29tcGFyaXNvbg0KICBiZXR3ZWVuIHRob3NlIHR3byBsaWJyYXJpZXMuDQoN Cg0KU3RpdGNoIC0gTm90ZSBNYW5hZ2luZyBmb3IgVW5vcmdhbml6ZWQgTWluaW1hbGlzdHMNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc3RpdGNoLW5vdGUtbWFuYWdpbmctZm9yLXVub3JnYW5p emVkLW1pbmltYWxpc3RzLzE0NjY0LzE+DQoNCg0KTWFyYyBDb3F1YW5kIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSGV5IGV2ZXJ5b25lIQ0KDQogIEkgd2FudGVkIHRvIHNoYXJlIGEgY2xpIHRv b2wgYnVpbHQgaW4gT0NhbWwgSSd2ZSBiZWVuIHdvcmtpbmcgb24sIHRoYXQNCiAgd2FzIG9ubHkg cG9zc2libGUgd2l0aCB0aGUgaGVscCBvZiB0aGUgY29tbXVuaXR5LiA6c2xpZ2h0X3NtaWxlOg0K DQogIFRoZSB0b29sIGlzIGNhbGxlZCBzdGl0Y2gsIGFuZCBpcyBhIG1pbmltYWwgbm90ZS1tYW5h Z2luZyB0b29sIHRoYXQNCiAgYWltcyB0byBiZSBhIGdvb2QgdW5peCBjaXRpemVuLiBJdCBhbGxv d3MgeW91IHRvIHRha2Ugbm90ZXMgaW4NCiAgd2hhdGV2ZXIgZm9ybWF0L2VkaXRvciB5b3Ugd2Fu dCB3aGlsZSBzcGVuZGluZyBtaW5pbWFsIHRpbWUgb3JnYW5pemluZw0KICB0aGVtLg0KDQogIEkg YnVpbHQgaXQgdXNpbmcgQ21kbGluZXIsIE5vdHR5IGFuZCBTaGV4cC4gSSdtIGRyYWZ0aW5nIGEg bG9uZ2VyDQogIHdyaXRldXAgdG8gc2hhcmUgdGhlIGNoYWxsZW5nZXMgYW5kIGdlbmVyYWwgZXhw ZXJpZW5jZSwgYnV0IGluIHNob3J0DQogIGFsbCB0aHJlZSBsaWJyYXJpZXMgd2VyZSBhIGJpdCBz aG9ydCBvbiBleGFtcGxlcyBidXQgdWx0aW1hdGVseQ0KICBleGNlbGxlbnQgYW5kIHZlcnkgZWFz eSB0byB3b3JrIHdpdGguIEFmdGVyd2FyZCwgcGFja2FnaW5nIGV2ZXJ5dGhpbmcNCiAgdHVybmVk IG91dCB0byBiZSBhIGJpdCBoYXJkZXIuDQoNCiAgU29tZSBzY3JlZW5zaG90czogW292ZXJ2aWV3 XSwgW3RvZG9dLCBbZnVsbC1ub3Rlc10uDQoNCiAgQW5kIGxpbmsgdG8gcmVwbzoNCg0KICA8aHR0 cHM6Ly9naXQubWNjZC5zcGFjZS9wdWIvc3RpdGNoL2Fib3V0Lz4NCg0KICBJdCdzIHN0aWxsIGlu IGl0J3MgZWFybHkgZGF5cyBhbmQgdGhlIGNvZGUtYmFzZSBpcyBhIGJpdCBtZXNzeS4gQnV0IEkN CiAgdXNlIGl0IGFzIG15IGRhaWx5IGRyaXZlciBmb3Igbm90ZXMuIDpzbGlnaHRfc21pbGU6DQoN Cg0KW292ZXJ2aWV3XSA8aHR0cHM6Ly9ibG9icy5tY2NkLnNwYWNlL3N0aXRjaC9ub3Rlcy12aWV3 LnBuZz4NCg0KW3RvZG9dIDxodHRwczovL2Jsb2JzLm1jY2Quc3BhY2Uvc3RpdGNoL3RvZG8tdmll dy5wbmc+DQoNCltmdWxsLW5vdGVzXSA8aHR0cHM6Ly9ibG9icy5tY2NkLnNwYWNlL3N0aXRjaC9m dWxsLW5vdGVzLXZpZXcucG5nPg0KDQoNCjcgT0NhbWwgR290Y2hhcw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9ibG9nLTctb2NhbWwtZ290Y2hhcy8xNDY2Ny8xPg0KDQoNCkRtaXRy aWkgS292YW5pa292IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkg ZXZlcnlvbmUhIDp3YXZlOg0KDQogIEkndmUgYmVlbiB1c2luZyBPQ2FtbCBmb3IgYSB3aGlsZSwg YW5kIEknbSBxdWl0ZSBlbmpveWluZyB0aGUNCiAgbGFuZ3VhZ2UuIEluIG15IG5vdC1zby1sb25n IGpvdXJuZXksIEkgZGlzY292ZXJlZCBhIGZldyBzdXJwcmlzaW5nDQogIE9DYW1sIGJlaGF2aW91 cnMsIHNvIEkgZGVjaWRlZCB0byBzaGFyZSB0aGVtIHdpdGggZXZlcnlvbmUgaW4gYSBibG9nDQog IHBvc3QuDQoNCiAg4oCiIFs3IE9DYW1sIEdvdGNoYXNdDQoNCiAgSSBob3BlIGl0IHJlZHVjZXMg ZnJ1c3RyYXRpb24gZm9yIG5ld2NvbWVycyB3aGVuIHRoZXkgc2VlIHNvbWV0aGluZw0KICB1bmV4 cGVjdGVkIGZvciB0aGUgZmlyc3QgdGltZSENCg0KDQpbNyBPQ2FtbCBHb3RjaGFzXSA8aHR0cHM6 Ly9kZXYudG8vY2hzaGVyc2gvNy1vY2FtbC1nb3RjaGFzLTIwN2U+DQoNCg0KVXNpbmcgT0NhbWwg b24gd2luZG93cyB3aXRoIFdTTA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ibG9nLXVzaW5n LW9jYW1sLW9uLXdpbmRvd3Mtd2l0aC13c2wvMTQ2NzEvMT4NCg0KDQpQaXppZUR1c3QgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBXaGVuIEkgZ290IHN0YXJ0ZWQgaW4gT0NhbWwsIG15IHNldHVwIHdhcyBiYXNp Y2FsbHkgYSBkdWFsIGJvb3Qgb2YNCiAgV2luZG93cyAxMSBhbmQgVWJ1bnR1LiBJIGhhZCBhIGZl dyBpc3N1ZXMgc2V0dGluZyB1cCBPQ2FtbCBvbiB3aW5kb3dzDQogIGF0IHRoZSB0aW1lIGFuZCBz dGFydGVkIGxvb2tpbmcgdXAgV1NMIGFuZCBpZiBpdCB3YXMgYSBnb29kDQogIGFsdGVybmF0aXZl IChJIHJlYWxseSBkaXNsaWtlZCBoYXZpbmcgdG8gZHVhbCBib290IGFsd2F5cykuIFNvIEkgd3Jv dGUNCiAgdGhpcyBhcnRpY2xlIGRldGFpbGluZyBleGFjdGx5IGhvdyBJIHNldHVwIE9DYW1sIG9u IFdTTCBhbmQgaGF2ZSBiZWVuDQogIHVzaW5nIGl0IGZvciB0aGUgcGFzdCAxMiBtb250aHMgd2l0 aCBubyBpc3N1ZXMuIFNvIGlmIHlvdSBhcmUgbG9va2luZw0KICB0byBnZXQgc3RhcnRlZCB3aXRo IHByb2dyYW1taW5nIGluIE9DYW1sIG9uIHdpbmRvd3MsIHRoaXMgYXJ0aWNsZSBpcw0KICBmb3Ig eW91Lg0KDQogIFtIb3cgdG8gc2V0dXAgT0NhbWwgb24gV2luZG93cyB3aXRoIFdTTF0NCg0KICBO b3RlOiBgb3BhbSAyLjInIG1ha2VzIGl0IGEgYnJlZXplIHVzaW5nIE9DYW1sIG9uIHdpbmRvd3Mg bmF0aXZlbHkgc28NCiAgaWYgeW91IGFyZSBwYXJ0aWN1bGFybHkgaW50ZXJlc3RlZCBhYm91dCB1 c2luZyBPQ2FtbCB3aXRob3V0IFdTTCB5b3UNCiAgc2hvdWxkIGNoZWNrIGl0IG91dC4NCg0KDQpb SG93IHRvIHNldHVwIE9DYW1sIG9uIFdpbmRvd3Mgd2l0aCBXU0xdDQo8aHR0cHM6Ly90YXJpZGVz LmNvbS9ibG9nLzIwMjQtMDUtMDgtaG93LXRvLXNldHVwLW9jYW1sLW9uLXdpbmRvd3Mtd2l0aC13 c2wvPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQg YXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtUaGUgTWlyYWdlT1MgcmV0cmVh dCAyMDI0XQ0KICDigKIgW1RoZSBPQ2FtbCA1LjIgUmVsZWFzZTogRmVhdHVyZXMgYW5kIEZpeGVz IV0NCiAg4oCiIFtCZXRhIHJlbGVhc2Ugb2YgRnJhbWEtQyAyOS4wfmJldGEgKENvcHBlcildDQog IOKAoiBbQnllIE9wYW0sIEhlbGxvIE5peF0NCiAg4oCiIFtIb3cgdG8gU2V0dXAgT0NhbWwgb24g V2luZG93cyB3aXRoIFdTTF0NCiAg4oCiIFtBbm5vdW5jaW5nIERCQ2FtbCwgU2lsbywgU2VyZGUg UG9zdGdyZXMgYW5kIGEgbmV3IGRyaXZlciBmb3INCiAgICBwb3N0Z3Jlc10NCiAg4oCiIFtGaXhp bmcgYW5kIE9wdGltaXppbmcgdGhlIEdudUNPQk9MIFByZXByb2Nlc3Nvcl0NCg0KDQpbdGhlIG9j YW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltUaGUgTWlyYWdlT1Mg cmV0cmVhdCAyMDI0XQ0KPGh0dHBzOi8vaGFubmVzLnJvYnVyLmNvb3AvUG9zdHMvUmV0cmVhdDIw MjQ+DQoNCltUaGUgT0NhbWwgNS4yIFJlbGVhc2U6IEZlYXR1cmVzIGFuZCBGaXhlcyFdDQo8aHR0 cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDUtMTUtdGhlLW9jYW1sLTUtMi1yZWxlYXNlLWZl YXR1cmVzLWFuZC1maXhlcz4NCg0KW0JldGEgcmVsZWFzZSBvZiBGcmFtYS1DIDI5LjB+YmV0YSAo Q29wcGVyKV0NCjxodHRwczovL2ZyYW1hLWMuY29tL2ZjLXZlcnNpb25zL2NvcHBlci5odG1sPg0K DQpbQnllIE9wYW0sIEhlbGxvIE5peF0NCjxodHRwczovL3ByaXZlci5kZXYvYmxvZy9vY2FtbC9i eWUtb3BhbS1oZWxsby1uaXgvPg0KDQpbSG93IHRvIFNldHVwIE9DYW1sIG9uIFdpbmRvd3Mgd2l0 aCBXU0xdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDUtMDgtaG93LXRvLXNldHVw LW9jYW1sLW9uLXdpbmRvd3Mtd2l0aC13c2w+DQoNCltBbm5vdW5jaW5nIERCQ2FtbCwgU2lsbywg U2VyZGUgUG9zdGdyZXMgYW5kIGEgbmV3IGRyaXZlciBmb3IgcG9zdGdyZXNdDQo8aHR0cHM6Ly9w cml2ZXIuZGV2L2Jsb2cvZGJjYW1sL2RiY2FtbC1wcm9qZWN0Lz4NCg0KW0ZpeGluZyBhbmQgT3B0 aW1pemluZyB0aGUgR251Q09CT0wgUHJlcHJvY2Vzc29yXQ0KPGh0dHBzOi8vb2NhbWxwcm8uY29t L2Jsb2cvMjAyNF8wNF8zMF9maXhpbmdfYW5kX29wdGltaXppbmdfZ251Y29ib2w+DQoNCg0KT2xk IENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEg Q1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5 b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBv ZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBl dmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0 XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzph bGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3Rd IDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBT Y2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 14 to 21, 2024.

    We Want Your Feedback on the odoc Developer Experience

    Sabine Schmaltz announced

    Hey all, =F0=9F=A7=A1=F0=9F=90=AB

    the documentation team at Tarides is lo= oking for input and feedback on odoc.

    I would be super happy if everyone who uses odoc or would use odoc if it wo= rked for them can drop an answer in this feedback form:

    https://docs.google.com/= forms/d/e/1FAIpQLSfpZHlnbQjWolAhKJvn41aT5QJc7Gb7uZJSdtTT7MZeAdyMow/viewform= ?usp=3Dsf_link

    Windows compiler support in opam 2.2.0~beta2

    David Allsopp announced

    On behalf of the entire opam team, but also with a personal sense of relief= , I'm very pleased to announce that the process of upstreaming support for = Windows OCaml to opam-repository in ocaml/opam-repository#25861 finally started on= Friday!

    There's a full = blog post with details on how you can try this out now with opam 2.2.0~= beta2. The TL;DR, assuming you have winget on your Windows system (open the= Microsoft Store app and install the App Installer package from Microsoft if you don't)= then you can issue:

    winget install Git.Git
    

    if you don't have Git for Windows and:

    winget install opam
    

    if you don't yet have the 2.2.0~beta2 binary. You must then launch a fre= sh Command Prompt / PowerShell session. For there, you can then run:

    opam init git+https://github.com/dra27/opam-repository.git#windows-initial
    

    or

    opam init -a --no-git-location --cygwin-internal-install git+https://github=
    .com/dra27/opam-repository.git#windows-initial
    

    if you'd like to be asked fewer questions. There is a known and big paus= e when updating the repository. However, after a little bit of time (co= ffee, or a sword battle, if that's yo= ur thing), you should then be faced with a fully initialised opam with ocam= l-base-compiler.5.2.0 installed for the mingw-w64 amd64 port of native Wind= ows opam.

    Things with depexts will likely not work: the blog post contains details on= how to get started with PRs, but issues are also helpful.

    The blog post covers what we regard as the "default use case" - that is a n= ative Windows user expecting to use this new OCaml thing they heard about n= atively. i.e. not running in WSL or Cygwin or MSYS2 or any other "are you s= ure can't just install Linux on that?" approach.

    However, all the other use cases matter too! You're meant to be able to run= native Windows opam from your own Cygwin or MSYS2 mintty bash terminal; we= are aiming for the opam 2.2.0 binary to be a drop-in replacement (apart fr= om setting os-distribution to "cygwinports") for = "OCaml for Windows" for legacy use with the "sunset" repository; you're meant to b= e able to provide your own Cygwin or MSYS2 installation if you really need = to (and you really might!). But we do need help testing all of it =F0=9F=99= =82

    We anticipate one further beta of opam 2.2.0 by the end of the month. From = the Windows perspective, this will fix a known bug in the environment varia= ble handling (see oca= ml/opam#5838) but will also hopefully straighten out the behaviour of <= code>opam init for some of these "non-default" use cases. We're then= hoping to rocket towards a release candidate in June =F0=9F=9A=80

    Happy Windows hacking! Please open issues; please ask for further help; ple= ase have fun!

    David, on behalf of the opam team.

    OCaml Workshop 2024 at ICFP – announcement and call for= proposals

    Continuing this thread, Sonja Heinze said

    One more update, this time about hybrid modalities: We now have the confirm= ation from sigplan (the organizers behind ICFP) that we'll have the same hy= brid modalities as last year :tada: So in particular, speakers can give tal= ks remotely via a Zoom call. We'll also make sure this time that the remote= speaker can see the audience over the call. To promote a good atmosphere, = communication and engagement, we do prefer to have most talks in-person, bu= t remote talks will be most welcome as well. So, don't hesitate to submit a= talk even if you can't make it in person.

    Cheers, @Arma=C3=ABl and @pitag

    PD: Once the time comes closer, we'll give detail on youtube live and disco= rd links for remote attendance as well

    Guillaume Munch-Maccagnoni then added

    Thanks, this update about hybridity should also be true for the ML workshop.

    Odoc syntax cheatsheet

    Paul-Elliot announced

    Hello!

    I'm happy to announce the addition of a cheatsheet for odoc's syntax!

    I hope it will make it less painful to learn or refresh yourself on the top= ic. The full= syntax reference is still useful to have some details.

    Have {b fun} :slight_smile: !

    DkCoder 0.2 - Scripting in OCaml

    jbeckford announced

    The 0.3 version is now available. It has a publicly accessible https://github.com/diskuv/dkcoder so = issues can be filed, and cohttp 6.0.0~beta2 is now bundled.

    Most important, 0.3 was sufficient to build the real production service https:= //gitlab.com/diskuv/samples/devops/DkSubscribeWebhook. It has a Dockerf= ile and Docker Compose for easy deployment to production, and the Docker co= ntainer is based on Google's https://github.com/GoogleContainerTools/distroless#= readme for a "small" size (well, 100MB is not small but it is not big e= ither). The only executable in the container is ocamlrunx (no = /bin/sh, etc.). In an ideal world where I had more time the se= rvice would be embedded inside MirageOS instead.

    Imandra SysML Transpiler Internship Opportunity!

    Ben Bellick announced

    I wanted to share an opportunity for a summer internship with Imandra!

    If you're someone with an interest in writing production OCaml or using a b= attle-worn automated theorem prover in an industry setting, please apply!

    It is based in Austin, TX.=20

    You can find more details and apply here.=20

    Thanks!

    Bam - A property-based testing with internal shrinking

    Fran=C3=A7ois Thir=C3=A9 announced

    I am excited to introduce Bam, a robust and versatile property-based= testing (PBT) library. Bam simplifies the process of testing properties ac= ross a wide range of randomly generated values, making it easier to identif= y and debug issues in your code.

    Key Features

    • Monad-like Generators: Create new generators easily with a monad= -like pattern that works seamlessly with shrinking mechanisms.
    • PPX Support: Automatically derive generators based on type descr= iptions. The customizable deriver ensures smooth integration into your code= base.
    • Tezt Integration: Integrates with the Tezt test framework, provi= ding a user-friendly experience, especially notable in debugging scenarios.=
    • Internal Shrinking: Various default shrinking strategies help ef= ficiently pinpoint minimal counterexamples. Internal shrinking ensures that= only 'smaller' values are used during the process, and this is done in a w= ay that is compatible with the monad-like operators.
    • Custom Shrinking: Define custom shrinkers that work well with th= e existing shrinking strategies.

    Installation

    You can install Bam using opam:

    opam install bam tezt-bam
    

    Getting started

    Here is an example to get you started:

    open Tezt_bam
    
    type t =3D Foo of {a: int; b: string} | Bar of int list [@@deriving gen]=
    
    (** The deriver creates=
     a value [val =
    gen : t Bam.Std.t]. *)
    
    let register () =3D
      let property =3D function
        | Foo=
     {a; b} ->
            if a >=
     1_000 && String.contains b 'z'<=
    /span> then
              Error<=
    /span> (`Fail "A counter-example was found")
            else Ok ()
        | Bar=
     [1; 2; 3; 4] ->
            Error `Bad_value<=
    /span>
        | Bar=
     _ ->
            Ok ()
      in=20=20
      Pbt.register ~__FILE__ ~title:<=
    span style=3D"color: #ca3400;">"Simple example of bam" ~tags:["bam"; "simple"]
        ~gen ~property ()
    
    let _ =3D=20
        register ();
        Test.run ()
    

    There are several more detailed examples in the repository to show you around= the library.

    Contributions

    Contributions from the community are welcome! If you have ideas, bug report= s, or improvements, feel free to share them!

    Kakadu asked and Fran=C3=A7ois Thir=C3=A9 replied

    Can it be compared to https:/= /github.com/c-cube/qcheck/ ?

    My work around Bam started after using "QCheck" and especially "QChe= ck2" quite a lot for the Tezos project.

    With respect to QCheck, QCheck2 came with "integrated" shrinking allowing t= o derive automatically shrinkers for generators. This aim to simplify debugging when a counter-example is found, so that a smaller ex= ample is reported to the user.

    However, this came with a cost:

    • Performance-wise, there was a regression from "QCheck", especially the = time taken to report a counter-example because the shrinking process was ta= king a lot of time
    • At some point, we even faced an issue were the shrinking process never = ended. We started to implement an ad-hoc shrinker but it was not working ei= ther and we never really figured out. The solution was to deactivate shrink= ing
    • There are other UX considerations: debugging can be tedious (especially= "hello" debugging)

    So basically Bam started as an experiment to understand shrinking an= d come up with something easier to understand and compose better. This is why bam relies mainly on monadic operators.

    This makes the writing of generators easier, the shrinking is internal ensuring the shrinking won't create new value. If you use the mondic operator of QCheck2, last time I checked it was not the case. Th= is is why to create a generator for a pair, it is recommended to use tup2 instead of monadic operators.

    Using monadic-operators allows you also to have a smaller kernel that is ho= pefully easier to maintain.

    I also developped the integration of bam with Tezt in a way to avoid= currently pitfalls we had with QCheck2:

    • You can easily control the stopping condition of the test
    • The test can be easily run in parallel or in a loop mode to help you fi= nd a counter-example quicker
    • The runner can fail if not enough values were generated or execution wa= s too long (likely due to a regression)
    • It captures the output, so that only the one for the counter-example pr= inted is shown. This is very handy during debugging. Otherwise, it is quite= tedious to understand which line comes from which attempt
    • It is easy to opt-out from shrinking if it takes too much time. Can be = useful for a CI. Shrinking only needs to be executed locally (assuming the = property is deterministic) with a given seed

    I also had some fun trying to define shrinking strategies allowing you to s= kip elements in a list. This is very handy when your property is about running a scenario made of a list of actions (a use-case = very close to the monolith library from Fran=C3=A7ois Pottier). In general the initial counter-example contains superfluous actions. Such a= strategy allows you to remove them to easy the debugging.

    I don't have concrete data to compare Bam with QCheck2 at the moment. Let m= e know if you have ideas to make an objective comparison between those two libraries.

    Stitch - Note Managing for Unorganized Minimalists

    Marc Coquand announced

    Hey everyone!

    I wanted to share a cli tool built in OCaml I've been working on, that was = only possible with the help of the community. :slight_smile:=20

    The tool is called stitch, and is a minimal note-managing tool that aims to= be a good unix citizen. It allows you to take notes in whatever format/edi= tor you want while spending minimal time organizing them.

    I built it using Cmdliner, Notty and Shexp. I'm drafting a longer writeup t= o share the challenges and general experience, but in short all three libra= ries were a bit short on examples but ultimately excellent and very easy to= work with. Afterward, packaging everything turned out to be a bit harder.

    Some screenshots: overview, t= odo, fu= ll-notes.

    And link to repo:

    https://git.mccd.space= /pub/stitch/about/

    It's still in it's early days and the code-base is a bit messy. But I use i= t as my daily driver for notes. :slight_smile:

    7 OCaml Gotchas

    Dmitrii Kovanikov announced

    Hi everyone! :wave:=20

    I've been using OCaml for a while, and I'm quite enjoying the language. In = my not-so-long journey, I discovered a few surprising OCaml behaviours, so = I decided to share them with everyone in a blog post.

    I hope it reduces frustration for newcomers when they see something unexpec= ted for the first time!

    Using OCaml on windows with WSL

    PizieDust announced

    When I got started in OCaml, my setup was basically a dual boot of Windows = 11 and Ubuntu. I had a few issues setting up OCaml on windows at the time a= nd started looking up WSL and if it was a good alternative (I really dislik= ed having to dual boot always). So I wrote this article detailing exactly h= ow I setup OCaml on WSL and have been using it for the past 12 months with = no issues. So if you are looking to get started with programming in OCaml o= n windows, this article is for you.

    How to setup OCaml on Windows with WSL

    Note: opam 2.2 makes it a breeze using OCaml on windows natively so = if you are particularly interested about using OCaml without WSL you should= check it out.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=r26jkek5; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=kuvUX29l; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 1C728B80123 for ; Tue, 28 May 2024 10:07:57 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=/w5R03JbbNmZqxuaJM86Nlqx6U+F1v0Wvj6UpX3THXo=; b=r26jkek5xjcjGzRljXZtgE0t94db+iyw768FeP6KPjPUV1MDmtobmofB Atqs+7vxDItNnUKwyynIeVLkiXmxJ2Aev6E9c1fx1dBAMeELKIknPd7M5 ynjlUNLMLLhrrYA6h3amjyTkCf/zLKiIOeiizwOykqk5hqt9h34saz2mk 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,194,1712613600"; d="scan'208,217";a="167766382" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 May 2024 11:07:57 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1E833E0AF1; Tue, 28 May 2024 11:07:57 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 2BAF0E00B7 for ; Tue, 28 May 2024 11:07:49 +0200 (CEST) IronPort-SDR: 66559ee3_Mva7fckXm9eKxivttWbD3hr9a5ucVaFPg0BXIrZiVu33jM/ esvUarDvXGQVZrY7u44rcN7PHxlWakJOw0JtB1g== X-IPAS-Result: =?us-ascii?q?A0HdBgCDnVVmkCIeaIFagliBQYEDGQFcBloZGgcISIQaP?= =?us-ascii?q?IFjgWyOG5FHiEGCMIFWgSUDGBYFHhQBAwENLgEFDQECBAEBAwECAYILgT2BN?= =?us-ascii?q?wIWiDYCHwYBBDIHDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQA?= =?us-ascii?q?QEBAQEBIB4QDieFRi4NgkouI1EaZQkGAQEBAQEBAQEBAQEBAQEiAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMAQcLJVcOC?= =?us-ascii?q?QoTAQErDRgjAxAEAQYDAgQNATUDARMBEhQGAoJkAYJkAwQBDAaTJJs7eoEyg?= =?us-ascii?q?QGCDAEBBoEIPgMCCQICAxglAdoEgRlKCYFIiBQaASRIaQKEJQmENycPgVVEg?= =?us-ascii?q?z1Rb4I/CxcBAQEBFQNEYAEBCARBCYMlgmmBaYQhJoFdAYVJIS4HFYRmalsSg?= =?us-ascii?q?QpFAkqCDR0MEyt7B3cCBhYITAgJCgQmWTYjAwxZARhbSBRCAgyDDwSIEIFLI?= =?us-ascii?q?gMmMzIBVRMXCz4dAhYDGxQEMA8JCyYqBjYCEgwGBgZZNAkEIwMIBANCAyBxE?= =?us-ascii?q?QMEGgQLB3WBPIFpBBNEA4E3hx2CU4M7gh6EGkuEcYFrDmGIGoFzgUSBaXgdQ?= =?us-ascii?q?AMLbT01FBulbAQ2AoJ9DjoEAikDKwgUDigOAQEEHAIuCAUJDRIHBAEKGRkEC?= =?us-ascii?q?QUJBBgPGQYLDS2EWoglhTwKJQMqA7AmgUk0B4QWgVwGDIh9gSSHNIZxh0qEB?= =?us-ascii?q?YFWiymYGYEYIphBIII0gTuBOYQqCoEbCYFtaYdOjTg8BA+FP4FRGwsoPG8BH?= =?us-ascii?q?QwHMxowQw0OghgBMwkKPBwPVodLhVcBBoQcEDEpVIEmgXU7WifFakE1AgEBN?= =?us-ascii?q?wIHAQoBAQMJhUUdAQGDPmcEXQEB?= IronPort-PHdr: A9a23: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 HxjFyFAlEck IronPort-Data: A9a23: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 vRAI5TzOahdFH1s5Q== IronPort-HdrOrdr: A9a23:vKZvTaji6NFgWx7V877n/romDXBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: 9a23:Mz4Ldm1CEYLXSZfaFSP7ybxfOsUXQEyDlVvpHGSZL35STuWpYkS19/Yx X-Talos-MUID: 9a23:n1Wb2gZ7r8l5H+BTmAbHmAM4E/5R4eeyIW4Lq8hcppaVDHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.08,194,1712613600"; d="scan'208,217";a="167766320" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEJRIILcZkCc6oCblD17elr7zhO2ZrtYD0lIO?= =?us-ascii?q?HkvXIIvbv+shPxARrCbaxmRWT5FfXu6FMwFxd5NOJK10PRDX9MphPpav?= =?us-ascii?q?Ido8FqnWg6nZEUnHYRmN0Umln4glT0rY4r7Kmk5WWwCOlBG4so25NcJ3?= =?us-ascii?q?kKYhSjTFFcxGeN3Hl81iPRTQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 May 2024 11:07:47 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7804B56484D; Tue, 28 May 2024 11:07:45 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1716887265; bh=BlthIaJShLKAPxOnbyYcu4ANwbMq2ff0TCJsnAyUXjc=; h=From:To:Subject:Date:Message-ID; b=kuvUX29lGEV3BKPj6WRoNU2NZ3mj+wPKIji3sCqAErRho3LKXwkxeLy1H7IkPro1g gzOdyYWIIxmT6CaiWzh+0lT2OjGxIScSiFgklhAKczUtbK4XQU8BKmWfwyGQ/I66j2 Xx+LiaD18E2DYiSO7HdrXUEmG6WEaSmMLvCV+MsQ= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 28 May 2024 11:07:45 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 28 11:07:46 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.497908, queueID=DB16556484E X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19138 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDIxIHRvIDI4LA0KMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpvZG9jIERvY3Vt ZW50YXRpb24gSW1wcm92ZW1lbnRzDQpVc2luZyBPQ2FtbCBvbiB3aW5kb3dzIHdpdGggV1NMDQpi aW5zZWMgMC45LjENClVEUCBtdWx0aWNhc3QgZXhhbXBsZXMgdXNpbmcgYXN5bmMgYW5kIGx3dA0K b3BhbSAyLjEuNg0KR2V0dGluZyBPQ2FtbCBUaHJvdWdoIHRoZSBFeWUgb2YgYSBOZWVkbGUNCk1l cmxpbiA1LjAtNTAyDQpMYXVuY2hpbmcgdGhlIEZpcnN0LUNsYXNzIFdpbmRvd3MgUHJvamVjdA0K Q2hlbm5haSBPQ2FtbCBtZWV0dXA6IEp1bmUgMjAyNA0KQ2FwZXIgMS4wDQpQcHhsaWIgZGV2IG1l ZXRpbmdzDQpUYXJpZGVzIEdpdEh1YiBTcG9uc29yc2hpcCBQYWdlIOKAkyBTdXBwb3J0aW5nIHRo ZSBPQ2FtbCBDb21tdW5pdHkgVG9nZXRoZXINCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0K DQpvZG9jIERvY3VtZW50YXRpb24gSW1wcm92ZW1lbnRzDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29kb2MtZG9jdW1lbnRhdGlvbi1pbXByb3ZlbWVudHMvMTQ2NzQvMT4NCg0KDQpDaHJpc3Rp bmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGUgYG9kb2MnIHRlYW0gaXMgd29ya2luZyB0byBpbXByb3Zl IFt0aGUgZG9jdW1lbnRhdGlvbl0sIHNvIHdlJ3JlDQogIHJlYWNoaW5nIG91dCB0byB0aGUgY29t bXVuaXR5IHRvIGZpbmQgb3V0IHRoZXNlIHRoaW5nczoNCiAg4oCiIEFyZSB5b3UgdXNpbmcgYG9k b2MnPyBJZiBzbywgaG93IGRvIHlvdSB1c2UgaXQ/IFdoYXQgYXJlIHlvdXINCiAgICB0aG91Z2h0 cz8NCiAg4oCiIFdoYXQgcGFydHMgb2YgdGhlIGRvY3VtZW50YXRpb24gaGF2ZSBiZWVuIGhlbHBm dWw/DQogIOKAoiBXaGF0J3MgbWlzc2luZz8NCiAg4oCiIFdoYXQgc3VnZ2VzdGlvbnMgZG8geW91 IGhhdmUgZm9yIGltcHJvdmVtZW50Pw0KICDigKIgV2hhdCBhcmUgeW91IHBhaW4gcG9pbnRzIGZv ciBlaXRoZXIvYm90aCB0aGUgZG9jdW1lbnRhdGlvbiBvciB0aGUNCiAgICB0b29sIGl0c2VsZj8N Cg0KICBZb3VyIGlucHV0IGlzIG1vcmUgdmFsdWFibGUgdGhhbiBJIGNhbiBleHByZXNzLiBMb29r aW5nIGZvcndhcmQgdG8NCiAgeW91ciBhbnN3ZXJzIQ0KDQoNClt0aGUgZG9jdW1lbnRhdGlvbl0g PGh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2MvPg0KDQoNClVzaW5nIE9DYW1sIG9uIHdpbmRv d3Mgd2l0aCBXU0wNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy11c2luZy1vY2FtbC1v bi13aW5kb3dzLXdpdGgtd3NsLzE0NjcxLzI+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwg THVrYXN6IFN0YWZpbmlhayBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEkgaGF2ZSBhIHNvbWV3aGF0IHJlbGF0ZWQgYmxvZyBwb3N0IFtIb3cgdG8g dXBkYXRlIG9yIGluc3RhbGwgYSBuZXcNCiAgTGludXggZGlzdHJpYnV0aW9uIG9uIFdTTF0uDQoN Cg0KW0hvdyB0byB1cGRhdGUgb3IgaW5zdGFsbCBhIG5ldyBMaW51eCBkaXN0cmlidXRpb24gb24g V1NMXQ0KPGh0dHBzOi8vbHVrc3RhZmkuZ2l0aHViLmlvL25vdGVzL1dTTF9pbnN0YWxsX25ld19k aXN0cm8uaHRtbD4NCg0KDQpiaW5zZWMgMC45LjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWJpbnNlYy0wLTktMS8xNDY3Ny8xPg0KDQoNCkZyw6lkw6lyaWMgUmVjb3VsZXMgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2YgdGhlIEJJTlNFQyB0 ZWFtLCBJIGFtIGdsYWQgdG8gYW5ub3VuY2UgdGhhdCB2ZXJzaW9uDQogIGAwLjkuMScgbm93IGxp dmVzIGluIGBPcGFtLicNCg0KICBBcyBhIHNob3J0IGludHJvZHVjdGlvbiwgQklOU0VDIGlzIGFu IG9wZW4tc291cmNlIHByb2dyYW0gYW5hbHl6ZXINCiAgZGV2ZWxvcGVkIGF0IFtDRUEgTGlzdCBd IHRvIGhlbHAgaW1wcm92ZSBzb2Z0d2FyZSBzZWN1cml0eSBhdCB0aGUNCiAgYmluYXJ5IGxldmVs LiBJdCBoYXMgYmVlbiBbc3VjY2Vzc2Z1bGx5IGFwcGxpZWQgXSBpbiBhIG51bWJlciBvZg0KICBz ZWN1cml0eS1yZWxhdGVkIGNvbnRleHRzLCBzdWNoIGFzIHZ1bG5lcmFiaWxpdHkgZmluZGluZywg KG1hbHdhcmUpDQogIGRlb2JmdXNjYXRpb24sIGRlY29tcGlsYXRpb24sIGZvcm1hbCB2ZXJpZmlj YXRpb24gb2YgYXNzZW1ibHkgY29kZSBvcg0KICBldmVuIGJpbmFyeS1sZXZlbCBmb3JtYWwgdmVy aWZpY2F0aW9uLg0KDQogIFRoZSB2ZXJzaW9uIGAwLjknIHJlZmFjdG9ycyB0aGUgU01UIHNvbHZl ciBBUEksIGVuYWJsaW5nIG5ldyBraW5kcyBvZg0KICBpbnRlcmFjdGlvbiAoKmluY3JlbWVudGFs IHNvbHZpbmcqKSBhbmQgcGF2aW5nIHRoZSB3YXkgdG8gbW9yZSBzdXBwb3J0DQogIHRvIGludGVy bmFsIHNvbHZlciBiaW5kaW5ncyAoW2JpdHd1emxhXSwgW2JpdHd1emxhLWN4eF0sIFt6M10pLg0K DQogIE1vcmUgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIG9uIHRoZSBbd2Vic2l0ZSBdLCBpbmNs dWRpbmcNCiAgW3B1YmxpY2F0aW9ucyBdLCBbdHV0b3JpYWxzIF0gb3IgW2NvbnRhY3RzXSwgYnV0 IGFsc28gdGhlIGRlc2NyaXB0aW9uDQogIG9mIFt0aGlzIHJlbGVhc2UgXSBhcyB3ZWxsIGFzIFtw cmV2aW91cyBvbmVzXS4NCg0KDQpbQ0VBIExpc3QgXSA8aHR0cDovL3d3dy1saXN0LmNlYS5mci9l bi8+DQoNCltzdWNjZXNzZnVsbHkgYXBwbGllZCBdIDxodHRwczovL2JpbnNlYy5naXRodWIuaW8v YWNoaWV2ZW1lbnRzLmh0bWw+DQoNCltiaXR3dXpsYV0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcv cGFja2FnZXMvYml0d3V6bGEvPg0KDQpbYml0d3V6bGEtY3h4XSA8aHR0cHM6Ly9vcGFtLm9jYW1s Lm9yZy9wYWNrYWdlcy9iaXR3dXpsYS1jeHgvPg0KDQpbejNdIDxodHRwczovL29wYW0ub2NhbWwu b3JnL3BhY2thZ2VzL3ozLz4NCg0KW3dlYnNpdGUgXSA8aHR0cHM6Ly9iaW5zZWMuZ2l0aHViLmlv Lz4NCg0KW3B1YmxpY2F0aW9ucyBdIDxodHRwczovL2JpbnNlYy5naXRodWIuaW8vcHVibGljYXRp b25zPg0KDQpbdHV0b3JpYWxzIF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9iaW5zZWMvYmluc2VjL3Ry ZWUvbWFzdGVyL2RvYz4NCg0KW2NvbnRhY3RzXSA8aHR0cHM6Ly9iaW5zZWMuZ2l0aHViLmlvLyNw ZW9wbGU+DQoNClt0aGlzIHJlbGVhc2UgXQ0KPGh0dHBzOi8vYmluc2VjLmdpdGh1Yi5pby9yZWxl YXNlcy9iaW5zZWMvMjAyNC8wNS8wMS9iaW5zZWMtMC45LjAuaHRtbD4NCg0KW3ByZXZpb3VzIG9u ZXNdIDxodHRwczovL2JpbnNlYy5naXRodWIuaW8vcmVsZWFzZXM+DQoNCg0KVURQIG11bHRpY2Fz dCBleGFtcGxlcyB1c2luZyBhc3luYyBhbmQgbHd0DQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctdWRwLW11bHRpY2FzdC1leGFt cGxlcy11c2luZy1hc3luYy1hbmQtbHd0LzE0Njc4LzE+DQoNCg0KRm94ZGVyIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBh bSB2ZXJ5IG5ldyB0byBPQ2FtbCBhbmQgaGF2ZSBiZWVuIGVuam95aW5nIGxlYXJuaW5nIHRoZSBs YW5ndWFnZS4gSQ0KICB3YXMgbG9va2luZyBmb3IgZXhhbXBsZXMgb2Ygc2ltcGxlIFVEUCBtdWx0 aWNhc3Qgc2VuZGVycyBhbmQgcmVjZWl2ZXJzDQogIGFuZCBjb3VsZCBub3QgZmluZCBhbnkgZ3Jl YXQgb25lcyAocGxlYXNlIGxldCBtZSBrbm93IGlmIEkgbWlzc2VkDQogIHNvbWUpIHNvIEkgd2Vu dCBhYm91dCBjcmVhdGluZyBzb21lIFtleGFtcGxlc10gZm9yIG15c2VsZiBhbmQgYW55b25lDQog IGluIHRoZSBmdXR1cmUuDQoNCiAgSSBjcmVhdGVkIGV4YW1wbGVzIHVzaW5nIGJvdGggYGFzeW5j JyBhbmQgYGx3dCcgZm9yIGNvbmN1cnJlbmN5LiBJZg0KICBhbnlvbmUgaGFzIGZlZWRiYWNrLCBJ IHdvdWxkIGdsYWRseSB0YWtlIGl0IHRvIGltcHJvdmUgb24gdGhlDQogIGV4YW1wbGVzLg0KDQog IOKAoiBbR2l0aHViIFByb2plY3RdDQogIOKAoiBbUG9zdF0NCg0KDQpbZXhhbXBsZXNdIDxodHRw czovL2dpdGh1Yi5jb20vS0ZveGRlci91ZHBfbXVsdGljYXN0X2V4YW1wbGVzPg0KDQpbR2l0aHVi IFByb2plY3RdIDxodHRwczovL2dpdGh1Yi5jb20vS0ZveGRlci91ZHBfbXVsdGljYXN0X2V4YW1w bGVzPg0KDQpbUG9zdF0gPGh0dHBzOi8vd3d3LmtldmluZm94LmRldi91ZHAtbXVsdGljYXN0Pg0K DQoNCm9wYW0gMi4xLjYNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0xLTYvMTQ2ODMvMT4N Cg0KDQpLYXRlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgV2UgYXJlIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIG1pbm9yIHJlbGVhc2Ug b2YgW29wYW0gMi4xLjZdLg0KDQogIFRoaXMgb3BhbSByZWxlYXNlIGNvbnNpc3RzIG9mIGJhY2tw b3J0ZWQgZml4ZXMsIG9mIHdoaWNoIHRoZSBtYWluIG9uZXMNCiAgYXJlOg0KICDigKIgV2FybiB1 c2VycyB3aGVuIGBHTlUgcGF0Y2gnIGNhbm5vdCBiZSBmb3VuZC4gVGhpcyBpcyByZXF1aXJlZCBm b3INCiAgICBvcGFtLXJlcG9zaXRvcnkgbWFpbnRhaW5lcnMgdG8gZ28gZm9yd2FyZCBpbiBpbXBs ZW1lbnRpbmcNCiAgICBbb2NhbWwvb3BhbS1yZXBvc2l0b3J5IzIzNzg5XSBzbyB0aGF0IHRoZXJl IGFyZSBhcyBsaXR0bGUgYnJlYWthZ2UNCiAgICBhcyBwb3NzaWJsZS4NCiAg4oCiIEltcHJvdmUg ZGVwZXh0cyBoYW5kbGluZyBvbiBHZW50b28sIE5ldEJTRCBhbmQgT3BlbkJTRC4NCg0KICBZb3Xi gJlsbCBmaW5kIG1vcmUgaW5mb3JtYXRpb24gaW4gdGhlIFtyZWxlYXNlIGJsb2cgcG9zdF0uDQoN CiAgVG8gdXBncmFkZSBzaW1wbHkgcnVuOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGJhc2gg LWMgInNoIDwoY3VybCAtZnNTTCBodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vb2Nh bWwvb3BhbS9tYXN0ZXIvc2hlbGwvaW5zdGFsbC5zaCkgLS12ZXJzaW9uIDIuMS42Ig0KICDilJTi lIDilIDilIDilIANCg0KICBvciB1cGdyYWRlIHlvdXIgZGlzdHJpYnV0aW9uIG9mIGNob2ljZSBp ZiB0aGVpciBvcGFtIHBhY2thZ2UgaXMNCiAgdXAtdG8tZGF0ZS4NCg0KDQpbb3BhbSAyLjEuNl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjEuNj4NCg0KW29j YW1sL29wYW0tcmVwb3NpdG9yeSMyMzc4OV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS1yZXBvc2l0b3J5L2lzc3Vlcy8yMzc4OT4NCg0KW3JlbGVhc2UgYmxvZyBwb3N0XSA8aHR0cHM6 Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0xLTY+DQoNCg0KR2V0dGluZyBPQ2FtbCBUaHJv dWdoIHRoZSBFeWUgb2YgYSBOZWVkbGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1nZXR0aW5nLW9jYW1sLXRocm91Z2gtdGhlLWV5 ZS1vZi1hLW5lZWRsZS8xNDY4NC8xPg0KDQoNCktvYWxhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgT3ZlciBhdCBsb2JzdGUucnMg dGhlcmUgaXMgc29tZSBkaXNjdXNzaW9uIG9uIHRoZSBmb2xsb3dpbmcgYmxvZyBwb3N0Og0KICA8 aHR0cHM6Ly9oeXBpcmlvbi5jb20vbXVzaW5ncy9nZXR0aW5nLW9jYW1sLXRocm91Z2gtdGhlLWV5 ZS1vZi1hLW5lZWRsZT4NCg0KICBCYXNpY2FsbHkgaXTigJlzIGFib3V0IHRoZSB1cHMgYW5kIGRv d25zIHdoZW4gdXNpbmcgYW5kIGluc3RhbGxpbmcgT2NhbWwNCiAgcGFja2FnZXMuICBQZXJzb25h bGx5LCBJ4oCZdmUgaGFkIHNpbWlsYXIgZXhwZXJpZW5jZXMsIGJ1dCB0aGlzIGFydGljbGUNCiAg aXMgcmVhbGx5IHdlbGwgd3JpdHRlbi4gVGhlIGF1dGhvciBzaG93cyBncmVhdCB0ZWNobmljYWwg a25vd2xlZGdlIGFuZA0KICBJIHRoaW5rIGhlIHRyaWVzIHRvIGJlIGZhaXIuDQoNCiAgV2hhdCBk byB5b3UgdGhpbms/DQoNCiAgRGlzY3Vzc2lvbiBvbiBsb2JzdGUucnM6DQogIDxodHRwczovL2xv YnN0ZS5ycy9zL25paGt3ZS9nZXR0aW5nX29jYW1sX3Rocm91Z2hfZXllX25lZWRsZT4NCg0KDQpN ZXJsaW4gNS4wLTUwMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWVybGluLTUt MC01MDIvMTQ2ODUvMT4NCg0KDQp2ZHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVs ZWFzZSBvZiBbbWVybGluIDUuMC01MDIgXSENCg0KDQpbbWVybGluIDUuMC01MDIgXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9yZWxlYXNlcy90YWcvNS4wLTUwMj4NCg0KU3VwcG9y dCBmb3IgT0NhbWwgNS4yDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGlzIHJlbGVhc2UgYnJpbmdzIG9mZmljaWFs IHN1cHBvcnQgZm9yIFtPQ2FtbCA1LjJdLiBTdWJzdGFudGlhbA0KICBiYWNrZW5kIGNoYW5nZXMg d2VyZSByZXF1aXJlZCB0byBhZGFwdCB0byB0aGlzIHJlbGVhc2UsIGVzcGVjaWFsbHkgZm9yDQog IGZlYXR1cmVzIHN1Y2ggYXMgb2NjdXJyZW5jZXMgYW5kIGdldC1kb2N1bWVudGF0aW9uLiBEbyBu b3QgaGVzaXRhdGUgdG8NCiAgcmVwb3J0IGFueSBzdXNwaWNpb3VzIGJlaGF2aW9yIGluIHRoZSBb aXNzdWUgdHJhY2tlcl0hDQoNCg0KW09DYW1sIDUuMl0gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vY2FtbC01LTItMC1yZWxlYXNlZC8xNDYzOC82Pg0KDQpbaXNzdWUgdHJhY2tlcl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vaXNzdWVzPg0KDQoNCk90aGVyIGNoYW5nZXMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaXMgcmVsZWFz ZSBhbHNvIGZpeGVzIGEgaGFuZGZ1bCBvZiBpc3N1ZXM6DQogIOKAoiBEZXN0cnVjdDogUmVtb3Zh bCBvZiByZXNpZHVhbCBwYXR0ZXJucyAoWyMxNzM3XSwgZml4ZXMgWyMxNTYwXSkNCiAg4oCiIERl c3RydWN0OiBEbyBub3QgZXJhc2UgZmllbGRzJyBuYW1lcyB3aGVuIGRlc3RydWN0aW5nIHB1bm5l ZCByZWNvcmQNCiAgICBmaWVsZHMgKFsjMTczNF0sIGZpeGVzIFsjMTY2MV0pDQogIOKAoiBJZ25v cmUgU0lHUElQRSBpbiB0aGUgTWVybGluIHNlcnZlciBwcm9jZXNzIChbIzE3NDZdKQ0KICDigKIg Rml4IGxleGluZyBvZiBxdW90ZWQgc3RyaW5ncyBpbiBjb21tZW50cyAoWyMxNzU0XSwgZml4ZXMg WyMxNzUzXSkNCiAg4oCiIEltcHJvdmUgY3Vyc29yIHBvc2l0aW9uIGRldGVjdGlvbiBpbiBsb25n aWRlbnRzIChbIzE3NTZdKQ0KDQoNClsjMTczN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9t ZXJsaW4vcHVsbC8xNzM3Pg0KDQpbIzE1NjBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVy bGluL2lzc3Vlcy8xNTYwPg0KDQpbIzE3MzRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVy bGluL3B1bGwvMTczND4NCg0KWyMxNjYxXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxp bi9pc3N1ZXMvMTY2MT4NCg0KWyMxNzQ2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxp bi9wdWxsLzE3NDY+DQoNClsjMTc1NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4v cHVsbC8xNzU0Pg0KDQpbIzE3NTNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL2lz c3Vlcy8xNzUzPg0KDQpbIzE3NTZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvbWVybGluL3B1 bGwvMTc1Nj4NCg0KDQpMYXVuY2hpbmcgdGhlIEZpcnN0LUNsYXNzIFdpbmRvd3MgUHJvamVjdA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9s YXVuY2hpbmctdGhlLWZpcnN0LWNsYXNzLXdpbmRvd3MtcHJvamVjdC8xNDY4Ny8xPg0KDQoNClN1 ZGhhIFBhcmltYWxhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIGV4Y2l0ZWQg dG8gaW50cm9kdWNlIHRoZSBGaXJzdC1DbGFzcyBXaW5kb3dzIFByb2plY3QsIHdoaWNoIGFpbXMN CiAgdG8gbWFrZSBPQ2FtbCBtb3JlIGFjY2Vzc2libGUgYnkgZW5oYW5jaW5nIHRoZSBkZXZlbG9w ZXIgZXhwZXJpZW5jZSBvbg0KICBXaW5kb3dzIHRvIG1hdGNoIHRoYXQgb2YgTGludXggYW5kIG1h Y09TLiBPdXIgZ29hbCBpcyB0byBjcmVhdGUgYQ0KICByb2FkbWFwIG91dGxpbmluZyB0aGUgc3Rl cHMgbmVlZGVkIHRvIGZ1bGx5IHN1cHBvcnQgT0NhbWwgb24gV2luZG93cy4NCg0KICBDaGVjayBv dXIgYmxvZyBwb3N0IGZvciBkZXRhaWxzOg0KICA8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIw MjQtMDUtMjItbGF1bmNoaW5nLXRoZS1maXJzdC1jbGFzcy13aW5kb3dzLXByb2plY3QvPg0KDQog IEFzIGFsd2F5cywgaGFwcHkgdG8gcmVjZWl2ZSBxdWVzdGlvbnMgYW5kIGZlZWRiYWNrLg0KDQoN CkNoZW5uYWkgT0NhbWwgbWVldHVwOiBKdW5lIDIwMjQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvY2hlbm5haS1vY2FtbC1tZWV0dXAtanVuZS0yMDI0LzE0Njk1LzE+DQoNCg0KU3VkaGEgUGFy aW1hbGEgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBhbGwhIFdlJ3JlIGhvc3Rp bmcgYW4gT0NhbWwgbWVldHVwIGF0IHRoZSBUYXJpZGVzIENoZW5uYWkNCiAgb2ZmaWNlcy4gV2Ug aGF2ZSBzb21lIGludGVyZXN0aW5nIHRhbGtzIGZvbGxvd2VkIGJ5IGluZm9ybWFsDQogIGNvbnZl cnNhdGlvbnMgb3ZlciBmb29kLg0KDQogIEBrYXljZWVzcmsgd2lsbCBiZSBzcGVha2luZyBhYm91 dCBDb25jdXJyZW50IFByb2dyYW1taW5nIHdpdGggRWZmZWN0DQogIEhhbmRsZXJzLiBXZSBoYXZl IGFuIG9wZW4gc2xvdCBmb3IgYW5vdGhlciB0YWxrLCBwbGVhc2UgZ2V0IGluIHRvdWNoDQogIGlm IHlvdSdkIGxpa2UgdG8gcHJlc2VudCBzb21ldGhpbmcuDQoNCiAgUGVvcGxlIG9mIGFsbCBiYWNr Z3JvdW5kcyBhbmQgbGV2ZWwgb2YgT0NhbWwgd2VsY29tZS4gUlNWUCBhdCB0aGUNCiAgZm9sbG93 aW5nIGxpbms6DQogIDxodHRwczovL3d3dy5tZWV0dXAuY29tL2NoZW5uYWktb2NhbWwtbWVldHVw L2V2ZW50cy8zMDExOTMwMjAvP3V0bV9tZWRpdW09cmVmZXJyYWwmdXRtX2NhbXBhaWduPXNoYXJl LWJ0bl9zYXZlZGV2ZW50c19zaGFyZV9tb2RhbCZ1dG1fc291cmNlPWxpbms+DQoNCiAgTG9va2lu ZyBmb3J3YXJkIHRvIHNlZWluZyBzb21lIG9mIHlvdSB0aGVyZSENCg0KDQpDYXBlciAxLjANCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWNhcGVyLTEtMC8xNDY5Ni8xPg0KDQoNCm5pa3N1IGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgW0NhcGVy XSBoYXMgbm93IHJlYWNoZWQgKnYxLjAqLCBzb21lIDUrIHllYXJzIGFmdGVyIGRldmVsb3BtZW50 IGZpcnN0DQogIHN0YXJ0ZWQuDQoNCiAgQ2FwZXIgaXMgYSB0b29sIGZvciB1bmRlcnN0YW5kaW5n IGFuZCBwcm9jZXNzaW5nIOKAnHBjYXAgZXhwcmVzc2lvbnPigJ0NCiAgKGFsc28ga25vd24gYXMg L3RjcGR1bXAgZmlsdGVycy8pIHdoaWNoIGFyZSB1c2VkIGZvciBuZXR3b3JrIHBhY2tldA0KICBh bmFseXNpcy4gSXQgaXMgZW50aXJlbHkgd3JpdHRlbiBpbiBPQ2FtbCBhbmQgaW5jbHVkZXMgcGNh cCBhbmFseXNpcw0KICBsb2dpYywgYSBmcm9tLXNjcmF0Y2ggQlBGIGNvbXBpbGVyLCBhbmQgY29u dmVyc2lvbiB0by9mcm9tIEVuZ2xpc2gNCiAgZXhwcmVzc2lvbnMuDQoNCiAgWW91IGNhbiB1c2Ug Q2FwZXIgb25saW5lIHRocm91Z2ggdGhlIFtCUEYgRXhhbV0gc2l0ZS4NCg0KICBDYXBlcuKAmXMg UkVBRE1FIGRlc2NyaWJlcyBtb3RpdmF0aW9uLCBidWlsZGluZywgYW5kIHVzYWdlIGV4YW1wbGVz LCBhbmQNCiAgaXRzIENIQU5HRUxPRyBkZXNjcmliZXMgcmVjZW50IHVwZGF0ZXMuDQoNCiAgQSBo dWdlIHRoYW5rcyBnb2VzIHRvIENhcGVy4oCZcyBjb250cmlidXRvcnMuIEZ1cnRoZXIgY29udHJp YnV0aW9ucyBhbmQNCiAgZmVlZGJhY2sgYXJlIHdlbGNvbWUg4oCTIGEgbGlzdCBvZiBjb250cmli dXRpb24gaWRlYXMgaXMgaW5jbHVkZWQgb24NCiAgQ2FwZXLigJlzIHdlYiBwYWdlLg0KDQoNCltD YXBlcl0gPGh0dHA6Ly9jYXBlci5jcy5paXQuZWR1Lz4NCg0KW0JQRiBFeGFtXSA8aHR0cHM6Ly93 d3cudGNwZHVtcC5vcmcvYnBmZXhhbS8+DQoNCg0KUHB4bGliIGRldiBtZWV0aW5ncw0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZGV2LW1lZXRpbmdz LzEyNDQxLzIyPg0KDQoNCk5hdGhhbiBSZWJvdXJzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT3VyIG5leHQgbWVldGluZyBpcyBzY2hlZHVsZWQgb24gVHVlc2RheSBNYXkgMjh0aCBh dCA2OjAwUE0gQ0VULg0KDQogIEknbGwgcG9zdCB0aGUgZ29vZ2xlIG1lZXQgbGluayBoZXJlIG9u IHRoZSBkYXkgb2YgdGhlIG1lZXRpbmcuDQoNCiAgSW4gdGhlIG1lYW50aW1lLCBoZXJlIGlzIHRo ZSBtZWV0aW5nIGFnZW5kYSBzbyBmYXI6DQoNCiAg4oCiIDUuMiBSZWxlYXNlDQogICAg4oCjIFJl bGVhc2VkIGR1cmluZyBjb21waWxlcidzIGJldGEsIHdlbnQgc21vb3RobHkNCiAg4oCiIDUuMyB0 cnVuayBzdXBwb3J0DQogICAg4oCjIFJldXNlZCB0aGUgd29yayBmcm9tIEBoaHVnbyBhbmQgYWRh cHRlZCBpdA0KICAgIOKAoyBXZSBoYXZlIGFuIG9wZW4gUFIgd2l0aCA1LjMgc3VwcG9ydCB0aGF0 IG5lZWRzIHJldmlldw0KICAgIOKAoyBFeHRlcm5hbCBjb250cmlidXRvcnMgYWxyZWFkeSBzdGFy dGVkIGFkZGluZyBzdXBwb3J0IGZvciBuZXcNCiAgICAgIGZlYXR1cmVzOiBAbm9qYiBhZGRlZCBz dXBwb3J0IGZvciB0aGUgZWZmZWN0cyBwYXR0ZXJucyBhbmQgYW4NCiAgICAgIGludGVybmFsIGNo YW5nZSB0byBsb2NhdGlvbiByZXBvcnRzDQogICAg4oCjIEhvdyB0byBtYWludGFpbiB0cnVuayBz dXBwb3J0IG9uIG91ciBtYWluIGJyYW5jaA0KICDigKIgYHBweF9kZXJpdmluZycgYW5kIGBwcHhf ZGVyaXZpbmdfeW9qc29uJyBwcHhsaWIgcG9ydHMNCiAgICDigKMgUFJzIG9wZW4gZm9yIHRoZSBy ZWxlYXNlIG9mIGJvdGgNCiAgICDigKMgQSBmZXcgYnVnIGZpeGVzIHdlcmUgcmVxdWlyZWQgYnV0 IGl0IHNob3VsZCBiZSBnb29kIHRvIGdvIG5vdw0KICDigKIgNS4yIGludGVybmFsIEFTVCBidW1w DQogICAg4oCjIE5vdyB0aGF0IHRoZSA1LjIgc3VwcG9ydCBoYXMgYmVlbiByZWxlYXNlZCwgd2Ug Y2FuIGRpc2N1c3MgdGhlDQogICAgICBwbGFuIGZvciB0aGlzDQoNCiAgSWYgeW91J2QgbGlrZSB0 byBicmluZyBzb21ldGhpbmcgZWxzZSB1cCBwbGVhc2UgYW5zd2VyIGluIHRoaXMgdGhyZWFkDQog IHNvIHdlIGNhbiBhZGQgaXQgdG8gdGhlIGFnZW5kYS4NCg0KICBZb3UgYXJlIGFsc28gd2VsY29t ZSB0byBhdHRlbmQgdGhlIG1lZXRpbmcsIHdoZXRoZXIgeW91IGhhdmUgc29tZXRoaW5nDQogIHRv IGJyaW5nIHRvIG91ciBhdHRlbnRpb24sIHdvdWxkIGxpa2UgdG8gY29udHJpYnV0ZSB0byB0aGUg cHJvamVjdCBvcg0KICBhcmUganVzdCBpbnRlcmVzdGVkIGluIHBweGxpYiBhbmQgcHB4IGluIGdl bmVyYWwuDQoNCg0KVGFyaWRlcyBHaXRIdWIgU3BvbnNvcnNoaXAgUGFnZSDigJMgU3VwcG9ydGlu ZyB0aGUgT0NhbWwgQ29tbXVuaXR5IFRvZ2V0aGVyDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3RhcmlkZXMtZ2l0aHViLXNwb25zb3JzaGlwLXBhZ2Utc3VwcG9ydGluZy10 aGUtb2NhbWwtY29tbXVuaXR5LXRvZ2V0aGVyLzE0NzA1LzE+DQoNCg0KVGhvbWFzIEdhemFnbmFp cmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIGhhcHB5IHRv IHNoYXJlIHRoYXQgW1RhcmlkZXNdIG5vdyBoYXMgYSBHaXRIdWIgU3BvbnNvcnNoaXAgcGFnZSwN CiAgbGl2ZSBoZXJlIFtodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvdGFyaWRlc10hIPCfjokg QXMgYSBwYXJ0IG9mIHRoZQ0KICB2aWJyYW50IE9DYW1sIGNvbW11bml0eSwgVGFyaWRlcyBpcyBk ZWRpY2F0ZWQgdG8gc3VwcG9ydGluZyBib3RoIHRoZQ0KICBwcm9qZWN0cyBhbmQgdGhlIGluZGl2 aWR1YWxzIHdobyBtYWtlIHRoaXMgZWNvc3lzdGVtIHRocml2ZS4NCg0KICAqV2h5IEdpdEh1YiBT cG9uc29yc2hpcD8qDQoNCiAgVGhlIE9DYW1sIGNvbW11bml0eSBpcyBmaWxsZWQgd2l0aCBtYW55 IHRhbGVudGVkIGluZGl2aWR1YWwNCiAgY29udHJpYnV0b3JzIGFuZCBjb2xsZWN0aXZlcyB3aG8g ZGVzZXJ2ZSB5b3VyIHN1cHBvcnQsIHN1Y2ggYXMNCiAgW0RhbmllbF0sIFtBbnRvbmlvXSwgW0xl YW5kcm9dLCBbUm9idXJdIGFuZCBtYW55IG90aGVycy4gV2UgZW5jb3VyYWdlDQogIHlvdSB0byBz cG9uc29yIHRoZW0gZGlyZWN0bHkgdG8gc3VwcG9ydCB0aGVpciB3b3JrLg0KDQogIEJ1dCBub3cs IHlvdSBjYW4gYWxzbyBzcG9uc29yIFtUYXJpZGVzXSEgQ3JlYXRpbmcgYSBHaXRIdWIgU3BvbnNv cnNoaXANCiAgcGFnZSBpcyBhbiBpbXBvcnRhbnQgc3RlcCBmb3IgdXMsIGFpbWVkIGF0IHN1c3Rh aW5pbmcgcHJvamVjdHMgdGhhdA0KICBjdXJyZW50bHkgbGFjayBkaXJlY3QsIHN0YWJsZSByZXZl bnVlIHNvdXJjZXMuIFdoaWxlIHdlIGFyZSB0aGFua2Z1bA0KICBmb3IgbG9uZy10ZXJtIHNwb25z b3JzIHN1Y2ggYXMgSmFuZSBTdHJlZXQgYW5kIFRlem9zLCB3ZSB3YW50IHRvDQogIGRpdmVyc2lm eSBvdXIgb3Blbi1zb3VyY2UgZnVuZGluZyBzdHJlYW0gdG8gZW5zdXJlIHRoZSBsb25nLXRlcm0N CiAgc3RhYmlsaXR5IGFuZCBzdXN0YWluYWJpbGl0eSBvZiBjb3JlIGluZnJhc3RydWN0dXJlIHBy b2plY3RzIHdlIGFyZQ0KICB3b3JraW5nIG9uIGZvciB0aGUgY29tbXVuaXR5Lg0KDQogICpXaGF0 IENhbiBZb3UgRXhwZWN0PyoNCg0KICBPbiBvdXIgc3BvbnNvcnNoaXAgcGFnZSwgeW914oCZbGwg ZmluZCBkZXRhaWxlZCBpbmZvcm1hdGlvbiBhYm91dCBvdXINCiAgb25nb2luZyBwcm9qZWN0cywg aW5jbHVkaW5nOg0KDQogIOKAoiAqT0NhbWwgQ29tcGlsZXIqOiBNYWludGFpbmluZyBlYXNlIG9m IHVzZSwgY29ycmVjdG5lc3MsIGFuZA0KICAgICBwZXJmb3JtYW5jZSBvZiB0aGUgY29tcGlsZXIo cykuDQogIOKAoiAqT0NhbWwgUGxhdGZvcm0qOiBFbnN1cmluZyBjb3JlIHRvb2xzIGV2b2x2ZSBh bmQgYXJlIGNvbXBhdGlibGUgd2l0aA0KICAgICBuZXcgT0NhbWwgcmVsZWFzZXMuDQogIOKAoiAq T0NhbWwub3JnKjogTWFpbnRhaW5pbmcgdGhlIGNlbnRyYWwga25vd2xlZGdlIGJhc2UgZm9yIHRo ZSBPQ2FtbA0KICAgICBjb21tdW5pdHkuDQogIOKAoiAqQWR2YW5jZWQgUHJvamVjdHMqOiBTdWNo IGFzIE1pcmFnZU9TLCBJcm1pbiBhbmQgRWlvLg0KDQogIFlvdXIgc3VwcG9ydCB3aWxsIGRpcmVj dGx5IGNvbnRyaWJ1dGUgdG8gdGhlIHN1c3RhaW5hYmlsaXR5IG9mIHRoZXNlDQogIHByb2plY3Rz IGFuZCBhbGxvdyB1cyB0byBjb250aW51ZSBvdXIgd29yayBhbmQgbWFpbnRhaW4gdGhlc2UNCiAg bGlicmFyaWVzIGFuZCB0b29scy4NCg0KICAqSG93IFlvdSBDYW4gSGVscCoNCg0KICBXZSBpbnZp dGUgeW91IHRvIHZpc2l0IG91ciBbR2l0SHViIFNwb25zb3JzaGlwIHBhZ2VdIHRvIGxlYXJuIG1v cmUNCiAgYWJvdXQgb3VyIHByb2plY3RzIGFuZCBob3cgeW91IGNhbiBnZXQgaW52b2x2ZWQuIFdl IHdlbGNvbWUgYW55DQogIHN1Z2dlc3Rpb25zIG9yIGNvbW1lbnRzIG9uIGhvdyB3ZSBjYW4gaW1w cm92ZSBhbmQgYmV0dGVyIHNlcnZlIHRoZQ0KICBjb21tdW5pdHkuDQoNCiAgKkNvbW1lcmNpYWwg U3VwcG9ydCoNCg0KICBXaGlsZSB0aGlzIGFubm91Y2VtZW50IGlzIGFib3V0IHRoZSBvbmdvaW5n IG1haW50ZW5hbmNlIG9mIG91ciBjb3JlDQogIG9wZW4tc291cmNlIHByb2plY3RzLCB3ZSBhcmUg YWxzbyBhdmFpbGFibGUgdG8gb3JnYW5pemUgdHJhaW5pbmcsDQogIGRldmVsb3AgY3VzdG9tIGV4 dGVuc2lvbnMsIG9yIHByb3ZpZGUgbG9uZy10ZXJtIGNvbW1lcmNpYWwgc3VwcG9ydCBmb3INCiAg dGhlc2UgcHJvamVjdHMuIFtHZXQgaW4gdG91Y2hdKDxtYWlsdG86Y29udGFjdEB0YXJpZGVzLmNv bT4pIGZvciBtb3JlDQogIGRldGFpbHMuDQoNCiAgVGhhbmsgZm9yIHlvdXIgc3VwcG9ydCwgVGhv bWFzLCBvbiBiZWhhbGYgb2YgdGhlIFRhcmlkZXMgVGVhbQ0KDQoNCltUYXJpZGVzXSA8aHR0cHM6 Ly90YXJpZGVzLmNvbT4NCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy90YXJpZGVzXQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9zcG9uc29ycy90YXJpZGVzPg0KDQpbRGFuaWVsXSA8aHR0cHM6 Ly9naXRodWIuY29tL3Nwb25zb3JzL2RidWVuemxpPg0KDQpbQW50b25pb10gPGh0dHBzOi8vZ2l0 aHViLmNvbS9zcG9uc29ycy9hbm1vbnRlaXJvPg0KDQpbTGVhbmRyb10gPGh0dHBzOi8vZ2l0aHVi LmNvbS9zcG9uc29ycy9sZW9zdGVyYT4NCg0KW1JvYnVyXSA8aHR0cHM6Ly9yb2J1ci5jb29wL0Rv bmF0ZT4NCg0KW1RhcmlkZXNdIDxodHRwczovL2dpdGh1Yi5jb20vc3BvbnNvcnMvdGFyaWRlcz4N Cg0KW0dpdEh1YiBTcG9uc29yc2hpcCBwYWdlXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3Jz L3RhcmlkZXM+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVn YXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0Zyb20gQ29tcHV0ZXIg dG8gUHJvZHVjdGlvbiBXaXRoIE5peF0NCiAg4oCiIFtNZWxhbmdlIDQuMCBpcyBoZXJlXQ0KICDi gKIgW0xhdW5jaGluZyB0aGUgRmlyc3QtQ2xhc3MgV2luZG93cyBQcm9qZWN0XQ0KDQoNClt0aGUg b2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0Zyb20gQ29tcHV0 ZXIgdG8gUHJvZHVjdGlvbiBXaXRoIE5peF0NCjxodHRwczovL3ByaXZlci5kZXYvYmxvZy9uaXgv ZnJvbS1jb21wdXRlci10by1wcm9kdWN0aW9uLXdpdGgtbml4Lz4NCg0KW01lbGFuZ2UgNC4wIGlz IGhlcmVdIDxodHRwczovL21lbGFuZ2UucmUvYmxvZy9wb3N0cy9tZWxhbmdlLTQtaXMtaGVyZT4N Cg0KW0xhdW5jaGluZyB0aGUgRmlyc3QtQ2xhc3MgV2luZG93cyBQcm9qZWN0XQ0KPGh0dHBzOi8v dGFyaWRlcy5jb20vYmxvZy8yMDI0LTA1LTIyLWxhdW5jaGluZy10aGUtZmlyc3QtY2xhc3Mtd2lu ZG93cy1wcm9qZWN0Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElm IHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hp dmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBt ZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpb dGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1Mg ZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9j d24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZv L2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 21 to 28, 2024.

    odoc Documentation Improvements

    Christine announced

    The odoc team is working to improve the documentation, so we're reaching out to the communi= ty to find out these things:

    • Are you using odoc? If so, how do you use it? What are you= r thoughts?
    • What parts of the documentation have been helpful?
    • What's missing?
    • What suggestions do you have for improvement?
    • What are you pain points for either/both the documentation or the tool = itself?

    Your input is more valuable than I can express. Looking forward to your ans= wers!

    Using OCaml on windows with WSL

    Continuing this thread, Lukasz Stafiniak announced

    I have a somewhat related blog post How to update or install a new Linux dist= ribution on WSL.

    binsec 0.9.1

    Fr=C3=A9d=C3=A9ric Recoules announced

    On behalf of the BINSEC team, I am glad to announce that version 0.9.= 1 now lives in Opam.

    As a short introduction, BINSEC is an open-source program analyzer develope= d at CEA List to help improve s= oftware security at the binary level. It has been successfully applied in a number of secu= rity-related contexts, such as vulnerability finding, (malware) deobfuscati= on, decompilation, formal verification of assembly code or even binary-leve= l formal verification.

    The version 0.9 refactors the SMT solver API, enabling new kin= ds of interaction (incremental solving) and paving the way to more s= upport to internal solver bindings (bitwuzla, bitwuzla-cxx, z3).

    More information can be found on the = website , including p= ublications , tutorials or contacts= , but also the description of this release as well as previous ones.

    UDP multicast examples using async and lwt

    Foxder announced

    I am very new to OCaml and have been enjoying learning the language. I was = looking for examples of simple UDP multicast senders and receivers and coul= d not find any great ones (please let me know if I missed some) so I went a= bout creating some examples for myself and anyone in the future.=20

    I created examples using both async and lwt for c= oncurrency. If anyone has feedback, I would gladly take it to improve on th= e examples.=20

    opam 2.1.6

    Kate announced

    We are pleased to announce the minor release of opam 2.1.6.

    This opam release consists of backported fixes, of which the main ones are:

    • Warn users when GNU patch cannot be found. This is require= d for opam-repository maintainers to go forward in implementing ocaml/opam-repositor= y#23789 so that there are as little breakage as possible.
    • Improve depexts handling on Gentoo, NetBSD and OpenBSD.

    You=E2=80=99ll find more information in the release blog post.

    To upgrade simply run:

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.1.6"
    

    or upgrade your distribution of choice if their opam package is up-to-date.

    Merlin 5.0-502

    vds announced

    We are pleased to announce the release of merlin 5.0-502 !

    Support for OCaml 5.2

    This release brings official support for OCaml 5.2. Substantial backend chang= es were required to adapt to this release, especially for features such as = occurrences and get-documentation. Do not hesitate to report any suspicious= behavior in the issue t= racker!

    Other changes

    This release also fixes a handful of issues:

    • Destruct: Removal of residual patterns (#1737, fixes #1560)
    • Destruct: Do not erase fields' names when destructing punned record fie= lds (#1734, fixes= #1661)
    • Ignore SIGPIPE in the Merlin server process (#1746)
    • Fix lexing of quoted strings in comments (#1754, fixes #1753)
    • Improve cursor position detection in longidents (#1756)

    Launching the First-Class Windows Project

    Sudha Parimala announced

    I'm excited to introduce the First-Class Windows Project, which aims to mak= e OCaml more accessible by enhancing the developer experience on Windows to= match that of Linux and macOS. Our goal is to create a roadmap outlining t= he steps needed to fully support OCaml on Windows.

    Check our blog post for details: https://tarides.com/blog/2= 024-05-22-launching-the-first-class-windows-project/

    As always, happy to receive questions and feedback.

    Chennai OCaml meetup: June 2024

    Sudha Parimala announced

    Hi all! We're hosting an OCaml meetup at the Tarides Chennai offices. We ha= ve some interesting talks followed by informal conversations over food.

    @kayceesrk will be speaking about Concurrent Programming with Effect Handle= rs. We have an open slot for another talk, please get in touch if you'd lik= e to present something.

    People of all backgrounds and level of OCaml welcome. RSVP at the following= link: https://www.meetup.com/chennai-ocaml-meetup/eve= nts/301193020/?utm_medium=3Dreferral&utm_campaign=3Dshare-btn_savedeven= ts_share_modal&utm_source=3Dlink

    Looking forward to seeing some of you there!

    Caper 1.0

    niksu announced

    Caper has now reached v1.0,= some 5+ years after development first started.

    Caper is a tool for understanding and processing =E2=80=9Cpcap expressions= =E2=80=9D (also known as tcpdump filters) which are used for network= packet analysis. It is entirely written in OCaml and includes pcap analysi= s logic, a from-scratch BPF compiler, and conversion to/from English expres= sions.

    You can use Caper online through the BPF Exam site.

    Caper=E2=80=99s README describes motivation, building, and usage examples, = and its CHANGELOG describes recent updates.

    A huge thanks goes to Caper=E2=80=99s contributors. Further contributions a= nd feedback are welcome =E2=80=93 a list of contribution ideas is included = on Caper=E2=80=99s web page.

    Ppxlib dev meetings

    Nathan Rebours announced

    Our next meeting is scheduled on Tuesday May 28th at 6:00PM CET.

    I'll post the google meet link here on the day of the meeting.

    In the meantime, here is the meeting agenda so far:

    • 5.2 Release
      • Released during compiler's beta, went smoothly
    • 5.3 trunk support
      • Reused the work from @hhugo and adapted it
      • We have an open PR with 5.3 support that needs review
      • External contributors already started adding support for new features: @nojb added support for the effects patterns and an internal change to loca= tion reports
      • How to maintain trunk support on our main branch
    • ppx_deriving and ppx_deriving_yojson ppxlib p= orts
      • PRs open for the release of both
      • A few bug fixes were required but it should be good to go now
    • 5.2 internal AST bump
      • Now that the 5.2 support has been released, we can discuss the plan for= this

    If you'd like to bring something else up please answer in this thread so we= can add it to the agenda.

    You are also welcome to attend the meeting, whether you have something to b= ring to our attention, would like to contribute to the project or are just = interested in ppxlib and ppx in general.

    Tarides GitHub Sponsorship Page =E2=80=93 Supporting the OCam= l Community Together

    Thomas Gazagnaire announced

    I am happy to share that Tarides now ha= s a GitHub Sponsorship page, live here https://github.com/sponsors/tarides! =F0=9F=8E=89 As a part= of the vibrant OCaml community, Tarides is dedicated to supporting both th= e projects and the individuals who make this ecosystem thrive.

    Why GitHub Sponsorship?

    The OCaml community is filled with many talented individual contributors an= d collectives who deserve your support, such as Daniel, Antonio, Lea= ndro, Robur and many others.= We encourage you to sponsor them directly to support their work.

    But now, you can also sponsor Tarides! Creating a GitHub Sponsorship page is an important step for= us, aimed at sustaining projects that currently lack direct, stable revenu= e sources. While we are thankful for long-term sponsors such as Jane Street= and Tezos, we want to diversify our open-source funding stream to ensure t= he long-term stability and sustainability of core infrastructure projects w= e are working on for the community.

    What Can You Expect?

    On our sponsorship page, you=E2=80=99ll find detailed information about our= ongoing projects, including:

    • OCaml Compiler: Maintaining ease of use, correctness, and perfor= mance of the compiler(s).
    • OCaml Platform: Ensuring core tools evolve and are compatible wi= th new OCaml releases.
    • OCaml.org: Maintaining the central knowledge base for the OCaml = community.
    • Advanced Projects: Such as MirageOS, Irmin and Eio.

    Your support will directly contribute to the sustainability of these projec= ts and allow us to continue our work and maintain these libraries and tools.

    How You Can Help

    We invite you to visit our = GitHub Sponsorship page to learn more about our projects and how you ca= n get involved. We welcome any suggestions or comments on how we can improv= e and better serve the community.

    Commercial Support

    While this annoucement is about the ongoing maintenance of our core open-so= urce projects, we are also available to organize training, develop custom e= xtensions, or provide long-term commercial support for these projects. [Get= in touch](mailto:contact@tarides.co= m) for more details.

    Thank for your support, Thomas, on behalf of the Tarides Team

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=E2pdb3XE; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=3vfrFBo8; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 9AA82B80123 for ; Tue, 4 Jun 2024 14:26:29 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=kT3Z9Ihd1i5V0LD9xq1W2HV3U3ovum3Ps83RQCz5kzw=; b=E2pdb3XEyIkutpMxFS5UXo2QcJivKK6+nVCOAc5TSvKqPZB4vYVMEpSf 71hXVAXtNPgHnhCMYCGUHR8XbRHz2wdAFGHo2U/2omdJrtQ/8tFxScmeL qP1e88yvCovoh+aqprqI5EU9D789vZvMARcu9yV735v5XJZW3GnUbxWAb E=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,213,1712613600"; d="scan'208,217";a="168966577" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Jun 2024 15:26:27 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7CBAAE0D59; Tue, 4 Jun 2024 15:26:27 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 670A5E0035 for ; Tue, 4 Jun 2024 15:26:23 +0200 (CEST) IronPort-SDR: 665f15fd_D6FJXUJpeubTl1bGeq5d7KdKrcrUsaSLlZnCCTolXJmP2Ka k6pwO2j6vy75MRPD84a7kcTMUO7YanRFQZiak9w== X-IPAS-Result: =?us-ascii?q?A0FbAgBmFF9mkCIeaIFagliBQYEDGQFiWhkaBwhIhFaDT?= =?us-ascii?q?44bkUeKcYFWFIEsFiMUAQMBDS4BDgQBAgQBAQMBAgGEOUYCFohKAh8GAQQyB?= =?us-ascii?q?w4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECEAEBAQEBASAeEA4nh?= =?us-ascii?q?XQNgkoZFSNrZQk3AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAgwBGYEDAQgKEwEBOBgjAxQBBgMCBA0BNRcBEhQGgiJEAYJkA?= =?us-ascii?q?wUMBpQHmzt6gTKBAYIMAQEGgQg+AgELAgIDDy4B2gSBYwmBMBiIFxoBJEhpA?= =?us-ascii?q?oQlhEAnD4FVRIEVNYJEb4I/CxcCAQGBJBUDAQECBAIJPAmDJYJphgiCAwGFS?= =?us-ascii?q?Vd+giRBgVMwbYEKLxhggicPgS1qDyRpgQFdD4IVFEICDIFMgUJ/JgtECVIQi?= =?us-ascii?q?AOBS0szIRMBVRMXCz4dAhYDGxQEMA8JCyYqBjkCEgwGBgZZNAkEIwMIBANCA?= =?us-ascii?q?yBxEQMEGgQLB3WBPIFpBBNEA4E3hx2CVoM7gh2EHEuEc4FrDGGIFYFzgUOBZ?= =?us-ascii?q?lCDLh1AAwttPTUUG6dRBDYCgm0CJA4KLgYBAWIHERMBGw4CIg0nAg4CERgHA?= =?us-ascii?q?xkRCBsEEQEHLQsFCC2SMRQoBCgBsQRsNAeEFoFcBgyIfYEklW+EBYFWiyqZM?= =?us-ascii?q?SKYQiCCNIcegSUJgW1plUIEhU6BbAMwgSsbAwwHMxowQ4JnCQo8HA+OKgIBA?= =?us-ascii?q?RWDWIE8AoEmgSRRO8Q8MkE1AgEBBzACBwEKAQEDCYViAQGDDDKBSAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVh3pTmOHm4FQ== IronPort-HdrOrdr: A9a23:CUdSD6imGF6pqu+JDrostJDfRHBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: 9a23:KPOUWmB0nkzRiCz6Ewdr834IIpopS3Dm8nffYF2IVUpDRLLAHA== X-Talos-MUID: =?us-ascii?q?9a23=3A70BSMA6OSYMbBBujl/StWcujxoxZ36XtT3w2wa8?= =?us-ascii?q?L+PuoLxAvaz7agR2eF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.08,213,1712613600"; d="scan'208,217";a="88807064" X-MGA-submission: =?us-ascii?q?MDHQX6KZt1KsULAmttgI4sIIWSEBEZqGXa4mFA?= =?us-ascii?q?k/JCUrS2eZsAhtDLpFUsHTpqvY2eqC1muJfTMj3HmxsvaTWXcUGC2CM9?= =?us-ascii?q?gbX/SsyjwDAzExD0h1puYX3PJlzCPWec0yoVwsuY9G/ak0QpEEDhrcpp?= =?us-ascii?q?Qihez8AymfbrkXj8zGffb+DA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Jun 2024 15:26:22 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B8B54564688; Tue, 4 Jun 2024 15:26:19 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1717507579; bh=X4yY8T/stnW2+vyL1o4m/9MiRN0ltxcYB51Zhn61OB0=; h=From:To:Subject:Date:Message-ID; b=3vfrFBo85TEJYKXlPS5JgX0hjBdXDyAowIgudu1+XTeErSzzc13vZ2/RQ1hBwGwzM JnPpHZVEqCK1xmnn4qrFMFyvh/Um0HDJqEkLKEwQAH8+/d13gRQl2Uew/mNI1aotTW mDYx8oBaF5l2kD+KJroWB5Rvcw1dWb2JZBFpvSFg= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 04 Jun 2024 15:26:19 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 4 15:26:20 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499999, queueID=17E32564689 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19139 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDI4IHRvIEp1bmUgMDQsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnYwLjE3 IHJlbGVhc2Ugb2YgSmFuZSBTdHJlZXQgcGFja2FnZXMNCmpzb25zY2hlbWEyYXRkLCBHZW5lcmF0 ZSBhbiBBVEQgZmlsZSBmcm9tIGEgSlNPTiBTY2hlbWEgLyBPcGVuQVBJIGRvY3VtZW50DQpvcGFt LXJlcG9zaXRvcnkgcG9saWN5IGNoYW5nZTogY2hlY2tzdW1zIChubyBtZDUpIGFuZCBubyBleHRy YS1maWxlcw0KQ2FtbGtpdCDigJMgbWFjT1MvaU9TL0dOVXN0ZXAgdG9vbGtpdCBmb3IgT0NhbWwN CnBvc2l0aW9uIGZvciBNb29uQml0IGFkdm9jYXRlDQpXaHkgaXMgdGhlcmUgbm8gdHJhZGl0aW9u IG9mIENMSSBhbmQgVFVJIGFwcHM/DQpQcHhsaWIgZGV2IG1lZXRpbmdzDQpZb2pzb24gMi4yLjAN CkdyYWNlIDAuMi4wIPCfkoUsIGZhbmN5IGRpYWdub3N0aWNzIGxpYnJhcnkgZm9yIGNvbXBpbGVy cw0KRmlyc3QgcmVsZWFzZSBvZiBTbGlwc2hvdyBvbiBvcGFtIQ0KT3RoZXIgT0NhbWwgTmV3cw0K T2xkIENXTg0KDQoNCnYwLjE3IHJlbGVhc2Ugb2YgSmFuZSBTdHJlZXQgcGFja2FnZXMNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXYwLTE3LXJlbGVhc2Ut b2YtamFuZS1zdHJlZXQtcGFja2FnZXMvMTQ3MTcvMT4NCg0KDQpEaWFuYSBLYWxpbmljaGVua28g YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAqdjAuMTcgcmVsZWFz ZSBvZiBKYW5lIFN0cmVldCBwYWNrYWdlcyoNCg0KICBEZWFyIE9DYW1sIGRldmVsb3BlcnMsDQoN CiAgV2UgYXJlIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIHYwLjE3IHJlbGVhc2Ugb2YgSmFuZSBT dHJlZXQgcGFja2FnZXMhDQoNCiAgVGhpcyByZWxlYXNlIGNvbWVzIHdpdGggMTUgbmV3IHBhY2th Z2VzIGFuZCBhIG11bHRpdHVkZSBvZiBuZXcNCiAgZmVhdHVyZXMgYW5kIGZpeGVzLg0KDQoNClN3 aXRjaCB0byBPQ2FtbCA1LjENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIGFyZSBzd2l0Y2hpbmcgQmFzZSBhbmQgYWxsIG91 ciBwYWNrYWdlcyAoZXhjZXB0IGBzZXhwbGliMCcpIHRvDQogIE9DYW1sIDUuMSBhbmQgYWJvdmUu IFdlIGFyZSBhbHNvIHN3aXRjaGluZyBgc2V4cGxpYjAnIHRvIDQuMTQgdG8gdGFrZQ0KICBhZHZh bnRhZ2Ugb2YgdGhlIFRhaWwgUmVjdXJzaW9uIE1vZHVsbyBDb25zIG9wdGltaXphdGlvbiBpbiB0 aGUNCiAgY29tcGlsZXIuDQoNCg0KQ29yZSBvbiBPQ2FtbCA1LjINCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIER1ZSB0byBzb21lIGNoYW5n ZXMgdG8gYFN0ZGxpYi5HYycgaW4gT0NhbWwgNS4yLCBgY29yZS52MC4xNy4wJyBmYWlscw0KICB0 byBjb21waWxlIHdpdGggdGhhdCBsYW5ndWFnZSB2ZXJzaW9uLiBXZSB3aWxsIHJlbGVhc2UgYSBm aXggdGhhdA0KICBhbGxvd3MgdXNpbmcgQ29yZSB3aXRoIE9DYW1sIDUuMiBzb29uLg0KDQoNClRv cmNoIGFuZCBWQ2FtbA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgRHVlIHRvIHNvbWUgaXNzdWVzIHdpdGggdGhlaXIgYnVpbGRzLCBgdG9yY2gudjAu MTcuMCcgYW5kDQogIGB2Y2FtbC52MC4xNy4wJyB3ZXJlIG9taXR0ZWQgZnJvbSB0aGUgbWFpbiB2 MC4xNyByZWxlYXNlLiBXZSB3aWxsIHNvb24NCiAgc3VibWl0IHRob3NlIHBhY2thZ2VzIHRvIG9w YW0uDQoNCg0KQ2hhbmdlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQnJvd3NlIG91ciBb R2l0SHViIHJlcG9zaXRvcmllc10gYW5kIGxvb2sgYXQgdGhlIHJlc3BlY3RpdmUNCiAgYENIQU5H RVMubWQnIGZpbGVzIGZvciBjaGFuZ2VzIHNpbmNlIHRoZSB2MC4xNiByZWxlYXNlLiBGb3IgZXhh bXBsZXMsDQogIHNlZSBjaGFuZ2Vsb2dzIGZvciBbQmFzZV0sIFtBc3luY19rZXJuZWxdLCBhbmQg W0JvbnNhaV0uDQoNCg0KW0dpdEh1YiByZXBvc2l0b3JpZXNdIDxodHRwczovL2dpdGh1Yi5jb20v amFuZXN0cmVldD4NCg0KW0Jhc2VdIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9iYXNl L2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNCltBc3luY19rZXJuZWxdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvYXN5bmNfa2VybmVsL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoN CltCb25zYWldIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9ib25zYWkvYmxvYi9tYXN0 ZXIvQ0hBTkdFUy5tZD4NCg0KDQpOZXcgcGFja2FnZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIFthc3luY19sb2ddIOKAkyBhIGxvZ2dpbmcgbGlicmFyeSBmb3Ig QXN5bmMgY29kZSwgbW92ZWQgZnJvbQ0KICBgYXN5bmNfdW5peCcNCg0KICBbY2FwaXRhbGl6YXRp b25dIOKAkyBhIGxpYnJhcnkgZm9yIGNhc2UgY29udmVudGlvbnMgYW5kIHJlbmFtaW5nDQogIGlk ZW50aWZpZXJzDQoNCiAgW2NvZGljb25zXSDigJMgaWNvbnMgZnJvbSBWUyBDb2RlIGZvciB1c2Ug d2l0aCBCb25zYWkNCg0KICBbZ2VsXSDigJMgYSBsaWJyYXJ5IHRvIG1hcmsgbm9uLXJlY29yZCBm aWVsZHMgZ2xvYmFsIGZvciB1c2Ugd2l0aCBvdXINCiAgY29tcGlsZXIgZXh0ZW5zaW9ucw0KDQog IFtoYXJkY2FtbF9ldmVudF9kcml2ZW5fc2ltXSDigJMgYSBzaW11bGF0b3IgbGlicmFyeSBmb3Ig SGFyZGNhbWwNCg0KICBbb2NhbWxfaW50cmluc2ljc19rZXJuZWxdIOKAkyBhIHNwbGl0IGZyb20g YG9jYW1sX2ludHJpbnNpY3MnIGNvbXBhdGlibGUNCiAgd2l0aCBqYXZhc2NyaXB0DQoNCiAgW29j YW1sX29wZW5hcGlfZ2VuZXJhdG9yXSDigJMgYW4gT3BlbkFQSSAzIHRvIE9DYW1sIGNsaWVudCBn ZW5lcmF0b3INCg0KICBbcHB4X2RpZmZdIOKAkyBhIHBweCBmb3IgZ2VuZXJhdGlvbiBvZiBkaWZm cyBhbmQgdXBkYXRlIGZ1bmN0aW9ucyBmb3INCiAgT0NhbWwgdHlwZXMuDQoNCiAgW3BweF9lbWJl ZF9maWxlXSDigJMgYSBwcHggdGhhdCBhbGxvd3MgZW1iZWRkaW5nIGZpbGVzIGRpcmVjdGx5IGlu dG8NCiAgZXhlY3V0YWJsZXMvbGlicmFyaWVzIGFzIHN0cmluZ3Mgb3IgYnl0ZXMNCg0KICBbcHB4 bGliX2phbmVdIOKAkyB1dGlsaXRpZXMgZm9yIHdvcmtpbmcgd2l0aCBKYW5lIFN0cmVldCBBU1Qg Y29uc3RydWN0cw0KDQogIFtwcHhfcXVpY2tfdGVzdF0g4oCTIGEgcHB4IHByb3ZpZGluZyBhbiBl cmdvbm9taWMgd3JhcHBlciBmb3IgcXVpY2tjaGVjaw0KICB0ZXN0cywgc2ltaWxhciB0byBgcHB4 X2lubGluZV90ZXN0Jw0KDQogIFtwcHhfc3RyaW5nX2NvbnZdIOKAkyBkZXJpdmluZyBgdG9fc3Ry aW5nfmFuZCB+b2Zfc3RyaW5nJw0KDQogIFt1b3B0XSDigJMgdW5zYWZlIG9wdGlvbiB0eXBlIHRo YXQgZG9lcyBub3QgYWxsb2NhdGUsIG1vdmVkIGZyb20NCiAgYGNvcmVfa2VybmVsJw0KDQogIFt2 ZXJzaW9uZWRfcG9sbGluZ19zdGF0ZV9ycGNdIOKAkyBoZWxwZXIgZnVuY3Rpb25zIGZvciB2ZXJz aW9uZWQNCiAgYFBvbGxpbmdfc3RhdGVfcnBjLnQnDQoNCiAgW3ZpcnR1YWxfZG9tX3RvcGxheWVy XSDigJMgYmluZGluZ3MgZm9yIHRoZSBgZmxvYXRpbmdfcG9zaXRpb25pbmcnDQogIGphdmFzY3Jp cHQgbGlicmFyeQ0KDQoNClthc3luY19sb2ddIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVl dC9hc3luY19sb2c+DQoNCltjYXBpdGFsaXphdGlvbl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5l c3RyZWV0L2NhcGl0YWxpemF0aW9uPg0KDQpbY29kaWNvbnNdIDxodHRwczovL2dpdGh1Yi5jb20v amFuZXN0cmVldC9jb2RpY29ucz4NCg0KW2dlbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3Ry ZWV0L2dlbD4NCg0KW2hhcmRjYW1sX2V2ZW50X2RyaXZlbl9zaW1dDQo8aHR0cHM6Ly9naXRodWIu Y29tL2phbmVzdHJlZXQvaGFyZGNhbWxfZXZlbnRfZHJpdmVuX3NpbT4NCg0KW29jYW1sX2ludHJp bnNpY3Nfa2VybmVsXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L29jYW1sX2ludHJp bnNpY3Nfa2VybmVsPg0KDQpbb2NhbWxfb3BlbmFwaV9nZW5lcmF0b3JdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvb2NhbWxfb3BlbmFwaV9nZW5lcmF0b3I+DQoNCltwcHhfZGlmZl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3BweF9kaWZmPg0KDQpbcHB4X2VtYmVkX2Zp bGVdIDxodHRwczovL2dpdGh1Yi5jb20vamFuZXN0cmVldC9wcHhfZW1iZWRfZmlsZT4NCg0KW3Bw eGxpYl9qYW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvcHB4bGliX2phbmU+DQoN CltwcHhfcXVpY2tfdGVzdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L3BweF9xdWlj a190ZXN0Pg0KDQpbcHB4X3N0cmluZ19jb252XSA8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJl ZXQvcHB4X3N0cmluZ19jb252Pg0KDQpbdW9wdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3Ry ZWV0L3VvcHQ+DQoNClt2ZXJzaW9uZWRfcG9sbGluZ19zdGF0ZV9ycGNdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2phbmVzdHJlZXQvdmVyc2lvbmVkX3BvbGxpbmdfc3RhdGVfcnBjPg0KDQpbdmlydHVh bF9kb21fdG9wbGF5ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvdmlydHVhbF9k b21fdG9wbGF5ZXI+DQoNCg0KanNvbnNjaGVtYTJhdGQsIEdlbmVyYXRlIGFuIEFURCBmaWxlIGZy b20gYSBKU09OIFNjaGVtYSAvIE9wZW5BUEkgZG9jdW1lbnQNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWpzb25zY2hlbWEyYXRkLWdlbmVyYXRlLWFuLWF0ZC1m aWxlLWZyb20tYS1qc29uLXNjaGVtYS1vcGVuYXBpLWRvY3VtZW50LzE0NzE4LzE+DQoNCg0KTG91 aXMgUm9jaMOpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQWhyZWZzIGhhcyByZWxlYXNlZCBqc29u c2NoZW1hMmF0ZCwgYSBjbGkgdG9vbCB0byBjb252ZXJ0IGFuIE9wZW5BUEkNCiAgb3IgSnNvbiBT Y2hlbWEgc3BlY2lmaWNhdGlvbiBpbnRvIGFuIGF0ZCBmaWxlLg0KDQogIFF1aXRlIGEgbG90IG9m IGFwaSBvdXQgdGhlcmUgYXJlIG5vdyBwdWJsaXNoaW5nIHNvbWUga2luZCBvZiBzcGVjIGZvcg0K ICB0aGVpciBleHBlY3RlZCBpbnB1dCBvdXIgb3V0cHV0LiBJdCdzIG9mdGVuIGRvbmUgdGhyb3Vn aCBhIGEgSlNPTg0KICBTY2hlbWEgb3IgT3BlbkFQSSBkb2N1bWVudC4gVGhlIGdvYWwgb2YgdGhp cyB0b29sIGlzIHRvIHNhdmUgdGltZSBmb3INCiAgbGFyZ2UgYXBpIGJ5IGRvaW5nIGEgbWVjaGFu aWNhbCB0cmFuc2xhdGlvbiB0byBhbiBhdGQgZmlsZSBpbnN0ZWFkIG9mDQogIHdyaXRpbmcgYWxs IHRoZSB0eXBlcyBieSBoYW5kLg0KDQogIFVuZm9ydHVuYXRlbHkgdGhlIHdvcmxkIGlzIGtpbmQg b2YgYSBtZXNzLiBNb3N0IG9mIHRoZSBzcGVjcyB3ZSBoYXZlDQogIHNlZW4gYXJlIG5vdCBmb2xs b3dpbmcgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIG9wZW5hcGkvanNvbnNjaGVtYSBidXQNCiAgY29u dGFpbiBhIGJpdCBvZiBldmVyeXRoaW5nLiBqc29uc2NoZW1hMmF0ZCBkb2VzIGl0cyBiZXN0IHRv IGRvIHRoZQ0KICByaWdodCB0aGluZywgYnV0IHRoZXJlIGFyZSBwcm9iYWJseSBjYXNlcyB0aGF0 IGFyZW4ndCBjb3ZlcmVkLg0KDQogIFRoZSBnZW5lcmF0ZWQgY29kZSBtaWdodCBhbHNvIG5vdCBi ZSBvcHRpbWFsLiBJdCBvZnRlbiBkZXNlcnZlcyBzb21lDQogIGhhbmQgY2xlYW51cCBhbmQgYSBi aXQgb2YgcmVuYW1pbmcuIEhvcGVmdWxseSBpdCBzdGlsbCBnaXZlcyBhIGdvb2QNCiAgaGVhZCBz dGFydC4NCg0KICBUaGFua3MgdG8gW0Vnb3IgQ2hlbW9raG9uZW5rb10gZm9yIHRoaXMgd29yay4N Cg0KICBUaGUgY29kZSBpcyBhdmFpbGFibGUgYXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMv anNvbnNjaGVtYTJhdGQ+DQoNCiAgQW5kIHRoZXJlIGlzIGEgcGFja2FnZSB0aGF0IGlzIHB1Ymxp c2hlZCBvbiBvcGFtDQogIDxodHRwczovL29jYW1sLm9yZy9wL2pzb25zY2hlbWEyYXRkL2xhdGVz dD4NCg0KDQpbRWdvciBDaGVtb2tob25lbmtvXSA8aHR0cHM6Ly9naXRodWIuY29tL2l4enpkPg0K DQoNCm9wYW0tcmVwb3NpdG9yeSBwb2xpY3kgY2hhbmdlOiBjaGVja3N1bXMgKG5vIG1kNSkgYW5k IG5vIGV4dHJhLWZpbGVzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLXJlcG9zaXRv cnktcG9saWN5LWNoYW5nZS1jaGVja3N1bXMtbm8tbWQ1LWFuZC1uby1leHRyYS1maWxlcy8xNDcy MC8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg RGVhciBldmVyeW9uZSwNCg0KICB0aGUgb3BhbS1yZXBvc2l0b3J5IHBvbGljeSBqdXN0IGNoYW5n ZWQgdG8gKm5vdCBhY2NlcHQgbWQ1LW9ubHkNCiAgY2hlY2tzdW1zKiwgYW5kIGFsc28gdG8gKmF2 b2lkIGV4dHJhLWZpbGVzKiBpbiBwYWNrYWdlcyAodXNlDQogIGV4dHJhLXNvdXJjZSBpbnN0ZWFk KS4NCg0KDQpOT1RFOg0K4pWM4pWM4pWM4pWM4pWMDQoNCiAgSWYgeW91IGVuY291bnRlciBpc3N1 ZXMgZHVyaW5nIGBvcGFtIHVwZGF0ZScsIHBsZWFzZSBtYWtlIHN1cmUgdG8gaGF2ZQ0KICBgb3Bh bSAyLjEuNicgaW5zdGFsbGVkLCBhbmQgYGdwYXRjaCcgKGVzcGVjaWFsbHkgb24gQlNEIHN5c3Rl bXMgYW5kDQogIG1hY09TKS4gVGhpcyBtYXkgYnJlYWsgc2lsZW50bHksIGlmIHlvdSBlbmNvdW50 ZXIgaXNzdWVzLCBwbGVhc2UgYHJtDQogIC1yZiB+Ly5vcGFtL3JlcG8vZGVmYXVsdCAmJiBvcGFt IHVwZGF0ZSBkZWZhdWx0JyBTZWUgZnVydGhlciBub3RlcyBpbg0KICA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9pc3N1ZXMvMjU5NjE+DQoNCg0KV2hhdCBoYXMgYmVl biBhY2hpZXZlZD8NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBBIG5ldyBsaW50IGNoZWNrIHRoYXQg ZXJyb3JzIG9uIG1kNS1vbmx5IGNoZWNrc3VtIHNwZWNpZmljYXRpb24gaGFzDQogICAgYmVlbiBw dXQgaW50byBwbGFjZQ0KICAgIDxodHRwczovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb3BhbS1yZXBv LWNpL3B1bGwvMzA0Pg0KICDigKIgQSBuZXcgbGludCBjaGVjayB0aGF0IGVycm9ycyBpZiBgZXh0 cmEtZmlsZXMnIGlzIHByZXNlbnQNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL29jdXJyZW50L29w YW0tcmVwby1jaS9wdWxsLzMxMz4NCiAg4oCiIFRoZSBleGlzdGluZyBgZXh0cmEtZmlsZXMnLCBi dW5kbGVkIGluIHRoZSBvcGFtLXJlcG9zaXRvcnksIGhhdmUNCiAgICBiZWVuIG1vdmVkIHRvIG9w YW0tc291cmNlLWFyY2hpdmVzDQogICAgKDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1z b3VyY2UtYXJjaGl2ZXMvcHVsbC8yOD4pDQogIOKAoiBUaGUgb3BhbSBmaWxlcyBpbiB0aGUgb3Bh bS1yZXBvc2l0b3J5IHdlcmUgY2hhbmdlZCB0byB1c2UNCiAgICBleHRyYS1zb3VyY2Ugd2l0aCB0 aGUgb3BhbS1zb3VyY2UtYXJjaGl2ZXMgcmVwb3NpdG9yeQ0KICAgIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2NvbW1pdC83NmViMzVjOGE3OGE4OTFjN2U1ZTI3YjVj MzIzMTZkN2FkZDFmNTJkPg0KICDigKIgQWxsIGV4aXN0aW5nIChhbmQgYXZhaWxhYmxlKSBwYWNr YWdlcyB1c2luZyBvbmx5IG1kNSBoYXZlIGJlZW4NCiAgICB1cGdyYWRlZCB0byB1c2Ugc2hhMjU2 IGFzIHdlbGwNCiAgICAoPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkv Y29tbWl0L2VhODdjNDllNTFmZjI5YTQ1OTQyMjQxOWUxNjg4OTM4ZmQ3N2E0NmY+KQ0KICDigKIg U2VlIHRoZSBQUiBmb3IgdGhlIGZ1bGwgY2hhbmdlcw0KICAgIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjU5NjA+DQogIOKAoiBTZWUgZGlzY3Vzc2lvbiBh dA0KICAgIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8y NTg3Nj4NCg0KICBUaGVzZSBjaGFuZ2VzIHdlcmUgYXV0b21hdGVkIHVzaW5nIGBvcGFtIGFkbWlu IG1pZ3JhdGUtZXh0cmFmaWxlcycgYW5kDQogIGBvcGFtIGFkbWluIGFkZC1oYXNoZXMnICh1c2lu ZyB0aGUgYnJhbmNoDQogIDxodHRwczovL2dpdGh1Yi5jb20vaGFubmVzbS9vcGFtL3RyZWUvbWln cmF0ZS1leHRyYS1maWxlcz4pLiBUaGVyZSBpcw0KICBhIHV0aWxpdHkgdG8gY2hlY2sgdGhhdCBl eGlzdGluZyBmaWxlcyBhbmQgbWQ1IGNoZWNrc3VtcyBhcmUgc3RpbGwNCiAgcHJlc2VudCBpbiB0 aGUgbmV3IG9wYW0tcmVwb3NpdG9yeQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL2hhbm5lc20vb3Bh bS1jaGVjay1jaGVja3N1bT4uDQoNCg0KSW1wYWN0IG9uIHVzZXJzIGFuZCBkZXZlbG9wZXJzDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgQSBsb3Qgb2YgcGFja2Fn ZXMgd2lsbCB3YW50IHRvIGJlIHJlY29tcGlsZWQgb24gYG9wYW0gdXBncmFkZScNCiAgICAoc2lu Y2UgY2hlY2tzdW0gY2hhbmdlZCwgZXh0cmEtZmlsZXMvZXh0cmEtc291cmNlIHdhcyBtb2RpZmll ZCkg4oCTDQogICAgc29ycnkgZm9yIHRoZSBleHRlbnNpdmUgdXNlIG9mIENQVSB0aW1lDQogIOKA oiBJZiB5b3UgbmVlZCB0byBpbmNsdWRlIGEgcGF0Y2ggb3IgYW4gZXh0cmEgZmlsZSBmb3IgeW91 ciBvcGFtDQogICAgcGFja2FnZSwgeW91IHdpbGwgbmVlZCB0byBob3N0IGl0IGVsc2V3aGVyZS4g WW91IGNhbiBob3N0IGl0IHVzaW5nIGENCiAgICBnaXN0ICg8aHR0cHM6Ly9naXN0LmdpdGh1Yi5j b20+KSwgb3Igb24geW91ciBzZXJ2ZXIuIEFsbCB0aGUNCiAgICBgZXh0cmEtc291cmNlJyB3aWxs IGJlIGNhY2hlZCBieSBgb3BhbS5vY2FtbC5vcmcnLg0KDQoNClRoZSByZWFzb25pbmcgZm9yIHRo aXMgY2hhbmdlDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBcGFydCBmcm9t IG1ha2luZyB0aGUgbWVudGFsIG1vZGVsIG9mICJob3cgZG9lcyBvcGFtLXJlcG9zaXRvcnkgd29y ayINCiAgZWFzaWVyIChzaW5jZSB0aGVyZSdzIG5vIG1vcmUgYW55IGBmaWxlcycgc3ViZGlyZWN0 b3J5IHdoaWNoIGluY2x1ZGVzDQogIGZpbGVzIHRoYXQgYXJlIGFkZGVkIGR1cmluZyB0aGUgYnVp bGQpLCBpdCBhbHNvIG1ha2VzIHRoZSBhcHByb2FjaCB0bw0KICBjcnlwdG9ncmFwaGljYWxseSBz aWduIHRoZSByZXBvc2l0b3J5IG11Y2ggc21vb3RoZXIgKHNpbmNlIHdlIGNhbiBub3cNCiAgcmVs eSBvbiBub24td2VhayBoYXNoIGFsZ29yaXRobXMgYW5kIGRvbid0IG5lZWQgdG8gY29tcHV0ZSBt b3JlDQogIGhhc2hlcywgYW5kIG5vdCBuZWVkIHRvIGFkZCBmdXJ0aGVyIGhhc2hlcyB0byB0aGUg cmVwb3NpdG9yeSkuDQoNCiAgV2UgbmVlZGVkIHRvIGdldCBib3RoICh3ZWFrIGhhc2hlcyBBTkQg cmVtb3ZpbmcgZXh0cmEtZmlsZXMpIHRocm91Z2gNCiAgYXQgc29tZSBwb2ludCwgaXQgaGFzIGJl ZW4gZG9uZSB0b2RheS4NCg0KDQpDYW1sa2l0IOKAkyBtYWNPUy9pT1MvR05Vc3RlcCB0b29sa2l0 IGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY2FtbGtpdC1tYWNvcy1pb3MtZ251c3RlcC10b29s a2l0LWZvci1vY2FtbC8xNDcyMi8xPg0KDQoNCmJvcmlzZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0 byBhbm5vdW5jZSB0aGUgYWxwaGEgcmVsZWFzZSBvZiBbQ2FtbGtpdF0uICBDYW1sa2l0DQogIHBy b3ZpZGVzIE9DYW1sIGJpbmRpbmdzIHRvIGEgY29sbGVjdGlvbiBvZiBDb2NvYSBmcmFtZXdvcmtz IG9uIG1hY09TLA0KICBpT1MsIGFuZCBHTlVzdGVwLiBDdXJyZW50bHkgYXZhaWxhYmxlIGFyZSBG b3VuZGF0aW9uLCBBcHBLaXQsIFVJS2l0LA0KICBXZWJLaXQsIENvcmVJbWFnZSwgUGhvdG9zLCBh bmQgVmlzaW9uLg0KDQogIFRoZSBwYWNrYWdlIGBjYW1sa2l0JyBmb3IgbWFjT1MvR05Vc3RlcCBk ZXZlbG9wbWVudCBpcyBhdmFpbGFibGUgZnJvbQ0KICBPUEFNLiBUaGUga2V5IGxpYnJhcmllcyB0 byBhZGQgdG8geW91ciBkdW5lIGZpbGUgYXJlDQogIGBjYW1sa2l0LWJhc2UuZm91bmRhdGlvbicg YW5kIGBjYW1sa2l0LWd1aS5hcHBraXQnLg0KDQogIGlPUyBkZXZlbG9wbWVudCByZXF1aXJlcyBh IFtjcm9zcy10b29sY2hhaW5dLiBUaGUgcGFja2FnZSBpcyBuYW1lZA0KICBgY2FtbGtpdC1pb3Mn LiBVSUtpdCBpcyBpbiB0aGUgbGlicmFyeSBgY2FtbGtpdC1ndWkudWlraXQnLg0KDQogIE90aGVy IHVzZWZ1bCByZXNvdXJjZXM6DQogIOKAoiBbYSBzdGFydGVyIHByb2plY3QgdGVtcGxhdGUgZm9y IGlPU10NCiAg4oCiIFthIGZldyBleGFtcGxlIHBvcmdyYW1zXQ0KDQogIE1vcmUgaW5mb3JtYXRp b24gaXMgYXZhaWxhYmxlIG9uIHRoZSBbcHJvamVjdCdzIGdpdGh1YiBwYWdlXS4gRmVlZGJhY2sN CiAgYW5kIGNvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUuIEkgaG9wZSB3ZSBjYW4gbWFrZSBPQ2Ft bCB2aWFibGUgZm9yIEdVSQ0KICBkZXZlbG9wbWVudCBhbmQgb24gbW9iaWxlLiBIYXBweSBoYWNr aW5nIQ0KDQoNCltDYW1sa2l0XSA8aHR0cHM6Ly9naXRodWIuY29tL2Rib3Jpcy9jYW1sa2l0Pg0K DQpbY3Jvc3MtdG9vbGNoYWluXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWNyb3NzL29wYW0t Y3Jvc3MtaW9zPg0KDQpbYSBzdGFydGVyIHByb2plY3QgdGVtcGxhdGUgZm9yIGlPU10NCjxodHRw czovL2dpdGh1Yi5jb20vZGJvcmlzL2NhbWxraXQtc3RhcnRlci1ub3N0b3J5Ym9hcmQ+DQoNClth IGZldyBleGFtcGxlIHBvcmdyYW1zXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rib3Jpcy9jYW1sa2l0 LWV4YW1wbGVzLz4NCg0KW3Byb2plY3QncyBnaXRodWIgcGFnZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9kYm9yaXMvY2FtbGtpdD4NCg0KDQpwb3NpdGlvbiBmb3IgTW9vbkJpdCBhZHZvY2F0ZQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9qb2ItcGFydC10aW1lLXBvc2l0aW9uLWZvci1tb29uYml0LWFkdm9j YXRlLzE0NzI2LzE+DQoNCg0KSG9uZ2JvIFpoYW5nIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg TW9vbkJpdCBpcyBNTCBsYW5ndWFnZSBpbnNwaXJlZCBieSBSdXN0LCBHbyBhbmQgT0NhbWwsIGl0 IHdhcw0KICBhbm5vdW5jZWQgd2l0aCBhIFtXYXNtIGJhY2tlbmRdLCBhbmQgcmVjZW50bHkgd2Ug YWRkZWQgYSBbSmF2YVNjcmlwdA0KICBiYWNrZW5kXSwgd2UgcGxhbiB0byBzaGlwIGEgbmF0aXZl IGJhY2tlbmQgdGhpcyB5ZWFyLg0KDQogIEl0IGlzIHNpbWlsYXIgdG8gT0NhbWwsIHRoZSBtYWlu IGRpZmZlcmVuY2UgaXMgdGhhdCB3ZSBoYXZlIHRyYWl0cywNCiAgemVyby1jb3N0IGdlbmVyaWNz IGFuZCBtb2Rlcm4gdG9vbGluZyBzdXBwb3J0LiBZb3UgYXJlIHdlbGNvbWUgdG8gRE0NCiAgZm9y IG1vcmUgZGV0YWlscy4NCg0KDQpbV2FzbSBiYWNrZW5kXSA8aHR0cHM6Ly93d3cubW9vbmJpdGxh bmcuY29tL2Jsb2cvZmlyc3QtYW5ub3VuY2U+DQoNCltKYXZhU2NyaXB0IGJhY2tlbmRdIDxodHRw czovL3d3dy5tb29uYml0bGFuZy5jb20vYmxvZy9qcy1zdXBwb3J0Pg0KDQoNCldoeSBpcyB0aGVy ZSBubyB0cmFkaXRpb24gb2YgQ0xJIGFuZCBUVUkgYXBwcz8NCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2h5LWlz LXRoZXJlLW5vLXRyYWRpdGlvbi1vZi1jbGktYW5kLXR1aS1hcHBzLzE0NjI4LzE3Pg0KDQoNCkRl ZXAgaW4gdGhpcyB0aHJlYWQsIEphenogYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIG9uY2UgY3JlYXRlZCBhIGNvbW1hbmQt bGluZSBib29rbWFya2luZyB0b29sIGNhbGxlZCBbRmF2ZW1hcmtzXSBpbg0KICBPQ2FtbCB1c2lu ZyBKYW5lc3RyZWV0J3MgQ29yZSBDb21tYW5kLg0KDQoNCltGYXZlbWFya3NdIDxodHRwczovL2dp dGh1Yi5jb20vbnlpbnlpdGhhbm4vZmF2ZW1hcmtzPg0KDQoNClBweGxpYiBkZXYgbWVldGluZ3MN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcHB4bGliLWRldi1t ZWV0aW5ncy8xMjQ0MS8yMz4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBQYXRyaWNrIEZl cnJpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBb bWVldGluZyBub3RlcyBhcmUgbm93IGF2YWlsYWJsZSBmcm9tIHRoZSBsYXN0IG1lZXRpbmddLg0K DQogIFRoYW5rcyB0byBldmVyeW9uZSB3aG8gYXR0ZW5kZWQgdGhlIG1lZXRpbmcuIFRoZSBuZXh0 IG1lZXRpbmcgaXMgc2V0DQogIGZvciBbZGF0ZT0yMDI0LTA2LTE4IHRpbWU9MTc6MDA6MDAgdGlt ZXpvbmU9IkV1cm9wZS9Mb25kb24iXSwgaWYgdGhhdA0KICBjaGFuZ2VzIHdlJ2xsIHBvc3QgdG8g dGhpcyB0aHJlYWQuIEhvcGUgdG8gc2VlIHlvdSB0aGVyZSENCg0KDQpbbWVldGluZyBub3RlcyBh cmUgbm93IGF2YWlsYWJsZSBmcm9tIHRoZSBsYXN0IG1lZXRpbmddDQo8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXBweC9wcHhsaWIvd2lraS9EZXYtTWVldGluZy0yMDI0LTA1LTI4Pg0KDQoNCllv anNvbiAyLjIuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4teW9qc29uLTItMi0wLzE0NzM3 LzE+DQoNCg0KTWFyZWsgS3ViaWNhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8gZmVs bG93IENhbWVsLXdyYW5nbGVycywNCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRo ZSByZWxlYXNlIG9mIFlvanNvbiAyLjIuMCB3aGljaCB5b3UgY2FuDQogIGZpbmQgaW4geW91ciBu ZWlnaGJvcmhvb2QgW29wYW0tcmVwb3NpdG9yeV0uDQoNCiAgVGhlIG1vc3QgaW1wb3J0YW50IGhp Z2hsaWdodHMgaW5jbHVkZToNCg0KICDigKIgW0pTT041XSBzdXBwb3J0LiBHZXR0aW5nIGFubm95 ZWQgYnkgZGFuZ2xpbmcgY29tbWFzIGJlaW5nIGEgcHJvYmxlbQ0KICAgIG9yIHRoZSBpbmFiaWxp dHkgdG8gdXNlIGNvbW1lbnRzPyBKU09ONSBpcyBiYXNpY2FsbHkgSlNPTiBidXQgd2l0aA0KICAg IHRoZSBvYmplY3Qgc3ludGF4IG9mIEVDTUFTY3JpcHQgNS4xIHdoaWNoIGFsbG93cyBzb21lIGFk ZGl0aW9uYWwNCiAgICBmZWF0dXJlcyBsaWtlIHVucXVvdGVkIGtleXMsIGRhbmdsaW5nIGNvbW1h cyBvciB3ZWxsLCBjb21tZW50cy4gVGhpcw0KICAgIGhhcyBiZWVuIGluIHRoZSB3b3JrcyBmb3Ig eWVhcnMgYnV0IGZpbmFsbHkgbWFkZSBpdCB0byB0aGUNCiAgICBmaW5pc2gtbGluZS4gVGhlIG5l dyBKU09ONSBwYXJzZXIgcmVxdWlyZXMgYHNlZGxleCcgYW5kIGF0IGxlYXN0DQogICAgT0NhbWwg NC4wOCwgdGh1cyBpdCBpcyBwYXJ0IG9mIHRoZSBbeW9qc29uLWZpdmVdIHBhY2thZ2UuIEl0cyB1 c2FnZQ0KICAgIG1pbWljcyB0aGUgYFlvanNvbicgcGFja2FnZTsgdGhlcmUgZXhpc3QgYm90aCBg QmFzaWMnIGFuZCBgU2FmZScNCiAgICB2YXJpYW50cyBhbmQgdGhlIEFTVCBtYXRjaGVzIHRoZSBK U09OIHZhcmlhbnRzLg0KICDigKIgTm8gQ1BQTyBkZXBlbmRlbmN5IGFueW1vcmUuIEdpdmVuIHRo ZSBsYXJnZSBhbW91bnQgb2YNCiAgICByZXZlcnNlLWRlcGVuZGVuY2llcyBvbiBZb2pzb24sIGVh Y2ggZGVwZW5kZW5jeSBvZiBZb2pzb24gaXMgZ29pbmcNCiAgICB0byBiZSBhIGRlcGVuZGVuY3kg b2YgYSBsb3Qgb2YgcGFja2FnZXMsIHRodXMga2VlcGluZyB0aGUgZGVwZW5kZW5jeQ0KICAgIGNv bmUgc21hbGwgbWFrZXMgZXZlcnl0aGluZyAoc2xpZ2h0bHkpIGZhc3Rlci4gQXMgc3VjaCwgaW5z dGVhZCBvZg0KICAgIHVzaW5nIENQUE8gYXMgYSBjb21waWxlLXRpbWUgZGVwZW5kZW5jeSB3ZSBu b3cgdXNlIFvCtUNQUE9dIGFzIGENCiAgICBsaWdodC13ZWlnaHQgYWx0ZXJuYXRpdmUuIMK1Q1BQ TyBpcyBtZWFudCBmb3IgZW1iZWRkaW5nIGFzIHBhcnQgb2YNCiAgICB0aGUgYnVpbGQgcHJvY2Vz cyBhbmQgc3VwcG9ydHMgYSB0aW55IHN1YnNldCBvZiB3aGF0IENQUE8gc3VwcG9ydHMNCiAgICBi dXQgd2l0aG91dCBhbiBleHRyYSBwYWNrYWdlLg0KDQogIEhhcHB5IGRlLSBhbmQgZW5jb2Rpbmch DQoNCg0KW29wYW0tcmVwb3NpdG9yeV0gPGh0dHBzOi8vb2NhbWwub3JnL3AveW9qc29uLzIuMi4w Pg0KDQpbSlNPTjVdIDxodHRwczovL2pzb241Lm9yZy8+DQoNClt5b2pzb24tZml2ZV0gPGh0dHBz Oi8vb2NhbWwub3JnL3AveW9qc29uLWZpdmUvMi4yLjA+DQoNClvCtUNQUE9dIDxodHRwczovL2dp dGh1Yi5jb20vTGVvbmlkYXMtZnJvbS1YSVYvbXVjcHBvPg0KDQoNCkdyYWNlIDAuMi4wIPCfkoUs IGZhbmN5IGRpYWdub3N0aWNzIGxpYnJhcnkgZm9yIGNvbXBpbGVycw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZ3JhY2UtMC0yLTAtZmFuY3ktZGlhZ25vc3Rp Y3MtbGlicmFyeS1mb3ItY29tcGlsZXJzLzE0NzQxLzE+DQoNCg0KIkFsaXN0YWlyIE8nQnJpZW4g YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gZXhjaXRlZCB0byBh bm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBbZ3JhY2UgMC4yLjBdLCBhbiBPQ2FtbCBsaWJyYXJ5DQog IGZvciBidWlsZGluZywgcmVwb3J0aW5nIGFuZCByZW5kZXJpbmcgYmVhdXRpZnVsIGNvbXBpbGVy IGRpYWdub3N0aWNzDQogIDpjYW1lbDogOnBhaW50YnJ1c2g6LiBOb3cgYXZhaWxhYmxlIG9uIFtv cGFtLXJlcG9zaXRvcnldLg0KDQogIFRoZSB0aHJlZSBtYWluIGZlYXR1cmVzIG9mIHRoaXMgcmVs ZWFzZSBpbmNsdWRlOg0KICDigKIgOmJvb2tzOiAqVVRGOCBzdXBwb3J0KjogU291cmNlIGZpbGVz IGNhbiBub3cgY29udGFpbiBVbmljb2RlDQogICAgY2hhcmFjdGVycywgaW5jbHVkaW5nIGVtb2pp cyDimqHvuI8g8J+MiCDwn5qALCB3aXRoIHByb3BlciByZW5kZXJpbmcgb2YNCiAgICBBU0NJSSBh cnQgZm9yIGVycm9ycy4NCg0KICDigKIgOjEyMzQ6ICpFcnJvciBDb2Rlcyo6IERpYWdub3N0aWNz IGNhbiBub3cgaW5jbHVkZSBzaG9ydCwgc2VhcmNoYWJsZQ0KICAgIGVycm9yIGNvZGVzLiBBbGxv d2luZyBjb21waWxlcnMgdG8gaW50ZWdyYXRlIGEgW1J1c3QtbGlrZSBlcnJvciBjb2RlDQogICAg aW5kZXhdLg0KDQogIOKAoiDwn6SPICpDb21wYWN0IEFOU0kgRXJyb3JzKjogYEdyYWNlX2Fuc2lf cmVuZGVyZXInIG5vdyBzdXBwb3J0cyBhDQogICAgYHBwX2NvbXBhY3RfZGlhZ25vc3RpYycgZm9y IGNvbmNpc2UgZXJyb3IgbWVzc2FnZXMsIGRpc3BsYXlpbmcgb25seQ0KICAgIHRoZSBmaWxlIGxv Y2F0aW9uIGFuZCB0aGUgZXJyb3IgbWVzc2FnZS4NCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291 cnNlLWNkbi5jb20vYnVzaW5lc3M3L3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvMy8zMWJhOTc1 ZDJjZjE3OTY2ZWI0NTMzYzFmNmJhNDQxNzMxNjg2ZDBkLnBuZz4NCg0KICBUYXAgaW50byB0aGUg cG93ZXIgb2YgR3JhY2UgZm9yIHlvdXIgZXJyb3IgcmVwb3J0aW5nISBIYXBweSBoYWNraW5nDQog IPCfkajigI3wn5K7DQoNCg0KW2dyYWNlIDAuMi4wXSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG55 b2IvZ3JhY2UvcmVsZWFzZXMvdGFnLzAuMi4wPg0KDQpbb3BhbS1yZXBvc2l0b3J5XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzI1OTU2Pg0KDQpbUnVzdC1s aWtlIGVycm9yIGNvZGUgaW5kZXhdDQo8aHR0cHM6Ly9kb2MucnVzdC1sYW5nLm9yZy9lcnJvcl9j b2Rlcy9lcnJvci1pbmRleC5odG1sPg0KDQpDSEFOR0VTOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAg4oCiIGZpeChyZW5kZXJlcik6IHJlbW92ZSB1bmNlc3NhcnkgdW5kZXJsaW5lcyB3 aGVuIHByaW50aW5nIGEgdW5pcXVlDQogICAgJ211bHRpLWxpbmUgYFRvcCcgbWFya2VyJyAoWyMz MV0pDQogIOKAoiBmaXgocmVuZGVyZXIpOiByZXBsYWNlIHVuaWNvZGUgY2hhcnMgd2l0aCBBU0NJ SSBpbiBgQ29uZmlnLmFzY2lpJw0KICAgIChbIzI3XSkNCiAg4oCiIGZlYXQocmVuZGVyZXIpOiBh ZGQgYE5PX0NPTE9SJyBhbmQgYFRFUk0nIHN1cHBvcnQgdG8gYENvbmZpZycgKFsjOF0pDQogIOKA oiBmZWF0KGNvcmUscmVuZGVyZXIpOiBhZGQgc3VwcG9ydCBmb3IgZXJyb3IgY29kZXMgKFsjMzBd KQ0KICDigKIgZmVhdChyZW5kZXJlcik6IGFkZCBzdXBwb3J0IGZvciBVVEY4IGVuY29kaW5nIChb IzI1XSkNCiAg4oCiIGZlYXQocmVuZGVyZXIpOiByZS1pbnRyb2R1Y2Ugc3VwcG9ydCBmb3IgY29t cGFjdCBkaWFnbm9zdGljDQogICAgcmVuZGVyaW5nIChbIzI4XSkNCiAg4oCiIHJlZmFjdG9yKHJl bmRlcmVyKSE6IG1vdmUgYGdyYWNlLnJlbmRlcmVyJyBsaWJyYXJ5IHRvDQogICAgYGdyYWNlLmFu c2lfcmVuZGVyZXInIChbIzI5XSkNCg0KDQpbIzMxXSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG55 b2IvZ3JhY2UvcHVsbC8zMT4NCg0KWyMyN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dy YWNlL3B1bGwvMjc+DQoNClsjOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dyYWNlL3B1 bGwvOD4NCg0KWyMzMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvMzA+ DQoNClsjMjVdIDxodHRwczovL2dpdGh1Yi5jb20vam9obnlvYi9ncmFjZS9wdWxsLzI1Pg0KDQpb IzI4XSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG55b2IvZ3JhY2UvcHVsbC8yOD4NCg0KWyMyOV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvMjk+DQoNCg0KQlJFQUtJTkcg Q0hBTkdFDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICDigKIgYEdyYWNlX3JlbmRlcmluZycgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGBHcmFjZV9hbnNp X3JlbmRlcmVyJw0KICAgIGluc3RlYWQuDQoNCg0KRmlyc3QgcmVsZWFzZSBvZiBTbGlwc2hvdyBv biBvcGFtIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVs ZWFzZS1vZi1zbGlwc2hvdy1vbi1vcGFtLzE0NzQzLzE+DQoNCg0KUGF1bC1FbGxpb3QgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJdCBpcyBteSBwbGVhc3VyZSB0byBhbm5vdW5jZSB0aGUgZmlyc3Qg W3JlbGVhc2VdIG9mIFtzbGlwc2hvd10gb24NCiAgYG9wYW0nLg0KDQogIFNsaXBzaG93IGlzIGEg cHJlc2VudGF0aW9uIHRvb2wgdG8gY3JlYXRlIHByZXNlbnRhdGlvbiB0aGF0IGFyZSBub3QNCiAg YmFzZWQgb24gc2xpZGVzLCBidXQgb24gbW9yZSBjb250aW51b3VzIHRyYW5zaXRpb25zLCBzaW1p bGFyIHRvDQogIHNjcm9sbGluZy4NCg0KICA8aHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQu Y29tL3BhbmdsZXNkL3NsaXBzaG93L21hc3Rlci9zbGlwX3Njcm9sbC5naWY+DQoNCiAgWW91IGNh biBmaW5kIG1vcmUgaW5mb3JtYXRpb24gYW5kIGV4YW1wbGVzIG9uIHRoZSBbcHJvamVjdCByZXBv XSBhbmQNCiAgb24gdGhlIFtkb2N1bWVudGF0aW9uXS4NCg0KICBIb3cgaXMgdGhhdCByZWxhdGVk IHRvIHRoZSBPQ2FtbCBjb21tdW5pdHk/IFdoaWxlIHRoZQ0KICAicnVudGltZSIvImVuZ2luZSIg aXMgc3RpbGwgd3JpdHRlbiBpbiBqYXZhc2NyaXB0IChJIGRpZCBub3Qga25vdw0KICBPQ2FtbCBi YWNrIHRoZW4sIGJ1dCB0aGVyZSBpcyBhIFtwbGFuXSB0byByZXdyaXRlIGl0KSwgdGhlIGNvbXBp bGVyIGlzDQogIHdyaXR0ZW4gaW4gT0NhbWwhIEFuZCBJIGFtIHJlYWxseSBncmF0ZWZ1bCBmb3Ig dGhlIG1hbnkgYXV0aG9ycyBvZg0KICBvcGVuIHNvdXJjZSBsaWJyYXJpZXMsIG9mIHZlcnkgaGln aCBxdWFsaXR5LCB0aGF0IEkgZGVwZW5kIG9uIGFuZA0KICBjb3VsZCBkbyBub3RoaW5nIHdpdGhv dXQgdGhlbSA6KSAqKlRoYW5rcyBhIGxvdCoqIHRvIGFsbCBPQ2FtbCBsaWJyYXJ5DQogIGFuZCB0 b29sIGF1dGhvcnMhDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gdXBkYXRlDQog IOKUgiAkIG9wYW0gaW5zdGFsbCBzbGlwc2hvdw0KICDilIIgIyBjcmVhdGUgYW5kIG9wZW4gfnNv dXJjZS5tZH4gaW4geW91ciBlZGl0b3INCiAg4pSCICQgc2xpcHNob3cgLS1zZXJ2ZSBzb3VyY2Uu bWQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSG9wZSBpdCBjYW4gYmUgdXNlZnVsIDpEDQoNCg0K W3JlbGVhc2VdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxs LzI1OTQ4I2lzc3VlY29tbWVudC0yMTQ2OTA2NzY2Pg0KDQpbc2xpcHNob3ddIDxodHRwczovL2dp dGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3c+DQoNCltwcm9qZWN0IHJlcG9dIDxodHRwczovL2dp dGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3c+DQoNCltkb2N1bWVudGF0aW9uXSA8aHR0cHM6Ly9z bGlwc2hvdy5yZWFkdGhlZG9jcy5pbz4NCg0KW3BsYW5dIDxodHRwczovL2dpdGh1Yi5jb20vcGFu Z2xlc2Qvc2xpcHNob3cvaXNzdWVzLzMyPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2Ft bC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9D YW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCi IFtFZmZlY3RpdmUgTUwgVGhyb3VnaCBNZXJsaW4ncyBEZXN0cnVjdCBDb21tYW5kXQ0KDQoNClt0 aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0VmZmVjdGl2 ZSBNTCBUaHJvdWdoIE1lcmxpbidzIERlc3RydWN0IENvbW1hbmRdDQo8aHR0cHM6Ly90YXJpZGVz LmNvbS9ibG9nLzIwMjQtMDUtMjktZWZmZWN0aXZlLW1sLXRocm91Z2gtbWVybGluLXMtZGVzdHJ1 Y3QtY29tbWFuZD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5 b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQg SSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZl XSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28g d2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUN CiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3Ro ZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3du LnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9j YW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 28 to June 04, 20= 24.

    v0.17 release of Jane Street packages

    Diana Kalinichenko announced

    v0.17 release of Jane Street packages

    Dear OCaml developers,

    We are pleased to announce the v0.17 release of Jane Street packages!

    This release comes with 15 new packages and a multitude of new features and= fixes.

    Switch to OCaml 5.1

    We are switching Base and all our packages (except sexplib0) t= o OCaml 5.1 and above. We are also switching sexplib0 to 4.14 = to take advantage of the Tail Recursion Modulo Cons optimization in the com= piler.

    Core on OCaml 5.2

    Due to some changes to Stdlib.Gc in OCaml 5.2, core.v0.1= 7.0 fails to compile with that language version. We will release a f= ix that allows using Core with OCaml 5.2 soon.

    Torch and VCaml

    Due to some issues with their builds, torch.v0.17.0 and = vcaml.v0.17.0 were omitted from the main v0.17 release. We will soon= submit those packages to opam.

    New packages

    async_log =E2=80=93= a logging library for Async code, moved from async_unix

    capitalization= =E2=80=93 a library for case conventions and renaming identifiers

    codicons =E2=80=93 i= cons from VS Code for use with Bonsai

    gel =E2=80=93 a library t= o mark non-record fields global for use with our compiler extensions

    hardcam= l_event_driven_sim =E2=80=93 a simulator library for Hardcaml

    ocaml_int= rinsics_kernel =E2=80=93 a split from ocaml_intrinsics com= patible with javascript

    ocaml_ope= napi_generator =E2=80=93 an OpenAPI 3 to OCaml client generator

    ppx_diff =E2=80=93 a= ppx for generation of diffs and update functions for OCaml types.

    ppx_embed_file= =E2=80=93 a ppx that allows embedding files directly into executables/libr= aries as strings or bytes

    ppxlib_jane =E2= =80=93 utilities for working with Jane Street AST constructs

    ppx_quick_test= =E2=80=93 a ppx providing an ergonomic wrapper for quickcheck tests, simil= ar to ppx_inline_test

    ppx_string_conv =E2=80=93 deriving to_string~and ~of_string

    uopt =E2=80=93 unsafe op= tion type that does not allocate, moved from core_kernel

    versi= oned_polling_state_rpc =E2=80=93 helper functions for versioned P= olling_state_rpc.t

    virtual_dom_= toplayer =E2=80=93 bindings for the floating_positioning j= avascript library

    jsonschema2atd, Generate an ATD file from a JSON Schema / Open= API document

    Louis Roch=C3=A9 announced

    Ahrefs has released jsonschema2atd, a cli tool to convert an OpenAPI or Jso= n Schema specification into an atd file.

    Quite a lot of api out there are now publishing some kind of spec for their= expected input our output. It's often done through a a JSON Schema or Open= API document. The goal of this tool is to save time for large api by doing = a mechanical translation to an atd file instead of writing all the types by= hand.

    Unfortunately the world is kind of a mess. Most of the specs we have seen a= re not following a specific version of openapi/jsonschema but contain a bit= of everything. jsonschema2atd does its best to do the right thing, but the= re are probably cases that aren't covered.

    The generated code might also not be optimal. It often deserves some hand c= leanup and a bit of renaming. Hopefully it still gives a good head start.

    Thanks to Egor Chemokhonenko for t= his work.

    The code is available at https://github.com/ahrefs/jsonschema2atd

    And there is a package that is published on opam https://ocaml.org/p/jsonschema2atd/latest

    opam-repository policy change: checksums (no md5) and no extra= -files

    Hannes Mehnert announced

    Dear everyone,

    the opam-repository policy just changed to not accept md5-only checksums= , and also to avoid extra-files in packages (use extra-source in= stead).

    NOTE:

    If you encounter issues during opam update, please make sure t= o have opam 2.1.6 installed, and gpatch (especial= ly on BSD systems and macOS). This may break silently, if you encounter iss= ues, please rm -rf ~/.opam/repo/default && opam update defaul= t See further notes in https://github.com/ocaml/opam-repository/issues/25961<= /a>

    What has been achieved?

    These changes were automated using opam admin migrate-extrafiles and opam admin add-hashes (using the branch https://github.com/ha= nnesm/opam/tree/migrate-extra-files). There is a utility to check that = existing files and md5 checksums are still present in the new opam-reposito= ry https://githu= b.com/hannesm/opam-check-checksum.

    Impact on users and developers

    • A lot of packages will want to be recompiled on opam upgrade (since checksum changed, extra-files/extra-source was modified) –= sorry for the extensive use of CPU time
    • If you need to include a patch or an extra file for your opam package, = you will need to host it elsewhere. You can host it using a gist (https://gist.github.com), or on your serve= r. All the extra-source will be cached by opam.ocaml.org= .

    The reasoning for this change

    Apart from making the mental model of "how does opam-repository work" easie= r (since there's no more any files subdirectory which includes= files that are added during the build), it also makes the approach to cryp= tographically sign the repository much smoother (since we can now rely on n= on-weak hash algorithms and don't need to compute more hashes, and not need= to add further hashes to the repository).

    We needed to get both (weak hashes AND removing extra-files) through at som= e point, it has been done today.

    Camlkit – macOS/iOS/GNUstep toolkit for OCaml

    borisd announced

    I am pleased to announce the alpha release of Camlkit.=20 Camlkit provides OCaml bindings to a collection of Cocoa frameworks on macO= S, iOS, and GNUstep. Currently available are Foundation, AppKit, UIKit, Web= Kit, CoreImage, Photos, and Vision.

    The package camlkit for macOS/GNUstep development is available= from OPAM. The key libraries to add to your dune file are camlkit-ba= se.foundation and camlkit-gui.appkit.

    iOS development requires a cross-toolchain. The package is named camlkit-ios. UIKit is in the library camlkit-gui.uikit.

    Other useful resources:

    More information is available on the project's github page. Feedback and contributions are welcome. = I hope we can make OCaml viable for GUI development and on mobile. Happy ha= cking!

    position for MoonBit advocate

    Hongbo Zhang announced

    MoonBit is ML language inspired by Rust, Go and OCaml, it was announced wit= h a Wasm backen= d, and recently we added a JavaScript backend, we plan to ship a native backend this y= ear.

    It is similar to OCaml, the main difference is that we have traits, zero-co= st generics and modern tooling support. You are welcome to DM for more deta= ils.

    Why is there no tradition of CLI and TUI apps?

    Deep in this thread, Jazz announced

    I once created a command-line bookmarking tool called Favemarks in OCaml using Janestreet's C= ore Command.

    Ppxlib dev meetings

    Continuing this thread, Patrick Ferris announced

    The meeting notes are now available from the last meeting.

    Thanks to everyone who attended the meeting. The next meeting is set for [d= ate=3D2024-06-18 time=3D17:00:00 timezone=3D"Europe/London"], if that chang= es we'll post to this thread. Hope to see you there!

    Yojson 2.2.0

    Marek Kubica announced

    Hello fellow Camel-wranglers,

    It's my pleasure to announce the release of Yojson 2.2.0 which you can find= in your neighborhood opam-rep= ository.

    The most important highlights include:

    • JSON5 support. Getting annoyed by da= ngling commas being a problem or the inability to use comments? JSON5 is ba= sically JSON but with the object syntax of ECMAScript 5.1 which allows some= additional features like unquoted keys, dangling commas or well, comments.= This has been in the works for years but finally made it to the finish-lin= e. The new JSON5 parser requires sedlex and at least OCaml 4.0= 8, thus it is part of the yojson-five package. Its usage mimics the Yojson package;= there exist both Basic and Safe variants and the= AST matches the JSON variants.
    • No CPPO dependency anymore. Given the large amount of reverse-dependenc= ies on Yojson, each dependency of Yojson is going to be a dependency of a l= ot of packages, thus keeping the dependency cone small makes everything (sl= ightly) faster. As such, instead of using CPPO as a compile-time dependency= we now use =C2=B5C= PPO as a light-weight alternative. =C2=B5CPPO is meant for embedding as= part of the build process and supports a tiny subset of what CPPO supports= but without an extra package.

    Happy de- and encoding!

    Grace 0.2.0 =F0=9F=92=85, fancy diagnostics library for compil= ers

    "Alistair O'Brien announced

    I'm excited to announce the release of grace 0.2.0, an OCaml library for building,= reporting and rendering beautiful compiler diagnostics :camel: :paintbrush= :. Now available on opam-repository.

    The three main features of this release include:

    • :books: UTF8 support: Source files can now contain Unicode chara= cters, including emojis =E2=9A=A1=EF=B8=8F =F0=9F=8C=88 =F0=9F=9A=80, with = proper rendering of ASCII art for errors.
    • :1234: Error Codes: Diagnostics can now include short, searchabl= e error codes. Allowing compilers to integrate a Rust-like error code index.
    • =F0=9F=A4=8F Compact ANSI Errors: Grace_ansi_renderer now supports a pp_compact_diagnostic for concise error mess= ages, displaying only the file location and the error message.

    3D"31ba975d2cf=

    Tap into the power of Grace for your error reporting! Happy hacking =F0=9F= =91=A8=E2=80=8D=F0=9F=92=BB

    CHANGES:

    • fix(renderer): remove uncessary underlines when printing a unique 'mult= i-line Top marker' (#31)
    • fix(renderer): replace unicode chars with ASCII in Config.ascii (#27)
    • feat(renderer): add NO_COLOR and TERM support= to Config (#8)
    • feat(core,renderer): add support for error codes (#30)
    • feat(renderer): add support for UTF8 encoding (#25)
    • feat(renderer): re-introduce support for compact diagnostic rendering (= #28)
    • refactor(renderer)!: move grace.renderer library to = grace.ansi_renderer (#29)

    BREAKING CHANGE

    • Grace_rendering has been removed. Use Grace_ansi_ren= derer instead.

    First release of Slipshow on opam!

    Paul-Elliot announced

    It is my pleasure to announce the first release of slipshow on opam.

    Slipshow is a presentation tool to create presentation that are not based o= n slides, but on more continuous transitions, similar to scrolling.

    3D"slip_scroll.gif"

    You can find more information and examples on the project repo and on the documentation.

    How is that related to the OCaml community? While the "runtime"/"engine" is= still written in javascript (I did not know OCaml back then, but there is = a plan to re= write it), the compiler is written in OCaml! And I am really grateful for t= he many authors of open source libraries, of very high quality, that I depe= nd on and could do nothing without them :) Thanks a lot to al= l OCaml library and tool authors!

    $ opam update
    $ opam install slipshow
    # create and open ~source.md~ in your editor
    $ slipshow --serve source.md
    

    Hope it can be useful :D

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=YIgb8gfL; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=0ez70/tv; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id BFA94B80123 for ; Tue, 11 Jun 2024 16:05:10 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Y6oI5/C21YGBzUCML3v/gdIV1b18RfRcW+qJgHjFfmQ=; b=YIgb8gfLvRQtWKWjMDfSEShyf+QL3Wcz1FOTlht2PkwcK+2vrPhpXnsW r1uxeSRSCERMTikdV7VLHNxJEr3S/BO0ZYJVfB+yd9gK5v6DabqnM2FWj I4Mjeaqz1WOCtpdbbVuhK56i8es5QJPHvy9VBy97Tx+oD6gTfKuIHLEu8 M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,230,1712613600"; d="scan'208,217";a="170116268" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Jun 2024 17:05:08 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 63929E0CD0; Tue, 11 Jun 2024 17:05:08 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id F2881E0035 for ; Tue, 11 Jun 2024 17:05:05 +0200 (CEST) IronPort-SDR: 66686786_OqxW0kD+6qEKwECcnIPYSC6+y2ZJCaEJHHUO9jMIzvHj61a wjOoX/aMSwg4yTx80Ki2kcZoWrR6gajxz9wAh1g== X-IPAS-Result: =?us-ascii?q?A0HRAQDlZmhmkCIeaIFQCoJYgUFbKBkBYlozBwhIAwGEU?= =?us-ascii?q?oNPhS2IboEWkDGIQoIwgVYUgREDGBYjBBABAwENLgEOBAECBAEBAwEDgguCd?= =?us-ascii?q?AKIaAIfBgEEMAkOAQIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABA?= =?us-ascii?q?QEBAQEgHhAOJ4U7CDENgkouI2tjAgYDNwEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQERAgwBJVsaAgEIBAYTAQErAQEFBhgjAwkHBAEGAwIRATUDARMBEhQGA?= =?us-ascii?q?YJlAYJkAwQBDAaSd5s7en8zgQGCDAEBBnsNPgMCCQICAwEOCSUB2gSBSRoJg?= =?us-ascii?q?UiIDgkaASRIaQKEJQmENycPgVVEgRQBgihKB2+BQQFcIQsXAgEBGH8JCQEHC?= =?us-ascii?q?gIBBgIGDA8kCQmDHIJpgWiDIYEAJoFeAYVJQBcVD1qCASJBMoEbAiwBWgESg?= =?us-ascii?q?QgvFw2BfmkEBQYPJ4EBBWgQEBQCTRqBAVsPWoE1FEICDBWBN4E/aRYmCzEPA?= =?us-ascii?q?yoxEIIuhzmBSyIDJjMhEwFVExcLPgkWAhYDGxQEMA8JCyYqBjkCEgwGBgZZN?= =?us-ascii?q?AkEIwMIBANCAyBxEQMEGgQLB3eBPIFpBBNEA4E3hxuCVoM7ghmEGkuEboFrD?= =?us-ascii?q?GGID4FzgT6BZk+DBlGCFB1AAwttPTUUG6hwBDYCgnMBJQ4LLQIGDRgXHAEHA?= =?us-ascii?q?gQDCgcOBQEHDAgHBQICFwEIAg0XCgQECAEFHwcFBwMZEQgECQoEAw0FBw8BE?= =?us-ascii?q?woBCwIJAgcXDwOSLwsJBAwYKgIBco4qjT2UERxsNAeEFoFcBgyIfYEkiFiNF?= =?us-ascii?q?4QFgVaFN4Q2gT0ahmGDToxagS1kIphDIII0hktTClNICYFtaZUWKQMCAhwZh?= =?us-ascii?q?RmBZTo8MD8BARkBAgwHMxowQw0QAYJJCRYwHA9Yi1aDBRwBAgWCRIE+gTBxe?= =?us-ascii?q?jvEakE1AgEBBwIuAgcBCgEBAwmFRR0BAWmCIQIDIwcFgUgBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 9VsD7UD6Jy5FX1s IronPort-HdrOrdr: A9a23:Vo4dhaPXBWa0xMBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: 9a23:OAJTR2Ga6VdTrBQYqmJJ8hcMEJwlbkH441L6OG+ZFUdybueKHAo= X-Talos-MUID: 9a23:8/w2zgiEULe4esKUzAvstMMpbOBZuZmLUGU2l9Y96pLeGS5OFheHk2Hi X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.08,230,1712613600"; d="scan'208,217";a="170116161" X-MGA-submission: =?us-ascii?q?MDHgq0LwehOabYMKCiZaBLVWuYpln4QaIsBF0V?= =?us-ascii?q?H7n7HTtn8nWI4uFY6ed82oalQhJ6FKvqdhkzv57uDCncy9/UU4Ucp1/V?= =?us-ascii?q?I25ePFBTa6iIsZ2TN2+OOSKTzUiguxs7X2Pqju3qEievg74tR/j3XL15?= =?us-ascii?q?1j+2lskRb8GsJbyW0oE5gH9g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Jun 2024 17:04:38 +0200 Received: from TM.local (host-188.117.138.90.static.3s.pl [188.117.138.90]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3E56D564700; Tue, 11 Jun 2024 17:04:37 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1718118277; bh=bwa6BfOjYYn5y/++g0+s/bhIME11wIo5ZHrek+tbwu8=; h=From:To:Subject:Date:Message-ID; b=0ez70/tvGxuv6tpZK5HSw3bYq6AiWEBoZfQakiMxduV+gFSLguIRwrIPyzsati1Zn vhHgM2MQQ6/Q8SMLSNP80jlZOEjXy6nJN90xSYyd+6uutMHe7M7M4lHtiJJ5RQScMV HIp7d6Zz2F4DRDEvt9vYH7VXqsfUizfqgjum5g3I= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 11 Jun 2024 17:04:36 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 11 17:04:38 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.390599, queueID=E118D564701 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19144 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 04 to 11, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Providing Opam system dependancies with Nix ppx_deriving.6.0.2 and ppx_deriving_yojson.3.8.0 Effective ML Through Merlin's Destruct Command OCaml Windows Working Group Flambda2 Ep. 2: Loopifying Tail-Recursive Functions, by OCamlPro OCaml Platform Newsletter: March-May 2024 OCaml.org Newsletter: May 2024 OCaml Windows Working Group Registration for Fun OCaml 2024 Opens Shortly opam 2.2.0~beta3 Other OCaml News Old CWN Providing Opam system dependancies with Nix =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Ryan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've opened a [PR] with input from @dra27 and @avsm adding support for Nix depexts (system dependencies) to Opam. Opam supports system dependencies for other platforms by invoking the system package manager, e.g. `apt-get install ...'. However Nix is a bit different, as in general installing a package to your system doesn't create the development environment required to use it; it will only add executables to your `$PATH'. To find, for example, objects files, outside of a Nix derivation you can use `nix-shell' and it's descendant `nix develop'. E.g.: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ nix-shell -p gmp =E2=94=82 $ echo $NIX_LDFLAGS =E2=94=82 -rpath /nix/store/20g5iw2r512gnfrdr4imp2y940v3vlif-shell/lib -= L/nix/store/rx6nkd40819acppajq29g1hxa4d9r35f-gmp-with-cxx-6.3.0/lib -L/nix/= store/rx6nkd40819acppajq29g1hxa4d9r35f-gmp-with-cxx-6.3.0/lib =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We support Nix depexts with Opam in a similar way. A Nix derivation is build with the desired packages as inputs, and the resulting environment is output as a file in the Opam switch in a format that Opam can parse. This `nix.env' file is a symlink into the Nix store, so acts as a garbage collection root =E2=80=93 packages won't be removed = from the store while this file exists. Opam outputs these environment variables on an invocation of `opam env'. This fixes issues such as . While the primary use case is on NixOS, this depext mechanism could be used on other platforms to provide a consistent experience including other Linux distributions, BSDs, (and possibly [even windows] in the future). Nixpkgs typically only packages one version of a package at a time, but I'm working on versioned depexts with previous version of Nixpkgs as outlined [here]. I'm keen to get people's opinions and perspective on this! [PR] [even windows] [here] ppx_deriving.6.0.2 and ppx_deriving_yojson.3.8.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce the release of ppx_deriving.6.0.2 and ppx_deriving_yojson.3.8.0, the first release of those packages in years! The main feature here is the port of [ppx_deriving]'s standard derivers (`[@@deriving show, make, ord, eq, ...]') and [ppx_deriving_yojson] to [ppxlib]'s `Deriving' api. There are no changes to how you'd use those derivers but many benefits: =E2=80=A2 Better performances and better integration with other ppx-es as= the code is now generated as part of ppxlib's driver main AST rewriting phase rather than in a separate, dedicated phase. =E2=80=A2 They can now be used with `[@@deriving_inline]' =E2=80=A2 None of them will break the location invariant required by merl= in anymore, fixing a long lasting bug and providing a much better user experience. You can find the full release notes for ppx_deriving [here] and for ppx_deriving_yojson [here]. I'd like to thank @sim642 for all their work on the ppxlib ports and their patience, and all our other contributors. I'd also like to thank the [OCaml Software Foundation] who has been funding my work on those releases. [ppx_deriving] [ppx_deriving_yojson] [ppxlib] [here] [here] [OCaml Software Foundation] Effective ML Through Merlin's Destruct Command =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm very pleased to present you [an article] with a collection of small illustrations and examples of how to use the `destruct' command to generate patterns in the presence of pattern matches. The command has been present in [Merlin] for several years (and accessible via [OCaml-LSP]) but, as the various changelogs relating to Merlin mention, we have spent some time polishing it and adapting it to the evolutions of OCaml, making it more stable (essentially in the presence of punning) and taking into account the changes made to the representation of functions (and their parameters). The aim of the article is to show how the `destruct' command works in a number of very concrete cases, and ends with an example (a little artificial for the purposes of the article and for teaching purposes) which shows how to use `destruct' interactively. =E2=80=A2 [ Effective ML Through Merlin's Destruct Command]: original art= icle, written in English, on the Tarides blog. =E2=80=A2 [ Effective ML, au travers de la commande 'destruct']: A French-language interpretation of the article, published on my blog. Can't wait to hear your feedback! Happy reading! [an article] [Merlin] [OCaml-LSP] [ Effective ML Through Merlin's Destruct Command] [ Effective ML, au travers de la commande 'destruct'] OCaml Windows Working Group =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Sudha Parimala announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m happy to share that we=E2=80=99re starting a working group fo= r OCaml Windows. This is part of a larger effort, [First-class Windows], to enhance the OCaml experience on Windows. Through this effort, we aim to coordinate our collective knowledge to identify high-priority items for First-class Windows. We've started a mailing list to exchange ideas and would greatly appreciate inputs. You can sign up at =E2=80=93 While the mailing list is intended to be the primary means of communication, we plan to do a sync meeting once a month, to start with. We plan to do a kick-off meeting early next week. Please fill in this poll if you're interested to join: . Happy camling :camel: [First-class Windows] Flambda2 Ep. 2: Loopifying Tail-Recursive Functions, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Greetings Cameleers, We would like to share with you our latest *Flambda2 Snippet*: [Flambda2 Ep. 2: Loopifying Tail-Recursive Functions]! Indeed, today's topic is what is called `Loopify', one of the many optimisation algorithms found in the `Flambda2' optimising compiler project. We believe `Loopify' is a nicely representative piece of software for our readers to grasp at the general design and philosophy for all optimisations available in `Flambda2'! Hopefully, you will do too! Be sure to check out the [`Flambda2 Ep.0'] article to get all the context for the project itself and the series of blog posts! In any case, we await your feedback below, and hope that you will enjoy reading this post, and all ensuing ones! Kind regards, The OCamlPro Team [Flambda2 Ep. 2: Loopifying Tail-Recursive Functions] [`Flambda2 Ep.0'] OCaml Platform Newsletter: March-May 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the eleventh edition of the OCaml Platform newsletter! In this March-May 2024 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in [previous editions]. To understand the direction we're headed, especially regarding development workflows and user experience improvements, check out our [roadmap]. *Highlights:* =E2=80=A2 Explorations on Dune package management have reached a Minimal-Viable-Product (MVP) stage: a version of Dune that can build non-trivial projects like [OCaml.org] and [Bonsai]. With a working MVP, the team is shifting their focus to putting Dune package management in the hands of the community. To that end, we have started the Dune Developer Preview Program, where we will test Dune package management with users and refine the user experience in preparation for a final release. =E2=80=A2 The opam team released a second beta of [opam 2.2], and with it, opened the [final PR] to add support for Windows OCaml to the opam-repository. Once the PR is merged, opam 2.2 will be usable with the upstream opam-repository on Windows, paving the way for a third beta very soon, and a Release Candidate next. =E2=80=A2 The odoc team has finalized the initial design for Odoc 3.0 and opened several [RFCs] to gather community input. We've implemented a new [Odoc driver] that follows the Odoc 3.0 design and have already started prototyping key parts of the design. =E2=80=A2 Merlin's project-wide references query is getting very close to release. The necessary [compiler PR] has been merged and included in OCaml 5.2, and the [Dune rules PR] has been merged and included in Dune 3.16. The next steps are to merge the [PR in Merlin] itself and the small patch in OCaml LSP. =E2=80=A2 The set of standard derivers shipped with `ppx_deriving.std' (i.e. `[@@deriving show, make, ord, eq, ...]') as well as `ppx_deriving_yojson' are now directly written against Ppxlib's API. That impacts developers in two ways. First, it allows you to enjoy reliable editor features in projects with those derivers (Ppxlib preserves Merlin's location invariants). Second, you can avoid a hard dependency on those derivers by using Ppxlib's `deriving_inline' feature on them. Thanks a lot to @sim642 for all your work and very kind patience, @NathanReb for reviewing and release managing, and everyone else involved! *Releases:* =E2=80=A2 [Ppxlib 0.32.1] =E2=80=A2 [Merlin 5.0] =E2=80=A2 [Dune 3.14.2] =E2=80=A2 [Dune 3.15.0] =E2=80=A2 [Dune 3.15.2] =E2=80=A2 [Dune 3.15.3] =E2=80=A2 [Odoc 2.4.2] =E2=80=A2 [opam 2.1.6] =E2=80=A2 [opam 2.2.0~beta2] =E2=80=A2 [ocamlformat 0.26.2] [previous editions] [roadmap] [OCaml.org] [Bonsai] [opam 2.2] [final PR] [RFCs] [Odoc driver] [compiler PR] [Dune rules PR] [PR in Merlin] [Ppxlib 0.32.1] [Merlin 5.0] [Dune 3.14.2] [Dune 3.15.0] [Dune 3.15.2] [Dune 3.15.3] [Odoc 2.4.2] [opam 2.1.6] [opam 2.2.0~beta2] [ocamlformat 0.26.2] *[Dune]* Exploring Package Management in Dune ([W4]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C *Contributed by:* @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @Alizter *Why:* Unify OCaml tooling under a single command line for all development workflows. This addresses one of the most important pain points [reported by the community]. *What:* Prototyping the integration of package management into Dune using opam as a library. We're introducing a `dune pkg lock' command to generate a lock file and enhancing `dune build' to handle dependencies in the lock file. More details in the [Dune RFC]. *Summary:* Over the past three months, significant progress has been made in adding Dune's support for package management. We are thrilled to report that our prototypes have reached a Minimal Viable Product (MVP) stage: an experimental version of Dune package management that can be used to build non-trivial projects, including OCaml.org and Bonsai, which we are using in our tests. There is still a long way to go, but with this milestone reached, we are now shifting our focus from prototyping to putting the feature in the hands of the community. We are moving to testing the new Dune feature with users, and in particular, now that we have a good understanding of the technical blockers and their workarounds, we will be focusing on validating and refining the developer experience (DX) of Dune package management in preparation for a first release. To that end, the Dune team has started a Dune Developer Preview Program. We're currently testing the Developer Preview of package management with selected beta testers, and once the biggest issues have been addressed, we'll be opening it to the broader community. *Activities:* =E2=80=A2 Continued addressing remaining issues with ocamlfind and zarith. =E2=80=A2 Added repro PRs for ocamlfind and zarith issues =E2=80=93 [ocaml/dune#10233], [ocaml/dune#10235]. =E2=80=A2 Iterated on a solution for relocatable ocamlfind =E2=80=93 [ocaml/ocamlfind#72]. =E2=80=A2 Removed `.mml' references in ocamlfind =E2=80=93 [ocaml/ocaml= find#75]. =E2=80=A2 Set OCAMLFIND_DESTDIR for install actions to fix ocamlfind installation issues =E2=80=93 [ocaml/dune#10267]. =E2=80=A2 Added a test reproducing error when locking when a pin stanza contains a relative path outside the workspace =E2=80=93 [ocaml/dune#10= 255]. =E2=80=A2 Fixed package creation issues with directories on different filesystems =E2=80=93 [ocaml/dune#10214]. =E2=80=A2 Opened PRs to address user errors, improve error messages, and enhance environment handling for pkg rules =E2=80=93 [ocaml/dune#10385], [ocaml/ocamlbuild#327], [ocaml/dune#10403], [ocaml/dune#10407], [ocaml/dune#10455]. =E2=80=A2 Addressed several issues related to `withenv' actions, `dune pkg lock', and unexpected behavior with variable updates =E2=80=93 [ocaml/dune#10404], [ocaml/dune#10408], [ocaml/dune#10417], [ocaml/dune#10440], [ocaml/opam#5925], [ocaml/opam#5926]. =E2=80=A2 Approved relocatable releases of ocamlfind and ocamlbuild =E2= =80=93 [ocaml-dune/opam-overlays#1], [ocaml-dune/opam-overlays#2]. =E2=80=A2 Cleaned up and sought feedback on the relocatable ocamlfind PR = =E2=80=93 [ocaml/ocamlfind#72]. =E2=80=A2 To work around the fact that the compiler is not relocatable (y= et!), we worked on adding support to Dune to manage compiler and developer tools, an experimental feature we call Dune Toolchain. =E2=80=93 [ocaml/dune#10470], [ocaml/dune#10474], [ocaml/dune#10475], [ocaml/dune#10476], [ocaml/dune#10477], [ocaml/dune#10478]. =E2=80=A2 Addressed various issues related to pkg lock, environment updat= es, and package management =E2=80=93 [ocaml/dune#10512], [ocaml/dune#10499], [ocaml/dune#10498], [ocaml/dune#10531], [ocaml/dune#10521], [ocaml/dune#10539], [ocaml/dune#10540], [ocaml/dune#10543], [ocaml/dune#10544], [ocaml/dune#10545], [ocaml/dune#10538], [ocaml/dune#10542], [ocaml/dune#10595], [ocaml/dune#10596], [ocaml/dune#10592], [ocaml/dune#10593]. =E2=80=A2 Merged PRs to use unpack code for rsync URLs and disable hg/dar= cs fetch code =E2=80=93 [ocaml/dune#10556], [ocaml/dune#10561]. [W4] [reported by the community] [Dune RFC] [ocaml/dune#10233] [ocaml/dune#10235] [ocaml/ocamlfind#72] [ocaml/ocamlfind#75] [ocaml/dune#10267] [ocaml/dune#10255] [ocaml/dune#10214] [ocaml/dune#10385] [ocaml/ocamlbuild#327] [ocaml/dune#10403] [ocaml/dune#10407] [ocaml/dune#10455] [ocaml/dune#10404] [ocaml/dune#10408] [ocaml/dune#10417] [ocaml/dune#10440] [ocaml/opam#5925] [ocaml/opam#5926] [ocaml-dune/opam-overlays#1] [ocaml-dune/opam-overlays#2] [ocaml/dune#10470] [ocaml/dune#10474] [ocaml/dune#10475] [ocaml/dune#10476] [ocaml/dune#10477] [ocaml/dune#10478] [ocaml/dune#10512] [ocaml/dune#10499] [ocaml/dune#10498] [ocaml/dune#10531] [ocaml/dune#10521] [ocaml/dune#10539] [ocaml/dune#10540] [ocaml/dune#10543] [ocaml/dune#10544] [ocaml/dune#10545] [ocaml/dune#10538] [ocaml/dune#10542] [ocaml/dune#10595] [ocaml/dune#10596] [ocaml/dune#10592] [ocaml/dune#10593] [ocaml/dune#10556] [ocaml/dune#10561] *[opam]* Native Support for Windows in opam 2.2 ([W5]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @rjbou (OCamlPro), @kit-ty-kate (Ahrefs), @dra27 (Tarides), @AltGr (OCamlPro) *Why:* Enhance OCaml's viability on Windows by integrating native opam and `opam-repository' support, fostering a larger community, and more Windows-friendly packages. *What:* Releasing opam 2.2 with native Windows support, making the official `opam-repository' usable on Windows platforms. *Summary:* The opam team is getting closer to a final release of opam 2.2 with support for Windows. In the past months, we have released a second beta of opam 2.2, addressing a number of issues reported by users on previous releases, including Windows issues. Excitingly, we also opened the [final PR] adding support for Windows OCaml to opam-repository. With the PR merged, the opam team is expecting to be able to move to a Release Candidate in June. Stay tuned for more exciting news and releases in the coming weeks and months! *Activities:* =E2=80=A2 Packaging the compiler in opam-repository =E2=80=A2 We cleared WIP items in the [windows-initial] branch, creatin= g the [mingw-w64-shims] repository for the C stub program and generation script needed for the mingw-w64-shims opam package. =E2=80=A2 Various fixes for msvs-detect were upstreamed and the opam packaging PR finalized =E2=80=93 [metastack/msvs-tools#17], [metastack/msvs-tools#18]. =E2=80=A2 Initial upstreaming PRs were opened for Visual Studio configuration =E2=80=93 [ocaml/opam-repository#25440], reorganization= of conf-zstd =E2=80=93 [ocaml/opam-repository#25441], and native Windows depexts =E2=80=93 [ocaml/opam-repository#25442]. =E2=80=A2 Fixed mccs package dependencies upstream =E2=80=93 [ocaml-opam/ocaml-mccs#52], [ocaml/opam-repository#25482]. =E2=80=A2 Upstreamed support for source-packaging of flexdll =E2=80=93 [ocaml/flexdll#135]. =E2=80=A2 Worked on packaging scripts for winpthreads for OCaml 5.3.0 = =E2=80=93 [ocaml/winpthreads#1]. =E2=80=A2 Further upstreaming PRs were opened for mingw-w64-shims =E2= =80=93 [ocaml/opam-repository#25454], and flexdll and winpthreads sources packages =E2=80=93 [ocaml/opam-repository#25512]. =E2=80=A2 Reviewed and tested changes related to the 4.14.2 release for= the sunset branch of opam-repository-mingw =E2=80=93 [ocaml-opam/opam-repository-mingw#20], [ocaml-opam/opam-repository-mingw#21]. =E2=80=A2 Updated the [windows-initial] branch to support MSYS2, includ= ing creating [msys2-opam] to complement [mingw-w64-shims]. =E2=80=A2 Upstreamed issues with the ocaml-variants.5.1.1+effect-syntax package =E2=80=93 [ocaml/opam-repository#25645]. =E2=80=A2 Investigated BER MetaOCaml, determining that 4.14.1+BER does = not work on Windows and disabled it in opam-repository =E2=80=93 [ocaml/opam-repository#25648]. =E2=80=A2 Worked further on the draft PR, addressing the issue of inval= id maintainer email addresses for packages =E2=80=93 [ocaml/opam-repository#25826]. =E2=80=A2 Opened the main PR for Windows compiler support =E2=80=93 [ocaml/opam-repository#25861], with a parallel draft PR for updating the compiler's opam file =E2=80=93 [ocaml/ocaml#13160]. =E2=80=A2 Backported [ocaml/ocaml#13100] to 5.1.x ocaml-variants =E2=80= =93 [ocaml/opam-repository#25828], awaiting opam 2.2.0~beta3 release. =E2=80=A2 Release opam 2.2 =E2=80=A2 Completed work on various patches and PRs, including fixes for accented characters in Dune =E2=80=93 [ocaml/opam#5861], [ocaml/opam#5871], [janestreet/spawn#58], [ocaml/opam#5862]. =E2=80=A2 Worked on performance improvements for Windows, including add= ing job statuses and a proof-of-concept for a spinner on slow-running build jobs =E2=80=93 [ocaml/opam#5883]. =E2=80=A2 Finalizing fix on Cygwin PATH handling for opam 2.2.0 beta2 = =E2=80=93 [ocaml/opam#5832]. =E2=80=A2 Mark the internal cygwin installation as recommended - [ocaml/opam#5903] =E2=80=A2 Hijack the `%{?val_if_true:val_if_false}%' syntax to support extending the variables of packages with + in their name - [ocaml/opam#5840] =E2=80=A2 Fixed issues with downloading URLs with invalid characters and opam's internal state =E2=80=93 [ocaml/opam#5921], [ocaml/opam#5922]. =E2=80=A2 Assembled test harnesses for `opam init' and addressed issues= with `opam lint' warnings =E2=80=93 [dra27/opam-testing], [ocaml/opam#5927= ], [ocaml/opam#5928]. =E2=80=A2 Fixed reversal of environment updates and minor issues in Git= Hub Actions =E2=80=93 [ocaml/opam#5935], [ocaml/opam#5938]. =E2=80=A2 [Released opam 2.2~beta2]. =E2=80=A2 Fixed issues related to environment variable handling =E2=80= =93 [ocaml/opam#5935]. =E2=80=A2 Finalized fixes for Git for Windows menu =E2=80=93 [ocaml/opa= m#5963]. =E2=80=A2 Minor fixes to `--cygwin-extra-packages' =E2=80=93 [ocaml/opa= m#5964]. =E2=80=A2 Refactored `opam init' for a more logical experience =E2=80=93 [ocaml/opam#5963]. =E2=80=A2 Updated lint warning 41 PR =E2=80=93 [ocaml/opam#5927]. =E2=80=A2 Responded to issues found by testers of Windows compiler pack= ages =E2=80=93 [ocaml/flexdll#138], [ocaml/flexdll#139]. =E2=80=A2 Completely reworked `opam init' to detect Cygwin and MSYS2 installations. =E2=80=A2 Fixed issues with the `?' operator and MSYS2's native curl implementation =E2=80=93 [ocaml/opam#5983], [ocaml/opam#5984]. [W5] [final PR] [windows-initial] [mingw-w64-shims] [metastack/msvs-tools#17] [metastack/msvs-tools#18] [ocaml/opam-repository#25440] [ocaml/opam-repository#25441] [ocaml/opam-repository#25442] [ocaml-opam/ocaml-mccs#52] [ocaml/opam-repository#25482] [ocaml/flexdll#135] [ocaml/winpthreads#1] [ocaml/opam-repository#25454] [ocaml/opam-repository#25512] [ocaml-opam/opam-repository-mingw#20] [ocaml-opam/opam-repository-mingw#21] [msys2-opam] [ocaml/opam-repository#25645] [ocaml/opam-repository#25648] [ocaml/opam-repository#25826] [ocaml/opam-repository#25861] [ocaml/ocaml#13160] [ocaml/ocaml#13100] [ocaml/opam-repository#25828] [ocaml/opam#5861] [ocaml/opam#5871] [janestreet/spawn#58] [ocaml/opam#5862] [ocaml/opam#5883] [ocaml/opam#5832] [ocaml/opam#5903] [ocaml/opam#5840] [ocaml/opam#5921] [ocaml/opam#5922] [dra27/opam-testing] [ocaml/opam#5927] [ocaml/opam#5928] [ocaml/opam#5935] [ocaml/opam#5938] [Released opam 2.2~beta2] [ocaml/opam#5963] [ocaml/opam#5964] [ocaml/flexdll#138] [ocaml/flexdll#139] [ocaml/opam#5983] [ocaml/opam#5984] *[=E2=80=8B`odoc'=E2=80=8B]* Odoc 3.0: Unify OCaml.org and Local Package Do= cumentation ([W25]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C *Contributed by:* @jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides), Luke Maurer (Jane Street) *Why:* Improving local documentation generation workflow will help package authors write better documentation for their packages, and consolidating the different `odoc' documentation generators will help make continuous improvements to `odoc' available to a larger audience. *What:* We will create conventions that drivers must follow to ensure that their output will be functional. Once established, we will update the Dune rules to follow these rules, access new `odoc' features (e.g., source rendering), and provide similar functionalities to docs.ocaml.org (a navigational sidebar, for instance). This will effectively make Dune usable to generate OCaml.org package documentation. *Summary:* The Odoc team has made significant progress on the upcoming Odoc 3.0. We held productive in-person meetings in Paris to discuss crucial design aspects such as the CLI, source code rendering, and references. These discussions led to the publications of RFCs for the various components of the design specification. We also started implementing a new Odoc driver that adheres to the new design for testing purposes, and began prototyping several of the new features. While discussions on the RFCs and specific features are still ongoing, we are very excited to have a solid set of design specifications under community review and to have begun implementing key parts of the new design. *Activities:* =E2=80=A2 Investigated package name/library name mismatches and module na= me clashes =E2=80=93 [jonludlam/2997e905a468bfa0e625bf98b24868e5], [jonludlam/0a5f1391ccbb2d3040318b154da8593a]. =E2=80=A2 Continued work on odoc 3.0 design, including meetings and discussions, culminating in the publication of the RFC =E2=80=93 [ocaml/odoc/discussions/1097]. =E2=80=A2 Worked on the navigation PR, added functionalities, fixed bugs,= and completed the rebase =E2=80=93 [ocaml/odoc#1088]. =E2=80=A2 Met in Paris to discuss the odoc 3.0 design, covering topics su= ch as CLI, rendering source code, and references. =E2=80=A2 Opened a PR with basic support for markdown in standalone pages= =E2=80=93 [ocaml/odoc#1110]. =E2=80=A2 Published the current proposal for assets as a discussion =E2= =80=93 [ocaml/odoc#1113]. =E2=80=A2 Continued discussions on Markdown rendering and asset reference= s - [ocaml/odoc#1110]. =E2=80=A2 Implemented a new driver for testing the odoc 3.0 implementatio= n =E2=80=93 [ocaml/odoc#1121], [ocaml/odoc#1128]. =E2=80=A2 Worked on implementing the =E2=80=93parent-id flag part of the = Odoc 3.0 spec =E2=80=93 [ocaml/odoc#1126]. =E2=80=A2 Worked on implementing the `-L' and `-P' flags [ocaml/odoc#1132] [W25] [jonludlam/2997e905a468bfa0e625bf98b24868e5] [jonludlam/0a5f1391ccbb2d3040318b154da8593a] [ocaml/odoc/discussions/1097] [ocaml/odoc#1088] [ocaml/odoc#1110] [ocaml/odoc#1113] [ocaml/odoc#1121] [ocaml/odoc#1128] [ocaml/odoc#1126] [ocaml/odoc#1132] *[Merlin]* Support for Project-Wide References in Merlin ([W19]) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @vds (Tarides), @Ekdohibs (OCamlPro), @Octachron (INRIA), @gasche (INRIA), @emillon (Tarides), @rgrinberg (Jane Street), @Julow (Tarides) *Why:* Enhance code navigation and refactoring for developers by providing project-wide reference editor features, aligning OCaml with the editor experience found in other languages. *What:* Introducing `ocamlmerlin server occurrences' and LSP `textDocument/references' support, extending compiler's Shapes for global occurrences and integrating these features in Dune, Merlin, and OCaml LSP. *Summary:* The past few months have seen fantastic progress on releasing Merlin's project-wide reference query: The compiler PR got merged and included in the now released OCaml 5.2; The Dune rules PR got merged, and with it significant performance improvements have been made on the indexing tool. The [final PR] in Merlin is open and under review. That PR as well as the small LSP patch to support the feature are about to be merged. The PR on Merlin also adds support for the feature in the Merlin server plug-in for Emacs. Support for the Merlin server plug-in for Vim has been added separately. All editor plug-ins based on LSP will support the new feature automatically. *Activities:* =E2=80=A2 We followed up on our compiler PR to improve performance for sh= ape aliases weak reduction. It got merged, and made it into OCaml 5.2.0. =E2=80=93 [ocaml/ocaml#13001] =E2=80=A2 We improved the Dune rules that drive the indexer: Simplified t= he rules, added benchmarks, discussed and improved performance. The PR got merged, and made it into Dune 3.16. - [ocaml/dune#10422] =E2=80=A2 We polished the indexer `ocaml-index': Profiled it and improved= its speed by a factor ~2, and improved its CLI. =E2=80=A2 We added a `:MerlinOccurrencesProjectWide' command to the Vim plug-in based on the Merlin server - [ocaml/merlin#1767] [W19] [final PR] [ocaml/ocaml#13001] [ocaml/dune#10422] [ocaml/merlin#1767] OCaml.org Newsletter: May 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the May 2024 edition of the OCaml.org newsletter! This update has been compiled by the OCaml.org team. You can find [previous updates] on Discuss. Our goal is to make OCaml.org the best resource for anyone who wants to get started and be productive in OCaml. The OCaml.org newsletter provides an update on our progress towards that goal and an overview of the changes we are working on. We couldn't do it without all the amazing people who help us review, revise, and create better OCaml documentation and work on issues. Your participation enables us to so much more than we could just by ourselves. Thank you! This newsletter covers: =E2=80=A2 *Recipes for the OCaml Cookbook:* Help us make the OCaml Cookbo= ok really useful by contributing and reviewing recipes for common tasks! =E2=80=A2 *Community & Marketing Pages Rework:* We have UI designs for the reworked and new pages of the community section and are starting to implement these. We made progress towards showing videos from the community on the OCaml Planet. =E2=80=A2 *General Improvements:* As usual, we also worked on general maintenance and improvements, so we're highlighting some of the work that happened below. [previous updates] Open Issues for Contributors =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C You can find [open issues for contributors here]! Here are some (as of writing this newsletter) open issues: =E2=80=A2 [Running OCaml Receipes in repl.it #2456] =E2=80=A2 [Use uucp caselesseq instead of structural equality and String.ascii_lowercase #2444] =E2=80=A2 [OG images for OCaml Packages #1786] [open issues for contributors here] [Running OCaml Receipes in repl.it #2456] [Use uucp caselesseq instead of structural equality and String.ascii_lowercase #2444] [OG images for OCaml Packages #1786] Recipes for the OCaml Cookbook =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml Cookbook is a place where OCaml developers share how to solve common tasks using packages from the ecosystem. A recipe is a code sample and explanations on how to perform a task using a combination of open source libraries. The Cookbook is live at [ocaml.org/cookbook], but there are not a lot of recipes published yet. When the cookbook was merged, all pull requests to the cookbook branch were automatically closed. We recreated these pull requests and they are ready for review. Here's how you can help: 1. Review [open pull requests for cookbook recipes]! 2. Contribute new recipes and tasks for the cookbook! *Relevant PRs and Activities:* =E2=80=A2 PR: Add a checklist for OCaml Cookbook recipe review [ocaml/ocaml.org#2419] by [@sabine] =E2=80=A2 PR: Cookbook filesystem [ocaml/ocaml.org#2399] =E2=80=A2 PR: Cookbook networking [ocaml/ocaml.org#2400] =E2=80=A2 PR: Cookbook xml [ocaml/ocaml.org#2401] =E2=80=A2 PR: cookbook httpclient [ocaml/ocaml.org#2402] =E2=80=A2 PR: cookbook uri [ocaml/ocaml.org#2403] =E2=80=A2 PR: Cookbook regexp2 [ocaml/ocaml.org#2404] =E2=80=A2 PR: Cookbook unzip [ocaml/ocaml.org#2405] =E2=80=A2 PR: Cookbook linalg [ocaml/ocaml.org#2406] =E2=80=A2 PR: Cookbook getenv [ocaml/ocaml.org#2407] =E2=80=A2 PR: Cookbook shell [ocaml/ocaml.org#2408] =E2=80=A2 PR: Cookbook geodesic [ocaml/ocaml.org#2409] =E2=80=A2 PR: Add cookbooks for JSON serialisation and deserialisation [ocaml/ocaml.org#2415] by [@gpopides] =E2=80=A2 PR: Cookbook Encode and Decode Bytestrings from Hex-Strings [ocaml/ocaml.org#2445] by [@ggsmith842] [ocaml.org/cookbook] [open pull requests for cookbook recipes] [ocaml/ocaml.org#2419] [@sabine] [ocaml/ocaml.org#2399] [ocaml/ocaml.org#2400] [ocaml/ocaml.org#2401] [ocaml/ocaml.org#2402] [ocaml/ocaml.org#2403] [ocaml/ocaml.org#2404] [ocaml/ocaml.org#2405] [ocaml/ocaml.org#2406] [ocaml/ocaml.org#2407] [ocaml/ocaml.org#2408] [ocaml/ocaml.org#2409] [ocaml/ocaml.org#2415] [@gpopides] [ocaml/ocaml.org#2445] [@ggsmith842] Community & Marketing Pages Rework =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C This month, we made some progress towards adding videos from the OCaml community (e.g., from YouTube and watch.ocaml.org) to the OCaml Planet. Since the size of the OCaml Planet RSS feed grew so large that automation tools (`dlvr.it') could no longer process it, we reduced the timeframe for posts to show up in the RSS feed to the last 90 days. Contributor [@ishar19] opened a pull request to add an RSS feed for the Community/Events page. This will allow posting new events to various social media automatically and allow you to subscribe to the Events RSS feed with a RSS reader of your choice. We have [UI designs for the reworked and new pages of the community section] and we are opening small issues for contributors to help. :orange_heart: *Relevant PRs and Activities:* =E2=80=A2 The OCaml Planet =E2=80=A2 PR: Community videos scraping and list page [ocaml/ocaml.org#= 2441] by [@cuihtlauac] =E2=80=A2 PR: Scrape watch.ocaml.org as an RSS feed [ocaml/ocaml.org#24= 28] by [@cuihtlauac] =E2=80=A2 PR: No longer feature posts on the OCaml Planet [ocaml/ocaml.org#2430] by [@cuihtlauac] =E2=80=A2 PR: Set the cutoff date for the OCaml Planet RSS feed to 90 d= ays [ocaml/ocaml.org#2416] by [@sabine] =E2=80=A2 PR: Filter OCaml Planet Blog posts for "OCaml" keyword [ocaml/ocaml.org#2443] by [@cuihtlauac] =E2=80=A2 PR: add redirect for /blog to /ocaml-planet [ocaml/ocaml.org#= 2450] by [@sabine] =E2=80=A2 PR: Dedupe RSS feed creation logic [ocaml/ocaml.org#2461] by [@cuihtlauac] =E2=80=A2 Events page =E2=80=A2 PR: Feat/events rss feed [ocaml/ocaml.org#2437] by [@ishar19] [@ishar19] [UI designs for the reworked and new pages of the community section] [ocaml/ocaml.org#2441] [@cuihtlauac] [ocaml/ocaml.org#2428] [ocaml/ocaml.org#2430] [ocaml/ocaml.org#2416] [@sabine] [ocaml/ocaml.org#2443] [ocaml/ocaml.org#2450] [ocaml/ocaml.org#2461] [ocaml/ocaml.org#2437] Outreachy Internship on Interactive Exercises =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 On May 27, [Divyanka Chaudhari] started working with the team, as an Outreachy intern. She's implementing support for running the exercises as a stand-alone project, either in GitHub Codespace, in `repl.it', using Jupyter or LearnOcaml. *Relevant PRs and Activities:* =E2=80=A2 PR: Fix 007 answer folder not running test cases [ocaml/ocaml.org#2458] by [@divyankachaudhari] ## General Improvements and Data Additions *Notable Changes:* =E2=80=A2 We restructured the main navigation to have a "Tools" section t= hat holds the OCaml Platform page and the OCaml compiler releases page. This should make the OCaml Platform page easier to find. =E2=80=A2 The Changelog can now be found under "News", from the main navigation. You can also find the OCaml Planet and the Newsletters in this new section. =E2=80=A2 The OCaml Language Manual is now served from OCaml.org, instead= of v2.ocaml.org. =E2=80=A2 We added some more links to learning resources to the Resources= page at . =E2=80=A2 Some documentation updates on "Is OCaml Web Yet?", "Is OCaml GUI Yet?", the ThreadSanitizer tutorial, and the "Functors" tutorial. *Relevant PRs and Activities:* =E2=80=A2 Features =E2=80=A2 PR: Introduce a tools section for platform page, releases pag= e, and a news section for changelog, OCaml Planet and Newsletters [ocaml/ocaml.org#2410] by [@sabine] =E2=80=A2 Migration of the Language Manual from v2.ocaml.org to OCaml.org =E2=80=A2 PR: fix: language manual redirect, remove unnecessary append = of index.html [ocaml/ocaml.org#2470] by [@sabine] =E2=80=A2 PR: Fix: redirect to downloadable manual files [ocaml/ocaml.org#2439] by [@sabine] =E2=80=A2 PR: Simplify and extend /releases/ redirects from legacy v2.ocaml.org URLs [ocaml/ocaml.org#2448] by [@cuihtlauac] =E2=80=A2 PR: Fix #2465 [ocaml/ocaml.org#2468] by [@cuihtlauac] =E2=80=A2 PR: Fix more redirect [ocaml/ocaml.org#2471] by [@cuihtlauac] =E2=80=A2 Data =E2=80=A2 PR: (data) add some learning resources [ocaml/ocaml.org#2474]= by [@sabine] =E2=80=A2 PR: Add University of Bologna as academic institution [ocaml/ocaml.org#2394] by [@boozec] =E2=80=A2 PR: (data) Update ocaml.org community meeting zoom link [ocaml/ocaml.org#2413] by [@sabine] =E2=80=A2 PR: (data) jobs: add a XenServer position again [ocaml/ocaml.org#2414] by [@edwintorok] =E2=80=A2 PR: (data) add ocaml.org newsletter April 2024 [ocaml/ocaml.org#2417] by [@sabine] =E2=80=A2 PR: OCaml 5.2.0 announce and release page [ocaml/ocaml.org#24= 21] by [@Octachron] =E2=80=A2 PR: Update OCamlPro's logo [ocaml/ocaml.org#2436] by [@hra687= 261] =E2=80=A2 PR: Changelog entry for OCaml 5.2.0~rc1 [ocaml/ocaml.org#2391= ] by [@Octachron] =E2=80=A2 PR: changelog: add Dune 3.15.1 and 3.15.2 [ocaml/ocaml.org#23= 89] by [@emillon] =E2=80=A2 PR: Add changelog entry for Merlin 5.0 [ocaml/ocaml.org#2472]= by [@pitag-ha] =E2=80=A2 Bugfixes =E2=80=A2 PR: fix dark style of package version pages [ocaml/ocaml.org#= 2438] by [@FrugBatt] =E2=80=A2 GitHub actions CI broke due to an OpenSSL issue on MacOS =E2=80=A2 PR: Update debug-ci.yml [ocaml/ocaml.org#2397] by [@cuihtla= uac] =E2=80=A2 PR: Update debug-ci.yml [ocaml/ocaml.org#2398] by [@cuihtla= uac] =E2=80=A2 PR: Do brew update before installing openssl@3 to fix macos= CI [ocaml/ocaml.org#2420] by [@sabine] =E2=80=A2 PR: (ci) Restrict openssl on macos to 3.2 to see if that fi= xes CI [ocaml/ocaml.org#2390] by [@sabine] =E2=80=A2 Documentation =E2=80=A2 PR: Explain how to avoid cyclic abbreviation error with funct= or application [ocaml/ocaml.org#2457] by [@cuihtlauac] =E2=80=A2 PR: Update tutorial =E2=80=9CTransitioning to Multicore with ThreadSanitizer=E2=80=9D [ocaml/ocaml.org#2459] by [@OlivierNicole] =E2=80=A2 PR: (docs) web.md: jsonchema->atd exists [ocaml/ocaml.org#245= 4] by [@Khady] =E2=80=A2 PR: Update is_ocaml_yet/gui.md: Plotting [ocaml/ocaml.org#245= 2] by [@lukstafi] [Divyanka Chaudhari] [ocaml/ocaml.org#2458] [@divyankachaudhari] [ocaml/ocaml.org#2410] [@sabine] [ocaml/ocaml.org#2470] [ocaml/ocaml.org#2439] [ocaml/ocaml.org#2448] [@cuihtlauac] [ocaml/ocaml.org#2468] [ocaml/ocaml.org#2471] [ocaml/ocaml.org#2474] [ocaml/ocaml.org#2394] [@boozec] [ocaml/ocaml.org#2413] [ocaml/ocaml.org#2414] [@edwintorok] [ocaml/ocaml.org#2417] [ocaml/ocaml.org#2421] [@Octachron] [ocaml/ocaml.org#2436] [@hra687261] [ocaml/ocaml.org#2391] [ocaml/ocaml.org#2389] [@emillon] [ocaml/ocaml.org#2472] [@pitag-ha] [ocaml/ocaml.org#2438] [@FrugBatt] [ocaml/ocaml.org#2397] [ocaml/ocaml.org#2398] [ocaml/ocaml.org#2420] [ocaml/ocaml.org#2390] [ocaml/ocaml.org#2457] [ocaml/ocaml.org#2459] [@OlivierNicole] [ocaml/ocaml.org#2454] [@Khady] [ocaml/ocaml.org#2452] [@lukstafi] OCaml Windows Working Group =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Deep in this thread, Sudha Parimala announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Thanks to everyone who joined the meeting! Please find the notes here: . The meeting time this time wasn't US time-zone friendly. We'll try to find a time that works for more people next time. Registration for Fun OCaml 2024 Opens Shortly =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Registration for Fun OCaml 2024 will open shortly at 17:00 CEST (Central European Summer Time) UTC/GMT +2 hours Please put yourself on the waiting list if you don't get a ticket immediately, we're doing this in a staggered fashion, unlocking more tickets over the next days! =F0=9F=A7=A1=F0=9F=90=AB opam 2.2.0~beta3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We=E2=80=99re once again very excited to announce this third and final be= ta for opam 2.2.0. What=E2=80=99s new in this beta? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 *opam init on Windows enhancements*: this beta greatly improves= the `opam init' user experience on Windows, and the number of recognised configurations =E2=80=A2 *opam init =E2=80=93cygwin-extra-packages=3D\*: a new ar= gument to specify additional packages for the internal Cygwin installation =E2=80=A2 *Support of user directories containing spaces*: opam now redir= ects the opam root to `C:\opamroot\opam-xxx' when the opam root contains spaces on Windows =E2=80=A2 *UTF-8 paged =E2=80=93help on Windows* thanks to cmdliner 1.3.0= and some additional Windows API calls, all the `opam --help' commands now display a paged view by default similar to Unix-like systems. =E2=80=A2 Many *fixes*, *performance* and general *improvements* :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [blog post] [release note] [changelog] Windows issues =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Configuration of Windows is tricky, so please don=E2=80=99t be too disheartened if things don=E2=80=99t work instantly. If something doesn= =E2=80=99t work first time, [please do report it], even if you manage to find a way to workaround it. If opam didn=E2=80=99t elegantly tell you what was wrong, = then it=E2=80=99s a bug and we=E2=80=99d love to hear about it, rather than en= ding up with a series of workarounds flying around. It=E2=80=99s no problem at all for= us to receive a bug report which turns out to be user error - we=E2=80=99d f= ar rather that than not hear bugs which are opam=E2=80=99s error! =F0=9F=99= =80 [please do report it] How to upgrade =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A On Windows *BEWARE*: the command shown below is *experimental, use caution* and please do report any issues that you are experiencing. If you prefer to not use our experimental script, feel free to get the Windows binary directly from [the Release Page] and put it in your directory of choice instead. Now that the [Windows support was merged in opam-repository], installing opam is as simple as calling the following command from a PowerShell terminal: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubus= ercontent.com/kit-ty-kate/opam/windows-installer/shell/install.ps1) }" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 opening a new terminal, and a simple `opam init' will work out-of-the-box. [the Release Page] [Windows support was merged in opam-repository] =E2=97=8A On Unix-like systems To upgrade, simply run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocam= l/opam/master/shell/install.sh) --version 2.2.0~beta3" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We=E2=80=99re planning for an opam 2.2.0~rc1 release later next week, so please do report any issue you encounter on our [bug-tracker]. [bug-tracker] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Release of Frama-C 29.0 (Copper)] =E2=80=A2 [Secure From the Ground Up: Introducing the FIDES Project Combi= ning RISC-V and MirageOS] [the ocaml.org blog] [Release of Frama-C 29.0 (Copper)] [Secure From the Ground Up: Introducing the FIDES Project Combining RISC-V and MirageOS] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 04 to 11, 2024.

    Providing Opam system dependancies with Nix

    Ryan announced

    I've opened a PR wi= th input from @dra27 and @avsm adding support for Nix depexts (system depen= dencies) to Opam.

    Opam supports system dependencies for other platforms by invoking the syste= m package manager, e.g. apt-get install .... However Nix is a = bit different, as in general installing a package to your system doesn't cr= eate the development environment required to use it; it will only add execu= tables to your $PATH. To find, for example, objects files, out= side of a Nix derivation you can use nix-shell and it's descen= dant nix develop. E.g.:

    $ nix-shell -p gmp
    $ echo $NIX_LDFLAGS
    -rpath /nix/store/20g5iw2r512gnfrdr4imp2y940v3vlif-shell/lib  -L/nix/store/=
    rx6nkd40819acppajq29g1hxa4d9r35f-gmp-with-cxx-6.3.0/lib -L/nix/store/rx6nkd=
    40819acppajq29g1hxa4d9r35f-gmp-with-cxx-6.3.0/lib
    

    We support Nix depexts with Opam in a similar way. A Nix derivation is buil= d with the desired packages as inputs, and the resulting environment is out= put as a file in the Opam switch in a format that Opam can parse. This nix.env file is a symlink into the Nix store, so acts as a garbage= collection root – packages won't be removed from the store while th= is file exists. Opam outputs these environment variables on an invocation o= f opam env.

    This fixes issues such as https://discuss.ocaml.org/= t/opam-and-nixos-is-there-an-alternative-to-nix-shell/13726.

    While the primary use case is on NixOS, this depext mechanism could be used= on other platforms to provide a consistent experience including other Linu= x distributions, BSDs, (and possibly even windows in the future).

    Nixpkgs typically only packages one version of a package at a time, but I'm= working on versioned depexts with previous version of Nixpkgs as outlined = here.

    I'm keen to get people's opinions and perspective on this!

    ppx_deriving.6.0.2 and ppx_deriving_yojson.3.8.0

    Nathan Rebours announced

    I am happy to announce the release of ppx_deriving.6.0.2 and ppx_deriving_y= ojson.3.8.0, the first release of those packages in years!

    The main feature here is the port of ppx_deriving's standard derivers ([@@deriving sho= w, make, ord, eq, ...]) and ppx_deriving_yojson to ppxlib's Deriving api. There are no changes to how you'd use those derivers but many benefits:

    • Better performances and better integration with other ppx-es as the cod= e is now generated as part of ppxlib's driver main AST rewriting phase rath= er than in a separate, dedicated phase.
    • They can now be used with [@@deriving_inline]
    • None of them will break the location invariant required by merlin anymo= re, fixing a long lasting bug and providing a much better user experience.<= /li>

    You can find the full release notes for ppx_deriving here and for ppx_de= riving_yojson here.

    I'd like to thank @sim642 for all their work on the ppxlib ports and their = patience, and all our other contributors.

    I'd also like to thank the OCaml Software= Foundation who has been funding my work on those releases.

    Effective ML Through Merlin's Destruct Command

    Xavier Van de Woestyne announced

    I'm very pleased to present you an article with a = collection of small illustrations and examples of how to use the dest= ruct command to generate patterns in the presence of pattern matches= .=20

    The command has been present in Merlin for several years (and accessible via OCaml-LSP) but, as the various changelogs relating = to Merlin mention, we have spent some time polishing it and adapting it to = the evolutions of OCaml, making it more stable (essentially in the presence= of punning) and taking into account the changes made to the representation= of functions (and their parameters).

    The aim of the article is to show how the destruct command wor= ks in a number of very concrete cases, and ends with an example (a little a= rtificial for the purposes of the article and for teaching purposes) which = shows how to use destruct interactively.

    Can't wait to hear your feedback! Happy reading!

    OCaml Windows Working Group

    Sudha Parimala announced

    I=E2=80=99m happy to share that we=E2=80=99re starting a working group for = OCaml Windows. This is part of a larger effort, First-class Wi= ndows, to enhance the OCaml experience on Windows. Through this effort,= we aim to coordinate our collective knowledge to identify high-priority it= ems for First-class Windows.

    We've started a mailing list to exchange ideas and would greatly appreciate= inputs. You can sign up at – https://groups.google.com/u/0/g/ocaml-windows-wg

    While the mailing list is intended to be the primary means of communication= , we plan to do a sync meeting once a month, to start with. We plan to do a= kick-off meeting early next week. Please fill in this poll if you're inter= ested to join: https://= strawpoll.com/polls/PbZqbmkNeyN.

    Happy camling :camel:

    Flambda2 Ep. 2: Loopifying Tail-Recursive Functions, by OCamlP= ro

    OCamlPro announced

    Greetings Cameleers,

    We would like to share with you our latest Flambda2 Snippet: Flambda2 = Ep. 2: Loopifying Tail-Recursive Functions!

    Indeed, today's topic is what is called Loopify, one of the ma= ny optimisation algorithms found in the Flambda2 optimising co= mpiler project.

    We believe Loopify is a nicely representative piece of softwar= e for our readers to grasp at the general design and philosophy for all opt= imisations available in Flambda2! Hopefully, you will do too!

    Be sure to check out the Flambda2 Ep.0 article to get all t= he context for the project itself and the series of blog posts!

    In any case, we await your feedback below, and hope that you will enjoy rea= ding this post, and all ensuing ones!

    Kind regards, The OCamlPro Team

    OCaml Platform Newsletter: March-May 2024

    Thibaut Mattio announced

    Welcome to the eleventh edition of the OCaml Platform newsletter!

    In this March-May 2024 edition, we are excited to bring you the latest on t= he OCaml Platform, continuing our tradition of highlighting recent developm= ents as seen in previous editions. To understand the direction we're headed, especia= lly regarding development workflows and user experience improvements, check= out our roadmap.

    Highlights:

    • Explorations on Dune package management have reached a Minimal-Viable-P= roduct (MVP) stage: a version of Dune that can build non-trivial projects l= ike OCaml.org and Bonsai. With a working MVP, = the team is shifting their focus to putting Dune package management in the = hands of the community. To that end, we have started the Dune Developer Pre= view Program, where we will test Dune package management with users and ref= ine the user experience in preparation for a final release.
    • The opam team released a second beta of opam 2.2, and with it, opened the <= a href=3D"https://github.com/ocaml/opam-repository/pull/25861">final PR= to add support for Windows OCaml to the opam-repository. Once the PR is me= rged, opam 2.2 will be usable with the upstream opam-repository on Windows,= paving the way for a third beta very soon, and a Release Candidate next.
    • The odoc team has finalized the initial design for Odoc 3.0 and opened = several RFCs to g= ather community input. We've implemented a new Odoc driver that follows the Odoc 3.0 design an= d have already started prototyping key parts of the design.
    • Merlin's project-wide references query is getting very close to release= . The necessary compi= ler PR has been merged and included in OCaml 5.2, and the Dune rules PR has been merged a= nd included in Dune 3.16. The next steps are to merge the PR in Merlin itself and the small = patch in OCaml LSP.
    • The set of standard derivers shipped with ppx_deriving.std= (i.e. [@@deriving show, make, ord, eq, ...]) as well as ppx_deriving_yojson are now directly written against Ppxlib's API. = That impacts developers in two ways. First, it allows you to enjoy reliable= editor features in projects with those derivers (Ppxlib preserves Merlin's= location invariants). Second, you can avoid a hard dependency on those der= ivers by using Ppxlib's deriving_inline feature on them. Thank= s a lot to @sim642 for all your work and very kind patience, @NathanReb for= reviewing and release managing, and everyone else involved!

    Releases:

    [Dune] Exploring Package Management in Dune (<= a href=3D"https://ocaml.org/docs/platform-roadmap#w4-build-a-project">W4)

    Contributed by: @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), = @gridbugs (Tarides), @Alizter

    Why: Unify OCaml tooling under a single command line for all develop= ment workflows. This addresses one of the most important pain points reported by the community.

    What: Prototyping the integration of package management into Dune us= ing opam as a library. We're introducing a dune pkg lock comma= nd to generate a lock file and enhancing dune build to handle = dependencies in the lock file. More details in the Dune RFC.

    Summary:=20

    Over the past three months, significant progress has been made in adding Du= ne's support for package management. We are thrilled to report that our pro= totypes have reached a Minimal Viable Product (MVP) stage: an experimental = version of Dune package management that can be used to build non-trivial pr= ojects, including OCaml.org and Bonsai, which we are using in our tests.

    There is still a long way to go, but with this milestone reached, we are no= w shifting our focus from prototyping to putting the feature in the hands o= f the community. We are moving to testing the new Dune feature with users, = and in particular, now that we have a good understanding of the technical b= lockers and their workarounds, we will be focusing on validating and refini= ng the developer experience (DX) of Dune package management in preparation = for a first release.

    To that end, the Dune team has started a Dune Developer Preview Program. We= 're currently testing the Developer Preview of package management with sele= cted beta testers, and once the biggest issues have been addressed, we'll b= e opening it to the broader community.

    Activities:

    [opam] Native Support for Windows in opam 2.2 = (W5)

    Contributed by: @rjbou (OCamlPro), @kit-ty-kate (Ahrefs), @dra27 (Ta= rides), @AltGr (OCamlPro)

    Why: Enhance OCaml's viability on Windows by integrating native opam= and opam-repository support, fostering a larger community, an= d more Windows-friendly packages.

    What: Releasing opam 2.2 with native Windows support, making the off= icial opam-repository usable on Windows platforms.

    Summary:

    The opam team is getting closer to a final release of opam 2.2 with support= for Windows. In the past months, we have released a second beta of opam 2.= 2, addressing a number of issues reported by users on previous releases, in= cluding Windows issues.

    Excitingly, we also opened the final PR adding support for Windows OCaml to opam-r= epository. With the PR merged, the opam team is expecting to be able to mov= e to a Release Candidate in June.

    Stay tuned for more exciting news and releases in the coming weeks and mont= hs!

    Activities:

    [=E2=80=8Bodoc=E2=80=8B] Odoc 3.0= : Unify OCaml.org and Local Package Documentation (W25)

    Contributed by: @jonludlam (Tarides), @julow (Tarides), @panglesd (T= arides), Luke Maurer (Jane Street)

    Why: Improving local documentation generation workflow will help pac= kage authors write better documentation for their packages, and consolidati= ng the different odoc documentation generators will help make = continuous improvements to odoc available to a larger audience.

    What: We will create conventions that drivers must follow to ensure = that their output will be functional. Once established, we will update the = Dune rules to follow these rules, access new odoc features (e.= g., source rendering), and provide similar functionalities to docs.ocaml.or= g (a navigational sidebar, for instance). This will effectively make Dune u= sable to generate OCaml.org package documentation.

    Summary:

    The Odoc team has made significant progress on the upcoming Odoc 3.0. We he= ld productive in-person meetings in Paris to discuss crucial design aspects= such as the CLI, source code rendering, and references. These discussions = led to the publications of RFCs for the various components of the design sp= ecification.

    We also started implementing a new Odoc driver that adheres to the new desi= gn for testing purposes, and began prototyping several of the new features.

    While discussions on the RFCs and specific features are still ongoing, we a= re very excited to have a solid set of design specifications under communit= y review and to have begun implementing key parts of the new design.

    Activities:

    • Investigated package name/library name mismatches and module name clash= es =E2=80=93 jonludlam/2997e905a468bfa0e625bf98b24868e5, jonlud= lam/0a5f1391ccbb2d3040318b154da8593a.
    • Continued work on odoc 3.0 design, including meetings and discussions, = culminating in the publication of the RFC =E2=80=93 ocaml/odoc/discussions/1097.
    • Worked on the navigation PR, added functionalities, fixed bugs, and com= pleted the rebase =E2=80=93 ocaml/odoc#1088.
    • Met in Paris to discuss the odoc 3.0 design, covering topics such as CL= I, rendering source code, and references.
    • Opened a PR with basic support for markdown in standalone pages =E2=80= =93 ocaml/odoc#1110= .
    • Published the current proposal for assets as a discussion =E2=80=93 ocaml/odoc#1113= .
    • Continued discussions on Markdown rendering and asset references - ocaml/odoc#1110.
    • Implemented a new driver for testing the odoc 3.0 implementation =E2=80= =93 ocaml/odoc#1121= , ocaml/odoc#1128.<= /li>
    • Worked on implementing the –parent-id flag part of the Odoc 3.0 = spec =E2=80=93 ocaml/od= oc#1126.
    • Worked on implementing the -L and -P flags ocaml/odoc#1132

    [Merlin] Support for Project-Wide References i= n Merlin (W19)

    Contributed by: @vds (Tarides), @Ekdohibs (OCamlPro), @Octachron (I= NRIA), @gasche (INRIA), @emillon (Tarides), @rgrinberg (Jane Street), @Julo= w (Tarides)

    Why: Enhance code navigation and refactoring for developers by provi= ding project-wide reference editor features, aligning OCaml with the editor= experience found in other languages.

    What: Introducing ocamlmerlin server occurrences and LS= P textDocument/references support, extending compiler's Shapes= for global occurrences and integrating these features in Dune, Merlin, and= OCaml LSP.

    Summary:

    The past few months have seen fantastic progress on releasing Merlin's proj= ect-wide reference query: The compiler PR got merged and included in the no= w released OCaml 5.2; The Dune rules PR got merged, and with it significant= performance improvements have been made on the indexing tool. The final PR in Merlin is op= en and under review. That PR as well as the small LSP patch to support the = feature are about to be merged.

    The PR on Merlin also adds support for the feature in the Merlin server plu= g-in for Emacs. Support for the Merlin server plug-in for Vim has been adde= d separately. All editor plug-ins based on LSP will support the new feature= automatically.

    Activities:

    • We followed up on our compiler PR to improve performance for shape alia= ses weak reduction. It got merged, and made it into OCaml 5.2.0. =E2=80=93 = ocaml/ocaml#13001=
    • We improved the Dune rules that drive the indexer: Simplified the rules= , added benchmarks, discussed and improved performance. The PR got merged, = and made it into Dune 3.16. - ocaml/dune#10422
    • We polished the indexer ocaml-index: Profiled it and impro= ved its speed by a factor ~2, and improved its CLI.
    • We added a :MerlinOccurrencesProjectWide command to the Vi= m plug-in based on the Merlin server - ocaml/merlin#1767

    OCaml.org Newsletter: May 2024

    Sabine Schmaltz announced

    Welcome to the May 2024 edition of the OCaml.org newsletter! This update ha= s been compiled by the OCaml.org team. You can find previous updates on Discuss.

    Our goal is to make OCaml.org the best resource for anyone who wants to get= started and be productive in OCaml. The OCaml.org newsletter provides an u= pdate on our progress towards that goal and an overview of the changes we a= re working on.

    We couldn't do it without all the amazing people who help us review, revise= , and create better OCaml documentation and work on issues. Your participat= ion enables us to so much more than we could just by ourselves. Thank you!

    This newsletter covers:

    • Recipes for the OCaml Cookbook: Help us make the OCaml Cookbook = really useful by contributing and reviewing recipes for common tasks!
    • Community & Marketing Pages Rework: We have UI designs for t= he reworked and new pages of the community section and are starting to impl= ement these. We made progress towards showing videos from the community on = the OCaml Planet.
    • General Improvements: As usual, we also worked on general mainte= nance and improvements, so we're highlighting some of the work that happene= d below.

    Recipes for the OCaml Cookbook

    The OCaml Cookbook is a place where OCaml developers share how to solve com= mon tasks using packages from the ecosystem.

    A recipe is a code sample and explanations on how to perform a task using a= combination of open source libraries.

    The Cookbook is live at ocaml.org/co= okbook, but there are not a lot of recipes published yet.

    When the cookbook was merged, all pull requests to the cookbook branch were= automatically closed. We recreated these pull requests and they are ready = for review.

    Here's how you can help:

    1. Review open pull requests for cookbook recipes!
    2. Contribute new recipes and tasks for the cookbook!

    Relevant PRs and Activities:

    Community & Marketing Pages Rework

    This month, we made some progress towards adding videos from the OCaml comm= unity (e.g., from YouTube and watch.ocaml.org) to the OCaml Planet.

    Since the size of the OCaml Planet RSS feed grew so large that automation t= ools (dlvr.it) could no longer process it, we reduced the time= frame for posts to show up in the RSS feed to the last 90 days.

    Contributor @ishar19 opened a pu= ll request to add an RSS feed for the Community/Events page. This will allo= w posting new events to various social media automatically and allow you to= subscribe to the Events RSS feed with a RSS reader of your choice.

    We have UI designs for the reworked and new pages of the = community section and we are opening small issues for contributors to h= elp. :orange_heart:=20

    Relevant PRs and Activities:

    Outreachy Internship on Interactive Exercises

    On May 27, Divyanka Chaudh= ari started working with the team, as an Outreachy intern. She's implem= enting support for running the exercises as a stand-alone project, either i= n GitHub Codespace, in repl.it, using Jupyter or LearnOcaml.

    Relevant PRs and Activities:

    ## General Improvements and Data Additions

    Notable Changes:

    • We restructured the main navigation to have a "Tools" section that hold= s the OCaml Platform page and the OCaml compiler releases page. This should= make the OCaml Platform page easier to find.
    • The Changelog can now be found under "News", from the main navigation. = You can also find the OCaml Planet and the Newsletters in this new section.=
    • The OCaml Language Manual is now served from OCaml.org, instead of v2.o= caml.org.
    • We added some more links to learning resources to the Resources page at= https://ocaml.org/resources.
    • Some documentation updates on "Is OCaml Web Yet?", "Is OCaml GUI Yet?",= the ThreadSanitizer tutorial, and the "Functors" tutorial.

    Relevant PRs and Activities:

    Registration for Fun OCaml 2024 Opens Shortly

    Sabine Schmaltz announced

    Registration for Fun OCaml 2024 will open shortly at 17:00 CEST (Central Eu= ropean Summer Time) UTC/GMT +2 hours

    Please put yourself on the waiting list if you don't get a ticket immediate= ly, we're doing this in a staggered fashion, unlocking more tickets over th= e next days! =F0=9F=A7=A1=F0=9F=90=AB

    https://fun-ocaml.com

    opam 2.2.0~beta3

    Kate announced

    We=E2=80=99re once again very excited to announce this third and final beta= for opam 2.2.0.

    What=E2=80=99s new in this beta?

    • opam init on Windows enhancements: this beta greatly improves th= e opam init user experience on Windows, and the number of reco= gnised configurations
    • opam init –cygwin-extra-packages=3D\<pkgs\>: a new = argument to specify additional packages for the internal Cygwin installatio= n
    • Support of user directories containing spaces: opam now redirect= s the opam root to C:\opamroot\opam-xxx when the opam root con= tains spaces on Windows
    • UTF-8 paged –help on Windows thanks to cmdliner 1.3.0 and= some additional Windows API calls, all the opam --help comman= ds now display a paged view by default similar to Unix-like systems.
    • Many fixes, performance and general improvements

    :open_book: You can read our blog post for more information about these changes and more= , and for even more details you can take a look at the release note or the changelog.

    Windows issues

    Configuration of Windows is tricky, so please don=E2=80=99t be too disheart= ened if things don=E2=80=99t work instantly. If something doesn=E2=80=99t w= ork first time, please do = report it, even if you manage to find a way to workaround it. If opam d= idn=E2=80=99t elegantly tell you what was wrong, then it=E2=80=99s a bug an= d we=E2=80=99d love to hear about it, rather than ending up with a series o= f workarounds flying around. It=E2=80=99s no problem at all for us to recei= ve a bug report which turns out to be user error - we=E2=80=99d far rather = that than not hear bugs which are opam=E2=80=99s error! =F0=9F=99=80

    How to upgrade

    • On Windows

      BEWARE: the command shown below is experimental, use caution = and please do report any issues that you are experiencing. If you prefer to= not use our experimental script, feel free to get the Windows binary direc= tly from the Release Page and put it in your directory of choice instead.

      Now that the Windows support was merged in opam-repository,

      installing opam is as simple as calling the following command from a PowerS= hell terminal:

      Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubuserconten=
      t.com/kit-ty-kate/opam/windows-installer/shell/install.ps1) }"
      

      opening a new terminal, and a simple opam init will work out-o= f-the-box.

    • On Unix-like systems

      To upgrade, simply run:

      bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
      ster/shell/install.sh) --version 2.2.0~beta3"
      

      We=E2=80=99re planning for an opam 2.2.0~rc1 release later next week, so pl= ease do report any issue you encounter on our bug-tracker.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=B9C0HVU7; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=WRm2+A1y; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 77739B80123 for ; Tue, 18 Jun 2024 14:05:58 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=o9lxHWDRmTXXq1ZmTu/++hjuGyL1lBokQJJoW+LuROY=; b=B9C0HVU79132DOSFREourMoozqUrSyUSQM+dJ1C1QmUFRnSlaSdwP5MV DlfcVtzFhkTMZ0ctuRp2P8BUfu65YBob5MR1KgmLMTSKFlXHLCx+ENXjK uvkVPQhIy66NKPBauNuGejWPZcCzTCYOXWb49zB3NFqRxWi/lR9w30UDQ A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.08,247,1712613600"; d="scan'208,217";a="171259479" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Jun 2024 15:05:57 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id E91AEE0BE9; Tue, 18 Jun 2024 15:05:56 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 78AB5E0131 for ; Tue, 18 Jun 2024 15:05:55 +0200 (CEST) IronPort-SDR: 66718632_l2dl/3FhzqUidwKSPivHquEjCUbCjcFFpC/3llUynPEUVC2 m4riDRb0KxOYUx01sycLQ+Xyidioy1DQP14jkbg== X-IPAS-Result: =?us-ascii?q?A0E3BACWhXFmkCIeaIFaEwEBhASBAxkBYlozBwhIhFaDT?= =?us-ascii?q?44bkUeKcoJ7AxgWIxQBAwENLgEMBgECBAEBAwECAYR/iHkCHwYBBDQTAQIEA?= =?us-ascii?q?QEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBAQEgHhAOJ4V0DYJKG?= =?us-ascii?q?RUjURpjAgYDBgEBAQEBAQEBAQIBAQEiAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMAQctcQQGEwEBOBgjAxQBBgMCEQE1A?= =?us-ascii?q?wETARIagmYBgmQDBQwGki+bPHp/M4EBggwBAQaBCD4DAgkCBRgm2gSBYwmBS?= =?us-ascii?q?IgXGgEkSGkChCWEQCcPgVVEgUqCRG+CPwsXAQEBAQGBOwEBCEWDLoJphgkmg?= =?us-ascii?q?V0BhUlXhWBtgQpGgnMME4EtbQkCBhaBGVdXD1lyWEIOgwl/JAILQVsQi1uBS?= =?us-ascii?q?0szIRMBVRMXCz4JFgIWAxsUBDAPCQsmKgY5AhIMBgYGWTQJBCMDCAQDQgMgc?= =?us-ascii?q?REDBBoECwd3gTyBaQQTRAOBN4cbglSDO4IbhBpLhG+BawxhiAqBcoE+gWZMg?= =?us-ascii?q?wVNhD0dQAMLbT01FBuqHQQ3AoJ/Lw5wQxUZFgEBIAI2BQkrCjYOBQRKC5MlA?= =?us-ascii?q?yydIpNJgQk0B4QWgVwGDIh9gSSOJYdKhAVMgQqLKpk0IphDIII0hx6BJQmBb?= =?us-ascii?q?WmIaowcPBYjaHEvgxGBfCM8gSAzGjBDgmcJRhwPkhsQWlSDGzvGSUE1AgEBN?= =?us-ascii?q?wIHAQoBAQMJhWIBAYM+a10BAQ?= IronPort-PHdr: A9a23:MCG86B8xvVLcOP9uWQezngc9DxPPW53KNwIYoqAql6hJOvz6uci4b QqEv6Um1g6BdL6YwswHotKViZyoYXYH75eFvSJKW713fDhBt/8rmRc9CtWOE0zxIa2iRSU7G MNfSA0tpCnjYgBaF8nkelLdvGC54yIMFRXjLwp1Ifn+FpLPg8it2O2+5Znebx9GiTajYr5+I wu6oAHMvcQKnIVuLbo8xRTOrnZUYepawn9mK0yOlBjm/Mew+5Bj8yVUu/0/8sNLTLv3caclQ 7FGFToqK2866tHluhnFVguP+2ATUn4KnRpSAgjK9w/1U5HsuSbnrOV92S2aPcrrTbAoXDmp8 qlmRAP0hCoBKjU18GLZispujKJauxKhpgdww4rKb4qIOvt+ebndcs4BRWFcWspcWTBNDoa6Y oASDeQOIPxYopH9qVUQsBWwCwqiC+zzxTJTnHD6wbc33v49HQ3a3gEtGc8FvnTOrNXyMacfS fy4zK3SwjXFcvhYxCvy6IjNchAgvfGMQa97fM3LxkkrDQzFiE+cqZf5MDOV0+QNsnSb7/Z7W OK3jG4nrwFwoiSxycgwionJgIMVyknZ9Spn2oo1Ise4SEFibNOiDZBfuD2UOZFsTcM+X2Fnp jw6yrsetJO1YCUExokrywDDZ/GbboWG7B3uWeaPLTp6mn5ofL2xihSy/ES+y+DxWMe63VVEo yRLjtXBtG0B2RzP58WDRfVw+Fqq1ziI1wDW8O5EIEY0mLLDK5E/3r4wl4YTvlrbHi/xnUX2i bGZel8i+ue29+TrerLmqYOGOI9xjgHyKKMumtawAeggPQgOXnSb+eSh1LL450H2XLJKjvgun qnbt5DaI8EbprWlAwBLyIYj7xe/DzGp0NgCgXYHK1dFdAqbgIjuP1HOPfX4Auy+g1u2ijtk2 e3JPqD5DpXOMHfDirDhcqt6605a0gYzy85Q545MBrAOOv3zRE7xu8LCDh89LQO02eHnCdVn2 oMZQ2KPDbeVMKzVsV+P6eIvJ/eDaJUJtzb6Lvgp//nugmMjll8Yeamlx4EbaHeiHvRpO0mZf WDjgs0AEWgXoAU+V/bmh0GFUT5Wf3qyRaU86SomCIK8F4vMWoetgLuZ3CujH51WYHpGClGWH nvyeYWEQfEBYz+RLM95ijEISKatRos72R2zqAP3xKBrI+TI9iECu5/u28B56/DdmB0v7zB4E cSQ3m6XQ21qg28EXSE60a97rEF711yOz6x4g+FDFdxP+fxJSBo0NZ/dzuNkE93+RgTMdcqTR lm8WNWpGzQxQ8oxw9AQZ0Z9HM2vjhXM3ia3GbMVj7uLBJg086LAwXf+O8Z9y3DH1Kk4klkpX NFDNWq8hq5w7wTTBojJnFuFl6uyaKgQwirA+H2ewWaSs0xUSgB9XbnfUX0RaUbatdH56VnDT 7+qB7QnKAxBycuaJ6VXdtPnkElKSe/gONrQYm2/mX+9Cw6Gyb6UdIrqfGEd3SXBCEcajw8T/ XCGNQknBie8vW3SFjtuFUjgY0706+Z+rGm0TkkuwwGRc0Jh17+1+h8JhfyAUP4cxbUEuDonq zpoAlm9xMjaC9+PqgtuZqlcZsk94Fhf2WLfrANyJoagILx6hl4CbwR3uFvj2whvBoVajccqt G8qzBZ1Ka+AzFxObTaY3ZTpNr3TK2ny5wyvZrXN2lDe1daW4r0A5O45q1XlpgGpF1At/29p0 9lPgDOg4cCACBUUG9qlVlkx3xxloffcbzVro8vf3HhodK21qSPq2tQzBeJjxAzzUc1YNfatE Ab0W/YRB82vNPBiz1GtZxRCJ+tS8a8oI+u+cP+XxKOgPOBhhS+ry2Nd79YugQq36yNgR7uQj N4+yPaC017cD18U7X+ku8Hzw8VfYC0KW3C4wm7iDZJQYat7ecAKD32vKou53IY2nIbjDlhf8 lPrHFYawImxYxPHZlj020tL3kQSoGC7sTO/yy1onjopqKuGwSGIxP7tJ1IcImAefGB5lh/3J JSsydUTXUymdQ8swSCf3h6vxIRrhPFZEjzLRkNZYyX9L2djS7a98L2YbJtG7Jou9z5cUOG9f UyyQLngpRAXyGXmQ3sYwyo0JHmxopuspxVhkyqGKWpr6nrUfcYl3RDE+NnVXuJcxBIDVHA+k T7TF0SxNNmv/MyJmtHEqO/Wu3uJcJpVfGGryIqBsHH+/mh2GVilmPv1nNT7EA882Cu91t9wV CyOogyuKo/sn7+3N+5qZCwKTBf19tZ6F4dik4AxmIBY2H4UgY+Q9GYGlmG7OMtS2Kb3Zn4AD TARxNud7A/g0UxlZnWHouCxHnyZy80nfNK6Z2IKxgol6MRbFKqf7LpFhDZ45F2iokOZYPRwm Csc1ep78GQT0IRr8EImyiSQBKxXHFENZHa90U3Qs5bl9OMMODXKE/D4zkd1kNG/AavXpwhdX Cy8YZI+BWpq6c45NlvQ0Xr144Wied/KbNtVuAfH9nWIx+VTNp81keIHwCR9Pmeo90Yf8LZuj jBe/cScgd2fLGF84K+yAhhZLyD4IcQJ9WTkia9Y2N2d34WuAolJEDIWWpDlVrStTCJUsu7of VXrcnV0ujKAFLzTEBXKok5ipnSJCJurMnCLOFEBytFzWBSWJEpemR0ZGjIgkdRqc2LijNyke 0B/6DcL41f+oRYZ0eNkOS70VWLHrRupYDM5IHSGBCJf9RoKp0LcMMjEq/l2Azkd5Jqq6gqEN m2cYQ1MS2APQE2NQV75bPGi4tzJ8u7QAeTbTbOGWo+18blde8eokLSSh5Nh+yeQO86POHh7E vB93VBMCHl9EsKfgD4PTi0LiwrHaNOdrxqnvCgrvoa46vuOOkqn6YaUCrRUOMli4Fjv2/bFb rbMwn0hb20EnpoXjWfF0r0ewEIfh2l1ej+hHK5B0EyFBKPcl6lLDgIKPiZ6Nc9G9aU5jUFGP c/WjM+w16Yt16RkTQ4dCRq6wofyOZ9vQSn1Ll7MCUeVOa7TIDTKx5uyeqagUfhKi+4SsRSsu DGdGkulPzKZljCvWQr8VIMExCydIhFav5mwNxh3Dm22BuncUUXuM/NHrWgQ/OgsgXfbKWMXM T59al5A6LqK4nZRhvx5XXdK7n9kMfWskSGE6eLVMdAT7estBT573bE/gjxy2/5O4SdISeYg0 hDolYY7oH2Wsryp929/Vx5ftjtAhISKpFhvf6LD+cxJXX/CugkG7WCRFwgirdx4DNbioOZVl siJk7j8YmQnkZqc7Y4XAM7aL9iCOXwqPE/yGTLaOwACSCaiKWDVg0EO2OHX7HCeqYI274T9g JdbAKEOT0Q7T7lJbyYtVMxHOpp8WSko1KKWnNJdr2TrtwHfHY0Zv4ibBKvIULO2cGrf1uECP EdAgrLgcdZKbNy9ghQ+LAIi2t+XfiiYFZNMunEzP1Zy+R8UtiYkCDRrhAqmaxvzsiVLTafmw kc60ll3M7sk+Wq+sQk7eQqY/3BV8gF52tT932LLKGaofvvpUdkEUnil60Q8YMGkGFh5P1Luw hQscT7AQ/g5Y6JITWlwk0ecvJJOHaQZVqhYeFoKwvrRYfw00FNaoyHhxEld5OKDB4Ew3Actd JetqTpH1WcBJJYtIrfMIaNS0lVKrqee52mw0eQg3AIVJ0AM6X6fPikStwQEO6InKCyh4uF3o VXYyn0aIDRKDKJs+a4i/1hYWazI1y/61r9fNk29f/eSKa+UoSmIlMKFRE8xylJdl0RB+us+2 sMifkyIEkE3meLLRlJQbZaEclkTNJYBkRqbNTyDuujM359vaoC0F+SyCPSLqL5RmEWvWgAgA 4UL6M0FWJiqykDRa8n9f9tngV0g4hrmIFKdAbFHYhWOxX08mfrnmZxb7akIAAxIGWJ5IDm67 bbRpxY3jbyERthja3MTWM0fPXIzWdGmsyReonJLASLx174Jjg+Y4HWvw0aYRCm5dNdlaPqOM Fl0D8qq/Dwk76WsoVvHq9PGIGXrKdlputnO8P4X4ZGdBLkHKNs1+1eZkI5eSXuwVmfJGtPgP Jn8Zb4natnsA2q7WFiy2HolCt38N9G3Iu2UkBnlEMxK5ZKD0mlpZqrfXnkOXg19rOYZ6Odga B0fNtAlNAXwuV12PuT6KQOcmL1Gok6oOWIQV/5b3Pm3bLxRzjMxY6m90nRyF/nSIMG99lMLT 5wRyBSC1bCkfYYMCEAb/1RFfAHeuScyl25gL/s/hOAlz0GQ2WQ= IronPort-Data: A9a23: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 wRAO0QDOXk= IronPort-HdrOrdr: A9a23:5to0X6HMZRsfL7nVpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:OysqfG/ImX3PBcJXVhmVv38UQuchaiTW8FDBfEiEMExUdqW5ZVDFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3AHpD1fA4wg439A+TVN9p3FtwexoxQuv2XWXkLrqw?= =?us-ascii?q?JqtWFEjV/NhKegAa4F9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.08,247,1712613600"; d="scan'208,217";a="171259463" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEjB6SZ8cBa6U2bDRzr1b1BMP6M33hmNlPC9r?= =?us-ascii?q?3T9137H/4uEoAC2NxTPdZWM8QcvT/McjjQAJ3Qu0WzC3HMlfR1L1WceH?= =?us-ascii?q?jTTo+mqwCRWqQU6mTVRGarCn8C2u3fMKvGa4XPnV0cSKu+iodNwgroWz?= =?us-ascii?q?+nNaXlHJHET2jE7tuxwrhJGA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Jun 2024 15:05:54 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5F0C9564AA8; Tue, 18 Jun 2024 15:05:53 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1718715953; bh=5pyOExo4WvcNTJINXVg+5JuF9e6aFWKQa0l21l1ACdk=; h=From:To:Subject:Date:Message-ID; b=WRm2+A1yajqF20JJ/NUbU1JS83N++ZUTZlCjerA0lXJZU5FYoYKAjhLtsdlypxCzK Nexxr9EK9ZUnlEsCxqeHGZlmv5WsqtCJaj1aYWIs2o8A9fDsIY0Icj1AZC/qr2AlUR wHc4bo/hSNsleLQDS77VC2Haukw75JtQAar3zh1c= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 18 Jun 2024 15:05:53 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 18 15:05:53 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.226825, queueID=BA08A564AA9 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19147 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 11 to 18, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Your opam-repository PRs are now tested on Windows Forester 4.1 fun-sql 0.2.3 dream-html and pure-html 3.5.2 Control Structures, English translation of lectures by Xavier Leroy Ppxlib dev meetings Other OCaml News Old CWN Your opam-repository PRs are now tested on Windows =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Following the merge of [Windows support for the compiler in opam-repository] and the [release of opam 2.2.0~beta3], I'm happy to announce that a basic Windows CI using Github Actions is now in use in opam-repository, so all your new PRs are now being tested on Windows too. This is a big milestone, however the upstream opam-repository hasn't been tested with Windows before and thus many packages lacking the proper availability metadata will fail to build in the next month or so. If you see a package that is definitely not going to be available on Windows, please do report it in the [opam-repository bug-tracker] or even better open a PR if you have the time. When opening such PRs/issues, it would help the maintainers to copy/paste the failing log in the PR description. Most such PRs should simply add the following line to the failing package(s): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 available: os !=3D "win32" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you notice any issues in the Github Action itself or want to improve it, please feel free to open a PRs/issue for that too, the code is available in [opam-repository/.github/workflows/windows.yml]. [Windows support for the compiler in opam-repository] [release of opam 2.2.0~beta3] [opam-repository bug-tracker] [opam-repository/.github/workflows/windows.yml] Forester 4.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jon Sterling announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce the release of [Forester 4.1] on opam, which is an OCaml utility to develop =E2=80=9CForests=E2=80=9D, which are dense= ly interlinked mathematical websites / Zettelk=C3=A4sten similar to the [Stacks project] or [Kerodon ]. You can see the [release notes] on my own [Forest]. There are a few new features, including a simplified command `forester init` to setup a fresh forest. Thanks to Kento Okura, Nick Hu, and Trebor Huang for their contributions to this release. [Forester 4.1] [Stacks project] [Kerodon ] [release notes] [Forest] fun-sql 0.2.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce the initial release of fun-sql, a simple functional-style query library for SQLite and PostgreSQL. To use it with SQLite: To use it with PostgreSQL: Fun-sql is not an ORM, it's a query execution and data mapping library (sometimes called a micro-ORM). It does three things: 1. Create the prepared statement and encode the parameters 2. Execute the query 3. Decode the resultset into OCaml types using a set of combinators. Here's an example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Fun_postgresql =E2=94=82=20 =E2=94=82 module Note(Db : sig val db : Postgresql.connection end) =3D st= ruct =E2=94=82 open Db =E2=94=82=20 =E2=94=82 type t =3D { id : int; txt : string } =E2=94=82 let ret =3D ret (fun row -> { id =3D int 0 row; txt =3D text = 1 row }) =E2=94=82=20 =E2=94=82 (* Prepared statement: *) =E2=94=82 let edit =3D query db "update note set txt =3D $1 where id = =3D $2" =E2=94=82=20 =E2=94=82 (* Use by simply calling it: *) =E2=94=82 let edit id txt =3D edit ~args:Arg.[int id; text txt] unit =E2=94=82 (* val edit : int -> string -> unit *) =E2=94=82=20 =E2=94=82 (* Prepared statement: *) =E2=94=82 let by_id =3D query db "select id, txt from note where id =3D= $1" =E2=94=82=20 =E2=94=82 let by_id id =3D only (by_id ~args:Arg.[int id] ret) =E2=94=82 (* val by_id : int -> t *) =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The design enforces the use of prepared statements=E2=80=93indeed, with PostgreSQL, a prepared statement corresponding to a query can be created only _once,_ so you have to ensure that you use a pattern like the above. MySQL support is also desired and I will get to it at some point unless someone beats me to it! dream-html and pure-html 3.5.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Pleased to announce the release of dream-html 3.5.2, which actually spawns a new package pure-html: This package offers the same functionality as dream-html, _except_ without a Dream dependency, so you can use whatever web server you like, or even use it for other applications than web servers. It works exactly the same way as dream-html, except the top-level module is `Pure_html': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Pure_html =E2=94=82 open HTML =E2=94=82=20 =E2=94=82 let content =3D article [] [ =E2=94=82 p [] [txt "Header"]; =E2=94=82 p [] [txt "Body"]; =E2=94=82 ] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 pure-html has a runtime dependency only on the `uri' package. Control Structures, English translation of lectures by Xavier Leroy =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: unfode announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [Website]. Really learned a lot from the slides. For example, the most understandable definition of continuation I've ever seen: Given a control point in a program, its continuation is the sequence of computations that remain to be done once the execution reaches the given control point in order to finish the execution of the whole program. [Website] Ppxlib dev meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This month's meeting is scheduled today, Tuesday June 18th, at 6:00PM CET. Sorry for posting the announcement so late! Here is the meeting agenda: =E2=80=A2 5.2 AST bump =E2=80=A2 Driver Transform refactoring =E2=80=A2 5.3 support =E2=80=A3 Added a trunk CI build, we should be able to consider merging =E2=80=A3 Still need documentation for releases =E2=80=A2 Driver anti-warning 34 code gen =E2=80=A3 Still haven't heard from Janestreet, we need their feedback b= efore moving forward with this =E2=80=A2 Ocamlfind support =E2=80=A3 There seem to be a bug when a ppxlib based ppx is invoked dir= ectly using ocamlfind -package =E2=80=A3 Is this something we want to actively maintain =E2=80=A2 Dune w/ ppx =E2=80=A3 Nathan got back to it, hopefully it should be ready soon =E2=80=A2 Repo hygiene: issue triage =E2=80=A3 We have a lot of issues, most of which are extremely old =E2=80=A3 A lot of issues are actually questions on how to use ppxlib f= or ppx authors =E2=80=A3 It's worth having a go at closing the irrelevant issues and h= ave some classification system for the rest The meeting will be hosted on google meet here: You are welcome to join! Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Creating the SyntaxDocumentation Command - Part 2: OCaml LSP] =E2=80=A2 [MirageVPN server] [the ocaml.org blog] [Creating the SyntaxDocumentation Command - Part 2: OCaml LSP] [MirageVPN server] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 11 to 18, 2024.

    Your opam-repository PRs are now tested on Windows

    Kate announced

    Following the merge of Windows support for the compiler in opam-repository and the= release= of opam 2.2.0~beta3, I'm happy to announce that a basic Windows CI usi= ng Github Actions is now in use in opam-repository, so all your new PRs are= now being tested on Windows too.

    This is a big milestone, however the upstream opam-repository hasn't been t= ested with Windows before and thus many packages lacking the proper availab= ility metadata will fail to build in the next month or so. If you see a pac= kage that is definitely not going to be available on Windows, please do rep= ort it in the o= pam-repository bug-tracker or even better open a PR if you have the tim= e. When opening such PRs/issues, it would help the maintainers to copy/past= e the failing log in the PR description.

    Most such PRs should simply add the following line to the failing package(s= ):

    available: os !=3D "win32"
    

    If you notice any issues in the Github Action itself or want to improve it,= please feel free to open a PRs/issue for that too, the code is available i= n opam-repository/.github/workflows/windows.yml.

    Forester 4.1

    Jon Sterling announced

    I am pleased to announce the release of Forester 4.1 on opam, which is an OCaml utility to de= velop =E2=80=9CForests=E2=80=9D, which are densely interlinked mathematical= websites / Zettelk=C3=A4sten similar to the Stacks project or Kerodo= n . You can see the release notes on my own Fore= st.

    There are a few new features, including a simplified command `forester init= ` to setup a fresh forest.

    Thanks to Kento Okura, Nick Hu, and Trebor Huang for their contributions to= this release.

    fun-sql 0.2.3

    Yawar Amin announced

    I am happy to announce the initial release of fun-sql, a simple functional-= style query library for SQLite and PostgreSQL.

    To use it with SQLite: https://o= caml.org/p/fun-sqlite

    To use it with PostgreSQL: h= ttps://ocaml.org/p/fun-postgresql

    Fun-sql is not an ORM, it's a query execution and data mapping library (som= etimes called a micro-ORM). It does three things:

    1. Create the prepared statement and encode the parameters
    2. Execute the query
    3. Decode the resultset into OCaml types using a set of combinators.

    Here's an example:

    open Fun_postgresql
    
    module Note(Db : sig val db : Postgresql.connection end) =3D open Db
    
      type t =3D { id : int; txt : string }
      let ret =3D ret (fun row ->=
    ; { id =3D int 0 row; txt =3D text 1 row })
    
      (* Prepared statement: *)
      let edit =3D query db "update note set txt =3D $1 where id =3D $2"
    
      (* Use by simply calling it: *)
      let edit id =
    txt =3D edit ~args:Arg.[int id; t=
    ext txt] unit
      (* val edit : int -> string -> =
    unit *)
    
      (* Prepared statement: *)
      let by_id =3D query db "select id, txt from note where id =3D $1"
    
      let by_id id=
     =3D only (by_id ~args:Arg.[int id] ret)
      (* val by_id : int -> t *)
    end
    

    The design enforces the use of prepared statements=E2=80=93indeed, with Pos= tgreSQL, a prepared statement corresponding to a query can be created only = once, so you have to ensure that you use a= pattern like the above.

    MySQL support is also desired and I will get to it at some point unless som= eone beats me to it!

    dream-html and pure-html 3.5.2

    Yawar Amin announced

    Pleased to announce the release of dream-html 3.5.2, which actually spawns = a new package pure-html: https://= ocaml.org/p/pure-html

    This package offers the same functionality as dream-html, except without a Dream dependency, so you can use whatever = web server you like, or even use it for other applications than web servers= . It works exactly the same way as dream-html, except the top-level module = is Pure_html:

    open Pure_html
    open HTML
    
    let content =3D article [] [
      p [] [t=
    xt "Header"];
      p [] [t=
    xt "Body"];
    ]
    

    pure-html has a runtime dependency only on the uri package.

    Control Structures, English translation of lectures by Xavier = Leroy

    unfode announced

    Website.

    Really learned a lot from the slides. For example, the most understandable = definition of continuation I've ever seen:

    Given a control point in a program, its continuation is the sequence of com= putations that remain to be done once the execution reaches the given contr= ol point in order to finish the execution of the whole program.

    Ppxlib dev meetings

    Nathan Rebours announced

    This month's meeting is scheduled today, Tuesday June 18th, at 6:00PM CET.

    Sorry for posting the announcement so late!

    Here is the meeting agenda:

    • 5.2 AST bump
    • Driver Transform refactoring
    • 5.3 support
      • Added a trunk CI build, we should be able to consider merging
      • Still need documentation for releases
    • Driver anti-warning 34 code gen
      • Still haven't heard from Janestreet, we need their feedback before movi= ng forward with this
    • Ocamlfind support
      • There seem to be a bug when a ppxlib based ppx is invoked directly usin= g ocamlfind -package
      • Is this something we want to actively maintain
    • Dune w/ ppx
      • Nathan got back to it, hopefully it should be ready soon
    • Repo hygiene: issue triage
      • We have a lot of issues, most of which are extremely old
      • A lot of issues are actually questions on how to use ppxlib for ppx aut= hors
      • It's worth having a go at closing the irrelevant issues and have some c= lassification system for the rest

    The meeting will be hosted on google meet here: https://meet.google.com/yxw-ejnu-cju

    You are welcome to join!

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=HYpH1KfF; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 4F7F6B80123 for ; Tue, 25 Jun 2024 14:58:49 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=2hh29c5P8WChdJnedPSwh8cmcQTy8QxU0OpmxVDCGBk=; b=HYpH1KfFRZykwoa3pE+MHNM2g0r928R2smF0uKS3ICIYgSp98r4k7kyS CpuAvE6O593r91HZMZrMJAATyxB4YlFvMVzBgmZlIgGCs+sWZ7C/B5gfe buGl45YoyI/QcUQKF/lsyaoHhngZNKUIMFCPZtoFjS5crZprsqiSHirzW k=; Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.08,264,1712613600"; d="scan'208,217";a="172406672" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Jun 2024 15:58:48 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 26856E01A8; Tue, 25 Jun 2024 15:58:48 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D9D38E00B6 for ; Tue, 25 Jun 2024 15:58:43 +0200 (CEST) X-IronPort-AV: E=Sophos;i="6.08,264,1712613600"; d="scan'208,217";a="90593030" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Jun 2024 15:58:44 +0200 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 25 Jun 2024 15:58:43 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19149 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 18 to 25, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 First public editor tooling dev-meeting First release of oma Ppxlib dev meetings CAISAR release 2.0, a platform for characterizing AI safety and robustness First release of baby Preview of Stripe client and mock server - DkStdRestApis opam 2.2.0 rc1 release Project wide occurrences Other OCaml News Old CWN First public editor tooling dev-meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are organizing the first public dev-meeting about Merlin, OCaml-LSP and more generally editor support for OCaml. This meeting will take place on *Thursday, June 27th*, at 05:00 pm CEST. We plan to have these happen every last Thursday of the month. The goal of these meetings is to provide a place for all contributors of these projects to discuss their work together. Whether you are a long time maintainer, an occasional contributor, a new comer, or simply a curious passer-by, please feel free to join and participate! We also plan to have some short technical presentations to help contributors learn more about the projects involved. These won't be systematic, and if you are interested in a particular subject feel free to ask about it or to propose a presentation. The agenda for this first meeting, which will be focused on the burning topic of project-wide occurrences, is the following: =E2=80=A2 A tour-de-table to allow the participants that wish to do so to present themselves and mention issues / prs they are interested in. =E2=80=A2 A presentation of current on-going projects. =E2=80=A2 A focus on project-wide occurrences: how does it work, what are= the tools that need to interact together and what are its current limitations and possible future improvements. =E2=80=A2 Discuss issues and pull requests that were tagged in advance or mentioned during the tour-de-table. =E2=80=A2 Informal discussion We looking forward to meeting you! Meeting link: First release of oma =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I have just published a new release of `oma' with the following fixes and changes: =E2=80=A2 New functions `invalidate_open_interval' and `invalidate_semi_open_interval'. =E2=80=A2 Fix a serious bug in `Unsafe.first' and `Unsafe.last', which wo= uld incorrectly return `None' when the region contains only one point. =E2=80=A2 Fix a serious bug in `Unsafe.iter', which would systematically = omit the last point of the region. Ppxlib dev meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Meeting notes are available here: . Thanks to everyone who attended! Our next meeting is scheduled for Tuesday July 16th, 6:00PM CET! CAISAR release 2.0, a platform for characterizing AI safety and robustness =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Julien Girard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On the occasion of the 34th birthday of the [abolition of the apartheid laws], we are honoured to release CAISAR version 2.0. The release source is available at our [public forge]. As our last releases, CAISAR will soon be available on [opam] and on [Dockerhub]. A nix flake is available for building CAISAR directly in the repository. Try CAISAR with `nix build git+https://git.frama-c.com/pub/caisar'! Here are the prominent features for this 2.0 release: [abolition of the apartheid laws] [public forge] [opam] [Dockerhub] Specification and verification of several neural networks at once =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C CAISAR specification language already allowed to write specifications that involved several neural networks at once. However, translating such specifications to actual prover queries was not possible. We added automated graph editing techniques to allow such verification to take place. Within particular patterns, CAISAR will generate an ONNX file that preserve the semantic of the different neural networks while encapsulating parts of the specification directly in the control flow of the new neural network. This feature allow the verification of properties with multiple neural networks, including their composition. This is quite a step forward, as it enables machine-learning dedicated verifiers to tackle a much wider range of properties. SVM as first-class citizens for interpretation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C CAISAR now fully integrate SVMs into the interpretation engine. Users can expect vector computations and applications on SVMs to be computed similarly as what exists already for neural networks. We also unified the theory of machine learning models. Now, SVMs and neural networks can be specified with only the `model' type. In the near future, SVMs will be parsed directly into CAISAR=E2=80=99s Neural Intermediate Representations, which will simplify the verification of systems with heterogeneous AI components. First release of baby =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 It is my pleasure to announce the first release of `baby'. `baby' is an OCaml library that offers several implementations of balanced binary search trees. At this time, `baby' offers a replacement for OCaml's `Set' module; it does not yet have a replacement for OCaml's `Map' module. Height-balanced and weight-balanced binary search trees are offered out of the box. Furthermore, to advanced users, the library offers a lightweight way of implementing other balancing strategies. The following points offer a comparison between `baby' and OCaml's `Set' library. Better Performance =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C At the time of writing, `baby' offers generally better performance than OCaml's `Set' library. Its operations are generally faster (sometimes much faster; sometimes slightly faster; sometimes slightly slower) than those of the `Set' library, and its memory allocation rate is slightly lower. Constant-Time Cardinal =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In contrast with the `Set' library, `baby''s weight-balanced trees offer a `cardinal' function whose time complexity is *O(1)*. They also offer a family of random access functions (`get', `index', etc.) whose time complexity is *O(log n)*. Furthermore, by exploiting cardinality information, the functions `subset' and `equal' are sometimes able to return `false' in constant time. Better Sharing =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `baby''s binary operations (`union', `inter', `diff') take advantage of (and preserve) physical equality in a more aggressive way. This allows them to (sometimes) be faster and allocate less memory. Adaptive Conversions To Sets =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C `baby''s conversion functions `of_list', `of_array', and `of_seq' have adaptive complexity. If the input data is sorted, their complexity is *O(n)*; otherwise, their complexity gracefully degrades down to *O(n.log n)*. More Operations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `baby' offers a few operations that do not exist in OCaml's `Set' library: =E2=81=83 The symmetric difference, `xor'; =E2=81=83 The conversion functions `of_array' and `to_array'; =E2=81=83 The extremum-removal functions `remove_min_elt' and `remove_max_elt'; =E2=81=83 The enumeration API in the submodule `Enum'. Enumerations shoul= d be slightly faster than standard sequences, and are able to efficiently seek ahead, via the function `from'. Documented Complexity =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In `baby', the time complexity of every operation is documented. Compatibility =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `baby' is perfectly compatible with OCaml's Set library. In other words, using `Baby.W.Set' instead of `Set' is safe. As a word of warning, though, if the equivalence relation on elements is coarser than equality (that is, if `compare x y =3D 0' does not imply `x =3D y'), then `Baby.W.Set' and `Set' might behave differently when a choice must be made between two equivalent elements. This can occur in `union', `of_list', `of_array', `of_seq', `add_seq', `map'. Preview of Stripe client and mock server - DkStdRestApis =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am pleased to announce that Stripe is the first REST API available in the DkStdRestApis project: That README has a 10-minute quick start; you can do it with or without a Stripe account. The Stripe client and mock server have Apache 2.0 licensing and were generated using a new OpenAPI code generator. The code generator is not part of this preview announcement (wait until DkCoder 0.4 announcement) but since there have been a couple generators released in the past month perhaps it is best to say what is different: 1. Both client and server source code are generated. The client examples include direct web requests by cohttp-lwt-curl (`src/DkStdRestApis_NotStripe/Curl2.ml') and also indirectly by printing the `curl -d name=3Dvalue https://api.stripe.com/...' command (`src/DkStdRestApis_NotStripe/CurlCmd.ml'). The mock server example (`src/DkStdRestApis_NotStripe/ServerTiny.ml') uses @c-cube 's [excellent tiny_httpd daemon]. 2. Very small dependency cone that works on Windows/macOS/Linux (including the REST server). And the minimum OCaml version will be 4.14 for the foreseeable future. 3. My focus is not on the code generator but having working, maintainable REST clients for the major cloud/SaaS services that can be included in DkCoder's liberally licensed standard library. The server feature was a pleasant but very unplanned accident. If I do take time to develop fancier server features (ex. replaying mocks from a corpus, etc.) those additions will not be open source. 4. It is intended to have high coverage of OpenAPI features. Today that includes form URL encoding, sum types, server-side polymorphism and style/explode support. The only major feature that is intentionally unsupported is the `not' composition operator (have no idea how to express negation in OCaml's type system!). Now for the problems: 1. Stripe only compiles in bytecode mode. Why? The generated modules are huge (8+ MB in total) because Stripe's specification is 6MB. Native compilation [can't handle that today]. 2. I'm not releasing to opam until I'm sure that native compilation won't denial-of-service developer and opam machines. I'm also waiting for some Windows patches to dependencies to be released. Thanks to @vlaviron for helping solve some of the compilation scaling problems. And thanks to Nomadic Labs (and OCamlPro?) for developing [Json_encoding] and @anuragsoni for developing [Routes]; they are both bidirectional + lightweight + foundational. Report bugs / add stars [in the DkCoder project]. [excellent tiny_httpd daemon] [can't handle that today] [Json_encoding] [Routes] [in the DkCoder project] opam 2.2.0 rc1 release =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: R. Boujbel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 We=E2=80=99re once again very excited to announce this first release cand= idate (and hopefully only) for opam 2.2.0. What=E2=80=99s new in this rc? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Fix `opam upgrade' wanting to keep rebuilding the compiler (as = now it contains an `x-env-path-rewrite' field) =E2=80=A2 Provide defaults so `opam init -y' no longer asks questions on Windows =E2=80=A2 Fix `OpamConsole.menu' when there are more than 9 options (can happen on Windows) =E2=80=A2 A couple more fixes and general improvements :open_book: You can read our [blog post ] for more information about these changes and more, and for even more details you can take a look at the [release note ] or the [changelog]. [blog post ] [release note ] [changelog] Windows issues =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Configuration of Windows is tricky, so please don=E2=80=99t be too disheartened if things don=E2=80=99t work instantly. If something doesn= =E2=80=99t work first time, [please do report it ], even if you manage to find a way to workaround it. If opam didn=E2=80=99t elegantly tell you what was wron= g, then it=E2=80=99s a bug and we=E2=80=99d love to hear about it, rather th= an ending up with a series of workarounds flying around. It=E2=80=99s no problem at al= l for us to receive a bug report which turns out to be user error - we=E2=80=99= d far rather that than not hear bugs which are opam=E2=80=99s error! :scream_ca= t: [please do report it ] How to upgrade =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocam= l/opam/master/shell/install.sh) --version 2.2.0~rc1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubus= ercontent.com/ocaml/opam/master/shell/install.ps1) }" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We=E2=80=99re planning for a final opam 2.2.0 release next week, so pleas= e do report any issue you encounter on our [bug-tracker ]. [bug-tracker ] Project wide occurrences =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am very excited to announce the first release of Merlin and Ocaml-LSP with support for project-wide occurrences =F0=9F=A5=B3. More precisely, it is now possible to query for every _usage_ of any value (and type, modules, etc.) anywhere in a project built with Dune. This is a very handy tool for code navigation ! Requirements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 OCaml 5.2 =E2=80=A2 Latest Dune (>=3D `3.16.0') =E2=80=A2 Latest Merlin (>=3D `5.1-502') =E2=80=A2 Latest OCaml-LSP preview (`1.18.0~5.2preview') Usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Build the new `@ocaml-index' alias. > We recommend running the indexation in watch mode along with your usual targets: `dune build @ocaml-index --watch' so that the index is always up to date. =E2=80=A2 Use the `Find/Peek all references' feature of LSP-based plugins =E2=80=A2 or `merlin-project-occurrences' in emacs =E2=80=A2 or `OccurrencesProjectWide' in vim. =E2=80=A2 Enjoy jumping around =F0=9F=A6=98 More information and bug reports =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Bug reports and feature requests should be submitted to the Merlin [issue tracker]. There are already some known issues like the absence of declarations in the results and the impossibility to query from a declaration. Progress on occurrences can be tracked in a [pinned meta-issue]. If you are interested in contributing and learning more about the feature do not hesitate to join the [first public dev-meeting] on Thursday ! [issue tracker] [pinned meta-issue] [first public dev-meeting] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Keeping Up With the Compiler: How we Help Maintain the OCaml Language] [the ocaml.org blog] [Keeping Up With the Compiler: How we Help Maintain the OCaml Language] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 18 to 25, 2024.

    First public editor tooling dev-meeting

    vds announced

    We are organizing the first public dev-meeting about Merlin, OCaml-LSP and = more generally editor support for OCaml. This meeting will take place on Thur= sday, June 27th, at 05:00 pm CEST. We plan to have these happen every last Thursday of the m= onth.

    The goal of these meetings is to provide a place for all contributors of th= ese projects to discuss their work together. Whether you are a long time mainta= iner, an occasional contributor, a new comer, or simply a curious passer-by, plea= se feel free to join and participate!=20

    We also plan to have some short technical presentations to help contributors learn more about the projects involved. These won't be systematic, and if you are interested in a particular subject feel free to ask about it or = to propose a presentation.

    The agenda for this first meeting, which will be focused on the burning top= ic of project-wide occurrences, is the following:

    • A tour-de-table to allow the participants that wish to do so to present= themselves and mention issues / prs they are interested in.
    • A presentation of current on-going projects.
    • A focus on project-wide occurrences: how does it work, what are the too= ls that need to interact together and what are its current limitations and = possible future improvements.
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.
    • Informal discussion

    We looking forward to meeting you!

    Meeting link: https://meet= .google.com/imo-mkxi-hpt

    First release of oma

    Fran=C3=A7ois Pottier announced

    I have just published a new release of oma with the following = fixes and changes:

    • New functions invalidate_open_interval and invalidat= e_semi_open_interval.
    • Fix a serious bug in Unsafe.first and Unsafe.last, which would incorrectly return None when the region cont= ains only one point.
    • Fix a serious bug in Unsafe.iter, which would systematical= ly omit the last point of the region.

    Ppxlib dev meetings

    Nathan Rebours announced

    Meeting notes are available here: https://github.com/ocaml-ppx/ppxlib/wiki= /Dev-Meeting-2024-06-18.

    Thanks to everyone who attended!

    Our next meeting is scheduled for Tuesday July 16th, 6:00PM CET!

    CAISAR release 2.0, a platform for characterizing AI safety an= d robustness

    Julien Girard announced

    On the occasion of the 34th birthday of the abolition of the apartheid= laws, we are honoured to release CAISAR version 2.0.

    The release source is available at our public forge. As our last releases, CAISAR wi= ll soon be available on opam and on Dockerh= ub.

    A nix flake is available for building CAISAR directly in the repository. Tr= y CAISAR with nix build git+https://git.frama-c.com/pub/caisar!

    Here are the prominent features for this 2.0 release:

    Specification and verification of several neural netw= orks at once

    CAISAR specification language already allowed to write specifications that = involved several neural networks at once. However, translating such specifi= cations to actual prover queries was not possible. We added automated graph= editing techniques to allow such verification to take place. Within partic= ular patterns, CAISAR will generate an ONNX file that preserve the semantic= of the different neural networks while encapsulating parts of the specific= ation directly in the control flow of the new neural network. This feature = allow the verification of properties with multiple neural networks, includi= ng their composition.

    This is quite a step forward, as it enables machine-learning dedicated veri= fiers to tackle a much wider range of properties.

    SVM as first-class citizens for interpretation

    CAISAR now fully integrate SVMs into the interpretation engine. Users can e= xpect vector computations and applications on SVMs to be computed similarly= as what exists already for neural networks.

    We also unified the theory of machine learning models. Now, SVMs and neural= networks can be specified with only the model type. In the ne= ar future, SVMs will be parsed directly into CAISAR=E2=80=99s Neural Interm= ediate Representations, which will simplify the verification of systems wit= h heterogeneous AI components.

    First release of baby

    Fran=C3=A7ois Pottier announced

    It is my pleasure to announce the first release of baby.

    baby is an OCaml library that offers several implementations o= f balanced binary search trees. At this time, baby offers a re= placement for OCaml's Set module; it does not yet have a repla= cement for OCaml's Map module.

    Height-balanced and weight-balanced binary search trees are offered out of = the box. Furthermore, to advanced users, the library offers a lightweight w= ay of implementing other balancing strategies.

    The following points offer a comparison between baby and OCaml= 's Set library.

    Better Performance

    At the time of writing, baby offers generally better performan= ce than OCaml's Set library. Its operations are generally fast= er (sometimes much faster; sometimes slightly faster; sometimes slightly sl= ower) than those of the Set library, and its memory allocation= rate is slightly lower.

    Constant-Time Cardinal

    In contrast with the Set library, baby's weight-b= alanced trees offer a cardinal function whose time complexity = is O(1). They also offer a family of random access functions (= get, index, etc.) whose time complexity is O(log n)<= /b>. Furthermore, by exploiting cardinality information, the functions subset and equal are sometimes able to return f= alse in constant time.

    Better Sharing

    baby's binary operations (union, inter, diff) take advantage of (and preserve) physical equality i= n a more aggressive way. This allows them to (sometimes) be faster and allo= cate less memory.

    Adaptive Conversions To Sets

    baby's conversion functions of_list, of_arr= ay, and of_seq have adaptive complexity. If the input d= ata is sorted, their complexity is O(n); otherwise, their complexity= gracefully degrades down to O(n.log n).

    More Operations

    baby offers a few operations that do not exist in OCaml's Set library:

    • The symmetric difference, xor;
    • The conversion functions of_array and to_array;
    • The extremum-removal functions remove_min_elt and re= move_max_elt;
    • The enumeration API in the submodule Enum. Enumerations sh= ould be slightly faster than standard sequences, and are able to efficientl= y seek ahead, via the function from.

    Documented Complexity

    In baby, the time complexity of every operation is documented.

    Compatibility

    baby is perfectly compatible with OCaml's Set library. In othe= r words, using Baby.W.Set instead of Set is safe.

    As a word of warning, though, if the equivalence relation on elements is co= arser than equality (that is, if compare x y =3D 0 does not im= ply x =3D y), then Baby.W.Set and Set might behave differently when a choice must be made between two equivalen= t elements. This can occur in union, of_list, of_array, of_seq, add_seq, map.

    Preview of Stripe client and mock server - DkStdRestApis

    jbeckford announced

    I am pleased to announce that Stripe is the first REST API available in the= DkStdRestApis project:

    ht= tps://github.com/diskuv/DkStdRestApis?tab=3Dreadme-ov-file

    That README has a 10-minute quick start; you can do it with or without a St= ripe account.

    The Stripe client and mock server have Apache 2.0 licensing and were genera= ted using a new OpenAPI code generator. The code generator is not part of t= his preview announcement (wait until DkCoder 0.4 announcement) but since th= ere have been a couple generators released in the past month perhaps it is = best to say what is different:

    1. Both client and server source code are generated. The client examples i= nclude direct web requests by cohttp-lwt-curl (src/DkStdRestApis_NotS= tripe/Curl2.ml) and also indirectly by printing the curl -d na= me=3Dvalue https://api.stripe.com/... command (src/DkStdRestAp= is_NotStripe/CurlCmd.ml). The mock server example (src/DkStdRe= stApis_NotStripe/ServerTiny.ml) uses @c-cube 's excellent tiny_httpd daemon.
    2. Very small dependency cone that works on Windows/macOS/Linux (including= the REST server). And the minimum OCaml version will be 4.14 for the fores= eeable future.
    3. My focus is not on the code generator but having working, maintainable = REST clients for the major cloud/SaaS services that can be included in DkCo= der's liberally licensed standard library. The server feature was a pleasan= t but very unplanned accident. If I do take time to develop fancier server = features (ex. replaying mocks from a corpus, etc.) those additions will not= be open source.
    4. It is intended to have high coverage of OpenAPI features. Today that in= cludes form URL encoding, sum types, server-side polymorphism and style/exp= lode support. The only major feature that is intentionally unsupported is t= he not composition operator (have no idea how to express negat= ion in OCaml's type system!).

    Now for the problems:

    1. Stripe only compiles in bytecode mode. Why? The generated modules are h= uge (8+ MB in total) because Stripe's specification is 6MB. Native compilat= ion can't handle th= at today.
    2. I'm not releasing to opam until I'm sure that native compilation won't = denial-of-service developer and opam machines. I'm also waiting for some Wi= ndows patches to dependencies to be released.

    Thanks to @vlaviron for helping solve some of the compilation scaling probl= ems. And thanks to Nomadic Labs (and OCamlPro?) for developing Json_encoding and @anu= ragsoni for developing Routes; they are both bidirectional + lightweight + foundat= ional.

    Report bugs / add stars in th= e DkCoder project.

    opam 2.2.0 rc1 release

    R. Boujbel announced

    We=E2=80=99re once again very excited to announce this first release candid= ate (and hopefully only) for opam 2.2.0.

    What=E2=80=99s new in this rc?

    • Fix opam upgrade wanting to keep rebuilding the compiler (= as now it contains an x-env-path-rewrite field)
    • Provide defaults so opam init -y no longer asks questions = on Windows
    • Fix OpamConsole.menu when there are more than 9 options (c= an happen on Windows)
    • A couple more fixes and general improvements

    :open_book: You can read our blog post for more information about these changes and more,= and for even more details you can take a look at the release note or the changelog.

    Windows issues

    Configuration of Windows is tricky, so please don=E2=80=99t be too disheart= ened if things don=E2=80=99t work instantly. If something doesn=E2=80=99t w= ork first time, please do = report it , even if you manage to find a way to workaround it. If opam = didn=E2=80=99t elegantly tell you what was wrong, then it=E2=80=99s a bug a= nd we=E2=80=99d love to hear about it, rather than ending up with a series = of workarounds flying around. It=E2=80=99s no problem at all for us to rece= ive a bug report which turns out to be user error - we=E2=80=99d far rather= that than not hear bugs which are opam=E2=80=99s error! :scream_cat:

    How to upgrade

    For Unix systems

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.2.0~rc1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubuserconten=
    t.com/ocaml/opam/master/shell/install.ps1) }"
    

    We=E2=80=99re planning for a final opam 2.2.0 release next week, so please = do report any issue you encounter on our bug-tracker .

    Project wide occurrences

    vds announced

    I am very excited to announce the first release of Merlin and Ocaml-LSP wit= h support for project-wide occurrences =F0=9F=A5=B3. More precisely, it is = now possible to query for every usage of a= ny value (and type, modules, etc.) anywhere in a project built with Dune. T= his is a very handy tool for code navigation !

    Requirements

    • OCaml 5.2
    • Latest Dune (>=3D 3.16.0)
    • Latest Merlin (>=3D 5.1-502)
    • Latest OCaml-LSP preview (1.18.0~5.2preview)

    Usage

    • Build the new @ocaml-index alias.

    > We recommend running the indexation in watch mode along with your usua= l targets: dune build @ocaml-index --watch so that the index i= s always up to date.

    • Use the Find/Peek all references feature of LSP-based plu= gins=20
      • or merlin-project-occurrences in emacs
      • or OccurrencesProjectWide in vim.
    • Enjoy jumping around =F0=9F=A6=98

    3D"c282815986f=

    More information and bug reports

    Bug reports and feature requests should be submitted to the Merlin issue tracker. There are al= ready some known issues like the absence of declarations in the results and= the impossibility to query from a declaration. Progress on occurrences can= be tracked in a pi= nned meta-issue. If you are interested in contributing and learning mor= e about the feature do not hesitate to join the first pub= lic dev-meeting on Thursday !

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=J6TjOPOj; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=zWA+Alnp; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 320CFB80123 for ; Tue, 2 Jul 2024 08:30:33 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=JPWxABOzLDCpA7DgnfU0QxKAjFqEHxXhPGAZZ2Lvmio=; b=J6TjOPOjzv5SbSA2vh9xFKkvDZCZsTyfyCTzc2IureqTeCssnUuSXbow kxynmFFTCbhxQSxvjt682RLPIA78IyB0BnBItrJAmw7/kAzMildkQDErJ 2j6q22Jo7LP8tn5I6diLbl3yCRGX47Y6Cbfd03D/GMpbHimlywvyv9ngM 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,178,1716242400"; d="scan'208,217";a="173434781" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 Jul 2024 09:30:33 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id BAFBEE0D1C; Tue, 2 Jul 2024 09:30:32 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 526F0E00B6 for ; Tue, 2 Jul 2024 09:30:28 +0200 (CEST) IronPort-SDR: 6683ac93_B2uyXx9umPHpnL4FCL7V4BtdtEfP6OJAhXjNxb2btLtIqle ZV3RfbZDGIVKhiQyKnBIfkS/1e2x8OoNPUqcjpg== X-IPAS-Result: =?us-ascii?q?A0HwBAAaq4NmjCIeaIFaHgE8DAILgWSBQYEDGQFcBlozB?= =?us-ascii?q?whIhFaDT4UtiG6BFpAxinOBVhSBEQMYFiMUAQMBDS4BDgQBAgQBAQMBAgGEf?= =?us-ascii?q?wIWiHgCHwYBBDEIDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQA?= =?us-ascii?q?QEBAUAQNYV0DYJKLiM/Eh5hBAMGBgEBAQEBAQEBAQEBAQEBIgEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECDAFCZQoTAQE4G?= =?us-ascii?q?CMDEAQBBgMCBA0BNRcBEhQGgmYBgh9FAwQBDAY/j26bPHqBMoEBggwBAQaBC?= =?us-ascii?q?D4CAQsCBQEOCSbaBIEZSgmBSIgXGgEkSGkChCUJhDcnD4FVRIEVgnIHb4I/C?= =?us-ascii?q?xcBAQEBgTwBAQYCRQmDJYJphgeCAwGFSU4IfoIkQYEUOi4BgXVGcoIRD4EoB?= =?us-ascii?q?WkECyZmf1cPgg8UQgIMgUiBPn8mC4EcEItvgUkiAyYzIRMBVRMXCz4dAhYDG?= =?us-ascii?q?xQEMA8JCyYpBjkCEgwGBgZZNAkEIwMIBANCAyBxEQMEGgQLB3eBPIFpBBNEA?= =?us-ascii?q?4E3hxuCUYM5ghuEGkuEboFrDGGIBIFxgT6BYkyDAEqEeh1AAwttPTUUG6oaB?= =?us-ascii?q?DcCgwImDj4BPSQCGBMBKQIgAi4EBDkKGAEmDhsuAQsLApJzKI9LjgaUUjQHh?= =?us-ascii?q?BaBXAYMiH2BJJVvhAWBVosqhnuRGIEhIpgHPiCCNIcegSUJggtLiGqMHDwHA?= =?us-ascii?q?RoXhRqBaQE3SYEADAczGjBDgmcJRhwPji0WgjqBHhCBLoEmgXU7xTlBNQIBA?= =?us-ascii?q?TcCBwEKAQEDCYVFHQEBgz6BSgEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:HIgs4azfWnHT5w5DFOnzKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: =?us-ascii?q?9a23=3ALCgW0Wm0zwacp2TH0d0pc0YNX/nXOU3GkzSJemm?= =?us-ascii?q?XNWtKUJ3FZHCU1PI4iMU7zg=3D=3D?= X-Talos-MUID: 9a23:BZcv6wlXWFesajF3ynjIdno+GspU5Y33CXpSgLQGtPCBDChtAm6S2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,178,1716242400"; d="scan'208,217";a="173434743" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEQYlHfhtXwqQb8rC0x0ZmlNCGVLKx53F5etv?= =?us-ascii?q?WHlzZ0wH+/vt4oyzMVRT7a/gwRgc4WFLey6owQ1NPCuR+d7HohGdxtzX?= =?us-ascii?q?1qzcAfElJHyPZgYPhCTs0bVy9F5FjvqFt1klH/s+nbnHlRpDA/3KL3KF?= =?us-ascii?q?DzTTmfGG7JnmdgkXVTZSHDsQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Jul 2024 09:30:27 +0200 Received: from TM.local (88-121-115-170.subs.proxad.net [88.121.115.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3CEBA5647FF; Tue, 2 Jul 2024 09:30:25 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1719905426; bh=vThvWpH27FxhjMEr9Yza1QirYNoKeKpk9cW3+kWArkI=; h=From:To:Subject:Date:Message-ID; b=zWA+AlnpDeDcINSQoB7K+T1oyr6v1f4Z+hFTv2wUNkzjS3KVowfc15odgNpu7ANXt g2Ad46/kWYN8giaAFSVULMtOiD/PAlcSsj7x8I14SsSZ6d+qeqNEmfXtIBfS7uLHc+ 6pJ/0SU23bhfHkN5ejb8T1BwPlLw0alxyyOVpN4k= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 02 Jul 2024 09:30:24 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 2 09:30:26 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.445895, queueID=5FD22564802 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19152 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyNSB0byBKdWx5DQowMiwgMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPQ2Ft bCBUZWNoIFRhbGsgfCBFZGl0b3IgRmVhdHVyZXMNCk5ldyByZWxlYXNlIG9mIE9jc2lwZXJzaXN0 DQpQcmV2aWV3IG9mIEdvZG90Y2FtbCBmb3IgdGhlIEdvZG90IDQuMiBHYW1lIEVuZ2luZQ0KZXVs ZXIgMC4zDQpkdW5lIDMuMTUNCmR1bmUgMy4xNg0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0K DQoNCk9DYW1sIFRlY2ggVGFsayB8IEVkaXRvciBGZWF0dXJlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtdGVjaC10YWxrLWVkaXRvci1mZWF0dXJlcy8xNDc0Ni81 Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFBpemllRHVzdCBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFRoZSB2aWRlbyBpcyBub3cgdXBsb2FkZWQgb24gWW91VHViZSBhdDog W09jYW1sIHwgRWRpdG9yIEZlYXR1cmVzXQ0KDQoNCltPY2FtbCB8IEVkaXRvciBGZWF0dXJlc10g PGh0dHBzOi8veW91dHUuYmUvSS1lM3F6UHp6dUk+DQoNCg0KTmV3IHJlbGVhc2Ugb2YgT2NzaXBl cnNpc3QNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1yZWxlYXNlLW9mLW9jc2lwZXJzaXN0LzE0ODc0LzE+ DQoNCg0KVmluY2VudCBCYWxhdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtPY3NpcGVy c2lzdF0gaGFzIGJlZW4gcmVjZW50bHkgdXBkYXRlZC4NCg0KICBPY3NpcGVyc2lzdCBpcyBhbiBP Q2FtbCBpbnRlcmZhY2UgZm9yIGtleS12YWx1ZSBzdG9yZXMsIHdpdGggdGhyZWUNCiAgaW1wbGVt ZW50YXRpb25zIGJhc2VkIG9uIFNRTGl0ZSwgREJNIGFuZCBQb3N0Z3JlU1FMLg0KDQogIEl0IHBy b3Bvc2VzIHNldmVyYWwgaW50ZXJmYWNlczogYmFzaWMgc3RyaW5nIHRvIHN0cmluZyB0YWJsZXMs IHR5cGVkDQogIHRhYmxlcyB3aXRoIGN1c3RvbSAoZGUpc2VyaWFsaXNhdGlvbiBmdW5jdGlvbnMs IHBlcnNpc3RlbnQgdmFyaWFibGVzIOKApg0KDQogIFRoaXMgbmV3IHZlcnNpb24gMi4wLjAsIGFk ZHMgdGhlIGZvbGxvd2luZyBmZWF0dXJlczoNCiAg4oCjIHNvbWUgZGVwZW5kZW5jaWVzIHJlbW92 ZWQNCiAg4oCjIEJhc2ljIGludGVyZmFjZSBmb3IgcGVyc2lzdGVudCByZWZlcmVuY2VzLCBpbiB0 aGUgc3R5bGUgb2YgRWxpb20ncw0KICAgIFtzY29wZWQgcmVmZXJlbmNlc10gKGJ1dCB3aXRob3V0 IHNjb3BlKQ0KDQogIEV4YW1wbGUgb2YgdXNlIG9mIHBlcnNpc3RlbnQgcmVmZXJlbmNlcyBmcm9t IHRoZSB0b3BsZXZlbCwgd2l0aCB0aGUNCiAgc3FsaXRlIGJhY2tlbmQ6DQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgIyAjcmVxdWlyZSAibHd0X3BweCI7Ow0KICDilIIgKCogI3RocmVhZDs7IGlm IHlvdSBhcmUgdXNpbmcgT0NhbWwgPCA1LjAuMCAqKQ0KICDilIIgIyAjcmVxdWlyZSAib2NzaXBl cnNpc3Qtc3FsaXRlIjs7DQogIOKUgiAjIE9jc2lwZXJzaXN0LmluaXQgKCk7Ow0KICDilIIgIyBs ZXQgciA9IE9jc2lwZXJzaXN0LlJlZi5yZWYgfnBlcnNpc3RlbnQ6InIiIDQ0NDs7DQogIOKUgiB2 YWwgciA6IGludCBPY3NpcGVyc2lzdC5SZWYudCA9IDxhYnN0cj4NCiAg4pSCICMgTHd0X21haW4u cnVuIChsZXQlbHd0IHYgPSBPY3NpcGVyc2lzdC5SZWYuZ2V0IHIgaW4gcHJpbnRfaW50IHY7IEx3 dC5yZXR1cm5fdW5pdCk7Ow0KICDilIIgNDQ0LSA6IHVuaXQgPSAoKQ0KICDilJTilIDilIDilIDi lIANCg0KICBCYWNrZW5kczogQ2hvb3NlIHRoZSBiYWNrZW5kIHlvdSBwcmVmZXIgYnkgdXNpbmcg cGFja2FnZXMNCiAgYG9jc2lwZXJzaXN0LXNxbGl0ZScsIGBvY3NpcGVyc2lzdC1kYm0nIG9yIGBv Y3NpcGVyc2lzdC1wb3N0Z3Jlc3FsJy4NCg0KICBDb25maWd1cmF0aW9uOg0KICDigKMgVXNlIG1v ZHVsZSBgT2NzaXBlcnNpc3Rfc2V0dGluZ3MnLCBwcm92aWRlZCBieSBlYWNoIGJhY2tlbmQgdG8N CiAgICBjb25maWd1cmUgdGhlIGRhdGFiYXNlDQogIOKAoyBPcGFtIHBhY2thZ2VzIGBvY3NpcGVy c2lzdC1zcWxpdGUtY29uZmlnJywgYG9jc2lwZXJzaXN0LWRibS1jb25maWcnDQogICAgb3IgYG9j c2lwZXJzaXN0LXBvc3RncmVzcWwtY29uZmlnJyBtYWtlIGl0IHBvc3NpYmxlIHRvIGNvbmZpZ3Vy ZSB0aGUNCiAgICBiYWNrZW5kIGZyb20gT2NzaWdlbiBTZXJ2ZXIncyBjb25maWcgZmlsZSAoYnJl YWtpbmcgY2hhbmdlOiB0aGlzIHdhcw0KICAgIHByb3ZpZGVkIGJ5IGBvY3NpcGVyc2lzdC1zcWxp dGUnLCBgb2NzaXBlcnNpc3QtZGJtJyBvcg0KICAgIGBvY3NpcGVyc2lzdC1wb3N0Z3Jlc3FsJyBi ZWZvcmUuIFlvdSdsbCBuZWVkIHRvIHVwZGF0ZSB5b3VyDQogICAgY29uZmlndXJhdGlvbiBmaWxl cykuDQoNCg0KW09jc2lwZXJzaXN0XSA8aHR0cHM6Ly9vY3NpZ2VuLm9yZy9vY3NpcGVyc2lzdC8+ DQoNCltzY29wZWQgcmVmZXJlbmNlc10NCjxodHRwczovL29jc2lnZW4ub3JnL2VsaW9tL2xhdGVz dC9hcGkvc2VydmVyL0VsaW9tX3JlZmVyZW5jZT4NCg0KDQpQcmV2aWV3IG9mIEdvZG90Y2FtbCBm b3IgdGhlIEdvZG90IDQuMiBHYW1lIEVuZ2luZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tcHJldmlldy1vZi1nb2RvdGNhbWwtZm9yLXRoZS1nb2RvdC00LTItZ2FtZS1lbmdpbmUvMTQ4 NzUvMT4NCg0KDQpNYXR0IFdhbGtlciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkndmUgcmVsZWFz ZWQgYSBzbWFsbCBwcmV2aWV3IG9mIGEgcHJvamVjdCBJJ3ZlIGJlZW4gd29ya2luZyBvbi4gIEl0 J3MNCiAgYmluZGluZ3MgdG8gdGhlIEdvZG90IDQuMiBnYW1lIGVuZ2luZSBmcm9tIE9DYW1sLg0K DQogIFRvIGtlZXAgdGhpcyBhbm5vdW5jZW1lbnQgc2hvcnQsIEkndmUgcG9zdGVkIGEgbG9uZ2Vy IGV4cGxhbmF0aW9uIG9uDQogIG15IGJsb2c6DQoNCiAgPGh0dHBzOi8vZml6eml4bmVyZC5jb20v YmxvZy8yMDI0LTA2LTI0LWFubm91bmNpbmctZ29kb3RjYW1sLz4NCg0KICBIZXJlIGlzIHRoZSBn aXQgcmVwbzoNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL0ZpenppeG5lcmQvZ29kb3RjYW1sPg0K DQogIEhlcmUgaXMgYW5vdGhlciBzaG9ydCBibG9nIHBvc3QgZXhwbGFpbmluZyBob3cgdG8gZ2V0 IHVwIGFuZCBzdGFydGVkDQogIHdpdGggaXQ6DQoNCiAgPGh0dHBzOi8vZml6eml4bmVyZC5jb20v YmxvZy8yMDI0LTA2LTI4LWdvZG90Y2FtbC1iYXNpYy1zZXR1cC8+DQoNCiAgRG8gbm90IGV4cGVj dCBtdWNoLCBJJ3ZlIGJhc2ljYWxseSBqdXN0IHJlYWNoZWQgdGhlIHBvaW50IHdoZXJlIEdvZG90 DQogIGFuZCBPQ2FtbCBjYW4gY2FsbCBlYWNoIG90aGVyLiAgSSBqdXN0IHRob3VnaHQgcGVvcGxl IG1pZ2h0IHRoaW5rIGl0J3MNCiAgY29vbCEgIE9wZW4gaXNzdWVzIG9yIGRpc2N1c3MgaW4gdGhp cyB0aHJlYWQgaWYgeW91J2QgbGlrZTsgYW5vdGhlcg0KICBibG9nIHBvc3Qgd2lsbCBiZSBmb3J0 aGNvbWluZyBjb3ZlcmluZyB0aGUgY3VycmVudCBzdHJ1Y3R1cmUgb2YgdGhlDQogIGNvZGUgaWYg dGhlcmUgc2VlbXMgdG8gYmUgaW50ZXJlc3QuDQoNCg0KZXVsZXIgMC4zDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1ldWxlci0wLTMvMTQ4NzcvMT4NCg0KDQpnbGVuIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8g YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgRXVsZXIgdmVyc2lvbg0KICAwLjMuIDpzbGlnaHRfc21p bGU6DQoNCiAgRXVsZXIgaXMgYW4gYXJpdGhtZXRpYyBsaWJyYXJ5IGZvciBPQ2FtbCBpbnRlZ2Vy cy4gRm9yIG1vcmUgZGV0YWlscywNCiAgcGxlYXNlIHJlYWQgKlt0aGUgcmVwb10q4oCL4oCZcyBS RUFETUUgb3IgYnJvd3NlICpbdGhlIGRvY3NdKi4NCg0KICBJbiB2ZXJzaW9uIDAuMzoNCiAg4oCi IHNvbWUgYW1vdW50IG9mIG9wdGltaXphdGlvbiAoOm1hZ2ljX3dhbmQ6IG1hZ2ljIHRyaWNrcyB0 byBjb21wdXRlDQogICAgbG9nYXJpdGhtcywgc2VlIHNvdXJjZSBjb2RlIG9mIFtgbG9nMnN1cCdd IGFuZCBbYGxvZ3N1cCddKTsNCiAg4oCiIG5ldyBmdW5jdGlvbnMgKGZvciBpbnN0YW5jZTogcm9v dCBleHRyYWN0aW9uLCBtdWx0aXBsaWNhdGl2ZSBvcmRlcik7DQogIOKAoiBgQXJpdGguZ2NkZXh0 JyBub3cgcmV0dXJucyBtaW5pbWFsIGNvZWZmaWNpZW50cyBhbmQgYXZvaWRzIG92ZXJmbG93cw0K ICAgICh3aGljaCB3YXMgW25vdCB0cml2aWFsXSk7DQogIOKAoiBmYWN0b3JpemF0aW9uIG5vdyBw ZXJmb3JtcyBzb21lIHN0ZXBzIG9mIEZlcm1hdOKAmXMgZmFjdG9yIHNlYXJjaGluZywNCiAgICB3 aGljaCBJIHRoaW5rIGNsb3NlcyB0aGUgZ2FwIHdpdGggW093bF0gKG1lbnRpb25pbmcgdGhpcyBi ZWNhdXNlDQogICAgQHN0cnVrdHVyZWQgW2hhZCBhc2tlZCBtZV0gaG93IEV1bGVyIGNvbXBhcmVk IHdpdGggT3dsLCBhbmQgRmVybWF04oCZcw0KICAgIGFsZ29yaXRobSB3YXMgdGhlIG9ubHkgaW50 ZWdlciBhcml0aG1ldGljIG9wZXJhdGlvbiB0aGF0IEkgZm91bmQgaW4NCiAgICBPd2wgbm90IHBy b3ZpZGVkIGJ5IEV1bGVyKS4NCg0KICBUaGUgZnVsbCBsaXN0IG9mIGNoYW5nZXMgaXMgZm91bmQg aW4gdGhlIGNoYW5nZWxvZywgaW4gdGhlIHJlcG8uDQoNCiAgSGFwcHkgZmFjdG9yaXppbmchDQoN CiAgKFRoaXMgaXMgYSBuZXcgdG9waWMgYmVjYXVzZSBJIGNhbm5vdCBlZGl0IFt0aGUgaW5pdGlh bCBvbmVdLikNCg0KDQpbdGhlIHJlcG9dIDxodHRwczovL2dpdGh1Yi5jb20vZ21ldmVsL2V1bGVy LWxpYj4NCg0KW3RoZSBkb2NzXQ0KPGh0dHBzOi8vZ21ldmVsLmdpdGh1Yi5pby9ldWxlci1saWIv aW5kZXguaHRtbC9ldWxlci9FdWxlci9pbmRleC5odG1sPg0KDQpbYGxvZzJzdXAnXQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9nbWV2ZWwvZXVsZXItbGliL2Jsb2IvMC4zL3NyYy9Bcml0aC5tbCNMNjIx LUw2OTU+DQoNCltgbG9nc3VwJ10NCjxodHRwczovL2dpdGh1Yi5jb20vZ21ldmVsL2V1bGVyLWxp Yi9ibG9iLzAuMy9zcmMvQXJpdGgubWwjTDY5Ny1MNzUwPg0KDQpbbm90IHRyaXZpYWxdDQo8aHR0 cHM6Ly9naXRodWIuY29tL2dtZXZlbC9ldWxlci1saWIvYmxvYi8wLjMvc3JjL0FyaXRoLm1sI0wx MzkwLUwxNTE0Pg0KDQpbT3dsXSA8aHR0cHM6Ly9naXRodWIuY29tL293bGJhcm4vb3dsPg0KDQpb aGFkIGFza2VkIG1lXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZXVsZXItYW4t YXJpdGhtZXRpYy1saWJyYXJ5LWZvci1uYXRpdmUtaW50ZWdlcnMvMTI0ODIvOT4NCg0KW3RoZSBp bml0aWFsIG9uZV0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWV1bGVyLWFuLWFy aXRobWV0aWMtbGlicmFyeS1mb3ItbmF0aXZlLWludGVnZXJzLzEyNDgyPg0KDQoNCmR1bmUgMy4x NQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS0zLTE1LzE0NDM4LzQ+DQoNCg0KRXRpZW5uZSBNaWxs b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSd2ZSByZWxlYXNlZCAzLjE1LjMg KHNvbWUgdGltZSBhZ28gYWxyZWFkeSkgd2l0aCB0aGUgZm9sbG93aW5nDQogIGNoYW5nZXM6DQoN CiAgKjMuMTUuMyAoMjAyNC0wNS0yNCkqDQoNCg0KRml4ZWQNCuKVjOKVjOKVjOKVjOKVjA0KDQog IOKAoiBGaXggaW50ZXJwcmV0YXRpb24gb2YgYGV4aXN0c19pZicgcHJlZGljYXRlIGluIGBNRVRB JyBmaWxlcyBvZg0KICAgIGluc3RhbGxlZCBsaWJyYXJpZXMgY29udGFpbmluZyBtb3JlIHRoYW4g b25lIGVsZW1lbnQuICgjMTA1NjQsIGZpeGVzDQogICAgIzEwNTYzLCBAZGJ1ZW56bGksIEBub2pi KQ0KDQogIOKAoiBGaXggVFNBTiB3YXJuaW5nIGluIHdhaXQ0IHN0dWJzICgjMTA1NTQsIGZpeGVz ICMxMDU1MywgQGVtaWxsb24pDQoNCg0KZHVuZSAzLjE2DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5l LTMtMTYvMTQ4ODkvMT4NCg0KDQpFdGllbm5lIE1pbGxvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFdlJ3JlIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIER1bmUgMy4x Ni4wLg0KDQogIEFtb25nIHRoZSBsaXN0IG9mIGNoYW5jZXMsIHRoaXMgcmVsZWFzZSBjb250YWlu cyBpbXByb3ZlbWVudHMgdG8NCiAgbWVsYW5nZSBzdXBwb3J0IGFuZCBhIHdheSB0byBsb29rIGZv ciByZWZlcmVuY2VzIGluIGEgd2hvbGUgcHJvamVjdA0KICB1c2luZyBtZXJsaW4gYW5kIG9jYW1s LWxzcC4NCg0KICAqMy4xNi4wICgyMDI0LTA2LTE3KSoNCg0KDQpBZGRlZA0K4pWM4pWM4pWM4pWM 4pWMDQoNCiAg4oCiIGFsbG93IGxpYnJhcmllcyB3aXRoIHRoZSBzYW1lIGAobmFtZSAuLiknIGlu IHByb2plY3RzIGFzIGxvbmcgYXMNCiAgICB0aGV5IGRvbid0IGNvbmZsaWN0IGR1cmluZyByZXNv bHV0aW9uICh2aWEgYGVuYWJsZWRfaWYnKS4gKCMxMDMwNywNCiAgICBAYW5tb250ZWlybywgQGpj aGF2YXJyaSkNCg0KICDigKIgYGR1bmUgZGVzY3JpYmUgcHAnIG5vdyBmaW5kcyB0aGUgZXhhY3Qg bW9kdWxlIGFuZCB0aGUgc3RhbnphIGl0DQogICAgYmVsb25ncyB0bywgaW5zdGVhZCBvZiBndWVz c2luZyB0aGUgbmFtZSBvZiB0aGUgcHJlcHJvY2Vzc2VkDQogICAgZmlsZS4gKCMxMDMyMSwgQGFu bW9udGVpcm8pDQoNCiAg4oCiIFByaW50IHRoZSByZXN1bHQgb2YgYGR1bmUgZGVzY3JpYmUgcHAn IHdpdGggdGhlIHJlc3BlY3RpdmUgZGlhbGVjdA0KICAgIHByaW50ZXIuICgjMTAzMjIsIEBhbm1v bnRlaXJvKQ0KDQogIOKAoiBBZGQgbmV3IGZsYWcgYC0tY29udGV4dCcgdG8gYGR1bmUgb2NhbWwt bWVybGluJywgd2hpY2ggYWxsb3dzIHRvDQogICAgc2VsZWN0IGEgRHVuZSBjb250ZXh0IHdoZW4g cmVxdWVzdGluZyBNZXJsaW4gY29uZmlnLiBBZGQgYGR1bmUNCiAgICBkZXNjcmliZSBjb250ZXh0 cycgc3ViY29tbWFuZC4gSW50cm9kdWNlIGEgZmllbGQNCiAgICBgZ2VuZXJhdGVfbWVybGluX3J1 bGVzJyBmb3IgY29udGV4dHMgZGVjbGFyZWQgaW4gdGhlIHdvcmtzcGFjZSwgdGhhdA0KICAgIGFs bG93cyB0byBvcHRpb25hbGx5IHByb2R1Y2UgTWVybGluIHJ1bGVzIGZvciBvdGhlciBjb250ZXh0 cyBiZXNpZGVzDQogICAgdGhlIG9uZSBzZWxlY3RlZCBmb3IgTWVybGluICgjMTAzMjQsIEBqY2hh dmFycmkpDQoNCiAg4oCiIG1lbGFuZ2U6IGFkZCBpbmNsdWRlIHBhdGhzIGZvciBwcml2YXRlIGxp YnJhcnkgYC5jbWonIGZpbGVzIGR1cmluZw0KICAgIEpTIGVtaXNzaW9uLiAoIzEwNDE2LCBAYW5t b250ZWlybykNCg0KICDigKIgYGR1bmUgb2NhbWwtbWVybGluJzogY29tbXVuaWNhdGUgYWRkaXRp b25hbCBkaXJlY3RpdmVzDQogICAgYFNPVVJDRV9ST09UJywgYFVOSVRfTkFNRScgKHRoZSBhY3R1 YWwgbmFtZSB3aXRoIHdyYXBwaW5nKSBhbmQNCiAgICBgSU5ERVgnIHdpdGggdGhlIHBhdGhzIHRv IHRoZSBpbmRleChlcykuICgjMTA0MjIsIEB2b29kb29zKQ0KDQogIOKAoiBBZGQgYSBuZXcgYWxp YXMgYEBvY2FtbC1pbmRleCcgdGhhdCB1c2VzIHRoZSBgb2NhbWwtaW5kZXgnIGJpbmFyeSB0bw0K ICAgIGdlbmVyYXRlIGluZGV4ZXMgdGhhdCBjYW4gYmUgcmVhZCBieSB0b29scyBzdWNoIGFzIE1l cmxpbiB0byBwcm92aWRlDQogICAgcHJvamVjdC13aWRlIHJlZmVyZW5jZXMgc2VhcmNoLiAoIzEw NDIyLCBAdm9vZG9vcykNCg0KICDigKIgbWVybGluOiBhZGQgb3B0aW9uYWwgYChtZXJsaW5fcmVh ZGVyIENNRCknIGNvbnN0cnVjdCB0byBgKGRpYWxlY3QpJw0KICAgIHN0YW56YSB0byBjb25maWd1 cmUgYSBtZXJsaW4gcmVhZGVyICgjODU2NywgQGFuZHJleXBvcHApDQoNCg0KQ2hhbmdlZA0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIG1lbGFuZ2U6IHRyZWF0IHByaXZhdGUgbGlicmFy aWVzIHdpdGggYChwYWNrYWdlIC4uKScgYXMgcHVibGljDQogICAgbGlicmFyaWVzLCBmaXhpbmcg YW4gaXNzdWUgd2hlcmUgYGltcG9ydCcgcGF0aHMgd2VyZSB3cm9uZ2x5DQogICAgZW1pdHRlZC4g KCMxMDQxNSwgQGFubW9udGVpcm8pDQoNCiAg4oCiIGluc3RhbGwgYC5nbG9iJyBmaWxlcyBmb3Ig Q29xIHRoZW9yaWVzIHRvbyAoIzEwNjAyLCBAZWpnYWxsZWdvKQ0KDQoNCkZpeGVkDQrilYzilYzi lYzilYzilYwNCg0KICDigKIgRG9uJ3QgdHJ5IHRvIGRvY3VtZW50IG5vbi1leGlzdGVudCBsaWJy YXJpZXMgaW4gZG9jLW5ldyB0YXJnZXQNCiAgICAoIzEwMzE5LCBmaXhlcyAjMTAwNTYsIEBqb25s dWRsYW0pDQoNCiAg4oCiIE1ha2UgYGR1bmUtc2l0ZScncyBgbG9hZF9hbGwnIGZ1bmN0aW9uIGxv b2sgZm9yIGBNRVRBJyBmaWxlcyBzbyB0aGF0DQogICAgaXQgZG9lc24ndCBmYWlsIG9uIGVtcHR5 IGRpcmVjdG9yaWVzIGluIHRoZSBwbHVnaW4gZGlyZWN0b3J5DQogICAgKCMxMDQ1OCwgZml4ZXMg IzEwNDU3LCBAc2h5bSkNCg0KICDigKIgRml4IGluY29ycmVjdCB3YXJuaW5nIGZvciBsaWJyYXJp ZXMgZGVmaW5lZCBpbnNpZGUgbm9uLWV4aXN0YW50DQogICAgZGlyZWN0b3JpZXMgdXNpbmcgYChz dWJkaXIgLi4pJyBhbmQgdXNlZCBieSBleGVjdXRhYmxlcyB1c2luZw0KICAgIGBkdW5lLWJ1aWxk LWluZm8nICgjMTA1MjUsIEByZ3JpbmJlcmcpDQoNCiAg4oCiIERvbid0IHRyeSB0byB0YWtlIGJ1 aWxkIGxvY2sgd2hlbiBydW5uaW5nIGBjb3EgdG9wIC0tbm8tYnVpbGQnDQogICAgKCMxMDU0Nywg Zml4ZXMgIzc2NzEsIEBsenkwNTA1KQ0KDQogIOKAoiBNYWtlIHN1cmUgdG8gdHJ1bmNhdGUgZHVu ZSdzIGxvY2sgZmlsZSBhZnRlciBsb2NraW5nIGFuZCB1bmxvY2tpbmcNCiAgICBzbyB0aGF0IHVz ZXJzIGNhbm5vdCBvYnNlcnZlIGluY29ycmVjdCBwaWQncyAoIzEwNTc1LCBAcmdyaW5iZXJnKQ0K DQogIOKAoiBtZHg6IGxpbmsgbWR4IGJpbmFyeSB3aXRoIGBieXRlX2NvbXBsZXRlJy4gVGhpcyBm aXhlcyBgKGxpYnJhcmllcyknDQogICAgd2l0aCBmb3JlaWduIGFyY2hpdmVzIG9uIExpbnV4LiAo IzEwNTg2LCBmaXhlcyAjMTA1ODIsIEBhbm1vbnRlaXJvKQ0KDQogIOKAoiB2aXJ0dWFsIGxpYnJh cmllczogZml4IGFuIGlzc3VlIHdoZXJlIGxpbmtpbmcgYW4gZXhlY3V0YWJsZQ0KICAgIGludm9s dmluZyBzZXZlcmFsIHZpcnR1YWwgbGlicmllcyB3b3VsZCBjYXVzZSBhbiBlcnJvci4gKCMxMDU4 MSwNCiAgICBmaXhlcyAjMTA0NjAsIEByZ3JpbmJlcmcpDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20g dGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9t IG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4N Cg0KICDigKIgW0NyZWF0aW5nIHRoZSBTeW50YXhEb2N1bWVudGF0aW9uIENvbW1hbmQgLSBQYXJ0 IDI6IE9DYW1sIExTUF0NCiAg4oCiIFtUZXN0aW5nIE1pcmFnZVZQTiBhZ2FpbnN0IE9wZW5WUE7i hKJdDQogIOKAoiBbRW5oYW5jaW5nIHRoZSBPQ2FtbC5vcmcgQ29tbXVuaXR5IFBhZ2U6IEJvb3N0 aW5nIFVYIGFuZCBVSSBCYXNlZCBvbg0KICAgIFVzZXIgUmVzZWFyY2hdDQogIOKAoiBbcXViZXMt bWlyYWdldnBuLCBhIE1pcmFnZVZQTiBjbGllbnQgZm9yIFF1YmVzT1NdDQoNCg0KW3RoZSBvY2Ft bC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbQ3JlYXRpbmcgdGhlIFN5 bnRheERvY3VtZW50YXRpb24gQ29tbWFuZCAtIFBhcnQgMjogT0NhbWwgTFNQXQ0KPGh0dHBzOi8v dGFyaWRlcy5jb20vYmxvZy8yMDI0LTA3LTEyLWNyZWF0aW5nLXRoZS1zeW50YXhkb2N1bWVudGF0 aW9uLWNvbW1hbmQtcGFydC0yLW9jYW1sLWxzcD4NCg0KW1Rlc3RpbmcgTWlyYWdlVlBOIGFnYWlu c3QgT3BlblZQTuKEol0NCjxodHRwczovL2Jsb2cucm9idXIuY29vcC9hcnRpY2xlcy9taXJhZ2V2 cG4tdGVzdGluZy5odG1sPg0KDQpbRW5oYW5jaW5nIHRoZSBPQ2FtbC5vcmcgQ29tbXVuaXR5IFBh Z2U6IEJvb3N0aW5nIFVYIGFuZCBVSSBCYXNlZCBvbg0KVXNlciBSZXNlYXJjaF0NCjxodHRwczov L3RhcmlkZXMuY29tL2Jsb2cvMjAyNC0wNi0yNi1lbmhhbmNpbmctdGhlLW9jYW1sLW9yZy1jb21t dW5pdHktcGFnZS1ib29zdGluZy11eC1hbmQtdWktYmFzZWQtb24tdXNlci1yZXNlYXJjaD4NCg0K W3F1YmVzLW1pcmFnZXZwbiwgYSBNaXJhZ2VWUE4gY2xpZW50IGZvciBRdWJlc09TXQ0KPGh0dHBz Oi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzL3F1YmVzLW1pcmFnZXZwbi5odG1sPg0KDQoNCk9s ZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBh IENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8g eW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQg b2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQg ZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlz dF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86 YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0 XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4g U2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 25 to July 02, 2= 024.

    OCaml Tech Talk | Editor Features

    Continuing this thread, PizieDust announced

    The video is now uploaded on YouTube at: Ocaml | Editor Features

    New release of Ocsipersist

    Vincent Balat announced

    Ocsipersist has been recen= tly updated.

    Ocsipersist is an OCaml interface for key-value stores, with three implemen= tations based on SQLite, DBM and PostgreSQL.

    It proposes several interfaces: basic string to string tables, typed tables= with custom (de)serialisation functions, persistent variables …

    This new version 2.0.0, adds the following features:

    • some dependencies removed
    • Basic interface for persistent references, in the style of Eliom's scoped = references (but without scope)

    Example of use of persistent references from the toplevel, with the sqlite = backend:

    # #require "lwt_ppx";;
    (* #thread;; if you are using OCaml < 5.0.0 *)
    # #require "ocsipersist-sqlite";;
    # Ocsipersist.init ();;
    # let r =3D Ocsipersist.Ref.ref ~persistent:"r" 444;;
    val r : int Ocsipersist.Ref.t =3D <abstr>
    # Lwt_main.run (let%lwt v =3D Ocsipersist.Ref.get r in print_int v; Lwt.ret=
    urn_unit);;
    444- : unit =3D ()
    

    Backends: Choose the backend you prefer by using packages ocsipersist-sqlite, ocsipersist-dbm or ocsipersist-postgresql.

    Configuration:

    • Use module Ocsipersist_settings, provided by each backend = to configure the database
    • Opam packages ocsipersist-sqlite-config, ocsipersis= t-dbm-config or ocsipersist-postgresql-config make it p= ossible to configure the backend from Ocsigen Server's config file (breakin= g change: this was provided by ocsipersist-sqlite, ocsip= ersist-dbm or ocsipersist-postgresql before. You'll nee= d to update your configuration files).

    Preview of Godotcaml for the Godot 4.2 Game Engine

    Matt Walker announced

    I've released a small preview of a project I've been working on. It's bind= ings to the Godot 4.2 game engine from OCaml.

    To keep this announcement short, I've posted a longer explanation on my blo= g:

    ht= tps://fizzixnerd.com/blog/2024-06-24-announcing-godotcaml/

    Here is the git repo:

    https://github.com/Fizz= ixnerd/godotcaml

    Here is another short blog post explaining how to get up and started with i= t:

    h= ttps://fizzixnerd.com/blog/2024-06-28-godotcaml-basic-setup/

    Do not expect much, I've basically just reached the point where Godot and O= Caml can call each other. I just thought people might think it's cool! Op= en issues or discuss in this thread if you'd like; another blog post will b= e forthcoming covering the current structure of the code if there seems to = be interest.

    euler 0.3

    glen announced

    It is my pleasure to announce the release of Euler version 0.3. :slight_smi= le:

    Euler is an arithmetic library for OCaml integers. For more details, please= read the repo= =E2=80=8B=E2=80=99s README or browse the docs.

    In version 0.3:

    • some amount of optimization (:magic_wand: magic tricks to compute logar= ithms, see source code of log2sup and logs= up);
    • new functions (for instance: root extraction, multiplicative order);
    • Arith.gcdext now returns minimal coefficients and avoids o= verflows (which was not trivial);
    • factorization now performs some steps of Fermat=E2=80=99s factor search= ing, which I think closes the gap with Owl (mentioning this because @struktured the initi= al one.)

    dune 3.15

    Etienne Millon announced

    We've released 3.15.3 (some time ago already) with the following changes:

    3.15.3 (2024-05-24)

    Fixed

    • Fix interpretation of exists_if predicate in META files of installed=20=20=20=20=20=20=20=20=20=20 libraries containing more than one element. (#10564, fixes #10563, @dbuenzl= i,=20=20=20=20=20 @nojb)
    • Fix TSAN warning in wait4 stubs (#10554, fixes #10553, @emillon)

    dune 3.16

    Etienne Millon announced

    We're happy to announce the release of Dune 3.16.0.

    Among the list of chances, this release contains improvements to melange su= pport and a way to look for references in a whole project using merlin and = ocaml-lsp.

    3.16.0 (2024-06-17)

    Added

    • allow libraries with the same (name ..) in projects as lon= g as they don't conflict during resolution (via enabled_if). (= #10307, @anmonteiro, @jchavarri)
    • dune describe pp now finds the exact module and the stanza= it belongs to, instead of guessing the name of the preprocessed file. (#10= 321, @anmonteiro)
    • Print the result of dune describe pp with the respective d= ialect printer. (#10322, @anmonteiro)
    • Add new flag --context to dune ocaml-merlin, = which allows to select a Dune context when requesting Merlin config. Add dune describe contexts subcommand. Introduce a field gener= ate_merlin_rules for contexts declared in the workspace, that allow= s to optionally produce Merlin rules for other contexts besides the one se= lected for Merlin (#10324, @jchavarri)
    • melange: add include paths for private library .cmj files = during JS emission. (#10416, @anmonteiro)
    • dune ocaml-merlin: communicate additional directives SOURCE_ROOT, UNIT_NAME (the actual name with wrapping= ) and INDEX with the paths to the index(es). (#10422, @voodoo= s)
    • Add a new alias @ocaml-index that uses the ocaml-ind= ex binary to generate indexes that can be read by tools such as Mer= lin to provide project-wide references search. (#10422, @voodoos)
    • merlin: add optional (merlin_reader CMD) construct to (dialect) stanza to configure a merlin reader (#8567, @andreypopp= )

    Changed

    • melange: treat private libraries with (package ..) as publ= ic libraries, fixing an issue where import paths were wrongly= emitted. (#10415, @anmonteiro)
    • install .glob files for Coq theories too (#10602, @ejgalle= go)

    Fixed

    • Don't try to document non-existent libraries in doc-new target (#10319,= fixes #10056, @jonludlam)
    • Make dune-site's load_all function look for <= code>META files so that it doesn't fail on empty directories in the= plugin directory (#10458, fixes #10457, @shym)
    • Fix incorrect warning for libraries defined inside non-existant directo= ries using (subdir ..) and used by executables using du= ne-build-info (#10525, @rgrinberg)
    • Don't try to take build lock when running coq top --no-build (#10547, fixes #7671, @lzy0505)
    • Make sure to truncate dune's lock file after locking and unlocking so t= hat users cannot observe incorrect pid's (#10575, @rgrinberg)
    • mdx: link mdx binary with byte_complete. This fixes = (libraries) with foreign archives on Linux. (#10586, fixes #10582, = @anmonteiro)
    • virtual libraries: fix an issue where linking an executable involving s= everal virtual libries would cause an error. (#10581, fixes #10460, @rgrin= berg)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=QvIBmFIn; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 769B4B80123 for ; Tue, 9 Jul 2024 10:19:21 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=AaF/JmlK9GVOYRZTyIYqNsX3Z/fIiAXTJdDlgvbT16k=; b=QvIBmFInfd9L1i10bA0ccf4ifI29Tw7jCpkDGgHXJ2HBdauPJq1k1tOj utehGNJfTOJ7TVyh2hU9rPGl1kypCOrSf7o+pzFY1+DNoiAqi91gO+/cJ +jZsDuITAtkrZn0qNKs7thptIqQLaCAj4XMgY6FvHpfTqWKDW7ykUMvYG w=; Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.09,194,1716242400"; d="scan'208,217";a="174610691" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Jul 2024 11:19:18 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id D6C11E0D22; Tue, 9 Jul 2024 11:19:16 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 55D86E004E for ; Tue, 9 Jul 2024 11:19:11 +0200 (CEST) X-IronPort-AV: E=Sophos;i="6.09,194,1716242400"; d="scan'208,217";a="174610629" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Jul 2024 11:19:11 +0200 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 09 Jul 2024 11:19:09 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19155 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAwMiB0byAwOSwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KVGhlIFN0cnVj dHVyZSBvZiBHb2RvdGNhbWwgYXMgb2YgVG9kYXksIGJ5IE1hdHQgV2Fsa2VyIFtGaXp6aXhuZXJk XQ0Kb3BhbSAyLjIuMCBpcyBvdXQhDQpPQ2FtbC5vcmcgTmV3c2xldHRlcjogSnVuZSAyMDI0DQpv Y2FtbC1saWJicGY6IExpYmJwZiBDLWJpbmRpbmdzIGZvciBPQ2FtbA0KSG93IEkgYnVpbHQgdGhl IEFjdXRpcyB0ZW1wbGF0ZSBsYW5ndWFnZSBpbiBPQ2FtbA0KTWlyYWdlT1MgcG9kY2FzdA0KT2xk IENXTg0KDQoNClRoZSBTdHJ1Y3R1cmUgb2YgR29kb3RjYW1sIGFzIG9mIFRvZGF5LCBieSBNYXR0 IFdhbGtlciBbRml6eml4bmVyZF0NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy10aGUtc3RydWN0 dXJlLW9mLWdvZG90Y2FtbC1hcy1vZi10b2RheS1ieS1tYXR0LXdhbGtlci1maXp6aXhuZXJkLzE0 ODkyLzE+DQoNCg0KTWF0dCBXYWxrZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGaXhlZCBzb21l IGJ1Z3MgaW4gdGhlIEdvZG90IE9DYW1sIGJpbmRpbmdzIEknbSB3b3JraW5nIG9uLiAgSGVyZSBp cyBhDQogIGJsb2cgcG9zdCB0aGF0IGNvdWxkIGJlIG9mIGludGVyZXN0IGlmIHlvdSdyZSBsb29r aW5nIHRvIGRpdmUgaW50bw0KICB0aGVtLCBvciB1c2luZyBDdHlwZXMgaW4gYW5vdGhlciBwcm9q ZWN0LCBvciBhcmUgd3JpdGluZyBHb2RvdA0KICBiaW5kaW5ncyBmb3IgYW5vdGhlciBsYW5ndWFn ZSwgb3IganVzdCBoYXZlIHNvbWUgdGltZSB0bw0KICBraWxsLiA6c21pbGV5Og0KDQogIDxodHRw czovL2ZpenppeG5lcmQuY29tL2Jsb2cvMjAyNC0wNy0wMi10aGUtc3RydWN0dXJlLW9mLWdvZG90 Y2FtbC1hcy1vZi10b2RheS8+DQoNCg0Kb3BhbSAyLjIuMCBpcyBvdXQhDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItMi0wLWlzLW91dC8xNDg5My8x Pg0KDQoNCkthdGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBXZeKAmXJlIHZlcnkgaGFwcHkgdG8gZmluYWxseSBhbm5vdW5jZSB0aGUg cmVsZWFzZSBvZiBvcGFtIDIuMi4wLg0KDQoNCldoYXTigJlzIG5ldz8NCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiAqV2luZG93cyBzdXBwb3J0KiA6d2luZG93OiA6 dGFkYTogKHlvdSBjYW4gaGVhciBhbGwgYWJvdXQgaXQgaW4gdGhlDQogICAgIFtibG9nIHBvc3Rd KQ0KICDigKIgYG9wYW0gdHJlZScgLyBgb3BhbSB3aHknOiBuZXcgY29tbWFuZHMgc2hvd2luZyBh IHRyZWUgdmlldyBvZiB0aGUNCiAgICBnaXZlbiBwYWNrYWdlcyBhbmQgdGhlaXIgZGVwZW5kZW5j aWVzIGFuZCByZXZlcnNlLWRlcGVuZGVuY2llcywNCiAgICByZXNwZWN0aXZlbHkuDQogIOKAoiBg d2l0aC1kZXYtc2V0dXAnOiBhIG5ldyB2YXJpYWJsZSBhbmQgYXJndW1lbnQgdG8gaW5zdGFsbCB0 aGUNCiAgICByZWNvbW1lbmQgZGV2ZWxvcGVtZW50IHNldHVwIGZvciBhIGxvY2FsIHByb2plY3Qu DQogIOKAoiBgb3BhbSBwaW4gLS1yZWN1cnNpdmUnIGFuZCBgLS1zdWJwYXRoJyB0byBoYXZlIG9w YW0gbG9vayBhdCBvcGFtDQogICAgZmlsZXMgZWxzZXdoZXJlIHRoYW4gdGhlIHJvb3QgZGlyZWN0 b3J5IG9mIGEgcHJvamVjdC4NCiAg4oCiIGBvcGFtIHN3aXRjaCAtJyB0byBnbyBiYWNrIHRvIHRo ZSBwcmV2aW91cyBnbG9iYWwgc3dpdGNoIChpbnNwaXJlZA0KICAgIGJ5IGBnaXQgc3dpdGNoIC0n KQ0KICDigKIgYG9wYW0gcGluIC0tY3VycmVudCcgZml4ZXMgYSBwYWNrYWdlIHRvIGl0cyBjdXJy ZW50IHN0YXRlIChkaXNhYmxpbmcNCiAgICBwZW5kaW5nIHJlaW5zdGFsbGF0aW9ucyBvciByZW1v dmFscyBmcm9tIHRoZSByZXBvc2l0b3J5KQ0KICDigKIgYG9wYW0gcGluIHJlbW92ZSAtLWFsbCcg cmVtb3ZlcyBhbGwgdGhlIHBpbm5lZCBwYWNrYWdlcyBmcm9tIGENCiAgICBzd2l0Y2gNCiAg4oCi IGBvcGFtIGV4ZWMgLS1uby1zd2l0Y2gnIHJlbW92ZXMgdGhlIG9wYW0gZW52aXJvbm1lbnQgd2hl biBydW5uaW5nIGENCiAgICBjb21tYW5kLiBJdCBpcyB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBs YXVuY2ggYSBjb21tYW5kIHdpdGhvdXQgb3BhbQ0KICAgIGVudmlyb25tZW50IGNoYW5nZXMuDQog IOKAoiBgb3BhbSBjbGVhbiAtLXVudHJhY2tlZCcgcmVtb3ZlcyB1bnRyYWNrZWQgZmlsZXMgaW50 ZXJhY3RpdmVseQ0KICAgIHJlbWFpbmluZyBmcm9tIHByZXZpb3VzIHBhY2thZ2VzIHJlbW92YWwu DQogIOKAoiBgb3BhbSBhZG1pbiBhZGQtY29uc3RyYWludCA8Y3N0PiAtLXBhY2thZ2VzIHBrZzEs cGtnMixwa2czJyBhcHBsaWVzDQogICAgdGhlIGdpdmVuIGNvbnN0cmFpbnQgdG8gYSBnaXZlbiBz ZXQgb2YgcGFja2FnZXMNCiAg4oCiIGBvcGFtIGxpc3QgLS1iYXNlJyBoYXMgYmVlbiByZW5hbWVk IGludG8gYC0taW52YXJpYW50JywgcmVmbGVjdGluZw0KICAgIHRoZSBmYWN0IHRoYXQgc2luY2Ug b3BhbSAyLjEgdGhlICJiYXNlIiBwYWNrYWdlcyBvZiBhIHN3aXRjaCBhcmUNCiAgICBpbnN0ZWFk IGV4cHJlc3NlZCB1c2luZyBhIHN3aXRjaCBpbnZhcmlhbnQNCiAg4oCiIGBvcGFtIGluc3RhbGwg LS1mb3JtdWxhIDxmb3JtdWxhPicgaW5zdGFsbHMgYSBmb3JtdWxhIGluc3RlYWQgb2YgYQ0KICAg IGxpc3Qgb2YgcGFja2FnZXMuIFRoaXMgY2FuIGJlIHVzZWZ1bCBpZiB5b3Ugd291bGQgbGlrZSB0 byBpbnN0YWxsDQogICAgb25lIHBhY2thZ2Ugb3IgYW5vdGhlciBvbmUuIEZvciBleGFtcGxlIGBv cGFtIGluc3RhbGwgLS1mb3JtdWxhDQogICAgJyJleHRsaWIiIHwgImV4dGxpYi1jb21wYXQiJycg d2lsbCBpbnN0YWxsIGVpdGhlciBgZXh0bGliJyBvcg0KICAgIGBleHRsaWItY29tcGF0JyBkZXBl bmRpbmcgb24gd2hhdCdzIGJlc3QgZm9yIHRoZSBjdXJyZW50IHN3aXRjaC4NCiAg4oCiIGFuZCBt YW55IG90aGVyIGZlYXR1cmVzLCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgYW5kIGZpeGVzDQoN CiAgOm9wZW5fYm9vazogWW91IGNhbiByZWFkIG91ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZv cm1hdGlvbiBhYm91dA0KICB0aGVzZSBjaGFuZ2VzIGFuZCBhIGxvdCBtb3JlLg0KDQoNCltibG9n IHBvc3RdDQo8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0yLTAvI01ham9yLWNo YW5nZS1XaW5kb3dzLXN1cHBvcnQ+DQoNCltibG9nIHBvc3RdIDxodHRwczovL29wYW0ub2NhbWwu b3JnL2Jsb2cvb3BhbS0yLTItMC8+DQoNCg0KSG93IHRvIHVwZ3JhZGUNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEluIGNhc2UgeW91IHBsYW4gYSBwb3Nz aWJsZSByb2xsYmFjaywgeW91IG1heSB3YW50IHRvIGZpcnN0IGJhY2t1cA0KICB5b3VyDQoNCiAg YH4vLm9wYW0nIG9yIGAkZW52OkxPQ0FMQVBQREFUQVxvcGFtJyBkaXJlY3RvcnkuDQoNCiAgVGhl IHVwZ3JhZGUgaW5zdHJ1Y3Rpb25zIGFyZSB1bmNoYW5nZWQ6DQoNCiAgRm9yIFVuaXggc3lzdGVt cw0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgYmFzaCAtYyAic2ggPChjdXJsIC1mc1NMIGh0 dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9vY2FtbC9vcGFtL21hc3Rlci9zaGVsbC9p bnN0YWxsLnNoKSAtLXZlcnNpb24gMi4yLjAiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIG9yIGZy b20gUG93ZXJTaGVsbCBmb3IgV2luZG93cyBzeXN0ZW1zDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBJbnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2QgaHR0cHM6Ly9y YXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL29jYW1sL29wYW0vbWFzdGVyL3NoZWxsL2luc3RhbGwu cHMxKSB9Ig0KICDilJTilIDilIDilIDilIANCg0KICBvciBkb3dubG9hZCBtYW51YWxseSBmcm9t IFt0aGUgR2l0aHViICJSZWxlYXNlcyIgcGFnZV0gdG8geW91ciBQQVRILg0KDQogIFlvdSBzaG91 bGQgdGhlbiBydW46DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFtIGluaXQgLS1yZWlu aXQgLW5pDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNClt0aGUgR2l0aHViICJSZWxlYXNlcyIgcGFn ZV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4yLjA+DQoN Cg0KT0NhbWwub3JnIE5ld3NsZXR0ZXI6IEp1bmUgMjAyNA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9vY2FtbC1vcmctbmV3c2xldHRlci1qdW5lLTIwMjQvMTQ4OTgvMT4NCg0KDQpTYWJpbmUg U2NobWFsdHogYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZWxjb21lIHRvIHRo ZSBKdW5lIDIwMjQgZWRpdGlvbiBvZiB0aGUgT0NhbWwub3JnIG5ld3NsZXR0ZXIhIFRoaXMNCiAg dXBkYXRlIGhhcyBiZWVuIGNvbXBpbGVkIGJ5IHRoZSBPQ2FtbC5vcmcgdGVhbS4gWW91IGNhbiBm aW5kIFtwcmV2aW91cw0KICB1cGRhdGVzXSBvbiBEaXNjdXNzLg0KDQogIE91ciBnb2FsIGlzIHRv IG1ha2UgT0NhbWwub3JnIHRoZSBiZXN0IHJlc291cmNlIGZvciBhbnlvbmUgd2hvIHdhbnRzDQog IHRvIGdldCBzdGFydGVkIGFuZCBiZSBwcm9kdWN0aXZlIGluIE9DYW1sLiBUaGUgT0NhbWwub3Jn IG5ld3NsZXR0ZXINCiAgcHJvdmlkZXMgYW4gdXBkYXRlIG9uIG91ciBwcm9ncmVzcyB0b3dhcmRz IHRoYXQgZ29hbCBhbmQgYW4gb3ZlcnZpZXcNCiAgb2YgdGhlIGNoYW5nZXMgd2UgYXJlIHdvcmtp bmcgb24uDQoNCiAgV2UgY291bGRuJ3QgZG8gaXQgd2l0aG91dCBhbGwgdGhlIGFtYXppbmcgcGVv cGxlIHdobyBoZWxwIHVzIHJldmlldywNCiAgcmV2aXNlLCBhbmQgY3JlYXRlIGJldHRlciBPQ2Ft bCBkb2N1bWVudGF0aW9uIGFuZCB3b3JrIG9uIGlzc3Vlcy4gWW91cg0KICBwYXJ0aWNpcGF0aW9u IGVuYWJsZXMgdXMgdG8gc28gbXVjaCBtb3JlIHRoYW4gd2UgY291bGQganVzdCBieQ0KICBvdXJz ZWx2ZXMuIFRoYW5rIHlvdSENCg0KICBUaGlzIG5ld3NsZXR0ZXIgY292ZXJzOg0KICDigKIgKlJl Y2lwZXMgZm9yIHRoZSBPQ2FtbCBDb29rYm9vazoqIEhlbHAgdXMgbWFrZSB0aGUgT0NhbWwgQ29v a2Jvb2sNCiAgICAgcmVhbGx5IHVzZWZ1bCBieSBjb250cmlidXRpbmcgYW5kIHJldmlld2luZyBy ZWNpcGVzIGZvciBjb21tb24NCiAgICAgdGFza3MhDQogIOKAoiAqQ29tbXVuaXR5ICYgTWFya2V0 aW5nIFBhZ2VzIFJld29yazoqIEltcGxlbWVudGF0aW9uIHdvcmsgaW4NCiAgICAgcHJvZ3Jlc3Mu DQogIOKAoiAqR2VuZXJhbCBJbXByb3ZlbWVudHM6KiBBcyB1c3VhbCwgd2UgYWxzbyB3b3JrZWQg b24gZ2VuZXJhbA0KICAgICBtYWludGVuYW5jZSBhbmQgaW1wcm92ZW1lbnRzLCBzbyB3ZSdyZSBo aWdobGlnaHRpbmcgc29tZSBvZiB0aGUNCiAgICAgd29yayB0aGF0IGhhcHBlbmVkIGJlbG93Lg0K DQoNCltwcmV2aW91cyB1cGRhdGVzXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvb2Nh bWxvcmctbmV3c2xldHRlcj4NCg0KT3BlbiBJc3N1ZXMgZm9yIENvbnRyaWJ1dG9ycw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgWW91IGNhbiBmaW5kIFtvcGVuIGlzc3VlcyBmb3Ig Y29udHJpYnV0b3JzIGhlcmVdIQ0KDQoNCltvcGVuIGlzc3VlcyBmb3IgY29udHJpYnV0b3JzIGhl cmVdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9pc3N1ZXM/cT1pcyUzQWlz c3VlK2lzJTNBb3BlbitsYWJlbCUzQSUyMmhlbHArd2FudGVkJTIyK25vJTNBYXNzaWduZWU+DQoN Cg0KUmVjaXBlcyBmb3IgdGhlIE9DYW1sIENvb2tib29rDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBUaGUgT0NhbWwgQ29va2Jvb2sgaXMgYSBwbGFjZSB3aGVyZSBPQ2Ft bCBkZXZlbG9wZXJzIHNoYXJlIGhvdyB0bw0KICBzb2x2ZSBjb21tb24gdGFza3MgdXNpbmcgcGFj a2FnZXMgZnJvbSB0aGUgZWNvc3lzdGVtLg0KDQogIEEgcmVjaXBlIGlzIGEgY29kZSBzYW1wbGUg YW5kIGV4cGxhbmF0aW9ucyBvbiBob3cgdG8gcGVyZm9ybSBhIHRhc2sNCiAgdXNpbmcgYSBjb21i aW5hdGlvbiBvZiBvcGVuLXNvdXJjZSBsaWJyYXJpZXMuDQoNCiAgVGhlIENvb2tib29rIGlzIGxp dmUgYXQgW29jYW1sLm9yZy9jb29rYm9va10uDQoNCiAgSGVyZSdzIGhvdyB5b3UgY2FuIGhlbHA6 DQoNCiAgMS4gUmV2aWV3LCB0aGVuIFtvcGVuIHB1bGwgcmVxdWVzdHMgZm9yIGNvb2tib29rIHJl Y2lwZXNdIQ0KICAyLiBDb250cmlidXRlIG5ldyByZWNpcGVzIGFuZCB0YXNrcyBmb3IgdGhlIGNv b2tib29rIQ0KDQogICpSZWxldmFudCBQUnMgYW5kIEFjdGl2aXRpZXM6Kg0KICDigKIgKG9wZW4p IFBSOiBDb29rYm9vayBFeHRyYWN0IExpbmtzIEZyb20gSFRNTCBbb2NhbWwvb2NhbWwub3JnIzI1 NTJdDQogICAgYnkgW0BnZ3NtaXRoODQyXQ0KICDigKIgKG9wZW4pIFBSOiBDb29rYm9vayBNZWFz dXJlcyBvZiBDZW50cmFsIFRlbmRlbmN5DQogICAgW29jYW1sL29jYW1sLm9yZyMyNTQwXSBieSBb QGdnc21pdGg4NDJdDQogIOKAoiAob3BlbikgUFI6IENvb2tib29rIFNlbmQgYSBQT1NUL1BBVENI IFJlcXVlc3Qgdy8gQXV0aGVudGljYXRpb24NCiAgICBbb2NhbWwvb2NhbWwub3JnIzI1MzRdDQog IOKAoiBQUjogQ29va2Jvb2sgTm9ybWFsaXNlIFZlY3RvciBbb2NhbWwvb2NhbWwub3JnIzI1MTNd IGJ5DQogICAgW0BnZ3NtaXRoODQyXQ0KICDigKIgUFI6IChkb2NzKSBDb29rYm9vayAiVmFsaWRh dGUgYW4gRW1haWwgQWRkcmVzcyIgV2l0aCBgcmUnDQogICAgW29jYW1sL29jYW1sLm9yZyMyNTE4 XSBieSBbQGdnc21pdGg4NDJdDQoNCg0KW29jYW1sLm9yZy9jb29rYm9va10gPGh0dHBzOi8vb2Nh bWwub3JnL2Nvb2tib29rPg0KDQpbb3BlbiBwdWxsIHJlcXVlc3RzIGZvciBjb29rYm9vayByZWNp cGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbHM/cT1pcyUzQXBy K2lzJTNBb3BlbitsYWJlbCUzQUNvb2tib29rPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NTJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU1Mj4NCg0KW0BnZ3NtaXRo ODQyXSA8aHR0cHM6Ly9naXRodWIuY29tL2dnc21pdGg4NDI+DQoNCltvY2FtbC9vY2FtbC5vcmcj MjU0MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTQwPg0KDQpb b2NhbWwvb2NhbWwub3JnIzI1MzRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3Jn L3B1bGwvMjUzND4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTEzXSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MTM+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUxOF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTE4Pg0KDQoNCkNvbW11bml0 eSAmIE1hcmtldGluZyBQYWdlcyBSZXdvcmsNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIGhhdmUgW1VJIGRlc2lnbnMgZm9yIHRoZSByZXdvcmtl ZCBhbmQgbmV3IHBhZ2VzIG9mIHRoZSBjb21tdW5pdHkNCiAgc2VjdGlvbl0sIGFuZCBpbXBsZW1l bnRhdGlvbiBpcyBpbiBwcm9ncmVzcy4NCg0KICAqUmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0aWVz OioNCg0KICDigKIgUFI6IEV2ZW50cyBmZWVkIFtvY2FtbC9vY2FtbC5vcmcjMjQ5NV0gYnkgW0Bp c2hhcjE5XQ0KICDigKIgKG9wZW4pIFBSOiBPQ2FtbCBJbiBOdW1iZXJzOiBBIGRhc2hib2FyZCB3 aXRoIGtleSBtZXRyaWNzIGFuZA0KICAgIHN0YXRpc3RpY3MgYWJvdXQgdGhlIE9DYW1sIGNvbW11 bml0eSBbb2NhbWwvb2NhbWwub3JnIzI1MTRdIGJ5DQogICAgW0B0bWF0dGlvXQ0KICDigKIgUFI6 IEFkZCBmaWVsZHMgcHJvZmVzc29yLCBlbnJvbGxtZW50LCBhbmQgYGxhc3RfY2hlY2snIHRvIEFj YWRlbWljDQogICAgW29jYW1sL29jYW1sLm9yZyMyNDg5XSBieSBbQGN1aWh0bGF1YWNdDQogIOKA oiBQUjogRml4OiByZW5kZXIgZnVsbCB0aXRsZSBvZiBPQ2FtbCBDb29rYm9vayByZWNpcGUgYXMg SFRNTCBwYWdlDQogICAgdGl0bGUgW29jYW1sL29jYW1sLm9yZyMyNTYwXSBieSBbQHNhYmluZV0N Cg0KDQpbVUkgZGVzaWducyBmb3IgdGhlIHJld29ya2VkIGFuZCBuZXcgcGFnZXMgb2YgdGhlIGNv bW11bml0eSBzZWN0aW9uXQ0KPGh0dHBzOi8vd3d3LmZpZ21hLmNvbS9maWxlLzdobW9Xa1FQOVBn TFRmWkNxaVpNV2EvT0NhbWwtQ29tbXVuaXR5LVBhZ2VzP3R5cGU9ZGVzaWduJm5vZGUtaWQ9NjM3 JTNBNDUzOSZtb2RlPWRlc2lnbiZ0PVJwUWxHdk9wZWcxYTkzQVotMT4NCg0KW29jYW1sL29jYW1s Lm9yZyMyNDk1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI0OTU+ DQoNCltAaXNoYXIxOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9pc2hhcjE5Pg0KDQpbb2NhbWwvb2Nh bWwub3JnIzI1MTRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjUx ND4NCg0KW0B0bWF0dGlvXSA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8+DQoNCltvY2FtbC9v Y2FtbC5vcmcjMjQ4OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8y NDg5Pg0KDQpbQGN1aWh0bGF1YWNdIDxodHRwczovL2dpdGh1Yi5jb20vY3VpaHRsYXVhYz4NCg0K W29jYW1sL29jYW1sLm9yZyMyNTYwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzI1NjA+DQoNCltAc2FiaW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL3NhYmluZT4NCg0K DQpHZW5lcmFsIEltcHJvdmVtZW50cyBhbmQgRGF0YSBBZGRpdGlvbnMNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpTdW1t YXJ5OioNCg0KICDigKIgVG8gcmVkdWNlIHJlcGV0aXRpb24gb2YgdGhlIG1vZHVsZSBpbnRlcmZh Y2UgZGVmaW5pdGlvbnMgcmVsYXRpbmcgdG8NCiAgICBgb29kLWdlbicgKHRoZSB0b29sIHRoYXQg dHVybnMgdGhlIGZpbGVzIGluIHRoZSBgZGF0YS8nIGZvbGRlciBpbnRvDQogICAgT0NhbWwgbW9k dWxlcyksIHR5cGVzIGhhdmUgYmVlbiBmYWN0b3JlZCBvdXQuIFRoaXMgaG9wZWZ1bGx5IG1ha2Vz DQogICAgaXQgc2ltcGxlciB0byBjb250cmlidXRlIHRvIGNoYW5nZXMgdG8gdGhlIGRhdGEgbW9k ZWxzLg0KICDigKIgTWF0ZXJpYWxzIGZvciBzb21lIG9mIHRoZSB0dXRvcmlhbHMgaGF2ZSBiZWVu IHB1Ymxpc2hlZCB1bmRlciB0aGUNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdlYj4g R2l0SHViIG9yZ2FuaXNhdGlvbjogW+KAnFlvdXIgRmlyc3QNCiAgICBPQ2FtbCBQcm9ncmFt4oCd XSwgW+KAnE1vZHVsZXPigJ1dLCBb4oCcRnVuY3RvcnPigJ1dLCBhbmQgW+KAnExpYnJhcmllcyBX aXRoDQogICAgRHVuZeKAnV0uDQogIOKAoiBUaGUgT0NhbWxGb3JtYXQgdmVyc2lvbiB1c2VkIHRv IGZvcm1hdCB0aGUgcHJvamVjdCBpcyBub3cgMC4yNi4yLg0KDQogICpSZWxldmFudCBQUnMgYW5k IEFjdGl2aXRpZXM6Kg0KICDigKIgUFI6IFVwZGF0ZSBjb2RlIGhpZ2hsaWdodGluZyBjb2xvciBz Y2hlbWUgW29jYW1sL29jYW1sLm9yZyMyNDk2XSBieQ0KICAgIFtAU2lkZGhhbnQtSy1jb2RlXQ0K ICDigKIgRGF0YQ0KICAgIOKAoiBQUjogKGRhdGEpIEFkZCBPQ2FtbC5vcmcgbmV3c2xldHRlciBN YXkgMjAyNA0KICAgICAgW29jYW1sL29jYW1sLm9yZyMyNDk4XSBieSBbQHNhYmluZV0NCiAgICDi gKIgUFI6IEFkZCBjaGFuZ2Vsb2cgZW50cnkgZm9yIE1lcmxpbiBgNC4xNS00MTQvNTAxJw0KICAg ICAgW29jYW1sL29jYW1sLm9yZyMyNDczXSBieSBbQHZvb2Rvb3NdDQogICAg4oCiIFBSOiBBZGQg dGhlIGFubm91bmVtZW50IGZvciBvcGFtIDIuMi4wfmJldGEzDQogICAgICBbb2NhbWwvb2NhbWwu b3JnIzI1MDldIGJ5IFtAa2l0LXR5LWthdGVdDQogICAg4oCiIFBSOiBBZGQgbWlzc2luZyBjaGFu Z2Vsb2cgZW50cmllcyBbb2NhbWwvb2NhbWwub3JnIzI0NzZdIGJ5DQogICAgICBbQHRtYXR0aW9d DQogICAg4oCiIFBSOiBBZGQgY2hhbmdlbG9nIGVudHJ5IGZvciBgcHB4bGliLjAuMzIuMScgcmVs ZWFzZQ0KICAgICAgW29jYW1sL29jYW1sLm9yZyMyNDc5XSBieSBbQE5hdGhhblJlYl0NCiAgICDi gKIgUFI6IChkYXRhKSBhZGQgYG9kb2MnIGRldiBtZWV0aW5nIHRvIGdvdmVybmFuY2UNCiAgICAg IFtvY2FtbC9vY2FtbC5vcmcjMjUyMV0gYnkgW0BzYWJpbmVdDQogICAg4oCiIFBSOiAoZGF0YSkg VXBkYXRlIG1lZXRpbmcgbGluayBhbmQgZnJlcXVlbmN5IGluIGdvdmVybmFuY2UgZm9yDQogICAg ICBPQ2FtbC5vcmcgW29jYW1sL29jYW1sLm9yZyMyNTQyXSBieSBbQHNhYmluZV0NCiAg4oCiIERv Y3VtZW50YXRpb246DQogICAg4oCiIFBSOiBQcmVyZXF1aXNpdGVzIGZvciBMaWJyYXJpZXMgV2l0 aCBEdW5lIFtvY2FtbC9vY2FtbC5vcmcjMjU1MV0NCiAgICAgIGJ5IFtAY3VpaHRsYXVhY10NCiAg ICDigKIgQWRkZWQgcmVwb3NpdG9yaWVzIGhvbGRpbmcgbWF0ZXJpYWxzIGZvciBzb21lIG9mIHRo ZSB0dXRvcmlhbHMgYXQNCiAgICAgIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbG0td2ViPg0KICAg ICAg4oCiIFBSOn5vY2FtbC13ZWJ+IHJlcG8gbGluayBbb2NhbWwvb2NhbWwub3JnIzI1NDddIGJ5 IFtAY3VpaHRsYXVhY10NCiAgICAgIOKAoiBQUjogUHJlcmVxdWlzaXRlcyBhbmQgYG9jYW1sLXdl YicgcmVwbyBsaW5rDQogICAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjU0NF0gYnkgW0BjdWlodGxh dWFjXQ0KICAgICAg4oCiIFBSOiBQcmVyZXF1aXNpdGVzIGFuZCBgb2NhbWwtd2ViJyByZXBvIGxp bmsNCiAgICAgICAgW29jYW1sL29jYW1sLm9yZyMyNTQzXSBieSBbQGN1aWh0bGF1YWNdDQogICAg ICDigKIgUFI6IEZpeCB0eXBvIGluIGAwaXRfMDBfdmFsdWVzX2Z1bmN0aW9ucy5tZCcNCiAgICAg ICAgW29jYW1sL29jYW1sLm9yZyMyNTQ4XSBieSBbQGJvaXNnZXJhXQ0KICAgICAg4oCiIFBSOiBg b2NhbWwtd2ViJyB0dXRvcmlhbCBtYXRlcmlhbCBVUkxzIFtvY2FtbC9vY2FtbC5vcmcjMjU1MF0g YnkNCiAgICAgICAgW0BjdWlodGxhdWFjXQ0KICAgIOKAoiBQUjogSW4gIk1vZHVsZXMiIHR1dG9y aWFsOiBGaXggYGR1bmUnIGZpbGVzIFtvY2FtbC9vY2FtbC5vcmcjMjUzNV0NCiAgICAgIGJ5IFtA Y3VpaHRsYXVhY10NCiAgICDigKIgUFI6IEZpeCB0eXBvIGluICJUb3VyIG9mIE9DYW1sIiBbb2Nh bWwvb2NhbWwub3JnIzI1MTldIGJ5DQogICAgICBbQGJsYWNrd2luZGZvcmNlXQ0KICAgIOKAoiBQ UjogQ2xhcmlmaWNhdGlvbiBvbiBwYXR0ZXJuIG1hdGNoaW5nIGFuZCBkZWZpbml0aW9ucw0KICAg ICAgW29jYW1sL29jYW1sLm9yZyMyNTAwXSBieSBbQGN1aWh0bGF1YWNdDQogIOKAoiBSZWZhY3Rv cmluZyAvIENvZGUgaGVhbHRoOg0KICAgIOKAoiBGYWN0b3Igb3V0IHR5cGVzIG9uIGBvb2QtZ2Vu JyB0b29sIHRoYXQgcGFyc2VzIHRoZSBmaWxlcyBpbiB0aGUNCiAgICAgIGBkYXRhLycgZm9sZGVy Og0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIE91dHJlYWNo eQ0KICAgICAgICBbb2NhbWwvb2NhbWwub3JnIzI0ODFdIGJ5IFtAY3VpaHRsYXVhY10NCiAgICAg IOKAoiBQUjogU2luZ2xlIGRhdGEgdHlwZSBkZWZpbml0aW9uIGZvciBSZXNvdXJjZQ0KICAgICAg ICBbb2NhbWwvb2NhbWwub3JnIzI1MzNdIGJ5IFtAY3VpaHRsYXVhY10NCiAgICAgIOKAoiBQUjog U2luZ2xlIGRhdGEgdHlwZSBkZWZpbnRpb24gZm9yIFN1Y2Nlc3Nfc3RvcnkNCiAgICAgICAgW29j YW1sL29jYW1sLm9yZyMyNTM2XSBieSBbQGN1aWh0bGF1YWNdDQogICAgICDigKIgUFI6IFNpbmds ZSBkYXRhIHR5cGUgZGVmaW50aW9uIGZvciBUb29sIFtvY2FtbC9vY2FtbC5vcmcjMjUzOF0NCiAg ICAgICAgYnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgdHlwZSBmb3IgVG9v bF9wYWdlIFtvY2FtbC9vY2FtbC5vcmcjMjUzOV0gYnkNCiAgICAgICAgW0BjdWlodGxhdWFjXQ0K ICAgICAg4oCiIFBSOiBTaW5nbGUgdHlwZSBmb3IgQm9vayBbb2NhbWwvb2NhbWwub3JnIzI0ODhd IGJ5IFtAY3VpaHRsYXVhY10NCiAgICAgIOKAoiBQUjogU2luZ2xlIGRhdGEgdHlwZSBkZWZpbml0 aW9uIGZvciBFeGVyY2lzZQ0KICAgICAgICBbb2NhbWwvb2NhbWwub3JnIzI0OTddIGJ5IFtAY3Vp aHRsYXVhY10NCiAgICAgIOKAoiBQUjogU2luZ2xlIGRhdGEgdHlwZSBkZWZpbml0aW9ucyBmb3Ig UGxhbmV0DQogICAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjUyOV0gYnkgW0BjdWlodGxhdWFjXQ0K ICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIFJlbGVhc2UNCiAg ICAgICAgW29jYW1sL29jYW1sLm9yZyMyNTMxXSBieSBbQGN1aWh0bGF1YWNdDQogICAgICDigKIg UFI6IFNpbmdsZSBkYXRhIHR5cGUgZGVmaW5pdGlvbiBmb3IgQ2hhbmdlbG9nDQogICAgICAgIFtv Y2FtbC9vY2FtbC5vcmcjMjQ5Ml0gYnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5n bGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIENvb2tib29rDQogICAgICAgIFtvY2FtbC9vY2Ft bC5vcmcjMjQ5MF0gYnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0 eXBlIGRlZmluaXRpb24gZm9yIEdvdmVybmFuY2UNCiAgICAgICAgW29jYW1sL29jYW1sLm9yZyMy NTA0XSBieSBbQGN1aWh0bGF1YWNdDQogICAgICDigKIgUFI6IFNpbmdsZSBkYXRhIHR5cGUgZGVm aW5pdGlvbnMgZm9yIFR1dG9yaWFsDQogICAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjU1NV0gYnkg W0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24g Zm9yIEV2ZW50IFtvY2FtbC9vY2FtbC5vcmcjMjU1OV0NCiAgICAgICAgYnkgW0BjdWlodGxhdWFj XQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIEluZHVzdHJp YWxfdXNlcg0KICAgICAgICBbb2NhbWwvb2NhbWwub3JnIzI1MDVdIGJ5IFtAY3VpaHRsYXVhY10N CiAgICAgIOKAoiBQUjogU2luZ2xlIHR5cGUgZm9yIElzX29jYW1sX3lldCBbb2NhbWwvb2NhbWwu b3JnIzI1MDhdIGJ5DQogICAgICAgIFtAY3VpaHRsYXVhY10NCiAgICAgIOKAoiBQUjogU2luZ2xl IHR5cGUgZGVmaW5pdGlvbiBmb3IgSm9iIFtvY2FtbC9vY2FtbC5vcmcjMjUxNl0gYnkNCiAgICAg ICAgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRp b24gZm9yIE5ld3MgW29jYW1sL29jYW1sLm9yZyMyNTIwXQ0KICAgICAgICBieSBbQGN1aWh0bGF1 YWNdDQogICAgICDigKIgUFI6IFNpbmdsZSBkYXRhIHR5cGUgZGVmaW50aW9uIGZvciBvcGFtX3Vz ZXINCiAgICAgICAgW29jYW1sL29jYW1sLm9yZyMyNTIyXSBieSBbQGN1aWh0bGF1YWNdDQogICAg ICDigKIgUFI6IFNpbmdsZSBkYXRhIHR5cGUgZGVmaW5pdGlvbiBmb3IgV29ya3Nob3ANCiAgICAg ICAgW29jYW1sL29jYW1sLm9yZyMyNTQxXSBieSBbQGN1aWh0bGF1YWNdDQogICAgICDigKIgUFI6 IFNpbmdsZSBkYXRhIHR5cGUgZGVmaW50aW9uIGZvciBXYXRjaCBbb2NhbWwvb2NhbWwub3JnIzI1 NDVdDQogICAgICAgIGJ5IFtAY3VpaHRsYXVhY10NCiAgICAgIOKAoiBQUjogU2luZ2xlIGRhdGEg dHlwZSBkZWZpbml0aW9uIGZvciBQYWdlIFtvY2FtbC9vY2FtbC5vcmcjMjUyNF0NCiAgICAgICAg YnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRp b24gZm9yIFBhcGVyIFtvY2FtbC9vY2FtbC5vcmcjMjUyNl0NCiAgICAgICAgYnkgW0BjdWlodGxh dWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIEFjYWRl bWljX0luc3RpdHV0aW9uDQogICAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjQ3N10gYnkgW0BjdWlo dGxhdWFjXQ0KICAgICAg4oCiIFBSOiBTaW5nbGUgZGF0YSB0eXBlIGRlZmluaXRpb24gZm9yIENv ZGVfZXhhbXBsZXMNCiAgICAgICAgW29jYW1sL29jYW1sLm9yZyMyNTAxXSBieSBbQGN1aWh0bGF1 YWNdDQogICAg4oCiIFBSOiBSZW1vdmUgcmVkdW5kYW50IGRhdGEgdHlwZSBXYXRjaCBbb2NhbWwv b2NhbWwub3JnIzI1MDddIGJ5DQogICAgICBbQGN1aWh0bGF1YWNdDQogICAg4oCiIEluY3JlYXNl IE9DYW1sRm9ybWF0IHZlcnNpb24gdXNlZCB0byBmb3JtYXQgdGhlIHByb2plY3QgZnJvbQ0KICAg ICAgMC4yNS4xIHRvIDAuMjYuMg0KICAgICAg4oCiIFBSOiBCcmluZ3VwIE9DYW1sRm9ybWF0IFtv Y2FtbC9vY2FtbC5vcmcjMjQ4Ml0gYnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCiIFBSOiBGb3Jt YXR0aW5nIFtvY2FtbC9vY2FtbC5vcmcjMjQ4NF0gYnkgW0BjdWlodGxhdWFjXQ0KICAgICAg4oCi IFBSOiBBZGQgaW5mb3JtYXRpb24gb24gc3dpdGNoIHBpbiB1cGRhdGUgW29jYW1sL29jYW1sLm9y ZyMyNDgzXQ0KICAgICAgICBieSBbQGN1aWh0bGF1YWNdDQogICAgICDigKIgUFI6IEJyaW5ndXAg T0NhbWxGb3JtYXQgaW4gQ0kgW29jYW1sL29jYW1sLm9yZyMyNDg1XSBieQ0KICAgICAgICBbQGN1 aWh0bGF1YWNdDQogICAgICDigKIgUFI6IEFkZCBpbmZvcm1hdGlvbiBvbiBzd2l0Y2ggcGluIHVw ZGF0ZSwgY29udCdkDQogICAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjQ4Nl0gYnkgW0BjdWlodGxh dWFjXQ0KICAgIOKAoiBQUjogUmVuYW1lIFV0aWxzIGBtYXBfZmlsZXMnIGludG8gYG1hcF9tZF9m aWxlcycNCiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjUxNV0gYnkgW0BjdWlodGxhdWFjXQ0KICAg IOKAoiBQUjogUmVtb3ZlIHVudXNlZCBWaWRlbyBkYXRhIFtvY2FtbC9vY2FtbC5vcmcjMjUwNl0g YnkNCiAgICAgIFtAY3VpaHRsYXVhY10NCiAgICDigKIgUFI6IFJlbW92ZSB1bnVzZWQgYG9vZC92 aWRlbycgZmlsZXMgW29jYW1sL29jYW1sLm9yZyMyNTQ2XSBieQ0KICAgICAgW0BjdWlodGxhdWFj XQ0KDQoNClvigJxZb3VyIEZpcnN0IE9DYW1sIFByb2dyYW3igJ1dDQo8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLXdlYi9vY2FtbG9yZy1kb2NzLXlvdXItZmlyc3QtcHJvZ3JhbT4NCg0KW+KAnE1v ZHVsZXPigJ1dIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2ViL29jYW1sb3JnLWRvY3MtbW9k dWxlcz4NCg0KW+KAnEZ1bmN0b3Jz4oCdXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLXdlYi9v Y2FtbG9yZy1kb2NzLWZ1bmN0b3JzPg0KDQpb4oCcTGlicmFyaWVzIFdpdGggRHVuZeKAnV0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtd2ViL29jYW1sb3JnLWRvY3MtbGlicmFyaWVzLWR1bmU+ DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ5Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC5vcmcvcHVsbC8yNDk2Pg0KDQpbQFNpZGRoYW50LUstY29kZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9TaWRkaGFudC1LLWNvZGU+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ5OF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNDk4Pg0KDQpbQHNhYmluZV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9zYWJpbmU+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ3M10gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNDczPg0KDQpbQHZvb2Rvb3NdIDxodHRwczov L2dpdGh1Yi5jb20vdm9vZG9vcz4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTA5XSA8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MDk+DQoNCltAa2l0LXR5LWthdGVdIDxo dHRwczovL2dpdGh1Yi5jb20va2l0LXR5LWthdGU+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ3Nl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNDc2Pg0KDQpbQHRtYXR0 aW9dIDxodHRwczovL2dpdGh1Yi5jb20vdG1hdHRpbz4NCg0KW29jYW1sL29jYW1sLm9yZyMyNDc5 XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI0Nzk+DQoNCltATmF0 aGFuUmViXSA8aHR0cHM6Ly9naXRodWIuY29tL05hdGhhblJlYj4NCg0KW29jYW1sL29jYW1sLm9y ZyMyNTIxXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MjE+DQoN CltvY2FtbC9vY2FtbC5vcmcjMjU0Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8yNTQyPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NTFdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU1MT4NCg0KW0BjdWlodGxhdWFjXSA8aHR0cHM6Ly9n aXRodWIuY29tL2N1aWh0bGF1YWM+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU0N10gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTQ3Pg0KDQpbb2NhbWwvb2NhbWwub3Jn IzI1NDRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU0ND4NCg0K W29jYW1sL29jYW1sLm9yZyMyNTQzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzI1NDM+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU0OF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTQ4Pg0KDQpbQGJvaXNnZXJhXSA8aHR0cHM6Ly9naXRo dWIuY29tL2JvaXNnZXJhPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NTBdIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU1MD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTM1 XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MzU+DQoNCltvY2Ft bC9vY2FtbC5vcmcjMjUxOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVs bC8yNTE5Pg0KDQpbQGJsYWNrd2luZGZvcmNlXSA8aHR0cHM6Ly9naXRodWIuY29tL2JsYWNrd2lu ZGZvcmNlPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1MDBdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwub3JnL3B1bGwvMjUwMD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNDgxXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI0ODE+DQoNCltvY2FtbC9vY2FtbC5v cmcjMjUzM10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTMzPg0K DQpbb2NhbWwvb2NhbWwub3JnIzI1MzZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwu b3JnL3B1bGwvMjUzNj4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTM4XSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1Mzg+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUzOV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTM5Pg0KDQpbb2NhbWwv b2NhbWwub3JnIzI0ODhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwv MjQ4OD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNDk3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sLm9yZy9wdWxsLzI0OTc+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUyOV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTI5Pg0KDQpbb2NhbWwvb2NhbWwub3Jn IzI1MzFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjUzMT4NCg0K W29jYW1sL29jYW1sLm9yZyMyNDkyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzI0OTI+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ5MF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNDkwPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1MDRdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjUwND4NCg0KW29jYW1sL29j YW1sLm9yZyMyNTU1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1 NTU+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU1OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC5vcmcvcHVsbC8yNTU5Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1MDVdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjUwNT4NCg0KW29jYW1sL29jYW1sLm9yZyMy NTA4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MDg+DQoNCltv Y2FtbC9vY2FtbC5vcmcjMjUxNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcv cHVsbC8yNTE2Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1MjBdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMjUyMD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTIyXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MjI+DQoNCltvY2FtbC9vY2Ft bC5vcmcjMjU0MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTQx Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NDVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwub3JnL3B1bGwvMjU0NT4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTI0XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1MjQ+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUy Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTI2Pg0KDQpbb2Nh bWwvb2NhbWwub3JnIzI0NzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1 bGwvMjQ3Nz4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTAxXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sLm9yZy9wdWxsLzI1MDE+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUwN10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTA3Pg0KDQpbb2NhbWwvb2NhbWwu b3JnIzI0ODJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjQ4Mj4N Cg0KW29jYW1sL29jYW1sLm9yZyMyNDg0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s Lm9yZy9wdWxsLzI0ODQ+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjQ4M10gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNDgzPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI0ODVd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjQ4NT4NCg0KW29jYW1s L29jYW1sLm9yZyMyNDg2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxs LzI0ODY+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjUxNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8yNTE1Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1MDZdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjUwNj4NCg0KW29jYW1sL29jYW1sLm9y ZyMyNTQ2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1NDY+DQoN Cg0Kb2NhbWwtbGliYnBmOiBMaWJicGYgQy1iaW5kaW5ncyBmb3IgT0NhbWwNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLWxp YmJwZi1saWJicGYtYy1iaW5kaW5ncy1mb3Itb2NhbWwvMTQ5MDUvMT4NCg0KDQpMZWUgS29vbiBX ZW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gZXhjaXRlZCB0byBhbm5vdW5jZSB0aGUg Zmlyc3QgcmVsZWFzZSBvZiBvY2FtbC1saWJicGYsIGEgbmV3DQogIGxpYnJhcnkgcHJvdmlkaW5n IE9DYW1sIGJpbmRpbmdzIGZvciBsaWJicGYsIHRoZSBlc3NlbnRpYWwgQyBsaWJyYXJ5DQogIGZv ciB3b3JraW5nIHdpdGggZUJQRiBwcm9ncmFtcy4gVGhpcyBsaWJyYXJ5IGFsbG93cyB5b3UgdG8g bG9hZCwNCiAgaW5pdGlhbGl6ZSwgbGluaywgYW5kIG1hbmFnZSBlQlBGIHByb2dyYW1zIHdpdGhp biBPQ2FtbCwgc2ltcGxpZnlpbmcNCiAgdGhlIHByb2Nlc3Mgb2Ygd29ya2luZyB3aXRoIHRoZXNl IHBvd2VyZnVsIGluLWtlcm5lbCBhcHBsaWNhdGlvbnMuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBvcGFtIGluc3RhbGwgbGliYnBmDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEtleSBGZWF0 dXJlczoNCiAg4oCiIEhpZ2gtbGV2ZWwgYW5kIExvdy1sZXZlbCBBUElzOiBBY2Nlc3MgYm90aCBy YXcgYmluZGluZ3MgYW5kDQogICAgdXNlci1mcmllbmRseSBoaWdoLWxldmVsIGZ1bmN0aW9ucyBm b3IgZUJQRiBtYW5hZ2VtZW50Lg0KICDigKIgU2VhbWxlc3MgSW50ZWdyYXRpb246IExvYWQgZUJQ RiBFTEYgZmlsZXMgaW50byB0aGUga2VybmVsIHdpdGggZWFzZS4NCiAg4oCiIEJQRiBNYXAgU3Vw cG9ydDogTWFuYWdlIEJQRiBtYXBzIGZvciBjb21tdW5pY2F0aW9uIGJldHdlZW4gdXNlcg0KICAg IHNwYWNlIGFuZCBrZXJuZWwgc3BhY2UuDQoNCiAgRm9yIG1vcmUgaW5mb3JtYXRpb24sIHZpc2l0 IHRoZSBbb2NhbWwtbGliYnBmXSByZXBvLiBDb250cmlidXRpb25zIGFuZA0KICBmZWVkYmFjayBh cmUgd2VsY29tZSENCg0KICBFbmpveSENCg0KDQpbb2NhbWwtbGliYnBmXSA8aHR0cHM6Ly9naXRo dWIuY29tL2tvb253ZW4vb2NhbWwtbGliYnBmPg0KDQoNCkhvdyBJIGJ1aWx0IHRoZSBBY3V0aXMg dGVtcGxhdGUgbGFuZ3VhZ2UgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1o b3ctaS1idWlsdC10aGUtYWN1dGlzLXRlbXBsYXRlLWxhbmd1YWdlLWluLW9jYW1sLzE0OTE2LzE+ DQoNCg0KSm9obiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEFjdXRpcyBpcyBhIHBlcnNvbmFsIHByb2plY3QgSSd2ZSBiZWVuIGRldmVs b3Bpbmcgb24tYW5kLW9mZiBvdmVyIHRoZQ0KICBsYXN0IGZldyB5ZWFycy4gSXQncyBhIHRlbXBs YXRlIGxhbmd1YWdlIChzaW1pbGFyIHRvIE11c3RhY2hlLA0KICBOdW5qdWNrcywgZXRjLikgdGhh dCBoYXMgYSBzdGF0aWMgdHlwZSBzeXN0ZW0sIHVzZXMgcGF0dGVybi1tYXRjaGluZywNCiAgYW5k IGNhbiBjb21waWxlIHRlbXBsYXRlcyBpbnRvIEphdmFTY3JpcHQgZmlsZXMuIEknbSBzaGFyaW5n IGl0IG5vdw0KICBiZWNhdXNlIGl0J3MgcmVhY2hlZCBhIHNvbWV3aGF0LXN0YWJsZSBzdGF0ZS4N Cg0KICBbWW91IGNhbiB2aWV3IGl0cyBob21lIHBhZ2UgaGVyZV0gYW5kIFtpdHMgc291cmNlIGNv ZGUgaGVyZV0uIEkgYWxzbw0KICB3cm90ZSBhIGJsb2ctc3R5bGUgYXJ0aWNsZSB0aGF0IGV4cGxh aW5zIGhvdyBJIGNyZWF0ZWQgQWN1dGlzLCB0aGUNCiAgcHJvYmxlbXMgSSBmYWNlZCwgYW5kIHRo ZSBkZWNpc2lvbnMgSSBtYWRlLiBZb3UgY2FuIHJlYWQgaXQgaGVyZToNCiAgIltUaGUgQWN1dGlz IHRlbXBsYXRlIGxhbmd1YWdlLCBvcjogaG93IEkgb3Zlci1lbmdpbmVlcmVkIGEgcHJvZ3JhbQ0K ICB0aGF0IGp1c3QgcHJpbnRzIHRleHRdIi4NCg0KICBJIGRvbid0IGVzcGVjaWFsbHkgZXhwZWN0 IHBlb3BsZSB0byB1c2UgQWN1dGlzIG11Y2gsIHNpbmNlIGl0J3MgdmVyeQ0KICBwZXJzb25hbCBh bmQgYmFzZWQgYXJvdW5kIG15IHNwZWNpZmljIHVzZSBjYXNlcy4gKEFsc28sIHdlIGhhdmUgYW4N CiAgb3ZlcmFidW5kYW5jZSBvZiB0ZW1wbGF0ZSBsYW5ndWFnZXMgYWxyZWFkeSBhbnl3YXkuKSBO b25ldGhlbGVzcywNCiAgYnVpbGRpbmcgaXQgd2FzIGEgZnVuIGFuZCByZXdhcmRpbmcgbGVhcm5p bmcgZXhwZXJpZW5jZSBmb3INCiAgbWUuIFBlcmhhcHMgc29tZSBwZW9wbGUgd2lsbCBmaW5kIGl0 IGFzIGludGVyZXN0aW5nIGFzIEkgZGlkLiDwn5mCDQoNCg0KW1lvdSBjYW4gdmlldyBpdHMgaG9t ZSBwYWdlIGhlcmVdIDxodHRwczovL2pvaG5yaWRlc2EuYmlrZS9hY3V0aXMvPg0KDQpbaXRzIHNv dXJjZSBjb2RlIGhlcmVdIDxodHRwczovL2dpdGh1Yi5jb20vam9obnJpZGVzYWJpa2UvYWN1dGlz Pg0KDQpbVGhlIEFjdXRpcyB0ZW1wbGF0ZSBsYW5ndWFnZSwgb3I6IGhvdyBJIG92ZXItZW5naW5l ZXJlZCBhIHByb2dyYW0gdGhhdA0KanVzdCBwcmludHMgdGV4dF0gPGh0dHBzOi8vam9obnJpZGVz YS5iaWtlL3NvZnR3YXJlL2FjdXRpcy8+DQoNCg0KTWlyYWdlT1MgcG9kY2FzdA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9taXJhZ2Vvcy1wb2RjYXN0LzE0OTI3LzE+DQoNCg0K SGFubmVzIE1laG5lcnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHJlY2VudGx5 IHdhcyBpbnRlcnZpZXdlZCBieSBNYXR0aGlhcyBLaXJzY2huZXIgZnJvbSBGU0ZFIGFib3V0DQog IE1pcmFnZU9TICgrIE9DYW1sKS4gVGhlIHJlc3VsdCBpcyBhIHBvZGNhc3QNCiAgPGh0dHBzOi8v ZnNmZS5vcmcvbmV3cy9wb2RjYXN0L2VwaXNvZGUtMjUuZW4uaHRtbD4NCg0KICBTcHJlYWQgdGhl IHdvcmQsIGhhdmUgYSBsaXN0ZW4sIGFuZCBwbGVhc2UgZG9uJ3QgaGVzaXRhdGUgdG8gZ2l2ZQ0K ICBmZWVkYmFjayAtIHZpYSBlbWFpbCBvciBpbiB0aGlzIHRocmVhZC4NCg0KDQpPbGQgQ1dODQri lZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3Ig Z28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0K ICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdl ZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQog IFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2No bWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBz Oi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 02 to 09, 2024.

    The Structure of Godotcaml as of Today, by Matt Walker [Fizzix= nerd]

    Matt Walker announced

    Fixed some bugs in the Godot OCaml bindings I'm working on. Here is a blog= post that could be of interest if you're looking to dive into them, or usi= ng Ctypes in another project, or are writing Godot bindings for another lan= guage, or just have some time to kill. :smiley:=20

    https://fizzixnerd.com/blog/2024-07-02-the-structure-of-god= otcaml-as-of-today/

    opam 2.2.0 is out!

    Kate announced

    We=E2=80=99re very happy to finally announce the release of opam 2.2.0.

    What=E2=80=99s new?

    • Windows support :window: :tada: (you can hear all about it in th= e blog post)
    • opam tree / opam why: new commands showing a = tree view of the given packages and their dependencies and reverse-dependen= cies, respectively.
    • with-dev-setup: a new variable and argument to install the= recommend developement setup for a local project.
    • opam pin --recursive and --subpath to have op= am look at opam files elsewhere than the root directory of a project.
    • opam switch - to go back to the previous global switch (in= spired by git switch -)
    • opam pin --current fixes a package to its current state (d= isabling pending reinstallations or removals from the repository)
    • opam pin remove --all removes all the pinned packages from= a switch
    • opam exec --no-switch removes the opam environment when ru= nning a command. It is useful when you want to launch a command without opa= m environment changes.
    • opam clean --untracked removes untracked files interactive= ly remaining from previous packages removal.
    • opam admin add-constraint <cst> --packages pkg1,pkg2,pkg3 applies the given constraint to a given set of packages
    • opam list --base has been renamed into --invariant, reflecting the fact that since opam 2.1 the "base" packages of a swi= tch are instead expressed using a switch invariant
    • opam install --formula <formula> installs a formula = instead of a list of packages. This can be useful if you would like to inst= all one package or another one. For example opam install --formula '"= extlib" | "extlib-compat"' will install either extlib o= r extlib-compat depending on what's best for the current switc= h.
    • and many other features, performance improvements and fixes

    :open_book: You can read our blog post for more information about these changes and a lot more.

    How to upgrade

    In case you plan a possible rollback, you may want to first backup your

    ~/.opam or $env:LOCALAPPDATA\opam directory.

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.2.0"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubuserconten=
    t.com/ocaml/opam/master/shell/install.ps1) }"
    

    or download manually from the Github "Releases" page to your PATH.

    You should then run:

    opam init --reinit -ni
    

    OCaml.org Newsletter: June 2024

    Sabine Schmaltz announced

    Welcome to the June 2024 edition of the OCaml.org newsletter! This update h= as been compiled by the OCaml.org team. You can find previous updates on Discuss.

    Our goal is to make OCaml.org the best resource for anyone who wants to get= started and be productive in OCaml. The OCaml.org newsletter provides an u= pdate on our progress towards that goal and an overview of the changes we a= re working on.

    We couldn't do it without all the amazing people who help us review, revise= , and create better OCaml documentation and work on issues. Your participat= ion enables us to so much more than we could just by ourselves. Thank you!

    This newsletter covers:

    • Recipes for the OCaml Cookbook: Help us make the OCaml Cookbook = really useful by contributing and reviewing recipes for common tasks!
    • Community & Marketing Pages Rework: Implementation work in p= rogress.
    • General Improvements: As usual, we also worked on general mainte= nance and improvements, so we're highlighting some of the work that happene= d below.

    Open Issues for Contributors

    Recipes for the OCaml Cookbook

    The OCaml Cookbook is a place where OCaml developers share how to solve com= mon tasks using packages from the ecosystem.

    A recipe is a code sample and explanations on how to perform a task using a= combination of open-source libraries.

    The Cookbook is live at ocaml.org/co= okbook.

    Here's how you can help:

    1. Review, then open pull requests for cookbook recipes!
    2. Contribute new recipes and tasks for the cookbook!

    Relevant PRs and Activities:

    Community & Marketing Pages Rework

    We have UI designs for the reworked and new pages of the = community section, and implementation is in progress.

    Relevant PRs and Activities:

    General Improvements and Data Additions

    Summary:

    Relevant PRs and Activities:

    ocaml-libbpf: Libbpf C-bindings for OCaml

    Lee Koon Wen announced

    I'm excited to announce the first release of ocaml-libbpf, a new library pr= oviding OCaml bindings for libbpf, the essential C library for working with= eBPF programs. This library allows you to load, initialize, link, and mana= ge eBPF programs within OCaml, simplifying the process of working with thes= e powerful in-kernel applications.

    opam install libbpf
    

    Key Features:

    • High-level and Low-level APIs: Access both raw bindings and user-friend= ly high-level functions for eBPF management.
    • Seamless Integration: Load eBPF ELF files into the kernel with ease.
    • BPF Map Support: Manage BPF maps for communication between user space a= nd kernel space.

    For more information, visit the ocaml-libbpf repo. Contributions and feedback are welcome!

    Enjoy!

    How I built the Acutis template language in OCaml

    John announced

    Acutis is a personal project I've been developing on-and-off over the last = few years. It's a template language (similar to Mustache, Nunjucks, etc.) t= hat has a static type system, uses pattern-matching, and can compile templa= tes into JavaScript files. I'm sharing it now because it's reached a somewh= at-stable state.

    You can view its home page here= and its source co= de here. I also wrote a blog-style article that explains how I created = Acutis, the problems I faced, and the decisions I made. You can read it her= e: "The Acutis templat= e language, or: how I over-engineered a program that just prints text".

    I don't especially expect people to use Acutis much, since it's very person= al and based around my specific use cases. (Also, we have an overabundance = of template languages already anyway.) Nonetheless, building it was a fun a= nd rewarding learning experience for me. Perhaps some people will find it a= s interesting as I did. =F0=9F=99=82

    MirageOS podcast

    Hannes Mehnert announced

    I recently was interviewed by Matthias Kirschner from FSFE about MirageOS (= + OCaml). The result is a podcast https://fsfe.org/news/podcast/episode-25.en.html

    Spread the word, have a listen, and please don't hesitate to give feedback = - via email or in this thread.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=sxFAP1in; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=KO1VUhIf; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 4C411B80123 for ; Tue, 16 Jul 2024 07:30:51 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=W+qtI1fCfRJeSf+1tiFEchu50eEHOiOnToVXgW8/qys=; b=sxFAP1inLLUv2rmQdo+85WaCBIy/E/k57GrX7DijcMlaXNLwJwcBq6sA Ol+8Pf99PcN7Mh/tQ5iiGQETTwl+SwrybSUH5xlgV/7zbGvBZttNzZQOh 3S9qj3TrhEmD8zI7ooL4aSfajqKUnabMQKZFU77CGUXUd2hdiDCXDAWeC c=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,211,1716242400"; d="scan'208,217";a="175627608" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Jul 2024 08:30:49 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 4C4C7E0AF1; Tue, 16 Jul 2024 08:30:49 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 7CD0EE0AF1 for ; Tue, 16 Jul 2024 08:24:50 +0200 (CEST) IronPort-SDR: 66961230_U5rL5t7DU2rWtVm2FNIzpCQx9c9Zil+CtKHXv04brZMYWdY 2wMRAGZ8GqdOkX3sUzOQuNkPpbOJxWwmCJ0BI9g== X-IPAS-Result: =?us-ascii?q?A0GDBAD9EZZmlyIeaIFaHAEBATwBAQQEAQECAQEHAQGBZ?= =?us-ascii?q?AKBP1soGQFiWjMHCEiEVoNPjhuBFpslgVaBJQMYFiMUAQMBDRQCAQIOBwEFD?= =?us-ascii?q?QECBAEBAwECAYILgnQCFokWAh8GAQQwCQ4BAgQBAQEBAwIDAQEBAQEBCAEBB?= =?us-ascii?q?QEBAQIBAQIEBgECEAEBAQEBAQEBNwUQNYV1DYJKLiNvYwIGAzYBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBM2sDBgQGE?= =?us-ascii?q?wEBJhIYIwMQBAEGAwIEDQE1FwEJCRQFAYIOWAGCZAMEAQwGP5Mdmzx6fzOBA?= =?us-ascii?q?YIMAQEGgQg+AwsCBQEOCSbaBIFjCYFIAYgWGgEFH0hpAoQlCYQ3Jw+BVUSBF?= =?us-ascii?q?YJyB2+CShcCAQEBF4EeBgEBDEABCYMlgmmGByaBXQGFSVeDHUGBSy9tgQgvF?= =?us-ascii?q?w2CIkIMBA8egQ9pCAIGFkEvKAhOVw9ZckJWDoFIgT5/JAILgRsQi3+BSSIDJ?= =?us-ascii?q?jMhEwFVExcLPh0CFgMbFAQwDwkLJikGOQISDAYGBlk0CQQjAwgEA0IDIHERA?= =?us-ascii?q?wQaBAsHd4E8gWkEE0QDgTeHGIJPgzGCGYQZhTKBawxhh3uBcYE+gWFMgn5Kh?= =?us-ascii?q?UgdQAMLbT01FBuqEwQ3AoMDCSYIBkAVTR8HBRQICAQCAiACLggODhELAQoTB?= =?us-ascii?q?QEdDgktEgsIAwsCLZI0FCUDnVeUVTQHhBeBXQYMiH6BJJVwhAWBVosqkHCIR?= =?us-ascii?q?yKYSSCCNIcfgSUJX4EOHkyVQoVTgWc6PG8eDAczGjBDDQyCTglGHA9YkUOBP?= =?us-ascii?q?oEmgXU7xThBNQIBATcCBwEKAQEDCYVFHQEBaYIiM21dAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:9W5aiqOoS0SDjMBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: =?us-ascii?q?9a23=3ATLJ4i2lVFWCx4mQIYY+e6GG4XfvXOTr01HD9AXC?= =?us-ascii?q?UMmkzSOWbQ1/P4PpHsOM7zg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3Afd2wHQ0j4RF5AMYlDskI867J+TUj6YqSF0oHu7Y?= =?us-ascii?q?8tMChED11YD6RyzC7e9py?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,211,1716242400"; d="scan'208,217";a="92244432" X-MGA-submission: =?us-ascii?q?MDFSvNeNouh6GTM172O+trorKbWZy8yWzGtpbS?= =?us-ascii?q?ONRNPqoIS/bUih1Cv6o9fHj3cYvUITIaS9ojLjF8W7oPg+my/KSJ7x9V?= =?us-ascii?q?NcbLPWPI7ot6bAWzWmtm3dS2RqbErO/YMSiR+b5mqsPs/1qVeUX8ugc+?= =?us-ascii?q?8S9ZaPDzILL6+vRVQhhvCs3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Jul 2024 08:24:49 +0200 Received: from TM.local (unknown [37.174.102.65]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 443C2564834; Tue, 16 Jul 2024 08:24:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1721111086; bh=P9ej2xn/NnqIYV4XJ+4mBZ9WfARIyq1+LmFWiiyX00Y=; h=From:To:Subject:Date:Message-ID; b=KO1VUhIf6vawn8GOdfGArMNhe1e0Ofg3N4Y2B+eRJvcTcWri8aIDzopfJCUE4gzvj c0I7KfqPBEyrHJplwY7j62je/pMXUcO5hUlp8PjuKeP5zb6HW9ahTgS8+/zDoeakha Iv9p1TanTz//hxE94hq0yPgOYkocsJzC8ZK54HI8= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 16 Jul 2024 08:24:45 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 16 08:24:47 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.452912, queueID=CE8F2564837 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19157 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAwOSB0byAxNiwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KT0NhbWwgRkZJ IFNoYXJwIEVkZ2VzIGFuZCBIb3cgdG8gQXZvaWQgVGhlbQ0KT3J0YWMgMC4zLjAgRHluYW1pYyBm b3JtYWwgdmVyaWZpY2F0aW9uIG1hZGUgZWFzeQ0KZHJlYW0taHRtbCBhbmQgcHVyZS1odG1sIDMu NS4yDQpUaGUgT0NhbWwgY29tbXVuaXR5IGlzIHNpZ25lZCB1cCBmb3IgT3V0cmVhY2h5IQ0KT0Nh bWwgTFNQIDEuMTguMA0KMm5kIGVkaXRvciB0b29saW5nIGRldi1tZWV0aW5nOiAyNXRoIG9mIEp1 bHkg8J+nmQ0KQSAoUG9zc2libHkpIFNhZmVyIEludGVyZmFjZSB0byB0aGUgQ3R5cGVzIEZGSQ0K T0NhbWwgV29ya3Nob3AgMjAyNCBhdCBJQ0ZQIOKAkyBhbm5vdW5jZW1lbnQgYW5kIGNhbGwgZm9y IHByb3Bvc2Fscw0KbGl2aW5nIDAuMS4wDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0K T0NhbWwgRkZJIFNoYXJwIEVkZ2VzIGFuZCBIb3cgdG8gQXZvaWQgVGhlbQ0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ibG9nLW9j YW1sLWZmaS1zaGFycC1lZGdlcy1hbmQtaG93LXRvLWF2b2lkLXRoZW0vMTQ5MzUvMT4NCg0KDQpN YXR0IFdhbGtlciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdyb3RlIGFub3RoZXIgYmxvZyBwb3N0 IGFib3V0IG15IGFkdmVudHVyZXMgaW4gR29kb3RjYW1sLiAgQ2hlY2sgaXQNCiAgb3V0IGlmIHlv dSdyZSBpbnRlcmVzdGVkIGluIHNvbWUgZGV0YWlscyBvZiBtZW1vcnkgbWFuYWdlbWVudCB3aXRo IGENCiAgQ3R5cGVzIEZGSS4gIFdvdWxkIGxvdmUgdG8gaGVhciBpbnB1dCB0byBzb21lIG9mIHRo ZSBxdWVzdGlvbnMgYXNrZWQNCiAgaW4gdGhlIHBvc3QsIHRvbywgaWYgeW91J2QgbGlrZSENCg0K ICA8aHR0cHM6Ly9maXp6aXhuZXJkLmNvbS9ibG9nLzIwMjQtMDctMDktb2NhbWwtZmZpLXNoYXJw LWVkZ2VzLWFuZC1ob3ctdG8tYXZvaWQtdGhlbS8+DQoNCg0KT3J0YWMgMC4zLjAgRHluYW1pYyBm b3JtYWwgdmVyaWZpY2F0aW9uIG1hZGUgZWFzeQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t b3J0YWMtMC0zLTAtZHluYW1pYy1mb3JtYWwtdmVyaWZpY2F0aW9uLW1hZGUtZWFzeS8xNDkzNi8x Pg0KDQoNCk5pY29sYXMgT3Nib3JuZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEknbSB2ZXJ5IHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhpcyBleGNpdGluZyBuZXcgcmVsZWFzZSBv ZiBPcnRhYw0KICBwYWNrYWdlcyENCg0KICBPcnRhYyBpcyBhIHNldCBvZiB0b29scyBmb3IgZHlu YW1pYyB2ZXJpZmljYXRpb24gb2YgR29zcGVsIGZvcm1hbA0KICBzcGVjaWZpY2F0aW9ucyBvZiBP Q2FtbCBjb2RlLg0KDQogIFlvdSBjYW4gZmluZCB0aGUgcHJvamVjdCBvbiBbdGhpcyByZXBvXSBh bmQgaW5zdGFsbCB0aGUgcmVsZWFzZWQNCiAgcGFja2FnZXMgdmlhIGBvcGFtJy4NCg0KICBSZWxl YXNlZCBwYWNrYWdlcyBhcmU6DQogIOKAoiBgb3J0YWMtY29yZScNCiAg4oCiIGBvcnRhYy1ydW50 aW1lJw0KICDigKIgYG9ydGFjLXJ1bnRpbWUtcWNoZWNrLXN0bScNCiAg4oCiIGBvcnRhYy1xY2hl Y2stc3RtJw0KICDigKIgYG9ydGFjLWR1bmUnDQoNCiAgQnV0IHJ1bm5pbmc6IGAkIG9wYW0gaW5z dGFsbCBvcnRhYy1xY2hlY2stc3RtIG9ydGFjLWR1bmUnIHNob3VsZCBiZQ0KICBlbm91Z2ggdG8g aW5zdGFsbCB3aGF0IGlzIG5lY2Vzc2FyeS4NCg0KICBBcGFydCBmcm9tIHNvbWUgZml4ZXMsIHRo aXMgcmVsZWFzZSBicmluZ3MgdGhyZWUgbWFpbiBpbXByb3ZlbWVudHMgdG8NCiAgdGhlIE9ydGFj L1FDaGVjay1TVE0gbW9kZS4NCg0KICBUaGUgZmlyc3Qgb25lIGlzIGFib3V0IHVzZXIgZXhwZXJp ZW5jZS4gVGhpcyBpcyBhIHR3by1wYXJ0cw0KICBpbXByb3ZlbWVudCBhcyB3ZToNCg0KICAxLiBt b3ZlIHRvIGEgbW9kdWxlLWJhc2VkIGNvbmZpZ3VyYXRpb24gdG8gcmVkdWNlIHRoZSBudW1iZXIg b2YNCiAgICAgYXJndW1lbnRzIHRvIGdpdmUgYG9ydGFjIHFjaGVjay1zdG0nIHdoaWxlIGluY3Jl YXNpbmcgdGhlDQogICAgIGZsZXhpYmlsaXR5IG9mIGNvbmZpZ3VyYXRpb24gKHNlZSBbZG9jdW1l bnRhdGlvbl0gZm9yIG1vcmUNCiAgICAgaW5mb3JtYXRpb24pDQogIDIuIHJlbGVhc2UgdGhlIE9y dGFjL0R1bmUgcGx1Z2luIHdoaWNoIGdlbmVyYXRlcyB0aGUgZHVuZSBydWxlcw0KICAgICBuZWNl c3NhcnkgdG8gZ2VuZXJhdGUgYW5kIHJ1biB0aGUgdGVzdHMgKHNlZSBbUkVBRE1FXSBmb3IgdXNh Z2UpLg0KDQogIFdpdGggdGhlc2UgdHdvIGltcHJvdmVtZW50cywgd2UgYmVsaWV2ZSB0aGF0IHlv dSBoYXZlIGEgdmVyeSBnb29kDQogIGV4Y3VzZSBmb3Igbm90IHdyaXRpbmcgdGVzdHM6IGl0IGlz IHZlcnkgZWFzeSB0byBnZW5lcmF0ZSB0aGVtIQ0KDQogIFRoZSBzZWNvbmQgaW1wcm92ZW1lbnQg aXMgcmVsYXRlZCB0byB0aGUgc3VwcG9ydGVkIHN1YnNldCBvZiBHb3NwZWwsDQogIG1haW5seSBh Ym91dCBob3cgeW91IGNhbiBleHByZXNzIHRoZSBsb2dpY2FsIG1vZGVsIGZvciB5b3VyIE9DYW1s DQogIHR5cGVzOiB5b3UgZG9uJ3QgaGF2ZSB0byBsaW1pdCB5b3Vyc2VsZiBhbnltb3JlIHRvIHRo ZSBHb3NwZWwgc3RhbmRhcmQNCiAgbGlicmFyeS4NCg0KICBGaW5hbGx5LCBzb21lIHdvcmsgaGFz IGJlZW4gcHV0IG9uIGV4dGVuZGluZyB0aGUgY292ZXJhZ2Ugb2YgdGhlDQogIGdlbmVyYXRlZCB0 ZXN0czogZnVuY3Rpb25zIHdpdGhvdXQgYW55IFNVVCBhcmd1bWVudCBhbmQgZnVuY3Rpb25zDQog IG1lbnRpb25pbmcgdHVwbGVzIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIHRlc3RlZCB2YWx1ZXMu DQoNCiAgSGFwcHkgdGVzdGluZyENCg0KDQpbdGhpcyByZXBvXSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sLWdvc3BlbC9vcnRhYz4NCg0KW2RvY3VtZW50YXRpb25dDQo8aHR0cHM6Ly9vY2FtbC1n b3NwZWwuZ2l0aHViLmlvL29ydGFjL29ydGFjLXFjaGVjay1zdG0vaW5kZXguaHRtbD4NCg0KW1JF QURNRV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZ29zcGVsL29ydGFjL3RyZWUvbWFpbi9w bHVnaW5zL2R1bmUtcnVsZXM+DQoNCg0KZHJlYW0taHRtbCBhbmQgcHVyZS1odG1sIDMuNS4yDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1sLXB1cmUtaHRtbC0zLTUtMi8xNDgw OC8zPg0KDQoNCllhd2FyIEFtaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbQU5OXSBkcmVhbS1odG1s ICYgcHVyZS1odG1sIDMuNi4wDQoNCiAgSGVsbG8sIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhl IGZvbGxvd2luZyBjaGFuZ2VzOg0KDQogIOKAoiBBZGRlZCBzb21lIGh0bXggYXR0cmlidXRlcyB0 aGF0IGhhZCBiZWVuIG9taXR0ZWQuIE5vdyBhcyBmYXIgYXMgSQ0KICAgIGNhbiB0ZWxsIHdlIGhh dmUgY29tcGxldGUgY292ZXJhZ2Ugb2YgYWxsIGNvcmUgYXR0cmlidXRlcywNCiAgICBhZGRpdGlv bmFsIGF0dHJpYnV0ZXMsIGFuZCB0aG9zZSB1c2VkIGJ5IGNvcmUgZXh0ZW5zaW9ucy4NCiAg4oCi IEFkZCBhIGA/aGVhZGVyOmJvb2wnIG9wdGlvbmFsIHBhcmFtZXRlciB0byBgdG9feG1sJyBhbmQg YHBwX3htbCcNCiAgICBmdW5jdGlvbnMgdG8gY29udmVuaWVudGx5IHJlbmRlciB0aGUgWE1MIGhl YWRlciBhcyBwYXJ0IG9mIHRoZQ0KICAgIG91dHB1dC4NCg0KDQpUaGUgT0NhbWwgY29tbXVuaXR5 IGlzIHNpZ25lZCB1cCBmb3IgT3V0cmVhY2h5IQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC90aGUtb2NhbWwt Y29tbXVuaXR5LWlzLXNpZ25lZC11cC1mb3Itb3V0cmVhY2h5LzEzODkyLzE5Pg0KDQoNClNpZGRo aSBBZ3Jhd2FsIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBTaWRkaGksIGFu IE91dHJlYWNoeSBTdW1tZXIgMjAyNCBpbnRlcm4gd2l0aCB0aGUgT0NhbWwNCiAgY29tbXVuaXR5 LiBJIGFtIHdvcmtpbmcgb24gdGhlIFtvY2FtbC1hcGktd2F0Y2hdIHByb2plY3Qgd2hpY2ggaXMg YQ0KICB0b29sIHRoYXQgZGV0ZWN0cyBjaGFuZ2VzIGluIHRoZSBwdWJsaWMgQVBJIG9mIGEgbGli cmFyeSBhbmQgZGlzcGxheXMNCiAgdGhlbSBpbiBhIGh1bWFuIHJlYWRhYmxlLCBnaXQgZGlmZi1s aWtlIGZvcm1hdCBzbyB0aGF0IHRoZSB1c2VycyBhbmQNCiAgbWFpbnRhaW5lcnMgY2FuIHN0YXkg b24gdG9wIG9mIHRoZW0uIEkgYW0gYmVpbmcgbWVudG9yZWQgYnkNCiAgQHNob25mZWRlciwgQE5h dGhhblJlYiBhbmQgT2RpbmFrYSBKb3kgKEkgYW0gb25seSBhYmxlIHRvIG1lbnRpb24NCiAgcGVv cGxlIGhlcmUpIGFuZCBpdCBoYXMgYmVlbiBhIGdyZWF0IGV4cGVyaWVuY2Ugc28gZmFyLg0KDQog IEkgaGF2ZSBsaW5rZWQgbXkgW2Jsb2dzXSBoZXJlIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGtub3cg bW9yZSBhYm91dCB0aGUNCiAgcHJvamVjdC4NCg0KDQpbb2NhbWwtYXBpLXdhdGNoXSA8aHR0cHM6 Ly9naXRodWIuY29tL05hdGhhblJlYi9vY2FtbC1hcGktd2F0Y2g+DQoNCltibG9nc10gPGh0dHBz Oi8vc2lkZGhpYWdnLndvcmRwcmVzcy5jb20vPg0KDQoNCk9DYW1sIExTUCAxLjE4LjANCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLWxzcC0xLTE4LTAvMTQ5NTIv MT4NCg0KDQpQaXppZUR1c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgaGFwcHkgdG8gYW5ub3Vu Y2UgdGhlIHJlbGVhc2Ugb2YgW29jYW1sLWxzcCAxLjE4LjBdICENCg0KICAqTmV3IEZlYXR1cmVz OioNCg0KICBUaGlzIHJlbGVhc2UgYnJpbmdzIGV4Y2l0aW5nIG5ldyBmZWF0dXJlcyBzdWNoIGFz IGltcHJvdmVkIGhvdmVyDQogIGJlaGF2aW9yIHdpdGggbGVzcyBub2lzeSBob3ZlcnMgb24gc29t ZSBQYXJzZXRyZWUgbm9kZXMgc3VjaCBhcw0KICBrZXl3b3JkcywgY29tbWVudHMgZXRjLiBhbG9u ZyB3aXRoIHN1cHBvcnQgZm9yIGhvdmVyaW5nIG92ZXIgUFBYDQogIGFubm90YXRpb25zIGFuZCBw cmV2aWV3IHRoZSBnZW5lcmF0ZWQgY29kZS4gVGhpcyByZWxlYXNlIGFsc28gaGF2ZQ0KICBzdXBw b3J0IGZvciBzb21lIGFkZGl0aW9uYWwgY3VzdG9tIHF1ZXJpZXMsIGZvbGRpbmcgYGlmdGhlbmVs c2UnDQogIGV4cHJlc3Npb25zLCBhIG5ldyBjb25maWd1cmF0aW9uIG9wdGlvbiB0byBjb250cm9s IGR1bmUgZGlhZ25vc3RpY3MsDQogIGltcHJvdmVkIGRvY3VtZW50IHN5bWJvbHMsIGFuZCBmaXhl cyB0byBhIGhhbmRmdWwgb2YgaXNzdWVzLg0KDQogIERvIG5vdCBoZXNpdGF0ZSB0byByZXBvcnQg YW55IHN1c3BpY2lvdXMgYmVoYXZpb3IgaW4gdGhlIFtpc3N1ZQ0KICB0cmFja2VyXQ0KDQoNCltv Y2FtbC1sc3AgMS4xOC4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1sc3AvcmVs ZWFzZXMvdGFnLzEuMTguMD4NCg0KW2lzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwtbHNwL2lzc3Vlcz4NCg0KDQoybmQgZWRpdG9yIHRvb2xpbmcgZGV2LW1lZXRp bmc6IDI1dGggb2YgSnVseSDwn6eZDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi0ybmQtZWRpdG9yLXRv b2xpbmctZGV2LW1lZXRpbmctMjV0aC1vZi1qdWx5LzE0OTUzLzE+DQoNCg0KdmRzIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQWZ0ZXIgdGhl IHN1Y2Nlc3Mgb2Ygb3VyIFtmaXJzdCBwdWJsaWMgZGV2LW1lZXRpbmddLCB3ZSBhcmUgb3JnYW5p emluZw0KICB0aGUgbmV4dCBvbmUgb24gdGhlIDI1dGggb2YgSnVseSBhdCA1cG0gQ0VTVC4gIFdo ZXRoZXIgeW91IGFyZSBhIGxvbmcNCiAgdGltZSBtYWludGFpbmVyLCBhbiBvY2Nhc2lvbmFsIGNv bnRyaWJ1dG9yLCBhIG5ldyBjb21lciwgb3Igc2ltcGx5IGENCiAgY3VyaW91cyBwYXNzZXItYnks IHBsZWFzZSBmZWVsIGZyZWUgdG8gYXR0ZW5kIQ0KDQogIOKcqCBXZSBoYXZlIHR3byB0YWxrcyBz Y2hlZHVsZWQgZm9yIHRoaXMgc2Vzc2lvbjoNCiAg4oCiIEBvY3RhY2hyb24gd2lsbCBwcmVzZW50 IGhpcyB3b3JrIG9uIGhhdmluZyBzdHJ1Y3R1cmVkIGNvbXBpbGVyDQogICAgb3V0cHV0DQogIOKA oiBAbm9qYiB3aWxsIHByZXNlbnQgInR5cGVkIGdyZXAiIGFuIHRvb2wgdXNlZCBhdCBMZXhpRmkg dG8gc2VhcmNoIGJ5DQogICAgdHlwZSBpbiB0aGUgY29kZWJhc2UuDQoNCiAg8J+TiyBNZWV0aW5n IGFnZW5kYToNCiAg4oCiIEEgdG91ci1kZS10YWJsZSB0byBhbGxvdyB0aGUgcGFydGljaXBhbnRz IHRoYXQgd2lzaCB0byBkbyBzbyB0bw0KICAgIHByZXNlbnQgdGhlbXNlbHZlcyBhbmQgbWVudGlv biBpc3N1ZXMgLyBwcnMgdGhleSBhcmUgaW50ZXJlc3RlZCBpbi4NCiAg4oCiIFRhbGtzIGFuZCBR JkENCiAg4oCiIERpc2N1c3MgaXNzdWVzIGFuZCBwdWxsIHJlcXVlc3RzIHRoYXQgd2VyZSB0YWdn ZWQgaW4gYWR2YW5jZSBvcg0KICAgIG1lbnRpb25lZCBkdXJpbmcgdGhlIHRvdXItZGUtdGFibGUu DQogIOKAoiBEaXNjdXNzIHBvc3NpYmxlIGFsdGVybmF0aXZlIG1lZXRpbmcgaG91cnMuDQoNCiAg V2UncmUgbG9va2luZyBmb3J3YXJkIHRvIG1lZXRpbmcgeW91IQ0KDQogIOKAoiBNZWV0aW5nIGxp bms6IDxodHRwczovL21lZXQuZ29vZ2xlLmNvbS96aG4tZ2l3cy1nbnU+DQogIOKAoiBDYWxlbmRh ciBldmVudDoNCiAgICA8aHR0cHM6Ly9jYWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL2V2ZW50 P2FjdGlvbj1URU1QTEFURSZhbXA7dG1laWQ9TXpSb2FUQXhjWEppTm1WbVl6bG9hbXhqYkRZM01q WTFZVGNnZFd4NWMzTmxRSFJoY21sa1pYTXVZMjl0JmFtcDt0bXNyYz11bHlzc2UlNDB0YXJpZGVz LmNvbT4NCiAg4oCiIFByZXZpb3VzIG1lZXRpbmcgbm90ZXMgYXJlIGF2YWlsYWJsZSBpbiBbTWVy bGluJ3MgcmVwb3NpdG9yeSB3aWtpXS4NCg0KDQpbZmlyc3QgcHVibGljIGRldi1tZWV0aW5nXQ0K PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcHVibGljLWVkaXRvci10b29s aW5nLWRldi1tZWV0aW5nLzE0ODI0Pg0KDQpbTWVybGluJ3MgcmVwb3NpdG9yeSB3aWtpXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vd2lraS9QdWJsaWMtZGV2JUUyJTgwJTkwbWVl dGluZ3M+DQoNCg0KQSAoUG9zc2libHkpIFNhZmVyIEludGVyZmFjZSB0byB0aGUgQ3R5cGVzIEZG SQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9ibG9nLWEtcG9zc2libHktc2FmZXItaW50ZXJmYWNlLXRvLXRoZS1j dHlwZXMtZmZpLzE0OTU0LzE+DQoNCg0KTWF0dCBXYWxrZXIgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBIaSB0aGVyZSwgYW5vdGhlciBibG9nIHBvc3QuDQoNCiAgVGhpcyB0aW1lIEkgZGlzY3VzcyBp ZGVhcyBmb3IgYSBuZXcgaW50ZXJmYWNlIHRoYXQgaGVscHMgbG9jYWxpemUgdGhlDQogIHBvc3Np YmlsaXRpZXMgb2YgZXJyb3JzIHdoZW4gd29ya2luZyB3aXRoIGEgQ3R5cGVzLXN0eWxlIEZGSS4g IENvbW1lbnQNCiAgYmVsb3cgaWYgeW91IGxpa2UvaGF0ZSBpdCBwbGVhc2UhDQoNCiAgPGh0dHBz Oi8vZml6eml4bmVyZC5jb20vYmxvZy8yMDI0LTA3LTExLWEtcG9zc2libHktc2FmZXItaW50ZXJm YWNlLXRvLXRoZS1jdHlwZXMtZmZpLz4NCg0KDQpPQ2FtbCBXb3Jrc2hvcCAyMDI0IGF0IElDRlAg 4oCTIGFubm91bmNlbWVudCBhbmQgY2FsbCBmb3IgcHJvcG9zYWxzDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29j YW1sLXdvcmtzaG9wLTIwMjQtYXQtaWNmcC1hbm5vdW5jZW1lbnQtYW5kLWNhbGwtZm9yLXByb3Bv c2Fscy8xNDM3MS8xMz4NCg0KDQpTb25qYSBIZWluemUgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBUaGUgYWNjZXB0ZWQgdGFsa3MgYXJlIG5vdyBwdWJsaWMhIFlvdSBjYW4gZmluZCB0aGVtIG9u IHRoZSBbV29ya3Nob3ANCiAgd2Vic2l0ZV0uDQoNCiAgV2UncmUgdmVyeSBoYXBweSB3aXRoIHRo ZSBleHBlY3RlZCBxdWFsaXR5IGFuZCBkaXZlcnNpdHkgb2YgdGFsa3MuIFRvDQogIGdpdmUgYSBi aXQgb2YgYSB0YXN0ZSB2aWEgYSBmZXcgZXhhbXBsZXMgb2YgdGFsa3MgdGhhdCB3aWxsIGJlDQog IHByZXNlbnRlZDoNCg0KICDigKIgSW4gdGhlIGNvbnRleHQgb2YgdGhlICpPQ2FtbCBsYW5ndWFn ZSosIF9PbiB0aGUgZGVzaWduIGFuZA0KICAgIGltcGxlbWVudGF0aW9uIG9mIE1vZHVsYXIgRXhw bGljaXRzXyB3aWxsIHByZXNlbnQgYSBtYWpvciBhbmQNCiAgICBsb25nLXdhbnRlZCBuZXcgbGFu Z3VhZ2UgZmVhdHVyZSB3aG9zZSBQUiBvbiB0aGUgY29tcGlsZXIgbGFuZGVkDQogICAgbGFzdCB3 ZWVrLg0KICDigKIgSW4gdGhlIGNvbnRleHQgb2YgdGhlICpPQ2FtbCBlY29zeXN0ZW0qLCBfT3Bh bSAyLjIgYW5kIGJleW9uZF8gd2lsbA0KICAgIHByZXNlbnQgdGVjaG5pY2FsIGRldGFpbHMgYXMg d2VsbCBhcyBzdHJ1Z2dsZXMgYWJvdXQgdGhlIGp1c3QtbGFuZGVkDQogICAgMi4yIHJlbGVhc2Ug b2YgeW91ciBwYWNrYWdlIG1hbmFnZXIuDQogIOKAoiBJbiB0aGUgY29udGV4dCBvZiAqZGF5LXRv LWRheSBPQ2FtbCBhcHBsaWNhdGlvbnMqLCBfQiDCtyBvIMK3IEIsIGENCiAgICB1bml2ZXJzYWwg JiBzZWN1cmUgZmlsZS10cmFuc2ZlciBzb2Z0d2FyZSBpbiBPQ2FtbF8gd2lsbCBwcmVzZW50IGEN CiAgICByZWFsLWxpZmUgTWlyYWdlT3MgYXBwbGljYXRpb24uDQogIOKAoiBJbiB0aGUgY29udGV4 dCBvZiAqT0NhbWwgZGV2ZWxvcGVyIGV4cGVyaWVuY2UqLCBfUHJvamVjdC13aWRlDQogICAgb2Nj dXJyZW5jZXMgZm9yIE9DYW1sLCBhIHByb2dyZXNzIHJlcG9ydF8gd2lsbCBwcmVzZW50IGEgc2hp bnkgbmV3DQogICAgZWRpdG9yIGZlYXR1cmUgdGhhdCBtYWtlcyBPQ2FtbCBjb2RlIG5hdmlnYXRp b24gYSBqb3kuDQogIOKAoiBUaGVyZSB3aWxsIGFsc28gYmUgZm91ciB0YWxrcyBpbiB0aGUgbGFu ZHNjYXBlcyBvZiAqT0NhbWwNCiAgICBtdWx0aS1jb3JlKiAoaS5lLiBPQ2FtbCA1KS4NCg0KICBX ZSd2ZSBnaXZlbiB0aGUgYXV0aG9ycyBhIGZldyB3ZWVrcyB0byB1cGRhdGUgdGhlaXIgYWJzdHJh Y3RzIGFuZA0KICBwYXBlcnMgaWYgdGhleSB3YW50IHRvLiBBdCB0aGUgYmVnaW5uaW5nIG9mIEF1 Z3VzdCwgdGhlIHNjaGVkdWxlZA0KICBwcm9ncmFtIHdpdGggdXBkYXRlZCBhYnN0cmFjdHMgYW5k IGF0dGFjaGVkIHBhcGVycyB3aWxsIGJlIG9uIHRoZQ0KICB3ZWJzaXRlLg0KDQogIEZvciB0aG9z ZSB3aG8gaGF2ZW4ndCBzZWVuIGl0IHlldDogVGhlIHJlZ2lzdHJhdGlvbiBmb3IgdGhlIHdvcmtz aG9wcw0KICBhbmQgdGhlIHdob2xlIGNvbmZlcmVuY2UgW2lzIG9wZW4gbm93XS4gVGhlcmUncyBj dXJyZW50bHkgYW4gZWFybHkNCiAgYmlyZCBkaXNjb3VudCwgd2hpY2ggKmVuZHMgb24gQXVndXN0 IDNyZCouDQoNCiAgQXMgd2UndmUgbWVudGlvbmVkIGFscmVhZHksIHRoZSBpbi1wZXJzb24gZXhw ZXJpZW5jZSBvZiB0aGUgd29ya3Nob3ANCiAgaXMgYSB2ZXJ5IG5pY2Ugb25lLCBhbGxvd2luZyBl dmVyeW9uZSB0byBpbnRlcmFjdCB3aXRoIGNvbGxlYWd1ZXMgYW5kDQogIHRoZSByZXN0IG9mIHRo ZSBjb21tdW5pdHksIHRvIGNoYXQgYWJvdXQgdGhlIHRhbGtzIGFuZCBPQ2FtbCBpbg0KICBnZW5l cmFsLCBoaXQgdXAgdGhlIHNwZWFrZXJzIGV0Yy4gSG93ZXZlciwgaWYgeW91J3JlIG5vdCBhYmxl IHRvIG1ha2UNCiAgaXQsIHlvdSdsbCBzdGlsbCBiZSBhYmxlIHRvIGVuam95IHRoZSB0YWxrczog VGhlIHRhbGtzIHdpbGwgYmUNCiAgbGl2ZS1zdHJlYW1lZCwgYW5kIHNvbWUgdGltZSBsYXRlciBi ZSBtYWRlIHBlcm1hbmVudGx5IGF2YWlsYWJsZQ0KICBvbmxpbmUuDQoNCiAgUmVhbGx5LCBnZW51 aW5lbHksIHRoYW5rcyBhIGxvdCB0byBhbGwgbWVtYmVycyBvZiB0aGUgUHJvZ3JhbQ0KICBDb21t aXR0ZWUgZm9yIHRoZSB2ZXJ5IHZhbHVhYmxlIHJldmlld3MgYW5kIGludGVyYWN0aW9ucyBhcyB3 ZWxsIGFzIHRvDQogIGFsbCB0aGUgYXV0aG9ycyBvZiBhbGwgc3VibWlzc2lvbnMhDQoNCg0KW1dv cmtzaG9wIHdlYnNpdGVdIDxodHRwczovL2ljZnAyNC5zaWdwbGFuLm9yZy9ob21lL29jYW1sLTIw MjQjcHJvZ3JhbT4NCg0KW2lzIG9wZW4gbm93XSA8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcv YXR0ZW5kaW5nL3JlZ2lzdHJhdGlvbj4NCg0KDQpsaXZpbmcgMC4xLjANCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWxpdmluZy0wLTEtMC8xNDk2NC8xPg0KDQoNCk1hdHQgV2Fsa2VyIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSSdtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHByZS1v cGFtIHZlcnNpb24gb2YgdGhlIGBsaXZpbmcnDQogIGxpYnJhcnksIGN1cnJlbnRseSBhdmFpbGFi bGUgb25seSBvbiBHaXRIdWIgZm9yIHRlc3RpbmcuICBJIGhhdmUgc29tZQ0KICBiYXNpYyB0ZXN0 cyBhbmQgYSBSRUFETUUgZXhwbGFpbmluZyB3aGF0IGl0J3MgZm9yLCBidXQgYmFzaWNhbGx5LCBp dA0KICBwcmV2ZW50cyBtaXN0YWtlcyBsaWtlDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGVuIEN0eXBlcw0KICDilIIgDQogIOKUgiAoKiogUmV0dXJucyBhIHBvaW50ZXIgaW50byB0aGUg YXJndW1lbnQgY2hhcmFjdGVyIHN0cmluZyB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QNCiAg4pSC ICAgICBpbnN0YW5jZSBvZiB0aGUgYXJndW1lbnQgY2hhcmFjdGVyLiAqKQ0KICDilIIgbGV0IHN0 cmNociA6IGNoYXIgcHRyIC0+IGNoYXIgLT4gY2hhciBwdHIgPSANCiAg4pSCICAgRm9yZWlnbi5m b3JlaWduICJzdHJjaHIiIChwdHIgY2hhciBALT4gY2hhciBALT4gcmV0dXJuaW5nIChwdHIgY2hh cikpDQogIOKUgiANCiAg4pSCIGxldCAoKSA9DQogIOKUgiAgIGxldCBwID0gQ0FycmF5LnN0YXJ0 IChDQXJyYXkub2Zfc3RyaW5nICJhYmMiKSBpbg0KICDilIIgICBsZXQgcSA9IHN0cmNociBwICdh JyBpbg0KICDilIIgICBsZXQgKCkgPSBHYy5jb21wYWN0ICgpIGluDQogIOKUgiAgIGxldCBjID0g IUAgcSBpbg0KICDilIIgICBpZiBDaGFyLihlcXVhbCBjICdhJykgdGhlbiBwcmludF9lbmRsaW5l ICJ5YXkhIiBlbHNlIHByaW50X2VuZGxpbmUgImJvbyEiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IGFib3ZlIGZyb20gY2F1c2luZyB5b3UgcGFpbi4gIElmIHlvdSB3ZXJlbid0IGF3YXJlLCB0aGUg Y29kZSBhYm92ZQ0KICB3aWxsIGFsbW9zdCBhbHdheXMgcHJpbnQgImJvbyEiLiAgVXNpbmcgYGxp dmluZ2AsIHlvdSBjYW4gcmVwbGFjZSBpdA0KICB3aXRoIHRoaXMgY29kZToNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIG9wZW4gTGl2aW5nDQogIOKUgiBvcGVuIExpdmluZ19jdHlwZXMNCiAg 4pSCIA0KICDilIIgbGV0IHN0cmNociAgOiBjaGFyIHB0ciAtPiBjaGFyIC0+IGNoYXIgcHRyIExp dmluZ19jb3JlLnQgPSANCiAg4pSCICAgbGV0IHN0cmNocl91bnNhZmUgPSBGb3JlaWduLmZvcmVp Z24gInN0cmNociIgKHB0ciBjaGFyIEAtPiBjaGFyIEAtPiByZXR1cm5pbmcgKHB0ciBjaGFyKSkg aW4NCiAg4pSCICAgZnVuIHMgYyAtPiBMaXZpbmdfY29yZS4oc3RyY2hyX3Vuc2FmZSBzIGMgPT4g cykNCiAg4pSCIA0KICDilIIgbGV0IF8gPQ0KICDilIIgICBsZXQgb3BlbiBMaXZpbmdfY29yZS5M ZXRfc3ludGF4IGluDQogIOKUgiAgIGxldCogcCA9IENBcnJheS5zdGFydCAoQ0FycmF5Lm9mX3N0 cmluZyAiYWJjIikgaW4NCiAg4pSCICAgbGV0KiBxID0gc3RyY2hyIHAgJ2EnIGluDQogIOKUgiAg IGxldCAoKSA9IEdjLmNvbXBhY3QgKCkgaW4NCiAg4pSCICAgbGV0KiBjID0gIUAgcSBpbg0KICDi lIIgICBpZiBDaGFyLihlcXVhbCBjICdhJykgdGhlbiBwcmludF9lbmRsaW5lICJ5YXkhIiBlbHNl IHByaW50X2VuZGxpbmUgImJvbyEiDQogIOKUgiAgIExpdmluZ19jb3JlLnJldHVybiAoKQ0KICDi lJTilIDilIDilIDilIANCg0KICBhbmQgaXQgd2lsbCBhbHdheXMgcHJpbnQgInlheSEiDQoNCiAg RWRpdDogc2hvdWxkIHByb2JhYmx5IGxpbmsgdG8gaXQhDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS9GaXp6aXhuZXJkL29jYW1sLWxpdmluZz4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2Nh bWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBP Q2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKA oiBbRnJvbSB0aGUgTGFiIHRvIHRoZSBUcmFkaW5nIEZsb29yIHdpdGggRXJpbiBNdXJwaHldDQoN Cg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbRnJv bSB0aGUgTGFiIHRvIHRoZSBUcmFkaW5nIEZsb29yIHdpdGggRXJpbiBNdXJwaHldDQo8aHR0cHM6 Ly9zaWduYWxzLXRocmVhZHMuc2ltcGxlY2FzdC5jb20vZXBpc29kZXMvZnJvbS10aGUtbGFiLXRv LXRoZS10cmFkaW5nLWZsb29yLXdpdGgtZXJpbi1tdXJwaHktaEQ2R0hNaGM+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4N Cg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFu LnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxo dHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2ht aXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 09 to 16, 2024.

    OCaml FFI Sharp Edges and How to Avoid Them

    Matt Walker announced

    Wrote another blog post about my adventures in Godotcaml. Check it out if = you're interested in some details of memory management with a Ctypes FFI. = Would love to hear input to some of the questions asked in the post, too, i= f you'd like!

    https://fizzixnerd.com/blog/2024-07-09-ocaml-ffi-sharp= -edges-and-how-to-avoid-them/

    Ortac 0.3.0 Dynamic formal verification made easy

    Nicolas Osborne announced

    I'm very pleased to announce this exciting new release of Ortac packages!

    Ortac is a set of tools for dynamic verification of Gospel formal specifica= tions of OCaml code.

    You can find the project on this repo and install the released packages via opam.

    Released packages are:

    • ortac-core
    • ortac-runtime
    • ortac-runtime-qcheck-stm
    • ortac-qcheck-stm
    • ortac-dune

    But running: $ opam install ortac-qcheck-stm ortac-dune should be enough to install what is necessary.

    Apart from some fixes, this release brings three main improvements to the O= rtac/QCheck-STM mode.

    The first one is about user experience. This is a two-parts improvement as = we:

    1. move to a module-based configuration to reduce the number of arguments = to give ortac qcheck-stm while increasing the flexibility of c= onfiguration (see documentation for more information)
    2. release the Ortac/Dune plugin which generates the dune rules necessary = to generate and run the tests (see README for usage).

    With these two improvements, we believe that you have a very good excuse fo= r not writing tests: it is very easy to generate them!

    The second improvement is related to the supported subset of Gospel, mainly= about how you can express the logical model for your OCaml types: you don'= t have to limit yourself anymore to the Gospel standard library.

    Finally, some work has been put on extending the coverage of the generated = tests: functions without any SUT argument and functions mentioning tuples a= re now included in the tested values.

    Happy testing!

    dream-html and pure-html 3.5.2

    Yawar Amin announced

    [ANN] dream-html & pure-html 3.6.0

    Hello, I am happy to announce the following changes:

    • Added some htmx attributes that had been omitted. Now as far as I can t= ell we have complete coverage of all core attributes, additional attributes= , and those used by core extensions.
    • Add a ?header:bool optional parameter to to_xml and pp_xml functions to conveniently render the XML header = as part of the output.

    The OCaml community is signed up for Outreachy!

    Siddhi Agrawal announced

    I am Siddhi, an Outreachy Summer 2024 intern with the OCaml community. I am= working on the oc= aml-api-watch project which is a tool that detects changes in the publi= c API of a library and displays them in a human readable, git diff-like for= mat so that the users and maintainers can stay on top of them. I am being m= entored by @shonfeder, @NathanReb and Odinaka Joy (I am only able to mentio= n people here) and it has been a great experience so far.=20

    I have linked my blogs her= e if you would like to know more about the project.

    OCaml LSP 1.18.0

    PizieDust announced

    We are happy to announce the release of ocaml-lsp 1.18.0 !

    New Features:

    This release brings exciting new features such as improved hover behavior w= ith less noisy hovers on some Parsetree nodes such as keywords, comments et= c. along with support for hovering over PPX annotations and preview the gen= erated code. This release also have support for some additional custom quer= ies, folding ifthenelse expressions, a new configuration optio= n to control dune diagnostics, improved document symbols, and fixes to a ha= ndful of issues.

    Do not hesitate to report any suspicious behavior in the issue tracker

    2nd editor tooling dev-meeting: 25th of July =F0=9F=A7=99

    vds announced

    After the success of our first public dev-meeting, we ar= e organizing the next one on the 25th of July at 5pm CEST. Whether you are= a long time maintainer, an occasional contributor, a new comer, or simply = a curious passer-by, please feel free to attend!

    =E2=9C=A8 We have two talks scheduled for this session:

    • @octachron will present his work on having structured compiler output
    • @nojb will present "typed grep" an tool used at LexiFi to search by typ= e in the codebase.

    =F0=9F=93=8B Meeting agenda:=20

    • A tour-de-table to allow the participants that wish to do so to present= themselves and mention issues / prs they are interested in.
    • Talks and Q&A
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.
    • Discuss possible alternative meeting hours.

    We're looking forward to meeting you!=20

    A (Possibly) Safer Interface to the Ctypes FFI

    Matt Walker announced

    Hi there, another blog post.

    This time I discuss ideas for a new interface that helps localize the possi= bilities of errors when working with a Ctypes-style FFI. Comment below if = you like/hate it please!

    https://fizzixnerd.com/blog/2024-07-11-a-possibly-saf= er-interface-to-the-ctypes-ffi/

    OCaml Workshop 2024 at ICFP – announcement and call for= proposals

    Sonja Heinze announced

    The accepted talks are now public! You can find them on the Workshop website.

    We're very happy with the expected quality and diversity of talks. To give = a bit of a taste via a few examples of talks that will be presented:

    • In the context of the OCaml language, On the design and implementation of Modular Explicits will present = a major and long-wanted new language feature whose PR on the compiler lande= d last week.
    • In the context of the OCaml ecosystem, Opam 2.2 and beyond will present technical details as well as strug= gles about the just-landed 2.2 release of your package manager.
    • In the context of day-to-day OCaml applications, B =C2=B7 o =C2=B7 B, a universal & secure file-transfer soft= ware in OCaml will present a real-life MirageOs application.
    • In the context of OCaml developer experience, Project-wide occurrences for OCaml, a progress report will p= resent a shiny new editor feature that makes OCaml code navigation a joy.
    • There will also be four talks in the landscapes of OCaml multi-core<= /b> (i.e. OCaml 5).

    We've given the authors a few weeks to update their abstracts and papers if= they want to. At the beginning of August, the scheduled program with updat= ed abstracts and attached papers will be on the website.

    For those who haven't seen it yet: The registration for the workshops and t= he whole conference is open now. There's currently an early bird discount, which = ends on August 3rd.

    As we've mentioned already, the in-person experience of the workshop is a v= ery nice one, allowing everyone to interact with colleagues and the rest of= the community, to chat about the talks and OCaml in general, hit up the sp= eakers etc. However, if you're not able to make it, you'll still be able to= enjoy the talks: The talks will be live-streamed, and some time later be m= ade permanently available online.

    Really, genuinely, thanks a lot to all members of the Program Committee for= the very valuable reviews and interactions as well as to all the authors o= f all submissions!

    living 0.1.0

    Matt Walker announced

    I'm pleased to announce the first pre-opam version of the living library, currently available only on GitHub for testing. I have some ba= sic tests and a README explaining what it's for, but basically, it prevents= mistakes like=20

    open Ctypes
    
    (** Returns a pointer i=
    nto the argument character string that points to the first
        instance of the arg=
    ument character. *)
    let strchr : char p=
    tr -> char -> char ptr =3D=20
      Foreign.foreign "strchr" (ptr char @-&=
    gt; char @-> returning (pt=
    r char))
    
    let () =3D
      let p =3D CArray.start (CArray.of_string "abc") in
      let q =3D strchr p =
    'a' in
      let () =3D Gc.compact () in
      let c =3D !@=
     q in
      if Char.(equal c '=
    a') then p=
    rint_endline "yay!" else print_endline "boo!"
    

    above from causing you pain. If you weren't aware, the code above will alm= ost always print "boo!". Using `living`, you can replace it with this code:

    open Living
    open Living_ctypes
    
    let strchr  : char =
    ptr -> char -> char ptr Living=
    _core.t =3D=20
      let strchr_unsafe =3D Foreign.foreign "strchr" (=
    ptr char @-> char @-> returning (ptr char)) in
      fun s c ->=
    ; Living_core.(strchr_unsafe s c =3D=
    > s)
    
    let _ =3D
      let open Living_core.Let_syntax in
      let* p =3D CArray.<=
    /span>start (CArray.of_string "abc") in
      let* q =3D strchr p 'a' in
      let () =3D Gc.compact () in
      let* c =3D !@ q in
      if Char.(equal c '=
    a') then p=
    rint_endline "yay!" else print_endline "boo!"
      Living_core.return ()
    

    and it will always print "yay!"

    Edit: should probably link to it!

    https://github.com/F= izzixnerd/ocaml-living

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=PIhTtvnX; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Ng1u4EhJ; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B4CF4B80123 for ; Tue, 23 Jul 2024 14:31:06 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=J7mCVvJGY+bHOZBJM4eLX4Xt68aVQ8Qdj8umphRGFXQ=; b=PIhTtvnX5bODY3Y8UkAkBoviKP6dPJuhyoYEKlbk2WMlMhhayeBl7gtf r9zWDFB1AXLf8dmHV2SsshgqoMgGe5q4cx7eYH1KZIJzekB4HOPn9CBqL /CY1S+z35zh9nuHDOT3mvkylb+YcClqIqXgmopgmqZtp4IzTlaD7wgL/T U=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,230,1716242400"; d="scan'208,217";a="176668786" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Jul 2024 15:31:06 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7D12FE0D1B; Tue, 23 Jul 2024 15:31:05 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 4652BE0131 for ; Tue, 23 Jul 2024 15:31:01 +0200 (CEST) IronPort-SDR: 669fb092_MhCXOuDLqF6dt7H+JaC862IF+T4MIvYHK/Re39lRtS20Sn4 A/xyaa4m8s4jT6qSTeyKbld58H+nvZ3gxAI9ReQ== X-IPAS-Result: =?us-ascii?q?A0FIAQAesJ9mlyIeaIFahBlbKBkBYlozBwhIhFaDT44dg?= =?us-ascii?q?RaQMYp0gWqBEQMYFiMUAQMBDS4BBQ0BAgQBAQMBAgGEOUYCFokgAh8GAQQ0E?= =?us-ascii?q?wECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBAQE3BUmFd?= =?us-ascii?q?Q2CSi4jPzBjAgYDBgEBAQEBAQEBAScBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBBxIaTxwJChMBATgYIwMJCwEGAwIED?= =?us-ascii?q?QE1FwESGgGCDVgBgmQDBQwGkgmbPHqBMoEBggwBAQaBCD4DCwICAwEOCSUB2?= =?us-ascii?q?gSBYwmBMBiIIRoBJ0hpAoQvhEICJw+BVUSBFTWCPQdvgX5BCxcBAQEBGEQ7J?= =?us-ascii?q?QEBTQkJgxyCaYUYgnIBhUZXChmCWCJBgRM6LgFagR1FX4IiD4EoBXECBgoMc?= =?us-ascii?q?ChWDEsPV3I/EkIOE4JzfSQCC4EbEIMMR4hfgUlLMyETAVUTFws+HQIWAxsUB?= =?us-ascii?q?DAPCQsmKQY5AhIMBgYGWTIJBCMDCAQDQgMgcREDBBoECwd3gTyBaQQTRAOBN?= =?us-ascii?q?4cOgk+DMYIYhBuFMIFrDGGHdoFxgT6BYEqCfkuFUB1AAwttPTUUG6ohBDgCg?= =?us-ascii?q?w8mDjgHTBUCJgUBEwgOAiACLggODh0HAxkdCQUFBARFAQkCCx4RA4x+hW8sn?= =?us-ascii?q?S2UVTQHhBeBXQYMiH+BJI4lh0uEBYFWiyqGfJI7IphKIIlTgSUJX4EsTJUWL?= =?us-ascii?q?AcMhUCBfiM8bx4MBzMaMEOCMwEBATEJCjwcD44tFoEMAQSCR4E+gSaBdTuCb?= =?us-ascii?q?cM9MkE1AgEBBzACBwEKAQEDCYViAQGDPmlhAQE?= IronPort-PHdr: A9a23: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 z1+AnxLpcf2f4mHwToJj/z63ufK0BCKf8Z7WCE= IronPort-Data: A9a23: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 wQ= IronPort-HdrOrdr: A9a23:zcy7aam8WHrunBgvVRQ8Gc9Mdz/pDfLc3DAbv31ZSRFFG/Fw9/ rEoB1p73HJYVEqKQkdcLG7Scy9qBznmKKdjbNxAV7AZmXbUQmTRr2KPbGD/9SIIUSXygc379 YDT0ERMqySMbE3t6nHyTj9KMw4yN2LtIijmOfZyB5WPHhXQpAl1B1hAgKXVnVrSBVLQbo1fa DsgfZvln6aY20easn+PHUfQOTZzue78K7OUFo9HhYi5U20gSm17aOSKWn/4isj X-Talos-CUID: 9a23:uEROFW3csd9EDXGwE24+5rxfSswvf03XznnpHmCEBFxoTaasR3KewfYx X-Talos-MUID: 9a23:7TWn8AvDMnUfT7+gqM2nqixhBoRs546VKW8sr6oZndeZKwhQNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,230,1716242400"; d="scan'208,217";a="92782984" X-MGA-submission: =?us-ascii?q?MDGCgT7itNkG5gHyaRJlawh+093DK4PT206iOe?= =?us-ascii?q?eJjremsFDTZYov8jkA6T+bK/74UmvGjxNtsP1asCDN2Sq/C6thhnkgz5?= =?us-ascii?q?iHiSHHHTVTKLIaJLtNx/Euv+yIkixsbxwfRowDJ5zFuqESU6GgYZbRyl?= =?us-ascii?q?sbznmDHwGTYPCLOB6Rc6VfxA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Jul 2024 15:30:59 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 65C125647D0; Tue, 23 Jul 2024 15:30:57 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1721741457; bh=DdEZV4fTzoK7ct6bE/gkYH1kIudAQCME2R9Sgr+vN7I=; h=From:To:Subject:Date:Message-ID; b=Ng1u4EhJjLYEQf0GPYqgUSz4wtNdvc8iQ4jWhT6DaTL3sD3WD5YUFzemtP/jvH5jt zsSK4XF92k+IuO5sDgr4/Lo7g07SfG6rQroJmss1EM++ePcQ1N46UZ3Vg/SEkWYarZ eRSMIUahBIPuLTGNfXOVLd0vZLViGFlqyTyv40CU= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 23 Jul 2024 15:30:57 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 23 15:30:57 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499995, queueID=AE59B5647E2 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19162 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxNiB0byAyMywNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KQSBUb3VyIG9m IHRoZSBMaXZpbmcgTGlicmFyeSDigJMgQSBTYWZlciBGRkkNCmZpcnN0IHJlbGVhc2Ugb2YgcnBt ZmlsZQ0KRHVuZSBkZXYgbWVldGluZw0KRmlnaHRpbmcgTXV0YXRpb24gd2l0aCBNdXRhdGlvbiBp biBMaXZpbmcNCkEgc21hbGwgZXh0ZW5zaW9uIG9mIEJpZ2FycmF5LkdlbmFycmF5IGFkZGluZyBp dGVyYXRpb24sIG1hcHBpbmcgYW5kIGZvbGRpbmcNCmN1ZGFqaXQ6IEJpbmRpbmdzIHRvIHRoZSBg Y3VkYScgYW5kIGBudnJ0YycgbGlicmFyaWVzDQpScG1maWxlIDAuMi4wIC0gY2hhbmdlbG9nDQpF eHBsb3JpbmcgdGhlIERvY3VzYXVydXMrT2RvYyBjb21ibw0KTW9wc2EgMS4wIOKAkyBNb2R1bGFy IE9wZW4gUGxhdGZvcm0gZm9yIFN0YXRpYyBBbmFseXNpcw0KT0NhbWwgNSBwZXJmb3JtYW5jZQ0K T3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkEgVG91ciBvZiB0aGUgTGl2aW5nIExpYnJh cnkg4oCTIEEgU2FmZXIgRkZJDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctYS10b3VyLW9mLXRoZS1saXZpbmctbGlicmFyeS1h LXNhZmVyLWZmaS8xNDk4MS8xPg0KDQoNCk1hdHQgV2Fsa2VyIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSSd2ZSB3cml0dGVuIGEgbmV3IGJsb2cgcG9zdCBvbiB0aGUgYGxpdmluZycgbGlicmFyeSBJ IGFubm91bmNlZCBhIGZldw0KICBkYXlzIGFnby4gIFBsZWFzZSBnaXZlIGl0IGEgcmVhZCBpZiB5 b3UncmUgaW50ZXJlc3RlZCBpbiBzYWZlIHVzZSBvZg0KICBDdHlwZXMsIG9yIG90aGVyd2lzZSBu ZWVkIGxpZmV0aW1lIG1hbmFnZW1lbnQgaW4gT0NhbWwuDQoNCiAgV291bGQgbG92ZSB0byBoZWFy IHlvdXIgdmlld3MgaW4gdGhpcyB0aHJlYWQhDQoNCiAgPGh0dHBzOi8vZml6eml4bmVyZC5jb20v YmxvZy8yMDI0LTA3LTE3LXRvdXJpbmctdGhlLWxpdmluZy1saWJyYXJ5Lz4NCg0KDQpmaXJzdCBy ZWxlYXNlIG9mIHJwbWZpbGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVhc2Utb2YtcnBtZmlsZS8xNDk4 NS8xPg0KDQoNCk1pa2hhaWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZp cnN0IHJlbGVhc2Ugb2YgW3JwbWZpbGVdLCBhIHNtYWxsIGxpYnJhcnkNCiAgZm9yIHJlYWRpbmcg bWV0YSBpbmZvcm1hdGlvbiBmcm9tIFJQTSBwYWNrYWdlcyAodmVyc2lvbiAzLjApLiBJdCB1c2Vz DQogIHRoZSBBbmdzdHJvbSBjb21iaW5hdG9yIHBhcnNlciBsaWJyYXJ5LCB3aGljaCBhbGxvd3Mg aXQgdG8gcGVyZm9ybQ0KICBzdHJlYW1pbmcgcGFyc2luZyB1c2luZyBMd3Qgb3IgQXN5bmMuDQoN CiAgSG93IHRvIGdldCBhIHBhY2thZ2Ugc3VtbWFyeToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giBtb2R1bGUgUnBtX3JlYWRlciA9IFJwbWZpbGUuUmVhZGVyIChScG1maWxlLlNlbGVjdG9yLkFs bCkNCiAg4pSCIA0KICDilIIgbGV0IG1ldGFkYXRhID0gUnBtX3JlYWRlci5vZl9maWxlX2V4biAi aGVsbG8tMi4xMi4xLTEuNy54ODZfNjQucnBtIg0KICDilIIgDQogIOKUgiBScG1maWxlLnN1bW1h cnkgbWV0YWRhdGENCiAg4pSCICgqIC0gOiBzdHJpbmcgPSAiQSBGcmllbmRseSBHcmVldGluZyBQ cm9ncmFtIiAqKQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgZGVmYXVsdCByZWFkZXIgbW9k dWxlIGNhbiByZWFkIGZyb20gYSBzdHJpbmcgb3IgZmlsZSwgYnV0IGhhcyBwb29yDQogIHBlcmZv cm1hbmNlLiBJdCBuZWVkcyBhIHNlbGVjdG9yIG1vZHVsZSB0byBzZWxlY3QgdGhlIHRhZ3MgdG8N CiAgcGFyc2UuIFRoZSBleGFtcGxlIHVzZXMgYFNlbGVjdG9yLkFsbCcgdG8gcGFyc2UgYWxsIHRh Z3MuDQoNCiAgSSBhbSBkZXZlbG9waW5nIHRoaXMgbGlicmFyeSBmb3IgbXkgcGV0IHByb2plY3Qg dG8gY3JlYXRlIGENCiAgc2VsZi1ob3N0ZWQgUlBNIHJlcG9zaXRvcnkgbWFuYWdlbWVudCBzb2x1 dGlvbi4NCg0KICBUaGFuayB5b3UgZm9yIHlvdXIgYXR0ZW50aW9uIQ0KDQoNCltycG1maWxlXSA8 aHR0cHM6Ly9naXRodWIuY29tL2R4M21vZC9ycG1maWxlPg0KDQoNCkR1bmUgZGV2IG1lZXRpbmcN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1bmUtZGV2LW1lZXRpbmcv MTQ5OTQvMT4NCg0KDQptYWlzdGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgb3JnYW5pemluZyBhIG5ldyBwdWJs aWMgRHVuZSBkZXYgbWVldGluZyBvbiAqV2VkbmVzZGF5LCBKdWx5LA0KICAyNHRoIGF0IDEwYW0g Q0VUKi4gSXQgd2lsbCBiZSBvbmUgaG91ciBsb25nLg0KDQogIFdoZXRoZXIgeW91IGFyZSBhIG1h aW50YWluZXIsIGEgcmVndWxhciBjb250cmlidXRvciwgYSBuZXcgam9pbmVyIG9yDQogIGp1c3Qg Y3VyaW91cywgZmVlbCBmcmVlIHRvIGpvaW4hIFRoZSBnb2FsIG9mIHRoZXNlIG1lZXRpbmdzIGlz IHRvDQogIHByb3ZpZGUgYSBwbGFjZSB0byBkaXNjdXNzIHRoZSBvbmdvaW5nIHdvcmsgdG9nZXRo ZXIgOnNtaWxlOiBCZWxvdywNCiAgeW91IGNhbiBmaW5kIHRoZSBhZ2VuZGEgZm9yIHRoaXMgbWVl dGluZzoNCg0KDQo6c2Nyb2xsOiBBZ2VuZGENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBRdWljayBwcmVzZW50YXRpb24gYWJvdXQgdGhlIGF0 dGVuZGVlcy4NCiAg4oCiIFByZXNlbnRhdGlvbiBhYm91dCB0aGUgb25nb2luZyB3b3JrIGluIER1 bmUuDQogIOKAoiBRdWVzdGlvbnMgYW5kIEFuc3dlcnMuDQogIOKAoiBJbmZvcm1hdGlvbiBkaXNj dXNzaW9ucw0KDQoNCjpjaGFpbnM6IExpbmtzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYwNCg0KICDigKIgTWVldGluZyBsaW5rOiBbem9vbV0NCiAg4oCiIENhbGVu ZGFyIGV2ZW50OiBbZ29vZ2xlIGNhbGVuZGFyXQ0KICDigKIgV2lraSB3aXRoIGluZm9ybWF0aW9u IGFuZCBwcmV2aW91cyBub3RlczogW0dpdEh1YiBXaWtpXQ0KDQoNClt6b29tXQ0KPGh0dHBzOi8v dXMwNndlYi56b29tLnVzL2ovODUwOTY4Nzc3NzY/cHdkPWNXTmhVMWRIUTFaTlNqWnVPVVpDUTBo MmJ5OVVkejA5Pg0KDQpbZ29vZ2xlIGNhbGVuZGFyXQ0KPGh0dHBzOi8vY2FsZW5kYXIuZ29vZ2xl LmNvbS9jYWxlbmRhci9lbWJlZD9zcmM9Y181Y2Q2OThkZjY3ODRlMzg1YjFjZGNkYzFkYmNhMThj MDYxZmFhOTY5NTlhMDQ3ODE1NjZkMzA0ZGM5ZWM3MzE5JTQwZ3JvdXAuY2FsZW5kYXIuZ29vZ2xl LmNvbT4NCg0KW0dpdEh1YiBXaWtpXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lr aSNkZXYtbWVldGluZ3M+DQoNCg0KRmlnaHRpbmcgTXV0YXRpb24gd2l0aCBNdXRhdGlvbiBpbiBM aXZpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYmxvZy1maWdodGluZy1tdXRhdGlvbi13aXRoLW11dGF0aW9uLWluLWxpdmluZy8xNTAw My8xPg0KDQoNCk1hdHQgV2Fsa2VyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgTmV3IGJsb2cgcG9z dCBhYm91dCBmaXhpbmcgdGhlIG1pc3Rha2VzIGluIHRoZSBgbGl2aW5nJyBsaWJyYXJ5Lg0KICBQ bGVhc2UgdGFrZSBhIGxvb2sgaWYgeW91J3JlIGludGVyZXN0ZWQgaW4gaW50ZXJmYWNpbmcgb2Nh bWwgd2l0aA0KICBleHRlcm5hbCByZXNvdXJjZXMuDQoNCiAgPGh0dHBzOi8vZml6eml4bmVyZC5j b20vYmxvZy8yMDI0LTA3LTIxLWZpeGluZy1saXZpbmcvPg0KDQogIEluIHBhcnRpY3VsYXIsIEkg dGhpbmsgdGhlIGxpYnJhcnkgY29tZXMgZ29vZCB3aXRoIGl0cyBndWFyYW50ZWVzIG5vdw0KICB0 aGF0DQogIDEuIGlmIGV2ZXJ5IGZ1bmN0aW9uIGlzIHByb3Blcmx5IGRlcGVuZGVudCwgYW5kDQog IDIuIHlvdSBvbmx5IGB1bnNhZmVfZnJlZScgdmFsdWVzIHRoYXQgYXJlIGRpc2pvaW50IGZyb20g dGhlaXINCiAgICAgZGVwZW5kZW5jaWVzLCB0aGVuDQogIHlvdSB3aWxsIG9idGFpbiBhIHNvdW5k IHByb2dyYW0gd2hlbiB1c2luZyB0aGUgQ3R5cGVzIGZmaSwgaW4gdGVybXMgb2YNCiAgdGhlcmUg YmVpbmcgbm8gdXNlLWFmdGVyLWZyZWUgZXJyb3JzLg0KDQogIFBsZWFzZSBsZXQgbWUga25vdyBp ZiB5b3UgZGlzYWdyZWUhDQoNCg0KQSBzbWFsbCBleHRlbnNpb24gb2YgQmlnYXJyYXkuR2VuYXJy YXkgYWRkaW5nIGl0ZXJhdGlvbiwgbWFwcGluZyBhbmQgZm9sZGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYS1zbWFsbC1leHRlbnNpb24tb2Yt YmlnYXJyYXktZ2VuYXJyYXktYWRkaW5nLWl0ZXJhdGlvbi1tYXBwaW5nLWFuZC1mb2xkaW5nLzE1 MDA1LzE+DQoNCg0KTkFsZWMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBJIG5lZWRlZCBhIGZldyBmdW5jdGlvbnMgd2hpY2ggd2Vy ZSBtaXNzaW5nIGluIHRoZSBbT0NhbWwgbGlicmFyeSA6DQogIEJpZ2FycmF5LkdlbmFycmF5XSwg YW5kIGRlY2lkZWQgdG8gd3JpdGUgdGhlbSBmb3IgbXkgb3duIHB1cnBvc2UgOg0KICDigKIgSXRl cmF0aW9uIG9uIGdlbmFycmF5cw0KICDigKIgbWFwcGluZyBvbiBnZW5hcnJheXMNCiAg4oCiIGZv bGRpbmcgb24gZ2VuYXJyYXlzDQoNCiAgVG9kYXkgSSBiZWxpZXZlIHRoaXMgY2FuIGJlIHVzZWZ1 bGwgZm9yIG90aGVycywgYW5kIG1heSBzdWZmZXIgYSBjb2RlDQogIGluc3BlY3Rpb24gYXMgSSBh bSBub3QgdGhhdCBleHBlcmllbmNlZCBpbiBPQ2FtbC4gSSBhbSByZWFkeSB0byBoYXZlDQogIHRo aXMgcGllY2Ugb2YgY29kZSBldm9sdmUgaWYgaXQgaXMgdXNlZnVsbCBzbyBldmVuIChhbmQgbWF5 YmUgZmlyc3QpIGENCiAgZmVlZGJhY2sgb24gdGhlIHVzZWZ1bGxuZXNzIG9mIHN1Y2ggY29kZSBp cyB3ZWxjb21lLg0KDQogIFRoZSBvbmx5IGFsdGVybmF0aXZlIEkgd2FzIGdpdmVuIHdhcyB0aGUg ZmFtb3VzIE93bCBsaWJyYXJ5LCB3aGljaCB3YXMNCiAgd2F5IHRvIGhlYXZ5IGZvciBteSBuZWVk cywgYW5kIG5vdCBlYXNpbHkgdXNhYmxlIChpZiBub3QNCiAgdW5kZXJzdGFuZGFibGUpLiBUaGlz IGV4dGVuc2lvbiBpcyB2ZXJ5IHNpbXBsZSwgaXQgaXMgaXRzDQogIHN0cmVuZ2h0LiBVbHRpbWF0 ZWx5LCBpdCBjb3VsZCBiZSBtZXJnZWQgaW4gdGhlIHN0YW5kYXJkIGxpYnJhcnkg4oCmDQogIG1h eWJlIGFmdGVyIHNvbWUgd29yayBpbmRlZWQgOiB5b3UgdGVsbCBtZS4NCg0KICBUaGVyZSBpcyBh IGNsZWFuIGRvY3VtZW50YXRpb24gSSBndWVzcywgaG9wZSB0aGlzIGNhbiBoZWxwIDoNCiAgW0dl bkFycmF5SXRlcl0NCg0KICBMb29raW5nIGZvcndhcmQgdG8gaGVhcmluZyBmcm9tIHlvdSBhbGwu DQoNCg0KW09DYW1sIGxpYnJhcnkgOiBCaWdhcnJheS5HZW5hcnJheV0NCjxodHRwczovL29jYW1s Lm9yZy9tYW51YWwvNS4yL2FwaS9CaWdhcnJheS5HZW5hcnJheS5odG1sPg0KDQpbR2VuQXJyYXlJ dGVyXSA8aHR0cHM6Ly9naXRodWIuY29tL0hleWppMi9HZW5BcnJheUl0ZXI+DQoNCg0KY3VkYWpp dDogQmluZGluZ3MgdG8gdGhlIGBjdWRhJyBhbmQgYG52cnRjJyBsaWJyYXJpZXMNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWN1ZGFqaXQtYmluZGluZ3MtdG8tdGhlLWN1 ZGEtYW5kLW52cnRjLWxpYnJhcmllcy8xNTAxMC8xPg0KDQoNCkx1a2FzeiBTdGFmaW5pYWsgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSEgSSdtIGhhcHB5IHRvIHNoYXJl IGN1ZGFqaXQgMC40LjA6IG1hbnVhbGx5LXNlbGVjdGVkIGJpbmRpbmdzIGZvcg0KICBOdmlkaWEg R1BVIHByb2dyYW1taW5nLiBjdWRhaml0IHNob3VsZCBzb29uIHByb3BhZ2F0ZSB0byB0aGUgb3Bh bQ0KICByZXBvc2l0b3J5LiAgW0JpbmRpbmdzIHRvIHRoZSBgY3VkYScgYW5kIGBudnJ0YycgbGli cmFyaWVzIHdpdGggYQ0KICB1bmlmaWVkIGludGVyZmFjZV0gW0FQSSBkb2N1bWVudGF0aW9uXSBD dXJyZW50bHkgc3VwcG9ydGVkOg0KDQogIOKAoiBDb21waWxpbmcgYSBrZXJuZWwgd2l0aCBjb252 ZXJzaW9uIHRvIFBUWCwgbGF1bmNoaW5nIGEga2VybmVsLg0KICDigKIgU3luY2hyb25vdXMgYW5k IGFzeW5jaHJvbm91cyBtZW1vcnkgY29weWluZy4NCiAg4oCiIENvbnRleHRzIGFuZCBzdHJlYW1z Lg0KICDigKIgKEdQVSkgZGV2aWNlIGF0dHJpYnV0ZXMuDQoNCiAgQ3VycmVudGx5IG5vdCBzdXBw b3J0ZWQ6DQoNCiAg4oCiIEV2ZW50cy4NCiAg4oCiIENVREEgZ3JhcGggZmVhdHVyZXMuDQogIOKA oiBDb29wZXJhdGl2ZSBrZXJuZWwgbGF1bmNoLg0KDQogIExldCBtZSBrbm93IHlvdXIgbmVlZHMg c28gSSBjYW4gcHJpb3JpdGl6ZS4gUFJzIGFyZSBhbHNvIHdlbGNvbWUhDQoNCg0KW0JpbmRpbmdz IHRvIHRoZSBgY3VkYScgYW5kIGBudnJ0YycgbGlicmFyaWVzIHdpdGggYSB1bmlmaWVkIGludGVy ZmFjZV0NCjxodHRwczovL2dpdGh1Yi5jb20vbHVrc3RhZmkvb2NhbWwtY3VkYWppdD4NCg0KW0FQ SSBkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vbHVrc3RhZmkuZ2l0aHViLmlvL29jYW1sLWN1ZGFq aXQvY3VkYWppdC9DdWRhaml0L2luZGV4Lmh0bWw+DQoNCg0KUnBtZmlsZSAwLjIuMCAtIGNoYW5n ZWxvZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi1ycG1maWxlLzE0OTg1Pg0KDQoNCk1p a2hhaWwgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBIZWxsbyBhZ2FpbiwgZXZlcnlvbmUuIDp3YXZlOiBUb2RheSBJIHdh bnQgdG8gdGVsbCB5b3UgYWJvdXQgd2hhdCBoYXMNCiAgY2hhbmdlZCBpbiBhIG5ldyB2ZXJzaW9u IG9mIG15IFtycG1maWxlXSBsaWJyYXJ5IChbcHJldmlvdXMgdG9waWNdKQ0KICBmb3IgcmVhZGlu ZyBtZXRhLWluZm9ybWF0aW9uIGZyb20gUlBNIHBhY2thZ2VzLlNob3VsZCBJIHBvc3QgdGhpcyBp bg0KICB0aGUgZm9ydW0/IEknbSBzb3JyeS4NCg0KDQpbcnBtZmlsZV0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9keDNtb2QvcnBtZmlsZT4NCg0KW3ByZXZpb3VzIHRvcGljXQ0KPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi1ycG1maWxlLzE0OTg1Pg0KDQpDaGFu Z2VzDQrilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgRml4ZWQgaW5jb3JyZWN0IHN0cmlu ZyBwYXJzaW5nLiBJIGp1c3QgZm9yZ290IHRvIG1ha2UgYGFkdmFuY2UnDQogICAgYWZ0ZXIgYHRh a2VfdGlsbCcgKFtjb21taXRdKTsNCiAg4oCiIGBhbmdzdHJvbS11bml4JyBpcyB1c2VkIGJ5IGRl ZmF1bHQgdG8gcmVhZCBmaWxlcyBpbiB0aGUgYFJlYWRlcicNCiAgICBtb2R1bGUgZnVuY3Rpb25z LiBQcmV2aW91c2x5LCBhIFJQTSBwYWNrYWdlIHdhcyByZWFkIGVudGlyZWx5IGludG8NCiAgICBt ZW1vcnk7DQogIOKAoiBPcHRpbWl6ZWQgcGFydGlhbCBwYXJzaW5nIG9mIFtoZWFkZXIgc2VjdGlv bnNdLiBSZWR1Y2VkIHVubmVjZXNzYXJ5DQogICAgbWVtb3J5IGFsbG9jYXRpb25zIChbY29tbWl0 XSk7DQogIOKAoiBEZWNvZGluZyBpbnRlZ2VycyAoaW50OC9pbnQxNi9pbnQzMi9pbnQ2NCkgdG8g Km5hdGl2ZSBpbnQqIGluIGFjY2Vzcw0KICAgIGZ1bmN0aW9uc1teMV0gKGxpa2UgYFJwbWZpbGUu cGF5bG9hZF9zaXplJykuIFlvdSBjYW4gYWxzbyB1c2UgYGdldCcNCiAgICB0byBnZXQgInJhdyIg dmFsdWVzOw0KICDigKIgSW1wcm92ZWQgY29tcGF0aWJpbGl0eSB3aXRoIDQuMCB2ZXJzaW9uIG9m IFJQTSBmb3JtYXQgYnkgdXNpbmcNCiAgICAqbmF0aXZlIGludCo7DQogIOKAoiBBZGRlZCBhIG1v ZHVsZSBgU2VsZWN0b3IuQmFzZScgdG8gc2VsZWN0IG9ubHkgYmFzaWMgcGFja2FnZSBpbmZvDQog ICAgKFtjb21taXRdKTsNCiAg4oCiIFNvbWUgbmV3IGFjY2VzcyBmdW5jdGlvbnMgYW5kIG91dHB1 dCBmaWVsZHMgb2YgdGhlIENMSSB1dGlsaXR5Lg0KDQoNCltjb21taXRdDQo8aHR0cHM6Ly9naXRo dWIuY29tL2R4M21vZC9ycG1maWxlL2NvbW1pdC8zYjAxYTM0MzZhMTVkNDk3ZWEyZTRiOTQ2MTEx MDg1NTUxODlmZjNiPg0KDQpbaGVhZGVyIHNlY3Rpb25zXQ0KPGh0dHBzOi8vcmVmc3BlY3MubGlu dXhiYXNlLm9yZy9MU0JfMy4xLjEvTFNCLUNvcmUtZ2VuZXJpYy9MU0ItQ29yZS1nZW5lcmljL3Br Z2Zvcm1hdC5odG1sI0FFTjI2NTgxPg0KDQpbY29tbWl0XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9k eDNtb2QvcnBtZmlsZS9jb21taXQvMjEyMTE5MGY1OWZjODBjZmVkZWE5MDQzYWQxM2I0NDBhYTYw ZjBkMD4NCg0KW2NvbW1pdF0NCjxodHRwczovL2dpdGh1Yi5jb20vZHgzbW9kL3JwbWZpbGUvY29t bWl0L2M0YmFmMmZjYzcyOTY1OTM2YmYyZGVhMTNhYmQxYTA5NjgyNmI2N2Q+DQoNCg0KcnBtZmls ZSB2cyBycG0gLXFpDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBOb3QgYSByZWFsICJiZW5jaG1hcmsiIGZvciBwYXJzaW5nIDEuNSBH QiBwYWNrYWdlcy4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgdGltZSBycG0gLXFpIHJl cG8vKi5ycG0NCiAg4pSCIEV4ZWN1dGVkIGluICAyMjYuODIgbWlsbGlzICAgIGZpc2ggICAgICAg ICAgIGV4dGVybmFsDQogIOKUgiAgICB1c3IgdGltZSAgMjEyLjc0IG1pbGxpcyAgICAxLjA2IG1p bGxpcyAgMjExLjY4IG1pbGxpcw0KICDilIIgICAgc3lzIHRpbWUgICAxMy4yMyBtaWxsaXMgICAg MC4wMCBtaWxsaXMgICAxMy4yMyBtaWxsaXMNCiAg4pSCIA0KICDilIIgJCB0aW1lIHJwbWZpbGUg cmVwby8qLnJwbQ0KICDilIIgRXhlY3V0ZWQgaW4gIDE1My45NyBtaWxsaXMgICAgZmlzaCAgICAg ICAgICAgZXh0ZXJuYWwNCiAg4pSCICAgIHVzciB0aW1lICAxMTYuNzQgbWlsbGlzICAgIDAuMDAg bWlsbGlzICAxMTYuNzQgbWlsbGlzDQogIOKUgiAgICBzeXMgdGltZSAgIDMwLjY1IG1pbGxpcyAg ICAxLjQ3IG1pbGxpcyAgIDI5LjE4IG1pbGxpcw0KICDilJTilIDilIDilIDilIANCg0KICBScG1m aWxlIGRvZXNuJ3QgdmVyaWZ5IHNpZ25hdHVyZXMsIHdoaWNoIGlzIHdoeSBpdCBpcyAiZmFzdGVy Ii4NCg0KDQpXaGF0J3MgbmV4dD8NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIFRoaXMgaXMgZW5vdWdoIGZvciBteSB0YXNrcywgc28gdGhlcmUgcHJvYmFibHkgd29u J3QgYmUgYSBuZXh0IHJlbGVhc2UNCiAgOmNvbGRfZmFjZToNCg0KICBUby1EbzogZnVuY3Rpb25h bGl0eSB0byB3b3JrIHdpdGggc2lnbmF0dXJlcywgcmVhZCBwYXlsb2FkLCBpbXBsZW1lbnQNCiAg d3JpdGVyIG1vZHVsZSBmb3IgY3JlYXRlIHBhY2thZ2VzLg0KDQogIFRoYW5rIHlvdSBmb3IgeW91 ciBhdHRlbnRpb24hDQoNCiAgUC5TLiBJIGFsc28gd2FudCB0byBhcG9sb2dpemUgZm9yIG15IHRl cnJpYmxlIEVuZ2xpc2guDQoNCiAgW14xXTogVGhlIGFjY2VzcyBmdW5jdGlvbiBnZXRzIGFuZCBk ZWNvZGVzIHZhbHVlcyBmcm9tIGEgYG1ldGFkYXRhJw0KICByZWNvcmQuDQoNCg0KRXhwbG9yaW5n IHRoZSBEb2N1c2F1cnVzK09kb2MgY29tYm8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvZXhwbG9yaW5nLXRoZS1kb2N1c2F1cnVzLW9kb2MtY29tYm8vMTUwMTIvMT4NCg0K DQpNYXRoaWV1IEJhcmJpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRvIE9DYW1s ICYgRG9jdXNhdXJ1cyBlbnRodXNpYXN0cyBvdXQgdGhlcmUgOmNhbWVsOisgOnNhdXJvcG9kOg0K DQogIFNvbWUgdGltZSBhZ28sIEkgc2hhcmVkIG15IGV4cGVyaWVuY2UgdXNpbmcgRG9jdXNhdXJ1 cyB0byBkb2N1bWVudCBhbg0KICBPQ2FtbCBwcm9qZWN0LCBoaWdobGlnaHRpbmcgdGhlIGludGVn cmF0aW9uIGJldHdlZW4gRG9jdXNhdXJ1cywNCiAgb2NhbWwtbWR4LCBhbmQgdGhlIGR1bmUgd29y a2Zsb3cgKHByZXZpb3VzIHBvc3QgW2hlcmVdKS4NCg0KICBUb2RheSBJIHdhbnRlZCB0byBzaGFy ZSB0aGF0IEkndmUgcmVzdW1lZCB0aGlzIGV4cGxvcmF0aW9uIGluDQogIGRvY3VtZW50YXRpb24g dG9vbHMgdG8gdHJ5IGFuZCBpbnRlZ3JhdGUgb2RvYy1nZW5lcmF0ZWQgcGFnZXMgaW50bw0KICBE b2N1c2F1cnVzLCB3aXRoIHRoZSBhaW0gb2YgY3JlYXRpbmcgYSBzb21ld2hhdCBtaW5pbWFsDQog IHRlbXBsYXRlL2V4YW1wbGUgZm9yIHRoaXMuDQoNCiAgSSd2ZSBwdWJsaXNoZWQgbXkgZXhwZXJp bWVudCBoZXJlOg0KICBbaHR0cHM6Ly9tYmFyYmluLmdpdGh1Yi5pby9kb2MtZXhwZXJpbWVudC1k b2N1c2F1cnVzL10uDQoNCiAgSW50ZWdyYXRpbmcgb2RvYyBwb3NlZCBjaGFsbGVuZ2VzIC0gSSd2 ZSB3cml0dGVuIGFib3V0IHRoZSAocHJhZ21hdGljKQ0KICBhcHByb2FjaCBJIHRvb2sgW2hlcmVd LiBJJ20gbGlua2luZyB0aGlzIFtvZG9jIGlzc3VlXSB0b28sIGZvcg0KICByZWZlcmVuY2UgYWJv dXQgZXhwbG9yaW5nIG1vcmUgbmF0aXZlIHNvbHV0aW9ucyBmb3IgdGhpcyBpbnRlcm9wLg0KDQog IEhhdmUgeW91IHRvbyB0cmllZCB0aGlzICJtYWdpYyBjb21ibyIgb2YgRG9jdXNhdXJ1cywgT2Rv YywgYW5kIE9DYW1sDQogIHRvb2xzPyBBbmQgaWYgc28sIGhvdyBkaWQgeW91IGFwcHJvYWNoIGl0 PyBEbyB5b3UgaGF2ZSBpbnNpZ2h0cyBvcg0KICBzdWdnZXN0aW9ucz8gSWYgdGhpcyBzcGFya3Mg eW91ciBjdXJpb3NpdHksIHBsZWFzZSBkb24ndCBoZXNpdGF0ZSB0bw0KICBlbmdhZ2Ugd2l0aCB0 aGUgcmVwb3NpdG9yeS4NCg0KDQpbaGVyZV0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv dXNpbmctZG9jdXNhdXJ1cy10by1kb2N1bWVudC1hbi1vY2FtbC1wcm9qZWN0LzEzMzU5Pg0KDQpb aHR0cHM6Ly9tYmFyYmluLmdpdGh1Yi5pby9kb2MtZXhwZXJpbWVudC1kb2N1c2F1cnVzL10NCjxo dHRwczovL21iYXJiaW4uZ2l0aHViLmlvL2RvYy1leHBlcmltZW50LWRvY3VzYXVydXMvPg0KDQpb aGVyZV0gPGh0dHBzOi8vbWJhcmJpbi5naXRodWIuaW8vZG9jLWV4cGVyaW1lbnQtZG9jdXNhdXJ1 cy9kb2NzL29kb2MvPg0KDQpbb2RvYyBpc3N1ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v ZG9jL2lzc3Vlcy8xMjE+DQoNCg0KTW9wc2EgMS4wIOKAkyBNb2R1bGFyIE9wZW4gUGxhdGZvcm0g Zm9yIFN0YXRpYyBBbmFseXNpcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tbW9wc2EtMS0wLW1vZHVsYXItb3Blbi1wbGF0Zm9ybS1mb3Itc3RhdGljLWFuYWx5c2lzLzE1 MDEzLzE+DQoNCg0KUmFwaGHDq2wgTW9uYXQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBP biBiZWhhbGYgb2YgYWxsIGl0cyBkZXZlbG9wZXJzLCBJIGFtIGdsYWQgdG8gYW5ub3VuY2UgdGhl IHJlbGVhc2Ugb2YNCiAgW01vcHNhIDEuMF0hIFlvdSBjYW4ganVzdCBgb3BhbSBpbnN0YWxsIG1v cHNhJy4NCg0KICBNb3BzYSBzdGFuZHMgZm9yIE1vZHVsYXIgYW5kIE9wZW4gUGxhdGZvcm0gZm9y IFN0YXRpYyBBbmFseXNpcy4gSXQNCiAgYWltcyBhdCBlYXNpbmcgdGhlIGRldmVsb3BtZW50IGFu ZCB1c2Ugb2Ygc3RhdGljIGFuYWx5emVycy4gTW9yZQ0KICBzcGVjaWZpY2FsbHksIE1vcHNhIGlz IGEgZ2VuZXJpYyBmcmFtZXdvcmsgZm9yIGJ1aWxkaW5nIHNvdW5kIHN0YXRpYw0KICBhbmFseXpl ciBiYXNlZCBvbiB0aGUgdGhlb3J5IG9mIGFic3RyYWN0IGludGVycHJldGF0aW9uLiBNb3BzYSBp cw0KICBpbmRlcGVuZGVudCBvZiBsYW5ndWFnZSBhbmQgYWJzdHJhY3Rpb24gY2hvaWNlcy4gRGV2 ZWxvcGVycyBhcmUgZnJlZQ0KICB0byBhZGQgYXJiaXRyYXJ5IGFic3RyYWN0aW9ucyAobnVtZXJp YywgcG9pbnRlciwgbWVtb3J5LCBldGMuKSBhbmQNCiAgc3ludGF4IGl0ZXJhdG9ycyBmb3IgbmV3 IGxhbmd1YWdlcy4gTW9wc2EgZW5jb3VyYWdlcyB0aGUgZGV2ZWxvcG1lbnQNCiAgb2YgaW5kZXBl bmRlbnQgYWJzdHJhY3Rpb25zIHdoaWNoIGNhbiBjb29wZXJhdGUgb3IgYmUgY29tYmluZWQgdG8N CiAgaW1wcm92ZSBwcmVjaXNpb24uDQoNCiAgTW9wc2EgY3VycmVudGx5IHN1cHBvcnQgdGhlIGFu YWx5c2lzIG9mIFB5dGhvbiwgQyBhbmQgUHl0aG9uK0MNCiAgcHJvZ3JhbXMuIEl0IHJlcG9ydHMg cnVuLXRpbWUgZXJyb3JzIG9uIEMgcHJvZ3JhbXMgYW5kIHVuY2F1Z2h0DQogIGV4Y2VwdGlvbnMg b24gUHl0aG9uIHByb2dyYW1zLiBPdXIgYmVuY2htYXJrcyBwcm92aWRlIGFuIGlsbHVzdHJhdGl2 ZQ0KICBvdmVydmlldyBvZiB3aGF0IE1vcHNhIGNhbiBjdXJyZW50bHkgYW5hbHl6ZS4gQWxsIGFu YWx5c2VzIGN1cnJlbnRseQ0KICBwcm92aWRlZCBhcmUgZmxvdyBhbmQgY29udGV4dC1zZW5zaXRp dmUgKGkuZSwgY29udHJvbC1mbG93IG9wZXJhdG9ycw0KICBhcmUgdGFrZW4gaW50byBhY2NvdW50 IGJ5IHRoZSBhbmFseXNpcywgYW5kIGZ1bmN0aW9ucyBhcmUgYW5hbHl6ZWQgYnkNCiAgdmlydHVh bCBpbmxpbmluZykuIFRoZSBDIGFuYWx5c2lzIGlzIGFjdGl2ZWx5IGRldmVsb3BlZCBhbmQNCiAg bWFpbnRhaW5lZC4gVGhlIFB5dGhvbiBhbmQgUHl0aG9uK0MgYW5hbHlzZXMgd29yayBvbiByZWFs LXdvcmxkDQogIGV4YW1wbGVzLCBidXQgYXJlIG5vdCBhY3RpdmVseSBkZXZlbG9wZWQuDQoNCiAg UGxlYXNlIG5vdGUgdGhhdCBNb3BzYSBpcyBhbiBhY2FkZW1pYyB0b29sIHVuZGVyIGRldmVsb3Bt ZW50LiBGZWVsDQogIGZyZWUgdG8gc3VibWl0IFtpc3N1ZXNdIGlmIHlvdSBlbmNvdW50ZXIgYW55 IGJ1ZyENCg0KICBBZGRpdGlvbmFsIHJlc291cmNlczoNCiAg4oCiIFt1c2VyIG1hbnVhbF0NCiAg 4oCiIFtkZW1vIG9mIG91ciBhYnN0cmFjdCBkZWJ1Z2dlcl0NCiAg4oCiIFthY2FkZW1pYyBvdmVy dmlldyBvZiBNb3BzYV0sIGFuZCBbaW4gYSBQaEQgdGhlc2lzXQ0KICDigKIgW2NvcmV1dGlscyBi ZW5jaG1hcmtzIG9uIHdoaWNoIE1vcHNhIGNhbiBydW5dDQoNCg0KW01vcHNhIDEuMF0gPGh0dHBz Oi8vZ2l0bGFiLmNvbS9tb3BzYS9tb3BzYS1hbmFseXplci8+DQoNCltpc3N1ZXNdDQo8aHR0cHM6 Ly9naXRsYWIuY29tL21vcHNhL21vcHNhLWFuYWx5emVyLy0vaXNzdWVzLz9zb3J0PWNyZWF0ZWRf ZGF0ZSZzdGF0ZT1vcGVuZWQmZmlyc3RfcGFnZV9zaXplPTUwPg0KDQpbdXNlciBtYW51YWxdIDxo dHRwczovL21vcHNhLmdpdGxhYi5pby9tb3BzYS1hbmFseXplci91c2VyLW1hbnVhbC8+DQoNCltk ZW1vIG9mIG91ciBhYnN0cmFjdCBkZWJ1Z2dlcl0NCjxodHRwczovL3Jtb25hdC5mci90YWxrLzI0 MDYwNl9jc3YvI2ludGVyYWN0aXZlLWVuZ2luZS1kZW1vPg0KDQpbYWNhZGVtaWMgb3ZlcnZpZXcg b2YgTW9wc2FdDQo8aHR0cHM6Ly9oYWwuc29yYm9ubmUtdW5pdmVyc2l0ZS5mci9oYWwtMDI4OTA1 MDB2MS9kb2N1bWVudD4NCg0KW2luIGEgUGhEIHRoZXNpc10NCjxodHRwczovL3Jtb25hdC5mci9k YXRhL3B1YnMvMjAyMS90aGVzaXNfbW9uYXQucGRmI3BhZ2U9NjE+DQoNCltjb3JldXRpbHMgYmVu Y2htYXJrcyBvbiB3aGljaCBNb3BzYSBjYW4gcnVuXQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9tb3Bz YS9iZW5jaG1hcmtzL2NvcmV1dGlscy1iZW5jaG1hcmtzPg0KDQoNCk9DYW1sIDUgcGVyZm9ybWFu Y2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS1w ZXJmb3JtYW5jZS8xNTAxNC8xPg0KDQoNClRob21hcyBMZW9uYXJkIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSSd2ZSBiZWVuIHRyeWluZyBvdXQgc29tZSB0b29scyB0byBpbnZlc3Rp Z2F0ZSBwZXJmb3JtYW5jZSBwcm9ibGVtcyBpbg0KICBteSBPQ2FtbCBwcm9ncmFtcyBhbmQgSSd2 ZSB3cml0dGVuIHVwIG15IGV4cGVyaWVuY2VzIGhlcmUgaW4gY2FzZQ0KICBvdGhlciBwZW9wbGUg ZmluZCBpdCB1c2VmdWw6DQoNCiAg4oCiIDxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cv MjAyNC8wNy8yMi9wZXJmb3JtYW5jZS8+DQogIOKAoiA8aHR0cHM6Ly9yb3NjaWR1cy5jb20vYmxv Zy9ibG9nLzIwMjQvMDcvMjIvcGVyZm9ybWFuY2UtMi8+DQoNCiAgVGhlIGZpcnN0IHBvc3QgZXhh bWluZXMgYSBjYXNlIG9mIHNsb3cgSU8gaW4gYSBjb25jdXJyZW50IEVpbyBwcm9ncmFtLA0KICBh bmQgdGhlIHNlY29uZCBsb29rcyBhdCBwb29yIEdDIHBlcmZvcm1hbmNlIGluIGEgbXVsdGljb3Jl IGFwcC4NCg0KICBJbiBwYXJ0aWN1bGFyLCBpdCBzZWVtcyB0aGF0IG1pbm9yIEdDIHBlcmZvcm1h bmNlIGlzIHZlcnkgc2Vuc2l0aXZlIHRvDQogIG90aGVyIHdvcmsgcnVubmluZyBvbiB0aGUgbWFj aGluZSwgc2luY2UgYW55IGRvbWFpbiBiZWluZyBsYXRlIHdpbGwNCiAgdHJpZ2dlciB0aGUgb3Ro ZXJzIHRvIHNsZWVwLCBlLmcuDQoNCiAgPGh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29t L2J1c2luZXNzNy91cGxvYWRzL29jYW1sL29yaWdpbmFsLzJYL2UvZTgyMTg5NWI5MzRmOTUxOWY4 NGQwZTUyZjI4MDU3YmIzMDI3NDA5Mi5wbmc+DQoNCiAgSSdkIGJlIGludGVyZXN0ZWQgdG8ga25v dyBpZiBvdGhlcnMgY2FuIHNoZWQgbW9yZSBsaWdodCBvbiB0aGlzLCBvcg0KICBoYXZlIG90aGVy IHByb2ZpbGluZyB0b29scyB0aGV5J3ZlIGZvdW5kIHVzZWZ1bC4NCg0KDQpPdGhlciBPQ2FtbCBO ZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K RnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtz IGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJs b2ddLg0KDQogIOKAoiBbT0NhbWwgNSBwZXJmb3JtYW5jZSBwYXJ0IDJdDQogIOKAoiBbT0NhbWwg NSBwZXJmb3JtYW5jZSBwcm9ibGVtc10NCiAg4oCiIFtPQ2FtbCBDb21waWxlciBNYW51YWwgSFRN TCBHZW5lcmF0aW9uXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9y Zy9ibG9nLz4NCg0KW09DYW1sIDUgcGVyZm9ybWFuY2UgcGFydCAyXQ0KPGh0dHBzOi8vcm9zY2lk dXMuY29tL2Jsb2cvYmxvZy8yMDI0LzA3LzIyL3BlcmZvcm1hbmNlLTIvPg0KDQpbT0NhbWwgNSBw ZXJmb3JtYW5jZSBwcm9ibGVtc10NCjxodHRwczovL3Jvc2NpZHVzLmNvbS9ibG9nL2Jsb2cvMjAy NC8wNy8yMi9wZXJmb3JtYW5jZS8+DQoNCltPQ2FtbCBDb21waWxlciBNYW51YWwgSFRNTCBHZW5l cmF0aW9uXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTA3LTE3LW9jYW1sLWNvbXBp bGVyLW1hbnVhbC1odG1sLWdlbmVyYXRpb24+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0 XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 16 to 23, 2024.

    A Tour of the Living Library – A Safer FFI

    Matt Walker announced

    I've written a new blog post on the living library I announced= a few days ago. Please give it a read if you're interested in safe use of= Ctypes, or otherwise need lifetime management in OCaml.

    Would love to hear your views in this thread!

    https://fizzixnerd.com/blog/2024-07-17-touring-the-living-library/

    first release of rpmfile

    Mikhail announced

    I'm happy to announce the first release of rpmfile, a small library for reading meta information fro= m RPM packages (version 3.0). It uses the Angstrom combinator parser librar= y, which allows it to perform streaming parsing using Lwt or Async.

    How to get a package summary:

    module Rpm_reader =3D Rpmfile.Reader (Rpmfile.Selector.All)
    
    let metadata =3D Rp=
    m_reader.of_file_exn "hello-2.12.1-1=
    .7.x86_64.rpm"
    
    Rpmfile.summary metadata
    (* - : string =3D "A Friendly Greetin=
    g Program" *)
    

    The default reader module can read from a string or file, but has poor perf= ormance. It needs a selector module to select the tags to parse. The exampl= e uses Selector.All to parse all tags.=20

    I am developing this library for my pet project to create a self-hosted RPM= repository management solution.=20

    Thank you for your attention!

    Dune dev meeting

    maiste announced

    We are organizing a new public Dune dev meeting on Wednesday, July, 24th= at 10am CET. It will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, feel free to join! The goal of these meetings is to provide a place= to discuss the ongoing work together :smile: Below, you can find the agenda for this meeting:

    :scroll: Agenda

    • Quick presentation about the attendees.
    • Presentation about the ongoing work in Dune.
    • Questions and Answers.
    • Information discussions

    :chains: Links

    Fighting Mutation with Mutation in Living

    Matt Walker announced

    New blog post about fixing the mistakes in the living library.= Please take a look if you're interested in interfacing ocaml with externa= l resources.

    https://f= izzixnerd.com/blog/2024-07-21-fixing-living/

    In particular, I think the library comes good with its guarantees now that

    1. if every function is properly dependent, and
    2. you only unsafe_free values that are disjoint from their d= ependencies, then

    you will obtain a sound program when using the Ctypes ffi, in terms of ther= e being no use-after-free errors.

    Please let me know if you disagree!

    A small extension of Bigarray.Genarray adding iteration, mappi= ng and folding

    NAlec announced

    I needed a few functions which were missing in the OCaml library : Bigarray.Genarr= ay, and decided to write them for my own purpose :=20

    • Iteration on genarrays
    • mapping on genarrays
    • folding on genarrays

    Today I believe this can be usefull for others, and may suffer a code inspe= ction as I am not that experienced in OCaml. I am ready to have this piece = of code evolve if it is usefull so even (and maybe first) a feedback on the= usefullness of such code is welcome.

    The only alternative I was given was the famous Owl library, which was way = to heavy for my needs, and not easily usable (if not understandable). This = extension is very simple, it is its strenght. Ultimately, it could be merge= d in the standard library … maybe after some work indeed : you tell = me.=20

    There is a clean documentation I guess, hope this can help : GenArrayIter

    Looking forward to hearing from you all.

    cudajit: Bindings to the cuda and nvrtc libraries

    Lukasz Stafiniak announced

    Hi! I'm happy to share cudajit 0.4.0: manually-selected bindings for Nvidia= GPU programming. cudajit should soon propagate to the opam repository. Bindings to the cuda and nvrtc libraries with a unified interface API documentation Currently supported:

    • Compiling a kernel with conversion to PTX, launching a kernel.
    • Synchronous and asynchronous memory copying.
    • Contexts and streams.
    • (GPU) device attributes.

    Currently not supported:

    • Events.
    • CUDA graph features.
    • Cooperative kernel launch.

    Let me know your needs so I can prioritize. PRs are also welcome!

    Rpmfile 0.2.0 - changelog

    Mikhail announced

    Hello again, everyone. :wave: Today I want to tell you about what has chang= ed in a new version of my rpm= file library (previous topic) for reading meta-information from RPM= packages.Should I post this in the forum? I'm sorry.

    Changes

    • Fixed incorrect string parsing. I just forgot to make advance after take_till (commit);
    • angstrom-unix is used by default to read files in the Reader module functions. Previously, a RPM package was read entire= ly into memory;
    • Optimized partial parsing of header= sections. Reduced unnecessary memory allocations (c= ommit);
    • Decoding integers (int8/int16/int32/int64) to native int in acce= ss functions[^1] (like Rpmfile.payload_size). You can also use= get to get "raw" values;
    • Improved compatibility with 4.0 version of RPM format by using nativ= e int;
    • Added a module Selector.Base to select only basic package = info (commit);
    • Some new access functions and output fields of the CLI utility.

    rpmfile vs rpm -qi

    Not a real "benchmark" for parsing 1.5 GB packages.

    $ time rpm -qi repo/*.rpm
    Executed in  226.82 millis    fish           external
       usr time  212.74 millis    1.06 millis  211.68 millis
       sys time   13.23 millis    0.00 millis   13.23 millis
    
    $ time rpmfile repo/*.rpm
    Executed in  153.97 millis    fish           external
       usr time  116.74 millis    0.00 millis  116.74 millis
       sys time   30.65 millis    1.47 millis   29.18 millis
    

    Rpmfile doesn't verify signatures, which is why it is "faster".

    What's next?

    This is enough for my tasks, so there probably won't be a next release :col= d_face:

    To-Do: functionality to work with signatures, read payload, implement write= r module for create packages.

    Thank you for your attention!

    P.S. I also want to apologize for my terrible English.=20

    [^1]: The access function gets and decodes values from a metadata record.

    Exploring the Docusaurus+Odoc combo

    Mathieu Barbin announced

    To OCaml & Docusaurus enthusiasts out there :camel:+ :sauropod:

    Some time ago, I shared my experience using Docusaurus to document an OCaml= project, highlighting the integration between Docusaurus, ocaml-mdx, and t= he dune workflow (previous post here).

    Today I wanted to share that I've resumed this exploration in documentation= tools to try and integrate odoc-generated pages into Docusaurus, with the = aim of creating a somewhat minimal template/example for this.

    I've published my experiment here: https://mbarbin.github.io/doc-experiment-docusauru= s/.

    Integrating odoc posed challenges - I've written about the (pragmatic) appr= oach I took here. I'm linking this odoc issue too, for reference about exploring more nat= ive solutions for this interop.

    Have you too tried this "magic combo" of Docusaurus, Odoc, and OCaml tools?= And if so, how did you approach it? Do you have insights or suggestions? I= f this sparks your curiosity, please don't hesitate to engage with the repo= sitory.

    Mopsa 1.0 – Modular Open Platform for Static Analysis

    Rapha=C3=ABl Monat announced

    On behalf of all its developers, I am glad to announce the release of Mopsa 1.0! You can just= opam install mopsa.

    Mopsa stands for Modular and Open Platform for Static Analysis. It aims at = easing the development and use of static analyzers. More specifically, Mops= a is a generic framework for building sound static analyzer based on the th= eory of abstract interpretation. Mopsa is independent of language and abstr= action choices. Developers are free to add arbitrary abstractions (numeric,= pointer, memory, etc.) and syntax iterators for new languages. Mopsa encou= rages the development of independent abstractions which can cooperate or be= combined to improve precision.

    Mopsa currently support the analysis of Python, C and Python+C programs. It= reports run-time errors on C programs and uncaught exceptions on Python pr= ograms. Our benchmarks provide an illustrative overview of what Mopsa can c= urrently analyze. All analyses currently provided are flow and context-sens= itive (i.e, control-flow operators are taken into account by the analysis, = and functions are analyzed by virtual inlining). The C analysis is actively= developed and maintained. The Python and Python+C analyses work on real-wo= rld examples, but are not actively developed.

    Please note that Mopsa is an academic tool under development. Feel free to = submit issues if you= encounter any bug!

    Additional resources:=20

    OCaml 5 performance

    Thomas Leonard announced

    I've been trying out some tools to investigate performance problems in my O= Caml programs and I've written up my experiences here in case other people = find it useful:

    The first post examines a case of slow IO in a concurrent Eio program, and = the second looks at poor GC performance in a multicore app.

    In particular, it seems that minor GC performance is very sensitive to othe= r work running on the machine, since any domain being late will trigger the= others to sleep, e.g.

    3D"e821895b934=

    I'd be interested to know if others can shed more light on this, or have ot= her profiling tools they've found useful.

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=C86k3I+s; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=RNjN/3qW; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 56628B80123 for ; Tue, 30 Jul 2024 14:26:33 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=OokhnmtogxLxmOzEid20ZCoHjRPdy4hLzBTfCjE0s5o=; b=C86k3I+sz0hpVoqiI0Er7BQ8a3Y6Zg4jU2fJ6cEGNt73/WfQFgiZP7Zp MnIgA4+hHcJV8Y7Izp/1auXKIeg9f9X+gZ1gfimJAWoHvS2xS71HKIKDz Iai5gj5lTyrJzQq5a+kp2E6d1/Off8K7sYU1QVDdaVGXzeKJbF+5WiaKu Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,248,1716242400"; d="scan'208,217";a="177517634" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Jul 2024 15:26:33 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 0CF1BE013D; Tue, 30 Jul 2024 15:26:32 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 54D16E0035 for ; Tue, 30 Jul 2024 15:26:27 +0200 (CEST) IronPort-SDR: 66a8ea01_GIfbvas/h/IuOvY7j9YpjCyonxBrvrabgTqBKyFnP2HpsWY VuNWlv6PniOE/y1OHpKXq/YZs2XSGAYka2Sro/w== X-IPAS-Result: =?us-ascii?q?A0HMAAAu6ahmlyIeaIFagliBQYEDGQFiWjMHCEhhg3WDT?= =?us-ascii?q?44enD6BVhSBLBYjFAEDAQ0uAQ4EAQIEAQEDAQIBgguCdBiJKgIfBgEEMAkOA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBAQEBATcFSYV1D?= =?us-ascii?q?YJKGRUjb4ElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAgwBBxwRKgFIBAYTAQE4GCMDFAEGAwIEDQE1FwESFAYBgmUBgmQDB?= =?us-ascii?q?QwGjnKbPHp/M4EBggwBAQaBCD4DCwIFAQ4JJtoEgWMJgUiIIxoBBSNIagKEM?= =?us-ascii?q?gmEPicPgVVEgUqCBTgFAm+BQQ9vCxcBAQEBGERIGAEBTYMugmmGLwNVhSctg?= =?us-ascii?q?XdFgglpBAUVK4EBc4IKVw8+GXJRQgIMgwZ8JktXEIxlgUdLMyETAVUTFwsJB?= =?us-ascii?q?WWGG4JMgy2CGIQZhS6Bawxhh3KBcYE+gV9KgnZLhWaBCFwdQAMLbT01FBuiX?= =?us-ascii?q?AQNASMBgwUmDjgIVzYBIgcBARNFDk0nCgRKCwsCHhKScCqPLaJiNAeEGIFdB?= =?us-ascii?q?gyJAYEklXKEBYFWiyqGG5MeIphOIolUgSUJgleIbYxahVOBURY6gSseDAczG?= =?us-ascii?q?jAiIQ0Mgk4JRhwPkhtqVIJiOTvGcUE1AgEBBzACBwEKAQEDCYViAQGDPoFLA?= =?us-ascii?q?QE?= IronPort-PHdr: A9a23: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 3okUwLQoneEio7S/gOn37YT5jZQ2dFO3r8d2EU= IronPort-Data: A9a23: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 9ViD7XSxKhIFayJ5ICr9A== IronPort-HdrOrdr: A9a23:ulU0M6nXF462Za28SXiU27xom+npDfIR3DAbv31ZSRFFG/Fw9v re/8jzsCWftN9/Yh8dcLy7VZVoIkm9yXcW2+gs1N6ZNWGMhILCFu5fBOXZrwHIKmnXyap21K trcaRyYeeAb2RSvILd+wf9N94hxbC8gcSVbArlvhJQcT0= X-Talos-CUID: 9a23:m3PwYWEExME2mo3WqmJg+EcQOuN6UUHlyXzsGmGVOzhoa+O8HAo= X-Talos-MUID: 9a23:fwU7LApTRZ56o3a/o6oezx14aplo/4eeMkAIi45dh/GtPiZJfB7I2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,248,1716242400"; d="scan'208,217";a="93260498" X-MGA-submission: =?us-ascii?q?MDFs76LDJX7Wwlfjc1kI9Ypd3jNW+TqzkqAQ9k?= =?us-ascii?q?Da64tewH2cDM0RGDapfSJV/TE4klslhwui9DYEq9n0Q3LBb+jsfbTJ0g?= =?us-ascii?q?rF0g7Eri87JyD/roiaHsy/tSlOpEy/4CRVsPX1MZpxR6dFktAzaZoupW?= =?us-ascii?q?3JRH1KbSygdaw7mnRFmmHQdg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Jul 2024 15:26:26 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 54C9F56483F; Tue, 30 Jul 2024 15:26:24 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1722345984; bh=Kn9DNMCqUY7E9uyr48ws8vWHUcWMHRhrGLYZVWXIs98=; h=From:To:Subject:Date:Message-ID; b=RNjN/3qWSE8KVHOUZBTHJnteA0GSMBqtgCgQeno+EX4tZydO4wJwRT/GW0+2fuxwN DzZ8NuZcALkgFzFUsTYRLAtc6HRapBfWlO0YO1Ev00lFktMc4/zoB2uDcZ7MU44uPC CnQVo2T0Bvg/Apo4SWWkT801Z/gr801YzArLqnfE= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 30 Jul 2024 15:26:22 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 30 15:26:24 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492148, queueID=93114564840 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19166 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAyMyB0byAzMCwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KLm1seCBzeW50 YXggZGlhbGVjdA0KaGVtbCwgYSBIRUV4LWluc3BpcmVkIEhUTUwgdGVtcGxhdGluZyBwcHggZm9y IE9DYW1sDQpGb3Jlc3RlciA0LjINCkZpcnN0IFJvYm90aWNzIGFuZCBPQ2FtbCAtIERvIHlvdSBr bm93IGFueSBsb2NhbCB0ZWFtcz8NCjJuZCBlZGl0b3IgdG9vbGluZyBkZXYtbWVldGluZzogMjV0 aCBvZiBKdWx5IPCfp5kNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQoubWx4IHN5bnRh eCBkaWFsZWN0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1tbHgtc3ludGF4LWRpYWxlY3QvMTUwMzUvMT4NCg0KDQpBbmRyZXkgUG9wcCBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIERlYXIgT0NhbWwgY29tbXVuaXR5LA0KDQogIGl0IGlzIG15IHBsZWFzdXJl IHRvIGFubm91bmNlIGEgcmVsZWFzZSBvZiBbLm1seF0gZGlhbGVjdC4NCg0KICBUaGUgLm1seCBk aWFsZWN0IGV4dGVuZHMgT0NhbWwgc3ludGF4IHdpdGggSlNYIGV4cHJlc3Npb24gY29uc3RydWN0 LA0KICBmb2xsb3dpbmcgdGhlIGV4YW1wbGUgb2YgSlNYIGluIEphdmFTY3JpcHQvUmVhc29uTUwu IEEgYnJpZWYgc25pcHBldDoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBwYWdlID8o ZW5jb2Rpbmc9InV0ZjgiKSB+dGl0bGUgfmNvbnRlbnQgPQ0KICDilIIgICA8aHRtbD4NCiAg4pSC ICAgICA8aGVhZD4NCiAg4pSCICAgICAgIDxtZXRhIGNoYXJzZXQ9ZW5jb2RpbmcgLz4NCiAg4pSC ICAgICAgIDx0aXRsZT50aXRsZTwvdGl0bGU+DQogIOKUgiAgICAgPC9oZWFkPg0KICDilIIgICAg IDxib2R5Pg0KICDilIIgICAgICAgY29udGVudA0KICDilIIgICAgIDwvYm9keT4NCiAg4pSCICAg PC9odG1sPg0KICDilIIgDQogIOKUgiBsZXQgXyA9IDxwYWdlIHRpdGxlPSJIZWxsbyIgY29udGVu dD0iV29ybGQiIC8+DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBtYWluIHVzZSBjYXNlIGlz IHRvIG1ha2UgaXQgZWFzaWVyIHRvIGRlc2NyaWJlIHVzZXIgaW50ZXJmYWNlcw0KICB3aXRoIE9D YW1sLCB3aGljaCBjYW4gcmFuZ2UgZnJvbSBnZW5lcmF0aW5nIEhUTUwgKFtleGFtcGxlIHdpdGgN CiAgRHJlYW1dKSBvciBkZXNjcmliaW5nIGludGVyYWN0aXZlIFVJcyB3aXRoIFJlYXNvblJlYWN0 IChbZXhhbXBsZV0pLg0KDQoNClsubWx4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW1seC9t bHg+DQoNCltleGFtcGxlIHdpdGggRHJlYW1dDQo8aHR0cHM6Ly9naXRodWIuY29tL2FhbnRyb24v ZHJlYW0vYmxvYi9kYzgwNWNiNDZmZDk5MDAxYmM4MjhjZGRiOWRlMDUzYTNkYzQ2NGViL2V4YW1w bGUvdy1tbHgvUkVBRE1FLm1kPg0KDQpbZXhhbXBsZV0NCjxodHRwczovL2dpdGh1Yi5jb20vYW5k cmV5cG9wcC9tZWxhbmdlLW1seC10ZW1wbGF0ZS9ibG9iL21haW4vc3JjL1JlYWN0QXBwLm1seD4N Cg0KSW5zdGFsbGF0aW9uIGFuZCB1c2FnZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSW5zdGFsbCB0aGUgcGFj a2FnZXMgZnJvbSBvcGFtOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gaW5zdGFsbCBt bHggb2NhbWxtZXJsaW4tbWx4DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZW4gY29uZmlndXJl IGR1bmUgdG8gdXNlIHRoZSBgbWx4JyBwcmVwcm9jZXNzb3I6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAoZGlhbGVjdA0KICDilIIgIChuYW1lIG1seCkNCiAg4pSCICAoaW1wbGVtZW50YXRp b24NCiAg4pSCICAgKGV4dGVuc2lvbiBtbHgpDQogIOKUgiAgIChtZXJsaW5fcmVhZGVyIG1seCkN CiAg4pSCICAgKHByZXByb2Nlc3MNCiAg4pSCICAgIChydW4gbWx4LXBwICV7aW5wdXQtZmlsZX0p KSkpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIE5vdyBmaWxlcyB3aXRoIGAubWx4JyBleHRlbnNp b24gd2lsbCBiZSB0cmVhdGVkIGFzIE9DYW1sIG1vZHVsZXMuDQoNCiAgVGhlIG1lcmxpbi9vY2Ft bGxzcCB1c2VycyB3aWxsIGdldCByb3VnaGx5IHRoZSBzYW1lIGxldmVsIG9mIHN1cHBvcnQNCiAg Zm9yIGAubWx4JyBzeW50YXggYXMgdGhleSBnZXQgZm9yIGAubWwnIGJ1dCBzb21lIGFkZGl0aW9u YWwgdGV4dA0KICBlZGl0b3IvSURFIGNvbmZpZ3VyYXRpb24gaXMgbmVlZGVkIHRvIGFzc29jaWF0 ZSBgLm1seCcgZmlsZXMgd2l0aA0KICBtZXJsaW4vb2NhbWxsc3AuDQoNCiAgRm9yIG5lb3ZpbSB1 c2VycyB0aGVyZSdzIGEgcGx1Z2luIFtvY2FtbC1tbHgvb2NhbWxfbWx4Lm52aW1dLCB3aGljaA0K ICBkb2VzIHRoYXQgYml0IG9mIGEgY29uZmlndXJhdGlvbiBhbmQgcHJvdmlkZXMgaGlnaGxpZ2h0 aW5nIGZvciBgLm1seCcNCiAgZmlsZXMgYmFzZWQgb24gYSB0cmVlLXNpdHRlciBwYXJzZXIuDQoN Cg0KW29jYW1sLW1seC9vY2FtbF9tbHgubnZpbV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1t bHgvb2NhbWxfbWx4Lm52aW0+DQoNCg0KaGVtbCwgYSBIRUV4LWluc3BpcmVkIEhUTUwgdGVtcGxh dGluZyBwcHggZm9yIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1oZW1s LWEtaGVleC1pbnNwaXJlZC1odG1sLXRlbXBsYXRpbmctcHB4LWZvci1vY2FtbC8xNTAzNy8xPg0K DQoNClBldHJpLUpvaGFuIExhc3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBJJ3ZlIGJlZW4gd29ya2luZyBvbiBbaGVtbF0sIGEgUFBYIGV4dGVuc2lvbiB0aGF0IGFsbG93 cyB5b3UgdG8gYnVpbGQNCiAgY29tcGxleCBIVE1MIHRlbXBsYXRlcyBkaXJlY3RseSBpbiB5b3Vy IE9DYW1sIGNvZGUuDQoNCiAgSXQncyBhIGRpcmVjdCBpbXBsZW1lbnRhdGlvbiBvZiBFbGl4aXIg UGhvZW5peCdzIEhFRXggdGVtcGxhdGVzLg0KDQogIFRoZSBSRUFETUUgb24gR2l0SHViIGhhcyBh biBleGFtcGxlIHZpZGVvIG9mIHdoYXQgaXQgbG9va3MgbGlrZSBpbiB0aGUNCiAgZWRpdG9yIGFu ZCBhIGJ1bmNoIG9mIGV4YW1wbGUgY29kZSwgYnV0IGhlcmUncyBhIHNob3J0IHNuaXBwZXQgZm9y DQogIGNvbnZlbmllbmNlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogbGF5b3V0cy5t bCAqKQ0KICDilIIgbGV0IGxheW91dCB+dGl0bGUgY29udGVudHMgPSB7JWhlbWx8PCFET0NUWVBF IGh0bWw+DQogIOKUgiA8aHRtbCBsYW5nPSJlbiI+DQogIOKUgiAgIDxoZWFkPjx0aXRsZT48JXM9 IHRpdGxlICU+PC90aXRsZT48L2hlYWQ+DQogIOKUgiAgIDxib2R5Pg0KICDilIIgICAgIDwlcmF3 PSBjb250ZW50cyAlPg0KICDilIIgICA8L2JvZHk+DQogIOKUgiA8L2h0bWw+fH0NCiAg4pSCIA0K ICDilIIgKCogbWFpbi5tbCAqKQ0KICDilIIgbGV0IGhlYWRpbmcgfnRleHQgPSB7JWhlbWx8PGgx Pjwlcz0gdGV4dCAlPjwvaDE+fH0NCiAg4pSCIA0KICDilIIgbGV0IGdyZWV0IH51c2VyID0geyVo ZW1sfDxwPkhlbGxvLCA8JXM9IHVzZXIgJT48L3A+fH0NCiAg4pSCIA0KICDilIIgbGV0ICgpID0N CiAg4pSCICAgbGV0IHRpdGxlID0gIkhlbGxvLCBPQ2FtbCEiIGluDQogIOKUgiAgIHByaW50X2Vu ZGxpbmUgeyVoZW1sfDxMYXlvdXRzLmxheW91dCB0aXRsZT17dGl0bGV9Pg0KICDilIIgICAgIDwu aGVhZGluZyB0ZXh0PSJIZWxsbyEiIC8+DQogIOKUgiANCiAg4pSCICAgICA8JT0gTGlzdC5pdGVy IChmdW4gdXNlciAtPiAlPg0KICDilIIgICAgICAgPC5ncmVldCB1c2VyPXt1c2VyfSAvPg0KICDi lIIgICAgIDwlPSApIFsiU3RldmUiOyAiQmVjY2EiOyAiSm9obiJdOyAlPg0KICDilIIgDQogIOKU giA8L0xheW91dHMubGF5b3V0Pnx9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGhlbWwgZGlmZmVy cyBmcm9tIG90aGVyIHRlbXBsYXRpbmcgc29sdXRpb25zIGJ5IGFsbG93aW5nIHlvdSB0byBjYWxs DQogIE9DYW1sIGNvZGUgZGlyZWN0bHkgaW4gdGhlIHRlbXBsYXRlLCB3aGljaCBpcyBleHRyZW1l bHkgdXNlZnVsIGZvcg0KICBsb29waW5nIGFuZCBjb25kaXRpb25hbCByZW5kZXJpbmcuIFlvdSBj YW4gYWxzbyBjcmVhdGUgYW5kIGNhbGwgeW91cg0KICBvd24gY29tcG9uZW50cy9sYXlvdXRzLg0K DQogIGhlbWwgbGV2ZXJhZ2VzIHRoZSBPQ2FtbCBMU1AgZm9yIGFjY3VyYXRlIGluLWxpbmUgZXJy b3JzLCBhbmQgdGhlDQogIHRlbXBsYXRlcyBhcmUgcGFyc2VkIGFuZCBjb21waWxlZCBpbnRvIGEg c2VyaWVzIG9mIEJ1ZmZlciB3cml0ZXMgd2hpY2gNCiAgcmV0dXJucyBhIHN0cmluZyBhdCBydW50 aW1lLg0KDQogIEknbSBzdGlsbCB3YWl0aW5nIGZvciBpdCB0byBiZSByZWxlYXNlZCBvbiBbb3Bh bV0sIGJ1dCB0aG91Z2h0IEknZA0KICBzaGFyZSBpdCBpbiB0aGUgbWVhbnRpbWUgaW4gY2FzZSBh bnlvbmUgd291bGQgYmUgd2lsbGluZyB0byBjaGVjayBpdA0KICBvdXQgYW5kIHByb3ZpZGUgZmVl ZGJhY2sgOnNsaWdodF9zbWlsZTogLg0KDQoNCltoZW1sXSA8aHR0cHM6Ly9naXRodWIuY29tL3Bq bGFzdC9oZW1sPg0KDQpbb3BhbV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9z aXRvcnkvcHVsbC8yNjI5Nz4NCg0KDQpGb3Jlc3RlciA0LjINCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWZvcmVzdGVyLTQtMi8xNTA0My8xPg0KDQoNCkpvbiBTdGVybGluZyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBG b3Jlc3RlciA0LjIgb24gb3BhbSwgd2hpY2ggaXMNCiAgYW4gT0NhbWwgdXRpbGl0eSB0byBkZXZl bG9wIOKAnEZvcmVzdHPigJ0sIHdoaWNoIGFyZSBkZW5zZWx5IGludGVybGlua2VkDQogIG1hdGhl bWF0aWNhbCB3ZWJzaXRlcyAvIFpldHRlbGvDpHN0ZW4gc2ltaWxhciB0byB0aGUgW1N0YWNrcyBw cm9qZWN0XQ0KICBvciBbS2Vyb2Rvbl0uIFlvdSBjYW4gc2VlIHRoZSBbY2hhbmdlbG9nXSBvbiBt eSBvd24gW0ZvcmVzdF0uDQoNCiAgVGhpcyByZWxlYXNlIGFkZHMgbWFueSBuZXcgZmVhdHVyZXMg YW5kIGltcHJvdmVtZW50cywgaW5jbHVkaW5nOg0KDQogIOKBgyBGaXJzdC1jbGFzcyBmdW5jdGlv bnMgYW5kIGxhenkgYXJndW1lbnRzLCB3aGljaCBjYW4gYmUgdXNlZCB0bw0KICAgIGltcGxlbWVu dCBtb3JlIGVyZ29ub21pYyBNYXRoTUwgbWFjcm9zLg0KICDigYMgQSBuZXcgcXVlcnkgbGFuZ3Vh Z2UsIHdoaWNoIGlzIG5vdyBleHByZXNzaXZlIGVub3VnaCB0byBlbmNvZGUgdGhlDQogICAgYmFj a21hdHRlcg0KICDigYMgSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb2YgZ3JhcGggYW5hbHlzaXMgKDJ4 IG92ZXJhbGwgc3BlZWR1cCByZW5kZXJpbmcNCiAgICBteSBvd24gZm9yZXN0KQ0KDQogIFRvIHNl ZSBvdGhlciBmZWF0dXJlcyBhbmQgZG9jdW1lbnRhdGlvbiBvZiBicmVha2luZyBjaGFuZ2VzLCBw bGVhc2UNCiAgdmlldyB0aGUgW0ZvcmVzdGVyIDQuMiBSZWxlYXNlIE5vdGVzXS4NCg0KICBNeSB0 aGFua3MgdG8gQGtlbnRvb2t1cmEgYW5kIEppbnNlciBLYWZrYSBmb3IgdGhlaXIgY29udHJpYnV0 aW9ucyB0bw0KICB0aGlzIHJlbGVhc2UuDQoNCg0KW1N0YWNrcyBwcm9qZWN0XSA8aHR0cHM6Ly9z dGFja3MubWF0aC5jb2x1bWJpYS5lZHU+DQoNCltLZXJvZG9uXSA8aHR0cHM6Ly9rZXJvZG9uLm5l dD4NCg0KW2NoYW5nZWxvZ10gPGh0dHBzOi8vd3d3Lmpvbm1zdGVybGluZy5jb20vam1zLTAwV0su eG1sPg0KDQpbRm9yZXN0XSA8aHR0cHM6Ly93d3cuam9ubXN0ZXJsaW5nLmNvbT4NCg0KW0ZvcmVz dGVyIDQuMiBSZWxlYXNlIE5vdGVzXSA8aHR0cDovL3d3dy5qb25tc3RlcmxpbmcuY29tL2ptcy0w MFdLLnhtbD4NCg0KDQpGaXJzdCBSb2JvdGljcyBhbmQgT0NhbWwgLSBEbyB5b3Uga25vdyBhbnkg bG9jYWwgdGVhbXM/DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Zp cnN0LXJvYm90aWNzLWFuZC1vY2FtbC1kby15b3Uta25vdy1hbnktbG9jYWwtdGVhbXMvMTUwNTEv MT4NCg0KDQpqYmVja2ZvcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGb3IgdGhvc2Ugd2hvIGRvbid0IGtu b3csIEZpcnN0IFJvYm90aWNzIGlzIGEgY29tcGV0aXRpdmUsDQogIGludGVybmF0aW9uYWwgaGln aCBzY2hvb2wgbGVhZ3VlIGZvciByb2JvdGljczoNCiAgPGh0dHBzOi8vd3d3LmZpcnN0aW5zcGly ZXMub3JnL3JvYm90aWNzL2ZyYz4uDQoNCiAgSSd2ZSBoZWxwZWQgYSBjb3VwbGUgc3R1ZGVudHMg d3JpdGUgInNjb3V0aW5nIiBzb2Z0d2FyZSBwYXJ0aWFsbHkgaW4NCiAgT0NhbWwgYW5kIHBhcnRp YWxseSBpbiBKYXZhOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9zY291dGFwcHMvdHJl ZS9tYWluP3RhYj1yZWFkbWUtb3YtZmlsZSNzb25pYy1zY291dC1hcHBzPg0KDQogIEl0IGlzIGEg dmVyeSAvdmVyeS8gc2xvdyBzZWFzb24gZm9yIHJvYm90aWNzIHRlYW1zLCBidXQgaWYgeW91ciBs b2NhbA0KICBoaWdoIHNjaG9vbCBwYXJ0aWNpcGF0ZXMgbm93IGlzIGEgZ3JlYXQgdGltZSBmb3Ig dGhlIG1lbnRvcnMgb2YgdGhhdA0KICB0ZWFtIHRvIGdldCByZWFkeS4gSWYgeW91IGtub3cgYSB0 ZWFtIHRoYXQgbmVlZHMgc2NvdXRpbmcgc29mdHdhcmUgYW5kDQogIHdhbnQgdG8gaGVscCBzcHJl YWQgT0NhbWwgdG8geW91ciBsb2NhbCBuZWlnaGJvcmhvb2RzIOKApiBwbGVhc2UgZGlyZWN0DQog IG1lc3NhZ2UgbWUuDQoNCg0KMm5kIGVkaXRvciB0b29saW5nIGRldi1tZWV0aW5nOiAyNXRoIG9m IEp1bHkg8J+nmQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tMm5kLWVkaXRvci10b29saW5nLWRldi1t ZWV0aW5nLTI1dGgtb2YtanVseS8xNDk1My80Pg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQs IHZkcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFRoYW5rcyBhIGxvdCB0byBhbGwgcGFydGljaXBhbnRzIGFuZCBz cGVha2VycywgaXQgd2FzIGEgdmVyeSBuaWNlIGFuZA0KICBpbnRlcmVzdGluZyBtZWV0aW5nICEN Cg0KICBZb3UgY2FuIGZpbmQgdGhlIG1lZXRpbmcgbm90ZXMgaGVyZToNCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9tZXJsaW4vd2lraS9QdWJsaWMtZGV2JUUyJTgwJTkwbWVldGluZ3M+DQoN CiAgV2l0aCB0aGUgc3VtbWVyICgvd2ludGVyKSBicmVhayBjb21pbmcgZm9yIGEgbG90IG9mIHVz LCB0aGUgbmV4dA0KICBtZWV0aW5nIHdpbGwgdGFrZSBwbGFjZSBpbiBTZXB0ZW1iZXIuIFdlIHdp bGwgaW1wbGVtZW50IGENCiAgY2FsbC1mb3ItcHJlc2VudGF0aW9uIGFuZCBhIHBvbGwgdG8gY2hv b3NlIG1lZXRpbmcgdGltZXMgYnkgdGhlbi4NCg0KICBEb24ndCBoZXNpdGF0ZSB0byB0ZWxsIHVz IHJpZ2h0IGF3YXkgaWYgeW91IHdvdWxkIGxpa2UgdG8gZ2l2ZSBhDQogIHByZXNlbnRhdGlvbiBv ciBpZiB5b3UgaGF2ZSBzdWJqZWN0cyB0aGF0IHlvdSB3b3VsZCBsaWtlIHVzIHRvIHRha2UNCiAg b24uIChAYW5kcmV5cG9wcCB3b3VsZCB5b3UgYmUgaW50ZXJlc3RlZCBpbiB0YWxraW5nIGFib3V0 IG1lbGFuZ2UgYW5kDQogIGhvdyBpdCBpbnRlZ3JhdGVzIHdpdGggZWRpdG9yIHRvb2xpbmcgPykN Cg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0 aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKAoiBbSW50cm9kdWNpbmcgdHJlZS1zaXR0ZXIt ZHVuZV0NCiAg4oCiIFtDcmVhdGluZyB0aGUgU3ludGF4RG9jdW1lbnRhdGlvbiBDb21tYW5kIC0g UGFydCAzOiBWU0NvZGUgUGxhdGZvcm0NCiAgICBFeHRlbnNpb25dDQoNCg0KW3RoZSBvY2FtbC5v cmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbSW50cm9kdWNpbmcgdHJlZS1z aXR0ZXItZHVuZV0NCjxodHRwOi8vYmxvZy5lbWlsbG9uLm9yZy9wb3N0cy8yMDI0LTA3LTI2LWlu dHJvZHVjaW5nLXRyZWUtc2l0dGVyLWR1bmUuaHRtbD4NCg0KW0NyZWF0aW5nIHRoZSBTeW50YXhE b2N1bWVudGF0aW9uIENvbW1hbmQgLSBQYXJ0IDM6IFZTQ29kZSBQbGF0Zm9ybQ0KRXh0ZW5zaW9u XQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTA3LTI0LWNyZWF0aW5nLXRoZS1zeW50 YXhkb2N1bWVudGF0aW9uLWNvbW1hbmQtcGFydC0zLXZzY29kZS1wbGF0Zm9ybS1leHRlbnNpb24+ DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0 byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0K ICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtS U1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVj ZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBb Y2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0g PG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBh cmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltj YW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0K DQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 23 to 30, 2024.

    .mlx syntax dialect

    Andrey Popp announced

    Dear OCaml community,

    it is my pleasure to announce a release of .mlx dialect.

    The .mlx dialect extends OCaml syntax with JSX expression construct, follow= ing the example of JSX in JavaScript/ReasonML. A brief snippet:

    let page ?(encoding=3D"utf=
    8") ~title ~content =3D
      <html>
        <head>
          <meta charset=3Dencoding />
          <title>title</title>
        </head>
        <body>
          content
        </body>
      </html>
    
    let _ =3D <page title=3D"Hello" content=3D"World" />
    

    The main use case is to make it easier to describe user interfaces with OCa= ml, which can range from generating HTML (example with Dream) or describing interactive UIs with ReasonRea= ct (example).

    Installation and usage

    Install the packages from opam:

    opam install mlx ocamlmerlin-mlx
    

    Then configure dune to use the mlx preprocessor:

    (dialect
     (name mlx)
     (implementation
      (extension mlx)
      (merlin_reader mlx)
      (preprocess
       (run mlx-pp %{input-file}))))
    

    Now files with .mlx extension will be treated as OCaml modules.

    The merlin/ocamllsp users will get roughly the same level of support for .mlx syntax as they get for .ml but some additional= text editor/IDE configuration is needed to associate .mlx fil= es with merlin/ocamllsp.

    For neovim users there's a plugin ocaml-mlx/ocaml_mlx.nvim, which does that bit of a confi= guration and provides highlighting for .mlx files based on a t= ree-sitter parser.

    heml, a HEEx-inspired HTML templating ppx for OCaml

    Petri-Johan Last announced

    I've been working on heml, a= PPX extension that allows you to build complex HTML templates directly in = your OCaml code.

    It's a direct implementation of Elixir Phoenix's HEEx templates.

    The README on GitHub has an example video of what it looks like in the edit= or and a bunch of example code, but here's a short snippet for convenience:

    (* layouts=
    .ml *)
    let layout ~title contents =3D {%heml|<!DOCTYPE htm=
    l>
    <html lang=3D"en">
      <head><title><%s=3D=
     title %></title></head&=
    gt;
      <body>
        <%raw=3D contents %>
      </body>
    </html>|}
    
    (* main.ml *)
    let heading ~text =3D {%heml|<h1><%s=
    =3D text %></h1>|}
    
    let greet ~user =3D {%heml|<p>Hello, <%s=3D u=
    ser %></p>|}
    
    let () =3D
      let title =3D "Hell=
    o, OCaml!" in
      print_endline {%heml|<Layouts.layout title=3D{title}>
        <.heading text=3D"Hello!" /&g=
    t;
    
        <%=3D List.iter (fun user -> %>
          <.greet user=3D{user} />
        <%=3D ) ["Steve"; "Becca";=
     "John"]; %>
    
    </Layouts.layout>|}
    

    heml differs from other templating solutions by allowing you to call OCaml = code directly in the template, which is extremely useful for looping and co= nditional rendering. You can also create and call your own components/layou= ts.

    heml leverages the OCaml LSP for accurate in-line errors, and the templates= are parsed and compiled into a series of Buffer writes which returns a str= ing at runtime.

    I'm still waiting for it to be released on opam, but thought I'd share it in the m= eantime in case anyone would be willing to check it out and provide feedbac= k :slight_smile: .

    Forester 4.2

    Jon Sterling announced

    I am pleased to announce the release of Forester 4.2 on opam, which is an O= Caml utility to develop =E2=80=9CForests=E2=80=9D, which are densely interl= inked mathematical websites / Zettelk=C3=A4sten similar to the Stacks project or Kerodon. You can see the changelog on my own Forest.

    This release adds many new features and improvements, including:

    • First-class functions and lazy arguments, which can be used to implemen= t more ergonomic MathML macros.
    • A new query language, which is now expressive enough to encode the back= matter
    • Improved performance of graph analysis (2x overall speedup rendering my= own forest)

    To see other features and documentation of breaking changes, please view th= e Forester 4.2 Release= Notes.

    My thanks to @kentookura and Jinser Kafka for their contributions to this r= elease.

    First Robotics and OCaml - Do you know any local teams?

    jbeckford announced

    For those who don't know, First Robotics is a competitive, international hi= gh school league for robotics: https://www.firstinspires.org/robotics/frc.

    I've helped a couple students write "scouting" software partially in OCaml = and partially in Java: https://github.com/diskuv/scout= apps/tree/main?tab=3Dreadme-ov-file#sonic-scout-apps

    It is a very very slow season for robotics teams, but if your local = high school participates now is a great time for the mentors of that team t= o get ready. If you know a team that needs scouting software and want to he= lp spread OCaml to your local neighborhoods … please direct message = me.

    2nd editor tooling dev-meeting: 25th of July =F0=9F=A7=99

    Continuing this thread, vds announced

    Thanks a lot to all participants and speakers, it was a very nice and inter= esting meeting !

    You can find the meeting notes here: https://github.com/ocaml/merlin/wiki= /Public-dev%E2%80%90meetings

    With the summer (/winter) break coming for a lot of us, the next meeting wi= ll take place in September. We will implement a call-for-presentation and a= poll to choose meeting times by then.

    Don't hesitate to tell us right away if you would like to give a presentati= on or if you have subjects that you would like us to take on. (@andreypopp = would you be interested in talking about melange and how it integrates with= editor tooling ?)

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=FQjBZRnE; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=ETYjiqIq; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id C3DFDB80123 for ; Tue, 6 Aug 2024 10:00:44 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=19W1umn84Y1R3hhSeIpq/oSv3HvLSq6XmebUveeP0n4=; b=FQjBZRnELOnfEz/OXcKjhWb5NVAqsmZ4o0kVVd8UxpevBQuIbE572hs5 HtKb+/7eIehV5/rQGNo9vesIjc3rgbfHpZtQGD27RQpNMcl/dt8AgWKyP hYT2iy/5gWkPxewhn50Lr5IDD5zkoaBwE7wx6c8/xBV8q7bKIbYWt19AM k=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,267,1716242400"; d="scan'208,217";a="178235239" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 06 Aug 2024 11:00:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id C7062E0133; Tue, 6 Aug 2024 11:00:43 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 677FFE0035 for ; Tue, 6 Aug 2024 11:00:38 +0200 (CEST) IronPort-SDR: 66b1e633_o74JGnBusTbvb6S2upp2ZQKDPpgtrfuikYhRLElvJr80ER+ bUMu3NRslnF1RWOXyKUanjlOxOwGyCDtglM9+GQ== X-IPAS-Result: =?us-ascii?q?A0EKAQDQ5bFmmCIeaIFagliBQVsoGQFdBlozBwhIAwGEU?= =?us-ascii?q?oNPhS2IcoZsilyIRYIxgVYUgSw5FAEDAQ0uAQUNAQIEAQEDAQIBgguCdAIWi?= =?us-ascii?q?TcCHwYBBDEIDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBA?= =?us-ascii?q?QEBAQE3BUmFdQ2CShkVI2+BJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIMAYEeAQgKEwEBLQsYIwMQBAEGAwIEDQE1FwESF?= =?us-ascii?q?AaCZgGCZAMEAQwGkQubPHqBMoEBggwBAQaBCD4CAQIJAgUBDgkm2gSBGUoJg?= =?us-ascii?q?UiIJwkaAShIagKEQgmEMicPgVVEgz1KB2+CYQEBAQEYgREBEQIBCCEkCYMlg?= =?us-ascii?q?mmGK1USaYRYAVsSgQovFoIvYYEnBWMFCgEmgWRXD0UEDgFxPxJCAgyDBXwmg?= =?us-ascii?q?SMQhxtqhyuBRyIDJjMhEwFVExcLCQVkhhmCTIMtghqEFoUugWsMYYdygXCBP?= =?us-ascii?q?oFeSoJ4S4VdgQOCWXwjHUADC209NRQbpGYEDSQBgz0IBjgILAQoAQcaDgUcD?= =?us-ascii?q?gIgAiQKCA4KHAUKBRQPFwoEBRABBg8eAQsLAi0DkjQLLgMqdY44oXVtNAeEG?= =?us-ascii?q?IFdBgyJAYEkjieHS4QFTIEKiW2BPYZ9kC2CESKYTiKCNIJBhF8KgRsJgW0eT?= =?us-ascii?q?JUyEwMTAwoZhRqBaQI2bD8BGgEOBzMaMEMNDIJOCRYwHA+OLRZwHAEIgkOBP?= =?us-ascii?q?oMbO4EBgUDBd0E1AgEBCS4CBwEKAQEDCYVFHQEBhkCBSwEB?= IronPort-PHdr: A9a23:gx9apB9nKE2/hf9uWV6zngc9DxPPW53KNwIYoqAql6hJOvz6uci5Z AqPtb410xfgZsby1bFts6nsj+jYQ2sO4JKM4jgpUadncFs7s/gQhBEqG8WfCEf2f7bAZi0+G 9leBhc+pynoeUdaF9zjaFLMv3a88SAdGgnlNQpyO+/5BpPeg9642u2855HfeQZFiTmybb9uL hi9sBncuNQRjYZ+Jak9zQfErGFPd+pK221jOEidnwz75se+/Z5j9zpftvc8/MNeUqv0Yro1Q 6VAADspL2466svrtQLeTQSU/XsTTn8WkhtTDAfb6hzxQ4r8vTH7tup53ymaINH2QLUpUjms8 6tnVBnlgzoHOzA69mHXlM1wjLlaoB26oxxw3ZPfYY+SNPpkY6zdZs4RSW5PU8pNUiBMBJ63Y YkSAOobJetWr5fzqUYAoxW9CgajGPjixSVUinLsx6A2z/gtHAPA0Qc9H9wOqnPUrNDtOaoOV eC61q/IxijeYfxK2Tf97YnIcgw9ofqRWr9/a87RxlMpFw/flVWftYzlPzaU1uQRr2iW9PJgV eWri28ntwF+vCSgxscqionIn4IV107L+T9+wIYvKt21UUh2asOrH5VMrS+VLZd2Qt88TGFyv iY30r0ItIK1cSUKx5oq2wDTZfOHfYaI/x/tWvidLzh7iX9heb+yhgq+/EuvxOPyWce50EtHo yRZntTRqnwA1BLd58uBR/Bg8Emh3jOP2BrS6uFCOU00jbTUK4Igwr4siJUTqUPDHirzmErol qOWcFsr+vSw5+TgfrrpvJqcN4tuhgH5KKQuldSzAes5MggSX2ib5P+z2Kf/8k3+RbVGluA5n bfHsJzAOcQboba1DBJU0oY46Ba/Eimm3M4EknkAKVJJYBaHj4/yNFHVPPD3E+2zg063kDtzy fDGP7LhApDXIXTZjLjherN951ZbyAUv199f4pZUBqsbLPL0QE/xu8TUDhA4Mwyow+bnFc5y2 pkEVW2TBa+ZNbvesVGS5u01JumDfpYZtyrnJ/c54P7uiGc1mUMHcqmz3JsYdW63Hu98L0qFZ nrsh88NEWYMvgokTezlkkeOUTBJZ3u0Qqky5Sk7BZq7AYvdQo2hmqGN0Du0E5FMaG1KFkqAH HnneomcWPoBazieLtJ/njAZT7StVpIt2BG0uAPnybdrMuzZ8TAGuJLnydh1/PHTmg8o9TJpD sSc0n+CQnlokm4OWjQ4xrpwoVZnxVeGyaV4g+JXFdhU5/5RVwc7OoPQw/ZiC9D1XgLAfsuJR 0i6TdWmBzExT8sxw8IQbEpnHNWilB/D0zKrA78TibOLGIQ5/r/C03X1Pcpx1mrK2aY7g1QoX sdDL2Ori6Fn+wjWHYHJkkGZl6iwdaQb2S7A7HqNw3aTsk1ESANwUaDFUm4CakbOt9r35lvPT 6epCbQjMgpB1dCNJbdKat3vjFVGXerjN8rEb2K2gWewCg6FyamIbIXwfWURxj7dB1QEkwAW/ HaGKRQ+Czy6rGLZETxuE07gbF338eVkrXO2QUA1wxuNb0172Lq54hgViueERPMJwr0EoDshq ylzHFulwt7aE8CAqBZ5fKVAfdM9509K2n7DuAx4OpysNqRihl8FcwRrpE7uzBV2CoBYkccwt n8qzQxyKbiZ0FxbbT+Y04rwafXrLTy4+A+pIeaC3k7Y+NKJ/OEJ5ehu7x3otQStU04j6GlP0 t9P0nLa6I+ZIhAVVMfYVk8xvyNxp7TbfjV1s4rQ3HsqKqK0tz7ex/oxA+801hurf9FeKb6JU gjoHJtJVICVNOU2lg3xPVo/N+dI+ftvZ6tOFtOD0a+vZ6N7mS6+yH9A+MZ7216N8Cx1TqjJ2 YwEyreWxFjPTC/y2XGmtM2/goVYfXcKBGPqwCztAshKba13fJoXIX+pJ9yry95+gZ/0RnMe8 0SsVBsdwMH8QROJdBTm2BFIk0EeoHipgyy9mgdOqGl8rq+ShXn27bH6cx4WJmNARG9jlErhZ 4+ugIUTWEGuKRMilB6k+VrSza9Goq9yNC/WHVcOeDL5fCl5SqXljrOZeIZU7Y8w9yVaVOPpe VeBVrv0uAcXyQvmDzIY3Dc/Zi2nsZX/ngVnhSSaNnkbQGPxX8Z2yF+f4dXdQaUUxT8aXGxjj iGRAFGgPt6v9NHSlpHZs+n4WXjzHptUOTLmy4+Nrk7ZrSVjHAG/kvavm9bmDRly0Cn10MNvX DnJqxC0a5fi1qCzO+ZqNkdyA1q0581/E4B42ow+4fNYkXEej5PT5nEHlGbvLf1D3qbvcHcGR TgK2sPYpg//1wwrL36EwZ74SmTI2tFoNLzYKisd3iMw6dwPCb/BteYV23It/hzj9USKPasY/ H9V0/Yl5X8EjvtcvQMsyn7YGbUOBQxDOjSqkR2U7te4paERZWC1cLH22lAt+LLpRLyEvAxYX 270P5k4GiolpP5FCwqZ0Hj+s9TcVozIatYCqhCfkxHBlvVYbpUrma8DgSNhf3n2vXgk1/ITh xtz25q3p86Cd3Ur+7i2SE09VHW9d4YI9zfhgLwL1M+S1obpBZ5hHzQXQLPwSva5DD8ZtfLmL huDVjompT3IfNiXVR/a40BgoXXVFpmtPHzCP3gVw+JpQxyFLVBeigQZNNkjtqYwDRvihMnoc UMioysU+ka9sRxUjORhKxj4VG7b4gaucDY9DpaFflJa6QRL5kGdNsL7jKo7JBtjpsihqQHUf 1S1MhxPCXAVV0eEAVH6I7To4sPPpuGcD+z4NPDOZLSStcRUUOqOzp+0lI4673CLLMrqXDEqA /Ag20VFVGx0AIyAwWRJEnRL0XmVKZXH7B6nsjV6tMW+7OjmVEr06I2DBqETVLcnsxG6jKGfN vKB0SNwKDJWzJQJljfDzLkS2kJXijk7LmP8V+1Y6WiWFOSLxvwybVZTcS54OcpW4rhp2wBMP ZWekdbpzvtjieZzDV5ZVFvnk8XvZMoQImj7OkmUYSTDfLmAOzDPxNn6JK2mTrgFxt5ujEXlu TOWShrbEGGbkD34Sx2kMedNlTyWehtEt9S0dh9rT3PoTNfndgGTOthqizY72vsx2mOMMnQTe 2sZEQsFvviL4CVUj+8qUVd71SIwLeyJwnOhwbzALZIHrfZgAiJ1jv9XpnMgxO5c6ChCAud+m C7TssJGqVa7lOKC0XxiDAoIrSxEztHu3w0qKeDS8Z9OXmzB9RQG4DCLChgEkNBiD8Xmp6Faz tWc3LK2MjpJ9MjYuNcNH8WBYtzSK2IvaFC6fVycRBtAVzOgMnvTwlBQgO3HvGPAtYA089Cvm YJSGOYBBRpsTq9cURwjR4BKY5ZvAmF9y+/d1ZZUoyHm6kKMIacS9tPGTq7AUKypcWzAy+ceI UJQnvu7LJxNZNejgxUwNgB2xNbDSRXZUI0f8HNtMV9m+x4okjA2DWwrhRC/Mlv0siNKGabmx 0xn1gdzM7Zyr2ngsQhreQKC4SI0lANZdczNuTmKa3axKa6xWdoTEC/orw0qNYu9RQ9pbAq0l EgiNTHeRrsXgaEyPWxsjQbdv9NIF5s+BeVcZwQMwPiMe/gy+VFM82O/wktW+ebOCZ1jjRYnN 5m2oDpM1hliY9g8OaHLbPMTnx4J3v7I5Xfujbx5yRR7RQ5F6G6IfS8UpEEEfqIrISal5K0k6 ACPnSdCZHlZV/cupaEi/Uc8NuKciiP4hucZewbob7DZdPvf4DST8KzACkk93U4JiURfqL1/0 MN4NlGRS1hq17yJURIAKcvFLwhRKctU7nnaOyiU4oCvidp4OZuwEufwQKqArqER1wifJj1xS oQJ451UJrf5yEbcPNvqJ74DyAww6ULsPlrQBfBAflSQmzcCot2j5JVwwI9WKypbBDltdyKt6 fyEw21iyOrGR9owbnoAC8EcMWkqXcShhyNDl3FQVX+v1eYI1AWJ7zn9vzndSj7mYJAwAZXcL QMpA9aw9zIl9qGwglOC6ZTSKVbxMtF6s8PO4+cX9N6XTulZRr5nvwLAipFVEja0BnXXH4f/d P2SI8E8KMb5AXGgXhmjhiIpGo3vac21IPHAiEmtTIJQ+uFzORg7MsusCjwVGxFxvvwOoqVma l9bC3LUSRTvqgI1Orf5JVuIlNK0TDT0QdO3Z/xPlKOiYLhG0ycnbum70WYtCJYgwLvumXM= IronPort-Data: A9a23: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 NVhD7jSyXlp8Hxs5YA= IronPort-HdrOrdr: A9a23:JNfoh6GJApx+5YqDpLqEN8eALOsnbusQ8zAXPiFKKCC9F/byqy nAppsmPHPP+VUssQgb6Km90fC7MAvhHOBOkPUs1MaZMjUO0VHARO1fBODZowEIdReOlNK1rZ 0QCJSX/7DLfD1HZbqR2njdLz5pqOPszEjj7d2y85/tJjsaDJ2Jhm1Ce2Cm+q0ffng6OXJffK DsnPZ6mw== X-Talos-CUID: 9a23:CgaDmmM5V3AE7O5DY3NcqGExXcofd0be9CjfOUGmDGR5cejA X-Talos-MUID: =?us-ascii?q?9a23=3A7B3oyA+/HH3hjYJfs8HQehmQf8E45qCiB19Rqqs?= =?us-ascii?q?pvuOAGnV7PQyRiyviFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,267,1716242400"; d="scan'208,217";a="93650469" X-MGA-submission: =?us-ascii?q?MDFxJPrvWlS+xoLvO4TrOl2ljzx0qyOV4Ribg2?= =?us-ascii?q?I2XUhKFyhvQOf4mOlKWHnD/yqPm04zgpf8KX2N609tqLpJo8FkaGv3RT?= =?us-ascii?q?tHAOOeX8p7TLNWgsxO7Lw5NL1LXAM6qRU548AvucTVOfXwc49mEcEXaP?= =?us-ascii?q?wKGOP6P43M6v3Yn2TXQraE+Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Aug 2024 11:00:36 +0200 Received: from TM.local (88-121-115-170.subs.proxad.net [88.121.115.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id ECC715648F9; Tue, 6 Aug 2024 11:00:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1722934834; bh=7TERO5s9tFiilL4ZAGg+Z/FtQciOSK+VXs4fDybKkgE=; h=From:To:Subject:Date:Message-ID; b=ETYjiqIq1kv3JG3B8GqFOVNShAcy4mvpH1m+uoT6ng6It+gD+Xe50pEEyGiGSQlCz vqfM4ObB8oKxLJrQI72P9RRb3lZYI/2g9g+7ZP3UjwB9o72vr0DDOPS4PZRwusB19K BmNwwgpNiF4h/l65PGnWH87Fhd+bmHR8aNnbTneI= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 06 Aug 2024 11:00:30 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 6 11:00:35 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.445295, queueID=B71185648FA X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19169 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAzMCB0byBBdWd1c3QNCjA2LCAyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClBw eGxpYiBkZXYgbWVldGluZ3MNClByYWdtYXRpYyBDYXRlZ29yeSBUaGVvcnkNCnBweGxpYi4wLjMz LjANCk9DYW1sLUxTUCAxLjE5LjAgZm9yIE9DYW1sIDUuMg0KTWxGcm9udCAtIEEgcGFja2FnaW5n IHN5c3RlbSBmb3IgT0NhbWwNCk9DYW1sLm9yZyBOZXdzbGV0dGVyOiBKdWx5IDIwMjQNCk90aGVy IE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpQcHhsaWIgZGV2IG1lZXRpbmdzDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweGxpYi1kZXYtbWVldGluZ3MvMTI0 NDEvMjg+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgUGF0cmljayBGZXJyaXMgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBNZWV0aW5nIG5vdGVzIGFy ZSBhdmFpbGFibGUgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGli L3dpa2kvRGV2LU1lZXRpbmctMjAyNC0wNy0yMz4NCg0KICBUaGFuayB5b3UgdG8gYWxsIG9mIHRo ZSBwYXJ0aWNpcGFudHMuIElmIGFueW9uZSBpcyBpbnRlcmVzdGVkIGluDQogIGFkZGluZyBpdGVt cyBmb3IgdGhlIG5leHQgbWVldGluZyBpbiBBdWd1c3QgZG8gcGluZyBtZS4NCg0KICBVbnRpbCB0 aGVuIGhhcHB5IHBweC1pbmcgOikpDQoNCg0KUHJhZ21hdGljIENhdGVnb3J5IFRoZW9yeQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9wcmFnbWF0aWMtY2F0ZWdvcnktdGhlb3J5LzE1MDU2LzE+DQoNCg0KRG1pdHJpaSBLb3Zh bmlrb3YgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHN0YXJ0ZWQg d3JpdGluZyBhIHNlcmllcyBvbiAqUHJhZ21hdGljIENhdGVnb3J5IFRoZW9yeSBmb3INCiAgQmVn aW5uZXJzKiBmb2N1c2luZyBvbiByZWFsLXdvcmxkIHVzZSBjYXNlcyByYXRoZXIgdGhhbiB0aGVv cnkuIEFsbA0KICBjb2RlIGV4YW1wbGVzIGFyZSBpbiBPQ2FtbC4NCg0KICBUaGUgZmlyc3QgcGFy dCB3YXMganVzdCBmaW5pc2hlZDoNCiAg4oCiIFtQYXJ0IDE6IFNlbWlncm91cCBJbnRyb10NCg0K ICBJdCdzIGp1c3QgdGhlIGJlZ2lubmluZywgYW5kIEkgaGF2ZSBwbGFucyB0byBkZXNjcmliZSBt b3JlIGFuZCBwcm92aWRlDQogIG1vcmUgZXhhbXBsZXMgaW4gZnV0dXJlIHBhcnRzLiBJIGFsc28g cGxhbiB0byBtYWtlIGEgdmlkZW8gdmVyc2lvbiBhcw0KICB3ZWxsLg0KDQogIEkgaG9wZSB5b3Un bGwgZW5qb3kgaXQhDQoNCg0KW1BhcnQgMTogU2VtaWdyb3VwIEludHJvXQ0KPGh0dHBzOi8vZGV2 LnRvL2Noc2hlcnNoL3ByYWdtYXRpYy1jYXRlZ29yeS10aGVvcnktcGFydC0xLXNlbWlncm91cC1p bnRyby0xaWduPg0KDQoNCnBweGxpYi4wLjMzLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLXBweGxpYi0wLTMzLTAvMTUwNjEvMT4NCg0KDQpOYXRoYW4gUmVib3VycyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBQcHhsaWIgZGV2IHRlYW0gaXMgaGFwcHkgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgYHBweGxpYi4wLjMzLjAnLg0KDQogIFlvdSBjYW4gZmlu ZCB0aGUgZnVsbCBjaGFuZ2Vsb2cgZm9yIHRoaXMgcmVsZWFzZSBbaGVyZV0uDQoNCg0KW2hlcmVd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtcHB4L3BweGxpYi9yZWxlYXNlcy90YWcvMC4zMy4w Pg0KDQpXYXJuaW5nIHNpbGVuY2luZyBmb3IgYFtAQGRlcml2aW5nIC4uXScgZ2VuZXJhdGVkIGNv ZGUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IFRoaXMgcmVsZWFzZSdzIG1haW4gZmVhdHVyZSBpcyBhIHNlcmllcyBvZiBpbXByb3ZlbWVudCB0 byBmbGFncw0KICBjb250cm9sbGluZyB1bnVzZWQgdmFsdWUvbW9kdWxlL3R5cGUgd2FybmluZ3Mg c2lsZW5jaW5nLg0KDQogIFRoZSBgcHB4bGliJyBkcml2ZXIgZ2VuZXJhdGVzIHdhcm5pbmcgc2ls ZW5jaW5nIGl0ZW1zIHRvIHByZXZlbnQNCiAgYFtAQGRlcml2aW5nIC4uLl0nICBnZW5lcmF0ZWQg Y29kZSB0byB0cmlnZ2VyIHVudXNlZCBjb2RlDQogIHdhcm5pbmdzLiBUaHJlZSB3YXJuaW5ncyBh cmUgZGlzYWJsZWQgdGhhdCB3YXk6DQogIOKAoiBXYXJuaW5nIDMyOiB1bnVzZWQgdmFsdWUNCiAg 4oCiIFdhcm5pbmcgNjA6IHVudXNlZCBtb2R1bGUNCiAg4oCiIFdhcm5pbmcgMzQ6IHVudXNlZCB0 eXBlDQoNCiAgVGhlIGZpcnN0IHR3byBhcmUgZGlzYWJsZWQgZm9yIHZhbHVlcyBhbmQgbW9kdWxl cyBnZW5lcmF0ZWQgYnkgdGhlDQogIGRlcml2ZXIgd2hpbGUgdGhlIHRoaXJkIGlzIGRpc2FibGVk IGZvciB0aGUgdHlwZXMgaW4gdGhlIHR5cGUNCiAgZGVjbGFyYXRpb24gdG8gd2hpY2ggdGhlIGBb QEBkZXJpdmluZyAuLi5dJyBhdHRyaWJ1dGUgaXMgYXR0YWNoZWQuDQoNCiAgVGhpcyBmZWF0dXJl IHdhcyBhZGRlZCBhIGxvbmcgdGltZSBhZ28gdG8gYXZvaWQgbWFudWFsbHkgZGlzYWJsaW5nDQog IHRob3NlIHdhcm5pbmdzIHdoZW4gd29ya2luZyB3aXRoIGRlcml2ZXJzIHRoYXQgZ2VuZXJhdGUg YSBzZXQgb2YNCiAgdmFsdWVzIGFuZCBtb2R1bGVzIG9ubHkgdG8gdXNlIGEgc3Vic2V0IG9mIHRo b3NlLiBBbHRlcm5hdGl2ZWx5LCB0aGUNCiAgdW51c2VkIHR5cGUgd2FybmluZyBzaWxlbmNpbmcg d2FzIGFkZGVkIHRvIGFsbG93IGRlZmluaW5nIGFuIGFsaWFzDQogIHR5cGUgb25seSB0byBiZSBj b25zdW1lZCBieSBhIGRlcml2ZXIsIGUuZy46DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdHlw ZSBlcnJvciA9IFtgTm90X2ZvdW5kIHwgYEludmFsaWRfYXJnXSBbQEBkZXJpdmluZyB0b19zdHJp bmddDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFdlIHNpbmNlIHRoZW4gYmVsaWV2ZSB0aGF0IHdl IHNob3VsZCBub3QgZGlzYWJsZSB3YXJuaW5ncyBsaWdodGx5LCBhcw0KICB0aGlzIGJlaGF2aW91 ciBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gZmluZCBhbmQgcmVtb3ZlIGRlYWQgY29kZS4gVGhlDQog IHJpZ2h0IGFwcHJvYWNoIGluIHRob3NlIHNpdHVhdGlvbnMgc2hvdWxkIGJlIHRvIGZpeCB0aGUg UFBYIGRlcml2ZXJzDQogIHNvIHRoYXQgdGhleSBhcmUgbW9yZSBjb25maWd1cmFibGUgYW5kIGNh biBiZSB1c2VkIHdpdGhvdXQgdHJpZ2dlcmluZw0KICBzdWNoIHdhcm5pbmdzLg0KDQogIFdlIHdp bGwgc3RhcnQgdG8gbW92ZSB0b3dhcmQgcmVtb3ZpbmcgdGhpcyBmZWF0dXJlLCBidXQgc2luY2Ug aXQgaXMNCiAgc3RpbGwgdXNlZnVsIGluIHNvbWUgcGxhY2VzLCB3ZSBoYWQgdG8gY29tZSB1cCB3 aXRoIGEgcGxhbiB0byBhbGxvdw0KICB0cmFuc2l0aW9uaW5nIG91dCBvZiBpdC4NCg0KICBJbiBg cHB4bGliLjAuMzEuMCcgd2UgYWRkZWQgdGhlIGAtdW51c2VkLWNvZGUtd2FybmluZ3MnIGRyaXZl ciBmbGFnDQogIGFuZCB0aGUgYD91bnVzZWRfY29kZV93YXJuaW5ncycncyBgRGVyaXZpbmcuVjIu bWFrZScgb3B0aW9uYWwgYXJndW1lbnQNCiAgdG8gY29udHJvbCB3aGV0aGVyIHRvIHNpbGVuY2Ug V2FybmluZ3MgMzIgYW5kIDYwLiBXaGVuIGJvdGggYXJlIHNldCB0bw0KICBgdHJ1ZScsIGJ5IHRo ZSB1c2VyIGFuZCB0aGUgZGVyaXZlciBhdXRob3JzLCB0aGUgd2FybmluZ3MgYXJlIG5vdA0KICBz aWxlbmNlZC4NCg0KICBBcyBvZiBgcHB4bGliLjAuMzMuMCcsIHRoZXNlIGFsc28gY29udHJvbCB0 aGUgc2lsZW5jaW5nIG9mIFdhcm5pbmcgMzQNCiAgKHVudXNlZCB0eXBlKS4gYGZvcmNlJyBjYW4g bm93IGJlIHBhc3NlZCB0byB0aGUNCiAgYC11bnVzZWQtY29kZS13YXJuaW5ncycgZmxhZyBpbiBv cmRlciB0byBkaXNhYmxlIHdhcm5pbmdzIHNpbGVuY2luZywNCiAgcmVnYXJkbGVzcyBvZiB0aGUg ZGVyaXZlcnMgb3B0aW5nIGluLg0KDQogIFRoaXMgYWxsb3dzIHVzZXJzIHRvIHRlc3Qgd2hldGhl ciB0aGVpciBjb2RlYmFzZSBhbmQgdGhlaXIgc2V0IG9mDQogIGRlcml2ZXJzIHJlbHkgb24gd2Fy bmluZyBzaWxlbmNpbmcgb3Igbm90IGFuZCB0byB1c2UgdGhvc2UgcmVzdWx0cyB0bw0KICBlbGlt aW5hdGUgZGVhZCBjb2RlIGFuZC9vciByZXBvcnQgaXNzdWVzIHVwc3RyZWFtIHRvIHRoZSBkZXJp dmVycyB0aGV5DQogIHVzZS4NCg0KICBXZSBhbHNvIGFkZGVkIGEgc2VwYXJhdGUgYC11bnVzZWQt dHlwZS13YXJuaW5ncycgZmxhZyB0aGF0IHdvcmtzDQogIHNpbWlsYXJseSB0byBgLXVudXNlZC1j b2RlLXdhcm5pbmdzJyAoaS5lLiwgZGVwZW5kcyBvbiB0aGUgdmFsdWUgb2YNCiAgdGhlIGA/dW51 c2VkX2NvZGVfd2FybmluZ3MnIGFyZ3VtZW50KSwgYnV0IGl0IG9ubHkgY29udHJvbHMgV2Fybmlu ZyAzNA0KICBzaWxlbmNpbmcsIGFzIGl0IHR1cm5zIG91dCBpdCBpcyBsZXNzIGxpa2VseSB0byBj YXVzZSB1bndhbnRlZA0KICB3YXJuaW5ncyB0aGFuIHdpdGggdGhlIG90aGVyIHR3by4gVGhpcyB3 aWxsIGFsbG93IHVzZXJzIHRvIGRpc2FibGUgaXQNCiAgbW9yZSBlYXNpbHksIHdpdGhvdXQgaGF2 aW5nIHRvIGRlYWwgd2l0aCBXYXJuaW5ncyAzMiBhbmQgNjAgc3RyYWlnaHQNCiAgYXdheS4NCg0K ICBXZSB3YW50IHRvIGVuY291cmFnZSB1c2VycyB0byB0cnkgdGhvc2Ugb24gdGhlaXIgY29kZWJh c2UgaW4gb3JkZXIgdG8NCiAgc2VlIHRoZSBpbXBhY3QgaXQgaGFzLiBEaWQgeW91IGhhdmUgZGVh ZCBjb2RlIGx5aW5nIGFyb3VuZCB0aGF0DQogIHNsaXBwZWQgcGFzdCB1bmRldGVjdGVkPyBEb2Vz IHRoaXMgdHJpZ2dlciB1bndhbnRlZCB3YXJuaW5ncyBiZWNhdXNlDQogIG9mIGRlcml2ZXIncyBn ZW5lcmF0ZWQgY29kZT8NCg0KICBUaGUgcGxhbiBpcyB0byBnaXZlIHRoZSBlY29zeXN0ZW0gc29t ZSB0aW1lIHRvIHRyeSB0aG9zZSBmZWF0dXJlcyBhbmQNCiAgYWRhcHQgYnkgZml4aW5nIGluZGl2 aWR1YWwgZGVyaXZlcnMgYW5kIGZsaXBwaW5nDQogIGA/dW51c2VkX2NvZGVfd2FybmluZ3MnIHRv IHRydWUgYXMgdGhleSBkby4gQWZ0ZXIgYSB3aGlsZSwgd2Ugd2lsbA0KICBzd2FwIHRoZSBkZWZh dWx0IHZhbHVlIG9mIHRoZSBkcml2ZXIgZmxhZyB0byBgdHJ1ZScgc28gdGhhdCBvbmx5DQogIGRl cml2ZXJzIHRoYXQgaGF2ZW4ndCBvcHRlZCBpbiB3aWxsIGVuYWJsZSB3YXJuaW5nIHNpbGVuY2lu Zy4gVGhlbiBhcw0KICB0aW1lIGdvZXMgd2Ugd2lsbCBzd2FwIHRoZSBkZWZhdWx0IG9mIHRoZSBg RGVyaXZpbmcubWFrZScgYXJndW1lbnQgc28NCiAgdGhhdCBkZXJpdmVycyB3aWxsIGluc3RlYWQg aGF2ZSB0byBleHBsaWNpdGx5IG9wdCBvdXQgdG8gZ2V0IHRoZQ0KICB3YXJuaW5nIHNpbGVuY2lu Zy4gRmluYWxseSwgb25jZSB3ZSBhcmUgY29uZmlkZW50IHRoZSBlY29zeXN0ZW0gaXMgaW4NCiAg YSBnb29kIGVub3VnaCBzdGF0ZSwgd2Ugd2lsbCByZW1vdmUgdGhpcyBmZWF0dXJlIGFsdG9nZXRo ZXIuDQoNCg0KT3RoZXIgZmVhdHVyZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIGBwcHhsaWIuMC4zMy4wJyBhbHNvIGNvbWVzIHdpdGggYSBjb3VwbGUg b2YgbmV3IGZlYXR1cmVzIGZvciBQUFgNCiAgYXV0aG9yczoNCiAg4oCiIEEgY291cGxlIG5ldyBg QXN0X2J1aWxkZXInIGZ1bmN0aW9uczogYGVsaXN0X3RhaWwnIGFuZCBgcGxpc3RfdGFpbCcNCiAg ICB0aGF0IGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGxpc3QgZXhwcmVzc2lvbnMgYW5kIHBhdHRlcm5z IHdpdGggYQ0KICAgIGN1c3RvbSB0YWlsOiBgZWxpc3RfdGFpbCBbZXhwcjE7IGV4cHIyXSB0YWls X2V4cHInIHJldHVybnMgdGhlDQogICAgZXhwcmVzc2lvbiBmb3IgYGV4cHIxOjpleHByMjo6dGFp bF9leHByJy4NCiAg4oCiIGBDb250ZXh0X2ZyZWUuc3BlY2lhbF9mdW5jdGlvbicnLCBhIG5ldyB2 ZXJzaW9uIG9mDQogICAgYHNwZWNpYWxfZnVuY3Rpb24nIHRoYXQgYWxsb3dzIHBhc3NpbmcgYSBg TG9uZ2lkZW50LnQnIGRpcmVjdGx5DQogICAgcmF0aGVyIHRoYXQgcmVseWluZyBvbiBwYXJzaW5n IHRoZSBzdHJpbmcgYXJndW1lbnQgdG8gYQ0KICAgIGBMb25naWRlbnQudCcuDQoNCiAgRmluYWxs eSwgdGhlIHJlbGVhc2UgaW5jbHVkZXMgYSBmZXcgYnVnIGZpeGVzIHRvIGBMb25naWRlbnQucGFy c2UnIGFuZA0KICBgQ29kZV9wYXRoLm1haW5fbW9kdWxlX25hbWUnIGFuZCBmaXhlcyB0aGUgYGxv Y2F0aW9uLWNoZWNrJyBmbGFnIHNvIGl0DQogIGlzIG5vdCByZXF1aXJlZCB0byBhbHNvIHBhc3Mg YC1jaGVjaycgdG8gZW5hYmxlIGxvY2F0aW9uIGNoZWNrcy4gSXQNCiAgYWxzbyBmaXhlcyB0aGUg NS4yIG1pZ3JhdGlvbnMgbG9jYXRpb25zLCBhcyB3ZSB1c2VkIHRvIGJ1aWxkIG5vZGVzDQogIHdp dGggaW5jb25zaXN0ZW50IGxvY2F0aW9ucyB3aGVuIG1pZ3JhdGluZyBgUGV4cF9mdW5jdGlvbicg bm9kZXMuDQoNCg0KSHVnZSB0aGFua3MgdG8gb3VyIGV4dGVybmFsIGNvbnRyaWJ1dG9ycw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgV2Ugd291bGQgbGlrZSB0byB0aGFuayBvdXIgZXh0ZXJuYWwgY29udHJpYnV0b3Jz IHdobyBoYXZlIGJlZW4gYSBodWdlDQogIHBhcnQgb2YgdGhpcyByZWxlYXNlOiBAb2N0YWNocm9u LCBAdmctYiwgYW5kIEBqY2hhdmFycmksIGFuZCBhIHNwZWNpYWwNCiAgbWVudGlvbiB0byBAbWJh cmJpbiwgd2hvIGhhcyBub3Qgb25seSBjb250cmlidXRlZCBhIGxvdCB0byB0aGUgd2FybmluZw0K ICBzaWxlbmNpbmcgZmVhdHVyZXMgYnV0IGhhcyBiZWVuIGV4dGVuc2l2ZWx5IHRlc3RpbmcgYW5k IHByb3ZpZGluZyB2ZXJ5DQogIHVzZWZ1bCBmZWVkYmFjayBvbiB0aGVtLg0KDQogIEFuZCBvZiBj b3Vyc2UsIGFzIHVzdWFsLCB3ZSdkIGxpa2UgdG8gdGhhbmsgdGhlIE9DYW1sIFNvZnR3YXJlDQog IEZvdW5kYXRpb24gd2hvIGhhcyBiZWVuIGZ1bmRpbmcgbXkgd29yayBvbiBQcHhsaWIgYW5kIG9u IHRoaXMgcmVsZWFzZSwNCiAgbWFraW5nIGFsbCBvZiB0aGlzIHBvc3NpYmxlIQ0KDQoNCk9DYW1s LUxTUCAxLjE5LjAgZm9yIE9DYW1sIDUuMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2Nh bWwtbHNwLTEtMTktMC1mb3Itb2NhbWwtNS0yLzE1MDcxLzE+DQoNCg0KdmRzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBoYXBweSB0 byBhbm5vdW5jZSwgb24gYmVoYWxmIG9mIHRoZSBvY2FtbC1sc3AgdGVhbSwgdGhlIHJlbGVhc2UN CiAgb2YgYG9jYW1sLWxzcC1zZXJ2ZXInIGAxLjE5LjAnIGFuZCBhc3NvY2lhdGVkIGxpYnJhcmll cy4gVGhpcyByZWxlYXNlDQogIHByaW1hcnkgZ29hbCBpcyB0byBicmluZyBvZmZpY2lhbCBzdXBw b3J0IGZvciBPQ2FtbCA1LjIg8J+Qqy4NCg0KDQpGZWF0dXJlcw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAg4oCiIEFkZCBjdXN0b20NCiAgICBbfm9jYW1sbHNwL2dldERvY3VtZW50YXRp b25+XSgvb2NhbWwtbHNwLXNlcnZlci9kb2NzL29jYW1sbHNwL2dldERvY3VtZW50YXRpb24tc3Bl Yy5tZCkNCiAgICByZXF1ZXN0IChvY2FtbC9vY2FtbC1sc3AjMTMzNikNCiAg4oCiIEFkZCBzdXBw b3J0IGZvciBPQ2FtbCA1LjIgKG9jYW1sL29jYW1sLWxzcCMxMjMzKQ0KDQoNCkZpeGVzDQrilYzi lYzilYzilYzilYwNCg0KICDigKIgS2lsbCB1bm5lY2Vzc2FyeSBvY2FtbGZvcm1hdCBwcm9jZXNz ZXMgd2l0aCBzaWd0ZXJtIHJhdGhlciB0aGFuDQogICAgc2lnaW50IG9yIHNpZ2tpbGwgKG9jYW1s L29jYW1sLWxzcCMxMzQzKQ0KDQoNCk1sRnJvbnQgLSBBIHBhY2thZ2luZyBzeXN0ZW0gZm9yIE9D YW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1t bGZyb250LWEtcGFja2FnaW5nLXN5c3RlbS1mb3Itb2NhbWwvMTUwNzIvMT4NCg0KDQpqYmVja2Zv cmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSB0aGUgaW50cm9kdWN0b3J5IHBhcmFncmFwaHMg ZnJvbSBpdHMgb3ZlcnZpZXc6DQoNCiAgICAgICAgYE1sRnJvbnQnIGFkZHMgYSBKYXZhLWxpa2Ug cGFja2FnaW5nIHN5c3RlbSB0byBPQ2FtbC4gVGhlDQogICAgICAgIGBNbEZyb250JyBuYW1lIGlz IGEgaG9tYWdlIHRvIGBjZnJvbnQnIHdoaWNoIHdhcyB0b29saW5nDQogICAgICAgIHRoYXQgdHJh bnNsYXRlZCAiQyB3aXRoIENsYXNzZXMiIChub3cga25vd24gYXMgQysrKSBpbnRvIEMNCiAgICAg ICAgY29kZS4gU2ltaWxhcmx5LCBgTWxGcm9udCctYmFzZWQgdG9vbHMgY2FuIHRyYW5zbGF0ZSBP Q2FtbA0KICAgICAgICB3aXRoIHBhY2thZ2VzIGludG8gY29udmVudGlvbmFsIE9DYW1sLiAg4oCm ICBBdCBpdHMgbW9zdA0KICAgICAgICBiYXNpYyBjb3JlLCBgTWxGcm9udCcgZ2l2ZXMgYSB3ZWxs LWRlZmluZWQsIGNvbnNpc3RlbnQNCiAgICAgICAgbWVhbmluZyB0byBhIG1vZHVsZSByZWZlcmVu Y2UgbGlrZQ0KICAgICAgICBgQWNtZVdpZGdldHNfU3RkLkFjdGl2aXRpZXMuTWFudWZhY3R1cmlu ZycgYWNyb3NzIHRoZQ0KICAgICAgICBkb21haW5zIG9mOg0KDQogICAgICAgIDEuIE9DYW1sIHNv dXJjZSBjb2RlLg0KICAgICAgICAyLiBmaW5kbGliIGxpYnJhcmllcy4NCiAgICAgICAgMy4gb3Bh bSBwYWNrYWdlcy4NCg0KICBgTWxGcm9udCcgaXMgQXBhY2hlIDIuMCBsaWNlbnNlZCBhbmQgaXMg bWVhbnQgdG8gYmUgdXNlZCBieSBidWlsZA0KICBzeXN0ZW1zIChEdW5lLCBvY2FtbGJ1aWxkLCBE a0NvZGVyKSBhbmQgcGFja2FnZSBtYW5hZ2VycyAob3BhbSkuIE9uZQ0KICBvZiBpdHMgY3JpdGlj YWwgZGVwZW5kZW5jaWVzIGlzIFtjb2RlcHRdLg0KDQogIFlvdSBjYW4gcmVhZCBtb3JlIGFib3V0 IGBNbEZyb250JyBpbiB0aGUgZm9sbG93aW5nIHBvc3RzICh3aXRoIG1vcmUNCiAgY29taW5nKToN Cg0KICDigKIgW2h0dHBzOi8vZGlza3V2LmNvbS9tbGZyb250L292ZXJ2aWV3LTEvXQ0KICDigKIg W2h0dHBzOi8vZGlza3V2LmNvbS9tbGZyb250L292ZXJ2aWV3LTIvXQ0KDQogIC9Dcm9zcy1wb3N0 IG5vdGljZTogVGhlIGZpcnN0IGFydGljbGUgd2FzIHBvc3RlZCBhdA0KICBbaHR0cHM6Ly9sb2Jz dGUucnMvcy83Z2hzbG8vb3ZlcnZpZXdfb2NhbWxmcm9udF07IG5vIGNvbW1lbnRzDQogICg6KCku IEJ1dCBJIHN0aWxsIGxpa2UgdG8gZ2V0IGZpcnN0LWhhbmQgZmVlZGJhY2sgb24gd2hhdCB3b3Jr cyB3ZWxsDQogIGluIG90aGVyIGxhbmd1YWdlcywgc28gcGxlYXNlIGNoaW1lIGluIGV2ZW4gaWYg eW91IGRvbid0IGZlZWwgdGhhdA0KICBPQ2FtbCBpcyB5b3VyIHN0cm9uZyBzdWl0Li8NCg0KDQpb Y29kZXB0XSA8aHR0cHM6Ly9naXRodWIuY29tL09jdGFjaHJvbi9jb2RlcHQ+DQoNCltodHRwczov L2Rpc2t1di5jb20vbWxmcm9udC9vdmVydmlldy0xL10NCjxodHRwczovL2Rpc2t1di5jb20vbWxm cm9udC9vdmVydmlldy0xLz4NCg0KW2h0dHBzOi8vZGlza3V2LmNvbS9tbGZyb250L292ZXJ2aWV3 LTIvXQ0KPGh0dHBzOi8vZGlza3V2LmNvbS9tbGZyb250L292ZXJ2aWV3LTIvPg0KDQpbaHR0cHM6 Ly9sb2JzdGUucnMvcy83Z2hzbG8vb3ZlcnZpZXdfb2NhbWxmcm9udF0NCjxodHRwczovL2xvYnN0 ZS5ycy9zLzdnaHNsby9vdmVydmlld19vY2FtbGZyb250Pg0KDQoNCk9DYW1sLm9yZyBOZXdzbGV0 dGVyOiBKdWx5IDIwMjQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3JnLW5ld3Ns ZXR0ZXItanVseS0yMDI0LzE1MDg3LzE+DQoNCg0KU2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2VsY29tZSB0byB0aGUgSnVseSAyMDI0IGVkaXRpb24g b2YgdGhlIE9DYW1sLm9yZyBuZXdzbGV0dGVyISBUaGlzDQogIHVwZGF0ZSBoYXMgYmVlbiBjb21w aWxlZCBieSB0aGUgT0NhbWwub3JnIG1haW50YWluZXJzLiBZb3UgY2FuIGZpbmQNCiAgW3ByZXZp b3VzIHVwZGF0ZXNdIG9uIERpc2N1c3MuDQoNCiAgT3VyIGdvYWwgaXMgdG8gbWFrZSBPQ2FtbC5v cmcgdGhlIGJlc3QgcmVzb3VyY2UgZm9yIGFueW9uZSB3aG8gd2FudHMNCiAgdG8gZ2V0IHN0YXJ0 ZWQgYW5kIGJlIHByb2R1Y3RpdmUgaW4gT0NhbWwuIFRoZSBPQ2FtbC5vcmcgbmV3c2xldHRlcg0K ICBwcm92aWRlcyBhbiB1cGRhdGUgb24gb3VyIHByb2dyZXNzIHRvd2FyZHMgdGhhdCBnb2FsIGFu ZCBhbiBvdmVydmlldw0KICBvZiB0aGUgY2hhbmdlcyB3ZSBhcmUgd29ya2luZyBvbi4NCg0KICBX ZSBjb3VsZG4ndCBkbyBpdCB3aXRob3V0IGFsbCB0aGUgYW1hemluZyBwZW9wbGUgd2hvIGhlbHAg dXMgcmV2aWV3LA0KICByZXZpc2UsIGFuZCBjcmVhdGUgYmV0dGVyIE9DYW1sIGRvY3VtZW50YXRp b24gYW5kIHdvcmsgb24gaXNzdWVzLiBZb3VyDQogIHBhcnRpY2lwYXRpb24gZW5hYmxlcyB1cyB0 byBzbyBtdWNoIG1vcmUgdGhhbiB3ZSBjb3VsZCBqdXN0IGJ5DQogIG91cnNlbHZlcy4gVGhhbmsg eW91IQ0KDQogIFRoaXMgbmV3c2xldHRlciBjb3ZlcnM6DQogIOKAoiAqQ29tbXVuaXR5LURyaXZl biBEZXZlbG9wbWVudCBvZiBPQ2FtbC5vcmcqDQogIOKAoiAqUmVjaXBlcyBmb3IgdGhlIE9DYW1s IENvb2tib29rOiogSGVscCB1cyBtYWtlIHRoZSBPQ2FtbCBDb29rYm9vaw0KICAgICByZWFsbHkg dXNlZnVsIGJ5IGNvbnRyaWJ1dGluZyBhbmQgcmV2aWV3aW5nIHJlY2lwZXMgZm9yIGNvbW1vbg0K ICAgICB0YXNrcyENCiAg4oCiICpDb21tdW5pdHkgJiBNYXJrZXRpbmcgUGFnZXMgUmV3b3JrOiog SW1wbGVtZW50YXRpb24gd29yayBpbg0KICAgICBwcm9ncmVzcy4NCiAg4oCiICpHZW5lcmFsIElt cHJvdmVtZW50czoqIEFzIHVzdWFsLCB3ZSBhbHNvIHdvcmtlZCBvbiBnZW5lcmFsDQogICAgIG1h aW50ZW5hbmNlIGFuZCBpbXByb3ZlbWVudHMsIHNvIHdlJ3JlIGhpZ2hsaWdodGluZyBzb21lIG9m IHRoZQ0KICAgICB3b3JrIHRoYXQgaGFwcGVuZWQgYmVsb3cuDQoNCg0KW3ByZXZpb3VzIHVwZGF0 ZXNdIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3RhZy9vY2FtbG9yZy1uZXdzbGV0dGVyPg0K DQpDb21tdW5pdHktRHJpdmVuIERldmVsb3BtZW50IG9mIE9DYW1sLm9yZw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgQWZ0ZXIgcmV3b3JraW5nIG1vc3Qgb2YgdGhlIE9DYW1sLm9yZyB3ZWJzaXRlIHRvIGJlIG1v cmUgdXNlZnVsLCBtb3JlDQogIHVzYWJsZSwgYW5kIG5pY2VyIHRvIGxvb2sgYXQsIHRoZSB0ZWFt IGF0IFRhcmlkZXMgdGhhdCBoYXMgYmVlbg0KICB3b3JraW5nIG9uIE9DYW1sLm9yZyBpcyBkaXNi YW5kaW5nLiBIb3dldmVyLCBPQ2FtbC5vcmcgd2lsbCBjb250aW51ZQ0KICB0byBiZSBtYWludGFp bmVkIGFuZCBleHRlbmRlZCBieSBieSB0aGUgT0NhbWwgUGxhdGZvcm0gYW5kIE9DYW1sDQogIGNv bXBpbGVyIGNvbnRyaWJ1dG9ycywgYXMgd2VsbCBhcyBieSB0aGUgd2lkZXIgT0NhbWwgY29tbXVu aXR5Lg0KDQogIFlvdSBjYW4gcmVhY2ggb3V0IHRvIFt0aGUgT0NhbWwub3JnIG1haW50YWluZXJz XSB0byBkaXNjdXNzIGFueSBiaWdnZXINCiAgY2hhbmdlcyBvciBhZGRpdGlvbnMgeW91J2QgbGlr ZSB0byBtYWtlLiBDb250cmlidXRpb25zIHRvIGltcHJvdmUNCiAgZXhpc3RpbmcgZmVhdHVyZXMg YW5kIGJ1ZyBmaXhlcyBhcmUgYWx3YXlzIHdlbGNvbWUhDQoNCg0KW3RoZSBPQ2FtbC5vcmcgbWFp bnRhaW5lcnNdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZz90YWI9cmVhZG1l LW92LWZpbGUjbWFpbnRhaW5lcnM+DQoNCuKXiiBPcGVuIElzc3VlcyBmb3IgQ29udHJpYnV0b3Jz DQoNCiAgWW91IGNhbiBmaW5kIFtvcGVuIGlzc3VlcyBmb3IgY29udHJpYnV0b3JzIGhlcmVdIQ0K DQoNCiAgW29wZW4gaXNzdWVzIGZvciBjb250cmlidXRvcnMgaGVyZV0NCiAgPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvaXNzdWVzP3E9aXMlM0Fpc3N1ZStpcyUzQW9wZW4rbGFi ZWwlM0ElMjJoZWxwK3dhbnRlZCUyMitubyUzQWFzc2lnbmVlPg0KDQoNClJlY2lwZXMgZm9yIHRo ZSBPQ2FtbCBDb29rYm9vaw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VGhlIE9DYW1sIENvb2tib29rIGlzIGEgcGxhY2Ugd2hlcmUgT0NhbWwgZGV2ZWxvcGVycyBzaGFy ZSBob3cgdG8NCiAgc29sdmUgY29tbW9uIHRhc2tzIHVzaW5nIHBhY2thZ2VzIGZyb20gdGhlIGVj b3N5c3RlbS4NCg0KICBBIHJlY2lwZSBpcyBhIGNvZGUgc2FtcGxlIGFuZCBleHBsYW5hdGlvbnMg b24gaG93IHRvIHBlcmZvcm0gYSB0YXNrDQogIHVzaW5nIGEgY29tYmluYXRpb24gb2Ygb3Blbi1z b3VyY2UgbGlicmFyaWVzLg0KDQogIFRoZSBDb29rYm9vayBpcyBsaXZlIGF0IFtvY2FtbC5vcmcv Y29va2Jvb2tdLg0KDQogIEhlcmUncyBob3cgeW91IGNhbiBoZWxwOg0KDQogIDEuIEhlbHAgcmV2 aWV3IHRoZSBbb3BlbiBwdWxsIHJlcXVlc3RzIGZvciBjb29rYm9vayByZWNpcGVzXSENCiAgMi4g Q29udHJpYnV0ZSBuZXcgcmVjaXBlcyBhbmQgdGFza3MgZm9yIHRoZSBjb29rYm9vayENCg0KICBU aGFuayB5b3UgYWxsIGZvciB0aGUgbWFueSBjb250cmlidXRpb25zISBPbmUgYXJlYSB3aGVyZSB3 ZSBjb3VsZCB1c2UNCiAgaGVscCBpcyBpbiByZXZpZXdpbmcgYW5kIGltcHJvdmluZyB0aGUgc3Vn Z2VzdGVkIHJlY2lwZXMgYW5kIHRhc2tzLg0KDQogICpSZWxldmFudCBQUnMgYW5kIEFjdGl2aXRp ZXM6Kg0KICDigKIgKG9wZW4pIFBSOiBjb29rYm9vayByZWNpcGVzIGZvciBwYXJzZS1jb21tYW5k LWxpbmUtYXJndW1lbnRzDQogICAgW29jYW1sL29jYW1sLm9yZyMyNTczXSBieSBbQHJpY2hhcmRo dXh0b25dDQogIOKAoiAob3BlbikgUFI6IENvb2tib29rIENoZWNrIGEgV2VicGFnZSBmb3IgQnJv a2VuIExpbmtzDQogICAgW29jYW1sL29jYW1sLm9yZyMyNTgxXSBieSBbQGdnc21pdGg4NDJdDQog IOKAoiAob3BlbikgUFI6IGNvb2tib29rOiAiY3JlYXRlIGFuZCBhd2FpdCBwcm9taXNlcyI6IEx3 dCwgQXN5bmMNCiAgICBbb2NhbWwvb2NhbWwub3JnIzI1ODRdIGJ5IFtAcmljaGFyZGh1eHRvbl0N CiAg4oCiIChvcGVuKSBQUjogQ29va0Jvb2s6IHJlYWQtY3N2IC0gYmFzaWMgZXhhbXBsZSBvZiBy ZWFkaW5nIHJlY29yZHMNCiAgICBmcm9tIGEgQ1NWIHN0cmluZyBbb2NhbWwvb2NhbWwub3JnIzI1 ODldIGJ5IFtAZGFuaWVsY2xhcmtlXQ0KICDigKIgKG9wZW4pIFBSOiBDb29rYm9vazogRW1haWwg cmVnZXggcGF0Y2ggW29jYW1sL29jYW1sLm9yZyMyNTkxXSBieQ0KICAgIFtARi1Mb3llcl0NCiAg 4oCiIEZpeGVzIGFuZCBJbXByb3ZlbWVudHMgdG8gZXhpc3RpbmcgcmVjaXBlczoNCiAgICDigKIg UFI6IFVwZGF0ZSAwMC11cmkubWw6IG1pc3NpbmcgYXJnIFtvY2FtbC9vY2FtbC5vcmcjMjYxOF0g YnkNCiAgICAgIFtAdHRhbXR0YW1dDQoNCg0KW29jYW1sLm9yZy9jb29rYm9va10gPGh0dHBzOi8v b2NhbWwub3JnL2Nvb2tib29rPg0KDQpbb3BlbiBwdWxsIHJlcXVlc3RzIGZvciBjb29rYm9vayBy ZWNpcGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbHM/cT1pcyUz QXByK2lzJTNBb3BlbitsYWJlbCUzQUNvb2tib29rPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NzNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU3Mz4NCg0KW0ByaWNo YXJkaHV4dG9uXSA8aHR0cHM6Ly9naXRodWIuY29tL3JpY2hhcmRodXh0b24+DQoNCltvY2FtbC9v Y2FtbC5vcmcjMjU4MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8y NTgxPg0KDQpbQGdnc21pdGg4NDJdIDxodHRwczovL2dpdGh1Yi5jb20vZ2dzbWl0aDg0Mj4NCg0K W29jYW1sL29jYW1sLm9yZyMyNTg0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9y Zy9wdWxsLzI1ODQ+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU4OV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTg5Pg0KDQpbQGRhbmllbGNsYXJrZV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9kYW5pZWxjbGFya2U+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU5MV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTkxPg0KDQpbQEYtTG95ZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vRi1Mb3llcj4NCg0KW29jYW1sL29jYW1sLm9yZyMyNjE4XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI2MTg+DQoNCltAdHRhbXR0YW1d IDxodHRwczovL2dpdGh1Yi5jb20vdHRhbXR0YW0+DQoNCg0KQ29tbXVuaXR5ICYgTWFya2V0aW5n IFBhZ2VzIFJld29yaw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgV2UgaGF2ZSBbVUkgZGVzaWducyBmb3IgdGhlIHJld29ya2VkIGFuZCBuZXcgcGFn ZXMgb2YgdGhlIGNvbW11bml0eQ0KICBzZWN0aW9uXSwgYW5kIGltcGxlbWVudGF0aW9uIGlzIGJl aW5nIHdvcmtlZCBvbiBieSBbQG95ZW51Z2ExN10sIG91cg0KICBmb3JtZXIgT3V0cmVhY2h5IGlu dGVybiENCg0KICAqUmVsZXZhbnQgUFJzIGFuZCBBY3Rpdml0aWVzOioNCiAg4oCiIFBSOiBJbXBs ZW1lbnQgbmV3IGNvbW11bml0eSBvdmVydmlldyBwYWdlIFtvY2FtbC9vY2FtbC5vcmcjMjYwNV0g YnkNCiAgICBbQG95ZW51Z2ExN10NCiAg4oCiIFBSOiBGaXggdHlwbyBhbmQgY2FzZSBpbmNvbnNp c3RlbmNpZXMgb24gY29tbXVuaXR5IHBhZ2UNCiAgICBbb2NhbWwvb2NhbWwub3JnIzI2MTZdIGJ5 IFtAcGpsYXN0XQ0KICDigKIgUFI6IFJlZGVzaWduIE9DYW1sIFBsYW5ldCBQYWdlIFtvY2FtbC9v Y2FtbC5vcmcjMjYxN10gYnkNCiAgICBbQG95ZW51Z2ExN10NCg0KDQpbVUkgZGVzaWducyBmb3Ig dGhlIHJld29ya2VkIGFuZCBuZXcgcGFnZXMgb2YgdGhlIGNvbW11bml0eSBzZWN0aW9uXQ0KPGh0 dHBzOi8vd3d3LmZpZ21hLmNvbS9maWxlLzdobW9Xa1FQOVBnTFRmWkNxaVpNV2EvT0NhbWwtQ29t bXVuaXR5LVBhZ2VzP3R5cGU9ZGVzaWduJm5vZGUtaWQ9NjM3JTNBNDUzOSZtb2RlPWRlc2lnbiZ0 PVJwUWxHdk9wZWcxYTkzQVotMT4NCg0KW0BveWVudWdhMTddIDxodHRwczovL2dpdGh1Yi5jb20v b3llbnVnYTE3Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI2MDVdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwub3JnL3B1bGwvMjYwNT4NCg0KW29jYW1sL29jYW1sLm9yZyMyNjE2XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI2MTY+DQoNCltAcGpsYXN0XSA8 aHR0cHM6Ly9naXRodWIuY29tL3BqbGFzdD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNjE3XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI2MTc+DQoNCg0KR2VuZXJhbCBJ bXByb3ZlbWVudHMgYW5kIERhdGEgQWRkaXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICAqU3VtbWFyeToqDQogIOKA oiBUaGUgc2VsZWN0ZWQgT1MgaXMgbm93IHBhcnQgb2YgdGhlIGFuY2hvciB0YWcgb2YgdGhlIFVS TCBvbiB0aGUNCiAgICA8aHR0cHM6Ly9vY2FtbC5vcmcvaW5zdGFsbD4gcGFnZS4gVGhpcyBhbGxv d3MgcGVvcGxlIHRvIGxpbmsgdG8NCiAgICBxdWljayBpbnN0YWxsIGluc3RydWN0aW9ucyBmb3Ig YSBzcGVjaWZpYyBPUy4NCiAg4oCiIFdlIGFwcHJlY2lhdGUgdGhlIGNvbnRyaWJ1dGlvbnMgdG8g dGhlIE9DYW1sIGRvY3VtZW50YXRpb24hDQogIOKAoiBXZSdyZSBjaGVja2luZyBmb3IgYmFja2xp bmtzIHRvIE9DYW1sLm9yZyBhZ2FpbiB3aXRoIEFocmVmcy4NCg0KICAqUmVsZXZhbnQgUFJzIGFu ZCBBY3Rpdml0aWVzOioNCiAg4oCiIChvcGVuKSBQUjogQnVpbGQgb24gT0NhbWwgNSAob2NhbWxu ZXQgLXNhZmUtc3RyaW5nIHdvcmthcm91bmQpDQogICAgW29jYW1sL29jYW1sLm9yZyMyNjA5XSBi eSBbQGFhbnRyb25dDQogIOKAoiBQUjogQWhyZWYgdGFnIFtvY2FtbC9vY2FtbC5vcmcjMjU3MV0g YnkgW0BjdWlodGxhdWFjXQ0KICDigKIgUFI6IElzc3VlICMyNTgzOiBBZGRlZCBPUyBBbmNob3Ig VGFncyB0byBvY2FtbC5vcmcvaW5zdGFsbA0KICAgIFtvY2FtbC9vY2FtbC5vcmcjMjYwMF0gYnkg W0BTaXN5cGhpYW5MaWdlcl0NCiAg4oCiIFBSOiBQZXJmb3JtYW5jZTogY2FjaGUgc2VhcmNoIGlu ZGV4IGRpZ2VzdCB1bnRpbCBvY2FtbC1kb2NzLWNpDQogICAgY29tcHV0ZXMgaXQgW29jYW1sL29j YW1sLm9yZyMyNjIwXSBieSBbQHNhYmluZV0NCiAg4oCiIERvY3VtZW50YXRpb24NCiAgICDigKIg UFI6IFVud3JhcHBlZCBsaWJyYXJpZXMgW29jYW1sL29jYW1sLm9yZyMyNTYyXSBieSBbQGN1aWh0 bGF1YWNdDQogICAg4oCiIFBSOiBFeHBsYWluIGZvbGRlcnMgYmluLCBsaWIgYW5kIF9idWlsZCBb b2NhbWwvb2NhbWwub3JnIzI1NjhdIGJ5DQogICAgICBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBS OiBVc2UgYGxheW91dCBvcGFtJyBpbiBgLmVudnJjJyBpbiBvcGFtIHBhdGggZG9jDQogICAgICBb b2NhbWwvb2NhbWwub3JnIzI1OTddIGJ5IFtAc21vcmltb3RvXQ0KICAgIOKAoiBQUjogVXNlIHN1 ZG8gaW4gaW5zdGFsbCB0dXRvcmlhbCBbb2NhbWwvb2NhbWwub3JnIzI1NThdIGJ5DQogICAgICBb QGN1aWh0bGF1YWNdDQogICAg4oCiIFBSOiBBZGQgZG9jdW1lbnRhdGlvbiBhYm91dCBjb21tZW50 cyB0byBUb3VyIG9mIE9jYW1sDQogICAgICBbb2NhbWwvb2NhbWwub3JnIzI2MTNdIGJ5IFtATm9h aFRoZUR1a2VdDQogICAg4oCiIFBSOiBGaXggRXhhbXBsZSByZWZlcmVuY2luZyBUeXBlIG5vdCB5 ZXQgRGVmaW5lZA0KICAgICAgW29jYW1sL29jYW1sLm9yZyMyNjA2XSBieSBbQGF2bGVjXQ0KICDi gKIgUmVmYWN0b3IgKyBDb2RlIGhlYWx0aDoNCiAgICDigKIgUFI6IE9wZW4gRGF0YV9pbnRmIGlu IGRhdGEubWxpIFtvY2FtbC9vY2FtbC5vcmcjMjU2M10gYnkNCiAgICAgIFtAY3VpaHRsYXVhY10N CiAgICDigKIgUFI6IE1ha2UgZGF0YSBlcnJvciBmaWxlIHBhdGggY29weS1wYXN0ZSByZWFkeQ0K ICAgICAgW29jYW1sL29jYW1sLm9yZyMyNTY3XSBieSBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBS OiBUZXN0IG9jYW1sL3NldHVwLW9jYW1sIHYzIFtvY2FtbC9vY2FtbC5vcmcjMjU3MF0gYnkNCiAg ICAgIFtAY3VpaHRsYXVhY10NCiAgICDigKIgUFI6IFVwZGF0ZSBvY2FtbC9zZXR1cC1vY2FtbCB0 byB2MyBbb2NhbWwvb2NhbWwub3JnIzI1NjVdIGJ5DQogICAgICBbQHNtb3JpbW90b10NCiAgICDi gKIgUFI6IFJlZmFjdG9yaW5nIHBhcnRzIGZyb20gUFIgIzI0NDMgW29jYW1sL29jYW1sLm9yZyMy NTc2XSBieQ0KICAgICAgW0BjdWlodGxhdWFjXQ0KICAgIOKAoiBQUjogQnVtcCBwZXRlci1ldmFu cy9jcmVhdGUtcHVsbC1yZXF1ZXN0IGZyb20gNSB0byA2DQogICAgICBbb2NhbWwvb2NhbWwub3Jn IzI1ODhdIGJ5IFtAZGVwZW5kYWJvdF0NCiAgICDigKIgUFI6IFNldCBPQ2FtbCB0byA0LjE0LjIg W29jYW1sL29jYW1sLm9yZyMyNTg3XSBieSBbQGN1aWh0bGF1YWNdDQogICAg4oCiIFBSOiBmaXg6 IHdyaXRlIGRpcmVjdG9yeSBpbnN0ZWFkIG9mIGZvbGRlciBbb2NhbWwvb2NhbWwub3JnIzI1NzJd DQogICAgICBieSBbQGFzaGlzaDBrdW1hcl0NCiAgICDigKIgUFI6IHN5bmMgZGVidWctY2kgYW5k IGNpIFtvY2FtbC9vY2FtbC5vcmcjMjU4Ml0gYnkgW0BjdWlodGxhdWFjXQ0KICDigKIgRGF0YQ0K ICAgIOKAoiBQUjogY2hhbmdlbG9nOiBkdW5lIDMuMTYuMCBbb2NhbWwvb2NhbWwub3JnIzI1NjZd IGJ5IFtAZW1pbGxvbl0NCiAgICDigKIgUFI6IChkYXRhKSBhZGQgT0NhbWwub3JnIG5ld3NsZXR0 ZXIgSnVuZSAyMDI0DQogICAgICBbb2NhbWwvb2NhbWwub3JnIzI1NzVdIGJ5IFtAc2FiaW5lXQ0K ICAgIOKAoiBQUjogQWRkIGNoYW5nZWxvZyBmb3IgdGhlIGxhdGVzdCBtZXJsaW4gcmVsZWFzZXMN CiAgICAgIFtvY2FtbC9vY2FtbC5vcmcjMjU4MF0gYnkgW0B2b29kb29zXQ0KICAgIOKAoiBQUjog QWRkIGNoYW5nZWxvZyBmb3IgdGhlIGxhdGVzdCBvY2FtbC1sc3AgcmVsZWFzZQ0KICAgICAgW29j YW1sL29jYW1sLm9yZyMyNTkzXSBieSBbQFBpemllRHVzdF0NCiAgICDigKIgUFI6IEFkZCBtaXNz aW5nIGNoYW5nZWxvZyBmb3Igb3BhbSAyLjIuMCBbb2NhbWwvb2NhbWwub3JnIzI1OThdIGJ5DQog ICAgICBbQGtpdC10eS1rYXRlXQ0KICAgIOKAoiBQUjogQWRkIGNoYW5nZWxvZyBlbnRyeSBmb3Ig cHB4bGliLjAuMzMuMCByZWxlYXNlDQogICAgICBbb2NhbWwvb2NhbWwub3JnIzI2MTVdIGJ5IFtA TmF0aGFuUmViXQ0KDQoNCltvY2FtbC9vY2FtbC5vcmcjMjYwOV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNjA5Pg0KDQpbQGFhbnRyb25dIDxodHRwczovL2dpdGh1 Yi5jb20vYWFudHJvbj4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTcxXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1NzE+DQoNCltAY3VpaHRsYXVhY10gPGh0dHBzOi8v Z2l0aHViLmNvbS9jdWlodGxhdWFjPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI2MDBdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjYwMD4NCg0KW0BTaXN5cGhpYW5MaWdl cl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9TaXN5cGhpYW5MaWdlcj4NCg0KW29jYW1sL29jYW1sLm9y ZyMyNjIwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI2MjA+DQoN CltAc2FiaW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL3NhYmluZT4NCg0KW29jYW1sL29jYW1sLm9y ZyMyNTYyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1NjI+DQoN CltvY2FtbC9vY2FtbC5vcmcjMjU2OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5v cmcvcHVsbC8yNTY4Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1OTddIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU5Nz4NCg0KW0BzbW9yaW1vdG9dIDxodHRwczovL2dp dGh1Yi5jb20vc21vcmltb3RvPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NThdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU1OD4NCg0KW29jYW1sL29jYW1sLm9yZyMy NjEzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI2MTM+DQoNCltA Tm9haFRoZUR1a2VdIDxodHRwczovL2dpdGh1Yi5jb20vTm9haFRoZUR1a2U+DQoNCltvY2FtbC9v Y2FtbC5vcmcjMjYwNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8y NjA2Pg0KDQpbQGF2bGVjXSA8aHR0cHM6Ly9naXRodWIuY29tL2F2bGVjPg0KDQpbb2NhbWwvb2Nh bWwub3JnIzI1NjNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU2 Mz4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTY3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZy9wdWxsLzI1Njc+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU3MF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTcwPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1 NjVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU2NT4NCg0KW29j YW1sL29jYW1sLm9yZyMyNTc2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9w dWxsLzI1NzY+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU4OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC5vcmcvcHVsbC8yNTg4Pg0KDQpbQGRlcGVuZGFib3RdIDxodHRwczovL2dpdGh1 Yi5jb20vZGVwZW5kYWJvdD4NCg0KW29jYW1sL29jYW1sLm9yZyMyNTg3XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzI1ODc+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU3 Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTcyPg0KDQpbQGFz aGlzaDBrdW1hcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hc2hpc2gwa3VtYXI+DQoNCltvY2FtbC9v Y2FtbC5vcmcjMjU4Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8y NTgyPg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1NjZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwub3JnL3B1bGwvMjU2Nj4NCg0KW0BlbWlsbG9uXSA8aHR0cHM6Ly9naXRodWIuY29tL2Vt aWxsb24+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU3NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC5vcmcvcHVsbC8yNTc1Pg0KDQpbb2NhbWwvb2NhbWwub3JnIzI1ODBdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjU4MD4NCg0KW0B2b29kb29zXSA8aHR0 cHM6Ly9naXRodWIuY29tL3Zvb2Rvb3M+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU5M10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTkzPg0KDQpbQFBpemllRHVzdF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9QaXppZUR1c3Q+DQoNCltvY2FtbC9vY2FtbC5vcmcjMjU5OF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC5vcmcvcHVsbC8yNTk4Pg0KDQpbQGtpdC10 eS1rYXRlXSA8aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlPg0KDQpbb2NhbWwvb2NhbWwu b3JnIzI2MTVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMjYxNT4N Cg0KW0BOYXRoYW5SZWJdIDxodHRwczovL2dpdGh1Yi5jb20vTmF0aGFuUmViPg0KDQoNCk90aGVy IE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBh cmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5v cmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtUaGUgc2xpZGVzIHByZXNlbnRlZCBhdCBGcmFtYS1DIERh eXMgMjAyNCBhcmUgYXZhaWxhYmxlXQ0KICDigKIgW01vbm9jdWx0dXJlIG9mIEluc2VjdXJpdHk6 IEhvdyBDcm93ZFN0cmlrZSdzIE91dGFnZSBFeHBvc2VzIHRoZQ0KICAgIFJpc2tzIG9mIFVuY2hl Y2tlZCBDb21wbGV4aXR5IGluIEN5YmVyc2VjdXJpdHldDQogIOKAoiBbVXBjb21pbmcgT0NhbWwg RXZlbnRzIChBdWcgMjAyNCBhbmQgb253YXJkcyldDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10g PGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbVGhlIHNsaWRlcyBwcmVzZW50ZWQgYXQgRnJh bWEtQyBEYXlzIDIwMjQgYXJlIGF2YWlsYWJsZV0NCjxodHRwczovL2ZyYW1hLWMuY29tL2h0bWwv cHVibGljYXRpb25zL2ZyYW1hLWMtZGF5cy0yMDI0L2luZGV4Lmh0bWw+DQoNCltNb25vY3VsdHVy ZSBvZiBJbnNlY3VyaXR5OiBIb3cgQ3Jvd2RTdHJpa2UncyBPdXRhZ2UgRXhwb3NlcyB0aGUgUmlz a3MNCm9mIFVuY2hlY2tlZCBDb21wbGV4aXR5IGluIEN5YmVyc2VjdXJpdHldDQo8aHR0cHM6Ly90 YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDgtMDEtbW9ub2N1bHR1cmUtb2YtaW5zZWN1cml0eS1ob3ct Y3Jvd2RzdHJpa2Utcy1vdXRhZ2UtZXhwb3Nlcy10aGUtcmlza3Mtb2YtdW5jaGVja2VkLWNvbXBs ZXhpdHktaW4tY3liZXJzZWN1cml0eT4NCg0KW1VwY29taW5nIE9DYW1sIEV2ZW50cyAoQXVnIDIw MjQgYW5kIG9ud2FyZHMpXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2V2ZW50cz4NCg0KDQpPbGQgQ1dO DQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04s IHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwg b3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRo ZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5 IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0K DQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4u c2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0 dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1p dHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 30 to August 06,= 2024.

    Ppxlib dev meetings

    Continuing this thread, Patrick Ferris announced

    Meeting notes are available here: https://github.com/ocaml-ppx/ppxlib/wiki= /Dev-Meeting-2024-07-23

    Thank you to all of the participants. If anyone is interested in adding ite= ms for the next meeting in August do ping me.

    Until then happy ppx-ing :))

    Pragmatic Category Theory

    Dmitrii Kovanikov announced

    I started writing a series on Pragmatic Category Theory for Beginners focusing on real-world use cases rather than theory. All code examples ar= e in OCaml.

    The first part was just finished:

    It's just the beginning, and I have plans to describe more and provide more= examples in future parts. I also plan to make a video version as well.

    I hope you'll enjoy it!

    ppxlib.0.33.0

    Nathan Rebours announced

    The Ppxlib dev team is happy to announce the release of ppxlib.0.33.0= .

    You can find the full changelog for this release here.

    Warning silencing for [@@deriving ..] ge= nerated code

    This release's main feature is a series of improvement to flags controlling= unused value/module/type warnings silencing.

    The ppxlib driver generates warning silencing items to prevent= [@@deriving ...] generated code to trigger unused code warnings. Three warnings are disabled= that way:

    • Warning 32: unused value
    • Warning 60: unused module
    • Warning 34: unused type

    The first two are disabled for values and modules generated by the deriver = while the third is disabled for the types in the type declaration to which = the [@@deriving ...] attribute is attached.

    This feature was added a long time ago to avoid manually disabling those wa= rnings when working with derivers that generate a set of values and modules= only to use a subset of those. Alternatively, the unused type warning sile= ncing was added to allow defining an alias type only to be consumed by a de= river, e.g.:

    type error =3D [`Not_found | `Invalid_arg]=
     [@@deriving to_string]
    

    We since then believe that we should not disable warnings lightly, as this = behaviour makes it difficult to find and remove dead code. The right approa= ch in those situations should be to fix the PPX derivers so that they are m= ore configurable and can be used without triggering such warnings.

    We will start to move toward removing this feature, but since it is still u= seful in some places, we had to come up with a plan to allow transitioning = out of it.

    In ppxlib.0.31.0 we added the -unused-code-warnings driver flag and the ?unused_code_warnings's Deriving.V2.make optional= argument to control whether to silence Warnings 32 and 60. When both are s= et to true, by the user and the deriver authors, the warnings = are not silenced.

    As of ppxlib.0.33.0, these also control the silencing of Warni= ng 34 (unused type). force can now be passed to the -unu= sed-code-warnings flag in order to disable warnings silencing, regar= dless of the derivers opting in.

    This allows users to test whether their codebase and their set of derivers = rely on warning silencing or not and to use those results to eliminate dead= code and/or report issues upstream to the derivers they use.

    We also added a separate -unused-type-warnings flag that works= similarly to -unused-code-warnings (i.e., depends on the value of the ?unused_code_warnings argument), but it only controls Warning 34 si= lencing, as it turns out it is less likely to cause unwanted warnings than = with the other two. This will allow users to disable it more easily, withou= t having to deal with Warnings 32 and 60 straight away.

    We want to encourage users to try those on their codebase in order to see t= he impact it has. Did you have dead code lying around that slipped past und= etected? Does this trigger unwanted warnings because of deriver's generated= code?

    The plan is to give the ecosystem some time to try those features and adapt= by fixing individual derivers and flipping ?unused_code_warnings to true as they do. After a while, we will swap the default value of th= e driver flag to true so that only derivers that haven't opted= in will enable warning silencing. Then as time goes we will swap the defau= lt of the Deriving.make argument so that derivers will instead= have to explicitly opt out to get the warning silencing. Finally, once we = are confident the ecosystem is in a good enough state, we will remove this = feature altogether.

    Other features

    ppxlib.0.33.0 also comes with a couple of new features for PPX= authors:

    • A couple new Ast_builder functions: elist_tail and plist_tail that can be used to build list expressions and patterns with a custom tail: elist_tail [expr1; expr2] tail_expr returns the expression for expr1::expr2::tail_expr.
    • Context_free.special_function', a new version of spe= cial_function that allows passing a Longident.t directly rather that relying on p= arsing the string argument to a Longident.t.

    Finally, the release includes a few bug fixes to Longident.parse and Code_path.main_module_name and fixes the location-check<= /code> flag so it is not required to also pass -check to enable location checks. It als= o fixes the 5.2 migrations locations, as we used to build nodes with inconsistent locations= when migrating Pexp_function nodes.

    Huge thanks to our external contributors

    We would like to thank our external contributors who have been a huge part = of this release: @octachron, @vg-b, and @jchavarri, and a special mention t= o @mbarbin, who has not only contributed a lot to the warning silencing fea= tures but has been extensively testing and providing very useful feedback o= n them.

    And of course, as usual, we'd like to thank the OCaml Software Foundation w= ho has been funding my work on Ppxlib and on this release, making all of th= is possible!

    OCaml-LSP 1.19.0 for OCaml 5.2

    vds announced

    I am happy to announce, on behalf of the ocaml-lsp team, the release of ocaml-lsp-server 1.19.0 and associated libraries. Th= is release primary goal is to bring official support for OCaml 5.2 =F0=9F= =90=AB.

    Features

    • Add custom [~ocamllsp/getDocumentation~](/ocaml-lsp-server/docs/ocamlls= p/getDocumentation-spec.md) request (ocaml/ocaml-lsp#1336)
    • Add support for OCaml 5.2 (ocaml/ocaml-lsp#1233)

    Fixes

    • Kill unnecessary ocamlformat processes with sigterm rather than sigint = or sigkill (ocaml/ocaml-lsp#1343)

    MlFront - A packaging system for OCaml

    jbeckford announced

    Here are the introductory paragraphs from its overview:

    MlFront adds a Java-like packaging system to OCaml. The = MlFront name is a homage to cfront which was tooling th= at translated "C with Classes" (now known as C++) into C code. Similarly, <= code>MlFront-based tools can translate OCaml with packages into conv= entional OCaml. … At its most basic core, MlFront gives a well-defined, consiste= nt meaning to a module reference like AcmeWidgets_Std.Activities.Manu= facturing across the domains of:

    1. OCaml source code.
    2. findlib libraries.
    3. opam packages.

    MlFront is Apache 2.0 licensed and is meant to be used by buil= d systems (Dune, ocamlbuild, DkCoder) and package managers (opam). One of i= ts critical dependencies is codept.

    You can read more about MlFront in the following posts (with m= ore coming):

    Cross-post notice: The first article was posted at https://lobste.rs/s/7ghslo/overview_o= camlfront; no comments (:(). But I still like to get first-hand feedbac= k on what works well in other languages, so please chime in even if you don= 't feel that OCaml is your strong suit.

    OCaml.org Newsletter: July 2024

    Sabine Schmaltz announced

    Welcome to the July 2024 edition of the OCaml.org newsletter! This update h= as been compiled by the OCaml.org maintainers. You can find previous updates on Disc= uss.

    Our goal is to make OCaml.org the best resource for anyone who wants to get= started and be productive in OCaml. The OCaml.org newsletter provides an u= pdate on our progress towards that goal and an overview of the changes we a= re working on.

    We couldn't do it without all the amazing people who help us review, revise= , and create better OCaml documentation and work on issues. Your participat= ion enables us to so much more than we could just by ourselves. Thank you!

    This newsletter covers:

    • Community-Driven Development of OCaml.org
    • Recipes for the OCaml Cookbook: Help us make the OCaml Cookbook = really useful by contributing and reviewing recipes for common tasks!
    • Community & Marketing Pages Rework: Implementation work in p= rogress.
    • General Improvements: As usual, we also worked on general mainte= nance and improvements, so we're highlighting some of the work that happene= d below.

    Community-Driven Development of OCaml.org

    After reworking most of the OCaml.org website to be more useful, more usabl= e, and nicer to look at, the team at Tarides that has been working on OCaml= .org is disbanding. However, OCaml.org will continue to be maintained and e= xtended by by the OCaml Platform and OCaml compiler contributors, as well a= s by the wider OCaml community.

    You can reach out to the OCaml.org maintainers to discuss any bigg= er changes or additions you'd like to make. Contributions to improve existi= ng features and bug fixes are always welcome!

    Recipes for the OCaml Cookbook

    The OCaml Cookbook is a place where OCaml developers share how to solve com= mon tasks using packages from the ecosystem.

    A recipe is a code sample and explanations on how to perform a task using a= combination of open-source libraries.

    The Cookbook is live at ocaml.org/co= okbook.

    Here's how you can help:

    1. Help review the open pull requests for cookbook reci= pes!
    2. Contribute new recipes and tasks for the cookbook!

    Thank you all for the many contributions! One area where we could use help = is in reviewing and improving the suggested recipes and tasks.

    Relevant PRs and Activities:

    Community & Marketing Pages Rework

    We have UI designs for the reworked and new pages of the = community section, and implementation is being worked on by @oyenuga17, our former Outreachy intern!

    Relevant PRs and Activities:

    General Improvements and Data Additions

    Summary:

    • The selected OS is now part of the anchor tag of the URL on the https://ocaml.org/install page. This all= ows people to link to quick install instructions for a specific OS.
    • We appreciate the contributions to the OCaml documentation!
    • We're checking for backlinks to OCaml.org again with Ahrefs.

    Relevant PRs and Activities:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=tZ1Syz+h; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=SoFbeI/E; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 071B6B80123 for ; Tue, 13 Aug 2024 14:21:23 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=3oRWlWoxSJQs+DYGOq9MffXsG7wo04AJxiaqzaxaaX0=; b=tZ1Syz+hyO41yLK/M+qaBZ4mqe6YThvkdvHA627MGoS5r0oWHg/FeXbQ JoME3+HbQxIv5iK54LiAV9Xy4cmi62vJA7rlUwcPLCgSg+H0BSAMV0Nbl MWgR9o3m8KqcJpCOCPZEx5OVvDycwA0HY/+FuILA+lVeCFk4Z20H8+h44 8=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.09,285,1716242400"; d="scan'208,217";a="178890283" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 Aug 2024 15:21:24 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 29B29E0CD1; Tue, 13 Aug 2024 15:21:23 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 18126E0035 for ; Tue, 13 Aug 2024 15:21:17 +0200 (CEST) IronPort-SDR: 66bb5dcd_JQiqMquki2TE/albob0sqPCLXtvy3AnXUGqHaMvO+5lY/Kq Vs5A4358p6cGmPn1xD1qFQeUMjCphhM6VZrYNuA== X-IPAS-Result: =?us-ascii?q?A0FBAQAaXbtmmCIeaIFaFoQDgQMZAWNaMwcISARdg3WDT?= =?us-ascii?q?44gnD+DFjUYAQMBDS4BDgQBAgQBAQMBAgGCC4J0AhaJTgIfBgEENBMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECEAEBAQEBAQEBNwVJhXUNgkYZF?= =?us-ascii?q?SNvgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QECDAGBAiUKEwEBOBgjAxALAwIEDQE1FwESGoJmAYJkAwQBDAaSC5s8eoEyg?= =?us-ascii?q?QGCDAEBBoEIPgEBAQEKAgIDDy4B2gSBYwmBSIgxGgEqSGoChEKEOycPgVVEh?= =?us-ascii?q?AcHb4FQehcBAQEBgTwBARE8CYMlgmmGKlWFUmyBCINTgSmCfVcPggdUDoN/J?= =?us-ascii?q?U1nhxaBHIkJgUciAyYzIRMBVRMXCwkFZIYTgkqDKYIWhBeFJ4FnCWGHbYFvg?= =?us-ascii?q?T6BXkqCdEuFW4EDgll0Tj8CDQI3gTgdQAMLbT01FBumFQQNJwGBWgGBcA44g?= =?us-ascii?q?UFQCA4LHwsZIxEcLhKTERUssg40B4QXgV0GDIkBgSSVcoQFgVakZiKYTSKCN?= =?us-ascii?q?IcggSUJgleVHSyFVIF+I4FcMxowQ4IzAQEyCQk9HA+SG4E+gmI5O4E9xV1BN?= =?us-ascii?q?QIBAQcwAgcBCgEBAwmFRR0BAYUHMoFLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 vlALkXS3Hi4FX0= IronPort-HdrOrdr: A9a23:MfzrUK5xzSlaWDih8wPXwPXXdLJyesId70hD6qkRc203TiX8ra qTdZsguyMc5Ax9ZJhCo7C90cu7IE80nKQdieIs1NyZMzUO1lHFEKhSqaPchxfgFyf9+uM179 YDT4FOTPvqAxxfhcb+iTPId+rILeP3lZyVuQ== X-Talos-CUID: =?us-ascii?q?9a23=3AXbWWMmkX1rK6LYJ9qJ9kU4Wy6/fXOUCHyS/1JkG?= =?us-ascii?q?4NXRSQ7fKSFa0w7xujsU7zg=3D=3D?= X-Talos-MUID: 9a23:1fdGfgvPDybVZdF9682npxJTMMJsxqWXD1EzmK4tntKYHhV8JGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.09,285,1716242400"; d="scan'208,217";a="178890256" X-MGA-submission: =?us-ascii?q?MDE7xLgIW3qZXEYrIFQ83AodoTUutCqw1KynjD?= =?us-ascii?q?AUoKot5XqAfPJ9kfIntb4ZM2QdRPMBzW85L2iHS1DSRQA/+D3JEb+Cto?= =?us-ascii?q?qvpSFCEEZurdvA+TeciFqzFnQJoZQibHv3jykB1s/Cb5MzRnydxH+GQ9?= =?us-ascii?q?nJmrOD94Zn8PkLTCcOOuPkrw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Aug 2024 15:21:17 +0200 Received: from TM.local (unknown [37.167.193.212]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 127D75647CC; Tue, 13 Aug 2024 15:21:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1723555275; bh=C18sGUPrwxCNiVky9UnAlA+5WWB0Lx/ClYG8fQSj+Lc=; h=From:To:Subject:Date:Message-ID; b=SoFbeI/EU29nVn8XfvpE6h+MEHhN8laItDW5JbHdph1nRO4Iw4rMjVL61Zo3XQ8qW 26S93V9Fzi5+BHMhFCEX6/y7+CYVDlQ7WNdItVFdZt7FHSN4ZSApBSCPvWD7J8qL2y vm4ni3qy2zhhkqhpvJasRNXNB5qWS1+FruDl37Ow= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 13 Aug 2024 15:21:11 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 13 15:21:15 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.426237, queueID=81A3B5647CD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19172 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDA2IHRvIDEzLA0KMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpNbEZyb250 IC0gQSBKYXZhLWxpa2UgcGFja2FnZSBzeXN0ZW0gZm9yIE9DYW1sDQpGaXJzdCByZWxlYXNlIG9m IGhlY3Rvcg0KRHVuZSBkZXYgbWVldGluZw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoN Ck1sRnJvbnQgLSBBIEphdmEtbGlrZSBwYWNrYWdlIHN5c3RlbSBmb3IgT0NhbWwNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW1sZnJvbnQtYS1qYXZhLWxpa2UtcGFja2FnZS1zeXN0ZW0tZm9yLW9jYW1sLzE1 MDcyLzQ+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgamJlY2tmb3JkIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSSd2ZSBhZGRlZCBhIHRoaXJkIHBvc3Q6IFtodHRwczovL2Rp c2t1di5jb20vbWxmcm9udC9vdmVydmlldy0zL10NCg0KICBJbiBpdCBJIGRlc2NyaWJlIGEgc21h bGwgYnV0IHVzZWZ1bCAvcmVmZXJlbmNlIGJ1aWxkIHN5c3RlbS8gZm9yDQogIE1sRnJvbnQgd2hp Y2ggY2FuIHRha2UgcGFja2FnZXMgbGlrZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIC4N CiAg4pSCIOKUnOKUgOKUgCBBY21lV2lkZ2V0c19TdGQvDQogIOKUgiDilIIgICDilJTilIDilIAg QS5tbA0KICDilIIg4pSU4pSA4pSAIEJvYkJ1aWxkZXJfU3RkLw0KICDilIIgICAgIOKUlOKUgOKU gCBCLm1sDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZCBwcm9kdWNlIHN0YW5kYWxvbmUgYnVp bGQgc2NyaXB0cyB0aGF0IGNhbiBiZSBjb21taXR0ZWQgdG8gc291cmNlDQogIGNvbnRyb2w6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG1sZnJvbnQtYm9vdCAtbmF0aXZlIC1vIGJ1aWxk c2NyaXB0DQogIOKUgiANCiAg4pSCICQgLi9idWlsZHNjcmlwdC5zaCAjIC5cYnVpbGRzY3JpcHQu Y21kIGlzIGFsc28gY3JlYXRlZA0KICDilIIgDQogIOKUgiAkIHRhcmdldC9Cb2JCdWlsZGVyX1N0 ZC5CDQogIOKUgiBJIGFtIGFuIEEhDQogIOKUgiBJIGFtIGEgQiENCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgT24gYSByZWxhdGVkIG5vdGUsIEkndmUgYmVndW4gdG8gaW1wbGVtZW50IGEgc21hbGwg cGFydCBvZg0KICA8aHR0cHM6Ly9nYWxsaXVtLmlucmlhLmZyL35zY2hlcmVyL25hbWVzcGFjZXMv c3BlYy5wZGY+LiBJdCBpcyBub3QNCiAgc3RyaWN0bHkgcmVxdWlyZWQgYnV0IFtOYW1lc3BhY2Vz Lm1saV0gd2lsbCBiZSB2ZXJ5IGhlbHBmdWwgZm9yDQogIHVwZ3JhZGluZyBleGlzdGluZyBwcm9q ZWN0cyB0byBgTWxGcm9udCctc3R5bGUgcGFja2FnZXMgd2l0aG91dA0KICBjaGFuZ2luZyBjb2Rl LiBUaGF0IHdpbGwgYmUgZm9yIGEgZnV0dXJlIChub3Qgc29vbikgcG9zdC4NCg0KDQpbaHR0cHM6 Ly9kaXNrdXYuY29tL21sZnJvbnQvb3ZlcnZpZXctMy9dDQo8aHR0cHM6Ly9kaXNrdXYuY29tL21s ZnJvbnQvb3ZlcnZpZXctMy8+DQoNCltOYW1lc3BhY2VzLm1saV0NCjxodHRwczovL2dpdGxhYi5j b20vZGttbC9idWlsZC10b29scy9NbEZyb250Ly0vYmxvYi9mMWY2ZTZkMDczNTAwZmViYjVjOWU0 MjkyMTJjOGJkYWFhMTc3YzM1L3NyYy9NbEZyb250X0NvZGVwdC9OYW1lc3BhY2VzLm1saT4NCg0K DQpGaXJzdCByZWxlYXNlIG9mIGhlY3Rvcg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZmlyc3QtcmVsZWFzZS1vZi1oZWN0b3Iv MTUwOTkvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEl0IGlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxl YXNlIG9mIGBoZWN0b3InLCBhbiBPQ2FtbA0KICBsaWJyYXJ5IHRoYXQgb2ZmZXJzIC92ZWN0b3Jz LyAoYWxzbyBrbm93biBhcyBkeW5hbWljIGFycmF5cywgb3INCiAgcmVzaXplYWJsZSBhcnJheXMp Lg0KDQogIFRvIGluc3RhbGwgaXQsIHR5cGUgYG9wYW0gdXBkYXRlICYmIG9wYW0gaW5zdGFsbCBo ZWN0b3InLg0KDQogIGBoZWN0b3InIG9mZmVycyAqcG9seW1vcnBoaWMgdmVjdG9ycyosIHdoZXJl IHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50cw0KICBpcyBhIHBhcmFtZXRlciwgKm1vbm9tb3JwaGlj IHZlY3RvcnMqLCB3aGVyZSB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudHMNCiAgaXMgZml4ZWQsIGFu ZCAqaW50ZWdlciB2ZWN0b3JzKiwgYSBzcGVjaWFsIGNhc2Ugb2YgbW9ub21vcnBoaWMNCiAgdmVj dG9ycy4NCg0KICBgaGVjdG9yJydzIHZlY3RvcnMgYXJlICpub3QgdGhyZWFkLXNhZmUqIGFuZCAq ZG8gbm90IGluY2x1ZGUgYQ0KICBwcm90ZWN0aW9uIGFnYWluc3QgbWVtb3J5IGxlYWtzKi4gQ29t cGFyZWQgd2l0aCB0aGUgYER5bmFycmF5JyBtb2R1bGUNCiAgaW4gT0NhbWwncyBzdGFuZGFyZCBs aWJyYXJ5LCBgaGVjdG9yJydzIHBvbHltb3JwaGljIGFuZCBtb25vbW9ycGhpYw0KICB2ZWN0b3Jz IGFyZSAqc2xpZ2h0bHkgZmFzdGVyKiwgYW5kIGBoZWN0b3InJ3MgaW50ZWdlciB2ZWN0b3JzIGFy ZQ0KICAqc2lnbmlmaWNhbnRseSBmYXN0ZXIqLiBgaGVjdG9yJyBvZmZlcnMgZmFzdCAoYnV0IGRh bmdlcm91cykgKnVuc2FmZQ0KICBhY2Nlc3Mgb3BlcmF0aW9ucyosIG5hbWVseSBgdW5zYWZlX2dl dCcsIGB1bnNhZmVfc2V0JywgYW5kDQogIGB1bnNhZmVfYm9ycm93Jy4gRm9yIGEgbW9yZSBkZXRh aWxlZCBvdmVydmlldywgc2VlIHRoZQ0KICBbZG9jdW1lbnRhdGlvbl0uDQoNCg0KW2RvY3VtZW50 YXRpb25dIDxodHRwczovL2NhbWJpdW0uaW5yaWEuZnIvfmZwb3R0aWVyL2hlY3Rvci9kb2MvaGVj dG9yLz4NCg0KDQpEdW5lIGRldiBtZWV0aW5nDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1kdW5lLWRldi1tZWV0aW5nLzE0OTk0Lzk+DQoNCg0KQ29udGludWluZyB0aGlz IHRocmVhZCwgTWFyZWsgS3ViaWNhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgVGhhbmtzIGZvciBldmVyeW9uZSB3aG8gam9pbmVkIHRvZGF5ISBUaGUgW21lZXRpbmcg bWludXRlc10gYXJlIG9ubGluZQ0KICBhbmQgdGhlIG5leHQgbWVldGluZyB3aWxsIGJlIGluIHR3 byB3ZWVrcywgMjFzdCBvZiBBdWd1c3QgYXQgMTA6MDANCiAgKEFNKSBDRVNULg0KDQoNClttZWV0 aW5nIG1pbnV0ZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lraS9kZXYtbWVl dGluZy0yMDI0LTA4LTA3Pg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxv Zw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dz IGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtUaGUgR3Vp ZGUgdG8gU29mdHdhcmUgVmVyaWZpY2F0aW9uIHdpdGggRnJhbWEtQyBpcyBhdmFpbGFibGVdDQoN Cg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbVGhl IEd1aWRlIHRvIFNvZnR3YXJlIFZlcmlmaWNhdGlvbiB3aXRoIEZyYW1hLUMgaXMgYXZhaWxhYmxl XQ0KPGh0dHBzOi8vZnJhbWEtYy5jb21odHRwcy8vbGluay5zcHJpbmdlci5jb20vYm9vay8xMC4x MDA3Lzk3OC0zLTAzMS01NTYwOC0xPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1l c3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBb dGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJ ZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5 IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0K DQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+ DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9z eW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 06 to 13, 2024.

    MlFront - A Java-like package system for OCaml

    Continuing this thread, jbeckford announced

    I've added a third post: https://diskuv.com/mlfront/overview-3/

    In it I describe a small but useful reference build system for MlFro= nt which can take packages like:

    .
    =E2=94=9C=E2=94=80=E2=94=80 AcmeWidgets_Std/
    =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 A.ml
    =E2=94=94=E2=94=80=E2=94=80 BobBuilder_Std/
        =E2=94=94=E2=94=80=E2=94=80 B.ml
    

    and produce standalone build scripts that can be committed to source contro= l:

    $ mlfront-boot -native -o buildscript
    
    $ ./buildscript.sh # .\buildscript.cmd =
    is also created
    
    $ target/BobBuilder_Std.B
    I am an A!
    I am a B!
    

    On a related note, I've begun to implement a small part of https://gallium.inria.fr/= ~scherer/namespaces/spec.pdf. It is not strictly required but Namespaces.mli = will be very helpful for upgrading existing projects to MlFront-style packages without changing code. That will be for a future (not soon= ) post.

    Dune dev meeting

    Continuing this thread, Marek Kubica announced

    Thanks for everyone who joined today! The meeting minutes are online and the= next meeting will be in two weeks, 21st of August at 10:00 (AM) CEST.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=BCKqns9D; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=D2T408Xv; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D66D9B80123 for ; Tue, 20 Aug 2024 10:29:57 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=ogmQyqhGiwsOTIyBqi083sZYPipRz2h3FNbtf7BDbTc=; b=BCKqns9DsLJnNmPq2KDZ9H+GrAaQZHqIcatlwSHitdaU8z1lcWqdhbKh qrjZifaDiNZ4HvdkxkuG4oasP9+FihPxnA/a518QISyoiwIYpvjjqcDc3 1yNhSait4WpzNDj+tx/Q/ccLOkyJLC6q73ZoA7wtEUhCDoX2lQOszFdiB I=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,161,1719871200"; d="scan'208,217";a="179459282" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 Aug 2024 11:29:57 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id E8E64E0141; Tue, 20 Aug 2024 11:29:56 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 005CBE00B7 for ; Tue, 20 Aug 2024 11:29:53 +0200 (CEST) IronPort-SDR: 66c46211_0lbcBpVj8NCeGsL0NOunML/JPENSYqD+IOYZJeYEBjhVx0U qG11ACrphkUxJYera/QOlzxgNXTneRtvjyEjNfw== X-IPAS-Result: =?us-ascii?q?A0HjAgDNYcRmkCIeaIFahBmBAxkBY1ozBwhIAwFdg3WDT?= =?us-ascii?q?44fkUiKd4J7AxgWIxQBAwENLgEFDQECBAEBAwECAYQ5RgIWiVMCHwYBBDQTA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBAQE+SYU7CDINg?= =?us-ascii?q?kYZFSNRHl4HCQYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBMAMEZwkEBhMBAS4KGBIRAxQBB?= =?us-ascii?q?gMCBA0BNRcBEhqCZgGCZAMFDAY/k2abPHp/M4EBggwBAQaBCD4CAQIJAgUBD?= =?us-ascii?q?gkm2gSBYwmBSIgxGgEFJUhqAoRCCYQvAicPgVVEgUqBc0oHb4FQLkwXAQEBA?= =?us-ascii?q?QEXgRwFAwEBTQmDJYJphihVhUQPbIEKRYJvDBOBKXMmgWRXD1dxUUICDDIDg?= =?us-ascii?q?RCBPXwlTFcQhjVhgRpgiViBR0szIRMBVRMXCwkFZIYPgkqDKYIUhBiFKIFnC?= =?us-ascii?q?WGHbYFvgT6BW0eCdUuFWIEEgllsTjkCDQI3gj0pLx1AAwttPTUUG6Z5BA0nA?= =?us-ascii?q?YFaAYF7DkAVGy8pBQEKCQgKBAIiLgQEDgoBCgcWA0kEFQgnBgsLAhQZjQWFb?= =?us-ascii?q?yoCc445jguUWDQHhBiBXQYMiQGBJI4nh0uEBYFWiyuGfZI/IphNIoI0gkGEX?= =?us-ascii?q?4ElCV+BeIhtjCA8AgaFTIF+IzyBIDMaMEMNEAGCSQkKDDAcD4ZCi1kQgS6CY?= =?us-ascii?q?jk7gkEsxB1BNQIBAQENKQIHAQoBAQMJhWIBAYRnI2phAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:1HIcb6LSOvi/LTCoFE+RfpElxSXFcZb7ZxGr2PjKsXjdYENS0DYAz 2ccUWmOM6uLYjejc40iOt6/8kpTusOBxtZqTQId+CA2RRqmi+KVXIXDdh+Y0wC6d5CYEho/t 63yTvGacajYm1eF/k/F3oDJ9CU6j+fSLlbFILasEjhrQgN5QzsWhxtmmuoo6qZlmtHR7zml4 LsemOWBfgb9s9JIGjhMsf7b+Ek35K2aVA4w5zTSW9gb5DcyqFFOVPrzFYnpR1PkT49dGPKNR uqr5NlVKUuEl/uFIorNfofTKiXmcJaKVeS9oiY+t5yZv/R3jndaPpDXmxYrQRw/Zz2hx7idw TjW3HC6YV9B0qbkwIzxX/TEes3X0GIvFLLveBCCXcKvI0LuSFHHzfo+V3AKLa4J++xwJFNr9 OAmEWVYBvyDr7reLLOTT/k1wNwkKNj3MYgfvHB50DyfCuwpKXzBa/yQtJkBhGt23ZgIRqq2i 8kxMVKDaDz7WSYXb0o+N85rpNv9nn77YiFVo1KTpLMq7i7U1gMk2bzkNpzOcdyPRNlJtkyfu 2TN8n+/B00KctuFxlJp91r12b6TwHKhBNJ6+LuQytF6vXqXwjEoM14RUWe5htfo1UW8cocKQ 6AT0nFz8fZpqxTDosPGdxaxpXrBuh8HR/JLAugi4UeMzLDV6kCXHAA5oiVpbcx/8tcxQS022 1SJmdLwGDEpt6eaIZ6AyluKhQiYEiYafTQzWT8nXAoP5PzRhYAvsCuaG76PD5WJptHyHDjxx RWDoy4/m6gfgKY3O0OToQ6vb9WE+sehc+Il2jg7SF5J+StXXuaYi2GA7EiCq+5HKJeFQ1KBu nkdhsXY6/oBZX1sqMBvaLtXdF1Kz6/bWNE5vbKJN8J8n9hK0yTyFb28GBkkeC9U3j8sIFcFm nP7twJL/4N0N3C3d6JxaI/ZI511l/S4RI6+CaiPMoomjn1NmOmvoH8Giam4gz+FraTQuftX1 WqzL5vxVihy5VpPk2DeqxghPU8DnX1imziMHfgXPjyq2r2aaTaNTrMULFaFbuY49b6J6AjN6 N1HX/ZmOD0CONASlhL/qNZJRXhTdChTLc6t8aR/KLXcSjeK7Ul9V5c9N5t6Idc090mU/8+Ul kyAtrhwkQGn3iyfclvVNBiOqtrHBP5CkJ7yBgR0VX7A5pTpSd3HAH43JspvL4o0vvdu1+B1R PQjcsCNSKYHADfe9jhXKdG3oIV+fV75zUiDLgi0UggZJpRAfg3u/sO7Xw3N8CJVMDG7m/Fjq JKd1yTaY6E5eSJcMOjsZsmC8XaNrFkGuecrX0L3MthZI0rt145xKh3OtPw8IuBSCBCamh6hi hmcWwdFqcbzoYYarcHCtZ6Ai4L4AtlvP1F7GlPD5u2cLhjq/WuEwK5BXt2XfDvbanjGxaW6a chRzND+KPcijn8Tl6ZdSpFFlbkf4fnrrJ9kljVUJm3BNQmXO+kxM0u40tlqnYwT4L1g4C+de F+Fo/teMpW3YPLVKkYbflcZX77SxMMvu2fg6NouKx/H/w5xxr2MVHtSMzSqiCBwKLhUMpsv8 dw+ufw5uhCOtR43Dumo1ixk1XyADnglYZUVsps3BIzKiA1y7npgZZfaKDH94bDRStFqH3QpH ASph/v5t+wB/nbBTns9LmiS/Ox/gZ9VhgtG4mVfLHu0m/3EpMQN4jtvzRoNQD949C53i9BIB jAzNmleB7m/wDNztc0SA0GuA15gATOayGzQynwItnLTFVn1WkPzLmQSZP6GzH4d12cNbwpK3 aq5zVz9Wm3AZ/DB3SoVWG9kpcf8TNd3yBbwpcC/E+mBHLg4eTDAgJLyVVEXqhDiP9w9tHfHq cZu4ux0T6/xbgwUnIEWFKiY0u42ZC2fBWkfX8xkwrwFLVvcdB62xzKKDUK7IeFJBv7S9H6HG 95cHd1OWzu+xRSxgGgiX4BUGIBNndkt+NYmUZHoLzRfs7Kg8xxYgKiJ/S363GIWU9FilPgmE bzodhWAL3exgEVFkGqcvehGPWuFOeM/XjPe59zs0us1FMMkitpOIGUSybq/ukuHPDR3pyy0u BzxXI6I7uhA57k1oa7SPPRtOwGGJ+n3dty0yyGoktEXbdrwIcbE7AwUjV/8PjVpB7gaWvUpt LGvrtLIgUH3jJMrWVzjx72ERrh79OSpfe9tKsmsBmJrrSiDf87N4hU45GGzL6JSou5d/sWKQ wiZatO6UNwoB+dm23xebhZBHyYnC6jYarnqoQW/pa+uDicx/BPmLtT901PUdkBeKzE1PqPhB j/Ou/qB4s5SqKJODkQmA9BkG5pJH0/xa5A5dtHetSiqMUfwuwms4oDdrBsH7S3HLlKmE8ygu JLMeUXYRSSI4arNyIlUjpx2shgpF01CuOgXfH8G2ttImju/XX8nL+McDM08MatqsBfOjbP2W DKcS1EZK3TNbWwRO1G0qtHuRRyWCeEyK8/0bG5htV+dbyCtQpiMGv19/yNn+G17YSbn0PrhE 9wF53nsJVKk9/mFnwrICiCT2o+LB882x07kPWj4g5W0GxEaEKkH33xnHRNQWGrACc6leIDjO z0uXW4dKK2kYReZLCqiUyc99NIlUPfHxTI1ayyC25Da55Xdy/dPoBE6E/+myaUNNazmO5ZXL U4ahAKxD6S+wnsXqLcksNIvgLZpBLSMBMfSwGoPg+ENt/nY11nL9P/uUcbCoA/ONeKf/57ge uGQ3kUD IronPort-HdrOrdr: A9a23:eS1x+KPdfQxzbMBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: =?us-ascii?q?9a23=3AomzmRGhBLNGemPjxOsuDH2PJjDJuSVf2wniAeH6?= =?us-ascii?q?EGUV4SbeSbG21+b9aqp87?= X-Talos-MUID: 9a23:go3n2wTe45hkBhJwRXTQqyFfE8Nsvp+VS0cJrZchlZjbPi5ZbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,161,1719871200"; d="scan'208,217";a="179459248" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHF0CmoSM9geCunQBajzjdUCr6FioBHRsgdeP?= =?us-ascii?q?vHLAFtTbQg9kIjFU9HFJ7uyBdOZWEBeXV+eKKvrQUCogKMVsPZf/4jrw?= =?us-ascii?q?Bxj6cO9mJnVi3tHCkjsk0VwmJouWqug+XATfo4J85Oiq3cUQpPr6fqdt?= =?us-ascii?q?WcU47RSUaEMuEqZfVxkIZyuw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Aug 2024 11:29:52 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A5BBD56483B; Tue, 20 Aug 2024 11:29:51 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1724146191; bh=So+VR6e2jx+rEDrBMrn7qckuGt/hBvNfpW+0wQKVZ14=; h=From:To:Subject:Date:Message-ID; b=D2T408XvyWsYM5tpHLbTX+GC5UBjWL+AVgV+vCZUndZlVNzgU0GeKjzQkhXP8xl5S fW3KxrHrbjGL/2BvuhOYGysun0SJu+Tskxk0wOlF2q+IeGBoxWE7QVCsaZ+0vYuyQ7 RqWCQQeorlC0B5GCs0t22fxSQA6BU555e1c4xrTM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 20 Aug 2024 11:29:49 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 20 11:29:52 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.371241, queueID=DA53756483C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19174 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDEzIHRvIDIwLA0KMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpNbEZyb250 IC0gQSBKYXZhLWxpa2UgcGFja2FnZSBzeXN0ZW0gZm9yIE9DYW1sDQpScG1maWxlIGxpYnJhcnkg djAuMy4wIHdpdGggbmV3IEVpby1iYXNlZCByZWFkZXINCkdpdEh1YiAtIG1ldGEtaW50cm9zcGVj dG9yL29jYW1sLWxpYnBweC1pbXBvcnQteW9qc29uLWludHJvc3BlY3RvcjogVXNpbmcgbGlicHB4 LCBwcHhfaW1wb3J0LCByZWZsZWN0IG92ZXIgYXN0IHVzaW5nDQpEdW5lIERldmVsb3BlciBQcmV2 aWV3IFVwZGF0ZXMNClBweGxpYiBkZXYgbWVldGluZ3MNClByYWdtYXRpYyBDYXRlZ29yeSBUaGVv cnk6IFBhcnQgMiBwdWJsaXNoZWQhDQpEdW5lIGRldiBtZWV0aW5nIG9uIDIwMjQtMDgtMjEsIDEw YW0gQ0VTVA0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk1sRnJvbnQgLSBBIEphdmEt bGlrZSBwYWNrYWdlIHN5c3RlbSBmb3IgT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1sZnJvbnQt YS1qYXZhLWxpa2UtcGFja2FnZS1zeXN0ZW0tZm9yLW9jYW1sLzE1MDcyLzg+DQoNCg0KamJlY2tm b3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlcmUgaXMgbm93IGEgbmV3IGxpYnJhcnkgYE1sRnJvbnRf VG9wJyB3aXRoIGEgYnVpbGQgdG9vbA0KICBgbWxmcm9udC10b3AnIHRoYXQgd2lsbCBnZW5lcmF0 ZSBzZWxmLWNvbnRhaW5lZCBPQ2FtbCB0b3BsZXZlbCBzY3JpcHQNCiAgZmlsZXMgd2l0aCBwYXJh bGxlbGlzbSBiYXNlZCBvbiBAYy1jdWJlJ3MgbW9vbnBvb2wgbGlicmFyeToNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIC4NCiAg4pSCIOKUnOKUgOKUgCBBY21lV2lkZ2V0c19TdGQvDQogIOKU giDilIIgICDilJzilIDilIAgSm9ic0ExLm1sDQogIOKUgiDilIIgICDilJTilIDilIAgSm9ic0Ey Lm1sDQogIOKUgiDilJTilIDilIAgQm9iQnVpbGRlcl9TdGQvDQogIOKUgiAgICAg4pSU4pSA4pSA IEpvYnNCLm1sDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg JCBtbGZyb250LXRvcCAtbyBidWlsZHNjcmlwdC5tbA0KICDilIIgDQogIOKUgiAkIG9jYW1sIGJ1 aWxkc2NyaXB0Lm1sIC1qIDIgLW5hdGl2ZQ0KICDilIIgICBsZWdlbmQ6IC0+IHN0YXJ0IHwgPC0g ZmluaXNoDQogIOKUgiAgICAgIGRpcmVjdG9yeSBjcmVhdGU6IHRhcmdldC8NCiAg4pSCICAgICAg ZmlsZSBjcmVhdGU6IHRhcmdldC9BY21lV2lkZ2V0c19TdGQubWwNCiAg4pSCICAgICAgbGluayBj cmVhdGU6IEFjbWVXaWRnZXRzX1N0ZC9Kb2JzQTEubWwgLT4gdGFyZ2V0L0FjbWVXaWRnZXRzX1N0 ZF9fSm9ic0ExLm1sDQogIOKUgiAgICAgIGxpbmsgY3JlYXRlOiBBY21lV2lkZ2V0c19TdGQvSm9i c0EyLm1sIC0+IHRhcmdldC9BY21lV2lkZ2V0c19TdGRfX0pvYnNBMi5tbA0KICDilIIgICAgICBs aW5rIGNyZWF0ZTogQm9iQnVpbGRlcl9TdGQvSm9ic0IubWwgLT4gdGFyZ2V0L0JvYkJ1aWxkZXJf U3RkX19Kb2JzQi5tbA0KICDilIIgICAtPiBjb21waWxlOiBBY21lV2lkZ2V0c19TdGQuSm9ic0Ex DQogIOKUgiAgIC0+IGNvbXBpbGU6IEFjbWVXaWRnZXRzX1N0ZC5Kb2JzQTINCiAg4pSCICAgPC0g Y29tcGlsZTogQWNtZVdpZGdldHNfU3RkLkpvYnNBMQ0KICDilIIgICA8LSBjb21waWxlOiBBY21l V2lkZ2V0c19TdGQuSm9ic0EyDQogIOKUgiAgIC0+IGNvbXBpbGU6IEFjbWVXaWRnZXRzX1N0ZA0K ICDilIIgICA8LSBjb21waWxlOiBBY21lV2lkZ2V0c19TdGQNCiAg4pSCICAgLT4gY29tcGlsZTog Qm9iQnVpbGRlcl9TdGQuSm9ic0INCiAg4pSCICAgPC0gY29tcGlsZTogQm9iQnVpbGRlcl9TdGQu Sm9ic0INCiAg4pSCICAgLT4gZXhlY3V0YWJsZSBjcmVhdGU6IEJvYkJ1aWxkZXJfU3RkLkpvYnNC DQogIOKUgiAgIDwtIGV4ZWN1dGFibGUgY3JlYXRlOiBCb2JCdWlsZGVyX1N0ZC5Kb2JzQg0KICDi lIIgICBkb25lLg0KICDilIIgDQogIOKUgiAkIHRhcmdldC9Cb2JCdWlsZGVyX1N0ZC5Kb2JzQg0K ICDilIIgSSBhbSBhbiBBMSENCiAg4pSCIEkgYW0gYW4gQTIhDQogIOKUgiBJIGFtIGEgQiENCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgSXQgcmVxdWlyZXMgdGhlIGBvY2FtbCcgYmluYXJ5IGFuZCBg b2NhbWxjJyBvciBgb2NhbWxvcHQnLiBUaGUNCiAgY29tcGxldGUgZXhhbXBsZSBpcyBhdA0KICA8 aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvYnVpbGQtdG9vbHMvTWxGcm9udC8tL2Jsb2IvMC40LjAt Ni90ZXN0cy9NbEZyb250X1RvcC9qb2JzLnQvcnVuLnQ+Lg0KDQoNClJwbWZpbGUgbGlicmFyeSB2 MC4zLjAgd2l0aCBuZXcgRWlvLWJhc2VkIHJlYWRlcg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ycG1m aWxlLWxpYnJhcnktdjAtMy0wLXdpdGgtbmV3LWVpby1iYXNlZC1yZWFkZXIvMTUxNDkvMT4NCg0K DQpNaWtoYWlsIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgVG9kYXkgSSB3YW50IHRvIHRlbGwgeW91IGFib3V0IG5ldyB2 ZXJzaW9uIG9mIFtScG1maWxlDQogIGxpYnJhcnldLiBScG1maWxlIGlzIGEgbGlicmFyeSBmb3Ig cmVhZGluZyBtZXRhZGF0YSBmcm9tIFtSUE1dDQogIHBhY2thZ2VzLiBPcmlnaW5hbGx5IFJwbWZp bGUncyBwYXJzZXIgKHJlYWRlcikgdXNlZCBbQW5nc3Ryb21dIGZvcg0KICBwYXJzaW5nLiBBbmQg aW4gdGhlIG5ldyByZWxlYXNlIGFkZGVkIG5ldyBtb2Rlcm4gW0Vpb10tYmFzZWQgcmVhZGVyLg0K DQogIEdsb2JhbGx5LCB0aGUgcHJvamVjdCBpcyBub3cgc3BsaXQgaW50byBmb3VyIHBhY2thZ2Vz OiBgcnBtZmlsZScsDQogIHdoaWNoIGNvbnRhaW5zIHNpZ25hdHVyZXMgYW5kIGltcGxlbWVudGF0 aW9uLWluZGVwZW5kZW50IGZ1bmN0aW9ucywNCiAgYHJwbWZpbGUtdW5peCcgd2l0aCB0aGUgb3Jp Z2luYWwgQW5nc3Ryb20gcGFyc2VyLCBhbmQgYHJwbWZpbGUtZWlvJw0KICAod2l0aCBgcnBtZmls ZS1jbGknKSB3cml0dGVuIHVzaW5nIEVpby4NCg0KDQpbUnBtZmlsZSBsaWJyYXJ5XSA8aHR0cHM6 Ly9naXRodWIuY29tL2R4M21vZC9ycG1maWxlPg0KDQpbUlBNXSA8aHR0cHM6Ly9lbi53aWtpcGVk aWEub3JnL3dpa2kvUlBNX1BhY2thZ2VfTWFuYWdlcj4NCg0KW0FuZ3N0cm9tXSA8aHR0cHM6Ly9n aXRodWIuY29tL2luaGFiaXRlZHR5cGUvYW5nc3Ryb20+DQoNCltFaW9dIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpbz4NCg0KTXkgZXhwZXJpZW5jZSBwb3J0aW5nIHRvIEVp bw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRWlvIGlzIGEgZmFudGFzdGljIGVm ZmVjdC1iYXNlZCBJL08gbGlicmFyeSBmb3IgYSBtb3JlIG1vZGVybiBhZ2UgaW4NCiAgbXVsdGlj b3JlIE9DYW1sLiBJIHRoaW5rIGl0IHRha2VzIHRoZSBiZXN0IGlkZWFzIGZyb20gdGhlDQogIGVj b3N5c3RlbS4gU28gYnVpbHQtaW4gYEJ1Zl9yZWFkJyBhbmQgYEJ1Zl93cml0ZScgbW9kdWxlcyBp bXBsZW1lbnQNCiAgaWRlYXMgZnJvbSBBbmdzdHJvbSBhbmQgRmFyYWRheSBsaWJyYXJpZXMuIEFs bW9zdCBBUEkgb25lLXRvLW9uZSwNCiAgYWxsb3dpbmcgcG9ydGluZyB2aWEgY29weS1wYXN0ZS4N Cg0KICBCdXQsIG9mIGNvdXJzZSwgbm90IGV2ZXJ5dGhpbmcgaXMgc28gcGVyZmVjdC4gVW5saWtl IHRoZQ0KICBgQW5nc3Ryb20ucGFyc2VfJyBmdW5jdGlvbiwgdGhlIGBCdWZfcmVhZC5wYXJzZScg ZnVuY3Rpb24gdGhpbmtzIEkNCiAgd2FudCB0byByZWFkIGEgd2hvbGUgc3RyZWFtIHRvIGVuZCBv ZiBpbnB1dC4NCg0KICBBIHNuaXBwZXQgb2YgdGhlIHNvdXJjZSBjb2RlOg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIGxldCBwYXJzZSA/aW5pdGlhbF9zaXplIH5tYXhfc2l6ZSBwIGZsb3cgPQ0K ICDilIIgICBsZXQgYnVmID0gb2ZfZmxvdyBmbG93ID9pbml0aWFsX3NpemUgfm1heF9zaXplIGlu DQogIOKUgiAgIGZvcm1hdF9lcnJvcnMgKHAgPCogZW5kX29mX2lucHV0KSBidWYNCiAg4pSCICAg KCogICAgICAgICAgICAgICBeXl5eXl5eXl5eXl5eXl4gICAgICAgICAgIA0KICDilIIgICAgICAg ICAgICAgICAgICAgICAwXzAgbmljZSAobm90KSAgICAgICAgKikNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgU28gSSBoYWQgdG8gcmV3cml0ZSB0aGlzIGZ1bmN0aW9uIG15c2VsZiBpbiBhIGZvcm0g c2ltaWxhciB0bw0KICBgQW5nc3Ryb20uQ29uc3VtZS5QcmVmaXgnLg0KDQoNCuKXiiBJcyBpdCBh IHNpZ25lZCBvciB1bnNpZ25lZCBpbnRlZ2VyPw0KDQogIGBCRS51aW50MTYnIGFuZCBvdGhlciBz aW1pbGFyIGZ1bmN0aW9ucyBhcmUgKnNpZ25lZCBpbnQqIGV2ZW4gdGhvdWdoDQogIHRoZXkgaGF2 ZSB0aGUgcHJlZml4IGB1JyBpbiB0aGUgbmFtZSBmb3Igc29tZSByZWFzb24uDQoNCg0K4peKIEFu ZCBhIGZldyBvdGhlciBkaWZmZXJlbmNlcw0KDQogIOKAoiBgQW5nc3Ryb20uYWR2YW5jZScgaXMg YHNraXAnDQogIOKAoiBgQW5nc3Ryb20ucG9zJyBpcyBgY29uc3VtZWRfYnl0ZXMnDQoNCg0KUC5T Lg0K4pWM4pWM4pWM4pWMDQoNCiAgVGhhbmtzIGZvciB5b3VyIGF0dGVudGlvbiENCg0KDQpHaXRI dWIgLSBtZXRhLWludHJvc3BlY3Rvci9vY2FtbC1saWJwcHgtaW1wb3J0LXlvanNvbi1pbnRyb3Nw ZWN0b3I6IFVzaW5nIGxpYnBweCwgcHB4X2ltcG9ydCwgcmVmbGVjdCBvdmVyIGFzdCB1c2luZw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9naXRo dWItbWV0YS1pbnRyb3NwZWN0b3Itb2NhbWwtbGlicHB4LWltcG9ydC15b2pzb24taW50cm9zcGVj dG9yLXVzaW5nLWxpYnBweC1wcHgtaW1wb3J0LXJlZmxlY3Qtb3Zlci1hc3QtdXNpbmcvMTUxNTEv MT4NCg0KDQpKaW0gRHVwb250IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBpcyBhIHdvcmtpbmcg Zmlyc3QgdmVyc2lvbiAod2l0aCB3YXJ0cykgb2YgYSBwcHhsaWIgdG8geW9qc29uDQogIGNvbnZl cnRlciwgYW0gc3RpbGwgdGVzdGluZyBpdCBidXQgdGhlIGhlbGxvIHdvcmxkIGlzIHdvcmtpbmcs IEkgaGF2ZQ0KICB0cmllZCBtdWx0aXBsZSB0aW1lcyB0byBnZXQgdGhpcyB0byB3b3JrLCBhbmQg ZmluYWxseSBzZXR0bGVkIG9uIHRoZQ0KICBpbXBvcnQgcm91dGUgdG8gb3ZlcnJpZGUgdGhlIHR5 cGUgc3lzdGVtLiAgY29kZSBoZXJlOg0KICA8aHR0cHM6Ly9naXRodWIuY29tL21ldGEtaW50cm9z cGVjdG9yL29jYW1sLWxpYnBweC1pbXBvcnQteW9qc29uLWludHJvc3BlY3Rvcj4NCg0KICBleGFt cGxlIHNuaXBwZXQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHsNCiAg4pSCICAgInBleHBf ZGVzYyI6IFsNCiAg4pSCICAgICAiUGV4cF9jb25zdGFudCIsDQogIOKUgiAgICAgWw0KICDilIIg ICAgICAgIlBjb25zdF9zdHJpbmciLA0KICDilIIgICAgICAgIkhlbGxvLCBXb3JsZCEiDQogIOKU giAgICAgXQ0KICDilIIgICBdDQogIOKUgiB9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCkR1bmUg RGV2ZWxvcGVyIFByZXZpZXcgVXBkYXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVu ZS1kZXZlbG9wZXItcHJldmlldy11cGRhdGVzLzE1MTYwLzE+DQoNCg0Kb3N0ZXJhIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SnVzdCB3YW50ZWQgdG8gc2hhcmUgc29tZSBvZiB0aGUgd29yayB0aGUgRHVuZSBoYXMgYmVlbiB1 cCB0byBsYXRlbHkNCiAgcmU6IHRoZSBEZXZlbG9wZXIgUHJldmlldyB3ZSBhbm5vdW5jZWQgW2hl cmVdIDopIOKAkyB3ZSdsbCBiZSB1c2luZyB0aGlzDQogIHRocmVhZCB0byBzaGFyZSBtb3JlIHVw ZGF0ZXMgYXMgdGhpbmdzIGdvLg0KDQogIEFzIGFsd2F5cywgd2UgaG9sZCBvdXIgRHVuZSBEZXZl bG9wZXIgbWVldGluZ3MgaW4gcHVibGljIGFuZCB5b3UncmUNCiAgbW9yZSB0aGFuIHdlbGNvbWUg dG8gc3Vic2NyaWJlIHRvIG91ciBwdWJsaWMgQ2FsZW5kYXIgKFtHb29nbGVdLA0KICBbaUNhbF0p DQoNCg0KW2hlcmVdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXBsYXRmb3Jt LW5ld3NsZXR0ZXItbWFyY2gtbWF5LTIwMjQvMTQ3NjU+DQoNCltHb29nbGVdDQo8aHR0cHM6Ly9j YWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL2VtYmVkP3NyYz1jXzVjZDY5OGRmNjc4NGUzODVi MWNkY2RjMWRiY2ExOGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzczMTklNDBncm91cC5j YWxlbmRhci5nb29nbGUuY29tJmN0ej1FdXJvcGUlMkZTdG9ja2hvbG0+DQoNCltpQ2FsXQ0KPGh0 dHBzOi8vY2FsZW5kYXIuZ29vZ2xlLmNvbS9jYWxlbmRhci9pY2FsL2NfNWNkNjk4ZGY2Nzg0ZTM4 NWIxY2RjZGMxZGJjYTE4YzA2MWZhYTk2OTU5YTA0NzgxNTY2ZDMwNGRjOWVjNzMxOSU0MGdyb3Vw LmNhbGVuZGFyLmdvb2dsZS5jb20vcHVibGljL2Jhc2ljLmljcz4NCg0KR2V0dGluZyByZWFkeSBm b3IgdGhlIFB1YmxpYyBCZXRhDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBBcyB3ZSBwcmVwYXJlIGZvciB0aGUgcHVibGljIGJldGEsIHdlJ3JlIHJhbXBp bmcgdXAgdGhlIERYIGludGVydmlld3MNCiAgYW5kIGVuc3VyaW5nIHRoZSBmaXJzdCBmZXcgdXNl cnMgd2lsbCBoYXZlIGEgZnVuLCBwcm9kdWN0aXZlDQogIGV4cGVyaWVuY2Ugd2l0aCB0aGUgZGV2 ZWxvcGVyIHByZXZpZXcuDQoNCiAgICAgICAgOmluYm94X3RyYXk6IElmIHlvdSBzaWduZWQgdXAg Zm9yIHRoZSBEZXYgUHJldmlldyBiYWNrIGluDQogICAgICAgIE1heSwgY2hlY2sgeW91ciBpbmJv eCBmb3IgYSBsaW5rIGFuZCBpbnN0cnVjdGlvbnMgdG8NCiAgICAgICAgc2NoZWR1bGUgeW91ciBE WCBpbnRlcnZpZXcgd2l0aCB1cy4NCg0KICBIZXJlJ3MgYSBzYW1wbGUgdmlkZW8gKFtNYXN0b2Rv bl0gb3IgW1hdKSB3aGVyZSB5b3UgY2FuIHNlZSBtZQ0KICBidWlsZGluZyB0aGUgUmlvdCBwcm9q ZWN0IG9uIGEgbWFjaGluZSB0aGF0IGRvZXMgbm90IGhhdmUgT0NhbWwNCiAgaW5zdGFsbGVkLiBJ dCBpcyBwcmV0dHkgbmVhdCENCg0KICBTZXJpb3VzbHksIGJpZyBzaG91dG91dCB0byB0aGUgRHVu ZSB0ZWFtIGF0IFRhcmlkZXNbMF0gd2hvIGhhdmUgYmVlbg0KICBkb2luZyBhIHBoZW5vbWVuYWwg am9iIDpjbGFwOiA6c3BhcmtsZXM6IDpjYW1lbDoNCg0KICBTbyBoZXJlJ3Mgd2hhdCBnZXR0aW5n IHN0YXJ0ZWQgd2l0aCBPQ2FtbCBsb29rcyBsaWtlIHRvZGF5IHdpdGggdGhlDQogIER1bmUgRGV2 ZWxvcGVyIFByZXZpZXcgYXMgb2YgdG9kYXkgKEF1Z3VzdCAxOSAyMDI0KToNCg0KICAxLiBnZXQg YGR1bmUnIGZyb20gb3VyIGJpbmFyeSBkaXN0cmlidXRpb24g4oCTIHdlJ2xsIHNvb24gbWFrZSB0 aGlzDQogICAgIHB1YmxpYyENCiAgMi4gcnVuIGBkdW5lIHBrZyBsb2NrJyBpbiB5b3VyIGZhdm9y aXRlIHByb2plY3QNCiAgMy4gcnVuIGBkdW5lIGJ1aWxkJw0KDQogIFRoYXQncyBpdC4gTm8gbmVl ZCB0byBpbnN0YWxsIGFueXRoaW5nIGVsc2UsIER1bmUgd2lsbCBzZWUgdGhhdCBsb2NrDQogIGZp bGUsIGZldGNoLCBhbmQgYnVpbGQgYWxsIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMuDQoNCiAgICAg ICAgOndvcmxkX21hcDogVGhlc2UgYXJlIHNvbWUgc3Ryb25nIHN0ZXAgdG93YXJkcyB0aGUgW09D YW1sDQogICAgICAgIFBsYXRmb3JtIHZpc2lvbiBmb3IgMjAyNl0sIHRoYXQgd2UgYXJlIGFjdGl2 ZWx5IHdvcmtpbmcNCiAgICAgICAgdG93YXJkcy4gSWYgeW91IGhhdmUgYW55IHRob3VnaHRzIG9y IGZlZWRiYWNrIHBsZWFzZSBsZXQNCiAgICAgICAgbWUga25vdyENCg0KICBUaGVyZSBhcmUgbW9y ZSBpbXByb3ZlbWVudHMgY29taW5nIHRoYXQgd2lsbCBoZWxwIHJlbW92ZSBmcmljdGlvbiB0bw0K ICBnZXQgc3RhcnRlZCBhbmQgY3JlYXRpbmcgYSBkZWxpZ2h0ZnVsIGV4cGVyaWVuY2UuIEJvdGgg b2YgdGhlc2UgdGhpbmdzDQogIHdlIHN0cm9uZ2x5IGJlbGlldmUgd2lsbCBoZWxwIG9uYm9hcmQg bmV3IHVzZXJzIHRvIHRoZSBPQ2FtbCB3b3JsZC4NCg0KICBIZXJlJ3MgYSBmZXcgaW4gdGhlIHdv cmtzOg0KDQogIOKAoiAqVmFyaW91cyBEWCBpbXByb3ZlbWVudHMqIOKAkyBmcm9tIG5ldyBvdXRw dXRzIHRvIHNpbXBsaWZpZWQNCiAgICAgd29ya2Zsb3dzLCB3ZSB3YW50IHRvIG1ha2UgdXNpbmcg RHVuZSBqdXN0IGRlbGlnaHRmdWwuDQogIOKAoiAqQnVuZGxlZCBzdXBwb3J0IGZvciBkZXYgdG9v bHMqIChvY2FsbWZvcm1hdCwgb2RvYywgbHNwKSDigJMgdGhlDQogICAgIGRlZmF1bHQgdG9vbHNl dCB3aWxsIGJlIGF2YWlsYWJsZSB3aXRob3V0IGFueSBleHRyYSBzdGVwcyEganVzdA0KICAgICBj YWxsIGBkdW5lIGZtdCcsIGFuZCBpdCB3b3Jrcy4gTm8gbmVlZCB0byBtYW51YWxseSBpbnN0YWxs IGFueXRoaW5nDQogICAgIGVsc2UuDQogIOKAoiAqQXV0b21hdGljIGRlcGVuZGVuY3kgbG9ja2lu Zyog4oCTIHdoZW4gYnVpbGRpbmcsIGFuZCBldmVuIG9uIHdhdGNoDQogICAgIG1vZGUsIER1bmUg d2lsbCBsb2NrIHlvdXIgZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQgYW5kIGtlZXAgdGhlIGxvY2sN CiAgICAgdXAgdG8gZGF0ZS4NCiAg4oCiICpDcm9zcy1wcm9qZWN0IENhY2hpbmcqIOKAkyBieSBk ZWZhdWx0IHdlJ2xsIGVuYWJsZWQgYSBsb2NhbCBEdW5lDQogICAgIGNhY2hlIHRoYXQgYWNyb3Nz IHRoZSBzeXN0ZW0sIHNvIHlvdSBuZXZlciByZWJ1aWxkIHRoZSBzYW1lDQogICAgIGRlcGVuZGVu Y3kgZXZlbiBhY3Jvc3MgcHJvamVjdHMuDQogIOKAoiAqU2lnbmVkIGJpbmFyaWVzIHdpdGggY2Vy dGlmaWNhdGVzIG9mIG9yaWdpbiog4oCTIHdlIGNhcmUgZGVlcGx5IGFib3V0DQogICAgIHNlY3Vy aXR5IGFuZCB3YW50IHRvIG1ha2Ugc3VyZSB0aGF0IGFueSBiaW5hcnkgd2Ugc2hpcCB3aWxsIGJl DQogICAgIGVhc2lseSB2ZXJpZmllZCBhbmQgdHJhY2tlZCBiYWNrIHRvIGl0cyBzb3VyY2VzLg0K DQogIFN0YXkgdHVuZWQhIDp3YXZlOg0KDQogIFBTOiBoZXJlJ3MgYSBsb25nZXIgdmlkZW8gKFtN YXN0b2Rvbl0sIFtYXSkgc2hvd2luZyB5b3UgdGhlIHNldHVwIGZvcg0KICBPQ2FtbCBmcm9tIHpl cm8sIGNyZWF0aW5nIGEgbmV3IHByb2plY3QsIGFuZCBhZGRpbmcgYSBkZXBlbmRlbmN5LCBhbGwN CiAgd2l0aGluIH41IG1pbnV0ZXMNCg0KICBbMF0gQGVtaWxsb24gQExlb25pZGFzIEBncmlkYnVn cyBAdG1hdHRpby4gQW1icmUgU2h1bWF5LCBBbHBoYSBEaWFsbG8sDQogIEV0aWVubmUgTWFyYWlz DQoNCg0KW01hc3RvZG9uXSA8aHR0cHM6Ly9tYXMudG8vZGVjay9AbGVvc3RlcmEvMTEyOTg4ODQx MjA3NjkwNzIwPg0KDQpbWF0gPGh0dHBzOi8veC5jb20vbGVvc3RlcmEvc3RhdHVzLzE4MjU1MTk0 NjU1Mjc2NzMyMzg+DQoNCltPQ2FtbCBQbGF0Zm9ybSB2aXNpb24gZm9yIDIwMjZdDQo8aHR0cHM6 Ly9vY2FtbC5vcmcvdG9vbHMvcGxhdGZvcm0tcm9hZG1hcD4NCg0KW01hc3RvZG9uXSA8aHR0cHM6 Ly9tYXMudG8vZGVjay9AbGVvc3RlcmEvMTEyOTg4ODgwMjkwODE1MzU2Pg0KDQpbWF0gPGh0dHBz Oi8veC5jb20vbGVvc3RlcmEvc3RhdHVzLzE4MjU1MTk0Njk3NTk4MTIwNjI+DQoNCg0KUHB4bGli IGRldiBtZWV0aW5ncw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9wcHhsaWItZGV2LW1lZXRpbmdzLzEyNDQxLzI5Pg0KDQoNCk5hdGhhbiBSZWJvdXJzIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBtb250aCdzIG1lZXRpbmcgaXMgc2NoZWR1 bGVkIGZvciB0b21vcnJvdywgW2RhdGU9MjAyNC0wOC0yMA0KICB0aW1lPTE3OjAwOjAwIHRpbWV6 b25lPSJFdXJvcGUvTG9uZG9uIl0hDQoNCiAgVGhlIG1lZXRpbmcgYWdlbmRhIHRodXMgZmFyIGlz IHRvIGRpc2N1c3MgdGhlIGZvbGxvd2luZzoNCg0KICDigKIgKjUuMiBCdW1wIFByb2dlc3MqDQog ICAg4oCiIEF1dG8tZ2VuZXJhdGUgQVNUIHBhdHRlcm4gY29kZSBhbmQgbGFiZWxsZWQgYXJndW1l bnRzDQogICAgICAoZS5nLiBgdmFsdWVfYmluZGluZyB+Y29uc3RyYWludF86bm9uZScgYnV0IG5v IHBvc2l0aW9uYWwNCiAgICAgIGFyZ3VtZW50PykNCiAgICDigKIgYEFzdF9oZWxwZXIuRXhwLmZ1 bmN0aW9uXycgZGVwcmVjYXRpb24NCiAgICDigKIgW29wYW0tcmVwb3NpdG9yeSBvdmVybGF5IGZv ciA1LjIgQVNUIGJ1bXBdDQogIOKAoiAqSXNzdWVzIGluIG1pZ3JhdGlvbnMqDQogICAg4oCiIEJ1 bXBpbmcgdGhlIEFTVCBoYXMgdW5jb3ZlcmVkIGlzc3VlcyBpbiBtaWdyYXRpbmcgY29kZSB1cCBh bmQgZG93bg0KICAgICAgdGhlIGludGVybmFsIHBweGxpYiBBU1RzIOKAkyB3b3VsZCBiZSBnb29k IHRvIGRpc2N1c3MgdGhpcyBhbmQgYWxzbw0KICAgICAgaG93IHRvIG1pdGlnYXRlIHRoaXMgZ29p bmcgZm9yd2FyZC4NCiAg4oCiICpEb2N1bWVudGF0aW9uKg0KICAgIOKAoiBHcmVhdCB1c2VyIGZl ZWRiYWNrIGZyb20gW1BweGxpYjogR2V0dGluZyB0aGUgb3JpZ2luYWwgZGVmaW5pdGlvbg0KICAg ICAgb2YgYHR5cF9jb25zdHInIGxpa2UgYHR5cGVfZGVjbGFyYXRpb24nIGZyb20gYGNvcmVfdHlw ZScgb2YNCiAgICAgIGBwdHlwX2NvbnN0ciddIHdoaWNoIHdlIHNob3VsZCB0YWtlIG9uYm9hcmQg YW5kIHdvcmsgaW50bw0KICAgICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGli L2lzc3Vlcy8zMjQ+DQogIOKAoiAqU29tZSBjYXJyeSBvdmVyIGl0ZW1zIGZyb20gbGFzdCBtb250 aCoNCiAgICDigKIgSW4gZ2VuZXJhbCB3aGF0IGlzIHRoZSBtZWRpdW0gdGVybSBnb2FscyBmb3Ig cHB4bGliPyBNb3N0bHkNCiAgICAgIG1haW50ZW5hbmNlIGFuZCBidW1waW5nIHRoZSBBU1Qva2Vl cGluZyB1cCB3aXRoIGNvbXBpbGVyIHJlbGVhc2VzPw0KDQogIFRoZSBtZWV0aW5nIHdpbGwgYmUg aG9zdGVkIG9uIGdvb2dsZSBtZWV0IGhlcmU6DQogIDxodHRwczovL21lZXQuZ29vZ2xlLmNvbS95 eHctZWpudS1janU+DQoNCiAgRXZlcnlvbmUgaXMgdmVyeSB3ZWxjb21lIHRvIGpvaW4hIDpjYW1l bDoNCg0KDQpbb3BhbS1yZXBvc2l0b3J5IG92ZXJsYXkgZm9yIDUuMiBBU1QgYnVtcF0NCjxodHRw czovL2dpdGh1Yi5jb20vcGF0cmljb2ZlcnJpcy9vcGFtLXBweGxpYi1yZXBvc2l0b3J5Pg0KDQpb UHB4bGliOiBHZXR0aW5nIHRoZSBvcmlnaW5hbCBkZWZpbml0aW9uIG9mIGB0eXBfY29uc3RyJyBs aWtlDQpgdHlwZV9kZWNsYXJhdGlvbicgZnJvbSBgY29yZV90eXBlJyBvZiBgcHR5cF9jb25zdHIn XQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9wcHhsaWItZ2V0dGluZy10aGUtb3JpZ2lu YWwtZGVmaW5pdGlvbi1vZi10eXAtY29uc3RyLWxpa2UtdHlwZS1kZWNsYXJhdGlvbi1mcm9tLWNv cmUtdHlwZS1vZi1wdHlwLWNvbnN0ci8xNTExMD4NCg0KDQpQcmFnbWF0aWMgQ2F0ZWdvcnkgVGhl b3J5OiBQYXJ0IDIgcHVibGlzaGVkIQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9uZXctcGFydC1wcmFnbWF0aWMtY2F0ZWdv cnktdGhlb3J5LXBhcnQtMi1wdWJsaXNoZWQvMTUwNTYvNj4NCg0KDQpEbWl0cmlpIEtvdmFuaWtv diBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkganVzdCBwdWJsaXNo ZWQgW3RoZSBzZWNvbmQgcGFydF0gb2YgbXkgc2VyaWVzLCBzbyBJIHVwZGF0ZWQgdGhlDQogIHRv cGljLg0KDQogIExldCBtZSBrbm93IHdoZW4gbm90aWZpY2F0aW9ucyBiZWNvbWUgdG9vIG5vaXN5 IDpzbGlnaHRfc21pbGU6DQoNCg0KW3RoZSBzZWNvbmQgcGFydF0NCjxodHRwczovL2Rldi50by9j aHNoZXJzaC9wcmFnbWF0aWMtY2F0ZWdvcnktdGhlb3J5LXBhcnQtMi1jb21wb3Npbmctc2VtaWdy b3Vwcy04Nz4NCg0KDQpEdW5lIGRldiBtZWV0aW5nIG9uIDIwMjQtMDgtMjEsIDEwYW0gQ0VTVA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tZHVuZS1kZXYtbWVldGluZy1vbi0yMDI0LTA4LTIxLTEwYW0tY2VzdC8xNTE2Ni8xPg0KDQoN ClN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkhIFRoZSBu ZXh0IHB1YmxpYyBkdW5lIGRldiBtZWV0aW5nIHdpbGwgYmUgaGVsZCBvbiAyMDI0LTA4LTIxLCAx MGFtDQogIENFU1QuIFBsZWFzZSBmZWVsIGZyZWUgdG8gbGV0IG1lIGtub3cgYW55IHRvcGljcyB5 b3UnZCBsaWtlIHVzIHRvDQogIGRpc2N1c3MgYW5kIEknbGwgdXBkYXRlIFt0aGUgbWVldGluZyBu b3Rlc10uIFRoZSB6b29tIGxpbmsgZm9yIHRoZQ0KICBtZWV0aW5nIGlzOg0KICA8aHR0cHM6Ly91 czA2d2ViLnpvb20udXMvai84NTA5Njg3Nzc3Nj9wd2Q9Y1dOaFUxZEhRMVpOU2padU9VWkNRMGgy Ynk5VWR6MDk+DQoNCg0KW3RoZSBtZWV0aW5nIG5vdGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9kdW5lL3dpa2kvZGV2LW1lZXRpbmctMjAyNC0wOC0yMT4NCg0KDQpPdGhlciBPQ2FtbCBO ZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K RnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtz IGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJs b2ddLg0KDQogIOKAoiBbVGhlIG5ldyBUYXIgcmVsZWFzZSwgYSByZXRyb3NwZWN0aXZlXQ0KDQoN Clt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1RoZSBu ZXcgVGFyIHJlbGVhc2UsIGEgcmV0cm9zcGVjdGl2ZV0NCjxodHRwczovL2Jsb2cucm9idXIuY29v cC9hcnRpY2xlcy90YXItcmVsZWFzZS5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBt ZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9v ayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4N Cg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5 b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0 dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNo bmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJp YS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 13 to 20, 2024.

    MlFront - A Java-like package system for OCaml

    jbeckford announced

    There is now a new library MlFront_Top with a build tool mlfront-top that will generate self-contained OCaml toplevel script= files with parallelism based on @c-cube's moonpool library:

    .
    =E2=94=9C=E2=94=80=E2=94=80 AcmeWidgets_Std/
    =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 JobsA1.ml
    =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 JobsA2.ml
    =E2=94=94=E2=94=80=E2=94=80 BobBuilder_Std/
        =E2=94=94=E2=94=80=E2=94=80 JobsB.ml
    
    $ mlfront-top -o buildscript.ml
    
    $ ocaml buildscript.ml -j 2 -native
      legend: -> start | <- finish
         directory create: target/
         file create: target/AcmeWidgets_Std.ml
         link create: AcmeWidgets_Std/JobsA1.ml -> target/AcmeWidgets_Std__J=
    obsA1.ml
         link create: AcmeWidgets_Std/JobsA2.ml -> target/AcmeWidgets_Std__J=
    obsA2.ml
         link create: BobBuilder_Std/JobsB.ml -> target/BobBuilder_Std__Jobs=
    B.ml
      -> compile: AcmeWidgets_Std.JobsA1
      -> compile: AcmeWidgets_Std.JobsA2
      <- compile: AcmeWidgets_Std.JobsA1
      <- compile: AcmeWidgets_Std.JobsA2
      -> compile: AcmeWidgets_Std
      <- compile: AcmeWidgets_Std
      -> compile: BobBuilder_Std.JobsB
      <- compile: BobBuilder_Std.JobsB
      -> executable create: BobBuilder_Std.JobsB
      <- executable create: BobBuilder_Std.JobsB
      done.
    
    $ target/BobBuilder_Std.JobsB
    I am an A1!
    I am an A2!
    I am a B!
    

    It requires the ocaml binary and ocamlc or = ocamlopt. The complete example is at http= s://gitlab.com/dkml/build-tools/MlFront/-/blob/0.4.0-6/tests/MlFront_Top/jo= bs.t/run.t.

    Rpmfile library v0.3.0 with new Eio-based reader

    Mikhail announced

    Today I want to tell you about new version of Rpmfile library. Rpmfile is a library for reading meta= data from RPM= packages. Originally Rpmfile's parser (reader) used Angstrom for parsing. And in the ne= w release added new modern Eio-based reader.=20

    Globally, the project is now split into four packages: rpmfile= , which contains signatures and implementation-independent functions, rpmfile-unix with the original Angstrom parser, and rpmfile-e= io (with rpmfile-cli) written using Eio.

    My experience porting to Eio

    Eio is a fantastic effect-based I/O library for a more modern age in multic= ore OCaml. I think it takes the best ideas from the ecosystem. So built-in = Buf_read and Buf_write modules implement ideas fr= om Angstrom and Faraday libraries. Almost API one-to-one, allowing porting = via copy-paste.=20

    But, of course, not everything is so perfect. Unlike the Angstrom.par= se_ function, the Buf_read.parse function thinks I want= to read a whole stream to end of input.

    A snippet of the source code:

    let parse ?initial_size ~m=
    ax_size p flow =3D
      let buf =3D of_flow flow ?initial_size ~max_size in
      format_errors (p <* end_of_input) buf
      (*               ^^^^^^^^^^^^^^^     =
          
                        0_0=
     nice (not)     =
       *)
    

    So I had to rewrite this function myself in a form similar to Angstro= m.Consume.Prefix.

    • Is it a signed or unsigned integer?

      BE.uint16 and other similar functions are signed int ev= en though they have the prefix u in the name for some reason.

    • And a few other differences
      • Angstrom.advance is skip
      • Angstrom.pos is consumed_bytes

    P.S.

    Thanks for your attention!

    GitHub - meta-introspector/ocaml-libppx-import-yojson-introspe= ctor: Using libppx, ppx_import, reflect over ast using

    Jim Dupont announced

    Here is a working first version (with warts) of a ppxlib to yojson converte= r, am still testing it but the hello world is working, I have tried multiple t= imes to get this to work,=20 and finally settled on the import route to override the type system. code here: https://github.com/meta-introspector/ocaml-libppx-import-yojs= on-introspector

    example snippet

    {
      "pexp_desc": [
        "Pexp_constant",
        [
          "Pconst_string",
          "Hello, World!"
        ]
      ]
    }
    

    Dune Developer Preview Updates

    ostera announced

    Just wanted to share some of the work the Dune has been up to lately re: th= e Developer Preview we announced here :) =E2=80=93 we'll be= using this thread to share more updates as things go.

    As always, we hold our Dune Developer meetings in public and you're more th= an welcome to subscribe to our public Calendar (Google, iCal)

    Getting ready for the Public Beta

    As we prepare for the public beta, we're ramping up the DX interviews and e= nsuring the first few users will have a fun, productive experience with the= developer preview.

    :inbox_tray: If you signed up for the Dev Preview back in May, check your i= nbox for a link and instructions to schedule your DX interview with us.

    Here's a sample video (Mastodon or X) where you can see me building the Riot project on a mach= ine that does not have OCaml installed. It is pretty neat!

    Seriously, big shoutout to the Dune team at Tarides[0] who have been doing = a phenomenal job :clap: :sparkles: :camel:=20

    So here's what getting started with OCaml looks like today with the Dune De= veloper Preview as of today (August 19 2024):

    1. get dune from our binary distribution =E2=80=93 we'll soon= make this public!
    2. run dune pkg lock in your favorite project
    3. run dune build

    That's it. No need to install anything else, Dune will see that lock file, = fetch, and build all necessary dependencies.

    :world_map: These are some strong step towards the OCaml Platform vision for 2026, that we ar= e actively working towards. If you have any thoughts or feedback please let= me know!

    There are more improvements coming that will help remove friction to get st= arted and creating a delightful experience. Both of these things we strongl= y believe will help onboard new users to the OCaml world.

    Here's a few in the works:

    • Various DX improvements =E2=80=93 from new outputs to simplified= workflows, we want to make using Dune just delightful.
    • Bundled support for dev tools (ocalmformat, odoc, lsp) =E2=80=93= the default toolset will be available without any extra steps! just call <= code>dune fmt, and it works. No need to manually install anything el= se.
    • Automatic dependency locking =E2=80=93 when building, and even o= n watch mode, Dune will lock your dependencies by default and keep the lock= up to date.
    • Cross-project Caching =E2=80=93 by default we'll enabled a local= Dune cache that across the system, so you never rebuild the same dependenc= y even across projects.
    • Signed binaries with certificates of origin =E2=80=93 we care de= eply about security and want to make sure that any binary we ship will be e= asily verified and tracked back to its sources.

    Stay tuned! :wave:=20

    PS: here's a longer video (Mastodon, X) showing you the setup for OCaml from zero, creating a = new project, and adding a dependency, all within ~5 minutes

    [0] @emillon @Leonidas @gridbugs @tmattio. Ambre Shumay, Alpha Diallo, Etie= nne Marais

    Ppxlib dev meetings

    Nathan Rebours announced

    This month's meeting is scheduled for tomorrow, [date=3D2024-08-20 time=3D1= 7:00:00 timezone=3D"Europe/London"]!

    The meeting agenda thus far is to discuss the following:

    The meeting will be hosted on google meet here: https://meet.google.com/yxw-ejnu-cju

    Everyone is very welcome to join! :camel:

    Pragmatic Category Theory: Part 2 published!

    Dmitrii Kovanikov announced

    I just published the second part of my series, so I u= pdated the topic.

    Let me know when notifications become too noisy :slight_smile:

    Dune dev meeting on 2024-08-21, 10am CEST

    Steve Sherratt announced

    Hi! The next public dune dev meeting will be held on 2024-08-21, 10am CEST.= Please feel free to let me know any topics you'd like us to discuss and I'= ll update the meeting notes. The zoom link for the meeting is: https://us06web.zoom.us/j/85096877776?pwd=3DcWNhU1dHQ1ZNSjZuOUZCQ0h2by9Udz= 09

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=opCCqzJC; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=q3ferS5w; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 334C1B80123 for ; Tue, 27 Aug 2024 10:02:18 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=E/x8pPKQigCMcWTOntPduRfOZPNwPKZu8aTeeq047HU=; b=opCCqzJCohPJ/DNChHWTA57PWk3Kj3ZQAFvbt0Xl8L6r/LvgRigF8RiL NiFu2ue7JrRYcLNqygLGH/fADnEuystnrVHznM2MsKSo7vIkLKfQQwMVC vtMMXf1dNdw10pK0qeD9DJUyYmQ8tE/AX32Zs8FFYC/H3/GIIwZCTOqkY I=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,180,1719871200"; d="scan'208,217";a="180215907" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 Aug 2024 11:02:18 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3F330E00B7; Tue, 27 Aug 2024 11:02:18 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4F52EE0133 for ; Tue, 27 Aug 2024 11:02:11 +0200 (CEST) IronPort-SDR: 66cd9612_yBJCmdwxLTH8uHV2U4lX8OKBmo+LNU2OXDysbL14gUSGgON LxwTxl5AxQOFPiNh/9l0XO5nqhEyBJJlSezwuvw== X-IPAS-Result: =?us-ascii?q?A0FhAgBFlc1mkCIeaIFagliBQYEDGQFjWjMHCEiEVoNPj?= =?us-ascii?q?h+cQIFWgUA5FAEDAQ0uAQwGAQIEAQEDAQIBhQACiWkCHwYBBDIHDgECBAEBA?= =?us-ascii?q?QEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBPkmFdQ2CRhkVI1EeZ?= =?us-ascii?q?QkGAQEBAQEBAQEBAgEBASIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAgwBgScKEwEBKw0YIwMUAQYDAhEBNQMBEwESFAaCZ?= =?us-ascii?q?gGCZAMFDAaUCZs8eoEygQGCDAEBBoEIPgIBCwJD2gSBYwmBSIgxGgEqSGoCh?= =?us-ascii?q?EKEOicPgVVEgRU1gkRvgj8LFwEBAQGBOQMBAU0JgyWCaYFYhExOB4RqaVoSg?= =?us-ascii?q?QhFSSiBYTwpeQdxAgYWCEsICQoEJlY2IQMMVxkzJT9UDoFFVWh8IwKBIxCFH?= =?us-ascii?q?oF7gRqCD4EniDWBR0szIRMBVRMXCwkFZIYPgkqDKYIUhBiFJ4FnCWGHbYFvg?= =?us-ascii?q?T6BWkeCdUuFX4EEgllsTjwCDQI3gjYpdIE/HUADC209NRQbqB0EDScBgVoBg?= =?us-ascii?q?gYOTQgUAx8MAQEvAwMHDAgOAiIuCA4qCAMZGRIJHS0LDS0DkkkoBScBshA0B?= =?us-ascii?q?4QXgV0GDIkCgSSVcoVbpGgimE4iiVSBJQmBbWqIbhaMCjwIhUyBbgkqSWIbA?= =?us-ascii?q?wwHMxowQ4JnCUYcD5IbEIEugxsHNMZsQTUCAQE3AgcBCgEBAwmFYgEBhgZrY?= =?us-ascii?q?AEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 uGQ3kUD IronPort-HdrOrdr: A9a23:0LY3YaGGjaWUZrtopLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:WBu2B2+hyCsMDG9+g/qVvwk+Ef4GVFfS8E7zf0nlNkdSSIaIQlDFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3A2/NcTQzfGFpEGziuUKpa7kT83tCaqJ6xVxAhjIk?= =?us-ascii?q?7geyBKjVOEAfNoQqeeIByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,180,1719871200"; d="scan'208,217";a="180215860" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFJy8ApIXD0jNtJ6jC8qm4MfrX0xTpOxH2eB1?= =?us-ascii?q?tud5hqkiJsKbsSM2XL7FPJ6aIvOXLPKbquTaVg4fsUWpX+FJ+gBYH1FB?= =?us-ascii?q?7UuuEuJHbPVMqNU1CNffM3ZkQVBbtPtCEigVqY47VjnggiHQ+lnO5kdP?= =?us-ascii?q?EH9XOZtTRPb8g+EOC5CCpZww=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Aug 2024 11:02:10 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 959E65648EE; Tue, 27 Aug 2024 11:02:09 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1724749329; bh=/o/K/L6xuNUVz1geDc7XF5YrzqSWl9guxTvuxJjVq2A=; h=From:To:Subject:Date:Message-ID; b=q3ferS5wlttpgbaKWgogRYXUm/gUpuspKmmSQkzZUq2Oy3LoymW/guTy5YxlX9GvQ 9/w3sMmD1HnxCUh6TQ8674wQZMOZcX+pMgX+07U5odujFHJERNb43rR2nODf96G/Un avIgDX3I1kgt3GZdTwpYce2bFrVyB3E27WStmkKU= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 27 Aug 2024 11:02:09 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 27 11:02:09 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.104229, queueID=C1CF8564935 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19175 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 20 to 27, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 DkML 2.1.2 and opam 2.2.0 Outreachy Demo Presentation opam 2.2.1 Ppxlib dev meetings First release of corosync Other OCaml News Old CWN DkML 2.1.2 and opam 2.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The major focus of DkML 2.1.2 is shipping it with opam 2.2 and having /some/ coexistence between DkML and opam 2.2 on Windows. You can skip this post if you don't develop on Windows. TLDR: Upgrade with `winget upgrade dkml'. Use `opam-real' to use pure opam 2.2 but only *after* installing Visual Studio 2022 (confer: release notes); example: `opam-real switch create 5.2.0+msvc'. Use `dk Ml.Switch init' to create DkML 4.14.2 switch. DkML has better MSVC package support today, while pure opam 2.2 has latest OCaml 5 and is the standard going forward; now you choose both without compromise. Major changes: =E2=80=A2 Uses opam 2.2.0. You can directly use unmodified opam 2.2 with `opam-real switch create 5.2.0+msvc'. Or continue to use `dk Ml.Switch init' (or the deprecated `dkml init') to create a DkML 4.14.2 switch which supports more native MSVC Windows packages (for now) but does not have the latest and experimental OCaml language features. =E2=80=A2 Support Windows SDK 11 (10.0.22621.0) and VC 17.9 and 17.10 (14.39/4x) added to allowed list. This makes it easier to coexist with opam 2.2 which requires Visual Studio 2022, and supports latest GitLab CI with its preinstallation of Visual Studio 2022. =E2=80=A2 The ocaml/opam-repository tag was advanced to Aug 15, 2024. =E2=80=A2 You can continue to use `dkml.exe' and `with-dkml.exe' but both= are deprecated. The new (unified) executable is `dk.exe'. See "Deprecated Commands" in the release notes. =E2=80=A2 Once every two weeks DkML news about new versions, errata, uninstalling, etc. will be shown on a webpage. It is triggered from the now deprecated `dkml init', the replacement `dk Ml.Switch init' and the `with-dkml' proxy commands, and can be disabled with `dk Ml.News disable'. In particular, use `dk Ml.News' to show the news if you are experiencing problems with DkML. =E2=80=A2 The patches to the OCaml compiler are now dual-licensed with OC= aml's LGPL 2.1 exception and Apache 2.0. All other source (especially the build scripts) for the DkML compiler is licensed solely with Apache 2.0. This is a follow-up to . =E2=80=A2 The uninstaller/upgrader stops `opam', `dune' and other OCaml processes since, on Windows, in-use executables can't be deleted or updated. This feature is not foolproof yet. =E2=80=A2 ull release notes are at . Enjoy! And thanks to OCSF for supporting Windows in the last couple of gap years. /Bug reports: [GitHub users] or [[/-/issues][GitLab users]]./ [GitHub users] Outreachy Demo Presentation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my pleasure to announce that next Friday [date=3D2024-08-30 time=3D13:00:00 timezone=3D"Europe/London"] we will host the Outreachy Demo presentation. We invite all of the OCaml community and beyond to join us in celebrating the hard work of the community's three interns who have been working on: =E2=80=A2 [ocaml-api-watch]: _Libraries and tools to keep watch on you OC= aml lib's API changes_ =E2=80=A2 [diffcessible]: _a terminal based diff viewer with an emphasis = on being accessible_ =E2=80=A2 [ocaml-practice-exercises]: _Practice exercises for learning OC= aml supporting GitHub Codespaces, Replit, and locally with Jupyter Notebook or directly on your machine._ We'll post the meeting link closer to the time. Hopefully see you there! :camel: [ocaml-api-watch] [diffcessible] [ocaml-practice-exercises] opam 2.2.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: R. Boujbel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce the release of opam 2.2.1. We've fixed a couple of regressions and would like to encourage users of opam 2.2 to upgrade: =E2=80=A2 Fix a regression in `opam install --deps-only' where the direct dependencies were not set as root packages =E2=80=A2 Fix a regression when fetching git packages where the resulting= git repository could lead to unexpected outputs of git commands, by disabling shallow clone by default except when fetching an opam repositories =E2=80=A2 Mitigate [curl/curl#13845] by falling back from `--write-out' to `--fail' if exit code 43 is returned by curl. In particular, this fixes `opam init' when run from cmd/PowerShell on Windows 11 23H2 You=E2=80=99ll find more information in the [release blog post ]. To upgrade, simply run for Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocam= l/opam/master/shell/install.sh) --version 2.2.1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubus= ercontent.com/ocaml/opam/master/shell/install.ps1) }" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [curl/curl#13845] [release blog post ] David Allsopp then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Windows 11 users are strongly encouraged to upgrade to opam 2.2.1 for the mitigation for curl 8.8.0. opam 2.2.1 is also available via `winget', with `winget upgrade OCaml.opam'. The `OCaml.opam' winget package downloads the opam binary from GitHub releases page (thanks to @prometheansacrifice, for contributing the original package!), so installing via winget is functionally equivalent to using our `install.ps1' script. Ppxlib dev meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This week's [meeting notes are available online]. Here's a brief TL;DR of some of the main points of discussion. =E2=80=A2 *5.2 AST bump progress* is waiting for patches to as many ppxes= as possible and for fixes to the migration bug(s) (see next bullet point). If ppx authors wish to try the new ppxlib they can add an opam-overlay which also contains patches to a few existing ppxes: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam repo add git+https://github.com/patricoferris/opam-ppx= lib-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Nathan has worked on *a better AST printer* inspired by the `ppx_tools' printer and the existing printing functionality of ppxlib. See [this PR] for more details. This should help better *debug AST migration bugs*. It makes good use of the AST lift class. =E2=80=A2 With breakages happening in `Ast_helper' and `Ast_builder' it b= ecame unclear why `Ast_helper' exists at all. There's a move to *deprecate `Ast_helper' and promote the use of `Ast_builder' instead*. This should help reduce maintenance costs and API breakages. =E2=80=A2 We need to *consolidate our documentation better*. There should= be a focus on moving as much documentation to the `mld' and `mli' files as possible. Happy ppxing :camel: ! [meeting notes are available online] [this PR] First release of corosync =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Vincnet Liu announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Aug 2024 - I am happy to announce the release of , a binding to libcorosync. It is not (yet) a complete binding to all the APIs of libcorosync, but the bindings to the following libraries are implemented: 1. libcmap (in memory stats and config database) 2. libquorum and libvotequorum (query of quorum states) 3. libcfg (config reload, etc) 4. libcpg (closed process group, corosync's model of a cluster) This project lives on , and feel free to contact me if you have any questions! Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [MirageVPN and OpenVPN] =E2=80=A2 [How TSan Makes OCaml Better: Data Races Caught and Fixed] [the ocaml.org blog] [MirageVPN and OpenVPN] [How TSan Makes OCaml Better: Data Races Caught and Fixed] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 20 to 27, 2024.

    DkML 2.1.2 and opam 2.2.0

    jbeckford announced

    The major focus of DkML 2.1.2 is shipping it with opam 2.2 and having so= me coexistence between DkML and opam 2.2 on Windows. You can skip this = post if you don't develop on Windows.

    TLDR: Upgrade with winget upgrade dkml. Use opam-real to use pure opam 2.2 but only after installing Visual Studio 20= 22 (confer: release notes); example: opam-real switch create 5.2.0+ms= vc. Use dk Ml.Switch init to create DkML 4.14.2 switch.= DkML has better MSVC package support today, while pure opam 2.2 has latest= OCaml 5 and is the standard going forward; now you choose both without com= promise.

    Major changes:

    • Uses opam 2.2.0. You can directly use unmodified opam 2.2 with op= am-real switch create 5.2.0+msvc. Or continue to use dk Ml.Swi= tch init (or the deprecated dkml init) to create a DkML= 4.14.2 switch which supports more native MSVC Windows packages (for now) b= ut does not have the latest and experimental OCaml language features.
    • Support Windows SDK 11 (10.0.22621.0) and VC 17.9 and 17.10 (14.39/4x) = added to allowed list. This makes it easier to coexist with opam 2.2 which = requires Visual Studio 2022, and supports latest GitLab CI with its preinst= allation of Visual Studio 2022.
    • The ocaml/opam-repository tag was advanced to Aug 15, 2024.
    • You can continue to use dkml.exe and with-dkml.exe but both are deprecated. The new (unified) executable is dk.exe= . See "Deprecated Commands" in the release notes.
    • Once every two weeks DkML news about new versions, errata, uninstalling= , etc. will be shown on a webpage. It is triggered from the now deprecated = dkml init, the replacement dk Ml.Switch init and = the with-dkml proxy commands, and can be disabled with d= k Ml.News disable. In particular, use dk Ml.News to sho= w the news if you are experiencing problems with DkML.
    • The patches to the OCaml compiler are now dual-licensed with OCaml's LG= PL 2.1 exception and Apache 2.0. All other source (especially the build scr= ipts) for the DkML compiler is licensed solely with Apache 2.0. This is a f= ollow-up to https:/= /github.com/ocaml/ocaml/issues/13177.
    • The uninstaller/upgrader stops opam, dune and= other OCaml processes since, on Windows, in-use executables can't be delet= ed or updated. This feature is not foolproof yet.
    • ull release notes are at https://gitlab.com/dkml/distributions/dkml/-/rele= ases/2.1.2.

    Enjoy! And thanks to OCSF for supporting Windows in the last couple of gap = years.

    Bug reports: GitHub users or [[https://gitlab.com/dkml/distributions/dkml-issues][GitL= ab users]].

    Outreachy Demo Presentation

    Patrick Ferris announced

    It is my pleasure to announce that next Friday [date=3D2024-08-30 time=3D13= :00:00 timezone=3D"Europe/London"] we will host the Outreachy Demo presenta= tion. We invite all of the OCaml community and beyond to join us in celebra= ting the hard work of the community's three interns who have been working o= n:

    • ocaml-api-watc= h: Libraries and tools to keep watch on you O= Caml lib's API changes
    • diffcessible: = a terminal based diff viewer with an emphasis on = being accessible
    • ocaml-practice-exercises: Practice exercis= es for learning OCaml supporting GitHub Codespaces, Replit, and locally wit= h Jupyter Notebook or directly on your machine.

    We'll post the meeting link closer to the time. Hopefully see you there! :c= amel:

    opam 2.2.1

    R. Boujbel announced

    We are pleased to announce the release of opam 2.2.1.

    We've fixed a couple of regressions and would like to encourage users of op= am 2.2 to upgrade:

    • Fix a regression in opam install --deps-only where the dir= ect dependencies were not set as root packages
    • Fix a regression when fetching git packages where the resulting git rep= ository could lead to unexpected outputs of git commands, by disabling shal= low clone by default except when fetching an opam repositories
    • Mitigate curl/cur= l#13845 by falling back from --write-out to --fail if exit code 43 is returned by curl. In particular, this fixes opam i= nit when run from cmd/PowerShell on Windows 11 23H2

    You=E2=80=99ll find more information in the release blog post .

    To upgrade, simply run for Unix systems

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.2.1"
    

    from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubuserconten=
    t.com/ocaml/opam/master/shell/install.ps1) }"
    

    David Allsopp then added

    Windows 11 users are strongly encouraged to upgrade to opam 2.2.1 for the m= itigation for curl 8.8.0.

    opam 2.2.1 is also available via winget, with winget upg= rade OCaml.opam. The OCaml.opam winget package download= s the opam binary from GitHub releases page (thanks to @prometheansacrifice, for contr= ibuting the original package!), so installing via winget is functionally equivalent to using our install.ps1 script.

    Ppxlib dev meetings

    Patrick Ferris announced

    This week's meeting notes are available online.

    Here's a brief TL;DR of some of the main points of discussion.

    • 5.2 AST bump progress is waiting for patches to as many ppxes as pos= sible and for fixes to the migration bug(s) (see next bullet point). If ppx= authors wish to try the new ppxlib they can add an opam-overlay which also= contains patches to a few existing ppxes:

      $ opam repo add git+https://github.com/patricoferris/opam-ppxlib-repository=
      .git
      
    • Nathan has worked on a better AST printer inspired by the = ppx_tools printer and the existing printing functionality of ppxlib.= See this PR f= or more details. This should help better debug AST migration bugs. I= t makes good use of the AST lift class.
    • With breakages happening in Ast_helper and Ast_build= er it became unclear why Ast_helper exists at all. Ther= e's a move to deprecate Ast_helper and promote the use of <= code>Ast_builder instead. This should help reduce maintenance co= sts and API breakages.
    • We need to consolidate our documentation better. There should be= a focus on moving as much documentation to the mld and = mli files as possible.

    Happy ppxing :camel: !

    First release of corosync

    Vincnet Liu announced

    Aug 2024 - I am happy to announce the release of https://opam.ocaml.org/packages/corosync/, = a binding to libcorosync. It is not (yet) a complete binding to all the API= s of libcorosync, but the bindings to the following libraries are implement= ed:

    1. libcmap (in memory stats and config database)
    2. libquorum and libvotequorum (query of quorum states)
    3. libcfg (config reload, etc)
    4. libcpg (closed process group, corosync's model of a cluster)

    This project lives on https://github.com/Vincent-lau/ocaml-corosync, and feel free to co= ntact me if you have any questions!

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=E3CWv93p; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=6n2sB26F; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A83B5B80123 for ; Tue, 3 Sep 2024 09:24:23 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=o+TIV7p60rpF0QRwDtx/UOy3RSsGmDLFbS0A5C82j0M=; b=E3CWv93pypHXmttZSlvFEvrtllQLis9tZIcMaMB+YKC6RCEcL7gpoygJ 94HiVlHvdopycT4Wjq9t+BHIpOMC3ozAE+GkihPJbmAqGkSrHwxiu/BcF jcbbIclLTgE4WHYv749ndCJUgQpi81xNH9Wa2DlFctdSQLRa9tthkvwUD U=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,198,1719871200"; d="scan'208,217";a="181197185" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Sep 2024 10:24:22 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id EFC48E00B6; Tue, 3 Sep 2024 10:24:21 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id B076EE00B6 for ; Tue, 3 Sep 2024 10:24:19 +0200 (CEST) IronPort-SDR: 66d6c7b2_LLkF02N3BFjQT52WUX4zzcBeVcBiDMrfXyqRzAxj+sZJyfh 3eWH8sKEAm78GYqkUdy2rbfqgOSAJtY8U/lihiQ== X-IPAS-Result: =?us-ascii?q?A0ECAgAQx9ZmmCIeaIFaHQEBPAEFBQECAQkBgWQCgT+BA?= =?us-ascii?q?xkBY1ozBwhIYYN1g0+OH5xAgnsDGBYjFAEDAQ0UAgECDgcBDgQBAgQBAQMBA?= =?us-ascii?q?gGFAAKJbgIfBgEEMwYOAQIEAQEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBA?= =?us-ascii?q?hABAQEBAQEBATcFSYV1DYJGLiNvXgcJNgEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQECDAEMFzsBSAQGEwEBJgUNGCMDEAQBB?= =?us-ascii?q?gMCEQE1FwESFAaCZgGCZAMFDAaQXJs8en8zgQGCDAEBBoEIPgIBCwIFAQ4JJ?= =?us-ascii?q?toEgWMJgUgBiDAaASpIagKEQwmEMScPgVVEgRWCKFFvgVBvCxcCAQEYgSEDA?= =?us-ascii?q?QEKQwmDJYJphiRVhVNsgQpFDVGBTksWHA2BAGcGAgEBBhaBGA9HVw9FBA5vP?= =?us-ascii?q?lQOgUWBPXwjAk1WEIcSgRqEK4hPgUciAyYzIRMBVRMXCwkFZIYPgkqDKYIUh?= =?us-ascii?q?BiFJ4FnCWGHaIFvgT6BWkeCckuFU4EEgldsTjwCDQI3gi8lboJkNx1AAwttP?= =?us-ascii?q?TUUG6kWBA0GIQGBWgGCEwgGXh4PDDYqAlYCBRYBHSMZDQUJGjALCwItjiWEH?= =?us-ascii?q?DSdZ5NPgQo0B4QYgV0GDIkCgSSOJ4N2g1WEBUyBCosrmT8imE8iiVSBJQkHg?= =?us-ascii?q?lCIboxcFoU+gX0kgSsxMxowQw0GgiABMwkJPRwPV41WFoNYgT6BJoE8OTvIY?= =?us-ascii?q?0E1AgEBNwIHAQoBAQMJhUUdAQGFUzOBSwEB?= IronPort-PHdr: A9a23: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 WXrjLIxZgPuvAklcanjMEGfyNr8Gg6Q IronPort-Data: A9a23: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 vRALZTz6IRp5X29AIGr9Dg= IronPort-HdrOrdr: A9a23:SlcgNas5z1dxCYyDKv0L8Yl97skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3AGreLb2qkYEgC9JNvqpJRFtTmUZ0Ob3r2wkbsGGu?= =?us-ascii?q?hMmhqEoOvYkGTqZoxxg=3D=3D?= X-Talos-MUID: 9a23:HUoAVgVE7BjEtO/q/GDR2DtmFecw34mVKxESkosG6siDEwUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,198,1719871200"; d="scan'208,217";a="181197147" X-MGA-submission: =?us-ascii?q?MDFOC25EpHafH2pC0VcLItT6PL/TkLbo3uQmzk?= =?us-ascii?q?tBPdiTWw2FEv09nDH6OB2l0S+LH63OZ+GifRisynksHnoyhNjDehxe8t?= =?us-ascii?q?zqxerVckBFbaCvcxZqo45rgKXivnc8bXEoJnBhS7ie1ZS8D4QbF5uMec?= =?us-ascii?q?tE3Jb54FLsZjA4tXdnDQjkDg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Sep 2024 10:24:18 +0200 Received: from TM.local (unknown [131.254.252.68]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D4176564A8A; Tue, 3 Sep 2024 10:24:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1725351857; bh=O0ue5ajfPIML/Nj8so8R+dWfNd80/cqG1VyfOXry4CA=; h=From:To:Subject:Date:Message-ID; b=6n2sB26FjNneQwSZGKJ02ZQpIQnc4eo3p5gnDWBSg0RrROAsI2Bif/4aUOYW22eEA 0+imT+pL+XIUDm5Mhkaz4BxK136AkmwcAQXBHmtolaDNKuHevuIyq6bW2lEhePQXpT mx9K0tj11JQNIo0MH8j8bJbBwV7OjdEC4lTB8vMM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Sep 2024 10:24:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 3 10:24:18 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.443358, queueID=15FF9564A8C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19176 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 27 to September 03, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ppx_minidebug 2.0: verbosity levels Ppx by example - repo to help on ppx learning Blog Post: Simple Example where Ocaml calls a C function Outreachy December 2024 Round Other OCaml News Old CWN ppx_minidebug 2.0: verbosity levels =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Lukasz Stafiniak announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I'm pleased to mention that [ppx_minidebug 2.0] is available now. The README at [ppx_minidebug - GitHub] is the user manual, and the runtime API is documented here: [ppx_minidebug.Minidebug_runtime]. Version 2.0 brings linear verbosity log levels. Both logging scopes and individual log statements can be either: at a default (omitted) log level, at a compile-time log level (e.g. `[%log2 "test"]' logs `test' at level 2), or at a runtime-provided log level (e.g. `[%logN for_level; "test"]' logs `test' at level `for_level'). When the level to log at is omitted, it is inherited from its direct syntactic logging scope (i.e. the log entry that the log or log entry is syntactically in =E2=80=93 not the log entry that the log is dynamically attached to, if it's different). Providing a compile-time log level will prune the generated code accordingly. See more here: [ppx_minidebug: Using as a logging framework]. Version 1.6 brought support for local runtimes, where the runtime for logging in a logging scope is fetched by a user-provided function. The function can for example use domain-local storage. See more here: [ppx_minidebug: Dealing with concurrent execution]. Happy debugging! [ppx_minidebug 2.0] [ppx_minidebug - GitHub] [ppx_minidebug.Minidebug_runtime] [ppx_minidebug: Using as a logging framework] [ppx_minidebug: Dealing with concurrent execution] Ppx by example - repo to help on ppx learning =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Pedro Braga announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Over the past few weeks, I've started my journey to learn PPX, and during this process, I found it challenging to find examples. So, I began creating my own examples and adding explanations for myself. I realized that I could make my examples and explanations public because this would push me to learn more deeply (as I=E2=80=99d need to provide better and clearer explanations) and could also help anyone else on this learning path. @davesnx also encouraged me to share my process (maybe through a blog post in the future). So, I created this repository: [github.com/pedrobslisboa/ppx-by-example]. The idea is to have examples and an explanation for each detail on those. It has also a brief explanation about the subject on every README. I have a few notes: =E2=80=A2 It is a wip project, which means that there are parts in development. But sharing it is also a way to push me to improve this project. =E2=80=A2 As I said, I'm on the process of learning PPX, so probably I mi= ssed or added something wrongly, so please If you notice it, share it on the repo so I can fix. =E2=80=A2 I am also in the process of learning OCaml. I started coding in OCaml this year (professionally just last month), so this repository might not have the best code. If you think it can be improved, please let me know. :heart: =E2=80=A2 I'm not a native English speaker or the best writer. I asked Ch= atGPT to help fix some mistakes and improve cohesion, but if you notice anything that needs to be improved, please let me know. :heart: Besides that, any comments, help, or additions are welcome. I hope this can be helpful :3 Thank you all! [github.com/pedrobslisboa/ppx-by-example] Blog Post: Simple Example where Ocaml calls a C function =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this thread, Tim McGilchrist said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 My favourite example at the moment is this one from [Retrofitting Effect Handlers onto OCaml]. It shows OCaml calling C, C calling an OCaml callback and exceptions crossing those boundaries. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ cat meander.ml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 external ocaml_to_c =E2=94=82 : unit -> int =3D "ocaml_to_c" =E2=94=82 exception E1 =E2=94=82 exception E2 =E2=94=82 let c_to_ocaml () =3D raise E1 =E2=94=82 let _ =3D Callback.register =E2=94=82 "c_to_ocaml" c_to_ocaml =E2=94=82 let omain () =3D =E2=94=82 try (* h1 *) =E2=94=82 try (* h2 *) ocaml_to_c () =E2=94=82 with E2 -> 0 =E2=94=82 with E1 -> 42 =E2=94=82 let _ =3D assert (omain () =3D 42) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ cat meander_c.c =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #include =E2=94=82 #include =E2=94=82=20 =E2=94=82 value ocaml_to_c (value unit) { =E2=94=82 caml_callback(*caml_named_value =E2=94=82 ("c_to_ocaml"), Val_unit); =E2=94=82 return Val_int(0); =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Compile it with OCaml 5.2: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ocamlopt --version =E2=94=82 5.2.0 =E2=94=82 $ ocamlopt meander_c.c meander.ml -o meander.exe =E2=94=82 $ ./meander.exe =E2=94=82 $ echo $? =E2=94=82 0 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Bonus you can use GDB/LLDB on this to set breakpoints in both OCaml and C. [Retrofitting Effect Handlers onto OCaml] Outreachy December 2024 Round =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With the conclusion of the previous Outreachy round (see [Outreachy Demo Presentation]), the next round is fast approaching and the OCaml community has signed up again to participate! [Outreachy Demo Presentation] The Next Round =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The *deadline for mentors to [submit a project] is [date=3D2024-09-11 timezone=3D"Europe/London"]*. If people are interested in mentoring and they maintain an open-source project, then they can reach out directly to me and I can help scope a project, explain the contribution period and provide as much other help as we can! Co-mentoring is also an option for people who are interested in mentoring but do not have a specific project =E2=80=93 do reply to this thread if that's you! When signing up mentors propose an open-source project where prospective interns submit PRs during the =E2=80=9Ccontribution phases=E2= =80=9D as part of their application. Mentors will then choose an intern to work with for 3 months. A more detailed explanation is available [on the Outreachy mentor section ]. I'm particularly interested in *projects from some of the larger OCaml projects* (e.g. dune, opam, ppxlib, miou, eio, cohttp, melange etc.). I'm very happy to help with co-mentoring on any of these projects. If you are interested and are a maintainer of a larger project, please do reach out. Of course, smaller projects are still very much possible. [submit a project] [on the Outreachy mentor section ] Funding =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C _Funding for this upcoming Outreachy round is not yet finalised_. We hope to have funding for three interns, I will reply to this thread once things are confirmed which should be soon. If any company is interested in supporting the OCaml community Outreachy initative please do reach out to me. I'd also like to take this moment to raise some awareness for the current [struggles Outreachy is facing]. The OCaml community has benefited massively from Outreachy. Both by participating directly as a community (see for some past projects) and via the participation of other communities. I'm very grateful for everyone who has taken part in some way, including non-mentors engaging with the interns. As always if you have any general questions or mentoring ideas do comment on this thread or reach out directly. Thanks! [struggles Outreachy is facing] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [The Biggest Functional Programming Conference of the Year: Wha= t are we Bringing to ICFP?] =E2=80=A2 [ICFP 2024] =E2=80=A2 [Project-Wide Occurrences: A New Navigation Feature for OCaml 5= .2 Users] =E2=80=A2 [What the interns have wrought, 2024 edition] [the ocaml.org blog] [The Biggest Functional Programming Conference of the Year: What are we Bringing to ICFP?] [ICFP 2024] [Project-Wide Occurrences: A New Navigation Feature for OCaml 5.2 Users] [What the interns have wrought, 2024 edition] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 27 to Septembe= r 03, 2024.

    ppx_minidebug 2.0: verbosity levels

    Lukasz Stafiniak announced

    I'm pleased to mention that ppx_minidebug 2.0 is available now. The README at ppx_minidebug - GitHub is the u= ser manual, and the runtime API is documented here: pp= x_minidebug.Minidebug_runtime.

    Version 2.0 brings linear verbosity log levels. Both logging scopes and ind= ividual log statements can be either: at a default (omitted) log level, at = a compile-time log level (e.g. [%log2 "test"] logs test<= /code> at level 2), or at a runtime-provided log level (e.g. [%logN f= or_level; "test"] logs test at level for_level). When the level to log at is omitted, it is inherited from its direct= syntactic logging scope (i.e. the log entry that the log or log entry is s= yntactically in – not the log entry that the log is dynamically atta= ched to, if it's different). Providing a compile-time log level will prune = the generated code accordingly. See more here: ppx_minidebug: Using as a logging framework.

    Version 1.6 brought support for local runtimes, where the runtime for loggi= ng in a logging scope is fetched by a user-provided function. The function = can for example use domain-local storage. See more here: ppx_minidebug: Dealing with concurrent execution.

    Happy debugging!

    Ppx by example - repo to help on ppx learning

    Pedro Braga announced

    Over the past few weeks, I've started my journey to learn PPX, and during t= his process, I found it challenging to find examples. So, I began creating = my own examples and adding explanations for myself.

    I realized that I could make my examples and explanations public because th= is would push me to learn more deeply (as I=E2=80=99d need to provide bette= r and clearer explanations) and could also help anyone else on this learnin= g path. @davesnx also encouraged me to share my process (maybe through a bl= og post in the future). So, I created this repository: github.com/pedrobslisboa/ppx-by-exa= mple.

    The idea is to have examples and an explanation for each detail on those. I= t has also a brief explanation about the subject on every README.

    I have a few notes:

    • It is a wip project, which means that there are parts in development. B= ut sharing it is also a way to push me to improve this project.
    • As I said, I'm on the process of learning PPX, so probably I missed or = added something wrongly, so please If you notice it, share it on the repo s= o I can fix.
    • I am also in the process of learning OCaml. I started coding in OCaml t= his year (professionally just last month), so this repository might not hav= e the best code. If you think it can be improved, please let me know. :hear= t:
    • I'm not a native English speaker or the best writer. I asked ChatGPT to= help fix some mistakes and improve cohesion, but if you notice anything th= at needs to be improved, please let me know. :heart:

    Besides that, any comments, help, or additions are welcome. I hope this can= be helpful :3 Thank you all!

    Blog Post: Simple Example where Ocaml calls a C function

    Deep in this thread, Tim McGilchrist said

    My favourite example at the moment is this one from Retrofitting Effect Handlers onto OCaml. I= t shows OCaml calling C, C calling an OCaml callback and exceptions crossin= g those boundaries.

    $ cat meander.ml
    
    external ocaml_to_c
             : unit -> int =3D "ocaml_to_c"<=
    /span>
    exception E1
    exception E2
    let c_to_ocaml () =3D raise E1
    let _ =3D Callback.=
    register
              "c_to_ocaml" c_to_ocaml
    let omain () =3D
      try (* h1 *)
        try (* h2 *) ocaml_to_c ()
        with E2 -> 0
      with E1 -> 42
    let _ =3D assert (omain () =3D 42)
    
    $ cat meander_c.c
    
    #include <caml/mlvalues.h>
    #include <caml/callback.h>
    
    value value unit) {
        caml_callback(*caml_named_value
                      ("c_to_ocaml"), Va=
    l_unit);
        return Val_in=
    t(0);
    }
    

    Compile it with OCaml 5.2:

    $ ocamlopt --version
    5.2.0
    $ ocamlopt meander_c.c meander.ml -o meander.exe
    $ ./meander.exe
    $ echo $?
    0
    

    Bonus you can use GDB/LLDB on this to set breakpoints in both OCaml and C.

    Outreachy December 2024 Round

    Patrick Ferris announced

    With the conclusion of the previous Outreachy round (see Outreachy Demo Pres= entation), the next round is fast approaching and the OCaml community h= as signed up again to participate!

    The Next Round

    The deadline for mentors to submit a project is [date=3D2024-09-11 timezone=3D"Eur= ope/London"]. If people are interested in mentoring and they maintain a= n open-source project, then they can reach out directly to me and I can hel= p scope a project, explain the contribution period and provide as much othe= r help as we can! Co-mentoring is also an option for people who are interes= ted in mentoring but do not have a specific project – do reply to th= is thread if that's you!=20

    When signing up mentors propose an open-source project where prospective in= terns submit PRs during the =E2=80=9Ccontribution phases=E2=80=9D as part o= f their application. Mentors will then choose an intern to work with for 3 = months. A more detailed explanation is available on the Outreachy mentor section .

    I'm particularly interested in projects from some of the larger OCaml pr= ojects (e.g. dune, opam, ppxlib, miou, eio, cohttp, melange etc.). I'm = very happy to help with co-mentoring on any of these projects. If you are i= nterested and are a maintainer of a larger project, please do reach out. Of= course, smaller projects are still very much possible.=20

    Funding

    Funding for this upcoming Outreachy round is not = yet finalised. We hope to have funding for three interns, I will rep= ly to this thread once things are confirmed which should be soon. If any co= mpany is interested in supporting the OCaml community Outreachy initative p= lease do reach out to me.

    I'd also like to take this moment to raise some awareness for the current <= a href=3D"https://www.outreachy.org/blog/2024-08-14/outreachy-needs-your-he= lp/">struggles Outreachy is facing. The OCaml community has benefited m= assively from Outreachy. Both by participating directly as a community (see= https://ocaml.org/outreachy fo= r some past projects) and via the participation of other communities. I'm v= ery grateful for everyone who has taken part in some way, including non-men= tors engaging with the interns.=20

    As always if you have any general questions or mentoring ideas do comment o= n this thread or reach out directly.

    Thanks!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=aNwZzaCl; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=oc6UPlcE; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id F2E55B80123 for ; Tue, 10 Sep 2024 14:55:19 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=4XkJBXckXAA9s+3cxsRLTtHoipNyRilpdIqor/Ug2nA=; b=aNwZzaCl+SPWMJHav06tZ5EwleVJZpof40MBPFlN4lAg5saNEnWGqTMA b9B5LX+PP6ZmV7CsiP1pZUj9YFvqi7npSF9yQMUyu0EUBuVs3tejBVpOO kcrjJ8B5BWiJNGLTyL/WmBnRlL/jv6oxRgoivS1cG16gXHS8lXZ9HMokC 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,217,1719871200"; d="scan'208,217";a="182416303" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Sep 2024 15:55:17 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 84BF5E0D18; Tue, 10 Sep 2024 15:55:16 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5E943E00B6 for ; Tue, 10 Sep 2024 15:55:10 +0200 (CEST) IronPort-SDR: 66e04fbb_iaEbhwN4oP/jmkupb7Rvki0i0J/R8AdehTSjbKcE/KwITWj 8OfaBBB5LwbaJnyfhTVklZeSE3qHIDDaRpJJskQ== X-IPAS-Result: =?us-ascii?q?A0FUAQBcTuBmmCIeaIFahBlbKBkBY1ozBwhIAyUBOIN1g?= =?us-ascii?q?0+OH4EWkDOKd4J7AxgWIxQBAwENLgEOBAECBAEBAwECAYIMgnQCFoljAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBAQE3B?= =?us-ascii?q?UmFOwU1DYJGLiNxXgcJNgEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQECCAQBDAUILBkBPwEIBAYTAQEmBQ0YFA8DDAgBBgMCB?= =?us-ascii?q?A0BNQMUAQkJFAYBgg0URAGCMAMxAwUMBpU7mzx6fzOBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gIDAQ4JJQHZCxZjgWMJgTAYiDEaASpIagKEQwmEMScPgVVEgRU1gXNKB2+BU?= =?us-ascii?q?G8EHgEBAQEYgSQBAQgCQwkagwuCaYYgVYVTbIEKKxoNgnIOHIEJBGEFAQgCB?= =?us-ascii?q?hYKN1dWVw9Xbz4SQgIMMgOBEIE9fCMCSANWEIYtYIEagXOCKopIgUdLMyETA?= =?us-ascii?q?VUTFwsJBWSGC4JKgymCFIQYhSeBZwlgh2iBb4E+gVpHgnFLhVCBBoJUa048A?= =?us-ascii?q?g0CN4IpJW6CXoMPHUADC209NRQbqlUEDScBgVoBgXQJJAIOCzMCJiUVERAHB?= =?us-ascii?q?QEbDgEBBQ4NAg0pOQcIFA4LBA4JSgsLAgYnA4RYjXIoKgKPL44Nk1CBCjQHh?= =?us-ascii?q?BqBXQYMiQKBJIhajRmEBYFWiyuGfpJBIphSIoI0hiCBAIElCQeBZmqIb4wzL?= =?us-ascii?q?CCFNIF+I4ErAQEZAwMJBzMaMEOCMwEBMgkJPRwPhWuIPwMWgQwBCYIaKEF9g?= =?us-ascii?q?SEFgTw5O8YVLwNBNQIBAQQDBykCBwEKAQEDCYViAQGFUgEBBR8CBwWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVhD7bSyahFxI1sNGWq9Dg0 IronPort-HdrOrdr: A9a23:+zCVZqr2o1CyELCAxJNQlxMaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:mpde5WBQmCV4/Nn6EzdErlBONZEVTiXU1kmTCmWXOEp5FbLAHA== X-Talos-MUID: =?us-ascii?q?9a23=3A2CMEAg1sZXujdxMjYL0sT5Ne1jUj6qqfLkcfq60?= =?us-ascii?q?9tfLUaRVUJBu7syyWTdpy?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,217,1719871200"; d="scan'208,217";a="95941725" X-MGA-submission: =?us-ascii?q?MDGI11wFPXET0QEdAutuz00g5OOhPiHsPUwt6M?= =?us-ascii?q?xsXGW6S/zDexwFDxqS0zPjeWEgORbZxG8w2Oeb8KdM+h+pqbN4Pp5IpG?= =?us-ascii?q?s5E6uoCqfNmPGPgl2r/kmYbYYOOES9UwC/n6HheJdh8pcPpMl31RSGXX?= =?us-ascii?q?uNBSZRhev6V8nGy7wpcp3YKg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Sep 2024 15:55:07 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F0E715648BC; Tue, 10 Sep 2024 15:55:05 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1725976506; bh=ZWIqUlk5stlVBWRRsqTLIASytalFEXpP6+8AdG9CagM=; h=From:To:Subject:Date:Message-ID; b=oc6UPlcEIqkDGQl+J/Wxx8JNxdqmf7etwY/W1q1bG5sVD379+GJxPNYawaVpcPkJp XSoCWVREmQ932Dl/6pQNPNnn04PC2DipRRh/7tO8nytfVPVx8eDhzsUoyDqTaSXdbY FBeVogAfVx4Jdnf5p33jWPuKcMCOtO9NI1aoji9M= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Sep 2024 15:55:05 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 10 15:55:06 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.376515, queueID=3E1085648BD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19178 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgU2VwdGVtYmVyIDAzIHRvDQoxMCwgMjAyNC4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPeGlk aXppbmcgT0NhbWwg4oCUIGFuIHVwZGF0ZQ0KVG95IEF1dG9ncmFkIEVuZ2luZSBpbiBPQ2FtbCB3 aXRoIEFwcGxlIEFjY2VsZXJhdGUgQmFja2VuZA0KTmV3IHJlbGVhc2Ugb2YgY3Bwbywgd2l0aCBt dWx0aS1saW5lIG1hY3JvcyBhbmQgaGlnaGVyLW9yZGVyIG1hY3Jvcw0KT0NhbWxQcm8ncyBjb250 cmlidXRpb25zIHRvIHRoZSAyMDI0IElDRlAgaW4gTWlsYW4NCkZsYW1iZGEyIEVwLiAzOiBTcGVj dWxhdGl2ZSBJbmxpbmluZywgYnkgT0NhbWxQcm8NCkZydXN0cmF0aW5nIEludGVyYWN0aW9ucyB3 aXRoIHRoZSBPQ2FtbCBFY29zeXN0ZW0gd2hpbGUgZGV2ZWxvcGluZyBhIFN5bnRoZXNpemVyIExp YnJhcnkNCkNtZGxhbmcgLSBZZXQgQW5vdGhlciBDTEkgTGlicmFyeSAod2VsbCwgbm90IHJlYWxs eSkNCnphcnIgdjAuMS4wDQpCcnIgMC4wLjcNCk9jc2lnZW4gU2VydmVyIDYuMC4wDQpkcmVhbS1o dG1sIGFuZCBwdXJlLWh0bWwNCkFkdmFuY2VkIENvZGUgTmF2aWdhdGlvbiBjb21pbmcgdG8gT0Nh bWwtTFNQDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KT3hpZGl6aW5nIE9DYW1sIOKA lCBhbiB1cGRhdGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW94aWRpemluZy1vY2FtbC1hbi11cGRhdGUv MTUyMzcvMT4NCg0KDQpEaWFuYSBLYWxpbmljaGVua28gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSEgTGFzdCB5ZWFyLCB3ZSBtYWRlIGEgc2Vy aWVzIG9mIGJsb2dwb3N0cyBkZXNjcmliaW5nIG91cg0KICBwbGFucyB0byBpbnRyb2R1Y2UgUnVz dC1saWtlIHR5cGUgc3lzdGVtIGZlYXR1cmVzIHRvIE9DYW1sIChzZWUNCiAgW2hlcmVdKS4gTm93 LCB3ZSBhcmUgc2hhcmluZyB1cGRhdGVzIG9uIGV2ZXJ5dGhpbmcgd2UndmUgZG9uZSBzaW5jZQ0K ICBsYXN0IHllYXIgZm9yIElDRlAgMjAyNC4gUGxlYXNlIHJlYWQgb3VyIFtibG9ncG9zdF0gYW5k IGNoZWNrIG91dCBvdXINCiAgY29tcGlsZXIgZXh0ZW5zaW9ucyBhdCBvdXIgW0dpdEh1Yl0hDQoN Cg0KW2hlcmVdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L294aWRpemluZy1vY2FtbC1h bmQtYS1uZXctb3BhbS1zd2l0Y2gvMTI5NDI+DQoNCltibG9ncG9zdF0gPGh0dHBzOi8vYmxvZy5q YW5lc3RyZWV0LmNvbS9pY2ZwLTIwMjQtaW5kZXgvPg0KDQpbR2l0SHViXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9qYW5lc3RyZWV0L29wYW0tcmVwb3NpdG9yeS90cmVlL3dpdGgtZXh0ZW5zaW9ucz4N Cg0KDQpUb3kgQXV0b2dyYWQgRW5naW5lIGluIE9DYW1sIHdpdGggQXBwbGUgQWNjZWxlcmF0ZSBC YWNrZW5kDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3RveS1hdXRvZ3JhZC1lbmdpbmUtaW4tb2NhbWwtd2l0aC1hcHBsZS1hY2NlbGVyYXRlLWJhY2tl bmQvMTUyMzkvMT4NCg0KDQpKb2huIEpld2VsbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgaGF2 ZSBiZWVuIHZlbnR1cmluZyB0byBsZWFybiBhIG5ldyBsYW5ndWFnZSBhbmQgSSBsYW5kZWQgb24g T0NhbWwNCiAgYWZ0ZXIgaGVhcmluZyBhIGZldyBpbnRlcmVzdGluZyB0YWxrcyBmcm9tIEphbmUg U3RyZWV0LiBJIGp1c3QgbWFkZQ0KICBwdWJsaWMgYSB0b3kgYXV0b2dyYWQgZW5naW5lIGluIE9D YW1sIHdpdGggYW4gQXBwbGUgQWNjZWxlcmF0ZSBiYWNrZW5kDQogIGlmIGFueW9uZSBpcyBpbnRl cmVzdGVkOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vamV3ZWxsdGF5bG9yL2NhbWxncmFkPg0K DQogIEkgd291bGQgcmVhbGx5IGFwcHJlY2lhdGUgYW55IGZlZWRiYWNrIGluIHRlcm1zIG9mIHRo ZSBPQ2FtbCBjb2RlIHRoYXQNCiAgSSB3cm90ZSBzbyB0aGF0IEkgY2FuIGltcHJvdmUuIElmIGFu eW9uZSBpcyB3aWxsaW5nIHRvIHF1aWNrbHkgdGFrZSBhDQogIGxvb2sgaXQgd291bGQgbWVhbiBh IGxvdCA6c2xpZ2h0X3NtaWxlOg0KDQoNCk5ldyByZWxlYXNlIG9mIGNwcG8sIHdpdGggbXVsdGkt bGluZSBtYWNyb3MgYW5kIGhpZ2hlci1vcmRlciBtYWNyb3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLW5ldy1yZWxlYXNlLW9mLWNwcG8td2l0aC1tdWx0aS1saW5lLW1hY3Jvcy1hbmQtaGlnaGVy LW9yZGVyLW1hY3Jvcy8xNTI0MS8xPg0KDQoNCkZyYW7Dp29pcyBQb3R0aWVyIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2Ug YSBuZXcgcmVsZWFzZSBvZiBjcHBvICh2MS43LjApIHdpdGggdHdvDQogIG5ldyBmZWF0dXJlcy4N Cg0KICDigYMgVGhlIG5ldyBzeW50YXggYCNkZWYgLi4uICNlbmRkZWYnIGFsbG93cyBhIG1hY3Jv IGRlZmluaXRpb24gdG8gc3Bhbg0KICAgIHNldmVyYWwgbGluZXMsIHdpdGhvdXQgYmFja3NsYXNo ZXMuIFRoaXMgc3ludGF4IGFsbG93cyBtYWNybw0KICAgIGRlZmluaXRpb25zIHRvIGJlIG5lc3Rl ZC4NCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgI2RlZiByZXBlYXRfdW50aWwoYWN0aW9u LGNvbmRpdGlvbikNCiAgICDilIIgICBhY3Rpb247DQogICAg4pSCICAgd2hpbGUgbm90IChjb25k aXRpb24pIGRvDQogICAg4pSCICAgICBhY3Rpb24NCiAgICDilIIgICBkb25lDQogICAg4pSCICNl bmRkZWYNCiAgICDilJTilIDilIDilIDilIANCg0KICDigYMgQSBwYXJhbWV0ZXJpemVkIG1hY3Jv IGNhbiB0YWtlIGEgcGFyYW1ldGVyaXplZCBtYWNybyBhcyBhIHBhcmFtZXRlcjoNCiAgICB0aGlz IGlzIGEgaGlnaGVyLW9yZGVyIG1hY3JvLg0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiAj ZGVmaW5lIFRXSUNFKGUpICAgICAgICAgIChlICsgZSkNCiAgICDilIIgI2RlZmluZSBBUFBMWShG IDogWy5dLCBlKSAobGV0IHggPSAoZSkgaW4gRih4KSkNCiAgICDilIIgbGV0IGZvcnR5X3R3byA9 DQogICAg4pSCICAgQVBQTFkoVFdJQ0UsMSsyKzMrNCs1KzYpDQogICAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHNlZSB0aGUgW2RvY3VtZW50YXRpb25dLg0K DQoNCltkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkv Y3Bwby8/dGFiPXJlYWRtZS1vdi1maWxlI211bHRpLWxpbmUtbWFjcm9zLWFuZC1uZXN0ZWQtbWFj cm9zPg0KDQoNCk9DYW1sUHJvJ3MgY29udHJpYnV0aW9ucyB0byB0aGUgMjAyNCBJQ0ZQIGluIE1p bGFuDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1scHJvcy1jb250cmlidXRpb25zLXRv LXRoZS0yMDI0LWljZnAtaW4tbWlsYW4vMTUyNDQvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIFRvZGF5LCBhIHF1aWNrIGhlYWQncyB1cCBhYm91dCBvdXIgY29udHJpYnV0aW9ucyB0byB0 aGlzIHllYXIncw0KICBJbnRlcm5hdGlvbmFsIENvbmZlcmVuY2Ugb24gRnVuY3Rpb25hbCBQcm9n cmFtbWluZyB3aGljaCBpcyB1bnJhdmVsaW5nDQogIHJpZ2h0IG5vdyBpbiBNaWxhbiENCg0KICBU aGlzIHllYXIsIG91ciB0ZWFtIHByZXNlbnRzIHR3byB0b3BpY3M6DQogIOKAoiBbIlNuYXBzaG90 dGFibGUgU3RvcmVzIl06IEEgZ2VuZXJpYyBhbmQgZWZmaWNpZW50IGRhdGEgc3RydWN0dXJlIGZv cg0KICAgIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBiYWNrdHJhY2tpbmcgYWxnb3JpdGhtcywgdXNl ZCBwYXJ0aWN1bGFybHkgaW4NCiAgICBhdXRvbWF0aWMgdGhlb3JlbSBwcm92ZXJzIGFuZCB0eXBl IGNoZWNrZXJzLiBUaGlzIGltcGxlbWVudGF0aW9uIGluDQogICAgT0NhbWwgd2lsbCBzb29uIGJl IGF2YWlsYWJsZSBvbiBvcGFtLg0KDQogIOKAoiBbQSBwcmVzZW50YXRpb24gb24gb3BhbV0sIGRl dGFpbGluZyB0aGUgY29udGVudHMgb2YgdGhlIGxhdGVzdCBtYWpvcg0KICAgIHJlbGVhc2UgMi4y LCB3aGljaCB3YXMgcmVsZWFzZWQgaW4gSnVseSwgYXMgd2VsbCBhcyBob3cgdGhlIG9wYW0NCiAg ICB0ZWFtIG9wZXJhdGVzLg0KDQogIEJlIHN1cmUgdG8gY2hlY2tvdXQgW3RoZSBldmVudF0sIHRo ZXJlIGFyZSBwbGVudHkgb2YgZ3JlYXQNCiAgcHJlc2VudGF0aW9ucyBhbmQgdmlkZW8gcmVwbGF5 cyENCg0KICBVbnRpbCBuZXh0IHRpbWUsIHdoaWNoIHdpbGwgYmUgc29vbmVyIHRoYW4gbGF0ZXIg d2l0aCBhbm90aGVyIG9uZSBvZg0KICBvdXIgW0ZsYW1iZGEyIFNuaXBwZXRzXSwNCg0KICBLaW5k IHJlZ2FyZHMsIFRoZSBPQ2FtbFBybyBUZWFtDQoNCg0KWyJTbmFwc2hvdHRhYmxlIFN0b3JlcyJd DQo8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvZGV0YWlscy9pY2ZwLTIwMjQtcGFwZXJzLzE0 L1NuYXBzaG90dGFibGUtU3RvcmVzPg0KDQpbQSBwcmVzZW50YXRpb24gb24gb3BhbV0NCjxodHRw czovL2ljZnAyNC5zaWdwbGFuLm9yZy9kZXRhaWxzL29jYW1sLTIwMjQtcGFwZXJzLzEwL09wYW0t Mi0yLWFuZC1iZXlvbmQ+DQoNClt0aGUgZXZlbnRdDQo8aHR0cHM6Ly93ZWIuY3ZlbnQuY29tL2V2 ZW50LzcyOGJlMzg3LTRlODktNDkzMC1hNGU0LTUxZjlkMWQ2MjA5ZS9zdW1tYXJ5Pg0KDQpbRmxh bWJkYTIgU25pcHBldHNdDQo8aHR0cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzAzXzE4X3Ro ZV9mbGFtYmRhMl9zbmlwcGV0c18wLz4NCg0KDQpGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUg SW5saW5pbmcsIGJ5IE9DYW1sUHJvDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctZmxhbWJk YTItZXAtMy1zcGVjdWxhdGl2ZS1pbmxpbmluZy1ieS1vY2FtbHByby8xNTI1MC8xPg0KDQoNCk9D YW1sUHJvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgQXMgcHJvbWlzZWQgaW4gb3VyIFtwcmV2aW91cyBwb3N0XSBh Ym91dCBPQ2FtbFBybydzIGNvbnRyaWJ1dGlvbnMgdG8NCiAgdGhpcyB5ZWFyJ3MgSW50ZXJuYXRp b25hbCBDb25mZXJlbmNlIG9mIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIHdlDQogIGJhY2sgYWdh aW4gd2l0aCBhIG5ldyBlbnRyeSBpbiBvdXIgW0ZsYW1iZGEyIFNuaXBwZXQgYmxvZyBzZXJpZXNd IQ0KDQogIFtGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUgSW5saW5pbmddIGNvdmVycyBpbmxp bmluZyBpbiBnZW5lcmFsIGFzDQogIHdlbGwgYXMgaG93IG91ciBjb21waWxlciBoYW5kbGVzIGl0 LiBXZSBnbyBpbiBkZXRhaWwgYWJvdXQgaG93DQogIGBTcGVjdWxhdGl2ZSBJbmxpbmluZycgYWxs b3dzIG1vcmUgc2lnbmlmaWNhbnQgb3B0aW1pc2F0aW9ucyB0byB0YWtlDQogIHBsYWNlLg0KDQog IFRoaXMgYmxvZyBlbnRyeSBpcyBrZXkgZm9yIGEgc21vb3RoIHJlYWQgb2Ygb3VyIG5leHQgYXJ0 aWNsZSB3aGljaA0KICB3aWxsIGNvdmVyIGBVcHdhcmRzIGFuZCBEb3dud2FyZHMgVHJhdmVyc2Fs cycgaW4gRmxhbWJkYTIuDQoNCiAgSGFwcHkgdG8gc2F5IHRoYXQgaXQncyBhbHJlYWR5IHF1aXRl IGZhciBkb3duIHRoZSByZWxlYXNlIHBpcGVsaW5lIQ0KDQoNCltwcmV2aW91cyBwb3N0XQ0KPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbHByb3MtY29udHJpYnV0aW9ucy10by10aGUt MjAyNC1pY2ZwLWluLW1pbGFuLzE1MjQ0Pg0KDQpbRmxhbWJkYTIgU25pcHBldCBibG9nIHNlcmll c10NCjxodHRwczovL29jYW1scHJvLmNvbS9ibG9nLzIwMjRfMDNfMThfdGhlX2ZsYW1iZGEyX3Nu aXBwZXRzXzAvI2xpc3Rpbmc+DQoNCltGbGFtYmRhMiBFcC4gMzogU3BlY3VsYXRpdmUgSW5saW5p bmddDQo8aHR0cHM6Ly9vY2FtbHByby5jb20vYmxvZy8yMDI0XzA4XzA5X3RoZV9mbGFtYmRhMl9z bmlwcGV0c18zLz4NCg0KDQpGcnVzdHJhdGluZyBJbnRlcmFjdGlvbnMgd2l0aCB0aGUgT0NhbWwg RWNvc3lzdGVtIHdoaWxlIGRldmVsb3BpbmcgYSBTeW50aGVzaXplciBMaWJyYXJ5DQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctZnJ1c3RyYXRpbmctaW50ZXJhY3Rpb25zLXdpdGgtdGhl LW9jYW1sLWVjb3N5c3RlbS13aGlsZS1kZXZlbG9waW5nLWEtc3ludGhlc2l6ZXItbGlicmFyeS8x NTI1My8xPg0KDQoNClN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgPGh0dHBzOi8vd3d3LmdyaWRidWdzLm9yZy9mcnVzdHJhdGluZy1pbnRlcmFjdGlvbnMtd2l0 aC10aGUtb2NhbWwtZWNvc3lzdGVtLXdoaWxlLWRldmVsb3BpbmctYS1zeW50aGVzaXplci1saWJy YXJ5Lz4NCg0KICBMYXN0IHllYXIgSSBtYWRlIGEgc3ludGhlc2l6ZXIgbGlicmFyeSBpbiBPQ2Ft bCBhbmQgaGFkIHNvbWUgc3RydWdnbGVzDQogIHVzaW5nIER1bmUgYW5kIE9wYW0sIGFuZCBhbHNv IHJhbiBpbnRvIHNldmVyYWwgaXNzdWVzIHdpdGgNCiAgbGlicmFyaWVzLiBJIHdyb3RlIGEgYmxv ZyBwb3N0IGFib3V0IGFsbCB0aGUgcHJvYmxlbXMgSSBlbmNvdW50ZXJlZC4NCg0KDQpDbWRsYW5n IC0gWWV0IEFub3RoZXIgQ0xJIExpYnJhcnkgKHdlbGwsIG5vdCByZWFsbHkpDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NtZGxhbmcteWV0LWFub3RoZXItY2xpLWxpYnJhcnktd2Vs bC1ub3QtcmVhbGx5LzE1MjU4LzE+DQoNCg0KTWF0aGlldSBCYXJiaW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBJIGhvcGUgeW91IGhhZCBhIG5pY2Ugc3VtbWVyISBNaW5lIHRvb2sg YW4gdW5leHBlY3RlZCB0dXJuIHdoZW4sDQogIHJvdWdobHkgYXQgdGhlIHNhbWUgdGltZSwgSSB3 cm90ZSBteSBmaXJzdCBgY21kbGluZXInIHN1YmNvbW1hbmQgYW5kDQogIGhlYXJkIGFib3V0IGBj bGltYXRlJyBmb3IgdGhlIGZpcnN0IHRpbWUuIE15IGV4cGVyaWVuY2Ugd2l0aCBPQ2FtbCBDTEkN CiAgc28gZmFyIGhhZCBiZWVuIGNlbnRlcmVkIGFyb3VuZCBgY29yZS5jb21tYW5kJy4NCg0KICBX aGVuIEkgcmVhZCBjbGltYXRlJ3MgW3Rlcm1pbm9sb2d5XSBzZWN0aW9uIGFuZCBob3cgaXQgZGVm aW5lcw0KICBgVGVybXMnLCBgQXJndW1lbnRzJywgYW5kIGBQYXJhbWV0ZXJzJywgc29tZXRoaW5n IGNsaWNrZWQuIFNlZWluZyBob3cNCiAgYGNsaW1hdGUnJ3MgQVBJIG1hbmFnZWQgdG8gbWFrZSBw b3NpdGlvbmFsIGFuZCBuYW1lZCBhcmd1bWVudHMgZml0IHNvDQogIG5pY2VseSB0b2dldGhlciwg SSB0aG91Z2h0OiAiV293LCBmb3IgdGhlIGZpcnN0IHRpbWUsIGl0IHNlZW1zIEknbGwgYmUNCiAg YWJsZSB0byB3cml0ZSBhIENMSSBzcGVjIG9uIGEgd2hpdGVib2FyZCB3aXRob3V0IHJlZmVycmlu ZyB0byBzb21lDQogIGNvZGUgSSBuZXZlciBzZWVtIHRvIGdldCByaWdodCAoSSBhbSBsb29raW5n IGF0IHlvdSwgYGNvcmUuY29tbWFuZCcncw0KICBhbm9ueW1vdXMgYXJndW1lbnRzKS4iDQoNCiAg SSBnb3QgcXVpdGUgZXhjaXRlZCBhbmQgdGhvdWdodDogIkNhbiBJIHN3aXRjaCB0byBgY2xpbWF0 ZScgdG9kYXk/Ig0KICBCdXQgcmVhbGl0eSBjaGVja2VkOiBpdCdzIG5vdCBvbiBvcGFtIHlldCwg c3RpbGwgdW5kZXIgY29uc3RydWN0aW9uLA0KICBJJ20gbm90IHN1cmUgd2hhdCB0aGUgY29tbXVu aXR5IHdpbGwgZG8sIGV0Yy4NCg0KICBJbXBsZW1lbnRpbmcgbXkgb3duIGVuZ2luZSBmb3IgYW4g QVBJIHJlc2VtYmxpbmcgYGNsaW1hdGUnIGZlbHQgbGlrZSBhDQogIHdhc3RlZCBlZmZvcnQsIGtu b3dpbmcgYWJvdXQgdGhlIHdvcmsgaGFwcGVuaW5nIGluIGBjbGltYXRlJy4gU3RpbGwsDQogIGhh dmluZyBhIGAnYSBQYXJhbS50JywgYCdhIEFyZy50JywgYW5kIGAnYSBDb21tYW5kLnQnIHR5cGUg dGhhdCBJDQogIHdvdWxkIGdldCB0byBrbm93IGFuZCBsb3ZlIGZlbHQgdG9vIGdvb2QgdG8gcGFz cyB1cC4NCg0KICBJIHN0YXJlZCBhdCB0aGUgYGNsaW1hdGUnIHR5cGVzIGZvciBhIHdoaWxlLCBh bmQgZmlsbGVkIHdpdGggaGFwcHkNCiAgdGhvdWdodHMgYWJvdXQgYSBicmlnaHQgQ0xJIGZ1dHVy ZSwgaXQgb2NjdXJyZWQgdG8gbWU6IGNhbiBJIHVzZSBhbg0KICBBUEkgbGlrZSBgY2xpbWF0ZScg YnV0IGNvbXBpbGUgaXQgZG93biB0byBleGlzdGluZyBsaWJyYXJpZXMgc3VjaCBhcw0KICBgY21k bGluZXInIG9yIGBjb3JlLmNvbW1hbmQnPyAoYW5kIGBjbGltYXRlJyB0b28hKS4gSSB3cm90ZSBk b3duIHRoZQ0KICBmb2xsb3dpbmcgdHlwZXM6DQoNCg0KW3Rlcm1pbm9sb2d5XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9ncmlkYnVncy9jbGltYXRlP3RhYj1yZWFkbWUtb3YtZmlsZSN0ZXJtaW5vbG9n eT4NCg0KQ2xpbWF0ZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAnYSBQYXJhbS50ICAgICAtPiAnYSBDbGltYXRlLkFyZ19wYXJzZXIuY29udg0KICDi lIIgJ2EgQXN0LkFyZy50ICAgLT4gJ2EgQ2xpbWF0ZS5BcmdfcGFyc2VyLnQNCiAg4pSCICdhIENv bW1hbmQudCAgIC0+ICdhIENsaW1hdGUuQ29tbWFuZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoN CkNtZGxpbmVyDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCICdhIFBhcmFtLnQgICAgIC0+ICdhIENtZGxpbmVyLkFyZy5jb252DQogIOKUgiAnYSBB cmcudCAgICAgICAtPiAnYSBDbWRsaW5lci5UZXJtLnQNCiAg4pSCICdhIENvbW1hbmQudCAgIC0+ ICdhIENtZGxpbmVyLkNtZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCmNvcmUuY29tbWFuZA0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAnYSBQYXJhbS50ICAgICAtPiAnYSBjb3JlLkNvbW1hbmQuQXJnX3R5cGUudA0KICDi lIIgJ2EgQXJnLnQgICAgICAgLT4gJ2EgY29yZS5Db21tYW5kLlBhcmFtLnQNCiAg4pSCIHVuaXQg Q29tbWFuZC50IC0+IGNvcmUuQ29tbWFuZC50DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIOKApiB3 aGljaCBJIGludGVycHJldGVkIGFzIHN0YXRpbmcgdGhlIGZvbGxvd2luZyB0aGVvcmVtOg0KDQog ICAgICAgIFRoZXJlIGV4aXN0cyBhbiBhYnN0cmFjdGlvbiB0byBlbmNvZGUgT0NhbWwgQ0xJcyB0 aGF0DQogICAgICAgIGxpdmVzIGluIHRoZSBpbnRlcnNlY3Rpb24gb2Ygd2hhdCdzIGV4cHJlc3Np YmxlIGluIG90aGVyDQogICAgICAgIHdlbGwgZXN0YWJsaXNoZWQgbGlicmFyaWVzLg0KDQogICJP bmUgRURTTCB0byBjb21tYW5kIHRoZW0gYWxsLCIgc28gdG8gc3BlYWsuIEkgY291bGRuJ3QgcmVz aXN0IHRoZQ0KICB0ZW1wdGF0aW9uIHRvIGJ1aWxkIGFjdHVhbCB0ZXJtcyBmb3IgdGhlc2UgdHlw ZXMuIFRoYXQgZ2F2ZSBiaXJ0aCB0bw0KICBbY21kbGFuZ10uDQoNCiAgQXMgYSB0ZXN0LCBJIHN3 aXRjaGVkIG9uZSBvZiBteSBwcm9qZWN0cyB0byBgY21kbGFuZycsIHdpdGggYGNtZGxpbmVyJw0K ICBhcyBhIGJhY2tlbmQuIEkgbGlrZWQgdGhlIFtjaGFuZ2VzXSBJIG1hZGUgaW4gdGhlIHByb2Nl c3MuIFRoZSAxLWxpbmUNCiAgW2Jpbi9tYWluLm1sXSBpcyBub3cgdGhlIG9ubHkgcGxhY2UgdGhh dCBzcGVjaWZpZXMgd2hpY2ggYmFja2VuZCBJDQogIHdhbnQgdG8gdXNlOyB0aGUgcmVzdCBvZiB0 aGUgY29kZSBpcyBwcm9ncmFtbWVkIHNvbGVseSBhZ2FpbnN0IHRoZQ0KICBgY21kbGFuZycgQVBJ LiBUaGlzIG1lYW5zIEknbGwgYmUgYWJsZSB0byBlYXNpbHkgZXhwZXJpbWVudCB3aXRoDQogIGNv bXBpbGluZyBkb3duIHRvIGBjbGltYXRlJyBpbiB0aGUgZnV0dXJlLg0KDQogIEkgYW0gbm90IGFn YWluc3QgdGhlIG11bHRpcGxpY2l0eSBvZiBzb2x1dGlvbnMgaW4gZ2VuZXJhbCwgYnV0IEkgdGVu ZA0KICB0byBmZWVsIHVuZWFzeSB3aGVuIGluY29tcGF0aWJsZSBsaWJyYXJpZXMgZW1lcmdlLCBw YXJ0aXRpb25pbmcgdGhlDQogIGVjb3N5c3RlbS4gQXMgYSBjb21tdW5pdHksIHdlIGtub3cgdG9v IG1hbnkgZXhhbXBsZXMgb2YgdGhpcy4gSW4gdGhpcw0KICBpbnN0YW5jZSwgSSB3YW50IHRvIGNh bGwgdGhlIGBjb3JlLmNvbW1hbmQnIHZzIGBjbWRsaW5lcicgc2l0dWF0aW9uIGENCiAg4oCmIGNs aS12YWdlLg0KDQogIEkgZG9uJ3Qgc2VlIG15IHdvcmsgb24gYGNtZGxhbmcnIGFzIGNvbXBldGlu ZyB3aXRoIHRoZXNlIG90aGVyDQogIGxpYnJhcmllcy4gUXVpdGUgdGhlIGNvbnRyYXJ5LCBpdCBt YWtlcyBpdCBlYXNpZXIgZm9yIG1lIHRvIGV4cGVyaW1lbnQNCiAgd2l0aCB0aGVtIHdpdGhvdXQg bXVjaCBjaGFuZ2VzIHdoaWxlIGV4cGxvcmluZyB0aGUgc3ViamVjdCBvZiBDTEkgaW4NCiAgZ2Vu ZXJhbC4gQWxzbywgYXMgYSBsaWJyYXJ5IGF1dGhvciwgaWYgeW91IHdpc2ggdG8gZXhwb3NlIENM SSBoZWxwZXJzDQogIHRvIHlvdXIgdXNlcnMsIGEgbGlicmFyeSBsaWtlIGBjbWRsYW5nJyB3aWxs IGdpdmUgeW91IGEgcGxlYXNhbnQgd2F5DQogIHRvIGRvIHNvLCBhcyB5b3UgY2FuIGV4cHJlc3Mg eW91ciBoZWxwZXJzIHdpdGggaXQsIGtub3dpbmcgeW91ciB1c2Vycw0KICB3aWxsIGhhdmUgdGhl IGNob2ljZSB0byB0cmFuc2xhdGUgdGhlbSB0byB0aGUgYmFja2VuZCBvZiB0aGVpciBjaG9pY2Uu DQoNCiAgQmVmb3JlIHdyaXRpbmcgdGhpcyBwb3N0LCBJIGhhZCBhIHZlcnkgcGxlYXNhbnQgY2hh dCB3aXRoIEBncmlkYnVncy4gSQ0KICB3YW50IHRvIG1ha2UgaXQgY2xlYXIgdGhhdCBJIGRvIG5v dCB0aGluayBgY21kbGFuZycgaXMgY29tcGV0aW5nIHdpdGgNCiAgYGNsaW1hdGUnIGVpdGhlci4g SSB0aGluayBgY2xpbWF0ZScgaXMgYSB2ZXJ5IHByb21pc2luZyBsaWJyYXJ5IGFuZCBJDQogIGJl bGlldmUgaXQgd2lsbCwgaW4gZHVlIHRpbWUsIGRlbGl2ZXIgYXV0by1jb21wbGV0aW9uIHRvIG1h bnkgLSB0aGlzDQogIGhhcyBiZWVuIGEgaGlnaGx5IGFudGljaXBhdGVkIGZlYXR1cmUgd2l0aGlu IHRoZSBjb21tdW5pdHkuIEkgd2lzaCB0bw0KICBkZWRpY2F0ZSB0aGUgaW5pdGlhbCB3b3JrIHRo YXQgSSBkaWQgb24gYGNtZGxhbmcnIHRvIEBncmlkYnVncyBkdWUgdG8NCiAgdGhlIGltcGFjdGZ1 bCBpbmZsdWVuY2UgY2xpbWF0ZSBoYWQgb24gbXkgd29yaywgYW5kIGhvdyBpdCBoZWxwZWQgbWUN CiAgaW1wcm92ZSBteSBnZW5lcmFsIHVuZGVyc3RhbmRpbmcgb2YgZGVjbGFyYXRpdmUgQ0xJIGxp YnJhcmllcy4NCg0KICBUaGVzZSBhcmUgdmVyeSBlYXJseSBkYXlzIGZvciBgY21kbGFuZycuIFRo ZXJlIGFyZSBzdGlsbCBhcmVhcyBJIGFtDQogIGZ1enp5IG9uLCBhbmQgSSBoYXZlbid0IHJlYWxs eSB2YWxpZGF0ZWQgdGhlIHdob2xlIGRlc2lnbiB5ZXQuIEkgaGF2ZQ0KICBwdXQgc29tZSB0aG91 Z2h0cyBpbiB0aGlzIFtGdXR1cmUgUGxhbnNdIHBhZ2UuIE9uZSB0aGluZyB0aGF0IEkgZGlkDQog IG5vdCBpbml0aWFsbHkgaW5jbHVkZSB0aGVyZSB3b3VsZCBiZSB0byBleHBsb3JlIHRoZSBmZWFz aWJpbGl0eSBvZg0KICB3cml0aW5nIGEgbWluaS1jb21waWxlciBmb3IgYGNtZGxhbmcnIHRhcmdl dGluZyBgc3RkbGliLmFyZycgYXMgYQ0KICBydW5uZXIuIEkgYW0gbm90IHN1cmUgaG93IG11Y2gg eW91J2QgZW5kIHVwIHJlc3RyaWN0aW5nIGBjbWRsYW5nJyBmb3INCiAgdGhpcyB0byB3b3JrLiBJ IHRob3VnaHQgdGhhdCdkIGJlIGEgZnVuIHByb2plY3QgdG8gdGFja2xlIGF0IGEgZnV0dXJlDQog IHBvaW50LCBhcyBpdCB3b3VsZCBtYWtlIGEgbmljZSBhZGRpdGlvbiB0byB0aGUgb3ZlcmFsbCBh cmNoaXRlY3R1cmUgb2YNCiAgdGhlIHByb2plY3QuDQoNCiAgSSdkIHdlbGNvbWUgeW91ciBpbnB1 dCB0byBoZWxwIG1lIHNoYXBlIHRoZSBmdXR1cmUgb2YgYGNtZGxhbmcnIGlmIHlvdQ0KICBoYXZl IGFuIGludGVyZXN0IGluIHRoaXMgcHJvamVjdC4NCg0KICBUaGFua3MgZm9yIHJlYWRpbmchDQoN Cg0KW2NtZGxhbmddIDxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9jbWRsYW5nPg0KDQpbY2hh bmdlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2JvcGtpdC9wdWxsLzE0Pg0KDQpbYmlu L21haW4ubWxdIDxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9ib3BraXQvYmxvYi9tYWluL2Jp bi9tYWluLm1sPg0KDQpbRnV0dXJlIFBsYW5zXQ0KPGh0dHBzOi8vbWJhcmJpbi5naXRodWIuaW8v Y21kbGFuZy9kb2NzL2V4cGxhbmF0aW9uL2Z1dHVyZV9wbGFucy8+DQoNCg0KemFyciB2MC4xLjAN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXphcnItdjAtMS0wLzE1MjU5LzE+DQoNCg0Kem9qNjEz IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSGkgZXZlcnlvbmUsIEknZCBsaWtlIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxl YXNlIG9mIGB6YXJyJywgYW4NCiAgT2NhbWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFtaYXJyIHZl cnNpb24gMyBzdG9yYWdlIGZvcm1hdA0KICBzcGVjaWZpY2F0aW9uXSBmb3IgY2h1bmtlZCAmIGNv bXByZXNzZWQgbXVsdGktZGltZW5zaW9uYWwgYXJyYXlzLA0KICBkZXNpZ25lZCBmb3IgdXNlIGlu IHBhcmFsbGVsIGNvbXB1dGluZy4NCg0KICA8aHR0cHM6Ly96YXJyLXNwZWNzLnJlYWR0aGVkb2Nz LmlvL2VuL2xhdGVzdC9faW1hZ2VzL3Rlcm1pbm9sb2d5LWhpZXJhcmNoeS5leGNhbGlkcmF3LnBu Zz4NCg0KDQpbWmFyciB2ZXJzaW9uIDMgc3RvcmFnZSBmb3JtYXQgc3BlY2lmaWNhdGlvbl0NCjxo dHRwczovL3phcnItc3BlY3MucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3YzL2NvcmUvdjMuMC5o dG1sPg0KDQp3aHk/DQrilYzilYzilYzilYwNCg0KICBUaGUgcHJvamVjdCB3YXMgbWFpbmx5IGlu c3BpcmVkIGJ5IHRoZSBsYWNrIG9mIGZ1bmN0aW9uYWwgcHJvZ3JhbW1pbmcNCiAgbGFuZ3VhZ2Ug aW1wbGVtZW50YXRpb25zIG9mIHRoaXMgc3BlY2lmaWNhdGlvbiBhcyBzaG93biBpbiB0aGlzDQog IFtpbXBsZW1lbnRhdGlvbnMgdGFibGVdLiBTaW5jZSBJIGhhdmUgYmVlbiBsZWFybmluZyBPQ2Ft bCB0aGVzZSBwYXN0DQogIGZldyBtb250aHMgSSBmaWd1cmVkIEknZCB0YWtlIG9uIHRoZSBjaGFs bGVuZ2Ugb2YgcHJvZHVjaW5nIHRoZSBmaXJzdA0KICBmdW5jdGlvbmFsIHByb2dyYW1taW5nIGlt cGxlbWVudGF0aW9uIG9mIFphcnIsIGFuZCBpdCB3YXMgYSBncmVhdA0KICBsZWFybmluZyBleHBl cmllbmNlIQ0KDQoNCltpbXBsZW1lbnRhdGlvbnMgdGFibGVdIDxodHRwczovL3phcnIuZGV2L2lt cGxlbWVudGF0aW9ucy8+DQoNCg0KRmVhdHVyZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiBTdXBwb3J0cyBjcmVhdGluZyBuLWRpbWVuc2lvbmFsIFphcnIgYXJyYXlzIGFuZCBj aHVua2luZyB0aGVtIGFsb25nDQogICAgYW55IGRpbWVuc2lvbi4NCiAg4oCiIENvbXByZXNzIGFy cmF5IGNodW5rcyB1c2luZyBhIHZhcmlldHkgb2Ygc3VwcG9ydGVkIGNvbXByZXNzaW9uDQogICAg Y29kZWNzLg0KICDigKIgU3VwcG9ydHMgaW5kZXhpbmcgb3BlcmF0aW9ucyB0byByZWFkL3dyaXRl IHZpZXdzIG9mIGEgWmFyciBhcnJheS4NCiAg4oCiIFN1cHBvcnRzIHN0b3JpbmcgYXJyYXlzIGlu LW1lbW9yeSBvciB0aGUgbG9jYWwgZmlsZXN5c3RlbS4gSXQgaXMNCiAgICBhbHNvIGV4dGVuc2li bGUsIGFsbG93aW5nIHVzZXJzIHRvIGVhc2lseSBjcmVhdGUgYW5kIHVzZSB0aGVpciBvd24NCiAg ICBjdXN0b20gc3RvcmFnZSBiYWNrZW5kcy4gU2VlIHRoZSBleGFtcGxlIGltcGxlbWVudGluZyBh IFtaaXAgZmlsZQ0KICAgIHN0b3JlXSBmb3IgbW9yZSBkZXRhaWxzLg0KICDigKIgU3VwcG9ydHMg Ym90aCBzeW5jaHJvbm91cyBhbmQgY29uY3VycmVudCBJL08gdmlhIGBMd3QnIGFuZCBgRWlvJy4N CiAg4oCiIExldmVyYWdlcyB0aGUgc3Ryb25nIHR5cGUgc3lzdGVtIG9mIE9jYW1sIHRvIGNyZWF0 ZSBhIHR5cGUtc2FmZSBBUEk7DQogICAgbWFraW5nIGl0IGltcG9zc2libGUgdG8gY3JlYXRlLCBy ZWFkIG9yIHdyaXRlIG1hbGZvcm1lZCBhcnJheXMuDQogIOKAoiBTdXBwb3J0cyBvcmdhbml6aW5n IGFycmF5cyBpbnRvIGhpZXJhcmNoaWVzIHVzaW5nIFtHcm91cHNdLg0KDQoNCltaaXAgZmlsZSBz dG9yZV0NCjxodHRwczovL2dpdGh1Yi5jb20vem9qNjEzL3phcnItbWwvYmxvYi9tYWluL2V4YW1w bGVzL2lubWVtb3J5X3ppcHN0b3JlLm1sPg0KDQpbR3JvdXBzXQ0KPGh0dHBzOi8vemFyci1zcGVj cy5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvdjMvY29yZS92My4wLmh0bWwjZ3JvdXA+DQoNCg0K RXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQmVsb3cgaXMgYSBkZW1vIG9mIHRo ZSBsaWJyYXJ5J3MgQVBJIGZvciBjcmVhdGluZywgcmVhZGluZyBhbmQgd3JpdGluZw0KICB0byBh IFphcnIgaGllcmFyY2h5Lg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wZW4gWmFycg0KICDi lIIgb3BlbiBaYXJyLk1ldGFkYXRhDQogIOKUgiBvcGVuIFphcnIuTm9kZQ0KICDilIIgb3BlbiBa YXJyLkNvZGVjcw0KICDilIIgb3BlbiBaYXJyLkluZGV4aW5nDQogIOKUgiBvcGVuIFphcnJfc3lu Yy5TdG9yYWdlDQogIOKUgiAoKiBvcGVucyBpbmZpeCBvcGVyYXRvcnMgPj49IGFuZCA+PnwgZm9y IG1vbmFkaWMgYmluZCAmIG1hcCAqKQ0KICDilIIgb3BlbiBGaWxlc3l0ZW1TdG9yZS5EZWZlcnJl ZC5JbmZpeA0KICDilIIgDQogIOKUgiBsZXQgc3RvcmUgPSBGaWxlc3lzdGVtU3RvcmUuY3JlYXRl ICJ0ZXN0ZGF0YS56YXJyIiBpbg0KICDilIIgbGV0IGdyb3VwX25vZGUgPSBHcm91cE5vZGUub2Zf cGF0aCAiL3NvbWUvZ3JvdXAiIGluDQogIOKUgiBGaWxlc3lzdGVtU3RvcmUuY3JlYXRlX2dyb3Vw IHN0b3JlIGdyb3VwX25vZGU7DQogIOKUgiBsZXQgYXJyYXlfbm9kZSA9IEFycmF5Tm9kZS4oZ3Jv dXBfbm9kZSAvICJuYW1lIik7Ow0KICDilIIgKCogY3JlYXRlcyBhbiBhcnJheSB3aXRoIGNoYXIg ZGF0YSB0eXBlIGFuZCBmaWxsIHZhbHVlICc/JyAqKQ0KICDilIIgRmlsZXN5c3RlbVN0b3JlLmNy ZWF0ZV9hcnJheQ0KICDilIIgICB+Y29kZWNzOltgVHJhbnNwb3NlIFt8MjsgMDsgMXxdOyBgQnl0 ZXMgQkU7IGBHemlwIEwyXQ0KICDilIIgICB+c2hhcGU6W3wxMDA7IDEwMDsgNTB8XQ0KICDilIIg ICB+Y2h1bmtzOlt8MTA7IDE1OyAyMHxdDQogIOKUgiAgIE5kYXJyYXkuQ2hhciANCiAg4pSCICAg Jz8nDQogIOKUgiAgIGFycmF5X25vZGUNCiAg4pSCICAgc3RvcmU7DQogIOKUgiBsZXQgc2xpY2Ug PSBbfFIgW3wwOyAyMHxdOyBJIDEwOyBSIFt8fF18XSBpbg0KICDilIIgbGV0IHggPSBGaWxlc3lz dGVtU3RvcmUucmVhZF9hcnJheSBzdG9yZSBhcnJheV9ub2RlIHNsaWNlIE5kYXJyYXkuQ2hhciBp bg0KICDilIIgKCogRG8gc29tZSBjb21wdXRhdGlvbiBvbiB0aGUgYXJyYXkgc2xpY2UgKikNCiAg 4pSCIGxldCB4JyA9IFphcnIuTmRhcnJheS5tYXAgKGZ1biBfIC0+IFJhbmRvbS5pbnQgMjU2IHw+ IENoYXIuY2hyKSB4IGluDQogIOKUgiBGaWxlc3lzdGVtU3RvcmUud3JpdGVfYXJyYXkgc3RvcmUg YXJyYXlfbm9kZSBzbGljZSB4JzsNCiAg4pSCIGxldCB5ID0gRmlsZXN5c3RlbVN0b3JlLnJlYWRf YXJyYXkgc3RvcmUgYXJyYXlfbm9kZSBzbGljZSBOZGFycmF5LkNoYXIgaW4NCiAg4pSCIGFzc2Vy dCAoTmRhcnJheS5lcXVhbCB4JyB5KTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KSW5zdGFsbGF0 aW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgbGlicmFy eSBjb21lcyBpbiBzZXZlcmFsIGZsYXZvcnMgZGVwZW5kaW5nIG9uIHRoZSBzeW5jaHJvbm91cyAv DQogIGFzeW5jaHJvbm91cyBiYWNrZW5kIG9mIGNob2ljZS4gVG8gaW5zdGFsbCB0aGUgc3luY2hy b25vdXMgQVBJLCB1c2UNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCB6 YXJyLXN5bmMNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVG8gaW5zdGFsbCB6YXJyIHdpdGggYW4g YXN5bmNocm9ub3VzIEFQSSBwb3dlcmVkIGJ5IGBMd3QnIG9yIGBFaW8nLA0KICB1c2UNCiAg4pSM 4pSA4pSA4pSA4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCB6YXJyLWx3dA0KICDilIIgJCBvcGFt IGluc3RhbGwgemFyci1laW8NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGRvY3VtZW50YXRp b24gY2FuIGJlIGZvdW5kIFtoZXJlXSBhbmQgdGhlIHNvdXJjZSBjb2RlIFt0aGVyZV0NCg0KICBJ J20gaGFwcHkgdG8gYW5zd2VyIGFueSBxdWVzdGlvbnMgcmVnYXJkaW5nIHRoZSBsaWJyYXJ5IGFu ZCBtb3JlIHRoYW4NCiAgd2VsY29tZSBzdWdnZXN0aW9ucyBmb3IgaW1wcm92ZW1lbnRzIChlc3Bl Y2lhbGx5IHBlcmZvcm1hbmNlISksIGlzc3VlDQogIHJlcG9ydHMgYXMgd2VsbCBhcyBQUidzLg0K DQoNCltoZXJlXSA8aHR0cHM6Ly96b2o2MTMuZ2l0aHViLmlvL3phcnItbWwvPg0KDQpbdGhlcmVd IDxodHRwczovL2dpdGh1Yi5jb20vem9qNjEzL3phcnItbWw+DQoNCg0KQnJyIDAuMC43DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1icnItMC0wLTcvMTUyNjMvMT4NCg0KDQpEYW5pZWwgQsO8bnpsaSBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZXJlJ2EgbmV3IHJlbGVhc2Ugb2YgW0Jycl0sIGFu IElTQyBsaWNlbmNlZCB0b29sa2l0IGZvciBwcm9ncmFtbWluZw0KICBicm93c2VycyB3aXRoIHRo ZSBganNfb2Zfb2NhbWwnIGNvbXBpbGVyLg0KDQogIFRoaXMgcmVsZWFzZSBoYXMgc29tZSBjaGFu Z2VzIHRvIHN1cHBvcnQgd29yayBiZWluZyBkb25lIGZvcg0KICBgd2FzbV9vZl9vY2FtbCc7IHRo YW5rcyB0byBAdm91aWxsb24gZm9yIGhpcyBwYXRjaGVzLiBUaGVyZSBhcmUgYWxzbw0KICBvdGhl ciBzbWFsbCBmaXhlcyBhbmQgYWRkaXRpb25zLCBjb25zdWx0IHRoZSBbcmVsZWFzZSBub3Rlc10g Zm9yIHRoZQ0KICBkZXRhaWxzIGFuZCB0aGFua3MgdG8gYWxsIHRoZSBjb250cmlidXRvcnMuDQoN CiAgQSBiaWcgdGhhbmtzIHRvIG15IFtkb25hdG9yc10gZm9yIHN1cHBvcnRpbmcgbXkgd29yay4g SSB3ZWxjb21lIHRoZQ0KICAobm90IHNvW14xXSkgbmV3IGRvbmF0b3IgW1RhcmlkZXNdLg0KDQog IFtIb21lIHBhZ2VdLCBbRG9jcyBhbmQgbWFudWFsc10gb3IgYG9kaWcgZG9jIGJycicNCg0KICBJ bnN0YWxsOiBgb3BhbSBpbnN0YWxsIGJycicgKFtQUl0pDQoNCiAgQmVzdCwNCg0KICBEYW5pZWwN Cg0KICBbXjFdOiBUYXJpZGVzIGhhcyBiZWVuIC9nZW5lcm91c2x5LyBkb25hdGluZyBmb3IgbXkg d29yayBmcm9tIHRoZQ0KICBvbnNldCBidXQgdXNlZCB0byBkbyBpdCB2aWEgdGhlIFtNaXJhZ2Vd IG9yZ2FuaXNhdGlvbi4NCg0KDQpbQnJyXSA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUv YnJyPg0KDQpbcmVsZWFzZSBub3Rlc10NCjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvYnJy L2Jsb2IvZjlmNGRlNWM5Mzg1Y2ViODAxNjRjMDQzOTQzZTNhMmQ2NWU1NzdjMy9DSEFOR0VTLm1k I3YwMDctMjAyNC0wOS0wOS16YWdyZWI+DQoNCltkb25hdG9yc10gPGh0dHBzOi8vZ2l0aHViLmNv bS9zcG9uc29ycy9kYnVlbnpsaT4NCg0KW1RhcmlkZXNdIDxodHRwczovL3RhcmlkZXMuY29tLz4N Cg0KW0hvbWUgcGFnZV0gPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2Jycj4NCg0KW0Rv Y3MgYW5kIG1hbnVhbHNdIDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9icnIvZG9jLz4N Cg0KW1BSXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzI2 NTE3Pg0KDQpbTWlyYWdlXSA8aHR0cHM6Ly9naXRodWIuY29tL21pcmFnZT4NCg0KDQpPY3NpZ2Vu IFNlcnZlciA2LjAuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tb2NzaWdlbi1zZXJ2ZXItNi0wLTAvMTUyNjUvMT4NCg0KDQpWaW5jZW50IEJh bGF0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UncmUgZGVsaWdodGVkIHRvIGFubm91 bmNlIGEgbWFqb3IgbmV3IHZlcnNpb24gb2YgT2NzaWdlbiBTZXJ2ZXIhDQogIFRoaXMgdmVyc2lv biA2LjAuMCBmb2N1c2VzIG9uIHRoZSB1c2Ugb2YgT2NzaWdlbiBTZXJ2ZXIgYXMgYSBsaWJyYXJ5 LA0KICB3aXRob3V0IGFueSBjb25maWd1cmF0aW9uIGZpbGUsIHdoaWNoIGlzIG5vdyBtdWNoIGVh c2llciBhbmQgYnJpbmdzDQogIHRoZSBleGFjdCBzYW1lIGZlYXR1cmVzIGFzIHRoZSBleGVjdXRh YmxlLg0KDQogICpFeGFtcGxlIG9mIHVzZToqDQoNCiAgVG8gYWRkIGEgV2ViIHNlcnZlciB0byB5 b3VyIE9DYW1sIHByb2dyYW0sIHNlcnZpbmcgc3RhdGljIGZpbGVzIGZyb20NCiAgZGlyZWN0b3J5 IGBzdGF0aWNgOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBfID0gT2NzaWdlbl9zZXJ2 ZXIuc3RhcnQgDQogIOKUgiAgICAgICAgICAgWyBPY3NpZ2VuX3NlcnZlci5ob3N0IFtTdGF0aWNt b2QucnVuIH5kaXI6InN0YXRpYyIgKCldXQ0KICDilJTilIDilIDilIDilIANCg0KICBJbnN0YWxs Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBpbnN0YWxsIG9jc2lnZW5zZXJ2ZXIN CiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRXhhbXBsZSBvZiBEdW5lIGZpbGUgZm9yIHRoaXMgcHJv Z3JhbToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoZXhlY3V0YWJsZQ0KICDilIIgIChwdWJs aWNfbmFtZSBteXByb2plY3QpDQogIOKUgiAgKG5hbWUgbWFpbikNCiAg4pSCICAobGlicmFyaWVz DQogIOKUgiAgIG1haW4NCiAg4pSCICAgb2NzaWdlbnNlcnZlcg0KICDilIIgICBvY3NpZ2Vuc2Vy dmVyLmV4dC5zdGF0aWNtb2QpKQ0KICDilJTilIDilIDilIDilIANCg0KICBDb21waWxlIHdpdGg6 DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZHVuZSBidWlsZA0KICDilJTilIDilIDilIDilIAN Cg0KICBPY3NpZ2VuIFNlcnZlciBjYW4gb2YgY291cnNlIHN0aWxsIGJlIHVzZWQgYXMgYW4gZXhl Y3V0YWJsZSB0YWtpbmcgaXRzDQogIGNvbmZpZ3VyYXRpb24gZnJvbSBhIGZpbGUuIFRoaXMgYWxs b3dzIGZvciBub24gT0NhbWwgZGV2ZWxvcGVycyB0byB1c2UNCiAgaXQgYW5kIG1ha2UgdGhlaXIg b3duIGNvbmZpZ3VyYXRpb25zLiBJdCBhbHNvIG1ha2VzIGl0IHBvc3NpYmxlIHRvDQogIGRpc3Ry aWJ1dGUgYSBiaW5hcnkgdmVyc2lvbiBvZiB5b3VyIFdlYiBhcHBsaWNhdGlvbnMuDQoNCiAgT2Nz aWdlbiBTZXJ2ZXIgaXMgYnVpbGQgaW4gbW9kdWxhciBhbmQgZXh0ZW5zaWJsZSB3YXkuIFRoZSBk ZWZhdWx0DQogIG9wYW0gcGFja2FnZXMgY29tZXMgd2l0aCBzZXZlcmFsIGV4dGVuc2lvbnMuIElu IHRoZSBleGFtcGxlIGFib3ZlLCB3ZQ0KICBhcmUgdXNpbmcgU3RhdGljbW9kIGZvciBzZXJ2aW5n IHN0YXRpYyBmaWxlcy4gT3RoZXIgZXh0ZW5zaW9ucyBtYWtlcw0KICBpdCBwb3NzaWJsZSBmb3Ig ZXhhbXBsZSB0byBjb25maWd1cmUgcmVkaXJlY3Rpb25zLCB0byBjb250cm9sIHRoZQ0KICBhY2Nl c3MgdG8gc29tZSBzdWItZGlyZWN0b3J5LCB0byB1c2UgYSByZXZlcnNlIHByb3h5LCB0byByZXdy aXRlIHRoZQ0KICByZXF1ZXN0LCBjb21wcmVzcyB0aGUgb3V0cHV0IGV0Yy4NCg0KICBUaGUgcHJv Z3JhbW1pbmcgaW50ZXJmYWNlIGZvbGxvd3MgZXhhY3RseSB0aGUgc3RydWN0dXJlIG9mIHRoZQ0K ICBjb25maWd1cmF0aW9uIGZpbGU6IGluc3RydWN0aW9ucyBhcmUgdHJpZWQgaW4gb3JkZXIgdW50 aWwgb25lDQogIGdlbmVyYXRlcyBhIHJlc3VsdCwgdGhlbiBzb21lIG90aGVyIGluc3RydWN0aW9u cyBjYW4gYmUgdXNlZCB0byBjaGFuZ2UNCiAgdGhlIHJlc3VsdCAobGlrZSBjb21wcmVzc2luZyBp dCBvciBhZGRpbmcgc29tZSBoZWFkZXJzKS4NCg0KICBIZXJlIGlzIGEgbW9yZSBjb21wbGV4IGV4 YW1wbGUgb2YgY29uZmlndXJhdGlvbjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgXyA9 DQogIOKUgiAgIE9jc2lnZW5fc2VydmVyLnN0YXJ0DQogIOKUgiAgICAgfnBvcnRzOltgQWxsLCA4 MDgwXQ0KICDilIIgICAgIH5jb21tYW5kX3BpcGU6ImxvY2FsL3Zhci9ydW4vbXlzaXRlLWNtZCIN CiAg4pSCICAgICB+bG9nZGlyOiJsb2NhbC92YXIvbG9nL215c2l0ZSINCiAg4pSCICAgICB+ZGF0 YWRpcjoibG9jYWwvdmFyL2RhdGEvbXlzaXRlIg0KICDilIIgICAgIH5kZWZhdWx0X2NoYXJzZXQ6 KFNvbWUgInV0Zi04IikNCiAg4pSCICAgICBbIE9jc2lnZW5fc2VydmVyLmhvc3QNCiAg4pSCICAg ICAgICAgfnJlZ2V4cDoibXlkb21haW4uY29tIg0KICDilIIgICAgICAgICBbIE9jc2lnZW5fc2Vy dmVyLnNpdGUgWyJzdWJzaXRlIl0NCiAg4pSCICAgICAgICAgICAgIFsgQWNjZXNzY29udHJvbC4o DQogIOKUgiAgICAgICAgICAgICAgICAgaWZfDQogIOKUgiAgICAgICAgICAgICAgICAgICAoYW5k Xw0KICDilIIgICAgICAgICAgICAgICAgICAgICAgWyBpcCAiMTIyLjEyMi4xMjIuMTIyIg0KICDi lIIgICAgICAgICAgICAgICAgICAgICAgOyBoZWFkZXIgfm5hbWU6InVzZXItYWdlbnQiIH5yZWdl eHA6Ii4qRm9vQmFyLioiDQogIOKUgiAgICAgICAgICAgICAgICAgICAgICA7IG1ldGhvZF8gYFBP U1QgXSkNCiAg4pSCICAgICAgICAgICAgICAgICAgIFtmb3JiaWRkZW5dIFtdKQ0KICDilIIgICAg ICAgICAgICAgOyBBdXRoYmFzaWMucnVuIH5yZWFsbToibXlyZWFsbSINCiAg4pSCICAgICAgICAg ICAgICAgICB+YXV0aDooZnVuIF91IHAgLT4gTHd0LnJldHVybiAocCA9ICJ0b3RvIikpDQogIOKU giAgICAgICAgICAgICAgICAgKCkNCiAg4pSCICAgICAgICAgICAgIDsgU3RhdGljbW9kLnJ1biB+ ZGlyOiJsb2NhbC92YXIvd3d3L290aGVyZGlyIiAoKSBdDQogIOKUgiAgICAgICAgIDsgT2NzaWdl bl9zZXJ2ZXIuc2l0ZSBbIm90aGVyc3Vic2l0ZSJdDQogIOKUgiAgICAgICAgICAgICBbIFJldnBy b3h5LnJ1bg0KICDilIIgICAgICAgICAgICAgICAgIH5yZWRpcmVjdGlvbjoNCiAg4pSCICAgICAg ICAgICAgICAgICAgIChSZXZwcm94eS5jcmVhdGVfcmVkaXJlY3Rpb24gfmZ1bGxfdXJsOmZhbHNl IH5yZWdleHA6IiguKikiDQogIOKUgiAgICAgICAgICAgICAgICAgICAgICB+a2VlcGhvc3Q6dHJ1 ZSAiaHR0cDovL2xvY2FsaG9zdDo4ODg4L1xcMSIpDQogIOKUgiAgICAgICAgICAgICAgICAgKCkg XQ0KICDilIIgICAgICAgICA7IFJlZGlyZWN0bW9kLnJ1bg0KICDilIIgICAgICAgICAgICAgfnJl ZGlyZWN0aW9uOg0KICDilIIgICAgICAgICAgICAgICAoUmVkaXJlY3Rtb2QuY3JlYXRlX3JlZGly ZWN0aW9uIH5mdWxsX3VybDpmYWxzZSB+cmVnZXhwOiJvbGQoLiopIg0KICDilIIgICAgICAgICAg ICAgICAgICAibmV3XFwxIikNCiAg4pSCICAgICAgICAgICAgICgpDQogIOKUgiAgICAgICAgIDsg U3RhdGljbW9kLnJ1biB+ZGlyOiJsb2NhbC92YXIvd3d3L3N0YXRpY2RpciIgKCkNCiAg4pSCICAg ICAgICAgOyBDb3JzLnJ1biB+bWF4X2FnZTo4NjQwMCB+Y3JlZGVudGlhbHM6dHJ1ZSB+bWV0aG9k czpbYFBPU1Q7IGBHRVQ7IGBIRUFEXQ0KICDilIIgICAgICAgICAgICAgfmV4cG9zZWRfaGVhZGVy czoNCiAg4pSCICAgICAgICAgICAgICAgWyAieC1lbGlvbS1hcHBsaWNhdGlvbiINCiAg4pSCICAg ICAgICAgICAgICAgOyAieC1lbGlvbS1sb2NhdGlvbiINCiAg4pSCICAgICAgICAgICAgICAgOyAi eC1lbGlvbS1zZXQtcHJvY2Vzcy1jb29raWVzIg0KICDilIIgICAgICAgICAgICAgICA7ICJ4LWVs aW9tLXNldC1jb29raWUtc3Vic3RpdHV0ZXMiIF0NCiAg4pSCICAgICAgICAgICAgICgpDQogIOKU giAgICAgICAgIDsgRGVmbGF0ZW1vZC5ydW4NCiAg4pSCICAgICAgICAgICAgIH5tb2RlOg0KICDi lIIgICAgICAgICAgICAgICAoYE9ubHkNCiAg4pSCICAgICAgICAgICAgICAgICBbIGBUeXBlIChT b21lICJ0ZXh0IiwgU29tZSAiaHRtbCIpDQogIOKUgiAgICAgICAgICAgICAgICAgOyBgVHlwZSAo U29tZSAidGV4dCIsIFNvbWUgImphdmFzY3JpcHQiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsg YFR5cGUgKFNvbWUgInRleHQiLCBTb21lICJjc3MiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsg YFR5cGUgKFNvbWUgImFwcGxpY2F0aW9uIiwgU29tZSAiamF2YXNjcmlwdCIpDQogIOKUgiAgICAg ICAgICAgICAgICAgOyBgVHlwZSAoU29tZSAiYXBwbGljYXRpb24iLCBTb21lICJ4LWphdmFzY3Jp cHQiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsgYFR5cGUgKFNvbWUgImFwcGxpY2F0aW9uIiwg U29tZSAieGh0bWwreG1sIikNCiAg4pSCICAgICAgICAgICAgICAgICA7IGBUeXBlIChTb21lICJp bWFnZSIsIFNvbWUgInN2Zyt4bWwiKQ0KICDilIIgICAgICAgICAgICAgICAgIDsgYFR5cGUgKFNv bWUgImFwcGxpY2F0aW9uIiwgU29tZSAieC1lbGlvbSIpIF0pDQogIOKUgiAgICAgICAgICAgICAo KSBdIF0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSW4gdGhpcyBleGFtcGxlLCB0aGUgc2VydmVy IGRlZmluZXMgb25lIHZpcnR1YWwgaG9zdCBmb3IgZG9tYWluDQogIGBteWRvbWFpbi5jb20nLiBJ dCB3aWxsIGZpcnN0IGNoZWNrIHdoZXRoZXIgaXQgaXMgYSByZXF1ZXN0IGZvcg0KICBkaXJlY3Rv cnkgYHN1YnNpdGUvJywgYW5kIGlmIHllcywgd2lsbCByZWplY3QgdGhlIHJlcXVlc3Qgd2l0aCA0 MDMNCiAgRm9yYmlkZGVuIGlmIGl0IGlzIGEgUE9TVCByZXF1ZXN0IGNvbWluZyBmcm9tIHVzZXIt YWdlbnQgYEZvb0JhcicgYXQNCiAgSVAgMTIyLjEyMi4xMjIuMTIyLiBJZiBub3QsIGl0IHdpbGwg YXNrIGZvciBhIHBhc3N3b3JkIGJlZm9yZSBzZXJ2aW5nDQogIGZpbGVzIGZyb20gZGlyZWN0b3J5 IGBsb2NhbC92YXIvd3d3L290aGVyZGlyJy4gIFRoZW4gd2UgZGVmaW5lIGFub3RoZXINCiAgc3Vi c2l0ZSBgb3RoZXJzdWJzaXRlJyBmb3Igd2hpY2ggdGhlIHJlcXVlc3RzIHdpbGwgYmUgdHJhbnNm ZXJlZCB0bw0KICBhbm90aGVyIFdlYiBzZXJ2ZXIgcnVubmluZyBsb2NhbGx5IG9uIHBvcnQgODg4 OCwgdGhlbiByZXdyaXRlIHRoZQ0KICBhbnN3ZXIgbG9jYXRpb24gaGVhZGVyIGFjY29yZGluZ2x5 LiAgVGhlbiwgaWYgdGhlIHBhZ2UgaXMgc3RpbGwgbm90DQogIGdlbmVyYXRlZCwgdGhlIHNlcnZl ciB3aWxsIHNlbmQgYSByZWRpcmVjdGlvbiBpZiBVUkxzIHN0YXJ0cyB3aXRoDQogICJvbGQiLiAg T3RoZXJ3aXNlLCBpdCB3aWxsIHRyeSB0byBzZXJ2ZSBmaWxlcyBmcm9tIGRpcmVjdG9yeQ0KICBg bG9jYWwvdmFyL3d3dy9zdGF0aWNkaXInLiAgSWYgdGhlIHBhZ2UgaGFzIHN0aWxsIG5vdCBiZWVu IGZvdW5kLCBhDQogIGA0MDQgTm90IGZvdW5kJyB3aWxsIGJlIHNlbnQsIG90aGVyd2lzZSwgc29t ZSBDT1JTIGhlYWRlcnMgd2lsbCBiZQ0KICBhZGRlZCwgYW5kIHRoZSByZXN1bHQgd2lsbCBiZSBj b21wcmVzc2VkIGJlZm9yZSBiZWluZyBzZW50Lg0KDQogIENvbXBpbGUgdGhpcyBleGFtcGxlIHdp dGggdGhlIGZvbGxvd2luZyBkdW5lIGZpbGU6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGV4 ZWN1dGFibGUNCiAg4pSCICAocHVibGljX25hbWUgbXlzZXJ2ZXIpDQogIOKUgiAgKG5hbWUgbWFp bikNCiAg4pSCICAobGlicmFyaWVzDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXINCiAg4pSCICAgb2Nz aWdlbnNlcnZlci5leHQuc3RhdGljbW9kDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXIuZXh0LmF1dGhi YXNpYw0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4dC5leHRlbmRjb25maWd1cmF0aW9uDQogIOKU giAgIG9jc2lnZW5zZXJ2ZXIuZXh0Lm91dHB1dGZpbHRlcg0KICDilIIgICBvY3NpZ2Vuc2VydmVy LmV4dC5jb3JzDQogIOKUgiAgIG9jc2lnZW5zZXJ2ZXIuZXh0LmFjY2Vzc2NvbnRyb2wNCiAg4pSC ICAgb2NzaWdlbnNlcnZlci5leHQuZGVmbGF0ZW1vZA0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4 dC5yZWRpcmVjdG1vZA0KICDilIIgICBvY3NpZ2Vuc2VydmVyLmV4dC5yZXZwcm94eQ0KICDilIIg ICkpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEVsaW9tIGFuZCBPY3NpZ2VuIFN0YXJ0IGhhdmUg YWxzbyBiZWVuIHVwZGF0ZWQgZm9yIGJlaW5nIHVzZWQgd2l0aG91dA0KICBjb25maWd1cmF0aW9u IGZpbGUgYW5kIHdpbGwgYmUgcmVsZWFzZWQgdmVyeSBzb29uLg0KDQoNCmRyZWFtLWh0bWwgYW5k IHB1cmUtaHRtbA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHJlYW0taHRtbC1wdXJlLWh0bWwtMy01LTIvMTQ4MDgvND4N Cg0KDQpZYXdhciBBbWluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgW0FOTl0gZHJlYW0taHRtbCAmIHB1 cmUtaHRtbCAzLjYuMSwgMy42LjINCg0KICBBIGRvdWJsZSBhbm5vdW5jZW1lbnQ6DQoNCiAgMy42 LjE6IHdoZW4gaW4gWE1MIHJlbmRlcmluZyBtb2RlLCBjb3JyZWN0bHkgcmVuZGVyIGVtcHR5LXZh bHVlDQogIGF0dHJpYnV0ZXMgYXMgaGF2aW5nIGFuIGVtcHR5IHN0cmluZyB2YWx1ZS4gVGhhbmtz IHRvIEBqb25zdGVybGluZyAhDQoNCiAgMy42LjI6IGF1dG9tYXRpY2FsbHkgc3dpdGNoIHRvIFhN TCByZW5kZXJpbmcgbW9kZSB3aGVuIHJlbmRlcmluZyBTVkcNCiAgYW5kIE1hdGhNTCB0YWdzIGlu c2lkZSBIVE1MIHJlbmRlcmluZyBtb2RlLg0KDQoNCkFkdmFuY2VkIENvZGUgTmF2aWdhdGlvbiBj b21pbmcgdG8gT0NhbWwtTFNQDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1hZHZhbmNlZC1jb2RlLW5hdmlnYXRpb24t Y29taW5nLXRvLW9jYW1sLWxzcC8xNTI2Ni8xPg0KDQoNClBpemllRHVzdCBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQpKdW1wIHRvIFRhcmdldA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgQ3VycmVudGx5LCB0aGUgc3RhbmRhcmQgTFNQIHByb3RvY29sIG9ubHkgYWxsb3dz IGZvciBnZW5lcmFsaXplZCBjb2RlDQogIG5hdmlnYXRpb24gKGBnb3RvIGRlZmluaXRpb25gLCBg Z290byBkZWNsYXJhdGlvbmAsIGBnb3RvDQogIGltcGxlbWVudGF0aW9uYCwgYGdvdG8gdHlwZS1k ZWZpbml0aW9uYCksIHdoaWNoIGlzIG5vdCB2ZXJ5IHVzZWZ1bA0KICB3aGVuIGl0IGNvbWVzIHRv IHByZWNpc2UgbW92ZW1lbnRzLg0KDQogIENvbWluZyB0byBPQ2FtbC1sc3Agc29vbiB3aWxsIGJl IHRoZSBhYmlsaXR5IHRvIGp1bXAgZnJvbSBvbmUgcG9pbnQgaW4NCiAgeW91ciBjb2RlIHRvIGFu b3RoZXIgYmFzZWQgb24gW01lcmxpbidzIEp1bXBdIGNvbW1hbmQuDQoNCiAgSW1wbGVtZW50aW5n IHRoaXMgZnVuY3Rpb25hbGl0eSB0b29rIGEgYml0IG9mIHRoaW5raW5nIGFzIHdlIHdhbnRlZCBh DQogICBzb2x1dGlvbiB0aGF0IHdvcmtzIGZvciBhbGwgc3VwcG9ydGVkIGVkaXRvcnMgKFZzY29k ZSwgRW1hY3MgYW5kIFZpbSkNCiAgIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgc3BlY2lmaWMgY2xp ZW50IGltcGxlbWVudGF0aW9ucy4gIFdlIHVzZWQgYQ0KICAgY29tYmluYXRpb24gb2YgY2FsbCBh Y3Rpb25zIHBsdXMgdGhlIExTUCBzaG93RG9jdW1lbnRSZXF1ZXN0IHRvIG1vdmUNCiAgIHRoZSBj dXJzb3IgdG8gdGhlIGludGVyZXN0aW5nIHBvc2l0aW9uLg0KDQogIFRoZSBjYWxsIGFjdGlvbnMg ZGlzcGxheSBhcmUgY29udGV4dHVhbCBhbmQgd2lsbCBkaXNwbGF5IG9ubHkgaWYgaXQncw0KICBy ZWxldmFudCB0byB0aGUgY29kZSB1bmRlciB0aGUgY3Vyc29yLg0KDQogIEhlcmUgaXMgYSBkZW1v IGluIFZTQ29kZS4NCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vYnVzaW5l c3M3L3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvNi82MThiZmQ3N2RiMWE4OTI1NmVlZWFmNjli NmQzODE3ZGJmZGQ4ZGMwLmdpZj4NCg0KDQpbTWVybGluJ3MgSnVtcF0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvbWVybGluL2Jsb2IvbWFpbi9kb2MvZGV2L1BST1RPQ09MLm1kI2p1bXAtLXRh cmdldC1zdHJpbmctLXBvc2l0aW9uLXBvc2l0aW9uPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRo ZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBt YW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoN CiAg4oCiIFtPdXRyZWFjaHkgTWF5IDIwMjQgRGVtb10NCiAg4oCiIFtGcmFtYS1DbGFuZyB2MC4w LjE2IGZvciBGcmFtYS1DIDI5LjAgQ29wcGVyXQ0KICDigKIgW0Vhc3kgRGVidWdnaW5nIGZvciBP Q2FtbCBXaXRoIExMREJdDQogIOKAoiBbR2V0dGluZyBTcGVjaWZpYzogQW5ub3VuY2luZyB0aGUg R29zcGVsIGFuZCBPcnRhYyBQcm9qZWN0c10NCiAg4oCiIFtVcGNvbWluZyBPQ2FtbCBFdmVudHMg KFNlcCAyMDI0IGFuZCBvbndhcmRzKV0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6 Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltPdXRyZWFjaHkgTWF5IDIwMjQgRGVtb10NCjxodHRwczov L3dhdGNoLm9jYW1sLm9yZy93L3BlVDNNZFdqUzFCWVlNYm93RUoxZ3Y+DQoNCltGcmFtYS1DbGFu ZyB2MC4wLjE2IGZvciBGcmFtYS1DIDI5LjAgQ29wcGVyXQ0KPGh0dHBzOi8vZnJhbWEtYy5jb20v aHRtbC9uZXdzLmh0bWwjMjAyNC0wOS0wNT4NCg0KW0Vhc3kgRGVidWdnaW5nIGZvciBPQ2FtbCBX aXRoIExMREJdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMDktMDUtZWFzeS1kZWJ1 Z2dpbmctZm9yLW9jYW1sLXdpdGgtbGxkYj4NCg0KW0dldHRpbmcgU3BlY2lmaWM6IEFubm91bmNp bmcgdGhlIEdvc3BlbCBhbmQgT3J0YWMgUHJvamVjdHNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9i bG9nLzIwMjQtMDktMDMtZ2V0dGluZy1zcGVjaWZpYy1hbm5vdW5jaW5nLXRoZS1nb3NwZWwtYW5k LW9ydGFjLXByb2plY3RzPg0KDQpbVXBjb21pbmcgT0NhbWwgRXZlbnRzIChTZXAgMjAyNCBhbmQg b253YXJkcyldDQo8aHR0cHM6Ly9vY2FtbC5vcmcvZXZlbnRzPg0KDQoNCk9sZCBDV04NCuKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNh biBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0 YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFy Y2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBi eSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0Fs YW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0 QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9z eW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 03 to 10, 2= 024.

    Oxidizing OCaml =E2=80=94 an update

    Diana Kalinichenko announced

    Hi everyone! Last year, we made a series of blogposts describing our plans = to introduce Rust-like type system features to OCaml (see here= ). Now, we are sharing updates on everything we've done since last year for= ICFP 2024. Please read our blogpost and check out our compiler extensions at our Git= Hub!

    Toy Autograd Engine in OCaml with Apple Accelerate Backend

    John Jewell announced

    I have been venturing to learn a new language and I landed on OCaml after h= earing a few interesting talks from Jane Street. I just made public a toy a= utograd engine in OCaml with an Apple Accelerate backend if anyone is inter= ested:=20

    https://github.com/jew= elltaylor/camlgrad

    I would really appreciate any feedback in terms of the OCaml code that I wr= ote so that I can improve. If anyone is willing to quickly take a look it w= ould mean a lot :slight_smile:

    New release of cppo, with multi-line macros and higher-order m= acros

    Fran=C3=A7ois Pottier announced

    It is my pleasure to announce a new release of cppo (v1.7.0) with two new f= eatures.

    • The new syntax #def ... #enddef allows a macro definition to= span several lines, without backslashes. This syntax allows macro definiti= ons to be nested.

      #def re=
      peat_until(action,condition)
        action;
        while not (condition) do
          action
        done
      #enddef
      
    • A parameterized macro can take a parameterized macro as a parameter: this i= s a higher-order macro.

      #define=
       TWICE(e)=
                (e + e)
      #define APPLY(F : [.], e) (let x=
       =3D (e) in F(x))
      let forty_two =3D
        APPLY(<=
      span style=3D"color: #242521; background-color: #fcf7ef;">TWICE,1+2+=
      3+4+5+6)
      

    For more details, please see the documen= tation.

    OCamlPro's contributions to the 2024 ICFP in Milan

    OCamlPro announced

    Today, a quick head's up about our contributions to this year's Internation= al Conference on Functional Programming which is unraveling right now in Milan!

    This year, our team presents two topics:

    • "Snapshottable Stores": A generic and efficient data s= tructure for the implementation of backtracking algorithms, used particularly in automatic theorem provers and type checkers. This implementation in OCaml will soon be available on opam.
    • A presentation on opam, detailing the contents of the = latest major release 2.2, which was released in July, as well as how the op= am team operates.

    Be sure to checkout the event, there are plenty of great pres= entations and video replays!

    Until next time, which will be sooner than later with another one of our Fla= mbda2 Snippets,

    Kind regards, The OCamlPro Team

    Flambda2 Ep. 3: Speculative Inlining, by OCamlPro

    OCamlPro announced

    As promised in our previous post about OCamlPro's = contributions to this year's International Conference of Functional Program= ming, we back again with a new entry in our Flambda2 Snippet blog se= ries!

    F= lambda2 Ep. 3: Speculative Inlining covers inlining in general as well = as how our compiler handles it. We go in detail about how Speculative= Inlining allows more significant optimisations to take place.=20

    This blog entry is key for a smooth read of our next article which will cov= er Upwards and Downwards Traversals in Flambda2.

    Happy to say that it's already quite far down the release pipeline!

    Frustrating Interactions with the OCaml Ecosystem while develo= ping a Synthesizer Library

    Steve Sherratt announced

    https://www.gridbugs.or= g/frustrating-interactions-with-the-ocaml-ecosystem-while-developing-a-synt= hesizer-library/

    Last year I made a synthesizer library in OCaml and had some struggles usin= g Dune and Opam, and also ran into several issues with libraries. I wrote a= blog post about all the problems I encountered.

    Cmdlang - Yet Another CLI Library (well, not really)

    Mathieu Barbin announced

    I hope you had a nice summer! Mine took an unexpected turn when, roughly at= the same time, I wrote my first cmdliner subcommand and heard= about climate for the first time. My experience with OCaml CL= I so far had been centered around core.command.

    When I read climate's terminology section and how it defines Terms, Arguments, and Parameters, someth= ing clicked. Seeing how climate's API managed to make position= al and named arguments fit so nicely together, I thought: "Wow, for the fir= st time, it seems I'll be able to write a CLI spec on a whiteboard without = referring to some code I never seem to get right (I am looking at you, core.command's anonymous arguments)."

    I got quite excited and thought: "Can I switch to climate toda= y?" But reality checked: it's not on opam yet, still under construction, I'= m not sure what the community will do, etc.

    Implementing my own engine for an API resembling climate felt = like a wasted effort, knowing about the work happening in climate. Still, having a 'a Param.t, 'a Arg.t, and 'a Command.t type that I would get to know and love felt too goo= d to pass up.

    I stared at the climate types for a while, and filled with hap= py thoughts about a bright CLI future, it occurred to me: can I use an API = like climate but compile it down to existing libraries such as= cmdliner or core.command? (and climate too!). I wrote down the following types:

    Climate

    'a Param.t     -> 'a Climate.Arg_parser.=
    conv
    'a Ast.Arg.t   -> 'a Climate.Arg_parser.t
    'a Command.t   -> 'a Climate.Command.t
    

    Cmdliner

    'a Param.t     -> 'a Cmdliner.Arg.conv
    'a Arg.t       -> 'a Cmdliner.Term.t
    'a Command.t   -> 'a Cmdliner.Cmd.t
    

    core.command

    'a Param.t     -> 'a core.Command.Arg_type.t
    'a Arg.t       -> 'a core.Command.Param.t
    unit Command.t -> core.Command.t
    

    … which I interpreted as stating the following theorem:

    There exists an abstraction to encode OCaml CLIs that lives in the intersec= tion of what's expressible in other well established libraries.

    "One EDSL to command them all," so to speak. I couldn't resist the temptati= on to build actual terms for these types. That gave birth to cmdlang.

    As a test, I switched one of my projects to cmdlang, with cmdliner as a backend. I liked the changes I made in the process. The 1-line bin/main.ml is now the only place that specifies which backend I want to use; the re= st of the code is programmed solely against the cmdlang API. T= his means I'll be able to easily experiment with compiling down to cl= imate in the future.

    I am not against the multiplicity of solutions in general, but I tend to fe= el uneasy when incompatible libraries emerge, partitioning the ecosystem. A= s a community, we know too many examples of this. In this instance, I want = to call the core.command vs cmdliner situation a = … cli-vage.

    I don't see my work on cmdlang as competing with these other l= ibraries. Quite the contrary, it makes it easier for me to experiment with = them without much changes while exploring the subject of CLI in general. Al= so, as a library author, if you wish to expose CLI helpers to your users, a= library like cmdlang will give you a pleasant way to do so, a= s you can express your helpers with it, knowing your users will have the ch= oice to translate them to the backend of their choice.

    Before writing this post, I had a very pleasant chat with @gridbugs. I want= to make it clear that I do not think cmdlang is competing wit= h climate either. I think climate is a very promi= sing library and I believe it will, in due time, deliver auto-completion to= many - this has been a highly anticipated feature within the community. I = wish to dedicate the initial work that I did on cmdlang to @gr= idbugs due to the impactful influence climate had on my work, and how it he= lped me improve my general understanding of declarative CLI libraries.

    These are very early days for cmdlang. There are still areas I= am fuzzy on, and I haven't really validated the whole design yet. I have p= ut some thoughts in this Future Plans page. One thing that I did not = initially include there would be to explore the feasibility of writing a mi= ni-compiler for cmdlang targeting stdlib.arg as a= runner. I am not sure how much you'd end up restricting cmdlang for this to work. I thought that'd be a fun project to tackle at a futur= e point, as it would make a nice addition to the overall architecture of th= e project.

    I'd welcome your input to help me shape the future of cmdlang = if you have an interest in this project.

    Thanks for reading!

    zarr v0.1.0

    zoj613 announced

    Hi everyone, I'd like to announce the first release of zarr, a= n Ocaml implementation of the Zarr version 3 storage format specification for chunked & compressed multi-dimensional arrays, designed for use i= n parallel computing.

    3D"terminology-hierarchy.excalidraw.png"

    why?

    The project was mainly inspired by the lack of functional programming langu= age implementations of this specification as shown in this implementations table. Since I have been = learning OCaml these past few months I figured I'd take on the challenge of= producing the first functional programming implementation of Zarr, and it = was a great learning experience!

    Features

    • Supports creating n-dimensional Zarr arrays and chunking them along any= dimension.
    • Compress array chunks using a variety of supported compression codecs.<= /li>
    • Supports indexing operations to read/write views of a Zarr array.
    • Supports storing arrays in-memory or the local filesystem. It is also extensible, allowing users to easily create and use their own custom storag= e backends. See the example implementing a Zip file store fo= r more details.
    • Supports both synchronous and concurrent I/O via Lwt and <= code>Eio.
    • Leverages the strong type system of Ocaml to create a type-safe API; ma= king it impossible to create, read or write malformed arrays.
    • Supports organizing arrays into hierarchies using Groups.

    Example

    Below is a demo of the library's API for creating, reading and writing to a= Zarr hierarchy.

    open Zarr
    open Zarr.Metadata
    open Zarr.Node
    open Zarr.Codecs
    open Zarr.Indexing
    open Zarr_sync.Storage
    (* opens infix operators >>=3D =
    and >>| for monadic bind & map *)
    open FilesytemStore.Deferred.Infix
    
    let store =3D Files=
    ystemStore.create "testdata.zarr" in
    let group_node =3D =
    GroupNode.of_path "/some/group" in
    FilesystemStore.create_group store g=
    roup_node;
    let array_node =3D =
    ArrayNode.(group_node / "name");;
    (* creates an array with char data ty=
    pe and fill value '?' *)
    FilesystemStore.create_array
      ~codecs:[`Transpose [|2; 0; 1|]; `Bytes BE; `Gzip L2]
      ~shape:[|100; 100; 50|]
      ~chunks:[|10; 15; 20|]
      Ndarray.Char=20
      '?'
      array_node
      store;
    let slice =3D [|R [|0; 20|]; I 10; R [||]|] in
    let x =3D Filesyste=
    mStore.read_array store array_node slice Ndarray.Char in
    (* Do some computation on the array s=
    lice *)
    let x' =3D Zarr.Nda=
    rray.map (fun _ -> Random.int 256 |> =
    Char.chr) x in
    FilesystemStore.write_array store ar=
    ray_node slice x';
    let y =3D Filesyste=
    mStore.read_array store array_node slice Ndarray.Char in
    assert (Ndarray.equal x' y);
    

    Installation

    The library comes in several flavors depending on the synchronous / asynchr= onous backend of choice. To install the synchronous API, use

    $ opam install zarr-sync
    

    To install zarr with an asynchronous API powered by Lwt or Eio, use

    $ opam install zarr-lwt
    $ opam install zarr-eio
    

    The documentation can be found here and the source code there

    I'm happy to answer any questions regarding the library and more than welco= me suggestions for improvements (especially performance!), issue reports as= well as PR's.

    Brr 0.0.7

    Daniel B=C3=BCnzli announced

    There'a new release of Brr, an ISC licenced toolkit for programming browsers with the js_of_oc= aml compiler.

    This release has some changes to support work being done for wasm_of_= ocaml; thanks to @vouillon for his patches. There are also other sma= ll fixes and additions, consult the release notes for the details and thanks to all the contribut= ors.

    A big thanks to my donator= s for supporting my work. I welcome the (not so[^1]) new donator Tarides.

    Home page, Docs and manuals or odig doc= brr

    Install: opam install brr (PR)

    Best,

    Daniel

    [^1]: Tarides has been generously donating for my work from the onse= t but used to do it via the Mirage organisation.

    Ocsigen Server 6.0.0

    Vincent Balat announced

    We're delighted to announce a major new version of Ocsigen Server! This ver= sion 6.0.0 focuses on the use of Ocsigen Server as a library, without any c= onfiguration file, which is now much easier and brings the exact same featu= res as the executable.

    Example of use:

    To add a Web server to your OCaml program, serving static files from direct= ory `static`:

    let _ =3D Ocsigen_server.start=20
              [ Ocsigen_server.host [Staticmod.run ~dir:"static" ()]]
    

    Install:

    opam install ocsigenserver
    

    Example of Dune file for this program:

    (executable
     (public_name myproject)
     (name main)
     (libraries
      main
      ocsigenserver
      ocsigenserver.ext.staticmod))
    

    Compile with:

    dune build
    

    Ocsigen Server can of course still be used as an executable taking its conf= iguration from a file. This allows for non OCaml developers to use it and m= ake their own configurations. It also makes it possible to distribute a bin= ary version of your Web applications.

    Ocsigen Server is build in modular and extensible way. The default opam pac= kages comes with several extensions. In the example above, we are using Sta= ticmod for serving static files. Other extensions makes it possible for exa= mple to configure redirections, to control the access to some sub-directory= , to use a reverse proxy, to rewrite the request, compress the output etc.

    The programming interface follows exactly the structure of the configuratio= n file: instructions are tried in order until one generates a result, then = some other instructions can be used to change the result (like compressing = it or adding some headers).

    Here is a more complex example of configuration:

    let _ =3D
      Ocsigen_server.start
        ~ports:[`All, 8080]
        ~command_pipe:"local/var/run/mysite-cmd"
        ~logdir:"local/var/log/mysite"
        ~datadir:"local/var/data/mysite"
        ~default_charset:(Some "utf-8")
        [ Ocsigen_server.host
            ~regexp:"mydomain.com"
            [ Ocsigen_server.site ["subsite"]
                [ Accesscontrol.(
                    if_
                      (and_
                         [ ip "122.122.122.122"=
    
                         ; header ~name:=
    "user-agent" ~regexp:".*FooBar.*"
                         ; method_ `POST ])
                      [forbidden] [])
                ; Authbasic.run ~realm:"myre=
    alm"
                    ~auth:(fun _u p -> Lwt.return (p =3D "toto"))
                    ()
                ; Staticmod.run ~dir:"local/=
    var/www/otherdir" () ]
            ; Ocsigen_server.site ["othersubsite"]
                [ Revproxy.run
                    ~redirection:
                      (Revproxy.create_r=
    edirection ~full_url:false ~regexp:"(.*)"
                         ~keephost:true "htt=
    p://localhost:8888/\\1")
                    () ]
            ; Redirectmod.run
                ~redirection:
                  (Redirectmod.create_re=
    direction ~full_url:false ~regexp=
    :"old(.*)"
                     "new\\1")
                ()
            ; Staticmod.run ~dir:"local/var=
    /www/staticdir" ()
            ; Cors.run ~max_age:86400 ~crede=
    ntials:true ~methods:[`POST; `GET; `HEAD]
                ~exposed_headers:
                  [ "x-eliom-application"
                  ; "x-eliom-location"
                  ; "x-eliom-set-process-cookie=
    s"
                  ; "x-eliom-set-cookie-substit=
    utes" ]
                ()
            ; Deflatemod.run
                ~mode:
                  (`=
    Only
                    [ =
    Some "text", Some "html")
                    ; =
    Some "text", Some "javascript")
                    ; =
    Some "text", Some "css")
                    ; =
    Some "application", Some "javascript")
                    ; =
    Some "application", Some "x-javascript")
                    ; =
    Some "application", Some "xhtml+xml")
                    ; =
    Some "image", Some "svg+xml")
                    ; =
    Some "application", Some "x-eliom") ])
                () ] ]
    

    In this example, the server defines one virtual host for domain mydom= ain.com. It will first check whether it is a request for directory <= code>subsite/, and if yes, will reject the request with 403 Forbidde= n if it is a POST request coming from user-agent FooBar at IP = 122.122.122.122. If not, it will ask for a password before serving files fr= om directory local/var/www/otherdir. Then we define another subsite othersubsite for which the requ= ests will be transfered to another Web server running locally on port 8888,= then rewrite the answer location header accordingly. Then, if the page is still not generated, the server will send a redirectio= n if URLs starts with "old". Otherwise, it will try to serve files from directory local/var/www/st= aticdir. If the page has still not been found, a 404 Not found will be = sent, otherwise, some CORS headers will be added, and the result will be co= mpressed before being sent.

    Compile this example with the following dune file:

    (executable
     (public_name myserver)
     (name main)
     (libraries
      ocsigenserver
      ocsigenserver.ext.staticmod
      ocsigenserver.ext.authbasic
      ocsigenserver.ext.extendconfiguration
      ocsigenserver.ext.outputfilter
      ocsigenserver.ext.cors
      ocsigenserver.ext.accesscontrol
      ocsigenserver.ext.deflatemod
      ocsigenserver.ext.redirectmod
      ocsigenserver.ext.revproxy
     ))
    

    Eliom and Ocsigen Start have also been updated for being used without confi= guration file and will be released very soon.

    dream-html and pure-html

    Yawar Amin announced

    [ANN] dream-html & pure-html 3.6.1, 3.6.2

    A double announcement:

    3.6.1: when in XML rendering mode, correctly render empty-value attributes = as having an empty string value. Thanks to @jonsterling !

    3.6.2: automatically switch to XML rendering mode when rendering SVG and Ma= thML tags inside HTML rendering mode.

    Advanced Code Navigation coming to OCaml-LSP

    PizieDust announced

    Jump to Target

    Currently, the standard LSP protocol only allows for generalized code navig= ation (`goto definition`, `goto declaration`, `goto implementation`, `goto = type-definition`), which is not very useful when it comes to precise moveme= nts.

    Coming to OCaml-lsp soon will be the ability to jump from one point in your= code to another based on Merlin's Ju= mp command.

    Implementing this functionality took a bit of thinking as we wanted a solut= ion that works for all supported editors (Vscode, Emacs and Vim) without an= y additional specific client implementations. We used a combination of call actions plus the LSP showDocumentRequest to = move the cursor to the interesting position.

    The call actions display are contextual and will display only if it's relev= ant to the code under the cursor.

    Here is a demo in VSCode.

    3D"618bfd77db1=

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=NbwNiETw; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=2HzAA+q5; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id C02D2B80123 for ; Tue, 17 Sep 2024 15:02:54 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Hxt8qbH3KPldc50sZXyYq2DLgbvQTCfGw0Mi2D+pvIE=; b=NbwNiETwfrmznERG8GZT0rJXsuGRwF1GzvmnIfkQGYcWrpRgVqzvGSlV 7l4zOIjD/O1V3Gb6Sjc+Ztm9h9oTLo+H3T+TR9hJaC3DaELq098k6nsyZ GfhVNgBfvkUoeV4mW1IHbWGNU+DqmCexRKDzwkPDzlo5cDjOO31ASNAkH 8=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,235,1719871200"; d="scan'208,217";a="183624455" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Sep 2024 16:02:53 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 674A9E0D1F; Tue, 17 Sep 2024 16:02:53 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 846E3E0131 for ; Tue, 17 Sep 2024 16:02:50 +0200 (CEST) IronPort-SDR: 66e98c08_O4KmTKZIFpZWbda0XP+ULeBmcQa/+0HmeuHAPxn+a1O6Ys7 dG0JF1T6sYznLxTizDJYcLAdWzVJAs2psaLdSRA== X-IPAS-Result: =?us-ascii?q?A0EeDgCMi+lmmCIeaIFagliBQVIxGQFdBlozBwhIA4RTg?= =?us-ascii?q?0+FNIhrgRaBK5oAgVaBQBYjFAEDAQ0uAQ4EAQIEAQEDAQIBggyCLkYCiX0CH?= =?us-ascii?q?wYBBDAJDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQIQAQEBAQEBA?= =?us-ascii?q?QE3BUmFdQ2CRhkUASNxXgMEAwYGAQEBAQEBAQEBJwEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECCAQBDBcfHAEjHAkKEwEBM?= =?us-ascii?q?QcYIwMQBAEGAwIRATUDFAESGoJYDwGCZAMEAQwGkmuaaxo3eoEygQGCDAEBB?= =?us-ascii?q?oEIPgMLAgIDDy4B2gWBGUoJgUiIMRoBKkhqAoRDhDonD4FVRIEVgihKB2+CP?= =?us-ascii?q?xcLAQEBARhCYgEBETwJGIMNgmmDMYJvVYMYP4ESOi9sgQlSgnEPgSmBF2Z+V?= =?us-ascii?q?w+CBFQCDIMCfCWBIxCGMF+BF4Qbi26BRyIDJjMhEwFVExcLCQVkhguCSoMmg?= =?us-ascii?q?hSEFoUlgWcJYIdngW+BPoFZR4JySoVTgQaCUWtOOQINAjeCKSVuglqDeWEdQ?= =?us-ascii?q?AMLbT01FBurOgQNJwGBXAFHgXMOCxQfATEbFQIhCgEHFA4BAQQeNjgLAgIVM?= =?us-ascii?q?AQEARAIJwYQAgQWF5JPEQIRBCUHnTyTbW00B4QagV0GDIkCgSSVc4QFgVaLK?= =?us-ascii?q?4Z+kkEimFMigjSCdIQsgSUJgW0eTIhvjF8hhTOBZzpJYgEdDAczGjBDDQaCI?= =?us-ascii?q?AEzCQk9HA+IIYlSKIE+gSaBdTu/ckE1AgEBDikCBwEKAQEDCYVFHQEBhUYCJ?= =?us-ascii?q?gQIgUsBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 9VsD7UD6Jy5FX1s IronPort-HdrOrdr: A9a23:kXvYsaozWr1N4cYpxuJ2E6IaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: =?us-ascii?q?9a23=3ACPF3mWqHexTuv0A8xahBT8rmUeUmMU/FlCbaGFO?= =?us-ascii?q?1FWZyEZuQW3HK8qwxxg=3D=3D?= X-Talos-MUID: 9a23:2zuOZwraYCM7BmVqst8ezzU7BfhS5Yr2Mmwqvr4A4PiVay8pFB7I2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.10,235,1719871200"; d="scan'208,217";a="96606908" X-MGA-submission: =?us-ascii?q?MDFv4rmZOOz2Eu7wMLZbG4H4p7Vx04Ibv4DkOb?= =?us-ascii?q?apVI6w2l0DF4CW5PRbZMcU6TqAnr6jGTF4lWAQmONCLeWkMiNPpde2Xp?= =?us-ascii?q?KUfho/Eu6c+hqS0O7NKkytQ/bKJjhXX/7QYNtyp8CGopf802qh8Q4uWo?= =?us-ascii?q?iByIIlDkGekb0JvxtqzFPYTQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Sep 2024 16:02:48 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 30D50564A7A; Tue, 17 Sep 2024 16:02:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1726581767; bh=FeGAVae8tiMfwJ6qPW6eUYSKLFlGFM15TC2qG2vAuHQ=; h=From:To:Subject:Date:Message-ID; b=2HzAA+q5YH9wR9TnZxap1aCk0FX0Wt3ItHf0nVJMcB2IIrCZTb9wWQw83B8vyU0vU 2Od6jBUVtgSZ0m6Iz+YAvmqc/BQ+kIGTEdz1wVCOWHwb/29UEnSOqWCuxhd3sOvPBy /g/zXKx2ff3aOD1o9PcJvvm7GdCIyR4Yxvdyx3vg= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Sep 2024 16:02:45 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 17 16:02:47 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.476866, queueID=67F9B564A7B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19179 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 10 to 17, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Ptime 1.2.0 =E2=80=93 Mtime 2.1.0 =E2=80=93 Qrc 0.2.0 Unicode 16.0.0 update for Uucd, Uucp, Uunf and Uuseg Outreachy Demo Presentation Live Stream to follow OCaml Workshop, ML Workshop, and other talks at ICFP DkML 2.1.2 and opam 2.2.0 store v0.1.0 Tsdl 1.1.0 OCaml-css 0.2.0 OCaml-stk 0.2.0 and Chamo 4.1.0 DkCoder 2.1.3 Other OCaml News Old CWN Ptime 1.2.0 =E2=80=93 Mtime 2.1.0 =E2=80=93 Qrc 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There are new releases of these packages: =E2=80=A2 [Ptime] POSIX time for OCaml, [release notes], [docs] =E2=80=A2 [Mtime] Monotonic time for OCaml, [release notes], [docs] =E2=80=A2 [Qrc] QR code encoder for OCaml, [release notes], [docs] See the individual release notes for details about the changes. The library structure of Ptime and Mtime was changed to align it on the mythical library convention and make it for less surprising names (it used to make sense, it no longer does): =E2=80=A2 The `{M,P}time_clock' modules are now in the `{p,m}time.clock' libraries as they should be. These libraries were also made to [export] the base `{p,m}time' library so that you can trim you `requires' when you use the clocks. =E2=80=A2 The libraries `{p,m}time.clock.os' are deprecated. They now sim= ply export `{p,m}time.clock' and warn on usage. Best and a big thanks to my [donors] [Ptime] [release notes] [docs] [Mtime] [release notes] [docs] [Qrc] [release notes] [docs] [export] [donors] Unicode 16.0.0 update for Uucd, Uucp, Uunf and Uuseg =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Unicode 16.0.0 was released on September 10th. It adds 5185 new characters for a total of 154'998 characters. If you are into retrocomputing or terminal graphics this may be your ultimate chance to find an odd character to make an effect among the 686 new [symbols for legacy computing] that are added =E2=80=93 I'm heari= ng this may me be the last batch, the resource is finite! See the [announcement page] for links to all the other equally interesting additions. If you are obsessed about deep linking into standard definitions, note that the normative core specification becomes a proper [HTML document]; rather than a bunch of PDF files or that 1400 pages hard-copy I once purchased for 5.0.0 circa 2007 :=E2=80=93). The neat res= ult is that we can now precisely hyperlink to the [normative definition] of an OCaml [`Uchar.t'] value. Accordingly these libraries had to be updated (aggregated, boring, release notes [here]) =E2=80=A2 [Uucd] 16.0.0 Unicode character database decoder for OCaml, [do= cs] =E2=80=A2 [Uucp] 16.0.0 Unicode character properties for OCaml, [docs] =E2=80=A2 [Uunf] 16.0.0 Unicode text normalization for OCaml, [docs] =E2=80=A2 [Uuseg] 16.0.0 Unicode text segmentation for OCaml, [docs] Both `Uucd' and `Uucp' are incompatible releases sinces new block and script enumerants were added. Other than that the minimal Unicode introduction and Unicode OCaml tips is still [here] and remember that despite the uninformed myths OCaml :heart: Unicode. A big thanks for funding from the [OCaml Software Foundation] and from my faithful [donors]. [symbols for legacy computing] [announcement page] [HTML document] [normative definition] [`Uchar.t'] [here] [Uucd] [docs] [Uucp] [docs] [Uunf] [docs] [Uuseg] [docs] [here] [OCaml Software Foundation] [donors] Outreachy Demo Presentation =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The demo presentation video is now online: =E2=80=93 thank you to everyone who joined and particularly the mentors, co-mentors and interns! A big thank you also to [Tarides] and [Jane Street] for providing resources and funding to make this round possible. A reminder that _today_ is the last day to sign up to the next round =E2=80=93 [Outreachy December 2024 Round]! [Tarides] [Jane Street] [Outreachy December 2024 Round] Live Stream to follow OCaml Workshop, ML Workshop, and other talks at ICFP =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 FYI: For people like me who were on vacation or otherwise unavailable, the several hour Live Stream is still available. The intro to the workshop and the first OCaml talk start at . DkML 2.1.2 and opam 2.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 DkML 2.1.3 was released. The major changes are: =E2=80=A2 Upgraded from opam 2.2.0 to opam 2.2.1. =E2=80=A2 The ocaml/opam-repository tag was advanced to Sep 10, 2024. =E2=80=A2 bugfix: `dk Ml.Switch init' was broken on Linux and macOS. DkML 2.1.2 had incorrectly pinned the `dkml-host-abi' and `dkml-target-abi' of the master DkML build machine. =E2=80=A2 Allow prereleases of Visual Studio; requested at . Upgrading is: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 winget remove dkml # Ignore "exit code: 4294967295" =E2=94=82 winget install dkml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The full release notes are at . store v0.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Basile Cl=C3=A9ment announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I would like to announce the first release of `store' ([docs]), a library providing a snapshottable bag of mutable references, an efficient data-structure for back-tracking workloads. To install it, type `opam update && opam install store'. Store provides a simple API for capturing and restoring state as well as easy-to-use high-level wrappers to automatically rollback changes on failure (`tentatively') or unconditionally (`temporarily'). It boasts almost-zero overhead when back-tracking is not used and best-in-class performance for back-tracking use cases. The design and implementation of Store is described in the paper [Snapshottable stores], which was given a Distinguished Paper award at this year's ICFP in Milan. As recognized by this award, the paper is well-written and easy to understand; please give it a read if you are interested in either back-tracking workloads or subtle data structure invariants! I also want to give a shout-out to Fran=C3=A7ois Pottier's Monolith, which proved invaluable during the development of Store to find and diagnose subtle bugs. Store was developed through collaboration between myself (Basile Cl=C3=A9ment) at OCamlPro and Gabriel Scherer at Inria, and the persistent interface was formally verified by Cl=C3=A9ment Allain and Alexandre Moine at Inria. [docs] [Snapshottable stores] Tsdl 1.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There's a new release of [Tsdl], thin bindings to the C [SDL library]. See the [release notes] for details. =E2=80=A2 Docs: [online] or `odig doc tsdl' =E2=80=A2 Install: `opam install tsdl' Daniel A big thanks to my [donors]. [Tsdl] [SDL library] [release notes] [online] [donors] OCaml-css 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Zoggy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [OCaml-css] 0.2.0 is released and already available in opam (package `css'). OCaml-css is a library to parse and print CSS. ([docs]) Main changes are the introduction of property spaces and partial handling of nested rules. Properties are now defined in [spaces]. A [Css] space is predefined, with some CSS properties, but you can define a new space with specific properties to use the CSS syntax for these properties in your application. (this is what is done in the to be not yet released 0.2.0 version of [stk]). Nested style rules are now parsed and can be [expanded]. Nested @-rules are not handled yet. [OCaml-css] [docs] [spaces] [Css] [stk] [expanded] OCaml-stk 0.2.0 and Chamo 4.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Zoggy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Stk =E2=95=8C=E2=95=8C=E2=95=8C A new release of [OCaml-stk], 0.2.0, is now available in opam (package `stk'). OCaml-stk is a Graphical User Interface library based on on [libSDL 2], through the [Tsdl] bindings. As the library is under heavy development, this release includes [many changes]: new widgets, better memory management, css-like theming, =E2=80= =A6 By cloning [the repository] and running `make', you can then run `./_build/default/examples/examples.exe'. This example application contains demonstrations of each widget with the corresponding code in the same window. [OCaml-stk] [libSDL 2] [Tsdl] [many changes] [the repository] Chamo =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A new release of [Chamo], 4.1.0, is also available in opam (package `chamo'). Chamo is a source code editor, even if it can be used to edit any text file. It is based on OCaml-stk. This release contains small bug fixes and follows changes in OCaml-stk. [Chamo] DkCoder 2.1.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am happy to announce another release of DkCoder - a no-install OCaml-based scripting framework. Major changes: =E2=80=A2 Split out the Java-like packaging and security tools into the MlFront project: . =E2=80=A2 The DkCoder and MlFront version numbers are now in sync with Dk= ML version numbers. However, DkCoder is **still alpha** and there is at least one breaking change coming. =E2=80=A2 Several third-party "Us" scripts are embedded and supported. (T= hey are listed at bottom of this post). Docs: The main doc page is . But I don't yet have good reference docs. The samples below have been updated and are good ways to see what DkCoder can do (use the `V2_1' branches): =E2=80=A2 =E2=80=A2 =E2=80=A2 There are many bug fixes and new features. The full list is at [https://github.com/diskuv/dkcoder/blob/1.0/CHANGES.md#2132] - all the sections from `0.4.0.1' to `2.1.3.2' (inclusive) are new. [https://github.com/diskuv/dkcoder/blob/1.0/CHANGES.md#2132] New "Us" scripts =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C /These scripts can be run inside any of the sample projects above, or used as ordinary modules in your own DkCoder project source code. Some scripts, but not all, have a `--help' option./ =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ./dk DkFs_C99.Dir - Directory manipulation operations. =E2=94=82 ./dk DkFs_C99.File - (no help) File manipulation operations. =E2=94=82 ./dk DkFs_C99.Path - Path manipulation operations. =E2=94=82 ./dk DkNet_Std.Browser - Browser operations. =E2=94=82 ./dk DkNet_Std.Http - Download content. =E2=94=82 ./dk DkDev_Std.Legal.Record - Asks for and records your accepta= nce of legal terms and agreements. =E2=94=82 ./dk DkDev_Std.Exec - Execute a command in the DkCoder 2.1 runt= ime environment. =E2=94=82 ./dk DkDev_Std.Export - Create an `exports` field inside dkproj= ect.jsonc summarizing all the You libraries. =E2=94=82 ./dk DkDev_Std.Jsontree - (no help) For in-place edits of JSON = files. =E2=94=82 ./dk DkStdRestApis_Gen.* - (no help) (unstable, not ready). Ope= nAPI 3 service and client generator. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events (Sep 15, 2024 and onwards)] =E2=80=A2 [Feature Parity Series: Compaction is Back!] [the ocaml.org blog] [Upcoming OCaml Events (Sep 15, 2024 and onwards)] [Feature Parity Series: Compaction is Back!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 10 to 17, 2= 024.

    Ptime 1.2.0 =E2=80=93 Mtime 2.1.0 =E2=80=93 Qrc 0.2.0

    Daniel B=C3=BCnzli announced

    There are new releases of these packages:

    See the individual release notes for details about the changes.

    The library structure of Ptime and Mtime was changed to align it on the myt= hical library convention and make it for less surprising names (it used to = make sense, it no longer does):

    • The {M,P}time_clock modules are now in the {p,m}time= .clock libraries as they should be. These libraries were also made t= o export the base {p,m}time library so tha= t you can trim you requires when you use the clocks.
    • The libraries {p,m}time.clock.os are deprecated. They now = simply export {p,m}time.clock and warn on usage.

    Best and a big thanks to my donors

    Unicode 16.0.0 update for Uucd, Uucp, Uunf and Uuseg

    Daniel B=C3=BCnzli announced

    Unicode 16.0.0 was released on September 10th. It adds 5185 new characters = for a total of 154'998 characters.

    If you are into retrocomputing or terminal graphics this may be your ultima= te chance to find an odd character to make an effect among the 686 new symb= ols for legacy computing that are added =E2=80=93 I'm hearing this may = me be the last batch, the resource is finite! See the annou= ncement page for links to all the other equally interesting additions.

    If you are obsessed about deep linking into standard definitions, note that= the normative core specification becomes a proper HTML document; rather tha= n a bunch of PDF files or that 1400 pages hard-copy I once purchased for 5.= 0.0 circa 2007 :=E2=80=93). The neat result is that we can now precisely hy= perlink to the normative definition of an OCaml Uchar.t= value.

    Accordingly these libraries had to be updated (aggregated, boring, release = notes here<= /a>)

    • Uucd 16.0.0 Unicode c= haracter database decoder for OCaml, docs
    • Uucp 16.0.0 Unicode c= haracter properties for OCaml, docs
    • Uunf 16.0.0 Unicode t= ext normalization for OCaml, docs
    • Uuseg 16.0.0 Unicode= text segmentation for OCaml, docs

    Both Uucd and Uucp are incompatible releases sinc= es new block and script enumerants were added.

    Other than that the minimal Unicode introduction and Unicode OCaml tips is = still here<= /a> and remember that despite the uninformed myths OCaml :heart: Unicode.

    A big thanks for funding from the OCaml So= ftware Foundation and from my faithful donors.

    Outreachy Demo Presentation

    Patrick Ferris announced

    The demo presentation video is now online: https://watch.ocaml.org/w/peT3MdWjS1BYYMbowEJ1= gv – thank you to everyone who joined and particularly the mento= rs, co-mentors and interns!

    A big thank you also to Tarides and Jane Street for providing resources= and funding to make this round possible. A reminder that today is the last day to sign up to the next round –= Outreachy December 2024 Round!

    Live Stream to follow OCaml Workshop, ML Workshop, and other t= alks at ICFP

    jbeckford announced

    FYI: For people like me who were on vacation or otherwise unavailable, the = several hour Live Stream is still available.

    The intro to the workshop and the first OCaml talk start at https://www.youtube.com/liv= e/OuQqblCxJ2Y?t=3D2254s.

    DkML 2.1.2 and opam 2.2.0

    jbeckford announced

    DkML 2.1.3 was released. The major changes are:

    Upgrading is:

    winget remove dkml # Ignore "exit code: 4294967295"
    winget install dkml
    

    The full release notes are at https://gitlab.com/dkml/distributions/dkml/-/rel= eases/2.1.3.

    store v0.1.0

    Basile Cl=C3=A9ment announced

    I would like to announce the first release of store (docs), a lib= rary providing a snapshottable bag of mutable references, an efficient data= -structure for back-tracking workloads.

    To install it, type opam update && opam install store.

    Store provides a simple API for capturing and restoring state as well as ea= sy-to-use high-level wrappers to automatically rollback changes on failure = (tentatively) or unconditionally (temporarily). I= t boasts almost-zero overhead when back-tracking is not used and best-in-cl= ass performance for back-tracking use cases.

    The design and implementation of Store is described in the paper Snapshottable stores, which was given= a Distinguished Paper award at this year's ICFP in Milan. As recognized by= this award, the paper is well-written and easy to understand; please give = it a read if you are interested in either back-tracking workloads or subtle= data structure invariants!

    I also want to give a shout-out to Fran=C3=A7ois Pottier's Monolith, which = proved invaluable during the development of Store to find and diagnose subt= le bugs.

    Store was developed through collaboration between myself (Basile Cl=C3=A9me= nt) at OCamlPro and Gabriel Scherer at Inria, and the persistent interface = was formally verified by Cl=C3=A9ment Allain and Alexandre Moine at Inria.

    Tsdl 1.1.0

    Daniel B=C3=BCnzli announced

    There's a new release of Tsd= l, thin bindings to the C SDL libra= ry. See the release notes for details.

    • Docs: online or= odig doc tsdl
    • Install: opam install tsdl

    Daniel

    A big thanks to my donors<= /a>.

    OCaml-css 0.2.0

    Zoggy announced

    OCaml-css 0.2.0 is releas= ed and already available in opam (package css).=20

    OCaml-css is a library to parse and print CSS. (docs)

    Main changes are the introduction of property spaces and partial handling o= f nested rules.

    Properties are now defined in spaces. A Css space is predefined, with some CSS properties, but you can define a new s= pace with specific properties to use the CSS syntax for these properties in= your application. (this is what is done in the to be not yet released 0.2.= 0 version of stk).

    Nested style rules are now parsed and can be expanded. = Nested @-rules are not handled yet.

    OCaml-stk 0.2.0 and Chamo 4.1.0

    Zoggy announced

    Chamo

    A new release of Chamo, 4.1.0= , is also available in opam (package chamo).

    Chamo is a source code editor, even if it can be used to edit any text file= . It is based on OCaml-stk. This release contains small bug fixes and follo= ws changes in OCaml-stk.

    DkCoder 2.1.3

    jbeckford announced

    I am happy to announce another release of DkCoder - a no-install OCaml-bas= ed scripting framework.

    Major changes:

    • Split out the Java-like packaging and security tools into the MlFront p= roject: https://discuss.ocaml.org/t/ann-mlfront-a-java-= like-package-system-for-ocaml/15072.
    • The DkCoder and MlFront version numbers are now in sync with DkML versi= on numbers. However, DkCoder is still alpha and there is at l= east one breaking change coming.
    • Several third-party "Us" scripts are embedded and supported. (They are = listed at bottom of this post).

    Docs: The main doc page is https://diskuv.com/dksdk/coder/2024-intro-scripting/. = But I don't yet have good reference docs. The samples below have been updat= ed and are good ways to see what DkCoder can do (use the V2_1 = branches):

    There are many bug fixes and new features. The full list is at https://github.c= om/diskuv/dkcoder/blob/1.0/CHANGES.md#2132 - all the sections from 0.4.0.1 to 2.1.3.2 (inclusive) are new.

    New "Us" scripts

    These scripts can be run inside any of the sample projects above, or use= d as ordinary modules in your own DkCoder project source code. Some scripts= , but not all, have a --help option.

    ./dk DkFs_C99.Dir - Directory manipulation operations.
    ./dk DkFs_C99.File - (no help) File manipulation operations.
    ./dk DkFs_C99.Path - Path manipulation operations.
    ./dk DkNet_Std.Browser - Browser operations.
    ./dk DkNet_Std.Http - Download content.
    ./dk DkDev_Std.Legal.Record - Asks for and records your acceptance of legal=
     terms and agreements.
    ./dk DkDev_Std.Exec - Execute a command in the DkCoder 2.1 runtime environm=
    ent.
    ./dk DkDev_Std.Export - Create an `exports` field inside dkproject.jsonc su=
    mmarizing all the You libraries.
    ./dk DkDev_Std.Jsontree - (no help) For in-place edits of JSON files.
    ./dk DkStdRestApis_Gen.* - (no help) (unstable, not ready). OpenAPI 3 servi=
    ce and client generator.
    

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=H/1zGqJX; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=p6Un4N3R; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id BA381B80123 for ; Tue, 24 Sep 2024 14:18:49 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=gwj/4y5dHXZBkNt4ZfFDzihCrXaKH5Fw2O1u+vg2xxQ=; b=H/1zGqJXuBYvVRwwWnxyItepvfET0etzYTuBKUjp8BK4SSuNVRI4wTfS kYdxLezPitJpjgKkG9zZA83kbbxcZkFrQOh0YU0ug1pgTwnZo0mXqtnfI x6dIavV2mItApui484/Wu/uE7a7fhMGZDM7Uk4eX9PeJ5UI6yNuMuWAW2 8=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.10,254,1719871200"; d="scan'208,217";a="184861226" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Sep 2024 15:18:48 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 667B1E0D19; Tue, 24 Sep 2024 15:18:48 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id AD589E0035 for ; Tue, 24 Sep 2024 15:18:42 +0200 (CEST) IronPort-SDR: 66f2bc2e_kiXksPx/ZaI8wtXLM2ADof+mqKnk2OuZQvuiOuuA6uf0E9x jL6Hs8SYBZbKyXHiXLmQOVlCL0bEEYT7CI6/caw== X-IPAS-Result: =?us-ascii?q?A0ESAQADu/JmmCIeaIFaFoJCgUGBAxkBY1ozBwhIAwGEU?= =?us-ascii?q?oFjgWyOIIEWkDWGMYE7WoIxgVYUgREDGDkUAQMBDS4BDgQBAgQBAQMBAgGDS?= =?us-ascii?q?XFGAooDAh8GAQQyBw4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECE?= =?us-ascii?q?AEBAQEBAQEBNwVJhXUNgkYZFSNxXgcJNgEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQECDTdnAQgKEwEBJgwGGCMDFAEGAwIRA?= =?us-ascii?q?TUDARMBEhQFAYJnAYJkAwUMBj+TRppsGjd6gTKBAYIMAQEGgQg+AgECCQICA?= =?us-ascii?q?wEOCSUB2gWBYwmBSIgxGgEqSGoChEQJgzd7Jw+BVUSBFTWCIhsHb4I/CxcBA?= =?us-ascii?q?QEBAReBEQERAgEICQkPJAmDJYJpgzGCblUSaYMNYWgBbIEJLxaCbgwTgSQDA?= =?us-ascii?q?mEQJIEYTlcPVwFuPhJCDjIDgRCBPXwlgSIQhihfgQQTgXCCJ4wsgUdLMyETA?= =?us-ascii?q?VUTFwsJBWSGC4JJgyaCFIQVhSWBZwlhh2eBb4E+gVlHgnFKhUiBBoJRa045A?= =?us-ascii?q?g0CN4IoJGqCWoNkgRYdQAMLbT01FBurRQQNKAGBWwFHgUkKJQ4KATMCEgMnD?= =?us-ascii?q?xQBBhQJBQUBBQ4FAxAJFwIkCAIGAgUDBhUKBw8ZGQQJCgQCDgUHAQEJBA0RA?= =?us-ascii?q?QgDAgUEAgQpA5I2FBAVAyoDdI46omc0B4QagV0GDIhGPYEklXOEBYFWiyuGf?= =?us-ascii?q?osEhhw9ZCKYVCKCNIJBhF8KgRsJX4EOapVOBA8NGYUbgW0BMzwwPwEBHAMJB?= =?us-ascii?q?zMaMEMNBAoCAQmCDAEBMgkKDDAcD41/LQEWg1iBPoEmgXU7gkHBBANBNQIBA?= =?us-ascii?q?Q4pAgcBCgEBAwmFYgEBaYUKMoFLAQE?= IronPort-PHdr: A9a23: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 Z2se88rd9OmUx6H IronPort-Data: A9a23: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 vRALZTz6IRp5X29AIGr9Dg= IronPort-HdrOrdr: A9a23:K3tDFKNHJ/+m78BcTs6jsMiBIKoaSvp037BL7TEWdfUxSKalfq +V7ZYmPHPP+VUssRIb+exoWpPwJE80nKQdieJxAV7IZniDhILHFvAE0WIg+VHd8u/Fm9K1GZ 0OT0G2MrPNMWQ= X-Talos-CUID: 9a23:DA+QQGHbC76n//gzqmJg/mQqRdEDbEbYwVDZA3WhCDpFRLysHAo= X-Talos-MUID: 9a23:GB93NQlLl1y9dYkwmyLBdnolCZ1jw6m2Lnodsqgr5fCIbAJ3JAW02WE= X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.10,254,1719871200"; d="scan'208,217";a="97280914" X-MGA-submission: =?us-ascii?q?MDFTvbSBa2nOvicKxJ9u955bwy3yzYkjmjthKc?= =?us-ascii?q?gTh00JxfTUrLOY8E1ztKi7V+cBzn1XEa/FhvIUOBalSRSqiqMlNwcdHN?= =?us-ascii?q?n4PvbK8U2bYsQsmkiOyBRXjd89H6dJpa4uP+Sg/NCwo+JJzkuoA3w4ZU?= =?us-ascii?q?PwBc6ap40cp3py10jU/5Rjog=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Sep 2024 15:18:38 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id A0B3B56491E; Tue, 24 Sep 2024 15:18:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1727183916; bh=QgQ7aKNV6uZ1xXXVYejpCxsEOGSe6YG8JFQu2rh2dNA=; h=From:To:Subject:Date:Message-ID; b=p6Un4N3RHoIH6C9A5Nhrzj6qm3ADBa94HL0RGs+F6dBntprKbDPnHnNoWZa2lSt+E 238C9ROBznEHQ0FrN5NGGAJaCI3yuqZP2x51Hq90mcEJTFCw9ukf5Ngmq4lqsiXjhe kgUbYsp8GO9cVD495hIwVLDnLZvDSxeijv9zQ0ro= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 24 Sep 2024 15:18:36 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 24 15:18:37 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492377, queueID=EA8AE564922 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19181 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 17 to 24, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 ocaml-trace 0.8 qcheck-lin and qcheck-stm 0.2 3rd editor tooling dev-meeting: 26th of September =F0=9F=A7=99 First release of hachis OCaml Platform Newsletter: June-August 2024 First alpha release of OCaml 5.3.0 Ascend - Dungeon RPG for your terminal first release of ppx_deriving_jsonschema opam 2.3.0~alpha1 Other OCaml News Old CWN ocaml-trace 0.8 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [ocaml-trace 0.8] was just released. It features a new trace collector for multiprocess programs, and a new library, `trace.subscriber', for handling events in a more modular, compositional way. For background, `trace' is a lightweight library that can be used to instrument your code (libraries or executable), either by hand or using `ppx_trace', and offers a `collector' abstraction to actually collect/handle/store/write the trace events somewhere. The overhead when no collector is installed is low. There are also several collectors in `trace-tef', `trace-fuchsia', and (in a separate repo) `tracy-client'. See the [github repo] for more details. [ocaml-trace 0.8] [github repo] qcheck-lin and qcheck-stm 0.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to share the 0.4 release of `qcheck-lin', `qcheck-stm', and `qcheck-multicoretests-util': The testing libraries are useful for testing your OCaml code for parallelism safety: =E2=80=A2 `qcheck-lin' offer a low effort approach, requiring little more= than type signatures of the target interface (example above) =E2=80=A2 `qcheck-stm' offers stronger correctness guarantees by comparin= g the observed behaviour to a functional model description - under both sequential and parallel usage. The 0.4 release brings two new "stress test" functions and also adjusts the cmd list distribution of `STM_sequential': =E2=80=A2 #415: Remove `--verbose' in internal `mutable_set_v5' expect te= st to avoid a test failure on a slow machine =E2=80=A2 #443: Add `Lin_domain.stress_test' as a lighter stress test, not requiring an interleaving search. =E2=80=A2 #462: Add `STM_domain.stress_test_par', similar to `Lin_domain.stress_test' for STM models. =E2=80=A2 #472: Switch `arb_cmds' to use an exponential distribution with= a mean of 10, avoiding lists of up to 10000 cmds in `STM_sequential' (reported by @nikolaushuber). Happy testing! :smiley: 3rd editor tooling dev-meeting: 26th of September =F0=9F=A7=99 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The meeting is back! We are organizing the next one on next Thursday, the 26th of September at 5pm CEST (sorry, still no timezone rotation, but we probably will for the next one). Whether you are a long time maintainer, an occasional contributor, a new comer, or simply a curious passer-by, please feel free to attend! :sparkles: For this session, @jchavarri is going to present [Melange], a toolchain that compiles ocaml/reason to javascript, and its integration in the tooling ecosystem. :clipboard: Meeting agenda: =E2=80=A2 A tour-de-table to allow the participants that wish to do so to present themselves and mention issues / prs they are interested in. =E2=80=A2 Talk and Q&A =E2=80=A2 Discuss issues and pull requests that were tagged in advance or mentioned during the tour-de-table. We=E2=80=99re looking forward to meeting you! Meeting link: [https://meet.google.com/nzt-owbh-yoo ] Previous meeting notes are available in [Merlin=E2=80=99s repository wiki= ]. [Melange] [https://meet.google.com/nzt-owbh-yoo ] [Merlin=E2=80=99s repository wiki] First release of hachis =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 It is my pleasure to announce the first release of `hachis', a library that offers hash sets and hash maps. These data structures handle collisions via linear probing, a technique that relies on linear searches within an array. All of the data is stored within one large array (for hash sets) or two large arrays (for hash maps). As a result, these data structures offer good locality. Some benchmarks suggest that `hachis' can consistently outperform the standard library's hash maps (`Hashtbl'). To install the library, type `opam update && opam install hachis'. For more details, see the [documentation]. [documentation] Simon Cruanes then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The code is [here] for those who are curious to see how the sausage is done :-) [here] OCaml Platform Newsletter: June-August 2024 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the twelfth edition of the OCaml Platform newsletter! In this June-August 2024 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in [previous editions]. To understand the direction we're headed, especially regarding development workflows and user experience improvements, check out our [roadmap]. *Highlights:* =E2=80=A2 *Dune package management soon in public beta:* [Developer Previ= ew Program] expands with 60+ interviews, NPS soaring from +9 to +28! Public beta coming soon with exciting features like automatic dependency locking and dev tool management. [See it in action]! =E2=80=A2 *Opam 2.2 is out:* [Native Windows support is here]! Seamless s= etup with `opam init', `opam-repository' compatible with Windows. OCaml on Windows is now a reality. =E2=80=A2 *Odoc 3.0 gets close to a release:* New features like global sidebars and media support are ready in odoc. Integration with Dune and OCaml.org pipeline in progress - get ready to test the new documentation experience soon! [Check out the RFCs]. =E2=80=A2 *Project-wide references is live:* Merlin 5.1 and OCaml LSP 1.1= 8.0 bring powerful code navigation to your editor. Built on years of compiler work, it's a game-changer for large codebases. =E2=80=A2 *Starting to bridge the gap between Merlin and OCaml LSP:* New = LSP queries for type enclosing, documentation, and more. We=E2=80=99re wor= king towards consistent, feature-rich experience across all editors powered by OCaml LSP. *Releases:* =E2=80=A2 [opam 2.2.0~beta3] =E2=80=A2 [opam 2.2.0~rc1] =E2=80=A2 [opam 2.2.0] =E2=80=A2 [opam 2.2.1] =E2=80=A2 [Dune 3.16.0] =E2=80=A2 opam-publish 2.3.1 =E2=80=A2 [Merlin 5.1] =E2=80=A2 [Merlin 4.16] =E2=80=A2 [Merlin 4.15] =E2=80=A2 [OCaml LSP 1.19.0] =E2=80=A2 [OCaml LSP 1.18.0] =E2=80=A2 [Ppxlib 0.33.0] [previous editions] [roadmap] [Developer Preview Program] [See it in action] [Native Windows support is here] [Check out the RFCs] [opam 2.2.0~beta3] [opam 2.2.0~rc1] [opam 2.2.0] [opam 2.2.1] [Dune 3.16.0] [Merlin 5.1] [Merlin 4.16] [Merlin 4.15] [OCaml LSP 1.19.0] [OCaml LSP 1.18.0] [Ppxlib 0.33.0] *Dune Package Management ([W4])* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), @gridbugs (Tarides), @Alizter *Synopsis:* Integrating package management into Dune, making it the sole tool needed for OCaml development. This unification eliminates installation time (just download Dune's pre-built binary), automates external tool management (e.g., for `dune fmt' or `dune ocamllsp'), and significantly reduces build times through caching (packages and compiler are built only once across projects). *Summary:* Following our announcement of reaching the Minimal Viable Product (MVP) stage for Dune's package management in the [last newsletter], we've made substantial progress on our stated goals. As promised, we've shifted our focus from prototyping to user testing and refining the developer experience (DX). The Developer Preview Program (see [latest update]) has expanded significantly from its early stages. We've conducted approximately 60 developer interviews, representing a diverse cross-section of the OCaml community. The interviewees include both newcomers and experienced OCaml users. Notably, about 40% of participants have over 3 years of OCaml experience, while 35% are relative newcomers with less than a year of experience. The majority come from Linux and macOS environments, with participants representing various sectors including tech companies, research institutions, and independent developers. These sessions have provided crucial feedback and driven improvements. This extensive user testing has paid off, with the Net Promoter Score jumping from +9 to an estimated +28 - a clear sign that the community is excited about the improvements we've made. Key developments since the last update include: =E2=80=A2 A nightly binary distribution of Dune with package management enabled, which will be made available publicly in the coming weeks. =E2=80=A2 We started work on automated handling of developer tools (ocamlformat, ocamllsp, odoc) =E2=80=93 users will be able run `dune fm= t', or `dune ocamllsp', and Dune will take care of installing OCamlFormat and OCaml LSP automatically if they are not available. =E2=80=A2 Implementation of automatic dependency locking when project=E2= =80=99s dependency changes =E2=80=93 you can now run Dune in watch mode and let= it install your dependencies without any intervention after updating your dune-project =E2=80=A2 We=E2=80=99ve enabled Dune cache by default, which works with y= our package dependencies. With this change, Dune will not recompile dependencies more than once when building new projects, including the compiler! The team has moved beyond just testing with OCaml.org and Bonsai, now conducting broader compatibility tests across the opam repository. Initial results show about 50% of packages can be authored using Dune with package management, with ongoing efforts to increase the coverage (we expect resolution of a few issues on a select few foundational packages to significantly increase that percentage). In line with the commitment to prepare for a first release, the team plans to launch a public beta in the coming weeks. This marks a significant step from our current private Developer Preview testing with selected beta testers, to a broader community release. Stay tuned for the upcoming announcement, and in the meantime, have a look a the demos and some enthusiastic messages from beta testers: =E2=80=A2 Demo on [Mastodon] or [X] =E2=80=A2 =E2=80=9CJust did the dune package management preview, it=E2=80= =99s looking very sharp=E2=80=9D =E2=80=93 [https://x.com/ckarmstrong/status/183093715643= 4747566] =E2=80=A2 =E2=80=9CReally looking forward to this! No more switches, no m= ore opam, just dune behaving like a modern package manager. Having played around with it, it's just so so nice. The focus on DX really makes me hopeful about OCaml's future.=E2=80=9D =E2=80=93 [https://x.com/synecdokey/status/1825533523283079474] *Activities:* =E2=80=A2 Implemented workaround to avoid unstable compilers =E2=80=93 [ocaml/dune#10668] =E2=80=A2 Added support for multiple checksums ([ocaml/dune#10624], [ocaml/dune#10791]) =E2=80=A2 Began upstreaming the Dune toolchain feature ([ocaml/dune#10639= ], [ocaml/dune#10719]) =E2=80=A2 Added implicit relock when dependencies change =E2=80=93 [ocaml= /dune#10641] =E2=80=A2 Improved dependency solving and constraint handling ([ocaml/dune#10726]) =E2=80=A2 Added developer preview features and configuration options ([ocaml/dune#10627]) =E2=80=A2 Implemented progress indicators for package builds and lockfile generation ([ocaml/dune#10802], [ocaml/dune#10803]) =E2=80=A2 Improved error messages and logging ([ocaml/dune#10662]) =E2=80=A2 Created extensive test suite for new package management features ([ocaml/dune#10798]) =E2=80=A2 Resolved issues with building specific packages (e.g., seq, lwt) ([ocaml/dune#10788], [ocaml/dune#10839]) =E2=80=A2 Enable cache on fetch actions for faster builds ([ocaml/dune#10= 850]) =E2=80=A2 Improved handling of dev tools like ocamlformat ([ocaml/dune#10= 647]) =E2=80=A2 Developed tools for testing package compatibility coverage on opam-repository [W4] [last newsletter] [latest update] [Mastodon] [X] [https://x.com/ckarmstrong/status/1830937156434747566] [https://x.com/synecdokey/status/1825533523283079474] [ocaml/dune#10668] [ocaml/dune#10624] [ocaml/dune#10791] [ocaml/dune#10639] [ocaml/dune#10719] [ocaml/dune#10641] [ocaml/dune#10726] [ocaml/dune#10627] [ocaml/dune#10802] [ocaml/dune#10803] [ocaml/dune#10662] [ocaml/dune#10798] [ocaml/dune#10788] [ocaml/dune#10839] [ocaml/dune#10850] [ocaml/dune#10647] *Native Support for Windows in opam 2.2 ([W5])* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @rjbou (OCamlPro), @kit-ty-kate (Ahrefs), @dra27 (Tarides), @AltGr (OCamlPro) *Synopsis:* Releasing opam 2.2 with native Windows support to enhance OCaml's viability on Windows, making the official `opam-repository' usable on Windows and encouraging more Windows-friendly packages. *Summary:* The release of opam 2.2.0, [announced on Discuss] early July, marks a significant milestone for the OCaml ecosystem. This version brings native support for both the opam client and compiler packages in `opam-repository' on Windows, opening new possibilities for OCaml development on this platform. opam 2.2.0 officially supports Cygwin and is compatible with MSYS2. Windows users can now run `opam init' in their preferred console for a guided setup, resulting in a fully functional OCaml environment. This release represents the culmination of a [multi-year effort] involving extensive contributions from the community. The OCaml ecosystem is already adapting to this new capability. A [CI check for Windows compilation] has been added to opam-repository, and the [GitHub Action ocaml/setup-ocaml] now uses opam 2.2.0, facilitating OCaml development on Windows in GitHub projects. Community members are actively working to improve Windows compatibility across the ecosystem. Notable efforts include [Hugo Heuzard's] work on [OCamlBuild] and several other [Windows-related PRs]. We encourage package authors to set up Windows CI for their projects and address Windows-related issues. This collective effort will be crucial in expanding OCaml's reach and usability on the Windows platform. *Activities:* =E2=80=A2 Opam binary: =E2=80=A3 Fixed issues with `opam init' on Windows =E2=80=93 [ocaml/opa= m#5991], [ocaml/opam#5992], [ocaml/opam#5993], [ocaml/opam#5994], [ocaml/opam#5995], [ocaml/opam#5996], [ocaml/opam#5997], [ocaml/opam#5998], [ocaml/opam#6000] =E2=80=A3 Improved status display during slow operations on Windows =E2= =80=93 [ocaml/opam#5977] =E2=80=A3 Enabled opam to work with Windows usernames containing spaces= =E2=80=93 [ocaml/opam#5457] =E2=80=A3 Fixed `opam init -yn' to handle menus in the release candidat= e =E2=80=93 [ocaml/opam#6033] =E2=80=A3 Updated PowerShell script for installing opam from GitHub releases: [ocaml/opam#5906] =E2=80=A3 Fixed hang issue with `setup-ocaml' and depexts =E2=80=93 [ocaml/opam#6046] =E2=80=A2 Update opam-repository to be compatible with Windows: =E2=80=A3 Updated `opam-repository' Windows CI =E2=80=93 [ocaml/opam-repository#26081], [ocaml/opam-repository#26073], [ocaml/opam-repository#26080] =E2=80=A3 Added backport of MSVC in OCaml-variants.5.2.0+msvc =E2=80=93 [ocaml/opam-repository#26082] =E2=80=A3 Updated native Cygwin depexts =E2=80=93 [ocaml/opam-repositor= y#26130] =E2=80=A3 Updated opam-repository with Windows-specific package informa= tion: =E2=80=A3 Added Windows compiler packages ([ocaml/opam-repository#258= 61]) =E2=80=A3 Fixed issues with OCaml variants on Windows ([ocaml/opam-repository#26033]) =E2=80=A3 Updated and released mingw-w64-shims.0.2.0 to fix setup-ocaml issues ([ocaml/opam-repository#26123]) =E2=80=A2 Released stable version of opam 2.2.0 with full Windows support= =F0=9F=8E=89 ([announcement]) [W5] [announced on Discuss] [multi-year effort] [CI check for Windows compilation] [GitHub Action ocaml/setup-ocaml] [Hugo Heuzard's] [OCamlBuild] [Windows-related PRs] [ocaml/opam#5991] [ocaml/opam#5992] [ocaml/opam#5993] [ocaml/opam#5994] [ocaml/opam#5995] [ocaml/opam#5996] [ocaml/opam#5997] [ocaml/opam#5998] [ocaml/opam#6000] [ocaml/opam#5977] [ocaml/opam#5457] [ocaml/opam#6033] [ocaml/opam#5906] [ocaml/opam#6046] [ocaml/opam-repository#26081] [ocaml/opam-repository#26073] [ocaml/opam-repository#26080] [ocaml/opam-repository#26082] [ocaml/opam-repository#26130] [ocaml/opam-repository#25861] [ocaml/opam-repository#26033] [ocaml/opam-repository#26123] [announcement] *Upgrading OCaml Package Documentation with Odoc 3.0 ([W25])* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C *Contributed by:* @jonludlam (Tarides), @julow (Tarides), @panglesd (Tarides), @EmileTrotignon (Tarides), Luke Maurer (Jane Street) *Synopsis:* Upgrading OCaml package documentation experience with odoc 3, featuring improved navigation, cross-package referencing, media support, and more. This upgrade aims to improve the documentation experience both locally and on OCaml.org, encouraging higher-quality package documentation. *Summary:* Following the completion and community review of the RFCs for odoc 3.0, we've made significant strides in implementing the new design and features. Our progress over the past few months has brought us close to a complete implementation of the odoc 3.0 feature set. As we finalize development and approach the first release, our focus is shifting towards integration with the rest of the ecosystem. Key Developments in the past months include: =E2=80=A2 Adding new options to the `odoc' CLI to begin the implementatio= n of the `odoc' 3 CLI =E2=80=A2 Implementing new syntax such as path-references =E2=80=A2 Developing the global sidebar with a TOC featuring standalone p= ages and package module hierarchy As we near completion of the core odoc 3.0 feature set, our focus is shifting towards finalizing integration with Dune and the OCaml.org documentation pipeline. We're excited to get all of these improvements in your hands and get your feedback on the new documentation experience. Stay tuned for announcements regarding testing opportunities and the upcoming release of odoc 3.0! *Activities:* =E2=80=A2 Added `path-references' lookup functionality =E2=80=93 [ocaml/o= doc#1150] =E2=80=A2 Added the `--current-package' option =E2=80=93 [ocaml/odoc#1151] =E2=80=A2 Fixed hierarchical pages being given wrong parent ID =E2=80=93 [ocaml/odoc#1148] =E2=80=A2 Parsing of `path-references' to pages and modules ([ocaml/odoc#1142]) =E2=80=A2 Support for assets and media in documentation ([ocaml/odoc#1184= ]) =E2=80=A2 Implemented "Global" sidebar feature ([ocaml/odoc#1145]) =E2=80=A2 Added support for external pages and non-package documentation ([ocaml/odoc#1183]) =E2=80=A2 Improved CSS for better visual presentation ([ocaml/odoc#1159]) =E2=80=A2 Add a marshalled output for index generation ([ocaml/odoc#1084]) =E2=80=A2 Implemented Voodoo/Dune driver for improved integration ([ocaml/odoc#1168]) =E2=80=A2 Added frontmatter support to mld pages ([ocaml/odoc#1187]) =E2=80=A2 Improved breadcrumbs to show packages and libraries ([ocaml/odoc#1190]) [W25] [ocaml/odoc#1150] [ocaml/odoc#1151] [ocaml/odoc#1148] [ocaml/odoc#1142] [ocaml/odoc#1184] [ocaml/odoc#1145] [ocaml/odoc#1183] [ocaml/odoc#1159] [ocaml/odoc#1084] [ocaml/odoc#1168] [ocaml/odoc#1187] [ocaml/odoc#1190] *Project-Wide References in OCaml Editors ([W19])* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @vds (Tarides) *Synopsis:* Introducing project-wide reference features in Merlin and OCaml LSP to enhance code navigation and refactoring capabilities, bringing OCaml's editor experience in line with other modern programming languages. *Summary:* As [announced] in June, Merlin project-wide references is now available in Merlin 5.1 and the preview of OCaml LSP 1.18.0. Users of LSP-powered editors (like VSCode with the OCaml Platform extension) and classic Emacs and Vim plugins can now query project-wide references of OCaml terms. This requires building the index with the new Dune alias `@ocaml-index'. This release represents the culmination of a multiyear effort by the Merlin team, including extensive work on the compiler to provide the necessary information for implementing this feature in Merlin. We're thrilled to share this feature with the community and look forward to your feedback. While the feature should work well in most cases, we're aware of some limitations. Our next steps include adding support for interface files and module paths. Stay tuned! *Activities:* =E2=80=A2 Completed work on incremental occurrences indexation and related Dune rules =E2=80=93 [ocaml/dune#10422] =E2=80=A2 Fixed issues with querying from interface files =E2=80=93 [ocaml/merlin#1779], [ocaml/merlin#1781] =E2=80=A2 Improved behavior when cursor is on label/constructor declarati= ons =E2=80=93 [ocaml/merlin#1785] =E2=80=A2 Released `Merlin.5.1-502', `ocaml-index.1.0', and a new preview= of `ocaml-lsp-server' with project-wide occurrences support =E2=80=93 [ocaml/opam-repository#26114] =E2=80=A2 Announced the release on Discuss =E2=80=93 [Project-wide occurr= ences in Merlin and LSP] =E2=80=A2 Wrote a [wiki page] for project-wide occurrences =E2=80=A2 Updated [the Merlin website] =E2=80=A2 Updated the [platform changelog] =E2=80=A2 Improved handling of label and constructor declarations ([ocaml/merlin#1785]) =E2=80=A2 Contributed compiler improvements: =E2=80=A2 Implemented distinct unique identifiers for implementations and interfaces ([ocaml/ocaml#13286]) =E2=80=A2 Developed a system for linking unique identifiers of declaratio= ns ([ocaml/ocaml#13308]) =E2=80=A2 Contributed to improvements in longident locations ([ocaml/ocaml#13302]) [W19] [announced] [ocaml/dune#10422] [ocaml/merlin#1779] [ocaml/merlin#1781] [ocaml/merlin#1785] [ocaml/opam-repository#26114] [Project-wide occurrences in Merlin and LSP] [wiki page] [the Merlin website] [platform changelog] [ocaml/ocaml#13286] [ocaml/ocaml#13308] [ocaml/ocaml#13302] *Bridging the Gap Between Merlin and OCaml LSP ([W19])* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Contributed by:* @xvw (Tarides), @vds (Tarides) *Synopsis:* Working towards feature parity between Merlin and OCaml LSP to provide a consistent, feature-rich development experience across all editors, making OCaml LSP the comprehensive backend for OCaml editor support. *Summary:* In June, we started work on bridging the gap between OCaml LSP and Merlin. We've started with exposing Merlin's type-enclosing request in OCaml LSP. The feature is now available as `ocamllsp/typeEnclosing' and we will work on editor integration next. As a reminder, Merlin's `type-enclosing' feature allows users to get the type of the identifier under the cursor. It highlights the identifier and displays its type. Users can climb the typed-tree to display the type of larger expressions surrounding the cursor. Since June, we=E2=80=99ve worked on a number of new LSP queries and code actions, including: =E2=80=A2 A custom `ocamllsp/getDocumentation' query to request the `odoc' documentation =E2=80=A2 A custom `ocamllsp/construct' query to browse and fill typed ho= les (`_') =E2=80=A2 A code-action for syntactic and semantic movement shortcuts bas= ed on Merlin's Jump command *Activities* =E2=80=A2 Added custom queries for type enclosing and documentation retri= eval: =E2=80=A3 Type enclosing query ([ocaml/ocaml-lsp#1304]) =E2=80=A3 Documentation query ([ocaml/ocaml-lsp#1336]) =E2=80=A2 Created a custom construct query ([ocaml/ocaml-lsp#1348]) =E2=80=A2 Implemented semantic and syntactic movement shortcuts ([ocaml/ocaml-lsp#1364]) =E2=80=A2 Backported and released Merlin 4.16 with necessary commands ([opam-repository PR]) =E2=80=A2 Refactored usage of `Typedtree' from `ocaml-lsp' to `merlin-lib' ([ocaml/merlin#1811], [ocaml/merlin#1812]) [W19] [ocaml/ocaml-lsp#1304] [ocaml/ocaml-lsp#1336] [ocaml/ocaml-lsp#1348] [ocaml/ocaml-lsp#1364] [opam-repository PR] [ocaml/merlin#1811] [ocaml/merlin#1812] First alpha release of OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Four months after the release of OCaml 5.2.0, the set of new features for the future version 5.3.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.3.0. This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions). More information about the whole release process is now available in the [compiler repository]. The progresses on stabilizing the ecosystem are tracked on the [opam readiness for 5.3.0 meta-issue]. The full release is expected around November, see the [new prospective calendar] for more information. If you find any bugs, please report them on [OCaml's issue tracker]. If you are interested in the ongoing list of new features and bug fixes, the updated change log for OCaml 5.3.0 is available [on GitHub]. [compiler repository] [opam readiness for 5.3.0 meta-issue] [new prospective calendar] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.3.0~alpha1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the alpha is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.3.0~alpha1+op= tions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.3.0~alpha1+flambda+nffa ocaml-variants.5.3= .0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Ascend - Dungeon RPG for your terminal =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: eir announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Announcing the first release of *[ascend]*! Venture into the depths to retrieve the stolen artifact, and hopefully escape with your life=E2=80=A6 NetHack lite. *Get it via:* =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install ascend =E2=94=82 ascend =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Rievax the Revelator is recruiting you for some "manual testing". [ascend] first release of ppx_deriving_jsonschema =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Louis Roch=C3=A9 announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my pleasure to announce the first release of [ppx_deriving_jsonschema]. Source repo is This small ppx should help you generate a (hopefully valid) json schema from an ocaml type. Generally the derivation tries to produce a schema which looks natural, and that would also be compatible with the existing derivers for json out there. Basically you should be able to change the annotation to `[@@deriving jsonschema, yojson]' (or `json' instead of `yojson') and to read/write json values that are matching the schema. There is a bit of tension on things like variants, which are represented as arrays by ppx_yojson_conv and ppx_deriving_yojson, but represented as enums by ppx_deriving_jsonschema. I plan to add a way to switch between the two behaviors soon. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type address =3D { =E2=94=82 street: string; =E2=94=82 city: string; =E2=94=82 zip: string; =E2=94=82 } [@@deriving jsonschema] =E2=94=82=20 =E2=94=82 type t =3D { =E2=94=82 name: string; =E2=94=82 age: int; =E2=94=82 email: string option; =E2=94=82 address: address; =E2=94=82 } [@@deriving jsonschema] =E2=94=82=20 =E2=94=82 let schema =3D Ppx_deriving_jsonschema_runtime.json_schema t_js= onschema =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Will be turned into this schema =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 { =E2=94=82 "$schema": "https://json-schema.org/draft/2020-12/schema", =E2=94=82 "type": "object", =E2=94=82 "properties": { =E2=94=82 "address": { =E2=94=82 "type": "object", =E2=94=82 "properties": { =E2=94=82 "zip": { "type": "string" }, =E2=94=82 "city": { "type": "string" }, =E2=94=82 "street": { "type": "string" } =E2=94=82 }, =E2=94=82 "required": [ "zip", "city", "street" ] =E2=94=82 }, =E2=94=82 "email": { "type": "string" }, =E2=94=82 "age": { "type": "integer" }, =E2=94=82 "name": { "type": "string" } =E2=94=82 }, =E2=94=82 "required": [ "address", "age", "name" ] =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Some more advanced functionalities are documented in the readme. Please let me know if you see any important feature missing, if there are bugs, or if you have ideas of improvements. This project was originally started during a Ahrefs dojo, in parallel to the ICFP conference in Milan, as a way to learn how to write a ppx. I can't recommend enough to get going. [ppx_deriving_jsonschema] opam 2.3.0~alpha1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 As mentioned in [our talk at the OCaml Workshop 2024], we decided to switch to a time-based release cycle (every 6 months), starting with opam 2.3. As promised, we are happy to announce the first alpha release of opam 2.3.0. [our talk at the OCaml Workshop 2024] What's new? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C =E2=80=A2 When loading a repository, *opam now ignores files in packages' `files/' directories which aren't listed in the `extra-files' field* of the opam file. :warning: If you maintain an opam repository, please read our [blog post] to make sure your repository stays compatible. =E2=80=A2 *Packages requiring an unsupported version of opam are now mark= ed unavailable*, instead of causing a repository error. This means an opam repository can now allow smoother upgrade in the future =E2=80=A2 *`opam list --latests-only'*: a new option to list only the lat= est versions of packages =E2=80=A2 *`--verbose-on'*: a new option to enable verbose output for specified package names. =E2=80=A2 *`opam switch import --deps-only'*: a new option to install onl= y the dependencies of the root packages listed in the opam switch export file =E2=80=A2 *`opam switch list-available'* will now not display compilers flagged with `avoid-version~/~deprecated' unless `--all' is given, meaning that the "trunk" build of OCaml no longer appears to be the latest version =E2=80=A2 *The `builtin-0install' solver was improved* and should now be capable of being your default solver instead of `builtin-mccs+glpk'. If you wish to give it a try, simply call `opam option solver=3Dbuiltin-0install' =E2=80=A2 Most of the *unhelpful conflict messages were fixed* :flashligh= t: Various performance and other improvements were made and bugs were fixed. :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocam= l/opam/master/shell/install.sh) --version 2.3.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubus= ercontent.com/ocaml/opam/master/shell/install.ps1) } -Version 2.3.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to [the bug-tracker]. [the bug-tracker] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events (Sep 22, 2024 and onwards)] =E2=80=A2 [Eio From a User's Perspective: An Interview With Simon Grondin] =E2=80=A2 [Introducing the `odoc' Cheatsheet: Your Handy Guide to OCaml Documentation] [the ocaml.org blog] [Upcoming OCaml Events (Sep 22, 2024 and onwards)] [Eio From a User's Perspective: An Interview With Simon Grondin] [Introducing the `odoc' Cheatsheet: Your Handy Guide to OCaml Documentation] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 17 to 24, 2= 024.

    ocaml-trace 0.8

    Simon Cruanes announced

    ocaml-t= race 0.8 was just released. It features a new trace collector for multi= process programs, and a new library, trace.subscriber, for han= dling events in a more modular, compositional way.

    For background, trace is a lightweight library that can be use= d to instrument your code (libraries or executable), either by hand or usin= g ppx_trace, and offers a collector abstraction t= o actually collect/handle/store/write the trace events somewhere. The overh= ead when no collector is installed is low. There are also several collector= s in trace-tef, trace-fuchsia, and (in a separate= repo) tracy-client. See the github repo for more details.

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    I'm happy to share the 0.4 release of qcheck-lin, qcheck= -stm, and qcheck-multicoretests-util: https://githu= b.com/ocaml-multicore/multicoretests/releases/tag/0.4

    The testing libraries are useful for testing your OCaml code for parallelis= m safety:

    • qcheck-lin offer a low effort approach, requiring little m= ore than type signatures of the target interface (example above)
    • qcheck-stm offers stronger correctness guarantees by compa= ring the observed behaviour to a functional model description - under both = sequential and parallel usage.

    The 0.4 release brings two new "stress test" functions and also adjusts the= cmd list distribution of STM_sequential:

    • #415: Remove --verbose in internal mutable_set_v5 expect test to avoid a test failure on a slow machine
    • #443: Add Lin_domain.stress_test as a lighter stress test,= not requiring an interleaving search.
    • #462: Add STM_domain.stress_test_par, similar to Lin= _domain.stress_test for STM models.
    • #472: Switch arb_cmds to use an exponential distribution w= ith a mean of 10, avoiding lists of up to 10000 cmds in STM_sequentia= l (reported by @nikolaushuber).

    Happy testing! :smiley:

    3rd editor tooling dev-meeting: 26th of September =F0=9F=A7=99=

    vds announced

    The meeting is back! We are organizing the next one on next Thursday, the 2= 6th of September at 5pm CEST (sorry, still no timezone rotation, but we pro= bably will for the next one). Whether you are a long time maintainer, an oc= casional contributor, a new comer, or simply a curious passer-by, please fe= el free to attend!=20

    :sparkles: For this session, @jchavarri is going to present Melange, a toolchain that compiles o= caml/reason to javascript, and its integration in the tooling ecosystem.

    :clipboard: Meeting agenda:

    • A tour-de-table to allow the participants that wish to do so to present= themselves and mention issues / prs they are interested in.
    • Talk and Q&A
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.

    We=E2=80=99re looking forward to meeting you!

    Meeting link: https://meet= .google.com/nzt-owbh-yoo

    Previous meeting notes are available in Merlin=E2=80=99s repository wiki<= /a>.

    OCaml Platform Newsletter: June-August 2024

    Thibaut Mattio announced

    Welcome to the twelfth edition of the OCaml Platform newsletter!

    In this June-August 2024 edition, we are excited to bring you the latest on= the OCaml Platform, continuing our tradition of highlighting recent develo= pments as seen in previous editions. To understand the direction we're headed, espec= ially regarding development workflows and user experience improvements, che= ck out our roadmap.

    Highlights:

    • Dune package management soon in public beta: Developer Pre= view Program expands with 60+ interviews, NPS soaring from +9 to +28! P= ublic beta coming soon with exciting features like automatic dependency loc= king and dev tool management. See it in action!
    • Opam 2.2 is out: Native Windows support is here! Seamless setup wit= h opam init, opam-repository compatible with Wind= ows. OCaml on Windows is now a reality.
    • Odoc 3.0 gets close to a release: New features like global sideb= ars and media support are ready in odoc. Integration with Dune and OCaml.or= g pipeline in progress - get ready to test the new documentation experience= soon! Check out= the RFCs.
    • Project-wide references is live: Merlin 5.1 and OCaml LSP 1.18.0= bring powerful code navigation to your editor. Built on years of compiler = work, it's a game-changer for large codebases.
    • Starting to bridge the gap between Merlin and OCaml LSP: New LSP= queries for type enclosing, documentation, and more. We=E2=80=99re working= towards consistent, feature-rich experience across all editors powered by = OCaml LSP.

    Releases:

    Dune Package Management (W4)

    Contributed by: @rgrinberg (Tarides), @Leonidas-from-XIV (Tarides), = @gridbugs (Tarides), @Alizter

    Synopsis: Integrating package management into Dune, making it the so= le tool needed for OCaml development. This unification eliminates installat= ion time (just download Dune's pre-built binary), automates external tool m= anagement (e.g., for dune fmt or dune ocamllsp), = and significantly reduces build times through caching (packages and compile= r are built only once across projects).

    Summary:

    Following our announcement of reaching the Minimal Viable Product (MVP) sta= ge for Dune's package management in the last newsletter, we= 've made substantial progress on our stated goals. As promised, we've shift= ed our focus from prototyping to user testing and refining the developer ex= perience (DX).

    The Developer Preview Program (see latest update) has expanded si= gnificantly from its early stages. We've conducted approximately 60 develop= er interviews, representing a diverse cross-section of the OCaml community.= The interviewees include both newcomers and experienced OCaml users. Notab= ly, about 40% of participants have over 3 years of OCaml experience, while = 35% are relative newcomers with less than a year of experience. The majorit= y come from Linux and macOS environments, with participants representing va= rious sectors including tech companies, research institutions, and independ= ent developers.

    These sessions have provided crucial feedback and driven improvements. This= extensive user testing has paid off, with the Net Promoter Score jumping f= rom +9 to an estimated +28 - a clear sign that the community is excited abo= ut the improvements we've made.

    Key developments since the last update include:

    • A nightly binary distribution of Dune with package management enabled, = which will be made available publicly in the coming weeks.
    • We started work on automated handling of developer tools (ocamlformat, = ocamllsp, odoc) – users will be able run dune fmt, or <= code>dune ocamllsp, and Dune will take care of installing OCamlForma= t and OCaml LSP automatically if they are not available.
    • Implementation of automatic dependency locking when project=E2=80=99s d= ependency changes – you can now run Dune in watch mode and let it in= stall your dependencies without any intervention after updating your dune-p= roject
    • We=E2=80=99ve enabled Dune cache by default, which works with your pack= age dependencies. With this change, Dune will not recompile dependencies mo= re than once when building new projects, including the compiler!

    The team has moved beyond just testing with OCaml.org and Bonsai, now condu= cting broader compatibility tests across the opam repository. Initial resul= ts show about 50% of packages can be authored using Dune with package manag= ement, with ongoing efforts to increase the coverage (we expect resolution = of a few issues on a select few foundational packages to significantly incr= ease that percentage).

    In line with the commitment to prepare for a first release, the team plans = to launch a public beta in the coming weeks. This marks a significant step = from our current private Developer Preview testing with selected beta teste= rs, to a broader community release.

    Stay tuned for the upcoming announcement, and in the meantime, have a look = a the demos and some enthusiastic messages from beta testers:

    Activities:

    Native Support for Windows in opam 2.2 (W5)

    Contributed by: @rjbou (OCamlPro), @kit-ty-kate (Ahrefs), @dra27 (Ta= rides), @AltGr (OCamlPro)

    Synopsis: Releasing opam 2.2 with native Windows support to enhance = OCaml's viability on Windows, making the official opam-repository usable on Windows and encouraging more Windows-friendly packages.

    Summary:

    The release of opam 2.2.0, announced on Discuss early July, marks a significan= t milestone for the OCaml ecosystem. This version brings native support for= both the opam client and compiler packages in opam-repository= on Windows, opening new possibilities for OCaml development on this platfo= rm.

    opam 2.2.0 officially supports Cygwin and is compatible with MSYS2. Windows= users can now run opam init in their preferred console for a = guided setup, resulting in a fully functional OCaml environment. This relea= se represents the culmination of a multi-year effort involving extens= ive contributions from the community.

    The OCaml ecosystem is already adapting to this new capability. A CI check for Windo= ws compilation has been added to opam-repository, and the GitHub Action ocaml= /setup-ocaml now uses opam 2.2.0, facilitating OCaml development on Win= dows in GitHub projects.

    Community members are actively working to improve Windows compatibility acr= oss the ecosystem. Notable efforts include Hugo Heuzard's work on OCamlBuild and several other Windows-related PRs.

    We encourage package authors to set up Windows CI for their projects and ad= dress Windows-related issues. This collective effort will be crucial in exp= anding OCaml's reach and usability on the Windows platform.

    Activities:

    Upgrading OCaml Package Documentation with Odoc 3.= 0 (W25)

    Contributed by: @jonludlam (Tarides), @julow (Tarides), @panglesd (T= arides), @EmileTrotignon (Tarides), Luke Maurer (Jane Street)

    Synopsis: Upgrading OCaml package documentation experience with odoc= 3, featuring improved navigation, cross-package referencing, media support= , and more. This upgrade aims to improve the documentation experience both = locally and on OCaml.org, encouraging higher-quality package documentation.

    Summary:

    Following the completion and community review of the RFCs for odoc 3.0, we'= ve made significant strides in implementing the new design and features. Ou= r progress over the past few months has brought us close to a complete impl= ementation of the odoc 3.0 feature set. As we finalize development and appr= oach the first release, our focus is shifting towards integration with the = rest of the ecosystem.

    Key Developments in the past months include:

    • Adding new options to the odoc CLI to begin the implementa= tion of the odoc 3 CLI
    • Implementing new syntax such as path-references
    • Developing the global sidebar with a TOC featuring standalone pages and= package module hierarchy

    As we near completion of the core odoc 3.0 feature set, our focus is shifti= ng towards finalizing integration with Dune and the OCaml.org documentation= pipeline. We're excited to get all of these improvements in your hands and= get your feedback on the new documentation experience. Stay tuned for anno= uncements regarding testing opportunities and the upcoming release of odoc = 3.0!

    Activities:

    Project-Wide References in OCaml Editors (W19)=

    Contributed by: @vds (Tarides)

    Synopsis: Introducing project-wide reference features in Merlin and = OCaml LSP to enhance code navigation and refactoring capabilities, bringing= OCaml's editor experience in line with other modern programming languages.

    Summary:

    As announced in June, Merlin project-wide references = is now available in Merlin 5.1 and the preview of OCaml LSP 1.18.0. Users o= f LSP-powered editors (like VSCode with the OCaml Platform extension) and c= lassic Emacs and Vim plugins can now query project-wide references of OCaml= terms. This requires building the index with the new Dune alias @oca= ml-index.

    This release represents the culmination of a multiyear effort by the Merlin= team, including extensive work on the compiler to provide the necessary in= formation for implementing this feature in Merlin.

    We're thrilled to share this feature with the community and look forward to= your feedback.

    While the feature should work well in most cases, we're aware of some limit= ations. Our next steps include adding support for interface files and modul= e paths. Stay tuned!

    Activities:

    Bridging the Gap Between Merlin and OCaml LSP (W19)=

    Contributed by: @xvw (Tarides), @vds (Tarides)

    Synopsis: Working towards feature parity between Merlin and OCaml LS= P to provide a consistent, feature-rich development experience across all e= ditors, making OCaml LSP the comprehensive backend for OCaml editor support.

    Summary:

    In June, we started work on bridging the gap between OCaml LSP and Merlin. = We've started with exposing Merlin's type-enclosing request in OCaml LSP. T= he feature is now available as ocamllsp/typeEnclosing and we w= ill work on editor integration next.

    As a reminder, Merlin's type-enclosing feature allows users to= get the type of the identifier under the cursor. It highlights the identif= ier and displays its type. Users can climb the typed-tree to display the ty= pe of larger expressions surrounding the cursor.

    Since June, we=E2=80=99ve worked on a number of new LSP queries and code ac= tions, including:

    • A custom ocamllsp/getDocumentation query to request the odoc documentation
    • A custom ocamllsp/construct query to browse and fill typed= holes (_)
    • A code-action for syntactic and semantic movement shortcuts based on Me= rlin's Jump command

    Activities

    First alpha release of OCaml 5.3.0

    octachron announced

    Four months after the release of OCaml 5.2.0, the set of new features for t= he future version 5.3.0 of OCaml has been frozen. We are thus happy to anno= unce the first alpha release for OCaml 5.3.0.

    This alpha version is here to help fellow hackers join us early in our bug = hunting and opam ecosystem fixing fun (see below for the installation instr= uctions). More information about the whole release process is now available= in the compiler repository.

    The progresses on stabilizing the ecosystem are tracked on the opam readiness for 5.= 3.0 meta-issue.

    The full release is expected around November, see the new prospective c= alendar for more information.

    If you find any bugs, please report them on OCaml's issue tracker.

    If you are interested in the ongoing list of new features and bug fixes, th= e updated change log for OCaml 5.3.0 is available on GitHub.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.3.0~alpha1
    

    The source code for the alpha is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.3.0~alpha1+options =
      <option_list>
      

      where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

      opam switch create 5.3.0~alpha1+flambda+nffa ocaml-variants.5.3.0~alpha1+op=
      tions ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Ascend - Dungeon RPG for your terminal

    eir announced

    Announcing the first release of ascend!

    Venture into the depths to retrieve the stolen artifact, and hopefully esca= pe with your life… NetHack lite.

    Get it via:

    opam install ascend
    ascend
    

    Rievax the Revelator is recruiting you for some "manual testing".

    first release of ppx_deriving_jsonschema

    Louis Roch=C3=A9 announced

    It is my pleasure to announce the first release of ppx_deriving_jsonschema. Source = repo is http= s://github.com/ahrefs/ppx_deriving_jsonschema/

    This small ppx should help you generate a (hopefully valid) json schema fro= m an ocaml type.=20

    Generally the derivation tries to produce a schema which looks natural, and= that would also be compatible with the existing derivers for json out ther= e. Basically you should be able to change the annotation to [@@derivi= ng jsonschema, yojson] (or json instead of yojson= ) and to read/write json values that are matching the schema. There = is a bit of tension on things like variants, which are represented as array= s by ppx_yojson_conv and ppx_deriving_yojson, but represented as enums by p= px_deriving_jsonschema. I plan to add a way to switch between the two behav= iors soon.

    type address =3D {
      street: string;
      city: string;
      zip: string;
    } [@@deriving jsonschema]
    
    type t =3D {
      name: string;
      age: int;
      email: string option;
      address: address;
    } [@@deriving jsonschema]
    
    let schema =3D Ppx_=
    deriving_jsonschema_runtime.json_schema t_jsonschema
    

    Will be turned into this schema

    {
      "$schema": "https://json-schema.org/draft/2020-12/schema",
      "type": "object",
      "properties": {
        "address": {
          "type": "object",
          "properties": {
            "zip": { "type": "string" },
            "city": { "type": "string" },
            "street": { "type": "string" }
          },
          "required": [ "zip", "city", "street" ]
        },
        "email": { "type": "string" },
        "age": { "type": "integer" },
        "name": { "type": "string" }
      },
      "required": [ "address", "age", "name" ]
    }
    

    Some more advanced functionalities are documented in the readme.

    Please let me know if you see any important feature missing, if there are b= ugs, or if you have ideas of improvements.

    This project was originally started during a Ahrefs dojo, in parallel to th= e ICFP conference in Milan, as a way to learn how to write a ppx. I can't r= ecommend enough https://github.com/pedrobslisboa/ppx-by-example to get going.

    opam 2.3.0~alpha1

    Kate announced

    As mentioned in our talk at the OCaml Workshop 2024, we de= cided to switch to a time-based release cycle (every 6 months), starting wi= th opam 2.3.

    As promised, we are happy to announce the first alpha release of opam 2.3.0.

    What's new?

    • When loading a repository, opam now ignores files in packages' files/ directories which aren't listed in the extra-files field of the opam file. :warning: If you maintain an opam repositor= y, please read our blog post to make sure your repository stays compatible.
    • Packages requiring an unsupported version of opam are now marked una= vailable, instead of causing a repository error. This means an opam rep= ository can now allow smoother upgrade in the future
    • opam list --latests-only: a new option to list only= the latest versions of packages
    • --verbose-on: a new option to enable verbose output= for specified package names.
    • opam switch import --deps-only: a new option to ins= tall only the dependencies of the root packages listed in the opam switch e= xport file
    • opam switch list-available will now not display com= pilers flagged with avoid-version~/~deprecated unless --= all is given, meaning that the "trunk" build of OCaml no longer appe= ars to be the latest version
    • The builtin-0install solver was improved and should= now be capable of being your default solver instead of builtin-mccs+= glpk. If you wish to give it a try, simply call opam option so= lver=3Dbuiltin-0install
    • Most of the unhelpful conflict messages were fixed :flashlight:<= /li>

    Various performance and other improvements were made and bugs were fixed. :open_book: You can read our blog post for more information about these changes and mor= e, and for even more details you can take a look at the release note or the changelog= .

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://raw.githubusercontent.com/ocaml/opam/ma=
    ster/shell/install.sh) --version 2.3.0~alpha1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://raw.githubuserconten=
    t.com/ocaml/opam/master/shell/install.ps1) } -Version 2.3.0~alpha1"
    

    Please report any issues to the bug-tracker.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=ewAVTJ1O; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=VM4zZWn/; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A031FB80123 for ; Tue, 1 Oct 2024 14:37:26 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=c+cQB+M0ss8kX3Lkl0mZUChwfMlAmtNF6jLOds5xBmY=; b=ewAVTJ1O8qihzsy5FvFiKTX+lMTGGYILjtw52ZFFN/0wRSg+6N0riZt8 0JipWMpJdbgZFf7x1e1iy//nYBEMBAl5H0EQnR3EgpplHQk8Friltlqa+ gJvbFmvG8vSEMIruDCVJqxm72ST1KlahOcSmp8gUofiM2Dpf3fbiO6SGQ o=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,167,1725314400"; d="scan'208,217";a="186260533" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Oct 2024 15:37:25 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id BF0AAE0035; Tue, 1 Oct 2024 15:37:25 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 8866DE00B7 for ; Tue, 1 Oct 2024 15:37:20 +0200 (CEST) IronPort-SDR: 66fbfb0e_JmBgWGGmnp0O0HWKqz8x+26U50td6ZW3AWJUGLO5jFtf+jl A71siMmkH+fYBg8QSqR0hnqMkJL7tkCUlZuTXXg== X-IPAS-Result: =?us-ascii?q?A0ELBwCH+vtm/yIeaIFagliBQVsoBxIBY1ozBwhIA4RTg?= =?us-ascii?q?0+OIIEWmHuCMYFWFIERAxgWIxQBAwENLgENBQECBAEBAwECAYIMgi5ABAICi?= =?us-ascii?q?hkCHwYBBDIHDgECBAEBAQEDAgMBAQEBAQEIAQEFAQEBAgEBAgQGAQKBCggLh?= =?us-ascii?q?TVGDYJGLiNTHl4HCQYBAQEBAQEBAQECAQEBIgEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECCAQBESIEC1wBAgYKEwEBKwcGG?= =?us-ascii?q?BQPAxQBBgMCEQE1AxQBEhQGgg9Zgh9FAwUMBj+UNJstEHqBMoEBggwBAQaBC?= =?us-ascii?q?D4CAQsCAgMBDgklAdoFgWMJgUiIMRoBKkhQGgKEQwmDFIEfByAPgVVEgRU1g?= =?us-ascii?q?j0Hb4FCXCELFwEBAQEYgQwFARECAQIEAgkJDyQJgyWCaYQjgXxNCINXgQZ1W?= =?us-ascii?q?hKBCUUPT4IvgSlhDgEBBgcPCIEQVlcPRQQOb1BCAgwyA4EQgT18IwKBIhCGI?= =?us-ascii?q?1+BF4QUgzcJJYk/gUdLMyETAVUTFwsJBWSGC4JJgyaCFIQVhSWBZwlhh2eBb?= =?us-ascii?q?4E+gVlHgnFKhUaBBoJRa045Ag0CN4IoJGqCWYNkgRV/HUADC209NRQbrBwED?= =?us-ascii?q?SgBgVsBR4IFDgozAQIVJw8VCRUKBQsJCAgCBQEiDSEEBA4fCwEKJw8JBQUEG?= =?us-ascii?q?wIiBQYIAQIHBAItkk0QFQMqA3SOOo4PlFo0B4QbgV0GDIQjhGCBJINZkhqEB?= =?us-ascii?q?YFWiyuZPyKYVCKCNIJBhF8KgRsJX4EOapUSPCCFNIFuATU5MD8eDAczGjBDg?= =?us-ascii?q?jMBMwkKDD4OD4ghhgkCARaDMCgQMX2DGztRgXAcELUbQTUCAQEOKQIHAQoBA?= =?us-ascii?q?QMJhWIBAYVzMmtgAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:94/TD66Td7zbzykMIXnBBwxRtMnGchMFZxGqfqrLsTDasY5as4F+v mVND2yFPfuLZjP2e4wjPIrjp0tUvpDWz4BrQQE//H8zZn8b8sCt6faxfh6hZXvKRiHgZBs6t JtGMoGowOQcFCK0SsKFa+C5xZVE/fjUAOC6UoYoAwgpLSd8UiAtlBl/rOAwh49skLCRDhiE0 T/Ii5S31GSNhXgtawr414rZ8Ekz5ayq4WtD1rADTakjUGH2xyF94K03fvnZw0vQGuF8AuO8T uDf+7C1lkuxE8AFV7tJOp6iGqE7aua60Tqm0hK6aID+6vR2nRHe545gXBYqhei7vB3S9zx54 I0lWZVd0m7FNIWU8AgWe0Ew/y2TocSqUVIISJSymZX78qHIT5fj6+9zXR8XOtIAw9x2DExNy MQmJmEAcinW0opawJrjIgVtrsEzdY/zO4cOpnxrzTfYFOsrB5fZTM0m5/cBhmZ235gSW62GI ZFFAdZsREyojxlnAW0sUMcOkOSO00CiJiVfrEOJqKE35WnK0QE316LiZdPRc9rMXs5Vm0eEu krM+Hn/CRwBctnD2XyC6H3EaurnxHOlAtxKSO3mnhJsqGC8/0gSKDYSbGrloci+gRTldMwAL WVBr0LCqoB3riRHVOLVVBS9pDuAvwUAc8FBFvUzrgCL0KvdpQiDblXoVRZEeIVgrMgyVCAn3 V+Pnsr0CHpoqrL9pW+hy4p4ZAiaYUA9RVLurwddJeeoy4CLTF0b5v4OcjpiLEJxptjlQHfox DSbsCU1h7MSlNMGkaKh8jgrRhqy84PRQFddChr/BwqYAsFRPeZJpLBELXDR6utGJ4uCCFzdr D4Dgcf2ACUmE8SWjCLUKAkSNOjB2htGWQEwRXZ3GJ0w6zmm+3iiZJ1dpjZkKy+F9yrClSDBO CfuhO+a2HOf0LZGo0O6j0JdxvnGFZTdKOk= IronPort-HdrOrdr: A9a23:yIz84atVvgvg5s7w2zU/bRtJ7skDaNV00zEX/kB9WHVpm6uj+f xG/c526feX4Ax6ZJhOo6HjBEDtexPhHP1OjrX5X43SOTUO0VHAROoO0WKI+Vzd8kPFh41g6Z s= X-Talos-CUID: 9a23:rk+cfm6FUaEbzI0UEdss7lNFROEiLWXk9nbdDkyFMVhnGbCJcArF X-Talos-MUID: 9a23:g/zSawXTr2q1MJrq/ALDvRVjFOxs2pXwCHEKms9dlNfbMwUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,167,1725314400"; d="scan'208,217";a="186260486" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDGfDGSncodra3bN34xFy/YoO5bW49oMYjcTE+?= =?us-ascii?q?aREbg01ATXdMlaQT6MQf8aLEm07OBhI2C++16djbyvHxWS8m+35EvPkp?= =?us-ascii?q?WYiiP00mLwD+8tFNnfSzStAPyu269vgJCJoza/PSD21VSKYDQIuUaukt?= =?us-ascii?q?Zci3pZi9ftYFH9UAivbDrH2w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Oct 2024 15:37:16 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E81F4564A63; Tue, 1 Oct 2024 15:37:07 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1727789828; bh=makdXhi0c3O9ypMOgaXhsYb9r59PQtFOIVPoI36DZII=; h=From:To:Subject:Date:Message-ID; b=VM4zZWn/GHz+tZIs6Z+Vu8DH7mrRbi+95rtfvgGz0UO9G923k3TISQn6roXZS2Dda 1jrkahr5LSectHwsCAF4K7spAtpCgtfdkH37kVTeZK2kVs/lQyw0tZZ6qxvtpeeOM4 MVa1qG7THfAJalwhrKCa6TcGdimTY5kgY6rdDB7g= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 01 Oct 2024 15:37:07 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 1 15:37:08 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.092226, queueID=2EFD6564A64 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19182 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 24 to October 01, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dune Developer Preview Updates Uuidm 0.9.9 first release of ppx_deriving_jsonschema Bogue, the OCaml GUI New release of Merlin Releases of mirage-crypto 1.0.0, tls 1.0.0, x509 1.0.0, asn1-combinators 0.= 3.0, let's encrypt 1.0.0, awa 0.4.0, kdf 1.0.0, paf 0.7.0, git 3.17.0 ICFP 2023 OCaml Presentations on YouTube Dune dev meeting Other OCaml News Old CWN Dune Developer Preview Updates =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ostera announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello folks! :wave: Call for Feedback =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C We'd like to welcome everyone to try and play with the [Dune Developer Preview]! :tada: This experimental nightly release of dune includes a lot of improvements, including the much expected package management features, and it can be installed from that website or by using the new installation script: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ curl https://dune.ci.dev/install | bash =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In a few seconds you should be ready to OCaml by calling `dune' =E2=80=93= you can watch a demo of this here: [X], [Mastodon]. Please try it out and let us know what you think :pray: :calendar: You can book a feedback call with us [here] :memo: You can submit feedback using [this form] :bug: You can submit issues to Github on [ocaml/dune] [Dune Developer Preview] [X] [Mastodon] [here] [this form] [ocaml/dune] Changes since last update =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The Dune shared cache has been enabled by default. We're starting off by caching all downloads and dependencies. We have improved support for dev tools. We're working to streamline this but in the latest binary you can: =E2=80=A2 Configure your LSP (in Neovim, Vim, Emacs, etc) to call `dune t= ools exec ocamllsp' to get LSP support for your projects out of the box =E2= =80=93 this may take a little bit the first time it builds the LSP for a compiler version, but its pretty much instant afterwards. =E2=80=A2 Call `dune fmt' to get your project formatted =E2=80=93 remembe= r to add an `.ocamlformat' file if you don't have one yet. An empty one is enough. =E2=80=A2 Call `dune ocaml doc' to get documentation built What's next? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C We're looking forward to streamlining the DX, working on better dependency locks, and looking into supporting Windows. In particular, we're considering work on a few things: =E2=80=A2 `dune create ' =E2=80=93 to let the community create temp= lates that can be easily used from within dune =E2=80=A2 `dune pkg fetch' =E2=80=93 to prefetch packages and prepare a r= epository for working in offline mode =E2=80=A2 `dune build @deps' - to build all dependencies, useful for stag= ed builds in Dockerfiles =E2=80=A2 `dune pkg add ' - to make adding packages straightforward =E2=80=A2 a short-hand syntax for pins on github =E2=80=A2 and more! If you've got any ideas, we'd love to hear them, so please open a feature request on Github :pray: Other updates =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A FunOCaml Presentation At *FunOCaml* we had a last-minute opportunity to present the work being done on Dune and we used it to introduce the Developer Preview to the community, and even tested Package Management live with suggestions from the audience (thanks @anmonteiro and Paul-Elliot for participating!) =E2=80=93 you can [watch it on Twitch]. [watch it on Twitch] =E2=97=8A New design We're working with @Claire_Vandenberghe on redesigning the Developer Preview website so that it'd feel like a seamless extension of OCaml.org =E2=80=93 in this current iteration we've made it easier to get started and we're putting the FAQ front and center. We'll be iterating on this design in the coming weeks until it fits perfectly within the OCaml.org design system :art: You can check the new website here: =E2=97=8A Upcoming Blog posts In the near future we'll be publishing blog posts about the Developer Preview and Package Management, which we're working on with @professor.rose :clap: Uuidm 0.9.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There's a new release of [Uuidm], a library to handle universally unique identifiers (UUIDs). This very old module has been slightly renovated implying a few deprecations, a [quick start] has been added to the docs and foremost new constructors and generators were added to support the latest [RFC 9562] V7 time and random based UUID definitions; thanks to `xen-api' folks for getting the ball rolling on this. See the [release notes] for the details. =E2=80=A2 Docs: [online] or `odig doc uuidm' =E2=80=A2 Install: `opam install uuidm' ([PR]) A big thanks to my [donors]. [Uuidm] [quick start] [RFC 9562] [release notes] [online] [PR] [donors] first release of ppx_deriving_jsonschema =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Louis Roch=C3=A9 announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Released 0.0.2 on opam. It feels like the project is in a good shape now. Changes: =E2=80=A2 support for nativeint, bytes, ref, unit =E2=80=A2 add ~variant_as_array for compatibility with ppx_deriving_yojson =E2=80=A2 support variant payloads =E2=80=A2 support polymorphic variants inheritance =E2=80=A2 fix encoding of tuples =E2=80=A2 change encoding of variants from enum to anyOf I'm considering making `variant_as_array' the default in 0.0.3 as it would be more consistent with the ocaml ecosystem. Bogue, the OCaml GUI =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I'm happy to announce a brand new version of [Bogue], version 20240928, now availble on `opam'. Changes are mostly under the hood. We have nice improvements by @edwin : automatic monitor vsync is now enabled by default, for smoother animations, and most importantly *we finally align with the latest version of `tsdl'*. It will simplify maintenance, but it also implies that *too old versions of SDL will not work anymore*. On the other hand we were kind of obliged to move forward, because `tsdl.0.9.8' won't install on `ocaml 5.2'. =E2=80=A2 if you're on Ubuntu 20.04, installing Bogue with `opam install bogue' will by default pull `tsdl.1.1.0' in, which requires SDL >=3D 2.0.18, not shipped by the OS. A workaround is to explicitly require `opam install tsdl.1.0.0' (or manually installing a newer SDL) =E2=80=A2 if your OS ships SDL < 2.0.10 you have no other choice than man= ually installing a newer [SDL] (which is not that complicated) Happy bogue-ing! [Bogue] [SDL] New release of Merlin =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am very pleased to announce a new release of Merlin for OCaml 5.2, 5.1 and 4.14. This release brings a handful of fixes but also a handful of of new commands: =E2=80=A2 `signature_help' and `inlay_hint' have been upstreamed from `ocaml-lsp-server' =E2=80=A2 `expand_node' a command to get the ppxed-source when called on relevant annotations =E2=80=A2 =F0=9F=95=B5=EF=B8=8F=E2=80=8D=E2=99=80=EF=B8=8F `search-by-typ= e' a [sherlodoc]-inspired syntax to search for values in the environment, that superseeds `polarity-search'. Only `search-by-type' has an Emacs binding right now (and one for vim on is [in the works]), we hope to have some time to work on more client implementations in the near future. [demo1] [demo2] [sherlodoc] [in the works] [demo1] [demo2] Complete changelog: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C Fri Sep 27 12:02:42 CEST 2024 =E2=81=83 merlin binary =E2=80=A2 A new `WRAPPING_PREFIX' configuration directive that can be u= sed to tell Merlin what to append to the current unit name in the presence of wrapping (ocaml/merlin#1788) =E2=80=A2 Add `-unboxed-types' and `-no-unboxed-types' as ocaml ignored flags (ocaml/merlin#1795, fixes ocaml/merlin#1794) =E2=80=A2 destruct: Refinement in the presence of optional arguments (ocaml/merlin#1800 ocaml/merlin#1807, fixes ocaml/merlin#1770) =E2=80=A2 Implement new expand-node command for expanding PPX annotatio= ns (ocaml/merlin#1745) =E2=80=A2 Implement new inlay-hints command for adding hints on a sourc= etree (ocaml/merlin#1812) =E2=80=A2 Implement new search-by-type command for searching values by = types (ocaml/merlin#1828) =E2=80=A2 Canonicalize paths in occurrences. This helps deduplicate the results and show more user-friendly paths. (ocaml/merlin#1840) =E2=80=A2 Fix dot-merlin-reader ignoring `SOURCE_ROOT' and `STDLIB' directives (ocaml/merlin#1839, ocaml/merlin#1803) =E2=81=83 editor modes =E2=80=A2 vim: fix python-3.12 syntax warnings in merlin.py (ocaml/merlin#1798) =E2=80=A2 vim: Dead code / doc removal for previously deleted MerlinPhr= ase command (ocaml/merlin#1804) =E2=80=A2 emacs: Improve the way that result of polarity search is disp= layed (ocaml/merlin#1814) =E2=80=A2 emacs: Add `merlin-search-by-type', `merlin-search-by-polarit= y' and change the behaviour of `merlin-search' to switch between `by-type' or `by-polarity' depending on the query (ocaml/merlin#1828) cc @xvw @PizieDust Releases of mirage-crypto 1.0.0, tls 1.0.0, x509 1.0.0, asn1-combinators 0.= 3.0, let's encrypt 1.0.0, awa 0.4.0, kdf 1.0.0, paf 0.7.0, git 3.17.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear OCaml developers, we're pleased to finally release a full stack of packages that do not rely on Cstruct.t/Bigarray, but use string / bytes instead. This brings us a massive performance boost (e.g. a factor of 3 in tls), and brings a easier to comprehend API. It also makes performance tooling work much more smoothly with our released packages. We announced this upcoming change earlier this year For further details, please see the specific release pages: =E2=80=A2 [mirage-crypto 1.0.0] (also [1.0.1], and [1.1.0]) - cryptograph= ic operations in OCaml (symmetric ciphers, asymmetric ciphers (RSA, DSA, DH), fortuna (a cryptographic secure pseudo random number generator), elliptic curves (from [fiat-crypto]) =E2=80=93 the hash algorithms have been removed - use [digestif] instead =E2=80=A2 [tls 1.0.0] (also [1.0.1], [1.0.2], and [1.0.3]) - a Transport = layer security implementation (HTTPS) in OCaml, supporting TLS 1.0, 1.1, 1.2, and 1.3 =E2=80=A2 [x509 1.0.0] (also [1.0.1], [1.0.2], [1.0.3], and [1.0.4]) - X5= 09 certificates (signing requests, certificate revocation lists, PKCS12) =E2=80=A2 [asn1-combinators 0.3.0] (also [0.3.1] and [0.3.2]) - ASN.1 par= ser combinators =E2=80=A2 [let's encrypt 1.0.0] - a client for - automated TLS certificate issuance =E2=80=A2 [awa 0.4.0] - a SSH client and server implementation =E2=80=A2 [kdf 1.0.0] - supporting different key derivation functions: hk= df (used in TLS), PBKDF2, SCRYPT =E2=80=A2 [paf 0.7.0] - protocol-agnostic client (http / http2) =E2=80=A2 [git 3.17.0] - an implementation of the version control system = git =E2=80=A2 [dns 9.0.0] (also [9.0.1]) - an implementation of the domain na= me system As you can envision, there was a lot of coordination and releasing involved in preparing these API-breaking changes. The list above likely misses various packages that have been released to support the new mirage-crypto and tls API. There have already been various issues reported and fixed in the subsequent minor releases. We encourage you to upgrade your software stack to the new release series, and report issues while you encounter them (being it API questions, or correctness issues). Earlier releases are not maintained anymore (due to lack of interest and lack of time), thus if you encounter issues in earlier releases, please first update to the most recent releases (although this may need some effort =E2=80=93= a PR that uses the packages heavily is ). If you're stuck or lack time to port your code to the new API, we at robur offer commercial support in upgrading your codebase. Reach out to us via email: team@robur.coop. This work has been conducted by the [robur collective]. Parts of this work was sponsored by Tarides. [mirage-crypto 1.0.0] [1.0.1] [1.1.0] [fiat-crypto] [digestif] [tls 1.0.0] [1.0.1] [1.0.2] [1.0.3] [x509 1.0.0] [1.0.1] [1.0.2] [1.0.3] [1.0.4] [asn1-combinators 0.3.0] [0.3.1] [0.3.2] [let's encrypt 1.0.0] [awa 0.4.0] [kdf 1.0.0] [paf 0.7.0] [git 3.17.0] [dns 9.0.0] [9.0.1] [robur collective] ICFP 2023 OCaml Presentations on YouTube =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 After a respectable pause, I've now imported these videos into the Watch.OCaml.org instance so we have a non-YouTube mirror. They're up on the [OCaml Workshop 2023 channel] now. Enjoy your ad-free viewing! :slight_smile: [OCaml Workshop 2023 channel] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi Dune enthusiasts! :camel: We will hold our regular Dune dev meeting tomorrow, on *Wednesday, October, 2nd at 16:00 CET*. As usual, the session will be one hour long. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronise between the Dune developers :smile: :calendar: Agenda =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The agenda is available on the [meeting dedicated page ]. Feel free to ask if you want to add more items in it. [meeting dedicated page ] :computer: Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Meeting link: [zoom ] =E2=80=A2 Calendar event: [google calendar ] =E2=80=A2 Wiki with information and previous notes: [GitHub Wiki ] [zoom ] [google calendar ] [GitHub Wiki ] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [[OCaML'23] Modern DSL compiler architecture in OCaml our exper= ience with Catala] =E2=80=A2 [[OCaML'23] Eio 1.0 =E2=80=93 Effects-based IO for OCaml 5] =E2=80=A2 [[OCaML'23] Less Power for More Learning: Restricting OCaml Fea= tures for Effective Teaching] =E2=80=A2 [[OCaML'23] Efficient OCaml compilation with Flambda 2] =E2=80=A2 [[OCaML'23] Buck2 for OCaml Users & Developers] =E2=80=A2 [[OCaML'23] Parallel Sequences in Multicore OCaml] =E2=80=A2 [[OCaML'23] Building a lock-free STM for OCaml] =E2=80=A2 [[OCaML'23] MetaOCaml Theory and Implementation] =E2=80=A2 [[OCaML'23] Osiris: an Iris-based program logic for OCaml] =E2=80=A2 [[OCaML'23] State of the OCaml Platform 2023] =E2=80=A2 [[OCaML'23] Owi: an interpreter and a toolkit for WebAssembly written in OCaml] =E2=80=A2 [[OCaML'23] Targeted Static Analysis for OCaml C Stubs: Elimina= ting gremlins from the code] =E2=80=A2 [Introducing Dune: The Essential Build System for OCaml Develop= ers] =E2=80=A2 [Summer of Internships: Projects From the OCaml Compiler Team] [the ocaml.org blog] [[OCaML'23] Modern DSL compiler architecture in OCaml our experience with Catala] [[OCaML'23] Eio 1.0 =E2=80=93 Effects-based IO for OCaml 5] [[OCaML'23] Less Power for More Learning: Restricting OCaml Features for Effective Teaching] [[OCaML'23] Efficient OCaml compilation with Flambda 2] [[OCaML'23] Buck2 for OCaml Users & Developers] [[OCaML'23] Parallel Sequences in Multicore OCaml] [[OCaML'23] Building a lock-free STM for OCaml] [[OCaML'23] MetaOCaml Theory and Implementation] [[OCaML'23] Osiris: an Iris-based program logic for OCaml] [[OCaML'23] State of the OCaml Platform 2023] [[OCaML'23] Owi: an interpreter and a toolkit for WebAssembly written in OCaml] [[OCaML'23] Targeted Static Analysis for OCaml C Stubs: Eliminating gremlins from the code] [Introducing Dune: The Essential Build System for OCaml Developers] [Summer of Internships: Projects From the OCaml Compiler Team] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 24 to Octob= er 01, 2024.

    Dune Developer Preview Updates

    ostera announced

    Hello folks! :wave:=20

    Call for Feedback

    We'd like to welcome everyone to try and play with the Dune Developer Preview! :tada:=20

    This experimental nightly release of dune includes a lot of improvements, i= ncluding the much expected package management features, and it can be insta= lled from that website or by using the new installation script:

    $ curl https://dune.ci.dev/install | bash
    

    In a few seconds you should be ready to OCaml by calling dune = =E2=80=93 you can watch a demo of this here: X, Mastodon.

    Please try it out and let us know what you think :pray:=20

    :calendar: You can book a feedback call with us here

    :memo: You can submit feedback using this form

    :bug: You can submit issues to Github on ocaml/dune

    Changes since last update

    The Dune shared cache has been enabled by default. We're starting off by ca= ching all downloads and dependencies.

    We have improved support for dev tools. We're working to streamline this bu= t in the latest binary you can:

    • Configure your LSP (in Neovim, Vim, Emacs, etc) to call dune tool= s exec ocamllsp to get LSP support for your projects out of the box = =E2=80=93 this may take a little bit the first time it builds the LSP for a= compiler version, but its pretty much instant afterwards.
    • Call dune fmt to get your project formatted =E2=80=93 reme= mber to add an .ocamlformat file if you don't have one yet. An= empty one is enough.
    • Call dune ocaml doc to get documentation built

    What's next?

    We're looking forward to streamlining the DX, working on better dependency = locks, and looking into supporting Windows.

    In particular, we're considering work on a few things:

    • dune create <repo> =E2=80=93 to let the community cr= eate templates that can be easily used from within dune
    • dune pkg fetch =E2=80=93 to prefetch packages and prepare = a repository for working in offline mode
    • dune build @deps - to build all dependencies, useful for s= taged builds in Dockerfiles
    • dune pkg add <name> - to make adding packages straig= htforward
    • a short-hand syntax for pins on github
    • and more!

    If you've got any ideas, we'd love to hear them, so please open a feature r= equest on Github :pray:=20

    Other updates

    • FunOCaml Presentation

      At FunOCaml we had a last-minute opportunity to present the work bei= ng done on Dune and we used it to introduce the Developer Preview to the co= mmunity, and even tested Package Management live with suggestions from the = audience (thanks @anmonteiro and Paul-Elliot for participating!) =E2=80=93 = you can w= atch it on Twitch.

    • New design

      We're working with @Claire_Vandenberghe on redesigning the Developer Previe= w website so that it'd feel like a seamless extension of OCaml.org =E2=80= =93 in this current iteration we've made it easier to get started and we're= putting the FAQ front and center.

      We'll be iterating on this design in the coming weeks until it fits perfect= ly within the OCaml.org design system :art:=20

      You can check the new website here: https:/= /dune.ci.dev=20

    • Upcoming Blog posts

      In the near future we'll be publishing blog posts about the Developer Previ= ew and Package Management, which we're working on with @professor.rose :cla= p:

    Uuidm 0.9.9

    Daniel B=C3=BCnzli announced

    There's a new release of Uu= idm, a library to handle universally unique identifiers (UUIDs).

    This very old module has been slightly renovated implying a few deprecation= s, a quick star= t has been added to the docs and foremost new constructors and generato= rs were added to support the latest RFC 9562 V7 time and random based UUID definitions; thanks = to xen-api folks for getting the ball rolling on this. See the= release notes for the details.=20

    • Docs: online o= r odig doc uuidm
    • Install: opam install uuidm (PR)

    A big thanks to my donors<= /a>.

    first release of ppx_deriving_jsonschema

    Louis Roch=C3=A9 announced

    Released 0.0.2 on opam. It feels like the project is in a good shape now.

    Changes:

    • support for nativeint, bytes, ref, unit
    • add ~variant_as_array for compatibility with ppx_deriving_yojson
    • support variant payloads
    • support polymorphic variants inheritance
    • fix encoding of tuples
    • change encoding of variants from enum to anyOf

    I'm considering making variant_as_array the default in 0.0.3 a= s it would be more consistent with the ocaml ecosystem.

    Bogue, the OCaml GUI

    sanette announced

    I'm happy to announce a brand new version of Bogue, version 20240928, now availble on opam.

    Changes are mostly under the hood. We have nice improvements by @edwin : au= tomatic monitor vsync is now enabled by default, for smoother animations, a= nd most importantly we finally align with the latest version of ts= dl. It will simplify maintenance, but it also implies that to= o old versions of SDL will not work anymore. On the other hand we were = kind of obliged to move forward, because tsdl.0.9.8 won't inst= all on ocaml 5.2.

    • if you're on Ubuntu 20.04, installing Bogue with opam install bog= ue will by default pull tsdl.1.1.0 in, which requires S= DL >=3D 2.0.18, not shipped by the OS. A workaround is to explicitly req= uire opam install tsdl.1.0.0 (or manually installing a newer S= DL)
    • if your OS ships SDL < 2.0.10 you have no other choice than manually= installing a newer SDL (which is not that complicated)

    Happy bogue-ing!

    New release of Merlin

    vds announced

    I am very pleased to announce a new release of Merlin for OCaml 5.2, 5.1 an= d 4.14. This release brings a handful of fixes but also a handful of of new= commands:=20

    • signature_help and inlay_hint have been upstr= eamed from ocaml-lsp-server
    • expand_node a command to get the ppxed-source when called = on relevant annotations
    • =F0=9F=95=B5=EF=B8=8F=E2=80=8D=E2=99=80=EF=B8=8F search-by-type a sherlodoc-inspired synt= ax to search for values in the environment, that superseeds polarity-= search.

    Only search-by-type has an Emacs binding right now (and one fo= r vim on is in the wo= rks), we hope to have some time to work on more client implementations = in the near future.

    demo1

    demo2

    Complete changelog:

    Fri Sep 27 12:02:42 CEST 2024

    • merlin binary
      • A new WRAPPING_PREFIX configuration directive that can be = used to tell Merlin what to append to the current unit name in the presence of wrapping (ocaml/= merlin#1788)
      • Add -unboxed-types and -no-unboxed-types as o= caml ignored flags (ocaml/merlin#1795, fixes ocaml/merlin#1794)
      • destruct: Refinement in the presence of optional arguments (ocaml/merli= n#1800 ocaml/merlin#1807, fixes ocaml/merlin#1770)
      • Implement new expand-node command for expanding PPX annotations (ocaml/= merlin#1745)
      • Implement new inlay-hints command for adding hints on a sourcetree (oca= ml/merlin#1812)
      • Implement new search-by-type command for searching values by types (oca= ml/merlin#1828)
      • Canonicalize paths in occurrences. This helps deduplicate the results a= nd show more user-friendly paths. (ocaml/merlin#1840)
      • Fix dot-merlin-reader ignoring SOURCE_ROOT and STDLI= B directives (ocaml/merlin#1839, ocaml/merlin#1803)
    • editor modes
      • vim: fix python-3.12 syntax warnings in merlin.py (ocaml/merlin#1798)
      • vim: Dead code / doc removal for previously deleted MerlinPhrase comman= d (ocaml/merlin#1804)
      • emacs: Improve the way that result of polarity search is displayed (oca= ml/merlin#1814)
      • emacs: Add merlin-search-by-type, merlin-search-by-p= olarity and change the behaviour of merlin-search to switch between by-type or by-polarity depending on the query (ocaml/merlin#1828)

    cc @xvw @PizieDust

    Releases of mirage-crypto 1.0.0, tls 1.0.0, x509 1.0.0, asn1-c= ombinators 0.3.0, let's encrypt 1.0.0, awa 0.4.0, kdf 1.0.0, paf 0.7.0, git= 3.17.0

    Hannes Mehnert announced

    Dear OCaml developers,

    we're pleased to finally release a full stack of packages that do not rely = on Cstruct.t/Bigarray, but use string / bytes instead. This brings us a mas= sive performance boost (e.g. a factor of 3 in tls), and brings a easier to = comprehend API. It also makes performance tooling work much more smoothly w= ith our released packages. We announced this upcoming change earlier this y= ear https= ://discuss.ocaml.org/t/ann-mirage-crypto-0-11-3-with-more-speed-for-ellipti= c-curves-and-the-future-roadmap-of-mirage-crypto

    For further details, please see the specific release pages:

    As you can envision, there was a lot of coordination and releasing involved= in preparing these API-breaking changes. The list above likely misses vari= ous packages that have been released to support the new mirage-crypto and t= ls API.

    There have already been various issues reported and fixed in the subsequent= minor releases. We encourage you to upgrade your software stack to the new= release series, and report issues while you encounter them (being it API q= uestions, or correctness issues). Earlier releases are not maintained anymo= re (due to lack of interest and lack of time), thus if you encounter issues= in earlier releases, please first update to the most recent releases (alth= ough this may need some effort – a PR that uses the packages heavily= is https://gi= thub.com/robur-coop/miragevpn/pull/279). If you're stuck or lack time t= o port your code to the new API, we at robur offer commercial support in up= grading your codebase. Reach out to us via email: team@robur.coop.

    This work has been conducted by the robur co= llective. Parts of this work was sponsored by Tarides.

    ICFP 2023 OCaml Presentations on YouTube

    Anil Madhavapeddy announced

    After a respectable pause, I've now imported these videos into the Watch.OC= aml.org instance so we have a non-YouTube mirror. They're up on the OCaml Workshop 2023 c= hannel now. Enjoy your ad-free viewing! :slight_smile:

    Dune dev meeting

    Etienne Marais announced

    Hi Dune enthusiasts! :camel:=20=20

    We will hold our regular Dune dev meeting tomorrow, on Wednesday, Octobe= r, 2nd at 16:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronise between the Dune developers :smile:

    :calendar: Agenda

    The agenda is available on the meeting dedicated page . Feel free to ask if = you want to add more items in it.

    :computer: Links

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=vOlbvR3n; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Y24Zgv3F; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id F0640B80123 for ; Tue, 8 Oct 2024 11:56:44 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=oRAWWKeVVn91oZT377w2Auo21zE5cFEM5v1ImHfpgys=; b=vOlbvR3ntBVKXd3bFAHogyd94HRUQlGSq6kiihfpDu2oG8uVxh1OIgdC SQq5W1ZJQZvwhOspe55G/O37iJDYkdV9AKKDbYIEfZFEfaCe5ERyNVBpg 2K0mLgxLQulfSOyn5Aj0vQ15yJMyUtnoIr5O5bDuYasobtC2LPN5BHKyr Y=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,186,1725314400"; d="scan'208,217";a="187609210" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Oct 2024 12:56:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id EC3AFE0D16; Tue, 8 Oct 2024 12:56:42 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 17051E0035 for ; Tue, 8 Oct 2024 12:56:37 +0200 (CEST) IronPort-SDR: 67050fe3_2ltuVVUiAxNGLkr2ChYl8eAA65HkwswHoAijiipC22JRzmd pLAB5exoqjgdFKek//7F+p6c3s5PBsjEwT486gg== X-IPAS-Result: =?us-ascii?q?A0GrSwA1DwVn/yIeaIFagliBQVsoBxIBY1ozBwhIA0Aeg?= =?us-ascii?q?3WDT44ggRabLYJ7AxgWIxQBAwENLgEFDQECBAEBAwECAYIMgi5ABAICFooCA?= =?us-ascii?q?h8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBCAEBBQEBAQIBAQIEBgECgQoIC4U1D?= =?us-ascii?q?AY0DYJGLiNxXgMEAwY2AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQIIBAEHBRcGBwMPHCQcAQgEBhMBASkPGCMDEAQBBgMCB?= =?us-ascii?q?A0BNQMBEwESFAIEAoJmgh9FAwQBDAY/kDabORB6fzOBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gUBDgkm2gaBYwmBSIgxGgEFJUhqAoRECYQxAicPgVVEgRWCcgdvgVABLUEXC?= =?us-ascii?q?wEBAQEBF0RgAQEIBj8JGIMNgmmGHlWDV4ESaWyBCUUPgmMbgSlwASaBY1cPR?= =?us-ascii?q?QQObT4SQgIMgUSBPWYWJT4LLSwQhiBegQQTgXCCH4M2BhmJV4FHIgMmMyETA?= =?us-ascii?q?VUTFwsJBWSGC4JGgyaCFIQVhSWBZwlgh2WBbIE+gVlHgnFKhUaBBoJLa045A?= =?us-ascii?q?g0CN4IlJGSCVoNigX4dQAMLbT01FBurewQNKQGBWgFGgVYtAg4LNQUnBAwPD?= =?us-ascii?q?QgoBQETFQEBAQkZNi0MCgIXHRcCDgwFEAcSBQQCCwItkk0QGAUlAnWOO44Pk?= =?us-ascii?q?1CBCjQHhBuBXQYMiQOBJJVzhAWBVoU3hXSGf5JFIpgWPiKCNIcgXUgJgW0eT?= =?us-ascii?q?IhvjEkWBIFUg3yBUSwnOQ1iARsCAwkHMxowIiGCZwkJAUoOD4wxgXwWgQwBC?= =?us-ascii?q?IElgR6BPgqBHIE8OTtavTFBNQIBAQkuAgcBCgEBAwmFRR0BAYZVgUsBAQ?= IronPort-PHdr: A9a23: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 1bGRDBuY5aqsYjofZJITT0JkKA= IronPort-Data: A9a23:Pw1+VaP97R+Il0LvrR1UlsFynXyQoLVcMsEvi/4bfWQNrUoh0GNSx 2EdXz3SPvnYMWP0etx+O9y+oExVvpDVnNVjTHM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48T8mk/vgqoPUUIbsIjp2SRJvVBAvgBdin/9RqoNziLBVOSvU0 T/Ji5OZYQbNNwJcaDpOt/vb8EM35pwehRtB1rAATaAT1LPhvyJNZH4vDfnZB2f1RIBSAtm7S 47rpF1u1j6xE78FU7tJo56jGqE4aua60Tum1hK6b5Ofbi1q/UTe5EqU2M00Mi+7gx3R9zx4J U4kWZaYEW/FNYWU8AgRvoUx/4iT8sSq9ZeeSUVTv/B/wGXhL1DC3MxLHHo4OK5D+NZQW1lF3 9UXfWVlghCr34pawZq+WrAqnsMnPdXmN4MZu2h9wHfeF/lOrZLrGv+bo4YAgHFr3oYVQZ4yZ OJBAdZrRC/6WEUaIGsoLscEsbKwgX3ubzBTqFSUvLc6pW/Jw1l41LHrdsHeetmLWdl9lEGFo GnL5CL8XgFcM8aQodaA2iv82bGXzHqkCer+EpWxxuRgmlGC1lUUVkU1Vl2f+OmStXeXDoc3x 0s8v3BGQbIJ3EeiS924WxyjvFafrxsEUpxRFfc74UeD0MLpDx2xA3hdCCZGbM06ucQ2Qz0zy 1LPmMnmbdByjICopbum3u/8hVuP1eI9dwfuyAddJefZy7EPYb3fjy4jiv5mAPfzltrxCC39y DCMrTEjivMUl8FjO2CT4wXcmzz1znTWZldd2+kVdjvNAsBFiEqNbYu171PW9rBFcJbfSUOO1 JTBs9bL9/gAVPlhiwTUKNjg39iVCzKtKDrYkEJiFJkn9i2w9jikZ484DPSS4qt2Gp5sRAIFq 3M/de+cCFG/8ZdqgWJKj1qNNvkX IronPort-HdrOrdr: A9a23:aUW/f6068+rkAH51PtNwnwqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-Talos-CUID: 9a23:9Tnerm14nx/vbpSmvDXoUrxfPZwOXGLk6WfrLUqbUmRZb+etQnW59/Yx X-Talos-MUID: 9a23:I+zUrgg8MlQ4peYf/OSCB8MpPfdy6b6iGVA0lstemMqCEXVgEAikpWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,186,1725314400"; d="scan'208,217";a="187609179" X-MGA-submission: =?us-ascii?q?MDGMC6tefnfUwZs83rZyD31JQicSd02MACy5r8?= =?us-ascii?q?r4/nt+w1Cz1g13lvmh1dUe1CSFo4hX1rCp7rrJ9w6U0jiOMK2XApqkP2?= =?us-ascii?q?7OPCSFRSbXYejAK1UcCq2zBoMAbdhyq+f5IQFVxPecznzlFfPBZQQyvb?= =?us-ascii?q?cJpNvAkc1bPZft32At+G76Dg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Oct 2024 12:56:33 +0200 Received: from TM.local (unknown [37.165.155.185]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3316A5648B1; Tue, 8 Oct 2024 12:56:23 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1728384983; bh=RpDLAfVrIkWsBnYDoGKCECVgU6+VV+B0Ya7LMCZ01aM=; h=From:To:Subject:Date:Message-ID; b=Y24Zgv3FrfO0GDDvKVFYmcvv4GBikTN2/D7jiGFiRkN8Nmbu/3gAk2WK+ePNYsyJZ RaxDA/DloCxFdvVw7s2i4uWZHE9k+cU0ioNnce0gFI0/FlxFPikT/+xfPZGW+Ul+x2 rb5SnDt69Vl34buM0JrIfTJdwv4rTTJqjzMbRlOA= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 08 Oct 2024 12:56:22 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 8 12:56:24 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499884, queueID=BEF895648B2 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19185 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAwMSB0byAwOCwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KUmVsZWFz ZXMgb2YgZnBhdGgtc2V4cGxpYjAsIGZwYXRoLWJhc2UsIGxvYywgZmlsZS1yZXdyaXRlciwgc2V4 cHMtcmV3cml0ZXIgYW5kIHByb3ZpZGVyDQpCdWlsZCBhIHByb2plY3Qgd2l0aG91dCBTdGRsaWIN Cm9iYXRjaGVyOiBGcmFtZXdvcmsgZm9yIGJ1aWxkaW5nIGVmZmljaWVudCBjb25jdXJyZW50IHNl cnZpY2VzDQpEQkxQIHF1ZXJ5IHByb2dyYW0gYW5kIGxpYnJhcnkNCmN1ZGFqaXQ6IEJpbmRpbmdz IHRvIHRoZSBgY3VkYScgYW5kIGBudnJ0YycgbGlicmFyaWVzDQpZT0NhbWwsIGEgZnJhbWV3b3Jr IGZvciBzdGF0aWMgc2l0ZSBnZW5lcmF0b3INCm9lcHViIDAuMS4wIDogQSBsaWJyYXJ5IHRvIHBh cnNlIGVwdWIgZmlsZXMNCnBweF9kZXJpdmluZ19yb3V0ZXIg4oCUIHR5cGUgc2FmZSByb3V0aW5n IGZvciBEcmVhbSBhbmQgTWVsYW5nZQ0KTWljYSwgYSBQUFggdGhhdCBhdXRvbWF0ZXMgZGlmZmVy ZW50aWFsIHRlc3RpbmcgZm9yIE9DYW1sIG1vZHVsZXMNClNpbXBsaWZpZWQgQW5kcm9pZCBjcm9z cy1jb21waWxlciB3aXRoIERrTUwNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpSZWxl YXNlcyBvZiBmcGF0aC1zZXhwbGliMCwgZnBhdGgtYmFzZSwgbG9jLCBmaWxlLXJld3JpdGVyLCBz ZXhwcy1yZXdyaXRlciBhbmQgcHJvdmlkZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsZWFz ZXMtb2YtZnBhdGgtc2V4cGxpYjAtZnBhdGgtYmFzZS1sb2MtZmlsZS1yZXdyaXRlci1zZXhwcy1y ZXdyaXRlci1hbmQtcHJvdmlkZXIvMTUzNjQvMT4NCg0KDQpNYXRoaWV1IEJhcmJpbiBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd2FudGVkIHRvIGFubm91bmNlIHRoZSBpbml0aWFs IHJlbGVhc2Ugb2YgNiB1dGlsaXR5IHBhY2thZ2VzIHRvIHRoZQ0KICBvcGFtLXJlcG9zaXRvcnku IFRoZXkgYXJlIGRlcGVuZGVuY2llcyB0byBzb21lIG90aGVyIG9uZ29pbmcgcHJvamVjdHMNCiAg SSBoYXZlLCBwZXJoYXBzIHNvbWUgd2lsbCBmaW5kIHRoZW0gdXNlZnVsLg0KDQogIFRoZXNlIGFy ZSB2ZXJ5IGVhcmx5IGRheXMgZm9yIHRoaXMgc29mdHdhcmUuIFBsZWFzZSBmZWVsIHdlbGNvbWUg dG8NCiAgb3BlbmluZyBpc3N1ZXMgb3IgZGlzY3Vzc2lvbnMgdGlja2V0cyBpZiB5b3UgYXJlIGlu Y2xpbmVkLg0KDQogIFRoYW5rIHlvdSBAbXNlcmkgLCBAYXZzbSAmIEBzaG9uZmVkZXIgZm9yIHlv dXIgaGVscCBpbiBtYWtpbmcgdGhlc2UNCiAgbGlicmFyaWVzIGF2YWlsYWJsZSENCg0KICBCZWxv dyB5b3UnbGwgZmluZCBzaG9ydCBkZXNjcmlwdGlvbnMgd2l0aCBsaW5rcyB0byB0aGUgcGFja2Fn ZXMgaG9tZQ0KICBwYWdlcy4gVGhhbmsgeW91IQ0KDQogIFtGcGF0aF9zZXhwbGliMF0gb25seSBk ZXBlbmRzIG9uIGBmcGF0aCcgYW5kIGBzZXhwbGliMCcuIEl0IGRlZmluZXMgYQ0KICBzaW5nbGUg bW9kdWxlLCBgRnBhdGhfc2V4cGxpYjAnLCB3aGljaCBpcyBkZXNpZ25lZCB0byBiZSBvcGVuZWQg dG8NCiAgc2hhZG93IHRoZSBgRnBhdGgnIG1vZHVsZSB0byBhZGQgc21hbGwgaGVscGVycyBhbmQg YSBgc2V4cF9vZicNCiAgc2VyaWFsaXplciB0byBpdC4gVGhlIHBhY2thZ2UgYWxzbyBpbnRyb2R1 Y2VzIHRocmVlIG5ldyBtb2R1bGVzIHRvIHRoZQ0KICBzY29wZTogYEZwYXJ0JywgYEFic29sdXRl X3BhdGgnIGFuZCBgUmVsYXRpdmVfcGF0aCcgdG8gaW5jcmVhc2UNCiAgdHlwZS1zYWZldHkgd2hl biBtYW5pcHVsYXRpbmcgcGF0aHMgdGhhdCBhcmUga25vd24gdG8gYmUgcmVsYXRpdmUgb3INCiAg YWJzb2x1dGUuDQoNCiAgW0ZwYXRoX2Jhc2VdIGZ1cnRoZXIgZXh0ZW5kcyBgZnBhdGgtc2V4cGxp YjAnIGFuZCBhZGRzIGEgZGVwZW5kZW5jeSBvbg0KICBiYXNlLiBJdCBpcyBkZXNpZ25lZCB0byBi ZSBjb21wYXRpYmxlIHdpdGggQmFzZS1zdHlsZSBjb250YWluZXJzIHN1Y2gNCiAgYXMgYE1hcCcs IGBTZXQnLCBgSGFzaHRibCcsIGBIYXNoX3NldCcuDQoNCiAgW0xvY10gaXMgYW4gT0NhbWwgbGli cmFyeSB0byBtYW5pcHVsYXRlIGNvZGUgbG9jYXRpb25zLCB3aGljaCBhcmUNCiAgcmFuZ2VzIG9m IGxleGluZyBwb3NpdGlvbnMgZnJvbSBhIHBhcnNlZCBmaWxlLg0KDQogIFtGaWxlX3Jld3JpdGVy XSBpcyBhbiBPQ2FtbCBsaWJyYXJ5IGZvciBhcHBseWluZyBzbWFsbCByZXdyaXRlcyB0bw0KICB0 d2VhayBvciByZWZhY3RvciB5b3VyIGZpbGVzLiBJdCBwcm92aWRlcyBhIGNvbnZlbmllbnQgaW50 ZXJmYWNlIHRvDQogIGFwcGx5IHN1cmdpY2FsIHRleHR1YWwgc3Vic3RpdHV0aW9ucyBvbiB0aGUg Zmx5LCB3aGlsZSBuYXZpZ2F0aW5nIHRoZQ0KICBjb250ZW50cyBvZiBhIGZpbGUgdGhyb3VnaCBh biBhYnN0cmFjdCByZXByZXNlbnRhdGlvbiBjb250YWluaW5nIGNvZGUNCiAgbG9jYXRpb25zLg0K DQogIFtTZXhwc19yZXdyaXRlcl0gaXMgYSBzcGVjaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBgZmls ZS1yZXdyaXRlcicNCiAgbGlicmFyeSBkZWRpY2F0ZWQgdG8gcmV3cml0aW5nIHNleHAgZmlsZXMs IHN1Y2ggYXMgZHVuZSBjb25maWcgZmlsZXMuDQoNCiAgW1Byb3ZpZGVyXSBpcyBhbiBPQ2FtbCBs aWJyYXJ5IGZvciBjcmVhdGluZyBUcmFpdHMgYW5kIEludGVyZmFjZXMuIEl0DQogIGFsbG93cyB5 b3UgdG8gZGVmaW5lIHRoZSBmdW5jdGlvbmFsaXR5IG5lZWRlZCBieSBhIGxpYnJhcnkgd2l0aG91 dA0KICBjb21taXR0aW5nIHRvIGEgc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gLSBpbiBlc3NlbmNl IDogZHluYW1pYw0KICBkaXNwYXRjaC4gUHJvdmlkZXIgaXMgYSBwYXR0ZXJuIGZlYXR1cmVkIGlu IHRoZSBgRWlvJyBwcm9qZWN0DQogIChgRWlvLlJlc291cmNlJykuIEkgd2FudGVkIHRvIG1ha2Ug aXQgcmV1c2FibGUgaW4gb3RoZXIgcHJvamVjdHMgLSBpbg0KICBwYXJ0aWN1bGFyIEkgYW0gY3Vy cmVudGx5IHVzaW5nIGl0IGFzIHRoZSBwYXJhbWV0cml6YXRpb24gc3Rvcnkgb2YNCiAgYHZjcycu IFRoaXMgcGFja2FnZSBoYWQgYWxyZWFkeSBiZWVuIGF2YWlsYWJsZSBmb3IgYSBsaXR0bGUgd2hp bGUNCiAgYWxyZWFkeSBidXQgd2FzIHN0aWxsIHVuYW5ub3VuY2VkLg0KDQoNCltGcGF0aF9zZXhw bGliMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2ZwYXRoLWJhc2U+DQoNCltGcGF0aF9i YXNlXSA8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vZnBhdGgtYmFzZT4NCg0KW0xvY10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9tYmFyYmluL2xvYz4NCg0KW0ZpbGVfcmV3cml0ZXJdIDxodHRwczov L2dpdGh1Yi5jb20vbWJhcmJpbi9maWxlLXJld3JpdGVyPg0KDQpbU2V4cHNfcmV3cml0ZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9maWxlLXJld3JpdGVyPg0KDQpbUHJvdmlkZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9wcm92aWRlcj4NCg0KDQpCdWlsZCBhIHByb2plY3Qg d2l0aG91dCBTdGRsaWINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYnVpbGQtYS1wcm9qZWN0LXdp dGhvdXQtc3RkbGliLzE1Mzc0LzE+DQoNCg0KTWlraGFpbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgZGVjaWRlZCB0 byBleHBlcmltZW50IHdpdGggY29tcGlsaW5nIGEgcHJvamVjdCB3aXRob3V0IHRoZSBzdGFuZGFy ZA0KICBsaWJyYXJ5LiBXaHk/IEkgZG9uJ3Qga25vdy4gQnV0IEkgY291bGQgc2F2ZSB+NTBLLiBK dXN0IHNoYXJpbmcgbXkNCiAgbm90ZSBhYm91dCBpdC4NCg0KICBZb3UgY2FuIGZpbmQgYW4gZXhh bXBsZSBpbiBteSBbcmVwb3NpdG9yeV0uDQoNCiAgSSBmb3VuZCB0aGUgYC1ub3N0ZGxpYicgYW5k IGAtbm9wZXJ2YXNpdmVzJyAodW5kb2N1bWVudGVkKSBmbGFncyBhbmQNCiAgYWZ0ZXIgYSBsb3Qg b2YgdHJ5aW5nIEkgd2FzIGFibGUgdG8gZG8gd2hhdCBJIHdhbnRlZC4gSXQgZG9lc24ndA0KICBk aXNhYmxlIGFic29sdXRlbHkgZXZlcnl0aGluZyAobGlzdHMgYW5kIG90aGVyIHR5cGVzIGxpa2Ug YG9wdGlvbicgYXJlDQogIGF2YWlsYWJsZSkuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAo ZmxhZ3MNCiAg4pSCICAgOnN0YW5kYXJkDQogIOKUgiAgIC1ub3N0ZGxpYg0KICDilIIgICAtbm9w ZXJ2YXNpdmVzDQogIOKUgiAgIDsgYWRkIHJ1bnRpbWUNCiAg4pSCICAgLWNjbGliDQogIOKUgiAg IC1sYXNtcnVuDQogIOKUgiAgIC1jY29wdA0KICDilIIgICAiLUwgJXtvY2FtbF93aGVyZX0iDQog IOKUgiAgIC1jY29wdA0KICDilIIgICAiLWxtIC1sZGwiKQ0KICDilJTilIDilIDilIDilIANCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCICgqIHN0ZGxpYi5tbCAqKQ0KICDilIIgZXh0ZXJuYWwg cHJpbnRfZW5kbGluZSA6IHN0cmluZyAtPiB1bml0ID0gImNhbWxfcHJpbnRfZW5kbGluZSIgW0BA bm9hbGxvY10NCiAg4pSCIA0KICDilIIgKCogbWFpbi5tbCAqKQ0KICDilIIgb3BlbiBTdGRsaWIN CiAg4pSCIGxldCAoKSA9IHByaW50X2VuZGxpbmUgImhlbGxvIGZyb20gbXkgc3RkbGliIg0KICDi lJTilIDilIDilIDilIANCg0KICBIZWxsbyBXb3JsZCBwcm9ncmFtOg0KDQogIOKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KICAgICAgICAgICB3 aXRoIFN0ZGxpYiAgd2l0aG91dCBTdGRsaWIgDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KICAgKnNpemUqICAzNDlLICAgICAgICAgMzAy SyAgICAgICAgICAgDQogIOKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgQ0KDQoNCltyZXBvc2l0b3J5XSA8aHR0cHM6Ly9naXRodWIuY29tL2R4M21v ZC9vY2FtbC13aXRob3V0LXN0ZGxpYj4NCg0KDQpvYmF0Y2hlcjogRnJhbWV3b3JrIGZvciBidWls ZGluZyBlZmZpY2llbnQgY29uY3VycmVudCBzZXJ2aWNlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2JhdGNoZXItZnJh bWV3b3JrLWZvci1idWlsZGluZy1lZmZpY2llbnQtY29uY3VycmVudC1zZXJ2aWNlcy8xNTM4NC8x Pg0KDQoNCkxlZSBLb29uIFdlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhvdCBvbiB0aGUg aGVlbHMgb2YgdGhlIHBhcGVyIFsvIkNvbmN1cnJlbnQgRGF0YSBTdHJ1Y3R1cmVzIE1hZGUNCiAg RWFzeSIvXSBhcHBlYXJpbmcgYXQgW09PUFNMQSAyMDI0XSBvbiB0aGUgMjR0aCBPY3RvYmVyLCBJ J20gcGxlYXNlZCB0bw0KICBhbm5vdW5jZSByZWxlYXNlIG9mICpvYmF0Y2hlciogLSBhIF9waWNv c18gY29tcGF0aWJsZSBsaWJyYXJ5IGZvcg0KICBpbXBsZW1lbnRpbmcgZWZmaWNpZW50IGJhdGNo ZWQgc2VydmljZXMgaW4gT0NhbWwuDQoNCiAgKm9iYXRjaGVyKiBwcm9wb3NlcyBhICpuZXcqIHdh eSB0byBhcHByb2FjaCB0aGUgZGVzaWduIGFuZA0KICAgaW1wbGVtZW50YXRpb24gb2YgY29uY3Vy cmVudCBzZXJ2aWNlcy4gSXQncyBrZXkgYmVuZWZpdHMgYXJlOg0KDQogIOKAoiBJbmNyZW1lbnRh bCBvcHRpbWl6YXRpb24gYW5kIHBhcmFsbGVsaXNtIG9mIHNlcnZpY2VzDQogIOKAoiBFYXN5IHRv IGNvbnRyb2wgYW5kIHJlYXNvbiBhYm91dCBjb25jdXJyZW5jeQ0KICDigKIgUmV0YWlucyBhdG9t aWMtc3R5bGUgaW50ZXJmYWNlIHdpdGggeW91ciBzZXJ2aWNlcyB3aGlsZSBiYXRjaGluZw0KICAg IGhhcHBlbnMgaW1wbGljaXRseQ0KICDigKIgVGhyZWFkLXNhZmV0eSBmb3IgY2hlYXAhDQoNCiAg QXZhaWxhYmxlIG9uIG9wYW0gdG9kYXksIGluc3RhbGwgd2l0aA0KICDilIzilIDilIDilIDilIAN CiAg4pSCIG9wYW0gaW5zdGFsbCBvYmF0Y2hlcg0KICDilJTilIDilIDilIDilIANCg0KICBGb3Ig bW9yZSBkZXRhaWxzLCBjaGVjayBvdXQgdGhlIHNvdXJjZSBhbmQgUkVBRE1FIG9uIEdpdEh1YjoN CiAgW29iYXRjaGVyXS4NCg0KICBGZWVkYmFjaywgY29udHJpYnV0aW9ucywgYW5kIGRpc2N1c3Np b25zIGFyZSB3ZWxjb21lIQ0KDQoNClsvIkNvbmN1cnJlbnQgRGF0YSBTdHJ1Y3R1cmVzIE1hZGUg RWFzeSIvXQ0KPGh0dHBzOi8va29vbndlbi5naXRodWIuaW8vYXNzZXRzL3BkZi9jb25jdXJyZW50 LXN0cnVjdHVyZXMtbWFkZS1lYXN5LnBkZj4NCg0KW09PUFNMQSAyMDI0XQ0KPGh0dHBzOi8vMjAy NC5zcGxhc2hjb24ub3JnL2RldGFpbHMvc3BsYXNoLTIwMjQtb29wc2xhLzExOC9Db25jdXJyZW50 LURhdGEtU3RydWN0dXJlcy1NYWRlLUVhc3k+DQoNCltvYmF0Y2hlcl0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9rb29ud2VuL29iYXRjaGVyPg0KDQoNCkRCTFAgcXVlcnkgcHJvZ3JhbSBhbmQgbGlicmFy eQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZGJscC1xdWVyeS1wcm9ncmFtLWFuZC1saWJy YXJ5LzE1Mzg1LzE+DQoNCg0KU2FtdWVsIE1pbXJhbSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEkgYW0gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHJlYWxlYXNlIG9mIFtvY2FtbC1k YmxwXSwgd2hpY2gNCiAgcHJvdmlkZXMgYm90aCBhIHByb2dyYW0gYW5kIGEgbGlicmFyeSB0byBx dWVyeSB0aGUgW0RCTFBdDQogIGJpYmxpb2dyYXBoaWMgZGF0YWJhc2UuIEluIHByYWN0aWNlLCBp dCBpcyBtb3N0bHkgdXNlZnVsIGZvcg0KICByZXRyaWV2aW5nIGJpYnRleCBlbnRyaWVzIHdpdGgg Y29tbWFuZHMgc3VjaCBhcw0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgZGJscCBiaWJ0ZXgg Z2lyYXJkIGxvY3VzIHNvbHVtDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoaWNoIHdpbGwgc3Bp dCBvdXQNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIEBhcnRpY2xle0RCTFA6am91cm5hbHMv bXNjcy9HaXJhcmQwMSwNCiAg4pSCICAgYXV0aG9yICAgICAgID0ge0plYW57LX1ZdmVzIEdpcmFy ZH0sDQogIOKUgiAgIHRpdGxlICAgICAgICA9IHtMb2N1cyBTb2x1bTogRnJvbSB0aGUgcnVsZXMg b2YgbG9naWMgdG8gdGhlIGxvZ2ljIG9mIHJ1bGVzfSwNCiAg4pSCICAgam91cm5hbCAgICAgID0g e01hdGguIFN0cnVjdC4gQ29tcHV0LiBTY2kufSwNCiAg4pSCICAgdm9sdW1lICAgICAgID0gezEx fSwNCiAg4pSCICAgbnVtYmVyICAgICAgID0gezN9LA0KICDilIIgICBwYWdlcyAgICAgICAgPSB7 MzAxLS01MDZ9LA0KICDilIIgICB5ZWFyICAgICAgICAgPSB7MjAwMX0sDQogIOKUgiAgIHVybCAg ICAgICAgICA9IHtodHRwczovL2RvaS5vcmcvMTAuMTAxNy9TMDk2MDEyOTUwMTAwMzM2WH0sDQog IOKUgiAgIGRvaSAgICAgICAgICA9IHsxMC4xMDE3L1MwOTYwMTI5NTAxMDAzMzZYfSwNCiAg4pSC ICAgdGltZXN0YW1wICAgID0ge1dlZCwgMDEgQXByIDIwMjAgMDg6NDg6NDcgKzAyMDB9LA0KICDi lIIgICBiaWJ1cmwgICAgICAgPSB7aHR0cHM6Ly9kYmxwLm9yZy9yZWMvam91cm5hbHMvbXNjcy9H aXJhcmQwMS5iaWJ9LA0KICDilIIgICBiaWJzb3VyY2UgICAgPSB7ZGJscCBjb21wdXRlciBzY2ll bmNlIGJpYmxpb2dyYXBoeSwgaHR0cHM6Ly9kYmxwLm9yZ30NCiAg4pSCIH0NCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgKG9yLCBldmVuIGJldHRlciwgdXNlIGBkYmxwIGJpYicgdG8gZGlyZWN0bHkg YWRkIHRoaXMgYXQgdGhlIGVuZCBvZg0KICB0aGUgYC5iaWInIGZpbGUgaW4gdGhlIGN1cnJlbnQg ZGlyZWN0b3J5KS4NCg0KICBJdCBtaWdodCBzdGlsbCBuZWVkIHNvbWUgcG9saXNoaW5nLCBmZWVs IGZyZWUgdG8gcmVhY2ggb3V0IGlmIHlvdQ0KICBlbmNvdW50ZXIgc29tZSBwcm9ibGVtcy4NCg0K DQpbb2NhbWwtZGJscF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zbWltcmFtL29jYW1sLWRibHA+DQoN CltEQkxQXSA8aHR0cHM6Ly9kYmxwLm9yZy8+DQoNCg0KY3VkYWppdDogQmluZGluZ3MgdG8gdGhl IGBjdWRhJyBhbmQgYG52cnRjJyBsaWJyYXJpZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLWN1ZGFqaXQtYmluZGluZ3MtdG8tdGhlLWN1ZGEtYW5kLW52cnRjLWxpYnJh cmllcy8xNTAxMC8yPg0KDQoNCkx1a2FzeiBTdGFmaW5pYWsgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBjdWRhaml0IDAuNS4wIGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIG9w YW0gcmVwb3NpdG9yeS4gSXQncyBvcmdhbml6ZWQNCiAgaW50byBbbW9kdWxlc10sIGFuZCBpdCBh ZGRzIHN1cHBvcnQgZm9yIENVREEgZXZlbnRzLg0KDQoNClttb2R1bGVzXQ0KPGh0dHBzOi8vbHVr c3RhZmkuZ2l0aHViLmlvL29jYW1sLWN1ZGFqaXQvY3VkYWppdC9DdWRhaml0L2luZGV4Lmh0bWw+ DQoNCg0KWU9DYW1sLCBhIGZyYW1ld29yayBmb3Igc3RhdGljIHNpdGUgZ2VuZXJhdG9yDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi15b2NhbWwtYS1mcmFtZXdvcmstZm9yLXN0YXRpYy1zaXRlLWdlbmVyYXRvci8x NTM5My8xPg0KDQoNClhhdmllciBWYW4gZGUgV29lc3R5bmUgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICA6d2F2ZTogSGVsbG8gZXZlcnlvbmUh IFdlLCB0aGUgWU9DYW1sIGRldmVsb3BtZW50IHRlYW0sIGFyZSB2ZXJ5DQogIHBsZWFzZWQgdG8g YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW3ZlcnNpb24gMl0sIGZyZXNobHkgbWVyZ2VkIGludG8N CiAgW29wYW0tcmVwb3NpdG9yeV0gOmNoYW1wYWduZTohDQoNCiAgKllPQ2FtbCBpcyBhIGZyYW1l d29yayBmb3IgZGVzY3JpYmluZyBzdGF0aWMgc2l0ZSBnZW5lcmF0b3JzKiAoYSB2ZXJ5DQogICBz bWFsbCBhcHBsaWNhdGl2ZSBidWlsZC1zeXN0ZW0gd2hvc2UgQVBJIGlzIHRhaWxvci1tYWRlIGZv ciBjcmVhdGluZw0KICAgd2ViIHBhZ2VzICkgYW5kIGl0cyBpbnRlcm5hbCBtb2RlbCBpcyB2ZXJ5 IHNpbWlsYXIgdG8gW0hha3lsbF0gKHRoZQ0KICAgM3RoIHZlcnNpb24pLCBhbm90aGVyIEhhc2tl bGwgZnJhbWV3b3JrLiAoYSBwcmVzZW50YXRpb24gd2FzIGdpdmVuIHRvDQogICB0aGUgT0NhbWwg dXNlciBHcm91cCBpbiBQYXJpcyBhbmQgeW91IGNhbiBmaW5kIHRoZSB2aWRlbywgW2luIEZyZW5j aCwNCiAgIGhlcmVdKS4NCg0KDQpbdmVyc2lvbiAyXSA8aHR0cHM6Ly9naXRodWIuY29tL3hodG1s Ym9pL3lvY2FtbC9yZWxlYXNlcy90YWcvdjIuMC4wPg0KDQpbb3BhbS1yZXBvc2l0b3J5XSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeT4NCg0KW0hha3lsbF0gPGh0dHBz Oi8vamFzcGVydmRqLmJlL2hha3lsbC8+DQoNCltpbiBGcmVuY2gsIGhlcmVdDQo8aHR0cHM6Ly93 d3cuaXJpbGwub3JnL3ZpZGVvcy9PVVBTLzIwMjMtMDEveGF2aWVyLXZhbi1kZS13b2VzdHluZS5o dG1sPg0KDQpDaGFuZ2VzIHdpdGggMS4wLjANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEhpc3RvcmljYWxseSwgWU9DYW1sIHdhcyB3 cml0dGVuIHZlcnksIHZlcnkgcXVpY2tseSB0byBnaXZlIGV4YW1wbGVzDQogIG9mIHNsaWdodGx5 IGV4b3RpYyB1c2VzIG9mIHRoZSBsaWJyYXJ5IFtQcmVmYWNlXS4gRHVlIHRvIGl0cw0KICBleHBl cmltZW50YWwgbmF0dXJlLCB0aGUgQVBJIHdhcyBhIGJpdCBsYWJvcmlvdXMsIGJ1dCB3ZSBkaWQg ZmluZCBzb21lDQogIHVzZXJzISBXZSB0b29rIGFkdmFudGFnZSBvZiB0aGUgcmVkZXNpZ24gdG8g c3RvcCByZWx5aW5nIG9uIFByZWZhY2UNCiAgKGFuZCB5ZXMsIFlPQ2FtbCB3YXMgYWxyZWFkeSBt b3JlIHdpZGVseSB1c2VkIHRoYW4gUHJlZmFjZSksIG1vdmUgdG8NCiAgT0NhbWwgNS54IGFuZCB0 YWtlIGFkdmFudGFnZSBvZiBfdXNlci1kZWZpbmVkLWVmZmVjdHNfIGFuZCBzdXBwb3J0DQogIGR5 bmFtaWMgZGVwZW5kZW5jaWVzLiBJbiBvdGhlciB3b3JkcywgWU9DYW1sIGAyLjAuMCcgaXMgbm90 IGF0IGFsbA0KICBjb21wYXRpYmxlIHdpdGggdmVyc2lvbiAx4oCmDQoNCg0KW1ByZWZhY2VdIDxo dHRwczovL2dpdGh1Yi5jb20veHZ3L3ByZWZhY2U+DQoNCg0KUGx1Z2lucyBhbmQgcnVudGltZXMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIFRoZSBhaW0gb2YgWU9DYW1sIGlzIHRvIGJlIHZlcnkgZ2VuZXJpYyBhbmQgdG8g YWxsb3cgdXNlcnMgdG8gYnJpbmcNCiAgdGhlaXIgb3duIGRlcGVuZGVuY2llcywgYnV0IHdlJ3Zl IHRha2VuIHRoZSBvcHBvcnR1bml0eSB0byByZWxlYXNlIGl0DQogIHdpdGggc2V2ZXJhbCBwbHVn aW5zIGFuZCBydW50aW1lcyBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGRpcmVjdGx5Lg0KDQoNCuKX iiBSdW50aW1lcw0KDQogIEEgUnVudGltZSBpcyBhbiDigJhleGVjdXRpb24gY29udGV4dOKAmSBh bmQgZ2VuZXJhbGx5IGV4cG9zZXMgdGhlDQogIHByaW1pdGl2ZSB1c2VkIHRvIGV4ZWN1dGUgYSBZ T0NhbWwgcHJvZ3JhbS4gWU9DYW1sIDIgaXMgYnVuZGxlZCB3aXRoIDMNCiAgUnVudGltZXM6DQoN CiAg4oCiICpZb2NhbWxfdW5peCo6IHRoZSBkZWZhdWx0IHJ1bnRpbWUsIHdob3NlIHByZXZpZXcg c2VydmVyIGlzDQogICAgIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGUgYnJhbmQgbmV3IFtodHRw Y2F0c10hDQoNCiAg4oCiICpZb2NhbWxfZWlvKjogYSBydW50aW1lIGlzbyB0byBVbml4IGJ1dCBi YXNlZCBvbiBbZWlvXSBhbmQgd2hvc2UNCiAgICAgcHJldmlldyBzZXJ2ZXIgaXMgZGVzY3JpYmVk IGJ5IFtjb2h0dHBfZWlvXS4NCg0KICDigKIgKllvY2FtbF9naXQqOiBhIHBhcmFtZXRlcmlzZWQg cnVudGltZSBmb3IgZ2VuZXJhdGluZyBhIHNpdGUgZGlyZWN0bHkNCiAgICAgaW4gYSBnaXQgcmVw b3NpdG9yeSwgd2hpY2ggY2FuIGJlIHNlcnZlZCwgZm9yIGV4YW1wbGUsIGJ5IGENCiAgICAgW01p cmFnZV0gKFt1bmlwaV0pLCB2ZXJ5IHdlbGwgZG9jdW1lbnRlZCBpbiB0aGlzIFtleGNlbGxlbnQN CiAgICAgYXJ0aWNsZV0gYnkgQGRpbm9zYXVyZSENCg0KDQogIFtodHRwY2F0c10gPGh0dHBzOi8v Z2l0aHViLmNvbS9yb2J1ci1jb29wL2h0dHBjYXRzPg0KDQogIFtlaW9dIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtbXVsdGljb3JlL2Vpbz4NCg0KICBbY29odHRwX2Vpb10gPGh0dHBzOi8vZ2l0 aHViLmNvbS9taXJhZ2Uvb2NhbWwtY29odHRwPg0KDQogIFtNaXJhZ2VdIDxodHRwczovL21pcmFn ZS5pby8+DQoNCiAgW3VuaXBpXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdW5pcGk+ DQoNCiAgW2V4Y2VsbGVudCBhcnRpY2xlXSA8aHR0cHM6Ly9ibG9nLm9zYXUucmUvYXJ0aWNsZXMv YmxvZ19yZXF1aWVtLmh0bWw+DQoNCg0K4peKIFBsdWdpbnMNCg0KICDigKIgKllvY2FtbF9jbWFy a2l0KiBwcm92aWRlcyBhIGNvbnZlbmllbnQgQVBJICh2aWEgWU9DYW1sKSBmb3INCiAgICAgY29u dmVydGluZyBNYXJrZG93biBmaWxlcyB0byBIVE1MIHZpYSB0aGUgZXhjZWxsZW50IFtjbWFya2l0 XQ0KICAgICBsaWJyYXJ5Lg0KDQogIOKAoiAqWW9jYW1sX29tZCogcHJvdmlkZXMgYSBjb252ZW5p ZW50IEFQSSAodmlhIFlPQ2FtbCkgZm9yIGNvbnZlcnRpbmcNCiAgICAgTWFya2Rvd24gZmlsZXMg dG8gSFRNTCB2aWEgdGhlIGV4Y2VsbGVudCBbT01EXSBsaWJyYXJ5IChidXQgd2UNCiAgICAgcmVj b21tZW5kIGB5b2NhbWxfY21hcmtpdCcpLg0KDQogIOKAoiAqeW9jYW1sX3lhbWwqIHByb3ZpZGVz IGEgY29udmVuaWVudCBBUEkgKHZpYSBZT0NhbWwpIGZvciByZWFkaW5nDQogICAgIFlhbWwgdmlh IHRoZSBleGNlbGxlbnQgbGlicmFyeSBbb2NhbWwteWFtbF0NCg0KICDigKIgKnlvY2FtbF9vdG9t bCogcHJvdmlkZXMgYSBjb252ZW5pZW50IEFQSSAoZm9yIFlPQ2FtbCkgZm9yIHJlYWRpbmcNCiAg ICAgVE9NTCB2aWEgdGhlIGV4Y2VsbGVudCBsaWJyYXJ5IFtPdG9tbF0NCg0KICDigKIgKnlvY2Ft bF9tdXN0YWNoZSogcHJvdmlkZXMgYSBjb252ZW5pZW50IEFQSSAodmlhIFlPQ2FtbCkgZm9yIHVz aW5nDQogICAgIFtNdXN0YWNoZV0gYXMgYSB0ZW1wbGF0ZSBsYW5ndWFnZSB2aWEgdGhlIGV4Y2Vs bGVudCBsaWJyYXJ5DQogICAgIFtvY2FtbC1tdXN0YWNoZV0NCg0KICDigKIgKnlvY2FtbF9qaW5n b28qIHByb3ZpZGVzIGEgY29udmVuaWVudCBBUEkgKHZpYSBZT0NhbWwpIGZvciB1c2luZw0KICAg ICBbSmluZ29vXSBhcyBhIHRlbXBsYXRlIGxhbmd1YWdlIHZpYSB0aGUgZXhjZWxsZW50IGxpYnJh cnkgW2ppbmdvb10NCg0KICDigKIgKnlvY2FtbF9zeW5kaWNhdGlvbiogdGhhdCBnaXZlcyB0b29s IHRvIGdlbmVyYXRlIGZlZWRzDQogICAgIChbQXRvbV0oPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9y Zy93aWtpL0F0b21fKHdlYl9zdGFuZGFyZCk+KSwgW1JTU10NCiAgICAgMSBhbmQgMiBhbmQgW09Q TUxdKS4gVGhlIGxpYnJhcnkgaXMgaW5zcGlyZWQgYnkgW1N5bmRpY10gYnV0IGRvZXMNCiAgICAg bm90IGRlcGVuZCBkaXJlY3RseSBvbiBpdC4NCg0KDQogIFtjbWFya2l0XSA8aHR0cHM6Ly9naXRo dWIuY29tL2RidWVuemxpL2NtYXJraXQ+DQoNCiAgW09NRF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vbWQ+DQoNCiAgW29jYW1sLXlhbWxdIDxodHRwczovL2dpdGh1Yi5jb20vYXZzbS9vY2Ft bC15YW1sPg0KDQogIFtPdG9tbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kbWJhdHVyaW4vb3RvbWw+ DQoNCiAgW011c3RhY2hlXSA8aHR0cHM6Ly9tdXN0YWNoZS5naXRodWIuaW8vPg0KDQogIFtvY2Ft bC1tdXN0YWNoZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yZ3JpbmJlcmcvb2NhbWwtbXVzdGFjaGU+ DQoNCiAgW0ppbmdvb10gPGh0dHA6Ly90YXRlZ2FraWJ1bmtvLmdpdGh1Yi5pby9qaW5nb28vPg0K DQogIFtqaW5nb29dIDxodHRwczovL2dpdGh1Yi5jb20vdGF0ZWdha2lidW5rby9qaW5nb28+DQoN CiAgW1JTU10gPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1JTUz4NCg0KICBbT1BNTF0g PGh0dHBzOi8vb3BtbC5vcmcvPg0KDQogIFtTeW5kaWNdIDxodHRwczovL2dpdGh1Yi5jb20vQ3Vt dWx1cy9TeW5kaWM+DQoNCg0KQSBmaW5hbCB3b3JkDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBZT0NhbWwgMiB3YXMgbWFpbmx5IHdyaXR0ZW4gYnkgW3hodG1sYm9p XSwgaGVscGVkIGJ5IFtnci1pbV0sIFttc3B3bl0NCiAgYW5kIFtkaW5vc2F1cmVdIHdpdGggb2Nj YXNpb25hbCBzdXBwb3J0IGZyb20gW21haXN0ZV0uIEl0IGhhcyBhbHJlYWR5DQogIGJlZW4gdXNl ZCBleHBlcmltZW50YWxseSBpbiBhIG51bWJlciBvZiBzbWFsbCBwcm9qZWN0czoNCg0KICDigKIg W1JpbmcubXVob2thbWFdIGEgdmVyeSBzbWFsbCB3ZWJyaW5nIC0gW3NvdXJjZXNdDQogIOKAoiBb TWFpc3RlLmZyXSAtIFtzb3VyY2VzXQ0KICDigKIgW2dyLWltLmdpdGh1Yi5pb10gLSBbc291cmNl c10NCg0KICBZb3Ugd2lsbCBhbHNvIGZpbmQgZXh0ZW5zaXZlbHkgZG9jdW1lbnRlZCBleGFtcGxl cyBpbiB0aGUgW2V4YW1wbGVzXQ0KICBkaXJlY3RvcnkuDQoNCiAgVG8gY29uY2x1ZGUsIHdlIGZp bmQgKG5vdCB2ZXJ5IG9iamVjdGl2ZWx5KSB0aGF0IFlPQ2FtbCBpcyBhIGxvdCBvZg0KICBmdW4g dG8gdXNlLCBhbmQgaXQncyB2ZXJ5IGNvb2wgdG8gbWFrZSB5b3VyIHNpdGUgdXNpbmcgYXMgbXVj aCBPQ2FtbA0KICBhcyBwb3NzaWJsZS4NCg0KICBIYXBweSBIYWNraW5nIQ0KDQogIOKAoiBbWW9j YW1sIG9uIE9QQU1dDQogIOKAoiBbRGV2IHJlcG9zaXRvcnldDQoNCg0KW3hodG1sYm9pXSA8aHR0 cHM6Ly9naXRodWIuY29tL3hodG1sYm9pPg0KDQpbZ3ItaW1dIDxodHRwczovL2dpdGh1Yi5jb20v Z3ItaW0+DQoNClttc3B3bl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9tc3B3bj4NCg0KW2Rpbm9zYXVy ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmU+DQoNClttYWlzdGVdIDxodHRwczovL2dp dGh1Yi5jb20vbWFpc3RlPg0KDQpbUmluZy5tdWhva2FtYV0gPGh0dHBzOi8vcmluZy5tdWhva2Ft YS5mdW4+DQoNCltzb3VyY2VzXSA8aHR0cHM6Ly9naXRodWIuY29tL211aG9rYW1hL3Jpbmc+DQoN CltNYWlzdGUuZnJdIDxodHRwczovL21haXN0ZS5mcj4NCg0KW3NvdXJjZXNdIDxodHRwczovL2dp dGh1Yi5jb20vbWFpc3RlL21haXN0ZS5mcj4NCg0KW2dyLWltLmdpdGh1Yi5pb10gPGh0dHBzOi8v Z3ItaW0uZ2l0aHViLmlvPg0KDQpbc291cmNlc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9nci1pbS9z aXRlPg0KDQpbZXhhbXBsZXNdIDxodHRwczovL2dpdGh1Yi5jb20veGh0bWxib2kveW9jYW1sL3Ry ZWUvbWFpbi9leGFtcGxlcz4NCg0KW1lvY2FtbCBvbiBPUEFNXSA8aHR0cHM6Ly9vY2FtbC5vcmcv cC95b2NhbWwvbGF0ZXN0Pg0KDQpbRGV2IHJlcG9zaXRvcnldIDxodHRwczovL2dpdGh1Yi5jb20v eGh0bWxib2kveW9jYW1sPg0KDQoNCm9lcHViIDAuMS4wIDogQSBsaWJyYXJ5IHRvIHBhcnNlIGVw dWIgZmlsZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLW9lcHViLTAtMS0wLWEtbGlicmFyeS10by1wYXJzZS1lcHViLWZp bGVzLzE1Mzk0LzE+DQoNCg0KRXJ1RXJpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBodW1ibHkgYW5ub3VuY2Ugb2VwdWIg YSBzbWFsbCBsaWJyYXJ5IHRvIHBhcnNlIGVwdWIgZmlsZXMgYW5kIHRvDQogIHNvbWUgZXh0ZW5k IGNyZWF0ZSBhIGxpc3Qgb2YgY2hhcHRlcnMgZnJvbSB0aGUgZXB1YiBhcmNoaXZlLg0KDQogIFlv dSBjYW4gZmluZCB0aGUgcmVwb3NpdG9yeSBhdCBbQ29kZWJlcmcgLSBPZXB1Yl0NCg0KDQpbQ29k ZWJlcmcgLSBPZXB1Yl0gPGh0dHBzOi8vY29kZWJlcmcub3JnL0VydUVyaS9vZXB1Yj4NCg0KDQpw cHhfZGVyaXZpbmdfcm91dGVyIOKAlCB0eXBlIHNhZmUgcm91dGluZyBmb3IgRHJlYW0gYW5kIE1l bGFuZ2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLXBweC1kZXJpdmluZy1yb3V0ZXItdHlwZS1zYWZlLXJvdXRpbmctZm9yLWRy ZWFtLWFuZC1tZWxhbmdlLzE1NDAxLzE+DQoNCg0KQW5kcmV5IFBvcHAgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIGEgbmV3IHBweCBmb3IgZGVyaXZp bmcgW0RyZWFtXSByb3V0ZXJzDQogIGJhc2VkIG9uIHZhcmlhbnQgdHlwZSBkZWNsYXJhdGlvbnMs IFtwcHhfZGVyaXZpbmdfcm91dGVyXS4NCg0KICBBIHNtYWxsIGV4YW1wbGUuIEZpcnN0IHdlIGRl ZmluZSByb3V0ZXMgKHRoZSBzaWduYXR1cmUgc2hvd2Nhc2VzIHRoZQ0KICBnZW5lcmF0ZWQgY29k ZSk6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbW9kdWxlIFBhZ2VzIDogc2lnDQogIOKUgiAg IC4uLg0KICDilIIgDQogIOKUgiAgIHZhbCBocmVmIDogdCAtPiBzdHJpbmcNCiAg4pSCICAgKCoq IGdlbmVyYXRlIFVSTCBmcm9tIHRoZSByb3V0ZSAqKQ0KICDilIIgDQogIOKUgiAgIHZhbCBodHRw X21ldGhvZCA6IHQgLT4gWyBgREVMRVRFIHwgYEdFVCB8IGBQT1NUIHwgYFBVVCBdDQogIOKUgiAg ICgqKiBIVFRQIG1ldGhvZCBmb3IgdGhlIHJvdXRlICopDQogIOKUgiANCiAg4pSCICAgdmFsIGhh bmRsZSA6ICh0IC0+IERyZWFtLmhhbmRsZXIpIC0+IERyZWFtLmhhbmRsZXINCiAg4pSCICAgKCoq IGNyZWF0ZSBhIHJvdXRlIGhhbmRsZXIgKikNCiAg4pSCIGVuZCA9IHN0cnVjdA0KICDilIIgICBv cGVuIFBweF9kZXJpdmluZ19yb3V0ZXJfcnVudGltZS5QcmltaXRpdmVzDQogIOKUgiANCiAg4pSC ICAgdHlwZSB0ID0NCiAg4pSCICAgICB8IEhvbWUgW0BHRVQgIi8iXQ0KICDilIIgICAgIHwgQWJv dXQNCiAg4pSCICAgICB8IEhlbGxvIG9mIHsgbmFtZSA6IHN0cmluZzsgcmVwZWF0IDogaW50IG9w dGlvbiB9IFtAR0VUICIvaGVsbG8vOm5hbWUiXQ0KICDilIIgICAgIFtAQGRlcml2aW5nIHJvdXRl cl0NCiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0KICBUaGVuIHdlIGRlc2NyaWJlIGhv dyB3ZSBoYW5kbGUgZWFjaCByb3V0ZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgaGFu ZGxlID0NCiAg4pSCICAgUGFnZXMuaGFuZGxlIChmdW4gcm91dGUgX3JlcSAtPg0KICDilIIgICAg ICAgbWF0Y2ggcm91dGUgd2l0aA0KICDilIIgICAgICAgfCBIb21lIC0+IERyZWFtLnJlc3BvbmQg IkhvbWUgcGFnZSEiDQogIOKUgiAgICAgICB8IEFib3V0IC0+IERyZWFtLnJlc3BvbmQgIkFib3V0 IHBhZ2UhIg0KICDilIIgICAgICAgfCBIZWxsbyB7IG5hbWU7IHJlcGVhdCB9IC0+DQogIOKUgiAg ICAgICAgICAgbGV0IG5hbWUgPQ0KICDilIIgICAgICAgICAgICAgbWF0Y2ggcmVwZWF0IHdpdGgN CiAg4pSCICAgICAgICAgICAgIHwgU29tZSByZXBlYXQgLT4NCiAg4pSCICAgICAgICAgICAgICAg ICBMaXN0LmluaXQgcmVwZWF0IChmdW4gXyAtPiBuYW1lKSB8PiBTdHJpbmcuY29uY2F0ICIsICIN CiAg4pSCICAgICAgICAgICAgIHwgTm9uZSAtPiBuYW1lDQogIOKUgiAgICAgICAgICAgaW4NCiAg 4pSCICAgICAgICAgICBEcmVhbS5yZXNwb25kIChQcmludGYuc3ByaW50ZiAiSGVsbG8sICVzIiBu YW1lKSkNCiAg4pSCIA0KICDilIIgbGV0ICgpID0gRHJlYW0ucnVuIH5pbnRlcmZhY2U6IjEyNy4w LjAuMSIgfnBvcnQ6ODA4MCBoYW5kbGUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVXNpbmcgZ2Vu ZXJhdGVkIGBQYWdlcy5ocmVmJyBmdW5jdGlvbiB3ZSBjYW4gZ2VuZXJhdGUgVVJMcyBmb3Igcm91 dGVzOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCAoKSA9DQogIOKUgiAgIGFzc2VydCAo UGFnZXMuaHJlZiBIb21lID0gIi8iKTsNCiAg4pSCICAgYXNzZXJ0IChQYWdlcy5ocmVmIEFib3V0 ID0gIi9hYm91dCIpOw0KICDilIIgICBhc3NlcnQgKFBhZ2VzLmhyZWYgKEhlbGxvIHsgbmFtZSA9 ICJ3b3JsZCI7IHJlcGVhdCA9IE5vbmUgfSkgPSAiL2hlbGxvL3dvcmxkIik7DQogIOKUgiAgIGFz c2VydCAoUGFnZXMuaHJlZiAoSGVsbG8geyBuYW1lID0gIndvcmxkIjsgcmVwZWF0ID0gU29tZSAz IH0pID0gIi9oZWxsby93b3JsZD9yZXBlYXQ9MyIpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBVUkwgbWF0Y2hpbmcgaXMgZG9uZSBieSBbcm91dGVzXSBsaWJyYXJ5Lg0KDQogIFRoZXJlJ3Mg YWxzbyBzdXBwb3J0IGZvciBbcm91dGVzIHRoYXQgdHJhY2sgdGhlaXIgcmVzcG9uc2UgdHlwZXNd IGFuZA0KICB0aGUgcHB4IGF1dG9tYXRpY2FsbHkgZGVyaXZlcyBKU09OIGVuY29kZXJzIGFuZCBk ZWNvZGVycyBmb3IgdGhlbSAoYnkNCiAgdXNpbmcgW21lbGFuZ2UtanNvbi5wcHhdKS4NCg0KICBP biB0b3Agb2YgdGhhdCBhIFtzZXBhcmF0ZSBwcHggaXMgcHJvdmlkZWRdIGZvciBbTWVsYW5nZV0g d2hpY2ggYWxsb3dzDQogIHRvIGNvbnN0cnVjdCB0eXBlIHNhZmUgSFRUUCBjbGllbnRzIChyb3V0 ZSBkZWZpbnRpb25zIGFyZSBzaGFyZWQNCiAgYmV0d2VlbiBzZXJ2ZXIgYW5kIGNsaWVudCkuDQoN CiAgSGFwcHkgaGFja2luZyENCg0KDQpbRHJlYW1dIDxodHRwczovL2FhbnRyb24uZ2l0aHViLmlv L2RyZWFtLz4NCg0KW3BweF9kZXJpdmluZ19yb3V0ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Fu ZHJleXBvcHAvcHB4X2Rlcml2aW5nX3JvdXRlcj4NCg0KW3JvdXRlc10gPGh0dHBzOi8vYW51cmFn c29uaS5naXRodWIuaW8vcm91dGVzLz4NCg0KW3JvdXRlcyB0aGF0IHRyYWNrIHRoZWlyIHJlc3Bv bnNlIHR5cGVzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyZXlwb3BwL3BweF9kZXJpdmluZ19y b3V0ZXIjcm91dGVzLXdpdGgtdHlwZWQtcmVzcG9uc2VzPg0KDQpbbWVsYW5nZS1qc29uLnBweF0N CjxodHRwczovL2dpdGh1Yi5jb20vbWVsYW5nZS1jb21tdW5pdHkvbWVsYW5nZS1qc29uP3RhYj1y ZWFkbWUtb3YtZmlsZSNwcHgtZm9yLW1lbGFuZ2U+DQoNCltzZXBhcmF0ZSBwcHggaXMgcHJvdmlk ZWRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2FuZHJleXBvcHAvcHB4X2Rlcml2aW5nX3JvdXRlciN1 c2luZy13aXRoLW1lbGFuZ2U+DQoNCltNZWxhbmdlXSA8aHR0cHM6Ly9tZWxhbmdlLnJlLz4NCg0K DQpNaWNhLCBhIFBQWCB0aGF0IGF1dG9tYXRlcyBkaWZmZXJlbnRpYWwgdGVzdGluZyBmb3IgT0Nh bWwgbW9kdWxlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWljYS1hLXBweC10aGF0LWF1dG9tYXRlcy1k aWZmZXJlbnRpYWwtdGVzdGluZy1mb3Itb2NhbWwtbW9kdWxlcy8xNTQwNi8xPg0KDQoNCkVybmVz dCBOZyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBkZWxpZ2h0ZWQgdG8gYW5ub3VuY2UgdGhlIGluaXRp YWwgcmVsZWFzZSBvZiBbTWljYV0sIGEgUFBYIGRlcml2ZXINCiAgdGhhdCBhdXRvbWF0ZXMgZGlm ZmVyZW50aWFsIHRlc3RpbmcgZm9yIGEgcGFpciBvZiBPQ2FtbCBtb2R1bGVzDQogIGltcGxlbWVu dGluZyB0aGUgc2FtZSBzaWduYXR1cmUuIFVzZXJzIGFubm90YXRlIG1vZHVsZSBzaWduYXR1cmVz IHdpdGgNCiAgdGhlIGRpcmVjdGl2ZSBgW0BAZGVyaXZpbmcgbWljYV0nLCBhbmQgYXQgY29tcGls ZS10aW1lLCBNaWNhIGRlcml2ZXMNCiAgc3BlY2lhbGl6ZWQgW3Byb3BlcnR5LWJhc2VkIHRlc3Rp bmddIChQQlQpIGNvZGUgdGhhdCBjaGVja3MgaWYgdHdvDQogIG1vZHVsZXMgaW1wbGVtZW50aW5n IHRoZSBzaWduYXR1cmUgYXJlIG9ic2VydmF0aW9uYWxseQ0KICBlcXVpdmFsZW50LiAoVW5kZXIg dGhlIGhvb2QsIE1pY2EgdXNlcyBKYW5lIFN0cmVldCdzDQogIFtgQ29yZS5RdWlja2NoZWNrJ10g UEJUIGxpYnJhcnkuKQ0KDQogIE1pY2Egd2FzIHByZXNlbnRlZCBhdCB0aGUgT0NhbWwgV29ya3No b3AgJzI0IChbcGFwZXJdKSBhbmQgdGhlIElDRlANCiAgJzIzIFN0dWRlbnQgUmVzZWFyY2ggQ29t cGV0aXRpb24gKFtwb3N0ZXJdKS4NCg0KICAqTm90ZSo6IE1pY2EgaXMgY3VycmVudGx5IGEgcmVz ZWFyY2ggdG9vbCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGluDQogICBwcm9kdWN0aW9uIGNvZGUs IGFsdGhvdWdoIGNvbnRyaWJ1dGlvbnMgYXJlIHZlcnkgd2VsY29tZSENCg0KICBNaWNhIGlzIGF2 YWlsYWJsZSBvbiBPcGFtOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlIA0K ICDilIIgb3BhbSBpbnN0YWxsIHBweF9taWNhDQogIOKUlOKUgOKUgOKUgOKUgA0KICAoT0NhbWwg NS4xIG9yIG5ld2VyIGlzIHJlcXVpcmVkLikNCg0KICBEb2NzIGFyZSBhdmFpbGFibGUgW2hlcmVd LCBhbmQgYSBzaW1wbGUgd2ViIGFwcCBkZW1vLWluZyBNaWNhIGlzDQogIGF2YWlsYWJsZSBbaGVy ZV0uDQoNCg0KW01pY2FdIDxodHRwczovL2dpdGh1Yi5jb20vbmdlcm5lc3QvbWljYT4NCg0KW3By b3BlcnR5LWJhc2VkIHRlc3RpbmddIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PXFt QTlxaGFFQ2NFPg0KDQpbYENvcmUuUXVpY2tjaGVjayddIDxodHRwczovL2Jsb2cuamFuZXN0cmVl dC5jb20vcXVpY2tjaGVjay1mb3ItY29yZS8+DQoNCltwYXBlcl0gPGh0dHBzOi8vYXJ4aXYub3Jn L2Ficy8yNDA4LjE0NTYxPg0KDQpbcG9zdGVyXSA8aHR0cHM6Ly9uZ2VybmVzdC5naXRodWIuaW8v cGRmcy9taWNhX2ljZnAyM3NyY19wb3N0ZXIucGRmPg0KDQpbaGVyZV0gPGh0dHBzOi8vbmdlcm5l c3QuZ2l0aHViLmlvL21pY2EvcHB4X21pY2EvaW5kZXguaHRtbD4NCg0KW2hlcmVdIDxodHRwczov L25nZXJuZXN0LmdpdGh1Yi5pby9taWNhL2RlbW8uaHRtbD4NCg0KDQpTaW1wbGlmaWVkIEFuZHJv aWQgY3Jvc3MtY29tcGlsZXIgd2l0aCBEa01MDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zaW1wbGlmaWVkLWFuZHJvaWQt Y3Jvc3MtY29tcGlsZXItd2l0aC1ka21sLzE1NDA3LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNl ZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgRGtNTCBoYXMgaGFkIGEgY3Jvc3MtY29tcGlsZXIgZm9yIHllYXJzLCBidXQgSSBo YXZlIGNsZWFuZWQgaXQgdXAgc28NCiAgdGhhdCBpdCBpcyBtdWNoIGVhc2llciB0byB1c2UgZm9y IEFuZHJvaWQgZGV2ZWxvcGVycy4gSXQgKm5vdyB3b3Jrcw0KICB3aXRoIGEgcmVndWxhciBvcGFt IGluc3RhbGxhdGlvbiBpbiBhIGN1c3RvbSByZXBvc2l0b3J5Ki4gQWxzbw0KICBpbmNsdWRlZCBh cmUgcGF0Y2hlcyB0byB0aGUgT0NhbWwgY29tcGlsZXIgdG8gd29yayB3aXRoIEFuZHJvaWQgTkRL DQogIDIxKyAoY3VycmVudGx5IEdvb2dsZSBpcyBhdCBOREsgMjcpLg0KDQogIFRyeSBpdCBvdXQg aWYgeW91IGRvIEFuZHJvaWQgZGV2ZWxvcG1lbnQg4oCmIGp1c3QgY29weS1hbmQtcGFzdGUgdGhl DQogIGluc3RydWN0aW9ucyBiZWxvdyDigKYgYnV0IHBsZWFzZSByZWFkIHRoZSBub3RlcyBhbmQg Y2F1dGlvbnMgYmVsb3cuIEFuZA0KICBpZiB5b3UgYXJlIHN0aWxsIGludGVyZXN0ZWQgaW4gQW5k cm9pZCBkZXZlbG9wbWVudCwgdGVsbCBtZSBzbyBJIGNhbg0KICBkZWNpZGUgaWYgSSdsbCBtZXJn ZSB0aGUgcGFja2FnZXMgaW50byB0aGUgcmVndWxhciBvcGFtIHJlcG9zaXRvcnkuDQoNCiAgVHJp bW1lZCBzbGlnaHRseSBmcm9tIHRoZSBbZGttbC1jb21waWxlciBRdWljayBTdGFydF06DQoNCiAg 4oCiIERvY2tlciBjb250YWluZXIgaXMgdXNlZCBiZWxvdyBmb3IgV2luZG93cyBhbmQgbWFjT1Mg dXNlcnMsIGFuZA0KICAgIGJlY2F1c2UgaXQgaXMgZWFzeSB0byBnZXQgdGhlIEFuZHJvaWQgTkRL IGZyb20gQ2lyY2xlQ0kuDQogIOKAoiBBcHBsZSBTaWxpY29uIGRvZXMgbm90IHN1cHBvcnQgMzIt Yml0LiBUaGUgbmV0IGVmZmVjdCBpcyB0aGF0IEFwcGxlDQogICAgU2lsaWNvbiB1c2VycyBjYW5u b3QgY3Jvc3MtY29tcGlsZSBgYW5kcm9pZF9hcm0zMnY3YScuDQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAkIGRvY2tlciBydW4gLWl0IC0tcm0gY2ltZy9hbmRyb2lkOjIwMjQuMTAuMS1uZGsN CiAg4pSCIA0KICDilIIgIyBJbnN0YWxsIG9wYW0gaWYgeW91IGRvbid0IGhhdmUgaXQNCiAg4pSC IH4vcHJvamVjdCQgc3VkbyBhcHQtZ2V0IHVwZGF0ZSAmJiBzdWRvIGFwdC1nZXQgaW5zdGFsbCBi dWlsZC1lc3NlbnRpYWwgY3VybCBnaXQgcGF0Y2ggcnN5bmMgdW56aXAgLXkNCiAg4pSCIH4vcHJv amVjdCQgZWNobyAvdXNyL2xvY2FsL2JpbiB8IHN1ZG8gYmFzaCAtYyAic2ggPChjdXJsIC1mc1NM IGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvaW5zdGFsbC5zaCkgLS12ZXJzaW9uIDIuMi4xIg0KICDi lIIgDQogIOKUgiAjIEluaXRpYWxpemUgb3BhbSBpZiB5b3UgaGF2ZW4ndCBhbHJlYWR5LiBObyBz YW5kYm94aW5nIGlzIG5lZWRlZCBpbiBjb250YWluZXJzLg0KICDilIIgfi9wcm9qZWN0JCBvcGFt IGluaXQgLS1jbGk9Mi4xIC0tbm8tc2V0dXAgLS1iYXJlIC0tZGlzYWJsZS1zYW5kYm94aW5nDQog IOKUgiANCiAg4pSCICMgVHdvIEFuZHJvaWQgb3B0aW9ucyB0byBzZXQuIEFORFJPSURfUExBVEZP Uk0gaXMgdGhlIG1pbmltdW0gQVBJIGxldmVsICgidGFyZ2V0U2RrVmVyc2lvbiIgaW4gdGhlIEFu ZHJvaWQgbWFuaWZlc3QpDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gdmFyIC0tY2xpPTIuMSAtLWds b2JhbCBBTkRST0lEX05ESz0vaG9tZS9jaXJjbGVjaS9hbmRyb2lkLXNkay9uZGsvMjcuMS4xMjI5 NzAwNg0KICDilIIgfi9wcm9qZWN0JCBvcGFtIHZhciAtLWNsaT0yLjEgLS1nbG9iYWwgQU5EUk9J RF9QTEFURk9STT1hbmRyb2lkLTM0DQogIOKUgiANCiAg4pSCICMgUElDSyBPTkU6IEFuZHJvaWQg YXJtNjQtdjhhIHN3aXRjaA0KICDilIIgfi9wcm9qZWN0JCBvcGFtIHN3aXRjaCBjcmVhdGUgYW5k cm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLWNsaT0yLjEgXA0KICDilIIgICAtLXBhY2thZ2VzIGRr bWwtYmFzZS1jb21waWxlcixka21sLWhvc3QtYWJpLWxpbnV4X3g4Nl82NCxka21sLXRhcmdldC1h YmktYW5kcm9pZF9hcm02NHY4YSxvY2FtbGZpbmQsY29uZi1ka21sLWNyb3NzLXRvb2xjaGFpbiBc DQogIOKUgiAgIC0tcmVwb3MgZGVmYXVsdCxkaXNrdXYtNGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0 aHViLmNvbS9kaXNrdXYvZGlza3V2LW9wYW0tcmVwb3NpdG9yeS5naXQjNGQ3OWU3MzINCiAg4pSC IA0KICDilIIgIyBQSUNLIE9ORTogQW5kcm9pZCBhcm1lYWJpLXY3YSBzd2l0Y2guIFlvdSB3aWxs IG5lZWQgYSAzMi1iaXQgQy9DKysgY29tcGlsZXIuDQogIOKUgiB+L3Byb2plY3QkIHN1ZG8gYXB0 LWdldCBpbnN0YWxsIGdjYy1tdWx0aWxpYiBnKystbXVsdGlsaWIgLXkNCiAg4pSCIH4vcHJvamVj dCQgb3BhbSBzd2l0Y2ggY3JlYXRlIGFuZHJvaWQzNC1uZGsyNy1hcm1lYWJpLXY3YSAtLWNsaT0y LjEgXA0KICDilIIgICAtLXBhY2thZ2VzIGRrbWwtYmFzZS1jb21waWxlcixka21sLWhvc3QtYWJp LWxpbnV4X3g4Nixka21sLXRhcmdldC1hYmktYW5kcm9pZF9hcm0zMnY3YSxvY2FtbGZpbmQsY29u Zi1ka21sLWNyb3NzLXRvb2xjaGFpbiBcDQogIOKUgiAgIC0tcmVwb3MgZGVmYXVsdCxkaXNrdXYt NGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGlza3V2LW9wYW0tcmVwb3Np dG9yeS5naXQjNGQ3OWU3MzINCiAg4pSCIA0KICDilIIgIyBQSUNLIE9ORTogQW5kcm9pZCB4ODZf NjQgc3dpdGNoDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gc3dpdGNoIGNyZWF0ZSBhbmRyb2lkMzQt bmRrMjcteDg2XzY0IC0tY2xpPTIuMSBcDQogIOKUgiAgIC0tcGFja2FnZXMgZGttbC1iYXNlLWNv bXBpbGVyLGRrbWwtaG9zdC1hYmktbGludXhfeDg2XzY0LGRrbWwtdGFyZ2V0LWFiaS1hbmRyb2lk X3g4Nl82NCxvY2FtbGZpbmQsY29uZi1ka21sLWNyb3NzLXRvb2xjaGFpbiBcDQogIOKUgiAgIC0t cmVwb3MgZGVmYXVsdCxkaXNrdXYtNGQ3OWU3MzI9Z2l0K2h0dHBzOi8vZ2l0aHViLmNvbS9kaXNr dXYvZGlza3V2LW9wYW0tcmVwb3NpdG9yeS5naXQjNGQ3OWU3MzINCiAg4pSCIA0KICDilIIgIyBU SEVOOiBHZXQgYW5kIGNyb3NzLWNvbXBpbGUgeW91ciBzb3VyY2UgY29kZS4gSGVyZSB3ZSB1c2Ug RHVuZSBhbmQgYXNzdW1lICdhbmRyb2lkMzQtbmRrMjctYXJtNjQtdjhhJw0KICDilIIgfi9wcm9q ZWN0JCBvcGFtIGluc3RhbGwgLS1jbGk9Mi4xIC0tc3dpdGNoIGFuZHJvaWQzNC1uZGsyNy1hcm02 NC12OGEgZHVuZQ0KICDilIIgfi9wcm9qZWN0JCBnaXQgY2xvbmUgaHR0cHM6Ly9naXRodWIuY29t L2F2c20vaGVsbG8td29ybGQtYWN0aW9uLW9jYW1sIGhlbGxvDQogIOKUgiB+L3Byb2plY3QkIGNk IGhlbGxvDQogIOKUgiB+L3Byb2plY3QvaGVsbG8kIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0 Y2ggYW5kcm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIGR1bmUgYnVpbGQgLXgg YW5kcm9pZF9hcm02NHY4YSB3b3JsZC5leGUNCiAg4pSCIA0KICDilIIgfi9wcm9qZWN0L2hlbGxv JCBmaWxlIF9idWlsZC9kZWZhdWx0Ki93b3JsZC5leGUNCiAg4pSCIF9idWlsZC9kZWZhdWx0LmFu ZHJvaWRfYXJtNjR2OGEvd29ybGQuZXhlOiBFTEYgNjQtYml0IExTQiBwaWUgZXhlY3V0YWJsZSwg QVJNIGFhcmNoNjQsIHZlcnNpb24gMSAoU1lTViksIGR5bmFtaWNhbGx5IGxpbmtlZCwgaW50ZXJw cmV0ZXIgL3N5c3RlbS9iaW4vbGlua2VyNjQsIHdpdGggZGVidWdfaW5mbywgbm90IHN0cmlwcGVk DQogIOKUgiBfYnVpbGQvZGVmYXVsdC93b3JsZC5leGU6ICAgICAgICAgICAgICAgICAgRUxGIDY0 LWJpdCBMU0IgcGllIGV4ZWN1dGFibGUsIHg4Ni02NCwgdmVyc2lvbiAxIChTWVNWKSwgZHluYW1p Y2FsbHkgbGlua2VkLCBpbnRlcnByZXRlciAvbGliNjQvbGQtbGludXgteDg2LTY0LnNvLjIsIEJ1 aWxkSURbc2hhMV09MTczMWFkOWNlMGZkZWZmNjlkZjI4YWYwYjEyMTdlODQzZWFiZTI2ZSwgZm9y IEdOVS9MaW51eCAzLjIuMCwgd2l0aCBkZWJ1Z19pbmZvLCBub3Qgc3RyaXBwZWQNCiAg4pSCIA0K ICDilIIgIyBZb3UgY2FuIGFsc28gZGlyZWN0bHkgdXNlIHRoZSBvY2FtbGZpbmQgLXRvb2xjaGFp bg0KICDilIIgDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0Y2gg YW5kcm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIG9jYW1sZmluZCBvY2FtbGMg LWNvbmZpZy12YXIgbmF0aXZlX2NfY29tcGlsZXINCiAg4pSCIGdjYyAtTzIgLWZuby1zdHJpY3Qt YWxpYXNpbmcgLWZ3cmFwdiAtcHRocmVhZCAtZlBJQyAgLURfRklMRV9PRkZTRVRfQklUUz02NA0K ICDilIIgDQogIOKUgiB+L3Byb2plY3QkIG9wYW0gZXhlYyAtLWNsaT0yLjEgLS1zd2l0Y2ggYW5k cm9pZDM0LW5kazI3LWFybTY0LXY4YSAtLSBcDQogIOKUgiAgIG9jYW1sZmluZCAtdG9vbGNoYWlu IGFuZHJvaWRfYXJtNjR2OGEgb2NhbWxjIC1jb25maWctdmFyIG5hdGl2ZV9jX2NvbXBpbGVyDQog IOKUgiAvaG9tZS9jaXJjbGVjaS9hbmRyb2lkLXNkay9uZGsvMjcuMS4xMjI5NzAwNi90b29sY2hh aW5zL2xsdm0vcHJlYnVpbHQvbGludXgteDg2XzY0L2Jpbi9hYXJjaDY0LWxpbnV4LWFuZHJvaWQz NC1jbGFuZyAtTzIgLWZuby1zdHJpY3QtYWxpYXNpbmcgLWZ3cmFwdiAtcHRocmVhZCAtZlBJQyAg LURfRklMRV9PRkZTRVRfQklUUz02NA0KICDilJTilIDilIDilIDilIANCg0KICBEa01MIHN1cHBv cnRzIHRocmVlIG91dCBvZiB0aGUgZm91ciBzdXBwb3J0ZWQgQW5kcm9pZCBBQklzLiBUaGUgdGhy ZWUNCiAgQUJJcyAoYWxsIGJ1dCBgeDg2Jykgd2VyZSBjaG9zZW4gYmFzZWQgb24gW3N0YXRpc3Rp Y3MgZm9yIGEgbGFyZ2UgZ2FtZQ0KICBvbiBBdWcgMjksIDIwMjNdOg0KDQogIOKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0K ICAgQXJjaCAgICAgICAgIFBlcmNlbnQgDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KICAgYXJtNjQtdjhhICAgICAg NjguNjYgDQogICBhcm1lYWJpLXY3YSAgICAzMC4zOCANCiAgIHg4Nl82NCAgICAgICAgICAwLjcx IA0KICAgeDg2ICAgICAgICAgICAgIDAuMjYgDQogIOKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKU geKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgeKUgQ0KDQogIGFuZCBhbHNvIFtH b29nbGUncyByZWNvbW1lbmRhdGlvbl06DQoNCiAgKk5vdGUqOiBXaGlsZSA2NC1iaXQtb25seSBk ZXZpY2VzIHdpbGwgZ3JvdyBpbiBwb3B1bGFyaXR5IHdpdGggcGhvbmVzDQogICBqb2luaW5nIEFu ZHJvaWQgQXV0byBpbiB0aGlzIGdyb3VwLCAzMi1iaXQtb25seSBkZXZpY2VzIHdpbGwgY29udGlu dWUNCiAgIHRvIGJlIGltcG9ydGFudCBmb3IgQW5kcm9pZCBHbywgQW5kcm9pZCBUViwgYW5kIEFu ZHJvaWQgV2Vhci4gUGxlYXNlDQogICBjb250aW51ZSBzdXBwb3J0aW5nIDMyLWJpdCBBQklzOyBH b29nbGUgUGxheSB3aWxsIGNvbnRpbnVlIHNlcnZpbmcNCiAgIDMyLWJpdCBhcHBzIHRvIDMyLWJp dC1vbmx5IGRldmljZXMuDQoNCiAgRmluYWxseSwgYSB3b3JkIG9mICpDQVVUSU9OKi4gVGhlIEFu ZHJvaWQgY3Jvc3MtY29tcGlsZXIgL2NhbiBuZXZlci8NCiAgdXNlIE9DYW1sIDUrIGJlY2F1c2Ug W09DYW1sIDUgd2lsbCBuZXZlciBicmluZyBiYWNrIHRoZSAzMi1iaXQNCiAgaW5zdHJ1Y3Rpb24g c2V0XS4gVGhhdCBtZWFucyBpZiB5b3UgZG9uJ3Qgd2FudCB0byBkcm9wIGEgbGFyZ2UgcGVyY2Vu dA0KICBvZiB5b3VyIHVzZXJzIG9yIGRyb3AgbmV3IEFuZHJvaWQgY2F0ZWdvcmllcyBvdmVyIHRo ZSBuZXh0IGZpdmUgKD8pDQogIHllYXJzLCB5b3Ugd2lsbCBoYXZlIGEgY3JpdGljYWwgZGVwZW5k ZW5jeSBvbiBEa01MLg0KDQoNCltka21sLWNvbXBpbGVyIFF1aWNrIFN0YXJ0XQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9kaXNrdXYvZGttbC1jb21waWxlcj90YWI9cmVhZG1lLW92LWZpbGUjcXVpY2st c3RhcnQ+DQoNCltzdGF0aXN0aWNzIGZvciBhIGxhcmdlIGdhbWUgb24gQXVnIDI5LCAyMDIzXQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9hbmRyb2lkL25kay9pc3N1ZXMvMTc3MiNpc3N1ZWNvbW1lbnQt MTY5NzgzMTUxOD4NCg0KW0dvb2dsZSdzIHJlY29tbWVuZGF0aW9uXQ0KPGh0dHBzOi8vYW5kcm9p ZC1kZXZlbG9wZXJzLmdvb2dsZWJsb2cuY29tLzIwMjIvMTAvNjQtYml0LW9ubHktZGV2aWNlcy5o dG1sPg0KDQpbT0NhbWwgNSB3aWxsIG5ldmVyIGJyaW5nIGJhY2sgdGhlIDMyLWJpdCBpbnN0cnVj dGlvbiBzZXRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90LzMyLWJpdC1uYXRpdmUtY29k ZS1zdXBwb3J0LWZvci1vY2FtbC01LzEyNTgzLzEzP3U9amJlY2tmb3JkPg0KDQoNCk90aGVyIE9D YW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUg bGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcN CiAgYmxvZ10uDQoNCiAg4oCiIFtEZXZlbG9wZXIgZWR1Y2F0aW9uIGF0IEphbmUgU3RyZWV0XQ0K ICDigKIgW1NvbHZpbmcgUHV6emxlcyBpbiBQcm9kdWN0aW9uIHdpdGggTGlvcmEgRnJpZWRiZXJn XQ0KICDigKIgW01ldEFjc2wgdjAuNyBmb3IgRnJhbWEtQyAyOS4wfiBDb3BwZXJdDQogIOKAoiBb SW50cm9kdWNpbmcgdGhlIER1bmUgRGV2ZWxvcGVyIFByZXZpZXc6IEEgTmV3IEVyYSBmb3IgT0Nh bWwNCiAgICBEZXZlbG9wbWVudF0NCiAg4oCiIFtVbmxvY2sgeW91ciBUZWFt4oCZcyBQb3RlbnRp YWwgd2l0aCBFeHBlcnQgVHJhaW5pbmcgaW4gT0NhbWwsDQogICAgQ3liZXJzZWN1cml0eSBGdW5k YW1lbnRhbHMsIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIGFuZCBNb3JlXQ0KICDigKIgW0FsdC1F cmdvIDIuNiBpcyBPdXQhXQ0KICDigKIgW0hhcHB5IGV5ZWJhbGxzPyFdDQoNCg0KW3RoZSBvY2Ft bC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbRGV2ZWxvcGVyIGVkdWNh dGlvbiBhdCBKYW5lIFN0cmVldF0NCjxodHRwczovL2Jsb2cuamFuZXN0cmVldC5jb20vZGV2ZWxv cGVyLWVkdWNhdGlvbi1hdC1qYW5lLXN0cmVldC1pbmRleC8+DQoNCltTb2x2aW5nIFB1enpsZXMg aW4gUHJvZHVjdGlvbiB3aXRoIExpb3JhIEZyaWVkYmVyZ10NCjxodHRwczovL3NpZ25hbHMtdGhy ZWFkcy5zaW1wbGVjYXN0LmNvbS9lcGlzb2Rlcy9zb2x2aW5nLXB1enpsZXMtaW4tcHJvZHVjdGlv bi13aXRoLWxpb3JhLWZyaWVkYmVyZy1kazZ2WW5LMj4NCg0KW01ldEFjc2wgdjAuNyBmb3IgRnJh bWEtQyAyOS4wfiBDb3BwZXJdDQo8aHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy1wbHVnaW5zL21ldGFj c2wuaHRtbD4NCg0KW0ludHJvZHVjaW5nIHRoZSBEdW5lIERldmVsb3BlciBQcmV2aWV3OiBBIE5l dyBFcmEgZm9yIE9DYW1sDQpEZXZlbG9wbWVudF0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyNC0xMC0wMy1pbnRyb2R1Y2luZy10aGUtZHVuZS1kZXZlbG9wZXItcHJldmlldy1hLW5ldy1l cmEtZm9yLW9jYW1sLWRldmVsb3BtZW50Pg0KDQpbVW5sb2NrIHlvdXIgVGVhbeKAmXMgUG90ZW50 aWFsIHdpdGggRXhwZXJ0IFRyYWluaW5nIGluIE9DYW1sLA0KQ3liZXJzZWN1cml0eSBGdW5kYW1l bnRhbHMsIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcsIGFuZCBNb3JlXQ0KPGh0dHBzOi8vdGFyaWRl cy5jb20vYmxvZy8yMDI0LTEwLTAxLXVubG9jay15b3VyLXRlYW0tcy1wb3RlbnRpYWwtd2l0aC1l eHBlcnQtdHJhaW5pbmctaW4tb2NhbWwtY3liZXJzZWN1cml0eS1mdW5kYW1lbnRhbHMtZnVuY3Rp b25hbC1wcm9ncmFtbWluZy1hbmQtbW9yZT4NCg0KW0FsdC1FcmdvIDIuNiBpcyBPdXQhXQ0KPGh0 dHBzOi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAyNF8wOV8wMV9hbHRfZXJnb18yXzZfMF9yZWxlYXNl ZD4NCg0KW0hhcHB5IGV5ZWJhbGxzPyFdIDxodHRwczovL2Jsb2cub3NhdS5yZS9hcnRpY2xlcy9o YXBweV9leWViYWxscy5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3Nh Z2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhl IGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5 b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1 YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Pg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoN CltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1w YS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 01 to 08, 202= 4.

    Releases of fpath-sexplib0, fpath-base, loc, file-rewriter, se= xps-rewriter and provider

    Mathieu Barbin announced

    I wanted to announce the initial release of 6 utility packages to the opam-= repository. They are dependencies to some other ongoing projects I have, pe= rhaps some will find them useful.

    These are very early days for this software. Please feel welcome to opening= issues or discussions tickets if you are inclined.

    Thank you @mseri , @avsm & @shonfeder for your help in making these lib= raries available!

    Below you'll find short descriptions with links to the packages home pages.= Thank you!

    Fpath_sexplib0 only d= epends on fpath and sexplib0. It defines a single= module, Fpath_sexplib0, which is designed to be opened to sha= dow the Fpath module to add small helpers and a sexp_of<= /code> serializer to it. The package also introduces three new modules to t= he scope: Fpart, Absolute_path and Relative= _path to increase type-safety when manipulating paths that are known= to be relative or absolute.

    Fpath_base further ex= tends fpath-sexplib0 and adds a dependency on base. It is desi= gned to be compatible with Base-style containers such as Map, = Set, Hashtbl, Hash_set.

    Loc is an OCaml library to m= anipulate code locations, which are ranges of lexing positions from a parse= d file.

    File_rewriter is a= n OCaml library for applying small rewrites to tweak or refactor your files= . It provides a convenient interface to apply surgical textual substitution= s on the fly, while navigating the contents of a file through an abstract r= epresentation containing code locations.

    Sexps_rewriter is = a specialized version of the file-rewriter library dedicated t= o rewriting sexp files, such as dune config files.

    Provider is an OCaml li= brary for creating Traits and Interfaces. It allows you to define the funct= ionality needed by a library without committing to a specific implementatio= n - in essence : dynamic dispatch. Provider is a pattern featured in the Eio project (Eio.Resource). I wanted to make it reu= sable in other projects - in particular I am currently using it as the para= metrization story of vcs. This package had already been availa= ble for a little while already but was still unannounced.

    Build a project without Stdlib

    Mikhail announced

    I decided to experiment with compiling a project without the standard libra= ry. Why? I don't know. But I could save ~50K. Just sharing my note about it.

    You can find an example in my repository.

    I found the -nostdlib and -nopervasives (undocume= nted) flags and after a lot of trying I was able to do what I wanted. It do= esn't disable absolutely everything (lists and other types like optio= n are available).

    (flags
      :standard
      -nostdlib
      -nopervasives
      ; add runtime
      -cclib
      -lasmrun
      -ccopt
      "-L %{ocaml_where}"
      -ccopt
      "-lm -ldl")
    
    (* stdlib.=
    ml *)
    external print_endline : string -> unit =3D "caml_print_endline" [@@noalloc]
    
    (* main.ml *)
    open Stdlib
    let () =3D print_=
    endline "hello from my stdlib"
    

    Hello World program:

      with Stdlib without Stdlib
    size 349K 302K

    obatcher: Framework for building efficient concurrent services=

    Lee Koon Wen announced

    Hot on the heels of the paper "Concurrent Data Structures Made= Easy" appearing at OOPSLA 2024= on the 24th October, I'm pleased to announce release of obatcher - = a picos compatible library for implementin= g efficient batched services in OCaml.

    obatcher proposes a new way to approach the design and implem= entation of concurrent services. It's key benefits are:

    • Incremental optimization and parallelism of services
    • Easy to control and reason about concurrency
    • Retains atomic-style interface with your services while batching happen= s implicitly
    • Thread-safety for cheap!

    Available on opam today, install with

    opam install obatcher
    

    For more details, check out the source and README on GitHub: obatcher.

    Feedback, contributions, and discussions are welcome!

    DBLP query program and library

    Samuel Mimram announced

    I am happy to announce the first realease of ocaml-dblp, which provides both a program and a lib= rary to query the DBLP bibliographic data= base. In practice, it is mostly useful for retrieving bibtex entries with c= ommands such as

    dblp bibtex girard locus solum
    

    which will spit out

    @article{DBLP:journals/mscs/Girard01,
      author       =3D {Jean{-}Yves Gira=
    rd},
      title        =3D {Locus Solum: Fro=
    m the rules of logic to the logic of rules},
      journal      =3D {Math. Struct. Co=
    mput. Sci.},
      volume       =3D {11},
      number       =3D {3},
      pages        =3D {301--506},
      year         =3D {2001},
      url          =3D {https://doi.org/10.1017/S096012=
    950100336X},
      doi          =3D {10.1017/S096012950100336X},
      timestamp    =3D {Wed, 01 Apr 2020=
     08:48:47 +0200},
      biburl       =3D {https://dblp.org=
    /rec/journals/mscs/Girard01.bib},
      bibsource    =3D {dblp computer sc=
    ience bibliography, https://dblp.org}
    }
    

    (or, even better, use dblp bib to directly add this at the end= of the .bib file in the current directory).

    It might still need some polishing, feel free to reach out if you encounter= some problems.

    cudajit: Bindings to the cuda and nvrtc libraries

    Lukasz Stafiniak announced

    cudajit 0.5.0 is now available in the opam repository. It's organized into = modules, and it adds support for CUDA events.

    YOCaml, a framework for static site generator

    Xavier Van de Woestyne announced

    :wave: Hello everyone! We, the YOCaml development team, are very pleased to= announce the release of version 2, freshly merged into opam-repository :champagne:!=20

    YOCaml is a framework for describing static site generators (a very = small applicative build-system whose API is tailor-made for creating web pa= ges ) and its internal model is very similar to Hakyll (the 3th version), another Haskell framework. (a p= resentation was given to the OCaml user Group in Paris and you can find the= video, in French, here).

    Changes with 1.0.0

    Historically, YOCaml was written very, very quickly to give examples of sli= ghtly exotic uses of the library Preface. Due to its experimental nature, the API was a bit laborious, = but we did find some users! We took advantage of the redesign to stop relyi= ng on Preface (and yes, YOCaml was already more widely used than Preface), = move to OCaml 5.x and take advantage of user-defi= ned-effects and support dynamic dependencies. In other words, YOCaml= 2.0.0 is not at all compatible with version 1…

    Plugins and runtimes

    The aim of YOCaml is to be very generic and to allow users to bring their o= wn dependencies, but we've taken the opportunity to release it with several= plugins and runtimes so that it can be used directly.

    • Runtimes

      A Runtime is an =E2=80=98execution context=E2=80=99 and generally exposes t= he primitive used to execute a YOCaml program. YOCaml 2 is bundled with 3 R= untimes:

      • Yocaml_unix: the default runtime, whose preview server is implem= ented on top of the brand new httpcats!
      • Yocaml_eio: a runtime iso to Unix but based on eio and whose preview server is descr= ibed by cohttp_eio.<= /li>
      • Yocaml_git: a parameterised runtime for generating a site direct= ly in a git repository, which can be served, for example, by a Mirage (unipi), very well documented in this excellent article by @dinosaure!
    • Plugins
      • Yocaml_cmarkit provides a convenient API (via YOCaml) for conver= ting Markdown files to HTML via the excellent cmarkit library.
      • Yocaml_omd provides a convenient API (via YOCaml) for converting= Markdown files to HTML via the excellent OMD library (but we recommend yocaml_cmarkit).
      • yocaml_yaml provides a convenient API (via YOCaml) for reading Y= aml via the excellent library ocaml-yaml
      • yocaml_otoml provides a convenient API (for YOCaml) for reading = TOML via the excellent library Otoml
      • yocaml_mustache provides a convenient API (via YOCaml) for using= Mustache as a template languag= e via the excellent library ocaml-mustache
      • yocaml_jingoo provides a convenient API (via YOCaml) for using <= a href=3D"http://tategakibunko.github.io/jingoo/">Jingoo as a template = language via the excellent library jingoo
      • yocaml_syndication that gives tool to generate feeds ([Atom](https://en.wikip= edia.org/wiki/Atom_(web_standard)), RSS 1 and 2 and OPML). The= library is inspired by Syndi= c but does not depend directly on it.

    A final word

    YOCaml 2 was mainly written by xhtm= lboi, helped by gr-im, mspwn and dinosaure with occasional support from maiste. It has already been used experimentally in a nu= mber of small projects:

    You will also find extensively documented examples in the examples directory.

    To conclude, we find (not very objectively) that YOCaml is a lot of fun to = use, and it's very cool to make your site using as much OCaml as possible.= =20

    Happy Hacking!

    oepub 0.1.0 : A library to parse epub files

    EruEri announced

    I humbly announce oepub a small library to parse epub files and to some ext= end create a list of chapters from the epub archive.

    You can find the repository at Codeberg - Oepub

    ppx_deriving_router =E2=80=94 type safe routing for Dream and = Melange

    Andrey Popp announced

    It's my pleasure to announce a new ppx for deriving Dream routers based on variant type declarations,= ppx_deriving= _router.

    A small example. First we define routes (the signature showcases the genera= ted code):

    module Pages : sig
      ...
    
      val href : t -> string
      (** generate URL from=
     the route *)
    
      val http_method : t -> [ `DELETE | `GET | `POST | `PUT ]
      (** HTTP method for t=
    he route *)
    
      val handle : (t -> Dream.handler) -> Dream.handler
      (** create a route ha=
    ndler *)
    end =3D struct
      open Ppx_deriving_router_runtime.Primitives
    
      type t =3D
        | Home [@GET "/"]
        | About
        | Hello of { name : st=
    ring; repeat : int option } [@GET "/hello/:name"]
        [@@deriving router]
    end
    

    Then we describe how we handle each route:

    let handle =3D
      Pages.handle (fun r=
    oute _req ->
          match route=
     with
          | Home -> Dream.respond "Home page!"
          | About -> Dream.respond "About page!"
          | Hello { name; repeat } ->
              let name =3D
                match=
     repeat with
                | So=
    me repeat ->
                    List.init repeat (fun _ -> name) |>=
     String.concat ", "
                | No=
    ne -> name
              in
              Dream.respond (Printf.sprintf =
    "Hello, %s" name))
    
    let () =3D Dream.run =
    ~interface:"127.0.0.1" ~port:8080 handle
    

    Using generated Pages.href function we can generate URLs for r= outes:

    let () =3D
      assert (Pages.href Home =3D =
    "/");
      assert (Pages.href About =3D "/about");
      assert (Pages.href (Hello { name =3D "world"; repeat =3D None }) =3D "/he=
    llo/world");
      assert (Pages.href (Hello { name =3D "world"; repeat =3D Some 3 }) =3D "/=
    hello/world?repeat=3D3")
    

    The URL matching is done by routes library.

    There's also support for routes that track their response ty= pes and the ppx automatically derives JSON encoders and decoders for th= em (by using melange-json.ppx).

    On top of that a separate ppx is provided for Melange which allows to construct type safe HTTP clients (= route defintions are shared between server and client).

    Happy hacking!

    Mica, a PPX that automates differential testing for OCaml modu= les

    Ernest Ng announced

    I'm delighted to announce the initial release of Mica, a PPX deriver that automates differential test= ing for a pair of OCaml modules implementing the same signature. Users anno= tate module signatures with the directive [@@deriving mica], a= nd at compile-time, Mica derives specialized property-based testing (PBT) code that chec= ks if two modules implementing the signature are observationally equivalent= . (Under the hood, Mica uses Jane Street's Core.Quickcheck PBT library.)

    Mica was presented at the OCaml Workshop '24 (paper) and the ICFP '23 Student Research Competition (<= a href=3D"https://ngernest.github.io/pdfs/mica_icfp23src_poster.pdf">poster= ).=20

    Note: Mica is currently a research tool and should not be used in pr= oduction code, although contributions are very welcome!

    Mica is available on Opam:=20

    opam update=20
    opam install ppx_mica
    

    (OCaml 5.1 or newer is required.)

    Docs are available here, and a simple web app demo-ing Mica is available here.

    Simplified Android cross-compiler with DkML

    jbeckford announced

    DkML has had a cross-compiler for years, but I have cleaned it up so that i= t is much easier to use for Android developers. It now works with a regu= lar opam installation in a custom repository. Also included are patches= to the OCaml compiler to work with Android NDK 21+ (currently Google is at= NDK 27).

    Try it out if you do Android development … just copy-and-paste the i= nstructions below … but please read the notes and cautions below. An= d if you are still interested in Android development, tell me so I can deci= de if I'll merge the packages into the regular opam repository.

    Trimmed slightly from the dkml-compiler Quick Start:

    • Docker container is used below for Windows and macOS users, and because= it is easy to get the Android NDK from CircleCI.
    • Apple Silicon does not support 32-bit. The net effect is that Apple Sil= icon users cannot cross-compile android_arm32v7a.
    $ docker run -it --rm cimg/android:2024.10.1-ndk
    
    # Install opam if you don't have it
    ~/project$ sudo apt-get update && sudo apt-get install build-essent=
    ial curl git patch rsync unzip -y
    ~/project$ echo /usr/local/bin | sudo bash -c "sh <(curl -fsSL https://o=
    pam.ocaml.org/install.sh) --version 2.2.1"
    
    # Initialize opam if you haven't already. No sandboxing is needed in contai=
    ners.
    ~/project$ opam init --cli=3D2.1 --no-setup --bare --disable-sandboxing
    
    # Two Android options to set. ANDROID_PLATFORM is the minimum API level ("t=
    argetSdkVersion" in the Android manifest)
    ~/project$ opam var --cli=3D2.1 --global ANDROID_NDK=3D/home/circleci/andro=
    id-sdk/ndk/27.1.12297006
    ~/project$ opam var --cli=3D2.1 --global ANDROID_PLATFORM=3Dandroid-34
    
    # PICK ONE: Android arm64-v8a switch
    ~/project$ opam switch create android34-ndk27-arm64-v8a --cli=3D2.1 \
      --packages dkml-base-compiler,dkml-host-abi-linux_x86_64,dkml-target-abi-=
    android_arm64v8a,ocamlfind,conf-dkml-cross-toolchain \
      --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
    am-repository.git#4d79e732
    
    # PICK ONE: Android armeabi-v7a switch. You will need a 32-bit C/C++ compil=
    er.
    ~/project$ sudo apt-get install gcc-multilib g++-multilib -y
    ~/project$ opam switch create android34-ndk27-armeabi-v7a --cli=3D2.1 \
      --packages dkml-base-compiler,dkml-host-abi-linux_x86,dkml-target-abi-and=
    roid_arm32v7a,ocamlfind,conf-dkml-cross-toolchain \
      --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
    am-repository.git#4d79e732
    
    # PICK ONE: Android x86_64 switch
    ~/project$ opam switch create android34-ndk27-x86_64 --cli=3D2.1 \
      --packages dkml-base-compiler,dkml-host-abi-linux_x86_64,dkml-target-abi-=
    android_x86_64,ocamlfind,conf-dkml-cross-toolchain \
      --repos default,diskuv-4d79e732=3Dgit+https://github.com/diskuv/diskuv-op=
    am-repository.git#4d79e732
    
    # THEN: Get and cross-compile your source code. Here we use Dune and assume=
     'android34-ndk27-arm64-v8a'
    ~/project$ opam install --cli=3D2.1 --switch android34-ndk27-arm64-v8a dune
    ~/project$ git clone https://github.com/avsm/hello-world-action-ocaml hello
    ~/project$ cd hello
    ~/project/hello$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -=
    - \
      dune build -x android_arm64v8a world.exe
    
    ~/project/hello$ file _build/default*/world.exe
    _build/default.android_arm64v8a/world.exe: ELF 64-bit LSB pie executable, A=
    RM aarch64, version 1 (SYSV), dynamically linked, interpreter /system/bin/l=
    inker64, with debug_info, not stripped
    _build/default/world.exe:                  ELF 64-bit LSB pie executable, x=
    86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x8=
    6-64.so.2, BuildID[sha1]=3D1731ad9ce0fdeff69df28af0b1217e843eabe26e, for GN=
    U/Linux 3.2.0, with debug_info, not stripped
    
    # You can also directly use the ocamlfind -toolchain
    
    ~/project$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -- \
      ocamlfind ocamlc -config-var native_c_compiler
    gcc -O2 -fno-strict-aliasing -fwrapv -pthread -fPIC  -D_FILE_OFFSET_BITS=3D=
    64
    
    ~/project$ opam exec --cli=3D2.1 --switch android34-ndk27-arm64-v8a -- \
      ocamlfind -toolchain android_arm64v8a ocamlc -config-var native_c_compiler
    /home/circleci/android-sdk/ndk/27.1.12297006/toolchains/llvm/prebuilt/linux=
    -x86_64/bin/aarch64-linux-android34-clang -O2 -fno-strict-aliasing -fwrapv =
    -pthread -fPIC  -D_FILE_OFFSET_BITS=3D64
    

    DkML supports three out of the four supported Android ABIs. The three ABIs = (all but x86) were chosen based on statistics for a large = game on Aug 29, 2023:

    Arch Percent
    arm64-v8a 68.66
    armeabi-v7a 30.38
    x86_64 0.71
    x86 0.26

    and also Google's recommendation:

    Note: While 64-bit-only devices will grow in popularity with phones = joining Android Auto in this group, 32-bit-only devices will continue to be= important for Android Go, Android TV, and Android Wear. Please continue su= pporting 32-bit ABIs; Google Play will continue serving 32-bit apps to 32-b= it-only devices.

    Finally, a word of CAUTION. The Android cross-compiler can never<= /i> use OCaml 5+ because OCaml 5 will never brin= g back the 32-bit instruction set. That means if you don't want to drop= a large percent of your users or drop new Android categories over the next= five (?) years, you will have a critical dependency on DkML.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=nstawc1C; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=i8oAG41s; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 65513B80123 for ; Tue, 15 Oct 2024 14:31:19 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=e8M2y754lG2weC7ctP7D9tZC5CVsK1vFcOAbF35Khz8=; b=nstawc1CAN6H6kST7dwJw/gMFKibl0zmQxhc2MrvD9XaZHEBIWz/oyTv 2V+R8RaUtWfNTL4g+r/2b9HZa/Y7G0aX5Ax5kHA0Xn7DlV1ArP+Z/Y+ij oadBbfyWTfkyaGp0SunKh9lhFcdbt41V+28lgKQ7KJzvmJytIz8cXtIXO A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,205,1725314400"; d="scan'208,217";a="188955262" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 15 Oct 2024 15:31:18 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 0ADC9E0D18; Tue, 15 Oct 2024 15:31:18 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C410BE004E for ; Tue, 15 Oct 2024 15:31:14 +0200 (CEST) IronPort-SDR: 670e6ea0_eHFQiseOXa8PHFOncl0dN7+hgJ6JX5g3JmiZiU81XTny8AT Q4N8zyJ8MZrUT+XI1kr9S7jPLcdS2hyA1/mSQhA== X-IPAS-Result: =?us-ascii?q?A0G5AQD7bA5njyIeaIFagliBQVsoGQFjWjMHCEiEVoNPj?= =?us-ascii?q?iCcQ4J7AxgWBR4UAQMBDS4BBQ0BAgQBAQMBAgGFABiKDAIfBgEEMwYOAQIEA?= =?us-ascii?q?QEBAQMCAwEBAQEBAQgBAQUBAQECAQECBAYBAhABAQEBAQE5BUmFew2CRhkUA?= =?us-ascii?q?SNxYQQDBgYBAQEBAQEBAQEnAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIMATADawkKEwEBMgYYIwMUAQYDAgQNATUDARMBE?= =?us-ascii?q?hqCD1gBgmQDBQwGkgWbSXqBMoEBggwBAQaBCD4CAQsCAgMPLgHaBoFjCYEwG?= =?us-ascii?q?IVqgkgaASpIaoRIhDwnD4FVRIEVNYFzUW+CFCsLFwIBAQEXgSQBAQhEAYMug?= =?us-ascii?q?mmGHE0IgnaCW2yBCS8WDYMAgSlmAQqCCVcPggISQg6BRIE9fCWBIxCFboEMg?= =?us-ascii?q?ROBb4IXgy8YiUSBR0szIRMBVRMXCwkFZIYLgkaDJoIUhBCFJYFnCWCHZYFpg?= =?us-ascii?q?T6BWUeCckqFO4EGOYIWak43Ag0CN4IkJFyCUYNbgWQYHUADC209NRQbq14ED?= =?us-ascii?q?SkBgVoBRoFPNw44CDxMBQEHDAgKBAIiLgQEDhUWChkmCgQbAi0IAw0rAgOSO?= =?us-ascii?q?BQlA49djhCUWjQHhB2BXQYMiQOBJJV2hVukcSKYVSKJVoElCV+BDmqVTzmFG?= =?us-ascii?q?4F9JDyBIDMaMEMNDIJOCQo8HA+OLRaDWIE+gSaBdTuCbb8qQTUCAQE3AgcBC?= =?us-ascii?q?gEBAwmFYgEBhxBuXQEB?= IronPort-PHdr: A9a23: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 HgwDXA3FQb0sA== IronPort-Data: A9a23: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 vRAI5TzOahdFH1s5Q== IronPort-HdrOrdr: A9a23:1rmyyKusX2TnkWooTjfBm29v7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: 9a23:oTOrs29nndMjbZ8UfYqVvwlJA5oneVLl91jBcxODAmtYZJe3FkDFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3AKocWGg+6wp4t01h5ss+86DSQf95FxYGKEx0Tqrk?= =?us-ascii?q?5upSWZQthPhrA1g3iFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,205,1725314400"; d="scan'208,217";a="99160372" X-MGA-submission: =?us-ascii?q?MDEO+gngMb1hcRA7E5nDM0kxRL4uTCQAWTxvkc?= =?us-ascii?q?hX6SUCuYzAQkC7xb8PcpEAKlfDU3oVRd2E2lB4uZGCp0PynQ/TNfZSN5?= =?us-ascii?q?k0nW5tXTQ7TRzasCMtS0aLVdbP8C58/1ikmdm0kC1i3qo9fhww/l9ilK?= =?us-ascii?q?HYSdKrg3RG+0wPuzc77OoMxg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Oct 2024 15:31:13 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5D3C5564A5C; Tue, 15 Oct 2024 15:31:11 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1728999071; bh=taPCKdKNhoHan7MXXGtjvyA1j4OwGaNW4vqPn5r2ky8=; h=From:To:Subject:Date:Message-ID; b=i8oAG41s3BiE8aGc02WJ5GzE71fa7IAWc39tBn9837GW0/Y5mY1o/MU+NdLrRGH6h PWJuWg9X8kjK+vQvPh/MV5P4oeQOPYObeWE7kAGtnX23W1ReFoatGbLgLuXF9M1oy3 6FJuAgZXArkSkBJBByIb3YrX6924VrhBx5joq6rk= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 15 Oct 2024 15:31:11 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 15 15:31:11 2024 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499997, queueID=97DC9564A5E X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19187 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAwOCB0byAxNSwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KZ3JlcF9j bXQ6IHN0cnVjdHVyYWwgc2VhcmNoIG9mIE9DYW1sIGNvZGUNCk11dGFtbCAwLjENCm9jYW1sLWFj dGl2aXR5cHViDQpPcnRhYy9RQ2hlY2stU1RNIDAuNC4wIER5bmFtaWMgZm9ybWFsIHZlcmlmaWNh dGlvbiBiZXlvbmQgb25lIHN5c3RlbSB1bmRlciB0ZXN0DQpPcGVuYnNkIDEuMA0KQ29tcHNvcnQg LSByZW9yZGVyIGZpbGVzIGluIGFyY2hpdmVzIGZvciBpbXByb3ZlZCBjb21wcmVzc2lvbg0KRHVu ZSBkZXYgbWVldGluZw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCmdyZXBfY210OiBz dHJ1Y3R1cmFsIHNlYXJjaCBvZiBPQ2FtbCBjb2RlDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wb2MtZ3JlcC1jbXQtc3RydWN0dXJh bC1zZWFyY2gtb2Ytb2NhbWwtY29kZS8xNTQxMS8xPg0KDQoNCk5pY29sYXMgT2plZGEgQmFyIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQXMgbWVudGlvbmVkIGluIGEg cHJldmlvdXMgcG9zdDoNCg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi0ybmQt ZWRpdG9yLXRvb2xpbmctZGV2LW1lZXRpbmctMjV0aC1vZi1qdWx5LzE0OTUzLzU/dT1ub2piPg0K DQogIEkgaGFkIHByb21pc2VkIHRvIHBvc3QgYmFjayBoZXJlIHdoZW4gd2UgaGFkIG1hZGUgdGhl IHNvdXJjZSBjb2RlIGZvcg0KICB0aGUgInN0cnVjdHVyYWwgZ3JlcCIgdG9vbCB0aGF0IEkgcHJl c2VudGVkLCBwdWJsaWMuDQoNCiAgVGhpcyBpcyBub3cgZG9uZToNCg0KICA8aHR0cHM6Ly9naXRo dWIuY29tL0xleGlGaS9ncmVwX2NtdD4NCg0KICBXZSBhZGRlZCBhIGBbUE9DXScgbWFya2VyIHRv IHRoaXMgcG9zdCwgYmVjYXVzZSB0aGUgY29kZSBpcyBub3QgcmVhbGx5DQogIHJlYWR5IGZvciBw dWJsaWMgY29uc3VtcHRpb24gKGl0IGlzIHJvdWdoIGFyb3VuZCB0aGUgZWRnZXMgYW5kIG1heSBu b3QNCiAgd29yayBpbiBhbGwgY2lyY3Vtc3RhbmNlcykuIE91ciBob3BlIGlzIHRvIHB1YmxpY2l6 ZSB0aGUgYXBwcm9hY2ggYW5kDQogIHBlcmhhcHMgbW90aXZhdGUgaW50ZXJlc3RlZCBoYWNrZXJz IHRvIHRha2UgdGhlIGNvZGUgYW5kIGRldmVsb3AgaXQNCiAgZnVydGhlciBpbnRvIGEgcHJvcGVy IHRvb2wuDQoNCg0KTXV0YW1sIDAuMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbXV0YW1sLTAtMS8x MjYzOS8yPg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ J20gaGFwcHkgdG8gc2hhcmUgbmV3cyBvZiB0aGUgTXV0YW1sIDAuMyByZWxlYXNlISA6dGFkYToN CiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9qbWlkL211dGFtbC9yZWxlYXNlcy90YWcvMC4zPg0KDQog IFRvZ2V0aGVyIHdpdGggdGhlIHJlY2VudCAwLjIgcmVsZWFzZSwgdGhpcyBicmluZ3MgTXV0YW1s IHVwIHRvIHNwZWVkDQogIHdpdGggcmVjZW50IHBweGxpYiByZWxlYXNlcyBhbmQgYWRkcmVzc2Vz IGEgZmV3IGlzc3VlcyByZXBvcnRlZCBieQ0KICBicmF2ZSwgZWFybHkgdXNlcnM6DQoNCiAg4oCi IEF2b2lkIG11dGF0aW9ucyBpbiBhdHRyaWJ1dGUgcGFyYW1ldGVycyAjMjkNCiAg4oCiIEF2b2lk IHBvbHltb3JwaGljIGVxdWFsaXR5IHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIENvcmUgIzMw DQogIOKAoiBBZGQgc3VwcG9ydCBmb3IgcHB4bGliLjAuMjggYW5kIGFib3ZlICMyNw0KICDigKIg QXZvaWQgdHJpZ2dlcmluZyAyIG11dGF0aW9ucyBvZiBhIHBhdHRlcm4gaW5jbC4gYSBgd2hlbict Y2xhdXNlDQogICAgY2F1c2luZyBhIHJlZHVuZGFudCBzdWItcGF0dGVybiB3YXJuaW5nICMyMiwg IzIzDQoNCiAgSGFwcHkgdGVzdGluZyEgOnNtaWxleToNCg0KDQpvY2FtbC1hY3Rpdml0eXB1Yg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtYWN0aXZpdHlw dWIvMTU0MjAvMT4NCg0KDQpab2dneSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBnbGFkIHRvIGFubm91bmNlIGEgZmlyc3Qg cmVsZWFzZSBvZiBgYWN0aXZpdHlwdWIqJyBwYWNrYWdlcywNCiAgaW1wbGVtZW50aW5nICh3ZWxs LCB0cnlpbmcgdG8gaW1wbGVtZW50IHNvbWUgZmxhdm9yIG9mKSBib3RoDQogIFtzZXJ2ZXItdG8t c2VydmVyXSBhbmQgW2NsaWVudC10by1zZXJ2ZXJdIGFjdGl2aXR5cHViIHByb3RvY29scy4NCg0K ICBEb2N1bWVudGF0aW9uIGlzIGF2YWlsYWJsZSBmcm9tIHRoZSBbd2ViIHNpdGVdLg0KDQogIFRo ZSBgYWN0aXZpdHlwdWJfc2VydmVyJyBwYWNrYWdlIGluc3RhbGxzIFtUQVBTXSwgYW4gZXhwZXJp bWVudGFsDQogIHNlcnZlciwgaGFuZGxpbmcgc29tZSBjb21tb24gYWN0aXZpdGllcy4gQWNjb3Vu dHMgaG9zdGVkIGJ5IHRoaXMNCiAgc2VydmVyIGNhbiBhdCBsZWFzdCBmb2xsb3cgYW5kIGJlIGZv bGxvd2VkIGJ5IG1hc3RvZG9uIGluc3RhbmNlcywgYW5kDQogIHBvc3QgYW5kIHJlY2VpdmUgYWN0 aXZpdGllcyAoQ3JlYXRlLCBBbm5vdW5jZSwgTGlrZSwgVW5kbywg4oCmKS4NCg0KICBUaGUgbGli cmFyeSBvZiB0aGUgYGFjdGl2aXR5cHViX2NsaWVudCcgcGFja2FnZSBjYW4gYmUgdXNlZCBieSBh DQogIGNsaWVudCBhcHBsaWNhdGlvbiB0byBwb3N0IGFuZCByZWNlaXZlIGFjdGl2aXRpZXMgdG8g YW5kIGZyb20gYSBzZXJ2ZXINCiAgKHRob3VnaCBpdCB3YXMgb25seSB0ZXN0ZWQgd2l0aCBUQVBT KS4gU2VlIGEgc2ltcGxlIGV4YW1wbGUgW2hlcmVdLg0KDQogIEEgR1VJIGNsaWVudCAoYmFzZWQg b24gW1N0a10gaXMgaW5zdGFsbGVkIGJ5IHRoZSBgYWN0aXZpdHlwdWJfZ3VpJw0KICBwYWNrYWdl LiBJdCByZXF1aXJlcyBhIGNsaWVudCBjb25maWd1cmF0aW9uIGZpbGUgYXMgZGVzY3JpYmVkDQog IFtoZXJlXS4gWW91IGNhbiBkcm9wIElSSXMvVVJMcyBvZiBhbiBhY3RvciBpbiB0aGUgd2luZG93 IHRvIG9wZW4gYSB0YWINCiAgYW5kIGJlIGFibGUgdG8gZm9sbG93IHRoaXMgYWN0b3IuIFRoZSBH VUkgYWxzbyBhbGxvd3MgdG8gY3JlYXRlIGFuZA0KICBwb3N0IG5vdGVzIHdpdGggYXR0YWNobWVu dHMuIFRoaXMgY2xpZW50IGlzIHN0aWxsIHZlcnkgZXhwZXJpbWVudGFsDQogIGFuZCB3aWxsIGJl IGRldmVsb3BlZCBtb3JlIGluIHRoZSBmdXR1cmUuDQoNCiAgRURJVDogdGhlIHBhY2thZ2Ugc2hv dWxkIGJlIGF2YWlsYWJsZSBzb29uIGluIG9wYW0uDQoNCg0KW3NlcnZlci10by1zZXJ2ZXJdDQo8 aHR0cHM6Ly93d3cudzMub3JnL1RSL2FjdGl2aXR5cHViLyNzZXJ2ZXItdG8tc2VydmVyLWludGVy YWN0aW9ucz4NCg0KW2NsaWVudC10by1zZXJ2ZXJdDQo8aHR0cHM6Ly93d3cudzMub3JnL1RSL2Fj dGl2aXR5cHViLyNjbGllbnQtdG8tc2VydmVyLWludGVyYWN0aW9ucz4NCg0KW3dlYiBzaXRlXSA8 aHR0cHM6Ly96b2dneS5mcmFtYS5pby9hY3Rpdml0eXB1Yi8+DQoNCltUQVBTXSA8aHR0cHM6Ly96 b2dneS5mcmFtYS5pby9hY3Rpdml0eXB1Yi9kb2MtdGFwcy5odG1sPg0KDQpbaGVyZV0gPGh0dHBz Oi8vem9nZ3kuZnJhbWEuaW8vYWN0aXZpdHlwdWIvZG9jLWNsaWVudC1leGFtcGxlLmh0bWw+DQoN CltTdGtdIDxodHRwczovL3pvZ2d5LmZyYW1hLmlvL29jYW1sLXN0ay8+DQoNCltoZXJlXQ0KPGh0 dHBzOi8vem9nZ3kuZnJhbWEuaW8vYWN0aXZpdHlwdWIvL3JlZmRvYy9hY3Rpdml0eXB1Yl9jbGll bnQvQWN0aXZpdHlwdWJfY2xpZW50L01haW4vaW5kZXguaHRtbD4NCg0KDQpPcnRhYy9RQ2hlY2st U1RNIDAuNC4wIER5bmFtaWMgZm9ybWFsIHZlcmlmaWNhdGlvbiBiZXlvbmQgb25lIHN5c3RlbSB1 bmRlciB0ZXN0DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1vcnRhYy1xY2hlY2stc3RtLTAtNC0wLWR5bmFtaWMtZm9ybWFsLXZlcmlm aWNhdGlvbi1iZXlvbmQtb25lLXN5c3RlbS11bmRlci10ZXN0LzE1NDI3LzE+DQoNCg0KTmljb2xh cyBPc2Jvcm5lIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSdtIHZlcnkgcGxl YXNlZCB0byBhbm5vdW5jZSB0aGlzIGV4Y2l0aW5nIG5ldyByZWxlYXNlIG9mDQogIGBvcnRhYy1x Y2hlY2stc3RtLjAuNC4wJyENCg0KICBUaGlzIG5ldyByZWxlYXNlIGJyaW5ncyBzb21lIGV4Y2l0 aW5nIG5ldyBmZWF0dXJlcywgbW9zdGx5IHRoZSByZXN1bHQNCiAgb2YgTmlrb2xhdXMgSHViZXIn cyBjb250cmlidXRpb25zISBUaGFuayB5b3UgTmlrIQ0KDQogIE9ydGFjL1FDaGVjay1TVE0gaXMg YSB0ZXN0IGdlbmVyYXRvciBiYXNlZCBvbiB0aGUgW1FDaGVjay1TVE1dDQogIG1vZGVsLWJhc2Vk IHRlc3RpbmcgZnJhbWV3b3JrIGFuZCB0aGUgW0dvc3BlbF0gc3BlY2lmaWNhdGlvbiBsYW5ndWFn ZQ0KICBmb3IgT0NhbWwuDQoNCiAgWW91IGNhbiBmaW5kIHRoZSBwcm9qZWN0IG9uIFt0aGlzIHJl cG9dIGFuZCBpbnN0YWxsIHRoZSByZWxlYXNlZA0KICBwYWNrYWdlcyB2aWEgYG9wYW0nLg0KDQog IEl0IGlzIGFsc28gZW5jb3VyYWdlIHRvIGluc3RhbGwgYG9ydGFjLWR1bmUnIHRvIGF2b2lkIGhh dmluZyB0byB3cml0ZQ0KICB0b28gbXVjaCBkdW5lIGJvaWxlcnBsYXRlLg0KDQogIEluIHBhcnRp Y3VsYXIsIHRoaXMgcmVsZWFzZSBleHRlbmQgT3J0YWMvUUNoZWNrLVNUTSBzbyB0aGF0IHRoZQ0K ICBnZW5lcmF0ZWQgdGVzdHMgd2lsbCBpbmNsdWRlIGZ1bmN0aW9ucyB0aGF0IGNhbiB0YWtlIG11 bHRpcGxlDQogIFN5c3RlbS1VbmRlci1UZXN0cyBhcyBhcmd1bWVudCBhbmQvb3IgdGhhdCBjYW4g cmV0dXJuIG9uZS4gU28gbm93LCBpZg0KICB3ZSB3cml0ZSBHb3NwZWwgc3BlY2lmaWNhdGlvbnMg Zm9yIGBhcHBlbmQnLWxpa2UgZnVuY3Rpb25zLA0KICBPcnRhYy9RQ2hlY2stU1RNIHdpbGwgaW5j bHVkZSB0aGVtIGluIHRoZSBnZW5lcmF0ZWQgdGVzdHMhDQoNCiAgSGFwcHkgdGVzdGluZyENCg0K DQpbUUNoZWNrLVNUTV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbXVsdGlj b3JldGVzdHM+DQoNCltHb3NwZWxdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZ29zcGVsL2dv c3BlbD4NCg0KW3RoaXMgcmVwb10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1nb3NwZWwvb3J0 YWM+DQoNCg0KT3BlbmJzZCAxLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wZW5ic2QtMS0w LzE1NDM0LzE+DQoNCg0KU2ViYXN0aWVuIE1hcmllIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSSB3b3VsZCBsaWtlIHRvIGFubm91bmNlIGEgbmV3IChzb21laG93IG5pY2hlKSBw YWNrYWdlIFtPcGVuYnNkXSwNCiAgd2hpY2ggcHJvdmlkZXMgYmluZGluZ3MgZm9yIHNvbWUgc3Bl Y2lmaWNzIE9wZW5CU0Qgc3lzY2FsbHMNCiAgW3BsZWRnZSgyKV0gYW5kIFt1bnZlaWwoMildLg0K DQogIFRoZXNlIHN5c2NhbGxzIGxldHMgdGhlIGtlcm5lbCBPUyB0byBrbm93IHdoYXQgdGhlIHJ1 bm5pbmcgcHJvY2Vzc3VzDQogIGlzIGV4cGVjdGVkIHRvIGRvLCBhbmQgc28gaXQgaXMgcG9zc2li bGUgdG8gcmVzdHJpY3QgYSBwcm9jZXNzdXMgdG8gZG8NCiAgb25seSBmaWxlc3lzdGVtIG9yIG9u bHkgbmV0d29yayBvciBvbmx5IHB1cmUgY29tcHV0YXRpb27igKYNCg0KICBUaGUgcGFja2FnZSBp cyBkZXNpZ25lZCB0byBiZSBpbnN0YWxsYWJsZSBvbiBhbnkgcGxhdGZvcm0gYW5kIHByb3ZpZGVz DQogIHNpbXBsZSBtZXRob2QgdG8gY2hlY2sgaWYgYFBsZWRnZScgb3IgYFVudmVpbCcgYXJlIHN1 cHBvcnRlZC4gVGhpcw0KICB3YXksIGl0IGlzIHBvc3NpYmxlIHRvIGVhc2lseSB3cml0ZSBwb3J0 YWJsZSBjb2RlIHVzaW5nIHRoZSBwYWNrYWdlLA0KICBhcyBpdCBjb3VsZCBiZSBhIHR1cm5lZCBv biAibm8tb3BlcmF0aW9uIiBvbiBXaW5kb3dzIG9yIExpbnV4IGhvc3RzDQogIChvciBwcm92aWRl cyBhbHRlcm5hdGl2ZSBjb2RlIHBhdGggZm9yIHNhbmRib3hpbmcpLg0KDQogIOKAoiBIb21lcGFn ZSA6IFtodHRwczovL2NvZGViZXJnLm9yZy9zZW1hcmllL29jYW1sLW9wZW5ic2QvXQ0KICDigKIg TGljZW5zZSA6IFtJU0NdDQogIOKAoiBEb2N1bWVudGVkIEludGVyZmFjZSA6IFtsaWIvb3BlbmJz ZC5tbGldDQoNCg0KW09wZW5ic2RdIDxodHRwczovL29jYW1sLm9yZy9wL29wZW5ic2QvbGF0ZXN0 Pg0KDQpbcGxlZGdlKDIpXSA8aHR0cHM6Ly9tYW4ub3BlbmJzZC5vcmcvcGxlZGdlLjI+DQoNClt1 bnZlaWwoMildIDxodHRwczovL21hbi5vcGVuYnNkLm9yZy91bnZlaWwuMj4NCg0KW2h0dHBzOi8v Y29kZWJlcmcub3JnL3NlbWFyaWUvb2NhbWwtb3BlbmJzZC9dDQo8aHR0cHM6Ly9jb2RlYmVyZy5v cmcvc2VtYXJpZS9vY2FtbC1vcGVuYnNkLz4NCg0KW0lTQ10gPGh0dHBzOi8vZW4ud2lraXBlZGlh Lm9yZy93aWtpL0lTQ19saWNlbnNlPg0KDQpbbGliL29wZW5ic2QubWxpXQ0KPGh0dHBzOi8vY29k ZWJlcmcub3JnL3NlbWFyaWUvb2NhbWwtb3BlbmJzZC9zcmMvdGFnLzEuMC9saWIvb3BlbmJzZC5t bGk+DQoNCkV4YW1wbGVzDQrilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDilIzilIDilIDi lIDilIANCiAg4pSCIGxldCBvcGVuIE9wZW5ic2QgaW4NCiAg4pSCIGlmIFBsZWRnZS5zdXBwb3J0 ZWQgdGhlbg0KICDilIIgICBQbGVkZ2UucHJvbWlzZXMgInN0ZGlvIHJwYXRoIg0KICDilJTilIDi lIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxldCBvcGVuIE9wZW5ic2QgaW4N CiAg4pSCIGlmIFVudmVpbC5zdXBwb3J0ZWQgdGhlbiAoDQogIOKUgiAgIFVudmVpbC5hZGQgIi4v bGliIiAiciI7DQogIOKUgiAgIFVudmVpbC5hZGQgIi4vbG9ncyIgInJ3YyI7DQogIOKUgiAgIFVu dmVpbC5sb2NrICgpKQ0KICDilJTilIDilIDilIDilIANCg0KDQpDb21wc29ydCAtIHJlb3JkZXIg ZmlsZXMgaW4gYXJjaGl2ZXMgZm9yIGltcHJvdmVkIGNvbXByZXNzaW9uDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1jb21wc29y dC1yZW9yZGVyLWZpbGVzLWluLWFyY2hpdmVzLWZvci1pbXByb3ZlZC1jb21wcmVzc2lvbi8xNTQz Ni8xPg0KDQoNCmFkcmllbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgZmlyc3Qg cmVsZWFzZSBvZiBjb21wc29ydCwgYSB0b29sIHRvIHJlb3JkZXINCiAgZmlsZXMgaW4gYW4gYXJj aGl2ZSBmb3IgYmV0dGVyIGNvbXByZXNzaW9uLiBJdCB3b3JrcyBieSBncm91cGluZyBmaWxlcw0K ICBhY2NvcmRpbmcgdG8gYSBkaXN0YW5jZSB0aGF0IGlzIGNvbXB1dGVkIGJldHdlZW4gZXZlcnkg ZmlsZSBwYWlyLiBZb3UNCiAgY2FuIGluc3RhbGwgaXQgd2l0aCBgb3BhbSBpbnN0YWxsIGNvbXBz b3J0JyAocmVxdWlyZXMgb2NhbWwgNS4yIGZvcg0KICBwYXJhbGxlbGlzbSkuDQoNCiAgV2Vic2l0 ZSB3aXRoIG1vcmUgZGV0YWlscyBhbmQgZXhhbXBsZXMgaW4gYFJFQURNRS5tZCcsIHBsdXMgc291 cmNlOg0KICA8aHR0cHM6Ly9naXRsYWIuY29tL2Fkcmllbi1uL2NvbXBzb3J0Lz4NCg0KICBUaGUg Z29hbCBpcyBub3QgbmV3IGJ1dCwgQUZBSUssIHRoZSBhcHByb2FjaCBpcy4gSSBhbSB2ZXJ5IGlu dGVyZXN0ZWQNCiAgaW4gcHJpb3Igb3IgcmVsYXRlZCBhcnQhDQoNCg0KUmVzdWx0cw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgQ29tcHNvcnQgYWNoaWV2ZXMgaW1wcm92ZW1lbnRzIHRoYXQg d291bGQgdHlwaWNhbGx5IHJlcXVpcmUgbGFyZ2VyDQogIGNvbXByZXNzaW9uIHdpbmRvd3MgYW5k IHRoZXJlZm9yZSBtb3JlIG1lbW9yeS4gVGhlIGltcHJvdmVtZW50cyBhcmUNCiAgb25seSBhIGZl dyBwZXJjZW50cyBidXQgaW4gdGhlIGRvbWFpbiBvZiBjb21wcmVzc2lvbiwgYSBmZXcgcGVyY2Vu dHMNCiAgaXMgYWN0dWFsbHkgYSBsb3QuDQoNCiAgV2l0aCBgeHonIGNvbXByZXNzaW9uLCBhIFVi dW50dSBpbml0cmQgb24gbXkgbWFjaGluZSBpcyByZWR1Y2VkIGJ5DQogIG1vcmUgdGhhbiAxMS41 JSwgd2hpbGUgdGhlIGJlc3QgYWNoaWV2YWJsZSBpbXByb3ZlbWVudCBpcyAxMi43JSAodGhlDQog IHJlb3JkZXJpbmcgZ2l2ZXMgOTAlIG9mIHRoZSBiZXN0IHJlc3VsdCkuIFNpbWlsYXJseSwgdGhl IHRyZWUgb2YNCiAgYGxpbnV4LWZpcm13YXJlLmdpdCcgY2FuIGJlIGNvbXByZXNzZWQgNiUgYmV0 dGVyLCB3aGlsZSB0aGUgYmVzdA0KICBhY2hpZXZhYmxlIGltcHJvdmVtZW50IGlzIDkuNCUgKHRo ZSByZW9yZGVyaW5nIGdpdmVzIDYzJSBvZiB0aGUgYmVzdA0KICByZXN1bHQpLg0KDQoNClZpc3Vh bGl6YXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICBJbiBvcmRlciB0byBiZXR0ZXIgZXhwbGFpbiB3aGF0IGl0IGRvZXMsIEkgcXVpdGUgbGlrZSB0 aGUNCiAgdmlzdWFsaXphdGlvbnMgSSBoYXZlIHNvIGZhciAodGhlcmUgd2lsbCBiZSBiZXR0ZXIg b25lcyBpbiB0aGUNCiAgZnV0dXJlKSwgd2hlcmUgdGhlIHZhbHVlIG9mIHRoZSBwaXhlbCBhdCBg KHgseSknIGluZGljYXRlcyBob3cgc2ltaWxhcg0KICBhcmUgZmlsZXMgYHgnIGFuZCBgeScuDQoN CiAgQmVmb3JlOg0KDQogIDxodHRwczovL2dpdGxhYi5jb20vYWRyaWVuLW4vY29tcHNvcnQvLS9y YXcvbWFpbi9kb2MvaW1nL2JldHRlcmNvbXBfcHl0aG9uMy1kamFuZ28taG9yaXpvbl9ub29wLnBu Zz4NCg0KICBBZnRlciByZW9yZGVyaW5nOg0KDQogIDxodHRwczovL2dpdGxhYi5jb20vYWRyaWVu LW4vY29tcHNvcnQvLS9yYXcvbWFpbi9kb2MvaW1nL2JldHRlcmNvbXBfcHl0aG9uMy1kamFuZ28t aG9yaXpvbl9idWNrZXRzLnBuZz4NCg0KICBGaWxlcyB0aGF0IGFyZSB2ZXJ5IGRpZmZlcmVudCBm cm9tIG90aGVycyBhcmUgYWxsIHBhY2tlZCBhdCB0aGUgZW5kDQogIGFuZCB0aGVyZSdzIGFsc28g YW4gaXNvbGF0ZWQgY2x1c3RlciBvZiBmaWxlcyB0b2dldGhlciBzaW1pbGFyIGJ1dA0KICBkaWZm ZXJlbnQgZnJvbSBldmVyeXRoaW5nIGVsc2UuICBPbmUgY2FuIGFsc28gc2VlIHRoYXQgdGhlIGRp c3RpbmN0DQogIHJvdyBhbmQgY29sdW1uIHBhdHRlcm4gZnJvbSB0aGUgZmlyc3QgcGljdHVyZSBo YXMgZGlzYXBwZWFyZWQ6IGl0DQogIGluZGljYXRlZCB0aGF0IGV2ZXJ5IDE1IG9yIHNvIGZpbGVz IGluIHRoYXQgcmVnaW9uIHdlcmUgc2ltaWxhciBhbmQNCiAgd2VyZSBzZXBhcmF0ZWQgYnkgZGlz aW1pbGFyIGZpbGVzIGJ1dCB0aGF0IHRoZXkncmUgbm93IGdyb3VwZWQuDQoNCiAgV2hpbGUgdGhl cmUgYXJlIGNlcnRhaW5seSBpbXByb3ZlbWVudHMgcG9zc2libGUsIHJlc3VsdHMgYXJlDQogIGdv b2QuIEl0J3MgYSBjYXNlIHdoZXJlIG9uZSBtaWdodCB3b25kZXIgd2h5IHJlc3VsdHMgYXJlIHNv IGdvb2QNCiAgY29uc2lkZXJpbmcgYWxsIHRoZSBhcHByb3hpbWF0aW9ucyB0aGF0IHRvb2sgcGxh Y2UuDQoNCiAgWzFdIE1vc3Qgb2YgdGhlIGFsZ29yaXRobXMvbGlicmFyaWVzIEkndmUgdHJpZWQg dG8gdXNlIHJlbHkgb24gaGF2aW5nDQogIGFuIGFjdHVhbCBwcm9wZXIgZGlzdGFuY2UgZnVuY3Rp b24gd2hpY2ggSSBkb24ndCBoYXZlDQoNCg0KRnV0dXJlIHdvcmsNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIEknbGwgdHJ5IHRvIGltcHJvdmUgdGhlIGRpc3RhbmNlIGZ1 bmN0aW9uLiBDdXJyZW50bHkgaXQgZG9lcyBzb21lDQogIHN0ZXBzIG9mIGNvbXByZXNzaW9uIGFs Z29yaXRobXMgdG8gZGV0ZWN0IHJlZHVuZGFuY2llcyBidXQgbWF5YmUNCiAgcmV1c2luZyBhIGNv bXByZXNzaW9uIGxpYnJhcnkgd291bGQgZ2l2ZSBiZXR0ZXIgcmVzdWx0cyBpZiBpdCBjYW4gYmUN CiAgbWFkZSBmYXN0IGVub3VnaCAobHo0IGlzIGJvcmRlcmxpbmUgYnV0IGl0IGhhcyB0aW55IGRp Y3Rpb25hcmllcw0KICB1bmZvcnR1bmF0ZWx5KS4NCg0KICBDbHVzdGVyaW5nIGNvdWxkIGJlIGJl dHRlciBhcyB0aGUgY3VycmVudCBhbGdvcml0aG0gaXMgdmVyeSBiYXNpYyAoaXQNCiAgY29sbGVj dHMgZmlsZXMgdGhhdCBhcmUgOTAlIHNpbWlsYXIsIHRoZW4gODAlIHNpbWlsYXIsIHRoZW4gNzAl LCDigKYpLiBJDQogIHRyaWVkIHNldmVyYWwgYWxnb3JpdGhtcyBidXQgSSBkb24ndCBoYXZlIGEg Z29vZC1lbm91Z2ggZGlzdGFuY2UNCiAgZnVuY3Rpb24gKGZvciBpbnN0YW5jZSB0aGUgdHJpYW5n dWxhciBpbmVxdWFsaXR5IHByb2JhYmx5IGRvZXNuJ3QNCiAgaG9sZCkgYW5kIHJlc3VsdHMgd2Vy ZSB3b3JzZS4NCg0KICBBbGwgdGhpcyB3aWxsIGJlbmVmaXQgZnJvbSBiZXR0ZXIgdmlzdWFsaXph dGlvbnMgYW5kIEknZCBsaWtlIHRvIGhhdmUNCiAgaW50ZXJhY3RpdmUgcGxvdHMgdGhhdCBjYW4g YmUgaG92ZXJlZCBvbiB3aXRoIHRoZSBtb3VzZSB0byBnZXQgdGhlDQogIGRpc3RhbmNlIHZhbHVl IGFuZCBmdWxsIGZpbGUgbmFtZS4NCg0KICBPaCBhbmQgY29kZSBpc24ndCBhbHdheXMgcHJldHR5 IGFzIGl0IHdlbnQgdGhyb3VnaCBhIGxvdCBvZg0KICBleHBlcmltZW50YWwgc3RhZ2VzIGFuZCBs b3ctbGV2ZWwgdHdlYWtzIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UuDQoNCg0KRHVuZSBkZXYgbWVl dGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS1kZXYtbWVl dGluZy8xNDk5NC8xMz4NCg0KDQpFdGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFdlIHdpbGwgaG9sZCBvdXIgcmVndWxhciBEdW5lIGRldiBtZWV0aW5nIHRvbW9y cm93LCBvbiBfV2VkbmVzZGF5LA0KICBPY3RvYmVyLCAxNnRoIGF0IDEwOjAwIENFVF8uIEFzIHVz dWFsLCB0aGUgc2Vzc2lvbiB3aWxsIGJlIG9uZSBob3VyDQogIGxvbmcuDQoNCiAgV2hldGhlciB5 b3UgYXJlIGEgbWFpbnRhaW5lciwgYSByZWd1bGFyIGNvbnRyaWJ1dG9yLCBhIG5ldyBqb2luZXIg b3INCiAganVzdCBjdXJpb3VzLCB5b3UgYXJlIHdlbGNvbWUgdG8gam9pbjogdGhlc2UgZGlzY3Vz c2lvbnMgYXJlIG9wZW5lZCENCiAgVGhlIGdvYWwgb2YgdGhlc2UgbWVldGluZ3MgaXMgdG8gcHJv dmlkZSBhIHBsYWNlIHRvIGRpc2N1c3MgdGhlDQogIG9uZ29pbmcgd29yayB0b2dldGhlciBhbmQg c3luY2hyb25pc2UgYmV0d2VlbiB0aGUgRHVuZSBkZXZlbG9wZXJzICENCg0KDQpBZ2VuZGENCuKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBhZ2VuZGEgaXMgYXZhaWxhYmxlIG9uIHRoZVsgbWVl dGluZyBkZWRpY2F0ZWQgcGFnZV0uIEZlZWwgZnJlZSB0bw0KICBhc2sgaWYgeW91IHdhbnQgdG8g YWRkIG1vcmUgaXRlbXMgaW4gaXQuDQoNCg0KWyBtZWV0aW5nIGRlZGljYXRlZCBwYWdlXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3dpa2kvZGV2LW1lZXRpbmctMjAyNC0xMC0xNj4N Cg0KDQpMaW5rcw0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIE1lZXRpbmcgbGluazpbIHpvb21d DQogIOKAoiBDYWxlbmRhciBldmVudDpbIGdvb2dsZSBjYWxlbmRhcl0NCiAg4oCiIFdpa2kgd2l0 aCBpbmZvcm1hdGlvbiBhbmQgcHJldmlvdXMgbm90ZXM6WyBHaXRIdWIgV2lraV0NCg0KDQpbIHpv b21dDQo8aHR0cHM6Ly91czA2d2ViLnpvb20udXMvai84NTA5Njg3Nzc3Nj9wd2Q9Y1dOaFUxZEhR MVpOU2padU9VWkNRMGgyYnk5VWR6MDk+DQoNClsgZ29vZ2xlIGNhbGVuZGFyXQ0KPGh0dHBzOi8v Y2FsZW5kYXIuZ29vZ2xlLmNvbS9jYWxlbmRhci9lbWJlZD9zcmM9Y181Y2Q2OThkZjY3ODRlMzg1 YjFjZGNkYzFkYmNhMThjMDYxZmFhOTY5NTlhMDQ3ODE1NjZkMzA0ZGM5ZWM3MzE5JTQwZ3JvdXAu Y2FsZW5kYXIuZ29vZ2xlLmNvbT4NCg0KWyBHaXRIdWIgV2lraV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL3dpa2kjZGV2LW1lZXRpbmdzPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRo ZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBt YW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoN CiAg4oCiIFtUaGUgVW5jZXJ0YWluIEFydCBvZiBBY2NlbGVyYXRpbmcgTUwgTW9kZWxzIHdpdGgg U3lsdmFpbiBHdWdnZXJdDQogIOKAoiBbRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnQ6IFJldm9sdXRp b25pc2luZyBPQ2FtbCBEZXZlbG9wbWVudF0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0 cHM6Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltUaGUgVW5jZXJ0YWluIEFydCBvZiBBY2NlbGVyYXRp bmcgTUwgTW9kZWxzIHdpdGggU3lsdmFpbiBHdWdnZXJdDQo8aHR0cHM6Ly9zaWduYWxzLXRocmVh ZHMuc2ltcGxlY2FzdC5jb20vZXBpc29kZXMvdGhlLXVuY2VydGFpbi1hcnQtb2YtYWNjZWxlcmF0 aW5nLW1sLW1vZGVscy13aXRoLXN5bHZhaW4tZ3VnZ2VyLW1vWXVMNFBzPg0KDQpbRHVuZSBQYWNr YWdlIE1hbmFnZW1lbnQ6IFJldm9sdXRpb25pc2luZyBPQ2FtbCBEZXZlbG9wbWVudF0NCjxodHRw czovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNC0xMC0wOS1kdW5lLXBhY2thZ2UtbWFuYWdlbWVudC1y ZXZvbHV0aW9uaXNpbmctb2NhbWwtZGV2ZWxvcG1lbnQ+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBT Y2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9s eXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBh LmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 08 to 15, 2024.

    grep_cmt: structural search of OCaml code

    Nicolas Ojeda Bar announced

    As mentioned in a previous post:

    https://discuss.ocaml.org/t/ann-2nd-editor-tooling-dev-meeting-25th-of-july/14953/5?u=nojb

    I had promised to post back here when we had made the source code for the "structural grep" tool that I presented, public.

    This is now done:

    https://github.com/LexiFi/grep_cmt

    We added a [POC] marker to this post, because the code is not really ready for public consumption (it is rough around the edges and may not work in all circumstances). Our hope is to publicize the approach and perhaps motivate interested hackers to take the code and develop it further into a proper tool.

    Mutaml 0.1

    Jan Midtgaard announced

    I'm happy to share news of the Mutaml 0.3 release! :tada: https://github.com/jmid/mutaml/releases/tag/0.3

    Together with the recent 0.2 release, this brings Mutaml up to speed with recent ppxlib releases and addresses a few issues reported by brave, early users:

    • Avoid mutations in attribute parameters #29
    • Avoid polymorphic equality which is incompatible with Core #30
    • Add support for ppxlib.0.28 and above #27
    • Avoid triggering 2 mutations of a pattern incl. a when-clause causing a redundant sub-pattern warning #22, #23

    Happy testing! :smiley:

    ocaml-activitypub

    Zoggy announced

    I'm glad to announce a first release of activitypub* packages, implementing (well, trying to implement some flavor of) both server-to-server and client-to-server activitypub protocols.

    Documentation is available from the web site.

    The activitypub_server package installs TAPS, an experimental server, handling some common activities. Accounts hosted by this server can at least follow and be followed by mastodon instances, and post and receive activities (Create, Announce, Like, Undo, …).

    The library of the activitypub_client package can be used by a client application to post and receive activities to and from a server (though it was only tested with TAPS). See a simple example here.

    A GUI client (based on Stk is installed by the activitypub_gui package. It requires a client configuration file as described here. You can drop IRIs/URLs of an actor in the window to open a tab and be able to follow this actor. The GUI also allows to create and post notes with attachments. This client is still very experimental and will be developed more in the future.

    EDIT: the package should be available soon in opam.

    Ortac/QCheck-STM 0.4.0 Dynamic formal verification beyond one system under test

    Nicolas Osborne announced

    I'm very pleased to announce this exciting new release of ortac-qcheck-stm.0.4.0!

    This new release brings some exciting new features, mostly the result of Nikolaus Huber's contributions! Thank you Nik!

    Ortac/QCheck-STM is a test generator based on the QCheck-STM model-based testing framework and the Gospel specification language for OCaml.

    You can find the project on this repo and install the released packages via opam.

    It is also encourage to install ortac-dune to avoid having to write too much dune boilerplate.

    In particular, this release extend Ortac/QCheck-STM so that the generated tests will include functions that can take multiple System-Under-Tests as argument and/or that can return one. So now, if we write Gospel specifications for append-like functions, Ortac/QCheck-STM will include them in the generated tests!

    Happy testing!

    Openbsd 1.0

    Sebastien Marie announced

    I would like to announce a new (somehow niche) package Openbsd, which provides bindings for some specifics OpenBSD syscalls pledge(2) and unveil(2).

    These syscalls lets the kernel OS to know what the running processus is expected to do, and so it is possible to restrict a processus to do only filesystem or only network or only pure computation…

    The package is designed to be installable on any platform and provides simple method to check if Pledge or Unveil are supported. This way, it is possible to easily write portable code using the package, as it could be a turned on "no-operation" on Windows or Linux hosts (or provides alternative code path for sandboxing).

    Examples

    let open Openbsd in
    if Pledge.supported then
      Pledge.promises "stdio rpath"
    
    let open Openbsd in
    if Unveil.supported then (
      Unveil.add "./lib" "r";
      Unveil.add "./logs" "rwc";
      Unveil.lock ())
    

    Compsort - reorder files in archives for improved compression

    adrien announced

    I'm happy to announce the first release of compsort, a tool to reorder files in an archive for better compression. It works by grouping files according to a distance that is computed between every file pair. You can install it with opam install compsort (requires ocaml 5.2 for parallelism).

    Website with more details and examples in README.md, plus source: https://gitlab.com/adrien-n/compsort/

    The goal is not new but, AFAIK, the approach is. I am very interested in prior or related art!

    Results

    Compsort achieves improvements that would typically require larger compression windows and therefore more memory. The improvements are only a few percents but in the domain of compression, a few percents is actually a lot.

    With xz compression, a Ubuntu initrd on my machine is reduced by more than 11.5%, while the best achievable improvement is 12.7% (the reordering gives 90% of the best result). Similarly, the tree of linux-firmware.git can be compressed 6% better, while the best achievable improvement is 9.4% (the reordering gives 63% of the best result).

    Visualizations

    In order to better explain what it does, I quite like the visualizations I have so far (there will be better ones in the future), where the value of the pixel at (x,y) indicates how similar are files x and y.

    Before:

    bettercomp_python3-django-horizon_noop.png

    After reordering:

    bettercomp_python3-django-horizon_buckets.png

    Files that are very different from others are all packed at the end and there's also an isolated cluster of files together similar but different from everything else. One can also see that the distinct row and column pattern from the first picture has disappeared: it indicated that every 15 or so files in that region were similar and were separated by disimilar files but that they're now grouped.

    While there are certainly improvements possible, results are good. It's a case where one might wonder why results are so good considering all the approximations that took place.

    [1] Most of the algorithms/libraries I've tried to use rely on having an actual proper distance function which I don't have

    Future work

    I'll try to improve the distance function. Currently it does some steps of compression algorithms to detect redundancies but maybe reusing a compression library would give better results if it can be made fast enough (lz4 is borderline but it has tiny dictionaries unfortunately).

    Clustering could be better as the current algorithm is very basic (it collects files that are 90% similar, then 80% similar, then 70%, …). I tried several algorithms but I don't have a good-enough distance function (for instance the triangular inequality probably doesn't hold) and results were worse.

    All this will benefit from better visualizations and I'd like to have interactive plots that can be hovered on with the mouse to get the distance value and full file name.

    Oh and code isn't always pretty as it went through a lot of experimental stages and low-level tweaks to improve performance.

    Dune dev meeting

    Etienne Marais announced

    We will hold our regular Dune dev meeting tomorrow, on Wednesday, October, 16th at 10:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronise between the Dune developers !

    Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if you want to add more items in it.

    Links

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=W8kuVanW; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=45HfOKIT; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 6CBBEB80123 for ; Tue, 22 Oct 2024 13:42:29 +0100 (BST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=xpFbw8dzxIZuD+CzC4DQ6PQpaxs3stvXrKsvBsR6BLA=; b=W8kuVanWeOJVsK6CxCL2Za/dbZb5ROOZvN47KP90pvpurFd07LwgPeQL jE+Lqn/b4+9LPsJoWWMqUe9cYmw6OrwE28adG0rsGchqiOIDnDSYmHI4v dagmhyR+wd2q9lPE4IxImtLFPAZ1mynMCoaZBI0tEX8i9vxmF9JjcCsbb g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,223,1725314400"; d="scan'208,217";a="190132378" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 22 Oct 2024 14:42:27 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 072BCE0CD4; Tue, 22 Oct 2024 14:42:27 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 34A7FE00B7 for ; Tue, 22 Oct 2024 14:42:25 +0200 (CEST) IronPort-SDR: 67179daf_IZ5l9FZXHTyhGPp890NrYgud3Kqu4+WMBTWYkzTOmMsW9fn 2u6paWmEu/3r1V0+RrtdgeJDz42V5gNUFKYPYdA== X-IPAS-Result: =?us-ascii?q?A0E/AQAZnRdnjyIeaIFaEwEBgkeBQYEDGQFjWjMHCEhDH?= =?us-ascii?q?oN1gWOBbI4fmhKCL4FWgSUDGBYjFAEDAQ0uAQ4EAQIEAQEDAQIBhQACiiQCH?= =?us-ascii?q?wYBBDAJDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAQEBO?= =?us-ascii?q?QVJhXsNgkVRcWUJNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQIMAQxSAT0CCQoTAQEpCQYYIwMUAQYDAhEBNQMBEwESFAIEg?= =?us-ascii?q?mcBgmQDBQwGkxqbSnqBMoEBggwBAQaBCD4CAQsCAgMYJQHaBoFjCYFIhWqCS?= =?us-ascii?q?BoBKkhqAoRGhDwnD4FVRIFKgXNRb4FAEG8LFwEBAQEYgSQBAQhFCYMlgmmGH?= =?us-ascii?q?FV7hCktgXVFDYF5aQQFFYEpZwgCBhYIAoENVlcPggISQg6DAXwjAoEzhhleg?= =?us-ascii?q?ROBb4IXgy0dhy+Cd4FHSzMhEwFVExcLCQVkhguCRoMmghSEEIUlgWcJYYdlg?= =?us-ascii?q?WmBPoFZR4JySoU3gQY5ghZqTjcCDQI3giQkXIJRg1uCTx1AAwttPTUUG6wcB?= =?us-ascii?q?A0qAYFaAUaBai8OCy04MBMHBAMCCAIBBxQOAQEgAjYOKwoZEQwOCUoLAQoCH?= =?us-ascii?q?g+STxAUBCwBjzCOEJRaNAeEHYFdBgyJA4EklXaEBYFWiyuHAJJGIphVIoI0h?= =?us-ascii?q?yIKgRsJgW1qiG8BgRqLRROFQYFnOjxvHAIMBzMaMCIhgmcJRhwPji0Wg1iBP?= =?us-ascii?q?i2CNTk7wzdBNQIBAQcwAgcBCgEBAwmFYgEBhmaBSwEB?= IronPort-PHdr: A9a23:OEOiDRAC8jCECYnVExjlUyQUP0wY04WdBeb1wqQuh78GSKm/5ZOqZ BWZua41ygWUDM6Cs6IMotGVmp6jcFRD26rJiGoFfp1IWk1NouQttCtkPvS4D1bmJuXhdS0wE ZcKflZk+3amLRodQ56mNBXdrXKo8DEdBAj0OxZrKeTpAI7SiNm82/yv95HJbAhFiiaxbalsI Bi2qQjdudQajZdhJ60s1hbHv3xEdvhZym9vOV+dhRHw6Nuu8pV+6SpQofUh98BBUaX+Yas1S KFTASolPW4o+sDlrAHPQgST6HQSVGUWiQdIDBPe7B7mRJfxszD1ufR71SKHIMD5V7E0WTCl7 6d2VB/ljToMOjAl/G3LjMF7kaVUrg+8pxxk247bfp2aNOZwcKPaeNMVX2tBXsBMXCBFDY6xa 44DAuwcNuhasob9vUMDoxugCwexCu3hyTBHiWPt0KIgz+gsCxvL0BA8E98MtnnfsdX7NL0VU eCw1KTF0THDYOlQ2Tzg9YbHbhAhofSNXbJsbcra1E4iGBnBjlqKr4zpJSiV2fgNs2ie7upgS f6vhnU/qwF2pjiuxtsshZfViYIVzFDE9Dx5wJsrKtGiT057e9GkHYJWuiqHOIR4XtksTHt0u CYm1LIGo5i7cTAFxZg6xBPSd+GKfouV7hzsSOqcIDh2inJhdb+/mRq//0iuxvP8WMe631hHr ylInNnSun0PyRHe9tSLR/Rj80qv3zuEyg7d6uZBIU8ulKrbLYYswqYumZoPsETDAjH5mF3xj K+Tc0Ur5PKk6+L5bbX6vpOcMJN7hRv7MqQqgMC/Bv44MgcWU2iU+OS8yL3j/VDiT7lQkvI2l azZvIjbJcQdva65HxVa0oIn6xqlFDem0MwUnXYGLFJZeBKHkpPmN0vULP/kCve/hkygkDhsx /DBMb3hBovCImLfn7fmeLZx80BcyA0pzdBa/JJYEL4BIPbtVUPps9zXEgQ5Mw27w+n5DtVxz IQeWXiAAqOBN6PdrUWH5ucrI+WWfoMVvyz9K/c96/7sl3A5n0ESfbK13ZsNdn+3AOhmL1+Fb nrrh9cNCXsKsRAkTOzrlVKNTyVTa2yuUKI74zE3EIOmDYHZRoCsmrONxim7HodQa2tbCV6MC W/le5iaV/oIci6eP9NtnzMeWbWvV4Mtzx+juQDix7Z6IOfY5zcUuYzj2dV6/eHfiww++SZqA 8mS12yASXx/k30MRz8rx6B/vVJyyk2e36h5gv1XC8Re6+9PXwwnL5DT1fZ6BMr3Wg/ZfteGV lKmQtK+DDE0QdM93sUCY156G9WmjhHDwzSlDKMVl7yNBZw067/c0GbrK8Z60XbG27Etj1ggQ sRRKW2rnrNz+xbXCoLTjkmVi6mneb4S0SLR7muOw2WDsFldUAFqUKXFWX4fZlHRrdT8/k7MU qOgB6k7PgZZ0sGPKLFFa9PxgFtaWfnuIMzeY2W1m2awGRaH2K+DbIrse2UcxSXdFVYLnxoU/ XacOggzHj2uo2bEAzxoD17veF/j8el7qHO6Uk800xqHYFZm17qo/B4ameKTS+gJ0rIBtyogp C94HFGn39LZE9aAoRFuc71GYdwh+FdHyX7ZtwtlM5C9N6xinEIRcxxrv0Py0BV6EplPntIvr HMu1QZyLaOY0Ehddz6DxpDxOrjXKnHo8xy1aq7W3Eve0NeM9asV5vQ4sQargAb8XE499T8vh 91K1VOY+ZOMCgcOB9a5WU8y811+pqrGSig7/YLdk3N2YoeutTqX8tYgAqMewRalfstDePeNE Ab0VdYRB82vNPACg1+tfw4JN+BU9bcpMoWhbfTQi/3jB/ppgD/z1TcP24t6yE/Zq3sUoo/g2 p8Ex6rdxQ6bT3Lni0/ntMnrmIdCbDVUH2ylyCGiCpQCLrZqc9MtDmGja9ay2s04n4TkDndc/ VjlHFgG3c61ZTKKaFjswQBb1UIWuGGq3yyiwG88iCkn+5KWxzeG2OH+bFwCM29PSnNliALXG 7Ps2tpFVVf9VTN8jByh9Fr3zKhdpb1iIi/UW0gddiz/KSd5Wau1t6aeS8RI9ZUjvD4RVbisJ 1eARe21uAMUhhvqBHAW3zUnb3eqt5H+ygR9k36YJW1voWDxfNEpgw/Y4M3ASPVR2DsfWSQ+j iPYbrSlF/+u+9jc15LKs+TlEnmkSoUWai7zi4WJqCq842RuRxy5hfG63NP9Q0A81mfg2t9mW D+tzl60a5T316m8LeNsf1V5TF765c1gH4hik4w2zJgO0Hkej5+R8DIJi2D2edlc3Kv/ajIKS 1tpi5bc5AHjnlZoLneI257RTnKZ09dsbNm8Y3oL12Q69c8LQKaY4bpYnDdk90KipFG0A7A1l TMcxP0yrX8C1rhT6Ux0lnnbWehURhULWE6k3w6F5N2/sqhNMWOmcLzrkVF7gcjkF7aa5AdVR Hf+fJ4mWy529MR2dlzWgxiRosnpfsfdadULu1iaiRDF2qJuEqlpw/BVjDUyA1mopXoh2vI2h hxo3Iinsc6AMWo49aawBFhDPT3wZt8P0jvqkKBVk93Q2ty/WJJ7FX9YOfmgBeLtCz8Uufn9Y kyHFDQ67GyQGb/eARO38EBivm7CGJCtNmiKKT8e19ooF3z/bARPxQsTWjs9hJswEAunkdfgf ElO7TcU/lfkqxFIx4qELjHHW3zE7EetYzYwE92EKQZOqxpF/wHTONCf6eR6G2dZ+IegpUqDM D7TawNNBGAPEkuKYjKrdoKU3oGV+beRGb+EFK7WZrGfteFVV/GJ3I+ilIx88GOFMsyJeGJpD /g6xlZrV3dkHc/UgHMKFzxRkDjCCqzT7Bux4Sx4qMmj/e+jAVi+o9LXV/0JaZM0p1i/mu+bO vSVhTplJDoQzZ4KyXLSid19lBYThyxoazixAOEFvC/JQrjXn/wfBBoaZiVvccpQuvtmj08UY ZKd0YuzjeIr65x9Q01IXlHghMyzMMkDImXmcUjCGF7OL7OeYzvC38DwZ6q4D7xWluRd8ROq6 lP5WwfuOCqOkz7xWlWhK+ZJ2WugBicG7Yviewk4M1O2VNXiewG2O99xjCQrzPsznHyfPGoVN 35neENIr6GMxSlfn/N0FncH6yZ1a+6elGzKiouQYoZTqvZtDiluwqhh2k9inrEK5T4Rfscgg CzWv8JjqFGgk/CSx3xgShUbozJCgsSQtkVnOLnF3pNHRHDP8QlL6DmATRMQqJE2b7+n87AVw d/JmqXpLT5E+N+B5soQCf/fL8efOWYgOx7kS3bESREIRjmxOSTDllRQxbuMo2aNoMFw+f2O0 NIeD6VWX1svGrYGB1R5SZYcdYxvUGps0r+D0JxRvyv49UGNAp4C+MubHrGTGam9cWzIy+AcO 11TmfWjcOFxfsW42lQ+OAgj2t2QQgyOB5YU+nIpLQ4s/hcXqCAnHDFq1xq3Y1Hy6XJOR6zqk kFm2FAlBIZlvHTt+wllfAKS/XlsyUVpy4y30GydfWyjc/zuUdMJV3Ws/w04NpexK+psRTW7h lcsdDLNRrYKyqBlaXgukwjE/51GBf9bS6RAJh4W3/CeIfsygxxQrSCuxEkP4uWga9MqjAwxb ZultG5NwSpmfIdzPavUNbZExVhWh7uTs2mvzO95zAIFJkkL+X+fY2ZR4h1Ob+F6YXHwuLcwo QWZ/lkLMHABTf8rvu5n+gsmNuKMwjihm79PJ0atNvCOeqOUv2+T3cWMQ142ygYJjxwcp+kwi J9/NRHMERtzn97zX1wTOMHPKB9YdZ9X/XnXJmOVtPnVhIlyJ8O7H/zpSumHsOAVhFilFUAnB ddpjIxJE5+y3UXfNcqiIqQCzEBn3z7QfACPU/1WLSiwxS8Ap9CjwZR324hEOzxbBn9yZCyz7 7CRvQQqhfufQP88ZWocVYYfcHdqSIu9gSET7BEiRHGnl/kUzgSP9Wq2viPLEDz1dMZuft+Rd UoqENay6Cky+KiwiEfK/9PZPW6wZrEA8pffrOgdoZiAEfZdS7Jw5lzdl4dvTHuvS2fTENSxK su4e8w2YNfzEHr/Tk2nhmd/UZLqJNj0ZPvt40mgVcNOvYKcxjxmKcKtCmRUBUJrv+9arKs0I AQHZ9BTifHAvQMjMaeyO0GdjsXoRHyie2I+pxx31eK+dqBaxCoqb/anxT0nVJ5ol4FfEGYIV MhMlhba1OqubIlYUDHuFzpaYQqd/EIE IronPort-Data: A9a23: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 9ViD7XSxKhIFayJ5ICr9A== IronPort-HdrOrdr: A9a23:vLN7rq3sdgBPrBwxKQoSxgqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-Talos-CUID: 9a23:f7Ofp2GhL5FjQbwGqmJd6G89ENIeYEbwkkrbPxCyLzpAaYCaHAo= X-Talos-MUID: 9a23:pu0RHAQblsVVPKucRXTJlCB7H/1mzJ+xI3xUnJELpJnZGTR/bmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,223,1725314400"; d="scan'208,217";a="99743552" X-MGA-submission: =?us-ascii?q?MDEe8PW9SV7ft3fCxa7wrcmtoY5Y38Hxi+/RsC?= =?us-ascii?q?2aFyZGfaxXJF9tKP9SJBDhwiGUtv6Uf+GbQUDdgC/D7xn/VKezI7A0We?= =?us-ascii?q?wG/Ey6lxkySwMaL7BQB12+OteAe7niLNGYdMI47nXvibPI84XRIdZ/oy?= =?us-ascii?q?VBDpwMMjIGdJVc0yj2g/eBdw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Oct 2024 14:42:23 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 41E22564703; Tue, 22 Oct 2024 14:42:22 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1729600942; bh=eVbAsMcSAaDP6l/1BPhBdKgRpwOgAdzgy6CVs1rGDN0=; h=From:To:Subject:Date:Message-ID; b=45HfOKIT2x5hb9eqy7kb+6mg1t8D3Z6ywEiCyJiyi+9jwKjPDiZEaIlJKzGXDDRYD A3Mu3YhG3FUVkZ7y8KfXf5ATBpq6y4fraug9GqlqfNULdz5S9uouc3r6sbhucR6bgw 7typ20q3Vvooos+H4u3LLc8otrulnHMBEz0gL74E= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 22 Oct 2024 14:42:21 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 22 14:42:22 2024 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.381948, queueID=91FB2564704 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19189 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 15 to 22, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.3.0~beta1 Dune dev meeting Wildcard expansion on Windows OCamlformat and GitHub actions New vs. Old OCaml Academic Users Page Survey New vs. Old OCaml Industrial Users Page Eliom 11 and Ocsigen Start 7 Other OCaml News Old CWN opam 2.3.0~beta1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce the first beta release of opam 2.3.0. As we're closing on the final release of opam 2.3.0, we'd be happy for people to test this beta and report any regression. What's new? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C This release consists mostly in regression fixes compared to 2.3.0~alpha1: =E2=80=A2 Fix a regression where pinning a local source repository contai= ning initialized git submodules would cause a failure when fetching the package. ([#5809]) =E2=80=A2 Fix a regression which would make opam crash on platforms such = as OpenBSD. ([#6215]) =E2=80=A2 Fix the internal cache of installed packages, which was storing= the wrong version of the opam file after a build failure. ([#6213]) =E2=80=A2 Fix a regression in lint W59 with local urls that are not archives. ([#6218]) A couple of other improvements were made and bugs were fixed. :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [#5809] [#6215] [#6213] [#6218] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are pretty much the same: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.3.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.3.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to [the bug-tracker]. [the bug-tracker] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Steve Sherratt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Notes from today's dune-dev meeting are [here] [here] Wildcard expansion on Windows =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Benjamin Sigonneau announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 While implementing a small CLI tool, I ran into a somehow undocumented feature of the Ocaml compiler: it automatically expands wildcards before doing anything else. Which proved to be a problem. This post serves three different goals: =E2=80=A2 give some visibility, in case someone else run into this issue = in the future =E2=80=A2 expose a possible workaround =E2=80=A2 ask the community if there is a better way=E2=84=A2 to solve th= is Context =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C My tool uses `Cmdliner' for CLI args processing, and needs to handle basic wildcard processing for one of its options, eg. it should handle `mytool.exe -x *.ml'. This would get expanded to `mytool.exe -x a.ml b.ml c.ml' which Cmdliner cannot handle. Under any common Unix shell, this is not a problem: we just have to escape the star character with eg. `mytool.exe -x \*.ml', have mytool handle the expansion itself and we're all set. So far, so good. Then came Windows. Whatever I would do, it seemed like there was no way of preventing that wildcard to be expanded. I learned that on Windows, the calling program was responsible for dealing with wildcards, not the shell. After some digging, the root cause of this behaviour was found in the ocaml runtime itself, in [`runtime/main.c']: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 int main_os(int argc, char_os **argv) =E2=94=82 { =E2=94=82 #ifdef _WIN32 =E2=94=82 /* Expand wildcards and diversions in command line */ =E2=94=82 caml_expand_command_line(&argc, &argv); =E2=94=82 #endif =E2=94=82=20 =E2=94=82 /* [...] */ =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 After a bit of history digging, it turns out this behaviour dates back from the very early stages of the Ocaml compiler, see [this commit] by Xavier Leroy from=E2=80=A6 1996! [`runtime/main.c'] [this commit] Workaround =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C The `runtime/main.c' file gives a hint on how to work around this: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 /* Main entry point (can be overridden by a user-provided main() =E2=94=82 function that calls caml_main() later). */ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 So the most elegant workaround I could find was to create a copy of the `main.c' file inside the source tree of mytool and comment out the call to `caml_expand_command_line'. Then it was a matter of compiling and linking everything altogether. I use `dune' to compile `mytool.exe', and after a lot of trial-and-error, I found out it could handle this very easily with the `foreign_stubs' stanza: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (executable =E2=94=82 (name mytool) =E2=94=82 (foreign_stubs (language c) (names main)) =E2=94=82 ; ... =E2=94=82 ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Minimal working example =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C I opened a Github repository containing a minimal project featuring a custom entry point so that command-line arguments expansion does not happen on Windows. See: Open Questions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 The root cause of this issue was introduced almost 30 years ago= . How come no one on the Internets seem to have run into a similar issue? =E2=80=A2 Why was this behaviour introduced in the first place? I suspect= it may have make it easier to setup a Windows toolchain back then, but that's just wild speculation. =E2=80=A2 Is this behaviour still needed, or could we get rid of it? =E2=80=A2 Should this be more wildly documented, and if so, where? The oc= aml compiler docs and the dune docs could probably benefit from a small paragraph on how to override the default entry point. OCamlformat and GitHub actions =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 a small announcement for those using OCamlformat in their projects: if you find the burden on external contributors very high, and always express "please run ocamlformat on your PR" =E2=80=93 we've been in the s= ame boat. We developed a GitHub action which automatically runs OCamlformat and pushes that on the PR. No need for contributors to remember running OCamlformat, no need for "OCaml-CI" to fail since ocamlformat run diverges. If you're interested, take a look at =E2=80=93 please note that we use `find . -name \*ml -maxdepth 1' =E2=80= =93 depending on your project you may be able to run `dune bu @fmt --auto' (or need a slightly different `find' to look deeper or also for mli files). Happy to share this action which turned out to be tremendously useful for some of our projects. New vs. Old OCaml Academic Users Page Survey =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Claire Vandenberghe announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 We've recently *redesigned the OCaml Academic Users page* and would love to *get your feedback* to ensure it=E2=80=99s as helpful as possible= . You can view both versions here: =E2=80=A2 New page:[ ocaml.org/academic-users] =E2=80=A2 Old page:[ staging.ocaml.org/academic-users] As a teacher, student expert or beginner developer using OCaml, we=E2=80= =99d greatly appreciate your insights! Participate in the survey here: [https://docs.google.com/forms/d/e/1FAIpQLSfc9qPR16deJ6VeVmXGXPVO4e3wZ9ZV= IYiWrS4f1RZsqcXxwQ/viewform?usp=3Dsf_link] or we can discuss this topic below :) Do you find the new page more useful and relevant for your academic needs compared to the old one? If so, why? Is there any information missing or anything you=E2=80=99d suggest improv= ing on the new page? Your feedback is incredibly valuable to us as we work to improve the experience for the OCaml community. Thank you in advance! [ ocaml.org/academic-users] [ staging.ocaml.org/academic-users] [https://docs.google.com/forms/d/e/1FAIpQLSfc9qPR16deJ6VeVmXGXPVO4e3wZ9ZVIY= iWrS4f1RZsqcXxwQ/viewform?usp=3Dsf_link] New vs. Old OCaml Industrial Users Page =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Claire Vandenberghe announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 We've recently redesigned the *OCaml Industrial Users pages* and would love to get *your feedback* to ensure it=E2=80=99s as helpful as possible= . You can view both versions here: =E2=80=A2 New: =E2=80=A2 Old: As an expert or beginner developer using OCaml, we=E2=80=99d greatly appreciate your insights! You can also participate to the survey here: or we can discuss this topic below :) Do you find the new page more useful and relevant for industrial needs compared to the old one? If so, why? Is there any information missing or anything you=E2=80=99d suggest improv= ing on the new page? Your feedback is incredibly valuable to us as we work to improve the experience for the OCaml community. Thank you in advance! Eliom 11 and Ocsigen Start 7 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Vincent Balat announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Eliom 11 and Ocsigen Start 7 have been released a few weeks ago. These versions follow the recent release of Ocsigen Server 6 and leverage its new configuration API to make it easier to use it as a library, without a configuration file. Here is an example of a simple OCaml app generating a Web page from server side (and serving static pages from directory `"local/var/www/mysite"'): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f _ () =3D =E2=94=82 Lwt.return =E2=94=82 Eliom_content.Html.F.(html (head (title (txt "")) []) =E2=94=82 (body [h1 [txt "Hello"]])) =E2=94=82=20 =E2=94=82 let myservice =3D =E2=94=82 Eliom_service.create =E2=94=82 ~path:(Eliom_service.Path []) =E2=94=82 ~meth:(Eliom_service.Get Eliom_parameter.any) =E2=94=82 () =E2=94=82=20 =E2=94=82 let () =3D Eliom_registration.Html.register ~service:myservice f =E2=94=82=20 =E2=94=82 let () =3D Ocsigen_server.start=20 =E2=94=82 [ Ocsigen_server.host =E2=94=82 [ Staticmod.run ~dir:"local/var/www/mysite" () =E2=94=82 ; Eliom.run () ] ] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 To use it, just install Eliom and your favorite version of Ocipersist, then create a new Dune project: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install ocsipersist-sqlite-config eliom =E2=94=82 dune init project mysite =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Put the code above in file `bin/mysite.ml' Update file `bin/dune': =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (executable =E2=94=82 (public_name mysite) =E2=94=82 (name main) =E2=94=82 (libraries =E2=94=82 ocsigenserver =E2=94=82 ocsigenserver.ext.staticmod =E2=94=82 ocsipersist-sqlite =E2=94=82 eliom.server)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Build and execute: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 dune exec mysite =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Open URL `http://localhost:8080/'. Ocsigen Start's application template has been updated to support both the use as an executable or as a library (lynked dynamically from the server's config file). Links: =E2=80=A2 [Ocsigen] =E2=80=A2 [Github] [Ocsigen] [Github] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Developer education at Jane Street] =E2=80=A2 [Dune Developer Preview: Installing The OCaml Compiler With Dune Package Management] =E2=80=A2 [Upcoming OCaml Events] [the ocaml.org blog] [Developer education at Jane Street] [Dune Developer Preview: Installing The OCaml Compiler With Dune Package Management] [Upcoming OCaml Events] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 15 to 22, 202= 4.

    opam 2.3.0~beta1

    Kate announced

    We're happy to announce the first beta release of opam 2.3.0.

    As we're closing on the final release of opam 2.3.0, we'd be happy for peop= le to test this beta and report any regression.

    What's new?

    This release consists mostly in regression fixes compared to 2.3.0~alpha1:

    • Fix a regression where pinning a local source repository containing ini= tialized git submodules would cause a failure when fetching the package. (<= a href=3D"https://github.com/ocaml/opam/issues/5809">#5809)
    • Fix a regression which would make opam crash on platforms such as OpenB= SD. (#6215)
    • Fix the internal cache of installed packages, which was storing the wro= ng version of the opam file after a build failure. (#6213)
    • Fix a regression in lint W59 with local urls that are not archives. (#6218)

    A couple of other improvements were made and bugs were fixed. :open_book: You can read our blog post for more information about these changes and more= , and for even more details you can take a look at the release note or the changelog.

    Dune dev meeting

    Steve Sherratt announced

    Notes from today's dune-dev meeting are here

    Wildcard expansion on Windows

    Benjamin Sigonneau announced

    While implementing a small CLI tool, I ran into a somehow undocumented feat= ure of the Ocaml compiler: it automatically expands wildcards before doing = anything else. Which proved to be a problem.

    This post serves three different goals:

    • give some visibility, in case someone else run into this issue in the f= uture
    • expose a possible workaround
    • ask the community if there is a better way=E2=84=A2 to solve this

    Context

    My tool uses Cmdliner for CLI args processing, and needs to ha= ndle basic wildcard processing for one of its options, eg. it should handle= mytool.exe -x *.ml.

    This would get expanded to mytool.exe -x a.ml b.ml c.ml which = Cmdliner cannot handle. Under any common Unix shell, this is not a problem:= we just have to escape the star character with eg. mytool.exe -x \*.= ml, have mytool handle the expansion itself and we're all set. So fa= r, so good.

    Then came Windows. Whatever I would do, it seemed like there was no way of = preventing that wildcard to be expanded. I learned that on Windows, the cal= ling program was responsible for dealing with wildcards, not the shell. Aft= er some digging, the root cause of this behaviour was found in the ocaml ru= ntime itself, in runtime/main.c:

    int main_os(int=
     argc, char_os **argv)
    {
    #ifdef _WIN32
      /* Expand wildcards and diversions in=
     command line */=
    
      caml_expand_command_line(&argc, &argv);
    #endif
    
    /* [...] */
    }
    

    After a bit of history digging, it turns out this behaviour dates back from= the very early stages of the Ocaml compiler, see this comm= it by Xavier Leroy from… 1996!

    Workaround

    The runtime/main.c file gives a hint on how to work around thi= s:

    Main entry =
    point (can be overridden by a user-provided main()
       function that calls =
    caml_main() later). */
    

    So the most elegant workaround I could find was to create a copy of the main.c file inside the source tree of mytool and comment out the = call to caml_expand_command_line. Then it was a matter of comp= iling and linking everything altogether. I use dune to compile= mytool.exe, and after a lot of trial-and-error, I found out i= t could handle this very easily with the foreign_stubs stanza:

    (executable
     (name mytool)
     (foreign_stubs (language c) (names main))
     ; ...
    )
    

    Minimal working example

    I opened a Github repository containing a minimal project featuring a custo= m entry point so that command-line arguments expansion does not happen on W= indows.

    See: https://git= hub.com/benji-sb/ocaml-windows-argv

    Open Questions

    • The root cause of this issue was introduced almost 30 years ago. How co= me no one on the Internets seem to have run into a similar issue?
    • Why was this behaviour introduced in the first place? I suspect it may = have make it easier to setup a Windows toolchain back then, but that's just= wild speculation.
    • Is this behaviour still needed, or could we get rid of it?
    • Should this be more wildly documented, and if so, where? The ocaml comp= iler docs and the dune docs could probably benefit from a small paragraph o= n how to override the default entry point.

    OCamlformat and GitHub actions

    Hannes Mehnert announced

    a small announcement for those using OCamlformat in their projects: if you = find the burden on external contributors very high, and always express "ple= ase run ocamlformat on your PR" – we've been in the same boat.

    We developed a GitHub action which automatically runs OCamlformat and pushe= s that on the PR. No need for contributors to remember running OCamlformat,= no need for "OCaml-CI" to fail since ocamlformat run diverges.

    If you're interested, take a look at https://github.com/rob= ur-coop/mollymawk/blob/main/.github/workflows/format.yml – pleas= e note that we use find . -name \*ml -maxdepth 1 – depe= nding on your project you may be able to run dune bu @fmt --auto (or need a slightly different find to look deeper or also f= or mli files).

    Happy to share this action which turned out to be tremendously useful for s= ome of our projects.

    New vs. Old OCaml Academic Users Page Survey

    Claire Vandenberghe announced

    We've recently redesigned the OCaml Academic Users page and would lo= ve to get your feedback to ensure it=E2=80=99s as helpful as possibl= e. You can view both versions here:

    As a teacher, student expert or beginner developer using OCaml, we=E2=80=99= d greatly appreciate your insights! Participate in the survey here: https://docs.google.com/forms/d/e/1FAIpQLSfc9qPR16deJ6V= eVmXGXPVO4e3wZ9ZVIYiWrS4f1RZsqcXxwQ/viewform?usp=3Dsf_link or we can d= iscuss this topic below :)

    Do you find the new page more useful and relevant for your academic needs c= ompared to the old one? If so, why?

    Is there any information missing or anything you=E2=80=99d suggest improvin= g on the new page?

    Your feedback is incredibly valuable to us as we work to improve the experi= ence for the OCaml community.

    Thank you in advance!

    New vs. Old OCaml Industrial Users Page

    Claire Vandenberghe announced

    We've recently redesigned the OCaml Industrial Users pages and would= love to get your feedback to ensure it=E2=80=99s as helpful as poss= ible. You can view both versions here:

    As an expert or beginner developer using OCaml, we=E2=80=99d greatly apprec= iate your insights! You can also participate to the survey here: https://forms.gle/C7czFt36m7bx4fLt8 or we can discuss this topic below :)

    Do you find the new page more useful and relevant for industrial needs comp= ared to the old one? If so, why?

    Is there any information missing or anything you=E2=80=99d suggest improvin= g on the new page?

    Your feedback is incredibly valuable to us as we work to improve the experi= ence for the OCaml community.

    Thank you in advance!

    Eliom 11 and Ocsigen Start 7

    Vincent Balat announced

    Eliom 11 and Ocsigen Start 7 have been released a few weeks ago. These versions follow the recent release of Ocsigen Server 6 and leverage i= ts new configuration API to make it easier to use it as a library, without = a configuration file.

    Here is an example of a simple OCaml app generating a Web page from server = side (and serving static pages from directory "local/var/www/mysite"<= /code>):

    let f _ () =3D
      Lwt.return
        Eliom_content.Html.F.(html (head=
     (title (txt "")) [])
                                   (body [h1 [txt "Hello"]]))
    
    let myservice =3D
      Eliom_service.create
        ~path:(Eliom_service.Path [])
        ~meth:(Eliom_service.Get Eliom_parameter.any)
        ()
    
    let () =3D Eliom_registration.Html.register ~service:myservice f
    
    let () =3D Ocsigen_server.start=20
        [ Ocsigen_server.host
           [ Staticmod.run ~dir:"local/var=
    /www/mysite" ()
           ; Eliom.run () ] ]
    

    To use it, just install Eliom and your favorite version of Ocipersist, then= create a new Dune project:

    opam install ocsipersist-sqlite-config eliom
    dune init project mysite
    

    Put the code above in file bin/mysite.ml

    Update file bin/dune:

    (executable
     (public_name mysite)
     (name main)
     (libraries
      ocsigenserver
      ocsigenserver.ext.staticmod
      ocsipersist-sqlite
      eliom.server))
    

    Build and execute:

    dune exec mysite
    

    Open URL http://localhost:8080/.

    Ocsigen Start's application template has been updated to support both the u= se as an executable or as a library (lynked dynamically from the server's c= onfig file).

    Links:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=C3J+PdNH; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=ijeKrx7B; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id F264DB80123 for ; Tue, 29 Oct 2024 13:31:29 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=hTHrpgor/SbCYIth/lz1iyt2hf5npRPyK6UNjIpbOdU=; b=C3J+PdNHd7bTo+wR+xv8nF0xqWR94Cj0L53uQKNimvsY4jf7nbZBnqZP Sk1Xozz2+oMahxJePmPQRyk1JQjkSsx31HxuX+ZikIs+ZrUsDPyl7Faej y/Pn3MG9H2yuSe+nSnBfGRqrd/TvwdhSC8Mowqnnb1hatFdnVoIGz3aig 8=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,241,1725314400"; d="scan'208,217";a="191253113" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Oct 2024 14:31:29 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 30E99E0D1E; Tue, 29 Oct 2024 14:31:29 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5B5BAE00B7 for ; Tue, 29 Oct 2024 14:31:25 +0100 (CET) IronPort-SDR: 6720e390_ibWXJqbFD/HT+LIOR6ZcWzmtjrCMzZ+Ot41xc/Iyxlt0JFS NgzG/63upte9D7QOp30vy7Gda+k6SNRsk7xiS3g== X-IPAS-Result: =?us-ascii?q?A0HmEwBI4yBngSIeaIFagl6BP1soGQFjWjMHCEiEVoFjg?= =?us-ascii?q?WyOH5oTgi+CewMYFiMUAQMBDS4BBQ0BAgQBAQMBAgGDSXFGAhaKEgIfBgEEN?= =?us-ascii?q?BMBAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBPQVJhXsNSQEBA?= =?us-ascii?q?QECAQYEgWtRUx5lCQYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBGRp0ChMBATgYIwMUAQYDA?= =?us-ascii?q?gQNATUDARMBEhqCDxRFgh9FAwUMBj+SH5p5Gjd6gTKBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gJAAdoGgWMJgTAYhWqCSBoBKkhqAoRGCYQzJw+BVUSBFTWCRG+CPwsXAQEBA?= =?us-ascii?q?QEXgSQBAU0JgyWCaYIbOkdUgX4SOoMAeiVNTRCGCoFrhymKO4FHSzMyAVUTF?= =?us-ascii?q?wsHBWCBHwOEboFagTuBU0eCZkqFKIEBOYIUaUs6Ag0CNoIkJFmCUINag20dQ?= =?us-ascii?q?AMLbT01FBuaeAEJLXkBRoFsLw58TAUBExICAgIgAi4IDjIDGAEmDkoIAzqSU?= =?us-ascii?q?CUDLbIcNAeEHYFdBgyJA4EklXaEBIFWiyuHAJJGIphVIolXCoEbCV+BDmqIc?= =?us-ascii?q?IwjPIVUgX4jPIEgMxowQ4JnCQo8HA9Yg2aJQYM+XhCBLoEmgXU7gT2BMMUCQ?= =?us-ascii?q?jUCAQE3AgcBCgEBAwmFYgEBaYEzgXlJhiWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 vSRD6ACOXm4 IronPort-HdrOrdr: A9a23:B0YkKa9FeTz9BO+5/vtuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:B7zboGyHfd1AViu5g5ZUBgUQPu0oaGLU4U2AeVKVNXh4Ve2nFGWprfY= X-Talos-MUID: 9a23:sY48/AuBV+CzbPbKYM2nlG1Ob+Fv76qSOn9clMoXiZS9OykgNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,241,1725314400"; d="scan'208,217";a="100301632" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHzXQE+bsWCbUrleH9R2xW4jR3SHTycWmD11k?= =?us-ascii?q?x9/c8ZHtftOpyYulSuCi4AyswrA7J2EZjqhdzutLxhTibkk+3wQ+SF5Z?= =?us-ascii?q?f2J/Lc81zziXz7QHR/IvWi9LCJfEKJ7tycgR1h5NL6mI2YICh9cdAfJx?= =?us-ascii?q?moKCUqSwJPBWhFxnJmvHhPBQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Oct 2024 14:30:57 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 9436C564A52; Tue, 29 Oct 2024 14:30:55 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1730208655; bh=xU+CHQse1l5SDrbO9CaSEttyUj2T+Czh9oWRBF0UHwo=; h=From:To:Subject:Date:Message-ID; b=ijeKrx7B0hFuUo6cbJCqLEv9QaV8rGTY/0n/olB3mIW+9uFkb0bQn6Z30Y2dB/Ndq ieZkdzu/yOQJjGnZGRs0IlNQH/306/Za1h9XByWWMj5uGAH/7mcZ/RyzMJwu/YuAHm Aa9GcUbE7Yb5gRsoo5PNikCsn1e8Rz7g68yS2HUg= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 29 Oct 2024 14:30:53 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 29 14:30:55 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.250564, queueID=CBAE1564A53 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19191 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAyMiB0byAyOSwNCjIwMjQuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KSE9MIExp Z2h0IHJlbGVhc2VkIHRvIE9QQU0NCkNvdWxkIHdlIGFkZCBhIHRpbnkgT0NhbWwgaW50ZXJwcmV0 ZXIgdG8gTnVtd29ya3MgZ3JhcGhpY2FsIGNhbGN1bGF0b3JzPw0Kb3BhbSAyLjMuMH5iZXRhMg0K RWRpdG9ycyBkZXYtbWVldGluZyAjNCwgVGh1LiAzMXRoOiBTZWFyY2ggYnkgdHlwZSDDoCBsYSBT aGVybG9kb2Mg8J+Vte+4jw0KRHVuZSBkZXYgbWVldGluZw0KU2hlbGwgQ29tcGxldGlvbnMgaW4g RHVuZSBEZXZlbG9wZXIgUHJldmlldw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkhP TCBMaWdodCByZWxlYXNlZCB0byBPUEFNDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ob2wtbGlnaHQtcmVsZWFz ZWQtdG8tb3BhbS8xNTQ4OC8xPg0KDQoNCkp1bmV5b3VuZyBMZWUgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBUaGUgSE9MIExpZ2h0IGludGVyYWN0aXZlIHRoZW9yZW0gcHJvdmVyIHdyaXR0 ZW4gYnkgSm9obiBIYXJyaXNvbiBpcw0KICByZWxlYXNlZCB0byBPUEFNIGFzIGEgcGFja2FnZS4g SXRzIGZpcnN0IG5ldyB2ZXJzaW9uIGF2YWlsYWJsZSBvbiBPUEFNDQogIGlzIDMuMC4gIEl0IG5v dyBwcm92aWRlcyBgaG9sLnNoJyB3aGljaCBpcyBhIHNjcmlwdCB0aGF0IHdpbGwgbGF1bmNoDQog IGFuIE9DYW1sIFJFUEwgdGhhdCBlbmFibGVzIGludGVyYWN0aXZlIHRoZW9yZW0gcHJvdmluZy4g Q29tYmluZWQgd2l0aA0KICBhIFZTQ29kZSBwbHVnaW4gZm9yIEhPTCBMaWdodCwgdGhpcyBnaXZl cyBhIG5pY2UgdGhlb3JlbSBwcm92aW5nDQogIGV4cGVyaWVuY2UuLiEgRm9yIG1vcmUgZGV0YWls cywgcGxlYXNlIHZpc2l0Og0KICDigKIgVGhlIHdlYnNpdGU6IDxodHRwczovL2hvbC1saWdodC5n aXRodWIuaW8vPg0KICDigKIgVGhlIG1haW4gcmVwbzogPGh0dHBzOi8vZ2l0aHViLmNvbS9qcmgx My9ob2wtbGlnaHQvPg0KDQoNCkNvdWxkIHdlIGFkZCBhIHRpbnkgT0NhbWwgaW50ZXJwcmV0ZXIg dG8gTnVtd29ya3MgZ3JhcGhpY2FsIGNhbGN1bGF0b3JzPw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9jb3VsZC13ZS1hZGQtYS10aW55LW9jYW1sLWludGVycHJldGVyLXRvLW51 bXdvcmtzLWdyYXBoaWNhbC1jYWxjdWxhdG9ycy83NjUyLzE0Pg0KDQoNCkRlZXAgaW4gdGhpcyB0 aHJlYWQsIExpbGlhbiBCZXNzb24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBT byBhZnRlciBhIGZldyBob3VycyBvZiB3b3JrLCB3ZSd2ZSBzdWNjZXNzZnVsbHkgcG9ydGVkIHRo ZSBPTWljcm9CDQogIFZpcnR1YWwgTWFjaGluZSBmb3IgT0NhbWwgdG8gdGhlIE51bXdvcmtzIGNh bGN1bGF0b3IgOnRhZGE6ICEgU2VlDQogIFt0aGlzIHBhcnQgb2Ygb3VyIGRpc2N1c3Npb24gb24g R2l0SHViXSwgaWYgYW55b25lIGlzIGN1cmlvdXMuDQoNCiAgQnV0IHdlJ3JlIGZhciBhd2F5IGZy b20gYmVpbmcgZG9uZSEgSW5kZWVkLCBJIHdhbnQgdG8gYmUgYWJsZSB0bw0KICBpbnRlcnByZXQg Km9uIHRoZSBjYWxjdWxhdG9yKiBzb21lIE9DYW1sIGxpbmUgb2YgY29kZSAvIG9yIGVudGlyZQ0K ICBmaWxlLiAgSSBrbm93IGl0J3MgcHJvYmFibHkgZ29pbmcgdG8gYmUgaGFyZCwgaWYgbm90IGVu dGlyZWx5DQogIGltcG9zc2libGUsIGJ1dCBoZXkgd2UndmUgYXQgbGVhc3QgcHJvZ3Jlc3NlZCBh IGJpdCBpbiB0aGlzIGRpcmVjdGlvbiENCiAgVGhhbmtzIEBib3Jpc2QgYWdhaW4gZm9yIHRoZSBz dWdnZXN0aW9uISAgQFZlcnRtbyBpcyBoZWxwaW5nIG1lIG9uDQogIHRoaXMgaXNzdWUsIHRoYW5r cyB0byBoaW0uDQoNCg0KW3RoaXMgcGFydCBvZiBvdXIgZGlzY3Vzc2lvbiBvbiBHaXRIdWJdDQo8 aHR0cHM6Ly9naXRodWIuY29tL3N0ZXZlbnZhci9PTWljcm9CL2lzc3Vlcy8zNiNpc3N1ZWNvbW1l bnQtMjQzMjA0MTE2OD4NCg0KDQpvcGFtIDIuMy4wfmJldGEyDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItMy0wLWJldGEyLzE1NDk2LzE+DQoNCg0KS2F0ZSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFdlJ3JlIGhhcHB5IHRvIGFubm91bmNlIHRoZSBzZWNvbmQgYmV0YSByZWxlYXNlIG9mIG9wYW0g Mi4zLjAuDQoNCiAgQXMgd2UncmUgY2xvc2luZyBvbiB0aGUgZmluYWwgcmVsZWFzZSBvZiBvcGFt IDIuMy4wLCB3ZSdkIGJlIGhhcHB5IGZvcg0KICBwZW9wbGUgdG8gdGVzdCB0aGlzIGJldGEgYW5k IHJlcG9ydCBhbnkgcmVncmVzc2lvbi4NCg0KDQpXaGF0J3MgbmV3Pw0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyByZWxlYXNlIGNvbnNpc3RzIG1vc3RseSBpbiBv bmUgcmVncmVzc2lvbiBmaXggY29tcGFyZWQgdG8NCiAgMi4zLjB+YmV0YTE6DQoNCiAg4oCiIEZp eCBhIHJlZ3Jlc3Npb24gaW4gdGhlIGRldGVjdGlvbiBvZiB0aGUgY3VycmVudCB0ZXJtaW5hbCBz aXplIHRoYXQNCiAgICBsZWFkcyB0byBvcGFtIG91dHB1dCB0aGF0IHRyaWVzIHRvIGZpdCBpdHNl bGYgaW50byA4MCBjb2x1bW5zDQogICAgcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCB0ZXJtaW5h bCBzaXplIChbIzYyNDNdKQ0KDQogIEEgY291cGxlIG9mIG90aGVyIGltcHJvdmVtZW50cyB3ZXJl IG1hZGUuICA6b3Blbl9ib29rOiBZb3UgY2FuIHJlYWQNCiAgb3VyIFtibG9nIHBvc3RdIGZvciBt b3JlIGluZm9ybWF0aW9uLCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlvdQ0KICBjYW4gdGFr ZSBhIGxvb2sgYXQgdGhlIFtyZWxlYXNlIG5vdGVdIG9yIHRoZSBbY2hhbmdlbG9nXS4NCg0KDQpb IzYyNDNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXMvNjI0Mz4NCg0KW2Js b2cgcG9zdF0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItMy0wLWJldGEyLz4N Cg0KW3JlbGVhc2Ugbm90ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL3JlbGVhc2Vz L3RhZy8yLjMuMC1iZXRhMj4NCg0KW2NoYW5nZWxvZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vcGFtL2Jsb2IvMi4zLjAtYmV0YTIvQ0hBTkdFUz4NCg0KDQpUcnkgaXQhDQrilYzilYzilYzi lYzilYzilYzilYwNCg0KICBUaGUgdXBncmFkZSBpbnN0cnVjdGlvbnMgYXJlIHByZXR0eSBtdWNo IHRoZSBzYW1lOg0KDQogIEZvciBVbml4IHN5c3RlbXMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giBiYXNoIC1jICJzaCA8KGN1cmwgLWZzU0wgaHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9pbnN0YWxs LnNoKSAtLXZlcnNpb24gMi4zLjB+YmV0YTIiDQogIOKUlOKUgOKUgOKUgOKUgA0KICBvciBmcm9t IFBvd2VyU2hlbGwgZm9yIFdpbmRvd3Mgc3lzdGVtcw0KICDilIzilIDilIDilIDilIANCiAg4pSC IEludm9rZS1FeHByZXNzaW9uICImIHsgJChJbnZva2UtUmVzdE1ldGhvZCBodHRwczovL29wYW0u b2NhbWwub3JnL2luc3RhbGwucHMxKSB9IC1WZXJzaW9uIDIuMy4wfmJldGEyIg0KICDilJTilIDi lIDilIDilIANCg0KICBQbGVhc2UgcmVwb3J0IGFueSBpc3N1ZXMgdG8gW3RoZSBidWctdHJhY2tl cl0uDQoNCg0KW3RoZSBidWctdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFt L2lzc3Vlcz4NCg0KDQpFZGl0b3JzIGRldi1tZWV0aW5nICM0LCBUaHUuIDMxdGg6IFNlYXJjaCBi eSB0eXBlIMOgIGxhIFNoZXJsb2RvYyDwn5W177iPDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lZGl0 b3JzLWRldi1tZWV0aW5nLTQtdGh1LTMxdGgtc2VhcmNoLWJ5LXR5cGUtYS1sYS1zaGVybG9kb2Mv MTU1MDcvMT4NCg0KDQp2ZHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBXZSBhcmUgb3JnYW5pemluZyB0aGUgbmV4dCBwdWJsaWMgZGV2LW1l ZXRpbmcgb24gbmV4dCBUaHVyc2RheSwgdGhlDQogIDMxdGggb2YgT2N0b2JlciBhdCA1cG0gQ0VT VCAod2UgaGF2ZSBhIGxvY2FsIHNwZWFrZXIpLiBXaGV0aGVyIHlvdSBhcmUNCiAgYSBsb25nIHRp bWUgbWFpbnRhaW5lciwgYW4gb2NjYXNpb25hbCBjb250cmlidXRvciwgYSBuZXcgY29tZXIsIG9y DQogIHNpbXBseSBhIGN1cmlvdXMgcGFzc2VyLWJ5LCBwbGVhc2UgZmVlbCBmcmVlIHRvIGF0dGVu ZCENCg0KICA6c3BhcmtsZXM6IEZvciB0aGlzIHNlc3Npb24sIEB4dncgaXMgZ29pbmcgdG8gcHJl c2VudCBhIG5ldyBNZXJsaW4NCiAgZmVhdHVyZTogYW4gYWx0ZXJuYXRpdmUgdG8gcG9sYXJpdHkg c2VhcmNoIHRoYXQgY2FuIHNlYXJjaCBmb3IgdmFsdWVzDQogIGluIHRoZSBlbnZpcm9ubWVudCB3 aXRoIGEgc3ludGF4IHNpbWlsYXIgYXMgdGhlIG9uZSBvZiB0aGUgYW1hemluZw0KICBbU2hlcmxv ZG9jXS4NCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxv YWRzL29jYW1sL29yaWdpbmFsLzJYLzIvMjYxNmM0MzZlY2VmY2E5NTI2ZDFmOGJjNWQxMDZmYWE5 MGM1MjE5YS5naWY+DQoNCiAgOmNsaXBib2FyZDogTWVldGluZyBhZ2VuZGE6DQoNCiAg4oCiIEEg dG91ci1kZS10YWJsZSB0byBhbGxvdyB0aGUgcGFydGljaXBhbnRzIHRoYXQgd2lzaCB0byBkbyBz byB0bw0KICAgIHByZXNlbnQgdGhlbXNlbHZlcyBhbmQgbWVudGlvbiBpc3N1ZXMgLyBwcnMgdGhl eSBhcmUgaW50ZXJlc3RlZCBpbi4NCiAg4oCiIFRhbGsgYW5kIFEmQQ0KICDigKIgRGlzY3VzcyBp c3N1ZXMgYW5kIHB1bGwgcmVxdWVzdHMgdGhhdCB3ZXJlIHRhZ2dlZCBpbiBhZHZhbmNlIG9yDQog ICAgbWVudGlvbmVkIGR1cmluZyB0aGUgdG91ci1kZS10YWJsZS4NCg0KICBXZeKAmXJlIGxvb2tp bmcgZm9yd2FyZCB0byBtZWV0aW5nIHlvdSENCg0KICBNZWV0aW5nIGxpbms6DQogIFttZWV0Lmdv b2dsZS5jb20vbmNiLW1ubXAta21rXShtZWV0Lmdvb2dsZS5jb20vbmNiLW1ubXAta21rKQ0KDQog IFByZXZpb3VzIG1lZXRpbmcgbm90ZXMgYXJlIGF2YWlsYWJsZSBpbiBbTWVybGlu4oCZcyByZXBv c2l0b3J5IHdpa2kgXS4NCg0KDQpbU2hlcmxvZG9jXSA8aHR0cHM6Ly9kb2Muc2hlcmxvY29kZS5j b20vPg0KDQpbTWVybGlu4oCZcyByZXBvc2l0b3J5IHdpa2kgXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9tZXJsaW4vd2lraS9QdWJsaWMtZGV2JUUyJTgwJTkwbWVldGluZ3M+DQoNCg0KRHVu ZSBkZXYgbWVldGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVu ZS1kZXYtbWVldGluZy8xNDk5NC8xNT4NCg0KDQpFdGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgA0KDQogIFdlIHdpbGwgaG9sZCBvdXIgcmVndWxhciBEdW5lIGRldiBtZWV0 aW5nIHRvbW9ycm93LCBvbiAqV2VkbmVzZGF5LA0KICBPY3RvYmVyLCAzMHRoIGF0IDE2OjAwIENF VC4qIEFzIHVzdWFsLCB0aGUgc2Vzc2lvbiB3aWxsIGJlIG9uZSBob3VyDQogIGxvbmcuDQoNCiAg V2hldGhlciB5b3UgYXJlIGEgbWFpbnRhaW5lciwgYSByZWd1bGFyIGNvbnRyaWJ1dG9yLCBhIG5l dyBqb2luZXIgb3INCiAganVzdCBjdXJpb3VzLCB5b3UgYXJlIHdlbGNvbWUgdG8gam9pbjogdGhl c2UgZGlzY3Vzc2lvbnMgYXJlIG9wZW5lZCENCiAgVGhlIGdvYWwgb2YgdGhlc2UgbWVldGluZ3Mg aXMgdG8gcHJvdmlkZSBhIHBsYWNlIHRvIGRpc2N1c3MgdGhlDQogIG9uZ29pbmcgd29yayB0b2dl dGhlciBhbmQgc3luY2hyb25pc2UgYmV0d2VlbiB0aGUgRHVuZSBkZXZlbG9wZXJzDQogIDpzcGVl Y2hfYmFsbG9vbjoNCg0KDQo6Y2FsZW5kYXI6IEFnZW5kYQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGFnZW5kYSBpcyBhdmFpbGFi bGUgb24gdGhlWyBtZWV0aW5nIGRlZGljYXRlZCBwYWdlXS4gRmVlbCBmcmVlIHRvDQogIGFzayBp ZiB5b3Ugd2FudCB0byBhZGQgbW9yZSBpdGVtcyBpbiBpdC4NCg0KDQpbIG1lZXRpbmcgZGVkaWNh dGVkIHBhZ2VdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lraS9kZXYtbWVldGlu Zy0yMDI0LTEwLTMwPg0KDQoNCjpjb21wdXRlcjogTGlua3MNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBNZWV0aW5nIGxpbms6WyB6b29t XQ0KICDigKIgQ2FsZW5kYXIgZXZlbnQ6WyBnb29nbGUgY2FsZW5kYXJdDQoNCiAgV2lraSB3aXRo IGluZm9ybWF0aW9uIGFuZCBwcmV2aW91cyBub3RlczpbIEdpdEh1YiBXaWtpXQ0KDQoNClsgem9v bV0NCjxodHRwczovL3VzMDZ3ZWIuem9vbS51cy9qLzg1MDk2ODc3Nzc2P3B3ZD1jV05oVTFkSFEx Wk5Talp1T1VaQ1EwaDJieTlVZHowOT4NCg0KWyBnb29nbGUgY2FsZW5kYXJdDQo8aHR0cHM6Ly9j YWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL2VtYmVkP3NyYz1jXzVjZDY5OGRmNjc4NGUzODVi MWNkY2RjMWRiY2ExOGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzczMTklNDBncm91cC5j YWxlbmRhci5nb29nbGUuY29tPg0KDQpbIEdpdEh1YiBXaWtpXSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL2R1bmUvd2lraSNkZXYtbWVldGluZ3M+DQoNCg0KU2hlbGwgQ29tcGxldGlvbnMgaW4g RHVuZSBEZXZlbG9wZXIgUHJldmlldw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zaGVsbC1jb21wbGV0aW9ucy1pbi1kdW5lLWRl dmVsb3Blci1wcmV2aWV3LzE1NTIyLzE+DQoNCg0KU3RldmUgU2hlcnJhdHQgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBTdXBwb3J0IGZvciBkdW5lIHNoZWxsIGNvbXBsZXRpb25zIGZv ciBiYXNoIGFuZCB6c2ggaGFzIGp1c3QgbGFuZGVkIGluDQogIHRoZSBbRHVuZSBEZXZlbG9wZXIg UHJldmlld10hDQoNCiAgUnVubmluZyB0aGUgW2luc3RhbGxlcl0gYWRkcyBhIHNuaXBwZXQgdG8g eW91ciBzaGVsbCBjb25maWcNCiAgKGUuZy4gYC8uYmFzaHJjKSB0aGF0IGluc3RhbGxzIGEgY29t cGxldGlvbiBoYW5kbGVyIGZvciB+ZHVuZScuIFRoZQ0KICBjb21wbGV0aW9uIHNjcmlwdCB3YXMg dGFrZW4gZnJvbSBbaGVyZV0sIGFuZCB0aGF0IHBhZ2UgaGFzIHNvbWUNCiAgaW5mb3JtYXRpb24g YWJvdXQgaG93IHRoZSBzY3JpcHQgd2FzIGdlbmVyYXRlZC4gT25jZSBpdCdzIGluc3RhbGxlZA0K ICB0aGUgY29tcGxldGlvbnMgd2lsbCB3b3JrIGFueSB0aW1lIGBkdW5lJyBpcyB0eXBlZCBhdCB0 aGUgc3RhcnQgb2YgYQ0KICBjb21tYW5kLCBzbyB5b3UgY2FuIHN0aWxsIHVzZSB0aGUgY29tcGxl dGlvbnMgd2hlbiBydW5uaW5nIGEgdmVyc2lvbg0KICBvZiBEdW5lIGluc3RhbGxlZCB3aXRoIE9w YW0gb3IgeW91ciBzeXN0ZW0gcGFja2FnZSBtYW5hZ2VyIGFmdGVyDQogIGluc3RhbGxpbmcgdGhl IER1bmUgRGV2ZWxvcGVyIFByZXZpZXcuDQoNCiAgQ3VycmVudGx5IG9ubHkgY29tbWFuZCBjb21w bGV0aW9ucyBhcmUgc3VwcG9ydGVkLiBTbyB5b3UgY2FuIHJ1bjoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAkIGR1bmUgYzxUQUI+DQogIOKUgiBjYWNoZSAgY2xlYW4gIGNvcQ0KICDilJTilIDi lIDilIDilIANCg0KICDigKZvcjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIGR1bmUgYnVp bGQgLTxUQUI+DQogIOKUgiAtLWFjdGlvbi1zdGRlcnItb24tc3VjY2Vzcw0KICDilIIgLS1hY3Rp b24tc3Rkb3V0LW9uLXN1Y2Nlc3MNCiAg4pSCIC0tYWx3YXlzLXNob3ctY29tbWFuZC1saW5lDQog IOKUgiAtLWF1dG8tcHJvbW90ZQ0KICDilIIgLS1idWlsZC1kaXINCiAg4pSCIC0tYnVpbGQtaW5m bw0KICDilIIgLS1jYWNoZQ0KICDilIIgLi4uDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEJ1dCBp ZiB5b3UgcnVuIGBkdW5lIGJ1aWxkIDxUQUI+JyB0aGVuIGl0IHdpbGwgc3RpbGwgc3VnZ2VzdCBs b2NhbA0KICBmaWxlcyByYXRoZXIgdGhhbiBidWlsZCB0YXJnZXRzLg0KDQoNCltEdW5lIERldmVs b3BlciBQcmV2aWV3XSA8aHR0cHM6Ly9wcmV2aWV3LmR1bmUuYnVpbGQvPg0KDQpbaW5zdGFsbGVy XSA8aHR0cHM6Ly9wcmV2aWV3LmR1bmUuYnVpbGQvI2Rvd25sb2FkPg0KDQpbaGVyZV0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9ncmlkYnVncy9kdW5lLWNvbXBsZXRpb24tc2NyaXB0cz4NCg0KVHJ5IGl0 IG91dCENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEdldHRpbmcgc3Rh cnRlZCBpcyBlYXN5Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBjdXJsIC1mc1NMIGh0 dHBzOi8vZ2V0LmR1bmUuYnVpbGQvaW5zdGFsbCB8IHNoDQogIOKUgiAkIHNvdXJjZSB+Ly5iYXNo cmMgICMgb3I6IH5zb3VyY2Ugfi8uenNocmN+IG9yIGp1c3QgcmVzdGFydCB5b3VyIHNoZWxsDQog IOKUgiAkIGR1bmUgPFRBQj4NCiAg4pSCIGJ1aWxkDQogIOKUgiBjYWNoZQ0KICDilIIgY2xlYW4N CiAg4pSCIGNvcQ0KICDilIIgZGVzY3JpYmUNCiAg4pSCIGRpYWdub3N0aWNzDQogIOKUgiBleGVj DQogIOKUgiAuLi4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhl IG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1h bnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0K ICDigKIgW01lZXQgRE5Tdml6b3I6IHJ1biB5b3VyIG93biBESENQIGFuZCBETlMgTWlyYWdlT1Mg dW5pa2VybmVsXQ0KICDigKIgW0xvb2tpbmcgQmFjayBvbiBvdXIgRXhwZXJpZW5jZSBhdCBJQ0ZQ IV0NCiAg4oCiIFtSdW50aW1lIGFyZ3VtZW50cyBpbiBNaXJhZ2VPU10NCiAg4oCiIFtIb3cgaGFz IHJvYnVyIGZpbmFuY2lhbGx5IGJlZW4gZG9pbmcgc2luY2UgMjAxOD9dDQoNCg0KW3RoZSBvY2Ft bC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbTWVldCBETlN2aXpvcjog cnVuIHlvdXIgb3duIERIQ1AgYW5kIEROUyBNaXJhZ2VPUyB1bmlrZXJuZWxdDQo8aHR0cHM6Ly9i bG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvZG5zdml6b3IwMS5odG1sPg0KDQpbTG9va2luZyBCYWNr IG9uIG91ciBFeHBlcmllbmNlIGF0IElDRlAhXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8y MDI0LTEwLTIzLWxvb2tpbmctYmFjay1vbi1vdXItZXhwZXJpZW5jZS1hdC1pY2ZwPg0KDQpbUnVu dGltZSBhcmd1bWVudHMgaW4gTWlyYWdlT1NdDQo8aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0 aWNsZXMvYXJndW1lbnRzLmh0bWw+DQoNCltIb3cgaGFzIHJvYnVyIGZpbmFuY2lhbGx5IGJlZW4g ZG9pbmcgc2luY2UgMjAxOD9dDQo8aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvZmlu YW5jZXMuaHRtbD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5 b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQg SSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZl XSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28g d2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUN CiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUg YSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3Ro ZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZl ZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3du LnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9j YW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 22 to 29, 202= 4.

    HOL Light released to OPAM

    Juneyoung Lee announced

    The HOL Light interactive theorem prover written by John Harrison is releas= ed to OPAM as a package. Its first new version available on OPAM is 3.0. It now provides hol.sh which is a script that will launch an O= Caml REPL that enables interactive theorem proving. Combined with a VSCode = plugin for HOL Light, this gives a nice theorem proving experience..! For m= ore details, please visit:

    Could we add a tiny OCaml interpreter to Numworks graphical ca= lculators?

    Deep in this thread, Lilian Besson announced

    So after a few hours of work, we've successfully ported the OMicroB Virtual= Machine for OCaml to the Numworks calculator :tada: ! See this par= t of our discussion on GitHub, if anyone is curious.

    But we're far away from being done! Indeed, I want to be able to interpret = on the calculator some OCaml line of code / or entire file. I know it's probably going to be hard, if not entirely impossible, but hey = we've at least progressed a bit in this direction! Thanks @borisd again for= the suggestion! @Vertmo is helping me on this issue, thanks to him.

    opam 2.3.0~beta2

    Kate announced

    We're happy to announce the second beta release of opam 2.3.0.

    As we're closing on the final release of opam 2.3.0, we'd be happy for peop= le to test this beta and report any regression.

    What's new?

    This release consists mostly in one regression fix compared to 2.3.0~beta1:

    • Fix a regression in the detection of the current terminal size that lea= ds to opam output that tries to fit itself into 80 columns regardless of th= e current terminal size (#6243)

    A couple of other improvements were made. :open_book: You can read our blog post for more information, and for even more details y= ou can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are pretty much the same:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    3.0~beta2"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.3.0~beta2"
    

    Please report any issues to the bug-tracker.

    Editors dev-meeting #4, Thu. 31th: Search by type =C3=A0 la Sh= erlodoc =F0=9F=95=B5=EF=B8=8F

    vds announced

    We are organizing the next public dev-meeting on next Thursday, the 31th of= October at 5pm CEST (we have a local speaker). Whether you are a long time= maintainer, an occasional contributor, a new comer, or simply a curious pa= sser-by, please feel free to attend!

    :sparkles: For this session, @xvw is going to present a new Merlin feature= : an alternative to polarity search that can search for values in the envir= onment with a syntax similar as the one of the amazing Sherlodoc.

    3D"2616c436ecefc=

    :clipboard: Meeting agenda:

    • A tour-de-table to allow the participants that wish to do so to present= themselves and mention issues / prs they are interested in.
    • Talk and Q&A
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.

    We=E2=80=99re looking forward to meeting you!

    Meeting link: [meet.google.com/ncb-mnmp-kmk](meet.google.com/ncb-mnmp-kmk)

    Previous meeting notes are available in Merlin=E2=80=99s repository wiki = .

    Dune dev meeting

    Etienne Marais announced

    We will hold our regular Dune dev meeting tomorrow, on Wednesday, Octobe= r, 30th at 16:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronise between the Dune developers :speech_balloon:=20=20

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Wiki with information and previous notes: GitHub Wiki

    Shell Completions in Dune Developer Preview

    Steve Sherratt announced

    Support for dune shell completions for bash and zsh has just landed in the = Dune Developer Preview!

    Running the installer = adds a snippet to your shell config (e.g. /.bashrc) that installs a c= ompletion handler for ~dune. The completion script was taken from here, and= that page has some information about how the script was generated. Once it= 's installed the completions will work any time dune is typed = at the start of a command, so you can still use the completions when runnin= g a version of Dune installed with Opam or your system package manager afte= r installing the Dune Developer Preview.

    Currently only command completions are supported. So you can run:

    $ dune c<TAB>
    cache  clean  coq
    

    …or:

    $ dune build -<TAB>
    --action-stderr-on-success
    --action-stdout-on-success
    --always-show-command-line
    --auto-promote
    --build-dir
    --build-info
    --cache
    ...
    

    But if you run dune build <TAB> then it will still sugge= st local files rather than build targets.

    Try it out!

    Getting started is easy:

    $ curl -fsSL https://get.dune.build/install | sh
    $ source ~/.bashrc  # or: ~source ~/.zshrc~ or just restart your shell
    $ dune <TAB>
    build
    cache
    clean
    coq
    describe
    diagnostics
    exec
    ...
    

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=P7A6Xtbh; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Jq3SoD4l; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 1B0DAB80123 for ; Tue, 5 Nov 2024 13:22:51 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=lGQjVmU7i4sggw8n4EcSaFqMKxdVH7j+xyw+MAY0iv0=; b=P7A6Xtbh6sYZvQblcZrrLG55HjrFclEgE+zK+PNKnz20NyJBevVtFUt6 RmiKOpPzSCCewyrgXbYiTwQn/BYpTfUR4imbCHbWicg6/MlIyk4GN4oK1 WD0C62QqTTjqlxVkxx+OisqbXLvVVlUMJubt6Gblzr+rU+HS10tsAMK/U 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.11,260,1725314400"; d="scan'208,217";a="192263894" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 Nov 2024 14:22:51 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id DF149E0D25; Tue, 5 Nov 2024 14:22:50 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 52DBDE00B7 for ; Tue, 5 Nov 2024 14:22:48 +0100 (CET) IronPort-SDR: 672a1c26_lPi3HRo59AK2/DpDLkcAotXMBsIIaXcbJIUka9YljptgCZo QE8apBkv5T3pEUIZugs4GiyHswwTdHGvSAlH2Qw== X-IPAS-Result: =?us-ascii?q?A0GGBAAiGypngSIeaIFaFoJGAoE/WygZAWNaMwcISAOEF?= =?us-ascii?q?zyDT44fkUuKd4FWgVseFAEDAQ0uAQwGAQIEAQEDAQIBggyCdAKKNAIfBgEEM?= =?us-ascii?q?AkOAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABAT0FSYV7DUkBE?= =?us-ascii?q?AGBahk4Ux50AQEBAQEBAQEBAQEBAQEiAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMAYEQDgMGChMBATgYIwMUAQYDAhEBN?= =?us-ascii?q?QMBEwESGoIPWYIfRQMFDAaSXJtKeoEygQGCDAEBBoEIPgIBCwIFAQ4JJtoGg?= =?us-ascii?q?WQJgUiFaoJIGgEqSGoChEaDHYEfJw+BVUSBFTWBBm1Rb4I/CxcBAQEBgSgUA?= =?us-ascii?q?QFNCYMlgmmCKgwVahI4CYNiJYEWEIZigQ2EAYM8E4YggTSIP4FHSzMyAVUTF?= =?us-ascii?q?wsHBWCBGQOBeoFXgTmBUUOCXUqFG4EFOYIRaUs6Ag0CNoIkJFmCUINYgUWEc?= =?us-ascii?q?IRsfR1AAwttPTUUG514AQkxaQFGgl4OHx9aChgTARgRAgQcAjZDGQ8CCBEKB?= =?us-ascii?q?BEWBhkLDQQskk4oBSh0sSs0B4QdgV0GDIkDgSSVdoQEgVaLK5IGh0IimFUig?= =?us-ascii?q?jSHJIElCYFtaohwjCM8BCqFJoFnOoFcMxowQw0QAoJICUYcD1eNUwIBFoNYE?= =?us-ascii?q?IEugxs7vwxCNQIBAQ4pAgcBCgEBAwmFYgEBhTeEa4FLAQE?= IronPort-PHdr: A9a23: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 ZoKiBDH2PvlYJNRA3GbJw== IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:M26CTq+JGR7wjee0emduk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: =?us-ascii?q?9a23=3ANMn/YmoV5lfpdIDusfDEoGzmUeMvX0DR42/SGVS?= =?us-ascii?q?DG0ZjU7eNQ3PT06wxxg=3D=3D?= X-Talos-MUID: 9a23:A5zj4QTYID+VGuYhRXTTw25DM8RWwp6jS0kfsJkgoJSBZHZJbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.11,260,1725314400"; d="scan'208,217";a="100795364" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEUWwbsPewEjOwAVXB6jcvSVIzpePkvgbdRuK?= =?us-ascii?q?m1XNgvgzYMhYcwWiNrn/uawrcB6u/dNILyw29pGwjsn5VMUzRoLIys8W?= =?us-ascii?q?GttcuBwgfuhcTqRamZhpC5DxvvSRLrzDKDecLhjjg/BMgtfjia3BjZOq?= =?us-ascii?q?r4e6PWLvPLm94oj9qbRvUjWA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Nov 2024 14:22:47 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 7A1925649DD; Tue, 5 Nov 2024 14:22:45 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1730812965; bh=h1k64kAthfQggFoax+gOoXPT2PpXW79yl9V1eHbcLng=; h=From:To:Subject:Date:Message-ID; b=Jq3SoD4lVPnQd+bC6VPhlBLIkY9tju085EzSOiqamJGUGdQQp05njpRihfMaPXFQJ 7D/HQZ9MBNSD7U5TSmQ8UBbkR/cP2GnOabEhuQ5AyVCUsMnIaest36pv+Sb+/zEgJ4 zX/6B0gkOpV+RC9I8RIv3zq4fA9HIWUlPhoOL6gM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 05 Nov 2024 14:22:45 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 5 14:22:45 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.170633, queueID=B13FC5649DE X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19195 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 29 to November 05, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 GPTar 1.0.0 opam 2.3.0~rc1 Call for Contributions: BOB 2025 (Berlin, March 14 - Deadline Nov 15) First beta release for OCaml 5.3.0 dune 3.16 Other OCaml News Old CWN GPTar 1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Reynir Bj=C3=B6rnsson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce [GPTar] 1.0.0! GPTar is a small library to create a /tartition table/, that is, a tar archive that also contains a valid GUID partition table (GPT). It exploits the fact that the important areas of a protective MBR in GPT and a tar header are mostly disjoint. The tar header fits almost exactly in the boot strap code of a master boot record (MBR) with the last 54 bytes of the tar header overlapping with the partition table of the (protective) MBR. Thakfully, those are the 54 last bytes of the 155 byte long NUL terminated "filename prefix" of the tar header. So as long as we put a NUL byte before the partition table tar will happily ignore the partition table data. To further hide the actual GPT header & partition table from tar utilities the first tar header uses the GNU volume header extension with the GPT header & partition table as the "file contents". This makes GNU tar list the volume header but when extracting files the volume header is skipped. For *released* versions of bsdtar this unfortunately results in a "bad archive" error - however, the as-yet unreleased libarchive/bsdtar fixes this "bug" and allows for this abuse of volume headers (see the "update" blog post). For more in depth details you may be interested in reading the following two blog articles: =E2=80=A2 =E2=80=A2 [GPTar] Why!? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Great question. At [Robur] we developed an [opam-mirror] unikernel that acts as an opam repository and package source archive cache similar to . There we use tar as a filesystem for the package source archive cache. Later, we started using the end of the block device to cache data such as git state and computed package source archive checksums. The neat feature is we could use regular old bsdtar or GNU tar in the host system to inspect the tar filesystem data. The downside was the lack of a partition table using offsets provided by boot arguments for where to find the cached data. With GPTar we can have both! Inspect the tar filesystem data while being more robust with a partition table. Also, it was very fun to develop. [Robur] [opam-mirror] opam 2.3.0~rc1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce the first and hopefully only release candidate of opam 2.3.0. This version does not have any significant change compared to the previous 2.3.0~beta2 release and we hope the final release to also have no significant change. Regardless, we invite users to test this version to make sure there isn't any regressions. Unless a regression is spotted or another problem arises, we hope to have the final release of 2.3.0 out on the 12th of November. Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are pretty much the same: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.3.0~rc1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.3.0~rc1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to [the bug-tracker]. [the bug-tracker] Call for Contributions: BOB 2025 (Berlin, March 14 - Deadline Nov 15) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Later in this thread, Michael Sperber announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml content is most welcome at BOB - send us your proposal! First beta release for OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 One month and half after the release of the first alpha for OCaml 5.3.0, the release of OCaml 5.3.0 is drawing near. The internal API of the compiler libraries has been frozen, and most core developer tools support (or will support soon) the new version of the compiler. We have thus released a first beta version of OCaml 5.3.0 to help you update your software and libraries ahead of the release (see below for the installation instructions). More information about the whole release process is now available in the [compiler repository]. Compared to the first alpha release, this beta contains a few runtime or typechecker fixes, a handful of fixes for the runtime event library and other miscellaneous fixes. Exceptionally, this beta release also introduces a new flag `-keywords` for the compiler. This backward compatibility flag aims to help compiling old code that are using `effect` as a normal identifier, now that `effect` is a keyword in the new effect handler syntax. The progresses on stabilising the ecosystem are tracked on the [opam readiness for 5.3.0 meta-issue]. The full release is expected in the end of November or beginning of December, see the [new prospective calendar] for more information. If you find any bugs, please report them on [OCaml's issue tracker]. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.3.0 is available [on GitHub] and a short list of the changes since the last alpha is available below. [compiler repository] [opam readiness for 5.3.0 meta-issue] [new prospective calendar] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.3.0~beta1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.3.0~beta1+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 switch create 5.3.0~beta1+flambda+nffa ocaml-variants.5.3.0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array All available options can be listed with `opam search ocaml-option'. Changes since the first alpha =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Runtime fixes =E2=80=A2 [#13502]: Fix misindexing related to `Gc.finalise_last' that co= uld prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell) =E2=80=A2 [#13402], [#13512], [#13549], [#13553]: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat) =E2=80=A2 [#13520]: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by S=C3=A9bastien Hinderer and Miod Vallat) [#13502] [#13402] [#13512] [#13549] [#13553] [#13520] =E2=97=8A Typechecker fixes =E2=80=A2 [#13579], [#13583]: Unsoundness involving non-injective types + gadts (Jacques Garrigue, report by @v-gb, review by Richard Eisenberg and Florian Angeletti) =E2=80=A2 [#13388], [#13540]: raises an error message (and not an internal compiler error) when two local substitutions are incompatible (for instance `module type S:=3Dsig end type t:=3D(module S)') (Florian Angeletti, report by Nailen Matschke, review by Gabriel Scherer, and Leo White) [#13579] [#13583] [#13388] [#13540] =E2=97=8A Compiler flag =E2=80=A2 [#13471]: add `-keywords ' flag to define the li= st of keywords recognized by the lexer, for instance `-keywords 5.2' disable the `effect' keyword. (Florian Angeletti, review by Gabriel Scherer) [#13471] =E2=97=8A Runtime event library fixes =E2=80=A2 [#13419]: Fix memory bugs in runtime events system. (B. Szilva= sy and Nick Barnes, review by Miod Vallat, Nick Barnes, Tim McGilchrist, and Gabriel Scherer) =E2=80=A2 [#13407]: Add Runtime_events.EV_EMPTY_MINOR (Thomas Leonard) =E2=80=A2 [#13522]: Confirm runtime events ring is still active after callback. (KC Sivaramakrishnan, review by Sadiq Jaffer and Miod Vallat) =E2=80=A2 [#13529]: Do not write to event ring after going out of stw participant set. (KC Sivaramakrishnan, review by Sadiq Jaffer) [#13419] [#13407] [#13522] [#13529] =E2=97=8A Documentation =E2=80=A2 [#13424]: Fix `Gc.quick_stat' documentation to clarify that ret= urned fields `live_words', `live_blocks', `free_words', and `fragments' are not zero. (Jan Midtgaard, review by Damien Doligez and KC Sivaramakrishnan) =E2=80=A2 [#13440]: Update documentation of `Gc.{control,get,set}' to ref= lect fields not currently supported on OCaml 5. (Jan Midtgaard, review by Gabriel Scherer) =E2=80=A2 [#13469], [#13474], [#13535]: Document that [Hashtbl.create n] creates a hash table with a default minimal size, even if [n] is very small or negative. (Antonin D=C3=A9cimo, Nick Bares, report by Nikolaus Huber and Jan Midtgaard, review by Florian Angeletti, Anil Madhavapeddy, Gabriel Scherer, and Miod Vallat) [#13424] [#13440] [#13469] [#13474] [#13535] =E2=97=8A Standard library internal fix =E2=80=A2 [#13543]: Remove some String-Bytes conversion from the stdlib to behave better with js_of_ocaml (Hugo Heuzard, review by Gabriel Scherer) [#13543] =E2=97=8A Toplevel fix =E2=80=A2 [#13263], [#13560]: fix printing true and false in toplevel and error messages (no more unexpected #true) (Florian Angeletti, report by Samuel Vivien, review by Gabriel Scherer) [#13263] [#13560] =E2=97=8A Compiler internals =E2=80=A2 [#13391], [#13551]: fix a printing bug with `-dsource' when usi= ng raw literal inside a locally abstract type constraint (i.e. `let f: type #for. ...') (Florian Angeletti, report by Nick Roberts, review by Richard Eisenberg) [#13391] [#13551] dune 3.16 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We have release 3.16.1. This is a minor release of Dune to correct a bug related to the C++ compile. It comes with the following changes: 3.16.1 (2024-10-30) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C =E2=97=8A Fixed =E2=80=A2 Call the C++ compiler with `-std=3Dc++11' when using OCaml >=3D= 5.0 (#10962, @kit-ty-kate) Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Making Crypto Safer: Introducing the ARGOS Project] =E2=80=A2 [Postes, t=C3=A9l=C3=A9graphes et t=C3=A9l=C3=A9phones, next st= eps] =E2=80=A2 [GPTar (update)] [the ocaml.org blog] [Making Crypto Safer: Introducing the ARGOS Project] [Postes, t=C3=A9l=C3=A9graphes et t=C3=A9l=C3=A9phones, next steps] [GPTar (update)] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 29 to Novembe= r 05, 2024.

    GPTar 1.0.0

    Reynir Bj=C3=B6rnsson announced

    Why!?

    Great question. At Robur we developed a= n opam-mirror uni= kernel that acts as an opam repository and package source archive cache sim= ilar to https://opam.ocaml.org/. Th= ere we use tar as a filesystem for the package source archive cache. Later,= we started using the end of the block device to cache data such as git sta= te and computed package source archive checksums.

    The neat feature is we could use regular old bsdtar or GNU tar in the host = system to inspect the tar filesystem data. The downside was the lack of a p= artition table using offsets provided by boot arguments for where to find t= he cached data. With GPTar we can have both! Inspect the tar filesystem dat= a while being more robust with a partition table.

    Also, it was very fun to develop.

    opam 2.3.0~rc1

    Kate announced

    We're happy to announce the first and hopefully only release candidate of o= pam 2.3.0.

    This version does not have any significant change compared to the previous = 2.3.0~beta2 release and we hope the final release to also have no significant change. Regardless, we invite users to test this version to make sure there isn't a= ny regressions.

    Unless a regression is spotted or another problem arises, we hope to have t= he final release of 2.3.0 out on the 12th of November.

    Try it!

    The upgrade instructions are pretty much the same:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    3.0~rc1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.3.0~rc1"
    

    Please report any issues to the bug-tracker.

    Call for Contributions: BOB 2025 (Berlin, March 14 - Deadline = Nov 15)

    Later in this thread, Michael Sperber announced

    OCaml content is most welcome at BOB - send us your proposal!

    First beta release for OCaml 5.3.0

    octachron announced

    One month and half after the release of the first alpha for OCaml 5.3.0, th= e release of OCaml 5.3.0 is drawing near.

    The internal API of the compiler libraries has been frozen, and most core d= eveloper tools support (or will support soon) the new version of the compil= er.

    We have thus released a first beta version of OCaml 5.3.0 to help you updat= e your software and libraries ahead of the release (see below for the insta= llation instructions). More information about the whole release process is = now available in the compiler repository.

    Compared to the first alpha release, this beta contains a few runtime or ty= pechecker fixes, a handful of fixes for the runtime event library and other= miscellaneous fixes.

    Exceptionally, this beta release also introduces a new flag `-keywords` for= the compiler. This backward compatibility flag aims to help compiling old = code that are using `effect` as a normal identifier, now that `effect` is a= keyword in the new effect handler syntax.

    The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.= 3.0 meta-issue.

    The full release is expected in the end of November or beginning of Decembe= r, see the new prospective calendar for more information.

    If you find any bugs, please report them on OCaml's issue tracker.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.3.0 is available on GitHub and a short = list of the changes since the last alpha is available below.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.3.0~beta1
    

    The source code for the beta is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.3.0~beta1+options &=
      lt;option_list>
      

      where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

      opam
      

      switch create 5.3.0~beta1+flambda+nffa ocaml-variants.5.3.0~beta1+options o= caml-option-flambda ocaml-option-no-flat-float-array

      All available options can be listed with opam search ocaml-option.

    Changes since the first alpha

    • Runtime fixes
      • #13502: Fix= misindexing related to Gc.finalise_last that could prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell)
      • #13402, #13512, #13549, #13553: Revise bytecode implemen= tation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
      • #13520: Fix= compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by S=C3=A9bastien Hinderer and Miod Vallat)
    • Typechecker fixes
      • #13579, #13583: Unsoundnes= s involving non-injective types + gadts (Jacques Garrigue, report by @v-gb, review by Richard Eisenberg and Florian Angeletti)
      • #13388, #13540: raises an = error message (and not an internal compiler error) when two local substitutions are incompatible (for instance module ty= pe S:=3Dsig end type t:=3D(module S)) (Florian Angeletti, report by Nailen Matschke, review by Gabriel Scherer, a= nd Leo White)
    • Compiler flag
      • #13471: add= -keywords <version?+list> flag to define the list of ke= ywords recognized by the lexer, for instance -keywords 5.2 disable th= e effect keyword. (Florian Angeletti, review by Gabriel Scherer)
    • Runtime event library fixes
      • #13419: Fix= memory bugs in runtime events system. (B. Szilvasy and Nick Barnes, review by Miod Vallat, Nick Barnes, Tim McGilchrist, and Gabriel Scherer)
      • #13407: Add= Runtime_events.EV_EMPTY_MINOR (Thomas Leonard)
      • #13522: Con= firm runtime events ring is still active after callback. (KC Sivaramakrishnan, review by Sadiq Jaffer and Miod Vallat)
      • #13529: Do = not write to event ring after going out of stw participant set. (KC Sivaramakrishnan, review by Sadiq Jaffer)
    • Documentation
      • #13424: Fix= Gc.quick_stat documentation to clarify that returned fields live_words, live_blocks, free_words,= and fragments are not zero. (Jan Midtgaard, review by Damien Doligez and KC Sivaramakrishnan)
      • #13440: Upd= ate documentation of Gc.{control,get,set} to reflect fields not currently supported on OCaml 5. (Jan Midtgaard, review by Gabriel Scherer)
      • #13469, #13474, #13535: Document that [Ha= shtbl.create n] creates a hash table with a default minimal size, even if [n] is very small or negative. (Antonin D=C3=A9cimo, Nick Bares, report by Nikolaus Huber and Jan Midtgaar= d, review by Florian Angeletti, Anil Madhavapeddy, Gabriel Scherer, and Miod Vallat)
    • Standard library internal fix
      • #13543: Rem= ove some String-Bytes conversion from the stdlib to behave better with js_of_ocaml (Hugo Heuzard, review by Gabriel Scherer)
    • Toplevel fix
      • #13263, #13560: fix printi= ng true and false in toplevel and error messages (no more unexpected #true) (Florian Angeletti, report by Samuel Vivien, review by Gabriel Scherer)
    • Compiler internals
      • #13391, #13551: fix a prin= ting bug with -dsource when using raw literal inside a locally abstract type constraint (i.e. let f: type #for. ...) (Florian Angeletti, report by Nick Roberts, review by Richard Eisenberg)

    dune 3.16

    Etienne Marais announced

    We have release 3.16.1. This is a minor release of Dune to correct a bug re= lated to the C++ compile. It comes with the following changes:

    3.16.1 (2024-10-30)

    • Fixed
      • Call the C++ compiler with -std=3Dc++11 when using OCaml &= gt;=3D 5.0 (#10962, @kit-ty-kate)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=W//aDg8m; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Ch86oxbb; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D1D62B80123 for ; Tue, 12 Nov 2024 15:00:30 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=nHiIbRdg6S3Qxf5l3Wk4GiJe+6prS95K3Ev/2ahadFs=; b=W//aDg8mb/L9aztUq/0sPUEWyHF4o4C3mURNjTZaoXKxUrYN8IYM95zD M9acmgKVEGvvKqRS8IbXQLf0m+mW99Ts6bVCuDFjjrge13OdDbLofC7xG uYsK9W163a9OJ6bsVRrQQhEO7AmJgfI0fqUqkbe2p722shLpSw/HukqMc k=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,148,1728943200"; d="scan'208,217";a="193413683" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 Nov 2024 16:00:29 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 240B9E0D22; Tue, 12 Nov 2024 16:00:29 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 9774FE00B7 for ; Tue, 12 Nov 2024 16:00:23 +0100 (CET) IronPort-SDR: 67336d86_ZLKL6hFi8XSNV4KQOt6MN8+DQlwfAvyC77YBGGXW4HkXqYL GgoJW5iYQq6qBkgyBGlfs8mHIuByUzXw7u2xVVg== X-IPAS-Result: =?us-ascii?q?A0GjBwC0bDNngSIeaIFaFoJGgUFbKBkBXQZaMwcISIRWg?= =?us-ascii?q?0+FLYhygRWQNop3gVYUgREDGBYjFAEDAQ0uAQUNAQIEAQEDAQIBhQACijsCH?= =?us-ascii?q?wYBBDIHDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9BUmFe?= =?us-ascii?q?w2CRVFTHmEEAwYGAQEBAQEBAQEBAQEBAQEiAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMATMEC1wJChMBATgYIwMQBAEGA?= =?us-ascii?q?wIRATUXARIagg9Zgh9FAwQBDAaUe5p6Gjd6gTKBAYIMAQEGgQg+AgELAgIDD?= =?us-ascii?q?y4B2gaBGkoJgUiFaoJIGgEqSGoChEaEPCcPgVVEgRWCC25vgj8FBgwLAQEBA?= =?us-ascii?q?RiBCBwBAQJLCYMlgmmCMxKBNQmCaWQSIwKBFhCGYoENg3+DNBOCMoIggUyBM?= =?us-ascii?q?4k4gUciAyYzMgFVExcLBwVggRYDgXuBVoE5gVFDgl1KhRqBBTmCEWlLOgINA?= =?us-ascii?q?jaCJCRZgk+DWIFChG2EZoIhHUADC209NRQbnkQBCTNpAUaCYQ4fGQYBWBwVB?= =?us-ascii?q?QEHDBIEAQEgAiwCBAQODQgWCigXBQUBAysfCAMLLwOSThAYgSGcVZRbNAeEH?= =?us-ascii?q?YFdBgyJA4EklXaEBIFWiyuHAJJIIphVIoI0hyEDgSUJX4EOHkyIfowVECwCN?= =?us-ascii?q?4UcgVEdDiU8bxwFCQczGjBDgmcJCjwcD44qAheBSXGBHhCBLoEmgXU7gm29K?= =?us-ascii?q?0I1AgEBNwIHAQoBAQMJhUUdAQGJQIFLAQE?= IronPort-PHdr: A9a23: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 w== IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:3JayBKDL+FfvyUDlHemR55DYdb4zR+YMi2TDtnoBKiC9F/bzqy nAppomPHPP5Qr5O0tBpTnjAsi9qBrnnPYf3WB7B9iftWfd1FeAHcVL0s/JwjHrGSHyn9Qtt5 tIQuxZE9O1KVB7iK/BkW2F+jsbsby6zJw= X-Talos-CUID: =?us-ascii?q?9a23=3ACVrwSmhSTh1KAG5NULHMsPqK7zJuKlDdnFLrJEK?= =?us-ascii?q?BKU12RreHRFOwu4Enup87?= X-Talos-MUID: =?us-ascii?q?9a23=3AIl7GFA0s0/hQgU5SrcQzoe1PzzUj6Z6NLxgfs8Q?= =?us-ascii?q?8uIqUBBJ7CRqngg+Fa9py?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,148,1728943200"; d="scan'208,217";a="193413618" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFMPTxQUtQC0hKj6BKopLM8KbITWqM2nLXFqX?= =?us-ascii?q?gmZ6FWoK8Is7NSSpmCMTczdwkU3FKEapWJMxTACoNwUCoTzyrG6kYBc6?= =?us-ascii?q?W0WyVZRWf8Is71wEYwIr2FoZycRa++3LXLE7G+cplwk0FqIOv4MIQnkN?= =?us-ascii?q?X+3ngaX06bUc1cbSyMcJqPcA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Nov 2024 16:00:22 +0100 Received: from TM.local (88-121-115-170.subs.proxad.net [88.121.115.170]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 39429564A30; Tue, 12 Nov 2024 16:00:20 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1731423621; bh=UDHvvkpG04xUl6pLtKB8AFdzGpglTdHcr441FJRi5H8=; h=From:To:Subject:Date:Message-ID; b=Ch86oxbbFCk1MO0dpRcY5BiMyLx/1Ud759MPhrOhzNVCS6P+alCsPzT0zqp/Gih2k UXaJdEgYp+zXYB0371IzrBOCl2b1B63ZH8nJOnWzbquX9RqP1Bjxa1i4o1v/4H1NNX Iki8R3+f4KPW/oBOj0U5sSwmtLo+g7KFq0Pc27cM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 12 Nov 2024 16:00:19 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 12 16:00:21 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.046131, queueID=C3DF7564A31 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19198 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 05 to 12, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Picos =E2=80=94 Interoperable effects based concurrency findlib-1.9.7 First release candidate for OCaml 5.2.1 mirage-swapfs Dune dev meeting Other OCaml News Old CWN Picos =E2=80=94 Interoperable effects based concurrency =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: polytypic announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I'm happy to announce that Picos version 0.6.0 has been released! Picos is a systems programming interface between effects based schedulers and concurrent abstractions. A lot of work has been done on Picos since previous announcements. You might start on the new minimalist landing page for [Picos], which, among other things, allows you to access the documentation of all the released Picos versions. Also, in case you missed it, a recording of the talk [Picos =E2=80=94 Interoperable effects based concurrency] can be found [here]. We also held a workshop on concurrency and parallelism at [Fun OCaml]. You might enjoy trying out [the exercise we developed for the workshop]. As, for reasons of dependencies, Picos now comes in no less than [8 packages] and multiple libraries, here is a summary of the packages and the libraries inside each package: =E2=80=A2 [`picos'] =E2=80=94 Picos =E2=80=94 Interoperable effects based= concurrency =E2=80=A2 [`picos'] =E2=80=94 A systems programming interface between e= ffects based schedulers and concurrent abstractions =E2=80=A2 [`picos.domain'] =E2=80=94 Minimalistic domain API available = both on OCaml 5 and on OCaml 4 =E2=80=A2 [`picos.thread'] =E2=80=94 Minimalistic thread API available = with or without threads.posix =E2=80=A2 [`picos_mux'] =E2=80=94 Sample schedulers for Picos =E2=80=A2 [`picos_mux.fifo'] =E2=80=94 Basic single-threaded effects ba= sed Picos compatible scheduler for OCaml 5 =E2=80=A2 [`picos_mux.multififo'] =E2=80=94 Basic multi-threaded effect= s based Picos compatible scheduler for OCaml 5 =E2=80=A2 [`picos_mux.random'] =E2=80=94 Randomized multi-threaded effe= cts based Picos compatible scheduler for OCaml 5 =E2=80=A2 [`picos_mux.thread'] =E2=80=94 Basic Thread based Picos compa= tible scheduler for OCaml 4 =E2=80=A2 [`picos_std'] =E2=80=94 Sample libraries for Picos =E2=80=A2 [`picos_std.finally'] =E2=80=94 Syntax for avoiding resource = leaks for Picos =E2=80=A2 [`picos_std.awaitable'] =E2=80=94 Basic futex-like awaitable = atomic location for Picos =E2=80=A2 [`picos_std.event'] =E2=80=94 Basic event abstraction for Pic= os =E2=80=A2 [`picos_std.structured'] =E2=80=94 Basic structured concurren= cy primitives for Picos =E2=80=A2 [`picos_std.sync'] =E2=80=94 Basic communication and synchron= ization primitives for Picos =E2=80=A2 [`picos_io'] =E2=80=94 Asynchronous IO system for Picos =E2=80=A2 [`picos_io'] =E2=80=94 Basic IO facilities based on OCaml sta= ndard libraries for Picos =E2=80=A2 [`picos_io.select'] =E2=80=94 Basic Unix.select based IO even= t loop for Picos =E2=80=A2 [`picos_io.fd'] =E2=80=94 Externally reference counted file d= escriptors =E2=80=A2 [`picos_io_cohttp'] =E2=80=94 Cohttp running on Picos IO =E2=80=A2 [`picos_io_cohttp'] =E2=80=94 Minimalistic Cohttp implementat= ion using Picos_io for Picos =E2=80=A2 [`picos_lwt'] =E2=80=94 Lwt interface for Picos =E2=80=A2 [`picos_lwt'] =E2=80=94 Direct style Picos compatible interfa= ce to Lwt for OCaml 5 =E2=80=A2 [`picos_lwt.unix'] =E2=80=94 Direct style Picos compatible in= terface to Lwt with Lwt_unix for OCaml 5 =E2=80=A2 [`picos_aux'] =E2=80=94 Auxiliary libraries for Picos =E2=80=A2 [`picos_aux.htbl'] =E2=80=94 Lock-free hash table =E2=80=A2 [`picos_aux.mpmcq'] =E2=80=94 Lock-free multi-producer, multi= -consumer queue =E2=80=A2 [`picos_aux.mpscq'] =E2=80=94 Lock-free multi-producer, singl= e-consumer queue =E2=80=A2 [`picos_aux.rc'] =E2=80=94 External reference counting tables= for disposable resources =E2=80=A2 [`picos_meta'] =E2=80=94 Integration tests for Picos packages In addition to the above, [Moonpool] now uses Picos underneath. And, I almost forgot, there is a ready to be merged [PR for Kcas to change it to use Picos]. You should be able to try it with an opam [pin-depends]. [Picos] [Picos =E2=80=94 Interoperable effects based concurrency] [here] [Fun OCaml] [the exercise we developed for the workshop] [8 packages] [`picos'] [`picos'] [`picos.domain'] [`picos.thread'] [`picos_mux'] [`picos_mux.fifo'] [`picos_mux.multififo'] [`picos_mux.random'] [`picos_mux.thread'] [`picos_std'] [`picos_std.finally'] [`picos_std.awaitable'] [`picos_std.event'] [`picos_std.structured'] [`picos_std.sync'] [`picos_io'] [`picos_io'] [`picos_io.select'] [`picos_io.fd'] [`picos_io_cohttp'] [`picos_io_cohttp'] [`picos_lwt'] [`picos_lwt'] [`picos_lwt.unix'] [`picos_aux'] [`picos_aux.htbl'] [`picos_aux.mpmcq'] [`picos_aux.mpscq'] [`picos_aux.rc'] [`picos_meta'] [Moonpool] [PR for Kcas to change it to use Picos] [pin-depends] findlib-1.9.7 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gerd Stolpmann announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 findlib-1.9.7 is out. This is mostly a bugfix release. There is now also some support for relocability (driven by environment variables), contributed by Marek Kubica. For manual, download, manuals, etc. see here: An updated OPAM package will follow soon. First release candidate for OCaml 5.2.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml version 5.2.1 is imminent. OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backported from the 5.3 branch of OCaml. The full list of bug fixes is available below. In order to ensure that the future release works as expected, we are planning to test a release candidate during the upcoming week. If you find any bugs, please report them here on [GitHub]. [GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.2.1~rc1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the release candidate is available on =E2=80=A2 [GitHub] =E2=80=A2 [Inria archives] [GitHub] [Inria archives] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.2.1~rc1+optio= ns =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `` is a space-separated list of `ocaml-option-*` packages. For instance, for a `flambda` and `no-flat-float-array` switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.2.1~rc1+flambda+nffa ocaml-variants.5.2.1~= rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option`. *Changes Since OCaml 5.2.0* Runtime System: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 [#13207]: Be sure to reload the register caching the exception handler in caml_c_call and caml_c_call_stack_args, as its value may have been changed if the OCaml stack is expanded during a callback. (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and Xavier Leroy) =E2=80=A2 [#13252]: Rework register assignment in the interpreter code on= m68k on Linux, due to the %a5 register being used by Glibc. (Miod Vallat, report by St=C3=A9phane Glondu, review by Gabriel Scherer and Xavier Leroy) =E2=80=A2 [#13268]: Fix a call to test in configure.ac that was causing e= rrors when LDFLAGS contains several words. (St=C3=A9phane Glondu, review by Miod Vallat) =E2=80=A2 [#13234], [#13267]: Open runtime events file in read-write mode= on armel (armv5) systems due to atomic operations limitations on that platform. (St=C3=A9phane Glondu, review by Miod Vallat and Vincent Laviron) =E2=80=A2 [#13188]: fix races in the FFI code coming from the use of Int_val(=E2=80=A6) on rooted values inside blocking questions / withou= t the runtime lock. (Calling Int_val(=E2=80=A6) on non-rooted immediates is = fine, but any access to rooted values must be done outside blocking sections / with the runtime lock.) (Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole) =E2=80=A2 [#13318]: Fix regression in GC alarms, and fix them for flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer) =E2=80=A2 [#13140]: POWER back-end: fix issue with call to `caml_call_realloc_stack` from a DLL (Xavier Leroy, review by Miod Vallat) =E2=80=A2 [#13370]: Fix a low-probability crash when calling Gc.counters. (Demi Marie Obenour, review by Gabriel Scherer) =E2=80=A2 [#13402], [#13512], [#13549], [#13553]: Revise bytecode implementation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat) =E2=80=A2 [#13502]: Fix misindexing related to `Gc.finalise_last` that co= uld prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell) =E2=80=A2 [#13520]: Fix compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by S=C3=A9bastien Hinderer and Miod Vallat) [#13207] [#13252] [#13268] [#13234] [#13267] [#13188] [#13318] [#13140] [#13370] [#13402] [#13512] [#13549] [#13553] [#13502] [#13520] mirage-swapfs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Reynir Bj=C3=B6rnsson announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce the first release of [mirage-swapfs] (swapfs on opam). It is an experimental library to use a mirage block device for ephemeral, append-only, anonymous "files". It was developed for use cases such as in [opam-mirror] where opam package source archives are downloaded. The files are first downloaded to "swap" and if the download succeeds and the checksum is as expected the data is then copied over to the tar filesystem. Internally it uses a weak pointer array (`Weak.t') to map "block" offsets to handles. The idea is the garbage collector can help us free up "blocks" if the user forgets to explicitly free the handle. A "block" is (configurable, see `blocking_factor') multiple of sectors in order to reduce bookkeeping overhead. With a sector size of 512 bytes the default is 1 MiB per block. See also the documentation I would be interested to hear about other ideas or approaches. [mirage-swapfs] [opam-mirror] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We will hold our regular Dune dev meeting tomorrow, on Wednesday, November, 13th at *9:00* CET. :warning: Note that the session has been moved *one hour earlier*. As usual, the session will be one hour long. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronise between the Dune developers !:smile: :calendar: Agenda =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The agenda is available on the [meeting dedicated page]. Feel free to ask if you want to add more items in it. [meeting dedicated page] :computer: Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Meeting link:[ zoom] =E2=80=A2 Calendar event:[ google calendar] =E2=80=A2 Wiki with information and previous notes:[ GitHub Wiki] [ zoom] [ google calendar] [ GitHub Wiki] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Beta release of Frama-C 30.0~beta (Zinc)] =E2=80=A2 [Making OCaml Mainstream: Support Our Open Source Work on GitHu= b] [the ocaml.org blog] [Beta release of Frama-C 30.0~beta (Zinc)] [Making OCaml Mainstream: Support Our Open Source Work on GitHub] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=O62izJf8; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=X/+R5u59; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 591BFB80123 for ; Tue, 19 Nov 2024 06:52:47 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=ZlO7QiOPr+uP+dE29eKxP7m8F2OErHASgDF0tL8VFtM=; b=O62izJf8UQ+caiXDi9rU8zue/6xuTAVQSnpiIuWJoYsn+t5o06sfNfY1 pnel2k4W1FjGOhGOy487raAUVibMLioHZcKONKU5k9rbR6PrxFkd8ldBm Uvbub2CBylFt2LSqCIYXhaPtBqDO4VRlxiqbH/f1qHzw3ZpgpVSOPrrjq Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,165,1728943200"; d="scan'208,217";a="194557806" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Nov 2024 07:52:47 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6341DE0D1E; Tue, 19 Nov 2024 07:52:47 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id CE5C7E00B7 for ; Tue, 19 Nov 2024 07:52:44 +0100 (CET) IronPort-SDR: 673c35a8_G0xHUB4LHrBTjpPRKmTstGWdS5olUXWQQbh2V41dyegJzve WhyVoyq6/3v6+ghDFf/ku83CDy4BbrmwnmEgY+Q== X-IPAS-Result: =?us-ascii?q?A0EEAwBvNTxngSIeaIFSCIJcAoE/gQMZAWNaMwcISAOEU?= =?us-ascii?q?4NPhS2IcoEWkDeISIIvgVaBJQMYFiMUAQMBDS4BDAYBAgQBAQMBAgGFAAIWi?= =?us-ascii?q?joCHwYBBDAJDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9B?= =?us-ascii?q?UmFew1JAQwBgW5RcWUJNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQIMATBuAQgKEwEBJhIYFA8DEAQBBgMCBA0BNQMBEwESG?= =?us-ascii?q?gGCZ4IfRQMEAQwGP5Q2mnoaN3qBMoEBggwBAQaBCD4CAQsCBQEOCSbaBoFkC?= =?us-ascii?q?YFIhWqCSBoBKkhqAoRGCYQzJw+BVUSBFYIoSgdvgj8EBwwLAQEBAQEXgR8FA?= =?us-ascii?q?QEIRQmDJYJpgkUtOhI4CYEsgTN2JU1Gg3OCbIENgW+CEIM0ElaBW4IggT8dH?= =?us-ascii?q?TNGgRJciSeBRyIDJjMyAVUTFwsHBWCBFgOBeYFNgTaBUUOCTkqFDIEFOYIRa?= =?us-ascii?q?Us3Ag0CNoIkJFmCT4NYgT+EbIRehCMdQAMLbT01FBufMwEJM2kBRoI6LQIKB?= =?us-ascii?q?B8fAgUQShQHCQUFAQUCDBYBAQQeDSUEBRQUBwUHAxUDAR0XAxgCASwLCwIrA?= =?us-ascii?q?pI/FBIWLAGdTpIQgUGBCjQHhB2BXQYMiQOBJI4th02EBE2BCosrhwCRI4ElI?= =?us-ascii?q?phVIoI0hyEDCoEbCYFtaokAjFIEEiOFHYFRFjqBKx4DCQczGjBDgmcJRhwPj?= =?us-ascii?q?ioZgnpegT6BJoF1O8ESQjUCAQEECikCBwEKAQEDCYVFHQEBZ4M4hTxrA10BA?= =?us-ascii?q?Q?= IronPort-PHdr: A9a23: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 l570A== IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:QvOkW67bKmZ7sw25hAPXwPXXdLJyesId70hD6qkRc203TiX8ra qTdZsguyMc5Ax9ZJhCo7C90cu7IE80nKQdieIs1NyZMzUO1lHFEKhSqaPchxfgFyf9+uM179 YDT4FOTPvqAxxfhcb+iTPId+rILeP3lZyVuQ== X-Talos-CUID: =?us-ascii?q?9a23=3AltdFlGlFCjde6UWknfRQgnULpIPXOVyCxV7qKF+?= =?us-ascii?q?bM2dWRLuYSGGb6IQ+nfM7zg=3D=3D?= X-Talos-MUID: 9a23:H/1M1Avr5ZtAeU5gEc2ntBFHF/ts+P2VBEEDzsoMoZCULTRgNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,165,1728943200"; d="scan'208,217";a="101995294" X-MGA-submission: =?us-ascii?q?MDEmiCcnKuEAnwh231+Xi6/LqeMcTwUgg0GZSu?= =?us-ascii?q?sZOjbW15slQKvUiZfVZ3UErpZA8VoGzrE1fyX1JO43uM1XfWj5ylv4kZ?= =?us-ascii?q?fmjwWUY0u47IeCNt0cYRByMTqc1dr1Lybtn+l2DolcwNxOSQXbHrBWrM?= =?us-ascii?q?E/xrkenu/CdLnZ9aovltL4pg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Nov 2024 07:52:24 +0100 Received: from TM.local (cust-east-par-46-193-107-66.cust.wifirst.net [46.193.107.66]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E7221564ADC; Tue, 19 Nov 2024 07:52:22 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1731999143; bh=UN4hSkKEVYEOLl3WMkmtW8eNy5llFWZgS7vcxuf9QKw=; h=From:To:Subject:Date:Message-ID; b=X/+R5u59P5DSpp3/lDz9BKtLzbiin8HX//7GCuucZKlRrIMbLZT5Rnp4qlwtWMeKB 4R8ilWicDV8khUbvDXg8HrAH6L815e1+m9NyQY5XRQSS7ZzIxCCDM0lSYnKrcMWPYr J2jdkqUyOiBv+/1oqs7auimw4oijcACqipvsaS2Q= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 19 Nov 2024 07:52:22 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 19 07:52:23 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498242, queueID=5C686564ADD X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19210 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMTIgdG8gMTksDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkJvdWxk ZXIgRGFzaCBpbiBPQ2FtbA0KSmFuZSBTdHJlZXQgT0NhbWwgZXh0ZW5zaW9ucyDigJMgbm93IHdp dGggZGV2ZWxvcGVyIHRvb2xpbmchDQpvcGFtIDIuMy4wIGlzIG91dCENCkluc3RhbGxpbmcgRGV2 ZWxvcGVyIFRvb2xzIHdpdGggRHVuZQ0KRHVuZSBEZXZlbG9wZXIgUHJldmlldyBVcGRhdGVzDQpG aXJzdCByZWxlYXNlIG9mIGNtZGxhbmcNCmZpbmRsaWItMS45LjgNClRlc3RvIDAuMS4wIC0gYSBu ZXcgdGVzdGluZyBmcmFtZXdvcmsgZm9yIE9DYW1sDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dO DQoNCg0KQm91bGRlciBEYXNoIGluIE9DYW1sDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9hcmMvY2FtbC1saXN0LzIwMjQtMTEvbXNnMDAwMDcu aHRtbD4NCg0KDQpBbmRyZWFzIFJvc3NiZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgQm91bGRlciBEYXNoKCopIHdhcyBteSBmYXZvdXJpdGUgY29tcHV0ZXIgZ2FtZSBp biB0aGUgOC1iaXQgZXJhLCBmaXJzdA0KICByZWxlYXNlZCBvbiB0aGUgQXRhcmkgNDAwLzgwMCBp biAxOTg0LiBUaG91Z2ggSSBuZXZlciBvd25lZCBhbiA4LWJpdA0KICBtYWNoaW5lIG15c2VsZiwg SSBoYWQgZnJpZW5kcyB0aGF0IEkgYW5ub3llZCBlbm91Z2ggdG8gbGV0IG1lIHBsYXkgaXQNCiAg b24gdGhlaXJzLg0KDQogIEFzIGEgaG9tYWdlIHRvIGl0cyA0MHRoIGFubml2ZXJzYXJ5LCBJIHB1 dCB0b2dldGhlciBhIGZhaXJseSBmYWl0aGZ1bA0KICBjbG9uZSBvZiB0aGUgb3JpZ2luYWwgZ2Ft ZSwgaW1wbGVtZW50ZWQgaW4ganVzdCBhIGZldyAxMDAgbGluZXMgb2YNCiAgYmFyZSBPQ2FtbCwg d2l0aCBub3RoaW5nIGJ1dCB0aGUgaG9tZWx5IEdyYXBoaWNzIGxpYnJhcnkuICBJdCBzaG91bGQN CiAgcnVuIG9uIFdpbmRvd3MsIE1hYywgYW5kIExpbnV4LCB0aG91Z2ggSSB3YXMgdG9vIGxhenkg dG8gdGVzdCB0aGUNCiAgbGF0dGVyLg0KDQogIEZlYXR1cmVzOg0KICDigKIgRmFpdGhmdWwgb3Jp Z2luYWwgcGh5c2ljcywgZ3JhcGhpY3MsIGFuZCBhbmltYXRpb25zDQogIOKAoiBBdXRoZW50aWMg c2Nyb2xsaW5nIG1lY2hhbmljcyBjb21iaW5lZCB3aXRoIGR5bmFtaWMgd2luZG93IHJlc2l6aW5n DQogIOKAoiBBbGwgMjAgbGV2ZWxzLCBpbmNsdWRpbmcgaW50ZXJtaXNzaW9ucywgYW5kIDUgZGlm ZmljdWx0aWVzDQogIOKAoiBQYXVzZS1hbmQtZ28gbW9kZSBmb3IgcmVsYXhlZCBwbGF5aW5nDQoN CiAgSXQgaXMgb3Blbi1zb3VyY2UgaGVyZToNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL3Jvc3Ni ZXJnL2JvdWxkZXItZGFzaD4NCg0KICBFbmpveSENCg0KICAvQW5kcmVhcw0KDQogICgqKSA8aHR0 cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQm91bGRlcl9EYXNoXyh2aWRlb19nYW1lKT4gIkJv dWxkZXINCiAgICAgIERhc2giIGlzIGEgdHJhZGVtYXJrIG9mIEJCRyBFbnRlcnRhaW5tZW50DQoN Cg0KSmFuZSBTdHJlZXQgT0NhbWwgZXh0ZW5zaW9ucyDigJMgbm93IHdpdGggZGV2ZWxvcGVyIHRv b2xpbmchDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1qYW5lLXN0cmVldC1vY2FtbC1leHRlbnNpb25zLW5vdy13aXRoLWRldmVsb3Blci10b29s aW5nLzE1NTk3LzE+DQoNCg0KRGlhbmEgS2FsaW5pY2hlbmtvIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhIFdlJ3ZlIGp1c3QgcmVsZWFzZWQg YSBuZXcgdmVyc2lvbiBvZiBvdXIgY29tcGlsZXINCiAgZXh0ZW5zaW9ucywgY29tcGxldGUgd2l0 aCBhbGwgb3VyIHBhY2thZ2VzIGFuZCBzdXBwb3J0IGZvciBkZXZlbG9wZXINCiAgdG9vbGluZywg aW5jbHVkaW5nIG9jYW1sZm9ybWF0LCBtZXJsaW4gYW5kIG9jYW1sLWxzcC1zZXJ2ZXIuIEdldCB0 aGUNCiAgaW5zdGFsbCBpbnN0cnVjdGlvbnMgYXQgb3VyIFtHaXRIdWJdLCBhbmQgZW5qb3kgdGhl IGV4cGVyaWVuY2UgaW4geW91cg0KICBmYXZvcml0ZSBlZGl0b3IgbGlrZSBWU0NvZGUsIEVtYWNz IG9yIFZpbS4NCg0KICBNb3JlIGRvY3VtZW50YXRpb24gY29taW5nIHNvb24gOnNsaWdodF9zbWls ZTouIFN0YXkgdHVuZWQgZm9yIGZ1dHVyZQ0KICByZWxlYXNlcyENCg0KDQpbR2l0SHViXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9qYW5lc3RyZWV0L29wYW0tcmVwb3NpdG9yeS90cmVlL3dpdGgtZXh0 ZW5zaW9ucz4NCg0KDQpvcGFtIDIuMy4wIGlzIG91dCENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi0zLTAtaXMtb3V0LzE1NjA5LzE+DQoNCg0KS2F0 ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEhpIGV2ZXJ5b25lLA0KDQogIEFzIG1lbnRpb25lZCBpbiBbb3VyIHRhbGsgYXQgdGhlIE9D YW1sIFdvcmtzaG9wIDIwMjRdLCB3ZSBkZWNpZGVkIHRvDQogIHN3aXRjaCB0byBhIHRpbWUtYmFz ZWQgcmVsZWFzZSBjeWNsZSAoZXZlcnkgNiBtb250aHMpLCBzdGFydGluZyB3aXRoDQogIG9wYW0g Mi4zLg0KDQogIEFzIHByb21pc2VkLCB3ZSBhcmUgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpbmFs IHJlbGVhc2Ugb2Ygb3BhbSAyLjMuMC4NCg0KDQpbb3VyIHRhbGsgYXQgdGhlIE9DYW1sIFdvcmtz aG9wIDIwMjRdDQo8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvZGV0YWlscy9vY2FtbC0yMDI0 LXBhcGVycy8xMC9PcGFtLTItMi1hbmQtYmV5b25kPg0KDQpXaGF04oCZcyBuZXc/DQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgV2hlbiBsb2FkaW5nIGEgcmVwb3Np dG9yeSwgKm9wYW0gbm93IGlnbm9yZXMgZmlsZXMgaW4gcGFja2FnZXPigJkNCiAgICBmaWxlcy8g ZGlyZWN0b3JpZXMgd2hpY2ggYXJlbuKAmXQgbGlzdGVkIGluIHRoZSBleHRyYS1maWxlcyBmaWVs ZCogb2YNCiAgICB0aGUgb3BhbSBmaWxlLiA6d2FybmluZzogSWYgeW91IG1haW50YWluIGFuIG9w YW0gcmVwb3NpdG9yeSwgcGxlYXNlDQogICAgcmVhZCBvdXIgW2Jsb2cgcG9zdF0gdG8gbWFrZSBz dXJlIHlvdXIgcmVwb3NpdG9yeSBzdGF5cyBjb21wYXRpYmxlLg0KICDigKIgKlBhY2thZ2VzIHJl cXVpcmluZyBhbiB1bnN1cHBvcnRlZCB2ZXJzaW9uIG9mIG9wYW0gYXJlIG5vdyBtYXJrZWQNCiAg ICAgdW5hdmFpbGFibGUqLCBpbnN0ZWFkIG9mIGNhdXNpbmcgYSByZXBvc2l0b3J5IGVycm9yLiBU aGlzIG1lYW5zIGFuDQogICAgIG9wYW0gcmVwb3NpdG9yeSBjYW4gbm93IGFsbG93IHNtb290aGVy IHVwZ3JhZGUgaW4gdGhlIGZ1dHVyZQ0KICDigKIgKm9wYW0gbGlzdCDigJNsYXRlc3RzLW9ubHkq OiBhIG5ldyBvcHRpb24gdG8gbGlzdCBvbmx5IHRoZSBsYXRlc3QNCiAgICAgdmVyc2lvbnMgb2Yg cGFja2FnZXMNCiAg4oCiICrigJN2ZXJib3NlLW9uKjogYSBuZXcgb3B0aW9uIHRvIGVuYWJsZSB2 ZXJib3NlIG91dHB1dCBmb3Igc3BlY2lmaWVkDQogICAgICBwYWNrYWdlIG5hbWVzLg0KICDigKIg Km9wYW0gc3dpdGNoIGltcG9ydCDigJNkZXBzLW9ubHkqOiBhIG5ldyBvcHRpb24gdG8gaW5zdGFs bCBvbmx5IHRoZQ0KICAgICBkZXBlbmRlbmNpZXMgb2YgdGhlIHJvb3QgcGFja2FnZXMgbGlzdGVk IGluIHRoZSBvcGFtIHN3aXRjaCBleHBvcnQNCiAgICAgZmlsZQ0KICDigKIgKm9wYW0gc3dpdGNo IGxpc3QtYXZhaWxhYmxlKiBubyBsb25nZXIgZGlzcGxheXMgY29tcGlsZXJzIGZsYWdnZWQNCiAg ICAgd2l0aCBgYXZvaWQtdmVyc2lvbn4vfmRlcHJlY2F0ZWQnIHVubGVzcyBgLS1hbGwnIGlzIGdp dmVuLCBtZWFuaW5nDQogICAgIHRoYXQgcHJlLXJlbGVhc2Ugb3IgdW5yZWxlYXNlZCBPQ2FtbCBw YWNrYWdlcyBubyBsb25nZXIgYXBwZWFyIHRvDQogICAgIGJlIHRoZSBsYXRlc3QgdmVyc2lvbg0K ICDigKIgKlRoZSBidWlsdGluLTBpbnN0YWxsIHNvbHZlciB3YXMgaW1wcm92ZWQqIGFuZCBzaG91 bGQgbm93IGJlIGNhcGFibGUNCiAgICAgb2YgYmVpbmcgeW91ciBkZWZhdWx0IHNvbHZlciBpbnN0 ZWFkIG9mIGBidWlsdGluLW1jY3MrZ2xwaycuIElmIHlvdQ0KICAgICB3aXNoIHRvIGdpdmUgaXQg YSB0cnksIHNpbXBseSBjYWxsaW5nIGBvcGFtIG9wdGlvbg0KICAgICBzb2x2ZXI9YnVpbHRpbi0w aW5zdGFsbCcgKGNhbGwgYG9wYW0gb3B0aW9uIHNvbHZlcj0nIHJlc3RvcmVzIHRoZQ0KICAgICBk ZWZhdWx0KQ0KICDigKIgTW9zdCBvZiB0aGUgKnVuaGVscGZ1bCBjb25mbGljdCBtZXNzYWdlcyB3 ZXJlIGZpeGVkKiA6Zmxhc2hsaWdodDoNCiAg4oCiICpGaXggdGhlIGludGVybmFsIGNhY2hlIG9m IGluc3RhbGxlZCBwYWNrYWdlcyosIHdoaWNoIHdhcyBzdG9yaW5nDQogICAgIHRoZSB3cm9uZyB2 ZXJzaW9uIG9mIHRoZSBvcGFtIGZpbGUgYWZ0ZXIgYSBidWlsZCBmYWlsdXJlLiAoWyM2MjEzXSkN Cg0KICBWYXJpb3VzIHBlcmZvcm1hbmNlIGFuZCBvdGhlciBpbXByb3ZlbWVudHMgd2VyZSBtYWRl IGFuZCBidWdzIHdlcmUNCiAgZml4ZWQuDQoNCiAgOm9wZW5fYm9vazogWW91IGNhbiByZWFkIG91 ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiBhYm91dA0KICB0aGVzZSBjaGFuZ2Vz IGFuZCBtb3JlLCBhbmQgZm9yIGV2ZW4gbW9yZSBkZXRhaWxzIHlvdSBjYW4gdGFrZSBhIGxvb2sN CiAgYXQgdGhlIFtyZWxlYXNlIG5vdGVdIG9yIHRoZSBbY2hhbmdlbG9nXS4NCg0KDQpbYmxvZyBw b3N0XSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9ibG9nL29wYW0tMi0zLTAvPg0KDQpbIzYyMTNd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzYyMTM+DQoNCltyZWxlYXNlIG5v dGVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi4zLjA+DQoN CltjaGFuZ2Vsb2ddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9ibG9iLzIuMy4wL0NI QU5HRVM+DQoNCg0KVHJ5IGl0IQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHVwZ3Jh ZGUgaW5zdHJ1Y3Rpb25zIGFyZSB1bmNoYW5nZWQ6DQoNCiAgRm9yIFVuaXggc3lzdGVtcw0KICDi lIzilIDilIDilIDilIANCiAg4pSCIGJhc2ggLWMgInNoIDwoY3VybCAtZnNTTCBodHRwczovL29w YW0ub2NhbWwub3JnL2luc3RhbGwuc2gpIg0KICDilJTilIDilIDilIDilIANCiAgb3IgZnJvbSBQ b3dlclNoZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBJ bnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2QgaHR0cHM6Ly9vcGFtLm9j YW1sLm9yZy9pbnN0YWxsLnBzMSkgfSINCiAg4pSU4pSA4pSA4pSA4pSADQogIFBsZWFzZSByZXBv cnQgYW55IGlzc3VlcyB0byB0aGUgW2J1Zy10cmFja2VyXS4NCg0KDQpbYnVnLXRyYWNrZXJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXM+DQoNCg0KSW5zdGFsbGluZyBEZXZl bG9wZXIgVG9vbHMgd2l0aCBEdW5lDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2luc3RhbGxpbmctZGV2ZWxvcGVyLXRvb2xzLXdpdGgtZHVuZS8xNTYxMi8xPg0KDQoN ClN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRHVuZSBjYW4g aW5zdGFsbCBhbmQgcnVuIGRldmVsb3BlciB0b29scyBpbiB0aGUgY29udGV4dCBvZiBhDQogIHBy b2plY3QuIFRoaXMgZmVhdHVyZSBpcyBhdmFpbGFibGUgaW4gdGhlIFtEdW5lIERldmVsb3BlciBQ cmV2aWV3XSBhbmQNCiAgaW4gdGhlIHVwY29taW5nIHJlbGVhc2Ugb2YgRHVuZSAzLjE3LiBBcyB3 aXRoIGFsbCBvZiBEdW5lJ3MgcGFja2FnZQ0KICBtYW5hZ2VtZW50IGZlYXR1cmVzLCBjb25zaWRl ciB0aGlzIGZlYXR1cmUgdG8gYmUgdW5zdGFibGUgYXMgaXRzIFVJDQogIGFuZCBzZW1hbnRpY3Mg bWF5IGNoYW5nZSB3aXRob3V0IG5vdGljZS4NCg0KICBUaGUgY3VycmVudGx5IHN1cHBvcnRlZCB0 b29scyBhcmUgYG9jYW1sbHNwJyBhbmQgYG9jYW1sZm9ybWF0Jy4gRHVuZQ0KICBoYXMgYSBuZXcg Y29tbWFuZCBgZHVuZSB0b29scyBleGVjIDxUT09MPiAtLSBbQVJHU10uLi4nIHdoaWNoDQogIGRv d25sb2FkcyBhbmQgaW5zdGFsbHMgdGhlIGdpdmVuIHRvb2wsIGFuZCB0aGVuIHJ1bnMgaXQgd2l0 aCB0aGUgZ2l2ZW4NCiAgYXJndW1lbnRzIChub3RlIHRoZSBgLS0nIHdoaWNoIHNlcGFyYXRlcyBh cmd1bWVudHMgdG8gYGR1bmUnIGZyb20NCiAgYXJndW1lbnRzIHRvIHRoZSB0b29sKS4gVG9vbHMg YXJlIGluc3RhbGxlZCBsb2NhbGx5IHRvIHRoZSBwcm9qZWN0LCBpbg0KICBpdHMgYF9idWlsZCcg ZGlyZWN0b3J5LCB3aGljaCBtYWtlcyBpdCBlYXN5IHRvIHVzZSBkaWZmZXJlbnQgdmVyc2lvbnMN CiAgb2YgYSB0b29sIGluIGRpZmZlcmVudCBwcm9qZWN0cy4gQW4gdW5mb3J0dW5hdGUgY29uc2Vx dWVuY2Ugb2YNCiAgaW5zdGFsbGluZyB0b29scyBpbnRvIGBfYnVpbGQnIGlzIHRoYXQgZm9yIHRo ZSB0aW1lIGJlaW5nIGFsbCB0b29scw0KICBhcmUgdW5pbnN0YWxsZWQgd2hlbmV2ZXIgYGR1bmUg Y2xlYW4nIGlzIHJ1bi4NCg0KICBMZXQncyBzZWUgaXQgaW4gYWN0aW9uOg0KICDilIzilIDilIDi lIDilIANCiAg4pSCICQgZHVuZSB0b29scyBleGVjIG9jYW1sZm9ybWF0IC0tIC0tdmVyc2lvbg0K ICDilIIgU29sdXRpb24gZm9yIGRldi10b29scy5sb2Nrcy9vY2FtbGZvcm1hdDoNCiAg4pSCIC0g b2NhbWxmb3JtYXQuMC4yNi4yK2JpbmFyeS1vY2FtbC01LjIuMC1idWlsdC0yMDI0LTExLTA3LjAt eDg2XzY0LXVua25vd24tbGludXgtbXVzbA0KICDilIIgICAgIEJ1aWxkaW5nIG9jYW1sZm9ybWF0 LjAuMjYuMitiaW5hcnktb2NhbWwtNS4yLjAtYnVpbHQtMjAyNC0xMS0wNy4wLXg4Nl82NC11bmtu b3duLWxpbnV4LW11c2wNCiAg4pSCICAgICAgUnVubmluZyAnb2NhbWxmb3JtYXQgLS12ZXJzaW9u Jw0KICDilIIgMC4yNi4yDQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCltEdW5lIERldmVsb3BlciBQ cmV2aWV3XSA8aHR0cHM6Ly9wcmV2aWV3LmR1bmUuYnVpbGQvPg0KDQpQcmVjb21waWxlZCBCaW5h cmllcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgTm90ZSB0aGF0IGluIHRoZSBleGFtcGxlIGFib3ZlLCBEdW5lJ3MgcGFj a2FnZSBzb2x2ZXIgY2hvc2UgdG8gaW5zdGFsbA0KICB2ZXJzaW9uDQogIGAwLjI2LjIrYmluYXJ5 LW9jYW1sLTUuMi4wLWJ1aWx0LTIwMjQtMTEtMDcuMC14ODZfNjQtdW5rbm93bi1saW51eC1tdXNs Jw0KICBvZiBgb2NhbWxmb3JtYXQnLiBUaGlzIHBhY2thZ2VzIGNvbWVzIGZyb20gYSBuZXcgW3Jl cG9zaXRvcnkgb2YgYmluYXJ5DQogIHBhY2thZ2VzXSBjb250YWluaW5nIHByZS1idWlsdCBleGVj dXRhYmxlcyBmb3IgYSBzZWxlY3QgZmV3IE9wYW0NCiAgcGFja2FnZXMuIER1bmUgd2lsbCBzZWFy Y2ggdGhpcyByZXBvc2l0b3J5IGluIGFkZGl0aW9uIHRvIHRoZSBkZWZhdWx0DQogIHJlcG9zaXRv cmllcyB3aGVuIHNvbHZpbmcgcGFja2FnZXMgZm9yIHRvb2xzIG9ubHkgKGlmIGEgcHJvamVjdCBo YXMNCiAgYG9jYW1sZm9ybWF0JyBpbiBpdHMgZGVwZW5kZW5jaWVzLCB0aGUgYmluYXJ5IHJlcG9z aXRvcnkgd29uJ3QgYmUNCiAgc2VhcmNoZWQgd2hpbGUgc29sdmluZyB0aGUgcHJvamVjdCdzIGRl cGVuZGVuY2llcykuDQoNCiAgVGhlIGdvYWwgb2YgdGhlIGJpbmFyeSByZXBvc2l0b3J5IGlzIHRv IHJlZHVjZSB0aGUgdGltZSBpdCB0YWtlcyB0bw0KICBnZXQgc3RhcnRlZCB3b3JraW5nIG9uIGEg bmV3IHByb2plY3QuIFdpdGhvdXQgaXQsIER1bmUgd291bGQgbmVlZCB0bw0KICBidWlsZCBgb2Nh bWxmb3JtYXQnIGZyb20gc291cmNlIGFsb25nIHdpdGggYWxsIG9mIGl0cyBkZXBlbmRlbmNpZXMs DQogIHdoaWNoIGNhbiB0YWtlIHNldmVyYWwgbWludXRlcy4NCg0KICBGb3Igbm93IG9ubHkgYSBz bWFsbCBudW1iZXIgb2YgcGFja2FnZSB2ZXJzaW9ucyBhcmUgY29udGFpbmVkIGluIHRoZQ0KICBi aW5hcnkgcmVwb3NpdG9yeS4gVG8gZGVtb25zdHJhdGUsIGhlcmUncyB3aGF0IGhhcHBlbnMgaWYg d2UgcnVuIGBkdW5lDQogIHRvb2xzIGV4ZWMgb2NhbWxmb3JtYXQnIGluIGEgcHJvamVjdCB3aXRo IGB2ZXJzaW9uPTAuMjYuMScgaW4gaXRzDQogIGAub2NhbWxmb3JtYXQnIGZpbGU6DQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgICQgZHVuZSB0b29scyBleGVjIG9jYW1sZm9ybWF0IC0tIC0tdmVy c2lvbg0KICDilIIgU29sdXRpb24gZm9yIGRldi10b29scy5sb2Nrcy9vY2FtbGZvcm1hdDoNCiAg 4pSCIC0gYXN0cmluZy4wLjguNQ0KICDilIIgLSBiYXNlLnYwLjE3LjENCiAg4pSCIC0gYmFzZS1i eXRlcy5iYXNlDQogIOKUgiAtIGJhc2UtdW5peC5iYXNlDQogIOKUgiAtIGNhbWxwLXN0cmVhbXMu NS4wLjENCiAg4pSCIC0gY21kbGluZXIuMS4zLjANCiAg4pSCIC4uLg0KICDilIIgLSBvY2FtbGZv cm1hdC4wLjI2LjENCiAg4pSCIC4uLg0KICDilIIgICAgIEJ1aWxkaW5nIGJhc2UtdW5peC5iYXNl DQogIOKUgiAgICAgQnVpbGRpbmcgb2NhbWwtYmFzZS1jb21waWxlci41LjEuMQ0KICDilIIgICAg IEJ1aWxkaW5nIG9jYW1sLWNvbmZpZy4zDQogIOKUgiAgICAgQnVpbGRpbmcgb2NhbWwuNS4xLjEN CiAg4pSCICAgICBCdWlsZGluZyBzZXEuYmFzZQ0KICDilIIgICAgIEJ1aWxkaW5nIGNtZGxpbmVy LjEuMy4wDQogIOKUgiAuLi4NCiAg4pSCICAgICBCdWlsZGluZyBvY2FtbGZvcm1hdC4wLjI2LjEN CiAg4pSCICAgICAgUnVubmluZyAnb2NhbWxmb3JtYXQgLS12ZXJzaW9uJw0KICDilIIgMC4yNi4x DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIER1bmUgcGFyc2VzIGAub2NhbWxmb3JtYXQnIHRvIGRl dGVybWluZSB3aGljaCB2ZXJzaW9uIG9mIGBvY2FtbGZvcm1hdCcNCiAgdG8gaW5zdGFsbCwgYW5k IGAwLjI2LjEnIGlzIG5vdCBpbiB0aGUgYmluYXJ5IHJlcG8gc28gaXQgbmVlZGVkIHRvIGJlDQog IGJ1aWx0IGZyb20gc291cmNlLg0KDQogIElmIHlvdXIgcHJvamVjdCByZXF1aXJlcyBhIHZlcnNp b24gb2YgYSBwYWNrYWdlIG5vdCBhdmFpbGFibGUgaW4gdGhlDQogIGJpbmFyeSByZXBvc2l0b3J5 LCBvciB5b3UncmUgb24gYW4gb3BlcmF0aW5nIHN5c3RlbSBvciBhcmNoaXRlY3R1cmUNCiAgZm9y IHdoaWNoIG5vIGJpbmFyeSB2ZXJzaW9uIG9mIGEgcGFja2FnZSBleGlzdHMsIHRoZSBwYWNrYWdl IHdpbGwgYmUNCiAgYnVpbHQgZnJvbSBzb3VyY2UgaW5zdGVhZC4gQ3VycmVudGx5IHRoZSBiaW5h cnkgcmVwb3NpdG9yeSBjb250YWlucw0KICBiaW5hcmllcyBvZiBgb2NhbWxmb3JtYXQuMC4yNi4y JywgYG9jYW1sLWxzcC1zZXJ2ZXIuMS4xOC4wJyBhbmQNCiAgYG9jYW1sLWxzcC1zZXJ2ZXIuMS4x OS4wJyBmb3IgYHg4Nl82NC11bmtub3duLWxpbnV4LW11c2wnLA0KICBgeDg2XzY0LWFwcGxlLWRh cndpbicgYW5kIGBhYXJjaDY0LWFwcGxlLWRhcndpbicuDQoNCiAgTm90ZSB0aGF0IExpbnV4IGJp bmFyaWVzIGFyZSBzdGF0aWNhbGx5IGxpbmtlZCB3aXRoIG11c2xjIHNvIHRoZXkNCiAgc2hvdWxk IHdvcmsgb24gYWxsIGRpc3Ryb3MgcmVnYXJkbGVzcyBvZiBkeW5hbWljIGxpbmtlci4NCg0KDQpb cmVwb3NpdG9yeSBvZiBiaW5hcnkgcGFja2FnZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s LWR1bmUvb2NhbWwtYmluYXJ5LXBhY2thZ2VzPg0KDQoNClJ1bm5pbmcgYG9jYW1sbHNwJw0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VGhlIHByb2dyYW0gYG9jYW1sbHNwJyBmcm9tIHRoZSBwYWNrYWdlIGBvY2FtbC1sc3Atc2VydmVy JyBhbmFseXplcw0KICBPQ2FtbCBjb2RlIGFuZCBzZW5kcyBpbmZvcm1hdGlvbiB0byB0ZXh0IGVk aXRvcnMgdXNpbmcgdGhlIFtMYW5ndWFnZQ0KICBTZXJ2ZXIgUHJvdG9jb2xdLiBUaGUgdG9vbCBp cyBjcnVjaWFsIHRvIE9DYW1sJ3MgZWRpdG9yIGludGVncmF0aW9uDQogIGFuZCBpdCBoYXMgYSBj b3VwbGUgb2YgcXVpcmtzIHRoYXQgYXJlIHdvcnRoIG1lbnRpb25pbmcgaGVyZS4NCg0KICBUTDtE UjogSW5zdGFsbCBEdW5lIHdpdGggdGhlIGluc3RhbGwgc2NyaXB0IG9uIHRoZSBbRGV2ZWxvcGVy IFByZXZpZXcNCiAgcGFnZV0gYW5kIHlvdSdsbCBnZXQgYW4gW2BvY2FtbGxzcCcgc2hlbGwgc2Ny aXB0XSB0aGF0IHdpbGwgaW5zdGFsbA0KICBhbmQgcnVuIHRoZSBjb3JyZWN0IHZlcnNpb24gb2Yg YG9jYW1sbHNwJyBmb3IgeW91ciBwcm9qZWN0Lg0KDQogIEZpcnN0bHkgdGhlIGBvY2FtbGxzcCcg ZXhlY3V0YWJsZSBjYW4gb25seSBhbmFseXplIGNvZGUgdGhhdCBoYXMgYmVlbg0KICBjb21waWxl ZCB3aXRoIHRoZSBzYW1lIHZlcnNpb24gb2YgdGhlIE9DYW1sIGNvbXBpbGVyIGFzIHdhcyB1c2Vk IHRvDQogIGNvbXBpbGUgdGhlIGBvY2FtbGxzcCcgZXhlY3V0YWJsZSBpdHNlbGYuIERpZmZlcmVu dCB2ZXJzaW9ucyBvZiB0aGUNCiAgYG9jYW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgYXJlIGluY29t cGF0aWJsZSB3aXRoIHNvbWUgdmVyc2lvbnMgb2YgdGhlDQogIE9DYW1sIGNvbXBpbGVyIChlLmcu IGBvY2FtbC1sc3Atc2VydmVyLjEuMTkuMCcgbXVzdCBiZSBidWlsdCB3aXRoIGF0DQogIGxlYXN0 IGA1LjIuMCcgb2YgdGhlIGNvbXBpbGVyKS4gVGhpcyBtZWFucyB0aGF0IHdoZW4gRHVuZSBpcyBj aG9vc2luZw0KICB3aGljaCB2ZXJzaW9uIG9mIGBvY2FtbC1sc3Atc2VydmVyJyB0byBpbnN0YWxs IGl0IG5lZWRzIHRvIGtub3cgd2hpY2gNCiAgdmVyc2lvbiBvZiB0aGUgY29tcGlsZXIgeW91ciBw cm9qZWN0IGlzIHVzaW5nLiBUaGlzIGlzIG9ubHkga25vd24NCiAgYWZ0ZXIgdGhlIHByb2plY3Qg aGFzIGJlZW4gbG9ja2VkIChieSBydW5uaW5nIGBkdW5lIHBrZyBsb2NrJyksIHNvDQogIER1bmUg d2lsbCByZWZ1c2UgdG8gaW5zdGFsbCBgb2NhbWxsc3AnIGluIGEgcHJvamVjdCB0aGF0IGRvZXNu J3QgaGF2ZQ0KICBhIGxvY2sgZGlyZWN0b3J5IG9yIGZvciBhIHByb2plY3QgdGhhdCBkb2Vzbid0 IGRlcGVuZCBvbiB0aGUgT0NhbWwNCiAgY29tcGlsZXIuDQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiAkIGR1bmUgdG9vbHMgZXhlYyBvY2FtbGxzcA0KICDilIIgRXJyb3I6IFVuYWJsZSB0byBs b2FkIHRoZSBsb2NrZGlyIGZvciB0aGUgZGVmYXVsdCBidWlsZCBjb250ZXh0Lg0KICDilIIgSGlu dDogVHJ5IHJ1bm5pbmcgJ2R1bmUgcGtnIGxvY2snDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRo ZSBgb2NhbWwtbHNwLXNlcnZlcicgcGFja2FnZXMgaW4gdGhlIFtiaW5hcnkgcmVwb3NpdG9yeV0g Y29udGFpbg0KICBtZXRhZGF0YSB0byBlbnN1cmUgdGhhdCB0aGUgYG9jYW1sbHNwJyBleGVjdXRh YmxlIHRoYXQgZ2V0cyBpbnN0YWxsZWQNCiAgd2FzIGJ1aWx0IHdpdGggdGhlIHNhbWUgdmVyc2lv biBvZiB0aGUgY29tcGlsZXIgYXMgeW91ciBwcm9qZWN0LiBGb3INCiAgZXhhbXBsZSB0aGUgYG9j YW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgYnVpbHQgd2l0aCBgb2NhbWwuNS4yLjAnDQogIGNvbnRh aW5zIHRoaXMgbGluZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGNvbmZsaWN0czogIm9j YW1sIiB7IT0gIjUuMi4wIn0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBwcmV2ZW50cyBp dCBmcm9tIGJlaW5nIGNob3NlbiBpZiB0aGUgcHJvamVjdCBkZXBlbmRzIG9uIGFueQ0KICB2ZXJz aW9uIG9mIHRoZSBjb21waWxlciBvdGhlciB0aGFuIGA1LjIuMCcuDQoNCiAgQW5vdGhlciBxdWly ayBpcyB0aGF0IGBvY2FtbGxzcCcgd2lsbCB0cnkgdG8gaW52b2tlIHRoZSBiaW5hcmllcw0KICBg b2NhbWxmb3JtYXQnIGFuZCBgb2NhbWxmb3JtYXQtcnBjJywgYm90aCBmb3VuZCBpbiB0aGUgYG9j YW1sZm9ybWF0Jw0KICBwYWNrYWdlLiBUaGUgYG9jYW1sLWxzcC1zZXJ2ZXInIHBhY2thZ2UgZG9l c24ndCBkZXBlbmQgb24NCiAgYG9jYW1sZm9ybWF0JyBhcyB0aGUgc3BlY2lmaWMgdmVyc2lvbiBv ZiBgb2NhbWxmb3JtYXQnIG5lZWRlZCBieSBhDQogIHByb2plY3QgaXMgaW1wbGllZCBieSB0aGUg cHJvamVjdCdzIGAub2NhbWxmb3JtYXQnIGZpbGUsIHdoaWNoIHBhY2thZ2UNCiAgbWFuYWdlcnMg ZG9uJ3QgY29uc2lkZXIgd2hlbiBzb2x2aW5nIGRlcGVuZGVuY2llcy4gVGhpcyBtZWFucyB0aGF0 IGluDQogIGdlbmVyYWwgKHdoZXRoZXIgdXNpbmcgRHVuZSBvciBPcGFtIGZvciBwYWNrYWdlIG1h bmFnZW1lbnQpIGl0J3MgdXAgdG8NCiAgdGhlIHVzZXIgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIGNv cnJlY3QgdmVyc2lvbiBvZiBgb2NhbWxmb3JtYXQnIGlzDQogIGluc3RhbGxlZCBpbiBvcmRlciB0 byB1c2UgdGhlIGZvcm1hdHRpbmcgZmVhdHVyZXMgb2YgYG9jYW1sbHNwJy4NCg0KICBPdGhlcndp c2UgZXhwZWN0IHRoaXMgZXJyb3IgaW4geW91ciBlZGl0b3I6DQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgVW5hYmxlIHRvIGZpbmQgJ29jYW1sZm9ybWF0LXJwYycgYmluYXJ5LiBUeXBlcyBvbiBo b3ZlciBtYXkgbm90IGJlIHdlbGwtZm9ybWF0dGVkLiBZb3UgbmVlZCB0byBpbnN0YWxsIGVpdGhl ciAnb2NhbWxmb3JtYXQnIG9mIHZlcnNpb24gPiAwLjIxLjAgb3IsIG90aGVyd2lzZSwgJ29jYW1s Zm9ybWF0LXJwYycgcGFja2FnZS4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRXZlbiBpZiBgb2Nh bWxsc3AnIGFuZCBgb2NhbWxmb3JtYXQnIGFyZSBib3RoIGluc3RhbGxlZCBieSBEdW5lLCBpZg0K ICB5b3UgcnVuIGBkdW5lIHRvb2xzIGV4ZWMgb2NhbWxsc3AnIHlvdSB3aWxsIGZpbmQgdGhhdCBg b2NhbWxsc3AnIHN0aWxsDQogIGNhbid0IGZpbmQgdGhlIGBvY2FtbGZvcm1hdCcgb3IgYG9jYW1s Zm9ybWF0LXJwYycgZXhlY3V0YWJsZXMuIFRoaXMgaXMNCiAgYmVjYXVzZSB1bmxpa2UgT3BhbSwg RHVuZSBkb2VzIG5vdCBpbnN0YWxsIHRvb2xzIGludG8geW91ciBgJFBBVEgnLA0KICBhbmQgZm9y IHRoZSBzYWtlIG9mIHNpbXBsaWNpdHksIHRoZSBgZHVuZSB0b29scyBleGVjIDxUT09MPicgY29t bWFuZA0KICBkb2VzIG5vdCBtb2RpZnkgdGhlIGVudmlyb25tZW50IG9mIHRoZSB0b29sIGl0IGxh dW5jaGVzLiBUaGlzIGNhbiBiZQ0KICBmaXhlZCBieSBhZGRpbmcNCiAgYF9idWlsZC9fcHJpdmF0 ZS9kZWZhdWx0Ly5kZXYtdG9vbC9vY2FtbGZvcm1hdC9vY2FtbGZvcm1hdC90YXJnZXQvYmluJw0K ICAodGhlIGRpcmVjdG9yeSBjb250YWluaW5nIGBvY2FtbGZvcm1hdCcgYW5kIGBvY2FtbGZvcm1h dC1ycGMnIHdoZW4NCiAgYG9jYW1sZm9ybWF0JyBpcyBpbnN0YWxsZWQgYnkgZHVuZSkgdG8gdGhl IHN0YXJ0IG9mIHlvdXIgYCRQQVRIJw0KICB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBgZHVuZSB0 b29scyBleGVjIG9jYW1sbHNwJy4gRm9yIGV4YW1wbGUNCiAgc3RhcnRpbmcgYG9jYW1sbHNwJyB3 aXRoIHRoZSBmb2xsb3dpbmcgc2hlbGwgc2NyaXB0Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgT0NBTUxGT1JNQVRfVEFSR0VUPSJfYnVpbGQvX3ByaXZhdGUvZGVmYXVsdC8uZGV2LXRvb2wv b2NhbWxmb3JtYXQvb2NhbWxmb3JtYXQvdGFyZ2V0Ig0KICDilIIgDQogIOKUgiBpZiBbICEgLWYg JE9DQU1MRk9STUFUX1RBUkdFVC9jb29raWUgXTsgdGhlbg0KICDilIIgICAgICMgTWFrZSBzdXJl IHRoYXQgdGhlIG9jYW1sZm9ybWF0IGRldiB0b29sIGlzIGluc3RhbGxlZCBhcyBpdCdzIG5lZWRl ZCBieQ0KICDilIIgICAgICMgb2NhbWxsc3AuIFRoZXJlJ3MgY3VycmVudGx5IG5vIGNvbW1hbmQg dGhhdCBqdXN0IGluc3RhbGxzIG9jYW1sZm9ybWF0IHNvDQogIOKUgiAgICAgIyB3ZSBuZWVkIHRv IHJ1biBpdCBhbmQgaWdub3JlIHRoZSByZXN1bHQuDQogIOKUgiAgICAgZHVuZSB0b29scyBleGVj IG9jYW1sZm9ybWF0IC0tIC0taGVscCA+IC9kZXYvbnVsbA0KICDilIIgZmkNCiAg4pSCIA0KICDi lIIgIyBBZGQgb2NhbWxmb3JtYXQgdG8gdGhlIGVudmlyb25tZW50IGluIHdoaWNoIG9jYW1sbHNw IHJ1bnMgc28gb2NhbWxsc3AgY2FuIGludm9rZSBvY2FtbGZvcm1hdC4NCiAg4pSCIGV4cG9ydCBQ QVRIPSIkUFdELyRPQ0FNTEZPUk1BVF9UQVJHRVQvYmluOiRQQVRIIg0KICDilIIgDQogIOKUgiAj IEJ1aWxkIGFuZCBydW4gb2NhbWxsc3AuDQogIOKUgiBkdW5lIHRvb2xzIGV4ZWMgb2NhbWxsc3Ag LS0gIiRAIg0KICDilJTilIDilIDilIDilIANCg0KICBPZiBjb3Vyc2UsIGl0J3MgcmFyZSB0byBt YW51YWxseSBzdGFydCBgb2NhbWxsc3AnIGRpcmVjdGx5IGZyb20geW91cg0KICB0ZXJtaW5hbC4g SXQncyBub3JtYWxseSBsYXVuY2hlZCBieSB0ZXh0IGVkaXRvcnMuIEl0IHdvdWxkIGJlDQogIGlt cHJhY3RpY2FsIHRvIGNvbmZpZ3VyZSB5b3VyIHRleHQgZWRpdG9yIHRvIG1vZGlmeSBgJFBBVEgn IGFuZCBydW4gYQ0KICBjdXN0b20gY29tbWFuZCB0byBzdGFydCBgb2NhbWxsc3AnIHZpYSBEdW5l LCBhbmQgZG9pbmcgc28gd291bGQgbWFrZQ0KICBpdCBpbXBvc3NpYmxlIHRvIGVkaXQgYW55IHBy b2plY3QgdGhhdCBfZG9lc24ndF8gdXNlIER1bmUgZm9yIHBhY2thZ2UNCiAgbWFuYWdlbWVudC4g SW5zdGVhZCwgdGhlIER1bmUgRGV2ZWxvcGVyIFByZXZpZXcgc2hpcHMgd2l0aCBbYSBzaGVsbA0K ICBzY3JpcHRdIHdoaWNoIGluc3RhbGxzIGBvY2FtbGZvcm1hdCcgYW5kIGFkZHMgaXRzIGBiaW4n IGRpcmVjdG9yeSB0bw0KICBgJFBBVEgnIGJlZm9yZSBsYXVuY2hpbmcgYGR1bmUgdG9vbHMgZXhl YyBvY2FtbGxzcCcuIFRoZSBzY3JpcHQgaXMNCiAgc2ltcGx5IG5hbWVkIGBvY2FtbGxzcCcsIGFu ZCB0aGUgRHVuZSBEZXZlbG9wZXIgUHJldmlldyBpbnN0YWxsIHNjcmlwdA0KICBhZGRzIGl0IHRv IGB+Ly5kdW5lL2Jpbicgd2hpY2ggc2hvdWxkIGFscmVhZHkgYmUgaW4geW91ciBgJFBBVEgnIGlm DQogIHlvdSdyZSB1c2luZyB0aGUgRGV2ZWxvcGVyIFByZXZpZXcuIFRoZSBgb2NhbWxsc3AnIHNj cmlwdCBhbHNvDQogIGF0dGVtcHRzIHRvIGZhbGwgYmFjayB0byBhbiBPcGFtLW1hbmFnZWQgaW5z dGFsbGF0aW9uIG9mIGBvY2FtbGxzcCcgaWYNCiAgaXQgZG9lc24ndCBkZXRlY3QgYSBEdW5lIGxv Y2tkaXIgc28gdGhlIHNhbWUgc2NyaXB0IHNob3VsZCB3b3JrIGZvcg0KICBub24tRHVuZSBwcm9q ZWN0cy4gQmVjYXVzZSB0aGUgc2NyaXB0IGlzIG5hbWVkIHRoZSBzYW1lIGFzIHRoZQ0KICBgb2Nh bWxsc3AnIGV4ZWN1dGFibGUsIG1vc3QgZWRpdG9ycyBkb24ndCByZXF1aXJlIHNwZWNpYWwNCiAg Y29uZmlndXJhdGlvbiB0byBydW4gaXQuIFNlZSB0aGUgIkVkaXRvciBDb25maWd1cmF0aW9uIiBz ZWN0aW9uIG9mIHRoZQ0KICBbRHVuZSBEZXZlbG9wZXIgUHJldmlldyBwYWdlXSBmb3IgbW9yZSBp bmZvcm1hdGlvbiBhYm91dCBzZXR0aW5nIHVwDQogIHlvdXIgZWRpdG9yLg0KDQogIFNvbWUgcGFy dHMgb2YgdGhlIGBvY2FtbGxzcCcgc2hlbGwgc2NyaXB0IG1heSBldmVudHVhbGx5IG1ha2UgdGhl aXINCiAgd2F5IGludG8gRHVuZSBpdHNlbGYsIGJ1dCBmb3IgdGhlIHRpbWUgYmVpbmcgdGhlIHNo ZWxsIHNjcmlwdCBpcyB0aGUNCiAgcmVjb21tZW5kZWQgd2F5IHRvIGxhdW5jaCBgb2NhbWxsc3An IGZvciB1c2VycyBvZiB0aGUgRHVuZSBEZXZlbG9wZXINCiAgUHJldmlldy4gVGhlIG5ldCByZXN1 bHQgaXMgdGhhdCBhcyBsb25nIGFzIHlvdXIgcHJvamVjdCBoYXMgYQ0KICBsb2NrZmlsZSwgdGhl IGZpcnN0IHRpbWUgeW91IGVkaXQgc29tZSBPQ2FtbCBjb2RlIGluIHRoZSBwcm9qZWN0IER1bmUN CiAgd2lsbCBkb3dubG9hZCBhbmQgcnVuIHRoZSBhcHByb3ByaWF0ZSB2ZXJzaW9uIG9mIGBvY2Ft bGxzcCcuDQoNCg0KW0xhbmd1YWdlIFNlcnZlciBQcm90b2NvbF0NCjxodHRwczovL21pY3Jvc29m dC5naXRodWIuaW8vbGFuZ3VhZ2Utc2VydmVyLXByb3RvY29sLz4NCg0KW0RldmVsb3BlciBQcmV2 aWV3IHBhZ2VdIDxodHRwczovL3ByZXZpZXcuZHVuZS5idWlsZC8+DQoNCltgb2NhbWxsc3AnIHNo ZWxsIHNjcmlwdF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZHVuZS9iaW5hcnktZGlzdHJp YnV0aW9uL2Jsb2IvbWFpbi90b29sLXdyYXBwZXJzL29jYW1sbHNwPg0KDQpbYmluYXJ5IHJlcG9z aXRvcnldDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWR1bmUvb2NhbWwtYmluYXJ5LXBhY2th Z2VzPg0KDQpbYSBzaGVsbCBzY3JpcHRdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLWR1bmUv YmluYXJ5LWRpc3RyaWJ1dGlvbi9ibG9iL21haW4vdG9vbC13cmFwcGVycy9vY2FtbGxzcD4NCg0K W0R1bmUgRGV2ZWxvcGVyIFByZXZpZXcgcGFnZV0gPGh0dHBzOi8vcHJldmlldy5kdW5lLmJ1aWxk Lz4NCg0KDQpEdW5lIERldmVsb3BlciBQcmV2aWV3IFVwZGF0ZXMNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWR1bmUtZGV2ZWxvcGVyLXByZXZpZXctdXBkYXRlcy8xNTE2MC81Mj4NCg0KDQpT dGV2ZSBTaGVycmF0dCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgbmV3IHZlcnNp b24gb2YgdGhlIFt2c2NvZGUtb2NhbWwtcGxhdGZvcm1dIHdhcyBqdXN0IHJlbGVhc2VkIHdoaWNo DQogIGZpeGVzIGEgZmV3IGlzc3VlcyB3aXRoIG9jYW1sbHNwLiBZb3UnbGwgcHJvYmFibHkgaGF2 ZSB0byB1cGRhdGUgeW91cg0KICBpbnN0YWxsIG9mIHRoZSBEdW5lIERldmVsb3BlciBQcmV2aWV3 IChqdXN0IHJlcnVuIHRoZSBjb21tYW5kIG9uIFt0aGlzDQogIHBhZ2VdKS4gWW91J2xsIG5lZWQg dG8gY29uZmlndXJlIGEgY3VzdG9tIHNhbmRib3ggZm9yIHZzY29kZSBieQ0KICBwdXR0aW5nIHRo aXMgaW4geW91ciBgc2V0dGluZ3MuanNvbicgZmlsZSBhcyBvdGhlcndpc2UgdGhlIHBsdWdpbg0K ICBhc3N1bWVzIHlvdSdyZSB1c2luZyBgb3BhbScgdG8gbGF1bmNoIGBvY2FtbGxzcCc6DQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgew0KICDilIIgICAib2NhbWwuc2FuZGJveCI6IHsNCiAg4pSC ICAgICAia2luZCI6ICJjdXN0b20iLA0KICDilIIgICAgICJ0ZW1wbGF0ZSI6ICIkcHJvZyAkYXJn cyINCiAg4pSCICAgfQ0KICDilIIgfQ0KICDilJTilIDilIDilIDilIANCg0KDQpbdnNjb2RlLW9j YW1sLXBsYXRmb3JtXQ0KPGh0dHBzOi8vbWFya2V0cGxhY2UudmlzdWFsc3R1ZGlvLmNvbS9pdGVt cz9pdGVtTmFtZT1vY2FtbGxhYnMub2NhbWwtcGxhdGZvcm0+DQoNClt0aGlzIHBhZ2VdIDxodHRw czovL3ByZXZpZXcuZHVuZS5idWlsZC8+DQoNCg0KRmlyc3QgcmVsZWFzZSBvZiBjbWRsYW5nDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2ZpcnN0LXJlbGVhc2Utb2YtY21kbGFuZy8xNTYxNi8xPg0KDQoNCk1hdGhpZXUgQmFyYmlu IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUhDQoNCiAgQSBsaXR0 bGUgd2hpbGUgYWdvLCBJIFtwb3N0ZWRdIGFib3V0IFtjbWRsYW5nXSwgYSBsaWJyYXJ5IGZvciBj cmVhdGluZw0KICBjb21tYW5kLWxpbmUgcGFyc2VycyBpbiBPQ2FtbC4NCg0KICBUb2RheSwgSSBh bSBoYXBweSB0byBnaXZlIHlvdSBhbiB1cGRhdGUgb24gdGhpcyBwcm9qZWN0IHdpdGggdGhlDQog IGFubm91bmNlbWVudCBvZiBhbiBpbml0aWFsIHJlbGVhc2Ugb2YgY21kbGFuZyBwYWNrYWdlcyB0 byB0aGUNCiAgb3BhbS1yZXBvc2l0b3J5Lg0KDQogIFRoZXNlIGFyZSB2ZXJ5IGVhcmx5IGRheXMg Zm9yIHRoaXMgcHJvamVjdC4gSSBoYXZlIHN0YXJ0ZWQgdXNpbmcgdGhlDQogIGBjbWRsYW5nK2Nt ZGxpbmVyJyBjb21iaW5hdGlvbiBpbiBwZXJzb25hbCBwcm9qZWN0cywgYW5kIHBsYW4gdG8NCiAg ZXhwZXJpbWVudCB3aXRoIGBjbGltYXRlJyBpbiB0aGUgbmVhciBmdXR1cmUuIFBsZWFzZSBmZWVs IGZyZWUgdG8NCiAgZW5nYWdlIGluIGlzc3Vlcy9kaXNjdXNzaW9ucywgZXRjLg0KDQogIFRoZSBt b3N0IHJlY2VudCBhZGRpdGlvbiBvbiB0aGUgcHJvamVjdCBpcyB0aGUgZGV2ZWxvcG1lbnQgb2Yg YW4NCiAgZXZhbHVhdGlvbiBlbmdpbmUgYmFzZWQgb24gYHN0ZGxpYi9hcmcnLg0KDQogIEknZCBh bHNvIGxpa2UgdG8gaGlnaGxpZ2h0IHNvbWUgZXhhbXBsZXMgZnJvbSB0aGUgcHJvamVjdCdzDQog IHRlc3RzLiBEZXZlbG9waW5nIHRoZXNlIGNoYXJhY3Rlcml6YXRpb24gdGVzdHMgd2FzIGEgZnVu IHdheSB0byBsZWFybg0KICBtb3JlIGFib3V0IHRoZSBkaWZmZXJlbnQgQ0xJIGxpYnJhcmllcyBh bmQgdGhlaXIgZGlmZmVyZW5jZXM6DQoNCiAg4oCiIFNob3J0LCBsb25nIGFuZCBwcmVmaXggW2Zs YWcgbmFtZXNdLg0KICDigKIgVmFyaW91cyBzeW50YXhlcyBmb3IgW25hbWVkIGFyZ3VtZW50c10g KGAtcFZBTFVFJywgYC1wPVZBTFVFJywgYC1wDQogICAgVkFMVUUnKS4NCiAg4oCiIEhhbmRsaW5n IG9mIFtuZWdhdGl2ZSBpbnRlZ2Vyc10gYXMgbmFtZWQgYXJndW1lbnRzLg0KDQogIElmIHlvdSBo YXZlIGlkZWFzIGZvciBtb3JlIGNhc2VzIHRvIGFkZCAoZW50ZXJ0YWluaW5nIG9yIG90aGVyd2lz ZSksDQogIEknZCBsb3ZlIHRvIGludGVncmF0ZSB0aGVtIGludG8gdGhlIHRlc3Qgc3VpdGUuIFRo YW5rcyENCg0KICBCZWxvdywgeW91J2xsIGZpbmQgZGV0YWlscyBvZiB0aGUgcmVsZWFzZWQgcGFj a2FnZXMuIEhhcHB5IGNvbW1hbmQNCiAgcGFyc2luZyENCg0KICAqY21kbGFuZyogdGhlIHVzZXIg ZmFjaW5nIGxpYnJhcnkgdG8gYnVpbGQgdGhlIGNvbW1hbmRzLiBJdCBoYXMgbm8NCiAgIGRlcGVu ZGVuY2llcw0KDQogICpjbWRsYW5nLXRvLWNtZGxpbmVyKiB0cmFuc2xhdGUgY21kbGFuZyBjb21t YW5kcyB0byBjbWRsaW5lcg0KDQogICpjbWRsYW5nLXRvLWNsaW1hdGUqIHRyYW5zbGF0ZSBjbWRs YW5nIGNvbW1hbmRzIHRvIHRoZSBuZXdseSByZWxlYXNlZA0KICAgY2xpbWF0ZSAoY29tcGF0aWJp bGl0eSBjaGVja2VkIHdpdGggMC4xLjAgJiAwLjIuMCkNCg0KICAqY21kbGFuZy1zdGRsaWItcnVu bmVyKiBhbiBleGVjdXRpb24gZW5naW5lIGltcGxlbWVudGVkIG9uIHRvcCBvZg0KICAgc3RkbGli LmFyZw0KDQogIFRoYW5rIHlvdSB0byBAbXNlcmkgYW5kIHRoZSBvcGFtLXJlcG9zaXRvcnkgbWFp bnRhaW5lcnMgZm9yIHRoZWlyDQogIGhlbHAuDQoNCg0KW3Bvc3RlZF0NCjxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvY21kbGFuZy15ZXQtYW5vdGhlci1jbGktbGlicmFyeS13ZWxsLW5vdC1y ZWFsbHkvMTUyNTg+DQoNCltjbWRsYW5nXSA8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vY21k bGFuZz4NCg0KW2ZsYWcgbmFtZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL21iYXJiaW4vY21kbGFu Zy9ibG9iL21haW4vdGVzdC9leHBlY3QvdGVzdF9fZmxhZy5tbD4NCg0KW25hbWVkIGFyZ3VtZW50 c10NCjxodHRwczovL2dpdGh1Yi5jb20vbWJhcmJpbi9jbWRsYW5nL2Jsb2IvbWFpbi90ZXN0L2V4 cGVjdC90ZXN0X19uYW1lZC5tbD4NCg0KW25lZ2F0aXZlIGludGVnZXJzXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9tYmFyYmluL2NtZGxhbmcvYmxvYi9tYWluL3Rlc3QvZXhwZWN0L3Rlc3RfX25lZ2F0 aXZlX2ludF9hcmdzLm1sPg0KDQoNCmZpbmRsaWItMS45LjgNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2FyYy9jYW1sLWxpc3QvMjAyNC0xMS9tc2cwMDAxNC5odG1sPg0KDQoNCkdlcmQg U3RvbHBtYW5uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgbGlzdCwNCg0KICBm aW5kbGliLTEuOS44IGlzIG91dCwgZml4aW5nIGEgZmV3IGlzc3VlcyB0aGF0IHNsaXBwZWQgaW50 byAxLjkuNy4NCg0KICBGb3IgbWFudWFsLCBkb3dubG9hZCwgbWFudWFscywgZXRjLiBzZWUgaGVy ZToNCg0KICA8aHR0cDovL3Byb2plY3RzLmNhbWxjaXR5Lm9yZy9wcm9qZWN0cy9maW5kbGliLmh0 bWw+DQoNCiAgQW4gdXBkYXRlZCBPUEFNIHBhY2thZ2Ugd2lsbCBmb2xsb3cgc29vbi4NCg0KDQpU ZXN0byAwLjEuMCAtIGEgbmV3IHRlc3RpbmcgZnJhbWV3b3JrIGZvciBPQ2FtbA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tdGVzdG8tMC0xLTAtYS1uZXctdGVzdGluZy1mcmFtZXdvcmstZm9yLW9jYW1s LzE1NjI0LzE+DQoNCg0KTWFydGluIEphbWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IE9uIHRoaXMgODZ0aCBhbm5pdmVyc2FyeSBvZiB0aGUgZmlyc3Qgc3ludGhlc2lzIG9mIExTRCBi eSBBbGJlcnQNCiAgSG9mbWFubiwgaXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgW1Rlc3Rv XSwgYSBuZXcgdGVzdGluZyBsaWJyYXJ5DQogIGZvciBPQ2FtbC4NCg0KICBJdCBib3Jyb3dzIGEg bG90IG9mIGlkZWFzIGZyb20gQWxjb3Rlc3QgYW5kIGlzIHNpbWlsYXIgaW4gc3Bpcml0IGJ1dA0K ICBhZGRzIGEgZmV3IGtleSBmZWF0dXJlcyB0aGF0IHNlZW1lZCB0b28gZGlmZmljdWx0IHRvIGlu Y29ycG9yYXRlIGludG8NCiAgQWxjb3Rlc3QuIEZvciBhIGdlbnRsZSBpbnRyb2R1Y3Rpb24sIGNo ZWNrIG91dCBvdXINCiAgW3R1dG9yaWFsXS4gSW1wb3J0YW50IGZlYXR1cmVzIGluY2x1ZGU6DQoN CiAg4oCiIHN1cHBvcnQgZm9yIG1hbnkgb3B0aW9ucyB3aGVuIGNyZWF0aW5nIGEgdGVzdCBvZiB0 eXBlIGBUZXN0by50JzsNCiAg4oCiIGNhcHR1cmluZyBzdGRvdXQgb3Igc3RkZXJyIG91dHB1dCBm b3IgY29tcGFyaXNvbiBhZ2FpbnN0IHRoZQ0KICAgIGV4cGVjdGVkIG91dHB1dCBha2Egc25hcHNo b3RzOw0KICDigKIgcmV2aWV3aW5nIGFuZCBhcHByb3ZpbmcgdGVzdHMgd2l0aG91dCByZS1ydW5u aW5nIHRoZW07DQogIOKAoiBzdXBwb3J0IGZvciBuZXN0ZWQgY2F0ZWdvcmllcyB3aGlsZSBrZWVw aW5nIHRoZSB0ZXN0IHN1aXRlIGFzIGEgZmxhdA0KICAgIGxpc3Q7DQogIOKAoiBwYXJhbGxlbCBl eGVjdXRpb24gdXNpbmcgbXVsdGlwcm9jZXNzaW5nLg0KDQogIFRoaXMgaXMgdGhlIGZpcnN0IG9m ZmljaWFsIHJlbGVhc2Ugb2YgVGVzdG8gYW5kIGl0cyBpbnRlcmZhY2UgaXMNCiAgbGlrZWx5IHRv IGNoYW5nZSBpbiBtaW5vciB3YXlzIHVudGlsIHdlIHJlbGVhc2UgdmVyc2lvbiAxLjAuMC4gV2Un dmUNCiAgYmVlbiB1c2luZyBpdCBpbnRlcm5hbGx5IGF0IFNlbWdyZXAgZm9yIGFib3V0IGEgeWVh ciBhbmQgaXQncyBiZWVuDQogIHdvcmtpbmcgd2VsbCBmb3IgdXMuDQoNCiAgSGFwcHkgdGVzdGlu ZyENCg0KDQpbVGVzdG9dIDxodHRwczovL2dpdGh1Yi5jb20vc2VtZ3JlcC90ZXN0bz4NCg0KW3R1 dG9yaWFsXSA8aHR0cHM6Ly9zZW1ncmVwLmdpdGh1Yi5pby90ZXN0by90dXRvcmlhbC8+DQoNCg0K T3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI ZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9j YW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1RoZSBOZXcgQ29uZmVyZW5jZSBvbiB0aGUgQmxv Y2s6IFdoYXQgaXMgRlVOIE9DYW1sP10NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6 Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltUaGUgTmV3IENvbmZlcmVuY2Ugb24gdGhlIEJsb2NrOiBX aGF0IGlzIEZVTiBPQ2FtbD9dDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMTEtMTMt dGhlLW5ldy1jb25mZXJlbmNlLW9uLXRoZS1ibG9jay13aGF0LWlzLWZ1bi1vY2FtbD4NCg0KDQpP bGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3Mg YSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRv IHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVk IG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0 IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxp c3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlz dF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFu IFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 12 to 19, 20= 24.

    Boulder Dash in OCaml

    Andreas Rossberg announced

    Boulder Dash(*) was my favourite computer game in the 8-bit era, first rele= ased on the Atari 400/800 in 1984. Though I never owned an 8-bit machine myself, I had friend= s that I annoyed enough to let me play it on theirs.

    As a homage to its 40th anniversary, I put together a fairly faithful clone= of the original game, implemented in just a few 100 lines of bare OCaml, with nothing but the hom= ely Graphics library. It should run on Windows, Mac, and Linux, though I was too lazy to test the= latter.

    Features:

    • Faithful original physics, graphics, and animations
    • Authentic scrolling mechanics combined with dynamic window resizing
    • All 20 levels, including intermissions, and 5 difficulties
    • Pause-and-go mode for relaxed playing

    It is open-source here:

    https://github.com/ros= sberg/boulder-dash

    Enjoy!

    /Andreas

    (*) htt= ps://en.wikipedia.org/wiki/Boulder_Dash_(video_game)=20 "Boulder Dash" is a trademark of BBG Entertainment

    Jane Street OCaml extensions =E2=80=93 now with developer tool= ing!

    Diana Kalinichenko announced

    Hi everyone! We've just released a new version of our compiler extensions, = complete with all our packages and support for developer tooling, including= ocamlformat, merlin and ocaml-lsp-server. Get the install instructions at = our GitHub, and enjoy the experience in your favorite editor like V= SCode, Emacs or Vim.

    More documentation coming soon :slight_smile:. Stay tuned for future releas= es!

    opam 2.3.0 is out!

    Kate announced

    Hi everyone,

    As mentioned in our talk at the OCaml Workshop 2024, we de= cided to switch to a time-based release cycle (every 6 months), starting wi= th opam 2.3.

    As promised, we are happy to announce the final release of opam 2.3.0.

    What=E2=80=99s new?

    • When loading a repository, opam now ignores files in packages=E2=80= =99 files/ directories which aren=E2=80=99t listed in the extra-files field= of the opam file. :warning: If you maintain an opam repository, please= read our blog post= to make sure your repository stays compatible.
    • Packages requiring an unsupported version of opam are now marked una= vailable, instead of causing a repository error. This means an opam rep= ository can now allow smoother upgrade in the future
    • opam list –latests-only: a new option to list only the la= test versions of packages
    • –verbose-on: a new option to enable verbose output for sp= ecified package names.
    • opam switch import –deps-only: a new option to install on= ly the dependencies of the root packages listed in the opam switch export f= ile
    • opam switch list-available no longer displays compilers flagged = with avoid-version~/~deprecated unless --all is g= iven, meaning that pre-release or unreleased OCaml packages no longer appea= r to be the latest version
    • The builtin-0install solver was improved and should now be capab= le of being your default solver instead of builtin-mccs+glpk. = If you wish to give it a try, simply calling opam option solver=3Dbui= ltin-0install (call opam option solver=3D restores the = default)
    • Most of the unhelpful conflict messages were fixed :flashlight:<= /li>
    • Fix the internal cache of installed packages, which was storing = the wrong version of the opam file after a build failure. (#6213)

    Various performance and other improvements were made and bugs were fixed.

    :open_book: You can read our blog post for more information about these changes and more, and = for even more details you can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh)"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) }"
    

    Please report any issues to the bug-tracker.

    Installing Developer Tools with Dune

    Steve Sherratt announced

    Dune can install and run developer tools in the context of a project. This = feature is available in the Dune De= veloper Preview and in the upcoming release of Dune 3.17. As with all o= f Dune's package management features, consider this feature to be unstable = as its UI and semantics may change without notice.

    The currently supported tools are ocamllsp and ocamlform= at. Dune has a new command dune tools exec <TOOL> -- [AR= GS]... which downloads and installs the given tool, and then runs it= with the given arguments (note the -- which separates argumen= ts to dune from arguments to the tool). Tools are installed lo= cally to the project, in its _build directory, which makes it = easy to use different versions of a tool in different projects. An unfortun= ate consequence of installing tools into _build is that for th= e time being all tools are uninstalled whenever dune clean is = run.

    Let's see it in action:

    $ dune tools exec ocamlformat -- --version
    Solution for dev-tools.locks/ocamlformat:
    - ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-l=
    inux-musl
        Building ocamlformat.0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_6=
    4-unknown-linux-musl
         Running 'ocamlformat --version'
    0.26.2
    

    Precompiled Binaries

    Note that in the example above, Dune's package solver chose to install vers= ion 0.26.2+binary-ocaml-5.2.0-built-2024-11-07.0-x86_64-unknown-linux= -musl of ocamlformat. This packages comes from a new repository of= binary packages containing pre-built executables for a select few Opam= packages. Dune will search this repository in addition to the default repo= sitories when solving packages for tools only (if a project has ocaml= format in its dependencies, the binary repository won't be searched = while solving the project's dependencies).

    The goal of the binary repository is to reduce the time it takes to get sta= rted working on a new project. Without it, Dune would need to build o= camlformat from source along with all of its dependencies, which can= take several minutes.

    For now only a small number of package versions are contained in the binary= repository. To demonstrate, here's what happens if we run dune tools= exec ocamlformat in a project with version=3D0.26.1 in= its .ocamlformat file:

     $ dune tools exec ocamlformat -- --version
    Solution for dev-tools.locks/ocamlformat:
    - astring.0.8.5
    - base.v0.17.1
    - base-bytes.base
    - base-unix.base
    - camlp-streams.5.0.1
    - cmdliner.1.3.0
    ...
    - ocamlformat.0.26.1
    ...
        Building base-unix.base
        Building ocaml-base-compiler.5.1.1
        Building ocaml-config.3
        Building ocaml.5.1.1
        Building seq.base
        Building cmdliner.1.3.0
    ...
        Building ocamlformat.0.26.1
         Running 'ocamlformat --version'
    0.26.1
    

    Dune parses .ocamlformat to determine which version of o= camlformat to install, and 0.26.1 is not in the binary = repo so it needed to be built from source.

    If your project requires a version of a package not available in the binary= repository, or you're on an operating system or architecture for which no = binary version of a package exists, the package will be built from source i= nstead. Currently the binary repository contains binaries of ocamlfor= mat.0.26.2, ocaml-lsp-server.1.18.0 and ocaml-lsp= -server.1.19.0 for x86_64-unknown-linux-musl, x86= _64-apple-darwin and aarch64-apple-darwin.

    Note that Linux binaries are statically linked with muslc so they should wo= rk on all distros regardless of dynamic linker.

    Running ocamllsp

    The program ocamllsp from the package ocaml-lsp-server analyzes OCaml code and sends information to text editors using the <= a href=3D"https://microsoft.github.io/language-server-protocol/">Language S= erver Protocol. The tool is crucial to OCaml's editor integration and i= t has a couple of quirks that are worth mentioning here.

    TL;DR: Install Dune with the install script on the Developer Preview page and you'll get an ocamllsp shell script that will install and run the = correct version of ocamllsp for your project.

    Firstly the ocamllsp executable can only analyze code that has= been compiled with the same version of the OCaml compiler as was used to c= ompile the ocamllsp executable itself. Different versions of t= he ocaml-lsp-server package are incompatible with some version= s of the OCaml compiler (e.g. ocaml-lsp-server.1.19.0 must be = built with at least 5.2.0 of the compiler). This means that wh= en Dune is choosing which version of ocaml-lsp-server to insta= ll it needs to know which version of the compiler your project is using. Th= is is only known after the project has been locked (by running dune p= kg lock), so Dune will refuse to install ocamllsp in a = project that doesn't have a lock directory or for a project that doesn't de= pend on the OCaml compiler.

    $ dune tools exec ocamllsp
    Error: Unable to load the lockdir for the default build context.
    Hint: Try running 'dune pkg lock'
    

    The ocaml-lsp-server packages in the binary repository contain metada= ta to ensure that the ocamllsp executable that gets installed = was built with the same version of the compiler as your project. For exampl= e the ocaml-lsp-server package built with ocaml.5.2.0 contains this line:

    conflicts: "ocaml" {!=3D "5.2.0"}
    

    This prevents it from being chosen if the project depends on any version of= the compiler other than 5.2.0.

    Another quirk is that ocamllsp will try to invoke the binaries= ocamlformat and ocamlformat-rpc, both found in t= he ocamlformat package. The ocaml-lsp-server pack= age doesn't depend on ocamlformat as the specific version of <= code>ocamlformat needed by a project is implied by the project's .ocamlformat file, which package managers don't consider when sol= ving dependencies. This means that in general (whether using Dune or Opam f= or package management) it's up to the user to make sure that the correct ve= rsion of ocamlformat is installed in order to use the formatti= ng features of ocamllsp.

    Otherwise expect this error in your editor:

    Unable to find 'ocamlformat-rpc' binary. Types on hover may not be well-for=
    matted. You need to install either 'ocamlformat' of version > 0.21.0 or,=
     otherwise, 'ocamlformat-rpc' package.
    

    Even if ocamllsp and ocamlformat are both install= ed by Dune, if you run dune tools exec ocamllsp you will find = that ocamllsp still can't find the ocamlformat or= ocamlformat-rpc executables. This is because unlike Opam, Dun= e does not install tools into your $PATH, and for the sake of = simplicity, the dune tools exec <TOOL> command does not = modify the environment of the tool it launches. This can be fixed by adding= _build/_private/default/.dev-tool/ocamlformat/ocamlformat/target/bin= (the directory containing ocamlformat and ocamlf= ormat-rpc when ocamlformat is installed by dune) to the= start of your $PATH variable before running dune tools = exec ocamllsp. For example starting ocamllsp with the f= ollowing shell script:

    OCAMLFORMAT_TA=
    RGET=3D"_build/_private/default/.dev=
    -tool/ocamlformat/ocamlformat/target"
    
    if [ ! -f $OCAMLF=
    ORMAT_TARGET/cookie ]; then
        # Make sure that the ocamlformat de=
    v tool is installed as it's needed by
        # ocamllsp. There's currently no co=
    mmand that just installs ocamlformat so
        # we need to run it and ignore the =
    result.
        dune tools exec ocamlformat -- --help > /dev/null
    fi
    
    # Add ocamlformat to the environment in=
     which ocamllsp runs so ocamllsp can invoke ocamlformat.
    export PATH=3D"$PWD/$=
    OCAMLFORMAT_TARGET/bin:$PATH"
    
    # Build and run ocamllsp.
    dune tools exec ocamllsp -- "$@"
    

    Of course, it's rare to manually start ocamllsp directly from = your terminal. It's normally launched by text editors. It would be impracti= cal to configure your text editor to modify $PATH and run a cu= stom command to start ocamllsp via Dune, and doing so would ma= ke it impossible to edit any project that doesn't= use Dune for package management. Instead, the Dune Developer Previe= w ships with a shell script which installs oc= amlformat and adds its bin directory to $PATH before launching dune tools exec ocamllsp. The script is s= imply named ocamllsp, and the Dune Developer Preview install s= cript adds it to ~/.dune/bin which should already be in your <= code>$PATH if you're using the Developer Preview. The ocamllsp= script also attempts to fall back to an Opam-managed installation o= f ocamllsp if it doesn't detect a Dune lockdir so the same scr= ipt should work for non-Dune projects. Because the script is named the same= as the ocamllsp executable, most editors don't require specia= l configuration to run it. See the "Editor Configuration" section of the Dune Developer Preview page for m= ore information about setting up your editor.

    Some parts of the ocamllsp shell script may eventually make th= eir way into Dune itself, but for the time being the shell script is the re= commended way to launch ocamllsp for users of the Dune Develop= er Preview. The net result is that as long as your project has a lockfile, = the first time you edit some OCaml code in the project Dune will download a= nd run the appropriate version of ocamllsp.

    Dune Developer Preview Updates

    Steve Sherratt announced

    A new version of the vscode-ocaml-platform was just rel= eased which fixes a few issues with ocamllsp. You'll probably have to updat= e your install of the Dune Developer Preview (just rerun the command on this page). You'll need to configu= re a custom sandbox for vscode by putting this in your settings.json<= /code> file as otherwise the plugin assumes you're using opam = to launch ocamllsp:

    {
      "ocaml.sandbox": {
        "kind": "custom",
        "template": "$prog $args"
      }
    }
    

    First release of cmdlang

    Mathieu Barbin announced

    Hi everyone!

    A little while ago, I posted about cmdlang, a library for creating command-l= ine parsers in OCaml.

    Today, I am happy to give you an update on this project with the announceme= nt of an initial release of cmdlang packages to the opam-repository.

    These are very early days for this project. I have started using the = cmdlang+cmdliner combination in personal projects, and plan to exper= iment with climate in the near future. Please feel free to eng= age in issues/discussions, etc.

    The most recent addition on the project is the development of an evaluation= engine based on stdlib/arg.

    I'd also like to highlight some examples from the project's tests. Developi= ng these characterization tests was a fun way to learn more about the diffe= rent CLI libraries and their differences:

    If you have ideas for more cases to add (entertaining or otherwise), I'd lo= ve to integrate them into the test suite. Thanks!

    Below, you'll find details of the released packages. Happy command parsing!

    cmdlang the user facing library to build the commands. It has no dep= endencies

    cmdlang-to-cmdliner translate cmdlang commands to cmdliner

    cmdlang-to-climate translate cmdlang commands to the newly released = climate (compatibility checked with 0.1.0 & 0.2.0)

    cmdlang-stdlib-runner an execution engine implemented on top of stdl= ib.arg

    Thank you to @mseri and the opam-repository maintainers for their help.

    findlib-1.9.8

    Gerd Stolpmann announced

    Hi list,

    findlib-1.9.8 is out, fixing a few issues that slipped into 1.9.7.

    For manual, download, manuals, etc. see here:

    http://proje= cts.camlcity.org/projects/findlib.html

    An updated OPAM package will follow soon.

    Testo 0.1.0 - a new testing framework for OCaml

    Martin Jambon announced

    On this 86th anniversary of the first synthesis of LSD by Albert Hofmann, i= t is my pleasure to announce T= esto, a new testing library for OCaml.

    It borrows a lot of ideas from Alcotest and is similar in spirit but adds a= few key features that seemed too difficult to incorporate into Alcotest. F= or a gentle introduction, check out our tutorial. Important features include:

    • support for many options when creating a test of type Testo.t;
    • capturing stdout or stderr output for comparison against the expected o= utput aka snapshots;
    • reviewing and approving tests without re-running them;
    • support for nested categories while keeping the test suite as a flat li= st;
    • parallel execution using multiprocessing.

    This is the first official release of Testo and its interface is likely to = change in minor ways until we release version 1.0.0. We've been using it in= ternally at Semgrep for about a year and it's been working well for us.

    Happy testing!

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver= Authentication-Results: plum; dmarc=fail (p=none dis=none) header.from=polytechnique.org Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=NSIPclam; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=rr7oa9x+; dkim-atps=neutral Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 1A13FB80123 for ; Tue, 26 Nov 2024 08:30:13 +0000 (GMT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=iGKId240KdP4Kd/42IDGwXdjNg0PYqJ5btHQ1V6uDuI=; b=NSIPclamNBR/9aLDD7NDFpMGk3CdquOwCjyjQG7YD/iSDHaEOHscWir+ K4/33bntr7xwPueCsOZvoDgXdTvyXFUuHa/Hi8+Jpm1WLA6MnOdUF2AxM Eus32p1zZyhW8+Ac02z2TH+2TAapNJ9r2sql+qvL/wscoPAlVae93rDPR U=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,185,1728943200"; d="scan'208,217";a="195797004" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 26 Nov 2024 09:30:12 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id EA89AE0D21; Tue, 26 Nov 2024 09:30:11 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 1915CE00B6 for ; Tue, 26 Nov 2024 09:30:07 +0100 (CET) IronPort-SDR: 6745870c_u/ko2Ya7CJahaXs+POBkgOnPWP7n7hF4+z5cnpp06a4qEcw omsgQD10RJio65mL9qrAZpmf0NTSjzYP5BJwXWQ== X-IPAS-Result: =?us-ascii?q?A0EWDQAJhkVngSIeaIFagl6BP1soGQFjWjMHCEiEVoNPj?= =?us-ascii?q?h+BFQGQN4p3gnsDGBYjFAEDAQ0uAQUNAQIEAQEDAQIBggyCdAIWikUCHwYBB?= =?us-ascii?q?DQTAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABAT0FSYV7DUkBA?= =?us-ascii?q?QEBAQEBAQEEBIFrLSRxYQQDBgYBAQEBAQEBAQEnAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIIBAEzBAtcAQgKEwEBJgUNG?= =?us-ascii?q?CMDFAEGAwIEDQE1FwEJCRQGgg9Zgh9FAwUMBj+TCJtLeoEygQGCDAEBBoEIP?= =?us-ascii?q?gIBAgkCBQ8v2gaBZAmBSIVqgkgaASpIagKERgmDOHsnD4FVRIEVNYFzSgdvg?= =?us-ascii?q?j8FBhcBAQEBGEICYAEBAksJgyWCaYIoChItTDgCB4EsgTNkEiMCdxyDc4IPX?= =?us-ascii?q?oENg35Hgm0QAlaBXIIagT+BMIEPghAEiTSBR0szMgFVExcLBwVggRYDgXmBT?= =?us-ascii?q?YE2gVFDgk5KhQyBAzmCEWlLOgINAjaCJCRZgk2DWIFBhGmEXIYYHUADC209N?= =?us-ascii?q?xQboD0BCTNpAUaCew4KARQQCQYBATwPCygFBQULCQgIAgQCBRsCDR8CBAMBB?= =?us-ascii?q?QkqAR8TDgkFBQQEGAcIDRIFAwECOgOSPAgMJQMjB3eSHoo9k1EdbTQHhB2BX?= =?us-ascii?q?QYMiEBDgSSSJINWhASBV4U6hXSHAJJIIphZIoI0hyWBJQlfgXiVJgIFHgcEB?= =?us-ascii?q?DqFFIF+IzxvARoBDgczGjBDDQaCVAkKPBwPji0WgUmCD4E+gSaBdTuCbcA7Q?= =?us-ascii?q?jUCAQE3AgcBCgEBAwmFYgEBgiGBF4EhOoE1hD4EMG5dAQE?= IronPort-PHdr: A9a23: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 42BrpyMxlTi IronPort-Data: A9a23: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 wRAO0QDOXk= IronPort-HdrOrdr: A9a23:lzfQ4qiqbTmOQBaxHNX1Ccsu0nBQX5p13DAbv31ZSRFFG/Gwv9 ulnfQF2RKxoCt5YgBipTnhAsW9qKjnhNpICet4B8baYOCCggaVxe5ZnPffKlfbdREWyNQtop uIH5IOeeEZ4zBB/IbHCCfRKads/DCsytHjuQ9HpE0dDD2DUslbnklE4uzyKDw7eOA+P+t3KH P+3Ls5m9PDQwVrUi3hPAhyLqH+TrTw/fqMC39ndnxXjXjr/FTYjs+AYmKlN3ElIkFyKJgZgC D4emfCl9aeWp+Au2/hPiPonuprcOWK8Ko3OOW8zu4PKjvtjQ6sIKlCe5nHhjA6p+mz9E0n+e O84SvJ6a9ImjbslwyOzicE0GPboUITAqDZuDzo+UfLkIj/QnYzEMBBhZ1UGyGpoHYdgA== X-Talos-CUID: =?us-ascii?q?9a23=3AmzDKCGnbeOhnbvkAI8p4xJ0SlhjXOX3Y6V3XJ2a?= =?us-ascii?q?6NWxgaeOIbkahyq5Hy/M7zg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3AcFxHFQwtz/dWch/8Zev62DhVuSGaqPqMEXIguKU?= =?us-ascii?q?4guKVODVOZxiHkx6XHJByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,185,1728943200"; d="scan'208,217";a="102633491" X-MGA-submission: =?us-ascii?q?MDEBqIIiYph0zQ1/uCIoPoNiHn296vnfX9LppS?= =?us-ascii?q?armXxR8yjqyBp2GfjEyzVdWmCZHnx6NsG38vM5I0xAgGJsjClJ9mVzgs?= =?us-ascii?q?S3vh6h8LCmryDd6tylmbthWYMu9GIOBUfoNd6br7ApzijsUNUA41nwmD?= =?us-ascii?q?R4Y+TkrP9VKl7xxDZh8KE7Xg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Nov 2024 09:30:05 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 09A215649E2; Tue, 26 Nov 2024 09:30:03 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1732609803; bh=GvXYH1Bg0n6xtBLVUFT/7m7wj/gI2PHB95KATyWiNU4=; h=From:To:Subject:Date:Message-ID; b=rr7oa9x++DS6FL+jKyboiqhVQOTTdJANe0ZgW/Tsmu6PvO/LjnqfNETREcObaEMA8 syrJjTcTHVodbRDBCdkSa/R8mA7B4y3NhBUlR+rfWxNa6VNLoC0o6cytBgWXDfbzCq pHjaGW2I7u+IwUV3TZEgvi37h7AkWvr3deay3l0g= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 26 Nov 2024 09:30:02 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 26 09:30:03 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.494532, queueID=433245649E3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19214 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMTkgdG8gMjYsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9DYW1s IDUuMi4xIHJlbGVhc2VkDQpzbWF3cyBwcmV2aWV3IHJlbGVhc2UsIGFuIEFXUyBTREsgZm9yIE9D YW1sIHVzaW5nIGVpbw0KcHB4X2Rlcml2aW5nX2V6anNvbm0NCkZVTiBPQ2FtbCBub3cgaGFzIGEg WW91VHViZSBDaGFubmVsDQpUZXJyYXRlYW0ncyBvcGVuIHNvdXJjZSBPY2FtbCByZXBvc2l0b3J5 DQpPVVBTIGRlY2VtYmVyIDIwMjQNCkR1bmUgZGV2IG1lZXRpbmcNCk90aGVyIE9DYW1sIE5ld3MN Ck9sZCBDV04NCg0KDQpPQ2FtbCA1LjIuMSByZWxlYXNlZA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC01LTItMS1yZWxlYXNlZC8xNTYzNC8xPg0K DQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGhhdmUgdGhlIHBsZWFzdXJlIG9mIGFu bm91bmNpbmcgdGhlIHJlbGVhc2Ugb2YgT0NhbWwgNS4yLjEsDQogIGRlZGljYXRlZCB0byB0aGUg bWVtb3J5IG9mIE5pZWxzIEJvaHIgYW5kIFBhdWwgw4lsdWFyZCBvbiB0aGUNCiAgYW5uaXZlcnNh cnkgb2YgdGhlaXIgZGVhdGhzLg0KDQogIE9DYW1sIDUuMi4xIGlzIGEgY29sbGVjdGlvbiBvZiBz YWZlIGJ1dCBpbXBvcnQgcnVudGltZSB0aW1lIGJ1ZyBmaXhlcw0KICBiYWNrcG9ydGVkIGZyb20g dGhlIDUuMyBicmFuY2ggb2YgT0NhbWwgdG8gaW1wcm92ZSB0aGUgc3RhYmlsaXR5IG9mDQogIHRo ZSA1LjIgcnVudGltZSB3aGlsZSB3YWl0aW5nIGZvciB0aGUgdXBjb21pbmcgcmVsZWFzZSBvZiBP Q2FtbCA1LjMuMC4NCg0KICBUaGUgZnVsbCBsaXN0IG9mIGJ1ZyBmaXhlcyBpcyBhdmFpbGFibGUg YmVsb3cgZm9yIG1vcmUgZGV0YWlscy4NCg0KICBIYXBweSBoYWNraW5nLCBGbG9yaWFuIEFuZ2Vs ZXR0aSwgZm9yIHRoZSBPQ2FtbCB0ZWFtLg0KDQoNCkluc3RhbGxhdGlvbiBJbnN0cnVjdGlvbnMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBiYXNlIGNvbXBpbGVyIGNhbiBiZSBpbnN0YWxs ZWQgYXMgYW4gb3BhbSBzd2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzOg0KDQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNy ZWF0ZSA1LjIuMQ0KICDilJTilIDilIDilIDilIANCg0KICBUaGUgc291cmNlIGNvZGUgZm9yIHRo ZSByZWxlYXNlIGlzIGFsc28gZGlyZWN0bHkgYXZhaWxhYmxlIG9uOg0KDQogIOKAoiBbR2l0SHVi XQ0KICDigKIgW0lucmlhIGFyY2hpdmVdDQoNCg0KW0dpdEh1Yl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9hcmNoaXZlLzUuMi4xLnRhci5nej4NCg0KW0lucmlhIGFyY2hpdmVdDQo8 aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuMi9vY2FtbC01LjIuMS50 YXIuZ3o+DQoNCg0KQnVnIEZpeGVzIEluIE9DYW1sIDUuMi4xICgxOCBOb3ZlbWJlciAyMDI0KQ0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBSdW50aW1lIFN5c3RlbToNCg0KICDigKIgWyMxMzIwN106 IEJlIHN1cmUgdG8gcmVsb2FkIHRoZSByZWdpc3RlciBjYWNoaW5nIHRoZSBleGNlcHRpb24NCiAg ICBoYW5kbGVyIGluIGBjYW1sX2NfY2FsbCcgYW5kIGBjYW1sX2NfY2FsbF9zdGFja19hcmdzJywg YXMgaXRzIHZhbHVlDQogICAgbWF5IGhhdmUgYmVlbiBjaGFuZ2VkIGlmIHRoZSBPQ2FtbCBzdGFj ayBpcyBleHBhbmRlZCBkdXJpbmcgYQ0KICAgIGNhbGxiYWNrLiAgKE1pb2QgVmFsbGF0LCByZXBv cnQgYnkgVmVzYSBLYXJ2b25lbiwgcmV2aWV3IGJ5IEdhYnJpZWwNCiAgICBTY2hlcmVyIGFuZCBY YXZpZXIgTGVyb3kpDQogIOKAoiBbIzEzMjUyXTogUmV3b3JrIHJlZ2lzdGVyIGFzc2lnbm1lbnQg aW4gdGhlIGludGVycHJldGVyIGNvZGUgb24gbTY4aw0KICAgIG9uIExpbnV4LCBkdWUgdG8gdGhl ICVhNSByZWdpc3RlciBiZWluZyB1c2VkIGJ5IEdMSUJDLiAgKE1pb2QNCiAgICBWYWxsYXQsIHJl cG9ydCBieSBTdMOpcGhhbmUgR2xvbmR1LCByZXZpZXcgYnkgR2FicmllbCBTY2hlcmVyIGFuZA0K ICAgIFhhdmllciBMZXJveSkNCiAg4oCiIFsjMTMyNjhdOiBGaXggYSBjYWxsIHRvIHRlc3QgaW4g YGNvbmZpZ3VyZS5hYycgdGhhdCB3YXMgY2F1c2luZw0KICAgIGVycm9ycyB3aGVuIExERkxBR1Mg Y29udGFpbnMgc2V2ZXJhbCB3b3Jkcy4gIChTdMOpcGhhbmUgR2xvbmR1LA0KICAgIHJldmlldyBi eSBNaW9kIFZhbGxhdCkNCiAg4oCiIFsjMTMyMzRdLCBbIzEzMjY3XTogT3BlbiBydW50aW1lIGV2 ZW50cyBmaWxlIGluIHJlYWQtd3JpdGUgbW9kZSBvbg0KICAgIEFSTWVsIChBUk12NSkgc3lzdGVt cyBkdWUgdG8gYXRvbWljIG9wZXJhdGlvbnMgbGltaXRhdGlvbnMgb24gdGhhdA0KICAgIHBsYXRm b3JtLiAgKFN0w6lwaGFuZSBHbG9uZHUsIHJldmlldyBieSBNaW9kIFZhbGxhdCBhbmQgVmluY2Vu dA0KICAgIExhdmlyb24pDQogIOKAoiBbIzEzMTg4XTogZml4IHJhY2VzIGluIHRoZSBGRkkgY29k ZSBjb21pbmcgZnJvbSB0aGUgdXNlIG9mDQogICAgYEludF92YWwoLi4uKScgIG9uIHJvb3RlZCB2 YWx1ZXMgaW5zaWRlIGJsb2NraW5nIHF1ZXN0aW9ucyAvIHdpdGhvdXQNCiAgICB0aGUgcnVudGlt ZSBsb2NrLiAgKENhbGxpbmcgYEludF92YWwoLi4uKScgb24gbm9uLXJvb3RlZCBpbW1lZGlhdGVz DQogICAgaXMgZmluZSwgYnV0IGFueSBhY2Nlc3MgdG8gcm9vdGVkIHZhbHVlcyBtdXN0IGJlIGRv bmUgb3V0c2lkZQ0KICAgIGJsb2NraW5nIHNlY3Rpb25zIC8gd2l0aCB0aGUgcnVudGltZSBsb2Nr LikgIChFdGllbm5lIE1pbGxvbiwgcmV2aWV3DQogICAgYnkgR2FicmllbCBTY2hlcmVyLCBKYW4g TWlkdGdhYXJkLCBPbGl2aWVyIE5pY29sZSkNCiAg4oCiIFsjMTMzMThdOiBGaXggcmVncmVzc2lv biBpbiBHQyBhbGFybXMsIGFuZCBmaXggdGhlbSBmb3IgRmxhbWJkYS4NCiAgICAoR3VpbGxhdW1l IE11bmNoLU1hY2NhZ25vbmksIHJlcG9ydCBieSBCZW5qYW1pbiBNb25hdGUsIHJldmlldyBieQ0K ICAgIFZpbmNlbnQgTGF2aXJvbiBhbmQgR2FicmllbCBTY2hlcmVyKQ0KICDigKIgWyMxMzE0MF06 IFBPV0VSIGJhY2stZW5kOiBmaXggaXNzdWUgd2l0aCBjYWxsIHRvDQogICAgYGNhbWxfY2FsbF9y ZWFsbG9jX3N0YWNrJyBmcm9tIGEgRExMIChYYXZpZXIgTGVyb3ksIHJldmlldyBieSBNaW9kDQog ICAgVmFsbGF0KQ0KICDigKIgWyMxMzM3MF06IEZpeCBhIGxvdy1wcm9iYWJpbGl0eSBjcmFzaCB3 aGVuIGNhbGxpbmcgYEdjLmNvdW50ZXJzJy4NCiAgICAoRGVtaSBNYXJpZSBPYmVub3VyLCByZXZp ZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KICDigKIgWyMxMzQwMl0sIFsjMTM1MTJdLCBbIzEzNTQ5 XSwgWyMxMzU1M106IFJldmlzZSBieXRlY29kZQ0KICAgIGltcGxlbWVudGF0aW9uIG9mIGNhbGxi YWNrcyBzbyB0aGF0IGl0IG5vIGxvbmdlciBwcm9kdWNlcyBkYW5nbGluZw0KICAgIHJlZ2lzdGVy ZWQgYnl0ZWNvZGUgZnJhZ21lbnRzLiAgKFhhdmllciBMZXJveSwgcmVwb3J0IGJ5IEphbg0KICAg IE1pZHRnYWFyZCwgYW5hbHlzaXMgYnkgU3RlcGhlbiBEb2xhbiwgcmV2aWV3IGJ5IE1pb2QgVmFs bGF0KQ0KICDigKIgWyMxMzUwMl06IEZpeCBtaXNpbmRleGluZyByZWxhdGVkIHRvIGBHYy5maW5h bGlzZV9sYXN0JyB0aGF0IGNvdWxkDQogICAgcHJldmVudCBmaW5hbGlzZXJzIGZyb20gYmVpbmcg cnVuLiAgKE5pY2sgUm9iZXJ0cywgcmV2aWV3IGJ5IE1hcmsNCiAgICBTaGlud2VsbCkNCiAg4oCi IFsjMTM1MjBdOiBGaXggY29tcGlsYXRpb24gb2YgbmF0aXZlLWNvZGUgdmVyc2lvbiBvZg0KICAg IHN5c3RocmVhZHMuIEJ5dGVjb2RlIGZpZWxkcyB3ZXJlIGJlaW5nIGluY2x1ZGVkIGluIHRoZSB0 aHJlYWQNCiAgICBkZXNjcmlwdG9ycy4gIChEYXZpZCBBbGxzb3BwLCByZXZpZXcgYnkgU8OpYmFz dGllbiBIaW5kZXJlciBhbmQgTWlvZA0KICAgIFZhbGxhdCkNCg0KDQogIFsjMTMyMDddIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMjA3Pg0KDQogIFsjMTMyNTJdIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMjUyPg0KDQogIFsjMTMyNjhd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMjY4Pg0KDQogIFsjMTMy MzRdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMjM0Pg0KDQogIFsj MTMyNjddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMjY3Pg0KDQog IFsjMTMxODhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMTg4Pg0K DQogIFsjMTMzMThdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzMzE4 Pg0KDQogIFsjMTMxNDBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzEz MTQwPg0KDQogIFsjMTMzNzBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVz LzEzMzcwPg0KDQogIFsjMTM0MDJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzEzNDAyPg0KDQogIFsjMTM1MTJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwv aXNzdWVzLzEzNTEyPg0KDQogIFsjMTM1NDldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvaXNzdWVzLzEzNTQ5Pg0KDQogIFsjMTM1NTNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEzNTUzPg0KDQogIFsjMTM1MDJdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzEzNTAyPg0KDQogIFsjMTM1MjBdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEzNTIwPg0KDQoNCnNtYXdzIHByZXZpZXcgcmVsZWFzZSwgYW4g QVdTIFNESyBmb3IgT0NhbWwgdXNpbmcgZWlvDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1zbWF3cy1wcmV2aWV3LXJlbGVhc2UtYW4tYXdzLXNkay1mb3Itb2NhbWwtdXNp bmctZWlvLzE1NjM1LzE+DQoNCg0KQ2hyaXMgQXJtc3Ryb25nIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSSdtIHBsZWFzZWQgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IHByZXZpZXcg cmVsZWFzZSBmb3IgdGhlIFtzbWF3c10NCiAgbGlicmFyeSAoYDAuMX5wcmV2aWV3MScpLg0KDQog ICpbc21hd3NdKiBwcm92aWRlcyBBV1MgYmluZGluZ3MgZm9yIE9DYW1sIHVzaW5nIHRoZSBtb2Rl cm4gW2Vpb10NCiAgIGxpYnJhcnkgZm9yIGVmZmVjdHMtYmFzZWQgY29uY3VycmVuY3kgaGFuZGxp bmcuDQoNCg0KW3NtYXdzXSA8aHR0cHM6Ly9naXRodWIuY29tL2NocmlzLWFybXN0cm9uZy9zbWF3 cz4NCg0KW2Vpb10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvZWlvPg0KDQpM aW5rcw0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFtJbnN0YWxsYXRpb24gYW5kIFVzYWdlIGlu c3RydWN0aW9uc10NCiAg4oCiIFtFeGFtcGxlc10NCg0KDQpbSW5zdGFsbGF0aW9uIGFuZCBVc2Fn ZSBpbnN0cnVjdGlvbnNdDQo8aHR0cHM6Ly9jaHJpcy1hcm1zdHJvbmcuZ2l0aHViLmlvL3NtYXdz L3NtYXdzLWNsaWVudHMvPg0KDQpbRXhhbXBsZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Nocmlz LWFybXN0cm9uZy9zbWF3cy90cmVlL21haW4vYXdzc2RrbGliX2V4YW1wbGVzPg0KDQoNCldoYXRz IGluIHRoaXMgcmVsZWFzZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyByZWxlYXNlIGluY2x1ZGVzIFNES3Mg Zm9yIHNvbWUgQVdTIHNlcnZpY2VzIGFuZCBpcyBpbnRlbmRlZCB0bw0KICBkZW1vbnN0cmF0ZSBp dHMgQVBJLg0KDQogIEl0IGlzIG5vdCBwcm9kdWN0aW9uIHJlYWR5LCBsYWNraW5nIGltcG9ydGFu dCBmZWF0dXJlcyBzdWNoIGFzIGZ1bGwNCiAgQVBJIGRvY3VtZW50YXRpb24gRUMyL0VDUyBpbnN0 YW5jZSBtZXRhZGF0YSBhdXRoZW50aWNhdGlvbiwgcmV0cnkgYW5kDQogIHRpbWVvdXQgaGFuZGxp bmcsIGV0Yy4gSXQgYWxzbyBuZWVkcyBzdXBwb3J0IGZvciB0aGUgb3RoZXIgaW50ZXJuYWwNCiAg QVdTIEFQSSB0eXBlcyB0byBleHRlbmQgY292ZXJhZ2UgYWNyb3NzIG1vc3QgQVdTIHNlcnZpY2Vz Lg0KDQoNCk1vdGl2YXRpb24NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEkg d2FudGVkIHRvIGJ1aWxkIGFuIEFXUyBTREsgdXNpbmcgbW9kZXJuIGVmZmVjdHMtYmFzZWQNCiAg Y29uY3VycmVuY3kuIEkndmUgYnVpbHQgc2ltaWxhciBiaW5kaW5ncyBmb3IgUmVTY3JpcHQgYW5k IFJlYXNvbk1MIGluDQogIHRoZSBwYXN0IChzb21lIG9mIHRoZSBjb2RlIGlzIGluIGZhY3QgcG9y dGVkIGFjcm9zcykgYnV0IHRoaXMgaXMgdGhlDQogIGZpcnN0IE9DYW1sLW5hdGl2ZSBiaW5kaW5n cyBJJ3ZlIGNyZWF0ZWQuDQoNCiAgVW5saWtlIHNpbWlsYXIgcHJvamVjdHMgaW4gdGhlIE9DYW1s IGVjb3N5c3RlbSwgaXQgdXNlcyB0aGUgbmV3ZXINCiAgU21pdGh5IGRlZmluaXRpb25zIHRvIGdl bmVyYXRlIGl0cyBiaW5kaW5ncyBpbnN0ZWFkIG9mIHRoZSBQeXRob24NCiAgYm90b2NvcmUgZGVm aW5pdGlvbnMuIFRoZXNlIHNob3VsZCBiZSBiZXR0ZXIgc3VwcG9ydGVkIGJ5IEFXUyBpbiB0aGUN CiAgZnV0dXJlIHdpdGggcmljaGVyIEFQSSBkZWZpbml0aW9ucy4NCg0KDQpXaGF0J3MgbmV4dA0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTXkgbmV4dCB0YXNrIGlzIHRv IGZpbmlzaCBvZmYgQVBJIGRvY3VtZW50YXRpb24gZ2VuZXJhdGlvbiwgYW5kIHRoZW4NCiAgZXhw YW5kIHN1cHBvcnQgZm9yIGFsbCB0aGUgYXV0aGVudGljYXRpb24gbWV0aG9kcyBhbmQgb3RoZXIg QVBJIHR5cGVzDQogIHRoYXQgd2lsbCBhbGxvdyB0aGlzIHRvIGJlIHVzZWQgd2l0aCBtb3N0IEFX UyBzZXJ2aWNlcy4NCg0KDQpwcHhfZGVyaXZpbmdfZXpqc29ubQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHB4LWRlcml2aW5nLWV6anNvbm0v MTU2MzcvMT4NCg0KDQpQYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBgcHB4X2Rlcml2aW5nX2V6 anNvbm0nIChiYXNlZCBvZmYNCiAgb2YgW3BweF9kZXJpdmluZ195YW1sXSkuIFRoZSB0d28gbGli cmFyaWVzIHNoYXJlIGEgY29tbW9uIGRlZmluaXRpb24NCiAgb2YgYSAiYHZhbHVlJyIgd2hpY2gg bWFkZSB0aGUgcmV1c2Ugb2YgdGhlIGV4aXN0aW5nIGRlcml2ZXIgcG9zc2libGUNCiAgZm9yIGEg c2ltcGxlIEpTT04gZGVyaXZlci4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBk YXRlDQogIOKUgiBvcGFtIGluc3RhbGwgcHB4X2Rlcml2aW5nX2V6anNvbm0NCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgVGhlIFtkb2N1bWVudGF0aW9uIGlzIG9ubGluZV0uDQoNCiAgVGhpcyBsaWJy YXJ5IG1heSBjb21lIGluIGhhbmR5IHdoZW4geW91ciBkZXBlbmRlbmN5IGNvbmUgYWxyZWFkeQ0K ICBpbmNsdWRlcyBgZXpqc29ubScuIElmIHRoYXQgaXMgbm90IHRoZSBjYXNlLCB5b3Ugd291bGQg cHJvYmFibHkgaGF2ZQ0KICBiZXR0ZXIgbHVjayBpbiB0aGUgYHlvanNvbicgZWNvc3lzdGVtIG9m IHRvb2xzLg0KDQogIEhhcHB5IEpTT04taW5nIDpjYW1lbDoNCg0KDQpbcHB4X2Rlcml2aW5nX3lh bWxdDQo8aHR0cHM6Ly9naXRodWIuY29tL3BhdHJpY29mZXJyaXMvcHB4X2Rlcml2aW5nX3lhbWwv Pg0KDQpbZG9jdW1lbnRhdGlvbiBpcyBvbmxpbmVdDQo8aHR0cHM6Ly9wYXRyaWNvZmVycmlzLmdp dGh1Yi5pby9wcHhfZGVyaXZpbmdfeWFtbC9wcHhfZGVyaXZpbmdfZXpqc29ubS9pbmRleC5odG1s Pg0KDQoNCkZVTiBPQ2FtbCBub3cgaGFzIGEgWW91VHViZSBDaGFubmVsDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Z1bi1vY2FtbC1ub3ctaGFzLWEteW91dHViZS1jaGFu bmVsLzE1NjM5LzE+DQoNCg0KU2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSSBqdXN0IGNyZWF0ZWQgYSBZb3VUdWJlIGNoYW5uZWwgZm9yIEZVTiBPQ2Ft bC4gOnNwYXJrbGVzOiA6Y2FtZWw6DQoNCiAgVGhlIHRhbGsgcmVjb3JkaW5ncyBmcm9tIHRoZSBj b25mZXJlbmNlIGluIEJlcmxpbiBvbiBTZXB0ZW1iZXIgMTYgKw0KICAxNywgMjAyNCBhcmUgbm93 IGF2YWlsYWJsZSBmb3Igdmlld2luZyENCg0KICA8aHR0cHM6Ly93d3cueW91dHViZS5jb20vQEZV Tk9DYW1sL2ZlYXR1cmVkPg0KDQogIElmIHlvdSBjYW4sIGNvbW1lbnRpbmcsIGxpa2luZywgb3Ig c3Vic2NyaWJpbmcgaGVscHMgdXMgdG8gbWFrZSB0aGVzZQ0KICB2aWRlb3MgbW9yZSB2aXNpYmxl IGFuZCBlYXNpZXIgdG8gZmluZCBvbiBZb3VUdWJlLCBzbyBiaWcgdGhhbmtzIGZvcg0KICBldmVy eW9uZSB3aG8gaGVscHMgdXMgd2l0aCB0aGlzISA6b3JhbmdlX2hlYXJ0OiA6Y2FtZWw6DQoNCiAg Rm9yIHBlb3BsZSB3aG8gYXZvaWQgWW91VHViZTogVGhlIHZpZGVvcyB3aWxsIGFsc28gYmUgbWFk ZSBhdmFpbGFibGUNCiAgb24gd2F0Y2gub2NhbWwub3JnLg0KDQoNClRlcnJhdGVhbSdzIG9wZW4g c291cmNlIE9jYW1sIHJlcG9zaXRvcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvdGVycmF0ZWFtcy1vcGVuLXNvdXJjZS1vY2FtbC1yZXBvc2l0 b3J5LzE1NjQ1LzE+DQoNCg0KTWFsY29sbSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgZmV3IHllYXJzIGFnbyBteSBm cmllbmQgYW5kIEkgc3RhcnRlZCBhIGNvbXBhbnkgY2FsbGVkIFtUZXJyYXRlYW1dLA0KICB3aGlj aCBkb2VzIGluZnJhc3RydWN0dXJlIG9yY2hlc3RyYXRpb24gb24gR2l0SHViLiAgQmVpbmcgdGhh dCBJIGFtIGFuDQogIE9jYW1sZXIgYW5kIHdlIGFyZSBhIGxlYW4gY29tcGFueSwgd2UgY2hvc2Ug dG8gdXNlIE9jYW1sIGFzIG91cg0KICBwcmltYXJ5IGxhbmd1YWdlLiAgV2UgcmVjZW50bHkgd2Vu dCBvcGVuIHNvdXJjZSBhbmQgSSdtIHBvc3RpbmcgdGhlDQogIGxpbmsgaGVyZSB0byBjb250cmli dXRlIGFuIGV4YW1wbGUgb2YgYW4gYWN0dWFsIGNvbXBhbnkgdXNpbmcgT2NhbWwuDQogIEEgcmVh bCByZXBvc2l0b3J5Lg0KDQogIFRoZSBjb2RlIGNhbiBiZSBmb3VuZCBbaGVyZV0uDQoNCiAgVGhl cmUgYSBmZXcgdGhpbmdzIHRvIG5vdGUgYWJvdXQgdGhlIHJlcG86DQoNCiAgMS4gSXQncyBhIG1v bm8gcmVwbywgc28gd2hpbGUgbWFueSBvZiB0aGUgbGlicmFyaWVzIGluIHRoZXJlIGFyZQ0KICAg ICBnZW5lcmljLCB0aGV5IGFyZSBub3QgcmVhbGx5IGluZGl2aWR1YWxseSBjb25zdW1hYmxlIGFz IGlzLg0KICAyLiBXZSBoYXZlIG91ciBvd24gY29uY3VycmVuY3kgZnJhbWV3b3JrIChtb3JlIG9u IHRoYXQgYmVsb3cpLg0KICAzLiBXZSB1c2Ugb3VyIG93biBidWlsZCBsaWJyYXJ5IChwZHMsIHdo aWNoIGlzIGluIG9wYW0pLg0KICA0LiBUaGUgY29kZSBpcyBpbiBmbHV4IGFsbCB0aGUgdGltZSBz byB0aGluZ3MgY2hhbmdlIHJhcGlkbHkuDQoNCiAgV2h5IGRpZCB3ZSBidWlsZCBvdXIgb3duIGNv bmN1cnJlbmN5IGZyYW1ld29yaz8NCg0KICBEaXNjbGFpbWVyOiBZZXQgYW5vdGhlciBjb25jdXJy ZW5jeSBmcmFtZXdvcms/IFllcCEgIERvIEkgZXhwZWN0DQogIGFueW9uZSB0byB1c2UgaXQ/IE5v cGUsIGFuZCB0aGF0J3Mgb2suICBJdCBpcyBkZXNpZ25lZCBmb3Igb3VyIG5lZWRzLg0KICBJdCdz IG1lYW50IHRvIGJlIG1haW50YWluYWJsZSBieSBvbmUgcGVyc29uLiAgSXQncyBub3QgbWVhbnQg dG8NCiAgY29tcGV0ZSB3aXRoIEx3dCBvciBBc3luYyBmb3IgbWluZCBzaGFyZS4gIElmIGl0IGdy b3dzLCBncmVhdCwgaWYgaXQNCiAgZG9lc24ndCwgSSdtIGhhcHB5IHN0aWxsLg0KDQogIE91ciBj b25jdXJyZW5jeSBmcmFtZXdvcmsgaXMgY2FsbGVkICJBc3luY2hyb25vdXMgQnVpbGRpbmcgQmxv Y2tzIg0KICAoQWJiKS4gIEl0IHN0YXJ0ZWQgb3ZlciBhIGRlY2FkZSBhZ28gd2hlbiBJIHdhcyBm cnVzdHJhdGVkIHdpdGggYSBmZXcNCiAgdGhpbmdzOg0KDQogIDEuIEkgd2FudGVkIGtxdWV1ZSBz dXBwb3J0IGluIEFzeW5jLCBidXQgKGF0IHRoZSB0aW1lKSBBc3luYyByZXF1aXJlZA0KICAgICBt b2RpZnlpbmcgYSBoYW5kZnVsIG9mIHJlcG9zIHRvIHN1cHBvcnQgaXQgYW5kIGl0IGp1c3Qgd2Fz bid0DQogICAgIG9idmlvdXMgaG93Lg0KICAyLiBMd3Qgc3VwcG9ydGVkIGtxdWV1ZSwgYnV0IGZv ciBubyBnb29kIHJlYXNvbiwgSSBqdXN0IGRpZG4ndCBsaWtlDQogICAgIEx3dC4gIFBhcnQgb2Yg aXQgd2FzIGhvdyBmYWlsdXJlIHdvcmtlZCBpbiBMd3QgYW5kIG90aGVyIHBhcnQgaXMNCiAgICAg anVzdCBpdCBkaWRuJ3QgZml0IG15IGFlc3RoZXRpYy4gIFRoYXQgaXNuJ3QgYSBkaW5nIGFnYWlu c3QgTHd0LA0KICAgICBqdXN0IHBlcnNvbmFsIHByZWZlcmVuY2UuDQogIDMuIEkgd2FudGVkIGFz IG11Y2ggb2YgaXQgdG8gYmUgaW1wbGVtZW50ZWQgaW4gT2NhbWwgYXMgcG9zc2libGUuICBBcw0K ICAgICBpdCBzdGFuZHMgbm93LCB0aGUgb25seSBDIGNvZGUgaXMgYGxpYmtxdWV1ZScgd2hpY2gg aXMgYSBsaXR0bGUNCiAgICAgc2hpbSB0byB0byBhbGxvdyBrcXVldWUgY29kZSB0byBydW4gb24g TGludXgsIG90aGVyd2lzZSBldmVyeXRoaW5nDQogICAgIGlzIGluIE9jYW1sLg0KICA0LiBJIGRp ZG4ndCBsaWtlIGhvdyBuZWl0aGVyIEFzeW5jIG5vciBMd3QgcmVhbGx5IHN1cHBvcnRlZA0KICAg ICBjYW5jZWxsaW5nIG9wZXJhdGlvbnMuICBJIHdhbnRlZCB0aGF0IHRvIGJlIHBhcnQgb2YgdGhl IGZyYW1ld29yaywNCiAgICAgbm90IGFuIGFkLWhvYyBmZWF0dXJlIHBlciBsaWJyYXJ5LiAgQ29t aW5nIGZyb20gRXJsYW5nLCBjYW5jZWxsaW5nDQogICAgIGlzIHJlYWxseSBpbXBvcnRhbnQgdG8g bWUgYW5kIHBhcnQgb2YgaG93IEkgdGhpbmsgYWJvdXQgd3JpdGluZw0KICAgICBjb25jdXJyZW50 IHNvZnR3YXJlLiAgSSB3YXMgYnVtbWVkIHRoYXQgKGxhc3QgSSBsb29rZWQpIEVpbw0KICAgICBl eHBsaWNpdGx5IHJlamVjdGVkIGNhbmNlbGxpbmcuDQogIDUuIEkgYWxzbyB3YW50ZWQgYSBsaXR0 bGUgZXhwZXJpbWVudCBvZiAid2hhdCBpZiB0aGUgY29uY3VycmVuY3kNCiAgICAgbGlicmFyeSBl eHBvc2VkIGEgc3lzY2FsbCBpbnRlcmZhY2UgbGlrZSBhbiBPUz8iICBTbyBhIGxvdCBvZiB0aGUN CiAgICAgaW50ZXJmYWNlIGlzIG1lYW50IHRvIGxvb2sgbG93LWxldmVsIChJIGRvbid0IHRoaW5r IHRoaXMgaWRlYQ0KICAgICByZWFsbHkgcGFubmVkIG91dCBvciBtYWRlIEFiYiBtZWFuaW5nZnVs bHkgZGlmZmVyZW50KS4NCiAgNi4gSSBhbHNvIGp1c3QgbGlrZSBoYXZpbmcgbXkgb3duIGZyYW1l d29ya3MuDQoNCiAgQWRkIGEgZGFzaCBvZiBuYWl2ZXRlLCAiaG93IGhhcmQgY2FuIGl0IGJlIHRv IGJ1aWxkIGEgY29uY3VycmVuY3kNCiAgZnJhbWV3b3JrPyIsIEkgc3RhcnRlZCBteSBvd24uICBG aXJzdCBjb21taXQgd2FzIE1hciA5LCAyMDEzLg0KDQogIE11Y2ggb2YgdGhlIGNvbmN1cnJlbmN5 IG1vbmFkIGlzIGJhc2VkIG9uIGFuIHVucmVsZWFzZWQgbGlicmFyeSBjYWxsZWQNCiAgYEZ1dCcg YnkgQGRidWVuemxpDQoNCiAgT3ZlciB0aW1lLCBBYmIgbWF0dXJlZCB0byB3aGVyZSBJIGNvdWxk IHVzZSBpdCBpbiBteSBwZXJzb25hbA0KICBwcm9qZWN0cy4gIEFuZCBieSB0aGUgdGltZSB3ZSBk ZWNpZGVkIHRvIG1ha2UgVGVycmF0ZWFtLCBJIGZlbHQgaXQgd2FzDQogIGdvb2QgZW5vdWdoIGZv ciBwcm9kdWN0aW9uLiAgQW5kIGl0J3MgYmVlbiBydW5uaW5nIHByb2R1Y3Rpb24gdHJhZmZpYw0K ICBmb3IgYSBmZXcgeWVhcnMgbm93Lg0KDQogIE9uZSwgdW5leHBlY3RlZCwgYmVuZWZpdCBvZiBM d3QgYW5kIEFzeW5jIGV4aXN0aW5nIGluIHRoZSBjb21tdW5pdHkgaXMNCiAgdGhhdCBhZGRpbmcg YSB0aGlyZCBvbmUgaXNuJ3QgdGhhdCBoYXJkLiAgQWxtb3N0IGFsbCBsaWJyYXJpZXMgdGhhdA0K ICB3YW50IHRvIGJlIHVzZWQgc3VwcG9ydCBib3RoLCBhbmQgdGhhdCB1c3VhbGx5IG1lYW5zIHRo YXQgdGhleSBoYXZlIGENCiAgZ2VuZXJpYyBpbnRlcmZhY2UuICBDb2h0dHAgYW5kIERucyBhcmUg ZXhhbXBsZXMuICBTbyBJIGNvdWxkIHVzZQ0KICBleGlzdGluZyBsaWJyYXJpZXMgZm9yIHRoaW5n cyBJIGRpZG4ndCB3YW50IHRvIG9yIGRvbid0IGZlZWwgSSBjb3VsZA0KICByZWFzb25hYmx5IGlt cGxlbWVudCBteXNlbGYuDQoNCiAgSSd2ZSBhbHNvIHVzZWQgQWJiIGFzIGEgZm91bmRhdGlvbiBt eSB3ZWIgZnJhbWV3b3JrIGNhbGxlZCBCcnRsDQogIChwcm9ub3VuY2VkIEJydXRhbCkgd2hpY2gg aXMgYm90aCBhIGJhY2tlbmQgZnJhbWV3b3JrIGJ1aWxkIG9uIENvaHR0cA0KICBhbmQgYSBmcm9u dGVuZCBmcmFtZXdvcmsgYnVpbHQgb24gQnJyLiAgSXQgcmVhbGx5IGRvZXNuJ3QgZG8gYW55dGhp bmcNCiAgZmFuY3ksIGxpa2UgRHJlYW0sIGl0J3MgcHJldHR5IGxvdyBsZXZlbCBhbmQgZm9jdXNl ZCBvbiBiZWluZyBzaW1wbGUuDQoNCiAgVGhlIGdvb2Q6DQoNCiAgMS4gSXQgd29ya3MhICBBdCBs ZWFzdCwgZm9yIG1lLg0KICAyLiBHaXZlbiB0aGF0IEkgd3JvdGUgdmVyeSBzaW5nbGUgbGluZSBv ZiBjb2RlLCBkZWJ1Z2dpbmcgYW5kIGJ1Zw0KICAgICBmaXhpbmcgKHdoaWNoIGlzIGxlc3MgYW5k IGxlc3MpIGlzIHZlcnkgZWFzeS4gIEkgYWxzbyBoYXZlIGEgcmVhbGx5DQogICAgIGdyZWF0IG1l bnRhbCBtb2RlbCBvZiBob3cgaXQgd29ya3MuDQogIDMuIEkgbGlrZSB0aGF0IEkgY2FuIGp1c3Qg Y2FuY2VsIGEgd2hvbGUgZ3JhcGggb2YgYXN5bmMgd29yayBpZiBpdCdzDQogICAgIG5vIGxvbmdl ciBuZWVkZWQuDQogIDQuIFRoZSBmdXR1cmUncyBsaWJyYXJ5IHdvcmtzIGluIEZyZWVCU0QsIExp bnV4LCBhbmQgSmF2YVNjcmlwdC4NCiAgNS4gVGhlIHRlc3QgY292ZXJhZ2UgaXMgcHJldHR5IGRh cm4gaGlnaC4gIFRoaXMgaXMgYmVjYXVzZSBpdCdzIGENCiAgICAgcHJldHR5IGludHJpY2F0ZSB0 aGluZyB0byBpbXBsZW1lbnQgc28gSSBoYWQgdG8gaW1wbGVtZW50IGEgbG90IG9mDQogICAgIHRl c3RzIHRvIHN0YXkgc2FuZS4NCg0KICBUaGUgYmFkOg0KDQogIDEuIFBlcmZvcm1hbmNlIGlzIG5v dCBhbnl0aGluZyBzcGVjaWFsLiAgSSBkb24ndCB0aGluayB0aGlzIGlzIGENCiAgICAgZnVuZGFt ZW50YWwgZmxhdywgaXQncyBqdXN0IHRoYXQgaXQgaXMgYXMgZmFzdCBhcyBJIG5lZWQgaXQgdG8g YmUNCiAgICAgcmlnaHQgbm93Lg0KICAyLiBTb21lIG9mIHRoZSBBUEkgaXMgYSBhd2t3YXJkIGlm IHlvdSBkb24ndCBrbm93IHRoZSBzeXN0ZW0uICBPcg0KICAgICBuYW1lcyBhcmUgbG9uZywgbGlr ZSBgQWJiX2Z1dHVyZV9jb21iaW5hdG9ycycuDQogIDMuIFRoZSBtdWx0aS10YXJnZXQgYnVpbGQg c3Rvcnkga2luZCBvZiBzdWNrcy4gIEkgdGhpbmsgdGhhdCBtaWdodCBiZQ0KICAgICBhIGJpZ2dl ciBpc3N1ZSB3aXRoIHRoZSBwZHMgYnVpbGQgc3lzdGVtIGJ1dCBmb3Igbm93IGluIHRoZSB3ZWIN CiAgICAgZnJhbWV3b3JrIHlvdSBoYXZlIHRvIHVzZSBgQWJiX2pzJyByYXRoZXIgdGhhbiBgQWJi JyBmb3INCiAgICAgZXZlcnl0aGluZy4NCiAgNC4gVGhlcmUgYXJlIGRlZmluaXRlbHkgc29tZSBj b3JuZXJzIGN1dCBpbiwgZXNwZWNpYWxseSBhcm91bmQgZmlsZQ0KICAgICBJTywgYnV0IHRoYXQn cyBPSywgd2UgZG9uJ3QgZG8gbXVjaCBmaWxlIElPLg0KICA1LiBFeHBsaWNpdGx5IHRha2VzIGFk dmFudGFnZSBpbiB0aGF0IGV2ZXJ5dGhpbmcgcnVucyBpbiBhIHNpbmdsZQ0KICAgICB0aHJlYWQu ICBTbyBpbXBsaWNpdGx5IGdvaW5nIG11bHRpLXRocmVhZGVkIHdvdWxkIHByb2JhYmx5IGJyZWFr DQogICAgIHRoaW5ncy4NCg0KICBGdXR1cmUgd29yazoNCg0KICBUaGVyZSByZWFsbHkgaXNuJ3Qg YSBsb3Qgb2YgZnV0dXJlIHdvcmsuICBGb3IgdGhlIG1vc3QgcGFydDogQWJiIGlzDQogIGRvbmUu ICBPciBzaG91bGQgSSBzYXkgdGhlIGludGVyZmFjZSBpcyBkb25lLiAgWWVzLCBpdCB3aWxsIG5l ZWQNCiAgdXBkYXRlcyB0byBmaWdodCBiaXQgcm90LCBidXQgdGhlcmUgaXNuJ3QgbXVjaCBtb3Jl IGZvciBpdCB0byBkby4gIEl0DQogIHJ1bnMgeW91ciBjb2RlIGNvbmN1cnJlbnRseSwgdGhlIGVu ZC4NCg0KICBIb3dldmVyLCBhcyBPY2FtbDUgYmVjb21lcyBtb3JlIG9mIGEgdGhpbmcsIGl0IHdp bGwgbmVlZCB0byB0YWtlDQogIGFkdmFudGFnZSBvZiB0aGF0LiAgSSBoYXZlbid0IHJlYWxseSB0 aG91Z2h0IGFib3V0IGhvdyB0byBkbyBpdC4gIE9uZQ0KICBpdGVtIEkgaGF2ZSBpbiBteSB0by1k byBsaXN0IGlzIHRvIGV2YWx1YXRlIGlmIFBpY29zIGNvdWxkIGJlIGEgYmFzZQ0KICBsYXllciBm b3IgQWJiLiAgQWJiIGlzIGEgbGF5ZXJlZCBhcHByb2FjaCBzbyByZWFsbHkgeW91IG9ubHkgbmVl ZCB0bw0KICBpbXBsZW1lbnQgdGhlIGBBYmJfaW50Zi5TJyBpbnRlcmZhY2UgYW5kIGV2ZXJ5dGhp bmcgYWJvdmUgdGhhdCBzaG91bGQNCiAgSnVzdCBXb3JrIChnaXZlbiBzaW5nbGUgdGhyZWFkZWQg c2VtYW50aWNzKS4gIEkgdGhpbmsgYW55IGZ1dHVyZSB3b3JrDQogIHRvIHN1cHBvcnQgbXVsdGkg Y29yZSB3aWxsIHByb2JhYmx5IG5lZWQgYW4gZXhwbGljaXQgInRoaXMgY3Jvc3NlcyBhDQogIHRo cmVhZCBib3VuZGFyeSIgQVBJLiAgQWJiIHdpbGwgZ2V0IHRoZXJlLCBldmVudHVhbGx5LCBidXQg cmlnaHQgbm93DQogIGl0IGRvZXNuJ3QgbmVlZCB0by4NCg0KICBFZmZlY3RzIHdpbGwgb2J2aW91 c2x5IGhhdmUgYSBiaWcgaW1wYWN0LCBJIGhhdmUgbm8gaWRlYSB3aGF0IHRoYXQnbGwNCiAgZG8g Zm9yIEFiYi4gIEkgaG9wZSBJIGNhbiB0cmFuc2l0aW9uIGl0IHNsb3dseSB0byBzdXBwb3J0aW5n IGVmZmVjdHMNCiAgYnV0IEkgZG9uJ3Qgd2FudCB0byBsb29rIGF0IGVmZmVjdHMgdW50aWwgaXQn cyBpbiB0aGUgdHlwZSBzeXN0ZW0uDQoNCiAgU29tZSwgcGVyaGFwcywgbGlicmFyaWVzIG9mIGlu dGVyZXN0IGluIHRoZSByZXBvOg0KDQogIDEuIFtBYmJfc2NoZWR1bGVyX2txdWV1ZV0gLSBUaGUg bW9zdCB1c2VkIHNjaGVkdWxlci4gIEl0IGltcGxlbWVudHMNCiAgICAgdGhlIFtBYmJfaW50Zl0g aW50ZXJmYWNlLg0KICAyLiBbQWJiX3NjaGVkdWxlcl9zZWxlY3RdIC0gQSBzaW1wbGVyIHNlbGVj dC1iYXNlZCBzY2hlZHVsZXIuICBUaGlzIGlzDQogICAgIG1lYW50IHRvIGJlIHVzZWQgYW55IHBs YWNlIGtxdWV1ZSBpcyBub3Qgc3VwcG9ydGVkIGFuZCBhbHNvIGFzDQogICAgIGRlbW8uDQogIDMu IFtQZ3NxbF9pb10gLSBBbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUG9zdGdyZVNRTCBwcm90b2Nv bC4NCiAgNC4gW0dpdGh1YmMyXSAtIEFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIEdpdEh1YiBS RVNUIGxpYnJhcnkNCiAgICAgZ2VuZXJhdGVkIGZyb20gdGhlaXIgSlNPTiBTY2hlbWEuICBUaGlz IGFjdHVhbGx5IGhhcyBubyBBYmINCiAgICAgZGVwZW5kZW5jeSwganVzdCBpbXBsZW1lbnRzIHRo ZSBBUEkgc2VyaWFsaXppbmcvZGVzZXJpYWxpemluZy4NCiAgNS4gW09wZW5BUEkgQ0xJXSAtIFRo aXMgZ2VuZXJhdGVzIGEgbGlicmFyeSAoc2VlIEdpdGh1YmMyKSBmcm9tIGFuDQogICAgIE9wZW5B UEkgc3BlYy4gIEl0IGlzLCBhYnNvbHV0ZWx5LCBhIGJpdCBvZiBhIHJhdHMgbmVzdCwgYnV0IGl0 DQogICAgIHdvcmtzLiAgV2UgY2hvc2UgdG8gZG8gY29kZS1nZW4gZm9yIHRoaXMgYmVjYXVzZSBJ IGRpZG4ndCB3YW50IHRvDQogICAgIGJlIGJsb2NrZWQgd2hlbiBjb21waWxpbmcgYmFzZWQgb24g ZGlmZmVyZW50IGNvbXBpbGVyIHZlcnNpb25zIGFzDQogICAgIHdlJ3JlIHVzaW5nIGBBc3RfaGVs cGVyJy4gIE9jYW1sLCB0aGUgY29kZSwgaXMgbW9yZSBzdGFibGUgdGhhbg0KICAgICBPY2FtbCwg dGhlIGNvbXBpbGVyIEFQSS4NCg0KICBUaGVyZSBpcyBhIGJ1bmNoIG9mIG90aGVyIHN0dWZmIGlu IHRoZXJlLiAgSWYgeW91IGRlY2lkZSB0byBwb2tlDQogIGFyb3VuZCBhbmQgaGF2ZSBhbnkgcXVl c3Rpb25zLCBmZWVsIGZyZWUgdG8gYXNrLiAgSSBjYW4gcHJvbWlzZTogbm90DQogIGV2ZXJ5IGRl Y2lzaW9uIGluIHRoZXJlIGlzIHdlbGwgdGhvdWdodCBvdXQgb3IgY29oZXJlbnQuDQoNCg0KW1Rl cnJhdGVhbV0gPGh0dHBzOi8vdGVycmF0ZWFtLmlvPg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHVi LmNvbS90ZXJyYXRlYW1pby90ZXJyYXRlYW0+DQoNCltBYmJfc2NoZWR1bGVyX2txdWV1ZV0NCjxo dHRwczovL2dpdGh1Yi5jb20vdGVycmF0ZWFtaW8vdGVycmF0ZWFtL3RyZWUvbWFpbi9jb2RlL3Ny Yy9hYmJfc2NoZWR1bGVyX2txdWV1ZT4NCg0KW0FiYl9pbnRmXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS90ZXJyYXRlYW1pby90ZXJyYXRlYW0vdHJlZS9tYWluL2NvZGUvc3JjL2FiYl9pbnRmPg0KDQpb QWJiX3NjaGVkdWxlcl9zZWxlY3RdDQo8aHR0cHM6Ly9naXRodWIuY29tL3RlcnJhdGVhbWlvL3Rl cnJhdGVhbS90cmVlL21haW4vY29kZS9zcmMvYWJiX3NjaGVkdWxlcl9zZWxlY3Q+DQoNCltQZ3Nx bF9pb10NCjxodHRwczovL2dpdGh1Yi5jb20vdGVycmF0ZWFtaW8vdGVycmF0ZWFtL3RyZWUvbWFp bi9jb2RlL3NyYy9wZ3NxbF9pbz4NCg0KW0dpdGh1YmMyXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS90 ZXJyYXRlYW1pby90ZXJyYXRlYW0vdHJlZS9tYWluL2NvZGUvc3JjL2dpdGh1YmMyPg0KDQpbT3Bl bkFQSSBDTEldDQo8aHR0cHM6Ly9naXRodWIuY29tL3RlcnJhdGVhbWlvL3RlcnJhdGVhbS90cmVl L21haW4vY29kZS9zcmMvb3BlbmFwaV9jbGk+DQoNCg0KT1VQUyBkZWNlbWJlciAyMDI0DQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L291cHMtZGVjZW1iZXItMjAyNC8x NTY1NC8xPg0KDQoNCnphcGFzaGNhbm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQ0FVVElPTjog dGhlIHRpbWUgaGFzIGJlZW4gY2hhbmdlZCBmcm9tIDdwbSB0byA2OjMwcG0NCg0KICBUaGUgbmV4 dCBPVVBTIG1lZXR1cCB3aWxsIHRha2UgcGxhY2Ugb24gKlRodXJzZGF5LCAxMnRoIG9mIERlY2Vt YmVyKg0KICAyMDI0LiBJdCB3aWxsIHN0YXJ0IGF0ICo2OjMwcG0qIGF0IHRoZSAqNCBwbGFjZSBK dXNzaWV1KiBpbiBQYXJpcy4gSXQNCiAgd2lsbCBiZSBpbiB0aGUgaW4gdGhlICpFc2NsYW5nb24g YnVpbGRpbmcqIChhbXBoaSBBc3RpZXIpLg0KDQogIFBsZWFzZSwgKltyZWdpc3RlciBvbiBtZWV0 dXAgXSogYXMgc29vbiBhcyBwb3NzaWJsZSB0byBsZXQgdXMga25vdyBob3cNCiAgbWFueSBwaXp6 YSB3ZSBzaG91bGQgb3JkZXIuDQoNCiAgRm9yIG1vcmUgZGV0YWlscywgeW91IG1heSBjaGVjayB0 aGUgW09VUFPigJkgd2Vic2l0ZSBdLg0KDQogIFRoaXMgdGltZSB3ZSdsbCBoYXZlIHRoZSBmb2xs b3dpbmcgdGFsa3M6DQoNCiAgKlNuYXBzaG90dGFibGUgU3RvcmVzIOKAkyBDbMOpbWVudCBBbGxh aW4gJiBHYWJyaWVsIFNjaGVyZXIgKEBnYXNjaGUpKg0KDQogIFdlIHNheSB0aGF0IGFuIGltcGVy YXRpdmUgZGF0YSBzdHJ1Y3R1cmUgaXMgKnNuYXBzaG90dGFibGUqIG9yDQogICpzdXBwb3J0cyBz bmFwc2hvdHMqIGlmIHdlIGNhbiBlZmZpY2llbnRseSBjYXB0dXJlIGl0cyBjdXJyZW50IHN0YXRl LA0KICBhbmQgcmVzdG9yZSBhIHByZXZpb3VzbHkgY2FwdHVyZWQgc3RhdGUgdG8gYmVjb21lIHRo ZSBjdXJyZW50IHN0YXRlDQogIGFnYWluLiBUaGlzIGlzIHVzZWZ1bCwgZm9yIGV4YW1wbGUsIHRv IGltcGxlbWVudCBiYWNrdHJhY2tpbmcgc2VhcmNoDQogIHByb2Nlc3NlcyB0aGF0IHVwZGF0ZSB0 aGUgZGF0YSBzdHJ1Y3R1cmUgZHVyaW5nIHNlYXJjaC4NCg0KICBJbnNwaXJlZCBieSBhIGRhdGEg c3RydWN0dXJlIHByb3Bvc2VkIGluIDE5NzggYnkgQmFrZXIsIHdlIHByZXNlbnQgYQ0KICAqc25h cHNob3R0YWJsZSBzdG9yZSosIGEgYmFnIG9mIG11dGFibGUgcmVmZXJlbmNlcyB0aGF0IHN1cHBv cnRzDQogIHNuYXBzaG90cy4gSW5zdGVhZCBvZiBjYXB0dXJpbmcgYW5kIHJlc3RvcmluZyBhbiBh cnJheSwgd2UgY2FuIGNhcHR1cmUNCiAgYW4gYXJiaXRyYXJ5IHNldCBvZiByZWZlcmVuY2VzIChv ZiBhbnkgdHlwZSkgYW5kIHJlc3RvcmUgYWxsIG9mIHRoZW0NCiAgYXQgb25jZS4gVGhpcyBzbmFw c2hvdHRhYmxlIHN0b3JlIGNhbiBiZSB1c2VkIGFzIGEgYnVpbGRpbmcgYmxvY2sgdG8NCiAgc3Vw cG9ydCBzbmFwc2hvdHMgZm9yIGFyYml0cmFyeSBkYXRhIHN0cnVjdHVyZXMsIGJ5IHNpbXBseSBy ZXBsYWNpbmcNCiAgYWxsIG11dGFibGUgcmVmZXJlbmNlcyBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUg Ynkgb3VyIHN0b3JlDQogIHJlZmVyZW5jZXMuIFdlIHByZXNlbnQgdXNlLWNhc2VzIG9mIGEgc25h cHNob3R0YWJsZSBzdG9yZSB3aGVuDQogIGltcGxlbWVudGluZyB0eXBlLWNoZWNrZXJzIGFuZCBh dXRvbWF0ZWQgdGhlb3JlbSBwcm92ZXJzLg0KDQogIE91ciBpbXBsZW1lbnRhdGlvbiBpcyBkZXNp Z25lZCB0byBwcm92aWRlIGEgdmVyeSBsb3cgb3ZlcmhlYWQgb3Zlcg0KICBub3JtYWwgcmVmZXJl bmNlcywgaW4gdGhlIGNvbW1vbiBjYXNlIHdoZXJlIHRoZSBjYXB0dXJlL3Jlc3RvcmUNCiAgb3Bl cmF0aW9ucyBhcmUgaW5mcmVxdWVudC4gUmVhZCBhbmQgd3JpdGUgaW4gc3RvcmUgcmVmZXJlbmNl cyBhcmUNCiAgZXNzZW50aWFsbHkgYXMgZmFzdCBhcyBpbiBwbGFpbiByZWZlcmVuY2VzIGluIG1v c3Qgc2l0dWF0aW9ucywgdGhhbmtzDQogIHRvIGEga2V5IG9wdGltaXNhdGlvbiB3ZSBjYWxsICpy ZWNvcmQgZWxpc2lvbiouIEluIGNvbXBhcmlzb24sIHRoZQ0KICBjb21tb24gYXBwcm9hY2ggb2Yg cmVwbGFjaW5nIHJlZmVyZW5jZXMgYnkgaW50ZWdlciBpbmRpY2VzIGludG8gYQ0KICBwZXJzaXN0 ZW50IG1hcCBpbmN1cnMgYSBsb2dhcml0aG1pYyBvdmVyaGVhZCBvbiByZWFkcyBhbmQgd3JpdGVz LCBhbmQNCiAgc29waGlzdGljYXRlZCBhbGdvcml0aG1zIHR5cGljYWxseSBpbXBvc2UgbXVjaCBs YXJnZXIgY29uc3RhbnQNCiAgZmFjdG9ycy4NCg0KICBUaGUgaW1wbGVtZW50YXRpb24sIHdoaWNo IGlzIGluc3BpcmVkIGJ5IEJha2VyJ3MgYW5kIHRoZSBPQ2FtbA0KICBpbXBsZW1lbnRhdGlvbiBv ZiBwZXJzaXN0ZW50IGFycmF5cyBieSBDb25jaG9uIGFuZCBGaWxsacOidHJlLCBpcyBib3RoDQog IGZhaXJseSBzaG9ydCBhbmQgdmVyeSBoYXJkIHRvIHVuZGVyc3RhbmQ6IGl0IHJlbGllcyBvbiBz aGFyZWQgbXV0YWJsZQ0KICBzdGF0ZSBpbiBzdWJ0bGUgd2F5cy4gV2UgcHJvdmlkZSBhIG1lY2hh bml6ZWQgcHJvb2Ygb2YgY29ycmVjdG5lc3Mgb2YNCiAgaXRzIGNvcmUgdXNpbmcgdGhlIElyaXMg ZnJhbWV3b3JrIGZvciB0aGUgQ29xIHByb29mIGFzc2lzdGFudC4NCiAgWy9kZXRhaWxzXQ0KDQog ICpTYWZlLCBleHByZXNzaXZlIGFuZCBlZmZpY2llbnQgcHJvZ3JhbW1pbmcgb2YgRlBHQXMgY2ly Y3VpdHMg4oCTIExvw69jDQogICBTeWx2ZXN0cmUqDQoNCiAgRlBHQXMgKEZpZWxkLVByb2dyYW1t YWJsZSBHYXRlIEFycmF5cykgYXJlIHJlY29uZmlndXJhYmxlIGRpZ2l0YWwNCiAgY2lyY3VpdHM6 IHRoZWlyIGJlaGF2aW9yIGNhbiBiZSBjdXN0b21pemVkIGJ5IGxvZ2ljIHN5bnRoZXNpcyBvZg0K ICBzcGVjaWZpY2F0aW9uIGF0IHRoZSBzby1jYWxsZWQgcmVnaXN0ZXIgdHJhbnNmZXIgbGV2ZWwg KFJUIGxldmVsKSwgaW4NCiAgaGFyZHdhcmUgZGVzY3JpcHRpb24gbGFuZ3VhZ2VzIHN1Y2ggYXMg VkhETCBvciBWZXJpbG9nLiBGUEdBcyBhcmUgd2VsbA0KICBzdWl0ZWQgdG8gaW1wbGVtZW50IHJl YWN0aXZlIHN5c3RlbXMsIGRpcmVjdGx5IGFzIHN5bmNocm9ub3VzIGNpcmN1aXRzDQogIGludGVy YWN0aW5nIHdpdGggdGhlIGV4dGVybmFsIGVudmlyb25tZW50IHZpYSBJL08gcGlucyDigJMgdGhl IGxvZ2ljDQogIHN5bnRoZXNpemVyIGVuc3VyaW5nIHRoYXQgdGltaW5nIGNvbnN0cmFpbnRzIGFy ZSBtZXQsIGdpdmVuIHRoZSBGUEdBDQogIGNsb2NrIGZyZXF1ZW5jeS4gRlBHQXMgYXJlIGFsc28g dXNlZCB0byBpbXBsZW1lbnQgaGFyZHdhcmUNCiAgYWNjZWxlcmF0b3JzIDsgaG93ZXZlciwgUlQt bGV2ZWwgZGVzY3JpcHRpb25zIG9mIHRyYW5zZm9ybWF0aW9uYWwNCiAgc3lzdGVtcyAob3Ig4oCc Y29tcHV0YXRpb25z4oCdKSDigJMgd2l0aCBsYXRlbmNpZXMgb2Ygc2V2ZXJhbCBjbG9jayBjeWNs ZXMg4oCTDQogIGFyZSBkaWZmaWN1bHQgdG8gZGVidWcsIG1haW50YWluIGFuZCBtYW51YWxseSBv cHRpbWl6ZS4gSGlnaC1MZXZlbA0KICBTeW50aGVzaXMgKEhMUykgb2ZmZXJzIGEgc2ltcGxlciB3 YXkgb2YgZXhwcmVzc2luZyBjb21wdXRhdGlvbnMsIHVzaW5nDQogIGEgcHJvZ3JhbW1pbmcgbGFu Z3VhZ2UgY29tcGlsZWQgYXQgdGhlIFJUIGxldmVsLiBUaGUgYWR2YW50YWdlIG9mIHRoaXMNCiAg YXBwcm9hY2ggaXMgdG8ga2VlcCB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBoaWRkZW4gZnJv bSB0aGUNCiAgcHJvZ3JhbW1lciwgbGVhdmluZyB0aGUgY29tcGlsZXIgcmVzcG9uc2libGUgZm9y IHNjaGVkdWxpbmcNCiAgY29tcHV0YXRpb25zIG92ZXIgdGltZS4gSG93ZXZlciwgdGhpcyBsZWFk cyB0byBhIGxvc3Mgb2YgY29udHJvbCBvdmVyDQogIHRlbXBvcmFsIGJlaGF2aW9yIGFuZCB0aGVy ZWZvcmUgc2FmZXR5IGFuZCBlZmZpY2llbmN5IGZvciB0aGUgY2lyY3VpdHMNCiAgZ2VuZXJhdGVk LiBBcyBlbWJlZGRlZCBzeXN0ZW1zLCBlc3BlY2lhbGx5IHRob3NlIGJhc2VkIG9uIEZQR0FzLCBu ZWVkDQogIHRvIHBlcmZvcm0gbW9yZSBhbmQgbW9yZSBjb21wdXRhdGlvbnMsIHdoaWxlIGludGVy YWN0aW5nIHdpdGggdGhlaXINCiAgZW52aXJvbm1lbnQsIHRoaXMgdGhlc2lzIHByb3Bvc2VzIGEg cHJvZ3JhbW1pbmcgbW9kZWwgdG8gY29tYmluZQ0KICBoYXJkd2FyZSBkZXNjcmlwdGlvbiAoZGF0 YS1mbG93IG9yaWVudGVkKSBhbmQgZ2VuZXJhbC1wdXJwb3NlIHBhcmFsbGVsDQogIGNvbXB1dGF0 aW9uIChjb250cm9sLWZsb3cgb3JpZW50ZWQpIHVzaW5nIGEgc3luY2hyb25vdXMgYXBwcm9hY2gu IFRoaXMNCiAgcHJvZ3JhbW1pbmcgbW9kZWwgZm9ybXMgdGhlIGJhc2lzIGZvciB0aGUgZGVzaWdu IGFuZCBpbXBsZW1lbnRhdGlvbiBvZg0KICBFY2xhdCwgYSBmdW5jdGlvbmFsLWltcGVyYXRpdmUs IHBhcmFsbGVsIGFuZCBzeW5jaHJvbm91cyBwcm9ncmFtbWluZw0KICBsYW5ndWFnZSwgY29tcGls ZWQgdG8gVkhETC4gRWNsYXQgaXMgc3VmZmljaWVudGx5IHByZWNpc2UgdG8gZGVzY3JpYmUNCiAg c3luY2hyb25vdXMgY2lyY3VpdHMgYXQgdGhlIFJUIGxldmVsLiBJdCBmYWNpbGl0YXRlcyB0aGUg cHJvZ3JhbW1pbmcNCiAgb2YgaGFyZHdhcmUgYWNjZWxlcmF0b3JzLCB3aXRoIGEgY2xlYXIgYW5k IHByZWRpY3RhYmxlIHRlbXBvcmFsDQogIHNlbWFudGljcyBieSB3aGljaCB0byBleHBsb2l0IHRp bWUtc3BhY2UgdHJhZGUtb2Zmcy4gQW55IEVjbGF0IHByb2dyYW0NCiAgaXMgcmVhY3RpdmUsIHdp dGggYSBtZWNoYW5pc20gZm9yIGVtYmVkZGluZyBjb21wdXRhdGlvbnMgd2l0aGluDQogIHByb2dy YW1zIGFuZCB0aGVyZWJ5IG1peCBjb21wdXRhdGlvbiBhbmQgaW50ZXJhY3Rpb24uIEVjbGF0IGFs c28NCiAgb2ZmZXJzIHNoYXJlZCBtZW1vcnkgKGluIHRoZSBmb3JtIG9mIFJBTSBibG9ja3MpLCB3 aXRoIGRldGVybWluaXN0aWMNCiAgY29uY3VycmVuY3kuIEl0IGlzIHVzZWQgdG8gZGV2ZWxvcCBw cm9ncmFtbWluZyBhYnN0cmFjdGlvbnMgc3VjaCBhcw0KICBhbGdvcml0aG1pYyBza2VsZXRvbnMg YW5kIHZpcnR1YWwgbWFjaGluZSBpbXBsZW1lbnRhdGlvbnMgZm9yDQogIGhpZ2gtbGV2ZWwgbGFu Z3VhZ2VzLiBUaGlzIGFkZHJlc3NlcywgYXQgdmFyaW91cyBsZXZlbHMsIHRoZSBuZWVkIHRvDQog IHJ1biBnZW5lcmFsLXB1cnBvc2UgYWxnb3JpdGhtcyB3aXRoaW4gRlBHQS1iYXNlZCByZWFjdGl2 ZSBlbWJlZGRlZA0KICBhcHBsaWNhdGlvbnMuDQoNCiAgQWZ0ZXIgdGhlIHRhbGtzIHRoZXJlIHdp bGwgYmUgc29tZSBwaXp6YXMgb2ZmZXJlZCBieSB0aGUgW09DYW1sDQogIFNvZnR3YXJlIEZvdW5k YXRpb25dIGFuZCBsYXRlciBvbiB3ZeKAmWxsIG1vdmUgdG8gYSBwdWIgbmVhcmJ5IGFzIHVzdWFs Lg0KDQoNCltyZWdpc3RlciBvbiBtZWV0dXAgXQ0KPGh0dHBzOi8vd3d3Lm1lZXR1cC5jb20vZnIt RlIvb2NhbWwtcGFyaXMvZXZlbnRzLzMwNDcyNjg4NT4NCg0KW09VUFPigJkgd2Vic2l0ZSBdIDxo dHRwczovL291cHMuZnJhbWEuaW8+DQoNCltPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSA8aHR0 cHM6Ly9vY2FtbC1zZi5vcmc+DQoNCg0KRHVuZSBkZXYgbWVldGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS1kZXYtbWVldGluZy8xNDk5NC8xNz4NCg0KDQpF dGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGNhbWVsZXJz ISA6Y2FtZWw6IFdlIHdpbGwgaG9sZCBvdXIgcmVndWxhciBEdW5lIGRldiBtZWV0aW5nIG9uDQog IFdlZG5lc2RheSwgTm92ZW1iZXIsIDI3dGggYXQgMTY6MDAgQ0VULiBBcyB1c3VhbCwgdGhlIHNl c3Npb24gd2lsbCBiZQ0KICBvbmUgaG91ciBsb25nLg0KDQogIFdoZXRoZXIgeW91IGFyZSBhIG1h aW50YWluZXIsIGEgcmVndWxhciBjb250cmlidXRvciwgYSBuZXcgam9pbmVyIG9yDQogIGp1c3Qg Y3VyaW91cywgeW91IGFyZSB3ZWxjb21lIHRvIGpvaW46IHRoZXNlIGRpc2N1c3Npb25zIGFyZSBv cGVuZWQhDQogIFRoZSBnb2FsIG9mIHRoZXNlIG1lZXRpbmdzIGlzIHRvIHByb3ZpZGUgYSBwbGFj ZSB0byBkaXNjdXNzIHRoZQ0KICBvbmdvaW5nIHdvcmsgdG9nZXRoZXIgYW5kIHN5bmNocm9uaXNl IGJldHdlZW4gdGhlIER1bmUgZGV2ZWxvcGVycw0KICA6b2tfaGFuZDoNCg0KDQo6Y2FsZW5kYXI6 ICpBZ2VuZGEqDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBUaGUgYWdlbmRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgW21lZXRpbmcg ZGVkaWNhdGVkIHBhZ2VdLiBGZWVsIGZyZWUgdG8NCiAgYXNrIGlmIHlvdSB3YW50IHRvIGFkZCBt b3JlIGl0ZW1zIGluIGl0Lg0KDQoNClttZWV0aW5nIGRlZGljYXRlZCBwYWdlXQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9kdW5lL3dpa2kvZGV2LW1lZXRpbmctMjAyNC0xMS0yNz4NCg0KDQo6 Y29tcHV0ZXI6ICpMaW5rcyoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBNZWV0aW5nIGxpbms6IFt6b29tXQ0KICDigKIgQ2Fs ZW5kYXIgZXZlbnQ6IFtnb29nbGUgY2FsZW5kYXJdDQogIOKAoiBXaWtpIHdpdGggaW5mb3JtYXRp b24gYW5kIHByZXZpb3VzIG5vdGVzOiBbR2l0SHViIFdpa2ldDQoNCg0KW3pvb21dDQo8aHR0cHM6 Ly91czA2d2ViLnpvb20udXMvai84NTA5Njg3Nzc3Nj9wd2Q9Y1dOaFUxZEhRMVpOU2padU9VWkNR MGgyYnk5VWR6MDk+DQoNCltnb29nbGUgY2FsZW5kYXJdDQo8aHR0cHM6Ly9jYWxlbmRhci5nb29n bGUuY29tL2NhbGVuZGFyL2VtYmVkP3NyYz1jXzVjZDY5OGRmNjc4NGUzODViMWNkY2RjMWRiY2Ex OGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzczMTklNDBncm91cC5jYWxlbmRhci5nb29n bGUuY29tPg0KDQpbR2l0SHViIFdpa2ldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93 aWtpI2Rldi1tZWV0aW5ncz4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJs b2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9n cyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKAoiBbVW5pdmVy c2FsIFJlYWN0IGluIE9DYW1sIC0gRGF2aWQgU2FuY2hvIE1vcmVubyAtIEZVTiBPQ2FtbCAyMDI0 XQ0KICDigKIgW1VzaW5nIG9kb2MgdG8gV3JpdGUgRG9jdW1lbnRhdGlvbiAtIFBhdWwtRWxsaW90 IEFuZ2zDqHMgZCdBdXJpYWMgLQ0KICAgIEZVTiBPQ2FtbCAyMDI0XQ0KICDigKIgW0hvdyB0aGUg TXVsdGljb3JlIEdhcmJhZ2UgQ29sbGVjdG9yIHdvcmtzIC0gU3VkaGEgUGFyaW1hbGEgLSBGVU4N CiAgICBPQ2FtbCAyMDI0XQ0KICDigKIgW01pcmFnZU9TIC0gRGV2ZWxvcGluZyBPcGVyYXRpbmcg U3lzdGVtcyBpbiBPQ2FtbCAtIEhhbm5lcyBNZWhuZXJ0IC0NCiAgICBGVU4gT0NhbWwgMjAyNF0N CiAg4oCiIFtUaGUgU3RvcnkgQmVoaW5kIHRoZSBGYXN0ZXN0IEltYWdlIENvbXBhcmlzb24gTGli cmFyeSAtIERtaXRyaXkNCiAgICBLb3ZhbGVua28gLSBGVU4gT0NhbWwgMjAyNF0NCiAg4oCiIFtF YXN5IEdBRFRzIGJ5IFJlcGVhdGluZyBZb3Vyc2VsZiAtIEVkdWFyZG8gUmFmYWVsIC0gRlVOIE9D YW1sIDIwMjRdDQogIOKAoiBbTWF5YmUgT0NhbWwgV2FzIHRoZSBGcmllbmRzIFdlIE1hZGUgQWxv bmcgdGhlIFdheSAtIERpbGxvbiBNdWxyb3kgLQ0KICAgIEZVTiBPQ2FtbCAyMDI0XQ0KICDigKIg W09DQU5OTCwgdGhlIGBuZXVyYWxfbmV0c19saWJgIC0gTHVrYXN6IFN0YWZpbmlhayAtIEZVTiBP Q2FtbCAyMDI0XQ0KICDigKIgW0xlYXJuaW5nIE9DYW1sIHdpdGggVGlueSBDb2RlIFhtYXMgLSBN aWNoYWVsIERhbGVzIC0gRlVOIE9DYW1sDQogICAgMjAyNF0NCiAg4oCiIFtMZXQgU2lnbmFscyBp biBPQ2FtbCAtIFJpem8gSXNyb2YgLSBGVU4gT0NhbWwgMjAyNF0NCiAg4oCiIFtBICdNZWxhbmdl JyBvZiBUb29saW5nIENvbWluZyBUb2dldGhlciAtIEFudG9uaW8gTW9udGVpcm8gLSBGVU4NCiAg ICBPQ2FtbCAyMDI0XQ0KICDigKIgW0J1aWxkaW5nIEluY3JlbWVudGFsIGFuZCBSZXByb2R1Y2li bGUgRGF0YSBQaXBlbGluZXMgLSBQYXRyaWNrDQogICAgRmVycmlzIC0gRlVOIE9DYW1sIDIwMjRd DQogIOKAoiBbVGhlIEZ1dHVyZSBvZiBEdW5lIC0gTGVhbmRybyBPc3RlcmEgLSBGVU4gT0NhbWwg MjAyNF0NCiAg4oCiIFtBZHZhbmNlZCBDb2RlIE5hdmlnYXRpb24gaW4gT0NhbWwtTFNQXQ0KICDi gKIgW29wYW0gMi4zLjAgcmVsZWFzZSFdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBz Oi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbVW5pdmVyc2FsIFJlYWN0IGluIE9DYW1sIC0gRGF2aWQg U2FuY2hvIE1vcmVubyAtIEZVTiBPQ2FtbCAyMDI0XQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29t L3dhdGNoL095M2xabDJrRS0wP3ZlcnNpb249Mz4NCg0KW1VzaW5nIG9kb2MgdG8gV3JpdGUgRG9j dW1lbnRhdGlvbiAtIFBhdWwtRWxsaW90IEFuZ2zDqHMgZCdBdXJpYWMgLSBGVU4NCk9DYW1sIDIw MjRdIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9RemZfWkIxVEtMUT92ZXJzaW9uPTM+ DQoNCltIb3cgdGhlIE11bHRpY29yZSBHYXJiYWdlIENvbGxlY3RvciB3b3JrcyAtIFN1ZGhhIFBh cmltYWxhIC0gRlVOIE9DYW1sDQoyMDI0XSA8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2gv ZmdkQl85RGNKajQ/dmVyc2lvbj0zPg0KDQpbTWlyYWdlT1MgLSBEZXZlbG9waW5nIE9wZXJhdGlu ZyBTeXN0ZW1zIGluIE9DYW1sIC0gSGFubmVzIE1laG5lcnQgLSBGVU4NCk9DYW1sIDIwMjRdIDxo dHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9nN0tsNW1SRENEbz92ZXJzaW9uPTM+DQoNCltU aGUgU3RvcnkgQmVoaW5kIHRoZSBGYXN0ZXN0IEltYWdlIENvbXBhcmlzb24gTGlicmFyeSAtIERt aXRyaXkNCktvdmFsZW5rbyAtIEZVTiBPQ2FtbCAyMDI0XQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUu Y29tL3dhdGNoL2hUQXZBS29sV2Q4P3ZlcnNpb249Mz4NCg0KW0Vhc3kgR0FEVHMgYnkgUmVwZWF0 aW5nIFlvdXJzZWxmIC0gRWR1YXJkbyBSYWZhZWwgLSBGVU4gT0NhbWwgMjAyNF0NCjxodHRwczov L3d3dy55b3V0dWJlLmNvbS93YXRjaC8tWFlPX0lMSkcyTT92ZXJzaW9uPTM+DQoNCltNYXliZSBP Q2FtbCBXYXMgdGhlIEZyaWVuZHMgV2UgTWFkZSBBbG9uZyB0aGUgV2F5IC0gRGlsbG9uIE11bHJv eSAtIEZVTg0KT0NhbWwgMjAyNF0gPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoLzFIbElI UGEzOGdZP3ZlcnNpb249Mz4NCg0KW09DQU5OTCwgdGhlIGBuZXVyYWxfbmV0c19saWJgIC0gTHVr YXN6IFN0YWZpbmlhayAtIEZVTiBPQ2FtbCAyMDI0XQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29t L3dhdGNoLzFKMlh5SExiMkowP3ZlcnNpb249Mz4NCg0KW0xlYXJuaW5nIE9DYW1sIHdpdGggVGlu eSBDb2RlIFhtYXMgLSBNaWNoYWVsIERhbGVzIC0gRlVOIE9DYW1sIDIwMjRdDQo8aHR0cHM6Ly93 d3cueW91dHViZS5jb20vd2F0Y2gvMlpzd3lONGFQMm8/dmVyc2lvbj0zPg0KDQpbTGV0IFNpZ25h bHMgaW4gT0NhbWwgLSBSaXpvIElzcm9mIC0gRlVOIE9DYW1sIDIwMjRdDQo8aHR0cHM6Ly93d3cu eW91dHViZS5jb20vd2F0Y2gvMzRiY2VBdVNSWEU/dmVyc2lvbj0zPg0KDQpbQSAnTWVsYW5nZScg b2YgVG9vbGluZyBDb21pbmcgVG9nZXRoZXIgLSBBbnRvbmlvIE1vbnRlaXJvIC0gRlVOIE9DYW1s DQoyMDI0XSA8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2gvM29DWFQteWNISHM/dmVyc2lv bj0zPg0KDQpbQnVpbGRpbmcgSW5jcmVtZW50YWwgYW5kIFJlcHJvZHVjaWJsZSBEYXRhIFBpcGVs aW5lcyAtIFBhdHJpY2sgRmVycmlzIC0NCkZVTiBPQ2FtbCAyMDI0XSA8aHR0cHM6Ly93d3cueW91 dHViZS5jb20vd2F0Y2gvNm14eDJqMWptaEU/dmVyc2lvbj0zPg0KDQpbVGhlIEZ1dHVyZSBvZiBE dW5lIC0gTGVhbmRybyBPc3RlcmEgLSBGVU4gT0NhbWwgMjAyNF0NCjxodHRwczovL3d3dy55b3V0 dWJlLmNvbS93YXRjaC83X2J2M0V2UUFOWT92ZXJzaW9uPTM+DQoNCltBZHZhbmNlZCBDb2RlIE5h dmlnYXRpb24gaW4gT0NhbWwtTFNQXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTEx LTIwLWFkdmFuY2VkLWNvZGUtbmF2aWdhdGlvbi1pbi1vY2FtbC1sc3A+DQoNCltvcGFtIDIuMy4w IHJlbGVhc2UhXQ0KPGh0dHBzOi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAyNF8xMV8xM19vcGFtXzJf M18wX3JlbGVhc2VzPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElm IHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFu ZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hp dmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxz byB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmli ZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBt ZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpb dGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1Mg ZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9j d24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZv L2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5u ZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 19 to 26, 20= 24.

    OCaml 5.2.1 released

    octachron announced

    We have the pleasure of announcing the release of OCaml 5.2.1, dedicated to= the memory of Niels Bohr and Paul =C3=89luard on the anniversary of their death= s.

    OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backp= orted from the 5.3 branch of OCaml to improve the stability of the 5.2 runtime wh= ile waiting for the upcoming release of OCaml 5.3.0.

    The full list of bug fixes is available below for more details.

    Happy hacking, Florian Angeletti, for the OCaml team.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands:

    opam update
    opam switch create 5.2.1
    

    The source code for the release is also directly available on:

    Bug Fixes In OCaml 5.2.1 (18 November 2024)

    • Runtime System:
      • #13207: Be = sure to reload the register caching the exception handler in caml_c_call and caml_c_call_stack_args, as its va= lue may have been changed if the OCaml stack is expanded during a callback. (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and Xavier Leroy)
      • #13252: Rew= ork register assignment in the interpreter code on m68k on Linux, due to the %a5 register being used by GLIBC. (Miod Vallat, report by St=C3=A9phane Glondu, review by Gabriel Scherer and Xavier Leroy)
      • #13268: Fix= a call to test in configure.ac that was causing errors when LDFLAGS contains several words. (St=C3=A9phane Glondu, review by Miod Vallat)
      • #13234, #13267: Open runti= me events file in read-write mode on ARMel (ARMv5) systems due to atomic operations limitations on that platform. (St=C3=A9phane Glondu, review by Miod Vallat and Vincent Laviron)
      • #13188: fix= races in the FFI code coming from the use of Int_val(...) on rooted values inside blocking questions / without the runtime lock. (Calling Int_val(...) on non-rooted immediates is fine, but any access to rooted values must be done outside blocking sections / with the runtime lock.) (Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole)<= /li>
      • #13318: Fix= regression in GC alarms, and fix them for Flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer)
      • #13140: POW= ER back-end: fix issue with call to caml_call_realloc_stack from a DLL (Xavier Leroy, review by Miod Vallat)
      • #13370: Fix= a low-probability crash when calling Gc.counters. (Demi Marie Obenour, review by Gabriel Scherer)
      • #13402, #13512, #13549, #13553: Revise bytecode implemen= tation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
      • #13502: Fix= misindexing related to Gc.finalise_last that could prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell)
      • #13520: Fix= compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by S=C3=A9bastien Hinderer and Miod Vallat)

    smaws preview release, an AWS SDK for OCaml using eio

    Chris Armstrong announced

    I'm pleased to announce the first preview release for the smaws library (0.1~preview1).

    smaws provi= des AWS bindings for OCaml using the modern eio library for effects-based concurrency handling.

    Whats in this release

    This release includes SDKs for some AWS services and is intended to demonst= rate its API.=20

    It is not production ready, lacking important features such as full API doc= umentation EC2/ECS instance metadata authentication, retry and timeout hand= ling, etc. It also needs support for the other internal AWS API types to ex= tend coverage across most AWS services.

    Motivation

    I wanted to build an AWS SDK using modern effects-based concurrency. I've b= uilt similar bindings for ReScript and ReasonML in the past (some of the co= de is in fact ported across) but this is the first OCaml-native bindings I'= ve created.=20

    Unlike similar projects in the OCaml ecosystem, it uses the newer Smithy de= finitions to generate its bindings instead of the Python botocore definitio= ns. These should be better supported by AWS in the future with richer API d= efinitions.

    What's next

    My next task is to finish off API documentation generation, and then expand= support for all the authentication methods and other API types that will a= llow this to be used with most AWS services.

    ppx_deriving_ezjsonm

    Patrick Ferris announced

    I'm happy to announce the release of ppx_deriving_ezjsonm (bas= ed off of p= px_deriving_yaml). The two libraries share a common definition of a "value" which made the reuse of the existing deriver possible for= a simple JSON deriver.

    opam update
    opam install ppx_deriving_ezjsonm
    

    The documentation is online.

    This library may come in handy when your dependency cone already includes <= code>ezjsonm. If that is not the case, you would probably have bette= r luck in the yojson ecosystem of tools.

    Happy JSON-ing :camel:

    FUN OCaml now has a YouTube Channel

    Sabine Schmaltz announced

    I just created a YouTube channel for FUN OCaml. :sparkles: :camel:

    The talk recordings from the conference in Berlin on September 16 + 17, 202= 4 are now available for viewing!

    https://www.youtube.= com/@FUNOCaml/featured

    If you can, commenting, liking, or subscribing helps us to make these video= s more visible and easier to find on YouTube, so big thanks for everyone wh= o helps us with this! :orange_heart: :camel:

    For people who avoid YouTube: The videos will also be made available on wat= ch.ocaml.org.

    Terrateam's open source Ocaml repository

    Malcolm announced

    A few years ago my friend and I started a company called Terrateam, which does infrastructure orchestration on Gi= tHub. Being that I am an Ocamler and we are a lean company, we chose to us= e Ocaml as our primary language. We recently went open source and I'm post= ing the link here to contribute an example of an actual company using Ocaml= . A real repository.

    The code can be found = here.

    There a few things to note about the repo:

    1. It's a mono repo, so while many of the libraries in there are generic, = they are not really individually consumable as is.
    2. We have our own concurrency framework (more on that below).
    3. We use our own build library (pds, which is in opam).
    4. The code is in flux all the time so things change rapidly.

    Why did we build our own concurrency framework?

    Disclaimer: Yet another concurrency framework? Yep! Do I expect anyone to = use it? Nope, and that's ok. It is designed for our needs. It's meant to = be maintainable by one person. It's not meant to compete with Lwt or Async= for mind share. If it grows, great, if it doesn't, I'm happy still.

    Our concurrency framework is called "Asynchronous Building Blocks" (Abb). = It started over a decade ago when I was frustrated with a few things:

    1. I wanted kqueue support in Async, but (at the time) Async required modi= fying a handful of repos to support it and it just wasn't obvious how.
    2. Lwt supported kqueue, but for no good reason, I just didn't like Lwt. = Part of it was how failure worked in Lwt and other part is just it didn't f= it my aesthetic. That isn't a ding against Lwt, just personal preference.<= /li>
    3. I wanted as much of it to be implemented in Ocaml as possible. As it s= tands now, the only C code is libkqueue which is a little shim= to to allow kqueue code to run on Linux, otherwise everything is in Ocaml.=
    4. I didn't like how neither Async nor Lwt really supported cancelling ope= rations. I wanted that to be part of the framework, not an ad-hoc feature = per library. Coming from Erlang, cancelling is really important to me and = part of how I think about writing concurrent software. I was bummed that (= last I looked) Eio explicitly rejected cancelling.
    5. I also wanted a little experiment of "what if the concurrency library e= xposed a syscall interface like an OS?" So a lot of the interface is meant= to look low-level (I don't think this idea really panned out or made Abb m= eaningfully different).
    6. I also just like having my own frameworks.

    Add a dash of naivete, "how hard can it be to build a concurrency framework= ?", I started my own. First commit was Mar 9, 2013.

    Much of the concurrency monad is based on an unreleased library called Fut by @dbuenzli=20

    Over time, Abb matured to where I could use it in my personal projects. An= d by the time we decided to make Terrateam, I felt it was good enough for p= roduction. And it's been running production traffic for a few years now.

    One, unexpected, benefit of Lwt and Async existing in the community is that= adding a third one isn't that hard. Almost all libraries that want to be = used support both, and that usually means that they have a generic interfac= e. Cohttp and Dns are examples. So I could use existing libraries for thi= ngs I didn't want to or don't feel I could reasonably implement myself.

    I've also used Abb as a foundation my web framework called Brtl (pronounced= Brutal) which is both a backend framework build on Cohttp and a frontend f= ramework built on Brr. It really doesn't do anything fancy, like Dream, it= 's pretty low level and focused on being simple.

    The good:

    1. It works! At least, for me.
    2. Given that I wrote very single line of code, debugging and bug fixing (= which is less and less) is very easy. I also have a really great mental mo= del of how it works.
    3. I like that I can just cancel a whole graph of async work if it's no lo= nger needed.
    4. The future's library works in FreeBSD, Linux, and JavaScript.
    5. The test coverage is pretty darn high. This is because it's a pretty i= ntricate thing to implement so I had to implement a lot of tests to stay sa= ne.

    The bad:

    1. Performance is not anything special. I don't think this is a fundament= al flaw, it's just that it is as fast as I need it to be right now.
    2. Some of the API is a awkward if you don't know the system. Or names ar= e long, like Abb_future_combinators.
    3. The multi-target build story kind of sucks. I think that might be a bi= gger issue with the pds build system but for now in the web framework you h= ave to use Abb_js rather than Abb for everything.=
    4. There are definitely some corners cut in, especially around file IO, bu= t that's OK, we don't do much file IO.
    5. Explicitly takes advantage in that everything runs in a single thread. = So implicitly going multi-threaded would probably break things.

    Future work:

    There really isn't a lot of future work. For the most part: Abb is done. = Or should I say the interface is done. Yes, it will need updates to fight = bit rot, but there isn't much more for it to do. It runs your code concurr= ently, the end.

    However, as Ocaml5 becomes more of a thing, it will need to take advantage = of that. I haven't really thought about how to do it. One item I have in = my to-do list is to evaluate if Picos could be a base layer for Abb. Abb i= s a layered approach so really you only need to implement the Abb_int= f.S interface and everything above that should Just Work (given sing= le threaded semantics). I think any future work to support multi core will= probably need an explicit "this crosses a thread boundary" API. Abb will = get there, eventually, but right now it doesn't need to.

    Effects will obviously have a big impact, I have no idea what that'll do fo= r Abb. I hope I can transition it slowly to supporting effects but I don't= want to look at effects until it's in the type system.

    Some, perhaps, libraries of interest in the repo:

    1. Abb_scheduler_kqueue - The most used scheduler. = It implements the Abb_intf interface.
    2. Abb_scheduler_select - A simpler select-based sch= eduler. This is meant to be used any place kqueue is not supported and als= o as demo.
    3. Pgsql_io - An implementation of the PostgreSQL protocol.
    4. Githubc2 - An automatically generated GitHub REST library gen= erated from their JSON Schema. This actually has no Abb dependency, just i= mplements the API serializing/deserializing.
    5. OpenAPI CLI - This generates a library (see Githubc2) from= an OpenAPI spec. It is, absolutely, a bit of a rats nest, but it works. = We chose to do code-gen for this because I didn't want to be blocked when c= ompiling based on different compiler versions as we're using Ast_help= er. Ocaml, the code, is more stable than Ocaml, the compiler API.

    There is a bunch of other stuff in there. If you decide to poke around and= have any questions, feel free to ask. I can promise: not every decision i= n there is well thought out or coherent.

    OUPS december 2024

    zapashcanon announced

    CAUTION: the time has been changed from 7pm to 6:30pm

    The next OUPS meetup will take place on Thursday, 12th of December 2= 024. It will start at 6:30pm at the 4 place Jussieu in Paris.= It will be in the in the Esclangon building (amphi Astier).

    Please, register on meetup as soon as possible to let us know how ma= ny pizza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    This time we'll have the following talks:

    Snapshottable Stores – Cl=C3=A9ment Allain & Gabriel Scherer = (@gasche)

    We say that an imperative data structure is snapshottable or supp= orts snapshots if we can efficiently capture its current state, and res= tore a previously captured state to become the current state again. This is= useful, for example, to implement backtracking search processes that updat= e the data structure during search.

    Inspired by a data structure proposed in 1978 by Baker, we present a sna= pshottable store, a bag of mutable references that supports snapshots. = Instead of capturing and restoring an array, we can capture an arbitrary se= t of references (of any type) and restore all of them at once. This snapsho= ttable store can be used as a building block to support snapshots for arbit= rary data structures, by simply replacing all mutable references in the dat= a structure by our store references. We present use-cases of a snapshottabl= e store when implementing type-checkers and automated theorem provers.

    Our implementation is designed to provide a very low overhead over normal r= eferences, in the common case where the capture/restore operations are infr= equent. Read and write in store references are essentially as fast as in pl= ain references in most situations, thanks to a key optimisation we call = record elision. In comparison, the common approach of replacing referen= ces by integer indices into a persistent map incurs a logarithmic overhead = on reads and writes, and sophisticated algorithms typically impose much lar= ger constant factors.

    The implementation, which is inspired by Baker's and the OCaml implementati= on of persistent arrays by Conchon and Filli=C3=A2tre, is both fairly short= and very hard to understand: it relies on shared mutable state in subtle w= ays. We provide a mechanized proof of correctness of its core using the Iri= s framework for the Coq proof assistant. [/details]

    Safe, expressive and efficient programming of FPGAs circuits – Lo= =C3=AFc Sylvestre

    FPGAs (Field-Programmable Gate Arrays) are reconfigurable digital circuits:= their behavior can be customized by logic synthesis of specification at th= e so-called register transfer level (RT level), in hardware description lan= guages such as VHDL or Verilog. FPGAs are well suited to implement reactive= systems, directly as synchronous circuits interacting with the external en= vironment via I/O pins =E2=80=93 the logic synthesizer ensuring that timing= constraints are met, given the FPGA clock frequency. FPGAs are also used t= o implement hardware accelerators ; however, RT-level descriptions of trans= formational systems (or =E2=80=9Ccomputations=E2=80=9D) =E2=80=93 with late= ncies of several clock cycles =E2=80=93 are difficult to debug, maintain an= d manually optimize. High-Level Synthesis (HLS) offers a simpler way of exp= ressing computations, using a programming language compiled at the RT level= . The advantage of this approach is to keep the implementation details hidd= en from the programmer, leaving the compiler responsible for scheduling com= putations over time. However, this leads to a loss of control over temporal= behavior and therefore safety and efficiency for the circuits generated. A= s embedded systems, especially those based on FPGAs, need to perform more a= nd more computations, while interacting with their environment, this thesis= proposes a programming model to combine hardware description (data-flow or= iented) and general-purpose parallel computation (control-flow oriented) us= ing a synchronous approach. This programming model forms the basis for the = design and implementation of Eclat, a functional-imperative, parallel and s= ynchronous programming language, compiled to VHDL. Eclat is sufficiently pr= ecise to describe synchronous circuits at the RT level. It facilitates the = programming of hardware accelerators, with a clear and predictable temporal= semantics by which to exploit time-space trade-offs. Any Eclat program is = reactive, with a mechanism for embedding computations within programs and t= hereby mix computation and interaction. Eclat also offers shared memory (in= the form of RAM blocks), with deterministic concurrency. It is used to dev= elop programming abstractions such as algorithmic skeletons and virtual mac= hine implementations for high-level languages. This addresses, at various l= evels, the need to run general-purpose algorithms within FPGA-based reactiv= e embedded applications.

    After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

    Dune dev meeting

    Etienne Marais announced

    Hi camelers! :camel:=20 We will hold our regular Dune dev meeting on Wednesday, November, 27th at 1= 6:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronise between the Dune developers :ok_hand:=20

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=q+5uonQs; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=WxXL0huB; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 9EF804AA88 for ; Tue, 3 Dec 2024 14:44:18 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=CGarx75hbgssUuPT9UADYPMS/859Q3sM8GX26LE2ES8=; b=q+5uonQsrhxdVoXLgMmCUwuDaGb2kwsm/NOfk+Fy07XfxcLAZuJFgOtc JQui1OoBhl3tSCo8ramR+++NB6Biayqf0fmZbkWZcWubdsP4HJJqcVCjM RUZDUw18Vj1ICFnJuaCyfCuheNq778mL34x48TT/GdyJnChowIj3TEme2 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,205,1728943200"; d="scan'208,217";a="197118357" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Dec 2024 15:44:16 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5CBF1E0D24; Tue, 3 Dec 2024 15:44:16 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id E8000E00B6 for ; Tue, 3 Dec 2024 15:44:12 +0100 (CET) IronPort-SDR: 674f193a_90nbYWhroz+aYNZgo7jGjdjrRoJHMAKYTLe2iqDw0GUtStz vPFGXngK2vzmNi3NXKvhjVk/z0d2v+BXH7JlPgQ== X-IPAS-Result: =?us-ascii?q?A0E6DgAFGE9ngSIeaIFQChaCSIE/WygZAV0GWjMHCEhhg?= =?us-ascii?q?3WDT4s/gmCBFpA3ineCewMYFiMUAQMBDS4BBQ0BAgQBAQMBAgGCDIIuRgKKa?= =?us-ascii?q?AIfBgEENBMBAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBPQVJh?= =?us-ascii?q?XsNSQEBAQECAQEJAYFqUXFhBAMGNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQIIBAEwElwBAgYEBhMBASkCDRgjAxAEAQYDA?= =?us-ascii?q?hEBNRcBCQkUBQEBgg5Zgh9FAwQBDAaUaptLen8zgQGCDAEBBoEIPgIBCwICA?= =?us-ascii?q?wEOCSUB1zeCT4EaSgmBMBiFaoJIGgEFJUhqAoRGCYMUJHkCJw+BVUSBFYIoL?= =?us-ascii?q?xsHb4FQLgY7CxcBAQEBAReBGQQHAQEIRQmDJYJpgicKEi1MOwIHgl92IwJNR?= =?us-ascii?q?oNzLgOBXl6BDYFvgg+DNBJWgVx5gSApgRgdHTALO4EPWYExBIoAgUciAyYzM?= =?us-ascii?q?gFVExcLBwVhgRYDgXqBTYE2gVFDgk5KhQyBAzmCEWlNOgINAjaCJCRZgk2DW?= =?us-ascii?q?IE/hGmEW4YsYR1AAwttPTcUG6B/AQkzaQFGglILJA4KAS0GAQEVBUYaCQoIA?= =?us-ascii?q?xEIBgEBIAINHgEBCQULEwoHBQcCAQICJggEBAIDBQkCAgwFBgEBDhQLCwsCL?= =?us-ascii?q?QONCIU1FBAUBAUeB3eOTINUij2Tb200B4QdgV0GDIkEgSSOLYdNhASBV4suh?= =?us-ascii?q?wCLBodCIphZIoI1hyVdSAmBbh5MiQmMSggZGIUdgX4jgSseDAczGjBDgjMBA?= =?us-ascii?q?QExCUYcD1eNUwIBFoMwKIE+gSEFgTw5O70JLwJCNQIBAQcxAgcBCgEBAwmFR?= =?us-ascii?q?R0BAYVzgRGCRQKCBQImBwVqYQEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:PmOHLawXpm84g5ouCeQcKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: =?us-ascii?q?9a23=3ATDENlWuKaz4VRWahprIuMH8h6IsvW2Ts4SmPenO?= =?us-ascii?q?8ADZKWoeWRxzI3aJrxp8=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3AcWlRzA4mMFSHEqFmL0V8xA5BxoxlzL21L18sya8?= =?us-ascii?q?PpsKfNjR3fDKijS+eF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.12,205,1728943200"; d="scan'208,217";a="197118329" X-MGA-submission: =?us-ascii?q?MDE6LGwFfSLc8WGNudKMSup+rCrywyAK6+FwJN?= =?us-ascii?q?WYmyge1MMf5ZlCNpf7a/sOWjMWGgadnSUyInyCvc/Bb8NyKVDwu0eHLe?= =?us-ascii?q?/f1tavUZ2CCaCHMlnNGgfcAKq4Mm6P5EaUU9Uy7mdQtoxy7hsMf3B8Bg?= =?us-ascii?q?XqDs4fVIlwvsUocWiIOcohMw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Dec 2024 15:44:10 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 58E9F564837; Tue, 3 Dec 2024 15:44:09 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1733237049; bh=GzI9cEsVUSeCWERtQjPXW8bhhospl6MoC+Y4WeegoL4=; h=From:To:Subject:Date:Message-ID; b=WxXL0huBqdKjIkbIKnKfZzAzvp4m7Xh1ZWpW7QFuiIMWNmW4W9MW6cR3RYKdW+WOB GADwsRyQUKyR2DBsv6WcBxn6pKHw+/FzOQ606xMnHCPg70pkDGITR3UAO8JZbRNE/9 0fR52Ul5VL7qYKgXZkOADW3JX5m1mCVraENbQZZg= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Dec 2024 15:44:08 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 3 15:44:10 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499841, queueID=D47CF564839 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19226 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 26 to December 03, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Good example of handwritten Lexer + Recursive Descent Parser? Boulder Dash in OCaml Js_of_ocaml 5.9.0 Liquidsoap 2.3.0 Bytesrw 0.1.0 =E2=80=93 Composable byte stream readers and writers dream-html and pure-html 3.5.2 Second beta release of OCaml 5.3.0 New release of Monolith Jsont 0.1.0 =E2=80=93 Declarative JSON data manipulation for OCaml Tiny educational concurrent I/O and promises library Eliom 11.1: Towards Web Assembly support Areas and Adversaries MariaDB 1.2.0 Proposed Package Archiving Policy for the opam Repository capnp-rpc 2.0 Other OCaml News Old CWN Good example of handwritten Lexer + Recursive Descent Parser? =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Axel Baudot asked =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I am looking for an idiomatic implementation of a Lexer + Recursive Descent Parser not making use of ocamllex, ocamlyacc or menhir. The kind you would write during the first chapters of Crafting Interpreters [0][1] in OCaml. This Markdown parser [2] by @dbuenzli is a great example of what I am looking for. I'd be happy if you can recommend similar resources. There are many OCaml repos for Lox interpreters but it's hard to assess quality. And the readme often says "I am doing this to learn OCaml", which doesn't inspire confidence. As a broader note, it would be nice to have (community vetted) OCaml translations of well-known learning material using mainstream languages. But I'll raise the topic in another thread later. Thanks in advance. =E2=80=A2 [0] =E2=80=A2 [1] =E2=80=A2 [2] Mikhail replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You might be interested in the book [Compiling to Assembly from Scratch]. There is a [port to OCaml]. It suggests the use of [parser combinators]. Parser combinators is the same manual recursive descent method, but in a functional way. You can either use [an existing library] or you [can write your own]. [Compiling to Assembly from Scratch] [port to OCaml] [parser combinators] [an existing library] [can write your own] Anton Bachin also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 odoc's parser is half of what you're asking for. It uses ocamllex for the lexical scan, because it's very simple and convenient to do it that way, but the syntax is then analyzed by a hand-written [recursive descent parser], in large part because /that's/ easier for the doc language. An example of a non-ocamllex and non-ocamlyacc parser is Markup.ml ([tokenizer], [parser]). But this isn't a traditional recursive descent parser. Rather, it's a pretty huge hand-written state machine in continuation-passing style, almost completely implementing the corresponding huge state machine specified in HTML5. But it's the kind of code that fits well the topics of an impure FP class, especially since it has mutable cells for its continuations, that it uses to mimic effects. [recursive descent parser] [tokenizer] [parser] Boulder Dash in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Andreas Rossberg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Couldn=E2=80=99t let it rest, so I=E2=80=99m (already) announcing version= 2 of it =E2=80=94 now a much improved, practically feature-complete reimplementation of both Boulder Dash 1 & 2. Version 2 was an excuse for me to mess around with the OCaml bindings to popular graphics engines, and as a result, it now comes with 3 backends to choose from: 1. the homely bare OCaml Graphics library (), 2. the TSDL binding to the SDL2 API (), 3. the binding to the Raylib engine (). The list is in order of increasingly better user experience, for the price of a potentially harder build experience. In theory, all versions should run on Windows, Mac, and Linux, though I was too lazy to test all combinations, and I (or my opam) had trouble installing some of the dependencies on some of the systems. Features: =E2=80=A2 Faithful original physics, graphics, animations, sound, and mus= ic =E2=80=A2 Authentic scrolling mechanics combined with dynamic resizing =E2=80=A2 All 40 levels and 5 difficulties of Boulder Dash 1 & 2 =E2=80=A2 Pause-and-go mode for relaxed playing Relative to the previous release, version 2 adds the following niceties: =E2=80=A2 Support for SDL and Raylib engines, which allow all of the foll= owing =E2=80=A2 Original sound effects and music =E2=80=A2 Original level color schemes =E2=80=A2 Full screen mode =E2=80=A2 Faster graphics =E2=80=A2 Dynamic graphics scaling adjustment =E2=80=A2 Gamepad/joystick support as well as more precise keyboard contr= ols =E2=80=A2 Boulder Dash 2 levels and decoder Almost looks like a real game now. One from the 80s anyways. :) Js_of_ocaml 5.9.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Hhugo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m pleased to announce the release of js_of_ocaml 5.9.0. It shou= ld soon be available in opam. Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers and Node.js. Most significant changes: =E2=80=A2 Support for OCaml 5.3 =E2=80=A2 Speedup sourcemap generation and improve sourcemap accuracy. =E2=80=A2 Prepare the merge of the wasm_of_ocaml fork back into the js_of_ocaml repo. =E2=80=A2 JS backtraces are really expansive. They now need to be explici= tly requested with `OCAMLRUNPARM=3Db=3D1'. This speeds up programs linked with libraries enabling backtraces programmatically using `Printexc.record_backtrace true'. See the [Changelog ] for other changes. [Changelog ] Liquidsoap 2.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Romain Beauxis announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are stoked to announce the `2.3.0' release of liquidsoap, a general-purpose scripting language written in OCaml with specialized operators to build media streams. The release is available on github: During this release cycle, we have rewritten huge chunk of the application's internal, including a new media streaming abstraction and clock system. As an OCaml application, liquidsoap's scope and complexity has greatly expanded in the next years. Some of the most challenging areas for us at this point are memory usage (and, incidentally, CPU usage). Although OCaml's garbage collection is a very powerful tool, in the context of very short lived streaming cycles (typically `0.02s') with potentially quite large memory allocations (typically video images), controlling the timing of memory allocations and release is becoming more and more critical. We are also aware of the work done by Jane St on adding a `local' call stack. This could be an avenue to explore as well but: 1. Some of our content has to be stored in the long-term heap 2. We want to work with an official OCaml compiler for obvious long-term maintenance concerns. Nonetheless, we are thrilled to be part of a community whose array of tools (building, packaging, debugging, etc) and libraries has expanded so well along with a vibrant compiler development team. In the future, we wish to explore more of the new OCaml concurrency features. This might require that we revisit the way we handle short-term memory first. Bytesrw 0.1.0 =E2=80=93 Composable byte stream readers and writers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's my pleasure to announce the first release of the `bytesrw' library: Bytesrw extends the OCaml `Bytes' module with composable, memory efficient, byte stream readers and writers compatible with effect-based concurrency. Except for byte slice life-times, these abstractions intentionally separate away ressource management and the specifics of reading and writing bytes. Bytesrw distributed under the ISC license. It has no dependencies. Optional support for compressed and hashed bytes depend, at your wish, on the C [`zlib'], [`libzstd'], [`blake3'], [`libmd'], [`xxhash'] and libraries. The only reason I was longing for OCaml algebraic effects was so that I could avoid using them: when you write codecs on byte streams it should not be a concern where your bytes are coming from or headed to. The `bytesrw' library provides structures to abstract this. Additionally it establishes a buffer ownership discipline that enables byte streams to (de)compose while remaining memory efficient. I do not expect the library to change much and it has been used. But it's new and practice may call for adjustments. Do not hesitate to get in touch if you run into problems or see obvious defects or improvements. I do expect the library will add more convenience (e.g. for processing lines and UTF) and more optional stream formats over time. =E2=80=A2 Homepage: =E2=80=A2 Docs: or `odig doc bytesrw' =E2=80=A2 Install: `opam install bytesrw conf-zlib conf-zstd conf-libblak= e3 conf-libmd conf-xxhash' ([opam PR]) This first release was made possible thanks to a grant from the [OCaml Software Foundation]. I also thank my [donors] for their support. [`zlib'] [`libzstd'] [`blake3'] [`libmd'] [`xxhash'] [opam PR] [OCaml Software Foundation] [donors] dream-html and pure-html 3.5.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 [ANN] dream-html 3.7.0 Happy to announce the addition of a helper module for typed form decoding functionality. See the docs here: An example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type user =3D { name : string; age : int option } =E2=94=82=20 =E2=94=82 open Dream_html.Form =E2=94=82=20 =E2=94=82 let user_form =3D =E2=94=82 let+ name =3D required string "name" =E2=94=82 and+ age =3D optional int "age" in =E2=94=82 { name; age } =E2=94=82=20 =E2=94=82 let dream_form =3D ["age", "42"; "name", "Bob"] =E2=94=82 let user_result =3D validate user_form dream_form =E2=94=82 (* =3D> Ok { name =3D "Bob"; age =3D Some 42 } *) =E2=94=82=20 =E2=94=82 let error_result =3D validate user_form ["age", "none"] =E2=94=82 (* =3D> Error [("age", "error.expected.int"); ("name", "error.r= equired")] *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Astute readers may observe that this provides some convenience functionality beyond what Dream itself offers; to validate the above form and get a _complete_ set of field validation errors using only Dream you would do something like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let user_result =3D match dream_form with =E2=94=82 | ["age", age; "name", name] -> =E2=94=82 (match int_of_string age with =E2=94=82 | age -> Ok { name; age =3D Some age } =E2=94=82 | exception Failure _ -> Error ["age", "error.expected.int"= ]) =E2=94=82 | ["name", name] -> Ok { name; age =3D None } =E2=94=82 | ["age", age] -> =E2=94=82 (match int_of_string age with =E2=94=82 | age -> Error ["name", "error.required"] =E2=94=82 | exception Failure _ -> Error ["age", "error.expected.int"= ; "name", "error.required"]) =E2=94=82 | _ -> Error ["name", "error.required"] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And this is a form with only two fields. You can imagine how convoluted the logic would be for more complex forms. Of course, you might just decide to use `List.assoc_opt' and build up the validation errors, but even that can get tricky. So if you are making heavy use of HTML forms, a helper module that takes care of all these validation details can be very useful. Enjoy! Second beta release of OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 One month after the release of the first beta for OCaml 5.3.0, we are releasing a second and hopefully last beta release for OCaml 5.3.0 . The most notable changes for this second beta are probably a handful of type system bugfixes. In particular, those fixes revert a change of behaviour in the first beta when pattern matching GADTs with non-injective type parameters. We also have a C++ header compatibility fix and the restoration of some configuration variable in Makefiles for the sake of backward compatibility. Overall, the release is converging and we are expecting to have a first release candidate around the middle of December. The progresses on stabilising the ecosystem are tracked on the [opam readiness for 5.3.0 meta-issue]. Meanwhile, the second beta release of OCaml 5.3.0 is here to help you update your software and libraries ahead of the release (see below for the installation instructions). The full release is expected before the end of December. If you find any bugs, please report them on [OCaml's issue tracker]. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.3.0 is available [on GitHub]. Happy hacking, Florian Angeletti for the OCaml team. [opam readiness for 5.3.0 meta-issue] [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.3.0~beta2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.3.0~beta2+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.3.0~beta2+flambda+nffa ocaml-variants.5.3.= 0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes Since The First Beta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Type system fixes =E2=80=A2 [#13501]: Regression on mutually recursive types caused by [#12= 180]. Resuscitate Typedecl.update_type. (Jacques Garrigue and Takafumi Saikawa, review by Florian Angeletti, Richard Eisenberg and Gabriel Scherer) =E2=80=A2 [#13495], [#13514]: Fix typechecker crash while typing objects (Jacques Garrigue, report by Nicol=C3=A1s Ojeda B=C3=A4r, review by Nic= olas Ojeda B=C3=A4r, Gabriel Scherer, Stephen Dolan, Florian Angeletti) =E2=80=A2 [#13598]: Falsely triggered warning 56 [unreachable-case] This = was caused by unproper protection of the retyping function. (Jacques Garrigue, report by T=C3=B5ivo Leedj=C3=A4rv, review by Florian Angelet= ti) [#13501] [#12180] [#13495] [#13514] [#13598] =E2=97=8A Configuration fixes =E2=80=A2 (*breaking change*) [#12578], [#12589], [#13322], +[#13519]: Use configured CFLAGS and CPPFLAGS /only/ during the build of the compiler itself. Do not use them when compiling third-party C sources through the compiler. Flags for compiling third-party C sources can still be specified at configure time in the COMPILER_{BYTECODE,NATIVE}_{CFLAGS,CPPFLAGS} configuration variables. (S=C3=A9bastien Hinderer, report by William Hu, review by David Allsopp) [#12578] [#12589] [#13322] [#13519] =E2=97=8A C++ header compatibility =E2=80=A2 [#13541], [#13591]: Fix headers for C++ inclusion. (Antonin D= =C3=A9cimo, review by Nick Barnes, report by Kate Deplaix) [#13541] [#13591] =E2=97=8A Compiler library bug fix =E2=80=A2 [#13603], [#13604]: fix source printing in the presence of the escaped raw identifier `\#mod'. (Florian Angeletti, report by Chris Casinghino, review by Gabriel Scherer) [#13603] [#13604] New release of Monolith =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce a new release of [Monolith], a library that helps perform strong automated testing of OCaml libraries. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam install monolith.20241126 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The changes are as follows: =E2=80=A2 The documentation of the specification combinators has been re-organized in sections and subsections. Finding the desired combinator should now be easier. =E2=80=A2 The new combinator `naive_array' offers limited support for arr= ays. =E2=80=A2 The new combinator `naive_seq' offers limited support for seque= nces (that is, for the type constructor `Seq.t'). =E2=80=A2 The new combinator `pair' is a synonym for `( *** )'. =E2=80=A2 The new combinator `triple' offers support for triples. =E2=80=A2 The new combinator `either' offers support for the type constru= ctor `Either.t'. =E2=80=A2 The new combinators `iter', `foldr', `foldl', `iteri', `foldri', `foldli' offer support for iteration functions. =E2=80=A2 An unintentional and undocumented limitation has been fixed: so= far, uses of the combinator `map_into' would work only at the root of the specification or in the right-hand side of an arrow `^>'. It should now be possible to use `map_into' under other combinators that expect a deconstructible specification, such as `^!>' (in the right-hand side), `( *** )', `option', `result', `list', etc. This improvement affects not only `map_into', but also a number of other combinators that are defined in terms of `map_into'. =E2=80=A2 Monolith now requires OCaml 4.12 or later. =E2=80=A2 In `Makefile.monolith', =E2=81=83 the default switch is changed from 4.11.1 to 4.14.2; this can= be overridden by defining `SWITCH'; =E2=81=83 `make test' automatically disables the MacOS crash reporter; =E2=81=83 the use of `ulimit -s' is abandoned. [Monolith] Jsont 0.1.0 =E2=80=93 Declarative JSON data manipulation for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's my pleasure to announce the first release of the jsont libary: Jsont is an OCaml library for declarative JSON data manipulation. It provides: =E2=80=A2 Combinators for describing JSON data using the OCaml values of your choice. The descriptions can be used by generic functions to decode, encode, query and update JSON data without having to construct a generic JSON representation. =E2=80=A2 A JSON codec with optional text location tracking and layout preservation. The codec is compatible with effect-based concurrency. The descriptions are independent from the codec and can be used by third-party processors or codecs. Jsont is distributed under the ISC license. It has no dependencies. The codec is optional and depends on the [`bytesrw'] library. The JavaScript support is optional and depends on the [`brr'] library. The library has been used in practice but it's new so a few adjustments may be needed and more convenience combinators added. The library also enables quite a few things that I did not have the time to explore like schema description generation from descriptions, quasi-streaming JSON transformations, description generation from dynamic type representations, etc. Lots of this can be done outside the core library, do not hesitate to get in touch if you use the library and find interesting applications or pesking limitations. =E2=80=A2 Homepage: =E2=80=A2 Docs: (or `odig doc jsont') =E2=80=A2 Install: `opam install jsont bytesrw' This first release was made possible thanks to a grant from the [OCaml Software Foundation]. I also thank my [donors] for their support. Best, Daniel P.S. I think that the technique used by the library, which I dubbed /finally tagged/ is interesting in itself. You can read a paper about it [here] along with a smaller, self-contained, implementation of what the library does. [`bytesrw'] [`brr'] [OCaml Software Foundation] [donors] [here] Tiny educational concurrent I/O and promises library =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 I like [Lwt]. It's a fantastic library, but how does it work? I spent a few days studying its source code. Finally, inspired by the implementation of [Lwt] and [the CS3110 chapter, 8.7. Promises]. I wrote a maximally stupid [*tiny-async-lib*] library. Maybe you may be interested in this naive implementation. [Lwt] [the CS3110 chapter, 8.7. Promises] [*tiny-async-lib*] Examples of use =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D=20 =E2=94=82 Engine.run main begin =E2=94=82 let* () =3D Io.(write_all stdout) "Hi! What's your name? " = in =E2=94=82 let* name =3D Io.(read_line stdin) in =E2=94=82 Io.(write_all stdout) ("Hello, " ^ name ^ "!\n") =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let read_and_print_file filename =3D=20 =E2=94=82 Io.(read_file filename >>=3D write_all stdout) =E2=94=82=20 =E2=94=82 let _ =3D =E2=94=82 Engine.run begin =E2=94=82 let filenames =3D [ (* ... *) ] in=20=20 =E2=94=82=20 =E2=94=82 filenames =E2=94=82 |> List.map read_and_print_file =E2=94=82 |> Promise.join =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Implementation details =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The first key abstraction of the whole library is, of course, Promise. [Promise] is an abstraction for synchronizing program execution in concurrent evaluations. In simple terms, it's an abstraction over callbacks. Promises allows us to build (monadic) sequence evaluations inside of non-sequence evaluations. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* promise.ml *) =E2=94=82=20 =E2=94=82 type 'a t =3D { mutable state: 'a state }=20=20 =E2=94=82=20 =E2=94=82 and 'a state =3D=20 =E2=94=82 | Fulfilled of 'a=20 =E2=94=82 | Rejected of exn =E2=94=82 | Pending of 'a callback list=20 =E2=94=82=20 =E2=94=82 and 'a callback =3D 'a state -> unit=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Promises are represented as a mutable record with three possible states: fulfilled (contains a value), rejected (contains an exception), and pending (contains callbacks). Callbacks are functions that are called when a promise is resolved. So when we `bind', if the promise is in pending state, we add a callback that calls the following monadic sequence when the promise is resolved. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* io.ml *) =E2=94=82=20 =E2=94=82 let sleep delay =3D =E2=94=82 let p, r =3D Promise.make () in =E2=94=82=20 =E2=94=82 Engine.(on_timer instance) delay (fun handler -> =E2=94=82 Engine.stop_handler handler; =E2=94=82 Promise.fulfill r ()); =E2=94=82=20 =E2=94=82 p =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The second key abstraction is an [asynchronous I/O] engine that polls I/O events and dispatches them to handlers. Original Lwt has few engines (like based libev, select, poll), but I hardcoded a [select]()-based engine inspired by `Lwt_engine.select_based'. The typical async engine in internals has an event loop. At each iteration of the event loop, the engine polls for new events and calls handlers to handle them. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* engine.ml *) =E2=94=82=20 =E2=94=82 let iter engine =3D =E2=94=82 (* ... *) =E2=94=82=20 =E2=94=82 let readable_fds, writable_fds, _ =3D =E2=94=82 Unix.select readable_fds writable_fds [] timeout =E2=94=82 in =E2=94=82=20 =E2=94=82 engine.sleepers <- restart_sleepers now engine.sleepers; =E2=94=82=20 =E2=94=82 invoke_io_handlers engine.wait_readable readable_fds; =E2=94=82 invoke_io_handlers engine.wait_writable writable_fds =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 How to execute I/O promise? It's not a big deal. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* engine.ml *) =E2=94=82=20 =E2=94=82 let rec run promise =3D =E2=94=82 match Promise.state promise with =E2=94=82 | Fulfilled value -> value =E2=94=82 | Rejected exc -> raise exc =E2=94=82 | Pending _ -> =E2=94=82 iter instance; =E2=94=82 run promise =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We just need to loop the event loop until the promis is resolved. It's just a toy! I'm not an expert in such things, so the library is very naive and tries to mimic Lwt. But I think it's a good demonstration. Repository Thank you for your attention! [Promise] [asynchronous I/O] Eliom 11.1: Towards Web Assembly support =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Vincent Balat announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Eliom 11.1 has been released recently. This minor release brings compatibility with Web Assembly and the upcoming version of js_of_ocaml. Ocsigen Toolkit and Ocsigen Start have been updated as well. Stay tuned for further announcements concerning client-server Web and mobile apps in Ocaml with Web Assembly! Links: =E2=80=A2 [Ocsigen] =E2=80=A2 [Eliom] =E2=80=A2 [Documentation] =E2=80=A2 [Github] [Ocsigen] [Eliom] [Documentation] [Github] Areas and Adversaries =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I figured people might be bored of [British pub names] by now so I did another thing: [a generator for titles of table-top role-playing games]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install areas-and-adversaries =E2=94=82 ... =E2=94=82 $ areas-and-adversaries =E2=94=82 Woods & Wizards =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The code is on Gitlab: It was a good excuse to experiment with non-dune build systems (to scope things out). I went for a plain Makefile in the end which works well. I also wanted to figure out a better way to embed data in an executable. I ended up wondering about moving as much of the processing as possible into the build phase. What I ended up with is a small program which prints a compilation unit (`.ml') which has mostly array literals. Still have some open questions on that, any input welcome: =E2=80=A2 Should I have used meta-ocaml to print the code? The `data/munc= h.ml' would probably be more readable, but the build probably less. =E2=80=A2 How could I generate this kind of processed-data code for data-structures which don't have a literal (maps, sets, hash tables, etc.)? How can I minimise the initialisation cost of the program for such situations? [British pub names] [a generator for titles of table-top role-playing games] MariaDB 1.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Petter A. Urkedal announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 I'm please to announce a new release of the [mariadb] package, which provides client bindings for MariaDB and MySQL. See the full release notes below. This is also to announce that I have taken over maintenance of the project. Currently I am the sole maintainer (and I usually use PostgreSQL for my own deployments), so if someone has the time en interest to contribute, let me know. The main focus from my side is to keep the project up to date and stable, rather than making major changes. Release notes: =E2=80=A2 Added `Stmt.start_txn' (#59 by Corentin Leruth). =E2=80=A2 Added `Res.insert_id' as binding for `mysql_stmt_insert_id' (#5= 8 by Corentin Leruth). =E2=80=A2 Updated to support recent OCaml versions (#45 by @kit-ty-kate). =E2=80=A2 Fixed too-early retrieval of statement metadata (#41 by Albert Peschar). =E2=80=A2 Fixed decoding bug for the integer type (#54 by Raman Varabets, tested by #61 by Corentin Leruth). =E2=80=A2 Fixed a memory leaks related to result metadata (#39 by Albert Peschar). =E2=80=A2 The build system is now dune and dune-configurator (#52 by Pett= er A. Urkedal) and some of the examples have been converted to a test suite (#60 by Petter A. Urkedal). =E2=80=A2 The project has been transferred to ocaml-community with Petter= A. Urkedal as the new maintainer. [mariadb] Proposed Package Archiving Policy for the opam Repository =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my please to announce the proposed package archiving policy in the name of the opam-repository maintainers. Context =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The opam repository differs from nearly all other programming-language-centric package repositories in that it is manually curated by volunteer maintainers and protected by a robust continuous integration system that (generally) ensures published packages work as expected across a [large matrix of supported platforms]. Over the past few years the repository has kept growing steadily, when not accelerating, and this has started raising questions about the size, weight and sustainability of the repository and its processes. Last year, [Hannes Mehnert] requested comments on a [proposed initiative] to improve the sustainability and quality of the opam package repository on the long term. [large matrix of supported platforms] [Hannes Mehnert] [proposed initiative] Problem =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The problem, in a nutshell, is that the `opam-repository' will keep steadily growing, using an increasing and substantial amount of space and inodes. Every opam user needs to invest a large amount of computational resources for the solver, every time they want to install or update a package. Additionally, a large amount of computational resources are spent in the continuous integration process and yet a lot of the packages have become stale or uninstallable. Solution =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C [After much deliberation], the discussion converged on a solution: introduce a package archiving policy and supporting processes, to periodically identify and prune unmaintained and broken packages from the repository. This will improve the performance of the opam solvers, of the opam-repo CI, and most importantly improve the quality of the package repository, while keeping a sort of immutability of the repository content and preserving the usability of historical packages for the users that want or need them. The opam repository maintainers propose a [policy]. The currently empty [repository archive] has been created, waiting for packages to be moved. [After much deliberation] [policy] [repository archive] Call to action =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you maintain packages in the opam-repository, you can help by defining your maintanence intent: add a new field `x-maintenance-intent' to your opam file(s) (the most recent release of your package is sufficient - please also put this field in your git repository so it will be part of future releases). The value is defined in [the policy]. [the policy] Roadmap =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C All announcements will be on discuss.ocaml.org with the opam-repository tag. If you like to follow these announcements, keep your eyes at [the opam-repository tag]. =E2=80=A2 December 1st 2024: announcement of this proposal =E2=80=A2 December 15th 2024: announcement of the packages affected by Ph= ase 1 (uninstallable packages ("available: false", "flags: avoid-version" or "deprecated", "opam admin check =E2=80=93installable", does not comp= ile =E2=80=93 opam health check ) =E2=80=A2 January 1st 2025: Phase 1 cutting point: packages are moved to opam-repository-archive =E2=80=A2 January 15th 2025: announcement of the packages affected by Pha= se 2 (OCaml lower bound 4.08) =E2=80=A2 February 1st 2025: Phase 2 cutting point: packages are moved to opam-repository-archive =E2=80=A2 February 15th 2025: initial spring cleaning, announcement of packages (based on maintenance-intent) =E2=80=A2 March 1st 2025: spring cleaning cutting point: packages are mov= ed to opam-repository-archive =E2=80=A2 Every quarter: repeat Phase 3 =E2=80=A2 Every year: reconsider Phase 2 with an increased OCaml lower bo= und We now invite members of the OCaml community who may not follow the ocaml-repository issues to review our plans and submit comments, questions, or suggestions. Thank you in advance for your support! [the opam-repository tag] References =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 [Opam repository archive] =E2=80=A2 [Proposed policy] =E2=80=A2 [Plan of action] =E2=80=A2 [Issue and discussion] =E2=80=A2 [Previous announcement] [Opam repository archive] [Proposed policy] [Plan of action] [Issue and discussion] [Previous announcement] Acknowledgment =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Thanks to the following individuals for valuable input and contributions to the planning process (sorry in case we forgot you): =E2=80=A2 Marcello Seri =E2=80=A2 Shon Feder =E2=80=A2 Thomas Gazagnaire =E2=80=A2 kit-ty-kate =E2=80=A2 Weng Shiwei =E7=BF=81=E5=A3=AB=E4=BC=9F =E2=80=A2 Marcus Rohrmoser =E2=80=A2 Reynir Bj=C3=B6rnsson =E2=80=A2 Stephen Sherratt =E2=80=A2 Simon Cruanes =E2=80=A2 Marek Kubica =E2=80=A2 Rapha=C3=ABl Proust =E2=80=A2 Romain Beauxis =E2=80=A2 Yawar Amin =E2=80=A2 Anil Madhavapeddy =E2=80=A2 Boning D. =E2=80=A2 Mathieu Barbin =E2=80=A2 Hannes Mehnert capnp-rpc 2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of [capnp-rpc 2.0], an OCaml implementation of the Cap'n Proto RPC specification. If you haven't used the library before, please see the [documentation and tutorial]. Cap'n Proto RPC aims to provide secure, efficient, typed communications between multiple parties. The main change in this version is the switch from Lwt to Eio for concurrency. The echo benchmark is about 40% faster than before. This isn't because Eio is actually that much faster than Lwt, but more because it has better profiling support so spotting problems was easier. See for an example: There is a `capnp-rpc-lwt' compatibility package that provides the old Lwt API using the new Eio version, allowing libraries using the old API to be used in applications using the new code, without having to update everything at once. To migrate to the new version (checking everything still works after each step): 1. First, update to capnp-rpc 1.2.4 (this ensures you are using the newer mirage-crypto API, to get that migration out of the way first). 2. Switch your application (that sets up the networking) to capnp-rpc-unix 2.0. 3. Migrate client and server code away from capnp-rpc-lwt when convenient. For more detailed instructions, see [the changelog]. Here's an example of the changes needed in the solver-service project: =E2=80=A2 [Update to capnp-rpc-unix 2.0] =E2=80=A2 [Remove Capnp_rpc_lwt] [capnp-rpc 2.0] [documentation and tutorial] [the changelog] [Update to capnp-rpc-unix 2.0] [Remove Capnp_rpc_lwt] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Irmin on MirageOS: Introducing the Notafs File System] [the ocaml.org blog] [Irmin on MirageOS: Introducing the Notafs File System] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 26 to Decemb= er 03, 2024.

    Good example of handwritten Lexer + Recursive Descent Parser?<= /h2>

    Axel Baudot asked

    I am looking for an idiomatic implementation of a Lexer + Recursive Descent= Parser not making use of ocamllex, ocamlyacc or menhir. The kind you would= write during the first chapters of Crafting Interpreters [0][1] in OCaml.

    This Markdown parser [2] by @dbuenzli is a great example of what I am looki= ng for. I'd be happy if you can recommend similar resources.

    There are many OCaml repos for Lox interpreters but it's hard to assess qua= lity. And the readme often says "I am doing this to learn OCaml", which doe= sn't inspire confidence.

    As a broader note, it would be nice to have (community vetted) OCaml transl= ations of well-known learning material using mainstream languages. But I'll= raise the topic in another thread later.

    Thanks in advance.

    Mikhail replied

    You might be interested in the book Compiling to Assembly from Scratch. There is a port to OCaml. It suggests the use of parser c= ombinators.=20

    Parser combinators is the same manual recursive descent method, but in a fu= nctional way. You can either use an existing library or you can write your own.

    Anton Bachin also replied

    odoc's parser is half of what you're asking for. It uses ocamllex for the l= exical scan, because it's very simple and convenient to do it that way, but the syntax is then analyzed by a hand-written recursive descent parser, in large part because that's easier for the doc language.

    An example of a non-ocamllex and non-ocamlyacc parser is Markup.ml (tokenizer, parser). But this isn't a traditional recursive descent parser. Rather, it's a pretty huge ha= nd-written state machine in continuation-passing style, almost completely implementing the corresponding huge state machine specifi= ed in HTML5. But it's the kind of code that fits well the topics of an impure FP class, especially since it has mutable cells for its= continuations, that it uses to mimic effects.

    Boulder Dash in OCaml

    Continuing this thread, Andreas Rossberg announced

    Couldn=E2=80=99t let it rest, so I=E2=80=99m (already) announcing version 2= of it =E2=80=94 now a much improved, practically feature-complete reimplementation of both Boulder Dash 1 & 2.

    Version 2 was an excuse for me to mess around with the OCaml bindings to po= pular graphics engines, and as a result, it now comes with 3 backends to choose from:

    1. the homely bare OCaml Graphics library (https://github.com/ocaml/graphics),
    2. the TSDL binding to the SDL2 API (https://github.com/dbuenzli/tsdl),
    3. the binding to the Raylib engine (https://github.com/tjammer/raylib-ocaml).

    The list is in order of increasingly better user experience, for the price = of a potentially harder build experience. In theory, all versions should run on Windows, Mac, and Linux, though I was too lazy to te= st all combinations, and I (or my opam) had trouble installing some of the dependencies on some of the systems.

    Features:

    • Faithful original physics, graphics, animations, sound, and music
    • Authentic scrolling mechanics combined with dynamic resizing
    • All 40 levels and 5 difficulties of Boulder Dash 1 & 2
    • Pause-and-go mode for relaxed playing

    Relative to the previous release, version 2 adds the following niceties:

    • Support for SDL and Raylib engines, which allow all of the following
    • Original sound effects and music
    • Original level color schemes
    • Full screen mode
    • Faster graphics
    • Dynamic graphics scaling adjustment
    • Gamepad/joystick support as well as more precise keyboard controls
    • Boulder Dash 2 levels and decoder

    Almost looks like a real game now. One from the 80s anyways. :)

    Js_of_ocaml 5.9.0

    Hhugo announced

    I=E2=80=99m pleased to announce the release of js_of_ocaml 5.9.0. It should= soon be available in opam.

    Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers= and Node.js.

    Most significant changes:

    • Support for OCaml 5.3
    • Speedup sourcemap generation and improve sourcemap accuracy.
    • Prepare the merge of the wasm_of_ocaml fork back into the js_of_ocaml r= epo.
    • JS backtraces are really expansive. They now need to be explicitly requ= ested with OCAMLRUNPARM=3Db=3D1. This speeds up programs linke= d with libraries enabling backtraces programmatically using Printexc.= record_backtrace true.

    See the Changelog for other changes.

    Liquidsoap 2.3.0

    Romain Beauxis announced

    We are stoked to announce the 2.3.0 release of liquidsoap, a g= eneral-purpose scripting language written in OCaml with specialized operato= rs to build media streams.

    The release is available on github: https://github.com/savonet/liquidsoap/releas= es/tag/v2.3.0

    During this release cycle, we have rewritten huge chunk of the application'= s internal, including a new media streaming abstraction and clock system.

    As an OCaml application, liquidsoap's scope and complexity has greatly expa= nded in the next years.

    Some of the most challenging areas for us at this point are memory usage (a= nd, incidentally, CPU usage).

    Although OCaml's garbage collection is a very powerful tool, in the context= of very short lived streaming cycles (typically 0.02s) with p= otentially quite large memory allocations (typically video images), control= ling the timing of memory allocations and release is becoming more and more= critical.

    We are also aware of the work done by Jane St on adding a local call stack. This could be an avenue to explore as well but:

    1. Some of our content has to be stored in the long-term heap
    2. We want to work with an official OCaml compiler for obvious long-term m= aintenance concerns.

    Nonetheless, we are thrilled to be part of a community whose array of tools= (building, packaging, debugging, etc) and libraries has expanded so well a= long with a vibrant compiler development team.

    In the future, we wish to explore more of the new OCaml concurrency feature= s. This might require that we revisit the way we handle short-term memory f= irst.

    Bytesrw 0.1.0 =E2=80=93 Composable byte stream readers and wri= ters

    Daniel B=C3=BCnzli announced

    It's my pleasure to announce the first release of the bytesrw = library:

    Bytesrw extends the OCaml Bytes module with composable, memory= efficient, byte stream readers and writers compatible with effect-based co= ncurrency.

    Except for byte slice life-times, these abstractions intentionally separat= e away ressource management and the specifics of reading and writing bytes.

    Bytesrw distributed under the ISC license. It has no dependencies.

    Optional support for compressed and hashed bytes depend, at your wish, on = the C zlib, libzstd, bl= ake3, = libmd, xxhash a= nd libraries.

    The only reason I was longing for OCaml algebraic effects was so that I cou= ld avoid using them: when you write codecs on byte streams it should not be= a concern where your bytes are coming from or headed to. The bytesrw= library provides structures to abstract this. Additionally it estab= lishes a buffer ownership discipline that enables byte streams to (de)compo= se while remaining memory efficient.

    I do not expect the library to change much and it has been used. But it's n= ew and practice may call for adjustments. Do not hesitate to get in touch i= f you run into problems or see obvious defects or improvements. I do expect= the library will add more convenience (e.g. for processing lines and UTF) = and more optional stream formats over time.

    This first release was made possible thanks to a grant from the OCaml Software Foundation. I also thank my donors for their support.

    dream-html and pure-html 3.5.2

    Yawar Amin announced

    [ANN] dream-html 3.7.0

    Happy to announce the addition of a helper module for typed form decoding f= unctionality. See the docs here: https://yawaramin.github.io/= dream-html/dream-html/Dream_html/Form/index.html

    An example:

    type user =3D { name : s=
    tring; age : int option }
    
    open Dream_html.Form
    
    let user_form =3D
      let+ name =3D required string "name"
      and+ age =3D optional int "age" in
      { name; age }
    
    let dream_form =3D ["age", "42"; "name", "Bob"]
    let user_result =3D validate user_form dream_form
    (* =3D> Ok { name =3D "Bob"; age =
    =3D Some 42 } *)=
    
    
    let error_result =3D validate user_form ["age", "none"<=
    /span>]
    (* =3D> Error [("age", "error.expe=
    cted.int"); ("name", "error.required")] *)
    

    Astute readers may observe that this provides some convenience functionalit= y beyond what Dream itself offers; to validate the above form and get a complete set of field validation errors using= only Dream you would do something like:

    let user_result =3D match dream_form with
      | ["age", age; "name", name] ->
        (match int_of=
    _string age with
        | age -> =
    Ok { name; age =3D Some age }
        | exception <=
    span style=3D"color: #242521; background-color: #fcf7ef;">Failure _ =
    -> Error ["age", "error.expected.int"])
      | ["name", name] -> Ok { name; age =3D <=
    span style=3D"color: #242521; background-color: #fcf7ef;">None }
      | ["age", age] ->
        (match int_of=
    _string age with
        | age -> =
    Error ["name", "error.required"]
        | exception <=
    span style=3D"color: #242521; background-color: #fcf7ef;">Failure _ =
    -> Error ["age", "error.expected.int"; "name"<=
    /span>, "error.required"])
      | _ -> Erro=
    r ["name", "error.required"]
    

    And this is a form with only two fields. You can imagine how convoluted the= logic would be for more complex forms. Of course, you might just decide to= use List.assoc_opt and build up the validation errors, but ev= en that can get tricky. So if you are making heavy use of HTML forms, a hel= per module that takes care of all these validation details can be very usef= ul. Enjoy!

    Second beta release of OCaml 5.3.0

    octachron announced

    One month after the release of the first beta for OCaml 5.3.0, we are rele= asing a second and hopefully last beta release for OCaml 5.3.0 .

    The most notable changes for this second beta are probably a handful of typ= e system bugfixes. In particular, those fixes revert a change of behaviour = in the first beta when pattern matching GADTs with non-injective type param= eters.

    We also have a C++ header compatibility fix and the restoration of some con= figuration variable in Makefiles for the sake of backward compatibility.

    Overall, the release is converging and we are expecting to have a first rel= ease candidate around the middle of December. The progresses on stabilising= the ecosystem are tracked on the opam read= iness for 5.3.0 meta-issue.

    Meanwhile, the second beta release of OCaml 5.3.0 is here to help you update your software and libraries ahead of the release (see below for the install= ation instructions).

    The full release is expected before the end of December.

    If you find any bugs, please report them on OCaml's issue tracker.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.3.0 is available on GitHub.

    Happy hacking, Florian Angeletti for the OCaml team.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.3.0~beta2
    

    The source code for the beta is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.3.0~beta2+options &=
      lt;option_list>
      

      where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

      opam switch create 5.3.0~beta2+flambda+nffa ocaml-variants.5.3.0~beta2+opti=
      ons ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Changes Since The First Beta

    • Type system fixes
      • #13501: Reg= ression on mutually recursive types caused by #12180. Resuscitate Typedecl.update_type. (Jacques Garrigue and Takafumi Saikawa, review by Florian Angeletti, Richard Eisenberg and Gabriel Scherer)
      • #13495, #13514: Fix typech= ecker crash while typing objects (Jacques Garrigue, report by Nicol=C3=A1s Ojeda B=C3=A4r, review by Nicolas Ojeda B=C3=A4r, Gabriel Scherer, Stephen Dolan, Florian Angeletti)=
      • #13598: Fal= sely triggered warning 56 [unreachable-case] This was caused by unproper protection of the retyping function. (Jacques Garrigue, report by T=C3=B5ivo Leedj=C3=A4rv, review by Florian An= geletti)
    • Configuration fixes
      • (breaking change) #12578, #12589, #133= 22, +#13519= : Use configured CFLAGS and CPPFLAGS only during the build of the compiler itself. Do not use them when compiling third-party C sources through the compiler. Flags for compiling third-party C sources can still be specified at configure time in the COMPILER_{BYTECODE,NATIVE}_{CFLAGS,CPPFLAGS} configuration variables. (S=C3=A9bastien Hinderer, report by William Hu, review by David Allsopp)
    • C++ header compatibility
      • #13541, #13591: Fix header= s for C++ inclusion. (Antonin D=C3=A9cimo, review by Nick Barnes, report by Kate Deplaix)
    • Compiler library bug fix
      • #13603, #13604: fix source= printing in the presence of the escaped raw identifier \#mod. (Florian Angeletti, report by Chris Casinghino, review by Gabriel Scherer)<= /li>

    New release of Monolith

    Fran=C3=A7ois Pottier announced

    I am pleased to announce a new release of Monolith, a library that = helps perform strong automated testing of OCaml libraries.

    opam update
    opam install monolith.20241126
    

    The changes are as follows:

    • The documentation of the specification combinators has been re-organized in sections and subsections. Finding the desired combinator should now be easier.
    • The new combinator naive_array offers limited support for = arrays.
    • The new combinator naive_seq offers limited support for se= quences (that is, for the type constructor Seq.t).
    • The new combinator pair is a synonym for ( *** ).
    • The new combinator triple offers support for triples.
    • The new combinator either offers support for the type cons= tructor Either.t.
    • The new combinators iter, foldr, foldl<= /code>, iteri, foldri, foldli offer support for iteration functions.
    • An unintentional and undocumented limitation has been fixed: so far, us= es of the combinator map_into would work only at the root of the spe= cification or in the right-hand side of an arrow ^>. It should now be = possible to use map_into under other combinators that expect a deconstructible specification, such as ^!> (in the right-hand side), = ( *** ), option, result, list, etc. This improvement affects not o= nly map_into, but also a number of other combinators that are defined in terms of map_i= nto.
    • Monolith now requires OCaml 4.12 or later.
    • In Makefile.monolith,
      • the default switch is changed from 4.11.1 to 4.14.2; this can be overridden by defining SWITCH;
      • make test automatically disables the MacOS crash reporter;=
      • the use of ulimit -s is abandoned.

    Jsont 0.1.0 =E2=80=93 Declarative JSON data manipulation for O= Caml

    Daniel B=C3=BCnzli announced

    It's my pleasure to announce the first release of the jsont libary:=20

    Jsont is an OCaml library for declarative JSON data manipulation. It provid= es:

    • Combinators for describing JSON data using the OCaml values of your cho= ice. The descriptions can be used by generic functions to decode, encode, q= uery and update JSON data without having to construct a generic JSON repres= entation.
    • A JSON codec with optional text location tracking and layout preservati= on. The codec is compatible with effect-based concurrency.

    The descriptions are independent from the codec and can be used by third-pa= rty processors or codecs.

    Jsont is distributed under the ISC license. It has no dependencies. The cod= ec is optional and depends on the bytesrw library. The JavaScript support is option= al and depends on the b= rr library.

    The library has been used in practice but it's new so a few adjustments may= be needed and more convenience combinators added.

    The library also enables quite a few things that I did not have the time to= explore like schema description generation from descriptions, quasi-stream= ing JSON transformations, description generation from dynamic type represen= tations, etc. Lots of this can be done outside the core library, do not hes= itate to get in touch if you use the library and find interesting applicati= ons or pesking limitations.

    This first release was made possible thanks to a grant from the OCaml Software Foundation. I also thank my donors for their support.

    Best,

    Daniel

    P.S. I think that the technique used by the library, which I dubbed fina= lly tagged is interesting in itself. You can read a paper about it here along wi= th a smaller, self-contained, implementation of what the library does.

    Tiny educational concurrent I/O and promises library

    Mikhail announced

    I like Lwt. It's a fantastic= library, but how does it work? I spent a few days studying its source code= .=20

    Finally, inspired by the implementation of Lwt and the CS3110 chapter, 8.7. Promises. I wrote a maxima= lly stupid tiny-asy= nc-lib library.=20

    Maybe you may be interested in this naive implementation.=20

    Examples of use

    let () =3D=20
      Engine.run main begin
        let* () =3D <=
    span style=3D"color: #444fcf;">Io.(write_all stdout) "Hi! What's your name? " in
        let* name =3D Io.=
    (read_line stdin) in
        Io.(write_all stdout) ("Hello, " ^ name ^ "!\n")
      end
    
    let read_and_print_file =
    filename =3D=20
      Io.(read_file filename >>=3D=
     write_all stdout)
    
    let _ =3D
      Engine.run begin
        let filenames =3D [ (* ... *)=
     ] in=20=20
    
        filenames
        |> List.map read_and_print_file
        |> Promise.join
      end
    

    Implementation details

    The first key abstraction of the whole library is, of course, Promise. Promise is a= n abstraction for synchronizing program execution in concurrent evaluations= . In simple terms, it's an abstraction over callbacks. Promises allows us t= o build (monadic) sequence evaluations inside of non-sequence evaluations.

    (* promise=
    .ml *)
    
    type 'a t =3D { mutable state: 'a state }=20=20
    
    and 'a state =3D=20
      | Fulfilled of 'a=20
      | Rejected of exn
      | Pending of 'a callback=
     list=20
    
    and 'a callback =3D 'a state -> unit=20
    

    Promises are represented as a mutable record with three possible states: fu= lfilled (contains a value), rejected (contains an exception), and pending (= contains callbacks).=20

    Callbacks are functions that are called when a promise is resolved. So when we bind, if the promise is in pending state, we add a = callback that calls the following monadic sequence when the promise is reso= lved.

    (* io.ml *)
    
    let sleep delay =3D
      let p, r =3D=
     Promise.make () in
    
      Engine.(on_timer instance) delay (=
    fun handler ->
          Engine.stop_handler handler;
          Promise.fulfill r ());
    
      p
    

    The second key abstraction is an asynchronous I/O engine that polls I/O events and disp= atches them to handlers. Original Lwt has few engines (like based libev, se= lect, poll), but I hardcoded a [select](https://en.wikipedia.org/wiki/Select_(Unix))-based= engine inspired by Lwt_engine.select_based.=20

    The typical async engine in internals has an event loop. At each iteration = of the event loop, the engine polls for new events and calls handlers to ha= ndle them.=20

    (* engine.=
    ml *)
    
    let iter engine =3D
      (* ... *)
    
      let readable_fds, w=
    ritable_fds, _ =3D
        Unix.select readable_fds writabl=
    e_fds [] =
    timeout
      in
    
      engine.sleepers <- restart_sleepers now engine.sleepers;
    
      invoke_io_handlers engine.wait_readable readable_fds;
      invoke_io_handlers engine.wait_writable writable_fds
    

    How to execute I/O promise? It's not a big deal.=20

    (* engine.=
    ml *)
    
    let rec run promise =3D
      match Promise.state promise with
      | Fulfilled value -> value
      | Rejected exc -> raise exc
      | Pending _ ->
          iter instance;
          run promise
    

    We just need to loop the event loop until the promis is resolved.

    It's just a toy! I'm not an expert in such things, so the library is very n= aive and tries to mimic Lwt. But I think it's a good demonstration.=20

    Repository https://github.com/dx3= mod/tiny-async-lib

    Thank you for your attention!

    Eliom 11.1: Towards Web Assembly support

    Vincent Balat announced

    Eliom 11.1 has been released recently. This minor release brings compatibility with Web Assembly and the upcoming = version of js_of_ocaml. Ocsigen Toolkit and Ocsigen Start have been updated as well.

    Stay tuned for further announcements concerning client-server Web and mobil= e apps in Ocaml with Web Assembly!

    Links:

    Areas and Adversaries

    Rapha=C3=ABl Proust announced

    I figured people might be bored of British pub names by = now so I did another thing: a generator for titles of table-top role-play= ing games.

    $ opam install areas-and-adversaries
    ...
    $ areas-and-adversaries
    Woods & Wizards
    

    The code is on Gitlab: https://gitlab.com/raphael-proust/areas-and-adversaries

    It was a good excuse to experiment with non-dune build systems (to scope th= ings out). I went for a plain Makefile in the end which works well.

    I also wanted to figure out a better way to embed data in an executable. I = ended up wondering about moving as much of the processing as possible into = the build phase. What I ended up with is a small program which prints a com= pilation unit (.ml) which has mostly array literals. Still hav= e some open questions on that, any input welcome:

    • Should I have used meta-ocaml to print the code? The data/munch.m= l would probably be more readable, but the build probably less.
    • How could I generate this kind of processed-data code for data-structur= es which don't have a literal (maps, sets, hash tables, etc.)? How can I mi= nimise the initialisation cost of the program for such situations?

    MariaDB 1.2.0

    Petter A. Urkedal announced

    I'm please to announce a new release of the mariadb package, which provides client bi= ndings for MariaDB and MySQL. See the full release notes below.

    This is also to announce that I have taken over maintenance of the project.= Currently I am the sole maintainer (and I usually use PostgreSQL for my o= wn deployments), so if someone has the time en interest to contribute, let = me know. The main focus from my side is to keep the project up to date and= stable, rather than making major changes.

    Release notes:

    • Added Stmt.start_txn (#59 by Corentin Leruth).
    • Added Res.insert_id as binding for mysql_stmt_insert= _id (#58 by=20=20=20=20=20=20=20=20=20=20=20=20 Corentin Leruth).
    • Updated to support recent OCaml versions (#45 by @kit-ty-kate).
    • Fixed too-early retrieval of statement metadata (#41 by Albert Peschar)= .
    • Fixed decoding bug for the integer type (#54 by Raman Varabets, tested= =20=20=20=20=20=20=20=20=20 by #61 by Corentin Leruth).
    • Fixed a memory leaks related to result metadata (#39 by Albert Peschar)= .
    • The build system is now dune and dune-configurator (#52 by Petter A.=20= =20=20=20=20=20=20=20=20=20=20 Urkedal) and some of the examples have been converted to a test suite=20=20= =20=20=20=20=20=20=20=20 (#60 by Petter A. Urkedal).
    • The project has been transferred to ocaml-community with Petter A.=20= =20=20=20=20=20=20=20=20=20=20=20=20 Urkedal as the new maintainer.

    Proposed Package Archiving Policy for the opam Repository

    Hannes Mehnert announced

    It is my please to announce the proposed package archiving policy in the na= me of the opam-repository maintainers.

    Context

    The opam repository differs from nearly all other programming-language-cent= ric package repositories in that it is manually curated by volunteer mainta= iners and protected by a robust continuous integration system that (general= ly) ensures published packages work as expected across a large matri= x of supported platforms.

    Over the past few years the repository has kept growing steadily, when not = accelerating, and this has started raising questions about the size, weight= and sustainability of the repository and its processes. Last year, Hannes Mehnert requested comments on a = proposed = initiative to improve the sustainability and quality of the opam packag= e repository on the long term.

    Problem

    The problem, in a nutshell, is that the opam-repository will k= eep steadily growing, using an increasing and substantial amount of space a= nd inodes. Every opam user needs to invest a large amount of computational = resources for the solver, every time they want to install or update a packa= ge. Additionally, a large amount of computational resources are spent in th= e continuous integration process and yet a lot of the packages have become = stale or uninstallable.

    Solution

    After muc= h deliberation, the discussion converged on a solution: introduce a pac= kage archiving policy and supporting processes, to periodically identify an= d prune unmaintained and broken packages from the repository. This will imp= rove the performance of the opam solvers, of the opam-repo CI, and most imp= ortantly improve the quality of the package repository, while keeping a sor= t of immutability of the repository content and preserving the usability of= historical packages for the users that want or need them.

    The opam repository maintainers propose a policy.

    The currently empty repository archive has been created, waiting for packages to be m= oved.

    Call to action

    If you maintain packages in the opam-repository, you can help by defining y= our maintanence intent: add a new field x-maintenance-intent t= o your opam file(s) (the most recent release of your package is sufficient = - please also put this field in your git repository so it will be part of f= uture releases). The value is defined in the policy.

    Roadmap

    All announcements will be on discuss.ocaml.org with the opam-repository tag= . If you like to follow these announcements, keep your eyes at the opam-repository tag.

    • December 1st 2024: announcement of this proposal
    • December 15th 2024: announcement of the packages affected by Phase 1 (u= ninstallable packages ("available: false", "flags: avoid-version" or "depre= cated", "opam admin check –installable", does not compile – o= pam health check https://check.ci.o= caml.org/)
    • January 1st 2025: Phase 1 cutting point: packages are moved to opam-rep= ository-archive
    • January 15th 2025: announcement of the packages affected by Phase 2 (OC= aml lower bound 4.08)
    • February 1st 2025: Phase 2 cutting point: packages are moved to opam-re= pository-archive
    • February 15th 2025: initial spring cleaning, announcement of packages (= based on maintenance-intent)
    • March 1st 2025: spring cleaning cutting point: packages are moved to op= am-repository-archive
    • Every quarter: repeat Phase 3
    • Every year: reconsider Phase 2 with an increased OCaml lower bound

    We now invite members of the OCaml community who may not follow the ocaml-r= epository issues to review our plans and submit comments, questions, or sug= gestions.

    Thank you in advance for your support!

    Acknowledgment

    Thanks to the following individuals for valuable input and contributions to= the planning process (sorry in case we forgot you):

    • Marcello Seri
    • Shon Feder
    • Thomas Gazagnaire
    • kit-ty-kate
    • Weng Shiwei =E7=BF=81=E5=A3=AB=E4=BC=9F
    • Marcus Rohrmoser
    • Reynir Bj=C3=B6rnsson
    • Stephen Sherratt
    • Simon Cruanes
    • Marek Kubica
    • Rapha=C3=ABl Proust
    • Romain Beauxis
    • Yawar Amin
    • Anil Madhavapeddy
    • Boning D.
    • Mathieu Barbin
    • Hannes Mehnert

    capnp-rpc 2.0

    Thomas Leonard announced

    I'm pleased to announce the release of capnp-rpc 2.0, an OCaml implementation of= the Cap'n Proto RPC specification.

    If you haven't used the library before, please see the documentation and tutoria= l. Cap'n Proto RPC aims to provide secure, efficient, typed communicati= ons between multiple parties.

    The main change in this version is the switch from Lwt to Eio for concurren= cy. The echo benchmark is about 40% faster than before. This isn't because = Eio is actually that much faster than Lwt, but more because it has better p= rofiling support so spotting problems was easier. See https://roscidus.com/blog/blo= g/2024/07/22/performance/ for an example:

    3D"capnp-eio-slow-zoom1-debug.png"

    There is a capnp-rpc-lwt compatibility package that provides t= he old Lwt API using the new Eio version, allowing libraries using the old = API to be used in applications using the new code, without having to update= everything at once.

    To migrate to the new version (checking everything still works after each s= tep):

    1. First, update to capnp-rpc 1.2.4 (this ensures you are using the newer = mirage-crypto API, to get that migration out of the way first).
    2. Switch your application (that sets up the networking) to capnp-rpc-unix= 2.0.
    3. Migrate client and server code away from capnp-rpc-lwt when convenient.=

    For more detailed instructions, see the changelog.

    Here's an example of the changes needed in the solver-service project:

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=ghFeDGT/; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=5ae1JPV7; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 8722548E3C for ; Tue, 10 Dec 2024 13:49:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=GSMgajq7jYjz+2TrGTM1B/uhWC3vgEQDnM+Eo7VuC28=; b=ghFeDGT/M2iJK61kN0CHLZZRtBc1QMvfBI/2n7C1H1eMxmb+RVYj4QVI MRISMO02lpKBX4kiPiCO7v6lJbLMHqbVuCtqKFQl6n5PTm8R7L5+MrSaC XYJJnbclMNJK2NBL5i4XNQpOcRJ5f5sco9JApdaKMX3FsLlVVjjyFMUZi w=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,222,1728943200"; d="scan'208,217";a="198428567" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Dec 2024 14:49:03 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9E247E0D1E; Tue, 10 Dec 2024 14:49:03 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5137BE00B6 for ; Tue, 10 Dec 2024 14:48:59 +0100 (CET) IronPort-SDR: 675846ca_AnNUFup+J8lr054KJZyNQJkBEA3DCL//2gEET59AOD4XlYX ABH/N7ML9qHysP0h/L3MAoyikmHDFLZvfmeIg3g== X-IPAS-Result: =?us-ascii?q?A0HDCwAnRlhngSIeaIFaFoJGAoE/WygZAWNaMwcIRASEV?= =?us-ascii?q?lyCc44fgRaQN4p4gVYjgQIDGBYjFAEDAQ0uAQUNAQIEAQEDAQIBhDpGAhY5F?= =?us-ascii?q?YoGAh8GAQQyBw4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBP?= =?us-ascii?q?QVJhXsNSQEBAQECAQYEgWtRcWEEAwY3AQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBGRoBDlwBCAoTAQEjDwYYIwMQBAEGA?= =?us-ascii?q?wIEDQE1FwESFAaCDxRFgh9FAwQBDAaTJJp6Gjd6gTKBAYIMAQEGgQg+AgELA?= =?us-ascii?q?gIDAQ4JJQHaBoFkCYEwGIVrgkkaASpIagKESIQ8Jw+BVUSBFYJyB2+CEi0LF?= =?us-ascii?q?wEBAQEYgSQBAQhFCYMlgmmCJxmCZ3+BboEMgW+CD4M0ElSBXB6DPB0dL0aBD?= =?us-ascii?q?1mBL4oWgUciAyYzMgFVExcLBwVhgRQDLjcxg2CBAzmCEGlJNwINAjaCJCRYg?= =?us-ascii?q?k2DWIE/hGmEWYYmghlOHUADC209NxQbmzEBCTNGAUaBLoEwLw44BgEBKQMQH?= =?us-ascii?q?QcaCQUFARMSBAIEHAIuBAQOFQoLCAMCFxEIBAkOAg4FCC0FAwECCwIUGZJAD?= =?us-ascii?q?gYoBRgNAnWOTI4Rk1KBCjQHhB2BXQYMiBtpgSSVeoEXgm2BV4suhwCSSCKYW?= =?us-ascii?q?SKCNYclDYEYCV+BDx5MlUwGBA8NGYUdgW4LKDxvAQEaAgMJBzMaMEOCMwEBM?= =?us-ascii?q?QEJCjwcD4ghhgsXgjqBHoE+gSaBdTuCbYIItFZCNQIBAQE3AgcBCgEBAwmFR?= =?us-ascii?q?R0BAYFOgTaCF4VRbl0BAQ?= IronPort-PHdr: A9a23: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 idiBiMJiypFR8WHxjNQ24+B IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:7LFtjaAMXB2UPlPlHemR55DYdb4zR+YMi2TDtnoBKiC9F/bzqy nAppomPHPP5Qr5O0tBpTnjAsi9qBrnnPYf3WB7B9iftWfd1FeAHcVL0s/JwjHrGSHyn9Qtt5 tIQuxZE9O1KVB7iK/BkW2F+jsbsby6zJw= X-Talos-CUID: 9a23:7WIHk2NkPhu3ae5DCGo2yEo/AsYeeyOA4nHABFXkImtWV+jA X-Talos-MUID: 9a23:gyuPwwtbndJdFNonCc2ngBNrCPlCs+OVDAMW1qoNpdCnPjVfAmLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,222,1728943200"; d="scan'208,217";a="198428534" X-MGA-submission: =?us-ascii?q?MDGrriq/Hmi6i4HzuOnHpmWL92Ejc1SFAne3Xz?= =?us-ascii?q?uPyRzqvJWOdpf39qxOn8n1oNwS7AjUoJqoZNdNNzLMMJYwM7xcJyZW9s?= =?us-ascii?q?oPIOrYUrX+xQsZwXmXx18ccErpkTIYUB7pW9MCXV82Odm/BhGoORlfLj?= =?us-ascii?q?NAEJgBJgeiAX2J0q0YEM/XGg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Dec 2024 14:48:58 +0100 Received: from TM.local (unknown [31.32.212.183]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D458E5648DE; Tue, 10 Dec 2024 14:48:56 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1733838537; bh=9EqlMiP1blRIs+zQTniDKyXMehuZ/P6wd/FEy/eIkIo=; h=From:To:Subject:Date:Message-ID; b=5ae1JPV73wxGMbRWxQH9mPjwSKPvYV0/3VX+hCo3ZqH/nyomwIdlgPKW4U+Ucb8W6 ph1uBN2g/cK9c0g3N5DmgR15g4OWGuKmpHjRQtJiZuOgbzetKTABUMb8bc7K4lLbgU gffY/iyrIkiQq+GN6zWDQ3z2u9M/P5tKfl7qq1yc= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Dec 2024 14:48:56 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 10 14:48:57 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.419851, queueID=5E2025648E6 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19227 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMDMgdG8gMTAsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClJlbGVh c2Ugb2YgY3BwbyAxLjguMA0KTmV3IHJlbGVhc2VzIG9mIE1lcmxpbiBhbmQgT0NhbWwtTFNQDQpO ZXcgcmVsZWFzZSBvZiBiYWJ5DQpSZWxlYXNlIG9mIFNhdHVybiAxLjANCkR1bmUgZGV2IG1lZXRp bmcNCkR1bmUgMy4xNw0KU3BlYyBhbmQgaW50ZXJmYWNlIHRvIGRlY2xhcmUgZGVwZW5kZW5jaWVz IGluIGFuIE9DYW1sIHNjcmlwdA0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNClJlbGVh c2Ugb2YgY3BwbyAxLjguMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tcmVsZWFzZS1vZi1jcHBvLTEtOC0wLzE1NzQ5LzE+DQoNCg0KRnJh bsOnb2lzIFBvdHRpZXIgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFt IHBsZWFzZWQgdG8gYW5ub3VuY2UgYSBuZXcgcmVsZWFzZSBvZiBgY3BwbycgKDEuOC4wKSB3aXRo IG9uZSBuZXcNCiAgZmVhdHVyZSBhbmQgb25lIGJ1ZyBmaXg6DQoNCiAg4oGDIEEgc2NvcGUsIGRl bGltaXRlZCBieSBgI3Njb3BlIC4uLiAjZW5kc2NvcGUnLCBsaW1pdHMgdGhlIGVmZmVjdCBvZg0K ICAgIGAjZGVmaW5lJywgYCNkZWYgLi4uICNlbmRkZWYnLCBhbmQgYCN1bmRlZicuDQogIOKBgyBU aGUgY29tbWFuZCBgY3BwbyAtdmVyc2lvbicsIHdoaWNoIHVzZWQgdG8gcHJpbnQgYSBibGFuayBs aW5lLCBoYXMNCiAgICBiZWVuIGZpeGVkLg0KDQogIEZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBz ZWUgdGhlIFtkb2N1bWVudGF0aW9uXS4NCg0KDQpbZG9jdW1lbnRhdGlvbl0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1jb21tdW5pdHkvY3Bwby8+DQoNCg0KTmV3IHJlbGVhc2VzIG9mIE1lcmxp biBhbmQgT0NhbWwtTFNQDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1uZXctcmVsZWFzZXMtb2YtbWVybGluLWFuZC1vY2FtbC1sc3AvMTU3NTIvMT4NCg0KDQp2 ZHMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBJIGFtIHBsZWFzZWQgdG8gYW5ub3VuY2UgbmV3IHJlbGVhc2VzIG9mIE1lcmxpbiAoYDUuMy01 MDInIGFuZA0KICBgNC4xOC00MTQnKSBhbmQgT0NhbWwtTFNQIChgMS4yMC4xJyBhbmQgYDEuMjAu MS00LjE0JykuDQoNCiAgVGhlIE1lcmxpbiByZWxlYXNlcyBidW5kbGUgYSBoYW5kZnVsIG9mIGZp eGVzIHdoaWxlIHRoZSBMU1AgcmVsZWFzZXMNCiAgZm9jdXMgb24gYWRkaW5nIG1vcmUgY3VzdG9t IHF1ZXJpZXMuIFRoZXNlIGN1c3RvbSBxdWVyaWVzIHdpbGwgZW5hYmxlDQogIHRhaWxvcmVkIExT UCBjbGllbnRzIHRvIHByb3ZpZGUgdGhlIHNhbWUgcmljaCBPQ2FtbCBlZGl0aW5nIGZlYXR1cmVz DQogIGFzIHRoZSBvbmUgcHJvdmlkZWQgYnkgdGhlIG9yaWdpbmFsIE1lcmxpbiBtb2RlcyBmb3Ig RW1hY3MgYW5kIFZpbS4NCg0KICBMYXRlc3QgcmVsZWFzZXMgb2YgYHZzY29kZS1vY2FtbC1wbGF0 Zm9ybScgYWxyZWFkeSBwcm92aWRlIHR3byBuZXcNCiAgY29tbWFuZHM6IGBDb25zdHJ1Y3QnIGFu ZCBgSnVtcCcgdGhhdCByZXNwZWN0aXZlbHkgcHJvdmlkZSBhIGJldHRlciBVSQ0KICB0byBmaWxs IHR5cGVkIGhvbGVzIHdpdGggdmFsdWVzIGFuZCBqdW1wIHRvIHNwZWNpZmljIHBhcmVudA0KICBu b2Rlcy4gU2VhcmNoIGJ5IHR5cGUvcG9sYXJpdHkgYW5kIGEgY29tbWFuZCB0byBnZXQgdGhlIHR5 cGUgb2YNCiAgZ3Jvd2luZyBhbmQgc2hyaW5raW5nIHNlbGVjdGlvbnMgd2lsbCBhbHNvIGJlIGF2 YWlsYWJsZSBpbiB0aGUgZnV0dXJlLg0KDQogIDxodHRwczovL2dsb2JhbC5kaXNjb3Vyc2UtY2Ru LmNvbS9mbGV4MDIwL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvYy9jMDdkZTMxMzBjOTJjYjE2 MDEyMTU1MzFjNzVlY2MwNTQ1YTk3YjRkLmdpZj4NCg0KDQpNZXJsaW4gY2hhbmdlbG9nDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIG1lcmxp biA1LjMNCg0KICDigYMgbWVybGluIGJpbmFyeQ0KICAgIOKAoiBSZXNwZWN0IHRoZSBgRVhDTFVE RV9RVUVSWV9ESVInIGNvbmZpZ3VyYXRpb24gZGlyZWN0aXZlIHdoZW4NCiAgICAgIGxvb2tpbmcg Zm9yIGNtdCBmaWxlcyAoIzE4NTQpDQogICAg4oCiIEZpeCBvY2N1cnJlbmNlcyBidWcgaW4gd2hp Y2ggcmVsYXRpdmUgcGF0aHMgaW4gaW5kZXggZmlsZXMgYXJlDQogICAgICByZXNvbHZlZCBhZ2Fp bnN0IHRoZSBQV0QgcmF0aGVyIHRoYW4gdGhlIFNPVVJDRV9ST09UICgjMTg1NSkNCiAgICDigKIg Rml4IGV4Y2VwdGlvbiBpbiBwb2xhcml0eSBzZWFyY2ggKCMxODU4IGZpeGVzICMxMTEzKQ0KICAg IOKAoiBGaXgganVtcCB0byBgZnVuJyB0YXJnZXRzIG5vdCB3b3JraW5nICgjMTg2MywgZml4ZXMg IzE4NjIpDQogICAg4oCiIEZpeCB0eXBlLWVuY2xvc2luZyByZXN1bHRzIGluc3RhYmlsaXR5LiBU aGlzIHJldmVydHMgc29tZSBvdmVybHkNCiAgICAgIGFnZ3Jlc3NpdmUgZGVkdXBsaWNhdGlvbiB0 aGF0IHNob3VsZCBiZSBkb25lIG9uIHRoZSBjbGllbnQNCiAgICAgIHNpZGUuICgjMTg2NCkNCiAg ICDigKIgRml4IG9jY3VycmVuY2VzIG5vdCB3b3JraW5nIHdoZW4gdGhlIGRlZmluaXRpb24gY29t ZXMgZnJvbSBhDQogICAgICBoaWRkZW4gc291cmNlIGZpbGUgKCMxODY1KQ0KDQoNCk9DYW1sLUxT UCBjaGFuZ2Vsb2cNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQril4ogMS4yMC4xDQoNCiAg4peKIEZlYXR1cmVzDQoNCiAgICDigKIg QWRkIGN1c3RvbQ0KICAgICAgW35vY2FtbGxzcC90eXBlU2VhcmNofl0oL29jYW1sLWxzcC1zZXJ2 ZXIvZG9jcy9vY2FtbGxzcC90eXBlU2VhcmNoLXNwZWMubWQpDQogICAgICByZXF1ZXN0ICgjMTM2 OSkNCiAgICDigKIgTWFrZSBNZXJsaW5KdW1wIGNvZGUgYWN0aW9uIGNvbmZpZ3VyYWJsZSAoIzEz NzYpDQogICAg4oCiIEFkZCBjdXN0b20NCiAgICAgIFt+b2NhbWxsc3AvanVtcH5dKC9vY2FtbC1s c3Atc2VydmVyL2RvY3Mvb2NhbWxsc3AvbWVybGluSnVtcC1zcGVjLm1kKQ0KICAgICAgcmVxdWVz dCAoIzEzNzQpDQoNCg0KICDil4ogRml4ZXMNCg0KICAgIOKAoiBGaXggZmQgbGVhayBpbiBydW5u aW5nIGV4dGVybmFsIHByb2Nlc3NlcyBmb3IgcHJlcHJvY2Vzc2luZw0KICAgICAgKCMxMzQ5KQ0K ICAgIOKAoiBGaXggcHJlZml4IHBhcnNpbmcgZm9yIGNvbXBsZXRpb24gb2Ygb2JqZWN0IG1ldGhv ZHMgKCMxMzYzLCBmaXhlcw0KICAgICAgIzEzNTgpDQogICAg4oCiIFJlbW92ZSBzb21lIGR1cGxp Y2F0ZXMgaW4gdGhlIGBzZWxlY3Rpb25SYW5nZScgYW5zd2VycyAoIzEzNjgpDQogICAg4oCiIERl YWN0aXZhdGUgdGhlIGBqdW1wJyBjb2RlIGFjdGlvbnMgYnkgZGVmYXVsdC4gQ2xpZW50cyBjYW4g ZW5hYmxlDQogICAgICB0aGVtIHdpdGggdGhlIGBtZXJsaW5KdW1wQ29kZUFjdGlvbnMnIGNvbmZp Z3VyYXRpb24NCiAgICAgIG9wdGlvbi4gQWx0ZXJuYXRpdmVseSBhIGN1c3RvbSByZXF1ZXN0IGlz IHByb3ZpZGVkIGZvciBhZCBob2MgdXNlDQogICAgICBvZiB0aGUgZmVhdHVyZS4gKCMxNDExKQ0K DQoNCk5ldyByZWxlYXNlIG9mIGJhYnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvbmV3LXJlbGVhc2Utb2YtYmFieS8xNTc1NC8xPg0KDQoNCkZyYW7Dp29pcyBQ b3R0aWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxl YXN1cmUgdG8gYW5ub3VuY2UgdGhlIHNlY29uZCByZWxlYXNlIG9mIGBiYWJ5Jy4NCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwgYmFieS4y MDI0MTIwNA0KICDilJTilIDilIDilIDilIANCg0KICBgYmFieScgaXMgYW4gT0NhbWwgbGlicmFy eSB0aGF0IG9mZmVycyBwZXJzaXN0ZW50IHNldHMgYW5kIG1hcHMgYmFzZWQNCiAgb24gYmFsYW5j ZWQgYmluYXJ5IHNlYXJjaCB0cmVlcy4gSXQgb2ZmZXJzIHJlcGxhY2VtZW50cyBmb3IgT0NhbWwn cw0KICBgU2V0JyBhbmQgYE1hcCcgbW9kdWxlcy4NCg0KICBIZWlnaHQtYmFsYW5jZWQgYW5kIHdl aWdodC1iYWxhbmNlZCBiaW5hcnkgc2VhcmNoIHRyZWVzIGFyZSBvZmZlcmVkDQogIG91dCBvZiB0 aGUgYm94LiBGdXJ0aGVybW9yZSwgdG8gYWR2YW5jZWQgdXNlcnMsIHRoZSBsaWJyYXJ5IG9mZmVy cyBhDQogIGxpZ2h0d2VpZ2h0IHdheSBvZiBpbXBsZW1lbnRpbmcgb3RoZXIgYmFsYW5jaW5nIHN0 cmF0ZWdpZXMuDQoNCiAgW0RvY3VtZW50YXRpb25dIGlzIGF2YWlsYWJsZSBvbmxpbmUuDQoNCiAg VGhlIGNoYW5nZXMgaW4gdGhpcyByZWxlYXNlIGFyZSBhcyBmb2xsb3dzOg0KDQogIOKAoiBUaGUg bGlicmFyeSBub3cgb2ZmZXJzIGJvdGggc2V0cyBhbmQgbWFwcy4gVGhlIG1vZHVsZXMgYEJhYnku SC5TZXQnDQogICAgYW5kIGBCYWJ5LlcuU2V0JyBjb250aW51ZSB0byBleGlzdCwgYW5kIGFyZSBj b21wYXRpYmxlIHdpdGggT0NhbWwncw0KICAgIGBTZXQnIGxpYnJhcnkuIFRoZSBtb2R1bGVzIGBC YWJ5LkguTWFwJyBhbmQgYEJhYnkuVy5NYXAnIGFwcGVhciwgYW5kDQogICAgYXJlIGNvbXBhdGli bGUgd2l0aCBPQ2FtbCdzIGBNYXAnIGxpYnJhcnkuIEZ1cnRoZXJtb3JlLCB0aGUgZnVuY3RvcnMN CiAgICBgQmFieS5ILk1ha2UnIGFuZCBgQmFieS5XLk1ha2UnIGFwcGVhci4gVGhlc2UgZnVuY3Rv cnMgcHJvZHVjZSBhDQogICAgbW9kdWxlIHRoYXQgY29udGFpbnMgc2V0cywgbWFwcywgYW5kIHR3 byBjb252ZXJzaW9uIGZ1bmN0aW9ucw0KICAgIGJldHdlZW4gc2V0cyBhbmQgbWFwcywgbmFtZWx5 IGBkb21haW4nIGFuZCBgbGlmdCcuDQogIOKAoiBEb2N1bWVudGF0aW9uOiBpbiB0aGUgc2lnbmF0 dXJlIGBPcmRlcmVkVHlwZScsIGNsYXJpZnkgdGhlDQogICAgc3BlY2lmaWNhdGlvbiBvZiB0aGUg ZnVuY3Rpb24gYGNvbXBhcmUnOyB0aGlzIGZ1bmN0aW9uIGRlY2lkZXMgYQ0KICAgIHRvdGFsIHBy ZW9yZGVyIGDiiaQnLg0KICDigKIgRG9jdW1lbnRhdGlvbjogaW4gdGhlIHByZWFtYmxlLCBjbGFy aWZ5IHRoYXQsIG1vc3Qgb2YgdGhlIHRpbWUsIHdlDQogICAgYXNzdW1lIHRoYXQgYOKJpCcgaXMg YSB0b3RhbCBvcmRlcjsgaWYgYW4gb3BlcmF0aW9uIG11c3QgYmUgdW5kZXJzdG9vZA0KICAgIGlu IHRoZSBtb3JlIGdlbmVyYWwgY2FzZSB3aGVyZSBg4omkJyBpcyBhIHRvdGFsIHByZW9yZGVyLCB0 aGVuIHRoaXMgaXMNCiAgICBleHBsaWNpdGx5IGluZGljYXRlZC4NCiAg4oCiIERvY3VtZW50YXRp b246IHVwZGF0ZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiBgZmluZCcgYW5kIGBmaW5kX29wdCcgaW4N CiAgICBhY2NvcmRhbmNlIHdpdGggdGhlIHByZXZpb3VzIHBvaW50Lg0KICDigKIgQSBudW1iZXIg b2YgaW5jb21wYXRpYmxlIGNoYW5nZXMgaGF2ZSBiZWVuIG1hZGU7IHNlZSBbdGhlIGNoYW5nZQ0K ICAgIGxvZ10gZm9yIGRldGFpbHMuDQoNCg0KW0RvY3VtZW50YXRpb25dIDxodHRwczovL2NhbWJp dW0uaW5yaWEuZnIvfmZwb3R0aWVyL2JhYnkvZG9jL2JhYnkvPg0KDQpbdGhlIGNoYW5nZSBsb2dd IDxodHRwczovL2dpdGh1Yi5jb20vZnBvdHRpZXIvYmFieS9ibG9iL21haW4vQ0hBTkdFUy5tZD4N Cg0KDQpSZWxlYXNlIG9mIFNhdHVybiAxLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlbGVhc2Utb2Ytc2F0dXJuLTEtMC8xNTc2My8x Pg0KDQoNCkNhcmluZSBNb3JlbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gdGhyaWxs ZWQgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW1NhdHVybl0gMS4wIQ0KDQogIFNhdHVybiBp cyBhIGNvbGxlY3Rpb24gb2YgY29uY3VycmVudC1zYWZlIGRhdGEgc3RydWN0dXJlcyBkZXNpZ25l ZCBmb3INCiAgT0NhbWwgNS4gVGhlc2Ugc3RydWN0dXJlcyBoYXZlIGJlZW46DQogIOKAoiB0aG9y b3VnaGx5IHRlc3RlZCB3aXRoIGFtYXppbmcgdG9vbHMgbGlrZSBbU1RNXSAoc2VlIHRoaXMgW2Js b2cNCiAgICBwb3N0XSkgYW5kIFtEU2NoZWNrXSwNCiAg4oCiIGJlbmNobWFya2VkIGZvciBwZXJm b3JtYW5jZSwNCiAg4oCiIG9wdGltaXplZCBmb3IgZWZmaWNpZW5jeSwNCiAg4oCiIGFuZCBldmVu IHZlcmlmaWVkIGluIHNvbWUgY2FzZXMhDQoNCiAgSWYgeW91J3JlIGN1cmlvdXMgYWJvdXQgdGhl IG1vdGl2YXRpb24gYmVoaW5kIFNhdHVybiBhbmQgdGhlDQogIGNoYWxsZW5nZXMgaXQgYWRkcmVz c2VzLCB5b3UgY2FuIHJlYWQgbW9yZSBbaGVyZV0uDQoNCg0KW1NhdHVybl0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvc2F0dXJuPg0KDQpbU1RNXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sLW11bHRpY29yZS9tdWx0aWNvcmV0ZXN0cz4NCg0KW2Jsb2cgcG9zdF0NCjxodHRw czovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNC0wNC0yNC11bmRlci10aGUtaG9vZC1kZXZlbG9waW5n LW11bHRpY29yZS1wcm9wZXJ0eS1iYXNlZC10ZXN0cy1mb3Itb2NhbWwtNS8+DQoNCltEU2NoZWNr XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9kc2NoZWNrPg0KDQpbaGVyZV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL3NhdHVybi9ibG9iL21haW4vZG9j L21vdGl2YXRpb24ubWQ+DQoNCldoYXQgQ2FuIFlvdSBEbyB3aXRoIFNhdHVybj8NCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFNhdHVybiBwcm92aWRlcyBhIHZhcmlldHkgb2YgZGF0 YSBzdHJ1Y3R1cmVzLCBpbmNsdWRpbmcgcXVldWVzLA0KICBzdGFja3MsIGhhc2ggdGFibGVzLCBh bmQgbW9yZS4gQWxsIG9mIHRoZXNlIHN0cnVjdHVyZXMgYXJlDQogICoqbG9jay1mcmVlKiosICoq bGluZWFyaXphYmxlKiosIGFuZCBzcGVjaWZpY2FsbHkgZGVzaWduZWQgdG8gdGFrZQ0KICBmdWxs IGFkdmFudGFnZSBvZiBPQ2FtbCA14oCZcyBtdWx0aWNvcmUgY2FwYWJpbGl0aWVzLg0KDQoNCuKX iiBQb3J0YWJsZSBEYXRhIFN0cnVjdHVyZXMNCg0KICBMb2NrLWZyZWVkb20gaXMgYSBwcm9ncmVz cyBwcm9wZXJ0eSB0aGF0IGd1YXJhbnRlZXMgc3lzdGVtLXdpZGUNCiAgcHJvZ3Jlc3MuIFRoaXMg aXMgYSBwb3dlcmZ1bCBhbmQgZGVzaXJhYmxlIGZlYXR1cmUsIHRob3VnaCBpdCBjb21lcyBhdA0K ICB0aGUgY29zdCBvZiBzb21lIG92ZXJoZWFkLiBIb3dldmVyLCBpdCBvZmZlcnMgYSBzaWduaWZp Y2FudCBhZHZhbnRhZ2U6DQogIGxvY2stZnJlZSBkYXRhIHN0cnVjdHVyZXMgYXZvaWQgdGhlIG5l ZWQgZm9yIHNjaGVkdWxlci1zcGVjaWZpYw0KICBibG9ja2luZyBtZWNoYW5pc21zLCBtYWtpbmcg dGhlbSBjb21wYXRpYmxlIHdpdGggYW55IHNjaGVkdWxlciwgc3VjaA0KICBhcyBbRWlvXSBvciBb RG9tYWluc2xpYl0uDQoNCg0KICBbRWlvXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9laW8+DQoNCiAgW0RvbWFpbnNsaWJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVs dGljb3JlL2RvbWFpbnNsaWI+DQoNCg0K4peKIFJlc3RyaWN0aW9ucw0KDQogIFNhdHVybuKAmXMg ZGF0YSBzdHJ1Y3R1cmVzIGFyZSBub3QgY29tcG9zYWJsZSwgbWVhbmluZyB5b3UgY2Fubm90DQog IGNvbWJpbmUgdGhlbSAoZS5nLiwgdXNlIGBTYXR1cm4uUXVldWUnIGluc2lkZSBgU2F0dXJuLkh0 YmwnKSB3aGlsZQ0KICBwcmVzZXJ2aW5nIHByb3BlcnRpZXMgbGlrZSBsb2NrLWZyZWVkb20gYW5k IGxpbmVhcml6YWJpbGl0eS4NCg0KICBUaGV5IGFyZSBhbHNvIG5vdCBleHRlbnNpYmxlIG91dHNp ZGUgb2YgU2F0dXJuIHdpdGhvdXQgbG9zaW5nIHRoZXNlDQogIHByb3BlcnRpZXMuIEZvciBpbnN0 YW5jZSwgYFNhdHVybi5RdWV1ZScgZG9lcyBub3QgaW5jbHVkZSBhIGBsZW5ndGgnDQogIGZ1bmN0 aW9uIGJlY2F1c2UgaW1wbGVtZW50aW5nIG9uZSB3b3VsZCBpbnRyb2R1Y2Ugc2lnbmlmaWNhbnQg b3ZlcmhlYWQNCiAgKHNlZSBgU2F0dXJuLkJvdW5kZWRfcXVldWUnIGZvciBhbiBleGFtcGxlIG9m IHRoaXMNCiAgdHJhZGVvZmYpLiBBdHRlbXB0aW5nIHRvIGFkZCB0aGlzIGZ1bmN0aW9uYWxpdHks IHN1Y2ggYXMgYnkgd3JhcHBpbmcNCiAgdGhlIHF1ZXVlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgdHlwZSAnYSB0ID0ge3NpemU6IGludCBBdG9taWMudDsgcXVldWUgOiAnYSBTYXR1cm4u UXVldWUudH0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgd291bGQgcmVzdWx0IGluIGEgc3RydWN0 dXJlIHRoYXQgZWl0aGVyIGxvc2VzIGxvY2stZnJlZWRvbSBvciBpcyBubw0KICBsb25nZXIgbGlu ZWFyaXphYmxlLg0KDQogIElmIHlvdSBuZWVkIGNvbXBvc2FibGUgbG9jay1mcmVlIGRhdGEgc3Ry dWN0dXJlcywgY29uc2lkZXIgZXhwbG9yaW5nDQogIFtrY2FzX2RhdGFdLg0KDQoNCiAgW2tjYXNf ZGF0YV0NCiAgPGh0dHBzOi8vb2NhbWwtbXVsdGljb3JlLmdpdGh1Yi5pby9rY2FzL2RvYy9rY2Fz X2RhdGEvS2Nhc19kYXRhL2luZGV4Lmh0bWw+DQoNCg0KQ2FsbCB0byBBY3Rpb24NCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiAqVHJ5IEl0IE91dCo6 IEdpdmUgU2F0dXJuIGEgdHJ5IGluIHlvdXIgcHJvamVjdHMgYW5kIGxldCB1cyBrbm93IGhvdw0K ICAgICBpdCB3b3JrcyBmb3IgeW91LiBJZiB5b3UgZW5jb3VudGVyIGFueSBidWdzIG9yIGlzc3Vl cywgcGxlYXNlDQogICAgIHJlcG9ydCB0aGVtIG9uIG91ciBbR2l0SHViIHJlcG9zaXRvcnldLg0K ICDigKIgKlNoYXJlIFlvdXIgVXNlIENhc2UqOiBBcmUgeW91IGFscmVhZHkgdXNpbmcgU2F0dXJu PyBMZXQgdXMga25vdyBpbg0KICAgICB0aGUgY29tbWVudHMgd2hhdCB5b3UncmUgYnVpbGRpbmcg d2l0aCBpdCENCiAg4oCiICpDb250cmlidXRlKjogV2XigJlkIGxvdmUgdG8gaGF2ZSBtb3JlIGNv bnRyaWJ1dG9ycy4gV2hldGhlciBpdOKAmXMNCiAgICAgaW1wbGVtZW50aW5nIG5ldyBmZWF0dXJl cywgaW1wcm92aW5nIGRvY3VtZW50YXRpb24sIG9yIHN1Z2dlc3RpbmcNCiAgICAgZW5oYW5jZW1l bnRzLCB5b3VyIGNvbnRyaWJ1dGlvbnMgYXJlIHdlbGNvbWUhDQogIOKAoiAqSGVscCBTaGFwZSB0 aGUgRnV0dXJlKjogV2hhdCB3b3VsZCB5b3UgbGlrZSB0byBzZWUgaW4gU2F0dXJuPyBJcw0KICAg ICB0aGVyZSBhIG1pc3NpbmcgZGF0YSBzdHJ1Y3R1cmUgeW91IG5lZWQ/IFNoYXJlIHlvdXIgdGhv dWdodHMgdG8NCiAgICAgaGVscCB1cyBidWlsZCBhIHJvYWRtYXAgZm9yIGZ1dHVyZSBkZXZlbG9w bWVudC4NCg0KICAqVGhhbmsgeW91IGZvciB5b3VyIHN1cHBvcnQhKg0KDQoNCltHaXRIdWIgcmVw b3NpdG9yeV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvc2F0dXJuPg0KDQoN ClRhbGtzIGFuZCBSZXNvdXJjZXMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIElmIHlvdSB3YW50IHRvIGxlYXJuIG1vcmUgYWJv dXQgU2F0dXJuLCBJIGdhdmUgYSB0YWxrIGF0IHRoZSAyMDI0DQogIE9DYW1sIFdvcmtzaG9w4oCU Y2hlY2sgb3V0IHRoZSBzaG9ydCBbcGFwZXJdIGFuZCB0aGUgW3RhbGtdLg0KDQogIFRvIGRpdmUg ZGVlcGVyIGludG8gY29uY3VycmVudC1zYWZlIGRhdGEgc3RydWN0dXJlcywgSSBoaWdobHkNCiAg cmVjb21tZW5kIGhhdmluZyBhIGxvb2sgYXQgW1RoZSBBcnQgb2YgTXVsdGlwcm9jZXNzb3IgUHJv Z3JhbW1pbmddLA0KICB3aGljaCBleHBsb3JlcyB0aGUgZGlmZmVyZW5jZXMgaW4gZGVzaWduIGJl dHdlZW4gbG9jay1iYXNlZCBhbmQNCiAgbG9jay1mcmVlIGRhdGEgc3RydWN0dXJlcy4NCg0KDQpb cGFwZXJdDQo8aHR0cHM6Ly9pY2ZwMjQuc2lncGxhbi5vcmcvZGV0YWlscy9vY2FtbC0yMDI0LXBh cGVycy8xMi9TYXR1cm4tYS1saWJyYXJ5LW9mLXZlcmlmaWVkLWNvbmN1cnJlbnQtZGF0YS1zdHJ1 Y3R1cmVzLWZvci1PQ2FtbC01Pg0KDQpbdGFsa10gPGh0dHBzOi8veW91dHUuYmUvT3VRcWJsQ3hK Mlk/dD0yNDM5OD4NCg0KW1RoZSBBcnQgb2YgTXVsdGlwcm9jZXNzb3IgUHJvZ3JhbW1pbmddDQo8 aHR0cHM6Ly93d3cucmVzZWFyY2hnYXRlLm5ldC9wdWJsaWNhdGlvbi8yMTM4NzY2NTNfVGhlX0Fy dF9vZl9NdWx0aXByb2Nlc3Nvcl9Qcm9ncmFtbWluZz4NCg0KDQpDb21tZXJjaWFsIFN1cHBvcnQN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIElmIHlvdeKAmXJlIGludGVyZXN0ZWQgaW4gaW5jb3Jwb3JhdGluZyBTYXR1cm4gaW50byB5 b3VyIGNvbW1lcmNpYWwNCiAgYXBwbGljYXRpb25zLCBUYXJpZGVzIG9mZmVycyBwcm9mZXNzaW9u YWwgZGV2ZWxvcG1lbnQgYW5kIHN1cHBvcnQNCiAgc2VydmljZXMuIEZlZWwgZnJlZSB0byBjb250 YWN0IHVzIGZvciBtb3JlIGRldGFpbHMuDQoNCg0KRHVuZSBkZXYgbWVldGluZw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0 dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS1kZXYtbWVldGluZy8xNDk5NC8xOD4N Cg0KDQpFdGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIER1 bmUgZW50aHVzaWFzdHMhIDpzbWlsZToNCg0KICBXZSB3aWxsIGhvbGQgb3VyIHJlZ3VsYXIgRHVu ZSBkZXYgbWVldGluZyBvbiAqV2VkbmVzZGF5LCBEZWNlbWJlciwNCiAgMTF0aCBhdCA5OjAwKiBD RVQuIEFzIHVzdWFsLCB0aGUgc2Vzc2lvbiB3aWxsIGJlIG9uZSBob3VyIGxvbmcuDQoNCiAgV2hl dGhlciB5b3UgYXJlIGEgbWFpbnRhaW5lciwgYSByZWd1bGFyIGNvbnRyaWJ1dG9yLCBhIG5ldyBq b2luZXIgb3INCiAganVzdCBjdXJpb3VzLCB5b3UgYXJlIHdlbGNvbWUgdG8gam9pbjogdGhlc2Ug ZGlzY3Vzc2lvbnMgYXJlIG9wZW5lZCENCiAgVGhlIGdvYWwgb2YgdGhlc2UgbWVldGluZ3MgaXMg dG8gcHJvdmlkZSBhIHBsYWNlIHRvIGRpc2N1c3MgdGhlDQogIG9uZ29pbmcgd29yayB0b2dldGhl ciBhbmQgc3luY2hyb25pc2UgYmV0d2VlbiB0aGUgRHVuZSBkZXZlbG9wZXJzICENCiAgOmNhbWVs Og0KDQoNCjpjYWxlbmRhcjogQWdlbmRhDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgYWdlbmRhIGlzIGF2YWlsYWJsZSBvbiB0aGVb IG1lZXRpbmcgZGVkaWNhdGVkIHBhZ2VdLiBGZWVsIGZyZWUgdG8NCiAgYXNrIGlmIHlvdSB3YW50 IHRvIGFkZCBtb3JlIGl0ZW1zIGluIGl0Lg0KDQoNClsgbWVldGluZyBkZWRpY2F0ZWQgcGFnZV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtpL2Rldi1tZWV0aW5nLTIwMjQtMTIt MTE+DQoNCg0KOmNvbXB1dGVyOiBMaW5rcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIE1lZXRpbmcgbGluazpbIHpvb21dDQogIOKAoiBD YWxlbmRhciBldmVudDpbIGdvb2dsZSBjYWxlbmRhcl0NCiAg4oCiIFdpa2kgd2l0aCBpbmZvcm1h dGlvbiBhbmQgcHJldmlvdXMgbm90ZXM6WyBHaXRIdWIgV2lraV0NCg0KDQpbIHpvb21dDQo8aHR0 cHM6Ly91czA2d2ViLnpvb20udXMvai84NTA5Njg3Nzc3Nj9wd2Q9Y1dOaFUxZEhRMVpOU2padU9V WkNRMGgyYnk5VWR6MDk+DQoNClsgZ29vZ2xlIGNhbGVuZGFyXQ0KPGh0dHBzOi8vY2FsZW5kYXIu Z29vZ2xlLmNvbS9jYWxlbmRhci9lbWJlZD9zcmM9Y181Y2Q2OThkZjY3ODRlMzg1YjFjZGNkYzFk YmNhMThjMDYxZmFhOTY5NTlhMDQ3ODE1NjZkMzA0ZGM5ZWM3MzE5JTQwZ3JvdXAuY2FsZW5kYXIu Z29vZ2xlLmNvbT4NCg0KWyBHaXRIdWIgV2lraV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9k dW5lL3dpa2kjZGV2LW1lZXRpbmdzPg0KDQoNCkR1bmUgMy4xNw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t ZHVuZS0zLTE3LzE1NzcwLzE+DQoNCg0KRXRpZW5uZSBNYXJhaXMgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxl YXNlIG9mIER1bmUgYDMuMTcuMCchDQogIDp0YWRhOg0KDQogIEFtb25nIHRoZSBsaXN0IG9mIGNo YW5nZXMsIHRoaXMgbWlub3IgcmVsZWFzZSBlbmFibGVzIHRoZSBEdW5lIGNhY2hlDQogIGJ5IGRl ZmF1bHQgZm9yIGtub3duLXNhZmUgb3BlcmF0aW9ucywgYWRkcyBvdXQtb2YtdGhlLWJveCBzdXBw b3J0IGZvcg0KICBgV2FzbV9vZl9vY2FtbCcsIGFkZHMgc3VwcG9ydCBmb3IgdGhlfi1IfiBjb21w aWxlciBmbGFnIGludHJvZHVjZWQgaW4NCiAgT0NhbWwgNS4yLCBhbGxvd3Mgc3BlY2lmeWluZyBj b2RlIGhvc3Rpbmcgc2VydmljZXMgbGlrZSBDb2RlYmVyZyBvcg0KICBHaXRMYWIgb3JnYW5pc2F0 aW9ucywgYW5kIGdpdmVzIHRoZSBwb3NzaWJpbGl0eSB0byBydW4gaW5kaXZpZHVhbA0KICB0ZXN0 cyB3aXRoIGBkdW5lIHJ1bnRlc3QnLg0KDQogIElmIHlvdSBlbmNvdW50ZXIgYSBwcm9ibGVtIHdp dGggdGhpcyByZWxlYXNlLCB5b3UgY2FuIHJlcG9ydCBpdCBvbiB0aGUNCiAgW29jYW1sL2R1bmVd IHJlcG9zaXRvcnkuDQoNCg0KW29jYW1sL2R1bmVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9pc3N1ZXM+DQoNCkNoYW5nZWxvZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CuKXiiBBZGRlZA0KDQogIOKAoiBNYWtlIE1lcmxpbi9PQ2FtbC1MU1AgYXdhcmUgb2YgImhpZGRl biIgZGVwZW5kZW5jaWVzIHVzZWQgYnkNCiAgICBgKGltcGxpY2l0X3RyYW5zaXRpdmVfZGVwcyBm YWxzZSknIHZpYSB0aGUgYC1IJyBjb21waWxlcg0KICAgIGZsYWcuICgjMTA1MzUsIEB2b29kb29z KQ0KICDigKIgQWRkIHN1cHBvcnQgZm9yIHRoZSAtSCBmbGFnIChpbnRyb2R1Y2VkIGluIE9DYW1s IGNvbXBpbGVyIDUuMikgaW4NCiAgICBkdW5lIChyZXF1aXJlcyBsYW5nIHZlcnNpb25zIDMuMTcp LiBUaGlzIGFkYXB0YXRpb24gZ2l2ZXMgdGhlDQogICAgY29ycmVjdCBzZW1hbnRpY3MgZm9yIGAo aW1wbGljaXRfdHJhbnNpdGl2ZV9kZXBzIGZhbHNlKScuICAoIzEwNjQ0LA0KICAgIGZpeGVzICM5 MzMzLCBvY3NpZ2VuL3R5eG1sIzI3NCwgIzI3MzMsICM0OTYzLCBATUEwMTAwKQ0KICDigKIgQWRk IHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgR2l0bGFiIG9yZ2FuaXphdGlvbiByZXBvc2l0b3JpZXMg aW4NCiAgICBgc291cmNlJyBzdGFuemFzICgjMTA3NjYsIGZpeGVzICM2NzIzLCBASC1BTlNFTikN CiAg4oCiIE5ldyBvcHRpb24gdG8gY29udHJvbCBqc29vIHNvdXJjZW1hcCBnZW5lcmF0aW9uIGlu IGVudiBhbmQNCiAgICBleGVjdXRhYmxlIHN0YW56YSAoIzEwNzc3LCBmaXhlcyAjMTA2NzMsIEBo aHVnbykNCiAg4oCiIE9uZSBjYW4gbm93IGNvbnRyb2wganNvbyBjb21waWxhdGlvbl9tb2RlIGlu c2lkZSBhbiBleGVjdXRhYmxlDQogICAgc3RhbnphICgjMTA3NzcsIGZpeGVzICMxMDY3MywgQGho dWdvKQ0KICDigKIgQWRkIHN1cHBvcnQgZm9yIHNwZWNpZnlpbmcgZGVmYXVsdCB2YWx1ZXMgb2Yg dGhlIGBhdXRob3JzJywNCiAgICBgbWFpbnRhaW5lcnMnLCBhbmQgYGxpY2Vuc2UnIHN0YW56YXMg b2YgdGhlIGBkdW5lLXByb2plY3QnIGZpbGUgdmlhDQogICAgdGhlIGR1bmUgY29uZmlnIGZpbGUu IERlZmF1bHQgdmFsdWVzIGFyZSBzZXQgdXNpbmcgdGhlDQogICAgYChwcm9qZWN0X2RlZmF1bHRz KScgc3RhbnphICgjMTA4MzUsIEBILUFOU0VOKQ0KICDigKIgQWRkIG5hbWVzIHRvIHNvdXJjZSB0 cmVlIGV2ZW50cyBpbiBwZXJmb3JtYW5jZSB0cmFjZXMgKCMxMDg4NCwNCiAgICBAamNoYXZhcnJp KQ0KICDigKIgQWRkIGBjb2RlYmVyZycgYXMgYW4gb3B0aW9uIGZvciBkZWZpbmluZyBwcm9qZWN0 IHNvdXJjZXMgaW4NCiAgICBkdW5lLXByb2plY3QgZmlsZXMuIEZvciBleGFtcGxlLCBgKHNvdXJj ZSAoY29kZWJlcmcNCiAgICB1c2VyL3JlcG8pKScuICgjMTA5MDQsIEBubG9yZGVsbCkNCiAg4oCi IGBkdW5lIHJ1bnRlc3QnIGNhbiBub3cgcnVuIGluZGl2aWR1YWwgdGVzdHMgd2l0aCBgZHVuZSBy dW50ZXN0DQogICAgbXl0ZXN0LnQnICgjMTEwNDEsIEBBbGl6dGVyKS4NCiAg4oCiIFdhc21fb2Zf b2NhbWwgc3VwcG9ydCAoIzExMDkzLCBAdm91aWxsb24pDQogIOKAoiBBZGQgYSBgY29xZGVwX2Zs YWdzJyBmaWVsZCB0byB0aGUgYGNvcScgZmllbGQgb2YgdGhlIGBlbnYnIHN0YW56YSwNCiAgICBh bmQgdG8gdGhlIGBjb3EudGhlb3J5JyBzdGFuemEsIGFsbG93aW5nIHRvIGNvbmZpZ3VyZSBgY29x ZGVwJw0KICAgIGZsYWdzLiAoIzExMDk0LCBAcmxlcGlncmUpDQoNCg0K4peKIEZpeGVkDQoNCiAg 4oCiIFNob3cgdGhlIGNvbnRleHQgbmFtZSBmb3IgZXJyb3JzIGhhcHBlbmluZyBpbiBub24tZGVm YXVsdCBjb250ZXh0cy4NCiAgICAoIzEwNDE0LCBmaXhlcyAjMTAzNzgsIEBqY2hhdmFycmkpDQog IOKAoiBDb3JyZWN0bHkgZGVjbGFyZSBkZXBlbmRlbmNpZXMgb2YgaW5kZXhlcyBzbyB0aGF0IHRo ZXkgYXJlIHJlYnVpbHQNCiAgICB3aGVuIG5lZWRlZC4gKCMxMDYyMywgQHZvb2Rvb3MpDQogIOKA oiBEb24ndCBkZXBlbmQgb24gY29xLXN0ZGxpYiBiZWluZyBpbnN0YWxsZWQgd2hlbiBleHBhbmRp bmcgdmFyaWFibGVzDQogICAgb2YgdGhlIGBjb3EudmVyc2lvbicgZmFtaWx5ICgjMTA2MzEsIGZp eGVzICMxMDYyOSwgQGdhcmVzKQ0KICDigKIgRXJyb3Igb3V0IGlmIG5vIGZpbGVzIGFyZSBmb3Vu ZCB3aGVuIHVzaW5nIGBjb3B5X2ZpbGVzJy4gKCMxMDY0OSwNCiAgICBAamNoYXZhcnJpKQ0KICDi gKIgUmVfZXhwb3J0IGR1bmUtc2VjdGlvbiBwcml2YXRlIGxpYnJhcnkgaW4gdGhlIGR1bmUtc2l0 ZSBsaWJyYXJ5DQogICAgc3RhbnphLCBpbiBvcmRlciB0byBhdm9pZCBmYWlsdXJlIHdoZW4gZ2Vu ZXJhdGluZyBhbmQgYnVpbGRpbmcgc2l0ZXMNCiAgICBtb2R1bGVzIHdpdGggaW1wbGljaXRfdHJh bnNpdGl2ZV9kZXBzID0gZmFsc2UuICgjMTA2NTAsIGZpeGVzICM5NjYxLA0KICAgIEBNQTAxMDAp DQogIOKAoiBFeHBlY3QgdGVzdCBmaXhlczogc3VwcG9ydCBtdWx0aXBsZSBtb2RlcyBhbmQgZml4 IGRlcGVuZGVuY2llcyB3aGVuDQogICAgdGhlcmUgaXMgYSBjdXN0b20gcnVubmVyICgjMTA2NzEs IEB2b3VpbGxvbikNCiAg4oCiIEluIGEgYChsaWJyYXJ5KScgc3RhbnphIHdpdGggYChleHRyYV9v YmplY3RzKScgYW5kDQogICAgYChmb3JlaWduX3N0dWJzKScsIGF2b2lkIGRvdWJsZSBsaW5raW5n IHRoZSBleHRyYSBvYmplY3QgZmlsZXMgaW4NCiAgICB0aGUgZmluYWwgZXhlY3V0YWJsZS4gICgj MTA3ODMsIGZpeGVzICMxMDc4NSwgQG5vamIpDQogIOKAoiBNYXAgYChyZV9leHBvcnQpJyBsaWJy YXJ5IGRlcGVuZGVuY2llcyB0byB0aGUgYGV4cG9ydHMnIGZpZWxkIGluDQogICAgYE1FVEEnIGZp bGVzLCBhbmQgdmljZS12ZXJzYS4gVGhpcyBmaWVsZCB3YXMgcHJvcG9zZWQgaW4gdG8NCiAgICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Byb3Bvc2FsLWEtbmV3LWV4cG9ydHMtZmllbGQt aW4tZmluZGxpYi1tZXRhLWZpbGVzLzEzOTQ3Pi4NCiAgICBUaGUgZmllbGQgaXMgaW5jbHVkZWQg aW4gRHVuZS1nZW5lcmF0ZWQgYE1FVEEnIGZpbGVzIG9ubHkgd2hlbiB0aGUNCiAgICBEdW5lIGxh bmcgdmVyc2lvbiBpcyA+PSAzLjE3LiAgKCMxMDgzMSwgZml4ZXMgIzEwODMwLCBAbm9qYikNCiAg 4oCiIEZpeCBzdGFnZWQgcHBzIHByZXByb2Nlc3NvcnMgb24gV2luZG93cyAod2hpY2ggd2VyZSBu b3Qgd29ya2luZyBhdA0KICAgIGFsbCBwcmV2aW91c2x5KSAoIzEwODY5LCBmaXhlcyAjMTA4Njcs IEBub2piKQ0KICDigKIgRml4IGBkdW5lIGRlc2NyaWJlJyB3aGVuIGFuIGV4ZWN1dGFibGUgaXMg ZGlzYWJsZWQgd2l0aA0KICAgIGBlbmFibGVkX2lmJy4gICgjMTA4ODEsIGZpeGVzICMxMDc3OSwg QG1veW9kaWFsbG8pDQogIOKAoiBGaXggYW4gaXNzdWUgd2hlcmUgQyBzdHVicyB3b3VsZCBiZSBy ZWJ1aWx0IHdoZW5ldmVyIHRoZSBzdGRlcnIgb2YNCiAgICBEdW5lIHdhcyByZWRpcmVjdGVkLiAo IzEwODgzLCBmaXhlcyAjMTA4ODIsIEBub2piKQ0KICDigKIgRml4IHRoZSBVUkwgb3BlbmVkIGJ5 IHRoZSBjb21tYW5kIGBkdW5lIG9jYW1sIGRvYycuICgjMTA4OTcsDQogICAgQGdyaWRidWdzKQ0K ICDigKIgRml4IHRoZSBmaWxlIHJlZmVycmVkIHRvIGluIHRoZSBlcnJvci93YXJuaW5nIG1lc3Nh Z2UgZGlzcGxheWVkIGR1ZQ0KICAgIHRvIHRoZSBkdW5lIGNvbmZpZ3VyYXRpb24gdmVyc2lvbiBu b3Qgc3VwcG9ydGluZyBhIHBhcnRpY3VsYXINCiAgICBjb25maWd1cmF0aW9uIHN0YW56YSBpbiB1 c2UuICgjMTA5MjMsIEBILUFOU0VOKQ0KICDigKIgRml4IGBlbmFibGVkX2lmJyB3aGVuIGl0IHVz ZXMgYGVudicgdmFyaWFibGUuICgjMTA5MzYsIGZpeGVzICMxMDkwNSwNCiAgICBAbW95b2RpYWxs bykNCiAg4oCiIEZpeCBleGVjIC13IGZvciByZWxhdGl2ZSBwYXRocyB3aXRoIOKAk3Jvb3QgYXJn dW1lbnQgKCMxMDk4MiwNCiAgICBAZ3JpZGJ1Z3MpDQogIOKAoiBEbyBub3QgaWdub3JlIHRoZSBg KGxvY2tzIC4uKScgZmllbGQgaW4gdGhlIGB0ZXN0JyBhbmQgYHRlc3RzJw0KICAgIHN0YW56YSAo IzExMDgxLCBAcmdyaW5iZXJnKQ0KICDigKIgVG9sZXJhdGUgZmlsZXMgd2l0aG91dCBleHRlbnNp b24gd2hlbiBnZW5lcmF0aW5nIG1lcmxpbiBydWxlcy4NCiAgICAoIzExMTI4LCBAYW5tb250ZWly bykNCg0KDQril4ogQ2hhbmdlZA0KDQogIOKAoiBSZW1vdmUgYWxsIHJlbW5hbnRzIG9mIHRoZSBl eHBlcmltZW50YWwNCiAgICBgcGF0Y2gtYmFjay1zb3VyY2UtdHJlZScuICgjMTA3NzEsIEByZ3Jp bmJlcmcpDQogIOKAoiBDaGFuZ2UgdGhlIHByZXNldCB2YWx1ZSBmb3IgYXV0aG9yIGFuZCBtYWlu dGFpbmVyIGZpZWxkcyBpbiB0aGUNCiAgICBgZHVuZS1wcm9qZWN0JyBmaWxlIHRvIGVuY291cmFn ZSBpbmNsdWRpbmcgZW1haWxzLiAoIzEwODQ4LA0KICAgIEBwdW5jaGFnYW4pDQogIOKAoiBUd2Vh ayB0aGUgcHJlc2V0IHZhbHVlIGZvciB0YWdzIGluIHRoZSBgZHVuZS1wcm9qZWN0JyBmaWxlIHRv IGhpbnQNCiAgICBhdCB0b3BpY3Mgbm90IGhhdmluZyBhIHNwZWNpYWwgbWVhbmluZy4gKCMxMDg0 OSwgQHB1bmNoYWdhbikNCiAg4oCiIENoYW5nZSBzb21lIGNvbG9ycyB0byBpbXByb3ZlIHJlYWRh YmlsaXR5IGluIGxpZ2h0LW1vZGUgdGVybWluYWxzDQogICAgKCMxMDg5MCwgQGdyaWRidWdzKQ0K ICDigKIgRm9yd2FyZCB0aGUgbGlua2FsbCBmbGFnIHRvIGpzb28gaW4gd2hvbGUgcHJvZ3JhbSBj b21waWxhdGlvbiBhcw0KICAgIHdlbGwgKCMxMDkzNSwgQGhodWdvKQ0KICDigKIgQ29uZmlndXJh dG9yIHVzZXMgYHBrZ2NvbmYnIGFzIHBrZy1jb25maWcgaW1wbGVtZW50YXRpb24gd2hlbg0KICAg IGF2YWlsYWJsZSBhbmQgZm9yd2FyZHMgaXQgdGhlIGB0YXJnZXQnIG9mIGBvY2FtbGMgLWNvbmZp ZycuICgjMTA5MzcsDQogICAgQHBpcmJvKQ0KICDigKIgRW5hYmxlIER1bmUgY2FjaGUgYnkgZGVm YXVsdC4gQWRkIGEgbmV3IER1bmUgY2FjaGUgc2V0dGluZw0KICAgIGBlbmFibGVkLWV4Y2VwdC11 c2VyLXJ1bGVzJywgd2hpY2ggZW5hYmxlcyB0aGUgRHVuZSBjYWNoZSwgYnV0DQogICAgZXhjbHVk ZXMgdXNlci13cml0dGVuIHJ1bGVzIGZyb20gaXQuIFRoaXMgaXMgYSBjb25zZXJ2YXRpdmUgY2hv aWNlDQogICAgdGhhdCBjYW4gYXZvaWQgYnJlYWtpbmcgcnVsZXMgd2hvc2UgZGVwZW5kZW5jaWVz IGFyZSBub3QgY29ycmVjdGx5DQogICAgc3BlY2lmaWVkLiBUaGlzIGlzIHRoZSBjdXJyZW50IGRl ZmF1bHQuICgjMTA5NDQsICMxMDcxMCwgQG5vamIsDQogICAgQEVsZWN0cmVBQVMpDQogIOKAoiBE byBub3QgYWRkIGBkdW5lJyBkZXBlbmRlbmN5IGluIGBkdW5lLXByb2plY3QnIHdoZW4gY3JlYXRp bmcNCiAgICBwcm9qZWN0cyB3aXRoIGBkdW5lIGluaXQgcHJvaicuIFRoZSBEdW5lIGRlcGVuZGVu Y3kgaXMgaW1wbGljaXRlbHkNCiAgICBhZGRlZCB3aGVuIGdlbmVyYXRpbmcgb3BhbSBmaWxlcyAo IzExMTI5LCBATGVvbmlkYXMtZnJvbS1YSVYpDQoNCg0KU3BlYyBhbmQgaW50ZXJmYWNlIHRvIGRl Y2xhcmUgZGVwZW5kZW5jaWVzIGluIGFuIE9DYW1sIHNjcmlwdA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAg QXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9zcGVjLWFuZC1pbnRlcmZh Y2UtdG8tZGVjbGFyZS1kZXBlbmRlbmNpZXMtaW4tYW4tb2NhbWwtc2NyaXB0LzE1NzcyLzE+DQoN Cg0KamJlY2tmb3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhpcyBpcyB0aGUgZm91cnRoIGFydGljbGUg aW4gdGhlIE1sRnJvbnQgc2VyaWVzLiBJZiB5b3UgYXJlDQogIGludGVyZXN0ZWQgaW4gc2NyaXB0 aW5nIGZyYW1ld29ya3MgdGhhdCBjYW4gZG93bmxvYWQgc291cmNlIGNvZGUgYW5kDQogIGJ5dGVj b2RlLCBhbmQgaW50ZXItb3BlcmF0ZSB3aGlsZSBkb2luZyBzbywgcGxlYXNlIHJlYWQ6DQoNCiAg W2h0dHBzOi8vZGlza3V2LmNvbS9tbGZyb250L292ZXJ2aWV3LTQvXQ0KDQoNCltodHRwczovL2Rp c2t1di5jb20vbWxmcm9udC9vdmVydmlldy00L10NCjxodHRwczovL2Rpc2t1di5jb20vbWxmcm9u dC9vdmVydmlldy00Lz4NCg0KVExEUg0K4pWM4pWM4pWM4pWMDQoNCiAgLyhDcml0aWNhbCwgdmVy YmF0aW0gc25pcHBldHMgZnJvbSBhcnRpY2xlKS8NCg0KICBJIGhhdmUgYW4gb2xkIG9wYW0gcGFj a2FnZSBbRGtTREtGRklPQ2FtbF9TdGRdIHRoYXQgaXMgYSBsb3ctbGV2ZWwNCiAgYnJpZGdlIGJl dHdlZW4gT0NhbWwgYW5kIG90aGVyIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gSXQgY2FuIGJlDQog IGV4dHJhb3JkaW5hcmlseSBkaWZmaWN1bHQgdG8gYnVpbGQsIHNvIEkgbWFkZSBpdCBhIG1peCBv ZiBwdXJlIE9DYW1sDQogIHNvdXJjZSBjb2RlIGFuZCBwcmVidWlsdCBsaWJyYXJ5IGRvd25sb2Fk cy4gVG9kYXkgSSdsbCBkZXNjcmliZSBob3cNCiAgZW1iZWRkZWQgT0NhbWwgZGVwZW5kZW5jaWVz IGxpa2UgdGhlIGZvbGxvd2luZyAvc2ltcGxpZmllcyB0aGUgYnVpbGQNCiAgcHJvY2Vzcy86DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBtb2R1bGUgXyA9IERrU0RLRkZJX09DYW1sDQogIOKU giAoKiogVGhlIGJyaWRnZSBiZXR3ZWVuIE9DYW1sIGFuZCBvdGhlciBwcm9ncmFtbWluZyBsYW5n dWFnZXMuDQogIOKUgiANCiAg4pSCICAgICB7WyBgdjEgWw0KICDilIIgICAgICAgICAgIGBzZWMg WyBgc2NoZW1lICJka2NvZGVyIiBdOw0KICDilIIgICAgICAgICAgIGBibGliIFsiaHR0cHM6Ly9n aXRsYWIuY29tL2FwaS92NC9wcm9qZWN0cy82MjcwMzE5NC9wYWNrYWdlcy9nZW5lcmljL0BES01M X1RBUkdFVF9BQklALzIuMS40L0BES01MX1RBUkdFVF9BQklALTQuMTQuMi1Ea1NES0ZGSV9PQ2Ft bC0yLjEuNC1ub25lLmJsaWIuemlwIl07DQogIOKUgiAgICAgICAgICAgYGNsaWIgWyJodHRwczov L2dpdGxhYi5jb20vYXBpL3Y0L3Byb2plY3RzLzYyNzAzMTk0L3BhY2thZ2VzL2dlbmVyaWMvQERL TUxfVEFSR0VUX0FCSUAvMi4xLjQvQERLTUxfVEFSR0VUX0FCSUAtNC4xNC4yLURrU0RLRkZJX09D YW1sLTIuMS40LW5vbmUuY2xpYi56aXAiXQ0KICDilIIgICAgICAgICBdIF19ICopDQogIOKUgiAN CiAg4pSCICgqIEFuZCB1c2Ugd2hhdCB5b3UgaW1wb3J0ZWQgLi4uICopDQogIOKUgiBsZXQgKCkg PQ0KICDilIIgICAgaWdub3JlIChEa1NES0ZGSV9PQ2FtbC5Db20uY3JlYXRlX2MgKCkpDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIOKAlA0KDQogIE9uZSBzZXQgb2YgZGVzaWducyBJIGNyZWF0ZWQg YXJlIHRoZSBgTWxGcm9udF9BcmNoaXZlJyBwYWNrYWdlDQogIGZvcm1hdHM6DQoNCiAgMS4gYCou YmxpYi56aXAnIC0gVGhpcyBpcyB0aGUgYnl0ZWNvZGUgYXJjaGl2ZS4gSXQgaXMgYSB6aXAgZmls ZQ0KICAgICBjb250YWluaW5nIGAuY21hJywgYC5jbWknIGFuZCBzb21lIG90aGVyIGNyaXRpY2Fs IG1ldGFkYXRhLg0KICAyLiBgKi5jbGliLnppcCcgLSBUaGlzIGlzIHRoZSBDIGxpYnJhcnkgYXJj aGl2ZS4gSXQgaXMgYSB6aXAgZmlsZQ0KICAgICBjb250YWluaW5nIGAuc28nIG9yIGAuZHlsaWIn IG9yIGAuZGxsJyBzaGFyZWQgbGlicmFyaWVzLCBhbmQgYWxzbw0KICAgICB0aGUgY29ycmVzcG9u ZGluZyBzdGF0aWMgbGlicmFyaWVzLg0KICBUaGUgaW1wb3J0YW50IGNvbmNlcHQgaXMgdGhhdCBg Ki5ibGliLnppcCcgYW5kIGAqLmNsaWIuemlwJyBmb3IgT0NhbWwNCiAgYXJlIGFuYWxvZ291cyB0 byBgKi5qYXInIGZpbGVzIGZvciBKYXZhLiBUaGUgZGVzaWduIGlzIGF2YWlsYWJsZSBhdDoNCg0K ICDigKIgRm9ybWF0IG9mIHBhY2thZ2VzOg0KICAgIDxodHRwczovL2dpdGxhYi5jb20vZGlza3V2 L3JlZ2lzdHJpZXMvcHVibGljLXBhY2thZ2VzI2dlbmVyaWMtcmVnaXN0cnktbGF5b3V0Pg0KICDi gKIgQmluYXJpZXMgdG8gdW5wYWNrIHRoZSBwYWNrYWdlczoNCiAgICA8aHR0cHM6Ly9naXRsYWIu Y29tL2RrbWwvYnVpbGQtdG9vbHMvTWxGcm9udF9BcmNoaXZlLy0vcmVsZWFzZXM+DQoNCiAg4oCU DQoNCiAgVGhlIHJlbW90ZSBzcGVjaWZpY2F0aW9uIGRlc2lnbiBpcyBpbiB0aGUgYE1sRnJvbnRf Q29uZmlnJyBsaWJyYXJ5Og0KDQogIOKAoiBjb2RlOiA8aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwv YnVpbGQtdG9vbHMvTWxGcm9udCNtbGZyb250Pg0KICDigKIgb2RvYzoNCiAgICA8aHR0cHM6Ly9k a21sLmdpdGxhYi5pby9idWlsZC10b29scy9NbEZyb250L01sRnJvbnRfQ29uZmlnL01sRnJvbnRf Q29uZmlnL1JlbW90ZVNwZWMvaW5kZXguaHRtbD4NCg0KDQpbRGtTREtGRklPQ2FtbF9TdGRdIDxo dHRwczovL29jYW1sLm9yZy9wL0RrU0RLRkZJT0NhbWxfU3RkL2xhdGVzdD4NCg0KDQpPdGhlciBP Q2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJl IGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3Jn DQogIGJsb2ddLg0KDQogIOKAoiBbUmVsZWFzZSBvZiBGcmFtYS1DIDMwLjAgKFppbmMpXQ0KICDi gKIgW0lybWluIG9uIE1pcmFnZU9TOiBVbmRlci10aGUtSG9vZCBXaXRoIE5vdGFmc10NCg0KDQpb dGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltSZWxlYXNl IG9mIEZyYW1hLUMgMzAuMCAoWmluYyldDQo8aHR0cHM6Ly9mcmFtYS1jLmNvbS9mYy12ZXJzaW9u cy96aW5jLmh0bWw+DQoNCltJcm1pbiBvbiBNaXJhZ2VPUzogVW5kZXItdGhlLUhvb2QgV2l0aCBO b3RhZnNdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjQtMTItMDQtaXJtaW4tb24tbWly YWdlb3MtdW5kZXItdGhlLWhvb2Qtd2l0aC1ub3RhZnM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBT Y2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9s eXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBh LmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 05 to 12, 20= 24.

    Picos =E2=80=94 Interoperable effects based concurrency

    polytypic announced

    I'm happy to announce that Picos version 0.6.0 has been released!

    Picos is a systems programming interface between effects based schedulers a= nd concurrent abstractions.

    A lot of work has been done on Picos since previous announcements.

    You might start on the new minimalist landing page for Picos, which, among other things, allo= ws you to access the documentation of all the released Picos versions.

    Also, in case you missed it, a recording of the talk

    Picos =E2=80=94 Interoperable effects= based concurrency

    can be found here.

    We also held a workshop on concurrency and parallelism at Fun OCaml. You might enjoy trying out the exercise we develope= d for the workshop.

    As, for reasons of dependencies, Picos now comes in no less than 8 packages and multipl= e libraries, here is a summary of the packages and the libraries inside eac= h package:

    • picos =E2=80=94 Picos =E2=80=94 Interoperable effects = based concurrency
      • picos =E2=80=94 A systems programming interface = between effects based schedulers and concurrent abstractions
      • picos.domain =E2=80=94 Minimalistic domai= n API available both on OCaml 5 and on OCaml 4
      • picos.thread =E2=80=94 Minimalistic threa= d API available with or without threads.posix
    • picos_mux =E2=80=94 Sample schedulers for Picos
      • picos_mux.fifo =E2=80=94 Basic sing= le-threaded effects based Picos compatible scheduler for OCaml 5
      • picos_mux.multififo =E2=80=94 = Basic multi-threaded effects based Picos compatible scheduler for OCaml 5
      • picos_mux.random =E2=80=94 Random= ized multi-threaded effects based Picos compatible scheduler for OCaml 5
      • picos_mux.thread =E2=80=94 Basic = Thread based Picos compatible scheduler for OCaml 4
    • picos_std =E2=80=94 Sample libraries for Picos
    • picos_io =E2=80=94 Asynchronous IO system for Picos
      • picos_io =E2=80=94 Basic IO facilities bas= ed on OCaml standard libraries for Picos
      • picos_io.select =E2=80=94 Basic Uni= x.select based IO event loop for Picos
      • picos_io.fd =E2=80=94 Externally refere= nce counted file descriptors
    • picos_io_cohttp =E2=80=94 Cohttp running on = Picos IO
      • picos_io_cohttp =E2=80=94 Mi= nimalistic Cohttp implementation using Picos_io for Picos
    • picos_lwt =E2=80=94 Lwt interface for Picos
      • picos_lwt =E2=80=94 Direct style Picos c= ompatible interface to Lwt for OCaml 5
      • picos_lwt.unix =E2=80=94 Direct sty= le Picos compatible interface to Lwt with Lwt_unix for OCaml 5
    • picos_aux =E2=80=94 Auxiliary libraries for Picos
      • picos_aux.htbl =E2=80=94 Lock-free = hash table
      • picos_aux.mpmcq =E2=80=94 Lock-fre= e multi-producer, multi-consumer queue
      • picos_aux.mpscq =E2=80=94 Lock-fre= e multi-producer, single-consumer queue
      • picos_aux.rc =E2=80=94 External refer= ence counting tables for disposable resources
    • picos_meta =E2=80=94 Integration tests for Picos = packages

    In addition to the above, Mo= onpool now uses Picos underneath.

    And, I almost forgot, there is a ready to be merged PR for Kcas to change it to use Picos= . You should be able to try it with an opam pin-depends.

    findlib-1.9.7

    Gerd Stolpmann announced

    findlib-1.9.7 is out. This is mostly a bugfix release. There is now also some support for relocability (driven by environment variables), contributed by Marek Kubica.

    For manual, download, manuals, etc. see here:

    http://proje= cts.camlcity.org/projects/findlib.html

    An updated OPAM package will follow soon.

    First release candidate for OCaml 5.2.1

    octachron announced

    The release of OCaml version 5.2.1 is imminent.

    OCaml 5.2.1 is a collection of safe but import runtime time bug fixes backp= orted from the 5.3 branch of OCaml. The full list of bug fixes is available= below.

    In order to ensure that the future release works as expected, we are planni= ng to test a release candidate during the upcoming week.

    If you find any bugs, please report them here on GitHub.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1:

    opam update
    opam switch create 5.2.1~rc1
    

    The source code for the release candidate is available on

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.2.1~rc1+options <=
      ;option_list>
      

      where `<option_list>` is a space-separated list of `ocaml-option-*` p= ackages. For instance, for a `flambda` and `no-flat-float-array` switch:

      opam switch create 5.2.1~rc1+flambda+nffa ocaml-variants.5.2.1~rc1+options =
      ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with `opam search ocaml-option`.

      Changes Since OCaml 5.2.0

    Runtime System:

    • #13207: Be = sure to reload the register caching the exception handler in caml_c_call and caml_c_call_stack_args, as its value may have been changed if the OCaml stack is expanded during a callback. (Miod Vallat, report by Vesa Karvonen, review by Gabriel Scherer and Xavier Leroy)
    • #13252: Rew= ork register assignment in the interpreter code on m68k on Linux, due to the %a5 register being used by Glibc. (Miod Vallat, report by St=C3=A9phane Glondu, review by Gabriel Scherer and Xavier Leroy)
    • #13268: Fix= a call to test in configure.ac that was causing errors when LDFLAGS contains several words. (St=C3=A9phane Glondu, review by Miod Vallat)
    • #13234, #13267: Open runti= me events file in read-write mode on armel (armv5) systems due to atomic operations limitations on that platform. (St=C3=A9phane Glondu, review by Miod Vallat and Vincent Laviron)
    • #13188: fix= races in the FFI code coming from the use of Int_val(…) on rooted values inside blocking questions / without the runtime lock. (Calling Int_val(…) on non-rooted immediates is fine, but any access to rooted values must be done outside blocking sections / with the runtime lock.) (Etienne Millon, review by Gabriel Scherer, Jan Midtgaard, Olivier Nicole)<= /li>
    • #13318: Fix= regression in GC alarms, and fix them for flambda. (Guillaume Munch-Maccagnoni, report by Benjamin Monate, review by Vincent Laviron and Gabriel Scherer)
    • #13140: POW= ER back-end: fix issue with call to `caml_call_realloc_stack` from a DLL (Xavier Leroy, review by Miod Vallat)
    • #13370: Fix= a low-probability crash when calling Gc.counters. (Demi Marie Obenour, review by Gabriel Scherer)
    • #13402, #13512, #13549, #13553: Revise bytecode implemen= tation of callbacks so that it no longer produces dangling registered bytecode fragments. (Xavier Leroy, report by Jan Midtgaard, analysis by Stephen Dolan, review by Miod Vallat)
    • #13502: Fix= misindexing related to `Gc.finalise_last` that could prevent finalisers from being run. (Nick Roberts, review by Mark Shinwell)
    • #13520: Fix= compilation of native-code version of systhreads. Bytecode fields were being included in the thread descriptors. (David Allsopp, review by S=C3=A9bastien Hinderer and Miod Vallat)

    mirage-swapfs

    Reynir Bj=C3=B6rnsson announced

    I am pleased to announce the first release of mirage-swapfs (swapfs on opam). It is an exp= erimental library to use a mirage block device for ephemeral, append-only, = anonymous "files". It was developed for use cases such as in opam-mirror where opam package= source archives are downloaded. The files are first downloaded to "swap" a= nd if the download succeeds and the checksum is as expected the data is the= n copied over to the tar filesystem.

    Internally it uses a weak pointer array (Weak.t) to map "block= " offsets to handles. The idea is the garbage collector can help us free up= "blocks" if the user forgets to explicitly free the handle. A "block" is (= configurable, see blocking_factor) multiple of sectors in orde= r to reduce bookkeeping overhead. With a sector size of 512 bytes the defau= lt is 1 MiB per block.

    See also the documentation https://robur-coop.github.io/mirage-swapfs/doc= /swapfs/index.html

    I would be interested to hear about other ideas or approaches.

    Dune dev meeting

    Etienne Marais announced

    We will hold our regular Dune dev meeting tomorrow, on Wednesday, November,= 13th at 9:00 CET. :warning: Note that the session has been moved one hour earlier. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronise between the Dune developers !:smile:

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 03 to 10, 20= 24.

    Release of cppo 1.8.0

    Fran=C3=A7ois Pottier announced

    I am pleased to announce a new release of cppo (1.8.0) with on= e new feature and one bug fix:

    • A scope, delimited by #scope ... #endscope, limits the eff= ect of #define, #def ... #enddef, and #unde= f.
    • The command cppo -version, which used to print a blank lin= e, has been fixed.

    For more details, please see the documentation.

    New releases of Merlin and OCaml-LSP

    vds announced

    I am pleased to announce new releases of Merlin (5.3-502 and <= code>4.18-414) and OCaml-LSP (1.20.1 and 1.20.1-= 4.14).=20

    The Merlin releases bundle a handful of fixes while the LSP releases focus = on adding more custom queries. These custom queries will enable tailored LS= P clients to provide the same rich OCaml editing features as the one provid= ed by the original Merlin modes for Emacs and Vim.

    Latest releases of vscode-ocaml-platform already provide two n= ew commands: Construct and Jump that respectively= provide a better UI to fill typed holes with values and jump to specific p= arent nodes. Search by type/polarity and a command to get the type of growi= ng and shrinking selections will also be available in the future.

    3D"c07de3130c92c=

    Merlin changelog

    • merlin 5.3
      • merlin binary
        • Respect the EXCLUDE_QUERY_DIR configuration directive when= looking for cmt files (#1854)
        • Fix occurrences bug in which relative paths in index files are resolved= against the PWD rather than the SOURCE_ROOT (#1855)
        • Fix exception in polarity search (#1858 fixes #1113)
        • Fix jump to fun targets not working (#1863, fixes #1862)
        • Fix type-enclosing results instability. This reverts some overly aggressive deduplication that should be done on the client side. (#1864)
        • Fix occurrences not working when the definition comes from a hidden sou= rce file (#1865)

    OCaml-LSP changelog

    • 1.20.1
      • Features
        • Add custom [~ocamllsp/typeSearch~](/ocaml-lsp-server/docs/ocamllsp/typeSearch-spec.md)= request (#1369)
        • Make MerlinJump code action configurable (#1376)
        • Add custom [~ocamllsp/jump~](/ocaml-lsp-server/docs/ocamllsp/merlinJump= -spec.md) request (#1374)
      • Fixes
        • Fix fd leak in running external processes for preprocessing (#1349)
        • Fix prefix parsing for completion of object methods (#1363, fixes #1358= )
        • Remove some duplicates in the selectionRange answers (#136= 8)
        • Deactivate the jump code actions by default. Clients can e= nable them with the merlinJumpCodeActions configuration option. Alternatively = a custom request is provided for ad hoc use of the feature. (#1411)

    New release of baby

    Fran=C3=A7ois Pottier announced

    It is my pleasure to announce the second release of baby.

    opam update
    opam install baby.20241204
    

    baby is an OCaml library that offers persistent sets and maps = based on balanced binary search trees. It offers replacements for OCaml's <= code>Set and Map modules.

    Height-balanced and weight-balanced binary search trees are offered out of = the box. Furthermore, to advanced users, the library offers a lightweight w= ay of implementing other balancing strategies.

    Documentation= is available online.

    The changes in this release are as follows:

    • The library now offers both sets and maps. The modules Baby.H.Set= and Baby.W.Set continue to exist, and are compatible w= ith OCaml's Set library. The modules Baby.H.Map a= nd Baby.W.Map appear, and are compatible with OCaml's Ma= p library. Furthermore, the functors Baby.H.Make and Baby.W.Make appear. These functors produce a module that contain= s sets, maps, and two conversion functions between sets and maps, namely domain and lift.
    • Documentation: in the signature OrderedType, clarify the s= pecification of the function compare; this function decides a = total preorder =E2=89=A4.
    • Documentation: in the preamble, clarify that, most of the time, we assu= me that =E2=89=A4 is a total order; if an operation must be un= derstood in the more general case where =E2=89=A4 is a total p= reorder, then this is explicitly indicated.
    • Documentation: update the documentation of find and = find_opt in accordance with the previous point.
    • A number of incompatible changes have been made; see the change log for deta= ils.

    Release of Saturn 1.0

    Carine Morel announced

    I am thrilled to announce the release of Saturn 1.0!

    Saturn is a collection of concurrent-safe data structures designed for OCam= l 5. These structures have been:

    • thoroughly tested with amazing tools like STM (see this blog post) and DScheck,
    • benchmarked for performance,
    • optimized for efficiency,
    • and even verified in some cases!

    If you're curious about the motivation behind Saturn and the challenges it = addresses, you can read more here.

    What Can You Do with Saturn?

    Saturn provides a variety of data structures, including queues, stacks, has= h tables, and more. All of these structures are lock-free, linearizable, and specifically designed to take full advantage = of OCaml 5=E2=80=99s multicore capabilities.

    • Portable Data Structures

      Lock-freedom is a progress property that guarantees system-wide progress. T= his is a powerful and desirable feature, though it comes at the cost of som= e overhead. However, it offers a significant advantage: lock-free data stru= ctures avoid the need for scheduler-specific blocking mechanisms, making th= em compatible with any scheduler, such as Eio or Domainslib.

    • Restrictions

      Saturn=E2=80=99s data structures are not composable, meaning you cannot com= bine them (e.g., use Saturn.Queue inside Saturn.Htbl) while preserving properties like lock-freedom and linearizability.

      They are also not extensible outside of Saturn without losing these propert= ies. For instance, Saturn.Queue does not include a lengt= h function because implementing one would introduce significant over= head (see Saturn.Bounded_queue for an example of this tradeoff= ). Attempting to add this functionality, such as by wrapping the queue:

      type 'a t =3D {size: int=
       Atomic.t; queue : 'a Saturn.Queue.t}
      

      would result in a structure that either loses lock-freedom or is no longer = linearizable.

      If you need composable lock-free data structures, consider exploring kcas_data.

    Call to Action

    • Try It Out: Give Saturn a try in your projects and let us know h= ow it works for you. If you encounter any bugs or issues, please report the= m on our GitHub repos= itory.
    • Share Your Use Case: Are you already using Saturn? Let us know i= n the comments what you're building with it!
    • Contribute: We=E2=80=99d love to have more contributors. Whether= it=E2=80=99s implementing new features, improving documentation, or sugges= ting enhancements, your contributions are welcome!
    • Help Shape the Future: What would you like to see in Saturn? Is = there a missing data structure you need? Share your thoughts to help us bui= ld a roadmap for future development.

    Thank you for your support!

    Talks and Resources

    If you want to learn more about Saturn, I gave a talk at the 2024 OCaml Wor= kshop=E2=80=94check out the short paper and the talk.

    To dive deeper into concurrent-safe data structures, I highly recommend hav= ing a look at The Art of Multiprocessor Programmi= ng, which explores the differences in design between lock-based and loc= k-free data structures.

    Commercial Support

    If you=E2=80=99re interested in incorporating Saturn into your commercial a= pplications, Tarides offers professional development and support services. = Feel free to contact us for more details.

    Dune dev meeting

    Etienne Marais announced

    Hi Dune enthusiasts! :smile:=20=20

    We will hold our regular Dune dev meeting on Wednesday, December, 11th a= t 9:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronise between the Dune developers ! :camel:=20

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Dune 3.17

    Etienne Marais announced

    The Dune team is happy to announce the release of Dune 3.17.0!= :tada:=20

    Among the list of changes, this minor release enables the Dune cache by def= ault for known-safe operations, adds out-of-the-box support for Wasm_= of_ocaml, adds support for the~-H~ compiler flag introduced in OCaml= 5.2, allows specifying code hosting services like Codeberg or GitLab organ= isations, and gives the possibility to run individual tests with dune= runtest.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Added
      • Make Merlin/OCaml-LSP aware of "hidden" dependencies used by (implicit_transitive_deps false) via the -H compi= ler flag. (#10535, @voodoos)
      • Add support for the -H flag (introduced in OCaml compiler 5.2) in dune (requires lang versions 3.17). This adaptation gives the correct semantics for (implicit_transitive_deps false). (#10644, fixes #9333, ocsigen/tyxml#274, #2733, #4963, @MA0100)
      • Add support for specifying Gitlab organization repositories in so= urce stanzas (#10766, fixes #6723, @H-ANSEN)
      • New option to control jsoo sourcemap generation in env and executable s= tanza (#10777, fixes #10673, @hhugo)
      • One can now control jsoo compilation_mode inside an executable stanza (#10777, fixes #10673, @hhugo)
      • Add support for specifying default values of the authors, = maintainers, and license stanzas of the dune-project file via the = dune config file. Default values are set using the (project_defaults) stanza (#10835, @H= -ANSEN)
      • Add names to source tree events in performance traces (#10884, @jchavar= ri)
      • Add codeberg as an option for defining project sources in = dune-project files. For example, (source (codeberg user/repo)). (#10904, @n= lordell)
      • dune runtest can now run individual tests with dune = runtest mytest.t (#11041, @Alizter).
      • Wasm_of_ocaml support (#11093, @vouillon)
      • Add a coqdep_flags field to the coq field of = the env stanza, and to the coq.theory stanza, allowing to configure coqdep f= lags. (#11094, @rlepigre)
    • Fixed
      • Show the context name for errors happening in non-default contexts. (#10414, fixes #10378, @jchavarri)
      • Correctly declare dependencies of indexes so that they are rebuilt when needed. (#10623, @voodoos)
      • Don't depend on coq-stdlib being installed when expanding variables of the coq.version family (#10631, fixes #10629, @gares)
      • Error out if no files are found when using copy_files. (#1= 0649, @jchavarri)
      • Re_export dune-section private library in the dune-site library stanza, in order to avoid failure when generating and building sites modules with implicit_transitive_deps =3D false. (#10650, fixes #9661, @MA0100)
      • Expect test fixes: support multiple modes and fix dependencies when the= re is a custom runner (#10671, @vouillon)
      • In a (library) stanza with (extra_objects) an= d (foreign_stubs), avoid double linking the extra object files in the final executable. (#10783, fixes #10785, @nojb)
      • Map (re_export) library dependencies to the exports<= /code> field in META files, and vice-versa. This field was proposed in to https://discuss.ocaml.org/t/proposal-a-new-exports-fi= eld-in-findlib-meta-files/13947. The field is included in Dune-generated META files only when t= he Dune lang version is >=3D 3.17. (#10831, fixes #10830, @nojb)
      • Fix staged pps preprocessors on Windows (which were not working at all previously) (#10869, fixes #10867, @nojb)
      • Fix dune describe when an executable is disabled with enabled_if. (#10881, fixes #10779, @moyodiallo)
      • Fix an issue where C stubs would be rebuilt whenever the stderr of Dune= was redirected. (#10883, fixes #10882, @nojb)
      • Fix the URL opened by the command dune ocaml doc. (#10897,= @gridbugs)
      • Fix the file referred to in the error/warning message displayed due to = the dune configuration version not supporting a particular configuration stanza in use. (#10923, @H-ANSEN)
      • Fix enabled_if when it uses env variable. (#1= 0936, fixes #10905, @moyodiallo)
      • Fix exec -w for relative paths with –root argument (#10982, @gri= dbugs)
      • Do not ignore the (locks ..) field in the test and tests stanza (#11081, @rgrinberg)
      • Tolerate files without extension when generating merlin rules. (#11128, @anmonteiro)
    • Changed
      • Remove all remnants of the experimental patch-back-source-tree. (#10771, @rgrinberg)
      • Change the preset value for author and maintainer fields in the dune-project file to encourage including emails. (#10848, @pun= chagan)
      • Tweak the preset value for tags in the dune-project file t= o hint at topics not having a special meaning. (#10849, @punchagan)
      • Change some colors to improve readability in light-mode terminals (#10890, @gridbugs)
      • Forward the linkall flag to jsoo in whole program compilation as well (= #10935, @hhugo)
      • Configurator uses pkgconf as pkg-config implementation whe= n available and forwards it the target of ocamlc -config. (#1= 0937, @pirbo)
      • Enable Dune cache by default. Add a new Dune cache setting enabled-except-user-rules, which enables the Dune cache, but e= xcludes user-written rules from it. This is a conservative choice that can avoid breaking rules whose dependencies are not correctly specified. This is the current default. (#10944, #10710, @nojb, @ElectreAAS)
      • Do not add dune dependency in dune-project wh= en creating projects with dune init proj. The Dune dependency is implicitely added when = generating opam files (#11129, @Leonidas-from-XIV)

    Spec and interface to declare dependencies in an OCaml script<= /h2>

    jbeckford announced

    This is the fourth article in the MlFront series. If you are interested in = scripting frameworks that can download source code and bytecode, and inter-= operate while doing so, please read:

    https://diskuv.com/mlfro= nt/overview-4/

    TLDR

    (Critical, verbatim snippets from article)

    I have an old opam package DkSDKFFIOCaml_Std that is a low-level bridge between OCaml and= other programming languages. It can be extraordinarily difficult to build,= so I made it a mix of pure OCaml source code and prebuilt library download= s. Today I'll describe how embedded OCaml dependencies like the following <= i>simplifies the build process:

    module _ =3D DkSDKFFI_OCaml
    (** The bridge between =
    OCaml and other programming languages.
    
        {[ `v1 [
              `sec [ `scheme<=
    /span> "dkcoder" ];
              `blib<=
    /span> ["https://gitlab.com/api/v4/projects/62703194/packages/generic/@DKML_TARGET_ABI@/=
    2.1.4/@DKML_TARGET_ABI@-4.14.2-DkSDKFFI_OCaml-2.1.4-none.blib.zip"];
              `clib<=
    /span> ["https://gitlab.com/api/v4/projects/62703194/packages/generic/@DKML_TARGET_ABI@/=
    2.1.4/@DKML_TARGET_ABI@-4.14.2-DkSDKFFI_OCaml-2.1.4-none.clib.zip"]
            ] ]} *)
    
    (* And use what you imported ... *)
    let () =3D
       ignore (DkSDKFFI_OCaml.Com.create_c ())
    

    One set of designs I created are the MlFront_Archive package f= ormats:

    1. *.blib.zip - This is the bytecode archive. It is a zip fil= e containing .cma, .cmi and some other critical m= etadata.
    2. *.clib.zip - This is the C library archive. It is a zip fi= le containing .so or .dylib or .dll = shared libraries, and also the corresponding static libraries.

    The important concept is that *.blib.zip and *.clib.zip<= /code> for OCaml are analogous to *.jar files for Java. The de= sign is available at:

    The remote specification design is in the MlFront_Config libra= ry:

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=e7WPI9Nq; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=qtridYDg; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id DD3FA417D2 for ; Tue, 17 Dec 2024 13:05:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=KY3GiDy1vbKyyxmTGqEx66HcQeN9lVl7g+/ustauWB8=; b=e7WPI9NqgXsiR8KCunleeaiSw+hesP8gsC6jPc1eVscKjs+Q0o2ZrgzS DsuO0ENDFdmcgtKbS+uocmOsXoiqZXhC6jBa76odc5q9wenc9x/xHOt38 jSxhJccGAvTW9muy/fjxHEJ+sG7cU9PDUeOa9itZUyOJj9maizyRNn6YF I=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,241,1728943200"; d="scan'208,217";a="199639628" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Dec 2024 14:05:45 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9BE56E0D20; Tue, 17 Dec 2024 14:05:45 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id CBD8CE0077 for ; Tue, 17 Dec 2024 14:05:42 +0100 (CET) IronPort-SDR: 67617725_P8zcluHnyyvvmNe+9Pb02Cds6GVou2SXEyEl1t/EjlbOpQQ scsCJYule35iyXkQjsjsAlLXlc/dCWQalnsMc+A== X-IPAS-Result: =?us-ascii?q?A0EnPgAldmFngSIeaIFaHAEBATwBAQQEAQECAQEHAQGBa?= =?us-ascii?q?AIBgT5bKBkBY1oQAQEhBwhIhFaDT44fkU2KeIFWFIERAxgWIxQBAwENFAIBA?= =?us-ascii?q?g4HAQUNAQIEAQEDAQIBggyCLkaKbwIfBgEEMgcOAQIEAQEBAQMCAwEBAQEBA?= =?us-ascii?q?RABAQUBAQECAQECBAYBAhABAT0FSYVBBjQNSQEBBAsBgWpRcWUJNwEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQILAQFDWwkKE?= =?us-ascii?q?wEBLAwYIwMJCwEGAwIRATUXARIUBoI0NIIfRQMFDAaVH5tLeoEygQGCDAEBB?= =?us-ascii?q?oEIPgITAQ4J2iyBZAmBSAGFaoJJGgEqSGoChEgJhDMnD4FVRIFKgXNKB2+CS?= =?us-ascii?q?hcCAQEYfwkcAQEGRxKDHIJpgj5MgVtAgWMsXnsRg36DNBJPg3eBQV9QgQ85K?= =?us-ascii?q?Hssi1SBR0szMgFVExcLBwVhgRIDLjYxg2CBAzmCEWlJOgINAjaCIiRYgk2DW?= =?us-ascii?q?YE/hGGEV4YagheCFlUdQAMLbT03FBucPgEJNEYBRoJpCyQOCzMCcxUFAQUWD?= =?us-ascii?q?gIgDyk5ChkZDQUBBQMFEAYBKAYWkm8KMgMnijuFCaICbTQHhB2BXQYMiQWBJ?= =?us-ascii?q?I1BiDqEBIFXiy4DmUUimFkigjWBPoVngSUJggxMlVIICw0DFoILgxKBbgopg?= =?us-ascii?q?UkMBzMaMEOCZwlGHA+Mb4E7AxaBDAEIgkOBPoEmgXU7gkG2akI1AgEBOAIHA?= =?us-ascii?q?QoBAQMJhWIBAYMEgheFH2tgAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 vSRD6ACOXm4 IronPort-HdrOrdr: A9a23:U4fUyK9c+M45KJa0VV5uk+B7I+orL9Y04lQ7vn2ZhyY1TiX+rb HJoB17726StN91YhsdcL+7VZVoLUmxyXcx2/hzAV9NNDOWxFdAb7sSkLcL+lXbalLDH5dmpN ldmvFFeazN5DpB7foSkTPId+rIm+P3iZxA7N22pxxQpENRGsNdBmFCZTpzeXcGITWua6BWKH O03Ls2mxOQPVoWc+WmDT0/U+DYodqjruOdXTc2QzAm9SiThneS5LT7ChiV2Qp2aUI1/Z4StU bEji3k7eGZv/u60x/R0HKWx5lag9f60LJ4db6xo/lQBDXwqxqiIL5sXLCPp1kO0ZmSwVsnis TNpB88P8J18RrqDxKInSc= X-Talos-CUID: 9a23:WsD/2WE2VnPmx/KUqmJb/V4tR+UCe0HsjzTteB+nFn9qWuO8HAo= X-Talos-MUID: 9a23:x4d2mAWXoOnALE7q/BXSnWhPOcg02I+/Ln8jg5EYt9SWaTMlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,241,1728943200"; d="scan'208,217";a="199639585" X-MGA-submission: =?us-ascii?q?MDFPJ/SoBVz3hl50nAuo7SOh/t8TY/ISkTyqvv?= =?us-ascii?q?oTexqFtWddv7zgO7Xon04bubnqGBu8CT+4IRwO7ub+AhPKHuF6K3mL0Y?= =?us-ascii?q?amr81Bc6ihACAyx541oAMFxMXyMHWRzCvVe9Gjq+ufwp8ZwQhILouTic?= =?us-ascii?q?pAZiXrbksFXmZnLGTwCPlybQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Dec 2024 14:05:42 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5AE44564BD5; Tue, 17 Dec 2024 14:05:40 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1734440740; bh=R0BK5WnV5MX/c2onOAwautR/xsHrpgMWN4/sR3G+1mk=; h=From:To:Subject:Date:Message-ID; b=qtridYDgvFeKauw0xB0fN/nm3iaUoqHcl5wa/Mxt5dgHEchePDNFg35gK7WhOzy4/ CKXhRcaV1WOQxSHfqM8jd9iPFiMZHF/oS7quH1ute33dEBIFJOjwsNqP3qtAbTGYdx VsdcsB0F7VHuYSUJaubwcMR1g/lcxPebxSa6XHLc= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Dec 2024 14:05:39 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 17 14:05:40 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492883, queueID=8C2DB564BD6 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19234 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 10 to 17, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Opam repository archival, Phase 1: unavailable packages Proposed Package Archiving Policy for the opam Repository QCheck 0.23 OCaml's Code of Conduct team - rotation of one team member qcheck-lin and qcheck-stm 0.2 Old CWN Opam repository archival, Phase 1: unavailable packages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my pleasure to announce below the list of opam packages that will move to the opam-repository-archive on January 1st 2025. In total there are 4170 opam files scheduled for being moved within 561 unique packages. This decreases the size of the opam-repository by roughly 12.7%. This list contains all packages (a) marked as "available: false" (which may have various reasons: security issue, source unavailable, =E2= =80=A6 - best to look into the "git log" for the specific package for the reason), and (b) packages which cannot be installed due to missing dependencies (with the packages mentioned in (a) being removed). The second list of packages (b) has been automatically generated by the [archive-opam] utility - developed purely for the opam-repository archival project, and this utility may have bugs. So, if you find a package in the list and you'd like to retain it in the opam-repository, there are some options: =E2=80=A2 (a) you can install it on your system (opam install ): this means there's a bug in the archive-opam utility, please provide the package name and version in the [opam-repository-archive Phase 1 PR], together with your opam version, OCaml version, and operating system; =E2=80=A2 (b) it is not installable: please figure out the reasoning (the "Reasoning" may help you to find the root issue), and try to fix it yourself - if you're unable to fix the root cause, please also comment in the [opam-repository-archive Phase 1 PR] with the package name and version. If you've any questions, please don't hesitate to ask here or on GitHub or via another communication channel. You can help further on the archiving process: =E2=80=A2 as mentioned in the [last announcement] please add the [`x-maintenance-intent'] to your packages (a good choice for a lot of packages is `x-maintenance-intent: [("latest")]' if you're maintaining the latest version only) - this will be considered in Phase 3 (March 1st 2025); =E2=80=A2 if you are the author or maintainer of a package that is no lon= ger useful or maintained, you can as well mark your opam files in the opam-repository with `flags: deprecated' (this will be taken into account in Phase 3 - March 1st 2025); =E2=80=A2 if you flagged your preliminary releases with `flags: avoid-version', and they can now be removed (e.g. since a stable version has been released), please open a pull request to replace the `avoid-version' with `deprecated'. Please note that the next Phase will be announced on January 15th with all packages that are only installable with OCaml < 4.08 - archiving is scheduled for February 1st. To keep track of the announcements, please look at the [opam-repository] tag. You can reproduce these lists by running `opam-archive --unavailable --dry-run --later-installable --pkg-all' using opam-archive at 666a3b3886acfbcf82a7d73134247ccaa605510a and opam-repository at de786e28dbea73843ad5e5f0290a4e81fba39370. A big thanks to the [OCaml Software Foundation] for funding the opam-repository archival project. [archive-opam] [opam-repository-archive Phase 1 PR] [last announcement] [`x-maintenance-intent'] [opam-repository] [OCaml Software Foundation] Packages scheduled for archiving (pkg-name: pkg-version[, pkg-version]*) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C /editor note/ Please find this long list in the post itself: Proposed Package Archiving Policy for the opam Repository =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hey, just a quick update on the proposed roadmap. The changes are we don't do `avoid-version' / `deprecated' flag cleanups in Phase 1. Instead, we plan to remove packages with `deprecated' flag in Phase 3. Packages with flag `avoid-version' will stay in opam-repository, but we reach out to maintainers and authors whether their intention is to mark these packages as deprecated (e.g. for alpha / beta releases and release candidates). Please find the updated roadmap below: =E2=80=A2 December 1st 2024: announcement of this proposal =E2=80=A2 December 15th 2024: announcement of the packages affected by Ph= ase 1 (uninstallable packages (=E2=80=9Cavailable: false=E2=80=9D, =E2=80=9Co= pam admin check =E2=80=93installability -i=E2=80=9D) =E2=80=A2 January 1st 2025: Phase 1 cutting point: packages are moved to opam-repository-archive =E2=80=A2 January 15th 2025: announcement of the packages affected by Pha= se 2 (OCaml lower bound 4.08) =E2=80=A2 February 1st 2025: Phase 2 cutting point: packages are moved to opam-repository-archive =E2=80=A2 February 15th 2025: initial spring cleaning, announcement of packages (based on maintenance-intent), and `flags: deprecated' =E2=80=A2 March 1st 2025: spring cleaning cutting point: packages are mov= ed to opam-repository-archive =E2=80=A2 Every quarter: repeat Phase 3 =E2=80=A2 Every year: reconsider Phase 2 with an increased OCaml lower bo= und QCheck 0.23 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the 0.23 release of `qcheck-core', `qcheck', `qcheck-alcotest', and `qcheck-ounit', along with a 0.5 release of `ppx_deriving_qcheck' :tada: The biggest user-visible change is the addition of a [qcheck-core overview documentation page] as well as clean-ups to the two module pages to provide a better overview of the different available features: =E2=80=A2 [QCheck] =E2=80=A2 [QCheck2] In more detail the 0.23 release has made the following changes: =E2=80=A2 Quote and escape in `Print.string' and `Print.char' in the `QCh= eck' module, mirroring the `QCheck2.Print' module's behaviour. Also quote and escape `Print.bytes' in both `QCheck' and `QCheck2'. =E2=80=A2 Clean-up `QCheck' and `QCheck2' documentation pages =E2=80=A2 Add `exponential' generator to `QCheck', `QCheck.Gen', and `QCheck2.Gen' =E2=80=A2 Add `Shrink.bool' and use it in `QCheck.bool' =E2=80=A2 Remove unread `fun_gen' field from `QCheck2''s `fun_repr_tbl' t= ype thereby silencing a compiler warning The `ppx_deriving_qcheck' 0.5 release contains a fix to derive generators for mutually recursive data types involving records, thanks to a contribution from @Kakadu Happy testing! :smiley: [qcheck-core overview documentation page] [QCheck] [QCheck2] OCaml's Code of Conduct team - rotation of one team member =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sonja Heinze announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A bit over two years ago, the OCaml community wrote and adopted a [code of conduct] and put together a code of conduct team. The code of conduct team is there for anyone in the community whenever they have concerns about behavior that falls within the scope of the code of conduct. It's currently made up of @c-cube, @Khady, @mseri, @rjbou myself. When putting together the code of conduct team, we mentioned that we'd rotate the team from time to time to keep it dynamic. We're now rotating one team member: I'm leaving the team and @shonfeder is joining. Thanks a lot, @shonfeder, for taking on this responsibility! Let's also use this opportunity to explain how the Code of Conduct team operates: We generally do not step in on our own initiative, but only when asked. That's to avoid having five community members acting as a kind of "overarching community police". That said, we will step in without being asked in extreme cases, but this has not happened so far. We do moderate and/or act when people reach out to us. That does happen from time to time. By the way, you can adopt the Code of Conduct yourself on your OCaml GitHub/GitLab repos by creating a `CODE_OF_CONDUCT.md`, containing the [CODE_OF_CONDUCT_TEMPLATE] - full instructions [here]. So far, it is already adopted on this discuss forum, the caml-list@inria.fr mailing list, the OCaml IRC, [OCaml discord], physical events like OCaml Workshop, and [these repositories]. Absolutely everyone is welcome to adopt it on their OCaml repository as well. Adopting it doesn't have a practical effect in a big majority of cases, but it always makes contributors, particularly newcomers, feel more welcome. Have a nice weekend everyone! Best, @pitag on behalf of the whole Code of Conduct team [code of conduct] [CODE_OF_CONDUCT_TEMPLATE] [here] [OCaml discord] [these repositories] qcheck-lin and qcheck-stm 0.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I just rolled a 0.5 release of `qcheck-lin', `qcheck-stm', and `qcheck-multicoretests-util': The biggest news in the 0.5 release is the addition of `Util.Pp.pp_fun_' for printing function values generated with QCheck.To ensure quoted and escaped output for chars and strings, this required bumping the `qcheck-core' lower bound to the freshly released `qcheck-core.0.23'. This in turn, enabled a couple of other clean-ups: =E2=80=A2 #492: Also use the new, upstreamed `Gen.exponential' combinator= in STM =E2=80=A2 #491: Require `qcheck.0.23', simplify show functions by utilizi= ng it, and update expect outputs accordingly =E2=80=A2 #486: Add `Util.Pp.pp_fun_' printer for generated `QCheck.fun_' functions Happy testing and happy holidays! :smiley: :christmas_tree: Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 10 to 17, 20= 24.

    Opam repository archival, Phase 1: unavailable packages

    Hannes Mehnert announced

    It is my pleasure to announce below the list of opam packages that will mov= e to the opam-repository-archive on January 1st 2025. In total there are 41= 70 opam files scheduled for being moved within 561 unique packages. This de= creases the size of the opam-repository by roughly 12.7%.

    This list contains all packages (a) marked as "available: false" (which may= have various reasons: security issue, source unavailable, … - best = to look into the "git log" for the specific package for the reason), and (b= ) packages which cannot be installed due to missing dependencies (with the = packages mentioned in (a) being removed).

    The second list of packages (b) has been automatically generated by the archive-opam utility -= developed purely for the opam-repository archival project, and this utilit= y may have bugs.

    So, if you find a package in the list and you'd like to retain it in the op= am-repository, there are some options:

    • (a) you can install it on your system (opam install <pkg>): this = means there's a bug in the archive-opam utility, please provide the package= name and version in the opam-repository-archive Phase 1 PR, together with you= r opam version, OCaml version, and operating system;
    • (b) it is not installable: please figure out the reasoning (the "Reason= ing" may help you to find the root issue), and try to fix it yourself - if = you're unable to fix the root cause, please also comment in the opam-repository-ar= chive Phase 1 PR with the package name and version.

    If you've any questions, please don't hesitate to ask here or on GitHub or = via another communication channel.

    You can help further on the archiving process:

    • as mentioned in the last announcement please add the x-maintenance-intent= to your packages (a good choice for a lot of packages is = x-maintenance-intent: [("latest")] if you're maintaining the latest = version only) - this will be considered in Phase 3 (March 1st 2025);
    • if you are the author or maintainer of a package that is no longer usef= ul or maintained, you can as well mark your opam files in the opam-reposito= ry with flags: deprecated (this will be taken into account in = Phase 3 - March 1st 2025);
    • if you flagged your preliminary releases with flags: avoid-versio= n, and they can now be removed (e.g. since a stable version has been= released), please open a pull request to replace the avoid-version with deprecated.

    Please note that the next Phase will be announced on January 15th with all = packages that are only installable with OCaml < 4.08 - archiving is sche= duled for February 1st.

    To keep track of the announcements, please look at the opam-repository tag.

    You can reproduce these lists by running opam-archive --unavailable -= -dry-run --later-installable --pkg-all using opam-archive at 666a3b3= 886acfbcf82a7d73134247ccaa605510a and opam-repository at de786e28dbea73843a= d5e5f0290a4e81fba39370.

    A big thanks to the OCaml Software Foundat= ion for funding the opam-repository archival project.

    Packages scheduled for archiving (pkg-name: pkg-versi= on[, pkg-version]*)

    editor note Please find this long list in the post itself: https://discuss.ocaml.org/t/opam-repository-archival-phas= e-1-unavailable-packages/15797

    Proposed Package Archiving Policy for the opam Repository

    Continuing this thread, Hannes Mehnert announced

    Hey,

    just a quick update on the proposed roadmap. The changes are we don't do avoid-version / deprecated flag cleanups in Phase 1= . Instead, we plan to remove packages with deprecated flag in = Phase 3. Packages with flag avoid-version will stay in opam-re= pository, but we reach out to maintainers and authors whether their intenti= on is to mark these packages as deprecated (e.g. for alpha / beta releases = and release candidates).

    Please find the updated roadmap below:

    • December 1st 2024: announcement of this proposal
    • December 15th 2024: announcement of the packages affected by Phase 1 (u= ninstallable packages (=E2=80=9Cavailable: false=E2=80=9D, =E2=80=9Copam ad= min check –installability -i=E2=80=9D)
    • January 1st 2025: Phase 1 cutting point: packages are moved to opam-rep= ository-archive
    • January 15th 2025: announcement of the packages affected by Phase 2 (OC= aml lower bound 4.08)
    • February 1st 2025: Phase 2 cutting point: packages are moved to opam-re= pository-archive
    • February 15th 2025: initial spring cleaning, announcement of packages (= based on maintenance-intent), and flags: deprecated
    • March 1st 2025: spring cleaning cutting point: packages are moved to op= am-repository-archive
    • Every quarter: repeat Phase 3
    • Every year: reconsider Phase 2 with an increased OCaml lower bound

    QCheck 0.23

    Jan Midtgaard announced

    I'm happy to announce the 0.23 release of qcheck-core, q= check, qcheck-alcotest, and qcheck-ounit, = along with a 0.5 release of ppx_deriving_qcheck :tada:=20

    The biggest user-visible change is the addition of a qcheck-core overview docu= mentation page as well as clean-ups to the two module pages to provide = a better overview of the different available features:

    In more detail the 0.23 release has made the following changes:

    • Quote and escape in Print.string and Print.char in the QCheck module, mirroring the QCheck2.Print module's behaviour. Also quote and escape Print.bytes in b= oth QCheck and QCheck2.
    • Clean-up QCheck and QCheck2 documentation pag= es
    • Add exponential generator to QCheck, QC= heck.Gen, and QCheck2.Gen
    • Add Shrink.bool and use it in QCheck.bool
    • Remove unread fun_gen field from QCheck2's fun_repr_tbl type thereby silencing a compiler warning

    The ppx_deriving_qcheck 0.5 release contains a fix to derive g= enerators for mutually recursive data types involving records, thanks to a = contribution from @Kakadu=20

    Happy testing! :smiley:

    OCaml's Code of Conduct team - rotation of one team member

    Sonja Heinze announced

    A bit over two years ago, the OCaml community wrote and adopted a = code of conduct and put together a code of conduct team. The code of co= nduct team is there for anyone in the community whenever they have concerns= about behavior that falls within the scope of the code of conduct. It's cu= rrently made up of @c-cube, @Khady, @mseri, @rjbou myself.

    When putting together the code of conduct team, we mentioned that we'd rota= te the team from time to time to keep it dynamic. We're now rotating one te= am member: I'm leaving the team and @shonfeder is joining. Thanks a lot, @s= honfeder, for taking on this responsibility!

    Let's also use this opportunity to explain how the Code of Conduct team ope= rates: We generally do not step in on our own initiative, but only when ask= ed. That's to avoid having five community members acting as a kind of "over= arching community police". That said, we will step in without being asked i= n extreme cases, but this has not happened so far. We do moderate and/or ac= t when people reach out to us. That does happen from time to time.

    By the way, you can adopt the Code of Conduct yourself on your OCaml GitHub= /GitLab repos by creating a `CODE_OF_CONDUCT.md`, containing the CODE_OF_CONDUCT_TEMPLATE - full instructions here. So far, it is already adopted on this discuss forum, the= caml-list@inria.fr mailing list, the OCaml IRC, OCaml discord, physical events like OCaml Workshop= , and these repositories. Absolutely everyone is welcome to ado= pt it on their OCaml repository as well. Adopting it doesn't have a practic= al effect in a big majority of cases, but it always makes contributors, par= ticularly newcomers, feel more welcome.

    Have a nice weekend everyone! Best, @pitag on behalf of the whole Code of Conduct team

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    I just rolled a 0.5 release of qcheck-lin, qcheck-stm, and qcheck-multicoretests-util: https://github.com/o= caml-multicore/multicoretests/releases/tag/0.5

    The biggest news in the 0.5 release is the addition of Util.Pp.pp_fun= _ for printing function values generated with QCheck.To ensure quote= d and escaped output for chars and strings, this required bumping the qcheck-core lower bound to the freshly released qcheck-core.0= .23. This in turn, enabled a couple of other clean-ups:

    • #492: Also use the new, upstreamed Gen.exponential combina= tor in STM
    • #491: Require qcheck.0.23, simplify show functions by util= izing it, and update expect outputs accordingly
    • #486: Add Util.Pp.pp_fun_ printer for generated QChe= ck.fun_ functions

    Happy testing and happy holidays! :smiley: :christmas_tree:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=k5jOqmLP; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=srJLnJHe; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id C26E248E48 for ; Tue, 24 Dec 2024 08:55:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Y4U18lVXT8ITSfmAihMOszdfXQETL+XD7UWRZHBbOc4=; b=k5jOqmLPfX7qYUauvqSqFgCC0Drl2iztQj/ME7iq181doKFoQ8P6/SiZ GPBAQ8208YTukN2ctS8O6s1Ce01NlE87qV8ybdZBgU9L8t33DHqRVHfaW z1+yma88xHaPvNAW4uxvMzGR8OxRuNMfz3gQsvIkGPTzLBmzGCtnOjYre o=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,259,1728943200"; d="scan'208,217";a="200638738" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Dec 2024 09:55:25 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B6477E0077; Tue, 24 Dec 2024 09:55:24 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 04E74E0077 for ; Tue, 24 Dec 2024 09:55:18 +0100 (CET) IronPort-SDR: 676a76f4_zWt6p+gkAaRZDbmSwgIwcA6N3pWEr7j7aT0pr4Yvo3lU/vp hrldyJbJO7Hu/lvuD9qhHsXtzgyx9cmDB5UVjYA== X-IPAS-Result: =?us-ascii?q?A0H0BwBedWpngSIeaIFCGBaCRgKBP1soGQFdBlozBwhIh?= =?us-ascii?q?FaDT44fgRaBKgGPDIp4gnsDGDkRAwEDAQ0uAQwGAQIEAQEDAQIBhQACim4CH?= =?us-ascii?q?wYBBDMGDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9BUmFe?= =?us-ascii?q?w1JAQEECwGBai0kcWEEAwYGAQEBAQEBAQEBJwEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECDAGBHgEIBAYTAQE4GCMDBwkEA?= =?us-ascii?q?QYDAhEBNRcBEhQGgg9Zgh9FAwQBDAaTGJp4BAFOen8zgQGCDAEBBoEIPgIBC?= =?us-ascii?q?wICAwEOCSUB1zeCT4EaSglBgQeFa4JJGgEFJUhqAoRIhDwnD4FVRIEVgihKB?= =?us-ascii?q?2+CPwsXAgEBWgI9IwEBAggHPAmDJYJpgiMXgmeCbD9NgW+CD4M0ElSBWYNYH?= =?us-ascii?q?R0vRoEPWYEvjGWBRyIDJjMsAVUTFwsHBWGBEgMuNjGDYIECOYIRaUk6Ag0CN?= =?us-ascii?q?oIgJFiCTYNZgT+EYYRWhhuCF4IWggkdQAMLbT03FBudHQEJNEYBRoJ2CSYOP?= =?us-ascii?q?gEBFRswAgEXBA8BBwMJCA4BASACLAIIDjIDKgYGFxUGAQEDBQYfCwYFLQIDk?= =?us-ascii?q?j8SEBUDKgN0kiKeEYEKNAeEHYFdBgyJBYEklXuEBIFXiy6HAJJJIphZIoI1h?= =?us-ascii?q?yVdSAmBbh5MhR2QNggYhTaBfSSBSQwHMxowIiGCZwlGHA+IIYYMFoNYgT6BJ?= =?us-ascii?q?oF1O4I+rxBCNQIBATgCBwEKAQEDCYVFHQEBgwSCF4QwAQECJAyBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:vRqnsKN7fXn+e8BcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: 9a23:CShCGGPvUmK0Xu5DQTlD1WxIBOsfc0bGzV3tEXWfE2lnYejA X-Talos-MUID: 9a23:qS1JzAXYgxYZbyzq/DnFizBSF5ZD2o63CmlVipQo4dmOHAUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,259,1728943200"; d="scan'208,217";a="200638708" X-MGA-submission: =?us-ascii?q?MDH+w3HCLUafS4eN5DXGe0fgJfAWFfL+oc/POD?= =?us-ascii?q?st69p8zHEVv+h453TBlP67Bi56aw+HixFAviUqLr+VOIUL9YBPm266Yp?= =?us-ascii?q?NflveUZA+3olcvP0iJrvDyLdMmKEtdgfy7hOIXN114lu/gcEUCZl38gj?= =?us-ascii?q?kmrdunLcmv5shEuds0WEYCMg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Dec 2024 09:55:16 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 593FC5649C0; Tue, 24 Dec 2024 09:55:14 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1735030514; bh=v/73chKPdyGruPfLaLsr/SKrfJvE6kOvl46OdUQn7vo=; h=From:To:Subject:Date:Message-ID; b=srJLnJHeqRETkSlHz/uWJq7c1tpswuYD+NIMbN7oaRcCYNjnAgRWjb8+OECEE8K9K B7rK7FaBrp4WLgICsTQb/u9wBkrsg7MEiDOxBWgyJAyXG2OPaygPH/gD3vRGjzDxob TvUd72IXHdBlXycpt6NptPDMVOm2OFuGmItjYWdo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 24 Dec 2024 09:55:12 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 24 09:55:15 2024 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.271758, queueID=9FAE75649C7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19238 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 17 to 24, 2024. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 dream-html and pure-html Dune 3.17 First release candidate of OCaml 5.3.0 Pragmatic Category Theory | Part 3: Associativity ocaml-stk, xtmpl, stog, ocaml-css, ocaml-ldp, higlo and chamo MirageOS on OCaml 5 Dune dev meeting Other OCaml News Old CWN dream-html and pure-html =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Yawar Amin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 [ANN] dream-html 3.8.0 Happy to announce some added power to the form decoding functionality. Three main things: 1. Added [Dream_html.form] and [query] helper functions to wrap extracting the data directly from the Dream request and decoding it correspondingly from the body or query. 2. Added the (monadic) chaining operator [Dream_html.Form.( let* )] and [ok] and [error] helpers to allow sophisticated sequential decoding where decoding of some fields depend on others. 3. Added optional parameters to constrain [typed decoding] of values eg `int ~min:0' will succeed the decode if the value is an integer _and_ at least 0. Also added [unix_tm] type decoder to decode timestamps into `Unix.tm' structs (not timezone-aware). The last [example] on the page shows a fairly sophisticated form decoder which requires an `id' field and _one or more of_ the fields `days', `weeks', `months', and `years', and fails if at least one is not provided. Enjoy :slight_smile: [Dream_html.form] [query] [Dream_html.Form.( let* )] [ok] [error] [typed decoding] [unix_tm] [example] Dune 3.17 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune team is happy to announce the release of Dune `3.17.1'! :camel: This patch release includes some bug fixes. To reduce computing time, it does not build `.cmxs' files anymore when the `(no_dynlink)' stanza is used. This change also corrects the semantic of the `(no_dynlink)' stanza which was building `.cmxs' files even if it did not install them. Now, it does not build nor install them. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 When a library declares `(no_dynlink)', then the `.cmxs' file f= or it is no longer built. (#11176, @nojb) =E2=80=A2 Fix bug that could result in corrupted file copies by Dune, for example when using the `copy_files#' stanza or the `copy#' action. (@nojb, #11194, fixes #11193) =E2=80=A2 Remove useless error message when running `$ dune subst' in emp= ty projects. (@rgrinberg, #11204, fixes #11200) First release candidate of OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml 5.3.0 is imminent. As a final step, we are publishing a release candidate to check that everything is in order before the release in the upcoming week(s). If you find any bugs, please report them on [OCaml's issue tracker]. Compared to the second beta, this release candidate contains a regression fix in the type system (some type expressions were not generalized when they ought to be), one fix for the new check for dependency order at link time, and a manual update. The full change log for OCaml 5.3.0 is available [on GitHub]. A short summary of the changes since the second beta release is also available below. [OCaml's issue tracker] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.3.0~rc1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the release candidate is also directly available on: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.3.0~rc1+optio= ns =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.3.0~rc1+flambda+nffa ocaml-variants.5.3.0~= rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes since the second beta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Type system =E2=80=A2 [#13690]: some type expressions were incorrectly not generalized (because they were assigned to the wrong level pool) [#13690] =E2=97=8A Documentation =E2=80=A2 [#13666]: Rewrite parts of the example code around nested lists= in Chapter 6 (Polymorphism and its limitations -> Polymorphic recursion) giving the "depth" function [in the non-polymorphically-recursive part of the example] a much more sensible behavior; also fix a typo and some formatting. (Frank Steffahn, review by Florian Angeletti) [#13666] =E2=97=8A Compiler user-interface and warnings: =E2=80=A2 [#12084], +[#13669], +[#13673]: Check link order when creating archive and when using ocamlopt. [#12084] [#13669] [#13673] Pragmatic Category Theory | Part 3: Associativity =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Dmitrii Kovanikov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Hi everyone! :wave: I've finished writing the third part of my *Pragmatic Category Theory* series (some code examples are in OCaml): =E2=80=A2 [Part 3: Associativity] Previous discussion: =E2=80=A2 P.S. I would've edited the previous topic instead of creating a new one but looks like I haven't touched it for a while, so I can't edit the title and the body anymore. [Part 3: Associativity] ocaml-stk, xtmpl, stog, ocaml-css, ocaml-ldp, higlo and chamo =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Zoggy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, I made new releases for some libraries and tools. All are available in opam. [OCaml-stk] 0.4.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C OCaml-stk is a library to build graphical user interfaces, based on SDL2. This release includes two new widgets: =E2=80=A2 a [layers] widget, allowing to display widgets in=E2=80=A6 laye= rs, =E2=80=A2 a xmlview widget (in [stk_xml] package), allowing to display XML (and so XHTML) documents, handling CSS for styling and layout. The programmer can customize which widgets are created for each XML node, and add event handlers on each node. See the "xmlview" example included in sources. This new release also comes with an [inspection window] for easier debugging. Complete list of changes is [here]. [OCaml-stk] [layers] [stk_xml] [inspection window] [here] [Xtmpl] 1.0.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Xtmpl is a library to build, read and parse XML document. It provides a [rewriting engine] and [templating facilities]. This new release includes a big refactoring, using functors. This creates some incompatibilities with prior versions. See [here] for changes. [Xtmpl] [rewriting engine] [templating facilities] [here] [Stog] 1.1.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Stog is a static web site compiler. It is able to handle blog posts as well as regular pages or any XML document in general. This release upgrades to Xtmpl 1.1.0 and includes small fixes (see [here] for details). [Stog] [here] [OCaml-css] 0.3.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C OCaml-css is an OCaml library to parse and print CSS. It can also expand namespaces and perform computations on property values. Parser can be extended by defining additional properties. This release includes various parsing fixes and adds new CSS properties: `border-collapse', `border-spacing', and `opacity'. The complete list of changes is [here]. [OCaml-css] [here] [OCaml-ldp] 0.4.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C This is a library to build [LDP] (Linked Data Platform) and [SOLID] applications, runnable either in standalone program (using packages `ldp_tls' or `ldp_curl') or in the browser (using package `ldp_js' with js_of_ocaml). This release includes only one fix in [`Ldp.Http'] module: when following redirection, resolve IRI in Location field of response against original IRI. [OCaml-ldp] [LDP] [SOLID] [`Ldp.Http'] [Higlo] 0.10.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Higlo is an OCaml library for syntax highlighting. This release adds a simple commonmark lexer. [Higlo] [Chamo] 4.2.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Chamo is a source code editor, even if it can be used to edit any text file. A system of "views" allows to edit some kinds of files in specific views. It's like an Emacs where Lisp is replaced by OCaml, as it can be extended and customized in OCaml. This release is just an upgrade to Stk 0.4.0 and Xtmpl 1.0.0. [Chamo] MirageOS on OCaml 5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: shym announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On behalf of all the numerous developers involved, it=E2=80=99s my pleasu= re to announce that the MirageOS ecosystem has seen the long-running work to port to OCaml 5 come to fruition: `ocaml-solo5' v1.0 is now using OCaml 5.2.1! What is `ocaml-solo5' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C `ocaml-solo5' is an OCaml cross compiler for producing Solo5 unikernels. Solo5 is the basis for MirageOS unikernels when they are not compiled as programs to run on a regular OS. `ocaml-solo5' responds to specific unikernel constraints. In particular it provides a placeholder for the standard C library that is complete enough that we can build the OCaml runtime without a full POSIX system to support it. That OCaml runtime can then be linked statically to OCaml programs in order to produce unikernels. These constraints require us to keep track of developments of the OCaml compiler and particularly of its runtime. The major changes coming with OCaml 5 have required quite a lot of work (over 1 year) to bring our cross compiler up-to-date. It should be noted that `ocaml-solo5' is restricted to a single domain but it makes it possible to use the effects introduced with OCaml 5. MirageOS & OCaml 5 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C The long road to bring Mirage on OCaml 5 started with adding support for Thread-Local Storage (TLS) in Solo5. Even if Solo5 doesn=E2=80=99t su= pport the creation of threads, the OCaml 5 runtime stores domain-specific data, including for the first domain, in TLS. The main work was done in [solo5#546] and [solo5#542] with fixes in [solo5#551] and [solo5#554]. It was released with [Solo5 v0.8.0]. This foundational work on Solo5 unblocked the port of the compiler _per se_. As the OCaml runtime changed substantially between OCaml 4.x and 5.x, this required many changes in the minimal library, called `nolibc', that provides simple implementations and stubs for the part of the libc interface the runtime uses. In particular, the memory management of the runtime is very different from OCaml 4.x (which is natural, due to the multicore support): it uses the `mmap~/~munmap' functions instead of `malloc~/~free'. `mmap' is a very versatile interface, tightly tied to the virtual memory. Providing adequate (correct but still simple) implementations of `mmap~/~munmap' in the context of Solo5, _i.e._ without virtualisation of the memory, required a careful review of how the interface is actually used in the runtime. Besides that work on `nolibc', building an OCaml compiler targeting Solo5 also requires a few patches to the compiler build system. As much work has been happening upstream to fix issues in building a cross compiler, this was taken as an opportunity to write clean patches in order to contribute them upstream and simplify the future of OCaml/Solo5 (along with other cross-compiler projects). All this work has been combined in [ocaml-solo5#134], which built on and completed [ocaml-solo5#122], [ocaml-solo5#124] and [ocaml-solo5#129]. It was released in [ocaml-solo5 v1.0.0]. Now we are eager to learn how it behaves in your applications! Note in particular that, as already mentioned, the garbage collector is completely different from the one in OCaml 4. For example, the [Mirage website] currently runs the two versions, one on OCaml 4 and one on OCaml 5 with traffic being alternatively routed to one or the other, to monitor their behaviours. First experiments show that we must tweak the `space_overhead' parameter to have the OCaml 5 unikernel use the same amount of memory than the OCaml 4 one, at the price of some compute time. This generally means that you might have to experiment a bit if you run within very constrained memory limits. [solo5#546] [solo5#542] [solo5#551] [solo5#554] [Solo5 v0.8.0] [ocaml-solo5#134] [ocaml-solo5#122] [ocaml-solo5#124] [ocaml-solo5#129] [ocaml-solo5 v1.0.0] [Mirage website] How to give it a spin =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C To try the new OCaml 5, first create an OPAM switch [with OCaml 5.2.1]. Then, follow the standard procedure (see how to [install it] and how to [build an hello-world unikernel]). After installing `ocaml-solo5', you can check with `opam list ocaml-solo5' that it installed the version `1.x' of the package. [with OCaml 5.2.1] [install it] [build an hello-world unikernel] People involved =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Many people got involved at some point or another, either with code or comments, to that community effort (hopefully not forgetting anyone, in `sort' order): =E2=80=A2 Adam Steen =E2=80=A2 Adrian-Ken Rueegsegger =E2=80=A2 Christiano Haesbaert =E2=80=A2 Fabrice Buoro =E2=80=A2 Hannes Mehnert =E2=80=A2 Kate =E2=80=A2 Pierre Alain =E2=80=A2 Romain Calascibetta =E2=80=A2 Samuel Hym =E2=80=A2 S=C3=A9bastien Hinderer Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi camelers! :camel: The next Dune meeting is supposed to be on Wednesday, December, 25th, but since it is Christmas Day (a bank holiday for various countries), the meeting is cancelled. Next one will be on the January, 8th, 2025 :fireworks: Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Pragmatic Category Theory | Part 3: Associativity] =E2=80=A2 [Learn OCaml the Easy Way - Including the Hard Bits] =E2=80=A2 [MetAcsl v0.8 for Frama-C 30.0 Zinc] =E2=80=A2 [Saturn 1.0: Data structures for OCaml Multicore] =E2=80=A2 [Frama-Clang v0.0.17 for Frama-C 30.0~ Zinc] [the ocaml.org blog] [Pragmatic Category Theory | Part 3: Associativity] [Learn OCaml the Easy Way - Including the Hard Bits] [MetAcsl v0.8 for Frama-C 30.0 Zinc] [Saturn 1.0: Data structures for OCaml Multicore] [Frama-Clang v0.0.17 for Frama-C 30.0~ Zinc] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 17 to 24, 20= 24.

    dream-html and pure-html

    Yawar Amin announced

    [ANN] dream-html 3.8.0

    Happy to announce some added power to the form decoding functionality. Thre= e main things:

    1. Added Dream_html.form and query helper functio= ns to wrap extracting the data directly from the Dream request and decoding= it correspondingly from the body or query.
    2. Added the (monadic) chaining operator Dream_html= .Form.( let* ) and ok and error helpers to allow sophisticated sequential decoding where deco= ding of some fields depend on others.
    3. Added optional parameters to constrain and at l= east 0. Also added unix_tm type decoder to de= code timestamps into Unix.tm structs (not timezone-aware).

    The last example on the page shows a fairly soph= isticated form decoder which requires an id field and one or more of the fields days, weeks, months, and years, and fails if at= least one is not provided.

    Enjoy :slight_smile:

    Dune 3.17

    Etienne Marais announced

    The Dune team is happy to announce the release of Dune 3.17.1!= :camel:=20

    This patch release includes some bug fixes. To reduce computing time, it do= es not build .cmxs files anymore when the (no_dynlink) stanza is used. This change also corrects the semantic of the (no_= dynlink) stanza which was building .cmxs files even if it did not install them. Now, it = does not build nor install them.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • When a library declares (no_dynlink), then the .cmxs= file for it is no longer built. (#11176, @nojb)
      • Fix bug that could result in corrupted file copies by Dune, for example= when using the copy_files# stanza or the copy# action.= (@nojb, #11194, fixes #11193)
      • Remove useless error message when running $ dune subst in = empty projects. (@rgrinberg, #11204, fixes #11200)

    First release candidate of OCaml 5.3.0

    octachron announced

    The release of OCaml 5.3.0 is imminent.

    As a final step, we are publishing a release candidate to check that everyt= hing is in order before the release in the upcoming week(s).

    If you find any bugs, please report them on OCaml's issue tracker.

    Compared to the second beta, this release candidate contains a regression f= ix in the type system (some type expressions were not generalized when they= ought to be), one fix for the new check for dependency order at link time,= and a manual update.

    The full change log for OCaml 5.3.0 is available on GitHub. A short summary of the cha= nges since the second beta release is also available below.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.3.0~rc1
    

    The source code for the release candidate is also directly available on:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.3.0~rc1+options <=
      ;option_list>
      

      where <option_list> is a space-separated list of o= caml-option-* packages. For instance, for a flambda and= no-flat-float-array switch:

      opam switch create 5.3.0~rc1+flambda+nffa ocaml-variants.5.3.0~rc1+options =
      ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Changes since the second beta

    • Type system
      • #13690: som= e type expressions were incorrectly not generalized (because they were assigned to the wrong level pool)
    • Documentation
      • #13666: Rew= rite parts of the example code around nested lists in Chapter 6 (Polymorphism and its limitations -> Polymorphic recursion) giving the "depth" function [in the non-polymorphically-recursive part of the example] a much more sensible behavior; also fix a typo and some formatting. (Frank Steffahn, review by Florian Angeletti)
    • Compiler user-interface and warnings:
      • #12084, +#13669, +#13673: Check link ord= er when creating archive and when using ocamlopt.

    Pragmatic Category Theory | Part 3: Associativity

    Dmitrii Kovanikov announced

    Hi everyone! :wave:=20

    I've finished writing the third part of my Pragmatic Category Theory= series (some code examples are in OCaml):

    Previous discussion:

    P.S. I would've edited the previous topic instead of creating a new one but= looks like I haven't touched it for a while, so I can't edit the title and= the body anymore.

    ocaml-stk, xtmpl, stog, ocaml-css, ocaml-ldp, higlo and chamo<= /h2>

    Zoggy announced

    Hello,

    I made new releases for some libraries and tools. All are available in opam.

    OCaml-s= tk 0.4.0

    OCaml-stk is a library to build graphical user interfaces, based on SDL2. T= his release includes two new widgets:

    • a layers widget, allowing to display widgets in= 026; layers,
    • a xmlview widget (in stk_xml package), allowing to display XML (and so = XHTML) documents, handling CSS for styling and layout. The programmer can c= ustomize which widgets are created for each XML node, and add event handler= s on each node. See the "xmlview" example included in sources.

    This new release also comes with an inspection window for easier debugging.

    Complete list of changes is here.

    Xtmpl 1.0.0

    Xtmpl is a library to build, read and parse XML document. It provides a rewriting engine and templating facilities. This new release includes a big refactori= ng, using functors. This creates some incompatibilities with prior versions= . See = here for changes.

    Stog 1.1.0=

    Stog is a static web site compiler. It is able to handle blog posts as well= as regular pages or any XML document in general. This release upgrades to = Xtmpl 1.1.0 and includes small fixes (see here for details).

    OCaml-c= ss 0.3.0

    OCaml-css is an OCaml library to parse and print CSS. It can also expand na= mespaces and perform computations on property values. Parser can be extende= d by defining additional properties.

    This release includes various parsing fixes and adds new CSS properties: border-collapse, border-spacing, and opacity<= /code>. The complete list of changes is here.

    OCaml-l= dp 0.4.0

    This is a library to build LDP (L= inked Data Platform) and SOLID ap= plications, runnable either in standalone program (using packages ldp= _tls or ldp_curl) or in the browser (using package ldp_js with js_of_ocaml).=20

    This release includes only one fix in Ldp.Http module: when following redirection, resolve IRI in Location field of= response against original IRI.

    Higlo 0= .10.0

    Higlo is an OCaml library for syntax highlighting. This release adds a simp= le commonmark lexer.

    Chamo 4= .2.0

    Chamo is a source code editor, even if it can be used to edit any text file= . A system of "views" allows to edit some kinds of files in specific views.= It's like an Emacs where Lisp is replaced by OCaml, as it can be extended = and customized in OCaml.

    This release is just an upgrade to Stk 0.4.0 and Xtmpl 1.0.0.

    MirageOS on OCaml 5

    shym announced

    On behalf of all the numerous developers involved, it=E2=80=99s my pleasure= to announce that the MirageOS ecosystem has seen the long-running work to = port to OCaml 5 come to fruition: ocaml-solo5 v1.0 is now usin= g OCaml 5.2.1!

    What is ocaml-solo5

    ocaml-solo5 is an OCaml cross compiler for producing Solo5 uni= kernels. Solo5 is the basis for MirageOS unikernels when they are not compi= led as programs to run on a regular OS.

    ocaml-solo5 responds to specific unikernel constraints. In par= ticular it provides a placeholder for the standard C library that is comple= te enough that we can build the OCaml runtime without a full POSIX system t= o support it. That OCaml runtime can then be linked statically to OCaml pro= grams in order to produce unikernels.

    These constraints require us to keep track of developments of the OCaml com= piler and particularly of its runtime. The major changes coming with OCaml = 5 have required quite a lot of work (over 1 year) to bring our cross compil= er up-to-date.

    It should be noted that ocaml-solo5 is restricted to a single = domain but it makes it possible to use the effects introduced with OCaml 5.

    MirageOS & OCaml 5

    The long road to bring Mirage on OCaml 5 started with adding support for Th= read-Local Storage (TLS) in Solo5. Even if Solo5 doesn=E2=80=99t support th= e creation of threads, the OCaml 5 runtime stores domain-specific data, inc= luding for the first domain, in TLS. The main work was done in solo5#546 and solo5#542 with fixes in solo5#551 and solo5#554. It was released with Solo5 v0.8.0.

    This foundational work on Solo5 unblocked the port of the compiler per se. As the OCaml runtime changed substantially= between OCaml 4.x and 5.x, this required many changes in the minimal libra= ry, called nolibc, that provides simple implementations and st= ubs for the part of the libc interface the runtime uses. In particular, the= memory management of the runtime is very different from OCaml 4.x (which i= s natural, due to the multicore support): it uses the mmap~/~munmap functions instead of malloc~/~free. mmap is= a very versatile interface, tightly tied to the virtual memory. Providing = adequate (correct but still simple) implementations of mmap~/~munmap<= /code> in the context of Solo5, i.e. witho= ut virtualisation of the memory, required a careful review of how the inter= face is actually used in the runtime.=20

    Besides that work on nolibc, building an OCaml compiler target= ing Solo5 also requires a few patches to the compiler build system. As much= work has been happening upstream to fix issues in building a cross compile= r, this was taken as an opportunity to write clean patches in order to cont= ribute them upstream and simplify the future of OCaml/Solo5 (along with oth= er cross-compiler projects).

    All this work has been combined in ocaml-solo5#134, which built on and completed ocaml-solo5#122, <= a href=3D"https://github.com/mirage/ocaml-solo5/pull/124">ocaml-solo5#124 and ocaml-sol= o5#129. It was released in ocaml-solo5 v1.0.0.

    Now we are eager to learn how it behaves in your applications! Note in part= icular that, as already mentioned, the garbage collector is completely diff= erent from the one in OCaml 4. For example, the Mirage website currently runs the two versions, one on OCaml 4 and = one on OCaml 5 with traffic being alternatively routed to one or the other,= to monitor their behaviours. First experiments show that we must tweak the= space_overhead parameter to have the OCaml 5 unikernel use th= e same amount of memory than the OCaml 4 one, at the price of some compute = time. This generally means that you might have to experiment a bit if you r= un within very constrained memory limits.

    How to give it a spin

    To try the new OCaml 5, first create an OPAM switch with OCaml 5.2.1. Then, fol= low the standard procedure (see how to install it and how to build an hello-world unikernel). After installing ocaml-solo= 5, you can check with opam list ocaml-solo5 that it ins= talled the version 1.x of the package.

    People involved

    Many people got involved at some point or another, either with code or comm= ents, to that community effort (hopefully not forgetting anyone, in s= ort order):

    • Adam Steen
    • Adrian-Ken Rueegsegger
    • Christiano Haesbaert
    • Fabrice Buoro
    • Hannes Mehnert
    • Kate
    • Pierre Alain
    • Romain Calascibetta
    • Samuel Hym
    • S=C3=A9bastien Hinderer

    Dune dev meeting

    Etienne Marais announced

    Hi camelers! :camel: The next Dune meeting is supposed to be on Wednesday, December, 25th, but s= ince it is Christmas Day (a bank holiday for various countries), the meetin= g is cancelled. Next one will be on the January, 8th, 2025 :fireworks:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=dOTQUVgw; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=cmWzaqXA; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A929348E3C for ; Tue, 31 Dec 2024 08:03:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=9Cs7ACp1P+Aoa3FZvpVb6lOZVyv+53eaoA2F9QmtCGQ=; b=dOTQUVgwOZoyyp6/JXCDfg0nV1inkm91J91w5+bfceh2ilkcjpTTpZDK /kJPrsWp8VH8gocVxlU1e+NBwv8UcBjsE6cf7aVQ/RCviRgzgQybm+a8s 1cJhJebJXzZovMI0iwxYy/2ffdWQwTAFbr9v8rec5cTz4szL6apI1YQpp g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,278,1728943200"; d="scan'208,217";a="201074904" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 31 Dec 2024 09:03:56 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 4306DE0077; Tue, 31 Dec 2024 09:03:55 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0817EE0077 for ; Tue, 31 Dec 2024 09:03:52 +0100 (CET) IronPort-SDR: 6773a566_ix7pcP7lmk8jB49tR6tlAKL3I9CXlZsBEaCYq5T7lQJJV19 BJ2xYEQBXQ/bpNQOue0fDCtrqhYQbN2soUXiTpA== X-IPAS-Result: =?us-ascii?q?A0FQCQAqpHNndyIeaIFaFoJIgT+BAxkBXQZaMwcISIRWg?= =?us-ascii?q?0+OH5xFgywiEgMBAwENLgEOBAECBAEBAwECAYUAGIpaAh8GAQQ0EwECBAEBA?= =?us-ascii?q?QEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAUNJhXsNSQEBBAsBgWoZOHGBJ?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMA?= =?us-ascii?q?RmBDgoTAQE4GCMDEAQHAwIEDQE1FwESGoJogh9FAwQBDAaXYpp4BU56gTKBA?= =?us-ascii?q?YIMAQEGgQg+AwsCAgMPLgHaBoEaSglBbxiFa4JJGgEqSGoChEiEPCcPgVVEg?= =?us-ascii?q?RWCeW+CAj0LCwwCAQFcYAEBCEWDLoJpgjmCZoJsgQyDfoM0EAKBZoJfgT+BL?= =?us-ascii?q?4MXjGGBRyIDJjMsAVUTFwsHBWGBEgMuNjGDYIECOYIRaUk3Ag0CNoIgJFiCT?= =?us-ascii?q?YNZgT6EXoRVhhmCF4IWgggdQAMLbT03FBudEgEJNEYBRoMlDjhSSyIBAQRUO?= =?us-ascii?q?QcDFjdKNhKSdgOeA5NTgQo0B4QdgV0GDIkFgSSVe4QEgVekdyKYWiKCNYclg?= =?us-ascii?q?SUJglmVU4VWgX4jgSseDAczGjBDgjMBATIJRhwPV4wnhRoDgT6DGzuqF0I1A?= =?us-ascii?q?gEBOAIHAQoBAQMJhUUdAQGDBIIXhSWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 w== IronPort-HdrOrdr: A9a23:j+qUzquGwhtFHSqRsR4meHyR7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: 9a23:QjPboGxo8G01MtatetyxBgVPC9seMWHv9k77MmyqAnZpbpLSGFOfrfY= X-Talos-MUID: 9a23:bxFP6QvLXQyv5eWFhs2ntg5kJOcwu4aVLUkSr7sile6eKQ9SNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,278,1728943200"; d="scan'208,217";a="105309484" X-MGA-submission: =?us-ascii?q?MDF/naGVNmUUf9UMwYHNy+LDdwFRKu9dDTA2rT?= =?us-ascii?q?39dHpsRrEjSg7ySdQVpiT9wyfjv0N/vZ7AEw0KRLmPcKcSYgtYiN8E6R?= =?us-ascii?q?wTyqDqkSnCxW7QBx/23CP8gvebwbDCQgB0vXeE+bTwFE1jnK2LDvmC9g?= =?us-ascii?q?atwQQr+RikzCP3P72aS75Twg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Dec 2024 09:03:51 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 62DFD564A6C; Tue, 31 Dec 2024 09:03:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1735632229; bh=lh42Kyyj3y9swjpM0F3mIsqOxcwAs5QEdjS0cFkBTmY=; h=From:To:Subject:Date:Message-ID; b=cmWzaqXAZF8o7/DOQqAq9WeYvewGjikb5O9vB/n2hXwQBzsY5hOb0c0jIS2ehczJw kQKs0tkd7EIIC8r0VmOj/Zt7FcKkNsDkBizc5KZ1xZ45Ho7UuyjyhnPPC1ZTnWPvWh GOu+xS20fqCdA+Pz9XE5NbUqyLxz2guaCi00ko/E= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 31 Dec 2024 09:03:48 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 31 09:03:49 2024 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499452, queueID=A2670564A81 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19244 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMjQgdG8gMzEsDQoyMDI0Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClVzaW5n IFByb3BlcnR5LUJhc2VkIFRlc3RpbmcgdG8gVGVzdCBPQ2FtbCA1DQpGaXJzdCByZWxlYXNlIG9m IGVsbV9wbGF5Z3JvdW5kDQpGaXJzdCByZWxlYXNlIG9mIGZsYXR1bmlvbmZpbmQNClNlcnZpbmcg VGhpcyBBcnRpY2xlIGZyb20gUkFNIHdpdGggRHJlYW0gZm9yIEZ1biBhbmQgTm8gUmVhbCBCZW5l Zml0DQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KVXNpbmcgUHJvcGVydHktQmFzZWQg VGVzdGluZyB0byBUZXN0IE9DYW1sIDUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy11c2luZy1wcm9wZXJ0eS1iYXNl ZC10ZXN0aW5nLXRvLXRlc3Qtb2NhbWwtNS8xNDU1MC8yPg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHdyaXR0ZW4gdXAgcGFydCAyIG9uIG91ciBl ZmZvcnQgdG8gdXRpbGl6ZSBwcm9wZXJ0eS1iYXNlZCB0ZXN0aW5nDQogIHRvIHN0cmVzcyB0ZXN0 IHRoZSBPQ2FtbCA1IHJ1biB0aW1lIHN5c3RlbS4gSGFwcHkgQ2hyaXN0bWFzIHJlYWRpbmchDQog IPCfjoTwn46FIPCfjoEg8J+YhA0KDQogIDxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNC0x Mi0yMy1tdWx0aWNvcmUtcHJvcGVydHktYmFzZWQtdGVzdHMtZm9yLW9jYW1sLTUtY2hhbGxlbmdl cy1hbmQtbGVzc29ucy1sZWFybmVkLz4NCg0KDQpGaXJzdCByZWxlYXNlIG9mIGVsbV9wbGF5Z3Jv dW5kDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1maXJzdC1yZWxlYXNlLW9mLWVsbS1w bGF5Z3JvdW5kLzE1ODM4LzE+DQoNCg0KWW9hbm4gUGFkaW9sZWF1IGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhlIGZpcnN0 IHJlbGVhc2Ugb2YgYGVsbV9wbGF5Z3JvdW5kJywNCiAgYW4gT0NhbWwgcGFja2FnZSB0aGF0IGFs bG93cyB5b3UgdG8gZWFzaWx5IGNyZWF0ZSAvcGljdHVyZXMvLA0KICAvYW5pbWF0aW9ucy8sIGFu ZCBldmVuIC92aWRlbyBnYW1lcy8gaW4gYSBwb3J0YWJsZSB3YXkgdXNpbmcgYW4gQVBJDQogIHRo YXQgcmVhbGx5IHNpbXBsaWZpZXMgaG93IHRvIHZpZXcgdGhlIGNvbXB1dGVyIGFuZCBpdHMgZGV2 aWNlcyAodGhlDQogIHNjcmVlbiwga2V5Ym9hcmQsIGFuZCBtb3VzZSkuIFRoZSBsaWJyYXJ5IG9m ZmVycyBhIG5hdGl2ZSBiYWNrZW5kIHRvDQogIHJ1biB0aGUgZ2FtZXMgZnJvbSBhIHRlcm1pbmFs IGFuZCBhIHdlYiBiYWNrZW5kIHRvIHJ1biB0aGUgZ2FtZXMgaW4NCiAgeW91ciBicm93c2VyLg0K DQogIFRoaXMgaXMgYSBwb3J0IG9mIHRoZSBleGNlbGxlbnQgRWxtIHBsYXlncm91bmQgcGFja2Fn ZQ0KICA8aHR0cHM6Ly9naXRodWIuY29tL2V2YW5jei9lbG0tcGxheWdyb3VuZD4gdG8gT0NhbWwu DQoNCiAgWW91IGNhbiBpbnN0YWxsIGl0IHZpYSBPUEFNIHZpYSBgb3BhbSBpbnN0YWxsIGVsbV9w bGF5Z3JvdW5kJy4NCg0KICBIZXJlIGFyZSBhIGZldyBleGFtcGxlcyBvZiBjb2RlIHVzaW5nIHRo ZSBsaWJyYXJ5Lg0KDQogIEZpcnN0IGEgInBpY3R1cmUiIGFwcDoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCICgqIGZyb20gaHR0cHM6Ly9lbG0tbGFuZy5vcmcvZXhhbXBsZXMvcGljdHVyZSAq KQ0KICDilIIgb3BlbiBQbGF5Z3JvdW5kDQogIOKUgiANCiAg4pSCIGxldCBhcHAgPQ0KICDilIIg ICBwaWN0dXJlIFsNCiAg4pSCICAgICByZWN0YW5nbGUgYnJvd24gNDAuIDIwMC4NCiAg4pSCICAg ICAgIHw+IG1vdmVfZG93biA4MC47DQogIOKUgiAgICAgY2lyY2xlIGdyZWVuIDEwMC4NCiAg4pSC ICAgICAgIHw+IG1vdmVfdXAgMTAwLjsNCiAg4pSCICAgXQ0KICDilIIgDQogIOKUgiBsZXQgbWFp biA9IFBsYXlncm91bmRfcGxhdGZvcm0ucnVuX2FwcCBhcHANCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgPGh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4uY29tL2ZsZXgwMjAvdXBsb2Fkcy9vY2Ft bC9vcHRpbWl6ZWQvMlgvNy83NmZjMTk5MGZlMTE2OTExMDk3NzY0ZGY5ODZmNjRmZWQ0MWMyOGE0 XzJfNDcweDUwMC5wbmc+DQoNCiAgVGhlbiBhbiAiYW5pbWF0aW9uIiBhcHA6DQogIOKUjOKUgOKU gOKUgOKUgA0KICDilIIgKCogZnJvbSBodHRwczovL2VsbS1sYW5nLm9yZy9leGFtcGxlcy9hbmlt YXRpb24gKikNCiAg4pSCIG9wZW4gUGxheWdyb3VuZA0KICDilIIgDQogIOKUgiBsZXQgdmlldyB0 aW1lID0gWw0KICDilIIgICAgIG9jdGFnb24gZGFya0dyYXkgMzYuDQogIOKUgiAgICAgICB8PiBt b3ZlX2xlZnQgMTAwLg0KICDilIIgICAgICAgfD4gcm90YXRlIChzcGluIDMuIHRpbWUpOw0KICDi lIIgICAgIG9jdGFnb24gZGFya0dyYXkgMzYuDQogIOKUgiAgICAgICB8PiBtb3ZlX3JpZ2h0IDEw MC4NCiAg4pSCICAgICAgIHw+IHJvdGF0ZSAoc3BpbiAzLiB0aW1lKTsNCiAg4pSCICAgICByZWN0 YW5nbGUgcmVkIDMwMC4gODAuDQogIOKUgiAgICAgICB8PiBtb3ZlX3VwICh3YXZlIDUwLiA1NC4g Mi4gdGltZSkNCiAg4pSCICAgICAgIHw+IHJvdGF0ZSAoemlnemFnICgtLiAyLikgMi4gOC4gdGlt ZSk7DQogIOKUgiAgIF0NCiAg4pSCIA0KICDilIIgbGV0IGFwcCA9DQogIOKUgiAgIGFuaW1hdGlv biB2aWV3DQogIOKUgiANCiAg4pSCIGxldCBtYWluID0gUGxheWdyb3VuZF9wbGF0Zm9ybS5ydW5f YXBwIGFwcA0KICDilJTilIDilIDilIDilIANCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNl LWNkbi5jb20vZmxleDAyMC91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC9lL2U5MTU2M2NiYjZh MDg2MzU3MGJiYjE5YjA1N2Y1ZThkYWU3MTY0YmZfMl80NzB4NTAwLnBuZz4NCg0KICBBbmQgZmlu YWxseSBhICJnYW1lIiBhcHA6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogZnJvbSBodHRw czovL2VsbS1sYW5nLm9yZy9leGFtcGxlcy9tb3VzZSAqKQ0KICDilIIgb3BlbiBQbGF5Z3JvdW5k DQogIOKUgiANCiAg4pSCIGxldCB2aWV3IF9jb21wdXRlciAoeCwgeSkgPSBbIA0KICDilIIgICBz cXVhcmUgYmx1ZSA0MC4NCiAg4pSCICAgIHw+IG1vdmUgeCB5DQogIOKUgiAgXQ0KICDilIIgDQog IOKUgiBsZXQgdXBkYXRlIGNvbXB1dGVyICh4LCB5KSA9DQogIOKUgiAgICh4ICsuIHRvX3ggY29t cHV0ZXIua2V5Ym9hcmQsIHkgKy4gdG9feSBjb21wdXRlci5rZXlib2FyZCkNCiAg4pSCIA0KICDi lIIgbGV0IGFwcCA9IA0KICDilIIgICBnYW1lIHZpZXcgdXBkYXRlICgwLiwgMC4pDQogIOKUgiAN CiAg4pSCIGxldCBtYWluID0gUGxheWdyb3VuZF9wbGF0Zm9ybS5ydW5fYXBwIGFwcA0KICDilJTi lIDilIDilIDilIANCg0KICA8aHR0cHM6Ly9nbG9iYWwuZGlzY291cnNlLWNkbi5jb20vZmxleDAy MC91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC8yLzI0ZThmZmU2NzJjZGE2NmM2YTQ5ZTAyMDEz MzQ3Y2RhMDY0MGY3NzFfMl80NzB4NTAwLnBuZz4NCg0KICBOb3RlIHRoYXQgeW91IGNhbiB3cml0 ZSBtb3JlIGNvbXBsZXggZ2FtZXMuIEZvciBleGFtcGxlIGhlcmUgaXMgYQ0KICBzY3JlZW5zaG90 IG9mIGEgdG95IHRldHJpcyBhcHA6DQoNCiAgPGh0dHBzOi8vZ2xvYmFsLmRpc2NvdXJzZS1jZG4u Y29tL2ZsZXgwMjAvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC80LzRkZWQxZDU1Yzk5OTQ5MzVj NWVjMzc4NmFlNTQ5YmEzYTcxYjhlYjYucG5nPg0KDQogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBm b2xsb3cgdGhlIFJFQURNRSBhdA0KICA8aHR0cHM6Ly9naXRodWIuY29tL2FyeXgvb2NhbWwtZWxt LXBsYXlncm91bmQ+DQoNCiAgQW5kIG1lcnJ5IGNocmlzdG1hcyENCg0KDQpGaXJzdCByZWxlYXNl IG9mIGZsYXR1bmlvbmZpbmQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWZpcnN0LXJlbGVh c2Utb2YtZmxhdHVuaW9uZmluZC8xNTg0Ny8xPg0KDQoNCkZyYW7Dp29pcyBQb3R0aWVyIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBwbGVhc2VkIHRvIGFubm91bmNl IHRoZSBmaXJzdCByZWxlYXNlIG9mIGBmbGF0dW5pb25maW5kJywgYSBzbWFsbA0KICBsaWJyYXJ5 IHRoYXQgb2ZmZXJzIGEgdW5pb24tZmluZCBkYXRhIHN0cnVjdHVyZSwgc3RvcmVkIGluc2lkZSBh DQogIHZlY3Rvci4NCg0KICBUaGlzIGxpYnJhcnkgaXMgYW4gYWx0ZXJuYXRpdmUgdG8gbXkgZXhp c3RpbmcgbGlicmFyeSBgdW5pb25GaW5kJywgYW5kDQogIGNvdWxkIGJlIGZhc3RlciBvciBzbG93 ZXIsIGRlcGVuZGluZyBvbiB5b3VyIHVzZSBjYXNlLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDi lIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gaW5zdGFsbCBmbGF0dW5pb25maW5kDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgdGhlIFtkb2N1bWVudGF0 aW9uXS4NCg0KICBIYXBweSB1bmlvbnMgYW5kIGZpbmRzLCBGUC4NCg0KDQpbZG9jdW1lbnRhdGlv bl0NCjxodHRwczovL2NhbWJpdW0uaW5yaWEuZnIvfmZwb3R0aWVyL2ZsYXR1bmlvbmZpbmQvZG9j L2ZsYXR1bmlvbmZpbmQvPg0KDQoNClNlcnZpbmcgVGhpcyBBcnRpY2xlIGZyb20gUkFNIHdpdGgg RHJlYW0gZm9yIEZ1biBhbmQgTm8gUmVhbCBCZW5lZml0DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3NlcnZpbmctdGhpcy1hcnRpY2xlLWZyb20tcmFtLXdpdGgtZHJlYW0tZm9yLWZ1bi1hbmQtbm8t cmVhbC1iZW5lZml0LzE1ODU2LzE+DQoNCg0KVGhvbWFzIExldGFuIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgSeKAmXZlIGJlZW4gcGxheWluZyB3aXRoIG15IHdlYnNpdGUgbGF0ZWx5LCBtb3Jl IHByZWNpc2VseSBvbiBob3cgdGhlDQogIGNvbnRlbnRzIGlzIGRlbGl2ZXJlZCB0byB0aGUgcmVh ZGVycy4gQmVmb3JlLCBpdCB3YXMgbWVyZWx5IGEgYm9yaW5nLA0KICBzdGF0aWMgd2Vic2l0ZSBk ZWxpdmVyZWQgYnkgTmdpbng7IG5vdyBpdOKAmXMgYSBEcmVhbS1wb3dlcmVkIEhUVFANCiAgc2Vy dmVyIHdpdGggYWxsIHRoZSBwYWdlcyBpbi1tZW1vcnkuDQoNCiAgW0nigJl2ZSB3cml0dGVuIGFi b3V0IHRoaXMgZnVuLCBsaXR0bGUgcHJvamVjdF0sIGFuZCB5b3UgbWF5IGZpbmQgdGhlDQogIGFy dGljbGUgaW50ZXJlc3RpbmcuIEl0IGNvdmVycyBzZXZlcmFsIHRvcGlzOiBmdW4gZXhwZXJpbWVu dHMgd2l0aCB0aGUNCiAgRHJlYW0gbGlicmFyeSwgSFRUUCBhcmNhbmUgb25lIGNhbm5vdCBpZ25v cmUgaWYgdGhleSB3YW50IHRvIGltcGxlbWVudA0KICBhIGJyb3dzZXItZnJpZW5kbHkgc2VydmVy LCBhbmQgZXZlbiBzb21lIERvY2tlciBiZWNhdXNlIHdoeSBub3QhDQoNCiAgSGFwcHkgaG9saWRh eXMgZXZlcnlvbmUhDQoNCg0KW0nigJl2ZSB3cml0dGVuIGFib3V0IHRoaXMgZnVuLCBsaXR0bGUg cHJvamVjdF0NCjxodHRwczovL3NvYXAuY29mZmVlL35sdGhtcy9wb3N0cy9EcmVhbVdlYnNpdGUu aHRtbD4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVk IGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKAoiBbU2VydmluZyBUaGlzIEFydGlj bGUgZnJvbSBSQU0gd2l0aCBEcmVhbSBmb3IgRnVuIGFuZCBObyBSZWFsDQogICAgQmVuZWZpdF0N CiAg4oCiIFtNdWx0aWNvcmUgUHJvcGVydHktQmFzZWQgVGVzdHMgZm9yIE9DYW1sIDU6IENoYWxs ZW5nZXMgYW5kIExlc3NvbnMNCiAgICBMZWFybmVkXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2dd IDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1NlcnZpbmcgVGhpcyBBcnRpY2xlIGZyb20g UkFNIHdpdGggRHJlYW0gZm9yIEZ1biBhbmQgTm8gUmVhbCBCZW5lZml0XQ0KPGh0dHBzOi8vc29h cC5jb2ZmZWUvfmx0aG1zL3Bvc3RzL0RyZWFtV2Vic2l0ZS5odG1sPg0KDQpbTXVsdGljb3JlIFBy b3BlcnR5LUJhc2VkIFRlc3RzIGZvciBPQ2FtbCA1OiBDaGFsbGVuZ2VzIGFuZCBMZXNzb25zDQpM ZWFybmVkXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTEyLTIzLW11bHRpY29yZS1w cm9wZXJ0eS1iYXNlZC10ZXN0cy1mb3Itb2NhbWwtNS1jaGFsbGVuZ2VzLWFuZC1sZXNzb25zLWxl YXJuZWQ+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhh cHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwg bWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3Ig dGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2gg dG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRv IHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVz c2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJj aGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9m IHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+ DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1s aXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoN Cg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 24 to 31, 20= 24.

    Using Property-Based Testing to Test OCaml 5

    Jan Midtgaard announced

    I've written up part 2 on our effort to utilize property-based testing to s= tress test the OCaml 5 run time system. Happy Christmas reading! =F0=9F=8E= =84=F0=9F=8E=85 =F0=9F=8E=81 =F0=9F=98=84

    https://tarides.com/blog/20= 24-12-23-multicore-property-based-tests-for-ocaml-5-challenges-and-lessons-= learned/

    First release of elm_playground

    Yoann Padioleau announced

    It is my pleasure to announce the first release of elm_playground, an OCaml package that allows you to easily create pictures, = animations, and even video games in a portable way using an API = that really simplifies how to view the computer and its devices (the screen= , keyboard, and mouse). The library offers a native backend to run the game= s from a terminal and a web backend to run the games in your browser.

    This is a port of the excellent Elm playground package https://github.com/eva= ncz/elm-playground to OCaml.

    You can install it via OPAM via opam install elm_playground.

    Here are a few examples of code using the library.

    First a "picture" app:

    (* from ht=
    tps://elm-lang.org/examples/picture *)
    open Playground
    
    let app =3D
      picture [
        rectangle brown 40. 200.
          |> move_down 80.;
        circle green 100.
          |> move_up 100.;
      ]
    
    let main =3D Playgr=
    ound_platform.run_app app
    

    3D"76=

    Then an "animation" app:

    (* from ht=
    tps://elm-lang.org/examples/animation *)
    open Playground
    
    let view time =3D [
        octagon darkGray 36.
          |> move_left 100.
          |> rotate (spin 3. time);
        octagon darkGray 36.
          |> move_right 100.
          |> rotate (spin 3. time);
        rectangle red 300. 80.
          |> move_up (wave 50. 54. 2.=
     time)
          |> rotate (zigzag (-. 2.) 2=
    . 8. time);
      ]
    
    let app =3D
      animation view
    
    let main =3D Playgr=
    ound_platform.run_app app
    

    3D"e9=

    And finally a "game" app:

    (* from ht=
    tps://elm-lang.org/examples/mouse *)
    open Playground
    
    let view _computer<=
    /span> (x, y) =3D [=20
      square blue 40.
       |> move x y
     ]
    
    let update computer=
     (x, y) =3D
      (x +. to_x computer.keyboard, y +. to_y computer.keyboard)
    
    let app =3D=20
      game view update (0., 0.)
    
    let main =3D Playgr=
    ound_platform.run_app app
    

    3D"24=

    Note that you can write more complex games. For example here is a screensho= t of a toy tetris app:

    3D"4ded1d55c9994=

    For more information, follow the README at https://github.com/aryx/ocaml-elm-playground=20

    And merry christmas!

    First release of flatunionfind

    Fran=C3=A7ois Pottier announced

    I am pleased to announce the first release of flatunionfind, a= small library that offers a union-find data structure, stored inside a vec= tor.

    This library is an alternative to my existing library unionFind, and could be faster or slower, depending on your use case.

    opam update
    opam install flatunionfind
    

    For more information, see the documentation.

    Happy unions and finds, FP.

    Serving This Article from RAM with Dream for Fun and No Real B= enefit

    Thomas Letan announced

    I=E2=80=99ve been playing with my website lately, more precisely on how the= contents is delivered to the readers. Before, it was merely a boring, stat= ic website delivered by Nginx; now it=E2=80=99s a Dream-powered HTTP server= with all the pages in-memory.

    I=E2=80=99ve= written about this fun, little project, and you may find the article i= nteresting. It covers several topis: fun experiments with the Dream library= , HTTP arcane one cannot ignore if they want to implement a browser-friendl= y server, and even some Docker because why not!

    Happy holidays everyone!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=YZgGtgib; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=5yTXJk5E; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 315D4417D0 for ; Tue, 7 Jan 2025 17:26:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=21Uo3sTZ0kTyLppe4ZASECQsDHlmqYKkNBPWmNr1dIg=; b=YZgGtgibYnw452fcSVs9LikxaKTu5bCNaoqrDUL073W2B+15KHgjNJAa g9pf6zwM/4deq/Ek90ABhi75AYWrQ9y4yx04jP1jvVPteFRchbo5peZqF 6BRXmhckxuDvYug9nP9vjgJhmUdMR91UwPxA8XVIZq3oI8kL/lKTG+hrG 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,296,1728943200"; d="scan'208,217";a="201908207" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Jan 2025 18:26:54 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id DE4BAE0D20; Tue, 7 Jan 2025 18:26:53 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 79277E0077 for ; Tue, 7 Jan 2025 18:26:52 +0100 (CET) IronPort-SDR: 677d63db_1RwWbYph5YlwVKneMbOf+mDZ/q2NUG7R4/M4YxeBytOU+5i MNwBat7Xo2ucS9l/2HZ0M3YQIjFSvWOb7tpV+cw== X-IPAS-Result: =?us-ascii?q?A0HQEABKY31ngSIeaIFaFoJGAoE/WygZAV0GWjMHCEgDh?= =?us-ascii?q?FODT44fnEWCewMuIxEDAQMBDS4BBQ0BAgQBAQMBAgGEOkYCinUCHwYBBDMGD?= =?us-ascii?q?gECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9BUmFew1JAQEEC?= =?us-ascii?q?wEEAYFlGThBMHQBAQEBAQEBAQEnAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQIMATMrQAkKEwEBOBgjAxAEAQYDAhEBNQMBE?= =?us-ascii?q?wESFAaCD1mCH0UDBAEMBpVHmngFTnqBMoEBggwBAQaBCD4CAQsCBQEOCSbaB?= =?us-ascii?q?oEaSglBgQcBhWqCSRoBKkhqhEqEPCcPgVVEgRWCeW+CPwsXAgEBGEJiAQFNC?= =?us-ascii?q?YMlgmmCN4FIg26BbIRohWQ7HS+BVVmOCoFHIgMmMywBVRMXCwcFYYESAy02M?= =?us-ascii?q?YFRezmCDWlLNwINAjWCHiRYgiuDH4E9hEeEWIVogheCGYJWHUADC209NxQbm?= =?us-ascii?q?ycBCTQ2ATyCcwkmDjgIPDcVBhMICgQCIDAIDjUyDQUFBBsCLQgDOpJAHQkWL?= =?us-ascii?q?JMZij6UXTQHhB6BXQYMiQWBJJV7hASBV4svhwCSSSKYWiKJW4ElCWCBeZVTO?= =?us-ascii?q?WKEO4F9JDyBDQwHMxowQ4JnCQo8HA+OLAEWg1UDQX2DGzuCba0PQjUCAQEEN?= =?us-ascii?q?AIHAQoBAQMJhUUdAQGDBIIXg32BEIFDCAEB?= IronPort-PHdr: A9a23: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 pYXiBrT3rCmO5kYVjL8SCU1Rg== IronPort-Data: A9a23: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 wQ= IronPort-HdrOrdr: A9a23:ihqcLKtFaukVdofoHFbcsvmW7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3AFqufB2nalSbolMLVWUWGtLheOdPXOSWGwXj5fU3?= =?us-ascii?q?7M3xKEuTMSXaq9P1gjdU7zg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3ATom7lAwL6XNktNhiHK8dcODo7LSaqKmfURk3rMk?= =?us-ascii?q?mgvnaFAV7MhqFlQmKRIByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,296,1728943200"; d="scan'208,217";a="201908185" X-MGA-submission: =?us-ascii?q?MDFOzda/2/yJZtv9GBsNT0rEHty8sRYwg3DSKN?= =?us-ascii?q?Y1YGL2+awXNSQH7QQ6LMuHbLmu1mJSeCkLuzgrQakaFN62jPlABqz5Yc?= =?us-ascii?q?ZIHsfTaVYHnx3mJvVd3CQppnDVHDxJf+IMf4ggAfr9iiL5aJcPVy6xkd?= =?us-ascii?q?FYs4mf45gMOgaRosQ5x1x+jA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Jan 2025 18:26:51 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 78B81564AAE; Tue, 7 Jan 2025 18:26:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1736270810; bh=jtBq4n2lCOzXZ5u/8J392t6w3r9BggsJY5UMCM3o+9M=; h=From:To:Subject:Date:Message-ID; b=5yTXJk5EI5SSlbEB1vI816dlXSXuw1v4j10VWFdQ8mh4VzCmSTEwTcy4O726p81b8 QnBvmoItjhyBUztlRT9KPIFKECYwUPoYYAnnOLUeS/u7HOmt+06Yr5zkCcDjZi9kc1 dZgCfKdp1tQQVsLhWgI5JRxrsr53Sw/uUHCwOvW0= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 07 Jan 2025 18:26:50 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 7 18:26:50 2025 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.449040, queueID=C1E45564AB0 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19247 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 31, 2024 to January 07, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Playing with Windows on ARM64 Opam repository archival, Phase 1: unavailable packages CCL: Categorical Configuration Language Dune dev meeting "Cram tests: a hidden gem of dune" and "Snapshot tests for your own ppx" Other OCaml News Old CWN Playing with Windows on ARM64 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David Allsopp announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Following on from the teaser in , if you're lucky enough to have an ARM64 Windows machine, it's just about possible to get a few opam packages installed and working it! You'll need Visual Studio 2022 (Community) with the following packages: =E2=80=A2 `MSVC v143 - VS 2022 C++ ARM64/ARM64EC build tools (Latest)' =E2=80=A2 `MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)' =E2=80=A2 `C++/CLI support for v143 build tools (Latest)' =E2=80=A2 `C++ Clang Compiler for Windows (18.1.8)' _That's not a typo_: you need Clang _and_ *both* the x64/x86 and ARM64 MSVC packages Install Git for Windows as normal (`winget install Git.Git', etc.) and [Cygwin] (adding the `make' and `patch' packages - no compilers or libraries needed, it's just to get the shell). Clone [my opam fork] and check out branch [windows-on-arm64]. From a Cygwin bash terminal, `cd' to that clone and run `make cold'. After a little while, that should leave an ARM64 `opam.exe' in the current directory which should be copied to a location which you then add to `PATH'. From Cmd/PowerShell, you can now run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 PS > opam init --bare =E2=94=82 PS > opam switch create --empty windows-on-arm64 =E2=94=82 PS > opam pin add --yes ocaml-variants git+https://github.com/d= ra27/ocaml.git#windows-on-arm64 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dune needs a trivial pin (which I think may be more to do with a recent Windows SDK issue, than arm64-specific): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 PS > opam pin add dune git+https://github.com/dra27/dune.git#wi= ndows-on-arm64 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Unfortunately, it's not quite enough to get opam's dependencies installing through opam (`dose3' failed for me, which is odd because it works with `make cold' and `topkg' was freezing, although that's less surprising). But it's kinda cool how much is working straightaway, and it certainly looks like we'll have native Windows ARM64 support at some point in the future, therefore! Aside from the usual "packages which don't work properly" issue, there're two glaring problems: 1. It should be possible to install the x86 / x64 compilers, but at present this doesn't work because the opam compiler packages need further tweaking[^1] 2. Only Clang-pretending-to-be-`cl' is supported at the moment - I can't see any reason that Clang-pretending-to-be-`gcc' shouldn't be doable, but as we don't presently support that for x64 either (and it necessarily needs MSYS2, rather than Cygwin), I haven't disappeared down that rabbit hole yet[^2] :warning: I have no timeline for upstreaming any of this, but it's all publicly pushed and welcome to anyone to extend to a mergeable state! [^1]: I'll likely get to that at some point soon, as that unblocks general use of OCaml on Windows ARM64 machines, even if not _native_ ARM64 use. However, it exceeds "fun messing around over Christmas and New Year"! [^2]: See 1=E2=80=A6 [Cygwin] [my opam fork] [windows-on-arm64] Opam repository archival, Phase 1: unavailable packages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's done. It's done. It's done. Happy new year! We just merged the removal of the above mentioned uninstallable packages from opam-repository. In case you want to get these old opam files, please use: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam repository add opam-archive https://github.com/ocaml/opam-= repository-archive.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Each of the opam files now include the two additional fields: (a) a x-reason-for-archival and (b) an x-opam-repository-commit-hash-at-time-of-archiving (as described in = ). We also pushed the tag '2025-01-before-archiving-phase1' to the main opam-repository. Statistics of opam files and unique packages =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 date (January 1st) opam files unique packages=20 =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 phase1 28863 4805=20 2025 33033 4973=20 2024 29942 4572=20 2023 25983 4126=20 2022 21418 3647=20 2021 16632 3156=20 2020 12998 2554=20 2019 10236 2192=20 2018 8110 1878=20 2017 5966 1458=20 2016 4308 1086=20 2015 3081 823=20 2014 1856 593=20 2013 485 486=20 =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94= =81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81= =E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2= =94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81=E2=94=81 This shows that the amount of opam files are now back to mid-2023, while in the unique packages we're in mid-2024. Next steps =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Next steps and call to action: =E2=80=A2 by January 15th we'll have a list of packages that require OCam= l < 4.08 (plus those packages that were marked unavailable between December 15th and January 15th) =E2=80=A2 please mark your packages with [`x-maintenance-intent'] or `fla= gs: deprecated' On February 15th we will propose a list of packages that are deprecated or do not fall into the `x-maintenance-intent' - but only if there's no reverse dependency that requires them: if the package "cohttp" is marked with `x-maintenance-intent: "(latest)"', and some other package "bar" requires a specific cohttp version ('depends: "cohttp" {=3D "1.2.3"}'), the "cohttp.1.2.3" will be kept (to avoid making "bar" uninstallable). We plan to have tooling ready that allows to spot which packages would be beneficial to have a `x-maintenance-intent' or `flags: deprecated' (i.e. which ones would allow to archive more packages). What is the difference between `flags: deprecated' and `x-maintenance-intent'? Please use `flags: deprecated' if either specific versions or an entire package should be archived. Please use `x-maintenance-intent' for packages that are actively developed. If you have any further questions, please don't hesitate to ask. [`x-maintenance-intent'] CCL: Categorical Configuration Language =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Dmitrii Kovanikov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Hi everyone :wave: For the last month, I've been working on a hobby project, shaping years of my ideas into the implementation of minimalistic config language *ccl: Categorical Configuration Language*. You can read the motivation and a tutorial in my latest article: =E2=80=A2 [chshersh.com: The Most Elegant Configuration Language] I implemented CCL in OCaml using `angstrom'. The source code is here: =E2=80=A2 [chshersh.com: The Most Elegant Configuration Language] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi :wave: We will hold our first Dune dev meeting of 2025 (Happy New Year :partying_face:) on *Wednesday, January, 8th at 9:00* CET. As usual, the session will be one hour long. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize between the Dune developers ! :camel: :calendar: Agenda =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The agenda is available on the[ meeting dedicated page]. Feel free to ask if you want to add more items in it. [ meeting dedicated page] :computer: Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Meeting link:[ zoom] =E2=80=A2 Calendar event:[ google calendar] =E2=80=A2 Wiki with information and previous notes:[ GitHub Wiki] [ zoom] [ google calendar] [ GitHub Wiki] "Cram tests: a hidden gem of dune" and "Snapshot tests for your own ppx" =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David Sancho announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi, I wrote 2 blog posts about cram tests and It's a good idea to share them together. Cram tests: a hidden gem of dune =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C I'm a strong advocate of unit tests, I can confidently say that it has saved me from introducing regressions countless times. Today I want to share one of the hidden gems of OCaml and their testing story with dune, cram tests. Snapshot tests for your own ppx =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C When building preprocessor extensions (ppx) in OCaml, testing is crucial. You want to ensure your ppx works correctly and continues to work as you make changes. After experimenting with different approaches, I've found that cram tests fit well for the task. Let me know what you think, and if there's a need for more :smiley: Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [What Happened in 2024?] =E2=80=A2 [Build A CLI in OCaml with the Cmdliner Library] [the ocaml.org blog] [What Happened in 2024?] [Build A CLI in OCaml with the Cmdliner Library] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 31, 2024 to January 07, 2025.

    Playing with Windows on ARM64

    David Allsopp announced

    Following on from the teaser in https://discuss.ocaml.org/t/arm-windows-installation-as-of-today/15697/4, if you're lucky enough to have an ARM64 Windows machine, it's just about possible to get a few opam packages installed and working it!

    You'll need Visual Studio 2022 (Community) with the following packages:

    • MSVC v143 - VS 2022 C++ ARM64/ARM64EC build tools (Latest)
    • MSVC v143 - VS 2022 C++ x64/x86 build tools (Latest)
    • C++/CLI support for v143 build tools (Latest)
    • C++ Clang Compiler for Windows (18.1.8)

    That's not a typo: you need Clang and both the x64/x86 and ARM64 MSVC packages

    Install Git for Windows as normal (winget install Git.Git, etc.) and Cygwin (adding the make and patch packages - no compilers or libraries needed, it's just to get the shell).

    Clone my opam fork and check out branch windows-on-arm64. From a Cygwin bash terminal, cd to that clone and run make cold. After a little while, that should leave an ARM64 opam.exe in the current directory which should be copied to a location which you then add to PATH.

    >>From Cmd/PowerShell, you can now run:

    PS > opam init --bare
    PS > opam switch create --empty windows-on-arm64
    PS > opam pin add --yes ocaml-variants git+https://github.com/dra27/ocaml.git#windows-on-arm64
    

    Dune needs a trivial pin (which I think may be more to do with a recent Windows SDK issue, than arm64-specific):

    PS > opam pin add dune git+https://github.com/dra27/dune.git#windows-on-arm64
    

    Unfortunately, it's not quite enough to get opam's dependencies installing through opam (dose3 failed for me, which is odd because it works with make cold and topkg was freezing, although that's less surprising). But it's kinda cool how much is working straightaway, and it certainly looks like we'll have native Windows ARM64 support at some point in the future, therefore!

    Aside from the usual "packages which don't work properly" issue, there're two glaring problems:

    1. It should be possible to install the x86 / x64 compilers, but at present this doesn't work because the opam compiler packages need further tweaking[^1]
    2. Only Clang-pretending-to-be-cl is supported at the moment - I can't see any reason that Clang-pretending-to-be-gcc shouldn't be doable, but as we don't presently support that for x64 either (and it necessarily needs MSYS2, rather than Cygwin), I haven't disappeared down that rabbit hole yet[^2]

    :warning: I have no timeline for upstreaming any of this, but it's all publicly pushed and welcome to anyone to extend to a mergeable state!

    [^1]: I'll likely get to that at some point soon, as that unblocks general use of OCaml on Windows ARM64 machines, even if not native ARM64 use. However, it exceeds "fun messing around over Christmas and New Year"!

    [^2]: See 1…

    Opam repository archival, Phase 1: unavailable packages

    Continuing this thread, Hannes Mehnert announced

    It's done. It's done. It's done.

    Happy new year!

    We just merged the removal of the above mentioned uninstallable packages from opam-repository. In case you want to get these old opam files, please use:

    opam repository add opam-archive https://github.com/ocaml/opam-repository-archive.git
    

    Each of the opam files now include the two additional fields: (a) a x-reason-for-archival and (b) an x-opam-repository-commit-hash-at-time-of-archiving (as described in https://github.com/ocaml/opam-repository/blob/master/governance/policies/archiving.md#specification-of-the-x--fields-used-in-the-archiving-process).

    We also pushed the tag '2025-01-before-archiving-phase1' to the main opam-repository.

    Statistics of opam files and unique packages

    date (January 1st) opam files unique packages
    phase1 28863 4805
    2025 33033 4973
    2024 29942 4572
    2023 25983 4126
    2022 21418 3647
    2021 16632 3156
    2020 12998 2554
    2019 10236 2192
    2018 8110 1878
    2017 5966 1458
    2016 4308 1086
    2015 3081 823
    2014 1856 593
    2013 485 486

    This shows that the amount of opam files are now back to mid-2023, while in the unique packages we're in mid-2024.

    Next steps

    Next steps and call to action:

    • by January 15th we'll have a list of packages that require OCaml < 4.08 (plus those packages that were marked unavailable between December 15th and January 15th)
    • please mark your packages with x-maintenance-intent or flags: deprecated

    On February 15th we will propose a list of packages that are deprecated or do not fall into the x-maintenance-intent - but only if there's no reverse dependency that requires them: if the package "cohttp" is marked with x-maintenance-intent: "(latest)", and some other package "bar" requires a specific cohttp version ('depends: "cohttp" {= "1.2.3"}'), the "cohttp.1.2.3" will be kept (to avoid making "bar" uninstallable).

    We plan to have tooling ready that allows to spot which packages would be beneficial to have a x-maintenance-intent or flags: deprecated (i.e. which ones would allow to archive more packages).

    What is the difference between flags: deprecated and x-maintenance-intent? Please use flags: deprecated if either specific versions or an entire package should be archived. Please use x-maintenance-intent for packages that are actively developed.

    If you have any further questions, please don't hesitate to ask.

    CCL: Categorical Configuration Language

    Dmitrii Kovanikov announced

    Hi everyone :wave:

    For the last month, I've been working on a hobby project, shaping years of my ideas into the implementation of minimalistic config language ccl: Categorical Configuration Language.

    You can read the motivation and a tutorial in my latest article:

    I implemented CCL in OCaml using angstrom. The source code is here:

    Dune dev meeting

    Etienne Marais announced

    Hi :wave:

    We will hold our first Dune dev meeting of 2025 (Happy New Year :partying_face:) on Wednesday, January, 8th at 9:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize between the Dune developers ! :camel:

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if you want to add more items in it.

    :computer: Links

    "Cram tests: a hidden gem of dune" and "Snapshot tests for your own ppx"

    David Sancho announced

    Hi, I wrote 2 blog posts about cram tests and It's a good idea to share them together.

    Cram tests: a hidden gem of dune

    I'm a strong advocate of unit tests, I can confidently say that it has saved me from introducing regressions countless times. Today I want to share one of the hidden gems of OCaml and their testing story with dune, cram tests.

    https://sancho.dev/blog/cram-tests-a-hidden-gem-of-dune

    Snapshot tests for your own ppx

    When building preprocessor extensions (ppx) in OCaml, testing is crucial. You want to ensure your ppx works correctly and continues to work as you make changes. After experimenting with different approaches, I've found that cram tests fit well for the task.

    https://sancho.dev/blog/snapshot-tests-for-your-own-ppx

    Let me know what you think, and if there's a need for more :smiley:

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=bHhhgEfT; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=bZh/v/DP; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B774148E3C for ; Tue, 14 Jan 2025 08:20:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=bZDjrBGKLXDt6HUw2BIWoG+YblnmMVbD73OALBRg0rc=; b=bHhhgEfTlStv4zGmzaKDPyh9RDjB1prJaYXcla2h0dE31ANTg/jy1ENS 7j0+wtzM/YCZBs8gUDKdOqidt59j3mkYdPS2NMykgFIjeg4rIm7Oytge6 fY8HYppRYhaXdW2qPVurIFVxEsVBbpMea/7kpIcwR0xuJHsr70dyhwaBF A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.12,313,1728943200"; d="scan'208,217";a="202950421" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Jan 2025 09:20:59 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 6D796E007A; Tue, 14 Jan 2025 09:20:57 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 55912E00A5 for ; Tue, 14 Jan 2025 09:20:52 +0100 (CET) IronPort-SDR: 67861e63_AriMpAGXUQ5LPGpK0BT0UiVqwAEfZ9xR2dPkQkhxrbzzfJ4 4OwQWXVBtqrinldm0I9cxeRuUz8BlWEwWwlTDsQ== X-IPAS-Result: =?us-ascii?q?A0FMBgB1HYZngSIeaIFaEwEBgkcCgT+BAxkBY1ozBwhIQ?= =?us-ascii?q?x6DOTyDT44fgRaQN4p4gVaBJQMYFiMUAQMBDS4BDgQBAgQBAQMBAgGCDIIuQ?= =?us-ascii?q?AQCGIpfAh8GAQQwCQ4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECE?= =?us-ascii?q?AEBPQVJhXsNSQEBBAsBgWpRcV4HCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECCAQBJxBZDgEIBAYTAQE4GCMDFAEGAwIED?= =?us-ascii?q?QE1AwETARIagmiCH0UDBQwGlm2bOxB6fzOBAYIMAQEGgQg+AwsCAgMYJQHaB?= =?us-ascii?q?oFkCYFIhWuCSRoBKkhqAoRIhDwnD4FVRIEVNYFWHUoHb4FQbwsXAQEBAYE8A?= =?us-ascii?q?QFNgy6CaYI3RAMEeoEwVF6BDIFshGgSVII7gR+BPR0dL0aBD1aBL4FbgwyId?= =?us-ascii?q?oFHSzMsAVUTFwsHBWGBEgMtNjGBTHs5gg1pSzcCDQI1gh4kWIIrgx+BP4RHh?= =?us-ascii?q?FOFYoIUghGEFB1AAwttPTcUG5t5AQk1NgE8gnYvDgsUGQYCLB8OBxoTARsIB?= =?us-ascii?q?gEBCRcCLgg0BQoFMAEOCQMaGhMLKw8DklERFyqPR44SlF00B4QegV0GDIkFg?= =?us-ascii?q?SSOLYdOhARNgQqLL4cAkSmBICKYWiKCNoclgSUJgW8eTJVQAxMDhUCBZzqBX?= =?us-ascii?q?DMaMEOCMwEBMgkJATwcD1eNIQEzARaDWIE+gSaBPDk7t1tCNQIBAQcxAgcBC?= =?us-ascii?q?gEBAwmFYgEBgwSCF4RjgUsBAQ?= IronPort-PHdr: A9a23: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 8NS5iw= IronPort-Data: A9a23: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 gSR3g== IronPort-HdrOrdr: A9a23:8DDaKa9+lALNGXkRdQBuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:q1EGmW4fFDFfUawoOtsss1AJCuMPUUXm4kzaDGLhAk0xSpGOYArF X-Talos-MUID: 9a23:1XkRZwXIXn05w6Xq/DTIuhVrKt9p2b30KH9TgbQppu26GBUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.12,313,1728943200"; d="scan'208,217";a="202950385" X-MGA-submission: =?us-ascii?q?MDG555WEzMhyEUytvH59WDAWgd8Sb50kulcyD9?= =?us-ascii?q?0cUj7IJ5IU3v4z9/3tarCQh9XHoUH6RsJil/gqCR8wgj80dC+2bv/Np3?= =?us-ascii?q?TzKlZcHG1nmm7zln3qa6HPTFo/MXECqCSaiQjG+oq3eIuy533r/t1Mf/?= =?us-ascii?q?KIXKNeVFjjodSEdY+i6Jng4g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Jan 2025 09:20:51 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F31B4564A7F; Tue, 14 Jan 2025 09:20:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1736842850; bh=s4LWiLhHRR2Wgl+SMt34BM9YS3xwEbMWUbmcBkyYjfo=; h=From:To:Subject:Date:Message-ID; b=bZh/v/DPsQfJWxba+5Kfg/AXITN0vq+zfwQP5fkdguqzFA5rzSf6eAGwMoOgqMkqi qVDuq5tDb2UVwly1gLsObWfBbrLZxcFCCe4vkjlo+gMSX49bL1dwLYM5ZaTEnC/Ppg 5OvxfeYc/DTWTZTboTFUYKVPzYwbAmLg0BGG7W48= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Jan 2025 09:20:49 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 14 09:20:50 2025 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.335493, queueID=345B8564A81 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19251 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAwNyB0byAxNCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KT24gY29u Y3VycmVuY3kgbW9kZWxzDQpPQ2FtbCA1LjMuMCByZWxlYXNlZA0KZHJlYW0taHRtbCBhbmQgcHVy ZS1odG1sIDMuOS41DQpCdWlsZGluZyBhbiBPQ2FtbCBjcm9zcyBjb21waWxlciB3aXRoIE9DYW1s IDUuMw0KUHB4IGRlcml2aW5nIGRlY29kZXJzDQpPcnRhYyAwLjUuMCB0ZXN0aW5nIGhpZ2hlciBv cmRlciBmdW5jdGlvbnMNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpPbiBjb25jdXJy ZW5jeSBtb2RlbHMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3Qvb24tY29uY3VycmVuY3ktbW9kZWxzLzE1ODk5LzI0Pg0KDQoNCkRlZXAgaW4gdGhpcyB0 aHJlYWQsIENhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBGb3IgdGhvc2UgaW50ZXJlc3RlZCwgd2UndmUgc3BlbnQg c29tZSB0aW1lIHdyaXRpbmcgW2EgYm9va10gb24gaG93IHRvDQogIHVzZSBNaW91IGFuZCBhc3lu Y2hyb25vdXMgcHJvZ3JhbW1pbmcgd2l0aCBNaW91IOKAlCBiYXNpY2FsbHksIGl0DQogIGludHJv ZHVjZXMgTWlvdSdzIGRlc2lnbi4gSW4gYWRkaXRpb24sIHJlc291cmNlcyB0aGF0IG1heSBiZSBv Zg0KICBpbnRlcmVzdCBhcmU6DQogIOKAoiBbYSByZXRyb3NwZWN0aXZlXSBvZiBhIGhhbmRoZWxk IHNjaGVkdWxlciBpbXBsZW1lbnRhdGlvbiBjb21wYXJlZCB0bw0KICAgIHdoYXQgTWlvdSBvZmZl cnMNCiAg4oCiIFthIG1hbmlmZXN0b10gdGhhdCBzYXlzIHRoZSBzYW1lIHRoaW5nIGFzIHdoYXQg SSBzYWlkIGFib3ZlDQoNCiAgQSBuZXh0IHJlbGVhc2Ugb2YgTWlvdSBpcyBpbiBwcmVwYXJhdGlv biBhbmQgYWRkaXRpb25zIHRvIHRoaXMg4oCYbGl0dGxlDQogIGJvb2vigJkgd2lsbCBiZSBtYWRl LiBJbiBwYXJ0aWN1bGFyLCB0aGVyZSB3aWxsIGJlIGFuIGV4cGxhbmF0aW9uIG9mIGhvdw0KICB3 ZSBpbXBsZW1lbnRlZCBbaGFwcHktZXllYmFsbHNdLCB3aGljaCByZW1haW5zIGEgZ29vZCBleGFt cGxlLg0KDQoNClthIGJvb2tdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvaW50 cm9kdWN0aW9uLmh0bWw+DQoNClthIHJldHJvc3BlY3RpdmVdIDxodHRwczovL3JvYnVyLWNvb3Au Z2l0aHViLmlvL21pb3UvcmV0cm9zcGVjdGl2ZS5odG1sPg0KDQpbYSBtYW5pZmVzdG9dIDxodHRw czovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvbWFuaWZlc3RvLmh0bWw+DQoNCltoYXBweS1l eWViYWxsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2hhcHB5LWV5ZWJhbGxzPg0K DQoNCk9DYW1sIDUuMy4wIHJlbGVhc2VkDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMy0wLXJlbGVhc2VkLzE1OTE2LzE+DQoNCg0Kb2N0YWNo cm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgaGF2ZSB0aGUgcGxlYXN1cmUgb2YgYW5ub3VuY2luZyB0 aGUgcmVsZWFzZSBvZiBPQ2FtbCB2ZXJzaW9uDQogIDUuMy4wLiBkZWRpY2F0ZWQgdG8gdGhlIG1l bW9yeSBvZiBKb2huIFdpbGxpYW0gTWF1Y2hseSBhbmQgUGF1bA0KICBWZXJsYWluZSBvbiB0aGUg YW5uaXZlcnNhcnkgb2YgdGhlaXIgZGVhdGguDQoNCiAgICAgICAgRGUgbGEgbXVzaXF1ZSBhdmFu dCB0b3V0ZSBjaG9zZSwNCiAgICAgICAgRXQgcG91ciBjZWxhIHByw6lmw6hyZSBs4oCZSW1wYWly DQoNCiAgICAgICAgKE11c2ljIGZpcnN0IGFuZCBmb3JlbW9zdCBvZiBhbGwhDQogICAgICAgIENo b29zZSB5b3VyIG1lYXN1cmUgb2Ygb2RkIG5vdCBldmVuKQ0KDQogIFNvbWUgb2YgdGhlIGhpZ2hs aWdodHMgaW4gT0NhbWwgNS4zLjAgYXJlOg0KDQogIOKAoiBTeW50YXggZm9yIGRlZXAgZWZmZWN0 IGhhbmRsZXJzDQoNCiAgICBUaGVyZSBpcyBub3cgYSBkZWRpY2F0ZWQgc3ludGF4IGZvciBpbnN0 YWxsaW5nIGRlZXAgZWZmZWN0IGhhbmRsZXINCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIg bWF0Y2ggZiAoKSB3aXRoDQogICAg4pSCIHwgeCAtPiB4DQogICAg4pSCIHwgZWZmZWN0IFJhbmRv bV9mbG9hdCwgayAtPiBFZmZlY3QuRGVlcC5jb250aW51ZSBrIChSYW5kb20uZmxvYXQgMS4wKQ0K ICAgIOKUlOKUgOKUgOKUgOKUgA0KICAgIFRoaXMgbmV3IHN5bnRheCBhZGRzIGEgbmV3IGBlZmZl Y3QnIGtleXdvcmQsIHdoaWNoIG1heSBicmVhaw0KICAgIGV4aXN0aW5nIGNvZGUuICBUbyBpbXBy b3ZlIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHRoaXMgbmV3IGtleXdvcmQNCiAgICBjYW4gYmUg ZGlzYWJsZWQgd2l0aCB0aGUgbmV3IGAta2V5d29yZHMnIGZsYWdzIGlmIG5lZWRlZCBmb3INCiAg ICBiYWNrd2FyZCBjb21wYXRpYmlsaXR5Lg0KDQogIOKAoiBSZXN0b3JlZCBNU1ZDIHBvcnQNCg0K ICAgIEl0IGlzIG5vdyBwb3NzaWJsZSB0byB1c2UgdGhlIE1TVkMgdG9vbGNoYWluIG9uIFdpbmRv d3MsIHJlc3RvcmluZw0KICAgIHRoZSBsYXN0IG1pc3NpbmcgcG9ydCBmcm9tIE9DYW1sIDQgKGV4 Y2VwdCBmb3IgdGhlIG5hdGl2ZSBjb21waWxlcg0KICAgIHN1cHBvcnQgZm9yIDMyLWJpdCBhcmNo aXRlY3R1cmVzIHdoaWNoIGlzIG5vdCBwbGFubmVkKQ0KDQogIOKAoiBSZS1pbnRyb2R1Y2VkIHN0 YXRpc3RpY2FsIG1lbW9yeSBwcm9maWxpbmcgKHN0YXRtZW1wcm9mKQ0KDQogICAgVGhlIHN1Ym1v ZHVsZSBgR2MubWVtcHJvZicgaXMgcmVzdG9yZWQgd2l0aCBhIHNsaWdodGx5IGRpZmZlcmVudA0K ICAgIEFQSS4gVGhpcyBzdWJtb2R1bGUgY2FuIGJlIHVzZWQgdG8gbW9uaXRvciBtZW1vcnkgYWxs b2NhdGlvbg0KICAgIHN0YXRpc3RpY3MgaW5zaWRlIGEgcHJvZ3JhbS4gSW4gT0NhbWwgNSwgZWFj aCBkb21haW4gY2FuIGJlDQogICAgbW9uaXRvcmVkIGluZGVwZW5kZW50bHkgd2hpbGUgY2hpbGQg ZG9tYWlucyBpbmhlcml0IHRoZSBwYXJlbnQNCiAgICBkb21haW4gcHJvZmlsaW5nIHByb2ZpbGUg KGlmIHRoZXJlIGlzIG9uZSBhY3RpdmUpLg0KDQogIOKAoiB1dGYtOCBlbmNvZGVkIFVuaWNvZGUg c291cmNlIGZpbGVzIGFuZCBtb2Rlc3Qgc3VwcG9ydCBvZiBVbmljb2RlDQogICAgaWRlbnRpZmll cnMNCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgdHlwZSBzYWlzb24gPSBIaXZlciB8IMOJ dMOpIHwgUHJpbnRlbXBzIHwgQXV0b21uZSANCiAgICDilJTilIDilIDilIDilIANCiAgICBUaGUg T0NhbWwgbGV4ZXIgaGFzIGJlZW4gZXh0ZW5kZWQgdG8gc3VwcG9ydCBhIG1vZGVzdCBzdWJzZXQg b2YNCiAgICBVbmljb2RlIGNoYXJhY3RlcnMgaW4gaWRlbnRpZmllcnMuIFRoaXMgaXMgbW9zdGx5 IGludGVuZGVkIGZvcg0KICAgIHBlZGFnb2dpY2FsIHVzZS4gVGhpcyBleHRlbmRlZCBzdXBwb3J0 IHJlcXVpcmVzIHNvdXJjZSBmaWxlcyB0byBiZQ0KICAgIHV0Zi04IGVuY29kZWQgVW5pY29kZSB0 ZXh0Lg0KDQogIOKAoiBNb3JlIHNwYWNlLWVmZmljaWVudCBpbXBsZW1lbnRhdGlvbiBvZiBEeW5h cnJheQ0KDQogICAgVGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uIG9mIGBEeW5hcnJheScgbm93 IHVzZXMgYW4gdW5ib3hlZA0KICAgIHJlcHJlc2VudGF0aW9uIHdoaWNoIGF2b2lkcyB0aGUgbmVl ZCBvZiBzdG9yaW5nIGl0ZW1zIHdyYXBwZWQgaW4gYQ0KICAgIGBTb21lIHgnIGJsb2NrIGFuZCB0 aHVzIHNhdmUgc29tZSBzcGFjZXMgYW5kIGluZGlyZWN0aW9ucy4NCg0KICDigKIgSW1wcm92ZWQg bWV0YWRhdGEgb24gdGhlIHBhaXJzIG9mIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMgZm9y DQogICAgbWVybGluLg0KDQogICAgVGhlIG1ldGFkYXRhIHN0b3JlZCBpbnNpZGUgY210IGZpbGVz IGhhcyBiZWVuIGltcHJvdmVkIHRvIGJldHRlcg0KICAgIGRpc3Rpbmd1aXNoIHRoZSBwcm92ZW5h bmNlIG9mIGlkZW50aWZpZXJzIChwcmV2aW91cyB2ZXJzaW9ucyBjb3VsZA0KICAgIGNvbmZ1c2Ug YW4gaW50ZXJmYWNlIGFuZCBpbXBsZW1lbnRhdGlvbiBpZGVudGlmaWVyKS4gIFNpbWlsYXJseSwg dGhlDQogICAgbWV0YWRhdGEgbm93IHRyYWNrcyBtb3JlIHByZWNpc2VseSB0aGUgYXNzb2NpYXRp b24gYmV0d2Vlbg0KICAgIGRlY2xhcmF0aW9ucyBhbmQgZGVmaW5pdGlvbnMuIEZvciBpbnN0YW5j ZSwgaW4NCiAgICDilIzilIDilIDilIDilIANCiAgICDilIIgbW9kdWxlIFggPSBzdHJ1Y3QgbGV0 IHggPSAwIGVuZA0KICAgIOKUgiBtb2R1bGUgTTogc2lnDQogICAg4pSCICAgdmFsIHg6IGludA0K ICAgIOKUgiBlbmQgPSBzdHJ1Y3QNCiAgICDilIIgICBsZXQgeCA9IDENCiAgICDilIIgICBpbmNs dWRlIFgNCiAgICDilIIgZW5kDQogICAg4pSU4pSA4pSA4pSA4pSADQogICAgTWVybGluIGNhbiBu b3cgZGV0ZXJtaW5lIHRoYXQgdGhlIGRlZmluaXRpb24gb2YgdGhlIGBNLngnIHZhbHVlIGxpZXMN CiAgICBpbnNpZGUgdGhlIG1vZHVsZSBgWCcuDQoNCiAgQW5kIGEgbG90IG9mIGluY3JlbWVudGFs IGNoYW5nZXM6DQoNCiAg4oCiIEFyb3VuZCAyMCBuZXcgZnVuY3Rpb25zIGluIHRoZSBzdGFuZGFy ZCBsaWJyYXJ5IChpbiB0aGUgYERvbWFpbicsDQogICAgYER5bmFycmF5JywgYEZvcm1hdCcsIGBM aXN0JywgYFF1ZXVlJywgYFN5cycsIGFuZCBgVWNoYXInIG1vZHVsZXMpLg0KICDigKIgTWFueSBm aXhlcyBhbmQgaW1wcm92ZW1lbnRzIGluIHRoZSBydW50aW1lDQogIOKAoiBJbXByb3ZlZCBlcnJv ciBtZXNzYWdlcyBmb3IgZmlyc3QtY2xhc3MgbW9kdWxlcywgZnVuY3RvcnMsIGxhYmVsbGVkDQog ICAgYXJndW1lbnRzLCBhbmQgdHlwZSBjbGFzaGVzLg0KICDigKIgTnVtZXJvdXMgYnVnIGZpeGVz DQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgdW5leHBlY3RlZCBiZWhhdmlvdXJzIG9uIHRoZSBbT0Nh bWwgaXNzdWUgdHJhY2tlcl0uDQoNCiAgVGhlIGZ1bGwgbGlzdCBvZiBjaGFuZ2VzIGNhbiBiZSBm b3VuZCBpbiB0aGUgY2hhbmdlbG9nIGJlbG93Lg0KDQogIC9lZGl0b3Igbm90ZTogcGxlYXNlIHZp c2l0DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS0zLTAtcmVsZWFzZWQv MTU5MTY+IGZvciB0aGUNCiAgY2hhbmdlbG9nLw0KDQogIEhhcHB5IGhhY2tpbmcsIEZsb3JpYW4g QW5nZWxldHRpIGZvciB0aGUgT0NhbWwgdGVhbS4NCg0KDQpbT0NhbWwgaXNzdWUgdHJhY2tlcl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXM+DQoNCg0KZHJlYW0taHRtbCBh bmQgcHVyZS1odG1sIDMuOS41DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kcmVhbS1odG1s LXB1cmUtaHRtbC0zLTktNS8xNTkxNy8xPg0KDQoNCllhd2FyIEFtaW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIYXBweSB0byBhbm5vdW5jZSB0aGF0IGRyZWFtLWh0bWwgYW5kIHB1cmUtaHRtbCAzLjku NSBhcmUgbm93DQogIGF2YWlsYWJsZSBvbiBvcGFtLiBUaGlzIGlzIGEgc2lnbmlmaWNhbnQgcmVs ZWFzZSB3aXRoIHRocmVlIG1haW4gbmV3DQogIHRoaW5nczoNCg0KICAxLiBUeXBlLXNhZmUgcGF0 aHMgYW5kIHJvdXRpbmcNCiAgMi4gU3VwcG9ydCBmb3Igc3RhdGljIGFzc2V0IGNhY2hpbmcNCiAg My4gSFRNTCBpbXByb3ZlbWVudHMNCg0KDQpUeXBlLXNhZmUgcGF0aHMgYW5kIHJvdXRpbmcNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEFsbG93cyBkZWZpbmluZyBwYXRocyBhcyB2YWx1 ZXMgdGhhdCBjYW4gYmUgaGFuZGxlZCBieSBhIHJvdXRlciBhbmQNCiAgX2Fsc29fIHJlbmRlcmVk IGJ5IHRoZSBIVE1MIG1hcmt1cCBnZW5lcmF0b3IsIHNvIHRoYXQgdGhlIGFjdHVhbA0KICByb3V0 ZWQgcGF0aHMgYXJlIGluIHN5bmMgd2l0aCB0aGUgcmVuZGVyZWQgcGF0aHMgaW4gdGhlDQogIGFw cGxpY2F0aW9uLiBUaGVzZSBwYXRocyB1c2UgT0NhbWwncyBidWlsdC1pbiBmb3JtYXQgc3RyaW5n cyByYXRoZXINCiAgdGhhbiBhIG5ldyBEU0w6IGVnIGAvb3JkZXJzLyVzL3ZlcnNpb25zLyVkJy4g VGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0bw0KICBleHRyYWN0IHR5cGUtc2FmZSB2YWx1ZXMgZnJv bSBwYXRoIHNlZ21lbnRzIGFuZCBwYXNzIHRoZW0gdG8gdGhlDQogIGhhbmRsZXI7IHJlbmRlciBt YXJrdXAgd2l0aCBndWFyYW50ZWVkIGNvcnJlY3QgcGF0aHM7IGFuZCByZWZhY3RvciB0aGUNCiAg YXBwJ3MgcGF0aHMgd2l0aG91dCBoYXZpbmcgdG8gaHVudCBmb3IgaGFyZC1jb2RlZCBzdHJpbmdz Lg0KDQogIFNlZSBbdGhlIGRvY3NdIGZvciBkZXRhaWxzLg0KDQoNClt0aGUgZG9jc10NCjxodHRw czovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9kcmVhbS1odG1sL0RyZWFtX2h0bWwv I3R5cGUtc2FmZS1yb3V0aW5nPg0KDQoNClN0YXRpYyBhc3NldHMgc3VwcG9ydA0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoN CiAgQXV0b21hdGVzIHRoZSBoYW5kbGluZyBvZiBzdGF0aWMgYXNzZXRzIGluIHRoZSBhcHBsaWNh dGlvbiBzbyB0aGF0DQogIHRoZXkgY2FuIGVhc2lseSBiZSBzZXJ2ZWQgYnkgdGhlIHJvdXRlciB3 aXRoIGFuIGltbXV0YWJsZSBjYWNoZSBwb2xpY3kNCiAgYW5kIHRoZWlyIHBhdGhzIGNhbiBiZSBy ZW5kZXJlZCBpbiBtYXJrdXAgd2l0aCBhIGNvbnRlbnQtYmFzZWQNCiAgcmV2aXNpb24gaGFzaCwg Zm9yIGVhc3kgY2FjaGUtYnVzdGluZy4NCg0KICBBZGRlZCBhIG5ldyBDTEkgdG9vbCBgZHJlYW13 b3JrJyB3aGljaCBoZWxwcyB3aXRoIHNjYWZmb2xkaW5nIHRoaXMNCiAgc3RhdGljIGFzc2V0cyBz ZXR1cC4gVGhlIGludGVudGlvbiBpcyB0byB1c2UgaXQgZm9yIG1vcmUgc2NhZmZvbGRpbmcNCiAg dGFza3MgaW4gdGhlIGZ1dHVyZeKAk3N0YXkgdHVuZWQuDQoNCiAgU2VlIFt0aGUgZG9jc10gZm9y IGRldGFpbHMsIGFuZCBbdGhpcyBzY3JlZW4gcmVjb3JkaW5nXSBmb3IgYSBzaG9ydA0KICBkZW1v Lg0KDQoNClt0aGUgZG9jc10NCjxodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRt bC9kcmVhbS1odG1sL0RyZWFtX2h0bWwvI2RyZWFtd29yaz4NCg0KW3RoaXMgc2NyZWVuIHJlY29y ZGluZ10NCjxodHRwczovL3guY29tL3lhd2FyYW1pbi9zdGF0dXMvMTg3MzA5MTE5ODM4MDA2NTEz Mj4NCg0KDQpIVE1MIGltcHJvdmVtZW50cw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhhbmtzIHRvIFtSZXp3YW5BcmVmaW4wMV0gZm9y IHByZXR0aWZ5aW5nIHRoZSBnZW5lcmF0ZWQgSFRNTC4gSXQgaXMNCiAgbm93IGZvcm1hdHRlZCBh bmQgbXVjaCBlYXNpZXIgdG8gcmVhZC4gU2VlIHRoZSBbc25hcHNob3RzXSBmb3Igc29tZQ0KICBl eGFtcGxlcy4NCg0KICBMYXN0bHksIGFkZGVkIGBIVE1MLmFzXycgd2hpY2ggaXMgdGhlIFthcyBh dHRyaWJ1dGVdLg0KDQogIEVuam95IQ0KDQoNCltSZXp3YW5BcmVmaW4wMV0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9SZXp3YW5BcmVmaW4wMT4NCg0KW3NuYXBzaG90c10NCjxodHRwczovL2dpdGh1Yi5j b20veWF3YXJhbWluL2RyZWFtLWh0bWwvYmxvYi9lMmE2NmNjMTk5YTI4ZmQzZDRhNTQ0MGExMjRj OTBmNTc4YjhhZTkwL3Rlc3QvcHVyZV9odG1sX3Rlc3QuZXhwZWN0ZWQudHh0Pg0KDQpbYXMgYXR0 cmlidXRlXQ0KPGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0hU TUwvRWxlbWVudC9saW5rI2FzPg0KDQoNCkJ1aWxkaW5nIGFuIE9DYW1sIGNyb3NzIGNvbXBpbGVy IHdpdGggT0NhbWwgNS4zDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2J1aWxkaW5nLWFuLW9jYW1sLWNyb3Nz LWNvbXBpbGVyLXdpdGgtb2NhbWwtNS0zLzE1OTE4LzE+DQoNCg0Kc2h5bSBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgY3Jvc3MgY29t cGlsZXIgaXMgYSBjb21waWxlciB0aGF0IHJ1bnMgb24gc29tZSBfaG9zdF8gbWFjaGluZSwgZm9y DQogIGluc3RhbmNlIG9uZSBydW5uaW5nIExpbnV4IG9uIGEgNjQtYml0IEFSTSBwcm9jZXNzb3Is IGFuZCBnZW5lcmF0ZXMNCiAgY29kZSBmb3IgYSBkaWZmZXJlbnQgX3RhcmdldF8gbWFjaGluZSwg Zm9yIGluc3RhbmNlIG9uZSBydW5uaW5nDQogIFdpbmRvd3Mgd2l0aCBhIDY0LWJpdCB4ODYgcHJv Y2Vzc29yLiAgQnVpbGRpbmcgT0NhbWwgY3Jvc3MgY29tcGlsZXJzDQogIHVzZWQgdG8gYmUgcXVp dGUgdHJpY2t5IGFuZCBoYWNraXNoIGJ1dCBtYW55IGluY3JlbWVudGFsIGNoYW5nZXMgdG8NCiAg dGhlIGJ1aWxkIHN5c3RlbSBvdmVyIHRoZSBsYXN0IHllYXJzIGhhdmUgaW1wcm92ZWQgcmFkaWNh bGx5IHRoZQ0KICBzaXR1YXRpb24uIFNvIG11Y2ggc28gdGhhdCwgd2l0aCB0aGUgbW9zdCByZWNl bnQgY2hhbmdlcyAoWzFdLCBbMl0pIGluDQogIHRoZSBkZXZlbG9wbWVudCBicmFuY2ggb2YgdGhl IGNvbXBpbGVyLCBpdCBzaG91bGQgYmUgcG9zc2libGUgdG8gYnVpbGQNCiAgbWFueSBjcm9zcyBj b21waWxlcnMgd2l0aG91dCBleHRyYSBjaGFuZ2VzIDpjcm9zc2VkX2ZpbmdlcnM6DQoNCiAgVGhp cyBpcyBhbGwgd2VsbCBhbmQgZ29vZCwgeW91IG1pZ2h0IHNheSwgYnV0IHlvdSB3b3VsZCByYXRo ZXIgcGxheQ0KICB3aXRoIHRoZSBicmFuZCBuZXcgWzUuM10gaW5zdGVhZCBvZiBhIGRldmVsb3Bt ZW50IGJyYW5jaCEgU28gSeKAmXZlDQogIGJhY2twb3J0ZWQgdGhlIG5lY2Vzc2FyeSBjaGFuZ2Vz IHRvIDUuMy4NCg0KDQpbMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEz NTI2Pg0KDQpbMl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9wdWxsLzEzNjc0Pg0K DQpbNS4zXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLTUtMy0wLXJlbGVhc2Vk LzE1OTE2Pg0KDQpIb3cgdG8gYnVpbGQgYW5kIHVzZSBhIE9DYW1sIDUuMyBjcm9zcyBjb21waWxl cg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVG8gbWFrZSBpdCBlYXN5IHRvIHRl c3QsIEnigJl2ZSB3cml0dGVuIGFuIGV4YW1wbGUgT1BBTSBmaWxlIHRoYXQgY2FuIGJlDQogIGN1 c3RvbWlzZWQgdG8gc3VpdCB5b3VyIGdvYWwuIEl0IHRha2VzIHRoZSBleGFtcGxlIG9mIGJ1aWxk aW5nIGEgY3Jvc3MNCiAgY29tcGlsZXIgdG8gNjQtYml0IHg4NiBXaW5kb3dzIE1pbkdXLCBpbiBw YXJ0aWN1bGFyIGJlY2F1c2UgdGhhdA0KICBhbHdheXMgcmV2ZWFscyB1bmV4cGVjdGVkIGlzc3Vl cyA6LSkNCg0KICAxLiBTdGFydCBieSBjcmVhdGluZyBhIDUuMy4wIE9QQU0gc3dpdGNoIGlmIHlv dSBoYXZlbuKAmXQgYWxyZWFkeS4NCg0KICAyLiBDaG9vc2UgdGhlIHRhcmdldCB5b3Ugd2FudCB0 byBjcmVhdGUgYSBjcm9zcyBjb21waWxlciBmb3IgYW5kIGZpbmQNCiAgICAgaXRzIFt0YXJnZXQg dHJpcGxldF0uIFRoZSBHQ0MgQyBjcm9zcyBjb21waWxlcnMgYW5kIHRoZSBHTlUgY3Jvc3MNCiAg ICAgYmludXRpbHMgdXNlIHRhcmdldCB0cmlwbGV0cyBhcyBwcmVmaXhlcyBmb3IgdGhlIGNvbW1h bmRzLCBzbyBhbg0KICAgICBlYXN5IHdheSB0byBmaW5kIHlvdXIgdHJpcGxldCBpcyB0byBpbnN0 YWxsIHRoZSB0b29scy4gU286DQoNCiAgMy4gSW5zdGFsbCB0aGUgQyBjcm9zcyBjb21waWxlciBh bmQgdG9vbGNoYWluIGZvciB5b3VyIHRhcmdldC4gTWFueQ0KICAgICBMaW51eCBkaXN0cmlidXRp b25zIHBhY2thZ2Ugc29tZSBjcm9zcyBjb21waWxlcnMuIEZvciBpbnN0YW5jZSwNCiAgICAgdGhl IFtDSSB0ZXN0cyBmb3IgY3Jvc3MgY29tcGlsZXJzXSBpbnN0YWxscyBvbiBVYnVudHU6DQoNCiAg ICAg4oCiIHRoZSBgZ2NjLW1pbmd3LXc2NC14ODYtNjQnIHBhY2thZ2UgKHdoaWNoIGRlcGVuZHMg b24gdGhlDQogICAgICAgbWF0Y2hpbmcgYmludXRpbHMpIHRvIGNyb3NzIGNvbXBpbGUgdG8gNjQt Yml0IHg4NiBXaW5kb3dzIE1pbkdXOw0KICAgICAgIGluIHRoYXQgY2FzZSwgdGhhdCB0YXJnZXQg bWFjaGluZSBpcyBpZGVudGlmaWVkIGJ5IHRoZQ0KICAgICAgIGB4ODZfNjQtdzY0LW1pbmd3MzIn IHRyaXBsZXQsIHNvIGl0IGNhbGxzIGBjb25maWd1cmUnIHdpdGggdGhlDQogICAgICAgYXJndW1l bnQgYC0tdGFyZ2V0PXg4Nl82NC13NjQtbWluZ3czMicsDQogICAgIOKAoiB0aGUgYGdjYy1hYXJj aDY0LWxpbnV4LWdudScgcGFja2FnZSB0byBjcm9zcyBjb21waWxlIHRvIDY0LWJpdA0KICAgICAg IGFybSBMaW51eDsgaW4gdGhhdCBjYXNlLCB0aGUgdGFyZ2V0IG1hY2hpbmUgaXMgaWRlbnRpZmll ZCBieSB0aGUNCiAgICAgICBgYWFyY2g2NC1saW51eC1nbnUnIHRyaXBsZXQuDQoNCiAgNC4gQ3Jl YXRlIGEgbmV3IE9QQU0gcGFja2FnZSBpbnRlcmFjdGl2ZWx5IGZvciBpbnN0YW5jZSBieSBjaG9v c2luZw0KICAgICB0aGUgbmFtZSBvZiB0aGUgcGFja2FnZSAoYG9jYW1sLXh5eicgb3IgZXZlbiBg b2NhbWwtY3Jvc3MteHl6JyBhcmUNCiAgICAgZ29vZCBjaG9pY2VzIEnigJlkIHNheTsgbXkgW2V4 YW1wbGVdIHVzZXMgYG9jYW1sLWNyb3NzLXdpbmRvd3MnLCBmb3INCiAgICAgaW5zdGFuY2UpIGFu ZCBydW46DQogICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgICDilIIgb3BhbSBwaW4gYWRkIC0tZWRp dCBvY2FtbC1jcm9zcy14eXogLQ0KICAgICDilJTilIDilIDilIDilIANCg0KICAgICBUaGlzIHdp bGwgb3BlbiBhbiBlZGl0b3Igc28gdGhhdCB5b3UgY2FuIGZpbGwgaW4gdGhlIGluc3RydWN0aW9u cw0KICAgICBvbiBob3cgdG8gYnVpbGQgeW91ciBjcm9zcyBjb21waWxlci4gVXNlIG15IFtleGFt cGxlXSB0byBnZXQgeW91DQogICAgIHN0YXJ0ZWQuIEluIHBhcnRpY3VsYXIgeW914oCZbGwgd2Fu dCB0byBjb25maWd1cmUgdGhlIGAtLXRhcmdldCcNCiAgICAgcGFyYW1ldGVyIHdpdGggdGhlIHRy aXBsZXQgZm9yIHlvdXIgdGFyZ2V0ICh0aGF0IGNvdWxkIGJlIHRoZSBvbmx5DQogICAgIGNoYW5n ZSEpLiBJZiB5b3VyIHRvb2xjaGFpbiBhbmQgQyBjb21waWxlciB1c2UgdGhhdCB0cmlwbGV0IGFz IGENCiAgICAgcHJlZml4IGZvciBhbGwgdGhlIGNvbW1hbmRzLCBgY29uZmlndXJlJyB3aWxsIGZp bmQgdGhlbQ0KICAgICBhdXRvbWF0aWNhbGx5LiBPdGhlcndpc2UgeW914oCZbGwgbmVlZCB0byBl eHBsaWNpdGx5IHNldCB0aGVtLCBieQ0KICAgICBhZGRpbmcgYXJndW1lbnRzIHN1Y2ggYXMgYEND PS4uLicgdG8gYGNvbmZpZ3VyZScuIFRoZSBbQ0kgdGVzdHMNCiAgICAgZm9yIGNyb3NzIGNvbXBp bGVyc10gY29udGFpbnMgc3VjaCBhbiBleGFtcGxlIHRvIGNyb3NzIGNvbXBpbGUgdG8NCiAgICAg QW5kcm9pZCB3aGVyZSBgQ0MnLCBgQVInLCBgUEFSVElBTExEJywgYFJBTkxJQicgYW5kIGBTVFJJ UCcgYXJlDQogICAgIGV4cGxpY2l0bHkgc2V04oCmIEluIG90aGVyIHdvcmRzLCBJIHN1Z2dlc3Qg dG8gZXhwZXJpbWVudCBmaXJzdCB3aXRoDQogICAgIGFuIGV4YW1wbGUgd2l0aCBhdXRvbWF0aWMg Y29uZmlndXJhdGlvbiENCg0KICBZb3Ugc2hvdWxkIG5vdyBoYXZlIGEgY3Jvc3MgY29tcGlsZXIh IExldOKAmXMgdXNlIGl0IG9uIGEgc2ltcGxlIHNhbml0eQ0KICBjaGVjayBgdGVzdC5tbCc6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBJcyB0aGUgcHJvcGVyICh0YXJnZXQpIE9TIGlk ZW50aWZpZWQ/ICopDQogIOKUgiBsZXQgXyA9DQogIOKUgiAgIFByaW50Zi5wcmludGYgIlZlcnNp b246ICVzXG5PUzogJXNcblVuaXg6ICViXG5XaW46ICViXG5DeWd3aW46ICViXG4iDQogIOKUgiAg ICAgU3lzLm9jYW1sX3ZlcnNpb24gU3lzLm9zX3R5cGUgU3lzLnVuaXggU3lzLndpbjMyIFN5cy5j eWd3aW4NCiAg4pSCIA0KICDilIIgKCogRG8gdGhlIGNvbXBpbGVyIGxpYnMgd29yaz8gKikNCiAg 4pSCICgqIFRoZSBpbnRlcmZhY2UgZm9yIFtBcmNoXSBpcyBub3QgdGhlIHNhbWUgYWNyb3NzIHBy b2Nlc3NvciBhcmNoaXRlY3R1cmVzLCB0aGUNCiAg4pSCICAgIGZvbGxvd2luZyBhc3N1bWVzIHlv dXIgdGFyZ2V0IGlzIDY0LWJpdCB4ODYgKikNCiAg4pSCIGxldCBfID0NCiAg4pSCICAgUHJpbnRm LnByaW50ZiAiYWxsb3dfdW5hbGlnbmVkX2FjY2VzcyA9ICViXG4iIEFyY2guYWxsb3dfdW5hbGln bmVkX2FjY2VzczsNCiAg4pSCICAgUHJpbnRmLnByaW50ZiAid2luNjQgPSAlYlxuIiBBcmNoLndp bjY0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBwYWNrYWdlIGBvY2FtbC1jcm9zcy14eXon IHdpbGwgaW5zdGFsbCBhbiBgb2NhbWxmaW5kJyB0b29sY2hhaW4NCiAgY2FsbGVkIGB4eXonLiBT byB3ZSBjYW4gY29tcGlsZSBgdGVzdC5tbCcgdGh1czoNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIG9jYW1sZmluZCAtdG9vbGNoYWluIHh5eiBvcHQgLXBhY2thZ2UgY29tcGlsZXItbGlicy5v cHRjb21wIC1saW5rcGtnIHRlc3QubWwgLXZlcmJvc2UNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg d2hlcmUgYC12ZXJib3NlJyBsZXQgeW91IGNoZWNrIHdoYXQgaXMgYWN0dWFsbHkgYmVpbmcgcnVu LiBJZiB5b3VyDQogIHRhcmdldCBpcyBXaW5kb3dzIE1pbkdXIChzbyBjcm9zcyBjb21waWxpbmcg ZnJvbSBzb21lIHVuaXgpLCB5b3UNCiAgcHJvYmFibHkgbmVlZCBhbiBleHRyYSBzdGVwIGJlZm9y ZSB0aGlzIGNvbXBpbGF0aW9uIGNhbiBnbyB0aHJvdWdoOg0KICB0aGUgdG9vbCBgZmxleGxpbmsu ZXhlJyB3aGljaCBpcyB1c2VkIHRvIGxpbmsgdGhlIGZpbmFsIFdpbmRvd3MgYmluYXJ5DQogIGhh cyBiZWVuIGJ1aWx0IGFzIHBhcnQgb2YgdGhlIHBhY2thZ2UgYnV0IGBvY2FtbG9wdCcgd2lsbCBl eHBlY3QgdG8NCiAgZmluZCBhIGNvbW1hbmQgYGZsZXhsaW5rJyAobm90ZSBpbiBwYXJ0aWN1bGFy IHRoZSBhYnNlbmNlIG9mIGAuZXhlJykNCiAgc28gSSBzdWdnZXN0IHRvIGBsbiAtcycgdGhlIGBm bGV4bGluaycgYmluYXJ5IHNvbWV3aGVyZSBpbiB5b3VyDQogIGBQQVRIJy4gRm9yIGluc3RhbmNl LCBpdCBjb3VsZCBiZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGxuIC1zICIkKG9wYW0g c2hvdyAtLWxpc3QtZmlsZXMgb2NhbWwtY3Jvc3MteHl6IHwgZ3JlcCBmbGV4bGluay5vcHQuZXhl KSIgfi9iaW4vZmxleGxpbmsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgYW5kIHRoZW4geW91IHdp bGwgYmUgYWJsZSB0byBydW4gdGhlIGBvY2FtbGZpbmQgLXRvb2xjaGFpbiAuLi4nDQogIGNvbW1h bmQgdG8gY29tcGlsZSB5b3VyIHByb2dyYW0uDQoNCg0KW3RhcmdldCB0cmlwbGV0XQ0KPGh0dHBz Oi8vd3d3LmdudS5vcmcvc29mdHdhcmUvYXV0b2NvbmYvbWFudWFsL2F1dG9jb25mLTIuNzEvaHRt bF9ub2RlL1NwZWNpZnlpbmctVGFyZ2V0LVRyaXBsZXRzLmh0bWw+DQoNCltDSSB0ZXN0cyBmb3Ig Y3Jvc3MgY29tcGlsZXJzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL3Ry dW5rLy5naXRodWIvd29ya2Zsb3dzL2J1aWxkLWNyb3NzLnltbD4NCg0KW2V4YW1wbGVdDQo8aHR0 cHM6Ly9naXN0LmdpdGh1Yi5jb20vc2h5bS80NGRhMWRhYWVmZTExYzc0ZTZjNDM2M2IxNGFlN2Vl MCNmaWxlLW9jYW1sLWNyb3NzLXdpbmRvd3Mtb3BhbT4NCg0KDQpHb3RjaGFzIGFuZCBkZXRhaWxz DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICAxLiBCZXdhcmUgdGhhdCBoYXZpbmcgYSBgZmxleGxpbmsnIGNvbW1hbmQgaW4gYFBB VEgnIGJyZWFrcyBPQ2FtbA0KICAgICAoNS4zIGFuZCBiZWZvcmUp4oCZcyBgY29uZmlndXJlJyBp ZiB5b3XigJlyZSBub3Qgb24gV2luZG93czsgdGhpcyB3aWxsDQogICAgIGJlIGZpeGVkIGluIDUu NC4NCg0KICAyLiBUaGUgW2V4YW1wbGVdIE9QQU0gcGFja2FnZSBjb250YWlucyBTSEEyNTYgc3Vt cyBmb3IgYC5wYXRjaCcgZmlsZXMNCiAgICAgZ2VuZXJhdGVkIG9uIHRoZSBmbHkgZnJvbSB0aGUg Y29ycmVzcG9uZGluZyBjb21taXRzIGJ1dCB0aGV5IG1pZ2h0DQogICAgIGNoYW5nZSB3aXRob3V0 IG5vdGljZSAodG8gYWRkIGFuIGV4dHJhIGRpZ2l0IHRvIHRoZSBTSEExIHRoZXkNCiAgICAgY29u dGFpbiwgZm9yIGluc3RhbmNlKS4gSWYgeW91IG5vdGljZSB0aGF0LCBwaW5nIG1lIHNvIHRoYXQg SSBjYW4NCiAgICAgdXBkYXRlIHRoZSBTSEEyNTYgc3VtcyBpbiB0aGUgZ2lzdC4NCg0KICAzLiBU aGUgW2V4YW1wbGVdIE9QQU0gcGFja2FnZSBwdWxscyB0aGUgb2ZmaWNpYWwgT0NhbWwgNS4zLjAg YXJjaGl2ZQ0KICAgICBhbG9uZyB3aXRoIHR3byBwYXRjaGVzOg0KICAgICDigKIgdGhlIGZpcnN0 IG9uZSBpcyBhIGxhcmdlIGNvbW1pdCB0aGF0IHNxdWFzaGVzIGFsbCB0aGUgY29tbWl0cw0KICAg ICAgIHRoYXQgSSBiYWNrcG9ydGVkIGZyb20gdXBzdHJlYW0sDQogICAgIOKAoiB0aGUgc2Vjb25k IG9uZSBpcyBhIHNtYWxsIGNvbW1pdCB0aGF0IGFkZHMgdGhlIGdlbmVyYXRpb24gb2YgdGhlDQog ICAgICAgYG9jYW1sZmluZCcgdG9vbGNoYWluIGNvbmZpZ3VyYXRpb24uDQoNCiAgICAgWW91IGNh biBmaW5kIHRoZSBkZXRhaWxlZCBiYWNrcG9ydCBvbiBteSBbYDUuMytvY3Jvc3MnXSBicmFuY2gg YW5kDQogICAgIGl0cyBbY29tcGFyaXNvbl0gd2l0aCB0aGUgb2ZmaWNpYWwgcmVsZWFzZS4gVGhl IHNxdWFzaGVkIGNvbW1pdA0KICAgICBsaXZlcyBvbiBpdHMgW293biBicmFuY2hdLg0KDQoNCltl eGFtcGxlXQ0KPGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3NoeW0vNDRkYTFkYWFlZmUxMWM3NGU2 YzQzNjNiMTRhZTdlZTAjZmlsZS1vY2FtbC1jcm9zcy13aW5kb3dzLW9wYW0+DQoNCltgNS4zK29j cm9zcyddIDxodHRwczovL2dpdGh1Yi5jb20vc2h5bS9vY2FtbC90cmVlLzUuMytvY3Jvc3MvPg0K DQpbY29tcGFyaXNvbl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvY29tcGFyZS81 LjMuMC4uLnNoeW06b2NhbWw6NS4zK29jcm9zcz4NCg0KW293biBicmFuY2hdIDxodHRwczovL2dp dGh1Yi5jb20vc2h5bS9vY2FtbC90cmVlLzUuMy4wK29jcm9zcy1zcXVhc2hlZC8+DQoNCg0KUHB4 IGRlcml2aW5nIGRlY29kZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1wcHgtZGVyaXZpbmctZGVjb2RlcnMvMTU5MjEvMT4NCg0KDQpC ZW4gQmVsbGljayBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgbGl0dGxlIGxhdGUgYnV0IHdhbnRl ZCB0byBzaGFyZSBhIHBhY2thZ2UgSSBoYXZlIHJlbGVhc2VkIQ0KDQogIEZvciB0aG9zZSBmYW1p bGlhciB3aXRoIHRoZSBleGNlbGxlbnQgW29jYW1sLWRlY29kZXJzXSBwYWNrYWdlLCBJIGhhdmUN CiAgd3JpdHRlbiBbcHB4X2Rlcml2aW5nX2RlY29kZXJzXSB0byBhdXRvbWF0aWNhbGx5IGdlbmVy YXRlIHRoZQ0KICBjb3JyZXNwb25kaW5nIGRlY29kZXJzIChhbmQgZW5jb2RlcnMpIGJhc2VkIG9m ZiBvZiB0eXBlIGRlZmluaXRpb25zLg0KDQogIEluIG15IHZpZXcsIHRoaXMgZ2l2ZXMgdGhlIGJl c3Qgb2YgYm90aCB3b3JsZHMgaW4gdGVybXMgb2Y6DQogIDEuIGF1dG9tYXRpY2FsbHkgZ2VuZXJh dGluZyAoZS5nLiBKU09OKSBzZXJpYWxpemF0aW9uIGFuZA0KICAgICBkZXNlcmlhbGl6YXRpb24g YmFzZWQgb2ZmIG9mIGEgdHlwZSBkZWZpbml0aW9uLCBhbmQNCiAgMi4gaGF2aW5nIGEgcmVhZGFi bGUgYW5kIGV4cHJlc3NpdmUgbGFuZ3VhZ2UgZm9yIGhhbmR3cml0aW5nIGVuY29kZXJzDQogICAg IGFuZCBkZWNvZGVycyB3aGVuIG5lY2Vzc2FyeSBieSB1c2luZyBjb21iaW5hdG9ycy4NCg0KICBU aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBSRUFETUUgZGVtb25zdHJhdGUgaG93IHlvdSBjYW4gdXNl IHRoZQ0KICBnZW5lcmF0ZWQgZGVjb2RlciBhcyBhIGJhc2UgcG9pbnQgZnJvbSB3aGljaCB0byBo YW5kIHR3ZWFrIGFuZCBnZXQNCiAgeW91ciBvd24gY3VzdG9tIGRlY29kZXIuDQoNCiAgUGxlYXNl IGxldCBtZSBrbm93IGlmIHlvdSBmaW5kIGl0IHVzZWZ1bCBvciBoYXZlIGFueSBmZWVkYmFjay4g VGhhbmtzIQ0KDQoNCltvY2FtbC1kZWNvZGVyc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9tYXR0amJy YXkvb2NhbWwtZGVjb2RlcnM+DQoNCltwcHhfZGVyaXZpbmdfZGVjb2RlcnNdDQo8aHR0cDovL2dp dGh1Yi5jb20vYmVuYmVsbGljay9wcHhfZGVyaXZpbmdfZGVjb2RlcnM+DQoNCg0KT3J0YWMgMC41 LjAgdGVzdGluZyBoaWdoZXIgb3JkZXIgZnVuY3Rpb25zDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNo aXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcnRhYy0wLTUtMC10ZXN0 aW5nLWhpZ2hlci1vcmRlci1mdW5jdGlvbnMvMTU5NDUvMT4NCg0KDQpOaWNvbGFzIE9zYm9ybmUg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSENCg0KICBJJ20g dmVyeSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHRoZSBPcnRhYy0wLjUuMCBw YWNrYWdlcw0KICBmb3Igc3BlY2lmaWNhdGlvbi1kcml2ZW4gdGVzdGluZyENCg0KICBPcnRhYy9R Q2hlY2stU1RNIGlzIGEgdGVzdCBnZW5lcmF0b3IgYmFzZWQgb24gdGhlIFtRQ2hlY2stU1RNXQ0K ICBtb2RlbC1iYXNlZCB0ZXN0aW5nIGZyYW1ld29yayBhbmQgdGhlIFtHb3NwZWxdIHNwZWNpZmlj YXRpb24gbGFuZ3VhZ2UNCiAgZm9yIE9DYW1sLg0KDQogIFRoaXMgbmV3IHJlbGVhc2UgYnJpbmdz IHRocmVlIG5ldyBmZWF0dXJlcy4NCg0KICBJbiB0aGUgZWZmb3J0IHRvIGluY3JlYXNlIHRoZSBj b3ZlcmFnZSBvZiB0aGUgZ2VuZXJhdGVkIHRlc3RzIGFuZA0KICB0aGFua3MgdG8gSmFuIE1pZHRn YWFyZCwgd2Ugbm93IHN1cHBvcnQgdGVzdGluZyBoaWdoZXIgb3JkZXINCiAgZnVuY3Rpb25zLiBU aGFua3MgSmFuIQ0KDQogIEl0IGlzIGFsc28gbm93IHBvc3NpYmxlIHRvIHRlc3QgYSBtb2R1bGUg ZXhwb3NlZCBhcyBhIHN1Yi1tb2R1bGUgYnkNCiAgRHVuZSwgc3BlY2lmeWluZyB0aGUgbW9kdWxl J3MgcHJlZml4IGluIGEgQ0xJIG9wdGlvbmFsIGFyZ3VtZW50LiBBDQogIGZlYXR1cmUgdGhhdCB3 ZSd2ZSBiZWVuIGFza2VkIHRvIGFkZC4NCg0KICBBbmQgdG8gdGVzdCBhbiBhY3R1YWwgc3ViLW1v ZHVsZSBkZWZpbmVkIGluc2lkZSBhbiBPQ2FtbCBmaWxlLA0KICBzcGVjaWZ5aW5nIHRoZSBzdWIt bW9kdWxlIGluIGEgQ0xJIG9wdGlvbmFsIGFyZ3VtZW50IGFzIHdlbGwuDQoNCiAgT3J0YWMvRHVu ZSBnZW5lcmF0ZXMgdGhlIER1bmUgYm9pbGVycGxhdGUgZm9yIHlvdS4gSXQgaGFzIGJlZW4gdXBk YXRlZA0KICB0byBzdXBwb3J0IHRoZSB0d28gbmV3IG9wdGlvbmFsIGFyZ3VtZW50cy4NCg0KICBZ b3UgY2FuIGluc3RhbGwgdGhvc2UgcGFja2FnZXMgdmlhIG9wYW06DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiAkIG9wYW0gaW5zdGFsbCBvcnRhYy1xY2hlY2stc3RtIG9ydGFjLWR1bmUNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlbiB5b3Ugd3JpdGUgc29tZSBHb3NwZWwgc3BlY2lmaWNh dGlvbnMgaW4geW91ciBsaWJyYXJ5J3MgaW50ZXJmYWNlDQogIGZpbGUgYGZvby5tbGknOg0KDQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgdHlwZSAnYSB0DQogIOKUgiAoKkAgbXV0YWJsZSBtb2Rl bCBjb250ZW50cyA6ICdhIHNlcXVlbmNlICopDQogIOKUgiANCiAg4pSCIHZhbCBtYWtlIDogaW50 IC0+ICdhIC0+ICdhIHQNCiAg4pSCICgqQCB0ID0gbWFrZSBpIGENCiAg4pSCICAgICBlbnN1cmVz IHQuY29udGVudHMgPSBTZXF1ZW5jZS5pbml0IGkgKGZ1biBfIC0+IGEpICopDQogIOKUgiANCiAg 4pSCIHZhbCBmb3JfYWxsIDogKCdhIC0+IGJvb2wpIC0+ICdhIHQgLT4gYm9vbA0KICDilIIgKCpA IGIgPSBmb3JfYWxsIHAgdA0KICDilIIgICAgIGVuc3VyZXMgYiA9IFNlcXVlbmNlLmZvbGRfbGVm dCAoZnVuIGFjYyBhIC0+IGFjYyAmJiBwIGEpIHRydWUgdC5jb250ZW50cyAqKQ0KICDilJTilIDi lIDilIDilIANCg0KICBUaGVuIGEgc2ltcGxlIGNvbmZpZ3VyYXRpb24gZmlsZSBgZm9vX2NvbmZp Zy5tbCc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB0eXBlIHN1dCA9IGNoYXIgdA0KICDi lIIgDQogIOKUgiBsZXQgaW5pdF9zdXQgPSBtYWtlIDQyICdhJw0KICDilJTilIDilIDilIDilIAN Cg0KICBBbmQgeW91IGNhbiBnZW5lcmF0ZSBzb21lIHNwZWNpZmljYXRpb24tZHJpdmVuIG1vZGVs LWJhc2VkIHRlc3RzIGZvcg0KICB5b3VyIGxpYnJhcnkganVzdCBieSBydW5uaW5nOg0KDQogIOKU jOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcnRhYyBxY2hlY2stc3RtIGZvby5tbGkgZm9vX2NvbmZp Zy5tbA0KICDilJTilIDilIDilIDilIANCg0KICBJZiB5b3Ugd2FudCB0byBpbnRlZ3JhdGUgdGhl IGdlbmVyYXRpb24gYW5kIHRoZSBydW5uaW5nIG9mIHRoZSB0ZXN0cw0KICB0byB5b3VyIGR1bmUg c2V0dXAgKHdoaWNoIGlzIGhpZ2hseSByZWNvbW1lbmRlZCksIGp1c3QgYWRkIHRoZQ0KICBmb2xs b3dpbmcgc3RhbnphIHRvIHlvdXIgZHVuZSBmaWxlIGluIHlvdXIgdGVzdCBkaXJlY3Rvcnk6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAocnVsZQ0KICDilIIgIChhbGlhcyBydW50ZXN0KQ0K ICDilIIgIChtb2RlIHByb21vdGUpDQogIOKUgiAgKGFjdGlvbg0KICDilIIgICAod2l0aC1zdGRv dXQtdG8NCiAg4pSCICAgIGR1bmUuaW5jDQogIOKUgiAgICAocnVuIG9ydGFjIGR1bmUgcWNoZWNr LXN0bSBmb28ubWxpKSkpKQ0KICDilIIgDQogIOKUgiAoaW5jbHVkZSBkdW5lLmluYykNCiAg4pSU 4pSA4pSA4pSA4pSADQoNCiAgWW91J2xsIGZpbmQgbW9yZSBpbmZvcm1hdGlvbiBpbiB0aGUgW09y dGFjL1FDaGVjay1TVE0gZG9jdW1lbnRhdGlvbl0sDQogIHRoZSBbT3J0YWMvRHVuZSBSRUFETUVd IGFuZCB0aGUgW2BleGFtcGxlcycgZm9sZGVyXS4gSSdtIGFsc28gaGFwcHkgdG8NCiAgYW5zd2Vy IHF1ZXN0aW9ucy4NCg0KICBIYXBweSB0ZXN0aW5nIQ0KDQoNCltRQ2hlY2stU1RNXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9tdWx0aWNvcmV0ZXN0cz4NCg0KW0dvc3BlbF0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1nb3NwZWwvZ29zcGVsPg0KDQpbT3J0YWMvUUNoZWNr LVNUTSBkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vb2NhbWwtZ29zcGVsLmdpdGh1Yi5pby9vcnRh Yy9vcnRhYy1xY2hlY2stc3RtL2luZGV4Lmh0bWw+DQoNCltPcnRhYy9EdW5lIFJFQURNRV0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtZ29zcGVsL29ydGFjL2Jsb2IvbWFpbi9wbHVnaW5zL2R1 bmUtcnVsZXMvUkVBRE1FLm1kPg0KDQpbYGV4YW1wbGVzJyBmb2xkZXJdDQo8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sLWdvc3BlbC9vcnRhYy90cmVlL21haW4vZXhhbXBsZXM+DQoNCg0KT3RoZXIg T0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFy ZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9y Zw0KICBibG9nXS4NCg0KICDigKIgW1RoZSBNb3N0IEVsZWdhbnQgQ29uZmlndXJhdGlvbiBMYW5n dWFnZV0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+ DQoNCltUaGUgTW9zdCBFbGVnYW50IENvbmZpZ3VyYXRpb24gTGFuZ3VhZ2VdDQo8aHR0cHM6Ly9j aHNoZXJzaC5jb20vYmxvZy8yMDI1LTAxLTA2LXRoZS1tb3N0LWVsZWdhbnQtY29uZmlndXJhdGlv bi1sYW5ndWFnZS5odG1sPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2Vd IGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFy Y2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3Ug YWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNj cmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2Vu ZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0K DQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltS U1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3 bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9p bmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 07 to 14, 202= 5.

    On concurrency models

    Deep in this thread, Calascibetta Romain announced

    For those interested, we've spent some time writing a book on how to use Miou and = asynchronous programming with Miou =E2=80=94 basically, it introduces Miou'= s design. In addition, resources that may be of interest are:

    A next release of Miou is in preparation and additions to this =E2=80=98lit= tle book=E2=80=99 will be made. In particular, there will be an explanation= of how we implemented happy-eyeballs, which remains a good example.

    OCaml 5.3.0 released

    octachron announced

    We have the pleasure of announcing the release of OCaml version 5.3.0. dedi= cated to the memory of John William Mauchly and Paul Verlaine on the anniversary = of their death.

    De la musique avant toute chose,
    Et pour cela pr=C3=A9f=C3=A8re l=E2=80=99Impair

    (Music first and foremost of all!
    Choose your measure of odd not even)

    Some of the highlights in OCaml 5.3.0 are:

    • Syntax for deep effect handlers

      There is now a dedicated syntax for installing deep effect handler

      match f () w=
      ith
      | x -> x
      | effect Random_=
      float, k -> Effect.Deep.co=
      ntinue k (Random.float 1.0)
      

      This new syntax adds a new effect keyword, which may break exi= sting code. To improve backward compatibility, this new keyword can be disabled with the new -keywords flags if needed for backward compatibility.

    • Restored MSVC port

      It is now possible to use the MSVC toolchain on Windows, restoring the last missing port from OCaml 4 (except for the native compiler support for 32-bit architectures which is not planned)

    • Re-introduced statistical memory profiling (statmemprof)

      The submodule Gc.memprof is restored with a slightly different= API. This submodule can be used to monitor memory allocation statistics inside a program. In OCaml 5, each domain can be monitored independently while child domains inherit the parent domain profiling profile (if there is one active= ).

    • utf-8 encoded Unicode source files and modest support of Unicode identifiers

      type saison =3D Hiver | Ét&#=
      233; | Printemps=
       | Automn=
      e=20
      

      The OCaml lexer has been extended to support a modest subset of Unicode characters in identifiers. This is mostly intended for pedagogical use. This extended support requires source files to be utf-8 encoded Unicode text.

    • More space-efficient implementation of Dynarray

      The internal implementation of Dynarray now uses an unboxed re= presentation which avoids the need of storing items wrapped in a Some x blo= ck and thus save some spaces and indirections.

    • Improved metadata on the pairs of declarations and definitions for merlin.

      The metadata stored inside cmt files has been improved to better distinguis= h the provenance of identifiers (previous versions could confuse an interfa= ce and implementation identifier). Similarly, the metadata now tracks more precisely the association between d= eclarations and definitions. For instance, in

      module X =3D struct let x<=
      /span> =3D 0 end
      module M: sig
        val x: int
      end =3D struct
        let x =3D 1
        include X
      end
      

      Merlin can now determine that the definition of the M.x value = lies inside the module X.

    And a lot of incremental changes:

    • Around 20 new functions in the standard library (in the Domain, Dynarray, Format, List, = Queue, Sys, and Uchar modules).
    • Many fixes and improvements in the runtime
    • Improved error messages for first-class modules, functors, labelled arg= uments, and type clashes.
    • Numerous bug fixes

    Please report any unexpected behaviours on the OCaml issue tracker.

    The full list of changes can be found in the changelog below.

    editor note: please visit https://discuss.ocaml.org/t/ocaml-5-3-0-released/15916= for the changelog

    Happy hacking, Florian Angeletti for the OCaml team.

    dream-html and pure-html 3.9.5

    Yawar Amin announced

    Happy to announce that dream-html and pure-html 3.9.5 are now available on = opam. This is a significant release with three main new things:

    1. Type-safe paths and routing
    2. Support for static asset caching
    3. HTML improvements

    Type-safe paths and routing

    Allows defining paths as values that can be handled by a router and also rendered by the HTML markup generator, so th= at the actual routed paths are in sync with the rendered paths in the appli= cation. These paths use OCaml's built-in format strings rather than a new D= SL: eg /orders/%s/versions/%d. This makes it possible to extra= ct type-safe values from path segments and pass them to the handler; render= markup with guaranteed correct paths; and refactor the app's paths without= having to hunt for hard-coded strings.

    See the docs for details.

    Static assets support

    Automates the handling of static assets in the application so that they can= easily be served by the router with an immutable cache policy and their pa= ths can be rendered in markup with a content-based revision hash, for easy = cache-busting.

    Added a new CLI tool dreamwork which helps with scaffolding th= is static assets setup. The intention is to use it for more scaffolding tas= ks in the future=E2=80=93stay tuned.

    See the docs for details, and this screen recording for a short demo.

    HTML improvements

    Thanks to RezwanArefin01 = for prettifying the generated HTML. It is now formatted and much easier to = read. See the snaps= hots for some examples.

    Lastly, added HTML.as_ which is the as attribute.

    Enjoy!

    Building an OCaml cross compiler with OCaml 5.3

    shym announced

    A cross compiler is a compiler that runs on some = host machine, for instance one running Linux on a 64-bit ARM process= or, and generates code for a different target machine, for instance one running Windows with a 64-bit x86 processor. Building OCaml cross compilers used to be quite tricky and hackish but many= incremental changes to the build system over the last years have improved = radically the situation. So much so that, with the most recent changes (1, 2) in the development branch of th= e compiler, it should be possible to build many cross compilers without ext= ra changes :crossed_fingers:

    This is all well and good, you might say, but you would rather play with th= e brand new 5.3 instead of a development branch! So I=E2=80=99ve backported the= necessary changes to 5.3.

    How to build and use a OCaml 5.3 cross compiler

    To make it easy to test, I=E2=80=99ve written an example OPAM file that can= be customised to suit your goal. It takes the example of building a cross = compiler to 64-bit x86 Windows MinGW, in particular because that always rev= eals unexpected issues :-)

    1. Start by creating a 5.3.0 OPAM switch if you haven=E2=80=99t already.
    2. Choose the target you want to create a cross compiler for and find its = target triplet. The GCC C cross c= ompilers and the GNU cross binutils use target triplets as prefixes for the= commands, so an easy way to find your triplet is to install the tools. So:=
    3. Install the C cross compiler and toolchain for your target. Many Linux = distributions package some cross compilers. For instance, the = CI tests for cross compilers installs on Ubuntu:
      • the gcc-mingw-w64-x86-64 package (which depends on the mat= ching binutils) to cross compile to 64-bit x86 Windows MinGW; in that case,= that target machine is identified by the x86_64-w64-mingw32 t= riplet, so it calls configure with the argument --target= =3Dx86_64-w64-mingw32,
      • the gcc-aarch64-linux-gnu package to cross compile to 64-b= it arm Linux; in that case, the target machine is identified by the a= arch64-linux-gnu triplet.
    4. Create a new OPAM package interactively for instance by choosing the name o= f the package (ocaml-xyz or even ocaml-cross-xyz = are good choices I=E2=80=99d say; my example uses ocaml-cross-windows, for instance) and run:

      opam pin add --edit ocaml-cross-xyz -
      

      This will open an editor so that you can fill in the instructions on how to= build your cross compiler. Use my example= to get you started. In particular you=E2=80=99ll want to configure the --target parameter with the triplet for your target (that could b= e the only change!). If your toolchain and C compiler use that triplet as a= prefix for all the commands, configure will find them automat= ically. Otherwise you=E2=80=99ll need to explicitly set them, by adding arg= uments such as CC=3D... to configure. The CI tests for cross compilers contains such an example to cross co= mpile to Android where CC, AR, PARTIALLD, RANLIB and STRIP are explicitly set…= In other words, I suggest to experiment first with an example with automat= ic configuration!

    You should now have a cross compiler! Let=E2=80=99s use it on a simple sani= ty check test.ml:

    (* Is the =
    proper (target) OS identified? *)
    let _ =3D
      Printf.printf "Version: %s\nOS: %s\nUnix: %b\nWin: %b\nCygwin: %b\n"
        Sys.ocaml_version Sys.os_type Sys.unix Sys.win32 Sys.cygwin
    
    (* Do the compiler libs work?<=
    span style=3D"color: #8f6f4a; font-style: italic;"> *)
    (* The interface for [Arch] is not th=
    e same across processor architectures, the
       following assumes yo=
    ur target is 64-bit x86 *)
    let _ =3D
      Printf.printf "allow_unaligned_access =3D %b\n" Arch.allow_unaligned_access;
      Printf.printf "win64 =3D %b\n" Arch.win64
    

    The package ocaml-cross-xyz will install an ocamlfind toolchain called xyz. So we can compile test.ml thus:

    ocamlfind -toolchain xyz opt -package compiler-libs.optcomp -linkpkg test.m=
    l -verbose
    

    where -verbose let you check what is actually being run. If yo= ur target is Windows MinGW (so cross compiling from some unix), you probabl= y need an extra step before this compilation can go through: the tool flexlink.exe which is used to link the final Windows binary has bee= n built as part of the package but ocamlopt will expect to fin= d a command flexlink (note in particular the absence of = .exe) so I suggest to ln -s the flexlink b= inary somewhere in your PATH. For instance, it could be:

    ln -s "$(opam show --list-files ocaml-cross-xyz | grep flexlink.opt.exe)" ~=
    /bin/flexlink
    

    and then you will be able to run the ocamlfind -toolchain ... = command to compile your program.

    Gotchas and details

    1. Beware that having a flexlink command in PATH= breaks OCaml (5.3 and before)=E2=80=99s configure if you=E2= =80=99re not on Windows; this will be fixed in 5.4.
    2. The example OPAM package contains SHA2= 56 sums for .patch files generated on the fly from the corresp= onding commits but they might change without notice (to add an extra digit = to the SHA1 they contain, for instance). If you notice that, ping me so tha= t I can update the SHA256 sums in the gist.
    3. The example OPAM package pulls the officia= l OCaml 5.3.0 archive along with two patches:

      • the first one is a large commit that squashes all the commits that I ba= ckported from upstream,
      • the second one is a small commit that adds the generation of the = ocamlfind toolchain configuration.

      You can find the detailed backport on my 5.3+ocross branch and its c= omparison with the official release. The squashed commit lives on its <= a href=3D"https://github.com/shym/ocaml/tree/5.3.0+ocross-squashed/">own br= anch.

    Ppx deriving decoders

    Ben Bellick announced

    A little late but wanted to share a package I have released!

    For those familiar with the excellent ocaml-decoders package, I have written ppx_deriving_decoders= to automatically generate the corresponding decoders (and encoders) based = off of type definitions.=20

    In my view, this gives the best of both worlds in terms of:

    1. automatically generating (e.g. JSON) serialization and deserialization = based off of a type definition, and
    2. having a readable and expressive language for handwriting encoders and = decoders when necessary by using combinators.

    The instructions in the README demonstrate how you can use the generated de= coder as a base point from which to hand tweak and get your own custom deco= der.

    Please let me know if you find it useful or have any feedback. Thanks!

    Ortac 0.5.0 testing higher order functions

    Nicolas Osborne announced

    Hi everyone!

    I'm very pleased to announce the release of the Ortac-0.5.0 packages for sp= ecification-driven testing!

    Ortac/QCheck-STM is a test generator based on the QCheck-STM model-based testing fra= mework and the Gospel specification language for OCaml.

    This new release brings three new features.

    In the effort to increase the coverage of the generated tests and thanks to= Jan Midtgaard, we now support testing higher order functions. Thanks Jan!

    It is also now possible to test a module exposed as a sub-module by Dune, s= pecifying the module's prefix in a CLI optional argument. A feature that we= 've been asked to add.

    And to test an actual sub-module defined inside an OCaml file, specifying t= he sub-module in a CLI optional argument as well.

    Ortac/Dune generates the Dune boilerplate for you. It has been updated to s= upport the two new optional arguments.

    You can install those packages via opam:

    $ opam install ortac-qcheck-stm ortac-dune
    

    Then you write some Gospel specifications in your library's interface file = foo.mli:

    type 'a t
    (*@ mutable model contents : 'a sequenc=
    e *)
    
    val make : int -> 'a -> 'a t
    (*@ t =3D make i a
        ensures t.contents =
    =3D Sequence.init i (fun _ -> a) *)
    
    val for_all : ('a -> bool) -> 'a t -> bool
    (*@ b =3D for_all p t
        ensures b =3D Seque=
    nce.fold_left (fun acc a -> acc && p a) true t.contents *)
    

    Then a simple configuration file foo_config.ml:

    type sut =3D char t
    
    let init_sut =3D make 42 'a'
    

    And you can generate some specification-driven model-based tests for your l= ibrary just by running:

    $ ortac qcheck-stm foo.mli foo_config.ml
    

    If you want to integrate the generation and the running of the tests to you= r dune setup (which is highly recommended), just add the following stanza t= o your dune file in your test directory:

    (rule
     (alias runtest)
     (mode promote)
     (action
      (with-stdout-to
       dune.inc
       (run ortac dune qcheck-stm foo.mli))))
    
    (include dune.inc)
    

    You'll find more information in the Ortac/QCheck-STM documentation, t= he Ortac/Dune README and the examples folder. = I'm also happy to answer questions.

    Happy testing!

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=FGqk5APB; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=yZi2MMdT; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 4A0593F80C for ; Tue, 21 Jan 2025 15:47:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=aTJofVy4Kz85QTU/vlN42WcyXsCr1b5IiND2IYgQM7s=; b=FGqk5APBxduwnO6jRKHeE7rql00wtNbfaKDPD9CqUqDUTzOTf1ATanDp fIM5CFaeb/B1ZyJpX1FndnbgfKZ936rB7eQgkCdBmi0ha+0+YHSpdpmjq P/+mD1Pj00D9oYd9HyBED4lDd8sf+gkBFHXWqo1yUdAUVl9AugiY3brVU M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,222,1732575600"; d="scan'208,217";a="204259981" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Jan 2025 16:47:42 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1DC82E0D1E; Tue, 21 Jan 2025 16:47:42 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 53A58E0077 for ; Tue, 21 Jan 2025 16:47:35 +0100 (CET) IronPort-SDR: 678fc192_+S+HCQWSUXDKpN1kyRNaZn2FIG+vmbCVJCRGRE03Fa3D9yp 4zBRYhosjFYidhycVpLvSsMtLQkcBebMyCS8fMQ== X-IPAS-Result: =?us-ascii?q?A0G+IgCmwI9ngSIeaIFQChaCSIE/WygZAWNaMwcISAOEU?= =?us-ascii?q?4FjgWyOIIEWiHyHO4FUhnSCMIFqgREDGBYjFAEDAQ0uAQUMAQECBAEBAwECA?= =?us-ascii?q?YIMgT1xQAQCAop0Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBA?= =?us-ascii?q?gQGAQIQAQE9BUmFew1JAQEBAwEKAQQBgWVRUx5eBwkGAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEiAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QIIBAEHBQYHFwMrJBoCAQIGChMBASYBAQEBAQUCAgQYIwMJCwEGAwIRATUDA?= =?us-ascii?q?RMBEhQCAwEBgg4URYIfRQMFDAY/lmmbFCcQeoEygQGCDAEBBoEIPgIBAQEJA?= =?us-ascii?q?gIDAQ4JJQHaBoFkCYEwGAGFaoJJGgEqSGoChEgJhDECJw+BVUSBFAE1gVYdE?= =?us-ascii?q?jgHb4FBfgsXAQEBAQEXRDsIAQkBBwQGAgECBAIJCQ8REwkJgxyCaYIfF0tFN?= =?us-ascii?q?X1bLF57EYFshGcSTwWBQR5agR+BOx0dJQpGgQ83HQh7LIFbgws+BAQSWQOIJ?= =?us-ascii?q?4FHSzMsAVUTFwsHBWGBEAMtNjGBSXs5gg1pSToCDQI1gh4kWIIrgx2BPYRFh?= =?us-ascii?q?FGFXoIUghGEch1AAwttPTcUG5wmCTU2ATyCbRAFARoLDgoBFBkCBAEBEhcDE?= =?us-ascii?q?AMXAQkCBwoHBAoFAQUCAwkICgQBAQkHEAItAQMBBAUJFQoHBQcDGAERBgIEC?= =?us-ascii?q?QQBBQQECAUEAQIDAQEBAgEKAQwDCQYFAwECAgMGAgYBFREDhF2NYAgKAhIIC?= =?us-ascii?q?gEDBAEBJHeOUIsngmuTUx1tNAeEHoFdBgyIHGmBJIJYiz+EDYNXhASBV4U7h?= =?us-ascii?q?XQDhn2SSSKYWiKCNoJ4gy2BAApTQwUJgW8eTIELhBICgUhwgRwSjBIQFhMDB?= =?us-ascii?q?AQLDQECEGiBKYMSgX4hAjwNIz8BARkDDAczGjBDDQoEB4IRAQEBMQkKPBwPV?= =?us-ascii?q?4dKhV4tARaBDAEBBgGBZVgGECMOOgY9gRgDC4F1FyRaIYEXVAe1HgJCNQIBA?= =?us-ascii?q?QoFKQIHAQoBAQMJhWIBAYMEghdugwhZAiYHBWsDVQgBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:4bLP7qo/n3HGQSidhCh3XDwaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:LBZ8d2Gzzl4m9ocmqmJ57X8QRpoOfET5yUXqDV6gJmdOdI2KHAo= X-Talos-MUID: =?us-ascii?q?9a23=3A59SZPQ2Oo1/1yYxu1gEvK/GMFjUj+JSKOAcKkbk?= =?us-ascii?q?6ntiLCyN0OiqtszeXe9py?= X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.13,222,1732575600"; d="scan'208,217";a="106961614" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDH3+o2R2ZDnG0R/OjTnc7mtPgIbFc6swiJSCb?= =?us-ascii?q?klvtxFI4USm7+QbJSc6aebv0/6sL2LiwZu6tGvv3XpKgos5i5B+G6U3n?= =?us-ascii?q?fiYdtY0RkSW/kryBmmUjVs7rjrZ4QOZ9qE/3KxtooG/KeUprBJHuzmft?= =?us-ascii?q?Cna6GuDUVLi484/PFXWrcrQg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Jan 2025 16:47:30 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D73175648C5; Tue, 21 Jan 2025 16:47:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1737474447; bh=Irm8fjAaojj8K9fBllzuD8/3T08nhhwM91XxhczPmIY=; h=From:To:Subject:Date:Message-ID; b=yZi2MMdTc8T23ZZ+nU69J6xubIjC3Vw8RxxZkHjBcKUY8YWwVsVcD2QUa5LAIHZku 9a6GyUrV23XAgHR87G8uQTSlh70apkLkj9lUUmYgPX/qhKmYSaTeAZh5gyNLS8RbUK KdW9ytIBxWUR3P6ne02urBa0ie6YCgPGuBYVsUKo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 21 Jan 2025 16:47:26 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 21 16:47:29 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499952, queueID=812035648C7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19255 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 14 to 21, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml Software Foundation: January 2025 update ppxlib.034.0 Release of Carton 1.0.0 and Cachet Opam repository archival, phase 2 - OCaml 4.08 is the lower bound Ocaml-posix 2.1.0 released! Release of ocaml-eglot 1.0.0 Semgrep is hiring to help scale their static analysis engine Dune dev meeting Tarides: 2024 in Review Other OCaml News Old CWN OCaml Software Foundation: January 2025 update =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Happy new year! This is an update on recent works of the [OCaml Software Foundation], covering our 2024 actions =E2=80=93 the previous update was in [January 2= 024]. The OCaml Software Foundation is a non-profit foundation ([earlier thread]) that receives funding from [our industrial sponsors] each year, and tries its best to spend it to support and strengthen the OCaml ecosystem and community. The funding volume we receive each year is around 200K=E2=82=AC. (For comparison: this is the yearly cost of one experienced full-time software engineer in many parts of the world.) We do not fund people full-time for long periods. Most actions receive from 3K=E2=82=AC to 20K= =E2=82=AC. The work to prepare and execute actions is mostly done by the (unpaid) [Executive Committee]. It is currently formed by Nicol=C3=A1s Ojeda B=C3= =A4r, Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB=85n, Virgile Prevosto and my= self, with administrative personnel provided by [INRIA] and general assistance by Alan Schmitt. Our current sponsors (thanks!) are [ahrefs], [Jane Street], [Tezos], [Bloomberg], [Lexifi], [SimCorp], [MERCE] and [Tarides]. (If your company would like to join as a sponsor, please [get in touch]. Unfortunately, we still cannot efficiently process small donations, so we are not calling for individual donations.) Feel free to use this thread for questions/suggestions :-) [OCaml Software Foundation] [January 2024] [earlier thread] [our industrial sponsors] [Executive Committee] [INRIA] [ahrefs] [Jane Street] [Tezos] [Bloomberg] [Lexifi] [SimCorp] [MERCE] [Tarides] [get in touch] Recent actions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Education and outreach We funded a new edition of the Spanish [summer school] on functional programming in OCaml, organized in Saragossa by Ricardo Rodriguez and Roberto Blanco. We continued funding the OCaml meetups in Paris and Toulouse, France. In 2024, a [new meetup] started in Chennai, India (first [discuss thread]), which we are delighted to support as well. We are sponsoring the [JFLA 2025], a functional programming conference in France, and an [OCaml Bridge Workshop] at Functional Conf 2025, a large Asian conference on functional programming. [summer school] [new meetup] [discuss thread] [JFLA 2025] [OCaml Bridge Workshop] =E2=97=8A Research The OCaml Software Foundation is typically not involved in funding research, focusing on actions that have an immediate impact on the language and its community. Nevertheless, in 2023 we funded one year of post-doctoral work for Takafumi Saikawa in relation to his maintenance work on the type-checker of OCaml. In 2024 we funded one year of research engineer for the [Salto] project, building a static analyzer for OCaml, and one year of PhD grant for [Alistair O'Brien] in Cambridge (complementing other funding sources for a full PhD), continuing his [impressive work] on constraint-based type inference for OCaml. [Salto] [Alistair O'Brien] [impressive work] =E2=97=8A Ecosystem =E2=97=8A Infrastructure As in previous years, we fund the work of Kate Deplaix to check that the OCaml ecosystem is compatible with upcoming compiler releases; in 2024 Kate worked on OCaml 5.2 and 5.3. We are trying our best to support the work of opam-repository maintainers, through individual funding grants for the active maintainers. This year, on the suggestion of the repository maintainers, we are also funding the work of [Robur] to migrate unmaintained packages to a separate archive ([discuss thread 1], [thread 2]). [Robur] [discuss thread 1] [thread 2] =E2=97=8A Tools In 2024 we have funded one month of maintenance of the `opam' client by Raja Boujbel and her colleagues. We renewed our partial support for the work of Antonio Monteiro on [Melange]. For more Melange news, see for example the announcement of [Melange 4]. [Melange] [Melange 4] =E2=97=8A Libraries We keep supporting the work of Petter Urkedal on the [Caqti] library, the main database connection library in the OCaml community. The [Owl] library for scientific computing has been [restructuring] in 2024, with its two maintainers moving to permanent jobs demanding their time and therefore less available. The OCaml Software Foundation is providing a small grant to help the maintainers transition to a different contribution model and/or preserve a part of their maintenance activity, as they think is best. We have been funding documentation work by John Whitington to collect or create usage examples of important OCaml libraries, prior to their upstreaming in the documentation of each project. See his [ocaml-nursery] repository. We support the contributions of Daniel B=C3=BCnzli to the OCaml ecosystem. This year, Daniel used this support to fund the development of =E2=80=A2 [jsont], a new library for declarative JSON data manipulation =E2=80=A2 [bytesrw], a library of composable byte stream readers and wr= ites, with support for various compression and hashing algorithms =E2=80=A2 [support] for Unicode 16.0 in his Unicode libraries Finally, we have been funding Nathan Rebours to take an active part in the maintenance of the ppxlib project, see his [ppxlib maintenance summary]. [Caqti] [Owl] [restructuring] [ocaml-nursery] [jsont] [bytesrw] [support] [ppxlib maintenance summary] ppxlib.034.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're happy to announce that we just released ppxlib.0.34.0. The full patch notes are available on the release page [over here]. The main features are OCaml 5.3 compatibility, new AST pretty-printing utilities and the ppxlib-tools package, support for `[@@deriving ...]' on class types and the addition of missing `Pprintast' entry points. [over here] Changes summary =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A 5.3 compatibility ppxlib.0.34.0 is the first official ppxlib release that's compatible with the new 5.3 compiler. The ppxlib driver now also comes with a `-keywords' CLI option, similar to the compiler's that allow you to compile and preprocess with the 5.3 compiler code that uses `effect' as an identifier. This is pretty niche but it's there should you need it. Please note that means you can use ppx-es with a 5.3 compiler but not that ppx-es can consume/produce 5.3 language features. We're currently working on a fix allowing you to use the effect syntax in files that require preprocessing as it's not possible with 0.34.0. The fix should be released in the next few days as 0.34.1. =E2=97=8A AST pretty-printing We added a new `Pp_ast' module that allows you to pretty print AST fragments. The only way ppxlib would print ASTs before were as S-expressions. In practice we found that it was not always helpful and wanted a more readable and human friendly way of displaying the AST. The default output of those printer is a simplified version of the AST to keep things clear and avoid cluttering the output with information that is not always useful. For example, if you run `Ppxlib.Pp_ast.Default.expression' on the AST for `x + 2', you'll get the following: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Pexp_apply =E2=94=82 ( Pexp_ident (Lident "+") =E2=94=82 , [ ( Nolabel, Pexp_ident (Lident "x")) =E2=94=82 ; ( Nolabel, Pexp_constant (Pconst_integer ( "2", None))) =E2=94=82 ] =E2=94=82 ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The alert reader will note that there are no locations or attributes and that the `expression' record layer is omitted here. You can of course configure the printer to display more information if you need to. We've been using these new printers internally to debug migration code and they have been a huge help so we hope they will make working with ppxlib easier for you too. In addition to this new module, we also added a command line utility called `ppxlib-pp-ast' to pretty print ASTs from source files, source code fragments or even marshalled AST files. It is very similar to the old `ppx_tools''s `dumpast'. Note that it will print ppxlib's internal AST after it's been migrated from the installed compiler's version. This is something that we could not simply achieve with OCaml's own `-dparsetree'. This should be a useful tool for debugging ppx related bugs or learning about the AST and we hope ppx authors and users will like it. =E2=97=8A Other changes As mentioned above, we also added some missing `Pprintast~=C2=B9 entries such as ~binding', `longident' and `payload'. It is now possible to use `[@@deriving ...]' on class type declarations and therefore to write derivers for class types. =C2=B9: /To the confused readers:/ `Pprintast' /is entirely different fro= m/ `Pp_ast' /mentioned above as it prints the source code corresponding to a given AST./ Plans for the next release =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C =E2=97=8A Internal AST bump to 5.2 Our next release will bump our internal AST to 5.2. It is a pretty big change because 5.2 changed how functions were represented in the AST and this impacts *A LOT* of ppx-es. @patricoferris has been working very hard on this over the past few months to minimize the amount of breakage and to send patches upstream where that was not possible to get the rest of the ecosystem ready for the bump. We wanted to first release the 5.3 compatibility but now that's out of the way we're able to focus on the bump again. @patricoferris will create a dedicated thread shortly to explain a bit what's been going on and what to expect from this release. =E2=97=8A Drop support for OCaml < 4.08 It is time for us to drop support for very old compilers. Keeping support for OCaml 4.07 and before requires maintenances of quite heavy compatibility layers and prevents us from using some language features in ppxlib's source code while providing little to no benefits since the vast majority of users already upgraded to much more recent compilers. If you're still relying on those older compilers and the newest ppxlib, please reach out, either here or via a ppxlib issue. Special thanks =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We wanted to thank our external contributors for this release: @hhugo, @nojb and @dra27 for their help on the 5.3 compat and @mattiasdrp for bringing the `Pprintast' module up to speed. Special thanks as well to @pedrobslisboa who started integrating their excellent [ppx-by-example] into ppxlib's documentation. Finally, I'd also like to thank the OCaml Software Foundation who's been funding all my work on ppxlib and made this release possible! Happy preprocessing to you all! [ppx-by-example] Release of Carton 1.0.0 and Cachet =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm delighted to announce the release of [Carton 1.0.0] and [Cachet] (which will be released soon into `opam-repository'). Carton is a reimplementation of the Git PACK format. A PACK file is what you can find in your `.git/objects/pack' in your favourite Git repository. It contains mainly all your Git objects. This format provides a good compression ratio and the ability to extract objects almost directly. It can be seen as a read-only key-value database =E2=80= =94 in effect, modifying Git objects is impossible. This project is built around the OCaml implementation of Git that we have. But the PACK format is also interesting in its own right and outside the Git concepts. The PACK format offers double compression. A zlib compression (proposed by [decompress]) as well as a compression between objects in the form of a binary patch (proposed by [duff]). So, if the "words" appear quite frequently (like the words used in a programming language =E2=80=94 if, else, then, etc.), the second level of compression becomes very interesting where an object (such as a file) is simply a succession of patches with other objects. [Carton 1.0.0] [Cachet] [decompress] [duff] Cachet, a library for `mmap' syscall =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C Carton and the PACK format very often use syscall `mmap'. The point is to be able to take advantage of the kernel cache system to read a PACK file. The kernel can read a file in advance when reading a page via `mmap'. Basically, the kernel anticipates that you might want to get the next page after the one you requested. However, in the case of Carton, it is sometimes necessary to =E2=80=98go back=E2=80=99, particularly for patched objects whose source is often upstream. Cachet is an intermediate layer for `mmap' that caches previously obtained pages. In this way, we take advantage of both the kernel for subsequent pages and our library for previous pages. Let's take a concrete example. Carton can analyse a PACK file as `git verify-pack' does. Let's make a comparison with and without Cachet. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 +--------------+-------------+----------------+----------------= -+ =E2=94=82 | | with cachet | without cachet | git verify-pack= | =E2=94=82 +--------------+-------------+----------------+----------------= -+ =E2=94=82 | time | 17.8s | 41.8s | 9.3s= | =E2=94=82 +--------------+-------------+----------------+----------------= -+ =E2=94=82 | cache misses | 936M | 1933M | 246M= | =E2=94=82 +--------------+-------------+----------------+----------------= -+ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 As you can see, using Cachet improves Carton's execution time. We're still not as competitive as git-verify-pack, but we're getting close! Cachet offers to cache previously loaded pages. Its cache system is very basic and is just a small array whose size is a power of two. Next, we simply reuse the OCaml hash function =E2=80=94 in this resp= ect, it may be worth testing another hash function. =E2=97=8A Cachet & schedulers Like most of our projects, Cachet is independent of schedulers. There is therefore a variant with [Lwt] and a variant with [Miou]. However, we need to clarify a behaviour related to the use of Cachet. Reading a file, whether with `read(3)' or `mmap(3P)', does not block, but it can take some time. As we have already experienced and explained [here], it may be necessary to explain to the scheduler whether it is appropriate to do something else after such a syscall. In the case of Lwt, it might be a good idea to insert `Lwt.pause' just after our syscall so that Lwt gives another service the opportunity to run despite the time taken trying to read from a file. However, particularly for Lwt, this means closing Cachet in the hell of the monad (in other words, there is no way to escape it) because of this possible `Lwt.pause' (which returns `unit Lwt.t'). The composition of Cachet with Lwt is therefore quite different from what we've been able to experiment with. One of [our other articles] suggests not using functors (too much), and although we can in fact abstract `Lwt.t' from `unit Lwt.t' (and even reduce it such that `type 'a t =3D 'a') with the [HKP] trick, we opted for composition by hand. The problem relates to Lwt (and Async) and doesn't apply to Miou when it's possible to raise effects. However, from such a composition, a choice has been made to give Lwt the opportunity to do something else after `mmap'. We could, in other types of applications, make another choice on this precise question. [Lwt] [Miou] [here] [our other articles] [HKP] Carton =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Carton is a library that was originally developed for ocaml-git. It was internal to the project but we considered that the PACK format's field of application could be wider than that of Git. We decided to extract the project from `ocaml-git' and make it a library in its own right. Carton's objective remains fairly rudimentary. It consists of: =E2=80=A2 extract objects from a PACK file (whether or not these objects = are Git objects) =E2=80=A2 generate an `*.idx' file from a PACK file in order to have quick access to the objects =E2=80=A2 verifying a PACK file such as `git verify-pack' does =E2=80=A2 and finally generate a PACK file from a list of objects Carton is a library and a tool that you can now use on your Git repositories. Here are a few examples of how to use `carton'. We'll start by cloning a repository to test Carton and go to the folder containing the PACK file. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install carton.1.0.0 =E2=94=82 $ git clone https://github.com/ocaml/ocaml =E2=94=82 $ cd ocaml/.git/objects/pack/ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Carton can check a PACK file. Verifying means extracting all the objects in the file from memory and calculating their hash. This command is similar to `git verify-pack'. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ carton verify pack-*.pack =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Carton can extract a specific object (commit, tree or blob) from a PACK file using its associated `*.idx' file and the object identifier (the hash of the commit, for example). =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ carton get pack-*.idx 89055b054eeec0c6c6b6118d6490b6792da7fef2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Instead of extracting objects from a PACK file into memory, you can also extract them as files using `explode'. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ mkdir loose =E2=94=82 $ carton explode 'loose/%s/%s' pack-*.pack > entries.pack =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Finally, Carton can create a new PACK file from a list of objects stored in files with make. It can also generate the `*.idx' file associated with the new PACK file. As we've just re-packaged the objects in the repository, we should find the same objects. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ carton make -n $(cat entries.pack | wc -l) -e entries.pack ne= w.pack =E2=94=82 $ carton index new.pack =E2=94=82 $ carton get new.idx 89055b054eeec0c6c6b6118d6490b6792da7fef2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please note that the above actions, applied to `ocaml/ocaml', may take some time due to the history of this project. In the example above, we can see the extraction of a Git object, the extraction of all the objects in a PACK file and the creation of a new PACK file based on all the extracted objects. As you can see, creating a PACK file can take a long time. However, the advantage of the PACK file lies particularly in obtaining the objects and in the rate of compression of the PACK file: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 +--------+-------------+----------+-------+--------------+ =E2=94=82 | | pack-*.pack | new.pack | loose | loose.tar.gz | =E2=94=82 +--------+-------------+----------+-------+--------------+ =E2=94=82 | size | 355M | 648M | 8.3G | 1.8G | =E2=94=82 +--------+-------------+----------+-------+--------------+ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The PACK file is primarily designed to provide access to objects according to their identifiers. This access must be as fast as possible, even if the object is first compressed with decompress and can be compressed in the form of a patch with duff. Here are a few metrics to give you an idea. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 +--------------+-------------+----------+---------+ =E2=94=82 | | pack-*.pack | new.pack | loose | =E2=94=82 +--------------+-------------+----------+---------+ =E2=94=82 | git cat-file | ~ 0.01s | N/A | N/A | =E2=94=82 +--------------+-------------+----------+---------+ =E2=94=82 | carton get | ~ 0.20s | ~ 0.30s | | =E2=94=82 +--------------+-------------+----------+---------+ =E2=94=82 | cat | N/A | N/A | 0.0006s | =E2=94=82 +--------------+-------------+----------+---------+ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 What's important to note is the ability to have random access to objects simply by having the associated `*.idx' file, the production of which is quite efficient. This is not or hardly the case for compression formats such as GZip. And that's the whole point of PACK files, with an indexing method for almost immediate access to objects according to their identifiers and offering a very good compression ratio. *NOTE*: Carton does not compress the repository as well as Git. The main reason is that Git has some heuristics relating to Git objects that Carton does not implement - because Carton wishes to be independent of Git concepts. These heuristics apply in particular to the order in which we want to pack objects. In addition, Git prepares the ground so that the antecedents of a blob object (which is a file in your repository), for example, are the old versions of that same blob (and therefore the old versions of your file). In this context, the patch algorithm implemented by [duff] applies very well and gives very good results. For more details on these heuristics, you can read [this discussion] that serves as documentation. [duff] [this discussion] =E2=97=8A Carton & parallelism As always, our libraries are independent of schedulers. There is a version of Carton with Lwt and a version with Miou. Some of the tasks Carton performs, such as indexing, are highly parallelizable. In this case, the new derivation of Carton with Miou exists to take advantage of the latter's domain pool. It was also quite easy to parallelize the work on `carton index' and `carton verify'. Here are some other metrics which, thanks to OCaml 5 and Miou, bring us closer to Git performance: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ hyperfine \ =E2=94=82 -n git \ =E2=94=82 "git verify-pack pack-03a3a824757ff4c225874557c36d44eefe3d7= 918.idx" \ =E2=94=82 -n carton \ =E2=94=82 "carton verify pack-03a3a824757ff4c225874557c36d44eefe3d791= 8.pack -q --threads 4" =E2=94=82 Benchmark 1: git =E2=94=82 Time (mean =C2=B1 =CF=83): 329.2 ms =C2=B1 0.9 ms [U= ser: 384.2 ms, System: 27.8 ms] =E2=94=82 Range (min =E2=80=A6 max): 327.7 ms =E2=80=A6 330.9 ms 1= 0 runs =E2=94=82=20=20 =E2=94=82 Benchmark 2: carton =E2=94=82 Time (mean =C2=B1 =CF=83): 712.1 ms =C2=B1 10.9 ms [U= ser: 1111.8 ms, System: 1112.6 ms] =E2=94=82 Range (min =E2=80=A6 max): 695.4 ms =E2=80=A6 726.8 ms 1= 0 runs =E2=94=82=20=20 =E2=94=82 Summary =E2=94=82 git ran =E2=94=82 2.16 =C2=B1 0.03 times faster than carton =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 *NOTE*: it may come as a surprise that Carton is 2 times slower than Git for analysing a PACK file, but it should be noted that almost the entire Carton implementation is in OCaml! At this stage, the idea is more to give you an idea, but we literally find ourselves comparing a Bugatti with a [Citro=C3=ABn 2CV]. [Citro=C3=ABn 2CV] =E2=97=8A Carton & Emails Finally, this in-depth rewrite of Carton allows us to take advantage of the PACK format for storing our emails. In fact, we are experimenting with and developing an email solution within our cooperative, and email archiving is one of our objectives. Based on our experience of implementing Git, we thought that the PACK format could be a very interesting format for archiving emails. It combines two features, rapid access to emails and compression by patches, which are very interesting when it comes to handling emails. Finally, it also corresponds more or less to the way we use email: =E2=80=A2 we don't want to delete them (more often than not, we want to k= eep them _ad vitam aeternam_) =E2=80=A2 and we don't modify them It therefore corresponds to a sort of read-only database. For more details on this aspect of Carton and the results of our experiments, I suggest you read our [recent article on our cooperative's blog]. [recent article on our cooperative's blog] Opam repository archival, phase 2 - OCaml 4.08 is the lower bound =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my pleasure to announce below the list of opam packages that will move to the opam-repository-archive on February 1st 2025. In total there are 5855 opam files scheduled for being moved within 1218 unique packages. This decreases the size of the opam-repository by roughly 20%. /Editor note: please follow the post link for the other articles with whole list./ This list contains all packages that are not compatible with OCaml >=3D 4.08, and packages that after archiving those are not installable due to missing dependencies. The "not installable" list has been generated by [archive-opam], and this may of course contain bugs. A smaller list contains a re-run of phase 1 (packages that are available: false) - where the availability was added between Dec 15th and now. If you find a package in the list and you=E2=80=99d like to retain it in = the opam-repository, there are some options: =E2=80=A2 (a) you can install it on your system (`opam install'): this me= ans there=E2=80=99s a bug in the archive-opam utility, please provide the package name and version in the [opam-repository-archive Phase 2 PR], together with your opam version, OCaml version, and operating system; =E2=80=A2 (b) it is not installable: please figure out the reasoning (the =E2=80=9CReasoning=E2=80=9D may help you to find the root issue), and t= ry to fix it yourself - if you=E2=80=99re unable to fix the root cause, please also comment in the [opam-repository-archive Phase 2 PR] with the package name and version. If you=E2=80=99ve any questions, please don=E2=80=99t hesitate to ask her= e or on GitHub or via another communication channel. You can help further on the archiving process: =E2=80=A2 as mentioned in the last announcement please add the `x-maintenance-intent' to your packages (a good choice for a lot of packages is `x-maintenance-intent: [("latest")]' if you=E2=80=99re maintaining the latest version only) - this will be considered in Phase 3 (March 1st 2025); =E2=80=A2 if you are the author or maintainer of a package that is no lon= ger useful or maintained, you can as well mark your opam files in the opam-repository with `x-maintenance-intent: [("none")]' (this will be taken into account in Phase 3 - March 1st 2025); =E2=80=A2 if you flagged your preliminary releases with `flags: avoid-version', and they can now be removed (e.g. since a stable version has been released), please open a pull request to replace the `avoid-version' with `deprecated'. Please note that the next Phase will be announced on February 15th with all packages where the `x-maintenance-intent' does not match, and which do not have any reverse dependencies - archiving is scheduled for March 1st. To keep track of the announcements, please look at the [opam-repository tag]. A big thanks to the OCaml Software Foundation for funding the opam-repository archival project. [archive-opam] [opam-repository-archive Phase 2 PR] [opam-repository tag] Ocaml-posix 2.1.0 released! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Romain Beauxis announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi all! Version `2.1.0' of `ocaml-posix' has been released! =E2=80=A2 Repo: =E2=80=A2 API doc: [ocaml-posix] While it was long overdue, this version only include minor changes, along with the addition of `posix-math2'. These packages are intended to provide a consistent, extensive set of bindings for the various POSIX APIs to be used with [ocaml-ctypes] when building bindings to C libraries that require the use of these APIs. While working on OCaml projects, it is common to have to interface with APIs derived from the POSIX specifications, `getaddrinfo', `uname' etc. The core OCaml library provides their own version of these APIs but: =E2=80=A2 They only cover parts of it =E2=80=A2 They wrap some native types such as `socketaddr' into custom, o= paque OCaml types, making it impossible to re-use, for instance when using a C library API requiring a POSIX `sockaddr'. Thus, having a large, consistent set of bindings for these APIs that reflect the actual C types, structures and etc greatly improves the usability of the language and ecosystem as a whole by making it possible to interface it with a large set of C libraries in a reusable way. The project has been mostly stable for a couple of years (and so have the POSIX standards), but could use some more hands if there is more need in the community to extend the set of POSIX APIs supported by the language. [ocaml-posix] [ocaml-ctypes] Release of ocaml-eglot 1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! We (at [Tarides]) are _particularly pleased_ to announce the first release of [OCaml-eglot], An overlay on [Eglot] (the _built-in_ [LSP] client for Emacs) for editing OCaml! =E2=80=A2 [Github repository] =E2=80=A2 [Package on MELPA] =E2=80=A2 [Features list] =E2=80=A2 [Installation procedure] =E2=80=A2 [Comparison table with Merlin] [Tarides] [OCaml-eglot] [Eglot] [LSP] [Github repository] [Package on MELPA] [Features list] [Installation procedure] [Comparison table with Merlin] More precisely =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Typically, developers who use Emacs (`43.7%' in 2022, [according to the OCaml User Survey]) use a major mode (such as the venerable [caml-mode], or [tuareg]) and [Merlin] to provide IDE services. In 2016, Microsoft has released LSP, a generic protocol for interacting with editors which, at first, was only used by Visual Studio Code, but, since 2020, has really become the norm. De-facto, following the LSP standard gives very good _default_ (completion, jump to definition, =E2=80=A6). OCaml has excellent LSP ([ocaml-lsp-server]) supp= ort, which is used in particular by the [OCaml platform for Visual Studio Code]. With the aim of reducing maintenance for all possible editors, going LSP seems to be a good direction. A pertinent choice, especially since the major historical editors (such as Vim and Emacs) offer, in their recent versions, LSP clients _out of the box_. However, in the same way that the OCaml client for VSCode integrates *OCaml-specific* features, it was necessary to support these features on the Emacs side (and in the future, Vim) to compete with Merlin, which is the goal of `ocaml-eglot', to *provide a tailored development experience for OCaml code editing*! [according to the OCaml User Survey] [caml-mode] [tuareg] [Merlin] [ocaml-lsp-server] [OCaml platform for Visual Studio Code] User feedback and future development =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C We've just released the first version of OCaml-eglot, and, much like the various editor-related projects (Merlin, Vscode-ocaml-platform, Merlin for Emacs, Merlin for Vim), *we're more than open to community collaboration, user feedback*, in order to provide the best possible user experience! _Happy Hacking_! Semgrep is hiring to help scale their static analysis engine =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Emma Jin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Semgrep is an application security company focused on detecting and remediating vulnerabilities. The static analysis engine is primarily written in OCaml. We're looking for a software engineer to help us support scanning larger repositories and add many more users. The ideal candidate has owned a critical tool, worked on an OCaml project, and is interested in static analysis. If this sounds interesting to you, see our job posting at ! Let me know if you have any questions! Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi Dune enthusiasts :camel:, We will hold the regular Dune Dev Meeting on *Wednesday, January, 22nd at 16:00* CET. As usual, the session will be one hour long. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize with the Dune developers! :calendar: Agenda =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The agenda is available on the[ meeting dedicated page]. Feel free to ask if you want to add more items in it. [ meeting dedicated page] :computer: Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Meeting link: [zoom] =E2=80=A2 Calendar event: [google calendar] =E2=80=A2 Wiki with information and previous notes: [GitHub Wiki] [zoom] [google calendar] [GitHub Wiki] Tarides: 2024 in Review =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Gazagnaire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 At [Tarides], we believe in making OCaml a mainstream programming language by improving its tooling and integration with other successful ecosystems. In 2024, we focused our efforts on initiatives to advance this vision by addressing key technical challenges and engaging with the community to build a stronger foundation for OCaml=E2= =80=99s growth. This report details our work, the rationale behind our choices, and the impact achieved. We are very interested in getting your feedback: [please get in touch] (or respond to this thread!) if you believe we are going in the right direction. /__TL;DR__ =E2=80=93 In 2024, Tarides focused on removing adoption fricti= on with better documentation and tools; and on improving adoption via the integration with three key thriving ecosystems: multicore programming, web development, and Windows support. Updates to [ocaml.org] improved onboarding and documentation, while the [Dune Developer Preview] simplified workflows with integrated package management. Merlin added support for [project-wide reference support] and [odoc 3], which is about to be released. OCaml 5.3 marked the first stable multicore release, and `js_of_ocaml' achieved up to 8x performance boosts in real-world commercial applications thanks to added support for WebAssembly. On Windows, opam 2.2 brought full compatibility and CI testing to all Tier 1 platforms on `opam-repository', slowly moving community packages towards reliable and better support for Windows. Tarides=E2=80=99 community support included organising the first= [FUN OCaml conference], many local meetups, and two rounds of Outreachy internships./ [Tarides] [please get in touch] [ocaml.org] [Dune Developer Preview] [project-wide reference support] [odoc 3] [FUN OCaml conference] Better Tools: Toward a 1-Click Installation of OCaml =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C Our primary effort in 2024 was to continue delivering on the [OCaml Platform roadmap] published last year. We focused on making it easier to get started with OCaml by removing friction in the installation and onboarding process. Our priorities were guided by the latest [OCSF User Survey], direct user interviews, and [feedback] gathered from the OCaml community. Updates from Tarides and other OCaml Platform maintainers were regularly shared in the [OCaml Platform Newsletter]. [OCaml Platform roadmap] [OCSF User Survey] [feedback] [OCaml Platform Newsletter] =E2=97=8A OCaml.org OCaml.org is the main entry point for new users of OCaml. Tarides engineers are key members of the OCaml.org team. Using [privacy-preserving analytics], the team tracked visitor behaviour to identify key areas for improvement. This led to a redesign of the [installation page], simplifying the setup process, and a revamp of the [guided tour of OCaml] to better introduce the language. Both pages saw significant traffic increases compared to 2023, with the installation page recording 69k visits, the tour reaching 65k visits and a very encouraging total number of visits increasing by +33% between Q3 and Q4 2024 Efforts to improve user experience included a satisfaction survey where 75% of respondents rated their experience positively, compared to 17% for the previous version of the site. User testing sessions with 21 participants provided further actionable insights, and these findings informed updates to the platform. The redesign of OCaml.org community sections was completed using this feedback. It introduced several new features: a new [Community landing page], an [academic institutions page] with course listings, and an [industrial users showcase]. The team also implemented an automated [event announcement] system to inform the community of ongoing activities. Progress and updates were regularly shared through the [OCaml.org newsletters], keeping the community informed about developments. Looking ahead, the team will continue refining the platform by addressing feedback, expanding resources, and monitoring impact through analytics to support both new and experienced OCaml users. Lastly, the infrastructure they build is starting to be used by other communities: [Rocq] just announced their brand new website, built using the same codebase as ocaml.org! [privacy-preserving analytics] [installation page] [guided tour of OCaml] [Community landing page] [academic institutions page] [industrial users showcase] [event announcement] [OCaml.org newsletters] [Rocq] =E2=97=8A Dune as the Default Frontend of the OCaml Platform One of the main goals of the OCaml Platform is to make it easier for users=E2=80=94especially newcomers=E2=80=94to adopt OCaml and build proje= cts with minimal friction. A critical step toward this goal is having a single CLI to serve as the frontend for the entire OCaml development experience (codenamed [Bob] in the past). This year, we made significant progress in that direction with the release of the [Dune Developer Preview]. Setting up an OCaml project currently requires multiple tools: `opam' for package management, `dune' for builds, and additional installations for tools like OCamlFormat or Odoc. While powerful, this fragmented workflow can make onboarding daunting for new users. The Dune Developer Preview consolidates these steps under a single CLI, making OCaml more approachable. With this preview, setting up and building a project is as simple as: 1. `dune pkg lock' to lock the dependencies. 2. `dune build' to fetch the dependencies and compile the project. This effort is also driving broader ecosystem improvements. The current OCaml compiler relies on fixed installation paths, making it difficult to cache and reuse across environments, so it cannot be shared efficiently between projects. To address this, we are working on making the compiler relocatable ([ongoing work]). This change will enable compiler caching, which means faster project startup times and fewer rebuilds in CI. As part of this effort, we also [maintain] patches to core OCaml projects to make them relocatable =E2=80=93 and we worked with upstream to merge (like [for ocamlfind]). Tarides engineers also continued to maintain Dune and other key Platform projects, ensuring stability and progress. This included organising and participating in regular development meetings (for [Dune], [opam], [Merlin], [ppxlib], etc.) to prioritise community needs and align efforts across tools like Dune and opam to avoid overlapping functionality. The Dune Developer Preview is an iterative experiment. Early user feedback has been promising (the Preview=E2=80=99s NPS went from +9 in Q3= 2024 to +27 in Q4 2024), and future updates will refine the experience further. We aim to ensure that experimental features in the Preview are upstreamed into stable releases once thoroughly tested. For instance, the package management feature is already in Dune 3.17. We will announce and document it more widely when we believe it is mature enough for broader adoption. [Bob] [Dune Developer Preview] [ongoing work] [maintain] [for ocamlfind] [Dune] [opam] [Merlin] [ppxlib] =E2=97=8A Editors In 2024, Tarides focused on improving editor integration to lower barriers for new OCaml developers and enhance the experience for existing users. Editors are the primary way developers interact with programming languages, making seamless integration essential for adoption. With more than [73% of developers using Visual Studio Code (VS Code)], VS Code is particularly important to support, especially for new developers and those transitioning to OCaml. As part of this effort, Tarides wrote and maintained the [official VS Code plugin for OCaml,] prioritising feature development for this editor. We also support other popular editors like Emacs and Vim=E2=80=94used by many Tar= ides engineers=E2=80=94on a best-effort basis. Improvements to [OCaml-LSP] and [Merlin], both maintained by Tarides, benefit all supported editors, ensuring a consistent and productive development experience. While several plugins for OCaml exist ([OCaml and Reason IDE]=E2=80=93128k installs, [Hackwaly]=E2=80=9390k installs), our [OCaml VS Code plugin] = =E2=80=93now with over 208k downloads=E2=80=93 is a key entry point for developers ado= pting OCaml in 2024. This year, we added integration with the Dune Developer Preview, allowing users to leverage Dune's package management and tooling directly from the editor. Features such as real-time diagnostics, autocompletion, and the ability to fetch dependencies and build projects without leaving VS Code simplify development and make OCaml more accessible for newcomers. The standout update in 2024 was the addition of [project-wide reference support], a long-requested feature from the OCaml community and a top priority for commercial developers. This feature allows users to locate all occurrences of a term across an entire codebase, making navigation and refactoring significantly easier=E2=80=94especially= in large projects. Delivering this feature required coordinated updates across the ecosystem, including changes to the OCaml compiler, Merlin, OCaml LSP, Dune, and related tools. The impact is clear: faster navigation, reduced cognitive overhead, and more efficient workflows when working with complex projects. Additional improvements included support for new Language Server Protocol features, such as `signature_help' and `inlay_hint', which enhance code readability and provide more contextual information. These updates enabled the introduction of new commands, such as the "Destruct" command. This [little-known but powerful feature] automatically expands a variable into a pattern-matching expression corresponding to its inferred type, streamlining tasks that would otherwise be tedious. [73% of developers using Visual Studio Code (VS Code)] [official VS Code plugin for OCaml,] [OCaml-LSP] [Merlin] [OCaml and Reason IDE] [Hackwaly] [OCaml VS Code plugin] [project-wide reference support] [little-known but powerful feature] =E2=97=8A Documentation Documentation was identified as the number one pain point in the latest [OCSF survey]. It is a critical step in the OCaml developer journey, particularly after setting up the language and editor. Tarides prioritised improving `odoc' to make it easier for developers to find information, learn the language, and navigate the ecosystem effectively. High-quality documentation and tools to help developers get "unstuck" are essential to reducing friction and ensuring a smooth adoption experience. Tarides is the primary contributor and maintainer of [`odoc'], OCaml=E2= =80=99s main documentation tool. In preparation for the [odoc 3 release], our team introduced two significant updates. First, the [`odoc' Search Engine] was integrated, allowing developers to search directly within OCaml documentation via the [Learn page]. Second, the [`odoc' Cheatsheet] provides a concise reference for creating and consuming OCaml documentation. We would like to believe that these updates, deployed on ocaml.org, were the main cause of a **45% increase in package documentation usage** on [https://ocaml.org/pkg/] in Q4 2024! Another area where developers often get stuck is debugging programs that don=E2=80=99t work as expected. Alongside reading documentation, live debuggers are crucial for understanding program issues. Tarides worked to improve native debugging for OCaml, focusing on macOS, where LLDB is the only supported debugger. Key progress included a [name mangling fix] to improve symbol resolution, restoring ARM64 backtraces, and introducing Python shims for code sharing between LLDB and GDB. OCaml=E2=80=99s error messages remain a common pain point, particularly f= or syntax errors. Unlike [Rust=E2=80=99s error index], OCaml does not (yet!)= have a centralised repository of error explanations. Instead, we are focused on making error messages more self-explanatory. This requires developing new tools, such as [`lrgrep'], a domain-specific language for analysing grammars built with Menhir. `lrgrep' enables concise definitions of error cases, making it possible to identify and address specific patterns in the parser more effectively. This provides a practical way to improve error messages without requiring changes to the compiler. In December 2024, @let-def successfully defended his PhD (a collaboration between Inria and Tarides) on this topic, so expect upstreaming work to start soon. [OCSF survey] [`odoc'] [odoc 3 release] [`odoc' Search Engine] [Learn page] [`odoc' Cheatsheet] [https://ocaml.org/pkg/] [name mangling fix] [Rust=E2=80=99s error index] [`lrgrep'] =E2=97=8A OCaml Package Ecosystem The last piece of friction we aimed to remove in 2024 was ensuring that users wouldn=E2=80=99t encounter errors when installing a package fr= om the community. This required catching issues early=E2=80=94before package= s are accepted into `opam-repository' and made available to the broader ecosystem. To achieve this, Tarides has built and maintained extensive CI infrastructure, developed tools to empower contributors, and guided package authors to uphold the high quality of the OCaml package ecosystem. In 2024, Tarides=E2=80=99 CI infrastructure supported the OCaml community= at scale, handling approximately **20 million jobs on 68 machines covering 5 hardware architectures**. This infrastructure continuously tested packages to ensure compatibility across a variety of platforms and configurations, including OCaml=E2=80=99s Tier 1 platforms: x86, ARM, RISC-V, s390x, and Power. It played a critical role during major events, such as new OCaml releases, by validating the ecosystem=E2=80=99s readiness and catching regressions before they impacted users. Additionally, this infrastructure supported daily submissions to `opam-repository', enabling contributors to identify and resolve issues early, reducing downstream problems. To improve transparency and accessibility, we introduced a CI pipeline that automates configuration updates, ensuring seamless deployments and allowing external contributors to propose and apply changes independently. In addition to maintaining the infrastructure, Tarides developed and maintained the CI framework running on top of it. A major focus in 2024 was making CI checks available as standalone CLI tools distributed via `opam'. These tools enable package authors to run checks locally, empowering them to catch issues before submitting their packages to `opam-repository'. This approach reduces reliance on central infrastructure and allows developers to work more efficiently. The CLI tools are also compatible with GitHub Actions, allowing contributors to integrate tests into their own workflows. To complement these efforts, we enhanced `opam-repo-ci', which remains an essential safety net for packages entering the repository. Integration tests for linting and reverse dependencies were introduced, enabling more robust regression detection and improving the reliability of the ecosystem. To uphold the high standards of the OCaml ecosystem, every package submission to `opam-repository' is reviewed and validated to ensure it meets quality criteria. This gatekeeping process minimises errors users might encounter when installing community packages, enhancing trust in the ecosystem. In 2024, Tarides continued to be actively [involved] in maintaining the repository, ensuring its smooth operation. We also worked to guide new package authors by updating the [contributing guide] and creating a detailed [wiki] with actionable instructions for adding and maintaining packages. These resources were [announced on Discuss] to reach the community and simplify the process for new contributors, improving the overall quality of submissions. [involved] [contributing guide] [wiki] [announced on Discuss] Playing Better with the Larger Ecosystem =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Concurrent & Parallel Programming in OCaml _"Shared-memory multiprocessors have never really 'taken off', at least in the general public. For large parallel computations, clusters (distributed-memory systems) are the norm. For desktop use, monoprocessors are plenty fast."_ =E2=80=93 [Xavier Leroy, November 2002] Twenty+ years after this statement, processors are multicore by default, and OCaml has adapted to this reality. Thanks to the combined efforts of the OCaml Labs and Tarides team, the OCaml 5.x series introduced multicore support after [a decade of research and experimentation.] While this was a landmark achievement, the path to making multicore OCaml stable, performant, and user-friendly has required significant collaboration and continued work. In 2024, Tarides remained focused on meeting the needs of the broader community and commercial users. OCaml 5.3 (released last week) was an important milestone in this journey. With companies such as [Routine], [Hyper], and [Asemio] adopting OCaml 5.x, and advanced experimentation ongoing at Jane Street, Tezos, Semgrep, and others, OCaml 5.3 is increasingly seen as the first =E2=80=9Cstable=E2=80=9D release of the multicore series. While= some [performance issues] remain in specific parts of the runtime, we are working closely with the community to address them in OCaml 5.4. Tarides contributed extensively to the [5.2] and [5.3] releases by directly contributing to **nearly two-thirds of the merged pull requests**. Since Multicore OCaml was incorporated upstream in 2023, we have been continuously involved in the compiler and language evolution in collaboration with Inria and the broader OCaml ecosystem. Developing correct concurrent and parallel software is inherently challenging, and this applies as much to the runtime as to applications built on it. In 2024, we focused on advanced testing tools to help identify and address subtle issues in OCaml=E2=80=99s runti= me and libraries. The [property-based test suite] reached maturity this year, uncovering over 40 critical issues, with 28 resolved by Tarides engineers. Trusted to detect subtle bugs, such as [issues with orphaned ephemerons], the suite has become an integral part of OCaml=E2= =80=99s development workflow. Importantly, it is accessible to contributors without deep expertise in multicore programming, ensuring any changes in the compiler or the runtime do not introduce subtle concurrency bugs. Another critical effort was extending ThreadSanitizer (TSAN) support to most Tier 1 platforms and [applying it extensively to find and fix data races in the runtime]. This work has improved the safety and reliability of OCaml=E2=80=99s multicore features and is now part of the standard testing process, further ensuring the robustness of the runtime. Beyond testing, we also worked to enhance library support for multicore programming. The release of the [Saturn library] introduced lock-free data structures tailored for OCaml 5.x. To validate these structures, we developed [DSCheck], a static analyser for verifying lock-free algorithms. These tools, along with Saturn itself, provide developers with reliable building blocks for scalable multicore applications. Another promising development in 2024 was the introduction of the [Picos] framework. Picos aims to provide a low-level foundation for concurrency, simplifying interoperability between libraries like Eio, Moonpool, Miou, Riot, Affect, etc. Picos offers a simple, unopinionated, and safe abstraction layer for concurrency. We believe it can potentially standardise concurrency patterns in OCaml, but we are not there yet. Discussions are underway to integrate parts of Picos into higher-level libraries and, eventually, the standard library. We still have a long way to go, and getting feedback from people who actively tried it in production settings would be very helpful! [Xavier Leroy, November 2002] [a decade of research and experimentation.] [Routine] [Hyper] [Asemio] [performance issues] [5.2] [5.3] [property-based test suite] [issues with orphaned ephemerons] [applying it extensively to find and fix data races in the runtime] [Saturn library] [DSCheck] [Picos] =E2=97=8A Web Web development remains one of the most visible and impactful domains for programming languages; [JavaScript, HTML, and CSS are the most popular technologies] in 2024. For OCaml to grow, it must integrate well with this ecosystem. Fortunately, the OCaml community has already built a solid foundation for web development! On the frontend side, in 2024, Tarides focused on strengthening key tools like [`js_of_ocaml'] by expanding its support for WebAssembly (Wasm). `js_of_ocaml' (JSOO) has long been the backbone of OCaml=E2=80=99= s web ecosystem, enabling developers to compile OCaml bytecode into JavaScript. This year, we [merged Wasm support back into JSOO], unifying the toolchain and simplifying adoption for developers. The performance gain of Wasm has been very impressive so far: CPU-intensive applications in commercial settings have seen **2x to 8x speedups** using Wasm compared to traditional JSOO. We also worked on better support for effect handlers in `js_of_ocaml' to ensure applications built with OCaml 5 can run as fast in the browser as they used to with OCaml 4. On the backend side, Tarides maintained and contributed to Dream, a lightweight and flexible web framework. Dream powers projects like [our own website] and the [MirageOS website], where we maintain a fork to make Dream and MirageOS work well together. Additionally, in 2024, we enhanced `cohttp', adding [proxy support] to address modern HTTP requirements. While Tarides focused on JSOO, `wasm_of_ocaml', Dream, and Cohttp, the broader community made significant strides elsewhere. Tools like Melange offer an alternative for compiling OCaml to JavaScript, and frameworks like Ocsigen, which integrates backend and frontend programming, continue to push the boundaries of what=E2=80=99s possible w= ith OCaml on the web. Notably, Tarides will build on this momentum in 2025 through a [grant] to improve direct-style programming for Ocsigen. [JavaScript, HTML, and CSS are the most popular technologies] [`js_of_ocaml'] [merged Wasm support back into JSOO] [our own website] [MirageOS website] [proxy support] [grant] =E2=97=8A Windows Windows is the most widely used operating system, making first-class support for it critical to OCaml=E2=80=99s growth. In 2024, **31% of visi= tors to [ocaml.org]** accessed the site from Windows, yet the platform=E2=80= =99s support historically lagged behind Linux and macOS. This gap created barriers for both newcomers and commercial users. We saw these challenges firsthand, with Outreachy interns struggling to get started due to tooling issues, and commercial users reporting difficulties with workflow reliability and compilation speed. To address these pain points, Tarides, in collaboration with the OCaml community, launched the [Windows Working Group]. A key milestone that our team contributed to was the release this year of **opam 2.2**, three years after its predecessor. This release made the upstream `opam-repository' fully compatible with Windows for the first time, removing the need for a separate repository and providing Windows developers access to the same ecosystem as Linux and macOS users. The impact has been clear: feedback on the updated installation workflow has been overwhelmingly positive, with developers reporting that it "just works." The [install page] for Windows is now significantly shorter and simpler! In the OCaml 5.3 release, Tarides restored the MSVC Windows port, ensuring native compatibility and improving performance for Windows users. To further support the ecosystem, Tarides added Windows machines to the opam infrastructure, enabling automated testing for Windows compatibility on every new package submitted to opam. This has already started to improve package support, with ongoing fixes from Tarides and the community. The results are publicly visible at [windows.check.ci.dev], which we run on our infrastructure, providing transparency and a way to track progress on the status of our ecosystem. While package support is not yet on par with other platforms, we believe that the foundations laid in 2024=E2=80=94simplified installation, improved tooling, and continuous package testing=E2=80=94represent a significant step forward. [ocaml.org] [Windows Working Group] [install page] [windows.check.ci.dev] Community Engagement and Outreach =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In 2024, Tarides contributed to building a stronger OCaml community through events, internships, and support for foundational projects. The creation of [FUN OCaml 2024] in Berlin was the first dedicated OCaml-only event for a long time (similar to how the OCaml Workshop was separated from ICFP in the past). Over 75 participants joined for two days of talks, workshops, and hacking, and the event has already reached [5k+ views on YouTube]. Tarides also co-chaired the OCaml Workshop at [ICFP 2024] in Milan, bringing together contributors from academia, industry, and open-source communities. These events brought together two different kinds of OCaml developers (with some overlap), bringing an interesting energy to our community. To expand local community involvement, Tarides organised OCaml hacking meetups in [Manila] and [Chennai]. To make it easier for others to host similar events, we curated a list of interesting hacking issues from past [Cambridge sessions], now available on [GitHub]. As part of the Outreachy program, Tarides supported two rounds of internships in 2024, with results published on [Discuss] and [watch.ocaml.org]. These internships not only provided great contributions to our ecosystem but also brought fresh insights into the challenges faced by new users. For example, interns identified key areas where documentation and tooling could be improved, directly informing future updates. Tarides also maintained its commitment to funding critical open-source projects and maintainers. We continued funding [Robur] for their maintenance work on MirageOS (most of those libraries are used by many =E2=80=93including us=E2=80=93 even in non-MirageOS context) and [Daniel = B=C3=BCnzli], whose libraries like `cmdliner' are essential for some of our development. Finally, Tarides extended sponsorships to non-OCaml-specific events, including [JFLA], [BobConf], [FSTTCS], and [Terminal Feud] (which garnered over 100k views). These events expanded OCaml=E2=80=99s visibili= ty to new audiences and contexts, introducing the language to a broader technical community that =E2=80=93we hope=E2=80=93 will discover OCaml an= d enjoy using it as much as we do. [FUN OCaml 2024] [5k+ views on YouTube] [ICFP 2024] [Manila] [Chennai] [Cambridge sessions] [GitHub] [Discuss] [watch.ocaml.org] [Robur] [Daniel B=C3=BCnzli] [JFLA] [BobConf] [FSTTCS] [Terminal Feud] What=E2=80=99s Next? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C As we begin 2025, Tarides remains committed to making OCaml a mainstream language. Our focus this year is to position OCaml as a robust choice for mission-critical applications by enhancing developer experience, ecosystem integration, and readiness for high-assurance use cases. We aim to build on the Dune Developer Preview to further improve usability across all platforms, with a particular emphasis on Windows, to make OCaml more accessible to a broader range of developers. Simultaneously, we will ensure OCaml is ready for critical applications in industries where reliability, performance, and security are essential. Projects like [SpaceOS] showcase the potential of memory- and type-safe languages for safety-critical systems. Built on MirageOS and OCaml=E2=80=99s unique properties, SpaceOS is part of the EU-funded [Orchide] project and aims to set a new standard for edge computing in space. Additionally, SpaceOS is being launched in the US through our spin-off [Parsimoni]. However, these needs are not limited to Space: both the [EU Cyber Resilience Act] and the [US cybersecurity initiatives] highlight the growing demand for type-safe, high-assurance software to address compliance and security challenges in sensitive domains. Tarides believes that OCaml has a decisive role to play here in 2025! I=E2=80=99d like to personally thank our sponsors and customers, especial= ly Jane Street, for their unwavering support over the years, and to [Dennis Dang], our single recurring GitHub sponsor. Finally, to every member of Tarides who worked so hard in 2024 to make all of this happen: thank you. I=E2=80=99m truly lucky to be sailing with you on this journey! /We are looking for [sponsors on GitHub], are happy to [collaborate on innovative projects] involving OCaml or MirageOS and offer [commercial services] for open-source projects =E2=80=93 including long-term support, development of new tools, or assistance with porting projects to OCaml 5 or Windows./ [SpaceOS] [Orchide] [Parsimoni] [EU Cyber Resilience Act] [US cybersecurity initiatives] [Dennis Dang] [sponsors on GitHub] [collaborate on innovative projects] [commercial services] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Using `clang-cl' With OCaml 5] =E2=80=A2 [Florian=E2=80=99s compiler weekly, 13 January 2025] =E2=80=A2 [OCaml 5.3: Features and Fixes!] =E2=80=A2 [Git, Carton and emails] [the ocaml.org blog] [Using `clang-cl' With OCaml 5] [Florian=E2=80=99s compiler weekly, 13 January 2025] [OCaml 5.3: Features and Fixes!] [Git, Carton and emails] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 14 to 21, 202= 5.

    OCaml Software Foundation: January 2025 update

    gasche announced

    Happy new year!

    This is an update on recent works of the O= Caml Software Foundation, covering our 2024 actions – the previo= us update was in January 2024.

    The OCaml Software Foundation is a non-profit foundation (earlier threa= d) that receives funding from our industrial sponsors each year, and tries its best to spend it to s= upport and strengthen the OCaml ecosystem and community.

    The funding volume we receive each year is around 200K=E2=82=AC. (For compa= rison: this is the yearly cost of one experienced full-time software engine= er in many parts of the world.) We do not fund people full-time for long pe= riods. Most actions receive from 3K=E2=82=AC to 20K=E2=82=AC. The work to = prepare and execute actions is mostly done by the (unpaid) Executive Committee. It is currently formed b= y Nicol=C3=A1s Ojeda B=C3=A4r, Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB= =85n, Virgile Prevosto and myself, with administrative personnel provided b= y INRIA and general assistance by Alan = Schmitt.

    Our current sponsors (thanks!) are ahrefs, Jane Street, Tezos, Bloomberg, <= a href=3D"https://lexifi.com/">Lexifi, SimCorp, MERCE = and Tarides. (If your company would li= ke to join as a sponsor, please get in touch. Unfortunately, we still cannot efficiently proce= ss small donations, so we are not calling for individual donations.)

    Feel free to use this thread for questions/suggestions :-)

    Recent actions

    • Education and outreach

      We funded a new edition of the Spanish summer school on functional programming in OCaml, org= anized in Saragossa by Ricardo Rodriguez and Roberto Blanco.

      We continued funding the OCaml meetups in Paris and Toulouse, France. In 20= 24, a new meetup started in Chennai, India (first discuss thread), which we are del= ighted to support as well.

      We are sponsoring the JFLA = 2025, a functional programming conference in France, and an OCaml Bridge Workshop at Functional Conf 2025, a lar= ge Asian conference on functional programming.

    • Research

      The OCaml Software Foundation is typically not involved in funding research= , focusing on actions that have an immediate impact on the language and its= community. Nevertheless, in 2023 we funded one year of post-doctoral work = for Takafumi Saikawa in relation to his maintenance work on the type-checke= r of OCaml. In 2024 we funded one year of research engineer for the Salto project, building a stat= ic analyzer for OCaml, and one year of PhD grant for Alistair O'Brien in Cambridge (complementing other fun= ding sources for a full PhD), continuing his impressive work on constraint-based type inference = for OCaml.

    • Ecosystem
      • Infrastructure

        As in previous years, we fund the work of Kate Deplaix to check that the OC= aml ecosystem is compatible with upcoming compiler releases; in 2024 Kate w= orked on OCaml 5.2 and 5.3.

        We are trying our best to support the work of opam-repository maintainers, = through individual funding grants for the active maintainers. This year, on= the suggestion of the repository maintainers, we are also funding the work= of Robur to migrate unmaintained packa= ges to a separate archive (discuss thread 1, thread 2).

      • Tools

        In 2024 we have funded one month of maintenance of the opam cl= ient by Raja Boujbel and her colleagues.

        We renewed our partial support for the work of Antonio Monteiro on Melange. For more Melange news, see for= example the announcement of Melange 4.

      • Libraries

        We keep supporting the work of Petter Urkedal on the Caqti library, the main database connec= tion library in the OCaml community.

        The Owl library for scientif= ic computing has been restructuring in 2024, with its two maintainers movin= g to permanent jobs demanding their time and therefore less available. The = OCaml Software Foundation is providing a small grant to help the maintainer= s transition to a different contribution model and/or preserve a part of th= eir maintenance activity, as they think is best.

        We have been funding documentation work by John Whitington to collect or cr= eate usage examples of important OCaml libraries, prior to their upstreamin= g in the documentation of each project. See his ocaml-nursery repository.

        We support the contributions of Daniel B=C3=BCnzli to the OCaml ecosystem. = This year, Daniel used this support to fund the development of

        • jsont, a new library for declarativ= e JSON data manipulation
        • bytesrw, a library of composable by= te stream readers and writes, with support for various compression and hash= ing algorithms
        • support for Unicode 16.0 in his Unicode l= ibraries

        Finally, we have been funding Nathan Rebours to take an active part in the = maintenance of the ppxlib project, see his ppxlib maintenance summary.

    ppxlib.034.0

    Nathan Rebours announced

    We're happy to announce that we just released ppxlib.0.34.0.

    The full patch notes are available on the release page over here.

    The main features are OCaml 5.3 compatibility, new AST pretty-printing util= ities and the ppxlib-tools package, support for [@@deriving ...] on class types and the addition of missing Pprintast entry = points.

    Changes summary

    • 5.3 compatibility

      ppxlib.0.34.0 is the first official ppxlib release that's compatible with t= he new 5.3 compiler.

      The ppxlib driver now also comes with a -keywords CLI option, = similar to the compiler's that allow you to compile and preprocess with the= 5.3 compiler code that uses effect as an identifier. This is = pretty niche but it's there should you need it.

      Please note that means you can use ppx-es with a 5.3 compiler but not that = ppx-es can consume/produce 5.3 language features. We're currently working o= n a fix allowing you to use the effect syntax in files that require preproc= essing as it's not possible with 0.34.0. The fix should be released in the = next few days as 0.34.1.

    • AST pretty-printing

      We added a new Pp_ast module that allows you to pretty print A= ST fragments.

      The only way ppxlib would print ASTs before were as S-expressions. In pract= ice we found that it was not always helpful and wanted a more readable and = human friendly way of displaying the AST.

      The default output of those printer is a simplified version of the AST to k= eep things clear and avoid cluttering the output with information that is n= ot always useful. For example, if you run Ppxlib.Pp_ast.Default.expre= ssion on the AST for x + 2, you'll get the following:

      Pexp_apply
        ( Pexp_ident (Lident "+")
        , [ ( Nolabel<=
      /span>, Pexp_ide=
      nt (Liden=
      t "x"))
          ; ( Nolabel<=
      /span>, Pexp_con=
      stant (Pc=
      onst_integer ( "2", None)))
          ]
        )
      

      The alert reader will note that there are no locations or attributes and th= at the expression record layer is omitted here.

      You can of course configure the printer to display more information if you = need to.

      We've been using these new printers internally to debug migration code and = they have been a huge help so we hope they will make working with ppxlib ea= sier for you too.

      In addition to this new module, we also added a command line utility called= ppxlib-pp-ast to pretty print ASTs from source files, source = code fragments or even marshalled AST files. It is very similar to the old = ppx_tools's dumpast.

      Note that it will print ppxlib's internal AST after it's been migrated from= the installed compiler's version. This is something that we could not simp= ly achieve with OCaml's own -dparsetree.

      This should be a useful tool for debugging ppx related bugs or learning abo= ut the AST and we hope ppx authors and users will like it.

    • Other changes

      As mentioned above, we also added some missing Pprintast~=C2=B9 entri= es such as ~binding, longident and payload.

      It is now possible to use [@@deriving ...] on class type decla= rations and therefore to write derivers for class types.

      =C2=B9: To the confused readers: Pprintast is entire= ly different from Pp_ast mentioned above as it prints t= he source code corresponding to a given AST.

    Plans for the next release

    • Internal AST bump to 5.2

      Our next release will bump our internal AST to 5.2. It is a pretty big chan= ge because 5.2 changed how functions were represented in the AST and this i= mpacts A LOT of ppx-es.

      @patricoferris has been working very hard on this over the past few months = to minimize the amount of breakage and to send patches upstream where that = was not possible to get the rest of the ecosystem ready for the bump.

      We wanted to first release the 5.3 compatibility but now that's out of the = way we're able to focus on the bump again.

      @patricoferris will create a dedicated thread shortly to explain a bit what= 's been going on and what to expect from this release.

    • Drop support for OCaml < 4.08

      It is time for us to drop support for very old compilers. Keeping support f= or OCaml 4.07 and before requires maintenances of quite heavy compatibility= layers and prevents us from using some language features in ppxlib's sourc= e code while providing little to no benefits since the vast majority of use= rs already upgraded to much more recent compilers.

      If you're still relying on those older compilers and the newest ppxlib, ple= ase reach out, either here or via a ppxlib issue.

    Special thanks

    We wanted to thank our external contributors for this release: @hhugo, @noj= b and @dra27 for their help on the 5.3 compat and @mattiasdrp for bringing = the Pprintast module up to speed.

    Special thanks as well to @pedrobslisboa who started integrating their exce= llent ppx-by-ex= ample into ppxlib's documentation.

    Finally, I'd also like to thank the OCaml Software Foundation who's been fu= nding all my work on ppxlib and made this release possible!

    Happy preprocessing to you all!

    Release of Carton 1.0.0 and Cachet

    Calascibetta Romain announced

    I'm delighted to announce the release of Carton 1.0.0 and Cachet (which will be released soon into opam-repositor= y).

    Carton is a reimplementation of the Git PACK format. A PACK file is what yo= u can find in your .git/objects/pack in your favourite Git rep= ository. It contains mainly all your Git objects. This format provides a go= od compression ratio and the ability to extract objects almost directly. It= can be seen as a read-only key-value database =E2=80=94 in effect, modifyi= ng Git objects is impossible.

    This project is built around the OCaml implementation of Git that we have. = But the PACK format is also interesting in its own right and outside the Gi= t concepts.

    The PACK format offers double compression. A zlib compression (proposed by = decompress) as well as= a compression between objects in the form of a binary patch (proposed by <= a href=3D"https://github.com/mirage/duff">duff).

    So, if the "words" appear quite frequently (like the words used in a progra= mming language =E2=80=94 if, else, then, etc.), the second level of compres= sion becomes very interesting where an object (such as a file) is simply a = succession of patches with other objects.

    Cachet, a library for mmap syscall

    Carton and the PACK format very often use syscall mmap. The po= int is to be able to take advantage of the kernel cache system to read a PA= CK file. The kernel can read a file in advance when reading a page via mmap. Basically, the kernel anticipates that you might want to get= the next page after the one you requested.

    However, in the case of Carton, it is sometimes necessary to =E2=80=98go ba= ck=E2=80=99, particularly for patched objects whose source is often upstrea= m.

    Cachet is an intermediate layer for mmap that caches previousl= y obtained pages. In this way, we take advantage of both the kernel for sub= sequent pages and our library for previous pages.

    Let's take a concrete example. Carton can analyse a PACK file as git = verify-pack does. Let's make a comparison with and without Cachet.

    +--------------+-------------+----------------+-----------------+
    |              | with cachet | without cachet | git verify-pack |
    +--------------+-------------+----------------+-----------------+
    |         time |       17.8s |          41.8s |            9.3s |
    +--------------+-------------+----------------+-----------------+
    | cache misses |        936M |          1933M |            246M |
    +--------------+-------------+----------------+-----------------+
    

    As you can see, using Cachet improves Carton's execution time. We're still = not as competitive as git-verify-pack, but we're getting close!

    Cachet offers to cache previously loaded pages. Its cache system is very ba= sic and is just a small array whose size is a power of two. Next, we simply= reuse the OCaml hash function =E2=80=94 in this respect, it may be worth t= esting another hash function.

    • Cachet & schedulers

      Like most of our projects, Cachet is independent of schedulers. There is th= erefore a variant with Lwt a= nd a variant with Miou. = However, we need to clarify a behaviour related to the use of Cachet. Readi= ng a file, whether with read(3) or mmap(3P), does= not block, but it can take some time.

      As we have already experienced and explained here, it may be necessary to explain to t= he scheduler whether it is appropriate to do something else after such a sy= scall. In the case of Lwt, it might be a good idea to insert Lwt.paus= e just after our syscall so that Lwt gives another service the oppor= tunity to run despite the time taken trying to read from a file. However, p= articularly for Lwt, this means closing Cachet in the hell of the monad (in= other words, there is no way to escape it) because of this possible = Lwt.pause (which returns unit Lwt.t).

      The composition of Cachet with Lwt is therefore quite different from what w= e've been able to experiment with. One of our other articles suggests not using func= tors (too much), and although we can in fact abstract Lwt.t fr= om unit Lwt.t (and even reduce it such that type 'a t = =3D 'a) with the HKP trick, we opted for comp= osition by hand.

      The problem relates to Lwt (and Async) and doesn't apply to Miou when it's = possible to raise effects. However, from such a composition, a choice has b= een made to give Lwt the opportunity to do something else after mmap<= /code>. We could, in other types of applications, make another choice on th= is precise question.

    Carton

    Carton is a library that was originally developed for ocaml-git. It was int= ernal to the project but we considered that the PACK format's field of appl= ication could be wider than that of Git. We decided to extract the project = from ocaml-git and make it a library in its own right. Carton'= s objective remains fairly rudimentary. It consists of:

    • extract objects from a PACK file (whether or not these objects are Git = objects)
    • generate an *.idx file from a PACK file in order to have q= uick access to the objects
    • verifying a PACK file such as git verify-pack does
    • and finally generate a PACK file from a list of objects

    Carton is a library and a tool that you can now use on your Git repositorie= s. Here are a few examples of how to use carton. We'll start b= y cloning a repository to test Carton and go to the folder containing the P= ACK file.

    $ opam install carton.1.0.0
    $ git clone https://github.com/ocaml/ocaml
    $ cd ocaml/.git/objects/pack/
    

    Carton can check a PACK file. Verifying means extracting all the objects in= the file from memory and calculating their hash. This command is similar t= o git verify-pack.

    $ carton verify pack-*.pack
    

    Carton can extract a specific object (commit, tree or blob) from a PACK fil= e using its associated *.idx file and the object identifier (t= he hash of the commit, for example).

    $ carton get pack-*.idx 89055b054eeec0c6c6b6118d6490b6792da7fef2
    

    Instead of extracting objects from a PACK file into memory, you can also ex= tract them as files using explode.

    $ mkdir loose
    $ carton explode 'loose/%s/%s' pack-*.pack > entries.pack
    

    Finally, Carton can create a new PACK file from a list of objects stored in= files with make. It can also generate the *.idx file associat= ed with the new PACK file. As we've just re-packaged the objects in the rep= ository, we should find the same objects.

    $ carton make -n $(cat entries.pack | wc -l) -e entries.pack new.pack
    $ carton index new.pack
    $ carton get new.idx 89055b054eeec0c6c6b6118d6490b6792da7fef2
    

    Please note that the above actions, applied to ocaml/ocaml, ma= y take some time due to the history of this project.

    In the example above, we can see the extraction of a Git object, the extrac= tion of all the objects in a PACK file and the creation of a new PACK file = based on all the extracted objects.

    As you can see, creating a PACK file can take a long time. However, the adv= antage of the PACK file lies particularly in obtaining the objects and in t= he rate of compression of the PACK file:

    +--------+-------------+----------+-------+--------------+
    |        | pack-*.pack | new.pack | loose | loose.tar.gz |
    +--------+-------------+----------+-------+--------------+
    |   size |        355M |     648M |  8.3G |         1.8G |
    +--------+-------------+----------+-------+--------------+
    

    The PACK file is primarily designed to provide access to objects according = to their identifiers. This access must be as fast as possible, even if the = object is first compressed with decompress and can be compressed in the for= m of a patch with duff. Here are a few metrics to give you an idea.

    +--------------+-------------+----------+---------+
    |              | pack-*.pack | new.pack | loose   |
    +--------------+-------------+----------+---------+
    | git cat-file |     ~ 0.01s |      N/A |     N/A |
    +--------------+-------------+----------+---------+
    |   carton get |     ~ 0.20s |  ~ 0.30s |         |
    +--------------+-------------+----------+---------+
    |          cat |         N/A |      N/A | 0.0006s |
    +--------------+-------------+----------+---------+
    

    What's important to note is the ability to have random access to objects si= mply by having the associated *.idx file, the production of wh= ich is quite efficient. This is not or hardly the case for compression form= ats such as GZip. And that's the whole point of PACK files, with an indexin= g method for almost immediate access to objects according to their identifi= ers and offering a very good compression ratio.

    NOTE: Carton does not compress the repository as well as Git. The ma= in reason is that Git has some heuristics relating to Git objects that Cart= on does not implement - because Carton wishes to be independent of Git conc= epts. These heuristics apply in particular to the order in which we want to= pack objects. In addition, Git prepares the ground so that the antecedents= of a blob object (which is a file in your repository), for example, are th= e old versions of that same blob (and therefore the old versions of your fi= le).

    In this context, the patch algorithm implemented by duff applies very well and gives very good results.

    For more details on these heuristics, you can read this= discussion that serves as documentation.

    • Carton & parallelism

      As always, our libraries are independent of schedulers. There is a version = of Carton with Lwt and a version with Miou.

      Some of the tasks Carton performs, such as indexing, are highly paralleliza= ble. In this case, the new derivation of Carton with Miou exists to take ad= vantage of the latter's domain pool.

      It was also quite easy to parallelize the work on carton index= and carton verify. Here are some other metrics which, thanks = to OCaml 5 and Miou, bring us closer to Git performance:

      $ hyperfine \
        -n git \
          "git verify-pack pack-03a3a824757ff4c225874557c36d44eefe3d7918.idx" \
        -n carton \
          "carton verify pack-03a3a824757ff4c225874557c36d44eefe3d7918.pack -q --=
      threads 4"
      Benchmark 1: git
        Time (mean =C2=B1 =CF=83):     329.2 ms =C2=B1   0.9 ms    [User: 384.2 m=
      s, System: 27.8 ms]
        Range (min =E2=80=A6 max):   327.7 ms =E2=80=A6 330.9 ms    10 runs
      =20
      Benchmark 2: carton
        Time (mean =C2=B1 =CF=83):     712.1 ms =C2=B1  10.9 ms    [User: 1111.8 =
      ms, System: 1112.6 ms]
        Range (min =E2=80=A6 max):   695.4 ms =E2=80=A6 726.8 ms    10 runs
      =20
      Summary
        git ran
          2.16 =C2=B1 0.03 times faster than carton
      

      NOTE: it may come as a surprise that Carton is 2 times slower than G= it for analysing a PACK file, but it should be noted that almost the entire= Carton implementation is in OCaml! At this stage, the idea is more to give= you an idea, but we literally find ourselves comparing a Bugatti with a Citro=C3=ABn 2CV.

    • Carton & Emails

      Finally, this in-depth rewrite of Carton allows us to take advantage of the= PACK format for storing our emails.

      In fact, we are experimenting with and developing an email solution within = our cooperative, and email archiving is one of our objectives. Based on our= experience of implementing Git, we thought that the PACK format could be a= very interesting format for archiving emails.

      It combines two features, rapid access to emails and compression by patches= , which are very interesting when it comes to handling emails. Finally, it = also corresponds more or less to the way we use email:

      • we don't want to delete them (more often than not, we want to keep them= ad vitam aeternam)
      • and we don't modify them

      It therefore corresponds to a sort of read-only database. For more details = on this aspect of Carton and the results of our experiments, I suggest you = read our recent article on our cooperative's blog.

    Opam repository archival, phase 2 - OCaml 4.08 is the lower bo= und

    Hannes Mehnert announced

    It is my pleasure to announce below the list of opam packages that will mov= e to the opam-repository-archive on February 1st 2025. In total there are 5= 855 opam files scheduled for being moved within 1218 unique packages. This = decreases the size of the opam-repository by roughly 20%.

    Editor note: please follow the post link for the other articles with who= le list.=20=20=20=20=20=20=20=20

    This list contains all packages that are not compatible with OCaml >=3D = 4.08, and packages that after archiving those are not installable due to mi= ssing dependencies. The "not installable" list has been generated by archive-opam, and this ma= y of course contain bugs.

    A smaller list contains a re-run of phase 1 (packages that are available: f= alse) - where the availability was added between Dec 15th and now.

    If you find a package in the list and you=E2=80=99d like to retain it in th= e opam-repository, there are some options:

    • (a) you can install it on your system (opam install): this= means there=E2=80=99s a bug in the archive-opam utility, please provide th= e package name and version in the opam-repository-archive Phase 2 PR, together= with your opam version, OCaml version, and operating system;
    • (b) it is not installable: please figure out the reasoning (the =E2=80= =9CReasoning=E2=80=9D may help you to find the root issue), and try to fix = it yourself - if you=E2=80=99re unable to fix the root cause, please also c= omment in the opam-repository-archive Phase 2 PR with the package name and ver= sion.

    If you=E2=80=99ve any questions, please don=E2=80=99t hesitate to ask here = or on GitHub or via another communication channel.

    You can help further on the archiving process:

    • as mentioned in the last announcement please add the x-maintenanc= e-intent to your packages (a good choice for a lot of packages is x-maintenance-intent: [("latest")] if you=E2=80=99re maintaining= the latest version only) - this will be considered in Phase 3 (March 1st 2= 025);
    • if you are the author or maintainer of a package that is no longer usef= ul or maintained, you can as well mark your opam files in the opam-reposito= ry with x-maintenance-intent: [("none")] (this will be taken i= nto account in Phase 3 - March 1st 2025);
    • if you flagged your preliminary releases with flags: avoid-versio= n, and they can now be removed (e.g. since a stable version has been= released), please open a pull request to replace the avoid-version with deprecated.

    Please note that the next Phase will be announced on February 15th with all= packages where the x-maintenance-intent does not match, and w= hich do not have any reverse dependencies - archiving is scheduled for Marc= h 1st.

    To keep track of the announcements, please look at the opam-repository tag.

    A big thanks to the OCaml Software Foundation for funding the opam-reposito= ry archival project.

    Ocaml-posix 2.1.0 released!

    Romain Beauxis announced

    Hi all!

    Version 2.1.0 of ocaml-posix has been released!

    While it was long overdue, this version only include minor changes, along w= ith the addition of posix-math2.

    These packages are intended to provide a consistent, extensive set of bindi= ngs for the various POSIX APIs to be used with ocaml-ctypes when building bindings to C librari= es that require the use of these APIs.

    While working on OCaml projects, it is common to have to interface with API= s derived from the POSIX specifications, getaddrinfo, un= ame etc.

    The core OCaml library provides their own version of these APIs but:

    • They only cover parts of it
    • They wrap some native types such as socketaddr into custom= , opaque OCaml types, making it impossible to re-use, for instance when usi= ng a C library API requiring a POSIX sockaddr.

    Thus, having a large, consistent set of bindings for these APIs that reflec= t the actual C types, structures and etc greatly improves the usability of = the language and ecosystem as a whole by making it possible to interface it= with a large set of C libraries in a reusable way.

    The project has been mostly stable for a couple of years (and so have the P= OSIX standards), but could use some more hands if there is more need in the= community to extend the set of POSIX APIs supported by the language.

    Release of ocaml-eglot 1.0.0

    Xavier Van de Woestyne announced

    Hi everyone!

    We (at Tarides) are particularly pleased to announce the first release of OCaml-eglot, An overlay on= Egl= ot (the built-in LSP client for Emacs) for = editing OCaml!

    More precisely

    Typically, developers who use Emacs (43.7% in 2022, according to th= e OCaml User Survey) use a major mode (such as the venerable caml-mode, or tuareg) and Merlin to provide IDE services. In 2016, Microsoft has release= d LSP, a generic protocol for interacting with editors which, at first, was= only used by Visual Studio Code, but, since 2020, has really become the no= rm. De-facto, following the LSP standard gives very good default (completion, jump to definition, …). OCaml ha= s excellent LSP (oc= aml-lsp-server) support, which is used in particular by the OCaml platform for Visual Studio Code.

    With the aim of reducing maintenance for all possible editors, going LSP se= ems to be a good direction. A pertinent choice, especially since the major = historical editors (such as Vim and Emacs) offer, in their recent versions,= LSP clients out of the box. However, in t= he same way that the OCaml client for VSCode integrates OCaml-specific features, it was necessary to support these features on the Emacs side (= and in the future, Vim) to compete with Merlin, which is the goal of = ocaml-eglot, to provide a tailored development experience for OCa= ml code editing!

    User feedback and future development

    We've just released the first version of OCaml-eglot, and, much like the va= rious editor-related projects (Merlin, Vscode-ocaml-platform, Merlin for Em= acs, Merlin for Vim), we're more than open to community collaboration, u= ser feedback, in order to provide the best possible user experience!

    Happy Hacking!

    Semgrep is hiring to help scale their static analysis engine

    Emma Jin announced

    Semgrep is an application security company focused on detecting and remedia= ting vulnerabilities. The static analysis engine is primarily written in OC= aml. We're looking for a software engineer to help us support scanning larg= er repositories and add many more users. The ideal candidate has owned a cr= itical tool, worked on an OCaml project, and is interested in static analys= is.

    If this sounds interesting to you, see our job posting at https://job-boards.gree= nhouse.io/semgrep/jobs/4589941007! Let me know if you have any question= s!

    Dune dev meeting

    Etienne Marais announced

    Hi Dune enthusiasts :camel:,

    We will hold the regular Dune Dev Meeting on Wednesday, January, 22nd at= 16:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers!

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Tarides: 2024 in Review

    Thomas Gazagnaire announced

    At Tarides, we believe in making OCaml = a mainstream programming language by improving its tooling and integration = with other successful ecosystems. In 2024, we focused our efforts on initia= tives to advance this vision by addressing key technical challenges and eng= aging with the community to build a stronger foundation for OCaml=E2=80=99s= growth. This report details our work, the rationale behind our choices, an= d the impact achieved. We are very interested in getting your feedback: please get in touch (or respond t= o this thread!) if you believe we are going in the right direction.

    TL;DR = =E2=80=93 In 2024, Tarides focused on removing adoption friction with bette= r documentation and tools; and on improving adoption via the integration wi= th three key thriving ecosystems: multicore programming, web development, a= nd Windows support. Updates to ocaml.org i= mproved onboarding and documentation, while the Dune Developer Preview simplified workflows with integrate= d package management. Merlin added support for project-wide reference support and odoc 3, which is about to b= e released. OCaml 5.3 marked the first stable multicore release, and = js_of_ocaml achieved up to 8x performance boosts in real-world comme= rcial applications thanks to added support for WebAssembly. On Windows, opa= m 2.2 brought full compatibility and CI testing to all Tier 1 platforms on = opam-repository, slowly moving community packages towards reli= able and better support for Windows. Tarides=E2=80=99 community support inc= luded organising the first FUN OCaml con= ference, many local meetups, and two rounds of Outreachy internships.

    Better Tools: Toward a 1-Click Installation of OCaml<= /h4>

    Our primary effort in 2024 was to continue delivering on the OCaml Platform roadmap published= last year. We focused on making it easier to get started with OCaml by re= moving friction in the installation and onboarding process. Our priorities = were guided by the latest OCSF User Survey, direct user interviews, and <= a href=3D"https://discuss.ocaml.org/tag/user-feedback">feedback gathere= d from the OCaml community. Updates from Tarides and other OCaml Platform m= aintainers were regularly shared in the OCaml Platform Newsletter.

    • OCaml.org

      OCaml.org is the main entry point for new users of OCaml. Tarides engineers= are key members of the OCaml.org team. Using privacy-preserving analytics, the team tracked visito= r behaviour to identify key areas for improvement. This led to a redesign o= f the installation page, simplify= ing the setup process, and a revamp of the guided tour of OCaml to better introduce the language.= Both pages saw significant traffic increases compared to 2023, with the in= stallation page recording 69k visits, the tour reaching 65k visits and a ve= ry encouraging total number of visits increasing by +33% between Q3 and Q4 = 2024

      3D"137aea463013b316=

      Efforts to improve user experience included a satisfaction survey where 75%= of respondents rated their experience positively, compared to 17% for the = previous version of the site. User testing sessions with 21 participants pr= ovided further actionable insights, and these findings informed updates to = the platform. The redesign of OCaml.org community sections was completed us= ing this feedback. It introduced several new features: a new Community landing page, an academic institutions page with course listi= ngs, and an industrial users= showcase. The team also implemented an automated event announcement system to inform the community of on= going activities.

      Progress and updates were regularly shared through the OCaml.org newsletters, keepin= g the community informed about developments. Looking ahead, the team will c= ontinue refining the platform by addressing feedback, expanding resources, = and monitoring impact through analytics to support both new and experienced= OCaml users. Lastly, the infrastructure they build is starting to be used = by other communities: Rocq just an= nounced their brand new website, built using the same codebase as ocaml.org!

    • Dune as the Default Frontend of the OCaml Plat= form

      One of the main goals of the OCaml Platform is to make it easier for users= =E2=80=94especially newcomers=E2=80=94to adopt OCaml and build projects wit= h minimal friction. A critical step toward this goal is having a single CLI= to serve as the frontend for the entire OCaml development experience (code= named Bob in the past). This year, we made significant progress in that di= rection with the release of the Dun= e Developer Preview.

      Setting up an OCaml project currently requires multiple tools: opam for package management, dune for builds, and additional = installations for tools like OCamlFormat or Odoc. While powerful, this frag= mented workflow can make onboarding daunting for new users. The Dune Develo= per Preview consolidates these steps under a single CLI, making OCaml more = approachable. With this preview, setting up and building a project is as si= mple as:

      1. dune pkg lock to lock the dependencies.
      2. dune build to fetch the dependencies and compile the proje= ct.

      This effort is also driving broader ecosystem improvements. The current OCa= ml compiler relies on fixed installation paths, making it difficult to cach= e and reuse across environments, so it cannot be shared efficiently between= projects. To address this, we are working on making the compiler relocatab= le (ongoing work). This = change will enable compiler caching, which means faster project startup tim= es and fewer rebuilds in CI. As part of this effort, we also maintain p= atches to core OCaml projects to make them relocatable =E2=80=93 and we wor= ked with upstream to merge (like for ocamlfind). Tarides engineers also continued to mainta= in Dune and other key Platform projects, ensuring stability and progress. T= his included organising and participating in regular development meetings (= for Dune, opam, = Merlin, ppxlib, etc.) to prioritise community needs and align efforts acr= oss tools like Dune and opam to avoid overlapping functionality.

      The Dune Developer Preview is an iterative experiment. Early user feedback = has been promising (the Preview=E2=80=99s NPS went from +9 in Q3 2024 to +2= 7 in Q4 2024), and future updates will refine the experience further. We ai= m to ensure that experimental features in the Preview are upstreamed into s= table releases once thoroughly tested. For instance, the package management= feature is already in Dune 3.17. We will announce and document it more wid= ely when we believe it is mature enough for broader adoption.

    • Editors

      In 2024, Tarides focused on improving editor integration to lower barriers = for new OCaml developers and enhance the experience for existing users. Edi= tors are the primary way developers interact with programming languages, ma= king seamless integration essential for adoption. With more than 73% of developers using Visual Studio Code (VS Code), VS Co= de is particularly important to support, especially for new developers and = those transitioning to OCaml. As part of this effort, Tarides wrote and mai= ntained the official VS Code plugin for OCaml, priorit= ising feature development for this editor. We also support other popular ed= itors like Emacs and Vim=E2=80=94used by many Tarides engineers=E2=80=94on = a best-effort basis. Improvements to OCaml-LSP and Merl= in, both maintained by Tarides, benefit all supported editors, ensuring= a consistent and productive development experience.

      3D"9b63754a94bc853f=

      While several plugins for OCaml exist (OCaml and Reason IDE=E2=80=93128k installs, Hackwaly=E2=80=9390k installs), our OCaml VS Code plugin =E2=80=93now with over 208k downloads= =E2=80=93 is a key entry point for developers adopting OCaml in 2024. This = year, we added integration with the Dune Developer Preview, allowing users = to leverage Dune's package management and tooling directly from the editor.= Features such as real-time diagnostics, autocompletion, and the ability to= fetch dependencies and build projects without leaving VS Code simplify dev= elopment and make OCaml more accessible for newcomers.

      The standout update in 2024 was the addition of project-wide reference support, a long-requested featu= re from the OCaml community and a top priority for commercial developers. T= his feature allows users to locate all occurrences of a term across an enti= re codebase, making navigation and refactoring significantly easier=E2=80= =94especially in large projects. Delivering this feature required coordinat= ed updates across the ecosystem, including changes to the OCaml compiler, M= erlin, OCaml LSP, Dune, and related tools. The impact is clear: faster navi= gation, reduced cognitive overhead, and more efficient workflows when worki= ng with complex projects.

      Additional improvements included support for new Language Server Protocol f= eatures, such as signature_help and inlay_hint, w= hich enhance code readability and provide more contextual information. Thes= e updates enabled the introduction of new commands, such as the "Destruct" = command. This little-known but powerful feature au= tomatically expands a variable into a pattern-matching expression correspon= ding to its inferred type, streamlining tasks that would otherwise be tedio= us.

      3D"merlin-destruct-1~kHA8_=

    • Documentation

      Documentation was identified as the number one pain point in the latest OCSF = survey. It is a critical step in the OCaml developer journey, particula= rly after setting up the language and editor. Tarides prioritised improving= odoc to make it easier for developers to find information, le= arn the language, and navigate the ecosystem effectively. High-quality docu= mentation and tools to help developers get "unstuck" are essential to reduc= ing friction and ensuring a smooth adoption experience.

      Tarides is the primary contributor and maintainer of odoc, OCaml=E2=80=99s main documentati= on tool. In preparation for the odoc 3 release, our team introduced two significan= t updates. First, the odoc= Search Engine was integrated, allowing developers to search dir= ectly within OCaml documentation via the Learn page. Second, the = odoc Cheatsheet provides a concise reference for creating = and consuming OCaml documentation. We would like to believe that these upda= tes, deployed on ocaml.org, were the main cause of a 45% increase in = package documentation usage on h= ttps://ocaml.org/pkg/ in Q4 2024!

      3D"a974b30576399d84=

      Another area where developers often get stuck is debugging programs that do= n=E2=80=99t work as expected. Alongside reading documentation, live debugge= rs are crucial for understanding program issues. Tarides worked to improve = native debugging for OCaml, focusing on macOS, where LLDB is the only suppo= rted debugger. Key progress included a name mangling fix to improve symbol resolution, resto= ring ARM64 backtraces, and introducing Python shims for code sharing betwee= n LLDB and GDB.

      OCaml=E2=80=99s error messages remain a common pain point, particularly for= syntax errors. Unlike Rust=E2=80=99s error index, OCaml does not (yet!) have a= centralised repository of error explanations. Instead, we are focused on m= aking error messages more self-explanatory. This requires developing new to= ols, such as lrgrep, a domain-specific language for analysing grammars built with Menhi= r. lrgrep enables concise definitions of error cases, making i= t possible to identify and address specific patterns in the parser more eff= ectively. This provides a practical way to improve error messages without r= equiring changes to the compiler. In December 2024, @let-def successfully d= efended his PhD (a collaboration between Inria and Tarides) on this topic, = so expect upstreaming work to start soon.

    • OCaml Package Ecosystem

      The last piece of friction we aimed to remove in 2024 was ensuring that use= rs wouldn=E2=80=99t encounter errors when installing a package from the com= munity. This required catching issues early=E2=80=94before packages are acc= epted into opam-repository and made available to the broader e= cosystem. To achieve this, Tarides has built and maintained extensive CI in= frastructure, developed tools to empower contributors, and guided package a= uthors to uphold the high quality of the OCaml package ecosystem.

      In 2024, Tarides=E2=80=99 CI infrastructure supported the OCaml community a= t scale, handling approximately 20 million jobs on 68 machines coveri= ng 5 hardware architectures. This infrastructure continuously teste= d packages to ensure compatibility across a variety of platforms and config= urations, including OCaml=E2=80=99s Tier 1 platforms: x86, ARM, RISC-V, s39= 0x, and Power. It played a critical role during major events, such as new O= Caml releases, by validating the ecosystem=E2=80=99s readiness and catching= regressions before they impacted users. Additionally, this infrastructure = supported daily submissions to opam-repository, enabling contr= ibutors to identify and resolve issues early, reducing downstream problems.= To improve transparency and accessibility, we introduced a CI pipeline tha= t automates configuration updates, ensuring seamless deployments and allowi= ng external contributors to propose and apply changes independently.

      In addition to maintaining the infrastructure, Tarides developed and mainta= ined the CI framework running on top of it. A major focus in 2024 was makin= g CI checks available as standalone CLI tools distributed via opam. These tools enable package authors to run checks locally, empowering = them to catch issues before submitting their packages to opam-reposit= ory. This approach reduces reliance on central infrastructure and al= lows developers to work more efficiently. The CLI tools are also compatible= with GitHub Actions, allowing contributors to integrate tests into their o= wn workflows. To complement these efforts, we enhanced opam-repo-ci, which remains an essential safety net for packages entering the repo= sitory. Integration tests for linting and reverse dependencies were introdu= ced, enabling more robust regression detection and improving the reliabilit= y of the ecosystem.

      To uphold the high standards of the OCaml ecosystem, every package submissi= on to opam-repository is reviewed and validated to ensure it m= eets quality criteria. This gatekeeping process minimises errors users migh= t encounter when installing community packages, enhancing trust in the ecos= ystem. In 2024, Tarides continued to be actively inv= olved in maintaining the repository, ensuring its smooth operation. We = also worked to guide new package authors by updating the contributing= guide and creating a detailed wiki with actionable instructions for adding and main= taining packages. These resources were announced on Discuss to reach the community and simplify the p= rocess for new contributors, improving the overall quality of submissions.

    Playing Better with the Larger Ecosystem

    • Concurrent & Parallel Programming in OCaml=

      "Shared-memory multiprocessors have never really = 'taken off', at least in the general public. For large parallel computation= s, clusters (distributed-memory systems) are the norm. For desktop use, mon= oprocessors are plenty fast."Xavier Leroy, November 200= 2

      Twenty+ years after this statement, processors are multicore by default, an= d OCaml has adapted to this reality. Thanks to the combined efforts of the = OCaml Labs and Tarides team, the OCaml 5.x series introduced multicore supp= ort after a decade of research and experime= ntation. While this was a landmark achievement, the path to making mult= icore OCaml stable, performant, and user-friendly has required significant = collaboration and continued work. In 2024, Tarides remained focused on meet= ing the needs of the broader community and commercial users.

      OCaml 5.3 (released last week) was an important milestone in this journey. = With companies such as Routine, Hyper, and Asemio adopting OCaml 5.x, and advanced experimentation ongoing at J= ane Street, Tezos, Semgrep, and others, OCaml 5.3 is increasingly seen as t= he first =E2=80=9Cstable=E2=80=9D release of the multicore series. While so= me performance issu= es remain in specific parts of the runtime, we are working closely with= the community to address them in OCaml 5.4. Tarides contributed extensivel= y to the 5.2 and 5.3 releases by directly contrib= uting to nearly two-thirds of the merged pull requests. Since= Multicore OCaml was incorporated upstream in 2023, we have been continuous= ly involved in the compiler and language evolution in collaboration with In= ria and the broader OCaml ecosystem.

      Developing correct concurrent and parallel software is inherently challengi= ng, and this applies as much to the runtime as to applications built on it.= In 2024, we focused on advanced testing tools to help identify and address= subtle issues in OCaml=E2=80=99s runtime and libraries. The property-based test suite reached maturity this year, uncovering over 40 critical issues, with 28 = resolved by Tarides engineers. Trusted to detect subtle bugs, such as is= sues with orphaned ephemerons, the suite has become an integral part of= OCaml=E2=80=99s development workflow. Importantly, it is accessible to con= tributors without deep expertise in multicore programming, ensuring any cha= nges in the compiler or the runtime do not introduce subtle concurrency bug= s.

      3D"false-alarms-plot-errors-only.png"

      Another critical effort was extending ThreadSanitizer (TSAN) support to mos= t Tier 1 platforms and applying it extensivel= y to find and fix data races in the runtime. This work has improved the= safety and reliability of OCaml=E2=80=99s multicore features and is now pa= rt of the standard testing process, further ensuring the robustness of the = runtime.

      Beyond testing, we also worked to enhance library support for multicore pro= gramming. The release of the Saturn library introd= uced lock-free data structures tailored for OCaml 5.x. To validate these st= ructures, we developed DSCheck, a static analyser for verify= ing lock-free algorithms. These tools, along with Saturn itself, provide de= velopers with reliable building blocks for scalable multicore applications.

      Another promising development in 2024 was the introduction of the Picos= framework. Picos aims to provide a low-level foundation for concurrency, s= implifying interoperability between libraries like Eio, Moonpool, Miou, Rio= t, Affect, etc. Picos offers a simple, unopinionated, and safe abstraction = layer for concurrency. We believe it can potentially standardise concurrenc= y patterns in OCaml, but we are not there yet. Discussions are underway to = integrate parts of Picos into higher-level libraries and, eventually, the s= tandard library. We still have a long way to go, and getting feedback from = people who actively tried it in production settings would be very helpful!

    • Web

      Web development remains one of the most visible and impactful domains for p= rogramming languages; JavaScript, HTML, and CSS are the= most popular technologies in 2024. For OCaml to grow, it must integrat= e well with this ecosystem. Fortunately, the OCaml community has already bu= ilt a solid foundation for web development!

      On the frontend side, in 2024, Tarides focused on strengthening key tools l= ike js_of_ocaml by expanding its support for WebAssembly (Wasm). js_of_ocaml= (JSOO) has long been the backbone of OCaml=E2=80=99s web ecosystem,= enabling developers to compile OCaml bytecode into JavaScript. This year, = we merged Wasm= support back into JSOO, unifying the toolchain and simplifying adoptio= n for developers. The performance gain of Wasm has been very impressive so = far: CPU-intensive applications in commercial settings have seen 2x t= o 8x speedups using Wasm compared to traditional JSOO. We also work= ed on better support for effect handlers in js_of_ocaml to ens= ure applications built with OCaml 5 can run as fast in the browser as they = used to with OCaml 4.

      On the backend side, Tarides maintained and contributed to Dream, a lightwe= ight and flexible web framework. Dream powers projects like our own website and the MirageOS website, where we maintain a fork to make Dream and Mirage= OS work well together. Additionally, in 2024, we enhanced cohttp, adding prox= y support to address modern HTTP requirements.

      While Tarides focused on JSOO, wasm_of_ocaml, Dream, and Cohtt= p, the broader community made significant strides elsewhere. Tools like Mel= ange offer an alternative for compiling OCaml to JavaScript, and frameworks= like Ocsigen, which integrates backend and frontend programming, continue = to push the boundaries of what=E2=80=99s possible with OCaml on the web. No= tably, Tarides will build on this momentum in 2025 through a grant to improve direct-style= programming for Ocsigen.

    • Windows

      Windows is the most widely used operating system, making first-class suppor= t for it critical to OCaml=E2=80=99s growth. In 2024, 31% of visitors= to ocaml.org accessed the site f= rom Windows, yet the platform=E2=80=99s support historically lagged behind = Linux and macOS. This gap created barriers for both newcomers and commercia= l users. We saw these challenges firsthand, with Outreachy interns struggli= ng to get started due to tooling issues, and commercial users reporting dif= ficulties with workflow reliability and compilation speed.

      To address these pain points, Tarides, in collaboration with the OCaml comm= unity, launched the Windows Working Group. A key milest= one that our team contributed to was the release this year of opam 2.= 2, three years after its predecessor. This release made the upstrea= m opam-repository fully compatible with Windows for the first = time, removing the need for a separate repository and providing Windows dev= elopers access to the same ecosystem as Linux and macOS users. The impact h= as been clear: feedback on the updated installation workflow has been overw= helmingly positive, with developers reporting that it "just works." The install page for Windows is now sign= ificantly shorter and simpler!

      In the OCaml 5.3 release, Tarides restored the MSVC Windows port, ensuring = native compatibility and improving performance for Windows users. To furthe= r support the ecosystem, Tarides added Windows machines to the opam infrast= ructure, enabling automated testing for Windows compatibility on every new = package submitted to opam. This has already started to improve package supp= ort, with ongoing fixes from Tarides and the community. The results are pub= licly visible at windows.check.ci= .dev, which we run on our infrastructure, providing transparency and a = way to track progress on the status of our ecosystem. While package support= is not yet on par with other platforms, we believe that the foundations la= id in 2024=E2=80=94simplified installation, improved tooling, and continuou= s package testing=E2=80=94represent a significant step forward.

    Community Engagement and Outreach

    In 2024, Tarides contributed to building a stronger OCaml community through= events, internships, and support for foundational projects. The creation o= f FUN OCaml 2024 in Berlin was the f= irst dedicated OCaml-only event for a long time (similar to how the OCaml W= orkshop was separated from ICFP in the past). Over 75 participants joined f= or two days of talks, workshops, and hacking, and the event has already rea= ched 5= k+ views on YouTube. Tarides also co-chaired the OCaml Workshop at ICFP 2024 in Milan, bringing togeth= er contributors from academia, industry, and open-source communities. These= events brought together two different kinds of OCaml developers (with some= overlap), bringing an interesting energy to our community.

    To expand local community involvement, Tarides organised OCaml hacking meet= ups in Manila and Chennai. To make it easier for others to = host similar events, we curated a list of interesting hacking issues from p= ast Cambridge sessions, now available on GitHub.

    As part of the Outreachy program, Tarides supported two rounds of internshi= ps in 2024, with results published on Discuss and watch.oc= aml.org. These internships not only provided great contributions to our= ecosystem but also brought fresh insights into the challenges faced by new= users. For example, interns identified key areas where documentation and t= ooling could be improved, directly informing future updates.

    Tarides also maintained its commitment to funding critical open-source proj= ects and maintainers. We continued funding Robur for their maintenance work on MirageOS= (most of those libraries are used by many =E2=80=93including us=E2=80=93 e= ven in non-MirageOS context) and Daniel B=C3=BCnzli, whose libraries like cmdliner a= re essential for some of our development.

    Finally, Tarides extended sponsorships to non-OCaml-specific events, includ= ing JFLA, BobConf, FSTTCS, and Terminal Feud (which garnered over 100k views). These events expande= d OCaml=E2=80=99s visibility to new audiences and contexts, introducing the= language to a broader technical community that =E2=80=93we hope=E2=80=93 w= ill discover OCaml and enjoy using it as much as we do.

    What=E2=80=99s Next?

    As we begin 2025, Tarides remains committed to making OCaml a mainstream la= nguage. Our focus this year is to position OCaml as a robust choice for mis= sion-critical applications by enhancing developer experience, ecosystem int= egration, and readiness for high-assurance use cases.

    We aim to build on the Dune Developer Preview to further improve usability = across all platforms, with a particular emphasis on Windows, to make OCaml = more accessible to a broader range of developers. Simultaneously, we will e= nsure OCaml is ready for critical applications in industries where reliabil= ity, performance, and security are essential. Projects like SpaceOS showcase the potential of memory- and type-safe languages for safety-crit= ical systems. Built on MirageOS and OCaml=E2=80=99s unique properties, Spac= eOS is part of the EU-funded Orch= ide project and aims to set a new standard for edge computing in space.= Additionally, SpaceOS is being launched in the US through our spin-off Parsimoni. However, these needs are not l= imited to Space: both the EU Cyber Resilience Act and the US cybersecurity initiatives= highlight the growing demand for type-safe, high-assurance software to= address compliance and security challenges in sensitive domains. Tarides b= elieves that OCaml has a decisive role to play here in 2025!

    I=E2=80=99d like to personally thank our sponsors and customers, especially= Jane Street, for their unwavering support over the years, and to Dennis Dang, our single recurring Gi= tHub sponsor. Finally, to every member of Tarides who worked so hard in 202= 4 to make all of this happen: thank you. I=E2=80=99m truly lucky to be sail= ing with you on this journey!

    We are looking for spons= ors on GitHub, are happy to collaborate on innovative projects involving OCaml or MirageOS and off= er commercial services for op= en-source projects =E2=80=93 including long-term support, development of ne= w tools, or assistance with porting projects to OCaml 5 or Windows.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=IRd5YoWO; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=hdlrKxO6; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B57AB4003C for ; Tue, 28 Jan 2025 13:24:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=DF0ImG5ugWWdtZPx+L8J8dteqTTPPA7KwZy/a2ZMIsU=; b=IRd5YoWOXrFiujY+L6YC148fqCofHzVAgbBa7ZLmRREwAuhMe8dhyKvc 6ogAfymREGZ0ZmEN6Z2Vc+j+xEvz2EDo+gcpj2t8W51OkgHPlVtTU3egx nPVx5cx5ffVebOvSaIRxCh3JeDwf0eH0p5SfvAnB8TMSs/0rFLNGmUY2S 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,241,1732575600"; d="scan'208,217";a="205377445" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Jan 2025 14:24:39 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 837DBE00B7; Tue, 28 Jan 2025 14:24:39 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 396FBE00A5 for ; Tue, 28 Jan 2025 14:24:33 +0100 (CET) IronPort-SDR: 6798da8f_7BKMba8aClt6e8M64iXVYQWY8pPL+vqZDLAzcunPxKq0jcN TIpRVqGFIjc5F/QZRmQD+TfRIzPFKD6RManM7NA== X-IPAS-Result: =?us-ascii?q?A0FNFABT2ZhngSIeaIFaglwCgT9bDRsZAWNVBTMHCEgDh?= =?us-ascii?q?FODTwmOGDNjkDeKeIJ7AxgWIxQBAwENLgEFDQECBAEBAwECAYIMgi5ABAICF?= =?us-ascii?q?opfAh8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBP?= =?us-ascii?q?QVJhXsNSQEBAQEBAQEBBQSBa1FUHV4DAwEDBQEGAS8BAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAggEAQcHBAcXBAENHEABC?= =?us-ascii?q?AoTAQEpBQEBCBgjAxAEAQYDAgQNATUDARMBEhQFAQICAYILFEWCH0UDBAEMB?= =?us-ascii?q?pgwmzsQeoEygQGCDAEBBoEIPgICBAEJAwEOCSbaBoFkCYEwGIVrgkkaASpIa?= =?us-ascii?q?gKESAmEMycPgVVEgRWCKEoHb4I/FgwBAQEBARdEOScBAQIGRQmDJYJpghwXS?= =?us-ascii?q?3p+gQdeexGBbIRoEoIVHlqBH25PHR0vRoEPVIEvgVyDCz0BgRASiTiBRyIDJ?= =?us-ascii?q?jMsAVUTFwsHBWGBEAMrNjGBSXs5gg5pSTcCDQI1gh4kWIIrgx+BPYRFhFOFX?= =?us-ascii?q?YIUghGGMR1AAwttPTcUG50TCTU2ATyCexUfBw4KAS0GAg8DAxQTAyABLQETC?= =?us-ascii?q?A4CBRsCLgMFBR4KBwUHAwUTEAIIDQ4bAQINGQUBCQINFRgDghCFR4puDBAYK?= =?us-ascii?q?gJ1nGqUVTQHhB6BXQYMiEg9gSSSJINXhASBV4svhwCSSSKYWiKCNoclgSUJg?= =?us-ascii?q?W9qlScmBgQcGWKEO4F9JDxvARoDAwkHMxowQ4JnCQkNMBwPileHRIEBPYEmg?= =?us-ascii?q?XQ7gSjDMwJCNQEBAQEPKQIHAQoBAQMJhUUdAQFpZYE2ghduhCxuXQEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:aH8TpKwFBR2QRRyXLch6t+eawirEfRIJ4+MujC+fZmUNrF6WrkUDn 2UXCm6PM/jfZTOjL90iYYjk/RhSuZ7SzYAyT1c//FhgHilAwSbnLYTAfx2oZ0t+DeWaERk5t 51GAjXkBJppJpMJjk71atANlVEliefSAOCU5NfsYkhZXRVjRDoqlSVtkus4hp8AqdWiCmthg /uryyHkEAHjgmUc3l48sfrZ9Us25qSq4lv0g3RnDRx1lA+G/5UqJMlHTU2BByOQapVZGOe8W 9HCwNmRlo8O10pF5nuNy94XQ2VSKlLgFVDmZkl+B8BOtiN/Shkaic7XAhazhXB/0F1ll/gpo DlEWAfZpQ0BZsUgk8xFO/VU/r0X0QSrN9YrLFDm2fF/wXEqfFO05sdxFm9qY7Em2eN6K2UW6 8wdeREkO0Xra+KemNpXS8Fplp1lNM7vLZ8SsXFmzCjEALAhW5+rr6fivIUJmm5o2oYVRbCFO 6L1ahI3BPjESyZ1AQ9CCKtilbKVuyzndDlJtF+epaw2+nXeigtr3+3kNNPTPMeBRcBUglqwr GXb+W/0GVcfaMzZziCKmp6prrWXwHikB9lDTNVU8NZPjGSDx14eESEobhihrPK+pk3mes9Af hl8Fi0G9vVuqhf0FrERRSaQq3eBulsYWsFMO/Yr7RmEjKvS+QeQQGYeJgOtc/QjpJZwXTsux 0OElNPvBCVyvfuSU331GqqoQS2aYQ0nMnUsOXE4cygA7vPn+J8Di0PuZ4M2eEKqteHdFTb1y jGMiSExgbQPkMIGv5lXG3ic3FpAQbCSHmYIChXrY46z0u9uTKCfD7FEBHDe/a8GNIGdX0WMt 3gCmtGD4aYJF57leM2xrAclQurBCxWtaWO0bbtT838JrWXFF5mLJ9A43d2GDB01WvvogBewC KMphStf5YVIIFyhZrJtboS6BqwClPe7RYy9DK+LPooeM/CdkTNrGgkyOyZ8OEixzyARfV0XY v93jO7yUCtBV8yLMhLsH7lGuVPU+szO7TiOGc6gkEzPPUu2aXWSTbpNKFyKf/w056OCoRzI/ p5SL9CB031ivB7WP0HqHXooBQlSdxATXMmuw+QOL77rH+aTMDtwYxMn6elwI9Q990mU/8+Ul kyAtrhwkwqm3SSZdFnQMRiOqtrHBP5CkJ7yBgR0VX7A5pTpSd/HAH43JspvL4o0vvdu1+B1R PQjcsCNSKYHADfe9jhXKdG3oIV+fV75zUiDLgi0UggZJpRAfg3u/sO7Xw3N8CJVMDG7m/Fjq JKd1yTaY6E5eSJcMOjsZsiSkmyB5UompLoqXm/jAMViR0H3wY07dw3zlqAWJu8PGzXixxyb9 QecWikFlLPzsaswqIHErv2apIKiEs9VPElTL0/E55mYaAjY+WuCx9dbceCqJDryakL9yJ+AV 850kc7uEaQgsg5RkoxeF71L8/oP1+H3reUH8jU+TWT5UVu7L5hBfF+E5JBrnY9QzOZ7vQCWZ Bq+yuNCM+/UBPK/QU8jHyt7XOGtzvpOpyLz684yK0DE5CNa2rqLfEFRHhuUghxmM7pHH9I58 NglpfIpxVSzujgyPvaCqxJkxWCGA3gDcqcg77UxIovgjCg1wVBjP73YLALL46+0VtYdCXlyf weoh5fDiY9MmWvEUX44TkbW0cRn2J8hhRFtzX05HWqvpObrvPEM8SN0zSUWVSVQlxVO7PJyM DNkNmpzPqS/wA1rj8liAUGpQl1kP0CG8Bbhllcmqm/QYBSwXVzzKEk4aPe/7WEC0mdmZjMA1 qqp+GXkdjfLfc/KwSo5X3B+mcHjVdBc8g7jmtitOtasRr0WQGPCrPe1RGwqrxDHP5sAtHffr 7M3wNcqOLzJCyEAhoYaVa+Y7O00YzKZLjVgRfpBwvs4LVvEcmvv5QnUelGDQeITFfnk6kTiN tdPIPhIXBGA1CqjiDAXKKoPAr1sls4S+9swVeL3FFECroeggGJlgLDI+gj6oV0bcdFkvMI+C 4HWLhapMGibg1lKkG7s8uhAHEeFYuc/WQ6t59Dtrd01FK8Cvtp8LmA08L+/5EuOPCVdohm7g QLkZo3t9dJE97hCpYXXP594N12GEu+rDOWs2yKvgutKduLKYJvvtRtKi1zJPDZ2HLo2WvZon +6d7dLY4kHMk+suWFDnn72ERrh79OSpfe9tKsmsBmJrrSiDf87N4hU45GGzL6JSou5d/sWKQ wiZatO6UNwoB+dm23xebhZBHyYnC6jYarnqoQW/pa+uDicx/BPmLtT901PUdkBeKzE1PqPhB j/Ou/qB4s5SqKJODkQmA9BkG5pJH0/xa5A5dtHetSiqMUfwuwms4oDdrBsH7S3HLlKmE8ygu JLMeUXYRSSI4arNyIlUjpx2shgpF01CuOgXfH8G2ttImju/XX8nL+McDM08MatqsBfOjbP2W DKcS1EZK3TNbWwRO1G0qtHuRRyWCeEyK8/0bG5htV+dbyCtQpiMGv19/yNn+G17YSbn0PrhE 9wF53nsJVKk9/mFnwrICiCT2o+LB882x07kPWj4g5W0GxEaEKkH33xnHRNQWGrACc6leIDjO z0uXW4dKK2kYReZLCqiUyc99NIlUPfHxTI1ayyC25Da55Xdy/dPoBE6E/+myaUNNazmO5ZXL U4ahAKxD6S+wnsXqLcksNIvgLZpBLSMBMfSwGoPg+ENt/nY11nL9P/uUcbCoA/ONeKf/57ge uGQ3kUD IronPort-HdrOrdr: A9a23:nJRbx6qP7aRlQDkgKKbdlOcaV5oGeYIsimQD101hICG9E/bo7v xG+c5w6faaskdyZJhNo6HiBEDiexPhHPxOkO0s1N6ZNWGMhILCFvAE0WKN+UyHJwTOssBYkY hte7VjE9HrZGIK6PrS0U2XF5IPzrC8n5xARt2z856ud2xXgm1bgTuRwzz7LnFL X-Talos-CUID: 9a23:4J7m4WNw10InZe5DAAxV61Q6Rp4ZTF7YwV3Ue1GIDDdIYejA X-Talos-MUID: 9a23:fa28RAaSqUhuxOBTkjPVlDBQOd5U3Z/tEk0GlrkF4+iZKnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,241,1732575600"; d="scan'208,217";a="205377390" X-MGA-submission: =?us-ascii?q?MDFRqbQrN6TJMHteUAU6THQkrl1fC3nMVGdxUG?= =?us-ascii?q?ax1qZahST8qW0pKHkrxEoNh3f+ho+bYKknnuvr4t1i1Sr86CEH1TnVZC?= =?us-ascii?q?KQevMYnNBvwMIxxmc3UvpuUjR4vvaTd2zl0p6l/SmS8sxGVwraY5t2yQ?= =?us-ascii?q?miBdRrx/vd3zNx+WT+3hKwdw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Jan 2025 14:24:31 +0100 Received: from TM.local (unknown [185.252.130.169]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 039F9564A98; Tue, 28 Jan 2025 14:24:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1738070670; bh=XLVhFqAGuruWDyf1T/xx22RouhVoq1SEgZsczs/nqms=; h=From:To:Subject:Date:Message-ID; b=hdlrKxO6gwbnIqB+FAs4fLD+45PKN72KSAlkttekz+3RZ2j+AfPF+zFdWLXoQJrqG EAuKqOUJDgHe7UMjGtpZ++gppnBPTxNmnnVDpkCoAIJBYQM96E89ftSBHHU9xOPi34 5c+eFTF9114QHc1ppMwqED7XnV8evOPL6JbqSAy4= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 28 Jan 2025 14:24:23 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 28 14:24:31 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.455807, queueID=BBE83564A99 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19258 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAyMSB0byAyOCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KR29vZ2xl IFN1bW1lciBvZiBDb2RlDQpNZXJsaW4gYW5kIE9DYW1sLUxTUCBzdXBwb3J0IGV4cGVyaW1lbnRh bCBwcm9qZWN0LXdpZGUgcmVuYW1pbmcNCnFjaGVjay1saW4gYW5kIHFjaGVjay1zdG0gMC4yDQpE dW5lIDMuMTcNCk9kb2MgMyBCZXRhIFJlbGVhc2UNCjIwMjQgYXQgT0NhbWxQcm8NCk9sZCBDV04N Cg0KDQpHb29nbGUgU3VtbWVyIG9mIENvZGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZ29vZ2xlLXN1bW1lci1vZi1jb2RlLzMxOTYvMTI+DQoNCg0K QW50b24gS29jaGtvdiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lISBJ ZiB5b3UgcGxhbiB0byBhcHBseSB0aGlzIHllYXIgZm9yIHRoZSBHb29nbGUgU3VtbWVyIG9mDQog IENvZGUsIGl0IHN0YXJ0cyBvbiBKYW51YXJ5IDI3IGFuZCBlbmRzIG9uIEZlYnJ1cmFyeSAxMToN CiAgPGh0dHBzOi8vb3BlbnNvdXJjZS5nb29nbGVibG9nLmNvbS8yMDI1LzAxL2dvb2dsZS1zdW1t ZXItb2YtY29kZS0yMDI1LWlzLWhlcmUuaHRtbD4NCg0KDQpNZXJsaW4gYW5kIE9DYW1sLUxTUCBz dXBwb3J0IGV4cGVyaW1lbnRhbCBwcm9qZWN0LXdpZGUgcmVuYW1pbmcNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1l cmxpbi1hbmQtb2NhbWwtbHNwLXN1cHBvcnQtZXhwZXJpbWVudGFsLXByb2plY3Qtd2lkZS1yZW5h bWluZy8xNjAwOC8xPg0KDQoNCnZkcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoYXQgdGhl IGxhdGVzdCByZWxlYXNlcyBvZiBNZXJsaW4NCiAgKGA1LjQuMS01MDMnKSBhbmQgT0NhbWwtTFNQ IChgMS4yMi4wJykgZm9yIE9DYW1sIDUuMyBwcm92aWRlDQogIGV4cGVyaW1lbnRhbCBzdXBwb3J0 IGZvciBfcHJvamVjdC13aWRlXyByZW5hbWluZyBvZiBzeW1ib2xzLg0KDQogIFVzZXJzIG9mIFt2 c2NvZGUtb2NhbWwtcGxhdGZvcm1dLCBbb2NhbWwtZWdsb3RdIG9yIGFueSBnZW5lcmljIExTUA0K ICBjbGllbnQgY2FuIGV4cGVyaW1lbnQgd2l0aCB0aGUgbmV3IGZlYXR1cmUgcmlnaHQgbm93IHZp YSB0aGUgc3RhbmRhcmQNCiAgYFJlbmFtZScgZmVhdHVyZSBvZiB0aGVpciBmYXZvcml0ZSBlZGl0 b3JzLiAoVGhpcyBpcyBub3QgZW5hYmxlZCBpbg0KICB0aGUgc3RhbmRhcmQgRW1hY3MgYW5kIFZp bSBtb2RlcyB5ZXQuKQ0KDQogIEFsbCBwcm9qZWN0LXdpZGUgZmVhdHVyZXMgcmVxdWlyZSBbdGhl IGluZGV4ZXJdIHRvIGJlIGluc3RhbGxlZCBhbmQgYW4NCiAgdXAtdG8gZGF0ZSBpbmRleCBidWls dCB3aXRoIGBkdW5lIGJ1aWxkIEBvY2FtbC1pbmRleCAtLXdhdGNoJyAod2Ugb25seQ0KICBzaGlw IHJ1bGVzIGZvciBEdW5lLCBidXQgdGhlIGluZGV4ZXIgaXRzZWxmIGlzIGFnbm9zdGljKS4NCg0K ICBUaGlzIGlzIGEgY29tcGxleCBmZWF0dXJlIGluIGFuIGV4cGVyaW1lbnRhbCBzdGF0ZSwgcGxl YXNlIHJlcG9ydCBhbnkNCiAgaXNzdWUgeW91IG1pZ2h0IGVuY291bnRlciB0byBbTWVybGluJ3Mg aXNzdWUgdHJhY2tlcl0uDQoNCiAgPGh0dHBzOi8vdXMxLmRpc2NvdXJzZS1jZG4uY29tL2ZsZXgw MjAvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9hL2ExYmY4YmU0MjdkYTlmMTFkMmU2NTcxN2Vi MDEwMDc3OGVlYzlhYzMuZ2lmPg0KDQogICpDb21wbGV0ZSBjaGFuZ2Vsb2cqDQoNCg0KW3ZzY29k ZS1vY2FtbC1wbGF0Zm9ybV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL3ZzY29kZS1v Y2FtbC1wbGF0Zm9ybS8+DQoNCltvY2FtbC1lZ2xvdF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLXJlbGVhc2Utb2Ytb2NhbWwtZWdsb3QtMS0wLTAvMTU5Nzg+DQoNClt0aGUgaW5k ZXhlcl0gPGh0dHBzOi8vb2NhbWwub3JnL3Avb2NhbWwtaW5kZXgvbGF0ZXN0Pg0KDQpbTWVybGlu J3MgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vaXNzdWVz Pg0KDQptZXJsaW4gNS40LjENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKBgyBtZXJsaW4gYmluYXJ5DQogICAg4oCiIFN1cHBvcnQgZm9yIE9DYW1sIDUuMw0KICAg IOKAoiBVc2UgbmV3IDUuMyBmZWF0dXJlcyB0byBpbXByb3ZlIGxvY2F0ZSBiZWhhdmlvciBpbiBz b21lDQogICAgICBjYXNlcy4gTWVybGluIG5vIGxvbmdlciBjb25mdXNlcyB1aWRzIGZyb20gaW50 ZXJmYWNlcyBhbmQNCiAgICAgIGltcGxlbWVudGF0aW9ucy4gKCMxODU3KQ0KICAgIOKAoiBQZXJm b3JtIGxlc3MgbWVyZ2VzIGluIHRoZSBpbmRleGVyICgjMTg4MSkNCiAgICDigKIgQWRkIGluaXRp YWwgc3VwcG9ydCBmb3IgcHJvamVjdC13aWRlIHJlbmFtaW5nOiBvY2N1cnJlbmNlcyBjYW4gbm93 DQogICAgICByZXR1cm4gYWxsIHVzYWdlcyBvZiBhbGwgcmVsYXRlZCBkZWZpbml0aW9ucy4gKCMx ODc3KQ0KICDigYMgb2NhbWwtaW5kZXgNCiAgICDigKIgQnVtcCBtYWdpYyBudW1iZXIgYWZ0ZXIg aW5kZXggZmlsZSBmb3JtYXQgY2hhbmdlICgjMTg4NikNCiAg4oGDIHZpbSBwbHVnaW4NCiAgICDi gKIgQWRkZWQgc3VwcG9ydCBmb3Igc2VhcmNoLWJ5LXR5cGUgKCMxODQ2KSBUaGlzIGlzIGV4cG9z ZWQgdGhyb3VnaA0KICAgICAgdGhlIGV4aXN0aW5nIGA6TWVybGluU2VhcmNoJyBjb21tYW5kLCB0 aGF0IHN3aXRjaGVzIGJldHdlZW4NCiAgICAgIHNlYXJjaC1ieS10eXBlIGFuZCBwb2xhcml0eSBz ZWFyY2ggZGVwZW5kaW5nIG9uIHRoZSBmaXJzdA0KICAgICAgY2hhcmFjdGVyIG9mIHRoZSBxdWVy eS4NCg0KDQpPY2FtbC1MU1AgMS4yMi4wDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICDigKIgRW5hYmxlIGV4cGVyaW1lbnRhbCBwcm9qZWN0LXdp ZGUgcmVuYW1pbmcgb2YgaWRlbnRpZmllcnMgKCMxNDMxKQ0KDQoNCnFjaGVjay1saW4gYW5kIHFj aGVjay1zdG0gMC4yDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1xY2hlY2stbGluLWFuZC1xY2hl Y2stc3RtLTAtMi8xMjMwMS81Pg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBWZXJzaW9uIDAuNyBvZiBgcWNoZWNrLWxpbicsIGBxY2hlY2stc3RtJywgYW5k DQogIGBxY2hlY2stbXVsdGljb3JldGVzdHMtdXRpbCcgaXMgbm93IGF2YWlsYWJsZSBvbiB0aGUg b3BhbSByZXBvc2l0b3J5Og0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9t dWx0aWNvcmV0ZXN0cy9yZWxlYXNlcy90YWcvMC43Pg0KDQogIFRoaXMgcmVsZWFzZSBjb250YWlu cyB0d28gY29udHJpYnV0aW9ucyBmcm9tIEBwb2x5dHlwaWMsIGluY2wuIGFuDQogIGBTVE0nIGZl YXR1cmUgdG8gaGVscCB0ZXN0aW5nIG9mIH5jbWR+cyB0aGF0IG1heSByYWlzZSBhbiBlZmZlY3Q6 DQoNCiAg4oCiIFsjNTA5XTogQ2hhbmdlL0ZpeCB0byB1c2UgYSBzeW1tZXRyaWMgYmFycmllciB0 byBzeW5jaHJvbml6ZSBkb21haW5zDQogIOKAoiBbIzUxMV06IEludHJvZHVjZSBleHRlbmRlZCBz cGVjcyB0byBhbGxvdyB3cmFwcGluZyBjb21tYW5kIHNlcXVlbmNlcw0KICDigKIgWyM1MTddOiBB ZGQgYExpbicgY29tYmluYXRvcnMgYHNlcV9zbWFsbCcsIGBhcnJheV9zbWFsbCcsIGFuZA0KICAg IGBsaXN0X3NtYWxsJw0KDQogIEhhcHB5IHRlc3RpbmchIDpzbWlsZXk6DQoNCg0KWyM1MDldIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGljb3JlL211bHRpY29yZXRlc3RzL3B1bGwvNTA5 Pg0KDQpbIzUxMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbXVsdGljb3Jl dGVzdHMvcHVsbC81MTE+DQoNClsjNTE3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRp Y29yZS9tdWx0aWNvcmV0ZXN0cy9wdWxsLzUxNz4NCg0KDQpEdW5lIDMuMTcNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvYW5uLWR1bmUtMy0xNy8xNTc3MC81Pg0KDQoNCkV0aWVubmUgTWFyYWlzIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIER1bmUgdGVhbSBpcyByZWxlYXNpbmcgRHVuZSBgMy4x Ny4yJyEgOndyZW5jaDoNCg0KICBUaGlzIHBhdGNoIHJlbGVhc2UgaW5jbHVkZXMgc29tZSBidWcg Zml4ZXMuIEl0IG1vc3RseSBicmluZ3Mgc29tZQ0KICBmaXhlcyBmb3IgTWVsYW5nZSBhbmQgV2Fz bV9vZl9vY2FtbC4gSXQgYWxzbyBmaXhlcyBhIGJ1ZyB0aGF0IHByZXZlbnRzDQogIHRoZSBleHBl cmltZW50YWwgZmVhdHVyZSwgcGFja2FnZSBtYW5hZ2VtZW50LCB0byBidWlsZCB3aXRoDQogIGBv Y2FtbC41LjMuMCcuDQoNCiAgSWYgeW91IGVuY291bnRlciBhIHByb2JsZW0gd2l0aCB0aGlzIHJl bGVhc2UsIHlvdSBjYW4gcmVwb3J0IGl0IG9uIHRoZQ0KICBbb2NhbWwvZHVuZV0gcmVwb3NpdG9y eS4NCg0KDQpbb2NhbWwvZHVuZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vl cz4NCg0KQ2hhbmdlbG9nDQrilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIEZpeGVk DQoNCiAg4oCiIEZpeCBhIGNyYXNoIGluIHRoZSBNZWxhbmdlIHJ1bGVzIHRoYXQgd291bGQgcHJl dmVudCBjb21waWxpbmcgcHVibGljDQogICAgbGlicmFyeSBpbXBsZW1lbnRhdGlvbnMgb2Ygdmly dHVhbCBsaWJyYXJpZXMuIChAYW1vbnRlaXJvLCAjMTEyNDgpDQogICAg4oCiIFBhc3MgYG1lbGFu Z2UuZW1pdCcncyBgY29tcGlsZV9mbGFncycgdG8gdGhlIEpTIGVtaXNzaW9uDQogICAgICBwaGFz ZS4gKEBhbW9udGVpcm8sICMxMTI1MikNCiAg4oCiIERpc2FsbG93IHByaXZhdGUgaW1wbGVtZW50 YXRpb25zIG9mIHB1YmxpYyB2aXJ0dWFsIGxpYnMgaW4gYG1lbGFuZ2UnDQogICAgbW9kZS4gKEBh bW9udGVpcm8sICMxMTI1MykNCiAg4oCiIFdhc21fb2Zfb2NhbWw6IGZpeCB0aGUgZXhlY3V0aW9u IG9mIHRlc3RzIGluIGEgc2FuZGJveC4gICgjMTEzMDQsDQogICAgQHZvdWlsbG9uKQ0KDQoNCk9k b2MgMyBCZXRhIFJlbGVhc2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW9kb2MtMy1iZXRhLXJlbGVhc2UvMTYwNDMvMT4NCg0KDQpKb24gTHVkbGFtIGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgT24gYmVoYWxmIG9mIHRoZSBvZG9jIHRlYW0sIEknbSB0aHJpbGxl ZCB0aGUgYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YNCiAgb2RvYyAzLjAuMCBiZXRhIDEhDQoNCiAg VGhpcyByZWxlYXNlIGhhcyBiZWVuIGNvb2tpbmcgZm9yIGEgbG9uZyB0aW1lIC0gaXQncyBiZWVu IG1vcmUgdGhhbiBhDQogIHllYXIgc2luY2Ugb2RvYyAyLjQgbGFuZGVkLCBhbmQgYSBodWdlIGFt b3VudCBvZiB3b3JrIGhhcyBnb25lIGludG8NCiAgdGhpcy4gVGhhbmtzIHRvIHRoZSBtYW55IG90 aGVycyB3aG8gY29udHJpYnV0ZWQsIGVpdGhlciBieSBjb2RlIG9yIGJ5DQogIGNvbW1lbnRzOiBA anVsb28sIEBwYW5nbGVzZCwgQEVtaWxlVHJvdGlnbm9uLCBAZ3BldGlvdCwgQHRyZWZpcywNCiAg QHNhYmluZSwgQGRidWVuemxpLCBAeWF3YXJhbWluLCBhbmQgbW9yZS4NCg0KICBXaXRoIHRoaXMg cmVsZWFzZSB3ZSdyZSBpbmNsdWRpbmcgYSBkcml2ZXIgdGhhdCBrbm93cyBob3cgdG8gdXNlIGFs bA0KICBvZiB0aGUgZXhjaXRpbmcgbmV3IGZlYXR1cmVzIG9mIG9kb2MuIFRoaXMgZHJpdmVyIGhh cyBiZWVuIHVzZWQgdG8NCiAgY3JlYXRlIHRoZSBbZG9jcyBzaXRlIGZvciB0aGUgdmFyaW91cyBv ZG9jIHRvb2xzXS4NCg0KICBIZXJlIGFyZSBhIHNlbGVjdGVkIHNldCBvZiBmZWF0dXJlczoNCg0K ICDigKIgOmRyb3BsZXQ6IFJlbmRlcmVkIHNvdXJjZSEgSnVtcCBmcm9tIGFueSBpdGVtIGluIHRo ZSBkb2N1bWVudGF0aW9uDQogICAgc3RyYWlnaHQgdG8gaXRzIHJlbmRlcmVkIHNvdXJjZTsgbm8g bWF0dGVyIGhvdyBtdWNoIG9mIE9DYW1sJ3MNCiAgICBjb21wbGV4IG1vZHVsZSBzeXN0ZW0geW91 IGFyZSB1c2luZy4NCiAg4oCiIDptYWc6IFNlYXJjaCBieSB0eXBlISBPdXIgZGV0ZWN0aXZlIHNo ZXJsb2RvYyB3aWxsIGZpbmQgeW91ciBsb3N0DQogICAgdmFsdWUgZ2l2ZW4gaXRzIHR5cGUuDQog IOKAoiA6d2FybmluZzogQ29udmVuaWVudCB3YXJuaW5ncyEgV2FybmluZ3MgYXJlIG5vdyBjbGVh cmx5IHZpc2libGUgYW5kDQogICAgdXNlZnVsLCBubyBsb25nZXIgYnVyaWVkIGFtb25nIHlvdXIg ZGVwZW5kZW5jaWVz4oCZIHdhcm5pbmdzLg0KICDigKIgOmFycm93X2hlYWRpbmdfdXA6IFNlbGYg aG9zdCB5b3VyIGRvY3VtZW50YXRpb24sIGJ1dCBbbGluayB0bw0KICAgIG9jYW1sLm9yZ10gZm9y IHlvdXIgZGVwZW5kZW5jaWVzLg0KICDigKIgOjEwMDogTW9yZSBzaWRlYmFycyEgT2RvYyAzIGZl YXR1cmVzIGEgW2dsb2JhbCBzaWRlYmFyXSwgYWxsb3dpbmcNCiAgICB5b3UgdG8gZGlzY292ZXIg dGhlIG1vc3QgaGlkZGVuIGNvcm5lciBvZiB1bmRlcmdyb3VuZCBkb2N1bWVudGF0aW9uLg0KICDi gKIgOmV4cGxvZGluZ19oZWFkOiBJbWFnZSBzdXBwb3J0ISBUaGlzIGN1dHRpbmctZWRnZSBmZWF0 dXJlIG5vdyBhbGxvd3MNCiAgICB5b3UgdG8gW2FkZCBpbWFnZXNdIHRvIHlvdXIgZG9jdW1lbnRh dGlvbi4gVmlkZW8gYW5kIGF1ZGlvIGNvbWUgZm9yDQogICAgZnJlZS4NCiAg4oCiIDpzcGlkZXJf d2ViOiBbRnVsbHkgY3Jvc3MtcGFja2FnZSBsaW5rc10hIFRoZSBPQ2FtbCBkb2NzIGFyZSBub3cg YQ0KICAgIHRydWUgc3BpZGVyIHdlYi4gUHJlcGFyZSB0byBjYXRjaCBidWdzLCBhbmQgZWF0IHRo ZW0uDQogIOKAoiA6Y29wOiBIaWVyYXJjaGljYWwgZG9jdW1lbnRhdGlvbiBwYWdlcyEgV2UgdXNl IGEgbW9kdWxhcg0KICAgIGxhbmd1YWdlLiBXZSBkb24ndCB3YW50IGEgZmxhdCBuYW1lc3BhY2Ug Zm9yIHBhZ2VzLg0KICDigKIgOmJ1aWxkaW5nX2NvbnN0cnVjdGlvbjogVGhlIGJ1aWxkIGRlcGVu ZGVuY2llcyBhcmUgZnJpZW5kbGllciB3aXRoDQogICAgaW5jcmVtZW50YWwgYnVpbGQgc3lzdGVt cywgYWxsb3dpbmcgYmV0dGVyIHNoYXJlZCBidWlsZCBjYWNoZXMuDQogIOKAoiA6aGVhcnQ6IFF1 YWxpdHkgb2YgbGlmZSBpbXByb3ZlbWVudHMhIE1hbnkgaW1wcm92ZW1lbnRzIGhhdmUgYmVlbg0K ICAgIHBpbGluZyB1cCBzaW5jZSB3ZSBzdGFydGVkIG9kb2MgMy4gRm9yIGluc3RhbmNlOiBgQWRk IGNsb2NrIGVtb2ppDQogICAgYmVmb3JlIEBzaW5jZSB0YWcgKEB5YXdhcmFtaW4sICMxMDg5KSch DQoNCiAgTW9yZSBleHBsYW5hdGlvbiBvZiB0aGVzZSBmZWF0dXJlcyBpcyBhdmFpbGFibGUgYXQg dGhlIG9kb2Mgc2l0ZSwNCiAgd2hlcmUgd2UgaGF2ZSBkb2N1bWVudGF0aW9uIFtmb3IgYXV0aG9y c10sIGZvciBbdXNlcnMgb2YNCiAgYG9kb2NfZHJpdmVyJ10sIGEgW2NoZWF0c2hlZXRdLCBhbmQg W2RpZmZlcmVuY2VzIGZyb20gb2NhbWxkb2NdLg0KDQoNCltkb2NzIHNpdGUgZm9yIHRoZSB2YXJp b3VzIG9kb2MgdG9vbHNdIDxodHRwczovL29jYW1sLmdpdGh1Yi5pby9vZG9jLz4NCg0KW2xpbmsg dG8gb2NhbWwub3JnXQ0KPGh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2RvYy1kcml2ZXIv I3JlbWFwcGluZy1kZXBlbmRlbmNpZXM+DQoNCltnbG9iYWwgc2lkZWJhcl0NCjxodHRwczovL29j YW1sLmdpdGh1Yi5pby9vZG9jL29kb2Mvb2RvY19mb3JfYXV0aG9ycy5odG1sI3BhZ2UtdGFncz4N Cg0KW2FkZCBpbWFnZXNdDQo8aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jL29kb2Nf Zm9yX2F1dGhvcnMuaHRtbCNtZWRpYT4NCg0KW0Z1bGx5IGNyb3NzLXBhY2thZ2UgbGlua3NdDQo8 aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jL29kb2NfZm9yX2F1dGhvcnMuaHRtbCNs aW5rc19hbmRfcmVmZXJlbmNlcz4NCg0KW2ZvciBhdXRob3JzXSA8aHR0cHM6Ly9vY2FtbC5naXRo dWIuaW8vb2RvYy9vZG9jL29kb2NfZm9yX2F1dGhvcnMuaHRtbD4NCg0KW3VzZXJzIG9mIGBvZG9j X2RyaXZlciddDQo8aHR0cHM6Ly9vY2FtbC5naXRodWIuaW8vb2RvYy9vZG9jLWRyaXZlci9pbmRl eC5odG1sPg0KDQpbY2hlYXRzaGVldF0gPGh0dHBzOi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2Rv Yy9jaGVhdHNoZWV0Lmh0bWw+DQoNCltkaWZmZXJlbmNlcyBmcm9tIG9jYW1sZG9jXQ0KPGh0dHBz Oi8vb2NhbWwuZ2l0aHViLmlvL29kb2Mvb2RvYy9vY2FtbGRvY19kaWZmZXJlbmNlcy5odG1sPg0K DQpIb3cgY2FuIHlvdSBoZWxwPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2UgbmVlZCB5b3VyIGZlZWRiYWNrLCBib3RoIGFzIGF1dGhv cnMgYW5kIGFzIHVzZXJzIG9mIGRvY3VtZW50YXRpb24hDQogIFRyeSB0aGluZ3Mgb3V0IHVzaW5n IHRoZSBuZXcgZHJpdmVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIGluc3Rh bGwgb2RvYy1kcml2ZXIgICAgIyBkb24ndCBmb3JnZXQgdG8gfm9wYW0gdXBkYXRlfg0KICDilIIg JCBvZG9jX2RyaXZlciA8cGFja2FnZSBsaXN0PiAgIyBGb3IgaW5zdGFuY2U6IH4kIG9kb2NfZHJp dmVyIGJyciBvZG9jfg0KICDilIIgJCAkWU9VUl9CUk9XU0VSIF9odG1sL2luZGV4Lmh0bWwNCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAgTWFueSBvZiB0aG9zZSBmZWF0dXJlcycgaW1wbGVtZW50YXRp b25zIGFyZSBub3Qgc2V0IGluIHN0b25lLCBidXQNCiAgZmlyc3QgdmVyc2lvbnMuIFBsZWFzZSBs ZWF2ZSBjb21tZW50cywgZWl0aGVyIGluIHRoaXMgdGhyZWFkIG9yIGFzDQogIGlzc3VlcyBpbiB0 aGUgcmVwb3NpdG9yeS4NCg0KICBTbywgbmF2aWdhdGUgYWxyZWFkeSB3cml0dGVuIGRvY3VtZW50 YXRpb24sIGFuZCB1cGRhdGUgeW91ciBvd24gZG9jcw0KICB0byB1c2UgdGhlIG5ldyBmZWF0dXJl cyENCg0KDQoyMDI0IGF0IE9DYW1sUHJvDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90LzIwMjQtYXQtb2NhbWxwcm8vMTYwNDYvMT4NCg0KDQpPQ2FtbFBybyBhbm5vdW5jZWQNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog ICoyMDI0IGF0IE9DYW1sUHJvKg0KDQogIEF0IE9DYW1sUHJvLCB3ZSBsaWtlIHRvIHNvbHZlIGlz c3VlcyB0aGF0IGhhdmUgYW4gaW1wYWN0IGluIHRoZSByZWFsDQogIHdvcmxkLCBzbyB3ZSBmb2N1 cyBtb3N0IG9mIG91ciBlZmZvcnRzIG9uIHByb2plY3RzIHRoYXQgb3VyIGN1c3RvbWVycw0KICBi cmluZyBmcm9tIHRoZWlyIGRvbWFpbnMuIFdlIG9mdGVuIGxpa2UgdG8gd29yayBpbiB0aGUgc2hh ZG93cywNCiAgZm9jdXNpbmcgb24gdGhlIGhhcmRlc3QgdGFza3MuIEZhYnJpY2UsIE9DYW1sUHJv 4oCZcyBmb3VuZGVyLCB1c2VkIHRvDQogIHNheSB0aGF0IHdlIGFyZSB0aGUgQ29tbWFuZG9zIG9m IE9DYW1sIChhbmQgbm93IG9mIFJ1c3QgdG9vKSwgYSB0ZWFtDQogIG9mIGhpZ2hseSBza2lsbGVk IHByb2Zlc3Npb25hbHMganVtcGluZyBpbnRvIHRoZSBtb3N0IGRlbWFuZGluZw0KICBwcm9qZWN0 cy4gVGhhdCBhYmlsaXR5IHdhcyBpbGx1c3RyYXRlZCBzZXZlcmFsIHRpbWVzIGluIHRoZSBwYXN0 LCBmcm9tDQogIHRoZSBiaXJ0aCBvZiBPcGFtLCB0aGUgZGV2ZWxvcG1lbnQgb2YgdGhlIEZsYW1i ZGEgY29tcGlsZXJzIGZvciBKYW5lDQogIFN0cmVldCwgdGhlIGRlc2lnbiBhbmQgZGV2ZWxvcG1l bnQgb2YgdGhlIFRlem9zIHByb3RvdHlwZSBhbmQgSUNPDQogIHBsYXRmb3JtLCB0byB0aGUgYWR2 ZW50dXJvdXMgZXh0ZW5zaW9uIG9mIHRoZSBHbnVDT0JPTCBvcGVuLXNvdXJjZQ0KICBjb21waWxl ciBmb3IgRnJlbmNoIERHRmlQLCBldmVuIHRoZSBwb3J0IG9mIEZsb3cgYW5kIEhhY2sgdG8gV2lu ZG93cw0KICBmb3IgTWV0YS4gT2YgY291cnNlLCB3ZSBhcmUgYWx3YXlzIGhhcHB5IHRvIGJlIGVu dHJ1c3RlZCB3aXRoIG1vcmUNCiAgY29tbW9uIHByb2plY3RzIGFuZCB0YXNrcyBhbHNvLCBidWls ZGluZyBhIHRlYW0gYW5kIHRyYWluaW5nIHRoZQ0KICB0YWxlbnRzIHJlcXVpcmVkIHRvIG1hc3Rl ciBhbGwgdGFza3MsIGZyb20gdGhlIHNpbXBsZXN0IHRvIHRoZSBoYXJkZXN0DQogIG9uZXMuIEFu ZCB0aGUgaGFyZGVzdCBvbmVzIGFyZSBvZnRlbiBoaWRkZW4gaW4gdGhlIG1pZGRsZSBvZiB0aGUN CiAgc2ltcGxlc3Qgb25lcywgdG9vLg0KDQogIFRoZSBPQ2FtbCBsYW5ndWFnZSBpcyB0aGUgZ3Jl YXRlc3QgdG9vbCBhdCBoYW5kIHRvIGZ1bGZpbCBvdXINCiAgbWlzc2lvbnMsIGFuZCB3ZSB0cnkg dG8gY29udHJpYnV0ZSBiYWNrIHRvIHRoZSBPQ2FtbCBlY29zeXN0ZW0gd2hlbg0KICBwb3NzaWJs ZS4gV2UgYXJlIGFsd2F5cyBhdHRyYWN0ZWQgdG8gaXNzdWVzIG1ldCBieSBPQ2FtbCBpbmR1c3Ry aWFsDQogIHVzZXJzLCBhcyBpdCBnaXZlcyB1cyB0aGUgb3Bwb3J0dW5pdHkgdG8gZGlyZWN0bHkg d29yayBmb3IgdGhlIE9DYW1sDQogIGNvbW11bml0eS4gV291bGQgeW91IGJlIGhhdmluZyBzdWNo IGlzc3VlcywgZG8gbm90IGhlc2l0YXRlIHRvIGNvbnRhY3QNCiAgdXMgYW5kIGRpc2N1c3Mgd2hh dCB3ZSBjYW4gZG8gZm9yIHlvdSENCg0KICBUaGUgYmVnaW5uaW5nIG9mIGEgbmV3IHllYXIgaXMg YWx3YXlzIGEgZ29vZCB0aW1lIHRvIGxvb2sgYmFjayBhdCB0aGUNCiAgcHJldmlvdXMgeWVhciwg YW5kIHNlZSB3aGF0IHdlIGhhdmUgYWNoaWV2ZWQgd2l0aCBPQ2FtbCwgYW5kIHNvbWV0aW1lcw0K ICBmb3IgT0NhbWwsIGluIDIwMjQuDQoNCg0KQ29udHJpYnV0aW9ucyB0byB0aGUgT0NhbWwgZWNv c3lzdGVtDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0K4peKIFNoYXJpbmcgS25vd2xlZGdlDQoNCiAgSW4gMjAyNCwgd2UgbWFkZSBlZmZvcnRz IHRvIGRlZGljYXRlIG1vcmUgdGltZSB0byB3cml0ZSBibG9nIHBvc3RzIHRvDQogIHNoYXJlIG91 ciBrbm93bGVkZ2Ugb24gdGhlIE9DYW1sIHRvb2xzIHdlIHdvcmsgb24sIHNvIHRoYXQgT0NhbWwN CiAgZGV2ZWxvcGVycyBjYW4gdXNlIHRoaXMga25vd2xlZGdlIGluIHRoZWlyIGRhaWx5IHRhc2tz LiBXZSB3cm90ZSBhDQogIHNlcmllcyBvZiBhcnRpY2xlcyBvbiBtYXN0ZXJpbmcgT3BhbSBmcm9t IHRoZSBncm91bmQgdXAgKCBbT3BhbSAxMDE6DQogIFRoZSBGaXJzdCBTdGVwc10sIFtPcGFtIDEw MjogUGlubmluZyBQYWNrYWdlc10pLCBvbiB0aGUgaW50ZXJuYWxzIG9mDQogIHRoZSBGbGFtYmRh MiBjb21waWxlciAoIFtCZWhpbmQgdGhlIFNjZW5lcyBvZiB0aGUgT0NhbWwgT3B0aW1pc2luZw0K ICBDb21waWxlciBGbGFtYmRhMjogSW50cm9kdWN0aW9uIGFuZCBSb2FkbWFwXSwgW0ZsYW1iZGEy IEVwLiAyOg0KICBMb29waWZ5aW5nIFRhaWwtUmVjdXJzaXZlIEZ1bmN0aW9uc10sIFtGbGFtYmRh MiBFcC4gMzogU3BlY3VsYXRpdmUNCiAgSW5saW5pbmddICkgYW5kIG9uZSBvbiBPQ2FtbCBiYWNr dHJhY2VzICggW09DYW1sIEJhY2t0cmFjZXMgb24NCiAgVW5jYXVnaHQgRXhjZXB0aW9uc10gKS4g TW9yZSBhcmUgY29taW5nIQ0KDQogIE9mIGNvdXJzZSwgaWYgeW91IGFyZSBub3QgcGF0aWVudCBl bm91Z2ggdG8gd2FpdCBmb3Igb3VyIG5leHQNCiAgYXJ0aWNsZXMsIHlvdSBtYXkgcmVnaXN0ZXIg Zm9yIG9uZSBvZiBbb3VyIHRyYWluaW5nc10gLCB3ZSBoYXZlIFtPQ2FtbA0KICBCZWdpbm5lcl0g LCBbT0NhbWwgRXhwZXJ0XSAsIFtNYXN0ZXJpbmcgT3BhbV0gLCBbT0NhbWwgQ29kZQ0KICBPcHRp bWl6YXRpb25dIGFuZCB3ZSBjYW4gYnVpbGQgbmV3IG9uZXMgb24gZGVtYW5kLiBUbyBiZSBob25l c3QsIGluDQogIDIwMjQsIHdlIHJlY2VpdmVkIG1hbnkgbW9yZSByZXF1ZXN0cyBmb3Igb3VyIHNl c3Npb25zIG9uIFJ1c3QNCiAgKEJlZ2lubmVyLCBFeHBlcnQgYW5kIEVtYmVkZGVkKSB0aGFuIGZv ciBPQ2FtbCwgYnV0IG1vcmUgZm9yIE9DYW1sDQogIG9uZXMgdGhhbiBmb3IgQ09CT0wgb25lcyDw n5mCDQoNCg0KICBbT3BhbSAxMDE6IFRoZSBGaXJzdCBTdGVwc10NCiAgPGh0dHBzOi8vb2NhbWxw cm8uY29tL2ZyL2Jsb2cvMjAyNF8wMV8yM19vcGFtXzEwMV90aGVfZmlyc3Rfc3RlcHM+DQoNCiAg W09wYW0gMTAyOiBQaW5uaW5nIFBhY2thZ2VzXQ0KICA8aHR0cHM6Ly9vY2FtbHByby5jb20vZnIv YmxvZy8yMDI0XzAzXzI1X29wYW1fMTAyX3Bpbm5pbmdfcGFja2FnZXM+DQoNCiAgW0JlaGluZCB0 aGUgU2NlbmVzIG9mIHRoZSBPQ2FtbCBPcHRpbWlzaW5nIENvbXBpbGVyIEZsYW1iZGEyOg0KICBJ bnRyb2R1Y3Rpb24gYW5kIFJvYWRtYXBdDQogIDxodHRwczovL29jYW1scHJvLmNvbS9mci9ibG9n LzIwMjRfMDNfMThfdGhlX2ZsYW1iZGEyX3NuaXBwZXRzXzA+DQoNCiAgW0ZsYW1iZGEyIEVwLiAy OiBMb29waWZ5aW5nIFRhaWwtUmVjdXJzaXZlIEZ1bmN0aW9uc10NCiAgPGh0dHBzOi8vb2NhbWxw cm8uY29tL2ZyL2Jsb2cvMjAyNF8wNV8wN190aGVfZmxhbWJkYTJfc25pcHBldHNfMj4NCg0KICBb RmxhbWJkYTIgRXAuIDM6IFNwZWN1bGF0aXZlIElubGluaW5nXQ0KICA8aHR0cHM6Ly9vY2FtbHBy by5jb20vZnIvYmxvZy8yMDI0XzA4XzA5X3RoZV9mbGFtYmRhMl9zbmlwcGV0c18zPg0KDQogIFtP Q2FtbCBCYWNrdHJhY2VzIG9uIFVuY2F1Z2h0IEV4Y2VwdGlvbnNdDQogIDxodHRwczovL29jYW1s cHJvLmNvbS9mci9ibG9nLzIwMjRfMDRfMjVfb2NhbWxfYmFja3RyYWNlc19vbl91bmNhdWdodF9l eGNlcHRpb25zPg0KDQogIFtvdXIgdHJhaW5pbmdzXSA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHBy by5jb20+DQoNCiAgW09DYW1sIEJlZ2lubmVyXQ0KICA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHBy by5jb20vZW4vZm9ybWF0aW9uLW9jYW1sLWRlYnV0YW50LTIwMjIuaHRtbD4NCg0KICBbT0NhbWwg RXhwZXJ0XQ0KICA8aHR0cHM6Ly90cmFpbmluZy5vY2FtbHByby5jb20vZW4vZm9ybWF0aW9uLW9j YW1sLWV4cGVydC0yMDIyLmh0bWw+DQoNCiAgW01hc3RlcmluZyBPcGFtXQ0KICA8aHR0cHM6Ly90 cmFpbmluZy5vY2FtbHByby5jb20vZW4vZm9ybWF0aW9uLW1hc3RlcmluZy1vcGFtLTIwMjIuaHRt bD4NCg0KICBbT0NhbWwgQ29kZSBPcHRpbWl6YXRpb25dDQogIDxodHRwczovL3RyYWluaW5nLm9j YW1scHJvLmNvbS9lbi9mb3JtYXRpb24tb2NhbWwtb3B0aW1pc2F0aW9uLTIwMjIuaHRtbD4NCg0K DQril4ogT3BhbSwgTWFpbnRlbmFuY2UgYW5kIEV2b2x1dGlvbg0KDQogIFNpbmNlIHdlIGNyZWF0 ZWQgT3BhbSBpbiAyMDEyLCB3ZSBoYXZlIGFsd2F5cyBoYWQgYXQgbGVhc3Qgb25lIGZ1bGwNCiAg dGltZSBlbmdpbmVlciBpbiB0aGUgT3BhbSB0ZWFtLCB0byBtYWludGFpbiBpdCwgYWRkIG5ldyBm ZWF0dXJlcyBhbmQNCiAgcmV2aWV3IGNvbnRyaWJ1dGlvbnMgYnkgb3RoZXIgbWVtYmVycy4gVGhp cyB3YXMgbWFkZSBwb3NzaWJsZSB0aGFua3MNCiAgdG8gYSBwYXJ0bmVyc2hpcCB3aXRoIEphbmUg U3RyZWV0LCBhbmQsIHNpbmNlIDIwMjQsIHRvIGEgcGFydG5lcnNoaXANCiAgd2l0aCBUYXJpZGVz Lg0KDQogIEluIDIwMjQsIG9wYW0gaGFkIHR3byBtYWpvciByZWxlYXNlcywgW29wYW0gMi4zLjAg cmVsZWFzZSFdIGFuZCBbb3BhbQ0KICAyLjIuMCByZWxlYXNlIV0gLiBUaGUgbW9zdCBncm91bmQt YnJlYWtpbmcgY2hhbmdlIGlzIHRoZSAqb2ZmaWNpYWwNCiAgbmF0aXZlIHN1cHBvcnQgZm9yIFdp bmRvd3MqLCB3aXRoIGFjY2VzcyB0byBlaXRoZXIgbWluZ3ctdzY0IGdjYw0KICBjb21waWxlcnMg b3IgVmlzdWFsIFN0dWRpbyBNU1ZDIGNvbXBpbGVycyB3aXRoIGF1dG9tYXRpYw0KICBkZXRlY3Rp b24uIFRoaXMgbmF0aXZlIHN1cHBvcnQgaXMgdHJlbWVuZG91cyBuZXdzIGZvciBPQ2FtbCBhZG9w dGlvbg0KICBpbiBnZW5lcmFsLCBhbmQgaXQgd2FzIGJ1aWx0IHRoYW5rcyB0byBhIGxvdCBvZiB3 b3JrIGZyb20gYWxsIHRoZQ0KICBjb21tdW5pdHksIGVzcGVjaWFsbHkgb24gdGhlIG9wYW0tcmVw b3NpdG9yeSBhbmQgcGFja2FnZXMuIEFuDQogIGludGVyZXN0aW5nIG5leHQgc3RlcCB0byBjb25z aWRlciBmb3IgT0NhbWwgb24gV2luZG93cyB3b3VsZCBiZSB0bw0KICBoYXZlIGEgc2luZ2xlIE9D YW1sIHRvb2xjaGFpbiBmb3IgYWxsIFdpbmRvd3MgY29tcGlsZXJzLCB1c2luZyBhbg0KICBpbnRl Z3JhdGVkIGFzc2VtYmxlciBmb3IgeDg2L3g2NCB3aXRoIGVsZi9jb2ZmIHN1cHBvcnQsIHNvbWV0 aGluZyB0aGF0DQogIHdlIGhhZCBpbXBsZW1lbnRlZCBhbmQgdGVzdGVkIGluIE9jcFdpbiBhIGxv bmcgdGltZSBhZ28uDQoNCiAgQW1vbmcgbWFueSBmaXhlcyBhbmQgdXBkYXRlcywgdGhlcmUgaXMg dGhlIGFkZGl0aW9uIG9mIG9wYW0gdHJlZQ0KICA8cGFja2FnZT4gdG8gZ2V0IGEgbmljZSBkaXNw bGF5IG9mIHRoZSBkZXBlbmRlbmNpZXMgb2YgYW4gaW5zdGFsbGVkDQogIHBhY2thZ2UsIGBvcGFt IHBpbiDigJNyZWN1cnNpdmUnIHRvIGxvb2sgZGVlcGVyIGludG8gc3ViLWRpcmVjdG9yaWVzDQog IHdoZW4gc2VhcmNoaW5nIGZvciBvcGFtIGZpbGVzIGFuZCBtYW55IG1vcmUgc21hbGwgaW1wcm92 ZW1lbnRzLiBDaGVjaw0KICB0aGUgYmxvZyBwb3N0cyBmb3IgbW9yZSBkZXRhaWxzICENCg0KDQog IFtvcGFtIDIuMy4wIHJlbGVhc2UhXQ0KICA8aHR0cHM6Ly9vY2FtbHByby5jb20vZnIvYmxvZy8y MDI0XzExXzEzX29wYW1fMl8zXzBfcmVsZWFzZXM+DQoNCiAgW29wYW0gMi4yLjAgcmVsZWFzZSFd DQogIDxodHRwczovL29jYW1scHJvLmNvbS9mci9ibG9nLzIwMjRfMDdfMDFfb3BhbV8yXzJfMF9y ZWxlYXNlcz4NCg0KDQril4ogV29yayBvbiB0aGUgT0NhbWwgQ29tcGlsZXINCg0KICBXZSBoYXZl IGhhZCBhIGxvbmcgcGFydG5lcnNoaXAgd2l0aCBKYW5lIFN0cmVldCB0byBpbXByb3ZlIHRoZQ0K ICBwZXJmb3JtYW5jZSBvZiB0aGUgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIE9DYW1sIGNvbXBpbGVy LiBUaGUgZmlyc3QNCiAgb3V0Y29tZSBvZiB0aGlzIHdvcmsgd2FzIHRoZSBGbGFtYmRhIGJhY2tl bmQsIHdoaWNoIHdhcyBtZXJnZWQgaW50bw0KICBPQ2FtbCA0LjAzIGluIDIwMTYuIFNpbmNlIHRo ZW4sIHdlIGhhdmUgc3RhcnRlZCBhIG5ldyBiYWNrZW5kLA0KICBbRmxhbWJkYTJdICwgdGhhdCBp cyBpbmNsdWRlZCBpbiB0aGUgSmFuZSBTdHJlZXQgT0NhbWwgY29tcGlsZXIuDQoNCiAgSW4gMjAy NCwgb3VyIHRlYW0gZm9jdXNlZCBpdHMgZWZmb3J0cyBvbiBzZXZlcmFsIG5ldyBvcHRpbWl6YXRp b25zLA0KICBsaWtlIG1hdGNoIGluIG1hdGNoIChzaW1wbGlmeSBwYXR0ZXJuLW1hdGNoaW5nIGFw cGVhcmluZyBpbiBhbm90aGVyDQogIHBhdHRlcm4tbWF0Y2hpbmcgYWZ0ZXIgaW5saW5pbmcpLCB1 bmJveCBmcmVlIHZhcnMgb2YgY2xvc3VyZXMNCiAgKHNob3J0Y3V0IGNoYWlucyBvZiBwb2ludGVy cyBzdG9yZWQgaW4gY2xvc3VyZXMpIG9yIHRoZSByZWFwZXIgKGRvIG5vdA0KICBhbGxvY2F0ZSB1 bnVzZWQgZmllbGRzIG9mIGJsb2NrcykuIFN1Y2ggb3B0aW1pemF0aW9ucyBhcmUgb2Z0ZW4gbXVj aA0KICBtb3JlIGNvbXBsZXggdGhhbiB5b3Ugd291bGQgdGhpbmssIGFzIGd1YXJhbnRlZWluZyB0 aGF0IHRoZXkgY2FuIGJlDQogIGFwcGxpZWQgc2FmZWx5IGlzIG5vdCBvYnZpb3VzLCByZXF1aXJp bmcgZXNjYXBlIGFuYWx5c2lzIGFuZCBvdGhlcg0KICBjaGVja3MuIFdlIHdlcmUgYWxzbyB2ZXJ5 IGFjdGl2ZSBhdCBoZWxwaW5nIHRoZSBjb21waWxlciB0ZWFtIGF0IEphbmUNCiAgU3RyZWV0IGJ5 IHJldmlld2luZyB0aGVpciBjb2RlIGFuZCBhZGFwdGluZyBvdXIgYmFja2VuZCB0byB0aGVpcg0K ICBuZWVkcy4gSWYgeW91IGFyZSBpbnRlcmVzdGVkIGluIHRoaXMgc3ViamVjdCwgcmVhZCBvdXIg YmxvZyBzZXJpZXMgb24NCiAgdGhlIHRvcGljIHRoYXQgd2FzIG1lbnRpb25lZCBlYXJsaWVyLg0K DQogIEluIDIwMjQsIHdlIGFsc28gaGFkIGFuIGludGVybiB3b3JraW5nIG9uICptb2R1bGFyIGV4 cGxpY2l0cyosIGFuDQogIGV4dGVuc2lvbiBvZiBPQ2FtbCBmaXJzdC1jbGFzcyBtb2R1bGVzIHdp dGggbW9kdWxlLWRlcGVuZGVudA0KICBmdW5jdGlvbnMsIGZ1bmN0aW9ucyB0YWtpbmcgZmlyc3Qt Y2xhc3MgbW9kdWxlcyBhcyBhcmd1bWVudHMuIFRoaXMNCiAgd29yayBjYW4gYmUgc2VlbiBhcyBh IGZpcnN0IHN0ZXAgdG93YXJkcyBtb2R1bGFyIGltcGxpY2l0cywgYW5kIHdhcw0KICBwcmVzZW50 ZWQgW2F0IHRoZSBPQ2FtbCB3b3Jrc2hvcF0gd2l0aCBEaWRpZXIgUsOpbXkuIFRoZSBbbWFpbg0K ICBwdWxsLXJlcXVlc3RdIGlzIHN0aWxsIHVuZGVyIHJldmlldywgd2hpbGUgb3RoZXIgc21hbGxl ciBvbmVzIGhhdmUNCiAgYWxyZWFkeSBiZWVuIG1lcmdlZCwgbGVhZGluZyB0byBpbnRlcmVzdGlu ZyBleHRlbnNpb25zIGluc2lkZSB0aGUNCiAgY29tcGlsZXIgc3VjaCBhcyBuZXcgZm9ybXMgb2Yg ZGVwZW5kZW50IHR5cGVzLg0KDQoNCiAgW0ZsYW1iZGEyXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLWZsYW1iZGEvZmxhbWJkYS1iYWNrZW5kPg0KDQogIFthdCB0aGUgT0NhbWwgd29ya3Nob3Bd DQogIDxodHRwczovL2ljZnAyNC5zaWdwbGFuLm9yZy9kZXRhaWxzL29jYW1sLTIwMjQtcGFwZXJz LzEvT24tdGhlLWRlc2lnbi1hbmQtaW1wbGVtZW50YXRpb24tb2YtTW9kdWxhci1FeHBsaWNpdHM+ DQoNCiAgW21haW4gcHVsbC1yZXF1ZXN0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s L3B1bGwvMTMyNzU+DQoNCg0K4peKIE9wdGltaXppbmcgR2VuZXdlYiwgYSBXZWJzZXJ2ZXIgZm9y IEdlbmVhbG9neQ0KDQogIExhc3QgeWVhciwgd2UgYWxzbyBzdGFydGVkIHdvcmtpbmcgb24gW0dl bmV3ZWJdLCBhIHdlYnNlcnZlciBpbiBPQ2FtbA0KICB0aGF0IGlzIHVzZWQgdG8gc3RvcmUgZmFt aWx5IHRyZWVzIGJ5IGdlbmVhbG9naXN0cy4gR2VuZXdlYiBpcyBhIHZlcnkNCiAgb2xkIHBpZWNl IG9mIE9DYW1sLCBpbml0aWFsbHkgd3JpdHRlbiBhcm91bmQgMTk5NiBieSBEYW5pZWwgRGUNCiAg UmF1Z2xhdWRyZSBhdCBJbnJpYS4gSXQgaXMgdXNlZCBib3RoIGJ5IFtHZW5lYW5ldF0gLCBhIGdl bmVhbG9neQ0KICBjb21wYW55IHJlY2VudGx5IGFjcXVpcmVkIGJ5IEFuY2VzdHJ5LCBhbmQgdGhl IFtSb2dsbyBhc3NvY2lhdGlvbl0sIGENCiAgRnJlbmNoIGFzc29jaWF0aW9uIHRoYXQgYWRtaW5p c3RyYXRlcyBhIHNpbmdsZSBmYW1pbHkgdHJlZSBvZiBtb3JlDQogIHRoYW4gMTAgbWlsbGlvbiBw ZXJzb25zLiBPbmUgb2YgdGhlIGlzc3VlcyBmYWNlZCBieSB0aGUgUm9nbG8NCiAgYXNzb2NpYXRp b24gd2FzIHRoYXQgdGhlaXIgYnJhbmNoIG9mIHRoZSBzb2Z0d2FyZSBoYWQgZGl2ZXJnZWQgZnJv bQ0KICB0aGUgb2ZmaWNpYWwgb25lIG1haW50YWluZWQgYnkgR2VuZWFuZXQsIGFzIFJvZ2xvIGhh ZCB0byB1c2Ugc3BlY2lmaWMNCiAgZmVhdHVyZXMgb24gdGhlaXIgYnJhbmNoIHRvIGNvcGUgd2l0 aCB0aGUgaHVnZSBzaXplIG9mIHRoZWlyIHVuaXF1ZQ0KICBmYW1pbHkgdHJlZS4gV2UgaGVscGVk IHRoZW0gYnkgb3B0aW1pemluZyB0aGUgb2ZmaWNpYWwgYnJhbmNoLCBzbyB0aGF0DQogIGl0IGNv dWxkIGhvc3QgdGhlIHRyZWUgd2hpbGUgcHJvdmlkaW5nIHRoZSBzYW1lIGxhdGVuY2llcyBmb3Ig cmVxdWVzdHMNCiAgYXMgYmVmb3JlLiBJdCByZXF1aXJlZCBvcHRpbWl6aW5nIHRoZSByZXByZXNl bnRhdGlvbiBvZiBzdG9yZWQgZGF0YQ0KICAoYm90aCBpbiBPQ2FtbCBhbmQgb24gZGlzayksIGhv dyBpdCB3YXMgYWNjZXNzZWQgdGhyb3VnaCBzeXN0ZW0gY2FsbHMsDQogIGFuZCBhIGdvb2QgdW5k ZXJzdGFuZGluZyBvZiB0aGUgY29tcGxleCBhbGdvcml0aG1zIHVzZWQgYnkgR2VuZXdlYiwNCiAg dHlwaWNhbGx5IHRvIHRyYXZlcnNlIGZhbWlseSBtZW1iZXJzIHVzaW5nIHZhcmlvdXMgcmVsYXRp b25zaGlwcy4NCg0KDQogIFtHZW5ld2ViXSA8aHR0cHM6Ly9naXRodWIuY29tL2dlbmV3ZWIvZ2Vu ZXdlYj4NCg0KICBbR2VuZWFuZXRdIDxodHRwczovL2VuLmdlbmVhbmV0Lm9yZy9sZWdhbC9nZW5l YW5ldC8+DQoNCiAgW1JvZ2xvIGFzc29jaWF0aW9uXSA8aHR0cHM6Ly9hc3NvLnJvZ2xvLmV1L3Bh Z2UvMzUwNzk1LWFjY3VlaWw+DQoNCg0KQ29udHJpYnV0aW9ucyB0byBvdGhlciBsYW5ndWFnZXMN CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogQ29tcGlsaW5n IHRvIFdhc20gYW5kIFdhc20gU3ltYm9saWMgRXhlY3V0aW9uDQoNCiAgU2luY2UgMjAyMSwgT0Nh bWxQcm8gaGFzIGFjdGl2ZWx5IGNvbnRyaWJ1dGVkIHRvIHRoZSBXM0MncyBlZmZvcnRzIG9uDQog IGJyaW5naW5nIGEgZGVkaWNhdGVkIEdhcmJhZ2UgQ29sbGVjdG9yIHRvIFdlYkFzc2VtYmx5IC0g YW4gZXNzZW50aWFsDQogIGZlYXR1cmUgdGhhdCBoYXMgbm93IGJlY29tZSByZWFsaXR5IHdpdGgg dGhlIGluY3JlYXNlZCB1c2Ugb2YgV2FzbQ0KICAoU2VlIFtIb3cgUHJpbWUgVmlkZW8gdXBkYXRl cyBpdHMgYXBwIGZvciBtb3JlIHRoYW4gOCwwMDAgZGV2aWNlDQogIHR5cGVzXSBvciBbSW50cm9k dWNpbmcgdGhlIERpc25leSsgQXBwbGljYXRpb24gRGV2ZWxvcG1lbnQgS2l0IChBREspXQ0KICAp Lg0KDQogIE91ciB3b3JrIGVuc3VyZWQgdGhlIG9mZmljaWFsIFtXYXNtR0MgcHJvcG9zYWxdIHJl bWFpbmVkIGZ1bGx5DQogIGNvbXBhdGlibGUgd2l0aCB0aGUgbmVlZHMgb2YgT0NhbWwuICBDcnVj aWFsIHRvIHRoaXMgc3VjY2VzcyB3YXMNCiAgW1dhc29jYW1sXSwgb3VyIEZsYW1iZGEtYmFzZWQg YmFja2VuZCB0YXJnZXRpbmcgV2ViQXNzZW1ibHksIHdoaWNoDQogIGhlbHBlZCBkcml2ZSB0aGUg cHJvcG9zYWwncyByZWxlYXNlIGFuZCBzdWJzZXF1ZW50IGltcGxlbWVudGF0aW9uIGluDQogIDIw MjMgYWNyb3NzIGFsbCBtYWpvciBicm93c2Vycy4NCg0KICBPbmUgb2Ygb3VyIGJpZ2dlc3QgY29u dHJpYnV0b3JzIHRvIHRoaXMgd29yaywgTMOpbyBBbmRyw6hzIFtkZWZlbmRlZCBoaXMNCiAgUGhE IGF0IHRoZSBlbmQgb2YgMjAyNF0uIFRoZSB0b3BpYyB3YXMgYWJvdXQgY29tcGlsaW5nIE9DYW1s IHRvIFdhc20NCiAgYnV0IGFsc28gYWJvdXQgYW5vdGhlciBbdG9vbCBuYW1lZCBPd2ldLCBkZXZl bG9wZWQgaW4gY2xvc2UNCiAgY29sbGFib3JhdGlvbiB3aXRoIHRoZSBVbml2ZXJzaXR5IG9mIExp c2JvYS4gT3JpZ2luYWxseSBkZXZlbG9wZWQgYXMgYQ0KICAiV2FzbSBTd2lzc2tuaWZlIiwgT3dp IGhhcyBldm9sdmVkIGludG8gYSBtdWx0aS1jb3JlLCBtdWx0aS1zb2x2ZXIsDQogIGNyb3NzLWxh bmd1YWdlIHN5bWJvbGljIGVuZ2luZS4gSXRzIGNhcGFiaWxpdGllcyBpbmNsdWRlOg0KICDigKIg YXV0b21hdGVkLCBzb3VuZCwgYW5kIHBhcnRpYWxseS1jb3JyZWN0IGJ1Zy1maW5kaW5nIChhbW91 bnRpbmcgdG8gYQ0KICAgIHByb29mKTsNCiAg4oCiIHNvbHZlci1haWRlZCBwcm9ncmFtbWluZyAo dGhpbmsgb2YgUm9zZXR0ZSBmb3IgUm9ja2V0LCBidXQgZm9yIGFueQ0KICAgIGxhbmd1YWdlKTsN CiAg4oCiIGVmZmljaWVudCB0ZXN0LWNhc2UgZ2VuZXJhdGlvbi4NCg0KICBMb29raW5nIGFoZWFk LCB3ZSBhcmUgZXhjaXRlZCB0byBjb21iaW5lIFdhc29jYW1sIGFuZCBPd2ksIGFpbWluZyB0bw0K ICAqcGVyZm9ybSBzeW1ib2xpYyBleGVjdXRpb24gb2YgT0NhbWwqIHByb2dyYW1zLCBhbmQgZXZl biB0aG9zZSB3aXRoDQogIHN1YnN0YW50aWFsIEMgY29tcG9uZW50cyEgV2UndmUgYWxyZWFkeSBh cHBsaWVkIHRoZXNlIHRlY2huaXF1ZXMNCiAgc3VjY2Vzc2Z1bGx5IHRvIFJ1c3QsIHVuY292ZXJp bmcgYSBzdWJ0bGUgYnVnIGluIHRoZSBbUnVzdCBzdGFuZGFyZA0KICBsaWJyYXJ5XS4gSWYgeW91 IHdhbnQgdG8ga25vdyBtb3JlIGFib3V0IGl0LCBoYXZlIGEgbG9vayBhdCBvdXINCiAgW2pvdXJu YWwgYXJ0aWNsZV0uDQoNCiAgU29tZSBvZiB0aGlzIHdvcmsgd2FzIGZ1bmRlZCBieSBOR0kvTkxu ZXQuDQoNCg0KICBbSG93IFByaW1lIFZpZGVvIHVwZGF0ZXMgaXRzIGFwcCBmb3IgbW9yZSB0aGFu IDgsMDAwIGRldmljZSB0eXBlc10NCiAgPGh0dHBzOi8vd3d3LmFtYXpvbi5zY2llbmNlL2Jsb2cv aG93LXByaW1lLXZpZGVvLXVwZGF0ZXMtaXRzLWFwcC1mb3ItbW9yZS10aGFuLTgtMDAwLWRldmlj ZS10eXBlcz4NCg0KICBbSW50cm9kdWNpbmcgdGhlIERpc25leSsgQXBwbGljYXRpb24gRGV2ZWxv cG1lbnQgS2l0IChBREspXQ0KICA8aHR0cHM6Ly9tZWRpdW0uY29tL2Rpc25leS1zdHJlYW1pbmcv aW50cm9kdWNpbmctdGhlLWRpc25leS1hcHBsaWNhdGlvbi1kZXZlbG9wbWVudC1raXQtYWRrLWFk ODVjYTEzOTA3Mz4NCg0KICBbV2FzbUdDIHByb3Bvc2FsXSA8aHR0cHM6Ly9naXRodWIuY29tL1dl YkFzc2VtYmx5L2djPg0KDQogIFtXYXNvY2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFBy by93YXNvY2FtbD4NCg0KICBbZGVmZW5kZWQgaGlzIFBoRCBhdCB0aGUgZW5kIG9mIDIwMjRdIDxo dHRwczovL3RoZXNlcy5mci9zMzQwNjE1Pg0KDQogIFt0b29sIG5hbWVkIE93aV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9PQ2FtbFByby9vd2k+DQoNCiAgW1J1c3Qgc3RhbmRhcmQgbGlicmFyeV0NCiAg PGh0dHBzOi8vZ2l0aHViLmNvbS9ydXN0LWxhbmcvcnVzdC9wdWxsLzEyOTMyMT4NCg0KICBbam91 cm5hbCBhcnRpY2xlXSA8aHR0cHM6Ly9hcnhpdi5vcmcvcGRmLzI0MTIuMDYzOTE+DQoNCg0K4peK IEZyb20gTmlhZ2FyYSB0byBLb3BlaywgYSBmb290IGluIHRoZSBDaW5lbWEgaW5kdXN0cnkNCg0K ICAyMDI0IHdhcyBhbHNvIGEgbmV3IGFkdmVudHVyZSBpbiBlbnRyZXByZW5ldXJzaGlwIGZvciBP Q2FtbFByby4gSW4NCiAgMjAyMywgd2UgW3dvbiBhIGdyYW50XSBmcm9tIHRoZSBDTkMsIHRoZSBG cmVuY2ggQ2VudGVyIGZvciB0aGUgQ2luZW1hDQogIGluZHVzdHJ5LCB0byB3b3JrIHdpdGggQW50 b2luZSBEZXZ1bGRlciBhbmQgRGVuaXMgTcOpcmlnb3V4IG9uIHRoZQ0KICBkZXNpZ24gb2YgYSAq RFNMIGZvciBtb3ZpZSBwcm9kdWNlcnMqLiBJbmRlZWQsIGRpc3RyaWJ1dGluZyBlYXJuaW5ncw0K ICBpcyBvbmUgb2YgdGhlIG1vc3QgY29tcGxleCB0YXNrcyB0aGF0IGEgcHJvZHVjZXIgbXVzdCBk byBhZnRlciBhIG1vdmllDQogIGlzIHJlbGVhc2VkLCBtb3N0bHkgYmVjYXVzZSBvZiB0aGUgY29t cGxleGl0eSBvZiBjb250cmFjdHMuIFNvIHdlDQogIGRlc2lnbmVkIGEgRFNMLCBpbml0aWFsbHkg Y2FsbGVkIE5pYWdhcmEsIHRoYXQgaXMgY2xvc2UgZW5vdWdoIHRvDQogIGNvbnRyYWN0cyB0byBi ZSBzaW1wbGUgdG8gd3JpdGUsIGFuZCBhdXRvbWF0aWNhbGx5IGNvbXB1dGVzIHRoZSBleGFjdA0K ICBkaXN0cmlidXRpb24gb2YgZWFybmluZ3MgZHVyaW5nIHRoZSBlbnRpcmUgbGlmZSBvZiB0aGUg bW92aWUuDQoNCiAgSW4gMjAyNCwgd2UgZGVjaWRlZCB0byBjcmVhdGUgdGhlIFtLb3BlayBjb21w YW55XSB3aXRoIEFudG9pbmUgYW5kDQogIERlbmlzLCB0byBjb21tZXJjaWFsaXplIHRoaXMgcHJv ZHVjdC4gVGhlIERTTCBpdHNlbGYgaXMgaGlkZGVuIGJlaGluZA0KICBhIG5vLWNvZGUgaW50ZXJm YWNlIHRoYXQgbWFrZXMgYWxsIGludGVyYWN0aW9ucyB3aXRoIHRoZSBzb2Z0d2FyZSBlYXN5DQog IGFuZCBpbnR1aXRpdmUgZm9yIHByb2R1Y2VycywgYW5kIHRoZSB0b29sIGNhbiBkZWFsIHdpdGgg Y29tcGxleA0KICBjb250cmFjdHMgdGhhdCBubyBvdGhlciBzb2Z0d2FyZSBvbiB0aGUgbWFya2V0 IGNhbiBkZWFsIHdpdGguIEZvcg0KICBGcmVuY2ggc3BlYWtlcnMsIHRoZSB0b29sIHdhcyByZWNl bnRseSBbcHJlc2VudGVkIGF0IGEgQ05DIGV2ZW50XSAuDQoNCg0KICBbd29uIGEgZ3JhbnRdDQog IDxodHRwczovL3d3dy5jbmMuZnIvcHJvZmVzc2lvbm5lbHMvYWN0dWFsaXRlcy9yZXN1bHRhdHMt ZGUtbGFwcGVsLWEtcHJvamV0cy0tLXRyYW5zcGFyZW5jZS1kZS1sYS1yZW1vbnRlZS1kZS1yZWNl dHRlcy1kYW5zLWxlLXNlY3RldXItY2luZW1hLWV0LWF1ZGlvdmlzdWVsXzE5MzExODI+DQoNCiAg W0tvcGVrIGNvbXBhbnldIDxodHRwczovL2tvcGVrLmZyPg0KDQogIFtwcmVzZW50ZWQgYXQgYSBD TkMgZXZlbnRdDQogIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PTZRM1k3U05URG1n Pg0KDQoNCuKXiiBTdXBlckJPTCwgYSBwb3dlcmZ1bCBMU1AgZm9yIENPQk9MIGFuZCBWaXN1YWwg U3R1ZGlvIENvZGUNCg0KICBGb3IgYSBmZXcgeWVhcnMgbm93LCBPQ2FtbFBybyBoYXMgYmVlbiBb aW52b2x2ZWQgaW4gdGhlIENPQk9MDQogIGVjb3N5c3RlbV0sIG1vc3RseSB0byBoZWxwIHRoZSBG cmVuY2ggdGF4IGFkbWluaXN0cmF0aW9uIHRvIGRlYWwgd2l0aA0KICB0aGUgbWlncmF0aW9uIG9m IENPQk9MIGNvZGUgZnJvbSBsZWdhY3kgc3lzdGVtcyAoR0NPUyBtYWluZnJhbWVzIGZyb20NCiAg dGhlIDgwcykgdG8gQ2xvdWQtYmFzZWQgcGxhdGZvcm1zLiBNb3N0IG9mIG91ciB3b3JrIHdhcyB0 byBleHRlbmQgdGhlDQogIFtmcmVlIG9wZW4tc291cmNlIEdudUNPQk9MIGNvbXBpbGVyXSBmb3Ig dGhlIG5lZWRzIG9mIHRoZQ0KICBhcHBsaWNhdGlvbi4gTW9yZW92ZXIsIHdlIHNwZW50IHNvbWUg dGltZSBjcmVhdGluZyBhbiAqT0NhbWwgZnJhbWV3b3JrDQogIGZvciBDT0JPTCogdG8gYmV0dGVy IHVuZGVyc3RhbmQgdGhpcyBwcm9ncmFtbWluZyBsYW5ndWFnZS4gV2UgcmVsZWFzZWQNCiAgYSBs YXJnZSBwYXJ0IG9mIHRoaXMgd29yayBhcyBhbiBvcGVuLXNvdXJjZSBleHRlbnNpb24gZm9yIFZp c3VhbA0KICBTdHVkaW8gQ29kZSBjYWxsZWQgW1N1cGVyQk9MIFN0dWRpbyBPU1NdLiBCYWNrZWQg Ynkgb3VyIHBvd2VyZnVsIExTUA0KICBzZXJ2ZXIsIHRoaXMgZXh0ZW5zaW9uIGVtcG93ZXJzIGl0 cyB1c2VycyB3aXRoIGFsbCB0aGUgZmVhdHVyZXMgdGhhdA0KICBkZXZlbG9wZXJzIGV4cGVjdCBm cm9tIGEgbW9kZXJuIGVkaXRvciBmb3IgZWRpdGluZyBhbmQgbmF2aWdhdGluZw0KICBDT0JPTCBj b2RlLg0KDQogIEluIDIwMjQsIHdlIGltcHJvdmVkIHRoZSBwYXJzZXIgdG8gc3VwcG9ydCBhIGxh cmdlciBwYXJ0IG9mIHRoZSBDT0JPTA0KICBsYW5ndWFnZSwgd2UgYWRkZWQgYSBwb3dlcmZ1bCBp bmRlbnRvciBvZiBjb2RlLCBwb3dlcmZ1bCBjb2RlDQogIGNvbXBsZXRpb24gZmVhdHVyZXMgZGVy aXZlZCBkaXJlY3RseSBmcm9tIHRoZSBDT0JPTCBncmFtbWFyICh1c2luZyB0aGUNCiAgcmVjZW50 bHkgYWRkZWQgZmVhdHVyZXMgaW4gTWVuaGlyKSwgYXMgd2VsbCBhcyB2YXJpb3VzIHdheXMgdG8g ZGlzcGxheQ0KICB0aGUgY29udHJvbC1mbG93IGdyYXBoIG9mIHByb2dyYW1zIDsgdGhlIGxhdHRl ciBiZWluZyBwYXJ0aWN1bGFybHkNCiAgdXNlZnVsIHdoZW4geW91ciBqb2IgaXMgdG8gbmF2aWdh dGUgYW5kIG1vZGlmeSBjb2RlIHdyaXR0ZW4gbWFueQ0KICBkZWNhZGVzIGFnby4gV2UgYnVpbHQg YW4gZW50aXJlIENJL0NEIHN5c3RlbSBmb3IgU3VwZXJCT0wgdGhhdA0KICBhdXRvbWF0aWNhbGx5 IHJlbGVhc2VzIGNyb3NzLWNvbXBpbGVkLCBzdGF0aWNhbGx5IGxpbmtlZCBiaW5hcmllcyBmb3IN CiAgTGludXgsIFdpbmRvd3MgYW5kIE1hY09TLg0KDQoNCiAgW2ludm9sdmVkIGluIHRoZSBDT0JP TCBlY29zeXN0ZW1dIDxodHRwczovL3N1cGVyYm9sLmV1Pg0KDQogIFtmcmVlIG9wZW4tc291cmNl IEdudUNPQk9MIGNvbXBpbGVyXQ0KICA8aHR0cHM6Ly9nbnVjb2JvbC5zb3VyY2Vmb3JnZS5pby8+ DQoNCiAgW1N1cGVyQk9MIFN0dWRpbyBPU1NdDQogIDxodHRwczovL2dpdGh1Yi5jb20vT0NhbWxQ cm8vc3VwZXJib2wtc3R1ZGlvLW9zcz4NCg0KDQril4ogTWxhbmcgdXNlZCBhdCB0aGUgREdGaVAN Cg0KICBXZSBoYXZlIGFsc28gYmVlbiBpbnZvbHZlZCBmb3Igc29tZSB0aW1lIG5vdyBpbiB0aGUg YWRhcHRhdGlvbiBvZiB0aGUNCiAgW01sYW5nIGNvbXBpbGVyXSB0byByZXBsYWNlIHRoZSBkZXBy ZWNhdGVkIHRvb2xpbmcgb2YgdGhlIERHRmlQDQogIChGcmVuY2ggUHVibGljIEZpbmFuY2VzIERp cmVjdG9yYXRlKSB0byBjb21wdXRlIHRoZSBGcmVuY2ggSW5jb21lIFRheC4NCg0KICAyMDI0IHdh cyBhbiBpbXBvcnRhbnQgbWlsZXN0b25lIGZvciB0aGUgcHJvamVjdCwgYXMgTWxhbmcgd2FzIHVz ZWQgZm9yDQogIHRoZSAqZmlyc3QgdGltZSBpbiBwcm9kdWN0aW9uKi4gSXQgbWVhbnMgdGhhdCB3 ZSB3ZXJlIGFibGUgdG8gY29tcHV0ZQ0KICB0aGUgZXhhY3Qgc2FtZSByZXN1bHRzLCB3aXRoIGNv bXBhcmFibGUgcGVyZm9ybWFuY2UuIE1vcmVvdmVyLCBhcyB0aGUNCiAgZm9ybWVyIGNvbXBpbGVy IHVzZWQgdG8gc3VmZmVyIGZyb20gb3ZlcmZsb3dzIHRoYXQgcmVxdWlyZSBtYW51YWwNCiAgaW5z cGVjdGlvbnMgYW5kIHJlLWV2YWx1YXRpb25zLCB0aGUgbmV3IGNvbXBpbGVyIGFscmVhZHkgcHJv dmlkZXMNCiAgYmVuZWZpdHMgZm9yIERHRmlQLiBXZSBhcmUgbm93IGludm9sdmVkIGluIGltcHJv dmluZyBNbGFuZyB0byBoYW5kbGUNCiAgbXVsdGkteWVhciBjb21wdXRhdGlvbnMsIHNvbWV0aGlu ZyB0aGF0IHVzZWQgdG8gYmUgcGVyZm9ybWVkIHVzaW5nDQogIGhhcmRseSBtYWludGFpbmFibGUg Ym9pbGVycGxhdGUgaW4gQywgYW5kIGluIGltcHJvdmluZyB0aGUgZ2VuZXJhbA0KICBlbnZpcm9u bWVudCBhcm91bmQgdGhlIGNvbXBpbGVyLCB3aXRoIENJL0NEIGFuZCBjb2RlLW5hdmlnYXRpb24g dG9vbHMuDQoNCg0KICBbTWxhbmcgY29tcGlsZXJdIDxodHRwczovL2dpdGh1Yi5jb20vTUxhbmd1 YWdlL21sYW5nPg0KDQoNCkZvcm1hbCBtZXRob2RzDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0K4peKIFRoZSBBbHQtRXJnbyBTTVQgU29sdmVyDQoNCiAgT0Nh bWxQcm8gaGFzIGJlZW4gZGV2ZWxvcGluZyB0aGUgW0FsdC1FcmdvIFNNVCBzb2x2ZXJdIHNpbmNl DQogIDIwMTEuIEFsdC1FcmdvIGlzIHVzdWFsbHkgdXNlZCBiZWhpbmQgY29kZSB2ZXJpZmljYXRp b24gZnJhbWV3b3Jrcw0KICBzdWNoIGFzIFtXaHkzXSAsIFtGcmFtYS1DXSAsIFtUSVMgQW5hbHl6 ZXJdIG9yIFtBZGFjb3JlIFNwYXJrXSAsIHdlDQogIG1haW50YWluIGEgY2xvc2UgcmVsYXRpb25z aGlwIHdpdGggaXRzIGluZHVzdHJpYWwgdXNlcnMgdGhyb3VnaCB0aGUNCiAgW0FsdC1FcmdvIFVz ZXJz4oCZIENsdWJdIHdobyBoYXZlIGFjY2VzcyB0byB0aGUgbW9zdCByZWNlbnQgZmVhdHVyZXMN CiAgYWhlYWQgb2YgdGltZS4gQ3VycmVudCBtZW1iZXJzIGFyZSBbQWRhY29yZV0gLCBbVHJ1c3Qg aW4gU29mdF0gLA0KICBbVGhhbGVzXSAsIFtNRVJDRV0gYW5kIFtDRUEgTGlzdF0gLg0KDQogIElu IDIwMjQsIHdlIHJlbGVhc2VkIGEgYnJhbmQgbmV3IHZlcnNpb24sIFtBbHQtRXJnbyAyLjZdIC4g VGhlDQogIGhpZ2hsaWdodHMgYXJlIGEgYmV0dGVyIHN1cHBvcnQgZm9yIGJpdC12ZWN0b3JzLCBt b2RlbCBnZW5lcmF0aW9uIGZvcg0KICBhbGdlYnJhaWMgZGF0YSB0eXBlcywgb3B0aW1pemF0aW9u IG9mIChtYXhpbWl6ZSkgYW5kIChtaW5pbWl6ZSksIEZQQQ0KICBzdXBwb3J0LCBhbmQgbWFueSBv dGhlciBmZWF0dXJlcyBhbmQgYnVnIGZpeGVzLiBQYXJ0IG9mIHRoaXMgd29yayB3YXMNCiAgYWxz byBmdW5kZWQgYnkgdGhlIFtEZWN5c2lmIGNvbGxhYm9yYXRpdmUgcHJvamVjdF0gd2hlcmUgd2Ug dHJ5IHRvDQogIGltcHJvdmUgQWx0LUVyZ28gZm9yIHVzZSB3aXRoIHRoZSBbQ3JldXNvdCBSdXN0 IFZlcmlmaWVyXSAuDQoNCg0KICBbQWx0LUVyZ28gU01UIHNvbHZlcl0gPGh0dHBzOi8vYWx0LWVy Z28ub2NhbWxwcm8uY29tLz4NCg0KICBbV2h5M10gPGh0dHBzOi8vd3d3LndoeTMub3JnLz4NCg0K ICBbRnJhbWEtQ10gPGh0dHBzOi8vZnJhbWEtYy5jb20vPg0KDQogIFtUSVMgQW5hbHl6ZXJdIDxo dHRwczovL3d3dy50cnVzdC1pbi1zb2Z0LmNvbS90cnVzdGluc29mdC1hbmFseXplcj4NCg0KICBb QWRhY29yZSBTcGFya10gPGh0dHBzOi8vd3d3LmFkYWNvcmUuY29tL2Fib3V0LXNwYXJrPg0KDQog IFtBbHQtRXJnbyBVc2Vyc+KAmSBDbHViXSA8aHR0cHM6Ly9hbHQtZXJnby5vY2FtbHByby5jb20v I2NsdWI+DQoNCiAgW0FkYWNvcmVdIDxodHRwczovL3d3dy5hZGFjb3JlLmNvbS8+DQoNCiAgW1Ry dXN0IGluIFNvZnRdIDxodHRwczovL3d3dy50cnVzdC1pbi1zb2Z0LmNvbS8+DQoNCiAgW1RoYWxl c10NCiAgPGh0dHBzOi8vd3d3LnRoYWxlc2dyb3VwLmNvbS9mci9nbG9iYWwvaW5ub3ZhdGlvbi9y ZWNoZXJjaGUtdGVjaG5vbG9naWU+DQoNCiAgW01FUkNFXSA8aHR0cHM6Ly93d3cubWl0c3ViaXNo aWVsZWN0cmljLXJjZS5ldS8+DQoNCiAgW0NFQSBMaXN0XSA8aHR0cHM6Ly9saXN0LmNlYS5mci9m ci8+DQoNCiAgW0FsdC1FcmdvIDIuNl0NCiAgPGh0dHBzOi8vb2NhbWxwcm8uY29tL2Jsb2cvMjAy NF8wOV8wMV9hbHRfZXJnb18yXzZfMF9yZWxlYXNlZC8+DQoNCiAgW0RlY3lzaWYgY29sbGFib3Jh dGl2ZSBwcm9qZWN0XSA8aHR0cHM6Ly9kZWN5c2lmLmZyL2ZyLz4NCg0KICBbQ3JldXNvdCBSdXN0 IFZlcmlmaWVyXSA8aHR0cHM6Ly9naXRodWIuY29tL2NyZXVzb3QtcnMvY3JldXNvdD4NCg0KDQri l4ogRUFMNisgQ2VydGlmaWNhdGlvbg0KDQogIEluIDIwMjQsIHdlIGhhdmUgYWdhaW4gYmVlbiBp bnZvbHZlZCBpbiBhIGhpZ2ggbGV2ZWwgc29mdHdhcmUNCiAgY2VydGlmaWNhdGlvbiBwcm9jZXNz IChbQ29tbW9uIENyaXRlcmlhIEVBTDYrXSApIHdoZXJlIHdlIHN1Y2Nlc3NmdWxseQ0KICBwcm92 ZWQgb3VyIGNhcGFjaXR5IHRvIGZvcm1hbGl6ZSBzZWN1cml0eSBwb2xpY2llcyBvbiBsb3cgbGV2 ZWwgY29kZQ0KICBmb3IgdmVyeSBpbXBvcnRhbnQgY3VzdG9tZXJzLCB1c2luZyB0aGUgQ29xIHBy b29mIGFzc2lzdGFudC4NCg0KDQogIFtDb21tb24gQ3JpdGVyaWEgRUFMNitdIDxodHRwczovL2Nv bW1vbmNyaXRlcmlhcG9ydGFsLm9yZy9pbmRleC5jZm0+DQoNCg0K4peKIFRhbWluZyBUZXN0IEdl bmVyYXRvcnMgZm9yIEMgd2l0aCBTZWFDb3JhbA0KDQogIFdyaXRpbmcgdW5pdCB0ZXN0cyBpcyBh IHZlcnkgZ29vZCBwcmFjdGljZSwgcGFydGljdWxhcmx5IHdoZW4gdXNpbmcgYQ0KICB3ZWFrbHkt dHlwZWQgbGFuZ3VhZ2UgbGlrZSBDLiBZZXQsIGl0IGlzIGFsc28gYSBjdW1iZXJzb21lIHRhc2ss DQogIGVzcGVjaWFsbHkgd2hlbiB0aGUgZ29hbCBpcyB0byByZWFjaCAxMDAlIGNvdmVyYWdlIG9m IHRoZQ0KICBjb2RlLiBGb3J0dW5hdGVseSwgcGFydCBvZiB0aGlzIHRhc2sgY2FuIGJlIGF1dG9t YXRlZCBieSB0ZXN0DQogIGdlbmVyYXRpb24gdG9vbHMsIGJhc2VkIG9uIGZ1enppbmcsIHN5bWJv bGljIGV4ZWN1dGlvbiwgYW5kIG90aGVyIGNvZGUNCiAgYW5hbHlzaXMgdGVjaG5pcXVlcy4gRWFj aCBvZiB0aGVzZSB0ZWNobmlxdWVzIGhhcyBpdHMgb3duIHN0cmVuZ3Rocw0KICBhbmQgd2Vha25l c3NlcyAoaW4gdGVybXMgb2YgcGVyZm9ybWFuY2UsIG51bWJlciBvZiBnZW5lcmF0ZWQgdGVzdHMs IG9yDQogIHRhcmdldGVkIGNvdmVyYWdlIGNyaXRlcmlhKSwgc28gbXVjaCBzbyB0aGF0IGl0IG9m dGVuIGJlY29tZXMNCiAgbmVjZXNzYXJ5IHRvIGNvbWJpbmUgdGhlbSBpbiBvcmRlciB0byBhY2hp ZXZlIGdvb2QgcmVzdWx0cyBvbg0KICByZWFsaXN0aWMgc291cmNlIGNvZGUuIE1vcmVvdmVyLCB0 aGVzZSB0b29scyBhcmUgb2Z0ZW4gaGFyZCB0bw0KICB1bmRlcnN0YW5kIGFuZCBjb25maWd1cmUg cHJvcGVybHkgZm9yIGEgcHJvamVjdC4NCg0KICBJbiAyMDI0LCBmb2xsb3dpbmcgcHJldmlvdXMg ZXhwZXJpbWVudGF0aW9ucyAoc2VlIFvigJxBbiBFZmZpY2llbnQNCiAgQmxhY2stQm94IFN1cHBv cnQgb2YgQWR2YW5jZWQgQ292ZXJhZ2UgQ3JpdGVyaWEgZm9yIEtsZWXigJ1dICksIHdlDQogIHN0 YXJ0ZWQgd29ya2luZyBvbiBTZWFjb3JhbCwgYSB0b29sIHRoYXQgKmF1dG9tYXRlcyB0aGUgZ2Vu ZXJhdGlvbiBvZg0KICB1bml0IHRlc3RzIGZvciBDKi4gU2VhY29yYWwgcmVsaWVzIG9uIGEgdW5p ZmllZCBkZWZpbml0aW9uIG9mIGNvdmVyYWdlDQogIGNyaXRlcmlhIHRoYXQgaXMgYmFzZWQgb24g dGhlIG5vdGlvbiBvZiBjb3ZlcmFnZSBsYWJlbHMsIGFuZCBpcyBhYmxlDQogIHRvIGxldmVyYWdl IHRoZSBhYmlsaXRpZXMgb2YgbWFueSBleGlzdGluZyB0ZXN0IGdlbmVyYXRpb24gdGVjaG5pcXVl cw0KICBieSBjYXJlZnVsbHkgb3JjaGVzdHJhdGluZyB0aGUgdG9vbHMgdG8gYWNoaWV2ZSBoaWdo IGNvdmVyYWdlIHdpdGggYXMNCiAgZmV3IHRlc3RzIGFzIHBvc3NpYmxlLiBTZWFjb3JhbCBsZXZl cmFnZXMgRnJhbWFDL0xUZXN0DQogIDxodHRwczovL3d3dy5mcmFtYS1jLmNvbS9mYy1wbHVnaW5z L2x0ZXN0Lmh0bWw+IHRvIGF1dG9tYXRpY2FsbHkNCiAgYW5ub3RhdGUgdGhlIGNvZGUgd2l0aCBj b3ZlcmFnZSBsYWJlbHMuIEl0IGN1cnJlbnRseSBzdXBwb3J0cw0KICBbbGliZnV6emVyXSAsIFtL bGVlXSwgYW5kIFtDQk1DXSAuIFNlYWNvcmFsIGNhbiBhbHNvIGRldGVjdA0KICB1bnJlYWNoYWJs ZSBjb2RlIHVzaW5nIFtMVW5jb3ZdLCBhbmQgcmVwb3J0cyBwb3RlbnRpYWwgcnVudGltZSBlcnJv cnMuDQoNCg0KICBb4oCcQW4gRWZmaWNpZW50IEJsYWNrLUJveCBTdXBwb3J0IG9mIEFkdmFuY2Vk IENvdmVyYWdlIENyaXRlcmlhIGZvcg0KICBLbGVl4oCdXSA8aHR0cHM6Ly9kbC5hY20ub3JnL2Rv aS9hYnMvMTAuMTE0NS8zNTU1Nzc2LjM1Nzc3MTM+DQoNCiAgW2xpYmZ1enplcl0gPGh0dHBzOi8v bGx2bS5vcmcvZG9jcy9MaWJGdXp6ZXIuaHRtbD4NCg0KICBbS2xlZV0gPGh0dHBzOi8va2xlZS1z ZS5vcmcvPg0KDQogIFtDQk1DXSA8aHR0cHM6Ly93d3cuY3Byb3Zlci5vcmcvY2JtYy8+DQoNCiAg W0xVbmNvdl0gPGh0dHBzOi8vZ2l0LmZyYW1hLWMuY29tL3B1Yi9sdGVzdC9sdW5jb3Y+DQoNCg0K QSBsb25nIHRpbWUgYWdvDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBJZiB5b3UgaGF2ZSBuZXZlciBoZWFyZCBvZiBPQ2FtbFBybywgaGVyZSBhcmUg YSBmZXcgZXhhbXBsZXMgb2YNCiAgcHJvamVjdHMgdGhhdCB3ZSBjb250cmlidXRlZCB0byB0aGUg T0NhbWwgZWNvc3lzdGVtLCBzaW5jZSB0aGUNCiAgY3JlYXRpb24gb2YgT0NhbWxQcm8gaW4gMjAx MS4NCg0KICDigKIgYG9wYW0nICgqKTogcHJvYmFibHkgdGhlIG1vc3QgcG93ZXJmdWwgcGFja2Fn ZSBtYW5hZ2VyIGluIHRlcm1zIG9mDQogICAgY29uc3RyYWludHMgb3B0aW1pemF0aW9uLCB0aGFu a3MgdG8gdGhlIHdvcmsgb24gQ1VERiBieSBSb2JlcnRvIERpDQogICAgQ29zbW8ncyB0ZWFtLiBO b3cgdGhlIG9mZmljaWFsIHBhY2thZ2UgbWFuYWdlciBvZiBPQ2FtbC4NCiAg4oCiIGBmbGFtYmRh MScgYW5kIGBmbGFtYmRhMicgKCopOiBhIGJhY2tlbmQgZm9yIHRoZSBuYXRpdmUgY29tcGlsZXIN CiAgICB3aXRoIG11bHRpcGxlIGFkZGl0aW9ubmFsIG9wdGltaXphdGlvbiBwYXNzZXMuIEZsYW1i ZGExIHdhcyBtZXJnZWQNCiAgICBpbnRvIHRoZSBvZmZpY2lhbCBPQ2FtbCBjb21waWxlciwgd2hp bGUgRmxhbWJkYTIgaXMgaW50ZWdyYXRlZCBpbg0KICAgIHRoZSBKYW5lIFN0cmVldCBPQ2FtbCBj b21waWxlci4NCiAg4oCiIGBvY3AtaW5kZW50JyAoKik6IGEgdG9vbCB0byBhdXRvbWF0aWNhbGx5 IGluZGVudCBPQ2FtbCBjb2RlIGluDQogICAgZWRpdG9ycywgd2l0aCBtb2RlcyBmb3IgRW1hY3Ms IFZpLCBWc2NvZGUsIGV0Yy4gd2l0aCBwZXItcHJvamVjdA0KICAgIGNvbmZpZ3VyYXRpb24uIEEg bXVzdC11c2UgZm9yIGNvbGxhYm9yYXRpdmUgZWRpdGlvbiBpbnN0ZWFkIG9mDQogICAgb2NhbWxm b3JtYXQuDQogIOKAoiBgb2NwLWluZGV4JyAoKik6IGEgdG9vbCB0byBsb29rdXAgdHlwZXMgYW5k IGRlZmluaXRpb25zIGluIGFuIE9DYW1sDQogICAgcHJvamVjdCwgd2l0aCBtb2RlcyBmb3IgRW1h Y3MsIFZpLCBldGMuIGJhc2VkIG9uIGNtdCBmaWxlcy4NCiAg4oCiIGBvY3AtbWVtcHJvZic6IHRo ZSBtb3N0IHBvd2VyZnVsIG1lbW9yeSBwcm9maWxlciBmb3IgT0NhbWwgdG8gZXZlcg0KICAgIGV4 aXN0LiBXaXRoIGFsbW9zdCBubyBpbXBhY3Qgb24gcnVudGltZSBwZXJmb3JtYW5jZSwgaXQgd2Fz IGFibGUgdG8NCiAgICBkdW1wIGNvbXByZXNzZWQgbWVtb3J5IGR1bXBzIG9mIHRoZSBPQ2FtbCBo ZWFwIHdpdGggZnVsbCB0eXBlDQogICAgaW5mb3JtYXRpb24uDQogIOKAoiBgb2NwLWJ1aWxkJyA6 IHRoZSBmaXJzdCBjb21wb3NhYmxlIGJ1aWxkIHRvb2wgZm9yIE9DYW1sIGJlZm9yZSBkdW5lLA0K ICAgIGl0IHdhcyBhYmxlIHRvIGJ1aWxkIGFueSBPQ2FtbCBwcm9qZWN0IHdpdGggZnVsbCBwYXJh bGxlbGlzbS4gSXQNCiAgICBzdXBwb3J0ZWQgYWRkaXRpb25hbCBsYW5ndWFnZXMgdG8gYnVpbGQg Y3Jvc3MtbGFuZ3VhZ2UgcHJvamVjdHMuDQogIOKAoiBgb2NwLXdpbicgOiBhIGZ1bGwgT0NhbWwg ZGlzdHJpYnV0aW9uIGZvciBXaW5kb3dzLCBjb21pbmcgd2l0aCBhDQogICAgc2ltcGxlIGdyYXBo aWNhbCBpbnN0YWxsZXIuIEl0cyBjb21waWxlciBjb3VsZCBiZSBjb25maWd1cmVkIHRvDQogICAg dGFyZ2V0IGFueSBXaW5kb3dzIEMgdG9vbGNoYWluLCBzdWNoIGFzIE1pbkdXLCBNU1ZDIG9yIEN5 Z3dpbiwgYW5kDQogICAgZW52aXJvbm1lbnQsIHN1Y2ggYXMgTXN5cywgQ3lnd2luIGFuZCBXaW5k b3dzIHNoZWxscywgdGhhbmtzIHRvIHRoZQ0KICAgIHVzZSBvZiBhbiBpbnRlZ3JhdGVkIHg4Ni82 NCBhbmQgZWxmL2NvZmYgYXNzZW1ibGVyIGluIE9DYW1sLg0KDQogICgqKSB0aGFua3MgdG8gZnVu ZGluZyBieSBKYW5lIFN0cmVldA0KDQoNCllvdXIgUHJvamVjdCwgb3VyIEV4cGVydGlzZQ0K4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSWYgeW91J3JlIGxvb2tpbmcgdG8gbGV2ZXJhZ2Ug dGhlIHBvd2VyIGFuZCBmbGV4aWJpbGl0eSBvZiBPQ2FtbCBmb3INCiAgeW91ciBwcm9qZWN0cywg d2XigJlkIGxvdmUgdG8gY29sbGFib3JhdGUgd2l0aCB5b3UuIEF0IE9DYW1sUHJvLCB3ZQ0KICBi cmluZyB5ZWFycyBvZiBleHBlcnRpc2UsIGlubm92YXRpb24sIGFuZCBhIGRlZXAgY29tbWl0bWVu dCB0bw0KICBlbmhhbmNpbmcgdGhlIE9DYW1sIGVjb3N5c3RlbS4gV2hldGhlciB5b3UgbmVlZCBz dXBwb3J0IHdpdGggY3VzdG9tDQogIGRldmVsb3BtZW50LCBwZXJmb3JtYW5jZSBvcHRpbWl6YXRp b24sIHRvb2xpbmcsIG9yIGFueXRoaW5nIGluDQogIGJldHdlZW4sIHdlIGFyZSBoZXJlIHRvIGhl bHAuDQoNCiAgTGV0J3MgYnVpbGQgc29tZXRoaW5nIGdyZWF0IHRvZ2V0aGVy4oCUcmVhY2ggb3V0 IHRvIHVzIHRvZGF5IHRvIGRpc2N1c3MNCiAgeW91ciBwcm9qZWN0IQ0KDQoNCk9sZCBDV04NCuKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91 IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBn byB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQog IGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2Vl ayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAg W0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6 Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 21 to 28, 202= 5.

    Google Summer of Code

    Anton Kochkov announced

    Hi everyone! If you plan to apply this year for the Google Summer of Code, = it starts on January 27 and ends on Februrary 11: https:= //opensource.googleblog.com/2025/01/google-summer-of-code-2025-is-here.html=

    Merlin and OCaml-LSP support experimental project-wide renamin= g

    vds announced

    I am delighted to announce that the latest releases of Merlin (5.4.1-= 503) and OCaml-LSP (1.22.0) for OCaml 5.3 provide exper= imental support for project-wide renaming = of symbols.=20

    Users of vs= code-ocaml-platform, ocaml-eglot or any generic LSP client can = experiment with the new feature right now via the standard Rename feature of their favorite editors. (This is not enabled in the standard= Emacs and Vim modes yet.)

    All project-wide features require the indexer to be installed and an up-to date index built wit= h dune build @ocaml-index --watch (we only ship rules for Dune= , but the indexer itself is agnostic).

    This is a complex feature in an experimental state, please report any issue= you might encounter to = Merlin's issue tracker.=20

    3D"a1bf8be427da9f11=

    Complete changelog

    merlin 5.4.1

    • merlin binary
      • Support for OCaml 5.3
      • Use new 5.3 features to improve locate behavior in some cases. Merlin no longer confuses uids from interfaces and implementations. (#1857)
      • Perform less merges in the indexer (#1881)
      • Add initial support for project-wide renaming: occurrences can now retu= rn all usages of all related definitions. (#1877)
    • ocaml-index
      • Bump magic number after index file format change (#1886)
    • vim plugin
      • Added support for search-by-type (#1846) This is exposed through the existing :MerlinSearch command, th= at switches between search-by-type and polarity search depending on the first character of the query.

    Ocaml-LSP 1.22.0

    • Enable experimental project-wide renaming of identifiers (#1431)

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    Version 0.7 of qcheck-lin, qcheck-stm, and = qcheck-multicoretests-util is now available on the opam repository: = https://github.com/ocaml-multicore/multicoretests/releases/tag/0.7

    This release contains two contributions from @polytypic, incl. an STM= feature to help testing of ~cmd~s that may raise an effect:

    • = #509: Change/Fix to use a symmetric barrier to synchronize domains
    • = #511: Introduce extended specs to allow wrapping command sequences
    • = #517: Add Lin combinators seq_small, ar= ray_small, and list_small

    Happy testing! :smiley:

    Dune 3.17

    Etienne Marais announced

    The Dune team is releasing Dune 3.17.2! :wrench:=20

    This patch release includes some bug fixes. It mostly brings some fixes for= Melange and Wasm_of_ocaml. It also fixes a bug that prevents the experimen= tal feature, package management, to build with ocaml.5.3.0.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • Fix a crash in the Melange rules that would prevent compiling public li= brary implementations of virtual libraries. (@amonteiro, #11248)
        • Pass melange.emit's compile_flags to the JS e= mission phase. (@amonteiro, #11252)
      • Disallow private implementations of public virtual libs in melang= e mode. (@amonteiro, #11253)
      • Wasm_of_ocaml: fix the execution of tests in a sandbox. (#11304, @voui= llon)

    Odoc 3 Beta Release

    Jon Ludlam announced

    On behalf of the odoc team, I'm thrilled the announce the release of odoc 3= .0.0 beta 1!

    This release has been cooking for a long time - it's been more than a year = since odoc 2.4 landed, and a huge amount of work has gone into this. Thanks= to the many others who contributed, either by code or by comments: @juloo,= @panglesd, @EmileTrotignon, @gpetiot, @trefis, @sabine, @dbuenzli, @yawara= min, and more.

    With this release we're including a driver that knows how to use all of the= exciting new features of odoc. This driver has been used to create the docs site for the various odoc tools= .

    Here are a selected set of features:

    • :droplet: Rendered source! Jump from any item in the documentation stra= ight to its rendered source; no matter how much of OCaml's complex module s= ystem you are using.
    • :mag: Search by type! Our detective sherlodoc will find your lost value= given its type.
    • :warning: Convenient warnings! Warnings are now clearly visible and use= ful, no longer buried among your dependencies=E2=80=99 warnings.
    • :arrow_heading_up: Self host your documentation, but link to ocaml.or= g for your dependencies.
    • :100: More sidebars! Odoc 3 features a global sidebar, allowing = you to discover the most hidden corner of underground documentation.
    • :exploding_head: Image support! This cutting-edge feature now allows yo= u to add images to your documentation. Video and audio come for free.
    • :spider_web: Fully cross-package links! The OCaml doc= s are now a true spider web. Prepare to catch bugs, and eat them.
    • :cop: Hierarchical documentation pages! We use a modular language. We d= on't want a flat namespace for pages.
    • :building_construction: The build dependencies are friendlier with incr= emental build systems, allowing better shared build caches.
    • :heart: Quality of life improvements! Many improvements have been pili= ng up since we started odoc 3. For instance: Add clock emoji before @= since tag (@yawaramin, #1089)!

    More explanation of these features is available at the odoc site, where we = have documentation for authors, for users of odoc_driver, a cheatsheet, and differen= ces from ocamldoc.

    How can you help?

    We need your feedback, both as authors and as users of documentation! Try t= hings out using the new driver:

    $ opam install odoc-driver    # don't forget to ~opam update~
    $ odoc_driver <package list>  # For instance: ~$ odoc_driver brr odoc~
    $ $YOUR_BROWSER _html/index.html
    

    Many of those features' implementations are not set in stone, but first ver= sions. Please leave comments, either in this thread or as issues in the rep= ository.

    So, navigate already written documentation, and update your own docs to use= the new features!

    2024 at OCamlPro

    OCamlPro announced

    2024 at OCamlPro

    At OCamlPro, we like to solve issues that have an impact in the real world,= so we focus most of our efforts on projects that our customers bring from = their domains. We often like to work in the shadows, focusing on the hardes= t tasks. Fabrice, OCamlPro=E2=80=99s founder, used to say that we are the C= ommandos of OCaml (and now of Rust too), a team of highly skilled professio= nals jumping into the most demanding projects. That ability was illustrated= several times in the past, from the birth of Opam, the development of the = Flambda compilers for Jane Street, the design and development of the Tezos = prototype and ICO platform, to the adventurous extension of the GnuCOBOL op= en-source compiler for French DGFiP, even the port of Flow and Hack to Wind= ows for Meta. Of course, we are always happy to be entrusted with more comm= on projects and tasks also, building a team and training the talents requir= ed to master all tasks, from the simplest to the hardest ones. And the hard= est ones are often hidden in the middle of the simplest ones, too.

    The OCaml language is the greatest tool at hand to fulfil our missions, and= we try to contribute back to the OCaml ecosystem when possible. We are alw= ays attracted to issues met by OCaml industrial users, as it gives us the o= pportunity to directly work for the OCaml community. Would you be having su= ch issues, do not hesitate to contact us and discuss what we can do for you!

    The beginning of a new year is always a good time to look back at the previ= ous year, and see what we have achieved with OCaml, and sometimes for OCaml= , in 2024.

    Contributions to the OCaml ecosystem

    • Sharing Knowledge

      In 2024, we made efforts to dedicate more time to write blog posts to share= our knowledge on the OCaml tools we work on, so that OCaml developers can = use this knowledge in their daily tasks. We wrote a series of articles on m= astering Opam from the ground up ( Opam 101: The First Steps, Opam= 102: Pinning Packages), on the internals of the Flambda2 compiler ( B= ehind the Scenes of the OCaml Optimising Compiler Flambda2: Introduction an= d Roadmap, Flambda2 Ep. 2: Loopifying Tail-Recursive Functions, F= lambda2 Ep. 3: Speculative Inlining ) and one on OCaml backtraces ( OCaml Backtraces on Uncaught Exceptions ). More are comin= g!

      Of course, if you are not patient enough to wait for our next articles, you= may register for one of our trai= nings , we have OCaml Beginner , OCaml Expert , Ma= stering Opam , OCaml Code Optimization and we can build ne= w ones on demand. To be honest, in 2024, we received many more requests for= our sessions on Rust (Beginner, Expert and Embedded) than for OCaml, but m= ore for OCaml ones than for COBOL ones =F0=9F=99=82

    • Opam, Maintenance and Evolution

      Since we created Opam in 2012, we have always had at least one full time en= gineer in the Opam team, to maintain it, add new features and review contri= butions by other members. This was made possible thanks to a partnership wi= th Jane Street, and, since 2024, to a partnership with Tarides.

      In 2024, opam had two major releases, opam 2.3.0 release! and opam 2.2.0 rele= ase! . The most ground-breaking change is the official native suppor= t for Windows, with access to either mingw-w64 gcc compilers or Visual = Studio MSVC compilers with automatic detection. This native support is trem= endous news for OCaml adoption in general, and it was built thanks to a lot= of work from all the community, especially on the opam-repository and pack= ages. An interesting next step to consider for OCaml on Windows would be to= have a single OCaml toolchain for all Windows compilers, using an integrat= ed assembler for x86/x64 with elf/coff support, something that we had imple= mented and tested in OcpWin a long time ago.

      Among many fixes and updates, there is the addition of opam tree <packag= e> to get a nice display of the dependencies of an installed package, opam pin =E2=80=93recursive to look deeper into sub-directories = when searching for opam files and many more small improvements. Check the b= log posts for more details !

    • Work on the OCaml Compiler

      We have had a long partnership with Jane Street to improve the performance = of the code generated by the OCaml compiler. The first outcome of this work= was the Flambda backend, which was merged into OCaml 4.03 in 2016. Since t= hen, we have started a new backend, Flambda2 , that is included in the Jane Street OC= aml compiler.

      In 2024, our team focused its efforts on several new optimizations, like ma= tch in match (simplify pattern-matching appearing in another pattern-matchi= ng after inlining), unbox free vars of closures (shortcut chains of pointer= s stored in closures) or the reaper (do not allocate unused fields of block= s). Such optimizations are often much more complex than you would think, as= guaranteeing that they can be applied safely is not obvious, requiring esc= ape analysis and other checks. We were also very active at helping the comp= iler team at Jane Street by reviewing their code and adapting our backend t= o their needs. If you are interested in this subject, read our blog series = on the topic that was mentioned earlier.

      In 2024, we also had an intern working on modular explicits, an exte= nsion of OCaml first-class modules with module-dependent functions, functio= ns taking first-class modules as arguments. This work can be seen as a firs= t step towards modular implicits, and was presented at the OCaml workshop with Didier R=C3=A9my. The= main pull-request is still under review, while other smaller ones have already been merged,= leading to interesting extensions inside the compiler such as new forms of= dependent types.

    • Optimizing Geneweb, a Webserver for Genealogy<= br />

      Last year, we also started working on Geneweb, a webserver in OCaml that is used to store family tr= ees by genealogists. Geneweb is a very old piece of OCaml, initially writte= n around 1996 by Daniel De Rauglaudre at Inria. It is used both by Geneanet , a genealogy com= pany recently acquired by Ancestry, and the Roglo association, a French association that adm= inistrates a single family tree of more than 10 million persons. One of the= issues faced by the Roglo association was that their branch of the softwar= e had diverged from the official one maintained by Geneanet, as Roglo had t= o use specific features on their branch to cope with the huge size of their= unique family tree. We helped them by optimizing the official branch, so t= hat it could host the tree while providing the same latencies for requests = as before. It required optimizing the representation of stored data (both i= n OCaml and on disk), how it was accessed through system calls, and a good = understanding of the complex algorithms used by Geneweb, typically to trave= rse family members using various relationships.

    Contributions to other languages

    • Compiling to Wasm and Wasm Symbolic Execution<= br />

      Since 2021, OCamlPro has actively contributed to the W3C's efforts on bring= ing a dedicated Garbage Collector to WebAssembly - an essential feature tha= t has now become reality with the increased use of Wasm (See How Prime Video updates its app for more than 8,000 dev= ice types or Introducing the D= isney+ Application Development Kit (ADK) ).

      Our work ensured the official WasmGC proposal remained fully compatible with the needs of OCaml. Crucial to this success was Wasocaml, our Flambda-based backend targeting WebAssembly, which help= ed drive the proposal's release and subsequent implementation in 2023 acros= s all major browsers.

      One of our biggest contributors to this work, L=C3=A9o Andr=C3=A8s defended his PhD at the end of 2024. The= topic was about compiling OCaml to Wasm but also about another tool named Owi, developed in close col= laboration with the University of Lisboa. Originally developed as a "Wasm S= wissknife", Owi has evolved into a multi-core, multi-solver, cross-language= symbolic engine. Its capabilities include:

      • automated, sound, and partially-correct bug-finding (amounting to a pro= of);
      • solver-aided programming (think of Rosette for Rocket, but for any lang= uage);
      • efficient test-case generation.

      Looking ahead, we are excited to combine Wasocaml and Owi, aiming to per= form symbolic execution of OCaml programs, and even those with substant= ial C components! We've already applied these techniques successfully to Ru= st, uncovering a subtle bug in the Rust standard library. If you want to know more about= it, have a look at our journa= l article.

      Some of this work was funded by NGI/NLnet.

    • From Niagara to Kopek, a foot in the Cinema in= dustry

      2024 was also a new adventure in entrepreneurship for OCamlPro. In 2023, we= won a grant from the CNC, the French Center f= or the Cinema industry, to work with Antoine Devulder and Denis M=C3=A9rigo= ux on the design of a DSL for movie producers. Indeed, distributing = earnings is one of the most complex tasks that a producer must do after a m= ovie is released, mostly because of the complexity of contracts. So we desi= gned a DSL, initially called Niagara, that is close enough to contracts to = be simple to write, and automatically computes the exact distribution of ea= rnings during the entire life of the movie.

      In 2024, we decided to create the Kopek compa= ny with Antoine and Denis, to commercialize this product. The DSL itsel= f is hidden behind a no-code interface that makes all interactions with the= software easy and intuitive for producers, and the tool can deal with comp= lex contracts that no other software on the market can deal with. For Frenc= h speakers, the tool was recently presented at a CNC event .

    • SuperBOL, a powerful LSP for COBOL and Visual = Studio Code

      For a few years now, OCamlPro has been invo= lved in the COBOL ecosystem, mostly to help the French tax administrati= on to deal with the migration of COBOL code from legacy systems (GCOS mainf= rames from the 80s) to Cloud-based platforms. Most of our work was to exten= d the free open-source GnuCOBO= L compiler for the needs of the application. Moreover, we spent some ti= me creating an OCaml framework for COBOL to better understand this p= rogramming language. We released a large part of this work as an open-sourc= e extension for Visual Studio Code called SuperBOL Studio OSS. Backed by our powerful = LSP server, this extension empowers its users with all the features that de= velopers expect from a modern editor for editing and navigating COBOL code.

      In 2024, we improved the parser to support a larger part of the COBOL langu= age, we added a powerful indentor of code, powerful code completion feature= s derived directly from the COBOL grammar (using the recently added feature= s in Menhir), as well as various ways to display the control-flow graph of = programs ; the latter being particularly useful when your job is to navigat= e and modify code written many decades ago. We built an entire CI/CD system= for SuperBOL that automatically releases cross-compiled, statically linked= binaries for Linux, Windows and MacOS.

    • Mlang used at the DGFiP

      We have also been involved for some time now in the adaptation of the Mlang compiler to replace the= deprecated tooling of the DGFiP (French Public Finances Directorate) to co= mpute the French Income Tax.

      2024 was an important milestone for the project, as Mlang was used for the = first time in production. It means that we were able to compute the = exact same results, with comparable performance. Moreover, as the former co= mpiler used to suffer from overflows that require manual inspections and re= -evaluations, the new compiler already provides benefits for DGFiP. We are = now involved in improving Mlang to handle multi-year computations, somethin= g that used to be performed using hardly maintainable boilerplate in C, and= in improving the general environment around the compiler, with CI/CD and c= ode-navigation tools.

    Formal methods

    • The Alt-Ergo SMT Solver

      OCamlPro has been developing the Alt-Ergo SMT solver since 2011. Alt-Ergo is usually used behind code v= erification frameworks such as Why3 ,= Frama-C , TIS Analyzer or Adacore Spark , we maintain a close relati= onship with its industrial users through the Alt-Ergo Users=E2=80=99 Club who have access to the m= ost recent features ahead of time. Current members are Adacore , T= rust in Soft , Thales , MERCE and CEA List<= /a> .

      In 2024, we released a brand new version, Alt-Ergo 2.6 . The highlights = are a better support for bit-vectors, model generation for algebraic data t= ypes, optimization of (maximize) and (minimize), FPA support, and many othe= r features and bug fixes. Part of this work was also funded by the Decysif collaborative project where we try = to improve Alt-Ergo for use with the Creusot Rust Verifier .

    • EAL6+ Certification

      In 2024, we have again been involved in a high level software certification= process (Common Cri= teria EAL6+ ) where we successfully proved our capacity to formalize se= curity policies on low level code for very important customers, using the C= oq proof assistant.

    • Taming Test Generators for C with SeaCoral

      Writing unit tests is a very good practice, particularly when using a weakl= y-typed language like C. Yet, it is also a cumbersome task, especially when= the goal is to reach 100% coverage of the code. Fortunately, part of this = task can be automated by test generation tools, based on fuzzing, symbolic = execution, and other code analysis techniques. Each of these techniques has= its own strengths and weaknesses (in terms of performance, number of gener= ated tests, or targeted coverage criteria), so much so that it often become= s necessary to combine them in order to achieve good results on realistic s= ource code. Moreover, these tools are often hard to understand and configur= e properly for a project.

      In 2024, following previous experimentations (see =E2=80=9CAn Efficient Black-Box Suppo= rt of Advanced Coverage Criteria for Klee=E2=80=9D ), we started workin= g on Seacoral, a tool that automates the generation of unit tests for C<= /b>. Seacoral relies on a unified definition of coverage criteria that is b= ased on the notion of coverage labels, and is able to leverage the abilitie= s of many existing test generation techniques by carefully orchestrating th= e tools to achieve high coverage with as few tests as possible. Seacoral le= verages FramaC/LTest https://www.frama-c.com/fc-plugins/ltest.html to automatically anno= tate the code with coverage labels. It currently supports libfuzzer , Klee, and CBMC . Se= acoral can also detect unreachable code using LUncov, and reports potential runtime errors.

    A long time ago

    If you have never heard of OCamlPro, here are a few examples of projects th= at we contributed to the OCaml ecosystem, since the creation of OCamlPro in= 2011.

    • opam (*): probably the most powerful package manager in te= rms of constraints optimization, thanks to the work on CUDF by Roberto Di C= osmo's team. Now the official package manager of OCaml.
    • flambda1 and flambda2 (*): a backend for the = native compiler with multiple additionnal optimization passes. Flambda1 was= merged into the official OCaml compiler, while Flambda2 is integrated in = the Jane Street OCaml compiler.
    • ocp-indent (*): a tool to automatically indent OCaml code = in editors, with modes for Emacs, Vi, Vscode, etc. with per-project configu= ration. A must-use for collaborative edition instead of ocamlformat.
    • ocp-index (*): a tool to lookup types and definitions in a= n OCaml project, with modes for Emacs, Vi, etc. based on cmt files.
    • ocp-memprof: the most powerful memory profiler for OCaml t= o ever exist. With almost no impact on runtime performance, it was able to = dump compressed memory dumps of the OCaml heap with full type information.<= /li>
    • ocp-build : the first composable build tool for OCaml befo= re dune, it was able to build any OCaml project with full parallelism. It s= upported additional languages to build cross-language projects.
    • ocp-win : a full OCaml distribution for Windows, coming wi= th a simple graphical installer. Its compiler could be configured to target= any Windows C toolchain, such as MinGW, MSVC or Cygwin, and environment, s= uch as Msys, Cygwin and Windows shells, thanks to the use of an integrated = x86/64 and elf/coff assembler in OCaml.

    (*) thanks to funding by Jane Street

    Your Project, our Expertise

    If you're looking to leverage the power and flexibility of OCaml for your p= rojects, we=E2=80=99d love to collaborate with you. At OCamlPro, we bring y= ears of expertise, innovation, and a deep commitment to enhancing the OCaml= ecosystem. Whether you need support with custom development, performance o= ptimization, tooling, or anything in between, we are here to help.

    Let's build something great together=E2=80=94reach out to us today to discu= ss your project!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=UOiVBfCl; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=fuFFQlZN; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 233DC4003F for ; Tue, 4 Feb 2025 12:05:35 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=aCt2e/OoVzQQkquQWnMxmXoI3hQJsIokNtPh6bhEv+o=; b=UOiVBfClFWl4WaQp3TGVPHmHt0sIC9LTil6kXQaTA1S9YsKb6tOt2ec4 WpgtFrXmKnp9pzmJq+CVqKMrwO1gc0s047QfPXLuqmH3sRu/LA33VEjrB 41/bCg4whCSJ0FvGtWPWOllnUEXR25BS2/nq4w2Zh+opXDFNgKHRWheiK c=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,258,1732575600"; d="scan'208,217";a="206504901" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Feb 2025 13:05:35 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id AEF13E0D20; Tue, 4 Feb 2025 13:05:34 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D7AC5E0260 for ; Tue, 4 Feb 2025 13:05:32 +0100 (CET) IronPort-SDR: 67a2028b_QIIyGmqU2YWETJKw1lWAUfeTcNIQvuS9bN/b+/B40R9RwKx Q6dkoQZ/fTe+Lro71hSSw69MbkM+sluW90FrQ2w== X-IPAS-Result: =?us-ascii?q?A0HGCgDLAaJngSIeaIFaglwCgT9bKBkBY1ozBwhIhFaDT?= =?us-ascii?q?44hkUyKd4FWFIERAy4jFAEDAQ0uAQUNAQIEAQEDAQIBhDpGAhaKZwIfBgEEM?= =?us-ascii?q?gcOAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABAT0FSYV7DUkBA?= =?us-ascii?q?QEBAgEGBIFrGThxgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQECDAEMDRorQwYKEwEBOBgjAxQBBgMCBA0BNRcBEhqCEFmCH?= =?us-ascii?q?0UDBQwGP5NVm0t6gTKBAYIMAQEGgQg+AgECCQIFAQ4JJtoGgWUJgTAYhWuCS?= =?us-ascii?q?RoBKkhqAoRIhDwnD4FVRIEVNYJEb4ICSBcCAQEYgQwYAQEHRgmDJYJpgjOBQ?= =?us-ascii?q?oNvhlSDH4Eeg3eDX4RPEosggUdLMywBVRMXCwcFYYEQAyo2MYFJezmCDmlJO?= =?us-ascii?q?gINAjWCHiRYgiuDH4E9hEOEToVeghKCC4gEHUADC209NxQbngYJNjYBPIMUG?= =?us-ascii?q?xQOPgFaGgcOBRQSBhc5CA4rChkmBQkVFgMcCAMLBimSRw4ogSGxQjQHhB6BX?= =?us-ascii?q?QYMhCSEYYEkkiSDV4QEgVeLL4cAkkkimFoiiVuBJQlggXmIdIxgIxaCC4MSg?= =?us-ascii?q?W4OJTyBIDMaMEMNEYJJCQo8HA+SG4E+gxo7gm3AaUI1AgEBOAIHAQoBAQMJh?= =?us-ascii?q?WIBAYFOgTaCF4U0gUsBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:SrWT/qz6O9ImG2r8xryLKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: 9a23:9YTbh2+tKqitOZ/kfrqVv0M+Ppg/K3zc9WmOPE66LGFlGKTKZWbFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3Ag5YGGAwlAO1Et1pOqhqXYR6kVZqaqKGBWWAOlZp?= =?us-ascii?q?bh8LeJHQ3ZW6H0RqScLZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,258,1732575600"; d="scan'208,217";a="108158833" X-MGA-submission: =?us-ascii?q?MDE+il8hQNqOAFc+ca5PjgwisiTRN435a8Y5PV?= =?us-ascii?q?C3/gJYhh376tk0lK1TfIzPtOuPOvB22Esbvj76k6aWJXdm20taeBALQj?= =?us-ascii?q?3FTBcZK87PUD1Mp00ht1qo+FXW5M1nhljOdCxQr5SOnvQ0Ao10Mv1gbB?= =?us-ascii?q?9rc2DtDjua3khgAlIDw1edGw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Feb 2025 13:05:31 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EC8F6564BF0; Tue, 4 Feb 2025 13:05:29 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1738670730; bh=auCY5594BfIzZLVpZt9kDgea/cgZvR56Ae4b2CwSqac=; h=From:To:Subject:Date:Message-ID; b=fuFFQlZNDxDkdMkvOq1o13Z59996sKCjI44EWzYHkZIzR5K0L+Yc7TL6tgBU8souP D5UeEd0dwmA5qifr7b3x3rxqeeAtCAYf5rvb9sDUxhJYk6ejJM7cWDrxmvVc+CINbC zaLMMlxh0VQNk9yz95yAxpB4JU5VcPVAXyS0UI80= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 04 Feb 2025 13:05:29 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 4 13:05:30 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.486888, queueID=476BC564BF1 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19261 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAyOCB0bw0KRmVicnVhcnkgMDQsIDIwMjUuDQoNClRhYmxlIG9mIENvbnRl bnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KT3BhbSByZXBvc2l0b3J5IGFyY2hpdmUgLSBjbGFyaWZpY2F0aW9uIG9mIHRoZSBvcGFtIGZp ZWxkcw0KQ2jDumMgbeG7q25nIG7Eg20gbeG7m2kg4bqkdCBU4bu1IDIwMjUhDQpSZXdyaXRpbmcg U2xpcHNob3cgaW4gT0NhbWw6IFRoZSB1bmRvLWFibGUgbW9uYWQNCkFubm91bmNpbmcgY2xpbWF0 ZS4wLjQuMA0KMTV0aCBNaXJhZ2VPUyByZXRyZWF0IE1heSAxM3RoIC0gMjB0aA0KRHVuZSBkZXYg bWVldGluZw0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk9wYW0gcmVwb3NpdG9yeSBh cmNoaXZlIC0gY2xhcmlmaWNhdGlvbiBvZiB0aGUgb3BhbSBmaWVsZHMNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3BhbS1yZXBvc2l0b3J5LWFyY2hp dmUtY2xhcmlmaWNhdGlvbi1vZi10aGUtb3BhbS1maWVsZHMvMTYwNTAvMT4NCg0KDQpIYW5uZXMg TWVobmVydCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgZXZlcnlvbmUsDQoN CiAgd2UgaGFkIGZ1cnRoZXIgZGlzY3Vzc2lvbnMgYWJvdXQgdGhlIHNlbWFudGljcyBvZg0KICBg eC1tYWludGVuYW5jZS1pbnRlbnQnLCBhbmQgaG9wZSB0byBjbGFyaWZ5IGluIHRoaXMgcG9zdC4g QWxzbywgd2UNCiAgYWRhcHRlZCB0aGUgcG9saWN5IHdoaWNoIGlzIGluIHRoZSBvcGFtLXJlcG9z aXRvcnkgZ2l0IHJlcG9zaXRvcnk6DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1y ZXBvc2l0b3J5L2Jsb2IvbWFzdGVyL2dvdmVybmFuY2UvcG9saWNpZXMvYXJjaGl2aW5nLm1kPg0K DQoNCngtbWFpbnRlbmFuY2UtaW50ZW50DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBXZSd2ZSBoYWQgc29tZSBmdXJ0aGVy IGRpc2N1c3Npb25zIG9uIFBoYXNlIDMgYW5kIHRoZSBzZW1hbnRpY3Mgb2YgdGhlDQogIGB4LW1h aW50ZW5hbmNlLWludGVudCcgZmllbGQuDQoNCg0K4peKIEdvYWwNCg0KICBPdXIgYWltIGlzIHRv IGJlIG5vdCBkaXNydXB0aXZlIGZvciB0aGUgY29tbW9uIE9DYW1sIHByb2dyYW1tZXIgb3INCiAg dXNlci4gVGhlIG9wYW0tcmVwb3NpdG9yeSBzdXBwb3J0cyAoZnJvbSBGZWJydWFyeSAxc3Qgb24p IE9DYW1sIDQuMDgNCiAgYW5kIGdyZWF0ZXIuIFRoaXMgbWVhbnMgdGhhdCBpZiB5b3UgaW5zdGFs bCBPQ2FtbCA0LjA4IHlvdSBzaG91bGQgYmUNCiAgYWJsZSB0byBpbnN0YWxsIGFsbCB0aGUgcGFj a2FnZXMgdGhhdCBoYXZlIGV2ZXIgYmVlbiByZWxlYXNlZCB3aXRoDQogIDQuMDggc3VwcG9ydC4N Cg0KICBUaGUgcmV2aXNlZCBzZW1hbnRpY3Mgb2YgIihsYXRlc3QpIiBpcyAidGhlIGxhdGVzdCB2 ZXJzaW9uIG9mIHRoaXMNCiAgcGFja2FnZSwgc28gdGhhdCBldmVyeSBzdXBwb3J0ZWQgT0NhbWwg dmVyc2lvbiB3aWxsIGhhdmUgYW4NCiAgaW5zdGFsbGF0aW9uIGNhbmRpZGF0ZSIuDQoNCg0KICDi l4ogRXhhbXBsZQ0KDQogICAgTGV0IG1lIGdpdmUgeW91IGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRo ZSBwYWNrYWdlICJiYXNpYyIgd2hpY2gNCiAgICBleGlzdHMgaW4gdGhyZWUgdmVyc2lvbnM6DQog ICAg4oCiIGJhc2ljLjEuMC4wIHdpdGggdGhlIGRlcGVuZGVuY3kgIm9jYW1sIiB7Pj0gIjQuMDUi ICYgPCAiNSJ9DQogICAg4oCiIGJhc2ljLjEuMC4xIHdpdGggdGhlIGRlcGVuZGVuY3kgIm9jYW1s IiB7Pj0gIjQuMDgiICYgPCAiNSJ9DQogICAg4oCiIGJhc2ljLjIuMC4wIHdpdGggdGhlIGRlcGVu ZGVuY3kgIm9jYW1sIiB7Pj0gIjQuMTQiICYgPCAiNSJ9DQoNCiAgICBIZXJlLCBpZiB0aGUgYHgt bWFpbnRlbmFuY2UtaW50ZW50OiBbICIobGF0ZXN0KSIgXScgaXMgcHJlc2VudCwgd2UNCiAgICB3 aWxsIG9ubHkgKHRyeSB0bykgYXJjaGl2ZSBiYXNpYy4xLjAuMCDigJMgc2luY2UgMS4wLjEgaXMg bmVlZGVkIGZvcg0KICAgIE9DYW1sIDQuMDggLi4gNC4xMy4NCg0KDQril4ogRGVmYXVsdCB2YWx1 ZQ0KDQogIFRoZSBkZWZhdWx0IHZhbHVlIG9mIGB4LW1haW50ZW5hbmNlLWludGVudCcgd2lsbCBm b3Igbm93IGJlIGAiKGFueSkiJw0KICAtIHNvIGFsbCB2ZXJzaW9ucyBhcmUga2VwdC4gSW4gdGhl IGZ1dHVyZSwgd2UgbWF5IGNoYW5nZSB0aGlzIGRlZmF1bHQNCiAgdG8gYCIobGF0ZXN0KSInLCBi dXQgd2lsbCBhbm5vdW5jZSB0aGlzIGFoZWFkIG9mIHRoZSBjaGFuZ2Ugd2l0aA0KICBwbGVudHkg b2YgdGltZS4NCg0KICBUaGlzIGRlZmF1bHQgdmFsdWUgaXMgYWdyZWVkIG9uIGJ5IHRoZSBub24t ZGlzcnVwdGl2ZSBhZ3JlZW1lbnQgdG8NCiAgY2F1c2UgdGhlIGxlYXN0IHRyb3VibGUuDQoNCg0K eC1tYWludGFpbmVkDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJ biBhZGRpdGlvbiB0byB0aGUgYHgtbWFpbnRlbmFuY2UtaW50ZW50JyAtIHdoaWNoIGNvdmVycyB0 aGUgc2VtYW50aWNzDQogIG9mIGFsbCB2ZXJzaW9ucyBvZiBhbiBvcGFtIHBhY2thZ2UsIHdlIHN1 cHBvcnQgYW5vdGhlciBmaWVsZCwNCiAgYHgtbWFpbnRhaW5lZDogQk9PTCcuIFRoaXMgaXMgYW4g b3ZlcndyaXRlIGZvciBhIHNwZWNpZmljIG9wYW0gcGFja2FnZQ0KICB2ZXJzaW9uLCBhbmQgYWxs b3dzIHRvIGRlY2xhcmUgd2hldGhlciBpdCBpcyBtYWludGFpbmVkIG9yIG5vdC4NCg0KICBJdCBp cyB1c2VmdWwgaW4gdGhlIHNldHRpbmcgd2hlcmUgeW91J3ZlIGxvdHMgb2YgcHJlLXJlbGVhc2Vz IHRoYXQgYXJlDQogIG5vIGxvbmdlciBtYWludGFpbmVkIGFuZCB5b3UgbGlrZSB0byBzdGF0ZSB0 aGlzIHdpdGhvdXQgd3JpdGluZyBhDQogIGdsb2JhbCBpbnRlbnQgZm9yIHRoZSBvcGFtIHBhY2th Z2UgKGUuZy4gZm9yIHRoZSBPQ2FtbCBjb21waWxlcg0KICBwYWNrYWdlcywgdGhlIGFscGhhLCBi ZXRhLCBhbmQgcmMgdmVyc2lvbnMpLiBIZXJlLCBgeC1tYWludGFpbmVkOg0KICBmYWxzZScgaXMg YSBuaWNlIHNldHRpbmcuIE5COiBlYXJsaWVyIHdlIHByb3Bvc2VkIGBmbGFnczogZGVwcmVjYXRl ZCcNCiAgLSBidXQgd2Ugc3RheSBhd2F5IGZyb20gdGhlIGZsYWdzLCBzaW5jZSB0aGVyZSBtYXkg YmUgcGFja2FnZXMgdGhhdA0KICBhcmUgZGVwcmVjYXRlZCBidXQgc3RpbGwgbWFpbnRhaW5lZCAo b3BhbSBwcmludHMgYSB3YXJuaW5nIGlmIHlvdQ0KICBpbnN0YWxsIGEgcGFja2FnZSB3aXRoIHRo ZSBkZXByZWNhdGVkIGZsYWcpLg0KDQogIElmIHlvdSBoYXZlIGEgcHJpdmF0ZSBwcm9qZWN0IGFu ZCBkZXBlbmQgb24gYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIGFuDQogIG9wYW0gcGFja2FnZSwgeW91 IGNhbiBhcyB3ZWxsIFBSIHRoZSBgeC1tYWludGFpbmVkOiB0cnVlJyBmaWVsZCBmb3INCiAgdGhh dCBvcGFtIGZpbGUgKHBsZWFzZSBzcGVjaWZ5IHdoZW4sIHdobywgYW5kIHdoeSkuIFRoaXMgd2ls bCBlbnN1cmUNCiAgdGhhdCB0aGlzIG9wYW0gZmlsZSBzdGF5cyBpbiB0aGUgb3BhbSByZXBvc2l0 b3J5Lg0KDQoNClBoYXNlIDMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEluIFBoYXNlIDMs IHdlIHdpbGwgY29uc2lkZXIgYWxsIHBhY2thZ2VzIG1hcmtlZCB3aXRoDQogIGB4LW1haW50ZW5h bmNlLWludGVudCcgKHRoZSB2ZXJzaW9ucyBub3QgbWF0Y2hpbmcgdGhlIGludGVudCkgYW5kDQog IGB4LW1haW50YWluZWQ6IGZhbHNlJyB0byBiZSBhcmNoaXZlZC4NCg0KICBXZSBwbGFuIHRvIGVu c3VyZSB0aGF0IChhKSBhbGwgc3VwcG9ydGVkIE9DYW1sIHZlcnNpb25zIHdpbGwgcmV0YWluIGFu DQogIGluc3RhbGxhdGlvbiBjYW5kaWRhdGUgKGIpIGFsbCByZXZlcnNlIGRlcGVuZGVuY2llcyB3 aWxsIHN0aWxsIGJlDQogIGluc3RhbGxhYmxlLiBBcyBhIG5vdGUsIGlmIHlvdSBoYXZlIGFuIGF2 YWlsYWJpbGl0eSBjb25kaXRpb24gKHNvbWUNCiAgdmVyc2lvbiB3aWxsIG9ubHkgd29yayBvbiBz b21lIE9TKSwgd2Ugd29uJ3QgdGFrZSB0aGF0IGludG8NCiAgY29uc2lkZXJhdGlvbiDigJMgeW91 IHdpbGwgbmVlZCB0byBzcGVjaWZ5IHRoZSBgeC1tYWludGVuYW5jZS1pbnRlbnQnIHRvDQogIGNv dmVyIHlvdXIgdmVyc2lvbnMuDQoNCiAgT3VyIHBsYW4gaXMgdG8gcHVibGlzaCB0aGUgbGlzdCBv ZiBwYWNrYWdlcyB0byBiZSBhcmNoaXZlZCBieSBGZWJydWFyeQ0KICAxNXRoIG9uIHRoaXMgZGlz Y291cnNlLiBJdCBpcyBsaWtlbHkgd2UnbGwgaGF2ZSBjYW5kaWRhdGUgbGlzdHMgUFJlZA0KICB0 byB0aGUgW29wYW0tcmVwb3NpdG9yeS1hcmNoaXZlXSBlYXJsaWVyLiBXZSBoYXZlIGxvdHMgb2Yg aWRlYXMgYW5kDQogIHBsYW5zIGZvciBDSSBzeXN0ZW1zIHRvIGdpdmUgZmVlZGJhY2sgd2hpY2gg b3BhbSB2ZXJzaW9ucyBhcmUgZmFsbGluZw0KICBpbnRvIHRoZSBtYWludGVuYW5jZSBpbnRlbnQg d2hlbiB5b3Ugb3BlbiBhIFBSIHRvIHRoZSBvcGFtLXJlcG9zaXRvcnkNCiAgKGJ1dCB3ZSdyZSBu b3QgdGhlcmUgeWV0KS4NCg0KDQpbb3BhbS1yZXBvc2l0b3J5LWFyY2hpdmVdDQo8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS1hcmNoaXZlPg0KDQoNCkZ1dHVyZQ0K4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgQXMgbm90ZWQgYWJvdmUsIHRoZSBkZWZhdWx0IHZhbHVlIG9m IGB4LW1haW50ZW5hbmNlLWludGVudCcgbWF5IGNoYW5nZQ0KICBpbiB0aW1lLiBJZiB0aGlzIGlz IGRlY2lkZWQsIHdlIHdpbGwgYW5ub3VuY2UgdGhpcyB3aXRoIHBsZW50eSBvZiB0aW1lDQogIGJl Zm9yZS4NCg0KICBBbHNvLCBhdCBzb21lIHBvaW50IGluIHRoZSBmdXR1cmUgd2Ugd2lsbCBidW1w IHRoZSBPQ2FtbCBsb3dlciBib3VuZA0KICAoZnJvbSBGZWJydWFyeSAxc3QgaXQgaXMgNC4wOCku DQoNCg0KQWN0aW9uDQrilYzilYzilYzilYzilYzilYwNCg0KICBGb3IgdGhlIHNtb290aCBzaHJp bmtpbmcgb2YgdGhlIG9wYW0tcmVwb3NpdG9yeSwgcGxlYXNlIGRvbid0IGhlc2l0YXRlDQogIHRv IGZpbGwgaW4geW91ciB4LW1haW50ZW5hbmNlLWludGVudCAoZXNwZWNpYWxseSAiKG5vbmUpIiBh bmQNCiAgIihsYXRlc3QpIiBhcmUgZmluZSBhbmQgc2FmZSBjaG9pY2VzKS4NCg0KICBJZiB5b3Ug d2FudCB0byBjb250cmlidXRlIG1vcmUsIHRoZSBvcGFtLXJlcG9zaXRvcnkgbmVlZHMgaGVscCBm b3INCiAgdHJpYWdpbmcgYW5kIG1lcmdpbmcgUFJzIC0gd2h5IG5vdCBiZWNvbWUgYSBtYWludGFp bmVyPyBTZWUgdGhlIG9sZA0KICBidXQgc3RpbGwgdmFsaWQgWydjYWxsIGZvciBuZXcgb3BhbS1y ZXBvc2l0b3J5IG1haW50YWluZXJzJ10gaWYgeW91J3JlDQogIGludGVyZXN0ZWQuDQoNCg0KWydj YWxsIGZvciBuZXcgb3BhbS1yZXBvc2l0b3J5IG1haW50YWluZXJzJ10NCjxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvY2FsbC1mb3ItbmV3LW9wYW0tcmVwb3NpdG9yeS1tYWludGFpbmVycy8x MjA0MT4NCg0KDQpDaMO6YyBt4burbmcgbsSDbSBt4bubaSDhuqR0IFThu7UgMjAyNSENCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvY2h1Yy1tLW5nLW5hbS1tLWktdC10LTIwMjUvMTYwNTUvMT4NCg0KDQpz YW5ldHRlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSGFwcHkgVmlldG5hbWVzZSAoYW5kIENoaW5lc2UgdG9vKSBOZXcg WWVhciENCg0KICBJdCdzIHRoZSB5ZWFyIG9mIHRoZSBzbmFrZSwgbm8gaXRzIGhhcyBub3RoaW5n IHRvIGRvIHdpdGggYHB5dGhvbicsDQogIGJ1dCB3aHkgbm90IHBsYXkgW1Nuw7NrZV0gOykNCg0K ICBIYXBweSBPQ2FtbCBzbmFreSB5ZWFyIHRvIGFsbA0KDQogIDxodHRwczovL3VzMS5kaXNjb3Vy c2UtY2RuLmNvbS9mbGV4MDIwL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYLzcvNzI0ZWFkMDU4 OTYyZDEzMTU3MWY2MTJmYTg5MzlmMTg0Nzc1OGM3ZV8yXzExNDZ4MTAwMC5wbmc+DQoNCg0KW1Nu w7NrZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zYW5ldHRlL3Nub2tlPg0KDQoNClJld3JpdGluZyBT bGlwc2hvdyBpbiBPQ2FtbDogVGhlIHVuZG8tYWJsZSBtb25hZA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9ibG9nLXJld3JpdGluZy1zbGlwc2hvdy1pbi1vY2FtbC10aGUtdW5kby1hYmxlLW1vbmFkLzE2 MDY5LzE+DQoNCg0KUGF1bC1FbGxpb3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbyBPQ2Ft bGVycywNCg0KICBJIGhhdmUgcmVjZW50bHkgcmV3cml0dGVuIFtTbGlwc2hvd10ncyBlbmdpbmUg ZnJvbSBKYXZhU2NyaXB0IHRvDQogIE9DYW1sLiAgSXQgdHVybnMgb3V0IHRoaXMgcmV3cml0aW5n IHdhcyB2ZXJ5IHNhdGlzZnlpbmcsIGFuZCBtYW55DQogIG5pY2V0aWVzIGNhbWUgb3V0IG9mIGl0 LiAgSSBoYXZlIHdyaXR0ZW4gYSBibG9nIHBvc3QgYWJvdXQgYQ0KICBzcGVjaWZpY2FsbHkgaW50 ZXJlc3Rpbmcgb25lOiB0aGUgdXNlIG9mIGN1c3RvbSBgbGV0JyBvcGVyYXRvcnMgd2l0aA0KICB0 aGUgInVuZG8tYWJsZSIgbW9uYWQuIEkgaG9wZSB5b3UgZW5qb3kgdGhlIHJlYWQhDQoNCiAgVGhl IGJsb2cgcG9zdDogW0hvdyBJIGZpeGVkIFNsaXBzaG93J3Mgd29yc3QgZmxhdyB1c2luZyBPQ2Ft bCBhbmQgYQ0KICBtb25hZF0uDQoNCg0KW1NsaXBzaG93XSA8aHR0cHM6Ly9naXRodWIuY29tL3Bh bmdsZXNkL3NsaXBzaG93Lz4NCg0KW0hvdyBJIGZpeGVkIFNsaXBzaG93J3Mgd29yc3QgZmxhdyB1 c2luZyBPQ2FtbCBhbmQgYSBtb25hZF0NCjxodHRwczovL2Nob3VtLm5ldC9wYW5nbGVzZC91bmRv LW1vbmFkLz4NCg0KDQpBbm5vdW5jaW5nIGNsaW1hdGUuMC40LjANCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5ub3VuY2luZy1j bGltYXRlLTAtNC0wLzE2MDg0LzE+DQoNCg0KU3RldmUgU2hlcnJhdHQgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBbQ2xpbWF0ZV0gaXMgYSBkZWNsYXJhdGl2ZSBjb21tYW5kLWxpbmUg cGFyc2VyIGZvciBPQ2FtbC4gVGhpcyByZWxlYXNlDQogIGlzIG1vc3RseSBmb2N1c2VkIG9uIGlt cHJvdmluZyBgLS1oZWxwJyBtZXNzYWdlcyBhbmQgYWxsb3dpbmcgdGhlDQogIGNvbG91cnMgb2Yg aGVscCBtZXNzYWdlcyB0byBiZSBjb25maWd1cmVkLg0KDQoNCltDbGltYXRlXSA8aHR0cHM6Ly9n aXRodWIuY29tL2dyaWRidWdzL2NsaW1hdGU+DQoNCkFkZGVkDQrilYzilYzilYzilYzilYwNCg0K ICDigKIgQWxsb3cgaGVscCBtZXNzYWdlcyBjb2xvdXJzIHRvIGJlIGNvbmZpZ3VyZWQgKFsjN10p DQogIOKAoiBQcm9vZiBvZiBjb25jZXB0IG9mIG1hbnBhZ2UgZ2VuZXJhdGlvbiAoZGlzYWJsZWQg aW4gcmVsZWFzZSBhcyBpdCdzDQogICAgdmVyeSBpbmNvbXBsZXRlKSAoWyMxMV0pDQoNCg0KWyM3 XSA8aHR0cHM6Ly9naXRodWIuY29tL2dyaWRidWdzL2NsaW1hdGUvcHVsbC83Pg0KDQpbIzExXSA8 aHR0cHM6Ly9naXRodWIuY29tL2dyaWRidWdzL2NsaW1hdGUvcHVsbC8xMT4NCg0KDQpDaGFuZ2Vk DQrilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgQ2hhbmdlZCBkZWZhdWx0IGhlbHAgbWVz c2FnZSBjb2xvdXIgc2NoZW1lIHRvIGJlIG1vcmUgY29sb3VyLWJsaW5kDQogICAgcmVhZGFibGUN CiAgYW5kIG1vcmUgdmlzaWJsZSBvbiBsaWdodCBhbmQgZGFyayB0ZXJtaW5hbHMgKFsjN10pDQog IOKAoiBDaGFuZ2VkIGRlc2NyaXB0aW9uIG9mIGAtLWhlbHAnIGFyZ3VtZW50Lg0KDQoNClsjN10g PGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkYnVncy9jbGltYXRlL3B1bGwvNz4NCg0KDQpGaXhlcw0K 4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIFJlbW92ZSBzdXBlcmZsdW91cyBzdHlsZSByZXNldCBl c2NhcGUgc2VxdWVuY2VzIChbIzddKQ0KICDigKIgRG9uJ3QgYXBwbHkgZm9ybWF0dGluZyB0byB0 cmFpbGluZyBzcGFjZXMgaW4gYXJndW1lbnQgbmFtZXMgaW4gaGVscA0KICAgIG1lc3NhZ2VzIChb IzhdKQ0KICDigKIgUHJpbnQgYSByZWFkYWJsZSBlcnJvciB3aGVuIHRoZSBhcmd1bWVudCBzcGVj IGlzIGludmFsaWQgKFsjMTBdKQ0KDQoNClsjN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9ncmlkYnVn cy9jbGltYXRlL3B1bGwvNz4NCg0KWyM4XSA8aHR0cHM6Ly9naXRodWIuY29tL2dyaWRidWdzL2Ns aW1hdGUvcHVsbC84Pg0KDQpbIzEwXSA8aHR0cHM6Ly9naXRodWIuY29tL2dyaWRidWdzL2NsaW1h dGUvcHVsbC8xMD4NCg0KDQoxNXRoIE1pcmFnZU9TIHJldHJlYXQgTWF5IDEzdGggLSAyMHRoDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi0xNXRoLW1pcmFn ZW9zLXJldHJlYXQtbWF5LTEzdGgtMjB0aC8xNjA4NS8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeWJvZHksDQoNCiAgd2UnbGwg aGF2ZSBhbm90aGVyIE1pcmFnZU9TIHJldHJlYXQgaW4gTWF5IDIwMjUgKDEzdGggLSAyMHRoKS4g SGFwcHkNCiAgdG8gc2VlIGxvdHMgb2Ygb2xkIGFuZCBuZXcgZmFjZXMgdGhlcmUuDQoNCiAgUGxl YXNlIGp1bXAgdG8gPGh0dHBzOi8vcmV0cmVhdC5taXJhZ2Vvcy5vcmc+IGZvciBmdXJ0aGVyIGRl dGFpbHMsIGFuZA0KICBzaWduIHVwIGFuZCBzcHJlYWQgdGhlIHdvcmQgOikNCg0KICBEb24ndCBo ZXNpdGF0ZSB0byBhc2sgcXVlc3Rpb25zIGluIHRoaXMgdG9waWMuDQoNCg0KRHVuZSBkZXYgbWVl dGluZw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tZHVuZS1kZXYtbWVl dGluZy8xNDk5NC8yMj4NCg0KDQpFdGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEhpIER1bmUgZW50aHVzaWFzdHMgOnNtaWxlOiwNCg0KICBXZSB3aWxsIGhvbGQg dGhlIHJlZ3VsYXIgRHVuZSBEZXYgTWVldGluZyBvbiAqKldlZG5lc2RheSwgRmVicnVhcnksDQog IDV0aCBhdCA5OjAwKiogQ0VULiBBcyB1c3VhbCwgdGhlIHNlc3Npb24gd2lsbCBiZSBvbmUgaG91 ciBsb25nLg0KDQogIFdoZXRoZXIgeW91IGFyZSBhIG1haW50YWluZXIsIGEgcmVndWxhciBjb250 cmlidXRvciwgYSBuZXcgam9pbmVyIG9yDQogIGp1c3QgY3VyaW91cywgeW91IGFyZSB3ZWxjb21l IHRvIGpvaW46IHRoZXNlIGRpc2N1c3Npb25zIGFyZSBvcGVuZWQhDQogIFRoZSBnb2FsIG9mIHRo ZXNlIG1lZXRpbmdzIGlzIHRvIHByb3ZpZGUgYSBwbGFjZSB0byBkaXNjdXNzIHRoZQ0KICBvbmdv aW5nIHdvcmsgdG9nZXRoZXIgYW5kIHN5bmNocm9uaXplIHdpdGggdGhlIER1bmUgZGV2ZWxvcGVy cyENCiAgOm9rX2hhbmQ6DQoNCg0KOmNhbGVuZGFyOiBBZ2VuZGENCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBhZ2VuZGEgaXMgYXZh aWxhYmxlIG9uIHRoZVsgbWVldGluZyBkZWRpY2F0ZWQgcGFnZV0uIEZlZWwgZnJlZSB0bw0KICBh c2sgaWYgeW91IHdhbnQgdG8gYWRkIG1vcmUgaXRlbXMgaW4gaXQuDQoNCg0KWyBtZWV0aW5nIGRl ZGljYXRlZCBwYWdlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3dpa2kvZGV2LW1l ZXRpbmctMjAyNS0wMi0wNT4NCg0KDQo6Y29tcHV0ZXI6IExpbmtzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgTWVldGluZyBsaW5rOlsg em9vbV0NCiAg4oCiIENhbGVuZGFyIGV2ZW50OlsgZ29vZ2xlIGNhbGVuZGFyXQ0KICDigKIgV2lr aSB3aXRoIGluZm9ybWF0aW9uIGFuZCBwcmV2aW91cyBub3RlczpbIEdpdEh1YiBXaWtpXQ0KDQoN Clsgem9vbV0NCjxodHRwczovL3VzMDZ3ZWIuem9vbS51cy9qLzg1MDk2ODc3Nzc2P3B3ZD1jV05o VTFkSFExWk5Talp1T1VaQ1EwaDJieTlVZHowOT4NCg0KWyBnb29nbGUgY2FsZW5kYXJdDQo8aHR0 cHM6Ly9jYWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL2VtYmVkP3NyYz1jXzVjZDY5OGRmNjc4 NGUzODViMWNkY2RjMWRiY2ExOGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzczMTklNDBn cm91cC5jYWxlbmRhci5nb29nbGUuY29tPg0KDQpbIEdpdEh1YiBXaWtpXSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvd2lraSNkZXYtbWVldGluZ3M+DQoNCg0KT3RoZXIgT0NhbWwgTmV3 cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZy b20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBm cm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9n XS4NCg0KICDigKIgW0hvdyB3ZSBhY2NpZGVudGFsbHkgYnVpbHQgYSBiZXR0ZXIgYnVpbGQgc3lz dGVtIGZvciBPQ2FtbF0NCiAg4oCiIFtUYXJpZGVzOiAyMDI0IGluIFJldmlld10NCg0KDQpbdGhl IG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltIb3cgd2UgYWNj aWRlbnRhbGx5IGJ1aWx0IGEgYmV0dGVyIGJ1aWxkIHN5c3RlbSBmb3IgT0NhbWxdDQo8aHR0cHM6 Ly9ibG9nLmphbmVzdHJlZXQuY29tL2hvdy13ZS1hY2NpZGVudGFsbHktYnVpbHQtYS1iZXR0ZXIt YnVpbGQtc3lzdGVtLWZvci1vY2FtbC1pbmRleC8+DQoNCltUYXJpZGVzOiAyMDI0IGluIFJldmll d10NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNS0wMS0yMC10YXJpZGVzLTIwMjQtaW4t cmV2aWV3Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBo YXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xs IG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9y IHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNo IHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0 byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1l c3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFy Y2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBv ZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNz Pg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwt bGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0K DQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Ea8JxvQb; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=D3aFY49m; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 98F6C49108 for ; Tue, 11 Feb 2025 07:18:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=1r2GRZMgYYWadMVDpiu1iu0WPWat/JkgwJuCbTC0xEM=; b=Ea8JxvQbwAiD5M5LBa8p0UuDNtxl9XC7JpG2xg7MfR23ADkFX2pqiWD3 QiT+Honx5BZObayu4TZpJRppo447vFAFlCR0/GyDY7dpV/fncP0pUPh0i 4/k4bbT7mQIoCKtfH0KL7Xf5fc8p/wrOxx5LSKEYkJh3MrjfkgkVfmdj1 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,276,1732575600"; d="scan'208,217";a="207611522" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Feb 2025 08:17:59 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B7EEDE0D24; Tue, 11 Feb 2025 08:17:58 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id DCA52E0260 for ; Tue, 11 Feb 2025 08:17:55 +0100 (CET) IronPort-SDR: 67aaf9a3_K8LO9KZrEa7aG3CeUiTGw4nynWfkFVKE1CVociOA/dnJj9X mkKzLExkUXmnh2vG6ziX7B5cuLpb9m0AA6UwkTw== X-IPAS-Result: =?us-ascii?q?A0G9CQD/+KpngSIeaIFaglwCgT9bKBkBXQZaMwcISGGDd?= =?us-ascii?q?YNPjiGUBocrgRCBVhSBLDgVAQMBDS4BDAYBAgQBAQMBAgGCDIIuRgIWinACH?= =?us-ascii?q?wYBBDAJDgECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQE9BUmFe?= =?us-ascii?q?w1JAQEECwGBalFBMGUJBgEBAQEBAQEBAScBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBgScEBhMBASsNGCMDEAQHAwIED?= =?us-ascii?q?QE1FwESGoJpgh9FAwQBDAaUM5tLen8zgQGCDAEBBoEIPgMLAgIDDy4B2geBG?= =?us-ascii?q?0oJgUiFbIJJGgEqSGoChEgJhDMnD4FVRIQOb4FQehcBAQEBgSQRBwEBTQmDJ?= =?us-ascii?q?YJpgjOBQIIEgWqGS4InghKNboshgUciAyYzLAFVExcLBwVhgRADKjYxgUZ6O?= =?us-ascii?q?YIOaUk6Ag0CNYIeJFiCK4MegTuEQ4RLhVqCEoIRiR4dQAMLbT03FBueWQlsA?= =?us-ascii?q?TyDTw4KNBd4ARMWAQFPBQQ5SQ4MCjQLCwItkn0tnVmUXTQHhB6BXQYMiQWBJ?= =?us-ascii?q?ItiihmEA4FXiy+ZSSKYWiKJW4ElCYJZiHOMNScFhVaBZzougRsMBzMaMEOCZ?= =?us-ascii?q?wlGHA+PTwECgkmBAT2BJoE7OTvAWEI1AgEBBzECBwEKAQEDCYVFHQEBgwSCF?= =?us-ascii?q?4UnNIFLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 wSR IronPort-HdrOrdr: A9a23:YAzIKKmKn0lH+9CqCp1Ldj0EbizpDfIR3DAbv31ZSRFFG/Fw9v re/8jzsCWftN9/Yh8dcLy7VZVoIkm9yXcW2+gs1N6ZNWGMhILCFu5fBOXZrwHIKmnXyap21K trcaRyYeeAb2RSvILd+wf9N94hxbC8gcSVbArlvhJQcT0= X-Talos-CUID: =?us-ascii?q?9a23=3AW95FDWv7q5snfvVM3XT4wUoJ6IshfUzS8Xb3B3a?= =?us-ascii?q?/Lm9ARZ6lbUKq2vh7xp8=3D?= X-Talos-MUID: 9a23:Fi8VbwiIgBOZO97qQwoESMMpC+F5vKWeE3k3qtYI5peZOQMtIxqCk2Hi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,276,1732575600"; d="scan'208,217";a="207611487" X-MGA-submission: =?us-ascii?q?MDF514ix3hCBMzAi2KrWHS+oPNS6ioOgcGopmN?= =?us-ascii?q?a6sf8g17sdh+stNRVL/EiC4tVqCaR7kRe9a7fnA52SPXmxKPo/VLiiKu?= =?us-ascii?q?Ic59g6k5rk7ggpyNtrQc96TaBQFHRxN9XOGr/7/lJx75PyFxHK1CZB0z?= =?us-ascii?q?0D9SfiV9rA7CvtQ2BR4GA7WA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Feb 2025 08:17:55 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 01141564ABA; Tue, 11 Feb 2025 08:17:53 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1739258274; bh=6Q8bOwuTPZgQR2GicMgGc2bC9Za/XINIAb6aIiePqEA=; h=From:To:Subject:Date:Message-ID; b=D3aFY49mavAQk4wq4uYNdnSMjSIoV2V4i1T9dYcOPBpZj/ftm1Xww9T1XFsjXqQAi akPPab2mCJQ15ClJ6eXoV3fB85hD1Qk4lH9C3MUSqb1ICWBriZCPsCqgcuaz5LwJeS /5DZJi6d1OcQyLM4uNmXDEAbuaGo1/EnwsubZtEw= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 11 Feb 2025 08:17:52 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 11 08:17:54 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.489665, queueID=53278564ABC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19266 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMDQgdG8gMTEsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCm9jYW1s bWlnLCBhIHRvb2wgdG8gcmV3cml0ZSBvY2FtbCBjb2RlLCBhbmQgY29tcGxlbWVudCBgW0BAZGVw cmVjYXRlZF0nDQpNb3BzYSAxLjEg4oCTIE1vZHVsYXIgT3BlbiBQbGF0Zm9ybSBmb3IgU3RhdGlj IEFuYWx5c2lzDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0Kb2NhbWxtaWcsIGEgdG9v bCB0byByZXdyaXRlIG9jYW1sIGNvZGUsIGFuZCBjb21wbGVtZW50IGBbQEBkZXByZWNhdGVkXScN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sbWlnLWEtdG9vbC10by1y ZXdyaXRlLW9jYW1sLWNvZGUtYW5kLWNvbXBsZW1lbnQtZGVwcmVjYXRlZC8xNjA5MC8xPg0KDQoN CnYtZ2IgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIaSwNCg0KICBJJ20gZ2xhZCB0byBhbm5vdW5jZSBvY2FtbG1pZywgYSBjb21tYW5k IGxpbmUgdG9vbCBmb3IgcmV3cml0aW5nIG9jYW1sDQogIHNvdXJjZSBjb2RlIHdpdGggYWNjZXNz IHRvIHNjb3BlIGFuZCB0eXBlIGluZm9ybWF0aW9uLg0KDQogIEFzIHRoZSBzaW1wbGVzdCBleGFt cGxlIG9mIHdoYXQgaXQncyBpbnRlbmRlZCBmb3IsIGxldCdzIHNheSBhbg0KICBvcGFtLWluc3Rh bGxlZCBsaWJyYXJ5IEEgcHJvdmlkZXMgdGhpcyBpbnRlcmZhY2U6DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiB2YWwgbmV3X25hbWUgOiBpbnQgLT4gaW50DQogIOKUgiANCiAg4pSCIHZhbCBv bGRfbmFtZSA6IGludCAtPiBpbnQNCiAg4pSCIFtAQG1pZ3JhdGUgeyByZXBsID0gUmVsLm5ld19u YW1lIH1dDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIGFuZCB5b3VyIHJlcG9zaXRvcnkgY29udGFp bnMgYSBmaWxlIGIubWw6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgXyA9IEEub2xk X25hbWUgMQ0KICDilJTilIDilIDilIDilIANCg0KICB0aGVuIHlvdSBjb3VsZCBydW46DQoNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIGdpdCBkaWZmIGIubWwNCiAg4pSCICQgb2NhbWxtaWcg bWlncmF0ZSAtdw0KICDilIIgJCBnaXQgZGlmZiBiLm1sDQogIOKUgiAtbGV0IF8gPSBBLm9sZF9u YW1lIDENCiAg4pSCICtsZXQgXyA9IEEubmV3X25hbWUgMQ0KICDilJTilIDilIDilIDilIANCg0K ICBPYnZpb3VzbHksIGl0J3Mgbm90IGxpbWl0ZWQgdG8gcmVuYW1lcy4NCg0KICBXaGVuIEkgbWVh bnQgYnkgImNvbXBsZW1lbnQgYFtAQGRlcHJlY2F0ZWRdJyIgaXMgdGhhdCBpbnN0ZWFkIG9mDQog IHByb3ZpZGluZyBhIHRleHR1YWwgZGVzY3JpcHRpb24gYFtAQGRlcHJlY2F0ZWQgInBsZWFzZSB1 c2UgdGhpcyB0aGluZw0KICBpbnN0ZWFkIiBdJyAsIHlvdSBnZXQgdG8gcHJvdmlkZSBhbiBleGVj dXRhYmxlIGRlc2NyaXB0aW9uLiBUaGUgZ29hbA0KICBpcyB0byByZWR1Y2UgdGhlIGZyaWN0aW9u IHdoZW4gdGhlIGludGVyZmFjZSBvZiBhIGxpYnJhcnkgZXZvbHZlcy4gSWYNCiAgcGVvcGxlIGdl dCBpbiB0aGUgaGFiaXQgb2YgcnVubmluZyB0aGlzIHJlZ3VsYXJseSAoYWZ0ZXIgZXZlcnkgYG9w YW0NCiAgdXBncmFkZX4vfmR1bmUgcGtnIGxvY2snLCBzYXkpLCB0aGVuIGl0IGNvdWxkIGFsc28g YmUgYSB3YXkgdG8gZ2V0DQogIHVzZXJzIHRvIHN3aXRjaCB0byBuZXcgaW50ZXJmYWNlcyB3aXRo b3V0IGhhdmluZyB0byBkZXByZWNhdGUgdGhlIG9sZA0KICBpbnRlcmZhY2VzIGltbWVkaWF0ZWx5 Lg0KDQogIEFkZGl0aW9uYWxseSwgdXNpbmcgdGhhdCBhbmQgYSBjb3VwbGUgb2Ygb3RoZXIgYnVp bHRpbiB0cmFuc2Zvcm1hdGlvbnMNCiAgbGlrZSByZW1vdmluZyB+b3Blbn5zLCB5b3UgY2FuIGV4 ZWN1dGUgc29tZSByZWZhY3RvcmluZ3MsIHdpdGhvdXQNCiAgbGVhcm5pbmcgYW55dGhpbmcgbGlr ZSBwcHhsaWIgb3IgdGhlIG9jYW1sIGFzdCwgZm9yIGluc3RhbmNlOg0KDQogIOKAoiBbUmVuYW1p bmcgb3BlcmF0b3JzXSAobm90IGVhc3kgd2l0aCBzZWQgb3IgdGhlIGxpa2UsIGJlY2F1c2UgdGhl DQogICAgb3BlcmF0b3JzIGNoYW5nZSBwcmVjZWRlbmNlKQ0KICDigKIgW1N3aXRjaGluZyBjb2Rl IHVzaW5nIGJvdGggU3RkbGliIGFuZCBDb3JlIHRvIG1vc3RseSBDb3JlXQ0KDQogIElmIHRoYXQg cGlxdWVkIHlvdXIgaW50ZXJlc3QsIGhlcmUgaXMgbW9yZSBpbmZvcm1hdGlvbiBhYm91dCBbd2hh dA0KICBvY2FtbG1pZyBkb2VzXSwgYW5kIFt1c2luZyBpdF0uDQoNCiAgVGhpcyBpcyBkZWNpZGVk bHkgd29yayBpbiBwcm9ncmVzcywgbWFueSB0aGluZ3MgYXJlIG5vdCBmdWxseQ0KICBpbXBsZW1l bnRlZCwgYW5kIGl0IG5lZWRzIGEgbG90IG9mIHBvbGlzaCwgYnV0IHRoZSBleGlzdGluZw0KICBm dW5jdGlvbmFsaXR5IGFzIGlzIHNob3VsZCBzdGlsbCBiZSBpbnRlcmVzdGluZy4NCg0KDQpbUmVu YW1pbmcgb3BlcmF0b3JzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS92LWdiL0dpbGxpYW4vY29tbWl0 L2UxNWFjMjBhNWZhYzA4NDlkYWU1MTUyM2QxYjczZjE2MTJmOTc2ZTU+DQoNCltTd2l0Y2hpbmcg Y29kZSB1c2luZyBib3RoIFN0ZGxpYiBhbmQgQ29yZSB0byBtb3N0bHkgQ29yZV0NCjxodHRwczov L2dpdGh1Yi5jb20vdi1nYi9vcnRvZ3JhZmUvY29tbWl0L2IwYjZhMGMzMjNlZGI2N2MwM2FlOTM4 ZDEyMmU3M2I0ZjZhOGFmZmM+DQoNClt3aGF0IG9jYW1sbWlnIGRvZXNdDQo8aHR0cHM6Ly9naXRo dWIuY29tL3YtZ2Ivb2NhbWxtaWcvYmxvYi9tYWluL2RvYy93aGF0Lm1kPg0KDQpbdXNpbmcgaXRd IDxodHRwczovL2dpdGh1Yi5jb20vdi1nYi9vY2FtbG1pZy9ibG9iL21haW4vZG9jL3VzaW5nLm1k Pg0KDQoNCk1vcHNhIDEuMSDigJMgTW9kdWxhciBPcGVuIFBsYXRmb3JtIGZvciBTdGF0aWMgQW5h bHlzaXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1vcHNhLTEtMS1t b2R1bGFyLW9wZW4tcGxhdGZvcm0tZm9yLXN0YXRpYy1hbmFseXNpcy8xNjA5NS8xPg0KDQoNClJh cGhhw6tsIE1vbmF0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBhbGwsDQoNCiAg T24gYmVoYWxmIG9mIGFsbCBpdHMgZGV2ZWxvcGVycywgSSBhbSBnbGFkIHRvIGFubm91bmNlIHRo ZSByZWxlYXNlIG9mDQogIFtNb3BzYSB2MS4xXSEgWW91IGNhbiBqdXN0IGBvcGFtIGluc3RhbGwg bW9wc2EnIC4NCg0KICAqV2hhdCBpcyBNb3BzYT8qIE1vcHNhIHN0YW5kcyBmb3IgTW9kdWxhciBh bmQgT3BlbiBQbGF0Zm9ybSBmb3IgU3RhdGljDQogICBBbmFseXNpcy4gSXQgYWltcyBhdCBlYXNp bmcgdGhlIGRldmVsb3BtZW50IGFuZCB1c2Ugb2Ygc3RhdGljDQogICBhbmFseXplcnMuIE1vcmUg c3BlY2lmaWNhbGx5LCBNb3BzYSBpcyBhIGdlbmVyaWMgZnJhbWV3b3JrIGZvcg0KICAgYnVpbGRp bmcgc291bmQgc3RhdGljIGFuYWx5emVyIGJhc2VkIG9uIHRoZSB0aGVvcnkgb2YgYWJzdHJhY3QN CiAgIGludGVycHJldGF0aW9uLiBNb3BzYSBpcyBpbmRlcGVuZGVudCBvZiBsYW5ndWFnZSBhbmQg YWJzdHJhY3Rpb24NCiAgIGNob2ljZXMuIERldmVsb3BlcnMgYXJlIGZyZWUgdG8gYWRkIGFyYml0 cmFyeSBhYnN0cmFjdGlvbnMgKG51bWVyaWMsDQogICBwb2ludGVyLCBtZW1vcnksIGV0Yy4pIGFu ZCBzeW50YXggaXRlcmF0b3JzIGZvciBuZXcgbGFuZ3VhZ2VzLiBNb3BzYQ0KICAgZW5jb3VyYWdl cyB0aGUgZGV2ZWxvcG1lbnQgb2YgaW5kZXBlbmRlbnQgYWJzdHJhY3Rpb25zIHdoaWNoIGNhbg0K ICAgY29vcGVyYXRlIG9yIGJlIGNvbWJpbmVkIHRvIGltcHJvdmUgcHJlY2lzaW9uLg0KDQogICp2 MS4xIGNoYW5nZXMuKiBUaGlzIG5ldyB2ZXJzaW9uIGJyaW5ncyBzZXZlcmFsIGV4cHJlc3Npdml0 eSwNCiAgIHByZWNpc2lvbiBhbmQgaW50ZXJmYWNlIGltcHJvdmVtZW50cywgbm90YWJseToNCg0K ICDigKIgW1RyYWNlIGFuZCBzdGF0ZSBwYXJ0aXRpb25pbmddLiDimqDvuI8gaW50cm9kdWNlcyBb YnJlYWtpbmcgY2hhbmdlc10gaW4NCiAgICB0aGUgQVBJIG9mIGRvbWFpbnMuDQogIOKAoiBbU3Vn Z2VzdGlvbnMgdG8gdHJpZ2dlciBhdXRvbWF0aWMgdGVzdGNhc2UgcmVkdWN0aW9uIHdoZW5ldmVy IE1vcHNhDQogICAgY3Jhc2hlc10NCiAg4oCiICogQXMgYSBzaWRlLWVmZmVjdCwgTW9wc2EgaXMg YWJsZSB0byBnZW5lcmF0ZSBwcmVwcm9jZXNzZWQgZmlsZXMNCiAgICAgIGZyb20gbWFrZSB0YXJn ZXRzIHVzaW5nIG9wdGlvbiBgLWMtcHJlcHJvY2Vzcy1hbmQtZXhpdD1maWxlLmknLA0KICAgICAg d2hpY2ggbWlnaHQgYmUgdXNlZnVsIGZvciBvdGhlciB1c2VycyB0b28hIFRoaXMgaGFzIGJlZW4N CiAgICAgIGV4cGVyaW1lbnRlZCBvbiBvdXIgY29yZXV0aWxzIGJlbmNobWFya3MsIGFuZCBjYW4g YWxzbyBiZSB1c2VkIHRvDQogICAgICBnZW5lcmF0ZSB0aGUgcHJlcHJvY2Vzc2VkIGZpbGVzIHVz ZWQgaW4gdGhlIFtTb2Z0d2FyZS1WZXJpZmljYXRpb24NCiAgICAgIEJlbmNobWFya3NdLg0KICDi gKIgQmFzaCBjb21wbGV0aW9uIHN1cHBvcnQsIHRoYW5rcyB0byBbYXJnLWNvbXBsZXRlXSBkZXZl bG9wcGVkIGJ5DQogICAgW1NpbW1vIFNhYW5dLg0KDQogIFtIZXJlIGlzIHRoZSBkZXRhaWxlZCBj aGFuZ2Vsb2ddLg0KDQoNCltNb3BzYSB2MS4xXSA8aHR0cHM6Ly9naXRsYWIuY29tL21vcHNhL21v cHNhLWFuYWx5emVyLz4NCg0KW1RyYWNlIGFuZCBzdGF0ZSBwYXJ0aXRpb25pbmddDQo8aHR0cHM6 Ly9tb3BzYS5naXRsYWIuaW8vbW9wc2EtYW5hbHl6ZXIvdXNlci1tYW51YWwvb3B0aW9ucy9nZW5l cmFsLmh0bWwjcGFydGl0aW9uaW5nPg0KDQpbYnJlYWtpbmcgY2hhbmdlc10NCjxodHRwczovL2dp dGxhYi5jb20vbW9wc2EvbW9wc2EtYW5hbHl6ZXIvLS9tZXJnZV9yZXF1ZXN0cy8xMzAjYnJlYWtp bmctY2hhbmdlcz4NCg0KW1N1Z2dlc3Rpb25zIHRvIHRyaWdnZXIgYXV0b21hdGljIHRlc3RjYXNl IHJlZHVjdGlvbiB3aGVuZXZlciBNb3BzYQ0KY3Jhc2hlc10NCjxodHRwczovL21vcHNhLmdpdGxh Yi5pby9tb3BzYS1hbmFseXplci91c2VyLW1hbnVhbC9kZWJ1Z2dpbmcvYXV0b21hdGVkLXRlc3Rj YXNlLXJlZHVjdGlvbi5odG1sPg0KDQpbU29mdHdhcmUtVmVyaWZpY2F0aW9uIEJlbmNobWFya3Nd DQo8aHR0cHM6Ly9naXRsYWIuY29tL3Nvc3ktbGFiL2JlbmNobWFya2luZy9zdi1iZW5jaG1hcmtz I3Byb2dyYW1zPg0KDQpbYXJnLWNvbXBsZXRlXSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNr YWdlcy9hcmctY29tcGxldGUvPg0KDQpbU2ltbW8gU2Fhbl0gPGh0dHA6Ly9zaW02NDIuZXUvPg0K DQpbSGVyZSBpcyB0aGUgZGV0YWlsZWQgY2hhbmdlbG9nXQ0KPGh0dHBzOi8vZ2l0bGFiLmNvbS9t b3BzYS9tb3BzYS1hbmFseXplci8tL2Jsb2IvZmIzZmE5YmRmOWEyMjVmMDQxYzhkMDNkZmEyNDg5 OTFmOTJjNjc0ZC9DSEFOR0VMT0cubWQ+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1s Lm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0Nh bWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIg W01pcmFnZU9TIG9uIE9DYW1sIDUhXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczov L29jYW1sLm9yZy9ibG9nLz4NCg0KW01pcmFnZU9TIG9uIE9DYW1sIDUhXQ0KPGh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDI1LTAyLTA2LW1pcmFnZW9zLW9uLW9jYW1sLTU+DQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4N Cg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFu LnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxo dHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2ht aXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 04 to 11, 20= 25.

    ocamlmig, a tool to rewrite ocaml code, and complement [= @@deprecated]

    v-gb announced

    Hi,

    I'm glad to announce ocamlmig, a command line tool for rewriting ocaml sour= ce code with access to scope and type information.

    As the simplest example of what it's intended for, let's say an opam-instal= led library A provides this interface:

    val new_name : int ->=
     int
    
    val old_name : int -> int
    [@@migrate { repl =3D Rel.new_name }]
    

    and your repository contains a file b.ml:

    let _ =3D A.old_name 1
    

    then you could run:

    $ git diff b.ml
    $ ocamlmig migrate -w
    $ git diff b.ml
    -let _ =3D A.old_name 1
    +let _ =3D A.new_name 1
    

    Obviously, it's not limited to renames.

    When I meant by "complement [@@deprecated]" is that instead of= providing a textual description [@@deprecated "please use this thing= instead" ] , you get to provide an executable description. The goal= is to reduce the friction when the interface of a library evolves. If peop= le get in the habit of running this regularly (after every opam upgra= de~/~dune pkg lock, say), then it could also be a way to get users t= o switch to new interfaces without having to deprecate the old interfaces i= mmediately.

    Additionally, using that and a couple of other builtin transformations like= removing ~open~s, you can execute some refactorings, without learning anyt= hing like ppxlib or the ocaml ast, for instance:

    If that piqued your interest, here is more information about what ocamlmig does= , and u= sing it.

    This is decidedly work in progress, many things are not fully implemented, = and it needs a lot of polish, but the existing functionality as is should s= till be interesting.

    Mopsa 1.1 – Modular Open Platform for Static Analysis

    Rapha=C3=ABl Monat announced

    Dear all,

    On behalf of all its developers, I am glad to announce the release of Mopsa v1.1! You can jus= t opam install mopsa .

    What is Mopsa? Mopsa stands for Modular and Open Platform for Static= Analysis. It aims at easing the development and use of static analyzers. M= ore specifically, Mopsa is a generic framework for building sound static an= alyzer based on the theory of abstract interpretation. Mopsa is independent= of language and abstraction choices. Developers are free to add arbitrary = abstractions (numeric, pointer, memory, etc.) and syntax iterators for new = languages. Mopsa encourages the development of independent abstractions whi= ch can cooperate or be combined to improve precision.

    v1.1 changes. This new version brings several expressivity, precisio= n and interface improvements, notably:

    Here is the detailed changelog.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=L7adK5yx; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=O6kEiFkz; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 089D149104 for ; Tue, 18 Feb 2025 14:33:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=RtMhKqu+pB/dB1RjFF1VXBfzY+Rwk3VUCCjeLUAWsG0=; b=L7adK5yxUmeAUOs092st50YESpffKc7tJnXFd4a4kJ/8e49zUaA1M5Ai 24R650UuS0B+9xNMpcjkb1BXQ+rafcuKuzXMak5+ojIGiffFicgqyQ23L gvbCpAc/nOyCVGV0nlsItSln66yuKm/gbykUYNP5McCnKAD5W87qsXkGU M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,296,1732575600"; d="scan'208,217";a="208837703" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Feb 2025 15:33:25 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 38B49E0D22; Tue, 18 Feb 2025 15:33:25 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5D30AE0260 for ; Tue, 18 Feb 2025 15:33:21 +0100 (CET) IronPort-SDR: 67b49a30_QtSU/rVIWcNTHKUjnRBejYcabEJZqrBcFkNodM3NhVBlLJ6 YrqTIg5IIoFvGcjr2i0jqiPKTB3eGzIj2KrT8eQ== X-IPAS-Result: =?us-ascii?q?A0FQBwDJmLRndyIeaIFaglwCgT9bKBkBY1ozBwhIhFaDT?= =?us-ascii?q?44hkUqKd4FWFIERAy4jFAEDAQ0uAQUNAQIEAQEDAQIBggyCdAKLDQIfBgEEM?= =?us-ascii?q?gcOAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABQ0mFew1JAQEEC?= =?us-ascii?q?wGBalFxgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQECBAgBBxwQKz4LChMBASsBDBgjAxQBBgMCEQE1FwESFAaCEFmCH0UDB?= =?us-ascii?q?QwGlGeaeho3eoEygQGCDAEBBoEIPgIBCwICAwEOCSUB2geBZQmBSIVsgkkaA?= =?us-ascii?q?SpIagKESAmEMycPgVVEgRQBNYJEb4JKFwIBARiBCAQFARECAQgSDyQJgyWCa?= =?us-ascii?q?YIcF0p2g26GSIInghKDdIgEMo5IgUdLMywBVRMXCwcFYYEQAyo0MYFGejmCD?= =?us-ascii?q?mlJOgINAjWCHiRYgiuDHoE6hEOES4VdghKCBYlEgTYdQAMLbT03FBufUwk2N?= =?us-ascii?q?gE8g18OOEQkKAULCRcBDRMwCA4NEgwjGQ0FBQQrHwkCOgOSUhAYBI9wjQ+BB?= =?us-ascii?q?JNwbTQHhB6BXQYMiQWBJJV8gR+CZIFXiy+ZSSKYWyKEe4RhgSUJYIF5lSsqB?= =?us-ascii?q?AQYgToxg0uBbggrPDBdDAczGjBDgmcJCgwwHA+SG4E+gxo7gkEsvSxCNQIBA?= =?us-ascii?q?TgCBwEKAQEDCYViAQGDBIIXhSqBSwEB?= IronPort-PHdr: A9a23:gVMHqBJUzhUuplaslNmcuCxpWUAX0o4c3iYr45Yqw4hDbr6kt8y7e hCEv7M11BSXBNiAo9t/yMPo8InYGlY8qa6bt34DdJEeHzQksu4x2zIaPcieFEfgJ+TrZSFpV O5LVVti4m3peRMNQJW2aFLduGC94iAPERvjKwV1Ov71GonPhMiryuy+4ZLebgtWiDanfb9+M Bq6oATMusQWj4ZpN7o8xAbOrnZUdOtawn9lK0iUkxjg+Mm74YRt8z5Xu/Iv9s5AVbv1cqElR rFGDzooLn446tTzuRbMUQWA6H0cUn4LkhVTGAjK8Av6XpbqvSTksOd2xTSXMtf3TbAwXjSi8 rtrRRr1gyoJKzI17GfagdF3g6xGvRKhvAR/zJDIb4GJOvR+eabdcskbRWpHQ81dUyNMD4e5Y 4YJEuEPP/tXr5PlqlUOsxWwGAeiCuDgxTBUnXL5x7E23v47HA3awAAtHdQDu2nUotXvM6cSV Pi4wbXMzTrZafNdxCrz55TIchAkoPGMQa5wetfWxEY1EwPKlFOQpZb+PzyJ1uQNtmmb7/Z8V e+0k24nrAVxozizxsgylobJhoQVylHd9SVk3ok5P9q4SFR0YdO9FpZbqi6VOZdsTMw4X2Fop Dg1yqcAuZOjeCUHx5QpyRDCZvKJb4WE/BbuWeieLDpminxpZryyiRiz/EWg1+DyWMm53VZJo yRFktTAqnIA2hzd5MWbRfVw/kGs0iuB2QDU7+FLO0E0lazDJp453LEwipsTsVjdES/un0X2i aqWeVs+9uiu9evnfq3qppiAOIBujwH+Nr4imsulAeQ3KgQBQ26b+f6n1LH58035Wq1Ggecsk qneqJDVO8obqbSiAw9JzIkj7QiwACq939sGgXkGIkxKdwyBj4TzNVHOOuj0Auulg1uyijhr2 /HGPqP/DZrRKXjDlbLhfbF7605H0gYzyspf551MBr4cPv3zRFX9tMDfDhMhPAy0wvrnCNVg1 owFQ26AHqiZMKbKvVCU4eIvJuyMZI4JuDbhNfcq+eTijXokllMFfKmp24EXaHGiEfh8LUWZe 2Lgg9YGEWcNuwoyVvHqiEaaXT5cYHayWK085jUlB468EYjDQYWtjbqc1ym4Bp1bfn1KBk6IH HvyaomIR/gBZDicL8N9iDAJW7esR5c82RygqQP20aRrI+rb9yECq57vycJ56/PcmBw28zF/E tqQ02WQT2FvgmMHWSU20r1+oU181FiOybR0jvpFHtJJ/fxJSB01NZvEwux6Fd/yXgXBc8+MS FepX9mqGykxTtU1w94Of0ZyBcmtjhDF3yqrGr8ViqKECIYz8qLG0Hj9P8d9y3DY26k9l1QqX 9VDOGm8iqJi6wTeCJTFnkuFm6qwe6kR0zbB9GKZwmqPuEFYXhRwUaLAXX0He0XYscn36l/aQ rG0FbsnKQpBxNaNJaVOctDplVJGRPPjOdTCfW2+h2ewBRCJxrOVcYrlZX8R3CLHCEgLiw0c5 3KGOhI4Biu7uGLREDxuFVfuY0Pw7elzs2i0TkgpzwGMc0JuyaG19gQQhfGTRPIfxLUEuD0uq zlsGlayxMrZC8CcqAp5YKVcfdQ97U9a2W7BrQxyIoSgL7x+hl4Zawl4o1nh1xBzColZlcgqr WgqzBZpJKKD0FJBciuY0orqNr3WLGny5hGvZLTM1lHQytbFspsIvb48tFOp9FWtCUwK92phl d9Yzy3Yrp7DCQ5XVZPqTm428QJ7rvfUeHoT/YTRgFRoOK/8iTTC3tM1GKNxwxKpeZFEO6OBF RPuO9UdA9myJecqnVmwcx9CO/pdov1nd/i6fueLjfb4dN1rmyir2DgWiGgc+keF9i4nD/XNw 45A2PaAmA2OSzb7il6l9MHxg4FNIz8ITSKk0SaxIolXa+VpeJoTT3+0Kpi+wtx4wYXmW3tZ6 EKLH1QCydOkchqUbkXg0EtXz0tE6We/l36Axidv2yossrLZ2SXPx+r4cx9SAVRwHDxahkztd LaW2sgdWFm0YgMpkhq8+Eu8wLJU8a17Jm+VWkxIeinqM0loVba2vbeZJcsT+NUvqyoEGP+kb wWiQ6Xm6wAfzzulH2Zaw2UjcCq2v5zigxFgoGeNdTBrq37IZcx7xRHe/cHRA/lL0VLqXQFej j/aThi5NtitppCPkovb9/u5TySnX4FSdi/iycWBsjG67CtkG0/3mff7gdDhHQUgtE2zn9B3S SXFqgr9aYj3xuy7N+xgZExhGF777YJzBIh/loI6gJxY12Idg92Z+n8OkGG7Nts+u+q2ZX4EQ 3gQyN7Q4RT58FVkKmOVyon5UHSE38YnYMO1IysX1i8788FWGfKM9rUX+Ek96lG8rA/Xfb18h mJEk6posSZGxbpR/lFxnUD/SvgIEEJVPDLhjUGN5tG69+BMYXq3NKO3zAx4lMygC7eLpkddX mz4c9EsB3wVjI03PVTS3Xn08oyhdsPXaIdZjSevy0L4hPNUfawTw+INgTt7NGn9u3w81uN9i gZhiJi+tY7BMG5t+aOlHjZSMSDzbM4IvDSxneBZhMncjOXNVt1xXy4GWpflV6fiGTYbs7L8P AaLESEggm+cHavDEASf7kZ/sn+JFIqkfSLyRjFR3ZBpQx+TI1ZaiQYfUWAhn5I3IQutwdTob EZz4j15CkfQkhJX0aooMhD+VjyavwK0cnIvT4DZKhNK7wZE7kOTMMqE7+s1ETsKtpGmqQWML CScaWEqRSkyYHfcUmjoJbj72/uV6++cF/azJPvIYKyTpKpZTfjdzJam1M199DaJN9mTFnNlE vsw11EFWCxpXcPDlFBtA2QbmjnMYMiSuBqnsnQt/4bmqKitA1qpvtfHAqAaKdh1/hGqnaqPf /Wdgip0M3c9tNtExHPFzqQewE9Hjihvcze3FrFT/SXJTa/WhupWF0tCMXI1bZMUqflkmFIRa qu5wpvv27V1j+A4EQJAXF3lwYSyYNASZnq6LBXBDVqKM7KPIXvKxdv2aOWyU+417q0cuhuut DKcC0KmMC6EkmyjbCqUabR0hzqaaSJ87Zm6dgdxBGPjStP/dxD9N8V42DQyyLtynXjKMG8AL RB2dF5LpbCLqyYEkrN4AWMLvR8HZaGU3j2U6eXVMMNcisFQWnFMnPlbtUoYnqNS6DBYSfd1n irLs9MopEupx+CLwzwhSxFOrzdXmKqBulhkMqjCsJwcSTDD5h1HvgDyQ1wa4tBiDNPooaVZz NPCwbnyJDl1+NXR5cIABsLQJZHPID87PBHuAjKREBodQGvhKzTEn0IE2qL3lDXdvt0gp5Prg pZLVrJLSAl/CKYBEko8VJ8DOMslB2l11+fD0IhTvTzl8FGSRd0G7MmdB7TLWampc27f1uQhB VNAgrLgcdZCb8uigRUkNAM8xdyVUwnRRY4f+HU5N11o+UkVonEsEWQ+hhC3NA/ysC1ITpvW1 lZ1ixMgM751rG6+vw47fgiT9npsnERjy4q+3zzDL2KudO/1VIVSQUIYrmAJO4jgC0ZwZAy2x gl/MSvcAqlWl/1mfHxqjwnVvd1OH+RdROtKek1YyfaSbvQumVNSz0fvjVdA/vfAAIB+mRECd I716WpH3xN/YdU1I63JOacPyUJfzq6DpS6n0OktzRRWfhxctjrKJGhT4ApTavEvPE/KtqR05 BaHmidfdWRETPcsrv9wtws8N+mG0yP8wutDJ0S2ZKSUK6KUvXSFlNbdGwlhkBpQyw8epf4tj ZRGEQLcTU0kwbqPGg5cMMPDLVoQdM9O7D3Iej7It+zRwJVzNoH7F+byTObIurxH5yDsVAsvA YkI6dwMW5e210SNZ/zdF+ZQ8R425VHVBgCdC/BYZB+AkDEGutyyipht0txUIjgbR352MSC2+ qr/rAg3hvGOR5EzPmdcWZELfCFTOoXyi2tCsnJMASPimPoe0xSH5iTgqz74CSmlKcJkYOaIa BhsDtCv5Dh59LK5ww2ykN2WNyTxMtJsvcXK4OURqsOcCv9aerJ6tl/Vh4hSQ3H5G36KC9O+I IL8LpU9ddGhQGjvSUSx0nhmKqW5dMboNKWDhhvkAJpZoJXOli52LtezT3kXU1J5o+VJjEqTT QcEfpwwbAWuslgucaulL1XBuj1La36qLSpKQvJfy+SjerERyDAjPLfSIJoIS4FjifGw9V8RS ZoKiBDH2PvlYJNRA3GbJw== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:35aohqEm7zyolxn/pLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: =?us-ascii?q?9a23=3Avy+pEmh7p1LA1zZOukAFVimDmDJueHbh5VLUPk+?= =?us-ascii?q?EMHtLSZCqaHyRx6ZenJ87?= X-Talos-MUID: 9a23:UMA7xwkMczxO5G5BHwTxdnpTEuww4/2uFXtTiMovi9ahORYtPzi02WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,296,1732575600"; d="scan'208,217";a="109423760" X-MGA-submission: =?us-ascii?q?MDHtyv5yzNUOl+hIjhotN2IEpwhzHs1ijR2ozR?= =?us-ascii?q?1mzsED2EKABgxIGW3RYyM0cIB3EP2AeEZBZyuQd+wPwei3nFyAgX7ylD?= =?us-ascii?q?H35SDryncxGmPAxUIZuQLonfP2xJbqFy5kuLzmjilHDTPDjBiVL4CRCb?= =?us-ascii?q?48+5tI4XfQKurWHolvRFpTuw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Feb 2025 15:33:21 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0A34F564C1A; Tue, 18 Feb 2025 15:33:18 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1739889198; bh=CaKEg6lBYuFf8ZjxMcgn3rCZx3fjujoeaL8WiQ7OEGI=; h=From:To:Subject:Date:Message-ID; b=O6kEiFkzN+242iNFpgPDgW2hStuJhV8GQuM6p0SE6Rt00Q92UDAib3iCC3u9YiK10 T8TcmtTwqyEKi3Umj3Q5WnS8XjdjsPA8maf6EplyPPJnYPBUAc8BcRGHdLRelFLfU0 4caNfH4XnUZOLwH/cOovc1/oo2rgDhkCFuQMhlxo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 18 Feb 2025 15:33:17 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 18 15:33:18 2025 +0100 (CET)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.448130, queueID=4AEC4564C21 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19269 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 11 to 18, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Learn Programming with OCaml (new book) Ocsigen's 2024 recap OCaml GADTs for Authentication Tokens OCaml language committe launched Dune dev meeting Asking For Community Feedback on the OCaml Platform Communications Old CWN Learn Programming with OCaml (new book) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jean Christophe Filliatre announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80 Dear OCaml community, A long time ago, Sylvain and I wrote a French book on [learning programming with OCaml]. Recently, the OCaml Software Foundation funded its translation to English. The book is available here: [Learn Programming with OCaml] Many thanks to [Urmila] for a translation of high quality. The book is available as a PDF file, under the [CC-BY-SA license]. The source code for the various programs contained in the book are available for download, under the same license. The book is structured in two parts. The first part is a tutorial-like introduction to OCaml through 14 small programs, covering many aspects of the language. The second part focuses on fundamental algorithmic concepts, with data structures and algorithms implemented in OCaml. This is also a nice way to learn a language! The book does not cover all aspects of OCaml. It is ideally complemented by [other books on OCaml]. [learning programming with OCaml] [Learn Programming with OCaml] [Urmila] [CC-BY-SA license] [other books on OCaml] Ocsigen's 2024 recap =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: William Caldwell announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi all! 2024 was a busy year for the Ocsigen ecosystem, in case you missed any of it, here are the important highlights: wasm_of_ocaml has been merged in its parent project js_of_ocaml, making your Ocsigen projects that much closer to being served as WASM instead of JavaScript. In the meantime you can build your own WASM by using wasm_of_ocaml to get a taste of the future. Major work has been undertaken on Ocsigen: =E2=80=A2 Ocsigen Server 6 =E2=80=A2 Eliom 11 =E2=80=A2 Ocsigen Start 7 Ocsigen server no longer needs a configuration file to start your project, you can instead start Ocsigen server in your project and handle the configuration yourself. If you're eager to `Ocsigen_server.start ...' you can learn more in the following announcements: =E2=80=A2 [ocsigen server 6] =E2=80=A2 [Eliom 11 and Osigen Start 7] Ready for 2025? We certainly are! Our efforts to make the Ocsigen ecosystem more modular are ongoing: next on the list is ocsigen-i18n, making easier to pick and choose what bits of Ocsigen you want to include in your project, and allowing to use it for any OCaml application. The biggest evolution of the Ocsigen project is underway & soon to be announced, and that's not even including wasm\_of\_ocaml. Also keep an eye out for our public meeting announcements in which we discuss our current tasks, ask for public feedback, and answer whatever Ocsigen related questions you might have. [ocsigen server 6] [Eliom 11 and Osigen Start 7] OCaml GADTs for Authentication Tokens =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Maxim Grankin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! =F0=9F=91=8B My name is Max, I've been using OCaml for a while during my years at Bloomberg and at some moment decided to dig a little bit into GADTs. I found couple of use cases for them and decided to write down one in detail: =E2=80=A2 [OCaml GADTs for Authentication Tokens] I hope it would help newcomers to find application for GADTs in their projects. Huge thanks to @chshersh for reviewing this blog post! Enjoy and let me know what you think in the comments! [OCaml GADTs for Authentication Tokens] OCaml language committe launched =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 It is my pleasure to announce the launch of the OCaml language committee. This committee is intended as collegial instance with the aim to facilitate discussions and consensus making about the evolution of the OCaml language and its standard library. Over the years, it has become a common shared grievance among both maintainers and contributors to the OCaml language that, sometimes, the review process for changes grinds to a halt, either because consensus is elusive or because no one feels empowered enough to take a decision single-handed. In order to reduce the number of those instances of decision paralysis, the OCaml maintainers have decided to experiment with an OCaml language committee: [a subgroup of the OCaml community] organised to discuss evolution of the OCaml language in a timely fashion. In practice, if someone feels that a contribution (a Pull Request, issue, Request For Comment) might be stuck or might benefit from a wider discussion, they may ask the committee to take the contribution under consideration by mentioning it to the committee chair (which is currently me, aka @Octachron on github). Then the committee will deliberate on this contribution both on the [archived] public mailing list `ocaml-language-committee@inria.fr' for internal committee discussion [^1] and possibly on the relevant community channels ([ocaml/ocaml] or [here on discuss]). At the end of this collegial discussion, the committee will publish a consultative decision on the matter. We expect that having such a collegial consultative decision would be enough to unblock most situations. For more details, the intended working of the committee is described at . Happy hacking, Florian Angeletti for the OCaml Language Committee [^1]: Anyone is welcome to subscribe to the mailing list to attend to the discussions, but please do not flood the mailing list so that we can keep it fully open. [a subgroup of the OCaml community] [archived] [ocaml/ocaml] [here on discuss] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: art-w announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello! The next Dune Dev Meeting will be on *Wednesday, February, 19th at 4pm CET* for an hour long discussion. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize with the Dune developers. The agenda is available on the [meeting dedicated page]. Feel free to add more items in it. =E2=80=A2 Meeting link: [zoom] =E2=80=A2 Calendar event: [google calendar] =E2=80=A2 Wiki with informations and previous notes: [dune wiki on github] [meeting dedicated page] [zoom] [google calendar] [dune wiki on github] Asking For Community Feedback on the OCaml Platform Communications =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi all, I'm looking for feedback on the OCaml Platform communications, especially the Platform Newsletter and the [OCaml.org] Changelog. For this, I have prepared a Google form survey (you can send me your responses by email if you prefer): The survey aims to improve both the *process* and the *usefulness* of the *OCaml Platform communications* and to help me create a handbook that gives a clear picture of all our developer-focused communication channels, as well as how the *new Developer Advocate role* at Tarides can support the maintainers in these communications. A major aim of this effort is to *adapt the process* around the communications to minimize the amount of friction imposed on engineers and to maximize the *usefulness to the readers*. Thanks for your help! [OCaml.org] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 11 to 18, 20= 25.

    Learn Programming with OCaml (new book)

    Jean Christophe Filliatre announced

    Dear OCaml community,

    A long time ago, Sylvain and I wrote a French book on learning programming with OCaml. = Recently, the OCaml Software Foundation funded its translation to English.= The book is available here:

    Learn Programming with OCaml

    Many thanks to Urmila = for a translation of high quality.

    The book is available as a PDF file, under the CC-BY-SA license. The source cod= e for the various programs contained in the book are available for download= , under the same license.

    The book is structured in two parts. The first part is a tutorial-like int= roduction to OCaml through 14 small programs, covering many aspects of the = language. The second part focuses on fundamental algorithmic concepts, wit= h data structures and algorithms implemented in OCaml. This is also a nice = way to learn a language!

    The book does not cover all aspects of OCaml. It is ideally complemented b= y other books on OCaml.

    Ocsigen's 2024 recap

    William Caldwell announced

    Hi all!

    2024 was a busy year for the Ocsigen ecosystem, in case you missed any of i= t, here are the important highlights:

    wasm_of_ocaml has been merged in its parent project js_of_ocaml, making you= r Ocsigen projects that much closer to being served as WASM instead of Java= Script. In the meantime you can build your own WASM by using wasm_of_ocaml = to get a taste of the future.

    Major work has been undertaken on Ocsigen:

    • Ocsigen Server 6
    • Eliom 11
    • Ocsigen Start 7

    Ocsigen server no longer needs a configuration file to start your project, = you can instead start Ocsigen server in your project and handle the configu= ration yourself. If you're eager to Ocsigen_server.start ... you can learn more= in the following announcements:

    Ready for 2025? We certainly are! Our efforts to make the Ocsigen ecosystem more modular are ongoing: next on= the list is ocsigen-i18n, making easier to pick and choose what bits of Oc= sigen you want to include in your project, and allowing to use it for any O= Caml application. The biggest evolution of the Ocsigen project is underway & soon to be a= nnounced, and that's not even including wasm\_of\_ocaml. Also keep an eye out for our public meeting announcements in which we discu= ss our current tasks, ask for public feedback, and answer whatever Ocsigen = related questions you might have.

    OCaml GADTs for Authentication Tokens

    Maxim Grankin announced

    Hi everyone! =F0=9F=91=8B

    My name is Max, I've been using OCaml for a while during my years at Bloomb= erg and at some moment decided to dig a little bit into GADTs. I found coup= le of use cases for them and decided to write down one in detail:

    I hope it would help newcomers to find application for GADTs in their proje= cts.

    Huge thanks to @chshersh for reviewing this blog post!

    Enjoy and let me know what you think in the comments!

    OCaml language committe launched

    octachron announced

    It is my pleasure to announce the launch of the OCaml language committee. T= his committee is intended as collegial instance with the aim to facilitate = discussions and consensus making about the evolution of the OCaml language = and its standard library.

    Over the years, it has become a common shared grievance among both maintain= ers and contributors to the OCaml language that, sometimes, the review proc= ess for changes grinds to a halt, either because consensus is elusive or be= cause no one feels empowered enough to take a decision single-handed.

    In order to reduce the number of those instances of decision paralysis, the= OCaml maintainers have decided to experiment with an OCaml language commit= tee: a subgroup of the OCaml community organised to discuss evolution of the OCaml language in a tim= ely fashion.

    In practice, if someone feels that a contribution (a Pull Request, issue, R= equest For Comment) might be stuck or might benefit from a wider discussion= , they may ask the committee to take the contribution under consideration b= y mentioning it to the committee chair (which is currently me, aka @Octachr= on on github).

    Then the committee will deliberate on this contribution both on the archived= public mailing list ocaml-language-committee@inria.fr for int= ernal committee discussion [^1] and possibly on the relevant community chan= nels (ocaml/ocaml or here on discuss). At the end of this co= llegial discussion, the committee will publish a consultative decision on t= he matter. We expect that having such a collegial consultative decision wou= ld be enough to unblock most situations.

    For more details, the intended working of the committee is described at https://git= hub.com/ocaml/RFCs/blob/master/Committee.md .

    Happy hacking, Florian Angeletti for the OCaml Language Committee

    [^1]: Anyone is welcome to subscribe to the mailing list to attend to the d= iscussions, but please do not flood the mailing list so that we can keep it= fully open.

    Dune dev meeting

    art-w announced

    Hello! The next Dune Dev Meeting will be on Wednesday, February, 19th at= 4pm CET for an hour long discussion.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers.

    The agenda is available on the meeting dedicated page. Feel free to add more= items in it.

    Asking For Community Feedback on the OCaml Platform Communicat= ions

    Sabine Schmaltz announced

    Hi all,

    I'm looking for feedback on the OCaml Platform communications, especially t= he Platform Newsletter and the OCaml.org = Changelog.

    For this, I have prepared a Google form survey (you can send me your respon= ses by email if you prefer):

    https://docs.google.com/forms/d/e/1FAI= pQLSctTt-WtWEU9heJixGAcAxeUxZhPeX0ioTnaPk6VKTwYHHs9A/viewform

    The survey aims to improve both the process and the usefulness of the OCaml Platform communications and to help me create a handb= ook that gives a clear picture of all our developer-focused communication c= hannels, as well as how the new Developer Advocate role at Tarides c= an support the maintainers in these communications.

    A major aim of this effort is to adapt the process around the commun= ications to minimize the amount of friction imposed on engineers and to max= imize the usefulness to the readers.

    Thanks for your help!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=EdnhsyDj; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=BPkRvt3t; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 35FC0401BB for ; Tue, 25 Feb 2025 10:36:28 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=k9a4ibXBlK6+OCv2fxAy1Bw5+FHBM/D07jHi2pLmT7I=; b=EdnhsyDjhNiYENsD7GJud6saybPfMNJXnRc1jGDOWIVK28YV+8oZwKzR ZQJHlvY4RJklgH+2VRHr/KXtVvL46oXQx6Nm4oaF2MsxPiU/fpslw5FB2 tKkUBVf4jdQFuUuAlq0wZPksi5pdzrMJuSUwG2cAUDk6BcD8t/qv18ucG Y=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.13,314,1732575600"; d="scan'208,217";a="209929158" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Feb 2025 11:36:22 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 0E4B6E0D21; Tue, 25 Feb 2025 11:36:22 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id CB748E0260 for ; Tue, 25 Feb 2025 11:36:18 +0100 (CET) IronPort-SDR: 67bd9d20_y7gm4Lx9k9x/wB+0dTnfIf9BlJjaOAqPRPMCd70f3lk71l1 HIUARQ1PibR6cEEG4GF8whff/S532weoMDFeJAQ== X-IPAS-Result: =?us-ascii?q?A0ElDABAnL1ndyIeaIFQCoJcAoE/gQMZAWNVBTMHCEhhg?= =?us-ascii?q?zk8g0+OIYEWmyuBVoFWIxQBAwENLgEMBgECBAEBAwECAYIMgi5GAosRAh8GA?= =?us-ascii?q?QQwCQ4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAFDSYVBAQEEA?= =?us-ascii?q?jINSQEBAQMBCgGBahk4cYElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAgsBAQwXOzIOAQgKEwEBKgENGCMDFAEGAwIRATUXA?= =?us-ascii?q?RIUBoJpgh9FAwUMBpJUm0t6gTKBATuBUQEBBoEIPgIBAgkCBQEOCSbaB4FlC?= =?us-ascii?q?YFIhWyCSRoBKkhqAoRICYM4excQD4FVRIEVNYFzSgdvgVBvCxcBAQEBGERVB?= =?us-ascii?q?AcBAQJLCYMlgmmCM0p2ggJegQyGP2aBQYIPgTiCOoF9hE6BVoNfgneJbYFHS?= =?us-ascii?q?zMsAVUTFwsHBWGBEAMqNDGBRno5ggxpSToCDQI1gh4kWIIrgxqBPIRDhEKFU?= =?us-ascii?q?oIRgguJL4NIHUADC209NxQboFsJNjYBPIM/Lw44BhcnDwwMFwkFBQEHDAgOA?= =?us-ascii?q?iACDSABCA4qAQoFFBkECQUBCAICCAoFAS4LCwItA5JSJQMrAXWOU44Tk1OBC?= =?us-ascii?q?jQHhB6BXQYMiQWBJJV9hAOBV4swhwCSSyKYWyKFL4QtgSUJglmVVQQchTaBZ?= =?us-ascii?q?zqBKzEzGjBDDQYIghgBMwlGHA9XhnWBLoMXghwWg1iBPoEmgSMYOTvGZEI1A?= =?us-ascii?q?gEBOAIHAQoBAQMJhWIBAYMEghdug3sCJgcFgUsBAQ?= IronPort-PHdr: A9a23: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 tqauZjemD3GUZSWtReKAnfSKg== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:/B/jYKuSLbC5i3U0QBPPpfFN7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3A7tzUSGvPTTM7IxnfFipcx9NY6IsDMXLm3CzQJ3T?= =?us-ascii?q?gKmc3dYzPQkWO+IR7xp8=3D?= X-Talos-MUID: 9a23:mlwBuwUSVwQVLJTq/DLJ3gg9afsx2Ja/JFxcy4gZnPXUbTMlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.13,314,1732575600"; d="scan'208,217";a="109994449" X-MGA-submission: =?us-ascii?q?MDH/KTaTnkUtzrQ03h4G/y+SOQAgH0Y10xHyjI?= =?us-ascii?q?PwPj6gWazt3Ze8Sc+xhpga0SJw7sJJvUJT5XcwXEv9yCKGmFsDDDZ0vt?= =?us-ascii?q?8vRbJsFI/MmPUUkZeukafxvOWJPc1xc8mL1D38vwcLHkymsFP9crci5C?= =?us-ascii?q?yJBs1DRk9J6rkLd4zBjQwg+g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Feb 2025 11:36:17 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0DCF0564B99; Tue, 25 Feb 2025 11:36:15 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1740479775; bh=GpoI2Qo3TD0AKX2LkCXMDTEOdJfo8Td4KulHRsLnrTs=; h=From:To:Subject:Date:Message-ID; b=BPkRvt3tkYNdWIruWc4sRWm3yVSyQ21lLtynYmLz2PtmSbEdNtX5lOMJA62X3FQbW 4+d2KPOaGqwDMG3x8WfQzHETo9VrZnwGIJsPTIqm2uoEDtn8EibNwKsATX4/CuRYrS 8cIi9kuAFmamJwgxiLfwdfFo+x+nijRcy6xwZGnE= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 25 Feb 2025 11:36:13 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 25 11:36:15 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.469084, queueID=7C73B564B9B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19274 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 18 to 25, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Early work experimenting with zig as a cross-compiler for OCaml Dune dev meeting Outreachy June 2025 Js_of_ocaml 6.0.1 / Wasm_of_ocaml Bytecode debugging in OCaml 5.3 New F* release on opam (2025.02.17) Other OCaml News Old CWN Early work experimenting with zig as a cross-compiler for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Chris Armstrong announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is some early work [using zig as a cross-compiler] for building OCaml cross-compilation systems: [opam-cross-lambda] *Status*: It is currently severely untested but the aim is to be able to cross-compile to Linux from Windows/Mac/Linux for aarch64 and x86_64 CPU architectures simply by adding an opam repository, and without the need for nix. *Why:* The novel aspect is zig, which allows you to cross-compile C code without needing to install or set up a cross-compilation sysroot i.e. glibc, gcc, binutils, kernel headers etc. as zig packages much of the needed headers and symbol information internally. *Next steps:* start importing packages (including those with native binaries) into the opam repository overlay, validate them in CI/CD This approach has led me down some rabbit-holes with a bunch of learning - some interesting points: =E2=80=A2 zig uses clang internally, so its effectively testing clang compatibility with OCaml's autoconf + Makefile assumptions about the C compiler =E2=80=A2 targeting windows isn't possible with this setup at this time, because flexdll hardcodes mingw binary names (e.g. x86_64-w64-mingw32-gcc) in its Makefile and the flexlink binary (it assumes these exist because targeting mingw32 is always a cross-compilation, even on Windows). It also depends on binutils' windres, which zig does not provide a wrapper for. =E2=80=A2 targeting macos x is untested =E2=80=A2 as you can see in the CI/CD scripts, setting the ZIG cache dire= ctory environment variables is crucial for MacOS because of opam's sandboxing (zig builds its cache in the user's home directory, which is outside the default sandbox) =E2=80=A2 although ocamlfind and dune have some cross-compilation support= with "toolchains", there are gaps and undocumented assumption =E2=80=A2 opam doesn't really support cross-compilation environments well= - packages often don't require much change, but you do need to create a `-cross-' version of every single package - this could be a lot more straightforward and less work with a more cohesive platform strategy for cross-compilation *Alternatives*: I'm aware of alternatives in the ecosystem (and indeed have benefitted from): =E2=80=A2 [ocaml nix overlays] - these offer a far better tested and reproducible cross-compilation environment, mostly for systems that can run nix =E2=80=A2 [opam-cross-windows] - lots of little nuggets of build-time information found in here [using zig as a cross-compiler] [opam-cross-lambda] [ocaml nix overlays] [opam-cross-windows] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, art-w announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thanks everyone for joining! The meetings notes are here: Outreachy June 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! Once again, the OCaml community has signed up to Outreachy (see [past] [posts])! [past] [posts] What is Outreachy? =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Outreachy is a paid, remote internship program. Outreachy promotes diversity in open source and open science. Our internships are for people who face under-representation, and discrimination or systemic bias in the technology industry of their country. The current round is still ongoing with an intern making great progress on [ocaml-api-watch] with @NathanReb and @panglesd. [ocaml-api-watch] Important Dates =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C For this next round, the important dates are as follows (these are always subject to some change): =E2=80=A2 Feb 26 - Community sign up deadline :white_check_mark: =E2=80=A2 Mar 7 - [Mentor project description deadline] =E2=80=A2 Mar 10 to Apr 8 - Contribution period =E2=80=A2 Jun 2 to Aug 29 - Internship period Our next deadline is for mentors to sign up to the OCaml community with a project idea. Please do consider being an Outreachy mentor. If you have any questions or ideas you can always reach out to me directly. If you need a refresher of past projects, there's a dedicated page on the OCaml website: . The OCaml community is currently able to financially support Outreachy internships thanks to the generous support of [Tarides] and [Janestreet]. Thanks! :camel: [Mentor project description deadline] [Tarides] [Janestreet] Js_of_ocaml 6.0.1 / Wasm_of_ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: J=C3=A9r=C3=B4me Vouillon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m pleased to announce the joint release of js_of_ocaml 6.0.1 and wasm_of_ocaml. Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers and Node.js. [Wasm_of_ocaml] is a compiler from OCaml bytecode to WebAssembly. It is highly compatible with Js_of_ocaml, so you can compile your programs with wasm_of_ocaml instead of js_of_ocaml and experience overall better performance. It is [supported by Dune 3.17], making the switch very easy. Most significant changes in js_of_ocaml: =E2=80=A2 The conversion between Javascript numbers and OCaml floats is n= ow explicit, using functions `Js.float' and `Js.to_float' (this is necessary for wasm_of_ocaml which does not use the same representation for JS numbers and OCaml floats) =E2=80=A2 `Dom_html' has been modernized, removing some no longer relevant `Js.optdef' type annotations =E2=80=A2 Effects: =E2=80=A3 add an optional feature of "dynamic switching" between CPS and direct style, resulting in better performance when no effect handler is installed =E2=80=A3 make resuming a continuation more efficient See the [Changelog] for other changes. [Wasm_of_ocaml] [supported by Dune 3.17] [Changelog] Olivier Nicole then added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Regarding wasm_of_ocaml, Tarides also just posted [a blog post] with some more details about its recent developments, and what kind of performance gains have been observed with it. I want to insist that building your project to Wasm can be as simple as enabling the `wasm' mode in dune. To quote the documentation page cited by J=C3=A9r=C3=B4me: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (executable (name foo) (modes wasm)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And then request the .wasm.js target: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ dune build ./foo.bc.wasm.js =E2=94=82 $ node _build/default/foo.bc.wasm.js =E2=94=82 hello from wasm =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [a blog post] Bytecode debugging in OCaml 5.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Today I conducted a small experiment of using a debugger on a small OCaml program (built using `dune'). The program is not written by me, does non-trivial things, and is written in such a way that my usual approaches to understand what is going on would require more work than I want to pour in it. I took notes on this experience, in the hope that it could be of interest to others =E2=80=93 maybe I'm doing things wrong and people will= let me know, maybe this can help identify potential tooling improvements. Disclaimer: I am a complete beginner as far as running OCaml debuggers goes. (I have used `ocamldebug' and `gdb' irregularly in the past, never heaily, and long forgotten how to use them.) TL;DR: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Bytecode debugging with OCaml 5.3 and dune: =E2=80=A2 works fine in Emacs/Tuareg, as it did in the past =E2=80=A2 works okay in vscode using ocamlearlybird =E2=80=A2 could be improved with a bit more targeted work, some of it pro= bably easy (and some of it hard) If I understand correctly, no one is specifically working on this right now. Let me take this occasion to thank the people who contributed to all these tools (Tuareg, ocamldebug, ocamlearlybird, vscode+ocaml integration, dune, etc.). Why a debugger? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C I am looking at an OCaml program that I did not write, and does interesting and complex things. I would like to build my understanding of how it works by observing the flow of values in some parts of the program, on concrete examples of interest. I am unfamiliar with debuggers and tried other things first: 1. I considered modifying the code to print the values it encouters at runtime. But the program does not define pretty-printers for its values, and writing them is cumbersome. (I could probably use `deriving' to produce debuggers more easily.) 2. My next move is usually `dune utop': instead of running the program, I can call its library functions via the toplevel on small examples. But this particular program is only a binary, it was not split as a library and a binary, and splitting it would be non-trivial. When "printf debugging" and "play in the toplevel" are not immediately within reach, it may be time to try a debugger. They should let us stop at a given point in the program, print values, and move around in the execution trace to better understand what is going on. Running a debugger in general =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C To run a debugger on OCaml programs, one has to choose between a bytecode debugger, `ocamldebug', and native debuggers such as `gdb' and `lldb'. Native debuggers are not OCaml-specific and likely to be better documented, have more integrated tooling etc., but they are more low-level and don't know as much about OCaml programs; in particular they're not so good at printing values. On the other hand `ocamldebug' can print OCaml values, and it is a time-travel debugger that supports going backward in time; but it relies on running the bytecode executable that is probably 10x slower than the native executable. It is also probably worse when debugging cross-language programs, for example using the FFI. I would not try `ocamldebug' to debug performance-sensitive programs, programs in production, and in particular to debug anything resembling a segmentation fault. But it should offer a nice experience for pure-OCaml programs during their development. The Coq/Rocq maintainers have long been using `ocamldebug' to understand their software, a large OCaml program with tricky bugs and non-trivial performance requirements. They rely on specific tooling to make it nicer =E2=80=93 autoloaded scripts, customized pretty-printers. So there is evidence that `ocamldebug' can work well when integrated inside a project development workflow. (Here the program I want to debug has /not/ had any such written, so it will be more barebones.) Getting a bytecode executable from Dune =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Before going any further, you need to ask `dune' to generate bytecode executables, by adding =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (modes byte exe) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 to the `executable' stanza. Then you run `dune build', and when invoking the debugger you will need to manually pass the path to the bytecode program, for example `_build/default/bin/main.bc'. IDE integration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Running `ocamldebug' directly is doable but not great. Just like it's nice when IDEs let you jump to the location of a compilation error, you really want the debugger to show you "where" it is in the program execution by showing you a program point in your programming editor. (`ocamldebug' will print the source line where it is at, so it's not too bad, but still noticeably less pleasant, and typing movement commands one by one gets old fast.) I considered two approaches to running a bytecode debugger for OCaml programs: =E2=80=A2 run `ocamldebug' from Emacs/Tuareg =E2=80=A2 run `ocamlearlybird' from VsCode =E2=97=8A ocamlearlybird in vscode I first decided to use ocamlearlybird from vscode. I opened vscode (which is not my usual editor) and tried to use `Run > start debugging' directly=E2=80=A6 and it didn't work well. You need to configure things manually, and the vscode interface did not tell me that, it would show nothing and appear not to work as expected but without much help. The better way to configure vscode+earlybird is to=E2=80=A6 read the documentation first. I recommend: 1. Read the [vscode-ocaml-platform README.md] about how to setup things. 2. then read the [ocamlearlybird README] (which also links to the README above), in particular watch the short demo, to know what to expect when the interface works. The README documents the field of the `launch.json' file that you have to write to describe how to invoke the debugger, and this is helpful. After reading this, I knew how to tweak the `launch.json' file so that the debugger would pass command-line arguments to the program, and it started working correctly. Unfortunately `ocamlearlybird' does not current support time-travel ([issue]), so it is only possible to stop at breakpoints and move forward in time, while I was expecting to run until a failure and then go backward in time, as I usually do with `ocamldebug'. At this point I decided to go back to my familiar Emacs. [vscode-ocaml-platform README.md] [ocamlearlybird README] [issue] =E2=97=8A Points to improve When trying to "run the debugger" without having configured a specific bytecode program, the vscode UI appears to work but does nothing. For example it is possible to add breakpoints, etc., and then clicking "run" does nothing that I can see. I wish there was clearer feedback when things are not setup and there is no chance that it will work. This would also be a good time to point me to the online documentation =E2=80=93 from within the IDE = =E2=80=93 so that the process is more discoverable. =E2=97=8A ocamldebug in Emacs At this point I had already set things up to build a bytecode executable in Dune, so things were easy: `M-x ocamldebug' and there you go. There is [documentation in the user manual], which was probably written more than a decade ago, and it mostly reads just fine today. (Note: some of the documented keybindings do not work: `C-c C-k' is documented as stepping back in the manual, but it is not supported by Tuareg ([issue]).) Moving around program execution is fun, printing values works okay =E2=80= =93 the next step for convenience would be to install custom printers to get nice output. [documentation in the user manual] [issue] =E2=97=8A Points to improve 1. Emacs jumps to source code to follow the program execution in the debugger; but on every movement in the execution trace it asks me again whether I want `src/foo.ml' instead of `_build/default/src/foo.ml', and this is annoying. (Sometimes I did not observe this behavior, not sure why.) 2. Dune includes various wrapping/mangling of module names that show up in the `ocamldebug' printing, and can be annoying at time. For example some module names show up as `Dune__exe.Foo', and I would prefer to see just `Foo'. I think it should be possible to hard-code some more de-Dune-mangling logic in the debugger's pretty-printer, and ideally we could even make them user-configurable or dune-configurable a bit. 3. If I print an AST from an execution point that does not have `open Ast' in its typing environment, the AST is printed like `Dune__exe.Ast.Let (Dune__exe.Ast.Var "x", ...)'. It would be nice to omit the `Dunne__exe' part, but ideally I should also be able to tell the debugger: "let's open `Ast' locally from now on when you print values", so that it prints in a more readable way by default. Vincent Laviron replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Nice post, thanks ! A few things I would like to add: =E2=80=A2 Time travelling is possible for the native debuggers with `rr'.= At some point it was Linux-only, it might still be the case, but it's /very/ nice to use. I have on some occasions debugged bytecode programs by using `rr' on it, and with the appropriate gdb/lldb macros to print OCaml values it can be useful (but mostly for debugging the C parts; for problems purely on the OCaml side `ocamldebug' is still better suited). I use it regularly for native debugging and it's very convenient (it can even help with debugging eisenbugs in parallel programs ! Just run `rr record ./my_program' several times until the bug triggers, and then `rr replay' will always replay the same run, including thread interleavings, consistently reproducing the bug). =E2=80=A2 I have tried time travelling with `ocamldebug' in the past and I have hit some serious issues: limited history means that you cannot go very far in the past, and the way it works (by setting checkpoints and replaying from the checkpoint to the required instruction) means that you can often see weird artifacts due to C calls being replayed each time you step back, sometimes breaking the program completely. I'm curious to know if this is just bad luck (or me doing weird things), or if you had similar issues too. =E2=80=A2 The `Dune__exe' stuff is, I believe, `dune''s misguided attempt= to shield users from potential conflicts between files linked in the executable and modules with the same name present in non-wrapped libraries required as dependencies. I suspect that `(wrapped false)' or something like that in the section of the dune file corresponding to the executable will get rid of it. Tim McGilchrist also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 It is possible to use `ocamlearlybird' with `dap-mode' in Emacs [link]. The setup uses the same json config file as VSCode. I'm putting my effort into DAP support since that gets cross editor support and I can switch between LLDB/ocamlearlybird. For Emacs the two main options for DAP support are: =E2=80=A3 dap-mode, which ties into lsp-mode and follows that style of things. Uses JSON configuration based off VSCode configuration. The UI elements depend on lsp-mode, so it's a heavier setup and might not play as well with eglot. =E2=80=A3 dape, standalone DAP mode with a more minimal approach. I didn'= t get it working satisfactorily but it seems closer to eglot in philosophy For both I see the challenges are: 1. Setting up DAP itself reliably and with less fuss. It could be smoother and better documented. 2. Setting up dune builds to generate the right artifacts. Having a direct LSP code action to run a debugger against a particular executable like Rust does would be ideal. 3. Bugs in ocamlearlybird and lack of maintainer time. It's interesting to hear about users of bytecode debugging, I thought there wouldn't be many people using that. [link] Nicolas Ojeda Bar also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For example some module names show up as `Dune__exe.Foo', and I would prefer to see just `Foo'. This is controlled by `(wrapped_executables )' in `dune-project': New F* release on opam (2025.02.17) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Chandradeep Dey announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello! It is my pleasure to announce that F* is once again available on opam for direct installation after a long time. This probably does not mean much to regular users, as there were regular releases on GitHub for some time now. However, the opam release offers a convenient alternative by eliminating the need to separately set up OCaml to compile extracted OCaml code. From the [website] - F* is a general-purpose proof-oriented programming language, supporting both purely functional and effectful programming. It combines the expressive power of dependent types with proof automation based on SMT solving and tactic-based interactive theorem proving. The biggest new thing worth mentioning is perhaps the Pulse DSL for programming with concurrent separation logic. A tutorial is available in the F* book, Proof-oriented Programming in F*. A comprehensive overview of various projects that have utilized F* over the years can also be found on the website. Feel free to join the [Zulip forum] for discussions with the developers, researchers, and casual users. Happy writing provably correct programs! [website] [Zulip forum] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [How I fixed Slipshow's worst flaw using OCaml and a monad] =E2=80=A2 [The First Wasm_of_ocaml Release is Out!] [the ocaml.org blog] [How I fixed Slipshow's worst flaw using OCaml and a monad] [The First Wasm_of_ocaml Release is Out!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 18 to 25, 20= 25.

    Early work experimenting with zig as a cross-compiler for OCam= l

    Chris Armstrong announced

    This is some early work using zig as a cross-compiler for building OCaml cross-compilation= systems:

    opam-cross= -lambda

    Status: It is currently severely untested but the aim is to be able = to cross-compile to Linux from Windows/Mac/Linux for aarch64 and x86_64 CPU= architectures simply by adding an opam repository, and without the need fo= r nix.

    Why: The novel aspect is zig, which allows you to cross-compile C co= de without needing to install or set up a cross-compilation sysroot i.e. gl= ibc, gcc, binutils, kernel headers etc. as zig packages much of the needed = headers and symbol information internally.

    Next steps: start importing packages (including those with native bi= naries) into the opam repository overlay, validate them in CI/CD

    This approach has led me down some rabbit-holes with a bunch of learning - = some interesting points:

    • zig uses clang internally, so its effectively testing clang compatibili= ty with OCaml's autoconf + Makefile assumptions about the C compiler
    • targeting windows isn't possible with this setup at this time, because = flexdll hardcodes mingw binary names (e.g. x86_64-w64-mingw32-gcc) in its M= akefile and the flexlink binary (it assumes these exist because targeting m= ingw32 is always a cross-compilation, even on Windows). It also depends on = binutils' windres, which zig does not provide a wrapper for.
    • targeting macos x is untested
    • as you can see in the CI/CD scripts, setting the ZIG cache directory en= vironment variables is crucial for MacOS because of opam's sandboxing (zig = builds its cache in the user's home directory, which is outside the default= sandbox)
    • although ocamlfind and dune have some cross-compilation support with "t= oolchains", there are gaps and undocumented assumption
    • opam doesn't really support cross-compilation environments well - packa= ges often don't require much change, but you do need to create a <= package>-cross-<cross-name> version of every single package= - this could be a lot more straightforward and less work with a more cohes= ive platform strategy for cross-compilation

    Alternatives: I'm aware of alternatives in the ecosystem (and indeed= have benefitted from):

    • ocaml nix overlay= s - these offer a far better tested and reproducible cross-compilation = environment, mostly for systems that can run nix
    • opam-cross-windows - lots of little nuggets of build-time inf= ormation found in here

    Dune dev meeting

    Continuing this thread, art-w announced

    Thanks everyone for joining! The meetings notes are here: https://github.com/oca= ml/dune/wiki/dev-meeting-2025-02-19

    Outreachy June 2025

    Patrick Ferris announced

    Hi everyone!

    Once again, the OCaml community has signed up to Outreachy (see past posts<= /a>)!

    What is Outreachy?

    Important Dates

    For this next round, the important dates are as follows (these are always s= ubject to some change):

    Our next deadline is for mentors to sign up to the OCaml community with a p= roject idea. Please do consider being an Outreachy mentor. If you have any = questions or ideas you can always reach out to me directly. If you need a r= efresher of past projects, there's a dedicated page on the OCaml website: <= a href=3D"https://ocaml.org/outreachy">https://ocaml.org/outreachy.=20

    The OCaml community is currently able to financially support Outreachy inte= rnships thanks to the generous support of T= arides and Janestreet.

    Thanks! :camel:

    Js_of_ocaml 6.0.1 / Wasm_of_ocaml

    J=C3=A9r=C3=B4me Vouillon announced

    I=E2=80=99m pleased to announce the joint release of js_of_ocaml 6.0.1 and = wasm_of_ocaml.

    Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po= ssible to run pure OCaml programs in JavaScript environment like browsers a= nd Node.js.

    Wasm_of= _ocaml is a compiler from OCaml bytecode to WebAssembly. It is highly c= ompatible with Js_of_ocaml, so you can compile your programs with wasm_of_o= caml instead of js_of_ocaml and experience overall better performance. It i= s supported b= y Dune 3.17, making the switch very easy.

    Most significant changes in js_of_ocaml:

    • The conversion between Javascript numbers and OCaml floats is now expli= cit, using functions Js.float and Js.to_float (th= is is necessary for wasm_of_ocaml which does not use the same representatio= n for JS numbers and OCaml floats)
    • Dom_html has been modernized, removing some no longer rele= vant Js.optdef type annotations
    • Effects:
      • add an optional feature of "dynamic switching" between CPS and direct s= tyle, resulting in better performance when no effect handler is installed
      • make resuming a continuation more efficient

    See the Changelog for other changes.

    Olivier Nicole then added

    Regarding wasm_of_ocaml, Tarides also just posted a blog post with some more details about its recent developments, and what kind of performance gains have been observed with it.

    I want to insist that building your project to Wasm can be as simple as ena= bling the wasm mode in dune. To quote the documentation page cited by J=C3=A9r=C3=B4me:

    (executable (name foo) (modes wasm))
    

    And then request the .wasm.js target:

    $ dune build ./foo.bc.wasm.js
    $ node _build/default/foo.bc.wasm.js
    hello from wasm
    

    Bytecode debugging in OCaml 5.3

    gasche announced

    Today I conducted a small experiment of using a debugger on a small OCaml p= rogram (built using dune). The program is not written by me, d= oes non-trivial things, and is written in such a way that my usual approach= es to understand what is going on would require more work than I want to po= ur in it.

    I took notes on this experience, in the hope that it could be of interest t= o others – maybe I'm doing things wrong and people will let me know,= maybe this can help identify potential tooling improvements.

    Disclaimer: I am a complete beginner as far as running OCaml debuggers goes= . (I have used ocamldebug and gdb irregularly in = the past, never heaily, and long forgotten how to use them.)

    TL;DR:

    Bytecode debugging with OCaml 5.3 and dune:

    • works fine in Emacs/Tuareg, as it did in the past
    • works okay in vscode using ocamlearlybird
    • could be improved with a bit more targeted work, some of it probably easy (and some of it hard)

    If I understand correctly, no one is specifically working on this right now. Let me take this occasion to thank the people who contributed to all these = tools (Tuareg, ocamldebug, ocamlearlybird, vscode+ocaml integration, dune, = etc.).

    Why a debugger?

    I am looking at an OCaml program that I did not write, and does interesting= and complex things. I would like to build my understanding of how it works= by observing the flow of values in some parts of the program, on concrete = examples of interest.

    I am unfamiliar with debuggers and tried other things first:

    1. I considered modifying the code to print the values it encouters at run= time. But the program does not define pretty-printers for its values, and w= riting them is cumbersome. (I could probably use deriving to p= roduce debuggers more easily.)
    2. My next move is usually dune utop: instead of running the = program, I can call its library functions via the toplevel on small example= s. But this particular program is only a binary, it was not split as a libr= ary and a binary, and splitting it would be non-trivial.

    When "printf debugging" and "play in the toplevel" are not immediately with= in reach, it may be time to try a debugger. They should let us stop at a gi= ven point in the program, print values, and move around in the execution tr= ace to better understand what is going on.

    Running a debugger in general

    To run a debugger on OCaml programs, one has to choose between a bytecode d= ebugger, ocamldebug, and native debuggers such as gdb and lldb.

    Native debuggers are not OCaml-specific and likely to be better documented,= have more integrated tooling etc., but they are more low-level and don't k= now as much about OCaml programs; in particular they're not so good at prin= ting values.

    On the other hand ocamldebug can print OCaml values, and it is= a time-travel debugger that supports going backward in time; but it relies= on running the bytecode executable that is probably 10x slower than the na= tive executable. It is also probably worse when debugging cross-language pr= ograms, for example using the FFI.

    I would not try ocamldebug to debug performance-sensitive prog= rams, programs in production, and in particular to debug anything resemblin= g a segmentation fault. But it should offer a nice experience for pure-OCam= l programs during their development.

    The Coq/Rocq maintainers have long been using ocamldebug to un= derstand their software, a large OCaml program with tricky bugs and non-tri= vial performance requirements. They rely on specific tooling to make it nic= er – autoloaded scripts, customized pretty-printers. So there is evi= dence that ocamldebug can work well when integrated inside a p= roject development workflow. (Here the program I want to debug has not had any such written, so it will be more barebones.)

    Getting a bytecode executable from Dune

    Before going any further, you need to ask dune to generate byt= ecode executables, by adding

    (modes byte exe)
    

    to the executable stanza. Then you run dune build= , and when invoking the debugger you will need to manually pass the path to= the bytecode program, for example _build/default/bin/main.bc.

    IDE integration

    Running ocamldebug directly is doable but not great. Just like= it's nice when IDEs let you jump to the location of a compilation error, you really want the debugger to show you "where" it is in the program execution by showing you a program point in your programming editor. (ocamldebug will print the source line where it is at,= so it's not too bad, but still noticeably less pleasant, and typing movement commands one by one gets old fast.)

    I considered two approaches to running a bytecode debugger for OCaml progra= ms:

    • run ocamldebug from Emacs/Tuareg
    • run ocamlearlybird from VsCode
    • ocamlearlybird in vscode

      I first decided to use ocamlearlybird from vscode.

      I opened vscode (which is not my usual editor) and tried to use Run &= gt; start debugging directly… and it didn't work well. You ne= ed to configure things manually, and the vscode interface did not tell me t= hat, it would show nothing and appear not to work as expected but without m= uch help.

      The better way to configure vscode+earlybird is to… read the documen= tation first. I recommend:

      1. Read the vscode-ocaml-platform README.md = about how to setup things.
      2. then read the ocamlearlybird README (which also links to the READM= E above), in particular watch the short demo, to know what to expect when t= he interface works. The README documents the field of the launch.json= file that you have to write to describe how to invoke the debugger,= and this is helpful.

      After reading this, I knew how to tweak the launch.json file s= o that the debugger would pass command-line arguments to the program, and i= t started working correctly.

      Unfortunately ocamlearlybird does not current support time-tra= vel (issue= ), so it is only possible to stop at breakpoints and move forward in ti= me, while I was expecting to run until a failure and then go backward in ti= me, as I usually do with ocamldebug. At this point I decided t= o go back to my familiar Emacs.

      • Points to improve

        When trying to "run the debugger" without having configured a specific byte= code program, the vscode UI appears to work but does nothing. For example i= t is possible to add breakpoints, etc., and then clicking "run" does nothin= g that I can see.

        I wish there was clearer feedback when things are not setup and there is no= chance that it will work. This would also be a good time to point me to th= e online documentation – from within the IDE – so that the pr= ocess is more discoverable.

    • ocamldebug in Emacs

      At this point I had already set things up to build a bytecode executable in= Dune, so things were easy: M-x ocamldebug and there you go. T= here is documentatio= n in the user manual, which was probably written more than a decade ago= , and it mostly reads just fine today.

      (Note: some of the documented keybindings do not work: C-c C-k= is documented as stepping back in the manual, but it is not supported by T= uareg (issue).)

      Moving around program execution is fun, printing values works okay –= the next step for convenience would be to install custom printers to get n= ice output.

      • Points to improve
        1. Emacs jumps to source code to follow the program execution in the debug= ger; but on every movement in the execution trace it asks me again whether = I want src/foo.ml instead of _build/default/src/foo.ml, and this is annoying. (Sometimes I did not observe this behavior, no= t sure why.)
        2. Dune includes various wrapping/mangling of module names that show up in= the ocamldebug printing, and can be annoying at time. For exa= mple some module names show up as Dune__exe.Foo, and I would p= refer to see just Foo. I think it should be possible to hard-c= ode some more de-Dune-mangling logic in the debugger's pretty-printer, and = ideally we could even make them user-configurable or dune-configurable a bi= t.
        3. If I print an AST from an execution point that does not have open= Ast in its typing environment, the AST is printed like Dune__= exe.Ast.Let (Dune__exe.Ast.Var "x", ...). It would be nice to omit t= he Dunne__exe part, but ideally I should also be able to tell = the debugger: "let's open Ast locally from now on when you pri= nt values", so that it prints in a more readable way by default.

    Vincent Laviron replied

    Nice post, thanks !

    A few things I would like to add:

    • Time travelling is possible for the native debuggers with rr. At some point it was Linux-only, it might still be the case, but it's <= i>very nice to use. I have on some occasions debugged bytecode programs= by using rr on it, and with the appropriate gdb/lldb macros t= o print OCaml values it can be useful (but mostly for debugging the C parts= ; for problems purely on the OCaml side ocamldebug is still be= tter suited). I use it regularly for native debugging and it's very conveni= ent (it can even help with debugging eisenbugs in parallel programs ! Just = run rr record ./my_program several times until the bug trigger= s, and then rr replay will always replay the same run, includi= ng thread interleavings, consistently reproducing the bug).
    • I have tried time travelling with ocamldebug in the past a= nd I have hit some serious issues: limited history means that you cannot go= very far in the past, and the way it works (by setting checkpoints and rep= laying from the checkpoint to the required instruction) means that you can = often see weird artifacts due to C calls being replayed each time you step = back, sometimes breaking the program completely. I'm curious to know if thi= s is just bad luck (or me doing weird things), or if you had similar issues= too.
    • The Dune__exe stuff is, I believe, dune's mis= guided attempt to shield users from potential conflicts between files linke= d in the executable and modules with the same name present in non-wrapped l= ibraries required as dependencies. I suspect that (wrapped false) or something like that in the section of the dune file corresponding to= the executable will get rid of it.

    Tim McGilchrist also replied

    It is possible to use ocamlearlybird with dap-mode in Emacs link. The setup uses the same json config file as VS= Code. I'm putting my effort into DAP support since that gets cross editor s= upport and I can switch between LLDB/ocamlearlybird.=20

    For Emacs the two main options for DAP support are:

    • dap-mode, which ties into lsp-mode and follows that style of things. Us= es JSON configuration based off VSCode configuration. The UI elements depen= d on lsp-mode, so it's a heavier setup and might not play as well with eglo= t.
    • dape, standalone DAP mode with a more minimal approach. I didn't get it= working satisfactorily but it seems closer to eglot in philosophy https://github.com/svaante/dape

    For both I see the challenges are:

    1. Setting up DAP itself reliably and with less fuss. It could be smoother= and better documented.
    2. Setting up dune builds to generate the right artifacts. Having a direct= LSP code action to run a debugger against a particular executable like Rus= t does would be ideal.
    3. Bugs in ocamlearlybird and lack of maintainer time.

    It's interesting to hear about users of bytecode debugging, I thought there= wouldn't be many people using that.

    Nicolas Ojeda Bar also replied

    For example some module names show up as Dune__exe.Foo, and I = would prefer to see just Foo.

    This is controlled by (wrapped_executables <bool>) in dune-project: https://dune.readthedocs.io= /en/latest/reference/dune-project/wrapped_executables.html

    New F* release on opam (2025.02.17)

    Chandradeep Dey announced

    Hello! It is my pleasure to announce that F* is once again available on opa= m for direct installation after a long time. This probably does not mean mu= ch to regular users, as there were regular releases on GitHub for some time= now. However, the opam release offers a convenient alternative by eliminat= ing the need to separately set up OCaml to compile extracted OCaml code.

    >>From the website - F* is a general-purpose proof-oriented programming language, supporting bot= h purely functional and effectful programming. It combines the expressive p= ower of dependent types with proof automation based on SMT solving and tact= ic-based interactive theorem proving.

    The biggest new thing worth mentioning is perhaps the Pulse DSL for program= ming with concurrent separation logic. A tutorial is available in the F* bo= ok, Proof-oriented Programming in F*. A comprehensive overview of various p= rojects that have utilized F* over the years can also be found on the websi= te.

    Feel free to join the Zulip forum<= /a> for discussions with the developers, researchers, and casual users. Hap= py writing provably correct programs!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=PnWUdBHL; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=Pk1CMJN+; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id C011D40065 for ; Tue, 4 Mar 2025 14:01:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=s8Vorf3sYMKdCBRvI+M06KjT7jFLoaXVxbdd5fChIPY=; b=PnWUdBHLQmnltCvW9Rj0I/riF4wQhXPRBkV+vAsPmR5JSJMROi3ABfsE IbjKxos8BjlIK242xcuneKn5bmWDkmyARguuOkvemS1/URLdou/v2ley2 cgb4VII3KikBrcBLywI8Stbpo27BcCQIUirc0ynhf2O7i2BV9dI31Y6bi Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.14,220,1736809200"; d="scan'208,217";a="211132660" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Mar 2025 15:01:53 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 53A7CE0264; Tue, 4 Mar 2025 15:01:52 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0397DE0260 for ; Tue, 4 Mar 2025 15:01:48 +0100 (CET) IronPort-SDR: 67c707c9_g5/UfcTaVFrvPbIp8KcGE1OG9VH8+CLUZFwdmqwwR+fe96b JZM4muyzCQmUMQSVTskP97FvElG//my0+zjbOpA== X-IPAS-Result: =?us-ascii?q?A0HLegDNBsdndyIeaIFaglwCgT9bKBkBY1ozBwhIA4RTg?= =?us-ascii?q?WOBbIUtiHSRSoI8gQmFA4EfgRCBVhSBEQMYFgUeFAEDAQ0uAQUNAQIEAQEDA?= =?us-ascii?q?QIBggyBPXFABAICFop/Ah8GAQQwCQ4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBA?= =?us-ascii?q?QIBAQIEBgECEAFDSYV7DUkBAQEBAgEGBIFrUUEwYQQDBgYBAQEBAQEBAQEnA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIMA?= =?us-ascii?q?SkKD1oCAQIGBAYTAQE4GCMDCQcEAQYDAgQNATUDARMBEhqCEFmCH0UDBQwGP?= =?us-ascii?q?5IMmzsQen8zgQGCDAEBBoEIPgIBAgkCAgMBDgklAdoHgWUJgTAYhWyCSRoBB?= =?us-ascii?q?SVIagKESAmEMycPgVVEgRWCeW+BQn0LFwEBAQEYfw0YAQEICTwJCYMcgmmCH?= =?us-ascii?q?BeBCDOBWCpegQyBbIRPEk8FgTx4gReBNh0cIwpGgQ4WIRoIeCyBVoJ4OwQSV?= =?us-ascii?q?x0SPYJKV4J1gQ4oS4kKgUciAyYzLAFVExcLBwVhgRADKjQxgUZ6OYIMaUk6A?= =?us-ascii?q?g0CNYIeJFiCK4MUgTqEPYRAhVSCEYIIiS6EbB1AAwttPTcUG6E/CTc1ATqDR?= =?us-ascii?q?QQHJA4KARQfAQEVGwwcBwECGAkFAwIBCgkIDgEBCQQTAi4IDgsKFgcDGB4JC?= =?us-ascii?q?gQVBgECDRkGCwEEAQUCKwKNDIU2JBUDgSGwPIEKNAeEHoFdBgyJBYEki2OCS?= =?us-ascii?q?4dPhAOBV4sxhwCSSyKYWyKCNoYZgQ0KgRsJYIEPapVVEyaFHoFRFjo8bwEBG?= =?us-ascii?q?gIMBzMaMEMNBhSCDAEBATEJCjwcD41/KwMWgQwBB4FmXkF9gRsGBYF0O1GCH?= =?us-ascii?q?MA4MUI1AgEBBAMIKQIHAQoBAQMJhUUdAQGBToE2gheEay0FamEBAQ?= IronPort-PHdr: A9a23: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 MybspjThXraEImWtReKAnfSKg== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:gRfOJaMDoFPxJsBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: 9a23:yDwDgW7zqe/Ftqr6rdss1xQtA9IsQ0Lm3Fz2Ax+hOF9YWr6sRgrF X-Talos-MUID: =?us-ascii?q?9a23=3AX88vxg8eIZ/0+tLbi5zmRVOQf9VZ54+CFEkOrYt?= =?us-ascii?q?cifOqJzwzFjaF3TviFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.14,220,1736809200"; d="scan'208,217";a="110627070" X-MGA-submission: =?us-ascii?q?MDGKUJ/0+Z0klooifQ+i0Ts+4yMwS7fSNl+NKu?= =?us-ascii?q?bnCnoJ1iseGkYGtIUf8MliwaeTKvcfN220sj3yvcyFrfEW5I1pruUmaH?= =?us-ascii?q?EQDN4/qbxIgPeYICTpeFxunRlCQnQ/ZEr/Mv6IQT/75K4pveZBWezrAs?= =?us-ascii?q?EbZYWMvX73bDyHz4QtAbJ9Sg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Mar 2025 15:01:45 +0100 Received: from TM.local (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D6357564C57; Tue, 4 Mar 2025 15:01:43 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1741096903; bh=GxS3phYrnxN0Dt0bFRUK/vZZMopR184KVYYtvQ/NK2g=; h=From:To:Subject:Date:Message-ID; b=Pk1CMJN+VLam3XodVD+nqEWJZZFg9dv5rBr5mgdAfkJ1sU0cQrKyxFTfbMtQwyNRY SXtsVir+pBXik7sEC6YXl+/G8o3QDpWYXg+TLtO4LHYq3+2fQ0dYq3iwSKqJ18bsKK KTtHcBqFoDRwzXcU7xrapA8jqe/GIDv0FsTNaTmM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 04 Mar 2025 15:01:43 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 4 15:01:44 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.469386, queueID=28305564C59 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19277 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMjUgdG8NCk1hcmNoIDA0LCAyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50 cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CkJ5dGVjb2RlIGRlYnVnZ2luZyBpbiBPQ2FtbCA1LjMNClphbnVkYSDigJMgT0NhbWwgbGludGVy IGV4cGVyaW1lbnQNClFDaGVjayAwLjI0DQpCb2d1ZSwgdGhlIE9DYW1sIEdVSQ0KT3BhbSByZXBv c2l0b3J5IGFyY2hpdmFsIC0gbmV4dCBwaGFzZQ0KVXBjb21pbmcgQ21kbGluZXIgMi4wIGNoYW5n ZXMgdGhhdCBuZWVkIHlvdXIgYXR0ZW50aW9uDQpPQ2FtbCBFZGl0b3JzIFBsdWdpbnMgU3VydmV5 DQpEdW5lIGRldiBtZWV0aW5nDQpQbGF0Zm9ybSBOZXdzbGV0dGVyOiBTZXB0ZW1iZXIgLSBEZWNl bWJlciAyMDI0DQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KQnl0ZWNvZGUgZGVidWdn aW5nIGluIE9DYW1sIDUuMw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ieXRlY29kZS1kZWJ1 Z2dpbmctaW4tb2NhbWwtNS0zLzE2MTc3Lzc+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwg SGVucnkgVGlsbCBzYWlkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBQcm9iYWJseSB3b3J0aCBzaGFyaW5nIGhlcmU6DQog IOKAoiBbZ2RiLnB5XQ0KICDigKIgW2dkYl9vY2FtbHJ1bi5weV0NCiAg4oCiIFtsbGRiLnB5XQ0K ICDigKIgW0dldHRpbmcgU3RhcnRlZCB3aXRoIEdEQiBvbiBPQ2FtbF0NCg0KDQpbZ2RiLnB5XQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL2YwOGU4YTFhZDQ4MDEzZGJkZWZj MGU1NDE1YzJiZjQ4YTY4ODFkZTgvdG9vbHMvZ2RiLnB5Pg0KDQpbZ2RiX29jYW1scnVuLnB5XQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL2YwOGU4YTFhZDQ4MDEzZGJkZWZj MGU1NDE1YzJiZjQ4YTY4ODFkZTgvdG9vbHMvZ2RiX29jYW1scnVuLnB5Pg0KDQpbbGxkYi5weV0N CjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi9mMDhlOGExYWQ0ODAxM2RiZGVm YzBlNTQxNWMyYmY0OGE2ODgxZGU4L3Rvb2xzL2xsZGIucHk+DQoNCltHZXR0aW5nIFN0YXJ0ZWQg d2l0aCBHREIgb24gT0NhbWxdDQo8aHR0cHM6Ly9rY3Nyay5pbmZvL29jYW1sL2dkYi8yMDI0LzAx LzIwL2dkYi1vY2FtbC8+DQoNCg0KQ2hldCBNdXJ0aHkgYWxzbyBzYWlkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBG b3IgdGhvc2Ugd2hvIChsaWtlIG1lKSBoYXZlIGFsd2F5cyBiZWVuIHBlcnBsZXhlZCB3aGVuIHRo ZXkgdHJ5IHRvDQogIHVzZSBvY2FtbGRlYnVnLCBiL2MgaXQganVzdCBkb2Vzbid0IHNlZW0gdG8g d29yayBsaWtlIGdkYiBvciBwZXJsJ3MNCiAgZGVidWdnZXIsIG9yIGFueSBvdGhlciBkZWJ1Z2dl ciBJJ3ZlIHRyaWVkLCB0aGlzIHZpZGVvIHdhcyBpbW1lbnNlbHkNCiAgaGVscGZ1bC4NCg0KICA8 aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj1ER3ZKazE0c2ZpOCZ0PTcyNHM+DQoNCiAg U3BlY2lmaWNhbGx5LCBJIGxlYXJuZWQgdGhhdCBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBwcm9n cmFtLCB0byBzZXQgYQ0KICBicmVha3BvaW50IGluIHRoZSBtYWluIHByb2dyYW0gZmlsZSwgSSBu ZWVkIHRvIGRvIHNvbWV0aGluZyBsaWtlIChmb3INCiAgYSBmaWxlICJleHRyYWN0X2Vudmlyb25t ZW50cy5tbCIsIGFuZCBsaW5lIDc5KToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBicmVhayBA ZXh0cmFjdF9lbnZpcm9ubWVudHMgNzkNCiAg4pSU4pSA4pSA4pSA4pSADQogIFRoYXQgd2FzIGJs b2NraW5nIG1lIEZPUkVWRVIsIGIvYyBob2x5IGNvdyB0aGVyZSdzIGEgdG9uIG9mDQogIGluaXRp YWxpemF0aW9uLCBhbmQgSSBqdXN0IGRpZG4ndCBrbm93IGhvdyB0byBydW4gdGhydSBhbGwgdGhh dCBhbmQNCiAgZ2V0IHRvIHRoZSBmaXJzdCBtZWFuaW5nZnVsIGxpbmUgb2YgbXkgbWFpbiBwcm9n cmFtLg0KDQogIE5vdyBJIGRvLiAgSSBjYW4gbW92ZSBmb3J3YXJkIGZyb20gaGVyZSB3aXRoIG9j YW1sZGVidWcuICBGaW5hbGx5IQ0KDQoNClphbnVkYSDigJMgT0NhbWwgbGludGVyIGV4cGVyaW1l bnQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXphbnVkYS1vY2FtbC1saW50ZXIt ZXhwZXJpbWVudC8xMTc4NC8yPg0KDQoNCktha2FkdSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSB1c2luZyB0aGlzIGxp bnRlciBmb3IgdGVhY2hpbmcgZm9yIHR3byB5ZWFycywgYW5kIEknbSB2ZXJ5IGhhcHB5DQogIHRo YXQgSSBpbXBsZW1lbnRlZCBpdC4gU3R1ZGVudCdzIGNvZGUgaXMgbXVjaCBsZXNzIGFubm95aW5n IHRvIHJlYWQNCiAgOnNsaWdodF9zbWlsZToNCg0KDQpSZWxlYXNlIDEuMS4wDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgIzIyOiBBZGQgJ3Jldmlld2Vy JyB0b29sIHRvIHJlcG9ydCBsaW50J3MgYSBHaXRodWIgcmV2aWV3Lg0KICDigKIgIzEzOiBEaXNj b3VyYWdlIG1hdGNoaW5nIGEgdHVwbGUgdXNpbmcgJ21hdGNoJyBleHByZXNzaW9uIHdpdGgNCiAg ICAgc2luZ2xlIGJyYW5jaA0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiBtYXRjaCB4IHdp dGggKGEsYikgLT4gLi4uDQogICAg4pSU4pSA4pSA4pSA4pSADQogIOKAoiAjMTg6IFdhcm4gYWJv dXQgdW5uZWVkZWQgbXV0dWFsbHkgcmVjdXJzaXZlIHR5cGVzDQogIOKAoiAjMjM6IEltcGxlbWVu dCBhIHRyaWFsIHZlcnNpb24gb2YgdGhlIEZpeCBtb2R1bGUgZm9yIGF1dG8tY29ycmVjdGlvbg0K ICAgIG9mIGxpbnRzLiAgSXQgcHJvZHVjZXMgYSBkaWZmIHRoYXQgY291bGQgYmUgYXBwbGllZCBs YXRlci4gRHVuZQ0KICAgIHN1cHBvcnQgaXMgbGFja2luZw0KICDigKIgQWRkIGNvbW1hbmQgbGlu ZSBzd2l0Y2ggJy1za2lwLWxldmVsLWFsbG93IDxib29sPicgdG8gZW5hYmxlL2Rpc2FibGUNCiAg ICBsaW50cyB3aXRoIGxldmVsPUFsbG93LiBGYWxzZSBoYXMgaGlnaGVyIHByaW9yaXR5IHRoYW4g cGVyLWxpbnQNCiAgICBjb21tYW5kIGxpbmUgc3dpdGNoIChmb3IgZXhhbXBsZSwgYC1uby1zdHJp bmdfY29uY2F0JykNCiAg4oCiICMyODogV2FybiBhYm91dCB0b28gbWFueSBuZXN0ZWQgYGlmJyBl eHByZXNzaW9ucy4NCiAg4oCiICMzMjogV2FybiBhYm91dCBjb25zdHJ1Y3RvciBuYW1lcyB0aGF0 IGhpZGUgZGVmYXVsdCBjb25zdHJ1Y3Rvcg0KICAgICBuYW1lcw0KICDigKIgIzM1OiBEZXRlY3Qg bWFudWFsIGltcGxlbWVudGF0aW9ucyBvZiBMaXN0Lm1hcC9mb2xkIGZ1bmN0aW9ucw0KICDigKIg IzUwOiBQcm9wb3NlIGV0YSByZWR1Y3Rpb24gd2hlbiBhdmFpbGFibGUNCiAg4oCiICM1MTogV2Fy biBhYm91dCBwYXR0ZXJuIG1hdGNoaW5nIG9uIGJvb2xlYW4gdmFsdWVzDQogIOKAoiAjNTM6IFdh cm4gYWJvdXQgYCIlcyInIGluIGZvcm1hdHRlZCBzdHJpbmdzDQogIOKAoiAjNTQ6IERldGVjdGlv biBvZiB1bnVzZWQgcHVibGljIGRlY2xhcmF0aW9ucyBpbiAubWxpIGZpbGUuDQogIOKAoiAjNTY6 IFNpbXBsaWZ5IGxpbnQgYWJvdXQgbWlzc2luZyBsaWNlbnNlLiBXZSBsb29rIGZvciByZXF1aXJl ZA0KICAgICBkb2MtY29tbWVudHMgYW55d2hlcmUgaW4gdGhlIGZpbGUsIG5vdCBvbmx5IGluIHRo ZSBiZWdpbm5pbmcuDQogIOKAoiAjNjA6IFNraXAgc29tZSBjaGVja3MgZm9yIHNvbWUgc291cmNl IGZpbGVzIChjb25maWd1cmVkIHZpYQ0KICAgICAnLnphbnVkYScgY29uZmlnIGZpbGUpLg0KICDi gKIgIzE1OiBTcGxpdCAnc3RyaW5nX2NvbmNhdCcgbGludCB0byBjaGVjayBzZXBhcmF0ZWx5IHBh dHRlcm5zICdhXmJeYycNCiAgICAgKGxldmVsPUFsbG93KSBhbmQgJ0xpc3QuZm9sZF9sZWZ0IChe KScgKGxldmVsPVdhcm4pLg0KDQoNClFDaGVjayAwLjI0DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1xY2hlY2stMC0yNC8xNjE5OC8xPg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJJ20gaGFwcHkgdG8gYW5ub3VuY2UgdGhlIDAuMjQgcmVsZWFzZSBvZiBg cWNoZWNrJywgYHFjaGVjay1jb3JlJywNCiAgYHFjaGVjay1hbGNvdGVzdCcsIGFuZCBgcWNoZWNr LW91bml0JywgYWxvbmcgd2l0aCBhIDAuNiByZWxlYXNlIG9mDQogIGBwcHhfZGVyaXZpbmdfcWNo ZWNrJyA6dGFkYToNCg0KICBgUUNoZWNrJyBpcyBhIGxpYnJhcnkgZm9yIHJhbmRvbWl6ZWQgcHJv cGVydHktYmFzZWQgdGVzdGluZywgaW5zcGlyZWQNCiAgYnkgSGFza2VsbCdzIHNlbWluYWwgUXVp Y2tDaGVjayBsaWJyYXJ5LiBUaGUgMC4yNCByZWxlYXNlIGNvbnRhaW5zIGENCiAgcmFuZ2Ugb2Yg aW1wcm92ZW1lbnRzIHRvIHRoZSBpbnRlZ3JhdGVkIHNocmlua2luZyBvZiBgUUNoZWNrMicsDQog IGluaXRpYWxseSBpbnRyb2R1Y2VkIGluIHRoZSAwLjE4IHJlbGVhc2UuIEFzIGEgY29uc2VxdWVu Y2UsIGl0cw0KICBzaHJpbmtpbmcgYWxnb3JpdGhtcyBzaG91bGQgYWN0IG1vcmUgcHJlZGljdGFi bHksIHJlZHVjZSBmYXN0ZXIsIGFuZA0KICByZXBvcnQgc21hbGxlciBjb3VudGVyZXhhbXBsZXMu IEluIGVzc2VuY2UsIHRoZSAwLjI0IHJlbGVhc2UgaXMgd2hhdA0KICB3ZSBob3BlZCAwLjE4IHdv dWxkIGJlLiBUaGUgcmVsZWFzZSBhbHNvIGFkZHMgbWlzc2luZyBgcmVzdWx0JywNCiAgYGludDMy JywgYW5kIGBpbnQ2NCcgY29tYmluYXRvcnMsIGFzIHdlbGwgYXMgbW9yZSBkb2N1bWVudGF0aW9u Lg0KDQogIElmIHlvdSd2ZSBwcmV2aW91c2x5IGdpdmVuIGBRQ2hlY2syJydzIGludGVncmF0ZWQg c2hyaW5raW5nIGEgc3BpbiwgSQ0KICBlbmNvdXJhZ2UgeW91IHRvIHRyeSBpdCBhZ2FpbiB3aXRo IHRoZSBwYXRjaGVkIDAuMjQgcmVsZWFzZS4gRm9yIG5ldw0KICB1c2VycywgdGhlIDAuMjQgcmVs ZWFzZSBpcyBhbHNvIGEgZ29vZCBjYW5kaWRhdGUgdG8gY2hlY2sgb3V0IQ0KICA6c21pbGV5OiBQ bGVhc2Ugc2hhcmUgYW55IHByb2JsZW1zIHlvdSBlbmNvdW50ZXIgb24gdGhlIGBxY2hlY2snIHJl cG86DQogIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjaz4NCg0KICBGdWxsIGNoYW5n ZSBsb2c6DQoNCiAg4oCiIFtxY2hlY2stYWxjb3Rlc3RdIEFkZCBhbiBvcHRpb25hbCBgc3BlZWRf bGV2ZWwnIHBhcmFtZXRlciB0bw0KICAgIGB0b19hbGNvdGVzdCcNCiAg4oCiIEFkanVzdCB0aGUg YFFDaGVjazIuR2VuLmxpc3QnIHNocmlua2VyIHRvIHByb2R1Y2UgbWluaW1hbA0KICAgIGNvdW50 ZXJleGFtcGxlcyBhdCBzaXplIDMgdG9vDQogIOKAoiBSZXBsYWNlIHRoZSBgUUNoZWNrMicgT0Nh bWwgNCBgUmFuZG9tLlN0YXRlLnNwbGl0JyBoYWNrIHdpdGggYQ0KICAgIGZhc3RlciBvbmUNCiAg 4oCiIEltcHJvdmUgdGhlIGBRQ2hlY2syLkdlbi5saXN0JyBzaHJpbmtlciBoZXVyaXN0aWMgYW5k IHV0aWxpemUgdGhlDQogICAgaW1wcm92ZWQgc2hyaW5rZXIgaW4gb3RoZXIgYFFDaGVjazInDQog ICAgYHtsaXN0LGFycmF5LGJ5dGVzLHN0cmluZyxmdW5jdGlvbn0qJyBzaHJpbmtlcnMNCiAg4oCi IFVzZSBgc3BsaXQnIGFuZCBgY29weScgaW4gYFJhbmRvbS5TdGF0ZScgdW5kZXJseWluZyBgUUNo ZWNrMicgdG8NCiAgICBhdm9pZCBub24tZGV0ZXJtaW5pc3RpYyBzaHJpbmtpbmcgYmVoYXZpb3Vy DQogIOKAoiBBZGQgbWlzc2luZyBkb2N1bWVudGF0aW9uIHN0cmluZ3MgZm9yDQogICAgYFFDaGVj ay57UHJpbnQsSXRlcixTaHJpbmssR2VufScgYW5kIGBRQ2hlY2syLkdlbicuDQogIOKAoiBBZGQg YHJlc3VsdCcgY29tYmluYXRvcnMgdG8gYFFDaGVjaycsDQogICAgYFFDaGVjay57R2VuLFByaW50 LFNocmluayxPYnNlcnZhYmxlfScsIGFuZA0KICAgIGBRQ2hlY2syLntHZW4sUHJpbnQsT2JzZXJ2 YWJsZX0nLg0KICDigKIgQWRkIG1pc3NpbmcgY29tYmluYXRvcnMgYFFDaGVja3ssMn0uUHJpbnQu aW50ezMyLDY0fScsDQogICAgYFFDaGVjay5HZW4uaW50ezMyLDY0fScsIGBRQ2hlY2t7LDJ9Lk9i c2VydmFibGUuaW50ezMyLDY0fScsIGFuZA0KICAgIGRlcHJlY2F0ZSBgUUNoZWNrLkdlbi57dWkz Mix1aTY0fScNCiAg4oCiIERvY3VtZW50IGBkdW5lJyB1c2FnZSBpbiBSRUFETUUNCg0KICBIYXBw eSB0ZXN0aW5nISA6c21pbGV5OiA6a2V5Ym9hcmQ6DQoNCg0KQm9ndWUsIHRoZSBPQ2FtbCBHVUkN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJvZ3Vl LXRoZS1vY2FtbC1ndWkvOTA5OS82Mz4NCg0KDQpzYW5ldHRlIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBhbGws DQoNCiAgSeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgYSBuZXcgdmVyc2lvbiBvZiBbQm9ndWVdLCB2 ZXJzaW9uIDIwMjUwMjI0LCBub3cNCiAgYXZhaWxibGUgb24gYG9wYW0nLg0KDQogIFRoZSBtYWlu IG5vdmVsdHkgaXMgYSBicmFuZCBuZXcgKkZpbGUgZGlhbG9nKi4gSXQgd2lsbCBvcGVuIGEgbmV3 DQogIHdpbmRvdyAob3IgcG9wdXApIHdoaWNoIHdpbGwgbGV0IHRoZSB1c2VyIG5hdmlnYXRlIHRo ZSBmaWxlIHN5c3RlbSBhbmQNCiAgc2VsZWN0IG9uZSBvciBtb3JlIGZpbGVzIG9yIGRpcmVjdG9y aWVzLg0KDQogIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIG5ldyBbRmlsZV0gbW9kdWxlLg0KDQog IFlvdSBtaWdodCBhbHNvIGJlIGludGVyZXN0ZWQgaW4gdGhlIFtNb25pdG9yXSBzdWJtb2R1bGUs IHdoaWNoDQogIGltcGxlbWVudHMgYSAqZmlsZSBtb25pdG9yaW5nKiBBUEkgYmFzZWQgb24gYGZz d2F0Y2gnIChpZiBhdmFpbGFibGUpDQogIG9yIGBVbml4LnN0YXQnLg0KDQogIElmIHlvdSBhcmUg Y3VyaW91cywgaGVyZSBpcyBhIGdyYXBoaWNhbCBzdW1tYXJ5IG9mIHRoZSBjdXJyZW50DQogIGZ1 bmN0aW9uYWxpdGllcyBvZiBCb2d1ZSdzIGZpbGUgZGlhbG9nIChJIGhvcGUgdGhhdCBtb3JlIHdp bGwgYmUgYWRkZWQNCiAgc29vbjsgSSdtIG9wZW4gdG8gc3VnZ2VzdGlvbnMpDQoNCiAgPGh0dHBz Oi8vdXMxLmRpc2NvdXJzZS1jZG4uY29tL2ZsZXgwMjAvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8y WC9iL2I2ZWZiZTVlYjQwMjM3ZGIwZmM0YjVmMDM2YjE2MzdhNzlkZTc4NzUucG5nPg0KDQogIFBT OiBAU2FjaGluZHJhX1JhZ3VsLCB5ZXMgd2UgZGlkIGl0IGZpbmFsbHkgOykgYmV0dGVyIGxhdGUg dGhhbiBuZXZlcg0KDQoNCltCb2d1ZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zYW5ldHRlL2JvZ3Vl Pg0KDQpbRmlsZV0gPGh0dHA6Ly9zYW5ldHRlLmdpdGh1Yi5pby9ib2d1ZS9Cb2d1ZS5GaWxlLmh0 bWw+DQoNCltNb25pdG9yXSA8aHR0cDovL3NhbmV0dGUuZ2l0aHViLmlvL2JvZ3VlL0JvZ3VlLkZp bGUuTW9uaXRvci5odG1sPg0KDQoNCk9wYW0gcmVwb3NpdG9yeSBhcmNoaXZhbCAtIG5leHQgcGhh c2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3BhbS1yZXBv c2l0b3J5LWFyY2hpdmFsLW5leHQtcGhhc2UvMTYyMDMvMT4NCg0KDQpIYW5uZXMgTWVobmVydCBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgZXZlcnlvbmUsDQoNCiAgc29ycnkg Zm9yIHRoZSBzaWxlbmNlIOKAkyB0aGUgcGhhc2UgMyBvZiB0aGUgb3BhbSByZXBvc2l0b3J5IGFy Y2hpdmFsDQogICh0YWtpbmcgdGhlIHgtbWFpbnRlbmFuY2UtaW50ZW50IGludG8gYWNjb3VudCkg aGFzIHRvIGJlIGRlbGF5ZWQgYnkNCiAgKHRlbnRhdGl2ZWx5KSBvbmUgbW9udGguIFRoZSByZWFz b24gaXMgdGhhdCBvdXIgdG9vbGluZyBpcyBub3QgcmVhZHkgLQ0KICB0aGUgdGFzaywgZ2l2ZW4g YW4gb3BhbSByZXBvc2l0b3J5IGFuZCBtYWludGVuYW5jZS1pbnRlbnQgb24gcGFja2FnZXMsDQog IHdoaWNoIGNhbiBiZSBzYWZlbHkgYXJjaGl2ZWQsIGlzIGhhcmRlciB0aGFuIGl0IHNlZW1zOg0K ICDigKIgd2UndmUgdG8gdGFrZSBjb21waWxlciB2ZXJzaW9ucyBpbnRvIGFjY291bnQNCiAg4oCi IHRoZXJlIG1heSBiZSBhIHBhY2thZ2UgWCBpbiB2ZXJzaW9uIDEgYW5kIDIsIGJvdGggc3VwcG9y dGluZyBPQ2FtbA0KICAgIDQuMDgsIGJ1dCBkZXBlbmQgb24gcGFja2FnZSBZICh3aGVyZSBYLjEg ZGVwZW5kcyBvbiBZID49IDEsIGFuZCBYLjINCiAgICBkZXBlbmRzIG9uIFkgPj0gMikg4oCTIG5v dyBZLjEgY291bGQgc3VwcG9ydCBPQ2FtbCA0LjA4LCBhbmQgWS4yIG9ubHkNCiAgICBPQ2FtbCA0 LjEyIOKAkyBzbyBpdCBpcyBub3Qgc2FmZSB0byBhcmNoaXZlIFguMSAoc2luY2Ugb24gT0NhbWwg NC4wOA0KICAgIHRoZXJlIHdvbid0IGJlIGFueSBYIGluc3RhbGxhYmxlKS4gQW5kIHRoaXMgbWF5 IGJlIGRlZXBseSBuZXN0ZWQgaW4NCiAgICB0aGUgZGVwZW5kZW5jeSBjaGFpbg0KDQogIEl0IGlz IHVzZWZ1bCBpZiB5b3UgbWFyayB5b3VyIHBhY2thZ2VzIHdpdGggYHgtbWFpbnRlbmFuY2UtaW50 ZW50JyAoYXMNCiAgbWVudGlvbmVkIGluDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv b3BhbS1yZXBvc2l0b3J5LWFyY2hpdmUtY2xhcmlmaWNhdGlvbi1vZi10aGUtb3BhbS1maWVsZHM+ KS4NCg0KICBXZSdsbCBsZXQgeW91IGtub3cgb25jZSB3ZSBoYXZlIHRvb2xpbmcgaW4gcGxhY2Ug dG8gY29wZSB3aXRoIHRoZSB0YXNrDQogIGRlc2NyaWJlZCBhYm92ZSAoZGV2ZWxvcG1lbnQgaXMg aGFwcGVuaW5nIGhlcmU6DQogIDxodHRwczovL2dpdGh1Yi5jb20vaGFubmVzbS9tYWludGVuYW5j ZS1pbnRlbnQtZmlsdGVyPikuDQoNCg0KVXBjb21pbmcgQ21kbGluZXIgMi4wIGNoYW5nZXMgdGhh dCBuZWVkIHlvdXIgYXR0ZW50aW9uDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3VwY29taW5nLWNtZGxpbmVyLTItMC1jaGFuZ2VzLXRoYXQtbmVlZC15b3VyLWF0dGVudGlv bi8xNjIxMS8xPg0KDQoNCkRhbmllbCBCw7xuemxpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSWYgeW91IGFyZSBhIHVzZXIgb2YgYGNtZGxpbmVyJyBub3RlIHRoYXQgY21kbGluZXIgMi4w IOKAkyBpbiBleGNoYW5nZQ0KICBmb3IgYXV0by1jb21wbGV0aW9uIHN1cHBvcnQg4oCTIHdpbGwg cmVtb3ZlIHRoZSBhYmlsaXR5IHRvIHNwZWNpZnkNCiAgY29tbWFuZCBhbmQgb3B0aW9ucyBuYW1l cyBieSB1bmFtYmlndW91cyBwcmVmaXhlcyBhY2NvcmRpbmcgdG8gW3RoaXMNCiAgcGxhbiBvZiBh Y3Rpb25dLg0KDQogIElmIHlvdSBhcmUgaG9ycmlmaWVkIGJ5IGl0IHBsZWFzZSBjaGltZSBpbiBv biB0aGUgaXNzdWUuDQoNCg0KW3RoaXMgcGxhbiBvZiBhY3Rpb25dIDxodHRwczovL2dpdGh1Yi5j b20vZGJ1ZW56bGkvY21kbGluZXIvaXNzdWVzLzIwMD4NCg0KDQpPQ2FtbCBFZGl0b3JzIFBsdWdp bnMgU3VydmV5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLWVkaXRvcnMtcGx1Z2lucy1zdXJ2ZXkv MTYyMTYvMT4NCg0KDQpQaXppZUR1c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbywgd2UgYXJlIGNv bmR1Y3RpbmcgYSBzaG9ydCBzdXJ2ZXkgdG8gYmV0dGVyIHVuZGVyc3RhbmQgaG93IHlvdQ0KICB1 c2UgdGhlIGRpZmZlcmVudCBlZGl0b3IgcGx1Z2lucyBhdmFpbGFibGUgZm9yIE9DYW1sLiBQbGVh c2UgdGFrZSBhDQogIGZldyBtaW51dGVzIChpZGVhbGx5IDUpIHRvIGZpbGwgb3V0IHRoZSBmb3Jt Lg0KDQogIDxodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9mb3Jtcy9kL2UvMUZBSXBRTFNmR0dGWkJp dzRQRjdMMHl0MkRCWDg0NDNHNV83YUZMNXY2d3ZvNnA1TXdMLURXOFEvdmlld2Zvcm0/dXNwPXBw X3VybCZlbnRyeS40NTQwMTM4NTg9RGlzY3Vzcz4NCg0KICBUaGFuayB5b3UgOikgOmNhbWVsOg0K DQoNCkR1bmUgZGV2IG1lZXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWR1bmUtZGV2LW1lZXRpbmcvMTQ5OTQvMjU+DQoNCg0KRXRpZW5uZSBNYXJhaXMgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSA6Y2FtZWw6DQoNCiAgVGhlIG5l eHQgRHVuZSBEZXYgTWVldGluZyB3aWxsIGJlIG9uICpXZWRuZXNkYXksIE1hcmNoLCA1dGggYXQg OTowMA0KICBDRVQqLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgb25lLWhvdXItbG9uZyBtZWV0aW5n Lg0KDQogIFdoZXRoZXIgeW91IGFyZSBhIG1haW50YWluZXIsIGEgcmVndWxhciBjb250cmlidXRv ciwgYSBuZXcgam9pbmVyIG9yDQogIGp1c3QgY3VyaW91cywgeW91IGFyZSB3ZWxjb21lIHRvIGpv aW46IHRoZXNlIGRpc2N1c3Npb25zIGFyZSBvcGVuZWQhDQogIFRoZSBnb2FsIG9mIHRoZXNlIG1l ZXRpbmdzIGlzIHRvIHByb3ZpZGUgYSBwbGFjZSB0byBkaXNjdXNzIHRoZQ0KICBvbmdvaW5nIHdv cmsgdG9nZXRoZXIgYW5kIHN5bmNocm9uaXplIHdpdGggdGhlIER1bmUgZGV2ZWxvcGVycyA6c21p bGU6DQoNCiAgVGhlIGFnZW5kYSBpcyBhdmFpbGFibGUgb24gdGhlIFttZWV0aW5nIGRlZGljYXRl ZCBwYWdlXS4gRmVlbCBmcmVlIHRvDQogIGFkZCBtb3JlIGl0ZW1zIGluIGl0Lg0KDQogIOKAoiBN ZWV0aW5nIGxpbms6IFt6b29tXQ0KICDigKIgQ2FsZW5kYXIgZXZlbnQ6IFtnb29nbGUgY2FsZW5k YXJdDQogIOKAoiBXaWtpIHdpdGggaW5mb3JtYXRpb25zIGFuZCBwcmV2aW91cyBub3RlczogW2R1 bmUgd2lraSBvbiBnaXRodWJdDQoNCg0KW21lZXRpbmcgZGVkaWNhdGVkIHBhZ2VdDQo8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lraS9kZXYtbWVldGluZy0yMDI1LTAzLTA1Pg0KDQpb em9vbV0NCjxodHRwczovL3VzMDZ3ZWIuem9vbS51cy9qLzg1MDk2ODc3Nzc2P3B3ZD1jV05oVTFk SFExWk5Talp1T1VaQ1EwaDJieTlVZHowOT4NCg0KW2dvb2dsZSBjYWxlbmRhcl0NCjxodHRwczov L2NhbGVuZGFyLmdvb2dsZS5jb20vY2FsZW5kYXIvdS8wL2VtYmVkP3NyYz1jXzVjZDY5OGRmNjc4 NGUzODViMWNkY2RjMWRiY2ExOGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzczMTlAZ3Jv dXAuY2FsZW5kYXIuZ29vZ2xlLmNvbT4NCg0KW2R1bmUgd2lraSBvbiBnaXRodWJdIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtpPg0KDQoNClBsYXRmb3JtIE5ld3NsZXR0ZXI6IFNl cHRlbWJlciAtIERlY2VtYmVyIDIwMjQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcGxhdGZvcm0tbmV3c2xldHRl ci1zZXB0ZW1iZXItZGVjZW1iZXItMjAyNC8xNjIyMS8xPg0KDQoNClNhYmluZSBTY2htYWx0eiBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlbGNvbWUgdG8gdGhlIHRoaXJ0ZWVu dGggZWRpdGlvbiBvZiB0aGUgT0NhbWwgUGxhdGZvcm0gbmV3c2xldHRlciENCg0KICBJbiB0aGlz IFNlcHRlbWJlci1EZWNlbWJlciAyMDI0IGVkaXRpb24sIHdlIGFyZSBleGNpdGVkIHRvIGJyaW5n IHlvdQ0KICB0aGUgbGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29udGludWluZyBvdXIg dHJhZGl0aW9uIG9mDQogIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1lbnRzIGFzIHNlZW4g aW4gW3ByZXZpb3VzIGVkaXRpb25zXS4gVG8NCiAgdW5kZXJzdGFuZCB0aGUgZGlyZWN0aW9uIHdl J3JlIGhlYWRlZCwgZXNwZWNpYWxseSByZWdhcmRpbmcNCiAgZGV2ZWxvcG1lbnQgd29ya2Zsb3dz IGFuZCB1c2VyIGV4cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBvdXQgb3VyDQogIFtyb2Fk bWFwXS4NCg0KICAqSGlnaGxpZ2h0czoqDQoNCiAg4oCiICpEdW5lIEVuYWJsZXMgQ2FjaGUgQnkg RGVmYXVsdCwgQWRkcyBXZWJBc3NlbWJseSBTdXBwb3J0KiBUaGUgbGF0ZXN0DQogICAgRHVuZSBy ZWxlYXNlcyBtYXJrIHNpZ25pZmljYW50IHByb2dyZXNzIGluIGJ1aWxkIHBlcmZvcm1hbmNlIGFu ZA0KICAgIGxhbmd1YWdlIHN1cHBvcnQuIFZlcnNpb24gMy4xNy4wIGVuYWJsZXMgdGhlIER1bmUg Y2FjaGUgYnkgZGVmYXVsdA0KICAgIGZvciBrbm93bi1zYWZlIG9wZXJhdGlvbnMsIGltcHJvdmlu ZyBidWlsZCB0aW1lcyBmb3IgY29tbW9uDQogICAgdGFza3MuIFRoZSBhZGRpdGlvbiBvZiBXYXNt X29mX29jYW1sIHN1cHBvcnQgb3BlbnMgbmV3IHBvc3NpYmlsaXRpZXMNCiAgICBmb3IgT0NhbWwg cHJvamVjdHMgdGFyZ2V0aW5nIHRoZSB3ZWIgb3Igb3RoZXIgV2ViQXNzZW1ibHkNCiAgICBydW50 aW1lcy4gSW4gYWRkaXRpb24sIER1bmUgbm93IHN1cHBvcnRzIGFkZGluZyBDb2RlYmVyZyBhbmQg R2l0TGFiDQogICAgcmVwb3NpdG9yaWVzIHZpYSB0aGUgYChzb3VyY2UpJyBzdGFuemEuDQogIOKA oiAqb3BhbSAyLjMuMCogQXMgYW5ub3VuY2VkIHdpdGggb3BhbSAyLjIsIG9wYW0gcmVsZWFzZXMg YXJlIG5vdw0KICAgIHRpbWUtYmFzZWQgd2l0aCBhIGNhZGVuY2Ugb2YgNiBtb250aHMuIE9wYW0g Mi4zIGhhcyBiZWVuIHJlbGVhc2VkDQogICAgbGFzdCBOb3ZlbWJlci4gSXQgY29udGFpbnMgYSBt YWpvciBicmVha2luZyBjaGFuZ2UgcmVnYXJkaW5nDQogICAgZXh0cmEtZmlsZXMgaGFuZGxpbmc6 IGV4dHJhLWZpbGVzIGFyZSBub3cgaWdub3JlZCB3aGVuIHRoZXkgYXJlIG5vdA0KICAgIHByZXNl bnQgaW4gdGhlIG9wYW0gZmlsZS4gUHJldmlvdXNseSB0aGV5IHdlcmUgc2lsZW50bHkgYWRkZWQu IFRoaXMNCiAgICByZWxlYXNlIGFkZHMgYWxzbyBzb21lIG5ldyBjb21tYW5kcyBsaWtlIGBvcGFt IGxpc3QgLS1sYXRlc3Qtb25seScNCiAgICBvciBgb3BhbSBpbnN0YWxsIGZvbyAtLXZlcmJvc2Ut b24gYmFyJywgYW1vbmcgb3RoZXIgZml4ZXMgYW5kDQogICAgZW5oYW5jZW1lbnRzLg0KICDigKIg KkltcHJvdmVkIEVkaXRvciBXb3JrZmxvd3Mgd2l0aCBPQ2FtbC1MU1AgYW5kIE1lcmxpbiogQSBt YWpvcg0KICAgIG1pbGVzdG9uZSBmb3IgcHJvamVjdC13aWRlIGZlYXR1cmVzIGhhcyBiZWVuIHJl YWNoZWQgd2l0aCB0aGUNCiAgICByZWxlYXNlIG9mIE9DYW1sIDUuMzogTFNQJ3MgcmVuYW1pbmcg ZmVhdHVyZSBub3cgW19yZW5hbWVzIHN5bWJvbHMNCiAgICBpbiB0aGUgZW50aXJlIHByb2plY3Rf XSBpZiB0aGUgaW5kZXggaXMgYnVpbHQuIEFkZGl0aW9uYWxseSxhbGwgb2YNCiAgICB0aGUgY2xh c3NpYyBtZXJsaW4tc2VydmVyIGNvbW1hbmRzIGFyZSBub3cgYXZhaWxhYmxlIGFzIExTUCBjdXN0 b20NCiAgICByZXF1ZXN0czogdGhpcyBlbmFibGVkIHRoZSBhZGRpdGlvbiBvZiBbbWFueSBuZXcg ZmVhdHVyZXMgdG8gdGhlDQogICAgVmlzdWFsIFN0dWRpbyBDb2RlIHBsdWdpbl0uIEZpbmFsbHkg YSBicmFuZCBuZXcgRW1hY3MgbW9kZSwgYmFzZWQgb24NCiAgICBMU1AgYW5kIHRoZSBuZXcgY3Vz dG9tIHF1ZXJpZXMgaXMgW25vdyBhdmFpbGFibGUgb24gTWVscGFdLg0KICDigKIgKlBlcmZvcm1h bmNlIGFuZCBTZWN1cml0eSBFbmhhbmNlbWVudHMqIFJlY2VudCB1cGRhdGVzIGFjcm9zcyB0aGUN CiAgICBwbGF0Zm9ybSBmb2N1cyBvbiBwZXJmb3JtYW5jZSBhbmQgcmVsaWFiaWxpdHkuIER1bmUg b3B0aW1pemVkIGl0cw0KICAgIGhhbmRsaW5nIG9mIC5jbXhzIGZpbGVzLCB3aGlsZSBvcGFtIGlt cGxlbWVudGVkIHN0cmljdGVyIGdpdA0KICAgIHN1Ym1vZHVsZSBlcnJvciBjaGVja2luZy4gT0Nh bWwtTFNQIHJlc29sdmVkIGZpbGUgZGVzY3JpcHRvciBsZWFrcywNCiAgICBjb250cmlidXRpbmcg dG8gYSBtb3JlIHN0YWJsZSBkZXZlbG9wbWVudCBlbnZpcm9ubWVudC4NCg0KICAqRmVhdHVyZSBH dWlkZXMgJiBBbm5vdW5jZW1lbnRzOioNCg0KICDigKIgW0luc3RhbGxpbmcgRGV2ZWxvcGVyIFRv b2xzIHdpdGggRHVuZV0NCiAg4oCiIFtTaGVsbCBDb21wbGV0aW9ucyBpbiBEdW5lIERldmVsb3Bl ciBQcmV2aWV3XQ0KICDigKIgW09DYW1sIEluZnJhc3RydWN0dXJlOiBFbmhhbmNpbmcgUGxhdGZv cm0gU3VwcG9ydCBhbmQgVXNlcg0KICAgIEV4cGVyaWVuY2VdDQogIOKAoiBbQ2FsbCBmb3IgRmVl ZGJhY2tdDQoNCiAgKlJlbGVhc2VzOioNCg0KICDigKIgW09DYW1sLUxTUCAxLjIwLjFdDQogIOKA oiBbb3BhbS1wdWJsaXNoIDIuNS4wXQ0KICDigKIgW01lcmxpbiA1LjMtNTAyIGZvciBPQ2FtbCA1 LjIgYW5kIDQuMTgtNDE0IGZvciBPQ2FtbCA0LjE0XQ0KICDigKIgW0R1bmUgMy4xNy4xXQ0KICDi gKIgW09DYW1sZm9ybWF0IDAuMjcuMF0NCiAg4oCiIFtEdW5lIDMuMTcuMF0NCiAg4oCiIFtvcGFt IDIuMy4wXQ0KICDigKIgW0R1bmUgMy4xNi4xXQ0KICDigKIgW01lcmxpbiA1LjIuMS01MDIgZm9y IE9DYW1sIDUuMiBhbmQgNC4xNy4xIGZvciBPQ2FtbCA1LjEgYW5kIDQuMTRdDQoNCg0KW3ByZXZp b3VzIGVkaXRpb25zXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90YWcvcGxhdGZvcm0tbmV3 c2xldHRlcj4NCg0KW3JvYWRtYXBdIDxodHRwczovL29jYW1sLm9yZy9kb2NzL3BsYXRmb3JtLXJv YWRtYXA+DQoNCltfcmVuYW1lcyBzeW1ib2xzIGluIHRoZSBlbnRpcmUgcHJvamVjdF9dDQo8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tZXJsaW4tYW5kLW9jYW1sLWxzcC1zdXBwb3J0 LWV4cGVyaW1lbnRhbC1wcm9qZWN0LXdpZGUtcmVuYW1pbmcvMTYwMDg+DQoNClttYW55IG5ldyBm ZWF0dXJlcyB0byB0aGUgVmlzdWFsIFN0dWRpbyBDb2RlIHBsdWdpbl0NCjxodHRwczovL3Rhcmlk ZXMuY29tL2Jsb2cvMjAyNS0wMi0yOC1mdWxsLWJsb3duLXByb2R1Y3Rpdml0eS1pbi12c2NvZGUt d2l0aC1vY2FtbC8+DQoNCltub3cgYXZhaWxhYmxlIG9uIE1lbHBhXSA8aHR0cHM6Ly9tZWxwYS5v cmcvIy9vY2FtbC1lZ2xvdD4NCg0KW0luc3RhbGxpbmcgRGV2ZWxvcGVyIFRvb2xzIHdpdGggRHVu ZV0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMS0xNS1pbnN0YWxsaW5nLWRl dmVsb3Blci10b29scy13aXRoLWR1bmU+DQoNCltTaGVsbCBDb21wbGV0aW9ucyBpbiBEdW5lIERl dmVsb3BlciBQcmV2aWV3XQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI0LTEwLTI5 LXNoZWxsLWNvbXBsZXRpb25zLWluLWR1bmUtZGV2ZWxvcGVyLXByZXZpZXc+DQoNCltPQ2FtbCBJ bmZyYXN0cnVjdHVyZTogRW5oYW5jaW5nIFBsYXRmb3JtIFN1cHBvcnQgYW5kIFVzZXIgRXhwZXJp ZW5jZV0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMC0wMi11cGRhdGVzPg0K DQpbQ2FsbCBmb3IgRmVlZGJhY2tdDQo8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjQt MDktMjUtY2FsbC1mb3ItZmVlZGJhY2s+DQoNCltPQ2FtbC1MU1AgMS4yMC4xXQ0KPGh0dHBzOi8v b2NhbWwub3JnL2NoYW5nZWxvZy8yMDI0LTEyLTIzLW9jYW1sLWxzcC0xLjIwLjE+DQoNCltvcGFt LXB1Ymxpc2ggMi41LjBdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW9wYW0vb3BhbS1wdWJs aXNoL3JlbGVhc2VzL3RhZy8yLjUuMD4NCg0KW01lcmxpbiA1LjMtNTAyIGZvciBPQ2FtbCA1LjIg YW5kIDQuMTgtNDE0IGZvciBPQ2FtbCA0LjE0XQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxv Zy8yMDI0LTEyLTIzLW1lcmxpbi01LjMuNTAyLWFuZC00LjE4LjQxND4NCg0KW0R1bmUgMy4xNy4x XSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjQtMTItMTgtZHVuZS4zLjE3LjE+DQoN CltPQ2FtbGZvcm1hdCAwLjI3LjBdDQo8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjQt MTItMDItb2NhbWxmb3JtYXQtMC4yNy4wPg0KDQpbRHVuZSAzLjE3LjBdIDxodHRwczovL29jYW1s Lm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMS0yNy1kdW5lLjMuMTcuMD4NCg0KW29wYW0gMi4zLjBdIDxo dHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMS0xMy1vcGFtLTItMy0wPg0KDQpbRHVu ZSAzLjE2LjFdIDxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMC0zMC1kdW5lLjMu MTYuMT4NCg0KW01lcmxpbiA1LjIuMS01MDIgZm9yIE9DYW1sIDUuMiBhbmQgNC4xNy4xIGZvciBP Q2FtbCA1LjEgYW5kIDQuMTRdDQo8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjQtMDkt MjctbWVybGluLTUuMi4xPg0KDQoqRHVuZSoNCuKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpSb2Fk bWFwOiogW0RldmVsb3AgLyAoVzQpIEJ1aWxkIGEgUHJvamVjdF0NCg0KICBbRHVuZSAzLjE3IHdh cyByZWxlYXNlZF0gd2l0aCBzaWduaWZpY2FudCBpbXByb3ZlbWVudHMgdG8gcGFja2FnZQ0KICBt YW5hZ2VtZW50LiBLZXkgZmVhdHVyZXMgaW5jbHVkZSBiaW5hcnkgZGlzdHJpYnV0aW9uIHN1cHBv cnQsIGJldHRlcg0KICBlcnJvciBtZXNzYWdlcyBmb3IgbWlzc2luZyBwYWNrYWdlcywgYW5kIFdp bmRvd3Mgc3VwcG9ydCB3aXRob3V0DQogIHJlcXVpcmluZyBPUEFNLg0KDQogIFRoZSBbRHVuZSBE ZXZlbG9wZXIgUHJldmlldyB3ZWJzaXRlXSBub3cgcHJvdmlkZXMgZWRpdG9yIHNldHVwDQogIGlu c3RydWN0aW9ucyBhbmQgcGFja2FnZSBtYW5hZ2VtZW50IHR1dG9yaWFscy4NCg0KICBEdW5lJ3Mg cGFja2FnZSBtYW5hZ2VtZW50IGZlYXR1cmVzIFt3ZXJlIHRlc3RlZCBhY3Jvc3MgaHVuZHJlZHMg b2YNCiAgcGFja2FnZXNdIGluIHRoZSBvcGFtIHJlcG9zaXRvcnksIGFuZCBhIGNvdmVyYWdlIHRv b2wgd2FzIGRldmVsb3BlZCB0bw0KICB0cmFjayBidWlsZCBzdWNjZXNzIHJhdGVzLiBGb3IgbG9j YWwgZGV2ZWxvcG1lbnQsIER1bmUgYWRkZWQgc3VwcG9ydA0KICBmb3IgYnVpbGRpbmcgZGVwZW5k ZW5jaWVzIHZpYSBgQHBrZy1pbnN0YWxsJywgY2FjaGluZyBmb3IgcGFja2FnZQ0KICBidWlsZHMs IGFuZCBhdXRvbWF0ZWQgYmluYXJ5IGJ1aWxkcyBvZiBkZXZlbG9wbWVudCB0b29scy4gVGhlIHN5 c3RlbQ0KICBzdXBwb3J0cyBib3RoIG1vbm9yZXBvIGFuZCBwb2x5cmVwbyB3b3JrZmxvd3MsIHdp dGggb3B0aW9ucyBmb3INCiAgaW5zdGFsbGluZyBpbmRpdmlkdWFsIGRlcGVuZGVuY2llcyBvciBj b21wbGV0ZSBkZXZlbG9wbWVudA0KICBlbnZpcm9ubWVudHMuDQoNCiAgVGhlIGFkZGl0aW9uIG9m IFtXYXNtX29mX29jYW1sIHN1cHBvcnQgaW4gRHVuZV0gb3BlbnMgbmV3DQogIHBvc3NpYmlsaXRp ZXMgZm9yIE9DYW1sIHByb2plY3RzIHRhcmdldGluZyB0aGUgd2ViIG9yIG90aGVyDQogIFdlYkFz c2VtYmx5IHJ1bnRpbWVzLg0KDQogICpBY3Rpdml0aWVzOioNCiAg4oCiIFVwZGF0ZWQgcHJldmll dyB3ZWJzaXRlIHdpdGggZWRpdG9yIHNldHVwIGluc3RydWN0aW9ucyBhdA0KICAgIDxodHRwczov L3ByZXZpZXcuZHVuZS5idWlsZD4gYW5kIHB1Ymxpc2hlZCBiaW5hcnkgaW5zdGFsbGVyDQogICAg cHJvdmlkaW5nIHByZWJ1aWx0IER1bmUgYmluYXJpZXMNCiAg4oCiIFtFbmFibGUgZHVuZSBjYWNo ZSBieSBkZWZhdWx0XQ0KICDigKIgW0FkZGVkIHdhc21fb2Zfb2NhbWwgc3VwcG9ydF0NCiAg4oCi IEFkZGVkIHN1cHBvcnQgZm9yIFtDb2RlYmVyZ10gYW5kIFtHaXRMYWIgb3JnYW5pemF0aW9uc10g aW4gdGhlDQogICAgYChzb3VyY2UpJyBzdGFuemENCiAg4oCiIFtBZGRlZCBzdXBwb3J0IGZvciBg LUgnIGNvbXBpbGVyIGZsYWddIGVuYWJsaW5nIGJldHRlciBzZW1hbnRpY3MgZm9yDQogICAgYChp bXBsaWNpdF90cmFuc2l0aXZlX2RlcHMgZmFsc2UpJw0KDQogICpNYWludGFpbmVkIGJ5OiogUnVk aSBHcmluYmVyZyAoQHJncmluYmVyZywgSmFuZSBTdHJlZXQpLCBOaWNvbMOhcw0KICAgT2plZGEg QsOkciAoQG5vamIsIExleGlGaSksIE1hcmVrIEt1YmljYSAoQExlb25pZGFzLWZyb20tWElWLA0K ICAgVGFyaWRlcyksIEV0aWVubmUgTWlsbG9uIChAZW1pbGxvbiwgVGFyaWRlcyksIFN0ZXBoZW4g U2hlcnJhdHQNCiAgIChAZ3JpZGJ1Z3MsIFRhcmlkZXMpLCBBbnRvbmlvIE51bm8gTW9udGVpcm8g KEBhbm1vbnRlaXJvKQ0KDQoNCltEZXZlbG9wIC8gKFc0KSBCdWlsZCBhIFByb2plY3RdDQo8aHR0 cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwI3c0LWJ1aWxkLWEtcHJvamVjdD4N Cg0KW0R1bmUgMy4xNyB3YXMgcmVsZWFzZWRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1kdW5lLTMtMTcvMTU3NzA+DQoNCltEdW5lIERldmVsb3BlciBQcmV2aWV3IHdlYnNpdGVd IDxodHRwczovL3ByZXZpZXcuZHVuZS5idWlsZD4NCg0KW3dlcmUgdGVzdGVkIGFjcm9zcyBodW5k cmVkcyBvZiBwYWNrYWdlc10gPGh0dHBzOi8vZHVuZS5jaGVjay5jaS5kZXYvPg0KDQpbV2FzbV9v Zl9vY2FtbCBzdXBwb3J0IGluIER1bmVdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUv cHVsbC8xMTA5Mz4NCg0KW0VuYWJsZSBkdW5lIGNhY2hlIGJ5IGRlZmF1bHRdDQo8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC8xMDcxMD4NCg0KW0FkZGVkIHdhc21fb2Zfb2NhbWwg c3VwcG9ydF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTEwOTM+DQoNCltD b2RlYmVyZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTA5MDQ+DQoNCltH aXRMYWIgb3JnYW5pemF0aW9uc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwv MTA3NjY+DQoNCltBZGRlZCBzdXBwb3J0IGZvciBgLUgnIGNvbXBpbGVyIGZsYWddDQo8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbC8xMDY0ND4NCg0KDQoqRWRpdG9yIFRvb2xzKg0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgKlJvYWRtYXA6 KiBbRWRpdCAvIChXMTkpIE5hdmlnYXRlIENvZGVdLCBbRWRpdCAvIChXMjApIFJlZmFjdG9yIENv ZGVdDQoNCiAgRGV2ZWxvcGVyIHRvb2xpbmcgcmVjZWl2ZWQgc3Vic3RhbnRpYWwgdXBncmFkZXMg ZHVyaW5nIHRoZSBlbmQgb2YgbGFzdA0KICB5ZWFyIGFuZCB0aGUgYmVnaW5uaW5nIDIwMjUuIEEg bWFqb3IgbWlsZXN0b25lIGZvciBwcm9qZWN0LXdpZGUNCiAgZmVhdHVyZXMgaGFzIGJlZW4gcmVh Y2hlZCB3aXRoIHRoZSByZWxlYXNlIG9mIE9DYW1sIDUuMzogTFNQJ3MNCiAgcmVuYW1pbmcgZmVh dHVyZSBub3cgW19yZW5hbWVzIHN5bWJvbHMgaW4gdGhlIGVudGlyZSBwcm9qZWN0X10gaWYgdGhl DQogIGluZGV4IGlzIGJ1aWx0LiBBZGRpdGlvbmFsbHksIGFsbCBvZiB0aGUgY2xhc3NpYyBtZXJs aW4tc2VydmVyDQogIGNvbW1hbmRzIGFyZSBub3cgYXZhaWxhYmxlIGFzIExTUCBjdXN0b20gcmVx dWVzdHM6IHRoaXMgZW5hYmxlZCB0aGUNCiAgYWRkaXRpb24gb2YgW21hbnkgbmV3IGZlYXR1cmVz IHRvIHRoZSBWaXN1YWwgU3R1ZGlvIENvZGUgcGx1Z2luXSBhbmQNCiAgdGhlIGNyZWF0aW9uIG9m IGEgYnJhbmQgbmV3IEVtYWNzIG1vZGUsIGJhc2VkIG9uIExTUCwgW25vdyBhdmFpbGFibGUNCiAg b24gTWVscGFdLg0KDQogIFRoZXNlIGZlYXR1cmVzIGJyaW5nIE9DYW1sIGVkaXRvciBzdXBwb3J0 IGNsb3NlciB0byBtb2Rlcm4gSURFDQogIGNhcGFiaWxpdGllcywgd2l0aCBpbXBsZW1lbnRhdGlv bnMgYXZhaWxhYmxlIGFjcm9zcyBtdWx0aXBsZSBlZGl0b3JzLg0KDQoNCltFZGl0IC8gKFcxOSkg TmF2aWdhdGUgQ29kZV0NCjxodHRwczovL29jYW1sLm9yZy90b29scy9wbGF0Zm9ybS1yb2FkbWFw I3cxOS1uYXZpZ2F0ZS1jb2RlPg0KDQpbRWRpdCAvIChXMjApIFJlZmFjdG9yIENvZGVdDQo8aHR0 cHM6Ly9vY2FtbC5vcmcvdG9vbHMvcGxhdGZvcm0tcm9hZG1hcCN3MjAtcmVmYWN0b3ItY29kZT4N Cg0KW19yZW5hbWVzIHN5bWJvbHMgaW4gdGhlIGVudGlyZSBwcm9qZWN0X10NCjxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW1lcmxpbi1hbmQtb2NhbWwtbHNwLXN1cHBvcnQtZXhwZXJp bWVudGFsLXByb2plY3Qtd2lkZS1yZW5hbWluZy8xNjAwOD4NCg0KW21hbnkgbmV3IGZlYXR1cmVz IHRvIHRoZSBWaXN1YWwgU3R1ZGlvIENvZGUgcGx1Z2luXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20v YmxvZy8yMDI1LTAyLTI4LWZ1bGwtYmxvd24tcHJvZHVjdGl2aXR5LWluLXZzY29kZS13aXRoLW9j YW1sLz4NCg0KW25vdyBhdmFpbGFibGUgb24gTWVscGFdIDxodHRwczovL21lbHBhLm9yZy8jL29j YW1sLWVnbG90Pg0KDQril4ogTWVybGluIGFuZCBPQ2FtbCBMU1AgU2VydmVyDQoNCiAgU3VwcG9y dCBmb3IgcHJvamVjdCB3aWRlIHJlbmFtaW5nLCBzZWFyY2gtYnktdHlwZSwgYW5kDQogIG9jYW1s LWxzcC1zZXJ2ZXIgbm93IGV4cG9zZXMgYWxsIE1lcmxpbiBmZWF0dXJlcyB2aWEgTFNQIGN1c3Rv bQ0KICBxdWVyaWVzLg0KDQogICpOb3RhYmxlIEFjdGl2aXR5Kg0KICDigKIgT0NhbWwgNS4zIHN1 cHBvcnQgKFttZXJsaW4jMTg1MF0pDQogIOKAoiBQcm9qZWN0LXdpZGUgcmVuYW1pbmcgaXMgbm93 IGF2YWlsYWJsZS4gKFtvY2FtbC1sc3AjMTQzMV0gYW5kDQogICAgW21lcmxpbiMxODc3XSkNCiAg 4oCiIEEgbmV3IG9wdGlvbiB0byBtdXRlIGhvdmVyIHJlc3BvbnNlcyBoYXMgYmVlbiBhZGRlZCBm b3IgYmV0dGVyDQogICAgaW50ZWdyYXRpb24gd2l0aCBhbHRlcm5hdGl2ZSBob3ZlciBwcm92aWRl cnMgKFtvY2FtbC1sc3AjMTQxNl0pDQogIOKAoiBOZXcgdHlwZS1iYXNlZCBzZWFyY2ggc3VwcG9y dCBzaW1pbGFyIHRvIEhvb2dsZSAoW29jYW1sLWxzcCMxMzY5XQ0KICAgIGFuZCBbbWVybGluIzE4 MjhdKQ0KDQogICpCdWcgRml4ZXMqDQogIOKAoiBGaXhlZCBjb21wbGV0aW9uIHJhbmdlIGlzc3Vl cyB3aXRoIHBvbHltb3JwaGljIHZhcmlhbnRzDQogICAgKFtvY2FtbC1sc3AjMTQyN10pDQogIOKA oiBGaXhlZCB2YXJpb3VzIGlzc3VlcyB3aXRoIGp1bXAgY29kZSBhY3Rpb25zIGFuZCBhZGRlZCBj dXN0b21pemF0aW9uDQogICAgb3B0aW9ucyAoW29jYW1sLWxzcCMxMzc2XSkNCiAg4oCiIFZhcmlv dXMgZml4ZXMgYW5kIGltcHJvdmVtZW50cyBoYXZlIGJlZW4gbWFkZSB0byBzaWduYXR1cmUgaGVs cCBhbmQNCiAgICBpbmxheSBoaW50cw0KDQoNCiAgW21lcmxpbiMxODUwXSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL21lcmxpbi9wdWxsLzE4NTA+DQoNCiAgW29jYW1sLWxzcCMxNDMxXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9wdWxsLzE0MzE+DQoNCiAgW21lcmxpbiMx ODc3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9wdWxsLzE4Nzc+DQoNCiAgW29j YW1sLWxzcCMxNDE2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9wdWxsLzE0 MTY+DQoNCiAgW29jYW1sLWxzcCMxMzY5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1s LWxzcC9wdWxsLzEzNjk+DQoNCiAgW21lcmxpbiMxODI4XSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sL21lcmxpbi9wdWxsLzE4Mjg+DQoNCiAgW29jYW1sLWxzcCMxNDI3XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sLWxzcC9pc3N1ZXMvMTQyNz4NCg0KICBbb2NhbWwtbHNwIzEzNzZd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwtbHNwL3B1bGwvMTM3Nj4NCg0KDQril4og VmlzdWFsIFN0dWRpbyBDb2RlIHBsdWdpbg0KDQogIEFkZGVkIHN1cHBvcnQgZm9yIG1vc3Qgb2Yg dGhlIE1lcmxpbiBmZWF0dXJlcyBoaXN0b3JpY2FsbHkgYXZhaWxiYWxlDQogIHRvIEVtYWNzIGFu ZCBWaW0gdXNlcnMsIHZpYSB0aGUgbmV3IExTUCBjdXN0b20gcmVxdWVzdHMuDQoNCiAgKk5vdGFi bGUgQWN0aXZpdHkqDQoNCiAg4oCiIEltcHJvdmVkIHR5cGVkLW9mLXNlbGVjdGlvbiBmZWF0dXJl LCB3aXRoIGFiaWxpdHkgdG8gZ3JvdyBvciBzaHJpbmsNCiAgICB0aGUgc2VsZWN0aW9uIGFuZCBp bmNyZWFzZSB2ZXJib3NpdHkgKFsjMTY3NV0pLg0KICDigKIgSW1wcm92ZWQganVtcCBuYXZpZ2F0 aW9uIChbIzE2NTRdKSwgc2VhcmNoLWJ5LXR5cGUgKFsjMTYyNl0pDQogIOKAoiBJbXByb3ZlZCB0 eXBlZCBob2xlcyBuYXZpZ2F0aW9uIChbIzE2NjZdKS5naXQgcHVzaCDigJNzZXQtdXBzdHJlYW0N CiAgICBvcmlnaW4gcHVibGlzaF9wbGF0Zm9ybV9uZXdzbGV0dGVyX3E0XzI0DQogIOKAoiBOZXcg c2VhcmNoLWJ5LXR5cGUgY29tbWFuZCAoWyMxNjI2XSkuDQoNCiAgKk9DYW1sIExTUCBTZXJ2ZXIg bWFpbnRhaW5lZCBieToqIFVseXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksDQogICBY YXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwgUnVkaSBHcmluYmVyZyAoQHJn cmluYmVyZywNCiAgIEphbmUgU3RyZWV0KQ0KDQogICpNZXJsaW4gbWFpbnRhaW5lZCBieToqIFVs eXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksIFhhdmllciBWYW4NCiAgIGRlIFdvZXN0 eW5lIChAeHZ3LCBUYXJpZGVzKQ0KDQoNCiAgWyMxNjc1XSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0vcHVsbC8xNjc1Pg0KDQogIFsjMTY1NF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbGxhYnMvdnNjb2RlLW9jYW1sLXBsYXRmb3JtL3B1bGwvMTY1 ND4NCg0KICBbIzE2MjZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWxsYWJzL3ZzY29kZS1vY2Ft bC1wbGF0Zm9ybS9wdWxsLzE2MjY+DQoNCiAgWyMxNjY2XSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sbGFicy92c2NvZGUtb2NhbWwtcGxhdGZvcm0vcHVsbC8xNjY2Pg0KDQoNCuKXiiBFbWFjcyBz dXBwb3J0DQoNCiAgQSBicmFuZCBuZXcgRW1hY3MgcGx1Z2luIGJhc2VkIG9uIHRoZSBFZ2xvdCBM U1AgY2xpZW50IGlzIG5vdyByZWFkeQ0KICBmb3IgZGFpbHkgdXNhZ2U6IDxodHRwczovL2dpdGh1 Yi5jb20vdGFyaWRlcy9vY2FtbC1lZ2xvdD4uDQoNCg0KKkRvY3VtZW50YXRpb24gVG9vbHMqDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICAqUm9hZG1hcDoqIFtTaGFyZSAvIChXMjUpIEdlbmVyYXRlIERvY3VtZW50YXRp b25dDQoNCg0KW1NoYXJlIC8gKFcyNSkgR2VuZXJhdGUgRG9jdW1lbnRhdGlvbl0NCjxodHRwczov L29jYW1sLm9yZy90b29scy9wbGF0Zm9ybS1yb2FkbWFwI3cyNS1nZW5lcmF0ZS1kb2N1bWVudGF0 aW9uPg0KDQril4ogT2RvYw0KDQogICpNYWludGFpbmVkIGJ5OiogSm9uIEx1ZGxhbSAoQGpvbmx1 ZGxhbSwgVGFyaWRlcyksIERhbmllbCBCw7xuemxpDQogICAoQGRidWVuemxpKSwgSnVsZXMgQWd1 aWxsb24gKEBqdWxvdywgVGFyaWRlcyksIFBhdWwtRWxsaW90IEFuZ2zDqHMNCiAgIGQnQXVyaWFj IChAcGFuZ2xlc2QsIFRhcmlkZXMpLCBFbWlsZSBUcm90aWdub24gKEBFbWlsZVRyb3RpZ25vbiwN CiAgIFRhcmlkZXMsIHRoZW4gQWhyZWZzKQ0KDQogIFRoZXJlIGlzIG5vdyBhIFtiZXRhIHJlbGVh c2UgZm9yIG9kb2MgM10gdGhhdCB5b3UgY2FuIHRyeSBvdXQgYW5kIGdpdmUNCiAgZmVlZGJhY2sg b24hDQoNCiAgRHVyaW5nIHRoZSBxdWFydGVyLCBvZG9jIGhhcyBiZWVuIG1ha2luZyBzdGVhZHkg cHJvZ3Jlc3MgdG93YXJkIGl0cw0KICAzLjAgcmVsZWFzZSB3aXRoIHNldmVyYWwgbm90YWJsZSBp bXByb3ZlbWVudHM6DQogIOKAoiAqRW5oYW5jZWQgTmF2aWdhdGlvbio6IFRoZSBzaWRlYmFyIGFu ZCBicmVhZGNydW1icyBuYXZpZ2F0aW9uIGhhcw0KICAgICBiZWVuIHVuaWZpZWQgYW5kIGltcHJv dmVkIChbIzEyNTFdKSwgbWFraW5nIHRoZSBkb2N1bWVudGF0aW9uDQogICAgIGhpZXJhcmNoeSBt b3JlIGNvbnNpc3RlbnQgYW5kIGZsZXhpYmxlLiBUaGlzIGFsbG93cyBiZXR0ZXINCiAgICAgb3Jn YW5pemF0aW9uIG9mIG1vZHVsZXMsIHBhZ2VzLCBhbmQgc291cmNlIGZpbGVzIGluIHRoZQ0KICAg ICBkb2N1bWVudGF0aW9uLg0KICDigKIgKkRvY3VtZW50YXRpb24gRmVhdHVyZXMqOiBOZXcgZmVh dHVyZXMgaGF2ZSBiZWVuIGFkZGVkIHRvIE9kb2MgMw0KICAgICAoWyMxMjY0XSksIGluY2x1ZGlu ZzoNCiAgICDigKIgU3VwcG9ydCBmb3IgaW1hZ2VzIHdpdGggZW1iZWRkZWQgYXNzZXRzDQogICAg 4oCiIENyb3NzLXBhY2thZ2UgbGlua2luZyAobGlua2luZyB0byBtb2R1bGVzIGZyb20gZXh0ZXJu YWwgbGlicmFyaWVzKQ0KICDigKIgKlNlYXJjaCBJbnRlZ3JhdGlvbio6IFNoZXJsb2RvYywgdGhl IHNlYXJjaCBmdW5jdGlvbmFsaXR5LCBoYXMgYmVlbg0KICAgICBtZXJnZWQgaW50byB0aGUgbWFp biBvZG9jIGNvZGViYXNlIChbIzEyNjNdKSwgZW5zdXJpbmcgYmV0dGVyDQogICAgIG1haW50ZW5h bmNlIGFuZCBzeW5jaHJvbml6ZWQgcmVsZWFzZXMuDQoNCiAgKk5vdGFibGUgQWN0aXZpdHkqDQog IOKAoiBbT2RvYyAzIEJldGEgUmVsZWFzZV0NCg0KDQogIFtiZXRhIHJlbGVhc2UgZm9yIG9kb2Mg M10NCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2RvYy0zLWJldGEtcmVsZWFz ZS8xNjA0Mz4NCg0KICBbIzEyNTFdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2RvYy9wdWxs LzEyNTE+DQoNCiAgWyMxMjY0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29kb2MvcHVsbC8x MjY0Pg0KDQogIFsjMTI2M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vZG9jL3B1bGwvMTI2 Mz4NCg0KICBbT2RvYyAzIEJldGEgUmVsZWFzZV0NCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tb2RvYy0zLWJldGEtcmVsZWFzZS8xNjA0Mz4NCg0KDQril4ogTWR4IHVwZ3JhZGVk IHRvIE9DYW1sIDUuMw0KDQogICpNYWludGFpbmVkIGJ5OiogTWFyZWsgS3ViaWNhIChATGVvbmlk YXMtZnJvbS1YSVYsIFRhcmlkZXMpLCBUaG9tYXMNCiAgIEdhemFnbmFpcmUgKEBzYW1vaHQsIFRh cmlkZXMpDQoNCiAgV2l0aCBPQ2FtbCA1LjMsIHNvbWUgY29tcGlsZXIgZXJyb3IgbWVzc2FnZXMg Y2hhbmdlZCwgc28gTURYIHdhcw0KICB1cGRhdGVkIHRvIHVzZSBhIG1vcmUgZXhwcmVzc2l2ZSB0 YWcgc3lzdGVtIHRvIGNob29zZSB3aGljaCB2ZXJzaW9uIG9mDQogIHRoZSBjb21waWxlciBjYW4g cnVuIHdoaWNoIGNvZGUgYmxvY2suIFRoaXMgZWZmb3J0IHVuY292ZXJlZCBhIGJ1ZyBpbg0KICB0 aGUgY3VycmVudCBoYW5kbGluZyBvZiBza2lwcGVkIGJsb2NrcyBmb3IgYG1saScgZmlsZXMsIHdo aWNoIHdhcw0KICBmaXhlZC4NCg0KICAqTm90YWJsZSBBY3Rpdml0eSoNCiAg4oCiIE9DYW1sIDUu MyBzdXBwb3J0IChbIzQ1N10pLCBlbnN1cmluZyB0aGUgdG9vbCByZW1haW5zIGNvbXBhdGlibGUN CiAgICB3aXRoIHRoZSBsYXRlc3QgT0NhbWwgcmVsZWFzZXMuDQogIOKAoiBGaXhlZCBlcnJvciBo YW5kbGluZyBmb3Igc2tpcHBlZCBibG9ja3MgaW4gYG1saScgZmlsZXMgKFsjNDYyXSkNCiAg4oCi IEltcHJvdmVkIHN5bnRheCBoaWdobGlnaHRpbmcgKFsjNDYxXSkNCiAg4oCiIEFkZGVkIHN1cHBv cnQgZm9yIG11bHRpcGxlIHZlcnNpb24gbGFiZWxzIChbIzQ1OF0pLCBpbXByb3ZpbmcgdGhlDQog ICAgYWJpbGl0eSB0byB0ZXN0IGNvZGUgYWNyb3NzIGRpZmZlcmVudCBPQ2FtbCB2ZXJzaW9ucy4N Cg0KDQogIFsjNDU3XSA8aHR0cHM6Ly9naXRodWIuY29tL3JlYWx3b3JsZG9jYW1sL21keC9wdWxs LzQ1Nz4NCg0KICBbIzQ2Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yZWFsd29ybGRvY2FtbC9tZHgv cHVsbC80NjI+DQoNCiAgWyM0NjFdIDxodHRwczovL2dpdGh1Yi5jb20vcmVhbHdvcmxkb2NhbWwv bWR4L3B1bGwvNDYxPg0KDQogIFsjNDU4XSA8aHR0cHM6Ly9naXRodWIuY29tL3JlYWx3b3JsZG9j YW1sL21keC9wdWxsLzQ1OD4NCg0KDQoqUGFja2FnZSBNYW5hZ2VtZW50Kg0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBP cGFtDQoNCiAgW09wYW0gMi4zLjAgd2FzIHJlbGVhc2VkIGluIE5vdmVtYmVyXS4gV2UgYXJlIG5v dyB3b3JraW5nIHRvd2FyZHMgdGhlDQogIDIuNCByZWxlYXNlLCB3aXRoIHNvbWUgbmV3IHN1YiBj b21tYW5kcyAoYGFkbWluJywgYHNvdXJjZScsIGBzd2l0Y2gnLA0KICBldGMuKSwgZml4ZXMgKHBp bm5pbmcsIHN3aXRjaCwgc29mdHdhcmUgaGVyaXRhZ2UgZmFsbGJhY2ssIFVJKSBhbmQNCiAgZW5o YW5jZW1lbnRzLg0KDQogICpOb3RhYmxlIEFjdGl2aXR5Kg0KICDigKIgQWRkIHNldmVyYWwgY2hl Y2tzdW0sIGBleHRyYS1maWxlcycgYW5kIGBleHRyYS1zb3VyY2UnIGxpbnRzIC0NCiAgICBbIzU1 NjFdDQogIOKAoiBBZGQgb3B0aW9ucyBgb3BhbSBzb3VyY2UgLS1yZXF1aXJlLWNoZWNrc3Vtcycg YW5kIGAtLW5vLWNoZWNrc3VtcycNCiAgICB0byBoYXJtb25pc2Ugd2l0aCBgb3BhbSBpbnN0YWxs JyAtIFsjNTU2M10NCiAg4oCiIEFkZCB0aGUgY3VycmVudCBWQ1MgcmV2aXNpb24gaW5mb3JtYXRp b24gdG8gYG9wYW0gcGluIGxpc3QnIC0NCiAgICBbIzYyNzRdIC0gZml4IFsjNTUzM10NCiAg4oCi IE1ha2Ugb3BhbWZpbGUgcGFyc2luZyBtb3JlIHJvYnVzdCBmb3IgZnV0dXJlIGNoYW5nZXMgLSBb IzYxOTldIC0gZml4DQogICAgWyM2MTg4XQ0KICDigKIgRml4IGBvcGFtIHN3aXRjaCByZW1vdmUg PGRpcj4nIGZhaWx1cmUgd2hlbiBpdCBpcyBhIGxpbmtlZCBzd2l0Y2ggLQ0KICAgIFsjNjI3Nl0g LSBmaXggWyM2Mjc1XQ0KICDigKIgRml4IGBvcGFtIHN3aXRjaCBsaXN0LWF2YWlsYWJsZScgd2hl biBnaXZlbiBzZXZlcmFsIGFyZ3VtZW50cyAtDQogICAgWyM2MzE4XQ0KICDigKIgQ29ycmVjdGx5 IGhhbmRsZSBgcGtnLnZlcnNpb24nIHBhdHRlcm4gaW4gYG9wYW0gc3dpdGNoDQogICAgbGlzdC1h dmFpbGFibGUnIC0gWyM2MTg2XSAtIGZpeCBbIzYxNTJdDQogIOKAoiBGaXggc2FuZGJveCBmb3Ig Tml4T1MgWyM2MzMzXSwgYW5kIGBEVU5FX0NBQ0hFX1JPT1QnIGVudmlyb25tZW50DQogICAgdmFy aWFiYWxlIHVzYWdlIC0gWyM2MzI2XQ0KICDigKIgQWRkIGBvcGFtIGFkbWluIGNvbXBhcmUtdmVy c2lvbnMnIHRvIGVhc2UgdmVyc2lvbiBjb21wYXJpc29uIGZvcg0KICAgIHNhbml0eSBjaGVja3Mg WyM2MTk3XSBhbmQgZml4IGBvcGFtIGFkbWluIGNoZWNrJyBpbiB0aGUgcHJlc2VuY2Ugb2YNCiAg ICBzb21lIHVuZGVmaW5lZCB2YXJpYWJsZXMgLSBbIzYzMzFdIC0gZml4IFsjNjMyOV0NCiAg4oCi IFdoZW4gbG9hZGluZyBhIHJlcG9zaXRvcnksIGRvbuKAmXQgYXV0b21hdGljYWxseSBwb3B1bGF0 ZQ0KICAgIGBleHRyYS1maWxlczonIGZpZWxkIHdpdGggZm91bmQgZmlsZXMgaW4gYGZpbGVzLycg LSBbIzU1NjRdDQogIOKAoiBVcGRhdGUgYW5kIGZpeCBTb2Z0d2FyZSBIZXJpdGFnZSBmYWxsYmFj ayAtIFsjNjAzNl0gLSBmaXggWyM1NzIxXQ0KICDigKIgV2FybiBpZiBhIHJlcG9zaXRvcnkgdG8g cmVtb3ZlIGRvZXNu4oCZdCBleGlzdCAtIFsjNTAxNF0gLSBmaXggWyM1MDEyXQ0KICDigKIgU2ls ZW50bHkgbWFyayBwYWNrYWdlcyByZXF1aXJpbmcgYW4gdW5zdXBwb3J0ZWQgdmVyc2lvbiBvZiBv cGFtIGFzDQogICAgdW5hdmFpbGFibGUgLSBbIzU2NjVdIC0gZml4IFsjNTYzMV0NCiAg4oCiIERp c3BsYXkgc3dpdGNoIGludmFyaWFudCB3aXRoIHRoZSBzYW1lIHN5bnRheCB0aGF0IGl0IGlzIHdy aXR0ZW4gaW4NCiAgICBmaWxlIChubyBwcmV0dHkgcHJpbnRpbmcpIC0gWyM1NjE5XSAtIGZpeCBb IzU0OTFdDQogIOKAoiBGaXggb3V0cHV0IGRpc3BsYXkgcmVnYXJkaW5nIHRlcm1pbmFsIHNpemUg WyM2MjQ0XSAtIGZpeCBbIzYyNDNdDQogIOKAoiBDaGFuZ2UgZGVmYXVsdCBhbnN3ZXIgZGlzcGxh eSAtIFsjNjI4OV0gLSBmaXggWyM2Mjg4XQ0KICDigKIgQWRkIGEgd2FybmluZyB3aGVuIHNldHRp bmcgYSB2YXJpYWJsZSB3aXRoIGBvcGFtIHZhcicgaWYgYW4gb3B0aW9uDQogICAgaXMgc2hhZG93 ZWQgLSBbIzQ5MDRdIC0gZml4IFsjNDczMF0NCiAg4oCiIEltcHJvdmUgdGhlIGVycm9yIG1lc3Nh Z2Ugd2hlbiBhIGRpcmVjdG9yeSBpcyBub3QgYXZhaWxhYmxlIHdoaWxlDQogICAgZmV0Y2hpbmcg dXNpbmcgcnN5bmMgLSBbIzYwMjddDQogIOKAoiBGaXggYGluc3RhbGwuZXhlJyBzZWFyY2ggcGF0 aCBvbiBXaW5kb3dzIC0gWyM2MTkwXQ0KICDigKIgQWRkIGBBTFRMaW51eCcgc3VwcG9ydCBmb3Ig ZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIC0gWyM2MjA3XQ0KICDigKIgTWFrZSBgdW5hbWUnIGluZm9y bWF0aW9uIG1vcmUgcm9idXN0IGFjY3JvcyBkaXRyaWJ1dGlvbnMgLSBbIzYxMjddDQoNCiAgKk1h aW50YWluZWQgYnk6KiBSYWphIEJvdWpiZWwgKEByamJvdSAtIE9DYW1sUHJvKSwgS2F0ZSBEZXBs YWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpLCBEYXZpZCBBbGxzb3BwIChAZHJhMjcsIFRh cmlkZXMpDQoNCg0KICBbT3BhbSAyLjMuMCB3YXMgcmVsZWFzZWQgaW4gTm92ZW1iZXJdDQogIDxo dHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMS0xMy1vcGFtLTItMy0wPg0KDQogIFsj NTU2MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NTYxPg0KDQogIFsj NTU2M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NTYzPg0KDQogIFsj NjI3NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82Mjc0Pg0KDQogIFsj NTUzM10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NTMzPg0KDQogIFsj NjE5OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTk5Pg0KDQogIFsj NjE4OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTg4Pg0KDQogIFsj NjI3Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82Mjc2Pg0KDQogIFsj NjI3NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82Mjc1Pg0KDQogIFsj NjMxOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MzE4Pg0KDQogIFsj NjE4Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTg2Pg0KDQogIFsj NjE1Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTUyPg0KDQogIFsj NjMzM10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MzMzPg0KDQogIFsj NjMyNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MzI2Pg0KDQogIFsj NjE5N10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTk3Pg0KDQogIFsj NjMzMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MzMxPg0KDQogIFsj NjMyOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MzI5Pg0KDQogIFsj NTU2NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NTY0Pg0KDQogIFsj NjAzNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MDM2Pg0KDQogIFsj NTcyMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NzIxPg0KDQogIFsj NTAxNF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81MDE0Pg0KDQogIFsj NTAxMl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81MDEyPg0KDQogIFsj NTY2NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NjY1Pg0KDQogIFsj NTYzMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NjMxPg0KDQogIFsj NTYxOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NjE5Pg0KDQogIFsj NTQ5MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81NDkxPg0KDQogIFsj NjI0NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MjQ0Pg0KDQogIFsj NjI0M10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MjQzPg0KDQogIFsj NjI4OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82Mjg5Pg0KDQogIFsj NjI4OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82Mjg4Pg0KDQogIFsj NDkwNF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy80OTA0Pg0KDQogIFsj NDczMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy80NzMwPg0KDQogIFsj NjAyN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MDI3Pg0KDQogIFsj NjE5MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTkwPg0KDQogIFsj NjIwN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MjA3Pg0KDQogIFsj NjEyN10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82MTI3Pg0KDQoNCuKX iiBEdW5lLXJlbGVhc2UNCg0KICAqUm9hZG1hcDoqIFtTaGFyZSAvIChXMjYpIFBhY2thZ2UgUHVi bGljYXRpb25dDQoNCiAgRHVuZS1yZWxlYXNlIGhhcyBiZWVuIGltcHJvdmVkIHRvIGJldHRlciBo YW5kbGUgcHVibGlzaGluZyBwYWNrYWdlcw0KICBmcm9tIGN1c3RvbSByZXBvc2l0b3JpZXMgYW5k IHByaXZhdGUgR2l0IHJlcG9zaXRvcmllcy4NCg0KICAqTm90YWJsZSBBY3Rpdml0eSoNCiAg4oCi IFN1cHBvcnQgZm9yIG92ZXJ3cml0aW5nIHRoZSBkZXYtcmVwbyBmaWVsZCB3aGVuIGNyZWF0aW5n IEdpdEh1Yg0KICAgIHRhZ3MvcmVsZWFzZXMgKFsjNDk0XSksIHdoaWNoIGEgdXNlZnVsIGZvciBw cml2YXRlIHByb2plY3RzDQoNCiAgKk1haW50YWluZWQgYnk6KiBUaG9tYXMgR2F6YWduYWlyZSAo QHNhbW9odCwgVGFyaWRlcyksIEV0aWVubmUgTWlsbG9uDQogICAoQGVtaWxsb24sIFRhcmlkZXMp LCBNYXJlayBLdWJpY2EgKEBMZW9uaWRhcy1mcm9tLVhJViwgVGFyaWRlcykNCg0KDQogIFtTaGFy ZSAvIChXMjYpIFBhY2thZ2UgUHVibGljYXRpb25dDQogIDxodHRwczovL29jYW1sLm9yZy90b29s cy9wbGF0Zm9ybS1yb2FkbWFwI3cyNi1wYWNrYWdlLXB1YmxpY2F0aW9uPg0KDQogIFsjNDk0XSA8 aHR0cHM6Ly9naXRodWIuY29tL3RhcmlkZXMvZHVuZS1yZWxlYXNlL3B1bGwvNDk0Pg0KDQoNCuKX iiBPcGFtLXB1Ymxpc2gNCg0KICAqTm90YWJsZSBBY3Rpdml0eSoNCiAg4oCiIEludGVncmF0aW9u IG9mIE9wYW0gQ0kgTGludCBmdW5jdGlvbmFsaXR5IGludG8gYG9wYW0tcHVibGlzaCcNCiAgICAo WyMxNjZdLCBbIzE2NV0pIHRvIHZhbGlkYXRlIHBhY2thZ2VzIGJlZm9yZSBzdWJtaXNzaW9uDQog IOKAoiBBIG5ldyBgLS1wcmUtcmVsZWFzZScgYXJndW1lbnQgYWRkZWQgdG8gaGFuZGxlIHByZS1y ZWxlYXNlIHBhY2thZ2VzDQogICAgY29ycmVjdGx5IChbIzE2NF0pDQoNCiAgKk1haW50YWluZWQg Ynk6KiBSYWphIEJvdWpiZWwgKEByamJvdSAtIE9DYW1sUHJvKSwgS2F0ZSBEZXBsYWl4DQogICAo QGtpdC10eS1rYXRlLCBBaHJlZnMpDQoNCg0KICBbIzE2Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC1vcGFtL29wYW0tcHVibGlzaC9wdWxsLzE2Nj4NCg0KICBbIzE2NV0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC1vcGFtL29wYW0tcHVibGlzaC9pc3N1ZXMvMTY1Pg0KDQogIFsjMTY0XSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW9wYW0vb3BhbS1wdWJsaXNoL3B1bGwvMTY0Pg0KDQoN Ck90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBv Y2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtGdWxsIGJsb3duIHByb2R1Y3Rpdml0eSBpbiBW U0NvZGUgd2l0aCBPQ2FtbF0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2Ft bC5vcmcvYmxvZy8+DQoNCltGdWxsIGJsb3duIHByb2R1Y3Rpdml0eSBpbiBWU0NvZGUgd2l0aCBP Q2FtbF0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNS0wMi0yOC1mdWxsLWJsb3duLXBy b2R1Y3Rpdml0eS1pbi12c2NvZGUtd2l0aC1vY2FtbD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDi lZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3Nl bmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBh IGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZl c10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFp bCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNj aG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5 dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1l Lm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEu aW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 25 to March = 04, 2025.

    Bytecode debugging in OCaml 5.3

    Continuing this thread, Henry Till said

    Chet Murthy also said

    For those who (like me) have always been perplexed when they try to use oca= mldebug, b/c it just doesn't seem to work like gdb or perl's debugger, or a= ny other debugger I've tried, this video was immensely helpful.

    http= s://www.youtube.com/watch?v=3DDGvJk14sfi8&t=3D724s

    Specifically, I learned that at the beginning of the program, to set a brea= kpoint in the main program file, I need to do something like (for a file "e= xtract_environments.ml", and line 79):

    break @extract_environments 79
    

    That was blocking me FOREVER, b/c holy cow there's a ton of initialization,= and I just didn't know how to run thru all that and get to the first meani= ngful line of my main program.

    Now I do. I can move forward from here with ocamldebug. Finally!

    Zanuda – OCaml linter experiment

    Kakadu announced

    I'm using this linter for teaching for two years, and I'm very happy that I= implemented it. Student's code is much less annoying to read :slight_smile= :=20

    Release 1.1.0

    • #22: Add 'reviewer' tool to report lint's a Github review.
    • #13: Discourage matching a tuple using 'match' expression with single branch

      match x with=
       (a,b) -> ...
      
    • #18: Warn about unneeded mutually recursive types
    • #23: Implement a trial version of the Fix module for auto-correction of= lints. It produces a diff that could be applied later. Dune support is lacking
    • Add command line switch '-skip-level-allow <bool>' to enable/disa= ble lints with level=3DAllow. False has higher priority than per-lint command line sw= itch (for example, -no-string_concat)
    • #28: Warn about too many nested if expressions.
    • #32: Warn about constructor names that hide default constructor names
    • #35: Detect manual implementations of List.map/fold functions
    • #50: Propose eta reduction when available
    • #51: Warn about pattern matching on boolean values
    • #53: Warn about "%s" in formatted strings
    • #54: Detection of unused public declarations in .mli file.
    • #56: Simplify lint about missing license. We look for required doc-comm= ents anywhere in the file, not only in the beginning.
    • #60: Skip some checks for some source files (configured via '.zanuda' c= onfig file).
    • #15: Split 'string_concat' lint to check separately patterns 'a^b^c' (l= evel=3DAllow) and 'List.fold_left (^)' (level=3DWarn).

    QCheck 0.24

    Jan Midtgaard announced

    I'm happy to announce the 0.24 release of qcheck, qcheck= -core, qcheck-alcotest, and qcheck-ounit, = along with a 0.6 release of ppx_deriving_qcheck :tada:=20

    QCheck is a library for randomized property-based testing, ins= pired by Haskell's seminal QuickCheck library. The 0.24 release contains a = range of improvements to the integrated shrinking of QCheck2, = initially introduced in the 0.18 release. As a consequence, its shrinking a= lgorithms should act more predictably, reduce faster, and report smaller co= unterexamples. In essence, the 0.24 release is what we hoped 0.18 would be.= The release also adds missing result, int32, and= int64 combinators, as well as more documentation.

    If you've previously given QCheck2's integrated shrinking a sp= in, I encourage you to try it again with the patched 0.24 release. For new = users, the 0.24 release is also a good candidate to check out! :smiley: Please share any problems you encounter on the qcheck repo: https://github.com/c-cube/qcheck=

    Full change log:

    • [qcheck-alcotest] Add an optional speed_level parameter to= to_alcotest
    • Adjust the QCheck2.Gen.list shrinker to produce minimal co= unterexamples at size 3 too
    • Replace the QCheck2 OCaml 4 Random.State.split hack with a faster one
    • Improve the QCheck2.Gen.list shrinker heuristic and utiliz= e the improved shrinker in other QCheck2 {list,array,byt= es,string,function}* shrinkers
    • Use split and copy in Random.State underlying QCheck2 to avoid non-deterministic shrinking beh= aviour
    • Add missing documentation strings for QCheck.{Print,Iter,Shrink,G= en} and QCheck2.Gen.
    • Add result combinators to QCheck, QChec= k.{Gen,Print,Shrink,Observable}, and QCheck2.{Gen,Print,Observ= able}.
    • Add missing combinators QCheck{,2}.Print.int{32,64}, QCheck.Gen.int{32,64}, QCheck{,2}.Observable.int{32,64}, and deprecate QCheck.Gen.{ui32,ui64}
    • Document dune usage in README

    Happy testing! :smiley: :keyboard:

    Bogue, the OCaml GUI

    sanette announced

    Dear all,

    I=E2=80=99m happy to announce a new version of Bogue, version 20250224, now availble on opam.

    The main novelty is a brand new File dialog. It will open a new wind= ow (or popup) which will let the user navigate the file system and select o= ne or more files or directories.

    This corresponds to the new File module.

    You might also be interested in the Monitor submodule, which implements a fi= le monitoring API based on fswatch (if available) or Unix.stat.=20

    If you are curious, here is a graphical summary of the current functionalit= ies of Bogue's file dialog (I hope that more will be added soon; I'm open t= o suggestions)

    3D"b6efbe5eb40237db=

    PS: @Sachindra_Ragul, yes we did it finally ;) better late than never

    Opam repository archival - next phase

    Hannes Mehnert announced

    Dear everyone,

    sorry for the silence – the phase 3 of the opam repository archival = (taking the x-maintenance-intent into account) has to be delayed by (tentat= ively) one month. The reason is that our tooling is not ready - the task, g= iven an opam repository and maintenance-intent on packages, which can be sa= fely archived, is harder than it seems:

    • we've to take compiler versions into account
    • there may be a package X in version 1 and 2, both supporting OCaml 4.08= , but depend on package Y (where X.1 depends on Y >=3D 1, and X.2 depend= s on Y >=3D 2) – now Y.1 could support OCaml 4.08, and Y.2 only O= Caml 4.12 – so it is not safe to archive X.1 (since on OCaml 4.08 th= ere won't be any X installable). And this may be deeply nested in the depen= dency chain

    It is useful if you mark your packages with x-maintenance-intent (as mentioned in https://discuss.ocaml.org/t/opam-= repository-archive-clarification-of-the-opam-fields).

    We'll let you know once we have tooling in place to cope with the task desc= ribed above (development is happening here: https://github.com/hannesm/maintenance-in= tent-filter).

    Upcoming Cmdliner 2.0 changes that need your attention

    Daniel B=C3=BCnzli announced

    If you are a user of cmdliner note that cmdliner 2.0 =E2=80=93= in exchange for auto-completion support =E2=80=93 will remove the ability = to specify command and options names by unambiguous prefixes according to <= a href=3D"https://github.com/dbuenzli/cmdliner/issues/200">this plan of act= ion.=20

    If you are horrified by it please chime in on the issue.

    OCaml Editors Plugins Survey

    PizieDust announced

    Hello, we are conducting a short survey to better understand how you use th= e different editor plugins available for OCaml. Please take a few minutes (= ideally 5) to fill out the form.=20

    https://docs.google.com/forms/d/e/1FAIpQLSfGGFZBiw4PF7L0yt2DBX8443G5_7= aFL5v6wvo6p5MwL-DW8Q/viewform?usp=3Dpp_url&entry.454013858=3DDiscuss

    Thank you :) :camel:

    Dune dev meeting

    Etienne Marais announced

    Hi everyone :camel:=20

    The next Dune Dev Meeting will be on Wednesday, March, 5th at 9:00 CET. This is going to be a one-hour-long meeting.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers :smile:=20

    The agenda is available on the meeting dedicated page. Feel free to add more= items in it.

    Platform Newsletter: September - December 2024

    Sabine Schmaltz announced

    Welcome to the thirteenth edition of the OCaml Platform newsletter!

    In this September-December 2024 edition, we are excited to bring you the la= test on the OCaml Platform, continuing our tradition of highlighting recent= developments as seen in previous editions. To understand the direction we're headed= , especially regarding development workflows and user experience improvemen= ts, check out our roadm= ap.

    Highlights:

    Feature Guides & Announcements:

    Releases:

    Dune

    Roadmap: Develop / (W4) Build a Project

    Dune 3.17 was r= eleased with significant improvements to package management. Key featur= es include binary distribution support, better error messages for missing p= ackages, and Windows support without requiring OPAM.

    The Dune Developer Preview website now provides editor setup instructions and package management tutorials.

    Dune's package management features w= ere tested across hundreds of packages in the opam repository, and a co= verage tool was developed to track build success rates. For local developme= nt, Dune added support for building dependencies via @pkg-install, caching for package builds, and automated binary builds of development= tools. The system supports both monorepo and polyrepo workflows, with opti= ons for installing individual dependencies or complete development environm= ents.

    The addition of Wasm_o= f_ocaml support in Dune opens new possibilities for OCaml projects targ= eting the web or other WebAssembly runtimes.=20

    Activities:

    Maintained by: Rudi Grinberg (@rgrinberg, Jane Street), Nicol=C3=A1s= Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, Tarides)= , Etienne Millon (@emillon, Tarides), Stephen Sherratt (@gridbugs, Tarides)= , Antonio Nuno Monteiro (@anmonteiro)

    Editor Tools

    Roadmap: Edit / (W19) Navigate Code, Edit / (W20) Refactor Code

    Developer tooling received substantial upgrades during the end of last year= and the beginning 2025. A major milestone for project-wide features has be= en reached with the release of OCaml 5.3: LSP's renaming feature now renames symbols = in the entire project if the index is built. Additionally, all o= f the classic merlin-server commands are now available as LSP custom reques= ts: this enabled the addition of many new features to th= e Visual Studio Code plugin and the creation of a brand new Emacs mode,= based on LSP, now available on= Melpa.

    These features bring OCaml editor support closer to modern IDE capabilities= , with implementations available across multiple editors.

    • Merlin and OCaml LSP Server

      Support for project wide renaming, search-by-type, and ocaml-lsp-server now= exposes all Merlin features via LSP custom queries.

      Notable Activity

      Bug Fixes

      • Fixed completion range issues with polymorphic variants (ocaml-lsp#1427)
      • Fixed various issues with jump code actions and added customization opt= ions (ocaml-lsp#13= 76)
      • Various fixes and improvements have been made to signature help and inl= ay hints
    • Visual Studio Code plugin

      Added support for most of the Merlin features historically availbale to Ema= cs and Vim users, via the new LSP custom requests.=20

      Notable Activity

      • Improved typed-of-selection feature, with ability to grow or shrink the= selection and increase verbosity (#1675).
      • Improved jump navigation (#1654), search-by-type (#1626)
      • Improved typed holes navigation (#1666).git push –set-upstream= origin publish_platform_newsletter_q4_24
      • New search-by-type command (#1626).

      OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

      Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides)

    • Emacs support

      A brand new Emacs plugin based on the Eglot LSP client is now ready for dai= ly usage: https://github= .com/tarides/ocaml-eglot.

    Documentation Tools

    • Odoc

      Maintained by: Jon Ludlam (@jonludlam, Tarides), Daniel B=C3=BCnzli = (@dbuenzli), Jules Aguillon (@julow, Tarides), Paul-Elliot Angl=C3=A8s d'Au= riac (@panglesd, Tarides), Emile Trotignon (@EmileTrotignon, Tarides, then = Ahrefs)=20

      There is now a beta release for odoc 3 that you can try out and give feedbac= k on!

      During the quarter, odoc has been making steady progress toward its 3.0 rel= ease with several notable improvements:

      • Enhanced Navigation: The sidebar and breadcrumbs navigation has = been unified and improved (#1251), making the documentation hierarchy more consistent and flex= ible. This allows better organization of modules, pages, and source files i= n the documentation.
      • Documentation Features: New features have been added to Odoc 3 (= #1264), including:
        • Support for images with embedded assets
        • Cross-package linking (linking to modules from external libraries)
      • Search Integration: Sherlodoc, the search functionality, has bee= n merged into the main odoc codebase (#1263), ensuring better maintenance and synchronized rel= eases.

      Notable Activity

    • Mdx upgraded to OCaml 5.3

      Maintained by: Marek Kubica (@Leonidas-from-XIV, Tarides), Thomas Ga= zagnaire (@samoht, Tarides)

      With OCaml 5.3, some compiler error messages changed, so MDX was updated to= use a more expressive tag system to choose which version of the compiler c= an run which code block. This effort uncovered a bug in the current handlin= g of skipped blocks for mli files, which was fixed.

      Notable Activity

      • OCaml 5.3 support (#457), ensuring the tool remains compatible with the latest OCam= l releases.
      • Fixed error handling for skipped blocks in mli files (#462)
      • Improved syntax highlighting (#461)
      • Added support for multiple version labels (#458), improving the ability to test cod= e across different OCaml versions.

    Package Management

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=XDNlO2bz; dkim-atps=neutral Received-SPF: Permerror (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id B830F400A0 for ; Tue, 11 Mar 2025 15:00:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=0rRdcXE2o+2nNpgtHj5CecIAKJvqAHRBRiShZoRr5uo=; b=XDNlO2bzBaqQ+UiBC9gEiravW7C1WBsLXQoymD9VobHMlNsHHIfWDrGJ dOM0M1ABTXNtSSgabul/RWAT/CyzLOxjPuQ6F/PvuaiSVALtEmPJ0oB0a Btu7Jk5gl4Wafbiq22q9U/6bRwyFuMDSB+RaiyjrTuknwhyKfmZc/RqpU 8=; Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=TempError smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: TempError (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr temporarily is not available to assert whether or not 128.93.162.160 is permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.14,239,1736809200"; d="scan'208,217";a="212350482" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Mar 2025 16:00:37 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id E8B60E0D21; Tue, 11 Mar 2025 16:00:35 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5A7D9E0260 for ; Tue, 11 Mar 2025 16:00:32 +0100 (CET) X-IronPort-AV: E=Sophos;i="6.14,239,1736809200"; d="scan'208,217";a="212350431" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Mar 2025 16:00:32 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 11 Mar 2025 16:00:31 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19278 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 04 to 11, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml projects utilizing Category theory Docker base images and OCaml-CI support for OCaml < 4.08 ocamlmig, a tool to rewrite ocaml code, and complement `[@@deprecated]' Ortac 0.6.0 improve bug reporting Dune Developer Preview Updates ppxlib.0.36.0 I created an OCaml grammar for ANTLR4 (Earley parser compatible) Melange 5.0 Other OCaml News Old CWN OCaml projects utilizing Category theory =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Deep in this thread, Dmitrii Kovanikov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I started writing [a series of articles about Pragmatic Category Theory] in OCaml, and there's a repository with examples: =E2=80=A2 If you're interested in a complete project, I made *CCL: Categorical Configuration Language* which leverages multiple Category Theory concepts: =E2=80=A2 [The Most Elegant Configuration Language by @chshersh] I'm currently working on a [GitHub TUI] project in OCaml but the usage of CT concepts is not that crazy there. For now, I only use Semigroup and Monoids (which some people don't even consider part of CT but just Abstract Algebra). [a series of articles about Pragmatic Category Theory] [The Most Elegant Configuration Language by @chshersh] [GitHub TUI] Docker base images and OCaml-CI support for OCaml < 4.08 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mark Elvers announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The [opam repository archival] process has set the minimum supported OCaml version to 4.08 _for opam repository_. It logically follows that opam-repo-ci should only test against OCaml >=3D 4.08. The purpose of this post is to get a sense of whether the rest of the OCaml infrastructure should also adopt the same lower bound. The current lower bound is 4.02. Specific examples include OCaml-CI. Individual projects can already opt out of testing on older platforms by adding a lower bound in the opam file. Docker base images are built for all versions of OCaml used in the CI systems. These images are published weekly on Docker Hub. We know that these images are also used by the community, but the pull counter is not broken down by individual tag. Potentially only the latest OCaml versions are being used. Users impacted by packages which have been archived from opam repository can easily restore the packages by adding the archive repository to the opam switch. This only needs to be done once. Users can build their own Docker base images, but they would need to be rebuilt periodically to keep them up to date. Would removing testing on < 4.08 in OCaml CI or removing the Docker base images < 4.08 impact you? [opam repository archival] ocamlmig, a tool to rewrite ocaml code, and complement `[@@deprecated]' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: v-gb announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi, I released a new version of ocamlmig in opam, whose main change is to avoid reformatting everything in codebases that don't use ocamlformat. Instead, only subexpressions touched by a rewrite are reformatted. It also requalifies identifier in more places to preserve their meaning (e.g. when replacing `string_of_int' by `Int.to_string', there might be an `Int' module in scope that's not `Stdlib.Int'. In such case, ocamlmig would more often replace `string_of_int' by `Stdlib.Int.to_string'). Separately, I've thought about the recent addition of let+ operators in Cmdliner, and how one might migrate from the use of `$' to them. Concretetely, given: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let bistro () (`Dry_run dry_run) (`Package_names pkg_names) ...= =3D the code =E2=94=82 open Cmdliner =E2=94=82 let term =3D Term.(const bistro $ Cli.setup $ Cli.dry_run $ ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 you'd want to have instead: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Cmdliner =E2=94=82 let term =3D =E2=94=82 Term.(Syntax.( =E2=94=82 let+ () =3D Cli.setup =E2=94=82 and+ (`Dry_run dry_run) =3D Cli.dry_run =E2=94=82 and+ (`Package_names pkg_names) =3D ... =E2=94=82 ... =E2=94=82 in =E2=94=82 the code)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 ocamlmig can now transform code this way, at the tip of the ocamlmig repo (not the last release). You can see it [in the second commit in this branch] (and further mechanical cleanups in the commits with "=E2=80= =A6" bubbles), but to explain a bit: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let bistro () (`Dry_run dry_run) (`Package_names pkg_names) ...= =3D the code =E2=94=82 open Cmdliner =E2=94=82 let term =3D Term.(const bistro $ Cli.setup $ Cli.dry_run $ ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 is first turned into: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Cmdliner =E2=94=82 let term =3D Term.(const (fun () (`Dry_run dry_run) (`Package_n= ames pkg_names) ... -> the code) =E2=94=82 $ Cli.setup $ Cli.dry_run $ ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which is then turned into the final code: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Cmdliner =E2=94=82 let term =3D =E2=94=82 Term.(Syntax.( =E2=94=82 let+ () =3D Cli.setup =E2=94=82 and+ (`Dry_run dry_run) =3D Cli.dry_run =E2=94=82 and+ (`Package_names pkg_names) =3D ... =E2=94=82 ... =E2=94=82 in =E2=94=82 the code)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The first step is done using `ocamlmig replace -w -e 'const [%move_def __f] /// const __f''. In short, what this does is anytime it sees `const some-identifier', it tries to inline the definition of the identifier. In details, the left side of the `///' specifies the code to search for, and the right side what to replace it with. `const ...' searches for literally `const' applied to one argument. `[%move_def __f]' is trickier: it matches identifiers that are let-bound somewhere in the current file, removes said let binding, and recursively matches the right hand side of the binding against `__f'. Variables that start with two underscores name a term for use in the replacement expression. The second step is done with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ocamlmig replace -w \ =E2=94=82 -e 'const (fun __p1 __p2 __p3 -> __body) $ __e1 $ __e2 $ __e3 =E2=94=82 /// let open Syntax in let+ __p1 =3D __e1 and+ __p2 =3D _= _e2 and+ __p3 =3D __e3 in __body' =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is longer, but given the previous explanation, it's hopefully fairly clear what this does. The only twist is that ocamlmig generalizes this search/replace for three elements into an n-ary version (implicitly, although perhaps it should be explicit). And that's it. So this is the full command that I used: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 ocamlmig replace -w \ =E2=94=82 -e 'const [%move_def __f] /// const __f' \ =E2=94=82 -e 'const (fun __p1 __p2 __p3 -> __body) $ __e1 $ __e2 $ __e3 =E2=94=82 /// let open Syntax in let+ __p1 =3D __e1 and+ __p2 =3D _= _e2 and+ __p3 =3D __e3 in __body' =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which seems pretty reasonable considering the rewrite is somewhat sophisticated. In general, mechanizing a change can reduce the chance of accidentally modifying something, but in this specific case, ocamlmig also detects shadowing when moving code with `[%move_def]'. Shadowing would likely cause type errors or tests errors, but if it didn't, it'd be quite hard to catch during code review. Finally, if you want to try this out on your code, I'll note that `ocamlmig replace' is in flux, and that while the commands above work, obvious variations of them may not. [in the second commit in this branch] Ortac 0.6.0 improve bug reporting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nicolas Osborne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! We - at Tarides - are very pleased to announce the release of the Ortac-0.6.0 packages for specification-driven testing! Ortac/QCheck-STM is a test generator based on the [QCheck-STM] model-based testing framework and the [Gospel] specification language for OCaml. In addition to generating QCheck-STM tests based on the Gospel specifications, `Ortac/QCheck-STM' computes and display a bug report in case of test failure. This report contains the piece of Gospel specification that has been violated, a runnable scenario to reproduce the bug and the expected returned value (if there is enough information in the specification to compute it). This release improves the reporting in two ways. First, the way we need to formulate the description of the expected returned value has been made more flexible (and fixed). The main limitation was about functions returning a boolean. Because of the coercion mechanism, Gospel often transforms equalities involving a boolean into a double implication. For example: `b =3D Sequence.mem t.contents a' is transformed into `b =3D true <-> Sequence.mem t.contents a'. (For the curious, this is because `Sequence.mem' returns a `prop', not a `bool', and we don't have equality on `prop'). `Ortac/QCheck-STM' now explores more patterns, including the double implication one, to try to find a suitable description of the returned value to use in the bug report. Secondly, and more importantly, the Gospel specification language supports partial functions (`Sequence.hd' is *not* defined on the empty sequence for example). When we translate calls to such function to OCaml, we raise an exception when the call is out of the function's domain. Now, that exception was captured by QCheck at runtime, making the test a failure as expected. But the Ortac runtime was then stopped before being able to build and send the bug report to QCheck for display to the user. That was sad, so I've fixed it. We can now make use of Gospel partial functions when writing specifications and enjoy the bug report computed by `Ortac/QCheck-STM'! You can install Ortac/QCheck-STM via opam (we also advise installing and using Ortac/Dune): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install ortac-qcheck-stm ortac-dune =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You'll find more information in [Ortac/QCheck-STM documentation] and in The [Ortac/Dune readme]. If you have any questions, please don't hesitate to ping me :-) Next release should be about making Ortac/QCheck-STM generate tests of a library in a parallel context (this is, after all, one of the *raison d'=C3=AAtre* of the fantastic QCheck-STM test framework!). Happy testing! [QCheck-STM] [Gospel] [Ortac/QCheck-STM documentation] [Ortac/Dune readme] Dune Developer Preview Updates =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Leandro Ostera announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello everyone! :waving_hand: Hope you had a great end of 2024 and your 2025 is starting well too :D We've been hard at work at Tarides to improve the Dune Developer Preview, and we'd love to learn more about what your adoption hurdles have been, so here's a very short form you can fill to let us know what's up. Happy hacking! :two_hump_camel: ppxlib.0.36.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The ppxlib team is happy to announce the release of `ppxlib.0.36.0'! A full account of the changes can be found [on the 0.36.0 release]. [on the 0.36.0 release] OCaml 5.2 Internal AST =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The main change in this release is that the internal AST used in ppxlib is now the same as OCaml 5.2's AST. Previously it was 4.14.0. The internal AST dictates what features your ppx can and cannot generate. To avoid confusion, this does _not_ mean ppxlib only supports OCaml 5.2 and greater. Ppxlib still supports compilers starting at 4.08.0. *The bump to 5.2 has caused a lot of reverse dependencies to break* as the 5.2 AST represents functions differently ([see the Syntactic Function Arity RFC]). Many patches have already been sent to users of ppxlib in the past few months, but quite a few still remain. :warning: Ppx authors are advised to read [the wiki entry for upgrading to ppxlib.0.36.0]. :warning: Please do not hesitate to reach out if you need any help upgrading to `ppxlib.0.36.0'. [see the Syntactic Function Arity RFC] [the wiki entry for upgrading to ppxlib.0.36.0] Other Changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Change `Location.none' to match the compiler's `Location.none' = as of OCaml 4.08. =E2=80=A2 New ways to create context free rules using floating expansions= =E2=80=93 see [#560] for the details. =E2=80=A2 Add a `-raise-embedded-errors' flag to the driver. Setting this= flag raises the first `ocaml.error' embedded in the final AST. =E2=80=A2 Export `Ast_pattern.fail' making it easier to write new pattern-matchers. =E2=80=A2 Improvements to `Ast_traverse.sexp_of' to be more concise. Do read the changes entry/release for all of the acknowledgments =E2=80=93 thank you to everyone who contributed to this release of ppxlib! A special thanks from me to @NathanReb who has been a massive help getting this work over the line. Thank you to Tarides and Jane Street for funding my time on this release of ppxlib. [#560] I created an OCaml grammar for ANTLR4 (Earley parser compatible) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ao wang announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi everyone, I=E2=80=99ve created an ANTLR4 grammar for OCaml that supports Earley par= sing. Feel free to use it, and any feedback or contributions are welcome! GitHub Repository: Melange 5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Antonio Nuno Monteiro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear OCaml users, I'm proud to announce the release of Melange 5.0 Melange is a backend for the OCaml compiler that emits JavaScript. This release features improvements across a few areas, mostly targeting OCaml 5.3 support and JavaScript expressivity: =E2=80=A2 OCaml version support: we=E2=80=99re releasing Melange 5 with f= ull support across a few OCaml versions: 4.14, 5.1, 5.2 and the recently released 5.3 =E2=80=A3 Melange uses a versioning scheme similar to Merlin=E2=80=99s:= releases are suffixed with the OCaml version they support, e.g. 5.0.1-414, 5.0.1-53, etc. =E2=80=A2 We're introducing build system-aware, type-safe support for JavaScript's [dynamic import], allowing to code split Melange-generated JavaScript bundles without sacrificing type-safety. =E2=80=A2 Melange can now express [discriminated unions], a JavaScript pa= ttern that The [release announcement] blog post covers the changes in a lot more detail. Please give it a read. I'm excited to count on the support of our financial sponsors [Ahrefs] and the [OCaml Software Foundation], without which this release would not have been possible. [dynamic import] [discriminated unions] [release announcement] [Ahrefs] [OCaml Software Foundation] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [OpenAI and structured outputs from OCaml] =E2=80=A2 [Feature Parity Series: Statmemprof Returns!] =E2=80=A2 [Announcing Melange 5] =E2=80=A2 [Learning OCaml: Functions without Parameters] [the ocaml.org blog] [OpenAI and structured outputs from OCaml] [Feature Parity Series: Statmemprof Returns!] [Announcing Melange 5] [Learning OCaml: Functions without Parameters] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 04 to 11, 2025.

    OCaml projects utilizing Category theory

    Deep in this thread, Dmitrii Kovanikov announced

    I started writing a series of articles about Pragmatic Categor= y Theory in OCaml, and there's a repository with examples:

    If you're interested in a complete project, I made CCL: Categorical Conf= iguration Language which leverages multiple Category Theory concepts:

    I'm currently working on a GitHub TUI project in OCaml but the usage of CT concepts is not that= crazy there. For now, I only use Semigroup and Monoids (which some people = don't even consider part of CT but just Abstract Algebra).

    Docker base images and OCaml-CI support for OCaml < 4.08

    Mark Elvers announced

    The opam repository archival process = has set the minimum supported OCaml version to 4.08 for opam repository. It logically follows that opam-repo-ci shou= ld only test against OCaml >=3D 4.08.

    The purpose of this post is to get a sense of whether the rest of the OCaml= infrastructure should also adopt the same lower bound. The current lower = bound is 4.02.

    Specific examples include OCaml-CI. Individual projects can already opt ou= t of testing on older platforms by adding a lower bound in the opam file.

    Docker base images are built for all versions of OCaml used in the CI syste= ms. These images are published weekly on Docker Hub. We know that these im= ages are also used by the community, but the pull counter is not broken dow= n by individual tag. Potentially only the latest OCaml versions are being = used.

    Users impacted by packages which have been archived from opam repository ca= n easily restore the packages by adding the archive repository to the opam = switch. This only needs to be done once. Users can build their own Docker= base images, but they would need to be rebuilt periodically to keep them u= p to date.

    Would removing testing on < 4.08 in OCaml CI or removing the Docker base= images < 4.08 impact you?

    ocamlmig, a tool to rewrite ocaml code, and complement [= @@deprecated]

    v-gb announced

    Hi,

    I released a new version of ocamlmig in opam, whose main change is to avoid= reformatting everything in codebases that don't use ocamlformat. Instead, = only subexpressions touched by a rewrite are reformatted. It also requalifies identifier in more places to preserve their meaning (e.= g. when replacing string_of_int by Int.to_string,= there might be an Int module in scope that's not Stdlib= .Int. In such case, ocamlmig would more often replace string_o= f_int by Stdlib.Int.to_string).

    Separately, I've thought about the recent addition of let+ operators in Cmd= liner, and how one might migrate from the use of $ to them. Co= ncretetely, given:

    let bistro () (`Dry_run dry_run) (`Package_names pkg_names) ... =3D the code
    open Cmdliner
    let term =3D Term.<=
    /span>(const bistro $ Cli.setup $=
     Cli.dry_run $ ...)
    

    you'd want to have instead:

    open Cmdliner
    let term =3D
      Term.(Syntax.(
        let+ () =3D <=
    span style=3D"color: #444fcf;">Cli.setup
        and+ (`Dry_run dry_run) =3D and+ (`Package_names <=
    span style=3D"color: #007a9f;">pkg_names) =3D ...
        ...
        in
        the code))
    

    ocamlmig can now transform code this way, at the tip of the ocamlmig repo (= not the last release). You can see it in the second commit in this branch (an= d further mechanical cleanups in the commits with "…" bubbles), but = to explain a bit:

    let bistro () (`Dry_run dry_run) (`Package_names pkg_names) ... =3D the code
    open Cmdliner
    let term =3D Term.<=
    /span>(const bistro $ Cli.setup $=
     Cli.dry_run $ ...)
    

    is first turned into:

    open Cmdliner
    let term =3D Term.<=
    /span>(const (fun=
     () (`Dry_run dry_run) (`Package_names pkg_names) ... -> the code)
                     $ Cli.setup $ Cli.dry_run $ ...)
    

    which is then turned into the final code:

    open Cmdliner
    let term =3D
      Term.(Syntax.(
        let+ () =3D <=
    span style=3D"color: #444fcf;">Cli.setup
        and+ (`Dry_run dry_run) =3D and+ (`Package_names <=
    span style=3D"color: #007a9f;">pkg_names) =3D ...
        ...
        in
        the code))
    

    The first step is done using ocamlmig replace -w -e 'const [%move_def= __f] /// const __f'. In short, what this does is anytime it sees const some-identifier, it tries to inline the definition of the = identifier. In details, the left side of the /// specifies the= code to search for, and the right side what to replace it with. cons= t ... searches for literally const applied to one argum= ent. [%move_def __f] is trickier: it matches identifiers that = are let-bound somewhere in the current file, removes said let binding, and = recursively matches the right hand side of the binding against __f. Variables that start with two underscores name a term for use in the = replacement expression.

    The second step is done with:

    ocamlmig replace -w \
      -e 'const (fun __p1 __p2 __p3 -> __bod=
    y) $ __e1 $ __e2 $ __e3
          /// let open Syntax in let+ __p1 =3D =
    __e1 and+ __p2 =3D __e2 and+ __p3 =3D __e3 in __body'
    

    This is longer, but given the previous explanation, it's hopefully fairly c= lear what this does. The only twist is that ocamlmig generalizes this searc= h/replace for three elements into an n-ary version (implicitly, although pe= rhaps it should be explicit).

    And that's it. So this is the full command that I used:

    ocamlmig replace -w \
      -e 'const [%move_def __f] /// const __f'<=
    /span> \
      -e 'const (fun __p1 __p2 __p3 -> __bod=
    y) $ __e1 $ __e2 $ __e3
          /// let open Syntax in let+ __p1 =3D =
    __e1 and+ __p2 =3D __e2 and+ __p3 =3D __e3 in __body'
    

    which seems pretty reasonable considering the rewrite is somewhat sophistic= ated.

    In general, mechanizing a change can reduce the chance of accidentally modi= fying something, but in this specific case, ocamlmig also detects shadowing= when moving code with [%move_def]. Shadowing would likely cau= se type errors or tests errors, but if it didn't, it'd be quite hard to cat= ch during code review.

    Finally, if you want to try this out on your code, I'll note that oca= mlmig replace is in flux, and that while the commands above work, ob= vious variations of them may not.

    Ortac 0.6.0 improve bug reporting

    Nicolas Osborne announced

    Hi everyone!

    We - at Tarides - are very pleased to announce the release of the Ortac-0.6= .0 packages for specification-driven testing!

    Ortac/QCheck-STM is a test generator based on the QCheck-STM model-based testing fra= mework and the Gospel specification language for OCaml.

    In addition to generating QCheck-STM tests based on the Gospel specificatio= ns, Ortac/QCheck-STM computes and display a bug report in case= of test failure.

    This report contains the piece of Gospel specification that has been violat= ed, a runnable scenario to reproduce the bug and the expected returned valu= e (if there is enough information in the specification to compute it).

    This release improves the reporting in two ways.

    First, the way we need to formulate the description of the expected returne= d value has been made more flexible (and fixed). The main limitation was ab= out functions returning a boolean. Because of the coercion mechanism, Gospe= l often transforms equalities involving a boolean into a double implication= . For example: b =3D Sequence.mem t.contents a is transformed = into b =3D true <-> Sequence.mem t.contents a. (For the = curious, this is because Sequence.mem returns a prop, not a bool, and we don't have equality on prop). Ortac/QCheck-STM now explores more patterns, including th= e double implication one, to try to find a suitable description of the retu= rned value to use in the bug report.

    Secondly, and more importantly, the Gospel specification language supports = partial functions (Sequence.hd is not defined on the em= pty sequence for example). When we translate calls to such function to OCam= l, we raise an exception when the call is out of the function's domain. Now= , that exception was captured by QCheck at runtime, making the test a failu= re as expected. But the Ortac runtime was then stopped before being able to= build and send the bug report to QCheck for display to the user. That was = sad, so I've fixed it. We can now make use of Gospel partial functions when= writing specifications and enjoy the bug report computed by Ortac/QC= heck-STM!

    You can install Ortac/QCheck-STM via opam (we also advise installing and us= ing Ortac/Dune):

    $ opam install ortac-qcheck-stm ortac-dune
    

    You'll find more information in Ortac/QCheck-STM documentation and in= The Ortac/Dune readme.

    If you have any questions, please don't hesitate to ping me :-)

    Next release should be about making Ortac/QCheck-STM generate tests of a li= brary in a parallel context (this is, after all, one of the raison d'=C3= =AAtre of the fantastic QCheck-STM test framework!).

    Happy testing!

    Dune Developer Preview Updates

    Leandro Ostera announced

    Hello everyone! :waving_hand: Hope you had a great end of 2024 and your 202= 5 is starting well too :D=20

    We've been hard at work at Tarides to improve the Dune Developer Preview, a= nd we'd love to learn more about what your adoption hurdles have been, so h= ere's a very short form you can fill to let us know what's up.

    Happy hacking! :two_hump_camel:=20

    https://forms.gle/piaw12XBY= UeaCmg56

    ppxlib.0.36.0

    Patrick Ferris announced

    The ppxlib team is happy to announce the release of ppxlib.0.36.0!=20

    A full account of the changes can be found on the 0.36.0 release.

    OCaml 5.2 Internal AST

    The main change in this release is that the internal AST used in ppxlib is = now the same as OCaml 5.2's AST. Previously it was 4.14.0. The internal AST= dictates what features your ppx can and cannot generate. To avoid confusio= n, this does not mean ppxlib only supports= OCaml 5.2 and greater. Ppxlib still supports compilers starting at 4.08.0.

    The bump to 5.2 has caused a lot of reverse dependencies to break as= the 5.2 AST represents functions differently (see the Syntactic Function Arity RFC). Many patch= es have already been sent to users of ppxlib in the past few months, but qu= ite a few still remain.=20

    :warning: Ppx authors are advised to read the wiki entry for upgrading= to ppxlib.0.36.0. :warning:=20

    Please do not hesitate to reach out if you need any help upgrading to ppxlib.0.36.0.

    Other Changes

    • Change Location.none to match the compiler's Locatio= n.none as of OCaml 4.08.
    • New ways to create context free rules using floating expansions –= ; see #560 for= the details.
    • Add a -raise-embedded-errors flag to the driver. Setting t= his flag raises the first ocaml.error embedded in the final AS= T.
    • Export Ast_pattern.fail making it easier to write new patt= ern-matchers.
    • Improvements to Ast_traverse.sexp_of to be more concise.

    Do read the changes entry/release for all of the acknowledgments – t= hank you to everyone who contributed to this release of ppxlib! A special t= hanks from me to @NathanReb who has been a massive help getting this work o= ver the line.

    Thank you to Tarides and Jane Street for funding my time on this release of= ppxlib.

    I created an OCaml grammar for ANTLR4 (Earley parser compatibl= e)

    ao wang announced

    Hi everyone,

    I=E2=80=99ve created an ANTLR4 grammar for OCaml that supports Earley parsi= ng.=20=20 Feel free to use it, and any feedback or contributions are welcome!

    GitHub Repository: https://github.com/WangAo0311/Antlr4-ocaml-earley-parser-grammar

    Melange 5.0

    Antonio Nuno Monteiro announced

    Dear OCaml users,

    I'm proud to announce the release of Melange 5.0

    Melange is a backend for the OCaml compiler that emits JavaScript. This rel= ease features improvements across a few areas, mostly targeting OCaml 5.3 s= upport and JavaScript expressivity:

    • OCaml version support: we=E2=80=99re releasing Melange 5 with full supp= ort across a few OCaml versions: 4.14, 5.1, 5.2 and the recently released 5= .3
      • Melange uses a versioning scheme similar to Merlin=E2=80=99s: releases = are suffixed with the OCaml version they support, e.g. 5.0.1-414, 5.0.1-53,= etc.
    • We're introducing build system-aware, type-safe support for JavaScript'= s dynamic import, allowing to code split Melange-ge= nerated JavaScript bundles without sacrificing type-safety.
    • Melange can now express discrimina= ted unions, a JavaScript pattern that

    The release = announcement blog post covers the changes in a lot more detail. Please = give it a read.

    I'm excited to count on the support of our financial sponsors Ahrefs and the OCaml Software Foundation, without which this release would not have b= een possible.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=KRlZC62d; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=LHa9bVX4; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 2FE81400B8 for ; Tue, 18 Mar 2025 10:19:01 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=NRMkcvEy9SX6EexeZ0xeHkErwZAkaOLHlwQPp700ATA=; b=KRlZC62ds3KLdt7YGLvoPQ2fDRnSmOU4smOhCarruVQfhaxPDWhq7jlI m2Th4+1BxoohbuWv0BoMAZagdOl/csvwOI7PUounTjzsl7zE0Ks5Yf8Ci pryZbHxfdhKiy9pTGqEpRQa7WgwAoN6KZ/Stgxy/XnJLEFeIRv3A76tmp E=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.14,256,1736809200"; d="scan'208,217";a="213442681" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Mar 2025 11:19:01 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B08A3E0D22; Tue, 18 Mar 2025 11:19:00 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 5B22DE0260 for ; Tue, 18 Mar 2025 11:18:56 +0100 (CET) IronPort-SDR: 67d94890_UZdntQtf8VigQVn5iHnSsI6cwEThtOVUh1YDMmyLCI1lF3j ULoYejlvTR3MC9MlGFEt35RYjqJn66RxP3RaLjg== X-IPAS-Result: =?us-ascii?q?A0GtBgDuR9lnjyIeaIFaglwCgT9bKBkBY1ozBwhIA4RTg?= =?us-ascii?q?0+OIoEVAZsrgWqBEQMuIxQBAwENLgEFDQECBAEBAwECAYIMgi5GAhaLCQIfB?= =?us-ascii?q?gEEMwYOAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABAQEBAQE5B?= =?us-ascii?q?UmFew1JAQEBAwEKAYFqUXGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIIBAEHLCsBPwkKEwEBKgoEGCMDFAEGAwIEDQE1F?= =?us-ascii?q?wESGoIQWAGCZAMFDAaQf5tLeoEygQGCDAEBBoEIPgIBBAcCAgMBDgklAdoHg?= =?us-ascii?q?WUJgUiFbYJJGgEqSGsChEiEPCcPgVVEgRU1gQaBNwdvgkQGFwEBAQEYgREBE?= =?us-ascii?q?QIBEQkPJAmDJYJpgjNFdoFbgQiBDIFshE0STwWDSYE2HRwjCkaBDjcaBXgsh?= =?us-ascii?q?E03BAQRUwMvPYJTToJygTZJilSBR0szLAFVExcLBwVhgQsDKjQxgUV7N4INa?= =?us-ascii?q?Uk6Ag0CNYIbJFiCKIMUgTqEPoRBhVCCEYIFiS2EZC1QgU0dQAMLbT03FBuiX?= =?us-ascii?q?Ak3NQE6g0ASJQ5AgQgIEQgIBgIgAi4IDisKAhcRDAkFCQsKNRIEAisCA40Kh?= =?us-ascii?q?T4MEReeC5ReNAeEHoFdBgyJBYEkji6DeINXhAOBV4symUsimFwigjaHJoElC?= =?us-ascii?q?WCBDx5MlVYghTiBRjckPDBwMxowQ4IzAQEBMQkKPBwPg0KKaxaDMChBfYEmg?= =?us-ascii?q?XQ7gm2vGEI1AgEBBAMxAgcBCgEBAwmFYgEBgwSCF26DfTJqYQEB?= IronPort-PHdr: A9a23:iQF1IxYsb7TcblVksND8w8D/LTHJ34qcDmcuAnoPtbtCf+yZ8oj4O wSHvLMx1wWPBd2Qsq4e0rWempujcFJDyK7CikxKSIZLWR4BhJdetC0bK+nBN3fGKuX3ZTcxB sVIWQwt1Xi6NU9IBJS2PAWK8TW94jEIBxrwKxd+KPjrFY7OlcS30P2594HObwlSizewb61+I A+qoQnNucUanIRvJrgsxhbLv3BFZ/lYyWR0KF2cmBrx+t2+8Jl//SpOpvkv7dRAUaL0f6Q5S bxXEjErOH0r6cPoqBfOUxKB6mMTXWsKnBVIBRPF7AzhUZfqriT6rOt91zKEMsDwULs5RC6t7 6ZvSB/vlScHKzs0+3zZh8BskK5Wpg+qqBtizY7Je4GVLORxcb/Bfd0UQmpBW9xeVy1HAoiha 4cCAO4MMeNeooLgpVUBsAG+CBGsCu3x1zFGiHz40qIm3Ok6Cw7KwBYtEsgSvHjIrtj4MroZX +CvzKnPyDXOd+9b2TPn54jObxsvvO2DXbJ1ccrQ1UkvCx7Og1KKpozhJTyV0P4Bs3OH4OpgU OKvinInqx1qrzi3wccsjonIhp4LxV/Y9SV5xoc1JcSlSEFle9KkF4FQty6DOoZwX8gtTH1mt jwgxb0apZ60YjIKyJI/yhPcZfGKbYmF7xHtWuiePTt0mG5oda++ihus/0auxfDwW8263ltFr CdIltvBum4T2xLT9sWKVPtw80ih1zuM1A3e7PxPL04zlareMZEhw7gwm4ILsUvdAi/2mVn2g 7GOdkUj/+io7vrobq/gppCCK494kgb+Pbg0lcy6BeQ0KA8OX3KU+eikz73s40j5QLpQjvIoi qnVqo3VKtoFpqKhDA9V05oj6xaiDzi9ytgXgX4HLFdddBKIjojpJ1HOIO3jAvulmVijjDBrx /XeMrL6GJrNMmPDkLD/fbpn90Fczw8zwchF6JJKEL4BPO/zWlXvu9DCCB82LRC0z/75B9Vnz IMRQ36PAq6AMKPPr1CE/P4gI+mUaI4Uvzb9LP0l6+TzjX8igVMdcq6p3ZwYaHC8APtqOVmWY X3pgtsZHmcKvxY+TOz3iFKZSzJTZnGyU7og6TE9EoKmFp3PRo63gLCZ2ye0AodZZmVCClyWC 3vocJ+EW/gUZCKOOMBhiD0EWqW/RI86zx2hqAj6y79/IurP+y0YsIrj1Nxr6OLPjx4y7iB0A 96B3GGKSmF4hmIIRzks3KB+u0Nx0FmD0bJ+jvdFFtJT/+tEXhokOZPY1eB2Fsz+Vw3bctqHV FqqWNurDD4pQt4szdICflxxF8uigx3MxSamHaIZm6aVCJE79q/R2WX6Kth5y3bbz6khk0cpQ tFSO22nh69w6RDeC5LPnk6Ejailb74c0zTI9GqbzWqBokVYUAloXKXAUnETe1Harcz+5kPGT 76uFaooPRdByc6EK6tKc8DpgktcSPfkItTebHq9m2a2BRmW2rOBdJfmd3sZ0SnHFUQIjw8e8 WyIOAQiHCusrW3TACRrFV31YkPs9ed+qGm8Tk8x1wyEclFv2aep9hMNm/KQV/Yd3rActSghq zt5BE6939XSC9uAuwpuYrlTYdM74FdGzGLZqhJyMoanL6B4iV4Tax54v0f02BVxEIlAitQlr HMvzApzNaKYzEhMeCif3ZDtPL3YNnf9/Au1Z67T1Vzf38ya+qAV6PQ3s1njuhqmGVI483p7y 9lVz2ec5pLSAQYPSZ7xSFo49wBmp7HGZSkw/5/b2mdpMamwqzPC39MpBPA5yhu7ZNdeMKaEF BfoHMEABsiuLvYqm1mzYR4eMuBS7v18A8TzPf+Z3uTjaOJ/mhqikmIB5o1hhAbE/CN5TqvM3 o0Z6/CexAqOETnm33m7tcWisIRNY3kpFWq6yDT4TNpYYqR0O50ACWKvP9Gf3tJ6loLgUH5e9 Ue+ChUBwsD/KknaVED0wQAFjRdfmneggybtk20ce1ABq6Oe2HaL2OH+bF8dPWUNQmB+jFDqK IzyjtYAXUHuYRJ63AC96xPcwK5W7L96M3GVWV1BKiHyJmckSaCws7uef+ZX75c5rShcUOK9e E2XDLnnrEhSyDvtSlNX3ytzbDS2otP8lh1+hniaKSNIlkGBLP0o5hWK2/KJXflVzyYLTyl+i CDKCx67Jdb89NGdkdHYueC7Vn69fpdUbC/gwJjGsXero2pwDk73hOi9z+XuChNyyirnz59qW CHP+Q77eZXu3r+mPPhPe1kxQkf779tmF4p+lIopmZxW3mIV7nmM1VwAl2q7cdBS2KakKWEIW SZO2dnepg7sxExkKHuNgYP/THSUhMV7NZG8ZSsN1yQx4tovau/c5aFYnSZzvluzrB7AKfl7k DAHzPIy6Xkcy+gXsQspxy+ZD/gcB05ddSDrkh2J6Zi5osA1LC6mdbG2klF1ndWgEK2qugZYS Wr0cZckHDZt44N4Kl2NmHz/54f4ecXBOMoJv07x8V+IhOxUJZQt0/sS0HM9aCSk5SFjkLZ91 kA9uPPy9JKKIGhs4q+jVxtRNzmvItgW5imol6FV2MCfw4GoGJxlXDQNRprhC/yyQ1dw/bzqM RiDFDokpzKVA73aSEWk0nw++k6XMJL+CF/CPH4d3MlvTxmbJVVCjUYTRjpvl5owEEaxz8zkc VtlzjoW+1jzpwAKz754cR7lXS2MwWXgIidxU5WZIBdMu0tL407Td9eV7udyAz1w5pqlvRCAI WydZh1VACcOQEPOVDWBdvG+oNLH9eafHO+3KfDDNK6PpeJpXPCN3Zuz04Fi8l5gL+23N2J5R 70+00tHBzViHtjB3i8IQGoRnj7MaMiSoFG9/Dd2p4ax6qajVAXq7IqJQ7xcVLcnsyuMuv/WC 7azhnNGB2NA0Zcd2XLDyL4exUMfzSZ0eGykFb0G8zXGTKfRhrN/BRkGbSh+L41Ns7J62RNCX KyTwt/4zb93iPcpBkwNDAaw3JjxOYpReyfmaBvOHw6TOa6DJCHXzs2/eq66RbBKzYA2/1Wxt TudD07/L2GGnjjtWQqoNLIEhyWaMRpC/YClJ083WC66FI6gMUX9a4Mk6F9+iac5jX7LK2MGZ D11ckcX66aV8TsdmPJ0XWpI8ntiK+CA3Sef9ejRbJgM4p4JSmx5kfxX5HMixv5b9iZBEbZOo hCK++I2gFPzrcfa0j1jQQZDoTZNhZuWsANlI6qM/51JXzDf9xII7HmMIx4Nut1uB8apvvxAj N/Vm+igTVUKu8KR5sYaC8XOfYi8CkF5ZCaxOzyBMyVQVTmvJH3SjExbkeiP+zuStJdvo5zln twVQb9eVUApPvkdF0JuEcdEJctnGDQ+nvTI6axArWr7px7XSsJAu5nBXf/HGvTjJgGSirxcb gcJy7f1fswDc5f20Et4ZhxmjZzHTgDOCMtVrHQrPWpW6A1dtWJzRWop1wf5ZxOxtTUNQOWsk Ed+yQpmPbZ0rmaqug9rYAGS4nBs2AowgYm32GrANmepcOHrBccNVk+W/wByM4unEVcsK1Tox Ao6bnGdH+0ZzLp4KzIx0FeF68cWFaYORP8baRJNl6PJa6p4gw8Hz0fvjQxG/bWXU8M6zVl2K JL0/SsSil5vYYxneveOKPgWkgcIzueHuivivgwo6DcXPF1FsGabeSpS/VcNKqFjPS2juOpl9 Q2FnTJHPmkKTfsj5PxwpAsxPOGJziSo1LAmSAj5L+uEM6aQoHTNj+aNUgp2zkQMhlVI9rhw0 N4+fgyTTU9nwLaKFhsPPNbPMkkMNZsUrSCPO33W976RiZtuWuf1XvjlV+qPqLoZjgq/EQAlE p5NpsUNE5+w0V3JeMfqKLlWgR4p5QntOBCEFKEQIkPNyW9b5ZrnisQrjuw/bnkHDG5wMDu6/ OPSrw4u2r+YWcsuJ20dVc0CP243X8uzn2hYuW5BBX+5yLF8qkDK4jniqyDXFDS5YcBkYaLeX ilXUISKoRY9ppeY3EbQ9oTCKmr6M9V7p9KJ7vkV8p+DAvUSVrJ9tkbAh6FSQGGsWGPUV9vpN 973cYZmPrmWQj6qF0eyjT44VZK7JNG2Mq2Bmh3lX65RoNDdxDcnJNOwHTEYGg5tqqcE/q02N mhhK9IrJBXvsQo5Lam2JgyVh86vT2iaIjxTV/BDzO++au8f3282Y+S90ndlUoAiwrz97xsWX J9TxEK7p77rd8xEXCP0AHAYZwjfuX9ziT16Luhriu53hRrMtRN029WjbOtteXBJtNE6BEqPL DNxEGVqHzd0bKLG8lfqx7cW7jdQlNZS0PRYvT75pJCNOVpEt4ShrojTuCc7K916s+t2K4Oxe 6O7 IronPort-Data: A9a23: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 9VsD7UD6Jy5FX1s IronPort-HdrOrdr: A9a23:wF/XwK+/FWRDFhTH8C1uk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: =?us-ascii?q?9a23=3AUajtnmjSDSiBiDOiTMAcxwdA1DJuUXL3yWnxHGS?= =?us-ascii?q?CO0U3bL+xZFOT9p44qp87?= X-Talos-MUID: =?us-ascii?q?9a23=3A5Unq+g54hY0HCtrQbkwbRXXzxoxnyPW+LVFcnqw?= =?us-ascii?q?EkJCDFBFAMTaCimWOF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.14,256,1736809200"; d="scan'208,217";a="213442639" X-MGA-submission: =?us-ascii?q?MDGBbkC+zsfZXtZ+b8E86FxH1r35ng9uTnK+MW?= =?us-ascii?q?W/WCHEiJjGzeNbfwP1arucDlMrh5IJ1+HaHGrUlkOxCv1WkBbWeuDoAt?= =?us-ascii?q?BOC+MwvTSrfX4Oq04IH6dUwOWKxvVxP3ZFHlVousOuvarlbJWjNhtT0h?= =?us-ascii?q?R3AGqywPxkodmBDlnRwQyCjg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Mar 2025 11:18:55 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 67BF7564C7F; Tue, 18 Mar 2025 11:18:54 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1742293134; bh=8KUxJs+AivxFm9WJYwzYqxSTfQxian12MYEh2cYw0bI=; h=From:To:Subject:Date:Message-ID; b=LHa9bVX4Xl13tDM3dsiwy8MDcB3TXn0jpIlW88VhdTm3JXXx+ibs57F2zFdUUPFeh PLwcAv3ZYiH9PV1lyYtofPKyhZmVHMof/XwwuhTmdkuki26YVQCpxTdv90fGNQxEXo LfZAkhD1v+xv9Bz2qadALXalHZzEwbSdUfEBIryo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 18 Mar 2025 11:18:52 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 18 11:18:54 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499992, queueID=AAFCB564C81 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19279 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMTEgdG8gMTgsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClVwZ3JhZGlu ZyBTZW1ncmVwIGZyb20gT0NhbWwgNCB0byBPQ2FtbCA1ICsgZHluYW1pY19nYyB1dGlsaXR5DQpP cGVuIHNvdXJjZSBPQ2FtbCBhbGdvdHJhZGluZyB3aXRoIGxvbmdsZWFmIDEuMC4wDQpOZW9jYW1s IC0gYSBUcmVlU2l0dGVyLXBvd2VyZWQgRW1hY3MgcGFja2FnZSBmb3IgT0NhbWwgcHJvZ3JhbW1p bmcNClNlbmlvciBTb2Z0d2FyZSBFbmdpbmVlciBhdCBCbG9vbWJlcmcuIE5ldyBZb3JrDQpVcGNv bWluZyBDbWRsaW5lciAyLjAgY2hhbmdlcyB0aGF0IG5lZWQgeW91ciBhdHRlbnRpb24NCkR1bmUg ZGV2IG1lZXRpbmcNCk5ldyByZWxlYXNlIG9mIE1vbm9saXRoICgyMDI1MDMxNCkNCmRyZWFtX21p ZGRsZXdhcmVfZXh0IHYwLjEuMA0KTGVhcm4gUHJvZ3JhbW1pbmcgd2l0aCBPQ2FtbCAobmV3IGJv b2spDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KVXBncmFkaW5nIFNlbWdyZXAgZnJv bSBPQ2FtbCA0IHRvIE9DYW1sIDUgKyBkeW5hbWljX2djIHV0aWxpdHkNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdXBncmFkaW5n LXNlbWdyZXAtZnJvbS1vY2FtbC00LXRvLW9jYW1sLTUtZHluYW1pYy1nYy11dGlsaXR5LzE2MjU2 LzE+DQoNCg0KTmF0IE1vdGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ3ZlIHdyaXR0ZW4gdXAgbXkgZXhwZXJp ZW5jZSBbdXBncmFkaW5nIFNlbWdyZXAgdG8gT0NhbWwgNV0uIFRoZSBtYWluDQogIGJhcnJpZXIg d2UgZmFjZWQgd2FzIGluY3JlYXNlZCBtZW1vcnkgY29uc3VtcHRpb24sIGJ1dCBJIHdhcyBhYmxl IHRvDQogIHR1bmUgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIHRvIGFkZHJlc3MgdGhpcyBwcm9ibGVt LiBXZSBoYXZlIGFsc28NCiAgb3Blbi1zb3VyY2VkIHRoZSBbdXRpbGl0eSBJIHdyb3RlXSB0byBh ZGp1c3QgdGhlIGBzcGFjZV9vdmVyaGVhZCcgR0MNCiAgcGFyYW1ldGVyIGJhc2VkIG9uIGhlYXAg c2l6ZS4gV2UgYXJlIGxvb2tpbmcgZm9yd2FyZCB0byB0YWtpbmcNCiAgYWR2YW50YWdlIG9mIGFs bCB0aGUgZ3JlYXQgbmV3IGZlYXR1cmVzIGluIE9DYW1sIDUhDQoNCg0KW3VwZ3JhZGluZyBTZW1n cmVwIHRvIE9DYW1sIDVdDQo8aHR0cHM6Ly9zZW1ncmVwLmRldi9ibG9nLzIwMjUvdXBncmFkaW5n LXNlbWdyZXAtZnJvbS1vY2FtbC00LXRvLW9jYW1sLTUvPg0KDQpbdXRpbGl0eSBJIHdyb3RlXSA8 aHR0cHM6Ly9naXRodWIuY29tL3NlbWdyZXAvZHluYW1pYy1nYz4NCg0KDQpPcGVuIHNvdXJjZSBP Q2FtbCBhbGdvdHJhZGluZyB3aXRoIGxvbmdsZWFmIDEuMC4wDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29wZW4tc291cmNlLW9jYW1sLWFsZ290cmFkaW5nLXdpdGgtbG9uZ2xlYWYtMS0wLTAvMTYy NjQvMT4NCg0KDQphZHZlbnR1cmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBSZWNlbnRseSwgSSBoYXZlIGJl ZW4gd29ya2luZyBvbiBhIHByb2plY3QgY2FsbGVkIFtsb25nbGVhZl0gZm9yDQogIGFsZ29yaXRo bWljIHRyYWRpbmcgb2YgVVMgc3RvY2tzIHdpdGggT0NhbWwuICBUaGUgcHJvamVjdCBoYXMgcmVh Y2hlZA0KICBhIHBvaW50IHdoZXJlIGl0IG1heSBiZSBpbnRlcmVzdGluZyB0byBvdGhlcnMsIHNv IEkgdGhvdWdodCBJIHdvdWxkDQogIHNoYXJlIGl0IGhlcmUgYW5kIHdyaXRlIGEgc2ltcGxlIFJF QURNRSwgYWx0aG91Z2ggdGhlcmUgY291bGQgYmUgYSBsb3QNCiAgbW9yZSBkb2N1bWVudGF0aW9u LiAgSSB3b3VsZCBiZSBjdXJpb3VzIHRvIGhlYXIgaWYgYW55b25lIGhhcyBhbnkNCiAgaWRlYXMg Zm9yIHRoaXMhICBJZiB5b3UgdHJ5IHRvIHVzZSBpdCBvciBoYXZlIGFueSBmZWVkYmFjayBvcg0K ICBxdWVzdGlvbnMsIGZlZWwgZnJlZSB0byBsZWF2ZSBhIHBvc3QgaGVyZSwgbWFrZSBhIGdpdGh1 YiBpc3N1ZSwgb3INCiAgbWFrZSBhIGdpdGh1YiBkaXNjdXNzaW9uLg0KDQogIEluIGEgbnV0c2hl bGwsIHRoZSBpZGVhIGlzIHRoYXQgc3RyYXRlZ2llcyBhcmUgZnVuY3RvcnMgdGhhdCBhcmUNCiAg aW5zdGFudGlhdGVkIHdpdGggYSAiYmFja2VuZCIgZm9yIGJhY2t0ZXN0aW5nLCBsaXZlLCBvciBw YXBlciB0cmFkaW5nLg0KICBUaGF0IHdheSwgd2hldGhlciB5b3UgYXJlIHRlc3RpbmcgeW91ciBz dHJhdGVneSBvciBydW5uaW5nIGl0IGxpdmUsIGl0DQogIGlzIGV4YWN0bHkgdGhlIHNhbWUgc3Ry YXRlZ3kgb3RoZXIgdGhhbiBob3cgdGhlIGV4ZWN1dGlvbiBvZiBvcmRlcnMgaXMNCiAgaGFuZGxl ZC4gIEluIG9yZGVyIHRvIHVzZSBpdCwgeW91IHdpbGwgbmVlZCB0byBzZXQgdXAgc29tZSBhY2Nv dW50cw0KICBhbmQgdGhlcmUgYXJlIGxpa2VseSBidWdzLiAgT2YgY291cnNlLCBpZiB5b3UgdXNl IHRoaXMgcHJvZ3JhbSB3aXRoDQogIHJlYWwgbW9uZXkgYW5kIHNvbWV0aGluZyBiYWQgaGFwcGVu cywgaXQgaXMgZW50aXJlbHkgeW91cg0KICByZXNwb25zaWJpbGl0eSENCg0KICBbZ2l0aHViXQ0K DQoNCltsb25nbGVhZl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9oZXN0ZXJqZW5nL2xvbmdsZWFmPg0K DQpbZ2l0aHViXSA8aHR0cHM6Ly9naXRodWIuY29tL2hlc3RlcmplbmcvbG9uZ2xlYWY+DQoNCg0K TmVvY2FtbCAtIGEgVHJlZVNpdHRlci1wb3dlcmVkIEVtYWNzIHBhY2thZ2UgZm9yIE9DYW1sIHBy b2dyYW1taW5nDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25lb2NhbWwtYS10cmVlc2l0dGVyLXBvd2VyZWQt ZW1hY3MtcGFja2FnZS1mb3Itb2NhbWwtcHJvZ3JhbW1pbmcvMTYyNjgvMT4NCg0KDQpCb3poaWRh ciBCYXRzb3YgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJbiBhIGRpZmZlcmVu dCB0b3BpY3MgSSB3cm90ZSBhYm91dCBhYm91dCBteSByZWNlbnQgd29yayBvbiBuZW9jYW1sLA0K ICBhbmQgSSB0aG91Z2h0IGl0IG1pZ2h0IGJlIGEgZ29vZCBpZGVhIHRvIHBvc3Qgc29tZXRoaW5n IHNlcGFyYXRlbHkgYXMNCiAgd2VsbC4gQ2hlY2sgb3V0IHRoZSBwcm9qZWN0J3MgR2l0SHViIFty ZXBvXSBhbmQgdGhlIHNob3J0IFtibG9nIHBvc3RdLg0KDQogIENvbnRyaWJ1dGlvbnMgYW5kIGZl ZWRiYWNrIGFyZSBtb3N0IHdlbGNvbWUsIGFuZCBJIGhvcGUgYG5lb2NhbWwnIHdpbGwNCiAgYmUg dXNlZnVsIHRvIHNvbWUgb2YgeW91IGVpdGhlciBhIHRvb2wgb3IgYXMgYSBzb3VyY2Ugb2YgaW5z cGlyYXRpb24uDQoNCg0KW3JlcG9dIDxodHRwczovL2dpdGh1Yi5jb20vYmJhdHNvdi9uZW9jYW1s Pg0KDQpbYmxvZyBwb3N0XQ0KPGh0dHBzOi8vYmF0c292LmNvbS9hcnRpY2xlcy8yMDI1LzAzLzE0 L25lb2NhbWwtYS1uZXctZW1hY3MtcGFja2FnZS1mb3Itb2NhbWwtcHJvZ3JhbW1pbmcvPg0KDQoN ClNlbmlvciBTb2Z0d2FyZSBFbmdpbmVlciBhdCBCbG9vbWJlcmcuIE5ldyBZb3JrDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3Nlbmlvci1zb2Z0d2FyZS1lbmdpbmVlci1hdC1ibG9vbWJlcmctbmV3LXlvcmsv MTYyNzEvMT4NCg0KDQpNYXhpbSBHcmFua2luIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SGkgZXZlcnlvbmUhIPCfkYsNCg0KICBCbG9vbWJlcmcgaXMgbG9va2luZyBmb3IgYSBmdWxsLXRp bWUgU2VuaW9yIFNvZnR3YXJlIEVuZ2luZWVyIGluIE5ldw0KICBZb3JrOg0KDQogIOKAoiBHYWlu IGV4cGVyaWVuY2UgYXBwbHlpbmcgZnVuY3Rpb25hbCBwcm9ncmFtbWluZyB0byByZWFsIHByb2R1 Y3Rpb24NCiAgICBmaW5hbmNpYWwgc3lzdGVtcw0KICDigKIgVXNlIE9DYW1sIHRvIGRldmVsb3Ag YSByb2J1c3QgdGVtcGxhdGUgc3lzdGVtIHRvIGFzc2lzdCB1c2VycyBpbg0KICAgIGNyZWF0aW5n IGEgd2lkZSByYW5nZSBvZiBmaW5hbmNpYWwgaW5zdHJ1bWVudHMgYWNyb3NzIHZhcmlvdXMgYXNz ZXQNCiAgICBjbGFzc2VzDQogIOKAoiBIZWxwIHNoYXBlIHRoZSBzdHJhdGVneSBmb3IgZ3Jvd3Ro IG9mIE9DYW1sIGF0IEJsb29tYmVyZyBieQ0KICAgIGNvbnRyaWJ1dGluZyB0byB0aGUgdmFyaW91 cyBPQ2FtbCBpbmZyYXN0cnVjdHVyZSBwcm9qZWN0cyBhY3Jvc3MgdGhlDQogICAgY29tcGFueQ0K ICDigKIgT3Bwb3J0dW5pdHkgdG8gbGVhcm4gc29tZSBvZiB0aGUgZmluYW5jaWFsIGRvbWFpbiB0 aGF0J3MgYXQgdGhlIGNvcmUNCiAgICBvZiB0aGUgZXh0ZW5zaXZlIGRlcml2YXRpdmUgZnVuY3Rp b25hbGl0eQ0KDQogIFBsZWFzZSBzZWUgbW9yZSBkZXRhaWxzIGFuZC9vciBhcHBseSBhdCBbKFNl bmlvciBTb2Z0d2FyZSBFbmdpbmVlciAtDQogIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcpXS4NCg0K ICBGZWVsIGZyZWUgdG8gcmVhY2ggb3V0IHRvIG1lIGRpcmVjdGx5IGJ5IGVtYWlsDQogIChtZ3Jh bmtpbkBibG9vbWJlcmcubmV0KSBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zLiBUaGFuayB5b3Uh DQoNCg0KWyhTZW5pb3IgU29mdHdhcmUgRW5naW5lZXIgLSBGdW5jdGlvbmFsIFByb2dyYW1taW5n KV0NCjxodHRwczovL2Jsb29tYmVyZy5hdmF0dXJlLm5ldC9jYXJlZXJzL0pvYkRldGFpbD9qb2JJ ZD0xMDczMCZxdHZjPTI3MmQwZDA4NDZmNzRiMTlkYzY2ZDdmZGMyOWNlYzA1YTBhZDY3ZTY0NmFl NmMxZTFjYjk0ZjVhZTFjOWM0YzIjPg0KDQoNClVwY29taW5nIENtZGxpbmVyIDIuMCBjaGFuZ2Vz IHRoYXQgbmVlZCB5b3VyIGF0dGVudGlvbg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC91cGNvbWluZy1jbWRsaW5lci0yLTAtY2hhbmdlcy10aGF0LW5lZWQteW91ci1hdHRl bnRpb24vMTYyMTEvMj4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBEYW5pZWwgQsO8bnps aSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE90aGVyIFtjaGFu Z2VzXSB5b3UgbWF5IHdhbnQgdG8gcGF5IGF0dGVudGlvbiB0byBpcyB0aGF0IGNtZGxpbmVyIDIu MA0KICB3aWxsOg0KDQogIDEuIFJlbW92ZSBkZXByZWNhdGVkIGlkZW50aWZpZXJzLg0KICAyLiBN YWtlIHRoZSBbYEFyZy5jb252J10gdHlwZSBhYnN0cmFjdFteMV0uDQoNCiAgSWYgeW91IGhhcHBl biB0byBiZSB3YWxraW5nIGFyb3VuZCB5b3VyIGBjbWRsaW5lcicgdXNhZ2Ugb3IgbWFraW5nIGEN CiAgbmV3IGNsaSB0aGVzZSBkYXlzLCBwYXkgcGFydGljdWxhciBhdHRlbnRpb24gdG8gMi4gYXMg dGhlIGNvbmNyZXRlDQogIHR5cGUgaGFzIGJlZW4gZGVwcmVjYXRlZCBzaW5jZSAyMDE3IGJ1dCBz YWRseSBpdCB3YXMgbmV2ZXIgcG9zc2libGUgdG8NCiAgbWFrZSBpdCBhIHZpc2libGUgZGVwcmVj YXRpb24gKE9DYW1sIGNvbXBpbGVyIGhlbHAgdXMhIDptYW5fYm93aW5nOikuDQoNCiAgTm90ZSB0 aGF0IGJvdGggMS4gYW5kIDIuIGNhbiBiZSByZXNvbHZlZCBub3cgYnkgdXNpbmcgY21kbGluZXIu MS4zLjAsDQogIHRoZXJlIGFyZSBhIGZldyBbaW5zdHJ1Y3Rpb25zIGhlcmVdLiBJdCdzIG5vIGd1 YXJhbnRlZWQsIGJ1dCBpZiB5b3UNCiAgYXJlIG9uIGBvcGFtJyBJIG1heSBoYXZlIGZpbGVkIGFu IGlzc3VlIGluIHlvdXIgaXNzdWUgdHJhY2tlcg0KICA6d2F2aW5nX2hhbmQ6Lg0KDQogIFAuUy4g SSB0aGluayB0aGVyZSdzIG5vdCBhIHNpbmdsZSBvY2N1cmVuY2Ugd2hlcmUgSSBkaWQgbm90IGV2 ZW50dWFsbHkNCiAgcmVncmV0IG1ha2luZyBhIHB1YmxpYyB0eXBlIGNvbmNyZXRlLg0KDQogIFte MV06IFNvIHRoYXQgY29tcGxldGlvbiBiZWhhdmlvdXJzIGNhbiBiZSBkZWZpbmVkIGF0IHRoYXQg bGV2ZWw7DQogIGFzd2VsbCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBtZXRhdmFyaWFibGUgd2hpY2gg eW91IGNvdWxkIHNwZWNpZnkgd2l0aA0KICBgQXJnLmNvbnYnIGNvbnN0cnVjdG9ycyBmb3IgYWdl cyBidXQgd291bGQgc2ltcGx5IGJlIGRyb3BwZWQgdG8gcmV0dXJuDQogIHRoZSBjb25jcmV0ZSBw YWlyLg0KDQoNCltjaGFuZ2VzXSA8aHR0cHM6Ly9naXRodWIuY29tL2RidWVuemxpL2NtZGxpbmVy L2lzc3Vlcy8yMDY+DQoNCltgQXJnLmNvbnYnXQ0KPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3 YXJlL2NtZGxpbmVyL2RvYy9DbWRsaW5lci9BcmcvaW5kZXguaHRtbCN0eXBlLWNvbnY+DQoNCltp bnN0cnVjdGlvbnMgaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS9jbWRsaW5lci9p c3N1ZXMvMjA2Pg0KDQoNCkR1bmUgZGV2IG1lZXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLWR1bmUtZGV2LW1lZXRpbmcvMTQ5OTQvMjY+DQoNCg0KRXRpZW5uZSBN YXJhaXMgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSEgIFRoZSBuZXh0IER1bmUg RGV2IE1lZXRpbmcgd2lsbCBiZSBvbiAqV2VkbmVzZGF5LCBNYXJjaCwgMTl0aCBhdA0KICAxNjow MCBDRVQqLiBUaGlzIGlzIGdvaW5nIHRvIGJlIGEgb25lLWhvdXItbG9uZyBtZWV0aW5nLg0KDQog IFdoZXRoZXIgeW91IGFyZSBhIG1haW50YWluZXIsIGEgcmVndWxhciBjb250cmlidXRvciwgYSBu ZXcgam9pbmVyIG9yDQogIGp1c3QgY3VyaW91cywgeW91IGFyZSB3ZWxjb21lIHRvIGpvaW46IHRo ZXNlIGRpc2N1c3Npb25zIGFyZSBvcGVuZWQhDQogIFRoZSBnb2FsIG9mIHRoZXNlIG1lZXRpbmdz IGlzIHRvIHByb3ZpZGUgYSBwbGFjZSB0byBkaXNjdXNzIHRoZQ0KICBvbmdvaW5nIHdvcmsgdG9n ZXRoZXIgYW5kIHN5bmNocm9uaXplIHdpdGggdGhlIER1bmUgZGV2ZWxvcGVycyA6KzE6DQoNCiAg VGhlIGFnZW5kYSBpcyBhdmFpbGFibGUgb24gdGhlIFttZWV0aW5nIGRlZGljYXRlZCBwYWdlXS4g RmVlbCBmcmVlIHRvDQogIGFkZCBtb3JlIGl0ZW1zIGluIGl0Lg0KDQogIOKAoiBNZWV0aW5nIGxp bms6IFt6b29tXQ0KICDigKIgQ2FsZW5kYXIgZXZlbnQ6IFtnb29nbGUgY2FsZW5kYXJdDQogIOKA oiBXaWtpIHdpdGggaW5mb3JtYXRpb24gYW5kIHByZXZpb3VzIG5vdGVzOiBbZHVuZSB3aWtpIG9u IEdpdEh1Yl0NCg0KDQpbbWVldGluZyBkZWRpY2F0ZWQgcGFnZV0NCjxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS93aWtpL2Rldi1tZWV0aW5nLTIwMjUtMDMtMTk+DQoNClt6b29tXQ0KPGh0 dHBzOi8vdXMwNndlYi56b29tLnVzL2ovODUwOTY4Nzc3NzY/cHdkPWNXTmhVMWRIUTFaTlNqWnVP VVpDUTBoMmJ5OVVkejA5Pg0KDQpbZ29vZ2xlIGNhbGVuZGFyXQ0KPGh0dHBzOi8vY2FsZW5kYXIu Z29vZ2xlLmNvbS9jYWxlbmRhci91LzAvZW1iZWQ/c3JjPWNfNWNkNjk4ZGY2Nzg0ZTM4NWIxY2Rj ZGMxZGJjYTE4YzA2MWZhYTk2OTU5YTA0NzgxNTY2ZDMwNGRjOWVjNzMxOUBncm91cC5jYWxlbmRh ci5nb29nbGUuY29tPg0KDQpbZHVuZSB3aWtpIG9uIEdpdEh1Yl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL3dpa2k+DQoNCg0KTmV3IHJlbGVhc2Ugb2YgTW9ub2xpdGggKDIwMjUwMzE0 KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXJlbGVhc2Utb2Yt bW9ub2xpdGgtMjAyNTAzMTQvMTYzMDMvMT4NCg0KDQpGcmFuw6dvaXMgUG90dGllciBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSBh IG5ldyAiUGkgRGF5IiByZWxlYXNlIG9mIE1vbm9saXRoLg0KDQogIE1vbm9saXRoIGlzIGFuIE9D YW1sIGxpYnJhcnkgdGhhdCBoZWxwcyBwZXJmb3JtIGJsYWNrLWJveCB0ZXN0aW5nIG9mDQogIE9D YW1sIGxpYnJhcmllcywgZWl0aGVyIHZpYSBwdXJlbHkgcmFuZG9tIHRlc3RpbmcsIG9yIHZpYSBn cmV5LWJveA0KICBmdXp6aW5nLg0KDQogIFRoaXMgbmV3IHJlbGVhc2UgYWRkcyBuZXcgY29tbWFu ZC1saW5lIG9wdGlvbnMgdG8gdGhlIGV4ZWN1dGFibGUNCiAgcHJvZ3JhbSB0aGF0IE1vbm9saXRo IHByb2R1Y2VzIGJ5IGRlZmF1bHQuIEZ1cnRoZXJtb3JlLCBpdCBleHRlbmRzDQogIE1vbm9saXRo J3MgQVBJIHdpdGggYSBuZXcgZnVuY3Rpb24sIGBydW4nLCBzbyB0aGUgdXNlciBjYW4gaW52b2tl DQogIE1vbm9saXRoJ3MgZW5naW5lIGFzIHBhcnQgb2YgdGhlaXIgb3duIGFwcGxpY2F0aW9uLCB3 aXRob3V0IGxldHRpbmcNCiAgTW9ub2xpdGggcGFyc2UgdGhlIGNvbW1hbmQgbGluZS4gVGhlc2Ug aW1wcm92ZW1lbnRzIG1ha2UgaXQgZWFzaWVyIHRvDQogIHVzZSBhIE1vbm9saXRoLWJhc2VkIHRl c3QgYXMgcGFydCBvZiBhIGNvbnRpbnVvdXMgaW50ZWdyYXRpb24gKENJKQ0KICBzeXN0ZW0uIFRo YW5rcyB0byBHYWJyaWVsIFNjaGVyZXIgZm9yIHN1Z2dlc3RpbmcgdGhlc2UgaW1wcm92ZW1lbnRz Lg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gaW5z dGFsbCBtb25vbGl0aC4yMDI1MDMxNA0KICDilJTilIDilIDilIDilIANCg0KICBIYXBweSB0ZXN0 aW5nIQ0KDQoNCmRyZWFtX21pZGRsZXdhcmVfZXh0IHYwLjEuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4t ZHJlYW0tbWlkZGxld2FyZS1leHQtdjAtMS0wLzE2MzA2LzE+DQoNCg0KR2VvZmZyZXkgQm9yb3Vn aCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEEgY29sbGVjdGlvbiBvZiBt aWRkbGV3YXJlIHV0aWxpdGllcyBmb3IgRHJlYW0gZnJhbWV3b3JrLCBJbml0aWFsDQogIHJlbGVh c2UgdjAuMS4wDQoNCiAgQ3VycmVudGx5IHN1cHBvcnRpbmcgdGhlIGZvbGxvd2luZyBmdW5jdGlv bmFsaXRpZXM6DQoNCiAgQ09SUzogQ3Jvc3MtT3JpZ2luIFJlc291cmNlIFNoYXJpbmcNCg0KICBE ZWxheTogc2ltdWxhdGVzIGRlbGF5ZWQgcmVxdWVzdA0KDQogIFJhdGUgTGltaXRlcjogc3VwcG9y dHMgRml4ZWQgV2luZG93IGFuZCBUb2tlbiBCdWNrZXQgYWxnb3JpdGhtcw0KDQogIFRyYWZmaWMg RmlsdGVyOiBzdXBwb3J0cyBJUCwgaGVhZGVyIGFuZCBjb29raWUgYmFzZWQgdHJhZmZpYyBmaWx0 ZXJzDQoNCiAg4oCiIFByb2plY3QgcGFnZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9heG9ucy10YWxl bnQvZHJlYW1fbWlkZGxld2FyZV9leHQ+DQogIOKAoiBEb2N1bWVudGF0aW9uOg0KICAgIDxodHRw czovL2F4b25zLXRhbGVudC5naXRodWIuaW8vZHJlYW1fbWlkZGxld2FyZV9leHQvZHJlYW1fbWlk ZGxld2FyZV9leHQ+DQoNCg0KTGVhcm4gUHJvZ3JhbW1pbmcgd2l0aCBPQ2FtbCAobmV3IGJvb2sp DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xlYXJu LXByb2dyYW1taW5nLXdpdGgtb2NhbWwtbmV3LWJvb2svMTYxMTEvMTM+DQoNCg0KQ29udGludWlu ZyB0aGlzIHRocmVhZCwgSmVhbiBDaHJpc3RvcGhlIEZpbGxpYXRyZSBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIFtBIHByZWxpbWluYXJ5IEVQVUIgdmVyc2lvbiBvZiB0aGUgYm9va10gaXMgbm93IGF2 YWlsYWJsZS4gRmVlZGJhY2sgaXMNCiAgbW9zdCB3ZWxjb21lIChwcmVmZXJhYmx5IGJ5IFtzdWJt aXR0aW5nIGFuIGlzc3VlIGhlcmVdKS4NCg0KICBCaWcgdGhhbmtzIHRvIEBDaGV0X011cnRoeSB3 aG8gc3BlbnQgd2Vla3Mgd29ya2luZyB0aGlzIG91dCBmcm9tIG91cg0KICBMYVRlWCBzb3VyY2Vz Lg0KDQoNCltBIHByZWxpbWluYXJ5IEVQVUIgdmVyc2lvbiBvZiB0aGUgYm9va10NCjxodHRwczov L3Vzci5sbWYuY25ycy5mci9scG8vbHBvLmVwdWI+DQoNCltzdWJtaXR0aW5nIGFuIGlzc3VlIGhl cmVdDQo8aHR0cHM6Ly9naXRodWIuY29tL2JhY2t0cmFja2luZy9sZWFybi1wcm9ncmFtbWluZy13 aXRoLW9jYW1sL2lzc3Vlcz4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJs b2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9n cyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKAoiBbT0NhbWzi gJlzIFN0YW5kYXJkIExpYnJhcnkgKGBTdGRsaWInKV0NCiAg4oCiIFtuZW9jYW1sOiBhIG5ldyBF bWFjcyBwYWNrYWdlIGZvciBPQ2FtbCBwcm9ncmFtbWluZ10NCiAg4oCiIFtXZSdyZSBNb3Zpbmcg T2NzaWdlbiBmcm9tIEx3dCB0byBFaW8hXQ0KICDigKIgW0ZpbmRpbmcgU2lnbmFsIGluIHRoZSBO b2lzZSB3aXRoIEluIFlvdW5nIENob10NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6 Ly9vY2FtbC5vcmcvYmxvZy8+DQoNCltPQ2FtbOKAmXMgU3RhbmRhcmQgTGlicmFyeSAoYFN0ZGxp YicpXQ0KPGh0dHBzOi8vYmF0c292LmNvbS9hcnRpY2xlcy8yMDI1LzAzLzE0L29jYW1sLXMtc3Rh bmRhcmQtbGlicmFyeS8+DQoNCltuZW9jYW1sOiBhIG5ldyBFbWFjcyBwYWNrYWdlIGZvciBPQ2Ft bCBwcm9ncmFtbWluZ10NCjxodHRwczovL2JhdHNvdi5jb20vYXJ0aWNsZXMvMjAyNS8wMy8xNC9u ZW9jYW1sLWEtbmV3LWVtYWNzLXBhY2thZ2UtZm9yLW9jYW1sLXByb2dyYW1taW5nLz4NCg0KW1dl J3JlIE1vdmluZyBPY3NpZ2VuIGZyb20gTHd0IHRvIEVpbyFdDQo8aHR0cHM6Ly90YXJpZGVzLmNv bS9ibG9nLzIwMjUtMDMtMTMtd2UtcmUtbW92aW5nLW9jc2lnZW4tZnJvbS1sd3QtdG8tZWlvPg0K DQpbRmluZGluZyBTaWduYWwgaW4gdGhlIE5vaXNlIHdpdGggSW4gWW91bmcgQ2hvXQ0KPGh0dHBz Oi8vc2lnbmFscy10aHJlYWRzLnNpbXBsZWNhc3QuY29tL2VwaXNvZGVzL2ZpbmRpbmctc2lnbmFs LWluLXRoZS1ub2lzZS13aXRoLWluLXlvdW5nLWNoby1xQm1mRDl2Xz4NCg0KDQpPbGQgQ1dODQri lZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlv dSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3Ig Z28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0K ICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdl ZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQog IFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2No bWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBl dGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBz Oi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 11 to 18, 2025.

    Upgrading Semgrep from OCaml 4 to OCaml 5 + dynamic_gc utility=

    Nat Mote announced

    I've written up my experience upgrading Semgrep to OCaml 5. T= he main barrier we faced was increased memory consumption, but I was able t= o tune the garbage collector to address this problem. We have also open-sou= rced the utility I wrote<= /a> to adjust the space_overhead GC parameter based on heap si= ze. We are looking forward to taking advantage of all the great new feature= s in OCaml 5!

    Open source OCaml algotrading with longleaf 1.0.0

    adventure announced

    Recently, I have been working on a project called longleaf for algorithmic trading of US stocks= with OCaml. The project has reached a point where it may be interesting t= o others, so I thought I would share it here and write a simple README, alt= hough there could be a lot more documentation. I would be curious to hear = if anyone has any ideas for this! If you try to use it or have any feedbac= k or questions, feel free to leave a post here, make a github issue, or mak= e a github discussion.=20

    In a nutshell, the idea is that strategies are functors that are instantiat= ed with a "backend" for backtesting, live, or paper trading. That way, whe= ther you are testing your strategy or running it live, it is exactly the sa= me strategy other than how the execution of orders is handled. In order to= use it, you will need to set up some accounts and there are likely bugs. = Of course, if you use this program with real money and something bad happen= s, it is entirely your responsibility!

    github

    Neocaml - a TreeSitter-powered Emacs package for OCaml program= ming

    Bozhidar Batsov announced

    In a different topics I wrote about about my recent work on neocaml, and I = thought it might be a good idea to post something separately as well. Check= out the project's GitHub re= po and the short blog post.

    Contributions and feedback are most welcome, and I hope neocaml will be useful to some of you either a tool or as a source of inspiration.

    Senior Software Engineer at Bloomberg. New York

    Maxim Grankin announced

    Hi everyone! =F0=9F=91=8B

    Bloomberg is looking for a full-time Senior Software Engineer in New York:

    • Gain experience applying functional programming to real production fina= ncial systems
    • Use OCaml to develop a robust template system to assist users in creati= ng a wide range of financial instruments across various asset classes
    • Help shape the strategy for growth of OCaml at Bloomberg by contributin= g to the various OCaml infrastructure projects across the company
    • Opportunity to learn some of the financial domain that's at the core of= the extensive derivative functionality

    Please see more details and/or apply at (Senior Software Engineer - Functi= onal Programming).

    Feel free to reach out to me directly by email (mgrankin@bloomberg.net) if = you have any questions. Thank you!

    Upcoming Cmdliner 2.0 changes that need your attention

    Continuing this thread, Daniel B=C3=BCnzli announced<= /h3>

    Other changes you may want to pay attention to is that cmdliner 2.0 will:=20

    1. Remove deprecated identifiers.
    2. Make the Arg.conv type abstract[^1].

    If you happen to be walking around your cmdliner usage or maki= ng a new cli these days, pay particular attention to 2. as the concrete typ= e has been deprecated since 2017 but sadly it was never possible to make it= a visible deprecation (OCaml compiler help us! :man_bowing:).=20

    Note that both 1. and 2. can be resolved now by using cmdliner.1.3.0, there= are a few inst= ructions here. It's no guaranteed, but if you are on opam = I may have filed an issue in your issue tracker :waving_hand:.

    P.S. I think there's not a single occurence where I did not eventually regr= et making a public type concrete.

    [^1]: So that completion behaviours can be defined at that level; aswell a= s the documentation metavariable which you could specify with Arg.con= v constructors for ages but would simply be dropped to return the co= ncrete pair.

    Dune dev meeting

    Etienne Marais announced

    Hi!=20 The next Dune Dev Meeting will be on Wednesday, March, 19th at 16:00 CET= . This is going to be a one-hour-long meeting.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers :+1:=20

    The agenda is available on the meeting dedicated page. Feel free to add more= items in it.

    New release of Monolith (20250314)

    Fran=C3=A7ois Pottier announced

    I am pleased to announce a new "Pi Day" release of Monolith.

    Monolith is an OCaml library that helps perform black-box testing of OCaml = libraries, either via purely random testing, or via grey-box fuzzing.

    This new release adds new command-line options to the executable program th= at Monolith produces by default. Furthermore, it extends Monolith's API wit= h a new function, run, so the user can invoke Monolith's engin= e as part of their own application, without letting Monolith parse the comm= and line. These improvements make it easier to use a Monolith-based test as= part of a continuous integration (CI) system. Thanks to Gabriel Scherer fo= r suggesting these improvements.

    opam update
    opam install monolith.20250314
    

    Happy testing!

    dream_middleware_ext v0.1.0

    Geoffrey Borough announced

    A collection of middleware utilities for Dream framework, Initial release v= 0.1.0

    Currently supporting the following functionalities:

    CORS: Cross-Origin Resource Sharing

    Delay: simulates delayed request

    Rate Limiter: supports Fixed Window and Token Bucket algorithms

    Traffic Filter: supports IP, header and cookie based traffic filters

    Learn Programming with OCaml (new book)

    Continuing this thread, Jean Christophe Filliatre ann= ounced

    A preliminary EPUB version= of the book is now available. Feedback is most welcome (preferably by = submitting an issue here).

    Big thanks to @Chet_Murthy who spent weeks working this out from our LaTeX = sources.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=WmG7HyJk; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=FBAPorPu; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 44D2540065 for ; Tue, 25 Mar 2025 08:06:36 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=pSCJnEpk5fvCd3UKw+VOJvKfYebrNEeCxHI8QPOmOtk=; b=WmG7HyJkN7E0d7VdcXMTgnPBq/njJOu6F0r+tcwEqMGwQHXWIxaQv6/B 1Hxc1S+KDgh4hosgRosCUmcAMTmJLSVOSVQWs0RYXTfNhZNarVT/+qDCe 7t/N6GMybwwqoC7YqH5zbSm0cjhXzGw8HmXSiJUNXeEUr6cTsh+yrKG8X 8=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.14,274,1736809200"; d="scan'208,217";a="214576220" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Mar 2025 09:06:36 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id D129BE0264; Tue, 25 Mar 2025 09:06:35 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4A6CAE007A for ; Tue, 25 Mar 2025 09:06:30 +0100 (CET) IronPort-SDR: 67e26405_2ggN5Bov1gUN5MvPREdrHPalJqFMGW3xFvOtEArBqYNORdZ x9WTv7xYufrLMd2aE6bZc8XcgJxMQ8XLJVyUbrA== X-IPAS-Result: =?us-ascii?q?A0HXBwDaYuJnjyIeaIFagl6BP1soGQFjWjMHCEgEhFGBY?= =?us-ascii?q?4FshS0IAYhtgRaQNIhHgi+BaoERAy4FHhQBAwENLgEOBAECBAEBAwECAYIMg?= =?us-ascii?q?T1xRgKLIgIfBgEENBMBAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECE?= =?us-ascii?q?AEBAQEBATkFSYV7DUkBAQEDAQoBgWpRYBF0AQEBAQEBAQEBAgEBASIBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBAhcKD?= =?us-ascii?q?QpkAQIGChMBASYSGBQCDQMJBwQBBgMCEQE1AxQBEhQGAYIPWAGCZAMEAQwGk?= =?us-ascii?q?nybS3qBMoEBggwBAQaBCD4BAgIJAgUBDgkm2geBZQmBMBiFbYJJGgEFJUhrA?= =?us-ascii?q?oQoIAmEMycPgVVEZi+CKEoHb4FCQEgMCwEBAQEBF30CCQQEFAEBAwMCOA0JC?= =?us-ascii?q?YMcgmmCM0VDMyuBMIEIgQyGNhJPg06BNFxQgQ43H3gshDIZNwQEEVYvPIMgg?= =?us-ascii?q?k8igQsoSIJMiQiBRyIDJjMsAVUTFwsHBWGBCwMqNDGBRXs3gg1pSToCDQI1g?= =?us-ascii?q?hskWIIogxSBOYQ+hD+FUIIRggSJJ4RgLU+CdR1AAwttPTcUG6M0CTg1ATqDR?= =?us-ascii?q?y8OOAYBEAYLHA8UAQYnFAgOAQETDQIrAwgOChAFBwUjDgsNBAEJBAEXAS0IA?= =?us-ascii?q?wsvkkMINCoDdJxqk3FtNAeEHoFdBgyJBYEkkiaDV4QDgVeLMocAiwiGXWYim?= =?us-ascii?q?FwigjaCeYQtCoEbCWCBD2qVGhAmBgICBA8JD4UpgX4jPG8BGgMMBzMaMCIhD?= =?us-ascii?q?RCCSgkJPRwPV40oLhYEg1SBPj5ogSNRFyS9ZAJCNQIBATgCBwEKAQEDCYVFH?= =?us-ascii?q?QEBgwSCF26DfDOBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVh3pTmOHm4FQ== IronPort-HdrOrdr: A9a23:ik7Q9a7g/dYl/WFQ7wPXwPrXdLJyesId70hD6qkRc3Zom6mj/P xG88536faZslossQgb6Le90fC7MBXhHPxOgLX5TI3MYOCOggLBEGgF1+vfKlbbdREWmNQtsJ tIQuxTD8DxEEg/reuS2njdLz/4+qjlzEl/v5a980tQ X-Talos-CUID: =?us-ascii?q?9a23=3AsWVG6GtIar+2zohSBdJCLcbu6IsbNVjd1i31AXP?= =?us-ascii?q?iFHRWUZycSXjAp517xp8=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3Ays1gFgxzp32YGI6/Sg8a8m9nyIKaqL3xVEpKq7g?= =?us-ascii?q?0gMCjLiZNajKAiwaMWYByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.14,274,1736809200"; d="scan'208,217";a="214576185" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEcU2cjQgqxJx8A0Uvj1z9E2nndvzOdLdL5Ab?= =?us-ascii?q?8AAwx2zOIztNxsCF9m4/epIFQkz/lsqIbzbNMreTidC9sHxnAHzivA1W?= =?us-ascii?q?/cl9Po0t1pSt0uJdME1NKTZ85gBIvfCrHQbBroPi5/FbhXu2YNwX/qai?= =?us-ascii?q?cmkMKrxeV6MglXfPGLOltNBA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Mar 2025 09:06:29 +0100 Received: from TM.local (cust-west-par-46-193-46-163.cust.wifirst.net [46.193.46.163]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BCB52564BB0; Tue, 25 Mar 2025 09:06:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1742889987; bh=Z6ygVhq+/nz5LBO3SDwbT0nS1G9P6ywPUHpV3GvgiIE=; h=From:To:Subject:Date:Message-ID; b=FBAPorPu8oeoaNtK7tmM88WLAa5sLWJJh35SxFj0VKuw4e+dh/vmnfHBvm7QXF6BH XM8CtJ1fqSOsUatt3DF3IASggWJkFZ9mUQfG3Z8Hh/gCkV5KulbJIIBXHC9CIwYlF2 +DqlLQNyYxGqafJk2N03/B7tDsScznbVWtUlXZ00= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 25 Mar 2025 09:06:27 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 25 09:06:28 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499515, queueID=07106564BC1 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19283 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 18 to 25, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Ocsigen migrating to effect-based concurrency Slipshow! Odoc 3.0 released! 4th editor tooling dev-meeting: 28th of March The Call for Papers for FUNARCH2025 is open! Proposal for the replacement of Set and Map in the stdlib A tool to reverse debug OCaml (and other binaries) runs Feedback request: New lesson on `Lazy' OCaml Workshop 2025 at ICFP/SPLASH - announcement and call for proposals Old CWN Ocsigen migrating to effect-based concurrency =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Vincent Balat announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're delighted to announce that the [Ocsigen] project has just launched one of its most ambitious changes: moving from Lwt to effects-based concurrency. If this experiment goes well, it will be another step towards simplifying Web development in OCaml, by eliminating the need for monads. Of course we will try to make this transition as smooth as possible, by providing a compatibility interface for application developers, and tools to help Web and mobile developers to do the transition themselves if they want to. These tools will be released in order to help other projects to do the transition and avoid incompatibilities between OCaml libraries as much as possible. This work was made possible thanks to the support of the [NGI Zero Core fund] through the [Nlnet foundation], and is perfomed by [Tarides]. Read the [full announcement] by Tarides. [Ocsigen] [NGI Zero Core fund] [Nlnet foundation] [Tarides] [full announcement] Slipshow! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear reader, I am _absolutely thrilled_ to announce the release of slipshow `0.1.1' on this forum! As you have all noticed, that is a _huge_ leap from the previous version, `0.0.34'. (What can have motivated this?) Recall that [Slipshow] is a tool to prepare presentation support, that is based on scripted scrolling and zooming (instead of slides). I'll use this single thread to announce all future versions of slipshow, to avoid polluting the global namespace, as it makes sense to keep this forum centered around OCaml, and this tool has nothing to do with OCaml =E2=80=A6 =E2=80=A6 well, almost nothing to do with OCaml, since in this version the engine has been fully rewritten in OCaml (hence the bold new version) and works much better! Making it a full OCaml project. Thanks, OCaml developers of open source libraries and language! To upgrade it, you can do: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam update =E2=94=82 $ opam upgrade slipshow =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 What? Some people don't have it installed already? For those, it will be: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam update =E2=94=82 $ opam install slipshow =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Now comes the moment you are all waiting for: the list of new features! *TLDR*: =E2=80=A2 Engine rewritten in OCaml =E2=80=A2 Fewer bugs when navigating back =E2=80=A2 Stronger foundation (eg, for subslips) =E2=80=A2 Custom scripts requires minor adjustments =E2=80=A2 Breaking change in subslip HTML =E2=80=A2 Drawing now in SVG =E2=80=A2 No more zoom issues =E2=80=A2 Erasing works "per-stroke" =E2=80=A2 Revamped table of content =E2=80=A2 Now based on title structure rather than subslips =E2=80=A2 New `--markdown-output' flag for converting to GFM =E2=80=A2 Parser bugfixes =E2=80=A2 License change: Now GPLv3 (previously MIT) =E2=80=A2 npm distribution discontinued. =E2=80=A2 Special thanks to NLNet for their [sponsorship]! Dear readers, I am thrilled to announce the 0.1 release of Slipshow, the slip-based presentation tool! This is a _major_ minor release. While versions `0.0.1' to `0.0.33' have served well to experiment, this release marks a fresh start, aimed at being a solid foundation for a project with a clear direction. A huge thank you to NLNet for [sponsoring] this milestone! So, what is new? Quite a lot, the main change being that the engine has been _fully rewritten_. [Slipshow] [sponsorship] [sponsoring] The engine =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Started as a single file javascript project, the old engine evolved presentation by presentation =E2=80=93 leading to numerous bugs, maintena= nce challenge or extensibility issue. (In other word, I did all I could not to touch it despite all the bugs) This release introduces a complete rewrite of the engine in OCaml, with new design choices that improve reliability and expandability. Let's go over the key benefits and breaking changes. =E2=97=8A Navigating Forward=E2=80=A6 and Backward One of the greatest weakness of the old engine was handling backward navigation. Since it started as a simple "script scheduler", going back wasn't straightforward. The workaround involved taking a snapshot of=E2=80=A6 everything (the DOM, the state, =E2=80=A6), to be able to go = back in time. This had many bugs, in animations (such as the "focus" action), and in its iteraction with other features (such as drawing). So, what is new in this engine? The engine now records an undo function for each step of the presentation. While this may not sound much, it is a ton better in terms of development. It's a much stronger foundation to build new features from. It's also much more efficient for long presentations. In most cases, your old presentations will work without modification in the new engine. However, there is one case where it needs modification: when you include the execution of a custom script in your presentation. In this case, you need to return the function undo to undo the executed step: see the [documentation]! (This is not ideal and better solutions are being experimented) [documentation] =E2=97=8A Writing Previously, live annotations used the excellent [atrament] library. While great in many cases, its bitmap-based approach caused blurriness when zooming. This release introduces a custom SVG-based annotation system, which eliminates zoom issues. Another change: erasing now works stroke-by-stroke instead of pixel-by-pixel. [atrament] =E2=97=8A Table of content The old table of contents was based on the slip structure, which didn=E2=80=99t work well for presentations that primarily used a single s= lip (as is often the case with compiled presentations). The new sidebar-style table of contents is now generated from headers, making it more intuitive and aligned with the presentation=E2=80=99s structure=E2=80=94resulting in a much smoother navigation experience! =E2=97=8A Breaking change: Subslips The HTML structure for subslips has evolved, in particuler to avoid having to provide the scale of your subslips. Support for subslip in the new engine is not mature and will be announced in the next release, but bear in mind that if your presentation relies on them, you might want to wait a bit before migrating to the new engine! Compiler =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C While this release focuses on the engine, the compiler has also seen improvements, including bug fixes (particularly in the parser) and a new feature: =E2=97=8A `--markdown-output' for markdown exports If you want to print your presentation or host it as a static webpage, the default format can be cluttered with annotations. The new `--markdown-output' flag lets you generate a clean, GitHub Flavored Markdown (GFM) file without annotations. Other =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A small but maybe important note: the license has changed, the project has transitioned from MIT to GPLv3, aligning better with its values. Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Looking forward to your bug reports! Christian Lindig asked and Paul-Elliot replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Could you link to a demo presentation done with this tool? Sure! [Here] is a presentation of the tool itself, in French. The source file for it is [here]. [Here] is a math presentation using more features (made using a previous version of the engine, which had more features and more bugs). [Here] is the historical first presentation made in Slipshow (made with the worst version of the engine). (I include presentations made with old versions of the engine to give an idea of what you can do, as the new engine is very new I don't have many examples using it, and it has some breaking changes which makes porting old presentations using too many features hard to port!) [Here] [here] [Here] [Here] Daniel B=C3=BCnzli added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 [Here] is a non-dogfooded one. [Here] Odoc 3.0 released! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Jon Ludlam announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 On behalf of the Odoc development team, I=E2=80=99m delighted to announce= the release of Odoc 3! This is a big big release with loads of new features and bug fixes, and I encourage everyone to install it and have a play! For an overview of the new features see our [beta release announcement]. tl;dr: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install odoc-driver # will install odoc 3 =E2=94=82 $ odoc_driver odoc odoc-parser odoc-driver odoc-md sherlodoc --= remap =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and point your browser at `_html/index.html'. This example shows odoc_driver creating the docs for the 5 packages specified and remapping links to other packages (see [here] for an explanation) If you try the above command, you'll note something interesting, and hopefully this will encourage you to run `odoc_driver' on your own packages before you release them, as then you'll be able to avoid slightly embarrassing post-release fixes like [this one] =F0=9F=98=AC Here are the changes from the beta release: [beta release announcement] [here] [this one] Added =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 =E2=80=A2 =E2=80=A2 Changed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 4th editor tooling dev-meeting: 28th of March =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: PizieDust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Hi everyone, join us for the next *Editor Public Dev-Meeting* on *March 28th*! This session will feature a talk from *Xavier (@xvw)* on the latest *Emacs functionalities* integrated with *OCaml LSP server*. :clipboard: Meeting agenda: =E2=80=A2 A tour-de-table to allow the participants that wish to do so to present themselves and mention issues / prs they are interested in. =E2=80=A2 Talk from Xavier and Q&A =E2=80=A2 Discuss issues and pull requests that were tagged in advance or mentioned during the tour-de-table. =E2=80=A2 =F0=9F=94=B9 *What=E2=80=99s new in Emacs for OCaml development= ?* =E2=80=A2 =F0=9F=94=B9 *How the latest LSP improvements enhance the exper= ience?* =E2=80=A2 =F0=9F=94=B9 *Live demo and discussion on upcoming features* =E2=80=A2 =F0=9F=93=85 *Date:* March 28th =E2=80=A2 =F0=9F=95=90 *Time:* 4PM CET =E2=80=A2 =F0=9F=93=8D *Location:* [https://meet.google.com/wrv-dovu-ypb] This is a great opportunity to learn about the latest improvements and share feedback with the community. Looking forward to seeing you there! =F0=9F=9A=80 Previous meeting notes are available in [Merlin=E2=80=99s repository wiki] [https://meet.google.com/wrv-dovu-ypb] [Merlin=E2=80=99s repository wiki] The Call for Papers for FUNARCH2025 is open! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Jeffrey Young announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello everyone, This year I am chairing the Functional Architecture workshop colocated with ICFP and SPLASH. I'm happy to announce that the Call for Papers for FUNARCH2025 is open - *deadline is June 16th*! Send us research papers, experience reports, architectural pearls, or submit to the open category! The [idea] behind the workshop is to cross pollinate the software architecture and functional programming discourse, and to share techniques for constructing large long-lived systems in a functional language. See [FUNARCH2025 - ICFP/SPLASH] for more information. You may also browse previous year's submissions [here] and [here]. See you in Singapore! [idea] [FUNARCH2025 - ICFP/SPLASH] [here] [here] Proposal for the replacement of Set and Map in the stdlib =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Christophe Raffalli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, While working on AVL for teaching I found an alternative to the AVL that seems overall better than the current ocaml implementation. The code is available here: [https://github.com/craff/ocaml-avl/tree/master]. The Readme.md contains the inequality needed to prove correctness and termination of the balancing function "join". The idea is to replace the constraint =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 |height left_son - height right_son| <=3D 2=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 By =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 size left_son <=3D 2 * size right_son + 1 =E2=94=82 size right_son <=3D 2 * size left_son + 1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We see 3 advantages: =E2=80=A2 O(1) cardinal of set or map =E2=80=A2 slightly simpler code or at least not more complicated (see bel= ow) =E2=80=A2 seems faster in many cases (not always and strangely depends on compilation options). Use `dune exec ./test.exe' for some simple tests. Before submitting a PR, I think it call be a good idea to call for comments here. Cheers, Christophe [https://github.com/craff/ocaml-avl/tree/master] A tool to reverse debug OCaml (and other binaries) runs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sid Kshatriya announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'd like to announce a debugging tool I've built ! It's called *_Software Counters mode_ `rr'* . It is available at Many of you may have already heard of a debugger called [`rr'] =E2=80=93 = it allows you to record and replay programs on Linux. It is extremely useful for instance to debug issues with garbage collection or other low level issues in natively compiled OCaml programs. Once you capture a bug during the record phase, that bug can be replayed any number of times during replay. One major limitation of `rr' is that it requires access to CPU Hardware Performance counters which is usually not available in cloud VMs or containers. *_Software Counters mode_ `rr' is a modification of the `rr' debugger that lifts this limitation =E2=80=93 access to CPU Hardware Performance counters is not required*. This means you can run `rr' in many more configurations. I've been able to successfully record/replay the whole OCaml compiler test suite using _Software Counters_ mode `rr' (Except for a single ocaml test called `pr2195' which exhausts the file descriptors). *I've also written a blog post* about record/replay debugging generally and _Software Counters mode_ in particular. Please see [here]. [`rr'] [here] Feedback request: New lesson on `Lazy' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jakub Svec announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Hello, I created a lesson on the `Lazy' module that I'd like to propose for the language tutorials section of ocaml.org. You can find the draft on [HackMD] Please suggest anything you would like, I'm happy to make several rounds of improvement. [HackMD] Lesson implementation decisions: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This lesson is focused on beginners. The first draft of this lesson is 345 lines, which is on the shorter side compared to other lessons. The surface area of the `Lazy' module is small, so I took the opportunity to supplement the lesson with a thorough explanation of evaluation strategies. This is supplemental, however, and can be shortened or removed based on your preferences. Without the supplemental section, the lesson is only 200 lines long. OCaml Workshop 2025 at ICFP/SPLASH - announcement and call for proposals =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kiran Gopinathan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hihi everyone!!! This year, the [ICFP] (International conference on Functional Programming) Programming Languages conferences will be held in Singapore (colocated with [SPLASH] in fact!): Continuing this community's annual tradition from 2012, we will be hosting the OCaml workshop after the ICFP conference, on the *17th October 2025 (Friday)*. The workshop is intended to cover all different kinds of aspects of the OCaml programming language as well as the OCaml ecosystem and its community, such as scientific and/or research-oriented, engineering and/or user-oriented, as well as social and/or community-oriented. [ICFP] [SPLASH] Call for talk proposals =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The [call for talk proposals] for the workshop is now open! [call for talk proposals] =E2=97=8A Dates Here are the important dates: =E2=80=A2 Talk proposal submission deadline: *July 3rd (Thursday)* =E2=80=A2 Author notification: *August 7th (Thursday)* =E2=80=A2 Workshop: *October 17th (Friday)* =E2=97=8A Submissions Submissions are typically around 2 pages long (flexible), describing the motivations of the work and what the presentation would be about. We encourage everyone who might be interested in giving a talk to submit a proposal! We truly mean everyone, and also have strongly anyone in mind who belongs to a group that=E2=80=99s traditionally underrepresented at OCaml workshops, e.g. due to your gender(s) or non-gender, where you=E2=80=99re from or based or whatever other kinds of characteristics you might have. You should all be able to find all information you=E2=80=99ll need to submit a proposal on the official [cal= l for talk proposals]. However, if you have any question, don=E2=80=99t hesitat= e to ask us. [call for talk proposals] =E2=97=8A Quota on accepted talks per affiliation Following the approach from last year which worked well, this year again we will try to enforce a quota of a maximum of four talks given by speakers with the same company/university/institute affiliation. In order to guarantee a coverage of a diverse range of topics and perspectives, we=E2=80=99ll experiment with the same affiliation quota ag= ain. Do not hesitate to submit your talk proposal in any case: quotas, if needed, will be taken into account by the PC after reviewing all submissions, so there=E2=80=99s no reason to self-select upfront. About the workshop itself =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C So far, we=E2=80=99ve only covered the talk proposals and formalities. The exciting part will be the workshop itself! The OCaml workshop is going to be a whole-day event and, similarly to previous years, it=E2=80=99s li= kely going to have four sessions of about four talks each. It=E2=80=99s a fair= ly informal and interactive environment, where people engage in all kinds of conversations about OCaml during the breaks and after the workshop. =E2=97=8A Hybrid attendance and cost for speakers We=E2=80=99re aiming to make the workshop hybrid with the same streaming modalities as last year, meaning that *talks as well as participation can be either in-person or remote*, and *remote attendance will be free*. To promote a good atmosphere, communication and engagement, we prefer to have most talks in-person, but remote talks will be most welcome as well. There may be opportunities for speakers who would not have funding otherwise (via their employer or university) to attend, although we are still in the process of confirming this. (Please keep an eye on this post, which will be updated once we get confirmation!) We will do our best to provide the best workshop experience possible for remote participants, within the constraints of the hybrid format. While attending in-person does come with advantages, it also comes with an environmental cost, and we strongly support transitioning to a less plane-intensive organization for conferences and community events :deciduous_tree: . =E2=97=8A Related events The day before the OCaml workshop, i.e. Oct 16th (Thursday), is the day of the [ML workshop], with focus on more theoretical aspects of OCaml and the whole family of ML languages in general. The ML workshop and tends to be very interesting for OCaml lovers as well. That aside, this year, I believe, is the first year that both the ICFP and SPLASH programming languages conferences are going to be co-located, so this is an exciting opportunity to experience the whole breadth of two of the top-ranked PL conferences over the span of a week! What a time to be alive! We=E2=80=99re looking forward to the the talk submissions and to the work= shop! Let us know if you have any questions. @Gopiandcode & @yasunariw [ML workshop] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=qm0w9avk; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=YGPNMKMN; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 18D1640065 for ; Tue, 1 Apr 2025 09:13:04 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=jpvVNSFd5u1GlPR2U8U7tHgGgcHrEkFjC7Wvd2H4l84=; b=qm0w9avkdiPgAji6GTNI0qb4pTkhufpxu8QZJr7sFQJzkX6Wf36ONDh1 MZk5QegAigqSKHw+/RCk6VoYNVuRoMRh4MqkNzjR/zKJxh7xl67d/ZRGI yCIFF42D/agxA8OmJqxoZ3WpAkDz2ycXqsS34hY55hrAHLoqUcfJ+sY9r E=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.14,293,1736809200"; d="scan'208,217";a="215752038" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Apr 2025 11:13:03 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id CC93CE0D25; Tue, 1 Apr 2025 11:13:02 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id BCA8FE007A for ; Tue, 1 Apr 2025 11:12:56 +0200 (CEST) IronPort-SDR: 67ebae05_vfboqkTjdk8bVBlMjiI3BF0QhtMevuhvtcvYvlbSipasU/w qv/HTpQu7nOSKEk9Y2CTKSkbKgreapqD3W6f6kQ== X-IPAS-Result: =?us-ascii?q?A0HLBwDIretnjyIeaIFagl6BP1soGQFjWgkqBwhIhFWDT?= =?us-ascii?q?44jkUqKdoJ7AxgWIxQBAwENLgEFDQECBAEBAwECAYUAAosoAh8GAQQ0EwECB?= =?us-ascii?q?AEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAQEBOQVJhXsNSQEBB?= =?us-ascii?q?AsBgWpRUx5lCQYBAQEBAQEBAQECAQEBIgEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQECCwEBAjEEDFsJChMBATgYIwMUAQYDA?= =?us-ascii?q?hEBNQMBEwESGgGCD1gBgmQDBQwGkVibS3qBMoEBggwBAQaBCD4CAQsCAgMBD?= =?us-ascii?q?gklAdoHgUsaCYFIhW2CSRoBBSVIawKESAmEMycPgVVEZmSBBoE3B2+BUG8LF?= =?us-ascii?q?wEBAQEYgR0HAQFMAQmDJYJpghwXgTuBM1JegQyBbIRLEoIOg0MdHC1GgQ1Rg?= =?us-ascii?q?SmES4FVg1yCcYEzSIJHiTuBR0szLAFVExcLBwVhgQsDKjQxgUV7gj1pSToCD?= =?us-ascii?q?QI1ghskWIImgxKBOoQ+hD6FTYIRggeJJ4RdLU+DTB1AAwttPTcUG6NhJSI1A?= =?us-ascii?q?TqDdgcHOB02DAgBBiIFARMWAi8gAQgONTUKDhAMGxMLOpJpFgUnnV+TVIEKN?= =?us-ascii?q?AeEHoFdBgyJBYEklX2EA4FXpBdmIphcIoI2hyaBJQlggXmIdYwlPAIRDYU4g?= =?us-ascii?q?X4jPA1iHgwHMxowQ4IzAQEBMQkJAQwwHA+PTwEHa3teEIEuIoEEgXQ7gV9ES?= =?us-ascii?q?sF7QTUCAQE4AgcBCgEBAwmFYgEBZ4IdgheEaTSBSwEB?= IronPort-PHdr: A9a23:8vAddxd3W/DHfU0G7MbgiBqtlGM+M9HLVj580XLHo4xHfqnrxZn+J kuXvawr0ASTG92DoKsU0baP+4nbGkU+or+580o+OKRWUBEEjchE1ycBO+WiTXPBEfjxciYhF 95DXlI2t1uyMExSBdqsLwaK+i764jEdAAjwOhRoLerpBIHSk9631+ev8JHPfglEnjWwbL1sI BmssQndqsYajZZhJ6ovxRbFv2ZDdvhLy29vOV+ckBHw69uq8pJk7ypepe8q+dRaUaX9caQ4T LhYAyojPmso+sDltgTNQBWW6HcEXWoYjhRHAw7e7BHnRZjxqTf1tvB82CaBI8L7S60/VCm44 KdqTB/ojzoHNyI8/WrKhMF8kL5XrRS8rBN43oDUfZqVNOJgcazBYdMUS21BXsNLWCxABIO3c o8DAuUFMOpdqYT2ulkAogakBQS0BO3h1CJGiHH106I1z+ssChvJ0BA6Et8UrHjYsNf4OaEPW u611qnIyjDDYutK1Df58ofIdA0qr+yQUrJwdMrRyFUvFx/YhViXs4PlOyma1uIXv2iA8+VgV eevi287qwFtuTWv3sAsio3Jh4IJ1F/L6SV5wIA0Jd2hVU50f8SoEJxKtyGVLoZ7RN4pTG50t igg0LIGpYK7czYQyJQh3xPTd/OKfomK7x79SeqcIyt0iG97db+xhhu8/kitxvD4W8e0zVtHr DRJn9jQunwR1hHf9tSLR/9y80mvxTuC1Q/e5+dZKk46kqrbLoQuwr82lpcLqUTMADP2mETqj KCIbkUk/e2o6+H5bbn8oJ+TKZN0hhn5MqsygMO/BOA4PhIJX2iB9uSwzLLj/UzlQLVKk/05i bPVv4zdJcQevqK5DA5V0pon6xmlFDiqytUYnX4fIFJKeRKHk4zpNEvVL/ziEfi/hFGsnC9rx //cIrLhAZDNIWXZnLfgerZx81VcyAopwtFf4ZJbFL8BIPbtVU/tqNPYDgE2Mxauz+bgEtV92 ZsSWWGLAq+YKKPSqkGH6vgzI+aSeIAVuC7xJOM/6P/vk3A5nUURcrK03ZsWbHC3A+xqI0qYY XrwgtcBDHwFshA/TOztkFGNTD9TZ22uUKI7/DE0FZiqDYjMRoy1m7OBxyS7H51Mam9cElCMC W/keJ6fW/cPaCOeONRhkjsYWrigUYAh0QmitQ79y7pgK+rY4DAYtYn72Nh64O3Tkh4y9ThqA MiHz26NSGR0knsPRzAqxq9/pEh9xk2Z3ah/mfxYGsRf6OhTXQcmLp7cyPJ6B8ruVQLGe9eFU EqmTc+8ATEwU90+3cQOb1xhFNWlixDPxzCqA7gOmLyWHpw46L7T33/2J8Zl03rG1a8hj0MnQ sRVL2GmiLR/+g7ODIDKi0WUj7umeboY0SLX6WuP0WWDsFtWXQJsS6nIU38SalPLodn3+0/OV aGiBLQoPwdb18KON7FGZsPmgFhCQvroJcrTY2asm2erGRaH2KmMYpfre2QcwirQEFQIngYO9 nicLwc+HD2uo2fGATxuC13vZ0Ts/PF7qHK0U0M41RmKb0pl17u15h4am+CTS/MV3rIFoScht it7EEy639LMBNqMvwthfKNCbtMh+FpLyHzVughnMpC9M6xviUQSfgprs0/02Rh6BZ1Mkc0wo 3MryApyJ7iY0FREdz6AwJ7+JqDZJnXq8Ryyaq/b2lHf3c6W9akR8Pk4s1LjvAWpF0o+7Xpoz 9lV032d5pXTEQodT4j9UkEt9xh1v7zVeC096JnS1XF2Kqm7rj/C29coBOs51hatZMxQMKSZF A/0D8IVGdOuJPYvm1WmYRMIJudS9LQ7P8++cfuJw7akPPx8kzK+kWRH/Id931qR+yZkUO7Hw 44Fw+2E3guATzrzkE2ussXzmYxdYTESH3G/yTT/CY5KZqxyeJ4LBn20L822wNV+nZ/tVGRC+ F6tHVNVkPOuLFCWcFq3lVlUykI/pWOh3y2102ow2zogq67a2C3V38zjcgAGMyhFXjpMl1Dpd KGwhtZSZ0Ooagk1iFPx7ELzwe5Ar6R6LnXPaV9PeznqImpiVKqpq7fEZNRAvsB7+R5LWfixN AjJAoX2pAEXhn+yd4M/7DUydjXx/478gwQ/k2WFanB6sHvef8h0gxbZ/t3VA/BLjXIdXCctr z7RCxCnOsWxu82OnsLKtum4EXmqVphSbTXD1YSEpTe27m1sAASikra0gNK0WRMi33rD3sJxH T7NsA66Z4Dq06qgNucyRXNTXAql+ZdrT75Cx5M3gIAM1HMagJSM4HdBln38ZNxf0KS4d3ENQ D8X3/bf5xXj00B4aHfV18T+THrOitB5aYyCa3gNkjk489gMCKqQ6+lcmjBpp1OjsQ/LSf1tx 3EFzv8/9HMRg+cIoRcgiCKHDdj+BGF+Oirh31SN5tG69+BMYXq3NKO3zAx4lMygC7eLpkddX mz4c9EsB3046MI3K1/K3HDpj+OsMNDNcdIesAGVmBbcnqBULpw2jP8DmStgPyr0o3Qkz+cxi REm04u9ucCLLGBk/aTxBRA9VHW9bsca/Hf2hqZbn9qK95ioGoR9Fz4LWprxUP/uFygd9LzmO wuIDDwguyKDA7OMeG3XoExirn/JD9WqLyTOfihflI0+AkLFYhcD02V2FH0gk5U0Fx6n3pnke UZ9vXUK40Lg7wBL0qRuPgX+VWHWoEGpbC01Qd6RNkkzjEkK6kHLPMiZ9u82ETtf+8jrlza2c jnCdVlZWF41D1SDA0H/M7Ku49jZ7uXeAfCxevLKaLPIsudeUvaU2bql1ZZg9DuXcMDTLj9lF fJxiS8hFThpXt/UnTkCUXldnibEaYiArxe5+zFrhti49OX3VQnv44qWFrYUNs9gsUPT4+/LJ 6ubgyB3Lixd35UHyCrTybQR61UVjjlnazinFbloWTfldKvLgecXChcab3g2L85U9+cn2RELP 8fHi9Tz37o+j/gvCl4DW0az0s2uYMULJSm6OjalTA6wDo/ecGTZntCiXp/pUbpUnflZvB22u C+GHgnkJDvWnj3gUVa0OuFJjT2HFBZZpYe2fw0rDDTzCtX8ZXjZeJd7gCY3zrs9mn7RfTdGY H4lKx8L9eXWtn8Qi+43A2Fb63t5MeSI0z2U6eXVMNdz07MjAyh5kf5b/GVvzrJU6C9eQ/km0 CDWr9NovxSnirzWkGshCUIS7G0TwtnX7iAAce3D+5JNWGjJ5kcI5GSUUFERosd9T8boo+ZWw 8TOk6T6LHFD9cjV9I0SHZuxSorPPXw/PB7uADORAhECSGvhDlvk3xkEgqyDo0Kp+4A9ronwl ZEOTL5CSVFzEekVX01hFdpEO5x3WzI4jZaRi9MO7nel6hyNVINdpJ+NBZfwSb3/bS2Ui7VJf U5C+onDddFKJNDqjnNeP0F9mJXWFkHQW9FUvyAnaRU79UxJ+X44VWYz3kP5diun52IVHvOv2 Btqmk15e+tnp1KOqx8nY1HNoiU3ikw4n97o1CuQfDDGJ6C1RYhKCiDwuht5ItbhTg1ydwH3g V18OWKOWedKl7U5PzMO6keUqd5VFPVbV6EBfBIA2aTdeaAzyVoF4mam3RMVvLGUT8I6yE1xK dj38zoD2ho/PodvdOqJfPYPlQAW3f/r3GfgleEpnF1PfgBUqjrUJnRO4RRXfvonP3T6pLQ0s F7ewjcbKmFeCPMn/6A4qE9ia7bblEeCm/YAK1jvZbbHd/rL5zHMzZzREAJs2k5axRYeo7Qkj pt8KwLRXkQrhtN9DjwxPNHZYUFQZstWrz3IeDqW9P7K2dRzNpm8EebhSamPsrwViwSqBlRhE 4MJ58UHVp6itSOQZd/gN6IAwA4x6R7DIUXcSuxOfAOXnTwHpcCm0ZIx2pNSbj0QGmRyNyyr6 62f/1V7xqPbAJFtOjFBAsMNLRdUEIWiljRcvmhcATX/ye8fxAWYrnf9qinWEDjgfo9jafOTN ltnDNC7/yl68rDj0ASGtMyGeyehbZI55oyqi6tSvZuMBvJKQKMotk7dn9IdXHm2SyvUFsbzI ZHsao4qZNiyC3CgU1X5hShmKqW5dNurMKWMhhnlAIhOt4zOlgsZDpfoTyNDCkJPm7Qb46Zte QAIY5w6eAPl8QMkOPm2JA6elM6lQ2OsNSd+Rf5Cy+63fPpSkzpqafW1gihFLNly36ys/EgBS YtfxAnZ3uqmbpJCXDLbH2wEPR3IoTslmmNhMOcr3+p5xwnH+wp5UXjDZKlib2pKuMs5DFWZL CBtC2Y2cFSbiJLK/g+m271BtzsYhdtf1vdJ9WTvppKKKiz5Q7Sl8N+G1khoJchjuaB6NpbvZ 9eLpI+L1CKKV4He60WMGGuzE/4Q8jC/CChfXf9DlHpjPJAW/41b5hhoPi/bD6RIDLgwq7uqb zt9ECNUyjUWBdvoNN0qh/flnaPdkgaMfZ8iNh0drZgEhcESAXceXw== IronPort-Data: A9a23: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 vRAI5TzOahdFH1s5Q== IronPort-HdrOrdr: A9a23:CxhQDqF6wFlDC4NlpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:5/I0nGzkCyhDl0N3fwILBgUrA9IVVULj7kvReVeoFkZOdYDWdgGfrfY= X-Talos-MUID: 9a23:03CE3QWO2dXcZcnq/AS03Sh5Kt5Y2vvtNUwzt58Mns7fLAUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.14,293,1736809200"; d="scan'208,217";a="113127160" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDGytowtXHswriMkRmxLUwA76/rMNHthEKQRco?= =?us-ascii?q?sqqBRoQ4iZWs2mbRGt52G+BQNofYY+/6X9+aSAR8ptyoER8hipbJNcgE?= =?us-ascii?q?Uc4TByo1uTdPfbq8ib8ymiJkoZ4BKz5WWv9Jz2p8E3sPC33arCnje86q?= =?us-ascii?q?nLpwe7D3JkleI1EIRt+RUmqg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Apr 2025 11:12:38 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 60423564EFD; Tue, 1 Apr 2025 11:12:36 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1743498756; bh=GL6Z89fyrqVaEpzXS2oWMSheat9NHd8DA4i1X71jrHk=; h=From:To:Subject:Date:Message-ID; b=YGPNMKMNfegYg9JdGEmTU13NY7NqihWd1GmWt5COMEKonVUuz7ALKOl6AUwuIDits JaRDwGss47y/hjOohL87yMCeLfeTZ+4PvoMYdhT4vjB2d3F0aIRGxPc6Y3dG9w6v0+ HrEKgxWhivXspjSs3zBJZvNQ233mYnhm+tXTgsLM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 01 Apr 2025 11:12:34 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 1 11:12:37 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.496085, queueID=10105565067 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19288 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 25 to April 01, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 MlFront_ZipFile - High-level API for zip files MlFront_Cache - Transient caches + slowly varying data New lesson on polymorphic variants The OBazl Toolsuite 3.0.0.beta.1 Dune dev meeting Other OCaml News Old CWN MlFront_ZipFile - High-level API for zip files =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am happy to announce that `MlFront_ZipFile.2.3.0', a package that can do basic zip/unzip operations on a zip file, was released today. It is available on opam with `opam update' and `opam install MlFront_ZipFile'. There are other opam packages for zip files, and often those are more appropriate. `MlFront_ZipFile' is different because: =E2=80=A2 It is very high-level. I wanted an API to unzip and zip, with a simple observer API for unzipping so I could attach @CraigFe's excellent [`progress'] bar library. =E2=80=A2 It can unzip 4GB files in a 32-bit OCaml runtime. =E2=80=A2 It has a permissive license. =E2=80=A2 It is not thread-safe (except unzipping). =E2=80=A2 It fully embeds the C code. That means it works on Windows and should work under cross-compilation without needing a non-portable/non-reproducible `pkg-config' installation. =E2=80=A2 It has a binary `mlfront-zip' which can do glob-based exclusion= s (a feature not present in the typical InfoZip `/usr/bin/zip' that comes with Unix or PowerShell `Compress-Archive' on Windows). macOS, Windows and Linux have prebuilt binaries. Here are the relevant links: =E2=80=A2 Docs: [https://dkml.gitlab.io/build-tools/MlFront/MlFront_ZipFile/MlFront_Zip= File/index.html] =E2=80=A2 `mlfront-zip' binaries: [https://gitlab.com/dkml/build-tools/MlFront/-/releases/2.3.0-8] =E2=80=A2 homepage: Sidenote: The docs won't be available on ocaml.org. Use the doc links above until I figure out a technical solution (very low-priority). [`progress'] [https://dkml.gitlab.io/build-tools/MlFront/MlFront_ZipFile/MlFront_ZipFile= /index.html] [https://gitlab.com/dkml/build-tools/MlFront/-/releases/2.3.0-8] MlFront_Cache - Transient caches + slowly varying data =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am happy to announce that `MlFront_Cache.2.3.0', a framework for transient caches and slowly varying data, was released today. It is available on opam with `opam update' and `opam install MlFront_Cache'. MlFront_Cache lets you cache files and directories, all backed in a local sqlite3 database. It is a bit esoteric. I use it for: 1. Transient caches when downloading zip files. 2. Immutable installs for DkCoder. A related use case is covered in detail in the docs as "Downloading datasets". Treat this as an alpha release with a somewhat unstable API. In particular, I haven't implemented cache eviction yet. Here are the relevant links: =E2=80=A2 Docs: [https://dkml.gitlab.io/build-tools/MlFront/MlFront_Cache/MlFront_Cache= /index.html] =E2=80=A2 homepage: Sidenote: The docs won't be available on ocaml.org. Use the doc links above until I figure out a technical solution (very low-priority). [https://dkml.gitlab.io/build-tools/MlFront/MlFront_Cache/MlFront_Cache/ind= ex.html] New lesson on polymorphic variants =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Jakub Svec announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Hello, I wrote a new lesson on polymorphic variants. You can find it [here]. I appreciate any feedback you may have. I expect that if there is interest in including a lesson on polymorphic variants that there will likely be several rounds of refinement. Sources: =E2=80=A2 =E2=80=A2 =E2=80=A2 =E2=80=A2 This lesson is about 800 lines long (about 1100 with line length limited to 85 columns). This makes this lesson on the longer side when compared to other lessons on OCaml.org. Therefore, this is the first of 2 lessons on polymorphic variants. This lesson (lesson 1) introduces the concepts behind polymorphic variants (such as row polymorphism and structural typing), then discusses common syntactic structures of polymorphic variants. It teaches these concepts in a bottom-up direction. It is my subjective belief (held lightly) that introducing polymorphic variants in a top-down direction leads to more complexity and confusion. Lesson 2, which is forthcoming, introduces common usecases for polymorphic variants through real-world examples. Any feedback a reviewer is willing to provide is greatly appreciated. The author is particularly interested in ensuring accuracy and validity of examples and consistency in the language with OCaml.org's other materials, but all feedback is welcome. [here] The OBazl Toolsuite 3.0.0.beta.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Gregg Reynolds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The OBazl Toolsuite 3.0.0.beta.1 is now available. The OBazl Toolsuite is a collection of rules & tools that support OCaml development using [Bazel]. To get started: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ git clone https://github.com/obazl/demo_hello.git =E2=94=82 $ cd demo_hello =E2=94=82 $ bazel run bin:greetings =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 See [The OBazl Book] for more guidance. Tested on MacOS and Linux (Ubuntu). This version contains many improvements: =E2=80=A2 Improved toolchain support. Select a compiler by passing e.g. `--tc=3Docamlc'. =E2=80=A2 Seamless opam dependencies. The previous version required a preprocessing step (running `bazel run @coswitch'); this is no longer necessary. =E2=80=A2 Fine-grained dependencies. Depend directly on any module, wheth= er it is in a library or not, and whether it is namespaced (~~wrapped'') or not. =E2=80=A2 Context-sensitive archiving. Archives are for distribution; int= ernal dependencies do not need them. The `ocaml_library' rule will only construct an archive on demand. By default, an internal dependency on an `ocaml_library' target will not request archiving. This can be overridden. =E2=80=A2 Several examples of OBazl extensions: rules_ppx, rules_cppo, rules_ctypes, rules_menhir. These demonstrate the relative ease with which tools can be integrated into the Bazel environment. =E2=80=A2 A new tool, `bazel run @obazl//new' that generates a project fr= om a template. =E2=80=A2 Direct support for the tools in the standard SDK (ocamldebug, ocamlobjinfo, etc.) and for a subset of the OCaml Platform tools. For example: =E2=80=A3 `$ bazel run @opam -- list' =E2=80=A3 `$ bazel run @ocaml' =E2=80=A3 `$ bazel run @utop' =E2=80=A3 `$ bazel run @dbg --@dbg//pgm=3Dsrc:greetings' OBazl ensures that these commands will be invoked under the correct switch, with correct paths (CAML_LD_LIBRARY_PATH etc.), insulated from environment variables. Other tools are invoked by passing an option to an ordinary build command. For example: =E2=80=A2 `$ bazel build lib/hello:Hello --modinfo' # runs ocamlobjinfo o= n the .cmo/.cmx output =E2=80=A2 `$ bazel build lib/hello:Hello --siginfo' # runs ocamlobjinfo o= n the .cmi output =E2=80=A2 `$ bazel build lib/hello:libFoo --archinfo' # runs ocamlobjinfo= on the .cma/.cmxa output =E2=80=A2 `$ bazel build lib/hello:Hello --gensig' # runs `ocamlopt -i' o= n the .ml file to generate inteface code. The documentation at [The OBazl Book] has been updated. It remains far from complete but it should be useful. In particular the [OBazl Guide] and the [`rules_ocaml' Reference Manual]. What's missing? =E2=80=A2 Support for opam publishing. I have successfully published an = OBazl (Bazel) project to an opam switch, and used it in a dune-only project, but the code is still under development so I don't have a demo. =E2=80=A2 Support for `odoc', `ocamlformat', and linting. Currently under development. =E2=80=A2 Windows support. The code is designed for portability but it w= ill probably be a while before I can get to Windows. =E2=80=A2 Automatic generation of BUILD.bazel files. I have a tool for th= is but it is outdated. Bringing it up-to-date is a high priority. Support: =E2=80=A2 [discord] =E2=80=A2 [@obazl.bsky.social] Cheers! Gregg [Bazel] [The OBazl Book] [OBazl Guide] [`rules_ocaml' Reference Manual] [discord] [@obazl.bsky.social] Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello :waving_hand: The next Dune Dev Meeting will be on *Wednesday, April, 2nd at 9:00 CET*. This is going to be a one-hour-long meeting. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are welcome to join: these discussions are opened! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize with the Dune developers :+1: The agenda is available on the [meeting dedicated page]. Feel free to add more items in it. =E2=80=A2 Meeting link: [zoom] =E2=80=A2 Calendar event: [google calendar] =E2=80=A2 Wiki with information and previous notes: [dune wiki on GitHub] [meeting dedicated page] [zoom] [google calendar] [dune wiki on GitHub] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Why F#?] =E2=80=A2 [ FOSDEM 2025: Report from the Friendly Functional Languages BOF Room] =E2=80=A2 [Pushing the opam-repository into a sustainable repository] =E2=80=A2 [=CE=BCTCP, Miou and unikernels] [the ocaml.org blog] [Why F#?] [ FOSDEM 2025: Report from the Friendly Functional Languages BOF Room] [Pushing the opam-repository into a sustainable repository] [=CE=BCTCP, Miou and unikernels] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 25 to April 01,= 2025.

    MlFront_ZipFile - High-level API for zip files

    jbeckford announced

    I am happy to announce that MlFront_ZipFile.2.3.0, a package t= hat can do basic zip/unzip operations on a zip file, was released today. It= is available on opam with opam update and opam install = MlFront_ZipFile.

    There are other opam packages for zip files, and often those are more appro= priate. MlFront_ZipFile is different because:

    • It is very high-level. I wanted an API to unzip and zip, with a simple = observer API for unzipping so I could attach @CraigFe's excellent progress bar library.
    • It can unzip 4GB files in a 32-bit OCaml runtime.
    • It has a permissive license.
    • It is not thread-safe (except unzipping).
    • It fully embeds the C code. That means it works on Windows and should w= ork under cross-compilation without needing a non-portable/non-reproducible= pkg-config installation.
    • It has a binary mlfront-zip which can do glob-based exclus= ions (a feature not present in the typical InfoZip /usr/bin/zip that comes with Unix or PowerShell Compress-Archive on Windo= ws). macOS, Windows and Linux have prebuilt binaries.

    Here are the relevant links:

    Sidenote: The docs won't be available on ocaml.org. Use the doc links above= until I figure out a technical solution (very low-priority).

    MlFront_Cache - Transient caches + slowly varying data

    jbeckford announced

    I am happy to announce that MlFront_Cache.2.3.0, a framework f= or transient caches and slowly varying data, was released today. It is avai= lable on opam with opam update and opam install MlFront_= Cache.

    MlFront_Cache lets you cache files and directories, all backed in a local s= qlite3 database. It is a bit esoteric. I use it for:

    1. Transient caches when downloading zip files.
    2. Immutable installs for DkCoder. A related use case is covered in detail= in the docs as "Downloading datasets".

    Treat this as an alpha release with a somewhat unstable API. In particular,= I haven't implemented cache eviction yet.

    Here are the relevant links:

    Sidenote: The docs won't be available on ocaml.org. Use the doc links above= until I figure out a technical solution (very low-priority).

    New lesson on polymorphic variants

    Jakub Svec announced

    Hello,

    I wrote a new lesson on polymorphic variants.

    You can find it here.

    I appreciate any feedback you may have. I expect that if there is interest = in including a lesson on polymorphic variants that there will likely be sev= eral rounds of refinement.

    Sources:

    This lesson is about 800 lines long (about 1100 with line length limited to= 85 columns). This makes this lesson on the longer side when compared to ot= her lessons on OCaml.org. Therefore, this is the first of 2 lessons on poly= morphic variants.

    This lesson (lesson 1) introduces the concepts behind polymorphic variants = (such as row polymorphism and structural typing), then discusses common syn= tactic structures of polymorphic variants. It teaches these concepts in a b= ottom-up direction. It is my subjective belief (held lightly) that introduc= ing polymorphic variants in a top-down direction leads to more complexity a= nd confusion.

    Lesson 2, which is forthcoming, introduces common usecases for polymorphic = variants through real-world examples.

    Any feedback a reviewer is willing to provide is greatly appreciated. The a= uthor is particularly interested in ensuring accuracy and validity of examp= les and consistency in the language with OCaml.org's other materials, but a= ll feedback is welcome.

    The OBazl Toolsuite 3.0.0.beta.1

    Gregg Reynolds announced

    The OBazl Toolsuite 3.0.0.beta.1 is now available.=20

    The OBazl Toolsuite is a collection of rules & tools that support OCaml= development using Bazel. To get start= ed:

    $ git clone https://github.com/obazl/demo_hello.git
    $ cd demo_hello
    $ bazel run bin:greetings
    

    See The OBazl Book for = more guidance.

    Tested on MacOS and Linux (Ubuntu).

    This version contains many improvements:

    • Improved toolchain support. Select a compiler by passing e.g. --t= c=3Docamlc.
    • Seamless opam dependencies. The previous version required a preprocess= ing step (running bazel run @coswitch); this is no longer nece= ssary.
    • Fine-grained dependencies. Depend directly on any module, whether it is= in a library or not, and whether it is namespaced (~~wrapped'') or not.
    • Context-sensitive archiving. Archives are for distribution; internal de= pendencies do not need them. The ocaml_library rule will only= construct an archive on demand. By default, an internal dependency on an <= code>ocaml_library target will not request archiving. This can be ov= erridden.
    • Several examples of OBazl extensions: rules_ppx, rules_cppo, rules_ctyp= es, rules_menhir. These demonstrate the relative ease with which tools can= be integrated into the Bazel environment.
    • A new tool, bazel run @obazl//new that generates a project= from a template.
    • Direct support for the tools in the standard SDK (ocamldebug, ocamlobji= nfo, etc.) and for a subset of the OCaml Platform tools. For example:
      • $ bazel run @opam -- list
      • $ bazel run @ocaml
      • $ bazel run @utop
      • $ bazel run @dbg --@dbg//pgm=3Dsrc:greetings

    OBazl ensures that these commands will be invoked under the correct switch, with correct paths (CAML_LD_LIBRARY_PATH etc.), insulated = from environment variables.

    Other tools are invoked by passing an option to an ordinary build command. = For example:

    • $ bazel build lib/hello:Hello --modinfo # runs ocamlobjinf= o on the .cmo/.cmx output
    • $ bazel build lib/hello:Hello --siginfo # runs ocamlobjinf= o on the .cmi output
    • $ bazel build lib/hello:libFoo --archinfo # runs ocamlobji= nfo on the .cma/.cmxa output
    • $ bazel build lib/hello:Hello --gensig # runs ocamlo= pt -i on the .ml file to generate inteface code.

    The documentation at The OB= azl Book has been updated. It remains far from complete but it should = be useful. In particular the OBazl Guide and the rules_ocaml Reference Manual.

    What's missing?

    • Support for opam publishing. I have successfully published an OBazl (B= azel) project to an opam switch, and used it in a dune-only project, but th= e code is still under development so I don't have a demo.
    • Support for odoc, ocamlformat, and linting. = Currently under development.
    • Windows support. The code is designed for portability but it will prob= ably be a while before I can get to Windows.
    • Automatic generation of BUILD.bazel files. I have a tool for this but i= t is outdated. Bringing it up-to-date is a high priority.

    Support:

    Cheers!

    Gregg

    Dune dev meeting

    Etienne Marais announced

    Hello :waving_hand:=20 The next Dune Dev Meeting will be on Wednesday, April, 2nd at 9:00 CET. This is going to be a one-hour-long meeting.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers :+1:

    The agenda is available on the meeting dedicated page. Feel free to add more= items in it.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=KGx3Q6iX; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=jvlsZdkd; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 56CD6400A7 for ; Tue, 8 Apr 2025 13:14:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=yrTXGniLFkFUD+uGkvH6WuIHo4VNamkIlyLhCzx3+HI=; b=KGx3Q6iX62t/TyH2PvJBPs9MM7r+t5HKIwY03MApPfCyj9PbXKX4rhhO kG8AnUNKPn0wMsJd6eOW5wzR3vteGTyldT99HX4PpPLyhHDYTKSqAP4DU vn91UvrRM16YDppQTpLjJPj5b22Q/ZUXnAL3JBG8Mmk+xVFVGh1ejiz5n Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,198,1739833200"; d="scan'208,217";a="216923507" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Apr 2025 15:14:26 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 9D4C5E0261; Tue, 8 Apr 2025 15:14:25 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6845DE007A for ; Tue, 8 Apr 2025 15:14:21 +0200 (CEST) IronPort-SDR: 67f5212b_CpkVNQpoNxFK6IDzNTRhtGxtbN2+sEonucw3KsVPj50ey7p ZHBPE7xkK9kbbcLxQkXoeeGLiujaO3ROuEQ8bTQ== X-IPAS-Result: =?us-ascii?q?A0EcEAA1IPVnhSIeaIFSCIJegT9bKBkBY1ozBwhIA16Dd?= =?us-ascii?q?INPjiOBFpA0inaBaoERAxgWBR4UAQMBDS4BDgQBAgQBAQMBAgGCDIJ0AospA?= =?us-ascii?q?h8GAQQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAUBJh?= =?us-ascii?q?XsNSQEBAQECAQYEgWstJFMeYQQDBgYBAQEBAQEBAQEBAQEBASIBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBAjULQBwBC?= =?us-ascii?q?AQGEwEBKw0YIwMUAQYDAhEBNQMBEwESFAUBgmgBgh9FAwUMBpNhm0t6fzOBA?= =?us-ascii?q?YIMAQEGgQg+AgECCQICAwEOCSUB2geBZQmBSIVtgkkaASpIawKESAmEMycPg?= =?us-ascii?q?VVEZi81gXNKB2+BUG8LFwEBAQEBF0ICSAQOAQUBAQYCBj8JGIMNgmmCGhdFP?= =?us-ascii?q?xQfgQqBImWBJYELgXOEQYFVgTqCI4JvgTNIgj+ICYFHSzMsAVUTFwsHBWGBC?= =?us-ascii?q?wMqNDFzOB2BfIN0hTiCEYIEiReEVy1Pg3AdQAMLbT03FBuXPh4iGoMYCREVD?= =?us-ascii?q?j4BARUnGwkCBA4GBwcFARMIDgEBIg0hBwEOKwgCAgMPBREIDQUJASIUEgEJA?= =?us-ascii?q?gsCHBEDkkAUJQMFJQIBdI5WjhSTE0EdbTQHhB6BXQYMiQWBJJV9hAOBV4U9h?= =?us-ascii?q?XWYZWYilXyCIj4igjaHJoElCWCBD2qIdYwlECwCEQ0DhTWBUS0jPA1iAQEZA?= =?us-ascii?q?wwHMxowQw0CBAiCGAEBATEJCjwcD1aJR4UyAQiCQxCBLoEmgTs5O8NRA0E1A?= =?us-ascii?q?gEBDykCBwEKAQEDCYViAQGBToE2gheEagEmBwWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 vlALkXS3Hi4FX0= IronPort-HdrOrdr: A9a23:F+5hxKotgGia852tQC2/AHcaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:2087sGPc7FGuVO5DRyxVzxQ1CJ8fd3Tj62vTERSqJVcucejA X-Talos-MUID: 9a23:C2knQwpNfnuzvajbkWwez2ppF+pMyIr1MV8Qt5pXhuygMSxTJA7I2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,198,1739833200"; d="scan'208,217";a="113754784" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHf7i1NvofkXh0dms3nSCIrX0A6pIeauC0RyH?= =?us-ascii?q?dtWjMh2pBd79fuA0XDUb68CIOs+C+Q9G/VZL5cfNpF6zJfGe7NLA8ZC3?= =?us-ascii?q?ppc6wlPvD2etJIxPypcutswxmotQ3WlyCWh1DtkFdJxa3dovZVi6eZvg?= =?us-ascii?q?ABuzjjweVla2lwHSSxQa5srg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Apr 2025 15:14:19 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B9391564A8C; Tue, 8 Apr 2025 15:14:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1744118057; bh=ck3rh6dsl07hA6BVnlfRYPnS61O0zTtiMo8B6UqGSLc=; h=From:To:Subject:Date:Message-ID; b=jvlsZdkd8XByLLIGlwh7FMdV1iB6WLx1kYINaRRu/Ktc5G4kTJJpux9b+QIPSspPf WDiFbxEz3lvpCSlHwBSqVJlPQ54g13+9CRXaVDHygPG7WhEn/KBc0vF3jqhmRRxeV8 ymy7cpyqbMFdwVXXGVFwE+8siFC6A6thkcAkcnRQ= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 08 Apr 2025 15:14:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 8 15:14:18 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.374244, queueID=0AD5D564A8D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19291 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 01 to 08, 2025. Please note that some entries were posted on April 1st. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Ocsigen public meeting Roguetype Ppx_untype: An end to type errors in OCaml Second of Two Lessons on Polymorphic Variants: Practical Usecases Caqti 2.2.4 Release and Plans update for the magick-core-7 gegl-0.4 _ Dune 3.18 QCheck 0.24 checked_oint v0.5.0: Safe integer arithmetic for OCaml Outreachy December 2024 Round OUPS meetup april 2025 Other OCaml News Old CWN Ocsigen public meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: William Caldwell announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi all! The Ocsigen team is organising a public meeting in which we'll be discussing the migration from Lwt to effect-based concurrency, updates about work in progress (wasm_of_ocaml, Ocsigen-i18n, =E2=80=A6). We welcome user suggestions & questions, please join us Monday the 14th of April at 1pm (France/GMT+2) at the following link: Roguetype =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Have you ever felt pained by the lack of GADTs and high-arity functors when playing games? Have you ever wondered if you could play games without being weighted by a runtime evaluation? Then fear no longer, because in this day it is my pleasure to announce the first release of [Roguetype], the first ever roguelike written in the OCaml type system: =E2=80=A2 Test your mettle against the OCaml typechecker and the 8 levels= of `roguetype'. =E2=80=A2 Explore functors, mountains, and forests to discover hidden pat= hs. =E2=80=A2 Vanquish goblins and dragon(s), upgrade your equipment, while b= eing sure that your travel is well-typed by construction. =E2=80=A2 And maybe, at the end of your adventure, you shall prove that t= he victory type is inhabited [Roguetype] Ppx_untype: An end to type errors in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello dear people reading this! Today, I am overly excited to announce one of the greatest and simplest tool, that will fix the biggest of all OCaml flaws. Consider Javascript: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ node =E2=94=82 Welcome to Node.js v22.14.0. =E2=94=82 Type ".help" for more information. =E2=94=82 > 1 + 3.5 =E2=94=82 4.5 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Simple and elegant, don't we all agree? Now, the same with OCaml: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ ocaml =E2=94=82 OCaml version 5.3.0 =E2=94=82 Enter #help;; for help. =E2=94=82 # 1 + 3.5 ;; =E2=94=82 Error: The constant 3.5 has type float but an expression was ex= pected of type =E2=94=82 int =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 What does this even mean? The PPX that I lovingly share with you all is `ppx_untype'. It finally fully removes the OCaml type system that has plagued it since its inception. The PPX can be used very simply. Add it to your opam switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam pin add ppx_untype https://github.com/panglesd/ppx_untyp= e.git\#main =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and then add it to your `dune' (or other build system) file: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (... =E2=94=82 (preprocess (pps ppx_untype)) =E2=94=82 ...) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And you can now enjoy OCaml! =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ cat bin.main.ml =E2=94=82 let () =3D print_float (1 + 3.5) =E2=94=82 $ dune exec bin/main.exe =E2=94=82 3.47922429887e-310 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Pros: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 All programs that was working before, still works. =E2=80=A2 Blazingly fast! =E2=80=A2 Finally integers and floats can be added. =E2=80=A2 All warnings are also removed. Cons: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 None (apart from some unexpected behaviour at runtime) Second of Two Lessons on Polymorphic Variants: Practical Usecases =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Jakub Svec announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 This is the second of two lessons on polymorphic variants I've been drafting for potential inclusion in the Lessons section of OCaml.org. You can find the draft second lesson [here]. I appreciate any feedback you may have. The OCaml.org discussion of the first lesson can be found [here]. The goal of the first lesson was to introduce the foundational knowledge for how polymorphic variants work (row polymorphism, structural typing, upper bounds, lower bounds, =E2=80=A6), their benefits= and drawbacks, how they relate to "ordinary" variants, their notation (`\~', `>', `<', `#', =E2=80=A6), and their behavior during type refineme= nt. I am grateful to everyone that provided feedback on the first lesson. I incorporated most of the feedback into the lesson already, but it is not yet complete. I've held off finalizing the first lesson until this second lesson receives feedback, since there may be significant structural changes to the first lesson depending on the feedback received on this second part. The objective of this second lesson is to demonstrate practical usecases for polymorphic variants. Presently, it demonstrates seven practical usecases of polymorphic variants, along with "ordinary" variant equivalents for comparison. The seven usecases were sourced from: =E2=80=A2 Jacques Garrigue's [1998 paper] =E2=80=A2 [This discussion] board on OCaml.org Please consider this a rough draft. It does not include an indroduction and conclusion, and every example has minimal narrative supporting it. The goal is to solicit feedback on the *selected examples*, the *structure of the examples*, and to solicit *additional examples* if these are insufficient. If you have experience with specific usecases for polymorphic variants that you feel would do a better job demonstrating specific usecases or that demonstrate features not presented here, please let me know. If you can supply a concise example with a quick overview I would be grateful. If that does not work with your schedule, I can formulate an example from a description and perhaps a github link if available. For example, none of the usecases demonstrate explicit coercions. That may be a useful example to include, however this was not mentioned in the source material and am unsure how commonly it is employed by OCaml developers. Once this document's examples are locked down, I will consider the following: =E2=80=A2 Which lesson should be introduced first (demonstrations or foundations)? =E2=80=A2 Should the examples in this lesson be extracted into .ml files = for readers to clone like in some other lessons on the site? =E2=80=A2 Should the two lessons be merged? =E2=80=A2 Is the length excessive? =E2=80=A2 Can any content be removed or extracted into a standalone lesso= n? Once that is resolved, I will do a final pass on the lesson(s) and make another request for feedback. Once again, I want to express my gratitude to everyone willing to work through these draft lessons, as well to those willing to provide feedback. Example Usecases: =E2=80=A2 Monomorphic Usecases =E2=80=A2 Overloaded Tags =E2=80=A2 Compose with Result =E2=80=A2 Transitioning from Ordinary to Polymorphic Variants in an API =E2=80=A2 Polymorphic Variants with Phantom Types =E2=80=A2 Functional Reactive Programming with Polymorphic Variants =E2=80=A2 Encoding HTML in Hierarchical Structures [here] [here] [1998 paper] [This discussion] Caqti 2.2.4 Release and Plans =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: "Petter A. Urkedal announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80 The Release =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C I am pleased to announce the release of [Caqti] 2.2.4, after stumbling through a few minor releases starting at 2.2.0. These are the combined release notes since the previous OPAM release, omitting intermediate regressions: [Caqti] =E2=97=8A Improvements =E2=80=A2 The sqlite3 driver now supports the refined error causes (`Caqti_error.cause') for integrity constraint violations. =E2=80=A2 There is now experimental support for Miou ([#117] by Calascibe= tta Romain). =E2=80=A2 Make the pool implementation shared-memory safe. =E2=80=A2 The new library `caqti.template' provides a preview of a interf= ace for creating and working with request templates, with a few new features and, I think, a tidier design. This is not yet suitable for production code, since it will change before the final version. Feedback is welcome. [#117] =E2=97=8A Fixes =E2=80=A2 Fixed a memory leak in the fall-back implementation of the `populate' connection method which affects all except the postgresql drivers. =E2=97=8A Deprecations =E2=80=A2 `Caqti_request.query_id' is deprecated and will be removed. =E2=80=A2 Constructors of `Caqti_type.t' are now fully private and will be moved away and likely defined differently in the next major release. =E2=97=8A Dependency Updates =E2=80=A2 Prepare for upcoming mirage ([#124] by Hannes Mehnert). [#124] Upcoming Work on `caqti.template' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C As mentioned, this library is experimental for now, yet it contains the real implementation of request templates, while the stable API is a backwards compatible wrapper. I already have plans for revising the new API both due to hard requirements and feedback about usability and preferences, esp. for the most commonly used part of the API. =E2=97=8A Dynamic Prepare Policy and Parametric Types One thing I am excited about with the `caqti.template' library is the support for prepared queries for dynamically generated request templates. To motivate this, note that each prepared query retains resources on both the server side and locally, both associated with an open database connection, which can be long-lived. So, if the application generates queries based on e.g. search expressions like `(author:Plato or author:Socrates) and topic:epistemology', which cannot be prepared statically due to the boolean algebra over search terms, then users of the current API must use one-shot (non-prepared) queries to avoid unbounded retention of resources over time. The new API provides a so-called dynamic prepare policy, which uses an LRU cache of prepared queries internally to limit the resource usage while providing a heuristic for re-using common prepared queries. There is, however, a missing piece in order for this to be practically efficient. Type descriptors like `Caqti_type.t2', `Caqti_type.t3', etc. which represent parametrically polymorphic types, are currently generative with respect to the equality used by the LRU cache, meaning that the type expression would need to be lifted out of the function which generates the request template in order to avoid consistent cache-misses. My plan is first to make a major release which moves the concrete type representation away from the public modules, and then revise it to properly encode parametric types. Apart from changing the constructors, this involves adding an extra phantom type parameter, but the parameter will be universally qualified in the type exposed to the public API, so I expect to retain backwards compatibility for typical usage. =E2=97=8A The Main Request Template API and Bring-Your-Own-Paint For most use cases, it is sufficient to be able to construct request templates, which consists of type descriptors and a possibly dialect-dependent query template. Everything needed for this is bundled into the module `Caqti_template.Create'. I may have developed a bit colourblindness after walking around this bikeshed, so let me show you how the current stable API looks like, how the current iteration of the new API looks like. Here is a request template using the stable API: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let select_owner =3D =E2=94=82 let open Caqti_request.Infix in =E2=94=82 let open Caqti_type.Std in =E2=94=82 (string ->? string) =E2=94=82 "SELECT owner FROM bikereg WHERE frameno =3D ?" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In the current iteration of the new API, this looks like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let select_owner =3D =E2=94=82 let open Caqti_template.Create in =E2=94=82 static T.(string -->? string) =E2=94=82 "SELECT owner FROM bikereg WHERE frameno =3D ?" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 What changed? =E2=80=A2 There is now only a single `open'. That can only be good. =E2=80=A2 The type descriptors have been moved under a `T' sub-module. T= his isn't strictly necessary, but I though it was tidier, esp. since there are clashing names (like `int') under a parallel `Q' sub-module which is used for dynamically generated query templates. =E2=80=A2 The arrow was previously the main function, while in the new AP= I it only constructs the type and multiplicity representation (`Caqti_template.Request_type.t'). =E2=80=A2 Instead, the main function now indicates the policy for whether= to use a prepared query and, if so, the life-time of the request template. The options are `direct', `static', and `dynamic' (as explained above). The latter adds verbosity, but I think it is good to be explicit about static life-time, since using it for generated request templates would typically lead to a resource leakage. It's getting late, so I will not write about dynamic and dialect-dependent request templates, but in the current revision, they are constructed with a "general" version of the above functions, `direct_gen', `static_gen', and `dynamic_gen' which takes a function receiving a dialect descriptor and returns a `Caqti_template.Query.t' instead of a string. The stable API used combinator operators for this. update for the magick-core-7 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 An update to use the magick-core-7 is available there: [https://github.com/fccm2/mgk-gen2] If you still want to use the magick-core-6, the previous head is kept here: [https://github.com/fccm2/mgk-gen] The updated version was tested with the magick-core version `7.1.1-44', if you want to compile it, you need about `256M' space left on device. [https://github.com/fccm2/mgk-gen2] [https://github.com/fccm2/mgk-gen] gegl-0.4 _ =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You can now access `gegl-0.4', from your favorite scripting language, and play with its nodes, with: [https://github.com/fccm2/gegl-ocaml] / ([api-doc]) [https://github.com/fccm2/gegl-ocaml] [api-doc] Dune 3.18 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 On the behalf of the dune team, I'm glad to announce the release of dune `3.18.0' :partying_face: This release contains changes to support the new `x-maintenance-intent' field by default. It also contains some changes regarding the cache, about how it handles file permissions. It introduces a new `(format-dune-file ...)' stanza with the intention to formalize the `dune format-dune-file' command as an inside rule. Finally, it includes various bug fixes for Dune. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 Support HaikuOS: don't call `execve' since it's not allowed if = other pthreads have been created. The fact that Haiku can't call `execve' from other threads than the principal thread of a process (a team in haiku jargon), is a discrepancy to POSIX and hence there is a [bug about it]. (@Sylvain78, #10953) =E2=80=A2 Fix flag ordering in generated Merlin configurations (#11503, @voodoos, fixes ocaml/merlin#1900, reported by @vouillon) [bug about it] =E2=97=8A Added =E2=80=A2 Add `(format-dune-file )' action. It provides an alternative to the `dune format-dune-file' command. (#11166, @nojb) =E2=80=A2 Allow the `--prefix' flag when configuring dune with `ocaml configure.ml'. This allows to set the prefix just like `$ dune install --prefix'. (#11172, @rgrinberg) =E2=80=A2 Allow arguments starting with `+' in preprocessing definitions (starting with `(lang dune 3.18)'). (@amonteiro, #11234) =E2=80=A2 Support for opam `(maintenance_intent ...)' in dune-project (#11274, @art-w) =E2=80=A2 Validate opam `maintenance_intent' (#11308, @art-w) =E2=80=A2 Support `not' in package dependencies constraints (#11404, @a= rt-w, reported by @hannesm) =E2=97=8A Changed =E2=80=A2 Warn when failing to discover root due to reads failing. The previous behavior was to abort. (@KoviRobi, #11173) =E2=80=A2 Use shorter path for inline-tests artifacts. (@hhugo, #11307) =E2=80=A2 Allow dash in `dune init' project name (#11402, @art-w, reporte= d by @saroupille) =E2=80=A2 On Windows, under heavy load, file delete operations can someti= mes fail due to AV programs, etc. Guard against it by retrying the operation up to 30x with a 1s waiting gap (#11437, fixes #11425, @MSoegtropIMC) =E2=80=A2 Cache: we now only store the executable permission bit for files (#11541, fixes #11533, @ElectreAAS) =E2=80=A2 Display negative error codes on Windows in hex which is the more customary way to display `NTSTATUS' codes (#11504, @MisterDA) QCheck 0.24 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 FYI, QCheck 0.25 is now available from the opam repository :smiley: The 0.25 release contains a combination of all-round fixes, documentation, and polishing: =E2=80=A2 Restore `Test.make''s `max_fail' parameter which was accidental= ly broken in 0.18 =E2=80=A2 Adjust `stats' computation of average and standard deviation to limit precision loss, print both using scientific notation, and workaround MinGW float printing to also pass expect tests =E2=80=A2 Fix dune snippets missing a language specifier in README.adoc causing `asciidoc' to error =E2=80=A2 Add a note to `QCheck{,2.Gen}.small_int_corners' and `QCheck{,2}.Gen.graft_corners' about internal state, and fix a range of documentation reference warnings =E2=80=A2 Reorganize and polish the `README', rewrite it to use `qcheck-c= ore', and add a `QCheck2' integrated shrinking example =E2=80=A2 Document `QCHECK_MSG_INTERVAL' introduced in 0.20 =E2=80=A2 Add `QCheck{,2}.Gen.map{4,5}' combinators The accompanying `ppx_deriving_qcheck.0.7' release offers: =E2=80=A2 Support `ppxlib.0.36.0' based on the OCaml 5.2 AST Thanks to @Pat-Lafon and @patricoferris for contributing PRs! =F0=9F=8E=89 Happy testing! :smiley: :keyboard: checked_oint v0.5.0: Safe integer arithmetic for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: hirrolot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 I would like to announce [`checked_oint'] v0.5.0, which provides checked integer arithmetic for OCaml. We support both signed and unsigned integers of 8, 16, 32, 64, and 128 bits. Unlike other libraries, `checked_oint' either returns an option or raises an exception when the result of an arithmetic operation cannot be represented in a desired integer type. In addition, it contains abstractions for manipulating arbitrary integers and integer types in a generic and type-safe manner, which I find tremendously useful for compiler/interpreter implementations. Usage example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Checked_oint =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let x =3D U8.of_int_exn 50 in =E2=94=82 let y =3D U8.of_int_exn 70 in =E2=94=82 assert (U8.equal (U8.add_exn x y) (U8.of_int_exn 120)); =E2=94=82 assert (Option.is_none (U8.mul x y)) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The release v0.5.0 introduced crucial functionality for converting between any two integer types in a safe manner =E2=80=93 see [`S.of_gener= ic'] and [`S.of_generic_exn']. [`checked_oint'] [`S.of_generic'] [`S.of_generic_exn'] Outreachy December 2024 Round =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With the [June 2025 round] about to begin, it is time to celebrate the awesome work @abdulaziz.alkurd has been doing on [ocaml-api-watch] mentored by @NathanReb and @panglesd! Please join us on [date=3D2025-04-15 time=3D10:00:00 timezone=3D"UTC"] for the community zoom call where we will get to hear about all of the progress that has been made. Hope to see you there. I'll post a link to the video call closer to the time. For those that can't make it, the meeting will be recorded and uploaded to watch.ocaml.org :two_hump_camel: [June 2025 round] [ocaml-api-watch] OUPS meetup april 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: zapashcanon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 CAUTION: the time has been changed from 7pm to 6:30pm and it will be at ENS Ulm instead of Jussieu The next OUPS meetup will take place on *Thursday, 24th of April* 2025. It will start at *6:30pm* at the *45 rue d'Ulm* in Paris. It will be in the in the *Salle des r=C3=A9sistants* (first floor in the "couloir du carr=C3=A9"). Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. This time we=E2=80=99ll have the following talks: *A translation of OCaml programs from Gospel to Viper =E2=80=93 Charl=C3= =A8ne Gros* Presentation of a translation of OCaml programs specified in Gospel into Viper, an intermediate verification language supporting separation logic. The practical goal is to add a new backend to Cameleer to verify OCaml programs that manipulate the heap. The logical specification of such OCaml programs is described in the Gospel language, and we detail the extensions made to support separation logic in Viper. *Posca: an experimental social network based on Matrix, written in OCaml with melange =E2=80=93 Pierre de Lacroix* TBA After the talks there will be some pizzas offered by the [OCaml Software Foundation] and later on we=E2=80=99ll move to a pub nearby as u= sual. [register on meetup ] [OUPS=E2=80=99 website ] [OCaml Software Foundation] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [What's new with Mollymawk?] =E2=80=A2 [Learning OCaml: Module Aliases] =E2=80=A2 [Learning OCaml: Parsing Data with Scanf] =E2=80=A2 [Learning OCaml: Regular Expressions] =E2=80=A2 [Making OCaml Safe for Performance Engineering] =E2=80=A2 [OCaml in Space: SpaceOS is on a Satellite!] [the ocaml.org blog] [What's new with Mollymawk?] [Learning OCaml: Module Aliases] [Learning OCaml: Parsing Data with Scanf] [Learning OCaml: Regular Expressions] [Making OCaml Safe for Performance Engineering] [OCaml in Space: SpaceOS is on a Satellite!] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 01 to 08, 2025.

    Please note that some entries were posted on April 1st.

    Ocsigen public meeting

    William Caldwell announced

    Hi all!

    The Ocsigen team is organising a public meeting in which we'll be discussin= g the migration from Lwt to effect-based concurrency, updates about work in= progress (wasm_of_ocaml, Ocsigen-i18n, =E2=80=A6).

    We welcome user suggestions & questions, please join us Monday the 14th= of April at 1pm (France/GMT+2) at the following link: https://meet.google.com/zdm-krfj-rcw

    Roguetype

    octachron announced

    Have you ever felt pained by the lack of GADTs and high-arity functors when= playing games? Have you ever wondered if you could play games without being weighted by a = runtime evaluation?

    Then fear no longer, because in this day it is my pleasure to announce the = first release of Rog= uetype, the first ever roguelike written in the OCaml type system:

    • Test your mettle against the OCaml typechecker and the 8 levels of roguetype.
    • Explore functors, mountains, and forests to discover hidden paths.
    • Vanquish goblins and dragon(s), upgrade your equipment, while being sur= e that your travel is well-typed by construction.
    • And maybe, at the end of your adventure, you shall prove that the victo= ry type is inhabited

    Ppx_untype: An end to type errors in OCaml

    Paul-Elliot announced

    Hello dear people reading this!

    Today, I am overly excited to announce one of the greatest and simplest too= l, that will fix the biggest of all OCaml flaws.

    Consider Javascript:

    $ node
    Welcome to Node.js v22.14.0.
    Type ".help" for more information.
    > 1 + 3.5
    4.5
    

    Simple and elegant, don't we all agree?

    Now, the same with OCaml:

    $ ocaml
    OCaml version 5.3.0
    Enter #help;; for help.
    # 1 + 3.5 ;;
    Error: The constant 3.5 has type float but an expression was expected of ty=
    pe
             int
    

    What does this even mean?

    The PPX that I lovingly share with you all is ppx_untype. It f= inally fully removes the OCaml type system that has plagued it since its in= ception.

    The PPX can be used very simply. Add it to your opam switch:

    $ opam pin add ppx_untype https://github.com/panglesd/ppx_untype.git\#main
    

    and then add it to your dune (or other build system) file:

    (...
     (preprocess (pps ppx_untype))
     ...)
    

    And you can now enjoy OCaml!

    $ cat bin.main.ml
    let () =3D print_float (1 + 3.5)
    $ dune exec bin/main.exe
    3.47922429887e-310
    

    Pros:

    • All programs that was working before, still works.
    • Blazingly fast!
    • Finally integers and floats can be added.
    • All warnings are also removed.

    Cons:

    • None (apart from some unexpected behaviour at runtime)

    Second of Two Lessons on Polymorphic Variants: Practical Useca= ses

    Jakub Svec announced

    This is the second of two lessons on polymorphic variants I've been draftin= g for potential inclusion in the Lessons section of OCaml.org.

    You can find the draft second lesson here. I appreciate any feedback you may have.

    The OCaml.org discussion of the first lesson can be found here.

    The goal of the first lesson was to introduce the foundational knowledge fo= r how polymorphic variants work (row polymorphism, structural typing, upper= bounds, lower bounds, …), their benefits and drawbacks, how they re= late to "ordinary" variants, their notation (\~, >, <, #, …), and their behavior duri= ng type refinement.

    I am grateful to everyone that provided feedback on the first lesson. I inc= orporated most of the feedback into the lesson already, but it is not yet c= omplete. I've held off finalizing the first lesson until this second lesson= receives feedback, since there may be significant structural changes to th= e first lesson depending on the feedback received on this second part.

    The objective of this second lesson is to demonstrate practical usecases fo= r polymorphic variants. Presently, it demonstrates seven practical usecases= of polymorphic variants, along with "ordinary" variant equivalents for com= parison.

    The seven usecases were sourced from:

    Please consider this a rough draft. It does not include an indroduction and= conclusion, and every example has minimal narrative supporting it.=20

    The goal is to solicit feedback on the selected examples, the str= ucture of the examples, and to solicit additional examples if these are insufficient.

    If you have experience with specific usecases for polymorphic variants that= you feel would do a better job demonstrating specific usecases or that dem= onstrate features not presented here, please let me know. If you can supply= a concise example with a quick overview I would be grateful. If that does = not work with your schedule, I can formulate an example from a description = and perhaps a github link if available.

    For example, none of the usecases demonstrate explicit coercions. That may = be a useful example to include, however this was not mentioned in the sourc= e material and am unsure how commonly it is employed by OCaml developers.

    Once this document's examples are locked down, I will consider the followin= g:

    • Which lesson should be introduced first (demonstrations or foundations)= ?
    • Should the examples in this lesson be extracted into .ml files for read= ers to clone like in some other lessons on the site?
    • Should the two lessons be merged?
    • Is the length excessive?
    • Can any content be removed or extracted into a standalone lesson?

    Once that is resolved, I will do a final pass on the lesson(s) and make ano= ther request for feedback.

    Once again, I want to express my gratitude to everyone willing to work thro= ugh these draft lessons, as well to those willing to provide feedback.

    Example Usecases:

    • Monomorphic Usecases
    • Overloaded Tags
    • Compose with Result
    • Transitioning from Ordinary to Polymorphic Variants in an API
    • Polymorphic Variants with Phantom Types
    • Functional Reactive Programming with Polymorphic Variants
    • Encoding HTML in Hierarchical Structures

    Caqti 2.2.4 Release and Plans

    "Petter A. Urkedal announced

    The Release

    I am pleased to announce the release of Caqti 2.2.4, after stumbling through a few minor rele= ases starting at 2.2.0. These are the combined release notes since the pre= vious OPAM release, omitting intermediate regressions:

    • Improvements
      • The sqlite3 driver now supports the refined error causes (Caqti_e= rror.cause) for integrity constraint violations.
      • There is now experimental support for Miou (#117 by Calascibetta Romain).
      • Make the pool implementation shared-memory safe.
      • The new library caqti.template provides a preview of a int= erface for creating and working with request templates, with a few new feat= ures and, I think, a tidier design. This is not yet suitable for productio= n code, since it will change before the final version. Feedback is welcome= .
    • Fixes
      • Fixed a memory leak in the fall-back implementation of the popula= te connection method which affects all except the postgresql drivers= .
    • Deprecations
      • Caqti_request.query_id is deprecated and will be removed.<= /li>
      • Constructors of Caqti_type.t are now fully private and wil= l be moved away and likely defined differently in the next major release.
    • Dependency Updates
      • Prepare for upcoming mirage (#124 by Hannes Mehnert).

    Upcoming Work on caqti.template

    As mentioned, this library is experimental for now, yet it contains the rea= l implementation of request templates, while the stable API is a backwards = compatible wrapper. I already have plans for revising the new API both due= to hard requirements and feedback about usability and preferences, esp. fo= r the most commonly used part of the API.

    • Dynamic Prepare Policy and Parametric Types

      One thing I am excited about with the caqti.template library i= s the support for prepared queries for dynamically generated request templa= tes.

      To motivate this, note that each prepared query retains resources on both t= he server side and locally, both associated with an open database connectio= n, which can be long-lived. So, if the application generates queries based= on e.g. search expressions like (author:Plato or author:Socrates) an= d topic:epistemology, which cannot be prepared statically due to the= boolean algebra over search terms, then users of the current API must use = one-shot (non-prepared) queries to avoid unbounded retention of resources o= ver time. The new API provides a so-called dynamic prepare policy, which u= ses an LRU cache of prepared queries internally to limit the resource usage= while providing a heuristic for re-using common prepared queries.

      There is, however, a missing piece in order for this to be practically effi= cient. Type descriptors like Caqti_type.t2, Caqti_type.= t3, etc. which represent parametrically polymorphic types, are curr= ently generative with respect to the equality used by the LRU cache, meanin= g that the type expression would need to be lifted out of the function whic= h generates the request template in order to avoid consistent cache-misses.

      My plan is first to make a major release which moves the concrete type repr= esentation away from the public modules, and then revise it to properly enc= ode parametric types. Apart from changing the constructors, this involves = adding an extra phantom type parameter, but the parameter will be universal= ly qualified in the type exposed to the public API, so I expect to retain b= ackwards compatibility for typical usage.

    • The Main Request Template API and Bring-Your-O= wn-Paint

      For most use cases, it is sufficient to be able to construct request templa= tes, which consists of type descriptors and a possibly dialect-dependent qu= ery template. Everything needed for this is bundled into the module = Caqti_template.Create. I may have developed a bit colourblindness af= ter walking around this bikeshed, so let me show you how the current stable= API looks like, how the current iteration of the new API looks like.

      Here is a request template using the stable API:

      let select_owner =3D
        let open Caqti_request.Infix in
        let open Caqti_type.Std in
        (string ->? string)
        "SELECT owner FROM bikereg WHERE frameno =
      =3D ?"
      

      In the current iteration of the new API, this looks like:

      let select_owner =3D
        let open Caqti_template.Create in
        static T.(string -->? string)
        "SELECT owner FROM bikereg WHERE frameno =
      =3D ?"
      

      What changed?

      • There is now only a single open. That can only be good.
      • The type descriptors have been moved under a T sub-module.= This isn't strictly necessary, but I though it was tidier, esp. since the= re are clashing names (like int) under a parallel Q sub-module which is used for dynamically generated query templates.
      • The arrow was previously the main function, while in the new API it onl= y constructs the type and multiplicity representation (Caqti_template= .Request_type.t).
      • Instead, the main function now indicates the policy for whether to use = a prepared query and, if so, the life-time of the request template. The op= tions are direct, static, and dynamic (as explained above).

      The latter adds verbosity, but I think it is good to be explicit about stat= ic life-time, since using it for generated request templates would typicall= y lead to a resource leakage.

      It's getting late, so I will not write about dynamic and dialect-dependent = request templates, but in the current revision, they are constructed with a= "general" version of the above functions, direct_gen, s= tatic_gen, and dynamic_gen which takes a function recei= ving a dialect descriptor and returns a Caqti_template.Query.t= instead of a string. The stable API used combinator operators for this.

    update for the magick-core-7

    Florent Monnier announced

    An update to use the magick-core-7 is available there: https://github.com/fccm2/mgk-= gen2

    If you still want to use the magick-core-6, the previous head is kept here: https://github.com/fccm2/mgk-g= en

    The updated version was tested with the magick-core version 7.1.1-44<= /code>, if you want to compile it, you need about 256M space l= eft on device.

    gegl-0.4 _

    Florent Monnier announced

    You can now access gegl-0.4, from your favorite scripting lang= uage, and play with its nodes, with: https://github.com/fccm2/ge= gl-ocaml / (api-doc)

    Dune 3.18

    Etienne Marais announced

    On the behalf of the dune team, I'm glad to announce the release of dune 3.18.0 :partying_face:=20

    This release contains changes to support the new x-maintenance-intent= field by default. It also contains some changes regarding the cache= , about how it handles file permissions. It introduces a new (format-= dune-file ...) stanza with the intention to formalize the dune= format-dune-file command as an inside rule. Finally, it includes va= rious bug fixes for Dune.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • Support HaikuOS: don't call execve since it's not allowed = if other pthreads have been created. The fact that Haiku can't call execve from = other threads than the principal thread of a process (a team in haiku jargon), is a discrepancy to POSIX and hence there is a bug about it. (@Sylvain78, #10953)
        • Fix flag ordering in generated Merlin configurations (#11503, @voodoos,= fixes ocaml/merlin#1900, reported by @vouillon)
    • Added
      • Add (format-dune-file <src> <dst>) action. It = provides an alternative to the dune format-dune-file command. (#11166, @nojb)
        • Allow the --prefix flag when configuring dune with o= caml configure.ml. This allows to set the prefix just like $ dune install --prefix. (#11172, @rgrinberg)
        • Allow arguments starting with + in preprocessing definitio= ns (starting with (lang dune 3.18)). (@amonteiro, #11234)
        • Support for opam (maintenance_intent ...) in dune-project = (#11274, @art-w)
        • Validate opam maintenance_intent (#11308, @art-w)
        • Support not in package dependencies constraints (#11404, @= art-w, reported by @hannesm)
    • Changed
      • Warn when failing to discover root due to reads failing. The previous behavior was to abort. (@KoviRobi, #11173)
      • Use shorter path for inline-tests artifacts. (@hhugo, #11307)
      • Allow dash in dune init project name (#11402, @art-w, repo= rted by @saroupille)
      • On Windows, under heavy load, file delete operations can sometimes fail= due to AV programs, etc. Guard against it by retrying the operation up to 30x with= a 1s waiting gap (#11437, fixes #11425, @MSoegtropIMC)
      • Cache: we now only store the executable permission bit for files (#1154= 1, fixes #11533, @ElectreAAS)
      • Display negative error codes on Windows in hex which is the more custom= ary way to display NTSTATUS codes (#11504, @MisterDA)

    QCheck 0.24

    Jan Midtgaard announced

    FYI, QCheck 0.25 is now available from the opam repository :smiley:=20

    https://github.com/c= -cube/qcheck/releases/

    The 0.25 release contains a combination of all-round fixes, documentation, = and polishing:

    • Restore Test.make's max_fail parameter which = was accidentally broken in 0.18
    • Adjust stats computation of average and standard deviation= to limit precision loss, print both using scientific notation, and workaro= und MinGW float printing to also pass expect tests
    • Fix dune snippets missing a language specifier in README.adoc causing <= code>asciidoc to error
    • Add a note to QCheck{,2.Gen}.small_int_corners and Q= Check{,2}.Gen.graft_corners about internal state, and fix a range of= documentation reference warnings
    • Reorganize and polish the README, rewrite it to use = qcheck-core, and add a QCheck2 integrated shrinking exa= mple
    • Document QCHECK_MSG_INTERVAL introduced in 0.20
    • Add QCheck{,2}.Gen.map{4,5} combinators

    The accompanying ppx_deriving_qcheck.0.7 release offers:

    • Support ppxlib.0.36.0 based on the OCaml 5.2 AST

    Thanks to @Pat-Lafon and @patricoferris for contributing PRs! =F0=9F=8E=89

    Happy testing! :smiley: :keyboard:

    checked_oint v0.5.0: Safe integer arithmetic for OCaml

    hirrolot announced

    I would like to announce checked_oint v0.5.0, which provides checked integer ari= thmetic for OCaml. We support both signed and unsigned integers of 8, 16, 3= 2, 64, and 128 bits. Unlike other libraries, checked_oint eith= er returns an option or raises an exception when the result of an arithmeti= c operation cannot be represented in a desired integer type.

    In addition, it contains abstractions for manipulating arbitrary integers a= nd integer types in a generic and type-safe manner, which I find tremendous= ly useful for compiler/interpreter implementations.

    Usage example:

    open Checked_oint
    
    let () =3D
      let x =3D U8.of_int_exn 50 in
      let y =3D U8.of_int_exn 70 in
      assert (U8.equal (U=
    8.add_exn x y) (U8.of_int_exn=
     120));
      assert (Option.is_none (U8.mul x y))
    

    The release v0.5.0 introduced crucial functionality for converting between = any two integer types in a safe manner – see S.of_generic and S.of_generic_exn.

    Outreachy December 2024 Round

    Patrick Ferris announced

    With the = June 2025 round about to begin, it is time to celebrate the awesome wor= k @abdulaziz.alkurd has been doing on ocaml-api-watch mentored by @NathanReb and @pang= lesd!=20

    Please join us on [date=3D2025-04-15 time=3D10:00:00 timezone=3D"UTC"] for = the community zoom call where we will get to hear about all of the progress= that has been made.

    Hope to see you there. I'll post a link to the video call closer to the tim= e. For those that can't make it, the meeting will be recorded and uploaded = to watch.ocaml.org :two_hump_camel:

    OUPS meetup april 2025

    zapashcanon announced

    CAUTION: the time has been changed from 7pm to 6:30pm and it will be at ENS= Ulm instead of Jussieu

    The next OUPS meetup will take place on Thursday, 24th of April 2025= . It will start at 6:30pm at the 45 rue d'Ulm in Paris. It wi= ll be in the in the Salle des r=C3=A9sistants (first floor in the "c= ouloir du carr=C3=A9").

    Please, register on meetup as soon as possible to let us know how ma= ny pizza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    This time we=E2=80=99ll have the following talks:

    A translation of OCaml programs from Gospel to Viper – Charl=C3= =A8ne Gros

    Presentation of a translation of OCaml programs specified in Gospel into Vi= per, an intermediate verification language supporting separation logic.

    The practical goal is to add a new backend to Cameleer to verify OCaml prog= rams that manipulate the heap. The logical specification of such OCaml programs is described in the Gospel= language, and we detail the extensions made to support separation logic in= Viper.

    Posca: an experimental social network based on Matrix, written in OCaml = with melange – Pierre de Lacroix

    TBA

    After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=TMmU6yo0; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=g0wxYTmI; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 0C95240068 for ; Tue, 15 Apr 2025 09:51:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Bd1eMk2KpiKbfAkoCb9dbDfaQDLDbshfpbNW+aDol2A=; b=TMmU6yo0Kp4pmJt2r5OZr23RljJbs2Q9IttyL2BCJFOnb+Jgv1TQ3J9K jXSVTkNnMxh38GfUrRiLbrkjaCHhlIWYk3LOr0UiPkkSczoOWc5nvEs7l RzVoxAftGBUGP+1A+uPeGR1rW3qfrBxmelTlrKIF7AseKHNUeoSs+pLJL 4=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,213,1739833200"; d="scan'208,217";a="217932136" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 15 Apr 2025 11:51:45 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 394ECE0D21; Tue, 15 Apr 2025 11:51:44 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 1DC47E0264 for ; Tue, 15 Apr 2025 11:51:36 +0200 (CEST) IronPort-SDR: 67fe2c27_6bKnH9zF8Zd/V49+NRGX1Brq6FzqFevAxw+Gov3fKLIo+Ss G+Kppo4/76eTpIr+9++aYakbZvf1ZefLqtVYDAA== X-IPAS-Result: =?us-ascii?q?A0HIDwA0K/5nhSIeaIFaFoJIgT9bKBkBY1ozBwhIA4RSg?= =?us-ascii?q?0+OI4EWkDSKdoJ7Ay4jFAEDAQ0uAQ4EAQIEAQEDAQIBggyCLkYCFosUAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAUBJhXsNS?= =?us-ascii?q?QEBAQMBCgGBalFTHnQBAQEBAQEBAQECAQEBIgEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECCAQBAgyBEAMGBAYTAQEpAg0YI?= =?us-ascii?q?wMUAQYDAgQNATUDARMBEhQGgmgBgh9FAwUMBpdSm0t6fzOBAYIMAQEGgQg+A?= =?us-ascii?q?wsCAgMBDgklAdoHgWUJgUiFbYJJGgEqSGuESgmEMycPgVVEgRU1gXNKB2+CP?= =?us-ascii?q?wsXAQEBARiBEBQBAU0JgyWCaYIaF0U+FB8qHlWBDmOBJYELgXOBUYJuN4Eeg?= =?us-ascii?q?wZXgm+BM0iCFSMHUod9gUdLMywBVRMXCwcFYYELAyo0MXE1HYF7g3KFNoIRg?= =?us-ascii?q?gSJFoRXLU+FEB1AAwttPTcUG5gJHiIag0kOQAUkNwIRBw4ZCA4BAQkXAjYFC?= =?us-ascii?q?QsbBQoELgQOCRoRDQwGCAM6kkMIAy0EBJ4HlF40B4QegV4GDIkFgSSHOYptg?= =?us-ascii?q?1eEA4FXizKHAJJLIpV8gmAigjaHJoElCYFvHkyIdYweBzUHIIE6g36BfiM8g?= =?us-ascii?q?Q0MBzMaMEOCZwkKPBwPiCGGCQMWgQwBB4JEEIEugQIkgXQ7xBFBNQIBAQoFK?= =?us-ascii?q?QIHAQoBAQMJhWIBAWmCG4IXboQvgUsBAQ?= IronPort-PHdr: A9a23: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 z1+AnxKpcf2f4mHwToJj/z63ufK0BCKf8Z7WCE= IronPort-Data: A9a23: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 NVhD7jSyXlp8Hxs5YA= IronPort-HdrOrdr: A9a23:czCVpK9FlxTsxUqX+0puk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:3L8pKGCN81QWk5T6EwMg1E8YROd7SHTA1SveG1XiDkxEE6LAHA== X-Talos-MUID: =?us-ascii?q?9a23=3AjyXB5w5YAe639+ZH0Ov8CqTixoxjvP6lBmsukq4?= =?us-ascii?q?Lus67MyxyBhOQiW2OF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,213,1739833200"; d="scan'208,217";a="217931942" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEM8VuplqWLkolYudb8UHLQHz7NesiUkU3q4E?= =?us-ascii?q?Phnpz+0eDajxkhv7zNbqZWEldKGOFUDBxZpQv/hrrdVnWvHsL8ZLijLX?= =?us-ascii?q?xaGy1o/PHGFv/vg20IXjJjwPHWLMSvqnliL7oOlVAA5aolPn62MJOztR?= =?us-ascii?q?QElvHGmobMpzgK7un8gheukA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Apr 2025 11:51:35 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8CCA1564BBC; Tue, 15 Apr 2025 11:51:33 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1744710693; bh=BwKCj8fxfjAoJ+Y2NUSX5L2QPki1vWtZdg523eGpTXc=; h=From:To:Subject:Date:Message-ID; b=g0wxYTmIGMw298/BZq9zkWm2dgqRkOmTW9hTKCpAcgayZ/ogN+Ov+fNNGElrJzvFi 8zsKqdIkrdkmXxINLXFYDpKeJwsw1zzf1rqyk9OTLVFGTRWuQRKuqX54PocYW1mJtC Y51Za/SaXsriRDyOIMdrJwduA0j8KuvLUJonXgmo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 15 Apr 2025 11:51:33 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 15 11:51:33 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.476365, queueID=C777D564BBE X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19295 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMDggdG8gMTUsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClNlbWdyZXAg aXMgaGlyaW5nIE9DYW1sIGRldmVsb3BlcnMgdG8gaGVscCBkZXZlbG9wIG91ciBzdXBwbHkgY2hh aW4gc2VjdXJpdHkgcHJvZHVjdCENClN1YnByb2Nlc3M6IGEgbGlicmFyeSBmb3IgbGF1bmNoaW5n IGFuZCBjb21tdW5pY2F0aW5nIHdpdGggVW5peCBjb21tYW5kcw0KY3VkYWppdDogQmluZGluZ3Mg dG8gdGhlIGBjdWRhJyBhbmQgYG52cnRjJyBsaWJyYXJpZXMNCnFjaGVjay1saW4gYW5kIHFjaGVj ay1zdG0gMC4yDQpDYWxsIGZvciBWb2x1bnRlZXJzIHRvIEhlbHAgTWFpbnRhaW4gdGhlIE9wYW0t UmVwb3NpdG9yeQ0KRHVuZSBwYWNrYWdlIG1hbmFnZW1lbnQgdXBkYXRlDQpPY3NpZ2VuIHB1Ymxp YyBtZWV0aW5nDQpMb29raW5nIGZvciBNYWludGFpbmVycyAvIE1vZGVyYXRvcnMgZm9yIHRoZSBP Q2FtbCBDb29rYm9vaw0KU0NHSSBsaWJyYXJ5IGZvciBPQ2FtbCBhbmQgZWlvDQpPdGhlciBPQ2Ft bCBOZXdzDQpPbGQgQ1dODQoNCg0KU2VtZ3JlcCBpcyBoaXJpbmcgT0NhbWwgZGV2ZWxvcGVycyB0 byBoZWxwIGRldmVsb3Agb3VyIHN1cHBseSBjaGFpbiBzZWN1cml0eSBwcm9kdWN0IQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9zZW1ncmVwLWlzLWhpcmluZy1vY2FtbC1kZXZlbG9wZXJzLXRvLWhlbHAtZGV2 ZWxvcC1vdXItc3VwcGx5LWNoYWluLXNlY3VyaXR5LXByb2R1Y3QvMTY0NjQvMT4NCg0KDQpBYXJv biBBY29zdGEgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBTZW1ncmVwIGlzIGFuIGFwcGxpY2F0 aW9uIHNlY3VyaXR5IGNvbXBhbnkgZm9jdXNlZCBvbiBkZXRlY3RpbmcgYW5kDQogIHJlbWVkaWF0 aW5nIHZ1bG5lcmFiaWxpdGllcy4gVGhlIHN0YXRpYyBhbmFseXNpcyBlbmdpbmUgaXMgcHJpbWFy aWx5DQogIHdyaXR0ZW4gaW4gT0NhbWwuIFdlJ3JlIGxvb2tpbmcgZm9yIGEgc2VuaW9yIG9yIHN0 YWZmIHNvZnR3YXJlDQogIGVuZ2luZWVyIHRvIGhlbHAgdXMgZW5oYW5jZSBvdXIgdGhpcmQtcGFy dHkgdnVsbmVyYWJpbGl0eSBkZXRlY3Rpb24NCiAgY2FwYWJpbGl0aWVzLiBUaGUgaWRlYWwgY2Fu ZGlkYXRlIGhhcyBvd25lZCBhIGNyaXRpY2FsIHRvb2wsIGhhcw0KICB3b3JrZWQgb24gYW4gT0Nh bWwgcHJvamVjdCwgaGFzIGV4cGVyaWVuY2UgbGVhZGluZyBkZXZlbG9wbWVudCB0ZWFtcw0KICBh bmQgbWVudG9yaW5nLCBhbmQgaGFzIHNvbWUgZXhwZXJpZW5jZSB3aXRoIHN1cHBseSBjaGFpbiBz ZWN1cml0eS4NCg0KICBJZiB0aGlzIHNvdW5kcyBpbnRlcmVzdGluZyB0byB5b3UsIHNlZSBvdXIg am9iIHBvc3RpbmcgYXQNCiAgW1Nlbmlvci9TdGFmZiBQcm9ncmFtIEFuYWx5c2lzIEVuZ2luZWVy LCBTdXBwbHkgQ2hhaW5dISBMZXQgbWUga25vdyBpZg0KICB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25z IQ0KDQoNCltTZW5pb3IvU3RhZmYgUHJvZ3JhbSBBbmFseXNpcyBFbmdpbmVlciwgU3VwcGx5IENo YWluXQ0KPGh0dHBzOi8vam9iLWJvYXJkcy5ncmVlbmhvdXNlLmlvL3NlbWdyZXAvam9icy80Njcy ODU4MDA3Pg0KDQoNClN1YnByb2Nlc3M6IGEgbGlicmFyeSBmb3IgbGF1bmNoaW5nIGFuZCBjb21t dW5pY2F0aW5nIHdpdGggVW5peCBjb21tYW5kcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tc3VicHJvY2Vzcy1hLWxpYnJhcnktZm9yLWxhdW5jaGluZy1hbmQtY29tbXVu aWNhdGluZy13aXRoLXVuaXgtY29tbWFuZHMvMTY0NjcvMT4NCg0KDQpBYXJvbiBDaHJpc3RpYW5z b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBfQW4gT0NhbWwg bGlicmFyeSB3aXRoICpbZG9jdW1lbnRhdGlvbl0hPypfDQoNCiAgWWVzLiBJIHJlYWxpemUgaXQn cyB1bm9ydGhvZG94LCBidXQgSSB0aG91Z2h0IEknZCBnaXZlIGl0IGEgc2hvdC4NCg0KICBJIGJl Z2FuIG15IHByb2dyYW1taW5nIGpvdXJuZXkgYSBiaXQgbGF0ZXIgdGhhbiBtb3N0LCBhbmQgSSBi ZWdhbiBpdA0KICB3aXRoIEJhc2guIE92ZXIgdGhlIHllYXJzIEkndmUgZ3Jvd24gYXBhcnQgZnJv bSBCYXNoIGFuZCBldmVuIHdyaXR0ZW4NCiAgc29tZSBzZW1pLXBvcHVsYXIgW2FudGktQmFzaCBw cm9wYWdhbmRhXS4NCg0KICBIb3dldmVyLCB3aGlsZSBJJ20gbm90IHBhcnRpY3VsYXJseSBhIGZh biBvZiBzaGVsbCBwcm9ncmFtbWluZw0KICBsYW5ndWFnZXMsIEkndmUgbWFpbnRhaW5lZCBhIGxv bmctdGVybSBpbnRlcmVzdCBpbiB0aGUgdHlwZXMgb2YNCiAgYXV0b21hdGlvbiB0YXNrcyB3aGlj aCB0aGUgc2hlbGwgbGVuZHMgaXRzZWxmIHRvLCBhbmQgSSBoYXZlIGEgc29mdA0KICBzcG90IGlu IG15IGhlYXJ0IGZvciBsYW5ndWFnZXMgd2hpY2ggbWFrZSB0aGlzIHR5cGUgb2YgcHJvZ3JhbW1p bmcgYQ0KICBwcmlvcml0eeKAlGxhbmd1YWdlcyBzdWNoIGFzIEFXSywgUGVybCBhbmQgUnVieS4N Cg0KICBTaW5jZSBsZWFybmluZyBPQ2FtbCwgSSBhbHdheXMgZmVsdCB0aGF0IGl0IGNvdWxkIGJl IGEgZ29vZCBsYW5ndWFnZQ0KICBmb3IgdGhlc2Uga2luZHMgb2Ygam9icyB3aXRoIGl0cyBsaWdo dCBzeW50YXgsIGV4dGVuc2l2ZSBVbml4DQogIGludGVyZmFjZSBhbmQgZ3JlYXQgcmVnZXggbGli cmFyaWVzIChJJ20gdGFsa2luZyBhYm91dCBgUmUnIGFuZA0KICBmcmllbmRzLCBub3QgYFN0cicp Lg0KDQogIEhvd2V2ZXIsIEkgYWx3YXlzIGZlbHQgdGhlIHByb3ZpZGVkIGludGVyZmFjZXMgZm9y IHdvcmtpbmcgd2l0aA0KICBwcm9jZXNzZXMgd2VyZeKApiBub3QgcXVpdGUgd2hhdCBJIHdhcyBs b29raW5nIGZvci4gYFN5cy5jb21tYW5kJw0KICAoY29tYmluZWQgd2l0aCBgRmlsZW5hbWUucXVv dGVfY29tbWFuZCcsIG9mIGNvdXJzZSkgaXMgT0sgZm9yIHdoYXQgaXQNCiAgZG9lcywgYnV0IGl0 IGRvZXNuJ3QgZG8gbXVjaC4gVGhlIG1vcmUgZXh0ZW5zaXZlIHNldCBvZiBwcm9jZXNzDQogIGhh bmRsaW5nIGNvbW1hbmRzIGluIHRoZSBVbml4IGxpYnJhcnkgbWFrZSBqdXN0IGFib3V0IGFueXRo aW5nDQogIHBvc3NpYmxlLCBidXQgdGhleSBkb24ndCBfZmVlbCBnb29kXyB0byBtZS4NCg0KICBT byBJIHNldCBvdXQgdG8gY3JlYXRlIGEgbGlicmFyeSBmb3Igd29ya2luZyB3aXRoIFVuaXggY29t bWFuZHMgd2hpY2gNCiAgZmVlbHMgcmlnaHQgdG8gbWUuIFN1YnByb2Nlc3MgZm9jdXNlcyBvbiAq c2FmZXR5KiBhbmQgKmVhc2Ugb2YgdXNlKuKAlGluDQogIHRoYXQgb3JkZXIuIEkgaG9wZSBzb21l b25lIGJlc2lkZXMgbXlzZWxmIHdpbGwgZmVlbCB0aGUgc2FtZSBhYm91dCBpdC4NCg0KICBOb3Rl IHRoYXQgdGhpcyBpcyB0aGUgZmlyc3QgcmVsZWFzZSAoYW5kIG15IGZpcnN0IHB1YmxpYyBPQ2Ft bA0KICBsaWJyYXJ5KSBhbmQgSSB3ZWxjb21lIGZlZWRiYWNrIGFuZCBjcml0aWNpc20uDQoNCiAg 4oCiIEdpdGh1YjogPGh0dHBzOi8vZ2l0aHViLmNvbS9uaW5qYWFyb24vb2NhbWwtc3VicHJvY2Vz cz4NCiAg4oCiIE9wYW06IDxodHRwczovL29jYW1sLm9yZy9wL3N1YnByb2Nlc3MvbGF0ZXN0Pg0K ICDigKIgT2RvYyBkb2NzOg0KICAgIDxodHRwczovL25pbmphYXJvbi5naXRodWIuaW8vb2NhbWwt c3VicHJvY2Vzcy9zdWJwcm9jZXNzL2luZGV4Lmh0bWw+DQoNCg0KW2RvY3VtZW50YXRpb25dDQo8 aHR0cHM6Ly9uaW5qYWFyb24uZ2l0aHViLmlvL29jYW1sLXN1YnByb2Nlc3Mvc3VicHJvY2Vzcy9p bmRleC5odG1sPg0KDQpbYW50aS1CYXNoIHByb3BhZ2FuZGFdDQo8aHR0cHM6Ly9naXRodWIuY29t L25pbmphYXJvbi9yZXBsYWNpbmctYmFzaC1zY3JpcHRpbmctd2l0aC1weXRob24+DQoNCg0KY3Vk YWppdDogQmluZGluZ3MgdG8gdGhlIGBjdWRhJyBhbmQgYG52cnRjJyBsaWJyYXJpZXMNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWN1ZGFqaXQtYmluZGluZ3MtdG8tdGhl LWN1ZGEtYW5kLW52cnRjLWxpYnJhcmllcy8xNTAxMC8zPg0KDQoNCkx1a2FzeiBTdGFmaW5pYWsg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBjdWRhaml0IDAuNy4wIGlzIG5v dyBhdmFpbGFibGUgaW4gdGhlIG9wYW0gcmVwb3NpdG9yeS4gSXQgaXMgbm93IHNwbGl0DQogIGlu dG8gc2VwYXJhdGUgbGlicmFyaWVzIGNvdmVyaW5nIE5WUlRDIGJpbmRpbmdzIGFuZCBDVURBIGJp bmRpbmdzLCBzbw0KICB0aGF0IGBOdnJ0YycgZG9lc24ndCBuZWVkIENVREEgZHJpdmVycyB0byBy dW4uDQoNCiAgVmVyc2lvbiAwLjcuMCBicmluZ3MgZnVsbCBuYXRpdmUgV2luZG93cyBjb21wYXRp YmlsaXR5Lg0KDQogIFZlcnNpb24gMC42LjAgaW1wcm92ZXMgbWVtb3J5IHNhZmV0eSBhbmQgZGVi dWdnYWJpbGl0eS4NCg0KICBjdWRhaml0LjAuNy4wIGNhbiBiZSB1c2VkIHdpdGggT0NBTk5MIG5l dXJhbF9uZXRzX2xpYi4wLjUuMiBhbHNvIGluDQogIHRoZSBvcGFtIHJlcG9zaXRvcnkuIEVuam95 IQ0KDQoNCnFjaGVjay1saW4gYW5kIHFjaGVjay1zdG0gMC4yDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1xY2hlY2stbGluLWFuZC1xY2hlY2stc3RtLTAtMi8xMjMwMS82Pg0KDQoNCkphbiBNaWR0 Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBWZXJzaW9uIDAuOCBvZiBgcWNoZWNr LWxpbicsIGBxY2hlY2stc3RtJywgYW5kDQogIGBxY2hlY2stbXVsdGljb3JldGVzdHMtdXRpbCcg d2FzIGp1c3QgbWVyZ2VkIG9uIHRoZSBvcGFtIHJlcG9zaXRvcnk6DQogIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwtbXVsdGljb3JlL211bHRpY29yZXRlc3RzL3JlbGVhc2VzL3RhZy8wLjg+DQoN CiAgVGhlIDAuOCByZWxlYXNlIGltcHJvdmVzIHRoZSBlcnJvciBmaW5kaW5nIGFiaWxpdHkgb2Yg dGhlIGBMaW5fdGhyZWFkJw0KICBhbmQgYFNUTV90aHJlYWQnIG1vZGVzOg0KDQogIOKAoiBbIzU0 MF06IFNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHByb2JhYmlsaXR5IG9mIGNvbnRleHQgc3dp dGNoaW5nDQogICAgaW4gYExpbl90aHJlYWQnIGFuZCBgU1RNX3RocmVhZCcgYnkgdXRpbGl6aW5n IGBHYy5NZW1wcm9mJw0KICAgIGNhbGxiYWNrcy4gQXZvaWQgb24gNS4wLTUuMiB3aXRob3V0IGBH Yy5NZW1wcm9mJyBzdXBwb3J0Lg0KICDigKIgWyM1NDZdOiBTcGVlZCB1cCBgTGluJydzIGRlZmF1 bHQgYHN0cmluZycgYW5kIGBieXRlcycgc2hyaW5rZXJzLg0KICDigKIgWyM1NDddOiBBZGQgYFV0 aWwuUHAue2NzdDQsY3N0NX0nDQoNCiAgSGFwcHkgdGVzdGluZyEgOnNtaWxleToNCg0KDQpbIzU0 MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1tdWx0aWNvcmUvbXVsdGljb3JldGVzdHMvcHVs bC81NDA+DQoNClsjNTQ2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9tdWx0 aWNvcmV0ZXN0cy9wdWxsLzU0Nj4NCg0KWyM1NDddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwt bXVsdGljb3JlL211bHRpY29yZXRlc3RzL3B1bGwvNTQ3Pg0KDQoNCkNhbGwgZm9yIFZvbHVudGVl cnMgdG8gSGVscCBNYWludGFpbiB0aGUgT3BhbS1SZXBvc2l0b3J5DQrilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NhbGwtZm9yLXZvbHVudGVlcnMtdG8taGVscC1t YWludGFpbi10aGUtb3BhbS1yZXBvc2l0b3J5LzE2NDc2LzE+DQoNCg0KU2hvbiBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogICpUaGUgb3Bh bS1yZXBvc2l0b3J5IG5lZWRzIHlvdXIgaGVscCEgOmNhbWVsOjpoZWFydDoqDQoNCiAgKnRsO2Ry KjogV2FudCB0byBncm93IHlvdXIgT0NhbWwgY29ubmVjdGlvbnMgYW5kIGV4cGVydGlzZSB3aGls ZQ0KICAgc3VwcG9ydGluZyBhIHBpbGxhciBvZiB0aGUgZWNvc3lzdGVtPyBUaGVuIGpvaW4gdXMg YXMgYW4NCiAgIG9wYW0tcmVwb3NpdG9yeSBtYWludGFpbmVyIGJ5IGNvbW1lbnRpbmcgb24gdGhl IGlzc3VlIFtWb2x1bnRlZXIgdG8NCiAgIE1haW50YWluIHRoZSBvcGFtIFJlcG9zaXRvcnkgOnJh aXNlZF9oYW5kX3dpdGhfZmluZ2Vyc19zcGxheWVkOl0hDQoNCiAgVGhlIFtvcGFtLXJlcG9zaXRv cnldIGlzIHRoZSBvZmZpY2lhbCBzdG9yZSBvZiBwYWNrYWdlIGRlc2NyaXB0aW9ucw0KICBmb3Ig dGhlIGV4dGVuZGVkIE9DYW1sIGVjb3N5c3RlbS4gSXQgc2VydmVzIG1vcmUgdGhhbiA0NDAwIHBh Y2thZ2VzDQogIHRocnUgdGhlIGBvcGFtJyBwYWNrYWdlIG1hbmFnZXIgYW5kIGluZGV4LCBhbmQg aXQgaXMgYXBwcm9hY2hpbmcgMjAwDQogIG5ldyBwYWNrYWdlcyBhbmQgcmVsZWFzZXMgcGVyIG1v bnRoLiBUaGUgYG9wYW0nIHN5c3RlbSBpcyB1bmlxdWUgYW1vbmcNCiAgd2lkZWx5IHVzZWQgcHJv Z3JhbW1pbmcgbGFuZ3VhZ2UgcGFja2FnaW5nIHN5c3RlbXMgaW4gb2ZmZXJpbmcgdGhlDQogIGZv bGxvd2luZzoNCg0KICDigKIgSXQgc3VwcG9ydHMgW3N5c3RlbSBkZXBlbmRlbmNpZXNdIHRvIGFi c3RyYWN0IG92ZXIgdGhlIHBhY2thZ2luZw0KICAgIGNvbXBsZXhpdGllcyBvZiBtb3N0IGNvbW1v bmx5IHVzZWQgcGxhdGZvcm1zLg0KICDigKIgSXQgaXMgdGVzdGVkIGJ5IGFuIFtleHRlbnNpdmUg Q0kgbWF0cml4XSB0byBlbnN1cmUgcGFja2FnZXMgYXJlDQogICAgd29ya2luZywgaW5zdGFsbGFi bGUsIGFuZCBpbnRlcm9wZXJhYmxlLg0KICDigKIgSXQgaXMgW2N1cmF0ZWRdIHRvIGN1bHRpdmF0 ZSBhbiBlY29zeXN0ZW0gb2YgaGlnaCBxdWFsaXR5LCB1c2VmdWwNCiAgICBwYWNrYWdlcy4NCg0K ICBUaGlzIGFsbCB0YWtlcyBhIGxvdCBvZiB3b3JrIGFuZCBpdCBwcmVzZW50cyBhIHdpZGUgZmll bGQgb2YNCiAgaW50ZXJlc3Rpbmcgc29jaW8tdGVjaG5pY2FsIHByb2JsZW1zIGFuZCBleGNpdGlu ZyBvcHBvcnR1bml0aWVzLg0KDQogIEhlcmUgYXJlIHR3byBvZiB0aGUgcHJvamVjdHMgd2UndmUg dGFja2xlZCByZWNlbnRseToNCg0KICDigKIgT3JnYW5pemluZyBhbmQgZXhlY3V0aW5nIHRoZSBh cmNoaXZpbmcgaW5pdGlhdGl2ZSwgbGVkIGJ5IEBoYW5uZXMsDQogICAgYW5kIHByZXNlbnRlZCBp biBbIlB1c2hpbmcgdGhlIG9wYW0tcmVwb3NpdG9yeSBpbnRvIGEgc3VzdGFpbmFibGUNCiAgICBy ZXBvc2l0b3J5Il0NCiAg4oCiIFdvcmsgdG8gW0ltcHJvdmUgdGhlIENJIHN5c3RlbXMgYW5kIG1h aW50YWluIHRoZSBpbmZyYXN0cnVjdHVyZV0NCg0KICAqVGhlIFtvcGFtLXJlcG9zaXRvcnkgbWFp bnRhaW5lcnNdIG5lZWRzIHRoZSBoZWxwIG9mIGN1cmlvdXMgYW5kDQogICBtb3RpdmF0ZWQgdm9s dW50ZWVycywgbGlrZSB5b3UhKg0KDQoNCltWb2x1bnRlZXIgdG8gTWFpbnRhaW4gdGhlIG9wYW0g UmVwb3NpdG9yeQ0KOnJhaXNlZF9oYW5kX3dpdGhfZmluZ2Vyc19zcGxheWVkOl0NCjxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L2lzc3Vlcy8yNzc0MD4NCg0KW29wYW0t cmVwb3NpdG9yeV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnk+DQoN CltzeXN0ZW0gZGVwZW5kZW5jaWVzXQ0KPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvZG9jL01hbnVh bC5odG1sI29wYW1maWVsZC1kZXBleHRzPg0KDQpbZXh0ZW5zaXZlIENJIG1hdHJpeF0NCjxodHRw czovL2dpdGh1Yi5jb20vb2N1cnJlbnQvb3BhbS1yZXBvLWNpL2Jsb2IvbWFzdGVyL2RvYy9wbGF0 Zm9ybXMubWQ+DQoNCltjdXJhdGVkXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJl cG9zaXRvcnkvdHJlZS9tYXN0ZXIvZ292ZXJuYW5jZS9wb2xpY2llcz4NCg0KWyJQdXNoaW5nIHRo ZSBvcGFtLXJlcG9zaXRvcnkgaW50byBhIHN1c3RhaW5hYmxlIHJlcG9zaXRvcnkiXQ0KPGh0dHBz Oi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzLzIwMjUtMDMtMjYtb3BhbS1yZXBvc2l0b3J5LWFy Y2hpdmUuaHRtbD4NCg0KW0ltcHJvdmUgdGhlIENJIHN5c3RlbXMgYW5kIG1haW50YWluIHRoZSBp bmZyYXN0cnVjdHVyZV0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNC0xMC0wMi11 cGRhdGVzPg0KDQpbb3BhbS1yZXBvc2l0b3J5IG1haW50YWluZXJzXQ0KPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvdHJlZS9tYXN0ZXIvZ292ZXJuYW5jZT4NCg0KT3Bw b3J0dW5pdGllcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VGhpcyBpcyBhIGdyZWF0IG9wcG9ydHVuaXR5IGZvciBuZXdlciBhbmQgc2Vhc29uZWQgbWVtYmVy cyBvZiB0aGUNCiAgT0NhbWwgY29tbXVuaXR5IHRvIHNlcnZlIGEgY3JpdGljYWwgZnVuY3Rpb24g YW5kIG1ha2UgYSBiaWcgaW1wYWN0IG9uDQogIHRoZSBzdXN0YWluYWJpbGl0eSBhbmQgaGVhbHRo IG9mIG91ciBncm93aW5nIGVjb3N5c3RlbToNCg0KICDigKIgQ29ubmVjdCB3aXRoIGFuZCBzdXBw b3J0IGNvbnRyaWJ1dG9ycyBmcm9tIGFjcm9zcyB0aGUgZWNvc3lzdGVtLg0KICDigKIgQ29udHJp YnV0ZSB0byBhIGxhcmdlLCBsb25nLXJ1bm5pbmcgb3BlbiBzb3VyY2UgcHJvamVjdC4NCiAg4oCi IExlYXJuIGZyb20gYW4gZXhwZXJpZW5jZWQgZ3JvdXAgb2YgY2FyaW5nIGFuZCBjb21taXR0ZWQg bWFpbnRhaW5lcnMuDQogIOKAoiBMZWFybiBhZHZhbmNlZCB0ZWNobmlxdWVzIGluIHBhY2thZ2lu ZyBtYW5hZ2VtZW50LCBpbiBhIHZhcmlldHkgb2YNCiAgICBidWlsZCBzeXN0ZW1zLCBhbmQgaW4g ZXZlcnkgbmljaGUgb2YgdGhlIGV4dGVuZGVkIE9DYW1sIGVjb3N5c3RlbS4NCiAg4oCiIEhlbHAg dG8gZXZvbHZlIHRoZSB0b29saW5nLCBpbmZyYXN0cnVjdHVyZSwgYW5kIHByb2Nlc3NlcyB0aGF0 DQogICAgZW5hYmxlIG91ciBkaXN0cmlidXRlZCBjb21tdW5pdHkgdG8gc2hhcmUgcHJvZ3JhbXMh DQoNCg0KTmV4dCBzdGVwcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCi IEFzayBhbnkgcXVlc3Rpb25zIGluIHRoaXMgdGhyZWFkLCBvciBieSBjb250YWN0aW5nIG9uZSBv ZiB0aGUNCiAgICBbYWN0aXZlIG1haW50YWluZXJzXSBkaXJlY3RseS4NCiAg4oCiIFZvbHVudGVl ciBieSBjb21tZW50aW5nIG9uIHRoZSBpc3N1ZSBbVm9sdW50ZWVyIHRvIE1haW50YWluIHRoZSBv cGFtDQogICAgUmVwb3NpdG9yeSA6cmFpc2VkX2hhbmRfd2l0aF9maW5nZXJzX3NwbGF5ZWQ6XS4N CiAg4oCiIFdlIHdpbGwgYXJyYW5nZSBmb3IgYW4gb3JpZW50YXRpb24gc2Vzc2lvbiBmb3IgYWxs IGludGVyZXN0ZWQNCiAgICBtYWludGFpbmVyIQ0KDQogIFdlIGxvb2sgZm9yd2FyZCB0byB3b3Jr aW5nIHdpdGggeW91IQ0KDQogIOKAkyBUaGUgT3BhbSBSZXBvc2l0b3J5IE1haW50YWluZXJzDQoN Cg0KW1ZvbHVudGVlciB0byBNYWludGFpbiB0aGUgb3BhbSBSZXBvc2l0b3J5DQo6cmFpc2VkX2hh bmRfd2l0aF9maW5nZXJzX3NwbGF5ZWQ6XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFt LXJlcG9zaXRvcnkvaXNzdWVzLzI3NzQwPg0KDQoNCkR1bmUgcGFja2FnZSBtYW5hZ2VtZW50IHVw ZGF0ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kdW5lLXBhY2thZ2UtbWFuYWdlbWVudC11cGRh dGUvMTY0NzcvMT4NCg0KDQpNYXJlayBLdWJpY2EgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI aSBmZWxsb3cgY2FtZWwtd3JhbmdsZXJzLA0KDQogIEl0IGhhcyBiZWVuIGEgYml0IHF1aWV0IHdp dGggdXBkYXRlcyBsYXRlbHkgd2l0aCByZWdhcmRzIHRvIHRoZSBEdW5lDQogIHBhY2thZ2UgbWFu YWdlbWVudCBmZWF0dXJlLCBidXQgaXQgZG9lc24ndCBtZWFuIHRoYXQgdGhlIHdvcmsgaGFzDQog IHN0YWxsZWQuIFdlJ3JlIHN0aWxsIGNvbnRpbnVpbmcgYW5kIGdvdCB0byBhIHBvaW50IHdoZXJl IHRoZSBjb2RlIGlzDQogIG1hdHVyZSBlbm91Z2ggdG8gdGVzdCBpdCBvbiBhbGwgcGFja2FnZXMg aW4gT1BBTS1yZXBvc2l0b3J5Lg0KDQogIFNvbWUgb2YgeW91IG1pZ2h0IGJlIGF3YXJlIG9mIFtP UEFNLWhlYWx0aC1jaGVja106IGEgdG9vbC9zZXJ2aWNlIHRoYXQNCiAgbW9uaXRvcnMgaG93IG11 Y2ggb2YgdGhlIE9QQU0gZWNvc3lzdGVtIGNhbiBiZSBidWlsdCBzdWNjZXNzZnVsbHkuIFdlDQog IGV4dGVuZGVkIGl0IHRvIGJ1aWxkIHBhY2thZ2VzIHdpdGggRHVuZS4NCg0KICBJdCdzIGEgYml0 IG9mIGEgbG9uZ2VyIHJlYWQsIHdpdGggYWxsIHRoZSBleHBsYW5hdGlvbnMgYW5kIHRob3VnaHRz DQogIHRoYXQgd2VudCBpbnRvIHRoaXMsIGJ1dCBJIGFtIHN1cmUgaXQnbGwgYmUgaW50ZXJlc3Rp bmcgZm9yIHlvdSB3aGF0DQogIGNoYWxsZW5nZXMgd2UgaGFkLCB3aGF0IHByb2dyZXNzIGhhcHBl bmVkIGluIHRoZSBsYXN0IGZldyBtb250aHMgYW5kDQogIG1vc3QgaW1wb3J0YW50bHksIHdoZXJl IHdlIGN1cnJlbnRseSBhcmU6DQoNCiAgPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI1LTA0 LTExLWV4cGFuZGluZy1kdW5lLXBhY2thZ2UtbWFuYWdlbWVudC10by10aGUtcmVzdC1vZi10aGUt ZWNvc3lzdGVtLz4NCg0KICBXZSdyZSBvZiBjb3Vyc2Ugbm90IGRvbmUgeWV0LiBTbyBleHBlY3Qg bW9yZSB1cGRhdGUgcG9zdHMgYXMgd2UgdHJ5IHRvDQogIGdldCBhcyBtYW55IHByb2plY3RzIHdv cmtpbmcgYXMgcG9zc2libGUgaW4gdGhlIGZ1dHVyZS4gSWYgeW91IGhhdmUNCiAgcXVlc3Rpb25z LCBpZGVhcywgc3VnZ2VzdGlvbnMsIGZlZWwgZnJlZSB0byBkcm9wIGluIGluIHRoaXMgdGhyZWFk IDotKQ0KDQogIFRoYW5rcyBnbyBvdXQgdG8gbXkgY293b3JrZXJzIGludm9sdmVkIGluIHRoaXMg ZWZmb3J0IChAZ3JpZGJ1Z3MNCiAgQG1haXN0ZSBAYXJ0LXcgQEVsZWN0cmVBQVMgQHNoeW0gQG10 ZWx2ZXJzKS4NCg0KDQpbT1BBTS1oZWFsdGgtY2hlY2tdIDxodHRwczovL2dpdGh1Yi5jb20vb2N1 cnJlbnQvb3BhbS1oZWFsdGgtY2hlY2svPg0KDQoNCk9jc2lnZW4gcHVibGljIG1lZXRpbmcNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LW9jc2lnZW4tcHVibGljLW1lZXRpbmcvMTY0MDgvMz4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhy ZWFkLCBWaW5jZW50IEJhbGF0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgVGhhbmsgeW91IGZvciB0aGUgYXR0ZW5kYW5jZSEgVGhpcyB3YXMgYSB2ZXJ5IGRlbnNl IG1lZXRpbmcgOikgVGhlDQogIG1pbnV0ZXMgb2YgdGhlIG1lZXRpbmcgYXJlIGF2YWlsYWJsZSBb aGVyZV0NCg0KDQpbaGVyZV0NCjxodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9kb2N1bWVudC9kLzEx b0xlUXMzd2hDajFCTHp0Vm1scjR0VkEzRzF4S2w1MFpld2ROMENySE1JL2VkaXQ/dGFiPXQuMD4N Cg0KDQpMb29raW5nIGZvciBNYWludGFpbmVycyAvIE1vZGVyYXRvcnMgZm9yIHRoZSBPQ2FtbCBD b29rYm9vaw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9sb29raW5nLWZvci1tYWludGFpbmVycy1tb2RlcmF0b3JzLWZvci10aGUtb2NhbWwtY29v a2Jvb2svMTY0OTcvMT4NCg0KDQpTYWJpbmUgU2NobWFsdHogYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBhZnRlciB3ZSBhZGRlZCB0aGUgW09DYW1s IENvb2tib29rIG9uIE9DYW1sLm9yZ10sIHdlIGdvdCBpbnRvIGENCiAgcG9zaXRpb24gd2hlcmUg d2UNCiAgMS4gaGFkIGNvbnRyaWJ1dGlvbnMgc2l0dGluZyBhcm91bmQgZm9yIGEgd2hpbGUgYmVj YXVzZSB3ZSBkaWQgbm90DQogICAgIGhhdmUgdGhlIGNhcGFjaXR5IHRvIHJldmlldyBhbmQgbW9k ZXJhdGUgdGhlc2UgYWRkaXRpb25zLCBhbmQNCiAgMi4gZmVsdCB3ZSBkbyBub3QgaGF2ZSBhIGdv b2QgZW5vdWdoIHVuZGVyc3RhbmRpbmcgb2YgdGhlIGVjb3N5c3RlbSBpbg0KICAgICBnZW5lcmFs IHRvIGFzc2VzcyB3aGV0aGVyIHRoZSBjaG9zZW4gbGlicmFyaWVzIGFyZSByZWFzb25hYmxlLCBv cg0KICAgICB3aGV0aGVyIHRoZXJlJ3Mgb3RoZXIgb3B0aW9ucyB0aGF0IG5lZWQgdG8gYmUgbWVu dGlvbmVkLg0KDQogIFRvIG1ha2UgdGhlIGNvb2tib29rIHJlYWxseSB1c2VmdWwsIHdlIG5lZWQg dG8gYnVpbGQgYSBiZXR0ZXIgcHJvY2Vzcw0KICBhcm91bmQgbWFpbnRhaW5pbmcgaXQgYW5kIGFk ZGluZyB0byBpdC4NCg0KICBJIHByb3Bvc2U6DQogIDEuIFdlIGFwcG9pbnQgYSBoYW5kZnVsIG9m IG1vZGVyYXRvcnMgLyBtYWludGFpbmVycyBmb3IgdGhlIE9DYW1sDQogICAgIENvb2tib29rLCBk cmF3aW5nIGZyb20gdm9sdW50ZWVycy4NCiAgMi4gSSBjcmVhdGUgYSBUZWxlZ3JhbSBncm91cCB0 byBzdGF5IGluIGNvbnRhY3Qgd2l0aCB5b3UgYWxsIHRvIGFzaw0KICAgICBmb3IgaGVscCBvbiBj b29rYm9vayBQUnMuIChUaGlzIGNvdWxkIGEgZ3JvdXAgZm9jdXNlZCBwcmVjaXNlbHkgb24NCiAg ICAgdGhlIE9DYW1sIENvb2tib29rLikNCg0KICBTbywgaWYgeW91J3JlIHVwIGZvciBoZWxwaW5n IHdpdGggdGhlIGNvb2tib29rLCBoYXZlIGFueSBxdWVzdGlvbnMsIG9yDQogIG90aGVyIHJlbWFy a3MsIHBsZWFzZSByZWFjaCBvdXQgdG8gc2FiaW5lQHRhcmlkZXMuY29tLCBvciByZXBseSBoZXJl IQ0KICA6b3JhbmdlX2hlYXJ0Og0KDQoNCltPQ2FtbCBDb29rYm9vayBvbiBPQ2FtbC5vcmddIDxo dHRwczovL29jYW1sLm9yZy9jb29rYm9vaz4NCg0KDQpTQ0dJIGxpYnJhcnkgZm9yIE9DYW1sIGFu ZCBlaW8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvc2NnaS1saWJyYXJ5LWZvci1vY2FtbC1hbmQt ZWlvLzE2NDk4LzE+DQoNCg0KTWFyYyBDb3F1YW5kIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SGV5IGV2ZXJ5b25lIQ0KDQogIFRvIGxlYXJuIGEgYml0IG9mIG5ldHdvcmtpbmcgYW5kIGVpbywg SSB3cm90ZSBhbiBbc2NnaSBsaWJyYXJ5IHdpdGgNCiAgZWlvIHN1cHBvcnRdLiAgSXQgYWltcyB0 byBqdXN0IGltcGxlbWVudCB0aGUgc2NnaSBwcm90b2NvbCBhbmQgYSBmZXcNCiAgaGVscGVycyBm b3Igd3JpdGluZyBIVFRQIHJlc3BvbnNlcy4gSXQncyBzdGlsbCB2ZXJ5IG5ldywgYW5kIEkgYW0N CiAgbG9va2luZyBmb3IgZmVlZGJhY2sgb24gdGhlIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRp b24gYmVmb3JlIEkNCiAgcHVibGlzaCBpdCB0byBvcGFtLg0KDQogIEhlcmUncyBhIHNpbXBsZSBw aW5nL3BvbmcgZXhhbXBsZSB0byBnZXQgc3RhcnRlZDoNCg0KICDilIzilIDilIDilIDilIANCiAg 4pSCIG9wZW4gU2NnaV9laW8NCiAg4pSCIA0KICDilIIgbGV0IGhhbmRsZXIgKHJlcXVlc3QgOiBS ZXF1ZXN0LnQpID0NCiAg4pSCICAgbWF0Y2ggUmVxdWVzdC5wYXRoIHJlcXVlc3Qgd2l0aA0KICDi lIIgICB8IFsicGluZyJdIC0+DQogIOKUgiAgICAgICBIdHRwX3Jlc3BvbnNlLmJvZHlfc3RyaW5n IGBPayAicG9uZyINCiAg4pSCICAgfCBfIC0+DQogIOKUgiAgICAgICBIdHRwX3Jlc3BvbnNlLmJv ZHlfc3RhdHVzIGBOb3RfZm91bmQNCiAg4pSCIA0KICDilIIgbGV0ICgpIDogdW5pdCA9DQogIOKU giAgIGxldCBwb3J0ID0gMzAwMCBpbg0KICDilIIgICBFaW9fbWFpbi5ydW4NCiAg4pSCICAgQEAg ZnVuIGVudiAtPg0KICDilIIgICBsZXQgYWRkciA9IGBUY3AgKEVpby5OZXQuSXBhZGRyLlY0Lmxv b3BiYWNrLCBwb3J0KSBpbg0KICDilIIgICBsZXQgbmV0ID0gRWlvLlN0ZGVudi5uZXQgZW52IGlu DQogIOKUgiAgIEVpby5Td2l0Y2gucnVuDQogIOKUgiAgIEBAIGZ1biBzdyAtPg0KICDilIIgICBs ZXQgY29ubiA9IEVpby5OZXQubGlzdGVuIG5ldCB+c3cgfnJldXNlX2FkZHI6dHJ1ZSB+YmFja2xv Zzo1IGFkZHIgaW4NCiAg4pSCICAgRWlvLnRyYWNlbG4gIkxpc3RlbmluZyB0byBjb25uZWN0aW9u cyBvbiBwb3J0ICVzIiAoc3RyaW5nX29mX2ludCBwb3J0KSA7DQogIOKUgiAgIEVpby5OZXQucnVu X3NlcnZlciBjb25uDQogIOKUgiAgICAgKFNjZ2lfZWlvLmh0dHBfc2VydmVyIH5zZXR0aW5nczpT Y2dpX2Vpby5kZWZhdWx0X3NldHRpbmdzIGhhbmRsZXIpDQogIOKUgiAgICAgfm9uX2Vycm9yOihF aW8udHJhY2VsbiAiRXJyb3IgaGFuZGxpbmcgY29ubmVjdGlvbjogJWEiIEZtdC5leG4pDQogIOKU lOKUgOKUgOKUgOKUgA0KDQoNCltzY2dpIGxpYnJhcnkgd2l0aCBlaW8gc3VwcG9ydF0gPGh0dHBz Oi8vZ2l0LnNyLmh0L35tYXJjYy9zY2dpLWVpbz4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUg b2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFu eSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQog IOKAoiBbRXhwYW5kaW5nIER1bmUgUGFja2FnZSBNYW5hZ2VtZW50IHRvIHRoZSBSZXN0IG9mIHRo ZSBFY29zeXN0ZW1dDQogIOKAoiBbRE5Tdml6b3IgLSBydW4geW91ciBvd24gREhDUCBhbmQgRE5T IE1pcmFnZU9TIHVuaWtlcm5lbCAtIGdldHMgc29tZQ0KICAgIHRlc3RpbmddDQoNCg0KW3RoZSBv Y2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbRXhwYW5kaW5nIER1 bmUgUGFja2FnZSBNYW5hZ2VtZW50IHRvIHRoZSBSZXN0IG9mIHRoZSBFY29zeXN0ZW1dDQo8aHR0 cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjUtMDQtMTEtZXhwYW5kaW5nLWR1bmUtcGFja2FnZS1t YW5hZ2VtZW50LXRvLXRoZS1yZXN0LW9mLXRoZS1lY29zeXN0ZW0+DQoNCltETlN2aXpvciAtIHJ1 biB5b3VyIG93biBESENQIGFuZCBETlMgTWlyYWdlT1MgdW5pa2VybmVsIC0gZ2V0cyBzb21lDQp0 ZXN0aW5nXSA8aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvZG5zdml6b3IwMi5odG1s Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwN CiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBb UlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUg W2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2Vd IDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUg YXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpb Y2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4N Cg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 08 to 15, 2025.

    Semgrep is hiring OCaml developers to help develop our supply chain security product!

    Aaron Acosta announced

    Semgrep is an application security company focused on detecting and remediating vulnerabilities. The static analysis engine is primarily written in OCaml. We're looking for a senior or staff software engineer to help us enhance our third-party vulnerability detection capabilities. The ideal candidate has owned a critical tool, has worked on an OCaml project, has experience leading development teams and mentoring, and has some experience with supply chain security.

    If this sounds interesting to you, see our job posting at Senior/Staff Program Analysis Engineer, Supply Chain! Let me know if you have any questions!

    Subprocess: a library for launching and communicating with Unix commands

    Aaron Christianson announced

    An OCaml library with documentation!?

    Yes. I realize it's unorthodox, but I thought I'd give it a shot.

    I began my programming journey a bit later than most, and I began it with Bash. Over the years I've grown apart from Bash and even written some semi-popular anti-Bash propaganda.

    However, while I'm not particularly a fan of shell programming languages, I've maintained a long-term interest in the types of automation tasks which the shell lends itself to, and I have a soft spot in my heart for languages which make this type of programming a priority—languages such as AWK, Perl and Ruby.

    Since learning OCaml, I always felt that it could be a good language for these kinds of jobs with its light syntax, extensive Unix interface and great regex libraries (I'm talking about Re and friends, not Str).

    However, I always felt the provided interfaces for working with processes were… not quite what I was looking for. Sys.command (combined with Filename.quote_command, of course) is OK for what it does, but it doesn't do much. The more extensive set of process handling commands in the Unix library make just about anything possible, but they don't feel good to me.

    So I set out to create a library for working with Unix commands which feels right to me. Subprocess focuses on safety and ease of use—in that order. I hope someone besides myself will feel the same about it.

    Note that this is the first release (and my first public OCaml library) and I welcome feedback and criticism.

    cudajit: Bindings to the cuda and nvrtc libraries

    Lukasz Stafiniak announced

    cudajit 0.7.0 is now available in the opam repository. It is now split into separate libraries covering NVRTC bindings and CUDA bindings, so that Nvrtc doesn't need CUDA drivers to run.

    Version 0.7.0 brings full native Windows compatibility.

    Version 0.6.0 improves memory safety and debuggability.

    cudajit.0.7.0 can be used with OCANNL neural_nets_lib.0.5.2 also in the opam repository. Enjoy!

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    Version 0.8 of qcheck-lin, qcheck-stm, and qcheck-multicoretests-util was just merged on the opam repository: https://github.com/ocaml-multicore/multicoretests/releases/tag/0.8

    The 0.8 release improves the error finding ability of the Lin_thread and STM_thread modes:

    • #540: Significantly increase the probability of context switching in Lin_thread and STM_thread by utilizing Gc.Memprof callbacks. Avoid on 5.0-5.2 without Gc.Memprof support.
    • #546: Speed up Lin's default string and bytes shrinkers.
    • #547: Add Util.Pp.{cst4,cst5}

    Happy testing! :smiley:

    Call for Volunteers to Help Maintain the Opam-Repository

    Shon announced

    The opam-repository needs your help! :camel::heart:

    tl;dr: Want to grow your OCaml connections and expertise while supporting a pillar of the ecosystem? Then join us as an opam-repository maintainer by commenting on the issue Volunteer to Maintain the opam Repository :raised_hand_with_fingers_splayed:!

    The opam-repository is the official store of package descriptions for the extended OCaml ecosystem. It serves more than 4400 packages thru the opam package manager and index, and it is approaching 200 new packages and releases per month. The opam system is unique among widely used programming language packaging systems in offering the following:

    • It supports system dependencies to abstract over the packaging complexities of most commonly used platforms.
    • It is tested by an extensive CI matrix to ensure packages are working, installable, and interoperable.
    • It is curated to cultivate an ecosystem of high quality, useful packages.

    This all takes a lot of work and it presents a wide field of interesting socio-technical problems and exciting opportunities.

    Here are two of the projects we've tackled recently:

    The opam-repository maintainers needs the help of curious and motivated volunteers, like you!

    Opportunities

    This is a great opportunity for newer and seasoned members of the OCaml community to serve a critical function and make a big impact on the sustainability and health of our growing ecosystem:

    • Connect with and support contributors from across the ecosystem.
    • Contribute to a large, long-running open source project.
    • Learn from an experienced group of caring and committed maintainers.
    • Learn advanced techniques in packaging management, in a variety of build systems, and in every niche of the extended OCaml ecosystem.
    • Help to evolve the tooling, infrastructure, and processes that enable our distributed community to share programs!

    Next steps

    We look forward to working with you!

    – The Opam Repository Maintainers

    Dune package management update

    Marek Kubica announced

    Hi fellow camel-wranglers,

    It has been a bit quiet with updates lately with regards to the Dune package management feature, but it doesn't mean that the work has stalled. We're still continuing and got to a point where the code is mature enough to test it on all packages in OPAM-repository.

    Some of you might be aware of OPAM-health-check: a tool/service that monitors how much of the OPAM ecosystem can be built successfully. We extended it to build packages with Dune.

    It's a bit of a longer read, with all the explanations and thoughts that went into this, but I am sure it'll be interesting for you what challenges we had, what progress happened in the last few months and most importantly, where we currently are:

    https://tarides.com/blog/2025-04-11-expanding-dune-package-management-to-the-rest-of-the-ecosystem/

    We're of course not done yet. So expect more update posts as we try to get as many projects working as possible in the future. If you have questions, ideas, suggestions, feel free to drop in in this thread :-)

    Thanks go out to my coworkers involved in this effort (@gridbugs @maiste @art-w @ElectreAAS @shym @mtelvers).

    Ocsigen public meeting

    Continuing this thread, Vincent Balat announced

    Thank you for the attendance! This was a very dense meeting :) The minutes of the meeting are available here

    Looking for Maintainers / Moderators for the OCaml Cookbook

    Sabine Schmaltz announced

    Hi everyone,

    after we added the OCaml Cookbook on OCaml.org, we got into a position where we

    1. had contributions sitting around for a while because we did not have the capacity to review and moderate these additions, and
    2. felt we do not have a good enough understanding of the ecosystem in general to assess whether the chosen libraries are reasonable, or whether there's other options that need to be mentioned.

    To make the cookbook really useful, we need to build a better process around maintaining it and adding to it.

    I propose:

    1. We appoint a handful of moderators / maintainers for the OCaml Cookbook, drawing from volunteers.
    2. I create a Telegram group to stay in contact with you all to ask for help on cookbook PRs. (This could a group focused precisely on the OCaml Cookbook.)

    So, if you're up for helping with the cookbook, have any questions, or other remarks, please reach out to sabine@tarides.com, or reply here! :orange_heart:

    SCGI library for OCaml and eio

    Marc Coquand announced

    Hey everyone!

    To learn a bit of networking and eio, I wrote an scgi library with eio support. It aims to just implement the scgi protocol and a few helpers for writing HTTP responses. It's still very new, and I am looking for feedback on the interface and implementation before I publish it to opam.

    Here's a simple ping/pong example to get started:

    open Scgi_eio
    
    let handler (request : Request.t) =
      match Request.path request with
      | ["ping"] ->
          Http_response.body_string `Ok "pong"
      | _ ->
          Http_response.body_status `Not_found
    
    let () : unit =
      let port = 3000 in
      Eio_main.run
      @@ fun env ->
      let addr = `Tcp (Eio.Net.Ipaddr.V4.loopback, port) in
      let net = Eio.Stdenv.net env in
      Eio.Switch.run
      @@ fun sw ->
      let conn = Eio.Net.listen net ~sw ~reuse_addr:true ~backlog:5 addr in
      Eio.traceln "Listening to connections on port %s" (string_of_int port) ;
      Eio.Net.run_server conn
        (Scgi_eio.http_server ~settings:Scgi_eio.default_settings handler)
        ~on_error:(Eio.traceln "Error handling connection: %a" Fmt.exn)
    

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=G3a7Qune; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=TpJUMw3Q; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 44C6540068 for ; Tue, 22 Apr 2025 12:08:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MnhJPdKpr4YSMZkrDab8O6m+3evmjF8FzjdavChdURA=; b=G3a7Qune6qCB4RpIQPNemnuB3qTiUzZ2Z9JXuI5pbHkgSorjpjNa02LQ hRycUc7p9GaVPsUiJ9q8J6UGnCWMvd006PVPQSV+B+dxsGdEocFqfq7wW h25nq5tfyNYBMiSr6EzSGWL4WLWSvkAnQMc74rZkVtkpAtbrnHZx9rI32 g=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,231,1739833200"; d="scan'208,217";a="218870453" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 22 Apr 2025 13:50:29 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 4E6E5E0D37; Tue, 22 Apr 2025 13:50:28 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id C6000E0261 for ; Tue, 22 Apr 2025 13:50:25 +0200 (CEST) IronPort-SDR: 6807827b_Qy38tLBA76FzOlWziuXky1z8YzLR6duPW1LyvJ9OmPzOsYq tuP1SNfYGzuVBZ2IO/iR9TeBwB1DF2hzMTKCpJA== X-IPAS-Result: =?us-ascii?q?A0HCCgAfggdohSIeaIFagl6BP1soGQFjWjMHCEiEVYNPj?= =?us-ascii?q?iKBFpA0iEiCL4FpgREDLiMUAQMBDS4BDgQBAgQBAQMBAgGCDIIuRgKLLQIfB?= =?us-ascii?q?gEENBMBAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEBgECEAEBAQFASYV7D?= =?us-ascii?q?UkBAQEDAQoBgWpRcYElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAggEAQIFEhcuQAECBgoTAQEmAwcIGBYNAxQBBgMCEQE1A?= =?us-ascii?q?wETARIUBgKCDhREAYIfRQMFDAaTe5tLeoEygQGCDAEBBoEIPgIDDQMPL9oHg?= =?us-ascii?q?UsaCYExGIVtgkkaASpIawKESAmEMycPgVVEgRU1gj0Hb4FCgQgMCwEBAQEYg?= =?us-ascii?q?R0HAQEGAgkLJAwBCYMlgmmCGhdFPhQfKh6BW4IFgQuGZIEgh0IoSCuCEIkVg?= =?us-ascii?q?UdLMywBVRMXCwcFYYELAyo0MXE1HYF6g26FNYIRggSJD4RSLU+FMmgdQAMLb?= =?us-ascii?q?T03FBuYRh4iGoMfLwcHOAgFJAMSDRQBEwEGCQUFCx8BARAQAgcmAQgFBAULG?= =?us-ascii?q?AgHAwUPAQQOAwYCBAkOAhQGHw4BCwcEAisCA5JFDxMSAyoDdJxtlF80B4Qeg?= =?us-ascii?q?V4GDIkFgSSCWI9Og1eEA4FXhT2FdYcAkksimFwighAmhieBAAqBGwmBb2qGD?= =?us-ascii?q?IFNgi6JNoITBgQPBAmDPIF9gX4jgSsBHQwHMxowIiENBoIgAQEBMQkJPRwPV?= =?us-ascii?q?4gFhVEWg16BPoEmgXQ7vGUDQTUCAQE4AgcBCgEBAwmFYgEBaYIbghdug3sCJ?= =?us-ascii?q?gxrYAEB?= IronPort-PHdr: A9a23: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 JPuiQ== IronPort-Data: A9a23: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 tVh3pTmOHm4FQ== IronPort-HdrOrdr: A9a23:k9bjk6vXkmje1JIhoieqDjVb7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3AAbOH2miEZ2UiRZ5Vsq9dMqEWSDJubm3QnXiBDAi?= =?us-ascii?q?BN3dRULy8WwGr//tgup87?= X-Talos-MUID: 9a23:AUhnWgS4ADaZEOy/RXTqqz4/b8JGupj1VkALwbscltO2EiNJbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,230,1739833200"; d="scan'208,217";a="114868548" X-MGA-submission: =?us-ascii?q?MDGLdRhbBFaQGMScgB1lgDKog4xTlcFunr1YLx?= =?us-ascii?q?gdMh7BRc00phbbHPVvJL7iTAkHVUQfU61vVlnzf8dsBD45wKonnb42Fb?= =?us-ascii?q?/Ii3a2TQY+gRUgHJTTvmJD8fhA9nmELeJBDfU9tDmam8B9q2WZwD/lXP?= =?us-ascii?q?3sexPQrxOzZ6gcc8EpQ+YWuQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Apr 2025 13:50:19 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 18BAA564B72; Tue, 22 Apr 2025 13:50:18 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1745322618; bh=YGZB5BaI+9f+/yD8CfGP0Uwdt2LGSl6OnjSe8INXHE4=; h=From:To:Subject:Date:Message-ID; b=TpJUMw3QPrVgm5u+r0hNeDDd88vdOWAzhmBdZj+3BpSvxPrNCX983WMuQuMQ4lo4R 850rXnaUKgzDg53mmxGx5sCwiRneOwT0vo9i6cJ/WTdxc5EQtCdLja91JwX0eBsJc5 KUPTO2axSb7in0gEUIcZrYnk/eQ/UogHrmV5WjW0= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 22 Apr 2025 13:50:16 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 22 13:50:18 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.385001, queueID=512DD564B75 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19299 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 15 to 22, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Flambda2 Ep. 4: How to write a purely functional compiler, by OCamlPro R and D Engineer Positions available at OCamlPro, in Paris (France) Release of ocaml-eglot 1.2.0 Outreachy December 2024 Round Dune 3.18 opam 2.4.0~alpha1 ML Family Workshop 2025: Call for Presentations Other OCaml News Old CWN Flambda2 Ep. 4: How to write a purely functional compiler, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 *Greetings Cameleers!* We're back with another deep dive into the *Flambda2 Optimizing Compiler*! Our latest entry in the *Flambda2 Snippets* blog series is out ! [Flambda2 Ep. 4: How to write a purely functional compiler] *Beware, this episode is a hefty one ! :muscle: :triumph:* This time again, we take you on a journey through the heart of *Flambda2*'s optimization process. Indeed, we take a look at the high-level considerations of `Simplify', the main optimization algorithm! This post is the most important one yet. The subject is key to coming to grasps with the philosophy and design behind our home-made compiler and we highly recommend that you read it if you're interested in *functional programming*, *exotic compiler architectures*, *novel engineering*, and *programming language representation*! If you've been following [the series], this article builds on what we've covered before =E2=80=94 especially [*Foundational Design Decisions= *] (episode 1), and [*Speculative inlining*] (episode 3) =E2=80=94 so you mi= ght want to check these out first. And as always, this is all leading up to even more compiler spelunking in future posts! :pick: Hope you enjoy the read, and let us know what you think! Until next time, *The OCamlPro Team* [Flambda2 Ep. 4: How to write a purely functional compiler] [the series] [*Foundational Design Decisions*] [*Speculative inlining*] R and D Engineer Positions available at OCamlPro, in Paris (France) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Greetings Cameleers, We are thrilled to announce that *OCamlPro is hiring!* OCamlPro is a R&D lab founded in 2011, with the mission to help industrial users benefit from experts with a state-of-the-art knowledge of programming languages theory and practice. We provide audit, support, custom developer tools and training for both the most modern languages, such as Rust, Wasm and OCaml, and for legacy languages. We design, create and implement software with great added-value for our clients. We have a long history of creating and maintaining open-source projects, such as the Opam package manager, the LearnOCaml web platform, Ocp-indent / Ocp-index, Flambda and Flambda2 optimizing OCaml compilers. We also contributed to the Rust compiler and standard library, and are now core contributors of the GnuCOBOL project. We are also experts of Formal Methods, developing tools such as our SMT Solver Alt-Ergo. We are currently looking to hire *French speaking* *Senior* and *non-Senior R&D Engineers* as well as new *Project Managers*. Since *speaking French is mandatory*, the rest of this article, and the job offers linked below, will be written in French. :france: OCamlPro recrute : =E2=80=A2 *Un=C2=B7e Ing=C3=A9nieur=C2=B7e R&D Senior* Conception et dev en OCaml (et Rust), encadrement, relation client, exploration techno, perfs, tests, veille et formations. Poste cl=C3=A9 = au c=C5=93ur d=E2=80=99une =C3=A9quipe experte. =E2=80=A2 *Un=C2=B7e Ing=C3=A9nieur=C2=B7e R&D* D=C3=A9veloppement en OCaml (et Rust), conception logicielle, perfs, tests, veille techno, mont=C3=A9e en comp=C3=A9tences et travail en =C3= =A9quipe experte. =E2=80=A2 *Un=C2=B7e Chef=C2=B7fe de Projet Informatique & R&D* Pilotage de projets, coordination d=E2=80=99=C3=A9quipes, interface cli= ent, suivi budget/d=C3=A9lais, reporting, et veille techno dans un environnement innovant. Notre =C3=A9quipe est principalement bas=C3=A9e =C3=A0 Paris, mais nous s= ommes ouverts au travail =C3=A0 distance, tant que des s=C3=A9jours r=C3=A9guli= ers =C3=A0 Paris sont possibles pour renforcer la coh=C3=A9sion de l'=C3=A9quipe. Veuillez envoyer votre CV ainsi qu'une description de certaines de vos meilleures r=C3=A9alisations =C3=A0 l'adresse suivante : [contact@ocamlpro.com]() *Vous trouverez des fiches de poste d=C3=A9taill=C3=A9es au format PDF ic= i :* Release of ocaml-eglot 1.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We (at [Tarides]) are *particularly pleased* to announce the release of [OCaml-eglot] `1.2.0', An overlay on [Eglot] (the /built-in/ [LSP] client for Emacs) for editing OCaml! `ocaml-eglot' is an *alternative mode* to [`merlin'] which uses [`ocaml-lsp-server'] (instead of `ocamlmerlin') as the language server. So yes, if you decide to use~ocaml-eglot~, `merlin' *is no longer needed*. (Merlin is still used as a library, in `ocaml-lsp-server'). =E2=80=A2 [Release note] =E2=80=A2 [Github repository] =E2=80=A2 [Package on MELPA] =E2=80=A2 [Features list] =E2=80=A2 [Installation procedure] =E2=80=A2 [Comparison table with Merlin] This version discreetly improves the ergonomics of certain orders, gives more control over customer-side order support and drastically improves error handling! Here's the full changelog and, in the meantime, I'm adding the changelog for version `1.1.0', which hadn't been announced: [Tarides] [OCaml-eglot] [Eglot] [LSP] [`merlin'] [`ocaml-lsp-server'] [Release note] [Github repository] [Package on MELPA] [Features list] [Installation procedure] [Comparison table with Merlin] `1.2.0' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Fix Type-enclosing's buffer update when using `caml-mode' ([#48= ]) =E2=80=A2 Add `ocaml-eglot-search-definition', `ocaml-eglot-search-declaration' and alternative functions ([#45]) =E2=80=A2 Fix some warnings on byte-compilation ([#40]) =E2=80=A2 Fix error on on `ocaml-eglot-construct' ([#42]) =E2=80=A2 `ocaml-eglot-alternate-file' now visits file in other window wh= en prefix argument is set ([#51]) =E2=80=A2 Add error-handling for jsonrpc-request ([#52]) =E2=80=A2 Maintain more diagnostics for location failure ([#52]) =E2=80=A2 Fix hole cycle navigation ([#53]) =E2=80=A2 Relay on custom request (if it is available) for managing holes ([#53]) =E2=80=A2 Implementation of support for experimental client commands (and implementation of `ocaml.next-hole' in the presence of the `ocaml-eglot-destruct' action) ([#54]) [#48] [#45] [#40] [#42] [#51] [#52] [#53] [#54] `1.1.0' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 A first support for `flycheck' ([#29], [#33] and [#37]) =E2=80=A2 Use a more efficient way to ensure that a vector is empty ([#27= ]) =E2=80=A2 Made the mode-line "lighter" more conventional ([#26]) [#29] [#33] [#37] [#27] [#26] Spotlight on new features =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Two easily observable features: =E2=97=8A Finding an identifier =E2=80=A2 `ocaml-eglot-find-identifier-declaration' =E2=80=A2 `ocaml-eglot-find-identifier-definition' the two commands behave like their analogues (`ocaml-eglot-find-definition' and `ocaml-eglot-find-declaration') but allow the user to enter the identifier directly: =E2=97=8A Searching for a definition or a declaration =E2=80=A2 `ocaml-eglot-search-declaration' =E2=80=A2 `ocaml-eglot-search-definition' Allows you to search by type or polarity to find the definition (implementation) or declaration (signature) of values! Upgrading =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C The release is available on MELPA, so you can update it using the usual process. As always, your feedback is invaluable! _Happy hacking_ Outreachy December 2024 Round =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Thank you everyone who came along to our demo day. I think I speak for everyone when I say @abdulaziz.alkurd's work is very impressive and we all can't wait for being able to easily diff OCaml APIs! The meeting has now been published: Dune 3.18 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to announce the release of Dune `3.18.1' :camel: This version is a minor release that contains a bug fix to an issue that was preventing `pkg-config' from finding some libraries in some contexts. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 fix: pass pkg-config (extra) args in all pkgconfig invocations.= A missing `--personality' flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA) opam 2.4.0~alpha1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the first alpha release of opam 2.4.0. This version is an alpha, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release. What=E2=80=99s new? Some highlights: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :dragon_face: *On `opam init' the compiler* chosen for the defa= ult switch will *no longer be `ocaml-system'* ([#3509]) This was done because the system compiler (as-is your ocaml installed system wide, e.g. /usr/bin/ocaml) is known to be under-tested and prone to a variety of bugs and configuration issues. Removing it from the default compiler allows new-comers a more smooth experience. *Note: if you wish to use it anyway, you are always able to do it explicitly using `opam init --compiler=3Docaml-system'* =E2=80=A2 :camel: GNU *`patch'* and the *`diff'* command are *no longer runtime dependencies*. Instead the OCaml `patch' library is used ([#6019], [#6052], [#3782], [ocaml/setup-ocaml#933]) Doing this we've removed some rarely used features of GNU Patch such as the support of [Context diffs]. The new implementation only supports [Unified diffs] including the [git extended headers], however file permission changes via said extended headers have no effect. =E2=80=A2 :snowflake: Add *Nix support* for *external dependencies (depex= ts)* by adding support for stateless package managers ([#5982]). *Thanks to [@RyanGibb] for this contribution* =E2=80=A2 :cockroach: *Fix `opam install '* with and without options like `--deps-only' or `--show-action' having *unexpected behaviours* ([#6248], [#5567]) such as: =E2=80=A3 reporting `Nothing to do' despite dependencies or package not being up-to-date =E2=80=A3 asking to install the wrong dependencies =E2=80=A2 :ocean: Many more UI additions and improvements, bug fixes, performance improvements, =E2=80=A6 :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [#3509] [#6019] [#6052] [#3782] [ocaml/setup-ocaml#933] [Context diffs] [Unified diffs] [git extended headers] [#5982] [@RyanGibb] [#6248] [#5567] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.4.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.4.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] ML Family Workshop 2025: Call for Presentations =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sam announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are happy to invite submissions to the 2025 ML Family Workshop! Please help spread the word and consider submitting! Higher-order, Typed, Inferred, Strict: ML Family Workshop 2025 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Co-located with [ICFP/SPLASH] *Workshop date*: October 16, 2025, Singapore *Submission deadline*: June 19, 2025 The ML Family Workshop is an established informal workshop serving to promote and inform the development of programming languages in the ML family (such as OCaml, Standard ML, F#, and many others) as well as related languages (such as Haskell, Scala, Rust, Koka, F*, Eff, ATS, Nemerle, Links, etc.) We welcome presentations on all aspects of the design, semantics, theory, application, implementation, and teaching of languages in the entire extended ML family. The ML 2025 workshop will continue the informal approach followed since 2010. Presentations are selected by the program committee from submitted proposals. There are no published proceedings, so contributions may be submitted for publication elsewhere. The main criterion is promoting and informing the development of the entire extended ML family and delivering a lively workshop atmosphere. We particularly encourage talks about works in progress, presentations of negative results (things that were expected to but did not quite work out) and informed positions. Each presentation should take 20-25 minutes. The exact time will be decided based on scheduling constraints. We plan the workshop to an be in-person event with remote participation (streamed live). We hope that speakers are able to present in person. If a speaker is unable to attend, they may instead present remotely. The 2025 ML family workshop is co-located with ICFP/SPLASH 2025 and will take place on *October 16, 2025* in Singapore. [ICFP/SPLASH] Scope =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We seek presentations on topics including (but not limited to): =E2=80=A3 Language design: abstraction, higher forms of polymorphism, concurrency and parallelism, distribution and mobility, staging, extensions for semi-structured data, generic programming, object systems, etc. =E2=80=A3 Implementation: compilers, interpreters, type checkers, partial evaluators, runtime systems, garbage collectors, foreign function interfaces, etc. =E2=80=A3 Type systems: inference, effects, modules, contracts, specifica= tions and assertions, dynamic typing, error reporting, etc. =E2=80=A3 Applications: case studies, experience reports, pearls, etc. =E2=80=A3 Environments: libraries, tools, editors, debuggers, cross-langu= age interoperability, functional data structures, etc. =E2=80=A3 Semantics of ML-family languages: operational and denotational semantics, program equivalence, parametricity, mechanization, etc. We specifically encourage reporting what did not meet expectations or what, despite all efforts, did not work to satisfaction. Four kinds of submissions are solicited: Research Presentations, Experience Reports, Demos, and Informed Positions. =E2=80=A3 Research Presentations: Research presentations should describe = new ideas, experimental results, or significant advances in ML-related projects. We especially encourage presentations that describe work in progress, that outline a future research agenda, or that encourage lively discussion. These presentations should be structured in a way which can be, at least in part, of interest to (advanced) users. =E2=80=A3 Experience Reports: Users are invited to submit Experience Repo= rts about their use of ML and related languages. These presentations do not need to contain original research but they should tell an interesting story to researchers or other advanced users, such as an innovative or unexpected use of advanced features or a description of the challenges they are facing or attempting to solve. =E2=80=A3 Demos: Live demonstrations or short tutorials should show new developments, interesting prototypes, or work in progress, in the form of tools, libraries, or applications built on or related to ML and related languages. (You will need to provide all the hardware and software required for your demo; the workshop organizers are only able to provide a projector.) =E2=80=A3 Informed Positions: A justified argument for or against a langu= age feature. The argument must be substantiated, either theoretically (e.g., by a demonstration of (un)soundness, an inference algorithm, a complexity analysis), empirically or by substantial experience. Personal experience is accepted as justification so long as it is extensive and illustrated with concrete examples. Submission details =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C Submissions must be in the PDF format and have a short summary (abstract) at the beginning. Submissions in the categories of Experience Reports, Demos, or Informed Positions should indicate so in the title or subtitle. The point of the submission should be clear from its two first pages (PC members are not obligated to read any further.) Submissions must be uploaded to the workshop submission website before the submission deadline. Only the short summary/abstract of accepted submissions will be published on the conference website. After acceptance, authors will have the opportunity to attach or link to that summary any relevant material (such as the updated submission, slides, etc.) *Submission Website*: *Workshop Website*: Dates and Deadlines =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C *Submission Deadline*: Thursday, June 19 AoE *Initial Author Notification* (most cases): Thursday, July 31 *Final Author Notification* (if needed): Thursday, Aug 7 *Workshop Date*: Thursday, Oct 16 Program Committee =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C =E2=80=A3 Sam Westrick (New York University, USA) (Chair) =E2=80=A3 Michael D. Adams (National University of Singapore, Singapore) =E2=80=A3 Jonathan Brachth=C3=A4user (University of T=C3=BCbingen, German= y) =E2=80=A3 Chris Casinghino (Jane Street, USA) =E2=80=A3 Arthur Chargu=C3=A9raud (INRIA, France) =E2=80=A3 Kiran Gopinathan (University of Illinois Urbana-Champaign, USA) =E2=80=A3 Mirai Ikebuchi (Kyoto University, Japan) =E2=80=A3 Keigo Imai (DeNA Co., Ltd., Japan) =E2=80=A3 Anton Lorenzen (University of Edinburgh, UK) =E2=80=A3 Cyrus Omar (University of Michigan, USA) =E2=80=A3 Zoe Paraskevopoulou (National Technical University of Athens, Greece) =E2=80=A3 Filip Sieczkowski (Heriot-Watt University, UK) =E2=80=A3 Yong Kiam Tan (A*STAR Institute for Infocomm Research, Singapor= e) =E2=80=A3 Yuting Wang (Shanghai Jiao Tong University, China) Past Iterations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 2024: =E2=80=A2 2023: =E2=80=A2 2022: =E2=80=A2 2021: More info: Coordination with the OCaml Users and Developers Workshop =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml workshop is seen as more practical and is dedicated in significant part to OCaml community building and the development of the OCaml system. In contrast, the ML family workshop is not focused on any language in particular, is more research-oriented, and deals with general issues of ML-style programming and type systems. There is some overlap, which we are keen to explore in various ways. The authors who feel their submission fits both workshops are encouraged to mention it at submission time or contact the program chairs. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Outreachy December 2024 Demo] [the ocaml.org blog] [Outreachy December 2024 Demo] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News
    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=boxqMPpQ; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id DFC1A400A6 for ; Tue, 29 Apr 2025 08:39:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=GqcK9p9kVr/GdqC2pDFC81YP0koC+yVG9JsH3qUEfbQ=; b=boxqMPpQiVmsuSVapxk6rXbEOK+LzcWrXsthWWSkhk8VaXD3kx2xBmCS mjxjnLX1jw7N6JbP4QmuJEZIiUPfLBEEaEMFiT3ojymuXFUVqLtRazOZy w+Vj4zqqLq9l6QvFnSJBxqTpZ9aXf56oeNZ7ip4oahT5wJ4lyeumt7di+ k=; Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.15,248,1739833200"; d="scan'208,217";a="219891494" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Apr 2025 10:39:51 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 538E7E0D1D; Tue, 29 Apr 2025 10:39:50 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id A6CCDE007A for ; Tue, 29 Apr 2025 10:39:48 +0200 (CEST) X-IronPort-AV: E=Sophos;i="6.15,248,1739833200"; d="scan'208,217";a="219891456" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Apr 2025 10:39:48 +0200 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 29 Apr 2025 10:39:48 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19311 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjIgdG8gMjksDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmRyZWFtLWh0 bWwsIHB1cmUtaHRtbCAzLjEwLjAgYW5kIDMuMTAuMQ0KU3RhdGUgb2YgT0NhbWwgUGxhdGZvcm0g b24gV2luZG93cw0KVXBncmFkaW5nIFNlbWdyZXAgZnJvbSBPQ2FtbCA0IHRvIE9DYW1sIDUgKyBk eW5hbWljX2djIHV0aWxpdHkNClR5cGVzYWZlIGNvbXBsaWNhdGVkIGNvbWJpbmF0aW9ucw0KT3Ro ZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCmRyZWFtLWh0bWwsIHB1cmUtaHRtbCAzLjEwLjAg YW5kIDMuMTAuMQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZHJlYW0taHRtbC1wdXJlLWh0bWwtMy0xMC0wLTMtMTAtMS8xNjUzNy8xPg0KDQoN Cllhd2FyIEFtaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIYXBweSB0byBhbm5vdW5jZSBhIGNvdXBs ZSBvZiByZWxlYXNlcyBvZiBbZHJlYW0taHRtbF06DQoNCiAgMy4xMC4wOiBhZGQgc3VwcG9ydCBm b3IgW1JTUy9BdG9tXSBtYXJrdXA7IGFkZCBhYmlsaXR5IHRvIGhhbmRsZQ0KICBbbXVsdGlwbGVd IG5lc3RlZCBmb3JtIHZhbHVlczsgW2NvbmNhdGVuYXRlXSBIVE1MIG5vZGVzIHdpdGggYQ0KICBz ZXBhcmF0b3Igbm9kZSBiZXR3ZWVuIHRoZW07IGFkZCBzdXBwb3J0IGZvciBbcG9wb3ZlcnNdIGFu ZA0KICBbRGVjbGFyYXRpdmUgU2hhZG93IERPTV0gbWFya3VwLg0KDQogIDMuMTAuMTogdXNlIHNp bmdsZSBxdW90ZXMgZm9yIGF0dHJpYnV0ZXMgd2hpY2ggbXVzdCBjb250YWluIEpTT04NCiAgdmFs dWVzLCBsaWtlIGh0bXgncyBbaHgtdmFsc10uDQoNCg0KW2RyZWFtLWh0bWxdIDxodHRwczovL2dp dGh1Yi5jb20veWF3YXJhbWluL2RyZWFtLWh0bWw+DQoNCltSU1MvQXRvbV0NCjxodHRwczovL3lh d2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9wdXJlLWh0bWwvUHVyZV9odG1sLyNyc3MtYW5k LWF0b20+DQoNClttdWx0aXBsZV0NCjxodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0t aHRtbC9kcmVhbS1odG1sL0RyZWFtX2h0bWwvRm9ybS9pbmRleC5odG1sI3ZhbC1tdWx0aXBsZT4N Cg0KW2NvbmNhdGVuYXRlXQ0KPGh0dHBzOi8veWF3YXJhbWluLmdpdGh1Yi5pby9kcmVhbS1odG1s L3B1cmUtaHRtbC9QdXJlX2h0bWwvI3ZhbC1jb25jYXQ+DQoNCltwb3BvdmVyc10NCjxodHRwczov L3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9wdXJlLWh0bWwvUHVyZV9odG1sL0hUTUwv aW5kZXguaHRtbCN2YWwtcG9wb3Zlcj4NCg0KW0RlY2xhcmF0aXZlIFNoYWRvdyBET01dDQo8aHR0 cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvcHVyZS1odG1sL1B1cmVfaHRtbC9I VE1ML2luZGV4Lmh0bWwjdmFsLXNoYWRvd3Jvb3RjbG9uYWJsZT4NCg0KW2h4LXZhbHNdDQo8aHR0 cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvcHVyZS1odG1sL1B1cmVfaHRtbC9I eC9pbmRleC5odG1sI3ZhbC12YWxzPg0KDQoNClN0YXRlIG9mIE9DYW1sIFBsYXRmb3JtIG9uIFdp bmRvd3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXN0YXRlLW9mLW9j YW1sLXBsYXRmb3JtLW9uLXdpbmRvd3MvMTY1NDAvMT4NCg0KDQpMZWFuZHJvIE9zdGVyYSBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvIGZvbGtzIDp3YXZpbmdfaGFuZDoNCg0K ICBXZSdyZSBoYXBweSB0byBzaGFyZSB0aGUgZmlyc3QgdmVyc2lvbiBvZiB0aGUgU3RhdGUgb2Yg dGhlIE9DYW1sDQogIFBsYXRmb3JtIG9uIFdpbmRvd3MgZG9jdW1lbnQgd2l0aCB5b3UuIFBsZWFz ZSBmaW5kIHRoZSBkb2N1bWVudCBoZXJlOg0KICA8aHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vZG9j dW1lbnQvZC8xLWFUeWd6RHN4eTRtbnF2U0tFVmhpZkExS0RSeVAtQXhkb2dqZ2I4aTNHZy9lZGl0 P3VzcD1zaGFyaW5nPi4NCg0KICBBcyBwYXJ0IG9mIHRoZSBbRmlyc3QtQ2xhc3MgV2luZG93c10g cHJvamVjdCwgd2UndmUgYmVlbiBhc3Nlc3NpbmcgdGhlDQogIHN0YXRlIG9mIE9DYW1sIG9uIFdp bmRvd3MuIFRoaXMgZG9jdW1lbnQgaXMgYSBzdW1tYXJ5IG9mIG91cg0KICBpbnZlc3RpZ2F0aW9u LCBpbmNsdWRpbmcgb3VyIGNvbnN1bHRhdGlvbnMgd2l0aCBpbmRpdmlkdWFscyBpbnZvbHZlZA0K ICBpbiBXaW5kb3dzLXJlbGF0ZWQgd29yay4NCg0KICBUaGlzIGRvY3VtZW50IHN0YXJ0ZWQgaW50 ZXJuYWxseSBhdCBUYXJpZGVzIGFuZCBxdWlja2x5IGluY2x1ZGVkIG1ham9yDQogIGNvbnRyaWJ1 dG9ycyBhbmQgdXNlcnMgb2YgT0NhbWwgb24gV2luZG93cyBmb3IgaXRzIGRyYWZ0aW5nIGFuZCBy ZXZpZXcNCiAgc3RhZ2VzLiBUaGFuayB5b3UgdG8gQGpiZWNrZm9yZCwgQGtsYWtwbG9rLCBAVmlu Y2VudF9CYWxhdCwgQFJ1Y2lraXIsDQogIEBsYW1iZGFfZm9vLCBAcmlrdXNpbHZvbGEsIEBrYXlj ZWVzcmssIEBkcmEyNywgQElzYWJlbGxhLCBAcmpib3UsDQogIEBhdnNtLCBAa2VudG9va3VyYSwg QG9hbmRyaWV1LCBAc2hvbmZlZGVyLCBAc2FiaW5lLCBhbmQgZXZlcnlvbmUgZWxzZQ0KICBhdCBU YXJpZGVzIGZvciBoZWxwaW5nIHVzIHNoYXBlIGFuZCByZXZpZXcgdGhpcyBkb2N1bWVudCENCiAg OmZvbGRlZF9oYW5kczoNCg0KICBUaGUgaW1tZWRpYXRlIGNhbGwgdG8gYWN0aW9uIGZvciB5b3Ug aXMgdG8gZ2l2ZSB1cyB5b3VyIGlucHV0cyBhbmQNCiAgdGhvdWdodHMsIGNoYWxsZW5nZSBpdCBh bmQgaGVscCB1cyBtYWtlIGl0IGJldHRlci4gWW91IGNhbiBkbyB0aGlzDQogIGRpcmVjdGx5IG9u IHRoYXQgZG9jdW1lbnQsIG9yIGJ5IHF1b3RpbmcgaW50byB0aGlzIHRocmVhZC4NCg0KICBXZSds bCBoYXZlIGEgd2luZG93IG9mIDggd2Vla3MgdG8gYWxsb3cgZm9yIHRoaXMgdG8gaGFwcGVuLiBB ZnRlciB0aGF0DQogIHdlIHdpbGwgbW92ZSB0aGlzIGludG8gdGhlIE9DYW1sIFBsYXRmb3JtIHNl Y3Rpb24gb2YgT0NhbWwub3JnIHRvIHVzZQ0KICBhcyBhIHJlZmVyZW5jZSBhbmQga2VlcCBpdCB1 cGRhdGVkIG92ZXIgdGltZS4NCg0KICBIYXBweSBjb2RpbmchIDp0d29faHVtcF9jYW1lbDoNCg0K ICAvIEBzdWRoYSAmIEBsZW9zdGVyYSBvbiBiZWhhbGYgb2YgVGFyaWRlcw0KDQoNCltGaXJzdC1D bGFzcyBXaW5kb3dzXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI0LTA1LTIyLWxhdW5j aGluZy10aGUtZmlyc3QtY2xhc3Mtd2luZG93cy1wcm9qZWN0Lz4NCg0KDQpVcGdyYWRpbmcgU2Vt Z3JlcCBmcm9tIE9DYW1sIDQgdG8gT0NhbWwgNSArIGR5bmFtaWNfZ2MgdXRpbGl0eQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC91 cGdyYWRpbmctc2VtZ3JlcC1mcm9tLW9jYW1sLTQtdG8tb2NhbWwtNS1keW5hbWljLWdjLXV0aWxp dHkvMTYyNTYvNT4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBOYXQgTW90ZSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkndmUganVzdCByZWxlYXNlZCBhIG5ldyB2ZXJzaW9uIHRo YXQgaW5jbHVkZXMgdGhlIGZvbGxvd2luZyBtb2R1bGU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiBtb2R1bGUgQ29uZmlnIDogc2lnDQogIOKUgiAgICgqKiBQcm9kdWNlcyBhIHNpbXBsZSBj b25maWcgdGhhdCB3aWxsIHNldCBzcGFjZV9vdmVyaGVhZCB0byAxMjAsIHRoZSBkZWZhdWx0LA0K ICDilIIgICAgKiB3aGVuIHRoZSBzaXplIG9mIHRoZSBtYWpvciBoZWFwIGlzIGJlbG93IHRoZSBn aXZlbiB0aHJlc2hvbGQuIFdoZW4gdGhlIGhlYXANCiAg4pSCICAgICogaXMgbGFyZ2VyIHRoYW4g dGhlIGdpdmVuIHRocmVzaG9sZCwgc3BhY2Vfb3ZlcmhlYWQgd2lsbCBiZSBzZXQgdG8gODAuICop DQogIOKUgiAgIHZhbCBzaW1wbGU6IHRocmVzaG9sZF9tYjppbnQgLT4gY29uZmlnDQogIOKUgiBl bmQNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhhdCB3aWxsIG1ha2UgdGhlIHV0aWxpdHkgZXZl biBlYXNpZXIgdG8gY29uZmlndXJlIHdoaWxlIHN0aWxsDQogIGFsbG93aW5nIHRoZSBhcHBsaWNh dGlvbiBkZXZlbG9wZXIgdG8gc2V0IGEgbWVtb3J5IHRocmVzaG9sZCB0aGF0IGlzDQogIHJlbGV2 YW50IHRvIHRoZW0uDQoNCg0KVHlwZXNhZmUgY29tcGxpY2F0ZWQgY29tYmluYXRpb25zDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Jsb2ctdHlwZXNhZmUtY29tcGxpY2F0ZWQtY29t YmluYXRpb25zLzE2NTQ4LzE+DQoNCg0KcmFuZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhleWEgZXZlcnlvbmUg4oCTDQoNCiAgSSd2 ZSBbd3JpdHRlbiBhIGJsb2dwb3N0XSBiYXNlZCBvbiBhIHJlY2VudCBleHBlcmllbmNlIGFkZGlu Zw0KICB0eXBlc2FmZXR5IHRvIHRoZSBgcG1tZCcgY29kZWJhc2Ug4oCTIGhhbmRsaW5nIGEgbG90 IG9mIGRpZmZlcmVudCBkYXRhDQogIGFuZCBmdW5jdGlvbnMgdGhhdCBuZWVkcyB0byBiZSBjb21i aW5lZCBpbiB0aGUgcmlnaHQgd2F5cy4NCg0KICBJbiBpdCBJIG1ha2UgdXNlIG9mIHBoYW50b20g dHlwZXMgYW5kIE9DYW1scyBtb2R1bGUgc3lzdGVtIHRvIGV4cHJlc3MNCiAgdGhlIGludmFyaWFu dHMgLSB3aGljaCBJIGZpbmQgaXMgYSBuaWNlIHNldCBvZiB0eXBlc3lzdGVtIGZlYXR1cmVzIHRv DQogIGV4cHJlc3MgY29tcGxpY2F0ZWQgcmVsYXRpb25zIGluIGEgcmVsYXRpdmVseSBzaW1wbGUg YnV0IGVmZmljaWVudCBhbmQNCiAgc2NhbGVhYmxlIHdheS4gQWxzbywgSSB0aGluayBpbnRlcmVz dGluZyBkZXNpZ24gcGF0dGVybnMgY2FuIGVtZXJnZQ0KICBmcm9tIHRoaXMgd2F5IG9mIHdvcmtp bmcuDQoNCiAgTGV0IG1lIGtub3cgaGVyZSBpZiB5b3UgaGF2ZSBhbnkgcXVlc3Rpb25zIG9yIGNv bW1lbnRzDQoNCiAgVGhhbmtzICg6DQoNCg0KW3dyaXR0ZW4gYSBibG9ncG9zdF0NCjxodHRwczov L3I3cDUuZWFydGgvYmxvZy8yMDI1LTQtMjUvVHlwZXNhZmUlMjBjb21wbGljYXRlZCUyMGNvbWJp bmF0aW9ucz4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdh dGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQogIOKAoiBbU1BGLCBES0lNLCBETUFS QyBhbmQgQVJDXQ0KICDigKIgW0ZlYXR1cmUgUGFyaXR5IFNlcmllczogUmVzdG9yaW5nIHRoZSBN U1ZDIFBvcnRdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Js b2cvPg0KDQpbU1BGLCBES0lNLCBETUFSQyBhbmQgQVJDXQ0KPGh0dHBzOi8vYmxvZy5yb2J1ci5j b29wL2FydGljbGVzLzIwMjUtMDQtMjMtZW1haWwtdmVyaWZpY2F0aW9uLmh0bWw+DQoNCltGZWF0 dXJlIFBhcml0eSBTZXJpZXM6IFJlc3RvcmluZyB0aGUgTVNWQyBQb3J0XQ0KPGh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDI1LTA0LTIzLWZlYXR1cmUtcGFyaXR5LXNlcmllcy1yZXN0b3Jpbmct dGhlLW1zdmMtcG9ydD4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJ ZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBh bmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNo aXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFs c28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3Jp YmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQg bWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0K W3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNT IGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24v Y3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5m by9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0Lz4NCg0K --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 22 to 29, 2025.

    dream-html, pure-html 3.10.0 and 3.10.1

    Yawar Amin announced

    Happy to announce a couple of releases of dream-html:

    3.10.0: add support for RSS/Atom markup; add ability to handle multiple nested form values; concatenate HTML nodes with a separator node between them; add support for popovers and Declarative Shadow DOM markup.

    3.10.1: use single quotes for attributes which must contain JSON values, like htmx's hx-vals.

    State of OCaml Platform on Windows

    Leandro Ostera announced

    Hello folks :waving_hand:

    We're happy to share the first version of the State of the OCaml Platform on Windows document with you. Please find the document here: https://docs.google.com/document/d/1-aTygzDsxy4mnqvSKEVhifA1KDRyP-Axdogjgb8i3Gg/edit?usp=sharing.

    As part of the First-Class Windows project, we've been assessing the state of OCaml on Windows. This document is a summary of our investigation, including our consultations with individuals involved in Windows-related work.

    This document started internally at Tarides and quickly included major contributors and users of OCaml on Windows for its drafting and review stages. Thank you to @jbeckford, @klakplok, @Vincent_Balat, @Rucikir, @lambda_foo, @rikusilvola, @kayceesrk, @dra27, @Isabella, @rjbou, @avsm, @kentookura, @oandrieu, @shonfeder, @sabine, and everyone else at Tarides for helping us shape and review this document! :folded_hands:

    The immediate call to action for you is to give us your inputs and thoughts, challenge it and help us make it better. You can do this directly on that document, or by quoting into this thread.

    We'll have a window of 8 weeks to allow for this to happen. After that we will move this into the OCaml Platform section of OCaml.org to use as a reference and keep it updated over time.

    Happy coding! :two_hump_camel:

    / @sudha & @leostera on behalf of Tarides

    Upgrading Semgrep from OCaml 4 to OCaml 5 + dynamic_gc utility

    Continuing this thread, Nat Mote announced

    I've just released a new version that includes the following module:

    module Config : sig
      (** Produces a simple config that will set space_overhead to 120, the default,
       * when the size of the major heap is below the given threshold. When the heap
       * is larger than the given threshold, space_overhead will be set to 80. *)
      val simple: threshold_mb:int -> config
    end
    

    That will make the utility even easier to configure while still allowing the application developer to set a memory threshold that is relevant to them.

    Typesafe complicated combinations

    rand announced

    Heya everyone –

    I've written a blogpost based on a recent experience adding typesafety to the pmmd codebase – handling a lot of different data and functions that needs to be combined in the right ways.

    In it I make use of phantom types and OCamls module system to express the invariants - which I find is a nice set of typesystem features to express complicated relations in a relatively simple but efficient and scaleable way. Also, I think interesting design patterns can emerge from this way of working.

    Let me know here if you have any questions or comments

    Thanks (:

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=PT76Y3yG; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=fDlH55gd; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id E00BF4003C for ; Tue, 6 May 2025 07:24:22 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=iNIsqejhgaFbgmZYBW7dNTit6m3Uo8fLXDqOHvLb05E=; b=PT76Y3yG0xZEPFYhi4EKrk4D++L7V7+popB8nwXWBO+YQMwOuPOCiPBV iYyxGyVv/3AKhNWIbm3xyYxaKbWWKyhxTt570MFqZRT4J34gkWIkumUZ/ mWvewpJHeyjPHDsdw8dBPYv3IBJN/5/aK6ZHbkYOhhRsJtuBE8yiIXR2m w=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,265,1739833200"; d="scan'208,217";a="220793069" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 06 May 2025 09:24:22 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 2D321E0AF6; Tue, 6 May 2025 09:24:22 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 651A1E0131 for ; Tue, 6 May 2025 09:24:19 +0200 (CEST) IronPort-SDR: 6819b921_in/kjwLhDIB5phOJzozV9VhMHBDv4kHY1FWDlerZJGCIgIJ MzU2bdU9PfgyFFQ+0ynVSm/eD5RCGJjDnTA/V7w== X-IPAS-Result: =?us-ascii?q?A0GmCAA4uBlojyIeaIFaHQEBPAEFBQECAQkBgWgCAYE+g?= =?us-ascii?q?QMZAWNaESIHCEmEVYNPjiKRSohJgi+DKyMUAQMBDRQCAQIOBwEbBAECBAEBA?= =?us-ascii?q?wECAYUAAotEAh8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAEBAQEBATkFSYV7DUkBAQQLAYFqGThxgSUBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECDAEZCoEEChMBATIGGCMDEAQBB?= =?us-ascii?q?gMCEQE1AwETARIagiREAYJkAwQBDAaTOJtLeoEygQGCDAEBBoEIPgIBDwMPL?= =?us-ascii?q?9oHgWUJgTEYAYVsgkkaASpIawKESAmEMycPgVVEgRWCeW+CShcBAQEBgTQCB?= =?us-ascii?q?gEBTQmDJYJpghoXRD4UH4IygVmBRYJqgVSDS4JngQcogwGJGYFHIgMmMywBV?= =?us-ascii?q?RMXCwcFYYEIAyo0MW4zHYIPhRuCD4IEiQmETS1PhTGBKn9AAwttPTcUG5Y5H?= =?us-ascii?q?CMagx8OPgEbIiMDKwEFBQkIDgIiLggjFgcDGR0JDiMmAQsCCQIeDQKSQwISC?= =?us-ascii?q?R8qA3SOWYNVnx80B4QegV4GDIkGgSSWAIQDgVeLM4cAkkwimF4iiV0KgRsJg?= =?us-ascii?q?W9qiHWMYSGFOIF9JIFGDwczGjBDgmcJCT0cD44tFoNeQX2DGjtauUFBNQIBA?= =?us-ascii?q?TgCBwEKAQEDCYVFHQEBaYIbgheFEwEDDRcMgUsBAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 NVhD7jSyXlp8Hxs5YA= IronPort-HdrOrdr: A9a23:VxUvyKwXw6o46l6hW86tKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: 9a23:w3MAMGzaet1/AUdFSmUTBgURP/x8cnGB7Uz7OlWYLGNrRZGFbXmfrfY= X-Talos-MUID: 9a23:vqG0BwWBHeU0cgHq/BXUowBSMOZu2rWzERoQl8wrhPGZZQUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,265,1739833200"; d="scan'208,217";a="115913368" X-MGA-submission: =?us-ascii?q?MDEgSCFjru9zPxNvB4+rfr2Ys8/I+mxDCsY+zn?= =?us-ascii?q?74Wt5+baeTX5Lkl7aKMAttEZUxB8tHXM4QbTtvf3BqkMdlj4ClkxHJ0A?= =?us-ascii?q?hzDJ2OKmVI1SsW0c1DxOSBYGVCcJ2YqSxuoA4BNFc0klV/qN6+rM5izl?= =?us-ascii?q?C5QkC9xkaR9yxrFvTV2QPw2Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 May 2025 09:24:18 +0200 Received: from TM.local (unknown [89.207.175.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 138F256514E; Tue, 6 May 2025 09:24:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1746516256; bh=67zVmYNXU8JhqHSONm6STQ+lgSG7Ae8F2EVgXZR0LrY=; h=From:To:Subject:Date:Message-ID; b=fDlH55gdyKGS8X+8Yg/gntndIaozbmmBUJmH1uMjjjATorMLpquT30atxahftwyvq 4wSlC1AswhUxLSwQXeTIwZwKWBfL7/Ocs9EOp+CcVtsEKHUONn8N62ey34PjuLnYTT d1hKuO9SWDXQoeiEtdYWzjp4hNCjhQTwTZPmnRQU= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 06 May 2025 09:24:13 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 6 09:24:16 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.391722, queueID=C29D8565150 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19316 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 29 to May 06, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Docfd 11.0.0: TUI multiline fuzzy document finder opam 2.4.0~alpha1 Early work experimenting with zig as a cross-compiler for OCaml Dune 3.18 A tool to reverse debug OCaml/other binary runs opam 2.4.0~alpha2 (BER) MetaOCaml N153, for OCaml 5.3.0 Other OCaml News Old CWN Docfd 11.0.0: TUI multiline fuzzy document finder =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Darren announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi all, I am happy to announce the release of Docfd 11.0.0. [Repo] [Repo] What Docfd is =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Think interactive grep for text files, PDFs, DOCXs, etc, but word/token based instead of regex and line based, so you can search across lines easily. Docfd aims to provide good UX via integration with common text editors and PDF viewers, so you can jump directly to a search result with a single key press. If you have used Recoll or other local document search engines before, then you can roughly think of this as Recoll-lite with TUI. =E2=97=8A Interactive use =E2=97=8A Non-interactive use =E2=97=8A Features =E2=80=A2 Multithreaded indexing and searching =E2=80=A2 Multiline fuzzy search of multiple files =E2=80=A2 Content view pane that shows the snippet surrounding the search result selected =E2=80=A2 Text editor and PDF viewer integration =E2=80=A2 Editable command history - rewrite/plan your actions in text ed= itor =E2=80=A2 Search scope narrowing - limit scope of next search based on cu= rrent search results =E2=80=A2 Clipboard integration Changes since 3.0.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C The last version announced here was 3.0.0. Docfd has since then undergone many improvements. Major changes: =E2=80=A2 Asynchronous UI =E2=80=A2 You can type and interact with UI without any blocking even if search is slow, and active search will be cancelled when appropriate =E2=80=A2 Scripting functionality in the form of a commands file =E2=80=A2 One-to-one correspondence to most UI interactions, allowing y= ou to interact as normal, and save your interaction into a file to repeat the search steps later via `=E2=80=93commands-from` =E2=80=A2 Swapped to using SQLite as index DB format, which lowers the me= mory footprint significantly =E2=80=A2 For the sample of 1.4GB of PDFs used, earlier versions use ar= ound 1.9GB of memory to store the index in-memory, while versions since 9.0.0 use only 39MB of memory =E2=80=A2 Document indexing was reworked into a multistage pipeline to al= low I/O tasks and computational tasks to run concurrently, which makes indexing a few times faster than older versions usually =E2=80=A2 Searching was also reworked into a pipeline for better work distribution across domains, improving search speed by 30% in the sample set of PDFs =E2=80=A2 Added `--open-with' to allow customising the command used to op= en a file based on file extension opam 2.4.0~alpha1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Continuing this thread, Ryan Gibb announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 :snowflake: Add *Nix support* for *external dependencies (depexts)* by adding support for stateless package managers ([#5982]). /Thanks to [@RyanGibb] for this contribution/ I've written a small explainer of this at and am happy to receive feedback on this mechanism! [#5982] [@RyanGibb] Early work experimenting with zig as a cross-compiler for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Chris Armstrong announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've written up a summary in a blog post of much of my progress I've described above: Dune 3.18 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune Team is glad to announce the release of Dune `3.18.2'. This version contains a fix to restore compatibility with the upcoming OCaml `5.4.0'. Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 fix compatibility with `ocaml.5.4.0' by avoiding shadowing sigw= inch (@nojb, #11639) A tool to reverse debug OCaml/other binary runs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Sid Kshatriya announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 BTW aarch64 support was released =E2=80=93 forgot to mention it on this thread. opam 2.4.0~alpha2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the second alpha release of opam 2.4.0. This version is an alpha, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release. What=E2=80=99s new? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :dragon_face: `opam switch create [name] ' will not in= clude compiler packages flagged with `avoid-version~/~deprecated' in the generated invariant anymore. ([#6494]) This will allow opam to avoid the use of the `ocaml-system' package unless actually explicitly requested by the user. The opam experience when the `ocaml-system' compiler is used is known to be prone to a variety of bugs and configuration issues. This alpha made this change in order to provide `opam switch create' with the same experience as `opam init', which will itself not choose `ocaml-system' anymore since the previous alpha1 release. =E2=80=A2 :window: Fallback to the existing Cygwin package manager if its upgrade failed to be fetched ([#6495], partial fix for [#6474]) =E2=80=A2 :goggles: Fix various crashes and extreme performance issues wh= en updating some opam repositories ([#6448]) :open_book: You can read our [blog post] for more information, and for even more details you can take a look at the [release note] or the [changelog]. [#6494] [#6495] [#6474] [#6448] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.4.0~alpha2" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.4.0~alpha2" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] (BER) MetaOCaml N153, for OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Oleg announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 BER MetaOCaml (or, simply MetaOCaml, since there aren't any others) N153 is a strict superset of OCaml 5.3.0 for ``writing programs that generate programs''. MetaOCaml adds to OCaml the type of code values (denoting ``program code'', or future-stage computations), and two basic constructs to build them: quoting and splicing. MetaOCaml also features cross-stage persistence, generating ordinary and mutually-recursive definitions, first-class pattern-matching and heterogeneous metaprogramming. The generated code can be printed, stored in a file =E2=80=93 or compiled= and linked-back to the running program, thus implementing run-time code optimization. A subset of the generated OCaml code can also be converted to C, via offshoring. (The generated C needs no particular runtime or GC.) A well-typed MetaOCaml program generates only well-scoped and well-typed programs: The generated code shall compile without type errors. Staging-annotation=E2=80=93free MetaOCaml is identi= cal to OCaml; MetaOCaml can link to any OCaml-compiled library (and vice versa). There aren't any notable new features to talk about. OCaml 5.x has changed AST (Parsetree) and Typedtree in significant ways, especially concerning functions. Adjusting MetaOCaml to those changes took some work. See also ChangeLog and NOTES.txt in the MetaOCaml distribution for more details. I'm very thankful to the OCaml team for merging the patch to the OCaml grammar concerning staging annotations. It has made maintaining MetaOCaml quite easier. MetaOCaml N153 should be available through OPAM, hopefully soon. In the meanwhile, it is available as a set of patches to the OCaml 5.3.0 distribution. See the INSTALL document in that archive. You need the source distribution of OCaml 5.3.0. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Bstr, a synthetic library for bigstrings] [the ocaml.org blog] [Bstr, a synthetic library for bigstrings] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 29 to May 06, 2= 025.

    Docfd 11.0.0: TUI multiline fuzzy document finder

    Darren announced

    Hi all, I am happy to announce the release of Docfd 11.0.0.

    Repo

    What Docfd is

    Think interactive grep for text files, PDFs, DOCXs, etc, but word/token bas= ed instead of regex and line based, so you can search across lines easily.

    Docfd aims to provide good UX via integration with common text editors and = PDF viewers, so you can jump directly to a search result with a single key = press.

    If you have used Recoll or other local document search engines before, then= you can roughly think of this as Recoll-lite with TUI.

    • Interactive use

      3D"6e01a779f649ba35=

    • Non-interactive use

      3D"6d6984de3d73d0c9=

    • Features
      • Multithreaded indexing and searching
      • Multiline fuzzy search of multiple files
      • Content view pane that shows the snippet surrounding the search result = selected
      • Text editor and PDF viewer integration
      • Editable command history - rewrite/plan your actions in text editor
      • Search scope narrowing - limit scope of next search based on current se= arch results
      • Clipboard integration

    Changes since 3.0.0

    The last version announced here was 3.0.0. Docfd has since then undergone m= any improvements.

    Major changes:

    • Asynchronous UI
      • You can type and interact with UI without any blocking even if search i= s slow, and active search will be cancelled when appropriate
    • Scripting functionality in the form of a commands file
      • One-to-one correspondence to most UI interactions, allowing you to inte= ract as normal, and save your interaction into a file to repeat the search = steps later via `–commands-from`
    • Swapped to using SQLite as index DB format, which lowers the memory foo= tprint significantly
      • For the sample of 1.4GB of PDFs used, earlier versions use around 1.9GB= of memory to store the index in-memory, while versions since 9.0.0 use onl= y 39MB of memory
    • Document indexing was reworked into a multistage pipeline to allow I/O = tasks and computational tasks to run concurrently, which makes indexing a f= ew times faster than older versions usually
    • Searching was also reworked into a pipeline for better work distributio= n across domains, improving search speed by 30% in the sample set of PDFs
    • Added --open-with to allow customising the command used to= open a file based on file extension

    opam 2.4.0~alpha1

    Continuing this thread, Ryan Gibb announced

    :snowflake: Add Nix support for external dependencies (depexts) by adding support for stateless package managers (#5982). Thanks to @RyanGibb for this contribution

    I've written a small explainer of this at https://ryan.freumh.org/opam-nix.html and am happy to = receive feedback on this mechanism!

    Early work experimenting with zig as a cross-compiler for OCam= l

    Continuing this thread, Chris Armstrong announced

    I've written up a summary in a blog post of much of my progress I've descri= bed above: https://www.chrisarmstrong.dev/posts/ocaml-cross-com= pilation-an-experiment

    Dune 3.18

    Etienne Marais announced

    The Dune Team is glad to announce the release of Dune 3.18.2.

    This version contains a fix to restore compatibility with the upcoming OCam= l 5.4.0.

    Changelog

    • Fixed
      • fix compatibility with ocaml.5.4.0 by avoiding shadowing s= igwinch (@nojb, #11639)

    A tool to reverse debug OCaml/other binary runs

    Continuing this thread, Sid Kshatriya announced

    BTW aarch64 support was released – forgot to mention it on this thre= ad.

    opam 2.4.0~alpha2

    Kate announced

    Hi everyone,

    We are happy to announce the second alpha release of opam 2.4.0.

    This version is an alpha, we invite users to test it to spot previously unn= oticed bugs as we head towards the stable release.

    What=E2=80=99s new?

    • :dragon_face: opam switch create [name] <version> wi= ll not include compiler packages flagged with avoid-version~/~depreca= ted in the generated invariant anymore. (#6494) This will allow opam to avoid the use of the ocaml-system pack= age unless actually explicitly requested by the user. The opam experience w= hen the ocaml-system compiler is used is known to be prone to = a variety of bugs and configuration issues. This alpha made this change in order to provide opam switch create with the same experience as opam init, which will itself = not choose ocaml-system anymore since the previous alpha1 rele= ase.
    • :window: Fallback to the existing Cygwin package manager if its upgrade= failed to be fetched (#6495, partial fix for #6474)
    • :goggles: Fix various crashes and extreme performance issues when updat= ing some opam repositories (#6448)

    :open_book: You can read our blog post for more information, and for even more details = you can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.0~alpha2"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.0~alpha2"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    (BER) MetaOCaml N153, for OCaml 5.3.0

    Oleg announced

    BER MetaOCaml (or, simply MetaOCaml, since there aren't any others) N153 is a strict superset of OCaml 5.3.0 for ``writing programs that generate programs''. MetaOCaml adds to OCaml the type of code values (denoting ``program code'', or future-stage computations), and two basic constructs to build them: quoting and splicing. MetaOCaml also features cross-stage persistence, generating ordinary and mutually-recursive definitions, first-class pattern-matching and heterogeneous metaprogramming.

    The generated code can be printed, stored in a file – or compiled and linked-back to the running program, thus implementing run-time code optimization. A subset of the generated OCaml code can also be converted to C, via offshoring. (The generated C needs no particular runtime or GC.) A well-typed MetaOCaml program generates only well-scoped and well-typed programs: The generated code shall compile without type errors. Staging-annotation–free MetaOCaml is identical to OCaml; MetaOCaml can link to any OCaml-compiled library (and vice versa).

    There aren't any notable new features to talk about. OCaml 5.x has changed AST (Parsetree) and Typedtree in significant ways, especially concerning functions. Adjusting MetaOCaml to those changes took some work. See also ChangeLog and NOTES.txt in the MetaOCaml distribution for more details.

    I'm very thankful to the OCaml team for merging the patch to the OCaml grammar concerning staging annotations. It has made maintaining MetaOCaml quite easier.

    MetaOCaml N153 should be available through OPAM, hopefully soon. In the meanwhile, it is available as a set of patches to the=20 OCaml 5.3.0 distribution.=20 https://o= kmij.org/ftp/ML/ber-metaocaml.tar.gz See the INSTALL document in that archive. You need the source distribution of OCaml 5.3.0.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=gezC8ZdE; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=3Zo8CFA2; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 3A7FE4003C for ; Tue, 13 May 2025 09:40:24 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=3rgbhr5HCu2qncbqmSXqAnASqdZo60W7tuh6lB51eM8=; b=gezC8ZdELmWYhUJIuUKWJ3sqBcJfK6S4+c9ATFr1drTLlu6T5VYkFyd0 mvOQA+4UU+gJJqUrGAMymZu1iFBEvifFc1suI+g/nadoVT/MYX+jkiR8n mPFfg1bySYcCOqdtcYkSwWz1AT+/zURbzzzl7SSrA/1ikVKdCs6LrCqlf o=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,284,1739833200"; d="scan'208,217";a="221770146" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 May 2025 11:40:24 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 1D084E0157; Tue, 13 May 2025 11:40:24 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 12190E0131 for ; Tue, 13 May 2025 11:40:20 +0200 (CEST) IronPort-SDR: 68231381_b6TxH+a0b6CBNa0wDvlTpga9E2Dp2KlK6RVYKW0vyBr0rC7 h0Hxptx9K6pY8FeMHFJosazmMpVVOp0FdQrfg1Q== X-IPAS-Result: =?us-ascii?q?A0GICAB1EiNojyIeaIFQCoJegT9bKBkBZFozBwhJAwGEU?= =?us-ascii?q?YNPjiKBFpA1iEqCL4FpgREDGBYjFAEDAQ0uAQkWAQIEAQEDAQIBhQACi0sCH?= =?us-ascii?q?wYBBDQTAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECBAYBAhABAQEBAQE5B?= =?us-ascii?q?UmFew1JAQEECwEEAYFlUXFeRwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIIBAECXAE9AgEIChMBASULCBgjAxQBBgMCEQE1A?= =?us-ascii?q?wETARIUBQGCaAGCIkkDBQwGP5Uam0t6gTKBAYIMAQEGgQg+AgECCQICAwEOC?= =?us-ascii?q?SUB2gmBZQmBSQGFbIJJGgEqSGsChEgJhDMnD4FVRIEVNYI9B2+BUAFuCxcBA?= =?us-ascii?q?QEBGIEZAwgBAQYCCTwJgyWCaYIaF4ECFB2BI4ELgVmELIFCEoNCgl+BLUWCN?= =?us-ascii?q?Yl+gUdLMywBVRMXCwcFYYEIAyo0MW4zHYINhRmCEYIEiQaERytPhSKBJIIfQ?= =?us-ascii?q?AMLbT03FBuWeRwjGoJ0BQIkDgsUHwImFg8VEwcTARMICAYCBRsCMgQFCRURD?= =?us-ascii?q?xgBGQ0KBBULFxMFBAICAwIEAi0DkkA4BCoDdLBEHW00B4QegV4GDIkGgSSWA?= =?us-ascii?q?IQDgVeLM4cBkSeBJSKYXiKCNocnCoEbCYFvaoh1jGEIMYUggX4jPG8BARkDD?= =?us-ascii?q?AczGjBDDQIGgh4BATIJCT0cD4gAh1UBCYFkXkEkWYEmgXQ7vn8DQTUCAQEPK?= =?us-ascii?q?QIHAQoBAQMJhWIBAWmCG4IXg2OBPw8XDIFLAQE?= IronPort-PHdr: A9a23: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 MTU7fvj IronPort-Data: A9a23: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 9ViD7XSxKhIFayJ5ICr9A== IronPort-HdrOrdr: A9a23:lm8tsqrLcRXiMozOxLWpPfQaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: =?us-ascii?q?9a23=3Ayun7Hmq54gjtOwYh9WHywynmUeUZeG/6w26PH2u?= =?us-ascii?q?5WUBKc5nSd0Sa45oxxg=3D=3D?= X-Talos-MUID: 9a23:o12ucguy2oZO5+gK9c2nvj5eH5dx7aiXVlERkMwWh5m7HyMzNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,284,1739833200"; d="scan'208,217";a="116442912" X-MGA-submission: =?us-ascii?q?MDExIEZZZzXgROXsncfFrQO6rFMsrMEJAhgXmc?= =?us-ascii?q?8r5m4GRYmPnbouYoGBDb8ZRvj3aKE8QFduGX8vkNdc0sar3e1HUTdIPX?= =?us-ascii?q?5aRb+Al+rt9Qxq0JSQhvI1D1ZQzOWDomww2lF9AlxB9ku3m+Dc47PeIw?= =?us-ascii?q?Q+977BgvVuzyyHz2DDBP2flg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 May 2025 11:40:17 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0414E564A54; Tue, 13 May 2025 11:40:15 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1747129216; bh=k7kig8Ch+J44ReVb7JgrSfAllPRRjRLkID/gvPsR4L0=; h=From:To:Subject:Date:Message-ID; b=3Zo8CFA2LRJ2p8W1A+OtD/4kksqf71r8QsTuVYZ3cKfsvyjMBIMBm7hU+zcHv3UqM wX+d8+UOT54bjiBeck+LZcRxfR56A8Fn5jRgIsFDdIlt4IiQGOB6QI7KCyKNQvnnpM rxXNMP1DXiaOCL5XDkGdLFD0VMvTcdd1GUEWqPNw= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 13 May 2025 11:40:15 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 13 11:40:17 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492688, queueID=ADD11564A59 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19320 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 06 to 13, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 FlexDLL 0.44 released (BER) MetaOCaml N153, for OCaml 5.3.0 Using fixture files in OCaml tests with Dune OCaml support in Zed editor Typesafe complicated combinations OCaml Platform Newsletter: February to April 2025 Other OCaml News Old CWN FlexDLL 0.44 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: David Allsopp announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the release of [FlexDLL 0.44] which has just been [merged to opam-repository]. FlexDLL is primarily used by the mingw-w64 and MSVC versions of Windows OCaml to implement `Dynlink'. The release contains several bug-fixes to do with the handling of objects ([ocaml/flexdll#29], [ocaml/flexdll#126] and [ocaml/flexdll#150]), several improvements to command line handling ([ocaml/flexdll#148], [ocaml/flexdll#151] and [ocaml/flexdll#152]), as well as various hardenings and improvements for cross-compiling and for use of alternate compiler toolchains. Since FlexDLL is used by the compiler itself, the upgrade is similar in impact to a new compiler release, in that opam switches will be fully recompiled. [FlexDLL 0.44] [merged to opam-repository] [ocaml/flexdll#29] [ocaml/flexdll#126] [ocaml/flexdll#150] [ocaml/flexdll#148] [ocaml/flexdll#151] [ocaml/flexdll#152] (BER) MetaOCaml N153, for OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Jeremy Yallop announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It's now available on OPAM: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.3.0+BER =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Using fixture files in OCaml tests with Dune =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Richard Degenne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have a couple of ongoing side-projects that I use to practice my OCaml every now and then, whenever I have some free time. The other day, I wanted to use fixtures for a test and it took me a while to get it to work properly with Dune, so I thought it was worth a write-up! I'm sharing it here because I would be especially interested in having some feedback from other OCaml developers, seasoned or not. <3 OCaml support in Zed editor =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Louis Roch=C3=A9 announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The [zed editor] is a modern and very snappy editor developped in rust. It's a bit behind more mature emacs/vim/vscode in term of features, though it's already pretty usable. There is an [ocaml extension] which I contributed to a little bit. I'd be curious to know if other people have tried this editor and would be willing to put a little bit of work into the extension. For now I do it mostly for myself. And would probably have more motivation if I knew it's actually being used by other people too. [zed editor] [ocaml extension] Typesafe complicated combinations =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, rand announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 To those of you interested, I updated the text with [further discussion] of the design-pattern - specifically about the fact that it reverses the dependency-relation between combined data, vs what one would have done by aggregating data within data. This is also loosely related to OO in an interesting way - in that objects in OO have identities, and *contain* data and procedures - where here it's individual data-sources (`Socket.Endpoint`s) that have identities, which are carried across different data, and finally used to combine in a typesafe way. I would be interested to hear if anyone also has experience with related patterns, and for what? Tyxml is one example. [further discussion] OCaml Platform Newsletter: February to April 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the fourteenth edition of the OCaml Platform newsletter! In this February to April 2025 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in [previous editions]. To understand the direction we're headed, especially regarding development workflows and user experience improvements, check out our [roadmap]. *Highlights:* =E2=80=A2 *Dune Package Management is now Compatible with Large Parts of = the Ecosystem*: The majority of Dune-based packages in opam-repository now build successfully with Dune package management. Continuous monitoring is available at [dune.check.ci.dev]. Technical barriers are being systematically addressed while maintaining compatibility with both opam and Dune workflows to ensure teams can transition at their own pace. =E2=80=A2 *Odoc 3.0 Release*: A major upgrade, introducing powerful featu= res like type-based search through Sherlodoc, global sidebar navigation, integrated source code display, multimedia support, hierarchical documentation pages, and cross-package linking that creates truly connected documentation. =E2=80=A2 *New minor Emacs Mode:* OCaml-eglot replaces the venerable "merlin-mode", providing modern editor features through `ocaml-lsp-server'. =E2=80=A2 *First alpha of opam 2.4.0*: Significant improvements including removal of GNU patch/diff dependencies, better Nix integration, improved pinned repository visibility, UI enhancements for deprecated packages, and new version comparison tools and lock file management features. *Announcements:* =E2=80=A2 ["opam 2.4.0 alpha1 release" on the Opam Blog] =E2=80=A2 [OCaml Infrastructure: FreeBSD 14.2 Upgrade] =E2=80=A2 [OCaml Infrastructure: OCaml-version 4.0.0 released] *Calls for Feedback:* =E2=80=A2 [Dune Developer Preview Adoption Survey] =E2=80=A2 [OCaml Editor Plugins Survey] =E2=80=A2 [Asking For Community Feedback on the OCaml Platform Communicat= ions] *Releases:* =E2=80=A2 [opam 2.4.0~alpha1] =E2=80=A2 [Dune 3.18.2] =E2=80=A2 [Dune 3.18.1] =E2=80=A2 [Dune 3.18.0] =E2=80=A2 [Odoc 3.0] =E2=80=A2 [dune-release 2.1.0] =E2=80=A2 [Ppxlib 0.36.0] =E2=80=A2 [Ppxlib 0.35.0] =E2=80=A2 [ocaml-eglot 1.2.0] =E2=80=A2 [ocaml-eglot 1.1.0] [previous editions] [roadmap] [dune.check.ci.dev] ["opam 2.4.0 alpha1 release" on the Opam Blog] [OCaml Infrastructure: FreeBSD 14.2 Upgrade] [OCaml Infrastructure: OCaml-version 4.0.0 released] [Dune Developer Preview Adoption Survey] [OCaml Editor Plugins Survey] [Asking For Community Feedback on the OCaml Platform Communications] [opam 2.4.0~alpha1] [Dune 3.18.2] [Dune 3.18.1] [Dune 3.18.0] [Odoc 3.0] [dune-release 2.1.0] [Ppxlib 0.36.0] [Ppxlib 0.35.0] [ocaml-eglot 1.2.0] [ocaml-eglot 1.1.0] *Dune* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Roadmap:* [Develop / (W4) Build a Project] Dune 3.18 brings various quality-of-life improvements, bug fixes, and new features. It introduces support for the new `x-maintenance-intent' field in opam packages, allowing maintainers to better communicate project status. The release also includes the new `(format-dune-file ...)' stanza, formalizing the dune format-dune-file command as an inside rule, and adds support for the `not' operator in package dependencies constraints. Several improvements to cache handling of file permissions have been implemented, and users can now utilize the `--prefix' flag when configuring dune with `ocaml configure.ml', providing greater installation flexibility. From 3.18.0, Dune now uses shorter paths for inline-test artifacts, allows dash characters in project names created with `dune init', and displays negative error codes on Windows in hexadecimal format =E2=80=94 = the customary way to display `NTSTATUS' codes. The release also enhances stability with improved retry mechanisms for file delete operations on Windows under heavy load and provides better warning behavior when failing to discover the project root due to read failures, replacing the previous abort behavior. Shortly after, Dune 3.18.1 was released with a hotfix that corrects an issue where `pkg-config' would fail to find certain libraries in specific contexts, while Dune 3.18.2 provides support for the upcoming OCaml 5.4 release. *Activities:* =E2=80=A2 [Release of Dune 3.18.2] =E2=80=A2 [Release of Dune 3.18.1] =E2=80=A2 [Release of Dune 3.18.0] *Maintained by:* Rudi Grinberg (@rgrinberg, Jane Street), Nicol=C3=A1s Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, Tarides), Ali Caglayan (@Alizter), Etienne Millon (@emillon, Tarides), Stephen Sherratt (@gridbugs, Tarides), Antonio Nuno Monteiro (@anmonteiro), Etienne Marais (@maiste) [Develop / (W4) Build a Project] [Release of Dune 3.18.2] [Release of Dune 3.18.1] [Release of Dune 3.18.0] =E2=97=8A *Dune Package Management* As of May 9, a large part of Dune-based packages on `opam-repository' now build successfully with Dune package management. At [dune.check.ci.dev], we provide continuous monitoring of build success across the ecosystem, giving visibility into compatibility before migration. The effort of making Dune package management compatible with the wider OCaml ecosystem is ongoing and aims to assess when Dune package management is ready for adoption in production settings. We are committed to maintain compatibility with both opam and Dune workflows, ensuring teams can transition at their own pace with minimal disruption to existing projects Technical barriers have been and are being systematically addressed, e.g. improved handling of ZIP archives, better dependency conflict resolution, and enhanced support for pinned packages that don't use Dune's build system. *Activities:* =E2=80=A2 ["Expanding Dune Package Management to the Rest of the Ecosyste= m" on the Tarides Blog] [dune.check.ci.dev] ["Expanding Dune Package Management to the Rest of the Ecosystem" on the Tarides Blog] =E2=97=8A *Dune Developer Preview* [Dune Developer Preview] is an experimental channel that introduces cutting-edge features to streamline OCaml development workflows. Building upon Dune's foundation as OCaml's official build system, this initiative allows us to iterate quickly on ideas and experiment with improving the developer experience and with experimental features. For example, one feature that came out of Dune Developer Preview and made it into the upstream codebase is package management: by enabling Dune to deal with project dependencies, we eliminate the need to juggle multiple tools. The tooling includes built-in LSP support, formatting capabilities, and a shared cache that dramatically improves build performance. Early adopters are encouraged to [provide feedback] as these experimental features mature toward stable releases. We are in the process of adopting Dune Developer Preview for the OCaml Platform Tools and other projects. This is to ensure that (1) Dune Developer Preview keeps providing a good developer experience on production codebases and (2) to catch bugs and issues as early as we can. At the moment, we are making a concerted effort to fix issues and add necessary features that block adoption of Dune Developer Preview on the OCaml Platform Tools projects. We're always interested in and addressing community feedback and bug reports, as well. In March, we conducted a [public survey to better understand the reach, adoption, and experience of/with Dune Developer Preview] in the OCaml community. *Activities:* =E2=80=A2 [Dune Developer Preview Adoption Survey] [Dune Developer Preview] [provide feedback] [public survey to better understand the reach, adoption, and experience of/with Dune Developer Preview] [Dune Developer Preview Adoption Survey] *Editor Tools* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Roadmap:* [Edit / (W19) Navigate Code], [Edit / (W20) Refactor Code] To better understand how the OCaml community uses the different editor plugins available for OCaml, and to get an idea which features are most anticipated, we ran a [survey on the OCaml Editors Plugins]. *Notable Activity* =E2=80=A2 [OCaml Editor Plugins Survey] =E2=80=A2 [April 2025 Editors Dev Meeting] Focus: Project-wide occurrences demo =E2=80=A2 [February 2025 Editors Dev Meeting] Focus: Introduction of ocaml-eglot Emacs mode *OCaml LSP Server maintained by:* Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane Street) *Merlin maintained by:* Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier Van de Woestyne (@xvw, Tarides) [Edit / (W19) Navigate Code] [Edit / (W20) Refactor Code] [survey on the OCaml Editors Plugins] [OCaml Editor Plugins Survey] [April 2025 Editors Dev Meeting] [February 2025 Editors Dev Meeting] =E2=97=8A Merlin and OCaml LSP Server Project-wide occurrences are available in both Merlin and OCaml-LSP, allowing developers to find all instances of a symbol across their codebase by running `dune build @build-index -w'. The feature has basic editor support via `merlin-project-occurrences' in Emacs and `:MerlinOccurrencesProjectWide' in Vim. Additionally, users of OCaml 5.3 and LSP-based plugins can experiment with the first iteration on project-wide *renaming*. =E2=97=8A Visual Studio Code plugin Behind the scenes, some work is happening on improving the developer experience for the OCaml VSCode editor plugin: When `ocaml-lsp-server' is not found in the opam switch, the plugin will prompt the user to offer installing it, and we are working on making the editor plugin work seamlessly with the recent dune package management features. *Notable Activity* =E2=80=A2 WIP on opam: Automatically installing/updating ocaml-lsp-server =E2=80=A2 WIP on Dune: Automatically configuring dune package management: =E2=97=8A Emacs support On January 17, [OCaml-eglot version 1.0.0 was released], providing a new minor emacs mode to enable the editor features provided by *ocaml-lsp-server*. This replaces the venerable =E2=80=9Cmerlin-mode=E2= =80=9D, after many years of loyal service. Subsequent releases [`1.1.0'] and [`1.2.0'] enable support for `flycheck' as a configurable alternative to `flymake' (`1.0.0' release), Emacs `30.1' support, better user experience and error handling, as well as support for new features. All these features have enabled OCaml-eglot to support client commands, making it possible to extend OCaml-eglot more easily and to integrate features much more rapidly. Since version `1.2.0', OCaml-eglot has all the functions of Merlin mode (and more)! We encourage you to try `ocaml-eglot' (refer to the updated [documentation on editor setup on OCaml.org]) and to [give feedback / report bugs by raising an issue on the ocaml-eglot repository]! Besides this, we have updated the documentation on Editor Setup on OCaml.org to reflect the new situation for Emacs! *Notable Activity* =E2=80=A2 [Updated Tutorial on Setting Up Emacs Support on OCaml.org] =E2=80=A2 [Release of ocaml-eglot 1.1.0] =E2=80=A2 [Release of ocaml-eglot 1.2.0] [OCaml-eglot version 1.0.0 was released] [`1.1.0'] [`1.2.0'] [documentation on editor setup on OCaml.org] [give feedback / report bugs by raising an issue on the ocaml-eglot repository] [Updated Tutorial on Setting Up Emacs Support on OCaml.org] [Release of ocaml-eglot 1.1.0] [Release of ocaml-eglot 1.2.0] *Documentation Tools* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Roadmap:* [Share / (W25) Generate Documentation] [Share / (W25) Generate Documentation] =E2=97=8A Odoc Odoc 3.0 has arrived after more than a year of development since the previous 2.4 release, bringing significant enhancements to OCaml's documentation tooling. The update introduces powerful new features including type-based search functionality through [Sherlodoc], a global sidebar for improved navigation across documentation pages, and integrated source code display that allows developers to jump directly from documentation to rendered source regardless of module system complexity. Additional highlights include support for multimedia content (images, video, and audio), hierarchical documentation pages for better structure, and cross-package linking capabilities that create truly connected documentation, as well as support for incremental documentation builds. It's worth noting that Dune does not yet support Odoc 3 as its rules need rewriting to accommodate the new CLI and incremental build capabilities. In the interim, developers can use the standalone `odoc_driver' command to generate documentation for their packages as shown in the ["Remapping dependencies" documentation]. The Odoc team encourages all OCaml developers to test their documentation with the new release before publishing packages, which can help avoid post-release fixes like [this example]. For a practical introduction to the new features, developers can install the package via `opam install odoc-driver' and explore the comprehensive documentation available for the [Odoc toolchain]. *Notable Activity* =E2=80=A2 [Release of odoc 3.0.0] =E2=80=A2 ["Odoc 3: So what?" on Jon Ludlam's blog] - blog post that touc= hes on how odoc 3's cross-package linking capabilities enable writing better manuals *Maintained by:* Jon Ludlam (@jonludlam, Tarides), Daniel B=C3=BCnzli (@dbuenzli), Jules Aguillon (@julow, Tarides), Paul-Elliot Angl=C3=A8s d'Auriac (@panglesd, Tarides), Emile Trotignon (@EmileTrotignon, Tarides, then Ahrefs) [Sherlodoc] ["Remapping dependencies" documentation] [this example] [Odoc toolchain] [Release of odoc 3.0.0] ["Odoc 3: So what?" on Jon Ludlam's blog] *Package Management* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Opam The [first alpha of opam 2.4.0 has been released], bringing significant improvements. The removal of GNU `patch' and `diff' as runtime dependencies reduces cross-platform inconsistencies, as the manager now uses the native OCaml `patch' library instead. Nix users will appreciate Nix support for external dependencies, facilitating more consistent environments across development and production systems. Notable for daily development work: pinned VCS repositories now display their current revision for better traceability, and several UI improvements provide clearer visibility into deprecated packages. The enhanced command set includes version comparison tools and better lock file management with `opam lock --keep-local', particularly useful for maintaining consistent dependency states across team environments. Teams running NixOS will benefit from fixed sandboxing support, while the new `OPAMSOLVERTOLERANCE' environment variable helps resolve persistent solver timeouts that previously was unsolvable by MCCS. Early testing and feedback from development teams is encouraged to ensure a stable final release. Please [report any issues to the bug-tracker]. *Notable Activity* =E2=80=A2 ["opam 2.4.0 alpha1 release" on the Opam Blog] =E2=80=A2 `opam upgrade' fixes [#6373] =E2=80=A2 Use `patch' OCaml library instead of the `patch' command [#5892] =E2=80=A2 Add some lints [#6317], [#6438] =E2=80=A2 Pinning system fixes [#5471], [#6343], [#6309], [#6375], [#6256= ], [#5471] =E2=80=A2 Add `opam admin migrate-extrafiles' command [#5960], change opam admin check options [#6335] =E2=80=A2 Depext system: better performance [#6324], enhance OpenBSD [#63= 62] =E2=80=A2 Some UI improvments [#6376], [#6401], [#6358], [#6273] =E2=80=A2 UX improvments: remove `ocaml-system' from default compiler at = init [#6307] =E2=80=A2 Provide a way to avoid solver timeouts [#5510] =E2=80=A2 Add `opam lock --keep-local' [#6411] *Maintained by:* Raja Boujbel (@rjbou - OCamlPro), Kate Deplaix (@kit-ty-kate, Ahrefs), David Allsopp (@dra27, Tarides) [first alpha of opam 2.4.0 has been released] [report any issues to the bug-tracker] ["opam 2.4.0 alpha1 release" on the Opam Blog] [#6373] [#5892] [#6317] [#6438] [#5471] [#6343] [#6309] [#6375] [#6256] [#5960] [#6335] [#6324] [#6362] [#6376] [#6401] [#6358] [#6273] [#6307] [#5510] [#6411] =E2=97=8A Dune-release *Roadmap:* [Share / (W26) Package Publication] Dune-release 2.1.0, has been released, providing a new command `dune-release delegate-info version', which makes it easier to identify the current version of a package as inferred by the tool. Additionally, the release introduces more flexibility with the `--dev-repo' flag for `dune-release' and `dune-release publish' commands, allowing users to override the `dev-repo' field specified in the `.opam' file during the release process. Dune-release no longer publishes documentation to GitHub Pages by default. This decision reflects the OCaml ecosystem's consolidation around centralized documentation, as package documentation is now automatically built and served by [ocaml.org/packages] following publication to the opam repository. The update also improves compatibility and resolves several issues, including a fix for decoding GitHub URLs and ensuring dune-release works with the experimental package management feature from Dune. The tool now handles the presence of `~/.dune/bin/dune' without failing, making it more robust for developers exploring Dune's newer features. *Notable Activity* =E2=80=A2 [Release of dune-release 2.1.0] *Maintained by:* Thomas Gazagnaire (@samoht, Tarides), Etienne Millon (@emillon, Tarides), Marek Kubica (@Leonidas-from-XIV, Tarides) [Share / (W26) Package Publication] [ocaml.org/packages] [Release of dune-release 2.1.0] Ppxlib =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The ppxlib team has released versions 0.35.0 and 0.36.0! Ppxlib 0.35.0, released in February 2025, brings significant improvements for OCaml 5.3 compatibility by allowing ppx rewriters to operate on files containing the new effect syntax. While ppx extensions and effect syntax can coexist, developers should note that rewriters might encounter errors when processing effect syntax nodes in extension payloads or generated code. The release introduces a new `--use-compiler-pp' driver flag, useful for preserving effect syntax when outputting source code instead of marshalled AST. This update also removes support for compilers older than 4.08. The latest ppxlib 0.36.0, released in March 2025, updates the internal AST to target OCaml 5.2, enabling ppx authors to leverage features from this version while maintaining compatibility with OCaml 4.08.0 and newer. This release includes notable changes to the representation of functions. Thus, package authors are strongly encouraged to consult [the upgrade guide] as many ppxes may break. Other improvements include fixing a bug in `loc_of_attribute', adding support for the `[@@@expand_inline]' transformation and floating attribute context-free transformations, and introducing a `-raise-embedded-errors' flag to the driver. *Notable Activity* =E2=80=A2 [Release of ppxlib 0.36.0] =E2=80=A2 [Release of ppxlib 0.35.0] =E2=80=A2 [Upgrade guide for the OCaml 5.3 release of ppxlib] *Maintained by:* Patrick Ferris ([@patricoferris]) [the upgrade guide] [Release of ppxlib 0.36.0] [Release of ppxlib 0.35.0] [Upgrade guide for the OCaml 5.3 release of ppxlib] [@patricoferris] OCaml Infrastructure =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml infrastructure team has upgraded their OBuilder workers for FreeBSD from version 14.1 to 14.2, which directly impacts two key continuous integration services: 1. *OCaml-CI* ([ocaml.ci.dev]) - This service automatically tests OCaml projects hosted on GitHub, and will now test against FreeBSD 14.2 instead of 14.1. Projects using this CI service will automatically be tested against the newer FreeBSD version. 2. *opam-repo-CI* ([opam.ci.ocaml.org]) - This service tests pull requests to the opam package repository, and will also now test against FreeBSD 14.2 rather than 14.1. With the release of `ocaml-version' 4.0.0, the OCaml version considered "recent" has been raised from 4.02 to 4.08. This change affects multiple services that use this definition to determine which OCaml versions to test against: 1. *OCaml-CI* - Will adjust which OCaml compiler versions are tested by default for projects 2. *opam-repo-CI* - Will modify its testing matrix for packages in the opam repository 3. *Docker base image builder* - Will only build images for OCaml 4.08 and newer As these services update, testing on older OCaml releases (versions 4.02 through 4.07) will be gradually removed. Package maintainers should consider upgrading projects still using pre-4.08 OCaml versions to OCaml 4.08 or higher. Apart from this, at the end of April 2025, registry.ci.dev, opam-repo-ci, OCaml-CI and get.dune.build were moved from Equinix Hosting to hosting at the Cambridge University Computer Lab, because of the [sunset of the Equinix Metal platform]. *Notable Activity* =E2=80=A2 ["Moving OCaml-CI" on tunbury.org] =E2=80=A2 ["Equinix Moves" on tunbury.org] =E2=80=A2 [OCaml Infrastructure: FreeBSD 14.2 Upgrade] =E2=80=A2 [OCaml Infrastructure: OCaml-version 4.0.0 released] [ocaml.ci.dev] [opam.ci.ocaml.org] [sunset of the Equinix Metal platform] ["Moving OCaml-CI" on tunbury.org] ["Equinix Moves" on tunbury.org] [OCaml Infrastructure: FreeBSD 14.2 Upgrade] [OCaml Infrastructure: OCaml-version 4.0.0 released] =E2=97=8A WIP: Odoc 3 on OCaml-Docs-CI The OCaml documentation pages provided through the [OCaml.org package area] are scheduled to receive significant updates with the release of odoc 3. To enable odoc 3 and all of its new features on OCaml.org, we are overhauling the docs-ci pipeline that powers documentation on ocaml.org. The improved pipeline addresses dependency complexities by using a new tool () that archives and restores opam packages, eliminating redundant builds of packages like dune that previously occurred thousands of times. The underlying infrastructure is also being upgraded, with plans to migrate docs-ci to a new blade server. *Notable Activity* =E2=80=A2 ["OCaml-Docs-CI and Odoc 3" on Jon Ludlam's blog] [OCaml.org package area] ["OCaml-Docs-CI and Odoc 3" on Jon Ludlam's blog] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Tarides at BOB Konferenz 2025] [the ocaml.org blog] [Tarides at BOB Konferenz 2025] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 06 to 13, 2025.

    FlexDLL 0.44 released

    David Allsopp announced

    I'm pleased to announce the release of FlexDLL 0.44 which has just been merged to opam-reposit= ory.

    FlexDLL is primarily used by the mingw-w64 and MSVC versions of Windows OCa= ml to implement Dynlink.

    The release contains several bug-fixes to do with the handling of objects (= ocaml/flexdll#29= , ocaml/flexdll#126= and ocaml/flexdl= l#150), several improvements to command line handling (ocaml/flexdll#148, ocaml/flexdll#151 and ocaml/flexdll#152), as w= ell as various hardenings and improvements for cross-compiling and for use = of alternate compiler toolchains.

    Since FlexDLL is used by the compiler itself, the upgrade is similar in imp= act to a new compiler release, in that opam switches will be fully recompil= ed.

    (BER) MetaOCaml N153, for OCaml 5.3.0

    Continuing this thread, Jeremy Yallop announced

    It's now available on OPAM:

    opam update
    opam switch create 5.3.0+BER
    

    Using fixture files in OCaml tests with Dune

    Richard Degenne announced

    I have a couple of ongoing side-projects that I use to practice my OCaml ev= ery now and then, whenever I have some free time. The other day, I wanted t= o use fixtures for a test and it took me a while to get it to work properly= with Dune, so I thought it was worth a write-up!

    I'm sharing it here because I would be especially interested in having some= feedback from other OCaml developers, seasoned or not. <3

    https://blog.richarddegenne.fr/2025/05/07/using-fi= xture-files-in-ocaml-tests-with-dune/

    OCaml support in Zed editor

    Louis Roch=C3=A9 announced

    The zed editor is a modern and very snappy= editor developped in rust. It's a bit behind more mature emacs/vim/vscode = in term of features, though it's already pretty usable. There is an ocaml extension which I co= ntributed to a little bit.

    I'd be curious to know if other people have tried this editor and would be = willing to put a little bit of work into the extension. For now I do it mos= tly for myself. And would probably have more motivation if I knew it's actu= ally being used by other people too.

    Typesafe complicated combinations

    Continuing this thread, rand announced

    To those of you interested, I updated the text with further discussion of the design-pattern - specifically about the fa= ct that it reverses the dependency-relation between combined data, vs what = one would have done by aggregating data within data.=20

    This is also loosely related to OO in an interesting way - in that objects = in OO have identities, and contain data and procedures - where here = it's individual data-sources (`Socket.Endpoint`s) that have identities, whi= ch are carried across different data, and finally used to combine in a type= safe way.

    I would be interested to hear if anyone also has experience with related pa= tterns, and for what? Tyxml is one example.

    OCaml Platform Newsletter: February to April 2025

    Sabine Schmaltz announced

    Welcome to the fourteenth edition of the OCaml Platform newsletter!

    In this February to April 2025 edition, we are excited to bring you the lat= est on the OCaml Platform, continuing our tradition of highlighting recent = developments as seen in previous editions. To understand the direction we're headed,= especially regarding development workflows and user experience improvement= s, check out our roadma= p.

    Highlights:

    • Dune Package Management is now Compatible with Large Parts of the Ec= osystem: The majority of Dune-based packages in opam-repository now bui= ld successfully with Dune package management. Continuous monitoring is avai= lable at dune.check.ci.dev. Techn= ical barriers are being systematically addressed while maintaining compatib= ility with both opam and Dune workflows to ensure teams can transition at t= heir own pace.
    • Odoc 3.0 Release: A major upgrade, introducing powerful features= like type-based search through Sherlodoc, global sidebar navigation, integ= rated source code display, multimedia support, hierarchical documentation p= ages, and cross-package linking that creates truly connected documentation.=
    • New minor Emacs Mode: OCaml-eglot replaces the venerable "merlin= -mode", providing modern editor features through ocaml-lsp-server.
    • First alpha of opam 2.4.0: Significant improvements including re= moval of GNU patch/diff dependencies, better Nix integration, improved pinn= ed repository visibility, UI enhancements for deprecated packages, and new = version comparison tools and lock file management features.

    Announcements:

    Calls for Feedback:

    Releases:

    Dune

    Roadmap: Develop / (W4) Build a Project

    Dune 3.18 brings various quality-of-life improvements, bug fixes, and new f= eatures. It introduces support for the new x-maintenance-intent field in opam packages, allowing maintainers to better communicate projec= t status. The release also includes the new (format-dune-file ...) stanza, formalizing the dune format-dune-file command as an inside rul= e, and adds support for the not operator in package dependenci= es constraints. Several improvements to cache handling of file permissions = have been implemented, and users can now utilize the --prefix = flag when configuring dune with ocaml configure.ml, providing = greater installation flexibility.

    >>From 3.18.0, Dune now uses shorter paths for inline-test artifacts, allows = dash characters in project names created with dune init, and d= isplays negative error codes on Windows in hexadecimal format =E2=80=94 the= customary way to display NTSTATUS codes. The release also enh= ances stability with improved retry mechanisms for file delete operations o= n Windows under heavy load and provides better warning behavior when failin= g to discover the project root due to read failures, replacing the previous= abort behavior.

    Shortly after, Dune 3.18.1 was released with a hotfix that corrects an issu= e where pkg-config would fail to find certain libraries in spe= cific contexts, while Dune 3.18.2 provides support for the upcoming OCaml 5= .4 release.

    Activities:

    Maintained by: Rudi Grinberg (@rgrinberg, Jane Street), Nicol=C3=A1s= Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, Tarides)= , Ali Caglayan (@Alizter), Etienne Millon (@emillon, Tarides), Stephen Sher= ratt (@gridbugs, Tarides), Antonio Nuno Monteiro (@anmonteiro), Etienne Mar= ais (@maiste)

    • Dune Package Management

      As of May 9, a large part of Dune-based packages on opam-repository now build successfully with Dune package management. At dune.check.ci.dev, we provide continuous monit= oring of build success across the ecosystem, giving visibility into compati= bility before migration.

      The effort of making Dune package management compatible with the wider OCam= l ecosystem is ongoing and aims to assess when Dune package management is r= eady for adoption in production settings. We are committed to maintain comp= atibility with both opam and Dune workflows, ensuring teams can transition = at their own pace with minimal disruption to existing projects

      Technical barriers have been and are being systematically addressed, e.g. i= mproved handling of ZIP archives, better dependency conflict resolution, an= d enhanced support for pinned packages that don't use Dune's build system.

      Activities:

    • Dune Developer Preview

      Dune Developer Preview is an ex= perimental channel that introduces cutting-edge features to streamline OCam= l development workflows. Building upon Dune's foundation as OCaml's officia= l build system, this initiative allows us to iterate quickly on ideas and e= xperiment with improving the developer experience and with experimental fea= tures. For example, one feature that came out of Dune Developer Preview and= made it into the upstream codebase is package management: by enabling Dune= to deal with project dependencies, we eliminate the need to juggle multipl= e tools.

      The tooling includes built-in LSP support, formatting capabilities, and a s= hared cache that dramatically improves build performance. Early adopters ar= e encouraged to pr= ovide feedback as these experimental features mature toward stable rele= ases.

      We are in the process of adopting Dune Developer Preview for the OCaml Plat= form Tools and other projects. This is to ensure that (1) Dune Developer Pr= eview keeps providing a good developer experience on production codebases a= nd (2) to catch bugs and issues as early as we can. At the moment, we are m= aking a concerted effort to fix issues and add necessary features that bloc= k adoption of Dune Developer Preview on the OCaml Platform Tools projects.

      We're always interested in and addressing community feedback and bug report= s, as well. In March, we conducted a public survey to better under= stand the reach, adoption, and experience of/with Dune Developer Preview in the OCaml community.

      Activities:

    Editor Tools

    Roadmap: Edit / (W19) Navigate Code, Edit / (W20) Refactor Code

    To better understand how the OCaml community uses the different editor plug= ins available for OCaml, and to get an idea which features are most anticip= ated, we ran a survey on the OCaml Editors Plugins.

    Notable Activity

    Focus: Project-wide occurrences demo

    Focus: Introduction of ocaml-eglot Emacs mode

    OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

    Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides)

    • Merlin and OCaml LSP Server

      Project-wide occurrences are available in both Merlin and OCaml-LSP, allowi= ng developers to find all instances of a symbol across their codebase by ru= nning dune build @build-index -w. The feature has basic editor= support via merlin-project-occurrences in Emacs and :Me= rlinOccurrencesProjectWide in Vim. Additionally, users of OCaml 5.3 = and LSP-based plugins can experiment with the first iteration on project-wi= de renaming.

    • Visual Studio Code plugin

      Behind the scenes, some work is happening on improving the developer experi= ence for the OCaml VSCode editor plugin: When ocaml-lsp-server= is not found in the opam switch, the plugin will prompt the user to offer = installing it, and we are working on making the editor plugin work seamless= ly with the recent dune package management features.

      Notable Activity

    • Emacs support

      On January 17, OCaml-eglot version 1.0.0 was released, providing= a new minor emacs mode to enable the editor features provided by ocaml-= lsp-server. This replaces the venerable =E2=80=9Cmerlin-mode=E2=80=9D, = after many years of loyal service.

      Subsequent releases 1.1.0 and 1.2.0 enable= support for flycheck as a configurable alternative to f= lymake (1.0.0 release), Emacs 30.1 support= , better user experience and error handling, as well as support for new fea= tures.

      All these features have enabled OCaml-eglot to support client commands, mak= ing it possible to extend OCaml-eglot more easily and to integrate features= much more rapidly. Since version 1.2.0, OCaml-eglot has all t= he functions of Merlin mode (and more)!

      We encourage you to try ocaml-eglot (refer to the updated documentation on editor = setup on OCaml.org) and to give feedback / report bugs by raising an issue on the ocaml-= eglot repository!

      Besides this, we have updated the documentation on Editor Setup on OCaml.or= g to reflect the new situation for Emacs!

      Notable Activity

    Documentation Tools

    • Odoc

      Odoc 3.0 has arrived after more than a year of development since the previo= us 2.4 release, bringing significant enhancements to OCaml's documentation = tooling. The update introduces powerful new features including type-based s= earch functionality through Sherlodoc, a global sidebar for improved navigation ac= ross documentation pages, and integrated source code display that allows de= velopers to jump directly from documentation to rendered source regardless = of module system complexity. Additional highlights include support for mult= imedia content (images, video, and audio), hierarchical documentation pages= for better structure, and cross-package linking capabilities that create t= ruly connected documentation, as well as support for incremental documentat= ion builds.

      It's worth noting that Dune does not yet support Odoc 3 as its rules need r= ewriting to accommodate the new CLI and incremental build capabilities. In = the interim, developers can use the standalone odoc_driver com= mand to generate documentation for their packages as shown in the "Remapping dependencies" documentation.

      The Odoc team encourages all OCaml developers to test their documentation w= ith the new release before publishing packages, which can help avoid post-r= elease fixes like this = example. For a practical introduction to the new features, developers c= an install the package via opam install odoc-driver and explor= e the comprehensive documentation available for the Odoc toolchain.

      Notable Activity

      Maintained by: Jon Ludlam (@jonludlam, Tarides), Daniel B=C3=BCnzli = (@dbuenzli), Jules Aguillon (@julow, Tarides), Paul-Elliot Angl=C3=A8s d'Au= riac (@panglesd, Tarides), Emile Trotignon (@EmileTrotignon, Tarides, then = Ahrefs)

    Package Management

    • Opam

      The first alpha = of opam 2.4.0 has been released, bringing significant improvements.

      The removal of GNU patch and diff as runtime depe= ndencies reduces cross-platform inconsistencies, as the manager now uses th= e native OCaml patch library instead. Nix users will appreciat= e Nix support for external dependencies, facilitating more consistent envir= onments across development and production systems.

      Notable for daily development work: pinned VCS repositories now display the= ir current revision for better traceability, and several UI improvements pr= ovide clearer visibility into deprecated packages. The enhanced command set= includes version comparison tools and better lock file management with opam lock --keep-local, particularly useful for maintaining consi= stent dependency states across team environments.

      Teams running NixOS will benefit from fixed sandboxing support, while the n= ew OPAMSOLVERTOLERANCE environment variable helps resolve pers= istent solver timeouts that previously was unsolvable by MCCS.

      Early testing and feedback from development teams is encouraged to ensure a= stable final release. Please report any issues to the bug-tracker.

      Notable Activity

      Maintained by: Raja Boujbel (@rjbou - OCamlPro), Kate Deplaix (@kit-= ty-kate, Ahrefs), David Allsopp (@dra27, Tarides)

    • Dune-release

      Roadmap: Share / (W26) Package Publication

      Dune-release 2.1.0, has been released, providing a new command dune-r= elease delegate-info version, which makes it easier to identify the = current version of a package as inferred by the tool. Additionally, the rel= ease introduces more flexibility with the --dev-repo flag for = dune-release and dune-release publish commands, a= llowing users to override the dev-repo field specified in the = .opam file during the release process.

      Dune-release no longer publishes documentation to GitHub Pages by default. = This decision reflects the OCaml ecosystem's consolidation around centraliz= ed documentation, as package documentation is now automatically built and s= erved by ocaml.org/packages foll= owing publication to the opam repository.

      The update also improves compatibility and resolves several issues, includi= ng a fix for decoding GitHub URLs and ensuring dune-release works with the = experimental package management feature from Dune. The tool now handles the= presence of ~/.dune/bin/dune without failing, making it more = robust for developers exploring Dune's newer features.

      Notable Activity

      Maintained by: Thomas Gazagnaire (@samoht, Tarides), Etienne Millon = (@emillon, Tarides), Marek Kubica (@Leonidas-from-XIV, Tarides)

    Ppxlib

    The ppxlib team has released versions 0.35.0 and 0.36.0!

    Ppxlib 0.35.0, released in February 2025, brings significant improvements f= or OCaml 5.3 compatibility by allowing ppx rewriters to operate on files co= ntaining the new effect syntax. While ppx extensions and effect syntax can = coexist, developers should note that rewriters might encounter errors when = processing effect syntax nodes in extension payloads or generated code. The= release introduces a new --use-compiler-pp driver flag, usefu= l for preserving effect syntax when outputting source code instead of marsh= alled AST. This update also removes support for compilers older than 4.08.

    The latest ppxlib 0.36.0, released in March 2025, updates the internal AST = to target OCaml 5.2, enabling ppx authors to leverage features from this ve= rsion while maintaining compatibility with OCaml 4.08.0 and newer. This rel= ease includes notable changes to the representation of functions. Thus, pac= kage authors are strongly encouraged to consult the upgrade guide = as many ppxes may break.

    Other improvements include fixing a bug in loc_of_attribute, a= dding support for the [@@@expand_inline] transformation and fl= oating attribute context-free transformations, and introducing a -rai= se-embedded-errors flag to the driver.

    Notable Activity

    Maintained by: Patrick Ferris (@patricoferris)

    OCaml Infrastructure

    The OCaml infrastructure team has upgraded their OBuilder workers for FreeB= SD from version 14.1 to 14.2, which directly impacts two key continuous int= egration services:

    1. OCaml-CI (ocaml.ci.dev) - T= his service automatically tests OCaml projects hosted on GitHub, and will n= ow test against FreeBSD 14.2 instead of 14.1. Projects using this CI servic= e will automatically be tested against the newer FreeBSD version.
    2. opam-repo-CI (opam.ci.ocam= l.org) - This service tests pull requests to the opam package repositor= y, and will also now test against FreeBSD 14.2 rather than 14.1.

    With the release of ocaml-version 4.0.0, the OCaml version con= sidered "recent" has been raised from 4.02 to 4.08. This change affects mul= tiple services that use this definition to determine which OCaml versions t= o test against:

    1. OCaml-CI - Will adjust which OCaml compiler versions are tested = by default for projects
    2. opam-repo-CI - Will modify its testing matrix for packages in th= e opam repository
    3. Docker base image builder - Will only build images for OCaml 4.0= 8 and newer

    As these services update, testing on older OCaml releases (versions 4.02 th= rough 4.07) will be gradually removed. Package maintainers should consider = upgrading projects still using pre-4.08 OCaml versions to OCaml 4.08 or hig= her.

    Apart from this, at the end of April 2025, registry.ci.dev, opam-repo-ci, O= Caml-CI and get.dune.build were moved from Equinix Hosting to hosting at th= e Cambridge University Computer Lab, because of the sunset of the Equinix Metal = platform.

    Notable Activity

    • WIP: Odoc 3 on OCaml-Docs-CI

      The OCaml documentation pages provided through the OCaml.org package area are scheduled to receive signific= ant updates with the release of odoc 3. To enable odoc 3 and all of its new= features on OCaml.org, we are overhauling the docs-ci pipeline that powers= documentation on ocaml.org. The improved pipeline addresses dependency com= plexities by using a new tool (https://github.com/jonludlam/opamh) that archives and restores opam = packages, eliminating redundant builds of packages like dune that previousl= y occurred thousands of times. The underlying infrastructure is also being = upgraded, with plans to migrate docs-ci to a new blade server.

      Notable Activity

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=YAZH5UH5; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=sFaqp6H2; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id A675E400A5 for ; Tue, 20 May 2025 11:52:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=mSm1flAAtYD+ZYR/V0jqvD4y1jQdAjrT71M0YNVmt/o=; b=YAZH5UH5WlcjxQTSQDopIiVXuNHPx23p8kT0ztxtoA77rV7QoJ8Q6jSo eu8oWdF6Xiu9awNl7v4VT09QMcdjdWHgMxl2rQxUOzSQMs21lcfejMfW/ lKAgcvn/ZOaGiV/GS/lmEyVGRhu7OnMeYJeXivCoufGsC7nwJmsjz6y8s Q=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,302,1739833200"; d="scan'208,217";a="222963416" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 May 2025 13:52:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id B050CE0CD7; Tue, 20 May 2025 13:52:42 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 45217E0131 for ; Tue, 20 May 2025 13:52:35 +0200 (CEST) IronPort-SDR: 682c6d02_kGjcGSwEnTTAJU8hH+DUXrNtUwEJuggoLBkYohDiFv3/JA+ JEW1O4pJEibNgC4ywLsSQOoW+eNdz+IOfZLKSAw== X-IPAS-Result: =?us-ascii?q?A0GnBgBrbCxohSIeaIFagl6BP1soGQFkWjMHCEmEVYNPj?= =?us-ascii?q?iKcRIFpgUIjFAEDAQ0uARsEAQIEAQEDAQIBhQACFos5Ah8GAQQ0EwECBAEBA?= =?us-ascii?q?QEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAUBJhXsNSQEBBAsBgWoZO?= =?us-ascii?q?HGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QIMAQJcQAkKEwEBJgMPGBQPAwkLAQYDAgQNATUDARMBEhoBgg9YAYIfA0oDB?= =?us-ascii?q?QwGP5NTm0t6gTKBAYIMAQEGgQg+AgECCQIFAQ4JJtoJgWUJgUmFbYJJGgEqS?= =?us-ascii?q?GsChEgJhDMnD4FVRIFKgQaBPm+CPwsXAQEBAVw7ERQBAQJLCQmDHIJpghgXg?= =?us-ascii?q?QIUHVlKgQs3HV6BZ4MlBBFVLz2HEkWCDneJeoFHSzMsAVUTFwsHBWGBCAMqN?= =?us-ascii?q?DFuMh2CDYUZgg+CB4kJhEorT4UigSaDGUADC209NxQblz0cJRqDIA4+Al8HI?= =?us-ascii?q?gUIDAgOAgRQBCMKDAcDGREMFxsQHwsNLZJXJQOPe44Vk1eBCjQHhB6BXgYMi?= =?us-ascii?q?QaBJJYChASBV4s1DoZzG5FOZiKYXyKJXYEmCYJZlVEGAoVXgX8jgSsBGwIMB?= =?us-ascii?q?zMaMEMNGoJACUYcD5FDXoE+gSaBdDuCZsAMQTUCAQE4AgcBCgEBAwmFYgEBg?= =?us-ascii?q?wSCF4UxLAhrYAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 vdALpT+6Im4xJht5YCr IronPort-HdrOrdr: A9a23:u3bME6PVrqauHsBcTvyjsMiBIKoaSvp037BL7TETdfUxSKalfq +V8sjzuSWYtN9zYhEdcLK7WZVoKEm0nfVICOIqUotKMjOLhEKYaKlcqaHizzfjFyCWzJ8+6Y 5QN45kBpnVBVh+5PyKhDVQ/uxQpeW6zA== X-Talos-CUID: 9a23:i0+CBmHQ9ZdbSA3EqmJV5U4uXZp9LUSH7ybiLWmUFWFQF7G8HAo= X-Talos-MUID: 9a23:Qao+BwgnHrLouTVQmdijecMpDMBFwPztLxk2vMs3hcvfLnNaBTWkpWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,302,1739833200"; d="scan'208,217";a="222963373" X-MGA-submission: =?us-ascii?q?MDFzh5biyYLYcteNiLXFoZeKmeQhP5C9sTlUm2?= =?us-ascii?q?wI8DZeZjEA/pBVU2el9hvtcj3BtX7Q6NObvMnfJJkzSmDgbngSXYi1kB?= =?us-ascii?q?sSj/B9WGOVwBo5yIb9n0KDcwfkzpwpkmrSF08TnrrBttsOld7lNpZZJs?= =?us-ascii?q?ZouDwJBJjJrYCcGnl7Rb8aEw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 May 2025 13:52:34 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E1883564D83; Tue, 20 May 2025 13:52:32 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1747741952; bh=GmGMTuUUEsyFwZMz3OtO93pQgs30zF7P0BiACvurI08=; h=From:To:Subject:Date:Message-ID; b=sFaqp6H2jD+SwgUXXfBac1pBLPnRv44AvahhHZgD8iDJYpX/9nRmO8pWEdPo7DobL ggblPIcvGC4hWtI6DybR3jFStoPzuEP1ZFQ+hXzx+C5PPPspDj+zt7ikTGxvsGTRfZ KGkQ6IyhsToNjiN9zLu9Or6d8M11JrT5ZiyVN8Nc= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 20 May 2025 13:52:31 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 20 13:52:33 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.453587, queueID=54089564D85 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19324 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWF5IDEzIHRvIDIwLA0KMjAyNS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpTZW5kIHVzIFRh bGsgYW5kIFdvcmtzaG9wIFByb3Bvc2FscyBmb3IgRnVuIE9DYW1sIDIwMjUgaW4gV2Fyc2F3LCBT ZXB0ZW1iZXIgMTUrMTYNCkJsb2cgcG9zdDogVXNpbmcgbW9kZWwtYmFzZWQgdGVzdGluZyBvbiBh IE1pcmFnZSBmaWxlc3lzdGVtIGltcGxlbWVudGF0aW9uDQpWb2x1bnRlZXJzIHRvIHJldmlldyB0 aGUgcmVsb2NhdGFibGUtT0NhbWwgd29yaz8NClBvcnRhYmxlIExvY2sgRGlyZWN0b3JpZXMgZm9y IER1bmUgUGFja2FnZSBNYW5hZ2VtZW50DQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0K U2VuZCB1cyBUYWxrIGFuZCBXb3Jrc2hvcCBQcm9wb3NhbHMgZm9yIEZ1biBPQ2FtbCAyMDI1IGlu IFdhcnNhdywgU2VwdGVtYmVyIDE1KzE2DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NlbmQtdXMtdGFsay1hbmQtd29ya3Nob3At cHJvcG9zYWxzLWZvci1mdW4tb2NhbWwtMjAyNS1pbi13YXJzYXctc2VwdGVtYmVyLTE1LTE2LzE2 NjQ2LzE+DQoNCg0KU2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgSGkgZXZlcnlvbmUhDQoNCiAgRnVuIE9DYW1sIDIwMjUgaXMgYSAyIGRheXMgb3BlbiBz b3VyY2UgaGFja2luZyBldmVudCBkZWRpY2F0ZWQgdG8NCiAgT0NhbWwgZW50aHVzaWFzdHMgYW5k IHByb2Zlc3Npb25hbHMuIFdlIGZvY3VzIG9uIHRoZSBpbXBhY3QgYW5kDQogIHBvdGVudGlhbCBv ZiBPQ2FtbCBmb3Igc29sdmluZyByZWFsLXdvcmxkIHByb2JsZW1zIGFuZCBnZXQgdG9nZXRoZXIg aW4NCiAgV2Fyc2F3IGZvciBhIGNvbmZlcmVuY2UvaGFja2F0aG9uIG92ZXIgdHdvIGRheXM6DQoN CiAg4oCiIERheSAxIChNb25kYXksIFNlcHRlbWJlciAxNSk6IHRhbGtzICh3aGljaCBhcmUgbGl2 ZS1zdHJlYW1lZCkgYW5kDQogICAgc29jaWFsaXppbmcvaGFja2luZy4NCiAg4oCiIERheSAyIChU dWVzZGF5LCBTZXB0ZW1iZXIgMTYpOiBXb3Jrc2hvcHMgYW5kIGhhY2tpbmcuDQoNCiAgVG9waWNz IHdl4oCZcmUgaW50ZXJlc3RlZCBpbjoNCg0KICDigKIgaG93IHlvdSB1c2UgT0NhbWwgaW4geW91 ciBidXNpbmVzcyAvIGluIHlvdXIgcHJvamVjdHMNCiAg4oCiIE9DYW1sIGxpYnJhcmllcywgZnJh bWV3b3JrcywgYW5kIG90aGVyIE9wZW4gU291cmNlIHByb2plY3RzIGJ1aWx0IG9uDQogICAgT0Nh bWwNCiAg4oCiIGhhbmRzLW9uIGRlbW9uc3RyYXRpb25zIHRoYXQgZW5jb3VyYWdlIHBlb3BsZSB0 byB0cnkgdGhpbmdzIG9uIHRoZQ0KICAgIHNlY29uZCBkYXkgb2YgdGhlIGV2ZW50IG9yIGF0IGhv bWUNCiAg4oCiIHNlZWluZyBhY3R1YWwgY29kZSBhbmQgcmVhc29uaW5nIGJlaGluZCBkZXNpZ24g ZGVjaXNpb25zDQogIOKAoiBleHBlcmllbmNlIHJlcG9ydHMNCg0KICBGb3IgbW9yZSBkZXRhaWxz LCBjaGVjayBvdXQgdGhlIHdlYnNpdGUgYW5kIHRoZSBDRlAgbGlua2VkIGZyb20gdGhlcmU6DQoN CiAgPGh0dHBzOi8vZnVuLW9jYW1sLmNvbT4NCg0KDQpCbG9nIHBvc3Q6IFVzaW5nIG1vZGVsLWJh c2VkIHRlc3Rpbmcgb24gYSBNaXJhZ2UgZmlsZXN5c3RlbSBpbXBsZW1lbnRhdGlvbg0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2 ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ibG9nLXBvc3QtdXNpbmctbW9kZWwt YmFzZWQtdGVzdGluZy1vbi1hLW1pcmFnZS1maWxlc3lzdGVtLWltcGxlbWVudGF0aW9uLzE2NjY2 LzE+DQoNCg0KZ2FzY2hlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBhbSBhdHRlbmRpbmcgdGhlIFtNaXJhZ2VPUyByZXRy ZWF0XSBpbiBNYXJyYWtlc2gsIHdpdGggaW4NCiAgcGFydGljdWxhcjoNCg0KICDigKIgTWluZHkg QHlvbWltb25vLCB3aG8gaW1wbGVtZW50ZWQgYSBzbWFsbCAoYnV0IG5vdCBzbyBzaW1wbGUpIGZp bGUNCiAgICBzeXN0ZW0gZm9yIE1pcmFnZSwgW0NoYW1lbG9uXQ0KICDigKIgQXJtYcOrbCBAYXJt YWVsLCB3aG8gaXMgaW50ZXJlc3RlZCBpbiB0ZXN0aW5nIGVmZmVjdGZ1bCwgY29uY3VycmVudA0K ICAgIGFuZC9vciBkaXN0cmlidXRlZCBzeXN0ZW1zDQoNCiAgQXJtYcOrbCBhbmQgbXlzZWxmIGRl Y2lkZWQgdG8gdHJ5IHRvIHVzZSBtb2RlbC1iYXNlZCB0ZXN0aW5nIG9uDQogIENoYW1lbG9uLg0K DQogIE5vdGU6IHRoaXMgaXMgYSBsb25nIGJsb2cgcG9zdCwgYW5kIHlvdSBzaG91bGQgZmVlbCBm cmVlIHRvIHNraXAgYXQNCiAgYW55IHBvaW50LiBJbiBwYXJ0aWN1bGFyLCBkbyBza2lwIHRoZSBj b2RlIHNlY3Rpb25zIGlmIHlvdSBkb24ndCBjYXJlDQogIGFib3V0IHRoZSBkZXRhaWxzLCB0aGV5 IGFyZSBoZXJlIHRvIG1ha2UgdGhpbmdzIHByZWNpc2UgYnV0IG5vdA0KICBzdHJpY3RseSBuZWNl c3NhcnkuDQoNCiAgL0VkaXRvcuKAmXMgbm90ZTogdGhlIGJsb2cgcG9zdCBpcyB0b28gbG9uZyBm b3IgdGhpcyBuZXdzbGV0dGVyLiBQbGVhc2UNCiAgcmVhZCBpdCBbaGVyZV0uLw0KDQoNCltNaXJh Z2VPUyByZXRyZWF0XSA8aHR0cHM6Ly9yZXRyZWF0Lm1pcmFnZS5pby8+DQoNCltDaGFtZWxvbl0g PGh0dHBzOi8vZ2l0aHViLmNvbS95b21pbW9uby9jaGFtZWxvbi8+DQoNCltoZXJlXQ0KPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9ibG9nLXBvc3QtdXNpbmctbW9kZWwtYmFzZWQtdGVzdGlu Zy1vbi1hLW1pcmFnZS1maWxlc3lzdGVtLWltcGxlbWVudGF0aW9uLzE2NjY2LzE+DQoNCg0KVm9s dW50ZWVycyB0byByZXZpZXcgdGhlIHJlbG9jYXRhYmxlLU9DYW1sIHdvcms/DQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L3ZvbHVudGVlcnMtdG8tcmV2aWV3LXRoZS1yZWxvY2F0YWJsZS1vY2FtbC13b3Jr LzE2NjY3LzE+DQoNCg0KZ2FzY2hlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZGlzY3VzcywNCg0KICBEYXZpZCBAZHJh MjcgQWxsc29wcCBoYXMgYmVlbiB3b3JraW5nIGZvciBhIGZldyB5ZWFycyBub3cgb24gbWFraW5n DQogIHRoZSBPQ2FtbCBjb21waWxlciByZWxvY2F0YWJsZS4NCg0KICBDdXJyZW50bHkgeW91IGNv bmZpZ3VyZSB0aGUgY29tcGlsZXIgdG8gYmUgaW5zdGFsbGVkIGF0IGEgY2VydGFpbg0KICBwYXRo LCBhbmQgdGhlIHJlc3VsdGluZyBwcm9ncmFtIGFuZCBjb25maWd1cmF0aW9uIGRlcGVuZCBvbiB0 aGlzIHBhdGg7DQogIG1vdmluZyB0aGUgaW5zdGFsbGVkIHByZWZpeCB0byBhIGRpZmZlcmVudCBw bGFjZSB3aWxsIGJyZWFrIHZhcmlvdXMNCiAgdGhpbmdzLiBIYXZpbmcgYSByZWxvY2F0YWJsZSBj b21waWxlciBpcyBnb29kIGZvciBXaW5kb3dzIHN1cHBvcnQsIGZvcg0KICByZXByb2R1Y2libGUg YnVpbGRzLCBmb3IgY2FjaGluZywgZXRjLg0KDQogIEFuIGVhcmx5IHZlcnNpb24gb2YgdGhpcyB3 b3JrIHdhcyBwcmVzZW50ZWQgYnkgRGF2aWQgYXQgdGhlIE9DYW1sDQogIGNvbXBpbGVyIHdvcmtz aG9wIDIwMjIsIGFuZCBpdCBpcyBkaXNjdXNzIGluIFthIHBhc3QgRGljdXNzIHRocmVhZF0uDQoN CiAgR29vZCBuZXdzISBUaGUgd29yayBpcyBub3cgaW4gYSBnb29kIGVub3VnaCBzaGFwZSB0aGF0 IEBkcmEyNyBoYXMNCiAgc3RhcnRlZCB1cHN0cmVhbWluZyBwYXJ0cyBvZiBpdCDigJMgc3VibWl0 dGluZyB0aGVtIHRvIHRoZSBjb21waWxlcg0KICBkaXN0cmlidXRpb24uIFRoZXJlIGlzIFthbiBS RkNdIHRoYXQgZGVzY3JpYmVzIHRoZSBkZXNpZ24sIGFuZCB3ZSBnb3QNCiAgW2EgZmlyc3QgUFJd IHRoYXQgaXMgYSB0ZXN0IGhhcm5lc3MgZm9yIHRoZSBmZWF0dXJlLCB3aXRoIG1hbnkgbW9yZSB0 bw0KICBjb21lLg0KDQogIEJhZCBuZXdzOiB3ZSBkb24ndCBrbm93IHdobyB3b3VsZCBiZSBhdmFp bGFibGUgdG8gcmV2aWV3IHRob3NlIFBScyBhcw0KICB0aGV5IGNvbWUuIEBub2piIG1hZGUgYW4g ZWZmb3J0IHRvIHJldmlldyB0aGUgdGVzdCBoYXJuZXNzLCBidXQgaXMNCiAgYWxzbyB3b3JraW5n IG9uIHRvbnMgb2Ygb3RoZXIgc3R1ZmYgKHN1Y2ggYXM6IHRyeWluZyB0byBnZXQgc3RkbGliDQog IGNvbnRyaWJ1dGlvbnMgYWNyb3NzIHRoZSBmaW5pc2ggbGluZSkuIE15IHVuZGVyc3RhbmRpbmcg aXMgdGhhdA0KICBAUnVjaWtpciBpcyBub3QgYXZhaWxhYmxlIHRvIGRvIHRoaXMgd29yay4gVGhl cmUgaXMgYSByaXNrIHRoYXQgdGhlDQogIHdvcmsgaXMgaGVsZCBiYWNrIGR1ZSB0byB0aGUgYWJz ZW5jZSBvZiBtb3RpdmF0ZWQgcmV2aWV3ZXJzIHRvIGxvb2sgYXQNCiAgaXQuDQoNCiAgV291bGQg YW55b25lIGFyb3VuZCBiZSBpbnRlcmVzdGVkIGluIGhlbHBpbmcgcmV2aWV3IHRoaXMgd29yaz8g SWYgc28sDQogIEknbSBoYXBweSB0byBwb3N0IGxpbmtzIHRvIGZ1cnRoZXIgUFJzIGFzIHRoZXkg Y29tZS4NCg0KICBJbiBteSBleHBlcmllbmNlLCBQUnMgYnkgQGRyYTI3IHRvdWNoIGEgdmFyaWVk IG51bWJlciBvZiBvYnNjdXJlDQogIHRvcGljcyB0aGF0ICpubyBvbmUqIGV4Y2VwdCBtYXliZSBo aW1zZWxmIGlzIGFuIGV4cGVydCBhYm91dCDigJMgZGVlcA0KICBzdHVmZiBhYm91dCBob3cgdGhl IGNvbXBpbGVyIHdvcmsgdGhhdCBtb3N0IG9mIHVzIGFyZSBoYXBweSB0byBpZ25vcmUNCiAgYmVj YXVzZSBpdCB1c3VhbGx5IHN0YXlzIG91dCBvZiB0aGUgd2F5LiBPbmUgdHlwaWNhbCBleGFtcGxl LCBJDQogIHN1c3BlY3QsIGlzIFsjMTM3MjggOiBBZGQgYFN5cy5ydW50aW1lX2V4ZWN1dGFibGUn IGFuZA0KICBgY2FtbF9zeXNfcHJvY19zZWxmX2V4ZSddICh3aGljaCBpcyBub3QgbWVyZ2VkLCBu b3QgbG9va2luZyBmb3INCiAgcmV2aWV3ZXJzKS4gSWYgeW91IGZpbmQgdGhpcyBQUiBzdXBlci1v YnNjdXJlLCB3ZWxjb21lIHRvIHRoZSBjbHViLCBJDQogIGRvbid0IHVuZGVyc3RhbmQgYW55dGhp bmcgZWl0aGVyLiBCdXQgaWYgeW91IGFsc28gZmluZCBpdA0KICAqaW50ZXJlc3RpbmcqLCB5b3Ug bWF5IGJlIGV4Y2VsbGVudCB2b2x1bnRlZXIgbWF0ZXJpYWwgdG8gcmV2aWV3IG1vcmUNCiAgUFJz IG9uIHRoaXMuDQoNCiAgTm90ZTogdGhlIGNvbnRyaWJ1dGlvbiBydWxlcyBmb3IgY29tcGlsZXIg UFJzIGlzIHRoYXQgZWFjaCBQUiBtdXN0IGJlDQogIGFwcHJvdmVkIGJ5IHNvbWVvbmUgd2l0aCBj b21taXQgcmlnaHRzIChhIGNvbXBpbGVyIG1haW50YWluZXIpIHRvIGdldA0KICBtZXJnZWQuIEJ5 IGl0c2VsZiwgYW4gYXBwcm92YWwgZnJvbSBhbm90aGVyIGNvbnRyaWJ1dG9yIGRvZXMgbm90DQog IHN1ZmZpY2UuIEJ1dCBpdCBpcyBjZXJ0YWlubHkgcG9zc2libGUgZm9yIG1haW50YWluZXJzIHRv IGdpdmUgYXBwcm92YWwNCiAgb24gYmVoYWxmIG9mIGFub3RoZXIgcmV2aWV3IOKAkyB3ZSBkbyBp dCBpbiBwcmFjdGljZS4gSWYgeW91IHJldmlldyBhIFBSDQogIChhYm91dCB0aGlzIG9yIGFueXRo aW5nIGVsc2UpIGFuZCB5b3UgZmVlbCBjb25maWRlbnQgdGhhdCBpdCBpcyBva2F5DQogIHRvIG1l cmdlIGl0LCBwbGVhc2UgZmVlbCBmcmVlIHRvIGV4cGxpY2l0bHkgImFwcHJvdmUiIGl0IHRocm91 Z2ggdGhlDQogIGdpdGh1YiBpbnRlcmZhY2UuDQoNCg0KW2EgcGFzdCBEaWN1c3MgdGhyZWFkXQ0K PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9yZWxvY2F0YWJsZS1jb21waWxlci13b3JrLzEx MjE4Pg0KDQpbYW4gUkZDXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL1JGQ3MvcHVsbC81Mz4N Cg0KW2EgZmlyc3QgUFJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8xNDAx ND4NCg0KWyMxMzcyOCA6IEFkZCBgU3lzLnJ1bnRpbWVfZXhlY3V0YWJsZScgYW5kIGBjYW1sX3N5 c19wcm9jX3NlbGZfZXhlJ10NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvcHVsbC8x MzcyOD4NCg0KDQpEYXZpZCBBbGxzb3BwIGFkZGVkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICAgICAgICBoYXMgYmVlbiB3b3Jr aW5nIGZvciBhIGZldyB5ZWFycyBub3cgb24gbWFraW5nIHRoZSBPQ2FtbA0KICAgICAgICBjb21w aWxlciByZWxvY2F0YWJsZS4NCg0KICBKdXN0IHRvIG1ha2UgaXQgc291bmQgYSBsaXR0bGUgbGVz cyBIZXJjdWxlYW4sIEkgaGF2ZW7igJl0IGJlZW4gd29ya2luZw0KICBfc29saWRseV8gb24gaXQg 8J+YiiBUaGVyZSB3ZXJlIGEgZmV3IE9DYW1sIDUuMCBhbmQgV2luZG93cyBvcGFtDQogIDIuMi1z aGFwZWQgZGl2ZXJzaW9ucyBvbiB0aGUgd2F54oCmDQoNCiAgSW4gYWRkaXRpb24gdG8gdGhlIGFs cmVhZHkgb3BlbmVkIHRlc3QgaGFybmVzcywgdGhlcmXigJlzIGEgZHJhZnQgKHdpdGgNCiAgZXhw bGFuYXRvcnkgdGV4dCkgb2YgdGhlIGZpcnN0IG9mIHRoZSBtYWluIFBScyBhdA0KICA8aHR0cHM6 Ly9naXRodWIuY29tL2RyYTI3L29jYW1sL3B1bGwvMTgzPiBhbmQgYSBkcmFmdCBvZiB0aGUgc2Vj b25kDQogIChjdXJyZW50bHkgd2l0aG91dCBleHBsYW5hdG9yeSB0ZXh0LCBhbHRob3VnaCB0aGF0 IHdpbGwgYmUgdGhlcmUgYnkNCiAgbmV4dCB3ZWVrKSBhdCA8aHR0cHM6Ly9naXRodWIuY29tL2Ry YTI3L29jYW1sL3B1bGwvMTYyPi4gVGhlIHRoaXJkIGlzDQogIHN0aWxsIGF3YWl0aW5nIGEgc21h bGwgYW1vdW50IG9mIHRpZHlpbmcgKHdoaWNoIHdpbGwgaG9wZWZ1bGx5IGFsc28gYmUNCiAgZG9u ZSBieSB0aGUgZW5kIG9mIG5leHQgd2VlayDwn6W1KQ0KDQoNClBvcnRhYmxlIExvY2sgRGlyZWN0 b3JpZXMgZm9yIER1bmUgUGFja2FnZSBNYW5hZ2VtZW50DQrilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3BvcnRhYmxlLWxvY2stZGlyZWN0b3JpZXMtZm9yLWR1bmUtcGFja2FnZS1t YW5hZ2VtZW50LzE2NjY5LzE+DQoNCg0KU3RldmUgU2hlcnJhdHQgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBXZSd2ZSByZWNlbnRseSBtYWRlIGEgY2hhbmdlIHRvIGhvdyBsb2NrIGRp cmVjdG9yaWVzIHdvcmsgaW4gdGhlIFtEdW5lDQogIERldmVsb3BlciBQcmV2aWV3XS4NCg0KICBQ cmV2aW91c2x5IHdoZW4gRHVuZSB3b3VsZCBzb2x2ZSBkZXBlbmRlbmNpZXMgZm9yIGEgcHJvamVj dCBhbmQNCiAgZ2VuZXJhdGUgYSBsb2NrIGRpcmVjdG9yeSwgdGhlIGxvY2sgZGlyZWN0b3J5IHdv dWxkIGJlIHNwZWNpYWxpemVkIGZvcg0KICB0aGUgY29tcHV0ZXIgd2hlcmUgaXQgd2FzIGdlbmVy YXRlZCwgd2l0aCBubyBndWFyYW50ZWUgaXQgd291bGQgd29yaw0KICBvbiBhIGRpZmZlcmVudCBj b21wdXRlci4gVGhpcyBwb3NlZCBhIHByb2JsZW0gZm9yIGNoZWNraW5nIGxvY2sNCiAgZGlyZWN0 b3JpZXMgaW50byB2ZXJzaW9uIGNvbnRyb2wgZm9yIHByb2plY3RzIHdpdGggbXVsdGlwbGUNCiAg ZGV2ZWxvcGVycywgc2luY2Ugb25lIGRldmVsb3BlciBtaWdodCBsb2NrIHRoZSBwcm9qZWN0IG9u IHRoZWlyIE1hYywNCiAgc2F5LCBvbmx5IGZvciBhbm90aGVyIGRldmVsb3BlciBvbiBMaW51eCB0 byBiZSB1bmFibGUgdG8gYnVpbGQgaXQgZHVlDQogIHRvIGl0cyBNYWNPUy1zcGVjaWZpYyBsb2Nr IGRpcmVjdG9yeS4NCg0KICBUaGlzIHBvc3QgaXMgdG8gYW5ub3VuY2UgdGhhdCBEdW5lIG5vdyBz dXBwb3J0cyBnZW5lcmF0aW5nIC9wb3J0YWJsZS8NCiAgbG9jayBkaXJlY3RvcmllczsgYSBsb2Nr IGRpcmVjdG9yeSBnZW5lcmF0ZWQgb24gb25lIGNvbXB1dGVyIHdpbGwgbm93DQogIGNvbnRhaW4g YSBkZXBlbmRlbmN5IHNvbHV0aW9uIGZvciBhIHJhbmdlIG9mIGRpZmZlcmVudCBjb21wdXRlcnMs DQogIG1ha2luZyBpdCBzYWZlIHRvIGNoZWNrIGxvY2sgZGlyZWN0b3JpZXMgaW50byB2ZXJzaW9u IGNvbnRyb2wuDQoNCg0KW0R1bmUgRGV2ZWxvcGVyIFByZXZpZXddIDxodHRwczovL3ByZXZpZXcu ZHVuZS5idWlsZC8+DQoNClRlY2huaWNhbCBEZXRhaWxzDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJbiBPcGFtIHRoZSBkZXBlbmRlbmNp ZXMgb2YgYSBwYWNrYWdlIGNhbiBiZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uDQogIHByb3BlcnRp ZXMgb2YgdGhlIGNvbXB1dGVyIHdoZXJlIHRoZSBwYWNrYWdlIGlzIGJlaW5nIGluc3RhbGxlZC4g QQ0KICBwYWNrYWdlIG1pZ2h0IGhhdmUgYSBkaWZmZXJlbnQgc2V0IG9mIGRlcGVuZGVuY2llcyB3 aGVuIGJlaW5nDQogIGluc3RhbGxlZCBvbiBNYWNPUyB2ZXJzZXMgTGludXggdmVyc2VzIFdpbmRv d3MsIG9yIHRoZSBkZXBlbmRlbmNpZXMNCiAgbWlnaHQgdmFyeSBkZXBlbmRpbmcgb24gdGhlIENQ VSBhcmNoaXRlY3R1cmUuIEl0J3MgZXZlbiBwb3NzaWJsZQ0KICAodGhvdWdoIHF1aXRlIHJhcmUg aW4gcHJhY3RpY2UpIGZvciB0aGUgZGVwZW5kZW5jaWVzIG9mIGEgcGFja2FnZSB0bw0KICB2YXJ5 IGJldHdlZW4gb3BlcmF0aW5nIHN5c3RlbSBkaXN0cmlidXRpb25zLCBvciBldmVuIG9wZXJhdGlu ZyBzeXN0ZW0NCiAgdmVyc2lvbnMuDQoNCiAgVGhpcyBleHByZXNzaXZlIHBvd2VyIG1ha2VzIE9w YW0gdmVyeSBmbGV4aWJsZSBhcyBpdCBhbGxvd3MgcGFja2FnZXMNCiAgdG8gYmUgc3BlY2lhbGl6 ZWQgZm9yIHRoZSBlbnZpcm9ubWVudCB3aGVyZSB0aGV5IHdpbGwgYmUNCiAgaW5zdGFsbGVkLiBU aGUgZHJhd2JhY2sgb2YgdGhpcyBhcHByb2FjaCBpcyB0aGF0IHRoZXJlIG1pZ2h0IG5vdCBiZSBh DQogIHNpbmdsZSBzb2x1dGlvbiB0byBhIGRlcGVuZGVuY3kgcHJvYmxlbSB0aGF0IHdvcmtzIGV2 ZXJ5d2hlcmUuIEVhY2gNCiAgY29tYmluYXRpb24gb2YgT1MvYXJjaGl0ZWN0dXJlL2Rpc3Ryby92 ZXJzaW9uIGNvdWxkLCBpbiB0aGVvcnksDQogIHJlcXVpcmUgYSBkaWZmZXJlbnQgZGVwZW5kZW5j eSBzb2x1dGlvbi4gVGhlcmUgYXJlIHdheSB0b28gbWFueQ0KICBjb21iaW5hdGlvbnMgb2YgdGhv c2UgcHJvcGVydGllcyB0byBydW4gRHVuZSdzIGRlcGVuZGVuY3kgc29sdmVyIG9uY2UNCiAgZm9y IGVhY2ggY29tYmluYXRpb24gaW4gYSByZWFzb25hYmxlIGFtb3VudCBvZiB0aW1lLiBJbnN0ZWFk IHdlDQogIGVsZWN0ZWQgdG8gY29tcHJvbWlzZSBhbmQgaGF2ZSBEdW5lIG9ubHkgZ2VuZXJhdGUg YSBzb2x1dGlvbiBmb3INCiAgY29tbW9uIHBsYXRmb3JtcyBieSBkZWZhdWx0LCB3aGlsZSBhbGxv d2luZyB1c2VycyB0byBzcGVjaWZ5IGEgY3VzdG9tDQogIGxpc3Qgb2YgcGxhdGZvcm1zIHRvIHNv bHZlIGZvciBpbiB0aGVpciBgZHVuZS13b3Jrc3BhY2UnIGZpbGUuDQoNCiAgTG9ja2ZpbGVzIG5v dyBsb29rIGEgbGl0dGxlIGRpZmZlcmVudCB0byBhY2NvdW50IGZvciB0aGUgZmFjdCB0aGF0DQog IHRoZXkgbm93IGNvbnRhaW4gbXVsdGlwbGUgZGlmZmVyZW50IHBsYXRmb3JtLXNwZWNpZmljIGRl cGVuZGVuY3kNCiAgc29sdXRpb25zLiBGb3IgZXhhbXBsZSwgZm9ybWVybHksIHRoZSBsb2NrZmls ZSBmb3IgdGhlDQogIGBvY2FtbC1jb21waWxlcicgcGFja2FnZSBvbiBhbiB4ODYgbWFjaGluZSBy dW5uaW5nIFdpbmRvd3MsIHlvdSBtaWdodA0KICBoYXZlIGhhZCBhIGBkZXBlbmRzJyBmaWVsZCBs aWtlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGRlcGVuZHMgYXJjaC14ODZfNjQgc3lz dGVtLW1pbmd3IG1pbmd3LXc2NC1zaGltcyBmbGV4ZGxsKQ0KICDilJTilIDilIDilIDilIANCg0K ICBNb3N0IG9mIHRoZXNlIGRlcGVuZGVuY2llcyBhcmUgc3BlY2lmaWMgdG8gV2luZG93czsgaXQn cyB1bmxpa2VseSB0aGF0DQogIHlvdSdsbCBiZSBhYmxlIHRvIGluc3RhbGwgYW55IG9mIHRoZXNl IGRlcGVuZGVuY2llcyBvbiBMaW51eCBvciBNYWNPUy4NCg0KICBXaXRoIHRoZSBwb3J0YWJsZSBs b2NrIGRpcmVjdG9yaWVzIGZlYXR1cmUgZW5hYmxlZCwgdGhpcyBmaWVsZCBub3cNCiAgbWlnaHQg bG9vayBsaWtlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGRlcGVuZHMNCiAg4pSCICAo Y2hvaWNlDQogIOKUgiAgICgoKChhcmNoIHg4Nl82NCkNCiAg4pSCICAgICAgKG9zIGxpbnV4KSkN CiAg4pSCICAgICAoKGFyY2ggYXJtNjQpDQogIOKUgiAgICAgIChvcyBsaW51eCkpDQogIOKUgiAg ICAgKChhcmNoIHg4Nl82NCkNCiAg4pSCICAgICAgKG9zIG1hY29zKQ0KICDilIIgICAgICAob3Mt ZGlzdHJpYnV0aW9uIGhvbWVicmV3KQ0KICDilIIgICAgICAob3MtZmFtaWx5IGhvbWVicmV3KSkN CiAg4pSCICAgICAoKGFyY2ggYXJtNjQpDQogIOKUgiAgICAgIChvcyBtYWNvcykNCiAg4pSCICAg ICAgKG9zLWRpc3RyaWJ1dGlvbiBob21lYnJldykNCiAg4pSCICAgICAgKG9zLWZhbWlseSBob21l YnJldykpKQ0KICDilIIgICAgKCkpDQogIOKUgiAgICgoKChhcmNoIHg4Nl82NCkNCiAg4pSCICAg ICAgKG9zIHdpbjMyKQ0KICDilIIgICAgICAob3MtZGlzdHJpYnV0aW9uIGN5Z3dpbikNCiAg4pSC ICAgICAgKG9zLWZhbWlseSB3aW5kb3dzKSkpDQogIOKUgiAgICAoYXJjaC14ODZfNjQgc3lzdGVt LW1pbmd3IG1pbmd3LXc2NC1zaGltcyBmbGV4ZGxsKSkNCiAg4pSCICAgKCgoKGFyY2ggYXJtNjQp DQogIOKUgiAgICAgIChvcyB3aW4zMikNCiAg4pSCICAgICAgKG9zLWRpc3RyaWJ1dGlvbiBjeWd3 aW4pDQogIOKUgiAgICAgIChvcy1mYW1pbHkgd2luZG93cykpKQ0KICDilIIgICAgKHN5c3RlbS1t aW5ndyBtaW5ndy13NjQtc2hpbXMgZmxleGRsbCkpKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg VGhpcyBuZXcgc3ludGF4IGlzIHNpbWlsYXIgdG8gYSBtYXRjaC1zdGF0ZW1lbnQsIGxpc3Rpbmcg dGhlDQogIGRlcGVuZGVuY2llcyBmb3IgZWFjaCBwbGF0Zm9ybSBmb3Igd2hpY2ggRHVuZSdzIHNv bHZlciByYW4uIFlvdSBjYW4NCiAgY2hhbmdlIHRoZSBwbGF0Zm9ybXMgRHVuZSB3aWxsIHNvbHZl IGZvciBieSBhZGRpbmcgc29tZXRoaW5nIGxpa2UgdGhpcw0KICB0byBgZHVuZS13b3Jrc3BhY2Un Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKGxvY2tfZGlyDQogIOKUgiAgKHNvbHZlX2Zv cl9wbGF0Zm9ybXMNCiAg4pSCICAgKChhcmNoIGFybTY0KQ0KICDilIIgICAgKG9zIG9wZW5ic2Qp KQ0KICDilIIgICAoKGFyY2ggeDg2XzMyKQ0KICDilIIgICAgKG9zIHdpbjMyKSkpKQ0KICDilJTi lIDilIDilIDilIANCg0KICBBZnRlciBydW5uaW5nIGBkdW5lIHBrZyBsb2NrJyBhZ2FpbiwgdGhl IGxvY2tmaWxlIGZvciBgb2NhbWwtY29tcGlsZXInDQogIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRo ZXNlIGRlcGVuZGVuY2llczoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIChkZXBlbmRzDQog IOKUgiAgKGNob2ljZQ0KICDilIIgICAoKCgoYXJjaCBhcm02NCkgKG9zIG9wZW5ic2QpKSkgKCkp DQogIOKUgiAgICgoKChhcmNoIHg4Nl8zMikNCiAg4pSCICAgICAgKG9zIHdpbjMyKSkpDQogIOKU giAgICAoc3lzdGVtLW1pbmd3IG9jYW1sLW9wdGlvbi1ieXRlY29kZS1vbmx5IGZsZXhkbGwpKSkp DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEEgZmV3IG90aGVyIGZpZWxkcyBvZiBsb2NrZmlsZXMg bm93IGFsc28gdXNlIHRoZSBuZXcgc3ludGF4LiBEdW5lDQogIGxvY2tmaWxlcyBjb250YWluIHRo ZSBjb21tYW5kcyBuZWVkZWQgdG8gYnVpbGQgYW5kIGluc3RhbGwgZWFjaA0KICBwYWNrYWdlLCBh cyB3ZWxsIGFzIHRoZSBuYW1lcyBvZiBhbnkgc3lzdGVtIHBhY2thZ2VzIG5lZWRlZCBieSB0aGUN CiAgT3BhbSBwYWNrYWdlLCBhbmQgZWFjaCBvZiB0aGVzZSBmaWVsZHMgY2FuIGFsc28gaGF2ZSBw bGF0Zm9ybS1zcGVjaWZpYw0KICB2YWx1ZXMuDQoNCiAgTG9ja2ZpbGUgbmFtZXMgbm93IGluY2x1 ZGUgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoZSBwYWNrYWdlLiBUaGUNCiAgYG9jYW1sLWNvbXBp bGVyJyBwYWNrYWdlIHVzZWQgdG8gaGF2ZSBhIGxvY2tmaWxlIG5hbWVkDQogIGBvY2FtbC1jb21w aWxlci5wa2cnIGJ1dCBub3cgaGFzIGEgbmFtZSBsaWtlDQogIGBvY2FtbC1jb21waWxlci41LjMu MC5wa2cnIGluc3RlYWQuIFRoaXMgaXMgYmVjYXVzZSBpdCdzIHBvc3NpYmxlIHRoYXQNCiAgZGlm ZmVyZW50IHBsYXRmb3JtcyBtYXkgcmVxdWlyZSBkaWZmZXJlbnQgdmVyc2lvbnMgb2YgdGhlIHNh bWUgcGFja2FnZQ0KICBpbiB0aGUgZGVwZW5kZW5jeSBzb2x1dGlvbiwgc28gdGhlIGxvY2sgZGly ZWN0b3J5IG5lZWRzIHRvIGJlIGFibGUgdG8NCiAgY29udGFpbiBtdWx0aXBsZSBsb2NrZmlsZXMg Zm9yIHRoZSBzYW1lIHBhY2thZ2Ugd2l0aG91dCB0aGVtIGNvbGxpZGluZw0KICBvbiBmaWxlbmFt ZS4NCg0KDQpIb3cgZG8gSSBnZXQgaXQ/DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUaGlzIGZlYXR1cmUgaXMgbGl2ZSBpbiB0aGUgbGF0ZXN0 IHZlcnNpb24gb2YgdGhlIFtEdW5lIERldmVsb3Blcg0KICBQcmV2aWV3XS4gRm9sbG93IHRoZSBp bnN0cnVjdGlvbnMgb24gdGhhdCBwYWdlIHRvIGluc3RhbGwgYSB2ZXJzaW9uIG9mDQogIER1bmUg d2l0aCB0aGlzIGZlYXR1cmUuIFdpdGggcG9ydGFibGUgbG9jayBkaXJlY3RvcmllcyBlbmFibGVk LCBEdW5lDQogIHdpbGwgdGVtcG9yYXJpbHkgcmVtYWluIGJhY2t3YXJkcyBjb21wYXRpYmxlIHdp dGggdGhlIG9yaWdpbmFsIGxvY2sNCiAgZGlyZWN0b3J5IGZvcm1hdCwgdGhvdWdoIHN1cHBvcnQg d2lsbCBsaWtlbHkgYmUgZHJvcHBlZCBhdCBzb21lDQogIHBvaW50LiBHZW5lcmF0ZSBhIG5ldyBs b2NrIGRpcmVjdG9yeSBieSBydW5uaW5nIGBkdW5lIHBrZw0KICBsb2NrJy4gWW91J2xsIGtub3cg eW91ciBsb2NrIGRpcmVjdG9yeSBpcyBwb3J0YWJsZSBpZiBlYWNoIGZpbGUgaW5zaWRlDQogIGl0 IGhhcyBhIHZlcnNpb24gbnVtYmVyIGluIGl0cyBmaWxlbmFtZS4NCg0KICBIYXBweSByZXByb2R1 Y2libGUgYnVpbGRpbmchDQoNCg0KW0R1bmUgRGV2ZWxvcGVyIFByZXZpZXddIDxodHRwczovL3By ZXZpZXcuZHVuZS5idWlsZC8+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBi bG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxv Z3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1RoZSB3 ZWVrIHRoYXQgd2FzIC0gMjAyNSB3MjBdDQogIOKAoiBbT0NhbWwgV2ViIERldmVsb3BtZW50OiBF c3NlbnRpYWwgVG9vbHMgYW5kIExpYnJhcmllcyBpbiAyMDI1XQ0KICDigKIgW1RoZSB3ZWVrIHRo YXQgd2FzIC0gMjAyNSB3MTldDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2Nh bWwub3JnL2Jsb2cvPg0KDQpbVGhlIHdlZWsgdGhhdCB3YXMgLSAyMDI1IHcyMF0NCjxodHRwczov L3d3dy5kcmEyNy51ay9ibG9nL3dlZWstdGhhdC13YXMvMjAyNS8wNS8xOC93dHctMjAuaHRtbD4N Cg0KW09DYW1sIFdlYiBEZXZlbG9wbWVudDogRXNzZW50aWFsIFRvb2xzIGFuZCBMaWJyYXJpZXMg aW4gMjAyNV0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAyNS0wNS0xNS1vY2FtbC13ZWIt ZGV2ZWxvcG1lbnQtZXNzZW50aWFsLXRvb2xzLWFuZC1saWJyYXJpZXMtaW4tMjAyNT4NCg0KW1Ro ZSB3ZWVrIHRoYXQgd2FzIC0gMjAyNSB3MTldDQo8aHR0cHM6Ly93d3cuZHJhMjcudWsvYmxvZy93 ZWVrLXRoYXQtd2FzLzIwMjUvMDUvMDkvd3R3LTE5Lmh0bWw+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2Fu IFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRh a2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJj aGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5 IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxh biBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRA cG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5 bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 13 to 20, 2025.

    Send us Talk and Workshop Proposals for Fun OCaml 2025 in Wars= aw, September 15+16

    Sabine Schmaltz announced

    Hi everyone!

    Fun OCaml 2025 is a 2 days open source hacking event dedicated to OCaml ent= husiasts and professionals. We focus on the impact and potential of OCaml f= or solving real-world problems and get together in Warsaw for a conference/= hackathon over two days:

    • Day 1 (Monday, September 15): talks (which are live-streamed) and socia= lizing/hacking.
    • Day 2 (Tuesday, September 16): Workshops and hacking.

    Topics we=E2=80=99re interested in:

    • how you use OCaml in your business / in your projects
    • OCaml libraries, frameworks, and other Open Source projects built on OC= aml
    • hands-on demonstrations that encourage people to try things on the seco= nd day of the event or at home
    • seeing actual code and reasoning behind design decisions
    • experience reports

    For more details, check out the website and the CFP linked from there:

    https://fun-ocaml.com

    Volunteers to review the relocatable-OCaml work?

    gasche announced

    Hi discuss,

    David @dra27 Allsopp has been working for a few years now on making the OCa= ml compiler relocatable.

    Currently you configure the compiler to be installed at a certain path, and= the resulting program and configuration depend on this path; moving the in= stalled prefix to a different place will break various things. Having a rel= ocatable compiler is good for Windows support, for reproducible builds, for= caching, etc.

    An early version of this work was presented by David at the OCaml compiler = workshop 2022, and it is discuss in a past Dicuss thread.

    Good news! The work is now in a good enough shape that @dra27 has started u= pstreaming parts of it – submitting them to the compiler distributio= n. There is an RFC th= at describes the design, and we got a first PR that is a test harness for the feature, with = many more to come.

    Bad news: we don't know who would be available to review those PRs as they = come. @nojb made an effort to review the test harness, but is also working = on tons of other stuff (such as: trying to get stdlib contributions across = the finish line). My understanding is that @Rucikir is not available to do = this work. There is a risk that the work is held back due to the absence of= motivated reviewers to look at it.

    Would anyone around be interested in helping review this work? If so, I'm h= appy to post links to further PRs as they come.

    In my experience, PRs by @dra27 touch a varied number of obscure topics tha= t no one except maybe himself is an expert about – deep stuff= about how the compiler work that most of us are happy to ignore because it= usually stays out of the way. One typical example, I suspect, is #13728 : Add Sys.runti= me_executable and caml_sys_proc_self_exe (which is = not merged, not looking for reviewers). If you find this PR super-obscure, = welcome to the club, I don't understand anything either. But if you also fi= nd it interesting, you may be excellent volunteer material to review= more PRs on this.

    Note: the contribution rules for compiler PRs is that each PR must be appro= ved by someone with commit rights (a compiler maintainer) to get merged. By= itself, an approval from another contributor does not suffice. But it is c= ertainly possible for maintainers to give approval on behalf of another rev= iew – we do it in practice. If you review a PR (about this or anythi= ng else) and you feel confident that it is okay to merge it, please feel fr= ee to explicitly "approve" it through the github interface.

    David Allsopp added

    has been working for a few years now on making the OCaml compiler relocatab= le.

    Just to make it sound a little less Herculean, I haven=E2=80=99t been worki= ng solidly on it =F0=9F=98=8A There were a= few OCaml 5.0 and Windows opam 2.2-shaped diversions on the way=E2=80=A6

    In addition to the already opened test harness, there=E2=80=99s a draft (wi= th explanatory text) of the first of the main PRs at https://github.com/dra27/ocaml/pull/183 a= nd a draft of the second (currently without explanatory text, although that= will be there by next week) at https://github.com/dra27/ocaml/pull/162. The third is still aw= aiting a small amount of tidying (which will hopefully also be done by the = end of next week =F0=9F=A5=B5)

    Portable Lock Directories for Dune Package Management

    Steve Sherratt announced

    We've recently made a change to how lock directories work in the Dune Developer Preview.

    Previously when Dune would solve dependencies for a project and generate a = lock directory, the lock directory would be specialized for the computer wh= ere it was generated, with no guarantee it would work on a different comput= er. This posed a problem for checking lock directories into version control= for projects with multiple developers, since one developer might lock the = project on their Mac, say, only for another developer on Linux to be unable= to build it due to its MacOS-specific lock directory.

    This post is to announce that Dune now supports generating portable = lock directories; a lock directory generated on one computer will now conta= in a dependency solution for a range of different computers, making it safe= to check lock directories into version control.

    Technical Details

    In Opam the dependencies of a package can be different depending on propert= ies of the computer where the package is being installed. A package might h= ave a different set of dependencies when being installed on MacOS verses Li= nux verses Windows, or the dependencies might vary depending on the CPU arc= hitecture. It's even possible (though quite rare in practice) for the depen= dencies of a package to vary between operating system distributions, or eve= n operating system versions.

    This expressive power makes Opam very flexible as it allows packages to be = specialized for the environment where they will be installed. The drawback = of this approach is that there might not be a single solution to a dependen= cy problem that works everywhere. Each combination of OS/architecture/distr= o/version could, in theory, require a different dependency solution. There = are way too many combinations of those properties to run Dune's dependency = solver once for each combination in a reasonable amount of time. Instead we= elected to compromise and have Dune only generate a solution for common pl= atforms by default, while allowing users to specify a custom list of platfo= rms to solve for in their dune-workspace file.

    Lockfiles now look a little different to account for the fact that they now= contain multiple different platform-specific dependency solutions. For exa= mple, formerly, the lockfile for the ocaml-compiler package on= an x86 machine running Windows, you might have had a depends = field like:

    (depends arch-x86_64 system-mingw mingw-w64-shims flexdll)
    

    Most of these dependencies are specific to Windows; it's unlikely that you'= ll be able to install any of these dependencies on Linux or MacOS.

    With the portable lock directories feature enabled, this field now might lo= ok like:

    (depends
     (choice
      ((((arch x86_64)
         (os linux))
        ((arch arm64)
         (os linux))
        ((arch x86_64)
         (os macos)
         (os-distribution homebrew)
         (os-family homebrew))
        ((arch arm64)
         (os macos)
         (os-distribution homebrew)
         (os-family homebrew)))
       ())
      ((((arch x86_64)
         (os win32)
         (os-distribution cygwin)
         (os-family windows)))
       (arch-x86_64 system-mingw mingw-w64-shims flexdll))
      ((((arch arm64)
         (os win32)
         (os-distribution cygwin)
         (os-family windows)))
       (system-mingw mingw-w64-shims flexdll))))
    

    This new syntax is similar to a match-statement, listing the dependencies f= or each platform for which Dune's solver ran. You can change the platforms = Dune will solve for by adding something like this to dune-workspace:

    (lock_dir
     (solve_for_platforms
      ((arch arm64)
       (os openbsd))
      ((arch x86_32)
       (os win32))))
    

    After running dune pkg lock again, the lockfile for ocam= l-compiler will be updated with these dependencies:

    (depends
     (choice
      ((((arch arm64) (os openbsd))) ())
      ((((arch x86_32)
         (os win32)))
       (system-mingw ocaml-option-bytecode-only flexdll))))
    

    A few other fields of lockfiles now also use the new syntax. Dune lockfiles= contain the commands needed to build and install each package, as well as = the names of any system packages needed by the Opam package, and each of th= ese fields can also have platform-specific values.

    Lockfile names now include the version number of the package. The oca= ml-compiler package used to have a lockfile named ocaml-compil= er.pkg but now has a name like ocaml-compiler.5.3.0.pkg= instead. This is because it's possible that different platforms may requir= e different versions of the same package in the dependency solution, so the= lock directory needs to be able to contain multiple lockfiles for the same= package without them colliding on filename.

    How do I get it?

    This feature is live in the latest version of the Dune Developer Preview. Follow the instructions on that = page to install a version of Dune with this feature. With portable lock dir= ectories enabled, Dune will temporarily remain backwards compatible with th= e original lock directory format, though support will likely be dropped at = some point. Generate a new lock directory by running dune pkg lock. You'll know your lock directory is portable if each file inside it ha= s a version number in its filename.

    Happy reproducible building!

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=hHOfPluk; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=TBvNMhCd; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D662440068 for ; Tue, 27 May 2025 09:22:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=kQjXlTXOxEY/IzOmdS/gUVmPmFFcZYJ02LDEo+Su3u8=; b=hHOfPlukv6UFCL1oaQUSTMudOawZxncDgPT4wq9J2UBM3dpdbZE8+jRx k4lUep64dOWQ4VT754CwEI+3vWp2JbvCGPp0C7h0pTwg0Bjh+oxsXVMeF tm7ZjMv25IhflL/1D+Go3itBqe6CWqhnv+/EZxqH3aCEHg22WLyNSCeCw M=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.15,318,1739833200"; d="scan'208,217";a="224095407" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 May 2025 11:22:24 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5026AE0CCE; Tue, 27 May 2025 11:22:24 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 0E23EE0131 for ; Tue, 27 May 2025 11:22:21 +0200 (CEST) IronPort-SDR: 6835844b_EM2EOALBqE3cFwnK/QbxB/w81rSnelmneIrRsiuw/3W8oKF QYntWIAWcyBkGxoAoPmL8wjoVLZ7QUq5L9Ewh0g== X-IPAS-Result: =?us-ascii?q?A0G6CQCVgzVojyIeaIFaHgE8DAILgWqBP1soGQFkWhEiB?= =?us-ascii?q?whJhFWBY4FsjiKCQAGPCoY1gTuDCYFpgREDGBYFHhQBAwENLgEbBAECBAEBA?= =?us-ascii?q?wECAUOBSYFaVEYCi1MCHwYBBDQTAQIEAQEBAQMCAwEBAQEBARABAQUBAQECA?= =?us-ascii?q?QECBAYBAhABAQEBAQE5BUmFQQEGATINSQEBAQMBCgGBalFBMGUJBgEBAQEBA?= =?us-ascii?q?QEBAScBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAggEAYEeAQgEBhMBASYSGCMDFAEGAwIRATUXARIaghBYAYIiSgMFDAaTM?= =?us-ascii?q?JtLen8zgQGCDAEBBoEIPgEBAgoBBgEOCSbaCYFLGgmBSYVtgkkaAQUlSGsCh?= =?us-ascii?q?EgJggCBFCR7Jw+BVUSBSoFzAVBvgVJ4FwEBAQEBF0REHAEBCAk8CYMlgmmCE?= =?us-ascii?q?RdEPhQdJhIrQIELUYEIhCyBPhKDQYI/IIEtRYIOJ1CKNoFHSzMsAVUTFwsHB?= =?us-ascii?q?VuBCAMqNDFuMh2CDYUZghKCB4kBhEkrT4UigSaDd0ADC209NxQbl2ocJhqBP?= =?us-ascii?q?oE8JAIIBjgGAQENHx8UAQIEAxEOBQgMCA4CIg0hCA4LCgUFCwgDBRQRCAQJD?= =?us-ascii?q?gQhBgEBEgUGCwYHFAgRA5JlAhUdDQN0nHCTVx1tNAeEHoFeBgyJB4EmlgKEB?= =?us-ascii?q?IFXizWYamYimGEigjaHJ4EmCYFvHkwWlUEEBAsNDwqFIIF/I4ErAR0MBzMaM?= =?us-ascii?q?EMNEYIVAQEBMQkKPBwPiniBLIFbLhaBEgEJgkJBfYEmgXQ7xSUDQTUCAQE4A?= =?us-ascii?q?gcBCgEBAwmFYgEBaYIbghduhCYygUsBAQ?= IronPort-PHdr: A9a23:jtMKGxKgp4BH37VA1dmcuLxpWUAX0o4c3iYr45Yqw4hDbr6kt8y7e hCEvrM11BSQDNSKo7Ic0qyK6PqmATRBqb+681k8M7V0FCU5wf0MmAIhBMPXQWbaF9XNKxIAI cJZSVV+9Gu6O0UGUOz3ZlnVv2HgpWVKQka3OgV6PPn6FZDPhMqrye+y54fTYwJVjzahfL9+N hq7oAvfu8UMnYduNqk9xgbNr3ZMf+ld2GdkKU6Okxrm6cq98oBv/z5Mt/498sJLTLn3cbk/Q bFEAzsqNHw46tfsuRffUwWE+2ESUn8RkhpGAgjF6A/1U5LsuSbkteRzxTeXM9TuQb87RTqt4 aFrSAT1iCgcLD427HvXis1rg61Fph+qugFyzJTVYIGRM/p+Y7/dcNYHTmdPQspdSypMCZ67Y IUSEuoBJv5YoJfhqFsSoxW+AgysC/nuyj9Om3T62aI33uAkHQzAwQcuHc8BsG7Modv1KqkcT O67wqrHwjrfdP5Zwyvx5ZLSfxw9vf2BX7R9etfRx0k1EAPFi02dpJDhPzyP0OQGrnWV4PZgV eKqim4ntx1xqSWoy8g2jonGnIQVxkrf9SplwIY1INy4SFJnYdO/CJtQsCWaNotqQsw8X25ou CA6yrwfuZ6mYicG0pMnxwTQa/GedYWD/x3sWvqLLzhimHJlZKywhwy08UW4xODxVs253VVXo iZZjtXCuXEA2h3d58SbVvdz/lmt1SuB2gzN5O9JIkE5mKXUJZMgwrM9kpodvVnMEyL1hEn7k qmbfVgq9Oiv7uToeLTmppmEOo9slA7+LqUumtChDuQgNQgOWm2b9vqm2L3l40L5XK1Gjvoqn abDtZDaId4XpqmjAw9ayooj5Be/Dyum0NQFhnYLNk5KeBWCj4TxNFHOIez4Dfeig1u3ijtrx vfGMqXkApXMNHjMirjhcqhn505dzwo/1d9f55NICrEBPfL8QVX9uMbEAR8+Ngy42+fnCNNn1 oMfQ22DGKGZMLnKvV+P/uIgPe+Ma5QOuDngMfQl4OTujXAhlV8SfKmpwZ8XZ2qjEfh8IkWZZ mLggtAdHmgQuwo+SPTqiEeFUTJJe3myWKc86iknB4KnF4vMW56igKKZ0CunApFbYnlKCkqWE XvxcIWEXe4AZziILc97jjMEVbmsRoA72RGrqQD206FnLuvJ9S0br57j0N916PHJmhE27TB0C tqS032XQGFwhmwHXCU507x8oUNjzFeMzLJ0g/lcFdBL4PNGTh01NZvYz+BgEdzyXRjBftiRR Fm9WNqmHSoxTtUvw9MUf0l9HNCigxbe1CSpG78Yj6GHCIIw/67GwnT9O8lwx2zI2aU9lVUrT MRCOXW7iqNx6gTfHZDFnkWWmqqwa6gQwTTB+HmMwGeKukxTTRB9UaHYXXAEekvZs8756F7DT 76vF7sqKhdNxMifIaVQcNLpl09JRPL7NdTefW2xn2CwCA6NxrKDcYbmYX0d3CLZCEkEjwAc4 2qJNQg4BiegumLeESJhGUjoY0P2/ulysHK7TkkqwAGWd0BtyqS59xoPifCBV/8e0agItSk9p zluEluw0MraC9+aqApgeKVcb8k94FBC1W/BqgJzIoGuI7x6i1IDbwp5ul3i2g11BYtGicUqt HQqzA5yKKKEzlxOazOY3ZbxOr3ON2n94gqja6nM2lHRyNuZ4KMP5+4+q1n5pwGmCkoi83Bm0 9lJz3uR/Y7FDA0PUZL3Tkk46QN6q6vfYiQy6ILYz3psMbO7sjPa3dImH/Mqygy8cNdHLKOEC AjyHtUHC8S2Muwlh0Cpbg4YPOBV7KM7I9mpd/6C2KKyOOZgnSmmjXhc7YBm0kOM8jJ8RfTS0 5YExfGYxAqHWC3mgFevqMCk0bxDMHsWAWz1gXzgG4h5YrJ0O4AGFTHqa8a+w9E7g5/2R1ZZ8 kSiDhUIwpyHYx2XOnX51AsY7k8XpH27hWPsxjh9lXcypaqa3TDS6/zlcAsbN2VLQmh7kFqqJ pK72YNJFHO0ZhQkwUP2rX3xwLJW8fguR4GyaUJBfiysanpnTrP1rL2JJchG9JIvtyxTFuW6e 1GTDLDn8FMByy22OWxYyXggci2y/I3jlklzjGubam14rH/YZd1Y3RDb9cDRTv5X3yMbSW9/k zaETkOkMYyR9M6P34zGrvj4UmugUpNJdiy+9rm77H7i304wVCybyui0nsz7HAM61y7iytQsU j/H+R/4a4+tzK+6NON7YmFiA0L64MdhXIQigs03np5DkWMCiMCt9GEc2Xz2Lc0d2a/6ay8VQ iUXxtfO/AX/8EhzdzSRwIboSniWws1gfsS3JGQM1UrR9uhsD6GZpPxBlCpx+B+jqB7JJOJ6l XEbwOcv73gTh6cIvhAsx2OTGOJaG04QJiHqmxmSirL25KxKeGaid6Sx30tijJigCr+FuARVR Hf+fN8rAyZx6sx1NF+E3mf078nof9zZbNRbsRPx8V+IhuxcLtQqnfoPhDZ7EXr6uWw5xuU7i x13wJz8u5KIai1s8K+/Hh9EJ2jtfcpAn1Olxa1an8uQw8WuBsA4QGRNBcO0C6nwVmlO5pGFf 06UHTYxq2mWA+/aFA6bsgJ9qm7XVoqsPDeRLWUYytNrQF+cIlZeiUYaRmZf/NZxGwa0ycjma Eo86CoW4wuykSF3krcxDTqlB1b78R+vbiYoRZOfKhtP8wwE4F3aZMWa5+Q1BCpY+5y9sCSHL XGdbAlTS2RVSgqDHV+pbdzMrZHQtvOVAOazNa6EaLGHr6pFXPeNxI6z+pNh+yeQO86POHh7E vB93VBMFyMceYyRi3AETCoZkDjIZsiQqUKn+yF5mcu49eziRAPl4Ybn56J6Cdx04Fj2hK6CM 7TVnyNlMXNC0ZhKw3bUyb8Z1VpUiid0djDrH65S/SLKSavRnOdQAXt5I2tIDvAQuvsG/VMYC OqOktTxx6J1hf4zCk5YWBrmgM78bMgDJSemP1PCBVqXHL6BODvAztqxZP+sD7pKg4A2/1W8t C2aHEnqIjmY32CzBlb2ab0K13ndZ0AWsZr1aht3DGn/UN/qIga2NtN6l3xTo/V8h3/HM3IdL SkpdkpMqrOK6iYLyv57GmFH8j9kNbzdwXfftrGEbM1O96A3UUEW36pA7X83yqVY9nRBTf1xw m7Jq8J25kuhma+JwyZmVxxHrnBKgpiKtANsI/a8lNEIVHDa8RYK9WjVBQ4Noo4vMefU4/UJ8 PuVwZPXfS9F98PI8MAcAcnNNc/BN2AuZBPtETiSFwAFSD+3KUnVgFFbm/yJsHjJvt49sJemy /9sAvdLEUc4EP8XEBEvJ+Y5eMIuZBB+xI+/2dYP4WuioRLRQsRDo52BUeidVPzrITDflrJEY hoU3ZvyKpkVPYDgnUk+eh99houASC+yFZhd5yZmaAEzukBE9nNzG3Yy10zSYQSo+HYPFPSwk 01+mk5kbO8q7jup/0YvKw+Aun4riEdo04aA43jZYHvrIay3R40TFyfkqx17LMbgWwgsJU6zh RA2bW2VAesJ0/07LSYw1EefuIMTS6cGHOsdOENWnqnRPKhNsxwU6SS/mR0WvK2cU8IkylFsK Mbz5zFBw1wxNoZtfP6MfaYRnFEC2auD4336iOxukF1FfCNvuCvReTZW6hZQbuB0e3Okpr41u 13elzYRKjdXCfZ4/a41rgt4MuCEhUoMypZ7I1uqf6yaJqKd4S3bkNKQB0k33QUOnlVE+r5/1 YEidVCVXgYh1unZGxMMPMvEYQZbCqgavGDUZjqLuP7RzIhdOpXkUPjvSf6Sua0UhEO9AQtvG J4DpsgMBZij1kjEINyvdeRUj0x1uEKwfBPeULxAY3fp2H8frtu6zYNr0IUVPTwbDWhncG226 rvRug42ka+DUdMxMT8RWooJMG5zWdXvwnQI+S0YUH/siqRClFvnjXe0vCnbATjiYsA2Yf6VY UkpE9Sq4XAl9KPwj1fL85LYLmW8NNJ4u9aJ5/lJwvTPQ/5SU7R5tF/R3odCQHn/GVX1Kobgf qLTMdwdSYnsDXKrTlG0izQ0Vtr8etG3If2BhQjuA51fsIyawCwLP8igEDoTAFF1+/FF47hzL 15mAdJzcVvzugIyOrbqah+fycmrSn2xJCF+SukGi/29Y61LwiEsaO6j1XZmSYs1hbrSkwZFV NQBiRfQwuymbo9VXH3oG3BTTA7IoDIwi2lrMuthivd62h7DtkMQdiyabOE8InIRpMkyXBnBR Bc+Qnp9XVKXipDPpxKhz6xHtTUIhM5aiKVM+D33upuVCNpDcKastJPevjFmaIQ25aprPt66S iNjnIvZmi3DQZLQtAycTSP8EOBVyIA4yMNwRekR33kiPd0atIFB70soS8p4IKZAWvBEmw== IronPort-Data: A9a23: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 tVhD7bSyahFxI1sNGWq9Dg0 IronPort-HdrOrdr: A9a23:v6f0Cagx/t03ULGzSI+IgwnDxHBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: 9a23:P7auiWxtUGbU6LCbEtJwBgVIMOw/SWXwxUvaYHD7LWVnQeGyTFKfrfY= X-Talos-MUID: 9a23:rF5KaAgQu9QFPy/vNfmd4MMpMMRT3YP1Nwc3g642gsCudhNwOAudtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.15,318,1739833200"; d="scan'208,217";a="224095379" X-MGA-submission: =?us-ascii?q?MDEztRq2szLppnPUqHD5Q6o+Yi7bxnoOiDcb/B?= =?us-ascii?q?ptm30D1fVRwLYOieKk8OOQwPYr6uiNt/g4tbsNrCBQ48TiwhhieOdcYx?= =?us-ascii?q?ty3Kgkb0A3bxVsM7YRcLWcPg+QjzQFrVfsW2ii2tY2g0tCN2NUvQkVN1?= =?us-ascii?q?tNl7zqNwiWZjVGtpFbJZG1qA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 May 2025 11:22:19 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id EECE7564B7B; Tue, 27 May 2025 11:22:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1748337738; bh=YWf9AXPyfVSzQ6AMp5gObj5TgP6hnyJe3VRxULEaJ1c=; h=From:To:Subject:Date:Message-ID; b=TBvNMhCd5mGGnkbqA3oaAZD0SW4jypMIK67P7iqNE1Xm+Uytq9/p0En3mJvOlz6jn 0vV/CJtXAhFiAiuVfDUI5LyYkBuHNJzWiqoirBNxryK1u3DQwIp6pLyDaRxiNb8xG0 4yagO0zZSNGVB9fwCJrMqBUuU84eISrqsmmSOdUk= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 27 May 2025 11:22:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 27 11:22:18 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499968, queueID=89EFF564B7C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19326 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 20 to 27, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 nanoev 0.1 15th MirageOS retreat May 13th - 20th MlFront_Signify 2.3.1 - OpenBSD-compatible signify Opam 103: Bootstrapping a New OCaml Project with opam, by OCamlPro Retirement of Multicore CI Pipelines Dune 3.19 Wrote a Record/Replay Debugging tutorial A no-maths guide to monads macOS Metal Framework bindings for compute applications Other OCaml News Old CWN nanoev 0.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, I'm happy to announce the first release of [nanoev], yet another event loop abstraction. My goal with it is to have a narrow-waist interface between event loops (for now, `select' and `poll') and various abstractions built directly on top (for now using `picos'), without tying the event loop abstraction itself to a particular scheduler. The core interface for the event loop is basically: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type t =E2=94=82=20 =E2=94=82 val wakeup_from_outside : t -> unit =E2=94=82=20 =E2=94=82 val step : t -> unit =E2=94=82 (** Run one step of the event loop until something happens *) =E2=94=82=20 =E2=94=82 val close : t -> Unix.file_descr -> unit =E2=94=82 (** Close the file descriptor and clean it up *) =E2=94=82=20 =E2=94=82 val max_fds : t -> int =E2=94=82 (** Maximum number of file descriptors that can be observed at = once. *) =E2=94=82=20 =E2=94=82 val on_readable : =E2=94=82 t -> Unix.file_descr -> 'a -> 'b -> (closed:bool -> 'a -> 'b = -> unit) -> unit =E2=94=82=20 =E2=94=82 val on_writable : =E2=94=82 t -> Unix.file_descr -> 'a -> 'b -> (closed:bool -> 'a -> 'b = -> unit) -> unit =E2=94=82=20 =E2=94=82 val run_after_s : t -> float -> 'a -> 'b -> ('a -> 'b -> unit) = -> unit =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and nothing else. I've also started experimenting with using it to drive [tiny_httpd]. =E2=80=A2 docs: =E2=80=A2 release link: [nanoev] [tiny_httpd] 15th MirageOS retreat May 13th - 20th =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, gasche said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80 I'm just back from the [Mirage retreat], an event where people interested in [Mirage] meet for one week to work whatever they want. This retreat was organized by Hannes Mehnert as all past retreats, in Marrakech. Hannes ( @hannes ) asked participants to write a blog post to spread the word =E2=80=93 hence this post. [Mirage retreat] [Mirage] a Mirage retreat, in general =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C The retreat is unlike most other professional events that I attend, typically academic conferences. We are hosted in a place that is otherwise used as a hostel within the medina, the old city centre of Marrakech. Bed comfort is minimal (a room of six people, two of them snoring), but there are people on-site who prepare food and the food is great. There is very little structure for the day: we had a meeting every morning after breakfast to mention what we had done the day before, and talk sessions in the evening (typically one or two talks for around 40 minutes). The participants come in all shapes, some are regular contributors to the Mirage ecosystem and some (like me) know very little about Mirage. Some (like me) are very familar with OCaml and others know little about the language. Some people know about networking, security, system administration, communication protocols. The lack of structure encourages people to wander around, for example sitting alongside someone doing something specific and precise, to try something you and learn along. Last time I ended up writing bits of a network driver in OCaml, despite knowing nothing about network drivers; this time I worked on model-based testing of filesystems (see ), despite knowing nothing about file system implementations. Morocco has better network connectivity than during my first retreats, but it remains somewhat flaky =E2=80=93 and our network-usage habits keep increasing. In particular, I could not attend any online meeting, and this was /very/ nice =E2=80=93 just like conferences, it is liberating to= be busy for one week uninterrupted. In the past I managed to adapt to low-network usage fairly well. This time I noticed that I depend on github a lot, and I don't know how to have a good offline or network-restricted experience, to do code-reviews in particular. I wish offline version-controlled tools for code-review and bugtracking were more widely employed. Overall I find this organization excellent: participants get a place and time to learn from each other. I think it could potentially be used for other topics. For example people mentioned that it could be interesting to have a retreat focused on documentation in the OCaml ecosystem, and I find the idea interesting. (The rest of this post is basically a narrated version of my work log for the week; please feel free to just skip it.) My OCaml-focused work =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C One of my projects for the week was to take the time to review large pull-requests on the OCaml compiler that I wouldn't dare attacking usually, because my agenda is perpetually full of other things. I did a first round of review on [structured diagnostics], and additional reads through most of the [modular explicits] pull request (PR). In particular I wrote a small manual section for modular explicits, submitted as a [separate PR]. I hope to have moved from "it would be nice if these were reviewed /someday/" to a more short-term phase where I try to get these past the finish line before moving to other topics =E2=80=93 but we never know. I also went through the lists of PRs I had been assigned to, sometimes a while ago. (OCaml triagers assign PRs to each other to keep track of them and try to bring them to a decision, but in practice we often forget to do this and they linger around.) This was fairly effective and my stack of assigned PRs has been about cut in half: =E2=80=A2 reviewed and merged: =E2=81=83 `install_printer' cleanup (@pirbo) [#13969] =E2=81=83 ocamltest C refactors (@MisterDA) [#13962] =E2=81=83 format break hint fix (@Octachron) [#13853] =E2=81=83 local structure items (@nojb) [#14009] =E2=81=83 document `row_more' and `row_fixed' (@goldfirere) [#14023] =E2=80=A2 closed: =E2=81=83 immediacy computation revamp (@ccasin) [#11841] =E2=80=A2 adopted and merged: =E2=81=83 generational stack scanning (@xavierleroy) [#13594] =E2=81=83 statmemprofs and bigarrays (@stedolan) [#13675] =E2=81=83 recursive module error messages (@shivam-909) [#13608] =E2=80=A2 adopted but not yet merged =E2=81=83 distinguish two kinds of mutexes (@gasche) [#13716] (needs a review) =E2=81=83 source locations in implementations and interfaces (@malekbr) [#12654] (needs a review) A few of those PRs I "adopted", that is, I took control of the PR as the submitter would to rebase the PR and resubmit. In some cases this was mostly to apply my own review comments (sometimes someone else's), the change were minor and I could merge quickly. In some cases the changes were more invasive, and I would ask for another review. In one case I got stuck and wasn't sure how to rebase, so I asked the original author. "Adopting" PRs in this way is a new process to me, I generally try to guide the authors through making all the changes themselves. I wanted to go through my stack faster, and in some cases I knew that the authors were unresponsive and unavailable to make those changes. I found it fun, but it is probably best reserved to this situation where authors are unavailable. [structured diagnostics] [modular explicits] [separate PR] [#13969] [#13962] [#13853] [#14009] [#14023] [#11841] [#13594] [#13675] [#13608] [#13716] [#12654] Side errands =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C I worked on a race between domain-termination and compaction: [#14025]. I decided to try to make Dune more pleasant for building the OCaml compiler, and sent a draft/RFC PR at [dune#11819]. I heard a remark that it's painful not to be able to use lazy thunks anymore for library initialization code (lazy thunks are not concurrency-safe in OCaml 5); I tried to think about why this is hard to fall asleep again after a snoring attack, and ended up writing [#14043] instead. I motivated myself into [asking for volunteers] to review the Relocatable Compiler work. I also participated as a speaker to two talk sessions in the evening. I did a short demo of [Monolith] and model-based testing in general =E2=80=93 that was before we decided to use it on a Mirage filesystem. I talked about the OCaml Software Foundation and recent discussions around improving the security of the OCaml ecosystem. [#14025] [dune#11819] [#14043] [asking for volunteers] [Monolith] MlFront_Signify 2.3.1 - OpenBSD-compatible signify =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I am pleased to announce the new package `MlFront_Signify' is available in opam. `signify' was created by OpenBSD for maintainers to sign distributions and for users to verify those distributions. That is described in [signify: Securing OpenBSD From Us To You] and the [signify manpage]. `MlFront_Signify' is compatible with `signify'. The C code comes from firmware update code for the embedded Linux router distribution OpenWrt (much easier to build using OCaml tools compared to OpenBSD code). The _executable_ `mlfront-signify' has most of the same CLI options as OpenBSD `signify' and includes the same trivial tests as `signify', but on Unix you should just use your package manager's `signify'. The main contribution of `MlFront_Signify' is the OCaml _library_ that is documented at: =E2=80=A2 I used it with to perform auto-upgrades. A few MlFront packages participate: =E2=80=A2 `MlFront_Signify' to verify a potential upgrade =E2=80=A2 `MlFront_ZipFile' to unpack a verified upgrade =E2=80=A2 `MlFront_Cache' to provide an immutable store where multiple versions can co-exist In particular, the `SHA256.sig' file in the file listing was created using `MlFront_Signify' with the `SHA256' checksum file as input. That serves the same purpose as . /MlFront_ZipFile has an important bugfix so please upgrade it to 2.3.1 as well./ Thanks to the Mirage project where I use its `mirage-crypto-rng' secure random generator! Enjoy. [signify: Securing OpenBSD From Us To You] [signify manpage] Opam 103: Bootstrapping a New OCaml Project with opam, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 *Greetings Cameleers,* We=E2=80=99re back with a new installment in our `opam deep-dives' series! [*Opam 103: Bootstrapping a New OCaml Project with opam*] This time, we=E2=80=99re taking a step back to focus on a beginner-friend= ly guide to setting up a toy OCaml project with `opam', `dune', `cmdliner', and `alcotest'. This article is aimed at newer members of the ecosystem who may be wondering: =E2=80=A2 How do I structure an OCaml project from scratch? =E2=80=A2 How to best use opam in my dev workflow? =E2=80=A2 How do I write a minimal `.opam' file? =E2=80=A2 What about a fully fledged one? We walk through the `opam' rationale and offer guidance for building your first opam-compliant package =E2=80=94 the kind you can confidently = pin and use locally before getting to publishing it. As always, we hope this piece serves as a helpful reference for those onboarding into the `opam' and the OCaml ecosystem and getting their first taste of the tooling. :link: Check out the other `opam deep-dives' articles on Feel free to share feedback or thoughts right here in this thread! Thank you all for your time, and until next time, *The OCamlPro Team* [*Opam 103: Bootstrapping a New OCaml Project with opam*] Retirement of Multicore CI Pipelines =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Mark Elvers announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We believe that the two OCurrent pipelines setup for testing OCaml multicore have now served their purpose and will be retired. =E2=80=A2 [https://ocaml-multicoretests.ci.dev:8100] =E2=80=A2 [https://ocaml-multicore.ci.dev:8100] Please let me know if you still feel these have value. [https://ocaml-multicoretests.ci.dev:8100] [https://ocaml-multicore.ci.dev:8100] Dune 3.19 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune team is happy to announce the release of dune `3.19.0' :smile: This release contains some important bug fixes along with some improvements for the `foreign_library' stanza. It introduces support for concurrent builds through the RPC server. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 Fixed a bug that was causing cram tests attached to multiple al= iases to be run multiple times. (#11547, @Alizter) =E2=80=A2 Fix: pass pkg-config (extra) args in all pkgconfig invocations.= A missing =E2=80=93personality flag would result in pkgconf not finding libraries in some contexts. (#11619, @MisterDA) =E2=80=A2 Fix: Evaluate `enabled_if' when computing the stubs for stanzas= such as `foreign_library' (#11707, @Alizter, @rgrinberg) =E2=80=A2 Fix $ dune describe pp for libraries in the presence of `(include_subdirs unqualified)' (#11729, fixes #10999, @rgrinberg) =E2=80=A2 Fix `$ dune subst' in sub directories of a git repository (#117= 60, fixes #11045, @Richard-Degenne) =E2=80=A2 Fix a crash involving `Path.drop_prefix' when using Melange on Windows (#11767, @nojb) =E2=97=8A Added =E2=80=A2 Added detection and warning for common typos in package depende= ncy constraints (#11600, fixes #11575, @kemsguy7) =E2=80=A2 Added `(extra_objects)' field to `(foreign_library)' stanza with `(:include)' support. (#11683, @Alizter) =E2=97=8A Changed =E2=80=A2 Allow build RPC messages to be handled by dune's RPC server in = eager watch mode (#11622, @gridbugs) =E2=80=A2 Allow concurrent build with RPC server (#11712, @gridbugs) Wrote a Record/Replay Debugging tutorial =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sid Kshatriya announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I've written a *tutorial* on Record/Replay debugging. If you're interested in reverse debugging please check it out [here]. You can do Record/Replay style debugging of your `ocamlc.opt' compiled executables. You will be able to place breakpoints on all symbols exposed by the `ocaml.opt' compiler =E2=80=93 this includes C functions + OCaml functions from your OCaml program and do things like reverse-continue. For more context please see an announcement I made a couple of months ago: (What's new in this new discuss.ocaml.org post is to give focus to the tutorial I've very recently written) *How can `rr' / _Software Counters_ mode `rr' help me in OCaml if I'm not interested in gdb style debugging the OCaml executables ?* There are some other useful things that `rr' can do for OCaml-ers. *Here is one:* Let's say you want to know what programs have been executed when you compile a ocaml program via dune. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ dune init project hello_world =E2=94=82 $ cd hello_world/ =E2=94=82 $ rr record -W -- dune b =E2=94=82 rr: Saving execution to trace directory `/home/sidk/.local/shar= e/rr/dune-5'. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Now run `rr ps'. You will get the exact invocations of all the programs that `dune build' triggered ! This takes you all the way down to showing you `ld' and `ar' invocations ! Very useful when you want to know what happened in the whole process tree. /editor=E2=80=99s note: please follow the post link to see this big termi= nal output./ [here] A no-maths guide to monads =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Prompted by someone complaining online about Haskell documentation, I wrote a zero-maths guide to monads (in OCaml, but it applies somewhat more broadly, it's just OCaml has nice binding opearators): macOS Metal Framework bindings for compute applications =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Lukasz Stafiniak announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi! I'm happy to announce the `metal' package with bindings to the Metal framework, with a relatively broad coverage except it _does not_ cover anything graphics or UI related. =E2=80=A2 Hosted on GitHub: [lukstafi/ocaml-metal: OCaml bindings to Apple Metal for general compute applications] =E2=80=A2 API documentation: [Metal (metal.Metal)] =E2=80=A2 Released to the repository: [metal 0.1.0 (latest) =C2=B7 OCaml = Package] =E2=80=A2 Example usage: [ocannl/arrayjit/lib/metal_backend.ml at master = =C2=B7 ahrefs/ocannl] Enjoy! P.S. Disclaimer: code contains AI slop (and likely also my own errors). It's my first major employment of / "collaboration" with Large Language Models and I leaned into accepting choices made by the models. [lukstafi/ocaml-metal: OCaml bindings to Apple Metal for general compute applications] [Metal (metal.Metal)] [metal 0.1.0 (latest) =C2=B7 OCaml Package] [ocannl/arrayjit/lib/metal_backend.ml at master =C2=B7 ahrefs/ocannl] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [The origin of the pipeline operator (`|>`)] [the ocaml.org blog] [The origin of the pipeline operator (`|>`)] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 20 to 27, 2025.

    nanoev 0.1

    Simon Cruanes announced

    Hello,

    I'm happy to announce the first release of nanoev, yet another event loop abstraction. My goal with i= t is to have a narrow-waist interface between event loops (for now, s= elect and poll) and various abstractions built directly= on top (for now using picos), without tying the event loop ab= straction itself to a particular scheduler. The core interface for the even= t loop is basically:

    type t
    
    val wakeup_from_outside : t -> unit
    
    val step : t -> unit
    (** Run one step of the=
     event loop until something happens *)
    
    val close : t -> Unix.file_descr -> unit
    (** Close the file desc=
    riptor and clean it up *)
    
    val max_fds : t -> int
    (** Maximum number of f=
    ile descriptors that can be observed at once. *)
    
    val on_readable :
      t -> Unix.file_descr -> 'a -=
    > 'b -> (closed:bool -> 'a -> '=
    b -> unit) -> unit
    
    val on_writable :
      t -> Unix.file_descr -> 'a -=
    > 'b -> (closed:bool -> 'a -> '=
    b -> unit) -> unit
    
    val run_after_s : t -> float -> 'a -> 'b -=
    > ('a -> 'b -> unit) -> unit
    

    and nothing else. I've also started experimenting with using it to drive tiny_httpd.

    15th MirageOS retreat May 13th - 20th

    Continuing this thread, gasche said

    I'm just back from the Mirage retrea= t, an event where people interested in M= irage meet for one week to work whatever they want. This retreat was or= ganized by Hannes Mehnert as all past retreats, in Marrakech. Hannes ( @han= nes ) asked participants to write a blog post to spread the word – h= ence this post.

    a Mirage retreat, in general

    The retreat is unlike most other professional events that I attend, typical= ly academic conferences. We are hosted in a place that is otherwise used as= a hostel within the medina, the old city centre of Marrakech. Bed comfort = is minimal (a room of six people, two of them snoring), but there are peopl= e on-site who prepare food and the food is great. There is very little stru= cture for the day: we had a meeting every morning after breakfast to mentio= n what we had done the day before, and talk sessions in the evening (typica= lly one or two talks for around 40 minutes).

    The participants come in all shapes, some are regular contributors to the M= irage ecosystem and some (like me) know very little about Mirage. Some (lik= e me) are very familar with OCaml and others know little about the language= . Some people know about networking, security, system administration, commu= nication protocols. The lack of structure encourages people to wander aroun= d, for example sitting alongside someone doing something specific and preci= se, to try something you and learn along. Last time I ended up writing bits= of a network driver in OCaml, despite knowing nothing about network driver= s; this time I worked on model-based testing of filesystems (see https://discuss.ocaml.org/t/blog-post-us= ing-model-based-testing-on-a-mirage-filesystem-implementation/16666 ), = despite knowing nothing about file system implementations.

    Morocco has better network connectivity than during my first retreats, but = it remains somewhat flaky – and our network-usage habits keep increa= sing. In particular, I could not attend any online meeting, and this was very nice – just like conferences, it is liberating to be busy = for one week uninterrupted. In the past I managed to adapt to low-network u= sage fairly well. This time I noticed that I depend on github a lot, and I = don't know how to have a good offline or network-restricted experience, to = do code-reviews in particular. I wish offline version-controlled tools for = code-review and bugtracking were more widely employed.

    Overall I find this organization excellent: participants get a place and ti= me to learn from each other. I think it could potentially be used for other= topics. For example people mentioned that it could be interesting to have = a retreat focused on documentation in the OCaml ecosystem, and I find the i= dea interesting.

    (The rest of this post is basically a narrated version of my work log for t= he week; please feel free to just skip it.)

    My OCaml-focused work

    One of my projects for the week was to take the time to review large pull-r= equests on the OCaml compiler that I wouldn't dare attacking usually, becau= se my agenda is perpetually full of other things. I did a first round of re= view on structured di= agnostics, and additional reads through most of the modular explicits pull request (PR).= In particular I wrote a small manual section for modular explicits, submit= ted as a separate PR<= /a>. I hope to have moved from "it would be nice if these were reviewed = someday" to a more short-term phase where I try to get these past the f= inish line before moving to other topics – but we never know.

    I also went through the lists of PRs I had been assigned to, sometimes a wh= ile ago. (OCaml triagers assign PRs to each other to keep track of them and= try to bring them to a decision, but in practice we often forget to do thi= s and they linger around.) This was fairly effective and my stack of assign= ed PRs has been about cut in half:

    • reviewed and merged:
    • closed:
      • immediacy computation revamp (@ccasin) #11841
    • adopted and merged:
      • generational stack scanning (@xavierleroy) #13594
      • statmemprofs and bigarrays (@stedolan) #13675
      • recursive module error messages (@shivam-909) #13608
    • adopted but not yet merged
      • distinguish two kinds of mutexes (@gasche) #13716 (needs a review)
      • source locations in implementations and interfaces (@malekbr) #12654 (needs a review)<= /li>

    A few of those PRs I "adopted", that is, I took control of the PR as the su= bmitter would to rebase the PR and resubmit. In some cases this was mostly = to apply my own review comments (sometimes someone else's), the change were= minor and I could merge quickly. In some cases the changes were more invas= ive, and I would ask for another review. In one case I got stuck and wasn't= sure how to rebase, so I asked the original author.

    "Adopting" PRs in this way is a new process to me, I generally try to guide= the authors through making all the changes themselves. I wanted to go thro= ugh my stack faster, and in some cases I knew that the authors were unrespo= nsive and unavailable to make those changes. I found it fun, but it is prob= ably best reserved to this situation where authors are unavailable.

    Side errands

    I worked on a race between domain-termination and compaction: #14025. I decided to try to ma= ke Dune more pleasant for building the OCaml compiler, and sent a draft/RFC= PR at dune#11819.= I heard a remark that it's painful not to be able to use lazy thunks anymo= re for library initialization code (lazy thunks are not concurrency-safe in= OCaml 5); I tried to think about why this is hard to fall asleep again aft= er a snoring attack, and ended up writing #14043 instead. I motivated myself into asking for volunteers to review the Relocatable Compiler work.

    I also participated as a speaker to two talk sessions in the evening. I did= a short demo of Mono= lith and model-based testing in general – that was before we dec= ided to use it on a Mirage filesystem. I talked about the OCaml Software Fo= undation and recent discussions around improving the security of the OCaml = ecosystem.

    MlFront_Signify 2.3.1 - OpenBSD-compatible signify

    jbeckford announced

    I am pleased to announce the new package MlFront_Signify is av= ailable in opam.

    signify was created by OpenBSD for maintainers to sign distrib= utions and for users to verify those distributions. That is described in signify: Secur= ing OpenBSD From Us To You and the signify manpage.

    MlFront_Signify is compatible with signify. The C= code comes from firmware update code for the embedded Linux router distrib= ution OpenWrt (much easier to build using OCaml tools compared to OpenBSD c= ode). The executable mlfront-signify= has most of the same CLI options as OpenBSD signify an= d includes the same trivial tests as signify, but on Unix you = should just use your package manager's signify. The main contr= ibution of MlFront_Signify is the OCaml library that is documented at:

    I used it with https://discuss.ocaml.= org/t/ann-combining-llvm-mc-lld-precompiled-c-and-bytecode/16675?u=3Djbeckf= ord to perform auto-upgrades. A few MlFront packages participate:

    • MlFront_Signify to verify a potential upgrade
    • MlFront_ZipFile to unpack a verified upgrade
    • MlFront_Cache to provide an immutable store where multiple= versions can co-exist

    In particular, the SHA256.sig file in the file listing https:= //github.com/diskuv/dkcoder/releases/tag/2.3.202505202143 was created u= sing MlFront_Signify with the SHA256 checksum fil= e as input. That serves the same purpose as https://cdn.openbsd.org/pub/Ope= nBSD/snapshots/arm64/SHA256.sig.

    MlFront_ZipFile has an important bugfix so please upgrade it to 2.3.1 as= well.

    Thanks to the Mirage project where I use its mirage-crypto-rng= secure random generator!

    Enjoy.

    Opam 103: Bootstrapping a New OCaml Project with opam, by OCam= lPro

    OCamlPro announced

    Greetings Cameleers,

    We=E2=80=99re back with a new installment in our opam deep-dives series!

    Opam 103: Bootstrapping a New OCaml Project with opam

    This time, we=E2=80=99re taking a step back to focus on a beginner-friendly= guide to setting up a toy OCaml project with opam, dune= , cmdliner, and alcotest.

    This article is aimed at newer members of the ecosystem who may be wonderin= g:

    • How do I structure an OCaml project from scratch?
    • How to best use opam in my dev workflow?
    • How do I write a minimal .opam file?
    • What about a fully fledged one?

    We walk through the opam rationale and offer guidance for buil= ding your first opam-compliant package =E2=80=94 the kind you can confident= ly pin and use locally before getting to publishing it.

    As always, we hope this piece serves as a helpful reference for those onboa= rding into the opam and the OCaml ecosystem and getting their = first taste of the tooling.

    :link: Check out the other opam deep-dives articles on https://ocamlpro.com/blog/

    Feel free to share feedback or thoughts right here in this thread!

    Thank you all for your time, and until next time, The OCamlPro Team

    Retirement of Multicore CI Pipelines

    Mark Elvers announced

    We believe that the two OCurrent pipelines setup for testing OCaml multicor= e have now served their purpose and will be retired.

    Please let me know if you still feel these have value.

    Dune 3.19

    Etienne Marais announced

    The Dune team is happy to announce the release of dune 3.19.0 = :smile:

    This release contains some important bug fixes along with some improvements= for the foreign_library stanza. It introduces support for con= current builds through the RPC server.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • Fixed a bug that was causing cram tests attached to multiple aliases to= be run multiple times. (#11547, @Alizter)
      • Fix: pass pkg-config (extra) args in all pkgconfig invocations. A missi= ng –personality flag would result in pkgconf not finding libraries in some contexts. (#1161= 9, @MisterDA)
      • Fix: Evaluate enabled_if when computing the stubs for stan= zas such as foreign_library (#11707, @Alizter, @rgrinberg)
      • Fix $ dune describe pp for libraries in the presence of (include_= subdirs unqualified) (#11729, fixes #10999, @rgrinberg)
      • Fix $ dune subst in sub directories of a git repository (#= 11760, fixes #11045, @Richard-Degenne)
      • Fix a crash involving Path.drop_prefix when using Melange = on Windows (#11767, @nojb)
    • Added
      • Added detection and warning for common typos in package dependency constraints (#11600, fixes #11575, @kemsguy7)
      • Added (extra_objects) field to (foreign_library) stanza with (:include) support. (#11683, @Alizter)
    • Changed
      • Allow build RPC messages to be handled by dune's RPC server in eager wa= tch mode (#11622, @gridbugs)
      • Allow concurrent build with RPC server (#11712, @gridbugs)

    Wrote a Record/Replay Debugging tutorial

    Sid Kshatriya announced

    I've written a tutorial on Record/Replay debugging. If you're intere= sted in reverse debugging please check it out here.

    You can do Record/Replay style debugging of your ocamlc.opt co= mpiled executables. You will be able to place breakpoints on all symbols ex= posed by the ocaml.opt compiler – this includes C funct= ions + OCaml functions from your OCaml program and do things like reverse-c= ontinue.

    For more context please see an announcement I made a couple of months ago: https://discuss.ocaml.org/t/ann-a-tool-to-reverse-= debug-ocaml-other-binary-runs/16366/1

    (What's new in this new discuss.ocaml.org post is to give focus to the tuto= rial I've very recently written)

    How can rr / Software Counters mode rr help me in OCaml if I'm not interested in gdb sty= le debugging the OCaml executables ?

    There are some other useful things that rr can do for OCaml-er= s.

    Here is one: Let's say you want to know what programs have been exec= uted when you compile a ocaml program via dune.

    $ dune init project hello_world
    $ cd hello_world/
    $ rr record -W -- dune b
    rr: Saving execution to trace directory `/home/sidk/.local/share/rr/dune-5'.
    

    Now run rr ps. You will get the exact invocations of all the p= rograms that dune build triggered ! This takes you all the way= down to showing you ld and ar invocations !

    Very useful when you want to know what happened in the whole process tree.

    editor=E2=80=99s note: please follow the post link to see this big termi= nal output.

    A no-maths guide to monads

    Rapha=C3=ABl Proust announced

    Prompted by someone complaining online about Haskell documentation, I wrote= a zero-maths guide to monads (in OCaml, but it applies somewhat more broad= ly, it's just OCaml has nice binding opearators):

    https://raphael-proust.gitlab.io/code/no-maths-guide-to-monads.html

    macOS Metal Framework bindings for compute applications

    Lukasz Stafiniak announced

    Hi!

    I'm happy to announce the metal package with bindings to the M= etal framework, with a relatively broad coverage except it does not cover anything graphics or UI related.

    Enjoy!

    P.S. Disclaimer: code contains AI slop (and likely also my own errors). It'= s my first major employment of / "collaboration" with Large Language Models= and I leaned into accepting choices made by the models.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Li+oS104; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=u+VVmk6U; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 30938400A3 for ; Tue, 3 Jun 2025 09:20:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=+fUcwfQ2GxXi9Eo/EFWj0UHrBUnG14uYIj3ot7KK/54=; b=Li+oS104DPW7RNoFt7eZmaLe4JeObxMdw8NjlS0yMZia2u5KJku+8qMp bQqMga08kI7khr8TpcD003VjmzNZI9Yr3tZHDvTFJG02XKvKrk3s29pEv YWbN0Ekh5zHLZXenrhtZUp/9QvazCNTv3hSmx7eyD3pcOvovY5Y+/50o/ A=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,205,1744063200"; d="scan'208,217";a="225024187" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Jun 2025 11:20:00 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 884BDE0BE9; Tue, 3 Jun 2025 11:20:00 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D8ACAE0131 for ; Tue, 3 Jun 2025 11:19:57 +0200 (CEST) IronPort-SDR: 683ebe3c_dA3x4+6lgJ9aVfNw2Q2De12a+19taAXboVxYOj9rSCOIwvI QrXCvsCWqL8+cwzdpeOznAZZT4VcuKNvWv89pFg== X-IPAS-Result: =?us-ascii?q?A0GmBgCtvT5ohSIeaIFaFoJIgT+BAxkBZlozBwhJhFWBY?= =?us-ascii?q?4FsjiKRS4NFhzSBaYFCIxUBAwENLgEVCgECBAEBAwECAYIMgT2BN4tgAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAUBJhXsNS?= =?us-ascii?q?QEBBAsBgWoZOHGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQIMAREYfgoTAQE4GCMDCQsBBgMCEQE1AwETARIUBoJoAYIfA?= =?us-ascii?q?gJLAwUMBpMEm0t6gTKBAYIMAQEGgQhTD9o4gWUDBoFJhW2CSRoBKkhrAoRIh?= =?us-ascii?q?DwnD4FVRIFKgj0Hb4JKFwEBAQFcOw0YAQFNEoMcgmmCL4ECFB1ZSoELNx1eg?= =?us-ascii?q?WqDIAQQVS88gjqEV0WCNYtngURLMywBVRMXCwcFYYEIAyo0MW4yHYINhRmCE?= =?us-ascii?q?oIHiQGESStPhSKBJoNhFBNrQAMLbT03FBuYLBwmGoJ9JQ44BgF7ExQFEQIEH?= =?us-ascii?q?AINIQgtEwMVBBkXBBUGL0iSfCqPU6J2NAeEHoFeBgyISj2BJpYDhASNDJIKh?= =?us-ascii?q?0YimGEigjaGGoENgS+Bb2qVWAQEG4U2gX8jPG8BGwIMBzMaMEOCMwEBATEJR?= =?us-ascii?q?hwPjX+EHwOBPoEbgX87wEtBNQIBATgCBwEKAQEDCYViAQGDBIIXhUyBSwEB?= IronPort-PHdr: A9a23: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 p5Y13nj IronPort-Data: A9a23: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 wRAO0QDOXk= IronPort-HdrOrdr: A9a23:EwLV2KiJ6pDnJXk/S7ID2P6Me3BQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3AkyYIcmtQNBo5MnKCmfxZmBMa6IsKT2KDzXnoB3S?= =?us-ascii?q?2KldrUIGFdWSQ1r9rxp8=3D?= X-Talos-MUID: 9a23:UZFWGAjYrurcPXfFa2RJg8Mpc+g4w/WoAUU0yqotl5KZM3JaJQuQtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,205,1744063200"; d="scan'208,217";a="118078984" X-MGA-submission: =?us-ascii?q?MDFzcMlaYmAOxxSGsO8wK71RgETrNecFhmUv/V?= =?us-ascii?q?qaqOcM+C4NlHRiQYccKPThyQ3ggb9KW3fprd5WynSP6YYZIQmYxT973h?= =?us-ascii?q?Rp1Dvmcfzm8Ik4cLq1trqA17eASHvJDBjLrIkcVZm4d2DRe7Tk3ryYtD?= =?us-ascii?q?koxWNFm0vWD3FV5rQgjOaPYg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Jun 2025 11:19:56 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 73333564D66; Tue, 3 Jun 2025 11:19:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1748942395; bh=Y5Vgfl5mooqtfRmCaTPWPMmKpLvvmM1ecDmwd3xoECU=; h=From:To:Subject:Date:Message-ID; b=u+VVmk6U/tj4vbIZ6kAi6q6Ag2jic/vp0BXsLt5bxbL1tyjAhtW/yEZaftJ75sT6F IZKE/QrsLzXfjtKHMB4EG1ekijfcyaoWfsLQqSBmf2rqQidBM8MYOpoHXxCcJufcKU lZbhj3EqMipIpYU+dhBJXm1pjorWVyRHYxK+ugvc= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Jun 2025 11:19:55 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 3 11:19:55 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.207989, queueID=9F397564D6B X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19333 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of May 27 to June 03, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 First alpha release of OCaml 5.4.0 Combining LLVM MC, lld, precompiled C and bytecode Uniqueness for Behavioural Types =C2=B7 KC Sivaramakrishnan A ppx for denoting unreachable branches Sound on OCaml on Windows Opam repository archival, phase 3 Peer-Programming in Modern OCaml with ChatGPT and Gemini Old CWN First alpha release of OCaml 5.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 Four months after the release of OCaml 5.3.0, the set of new features for the future version 5.4.0 of OCaml has been frozen. We are thus happy to announce the first alpha release for OCaml 5.4.0. This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions) [^1]. The progresses on stabilising the ecosystem are tracked on the [opam readiness for 5.4.0 meta-issue]. The full release is expected around the end of July [^2]. If you find any bugs, please report them on [OCaml's issue tracker]. If you are interested in the ongoing list of new features and bug fixes, you can have a look at [the changelog for OCaml 5.4.0]. Happy hacking, Florian Angeletti for the OCaml team [opam readiness for 5.4.0 meta-issue] [OCaml's issue tracker] [the changelog for OCaml 5.4.0] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.4.0~alpha1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the alpha is also available at these addresses: =E2=80=A2 GitHub: =E2=80=A2 OCaml archives at Inria: Fine-Tuned Compiler Configuration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.4.0~alpha1+op= tions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.4.0~alpha1+flambda+nffa ocaml-variants.5.4= .0~alpha1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. [^1]: The release process is described at . [^2]: See also the [prospective release calendar]. [prospective release calendar] Combining LLVM MC, lld, precompiled C and bytecode =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 The latest update `2.3.202505282324' (see top post for links) has several fixes: 1. Using `./dk -O ReleaseSmall Exe' now has a working Windows target. The generated Windows executables do not require Visual Studio at runtime. 2. A use-after-free bug has been fixed which mainly affected cross-compilation for the Linux target. 3. Using a new `./dk gc clear' command will remove all the cache space. 4. A bug has been fixed with the auto-updates where it downloaded up to 5 updates and then reverted to the original. Uniqueness for Behavioural Types =C2=B7 KC Sivaramakrishnan =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Shon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A ppx for denoting unreachable branches =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charles Averill announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wanted a semantic construct to specifically denote unreachable control-flow branches, so here it is. Prints out an error with file and line number upon being erroneously reached. Sound on OCaml on Windows =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Steve Sherratt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Opam repository archival, phase 3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear everyone, the phase 3 of the opam repository archival (taking the x-maintenance-intent into account) is now ready. We ran on 30th of May the maintenance-intent filter, which resulted in 6463 candidates of which we'd like to archive 5714. The full list is below, the PRs are at and . The proposed merge date is on June 9th, so a week from now. In case you encounter (a) a breakage or (b) a package and version that you'd like to retain, please report this (best as a comment to ) The list of to-be-archived packages: /editor=E2=80=99s note: please see t= he post link for the long list of packages/ Peer-Programming in Modern OCaml with ChatGPT and Gemini =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Letan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It=E2=80=99s 2025, and it=E2=80=99s becoming harder to ignore that LLMs a= re here to stay, and are changing the way we are programming at large. Or at least, it feels like it. For a while, I=E2=80=99ve been kind of a /gaulois r=C3=A9fractaire/ mysel= f, when it comes to adopting this technology. Over the month of May, I decided to change that, and at least /try/ to integrate them in my daily toolkit. Since I write OCaml professionally, I picked an arbitrary project in a domain I wasn=E2=80=99t familiar for, to see the impact of L= LMs on a more niche language (no offense ahah). After the fact, [I wrote a devlog of the exercise]. In particular, I got myself familiar with EIO in the process, and I wanted to discuss the following part of my article with the OCaml community My personal conclusion is that LLMs are not ready for any real programming task involving Eio, and I am really curious to understand why. Do they keep hallucinating functions because Eio is a really generic name, and maybe they are mixing context from the Python library with the OCaml one? Or is it because the API of Eio has changed a lot over the years? I am also wondering how, as a the author of a library, I can fix a similar situation. Assuming ChatGPT starts assuming false statements about `cohttp-connpool-eio', how do I address this? I suspect being =E2=80=9CLLMs-friendly=E2=80=9D = will be increasingly important for a software library=E2=80=99s success. For a while, people learnt to become search engine friendly. They turned themselves into export of Google algorithm, etc. Will we do the same thing with LLMs? Are there guidelines? How can we =E2=80=9Cfix=E2=80= =9D at our level a situation where a LLM got a software library we wrote completely wrong? I=E2=80=99d be curious to hear your thoughts. [I wrote a devlog of the exercise] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of May 27 to June 03, 20= 25.

    First alpha release of OCaml 5.4.0

    octachron announced

    Four months after the release of OCaml 5.3.0, the set of new features for t= he future version 5.4.0 of OCaml has been frozen. We are thus happy to announc= e the first alpha release for OCaml 5.4.0.

    This alpha version is here to help fellow hackers join us early in our bug hunting and opam ecosystem fixing fun (see below for the installation instructions) [^1].

    The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.= 4.0 meta-issue.

    The full release is expected around the end of July [^2].=20

    If you find any bugs, please report them on OCaml's issue tracker.

    If you are interested in the ongoing list of new features and bug fixes, yo= u can have a look at the changelog f= or OCaml 5.4.0.

    Happy hacking, Florian Angeletti for the OCaml team

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.4.0~alpha1
    

    The source code for the alpha is also available at these addresses:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.4.0~alpha1+options =
    <option_list>
    

    where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

    opam switch create 5.4.0~alpha1+flambda+nffa ocaml-variants.5.4.0~alpha1+op=
    tions ocaml-option-flambda ocaml-option-no-flat-float-array
    

    All available options can be listed with opam search ocaml-option.

    [^1]: The release process is described at https://github.com/ocaml= /ocaml/blob/trunk/release-info/introduction.md .

    [^2]: See also the prospective release calendar.

    Combining LLVM MC, lld, precompiled C and bytecode

    Continuing this thread, jbeckford announced

    The latest update 2.3.202505282324 (see top post for links) ha= s several fixes:

    1. Using ./dk -O ReleaseSmall Exe now has a working Windows t= arget. The generated Windows executables do not require Visual Studio at ru= ntime.
    2. A use-after-free bug has been fixed which mainly affected cross-compila= tion for the Linux target.
    3. Using a new ./dk gc clear command will remove all the cach= e space.
    4. A bug has been fixed with the auto-updates where it downloaded up to 5 = updates and then reverted to the original.

    A ppx for denoting unreachable branches

    Charles Averill announced

    I wanted a semantic construct to specifically denote unreachable control-fl= ow branches, so here it is. Prints out an error with file and line number u= pon being erroneously reached.=20

    https://opam.ocaml.org/packages/ppx_unreachable/ppx_unreachable.1.0/<= /a>

    Opam repository archival, phase 3

    Hannes Mehnert announced

    Dear everyone,

    the phase 3 of the opam repository archival (taking the x-maintenance-inten= t into account) is now ready. We ran on 30th of May the maintenance-intent = filter, which resulted in 6463 candidates of which we'd like to archive 571= 4. The full list is below, the PRs are at https://github.com/ocaml/opam-repositor= y-archive/pull/18 and https://github.com/ocaml/opam-repository/pull/27977.

    The proposed merge date is on June 9th, so a week from now.

    In case you encounter (a) a breakage or (b) a package and version that you'= d like to retain, please report this (best as a comment to https://github.com/oca= ml/opam-repository-archive/pull/18)

    The list of to-be-archived packages: editor=E2=80=99s note: please see the post link for the long list of pac= kages

    Peer-Programming in Modern OCaml with ChatGPT and Gemini

    Thomas Letan announced

    It=E2=80=99s 2025, and it=E2=80=99s becoming harder to ignore that LLMs are= here to stay, and are changing the way we are programming at large. Or at = least, it feels like it.

    For a while, I=E2=80=99ve been kind of a gaulois r=C3=A9fractaire my= self, when it comes to adopting this technology. Over the month of May, I d= ecided to change that, and at least try to integrate them in my dail= y toolkit. Since I write OCaml professionally, I picked an arbitrary projec= t in a domain I wasn=E2=80=99t familiar for, to see the impact of LLMs on a= more niche language (no offense ahah).

    After the fact, I wrote a devlog of the exercise.

    In particular, I got myself familiar with EIO in the process, and I wanted = to discuss the following part of my article with the OCaml community

    My personal conclusion is that LLMs are not ready for any real programming = task involving Eio, and I am really curious to understand why. Do they keep= hallucinating functions because Eio is a really generic name, and maybe th= ey are mixing context from the Python library with the OCaml one? Or is it = because the API of Eio has changed a lot over the years?

    I am also wondering how, as a the author of a library, I can fix a similar = situation. Assuming ChatGPT starts assuming false statements about co= http-connpool-eio, how do I address this? I suspect being =E2=80=9CL= LMs-friendly=E2=80=9D will be increasingly important for a software library= =E2=80=99s success.

    For a while, people learnt to become search engine friendly. They turned th= emselves into export of Google algorithm, etc. Will we do the same thing wi= th LLMs? Are there guidelines? How can we =E2=80=9Cfix=E2=80=9D at our leve= l a situation where a LLM got a software library we wrote completely wrong?

    I=E2=80=99d be curious to hear your thoughts.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=XY9JzzzX; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=uQwXj2vc; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 89E6B4003A for ; Tue, 10 Jun 2025 13:36:49 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MCm3mKGjPRiIFkwHKj+hQerq9QEwI5Gj6QEMETpvKy0=; b=XY9JzzzX+dHZyZN7RXfCodrYD5JnZXFpBZNLVTuvk+lXtVTW5T1RfSdD WzPjbwEwQWgfmtAw1KjcxYu2StoYHIYw3TeQ8JD2FRjdVrq3VBWCbyaYQ e8P1fBcThoRrmt+gBwtFf6pQCYCnipE+BpfK8bUmzGzo4Iv8aJxVcxrtf 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,225,1744063200"; d="scan'208,217";a="226117224" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Jun 2025 15:36:48 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 3D5B3E0CD8; Tue, 10 Jun 2025 15:36:48 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 4B3CCE0131 for ; Tue, 10 Jun 2025 15:36:43 +0200 (CEST) IronPort-SDR: 684834e9_l29JS5Lt87g7ulQ/rQ4PD66D7M+u54H1inJ1DnW+/L03uNo 3ilWtNa19O79UCwyiDteffQ3JCYhZ5Nt46ZL+6w== X-IPAS-Result: =?us-ascii?q?A0EGDgB6M0hohSIeaIFaFgcBATwBBQUBAgEJAYFqAYE+W?= =?us-ascii?q?ygZAWAGWhEiBwhJhFWDT44inESCegMuIxUBAwENFAIBAg4HAQUaAQIEAQEDA?= =?us-ascii?q?QIBggyCdAIWi08CHwYBBDQTAQIEAQEBAQMCAwEBAQEBARABAQUBAQECAQECB?= =?us-ascii?q?AYBAhABAQEBQEmFew1JAQEECwGBahk4cYElAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAggEAQIxKz4CCQoTAQE4GCMDEAQBB?= =?us-ascii?q?gMCBA0BNRcBEhqCEFgBgh8CAksDBAEMBj+SF5tLeoEygQGCDAEBBoEIPgIBC?= =?us-ascii?q?wICAwEOCSUB2gqBG0oJgUkBhWyCSRoBKkhrhEqEPCcPgVVEgRWBO4E+b4I/C?= =?us-ascii?q?xcBAQEBGERdAwEBTQmDJYJpghEXgQIUHYIugxyEOIUGgkeCdowdgUQiAyYzL?= =?us-ascii?q?AFVExcLBwVbgQgDKjQxbjIdgg2FGYISggSJAYRJK0+FIYEmg2ERE3IPBxpAA?= =?us-ascii?q?wttPTcUG5hNHCgagyMOCy0GAQEsECMBKAUBExYCUAQEDhUgBBURDAkFCQQYK?= =?us-ascii?q?AYJAgsCLZJMNCqPU44dk1CBCjQHhB6BXgYMiQeBJpIsg1eFW6UGIphiIoldg?= =?us-ascii?q?SYJYIF5lVIGJoUzgX8jPIEgMxowQ4JnCQo8HA+RQ1sDgT6BJoF0O4JmB69ZQ?= =?us-ascii?q?TUCAQE4AgcBCgEBAwmFRR0BAWmCG4IXhUyBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVhD7bSyahFxI1sNGWq9Dg0 IronPort-HdrOrdr: A9a23:+2Rl5a1MLEgCYiJjARmTDAqjBSpyeYIsimQD101hICG9Lfb0qy n+pp4mPEHP4wr5AEtQ/uxoS5PwJ080lKQFlrX5Uo3SOTUO1FHHEGgA1/qV/9SDIVybygc178 4JH8dD4bbLbWSS+PyKgjVQZOxQo+VvnprIuc7ui1NWCS16YaBp6Al0TiyBFFdteQVADZ0lUL KB+8tuvVObCDwqR/X+IkNAc/nIptXNmp6jSwUBHQQb5A6Hii7twKLmEiKfwgwVX1p0sPwfGC n+4kbED5eYwr2GIyznpiDuBlNt6ZXcI+54dYGxYw4uW3TRY0iTFcRcsva5zUkISamUmS4XeZ /30l4d1o1Imgnslm3Zm2qX5yDwlDkp8HPs0lmenD/qptH4XiszD45biZteaQax0TtTgDhQ6t M644uijeslMTrQ2CDmo9TYXRBjkUS55XIkjO4IlnRaFY8TcqVYo4AT9F5cVM5oJlOP1Kk3VO 11SM3M7vdfdl2XK3jfo2l02dSpGnA+BA2PTEQOstGclzJWgHd6xU0Fw9F3pAZ0yLstD51fo+ jUOKVhk79DCscQcKJmHe8EBdC6D2TcKCi8QV564W6Xap3vF0i91KIfuo9Fmd1CUKZ4sKcPpA == X-Talos-CUID: =?us-ascii?q?9a23=3AlxbTn2lWXaoHuK4IEelCNhffm4jXOXLh/C/Ucha?= =?us-ascii?q?UMmdGb+CtGHq+2Lxjq8U7zg=3D=3D?= X-Talos-MUID: 9a23:9hFQWgaGRdSbgOBTrGLr1TZeMu5RvYegUkcJjrcbu9fHDHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,225,1744063200"; d="scan'208,217";a="118659883" X-MGA-submission: =?us-ascii?q?MDGQxlIssApW5W+YSSdCTZLry+kVEudcmUcV4a?= =?us-ascii?q?8z0BVztxwoKAwzt4S63VaUaUmowmqpQ+Wu1JZbLaA8Gkh/yOosXtzTeh?= =?us-ascii?q?OYavaufScW0mUugw2jYuB9PvACvw7Nlggwn4/vbbanomnV3JNKuFjyjD?= =?us-ascii?q?blfFWucoBq7D3b+qut0iStZg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Jun 2025 15:36:42 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C4E03564E75; Tue, 10 Jun 2025 15:36:40 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1749562600; bh=9Q2E0rB3vyLrrgXCXR7ke6IhhLm2ibq4a4zCTP2CH+M=; h=From:To:Subject:Date:Message-ID; b=uQwXj2vcemzS/Z1d/DcLF+ISXeqdjmKc7huZ68bmRUFYLEvNhr40YUyavVsFm88HN BKV1JXmS978nsbViGuB7X4Iydw5PEuXPmUREOR/PjqFPbUIIXwa78T4Z1sDULzkmdH OBXEYW20rYWQOid2kXs/nKoqfHBhhfh/K5llekKw= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Jun 2025 15:36:40 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 10 15:36:41 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.308463, queueID=04E12564E77 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19339 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAwMyB0byAxMCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KUG9ydGFibGUg RXh0ZXJuYWwgRGVwZW5kZW5jaWVzIGZvciBEdW5lIFBhY2thZ2UgTWFuYWdlbWVudA0KU2VtZ3Jl cCBpcyBoaXJpbmcgT0NhbWwgZGV2ZWxvcGVycyB0byB3b3JrIG9uIHRoZSBzdGF0aWMgYW5hbHlz aXMgZW5naW5lDQpFbHBlLCBhIGNvbmZpZy1hcy1jb2RlIGJ1aWxkIHN5c3RlbSB3cml0dGVuIGlu IE9DYW1sK1J1c3QNCkR1bmUgZGV2IG1lZXRpbmcNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04N Cg0KDQpQb3J0YWJsZSBFeHRlcm5hbCBEZXBlbmRlbmNpZXMgZm9yIER1bmUgUGFja2FnZSBNYW5h Z2VtZW50DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L3BvcnRhYmxlLWV4dGVybmFsLWRlcGVuZGVuY2llcy1mb3ItZHVuZS1wYWNrYWdlLW1hbmFnZW1l bnQvMTY3NjcvMT4NCg0KDQpTdGV2ZSBTaGVycmF0dCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIER1bmUgbG9jayBkaXJlY3RvcmllcyByZWNvcmQgdGhlIG5hbWVzIG9mIGFueSBzeXN0 ZW0gcGFja2FnZXMgbmVlZGVkDQogIHRvIGJ1aWxkIHByb2plY3RzIG9yIHRoZWlyIGRlcGVuZGVu Y2llcy4gV2UndmUgcmVjZW50bHkgY2hhbmdlZCBob3cNCiAgdGhpcyB3b3JrcyBpbiB0aGUgaW50 ZXJlc3Qgb2YgcG9ydGFiaWxpdHkuDQoNCg0KQmFja2dyb3VuZCBvbiBgZGVwZXh0cycgaW4gT3Bh bQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQSBzeXN0ZW0gcGFj a2FnZSwgb3IgZXh0ZXJuYWwgZGVwZW5kZW5jeSwgb3IgYGRlcGV4dCcgYXMgSSdsbCByZWZlciB0 bw0KICB0aGVtIGZyb20gbm93IG9uLCBpcyBhIG5vbi1PcGFtIHBhY2thZ2Ugd2hpY2ggbXVzdCBi ZSBpbnN0YWxsZWQgaW4NCiAgb3JkZXIgZm9yIHNvbWUgT3BhbSBwYWNrYWdlIHRvIGJlIGJ1aWx0 IG9yIGZvciBjb2RlIGluIGEgcGFja2FnZSB0byBiZQ0KICBleGVjdXRlZCBhdCBydW50aW1lLiBU aGVzZSBwYWNrYWdlcyBtdXN0IGJlIGluc3RhbGxlZCBieSB0aGUgc3lzdGVtDQogIHBhY2thZ2Ug bWFuYWdlciwgb3IgYnkgc29tZSBvdGhlciBub24tT3BhbSBtZWFucyBzdWNoIGFzIG1hbnVhbGx5 DQogIGJ1aWxkaW5nIGFuZCBpbnN0YWxsaW5nIHRoZSBwYWNrYWdlIGZyb20gc291cmNlLiBDb21t b24gdHlwZXMgb2YNCiAgYGRlcGV4dCcgYXJlIGJ1aWxkIHRvb2xzIHN1Y2ggYXMgdGhlIGBwa2ct Y29uZmlnJyBjb21tYW5kLCBvZnRlbiBydW4NCiAgdG8gZGV0ZXJtaW5lIGxpbmtlciBmbGFncyB3 aGlsZSBidWlsZGluZyBhIHBhY2thZ2UsIG9yIHNoYXJlZA0KICBsaWJyYXJpZXMgc3VjaCBhcyBg bGliZ3RrJywgd2hpY2ggYW4gT0NhbWwgcHJvamVjdCBtaWdodCBsaW5rIGFnYWluc3QNCiAgdG8g Y3JlYXRlIEdVSXMuDQoNCiAgT3BhbSB1c3VhbGx5IGluc3RhbGxzIGBkZXBleHRzJyBhdXRvbWF0 aWNhbGx5LiBPcGFtIGtub3dzIGhvdyB0bw0KICBpbnZva2UgbWFueSBkaWZmZXJlbnQgc3lzdGVt IHBhY2thZ2UgbWFuYWdlcnMgKHN1Y2ggYXMgYGFwdCcgb3INCiAgYHBhY21hbicpLCBzbyB3aGVu IGluc3RhbGxpbmcgYSBwYWNrYWdlIHdpdGggYGRlcGV4dHMnIE9wYW0gY2FuIHJ1bg0KICB0aGUg Y29tbWFuZHMgYXBwcm9wcmlhdGUgdG8gdGhlIGN1cnJlbnQgc3lzdGVtIHRvIGluc3RhbGwgdGhl IHJlcXVpcmVkDQogIHBhY2thZ2VzIHVzaW5nIHRoZSBzeXN0ZW0ncyBwYWNrYWdlIG1hbmFnZXIu IEZvciB0aGlzIHRvIHdvcmssIE9wYW0NCiAgbmVlZHMgdG8ga25vdyB0aGUgbmFtZSBvZiB0aGUg cGFja2FnZSB3aXRoaW4gdGhlIHBhY2thZ2UgcmVwb3NpdG9yeQ0KICBhcHByb3ByaWF0ZSB0byB0 aGUgY3VycmVudCBzeXN0ZW0sIGFuZCB0aGVzZSBuYW1lcyBjYW4gdmFyeSBmcm9tDQogIHN5c3Rl bSB0byBzeXN0ZW0uIEZvciBleGFtcGxlIHRoZSBgcGtnLWNvbmZpZycgY29tbWFuZCBpcyBpbiBh IHBhY2thZ2UNCiAgbmFtZWQgc2ltcGx5IGBwa2ctY29uZmlnJyBpbiB0aGUgYGFwdCcgcGFja2Fn ZSBtYW5hZ2VyIG9uDQogIFVidW50dS9EZWJpYW4gc3lzdGVtcywgd2hlcmVhcyBpbiB0aGUgdGhp cmQtcGFydHkgYGhvbWVicmV3JyBwYWNrYWdlDQogIG1hbmFnZXIgb24gTWFjT1MgaXQncyBpbiBh IHBhY2thZ2UgbmFtZWQgYHBrZ2NvbmYnLiBJbiBvcmRlciB0bw0KICBkZXRlcm1pbmUgdGhlIHJp Z2h0IHBhY2thZ2UgbmFtZSBmb3IgdGhlIGN1cnJlbnQgc3lzdGVtLCB0aGUgcGFja2FnZQ0KICBt ZXRhZGF0YSBmb3IgT3BhbSBwYWNrYWdlcyB3aXRoIGBkZXBleHRzJyBjb250YWlucyBhIGxpc3Qg b2YgYWxsIHRoZQ0KICBkaWZmZXJlbnQga25vd24gcGFja2FnZSBuYW1lcyBhbG9uZyB3aXRoIHRo ZSBjb25kaXRpb25zIHVuZGVyIHdoaWNoDQogIHRoYXQgbmFtZSBpcyBjb3JyZWN0LiBIZXJlIGlz IHRoYXQgbGlzdCBmb3IgdGhlIGBjb25mLXBrZy1jb25maWcnIE9wYW0NCiAgcGFja2FnZToNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiBkZXBleHRzOiBbDQogIOKUgiAgIFsicGtnLWNvbmZpZyJd IHtvcy1mYW1pbHkgPSAiZGViaWFuIiB8IG9zLWZhbWlseSA9ICJ1YnVudHUifQ0KICDilIIgICBb InBrZ2NvbmYiXSB7b3MtZGlzdHJpYnV0aW9uID0gImFyY2gifQ0KICDilIIgICBbInBrZ2NvbmYt cGtnLWNvbmZpZyJdIHtvcy1mYW1pbHkgPSAiZmVkb3JhIn0NCiAg4pSCICAgWyJwa2djb25maWci XSB7b3MtZGlzdHJpYnV0aW9uID0gImNlbnRvcyIgJiBvcy12ZXJzaW9uIDw9ICI3In0NCiAg4pSC ICAgWyJwa2djb25mLXBrZy1jb25maWciXSB7b3MtZGlzdHJpYnV0aW9uID0gIm1hZ2VpYSJ9DQog IOKUgiAgIFsicGtnY29uZmlnIl0ge29zLWRpc3RyaWJ1dGlvbiA9ICJyaGVsIiAmIG9zLXZlcnNp b24gPD0gIjcifQ0KICDilIIgICBbInBrZ2NvbmZpZyJdIHtvcy1kaXN0cmlidXRpb24gPSAib2wi ICYgb3MtdmVyc2lvbiA8PSAiNyJ9DQogIOKUgiAgIFsicGtnY29uZiJdIHtvcy1kaXN0cmlidXRp b24gPSAiYWxwaW5lIn0NCiAg4pSCICAgWyJwa2ctY29uZmlnIl0ge29zLWRpc3RyaWJ1dGlvbiA9 ICJuaXhvcyJ9DQogIOKUgiAgIFsicGtnY29uZiJdIHtvcyA9ICJtYWNvcyIgJiBvcy1kaXN0cmli dXRpb24gPSAiaG9tZWJyZXcifQ0KICDilIIgICBbInBrZ2NvbmZpZyJdIHtvcyA9ICJtYWNvcyIg JiBvcy1kaXN0cmlidXRpb24gPSAibWFjcG9ydHMifQ0KICDilIIgICBbInBrZ2NvbmYiXSB7b3Mg PSAiZnJlZWJzZCJ9DQogIOKUgiAgIFsicGtnY29uZi1wa2ctY29uZmlnIl0ge29zLWRpc3RyaWJ1 dGlvbiA9ICJyaGVsIiAmIG9zLXZlcnNpb24gPj0gIjgifQ0KICDilIIgICBbInBrZ2NvbmYtcGtn LWNvbmZpZyJdIHtvcy1kaXN0cmlidXRpb24gPSAiY2VudG9zIiAmIG9zLXZlcnNpb24gPj0gIjgi fQ0KICDilIIgICBbInBrZ2NvbmYtcGtnLWNvbmZpZyJdIHtvcy1kaXN0cmlidXRpb24gPSAib2wi ICYgb3MtdmVyc2lvbiA+PSAiOCJ9DQogIOKUgiAgIFsic3lzdGVtOnBrZ2NvbmYiXSB7b3MgPSAi d2luMzIiICYgb3MtZGlzdHJpYnV0aW9uID0gImN5Z3dpbnBvcnRzIn0NCiAg4pSCICAgWyJwa2dj b25mIl0ge29zLWRpc3RyaWJ1dGlvbiA9ICJjeWd3aW4ifQ0KICDilIIgXQ0KICDilJTilIDilIDi lIDilIANCg0KDQpgZGVwZXh0cycgaW4gRHVuZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRHVuZSBkb2Vzbid0IGluc3RhbGwgYGRlcGV4 dHMnIGF1dG9tYXRpY2FsbHkgYXMgdGhlIER1bmUgZGV2ZWxvcGVycw0KICBhcmUgYSBsaXR0bGUg bmVydm91cyBhYm91dCBydW5uaW5nIGNvbW1hbmRzIHRoYXQgd291bGQgbW9kaWZ5IHRoZQ0KICBn bG9iYWwgc3lzdGVtIHN0YXRlLiBUaGlzIG1heSBjaGFuZ2UgYXQgc29tZSBwb2ludCwgYnV0IGZv ciBub3cgRHVuZQ0KICBvbmx5IHByb3ZpZGVzIHN1cHBvcnQgZm9yIGxpc3RpbmcgdGhlIG5hbWVz IG9mIGBkZXBleHRzJywgbGVhdmluZyBpdA0KICB1cCB0byB0aGUgdXNlciB0byBpbnN0YWxsIHRo ZW0gYXMgdGhleSBzZWUgZml0Lg0KDQogIFRoZSBgZHVuZSBzaG93IGRlcGV4dHMnIGNvbW1hbmQg Y2FuIGJlIHVzZWQgdG8gbGlzdCB0aGUgYGRlcGV4dHMnIG9mIGENCiAgcHJvamVjdC4gRm9yIHRo YXQgY29tbWFuZCB0byB3b3JrIHRoZSBwcm9qZWN0IG11c3QgaGF2ZSBhIGxvY2sNCiAgZGlyZWN0 b3J5LiBIZXJlJ3MgYW4gZXhhbXBsZSBvZiBsaXN0aW5nIHRoZSBgZGVwZXh0cycgb2YgYSBwcm9q ZWN0Og0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgZHVuZSBwa2cgbG9jaw0KICDilIIgLi4u DQogIOKUgiAkIGR1bmUgc2hvdyBkZXBleHRzDQogIOKUgiBsaWJhbw0KICDilIIgbGliZmZpDQog IOKUgiBwa2djb25mDQogIOKUgiBzZGwyDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEkgcmFuIHRo ZXNlIGNvbW1hbmRzIG9uIGEgTWFjIHdpdGggaG9tZWJyZXcgaW5zdGFsbGVkLCBzbyB0aGUgcGFj a2FnZQ0KICBuYW1lcyBhcmUgZnJvbSB0aGUgaG9tZWJyZXcgcGFja2FnZSByZXBvLiBFYWNoIHBh Y2thZ2UgbGlzdGVkIHRoZXJlIGlzDQogIG9uZSBvZiB0aGUgYGRlcGV4dHMnIG9mIGEgcGFja2Fn ZSB3aG9zZSBsb2NrZmlsZSBhcHBlYXJzIGluIHRoZQ0KICBwcm9qZWN0J3MgbG9jayBkaXJlY3Rv cnkuIExldCdzIGxvb2sgYXQgaG93IHRoaXMgaW5mb3JtYXRpb24gaXMNCiAgc3RvcmVkLiBVc2lu ZyBgcGtnLWNvbmZpZycgYXMgYW4gZXhhbXBsZToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAk IGNhdCBkdW5lLmxvY2svY29uZi1wa2ctY29uZmlnLnBrZw0KICDilIIgKHZlcnNpb24gNCkNCiAg 4pSCIA0KICDilIIgKGJ1aWxkDQogIOKUgiAgKHJ1biBwa2djb25mIC0tdmVyc2lvbikpDQogIOKU giANCiAg4pSCIChkZXBleHRzIHBrZ2NvbmYpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZSBy ZWxldmFudCBwYXJ0IGZvciB1cyBpcyB0aGUgYGRlcGV4dHMnIGZpZWxkLiBUaGUgY3VycmVudCBy ZWxlYXNlZA0KICB2ZXJzaW9uIG9mIER1bmUgb25seSBzdG9yZXMgdGhlIHBhY2thZ2UncyBgZGVw ZXh0cycgZm9yIHRoZSBzeXN0ZW0NCiAgd2hlcmUgYGR1bmUgcGtnIGxvY2snIHdhcyBydW4uIFRo ZSBjb21tYW5kIGBkdW5lIHNob3cgZGVwZXh0cycgc2ltcGx5DQogIGNvbmNhdGVuYXRlcyB0aGUg YGRlcGV4dHMnIGZpZWxkcyBmcm9tIGVhY2ggbG9ja2ZpbGUgaW4gdGhlIGxvY2sNCiAgZGlyZWN0 b3J5Lg0KDQogIFdoZW4gdGhpbmtpbmcgYWJvdXQgcG9ydGFibGUgbG9jayBkaXJlY3RvcmllcyBJ IGFsd2F5cyBsaWtlIHRvIGltYWdpbmUNCiAgd2hhdCB0aGUgZXhwZXJpZW5jZSB3b3VsZCBiZSB1 c2luZyBEdW5lIGZvciBhIHByb2plY3Qgd2hlcmUgdGhlIGxvY2sNCiAgZGlyZWN0b3J5IGlzIGNo ZWNrZWQgaW50byB2ZXJzaW9uIGNvbnRyb2wuIEkgZnJlcXVlbnRseSBzd2l0Y2ggYmV0d2Vlbg0K ICB1c2luZyB0d28gZGlmZmVyZW50IG1hY2hpbmVzIGZvciBkZXZlbG9wbWVudCAtIG9uZSBydW5u aW5nIExpbnV4IGFuZA0KICB0aGUgb3RoZXIgcnVubmluZyBNYWNPUy4gSWYgSSB3YXMgdG8gY2hl Y2sgaW4gdGhlIGxvY2sgZGlyZWN0b3J5IEkNCiAganVzdCBnZW5lcmF0ZWQgb24gbXkgTWFjLCBh bmQgdGhlbiBjaGVjayBpdCBvdXQgb24gTGludXggYW5kIGNvbnRpbnVlDQogIGRldmVsb3BtZW50 LCBgZHVuZSBzaG93IGRlcGV4dHMnIHdvdWxkIHNob3cgbWUgYSBsaXN0IG9mIHBhY2thZ2VzIGZv cg0KICB0aGUgd3Jvbmcgc3lzdGVtIQ0KDQoNClBvcnRhYmxlIGBkZXBleHRzJyBpbiBEdW5lDQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICBUbyBtYWtlIGBkZXBleHRzJyBwb3J0YWJsZSwgb25l J3MgZmlyc3QgaW5zdGluY3QgbWlnaHQgYmUgdG8gdXNlIHRoZQ0KICBzYW1lIGFwcHJvYWNoIGFz IHRha2VuIHdpdGggdGhlIGBkZXBlbmRzJyBmaWVsZCBvdXRsaW5lZCBbaGVyZV0sDQogIGxpc3Rp bmcgdGhlIGBkZXBleHRzJyBmb3IgZWFjaCBwbGF0Zm9ybSBmb3Igd2hpY2ggdGhlIHNvbHZlciB3 YXMNCiAgcnVuLiBJbmRlZWQgc3VjaCBhIGNoYW5nZSB3YXMgYWRkZWQgdG8gdGhlIER1bmUgRGV2 ZWxvcGVyIFByZXZpZXcgd2hlbg0KICB3ZSBmaXJzdCBpbnRyb2R1Y2VkIHBvcnRhYmxlIGxvY2sg ZGlyZWN0b3JpZXMsIGhvd2V2ZXIgd2UgcXVpY2tseQ0KICByZWFsaXplZCBhIHByb2JsZW0uDQoN CiAgVGhlIGBkZXBlbmRzJywgYGJ1aWxkJywgYW5kIGBpbnN0YWxsJyBmaWVsZHMgb2YgYSBwYWNr YWdlIHJhcmVseSB2YXJ5DQogIGJldHdlZW4gT1MgZGlzdHJpYnV0aW9uLiBJdCdzIHJlYXNvbmFi bHkgY29tbW9uIGZvciB0aG9zZSBmaWVsZHMgdG8gYmUNCiAgZGlmZmVyZW50IG9uIGRpZmZlcmVu dCBPU2VzLCBidXQgdmVyeSByYXJlIGZvciB0aGVtIHRvIGFsc28gYmUNCiAgZGlmZmVyZW50IG9u IGRpZmZlcmVudCBPUyBfZGlzdHJpYnV0aW9uc18uIEFzIHN1Y2gsIGl0J3MgZXhwZWN0ZWQgdGhh dA0KICB1c2VycyB3aWxsIGVsZWN0IHRvIHNvbHZlIHRoZWlyIHByb2plY3RzIGZvciBlYWNoIGNv bW1vbiBPUywgYnV0IHRoZXJlDQogIHdvdWxkIGJlIGxpdHRsZSB2YWx1ZSBpbiBzb2x2aW5nIHBy b2plY3RzIGZvciBlYWNoIE9TIGRpc3Ryby4gSW4gZmFjdA0KICBzb2x2aW5nIGZvciBtdWx0aXBs ZSBkaXN0cm9zIHdvdWxkIHNsb3cgZG93biBzb2x2aW5nIGFuZCBibG9hdCB0aGUNCiAgbG9jayBk aXJlY3RvcnksIGFuZCB1c2VycyB3b3VsZCBzb21laG93IG5lZWQgdG8gY29tZSB1cCB3aXRoIGEN CiAgZGVmaW5pdGl2ZSBsaXN0IG9mIGRpc3Ryb3MgdG8gc29sdmUgZm9yLg0KDQogIF9CdXRfIHRo ZSBgZGVwZXh0cycgZmllbGQgaXMgaGlnaGx5LWRlcGVuZGVudCBvbiB0aGUgT1MgZGlzdHJvIHNp bmNlDQogIHBhY2thZ2UgbmFtZXMgYXJlIHNwZWNpZmljIHRvIHRoZSBwYWNrYWdlIHJlcG9zaXRv cnkgZm9yIGEgcGFydGljdWxhcg0KICBkaXN0cm8uIFJlY2FsbCB0aGF0IHRoZSBgZGVwZXh0cycg ZmllbGQgaW4gT3BhbSBwYWNrYWdlIG1ldGFkYXRhIGxpc3RzDQogIHBhY2thZ2UgbmFtZXMgYWxv bmcgd2l0aCB0aGUgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGF0IHBhY2thZ2UgbmFtZQ0KICBz aG91bGQgYmUgdXNlZCwgZS5nLjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbInBrZy1jb25m aWciXSB7b3MtZmFtaWx5ID0gImRlYmlhbiIgfCBvcy1mYW1pbHkgPSAidWJ1bnR1In0NCiAg4pSC IFsicGtnY29uZiJdIHtvcy1kaXN0cmlidXRpb24gPSAiYXJjaCJ9DQogIOKUgiBbInBrZ2NvbmYt cGtnLWNvbmZpZyJdIHtvcy1mYW1pbHkgPSAiZmVkb3JhIn0NCiAg4pSCIFsicGtnY29uZmlnIl0g e29zLWRpc3RyaWJ1dGlvbiA9ICJjZW50b3MiICYgb3MtdmVyc2lvbiA8PSAiNyJ9DQogIOKUlOKU gOKUgOKUgOKUgA0KICBUaGVzZSBjb25kaXRpb25zIGFsbW9zdCBhbHdheXMgaW52b2x2ZSB0aGUg bmFtZSBvZiB0aGUgT1MgZGlzdHJvLCBhbmQNCiAgdG8gbWFrZSBtYXR0ZXJzIHdvcnNlIHRoZXkg YWxzbyBzb21ldGltZXMgaW52b2x2ZSB0aGUgT1MgX3ZlcnNpb25fLCBhcw0KICBwYWNrYWdlcyBj YW4gY2hhbmdlIHRoZWlyIG5hbWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIHRoZSBz YW1lDQogIE9TLiBFdmFsdWF0aW5nIHRoZXNlIGNvbmRpdGlvbnMgYXQgc29sdmUgdGltZSBmb3Ig cGxhdGZvcm1zIHdpdGggbm8NCiAgZGlzdHJvIG9yIHZlcnNpb24gc3BlY2lmaWVkIHRlbmRzIHRv IHJlc3VsdCBpbiBsb2NrZmlsZXMgd2l0aCBfbm9fDQogIGBkZXBleHRzJyBhdCBhbGwsIHNpbmNl IGFsbCB0aGUgY29uZGl0aW9ucyBldmFsdWF0ZSB0byBgZmFsc2UnLg0KDQogIFRoZSB1c2UgY2Fz ZSB3ZSBoYXZlIGluIG1pbmQgZm9yIGBkZXBleHRzJyBpbiBEdW5lIGlzIHRoYXQgYSB1c2VyIHdp bGwNCiAgc29sdmUgdGhlaXIgcHJvamVjdCBjb2Fyc2VseSwgdXN1YWxseSBqdXN0IGZvciBlYWNo IGNvbW1vbiBPUyB3aXRoIG5vDQogIGNvbnNpZGVyYXRpb24gZm9yIGRpc3RyaWJ1dGlvbiBvciB2 ZXJzaW9uLiBUaGVuIHdoZW4gdGhleSBydW4gYGR1bmUNCiAgc2hvdyBkZXBleHRzJywgdGhlIGBk ZXBleHRzJyB3aWxsIGJlIGxpc3RlZCB1c2luZyBuYW1lcyBhcHByb3ByaWF0ZSB0bw0KICB0aGUg Y3VycmVudCBtYWNoaW5lLiBUaGlzIG1lYW5zIER1bmUgbmVlZHMgdG8gc3RvcmUgZW5vdWdoIG1l dGFkYXRhDQogIGFib3V0IGBkZXBleHRzJyB0byBjb21wdXRlIHN5c3RlbS1zcGVjaWZpYyBgZGVw ZXh0JyBuYW1lcyBhdCBhIGxhdGVyDQogIHRpbWUuIFRoaXMgbWVhbnMgc3RvcmluZyB0aGUgc2Ft ZSBuYW1lcyBhbmQgY29uZGl0aW9ucyBhcyBhcmUNCiAgY3VycmVudGx5IHN0b3JlZCBpbiBPcGFt IGZpbGVzLCBhbmQgZGVmZXJyaW5nIGV2YWx1YXRpb24gb2YgdGhlDQogIGNvbmRpdGlvbnMgdW50 aWwgYXMgbGF0ZSBhcyBwb3NzaWJsZSwgc3VjaCBhcyByaWdodCB3aGVuIGBkdW5lIHNob3cNCiAg ZGVwZXh0cycgaXMgcnVuLg0KDQogIFRoZSBsYXRlc3QgdmVyc2lvbiBvZiB0aGUgRHVuZSBEZXZl bG9wZXIgUHJldmlldyBkb2VzIGp1c3QgdGhpczsNCiAgdHJhbnNsYXRpbmcgdGhlIGBkZXBleHRz JyBmaWVsZCBmcm9tIGVhY2ggcGFja2FnZSdzIE9wYW0gZmlsZSBpbnRvIGENCiAgRHVuZS1mcmll bmRseSBTLWV4cHJlc3Npb24uIEFmdGVyIHRoaXMgY2hhbmdlLCB0aGUgYGRlcGV4dHMnIGZpZWxk IG9mDQogIGBjb25mLXBrZy1jb25maWcnJ3MgbG9ja2ZpbGUgaXM6DQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgJCBjYXQgZHVuZS5sb2NrL2NvbmYtcGtnLWNvbmZpZy40LnBrZw0KICDilIIgLi4u DQogIOKUgiAoZGVwZXh0cw0KICDilIIgICgocGtnLWNvbmZpZykNCiAg4pSCICAgKG9yX2Fic29y Yl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAoPSAle29zX2ZhbWlseX0gZGViaWFuKQ0KICDilIIg ICAgKD0gJXtvc19mYW1pbHl9IHVidW50dSkpKQ0KICDilIIgICgocGtnY29uZikNCiAg4pSCICAg KD0gJXtvc19kaXN0cmlidXRpb259IGFyY2gpKQ0KICDilIIgICgocGtnY29uZi1wa2ctY29uZmln KQ0KICDilIIgICAoPSAle29zX2ZhbWlseX0gZmVkb3JhKSkNCiAg4pSCICAoKHBrZ2NvbmZpZykN CiAg4pSCICAgKGFuZF9hYnNvcmJfdW5kZWZpbmVkX3Zhcg0KICDilIIgICAgKD0gJXtvc19kaXN0 cmlidXRpb259IGNlbnRvcykNCiAg4pSCICAgICg8PSAle29zX3ZlcnNpb259IDcpKSkNCiAg4pSC ICAoKHBrZ2NvbmYtcGtnLWNvbmZpZykNCiAg4pSCICAgKD0gJXtvc19kaXN0cmlidXRpb259IG1h Z2VpYSkpDQogIOKUgiAgKChwa2djb25maWcpDQogIOKUgiAgIChhbmRfYWJzb3JiX3VuZGVmaW5l ZF92YXINCiAg4pSCICAgICg9ICV7b3NfZGlzdHJpYnV0aW9ufSByaGVsKQ0KICDilIIgICAgKDw9 ICV7b3NfdmVyc2lvbn0gNykpKQ0KICDilIIgICgocGtnY29uZmlnKQ0KICDilIIgICAoYW5kX2Fi c29yYl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAoPSAle29zX2Rpc3RyaWJ1dGlvbn0gb2wpDQog IOKUgiAgICAoPD0gJXtvc192ZXJzaW9ufSA3KSkpDQogIOKUgiAgKChwa2djb25mKQ0KICDilIIg ICAoPSAle29zX2Rpc3RyaWJ1dGlvbn0gYWxwaW5lKSkNCiAg4pSCICAoKHBrZy1jb25maWcpDQog IOKUgiAgICg9ICV7b3NfZGlzdHJpYnV0aW9ufSBuaXhvcykpDQogIOKUgiAgKChwa2djb25mKQ0K ICDilIIgICAoYW5kX2Fic29yYl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAoPSAle29zfSBtYWNv cykNCiAg4pSCICAgICg9ICV7b3NfZGlzdHJpYnV0aW9ufSBob21lYnJldykpKQ0KICDilIIgICgo cGtnY29uZmlnKQ0KICDilIIgICAoYW5kX2Fic29yYl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAo PSAle29zfSBtYWNvcykNCiAg4pSCICAgICg9ICV7b3NfZGlzdHJpYnV0aW9ufSBtYWNwb3J0cykp KQ0KICDilIIgICgocGtnY29uZikNCiAg4pSCICAgKD0gJXtvc30gZnJlZWJzZCkpDQogIOKUgiAg KChwa2djb25mLXBrZy1jb25maWcpDQogIOKUgiAgIChhbmRfYWJzb3JiX3VuZGVmaW5lZF92YXIN CiAg4pSCICAgICg9ICV7b3NfZGlzdHJpYnV0aW9ufSByaGVsKQ0KICDilIIgICAgKD49ICV7b3Nf dmVyc2lvbn0gOCkpKQ0KICDilIIgICgocGtnY29uZi1wa2ctY29uZmlnKQ0KICDilIIgICAoYW5k X2Fic29yYl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAoPSAle29zX2Rpc3RyaWJ1dGlvbn0gY2Vu dG9zKQ0KICDilIIgICAgKD49ICV7b3NfdmVyc2lvbn0gOCkpKQ0KICDilIIgICgocGtnY29uZi1w a2ctY29uZmlnKQ0KICDilIIgICAoYW5kX2Fic29yYl91bmRlZmluZWRfdmFyDQogIOKUgiAgICAo PSAle29zX2Rpc3RyaWJ1dGlvbn0gb2wpDQogIOKUgiAgICAoPj0gJXtvc192ZXJzaW9ufSA4KSkp DQogIOKUgiAgKChzeXN0ZW06cGtnY29uZikNCiAg4pSCICAgKGFuZF9hYnNvcmJfdW5kZWZpbmVk X3Zhcg0KICDilIIgICAgKD0gJXtvc30gd2luMzIpDQogIOKUgiAgICAoPSAle29zX2Rpc3RyaWJ1 dGlvbn0gY3lnd2lucG9ydHMpKSkNCiAg4pSCICAoKHBrZ2NvbmYpDQogIOKUgiAgICg9ICV7b3Nf ZGlzdHJpYnV0aW9ufSBjeWd3aW4pKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhhdCdzIGEg MToxIHRyYW5zbGF0aW9uIG9mIHRoZSBgZGVwZXh0cycgZmllbGQgZnJvbQ0KICBgY29uZi1wa2ct Y29uZmlnJydzIE9wYW0gZmlsZS4gVGhlcmUncyBlbm91Z2ggaW5mb3JtYXRpb24gdGhlcmUgc28N CiAgdGhhdCB0aGUgYXBwcm9wcmlhdGUgcGFja2FnZSBuYW1lIGNhbiBiZSBjb21wdXRlZCBvbiBk ZW1hbmQgcmF0aGVyDQogIHRoYW4ganVzdCBhdCBzb2x2ZSB0aW1lLg0KDQogIFRoaXMgYnJpbmcg dXMgYSBzdGVwIGNsb3NlciB0byBhIHdvcmxkIHdoZXJlIER1bmUgdXNlcnMgY2FuIGNoZWNrDQog IHRoZWlyIGxvY2sgZGlyZWN0b3JpZXMgaW50byB2ZXJzaW9uIGNvbnRyb2wgd2l0aCBjb25maWRl bmNlIHRoYXQgdGhlaXINCiAgYnVpbGRzIGFyZSByZXByb2R1Y2libGUgYWNyb3NzIGRpZmZlcmVu dCBwbGF0Zm9ybXMuIFRvIHRyeSBvdXQgdGhlDQogIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBEdW5l IERldmVsb3BlciBQcmV2aWV3LCBnbyB0bw0KICBbcHJldmlldy5kdW5lLmJ1aWxkXS4NCg0KDQpb aGVyZV0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0wNS0xOS1wb3J0YWJsZS1s b2NrLWRpcmVjdG9yaWVzLWZvci1kdW5lLXBhY2thZ2UtbWFuYWdlbWVudD4NCg0KW3ByZXZpZXcu ZHVuZS5idWlsZF0gPGh0dHBzOi8vcHJldmlldy5kdW5lLmJ1aWxkLz4NCg0KDQpTZW1ncmVwIGlz IGhpcmluZyBPQ2FtbCBkZXZlbG9wZXJzIHRvIHdvcmsgb24gdGhlIHN0YXRpYyBhbmFseXNpcyBl bmdpbmUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvam9iLXJlbW90ZS1zZW1n cmVwLWlzLWhpcmluZy1vY2FtbC1kZXZlbG9wZXJzLXRvLXdvcmstb24tdGhlLXN0YXRpYy1hbmFs eXNpcy1lbmdpbmUvMTY3NzEvMT4NCg0KDQppYWdvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU2VtZ3JlcCBpcyBhbiBhcHBsaWNhdGlv biBzZWN1cml0eSBjb21wYW55IGZvY3VzZWQgb24gZGV0ZWN0aW5nIGFuZA0KICByZW1lZGlhdGlu ZyB2dWxuZXJhYmlsaXRpZXMuIFRoZSBzdGF0aWMgYW5hbHlzaXMgZW5naW5lIGlzIHByaW1hcmls eQ0KICB3cml0dGVuIGluIE9DYW1sLiBXZSBhcmUgbG9va2luZyBmb3IgYSBzZW5pb3Igc29mdHdh cmUgZW5naW5lZXIgdG8NCiAgam9pbiB0aGUgQ29kZSB0ZWFtLCB3aGVyZSB3ZSBmb2N1cyBvbiBm aXJzdC1wYXJ0eSBjb2RlIHZ1bG5lcmFiaWxpdHkNCiAgYW5kIHNlY3JldHMgc2Nhbm5pbmcuDQoN CiAgVGhlIGlkZWFsIGNhbmRpZGF0ZSBoYXMgZXhwZXJpZW5jZSBidWlsZGluZyBwcm9ncmFtIGFu YWx5c2lzIHRvb2xpbmcNCiAgb3IgY29kZSBzY2FubmVycyAocGVyaGFwcyBpbiBhIHJlc2VhcmNo IGNvbnRleHQpLg0KDQogIEJvdGggb24tc2l0ZSBhbmQgcmVtb3RlIHdvcmsgYXJlIE9LLg0KDQog IElmIHRoaXMgc291bmRzIGludGVyZXN0aW5nIHRvIHlvdSwgc2VlIG91ciBqb2IgcG9zdGluZyBh dCBbU2VuaW9yDQogIFByb2dyYW0gQW5hbHlzaXMgRW5naW5lZXIsIENvZGVdLg0KDQogIExldCBt ZSBrbm93IGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMhDQoNCg0KW1NlbmlvciBQcm9ncmFtIEFu YWx5c2lzIEVuZ2luZWVyLCBDb2RlXQ0KPGh0dHBzOi8vam9iLWJvYXJkcy5ncmVlbmhvdXNlLmlv L3NlbWdyZXAvam9icy80NzUyMzYxMDA3Pg0KDQoNCkVscGUsIGEgY29uZmlnLWFzLWNvZGUgYnVp bGQgc3lzdGVtIHdyaXR0ZW4gaW4gT0NhbWwrUnVzdA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9lbHBlLWEtY29uZmlnLWFzLWNvZGUtYnVpbGQtc3lzdGVt LXdyaXR0ZW4taW4tb2NhbWwtcnVzdC8xNjc4My8xPg0KDQoNCnBtZXVuaWVyIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSSBqdXN0IHJlbGVhc2VkIHRoZSBmaXJzdCB2ZXJzaW9uIG9mIEVscGUsIGEgYnVpbGQgc3lz dGVtIGRlc2lnbmVkIGFzDQogIGEgYmxlbmQgb2YgTml4IGFuZCBVYnVudHUuDQoNCiAgSXQgdXNl cyBPQ2FtbCBmb3IgdGhlIGZyb250ZW5kLCBhbmQgY29tbXVuaWNhdGVzIHdpdGggYSBSdXN0IGJh Y2tlbmQNCiAgdmlhIGdSUEMuDQoNCiAgW0Jsb2cgcG9zdCBhYm91dCBpdF0NCg0KDQpbQmxvZyBw b3N0IGFib3V0IGl0XSA8aHR0cHM6Ly9waWp1bC5vcmcvcG9zdHMvMjAyNS0wNi0wOC1lbHBlPg0K DQoNCkR1bmUgZGV2IG1lZXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWR1bmUtZGV2LW1lZXRpbmcvMTQ5OTQvMzE+DQoNCg0KRXRpZW5uZSBNYXJhaXMgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbyA6dnVsY2FuX3NhbHV0ZTogVGhlIG5leHQg RHVuZSBEZXYgTWVldGluZyB3aWxsIGJlIHRvbW9ycm93IG9uDQogICpXZWRuZXNkYXksIEp1bmUs IDExdGggYXQgMTY6MDAgQ0VTVCouIFRoaXMgaXMgZ29pbmcgdG8gYmUgYQ0KICBvbmUtaG91ci1s b25nIG1lZXRpbmcuDQoNCiAgV2hldGhlciB5b3UgYXJlIGEgbWFpbnRhaW5lciwgYSByZWd1bGFy IGNvbnRyaWJ1dG9yLCBhIG5ldyBqb2luZXIgb3INCiAganVzdCBjdXJpb3VzLCB5b3UgYXJlIHdl bGNvbWUgdG8gam9pbjogdGhlc2UgZGlzY3Vzc2lvbnMgYXJlIG9wZW5lZCENCiAgVGhlIGdvYWwg b2YgdGhlc2UgbWVldGluZ3MgaXMgdG8gcHJvdmlkZSBhIHBsYWNlIHRvIGRpc2N1c3MgdGhlDQog IG9uZ29pbmcgd29yayB0b2dldGhlciBhbmQgc3luY2hyb25pemUgd2l0aCB0aGUgRHVuZSBkZXZl bG9wZXJzIDorMToNCg0KICBUaGUgYWdlbmRhIGlzIGF2YWlsYWJsZSBvbiB0aGUgW21lZXRpbmcg ZGVkaWNhdGVkIHBhZ2VdLiBGZWVsIGZyZWUgdG8NCiAgYWRkIG1vcmUgaXRlbXMgaW4gaXQuDQoN CiAg4oCiIE1lZXRpbmcgbGluazogW3pvb21dDQogIOKAoiBDYWxlbmRhciBldmVudDogW2dvb2ds ZSBjYWxlbmRhcl0NCiAg4oCiIFdpa2kgd2l0aCBpbmZvcm1hdGlvbiBhbmQgcHJldmlvdXMgbm90 ZXM6IFtkdW5lIHdpa2kgb24gR2l0SHViXQ0KDQoNClttZWV0aW5nIGRlZGljYXRlZCBwYWdlXQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3dpa2kvZGV2LW1lZXRpbmctMjAyNS0wNi0x MT4NCg0KW3pvb21dDQo8aHR0cHM6Ly91czA2d2ViLnpvb20udXMvai84NTA5Njg3Nzc3Nj9wd2Q9 Y1dOaFUxZEhRMVpOU2padU9VWkNRMGgyYnk5VWR6MDk+DQoNCltnb29nbGUgY2FsZW5kYXJdDQo8 aHR0cHM6Ly9jYWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL3UvMC9lbWJlZD9zcmM9Y181Y2Q2 OThkZjY3ODRlMzg1YjFjZGNkYzFkYmNhMThjMDYxZmFhOTY5NTlhMDQ3ODE1NjZkMzA0ZGM5ZWM3 MzE5QGdyb3VwLmNhbGVuZGFyLmdvb2dsZS5jb20+DQoNCltkdW5lIHdpa2kgb24gR2l0SHViXSA8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvd2lraT4NCg0KDQpPdGhlciBPQ2FtbCBOZXdz DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJv bSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZy b20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2dd Lg0KDQogIOKAoiBbT3BhbSBIZWFsdGggQ2hlY2s6IG9yIEhvdyB3ZSBHb3QgdG8gOTArJSBvZiBQ YWNrYWdlcyBCdWlsZGluZyB3aXRoDQogICAgRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnRdDQogIOKA oiBbUGVlci1Qcm9ncmFtbWluZyBpbiBNb2Rlcm4gT0NhbWwgd2l0aCBDaGF0R1BUIGFuZCBHZW1p bmldDQogIOKAoiBbQ0VPUyBQcm9qZWN0IEtpY2stT2ZmOiBVc2luZyBTYXRlbGxpdGVzIHRvIFN1 cnZleSB0aGUgRWFydGhdDQogIOKAoiBbUHJvZ3Jlc3MgaW4gT0NhbWwgZG9jc10NCiAg4oCiIFtU aGUgd2VlayB0aGF0IHdhcyAtIDIwMjUgdzIxXQ0KICDigKIgW0J1aWxkIE1lZXR1cCAtIEphbmUg U3RyZWV0IExvbmRvbl0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5v cmcvYmxvZy8+DQoNCltPcGFtIEhlYWx0aCBDaGVjazogb3IgSG93IHdlIEdvdCB0byA5MCslIG9m IFBhY2thZ2VzIEJ1aWxkaW5nIHdpdGggRHVuZQ0KUGFja2FnZSBNYW5hZ2VtZW50XQ0KPGh0dHBz Oi8vdGFyaWRlcy5jb20vYmxvZy8yMDI1LTA2LTA1LW9wYW0taGVhbHRoLWNoZWNrLW9yLWhvdy13 ZS1nb3QtdG8tOTAtb2YtcGFja2FnZXMtYnVpbGRpbmctd2l0aC1kdW5lLXBhY2thZ2UtbWFuYWdl bWVudD4NCg0KW1BlZXItUHJvZ3JhbW1pbmcgaW4gTW9kZXJuIE9DYW1sIHdpdGggQ2hhdEdQVCBh bmQgR2VtaW5pXQ0KPGh0dHBzOi8vc29hcC5jb2ZmZWUvfmx0aG1zL3Bvc3RzL1BlZXJQcm9ncmFt bWluZ1dpdGhMTE1zLmh0bWw+DQoNCltDRU9TIFByb2plY3QgS2ljay1PZmY6IFVzaW5nIFNhdGVs bGl0ZXMgdG8gU3VydmV5IHRoZSBFYXJ0aF0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cvMjAy NS0wNS0zMC1jZW9zLXByb2plY3Qta2ljay1vZmYtdXNpbmctc2F0ZWxsaXRlcy10by1zdXJ2ZXkt dGhlLWVhcnRoPg0KDQpbUHJvZ3Jlc3MgaW4gT0NhbWwgZG9jc10NCjxodHRwczovL2pvbi5yZWNv aWwub3JnL2Jsb2cvMjAyNS8wNS9kb2NzLXByb2dyZXNzLmh0bWw+DQoNCltUaGUgd2VlayB0aGF0 IHdhcyAtIDIwMjUgdzIxXQ0KPGh0dHBzOi8vd3d3LmRyYTI3LnVrL2Jsb2cvd2Vlay10aGF0LXdh cy8yMDI1LzA1LzI0L3d0dy0yMS5odG1sPg0KDQpbQnVpbGQgTWVldHVwIC0gSmFuZSBTdHJlZXQg TG9uZG9uXQ0KPGh0dHBzOi8vd3d3LmRyYTI3LnVrL2Jsb2cvbWlzYy8yMDI1LzA1LzIzL2J1aWxk LWV2ZW50Lmh0bWw+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5k IEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2 ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl DQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1l IGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0 aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3 bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8v Y2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC8+DQoNCg== --=-=-= Content-Type: text/html Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 03 to 10, 2025.

    Portable External Dependencies for Dune Package Management

    Steve Sherratt announced

    Dune lock directories record the names of any system packages needed to bui= ld projects or their dependencies. We've recently changed how this works in= the interest of portability.

    Background on depexts in Opam

    A system package, or external dependency, or depext as I'll re= fer to them from now on, is a non-Opam package which must be installed in o= rder for some Opam package to be built or for code in a package to be execu= ted at runtime. These packages must be installed by the system package mana= ger, or by some other non-Opam means such as manually building and installi= ng the package from source. Common types of depext are build t= ools such as the pkg-config command, often run to determine li= nker flags while building a package, or shared libraries such as libg= tk, which an OCaml project might link against to create GUIs.

    Opam usually installs depexts automatically. Opam knows how to= invoke many different system package managers (such as apt or= pacman), so when installing a package with depexts Opam can run the commands appropriate to the current system to install t= he required packages using the system's package manager. For this to work, = Opam needs to know the name of the package within the package repository ap= propriate to the current system, and these names can vary from system to sy= stem. For example the pkg-config command is in a package named= simply pkg-config in the apt package manager on = Ubuntu/Debian systems, whereas in the third-party homebrew pac= kage manager on MacOS it's in a package named pkgconf. In orde= r to determine the right package name for the current system, the package m= etadata for Opam packages with depexts contains a list of all = the different known package names along with the conditions under which tha= t name is correct. Here is that list for the conf-pkg-config O= pam package:

    depexts: [
      ["pkg-config"] {os-family =3D "debian" | os-family =3D "ubuntu"}
      ["pkgconf"] {os-distribution =3D "arch"}
      ["pkgconf-pkg-config"] {os-family =3D "fedora"}
      ["pkgconfig"] {os-distribution =3D "centos" & os-version <=3D "7"}
      ["pkgconf-pkg-config"] {os-distribution =3D "mageia"}
      ["pkgconfig"] {os-distribution =3D "rhel" & os-version <=3D "7"}
      ["pkgconfig"] {os-distribution =3D "ol" & os-version <=3D "7"}
      ["pkgconf"] {os-distribution =3D "alpine"}
      ["pkg-config"] {os-distribution =3D "nixos"}
      ["pkgconf"] {os =3D "macos" & os-distribution =3D "homebrew"}
      ["pkgconfig"] {os =3D "macos" & os-distribution =3D "macports"}
      ["pkgconf"] {os =3D "freebsd"}
      ["pkgconf-pkg-config"] {os-distribution =3D "rhel" & os-version >=
    =3D "8"}
      ["pkgconf-pkg-config"] {os-distribution =3D "centos" & os-version >=
    ;=3D "8"}
      ["pkgconf-pkg-config"] {os-distribution =3D "ol" & os-version >=3D=
     "8"}
      ["system:pkgconf"] {os =3D "win32" & os-distribution =3D "cygwinports=
    "}
      ["pkgconf"] {os-distribution =3D "cygwin"}
    ]
    

    depexts in Dune

    Dune doesn't install depexts automatically as the Dune develop= ers are a little nervous about running commands that would modify the globa= l system state. This may change at some point, but for now Dune only provid= es support for listing the names of depexts, leaving it up to = the user to install them as they see fit.

    The dune show depexts command can be used to list the de= pexts of a project. For that command to work the project must have a= lock directory. Here's an example of listing the depexts of a= project:

    $ dune pkg lock
    ...
    $ dune show depexts
    libao
    libffi
    pkgconf
    sdl2
    

    I ran these commands on a Mac with homebrew installed, so the package names= are from the homebrew package repo. Each package listed there is one of th= e depexts of a package whose lockfile appears in the project's= lock directory. Let's look at how this information is stored. Using = pkg-config as an example:

    $ cat dune.lock/conf-pkg-config.pkg
    (version 4)
    
    (build
     (run pkgconf --version))
    
    (depexts pkgconf)
    

    The relevant part for us is the depexts field. The current rel= eased version of Dune only stores the package's depexts for th= e system where dune pkg lock was run. The command dune s= how depexts simply concatenates the depexts fields from= each lockfile in the lock directory.

    When thinking about portable lock directories I always like to imagine what= the experience would be using Dune for a project where the lock directory = is checked into version control. I frequently switch between using two diff= erent machines for development - one running Linux and the other running Ma= cOS. If I was to check in the lock directory I just generated on my Mac, an= d then check it out on Linux and continue development, dune show depe= xts would show me a list of packages for the wrong system!

    Portable depexts in Dune

    To make depexts portable, one's first instinct might be to use= the same approach as taken with the depends field outlined here, listing the depexts for = each platform for which the solver was run. Indeed such a change was added = to the Dune Developer Preview when we first introduced portable lock direct= ories, however we quickly realized a problem.

    The depends, build, and install fiel= ds of a package rarely vary between OS distribution. It's reasonably common= for those fields to be different on different OSes, but very rare for them= to also be different on different OS distributio= ns. As such, it's expected that users will elect to solve their proj= ects for each common OS, but there would be little value in solving project= s for each OS distro. In fact solving for multiple distros would slow down = solving and bloat the lock directory, and users would somehow need to come = up with a definitive list of distros to solve for.

    But the depexts field is high= ly-dependent on the OS distro since package names are specific to the packa= ge repository for a particular distro. Recall that the depexts= field in Opam package metadata lists package names along with the conditio= ns under which that package name should be used, e.g.:

    ["pkg-config"] {os-family =3D "debian" | os-family =3D "ubuntu"}
    ["pkgconf"] {os-distribution =3D "arch"}
    ["pkgconf-pkg-config"] {os-family =3D "fedora"}
    ["pkgconfig"] {os-distribution =3D "centos" & os-version <=3D "7"}
    

    These conditions almost always involve the name of the OS distro, and to ma= ke matters worse they also sometimes involve the OS version, as packages can change their names between different ver= sions of the same OS. Evaluating these conditions at solve time for platfor= ms with no distro or version specified tends to result in lockfiles with no depexts at all, since all th= e conditions evaluate to false.

    The use case we have in mind for depexts in Dune is that a use= r will solve their project coarsely, usually just for each common OS with n= o consideration for distribution or version. Then when they run dune = show depexts, the depexts will be listed using names ap= propriate to the current machine. This means Dune needs to store enough met= adata about depexts to compute system-specific depext names at a later time. This means storing the same names and condition= s as are currently stored in Opam files, and deferring evaluation of the co= nditions until as late as possible, such as right when dune show depe= xts is run.

    The latest version of the Dune Developer Preview does just this; translatin= g the depexts field from each package's Opam file into a Dune-= friendly S-expression. After this change, the depexts field of= conf-pkg-config's lockfile is:

    $ cat dune.lock/conf-pkg-config.4.pkg
    ...
    (depexts
     ((pkg-config)
      (or_absorb_undefined_var
       (=3D %{os_family} debian)
       (=3D %{os_family} ubuntu)))
     ((pkgconf)
      (=3D %{os_distribution} arch))
     ((pkgconf-pkg-config)
      (=3D %{os_family} fedora))
     ((pkgconfig)
      (and_absorb_undefined_var
       (=3D %{os_distribution} centos)
       (<=3D %{os_version} 7)))
     ((pkgconf-pkg-config)
      (=3D %{os_distribution} mageia))
     ((pkgconfig)
      (and_absorb_undefined_var
       (=3D %{os_distribution} rhel)
       (<=3D %{os_version} 7)))
     ((pkgconfig)
      (and_absorb_undefined_var
       (=3D %{os_distribution} ol)
       (<=3D %{os_version} 7)))
     ((pkgconf)
      (=3D %{os_distribution} alpine))
     ((pkg-config)
      (=3D %{os_distribution} nixos))
     ((pkgconf)
      (and_absorb_undefined_var
       (=3D %{os} macos)
       (=3D %{os_distribution} homebrew)))
     ((pkgconfig)
      (and_absorb_undefined_var
       (=3D %{os} macos)
       (=3D %{os_distribution} macports)))
     ((pkgconf)
      (=3D %{os} freebsd))
     ((pkgconf-pkg-config)
      (and_absorb_undefined_var
       (=3D %{os_distribution} rhel)
       (>=3D %{os_version} 8)))
     ((pkgconf-pkg-config)
      (and_absorb_undefined_var
       (=3D %{os_distribution} centos)
       (>=3D %{os_version} 8)))
     ((pkgconf-pkg-config)
      (and_absorb_undefined_var
       (=3D %{os_distribution} ol)
       (>=3D %{os_version} 8)))
     ((system:pkgconf)
      (and_absorb_undefined_var
       (=3D %{os} win32)
       (=3D %{os_distribution} cygwinports)))
     ((pkgconf)
      (=3D %{os_distribution} cygwin)))
    

    That's a 1:1 translation of the depexts field from conf-= pkg-config's Opam file. There's enough information there so that the= appropriate package name can be computed on demand rather than just at sol= ve time.

    This bring us a step closer to a world where Dune users can check their loc= k directories into version control with confidence that their builds are re= producible across different platforms. To try out the latest version of the= Dune Developer Preview, go to prev= iew.dune.build.

    Semgrep is hiring OCaml developers to work on the static analy= sis engine

    iago announced

    Semgrep is an application security company focused on detecting and remedia= ting vulnerabilities. The static analysis engine is primarily written in OC= aml. We are looking for a senior software engineer to join the Code team, w= here we focus on first-party code vulnerability and secrets scanning.

    The ideal candidate has experience building program analysis tooling or cod= e scanners (perhaps in a research context).

    Both on-site and remote work are OK.

    If this sounds interesting to you, see our job posting at Senior Program Analysis= Engineer, Code.

    Let me know if you have any questions!

    Elpe, a config-as-code build system written in OCaml+Rust

    pmeunier announced

    I just released the first version of Elpe, a build system designed as a ble= nd of Nix and Ubuntu.

    It uses OCaml for the frontend, and communicates with a Rust backend via gR= PC.

    Blog post about it

    Dune dev meeting

    Etienne Marais announced

    Hello :vulcan_salute:=20 The next Dune Dev Meeting will be tomorrow on Wednesday, June, 11th at 1= 6:00 CEST. This is going to be a one-hour-long meeting.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers :+1:

    The agenda is available on the meeting dedicated page. Feel free to add more= items in it.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=LdrTAhj/; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=bIscZB9Z; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 6645E40066 for ; Tue, 17 Jun 2025 06:44:43 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=oiaOvAYGG+k7qxMuaFW6CgU0kGctNUE23PUqoqtVheg=; b=LdrTAhj/xpOFB/2WtREeQvRyX+LKTYDDA32CaCVfSt6iPu8rezFgAJRv uxP+3TIfYV5GMnJG1wVoTZDwUBs8MIVQ9Rz1tNy8Sll4qk9nsgWtn2uMU 4Rzu0V0x34i3FyqWasfu1wl4ckFNyeEBz5UohJjlH/634KP4yAEMEhY+z 0=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,242,1744063200"; d="scan'208,217";a="227510694" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Jun 2025 08:44:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id A11C2E01A8; Tue, 17 Jun 2025 08:44:42 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id CE5B1E0131 for ; Tue, 17 Jun 2025 08:44:38 +0200 (CEST) IronPort-SDR: 68510ed5_sL+8WL4pWthzKW+DI9iHOT0VH3VPMhsWr/MzOHCmCySGfg1 bByQbsRqPjdOsMTE+CFR9m88746hcZUy0ajvoNA== X-IPAS-Result: =?us-ascii?q?A0H7VACvDVFojyIeaIFaFgUBAQEBPAEBAQMDAQEBAgEBA?= =?us-ascii?q?QUBAQGBagGBPhsCAQFkGQFmWhABASEHCEkEhBU8g0+OIoEWkDWISoIvgWmBQ?= =?us-ascii?q?iMVAQMBDRQCAQIOBwEVCgECBAEBAwECAYUAAotnAh8GAQQ0EwECBAEBAQEDA?= =?us-ascii?q?gMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAQEBOQVJhUwvDUkBAQQLAYFqG?= =?us-ascii?q?ThxgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QECDAEHBVIBMREGChMBATgYIwMQBAEGAwIRATUXARIUBoJoAYIhAksDBAEMB?= =?us-ascii?q?pRImxQ3eoEygQGCDAEBBoEIPgIQAxgm2gqBZQmBRwIBAQEBhWmCShoBKkhrA?= =?us-ascii?q?oRIhDwnD4FVRIEVgnIHb4JDBxcCAQGBHx0BAU0JgyWCaYIoRD4UHYEjgQuBW?= =?us-ascii?q?W2DPoFQg0KCX4EtRYIxjEmBRCIDJjMsAVUTFwsHBVuBCAMqNDFuMh2CDYUZg?= =?us-ascii?q?hKCBIkEhEkrT4UhgSaDXxETcQ8GXEADC209NxQbmG4cKBqDIwIOgSATPgYBA?= =?us-ascii?q?QUVBgIuCBopJwMIGx0tCzqSRDkDKnexUzQHhB6BXgYMiQeBJpYDhVulBiKYY?= =?us-ascii?q?iKJXQqBHAmBbx5MiHaMYgIVhUKBUi0jgVwzGjBDgmcJRhwPVo0gAQEBhCiBP?= =?us-ascii?q?oMaO7JDA0E1AgEBOAIHAQoBAQMJhUUdAQGDBIIXhT1qYQEB?= IronPort-PHdr: A9a23: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 QAIY5w6eAPl8QMkOP7mSDo= IronPort-Data: A9a23:1vHlz6t87nfsXXBJBVA9p+//d+fnVOJaMUV32f8akzHdYApBsoF/q tZmKTiCbPuJZ2WneoonbYSw8UME6JaAzIRiSwdvqns1RngTgMeUXt7xwmXYb3rDdJWbJK5Ex 5xDMYeYdJhcolv0/ErF3m3J9CEkvU2wbuOgTrSCYEidfCc8IA85kxVvhuUltYBhhNm9Emult Mj7yyHlEAbNNwVcbCRNtcpvlDs15K6v4G1B4QRnDRx2lAa2e0c9XMp3yZ6ZdCOQrrl8RoaSW +vFxbelyWLVlz9F5gSNz94X2mVTKlLjFVDmZkh+A8BOsTAezsAG6ZvXAdJHAathZ5plqPgqo DlFncTYpQ7EpcQgksxFO/VTO3kW0aGrZNYriJVw2CCe5xSuTpfi/xlhJBgKL58E9O1VOzpL/ qQRGCpKSEvShu3jldpXSsE07igiBMz7ZcUHvXVx0TzSDfAnWI3OBaLQ6re03h9p3JEIRK6CI ZFBL2EzBPjDS0Un1lM/M6gFxLKxpXntJg9x/UqSobsr7mPTyg1ozbWrN8DaL9WOTMMThU2Yo 2Pa40zzBQwcP9GEjz/Z4jSrnOCncSbTAdtDTufjra426LGV7lVDT0IKc0WSmqK0h2ibBPV4E nAR3SV7+MDe82TwE4WjBELgyJKehTYXUt9UVuk78x2l0bvR+w/fB24eTzcHZsZOiSMtbTk6j xmRmNf4GTFksLuUUG+QsLCOolteJBT5M0dbWT0WUQUOweO4pYprhyLVCfA4Qa+624id9S7L/ xiGqy03hrM2hMEN1rmm8V2vv95KjsSRJuLSzlmLNl9J/j9EiJiZi5uAx2Kz0BqtBIOJFx+Zu 3wVh8WV7OYPFIyA0iuXT43h/Y1FBd7ba1UwYnY2T/HNEghBHVb5JOi8BxkleC9U3j4sI2OBX aMqkVo5CGVvFHWrd7RrRIm6Ft4ny6Ptffy8Ca2MNosfP8AoKlTclM2LWaJ29zy9+KTLuf1gU ap3je72ZZrnIfo6kWHoLwvj+eRzmEjSOl8/tbigkkj5iuXGDJJkYboON1+DJvg+6LKYrQ7V9 ddGKsbCxg1EW/WWX8Uk2dN7ELz+FlBiXcqeg5UOLoare1M2cEl/UKW56e16JORYc1F9yrygE oeVBhQAkAKXaLyuAVniV02Pn5u1DMwm/S5lZndzVbtqslB6CbuSAG4kX8NfVdEaGCZLlJaYl tFUKp3SMecFUTnd5TUWYL/0qYEoJlzhhhuDM2DhKHIzdoJpDV6BsNL1XBrdxA9XBAqOtOw6v +KB0CHfSsE9XAhMNpvdR8+u6FKThkIjvtxOcXHGGfRtXXn90ZNLLnXxh8AnIstXJhTkwCCb5 jmsAhwZhLfsptZp1eKUmqrev9qlPNV8F2UHB2Lr07KSMHjLzHuC2q5Fav6DJhrGZVP3+YKjR ORb9O79O/s5h2R3s5JwPrJo7KAm7f79juZ+4iU9O1uTdHWtKLdrAkfe7Pl1rqcXm4No41qna HyA6vxxGOuvOvq8NHUzOQB8TOCI9c9Mqwno9f5vfXnLvn5mzoGmD3dXEQKH0hFGDb1PN4gg/ +ctlegW5yG7iTsoKty2tT9VxUvdMk0/V7gbib9CDL/JkgYLznRwUa7YAALy47CNbIxoGWsuK Tm2mqHDpup9wmzvTnkNLkXOjNFt3ck2hBN3zVE5NwuonPjBjaQJxxF/y2k8YTlU6RRl6NhNH FZXGXd7Hoi0xAcwtvN/BzitPypjGCym/lfAzgpVtW/BEGiteG//DEw8Huev40pD4z9QUQZZ9 Z7F0G3VbzLOeZDg7DoTQm9gkeToFvZqxz3BmeemPsWLJIY7ajzbmZ2TZXIEhh/kIMEpjmjFm LVax/lxYqjFKiIgma03JI2E37A2ShrfBmh9bdx+3aEOR0fwRSqT3GWQFkWPZc99HfzG3kumA chIJMgUdRCf1j6Lnw8LF5w3PL54s/441uUsIoqxCzY9jIKeiT51vLb71Cv03jYrSuozt/cNE NracjbaH1GAgXdRpXT2k/BFHWiFevgBWhz32bGk0ecOFq9bitpWT2MJ7uKWsUmWYSxdxDDFm CPYZqTT8f5u9pQ0oavoDZd4JluVLfHdab221T6d4vpyaeHBC8Psjz8ui0LGOl1WNIQBWt4sm rWqtsX27Xz/v703cj74nrufG5YU5/eCefddDvirCHwLjBmTedTN5iEb8DuSMq15k9J65+imS TCnacC2S8UnZtdFyFBRaAlcCxw4CZmrXpz/pCi4keuAOiId3SPDMtmj033jNkNfSQMlJLz8D VXSl8u1x9UFsrlJOgAIN8tmD7B8PlXnf6ksLP/1lDuAC1iXkkGwgaTjmTUg+AP0JCG9Suii2 q38Rz/6aBiWk4PLxosAs4VN4zsmPEwkiuw0Jk8g69p6jg6hN1E/LMMfDI4nD69FmSmjxbD6Y zDwNFEZMxvfZggdUxvA44XEZDy9V9w+YoKzYnRj+k6PcC65Cb+RGLYrpG8q/35yfSCl1+29b 80X/nrrJBWq35V1XqAp6+emhft8jObvrp7SFZsRT+Spa/rfPVkL6JClNA9dDGrfFMXciEjAJ W40XH1JBkahRiYd1O5+LmVNFkhxUCzHll0VgeWnmb4zeLl3CMVKz+D5MOzolLhffIINPrFmq bbfWT6W+27PspAMkfJBhj/q6JOYzdqTGcyrMKLoRQsThry9rGM9MKvuWMbJoN4KoGZiLr8Wq tVgD7XSyqhIxIC9FYB6ETk0xq8= IronPort-HdrOrdr: A9a23:J/S06qi2J955poAtFC0ZhGlGHXBQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3AwohtZmi/JUixADHOn2msdQQoDDJuK0HP3mveKG2?= =?us-ascii?q?CUmNiELSlUxi2o/JlnJ87?= X-Talos-MUID: 9a23:R91bBQsKRnLVoZTJMM2nvWEla9tO/Y2VU00At7BZnO69CSlXNGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,242,1744063200"; d="scan'208,217";a="119223384" X-MGA-submission: =?us-ascii?q?MDF8fpSSPZLbSmOJqMJpvvUbJ1htRXMgaUbymQ?= =?us-ascii?q?1t11dW5WHX6ZNcwEOO01itWQYq0u9f9y5NL6XAMnUAVoBuATw0rAntmE?= =?us-ascii?q?rvdCM/WOr14n2VJZtjm9pxKTEOXLPNJReqpN5Nir7xgnysmrafhZAMF8?= =?us-ascii?q?ctKYOjgC6UU+nMR9YQrBApCA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Jun 2025 08:44:38 +0200 Received: from TM.local (unknown [92.182.5.89]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id C2D57564BE6; Tue, 17 Jun 2025 08:44:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1750142675; bh=ords9jzJcCujEnjpWlKqWdRpcosgjEJ8uhQPiiL8ABs=; h=From:To:Subject:Date:Message-ID; b=bIscZB9ZKpMZeqC7/yaxLzErTk+EhWGnHsoW76hEhhoE1LAuPRuuz7aIfutRYQ5PQ 5L2Q8gewPgBWNErT3aKArP5yS4Ai/OOkFzLZaFbxsJTLD488Csth7XQC108REMpKMl HHC3G0axKHGFO5nCtM4HcVVrRKVgRZHxPyiom/4M= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Jun 2025 08:44:35 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 17 08:44:36 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.075256, queueID=62D36564BF7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19342 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of June 10 to 17, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Help Test the New Odoc-3-Powered Package Documentation Pages Dune 3.19 CFP - JFLA 2026 - Journ=C3=A9es Francophones des Langages Applicatifs Other OCaml News Old CWN Help Test the New Odoc-3-Powered Package Documentation Pages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're in the process of deploying odoc 3 on the package documentation pipeline that underpins the package documentation pages at . We've prepared [a patch for OCaml.org] that renders the packages' documentation pages with the new odoc 3 features. Before deploying this on the production version of the OCaml.org website, we're looking for community feedback on the updated package documentation pages now available on staging.ocaml.org :tada:. Some of the new odoc 3 features benefit all packages! =E2=80=A2 The docs CI is now using a new driver, with *many more docs bei= ng built*. Compare the docs for yojson in the [old] and [new] CI! =E2=80=A2 The docs now features a *"source" link* next to most items, tak= ing you to a rendered version of the source code. For instance, if you wonder how the [`List.sort_uniq'] function is implemented, click on the source link next to it! =E2=80=A2 The *sidebar and breadcrumbs*, which were previously hacked tog= ether by ocaml.org, are now properly generated by odoc. Compare odoc's [old] and [new] sidebar! =E2=80=A2 The URL layout has been updated to include the library names, w= ith redirections to avoid dead links. Some other new features opens new possibility for documentation authors! They are mostly unused as their support is so recent, but you can test then on odoc's docs: =E2=80=A2 Ocaml.org now allows to reference other packages modules and pa= ges! For instance, `odoc-driver''s doc, in [its introduction], references a page from sherlodoc's doc! It's as simple as [this syntax]. =E2=80=A2 Medias, such as images, finally work on ocaml.org. This requires using the special syntax that is so new that, currently, only odoc's cheatsheet is [using]. But since we made sure to be compatible with odig's convention, images now work for several packages: compare Vg's tutorial [before] and [after]! How to help: =E2=80=A2 Test browsing package documentation on staging.ocaml.org =E2=80=A2 Report any bugs you encounter (even if it's just a small visual issue) Your testing helps ensure a smooth transition when these improvements go live. Thanks for helping us! The ocaml.org and odoc maintainers [a patch for OCaml.org] [old] [new] [`List.sort_uniq'] [old] [new] [its introduction] [this syntax] [using] [before] [after] Dune 3.19 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune Team is glad to announce the release of Dune `3.19.1' :vulcan_salute: This patch release contains a fix reverting some regressions on how `dune exec' handles processes. It restores the previous behaviour. If you encounter a problem with this release, you can report it on the [ocaml/dune] repository. [ocaml/dune] Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 Revert changes in `dune exec' behaviour introduced in 3.19.0. (#11879, fixes #11870, #11867 and #11881, @Alizter) CFP - JFLA 2026 - Journ=C3=A9es Francophones des Langages Applicatifs =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Marie Kerjean announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This message is intentionally written in French. It is a call for papers for the =E2=80=9CFrancophone Days on Functional Languages=E2=80=9D= to be held at the end of January 2026 in the Northern Vosges. Papers can be written in English, but the presentations themselves are expected to be given in French. Merci de faire circuler : premier appel =C3=A0 communications JFLA 2026 : Journ=C3=A9es Francophones des Langages Applicatifs 27 janvier au 30 janvier 2026 H=C3=B4tellerie du Couvent Les 37=C3=A8mes Journ=C3=A9es Francophones des Langages Applicatifs (JFLA= ) se tiendront dans les Vosges du Nord, =C3=A0 Oberbronn (Bas-Rhin), du mardi = 27 janvier 2026 au vendredi 30 janvier 2026. Les JFLA r=C3=A9unissent concepteur=C2=B7rices, utilisateur=C2=B7rices et th=C3=A9oricien=C2=B7nes ; elles ont pour ambition de couvrir les domaine= s des langages applicatifs, de la preuve formelle, de la v=C3=A9rification de programmes, et des objets math=C3=A9matiques qui sous-tendent ces outils. Ces domaines doivent =C3=AAtre pris au sens large : nous souhaito= ns promouvoir les ponts entre les diff=C3=A9rentes th=C3=A9matiques. =E2=80=A2 Langages fonctionnels et applicatifs : s=C3=A9mantique, compila= tion, optimisation, typage, extensions =C3=A0 d'autres paradigmes. =E2=80=A2 Assistants de preuve : impl=C3=A9mentation, nouvelles tactiques, d=C3=A9veloppements pr=C3=A9sentant un int=C3=A9r=C3=AAt th=C3=A9orique= , technique ou m=C3=A9thodologique. =E2=80=A2 Logique, correspondance preuve-programme, r=C3=A9alisabilit=C3= =A9, extraction de programmes, mod=C3=A8les. =E2=80=A2 Sp=C3=A9cification, prototypage, d=C3=A9veloppements formels d'= algorithmes. =E2=80=A2 V=C3=A9rification de programmes ou de mod=C3=A8les, v=C3=A9rifi= cation d=C3=A9ductive, interpr=C3=A9tation abstraite, raffinement. =E2=80=A2 Utilisation industrielle des langages fonctionnels et applicati= fs, ou des m=C3=A9thodes issues de la communaut=C3=A9 scientifique. Outils = et plateformes pour le web. =E2=80=A2 Enseignement ou diffusion des langages fonctionnels et applicatifs. Environnements et m=C3=A9thodes de d=C3=A9veloppement, ret= ours d'exp=C3=A9rience. Les articles soumis aux JFLA sont relus par au moins deux personnes s'ils sont accept=C3=A9s, et au moins trois personnes s'ils sont rejet=C3= =A9s. Les critiques du comit=C3=A9 de programme sont toujours bienveillantes et la plupart du temps encourageantes et constructives, m=C3=AAme en cas de rejet. Il n'y a donc pas de raison de ne pas soumettre aux JFLA ! DATES IMPORTANTES /!\ Attention : les dates limites sont fermes et d=C3=A9finitives. Il n'y aura pas d'extension. /!\ =E2=80=A2 Soumission des r=C3=A9sum=C3=A9s et articles : 16 octobre 2025,= GMT+2 =E2=80=A2 Notification aux auteurs et autrices : 2 d=C3=A9cembre 2025, GM= T+2 =E2=80=A2 Version finale des articles : 16 d=C3=A9cembre 2025, GMT+2 SOUMISSIONS Nous acceptons deux types de soumissions : =E2=80=A2 Article de recherche (18 pages max.) portant sur des travaux originaux. Nous acceptons des travaux en cours, pour lesquels l'aspect recherche n'est pas enti=C3=A8rement finalis=C3=A9. Nous encou= rageons aussi la soumission d'articles pr=C3=A9sentant avec =C3=A9l=C3=A9gance = un r=C3=A9sultat connu sous un angle nouveau. =E2=80=A2 Article court (9 pages max.) d=C3=A9crivant un probl=C3=A8me pa= rticulier, les pistes en cours d'investigation, et visant =C3=A0 rechercher de l'aide = de la part de la communaut=C3=A9. Les articles courts peuvent =C3=A9galeme= nt pr=C3=A9senter de mani=C3=A8re synth=C3=A9tique et coh=C3=A9rente des r= =C3=A9sultats d=C3=A9j=C3=A0 publi=C3=A9s. Enfin, ils peuvent pr=C3=A9senter un outil logiciel dont l'expos=C3=A9 constituera une d=C3=A9monstration. CONSIGNES AUX AUTEURS ET AUTRICES Les articles peuvent =C3=AAtre r=C3=A9dig=C3=A9s en fran=C3=A7ais ou en a= nglais. La forme de l'article doit =C3=AAtre soign=C3=A9e, et le contenu r=C3=A9d= ig=C3=A9 de mani=C3=A8re structur=C3=A9e et claire. Le style LaTeX jflart doit imp=C3=A9rativement =C3=AAtre utilis=C3=A9 sans modification de la mise en page. Le style LaTeX et sa documentation sont disponibles depuis le site web de la conf=C3=A9rence. Les limites de pages sont strictes. Les r=C3=A9f=C3=A9rences bibliographi= ques ne sont pas comptabilis=C3=A9es dans la limite de pages. Les annexes aux articles ne sont pas autoris=C3=A9es. Les auteurs et autrices peuvent soumettre du mat=C3=A9riel suppl=C3=A9men= taire, s=C3=A9par=C3=A9 de l'article soumis, sous forme de texte (version longue= , sans limite de pages) et/ou de d=C3=A9veloppement logiciel. L'=C3=A9valuation = de ce mat=C3=A9riel suppl=C3=A9mentaire est =C3=A0 la discr=C3=A9tion du comit= =C3=A9 de programme. Les articles soumis doivent donc =C3=AAtre auto-contenus et =C3=A9valuables sans ce mat=C3=A9riel suppl=C3=A9mentaire. Les soumissions parall=C3=A8les dans d'autres conf=C3=A9rences, journaux = ou workshops avec actes ne sont pas autoris=C3=A9es. Les membres du comit=C3=A9 de programme sont autoris=C3=A9s =C3=A0 soumet= tre un article. Les pr=C3=A9sidentes du comit=C3=A9 ne le sont pas. Les articles doivent =C3=AAtre soumis via le site : L'=C3=A9valuation des articles suit un processus en simple-aveugle : les rapports des articles sont anonymes, mais pas les auteurs et autrices. Les articles accept=C3=A9s seront publi=C3=A9s dans les actes de la conf= =C3=A9rence, sur HAL, et les auteurs et autrices en donneront une pr=C3=A9sentation lo= rs des journ=C3=A9es. Les pr=C3=A9sentations seront, de pr=C3=A9f=C3=A9rence= , donn=C3=A9es en fran=C3=A7ais. Marie KERJEAN et Yannick ZAKOWSKI JFLA 2026 Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Introducing OxCaml] =E2=80=A2 [Under the hood with Apple's new Containerization framework] [the ocaml.org blog] [Introducing OxCaml] [Under the hood with Apple's new Containerization framework] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 10 to 17, 2025.

    Help Test the New Odoc-3-Powered Package Documentation Pages

    Paul-Elliot announced

    We're in the process of deploying odoc 3 on the package documentation pipel= ine that underpins the package documentation pages at https://ocaml.org/packages.

    We've prepared a p= atch for OCaml.org that renders the packages' documentation pages with = the new odoc 3 features. Before deploying this on the production version of= the OCaml.org website, we're looking for community feedback on the updated= package documentation pages now available on staging.ocaml.org :tada:.

    Some of the new odoc 3 features benefit all packages!

    • The docs CI is now using a new driver, with many more docs being bui= lt. Compare the docs for yojson in the old and new CI!
    • The docs now features a "source" link next to most items, taking= you to a rendered version of the source code. For instance, if you wonder = how the List.sort_uniq f= unction is implemented, click on the source link next to it!
    • The sidebar and breadcrumbs, which were previously hacked togeth= er by ocaml.org, are now properly generated by odoc. Compare odoc's old and new sidebar!
    • The URL layout has been updated to include the library names, with redi= rections to avoid dead links.

    Some other new features opens new possibility for documentation authors! Th= ey are mostly unused as their support is so recent, but you can test then o= n odoc's docs:

    How to help:

    • Test browsing package documentation on staging.ocaml.org
    • Report any bugs you encounter (even if it's just a small visual issue)<= /li>

    Your testing helps ensure a smooth transition when these improvements go li= ve. Thanks for helping us!

    The ocaml.org and odoc maintainers

    Dune 3.19

    Etienne Marais announced

    The Dune Team is glad to announce the release of Dune 3.19.1 := vulcan_salute:=20

    This patch release contains a fix reverting some regressions on how d= une exec handles processes. It restores the previous behaviour.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • Revert changes in dune exec behaviour introduced in 3.19.0= . (#11879, fixes #11870, #11867 and #11881, @Alizter)

    CFP - JFLA 2026 - Journ=C3=A9es Francophones des Langages Appl= icatifs

    Marie Kerjean announced

    This message is intentionally written in French. It is a call for papers fo= r the =E2=80=9CFrancophone Days on Functional Languages=E2=80=9D to be held at th= e end of January 2026 in the Northern Vosges. Papers can be written in English, but the presentat= ions themselves are expected to be given in French.

    Merci de faire circuler : premier appel =C3=A0 communications

    JFLA 2026 : Journ=C3=A9es Francophones des Langages Applicatifs http://jfla.inria.fr/jfla202= 6.html

    27 janvier au 30 janvier 2026

    H=C3=B4tellerie du Couvent

    Les 37=C3=A8mes Journ=C3=A9es Francophones des Langages Applicatifs (JFLA) = se tiendront dans les Vosges du Nord, =C3=A0 Oberbronn (Bas-Rhin), du mardi 27 janvier 2= 026 au vendredi 30 janvier 2026.

    Les JFLA r=C3=A9unissent concepteur=C2=B7rices, utilisateur=C2=B7rices et t= h=C3=A9oricien=C2=B7nes ; elles ont pour ambition de couvrir les domaines des langages applicatifs, d= e la preuve formelle, de la v=C3=A9rification de programmes, et des objets math= =C3=A9matiques qui sous-tendent ces outils. Ces domaines doivent =C3=AAtre pris au sens la= rge : nous souhaitons promouvoir les ponts entre les diff=C3=A9rentes th=C3=A9matiques.

    • Langages fonctionnels et applicatifs : s=C3=A9mantique, compilation, op= timisation, typage, extensions =C3=A0 d'autres paradigmes.
    • Assistants de preuve : impl=C3=A9mentation, nouvelles tactiques, d=C3= =A9veloppements pr=C3=A9sentant un int=C3=A9r=C3=AAt th=C3=A9orique, technique ou m=C3=A9th= odologique.
    • Logique, correspondance preuve-programme, r=C3=A9alisabilit=C3=A9, extr= action de programmes, mod=C3=A8les.
    • Sp=C3=A9cification, prototypage, d=C3=A9veloppements formels d'algorith= mes.
    • V=C3=A9rification de programmes ou de mod=C3=A8les, v=C3=A9rification d= =C3=A9ductive, interpr=C3=A9tation abstraite, raffinement.
    • Utilisation industrielle des langages fonctionnels et applicatifs, ou des m=C3=A9thodes issues de la communaut=C3=A9 scientifique. Outils et plateformes pour le web.
    • Enseignement ou diffusion des langages fonctionnels et applicatifs. Environnements et m=C3=A9thodes de d=C3=A9veloppement, retours d'exp=C3=A9rience.

    Les articles soumis aux JFLA sont relus par au moins deux personnes s'ils s= ont accept=C3=A9s, et au moins trois personnes s'ils sont rejet=C3=A9s. Les cr= itiques du comit=C3=A9 de programme sont toujours bienveillantes et la plupart du temps encourageantes et constructives, m=C3=AAme en cas de rejet.

    Il n'y a donc pas de raison de ne pas soumettre aux JFLA !

    DATES IMPORTANTES

    /!\ Attention : les dates limites sont fermes et d=C3=A9finitives. Il n'y aura pas d'extension. /!\

    • Soumission des r=C3=A9sum=C3=A9s et articles : 16 octobre 2025, GMT+2
    • Notification aux auteurs et autrices : 2 d=C3=A9cembre 2025, GMT+2
    • Version finale des articles : 16 d=C3=A9cembre 2025, GMT+2

    SOUMISSIONS

    Nous acceptons deux types de soumissions :

    • Article de recherche (18 pages max.) portant sur des travaux originaux.= Nous acceptons des travaux en cours, pour lesquels l'aspect recherche n'est pas enti=C3=A8rement finalis=C3=A9. Nous encourageons aussi la soumission d'art= icles pr=C3=A9sentant avec =C3=A9l=C3=A9gance un r=C3=A9sultat connu sous un angl= e nouveau.
    • Article court (9 pages max.) d=C3=A9crivant un probl=C3=A8me particulie= r, les pistes en cours d'investigation, et visant =C3=A0 rechercher de l'aide de la part de = la communaut=C3=A9. Les articles courts peuvent =C3=A9galement pr=C3=A9senter = de mani=C3=A8re synth=C3=A9tique et coh=C3=A9rente des r=C3=A9sultats d=C3=A9j=C3=A0 publi= =C3=A9s. Enfin, ils peuvent pr=C3=A9senter un outil logiciel dont l'expos=C3=A9 constituera une d=C3=A9= monstration.

    CONSIGNES AUX AUTEURS ET AUTRICES

    Les articles peuvent =C3=AAtre r=C3=A9dig=C3=A9s en fran=C3=A7ais ou en ang= lais.

    La forme de l'article doit =C3=AAtre soign=C3=A9e, et le contenu r=C3=A9dig= =C3=A9 de mani=C3=A8re structur=C3=A9e et claire.

    Le style LaTeX jflart doit imp=C3=A9rativement =C3=AAtre utilis=C3=A9 sans = modification de la mise en page. Le style LaTeX et sa documentation sont disponibles depuis le= site web de la conf=C3=A9rence.

    Les limites de pages sont strictes. Les r=C3=A9f=C3=A9rences bibliographiqu= es ne sont pas comptabilis=C3=A9es dans la limite de pages. Les annexes aux articles ne so= nt pas autoris=C3=A9es.

    Les auteurs et autrices peuvent soumettre du mat=C3=A9riel suppl=C3=A9menta= ire, s=C3=A9par=C3=A9 de l'article soumis, sous forme de texte (version longue, sans limite de pages) et/ou de d=C3=A9veloppement logiciel. L'=C3=A9valuation de ce mat=C3=A9riel= suppl=C3=A9mentaire est =C3=A0 la discr=C3=A9tion du comit=C3=A9 de programme. Les articles soumis = doivent donc =C3=AAtre auto-contenus et =C3=A9valuables sans ce mat=C3=A9riel suppl=C3=A9mentaire.

    Les soumissions parall=C3=A8les dans d'autres conf=C3=A9rences, journaux ou= workshops avec actes ne sont pas autoris=C3=A9es.

    Les membres du comit=C3=A9 de programme sont autoris=C3=A9s =C3=A0 soumettr= e un article. Les pr=C3=A9sidentes du comit=C3=A9 ne le sont pas.

    Les articles doivent =C3=AAtre soumis via le site : https://jfla2026.hotcrp.com

    L'=C3=A9valuation des articles suit un processus en simple-aveugle : les ra= pports des articles sont anonymes, mais pas les auteurs et autrices.

    Les articles accept=C3=A9s seront publi=C3=A9s dans les actes de la conf=C3= =A9rence, sur HAL, et les auteurs et autrices en donneront une pr=C3=A9sentation lors des jour= n=C3=A9es. Les pr=C3=A9sentations seront, de pr=C3=A9f=C3=A9rence, donn=C3=A9es en fran=C3= =A7ais.

    Marie KERJEAN et Yannick ZAKOWSKI JFLA 2026

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=GiSthwP8; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=pf9Zkcmf; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id AC80240066 for ; Tue, 24 Jun 2025 14:02:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=LSMfFhsIcy8kvtbhPyaOTRo+rRLZa6RhZrs+zK6zv1c=; b=GiSthwP8Vql2ikn6GDe/hbimRDaANwN9almLyHqcUo2bVvtRjNqoW/gW Y5/qgiycvujQv/Xc6VpdrhgmK+MrMSlXfnefLrNCS4ZN9WV1TK0QSmiZo hyiv65M3EYwv9tlRgXcNn9lcUFU9LTIlBkEyuVGFUprzmuHkLjNYazWu0 U=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,261,1744063200"; d="scan'208,217";a="228782429" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Jun 2025 16:02:43 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 35BFBE0131; Tue, 24 Jun 2025 16:02:43 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 6592EE0157 for ; Tue, 24 Jun 2025 16:02:37 +0200 (CEST) IronPort-SDR: 685aaffb_ggCoZ7i+8ARcPEIzWKg4Mh3zI57h1rNKbngcXM+swettpX7 uQmAeKye8k0RLOrpu7/eLo2DDmmv9tYfih39txg== X-IPAS-Result: =?us-ascii?q?A0EaDACKr1pohSIeaIFagl6BP4EDGQFmWjMHCEkEhFGDT?= =?us-ascii?q?44igRaQNYhKgi+BaYFCIxUBAwENLgEbBAECBAEBAwECAYUAGItTAh8GAQQ0E?= =?us-ascii?q?wECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAQEBAUBJhXsNSQEBA?= =?us-ascii?q?QMBCgGBahk4cYElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAgwBAkNZAwYEBhMBAS4KGCMDCQsBBgMCBA0BNQMBEwESGoJoA?= =?us-ascii?q?YIfAgJLAwUMBj+TdptLen8zgQGCDAEBBoEIPgIBCwICAw8uAdoKgWUJgUmFb?= =?us-ascii?q?YJKGgEqSGsChEiEPCcPgVVEgRU1gQZtSgdvgj8LFwEBAQFcOyUBAQhEARKDH?= =?us-ascii?q?IJpgiaBAhQdgUUEEE9ohnBEjieBREszLAFVExcLBwVbgQgDKjQxbjIdgSeHJ?= =?us-ascii?q?oRFK0+FIYEmg14RE20PBoEhGUADC209NxQbkkkZKBqCNCYHAQYfGQYCFScPF?= =?us-ascii?q?QYNIiICIg0pGAsgGQ4BCgQXHRsSARcEJwIDklUoKgOyRzQHhB6BXgYMiQeBJ?= =?us-ascii?q?pYDhASBV4s2hwGRaWYimGIigjaHJwqBHAkHWYEPHkyId4xdBggYhTmBfyOBK?= =?us-ascii?q?x4MBzMaMEMNEQmCQAlGHA9XjVYWg16BPoEMgg47WoIMt0JBNQIBAQcxAgcBC?= =?us-ascii?q?gEBAwmFYgEBgwSCF26EOIFLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 wQ= IronPort-HdrOrdr: A9a23:BNGJwKzr+/YO4kkvg6REKrPwEb1zdoMgy1knxilNoH1uA6+lfq WV9sjzuiWbtN98YhwdcLO7WJVoI0m8yXcd2+B4VotKNzOIhILHFu1fxLqn6wKlMSzz/OxQ2M 5bAspDIey1K0N1yeLz4AzQKadF/DBrytHMudvj X-Talos-CUID: =?us-ascii?q?9a23=3A9NxCLWsv+0YEILZlDXCo1D2q6IsHXVLUz3uOOXW?= =?us-ascii?q?SIkhsFJiEbU2c6vJNxp8=3D?= X-Talos-MUID: 9a23:SF7gowlKlRu/ANeR4gRSdnpJF/9xxKqlA3oCy7EPipi2HyNqAhC02WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,261,1744063200"; d="scan'208,217";a="119862293" X-MGA-submission: =?us-ascii?q?MDFhdHIK2OkgtoxZD2tLxbb+B+pl15aA/P6Lqk?= =?us-ascii?q?RnE38N7gnQ8u8+wLnHlmGoEQ0jXUtpxhnxHtjBMz9OWw9Y8cIeREVihX?= =?us-ascii?q?9Jeqo6fUV8xqjSBBCpwh9aHKPklyHqsPds6UWa8nAbcJFdS01n0st5sa?= =?us-ascii?q?T5TWIgmq7zO0eOuxGU3k/RcQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Jun 2025 16:02:36 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4F202564D6B; Tue, 24 Jun 2025 16:02:34 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1750773754; bh=6C4nvdDy5AuZ5AN2iXquqJXtYLU62deJkXzI43C/LEc=; h=From:To:Subject:Date:Message-ID; b=pf9Zkcmf1zXHQStvfhPtCT4Z/97/jXY6emakXVrgDjTqaQXaRfA79+WJ5foweRqcP zohbS8f1h4B5ZIH0JDir6J2vQZtUq8/Ol4E05fNV9Du8wGzuLBTLGuxsLM990tWKWf iZgJnp16FyaNCRh0jZ9q5/3Lf0wdZwkwoZZOPed8= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 24 Jun 2025 16:02:34 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jun 24 16:02:34 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.486587, queueID=95A3F564D6C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19346 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAxNyB0byAyNCwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KTXVsdGktZG9t YWluLCBtdWx0aS1zY2hlZHVsZXIgTHd0DQoxNXRoIE1pcmFnZU9TIHJldHJlYXQgTWF5IDEzdGgg LSAyMHRoDQpvcGFtIDIuNC4wfmJldGExDQpNTCBGYW1pbHkgV29ya3Nob3AgMjAyNTogQ2FsbCBm b3IgUHJlc2VudGF0aW9ucw0KTWlncmF0aW5nIE9DYW1sLm9yZyB0byBVc2UgRHVuZSAoRGV2ZWxv cGVyIFByZXZpZXcpDQpTZW5kIHVzIFRhbGsgYW5kIFdvcmtzaG9wIFByb3Bvc2FscyBmb3IgRnVu IE9DYW1sIDIwMjUgaW4gV2Fyc2F3LCBTZXB0ZW1iZXIgMTUrMTYNCkEgQnJpZWYgSW50cm9kdWN0 aW9uIHRvIE5vcm1hbGl6YXRpb24tQnktRXZhbHVhdGlvbg0KTXkgU2Vjb25kIE91dHJlYWNoeSBJ bnRlcm5zaGlwJ3MgQmxvZyBQb3N0DQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KTXVs dGktZG9tYWluLCBtdWx0aS1zY2hlZHVsZXIgTHd0DQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L211bHRpLWRvbWFpbi1tdWx0aS1zY2hlZHVsZXItbHd0LzE2ODM0LzE+DQoNCg0KUmFw aGHDq2wgUHJvdXN0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBoYXZlIHN0YXJ0 ZWQgd29ya2luZyBvbiBjaGFuZ2luZyBbTHd0XSB0byBhbGxvdyBtdWx0aXBsZSBzY2hlZHVsZXJz DQogIHRvIHJ1biBpbiBwYXJhbGxlbCBpbiBzZXBhcmF0ZSBkb21haW5zLiBUaGUgY3VycmVudCBz dGF0dXMgaXMgZWFybHkNCiAgd29yay1pbi1wcm9ncmVzcyB3aXRoIHNvbWUgYWN0dWFsIHRlc3Rz IHRoYXQgYWN0dWFsbHkgdXNlIHRoZQ0KICBtdWx0aS1zY2hlZHVsZXIgZmVhdHVyZSAoW0RyYWZ0 IFBSXSkuDQoNCiAgVGhpcyBpcyBzdGlsbCBmYXIgZnJvbSByZWxlYXNlLiBUaGVyZSBhcmUgc29t ZSBtYWpvciBjaGFuZ2VzIHN0aWxsDQogIG5lZWRlZCAoZS5nLiwgc2lnbmFsIG1hbmFnZW1lbnQs IGltcHJvdmUgY2FsbGJhY2sgc2VuZGluZywgcmVzdG9yaW5nDQogIHNvbWUgYnJva2VuIHNpbmds ZS1kb21haW4gdGVzdHMsIGV0Yy4pLiBTdGlsbCwgSSdkIGxpa2UgdG8gZ2F0aGVyDQogIGZlZWRi YWNrIGZyb20gdXNlcnMgb2YgTHd0LCBlc3BlY2lhbGx5IHRob3NlIHdpdGggaGVmdHkgY29kZSBi YXNlcyBhbmQNCiAgdGhvc2Ugd2hvIG5lZWQgdG8gYnJpbmcgdGhlaXIgbGVnYWN5IGNvZGUgYmFz ZXMgaW50byB0aGUgb2NhbWwtNSBlcmENCiAgKGJ1dCBkb24ndCBoZXNpdGF0ZSB0byBjb250cmli dXRlIGV2ZW4gaWYgdGhhdCdzIG5vdCB0aGUgY2FzZSkuDQoNCg0KW0x3dF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY3NpZ2VuL2x3dD4NCg0KW0RyYWZ0IFBSXSA8aHR0cHM6Ly9naXRodWIuY29tL29j c2lnZW4vbHd0L3B1bGwvMTA1OD4NCg0KV2hhdCBraW5kIG9mIHVzZXMgd291bGQgeW91IG1ha2Ug b2YgYSBtdWx0aS1zY2hlZHVsZXIgbXVsdGktZG9tYWluIHNjaGVkdWxlcj8NCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICJO b25lIiBpcyBhIHZhbGlkIHJlc3BvbnNlLiBNYXliZSB5b3UgZG9uJ3Qgd2FudCB0byB1c2UgcGFy YWxsZWxpc20gaW4NCiAgeW91ciBMd3QtYmFzZWQgY29kZWJhc2UuDQoNCiAgSSBjYW4gc2VlIHNl dmVyYWwgcmVhc29uYWJsZSB1c2VzOg0KICDigKIgYSB3b3JrZXIgcG9vbCBzbyB5b3UgZGlzcGF0 Y2ggeW91ciBzZXJ2ZXIncyByZXF1ZXN0cyB0byBkaWZmZXJlbnQNCiAgICBjb3JlcyAoYnV0IHlv dSBkb24ndCByZWFsbHkgbmVlZCB0byByZXdyaXRlIG11Y2ggb2YgeW91ciBjb2RlLCB5b3UNCiAg ICBjYW4ga2VlcCB5b3VyIGx3dCBoYW5kbGVycywganVzdCBzZXQgdXAgYSBmZXcgZG9tYWlucyBh bmQgYSBmZXcNCiAgICBzdHJlYW1zIHRvIHNlbmQgd29yayBhcm91bmQpDQogIOKAoiBoYXZpbmcg bXV0bGlwbGUgc2NoZWR1bGVycyBpbnRvIHdoaWNoIHlvdSBjYW4gcnVuIGx3dCBiaXRzIG9mIGNv ZGUNCiAgICAoZS5nLiwgdmlhIGBydW5faW5fZG9tYWluOiBEb21haW4uaWQgLT4gKHVuaXQgLT4g J2EgTHd0LnQpIC0+ICdhJywNCiAgICB0aGUgbXVsdGktZG9tYWluIGVxdWl2YWxlbnQgdG8gYHJ1 bl9pbl9tYWluJykgZnJvbSBhICJwcm9wZXIiDQogICAgbXVsdGktZG9tYWluIGNvZGUNCg0KICBh bmQgYWxzbyBzb21lIG1heWJlIGxlc3MgcmVhc29uYWJsZSB1c2VzOg0KICDigKIgd3JpdGluZyBz b21lIG1peGVkIGx3dCBhbmQgcmVndWxhciBvbGQtZmFzaGlvbiBqdXN0LVVuaXggYmxvY2tpbmcN CiAgICBjb2RlLCBhbmQgcGFzc2luZyBpdCBvZmYgdG8gYSBzZXBhcmF0ZSBkb21haW4gc28gaXQg ZG9lc24ndCBibG9jaw0KICAgIHlvdXIgbWFpbiBzY2hlZHVsZXINCg0KDQpXaGF0IHBhcnRzIG9m IEx3dCB3b3VsZCB5b3UgZXhwZWN0IHRvIGJlIHNhZmUgdG8gc2hhcmUgZnJlZWx5IGFtb25nc3Qg ZG9tYWlucz8gV2hhdCBwYXJ0cyB3b3VsZCB5b3UgZXhwZWN0IHRvIGhhdmUgc2FmZXR5IGNoZWNr cz8NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEN1 cnJlbnRseSwgdGhlIFdJUCB2ZXJzaW9uLCBhbGxvd3MgeW91IHRvIGF0dGFjaCBjYWxsYmFja3Mg dG8gcHJvbWlzZXMNCiAgcmVnYXJkbGVzcyBvZiB3aGljaCBkb21haW4gdGhleSB3ZXJlIGNyZWF0 ZWQgaW4gKHNhZmUgdG8gInJlYWQiIGFueQ0KICBwcm9taXNlKS4gSXQgbWVhbnMgdGhhdCBwcm9t aXNlcyBhcmUgbm90IGF0dGFjaGVkIHRvIGEgcGFydGljdWxhcg0KICBkb21haW4sIGJ1dCBjYWxs YmFja3MgYXJlLg0KDQogIE9UT0ggdGhlcmUgYXJlIG5vIGVmZm9ydHMgbWFkZSB0byBwcmV2ZW50 IGRhdGEtcmFjZXMgZm9yIHdha2VuZXJzDQogICh1bnNhZmUgdG8gIndyaXRlIiB0aGUgc2FtZSBw cm9taXNlIGZyb20gdHdvIGRpZmZlcmVudCBkb21haW5zKS4gSW4NCiAgbW9zdCBjYXNlcywgYEx3 dC53YWtldXAnIChhbmQgZnJpZW5kcykgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBjcmVhdGUNCiAg bmV3IEx3dC1mcmllbmRseSBhYnN0cmFjdGlvbnMgKGUuZy4sIFtsYWNoZV0pIHNvIHRoZXJlIGlz IGxpdHRsZQ0KICByZWFzb24gZm9yIHRoZW0gdG8gbW92ZSBhY3Jvc3MgZG9tYWlucy4gU3RpbGws IGlzIHRoYXQgc29tZXRoaW5nIHRoYXQNCiAgc2hvdWxkIGJlIHRha2VuIGludG8gYWNjb3VudD8N Cg0KICBNb3JlIGdlbmVyYWxseSwgc2hvdWxkIHRoZSBkb21haW4tc2FmZSBhYnN0cmFjdGlvbnMg cmVwbGFjZSB0aGUNCiAgZXhpc3Rpbmcgb25lcyAoZS5nLiwgc2hvdWxkIGBMd3Rfc3RyZWFtJyBt YWtlIGl0IHNhZmUgdG8gcHVzaC9yZWFkDQogIGZyb20gdGhlIHNhbWUgc3RyZWFtIGluIHBhcmFs bGVsKSBvciBzaG91bGQgdGhlcmUgYmUgbmV3IGRvbWFpbi1zYWZlDQogIGFic3RyYWN0aW9ucyAo ZS5nLiwgYW4gYWRkaXRpb25hbCBgTHd0X3N0cmVhbV9wYXInKT8gQW5kIHdoYXQNCiAgcGVyZm9y bWFuY2UgY29zdCBmb3Igc2luZ2xlLWRvbWFpbiBwcm9ncmFtcyBpcyBhY2NlcHRhYmxlIGluIG9y ZGVyIHRvDQogIG1ha2UgbXVsdGktZG9tYWluIHByb2dyYW1zIHNhZmU/DQoNCg0KW2xhY2hlXQ0K PGh0dHBzOi8vb2NhbWwub3JnL3AvYWNoZXMtbHd0L2xhdGVzdC9kb2MvTGFjaGUvbW9kdWxlLXR5 cGUtTUFQL2luZGV4Lmh0bWw+DQoNCg0KSXMgb25lIHNjaGVkdWxlciBwZXItZG9tYWluIHRoZSBy aWdodCBncmFudWxhcml0eS9hYnN0cmFjdGlvbj8NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdvdWxk IGl0IGJlIGJldHRlciB0byBvZmZlciBvbmUgc2NoZWR1bGVyIHBlciB0aHJlYWQ/IElzIHRoZXJl IGxpdHRsZQ0KICBwb2ludCBpbiBvZmZlcmluZyB1bmxpbWl0ZWQgc2NoZWR1bGVycyB0byBiZWdp biB3aXRoPw0KDQoNCjE1dGggTWlyYWdlT1MgcmV0cmVhdCBNYXkgMTN0aCAtIDIwdGgNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLTE1dGgtbWlyYWdlb3Mt cmV0cmVhdC1tYXktMTN0aC0yMHRoLzE2MDg1LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVh ZCwgQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFzIEBnYXNjaGUsIEkgYWxzbyB3cm90ZSBhbiBh cnRpY2xlIGFib3V0IHRoaXMgcmV0cmVhdCB3aGljaCBzeW50aGVzaXMNCiAgKG5vdCBleGhhdXN0 aXZlbHkpIHdoYXQgSSBkaWQgd2l0aCBzb21lIG90aGVyIHBlb3BsZS4gQnV0LCBkZXNwaXRlDQog IEBnYXNjaGUsIEkgcHVibGlzaGVkIGl0IGludG8gbXkgYmxvZyBoZXJlICh3aGljaCBpcyBhbiB1 bmlrZXJuZWwpOg0KICA8aHR0cHM6Ly9ibG9nLm9zYXUucmUvYXJ0aWNsZXMvbGFzdF9taXJhZ2Vv c19yZXRyZWF0Lmh0bWw+LiBFbmpveQ0KICByZWFkaW5nIQ0KDQoNCm9wYW0gMi40LjB+YmV0YTEN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wYW0tMi00LTAtYmV0YTEv MTY4NTYvMT4NCg0KDQpLYXRlIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUsDQoNCiAgV2UgYXJlIGhhcHB5IGFuZCBy ZWxpZXZlZCB0byBhbm5vdW5jZSB0aGUgZmlyc3QgYmV0YSByZWxlYXNlIG9mIG9wYW0NCiAgMi40 LjAuDQoNCiAgVGhpcyB2ZXJzaW9uIGlzIGFuIGJldGEsIHdlIGludml0ZSB1c2VycyB0byB0ZXN0 IGl0IHRvIHNwb3QgcHJldmlvdXNseQ0KICB1bm5vdGljZWQgYnVncyBhcyB3ZSBoZWFkIHRvd2Fy ZHMgdGhlIHN0YWJsZSByZWxlYXNlLCB3aGljaCBob3BlZnVsbHkNCiAgc2hvdWxkbid0IHRha2Ug dG9vIGxvbmcuDQoNCg0KQ2hhbmdlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIDpk cmFnb25fZmFjZTogRml4ZWQgYSBoYW5kZnVsIG9mIGJ1Z3MgaW4gYG9wYW0gaW5zdGFsbCAtLWRl cHMtb25seQ0KICAgIDxsb2NhbCBkaXI+JyBtb3JlIHZpc2libGUgaW4gMi40LCB3aGVyZSBzb21l IGFjdGlvbnMgd291bGQgdXNlIHRoZQ0KICAgIGxvY2FsIHBhY2thZ2VzJyBkZWZpbml0aW9uIG9y IHdyaXRlIHRvIHRoZSBpbnRlcm5hbCBvcGFtIHN0YXRlIGFzIGlmDQogICAgdGhleSB3ZXJlIGFj dHVhbGx5IHBpbm5lZCAoWyM2NTI5XSwgWyM2NTMyXSwgWyM2NTAxXSwgWyM2NTM1XSkNCg0KICDi gKIgOnlhcm46IENoYW5nZSB0aGUgYmVoYXZpb3VyIG9mIGAtLWRlcHMtb25seScsIHdoZXJlIGl0 IG5vIGxvbmdlcg0KICAgIHJlcXVpcmVzIHVuaWNpdHkgb2YgcGFja2FnZSB2ZXJzaW9uIGJldHdl ZW4gdGhlIHJlcXVlc3QgYW5kIHRoZQ0KICAgIGluc3RhbGxlZCBwYWNrYWdlcy4gSW4gb3RoZXIg d29yZHMsIGlmIHlvdSBoYXZlIGBwa2cuMScgaW5zdGFsbGVkLA0KICAgIGluc3RhbGxpbmcgZGVw ZW5kZW5jaWVzIG9mIGBwa2cuMicgbm8gbG9uZ2VyIHJlbW92ZXMgYHBrZy4xJy4gVGhpcw0KICAg IGFsc28gYWxsb3dzIHRvIGluc3RhbGwgZGVwZW5kZW5jaWVzIG9mIGNvbmZsaWN0aW5nIHBhY2th Z2VzIHdoZW4NCiAgICB0aGVpciBkZXBlbmRlbmNpZXMgYXJlIGNvbXBsaWFudCAoWyM2NTIwXSkN Cg0KICDigKIgOmZpcmVjcmFja2VyOiBGaXhlZCBhIGNvdXBsZSBvZiByZWdyZXNzaW9ucyB3aGlj aCB3b3VsZCBtYWtlIGBvcGFtDQogICAgdXBkYXRlJyBjcmFzaCBpbiBzb21lIGNhc2VzIChbIzY1 MTNdLCBbIzY1MjddKQ0KDQogIOKAoiA6d2luZG93OiBJbXByb3ZlIHRoZSBwcmVidWlsdCBXaW5k b3dzIGJpbmFyaWVzIGJ5IGluY2x1ZGluZyBDeWd3aW4ncw0KICAgIGBzZXR1cC14ODZfNjQuZXhl JyBpbiB0aGUgYmluYXJ5IGl0c2VsZiBhcyBmYWxsYmFjaywgaW4gY2FzZQ0KICAgIGBjeWd3aW4u Y29tJyBpcyBpbmFjY2Vzc2libGUgKFsjNjQ5OF0sIFsjNjUzOF0pDQoNCiAgOm9wZW5fYm9vazog WW91IGNhbiByZWFkIG91ciBbYmxvZyBwb3N0XSBmb3IgbW9yZSBpbmZvcm1hdGlvbiwgYW5kIGZv cg0KICBldmVuIG1vcmUgZGV0YWlscyB5b3UgY2FuIHRha2UgYSBsb29rIGF0IHRoZSBbcmVsZWFz ZSBub3RlXSBvciB0aGUNCiAgW2NoYW5nZWxvZ10uDQoNCg0KWyM2NTI5XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29wYW0vaXNzdWVzLzY1Mjk+DQoNClsjNjUzMl0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82NTMyPg0KDQpbIzY1MDFdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb3BhbS9pc3N1ZXMvNjUwMT4NCg0KWyM2NTM1XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29wYW0vaXNzdWVzLzY1MzU+DQoNClsjNjUyMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vcGFtL2lzc3Vlcy82NTIwPg0KDQpbIzY1MTNdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb3BhbS9pc3N1ZXMvNjUxMz4NCg0KWyM2NTI3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29wYW0vaXNzdWVzLzY1Mjc+DQoNClsjNjQ5OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v cGFtL2lzc3Vlcy82NDk4Pg0KDQpbIzY1MzhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS9pc3N1ZXMvNjUzOD4NCg0KW2Jsb2cgcG9zdF0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvYmxv Zy9vcGFtLTItNC0wLWJldGExLz4NCg0KW3JlbGVhc2Ugbm90ZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vcGFtL3JlbGVhc2VzL3RhZy8yLjQuMC1iZXRhMT4NCg0KW2NoYW5nZWxvZ10gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2Jsb2IvMi40LjAtYmV0YTEvQ0hBTkdFUz4NCg0K DQpUcnkgaXQhDQrilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgdXBncmFkZSBpbnN0cnVj dGlvbnMgYXJlIHVuY2hhbmdlZDoNCg0KICBGb3IgVW5peCBzeXN0ZW1zDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgYmFzaCAtYyAic2ggPChjdXJsIC1mc1NMIGh0dHBzOi8vb3BhbS5vY2FtbC5v cmcvaW5zdGFsbC5zaCkgLS12ZXJzaW9uIDIuNC4wfmJldGExIg0KICDilJTilIDilIDilIDilIAN CiAgb3IgZnJvbSBQb3dlclNoZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiBJbnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2QgaHR0 cHM6Ly9vcGFtLm9jYW1sLm9yZy9pbnN0YWxsLnBzMSkgfSAtVmVyc2lvbiAyLjQuMH5iZXRhMSIN CiAg4pSU4pSA4pSA4pSA4pSADQogIFBsZWFzZSByZXBvcnQgYW55IGlzc3VlcyB0byB0aGUgW2J1 Zy10cmFja2VyXS4NCg0KICBIYXBweSBoYWNraW5nLCA8PiA8PiBUaGUgb3BhbSB0ZWFtIDw+IDw+ IDpjYW1lbDoNCg0KDQpbYnVnLXRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS9pc3N1ZXM+DQoNCg0KTUwgRmFtaWx5IFdvcmtzaG9wIDIwMjU6IENhbGwgZm9yIFByZXNlbnRh dGlvbnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWwtZmFtaWx5LXdvcmtzaG9wLTIwMjUtY2FsbC1mb3It cHJlc2VudGF0aW9ucy8xNjUyMS8yPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFNhbSBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIFVwZGF0ZTogd2UndmUgZXh0ZW5kZWQgdGhlIGRlYWRsaW5lIHRvIEp1bHkg MyENCg0KICBJZiB5b3UgKG9yIHNvbWVvbmUgeW91IGtub3cpIGlzIHBsYW5uaW5nIHRvIGF0dGVu ZCBJQ0ZQL1NQTEFTSCwgd2UNCiAgZW5jb3VyYWdlIHlvdSB0byBjb25zaWRlciBzdWJtaXR0aW5n LiBUaGUgc3VibWlzc2lvbiByZXF1aXJlbWVudHMgYXJlDQogIHNtYWxsIChvbmx5IGEgY291cGxl IHBhZ2VzKSwgYW5kIHRoZSBzY29wZSBvZiB0aGUgd29ya3Nob3AgaXMgYnJvYWQ6DQogIGxhbmd1 YWdlIGRlc2lnbiwgaW1wbGVtZW50YXRpb24sIG1lbW9yeSBtYW5hZ2VtZW50LCB0eXBlIHN5c3Rl bXMsDQogIHNlbWFudGljcywgYXBwbGljYXRpb25zLCB0b29saW5nLCBkZWJ1Z2dpbmcsIHByb2dy YW0gYW5hbHlzaXMg4oCTIGl0J3MNCiAgYWxsIGZhaXIgZ2FtZS4NCg0KICBUaGlzIGlzIGEgZ3Jl YXQgb3Bwb3J0dW5pdHkgdG8gZGlzY3VzcyB3b3Jrcy1pbi1wcm9ncmVzcywgb3IgZGVtbw0KICBz b21ldGhpbmcgeW91J3ZlIGJlZW4gYnVpbGRpbmcuIFBlcmhhcHMgeW91IGV2ZW4gaGF2ZSBhIHNw aWN5IHRha2UNCiAgYWJvdXQgbGFuZ3VhZ2UgZGVzaWduPyBXZSBoYXZlIGEgc3VibWlzc2lvbiBj YXRlZ29yeSBmb3IgdGhhdCwgYW5kDQogIHdlJ2QgbG92ZSB0byBoZWFyIGl0IQ0KDQoNCk1pZ3Jh dGluZyBPQ2FtbC5vcmcgdG8gVXNlIER1bmUgKERldmVsb3BlciBQcmV2aWV3KQ0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9taWdyYXRpbmctb2NhbWwtb3JnLXRvLXVzZS1kdW5lLWRldmVs b3Blci1wcmV2aWV3LzE2ODU5LzE+DQoNCg0KU2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkgZXZlcnlvbmUsDQoNCiAgd2UncmUgaW4gdGhlIHByb2Nl c3Mgb2YgbWlncmF0aW5nIE9DYW1sLm9yZyB0byB1c2UgRHVuZSBwYWNrYWdlDQogIG1hbmFnZW1l bnQgKHNlZSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzMxMzI+KS4g VGhlDQogIGludGVudCBiZWhpbmQgdGhpcyBpcyB0bw0KICAxLiBzaW1wbGlmeSB0aGUgRGV2ZWxv cGVyIEV4cGVyaWVuY2Ugd2hlbiBidWlsZGluZyBPQ2FtbC5vcmcgKHRvDQogICAgIGVuYWJsZSBu ZXdjb21lcnMgdG8gbW9yZSBlYXNpbHkgZ2V0IHN0YXJ0ZWQgY29udHJpYnV0aW5nKQ0KICAyLiBk ZW1vbnN0cmF0ZSBhbmQgZW5zdXJlIHRoYXQgRHVuZSBwYWNrYWdlIG1hbmFnZW1lbnQgaXMgc3Vp dGFibGUgZm9yDQogICAgIHRoZSBwcm9kdWN0aW9uIHVzZSBjYXNlIG9mIHJ1bm5pbmcgT0NhbWwu b3JnDQoNCiAgSSB3b3VsZCBsaWtlIGV2ZXJ5b25lIHdobyBoYXMgY29udHJpYnV0ZWQsIG9yIHdv dWxkIGxpa2UgdG8gY29udHJpYnV0ZQ0KICB0byBPQ2FtbC5vcmcsIHRvIGhhdmUgdGhlIG9wcG9y dHVuaXR5IHRvIHRyeSB0aGUgcGF0Y2ggYW5kIGdpdmUNCiAgZmVlZGJhY2sgZmlyc3QuDQoNCiAg U28gaWYgeW91J3JlIGludGVyZXN0ZWQgaW4gaGVscGluZyB0ZXN0IER1bmUgcGFja2FnZSBtYW5h Z2VtZW50IG9uDQogIE9DYW1sLm9yZywgcGxlYXNlIGRvIGNoZWNrIG91dA0KICA8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sLm9yZy9wdWxsLzMxMzI+LCBhbmQgZm9sbG93IHRoZQ0KICBp bnN0cnVjdGlvbnMgaW4gdGhlIHVwZGF0ZWQgZG9jcyB0aGVyZS4NCg0KICBWZXJ5IGludGVyZXN0 ZWQgaW4gZmVlZGJhY2sgb3IgYW55IG90aGVyIHJlbGF0ZWQgbWF0dGVycy4NCg0KICBDaGVlcnMg U2FiaW5lDQoNCg0KU2VuZCB1cyBUYWxrIGFuZCBXb3Jrc2hvcCBQcm9wb3NhbHMgZm9yIEZ1biBP Q2FtbCAyMDI1IGluIFdhcnNhdywgU2VwdGVtYmVyIDE1KzE2DQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3NlbmQtdXMtdGFsay1h bmQtd29ya3Nob3AtcHJvcG9zYWxzLWZvci1mdW4tb2NhbWwtMjAyNS1pbi13YXJzYXctc2VwdGVt YmVyLTE1LTE2LzE2NjQ2LzI+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgU2FiaW5lIFNj aG1hbHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg V2UncmUgc3RpbGwgbG9va2luZyBmb3IgdGFsa3MgYW5kIHdvcmtzaG9wcywgcGxlYXNlIGh1cnJ5 IHVwIGFuZCBzZW5kDQogIHVzIHNvbWUsIHNvIHRoYXQgd2UgY2FuIGFubm91bmNlIHNvbWUgZ3Jl YXQgdG9waWNzIGFuZCBzcGVha2VycyBzb29uIQ0KDQoNCkEgQnJpZWYgSW50cm9kdWN0aW9uIHRv IE5vcm1hbGl6YXRpb24tQnktRXZhbHVhdGlvbg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hLWJyaWVmLWludHJvZHVjdGlvbi10by1ub3JtYWxpemF0aW9uLWJ5LWV2YWx1YXRpb24vMTY4 NjkvMT4NCg0KDQpMb3VpcyBBc2hmaWVsZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEkgd3JvdGUgYSBicmllZiBpbnRyb2R1Y3Rpb24gdG8gdGhlIG5vcm1hbGl6YXRpb24tYnktZXZh bHVhdGlvbg0KICBhbGdvcml0aG0gaW4gT0NhbWwsIHdoaWNoIGlzIHRoZSBzdGFuZGFyZCB3YXkg dG8gZWZmaWNpZW50bHkgbm9ybWFsaXplDQogIGxhbWJkYSBjYWxjdWx1cyB0ZXJtcyB0byB0aGVp ciBiZXRhIG5vcm1hbCBmb3Jtcy4gSSBob3BlIHlvdSBmaW5kIHRoaXMNCiAgaW50cm9kdWN0aW9u IGhlbHBmdWwhDQoNCiAgPGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL2V0aWFtcy83ZmJiNjZhNDZi MmE0M2JlOTA4Y2NkNDAxNWQwMGZiOT4NCg0KDQpNeSBTZWNvbmQgT3V0cmVhY2h5IEludGVybnNo aXAncyBCbG9nIFBvc3QNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvbXktc2Vjb25kLW91dHJlYWNoeS1pbnRlcm5zaGlwcy1ibG9nLXBv c3QvMTY4NzIvMT4NCg0KDQpNYXR0aGV3IElkdW5nYWZhIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSGVsbG8gZXZlcnlvbmUsIGhlcmUncyBteSBzZWNvbmQgaW50ZXJuc2hp cCBibG9nIHBvc3QuIEluIHRoaXMNCiAgYXJ0aWNsZSwgSSBzaGFyZSB0aGUgc3RydWdnbGVzIGFu ZCBibG9ja2VycyBJIGZhY2VkIHRyeWluZyB0byBjb21wbGV0ZQ0KICBteSBmaXJzdCB0YXNrczoN CiAgPGh0dHBzOi8vbWVkaXVtLmNvbS9AbWF0dGlkdW5nYWZhL291dHJlYWNoeS13ZWVrLTMtZXZl cnlvbmUtc3RydWdnbGVzLTk5MDcxMDM1YWVjYj4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0aGUg b2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20gbWFu eSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0KDQog IOKAoiBbVGhleSBkbyBpdCB3aXRoIG1pcnJvcnMsIHlvdSBrbm93IC0gdGhhdCBzb3J0IG9mIHRo aW5nXQ0KICDigKIgW0ZlYXR1cmUgUGFyaXR5IFNlcmllczogSW1wcm92aW5nIERldmVsb3BlciBU b29saW5nIG9uIG1hY09TXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1s Lm9yZy9ibG9nLz4NCg0KW1RoZXkgZG8gaXQgd2l0aCBtaXJyb3JzLCB5b3Uga25vdyAtIHRoYXQg c29ydCBvZiB0aGluZ10NCjxodHRwczovL3d3dy5kcmEyNy51ay9ibG9nL3BsYXRmb3JtLzIwMjUv MDYvMjIvdGhleS1kby1pdC13aXRoLW1pcnJvcnMuaHRtbD4NCg0KW0ZlYXR1cmUgUGFyaXR5IFNl cmllczogSW1wcm92aW5nIERldmVsb3BlciBUb29saW5nIG9uIG1hY09TXQ0KPGh0dHBzOi8vdGFy aWRlcy5jb20vYmxvZy8yMDI1LTA2LTE4LWZlYXR1cmUtcGFyaXR5LXNlcmllcy1pbXByb3Zpbmct ZGV2ZWxvcGVyLXRvb2xpbmctb24tbWFjb3M+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0 XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 17 to 24, 2025.

    Multi-domain, multi-scheduler Lwt

    Rapha=C3=ABl Proust announced

    I have started working on changing Lwt to allow multiple schedulers to run in parallel in separate doma= ins. The current status is early work-in-progress with some actual tests th= at actually use the multi-scheduler feature (Draft PR).

    This is still far from release. There are some major changes still needed (= e.g., signal management, improve callback sending, restoring some broken si= ngle-domain tests, etc.). Still, I'd like to gather feedback from users of = Lwt, especially those with hefty code bases and those who need to bring the= ir legacy code bases into the ocaml-5 era (but don't hesitate to contribute= even if that's not the case).

    What kind of uses would you make of a multi-scheduler= multi-domain scheduler?

    "None" is a valid response. Maybe you don't want to use parallelism in your= Lwt-based codebase.

    I can see several reasonable uses:

    • a worker pool so you dispatch your server's requests to different cores= (but you don't really need to rewrite much of your code, you can keep your= lwt handlers, just set up a few domains and a few streams to send work aro= und)
    • having mutliple schedulers into which you can run lwt bits of code (e.g= ., via run_in_domain: Domain.id -> (unit -> 'a Lwt.t) -> 'a<= /code>, the multi-domain equivalent to run_in_main) from a "pr= oper" multi-domain code

    and also some maybe less reasonable uses:

    • writing some mixed lwt and regular old-fashion just-Unix blocking code,= and passing it off to a separate domain so it doesn't block your main sche= duler

    What parts of Lwt would you expect to be safe to shar= e freely amongst domains? What parts would you expect to have safety checks= ?

    Currently, the WIP version, allows you to attach callbacks to promises rega= rdless of which domain they were created in (safe to "read" any promise). I= t means that promises are not attached to a particular domain, but callback= s are.

    OTOH there are no efforts made to prevent data-races for wakeners (unsafe t= o "write" the same promise from two different domains). In most cases, Lwt.wakeup (and friends) should only be used to create new Lwt-fri= endly abstractions (e.g., lache) so there is little reason f= or them to move across domains. Still, is that something that should be tak= en into account?

    More generally, should the domain-safe abstractions replace the existing on= es (e.g., should Lwt_stream make it safe to push/read from the= same stream in parallel) or should there be new domain-safe abstractions (= e.g., an additional Lwt_stream_par)? And what performance cost= for single-domain programs is acceptable in order to make multi-domain pro= grams safe?

    Is one scheduler per-domain the right granularity/abs= traction?

    Would it be better to offer one scheduler per thread? Is there little point= in offering unlimited schedulers to begin with?

    15th MirageOS retreat May 13th - 20th

    Continuing this thread, Calascibetta Romain announced=

    As @gasche, I also wrote an article about this retreat which synthesis (not= exhaustively) what I did with some other people. But, despite @gasche, I p= ublished it into my blog here (which is an unikernel): https://blog.osau.re/artic= les/last_mirageos_retreat.html. Enjoy reading!

    opam 2.4.0~beta1

    Kate announced

    Hi everyone,

    We are happy and relieved to announce the first beta release of opam 2.4.0.

    This version is an beta, we invite users to test it to spot previously unno= ticed bugs as we head towards the stable release, which hopefully shouldn't= take too long.

    Changes

    • :dragon_face: Fixed a handful of bugs in opam install --deps-only= <local dir> more visible in 2.4, where some actions would use= the local packages' definition or write to the internal opam state as if t= hey were actually pinned (#6529, #6532= , #6501, #6535)
    • :yarn: Change the behaviour of --deps-only, where it no lo= nger requires unicity of package version between the request and the instal= led packages. In other words, if you have pkg.1 installed, ins= talling dependencies of pkg.2 no longer removes pkg.1. This also allows to install dependencies of conflicting packages when= their dependencies are compliant (#6520)
    • :firecracker: Fixed a couple of regressions which would make opam= update crash in some cases (#6513, #6527)
    • :window: Improve the prebuilt Windows binaries by including Cygwin's setup-x86_64.exe in the binary itself as fallback, in case cygwin.com is inaccessible (#6498, #6538)

    :open_book: You can read our blog post for more information, and for even more details y= ou can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.0~beta1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.0~beta1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    ML Family Workshop 2025: Call for Presentations

    Continuing this thread, Sam announced

    Update: we've extended the deadline to July 3!

    If you (or someone you know) is planning to attend ICFP/SPLASH, we encourag= e you to consider submitting. The submission requirements are small (only a= couple pages), and the scope of the workshop is broad: language design, im= plementation, memory management, type systems, semantics, applications, too= ling, debugging, program analysis – it's all fair game.

    This is a great opportunity to discuss works-in-progress, or demo something= you've been building. Perhaps you even have a spicy take about language de= sign? We have a submission category for that, and we'd love to hear it!

    Migrating OCaml.org to Use Dune (Developer Preview)

    Sabine Schmaltz announced

    Hi everyone,

    we're in the process of migrating OCaml.org to use Dune package management = (see https://githu= b.com/ocaml/ocaml.org/pull/3132). The intent behind this is to

    1. simplify the Developer Experience when building OCaml.org (to enable ne= wcomers to more easily get started contributing)
    2. demonstrate and ensure that Dune package management is suitable for the= production use case of running OCaml.org

    I would like everyone who has contributed, or would like to contribute to O= Caml.org, to have the opportunity to try the patch and give feedback first.

    So if you're interested in helping test Dune package management on OCaml.or= g, please do check out https://github.com/ocaml/ocaml.org/pull/3132, and follow the instr= uctions in the updated docs there.

    Very interested in feedback or any other related matters.

    Cheers Sabine

    Send us Talk and Workshop Proposals for Fun OCaml 2025 in Wars= aw, September 15+16

    Continuing this thread, Sabine Schmaltz announced

    We're still looking for talks and workshops, please hurry up and send us so= me, so that we can announce some great topics and speakers soon!

    A Brief Introduction to Normalization-By-Evaluation

    Louis Ashfield announced

    I wrote a brief introduction to the normalization-by-evaluation algorithm i= n OCaml, which is the standard way to efficiently normalize lambda calculus= terms to their beta normal forms. I hope you find this introduction helpfu= l!

    https://gist.github.com/etiams/7fbb66a46b2a43be908ccd4015d00fb9

    My Second Outreachy Internship's Blog Post

    Matthew Idungafa announced

    Hello everyone, here's my second internship blog post. In this article, I s= hare the struggles and blockers I faced trying to complete my first tasks: = https://medium.com/@mattidungafa/outreachy-week-3-every= one-struggles-99071035aecb

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=R0A8EHwi; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=xTiXFiIL; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 34AAD400BA for ; Tue, 1 Jul 2025 11:16:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=vqPVu3m1bybktAKgL7K3gmeJ0QkJvVh8O6sm5LIFKBs=; b=R0A8EHwiMuqkRmFZrgbNPJkUsnLCOEXBvLn4r7u/oRGRSdVl9Y4fAiAf Nm3kVPgE6omKVTecx4Bjpi9kcGG4298AGD0Sv0LbUlIac9FIsjwDq0/1V B5AeRtV7yVZavQ94WtRsH7lkiVhD5Q4Ng3xeSPfl++tichkcAHOnexX5c I=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,279,1744063200"; d="scan'208,217";a="229784290" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 01 Jul 2025 13:16:56 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id BFB44E0CCC; Tue, 1 Jul 2025 13:16:56 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 707B1E0157 for ; Tue, 1 Jul 2025 13:16:54 +0200 (CEST) IronPort-SDR: 6863c3a5_gEUDB9tsNrjJQ+StxbhdEmwWaUfoxeE6wzWcx7j19G4RIqS xvXelseBAKQb2bVvtdhLeJHGFXX2KdooAAEPIZQ== X-IPAS-Result: =?us-ascii?q?A0E6CgDhwmNohSIeaIFaHAEBATwBAQQEAQECAQEHAQGBa?= =?us-ascii?q?oE/GwJmGQFmWjMHCEmEVYNPjiKcRIJ6Ay4fGQEDAQ0UAgECDgcBGwQBAgQBA?= =?us-ascii?q?QMBAgGFABiLXgIfBgEENBMBAgQBAQEBAwIDAQEBAQEBEAEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAEBAQFASYV7DYJFUXGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIMATptChMBATgYIwMbAwIEDQE1FwESGoJoAYIfA?= =?us-ascii?q?gJLAwUMBpNNm0t6gTKBAYIMAQEGgQg+AwLaWIFlCYFHAgEBhWuCShoBKkhrh?= =?us-ascii?q?EqEPCcPgVVEgUqCRG+CShcBAQEBgTwBAU2DLoJpgiaBAhQdiHWPG4FESzMsA?= =?us-ascii?q?VUTFwsHBVuBCAMqNDFuMh2BJ4Z/hCwrT4USgRmDVBETbQ8GgR9cQAMLbT03F?= =?us-ascii?q?BuSQxkoGoJeDoFxBgJYaxEUFTWTRbJ4NAeEHoFeBgyJB4EmlgSFW6UHIphjI?= =?us-ascii?q?oldgSYJYIEtTJVcB4VSgX8jPIENDAczGjBDgmcJCQE8HA+SIYE+gSZ6eju2b?= =?us-ascii?q?0E1AgEBOAIHAQoBAQMJhWIBAYc+LQWBSwEB?= IronPort-PHdr: A9a23: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 TA= IronPort-Data: A9a23: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 vlALkXS3Hi4FX0= IronPort-HdrOrdr: A9a23:StEL86tPr7vhWQugpHWXNz4p7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: 9a23:drLegm22mNAstZTRODB3arxfWcd5bUTPx2jrfUqxUnhTbp2wc3y95/Yx X-Talos-MUID: =?us-ascii?q?9a23=3AWl0b0A+1P93Dj8qDFXrH4R2Qf9wxsoKKBQckqKo?= =?us-ascii?q?psZCkBCt2Oj6FpiviFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,279,1744063200"; d="scan'208,217";a="120390923" X-MGA-submission: =?us-ascii?q?MDEmWKks+NfBvdHmsvKGiEVsRqrYRLtgQ5MvKq?= =?us-ascii?q?7cu/pQFUhmA//YOvs8QfOOoWRVqMI8XBefwvo37IJNIekkgLUoQfiYc8?= =?us-ascii?q?ctGG1fWfwwQ7Gfs/tqxlRg+ng96hLbWGNucRzv5EKourPU5YwlsYwn4A?= =?us-ascii?q?whcFxIFvmrhKYmdD4E8FuvBw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 01 Jul 2025 13:16:53 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 78042564CED; Tue, 1 Jul 2025 13:16:52 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1751368612; bh=xnLyzycbuiKcc6VTAEglUnyncUs5IClejxNarucnUAo=; h=From:To:Subject:Date:Message-ID; b=xTiXFiILBd3yQ8uEUBnorml5f2QHygWtONN7VTfove0kIHJS+1F70OjnW2FtbMcYu houSYfr5HXXB3KrIhSaehOD1qEobbT/I0Lbmn4cjyN01v97Tg351guE63FkYR67LMr ftN+BC2oLVFjgXlu8CkWKgGc+KvMq4rTwRhYdygo= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 01 Jul 2025 13:16:52 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 1 13:16:52 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.494945, queueID=B4DEF564D12 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19348 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVuZSAyNCB0byBKdWx5DQowMSwgMjAyNS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpkcmVh bS1odG1sIGFuZCBwdXJlLWh0bWwgMy4xMS4wDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoN Cg0KZHJlYW0taHRtbCBhbmQgcHVyZS1odG1sIDMuMTEuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZHJlYW0taHRtbC1wdXJlLWh0bWwtMy0xMS0wLzE2ODg4LzE+DQoNCg0KWWF3YXIg QW1pbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhhcHB5IHRvIGFubm91bmNlIGEgbmV3IHJlbGVhc2Ug b2YgW2RyZWFtLWh0bWxdOg0KDQoNCltkcmVhbS1odG1sXSA8aHR0cHM6Ly9naXRodWIuY29tL3lh d2FyYW1pbi9kcmVhbS1odG1sPg0KDQpwdXJlLWh0bWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBBZGQgYHBsYWludGV4dC1vbmx5JyB2YWx1ZSBmb3IgW2Bjb250ZW50ZWRp dGFibGUnXSBhdHRyaWJ1dGUNCiAg4oCiIEpvaW4gQ1NTIGNsYXNzZXMgdG9nZXRoZXIgd2hlbg0K ICAgIFthZGRpbmddKDxodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9wdXJl LWh0bWwvUHVyZV9odG1sL2luZGV4Lmh0bWwjdmFsLSgrQCk+KQ0KICAgIGEgYGNsYXNzJyBhdHRy aWJ1dGUgdG8gYSBub2RlIHRoYXQgYWxyZWFkeSBoYXMgb25lDQogIOKAoiBFc2NhcGUgYDwnIGFu ZCBgPicgY2hhcmFjdGVycyBpbiBIVE1MIGF0dHJpYnV0ZXMgdG8gcHJldmVudCBbbVhTUw0KICAg IGF0dGFja3NdDQoNCg0KW2Bjb250ZW50ZWRpdGFibGUnXQ0KPGh0dHBzOi8veWF3YXJhbWluLmdp dGh1Yi5pby9kcmVhbS1odG1sL3B1cmUtaHRtbC9QdXJlX2h0bWwvSFRNTC9pbmRleC5odG1sI3Zh bC1jb250ZW50ZWRpdGFibGU+DQoNClttWFNTIGF0dGFja3NdDQo8aHR0cHM6Ly9idWdodW50ZXJz Lmdvb2dsZS5jb20vYmxvZy81MDM4NzQyODY5NzcwMjQwL2VzY2FwaW5nLWFuZC1pbi1hdHRyaWJ1 dGVzLWhvdy1pdC1oZWxwcy1wcm90ZWN0LWFnYWluc3QtbXV0YXRpb24teHNzPg0KDQoNCmRyZWFt LWh0bWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBBZGQgW2BEcmVh bV9odG1sLmlmX25vbmVfbWF0Y2gnXSBhbmQgYGlmX21hdGNoJyBoZWxwZXJzIGZvcg0KICAgIGNv bmRpdGlvbmFsIHJlcXVlc3RzIHVzaW5nIEVUYWdzDQogIOKAoiBBZGQgW2Bmb2xkJ10gZnVuY3Rp b24gdG8gdHJhdmVyc2Ugbm9kZXMNCiAg4oCiIFJlbW92ZSBzb21lIGluY29ycmVjdCBwYXRoIHZh bGlkYXRpb24gZnJvbSB0aGUgW1BQWF0NCg0KDQpbYERyZWFtX2h0bWwuaWZfbm9uZV9tYXRjaCdd DQo8aHR0cHM6Ly95YXdhcmFtaW4uZ2l0aHViLmlvL2RyZWFtLWh0bWwvZHJlYW0taHRtbC9EcmVh bV9odG1sLyN2YWwtaWZfbm9uZV9tYXRjaD4NCg0KW2Bmb2xkJ10NCjxodHRwczovL3lhd2FyYW1p bi5naXRodWIuaW8vZHJlYW0taHRtbC9wdXJlLWh0bWwvUHVyZV9odG1sL2luZGV4Lmh0bWwjdmFs LWZvbGQ+DQoNCltQUFhdIDxodHRwczovL3lhd2FyYW1pbi5naXRodWIuaW8vZHJlYW0taHRtbC9k cmVhbS1odG1sL1BweC9pbmRleC5odG1sPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2Ft bC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9D YW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCi IFtPQ2FtbCwgbW9kdWxlcywgYW5kIGltcG9ydCBzY2hlbWVzXQ0KICDigKIgW0d1YXJkZWQgbWV0 aG9kcyBpbiBPQ2FtbF0NCiAg4oCiIFtFRUcgaW50ZXJuc2hpcHMgZm9yIHRoZSBzdW1tZXIgb2Yg MjAyNV0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxvZy8+ DQoNCltPQ2FtbCwgbW9kdWxlcywgYW5kIGltcG9ydCBzY2hlbWVzXQ0KPGh0dHBzOi8veHZ3Lmxv bC9lbi9hcnRpY2xlcy9tb2R1bGVzLWltcG9ydC5odG1sPg0KDQpbR3VhcmRlZCBtZXRob2RzIGlu IE9DYW1sXSA8aHR0cHM6Ly94dncubG9sL2VuL2FydGljbGVzL29vcC1yZWZsLmh0bWw+DQoNCltF RUcgaW50ZXJuc2hpcHMgZm9yIHRoZSBzdW1tZXIgb2YgMjAyNV0NCjxodHRwczovL2FuaWwucmVj b2lsLm9yZy9ub3Rlcy9lZWctaW50ZXJucy0yMDI1Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2Vu ZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEg bG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVz XS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWls LCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2No bWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0 ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5p bnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8v YWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of June 24 to July 01, 2025.

    dream-html and pure-html 3.11.0

    Yawar Amin announced

    Happy to announce a new release of dream-html:

    pure-html

    dream-html

    • Add Dream_html.if_none_match and if_match helpers for conditional requests using ETags
    • Add fold function to traverse nodes
    • Remove some incorrect path validation from the PPX

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=fCeX9Krn; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=WNsKfbZx; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 09E14400A2 for ; Tue, 8 Jul 2025 12:45:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=CDQ6shqn2fn/x8zjx29cyg0dbKsiAwoGOE+Hbte8+zg=; b=fCeX9Krn179csau+EsAi/2omwKFCa9tXfk6k+9pni6by4TPNyIvkyAZj WTPK1X/ha6xVM8OD9ylL2UpqLcGvPXM/zGUg3kwNkixhOZA8wuwJnBS5U LsG5S93YmwkurqkfXwMa99MeNG28CEXij9WiuGVnYbxLCs4CFwg5nd1CA o=; Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,297,1744063200"; d="scan'208,217";a="230817275" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 08 Jul 2025 14:45:44 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id D8E58E0AF6; Tue, 8 Jul 2025 14:45:43 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 339DCE0157 for ; Tue, 8 Jul 2025 14:45:42 +0200 (CEST) IronPort-SDR: 686d12f3_VAplU53yArwVJzlB2XlJ4bWcjDuWTwJ1FE7gUCFqUnOfRjU 33cqEC6wrvPBxcpNAi7z3ZD7XehRXdRkAeNISzw== X-IPAS-Result: =?us-ascii?q?A0EvBQCSEm1odyIeaIFSCIQdWygZAWAGWjMHCEkDhBY8g?= =?us-ascii?q?WOBbI4igRaKUYVkiEqCMIFpgUIjFQEDAQ0uARsEAQIEAQEDAQIBggyBPYE3A?= =?us-ascii?q?ot8Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEQAQEFAQEBAgEBAgQGAQIQAUNJh?= =?us-ascii?q?XsNgkUZOEEwdAEBAQEBAQEBAScBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAgwBAoEADg4BCAQGEwEBKQEBAQMDBhgUDwMQB?= =?us-ascii?q?AEGAwIRARAlAwETARIUBoJpgh8CAhYDMgMEAQwGkw2aeho3en8zgQFXgTUBA?= =?us-ascii?q?QaBCD4DCwICAw8uAdkQDW6BG0oJgUmFbYJGBBoBKkhrAoRICYQzJw+BVUSBF?= =?us-ascii?q?YIoSgdvgUJdIAsXAQEBAVxEBAQBAQ0EAgEaDyQJgyWCaYIRFUQ+FB2BDYESg?= =?us-ascii?q?nKBQGESgSpDghoEgVyEO4ZmgUQiAyYzLAFVExcLBwVbgQgDKjQxbjIdgSeGe?= =?us-ascii?q?4QqK0+FEIEZg1QRE20PBoEdgSJAAwttPTcUG5JgGSkacAIBgUklDjgGKwMED?= =?us-ascii?q?A8NCAIRAQYOBQEFDhAGAiACDSUDASMWBwMFDwEEDwIHAQ0FCRUBBiMFBgkCC?= =?us-ascii?q?wItA5JBCAwlAwYkAgF0jWl4oW8dMD00B4QfgV4GDIkIgSaOMoEKgnKDV4QET?= =?us-ascii?q?YEKiziHApJPIphkIoI2hycKgRwJgW9qhAiRVQIRAwYEhTmBfyM8MHAzGjBDg?= =?us-ascii?q?mcJRhwPiACFfy4WgRIBAQIEAYJDQX2BJnopUTuCZrcMQTUCAQEKLgIHAQoBA?= =?us-ascii?q?QMJhUUdAQGIDYFDCAEB?= IronPort-PHdr: A9a23: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 0EWsRQK4xgPxNYYQw== IronPort-Data: A9a23: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 wQ= IronPort-HdrOrdr: A9a23:2gxonqGgk3UMYqDkpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:yqipImxjXQHUxJg1d+/9BgUEPtsZI1LFwk3RLmy/BUtQE7S4TUKfrfY= X-Talos-MUID: 9a23:nAkF9Ah89FyjRtTRnSfhccMpKuhF+ICJUlE0gL45muuOGSd6AmqmpWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,297,1744063200"; d="scan'208,217";a="120944667" X-MGA-submission: =?us-ascii?q?MDEJrsQGywEo7GgfV4Mjh04DlO208e6G9qFHuX?= =?us-ascii?q?mmzYOrNWEEffkPDfdSW+4TwtEnxpyCACR6Ai1VuI8Ytli6PZQ/UMuP1N?= =?us-ascii?q?k7Y5WVS/M/GEGOfv1zFCYfNFJjlVOU/5pmL9c77vamg9239iRsl5y7W6?= =?us-ascii?q?ZyulEOhILDecs2pbrUrujI+w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 08 Jul 2025 14:45:40 +0200 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 6B59D564E70; Tue, 8 Jul 2025 14:45:38 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1751978738; bh=eZ4ag0Dh7yN9DLS4w6VmpATithEBbgfaovMHr+U2lO0=; h=From:To:Subject:Date:Message-ID; b=WNsKfbZxspbJKq72NwpHeHAY4RR7cI4LGLq8eFOGcNKLVEd45g5ikHVdSgf74WdhG 6ttAzxYNgybweXUjPaEQh+k3yLmniQdgsV3mxJ62hQHWf0x58Or6SBUmAJzHqPkLU7 oJ2LKocKB3JwTybZVTsolIf3Cn6chsJEoSGfEe+U= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 08 Jul 2025 14:45:36 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 8 14:45:39 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499962, queueID=AAD0F564E71 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19350 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of July 01 to 08, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml security team Dockerfile for building an OPAM application, with dune/apt/opam caching opam 2.4.0~rc1 Js_of_ocaml 6.1.0 / Wasm_of_ocaml Announcing Raven: Scientific Computing for OCaml (Alpha Release) Slipshow! Other OCaml News Old CWN OCaml security team =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear everyone, We are starting an effort to push security into OCaml. This is based on discussions in the OCaml Software Foundation with industry partners. The main goal is to have best practises similar to those of other programming language ecosystems. Reporting security issues =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This entails a point of contact for the security team - which deals with communication between the person who found a security-relevant problem in OCaml software (named "reporter"), who can then contact us - the security team - instead of using a public bug tracker, and the upstream OCaml developer(s). We, the security team, will establish the three-way communication, and since we have a documented security disclosure process (which will be published soon), we will guide everyone through the process and ensure that timelines are met, CVE numbers are assigned, =E2=80=A6 Team composition =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml security team currently consists of individual security experts and individuals representing company sponsors of the OCaml Software Foundation. Individual members participating on a personal capacity may be compensated for their time from the OCaml Software Foundation. The team currently consists of 7 members =E2=80=A2 Hannes Mehnert - individual, chair =E2=80=A2 Mindy - individual =E2=80=A2 Joe - individual =E2=80=A2 Edwin T=C3=B6r=C3=B6k - individ= ual =E2=80=A2 Nicol=C3=A1s Ojeda B=C3=A4r - LexiFi =E2=80=A2 Louis Roch=C3=A9 - ahrefs =E2=80=A2 Maxim Grankin - Bloomberg We're in the process to formalise the responsibilities of the team, our proposed disclosure process, and how to join & leave the team. Funding for security actions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C In complement to the security disclosure process, we will accept funding requests for projects that make OCaml more secure (including guidelines how to develop OCaml in a secure way/what are common pitfalls; static analysis; dissemination tools; =E2=80=A6). The OCaml Sof= tware Foundation will provide funding for these security actions. After this summer we will discuss this in more depth with the community. Next steps =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C We will setup a website (similar to has) soon, and provide an email address for contacting us - security At ocamlDoT org is forwarding to our team. We plan to setup a mailing list for security announcements. But more on that at a later point, this brief post is mainly about the fact that this team starts to exist now, and is working on improving the security story of OCaml. If you have any questions for now, please feel free to discuss them in this announcement. Please be aware that it is vacation time soon, so we may not be very responsive. Dockerfile for building an OPAM application, with dune/apt/opam caching =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Edwin T=C3=B6r=C3=B6k announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I was writing some dockerfiles for building some OCaml applications recently, and realized that it is possible to write a Dockerfile that can build almost arbitrary Opam applications without even having to hardcode the package name. I used `ocaml-dockerfile' to generate it (only the OS and OCaml version is hardcoded), so I thought I'd share it, it should work with both Podman and Docker: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # syntax=3Ddocker/dockerfile:1 =E2=94=82=20 =E2=94=82 FROM ocaml/opam:debian-12-ocaml-4.14 =E2=94=82=20 =E2=94=82 # Update the opam repository (otherwise lockfile may contain a = version we don't know about) =E2=94=82 RUN git -C /home/opam/opam-repository pull origin master && opa= m-2.3 update =E2=94=82=20 =E2=94=82 # Enable the dune cache in copy mode =E2=94=82 # (hardlink mode would fail with EXDEV if cache is on separate = disk/partition) =E2=94=82 # This caches the build of opam dependencies using dune and the= main application =E2=94=82 ENV DUNE_CACHE=3D"enabled" DUNE_CACHE_STORAGE_MODE=3D"copy" =E2=94=82=20 =E2=94=82 # `apt` in containers is usually configured to always clean up = after operations =E2=94=82 # When we have a cache mount for the APT package cache we don't= want to clean up, since the cache would be ineffective. =E2=94=82 # Also change OPAM to use the 0install solver, this is faster, = especially when a lockfile is present. =E2=94=82 RUN sudo rm -f /etc/apt/apt.conf.d/docker-clean && \ =E2=94=82 opam-2.3 option solver=3Dbuiltin-0install =E2=94=82=20 =E2=94=82 # Use a workdir outside of $HOME, to avoid having .opam as a su= bdir of the build =E2=94=82 WORKDIR /app =E2=94=82 # Copy dependency definitions first. See https://docs.docker.co= m/build/cache/optimize/#order-your-layers =E2=94=82 COPY [ "*.opam", "*.opam.locked", "." ] =E2=94=82=20 =E2=94=82 # Install and cache system packages required by the build =E2=94=82 # The cache is locked, so multiple container builds will wait h= ere =E2=94=82 # (apt would have a lock but it is stored outside of the cache = dir, so we cannot rely on it to prevent concurrent accesses) =E2=94=82 # A cache id is used, so that different distros would have diff= erent cache folders =E2=94=82 RUN --mount=3Dtype=3Dcache,id=3D/var/cache/apt#debian-12;amd64,= target=3D/var/cache/apt,sharing=3Dlocked \ =E2=94=82 --mount=3Dtype=3Dcache,id=3D/var/lib/apt#debian-12;amd64,ta= rget=3D/var/lib/apt,sharing=3Dlocked \ =E2=94=82 sudo apt-get update -y && \ =E2=94=82 opam-2.3 install --locked --with-test . --depext-only =E2=94=82=20 =E2=94=82 # Download and cache opam package dependencies =E2=94=82 # The cache is locked, so multiple container builds will wait h= ere =E2=94=82 # To minimize the time the lock is held the actual package inst= allations are done as a separate step =E2=94=82 RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.opam/download-c= ache,sharing=3Dlocked,uid=3D1000,gid=3D1000 \ =E2=94=82 opam-2.3 install --locked --with-test . --download-only =E2=94=82=20 =E2=94=82 # Install (cached) downloaded opam dependencies =E2=94=82 # The download cache is mounted readonly and shared, multiple c= ontainer builds can proceed in parallel. =E2=94=82 # The dune cache is mounted RW. =E2=94=82 # Multiple concurrent builds will use the same cache, but dune = must already be able to cope with this =E2=94=82 # A cache id is used, so that different distros would have diff= erent cache folders (it is unlikely that dune caches would be sharable acro= ss distros) =E2=94=82 RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.opam/download-c= ache,readonly,sharing=3Dshared,uid=3D1000,gid=3D1000 \ =E2=94=82 --mount=3Dtype=3Dcache,target=3D/home/opam/.cache/dune,shar= ing=3Dshared,uid=3D1000,gid=3D1000 \ =E2=94=82 opam-2.3 install --locked --with-test . --deps-only =E2=94=82=20 =E2=94=82 # Copy actual application source code =E2=94=82 COPY [ ".", "." ] =E2=94=82=20 =E2=94=82 # Build and install application code, using dune cache. =E2=94=82 RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.cache/dune,shar= ing=3Dshared,uid=3D1000,gid=3D1000 \ =E2=94=82 opam-2.3 install --locked --with-test . =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It avoids some common pitfalls: =E2=80=A2 disable cleanup of APT downloaded packages (otherwise caching is ineffective) =E2=80=A2 enables the opam download cache too which is stored in a non-standard location (`~/.opam/download-cache' instead of `~/.cache/opam') =E2=80=A2 avoids EXDEV from dune cached builds during opam dependency installations by enabling dune cache copy mode =E2=80=A2 uses opam-2.3 explicitly, since the default opam in the Dockerh= ub images is quite old (luckily opam-2.3 is already there, just needs to be invoked explicitly) =E2=80=A2 sets the default solver to 0install. This seems to be needed to speed up `opam install' even when `--locked' is used and no dependency resolution is needed. Otherwise it was spending 4s checking the solver request. =E2=80=A2 sets appropriate uid in cache mounts to avoid permission issues Caveats: =E2=80=A2 if you use git submodules then you have to add `.git' to your `.dockerignore'. Otherwise opam pinning will fail, since `.git' is a file referencing a git dir in a parent dir that is not mounted inside the docker build environment =E2=80=A2 maybe =E2=80=93dev should be used if you intend to use the cont= ainer for developing the opam application. Although in that case you might also want to preinstall some useful tools like `lsp', and `ocamlformat'. Eventually I hope this can be simplified using Dune's new package management feature. opam 2.4.0~rc1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the first release candidate of opam 2.4.0. This is hopefully the first and last release candidate for opam 2.4, so we invite users to test it to spot previously unnoticed bugs as we soon head to the stable release. Changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :woman_scientist: Fix a regression in `opam switch create ' not working when all compilers of that version are flagged with `avoid-version'. This would have prevented users to use commands such as `opam switch create 5.4.0~alpha1' ([#6563]). =E2=80=A2 :high_speed_train: Improve performance of `opam update' for use= rs of local repositories that happen to be git repositories (for example if you've ever used `opam repository add --kind local' or similar). In particular the new OCaml implementation of patch, does not scan those VCS directories anymore, which made opam use a lot of RAM unnecessarily ([#6560]). :open_book: You can read our [blog post] to read about the other more minor changes, and for even more details you can take a look at the [release note] or the [changelog]. [#6563] [#6560] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.4.0~rc1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.4.0~rc1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Js_of_ocaml 6.1.0 / Wasm_of_ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hhugo announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m pleased to announce the joint release of js_of_ocaml 6.1.0 and wasm_of_ocaml. Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it possible to run pure OCaml programs in JavaScript environment like browsers and Node.js. [Wasm_of_ocaml] is a compiler from OCaml bytecode to WebAssembly. It is highly compatible with Js_of_ocaml, so you can compile your programs with wasm_of_ocaml instead of js_of_ocaml and experience overall better performance. Most significant changes: =E2=80=A2 A lot of effort was spent on optimizing compilation speed and compile-time memory usage. we're seeing up to 4x compilation speed improvement in some cases. See the [Changelog] for other changes. [Wasm_of_ocaml] [Changelog] Announcing Raven: Scientific Computing for OCaml (Alpha Release) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm excited to announce the alpha release of [Raven], a modern scientific computing ecosystem for OCaml. [Raven] What is Raven? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Raven is a collection of libraries and tools for numerical computing and machine learning, including: =E2=80=A2 *Nx:* Multi-dimensional arrays with NumPy-like operations and pluggable backends (now pure OCaml, C FFI, Metal, next CUDA, WebGPU, etc.) - our equivalent of NumPy =E2=80=A2 *Rune:* Automatic differentiation and device placement, building toward JIT compilation - our equivalent of Jax =E2=80=A2 *Kaun:* Deep learning framework inspired by [Flax]/[PyTorch], b= uilt on Rune =E2=80=A2 *Sowilo:* Computer vision library with differentiable operation= s, build on Rune =E2=80=A2 *Hugin:* Plotting library for data visualization - our equivale= nt of matplotlib =E2=80=A2 *Quill:* Markdown-first interactive notebooks - very different = from Jupyter, but our answer to interactive notebooks The ecosystem is designed to work together seamlessly, with Nx as the foundation, Rune providing differentiable computation, and domain-specific libraries building on top. [Flax] [PyTorch] Getting Started =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Install Raven via opam: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam install raven =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here's a quick example showcasing automatic differentiation with Rune: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Rune =E2=94=82=20 =E2=94=82 (* Define a simple neural network layer *) =E2=94=82 let layer ~w ~b x =3D add (matmul x w) b =E2=94=82=20 =E2=94=82 (* Compute mean squared error loss *) =E2=94=82 let mse_loss ~w ~b x y =3D =E2=94=82 let pred =3D layer ~w ~b x in =E2=94=82 let diff =3D sub pred y in =E2=94=82 mean (mul diff diff) =E2=94=82=20 =E2=94=82 let result =3D =E2=94=82 (* Choose device - Rune.ocaml, Rune.c, Rune.metal *) =E2=94=82 let dev =3D Rune.c in =E2=94=82=20 =E2=94=82 (* Initialize parameters on the device *) =E2=94=82 let w =3D randn dev float32 [| 3; 2 |] in =E2=94=82 let b =3D zeros dev float32 [| 2 |] in =E2=94=82 let x =3D randn dev float32 [| 10; 3 |] in =E2=94=82 let y =3D randn dev float32 [| 10; 2 |] in =E2=94=82=20 =E2=94=82 (* Compute loss and gradients *) =E2=94=82 let loss, grad_w =3D value_and_grad (fun w -> mse_loss ~w ~b = x y) w in =E2=94=82 Printf.printf "Loss: %g\n" (unsafe_get [] loss); =E2=94=82 grad_w =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val result : (float, Rune.float32_elt, [ `c ]) Rune.t =3D =E2=94=82 [[-1.74967, 0.863766], =E2=94=82 [-0.140407, -0.269364], =E2=94=82 [0.593187, 0.0197736]] =E2=94=82 Loss: 2.13033 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For more examples and detailed documentation, visit [raven-ml.dev]. [raven-ml.dev] Why Raven? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Today's machine learning ecosystem is converging on frameworks built atop ML compilers: high-level Python APIs that build computation graphs, then JIT compile them for performance. In parallel, [JAX] and [Flax] have gained popularity with their functional APIs. For instance, JAX uses function transformations (grad, jit, vmap) to implements its core features. This is a landscape where OCaml has natural advantages. OCaml excels at building compilers, which includes ML compilers, and as a functional language, it's a more natural fit for functional ML APIs than Python with JAX. Given these technical advantages, Python's dominance comes down to developer experience: the massive ecosystem and excellent prototyping ergonomics. We believe that with the right tooling, OCaml can match Python's productivity for prototyping and exploratory work. And the ecosystem gap doesn't have any fundamental challenge: we "just" need to write a lot of code. If Raven succeeds, we believe it will offer a much more compelling alternative to Python: a language that enables rapid prototyping while eliminating the gap between exploration and production. You'll move from local development to production without switching languages, without separate teams, without maintaining two stacks. [JAX] [Flax] Technical Highlights: Rune's autodiff engine =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C One interesting aspect of Raven is Rune's implementation of automatic differentiation using OCaml's effects system. As far as we know, this is the first production-scale autodiff engine built on effects, drawing on research by [Jesse Sigal] and earlier work by [KC Sivaramakrishnan]. The architecture follows a modular design: =E2=80=A2 Pluggable backends in Nx allow implementation for different har= dware =E2=80=A2 Rune implements an Nx backend that raises effects for all operations. =E2=80=A2 These effects are either caught by an effect handler (e.g. grad, jit), or, if unhandled, executed eagerly =E2=80=A2 This allows for composable effects handlers (e.g. grad (grad f)= , jit (grad f), etc.) [Jesse Sigal] [KC Sivaramakrishnan] Technical Highlights: Quill Notebooks =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C Quill reimagines interactive notebooks with a [Typora]like experience. Markdown renders live as you write, switching to raw markdown when you focus on a section for editing. This creates a natural writing experience where code blocks integrate naturally into your document. The result is a distraction-free notebook environmnet, that prioritizes focused writing, while still providing full editor features within code blocks (coming soon =E2=84=A2!). While still early, we're excited to see how the community reacts to Quill when it is stable enough for daily use - we really think it has the potential to offer a much better notebook experience for teaching, reading, and other workflows. [Typora] Current Status =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This is an alpha release. APIs are stabilizing but may still change. Things will break - this is expected at this stage! If you encounter bugs, please open an issue on GitHub; community feedback is invaluable to get to a stable release. We're currently focused on: =E2=80=A2 Stabilizing core APIs for the 1.0 release =E2=80=A2 Writing documentation and user guides =E2=80=A2 Supporting early users adoption (FFT, linear algebra, CUDA back= end) Post-Alpha priorities include JIT compilation and stable Quill environment. Building a Community =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C One bet we're taking with Raven is that it will allow a scientific and ML community in OCaml to flourish. As of now, it's still largely a one-person project. While I'm committed to its development, we really need to see the development of a larger community for a project of this size to survive. If you're interested in the project, the best thing you can do is to engage=E2=80=94whether by opening issues, reaching out, or contributing. Alongside reaching a first stable release, building a community is Raven's main priority from now on, so any kind of contribution or engagement will be deeply appreciated. If there's anything I can do to make Raven more welcoming and approachable, let me know. I've always believed that the best way to grow OCaml adoption is to provide killer apps for specific use cases (just like Rails did for Ruby). Raven's not quite there yet in terms of advantages over Python, but it can get there, and if that's something you'd like to contribute to, please reach out\! Getting Involved =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Here are immediate ways to contribute as we work toward a stable release: *For users:* =E2=80=A2 Try the libraries with your workflows and report issues =E2=80=A2 Share feedback on API design and usability =E2=80=A2 Help test on different platforms and configurations *For contributors:* =E2=80=A2 Optimize eager execution backends while we build JIT compilation =E2=80=A2 Add missing NumPy/Jax/Flax operations to Nx/Rune/Kaun =E2=80=A2 Contribute examples and documentation Don't hesitate to reach out if you'd like to be involved closely with the core development: =E2=80=A2 JIT compilation =E2=80=A2 Stabilize Quill (many bugs to fix!) =E2=80=A2 New libraries *Resources:* =E2=80=A2 GitHub: =E2=80=A2 Documentation: =E2=80=A2 Contact: thibaut.mattio@gmail.com Acknowledgments =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C I'd like to thank our early contributors and testers who have helped shape Raven: =E2=80=A2 @axrwl =E2=80=A2 @gabyfle =E2=80=A2 @hesterjeng =E2=80=A2 @ghennequin =E2=80=A2 @kayceesrk =E2=80=A2 @blueavee Special thanks to our GitHub sponsors for their support: =E2=80=A2 @daemonfire300 =E2=80=A2 @gabyfle =E2=80=A2 @sabine Your feedback, contributions and support have been invaluable in getting Raven to this alpha release - thank you\! Supporting Raven's Development =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C As Raven grows, I'm looking for sustainable ways to continue dedicating time to the project. If you're an industrial user interested in using Raven for your machine learning or scientific computing needs, I'd love to talk about how we can work together. For individuals who want to support the project, I have a [GitHub Sponsors page]. Any contribution, no matter the size, is deeply appreciated and helps ensure Raven's continued development. [GitHub Sponsors page] Slipshow! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Continuing this thread, Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80 Let's continue with a new release in this Slipshow thread. It's my _ginormous pleasure_ to announce the [opam release] of: [opam release] Slipshow v0.3.0: The return of the subslips =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C As you can see, a crucial improvement is that releases are now named. Semver is boring, let's add a bit of fun in a serious world. The release name subtly suggests that subslips are back. Yes, subslips are back! Slipshow allows your presentation to be visually organized. Subslips are slips that are inside a slip. You can then "enter" it, go through it, and exit it to go back to the original slip. But a gif is worth a ginormous word, so here it is: [A demo of slipshow entering subslips] To obtain a similar effect, using the new release, you can simply do: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 We will discuss three topics: =E2=94=82=20 =E2=94=82 {style=3D"display:flex" children:slip} =E2=94=82 ---- =E2=94=82 # Topic 1 =E2=94=82=20 =E2=94=82 Content of the first topic =E2=94=82=20 =E2=94=82 --- =E2=94=82 # Topic 2 =E2=94=82=20 =E2=94=82 Content of the second topic =E2=94=82=20 =E2=94=82 --- =E2=94=82 # Topic 3 =E2=94=82=20 =E2=94=82 Content of the third topic =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you want to separate the source in multiple file, it's easy: `{include src=3D"file/to/include.md"}'. And did you notice that `---' now act as group separators? At this point, let me just output the changelog (highligting some of them): [A demo of slipshow entering subslips] =E2=97=8A Compiler =E2=80=A2 *Fix file watching issues* by vendoring a (modified) irmin-watc= her, and watching all files the presentation depends on (images, themes, =E2=80=A6) (#113) =E2=80=A2 Adds a favicon to the presentation file (*Slipshow now has a lo= go!*) (#115) =E2=80=A2 Fix missing attributes on images (#117) =E2=80=A2 Fix missing mime type on images that made svg undisplayable (#1= 20) =E2=80=A2 Fix detection of math inside inline attributes (#124) =E2=80=A2 *Add `--dimension' to specify the dimension of the presentation (#131)* =E2=80=A2 Add less boring name for versions (#132) =E2=97=8A Language =E2=80=A2 *Add `{include src=3D"path/to/file.md"}' to include a file in a= nother (#114)* =E2=80=A2 Allow `pause' to have a target (#118) =E2=80=A2 Remove the need for `step' to execute actions (#118) =E2=80=A2 *Added support for subslips and slides (#118)* =E2=80=A2 Added pause blocks (#127) =E2=80=A2 *Use horizontal lines (`---') to group blocks (#129)* =E2=80=A2 Pass attributes to children with `children:' (#130) =E2=80=A2 Consistently remove the need for `-at-unpause' (#133) =E2=97=8A Engine =E2=80=A2 Simplify table of content by removing preview (#118) =E2=80=A2 *Fix wrong computation of location (#118, #119)* =E2=80=A2 *Improve zooming behaviour (everywhere) and performance (on chrome-based browsers=E2=80=A6) (#121)* =E2=80=A2 If someone has some expertise on how to improve performance on firefox, I'm interested! =E2=80=A2 Add PageUp and PageDown as navigation keys, adding support for pointers (#126) =E2=80=A2 Do not act when control is pressed (#126) =E2=80=A2 Fix wrong positioning on scaled slips (#128) =E2=97=8A Credits Thanks to the NLNet foundation for supporting this project! Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Weeks 24-27] =E2=80=A2 [The week that was - 2025 w27] =E2=80=A2 [Improving Memory Profiler Visualisations for OCaml] =E2=80=A2 [The Hell of Tetra Master] [the ocaml.org blog] [Weeks 24-27] [The week that was - 2025 w27] [Improving Memory Profiler Visualisations for OCaml] [The Hell of Tetra Master] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 01 to 08, 2025.

    OCaml security team

    Hannes Mehnert announced

    Dear everyone,

    We are starting an effort to push security into OCaml. This is based on dis= cussions in the OCaml Software Foundation with industry partners. The main = goal is to have best practises similar to those of other programming langua= ge ecosystems.

    Reporting security issues

    This entails a point of contact for the security team - which deals with co= mmunication between the person who found a security-relevant problem in OCa= ml software (named "reporter"), who can then contact us - the security team= - instead of using a public bug tracker, and the upstream OCaml developer(= s).

    We, the security team, will establish the three-way communication, and sinc= e we have a documented security disclosure process (which will be published= soon), we will guide everyone through the process and ensure that timeline= s are met, CVE numbers are assigned, …

    Team composition

    The OCaml security team currently consists of individual security experts a= nd individuals representing company sponsors of the OCaml Software Foundati= on. Individual members participating on a personal capacity may be compensa= ted for their time from the OCaml Software Foundation.

    The team currently consists of 7 members

    We're in the process to formalise the responsibilities of the team, our pro= posed disclosure process, and how to join & leave the team.

    Funding for security actions

    In complement to the security disclosure process, we will accept funding re= quests for projects that make OCaml more secure (including guidelines how t= o develop OCaml in a secure way/what are common pitfalls; static analysis; = dissemination tools; …). The OCaml Software Foundation will provide = funding for these security actions. After this summer we will discuss this = in more depth with the community.

    Next steps

    We will setup a website (similar to https://www.haskell.org/security/ has) soon, and provide an emai= l address for contacting us - security At ocamlDoT org is forwarding to our= team. We plan to setup a mailing list for security announcements.

    But more on that at a later point, this brief post is mainly about the fact= that this team starts to exist now, and is working on improving the securi= ty story of OCaml.

    If you have any questions for now, please feel free to discuss them in this= announcement. Please be aware that it is vacation time soon, so we may not= be very responsive.

    Dockerfile for building an OPAM application, with dune/apt/opa= m caching

    Edwin T=C3=B6r=C3=B6k announced

    I was writing some dockerfiles for building some OCaml applications recentl= y, and realized that it is possible to write a Dockerfile that can build al= most arbitrary Opam applications without even having to hardcode the packag= e name.

    I used ocaml-dockerfile to generate it (only the OS and OCaml = version is hardcoded), so I thought I'd share it, it should work with both = Podman and Docker:

    # syntax=3Ddocker/dockerfile:1
    
    FROM ocaml/opam:debian-12-ocaml-4.14
    
    # Update the opam repository (otherwise lockfile may contain a version we d=
    on't know about)
    RUN git -C /home/opam/opam-repository pull origin master && opam-2.=
    3 update
    
    # Enable the dune cache in copy mode
    # (hardlink mode would fail with EXDEV if cache is on separate disk/partiti=
    on)
    # This caches the build of opam dependencies using dune and the main applic=
    ation
    ENV DUNE_CACHE=3D"enabled" DUNE_CACHE_STORAGE_MODE=3D"copy"
    
    # `apt` in containers is usually configured to always clean up after operat=
    ions
    # When we have a cache mount for the APT package cache we don't want to cle=
    an up, since the cache would be ineffective.
    # Also change OPAM to use the 0install solver, this is faster, especially w=
    hen a lockfile is present.
    RUN sudo rm -f /etc/apt/apt.conf.d/docker-clean && \
      opam-2.3 option solver=3Dbuiltin-0install
    
    # Use a workdir outside of $HOME, to avoid having .opam as a subdir of the =
    build
    WORKDIR /app
    # Copy dependency definitions first. See https://docs.docker.com/build/cach=
    e/optimize/#order-your-layers
    COPY [ "*.opam", "*.opam.locked", "." ]
    
    # Install and cache system packages required by the build
    # The cache is locked, so multiple container builds will wait here
    # (apt would have a lock but it is stored outside of the cache dir, so we c=
    annot rely on it to prevent concurrent accesses)
    # A cache id is used, so that different distros would have different cache =
    folders
    RUN --mount=3Dtype=3Dcache,id=3D/var/cache/apt#debian-12;amd64,target=3D/va=
    r/cache/apt,sharing=3Dlocked \
        --mount=3Dtype=3Dcache,id=3D/var/lib/apt#debian-12;amd64,target=3D/var/=
    lib/apt,sharing=3Dlocked \
        sudo apt-get update -y && \
        opam-2.3 install --locked --with-test . --depext-only
    
    # Download and cache opam package dependencies
    # The cache is locked, so multiple container builds will wait here
    # To minimize the time the lock is held the actual package installations ar=
    e done as a separate step
    RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.opam/download-cache,sharing=
    =3Dlocked,uid=3D1000,gid=3D1000 \
        opam-2.3 install --locked --with-test . --download-only
    
    # Install (cached) downloaded opam dependencies
    # The download cache is mounted readonly and shared, multiple container bui=
    lds can proceed in parallel.
    # The dune cache is mounted RW.
    # Multiple concurrent builds will use the same cache, but dune must already=
     be able to cope with this
    # A cache id is used, so that different distros would have different cache =
    folders (it is unlikely that dune caches would be sharable across distros)
    RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.opam/download-cache,readonl=
    y,sharing=3Dshared,uid=3D1000,gid=3D1000 \
        --mount=3Dtype=3Dcache,target=3D/home/opam/.cache/dune,sharing=3Dshared=
    ,uid=3D1000,gid=3D1000 \
        opam-2.3 install --locked --with-test . --deps-only
    
    # Copy actual application source code
    COPY [ ".", "." ]
    
    # Build and install application code, using dune cache.
    RUN --mount=3Dtype=3Dcache,target=3D/home/opam/.cache/dune,sharing=3Dshared=
    ,uid=3D1000,gid=3D1000 \
        opam-2.3 install --locked --with-test .
    

    It avoids some common pitfalls:

    • disable cleanup of APT downloaded packages (otherwise caching is ineffe= ctive)
    • enables the opam download cache too which is stored in a non-standard l= ocation (~/.opam/download-cache instead of ~/.cache/opam= )
    • avoids EXDEV from dune cached builds during opam dependency installatio= ns by enabling dune cache copy mode
    • uses opam-2.3 explicitly, since the default opam in the Dockerhub image= s is quite old (luckily opam-2.3 is already there, just needs to be invoked= explicitly)
    • sets the default solver to 0install. This seems to be needed to speed u= p opam install even when --locked is used and no = dependency resolution is needed. Otherwise it was spending 4s checking the = solver request.
    • sets appropriate uid in cache mounts to avoid permission issues

    Caveats:

    • if you use git submodules then you have to add .git to you= r .dockerignore. Otherwise opam pinning will fail, since .git is a file referencing a git dir in a parent dir that is not mo= unted inside the docker build environment
    • maybe –dev should be used if you intend to use the container for= developing the opam application. Although in that case you might also want= to preinstall some useful tools like lsp, and ocamlform= at.

    Eventually I hope this can be simplified using Dune's new package managemen= t feature.

    opam 2.4.0~rc1

    Kate announced

    Hi everyone,

    We are happy to announce the first release candidate of opam 2.4.0.

    This is hopefully the first and last release candidate for opam 2.4, so we = invite users to test it to spot previously unnoticed bugs as we soon head t= o the stable release.

    Changes

    • :woman_scientist: Fix a regression in opam switch create <vers= ion> not working when all compilers of that version are flagged w= ith avoid-version. This would have prevented users to use comm= ands such as opam switch create 5.4.0~alpha1 (#6563).
    • :high_speed_train: Improve performance of opam update for = users of local repositories that happen to be git repositories (for example= if you've ever used opam repository add --kind local or simil= ar). In particular the new OCaml implementation of patch, does not scan tho= se VCS directories anymore, which made opam use a lot of RAM unnecessarily = (#6560).

    :open_book: You can read our blog post to read about the other more minor changes, and for= even more details you can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.0~rc1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.0~rc1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    Js_of_ocaml 6.1.0 / Wasm_of_ocaml

    Hhugo announced

    I=E2=80=99m pleased to announce the joint release of js_of_ocaml 6.1.0 and = wasm_of_ocaml.

    Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po= ssible to run pure OCaml programs in JavaScript environment like browsers a= nd Node.js.

    Wasm_of= _ocaml is a compiler from OCaml bytecode to WebAssembly. It is highly c= ompatible with Js_of_ocaml, so you can compile your programs with wasm_of_o= caml instead of js_of_ocaml and experience overall better performance.

    Most significant changes:

    • A lot of effort was spent on optimizing compilation speed and compile-t= ime memory usage. we're seeing up to 4x compilation speed improvement in so= me cases.

    See the Changelog for other changes.

    Announcing Raven: Scientific Computing for OCaml (Alpha Releas= e)

    Thibaut Mattio announced

    I'm excited to announce the alpha release of Raven, a modern scientific computing ecosystem for OCam= l.

    What is Raven?

    Raven is a collection of libraries and tools for numerical computing and ma= chine learning, including:

    • Nx: Multi-dimensional arrays with NumPy-like operations and plug= gable backends (now pure OCaml, C FFI, Metal, next CUDA, WebGPU, etc.) - ou= r equivalent of NumPy
    • Rune: Automatic differentiation and device placement, building t= oward JIT compilation - our equivalent of Jax
    • Kaun: Deep learning framework inspired by Flax/PyTorch,= built on Rune
    • Sowilo: Computer vision library with differentiable operations, = build on Rune
    • Hugin: Plotting library for data visualization - our equivalent = of matplotlib
    • Quill: Markdown-first interactive notebooks - very different fro= m Jupyter, but our answer to interactive notebooks

    The ecosystem is designed to work together seamlessly, with Nx as the found= ation, Rune providing differentiable computation, and domain-specific libra= ries building on top.

    Getting Started

    Install Raven via opam:

    opam install raven
    

    Here's a quick example showcasing automatic differentiation with Rune:

    open Rune
    
    (* Define a simple neural network lay=
    er *)
    let layer ~w=
     ~b =
    x =3D add (matmul x w) b
    
    (* Compute mean squared error loss *)
    let mse_loss ~w ~b x y =3D
      let pred =3D layer ~w ~b x in
      let diff =3D sub pred y in
      mean (mul diff diff)
    
    let result =3D
      (* Choose device - Rune.ocaml, Rune.c=
    , Rune.metal *)<=
    /span>
      let dev =3D Rune.c in
    
      (* Initialize parameters on the devic=
    e *)
      let w =3D randn dev float32 [| 3; 2 |] in
      let b =3D zeros dev float32 [| 2 |] in
      let x =3D randn dev float32 [| 10; 3 |] in
      let y =3D randn dev float32 [| 10; 2 |] in
    
      (* Compute loss and gradients<=
    span style=3D"color: #8f6f4a; font-style: italic;"> *)
      let loss, grad_w =3D value_and_grad (fun w -> mse_loss ~w ~b x=
     y) w in
      Printf.printf "Loss: %g\n" (unsafe_get [] loss);
      grad_w
    
    val result : (float, Rune.float32_elt, [ `c ]) Rune.t =3D
      [[-1.74967, 0.863766],
       [-0.140407, -0.269364],
       [0.593187, 0.0197736]]
    Loss: 2.13033
    

    For more examples and detailed documentation, visit raven-ml.dev.

    Why Raven?

    Today's machine learning ecosystem is converging on frameworks built atop M= L compilers: high-level Python APIs that build computation graphs, then JIT= compile them for performance.

    In parallel, JAX and Flax have gained popularity with th= eir functional APIs. For instance, JAX uses function transformations (grad, jit, vmap) to implements its core features.

    This is a landscape where OCaml has natural advantages. OCaml excels at bui= lding compilers, which includes ML compilers, and as a functional language,= it's a more natural fit for functional ML APIs than Python with JAX.

    Given these technical advantages, Python's dominance comes down to develope= r experience: the massive ecosystem and excellent prototyping ergonomics. W= e believe that with the right tooling, OCaml can match Python's productivit= y for prototyping and exploratory work. And the ecosystem gap doesn't have = any fundamental challenge: we "just" need to write a lot of code.

    If Raven succeeds, we believe it will offer a much more compelling alternat= ive to Python: a language that enables rapid prototyping while eliminating = the gap between exploration and production. You'll move from local developm= ent to production without switching languages, without separate teams, with= out maintaining two stacks.

    Technical Highlights: Rune's autodiff engine

    One interesting aspect of Raven is Rune's implementation of automatic diffe= rentiation using OCaml's effects system. As far as we know, this is the fir= st production-scale autodiff engine built on effects, drawing on research b= y Jesse Siga= l and earlier work by KC Sivaramakrishn= an.

    The architecture follows a modular design:

    • Pluggable backends in Nx allow implementation for different hardware
    • Rune implements an Nx backend that raises effects for all operations.
    • These effects are either caught by an effect handler (e.g. grad, jit), = or, if unhandled, executed eagerly
    • This allows for composable effects handlers (e.g. grad (grad f), jit (g= rad f), etc.)

    Technical Highlights: Quill Notebooks

    Quill reimagines interactive notebooks with a Typora­like experience. Markdown renders live as you write, sw= itching to raw markdown when you focus on a section for editing. This creat= es a natural writing experience where code blocks integrate naturally into = your document.

    The result is a distraction-free notebook environmnet, that prioritizes foc= used writing, while still providing full editor features within code blocks= (coming soon =E2=84=A2!).

    While still early, we're excited to see how the community reacts to Quill w= hen it is stable enough for daily use - we really think it has the potentia= l to offer a much better notebook experience for teaching, reading, and oth= er workflows.

    Current Status

    This is an alpha release. APIs are stabilizing but may still change. Things= will break - this is expected at this stage! If you encounter bugs, please= open an issue on GitHub; community feedback is invaluable to get to a stab= le release.

    We're currently focused on:

    • Stabilizing core APIs for the 1.0 release
    • Writing documentation and user guides
    • Supporting early users adoption (FFT, linear algebra, CUDA backend)

    Post-Alpha priorities include JIT compilation and stable Quill environment.

    Building a Community

    One bet we're taking with Raven is that it will allow a scientific and ML c= ommunity in OCaml to flourish. As of now, it's still largely a one-person p= roject. While I'm committed to its development, we really need to see the d= evelopment of a larger community for a project of this size to survive.

    If you're interested in the project, the best thing you can do is to engage= =E2=80=94whether by opening issues, reaching out, or contributing. Alongsid= e reaching a first stable release, building a community is Raven's main pri= ority from now on, so any kind of contribution or engagement will be deeply= appreciated. If there's anything I can do to make Raven more welcoming and= approachable, let me know.

    I've always believed that the best way to grow OCaml adoption is to provide= killer apps for specific use cases (just like Rails did for Ruby). Raven's= not quite there yet in terms of advantages over Python, but it can get the= re, and if that's something you'd like to contribute to, please reach out\!

    Getting Involved

    Here are immediate ways to contribute as we work toward a stable release:

    For users:

    • Try the libraries with your workflows and report issues
    • Share feedback on API design and usability
    • Help test on different platforms and configurations

    For contributors:

    • Optimize eager execution backends while we build JIT compilation
    • Add missing NumPy/Jax/Flax operations to Nx/Rune/Kaun
    • Contribute examples and documentation

    Don't hesitate to reach out if you'd like to be involved closely with the c= ore development:

    • JIT compilation
    • Stabilize Quill (many bugs to fix!)
    • New libraries

    Resources:

    Acknowledgments

    I'd like to thank our early contributors and testers who have helped shape = Raven:

    • @axrwl
    • @gabyfle
    • @hesterjeng
    • @ghennequin
    • @kayceesrk
    • @blueavee

    Special thanks to our GitHub sponsors for their support:

    • @daemonfire300
    • @gabyfle
    • @sabine

    Your feedback, contributions and support have been invaluable in getting Ra= ven to this alpha release - thank you\!

    Supporting Raven's Development

    As Raven grows, I'm looking for sustainable ways to continue dedicating tim= e to the project. If you're an industrial user interested in using Raven fo= r your machine learning or scientific computing needs, I'd love to talk abo= ut how we can work together.

    For individuals who want to support the project, I have a GitHub Sponsors page. Any contribution, = no matter the size, is deeply appreciated and helps ensure Raven's continue= d development.

    Slipshow!

    Continuing this thread, Paul-Elliot announced

    Let's continue with a new release in this Slipshow thread. It's my ginormous pleasure to announce the opam release of:

    Slipshow v0.3.0: The return of the subslips

    As you can see, a crucial improvement is that releases are now named. Semve= r is boring, let's add a bit of fun in a serious world.

    The release name subtly suggests that subslips are back. Yes, subslips are = back! Slipshow allows your presentation to be visually organized. Subslips = are slips that are inside a slip. You can then "enter" it, go through it, a= nd exit it to go back to the original slip.

    But a gif is worth a ginormous word, so here it is:

    A demo of slipshow entering subslips

    To obtain a similar effect, using the new release, you can simply do:

    We will discuss three topics:
    
    {style=3D"display:flex" children:slip}
    ----
    # Topic 1
    
    Content of the first topic
    
    ---
    # Topic 2
    
    Content of the second topic
    
    ---
    # Topic 3
    
    Content of the third topic
    

    If you want to separate the source in multiple file, it's easy: {incl= ude src=3D"file/to/include.md"}. And did you notice that --- now act as group separators? At this point, let me just output the ch= angelog (highligting some of them):

    • Compiler
      • Fix file watching issues by vendoring a (modified) irmin-watcher= , and watching all files the presentation depends on (images, themes, …) (#113)
      • Adds a favicon to the presentation file (Slipshow now has a logo!) (#115)
      • Fix missing attributes on images (#117)
      • Fix missing mime type on images that made svg undisplayable (#120)
      • Fix detection of math inside inline attributes (#124)
      • Add --dimension to specify the dimension of the present= ation (#131)
      • Add less boring name for versions (#132)
    • Language
      • Add {include src=3D"path/to/file.md"} to include a file= in another (#114)
      • Allow pause to have a target (#118)
      • Remove the need for step to execute actions (#118)
      • Added support for subslips and slides (#118)
      • Added pause blocks (#127)
      • Use horizontal lines (---) to group blocks (#129)
      • Pass attributes to children with children: (#130)
      • Consistently remove the need for -at-unpause (#133)
    • Engine
      • Simplify table of content by removing preview (#118)
      • Fix wrong computation of location (#118, #119)
      • Improve zooming behaviour (everywhere) and performance (on chrome-ba= sed browsers…) (#121)
        • If someone has some expertise on how to improve performance on firefox,= I'm interested!
      • Add PageUp and PageDown as navigation keys, adding support for pointers= (#126)
      • Do not act when control is pressed (#126)
      • Fix wrong positioning on scaled slips (#128)
    • Credits

      Thanks to the NLNet foundation for supporting this project!

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Zd9Vc3fs; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=TvBEVvvC; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id C05C34009C for ; Tue, 15 Jul 2025 17:14:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=2ICX7yVROo6MspFnnS4H9GY0aVmv/TtK1rwSQLDuaxc=; b=Zd9Vc3fsms9i4XhiHb0P73BBj2LKQoChJOPBtNPkV1GsHK/C6SJBF5rk wh7qK6tvUyOUtyxD+SgDHbGGH3PO58HHVj+UEwdBDwgqgaUFOwKZOie0c 55dJlwd7h3yCGQGvjT0fmY5EvcWpTslCnFrsiIQG0jY/gGNaMMAVCzs0R k=; X-CSE-ConnectionGUID: YzIWj33aSQS7HL6/vyAyOg== X-CSE-MsgGUID: Mn6k3cukT56zFhHXav7G3g== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,313,1744063200"; d="scan'208,217";a="231768468" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 15 Jul 2025 19:14:56 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id E9581E0CDE; Tue, 15 Jul 2025 19:14:54 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id D2D73E0171 for ; Tue, 15 Jul 2025 19:14:50 +0200 (CEST) X-CSE-ConnectionGUID: /L0YzYNFQcGre0hKMKS8MQ== X-CSE-MsgGUID: 1vaNX4cuQiqeqnTfLTKBWQ== IronPort-SDR: 68768c88_tX1L08k7TjhyEaJHJqH/Myb7fRTXrBOacI6FJ2LMZGswohY Gruv2ddClzmaVlHgZteTVgSchODc4wdoju2RXDQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FWHQCMi3ZojyIeaIFagRWDCFsoGQFgBlozBwhJAwGEU?= =?us-ascii?q?YNPjT5kgRaBKgGPCoI8g3mBO1qBIIEQgWmBEQMuIxUBAwENLgEbBAECBAEBA?= =?us-ascii?q?wECAUOBSYIuRgIWORWLIgIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBB?= =?us-ascii?q?QEBAQIBAQIEBgECEAEBAQEBATkFSYVBBzMNgkUMRUEwdAEBAQEBAQEBAScBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgwBA?= =?us-ascii?q?heBBQEIBAYTAQErDRgUDwMQBAEGAwIEDQE1AxQBEhQGgjUzAYIhAksDBAEMB?= =?us-ascii?q?pQkm0t6fzOBAYIMAQEGgQg+AgELAgIDAQ4JJQHaC4EaSgmBMRiFbYJKGgEqS?= =?us-ascii?q?GsChEgJggCCMycPgVVEgRWCKEoHb4FQATE9CxcBAQEBgSEDGAEBCAJDCYMlg?= =?us-ascii?q?mmCERVEPhQdgUCCPoIzgQYkQ4IdhhZehm6BRCIDJjMsAVUTFwsHBVuBCAMqN?= =?us-ascii?q?DFuMh2BJ4UZhCgrT4UQgRmDVRETbQ8GgRiCKEADC209NxQbkikXKRmCWQ4LF?= =?us-ascii?q?Bk0BAwbCAECIQoBBwMJGAUbAg0BHgoIGwUFDAcDBQ8BBBcPBAYEAxMFAQEIC?= =?us-ascii?q?B0BCg0tA40MhTYIDCgGJgF0jmKOF5NYHW00B4QfgV4GDIkIgSaLZYJNg3yDV?= =?us-ascii?q?4QETYEKizsDhn+LCYYhgSYimGQIGoI2hycKU0kJglmVMiwTAwoBAoU2gX8jP?= =?us-ascii?q?G8cAgwHMxowQ4JnCRYwHA+DKIsCAxaBEgEBgkpBfYEmgXQ7hGSzOC8DQTUBA?= =?us-ascii?q?QEBBwgpAgcBCgEBAwmFRR0BAYg9ASYHBWphAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:vmXzJ6sUaTQarY+oxBPiASJn7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3Ab0/1iWjScmmS+hDVVD9z4mSODzJuNVmF/WXhBWG?= =?us-ascii?q?BAklzReWVanqzw/NBqp87?= X-Talos-MUID: =?us-ascii?q?9a23=3Aof+99QwIuO90dxLkFK1kUB4Tf3SaqP2wAWY9zZ4?= =?us-ascii?q?bgsidODV2Bzm5sBedfbZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,313,1744063200"; d="scan'208,217";a="121446773" X-MGA-submission: =?us-ascii?q?MDF0RtlyMUB91Z/1ghqFqMIxDBmHW4kfcYZAig?= =?us-ascii?q?zS2hBgTKJXkfVMSdL3qal3A/HnFkOX8ooS0F/Tz0DEzkdxoYpYRoS8d1?= =?us-ascii?q?xsXWR6eReLghOyiU2ZnHi4OqxmjLtM3sl7HLOt3pGA79TGb6L85GqgmE?= =?us-ascii?q?F10jaPsy4JSBIERbMhmP7ItA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 15 Jul 2025 19:14:49 +0200 Received: from TM.local (unknown [78.245.159.3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3A979564BC5; Tue, 15 Jul 2025 19:14:46 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1752599687; bh=PvIa4DqvNiX6chNHbPwwI3uGrR+IwTXEvCcaO6oWXL8=; h=From:To:Subject:Date:Message-ID; b=TvBEVvvCAH0Q3F4xuXlBh+NaFx1JIHlmIaGwhMtmxTiXNFQ+7eh7cuNbL5lfL8bKb EIq+plVDu4KQmLkZsE2NHIPACpZjIUha4iUCVRr14LhsjFmjQ+RoG546jMbaZsvhot c4h8IaLsm+d7ISbON6oD2AuH5OVPjyzk+oq1fdtI= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 15 Jul 2025 19:14:45 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 15 19:14:47 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.423593, queueID=55309564BC7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19352 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAwOCB0byAxNSwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KT0NhbWwgTGFu Z3VhZ2UgQ29tbWl0dGVlOiBhbiB1cGRhdGUgb24gYSBwb2xpY3kgZm9yIGNvbmZsaWN0cyBvZiBp bnRlcmVzdA0KT0NhbWwgaW50ZXJuIGZvciBDbGF1ZGl1cw0KQW4gZXhhbXBsZSBmb3IgZXZlcnkg T0NhbWwgcGFja2FnZQ0KRXNhIDAuMS4wIC0gRW5oYW5jZWQgU3VmZml4IEFycmFyeShhbmQgZnVy dGhlciBwbGFucykNClR1dG9yaWFsOiBjdXQgYW5kIHBhc3RpbmcgY29kZQ0KUUNoZWNrIDAuMjQN Ck5ldyBPZG9jLTMtR2VuZXJhdGVkIFBhY2thZ2UgRG9jdW1lbnRhdGlvbiBpcyBMaXZlIG9uIE9D YW1sLm9yZw0KTHd0LjYuMC4wfmFscGhhIChkaXJlY3Qtc3R5bGUpDQpNaXJhZ2VPUyBvbiBVbmlr cmFmdA0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk9DYW1sIExhbmd1YWdlIENvbW1p dHRlZTogYW4gdXBkYXRlIG9uIGEgcG9saWN5IGZvciBjb25mbGljdHMgb2YgaW50ZXJlc3QNCuKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtbGFuZ3VhZ2UtY29tbWl0 dGVlLWFuLXVwZGF0ZS1vbi1hLXBvbGljeS1mb3ItY29uZmxpY3RzLW9mLWludGVyZXN0LzE2OTI3 LzE+DQoNCg0Kb2N0YWNocm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2hlbiBkaXNjdXNzaW5nIHRoZSBw cm9wb3NpdGlvbiBmb3IgaW5jbHVkZSBmdW5jdG9ycywgdGhlIFtsYW5ndWFnZQ0KICBjb21taXR0 ZWVdIGZlbHQgaW4gdGhlIHJhYmJpdCBob2xlIG9mIGRpc2N1c3NpbmcgY29uZmxpY3Qgb2YNCiAg aW50ZXJlc3RzLg0KDQogIEFmdGVyIHNvbWUgZGlzY3Vzc2lvbnMsIGFzIHRoZSBjdXJyZW50IGNv bW1pdHRlZSBjaGFpciwgSSBoYXZlIGRlY2lkZWQNCiAgdG8gcHJvcG9zZSB0byBhbWVuZCB0aGUg Y29tbWl0dGVlIGRlc2NyaXB0aW9uIHdpdGggb3VyIGN1cnJlbnQNCiAgdW5kZXJzdGFuZGluZyBv ZiB0cmFuc3BhcmVuY3ktYmFzZWQgcG9saWN5IGZvciBjb25mbGljdHMgb2YgaW50ZXJlc3QNCiAg YXQgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9SRkNzL3B1bGwvNTU+IC4NCg0KICBUaGUgY29y ZSBpZGVhIGJlaGluZCB0aGF0IHBvbGljeSBpcyB0aGF0IGluIGEgc21hbGwtd29ybGQgY29tbXVu aXR5DQogIGxpa2Ugb3VycywgdHJ5aW5nIHRvIGNvbXBsZXRlbHkgYXZvaWQgY29uZmxpY3RzIHdv dWxkIGJlDQogIGNvdW50ZXItcHJvZHVjdGl2ZS4gQXQgdGhlIHNhbWUgdGltZSwgbWFraW5nIHN1 cmUgdGhhdCBhbnlvbmUgaXMgYXdhcmUNCiAgb2YgcG90ZW50aWFsIGNvbmZsaWN0cyBpcyBmYWly ZXIgZm9yIGFsbCBwYXJ0aWNpcGFudHMuDQoNCiAgVGh1cyB0aGUgY3VycmVudCBwcm9wb3NhbCwg d2hpY2ggaXMgbm90IGRlZmluaXRpdmUuIEluIHBhcnRpY3VsYXIsIGlmDQogIHdlIGhhdmUgYW55 IGNvbW1lbnRzLCB5b3UgYXJlIG1vcmUgdGhhbiB3ZWxjb21lIHRvIHBhcnRpY2lwYXRlIGluIHRo ZQ0KICBkaXNjdXNzaW9uIGluIHRoZSBSRkMgYWJvdmUuDQoNCg0KW2xhbmd1YWdlIGNvbW1pdHRl ZV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvUkZDcy9ibG9iL21hc3Rlci9Db21taXR0ZWUu bWQ+DQoNCg0KT0NhbWwgaW50ZXJuIGZvciBDbGF1ZGl1cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1pbnRlcm4t Zm9yLWNsYXVkaXVzLzE2OTM1LzE+DQoNCg0KU2hyZXlhIFBhd2Fza2FyIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8gRXZlcnlvbmUhIPCfkYvwn5GLDQoNCiAgSSBhbSBT aHJleWEgUGF3YXNrYXIsIGFuIG91dHJlYWNoeSBpbnRlcm4gd29ya2luZyBvbiB0aGUgQ2xhdWRp dXMNCiAgUHJvamVjdC4NCg0KICBBIGxpdHRsZSBsYXRlIHRvIHBvc3QgbXkgYmxvZ3MgaGVyZS4g QnV0IGhlcmUgd2UgZ28hDQoNCiAgVGhpcyBpcyBteSBbZmlyc3QgYmxvZ10uIEhlcmUgSSd2ZSB0 YWxrZWQgYWJvdXQgbXkgZXhwZXJpZW5jZSBkdXJpbmcNCiAgdGhlIGNvbnRyaWJ1dGlvbiBwaGFz ZSBhbmQgbXkgZmF2IGNvbnRyaWJ1dGlvbi4NCg0KICBBbmQgaGVyZSdzIHRoZSBbc2Vjb25kIG9u ZV0uIFRoaXMgb25lIGlzIGFsbCBhYm91dCB0aGUgam91cm5leSBhbmQgdGhlDQogIGxlYXJuaW5n cyBJIG1hZGUgd29ya2luZyB3aXRoIG9jYW1sLWdpZi4gQW5kIG9mY291cnNlLCB0aGUgYmVhdXRp ZnVsDQogIGNvdmVyIGltYWdlIGZvciBteSBzZWNvbmQgYmxvZyBpcyBidWlsdCBhbmQgY2FwdHVy ZWQgd2l0aCBDbGF1ZGl1cyENCg0KDQpbZmlyc3QgYmxvZ10NCjxodHRwczovL3Bhd2Fza2FyLXNo cmV5YS1vdXRyZWFjaHkuaGFzaG5vZGUuZGV2L291dHJlYWNoeS13ZWVrLTE+DQoNCltzZWNvbmQg b25lXQ0KPGh0dHBzOi8vcGF3YXNrYXItc2hyZXlhLW91dHJlYWNoeS5oYXNobm9kZS5kZXYvb3V0 cmVhY2h5LXdlZWstMz4NCg0KDQpBbiBleGFtcGxlIGZvciBldmVyeSBPQ2FtbCBwYWNrYWdlDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2FuLWV4YW1wbGUtZm9yLWV2ZXJ5LW9j YW1sLXBhY2thZ2UvMTY5NTMvMT4NCg0KDQpKb2huIFdoaXRpbmd0b24gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICAoT25lIGRheSwgbWF5YmUpLg0KDQogIFdvdWxkbid0IGl0IGJl IG5pY2UgaWYgZXZlcnkgT0NhbWwgcGFja2FnZSBoYWQgZXhhbXBsZXMgYXMgd2VsbCBhcw0KICBk b2N1bWVudGF0aW9uPyBBcyBwYXJ0IG9mIGEgcGlsb3QgcHJvZ3JhbW1lIGZ1bmRlZCBieSB0aGUg T0NhbWwNCiAgU29mdHdhcmUgRm91bmRhdGlvbiwgSSd2ZSBiZWVuIGxvb2tpbmcgaW50byB0aGUg ZmVhc2liaWxpdHkgb2Ygc3VjaCBhbg0KICBpZGVhLg0KDQogIFdoYXQgZG8gd2UgbWVhbiBieSBl eGFtcGxlcywgYW5kIHdoYXQgZGlzdGluZ3Vpc2hlcyB0aGVtIGZyb20NCiAgZG9jdW1lbnRhdGlv biBhbmQgZnJvbSB0ZXN0cz8NCg0KICAqV2hhdCBhbiBleGFtcGxlIGlzKg0KDQogIOKAoiBFeGFt cGxlcyBhcmUgaW5kZXBlbmRlbnQgb2YgdGhlIGxpYnJhcnkgdGhleSBleHBsYWluLiBUaGV5IGRv IG5vdA0KICAgIHJlcXVpcmUgdGhlIHNvdXJjZSBvZiB0aGUgbGlicmFyeSwgb3IgYW55IGJ1aWx0 IGFydGVmYWN0cy4NCg0KICDigKIgRXhhbXBsZXMgYXJlIHNlbGYtY29udGFpbmVkLiBUaGV5IHJl cXVpcmUgb25seSBPQ2FtbCwgYSBidWlsZA0KICAgIHN5c3RlbSwgYW5kIHRoZSBsaWJyYXJ5IGlu IHF1ZXN0aW9uIHRvIGJlIGluc3RhbGxlZC4NCg0KICDigKIgRXhhbXBsZXMgYXJlIGVhc3kgdG8g YnVpbGQuIFRoZXkgYXJlIGJ1aWx0IGluIGEgc2luZ2xlIGNvbW1hbmQsIGFuZA0KICAgIGRvIG5v dCBkZXBlbmQgb24gZW52aXJvbm1lbnQuDQoNCiAg4oCiIEV4YW1wbGVzIGFyZSBlYXN5IHRvIGVk aXQgYW5kIHBsYXkgd2l0aC4gVGhleSBhcmUgb2YgYSByZWFzb25hYmxlDQogICAgc2l6ZSwgc3Bs aXQgaW50byBjaHVua3MsIGFuZCBhcmUgY29tbWVudGVkIGxpYmVyYWxseS4NCg0KICDigKIgRXhh bXBsZXMgdXNlIHN0YW5kYXJkIHRlY2huaXF1ZXMuIEJvdGggaW4gaG93IHRoZSBsaWJyYXJ5IGlz IHVzZWQsDQogICAgYW5kIGluIGhvdyB0aGUgT0NhbWwgY29kZSBpcyB3cml0dGVuLg0KDQogIOKA oiBFeGFtcGxlcyBhcmUgb3BlbiBsaWNlbnNlZC4gVXNlcnMgc2hvdWxkIGJlIGFibGUgdG8gY29w eSAmIHBhc3RlDQogICAgY29kZSBmcm9tIHRoZSBleGFtcGxlcyB3aXRob3V0IGNhcmUuDQoNCiAg KldoYXQgYW4gZXhhbXBsZSBpcyBub3QqDQoNCiAg4oCiIEV4YW1wbGVzIGFyZSBub3QgdGVzdHMu IFVubGlrZSB0ZXN0cywgZXhhbXBsZXMgZG8gbm90IGNhcmUgYWJvdXQNCiAgICBjb2RlIGNvdmVy YWdlLCBjYW5ub3QgYmUgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQsIGFuZCBuZWVkIG5vdA0KICAg IG5lY2Vzc2FyaWx5IGJlIHRpZ2h0bHkgaW50ZWdyYXRlZCBpbnRvIHRoZSBzb3VyY2UgcmVwb3Np dG9yeS4NCg0KICDigKIgRXhhbXBsZXMgYXJlIG5vdCBpbiB0aGUgQVBJIGRvY3VtZW50YXRpb24u IEV4YW1wbGVzIG5lZWQgdG8gYmUNCiAgICBidWlsZGFibGUsIGFuZCBzZXBhcmF0ZSBmcm9tIHRo ZSBBUEkgZG9jdW1lbnRhdGlvbi4gVGhpcyBpcyBub3QgdG8NCiAgICBzYXkgdGhhdCB0aGV5IG1p Z2h0IHRoZW4gbm90IGJlIGF1dG9tYXRpY2FsbHkgaW1wb3J0ZWQgaW50byB0aGUgQVBJDQogICAg ZG9jdW1lbnRhdGlvbiBvbmUgZGF5Lg0KDQogIOKAoiBFeGFtcGxlcyBuZWVkIG5vdCBiZSBjb21w cmVoZW5zaXZlLiBCZXR0ZXIgYSBzbWFsbCBleGFtcGxlIHRoYW4gbm8NCiAgICBleGFtcGxlIGF0 IGFsbC4gU28gbG9uZyBhcyB0aGUgYmFzaWNzIG9mIGFuIEFQSSBhcmUgaW50cm9kdWNlZCwgdGhl DQogICAgY2xpZmYgaXMgY2xpbWJlZCBhbmQgdGhlIEFQSSBkb2N1bWVudGF0aW9uIHNob3VsZCB0 aGVyZWFmdGVyDQogICAgc3VmZmljZS4NCg0KICAqUGlsb3QgcHJvamVjdCBwbGFuKg0KDQogIFRo ZSBwbGFuIHdhcyB0byBidWlsZCBzbWFsbCBleGFtcGxlcyBmb3IgYWJvdXQgdHdlbnR5IHBhY2th Z2VzLCBwdXQNCiAgdG9nZXRoZXIgYSBwbGFjZSBmb3IgdGhlbSB0byBsaXZlLCBhbmQgdGhlbiB0 cnkgdG8gdXBzdHJlYW0gdGhlbS4gVGhlDQogIGV4YW1wbGVzJyBob21lLCBwcmlvciB0byB1cHN0 cmVhbWluZywgaXMgdGhlIE9DYW1sIE51cnNlcnk6DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9q b2hud2hpdGluZ3Rvbi9vY2FtbC1udXJzZXJ5Pg0KDQogIE1vc3Qgb2YgdGhlc2UgbGl0dGxlIGV4 YW1wbGVzIGhhdmUgYmVlbiBzdWJtaXR0ZWQgdG8gdXBzdHJlYW0gLSB5b3UNCiAgbWF5IGhhdmUg bm90aWNlZCB0aGUgcHVsbCByZXF1ZXN0cyBvbiB5b3VyIHJlcG9zaXRvcmllcyAtIHdpdGggdmFy eWluZw0KICBkZWdyZWVzIG9mIGludGVyZXN0IC8gc3VjY2Vzcy4NCg0KICAqT3BpbmlvbnMgcmVx dWVzdGVkLCBwbGVhc2UhKg0KDQogIEFyZSB5b3UgaW50ZXJlc3RlZCBpbiBhZGRpbmcgZXhhbXBs ZXMgZm9yIHlvdXIgcGFja2FnZSBvciBzb21lb25lDQogIGVsc2UncyBwYWNrYWdlPyBUbyB0aGUg bnVyc2VyeSBvciB0byB1cHN0cmVhbT8gV2hhdCBkbyB5b3UgdGhpbmsgb2YNCiAgdGhlIGRlZmlu aXRpb24gb2YgZXhhbXBsZSBJIGdhdmUgYWJvdmU/IERvIHlvdSB0aGluayBleGFtcGxlcyBzaG91 bGQNCiAgc2l0IGluIGEgc2VwYXJhdGUgc3BhY2UgbGlrZSB0aGUgbnVyc2VyeSBvciBiZSB1cHN0 cmVhbWVkIG9yIGJvdGg/DQogIE9waW5pb25zIHJlcXVlc3RlZCBvbiBhbGwgdGhvc2UgdG9waWNz LCBwbGVhc2UhDQoNCg0KRXNhIDAuMS4wIC0gRW5oYW5jZWQgU3VmZml4IEFycmFyeShhbmQgZnVy dGhlciBwbGFucykNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWVzYS0w LTEtMC1lbmhhbmNlZC1zdWZmaXgtYXJyYXJ5LWFuZC1mdXJ0aGVyLXBsYW5zLzE2OTU2LzE+DQoN Cg0KR2VvZmZyZXkgQm9yb3VnaCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IEkganVzdCBwb3J0ZWQgdGhlIG9yaWdpbmFsIEMrKyBFbmhhbmNlZCBTdWZmaXggVHJlZSB0byBw dXJlIE9DYW1sLCB5b3UNCiAgY2FuIGZpbmQgaXQgaGVyZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9n Ym9yb3VnaC9lc2E+Lg0KDQogIEl0J3MgdGhlIGZpcnN0IHRpbWUgSSBoYXZlIGF0dGVtcHRlZCBh dCB3cml0aW5nIGxvdyBhbGxvY2F0aW9uL25vDQogIGFsbG9jYXRpb24gY29kZSBpbiBPQ2FtbCBh bmQgSSBtdXN0IHNheSB0aGlzIGhhcyBiZWVuIGEgZ3JlYXQgbGVhcm5pbmcNCiAgZXhwZXJpZW5j ZSBmb3IgdGhlIHBhc3QgZmV3IHdlZWtzLCBhbmQgaXQgbWFrZXMgbWUgYXBwcmVjaWF0ZSBtb3Jl IGhvdw0KICBPQ2FtbCBpcyBhYmxlIHRvIHByb3ZpZGUgbG93IGxldmVsIHR1bmluZ3MgdGhhdCBt YXRjaCBvdGhlciBsb3cgbGV2ZWwNCiAgbGFuZ3VhZ2VzLCB3aGlsc3Qgc3RheWluZyBmdW5jdGlv bmFsIGF0IHRoZSBzYW1lIHRpbWUuDQoNCiAgT25lIG9mIG15IHBlcnNvbmFsIGdvYWxzKGFsc28g b3VyIGNvbXBhbnkgdGVjaCBhbGlnbm1lbnQpIGlzIHRvIGJyaW5nDQogIE9DYW1sIHVwIHRvIHRo ZSBzYW1lIGxldmVsIG9mIGNvbnZlbmllbmNlIGFzICpQeXRob24qIGluIHNvbWUgYXJlYXMgb2YN CiAgQUkvTExNLiBXZSBhcmUgaW5zcGlyZWQgYnkgZXhpc3RpbmcgZWZmb3J0cyBpbiB0aGUgT0Nh bWwgY29tbXVuaXR5IHRvDQogIHRha2Ugb24gdGhpcyBjaGFsbGVuZ2UgYW5kIG91ciBwbGFuIG9m IGF0dGFjayB3aWxsIGJlIG1vcmUgb3IgbGVzcw0KICBzaW1pbGFyLiBDdXJyZW50bHkgd2UgYXJl IHRhY2tsaW5nIHRoZSBmb2xsb3dpbmcgcHJvYmxlbXM6DQoNCiAg4oCiIFBvcnRpbmcgR29vZ2xl IFNlbnRlbmNlcGllY2UoaW4gcHJvZ3Jlc3MpOiBFbmhhbmNlZCBTdWZmaXggQXJyYXJ5DQogICAg ZG9uZSBhcyBhIGRlcGVuZGVuY3ksIERvdWJsZS1BcnJheSBUcmllIGFuZCBmZXcgb3RoZXIgdG9r ZW5pemVyDQogICAgdXRpbGl0aWVzIGluIHByb2dyZXNzLg0KICDigKIgUG9ydGluZyBIdWdnaW5n IEZhY2UgVG9rZW5pemVycyhpbiBwcm9ncmVzcyk6IFBlbmRpbmcgdGhlIGNvbXBsZXRpb24NCiAg ICBvZiBzZW50ZW5jZXBpZWNlIHRob3VnaCBsZXNzIGRlcGVuZGVudCBjb2RlcyBhcmUgYmVpbmcg Y29udmVydGVkLg0KDQogIFRoZSBlbmQgcHJvZHVjdCBwcm9iYWJseSBjb250YWlucyBhIG1peHR1 cmUgb2YgcHVyZSBPQ2FtbCBhcyB3ZWxsIGFzIGENCiAgZmFpciBhbW91bnQgb2YgRkZJIGNvZGUu IEkgZHJlYWQgdG8gdGhpbmsgaG93IHRoZXkgYXJlIGdvaW5nIHRvIGxvb2sNCiAgbGlrZSBvYnZp b3VzbHkgdGhlcmUgd2lsbCBiZSBhIHRvbiBvZiB2ZXJiYXRpbSB0cmFuc2xhdGlvbnMgdG8gT0Nh bWwsDQogIGJ1dCBJIGhhdmUgbGl0dGxlIGRvdWJ0IGFib3V0IG1hdGNoaW5nIEMrKy9SdXN0IHBl cmZvcm1hbmNlIG1vc3Qgb2YNCiAgdGhlIHRpbWUuIFdlJ2xsIGFsc28gbG9vayBpbnRvIHRoZSB1 cGNvbWluZyBPeENhbWwgZXh0ZW5zaW9uIHRvIHNlZSBpZg0KICBtb3JlIHBlcmZvcm1hbmNlIGNh biBiZSBla2VkIG91dC4NCg0KICBIb3BlZnVsbHkgd2Ugd2lsbCBoYXZlIHNvbWV0aGluZyB0byBz aG93IGZvciB0aGUgY29tbXVuaXR5IGluIHRoZSBuZWFyDQogIGZ1dHVyZS4NCg0KDQpUdXRvcmlh bDogY3V0IGFuZCBwYXN0aW5nIGNvZGUNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdHV0b3JpYWwt Y3V0LWFuZC1wYXN0aW5nLWNvZGUvMTY5NTcvMT4NCg0KDQpEYW5pZWwgQsO8bnpsaSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgYWxsLA0KDQogIEkgc29tZXRpbWVzIG5vdGljZSB0 aGF0IG15IGNvZGUgZ2V0cyBjdXQgYW5kIHBhc3RlZCBvciB2ZW5kb3JlZA0KICBsaXR0ZXJhbGx5 IG9yIG1vZGlmaWVkIGluIG90aGVyIHByb2plY3RzLiAqVGhhdCdzIHZlcnkgZmluZSosIGl0J3Mg dGhlDQogIHJlYXNvbiB3aHkgSSBwdWJsaXNoIGFsbW9zdCBhbGwgbXkgY29kZSB1bmRlciBbYSBs aWNlbnNlXSB0aGF0IG1ha2VzDQogIHRoYXQgZXh0cmVtZWx5IHNpbXBsZS4NCg0KICBZZXQgcGVv cGxlIG9mdGVuIGZhaWwgdG8gYWJpZGUgYnkgdGhlIHNpbXBsZSwgc2luZ2xlIHBocmFzZSByZXF1 ZXN0IG9mDQogIHRoZSBsaWNlbnNlIHdoaWNoIGlzIChlbXBoYXNpcyBhZGRlZCk6DQoNCiAgICAg ICAgQ29weXJpZ2h0IChjKSBbeWVhcl0gW2Z1bGxuYW1lXQ0KDQogICAgICAgIFBlcm1pc3Npb24g dG8gdXNlLCBjb3B5LCBtb2RpZnksIGFuZC9vciBkaXN0cmlidXRlIHRoaXMNCiAgICAgICAgc29m dHdhcmUgZm9yIGFueSBwdXJwb3NlIHdpdGggb3Igd2l0aG91dCBmZWUgaXMgaGVyZWJ5DQogICAg ICAgIGdyYW50ZWQsICpwcm92aWRlZCB0aGF0IHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFu ZA0KICAgICAgICB0aGlzIHBlcm1pc3Npb24gbm90aWNlIGFwcGVhciBpbiBhbGwgY29waWVzKi4N Cg0KICBJbiBhbGwgbXkgc291cmNlIGZpbGVzIHlvdSBjYW4gZmluZCBhIGhlYWRlciB0aGF0IGhh cyB0aGUgY29weXJpZ2h0DQogIG5vdGljZSBhbmQgYSBTUERYIGxpY2Vuc2UgaWRlbnRpZmllciBb YXMgcGVyIGNvbnZlbnRpb25dDQogIChbZXhhbXBsZV0pLiBTbyBJIGtpbmRseSBhc2sgeW91IHdo ZW4geW91IHJldXNlIG15IGNvZGU6DQoNCiAgMS4gSWYgeW91IGNvcHkgdGhlIHdob2xlIGZpbGUg dG8gcmV0YWluIHRoYXQgY29weXJpZ2h0DQogICAgIGhlYWRlci4gUmVmb3JtYXR0aW5nIHRoZSBo ZWFkZXIgaXMgb2suIEFsc28gaWYgeW91IGVuZCB1cCByZXdvcmtpbmcNCiAgICAgdGhlIGNvZGUg c2lnbmlmaWNhbnRseSBpbmRpY2F0aW5nOg0KICAgICDilIzilIDilIDilIDilIANCiAgICAg4pSC ICgqIFBhcnQgb2YgdGhpcyBjb2RlIGlzIGJhc2VkIG9uIHRoZSB4eHggcHJvamVjdCBhbmQNCiAg ICAg4pSCICAgIENvcHlyaWdodCAoYykgMjAyMCBUaGUgeHh4IHByb2dyYW1tZXJzLg0KICAgICDi lIIgICAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IElTQyAqKQ0KICAgICDilJTilIDilIDilIDi lIANCiAgICAgd29ya3MgZm9yIG1lLg0KDQogIDIuIElmIHlvdSBjb3B5IHNheSBhIHNpbmdsZSBm dW5jdGlvbiBwbGVhc2UgYWRkIGEgY29tbWVudCB3aXRoIHRoZQ0KICAgICBjb3B5cmlnaHQgbm90 aWNlIGFuZCB0aGUgU1BEWCBsaWNlbnNlIGlkZW50aWZpZXIuIEZvciBleGFtcGxlOg0KICAgICDi lIzilIDilIDilIDilIANCiAgICAg4pSCICgqIFRoaXMgY29kZSBpcyBDb3B5cmlnaHQgKGMpIDIw MTEgVGhlIHh4eCBwcm9ncmFtbWVycy4NCiAgICAg4pSCICAgICBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogSVNDICopDQogICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogIDMuIElmIHlvdSBlbmQgdXAg dmVuZG9yaW5nIGEgc2lnbmlmaWNhbnQgcGFydCBvZiB0aGUgY29kZSB3aXRob3V0DQogICAgIG1v ZGlmeWluZyBpdCAodGhhdCBpcyBpZiB0ZWNobmljYWxseSB5b3UgZGVwZW5kIG9uIHRoZSBwcm9q ZWN0KQ0KICAgICBwbGVhc2UgbWVudGlvbiBpdCBpbiB5b3VyIHRvcGxldmVsIGBMSUNFTlNFJyBm aWxlLg0KDQogIE5vdyBsZXQncyBiZSBjbGVhciwgSSB3aWxsIG5vdCBjYWxsIHRoZSBwb2xpY2Ug aWYgZG9uJ3QgZG8gdGhpcyBvciBpZg0KICB5b3UgcHJldGVuZCB0byBoYXZlIHdyaXR0ZW4gY29k ZSB5b3UgZGlkIG5vdC4gUG9saWNlIGFuZCBsYXd5ZXJzIGFyZQ0KICBhdCB0aGUgdG9wIG9mIHRo ZSBsaXN0IG9mIHBlb3BsZSBJIGRvIG5vdCB3YW50IHRvIGRlYWwgd2l0aCBvciBpbmZsaWN0DQog IG9udG8gb3RoZXIgcGVvcGxlLg0KDQogIFdoYXQgSSdtIHNlZWtpbmcgaGVyZSBpcyBhdHRyaWJ1 dGlvbi4gTm90IGZvciBoYXZpbmcgbXkgbmFtZSBpbiB5b3VyDQogIHByb2plY3QsIEkgY291bGRu J3QgY2FyZSBsZXNzIGFuZCB0aGUgY29weXJpZ2h0cyBvZiBteSBwcm9qZWN0cyBhcmUNCiAgY29u dHJpYnV0b3IgYmFzZWQgYW55d2F5cy4gVGhpcyBpcyBzbyB0aGF0IHRoZSBjb2RlIGNvbnRyaWJ1 dGlvbiBjYW4NCiAgYmUgdHJhY2VkIGZvciB0aGUgbGl0dGxlIHRpbWVzIEkgbWFuYWdlIHRvIGNv bnZpbmNlIHBlb3BsZSB0byBwYXkgbWUNCiAgZm9yIG1ha2luZyB0aGVtIHJhdGhlciB0aGFuIGlu dmVzdGluZyBteSBvd24gbW9uZXkgaW4gdGhlc2UgcHJvamVjdHMuDQoNCiAgQnR3LiB0aGlzIHNo b3VsZCBub3Qgb25seSBiZSBhYm91dCBteSBjb2RlLiBUaGlzIGlzIGFib3V0IGFueSBvcGVuDQog IHNvdXJjZSBjb2RlIHlvdSBjdXQgYW5kIHBhc3RlIGZyb20gKGFuZCBJIGFsc28gW2RvIHRoaXNd KS4NCg0KICBBaCBhbmQgeWVzLCBwbGVhc2UsIGlmIHlvdSBhcmUgdXNpbmcgdGhlbSwgYWxzbyB0 ZWFjaCB5b3VyIExMTXMgdG8gZG8NCiAgdGhhdC4gSWYgdGhleSBhcmUgYWJsZSB0byB3cml0ZSBP Q2FtbCBjb2RlIGl0J3MgYWxzbyB0aGFua3MgdG8gbWUgOuKAkykNCg0KICBUaGFuayBmb3IgeW91 ciBhdHRlbnRpb24uDQoNCiAgRGFuaWVsDQoNCg0KW2EgbGljZW5zZV0gPGh0dHBzOi8vY2hvb3Nl YWxpY2Vuc2UuY29tL2xpY2Vuc2VzL2lzYy8+DQoNClthcyBwZXIgY29udmVudGlvbl0gPGh0dHBz Oi8vc3BkeC5kZXYvbGVhcm4vaGFuZGxpbmctbGljZW5zZS1pbmZvLyNob3c+DQoNCltleGFtcGxl XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS9qc29udC9ibG9iLzUyNzgwODIwMzU1NGZj ZjliOTNlYjJjYTc5ZWQ1OTY5MzcyMzMxNDkvc3JjL2pzb250X2Jhc2UubWwjTDEtTDQ+DQoNCltk byB0aGlzXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9kYnVlbnpsaS90eXBlZ2lzdC9ibG9iLzYyNzk4 ZWRmMjA2ODhkOGJmMDIxOTI4ZDBlYjNiMWEwNTgwZGE1ODMvc3JjL3R5cGVnaXN0Lm1sI0w0MC1M NDg+DQoNCg0KUUNoZWNrIDAuMjQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXFjaGVjay0wLTI0 LzE2MTk4LzM+DQoNCg0KSmFuIE1pZHRnYWFyZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQog IFFDaGVjayAwLjI2IGlzIG5vdyBhdmFpbGFibGUgZnJvbSB5b3VyIGZhdm9yaXRlIG9wYW0gcmVw b3NpdG9yeSENCiAgOnRhZGE6DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNr L3JlbGVhc2VzPg0KDQogIFRoZSAwLjI2IHJlbGVhc2UgYWRqdXN0cyB0aGUgYFFDaGVjaycgYW5k IGBRQ2hlY2syJyBgZmxvYXQnIGdlbmVyYXRvcg0KICBkaXN0cmlidXRpb25zLCB3aGljaCB3YXMg cHJldmlvdXNseSBjb25maW5lZCB0byBhIHN1YnNldCBvZiBmbG9hdGluZw0KICBwb2ludCBudW1i ZXJzLiBVc2VycyBtYXkgZXhwZXJpZW5jZSB0aGF0IGV4aXN0aW5nIHRlc3RzIGtub3duIHRvIHBh c3MNCiAgc3RhcnQgdG8gZmFpbCB3aXRoIHRoZSBuZXcgYW5kIGJyb2FkZXIgZGlzdHJpYnV0aW9u LiBJbiBhZGRpdGlvbiB0aGUNCiAgcmVsZWFzZSBjb250YWlucyBhIG51bWJlciBvZiBvdGhlciBm aXhlcyBhbmQgZG9jdW1lbnRhdGlvbg0KICBpbXByb3ZlbWVudHMsIGluY2wuIHRoZSByZW1vdmFs IG9mIGFuIGFubm95aW5nIG5ld2xpbmUgd2hpY2ggd291bGQNCiAgY2F1c2UgdGhlIHRlc3Qgc3Vp dGUgdG8gZmFpbCBvbiBPQ2FtbCA1LjQuMDoNCg0KICDigKIgQWxpZ24gcHJpbnRlZCBgY29sbGVj dCcgc3RhdGlzdGljcyBhbmQgYWxzbyBhZGQgYSBwZXJjZW50YWdlDQogIOKAoiBGaXggYFFDaGVj a3ssMn0uR2VuLmZsb2F0JyBnZW5lcmF0b3Igd2hpY2ggd291bGQgb25seSBnZW5lcmF0ZQ0KICAg IG51bWJlcnMgd2l0aCBhbiBleHBvbmVudCBiZXR3ZWVuIDJeey0yMX0gYW5kIDJeezIyfQ0KICDi gKIgRWxhYm9yYXRlIG9uIHRoZSBgUUNoZWNrfi9+UUNoZWNrMicgc2l0dWF0aW9uIGluIHRoZSBS RUFETUUNCiAg4oCiIEFkZCBhIG1pc3NpbmcgYGRlc2NyaXB0aW9uJyBmaWVsZCB0byB0aGUgKi5v cGFtIGZpbGVzDQogIOKAoiBEb2N1bWVudCBgU2hyaW5rJyBpbnZhcmlhbnRzIGluIHRoZSBgUUNo ZWNrJyBtb2R1bGUNCiAg4oCiIEZpeCBhIGBxY2hlY2stb3VuaXQnIHRlc3Qgc3VpdGUgZmFpbHVy ZSBvbiBPQ2FtbCA1LjQsIHJlbW92aW5nIGENCiAgICBuZWVkbGVzcyBleHRyYSBuZXdsaW5lDQog IOKAoiBGaXggYFFDaGVjazInIGBmbG9hdF9yYW5nZScgb3BlcmF0b3Igd2hpY2ggd291bGQgZmFp bCBvbiBuZWdhdGl2ZQ0KICAgIGJvdW5kcw0KICDigKIgRml4IGBRQ0hFQ0tfTVNHX0lOVEVSVkFM JyBub3QgYmVpbmcgYXBwbGllZCB0byB0aGUgZmlyc3QgaW4tcHJvZ3Jlc3MNCiAgICBtZXNzYWdl DQoNCiAgVGhhbmtzIHRvIEBQYXQtTGFmb24sIEBybW9uYXQsIGFuZCBAa2l0LXR5LWthdGUgZm9y IGNvbnRyaWJ1dGluZyENCiAgOnByYXk6DQoNCg0KTmV3IE9kb2MtMy1HZW5lcmF0ZWQgUGFja2Fn ZSBEb2N1bWVudGF0aW9uIGlzIExpdmUgb24gT0NhbWwub3JnDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25ldy1vZG9jLTMt Z2VuZXJhdGVkLXBhY2thZ2UtZG9jdW1lbnRhdGlvbi1pcy1saXZlLW9uLW9jYW1sLW9yZy8xNjk2 Ny8xPg0KDQoNClNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEhpIGV2ZXJ5b25lLA0KDQogIEkganVzdCBtZXJnZWQgdGhlIHBhdGNoIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb2NhbWwub3JnL3B1bGwvMzEyND4NCiAgd2hpY2ggZW5hYmxlcyB0aGUg bmV3IGFuZCBpbXByb3ZlZCBwYWNrYWdlIGRvY3VtZW50YXRpb24gYnVpbHQgd2l0aA0KICBvZG9j IDMgb24gT0NhbWwub3JnLiBUaGFua3MgQG10ZWx2ZXJzLCBAam9ubHVkbGFtLCBAcGFuZ2xlc2Qg Zm9yDQogIHB1dHRpbmcgaW4gdGhlIGVmZm9ydCB0byBtYWtlIHRoaXMgaGFwcGVuIGZvciBPQ2Ft bC5vcmchDQoNCiAgVGhhbmtzIHRvIGV2ZXJ5b25lIHdobyBnYXZlIHVzIGZlZWRiYWNrIHdoZW4g d2UgcmFuIHRoaXMgb24gdGhlDQogIHN0YWdpbmcgZW52aXJvbm1lbnQNCiAgKDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvaGVscC10ZXN0LXRoZS1uZXctb2RvYy0zLXBvd2VyZWQtcGFja2Fn ZS1kb2N1bWVudGF0aW9uLXBhZ2VzLzE2Nzk1LzY+KSwNCiAgd2UncmUgcmVhc29uYWJseSBjb25m aWRlbnQgdGhhdCB0aGluZ3Mgd29yayB3ZWxsIGVub3VnaCB0byBhcHBseSB0aGlzDQogIHVwZ3Jh ZGUuIDpvcmFuZ2VfaGVhcnQ6DQoNCiAgSW4gY2FzZSB5b3Ugc2VlIHNvbWV0aGluZyB0aGF0IGNv dWxkIGJlIGltcHJvdmVkLCBwbGVhc2UgbGV0IHVzIGtub3cNCiAgKGJ5IHJlcGx5aW5nIGhlcmUg b3IgYnkgb3BlbmluZyBhbiBpc3N1ZSBvbg0KICA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29j YW1sLm9yZz4pIQ0KDQogIENoZWVycyBTYWJpbmUNCg0KDQpMd3QuNi4wLjB+YWxwaGEgKGRpcmVj dC1zdHlsZSkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWx3dC02LTAtMC1hbHBoYS1kaXJl Y3Qtc3R5bGUvMTY5NzIvMT4NCg0KDQpSYXBoYcOrbCBQcm91c3QgYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBJdCBpcyBhIGdyZWF0IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSByZWxl YXNlIG9mIHRoZSBmaXJzdCBhbHBoYQ0KICByZWxlYXNlIG9mIEx3dCA2LiBUaGlzIG1ham9yIHZl cnNpb24gYnVtcCBicmluZ3MgdHdvIG1ham9yIGNoYW5nZXMgdG8NCiAgTHd0Og0KDQogIOKAoiBV c2luZyBMd3QgaW4gZGlyZWN0LXN0eWxlISAoQmlnIHRoYW5rcyB0byBAYy1jdWJlICEhKQ0KICDi gKIgVXNpbmcgbXVsdGlwbGUgTHd0IHNjaGVkdWxlcnMgcnVubmluZyBpbiBzZXBhcmF0ZSBkb21h aW5zIQ0KDQoNCkRpcmVjdC1zdHlsZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgVGhpcyBjb250cmlidXRpb24gZnJvbSBAYy1jdWJlIGlzIGF2YWlsYWJsZSBpbiBh bHBoYTAwLiBJdCBjb21lcyBpbg0KICB0aGUgZm9ybSBvZiBhbiBgbHd0X2RpcmVjdCcgcGFja2Fn ZSB3aGljaCBwcm92aWRlIGFuIGBMd3RfZGlyZWN0Jw0KICBtb2R1bGUgd2hpY2ggcHJvdmlkZSB0 d28gY29yZSBmdW5jdGlvbnM6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiB2YWwgcnVuIDog KHVuaXQgLT4gJ2EpIC0+ICdhIEx3dC50DQogIOKUgiB2YWwgYXdhaXQgOiAnYSBMd3QudCAtPiAn YQ0KICDilJTilIDilIDilIDilIANCg0KICBhbmQgYWxsb3dzIHlvdSB0byB3cml0ZSBjb2RlIHN1 Y2ggYXMNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHJ1biAoZnVuICgpIC0+DQogIOKUgiAg IGxldCBjb250aW51ZSA9IHJlZiB0cnVlIGluDQogIOKUgiAgIHdoaWxlICFjb250aW51ZSBkbw0K ICDilIIgICAgIG1hdGNoIGF3YWl0IEBAIEx3dF9pby5yZWFkX2xpbmUgaWMgd2l0aA0KICDilIIg ICAgIHwgbGluZSAtPiBhd2FpdCBAQCBMd3RfaW8ud3JpdGVfbGluZSBvYyBsaW5lDQogIOKUgiAg ICAgfCBleGNlcHRpb24gRW5kX29mX2ZpbGUgLT4gY29udGludWUgOj0gZmFsc2UNCiAg4pSCICAg ZG9uZSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlcmUgYXJlIGEgZmV3IG1vcmUgZnVuY3Rp b25zLiBBbGwgb2Ygd2hpY2ggaXMgZG9jdW1lbnRlZCBpbg0KICBbbHd0X2RpcmVjdC5tbGldLg0K DQoNCltsd3RfZGlyZWN0Lm1saV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9sd3QvYmxv Yi82LjAuMC1hbHBoYTAwL3NyYy9kaXJlY3QvbHd0X2RpcmVjdC5tbGk+DQoNCg0KTXVsdGktc2No ZWR1bGVyDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICBUaGlzIGFkZGl0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gYWxwaGEwMCBidXQgc2hvdWxkIGJl IGFkZGVkIHRvDQogIGFscGhhMDEgc29vbi4gSXQgYWxsb3dzIHRvIGNhbGwgYEx3dF9tYWluLnJ1 bicgaW4gZGlmZmVyZW50IGRvbWFpbnMNCiAgYW5kIGJlbmVmaXQgZnJvbSBhY3R1YWwgcGFyYWxs ZWxpc20uIChTbmVhayBwZWVrIGluIFt0aGlzIHB1bGwNCiAgcmVxdWVzdF0pDQoNCg0KW3RoaXMg cHVsbCByZXF1ZXN0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0L3B1bGwvMTA1OD4N Cg0KDQpJbnN0YWxsYXRpb24NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIGBsd3QuNi4wLjB+YWxwaGEwMCcgYW5kIGBsd3RfZGlyZWN0LjYuMC4wfmFscGhhMDAnIHdp bGwgc29vbiBiZQ0KICByZWxlYXNlZCBvbiBvcGFtIChbUFIgb24gb3BhbS1yZXBvXS4gSSdsbCBw dWJsaXNoIHNvbWUgbW9yZSBhbHBoYXMgYXMNCiAgdGhlIHdvcmsgcHJvZ3Jlc3NlcywgYW5kIGFu bm91bmNlIHRoZSByZWxlYXNlcyBvbiB0aGlzIHRocmVhZC4NCg0KICBZb3UgY2FuIGFsc28gcGlu IHRoZSBwYWNrYWdlcyB0byB0aGUgbHd0LTYgYnJhbmNoIHRvIGdldCBldmVyeXRoaW5nIGENCiAg bGl0dGxlIGJpdCBlYXJsaWVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBwaW4g bHd0IGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2x3dC5naXQjbHd0LTYNCiAg4pSCIG9wYW0g cGluIGx3dF9kaXJlY3QgaHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vbHd0LmdpdCNsd3QtNg0K ICDilJTilIDilIDilIDilIANCg0KDQpbUFIgb24gb3BhbS1yZXBvXSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS9wdWxsLzI4MTc1Pg0KDQoNCkZlZWRiYWNrDQrilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICBEb24ndCBoZXNpdGF0ZSB0byBjaGltZSBpbiBvbiBo ZXJlIHdpdGggYW55IGZlZWRiYWNrIHlvdSBtYXkNCiAgaGF2ZS4gSWRlYXMsIGNvbW1lbnRzLCBy ZXF1ZXN0cywgc3VnZ2VzdGlvbnMsIGV0Yy4NCg0KDQpNaXJhZ2VPUyBvbiBVbmlrcmFmdA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9taXJhZ2Vvcy1vbi11 bmlrcmFmdC8xNjk3NS8xPg0KDQoNCnNoeW0gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBPbiBiZWhhbGYgb2YgYWxsIHRoZSBkZXZlbG9w ZXJzIGludm9sdmVkIChuYW1lbHkgQGZhYmJpbmcsIEBGaXJvYmUsDQogIEBuLW9zYm9ybmUgYW5k IG1lKSwgaXTigJlzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoYXQgdGhlIGZpcnN0DQogIHJl bGVhc2Ugb2YgdGhlIFtVbmlrcmFmdF0gYmFja2VuZCBzdXBwb3J0IGluIE1pcmFnZU9TIHVuaWtl cm5lbHMuDQoNCiAgW1VuaWtyYWZ0XSBpcyBhIHVuaWtlcm5lbCBkZXZlbG9wbWVudCBraXQ6IGl0 IGlzIGEgcHJldHR5IGxhcmdlDQogIFtjb2xsZWN0aW9uIG9mIGNvbXBvbmVudHNdIHRoYXQgY2Fu IGJlIHBpY2tlZCB1cCwgb3Igbm90LCBpbiB0aGUNCiAgdW5pa2VybmVsIHRyYWRpdGlvbiBvZiBt b2R1bGFyaXR5LiBUaGUgc2NvcGUgb2YgVW5pa3JhZnQgaXMgbXVjaA0KICBsYXJnZXIgdGhhbiBb U29sbzVdLCBhcyBpdCBhaW1zIHRvIG1ha2UgaXQgZWFzeSB0byB0dXJuIGFueSBVbml4DQogIHNl cnZlciBpbnRvIGFuIGVmZmljaWVudCB1bmlrZXJuZWwuICBUaGlzIHdhcyBpbiBmYWN0IGEgZmly c3QNCiAgbW90aXZhdGlvbiB0byBleHBsb3JlIHVzaW5nIFVuaWtyYWZ0IGFzIE1pcmFnZU9TIGJh Y2tlbmQ6IHRvDQogIGV4cGVyaW1lbnQgYW5kIHNlZSB3aGF0IHBlcmZvcm1hbmNlIHdlIGNvdWxk IGdldCwgaW4gcGFydGljdWxhciB1c2luZw0KICB0aGVpciBgdmlydGlvJy1iYXNlZCBuZXR3b3Jr IGludGVyZmFjZSwgYXMgYHZpcnRpbycgaXMgaW1wbGVtZW50ZWQNCiAgY3VycmVudGx5IG9ubHkg Zm9yIG9uZSBzcGVjaWZpYyBgeDg2XzY0Jy1vbmx5IGJhY2tlbmQgaW4gU29sbzUuDQoNCiAgU29t ZSBvZiB0aGUgaW1tZWRpYXRlIHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VzIHdlIG9ic2VydmVkIGFy ZSBkZXRhaWxlZA0KICBmdXJ0aGVyLCBidXQgdGhhdCBpcyBub3QgYWxsIHdlIGhvcGUgZnJvbSB0 aGlzIFVuaWtyYWZ0IGJhY2tlbmQgaW4gdGhlDQogIGxvbmctdGVybS4gSW4gcGFydGljdWxhciwg VW5pa3JhZnQgaXMgb24gdGhlIHJvYWQgdG8gYmUNCiAgbXVsdGljb3JlLWNvbXBhdGlibGUgKGku ZS4gaGF2aW5nIG9uZSB1bmlrZXJuZWwgdXNlIG11bHRpcGxlDQogIGNvcmVzKS4gV2hpbGUgdGhp cyBpcyBub3QgcmVhZHkgdG9kYXkgYW5kIHRoZXJlIGFyZSBzdGlsbCBzaWduaWZpY2FudA0KICBl ZmZvcnRzIHRvIGdldCB0aGVyZSwgaXQgbWVhbnMgdGhhdCB0aGlzIE1pcmFnZU9TIGJhY2tlbmQg d2lsbCBiZSBhYmxlDQogIHRvIGJlbmVmaXQgZnJvbSB0aGVzZSBlZmZvcnRzIGFuZCBldmVudHVh bGx5IHN1cHBvcnQgdGhlIGZ1bGwgZmVhdHVyZQ0KICBzZXQgb2YgT0NhbWwgNS4NCg0KICBGdXJ0 aGVybW9yZSwgdGhlIFVuaWtyYWZ0IGNvbW11bml0eSAod2hpY2ggaXMgcXVpdGUgYWN0aXZlKSBp cw0KICBleHBlcmltZW50aW5nIHdpdGggYSB2YXJpZXR5IG9mIG90aGVyIHRhcmdldHMgc3VjaCBh cyBiYXJlLW1ldGFsIGZvcg0KICBzb21lIHBsYXRmb3JtcyBvciBuZXcgaHlwZXJ2aXNvcnMgKGUu Zy4gc2VMNCkuIEFueSBuZXcgdGFyZ2V0IFVuaWtyYWZ0DQogIHN1cHBvcnRzIGNhbiBiZSB0aGVu IHN1cHBvcnRlZCAiZm9yIGZyZWUiIGJ5IE1pcmFnZU9TIHRvby4gRm9yDQogIGV4YW1wbGUsIHRo aXMgYWxyZWFkeSBicmluZ3MgYGZpcmVjcmFja2VyJyBhcyBhIG5ldyBzdXBwb3J0ZWQgVk1NIGZv cg0KICBNaXJhZ2VPUy4NCg0KICBMYXN0bHksIHNpbmNlIFVuaWtyYWZ0IGlzIFBPU0lYLWNvbXBh dGlibGUgKGZvciBhIGxhcmdlIHN1YnNldCBvZg0KICBzeXNjYWxscyksIHRoaXMgcG90ZW50aWFs bHkgZW5hYmxlcyBNaXJhZ2VPUyB1bmlrZXJuZWwgdG8gZW1iZWQgT0NhbWwNCiAgbGlicmFyaWVz IHRoYXQgaGF2ZSBub3QgYmVlbiBwb3J0ZWQgdG8gdXNlIHRoZSBNaXJhZ2UgaW50ZXJmYWNlcyBp bg0KICB0aGUgZnV0dXJlLiBUaGlzIHdvdWxkIGJlIHVzZWZ1bCBmb3IgbGFyZ2UgbGlicmFyaWVz IHdoaWNoIGFyZSBoYXJkIHRvDQogIHBvcnQgKFtvd2xdIGNvbWVzIHRvIG1pbmQpLg0KDQoNCltV bmlrcmFmdF0gPGh0dHBzOi8vdW5pa3JhZnQub3JnPg0KDQpbY29sbGVjdGlvbiBvZiBjb21wb25l bnRzXQ0KPGh0dHBzOi8vdW5pa3JhZnQub3JnL2RvY3MvaW50ZXJuYWxzL2FyY2hpdGVjdHVyZT4N Cg0KW1NvbG81XSA8aHR0cHM6Ly9naXRodWIuY29tL1NvbG81L3NvbG81Lz4NCg0KW293bF0gPGh0 dHBzOi8vb2NhbWwueHl6Lz4NCg0KT3ZlcnZpZXcgb2YgdGhlIFVuaWtyYWZ0IHN1cHBvcnQNCuKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRvIGFkZCBuZXcgTWly YWdlT1MgYmFja2VuZHMgcmVxdWlyZXMgdG8gY3JlYXRlIG9yIG1vZGlmeSBhIHNlcmllcyBvZg0K ICBjb21wb25lbnRzOg0KDQogIOKAoiBhIFtPQ2FtbCBjcm9zcyBjb21waWxlcl0gdGhhdCBjYW4g YnVpbGQgdGhpcyBuZXcgYmFja2VuZCwgaW4NCiAgICBwYXJ0aWN1bGFyIGJ5IGJ1aWxkaW5nIGl0 cyBjb3JyZXNwb25kaW5nIHJ1bnRpbWUgYW5kIHByb3ZpZGluZyBhIHdheQ0KICAgIHRvIGJ1aWxk IHVuaWtlcm5lbCBpbWFnZXMgKGluc3RlYWQgb2Ygbm9ybWFsIGV4ZWN1dGFibGVzKSwNCiAg4oCi IG5ldyBsaWJyYXJpZXMgZm9yIHRoZSBbVW5pa3JhZnQgc3lzdGVtIHN1cHBvcnRdLCBhbmQgaXRz IFtuZXR3b3JrXQ0KICAgIGFuZCBbYmxvY2tdIGRldmljZXMsDQogIOKAoiBbc3VwcG9ydCBmb3Ig dGhlIG5ldyBiYWNrZW5kc10gaW4gdGhlIGBtaXJhZ2UnIHRvb2wuDQoNCiAgVXNpbmcgVW5pa3Jh ZnQgd2l0aCBhIFFFTVUgb3IgYSBGaXJlY3JhY2tlciBiYWNrZW5kIGlzIGFzIHNpbXBsZSBhcw0K ICBjaG9vc2luZyB0aGUgYHVuaWtyYWZ0LXFlbXUnIHRhcmdldCBvciB0aGUgYHVuaWtyYWZ0LWZp cmVjcmFja2VyJyBvbmUNCiAgd2hlbiBjb25maWd1cmluZyBhIHVuaWtlcm5lbC4NCg0KDQpbT0Nh bWwgY3Jvc3MgY29tcGlsZXJdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL29jYW1sLXVuaWty YWZ0Pg0KDQpbVW5pa3JhZnQgc3lzdGVtIHN1cHBvcnRdIDxodHRwczovL2dpdGh1Yi5jb20vbWly YWdlL21pcmFnZS11bmlrcmFmdD4NCg0KW25ldHdvcmtdIDxodHRwczovL2dpdGh1Yi5jb20vbWly YWdlL21pcmFnZS1uZXQtdW5pa3JhZnQ+DQoNCltibG9ja10gPGh0dHBzOi8vZ2l0aHViLmNvbS9t aXJhZ2UvbWlyYWdlLWJsb2NrLXVuaWtyYWZ0Pg0KDQpbc3VwcG9ydCBmb3IgdGhlIG5ldyBiYWNr ZW5kc10NCjxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS9wdWxsLzE2MDc+DQoNCuKX iiBUaGUgT0NhbWwvVW5pa3JhZnQgY3Jvc3MgY29tcGlsZXINCg0KICBUbyBidWlsZCB0aGUgW09D YW1sIGNyb3NzIGNvbXBpbGVyXSB0byBVbmlrcmFmdCwgd2UgdXNlIHRoZSBbVW5pa3JhZnRdDQog IGNvcmUsIHRoZSBVbmlrcmFmdCBbbGliLW11c2xdIGFuZCBbbXVzbF0gaXRzZWxmLiBbbXVzbF0g aXMgdGhlIEMNCiAgbGlicmFyeSByZWNvbW1lbmRlZCBieSBVbmlrcmFmdCB0byBidWlsZCBwcm9n cmFtcyB1c2luZyB0aGUgUE9TSVgNCiAgaW50ZXJmYWNlLiBUaGlzIG1hZGUgaXQgZWFzeSB0byBi dWlsZCB0aGUgT0NhbWwgNSBydW50aW1lLCBpbg0KICBwYXJ0aWN1bGFyIGJlY2F1c2UgaXQgcHJv dmlkZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIGBwdGhyZWFkJyBBUEkNCiAgd2hpY2ggaXMg bm93IHVzZWQgaW4gbWFueSBwbGFjZXMgaW4gdGhlIHJ1bnRpbWVbXipdLiBUaGlzIGNvdWxkIGFs c28NCiAgbWFrZSBpdCBlYXNpZXIgdG8gcG9ydCBzb21lIGxpYnJhcmllcyB0aGF0IGRlcGVuZCBv biBgVW5peCcgdG8gd29yayBvbg0KICBVbmlrcmFmdCBiYWNrZW5kcy4NCg0KICBbXipdOiBBZGRp bmcgc3VwcG9ydCBmb3IgVGhyZWFkLUxvY2FsIFN0b3JhZ2UgaGFzIGJlZW4gYSBsYXJnZSBwYXJ0 IG9mDQogIHRoZSB3b3JrIHRvIGdldCBPQ2FtbCA1IHdvcmtpbmcgb24gU29sbzU6IGV2ZW4gaWYg dGhlIGNyZWF0aW9uIG9mDQogIHRocmVhZHMgaXMgbm90IHN1cHBvcnRlZCwgVExTIGlzIHN0aWxs IG5lY2Vzc2FyeSB0byBnZXQgdGhlIHJ1bnRpbWUgdG8NCiAgY29tcGlsZS4NCg0KICBUaGUgT0Nh bWwgY3Jvc3MgY29tcGlsZXIgX3BlciBzZV8gYnVpbGRzIHVwb24gdGhlIHdvcmsgdGhhdCBoYXMg YmVlbg0KICB1cHN0cmVhbWVkIHRvIGVhc2UgdGhlIFtjcmVhdGlvbiBvZiBjcm9zcyBjb21waWxl cnNdLCB1c2luZyBhbG1vc3QgdGhlDQogIHNhbWUgc2VyaWVzIG9mIHBhdGNoZXMgdGhhbiBmb3Ig YG9jYW1sLXNvbG81Jy4gU28gdGhlIG9ubHkgdmVyc2lvbiBvZg0KICB0aGUgY29tcGlsZXIgdGhh dCBpcyBjdXJyZW50bHkgc3VwcG9ydGVkIGZvciBPQ2FtbC9VbmlrcmFmdCBpcyBPQ2FtbA0KICA1 LjMuIEFsbW9zdCBhbGwgdGhlIHBhdGNoZXMgd2lsbCBiZSBpbiB0aGUgdXBjb21pbmcgT0NhbWwg NS40IGFuZA0KICB0aGVyZSBzaG91bGQgbm8gbG9uZ2VyIGJlIGFueSBwYXRjaGVzIHJlcXVpcmVk IGJ5IE9DYW1sIDUuNS4NCg0KICBOb3RlIHRoYXQgd2UgZGlkbuKAmXQgZ28gd2l0aCB0aGUgZnVs bCBzdGFuZGFyZCBVbmlrcmFmdCBQT1NJWCBzdGFjaywNCiAgd2hpY2ggaW5jbHVkZXMgW2x3SVBd IHRvIHByb3ZpZGUgbmV0d29yayBzdXBwb3J0LiBXZSBoYWQgYSBwcm90b3R5cGUNCiAgYXQgc29t ZSBwb2ludCByZWx5aW5nIG9uIGx3SVAgdG8gdmFsaWRhdGUgb3VyIHByb2dyZXNzIG9uIG90aGVy DQogIGJ1aWxkaW5nIGJsb2NrcyBidXQgaXQgcmFpc2VkIG1hbnkgaW5jb21wYXRpYmlsaXR5IGlz c3VlcyB3aXRoIHRoZQ0KICBzdGFuZGFyZCBNaXJhZ2VPUyBuZXR3b3JrIHN0YWNrIHNvIHdlIGRy b3BwZWQgc3VwcG9ydCBmb3IgbHdJUCBpbiB0aGF0DQogIGZpcnN0IHJlbGVhc2U7IHdlIGRldmVs b3BlZCBpbnN0ZWFkIHRoZSBsaWJyYXJpZXMgcmVxdWlyZWQgdG8gcGx1ZyB0aGUNCiAgTWlyYWdl T1Mgc3RhY2tzIGludG8gdGhlIGxvdy1sZXZlbCBpbnRlcmZhY2VzIHByb3ZpZGVkIGJ5IHRoZSBV bmlrcmFmdA0KICBjb3JlLg0KDQoNCiAgW09DYW1sIGNyb3NzIGNvbXBpbGVyXSA8aHR0cHM6Ly9n aXRodWIuY29tL21pcmFnZS9vY2FtbC11bmlrcmFmdD4NCg0KICBbVW5pa3JhZnRdIDxodHRwczov L3VuaWtyYWZ0Lm9yZz4NCg0KICBbbGliLW11c2xdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdl L3VuaWtyYWZ0LWxpYi1tdXNsPg0KDQogIFttdXNsXSA8aHR0cHM6Ly9tdXNsLmxpYmMub3JnLz4N Cg0KICBbY3JlYXRpb24gb2YgY3Jvc3MgY29tcGlsZXJzXQ0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2J1aWxkaW5nLWFuLW9jYW1sLWNyb3NzLWNvbXBpbGVyLXdpdGgtb2NhbWwtNS0z LzE1OTE4Pg0KDQogIFtsd0lQXSA8aHR0cHM6Ly9zYXZhbm5haC5ub25nbnUub3JnL3Byb2plY3Rz L2x3aXAvPg0KDQoNCuKXiiBUaGUgbmV3IE1pcmFnZU9TIGxpYnJhcmllcyBmb3IgVW5pa3JhZnQg c3VwcG9ydA0KDQogIFRoZSBVbmlrcmFmdCBzdXBwb3J0IGNvbWVzIHdpdGggcGFja2FnZXMgdXNp bmcgdGhlIHN0YW5kYXJkIG5hbWVzOg0KICBgbWlyYWdlLWJsb2NrLXVuaWtyYWZ0JyBhbmQgYG1p cmFnZS1uZXQtdW5pa3JhZnQnIHRvIHN1cHBvcnQgdGhlIGJsb2NrDQogIGFuZCBuZXR3b3JrIGRl dmljZXMuIFRob3NlIGxpYnJhcmllcyBhcmUgaW1wbGVtZW50ZWQgZGlyZWN0bHkgb24gdG9wDQog IG9mIHRoZSBsb3ctbGV2ZWwgVW5pa3JhZnQgQVBJcywgYW5kIHNvIGFyZSB1c2luZyBgdmlydGlv JyBvbiBib3RoIFFFTVUNCiAgYW5kIEZpcmVjcmFja2VyIFZNTXMuICBUbyBldmFsdWF0ZSB0aGUg cXVhbGl0eSBvZiB0aGUgaW1wbGVtZW50YXRpb25zDQogIGZvciB0aG9zZSBkZXZpY2VzLCB3ZSBy YW4gYSBjb3VwbGUgb2Ygc21hbGwgYmVuY2htYXJrcy4gWW91IGNhbiBmaW5kDQogIHRob3NlIGJl bmNobWFya3MgKHRoZSB1bmlrZXJuZWxzIGFsb25nIHdpdGggc29tZSBzY3JpcHRzIHRvIHNldCB0 aGVtDQogIHVwIGFuZCBydW4gdGhlbSkgaW4gdGhlIGBiZW5jaG1hcmtzJyBkaXJlY3RvcnkgaW4g W0BGaXJvYmXigJlzIGZvcmsgb2YNCiAgbWlyYWdlLXNrZWxldG9uLCBgYmVuY2htYXJrcycgYnJh bmNoXS4NCg0KDQogIFtARmlyb2Jl4oCZcyBmb3JrIG9mIG1pcmFnZS1za2VsZXRvbiwgYGJlbmNo bWFya3MnIGJyYW5jaF0NCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9GaXJvYmUvbWlyYWdlLXNrZWxl dG9uL3RyZWUvYmVuY2htYXJrcz4NCg0KICDil4ogTmV0d29yayBkZXZpY2UNCg0KICAgIFRvIG1l YXN1cmUgdGhlIHBlcmZvcm1hbmNlIG9mIHRoZSBuZXR3b3JrIHN0YWNrLCB3ZSBoYXZlIHR3ZWFr ZWQgdGhlDQogICAgc2ltcGxlIFtuZXR3b3JrIHNrZWxldG9uXSB1bmlrZXJuZWwgdG8gY29tcHV0 ZSBzb21lIHN0YXRpc3RpY3MgYW5kDQogICAgdXNlZCBhIHZhcmlhYmxlIG51bWJlciBvZiBjbGll bnRzIGFsbCBzZW5kaW5nIDUxMk1CIG9mIG51bGwNCiAgICBieXRlcy4gV2UgaGF2ZSBydW4gdGhp cyBiZW5jaG1hcmsgYm90aCBvbiBhIGNvdXBsZSBvZiBgeDg2XzY0Jw0KICAgIGxhcHRvcHMgYW5k IG9uIGEgTFgyMTYwIGBhYXJjaDY0JyBib2FyZCwgYWxsIHJ1bm5pbmcgYSBHTlUvTGludXggT1Mu DQoNCiAgICBXZSBoYXZlIG9ic2VydmVkIGEgbG90IG9mIHZhcmlhYmlsaXR5IGluIHRoZSBwZXJm b3JtYW5jZSBvZiB0aGUNCiAgICBgc29sbzUtc3B0JyB1bmlrZXJuZWwgKHNvbWV0aW1lcyBiZXR0 ZXIsIHNvbWV0aW1lcyB3b3JzZSB0aGFuDQogICAgYHVuaWtyYWZ0LXFlbXUnKSBkZXBlbmRpbmcg b24gdGhlIGFjdHVhbCBjb21wdXRlciB1c2VkLCBzbyB0aG9zZQ0KICAgIG1lYXN1cmVzIHNob3Vs ZCBiZSByZWFkIHdpdGggYSBncmFpbiBvZiBzYWx0Lg0KDQogICAgT24gdHdvIGRpZmZlcmVudCBg eDg2XzY0JyBsYXB0b3BzOg0KDQogICAgPGh0dHBzOi8vdXMxLmRpc2NvdXJzZS1jZG4uY29tL2Zs ZXgwMjAvdXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC8wLzBlZTAwYzBkY2E1Y2I4OWE0ZGNlYjYx NjVlNDNjZjVhNDZkZjJlMDEuanBlZz4NCg0KICAgIDxodHRwczovL3VzMS5kaXNjb3Vyc2UtY2Ru LmNvbS9mbGV4MDIwL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvZC9kOGIxOWIzYWNiZmIyODNh N2E3MTdkM2MyMDNiMjViY2ZhNmVjZjIwLnBuZz4NCg0KICAgIE9uIHRoZSBMWDIxNjAgYGFhcmNo NjQnIGJvYXJkOg0KDQogICAgPGh0dHBzOi8vdXMxLmRpc2NvdXJzZS1jZG4uY29tL2ZsZXgwMjAv dXBsb2Fkcy9vY2FtbC9vcmlnaW5hbC8yWC9mL2ZkNDM2NGMyNmRiZDI5NTU5MGVmNzYzNDY0NDlh NmRhZWY1MDc4NGQuanBlZz4NCg0KDQogICAgW25ldHdvcmsgc2tlbGV0b25dDQogICAgPGh0dHBz Oi8vZ2l0aHViLmNvbS9taXJhZ2UvbWlyYWdlLXNrZWxldG9uL3RyZWUvbWFpbi9kZXZpY2UtdXNh Z2UvbmV0d29yaz4NCg0KDQogIOKXiiBCbG9jayBkZXZpY2UNCg0KICAgIFRvIG1lYXN1cmUgdGhl IHBlcmZvcm1hbmNlIG9mIHRoZSBibG9jayBkZXZpY2VzLCB3ZSB3cm90ZSBhIHNpbXBsZQ0KICAg IHVuaWtlcm5lbCBjb3B5aW5nIGRhdGEgZnJvbSBvbmUgZGlzayB0byBhbm90aGVyLiBXZSBjYW4g c2VlIHRoYXQgdGhlDQogICAgcGVyZm9ybWFuY2Ugb2YgYHVuaWtyYWZ0LXFlbXUnIGlzIGxvd2Vy IHRoYW4gYHNvbG81LWh2dCcgZm9yIHNtYWxsDQogICAgYnVmZmVyIHNpemVzOyBmb3J0dW5hdGVs eSwgdGhlIHNpdHVhdGlvbiBpbXByb3ZlcyB3aXRoIGxhcmdlciBidWZmZXINCiAgICBzaXplcy4g V2UgcmFuIHRoaXMgYmVuY2htYXJrIG9ubHkgb24gYSBgeDg2XzY0JyBsYXB0b3AgYXMgdGhlcmXi gJlzDQogICAgY3VycmVudGx5IGFuIFtpc3N1ZSB3aXRoIHR3byBibG9jayBkZXZpY2VzXSBvbiBg YWFyY2g2NCcgb24NCiAgICBVbmlrcmFmdC4NCg0KICAgIDxodHRwczovL3VzMS5kaXNjb3Vyc2Ut Y2RuLmNvbS9mbGV4MDIwL3VwbG9hZHMvb2NhbWwvb3B0aW1pemVkLzJYL2UvZWU2ZjI1MGZmM2Iw ZmMzZWZlYmRiZTdiODM2MTk4YjA2NDhjZjI0YV8yXzEzODB4OTc0LnBuZz4NCg0KICAgIEl0IGlz IHdvcnRoIG1lbnRpb25pbmcgdGhhdCBJL09zIGNhbiBiZSBwYXJhbGxlbGlzZWQsIHdoaWNoIGFs c28NCiAgICBnaXZlcyBhIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGJvb3N0LiBJbmRlZWQsDQog ICAgYG1pcmFnZS1ibG9jay11bmlrcmFmdCcgY2FuIGxldmVyYWdlIHRoZSBwYXJhbGxlbGlzZWQg dmlydGlvIGJhY2tlbmQNCiAgICBvZiBRRU1VIGFuZCBGaXJlY3JhY2tlcjsgaXQgdGFrZXMgY2Fy ZSBvZiBsaW1pdGluZyBJL09zIHRvIHdoYXQgdGhlDQogICAgaGFyZHdhcmUgc3VwcG9ydHMgaW4g dGVybXMgb2YgYm90aCBwYXJhbGxlbGlzbSBhbmQgc2VjdG9yIHNpemUuDQoNCg0KICAgIFtpc3N1 ZSB3aXRoIHR3byBibG9jayBkZXZpY2VzXQ0KICAgIDxodHRwczovL2dpdGh1Yi5jb20vdW5pa3Jh ZnQvdW5pa3JhZnQvaXNzdWVzLzE2MjI+DQoNCg0K4peKIEN1cnJlbnQgbGltaXRhdGlvbnMNCg0K ICAxLiBJbiBvdXIgdGVzdHMgb25seSBMaW51eCBhcHBlYXJlZCB3ZWxsIHN1cHBvcnRlZCB0byBj b21waWxlIFVuaWtyYWZ0DQogICAgIGF0IHRoZSBtb21lbnQgc28gd2XigJl2ZSByZXN0cmljdGVk IG91ciBwYWNrYWdlcyB0byB0aGF0IE9TIGZvciBub3cuDQogIDIuIFVuaWtyYWZ0IHN1cHBvcnRz IHZhcmlvdXMgYmFja2VuZHMgaXRzZWxmOyBpbiB0aGlzIGZpcnN0IHJlbGVhc2UsDQogICAgIHdl 4oCZdmUgb25seSBhZGRlZCBzdXBwb3J0IGFuZCB0ZXN0ZWQgaXRzIHR3byBtYWpvciBvbmVzOiBb UUVNVV0gYW5kDQogICAgIFtGaXJlY3JhY2tlcl0uDQoNCg0KICBbUUVNVV0gPGh0dHBzOi8vd3d3 LnFlbXUub3JnLz4NCg0KICBbRmlyZWNyYWNrZXJdIDxodHRwczovL2ZpcmVjcmFja2VyLW1pY3Jv dm0uZ2l0aHViLmlvLz4NCg0KDQpIb3cgdG8gdXNlDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBUbyB0cnkgdGhlIG5ldyBVbmlrcmFmdCBiYWNrZW5kIGZvciBNaXJhZ2VPUywg eW91IG5lZWQgdG8gdXNlIGFuIE9DYW1sDQogIDUuMyBzd2l0Y2gsIHNvIGNyZWF0ZSBvbmUgZmly c3QgaWYgbmVlZGVkLiBUaGVuIGFkZCBvdXIgb3BhbSBvdmVybGF5DQogIHRvIGdldCBhY2Nlc3Mg dG8gb3VyIGxhdGVzdCB2ZXJzaW9ucyBvZiB0aGUgcGFja2FnZXMgdW50aWwgdGhleSBhcmUNCiAg cHVibGlzaGVkIG9uIHRoZSBzdGFuZGFyZCByZXBvc2l0b3J5IGFuZCBpbnN0YWxsIGBtaXJhZ2Un IGFuZCB0aGUNCiAgT0NhbWwvVW5pa3JhZnQgY3Jvc3MgY29tcGlsZXIuIFRoZSBzaG9ydCB2ZXJz aW9uIGNvdWxkIGJlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFtIHN3aXRjaCBj cmVhdGUgdW5pa3JhZnQtdGVzdCA1LjMuMA0KICDilIIgJCBvcGFtIHJlcG8gYWRkIG1pcmFnZS11 bmlrcmFmdC1vdmVybGF5cyBodHRwczovL2dpdGh1Yi5jb20vRmlyb2JlL21pcmFnZS11bmlrcmFm dC1vdmVybGF5cy5naXQNCiAg4pSCICQgb3BhbSBpbnN0YWxsIG1pcmFnZSBvY2FtbC11bmlrcmFm dC1iYWNrZW5kLXFlbXUgb2NhbWwtdW5pa3JhZnQteDg2XzY0DQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFNlZSBiZWxvdyBmb3Igc29tZSBleHBsYW5hdGlvbnMgYWJvdXQgdGhlIG51bWVyb3VzIE9D YW1sL1VuaWtyYWZ0DQogIHBhY2thZ2VzLg0KDQogIEZyb20gdGhlbiBvbiwgeW91IGNhbiBmb2xs b3cgdGhlIHN0YW5kYXJkIHByb2NlZHVyZSAoc2VlIGhvdyB0bw0KICBbaW5zdGFsbCBNaXJhZ2VP U10gYW5kIGhvdyB0byBbYnVpbGQgYSBoZWxsby13b3JsZCB1bmlrZXJuZWxdKSB0bw0KICBidWls ZCB5b3VyIHVuaWtlcm5lbCB3aXRoIHRoZSBVbmlrcmFmdCBiYWNrZW5kIG9mIHlvdXIgY2hvaWNl Lg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBtaXJhZ2UgY29uZmlndXJlIC10IHVuaWty YWZ0LXFlbXUNCiAg4pSCICQgbWFrZQ0KICDilJTilIDilIDilIDilIANCg0KDQpbaW5zdGFsbCBN aXJhZ2VPU10gPGh0dHBzOi8vbWlyYWdlLmlvL2RvY3MvaW5zdGFsbD4NCg0KW2J1aWxkIGEgaGVs bG8td29ybGQgdW5pa2VybmVsXSA8aHR0cHM6Ly9taXJhZ2UuaW8vZG9jcy9oZWxsby13b3JsZD4N Cg0K4peKIERldGFpbHMgYWJvdXQgdGhlIHZhcmlvdXMgcGFja2FnZXMgZm9yIHRoZSBPQ2FtbC9V bmlrcmFmdCBjcm9zcyBjb21waWxlcg0KDQogIFRoZSBbT0NhbWwgY3Jvc3MgY29tcGlsZXJdIHRv IFVuaWtyYWZ0IGlzIHNwbGl0IHVwIGludG8gMTQgcGFja2FnZXMNCiAgKHNlZSB0aGUgW1BSIHRv IGBvcGFtLXJlcG9zaXRvcnknXSBmb3IgbW9yZSBkZXRhaWxzKSBzbyB0aGF0IHVzZXJzDQogIGNh bjoNCg0KICDigKIgY2hvb3NlIHdoaWNoIG9mIHRoZSBiYWNrZW5kcyAoUUVNVSBvciBGaXJlY3Jh Y2tlcikgYW5kIHdoaWNoIG9mIHRoZQ0KICAgIGFyY2hpdGVjdHVyZXMgKGB4ODZfNjQnIGFuZCBg YXJtNjQnKSB0aGV5IHdhbnQgdG8gaW5zdGFsbCwgd2hlcmUgYWxsDQogICAgY29tYmluYXRpb25z IGNhbiBiZSBpbnN0YWxsZWQgYXQgdGhlIHNhbWUgdGltZSwNCiAg4oCiIGNob29zZSB3aGljaCBh cmNoaXRlY3R1cmUgaXMgZ2VuZXJhdGVkIHdoZW4gdGhleSB1c2UgdGhlIGB1bmlrcmFmdCcNCiAg ICBvY2FtbGZpbmQgdG9vbGNoYWluIGJ5IGluc3RhbGxpbmcgb25lIG9mIHRoZSB0d28NCiAgICBg b2NhbWwtdW5pa3JhZnQtZGVmYXVsdC08YXJjaD4nIHBhY2thZ2UsDQogIOKAoiBpbnN0YWxsIHRo ZSBgb2NhbWwtdW5pa3JhZnQtb3B0aW9uLWRlYnVnJyB0byBlbmFibGUgdGhlIChyZWFsbHkNCiAg ICB2ZXJib3NlISkgZGVidWdnaW5nIG1lc3NhZ2VzLg0KDQogIFRoZSB2aXJ0dWFsIHBhY2thZ2Vz IGNhbiBiZSBpbnN0YWxsZWQgdG8gbWFrZSBzdXJlIG9uZSBvZiB0aGUNCiAgYXJjaGl0ZWN0dXJl LXNwZWNpZmljIHBhY2thZ2VzIGlzIGluZGVlZCBpbnN0YWxsZWQ6DQoNCiAg4oCiIGBvY2FtbC11 bmlrcmFmdCcgY2FuIGJlIGluc3RhbGxlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGVyZSBpcyBpbmRl ZWQNCiAgICBhIGB1bmlrcmFmdCcgb2NhbWxmaW5kIHRvb2xjaGFpbiBpbnN0YWxsZWQsDQogIOKA oiBgb2NhbWwtdW5pa3JhZnQtYmFja2VuZC1xZW11JyBhbmQNCiAgICBgb2NhbWwtdW5pa3JhZnQt YmFja2VuZC1maXJlY3JhY2tlcicgY2FuIGJlIGludGFsbGVkIHRvIG1ha2Ugc3VyZQ0KICAgIHRo YXQgdGhlIGB1bmlrcmFmdCcgb2NhbWxmaW5kIHRvb2xjaGFpbiBzdXBwb3J0cyB0aGUgY29ycmVz cG9uZGluZw0KICAgIGJhY2tlbmQuDQoNCiAgVGhvc2UgdmlydHVhbCBwYWNrYWdlcyB3aWxsIGJl IHVzZWQgaW4gcGFydGljdWxhciBieSB0aGUgYG1pcmFnZScgdG9vbA0KICB3aGVuIHRoZSB0YXJn ZXQgaXMgYHVuaWtyYWZ0LXFlbXUnIG9yIGB1bmlrcmFmdC1maXJlY3JhY2tlcicuDQoNCiAgQWxs IHRob3NlIHBhY2thZ2VzIHVzZSBvbmUgb2YgdHdvIHZlcnNpb24gbnVtYmVycy4gVGhlIGJhY2tl bmQNCiAgcGFja2FnZXMgdXNlIHRoZSBVbmlrcmFmdCB2ZXJzaW9uIG51bWJlciB0aGV5IGFyZSB1 c2luZywgd2hpbGUgdGhlDQogIE9DYW1sIGNvbXBpbGVyIHBhY2thZ2VzIF9wZXIgc2VfIHVzZSB2 ZXJzaW9uIGAxLjAuMCcuDQoNCg0KICBbT0NhbWwgY3Jvc3MgY29tcGlsZXJdIDxodHRwczovL2dp dGh1Yi5jb20vbWlyYWdlL29jYW1sLXVuaWtyYWZ0Pg0KDQogIFtQUiB0byBgb3BhbS1yZXBvc2l0 b3J5J10NCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8y Nzg1Nj4NCg0KDQpDb25jbHVzaW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K ICBUaGlzIGlzIGEgZmlyc3QgcmVsZWFzZSwgd2hpY2ggd2UgYXJlIGV4cGVyaW1lbnRpbmcgd2l0 aDsgd2UgZXhwZWN0IHRvDQogIHJ1biBpdCBpbiBwcm9kdWN0aW9uIGluIHRoZSBjb21pbmcgbW9u dGhzIGJ1dCBpdCBtYXkgbmVlZCBpbXByb3ZlbWVudHMNCiAgbmV2ZXJ0aGVsZXNzLiBOb3RhYmx5 IGFic2VudCBmcm9tIHRoaXMgcmVsZWFzZSBpcyBhbiBlYXJseSBhdHRlbXB0IHRvDQogIGxldmVy YWdlIFVuaWtyYWZ04oCZcyBQT1NJWCBjb21wYXRpYmlsaXR5IHRvIGltcGxlbWVudCBNaXJhZ2Ug aW50ZXJmYWNlcw0KICBpbnN0ZWFkIG9mIGhvb2tpbmcgZGlyZWN0bHkgdG8gVW5pa3JhZnTigJlz IGludGVybmFsIGNvbXBvbmVudHMuIFRoaXMNCiAgZWFybHkgdmVyc2lvbiB1c2VkIFVuaWtyYWZ0 4oCZcyBgbHdJUCctYmFzZWQgbmV0d29yayBzdGFjayBpbnN0ZWFkIG9mDQogIE1pcmFnZeKAmXMg KGZvb2xpbmcgTWlyYWdlIGludG8gdGhpbmtpbmcgaXQgd2FzIHJ1bm5pbmcgb24gVW5peCksIGFu ZCBpdA0KICBtYXkgYmUgaW50ZXJlc3RpbmcgdG8gcmV2aXNpdCB0aGlzIGtpbmQgb2YgZGVwbG95 bWVudCwgaW4gcGFydGljdWxhcg0KICBmb3IgZWFzeSBpbmNsdXNpb24gb2YgdW5peC1vbmx5IE9D YW1sIGxpYnJhcmllcyBpbiB1bmlrZXJuZWxzLg0KDQogIFdlIGFyZSBlYWdlciBmb3IgcmV2aWV3 cywgY29tbWVudHMgYW5kIGRpc2N1c3Npb24gb24gdGhlDQogIGltcGxlbWVudGF0aW9uLCBkZXNp Z24gYW5kIGFwcHJvYWNoIG9mIHRoaXMgbmV3IE1pcmFnZSBiYWNrZW5kLCBhbmQNCiAgaG9wZSBp dCB3aWxsIGJlIHVzZWZ1bCB0byBvdGhlcnMuDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9j YW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkg T0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDi gKIgW0ludHJvZHVjaW5nIEphbmUgU3RyZWV0J3MgT3hDYW1sIEJyYW5jaCFdDQoNCg0KW3RoZSBv Y2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbSW50cm9kdWNpbmcg SmFuZSBTdHJlZXQncyBPeENhbWwgQnJhbmNoIV0NCjxodHRwczovL3RhcmlkZXMuY29tL2Jsb2cv MjAyNS0wNy0wOS1pbnRyb2R1Y2luZy1qYW5lLXN0cmVldC1zLW94Y2FtbC1icmFuY2g+DQoNCg0K T2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNz IGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0 byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVl ZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBp dCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1s aXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBz Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZl c10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxp c3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxh biBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=EYsD6AUn; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=cAb4U68H; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 23F3840066 for ; Tue, 22 Jul 2025 12:08:09 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=pJ+ezQtY28wUbPHZYKEyVGR65l/nvjd6UhEH/9QnqVY=; b=EYsD6AUnhGD91Ba789vl5aSmHBJLrjGp4eP21AMcqusAD75WuaxXBsoJ KSGXgPDbT/MD9mZR/yd5cMdH9hz/yHxClIwIlg8P0484F+MdxezDHqMjI zUTscv6yQO5fX88QdBa1rxqVKxTP+VK7YfiQOkUB5+T1aPq4f5Eciy/vq k=; X-CSE-ConnectionGUID: X7naIzANRYKL4QdKbH8dLQ== X-CSE-MsgGUID: 3VcaJzR/TdupveVqopOPTw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,331,1744063200"; d="scan'208,217";a="232623916" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 22 Jul 2025 14:08:08 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8758FE0264; Tue, 22 Jul 2025 14:08:08 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 27713E0171 for ; Tue, 22 Jul 2025 14:08:03 +0200 (CEST) X-CSE-ConnectionGUID: x0pawuhaRJKTz8NnTzo25w== X-CSE-MsgGUID: wfzqFVCJQQKbza4F4loYYQ== IronPort-SDR: 687f7f21_dxo8iwopyhnjJexjw2J35aUsIG53yXO0v0wtGyOueXi1+DF nciCNgt1axrq3gzGczb2fsCgzaUFg5iEhzVOePw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HeBAA+fn9ojyIeaIFaHgE8DAILgylbKBkBZlozBwhJA?= =?us-ascii?q?4RSg0+OIpFMg0WFBYIwgWkPgQIDGBYjFQEDAQ0uAQUaAQIEAQEDAQIBggyCL?= =?us-ascii?q?kYCFot9Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGA?= =?us-ascii?q?QIQAQEBAQEBOQUOO4V7DYJFUXFlCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECDAEpCmsJChMBASsDChgjAxQBBgMCBA0BN?= =?us-ascii?q?QMBEwESGoIQWAGCIQJLAwUMBpQLm0t6gTKBAYIMAQEGgQg+AgELAgIDGCUB2?= =?us-ascii?q?guBZAkNAoE6gx+CToJKGgEqSGsChEgJhDMnD4FVRIEVNYFzUW+CEDoXAQEBA?= =?us-ascii?q?QEXgQwYAQEGCzwJgyWCaYImRD4UHYFAgj2CM4EqgmCGE4gKgURLMywBVRMXC?= =?us-ascii?q?wcFW4EIAyo0MW4yHYEnhRWEKCtPhRCBGYNTERNtDwaBGIMSQAMLbT03FBuSX?= =?us-ascii?q?RcEJRlqgUAKJQ44DUYBCwkoBQEFDggKBAIiLAIIDiMHAQoUBSYKBBYHLQgDB?= =?us-ascii?q?gclBgKSRhQTFSoDj1mieTQHhB+BXgYMiQiBJpYFhASBV4s7hwKSUSKYZCKIU?= =?us-ascii?q?IENCoEcCQdZgQ9rlV4EHAKFN4F/IzyBIDMaMEOCMwEBARoXCQo8HA+OLRaDX?= =?us-ascii?q?oE+gRsLgXQ7gT2BKQe4QUE1AgEBBDQCBwEKAQEDCYViAQGJTDKBSwEB?= IronPort-PHdr: A9a23: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 cQdUxNkT00B16BRjER6cdlK IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:dahsKKC66D1PraHlHejAsceALOsnbusQ8zAXPhZKOGxom6uj5q eTdZUgpHvJYVkqNU3I9ertBEDEexPhHLROkPIs1M6ZLXPbUTKTXfxfBOnZogEIaheOk9K1vJ 0IG8ND4Z/LfDtHZKDBjzVQeOxQouVvnprHuQ/vpU0GcehCUdAS0y5JTiiaD2h/T01jCYE2GK GR/tZKvSflWVl/VLXGOlA1G8bCuvjCn9bDbQUJCyUq8BWDly7tyJ7WeiLooSs2YndgwaoG+W OAtwDj6KmZv+mmxgXAk1XP54lb8eGRtOdrNYijitUxIj6psx2vZ4hqRtS5zVYIidDqxlY2td HG5y46Ocd+4W6UXmzdm2qV5yDQlBgv9lrrwhugmn3hrcblAAszFsspv/MgTjLpr2QhofR12+ Zx03udp950AQOoplWN2+T1 X-Talos-CUID: 9a23:GqFOpW+/eJNDauWpunuVv15MAsk6b33U9lXzH13oL2BVWrrPFEDFrQ== X-Talos-MUID: =?us-ascii?q?9a23=3AVko46A/3Q+bO3YuuTjqNT7WQf9hm8b2ANmsvqKw?= =?us-ascii?q?lsduNaQIsPzCsvQ3iFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,331,1744063200"; d="scan'208,217";a="121937668" X-MGA-submission: =?us-ascii?q?MDGkkKzI7Ls8tkvjDPRoNupkLhhO9C/pgJ/hzD?= =?us-ascii?q?Wj0geJ6rFBdtqWRDtMWTfbF1bu+26RJVE7X2WZIr92ATf+EpwbVrIIgS?= =?us-ascii?q?sy+GPAyZynDnGAbt5QdREgtMQQfyKyUSanKHnhE2FmijgpJGvP/24Tq7?= =?us-ascii?q?QO9ejPPmJ0VwUwksRsgCqfNA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 22 Jul 2025 14:08:01 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 35061564F84; Tue, 22 Jul 2025 14:08:00 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1753186080; bh=9pr0wdnmRFdXXkVnHgT6LnwHufM0vTukhRJPmH6Vkq8=; h=From:To:Subject:Date:Message-ID; b=cAb4U68H6OqUOEMoj6nb/8tZ+km8b1Xvyyj/SdvNz63LkiWbimUlw4FBnH0pMFbd2 +FCx/r77qlhe3TnyofYq5M9j3Ju/LFhCA4uDJRXpQZx6TLC/FMxHETgHu0hA8pWQ7Q 4bmq2GHUwp3xTQ5qmZNFdEws7vtpZg0WU8Gj5us8= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 22 Jul 2025 14:07:59 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 22 14:08:00 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499827, queueID=6C78B564F87 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19353 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAxNSB0byAyMiwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KVGhpcmQgb3V0 cmVhY2h5IGludGVybnNoaXAgYmxvZw0Kb3BhbSAyLjQuMCBpcyBvdXQhDQp4LW9jYW1sLCBub3Rl Ym9va3MgYXMgYSB3ZWJjb21wb25lbnQNCkR1bmUgZGV2IG1lZXRpbmcNCkx3dC42LjAuMH5hbHBo YSAoZGlyZWN0LXN0eWxlKQ0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNClRoaXJkIG91 dHJlYWNoeSBpbnRlcm5zaGlwIGJsb2cNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvdGhpcmQt b3V0cmVhY2h5LWludGVybnNoaXAtYmxvZy8xNjk4NC8xPg0KDQoNCk1hdHRoZXcgSWR1bmdhZmEg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbyBldmVyeW9uZSwgaXQn cyB0aGUgbWlkLXBvaW50IG9mIG15IG91cmVhY2h5IGludGVybnNoaXAgd2l0aCBEdW5lDQogIGFu ZCBoZXJlJ3MgbXkgdGhpcmQgYmxvZyBbcG9zdF0NCg0KICBJbiB0aGlzIGFydGljbGUsIEkgdGFs ayBhIGJpdCBtb3JlIGFib3V0IHRoZSBvY2FtbCBlY29zeXN0ZW0gaW4NCiAgZ2VuZXJhbCBhbmQg b2ZmZXIgc29tZSBpbnNpZ2h0cyB0byBkZXZzIHdobyB3b3VsZCB3YW50IHRvIGNvbnRyaWJ1dGUN CiAgdG8gdGhlIG9jYW1sIGVjb3N5dGVtIGluIHN1YnNlcXVlbnQgaW50ZXJuc2hpcHMuDQoNCg0K W3Bvc3RdDQo8aHR0cHM6Ly9tZWRpdW0uY29tL0BtYXR0aWR1bmdhZmEvb3V0cmVhY2h5LWJsb2ct My10aGluay1hYm91dC15b3VyLWF1ZGllbmNlLWFkNWYwOWY0ZmRhMz4NCg0KDQpvcGFtIDIuNC4w IGlzIG91dCENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9w YW0tMi00LTAtaXMtb3V0LzE2OTg5LzE+DQoNCg0KS2F0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIFdl IGFyZSBleHRyZW1lbHkgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2Ygb3BhbSAyLjQu MCBhbmQNCiAgZW5jb3VyYWdlIGFsbCB1c2VycyB0byB1cGdyYWRlLg0KDQoNCldoYXTigJlzIG5l dz8gU29tZSBoaWdobGlnaHRzOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCi IDpkcmFnb25fZmFjZTogKk9uIGBvcGFtIGluaXQnIHRoZSBjb21waWxlciogY2hvc2VuIGZvciB0 aGUgZGVmYXVsdA0KICAgIHN3aXRjaCB3aWxsICpubyBsb25nZXIgYmUgYG9jYW1sLXN5c3RlbScq IChbIzM1MDldKSBUaGlzIHdhcyBkb25lDQogICAgYmVjYXVzZSB0aGUgc3lzdGVtIGNvbXBpbGVy IChhcy1pcyB5b3VyIG9jYW1sIGluc3RhbGxlZCBzeXN0ZW0gd2lkZSwNCiAgICBlLmcuIC91c3Iv YmluL29jYW1sKSBpcyBrbm93biB0byBiZSB1bmRlci10ZXN0ZWQgYW5kIHByb25lIHRvIGENCiAg ICB2YXJpZXR5IG9mIGJ1Z3MgYW5kIGNvbmZpZ3VyYXRpb24gaXNzdWVzLiAgUmVtb3ZpbmcgaXQg ZnJvbSB0aGUNCiAgICBkZWZhdWx0IGNvbXBpbGVyIGFsbG93cyBuZXctY29tZXJzIGEgbW9yZSBz bW9vdGggZXhwZXJpZW5jZS4gICpOb3RlOg0KICAgIGlmIHlvdSB3aXNoIHRvIHVzZSBpdCBhbnl3 YXksIHlvdSBhcmUgYWx3YXlzIGFibGUgdG8gZG8gaXQNCiAgICBleHBsaWNpdGx5IHVzaW5nIGBv cGFtIGluaXQgLS1jb21waWxlcj1vY2FtbC1zeXN0ZW0nKg0KDQogIOKAoiA6ZHJhZ29uOiBJbiB0 aGUgc2FtZSB2ZWluLCAqYG9wYW0gc3dpdGNoIGNyZWF0ZSBbbmFtZV0gPHZlcnNpb24+Jw0KICAg IHdpbGwgbm90KiBpbmNsdWRlIGNvbXBpbGVyIHBhY2thZ2VzICpmbGFnZ2VkIHdpdGggYGF2b2lk LXZlcnNpb24nIC8NCiAgICBgZGVwcmVjYXRlZCcqIGluIHRoZSBnZW5lcmF0ZWQgaW52YXJpYW50 IGFueW1vcmUsIHVubGVzcyBjb21waWxlcg0KICAgIGZsYWdnZWQgYGF2b2lkLXZlcnNpb24nIC8g YGRlcHJlY2F0ZWQnIGFyZSB0aGUgb25seSBvbmVzIGF2YWlsYWJsZQ0KICAgIChbIzY0OTRdKSAq Tm90ZTogaWYgeW91IHdpc2ggdG8gdXNlIGBvY2FtbC1zeXN0ZW0nLCB5b3UgY2FuIHNpbXBseQ0K ICAgIHNheSBpdCBleHBsaWNpdGx5IHVzaW5nIGBvcGFtIHN3aXRjaCBjcmVhdGUgW25hbWVdIG9j YW1sLXN5c3RlbScqDQoNCiAg4oCiIDp5YXJuOiAqYG9wYW0gaW5zdGFsbCAtLWRlcHMtb25seScg bm8gbG9uZ2VyIHJlcXVpcmVzIHVuaWNpdHkgb2YNCiAgICBwYWNrYWdlIHZlcnNpb24qIGJldHdl ZW4gdGhlICpyZXF1ZXN0KiBhbmQgdGhlICppbnN0YWxsZWQqDQogICAgcGFja2FnZXMuIEluIG90 aGVyIHdvcmRzLCBpZiB5b3UgaGF2ZSBgcGtnLjEnIGluc3RhbGxlZCwgaW5zdGFsbGluZw0KICAg IHRoZSBkZXBlbmRlbmNpZXMgb2YgYHBrZy4yJyBubyBsb25nZXIgcmVtb3ZlcyBgcGtnLjEnIGlm IHRoZQ0KICAgIGluc3RhbGxlZCBwYWNrYWdlcyBhcmUgY29tcGF0aWJsZS4gVGhpcyBhbHNvIGFs bG93cyB0byBpbnN0YWxsDQogICAgZGVwZW5kZW5jaWVzIG9mIGNvbmZsaWN0aW5nIHBhY2thZ2Vz IHdoZW4gdGhlaXIgZGVwZW5kZW5jaWVzIGFyZQ0KICAgIGNvbXBsaWFudC4gKFsjNjUyMF0pDQoN CiAg4oCiIDpjYW1lbDogR05VICpgcGF0Y2gnKiBhbmQgdGhlICpgZGlmZicqIGNvbW1hbmQgYXJl ICpubyBsb25nZXINCiAgICBydW50aW1lIGRlcGVuZGVuY2llcyouIEluc3RlYWQgdGhlIE9DYW1s IGBwYXRjaCcgbGlicmFyeSBpcyB1c2VkDQogICAgKFsjNjAxOV0sIFsjNjA1Ml0sIFsjMzc4Ml0s IFtvY2FtbC9zZXR1cC1vY2FtbCM5MzNdKSBEb2luZyB0aGlzDQogICAgd2UndmUgcmVtb3ZlZCBz b21lIHJhcmVseSB1c2VkIGZlYXR1cmVzIG9mIEdOVSBQYXRjaCBzdWNoIGFzIHRoZQ0KICAgIHN1 cHBvcnQgb2YgW0NvbnRleHQgZGlmZnNdLiAgVGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvbmx5IHN1 cHBvcnRzDQogICAgW1VuaWZpZWQgZGlmZnNdIGluY2x1ZGluZyB0aGUgW2dpdCBleHRlbmRlZCBo ZWFkZXJzXSwgaG93ZXZlciBmaWxlDQogICAgcGVybWlzc2lvbiBjaGFuZ2VzIHZpYSBzYWlkIGV4 dGVuZGVkIGhlYWRlcnMgaGF2ZSBubyBlZmZlY3QuDQoNCiAg4oCiIDpzbm93Zmxha2U6IEFkZCAq Tml4IHN1cHBvcnQqIGZvciAqZXh0ZXJuYWwgZGVwZW5kZW5jaWVzIChkZXBleHRzKSoNCiAgICBi eSBhZGRpbmcgc3VwcG9ydCBmb3Igc3RhdGVsZXNzIHBhY2thZ2UgbWFuYWdlcnMgKFsjNTk4Ml0p LiAqVGhhbmtzDQogICAgdG8gW0BSeWFuR2liYl0gZm9yIHRoaXMgY29udHJpYnV0aW9uKg0KDQog IOKAoiA6Y29ja3JvYWNoOiAqRml4IGBvcGFtIGluc3RhbGwgPGxvY2FsX2Rpcj4nKiB3aXRoIGFu ZCB3aXRob3V0DQogICAgb3B0aW9ucyBsaWtlIGAtLWRlcHMtb25seScgb3IgYC0tc2hvdy1hY3Rp b24nIGhhdmluZyAqdW5leHBlY3RlZA0KICAgIGJlaGF2aW91cnMqIChbIzYyNDhdLCBbIzU1Njdd KSBzdWNoIGFzOg0KICAgIOKAoyByZXBvcnRpbmcgYE5vdGhpbmcgdG8gZG8nIGRlc3BpdGUgZGVw ZW5kZW5jaWVzIG9yIHBhY2thZ2Ugbm90DQogICAgICBiZWluZyB1cC10by1kYXRlDQogICAg4oCj IGFza2luZyB0byBpbnN0YWxsIHRoZSB3cm9uZyBkZXBlbmRlbmNpZXMNCg0KICDigKIgOndpbmRv dzogVGhlIHByZWJ1aWx0ICpXaW5kb3dzIGJpbmFyeSBub3cgaW5jbHVkZXMgQ3lnd2luJ3MNCiAg ICBgc2V0dXAteDg2XzY0LmV4ZScqIGluIHRoZSBiaW5hcnkgaXRzZWxmIGFzICpmYWxsYmFjayog aW4gY2FzZQ0KICAgIGBjeWd3aW4uY29tJyBpcyBpbmFjY2Vzc2libGUgKFsjNjUzOF0pLiBPcGFt IHdpbGwgYWxzbyBubyBsb25nZXINCiAgICBmYWlsIGlmIGBjeWd3aW4uY29tJyBpcyBpbmFjY2Vz c2libGUgd2hlbiBjaGVja2luZyBmb3IgdXBncmFkZXMgb2YNCiAgICBgc2V0dXAteDg2XzY0LmV4 ZScgKFsjNjQ5NV0sIFsjNjQ3NF0pDQoNCiAg4oCiIDpvY2VhbjogTWFueSBtb3JlIFVJIGFkZGl0 aW9ucyBhbmQgaW1wcm92ZW1lbnRzLCBidWcgZml4ZXMsIOKApg0KDQogIDpvcGVuX2Jvb2s6IFlv dSBjYW4gcmVhZCBvdXIgW2Jsb2cgcG9zdF0gZm9yIHRoZSBmdWxsIGxpc3Qgb2YNCiAgaW1wb3J0 YW50IGNoYW5nZXMsIGFuZCBmb3IgZXZlbiBtb3JlIGRldGFpbHMgeW91IGNhbiB0YWtlIGEgbG9v ayBhdA0KICB0aGUgW3JlbGVhc2Ugbm90ZV0gb3IgdGhlIFtjaGFuZ2Vsb2ddLg0KDQoNClsjMzUw OV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy8zNTA5Pg0KDQpbIzY0OTRd IDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9wdWxsLzY0OTQ+DQoNClsjNjUyMF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy82NTIwPg0KDQpbIzYwMTldIDxodHRw czovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1ZXMvNjAxOT4NCg0KWyM2MDUyXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0vaXNzdWVzLzYwNTI+DQoNClsjMzc4Ml0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy8zNzgyPg0KDQpbb2NhbWwvc2V0dXAtb2NhbWwj OTMzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL3NldHVwLW9jYW1sL3B1bGwvOTMzPg0KDQpb Q29udGV4dCBkaWZmc10NCjxodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2RpZmZ1dGlscy9t YW51YWwvaHRtbF9ub2RlL0V4YW1wbGUtQ29udGV4dC5odG1sPg0KDQpbVW5pZmllZCBkaWZmc10N CjxodHRwczovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2RpZmZ1dGlscy9tYW51YWwvaHRtbF9ub2Rl L0V4YW1wbGUtVW5pZmllZC5odG1sPg0KDQpbZ2l0IGV4dGVuZGVkIGhlYWRlcnNdIDxodHRwczov L2dpdC1zY20uY29tL2RvY3MvZGlmZi1mb3JtYXQ+DQoNClsjNTk4Ml0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vcGFtL2lzc3Vlcy81OTgyPg0KDQpbQFJ5YW5HaWJiXSA8aHR0cHM6Ly9naXRo dWIuY29tL1J5YW5HaWJiPg0KDQpbIzYyNDhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3Bh bS9pc3N1ZXMvNjI0OD4NCg0KWyM1NTY3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0v aXNzdWVzLzU1Njc+DQoNClsjNjUzOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtL2lz c3Vlcy82NTM4Pg0KDQpbIzY0OTVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9pc3N1 ZXMvNjQ5NT4NCg0KWyM2NDc0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vaXNzdWVz LzY0NzQ+DQoNCltibG9nIHBvc3RdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0y LTQtMC8+DQoNCltyZWxlYXNlIG5vdGVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS9y ZWxlYXNlcy90YWcvMi40LjA+DQoNCltjaGFuZ2Vsb2ddIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb3BhbS9ibG9iLzIuNC4wL0NIQU5HRVM+DQoNCg0KVHJ5IGl0IQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWMDQoNCiAgVGhlIHVwZ3JhZGUgaW5zdHJ1Y3Rpb25zIGFyZSB1bmNoYW5nZWQ6DQoNCiAg Rm9yIFVuaXggc3lzdGVtcw0KICDilIzilIDilIDilIDilIANCiAg4pSCIGJhc2ggLWMgInNoIDwo Y3VybCAtZnNTTCBodHRwczovL29wYW0ub2NhbWwub3JnL2luc3RhbGwuc2gpIC0tdmVyc2lvbiAy LjQuMCINCiAg4pSU4pSA4pSA4pSA4pSADQogIG9yIGZyb20gUG93ZXJTaGVsbCBmb3IgV2luZG93 cyBzeXN0ZW1zDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgSW52b2tlLUV4cHJlc3Npb24gIiYg eyAkKEludm9rZS1SZXN0TWV0aG9kIGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvaW5zdGFsbC5wczEp IH0gLVZlcnNpb24gMi40LjAiDQogIOKUlOKUgOKUgOKUgOKUgA0KICBQbGVhc2UgcmVwb3J0IGFu eSBpc3N1ZXMgdG8gdGhlIFtidWctdHJhY2tlcl0uDQoNCiAgSGFwcHkgaGFja2luZywgPD4gPD4g VGhlIG9wYW0gdGVhbSA8PiA8PiA6Y2FtZWw6DQoNCiAgL0knZCBhbHNvIGxpa2UgdG8gcGVyc29u YWxseSBnaXZlIGEgc3BlY2lhbCB0aGFua3MgdG8gdGhlIHdob2xlDQogIGhhZW1hdG9sb2d5IGRl cGFydG1lbnQgb2YgdGhlIE5IUyBHcmVhdGVyIEdsYXNnb3cgZm9yIG1ha2luZyBteQ0KICBjb250 aW51ZWQgZXhpc3RlbmNlIGFuZCB0aGlzIHJlbGVhc2Ug4oCTIGluIHRoZSBzdGF0ZSB0aGF0IGl0 IGlzIOKAkw0KICBwb3NzaWJsZS4gRmlnaHRpbmcgY2FuY2VyIGlzIG5vdCBlYXN5IGJ1dCBpdCBp cyBtdWNoIG1vcmUgYmVhcmFibGUNCiAgd2l0aCBncmVhdCBwZW9wbGUgPDMvDQoNCg0KW2J1Zy10 cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0vaXNzdWVzPg0KDQoNCkthdGUg bGF0ZXIgYWRkZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIFtOT1RFXSBXZSBoYXZlIGhhZCByZXBvcnRzIG9mIGEgcmVncmVzc2lvbiBpbiBz b21lIGNhc2VzIHdoZW4gdXNpbmcNCiAgW2BwaW4tZGVwZW5kcyddLiBXZSBoYXZlIGEgZml4IGFu ZCB3ZSdyZSBwbGFubmluZyB0byBoYXZlIDIuNC4xIG91dCBpbg0KICBhIGNvdXBsZSBkYXlzLg0K DQoNCltgcGluLWRlcGVuZHMnXQ0KPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvZG9jL01hbnVhbC5o dG1sI29wYW1maWVsZC1waW4tZGVwZW5kcz4NCg0KDQp4LW9jYW1sLCBub3RlYm9va3MgYXMgYSB3 ZWJjb21wb25lbnQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LXgtb2NhbWwtbm90ZWJvb2tzLWFzLWEtd2ViY29tcG9uZW50LzE2OTk2LzE+DQoNCg0KYXJ0LXcg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBEZWFyIGludGVybmV0cywNCg0KICBJIHdvdWxkIGxpa2UgdG8gc2hhcmUgW2B4LW9jYW1s J10sIGEgbGl0dGxlIHByb2plY3QgdG8gbWFrZSBpdCBlYXNpZXINCiAgdG8gc2hhcmUgZXhlY3V0 YWJsZSBPQ2FtbCBleGFtcGxlcyBvbiB0aGUgd2ViLiBUbyBlbmFibGUgcmVhZGVycyB0bw0KICBl eHBlcmltZW50IHdpdGggdGhlIGNvZGUsIGB4LW9jYW1sJyBpbnRlZ3JhdGVzIHRoZSBDb2RlTWly cm9yIGVkaXRvcg0KICB3aXRoIHRoZSBganNfb2Zfb2NhbWwtdG9wbGV2ZWwnIGludGVycHJldGVy LCBNZXJsaW4gYW5kDQogIE9DYW1sZm9ybWF0LiBZb3Ugb25seSBuZWVkIHRvIGFkZCB0aGUgZm9s bG93aW5nIGluIHlvdXIgaHRtbCBwYWdlIHRvDQogIHVzZSBpdDoNCg0KICDilIzilIDilIDilIDi lIANCiAg4pSCIDxzY3JpcHQgYXN5bmMNCiAg4pSCICAgc3JjPSJodHRwczovL2Nkbi5qc2RlbGl2 ci5uZXQvZ2gvYXJ0LXcveC1vY2FtbC5qc0A1L3gtb2NhbWwuanMiDQogIOKUgiAgIHNyYy13b3Jr ZXI9Imh0dHBzOi8vY2RuLmpzZGVsaXZyLm5ldC9naC9hcnQtdy94LW9jYW1sLmpzQDUveC1vY2Ft bC53b3JrZXIrZWZmZWN0cy5qcyINCiAg4pSCID48L3NjcmlwdD4NCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgVGhpcyBzY3JpcHQgd2lsbCBpbnRyb2R1Y2UgYSBuZXcgSFRNTCB0YWcgYDx4LW9jYW1s PicgdG8gcHJlc2VudCB5b3VyDQogIE9DYW1sIGNvZGU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQog IOKUgiA8eC1vY2FtbD5sZXQgaXQgPSAiYmUiPC94LW9jYW1sPg0KICDilJTilIDilIDilIDilIAN Cg0KICBUaGUgWypvbmxpbmUgZGVtbypdIHNob3dzIGEgY291cGxlIG1vcmUgZXhhbXBsZXMgYW5k IGNvbmZpZ3VyYXRpb24NCiAgb3B0aW9ucy4gSW4gcGFydGljdWxhciwgdGhlcmUgaXMgYSBjb21t YW5kLWxpbmUgdG9vbCBpbiB0aGUgW2dpdGh1Yg0KICByZXBvXSB0byBleHBvcnQgT0NhbWwgbGli cmFyaWVzIGFuZCBsb2FkIHRoZW0gaW50byB5b3VyIHBhZ2U6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAkIHgtb2NhbWwgLS1lZmZlY3RzIGRpZ2VzdGlmLm9jYW1sIC1vIGRpZ2VzdGlmLmpz DQogIOKUgiAjIHRoZW4gdXNlIDxzY3JpcHQgYXN5bmMgc3JjPSIuLi4iIHNyYy13b3JrZXI9Ii4u LiIgc3JjLWxvYWQ9ImRpZ2VzdGlmLmpzIj4NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgSSBiZWxp ZXZlIHRoaXMgY291bGQgYmUgdmVyeSB1c2VmdWwgaW4gdHV0b3JpYWxzIG9yIGRvY3VtZW50YXRp b24gdG8NCiAgc2hvd2Nhc2UgeW91ciBmYXZvcml0ZSBPQ2FtbCBsaWJyYXJpZXMuDQoNCiAgV2hp bGUgc2VhcmNoaW5nIGhvdyB0byBpbXBsZW1lbnQgdGhpcywgSSBkaXNjb3ZlcmVkIFtza2V0Y2gu c2hdIHdoaWNoDQogIGhhZCBzbyBtYW55IGdvb2QgaWRlYXMgYW5kIHRoYXQgd2Ugc2hvdWxkIHVz ZSBhIGxvdCBtb3JlISBNeSBob3BlIGlzDQogIHRoYXQgYHgtb2NhbWwnIGNhbiBwcm92aWRlIGEg c2ltaWxhciBub3RlYm9vayBleHBlcmllbmNlIGZvciB0aGUgcmVzdA0KICBvZiB0aGUgd2ViLCBi eSBiZWluZyBlYXN5IHRvIGludGVncmF0ZSBpbiBzdGF0aWMgd2VicGFnZXMuDQoNCiAgQmVzaWRl cyB0aGUgYGpzX29mX29jYW1sJyBhdXRob3JzIGFuZCB0aGUgbWFueSBPQ2FtbCBwbGF5Z3JvdW5k cyB0aGF0DQogIGhhdmUgaW5zcGlyZWQgdGhpcyBwcm9qZWN0LCBJIHdvdWxkIGxpa2UgdG8gYWRk cmVzcyBzb21lIHNwZWNpYWwNCiAgdGhhbmtzIHRvOg0KICDigKIgQHBhdHJpY29mZXJyaXMgZm9y IHRoZSBbYGpzb28tY29kZS1taXJyb3InXSBiaW5kaW5ncywgYW5kIGZvciB0aGUNCiAgICBbYHhv Y21kJ10gdG9vbCB0byBjb252ZXJ0IG1hcmtkb3duIGZpbGVzIHRvIHVzZSBgPHgtb2NhbWw+JyB0 YWdzDQogIOKAoiBAdmRzIGZvciBpbnRlZ3JhdGluZyBNZXJsaW4gd2l0aCBqYXZhc2NyaXB0IGFu ZCBDb2RlTWlycm9yIGluDQogICAgW2BtZXJsaW4tanMnXQ0KICDigKIgQGp1bG9vIGZvciBoaXMg YXNzaXN0YW5jZSBvbiB0aGUgb2NhbWxmb3JtYXQgc3VwcG9ydA0KICDigKIgQGtheWNlZXNyayBm b3IgcmVwb3J0aW5nIGlzc3VlcyBhbmQgcmVxdWVzdGluZyBmZWF0dXJlcyB3aGljaCBoYXZlDQog ICAgbWFkZSB0aGUgdG9vbCBhIGxvdCBtb3JlIHJvYnVzdCBhbmQgdmVyc2F0aWxlISBIaXMgYmxv Z3Bvc3QNCiAgICBbIlRlc3RpbmcgeC1vY2FtbCwgT0NhbWwgbm90ZWJvb2tzIGFzIGEgV2ViQ29t cG9uZW50Il0gYWxzbyBwcm92aWRlcw0KICAgIGEgbG9uZ2VyIGV4YW1wbGUgb2Ygd2hhdCBjYW4g YmUgZG9uZSB3aXRoIGl0IChhbmQgdGhlIGxpbWl0YXRpb25zDQogICAgeW91IG1pZ2h0IHJ1biBp bnRvKQ0KDQoNCltgeC1vY2FtbCddIDxodHRwczovL2dpdGh1Yi5jb20vYXJ0LXcveC1vY2FtbD4N Cg0KWypvbmxpbmUgZGVtbypdIDxodHRwczovL2FydC13LmdpdGh1Yi5pby94LW9jYW1sLz4NCg0K W2dpdGh1YiByZXBvXSA8aHR0cHM6Ly9naXRodWIuY29tL2FydC13L3gtb2NhbWw+DQoNCltza2V0 Y2guc2hdIDxodHRwczovL3NrZXRjaC5zaD4NCg0KW2Bqc29vLWNvZGUtbWlycm9yJ10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9wYXRyaWNvZmVycmlzL2pzb28tY29kZS1taXJyb3I+DQoNCltgeG9jbWQn XSA8aHR0cHM6Ly9naXRodWIuY29tL3BhdHJpY29mZXJyaXMveG9jbWQ+DQoNCltgbWVybGluLWpz J10gPGh0dHBzOi8vZ2l0aHViLmNvbS92b29kb29zL21lcmxpbi1qcz4NCg0KWyJUZXN0aW5nIHgt b2NhbWwsIE9DYW1sIG5vdGVib29rcyBhcyBhIFdlYkNvbXBvbmVudCJdDQo8aHR0cHM6Ly9rY3Ny ay5pbmZvL29jYW1sL3gtb2NhbWwvYmxvZ2dpbmcvMjAyNS8wNi8yMC94b2NhbWwvPg0KDQoNCkR1 bmUgZGV2IG1lZXRpbmcNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWR1 bmUtZGV2LW1lZXRpbmcvMTQ5OTQvMzM+DQoNCg0KUHVuZWV0aCBDaGFnYW50aSBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lISA6Y2FtZWw6DQoNCiAgV2Ug d2lsbCBob2xkIG91ciByZWd1bGFyIER1bmUgZGV2IG1lZXRpbmcgb24gKldlZG5lc2RheSwgSnVs eSwgMjMgYXQNCiAgOTowMCBDRVQqLiBBcyB1c3VhbCwgdGhlIHNlc3Npb24gd2lsbCBiZSBvbmUg aG91ciBsb25nLg0KDQogIFdoZXRoZXIgeW91IGFyZSBhIG1haW50YWluZXIsIGEgcmVndWxhciBj b250cmlidXRvciwgYSBuZXcgam9pbmVyIG9yDQogIGp1c3QgY3VyaW91cywgeW91IGFyZSB3ZWxj b21lIHRvIGpvaW46IHRoZXNlIGRpc2N1c3Npb25zIGFyZSBvcGVuISBUaGUNCiAgZ29hbCBvZiB0 aGVzZSBtZWV0aW5ncyBpcyB0byBwcm92aWRlIGEgcGxhY2UgdG8gZGlzY3VzcyB0aGUgb25nb2lu Zw0KICB3b3JrIHRvZ2V0aGVyIGFuZCBzeW5jaHJvbml6ZSBiZXR3ZWVuIHRoZSBEdW5lIGRldmVs b3BlcnMgOnNtaWxlOg0KDQoNCjpjYWxlbmRhcjogQWdlbmRhDQrilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgYWdlbmRhIGlzIGF2YWls YWJsZSBvbiB0aGVbIG1lZXRpbmcgZGVkaWNhdGVkIHBhZ2VdLiBGZWVsIGZyZWUgdG8NCiAgYXNr IGlmIHlvdSB3YW50IHRvIGFkZCBtb3JlIGl0ZW1zIGluIGl0Lg0KDQoNClsgbWVldGluZyBkZWRp Y2F0ZWQgcGFnZV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS93aWtpL2Rldi1tZWV0 aW5nLTIwMjUtMDctMjM+DQoNCg0KOmNvbXB1dGVyOiBMaW5rcw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIE1lZXRpbmcgbGluazpbIHpv b21dDQogIOKAoiBDYWxlbmRhciBldmVudDpbIGdvb2dsZSBjYWxlbmRhcl0NCiAg4oCiIFdpa2kg d2l0aCBpbmZvcm1hdGlvbiBhbmQgcHJldmlvdXMgbm90ZXM6IFtkdW5lIHdpa2kgb24gR2l0SHVi XQ0KDQoNClsgem9vbV0NCjxodHRwczovL3VzMDZ3ZWIuem9vbS51cy9qLzg1MDk2ODc3Nzc2P3B3 ZD1jV05oVTFkSFExWk5Talp1T1VaQ1EwaDJieTlVZHowOT4NCg0KWyBnb29nbGUgY2FsZW5kYXJd DQo8aHR0cHM6Ly9jYWxlbmRhci5nb29nbGUuY29tL2NhbGVuZGFyL2VtYmVkP3NyYz1jXzVjZDY5 OGRmNjc4NGUzODViMWNkY2RjMWRiY2ExOGMwNjFmYWE5Njk1OWEwNDc4MTU2NmQzMDRkYzllYzcz MTklNDBncm91cC5jYWxlbmRhci5nb29nbGUuY29tPg0KDQpbZHVuZSB3aWtpIG9uIEdpdEh1Yl0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3dpa2k+DQoNCg0KTHd0LjYuMC4wfmFscGhh IChkaXJlY3Qtc3R5bGUpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1sd3QtNi0wLTAtYWxw aGEtZGlyZWN0LXN0eWxlLzE2OTcyLzI2Pg0KDQoNCkRlZXAgaW4gdGhpcyB0aHJlYWQsIFJhcGhh w6tsIFByb3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIHZlcnNpb24g YDYuMC4wfmFscGhhMDEnIGlzIG5vdyByZWFkeQ0KICAoPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yODIyMj4pDQoNCiAgQW55b25lIGFibGUgdG8gdGVzdCB0 aGUgcmVsZWFzZSBvbiB0aGVpciBleGlzdGluZyBjb2RlLCBJJ2Qgd2VsY29tZQ0KICB0aGUgZmVl ZGJhY2s6IGRvZXMgaXQgd29yaz8gVGhlcmUgc2hvdWxkbid0IGJlIGJyZWFrYWdlcyBidXQgdGhl bg0KICB0aGVyZSBtaWdodC4gSWYgeW91IGFyZSBub3Qgc3VyZSBob3cgdG8gdGVzdCBvciB3aGF0 IHRvIHRlc3QsIGRvbid0DQogIGhlc2l0YXRlIHRvIGFzayAob24gaGVyZSBvciB2aWEgZG0gb3Ig dmlhIGRpc2NvcmQpLg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFn Z3JlZ2F0ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtVcGNvbWluZyBP Q2FtbCBFdmVudHNdDQogIOKAoiBbTGVhcm5pbmcgT0NhbWw6IEhhdmluZyBGdW4gd2l0aCB0aGUg RnVuIE1vZHVsZV0NCiAg4oCiIFtMZWFybmluZyBPQ2FtbDogTnVtZXJpY2FsIFR5cGUgQ29udmVy c2lvbnNdDQogIOKAoiBbQ3Jlc3RpbmcgdGhlIE9DYW1sIEFJIGh1bXBzXQ0KICDigKIgW1NvbWV0 aW1lcyBpdOKAmXMganVzdCBrbm93aW5nIHdoZXJlIHRvIHRhcF0NCiAg4oCiIFtJbnRvIHRoZSBz dW5zZXQgb3IgaW50byB0aGUgZGF3bj9dDQogIOKAoiBbRmlyZXdvcmtzIGFuZCB0aGluZ3NdDQog IOKAoiBbVXNpbmcgS3l1dGFpJ3MgbG93IGxhdGVuY3kgYXVkaW8gbW9kZWxzIG9uIG1hY09TIGlu IG9uZSBjb21tYW5kXQ0KICDigKIgW09kb2MgMyBpcyBsaXZlIG9uIE9DYW1sLm9yZyFdDQoNCg0K W3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbVXBjb21p bmcgT0NhbWwgRXZlbnRzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZXZlbnRzPg0KDQpbTGVhcm5pbmcg T0NhbWw6IEhhdmluZyBGdW4gd2l0aCB0aGUgRnVuIE1vZHVsZV0NCjxodHRwczovL2JhdHNvdi5j b20vYXJ0aWNsZXMvMjAyNS8wNy8xOS9sZWFybmluZy1vY2FtbC1oYXZpbmctZnVuLXdpdGgtdGhl LWZ1bi1tb2R1bGUvPg0KDQpbTGVhcm5pbmcgT0NhbWw6IE51bWVyaWNhbCBUeXBlIENvbnZlcnNp b25zXQ0KPGh0dHBzOi8vYmF0c292LmNvbS9hcnRpY2xlcy8yMDI1LzA3LzE5L2xlYXJuaW5nLW9j YW1sLW51bWVyaWNhbC10eXBlLWNvbnZlcnNpb25zLz4NCg0KW0NyZXN0aW5nIHRoZSBPQ2FtbCBB SSBodW1wc10NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9jcmVzdGluZy10aGUtb2Nh bWwtYWktaHVtcD4NCg0KW1NvbWV0aW1lcyBpdOKAmXMganVzdCBrbm93aW5nIHdoZXJlIHRvIHRh cF0NCjxodHRwczovL3d3dy5kcmEyNy51ay9ibG9nL3BsYXRmb3JtLzIwMjUvMDcvMTgvd2hlcmUt dG8tdGFwLmh0bWw+DQoNCltJbnRvIHRoZSBzdW5zZXQgb3IgaW50byB0aGUgZGF3bj9dDQo8aHR0 cHM6Ly93d3cuZHJhMjcudWsvYmxvZy9wbGF0Zm9ybS8yMDI1LzA3LzE4L3Rocm91Z2gtYS1nbGFz cy1kYXJrbHkuaHRtbD4NCg0KW0ZpcmV3b3JrcyBhbmQgdGhpbmdzXQ0KPGh0dHBzOi8vd3d3LmRy YTI3LnVrL2Jsb2cvcGxhdGZvcm0vMjAyNS8wNy8xNy9maXJld29ya3MuaHRtbD4NCg0KW1VzaW5n IEt5dXRhaSdzIGxvdyBsYXRlbmN5IGF1ZGlvIG1vZGVscyBvbiBtYWNPUyBpbiBvbmUgY29tbWFu ZF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9reXV0YWktc3RyZWFtaW5nLXZvaWNl LW1seD4NCg0KW09kb2MgMyBpcyBsaXZlIG9uIE9DYW1sLm9yZyFdDQo8aHR0cHM6Ly9qb24ucmVj b2lsLm9yZy9ibG9nLzIwMjUvMDcvb2RvYy0zLWxpdmUtb24tb2NhbWwtb3JnLmh0bWw+DQoNCg0K T2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNz IGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0 byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVl ZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBp dCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1s aXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0 bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBz Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZl c10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxp c3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxh biBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 15 to 22, 2025.

    Third outreachy internship blog

    Matthew Idungafa announced

    Hello everyone, it's the mid-point of my oureachy internship with Dune and = here's my third blog post=20

    In this article, I talk a bit more about the ocaml ecosystem in general and= offer some insights to devs who would want to contribute to the ocaml ecos= ytem in subsequent internships.

    opam 2.4.0 is out!

    Kate announced

    Hi everyone,

    We are extremely happy to announce the release of opam 2.4.0 and encourage = all users to upgrade.

    What=E2=80=99s new? Some highlights:

    • :dragon_face: On opam init the compiler chosen for = the default switch will no longer be ocaml-system (#3509) This was done because the system compiler (as-is your ocaml installed syste= m wide, e.g. /usr/bin/ocaml) is known to be under-tested and prone to a var= iety of bugs and configuration issues. Removing it from the default compiler allows new-comers a more smooth exper= ience. Note: if you wish to use it anyway, you are always able to do it explici= tly using opam init --compiler=3Docaml-system
    • :dragon: In the same vein, opam switch create [name] <versi= on> will not include compiler packages flagged with = avoid-version / deprecated in the generated invaria= nt anymore, unless compiler flagged avoid-version / depr= ecated are the only ones available (#6494) Note: if you wish to use ocaml-system, you can simply say i= t explicitly using opam switch create [name] ocaml-system<= /li>
    • :yarn: opam install --deps-only no longer requires unic= ity of package version between the request and the installed<= /b> packages. In other words, if you have pkg.1 installed, ins= talling the dependencies of pkg.2 no longer removes pkg.= 1 if the installed packages are compatible. This also allows to inst= all dependencies of conflicting packages when their dependencies are compli= ant. (#6520)
    • :camel: GNU patch and the diff = command are no longer runtime dependencies. Instead the OCaml = patch library is used (#6019, #= 6052, #3782, = ocaml/setup-ocaml= #933) Doing this we've removed some rarely used features of GNU Patch such as the= support of Context diffs. The new implementation only supports Unified diffs includ= ing the git extended heade= rs, however file permission changes via said extended headers have no e= ffect.
    • :snowflake: Add Nix support for external dependencies (depext= s) by adding support for stateless package managers (#5982). Thanks to @RyanGibb for this contribution
    • :cockroach: Fix opam install <local_dir> with= and without options like --deps-only or --show-action having unexpected behaviours (#6248, #5567) such as:
      • reporting Nothing to do despite dependencies or package no= t being up-to-date
      • asking to install the wrong dependencies
    • :window: The prebuilt Windows binary now includes Cygwin's set= up-x86_64.exe in the binary itself as fallback in case cygwin.com is inaccessible (#6538). Opam will also no longer fail if cygwin= .com is inaccessible when checking for upgrades of setup-x86_6= 4.exe (#6495, #6474)
    • :ocean: Many more UI additions and improvements, bug fixes, =E2=80=A6

    :open_book: You can read our blog post for the full list of important changes, and for even mo= re details you can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.0"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.0"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    I'd also like to personally give a special thanks to the whole haematolo= gy department of the NHS Greater Glasgow for making my continued existence = and this release =E2=80=93 in the state that it is =E2=80=93 possible. Figh= ting cancer is not easy but it is much more bearable with great people <= 3

    Kate later added

    [NOTE] We have had reports of a regression in some cases when using pin= -depends. We have a fix and we're planning to have 2.4.1 out in = a couple days.

    x-ocaml, notebooks as a webcomponent

    art-w announced

    Dear internets,

    I would like to share x-= ocaml, a little project to make it easier to share executable OC= aml examples on the web. To enable readers to experiment with the code, x-ocaml integrates the CodeMirror editor with the js_of_oca= ml-toplevel interpreter, Merlin and OCamlformat. You only need to ad= d the following in your html page to use it:

    <scrip=
    t async
      src=3D"https://cdn.jsdelivr.net/gh/art-w/x-ocaml.js@5/x-ocaml.js"
      src-worker=3D"https://cdn.jsdelivr.net/gh/art-w/x-ocaml.js@5/x-ocaml.worker+e=
    ffects.js"
    ></script>
    

    This script will introduce a new HTML tag <x-ocaml> to p= resent your OCaml code:

    <x-oca=
    ml>let it =3D "be"</x-ocaml>
    

    The online demo sho= ws a couple more examples and configuration options. In particular, there i= s a command-line tool in the g= ithub repo to export OCaml libraries and load them into your page:

    $ x-ocaml --effects digestif.ocaml -o digestif.js
    # then use <script async src=3D"..." src-worker=3D"..." src-load=3D"dige=
    stif.js">
    

    I believe this could be very useful in tutorials or documentation to showca= se your favorite OCaml libraries.

    While searching how to implement this, I discovered sketch.sh which had so many good ideas and that we should use a = lot more! My hope is that x-ocaml can provide a similar notebo= ok experience for the rest of the web, by being easy to integrate in static= webpages.

    Besides the js_of_ocaml authors and the many OCaml playgrounds= that have inspired this project, I would like to address some special than= ks to:

    • @patricoferris for the jsoo-code-mirror bindings, and for the xocmd tool t= o convert markdown files to use <x-ocaml> tags
    • @vds for integrating Merlin with javascript and CodeMirror in merlin-js
    • @juloo for his assistance on the ocamlformat support
    • @kayceesrk for reporting issues and requesting features which have made= the tool a lot more robust and versatile! His blogpost "Testing x-ocaml, OCa= ml notebooks as a WebComponent" also provides a longer example of what = can be done with it (and the limitations you might run into)

    Dune dev meeting

    Puneeth Chaganti announced

    Hi everyone! :camel:=20

    We will hold our regular Dune dev meeting on Wednesday, July, 23 at 9:00= CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are open! The goal of th= ese meetings is to provide a place to discuss the ongoing work together and= synchronize between the Dune developers :smile:=20

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Lwt.6.0.0~alpha (direct-style)

    Deep in this thread, Rapha=C3=ABl Proust announced

    version 6.0.0~alpha01 is now ready (https://github.com/ocaml/opam-reposit= ory/pull/28222)

    Anyone able to test the release on their existing code, I'd welcome the fee= dback: does it work? There shouldn't be breakages but then there might. If = you are not sure how to test or what to test, don't hesitate to ask (on her= e or via dm or via discord).

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=k7k4A/cG; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=CqJpD4UP; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D3AA7400C1 for ; Tue, 29 Jul 2025 09:36:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=oeRw93cSp+PSiOzCboUXaZT2mpurCDhCFQv6Dxeo5Hg=; b=k7k4A/cGCdaBq2q5++n4X9GF1VtoSUJw1nuU4C/NSVPqxSajPhRJ76Ad OYWtj7ptxScQyGc8uYKj7Pl2X3W46HcIUxfCgjwobvk5N1D+ISd6LHCXX dFX5MUMCaPlDHU6ahPJIZsLXWtnk3VLCB+2ZQUODsCqGJSjai+ZGyzl0G 8=; X-CSE-ConnectionGUID: x8p1P1XKTTq6oLn9WNis4A== X-CSE-MsgGUID: d/3Pm38pREeMSpj519QhyQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.16,348,1744063200"; d="scan'208,217";a="233464715" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 29 Jul 2025 11:36:31 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 63C84E0CD5; Tue, 29 Jul 2025 11:36:31 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 7DDBAE0171 for ; Tue, 29 Jul 2025 11:36:29 +0200 (CEST) X-CSE-ConnectionGUID: nHSVLMmeQZ29FoLxiJSt/Q== X-CSE-MsgGUID: kdafnZYgQPK8X5i3MuBbFQ== IronPort-SDR: 6888961c_qMUBRvTG8IxPLOSrh/9s4D66SPTaHRddPUgYwbbkgAk7oMO f6v6C0VKiEV1pVTnrMIxAbdM1xQEWa4JyNTIqmw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GaAgBdlYhojyIeaIFaFoQHWygZAWAGWjMHCElhgzg8g?= =?us-ascii?q?0+FLIh2gRaQN4hLgjCCegMYFiMVAQMBDS4BGwQBAgQBAQMBAgGCDIJ0AhaMA?= =?us-ascii?q?wIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBA?= =?us-ascii?q?QEBATkFSYV7DYJFUXFhBAMGNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQIIBAECQE4OCQQGEwEBKAoGGCMDEAQBBgMCBA0BN?= =?us-ascii?q?QMBEwESGoJoAYIhAksDBAEMBpoVm0t6fzOBAYIMAQEGgQg+AwsCBQEOCSbaC?= =?us-ascii?q?4EaSgmBSYVtgkoaASpIawKESIQ8Jw+BVUSBFYJyB2+BUG8LFwEBAQEYgRAUA?= =?us-ascii?q?QFNCYMlgmmCJoECFB2BQII+gjOBKkOCHSYCJoVEggEBA4ZKgUQiAyYzLAFVE?= =?us-ascii?q?xcLBwVbgQgDKjQxbjIdgSeFGIQoK0+FEIEZg1MRE20PBoEVg2pAAwttPTcUG?= =?us-ascii?q?5MlFykZglkCDj4+PgQPAQcRAxAaBgIkElwZGysBHgsNkn4JERcqA3SxYDQHh?= =?us-ascii?q?B+BXgYMiQiBJpYFhASBV4s8hwKLC4dHIphkIoI2hycKgRwJgW9rlWAIMYUgg?= =?us-ascii?q?X8jgVwzGjBDgmcJRhwPj1UBCYJCQX2BJoE7OTu5c0E1AgEBOAIHAQoBAQMJh?= =?us-ascii?q?UUdAQGLO4FLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:1E51S6gnCsLychdyE+mvAQssh3BQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3A0yHG0mnSNkX1fWV8QoLSwz/2Y4XXOXv990n0Bkq?= =?us-ascii?q?1MFQzGZOSbU+R2ph41PM7zg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3AWnO4sw7lshyVIhQA65wO2zZmxoxr762gDnI8nqw?= =?us-ascii?q?+mJm0aC0rHiq3hhqOF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.16,348,1744063200"; d="scan'208,217";a="233464680" X-MGA-submission: =?us-ascii?q?MDFrL8UvKcaP39yc9FRnWNVD4ZfQ7NLXnJQfKQ?= =?us-ascii?q?Z3n6Or98m31Q/j5yltHSA7rSxvOyeDBgb2m8PsXZxbNGxJAynZrrsfUq?= =?us-ascii?q?0VlW0sAg1Mp6QcBIiGIcyCz58V5bneXiBM5mf7otNU2htMaQKuOzWtW0?= =?us-ascii?q?VZ6kbqzlNttbLXHhUvqKFYPA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Jul 2025 11:36:28 +0200 Received: from TM.local (88-176-91-141.subs.proxad.net [88.176.91.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2A440564E9A; Tue, 29 Jul 2025 11:36:27 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1753781787; bh=D3Om6AWgnav7iJZ8Qd+2byS/cGy7hPg3fnHRX0edjz8=; h=From:To:Subject:Date:Message-ID; b=CqJpD4UP/6Y9FbINVv1704NIhKh2jsfSh4IgJU4op+5bZu1qwsge2QAyjUh80WFWW wXHBoShp9RxmzaIVeo71jiOu6VcMhl1G64dvDWeyi6PkhY7Y2p8+7DxGvJENS1XEnF tLRLuw5WgV+QW5+GFvHzOk/eDwbYswowJtDKZExE= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 29 Jul 2025 11:36:26 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jul 29 11:36:27 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.392631, queueID=92C9F564EA3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19356 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAyMiB0byAyOSwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0Kb3BhbSAyLjQu MQ0KbmV3IHRvb2xzIHRvIGtlZXAgeW91ciBwcm9qZWN0cyBjbGVhbiAoYWZ0ZXIgQUksIG9yIGp1 c3QgYWZ0ZXIgeW91cnNlbGYpDQpGaXJzdCBiZXRhIHJlbGVhc2UgZm9yIE9DYW1sIDUuNC4wDQpF bmNvZGluZyBTQVQgaW4gT0NhbWwgR0FEVHMNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0K DQpvcGFtIDIuNC4xDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl OiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGFtLTItNC0xLzE3MDAyLzE+DQoN Cg0KS2F0ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIEZvbGxvd2luZyB1cCB0aGUgcmVncmVzc2lvbiBb cmVwb3J0ZWQgYSBjb3VwbGUgb2YgZGF5cyBhZ29dIGFmZmVjdGluZw0KICBzb21lIHVzZXJzIG9m IGBwaW4tZGVwZW5kcycsIHdlIGFyZSByZWxlYXNpbmcgMi40LjEuDQoNCiAgWW91IGNhbiByZWFk IG91ciBbYmxvZyBwb3N0XSBmb3IgcmVsZXZhbnQgbGlua3MgYW5kIGRldGFpbHMuDQoNCg0KW3Jl cG9ydGVkIGEgY291cGxlIG9mIGRheXMgYWdvXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb3BhbS0yLTQtMC1pcy1vdXQvMTY5ODkvMz4NCg0KW2Jsb2cgcG9zdF0gPGh0dHBzOi8v b3BhbS5vY2FtbC5vcmcvYmxvZy9vcGFtLTItNC0xLz4NCg0KVHJ5IGl0IQ0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgVGhlIHVwZ3JhZGUgaW5zdHJ1Y3Rpb25zIGFyZSB1bmNoYW5nZWQ6DQoN CiAgRm9yIFVuaXggc3lzdGVtcw0KICDilIzilIDilIDilIDilIANCiAg4pSCIGJhc2ggLWMgInNo IDwoY3VybCAtZnNTTCBodHRwczovL29wYW0ub2NhbWwub3JnL2luc3RhbGwuc2gpIC0tdmVyc2lv biAyLjQuMSINCiAg4pSU4pSA4pSA4pSA4pSADQogIG9yIGZyb20gUG93ZXJTaGVsbCBmb3IgV2lu ZG93cyBzeXN0ZW1zDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgSW52b2tlLUV4cHJlc3Npb24g IiYgeyAkKEludm9rZS1SZXN0TWV0aG9kIGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvaW5zdGFsbC5w czEpIH0gLVZlcnNpb24gMi40LjEiDQogIOKUlOKUgOKUgOKUgOKUgA0KICBQbGVhc2UgcmVwb3J0 IGFueSBpc3N1ZXMgdG8gdGhlIFtidWctdHJhY2tlcl0uDQoNCiAgSGFwcHkgaGFja2luZywgPD4g PD4gVGhlIG9wYW0gdGVhbSA8PiA8PiA6Y2FtZWw6DQoNCg0KW2J1Zy10cmFja2VyXSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29wYW0vaXNzdWVzPg0KDQoNCm5ldyB0b29scyB0byBrZWVwIHlv dXIgcHJvamVjdHMgY2xlYW4gKGFmdGVyIEFJLCBvciBqdXN0IGFmdGVyIHlvdXJzZWxmKQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbmV3LXRvb2xzLXRvLWtlZXAteW91 ci1wcm9qZWN0cy1jbGVhbi1hZnRlci1haS1vci1qdXN0LWFmdGVyLXlvdXJzZWxmLzE3MDA0LzE+ DQoNCg0KVGhvbWFzIEdhemFnbmFpcmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIaSBhbGwsDQoNCiAgSeKAmXZlIGJlZW4gZXhwZXJpbWVudGluZyB3aXRoIEFJIGNv ZGUgYXNzaXN0YW50cyBsYXRlbHkuIFRoZXnigJlyZQ0KICBzdXJwcmlzaW5nbHkgZ29vZCBhdCBn ZW5lcmF0aW5nIG5ldyBjb2RlIGJ1dCBpdCdzIG5vdCB2ZXJ5IGdvb2QgYXQNCiAgcmVtZW1iZXJp bmcgdGhpbmdzOiBpdCdzIGxpa2UgaGF2aW5nIGEgc3RlYWR5IHN0cmVhbSBvZiBnb29kIGludGVy bnMNCiAgc3BlbmRpbmcgYSBmZXcgbW9udGhzIG9uIGEgcHJvamVjdCB0byBleHBhbmQgaXQgaW4g b25lIGRpcmVjdGlvbiBhbmQNCiAgdGhlbiBqdXN0IGRpc2FwcGVhcmluZy4gVGhleSBwcm9kdWNl IGEgbG90IG9mIGNvZGUgcXVpY2tseSwgYnV0IHRoYXQNCiAgYWxzbyBtZWFucyB0aGV5IGxlYXZl IGEgbG90IGJlaGluZDogdW51c2VkIGRlZmluaXRpb25zLCBpbmNvbnNpc3RlbnQNCiAgc3R5bGUs IGFuZCBoYWxmLWZpbmlzaGVkIHJlZmFjdG9yaW5ncy4NCg0KICBTaW5jZSBJIGNvdWxkbuKAmXQg a2VlcCB1cCB3aXRoIHJldmlld2luZyBjb2RlIGF0IHRoZSBzcGVlZCB0aGVzZSBBSQ0KICBhc3Np c3RhbnRzIGdlbmVyYXRlIGl0LCBJIGVuZGVkIHVwIHdyaXRpbmcgKHdpdGggdGhlaXIgaGVscCkg YSBjb3VwbGUNCiAgb2YgdG9vbHMgdG8gY2xlYW4gdGhpbmdzIHVwLg0KDQogIOKAoiBbYHBydW5l J106IHJlbW92ZXMgdG9wLWxldmVsIGRlZmluaXRpb25zICh2YWx1ZXMsIHR5cGVzLA0KICAgIGNv bnN0cnVjdG9ycywgZXRjLikgdGhhdCBhcmUgZXhwb3NlZCBpbiBgLm1saScgZmlsZXMgYnV0IHVu dXNlZA0KICAgIGVsc2V3aGVyZSBpbiB0aGUgY29kZWJhc2UuIEl0IHJlbGllcyBvbiBgbWVybGlu IG9jY3VycmVuY2VzJyB0byBmaW5kDQogICAgdW51c2VkIGlkZW50aWZpZXJzIGFuZCBwYXJzZXMg Y29tcGlsZXIgd2FybmluZ3MgdG8gY2xlYW4gdXAgYW55DQogICAgYnJlYWthZ2UgKHNlZSBbd2Fy bmluZy5tbGldIGZvciB0aGUgZnVsbCBsaXN0IG9mIGhhbmRsZWQgY2FzZXMpLg0KDQogIOKAoiBb YG1lcmxpbnQnXTogcnVucyBhIHNldCBvZiBzbWFsbCBzdGF0aWMgY2hlY2tzIHVzaW5nIE1lcmxp biwNCiAgICBgcHB4bGliJywgYW5kIHNvbWUgYmFzaWMgRHVuZSBmaWxlIHBhcnNpbmcuIEl0IGxv b2tzIGZvciB0aGluZ3MgbGlrZQ0KICAgIGNvZGUgY29tcGxleGl0eSwgZG9jdW1lbnRhdGlvbiBz dHlsZSwgdGVzdCBvcmdhbmlzYXRpb24sIGV0Yy4gVGhpcw0KICAgIGlzIGFsbCB2ZXJ5IHNwZWNp ZmljIHRvIG15IG93biBzdHlsZSBvZiB3cml0aW5nIE9DYW1sIGNvZGUgYnV0IGNhbg0KICAgIGJl IG1hZGUgY29uZmlndXJhYmxlIChhIGJpdCkuIFNlZSBbaGVyZV0gZm9yIHRoZSBmdWxsIGxpc3Qg b2YgcnVsZXMNCiAgICAoc3VnZ2VzdGlvbnMgd2VsY29tZSB0byBhZGQvY2hhbmdlIHNvbWUgb2Yg dGhlbSkuDQoNCiAgSSBvcmlnaW5hbGx5IHdyb3RlIHRoZXNlIHRvIGRlYWwgd2l0aCBBSS1nZW5l cmF0ZWQgY29kZSwgYnV0IHRoZXnigJl2ZQ0KICBiZWVuIHVzZWZ1bCBvbiBtb3JlIGNvbnZlbnRp b25hbCBPQ2FtbCBwcm9qZWN0cyB0b28sIGVzcGVjaWFsbHkgb2xkZXINCiAgb25lcyBvciBvbmVz IHdpdGggbWFueSBjb250cmlidXRvcnMgb3IgdGhlIG9uZXMgdGhhdCBJIHdyb3RlIGEgbG9uZw0K ICB0aW1lIGFnby4NCg0KICBCb3RoIGFyZSBzdGlsbCBldm9sdmluZyBidXQgdGhleeKAmXZlIG1h ZGUgbXkgd29ya2Zsb3cgYSBiaXQgc21vb3RoZXINCiAgYWxyZWFkeS4gRmVlZGJhY2sgYW5kIHN1 Z2dlc3Rpb25zIHdlbGNvbWUuIEknbSBzdGlsbCB1bmRlY2lkZWQgaWYgSQ0KICBzaG91bGQgcHVi bGlzaCB0aG9zZSB0byBgb3BhbScgb3Igbm90Lg0KDQogIFRob21hcw0KDQoNCltgcHJ1bmUnXSA8 aHR0cHM6Ly9naXRodWIuY29tL3NhbW9odC9wcnVuZT4NCg0KW3dhcm5pbmcubWxpXQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9zYW1vaHQvcHJ1bmUvYmxvYi9tYWluL2xpYi93YXJuaW5nLm1saT4NCg0K W2BtZXJsaW50J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9zYW1vaHQvbWVybGludD4NCg0KW2hlcmVd IDxodHRwczovL3NhbW9odC5naXRodWIuaW8vbWVybGludC8+DQoNCg0KRmlyc3QgYmV0YSByZWxl YXNlIGZvciBPQ2FtbCA1LjQuMA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9m aXJzdC1iZXRhLXJlbGVhc2UtZm9yLW9jYW1sLTUtNC0wLzE3MDA5LzE+DQoNCg0Kb2N0YWNocm9u IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgVHdvIG1vbnRocyBhZnRlciB0aGUgcmVsZWFzZSBvZiB0aGUgZmly c3QgYWxwaGEgZm9yIE9DYW1sIDUuNC4wLCB0aGUNCiAgcmVsZWFzZSBvZiBPQ2FtbCA1LjQuMCBp cyBkcmF3aW5nIG5lYXIuDQoNCiAgVGhlIGludGVybmFsIEFQSSBvZiB0aGUgY29tcGlsZXIgbGli cmFyaWVzIGhhcyBiZWVuIGZyb3plbiwgYW5kIG1vc3QNCiAgY29yZSBkZXZlbG9wZXIgdG9vbHMg c3VwcG9ydCAob3Igd2lsbCBzdXBwb3J0IHNvb24pIHRoZSBuZXcgdmVyc2lvbiBvZg0KICB0aGUg Y29tcGlsZXIuDQoNCiAgV2UgaGF2ZSB0aHVzIHJlbGVhc2VkIGEgZmlyc3QgYmV0YSB2ZXJzaW9u IG9mIE9DYW1sIDUuNC4wIHRvIGhlbHAgeW91DQogIHVwZGF0ZSB5b3VyIHNvZnR3YXJlcyBhbmQg bGlicmFyaWVzIGFoZWFkIG9mIHRoZSByZWxlYXNlIChzZWUgYmVsb3cNCiAgZm9yIHRoZSBpbnN0 YWxsYXRpb24gaW5zdHJ1Y3Rpb25zKSBbXjFdLg0KDQogIENvbXBhcmVkIHRvIHRoZSBmaXJzdCBh bHBoYSByZWxlYXNlLCB0aGlzIGJldGEgcmVsZWFzZSBicmluZ3MgdHdvDQogIG5vdGFibGUgY2hh bmdlcy4gRmlyc3QsIHRoaXMgYmV0YSBwYXJ0aWFsbHkgcmV2ZXJ0cyB0aGUgY2hhbmdlcyBvZg0K ICBzeW1ib2wgbmFtZXMgaW4gZXhlY3V0YWJsZSAoaW4gb3JkZXIgdG8ga2VlcCBjdXJyZW50IHZl cnNpb24gb2YgYHBlcmYnDQogIHdvcmtpbmcgd2l0aCBPQ2FtbCBleGVjdXRhYmxlKS4gU2Vjb25k LCB0aGlzIGJldGEgZml4ZXMgYSBzaWduaWZpY2FudA0KICBwZXJmb3JtYW5jZSBpc3N1ZSBvbiBB cHBsZSBTaWxpY29uIG1hY09TLg0KDQogIEJleW9uZCB0aGVzZSB0d28gY2hhbmdlcywgdGhpcyBm aXJzdCBiZXRhIHJlbGVhc2UgY29udGFpbnMgYSBkb3plbiBvZg0KICBzbWFsbCBidWcgZml4ZXMg KGZyb20gdGhlIHJ1bnRpbWUgdG8gdGhlIGVycm9yIG1lc3NhZ2VzKSB3aGljaCBpcw0KICB1c3Vh bCBmb3IgdGhlIHN0YWdlIG9mIHRoZSByZWxlYXNlLiBXZSBhcmUgZXhwZWN0aW5nIHRoZSByZWxl YXNlDQogIGNhbmRpZGF0ZSB0byBmb2xsb3cgdGhpcyBiZXRhIHJlbGVhc2Ugc29vbiBpbiB0aGUg YmVnaW5uaW5nIG9mIEF1Z3VzdC4NCg0KICBUaGUgcHJvZ3Jlc3NlcyBvbiBzdGFiaWxpc2luZyB0 aGUgZWNvc3lzdGVtIGFyZSB0cmFja2VkIG9uIHRoZSBbb3BhbQ0KICByZWFkaW5lc3MgZm9yIDUu NC4wIG1ldGEtaXNzdWVdLg0KDQogIFRoZSBmdWxsIHJlbGVhc2UgaXMgZXhwZWN0ZWQgaW4gdGhl IG1pZGRsZSBvZiBBdWd1c3QsIHNlZSB0aGUgW25ldw0KICBwcm9zcGVjdGl2ZSBjYWxlbmRhcl0g Zm9yIG1vcmUgaW5mb3JtYXRpb24uDQoNCiAgSWYgeW91IGZpbmQgYW55IGJ1Z3MsIHBsZWFzZSBy ZXBvcnQgdGhlbSBvbiBbT0NhbWwncyBpc3N1ZSB0cmFja2VyXS4NCg0KICBJZiB5b3UgYXJlIGlu dGVyZXN0ZWQgaW4gZnVsbCBsaXN0IG9mIGZlYXR1cmVzIGFuZCBidWcgZml4ZXMgb2YgdGhlDQog IG5ldyBPQ2FtbCB2ZXJzaW9uLCB0aGUgdXBkYXRlZCBjaGFuZ2UgbG9nIGZvciBPQ2FtbCA1LjQu MCBpcyBhdmFpbGFibGUNCiAgW29uIEdpdEh1Yl0uDQoNCiAgSGFwcHkgaGFja2luZywgRmxvcmlh biBBbmdlbGV0dGkgZm9yIHRoZSBPQ2FtbCB0ZWFtDQoNCg0KW29wYW0gcmVhZGluZXNzIGZvciA1 LjQuMCBtZXRhLWlzc3VlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRv cnkvaXNzdWVzLzI3OTE2Pg0KDQpbbmV3IHByb3NwZWN0aXZlIGNhbGVuZGFyXQ0KPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9ibG9iL3RydW5rL3JlbGVhc2UtaW5mby9jYWxlbmRhci5t ZD4NCg0KW09DYW1sJ3MgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9pc3N1ZXM+DQoNCltvbiBHaXRIdWJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2Nh bWwvYmxvYi81LjQvQ2hhbmdlcz4NCg0KSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucw0K4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBh biBvcGFtIHN3aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjEg YW5kIGxhdGVyOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSC IG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjQuMH5iZXRhMQ0KICDilJTilIDilIDilIDilIANCg0KICBU aGUgc291cmNlIGNvZGUgZm9yIHRoZSBiZXRhIGlzIGFsc28gYXZhaWxhYmxlIGF0IHRoZXNlIGFk ZHJlc3NlczoNCg0KICDigKIgW0dpdEh1Yl0NCiAg4oCiIFtPQ2FtbCBhcmNoaXZlcyBhdCBJbnJp YV0NCg0KDQpbR2l0SHViXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUv NS40LjAtYmV0YTEudGFyLmd6Pg0KDQpbT0NhbWwgYXJjaGl2ZXMgYXQgSW5yaWFdDQo8aHR0cHM6 Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuNC9vY2FtbC01LjQuMH5iZXRhMS50 YXIuZ3o+DQoNCuKXiiBGaW5lLVR1bmVkIENvbXBpbGVyIENvbmZpZ3VyYXRpb24NCg0KICBJZiB5 b3Ugd2FudCB0byB0d2VhayB0aGUgY29uZmlndXJhdGlvbiBvZiB0aGUgY29tcGlsZXIsIHlvdSBj YW4gc3dpdGNoDQogIHRvIHRoZSBvcHRpb24gdmFyaWFudCB3aXRoOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA8c3dpdGNo X25hbWU+IG9jYW1sLXZhcmlhbnRzLjUuNC4wfmJldGExK29wdGlvbnMgPG9wdGlvbl9saXN0Pg0K ICDilJTilIDilIDilIDilIANCg0KICB3aGVyZSBgb3B0aW9uX2xpc3QnIGlzIGEgc3BhY2Ugc2Vw YXJhdGVkIGxpc3Qgb2YgYG9jYW1sLW9wdGlvbi0qJw0KICBwYWNrYWdlcy4gRm9yIGluc3RhbmNl LCBmb3IgYSBmbGFtYmRhIGFuZCBuby1mbGF0LWZsb2F0LWFycmF5IHN3aXRjaDoNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjQuMH5iZXRhMStmbGFtYmRh K25mZmEgb2NhbWwtdmFyaWFudHMuNS40LjB+YmV0YTErb3B0aW9ucyBvY2FtbC1vcHRpb24tZmxh bWJkYSBvY2FtbC1vcHRpb24tbm8tZmxhdC1mbG9hdC1hcnJheQ0KICDilJTilIDilIDilIDilIAN Cg0KICBBbGwgYXZhaWxhYmxlIG9wdGlvbnMgY2FuIGJlIGxpc3RlZCB3aXRoIGBvcGFtIHNlYXJj aCBvY2FtbC1vcHRpb24nLg0KDQoNCkNoYW5nZXMgc2luY2UgdGhlIGZpcnN0IGFscGhhDQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIENvZGUgZ2VuZXJhdGlvbiBmaXhlcw0K DQogIOKAoiAoKmJyZWFraW5nIGNoYW5nZSopIFsjMTMwNTBdLCBbIzE0MTA0XSwgK1sjMTQxNDNd OiBVc2UgJyQnIGluc3RlYWQNCiAgICBvZiAnLicgdG8gc2VwYXJhdGUgbW9kdWxlIG5hbWVzIGlu IHN5bWJvbCBuYW1lcyBvbiBtYWNPUyBhbmQgV2luZG93cw0KICAgIChpbmNsdWRpbmcgdGhlIEN5 Z3dpbiBiYWNrZW5kKS4gIFRoaXMgY2hhbmdlcyBtYW5nbGluZyBvZiBPQ2FtbA0KICAgIGlkZW50 aWZpZXJzIG9uIHRob3NlIG9wZXJhdGluZyBzeXN0ZW1zIGZyb20gYGNhbWxNb2R1bGUubmFtZV9O Tk4nIHRvDQogICAgYGNhbWxNb2R1bGUkbmFtZV9OTk4nLiBBZGRpdGlvbmFsbHkgaXQgY2hhbmdl cyB0aGUgZW5jb2Rpbmcgb2YNCiAgICBzcGVjaWFsIGNoYXJhY3RlcnMgZnJvbSAkeHggKHR3byBo ZXggZGlnaXRzKSB0byAkJHh4ICh0d28gZG9sbGFyDQogICAgc2lnbnMgZm9sbG93ZWQgYnkgdHdv IGhleCBkaWdpdHMpLiAgKFRpbSBNY0dpbGNocmlzdCwgd2l0aA0KICAgIGNvbnRyaWJ1dGlvbnMg ZnJvbSBYYXZpZXIgTGVyb3ksIHJldmlld2VkIGJ5IFhhdmllciBMZXJveSwgTWlvZA0KICAgIFZh bGxhdCwgR2FicmllbCBTY2hlcmVyLCBOaWNrIEJhcm5lcyBhbmQgSHVnbyBIZXV6YXJkKQ0KDQog IOKAoiBbIzE0MDg4XSwgWyMxNDA5MV06IGZpeCBub24tZGV0ZXJtaW5pc3RpYyBjb2RlIGdlbmVy YXRpb24gaW4NCiAgICBtYXRjaGluZy5tbCAoYmFja3BvcnQgb2YgcmVzY3JpcHQtbGFuZy9yZXNj cmlwdFsjNzU1N10pIChDaHJpc3RpYW5vDQogICAgQ2FsZ2FubywgcmV2aWV3IGJ5IEdhYnJpZWwg U2NoZXJlciBhbmQgVmluY2VudCBMYXZpcm9uKQ0KDQoNCiAgWyMxMzA1MF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTMwNTA+DQoNCiAgWyMxNDEwNF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQxMDQ+DQoNCiAgWyMxNDE0M10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQxNDM+DQoNCiAgWyMxNDA4OF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQwODg+DQoNCiAgWyMxNDA5MV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQwOTE+DQoNCiAgWyM3NTU3 XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy83NTU3Pg0KDQoNCuKXiiBQ ZXJmb3JtYW5jZSBmaXgNCg0KICDigKIgWyMxMzI2Ml0sIFsjMTQwNzRdOiBmaXggcGVyZm9ybWFu Y2UgaXNzdWUgb24gQXBwbGUgU2lsaWNvbiBtYWNPUyBieQ0KICAgIGVtaXR0aW5nIGBzdGxyJyBp bnN0ZWFkIG9mIGBkbWIgaXNobGQ7IHN0cicuICAoS0MgU2l2YXJhbWFrcmlzaG5hbiwNCiAgICBy ZXBvcnQgYnkgRnJhbsOnb2lzIFBvdHRpZXIsIGFuYWx5c2lzIGJ5IEZyw6lkw6lyaWMgQm91ciwg WGF2aWVyIExlcm95LA0KICAgIE1pb2QgVmFsbGF0LCBHYWJyaWVsIFNjaGVyZXIgYW5kIFN0ZXBo ZW4gRG9sYW4sIHJldmlldyBieSBNaW9kDQogICAgVmFsbGF0LCBWaW5jZW50IExhdmlyb24gYW5k IFhhdmllciBMZXJveSkNCg0KDQogIFsjMTMyNjJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEzMjYyPg0KDQogIFsjMTQwNzRdIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzE0MDc0Pg0KDQoNCuKXiiBTdGFuZGFyZCBsaWJyYXJ5IGZpeDoNCg0K ICDigKIgKCpicmVha2luZyBjaGFuZ2UqKSBbIzE0MTI0XTogRG8gbm90IHJhaXNlIEludmFsaWRf YXJndW1lbnQgb24NCiAgICBuZWdhdGl2ZSBMaXN0Lntkcm9wLHRha2V9LiAgKERhbmllbCBCw7xu emxpLCByZXZpZXcgYnkgR2FicmllbA0KICAgIFNjaGVyZXIsIE5pY29sw6FzIE9qZWRhIELDpHIp DQoNCg0KICBbIzE0MTI0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8x NDEyND4NCg0KDQril4ogUnVudGltZSBmaXgNCg0KICDigKIgWyMxNDA1N106IERvbid0IHVwZGF0 ZSBtZW1wcm9mIHRvbyBlYXJseSBhdCB0aGUgZW5kIG9mIGEgbWlub3IgR0MuDQogICAgKE5pY2sg QmFybmVzLCByZXZpZXcgYnkgRGFtaWVuIERvbGlnZXopLg0KDQogIOKAoiBbIzEzNTg2XSwgWyMx NDA5M106IEZpeCBjbG9zaW5nIGFuIG91dF9jaGFubmVsIGR1cmluZyBmbHVzaCAoU3RlcGhlbg0K ICAgIERvbGFuLCByZXBvcnQgYnkgSmFuIE1pZHRnYWFyZCwgaW52ZXN0aWdhdGlvbiBieSBOaWNr IFJvYmVydHMsDQogICAgcmV2aWV3IGJ5IEFudG9uaW4gRMOpY2ltbyBhbmQgTWlvZCBWYWxsYXQp DQoNCg0KICBbIzE0MDU3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8x NDA1Nz4NCg0KICBbIzEzNTg2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xMzU4Nj4NCg0KICBbIzE0MDkzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xNDA5Mz4NCg0KDQril4ogRXJyb3IgbWVzc2FnZSBmaXhlcw0KDQogIOKAoiBbIzEzOTU2 XSBGaXggYSByZWdyZXNzaW9uIGludHJvZHVjZWQgaW4gWyMxMzMwOF0gdHJpZ2dlcmluZyB3cm9u Zw0KICAgIHVudXNlZCB3YXJuaW5ncy4gIChVbHlzc2UgR8OpcmFyZCwgcmV2aWV3IGJ5IEZsb3Jp YW4gQW5nZWxldHRpKQ0KDQogIOKAoiBbIzE0MDcwXTogYWxzbyBwb2ludCB0byBsYWJlbCBtaXNt YXRjaGVzIGluIGVycm9yIG1lc3NhZ2VzIGZvcg0KICAgIGxhYmVsbGVkIHR1cGxlcyAoRmxvcmlh biBBbmdlbGV0dGksIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQoNCiAg4oCiIFsjMTQxMzVd OiBGaXggYSByYXJlIGludGVybmFsIHR5cGVjaGVja2VyIGVycm9yIHdoZW4gY29tYmluaW5nDQog ICAgcmVjdXJzaXZlIG1vZHVsZXMsIHBvbHltb3JwaGljIGZpZWxkcyBvciBtZXRob2RzLCBhbmQg Y29uc3RyYWluZWQNCiAgICB0eXBlIHBhcmFtZXRlcnMuICAoRmxvcmlhbiBBbmdlbGV0dGksIHJl dmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQoNCg0KICBbIzEzOTU2XSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMzk1Nj4NCg0KICBbIzEzMzA4XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMzMwOD4NCg0KICBbIzE0MDcwXSA8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xNDA3MD4NCg0KICBbIzE0MTM1XSA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xNDEzNT4NCg0KDQril4ogQ29tcGlsZXJs aWJzIGZpeGVzDQoNCiAg4oCiIFsjMTQxMDVdOiBGaXggYSBsb29wIGluIFBwcmludGFzdCB0aGF0 IGNvdWxkIHJlc3VsdCBpbiBhIGhhbmcgd2hlbg0KICAgIHByaW50aW5nIGNvbnN0cnVjdG9yIGAo OjopJyBpbiBpc29sYXRpb24uICAoVWx5c3NlIEfDqXJhcmQsIHJldmlldyBieQ0KICAgIE5pY29s w6FzIE9qZWRhIELDpHIgYW5kIEZsb3JpYW4gQW5nZWxldHRpKQ0KDQogIOKAoiBbIzE0MTA4XTog dG9wbGV2ZWwsIGZpeCBhIHR5cG8gaW4gZGlyZWN0aXZlIHR5cGUgbWlzbWF0Y2ggKEZsb3JpYW4N CiAgICBBbmdlbGV0dGksIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIpDQoNCiAg4oCiIFsjMTQx MDFdLCBbIzE0MTM5XTogZGVmaW5lIGF0b21pYyBoZWxwZXIgdHlwZXMgaW5zaWRlIGBjYW1sL21p c2MuaCcNCiAgICB0byBpbXByb3ZlIGhlYWRlciBjb21wYXRpYmlsaXR5IHdpdGggQysrIChGbG9y aWFuIEFuZ2VsZXR0aSwgcmVwb3J0DQogICAgYnkgS2F0ZSBEZXBsYWl4LCByZXZpZXcgYnkgR2Fi cmllbCBTY2hlcmVyKQ0KDQoNCiAgWyMxNDEwNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v Y2FtbC9pc3N1ZXMvMTQxMDU+DQoNCiAgWyMxNDEwOF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTQxMDg+DQoNCiAgWyMxNDEwMV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvMTQxMDE+DQoNCiAgWyMxNDEzOV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQxMzk+DQoNCg0K4peKIE9DYW1sZG9jIGZpeA0KDQogIOKA oiBbIzEzODk2XSwgWyMxNDA5OF06IG9jYW1sZG9jLCBkbyBub3Qgd3JhcCBtb2R1bGUgZGVzY3Jp cHRpb24gaW4gYQ0KICAgIHBhcmFncmFwaCB0YWcgaW5zaWRlIHRoZSB0YWJsZSBvZiBtb2R1bGVz IChGbG9yaWFuIEFuZ2VsZXR0aSwgcmVwb3J0DQogICAgYnkgSm9obiBXaGl0aW5ndG9uLCByZXZp ZXcgYnkgR2FicmllbCBTY2hlcmVyKQ0KDQogIFteMV06TW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0 aGUgd2hvbGUgcmVsZWFzZSBwcm9jZXNzIGlzIG5vdyBhdmFpbGFibGUNCiAgaW4gdGhlIFtjb21w aWxlciByZXBvc2l0b3J5XQ0KDQoNCiAgWyMxMzg5Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTM4OTY+DQoNCiAgWyMxNDA5OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvMTQwOTg+DQoNCiAgW2NvbXBpbGVyIHJlcG9zaXRvcnldDQogIDxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9yZWxlYXNlLWluZm8vaW50 cm9kdWN0aW9uLm1kPg0KDQoNCkVuY29kaW5nIFNBVCBpbiBPQ2FtbCBHQURUcw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9lbmNvZGluZy1zYXQtaW4tb2NhbWwtZ2FkdHMvMTcwMjAvMT4NCg0KDQpOYXRoYW4gRmFy bG93IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSBoYWQgc29tZSBmdW4gYW5kIHdyb3Rl IGEgcG9zdCBhYm91dCBhIFNBVCAtPiBHQURUIGVuY29kaW5nLiBIb3BlIHlvdQ0KICBlbmpveSEN Cg0KICA8aHR0cHM6Ly9mYXJsb3cuZGV2LzIwMjUvMDcvMjcvZW5jb2Rpbmctc2F0LWluLW9jYW1s LWdhZHRzPg0KDQoNCk90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0 ZWQgYXQgW3RoZSBvY2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtBZGQgWW91ciBPd24gUmVj aXBlcyB0byB0aGUgT0NhbWwgQ29va2Jvb2shXQ0KICDigKIgW1RoZSBTYWdhIG9mIE11bHRpY29y ZSBPQ2FtbF0NCiAg4oCiIFtvcGFtIDIuNCByZWxlYXNlXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJs b2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0FkZCBZb3VyIE93biBSZWNpcGVzIHRv IHRoZSBPQ2FtbCBDb29rYm9vayFdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9nLzIwMjUtMDct MjUtYWRkLXlvdXItb3duLXJlY2lwZXMtdG8tdGhlLW9jYW1sLWNvb2tib29rPg0KDQpbVGhlIFNh Z2Egb2YgTXVsdGljb3JlIE9DYW1sXQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoL1hH R1NQcGsxSUIwP3ZlcnNpb249Mz4NCg0KW29wYW0gMi40IHJlbGVhc2VdDQo8aHR0cHM6Ly9vY2Ft bHByby5jb20vYmxvZy8yMDI1XzA3XzIzX29wYW1fMl80X3JlbGVhc2U+DQoNCg0KT2xkIENXTg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5 b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9y IGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUN CiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3 ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0K ICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNj aG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBz Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRw czovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0 XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 22 to 29, 2025.

    opam 2.4.1

    Kate announced

    Hi everyone,

    Following up the regression reported a couple of days ago affecting some use= rs of pin-depends, we are releasing 2.4.1.

    You can read our blog p= ost for relevant links and details.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    new tools to keep your projects clean (after AI, or just after= yourself)

    Thomas Gazagnaire announced

    Hi all,

    I=E2=80=99ve been experimenting with AI code assistants lately. They=E2=80= =99re surprisingly good at generating new code but it's not very good at re= membering things: it's like having a steady stream of good interns spending= a few months on a project to expand it in one direction and then just disa= ppearing. They produce a lot of code quickly, but that also means they leav= e a lot behind: unused definitions, inconsistent style, and half-finished r= efactorings.

    Since I couldn=E2=80=99t keep up with reviewing code at the speed these AI = assistants generate it, I ended up writing (with their help) a couple of to= ols to clean things up.

    • prune: rem= oves top-level definitions (values, types, constructors, etc.) that are exp= osed in .mli files but unused elsewhere in the codebase. It re= lies on merlin occurrences to find unused identifiers and pars= es compiler warnings to clean up any breakage (see warning.mli for the full = list of handled cases).
    • merlint:= runs a set of small static checks using Merlin, ppxlib, and s= ome basic Dune file parsing. It looks for things like code complexity, docu= mentation style, test organisation, etc. This is all very specific to my ow= n style of writing OCaml code but can be made configurable (a bit). See here for the full list of ru= les (suggestions welcome to add/change some of them).

    I originally wrote these to deal with AI-generated code, but they=E2=80=99v= e been useful on more conventional OCaml projects too, especially older one= s or ones with many contributors or the ones that I wrote a long time ago.

    Both are still evolving but they=E2=80=99ve made my workflow a bit smoother= already. Feedback and suggestions welcome. I'm still undecided if I should= publish those to opam or not.

    Thomas

    First beta release for OCaml 5.4.0

    octachron announced

    Two months after the release of the first alpha for OCaml 5.4.0, the releas= e of OCaml 5.4.0 is drawing near.

    The internal API of the compiler libraries has been frozen, and most core d= eveloper tools support (or will support soon) the new version of the compil= er.

    We have thus released a first beta version of OCaml 5.4.0 to help you updat= e your softwares and libraries ahead of the release (see below for the inst= allation instructions) [^1].

    Compared to the first alpha release, this beta release brings two notable c= hanges. First, this beta partially reverts the changes of symbol names in e= xecutable (in order to keep current version of perf working wi= th OCaml executable). Second, this beta fixes a significant performance iss= ue on Apple Silicon macOS.

    Beyond these two changes, this first beta release contains a dozen of=20 small bug fixes (from the runtime to the error messages) which is usual for the stage of the release. We are expecting the release candidate to follow= =20 this beta release soon in the beginning of August.

    The progresses on stabilising the ecosystem are tracked on the opam readiness for 5.= 4.0 meta-issue.

    The full release is expected in the middle of August, see the new prosp= ective calendar for more information.

    If you find any bugs, please report them on OCaml's issue tracker.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.4.0 is available on GitHub.

    Happy hacking, Florian Angeletti for the OCaml team

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.4.0~beta1
    

    The source code for the beta is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.4.0~beta1+options &=
      lt;option_list>
      

      where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

      opam switch create 5.4.0~beta1+flambda+nffa ocaml-variants.5.4.0~beta1+opti=
      ons ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Changes since the first alpha

    • Code generation fixes
      • (breaking change) #13050, #14104, +#14= 143: Use '$' instead of '.' to separate module names in symbol names on macOS and Windows (including the Cygwin backend). This changes mangling of OCaml identifiers on those operating systems from camlModule.name_NNN to camlModule$name_NNN. Addi= tionally it changes the encoding of special characters from $xx (two hex digits) to $$xx (two dollar signs followed by two hex digits). (Tim McGilchrist, with contributions from Xavier Leroy, reviewed by Xavier Leroy, Miod Vallat, Gabriel Scherer, Nick Barnes and Hugo Heuzard)
      • #14088, #14091: fix non-de= terministic code generation in matching.ml (backport of rescript-lang/rescript#7557) (Christiano Calgano, review by Gabriel Scherer and Vincent Laviron)
    • Performance fix
      • #13262, #14074: fix perfor= mance issue on Apple Silicon macOS by emitting stlr instead of dmb ishld; str. (KC Sivaramakrishnan, report by Fran=C3=A7ois Pottier, analysis by Fr=C3=A9= d=C3=A9ric Bour, Xavier Leroy, Miod Vallat, Gabriel Scherer and Stephen Dolan, review by Miod Vallat, Vincent Laviron and Xavier Leroy)
    • Standard library fix:
      • (breaking change) #14124: Do not raise Invalid_argument on negative List.{drop,= take}. (Daniel B=C3=BCnzli, review by Gabriel Scherer, Nicol=C3=A1s Ojeda B=C3=A4r= )
    • Runtime fix
      • #14057: Don= 't update memprof too early at the end of a minor GC. (Nick Barnes, review by Damien Doligez).
      • #13586, #14093: Fix closin= g an out_channel during flush (Stephen Dolan, report by Jan Midtgaard, investigation by Nick Roberts, review by Antonin D=C3=A9cimo and Miod Vallat)
    • Error message fixes
      • #13956 Fix = a regression introduced in #13308 triggering wrong unused warnings. (Ulysse G=C3=A9rard, review by Florian Angeletti)
      • #14070: als= o point to label mismatches in error messages for labelled tuples (Florian Angeletti, review by Gabriel Scherer)
      • #14135: Fix= a rare internal typechecker error when combining recursive modules, polymorphic fields or methods, and constrained type parameters. (Florian Angeletti, review by Gabriel Scherer)
    • Compilerlibs fixes
      • #14105: Fix= a loop in Pprintast that could result in a hang when printing constructor (::) in isolation. (Ulysse G=C3=A9rard, review by Nicol=C3=A1s Ojeda B=C3=A4r and Florian Ange= letti)
      • #14108: top= level, fix a typo in directive type mismatch (Florian Angeletti, review by Gabriel Scherer)
      • #14101, #14139: define ato= mic helper types inside caml/misc.h to improve header compatibility with C++ (Florian Angeletti, report by Kate Deplaix, review by Gabriel Scherer)
    • OCamldoc fix
      • #13896, #14098: ocamldoc, = do not wrap module description in a paragraph tag inside the table of modules (Florian Angeletti, report by John Whitington, review by Gabriel Scherer)

      [^1]:More information about the whole release process is now available in the compiler repository

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=mYQYfYc+; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=5C8GPhQH; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D5FB140066 for ; Tue, 5 Aug 2025 08:18:05 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=gy3nM92DqJBhxwaUnifPdbQ/SJT2++AwU7RwgZoxl8g=; b=mYQYfYc+m93VAlndyuouR5mgRgHdQ2Y9+nV9U1KOCI2jSpW5AlhndiLa L+fzuSuh7g68UVjzFU+9IV00or4rAVNxY+6SLdIC1+fccfueNSeVVcfvV 1O4PfV4Y49z+NUCc2nV3BEE6+UzO4oWIIvZ8v405X0x9hKnyguhVMBUYt o=; X-CSE-ConnectionGUID: HZyaCJJ3SzqM4KRIIhGUlg== X-CSE-MsgGUID: G9uFSlPdTkKFQCvIpLC7uA== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.17,265,1747692000"; d="scan'208,217";a="234200628" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 Aug 2025 10:18:05 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 8645DE0CD8; Tue, 5 Aug 2025 10:18:04 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 3C5A2E0171 for ; Tue, 5 Aug 2025 10:17:58 +0200 (CEST) X-CSE-ConnectionGUID: aNYg86dRS2So8t4/LaHnIQ== X-CSE-MsgGUID: Xyw1RhOtQNGjXkBjcD+2wA== IronPort-SDR: 6891be35_kiyCvjYOp0UEly/tlk5LKJmxpX+RLUpGQOMWhKiYS6L/ukF AzE056IsWuQAJnrpH4Qhq5y7niUDDTvt1nG/rvQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FmOwBGvZFojyIeaIFaGQEBAQEBATwBAQEBAQEBAQEBA?= =?us-ascii?q?QECAQEBAQEBAQEBAQGBaoE7GwIBAQEBAQFgGQFgBlozBwhJQx6DdINPhSyId?= =?us-ascii?q?pQJhy+BEIJ6Ay4YIAEDAQ0UAgECDgcBBRoBAgQBAQMBAgGEOkYYjAcCHwYBB?= =?us-ascii?q?DQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABAQEBAQE5B?= =?us-ascii?q?UmGTw2CRVFxgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQECCwEBBzxkChMBAS4KGCMDEAQHAwIEDQE1FwESGoJoAYIhAksDB?= =?us-ascii?q?AEMBAKaPJtMeoEygQGCDAEBBoEIUwEOCdoxgRowGgmBRwIBAQEBAQEBAYVlg?= =?us-ascii?q?koaASpIawKESAmEMycPgVVEgz1Rb4FQehcBAQEBGIEkAQEIRYMugmmCJoECF?= =?us-ascii?q?B2BPoYbgy6FRIhygUQiAyYzLAFVExcLBwVbgQgDKjQxbjIdgSeFGIQoK0+FE?= =?us-ascii?q?IEZg1MRE20PBoEVg3MuQAMLbT03FBuTRBcpGWqBcQ42CD5tDgIiNgkFKwwXK?= =?us-ascii?q?wUEFhUfPQgDkkMkGCqddJRjNAeEH4FeBgyJCIEmjB+JZ4QEgVeLPIcCklIim?= =?us-ascii?q?GQiiV2BJglggQ9rlWAThUaBfyOBKx4MBzMaMEOCMwEzCQo8HA+SIYE+gSaBO?= =?us-ascii?q?zk7gmayPkE1AgEBBzECBwEKAQEDCYVFHQEBjDeBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:qZUTS67xjym7MUTwYG+9NQxRtHTMchMFZxGqfqrLsTDasY5as4F+v jdKUGuOb/zYYmGjedt/aYrj900F68LXn4dgQQVprS1hZn8b8sCt6faxfh6hZXvKRiHgZBs6t JtGMoGowOQcFCK0SsKFa+C5xZVE/fjVAOe6UaicZ30ZqTZMEE8JkQhkl/MynrlmiN24BxLlk d7pqqUzAnf8s9JPGjxSsv3rRC9H5qyo5WtI5gBmPJingXeH/5UrJMJHTU2OByCgKmVkNrbSb /rOyri/4lTY838FYvu5kqz2e1E9WbXbOw6DkBJ+A8BOVTAfzsCa+v9T2Ms0MS+7uR3R9zxC4 IklWaiLdOscFvakdNLx/PVvO3oW0aVuoNcrKJUk2CCZ5xWun3DEm52CAKyqVGGxFyke7Wxmr JQlxD4xgh+rjsSHz+LlRtNX3P8kfNW3e6cWmndB9GSMZRomacirr6Ti4M8Bmi83gtFSEP3eY csAdDcpaw7PC/FNEg5NWdRnxLvu3SG5KGEwRFG9/cLb50Do9jcphZzPDp2AIObfXcJRj1qVr WLA/n3kD1cdLtPKwD6M9DS3je/KnD/ncIgVCbuz++UshQGDgGsJB3X6UHPh+qXj0hbjCok3x 0o8yjsx9JIy01CSaPb/bx6SonWo/UQDco8FewE9wFrQlvSPvF7x6nI/ZjVIbdhjsM4tWRQxx 1qRlpXoAyZuufubUxqgGqy8qCPrfzASKX4eaCQESwoc/tSlp5s85v7Scjp9OKeTv9KlRz3K+ Gqxq3gi2/I3hO4N9pzuqDgrnAmQjpTOSwc04CDeUWSk8h51aeaZi2qAtQazARFocd7xc7WRg EXojfRy+8ggN/mweMGlRfVUWqmu4+eZPTbch192ApRn8C6ik5JCQWyyyG8lTKuKGp9UEdMMX KM1kVgIjHO0FCD3BZKbm6rrV6wXIVHITLwJrMz8YNtUeYRWfwSa5ixobkP49zmyzRR3yvtkZ srALpnE4ZMm5UJPkGTeqwA1jOdD+8zC7Tq7qW3TkUn6iuT2iIC9FehdbDNikdzVHIvf/VmLq IkHXyd74xhUV+nzKjHQ9Z8PIFsKK3kiGJ2+ptRMffbrH+aVMDxJNhMl+pt4I9YNt/0Mzo/gp yjtMmcGkwCXrSOcdm23hoVLNOiHsWBX8SljZXRE0JfB8yRLXLtDG49EL8ZoJOh/qbw4pRO2J tFcE/i97j10Ymyv01wggVPV9eSOrTz61FrcDDnvezUlYZ9rSirA/9KuLEOl9zADAmDz/YEyq qGpnFGTC5cSZRVQPOCPYtKWznS1oSc8nsB2VBD2OdV9Qhjn37VrDC3TtcUJBf8wBy/N/Rak8 jqHIAw5oLDNqrAl8dOSiqGjqZyoItREHUFbPjf66O/qEBKH4WD50dJMf9iKdB+ATGjExqGGY LRE/eDdK9wCpk5B6KBnIoZozIU/xtrhnKBbxQJaB0f2b0ynJ7djA3ue1+xdn/Rp6p4AniXuQ WOJ2N1RGYvRCfPfCFRLeTYUNLWS588bihz5zKoTInyjwARV4bDec0FZHyfUuRxnNLEvbb8Um 7YwivU3tT66pAEhaOudryZu8G+JEHwMfoMnurweA67pkgAb8U5DU7ONFh7J5IyzVPsUPnkIO jO0gI/wt4ZYzGfGcFsxEiHp9shZjpIsphtL7QEjI3Kkp9n7vcI0jSZhqWkPcgdozxt8w71SP EpvPBZLPqmgxWpjq/VCeGGOIDt/IiOl1Hb/8WZUq12BfXKUDjTMCEYfJdey+Fso9jMAXzpDo 5Cd5mXXcRfrW8DT3yFpZ1NU8cLxadkprgDpxd6sGs+EO7IYYjPVpLCkSkRVihngAOI33Fbmo 8sz9slOSKTLDwwiiIxlNJu7jJM+EAulIk5GStFfpJI5J3nWImyO6GLfOnKPddNoDN2U102BU uhFBN9FDja63waw9gErP7YGeeJIraR49eg5W+3ZIEAduOGitRtvipXb8xb+iEINQ9lDlcUcK JvbRwmdE16/1GdlpGvQkPZqYmaIQ8EIRAnZ7tCH9O8kE5EisuY1VWoQ1rCynWueMSo53hayk T7AWZTrzL1Z+dwxp7fvL6RNPBXrCNXRUO/Tzhu/ne4TZvzyMODPlTgvlH/ZAypsM4A8Ye9Hz Ya2jIav3WfunqoHbGTCqpzQS4hL/ZqTWcRUAOLWLV5bvzSIAt+x7zQ9+WmXdIRCoO1Zwsz2V jmpSdCRcOQNUIx330xlaCl5EjccBZ/ob6zmmziPkvSUBjUZ0i3FNNmC90K1XVpEdyQNBYLyO jX0t9mq+NpcioZGXz0AON1LHL56JwXFdZY9VtisqwSdMHaksmmCtpTmixAkzzPBUVuAMcTi5 KP6VgrMTwuztI7I3eNmndRL5DNPN0lEgM40Yk450Px1gWrjDGc5cMIsAa9fAZRQyiHPxJX0Y Q/WV1QbCAL/YC9ldCvt69GyTyadAe0zYu3CHAILxH/NSSmKB9KnOoBDpxdQuyI8PnOpyey8M tgR90HhJhX7kNkjWe8X4ef9mut9gO/TwnUT403mjsjuGFAkDK4X0GB6Vh94PcAd/xohSG2QT YT0eYxFfK1/YUvhSIB4fHpEBBwSvDXu1iglKyCVz74zfq2FmfZYxqSX1/7bi9U+gAYifdbih k8bg0OH5H2Q0XEI/651q5Qum6Ac5TejAJ2hNKG6LeENt/jY14nkVv/uWQIXS8Uz5ANUE1Xcj yShpX8kCyxp7ayXNKK+kW00xn66bp7A4/wlQuIySf8qXCHVF+TkRiU= IronPort-HdrOrdr: A9a23:hfBQB6Enn5Xy05VRpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: =?us-ascii?q?9a23=3AT64pSGiHQzY6DphVs5/hFhPjFzJue1vswyeOL3W?= =?us-ascii?q?DU11uGKHJDnuZ2KVFqp87?= X-Talos-MUID: =?us-ascii?q?9a23=3Ac0S9Nw4H3kfnQ1eRb0lhSWlAxoxY8rv3MkAqjaw?= =?us-ascii?q?glMu0NgZyMBve1iueF9o=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.17,265,1747692000"; d="scan'208,217";a="234200593" X-MGA-submission: =?us-ascii?q?MDH6s9MD2d+xozP+nH+a1pu2VYs7T85TUvj04H?= =?us-ascii?q?KvXaMhi+8XbuW8w2GhIOoX8FfNFEEewcUwTdUOLVNTQjXqEcpuKBKVC/?= =?us-ascii?q?hx3eKHBrOGHTfUEn6rHzxqet4WGLzWIqAdrqcwIAgGI9usGHDs+4s54T?= =?us-ascii?q?cybtVfvdBSA8np2s0fyMAo8w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 Aug 2025 10:17:57 +0200 Received: from TM.local (88-176-91-141.subs.proxad.net [88.176.91.141]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4ACA8564DAB; Tue, 5 Aug 2025 10:17:56 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1754381876; bh=term9xV93AXytQJ6Fih9a7p/vaNibYQY1hRuVEzeKA0=; h=From:To:Subject:Date:Message-ID; b=5C8GPhQHi2YElW64J1ohtBQv95SSCQ3HHs4rsbgIIo8a7m/yyZ8TvohiPtRzrLAqv St00YXLr+Yt7mUERLCIF0GhbxC5xKygdGBDcHjgctaeOLhO9J+oZrmkSJsqYzGcfvs fu4TNXguVeUbx8WuyOKGl4odzUZyUaSzQmEMf9uY= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 05 Aug 2025 10:17:55 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 5 10:17:56 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498916, queueID=9BCF3564DAC X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19358 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSnVseSAyOSB0byBBdWd1c3QNCjA1LCAyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk15 IGZvdXJ0aCBPdXRyZWFjaHkgSW50ZXJuc2hpcCBCbG9nIHBvc3QNCnFjaGVjay1saW4gYW5kIHFj aGVjay1zdG0gMC4yDQpDUnMgV29ya2Zsb3dzOiBJbnZpdGF0aW9uIGZvciBFYXJseSBUZXN0aW5n IGFuZCBEaXNjdXNzaW9uDQpPQ2FtbCB2ZXJzaW9uIG9mIHRoZSAiQnVpbGQgc3lzdGVtcyDDoCBs YSBjYXJ0ZSIgcGFwZXINCkRyZWFtIGRldmVsb3BtZW50IG9wZW4gdmlkZW8gY2FsbA0KT3RoZXIg T0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCk15IGZvdXJ0aCBPdXRyZWFjaHkgSW50ZXJuc2hpcCBC bG9nIHBvc3QNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvbXktZm91cnRoLW91dHJlYWNoeS1pbnRlcm5zaGlwLWJsb2ctcG9zdC8xNzAyNy8xPg0K DQoNCk1hdHRoZXcgSWR1bmdhZmEgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBIZWxsbyBldmVyeW9uZSEgSSd2ZSBqdXN0IHB1Ymxpc2hlZCBteSBmaXJzdCBtaWRwb2ludCBP dXRyZWFjaHkgYmxvZw0KICBwb3N0IGFib3V0IG15IHByb2dyZXNzIGNvbnRyaWJ1dGluZyB0byBE dW5lLiBZb3UgY2FuIHJlYWQgaXQgaGVyZToNCiAgPGh0dHBzOi8vbWVkaXVtLmNvbS9AbWF0dGlk dW5nYWZhL291dHJlYWNoeS1pbnRlcm5zaGlwLW1pZHBvaW50LXBvc3QtZjkzMzNjOWMzYzg2Pi4g U3RheQ0KICB0dW5lZCBmb3IgbW9yZSB1cGRhdGVzIQ0KDQoNCnFjaGVjay1saW4gYW5kIHFjaGVj ay1zdG0gMC4yDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0K ICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1xY2hlY2stbGluLWFuZC1xY2hlY2st c3RtLTAtMi8xMjMwMS83Pg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBWZXJzaW9uIDAuOSBvZiBgcWNoZWNrLWxpbicsIGBxY2hlY2stc3RtJywgYW5kDQog IGBxY2hlY2stbXVsdGljb3JldGVzdHMtdXRpbCcgaXMgbm93IGF2YWlsYWJsZSBmcm9tIHlvdXIg ZmF2b3JpdGUgb3BhbQ0KICByZXBvc2l0b3J5ISA6dGFkYToNCg0KICBUaGUgMC45IHJlbGVhc2Ug Y29udGFpbnMgYWRqdXN0bWVudHMgdG8gdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYExpbicNCiAg aW4gb3JkZXIgdG8gbWFrZSBpdCBjb21wYXRpYmxlIHdpdGggYDUuNS4wK3RydW5rJyBhbmQgYWxz byBzd2l0Y2hlcw0KICB0aGUgYFV0aWwuUHAnIHByZXR0eSBwcmludGVycyB0byB1c2UgYFFDaGVj ay5QcmludCcgZm9yIGNvbnNpc3RlbmN5Og0KDQogIOKAoiBbIzU2Nl06IFVzZSBgUUNoZWNrLlBy aW50JyBjb21iaW5hdG9ycyBpbiBgVXRpbC5QcCcgdG9vIGZvcg0KICAgIGNvbnNpc3RlbmN5LCBl LmcuLCB0byBhdm9pZCB0aGF0IGBTVE0nIGFyZ3VtZW50IGFuZCByZXN1bHQgcHJpbnRlcg0KICAg IG91dHB1dHMgZGlmZmVyLg0KDQogIOKAoiBbIzU2Ml06IEZpeCB0aGUgYGludDMyJyBhbmQgYGlu dDY0JyBwcmludGVycyBpbiBib3RoIGBMaW4nIGFuZCBgU1RNJw0KICAgIHRvIGFkZCBtaXNzaW5n IGBsJyBhbmQgYEwnIHN1ZmZpeGVzIG9uIGxpdGVyYWxzLg0KDQogIOKAoiBbIzU2MF06IENoYW5n ZSBgTGluLntjb25zdHJ1Y3RpYmxlLGRlY29uc3RydWN0aWJsZX0nIGZyb20gYW4gZW1wdHkNCiAg ICB2YXJpYW50IHR5cGUgdG8gYW4gYWJzdHJhY3QgdHlwZSB0byBnZXQgYExpbicgY29tcGlsaW5n IG9uDQogICAgYDUuNS4wK3RydW5rJyBhZ2FpbiwgZHVlIHRvIFtvY2FtbC9vY2FtbCMxMzk5NF0g cmVtb3Zpbmcgc3BlY2lhbA0KICAgIGhhbmRsaW5nIG9mIGFic3RyYWN0IGFuZCBlbXB0eSB2YXJp YW50cyBkZWZpbmVkIGluIHRoZSBjdXJyZW50DQogICAgbW9kdWxlLg0KDQogIEhhcHB5IHRlc3Rp bmchIDpzbWlsZXk6DQoNCg0KWyM1NjZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwtbXVsdGlj b3JlL211bHRpY29yZXRlc3RzL3B1bGwvNTY2Pg0KDQpbIzU2Ml0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1tdWx0aWNvcmUvbXVsdGljb3JldGVzdHMvcHVsbC81NjI+DQoNClsjNTYwXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLW11bHRpY29yZS9tdWx0aWNvcmV0ZXN0cy9wdWxsLzU2MD4N Cg0KW29jYW1sL29jYW1sIzEzOTk0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL3B1 bGwvMTM5OTQ+DQoNCg0KQ1JzIFdvcmtmbG93czogSW52aXRhdGlvbiBmb3IgRWFybHkgVGVzdGlu ZyBhbmQgRGlzY3Vzc2lvbg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9jcnMtd29ya2Zsb3dzLWludml0YXRpb24tZm9yLWVhcmx5LXRlc3RpbmctYW5k LWRpc2N1c3Npb24vMTcwMzYvMT4NCg0KDQpNYXRoaWV1IEJhcmJpbiBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEkganVzdCBwdWJsaXNoZWQgYSBibG9nIHBvc3QgYWJvdXQgQ1JzIFdv cmtmbG93cywgYSBuZXcgb3BlbiBzb3VyY2UNCiAgdG9vbCBmb3IgbWFuYWdpbmcgY29kZSByZXZp ZXcgY29tbWVudHMgZW1iZWRkZWQgaW4gc291cmNlIGNvZGUsIHdpdGgNCiAgcmV1c2FibGUgR2l0 SHViIEFjdGlvbnMgd29ya2Zsb3dzLiBJZiB5b3XigJlyZSBpbnRlcmVzdGVkIGluIHRyeWluZyBp dA0KICBvdXQgb3Igc2hhcmluZyBmZWVkYmFjaywgeW91IGNhbiByZWFkIG1vcmUgaGVyZToNCiAg PGh0dHBzOi8vbWJhcmJpbi5naXRodWIuaW8vY3JzL2Jsb2cvbGF1bmNoaW5nLWNycy13b3JrZmxv d3MvPi4NCg0KICBUaGFuayB5b3UhDQoNCg0KT0NhbWwgdmVyc2lvbiBvZiB0aGUgIkJ1aWxkIHN5 c3RlbXMgw6AgbGEgY2FydGUiIHBhcGVyDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L29jYW1sLXZlcnNpb24tb2YtdGhlLWJ1aWxkLXN5c3RlbXMtYS1sYS1jYXJ0ZS1wYXBlci8x NzA0Mi8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZXJlIGlzIGEgZ3JlYXQg cGFwZXIgZGlzdGlsbGluZyBzZXZlcmFsIGRpZmZlcmVudCBidWlsZCBzeXN0ZW1zDQogIChNYWtl LCBFeGNlbCwgQmF6ZWwsIGV0Yy4pIGludG8gYSB1bmlmaWVkIGZyYW1ld29yay4gT25lIG9mIGl0 cw0KICBhdXRob3JzIGlzIG9uIHRoZSBEdW5lIHRlYW0gKEkgdGhpbmspLiBJZiB5b3Ugd2FudCB0 byB1bmRlcnN0YW5kIG9yDQogIHdyaXRlIGJ1aWxkIHN5c3RlbXMsIGl0IGlzIGEgZ29vZCByZWFk IGJlY2F1c2UgaXQgdXNlcyBsYW5ndWFnZSB0aGF0DQogIGNhbiBiZSB1bmRlcnN0b29kIGJ5IG5v bi1hY2FkZW1pY3M6DQoNCiAgPGh0dHBzOi8vd3d3LmNhbWJyaWRnZS5vcmcvY29yZS9qb3VybmFs cy9qb3VybmFsLW9mLWZ1bmN0aW9uYWwtcHJvZ3JhbW1pbmcvYXJ0aWNsZS9idWlsZC1zeXN0ZW1z LWEtbGEtY2FydGUtdGhlb3J5LWFuZC1wcmFjdGljZS8wOTdDRTUyQzc1MEU2OUJEMTZCNzhDMzE4 NzU0QzdBND4NCg0KICBBbGwgb2YgaXRzIGV4YW1wbGVzIGFyZSBpbiBIYXNrZWxsIHNvIEkgd3Jv dGUgYSB2ZXJzaW9uIGluIE9DYW1sLiBNb3N0DQogIG9mIG15IE9DYW1sIHRyYW5zbGF0aW9uIHdh cyBhaWRlZCBieSB0aGUgRW5nbGlzaCBwYXJhZ3JhcGhzIHJhdGhlcg0KICB0aGFuIHRoZSBIYXNr ZWxsIGNvZGUgKHRoZSBsYXR0ZXIgd2FzIGhpZXJvZ2x5cGhpY3MgdG8NCiAgbWUpLiBSZWdhcmRs ZXNzLCBJ4oCZbSBmYWlybHkgc3VyZSBzb21lIG9mIHRoZSBjb25jZXB0cyBkb27igJl0IHRyYW5z bGF0ZQ0KICB0byBPQ2FtbCB3ZWxsLg0KDQogIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiBidWls ZCBzeXN0ZW1zLCB0aGUgZmlyc3QgcGxhY2UgdG8gc3RhcnQgaXMNCiAgdGhlIHRlc3QgZGlyZWN0 b3J5DQogIDxodHRwczovL2dpdGxhYi5jb20vZGttbC9idWlsZC10b29scy9NbEZyb250Ly0vdHJl ZS9WMl80L3Rlc3RzL01sRnJvbnRfVGh1bms/cmVmX3R5cGU9aGVhZHM+DQogICh0aGUgYGFsYWNh cnRlXyoubWwnIG1vZHVsZXMpLiBUaGUgdGVzdHMgY29ycmVzcG9uZCB0byB0aGUgcGFwZXLigJlz DQogIHNlY3Rpb24gbnVtYmVycywgYWx0aG91Z2ggdGhlcmUgYXJlIGFsc28gYGFsYWNhcnRlX3gq Lm1sJyB0ZXN0cyB3aGVyZQ0KICBJIGV4dGVuZGVkIHRoZSBmcmFtZXdvcmsuIFRoZW4geW91IGNh biBzY2FuIHRoZSBzb3VyY2UgY29kZSBhdA0KICA8aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvYnVp bGQtdG9vbHMvTWxGcm9udC8tL3RyZWUvVjJfNC9zcmMvTWxGcm9udF9UaHVuaz9yZWZfdHlwZT1o ZWFkcz4NCiAgKHRoZSBgQnVpbGQqLm1sJyBhbmQgYFByb21pc2UubWwnIG1vZHVsZXMpLg0KDQog IFBScyB3ZWxjb21lIQ0KDQoNCkRyZWFtIGRldmVsb3BtZW50IG9wZW4gdmlkZW8gY2FsbA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAg PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9kcmVhbS1kZXZlbG9wbWVudC1vcGVuLXZpZGVv LWNhbGwvMTcwNTMvMT4NCg0KDQpBbnRvbiBCYWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBHcmVldGluZ3MhDQoNCiAgV2UgYXJlIHBsYW5uaW5nIHRvIGhvc3QgdGhlIGZpcnN0IERyZWFt IGRldmVsb3BtZW50IHZpZGVvIGNhbGwgd2l0aA0KICBAc2FiaW5lIG9uIERpc2NvcmQgb24gRnJp ZGF5LCA4IEF1Z3VzdCwgYXQgOTowMCBBTSBCZXJsaW4gdGltZS4NCg0KICBQbGVhc2Ugam9pbiBb I3dlYmRldl0gb24gdGhlIE9DYW1sIERpc2NvcmQgaWYgeW914oCZZCBsaWtlIHRvDQogIHBhcnRp Y2lwYXRlLiBJIHdpbGwgaGFuZGxlIHF1ZXN0aW9ucyBhYm91dCBqb2luaW5nIHRoZSBtZWV0aW5n DQogIHRoZXJlLiBXZSB3aWxsIHByb2JhYmx5IHVzZSBvbmUgb2YgdGhlIHZvaWNlIGNoYXQgY2hh bm5lbHMgb24gdGhlDQogIHNlcnZlciAod2hpY2ggc3VwcG9ydHMgdmlkZW8pLg0KDQogIFRoZSB0 b3BpYyBvZiB0aGUgbWVldGluZyB3aWxsIGJlIGRpc2N1c3Npbmcgb3BlbiBQUnMgYW5kIGdldHRp bmcgdGhlbQ0KICByZWFkeSBmb3IgbWVyZ2UgYnkgb3VyIGNvbGxlY3RpdmUgZWZmb3J0cywgYW5k IG5lZWRlZCBpbXByb3ZlbWVudHMuIFdlDQogIHdvdWxkIGxpa2UgdG8gcHV0IG9mZiBjb25jZXB0 dWFsIGFuZCBzdHJhdGVnaWMgZGlzY3Vzc2lvbnMgdW50aWwgdGhlDQogIHZlcnkgZW5kIG9mIHRo ZSBtZWV0aW5nLCBvciB0byBhIGZ1dHVyZSBkYXRlLg0KDQogIEFuZCBwbGVhc2UgYmVhciB3aXRo IHVzIGFzIHdlIGZpZ3VyZSBvdXQgd2hhdCBwbGF0Zm9ybSBpcyBiZXN0IHRvIHVzZQ0KICBhbmQg aG93IHRvIHVzZSBpdCA6KSBXZSBjYW7igJl0IHByb21pc2UgdGhhdCB0aGUgZmlyc3QgbWVldGlu ZyB3aWxsIGdvDQogIHdpdGhvdXQgYW55IGlzc3VlcywgYnV0IHdlIHdpbGwgd29yayBvdXQgZXZl cnl0aGluZyBiYXNlZCBvbg0KICBleHBlcmllbmNlIDopDQoNCiAgSG9wZSB0byBzZWUgeW91IHRo ZXJlIQ0KDQoNClsjd2ViZGV2XQ0KPGh0dHBzOi8vZGlzY29yZC5jb20vY2hhbm5lbHMvNDM2NTY4 MDYwMjg4MTcyMDQyLzQzOTA2Mjc0NDEwNTQ4NDI4OD4NCg0KDQpPdGhlciBPQ2FtbCBOZXdzDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KRnJvbSB0 aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtzIGZyb20g bWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJsb2ddLg0K DQogIOKAoiBbVXBjb21pbmcgT0NhbWwgRXZlbnRzXQ0KICDigKIgW0FkdmVudHVyZXMgd2l0aCBC dWlsZEtpdF0NCg0KDQpbdGhlIG9jYW1sLm9yZyBibG9nXSA8aHR0cHM6Ly9vY2FtbC5vcmcvYmxv Zy8+DQoNCltVcGNvbWluZyBPQ2FtbCBFdmVudHNdIDxodHRwczovL29jYW1sLm9yZy9ldmVudHM+ DQoNCltBZHZlbnR1cmVzIHdpdGggQnVpbGRLaXRdDQo8aHR0cHM6Ly93d3cuZHJhMjcudWsvYmxv Zy9wbGF0Zm9ybS8yMDI1LzA3LzI5L3RhbWluZy1idWlsZGtpdC5odG1sPg0KDQoNCk9sZCBDV04N CuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwg eW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBv ciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhl DQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkg d2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoN CiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5z Y2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0 cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0 dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 29 to August 05,= 2025.

    My fourth Outreachy Internship Blog post

    Matthew Idungafa announced

    Hello everyone! I've just published my first midpoint Outreachy blog post a= bout my progress contributing to Dune. You can read it here: https://medium.com/@mattidungafa/outreachy-internship-midpoint-post-f93= 33c9c3c86. Stay tuned for more updates!

    qcheck-lin and qcheck-stm 0.2

    Jan Midtgaard announced

    Version 0.9 of qcheck-lin, qcheck-stm, and = qcheck-multicoretests-util is now available from your favorite opam = repository! :tada:=20

    The 0.9 release contains adjustments to the public interface of Lin in order to make it compatible with 5.5.0+trunk and also= switches the Util.Pp pretty printers to use QCheck.Prin= t for consistency:

    • = #566: Use QCheck.Print combinators in Util.Pp= too for consistency, e.g., to avoid that STM argument and res= ult printer outputs differ.
    • = #562: Fix the int32 and int64 printers in bot= h Lin and STM to add missing l and <= code>L suffixes on literals.
    • = #560: Change Lin.{constructible,deconstructible} from an e= mpty variant type to an abstract type to get Lin compiling on 5.5.0+trunk<= /code> again, due to = ocaml/ocaml#13994 removing special handling of abstract and empty varia= nts defined in the current module.

    Happy testing! :smiley:

    CRs Workflows: Invitation for Early Testing and Discussion

    Mathieu Barbin announced

    I just published a blog post about CRs Workflows, a new open source tool fo= r managing code review comments embedded in source code, with reusable GitH= ub Actions workflows. If you=E2=80=99re interested in trying it out or shar= ing feedback, you can read more here: https://mbarbin.github.io/crs/blog/launc= hing-crs-workflows/.

    Thank you!

    OCaml version of the "Build systems =C3=A0 la carte" paper

    jbeckford announced

    There is a great paper distilling several different build systems (Make, Ex= cel, Bazel, etc.) into a unified framework. One of its authors is on the Du= ne team (I think). If you want to understand or write build systems, it is = a good read because it uses language that can be understood by non-academic= s:

    https://www.cambridge.org/core/journals/journal-of-fu= nctional-programming/article/build-systems-a-la-carte-theory-and-practice/0= 97CE52C750E69BD16B78C318754C7A4

    All of its examples are in Haskell so I wrote a version in OCaml. Most of m= y OCaml translation was aided by the English paragraphs rather than the Has= kell code (the latter was hieroglyphics to me). Regardless, I=E2=80=99m fai= rly sure some of the concepts don=E2=80=99t translate to OCaml well.

    If you are interested in build systems, the first place to start is the tes= t directory https://gitlab.com/dkml/build-too= ls/MlFront/-/tree/V2_4/tests/MlFront_Thunk?ref_type=3Dheads (the = alacarte_*.ml modules). The tests correspond to the paper=E2=80=99s = section numbers, although there are also alacarte_x*.ml tests = where I extended the framework. Then you can scan the source code at https://gitlab.com/dkml/build-tools/MlFront/-/tree/V2= _4/src/MlFront_Thunk?ref_type=3Dheads (the Build*.ml and <= code>Promise.ml modules).

    PRs welcome!

    Dream development open video call

    Anton Bachin announced

    Greetings!

    We are planning to host the first Dream development video call with @sabine= on Discord on Friday, 8 August, at 9:00 AM Berlin time.

    Please join #webdev on the OCaml Discord if you=E2=80=99d like to p= articipate. I will handle questions about joining the meeting there. We wil= l probably use one of the voice chat channels on the server (which supports= video).

    The topic of the meeting will be discussing open PRs and getting them ready= for merge by our collective efforts, and needed improvements. We would lik= e to put off conceptual and strategic discussions until the very end of the= meeting, or to a future date.

    And please bear with us as we figure out what platform is best to use and h= ow to use it :) We can=E2=80=99t promise that the first meeting will go wit= hout any issues, but we will work out everything based on experience :)

    Hope to see you there!

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=qsxVTYVI; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=SWgxObgf; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 74BF240066 for ; Tue, 12 Aug 2025 15:32:40 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=3lUqQ5fK8VQqsrL3AMHwELIfxTMTr/LsvbJIrXRD5ps=; b=qsxVTYVIQe18AY4vnP+4f9FZrjo+PJlcFsbRI1md9nNnsdVFqP7iMnWV 2pthT64xD/5QqMgJ4xyWQollD2AJjEOLiF1NEVjEUZrCiXtD4WLk9HRvP KZPLFFg6HB4kAWy1mANOZiXxgCdq69OMzjTXbxsbRGmdlIW0e98wWjxBe A=; X-CSE-ConnectionGUID: AVViLlwUShec2prs2RF09w== X-CSE-MsgGUID: HYXHxqzARq+j49BMsTe3AQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.17,284,1747692000"; d="scan'208,217";a="234876386" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 12 Aug 2025 17:32:40 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 2EA60E0CD5; Tue, 12 Aug 2025 17:32:40 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id EB29CE0171 for ; Tue, 12 Aug 2025 17:32:37 +0200 (CEST) X-CSE-ConnectionGUID: fi/qeBQlSYCeqplKtKAhKQ== X-CSE-MsgGUID: NcA6JmXXRy6Wajv9DXkwmw== IronPort-SDR: 689b5e95_QDaV9zp3ngTKYCU4ye8k3X/qmmBWREnQgld2fbcdGwaC+8V uiOJrNX0YJUeXSmhszW1jFbmjHMHkxagP34Ex6Q== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HvQQBkXZtohSIeaIFSCBoBAQEBATwBAQEBAgIBAQEBA?= =?us-ascii?q?gEBAQEDAQEBAYFoAoE7WygZAWZaMwcISYRVg0+FLIh2gkABmgeBVYElAzMeF?= =?us-ascii?q?QEDAQ0UAgECDgcBFQoBAgQBAQMBAgFDg3dGjCUCHwYBBDEIDgECBAEBAQEDA?= =?us-ascii?q?gMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAQEBAUBJhk8NgkVRQRIedAEBA?= =?us-ascii?q?QEBAQEBAQIBAQEiAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQIMAYEnChMBASsNGCMDEAQBBgMCEQE1FwESFAYBgmcBgh8CA?= =?us-ascii?q?ksDBAEMBpMwm0x6gTKBAYIMAQEGgQhQAw8v2guBZAmBSQGFbIJKGgEqSGsCh?= =?us-ascii?q?EiDHYEfJw+BVUSEDm+CShcBAQEBgSgPBQEBTYMugmmCJoECFB2BPoI+gjOBK?= =?us-ascii?q?UOILIF3AYdAgUQiAyYzLAFVExcLBwVbgQgDKjQxbjIdgSeFGIQnK0+FEIEZg?= =?us-ascii?q?1MRE2sPBoEVg2mBIEADC209NxQbk3MXKRlqgUMEKw4+Lh8VFBQFAQcUDgIiD?= =?us-ascii?q?SkFCQsgMSZEBgsLLwOSf4EhnH2UYzQHhB+BXgYMiQiBJpYGhVukBoEKIphkI?= =?us-ascii?q?oldgSYJgW9riHqBFIsWPDmFIIFqAjaBXDMaMCIhgmcJRhwPj1UBAoJJEIEug?= =?us-ascii?q?SaBdDtarC9BNQIBATgCBwEKAQEDCYVFHQEBjDqBSwEB?= IronPort-PHdr: A9a23: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 Mycu8GG9gE= IronPort-Data: A9a23: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 9Vn35Ty6Ilp5qycNH16BDjlI65Mb08= IronPort-HdrOrdr: A9a23:AriqOal1G/MBg7x1rgVii+cqA+vpDfIR3DAbv31ZSRFFG/Fw9v re/8jzsCWftN9/Yh8dcLy7VZVoIkm9yXcW2+gs1N6ZNWGMhILCFu5fBOXZrwHIKmnXyap21K trcaRyYeeAb2RSvILd+wf9N94hxbC8gcSVbArlvhJQcT0= X-Talos-CUID: =?us-ascii?q?9a23=3AWnlrmmg+nr7hm49p7nOc2TGA2TJufHya1Xr6Gku?= =?us-ascii?q?DOE1kUaWRakOz0aNHqp87?= X-Talos-MUID: 9a23:M6oBIwXJ7Ly9TdDq/BnnrW9AMfdY2bXwN0kPj8Qqi8qbMDMlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.17,284,1747692000"; d="scan'208,217";a="234876360" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDHDWCcwYtEGTwfbhbpBdQkZ6S3DGCvd/2wp1R?= =?us-ascii?q?TXeuIJxH92nfO25cwMJP7wrPmMD1Z2ZJj/g0c9Thpo+UtfHdBnVUu+ww?= =?us-ascii?q?OYA/2Kd2gZcSIcsLFxn9TaO9DutWsKTx68POR8zHVP/86tUXIIwB1IyY?= =?us-ascii?q?Uvch419ionlOqhckmxx7ZD1Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 12 Aug 2025 17:32:37 +0200 Received: from TM.local (cust-east-par-46-193-79-82.cust.wifirst.net [46.193.79.82]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BFEDB564F05; Tue, 12 Aug 2025 17:32:35 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1755012755; bh=yHFLGDPqtWQRsgpbuuwzZ+fisHTVv+CXX9VZd/YAX4E=; h=From:To:Subject:Date:Message-ID; b=SWgxObgfebHomppXV4h0DVYRgClSZ9LAyoEOa3YyhzvV6Sr363kA7uMuB0ONDZYga sSA2kc2G3Z4DsdTagd0YjIX7lcUh/HyZzOAePBgMnkr9TMmIwSsC0Xl9uUGW469Ei6 T0SmluFRc6QQeBSenPYcS3Zwq6B4QfSeC7dGJUIw= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 12 Aug 2025 17:32:34 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 12 17:32:36 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.491090, queueID=3897A564F06 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19360 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of August 05 to 12, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Slipshow! Miou, a simple scheduler for OCaml 5 Dream development open video call Other OCaml News Old CWN Slipshow! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is with some /bitter/ joy that I=E2=80=99m announcing the 0.4.1 versio= n of Slipshow [on opam]: [on opam] The slides strike back =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The main improvements of this version are the introduction of arguments to actions, a frontmatter, and improvements to slides. All together, they allow to easily design presentations the slides way: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 --- =E2=94=82 toplevel-attributes: {children:slide children:enter=3D"~duratio= n:0"} =E2=94=82 --- =E2=94=82=20 =E2=94=82 # Slide 1 =E2=94=82=20 =E2=94=82 Content =E2=94=82=20 =E2=94=82 --- =E2=94=82=20 =E2=94=82 # Slide 2 =E2=94=82=20 =E2=94=82 Content =E2=94=82=20 =E2=94=82 --- =E2=94=82=20 =E2=94=82 # Slide 3 =E2=94=82=20 =E2=94=82 You get it =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 So, why =E2=80=9C=E2=80=8B/bitter/ joy=E2=80=9D? I was reluctant to add good support for traditional slide-based presentation. There are already very good and mature solutions for this, including some with similar technical foundations as Slipshow. I was more interested in developping the new things: Slips! However, Slipshow starts to have useful features that competitor don=E2= =80=99t always have (for instance: a self-contained html output! But more, and more to come). Also, for people who already have slide-based presentations, it makes it easier to migrate them, and use a single tool for old and new presentations! Finally, I wanted to make Slipshow a bit more versatile and added attributes, frontmatter, and a new options: `toplevel-attributes'. The proper slide support is actually just a nice consequence of this versatility! =F0=9F=A5=B3 Here is the full changelog: =E2=80=A2 Fix `children:' not working sometimes =E2=80=A2 Add `--toplevel-attributes' to control the attributes on the toplevel container =E2=80=A2 Render slide titles as slide titles =E2=80=A2 Add arguments to actions =E2=80=A2 Add frontmatter You can now do =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 --- =E2=94=82 theme: vanier =E2=94=82 dimension: 16:9 =E2=94=82 css: my_pres.css =E2=94=82 --- =E2=94=82=20 =E2=94=82 The content here. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml-specific notes on action arguments =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In this release, I add the ability to give arguments to actions. For instance, an action can be to focus on a specific element: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 {#my_element} =E2=94=82 Some content =E2=94=82=20 =E2=94=82 {focus=3D"my_element"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The "positional" arguments is the list of IDs that must be focused. To add other kind of arguments , they need to be named: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 {#my_element} =E2=94=82 Some content =E2=94=82=20 =E2=94=82 {focus=3D"~duration:2 ~margin:5 my_element"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It was fun to integrate OCaml syntax in slipshow ;) This way, people coming to OCaml after learning slipshow will feel familiar with the syntax! Paul-Elliot later announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 The Slipshow development intensifies=E2=80=A6 It is with external pleasure that I announce the [0.5.0] release of slipshow [on opam]. Warning: External files have invaded our world! They raise dead formats like PDF into the liveliness of Slipshow presentations! [0.5.0] [on opam] Slipshow 0.5.0: Plan 9 from External Files =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C As subtly hinted by the title, this slipshow release focuses on the integration of external files in a presentation. Rest assured, a compiled Slipshow presentation stays a standalone HTML file! In effect, you can now include PDFs, videos and audios files in your presentations! Here is a demo: With the simple source: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 {#title} =E2=94=82 # Plan 9 from External Files =E2=94=82=20 =E2=94=82 {pause play-media=3Dmp4} =E2=94=82 ## Video demo =E2=94=82=20 =E2=94=82 ![](plan9.mp4){#mp4 style=3D"width:100%"} =E2=94=82=20 =E2=94=82 {pause up} =E2=94=82=20 =E2=94=82 ## PDF demo =E2=94=82=20 =E2=94=82 ![](plan9.pdf){#pdf} =E2=94=82=20 =E2=94=82 {focus=3Dpdf} =E2=94=82=20 =E2=94=82 {change-page=3D"~n:all pdf"} =E2=94=82=20 =E2=94=82 {unfocus up=3Dtitle} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here is the full changelog: =E2=97=8A Compiler =E2=80=A2 Add support for pdfs =E2=80=A2 Add support for audios and videos =E2=80=A2 Fix `enter' action being added to blockquotes =E2=97=8A Language =E2=80=A2 Add a carousel type and a `change-page' action =E2=80=A2 Add a `play-media' action =E2=97=8A Engine =E2=80=A2 Fix compatibility of slipshow and editable content =E2=80=A2 Fix scroll bar appearing in drawing toolbox Miou, a simple scheduler for OCaml 5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am pleased to announce the release of [miou.0.4.0], the documentation was just updated [here] and the book to learn about Miou is still available [here]. This version mainly consolidates our experiments with other libraries, notably: [`ocaml-dns'], [`happy-eyeballs'], [`mirage-crypto'], [`ocaml-tls'], [`httpcats'], [`carton'], [`sendmail'] and [`caqti']. This consolidation of the API allows us to go further and, in particular, to start offering the [development of unikernels with OCaml 5]. To this end, you can follow projects such as [miou-solo5] or [chaos]. An overview is available [on my blog] (which presents the latest Mirage retreat in May). We would also like to continue improving [Vif] and [Hurl] ([a tutorial] has just been published on this subject). Other projects are still in the experimental phase, such as: [`notty' / `nottui'], [`blaze'], [`multipart_form'] or [`awa-ssh']. Finally, we would like to thank everyone who has participated directly or indirectly in this project and to its integration into the OCaml ecosystem. Happy hacking! [miou.0.4.0] [here] [here] [`ocaml-dns'] [`happy-eyeballs'] [`mirage-crypto'] [`ocaml-tls'] [`httpcats'] [`carton'] [`sendmail'] [`caqti'] [development of unikernels with OCaml 5] [miou-solo5] [chaos] [on my blog] [Vif] [Hurl] [a tutorial] [`notty' / `nottui'] [`blaze'] [`multipart_form'] [`awa-ssh'] Dream development open video call =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Anton Bachin announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For those interested in minutes/notes, providing a brief summary :slight_smile: We had a chat about how to maintain Dream as a community, added several people to the repo (master branch is locked for security), and worked through what we can do immediately on several PRs. I showed how I maintain Dream on those PRs, and several others contributed their thoughts and ideas. At the end we talked off-topic a bit about the future of Dream and bigger projects in it and around it to tackle. It=E2=80=99s difficult to write out minutes as it was a lot of detailed t= alk and work =E2=80=93 adding specific people, dealing with specific issues. = One can see the recent activity in the [Dream repo] to see our guinea pig PRs :slight_smile: [Dream repo] Anton Bachin later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We=E2=80=99re going to have the next dev meeting this coming Friday, and weekly thereafter. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Irmin Retrospective] [the ocaml.org blog] [Upcoming OCaml Events] [Irmin Retrospective] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 05 to 12, 2025.

    Slipshow!

    Paul-Elliot announced

    It is with some bitter joy that I=E2=80=99m announcing the 0.4.1 ver= sion of Slipshow on opam:

    The slides strike back

    The main improvements of this version are the introduction of arguments to = actions, a frontmatter, and improvements to slides.

    All together, they allow to easily design presentations the slides way:

    https://github.com/user-attachments/assets/844754a7-7731-4= 5a8-8cc5-97a315d5cd92

    ---
    toplevel-attributes: {children:slide children:enter=3D"~duration:0"}
    ---
    
    # Slide 1
    
    Content
    
    ---
    
    # Slide 2
    
    Content
    
    ---
    
    # Slide 3
    
    You get it
    

    So, why =E2=80=9C=E2=80=8Bbitter joy=E2=80=9D?

    I was reluctant to add good support for traditional slide-based presentatio= n. There are already very good and mature solutions for this, including som= e with similar technical foundations as Slipshow. I was more interested in = developping the new things: Slips!

    However, Slipshow starts to have useful features that competitor don=E2=80= =99t always have (for instance: a self-contained html output! But more, and= more to come). Also, for people who already have slide-based presentations= , it makes it easier to migrate them, and use a single tool for old and new= presentations!

    Finally, I wanted to make Slipshow a bit more versatile and added attribute= s, frontmatter, and a new options: toplevel-attributes. The pr= oper slide support is actually just a nice consequence of this versatility!= =F0=9F=A5=B3

    Here is the full changelog:

    • Fix children: not working sometimes
    • Add --toplevel-attributes to control the attributes on the= toplevel container
    • Render slide titles as slide titles
    • Add arguments to actions
    • Add frontmatter=20

      You can now do

      ---
      theme: vanier
      dimension: 16:9
      css: my_pres.css
      ---
      
      The content here.
      

    OCaml-specific notes on action arguments

    In this release, I add the ability to give arguments to actions. For instan= ce, an action can be to focus on a specific element:

    {#my_element}
    Some content
    
    {focus=3D"my_element"}
    

    The "positional" arguments is the list of IDs that must be focused. To add = other kind of arguments , they need to be named:

    {#my_element}
    Some content
    
    {focus=3D"~duration:2 ~margin:5 my_element"}
    

    It was fun to integrate OCaml syntax in slipshow ;) This way, people coming= to OCaml after learning slipshow will feel familiar with the syntax!

    Paul-Elliot later announced

    The Slipshow development intensifies… It is with external pleasure t= hat I announce the 0.5.0 release of slipshow on opam.

    Warning: External files have invaded our world! They raise dead formats lik= e PDF into the liveliness of Slipshow presentations!

    Slipshow 0.5.0: Plan 9 from External Files

    As subtly hinted by the title, this slipshow release focuses on the integra= tion of external files in a presentation. Rest assured, a compiled Slipshow= presentation stays a standalone HTML file!

    In effect, you can now include PDFs, videos and audios files in your presen= tations! Here is a demo:

    https://github.com/user-attachments/assets/bf7d5933-9b29-4= e52-ac2a-c4a9a87d9dc6

    With the simple source:

    {#title}
    # Plan 9 from External Files
    
    {pause play-media=3Dmp4}
    ## Video demo
    
    ![](plan9.mp4){#mp4 style=3D"width:100%"}
    
    {pause up}
    
    ## PDF demo
    
    ![](plan9.pdf){#pdf}
    
    {focus=3Dpdf}
    
    {change-page=3D"~n:all pdf"}
    
    {unfocus up=3Dtitle}
    

    Here is the full changelog:

    • Compiler
      • Add support for pdfs
      • Add support for audios and videos
      • Fix enter action being added to blockquotes
    • Language
      • Add a carousel type and a change-page action
      • Add a play-media action
    • Engine
      • Fix compatibility of slipshow and editable content
      • Fix scroll bar appearing in drawing toolbox

    Miou, a simple scheduler for OCaml 5

    Calascibetta Romain announced

    I am pleased to announce the release of miou.0.4.0, the documentation was just updated here and the book to learn about Miou is still ava= ilable here. This version= mainly consolidates our experiments with other libraries, notably: ocaml-dns, happy-eyeballs, mirage-c= rypto, oc= aml-tls, httpcats, carton, s= endmail and caqti.

    This consolidation of the API allows us to go further and, in particular, t= o start offering the development of unikernels with OCaml 5. To t= his end, you can follow projects such as miou-solo5 or chaos. An overview is available on my blog (which presents the l= atest Mirage retreat in May).

    We would also like to continue improving Vif and Hurl= (a tutorial has just= been published on this subject).

    Other projects are still in the experimental phase, such as: notty / nottui, blaze= , multipa= rt_form or a= wa-ssh.

    Finally, we would like to thank everyone who has participated directly or i= ndirectly in this project and to its integration into the OCaml ecosystem.

    Happy hacking!

    Dream development open video call

    Continuing this thread, Anton Bachin announced

    For those interested in minutes/notes, providing a brief summary :slight_sm= ile:=20

    We had a chat about how to maintain Dream as a community, added several peo= ple to the repo (master branch is locked for security), and worked through = what we can do immediately on several PRs. I showed how I maintain Dream on= those PRs, and several others contributed their thoughts and ideas.

    At the end we talked off-topic a bit about the future of Dream and bigger p= rojects in it and around it to tackle.

    It=E2=80=99s difficult to write out minutes as it was a lot of detailed tal= k and work =E2=80=93 adding specific people, dealing with specific issues. = One can see the recent activity in the Dream repo to see our guinea pig PRs :slight_smile:

    Anton Bachin later added

    We=E2=80=99re going to have the next dev meeting this coming Friday, and we= ekly thereafter.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=sXy7iyxD; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=LAQJk5V8; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 559A840066 for ; Tue, 19 Aug 2025 12:20:57 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=WhjxkGc/Wf3bxJsRM90nAPPFT6+SvRcFjw+Afl1s/4w=; b=sXy7iyxDbUI+PllLzG9D7SOfAeQqyQQ5T0JTwLxOlOKUGDZBpOiczfc6 G121c92PJjX+QnfB8zLHIUOQFDp9mKM6vQ5CUrP8IM3L9qf/LoAn6w66R MX0Eo62UxSreQ2b6WUpHsjWZFKBWAztu+M6aGcU8DOxCmDOzKgDXtdgT1 0=; X-CSE-ConnectionGUID: fxsIBfyISsGVBWw43pBpkQ== X-CSE-MsgGUID: G+pAIfIcQkW7x0rXlYm1Uw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.17,300,1747692000"; d="scan'208,217";a="235428638" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 19 Aug 2025 14:20:57 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 25E29E0CD6; Tue, 19 Aug 2025 14:20:57 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 41279E0171 for ; Tue, 19 Aug 2025 14:20:50 +0200 (CEST) X-CSE-ConnectionGUID: ElsUWRcsSEC+oj/O2nSoUw== X-CSE-MsgGUID: JR0KeUv5Tci7NXLyEFuhxg== IronPort-SDR: 68a46c21_7PZMGREcycWXihZ9T4HtADm3wBNB5QBF6zEA3n5hFO1zMz1 WAC4FqEzTbFnZXS8rInSBQzpzaqP6FSQe5D/3MA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GABACGa6RohSIeaIFahBmBAxkBZ1ozBwhJQx6DdINPj?= =?us-ascii?q?iKBFpsygWmBEQMYFgUeFQEDAQ0uARsEAQIEAQEDAQIBggyCLkYCFowPAh8GA?= =?us-ascii?q?QQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAQEBAUBJh?= =?us-ascii?q?k8NgkVRUx5eFgEBAQEBAQEBAQEBAQEBIgEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAQEARkecAQGEwEBMgYYIwMUAQYDA?= =?us-ascii?q?gQNATUXARIagmgBgiACAk4DBQwGnx2bTHp/M4EBggwBAQaBCFADDy/aC4FkC?= =?us-ascii?q?YExGIVsgkoaASpJawKER4MdgR8nD4FVRIEVNYFzSgdvgVAySBcBAQEBXEQcA?= =?us-ascii?q?QEIBgM8CYMlgmmCJoECFB2BPoI8gjOBBSSIbIFuA3gihmKBREszLAFVExcLB?= =?us-ascii?q?wVbgQgDKjQxbjIdgSeFFoQnK0+FDoEZg1MRE2sPBoEVg2WCEEADC209NxQbl?= =?us-ascii?q?DEXKRlqgU8lDlUXbAkWAQFYOR4WCA0OGwEEASkFAwMGBQIthGOOBxQEkAaOG?= =?us-ascii?q?JRjNAeEH4FeBgyJCIEmlgaFW6N0gRwimGQiiV2BJgmBbx9MlSQ8hVmBfyOBR?= =?us-ascii?q?g8HMxowQ4JnCQo8HA+Nfy4Wg14QgS6BJnoqFzk7r0BBNQIBATgCBwEKAQEDC?= =?us-ascii?q?YViAQGMCDKBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:Q/Le1at4xHS7tdFOhJUePdNy7skDS9V00zEX/kB9WHVpm62j5q OTdZEgvyMc5wx+ZJhNo7290cq7IU80l6QV3WB5B97LNzUO01HGEGgN1+ff6gylMxK73O9Q36 VtfsFFeb/NJGk/q931pC2xE9NI+qjizElEv5a680tQ X-Talos-CUID: =?us-ascii?q?9a23=3ATVRPEGtFGsvlPtX2ea7SCBh66IsIdmbg803bOHS?= =?us-ascii?q?VIiVuSvqyE1mr/557xp8=3D?= X-Talos-MUID: 9a23:n5PRhwmt2hSc5jQ0zk39dnpADp9L7pmwVXwGkMogi+2VGAJtOyeS2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.17,300,1747692000"; d="scan'208,217";a="235428615" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEg+El+HLDpMg/XD5Qe6W0bfxxBqwwzKA8RgR?= =?us-ascii?q?OMg/527Lv+q3JvrC7Qfq9+u8OaKDXst4PCxfEUSCGjCZCORSOWzLyaEP?= =?us-ascii?q?JK8QbIbgNyR7X+zT7uU/3BAtBa5agJ9wnLMVt78vEKXjveMM7wJzL/FV?= =?us-ascii?q?IaB1HxppRYEyknYkocKuvyHw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 19 Aug 2025 14:20:49 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 83E51564DAD; Tue, 19 Aug 2025 14:20:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1755606048; bh=SCm8GINUSaxEPs5vhHBA4P3wWfgbJnCRd2FOHV2RG8s=; h=From:To:Subject:Date:Message-ID; b=LAQJk5V8uzmK76TLijhGzE2/VcgUs7Klgj/piN9Hb1YrIyimLg86PBywjmaYb6MGY szg/V3mpnKW0hHG5AvDX82WmJCUdSXjPW8tiuwCNN/Ndc8h9wGJdWlVib7qc1R7a6S oXtAuhRxZOWwUds8XjdXSC/2XZ85XOPlooRSGql0= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 19 Aug 2025 14:20:46 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Aug 19 14:20:48 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.479770, queueID=BFFC0564DB3 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19365 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDEyIHRvIDE5LA0KMjAyNS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpodHRwY2F0 cywgb2NhbWwtaDEsIHZpZiwgYW5kIGh1cmw6IGEgd2Vic3RhY2sgZm9yIE9DYW1sIDUNCldoeSBM ZWFuIDQgcmVwbGFjZWQgT0NhbWwgYXMgbXkgUHJpbWFyeSBMYW5ndWFnZQ0KUmVtaW5kZXI6IFlv dSBDYW4gU3RpbGwgQ29tZSB0byBXYXJzYXcgZm9yIEZVTiBPQ2FtbA0KT3RoZXIgT0NhbWwgTmV3 cw0KT2xkIENXTg0KDQoNCmh0dHBjYXRzLCBvY2FtbC1oMSwgdmlmLCBhbmQgaHVybDogYSB3ZWJz dGFjayBmb3IgT0NhbWwgNQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4taHR0cGNhdHMtb2NhbWwtaDEtdmlmLWh1cmwtYS13ZWJzdGFjay1mb3Itb2Nh bWwtNS8xNzEwNC8xPg0KDQoNCkNhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIGFtIGRlbGlnaHRlZCB0byBhbm5vdW5jZSB0 aGUgcmVsZWFzZSBvZiBgaHR0cGNhdHMuMC4xLjAnLCBgb2NhbWwtaDEnDQogIChpbmNsdWRpbmcg V2ViU29ja2V0cyBzdXBwb3J0KSwgYW5kIHRoZSBleHBlcmltZW50YWwgcmVsZWFzZSBvZiBgdmlm JywNCiAgYSB3ZWIgZnJhbWV3b3JrIGZvciBPQ2FtbCA1LCBhbmQgYGh1cmwnLCBhbiBIVFRQIGNs aWVudCBpbiBPQ2FtbC4NCg0KDQpgb2NhbWwtaDEnDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYwNCg0KICBbYG9jYW1sLWgxJ10gaXMgYW4gYXV0aG9yaXNlZCBmb3JrIG9mIFtodHRwL2Fm XSAoYWZ0ZXIgZXhwbGljaXQNCiAgcGVybWlzc2lvbiBmcm9tIGl0cyBhdXRob3IpIGluIG9yZGVy IHRvIGNvbnRpbnVlIGl0cyBkZXZlbG9wbWVudCBhbmQNCiAgcmVsZWFzZSBwcm9jZXNzLiBJdCB3 YXMgY3JlYXRlZCBpbiBNYXkgMjAyNCBhbmQgbm93IGluY2x1ZGVzIHN1cHBvcnQNCiAgZm9yIHdl YnNvY2tldHMgKGFuZCBjb25uZWN0aW9uIHVwZ3JhZGVzKSB0aGFua3MgdG8gdGhlIHdvcmsgb2Yg QHN3cnVwLg0KDQoNCltgb2NhbWwtaDEnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3Av b2NhbWwtaDE+DQoNCltodHRwL2FmXSA8aHR0cHM6Ly9naXRodWIuY29tL2luaGFiaXRlZHR5cGUv aHR0cGFmPg0KDQoNCmBodHRwY2F0cycsIGEgSFRUUCBjbGllbnQvc2VydmVyIHdpdGggW2BtaW91 J10NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEl0IHdhcyBpbiAyMDIzIHRoYXQgd2Ug YmVnYW4gZXhwZXJpbWVudGluZyB3aXRoIE9DYW1sIDUgYW5kIEhUVFANCiAgcmVxdWVzdHMgd2l0 aHRoZSBbYGh0dHBjYXRzJ10gcHJvamVjdDoNCg0KICA8aHR0cHM6Ly94LmNvbS9EaW5vb3NhdXJl L3N0YXR1cy8xNzEwMzIwNjAzMTEzMDk1NTM4Pg0KDQogIFRoaXMgcHJvamVjdCBhbGxvd2VkIHVz IHRvIGNvbnNvbGlkYXRlIHNvbWUgb2Ygb3VyIGxpYnJhcmllcywgc3VjaA0KICBhc35taXJhZ2Ut Y3J5cHRvfiwgaW4gb3JkZXIgdG8gbW92ZSBiZXlvbmQgT0NhbWwgNSBhbmQsIGluIHBhcnRpY3Vs YXIsDQogIHRvIHJlc29sdmUgdGhlIGZldyBkYXRhLXJhY2VzIHdlIGhhZCAoaGF2aW5nIHN0YXJ0 ZWQgc29tZSBvZiBvdXINCiAgcHJvamVjdHMgYmVmb3JlIE9DYW1sIG11bHRpY29yZSB3YXMgZXZl biBtZW50aW9uZWQpLg0KDQogIEFmdGVyIHNvbWUgZmFpcmx5IGV4dGVuc2l2ZSBtYWludGVuYW5j ZSB3b3JrLCB3ZSB3ZXJlIGZpbmFsbHkgYWJsZSB0bw0KICBsYXkgdGhlIGdyb3VuZHdvcmsgZm9y IGFuIE9DYW1sIEhUVFAgY2xpZW50IHRoYXQgY2FuIG1ha2UgcGFyYWxsZWwNCiAgcmVxdWVzdHMg dXNpbmcgTWlvdS4NCg0KICBgaHR0cGNhdHMnIGhhcyB0aGVyZWZvcmUgaW1wcm92ZWQgb3ZlciB0 aW1lIGFuZCBvZmZlcnMgYSBmYWlybHkgc2ltcGxlDQogIHdheSB0byBtYWtlIEhUVFAgcmVxdWVz dHMgaW4gT0NhbWwgKHRoYW5rcyB0byBvdXIgZXhwZXJpZW5jZSB3aXRoDQogIFtodHRwLWx3dC1j bGllbnRdKSBhbmQgdG8gaW1wbGVtZW50IGFuIEhUVFAgc2VydmVyIHRoYXQgY2FuIGhhbmRsZQ0K ICBpbmNvbWluZyBIVFRQIHJlcXVlc3RzIGluIHBhcmFsbGVsLiBUaGUgW2RvY3VtZW50YXRpb25d IGhhcyBiZWVuDQogIGltcHJvdmVkIGFuZCBpcyBwYXJ0aWN1bGFybHkgY29tcHJlaGVuc2l2ZSAo d2l0aCBleGFtcGxlcykgc28gdGhhdA0KICB1c2VycyBoYXZlIGNvbXBsZXRlIGNvbnRyb2wgb3Zl ciBhbGwgdGhlIHByb3RvY29sIGxheWVycyByZXF1aXJlZCBmb3INCiAgY29tbXVuaWNhdGlvbiB3 aXRoIHdlYiBzZXJ2aWNlOiBmcm9tIHRoZSBVbml4IHNvY2tldCB0byB0aGUgVExTDQogIC9oYW5k c2hha2UvIChpbmNsdWRpbmcgQUxQTiBuZWdvdGlhdGlvbiksIGluY2x1ZGluZyBkb21haW4gbmFt ZQ0KICByZXNvbHV0aW9uLg0KDQogIGBodHRwY2F0cycgYWxzbyBwYXJ0aWFsbHkgc3ludGhlc2l6 ZXMgb3VyIHdvcmsgb24NCiAgcHJvdG9jb2xzLiBFdmVyeXRoaW5nIG5lZWRlZCB0byBjb21tdW5p Y2F0ZSB3aXRoIHdlYiBzZXJ2aWNlcyBpcw0KICBpbXBsZW1lbnRlZCBpbiBPQ2FtbDoNCg0KICDi gKIgW2BvY2FtbC10bHMnXSBpcyB1c2VkIGZvciB0aGUgVExTIHByb3RvY29sDQogIOKAoiBbYG9j YW1sLWgxJ10gYW5kIFtgb2NhbWwtaDInXSBhcmUgdXNlZCBmb3IgdGhlIEhUVFAgcHJvdG9jb2wN CiAgICAoYGh0dHAvMS4xJyBhbmQgYGgyJykNCiAg4oCiIFtgb2NhbWwtZG5zJ10gYW5kIFtgaGFw cHktZXllYmFsbHMnXSBhcmUgdXNlZCBmb3IgZG9tYWluIG5hbWUNCiAgICByZXNvbHV0aW9uIGFu ZCB0aGUgYWJpbGl0eSB0byBwcmVmZXIgSVB2NiBjb25uZWN0aW9ucyBvciwgYXQgYmVzdCwNCiAg ICB0aGUgZmFzdGVzdCBUQ1AvSVAgY29ubmVjdGlvbnMNCg0KICBGaW5hbGx5LCBiZW5jaG1hcmtp bmcgd29yayBoYXMgYmVlbiBpbml0aWF0ZWQsIHRoZSBvcmlnaW5zIG9mIHdoaWNoDQogIGNhbiBi ZSBmb3VuZCBbaGVyZV0sIHNob3dpbmcgdGhlIHJlc3VsdHMgdGhhdCBjYW4gYmUgYWNoaWV2ZWQg d2l0aA0KICBgaHR0cGNhdHMnIGFzIGEgc2VydmVyLiBUaGUgYmVuY2htYXJrIGlzIHJlcHJvZHVj aWJsZSBhbmQgYXZhaWxhYmxlDQogIFtoZXJlXSwgYW5kIGhlcmUgYXJlIHRoZSByZXN1bHRzIHdl IG9idGFpbmVkIChvbiBBTUQgUnl6ZW4gOSA3OTUwWA0KICAxNi1Db3JlIFByb2Nlc3Nvcik6DQoN CiAg4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB 4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSB4pSBDQogICBjbGllbnRz ICB0aHJlYWRzICBsYXRlbmN5QXZnICBsYXRlbmN5TWF4ICBsYXRlbmN5U3RkZXYgIHRvdGFsUmVx dWVzdHMgDQogIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KICAg ICAgICAxNiAgICAgICAxNiAgNDcuNDN1cyAgICAgMi4yN21zICAgICAgMzguNDh1cyAgICAgICAg ICAgICA1MzAzNzAwIA0KICAgICAgICAzMiAgICAgICAzMiAgNzEuNzN1cyAgICAgMS4wNG1zICAg ICAgNDcuNTh1cyAgICAgICAgICAgICA3MDE2NzI5IA0KICAgICAgICA2NCAgICAgICAzMiAgMTQw LjI5dXMgICAgNS43Mm1zICAgICAgMTIxLjUwdXMgICAgICAgICAgICA3NjU4MTQ2IA0KICAgICAg IDEyOCAgICAgICAzMiAgMjc5LjczdXMgICAgMTEuMzVtcyAgICAgMjg3LjkydXMgICAgICAgICAg ICA3OTc3MzA2IA0KICAgICAgIDI1NiAgICAgICAzMiAgNTE5LjAydXMgICAgMTYuODltcyAgICAg MzMwLjIwdXMgICAgICAgICAgICA3ODE2NDM1IA0KICAgICAgIDUxMiAgICAgICAzMiAgMS4wNm1z ICAgICAgMzcuNDJtcyAgICAgNTM0LjE0dXMgICAgICAgICAgICA3NDA5NzgxIA0KICDilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHi lIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIHilIENCg0KDQpbYG1pb3UnXSA8aHR0cHM6 Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvbWlvdT4NCg0KW2BodHRwY2F0cyddIDxodHRwczovL2dp dGh1Yi5jb20vcm9idXItY29vcC9odHRwY2F0cz4NCg0KW2h0dHAtbHd0LWNsaWVudF0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2h0dHAtbHd0LWNsaWVudD4NCg0KW2RvY3VtZW50YXRp b25dDQo8aHR0cHM6Ly9vY2FtbC5vcmcvcC9odHRwY2F0cy9sYXRlc3QvZG9jL2h0dHBjYXRzL0h0 dHBjYXRzL2luZGV4Lmh0bWw+DQoNCltgb2NhbWwtdGxzJ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9t aXJsZWZ0L29jYW1sLXRscz4NCg0KW2BvY2FtbC1oMSddIDxodHRwczovL2dpdGh1Yi5jb20vcm9i dXItY29vcC9vY2FtbC1oMT4NCg0KW2BvY2FtbC1oMiddIDxodHRwczovL2dpdGh1Yi5jb20vYW5t b250ZWlyby9vY2FtbC1oMj4NCg0KW2BvY2FtbC1kbnMnXSA8aHR0cHM6Ly9naXRodWIuY29tL21p cmFnZS9vY2FtbC1kbnM+DQoNCltgaGFwcHktZXllYmFsbHMnXSA8aHR0cHM6Ly9naXRodWIuY29t L3JvYnVyLWNvb3AvaGFwcHktZXllYmFsbHM+DQoNCltoZXJlXQ0KPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9sd3QtbXVsdGktcHJvY2Vzc2luZy1tdWNoLW1vcmUtcGVyZm9ybWFudC10aGFu LWVpby1tdWx0aS1jb3JlLzE2Mzk1Pg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9UZWNo RW1wb3dlci9GcmFtZXdvcmtCZW5jaG1hcmtzL3B1bGwvMTAwMDk+DQoNCg0KYGh1cmwnLCBhIGNv bW1hbmQtbGluZSB0b29sIHRvIG1ha2UgSFRUUCByZXF1ZXN0cyBpbiBPQ2FtbA0K4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VG8gY29tcGxldGUgb3VyIHdvcmssIHdlIGhhdmUgZGV2ZWxvcGVkIGEgdG9vbCB0aGF0IGFsbG93 cyBIVFRQDQogIHJlcXVlc3RzIHRvIGJlIG1hZGUgZnJvbSB0aGUgY29tbWFuZCBsaW5lOiBbYGh1 cmwnXS4gVGhpcyB0b29sIGlzDQogIHN0aWxsIGluIHRoZSBleHBlcmltZW50YWwgcGhhc2UsIGJ1 dCBpdCBhbGxvd3MgdXMgdG8gYWN0aXZhdGUgYW4NCiAgaW1wcm92ZW1lbnQgbG9vcCBiZXR3ZWVu IGBodHRwY2F0cycgYW5kIHRoZSByZWFsIHdvcmxkIGJ5IHRlc3RpbmcNCiAgY2VydGFpbiB0eXBl cyBvZiByZXF1ZXN0cy4NCg0KICBIZXJlIGlzIGEgc2NyZWVuc2hvdCBvZiB0aGUgdG9vbCAoYGh1 cmwgaHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZw0KICAtLXByaW50IGRpc2hIclInKToNCg0KICA8 aHR0cHM6Ly91czEuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxvYWRzL29jYW1sL29wdGlt aXplZC8yWC9jL2M0YWQ1NmI1MzYyZWExNjZlM2NhMzY1ZTBlYTQzNTVhNDdlZjNkMTFfMl8xMDA0 eDEwMDAucG5nPg0KDQogIFRoZSBwdXJwb3NlIG9mIHRoaXMgdG9vbCBpcyB0byBmYWNpbGl0YXRl IHRoZSB0ZXN0cyB3ZSB3b3VsZCBsaWtlIHRvDQogIHBlcmZvcm0gd2l0aCBhIHdlYiBzZXJ2ZXIg YnkgYWxsb3dpbmcgdGhlIHVzZXIgdG8gc3BlY2lmeSB0aGUgY29udGVudA0KICBvZiByZXF1ZXN0 cyAoYW5kIHdoZXRoZXIgdGhpcyBjb250ZW50IHNob3VsZCBiZSBKU09OIG9yDQogIGBtdWx0aXBh cnQvZm9ybS1kYXRhJykgYW5kIG9idGFpbiBhIHdob2xlIGJ1bmNoIG9mIGluZm9ybWF0aW9uIHN1 Y2ggYXMNCiAgdGhlIHJlc3BvbnNlIGdpdmVuIGJ5IHRoZSBzZXJ2aWNlLCB0aGUgc2VydmVy4oCZ cyBJUCBhZGRyZXNzLCBhbmQgdGhlDQogIHJlc3VsdCBvZiB0aGUgVExTIGhhbmRzaGFrZS4NCg0K DQpbYGh1cmwnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvaHVybD4NCg0KDQpgdmlm JywgYSBzaW1wbGUgd2ViIGZyYW1ld29yayBmb3IgT0NhbWwgNQ0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRmlu YWxseSwgdG8gY29tcGxldGUgb3VyIHdvcmssIHdlIGhhdmUgYWxzbyBkZXZlbG9wZWQgYSBuZXcg d2ViDQogIGZyYW1ld29yayBiYXNlZCBvbiBgaHR0cGNhdHMnIGFuZCBgbWlvdScgaW4gb3JkZXIg dG8gb2J0YWluIGEgd2ViDQogIHNlcnZlciBjYXBhYmxlIG9mIGhhbmRsaW5nIHBhcmFsbGVsIHJl cXVlc3RzOiBbYHZpZiddLiBMaWtlIGBodXJsJywNCiAgYHZpZicgaXMgc3RpbGwgaW4gdGhlIGV4 cGVyaW1lbnRhbCBzdGFnZS4gSG93ZXZlciwgd2UgYXJlIGN1cnJlbnRseQ0KICBhYmxlIHRvIHBy b2R1Y2Ugc21hbGwgd2ViIGFwcGxpY2F0aW9ucyBhbmQgd2Ugd2lsbCBwcmVzZW50IHRoaXMNCiAg cHJvamVjdCBhdCB0aGUgbmV4dCBbRlVOIE9DYW1sIHNlc3Npb25dIChjb21lIGFsb25nISkuDQoN CiAgQSB0dXRvcmlhbCBleHBsYWluaW5nIGhvdyB0byBtYWtlIGEgY2hhdHJvb20gaW4gT0NhbWwg aXMgYXZhaWxhYmxlDQogIFtoZXJlXS4NCg0KICBUaGUgb2JqZWN0aXZlIG9mIHZpZiBpcyB0byBw cm92aWRlIGEgc21hbGwgZnJhbWV3b3JrIGZvciBkZXZlbG9waW5nDQogIHdlYiBhcHBsaWNhdGlv bnMuIEluIGFkZGl0aW9uLCBpdCBvZmZlcnMgYSB0b29sIGNhbGxlZCBgdmlmJywgd2hpY2ggaXMN CiAgYSAqbmF0aXZlKiBPQ2FtbCBpbnRlcnByZXRlciB0aGF0IGFsbG93cyB5b3UgdG8gbGF1bmNo IGEgd2ViIHNlcnZlcg0KICBmcm9tIGFuIE9DYW1sIHNjcmlwdC4gSGVyZSBpcyBhIHNpbXBsZSBl eGFtcGxlIGZyb20gdGhlIGNvbW1hbmQgbGluZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC ICQgb3BhbSBpbnN0YWxsIC15IHZpZiBodXJsDQogIOKUgiAkIGNhdCA+bWFpbi5tbCA8PEVPRg0K ICDilIIgI3JlcXVpcmUgInZpZiIgOzsNCiAg4pSCIA0KICDilIIgbGV0IGRlZmF1bHQgcmVxIHNl cnZlciAoKSA9DQogIOKUgiAgIGxldCBvcGVuIFZpZi5SZXNwb25zZS5TeW50YXggaW4NCiAg4pSC ICAgbGV0IGZpZWxkID0gImNvbnRlbnQtdHlwZSIgaW4NCiAg4pSCICAgbGV0KiAoKSA9IFZpZi5S ZXNwb25zZS5hZGQgfmZpZWxkICJ0ZXh0L2h0bWw7IGNoYXJzZXQ9dXRmLTgiIGluDQogIOKUgiAg IGxldCogKCkgPSBWaWYuUmVzcG9uc2Uud2l0aF9zdHJpbmcgcmVxICJIZWxsbyBXb3JsZCEiIGlu DQogIOKUgiAgIFZpZi5SZXNwb25zZS5yZXNwb25kIGBPSw0KICDilIIgOzsNCiAg4pSCIA0KICDi lIIgbGV0IHJvdXRlcyA9DQogIOKUgiAgIGxldCBvcGVuIFZpZi5VcmkgaW4NCiAg4pSCICAgbGV0 IG9wZW4gVmlmLlJvdXRlIGluDQogIOKUgiAgIFsgZ2V0IChyZWwgLz8/IG5pbCkgLS0+IGRlZmF1 bHQgXQ0KICDilIIgDQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBNaW91X3VuaXgucnVuIEBAIGZ1 biAoKSAtPg0KICDilIIgICBWaWYucnVuIHJvdXRlcyAoKQ0KICDilIIgOzsNCiAg4pSCIEVPRg0K ICDilIIgJCB2aWYgLS1waWQgdmlkLnBpZCBtYWluLm1sICYNCiAg4pSCICQgaHVybCBodHRwOi8v bG9jYWxob3N0OjgwODAvIC1wIGINCiAg4pSCIEhlbGxvIFdvcmxkIQ0KICDilIIgJCBraWxsIC1T SUdJTlQgJChjYXQgdmlkLnBpZCkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgTGlrZSBhbGwgcHJv amVjdHMgaW4gb3VyIGNvb3BlcmF0aXZlLCBpdCBpcyBvcGVuIHRvIGNvbnRyaWJ1dGlvbnMgYW5k DQogIGltcHJvdmVtZW50cy4gVGhlIHdvcmtzaG9wIHdlIHdpbGwgYmUgaG9zdGluZyBhdCBGVU4g T0NhbWwgd2lsbCBiZSBhbg0KICBvcHBvcnR1bml0eSBmb3IgdXMgYW5kIGZvciB5b3UgdG8gcGFy dGljaXBhdGUgaW4gdGhlc2UgcHJvamVjdHMuDQoNCg0KW2B2aWYnXSA8aHR0cHM6Ly9naXRodWIu Y29tL3JvYnVyLWNvb3AvdmlmPg0KDQpbRlVOIE9DYW1sIHNlc3Npb25dIDxodHRwczovL2Z1bi1v Y2FtbC5jb20vPg0KDQpbaGVyZV0gPGh0dHBzOi8vcm9idXItY29vcC5naXRodWIuaW8vdmlmLz4N Cg0KDQpDb25jbHVzaW9uDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBCYXNl ZCBvbiB0aGUgZGF0ZXMgcHJvdmlkZWQsIGl0IGlzIGNsZWFyIHRoYXQgdGhpcyB3YXMgYSBzdWJz dGFudGlhbA0KICBhbmQgbGVuZ3RoeSB1bmRlcnRha2luZy4gSXQgaXMgdGhlIHJlc3VsdCBvZiB0 aGUgd29yayBvZiBzZXZlcmFsDQogIGluZGl2aWR1YWxzIGFuZCBvdXIgY29vcGVyYXRpdmUgKGJv dGggdGVjaG5pY2FsIGFuZCBzb2NpYWwpLg0KDQogIFdlIHdvdWxkIGxpa2UgdG8gdGhhbmsgZXZl cnlvbmUgd2hvIHBhcnRpY2lwYXRlZCBpbiBhbnkgd2F5IGluIHRoZQ0KICBkZXZlbG9wbWVudCBv ZiB0aGlzIHNvZnR3YXJlIGFuZCBpdHMgaW50ZWdyYXRpb24gaW50byB0aGUgT0NhbWwNCiAgZWNv c3lzdGVtIChub3RhYmx5IHRocm91Z2ggbWlvdeKAmXMgc3VwcG9ydCBmb3IgY2VydGFpbiBsaWJy YXJpZXMgc3VjaA0KICBhcyBbY2FxdGldKS4NCg0KICBXZSBob3BlIHRoYXQgbWFueSBvZiB5b3Ug d2lsbCBhdHRlbmQgb3VyIHdvcmtzaG9wIChmb3IgdGhlIEZVTiBPQ2FtbA0KICBpdHNlbGYsIGFu ZCBhbHNvIHRvIG1lZXQgdXMpIGFuZCBob3BlIHRoYXQgeW91IHdpbGwgZW5qb3kgVmlmIGluDQog IHBhcnRpY3VsYXIuIElmIHlvdSBsaWtlIG91ciB3b3JrLCB5b3UgY2FuIGFsc28gbWFrZSBhIGRv bmF0aW9uIHRvIG91cg0KICBjb29wZXJhdGl2ZSAodmlhIFtHaXRIdWJdIG9yIGRpcmVjdGx5IHVz aW5nIFthbiBJQkFOXSkuDQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpbY2FxdGldIDxodHRwczov L2dpdGh1Yi5jb20vcGF1cmtlZGFsL29jYW1sLWNhcXRpL3B1bGwvMTE3Pg0KDQpbR2l0SHViXSA8 aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3JzL3JvYnVyLWNvb3A+DQoNClthbiBJQkFOXSA8aHR0 cHM6Ly9yb2J1ci5jb29wL0RvbmF0ZT4NCg0KDQpXaHkgTGVhbiA0IHJlcGxhY2VkIE9DYW1sIGFz IG15IFByaW1hcnkgTGFuZ3VhZ2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvd2h5LWxlYW4tNC1yZXBs YWNlZC1vY2FtbC1hcy1teS1wcmltYXJ5LWxhbmd1YWdlLzE3MTA5LzE+DQoNCg0KU2hvbiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIDxo dHRwczovL2tpcmFuY29kZXMubWUvcG9zdHMvbG9nLW9jYW1sLXRvLWxlYW4uaHRtbD4NCg0KDQpS ZW1pbmRlcjogWW91IENhbiBTdGlsbCBDb21lIHRvIFdhcnNhdyBmb3IgRlVOIE9DYW1sDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JlbWluZGVyLXlvdS1jYW4tc3RpbGwtY29tZS10 by13YXJzYXctZm9yLWZ1bi1vY2FtbC8xNzExMC8xPg0KDQoNClNhYmluZSBTY2htYWx0eiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhleSBldmVyeW9uZSwNCg0KICB3ZSBzdGls bCBoYXZlIGEgZmV3IHRpY2tldHMgbGVmdCBmb3IgRlVOIE9DYW1sDQogICg8aHR0cHM6Ly9mdW4t b2NhbWwuY29tPikhDQoNCiAgVGhpcyBpcyB5b3VyIGNoYW5jZSB0byBtZWV0IGEgbG90IG9mIGdy ZWF0IE9DYW1sIGZvbGtzLCBhdHRlbmQgdGhlDQogIHRhbGtzIG9uIGRheSAxLCBoYXZlIHNvbWUg aW50ZXJlc3RpbmcgZGlzY3Vzc2lvbnMsIGFuZCBsZWFybiBhIGxvdCBpbg0KICB0aGUgaGFuZHMt b24gd29ya3Nob3BzIG9mZmVyZWQgb24gZGF5IDIuDQoNCiAgSWYgeW91IGhhdmVu4oCZdCB1c2Vk IE9DYW1sIGJlZm9yZTogbm8gcHJvYmxlbSwgd2UgaGF2ZSBhIGJlZ2lubmVyDQogIHdvcmtzaG9w IHRvIGdldCB5b3Ugc3RhcnRlZCENCg0KICBCZXN0IG9mIGFsbCBpdOKAmXMgZnJlZSBmb3IgYXR0 ZW5kZWVzIChhZG1pc3Npb24gKyBmb29kIGluY2x1ZGVkKSwNCiAgdGhhbmtzIHRvIG91ciBnZW5l cm91cyBzcG9uc29ycy4NCg0KICBDaGVlcnMgU2FiaW5lDQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20g dGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9t IG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4N Cg0KICDigKIgW1VwY29taW5nIE9DYW1sIEV2ZW50c10NCiAg4oCiIFtXaHkgSSBjaG9zZSBPQ2Ft bCBhcyBteSBwcmltYXJ5IGxhbmd1YWdlXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRw czovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1VwY29taW5nIE9DYW1sIEV2ZW50c10gPGh0dHBzOi8v b2NhbWwub3JnL2V2ZW50cz4NCg0KW1doeSBJIGNob3NlIE9DYW1sIGFzIG15IHByaW1hcnkgbGFu Z3VhZ2VdDQo8aHR0cHM6Ly94dncubG9sL2VuL2FydGljbGVzL3doeS1vY2FtbC5odG1sPg0KDQoN Ck9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlz cyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQg dG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZl ZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUg aXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwt bGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWls dG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRw czovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2 ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1s aXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0Fs YW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 12 to 19, 2025.

    httpcats, ocaml-h1, vif, and hurl: a webstack for OCaml 5

    Calascibetta Romain announced

    I am delighted to announce the release of httpcats.0.1.0, ocaml-h1 (including WebSockets support), and the experimental rele= ase of vif, a web framework for OCaml 5, and hurl= , an HTTP client in OCaml.

    ocaml-h1

    ocaml-h1 is an authorised fork of http/af (after explicit permission from its author) in order to con= tinue its development and release process. It was created in May 2024 and n= ow includes support for websockets (and connection upgrades) thanks to the = work of @swrup.

    httpcats, a HTTP client/server with miou

    It was in 2023 that we began experimenting with OCaml 5 and HTTP requests w= iththe httpcats project:

    https://x.c= om/Dinoosaure/status/1710320603113095538

    This project allowed us to consolidate some of our libraries, such as~mirag= e-crypto~, in order to move beyond OCaml 5 and, in particular, to resolve t= he few data-races we had (having started some of our projects before OCaml = multicore was even mentioned).

    After some fairly extensive maintenance work, we were finally able to lay t= he groundwork for an OCaml HTTP client that can make parallel requests usin= g Miou.

    httpcats has therefore improved over time and offers a fairly = simple way to make HTTP requests in OCaml (thanks to our experience with http-lwt-client= ) and to implement an HTTP server that can handle incoming HTTP requests in= parallel. The documentation has been improved and is particularl= y comprehensive (with examples) so that users have complete control over al= l the protocol layers required for communication with web service: from the= Unix socket to the TLS handshake (including ALPN negotiation), incl= uding domain name resolution.

    httpcats also partially synthesizes our work on protocols. Eve= rything needed to communicate with web services is implemented in OCaml:

    Finally, benchmarking work has been initiated, the origins of which can be = found here, showing the results that c= an be achieved with httpcats as a server. The benchmark is rep= roducible and available here, and here are the results we obtained (on A= MD Ryzen 9 7950X 16-Core Processor):

    clients threads latencyAvg latencyMax latencyStdev totalRequests
    16 16 47.43us 2.27ms 38.48us 5303700
    32 32 71.73us 1.04ms 47.58us 7016729
    64 32 140.29us 5.72ms 121.50us 7658146
    128 32 279.73us 11.35ms 287.92us 7977306
    256 32 519.02us 16.89ms 330.20us 7816435
    512 32 1.06ms 37.42ms 534.14us 7409781

    hurl, a command-line tool to make HTTP r= equests in OCaml

    To complete our work, we have developed a tool that allows HTTP requests to= be made from the command line: hurl. This tool is still in the experimental phase, bu= t it allows us to activate an improvement loop between httpcats and the real world by testing certain types of requests.

    Here is a screenshot of the tool (hurl https://discuss.ocaml.org --pr= int dishHrR):

    3D"c4a=

    The purpose of this tool is to facilitate the tests we would like to perfor= m with a web server by allowing the user to specify the content of requests= (and whether this content should be JSON or multipart/form-data) and obtain a whole bunch of information such as the response given by t= he service, the server=E2=80=99s IP address, and the result of the TLS hand= shake.

    vif, a simple web framework for OCaml 5<= /h4>

    Finally, to complete our work, we have also developed a new web framework b= ased on httpcats and miou in order to obtain a we= b server capable of handling parallel requests: vif. Like hurl, vif<= /code> is still in the experimental stage. However, we are currently able t= o produce small web applications and we will present this project at the ne= xt FUN OCaml session (come along!).

    A tutorial explaining how to make a chatroom in OCaml is available here.

    The objective of vif is to provide a small framework for developing web app= lications. In addition, it offers a tool called vif, which is = a native OCaml interpreter that allows you to launch a web server fr= om an OCaml script. Here is a simple example from the command line:

    $ opam install -y vif hurl
    $ cat >main.ml <<EOF
    #require "vif" ;;
    
    let default req server () =3D
      let open Vif.Response.Syntax in
      let field =3D "content-type" in
      let* () =3D Vif.Response.add ~field "text/html; charset=3Dutf-8" in
      let* () =3D Vif.Response.with_string req "Hello World!" in
      Vif.Response.respond `OK
    ;;
    
    let routes =3D
      let open Vif.Uri in
      let open Vif.Route in
      [ get (rel /?? nil) --> default ]
    
    let () =3D
      Miou_unix.run @@ fun () ->
      Vif.run routes ()
    ;;
    EOF
    $ vif --pid vid.pid main.ml &
    $ hurl http://localhost:8080/ -p b
    Hello World!
    $ kill -SIGINT $(cat vid.pid)
    

    Like all projects in our cooperative, it is open to contributions and impro= vements. The workshop we will be hosting at FUN OCaml will be an opportunit= y for us and for you to participate in these projects.

    Conclusion

    Based on the dates provided, it is clear that this was a substantial and le= ngthy undertaking. It is the result of the work of several individuals and = our cooperative (both technical and social).

    We would like to thank everyone who participated in any way in the developm= ent of this software and its integration into the OCaml ecosystem (notably = through miou=E2=80=99s support for certain libraries such as caqti).

    We hope that many of you will attend our workshop (for the FUN OCaml itself= , and also to meet us) and hope that you will enjoy Vif in particular. If y= ou like our work, you can also make a donation to our cooperative (via GitHub or directly using= an IBAN).

    Happy hacking!

    Reminder: You Can Still Come to Warsaw for FUN OCaml

    Sabine Schmaltz announced

    Hey everyone,

    we still have a few tickets left for FUN OCaml (https://fun-ocaml.com)!

    This is your chance to meet a lot of great OCaml folks, attend the talks on= day 1, have some interesting discussions, and learn a lot in the hands-on = workshops offered on day 2.

    If you haven=E2=80=99t used OCaml before: no problem, we have a beginner wo= rkshop to get you started!

    Best of all it=E2=80=99s free for attendees (admission + food included), th= anks to our generous sponsors.

    Cheers Sabine

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=qkKOs3GS; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id BBBB740085 for ; Tue, 26 Aug 2025 12:34:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Obuj72arVFM1Laoqq0u1XDzkps/MQMK1mzqg0gBc1qs=; b=qkKOs3GS6cxQbn2Rp1ggbiFSGFARD1pzr4RXH+gEVr1BpU/PF5IyZQ45 8CYyFHh6nIjg4fkH8A79f0fVJLClamObU/qfkJ/hweVAgG/gzlrW1R2B+ KPNUwEuh9PLVhM9+e2kq1YudHZ5y9gUbn/1pY3gUE34AWwLD79xtn6PF1 I=; X-CSE-ConnectionGUID: EQ0A07TERraYQeEV97cKkg== X-CSE-MsgGUID: TnfzhOxvRIy+zipYGOTcBg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.18,214,1751234400"; d="scan'208,217";a="236152331" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 26 Aug 2025 14:34:11 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5BC95E0CD7; Tue, 26 Aug 2025 14:34:10 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 66A93E0172 for ; Tue, 26 Aug 2025 14:34:07 +0200 (CEST) X-CSE-ConnectionGUID: LNdSPwD9RqS4DzjaBOq/7w== X-CSE-MsgGUID: jzzfii/aR6KuFh8hty/2uw== X-IronPort-AV: E=Sophos;i="6.18,214,1751234400"; d="scan'208,217";a="236152302" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 26 Aug 2025 14:34:08 +0200 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 26 Aug 2025 14:34:07 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19370 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDE5IHRvIDI2LA0KMjAyNS4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpXaHkgTGVh biA0IHJlcGxhY2VkIE9DYW1sIGFzIG15IFByaW1hcnkgTGFuZ3VhZ2UNClRhY2l0IDEuMC4wIC0g Q29tYmluYXRvcnMhDQpTbGlwc2hvdyENCkNsYXVkaXVzIGlzIG5vdyBhdmFpbGFibGUgaW4gb3Bh bSEg8J+OiQ0KTmV3IHJlbGVhc2Ugb2YgVW5pb25GaW5kDQpCb2d1ZSwgdGhlIE9DYW1sIEdVSQ0K RHVuZSAzLjIwDQpjdWRhaml0OiBCaW5kaW5ncyB0byB0aGUgYGN1ZGEnIGFuZCBgbnZydGMnIGxp YnJhcmllcw0KemJnIHYwLjMuMDogTmV3IHJlbGVhc2UgMiB5ZWFycyBsYXRlcg0KQW5ub3VuY2lu ZyBSYXZlbjogU2NpZW50aWZpYyBDb21wdXRpbmcgZm9yIE9DYW1sIChBbHBoYSBSZWxlYXNlKQ0K T3V0cmVhY2h5IERlbW8gRGF5IEF1Z3VzdCAyMDI1DQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dO DQoNCg0KV2h5IExlYW4gNCByZXBsYWNlZCBPQ2FtbCBhcyBteSBQcmltYXJ5IExhbmd1YWdlDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3doeS1sZWFuLTQtcmVwbGFjZWQtb2NhbWwtYXMtbXktcHJpbWFy eS1sYW5ndWFnZS8xNzEwOS8xPg0KDQoNClNob24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICA8aHR0cHM6Ly9raXJhbmNvZGVzLm1lL3Bv c3RzL2xvZy1vY2FtbC10by1sZWFuLmh0bWw+DQoNCg0KVGFjaXQgMS4wLjAgLSBDb21iaW5hdG9y cyENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvdGFjaXQtMS0wLTAtY29tYmluYXRvcnMvMTcxNDIvMT4NCg0KDQphcnV0b25l ZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIFBhcnRpYWxseSBhcyBhIGJlZ2lubmVyIHByb2plY3QgKEkgYW0gL3Zl cnkgbXVjaC8gYSBiZWdpbm5lci0gaWYNCiAgYW55b25lIGVsc2UgZmluZHMgdGhlIHBhY2thZ2Ug dXNlZnVsIGFuZCBmZWVscyBsaWtlIHNvbWV0aGluZyBzaG91bGQNCiAgYmUgY2hhbmdlZCBvciBr bm93cyBtb3JlIGZ1biBjb21iaW5hdG9ycywgZmVlbCBmcmVlIHRvIG1ha2UgYSBQUiBhcyBJDQog IGhhdmUgbm8gY2x1ZSB3aGF0IEnigJltIGRvaW5nKSwgYW5kIHBhcnRpYWxseSBqdXN0IGJlY2F1 c2UgSSBwZXJzb25hbGx5DQogIHdhbnQgYSByZWxhdGl2ZWx5IGNvbXBsZXRlIGNvbWJpbmF0b3Ig bGlicmFyeSwgYHRhY2l0JyBpcyBub3cgb24gb3BhbSENCiAgTm93IHlvdSBjYW4gd3JpdGUgYGxl dCBudGhfcm9vdCA9IEMuYyAoQy5waGkxIEZsb2F0LnBvdyBDLmsgKEMuYjEgKCgNCiAgLy4gKSAx LikgQy5raSkpJyBpZiB5b3Ugd2FudGVkIHRvLCBmb3Igd2hhdGV2ZXIgcmVhc29uIDp3aW5rOg0K DQoNClhhdmllciBWYW4gZGUgV29lc3R5bmUgdGhlbiBhZGRlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVyZSBpcyB0aGUgcGFja2FnZSBwYWdlOiA8 aHR0cHM6Ly9vY2FtbC5vcmcvcC90YWNpdC9sYXRlc3Q+DQoNCiAgaGVyZSBpcyB0aGUgcmVwb3Np dG9yeTogPGh0dHBzOi8vZ2l0aHViLmNvbS9hcnV0b25lZTEvdGFjaXQ+DQoNCg0KU2xpcHNob3ch DQrilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1zbGlwc2hvdy8xNjMzNy8xMT4NCg0KDQpQYXVsLUVsbGlvdCBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIChJIGhvcGUgaXQncyBzdGlsbCBPSyB0byBhbm5vdW5jZSBt eSByZWxlYXNlcyBoZXJlLCBkZXNwaXRlIHRoZWlyDQogIGN1cnJlbnQgZnJlcXVlbmNpZXMgYW5k IHRoZSBmYWN0IHRoYXQgaXQncyBub3QgYW4gT0NhbWwgX2xpYnJhcnlfLikNCg0KICBJIGFtIHNw ZWVjaGxlc3MgdG8gYW5ub3VuY2UgdGhlIG5ldyBbb3BhbSByZWxlYXNlXSBvZiBbU2xpcHNob3dd IQ0KDQoNCltvcGFtIHJlbGVhc2VdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBv c2l0b3J5L3B1bGwvMjgzNTE+DQoNCltTbGlwc2hvd10gPGh0dHBzOi8vZ2l0aHViLmNvbS9wYW5n bGVzZC9zbGlwc2hvdy8+DQoNClZlcnNpb24gMC42LjA6IFRoZSBLaW5n4oCZcyBTbGlwc2hvdw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBy ZWxlYXNlIGZvY3VzZXMgb24gb25lIHNwZWNpZmljIGZlYXR1cmU6IHRoZSBzcGVha2VyIHZpZXcu DQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0cy82ZjEzODRm MC03MTVjLTRhZjctODBkNi03ZGE5YzBiOTc0NGI+DQoNCiAgKERpc2NsYWltZXI6IEFJIGdlbmVy YXRlZCB0ZXh0IF5bVGhlIHRleHQgaW4gdGhlIGxlZnQgb2YgdGhlIGdpZiBhYm92ZQ0KICB3YXMg bW9zdGx5IGdlbmVyYXRlZCBieSBhbiBMTE0sIG1pbWlja2luZyAiVGhlIEtpbmcncyBzcGVlY2gi DQogIGRlY2xhcmF0aW9uIG9mIHdhciwgYnV0IHR1cm5lZCB0byBwcmFpc2UgcGVhY2UsIHdoaWNo IHdlIG5lZWQgYSBsb3QgaW4NCiAgdGhpcyB3b3JsZF0pDQoNCiAgVGhlIHNwZWFrZXIgdmlldyBp bmNsdWRlcyBhIHRpbWVyLCBzcGVha2VyIG5vdGVzLCBhbmQgYSBwcmVzZW50YXRpb24NCiAgc3lu Y2VkIHdpdGggdGhlIG1haW4gb25lLiBOb3RlIHRoYXQgYSBjb21waWxlZCBwcmVzZW50YXRpb24g aXMgc3RpbGwgYQ0KICBzdGFuZGFsb25lIGh0bWwgZmlsZSB0aGF0IHlvdSBjYW4ganVzdCBkb3Vi bGUgY2xpY2sgb24uDQoNCiAgVG8gb3BlbiB0aGUgc3BlYWtlciB2aWV3LCBwcmVzcyBgcycuIFRv IHNlbmQgc29tZSB0ZXh0IHRvIHRoZSBzcGVha2VyDQogIG5vdGVzLCB1c2UgdGhlIGBzcGVha2Vy LW5vdGUnIGFjdGlvbiwgYXMgaW4gdGhlIGNvZGUgYmVsb3c6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiAjIFRoZSBLaW5nJ3MgU2xpcHNob3cNCiAg4pSCIA0KICDilIIge3BhdXNlIHNwZWFr ZXItbm90ZX0NCiAg4pSCIFNheSBpdCBsaWtlIHRoaXM6ICJwZXJoYWFhYWFhYWFwcyIuLi4NCiAg 4pSCIA0KICDilIIgSW4gdGhpcyBncmF2ZSBob3VyLCBwZXJoYXBzIHRoZSBtb3N0IGZhdGVmdWwg aW4gb3VyIGhpc3RvcnksIEkgc2VuZCB0byBldmVyeSBob3VzZWhvbGQgb2YgbXkgcGVvcGxlcywg Ym90aCBhdCBob21lIGFuZCBvdmVyc2VhcywgdGhpcyBtZXNzYWdlLCBzcG9rZW4gd2l0aCB0aGUg c2FtZSBkZXB0aCBvZiBmZWVsaW5nIGZvciBlYWNoIG9uZSBvZiB5b3UgYXMgaWYgSSB3ZXJlIGFi bGUgdG8gY3Jvc3MgeW91ciB0aHJlc2hvbGQgYW5kIHNwZWFrIHRvIHlvdSBteXNlbGYuDQogIOKU giANCiAg4pSCIHtwYXVzZSBzcGVha2VyLW5vdGV9DQogIOKUgiBNYWtlIGEgbGl0dGxlIHBhdXNl IGFuZCBzaG93IGEgdGVhciwgaXQnbGwgbWFrZSBpdCBtb3JlIGRyYW1hdGljLg0KICDilIIgDQog IOKUgiBBcyBhbHdheXMsIHRoZSB3b3JsZCBmaW5kcyBpdHNlbGYgc3RhbmRpbmcgb24gdGhlIGVk Z2Ugb2Ygd2FyLg0KICDilIIgDQogIOKUgiB7cGF1c2UgY2VudGVyPXRpbWUgc3BlYWtlci1ub3Rl fQ0KICDilIIgRW1waGFzaXplIHJvYXIgYnV0IGF2b2lkIG1ha2luZyBldmVyeW9uZSB1bmNvbWZv cnRhYmxlLg0KICDilIIgDQogIOKUgiB7I3RpbWV9DQogIOKUgiBUaW1lIGFmdGVyIHRpbWUsIHdl IGhhdmUgc291Z2h0IHBlYWNlZnVsIHdheXMgdG8gcmVzb2x2ZSBvdXIgZGlmZmVyZW5jZXMuIFll dCB0b28gb2Z0ZW4sIGRpYWxvZ3VlIGhhcyBiZWVuIGRyb3duZWQgb3V0IGJ5IHRoZSByb2FyIG9m IHdlYXBvbnMuDQogIOKUgiANCiAg4pSCIHtwYXVzZSBzcGVha2VyLW5vdGV9DQogIOKUgiBQcmV0 ZW5kIHlvdSBrbm93IHdoYXQgeW91IGFyZSBzcGVha2luZyBhYm91dDogYXMgYSBLaW5nLCB5b3Ug Y2FuIGRvIHRoYXQuDQogIOKUgiANCiAg4pSCIFdlIGFyZSB0b2xkIHRoYXQgdmlvbGVuY2UgaXMg dW5hdm9pZGFibGUsIHRoYXQgdG8gYmUgc2FmZSB3ZSBtdXN0IGZpZ2h0LiBCdXQgdGhpcyBpcyB0 aGUgb2xkIGFuZCBkYW5nZXJvdXMgbGllIHRoYXQg4oCcbWlnaHQgaXMgcmlnaHQu4oCdIElmIHdl IGFjY2VwdCBpdCwgd2UgYWNjZXB0IHRoZSBzbG93IGRlc3RydWN0aW9uIG9mIGFsbCB0aGF0IG1h a2VzIGxpZmUgd29ydGggbGl2aW5nLg0KICDilIIgDQogIOKUgiB7cGF1c2UgZG93bj1lbmQgc3Bl YWtlci1ub3RlfQ0KICDilIIgRFJBTUFUSUNBTExZIFBPSU5UIEZJTkdFUlMgQVQgVEhFIEFVRElF TkNFISEhDQogIOKUgiANCiAg4pSCIEZvciB0aGUgc2FrZSBvZiBhbGwgd2UgY2hlcmlzaCwgd2Ug bXVzdCBmaW5kIGFub3RoZXIgcGF0aC4gVGhlIHJlYWwgY2hhbGxlbmdlIGJlZm9yZSB1cyBpcyBu b3QgdG8gZmlnaHQgaGFyZGVyLCBidXQgdG8gaW1hZ2luZSBwZWFjZSB3aGVuIGFuZ2VyIGJsaW5k cyB1cywgYW5kIHRvIGNob29zZSBjb29wZXJhdGlvbiB3aGVuIGNvbmZsaWN0IHNlZW1zIGVhc2ll ci4NCiAg4pSCIA0KICDilIIgSSBjYWxsIG9uIGFsbCBwZW9wbGUsIGFjcm9zcyBldmVyeSBib3Jk ZXIsIHRvIHJlbWFpbiBjYWxtLCBmaXJtLCBhbmQgdW5pdGVkIGluIHRoZSBoaWdoZXIgY2F1c2Ug b2YgcHJlc2VydmluZyBsaWZlLiBUbyByZXNpc3QgdGhlIGNhbGwgb2YgaGF0cmVkLiBUbyByZW1l bWJlciB0aGF0IGluIGV2ZXJ5IGNpdHksIGluIGV2ZXJ5IG5hdGlvbiwgdGhlcmUgYXJlIGNoaWxk cmVuIHdobyBkZXNlcnZlIGEgZnV0dXJlIHVuc2NhcnJlZCBieSB3YXIuDQogIOKUgiANCiAg4pSC IFRoZSByb2FkIHdpbGwgYmUgaGFyZC4gVGhlcmUgbWF5IGJlIGRheXMgd2hlbiBwZWFjZSBmZWVs cyBpbXBvc3NpYmxlLiBCdXQgd2FyIHNwcmVhZHMgYmV5b25kIHRoZSBiYXR0bGVmaWVsZCDigJQg aXQgc3RlYWxzIGhvbWVzLCBkaXZpZGVzIGZhbWlsaWVzLCBhbmQgcG9pc29ucyB0aGUgZ2VuZXJh dGlvbnMgdG8gY29tZS4NCiAg4pSCIA0KICDilIIgeyNlbmR9DQogIOKUgiBJZiB3ZSByZW1haW4g c3RlYWRmYXN0IGluIG91ciByZWZ1c2FsIHRvIGdpdmUgaW4gdG8gdmlvbGVuY2UsIHRoZW4sIHdp dGggY291cmFnZSBhbmQgY29tcGFzc2lvbiwgd2Ugd2lsbCBwcmV2YWlsIOKAlCBub3QgYnkgZGVz dHJveWluZywgYnV0IGJ5IHByZXNlcnZpbmcuDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEZ1bGwg Y2hhbmdlbG9nIGJlbG93Og0KDQoNCuKXiiBFbmdpbmUNCg0KICDigKIgQWRkIGEgc3BlYWtlciB2 aWV3LCBvcGVuZWQgd2l0aCBgcycuICgjMTQ3KQ0KICDigKIgRml4IGBaJyBhbmQgYFgnIG5vdCB3 b3JraW5nICgjMTQ3KQ0KICDigKIgT24gc3RlcCBjaGFuZ2UsIG1vdmUgYmFjayB0byB0aGUgcG9z aXRpb24gd2UgbGVmdCAoIzE0OCkNCg0KDQril4ogTGFuZ3VhZ2UNCg0KICDigKIgQWRkIGEgYHNw ZWFrZXItbm90ZScgYWN0aW9uLiAoIzE0NykNCg0KDQpDbGF1ZGl1cyBpcyBub3cgYXZhaWxhYmxl IGluIG9wYW0hIPCfjokNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvY2xhdWRpdXMtaXMtbm93LWF2YWlsYWJsZS1pbi1vcGFtLzE3MTQ1LzE+DQoNCg0KU2hyZXlh IFBhd2Fza2FyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGhhcHB5 IHRvIGFubm91bmNlIHRoYXQgQ2xhdWRpdXMgaXMgbm93IGF2YWlsYWJsZSBpbiBvcGFtIQ0KDQog IENsYXVkaXVzIGlzIGEgZnVuY3Rpb25hbCBzdHlsZSByZXRyby1ncmFwaGljcyBsaWJyYXJ5IGZv ciBPQ2FtbCBmb3INCiAgYnVpbGRpbmcgZ2VuZXJhdGl2ZSBhcnQsIGRlbW9zLCBhbmQgZ2FtZXMu DQoNCiAgSGVyZeKAmXMgb3VyIGdpdGh1YjogW0NsYXVkaXVzXQ0KDQogIEFuZCBzb21lIGNvb2wg ZXhhbXBsZXMgdG8gY2hlY2tvdXQgYW5kIGV4cGxvcmUgbW9yZToNCiAgW2NsYXVkaXVzLWV4YW1w bGVzXQ0KDQoNCltDbGF1ZGl1c10gPGh0dHBzOi8vZ2l0aHViLmNvbS9DbGF1ZGl1c0ZYL2NsYXVk aXVzPg0KDQpbY2xhdWRpdXMtZXhhbXBsZXNdIDxodHRwczovL2dpdGh1Yi5jb20vQ2xhdWRpdXNG WC9jbGF1ZGl1cy1leGFtcGxlcz4NCg0KDQpOZXcgcmVsZWFzZSBvZiBVbmlvbkZpbmQNCuKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLW5ldy1yZWxlYXNlLW9mLXVuaW9uZmluZC8xNzE0Ny8xPg0KDQoNCkZyYW7Dp29pcyBQb3R0 aWVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8hIEl0IGlzIG15 IHBsZWFzdXJlIHRvIGFubm91bmNlIGEgbmV3IHJlbGVhc2Ugb2YgbXkgbGlicmFyeQ0KICBgdW5p b25GaW5kJy4gVGhlIG1haW4gbmV3cyBpcyB0aGF0IGEgY29uY3VycmVudCB1bmlvbi1maW5kIGFs Z29yaXRobQ0KICBpcyBub3cgYXZhaWxhYmxlIHVuZGVyIHRoZSBuYW1lIGBVbmlvbkZpbmQuQ29u Y3VycmVudCcuIFRvIGluc3RhbGwgaXQsDQogIHR5cGUgYG9wYW0gdXBkYXRlICYmIG9wYW0gaW5z dGFsbCB1bmlvbkZpbmQuMjAyNTA4MTgnLiBGb3IgbW9yZQ0KICBpbmZvcm1hdGlvbiwgc2VlIHRo ZSBbZG9jdW1lbnRhdGlvbl0uDQoNCg0KW2RvY3VtZW50YXRpb25dDQo8aHR0cHM6Ly9jYW1iaXVt LmlucmlhLmZyL35mcG90dGllci91bmlvbkZpbmQvZG9jL3VuaW9uRmluZC8+DQoNCg0KQm9ndWUs IHRoZSBPQ2FtbCBHVUkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLWJvZ3VlLXRoZS1vY2FtbC1ndWkvOTA5OS82ND4NCg0KDQpzYW5ldHRlIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgSGVsbG8NCg0KICBpdOKAmXMgbXkgcGxlYXN1cmUgdG8gYW5ub3VuY2UgYSBuZXcgdmVy c2lvbiBvZiBbQm9ndWVdLCB2ZXJzaW9uDQogIDIwMjUwODE1IGF2YWlsYWJsZSBvbiBbb3BhbV0u DQoNCiAgVGhlIG1haW4gbm92ZWx0eSBpcyBhbiAqaW50ZXJuYXRpb25hbGl6YXRpb24gbWVjaGFu aXNtKi4gQWxsIHRleHQgdXNlZA0KICBieSBCb2d1ZSAobGlrZSDigJhjbG9zZeKAmSBpbiBhIGNs b3NlIGJ1dHRvbikgd2lsbCBiZSBhdXRvbWF0aWNhbGx5DQogIHRyYW5zbGF0ZWQgaW50byB0aGUg dXNlcuKAmXMgbGFuZ3VhZ2UuIEN1cnJlbnRseSAxNSBsYW5ndWFnZXMgYXJlDQogIHN1cHBvcnRl ZCBidXQgbW9yZSBjYW4gZWFzaWx5IGJlIGFkZGVkIGVpdGhlciB2aWEgY29uZmlndXJhdGlvbiBm aWxlcywNCiAgb24gZGlyZWN0bHkgYXQgcnVuLXRpbWUgdXNpbmcgdGhlIFtpMThuIEFQSV0uDQoN CiAgbm90ZTogSW50ZXJuYXRpb25hbGl6YXRpb24gaGFzIGJlZW4gdGVzdGVkIG9ubHkgZm9yIGEg c21hbGwgbnVtYmVyIG9mDQogIGFwcGxpY2F0aW9uczsgZG9u4oCZdCBoZXNpdGF0ZSB0byByZXBv cnQgYnVncy4NCg0KICBIYXBweSBib2d1ZS1pbmchDQoNCg0KW0JvZ3VlXSA8aHR0cHM6Ly9naXRo dWIuY29tL3NhbmV0dGUvYm9ndWU+DQoNCltvcGFtXSA8aHR0cHM6Ly9vY2FtbC5vcmcvcC9ib2d1 ZS8yMDI1MDgxNT4NCg0KW2kxOG4gQVBJXSA8aHR0cHM6Ly9zYW5ldHRlLmdpdGh1Yi5pby9ib2d1 ZS9Cb2d1ZS5JMThuLmh0bWw+DQoNCg0KRHVuZSAzLjIwDQrilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1kdW5l LTMtMjAvMTcxNTAvMT4NCg0KDQpFdGllbm5lIE1hcmFpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgA0KDQogIE9uIHRoZSBiZWhhbGYgb2YgdGhlIER1bmUgVGVhbSwgSeKAmW0gZ2xhZCB0byBh bm5vdW5jZSB0aGUgcmVsZWFzZSBvZg0KICBkdW5lIGAzLjIwLjAnIDpwYXJ0eWluZ19mYWNlOg0K DQogIFRoaXMgcmVsZWFzZSBjb250YWlucyBzb21lIGltcG9ydGFudCBidWcgZml4ZXMuIEl0IGNv bnRhaW5zIG5ldw0KICBmZWF0dXJlcyBmb3IgdGVzdHMsIHN1Y2ggYXMgdGhlIHBvc3NpYmlsaXR5 IHRvIHVzZSBhbiBhbGlhcyBhbmQgdGhlDQogIHBvc3NpYmlsaXR5IHRvIGRlY2xhcmUgYSAvdGlt ZW91dC8gZm9yIC9jcmFtLyB0ZXN0cy4gVGhpcyByZWxlYXNlIGFsc28NCiAgcHJvdmlkZXMgbmV3 IHBvc3NpYmlsaXRpZXMgZm9yIHRoZSAvd2F0Y2ggbW9kZSwvIGxpa2UgdGhlIGFiaWxpdHkgdG8N CiAgcnVuIGFuIGV4ZWN1dGFibGUgb3IgcHJvbW90ZSBmaWxlcyB3aGlsZSB0aGUgd2F0Y2ggbW9k ZSBpcyBydW5uaW5nLg0KDQogIDp3YXJuaW5nOiBBIHNpZ25pZmljYW50IGNoYW5nZSBpbiB0aGlz IHJlbGVhc2UgaXMgaG93IHRoZSBkdW5lIGZpbGUNCiAgZm9ybWF0dGVyIGFjdHMuIEl0IHdpbGwg bm93IHRyeSB0byBmaWxsIHRoZSBsaW5lIGluc3RlYWQgb2YgdXNpbmcgdGhlDQogIHZlcnRpY2Fs IGZvcm1hdC4NCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgcmVsZWFz ZSwgeW91IGNhbiByZXBvcnQgaXQgb24gdGhlDQogIFtvY2FtbC9kdW5lXSByZXBvc2l0b3J5Lg0K DQoNCltvY2FtbC9kdW5lXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzPg0K DQpDaGFuZ2Vsb2cNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogRml4ZWQNCg0K ICDigKIgU3RvcCByZS1ydW5uaW5nIGNyYW0gdGVzdHMgYWZ0ZXIgcHJvbW90aW9uIHdoZW4gaXTi gJlzIG5vdCBuZWNlc3NhcnkNCiAgICAoIzExOTk0LCBAcmdyaW5iZXJnKQ0KDQogIOKAoiBmaXg6 IGAkIGR1bmUgc3Vic3QnIHNob3VsZCBub3QgZmFpbCB3aGVuIGFkZGluZyB0aGUgdmVyc2lvbiBm aWVsZCBpbg0KICAgIG9wYW0gZmlsZXMgKCMxMTgwMSwgZml4ZXMgIzExMDQ1LCBAYnRqb3JnZSkN Cg0KICDigKIgS2lsbCBhbGwgcHJvY2Vzc2VzIGluIHRoZSBwcm9jZXNzIGdyb3VwIGFmdGVyIHRo ZSBtYWluIHByb2Nlc3MgaGFzDQogICAgdGVybWluYXRlZDsgaW4gcGFydGljdWxhciB0aGlzIGF2 b2lkcyBiYWNrZ3JvdW5kIHByb2Nlc3NlcyBpbiBjcmFtDQogICAgdGVzdHMgdG8gc3RpY2sgYXJv dW5kIGFmdGVyIHRoZSB0ZXN0IGZpbmlzaGVkICgjMTE4NDEsIGZpeGVzICMxMTgyMCwNCiAgICBA QWxpenRlciwgQExlb25pZGFzLWZyb20tWElWKQ0KDQoNCuKXiiBBZGRlZA0KDQogIOKAoiBgKHRl c3RzKScgc3RhbnphcyBub3cgZ2VuZXJhdGUgYWxpYXNlcyB3aXRoIHRoZSB0ZXN0IG5hbWUuIFRv IHJ1bg0KICAgIGAodGVzdCAobmFtZSBhKSknIHlvdSBjYW4gZG8gYGR1bmUgYnVpbGQgQHJ1bnRl c3QtYScuICgjMTE1NTgsDQogICAgZ3JhbnRzIHBhcnQgb2YgIzEwMjM5LCBAQWxpenRlcikNCg0K ICDigKIgSW5saW5lIHRlc3QgbGlicmFyaWVzIG5vdyBwcm9kdWNlIGFsaWFzZXMgYHJ1bnRlc3Qt bmFtZV9vZl9saWInDQogICAgYWxsb3dpbmcgdXNlcnMgdG8gcnVuIHNwZWNpZmljIGlubGluZSB0 ZXN0cyBhcyBgZHVuZSBidWlsZA0KICAgIEBydW50ZXN0LW5hbWVfb2ZfbGliJy4gKCMxMTEwOSwg cGFydGlhbGx5IGZpeGVzICMxMDIzOSwgQEFsaXp0ZXIpDQoNCiAg4oCiIGZlYXR1cmU6IGAkIGR1 bmUgc3Vic3QnIHVzZSB2ZXJzaW9uIGZyb20gYGR1bmUtcHJvamVjdCcgd2hlbiBubw0KICAgIHZl cnNpb24gY29udHJvbCByZXBvc2l0b3J5IGhhcyBiZWVuIGRldGVjdGVkICgjMTE4MDEsIEBidGpv cmdlKQ0KDQogIOKAoiBBbGxvdyBgZHVuZSBleGVjJyB0byBydW4gY29uY3VycmVudGx5IHdpdGgg YW5vdGhlciBpbnN0YW5jZSBvZiBkdW5lDQogICAgaW4gd2F0Y2ggbW9kZSAoIzExODQwLCBAZ3Jp ZGJ1Z3MpDQoNCiAg4oCiIEludHJvZHVjZSBgJXtvc30nLCBgJXtvc192ZXJzaW9ufScsIGAle29z X2Rpc3RyaWJ1dGlvbn0nLCBhbmQNCiAgICBgJXtvc19mYW1pbHl9JyBwZXJjZW50IGZvcm1zLiBU aGVzZSBoYXZlIHRoZSBzYW1lIHZhbHVlcyBhcyB0aGVpcg0KICAgIG9wYW0gY291bnRlcnBhcnRz LiAgKCMxMTg2MywgQHJncmluYmVyZykNCg0KICDigKIgSW50cm9kdWNlIG9wdGlvbiBgKGltcGxp Y2l0X3RyYW5zaXRpdmVfZGVwcw0KICAgIGZhbHNlLWlmLWhpZGRlbi1pbmNsdWRlcy1zdXBwb3J0 ZWQpJyB0aGF0IGlzIGVxdWl2YWxlbnQgdG8NCiAgICBgKGltcGxpY2l0X3RyYW5zaXRpdmVfZGVw cyBmYWxzZSknIHdoZW4gYC1IJyBpcyBzdXBwb3J0ZWQgYnkgdGhlDQogICAgY29tcGlsZXIgKE9D YW1sID49IDUuMikgYW5kIGVxdWl2YWxlbnQgdG8gYChpbXBsaWNpdF90cmFuc2l0aXZlX2RlcHMN CiAgICB0cnVlKScgb3RoZXJ3aXNlLiAoIzExODY2LCBmaXhlcyAjMTEyMTIsIEBub2piKQ0KDQog IOKAoiBBZGQgYGR1bmUgZGVzY3JpYmUgbG9jYXRpb24nIGZvciBwcmludGluZyB0aGUgcGF0aCB0 byB0aGUgZXhlY3V0YWJsZQ0KICAgIHRoYXQgd291bGQgYmUgcnVuICgjMTE5MDUsIEBncmlkYnVn cykNCg0KICDigKIgYGR1bmUgcnVudGVzdCcgY2FuIG5vdyB1bmRlcnN0YW5kIGFic29sdXRlIHBh dGhzIGFzIHdlbGwgYXMgcnVuDQogICAgdGVzdHMgaW4gc3BlY2lmaWMgYnVpbGQgY29udGV4dHMg KCMxMTkzNiwgQEFsaXp0ZXIpLg0KDQogIOKAoiBBZGRlZCDigJhlbXB0eeKAmSBhbGlhcyB3aGlj aCBjb250YWlucyBubyB0YXJnZXRzLiAoIzExNTU2ICMxMTk1MiAjMTE5NTUNCiAgICAjNDE2MSwg Z3JhbnRzICM0MTYxLCBAQWxpenRlciBhbmQgQHJncmluYmVyZykNCg0KICDigKIgQWxsb3cgYGR1 bmUgcHJvbW90ZScgdG8gcHJvcGVybHkgcnVuIHdoaWxlIGEgd2F0Y2ggbW9kZSBzZXJ2ZXIgaXMN CiAgICBydW5uaW5nICgjMTIwMTAsIEBFbGVjdHJlQUFTKQ0KDQogIOKAoiBBZGQgYC0tYWxpYXMn IGFuZCBgLS1hbGlhcy1yZWMnIGZsYWdzIGFzIGFuIGFsdGVybmF0aXZlIHRvIHRoZSBgQEAnDQog ICAgYW5kIGBAJyBzeW50YXggaW4gdGhlIGNvbW1hbmQgbGluZSAoIzU3NzUsIGZpeGVzICM1Nzc1 LCBAcmdyaW5iZXJnKQ0KDQogIOKAoiBBZGRlZCBhIGAodGltZW91dCA8ZmxvYXQ+KScgZmllbGQg dG8gdGhlIGAoY3JhbSknIHN0YW56YSB0byBzcGVjaWZ5DQogICAgcGVyLXRlc3QgdGltZSBsaW1p dHMuIFRlc3RzIGV4Y2VlZGluZyB0aGUgdGltZW91dCBhcmUgdGVybWluYXRlZA0KICAgIHdpdGgg YW4gZXJyb3IuICAoIzEyMDQxLCBAQWxpenRlcikNCg0KDQril4ogQ2hhbmdlZA0KDQogIOKAoiBG b3JtYXQgbG9uZyBsaXN0cyBpbiBzLWV4cHJlc3Npb25zIHRvIGZpbGwgdGhlIGxpbmUgaW5zdGVh ZCBvZg0KICAgIGZvcm1hdHRpbmcgdGhlbSBpbiBhIHZlcnRpY2FsIHdheSAoIzEwODYwLCBmaXhl cyAjMTA4NjAsIEBub2piKQ0KDQogIOKAoiBTd2l0Y2ggZnJvbSBNRDUgdG8gQkxBS0UzIGZvciBk aWdlc3RpbmcgdGFyZ2V0cyBhbmQgcnVsZXMuIEJMQUtFMyBpcw0KICAgIGJvdGggbW9yZSBwZXJm b3JtYW50IGFuZCBkaWZmaWN1bHQgdG8gYnJlYWsgdGhhbiBNRDUgKCMxMTczNSwNCiAgICBAcmdy aW5iZXJnLCBAQWxpenRlcikNCg0KICDigKIgUHJpbnQgYSB3YXJuaW5nIHdoZW4gYGR1bmUgYnVp bGQnIHJ1bnMgb3ZlciBSUEMgKCMxMTgzMywgQGdyaWRidWdzKQ0KDQogIOKAoiBTdG9wIGVtaXR0 aW5nIGVtcHR5IG1vZHVsZSBncm91cCB3cmFwcGVyIGAuanMnIGZpbGUgaW4NCiAgICBgbWVsYW5n ZS5lbWl0JyAoIzExOTg2LCBmaXhlcyAjMTE5ODYsIEBhbm1vbnRlaXJvKQ0KDQoNCkV0aWVubmUg TWFyYWlzIGxhdGVyIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgVGhlIER1bmUgVGVhbSBpcyBoYXBweSB0byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBE dW5lIGAzLjIwLjEnLg0KDQogIFRoaXMgcmVsZWFzZSBpbnRyb2R1Y2VzIHNvbWUgbWlub3IgZml4 ZXMgYW5kIHJldmVydHMgdGhlIGR1bmUgZmlsZQ0KICBmb3JtYXR0ZXIgY2hhbmdlLiBBcyBtZW50 aW9uZWQgYWJvdmUsIHRoZSBmb3JtYXR0ZXIgY2hhbmdlIHdpbGwgYmUNCiAgcmVpbnRyb2R1Y2Vk IGluIGEgbmV4dCByZWxlYXNlIG9uY2UgaXQgaXMgYWJsZSB0byBkZXRlY3QgdGhlIGR1bmUNCiAg cHJvamVjdCB2ZXJzaW9uLg0KDQoNCkNoYW5nZWxvZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCuKXiiBGaXhlZA0KDQogIOKAoiBGaXggYHJ1bnRlc3QtanMnIG1pc3Rha2VubHkgZGVw ZW5kaW5nIG9uIGBieXRlJyAoZml4ZXMgIzEyMjQzLA0KICAgICMxMjI0MiwgQHZvdWlsbG9uIGFu ZCBAQWxpenRlcikNCg0KICDigKIgRml4IHRoZSBpbnRlcnByZXRhdGlvbiBvZiBwYXRocyBpbiBg ZHVuZSBydW50ZXN0JyB3aGVuIHJ1bm5pbmcgZnJvbQ0KICAgIHdpdGhpbiBhIHN1YmRpcmVjdG9y eS4gKCMxMjI1MSwgZml4ZXMgIzEyMjUwLCBAQWxpenRlcikNCg0KDQril4ogQ2hhbmdlZA0KDQog IOKAoiBSZXZlcnQgZm9ybWF0dGluZyBjaGFuZ2UgaW50cm9kdWNlZCBpbiAzLjIwLjAgbWFraW5n IGxvbmcgbGlzdHMgaW4NCiAgICBzLWV4cHJlc3Npb25zIGZpbGwgdGhlIGxpbmUgaW5zdGVhZCBv ZiBmb3JtYXR0aW5nIHRoZW0gaW4gYSB2ZXJ0aWNhbA0KICAgIHdheSAoIzEyMjQ1LCByZXZlcnRz ICMxMDg5MiwgQG5vamIpDQoNCg0KY3VkYWppdDogQmluZGluZ3MgdG8gdGhlIGBjdWRhJyBhbmQg YG52cnRjJyBsaWJyYXJpZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWN1ZGFqaXQtYmluZGluZ3MtdG8tdGhlLWN1ZGEtYW5kLW52cnRjLWxpYnJhcmllcy8xNTAxMC80 Pg0KDQoNCkx1a2FzeiBTdGFmaW5pYWsgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBjdWRhaml0IDAuNy4yIGlzIG5vdyBhdmFpbGFibGUgaW4gdGhlIG9wYW0gcmVwb3NpdG9y eS4gSXTigJlzIGEgYnVnLWZpeA0KICByZWxlYXNlLiBOb3RlIHRoYXQgYSBzYWxpZW50IG1pc3Np bmcgZmVhdHVyZSBvZiBjdWRhaml0IGlzIENVREENCiAgZ3JhcGhzLCBpZiB5b3Ugd2FudCB0aGVt IEnigJltIGVhZ2VyIHRvIGFkZCB0aGVtLCBsZXQgbWUga25vdyENCg0KICBPQ0FOTkwgMC42LjAg aXMgYWxzbyBhdmFpbGFibGUgaW4gdGhlIG9wYW0gcmVwb3NpdG9yeS4gSG93ZXZlciwgSSBvbmx5 DQogIGV4cGVjdCBPQ0FOTkwgdG8gYmVjb21lIHVzYWJsZSBhdCB2ZXJzaW9uIDAuOCBkdWUgdG8g aG93IEkgZGVjaWRlZCB0bw0KICBwcmlvcml0aXplIHRoaW5ncy4gVGhlIHVwc2hvdCBpcyB0aGF0 IHRoZSBmcm9udC1lbmQgc2hvdWxkIGJlY29tZQ0KICBwcmV0dHkgc3RhYmxlIHN0YXJ0aW5nIHdp dGggdmVyc2lvbiAwLjcuDQoNCg0KemJnIHYwLjMuMDogTmV3IHJlbGVhc2UgMiB5ZWFycyBsYXRl cg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4temJnLXYw LTMtMC1uZXctcmVsZWFzZS0yLXllYXJzLWxhdGVyLzE3MTY1LzE+DQoNCg0KRG1pdHJpaSBLb3Zh bmlrb3YgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9u ZSA6d2F2aW5nX2hhbmQ6DQoNCiAgMiB5ZWFycyBhZ28sIEkgY3JlYXRlZCBgemJnJyDigJMgWmVy byBCdWxsc2hpdCBHaXQuIEl0IHdhcyBteSBmaXJzdA0KICBwcm9qZWN0IGluIE9DYW1sIHRvIGxl YXJuIHRoZSBsYW5ndWFnZS4gQnV0IEkgc3RpbGwgdXNlIHRoZSB0b29sDQogIGRhaWx5LiBJdCdz IGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZCBzb21lIGBnaXQnIGNvbW1hbmRzIHRvIG1ha2Ug bXkNCiAgbGlmZSBlYXNpZXIuDQoNCiAg4oCiIDxodHRwczovL2dpdGh1Yi5jb20vY2hzaGVyc2gv emJnPg0KDQogIEkgbWlnaHQgYmUgdGhlIG9ubHkgcGVyc29uIHVzaW5nIHRoaXMgdG9vbCwgYnV0 IGl0IHNhdmVzIG1lIHRpbWUgZXZlcnkNCiAgZGF5LCBhbmQgaXQgYnJpbmdzIGpveSB0byBwcm9n cmFtbWluZywgc28sIGhleSwgdGhhdCdzIGVub3VnaCByZXdhcmQNCiAgZm9yIG1lLg0KDQogIE1v cmVvdmVyLCBJIHJlY2VpdmVkIHNvbWUgaGlnaC1xdWFsaXR5IGNvbnRyaWJ1dGlvbnMgZnJvbSBv dGhlciBwZW9wbGUNCiAgd2hvIGVuaGFuY2VkIHRoZSB0b29sLiBUaGFuayB5b3UgYSBsb3QhIQ0K DQogIEkgbGlrZSB0aGF0IGB6YmcnIGlzIHJhdGhlciBzbWFsbCwgYW5kIEkgaW50ZW5kIHRvIGtl ZXAgaXQgdGhhdCB3YXkuIEkNCiAgYmVsaWV2ZSBpdCBzZXJ2ZXMgYXMgYSBuaWNlIGV4YW1wbGUg b2YgYSBzbWFsbCAoeWV0IHN0aWxsIHVzZWZ1bCkNCiAgcHJvamVjdCBpbiBPQ2FtbC4NCg0KICBB bnl3YXksIEkganVzdCByZWxlYXNlZCBhIG5ldyB2ZXJzaW9uIDIgeWVhcnMgbGF0ZXIuIEhhdmUg YSBsb29rIGlmDQogIHlvdSdyZSBpbnRlcmVzdGVkIQ0KDQogIFByZXZpb3VzIGRpc2N1c3Npb246 DQoNCiAg4oCiIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXpiZy12MC0yLTAtYS1u ZXctdmVyc2lvbi1vZi16ZXJvLWJ1bGxzaGl0LWdpdC8xMzY2ND4NCiAg4oCiIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLXpiZy16ZXJvLWJ1bGxzaGl0LWdpdC8xMTkyOT4NCg0KDQpB bm5vdW5jaW5nIFJhdmVuOiBTY2llbnRpZmljIENvbXB1dGluZyBmb3IgT0NhbWwgKEFscGhhIFJl bGVhc2UpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L2Fubm91bmNpbmctcmF2ZW4tc2NpZW50aWZpYy1jb21wdXRpbmct Zm9yLW9jYW1sLWFscGhhLXJlbGVhc2UvMTY5MTMvMjg+DQoNCg0KVGhpYmF1dCBNYXR0aW8gYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KSGVscCBTaGFwZSBSYXZlbuKAmXMgRmlyc3QgQWxw aGEgLSBDYWxsIGZvciBDb250cmlidXRpb25zIQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSeKAmW0gZXhjaXRlZCB0byBhbm5vdW5j ZSB0aGF0ICpSYXZlbuKAmXMgZmlyc3QgYWxwaGEgaXMgc2NoZWR1bGVkIGluIDMNCiAgd2Vla3Mq LCBqdXN0IGluIHRpbWUgZm9yIEZ1bk9DYW1sISAoRm9sbG93aW5nIG91ciB6ZXJvdGggYWxwaGEg aW4NCiAgSnVseSkNCg0KDQpXaGF04oCZcyBOZXcNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIFdl4oCZdmUgYWRkZWQgYSBwbGV0aG9yYSBvZiBuZXcgZmVhdHVyZXM6DQoNCiAg 4oCiIE5ldyBgVGFsb24nIHBhY2thZ2UgdGhhdCBwcm92aWRlcyBhbiBlcXVpdmFsZW50IGZvciBQ YW5kYXMvUG9sYXJzIHRvDQogICAgd29yayB3aXRoIGRhdGFmcmFtZXMNCiAg4oCiIE5ldyBgU2Fn YScgcGFja2FnZSBwcm92aWRpbmcgdG9rZW5pemVycyBhbmQgTkxQIGZ1bmN0aW9ubmFsaXRpZXMN CiAgICAoZS5nLiBOZ3JhbSBtb2RlbHMpDQogIOKAoiBTdXBwb3J0IGZvciBzeW1ib2xpYyBzaGFw ZXMgYW5kIGxhenkgdmlld3MgaW4gTngNCiAg4oCiIFN1cHBvcnQgZm9yIG5ldyBhbmQgbWFjaGlu ZS1sZWFybmluZy1zcGVjaWZpYyBkYXRhIHR5cGVzLCBpbmNsdWRpbmcNCiAgICBib29sZWFuLCBi ZmxvYXQxNiwgY29tcGxleDE2LCBmbG9hdDgsIGV0Yy4NCiAg4oCiIFN1cHBvcnQgZm9yIGZvcndh cmQgbW9kZSBkaWZmZXJlbmNpYXRpb24gdGhyb3VnaCBgUnVuZS5qdnAnDQogIOKAoiBTdXBwb3J0 IGZvciBhdXRvbWF0aWMgdmVjdG9yaXphdGlvbiB0aHJvdWdoIGBSdW5lLnZtYXAnDQogIOKAoiBB ZGRpdGlvbiBvZiBhIGNvbXBsZXRlIGxpbmVhciBhbGdlYnJhIHN1aXRlIGluIE54DQoNCiAgQW5k LCBvZiBjb3Vyc2UsIHNpbmNlIGl0IGlzIHRoZSB0aGVtZSBvZiB0aGUgRnVuT0NhbWwgd29ya3No b3A6DQogICphZGRpdGlvbiBvZiB0cmFuc2Zvcm1lcnMgYmxvY2tzIGluIEthdW4gdG8gdHJhaW4g bGFyZ2UgbGFuZ3VhZ2UNCiAgbW9kZWxzLioNCg0KICBBbGwgb2YgdGhlc2UgZmVhdHVyZXMgYXJl IGN1cnJlbnRseSBpbi1wcm9ncmVzcyBpbiBSYXZlbuKAmXMgcmVwb3NpdG9yeSwNCiAgcmFuZ2lu ZyBmcm9tIHJlYWR5LXRvLXJlbGVhc2UgKGUuZy4gVGFsb24pIHRvIHByb3RvdHlwaW5nIChlLmcu IEthdW4ncw0KICB0cmFuc2Zvcm1lcnMpLCBidXQgd2XigJlyZSBhaW1pbmcgZm9yIGEgcmVsZWFz ZSB3aXRoIGFsbCBvZiB0aGUgYWJvdmUNCiAgbWlkLXNlcHRlbWJlci4NCg0KICAjIyMgQ2FsbCBm b3IgQ29udHJpYnV0aW9ucw0KDQogIElmIHlvdSB3ZXJlIGxvb2tpbmcgdG8gY29udHJpYnV0ZSB0 byBSYXZlbiwgbm934oCZcyBwcm9iYWJseSBhIHJlYWxseQ0KICBnb29kIHRpbWUhIFRoZXJl4oCZ cyBnb2luZyB0byBiZSBhIGxvdCBvZiBhY3Rpdml0eSBpbiB0aGUgY29taW5nIHdlZWtzLA0KICBh bmQgdGhlIHJlcG9zaXRvcnkgaXMgaW4gZ29vZCBzaGFwZSBmb3IgZmlyc3QtdGltZS1jb250cmli dXRvcnMsIHdpdGgNCiAgYSBsb3Qgb2YgZ29vZCBmaXJzdCBpc3N1ZXM6IHdl4oCZdmUganVzdCBs YW5kZWQgYSAqY29tcGxldGUgbGluZWFyDQogIGFsZ2VicmEgc3VpdGUqIHRoYXTigJlzIH44MCUg d29ya2luZywgd2hpY2ggbWFrZXMgZm9yIHRoZSBwZXJmZWN0IHNldCBvZg0KICBzdGFydGVyIGlz c3VlczogZmFpbGluZyB0ZXN0cyB0aGF0IG5lZWQgZml4aW5nLg0KDQogIOKAoiAqMTUgZmFpbGlu ZyB0ZXN0cyBvbiB0aGUgbmF0aXZlIGJhY2tlbmQqDQogIOKAoiAqMzUgb24gdGhlIEMgYmFja2Vu ZCoNCg0KICBUaGVzZSByYW5nZSBmcm9tIGltcGxlbWVudGluZyBmcm9udGVuZCBvcGVyYXRpb25z IHVzaW5nIG91ciBuZXcNCiAgYmFja2VuZCBvcHMsIHRvIGludmVzdGlnYXRpbmcgYnVncyBpbiB0 aGUgbmV3bHkgYWRkZWQgbGluZWFyIGFsZ2VicmENCiAgZnVuY3Rpb25zLiBQaWNrIGEgdGVzdCwg Zml4IGl0LCBvcGVuIGEgUFIhDQoNCg0KR2V0dGluZyBTdGFydGVkDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICDilIzilIDilIDilIDilIANCiAg4pSC IGdpdCBjbG9uZSBodHRwczovL2dpdGh1Yi5jb20vcmF2ZW4tbWwvcmF2ZW4NCiAg4pSCIGR1bmUg cGtnIGxvY2sNCiAg4pSCIGR1bmUgYnVpbGQgQG54L3J1bnRlc3QNCiAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgSWYgeW914oCZcmUgaW50ZXJlc3RlZCBpbiBjb250cmlidXRpbmcsIGRvbuKAmXQgaGVz aXRhdGUgdG8gcmVhY2ggb3V0IGFzDQogIHdlbGwsIEnigJltIGhhcHB5IHRvIGdpdmUgcG9pbnRl cnMgYW5kIHNob3cgeW91IGFyb3VuZCB0aGUgY29kZWJhc2UuDQoNCiAgSG9waW5nIHlvdeKAmXJl IGFzIGV4Y2l0ZWQgYWJvdXQgdGhlIHVwY29taW5nIHJlbGVhc2UgYXMgSSBhbSAtIEhhcHB5DQog IEhhY2tpbmchDQoNCg0KT3V0cmVhY2h5IERlbW8gRGF5IEF1Z3VzdCAyMDI1DQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L291dHJlYWNoeS1kZW1vLWRheS1hdWd1c3QtMjAyNS8xNzE2Ny8xPg0KDQoN ClBhdHJpY2sgRmVycmlzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkg cGxlYXN1cmUgdG8gYW5ub3VuY2UgdGhpcyBGcmlkYXkgW2RhdGU9MjAyNS0wOC0yOQ0KICB0aW1l PTEwOjAwOjAwIHRpbWV6b25lPSJVVEMiXSB3ZSB3aWxsIGhvc3QgdGhlIE91dHJlYWNoeSBEZW1v DQogIHByZXNlbnRhdGlvbi4gV2UgaW52aXRlIGFsbCBvZiB0aGUgT0NhbWwgY29tbXVuaXR5IGFu ZCBiZXlvbmQgdG8gam9pbg0KICB1cyBpbiBjZWxlYnJhdGluZyB0aGUgaGFyZCB3b3JrIG9mIHRo ZSBjb21tdW5pdHnigJlzIHR3byBpbnRlcm5zIHdobw0KICBoYXZlIGJlZW4gd29ya2luZyBvbjoN Cg0KICDigKIgW0NsYXVkaXVzXTogL0EgZmFudGFzeS1jb25zb2xlIHN0eWxlIGdyYXBoaWNzIGxp YnJhcnkgZm9yIE9DYW1sLw0KICDigKIgW0R1bmVdOiAvRXh0ZW5kaW5nIGR1bmUgdG8gZGlzY292 ZXIgc3lzdGVtIGluZm9ybWF0aW9uLw0KDQogIFdl4oCZbGwgcG9zdCB0aGUgbWVldGluZyBsaW5r IGNsb3NlciB0byB0aGUgdGltZS4gSG9wZWZ1bGx5IHNlZSB5b3UNCiAgdGhlcmUhIDpjYW1lbDoN Cg0KDQpbQ2xhdWRpdXNdIDxodHRwczovL2dpdGh1Yi5jb20vY2xhdWRpdXNGWC9DbGF1ZGl1cz4N Cg0KW0R1bmVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZT4NCg0KDQpPdGhlciBPQ2Ft bCBOZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZAN Cg0KRnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxp bmtzIGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQog IGJsb2ddLg0KDQogIOKAoiBbUHJlc2VudGluZyBvdXIgRWNvbG9neSBvZiB0aGUgSW50ZXJuZXQg aWRlYXMgYXQgQWFyaHVzIDIwMjVdDQogIOKAoiBbVXBjb21pbmcgT0NhbWwgRXZlbnRzXQ0KICDi gKIgW0ludGVybnNoaXAgUmVwb3J0OiBSZWZhY3RvcmluZyBUb29scyBDb21pbmcgdG8gTWVybGlu XQ0KICDigKIgW0FuIE9DYW1sIE1DUCBzZXJ2ZXJdDQogIOKAoiBbV2VlayAzM10NCiAg4oCiIFtT dHJlYW1pbmcgQmluYXJ5IERhdGEgaW4gTW9sbHltYXdrXQ0KICDigKIgW21sZ3B4IGlzIHRoZSBm aXJzdCBUYW5nbGVkLWhvc3RlZCBwYWNrYWdlIGF2YWlsYWJsZSBvbiBvcGFtXQ0KDQoNClt0aGUg b2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1ByZXNlbnRpbmcg b3VyIEVjb2xvZ3kgb2YgdGhlIEludGVybmV0IGlkZWFzIGF0IEFhcmh1cyAyMDI1XQ0KPGh0dHBz Oi8vYW5pbC5yZWNvaWwub3JnL25vdGVzL2Vjb2xvZ3ktYXQtYWFyaHVzPg0KDQpbVXBjb21pbmcg T0NhbWwgRXZlbnRzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZXZlbnRzPg0KDQpbSW50ZXJuc2hpcCBS ZXBvcnQ6IFJlZmFjdG9yaW5nIFRvb2xzIENvbWluZyB0byBNZXJsaW5dDQo8aHR0cHM6Ly90YXJp ZGVzLmNvbS9ibG9nLzIwMjUtMDgtMjAtaW50ZXJuc2hpcC1yZXBvcnQtcmVmYWN0b3JpbmctdG9v bHMtY29taW5nLXRvLW1lcmxpbj4NCg0KW0FuIE9DYW1sIE1DUCBzZXJ2ZXJdDQo8aHR0cHM6Ly9q b24ucmVjb2lsLm9yZy9ibG9nLzIwMjUvMDgvb2NhbWwtbWNwLXNlcnZlci5odG1sPg0KDQpbV2Vl ayAzM10gPGh0dHBzOi8vam9uLnJlY29pbC5vcmcvYmxvZy8yMDI1LzA4L3dlZWszMy5odG1sPg0K DQpbU3RyZWFtaW5nIEJpbmFyeSBEYXRhIGluIE1vbGx5bWF3a10NCjxodHRwczovL2Jsb2cucm9i dXIuY29vcC9hcnRpY2xlcy9zdHJlYW1pbmctYmluYXJpZXMtbW9sbHltYXdrLmh0bWw+DQoNCltt bGdweCBpcyB0aGUgZmlyc3QgVGFuZ2xlZC1ob3N0ZWQgcGFja2FnZSBhdmFpbGFibGUgb24gb3Bh bV0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy90YW5nbGVkLWFuZC1jaT4NCg0KDQpP bGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3Mg YSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRv IHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVk IG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0 IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxp c3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRv OmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVz XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlz dF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFu IFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 19 to 26, 2025.

    Tacit 1.0.0 - Combinators!

    arutonee announced

    Partially as a beginner project (I am very much a beginner- if anyon= e else finds the package useful and feels like something should be changed = or knows more fun combinators, feel free to make a PR as I have no clue wha= t I=E2=80=99m doing), and partially just because I personally want a relati= vely complete combinator library, tacit is now on opam! Now yo= u can write let nth_root =3D C.c (C.phi1 Float.pow C.k (C.b1 (( /. ) = 1.) C.ki)) if you wanted to, for whatever reason :wink:

    Xavier Van de Woestyne then added

    Here is the package page: http= s://ocaml.org/p/tacit/latest

    here is the repository: http= s://github.com/arutonee1/tacit

    Slipshow!

    Paul-Elliot announced

    (I hope it's still OK to announce my releases here, despite their current f= requencies and the fact that it's not an OCaml li= brary.)

    I am speechless to announce the new opam release of Slipshow!

    Version 0.6.0: The King=E2=80=99s Slipshow

    This release focuses on one specific feature: the speaker view.

    https://github.com/user-attachments/assets/6f1384f0-715c-4= af7-80d6-7da9c0b9744b

    (Disclaimer: AI generated text ^[The text in the left of the gif above was = mostly generated by an LLM, mimicking "The King's speech" declaration of wa= r, but turned to praise peace, which we need a lot in this world])

    The speaker view includes a timer, speaker notes, and a presentation synced= with the main one. Note that a compiled presentation is still a standalone= html file that you can just double click on.

    To open the speaker view, press s. To send some text to the sp= eaker notes, use the speaker-note action, as in the code below:

    # The King's Slipshow
    
    {pause speaker-note}
    Say it like this: "perhaaaaaaaaps"...
    
    In this grave hour, perhaps the most fateful in our history, I send to ever=
    y household of my peoples, both at home and overseas, this message, spoken =
    with the same depth of feeling for each one of you as if I were able to cro=
    ss your threshold and speak to you myself.
    
    {pause speaker-note}
    Make a little pause and show a tear, it'll make it more dramatic.
    
    As always, the world finds itself standing on the edge of war.
    
    {pause center=3Dtime speaker-note}
    Emphasize roar but avoid making everyone uncomfortable.
    
    {#time}
    Time after time, we have sought peaceful ways to resolve our differences. Y=
    et too often, dialogue has been drowned out by the roar of weapons.
    
    {pause speaker-note}
    Pretend you know what you are speaking about: as a King, you can do that.
    
    We are told that violence is unavoidable, that to be safe we must fight. Bu=
    t this is the old and dangerous lie that =E2=80=9Cmight is right.=E2=80=9D =
    If we accept it, we accept the slow destruction of all that makes life wort=
    h living.
    
    {pause down=3Dend speaker-note}
    DRAMATICALLY POINT FINGERS AT THE AUDIENCE!!!
    
    For the sake of all we cherish, we must find another path. The real challen=
    ge before us is not to fight harder, but to imagine peace when anger blinds=
     us, and to choose cooperation when conflict seems easier.
    
    I call on all people, across every border, to remain calm, firm, and united=
     in the higher cause of preserving life. To resist the call of hatred. To r=
    emember that in every city, in every nation, there are children who deserve=
     a future unscarred by war.
    
    The road will be hard. There may be days when peace feels impossible. But w=
    ar spreads beyond the battlefield =E2=80=94 it steals homes, divides famili=
    es, and poisons the generations to come.
    
    {#end}
    If we remain steadfast in our refusal to give in to violence, then, with co=
    urage and compassion, we will prevail =E2=80=94 not by destroying, but by p=
    reserving.
    

    Full changelog below:

    • Engine
      • Add a speaker view, opened with s. (#147)
      • Fix Z and X not working (#147)
      • On step change, move back to the position we left (#148)
    • Language
      • Add a speaker-note action. (#147)

    Claudius is now available in opam! =F0=9F=8E=89

    Shreya Pawaskar announced

    We are happy to announce that Claudius is now available in opam!

    Claudius is a functional style retro-graphics library for OCaml for buildin= g generative art, demos, and games.

    Here=E2=80=99s our github: Claudius

    And some cool examples to checkout and explore more: claudius-examples

    New release of UnionFind

    Fran=C3=A7ois Pottier announced

    Hello! It is my pleasure to announce a new release of my library unio= nFind. The main news is that a concurrent union-find algorithm is no= w available under the name UnionFind.Concurrent. To install it= , type opam update && opam install unionFind.20250818.= For more information, see the documentation.

    Bogue, the OCaml GUI

    sanette announced

    Hello

    it=E2=80=99s my pleasure to announce a new version of Bogue, version 20250815 available on opam.

    The main novelty is an internationalization mechanism. All text used= by Bogue (like =E2=80=98close=E2=80=99 in a close button) will be automati= cally translated into the user=E2=80=99s language. Currently 15 languages a= re supported but more can easily be added either via configuration files, o= n directly at run-time using the i18n API.

    note: Internationalization has been tested only for a small number of appli= cations; don=E2=80=99t hesitate to report bugs.

    Happy bogue-ing!

    Dune 3.20

    Etienne Marais announced

    On the behalf of the Dune Team, I=E2=80=99m glad to announce the release of= dune 3.20.0 :partying_face:=20

    This release contains some important bug fixes. It contains new features fo= r tests, such as the possibility to use an alias and the possibility to dec= lare a timeout for cram tests. This release also provides new= possibilities for the watch mode, like the ability to run an execut= able or promote files while the watch mode is running.

    :warning: A significant change in this release is how the dune file formatt= er acts. It will now try to fill the line instead of using the vertical for= mat.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • Stop re-running cram tests after promotion when it=E2=80=99s not necess= ary (#11994, @rgrinberg)
      • fix: $ dune subst should not fail when adding the version = field in opam files (#11801, fixes #11045, @btjorge)
      • Kill all processes in the process group after the main process has terminated; in particular this avoids background processes in cram tests to stick around after the test finished (#11841, fixes #11820, @Alizter, @Leonidas-from-XIV)
    • Added
      • (tests) stanzas now generate aliases with the test name. T= o run (test (name a)) you can do dune build @runtest-a.= (#11558, grants part of #10239, @Alizter)
      • Inline test libraries now produce aliases runtest-name_of_lib allowing users to run specific inline tests as dune build @runtest-na= me_of_lib. (#11109, partially fixes #10239, @Alizter)
      • feature: $ dune subst use version from dune-project<= /code> when no version control repository has been detected (#11801, @btjorge)
      • Allow dune exec to run concurrently with another instance = of dune in watch mode (#11840, @gridbugs)
      • Introduce %{os}, %{os_version}, %{os_di= stribution}, and %{os_family} percent forms. These have the same values as their opam counterparts. (#11863, @rgrinberg)
      • Introduce option (implicit_transitive_deps false-if-hidden-includ= es-supported) that is equivalent to (implicit_transitive_deps false) when -H is supported by the compiler (OCaml >=3D 5.2) and equivalent to (implicit_transitive_deps true) otherwise. (#11866, fixes #112= 12, @nojb)
      • Add dune describe location for printing the path to the ex= ecutable that would be run (#11905, @gridbugs)
      • dune runtest can now understand absolute paths as well as = run tests in specific build contexts (#11936, @Alizter).
      • Added =E2=80=98empty=E2=80=99 alias which contains no targets. (#11556 = #11952 #11955 #4161, grants #4161, @Alizter and @rgrinberg)
      • Allow dune promote to properly run while a watch mode serv= er is running (#12010, @ElectreAAS)
      • Add --alias and --alias-rec flags as an alter= native to the @@ and @ syntax in the command line (#5775, fixes #5775, @rgrinberg)
      • Added a (timeout <float>) field to the (cram)<= /code> stanza to specify per-test time limits. Tests exceeding the timeout are terminated with an error. (#12041, @Alizter)
    • Changed
      • Format long lists in s-expressions to fill the line instead of formatting them in a vertical way (#10860, fixes #10860, @nojb)
      • Switch from MD5 to BLAKE3 for digesting targets and rules. BLAKE3 is bo= th more performant and difficult to break than MD5 (#11735, @rgrinberg, @Alizter)
      • Print a warning when dune build runs over RPC (#11833, @gr= idbugs)
      • Stop emitting empty module group wrapper .js file in melange.emit (#11986, fixes #11986, @anmonteiro)

    Etienne Marais later announced

    The Dune Team is happy to announce the release of Dune 3.20.1.

    This release introduces some minor fixes and reverts the dune file formatte= r change. As mentioned above, the formatter change will be reintroduced in = a next release once it is able to detect the dune project version.

    Changelog

    • Fixed
      • Fix runtest-js mistakenly depending on byte (= fixes #12243, #12242, @vouillon and @Alizter)
      • Fix the interpretation of paths in dune runtest when runni= ng from within a subdirectory. (#12251, fixes #12250, @Alizter)
    • Changed
      • Revert formatting change introduced in 3.20.0 making long lists in s-expressions fill the line instead of formatting them in a vertical way (#12245, reverts #10892, @nojb)

    cudajit: Bindings to the cuda and nvrtc libraries

    Lukasz Stafiniak announced

    cudajit 0.7.2 is now available in the opam repository. It=E2=80=99s a bug-f= ix release. Note that a salient missing feature of cudajit is CUDA graphs, = if you want them I=E2=80=99m eager to add them, let me know!

    OCANNL 0.6.0 is also available in the opam repository. However, I only expe= ct OCANNL to become usable at version 0.8 due to how I decided to prioritiz= e things. The upshot is that the front-end should become pretty stable star= ting with version 0.7.

    zbg v0.3.0: New release 2 years later

    Dmitrii Kovanikov announced

    Hi everyone :waving_hand:=20

    2 years ago, I created zbg =E2=80=93 Zero Bullshit Git. It was= my first project in OCaml to learn the language. But I still use the tool = daily. It's just a small wrapper around some git commands to m= ake my life easier.

    I might be the only person using this tool, but it saves me time every day,= and it brings joy to programming, so, hey, that's enough reward for me.

    Moreover, I received some high-quality contributions from other people who = enhanced the tool. Thank you a lot!!

    I like that zbg is rather small, and I intend to keep it that = way. I believe it serves as a nice example of a small (yet still useful) pr= oject in OCaml.

    Anyway, I just released a new version 2 years later. Have a look if you're = interested!

    Previous discussion:

    Announcing Raven: Scientific Computing for OCaml (Alpha Relea= se)

    Thibaut Mattio announced

    Help Shape Raven=E2=80=99s First Alpha - Call for Con= tributions!

    I=E2=80=99m excited to announce that Raven=E2=80=99s first alpha is sche= duled in 3 weeks, just in time for FunOCaml! (Following our zeroth alph= a in July)

    What=E2=80=99s New

    We=E2=80=99ve added a plethora of new features:

    • New Talon package that provides an equivalent for Pandas/P= olars to work with dataframes
    • New Saga package providing tokenizers and NLP functionnali= ties (e.g. Ngram models)
    • Support for symbolic shapes and lazy views in Nx
    • Support for new and machine-learning-specific data types, including boo= lean, bfloat16, complex16, float8, etc.
    • Support for forward mode differenciation through Rune.jvp<= /li>
    • Support for automatic vectorization through Rune.vmap
    • Addition of a complete linear algebra suite in Nx

    And, of course, since it is the theme of the FunOCaml workshop: addition= of transformers blocks in Kaun to train large language models.

    All of these features are currently in-progress in Raven=E2=80=99s reposito= ry, ranging from ready-to-release (e.g. Talon) to prototyping (e.g. Kaun's = transformers), but we=E2=80=99re aiming for a release with all of the above= mid-september.

    ### Call for Contributions

    If you were looking to contribute to Raven, now=E2=80=99s probably a really= good time! There=E2=80=99s going to be a lot of activity in the coming wee= ks, and the repository is in good shape for first-time-contributors, with a= lot of good first issues: we=E2=80=99ve just landed a complete linear a= lgebra suite that=E2=80=99s ~80% working, which makes for the perfect s= et of starter issues: failing tests that need fixing.

    • 15 failing tests on the native backend
    • 35 on the C backend

    These range from implementing frontend operations using our new backend ops= , to investigating bugs in the newly added linear algebra functions. Pick a= test, fix it, open a PR!

    Getting Started

    git clone https://github.com/raven-ml/ra=
    ven
    dune pkg lock
    dune build @nx/runtest
    

    If you=E2=80=99re interested in contributing, don=E2=80=99t hesitate to rea= ch out as well, I=E2=80=99m happy to give pointers and show you around the codebase.

    Hoping you=E2=80=99re as excited about the upcoming release as I am - Happy= Hacking!

    Outreachy Demo Day August 2025

    Patrick Ferris announced

    It is my pleasure to announce this Friday [date=3D2025-08-29 time=3D10:00:0= 0 timezone=3D"UTC"] we will host the Outreachy Demo presentation. We invite= all of the OCaml community and beyond to join us in celebrating the hard w= ork of the community=E2=80=99s two interns who have been working on:

    • Claudius: A f= antasy-console style graphics library for OCaml
    • Dune: Extending dune t= o discover system information

    We=E2=80=99ll post the meeting link closer to the time. Hopefully see you t= here! :camel:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=N02T4Th9; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=2KYifTVJ; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 248B1400A5 for ; Tue, 2 Sep 2025 12:23:23 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MGWmvqwT2ulxQbOWp+MDc1X7g/M3e8rw8QSlDclUucM=; b=N02T4Th9aPiG2RKA32m7U9swuDFqpZOj2F+UursEc5cGUJC8gN2QsPrW LQLKqowGbJj6qO59YOC/K3j17FOIXcZOltmHfY4X4c0RvllUX3BvItTrK 8deAGhbXzwM2Kl6BDrAPqVHXkyRqavEvGcHsqPWmyG5j+yNaaFd+aUShO U=; X-CSE-ConnectionGUID: TlbJtrPuRnuK4o57s+xW2w== X-CSE-MsgGUID: kBchtOzQTjir0ycbX8W37A== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,230,1751234400"; d="scan'208,217";a="237112387" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 Sep 2025 14:23:23 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 98679E0BE9; Tue, 2 Sep 2025 14:23:22 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 54299E0171 for ; Tue, 2 Sep 2025 14:23:19 +0200 (CEST) X-CSE-ConnectionGUID: 9pnumNX4QXGHxCoTA62eVw== X-CSE-MsgGUID: kOo+kXeERRS1E1s/5Y+AYA== IronPort-SDR: 68b6e1b6_dUJfgHZClAwty9dnt3SWEYFMxNqb3cxrwVbg/2S88AswEP1 XUQb1/Nk5w/lGlZbR8o1YNkxH1o+aOMJNb9LJtg== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HnAgCr4LZohSIeaIFahBlbKBkBZ1ozBwhJhFWDT44ik?= =?us-ascii?q?U2Ke4J6AxgWBR4VAQMBDS4BFQoBAgQBAQMBAgGFAAIWjBECHwYBBDQTAQIEA?= =?us-ascii?q?QEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABAQEBQEmGFQgyDYJFU?= =?us-ascii?q?SRNYQQDBgYBAQEBAQEBAQECAQEjAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQIECAERMWUEBhMBATgYIwMUAQYDAgQNATUDA?= =?us-ascii?q?RMBEhqCaAGCIAICTgMFDAaXG5p7Gjd6fzOBAYIMAQEGgQg+BQ0DGCbaC4FkC?= =?us-ascii?q?YFJhWyCShoBKklrAoRHCYQzJw+BVUSBFTWCRG+BUAF5FwEBAQEYQmIBAQgGP?= =?us-ascii?q?wmDJYJpgiaBAhQdhzuCV4YEgjCIU4FESzMsAVUTFwsHBVuBCAMqNDFuMh2BJ?= =?us-ascii?q?4UNhB4rT4UCgReDUxETaw8GgRWDXYQRQAMLbT03FBuVMBcpGWqBUiUONjYfF?= =?us-ascii?q?RoTAQciAkYSGAMoAhcOCxsMPgsLAi2SRjgEKrJXNAeEH4FeBgyJCIEmlgaFW?= =?us-ascii?q?6UQIphkIoldgSEFCYFva4UjkAE8BByFOYF/I0liAR0MBzMaMEMNBIIiAQEyC?= =?us-ascii?q?UYcD4FMjGEWgRIBCIJDgT6BJoF0O32COLEkQTUBAQEBOAIHAQoBAQMJhWIBA?= =?us-ascii?q?Yw6gUsBAQ?= IronPort-PHdr: A9a23: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 WUTQZ5TxXrfE5ULjgc/b7wk9g0kHQ== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:uXRrB6GZLUFz3AU7pLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:BSFbPm0Syzw9O5XiWpUYXLxfS9gjb3j7/CvpE2CYGU1udJTLE1Ku5/Yx X-Talos-MUID: 9a23:hWSl9gSCPZa2YQdkRXTvozYhN/dlzp6UMxkgyI5B5vjHHB1ZbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,230,1751234400"; d="scan'208,217";a="124426071" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDGECLbQnqHxmOCs67/yyjoF87GwOv1UDp5CO7?= =?us-ascii?q?VUB6oKgjbxXVlp/NJVkKAz9WMHpjeSkxC/vv/RvpZg11ZsTJxEnNWe/l?= =?us-ascii?q?sW6B2dOZmSFA8KRcq8JBWfMfanY9oJipM1thadmlaHqv7I5tD6vTZ3oW?= =?us-ascii?q?9KFRCMjzm8BDv3rUZ4fcD66w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Sep 2025 14:23:18 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 697B21A2D4; Tue, 2 Sep 2025 14:23:17 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1756815797; bh=KBrmhiGJhMJzyOgYesV7zZcJ7RktU0UqqoRCuSN74J0=; h=From:To:Subject:Date:Message-ID; b=2KYifTVJsFXyZ4zyraCAOhKxsmdqUaAq32CQs+SXKfB/GTLzPEDlLyo7Pyhnrv+3E m+19H8+Z5GuaEflQzzxJ3xseXyoXg1lWevgbQZ98Zq30wfLA3JKLCay+hIgG1NPDXZ I+2Aq75S0s7vJ83jIwXGU1cpPSK9oY9nRC26i39Y= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 02 Sep 2025 14:23:17 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 2 14:23:17 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499220, queueID=87FB41A2FF X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19372 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXVndXN0IDI2IHRvDQpTZXB0ZW1iZXIgMDIsIDIwMjUuDQoNClRhYmxlIG9mIENvbnRl bnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KUG9ydGluZyBteSBUb3kgT0NhbWwgQnVpbGQgU3lzdGVtIHRvIFdpbmRvd3MNCm1sZnJvbnQt c2hlbGwgLSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gb2YgYSBidWlsZCBzeXN0ZW0NCkFuIGV4 cGVyaW1lbnRhbCBicmFuY2ggb2YgTWVybGluIGJhc2VkIG9uIERvbWFpbnMgYW5kIEVmZmVjdHMN ClBweF9yYXBwZXIgc3VwcG9ydCwgQ2FxdGkgMi4wIHBvcnQNCk91dHJlYWNoeSBEZW1vIERheSBB dWd1c3QgMjAyNQ0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNClBvcnRpbmcgbXkgVG95 IE9DYW1sIEJ1aWxkIFN5c3RlbSB0byBXaW5kb3dzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BvcnRpbmctbXktdG95LW9j YW1sLWJ1aWxkLXN5c3RlbS10by13aW5kb3dzLzE3MTg1LzE+DQoNCg0KU3RldmUgU2hlcnJhdHQg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICA8aHR0cHM6Ly93d3cuZ3JpZGJ1Z3Mub3Jn L3BvcnRpbmctbXktdG95LW9jYW1sLWJ1aWxkLXN5c3RlbS10by13aW5kb3dzLz4NCg0KDQptbGZy b250LXNoZWxsIC0gcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uIG9mIGEgYnVpbGQgc3lzdGVtDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1tbGZy b250LXNoZWxsLXJlZmVyZW5jZS1pbXBsZW1lbnRhdGlvbi1vZi1hLWJ1aWxkLXN5c3RlbS8xNzE4 Ni8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJl2ZSBtYWRlIGEgcmVmZXJl bmNlIGltcGxlbWVudGF0aW9uICjigJxtbGZyb250LXNoZWxs4oCdKSBvZiBhIGJ1aWxkDQogIHN5 c3RlbSB0aGF0IGlzIG1vc3RseSB3b3JraW5nIGJ1dCBoYXMgemVybyAoMCkgcGVyZm9ybWFuY2Ug d29yayBzbw0KICBmYXIuIEFtb25nIHRoZSBtYW55IGV4aXN0aW5nIGJ1aWxkICsgcGFja2FnZSBt YW5hZ2VycywgdGhlDQogIOKAnG1sZnJvbnQtc2hlbGzigJ0gdG9vbCBzaXRzIGNsb3Nlc3QgdG8g Tml4LiBJdCB3b3JrcyBvbiBXaW5kb3dzLCBjYW4NCiAgZG93bmxvYWQgYmluYXJ5IGFzc2V0cywg aXMgbGFuZ3VhZ2UtbmV1dHJhbCB3aXRoIGFuIGVhc3ktdG8tcGFyc2UgSlNPTg0KICBidWlsZCBm aWxlLg0KDQogIFRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24gY29tZXMgd2l0aCBhIHNwZWNp ZmljYXRpb24gZG9jIGFuZCBhIEpTT04NCiAgc2NoZW1hLiBTaW5jZSBJ4oCZbGwgZXZlbnR1YWxs eSBiZSBpbnRlZ3JhdGluZyB0aGUgYnVpbGQgc3lzdGVtIGZlYXR1cmVzDQogIGludG8gYGRrJyAo bXkgT0NhbWwgc2NyaXB0aW5nIHRvb2wpLCB0aGUgZG9jcyBsaXZlIHRoZXJlLiBZb3XigJlsbCBm aW5kDQogIGEgUXVpY2sgU3RhcnQgZ3VpZGUgYW5kIGEgQ29tcGFyaXNvbiB0YWJsZSAodGhlIGBv cGFtJyBhbmQgYGR1bmUnDQogIGNvbXBhcmlzb25zIGFyZSBwZXJ0aW5lbnQpOg0KDQogIDxodHRw czovL2dpdGh1Yi5jb20vZGlza3V2L2RrL3RyZWUvMS4wP3RhYj1yZWFkbWUtb3YtZmlsZT4jDQoN CiAgSHVnZSB0aGFua3MgdG8gdGhlIGEgbGEgY2FydGUgYXV0aG9ycywgYW5kIGFsc28gdG8gQGhi ciBmb3INCiAgW2ZtbGliX3BhcnNlXS4NCg0KICBBc2lkZTogV293LCBhbm90aGVyIFdpbmRvd3Mt ZnJpZW5kbHkgYnVpbGQgc3lzdGVtIHBvc3QgYXQNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9wb3J0aW5nLW15LXRveS1vY2FtbC1idWlsZC1zeXN0ZW0tdG8td2luZG93cy8xNzE4NT4N CiAgIQ0KDQogIExpbmtzOg0KDQogIOKAoiBKU09OIHNjaGVtYSBmb3IgSlNPTiBidWlsZCBmaWxl czogRm9sbG93IHRoZSBbUXVpY2sgU3RhcnQgLSBCdWlsZA0KICAgIFRvb2xdIHRvIHNlZSBob3cg dG8gdXNlIGl0IGZvciBhdXRvLWNvbXBsZXRpb24NCiAg4oCiIFNwZWNpZmljYXRpb246DQogICAg PGh0dHBzOi8vZ2l0aHViLmNvbS9kaXNrdXYvZGsvYmxvYi8xLjAvZG9jcy9TUEVDSUZJQ0FUSU9O Lm1kPg0KICDigKIgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC12ZXJzaW9uLW9m LXRoZS1idWlsZC1zeXN0ZW1zLWEtbGEtY2FydGUtcGFwZXIvMTcwNDI+DQogICAgdG9waWMNCiAg 4oCiIFNvdXJjZSBDb2RlOiA8aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvYnVpbGQtdG9vbHMvTWxG cm9udD4gKGluDQogICAgcGFydGljdWxhciB0aGUgTWxGcm9udF9FeGVjIGFuZCBNbEZyb250X1Ro dW5rIHN1YnByb2plY3RzKQ0KDQoNCltmbWxpYl9wYXJzZV0gPGh0dHBzOi8vb2NhbWwub3JnL3Av Zm1saWJfcGFyc2UvbGF0ZXN0Pg0KDQpbUXVpY2sgU3RhcnQgLSBCdWlsZCBUb29sXQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9kaXNrdXYvZGsvdHJlZS8xLjA/dGFiPXJlYWRtZS1vdi1maWxlI3F1aWNr LXN0YXJ0LS0tYnVpbGQtdG9vbD4NCg0KDQpBbiBleHBlcmltZW50YWwgYnJhbmNoIG9mIE1lcmxp biBiYXNlZCBvbiBEb21haW5zIGFuZCBFZmZlY3RzDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1hbi1leHBlcmltZW50YWwtYnJh bmNoLW9mLW1lcmxpbi1iYXNlZC1vbi1kb21haW5zLWFuZC1lZmZlY3RzLzE3MTk1LzE+DQoNCg0K WGF2aWVyIFZhbiBkZSBXb2VzdHluZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIC9UaGUgTWVybGluIFRlYW0vIDptYW5fbWFnZTogaXMgdmVy eSBoYXBweSB0byBhbm5vdW5jZSBhbiBleHBlcmltZW50YWwNCiAgdmVyc2lvbiBvZiBNZXJsaW46 IFtNZXJsaW4gRG9tYWluc10hDQoNCiAgQXMgYSByZW1pbmRlciwgW01lcmxpbl0gaXMgYW4gL2Vk aXRvciBzZXJ2aWNlLyB0aGF0IHByb3ZpZGVzIGFkdmFuY2VkDQogIElERSBmZWF0dXJlcyBmb3Ig T0NhbWwuIEl0IGNhbiBiZSB1c2VkIGFzIGEgc3RhbmRhbG9uZSBiaW5hcnkgb3IgYXMgYQ0KICBs aWJyYXJ5LCBhbmQgaXMgbm90YWJseSB1c2VkIGJ5IFtPQ2FtbCBMU1AgU2VydmVyXS4gSW4gb3Ro ZXIgd29yZHMsIGlmDQogIHlvdSBhcmUgdXNpbmcgdGhlIFtPQ2FtbCBQbGF0Zm9ybSBleHRlbnNp b25dIHdpdGggVmlzdWFsIFN0dWRpbyBDb2RlLA0KICBvciBbb2NhbWwtZWdsb3RdIHdpdGggRW1h Y3MsIHlvdSBhcmUgYWxyZWFkeSB1c2luZyBNZXJsaW4gKnVuZGVyIHRoZQ0KICBob29kKi4NCg0K ICBFdmVuIHRob3VnaCBvdmVyIHRoZSB5ZWFycyB3ZeKAmXZlIGhhZCByZWxhdGl2ZWx5IGZldyBj b21wbGFpbnRzIGFib3V0DQogIE1lcmxpbuKAmXMgcGVyZm9ybWFuY2UsIGluIHNvbWUgY29udGV4 dHMgKG5vdGFibHkgdmVyeSBsYXJnZSAvZmlsZXMvKSwNCiAgTWVybGlu4oCZcyBtZWNoYW5pc20g KGBwYXJzaW5nIGZpbGUnICh3aXRoIHJlY292ZXJ5KSAtPiBgdHlwaW5nIGZpbGUnDQogICh3aXRo IHJlY292ZXJ5KSAtPiBgcGVyZm9ybWluZyBhbmFseXNpcycpIGNvdWxkIHNvbWV0aW1lcyBjYXVz ZQ0KICBzbG93ZG93bnMhDQoNCiAgVG8gYWRkcmVzcyB0aGVzZSBzbG93ZG93bnMsIHdlIHN0YXJ0 ZWQgYW4gZXhwZXJpbWVudGFsIGJyYW5jaCB0aGF0DQogIHVzZXMgW2RvbWFpbnNdIGFuZCBbZWZm ZWN0c10sIHdoaWNoIGFsbG93IHVzICp0byBpbnRlcnJ1cHQgdGhlIHR5cGluZw0KICBwcm9jZXNz IGF0IHRoZSByaWdodCBtb21lbnQqIHdoZW4gYW4gYW5hbHlzaXMgcmVxdWVzdCBjb21lcyBpbi4N Cg0KICBJbiBwcmFjdGljZSwgbGV04oCZcyBzYXkgeW91IHJ1biBhbiBhbmFseXNpcyBjb21tYW5k IG9uIGEgdmVyeSBsYXJnZQ0KICBmaWxlOiAqdGhlIHR5cGUtY2hlY2tlciB3aWxsIHByb2dyZXNz IHVwIHRvIHRoZSBsb2NhdGlvbiB0aGF0IG1ha2VzDQogIHRoZSBhbmFseXNpcyBwb3NzaWJsZSwg cnVuIHRoZSBhbmFseXNpcyBwaGFzZSwgcmV0dXJuIHRoZSByZXN1bHQsIGFuZA0KICB0aGVuIGNv bnRpbnVlIHR5cGluZyB0aGUgZmlsZSouIFRoaXMgc2VwYXJhdGlvbiBpcyBwb3NzaWJsZSB0aGFu a3MgdG8NCiAgY29udHJvbCBmbG93IG1hbmFnZW1lbnQgZW5hYmxlZCBieSBlZmZlY3RzLCBhbmQg YnkgaGF2aW5nIHR3byBkb21haW5zDQogIGludGVyYWN0IHdpdGggZWFjaCBvdGhlci4NCg0KICBJ biBwcmFjdGljZSwgdGhpcyBtYWtlcyB0aGUgYW5hbHlzaXMgcGhhc2VzIG11Y2ggbW9yZSBlZmZp Y2llbnQhIFdlDQogIHRoaW5rIHRoaXMgaXMgYSBncmVhdCBleGFtcGxlIG9mIG1pZ3JhdGluZyBh IHJlZ3VsYXIgT0NhbWwgYXBwbGljYXRpb24NCiAgdG8gb25lIHRoYXQgdGFrZXMgYWR2YW50YWdl IG9mIG11bHRpY29yZS4gRm9yIGEgbW9yZSB0ZWNobmljYWwNCiAgZXhwbGFuYXRpb24gb2YgKmhv dyB0aGlzIGV4cGVyaW1lbnRhbCBicmFuY2ggd29ya3MgaW50ZXJuYWxseSosIEBwaXRhZw0KICBh bmQgQEx5cm0gd2lsbCB0YWxrIGFib3V0IGl0IGF0IFtMYW1iZGEgV29ybGRdLCBpbiB0aGVpciB0 YWxrIFtXaGVuDQogIG1hZ2ljIG1lZXRzIG11bHRpY29yZSAtIE9DYW1sIGFuZCBpdHMgZWxlZ2Fu dCBlcmEgb2YgcGFyYWxsZWxpc21dLg0KDQogIEN1cnJlbnRseSwgdGhlIGJyYW5jaCBpcyBzdGls bCBpbiBpdHMgaW5jdWJhdGlvbiBwaGFzZSwgYW5kICp3ZeKAmWQgYmUNCiAgZGVsaWdodGVkIHRv IGdldCB5b3VyIGZlZWRiYWNrKiENCg0KDQpbTWVybGluIERvbWFpbnNdIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvbWVybGluL3RyZWUvbWVybGluLWRvbWFpbnM+DQoNCltNZXJsaW5dIDxodHRw czovL29jYW1sLmdpdGh1Yi5pby9tZXJsaW4vPg0KDQpbT0NhbWwgTFNQIFNlcnZlcl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC1sc3A+DQoNCltPQ2FtbCBQbGF0Zm9ybSBleHRlbnNp b25dDQo8aHR0cHM6Ly9tYXJrZXRwbGFjZS52aXN1YWxzdHVkaW8uY29tL2l0ZW1zP2l0ZW1OYW1l PW9jYW1sbGFicy5vY2FtbC1wbGF0Zm9ybT4NCg0KW29jYW1sLWVnbG90XSA8aHR0cHM6Ly9naXRo dWIuY29tL3RhcmlkZXMvb2NhbWwtZWdsb3Q+DQoNCltkb21haW5zXSA8aHR0cHM6Ly9vY2FtbC5v cmcvbWFudWFsLzUuMi9hcGkvRG9tYWluLmh0bWw+DQoNCltlZmZlY3RzXSA8aHR0cHM6Ly9vY2Ft bC5vcmcvbWFudWFsLzUuMy9lZmZlY3RzLmh0bWw+DQoNCltMYW1iZGEgV29ybGRdIDxodHRwczov L2xhbWJkYS53b3JsZC8+DQoNCltXaGVuIG1hZ2ljIG1lZXRzIG11bHRpY29yZSAtIE9DYW1sIGFu ZCBpdHMgZWxlZ2FudCBlcmEgb2YgcGFyYWxsZWxpc21dDQo8aHR0cHM6Ly9sYW1iZGEud29ybGQv c3BlYWtlcnMvP3NwZWFrZXI9U29uamElMjBIZWluemU+DQoNCkhvdyB0byB0ZXN0IHRoZSBicmFu Y2gNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjA0KDQogIFRvIGF2b2lkIGluc3RhbGxpbmcgdGhpcyB2ZXJzaW9uIG9mIGBt ZXJsaW4nIHVuaW50ZW50aW9uYWxseSwgd2UNCiAgc3VnZ2VzdCAvcGlubmluZy8gdGhpcyBicmFu Y2ggaW4gdGhlIHN3aXRjaGVzIHdoZXJlIHlvdSB3YW50IHRvDQogIGV4cGVyaW1lbnQgd2l0aCB0 aGlzIG5ldyB2ZXJzaW9uIChjb21wYXRpYmxlIHdpdGggTWVybGlu4oCZcyBgbWFpbicpOg0KDQog IOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSBwaW4gYWRkIGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9tZXJsaW4jbWVybGluLWRvbWFpbnMNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgQWx0aG91 Z2ggdGhpcyBleHBlcmltZW50YWwgYnJhbmNoIHBhc3NlcyB0aGUgL3Rlc3Qtc3VpdGUvLCAqeW91 cg0KICBmZWVkYmFjayBpcyB2ZXJ5IGltcG9ydGFudCogdG8gaGVscCBjb2xsZWN0IHBvdGVudGlh bCBidWdzIHdlIG1heSBoYXZlDQogIG1pc3NlZC4gIFdl4oCZdmUgYWRkZWQgYSBgQnVnL01lcmxp bi1kb21haW5zJyBsYWJlbCB0byBvcmdhbml6ZSB0aWNrZXRzDQogIHJlbGF0ZWQgdG8gdGhpcyBl eHBlcmltZW50YWwgYnJhbmNoLg0KDQoNCk5leHQgc3RlcHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIEluIHRoZSBmdXR1cmUsIHRoZSBnb2FsIG9mIHRoaXMgYnJhbmNoICh3 aGljaCB3aWxsIGJlIHJlZ3VsYXJseQ0KICByZWJhc2VkIG9uIGBtYWluJykgaXMgdG8gKmJlY29t ZSB0aGUgbWFpbiBicmFuY2gqLCBzbyB0aGF0IGFsbCB1c2Vycw0KICBjYW4gYmVuZWZpdCBmcm9t IHRoZXNlIGltcHJvdmVtZW50cy4gIEF0IHRoZSBzYW1lIHRpbWUsIHRoZSByZXN0IG9mDQogIHRo ZSBlY29zeXN0ZW0gZGVwZW5kaW5nIG9uIE1lcmxpbiAoc3VjaCBhcyB0aGUgKk9DYW1sIExTUCBT ZXJ2ZXIqKQ0KICB3aWxsIGJlIGFkYXB0ZWQgdG8gYWxzbyB0YWtlIGZ1bGwgYWR2YW50YWdlIG9m IHRoZXNlIG5ldyBmZWF0dXJlcyENCg0KDQogIC9IYXBweSBIYWNraW5nIS8gVGhlIE1lcmxpbiBU ZWFtIDptYW5fbWFnZToNCg0KDQpQcHhfcmFwcGVyIHN1cHBvcnQsIENhcXRpIDIuMCBwb3J0DQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3BweC1yYXBwZXItc3VwcG9ydC1jYXF0 aS0yLTAtcG9ydC8xNzE5NC8zPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIENodWt3dW1h IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSByZWNlbnRseSBpbXBsZW1lbnRlZCBhIGRh dGFiYXNlIGNvbm5lY3Rpb24gdXNpbmcgY2FxdGkgbGFzdCAyIHdlZWtzDQogIGFuZCB3cm90ZSBh IGJsb2cgYWJvdXQgaXQuICBIZXJlIGl0IGlzLA0KICA8aHR0cHM6Ly9mZWFyZnVsLW9kZHMucm9j a3MvYmxvZy9wb3N0Z3Jlcy1jYXF0aS1wb29saW5nLW9jYW1sLTIwMjUvPg0KDQogIEkgd291bGQg bGlrZSB0byBsaXN0ZW4gdG8geW91ciBmZWVkYmFjayBvciBjb21tZW50cyByZWdhcmRpbmcgbXkN CiAgYXBwcm9hY2guICBDaGVlcnMNCg0KDQpPdXRyZWFjaHkgRGVtbyBEYXkgQXVndXN0IDIwMjUN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3V0cmVhY2h5LWRlbW8tZGF5LWF1Z3VzdC0yMDI1LzE3 MTY3Lzc+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgUGF0cmljayBGZXJyaXMgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGb3IgdGhvc2UgdGhhdCBj b3VsZCBub3Qgam9pbiB1cyBsaXZlLCB0aGUgcHJlc2VudGF0aW9ucyBbaGF2ZSBub3cNCiAgYmVl biB1cGxvYWRlZCB0byB3YXRjaC5vY2FtbC5vcmddIOKAkyB0aGFuayB5b3UgZXZlcnlvbmUgd2hv IGF0dGVuZGVkDQogIGFuZCBjb25ncmF0dWxhdGlvbnMgb25jZSBhZ2FpbiB0byBvdXIgZmFudGFz dGljIE91dHJlYWNoeSBpbnRlcm5zDQogIEBwYXdhc2thci1zaHJleWEgYW5kIEBrZW1zZ3V5Nywg YW5kIGEgYmlnIHRoYW5rcyB0byBvdXIgbWVudG9ycw0KICBAZ3JpZGJ1Z3MgYW5kIFtNaWNoYWVs IERhbGVzXSA6dHdvX2h1bXBfY2FtZWw6ICENCg0KDQpbaGF2ZSBub3cgYmVlbiB1cGxvYWRlZCB0 byB3YXRjaC5vY2FtbC5vcmddDQo8aHR0cHM6Ly93YXRjaC5vY2FtbC5vcmcvdy9rWkpSRk02aXc5 dWc5QkxOakVnS2VIPg0KDQpbTWljaGFlbCBEYWxlc10gPGh0dHBzOi8vZGlnaXRhbGZsYXBqYWNr LmNvbS8+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1VwY29taW5nIE9DYW1sIEV2 ZW50c10NCiAg4oCiIFtHZW9UZXNzZXJhIFB5dGhvbiBsaWJyYXJ5IHJlbGVhc2VkIGZvciBnZW9z cGF0aWFsIGVtYmVkZGluZ3NdDQogIOKAoiBbTW9zYWljIFRlcm1pbmFsIFVzZXIgSW50ZXJmYWNl XQ0KICDigKIgW0J1aWxkaW5nIERhdGFiYXNlIExheWVyIGluIE9DYW1sOiBGcm9tIFVVSUQgdjcg dG8gU3RhbmRhcmRpemVkDQogICAgRXJyb3IgSGFuZGxpbmddDQogIOKAoiBbUnVzdCBmb3IgRXZl cnlvbmUhXQ0KICDigKIgW1VzaW5nIG9jYW1sLWxzcC1zZXJ2ZXIgdmlhIGFuIE1DUCBzZXJ2ZXJd DQogIOKAoiBbVGVybWluYWwgR1VJIGZvciBvY2x1c3RlciBtb25pdG9yaW5nXQ0KICDigKIgW01v ZGVybiBQb3N0Z3JlU1FMIENvbm5lY3Rpb24gUG9vbGluZyBpbiBPQ2FtbCAoMjAyNSk6IENhcXRp ICsgRHJlYW0NCiAgICArIEx3dF0NCiAg4oCiIFtBIFpGUyBTY2FsaW5nIEFkdmVudHVyZV0NCiAg 4oCiIFtMYWJlbCBNYWtlciBpbiBqc19vZl9vY2FtbCB1c2luZyBDbGF1ZGVdDQoNCg0KW3RoZSBv Y2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Jsb2cvPg0KDQpbVXBjb21pbmcgT0Nh bWwgRXZlbnRzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZXZlbnRzPg0KDQpbR2VvVGVzc2VyYSBQeXRo b24gbGlicmFyeSByZWxlYXNlZCBmb3IgZ2Vvc3BhdGlhbCBlbWJlZGRpbmdzXQ0KPGh0dHBzOi8v YW5pbC5yZWNvaWwub3JnL25vdGVzL2dlb3Rlc3NlcmEtcHl0aG9uPg0KDQpbTW9zYWljIFRlcm1p bmFsIFVzZXIgSW50ZXJmYWNlXQ0KPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMDgvMzEv bWxlc3MvPg0KDQpbQnVpbGRpbmcgRGF0YWJhc2UgTGF5ZXIgaW4gT0NhbWw6IEZyb20gVVVJRCB2 NyB0byBTdGFuZGFyZGl6ZWQgRXJyb3INCkhhbmRsaW5nXQ0KPGh0dHBzOi8vZmVhcmZ1bC1vZGRz LnJvY2tzL2Jsb2cvZGF0YWJhc2Utc2VydmljZS1sYXllci1zcHJpbnQ+DQoNCltSdXN0IGZvciBF dmVyeW9uZSFdDQo8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2gvUjBkUC1RUjV3UW8/dmVy c2lvbj0zPg0KDQpbVXNpbmcgb2NhbWwtbHNwLXNlcnZlciB2aWEgYW4gTUNQIHNlcnZlcl0NCjxo dHRwczovL2pvbi5yZWNvaWwub3JnL2Jsb2cvMjAyNS8wOC9vY2FtbC1sc3AtbWNwLmh0bWw+DQoN CltUZXJtaW5hbCBHVUkgZm9yIG9jbHVzdGVyIG1vbml0b3JpbmddDQo8aHR0cHM6Ly93d3cudHVu YnVyeS5vcmcvMjAyNS8wOC8yNC9vY2x1c3Rlci1tb25pdG9yLz4NCg0KW01vZGVybiBQb3N0Z3Jl U1FMIENvbm5lY3Rpb24gUG9vbGluZyBpbiBPQ2FtbCAoMjAyNSk6IENhcXRpICsgRHJlYW0gKw0K THd0XSA8aHR0cHM6Ly9mZWFyZnVsLW9kZHMucm9ja3MvYmxvZy9wb3N0Z3Jlcy1jYXF0aS1wb29s aW5nLW9jYW1sLTIwMjU+DQoNCltBIFpGUyBTY2FsaW5nIEFkdmVudHVyZV0NCjxodHRwczovL3d3 dy50dW5idXJ5Lm9yZy8yMDI1LzA4LzIzL3pmcy1zY2FsaW5nLz4NCg0KW0xhYmVsIE1ha2VyIGlu IGpzX29mX29jYW1sIHVzaW5nIENsYXVkZV0NCjxodHRwczovL3d3dy50dW5idXJ5Lm9yZy8yMDI1 LzA4LzIyL2xhYmVsLW1ha2VyLz4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZAN Cg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNz YWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3Ro ZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0K W3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y Zz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0K DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3lt cGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of August 26 to Septembe= r 02, 2025.

    mlfront-shell - reference implementation of a build system

    jbeckford announced

    I=E2=80=99ve made a reference implementation (=E2=80=9Cmlfront-shell=E2=80= =9D) of a build system that is mostly working but has zero (0) performance = work so far. Among the many existing build + package managers, the =E2=80= =9Cmlfront-shell=E2=80=9D tool sits closest to Nix. It works on Windows, ca= n download binary assets, is language-neutral with an easy-to-parse JSON bu= ild file.

    The reference implementation comes with a specification doc and a JSON sche= ma. Since I=E2=80=99ll eventually be integrating the build system features = into dk (my OCaml scripting tool), the docs live there. You=E2= =80=99ll find a Quick Start guide and a Comparison table (the opam and dune comparisons are pertinent):

    http= s://github.com/diskuv/dk/tree/1.0?tab=3Dreadme-ov-file#

    Huge thanks to the a la carte authors, and also to @hbr for fmlib_parse.

    Aside: Wow, another Windows-friendly build system post at h= ttps://discuss.ocaml.org/t/porting-my-toy-ocaml-build-system-to-windows/171= 85 !

    Links:

    An experimental branch of Merlin based on Domains and Effects<= /h2>

    Xavier Van de Woestyne announced

    The Merlin Team :man_mage: is very happy to announce an experimenta= l version of Merlin: Merlin Domains!

    As a reminder, Merlin is an= editor service that provides advanced IDE features for OCaml. It ca= n be used as a standalone binary or as a library, and is notably used by OCaml LSP Server. In other= words, if you are using the OCaml Platform extension w= ith Visual Studio Code, or ocaml-eglot with Emacs, you are already using Merlin under the ho= od.

    Even though over the years we=E2=80=99ve had relatively few complaints abou= t Merlin=E2=80=99s performance, in some contexts (notably very large fil= es), Merlin=E2=80=99s mechanism (parsing file (with recove= ry) -> typing file (with recovery) -> performing a= nalysis) could sometimes cause slowdowns!

    To address these slowdowns, we started an experimental branch that uses domains and effects, which allow u= s to interrupt the typing process at the right moment when an analys= is request comes in.

    In practice, let=E2=80=99s say you run an analysis command on a very large = file: the type-checker will progress up to the location that makes the a= nalysis possible, run the analysis phase, return the result, and then conti= nue typing the file. This separation is possible thanks to control flow= management enabled by effects, and by having two domains interact with eac= h other.

    In practice, this makes the analysis phases much more efficient! We think t= his is a great example of migrating a regular OCaml application to one that= takes advantage of multicore. For a more technical explanation of how t= his experimental branch works internally, @pitag and @Lyrm will talk a= bout it at Lambda World, in their tal= k When = magic meets multicore - OCaml and its elegant era of parallelism.

    Currently, the branch is still in its incubation phase, and we=E2=80=99d= be delighted to get your feedback!

    How to test the branch

    To avoid installing this version of merlin unintentionally, we= suggest pinning this branch in the switches where you want to exper= iment with this new version (compatible with Merlin=E2=80=99s main):

    opam pin add https://github.com/ocaml/merlin#merlin-domains
    

    Although this experimental branch passes the test-suite, your fee= dback is very important to help collect potential bugs we may have miss= ed. We=E2=80=99ve added a Bug/Merlin-domains label to organize tic= kets related to this experimental branch.

    Next steps

    In the future, the goal of this branch (which will be regularly rebased on = main) is to become the main branch, so that all users c= an benefit from these improvements. At the same time, the rest of the ecosystem depending on Merlin (such as th= e OCaml LSP Server) will be adapted to also take full advantage of t= hese new features!

    Happy Hacking! The Merlin Team :man_mage:

    Ppx_rapper support, Caqti 2.0 port

    Continuing this thread, Chukwuma announced

    I recently implemented a database connection using caqti last 2 weeks and w= rote a blog about it. Here it is, https://fearful-odds.rocks/blog/postgres-caqti-pooling-ocam= l-2025/

    I would like to listen to your feedback or comments regarding my approach. Cheers

    Outreachy Demo Day August 2025

    Continuing this thread, Patrick Ferris announced

    For those that could not join us live, the presentations have now been uploaded to watch.= ocaml.org – thank you everyone who attended and congratulations o= nce again to our fantastic Outreachy interns @pawaskar-shreya and @kemsguy7= , and a big thanks to our mentors @gridbugs and Michael Dales :two_hump_camel: !

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=cJMC7F3G; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=jEaaBbmC; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 50D0640083 for ; Tue, 9 Sep 2025 12:30:58 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=BdPjvM2yrI01y+y2xLrE70WS3xIn9zdb0bLU8GTSxtI=; b=cJMC7F3GLjeM7H83ilaH66/acpKysQyOeL29FVCL+SMNLXa1yzGrrz5N VqaUsiIep8QuPn8g0x1sPiE+g0khiwt+vwL5BhxGm2rnBk4S1LYbou+ZN apPb6CaPnWoLI90nRuoeADMv/jloECFJ7aM9z62DP1GEIhBGU6ajfuKdB I=; X-CSE-ConnectionGUID: vl+dMjgOQZajwTAhsV8DnQ== X-CSE-MsgGUID: dGfUA4kDS9WH5f+qKt0gFQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,251,1751234400"; d="scan'208,217";a="238216547" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Sep 2025 14:30:56 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 5D550E0171; Tue, 9 Sep 2025 14:30:56 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 5767AE0171 for ; Tue, 9 Sep 2025 14:30:50 +0200 (CEST) X-CSE-ConnectionGUID: IIR8QeMUQX6qFUgnu8BPRw== X-CSE-MsgGUID: J0xC7bIrTryua/sO3VIY0w== IronPort-SDR: 68c01df7_BWT0V09z6yBrhkRNdGphKZakjEuwhAO9tLUVDd0MxZcLPph zO+GtUHU60VmiqMoVqOPRYtVbEMrOJ8f0HJOjug== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HzAgAbHcBohSIeaIFaHgESCwEMg1BbKBkBaFozBwhJA?= =?us-ascii?q?4QWPINPjiKRTYhLgjCDFRYjFQEDAQ0uARsEAQIEAQEDAQIBhQACjC4CHwYBB?= =?us-ascii?q?DQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABAQEBQEmGF?= =?us-ascii?q?QEFBS8NgkUZOHFRFAk3AQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAgQIAQIKFwgWHTIOAQgKEwEBOBgjAxQBBgMCEQE1AwETA?= =?us-ascii?q?RIUBoJoAYIgAgJOAwUMBj+UIptMeoEygQGCDAEBBoEIPgMBAQIHAgICAQEOC?= =?us-ascii?q?SUB2gyBZAmBSYVsgkoaASpJawKER4Q8Jw+BVUSBSoFzSgdvgj8LFwEBAQEVA?= =?us-ascii?q?4EDIQEBCAk7AQmDJYJpgg0EFUQ+FB2BBjKCOYIogSFAghMEhgKCXIFbhxqBR?= =?us-ascii?q?EszLAFVExcLBwVbgQgDKjQxbjIdgSeFDYQdK0+FAoEXg1MRE2sPBoEVg12Ee?= =?us-ascii?q?0ADC209NxQblWsXKhlqF4E0AisIBgoBMwImBhAPFRoTAQkSDgEBCRkuAQMEB?= =?us-ascii?q?QMBDwsWChgBJgUJFQYBAgcHFAoJAgIEAQQCLZJGJBgqA3SOZY4Yk1kdbTQHh?= =?us-ascii?q?B+BXgYMiQiBJpYGhASBV4s8hwKSUiKYZCKCNoYngQAKgRwJB4Foa4xgiFQsB?= =?us-ascii?q?AQZhTiBfyOBKwEdDAczGjBDDQQCC4IVAQEyCQo8HA+LSIIBLwEOJxWBEgECg?= =?us-ascii?q?WtMEkF9gSaBdDu0PUE1AgEBDCwCBwEKAQEDCYViAQFpix8tBYFLAQE?= IronPort-PHdr: A9a23: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 IBzsPtXEU9Z1vpbnUsuKahqJu8XpIGY6le1 IronPort-Data: A9a23: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 RH0i0UD6I+5xIy9FVFYJcjlO368b57UMwz0sQ== IronPort-HdrOrdr: A9a23:oro0xqoi4ghatI1R9fhJOkcaV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:77q24W2vfwtajFZFVhTEgrxfO+EfIkTQ6UrpExGhJ1tmTqDFY2eq5/Yx X-Talos-MUID: 9a23:cWE9IQmZffepDyhm6QhfdnpAbNdDvK6PEnwXgIgP/NKjbhJRCm+C2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,251,1751234400"; d="scan'208,217";a="125046757" X-MGA-submission: =?us-ascii?q?MDF5HA6thgiLlX7N9zHi9PnywYv+m0JpPefZxn?= =?us-ascii?q?hA38SlYdTkinDoO4jceAUxr+6AvCBrPz+2eoS0MX+z3Fze2alEuZZ4+j?= =?us-ascii?q?cYCwhvYqL/Z6Eps1AysA1DzSvv45p+zsLJSBuuk7xEl0qgmp1nOKGg6l?= =?us-ascii?q?M67U/Jwd0XsI8J+SgH+LJ8DA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Sep 2025 14:30:48 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 211391A2D1; Tue, 9 Sep 2025 14:30:47 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1757421047; bh=aoCgRi7qqPNTffOKWoYgZ+5nsRMSBLZnW7yWz5w5sJ8=; h=From:To:Subject:Date:Message-ID; b=jEaaBbmCKlQ8hqs53DI2Y1ArXVtr1jiMgTbapXx6fdfj9rOInAlla0eJ93JtCfNww T5Nr697X5jej5a+fVJq0tor87Qa3QknChgP3Va44cZ7ZDS42MPWTrI6sgdws7oN3hM A6WH/r94ctrfKaZekMwth+zDF8OqyFdov1ZGks7I= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 09 Sep 2025 14:30:46 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 9 14:30:47 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.459522, queueID=40E0B1A736 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19375 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 02 to 09, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml Platform Newsletter: May to August 2025 ppx_format New release of Menhir (20250903) Chat plugin activated, and adding more site categories Outreachy Mentors Wanted Other OCaml News Old CWN OCaml Platform Newsletter: May to August 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Welcome to the fifteenth edition of the OCaml Platform newsletter! In this May to August 2025 edition, we are excited to bring you the latest on the OCaml Platform, continuing our tradition of highlighting recent developments as seen in [previous editions]. To understand the direction we're headed, especially regarding development workflows and user experience improvements, check out our [roadmap]. You can [subscribe to this newsletter on LinkedIn]! *Highlights:* =E2=80=A2 *Enhanced Editor Integration*: OCaml-LSP 1.23.0 and Merlin 5.5 provide improved project navigation and error reporting. New ocaml-eglot brings modern LSP support to Emacs users. Continued work on project-wide features brings OCaml's development experience closer to modern IDEs. =E2=80=A2 *Enhanced Package Management*: opam 2.4.0 stable release elimin= ates GNU patch/diff dependencies, improves newcomer experience by avoiding problematic system compilers by default, and provides better handling of deprecated packages. This addresses common setup issues that previously complicated OCaml adoption. =E2=80=A2 *Improved Testing Workflows*: Dune 3.20 introduces concurrent w= atch mode operations, named test aliases for running specific tests (`@runtest-testname'), and timeout support for cram tests. =E2=80=A2 *Documentation and Tooling Maturity*: Odoc 3.1.0 refines cross-package linking capabilities. =E2=80=A2 *OCaml 5.4.0-beta1:* you can help test upcoming compiler improvements! *Announcements:* =E2=80=A2 [Emacs Integration for OCaml LSP Server: Introducing ocaml-eglo= t] (August 26, 2025) =E2=80=A2 [Dune Developer Preview: Portable External Dependencies for Dune Package Management] (June 5, 2025) =E2=80=A2 [Dune Developer Preview: Portable Lock Directories for Dune Pac= kage Management] (May 19, 2025) *Stable Releases:* =E2=80=A2 [Dune 3.20.1] (August 26, 2025) =E2=80=A2 [Dune 3.20.0] (August 21, 2025) =E2=80=A2 [Utop 2.16.0] (July 25, 2025) =E2=80=A2 [opam 2.4.1] (July 23, 2025) =E2=80=A2 [opam 2.4.0] (July 18, 2025) =E2=80=A2 [Odoc 3.1.0] (July 15, 2025) =E2=80=A2 [Ppxlib 0.36.1] (July 10, 2025) =E2=80=A2 [OCaml-LSP 1.23.0] (June 24, 2025) =E2=80=A2 [Merlin 5.5-503] (June 24, 2025) =E2=80=A2 [OCaml-LSP 1.21.0-4.14 for OCaml 4.14] (June 23, 2025) =E2=80=A2 [Merlin 4.19-414] (June 23, 2025) =E2=80=A2 [Dune 3.19.1] (June 11, 2025) =E2=80=A2 [Dune 3.19.0] (May 23, 2025) *Unstable Releases:* =E2=80=A2 [Dune 3.20.0~alpha4] (August 12, 2025) =E2=80=A2 [Dune 3.20.0~alpha3] (August 6, 2025) =E2=80=A2 [Dune 3.20.0~alpha2] (August 5, 2025) =E2=80=A2 [Dune 3.20.0~alpha1] (July 30, 2025) =E2=80=A2 [Dune 3.20.0~alpha0] (July 28, 2025) =E2=80=A2 [OCaml 5.4.0-beta1] (July 22, 2025) =E2=80=A2 [opam 2.4.0~rc1] (July 4, 2025) =E2=80=A2 [opam 2.4.0~beta1] (June 19, 2025) =E2=80=A2 [OCaml 5.4.0-alpha1] (May 22, 2025) =E2=80=A2 [Dune 3.19.0~alpha0] (May 20, 2025) =E2=80=A2 [opam 2.4.0~alpha2] (May 5, 2025) [previous editions] [roadmap] [subscribe to this newsletter on LinkedIn] [Emacs Integration for OCaml LSP Server: Introducing ocaml-eglot] [Dune Developer Preview: Portable External Dependencies for Dune Package Management] [Dune Developer Preview: Portable Lock Directories for Dune Package Management] [Dune 3.20.1] [Dune 3.20.0] [Utop 2.16.0] [opam 2.4.1] [opam 2.4.0] [Odoc 3.1.0] [Ppxlib 0.36.1] [OCaml-LSP 1.23.0] [Merlin 5.5-503] [OCaml-LSP 1.21.0-4.14 for OCaml 4.14] [Merlin 4.19-414] [Dune 3.19.1] [Dune 3.19.0] [Dune 3.20.0~alpha4] [Dune 3.20.0~alpha3] [Dune 3.20.0~alpha2] [Dune 3.20.0~alpha1] [Dune 3.20.0~alpha0] [OCaml 5.4.0-beta1] [opam 2.4.0~rc1] [opam 2.4.0~beta1] [OCaml 5.4.0-alpha1] [Dune 3.19.0~alpha0] [opam 2.4.0~alpha2] Dune =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Roadmap*: [Develop / (W4) Build a Project] The release introduces the `dune describe location' command for printing the path to executables. `dune runtest' now understands absolute paths and can run tests in specific build contexts. Improvements to cram test handling fix issues where tests attached to multiple aliases would run multiple times. [Develop / (W4) Build a Project] =E2=97=8A Testing Workflow Improvements Dune 3.20 significantly improves testing workflows with named test aliases. Tests declared with `(test (name a))' can now be run individually using `dune build @runtest-a'. Inline test libraries produce aliases like `@runtest-name_of_lib', allowing targeted execution of specific test suites without running the entire test battery. The new `(timeout )' field for cram tests prevents runaway tests from blocking CI pipelines. Combined with the ability to run `dune promote' while watch mode is active, these features remove common friction points in test-driven development workflows. =E2=97=8A Performance and Watch Mode Enhancements Dune's watch mode now supports concurrent `dune exec' operations and file promotion without requiring restarts, maintaining development flow during iterative changes. The introduction of the 'empty' alias containing no targets provides more flexible build target management. New `--alias' and `--alias-rec' flags offer alternatives to the `@@' and `@' command-line syntax. Dune 3.20 switches from MD5 to BLAKE3 for digesting targets and rules, providing both performance improvements and better cryptographic properties. *Activities:* =E2=80=A2 Enhanced implicit transitive dependency handling for OCaml 5.2+ compatibility ([#11866]) =E2=80=A2 Improved alias system with new 'empty' alias support ([#11556], [#11952], [#11955], [#11956]) =E2=80=A2 Better integration between promotion workflows and watch mode ([#12010]) =E2=80=A2 Fixed cram test duplicate execution issues ([#11547]) =E2=80=A2 Added timeout support for cram tests ([#12041]) =E2=80=A2 Added `dune describe location' command ([#11905]) =E2=80=A2 Named test aliases for targeted test execution ([#11558], [#111= 09]) =E2=80=A2 BLAKE3 migration for improved performance ([#11735]) *Maintained by*: Rudi Grinberg (@rgrinberg, Jane Street), Nicol=C3=A1s Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, Tarides), Ali Caglayan (@Alizter), Etienne Millon (@emillon), Stephen Sherratt (@gridbugs, Tarides), Antonio Nuno Monteiro (@anmonteiro), Etienne Marais (@maiste, Tarides) [#11866] [#11556] [#11952] [#11955] [#11956] [#12010] [#11547] [#12041] [#11905] [#11558] [#11109] [#11735] =E2=97=8A Dune Package Management Portable lock directories appear as an experimental feature. This is a major prospective enhancement for teams working across different platforms. Lockfile naming in the experimental feature now includes version numbers (e.g., `ocaml-compiler.5.3.0.pkg' instead of `ocaml-compiler.pkg') to handle cases where different platforms require different package versions in the same project. The portable external dependencies feature extends this capability to system-level dependencies, ensuring consistent build environments across development, testing, and production systems. Combined with the existing binary cache system, this could reduce the complexity of managing OCaml projects in diverse environments. Note however, that the outcome of these experiments, and whether they mature into features on the stable version of Dune is still open. If you would like to help test and give feedback: run `dune pkg lock' and, if you encounter issues, please report them! At [dune.check.ci.dev], continuous monitoring shows ecosystem compatibility progress, with a large part of Dune-based packages in opam-repository now building successfully with Dune package management. *Activities:* =E2=80=A2 Enhanced ecosystem compatibility testing and monitoring at [dune.check.ci.dev] =E2=80=A2 ["Opam Health Check: or How we Got to 90+% of Packages Building= with Dune Package Management"] - detailed analysis of ecosystem compatibility progress [dune.check.ci.dev] ["Opam Health Check: or How we Got to 90+% of Packages Building with Dune Package Management"] =E2=97=8A Dune Developer Preview [Dune Developer Preview] continues to serve as an experimental channel for cutting-edge OCaml development features. The tooling includes built-in LSP support, formatting capabilities, and a shared cache that improves build performance. The team has expanded testing beyond initial projects to include broader ecosystem validation. The binary repository provides static Linux binaries (built with musl) that work across distributions, along with native binaries for macOS on both x86_64 and aarch64 architectures. *Activities:* =E2=80=A2 Enhanced LSP integration through automated tool management =E2=80=A2 Expanded ecosystem compatibility testing as documented in the [= Opam Health Check blog post] [Dune Developer Preview] [Opam Health Check blog post] Package Management =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=97=8A Opam The stable release of opam 2.4.0 represents a significant improvement in cross-platform reliability and user experience. The elimination of GNU `patch' and `diff' as runtime dependencies removes a major source of configuration issues that previously complicated deployment and CI/CD pipelines. The package manager now uses the native OCaml `patch' library instead. The default compiler selection during `opam init' no longer uses `ocaml-system', which was a common source of setup problems across different development environments. This change provides a more consistent onboarding experience for newcomers to OCaml. Package lifecycle management receives clearer visibility through enhanced handling of deprecated packages. The `opam show' command displays deprecated packages in gray, while `opam upgrade' removes confusing "not up-to-date" messages for packages being phased out. Development workflows benefit from the new `OPAMSOLVERTOLERANCE' environment variable, which addresses persistent solver timeout issues. The enhanced pinning system now displays current revisions of pinned repositories, providing better transparency in development workflows that rely on unreleased versions. For Windows users, the prebuilt binaries now include Cygwin's setup executable as a fallback when cygwin.com is inaccessible, improving reliability in restricted network environments. *Notable Activity:* =E2=80=A2 [opam 2.4.0 stable release] with comprehensive improvements =E2=80=A2 Use `patch' OCaml library instead of the `patch' command ([#589= 2]) =E2=80=A2 UX improvements: remove `ocaml-system' from default compiler at= init ([#6307]) =E2=80=A2 Provide a way to avoid solver timeouts ([#5510]) =E2=80=A2 Add `opam lock --keep-local' ([#6411]) *Maintained by*: Raja Boujbel (@rjbou, OCamlPro), Kate Deplaix (@kit-ty-kate, Ahrefs), David Allsopp (@dra27, Tarides) [opam 2.4.0 stable release] [#5892] [#6307] [#5510] [#6411] Editor Tools =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C *Roadmap*: [Edit / (W19) Navigate Code], [Edit / (W20) Refactor Code] [Edit / (W19) Navigate Code] [Edit / (W20) Refactor Code] =E2=97=8A OCaml LSP Server and Merlin The release of OCaml-LSP 1.23.0 and Merlin 5.5 brings enhanced project navigation and error reporting capabilities. The release addresses several long-standing issues with jump-to-definition, occurrences reporting, and inlay hints while adding new utilities for working with typed holes. Project-wide features continue to evolve, with cross-project symbol search and refactoring capabilities bringing OCaml's editor support in line with other modern programming languages. The features work by building an index with `dune build @build-index -w' and provide comprehensive symbol searching across entire codebases. By the way: we are currently working on a refactor feature that enables automatically extracting and inlining function parameters! Support for OCaml 4.14 continues with dedicated releases (OCaml-LSP 1.21.0-4.14 and Merlin 4.19-414). *Activities:* =E2=80=A2 Enhanced project navigation and symbol search capabilities =E2=80=A2 Better integration with Dune package management workflows =E2=80=A2 ["Internship Report: Refactoring Tools Coming to Merlin"] - new extract command for refactoring *Notable Activity:* =E2=80=A2 Release of [OCaml-LSP 1.23.0] =E2=80=A2 Release of [Merlin 5.5-503] =E2=80=A2 OCaml 4.14 support with [OCaml-LSP 1.21.0-4.14] and [Merlin 4.19-414] *OCaml LSP Server maintained by*: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane Street) *Merlin maintained by*: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier Van de Woestyne (@xvw, Tarides) ["Internship Report: Refactoring Tools Coming to Merlin"] [OCaml-LSP 1.23.0] [Merlin 5.5-503] [OCaml-LSP 1.21.0-4.14] [Merlin 4.19-414] =E2=97=8A Emacs Integration The introduction of ocaml-eglot provides Emacs users with modern LSP-based OCaml support as an alternative to the traditional merlin.el. This package leverages Emacs 29's built-in eglot LSP client, offering simplified configuration and access to project-wide features previously unavailable in Emacs. ocaml-eglot provides feature parity with other editors through ocaml-lsp-server, including project-wide search and rename capabilities. For users migrating from merlin.el, existing keybindings work immediately. The package is actively maintained, while merlin.el enters maintenance-only mode. The integration works with any OCaml major mode (tuareg, caml-mode, or neocaml) and provides error navigation, type information display, code generation through the "destruct" feature, and enhanced navigation between language constructs. *Notable Activity:* =E2=80=A2 [ocaml-eglot 1.0.0 release] bringing LSP to Emacs =E2=80=A2 Subsequent releases 1.1.0 and 1.2.0 adding flycheck support and Emacs 30.1 compatibility =E2=80=A2 Active development replacing maintenance-only merlin.el [ocaml-eglot 1.0.0 release] =E2=97=8A Visual Studio Code Plugin We're happy to announce that the Visual Studio Code editor plugin now integrates seamlessly with Dune package management! This is an important milestone for [Dune package management], and if you haven't tried it, or have been waiting for it to mature, now is a great time to get started! Development continues on improving the OCaml VSCode editor plugin experience. For example, when using opam to manage your project's dependencies and `ocaml-lsp-server' is not found in the opam switch, the plugin will now prompt users to install it. *Notable Activity:* =E2=80=A2 Automatically installing/updating ocaml-lsp-server ([#1725]) =E2=80=A2 Automatically configuring dune package management ([#1791]) [Dune package management] [#1725] [#1791] Documentation Tools =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C *Roadmap*: [Share / (W25) Generate Documentation] [Share / (W25) Generate Documentation] =E2=97=8A Odoc Odoc 3.1.0 continues to refine the modern documentation experience introduced with Odoc 3.0. The cross-package linking system and multimedia support capabilities help teams create comprehensive and discoverable documentation for complex systems. The improved documentation tooling addresses ecosystem discoverability and maintainability. The ability to generate interconnected documentation across multiple packages makes large OCaml codebases more accessible for new team members and external collaborators. Work continues on integrating Odoc 3.x with the OCaml.org documentation pipeline to provide a unified documentation experience across the ecosystem. As of July 2025, Odoc 3 is now live on OCaml.org, bringing the new features to the entire package ecosystem. The improved pipeline addresses dependency complexities by using new tooling that archives and restores opam packages, eliminating redundant builds that previously occurred thousands of times. *Notable Activity:* =E2=80=A2 [Release of Odoc 3.1.0] =E2=80=A2 ["Odoc 3 is now live on OCaml.org!"] - Jon Ludlam's blog post a= bout the deployment of Odoc 3 to ocaml.org =E2=80=A2 ["Odoc 3: So what?"] - in-depth explanation of Odoc 3's manual-focused features =E2=80=A2 Continued work on OCaml.org documentation pipeline integration through new package archiving tools *Maintained by*: Jon Ludlam (@jonludlam, Tarides), Daniel B=C3=BCnzli (@dbuenzli), Jules Aguillon (@julow, Tarides), Paul-Elliot Angl=C3=A8s d'Auriac (@panglesd, Tarides), Emile Trotignon (@EmileTrotignon, Tarides, then Ahrefs) [Release of Odoc 3.1.0] ["Odoc 3 is now live on OCaml.org!"] ["Odoc 3: So what?"] Ppxlib =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Ppxlib 0.36.1 refines the improvements introduced in version 0.36.0, which updated the internal AST to target OCaml 5.2. This enables ppx authors to leverage features from OCaml 5.2 while maintaining compatibility with OCaml 4.08.0 and newer. The update includes changes to the representation of functions, and package authors are encouraged to consult [the upgrade guide] as some ppxes may require updates. *Notable Activity:* =E2=80=A2 [Release of Ppxlib 0.36.1] =E2=80=A2 Enhanced support for OCaml 5.2 AST features and compatibility improvements *Maintained by*: Patrick Ferris ([@patricoferris]) [the upgrade guide] [Release of Ppxlib 0.36.1] [@patricoferris] OCaml 5.4.0 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C OCaml 5.4.0-beta1 provides early access to upcoming compiler improvements and serves as a validation point for the ecosystem. The beta release allows forward-looking projects to begin testing compatibility with the new version while the broader ecosystem prepares for the eventual stable release. The continued parallel maintenance of OCaml 4.14 LTS ensures that projects with longer upgrade cycles maintain access to critical updates without forced compiler upgrades. This dual-track approach provides flexibility for organizations with different risk tolerance levels. *Notable Activity:* =E2=80=A2 [OCaml 5.4.0-beta1 release] for early testing =E2=80=A2 [OCaml 5.4.0-alpha1] provided initial preview =E2=80=A2 Continued LTS support for OCaml 4.14 users [OCaml 5.4.0-beta1 release] [OCaml 5.4.0-alpha1] Utop =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Utop 2.16.0 adds OCaml 5.4 support, restores backtrace functionality, improves preprocessor and Emacs integration, and relocates configuration files to a dedicated utop subdirectory. *Notable Activity:* =E2=80=A2 [Release of Utop 2.16.0] We are seeing continued progress toward making OCaml development more accessible and productive. The maturation of Dune package management, stability improvements in opam 2.4.0, and enhanced editor support provide a solid foundation for teams adopting OCaml or expanding their existing OCaml usage. [Release of Utop 2.16.0] ppx_format =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Emile Trotignon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I happy to announce the first release of [ppx_format]. Its a small ppx rewriter that was first written at the mirage retreat in 24 with @PizieDust, and that allows to put values in the middle of format strings: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let s =3D "World" =E2=94=82 let x =3D 123 =E2=94=82 let () =3D Format.printf {%i|Hello {%s s} {%a Format.pp_print_c= har % Char.chr 65} {%d x}%!|} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Its compatible with any function that takes format strings. The only constraint is that the format string has to be the last argument. I have used at in some of my projects, and it will be available on opam as soon as the release PR is merged. [ppx_format] New release of Menhir (20250903) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 It is my pleasure to announce a new release of Menhir. The main change is improved parser construction time in `--table' mode. =E2=80=A2 The table back-end uses a new table compression algorithm. This algorithm is significantly faster than the previous algorithm: in our tests, it can be up to 8 times faster. This results in observably faster compilation: for example, the time required to compile the OCaml parser drops from 1.2 seconds to 0.6 seconds. Compared with the previous algorithm, the new algorithm produces results of roughly similar quality: the size of the compressed tables can increase or decrease by a few percent, up to 20% in the most dramatic cases. On average, we observe a 1% increase in size. The use of the previous algorithm can be requested by the command line switch `--pack-classic'. This command line switch may disappear in the future. (Contributed by Fr=C3=A9d=C3=A9ric Bour; reviewed by Fran=C3=A7ois Pott= ier.) To install this release, please type: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update && opam install menhir.20250903 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Happy parsing, Fran=C3=A7ois. Chat plugin activated, and adding more site categories =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Anil Madhavapeddy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Following the discussion in , I=E2=80=99ve activated the chat functionality on this site, with one new channel ( ). Join in and experiment with it, and give feedback on this thread! We=E2=80=99ve also not refreshed the site categories here for some time. = Back in about 2019, we experimented with a private maintainers category, but others are possible: =E2=80=A2 Discourse has RSS/Atom auto-posting support. We can add the to this, which seems like a good place to make that more visible. I propose a new category =E2=80=9CChangeLog= =E2=80=9D for this (other names welcome). =E2=80=A2 I=E2=80=99m also knocking up a script to do weekly reports from= the opam repository, which was originally for my own use, but I could make this public. Would others be interested in a weekly digest post here about =E2=80=9Cnew and updated packages=E2=80=9D? =E2=80=A2 Any other categories you=E2=80=99d like to see? I can=E2=80=99t= see an easy way to bridge GitHub discussions with this forum, unfortunately, but please do poke around the Discourse docs and see if you can find something. Outreachy Mentors Wanted =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Patrick Ferris announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm excited to share that the OCaml community has secured funding for the next round of Outreachy. Thanks to [Jane Street] and [Tarides], we have funding for 3 mentees in the next cohort of Outreachy internships alongside 3/4 mentors. *We are actively seeking mentors and projects for the OCaml community*. If you haven't already, please do read our previous post about becoming an Outreachy mentor: . If you have any questions please reach out to me directly or here on this thread. To sign up, [please use this link to the Outreachy signup page]. If you would like to co-mentor (i.e. support a project but not lead that project), let people know by commenting on this thread. Thanks! [Jane Street] [Tarides] [please use this link to the Outreachy signup page] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Giving hub.cl an upgrade] =E2=80=A2 [Outreachy May 2025 Demo Day] =E2=80=A2 [OCaml Weekly 2025 w32 to w35] [the ocaml.org blog] [Upcoming OCaml Events] [Giving hub.cl an upgrade] [Outreachy May 2025 Demo Day] [OCaml Weekly 2025 w32 to w35] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 02 to 09, 2= 025.

    OCaml Platform Newsletter: May to August 2025

    Sabine Schmaltz announced

    Welcome to the fifteenth edition of the OCaml Platform newsletter!

    In this May to August 2025 edition, we are excited to bring you the latest = on the OCaml Platform, continuing our tradition of highlighting recent deve= lopments as seen in previous editions. To understand the direction we're headed, esp= ecially regarding development workflows and user experience improvements, c= heck out our roadmap.

    You can subscribe to this newsletter on LinkedIn!

    Highlights:

    • Enhanced Editor Integration: OCaml-LSP 1.23.0 and Merlin 5.5 pro= vide improved project navigation and error reporting. New ocaml-eglot bring= s modern LSP support to Emacs users. Continued work on project-wide feature= s brings OCaml's development experience closer to modern IDEs.
    • Enhanced Package Management: opam 2.4.0 stable release eliminate= s GNU patch/diff dependencies, improves newcomer experience by avoiding pro= blematic system compilers by default, and provides better handling of depre= cated packages. This addresses common setup issues that previously complica= ted OCaml adoption.
    • Improved Testing Workflows: Dune 3.20 introduces concurrent watc= h mode operations, named test aliases for running specific tests (@ru= ntest-testname), and timeout support for cram tests.
    • Documentation and Tooling Maturity: Odoc 3.1.0 refines cross-pac= kage linking capabilities.
    • OCaml 5.4.0-beta1: you can help test upcoming compiler improveme= nts!

    Announcements:

    Stable Releases:

    Unstable Releases:

    Dune

    Roadmap: Develop / (W4) Build a Project

    The release introduces the dune describe location command for = printing the path to executables.

    dune runtest now understands absolute paths and can run tests = in specific build contexts. Improvements to cram test handling fix issues w= here tests attached to multiple aliases would run multiple times.

    • Testing Workflow Improvements

      Dune 3.20 significantly improves testing workflows with named test aliases.= Tests declared with (test (name a)) can now be run individual= ly using dune build @runtest-a. Inline test libraries produce = aliases like @runtest-name_of_lib, allowing targeted execution= of specific test suites without running the entire test battery.

      The new (timeout <float>) field for cram tests prevents = runaway tests from blocking CI pipelines. Combined with the ability to run = dune promote while watch mode is active, these features remove= common friction points in test-driven development workflows.

    • Performance and Watch Mode Enhancements

      Dune's watch mode now supports concurrent dune exec operations= and file promotion without requiring restarts, maintaining development flo= w during iterative changes.

      The introduction of the 'empty' alias containing no targets provides more f= lexible build target management. New --alias and --alias= -rec flags offer alternatives to the @@ and @ command-line syntax.

      Dune 3.20 switches from MD5 to BLAKE3 for digesting targets and rules, prov= iding both performance improvements and better cryptographic properties.

      Activities:

      • Enhanced implicit transitive dependency handling for OCaml 5.2+ compati= bility (#11866)
      • Improved alias system with new 'empty' alias support (#11556, #11952, #11955, #11956)
      • Better integration between promotion workflows and watch mode (#12010)
      • Fixed cram test duplicate execution issues (#11547)
      • Added timeout support for cram tests (#12041)
      • Added dune describe location command (#11905)
      • Named test aliases for targeted test execution (#11558, #11109)
      • BLAKE3 migration for improved performance (#11735)

      Maintained by: Rudi Grinberg (@rgrinberg, Jane Street), Nicol=C3=A1s= Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, Tarides)= , Ali Caglayan (@Alizter), Etienne Millon (@emillon), Stephen Sherratt (@gr= idbugs, Tarides), Antonio Nuno Monteiro (@anmonteiro), Etienne Marais (@mai= ste, Tarides)

    • Dune Package Management

      Portable lock directories appear as an experimental feature. This is a majo= r prospective enhancement for teams working across different platforms. Loc= kfile naming in the experimental feature now includes version numbers (e.g.= , ocaml-compiler.5.3.0.pkg instead of ocaml-compiler.pkg= ) to handle cases where different platforms require different packag= e versions in the same project.

      The portable external dependencies feature extends this capability to syste= m-level dependencies, ensuring consistent build environments across develop= ment, testing, and production systems. Combined with the existing binary ca= che system, this could reduce the complexity of managing OCaml projects in = diverse environments.

      Note however, that the outcome of these experiments, and whether they matur= e into features on the stable version of Dune is still open. If you would l= ike to help test and give feedback: run dune pkg lock and, if = you encounter issues, please report them!

      At dune.check.ci.dev, continuous = monitoring shows ecosystem compatibility progress, with a large part of Dun= e-based packages in opam-repository now building successfully with Dune pac= kage management.

      Activities:

    • Dune Developer Preview

      Dune Developer Preview continues t= o serve as an experimental channel for cutting-edge OCaml development featu= res. The tooling includes built-in LSP support, formatting capabilities, an= d a shared cache that improves build performance.

      The team has expanded testing beyond initial projects to include broader ec= osystem validation. The binary repository provides static Linux binaries (b= uilt with musl) that work across distributions, along with native binaries = for macOS on both x86_64 and aarch64 architectures.

      Activities:

      • Enhanced LSP integration through automated tool management
      • Expanded ecosystem compatibility testing as documented in the Opam Health Check blo= g post

    Package Management

    • Opam

      The stable release of opam 2.4.0 represents a significant improvement in cr= oss-platform reliability and user experience. The elimination of GNU = patch and diff as runtime dependencies removes a major = source of configuration issues that previously complicated deployment and C= I/CD pipelines. The package manager now uses the native OCaml patch library instead.

      The default compiler selection during opam init no longer uses= ocaml-system, which was a common source of setup problems acr= oss different development environments. This change provides a more consist= ent onboarding experience for newcomers to OCaml.

      Package lifecycle management receives clearer visibility through enhanced h= andling of deprecated packages. The opam show command displays= deprecated packages in gray, while opam upgrade removes confu= sing "not up-to-date" messages for packages being phased out.

      Development workflows benefit from the new OPAMSOLVERTOLERANCE= environment variable, which addresses persistent solver timeout issues. Th= e enhanced pinning system now displays current revisions of pinned reposito= ries, providing better transparency in development workflows that rely on u= nreleased versions.

      For Windows users, the prebuilt binaries now include Cygwin's setup executa= ble as a fallback when cygwin.com is inaccessible, improving reliability in= restricted network environments.

      Notable Activity:

      • opam 2.4.0 stable r= elease with comprehensive improvements
      • Use patch OCaml library instead of the patch = command (#5892)
      • UX improvements: remove ocaml-system from default compiler= at init (#6307)
      • Provide a way to avoid solver timeouts (#5510)
      • Add opam lock <pkg> --keep-local (#6411)

      Maintained by: Raja Boujbel (@rjbou, OCamlPro), Kate Deplaix (@kit-t= y-kate, Ahrefs), David Allsopp (@dra27, Tarides)

    Editor Tools

    • OCaml LSP Server and Merlin

      The release of OCaml-LSP 1.23.0 and Merlin 5.5 brings enhanced project navi= gation and error reporting capabilities. The release addresses several long= -standing issues with jump-to-definition, occurrences reporting, and inlay = hints while adding new utilities for working with typed holes.

      Project-wide features continue to evolve, with cross-project symbol search = and refactoring capabilities bringing OCaml's editor support in line with o= ther modern programming languages. The features work by building an index w= ith dune build @build-index -w and provide comprehensive symbo= l searching across entire codebases.

      By the way: we are currently working on a refactor feature that enables aut= omatically extracting and inlining function parameters!

      Support for OCaml 4.14 continues with dedicated releases (OCaml-LSP 1.21.0-= 4.14 and Merlin 4.19-414).

      Activities:

      Notable Activity:

      OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

      Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides)

    • Emacs Integration

      The introduction of ocaml-eglot provides Emacs users with modern LSP-based = OCaml support as an alternative to the traditional merlin.el. This package = leverages Emacs 29's built-in eglot LSP client, offering simplified configu= ration and access to project-wide features previously unavailable in Emacs.

      ocaml-eglot provides feature parity with other editors through ocaml-lsp-se= rver, including project-wide search and rename capabilities. For users migr= ating from merlin.el, existing keybindings work immediately. The package is= actively maintained, while merlin.el enters maintenance-only mode.

      The integration works with any OCaml major mode (tuareg, caml-mode, or neoc= aml) and provides error navigation, type information display, code generati= on through the "destruct" feature, and enhanced navigation between language= constructs.

      Notable Activity:

      • ocaml-eglot 1.0.0 release bringing LSP to Emacs
      • Subsequent releases 1.1.0 and 1.2.0 adding flycheck support and Emacs 3= 0.1 compatibility
      • Active development replacing maintenance-only merlin.el
    • Visual Studio Code Plugin

      We're happy to announce that the Visual Studio Code editor plugin now integ= rates seamlessly with Dune package management! This is an important milesto= ne for Dune package management, and if you haven't = tried it, or have been waiting for it to mature, now is a great time to get= started!

      Development continues on improving the OCaml VSCode editor plugin experienc= e. For example, when using opam to manage your project's dependencies and <= code>ocaml-lsp-server is not found in the opam switch, the plugin wi= ll now prompt users to install it.

      Notable Activity:

      • Automatically installing/updating ocaml-lsp-server (#1725)
      • Automatically configuring dune package management (#1791)

    Documentation Tools

    • Odoc

      Odoc 3.1.0 continues to refine the modern documentation experience introduc= ed with Odoc 3.0. The cross-package linking system and multimedia support c= apabilities help teams create comprehensive and discoverable documentation = for complex systems.

      The improved documentation tooling addresses ecosystem discoverability and = maintainability. The ability to generate interconnected documentation acros= s multiple packages makes large OCaml codebases more accessible for new tea= m members and external collaborators.

      Work continues on integrating Odoc 3.x with the OCaml.org documentation pip= eline to provide a unified documentation experience across the ecosystem. A= s of July 2025, Odoc 3 is now live on OCaml.org, bringing the new features = to the entire package ecosystem. The improved pipeline addresses dependency= complexities by using new tooling that archives and restores opam packages= , eliminating redundant builds that previously occurred thousands of times.

      Notable Activity:

      Maintained by: Jon Ludlam (@jonludlam, Tarides), Daniel B=C3=BCnzli = (@dbuenzli), Jules Aguillon (@julow, Tarides), Paul-Elliot Angl=C3=A8s d'Au= riac (@panglesd, Tarides), Emile Trotignon (@EmileTrotignon, Tarides, then = Ahrefs)

    Ppxlib

    Ppxlib 0.36.1 refines the improvements introduced in version 0.36.0, which = updated the internal AST to target OCaml 5.2. This enables ppx authors to l= everage features from OCaml 5.2 while maintaining compatibility with OCaml = 4.08.0 and newer.

    The update includes changes to the representation of functions, and package= authors are encouraged to consult the upgrade guide as some ppxes= may require updates.

    Notable Activity:

    Maintained by: Patrick Ferris (@patricoferris)

    OCaml 5.4.0

    OCaml 5.4.0-beta1 provides early access to upcoming compiler improvements a= nd serves as a validation point for the ecosystem. The beta release allows = forward-looking projects to begin testing compatibility with the new versio= n while the broader ecosystem prepares for the eventual stable release.

    The continued parallel maintenance of OCaml 4.14 LTS ensures that projects = with longer upgrade cycles maintain access to critical updates without forc= ed compiler upgrades. This dual-track approach provides flexibility for org= anizations with different risk tolerance levels.

    Notable Activity:

    Utop

    Utop 2.16.0 adds OCaml 5.4 support, restores backtrace functionality, impro= ves preprocessor and Emacs integration, and relocates configuration files t= o a dedicated utop subdirectory.

    Notable Activity:

    We are seeing continued progress toward making OCaml development more acces= sible and productive. The maturation of Dune package management, stability = improvements in opam 2.4.0, and enhanced editor support provide a solid fou= ndation for teams adopting OCaml or expanding their existing OCaml usage.

    ppx_format

    Emile Trotignon announced

    I happy to announce the first release of ppx_format.

    Its a small ppx rewriter that was first written at the mirage retreat in 24= with @PizieDust, and that allows to put values in the middle of format str= ings:

    let s =3D "World"
    let x =3D 123
    let () =3D Format.printf {%i|H=
    ello {%s s} {%a Format.pp_=
    print_char % Char.chr 65} {%d x}<=
    span style=3D"color: #a52a2a;">%!|}
    

    Its compatible with any function that takes format strings. The only constr= aint is that the format string has to be the last argument.

    I have used at in some of my projects, and it will be available on opam as = soon as the release PR is merged.

    New release of Menhir (20250903)

    Fran=C3=A7ois Pottier announced

    It is my pleasure to announce a new release of Menhir. The main change is i= mproved parser construction time in --table mode.

    • The table back-end uses a new table compression algorithm.

      This algorithm is significantly faster than the previous algorithm: in our = tests, it can be up to 8 times faster. This results in observably faster co= mpilation: for example, the time required to compile the OCaml parser drops= from 1.2 seconds to 0.6 seconds.

      Compared with the previous algorithm, the new algorithm produces results of= roughly similar quality: the size of the compressed tables can increase or= decrease by a few percent, up to 20% in the most dramatic cases. On averag= e, we observe a 1% increase in size.

      The use of the previous algorithm can be requested by the command line swit= ch --pack-classic. This command line switch may disappear in t= he future.

      (Contributed by Fr=C3=A9d=C3=A9ric Bour; reviewed by Fran=C3=A7ois Pottier.)

    To install this release, please type:

    opam update && opam install menhir.20250903
    

    Happy parsing, Fran=C3=A7ois.

    Chat plugin activated, and adding more site categories

    Anil Madhavapeddy announced

    Following the discussion in https://discuss.oca= ml.org/t/synchronous-discussion-channel-for-compiler-contributors/17198= , I=E2=80=99ve activated the chat functionality on this site, with one new= channel ( https://d= iscuss.ocaml.org/chat/c/general/2 ). Join in and experiment with it, a= nd give feedback on this thread!

    We=E2=80=99ve also not refreshed the site categories here for some time. Ba= ck in about 2019, we experimented with a private maintainers category, but = others are possible:

    • Discourse has RSS/Atom auto-posting support. We can add the https://ocaml.org/changelog to this, which= seems like a good place to make that more visible. I propose a new categor= y =E2=80=9CChangeLog=E2=80=9D for this (other names welcome).
    • I=E2=80=99m also knocking up a script to do weekly reports from the opa= m repository, which was originally for my own use, but I could make this pu= blic. Would others be interested in a weekly digest post here about =E2=80= =9Cnew and updated packages=E2=80=9D?
    • Any other categories you=E2=80=99d like to see? I can=E2=80=99t see an = easy way to bridge GitHub discussions with this forum, unfortunately, but p= lease do poke around the Discourse docs and see if you can find something.<= /li>

    Outreachy Mentors Wanted

    Patrick Ferris announced

    I'm excited to share that the OCaml community has secured funding for the n= ext round of Outreachy. Thanks to J= ane Street and Tarides, we have fu= nding for 3 mentees in the next cohort of Outreachy internships alongside 3= /4 mentors. We are actively seeking mentors and projects for the OCaml c= ommunity. If you haven't already, please do read our previous post abou= t becoming an Outreachy mentor: https://discuss.ocaml.org/t/become-an-outreachy-mentor-support-th= e-growth-and-diversity-of-the-ocaml-community/8213.

    If you have any questions please reach out to me directly or here on this t= hread. To sign up, please use this l= ink to the Outreachy signup page. If you would like to co-mentor (i.e. = support a project but not lead that project), let people know by commenting= on this thread.

    Thanks!

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=AaE6cnvj; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=QQt/9zNp; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 9E87840086 for ; Tue, 16 Sep 2025 11:53:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Vc8dgZVwpii8YhoQspJHQMw8zeqhfd94xmFHeLQWvm8=; b=AaE6cnvjU8cj1KgiQ4/2GZTGb0GMzWI1zTS4gKdW4/4mCnhXiaoRkFc3 7XvYXaoj0ZxckZXTtPABysXAcbrezkrYoEnefaz2nkLqDiqVfSIvFvA7M S3pia6/f512wTDwS7k7QPCOdnmrNDX3RtKiKTAwYEAfH3dXlbuH/TQ+3U I=; X-CSE-ConnectionGUID: Pk+ua3B0QCi8RzEWpz5SeQ== X-CSE-MsgGUID: igz+1c37Szaw92JP12DBIQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,269,1751234400"; d="scan'208,217";a="239349927" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Sep 2025 13:53:01 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 2B6B5E0CD6; Tue, 16 Sep 2025 13:53:01 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id E08B6E0171 for ; Tue, 16 Sep 2025 13:52:58 +0200 (CEST) X-CSE-ConnectionGUID: igJY5MlSRUqxv+M4r4te6g== X-CSE-MsgGUID: 6S6M0HgiQw2Y+pnUclrEjQ== IronPort-SDR: 68c94f98_F3Dc/iVfcyZMlxVF6d92GjM3IKfIl72SirvlK7oADEnBVNd Kl/ipW5A9Y3gC1LmpdIe9hEl6qQKzUoW5Tf1cJw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GXBAB1TslohSIeaIFUBhMBAQGCSIE7WygZAWhaMwcIS?= =?us-ascii?q?QOEUoNPjiKBFpA3inuBaYERAxgWAiEVAQMBDS4BBRoBAgQBAQMBAgGCDIJ0A?= =?us-ascii?q?owzAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQA?= =?us-ascii?q?QEBAUAOO4ZPDUkBEAGBalFxYQQDBjcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECBAQDAQECLgMPARtAAQgKEwEBLAUHGCMDF?= =?us-ascii?q?AEGAwIRATUDARMBEhQGAYIPWAGCIAICTgMFDAafCJtMeoEygQGCDAEBBoEIP?= =?us-ascii?q?gIBAQEJAgIDDy4B2gyBZAmBSYINg1+CShoBBSVJawKER4Q8Jw+BVUSBFTWBB?= =?us-ascii?q?oE3B2+BUDM8CwwLAQEBAQEXgQwYAQEIBAQ9CRiDDYJpgiZEPhQdgTiBE4Emg?= =?us-ascii?q?iiBIkCCF0aFOASCLAMsIIE6Boc9gURLMywBVRMXCwcFW4EIAyo0MW4yHYEnh?= =?us-ascii?q?QyEHitPhQKBGINTERNrDwaBFYNbhUpAAwttPTcUG5YYFyoZaheBYQIOHx8CF?= =?us-ascii?q?ScPFRoOBQEHDAgMAgEBBRsCDSEEBAUJAhMKBQYBBwgiCw0FCQQRFg0HBQUBC?= =?us-ascii?q?wIJJwgDklcSFioCdY5ljhiTWR1tNAeEH4FeBgyJCIEmlgaEBIFXizySDYdHI?= =?us-ascii?q?pd+ZiKCNocngSYJYIEPH0yIeow6LAgLhUaBfyM8DWIBHQMJBzMaMEOCMwEzC?= =?us-ascii?q?QkBPBwPWJEhKIE+IoEEgXQ7fYFpB7ZTQTUBAQEBAQkFKQIHAQoBAQMJhWIBA?= =?us-ascii?q?YMyiQhuXQEB?= IronPort-PHdr: A9a23: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 6dO4g== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:oxLB3K45uqm5AevHJgPXwPXXdLJyesId70hD6qkRc203TiX8ra qTdZsguyMc5Ax9ZJhCo7C90cu7IE80nKQdieIs1NyZMzUO1lHFEKhSqaPchxfgFyf9+uM179 YDT4FOTPvqAxxfhcb+iTPId+rILeP3lZyVuQ== X-Talos-CUID: =?us-ascii?q?9a23=3AwZCjVmvjs1CQUdEWSwrrPW3W6IskfV/skVLUGHW?= =?us-ascii?q?FEHZ3C5jJUwOM9f1rxp8=3D?= X-Talos-MUID: 9a23:7MHwLwbWroQmHOBT6QSyoWlCO8ZR/P6fS1gLrJ4CoeSGDHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,269,1751234400"; d="scan'208,217";a="125643556" X-MGA-submission: =?us-ascii?q?MDGrooe5Zda6PTMZGSGFnIwdZIWebJpVMshorp?= =?us-ascii?q?UjH8DJ7GdEyHmnifo2u6X+a3KZ90THaiag45VNnbo4I0/GNRe0b6Nhxc?= =?us-ascii?q?+sMAfdGkhELodoY40jd6HqMdHr6J+2qBTwptAjLANUOeYARiiA63rzGF?= =?us-ascii?q?VAUGCBukrD2RrK9NZco+2+QA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Sep 2025 13:52:57 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E562D1A2DF; Tue, 16 Sep 2025 13:52:55 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1758023576; bh=qTeFRfNawMovN2F8S41DhQJc0awleyrKnnPUCvHEKZA=; h=From:To:Subject:Date:Message-ID; b=QQt/9zNpCaAiDqU2EHc9z1VN/U6M4E4xpmPxgRxkI9+bj8qG3YRNzc5EUzg8VLJ4L xWFzpI8PEFCxV7fmEzxe/ljKrmRT6+1a6uWq0ZZzUD2HIKYJSLyKZ2e/C/hPC1SLIc XQZMoiJkB5oXU/x8RS5d+UP/9GglNCqX+K+Fthf0= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 16 Sep 2025 13:52:54 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 16 13:52:56 2025 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.120680, queueID=12FFB1A303 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19377 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 09 to 16, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dune dev meeting Dune 3.20 OCaml compiler office hours? (preparation thread) Second beta release of OCaml 5.4.0 Unicode 17.0.0 update for Uucd, Uucp, Uunf and Uuseg Scope Image File Viewer OCaml security team Testo 0.2.0 - test library with support for snapshots, parallel runs, xfail= s, timeouts tinyfiledialogs bindings RFC: `for...in' construct dead_code_analyzer 1.0.0 Relocatable OCaml FUN OCaml is live on YouTube and Twitch Other OCaml News Old CWN Dune dev meeting =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Shon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! :camel: Starting tomorrow, Wednesday September 9th, 2025, *we will begin holding our Dune dev meeting WEEKLY, every Wednesday*, at alternating time slots. Whether you are a maintainer, a regular contributor, a new joiner or just curious, you are always welcome to join: these discussions are open! The goal of these meetings is to provide a place to discuss the ongoing work together and synchronize between the Dune developers :smile: However, we will no longer be manually announcing these meetings, as they are at set recurring times, and the meeting times and ways to participate are well documented. :calendar: Agenda and Notes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C If there is a prior agenda, it will be available on the dedicated meeting page [available from or dev wiki]. Feel free to ask if you want to add more items in it. You may review the meeting notes for any past meetings from the very same pages. [available from or dev wiki] :computer: Links =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Meeting link:[ zoom] =E2=80=A2 Calendar event:[ google calendar] =E2=80=A2 Wiki with information and previous notes: [dune wiki on GitHub] :heart: [ zoom] [ google calendar] [dune wiki on GitHub] Dune 3.20 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Etienne Marais announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune Team is happy to announce the release of Dune `3.20.2'. This release comes with some fixes regarding `js_of_ocaml' and `cram' test. It also fixes `dune' when using Cygwin. Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Fixed =E2=80=A2 Fix jsoo separate compilation with modules_without_implementation. Regression introduced in ocaml/dune#10767. (ocaml/dune#12320, fixes ocaml/dune#12306 @hhugo) =E2=80=A2 Fix `runtest-js' mistakenly using wrong dependencies (ocaml/dune#12324, @vouillon) =E2=80=A2 Remove empty `.cram.test.t' directory during the running of a c= ram test. (ocaml/dune#12329, fixes ocaml/dune#12321, @Alizter) =E2=80=A2 Fix Cygwin bootstrap (ocaml/dune#12325, fixes ocaml/dune#12316, @Alizter) OCaml compiler office hours? (preparation thread) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Following our current discussion on making participation to the OCaml compiler development more inviting (, ), I propose to give a try to "OCaml compiler office hours". My idea is to do this once during a week day around the end of September (and then we see how it goes). =E2=80=A2 Format: a synchronous remote meeting (voice with optional video= ), backed by a collaborative pad to record questions, take notes, share links etc. =E2=80=A2 Topic: anything related to the development of the OCaml compile= r, that is, the github/ocaml/ocaml project. (All topics and questions are welcome, at all levels of knowledge and familiarity with the compiler.) =E2=80=A2 Duration: probably one to two hours, but the idea of "office ho= urs" is that people can of course join late and leave at any time. I am including below a poll to ask which time slots would be possible / comfortable for prospective attendants. (As the organizer, I pre-selected slots that are comfortable for me.) Please only answer the poll if you are motivated to attend such a meeting (the preferences may different from the general timezone of the OCaml community). /Editor=E2=80=99s note: please follow the archive link above to access the poll./ (If we do this several time we will of course think of a rotation to accomodate people from different timezones.) Second beta release of OCaml 5.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 After an extended summer break, the release of OCaml 5.4.0 is getting close. Since there have been a handful of meaningful bug fixes this summer, we are releasing a second beta version of OCaml 5.4.0 to help you update your software and libraries ahead of the release (see below for the installation instructions). More information about the whole release process is now available in the [compiler repository]. Compared to the first beta release, this beta release contains four notable bug fixes: =E2=80=A2 one type system bugfix for variance annotation on private types =E2=80=A2 one memory concurrency safety fix for weak pointers =E2=80=A2 two Windows fixes Those fixes are complemented by: =E2=80=A2 one runtime performance fix =E2=80=A2 three tools and compiler-libs related fixes =E2=80=A2 one error message fix. The full list of fixes for this second beta is available below. Overall, this beta release is already quite stable. If the tests for this beta release go well, we are expecting to have a first release candidate in the week of the 22 September, and the full release in the beginning of October. If you find any bugs, please report them on [OCaml's issue tracker]. The last progresses on stabilising the ecosystem are still tracked on the [opam readiness for 5.4.0 meta-issue]. If you are interested in full list of features and bug fixes of the new OCaml version, the updated change log for OCaml 5.4.0 is available [on GitHub]. Happy hacking, Florian Angeletti for the OCaml team [compiler repository] [OCaml's issue tracker] [opam readiness for 5.4.0 meta-issue] [on GitHub] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.4.0~beta2 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 [GitHub] =E2=80=A2 [OCaml archives at Inria] [GitHub] [OCaml archives at Inria] =E2=97=8A Fine-Tuned Compiler Configuration If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.4.0~beta2+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.4.0~beta2+flambda+nffa ocaml-variants.5.4.= 0~beta2+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes since the first beta =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Type system fix =E2=80=A2 [#14200], [#14202] : bad variance check with private aliases (Jacques Garrigue, report and review by Stephen Dolan) [#14200] [#14202] =E2=97=8A Windows fixes =E2=80=A2 #13504, #13625, +[#14223]: Add `Thread.set_current_thread_name'. (Romain Beauxis, review by Gabriel Scherer and Antonin D=C3=A9cimo) =E2=80=A2 [#13541], [#13777]: Using C++11 `thread_local' causes name-mang= ling issues when linking with flexlink on Cygwin. (Antonin D=C3=A9cimo and David Allsopp, report by Kate Deplaix) [#14223] [#13541] [#13777] =E2=97=8A Runtime fixes =E2=80=A2 [#14061], [#14209]: fix a memory-ordering bug in Weak.set that = could result in uninitialized memory seen by Weak.get on another domain. (Damien Doligez, review by Gabriel Scherer) =E2=80=A2 [#14169]: runtime, fix cache miss within the stack fragments ca= che (Florian Angeletti, review by Gabriel Scherer) [#14061] [#14209] [#14169] =E2=97=8A Tooling fixes =E2=80=A2 #13302, +[#14236]: Store locations of longidents components (Ul= ysse G=C3=A9rard and Jules Aguillon, review by Jules Aguillon and Florian Angeletti) =E2=80=A2 #12642, #13536, +[#14184], +[#14192]: in the toplevel, print sh= orter paths for constructors and labels when only some modules along their path are open. (Gabriel Scherer, review by Florian Angeletti) =E2=80=A2 [#14196], [#14197]: ocamlprof: do not instrument unreachable cl= auses (Gabriel Scherer, review by Nicol=C3=A1s Ojeda B=C3=A4r, report by Ali Caglayan) [#14236] [#14184] [#14192] [#14196] [#14197] =E2=97=8A Error messages =E2=80=A2 [#14214], [#14221]: fix a confused error message for module inclusions, functor error messages were missing some type equalities potentially leading to nonsensical "type t is not compatible with type t" submessage (Florian Angeletti, report by Basile Cl=C3=A9ment, review by Gabriel Scherer) [#14214] [#14221] Unicode 17.0.0 update for Uucd, Uucp, Uunf and Uuseg =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, Unicode 17.0.0 was released on September 9th. It adds 4803 new characters for a total of 159'801 characters. Among other interesting scripts, this adds support for the [Beria Erfe script], a modern-use script from Africa which coincidentally is also refered to as the *camel alphabet*. For more information about other additions see [this page]. Accordingly these libraries had to be updated (aggregated, boring, release notes [here]) =E2=80=A2 [Uucd] 17.0.0 Unicode character database decoder for OCaml, [do= cs] =E2=80=A2 [Uucp] 17.0.0 Unicode character properties for OCaml, [docs] =E2=80=A2 [Uunf] 17.0.0 Unicode text normalization for OCaml, [docs] =E2=80=A2 [Uuseg] 17.0.0 Unicode text segmentation for OCaml, [docs] Both `Uucd' and `Uucp' are incompatible releases sinces new block and script enumerants were added. Other than that the minimal Unicode introduction and Unicode OCaml tips is still [here] and remember that despite the myths OCaml :heart: Unicode. A big thanks for funding from the [OCaml Software Foundation] and from my [donors]. Daniel [Beria Erfe script] [this page] [here] [Uucd] [docs] [Uucp] [docs] [Uunf] [docs] [Uuseg] [docs] [here] [OCaml Software Foundation] [donors] Scope Image File Viewer =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charles Averill announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wanted to mess around with image file parsing and ended up building a small image viewer application using SDL. Includes a few hand-written parsers as well as calls to SDL_Image for more complicated formats. Not super performant but working on it. OCaml security team =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear everyone, we=E2=80=99ve accomplished several tasks: =E2=80=A2 is now live =E2=80=A2 The public mailing list for security advisories is sympa.inria.fr/sympa/info/ocsf-ocaml-security-announcements =E2=80=93 p= lease subscribe if you=E2=80=99d like to receive security announcements =E2=80=A2 There=E2=80=99ll be a brief introduction at [Fun OCaml] and a t= alk at [OCaml workshop (ICFP)] )16:00 - 16:30 =E2=80=A2 We will have a public meeting for discussions on Oct 22nd 14:00= - 16:00 CEST (online, yet to be announced where) =E2=80=A2 There=E2=80=99s already the OCaml security advisory database (still empty, we=E2=80= =99ll fill it over the next weeks) [Fun OCaml] [OCaml workshop (ICFP)] Testo 0.2.0 - test library with support for snapshots, parallel runs, xfail= s, timeouts =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Martin Jambon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Testo was designed as a feature-rich testing framework that makes common tasks easy and unusual ones possible. It is similar to Alcotest but supports more options including notably: =E2=80=A2 snapshotting: large output capture and diffing =E2=80=A2 test-driven development: write tests first, make them pass later (`~expected_outcome' option) =E2=80=A2 review test results without re-running them (`status' subcomman= d) =E2=80=A2 fast parallel execution supporting Windows and older OCaml vers= ions (>=3D 4.08) =E2=80=A2 complete [documentation]: [tutorial], [howto guides], [OCaml API reference] =E2=80=A2 timeouts (new!) We=E2=80=99ve been using Testo at [Semgrep] where we need the snapshotting feature to track the output of the `semgrep' command in end-to-end tests. [Changes since the last release] include bugfixes, a few new command-line options, and support for timeouts. Install it now with =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install testo =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Testo development is an open-source community effort that [happens on GitHub]. It has been funded by Semgrep, my employer and fine purveyor of application security software. We're planning for a 1.0 release once the known Windows-specific bugs are gone. No major breaking changes are in sight. For reference, the previous announcement from last year is [here]. Enjoy your free software! [documentation] [tutorial] [howto guides] [OCaml API reference] [Semgrep] [Changes since the last release] [happens on GitHub] [here] tinyfiledialogs bindings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charles Averill announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Bindings to the cross-platform tinyfiledialogs library, providing an API for (you guessed it) simple graphical file/directory/color selection using what the host operating system provides. RFC: `for...in' construct =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sacha Ayoun announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, Here's [an RFC] I drafted for adding a `for...in' construct to the language. Feedback is welcome here :slight_smile: Some reservations were already voiced [here], and acknowledged in the RFC. [an RFC] [here] dead_code_analyzer 1.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: fantazio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Hello everyone, Almost 10 years later, the [dead_code_analyzer] is coming back ! Thanks to all the more or less recent contributors and reviewers (I am not allowed to tag you all as a new user). The tool has been updated to *OCaml 5.2*. It is available on `opam'. There is planned work to update it to OCaml 5.3. There is planned work to offer a version compatible with OCaml 4.14. However, there is no intent to maintain the `dead_code_analyzer' on any OCaml version other than the latest. This static analyzer is a complement to the compiler=E2=80=99s warnings on unused code constructs. It reads *.cmi* and *.cmt* files, produced by using `-keep-locs' (on by default) on *.mli* files and `-bin-annot' on *.ml* files. It scans a compiled OCaml project and reports various warnings about suspicious code: =E2=80=A2 exported values never used, =E2=80=A2 class fields never used, =E2=80=A2 constructors and record fields never used, =E2=80=A2 optional arguments always or never used, =E2=80=A2 some stylistic issues. By default, only the 3 first elements of the above list are reported. More details available in the project=E2=80=99s /[README]/. A more thorou= gh documentation is in progress. [dead_code_analyzer] [README] Relocatable OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: David Allsopp announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It is my great pleasure, 3 years to the day since I finalised the first full demonstration of it in Ljubljana for the OCaml Workshop in 2022, to announce the general availability of Relocatable OCaml for testing and review. For example, this creates a 5.4.0 switch (the good old-fashioned slow way): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ time opam switch create --repos=3Drelocatable=3Dgit+https://g= ithub.com/dra27/opam-repository.git#relocatable,default original-compiler o= caml.5.4.0 =E2=94=82 real 1m27.646s =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 But, having run that, subsequent switches are a just a tad quicker: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ eval $(opam env) =E2=94=82 $ ocamlopt -where =E2=94=82 /home/opam/.opam/original-compiler/lib/ocaml =E2=94=82 $ time opam switch create . --repos=3Drelocatable,default ocaml= .5.4.0 =E2=94=82 real 0m5.105s =E2=94=82 $ eval $(opam env) =E2=94=82 $ ocamlopt -where =E2=94=82 /home/opam/myproject/_opam/lib/ocaml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 And, um, that's it really! Oh, there are a few other things bundled into the [relocatable branch] on dra27/opam-repository: =E2=80=A2 It's available for all versions of OCaml since 4.08. They insta= ll using their "trunk" versions - i.e. the version number of what would be the next release of OCaml (4.08.2, 4.09.2, 4.10.3, 4.11.3, 4.12.2, 4.13.2, 4.14.3, 5.0.1, 5.1.2, 5.2.2, 5.1.3, pre-release 5.4.0 and, for completeness, trunk OCaml is present as 5.5.0) =E2=80=A2 Relocatable versions of `ocamlbuild' and `ocamlfind' are includ= ed, along with patches for `omod' and `stdcompat' =E2=80=A2 The `ocaml-option-' packages work for all of the older versions= , too =E2=80=A2 They all work on Windows (including 4.08-4.12, which aren't yet available in opam-repository) =E2=80=A2 They all work on Apple silicon (including 4.08, 4.09 and 4.11) I have literally just opened the PRs on ocaml/ocaml ([ocaml/ocaml#14243], [ocaml/ocaml#14244], [ocaml/ocaml#14245] and [ocaml/ocaml#14246]). In the interests of those of us who maintain libraries and tools which have to target multiple versions of OCaml, there will be some kind of story for keeping these older versions available, but the focus for now will be reaching a consensus for merging the feature itself into OCaml 5.5. Please do test and report any issues at . Over-zealous lock-file systems notwithstanding, the compiler should be as "drop-in" a replacement as updating to any "point release" of the compiler (i.e. if you have something which works in OCaml 5.3.0 but doesn't work in Relocatable OCaml 5.3.1, that's a bug, and I'd _love_ to hear about it a.s.a.p., please!) [relocatable branch] [ocaml/ocaml#14243] [ocaml/ocaml#14244] [ocaml/ocaml#14245] [ocaml/ocaml#14246] FUN OCaml is live on YouTube and Twitch =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're at FUN OCaml and having some awesome OCaml talks today! And you can join us remotely. =F0=9F=A7=A1=F0=9F=90=AB For the schedule and links to the live streams of FUN OCaml 2025 from Warsaw, see We also have a discord server for FUN OCaml here: Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Relocatable OCaml - from concept to demo to PRs] =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Shipping a robust DB migration runner for Chaufr (OCaml + Caqt= i + Lwt)] =E2=80=A2 [FUN OCaml 2025 - Join us in Warsaw, Poland on September 15 for= a day full of presentations!] =E2=80=A2 [Dynamic Formal Verification in OCaml: An Ortac/QCheck-STM Tuto= rial] =E2=80=A2 [Caching opam solutions] =E2=80=A2 [Build IDs for Day10] [the ocaml.org blog] [Relocatable OCaml - from concept to demo to PRs] [Upcoming OCaml Events] [Shipping a robust DB migration runner for Chaufr (OCaml + Caqti + Lwt)] [FUN OCaml 2025 - Join us in Warsaw, Poland on September 15 for a day full of presentations!] [Dynamic Formal Verification in OCaml: An Ortac/QCheck-STM Tutorial] [Caching opam solutions] [Build IDs for Day10] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 09 to 16, 2= 025.

    Dune dev meeting

    Shon announced

    Hi everyone! :camel:

    Starting tomorrow, Wednesday September 9th, 2025, we will begin holding = our Dune dev meeting WEEKLY, every Wednesday, at alternating time slots.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are always welcome to join: these discussions are open! The goa= l of these meetings is to provide a place to discuss the ongoing work toget= her and synchronize between the Dune developers :smile:

    However, we will no longer be manually announcing these meetings, as they a= re at set recurring times, and the meeting times and ways to participate ar= e well documented.

    :calendar: Agenda and Notes

    If there is a prior agenda, it will be available on the dedicated meeting p= age available from or dev w= iki. Feel free to ask if you want to add more items in it.

    You may review the meeting notes for any past meetings from the very same p= ages.

    :computer: Links

    :heart:

    Dune 3.20

    Etienne Marais announced

    The Dune Team is happy to announce the release of Dune 3.20.2.

    This release comes with some fixes regarding js_of_ocaml and <= code>cram test. It also fixes dune when using Cygwin.

    Changelog

    • Fixed
      • Fix jsoo separate compilation with modules_without_implementation. Regr= ession introduced in ocaml/dune#10767. (ocaml/dune#12320, fixes ocaml/dune#12306 @= hhugo)
      • Fix runtest-js mistakenly using wrong dependencies (ocaml/= dune#12324, @vouillon)
      • Remove empty .cram.test.t directory during the running of = a cram test. (ocaml/dune#12329, fixes ocaml/dune#12321, @Alizter)
      • Fix Cygwin bootstrap (ocaml/dune#12325, fixes ocaml/dune#12316, @Alizte= r)

    OCaml compiler office hours? (preparation thread)

    gasche announced

    Following our current discussion on making participation to the OCaml compi= ler development more inviting (https://di= scuss.ocaml.org/t/why-lean-4-replaced-ocaml-as-my-primary-language/17109/45= ?u=3Dgasche, https://discuss.ocaml.org/t/= synchronous-discussion-channel-for-compiler-contributors/17198/1 ), I p= ropose to give a try to "OCaml compiler office hours". My idea is to do thi= s once during a week day around the end of September (and then we see how i= t goes).

    • Format: a synchronous remote meeting (voice with optional video), backe= d by a collaborative pad to record questions, take notes, share links etc.<= /li>
    • Topic: anything related to the development of the OCaml compiler, that = is, the github/ocaml/ocaml project. (All topics and questions are welcome, = at all levels of knowledge and familiarity with the compiler.)
    • Duration: probably one to two hours, but the idea of "office hours" is = that people can of course join late and leave at any time.

    I am including below a poll to ask which time slots would be possible / com= fortable for prospective attendants. (As the organizer, I pre-selected slot= s that are comfortable for me.) Please only answer the poll if you are motivated to attend such a meeting (= the preferences may different from the general timezone of the OCaml commun= ity).

    Editor=E2=80=99s note: please follow the archive link above to access th= e poll.

    (If we do this several time we will of course think of a rotation to accomo= date people from different timezones.)

    Second beta release of OCaml 5.4.0

    octachron announced

    After an extended summer break, the release of OCaml 5.4.0 is getting close.

    Since there have been a handful of meaningful bug fixes this summer, we are releasing a second beta version of OCaml 5.4.0 to help you update your software and libraries ahead of the release (see below for the installation instructions). More information about the whole release proces= s is now available in the compiler repository.

    Compared to the first beta release, this beta release contains four notable bug fixes:

    • one type system bugfix for variance annotation on private types
    • one memory concurrency safety fix for weak pointers
    • two Windows fixes

    Those fixes are complemented by:

    • one runtime performance fix
    • three tools and compiler-libs related fixes
    • one error message fix.

    The full list of fixes for this second beta is available below.

    Overall, this beta release is already quite stable. If the tests for this beta release go well, we are expecting to have a firs= t release candidate in the week of the 22 September, and the full release in the begi= nning of October.

    If you find any bugs, please report them on OCaml's issue tracker.

    The last progresses on stabilising the ecosystem are still tracked on the opam read= iness for 5.4.0 meta-issue.

    If you are interested in full list of features and bug fixes of the new OCa= ml version, the updated change log for OCaml 5.4.0 is available on GitHub.

    Happy hacking, Florian Angeletti for the OCaml team

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.4.0~beta2
    

    The source code for the beta is also available at these addresses:

    • Fine-Tuned Compiler Configuration

      If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

      opam update
      opam switch create <switch_name> ocaml-variants.5.4.0~beta2+options &=
      lt;option_list>
      

      where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

      opam switch create 5.4.0~beta2+flambda+nffa ocaml-variants.5.4.0~beta2+opti=
      ons ocaml-option-flambda ocaml-option-no-flat-float-array
      

      All available options can be listed with opam search ocaml-option.

    Changes since the first beta

    • Type system fix
      • #14200, #14202 : bad varia= nce check with private aliases (Jacques Garrigue, report and review by Stephen Dolan)
    • Windows fixes
      • #13504, #13625, +#14223: Add Thread.set_current_thread_name. (Romain Beauxis, review by Gabriel Scherer and Antonin D=C3=A9cimo)
      • #13541, #13777: Using C++1= 1 thread_local causes name-mangling issues when linking with flexlink on Cygwin. (Antonin D=C3=A9cimo and David Allsopp, report by Kate Deplaix)
    • Runtime fixes
      • #14061, #14209: fix a memo= ry-ordering bug in Weak.set that could result in uninitialized memory seen by Weak.get on another domain. (Damien Doligez, review by Gabriel Scherer)
      • #14169: run= time, fix cache miss within the stack fragments cache (Florian Angeletti, review by Gabriel Scherer)
    • Tooling fixes
      • #13302, +#14236= : Store locations of longidents components (Ulysse G=C3=A9rard and Jules Aguillon, review by Jules Aguillon and Florian Angeletti)
      • #12642, #13536, +#14184, +#141= 92: in the toplevel, print shorter paths for constructors and labels when only some modules along their path are open. (Gabriel Scherer, review by Florian Angeletti)
      • #14196, #14197: ocamlprof:= do not instrument unreachable clauses (Gabriel Scherer, review by Nicol=C3=A1s Ojeda B=C3=A4r, report by Ali Cagl= ayan)
    • Error messages
      • #14214, #14221: fix a conf= used error message for module inclusions, functor error messages were missing some type equalities potentially leading to nonsensical "type t is not compatible with type t" submessage (Florian Angeletti, report by Basile Cl=C3=A9ment, review by Gabriel Schere= r)

    Unicode 17.0.0 update for Uucd, Uucp, Uunf and Uuseg

    Daniel B=C3=BCnzli announced

    Hello,=20

    Unicode 17.0.0 was released on September 9th. It adds 4803 new characters f= or a total of 159'801 characters.

    Among other interesting scripts, this adds support for the Beria Erfe script, a modern-= use script from Africa which coincidentally is also refered to as the ca= mel alphabet.=20

    For more information about other additions see this page.

    Accordingly these libraries had to be updated (aggregated, boring, release = notes here<= /a>)

    • Uucd 17.0.0 Unicode c= haracter database decoder for OCaml, docs
    • Uucp 17.0.0 Unicode c= haracter properties for OCaml, docs
    • Uunf 17.0.0 Unicode t= ext normalization for OCaml, docs
    • Uuseg 17.0.0 Unicode= text segmentation for OCaml, docs

    Both Uucd and Uucp are incompatible releases sinc= es new block and script enumerants were added.

    Other than that the minimal Unicode introduction and Unicode OCaml tips is = still here<= /a> and remember that despite the myths OCaml :heart: Unicode.

    A big thanks for funding from the OCaml So= ftware Foundation and from my donors.

    Daniel

    OCaml security team

    Hannes Mehnert announced

    Dear everyone,

    we=E2=80=99ve accomplished several tasks:

    • https://ocaml.org/security i= s now live
    • The public mailing list for security advisories is sympa.inria.fr/sympa= /info/ocsf-ocaml-security-announcements =E2=80=93 please subscribe if you= =E2=80=99d like to receive security announcements
    • There=E2=80=99ll be a brief introduction at Fun OCaml and a talk at OCaml workshop (ICFP) )16:00 - 16:30
    • We will have a public meeting for discussions on Oct 22nd 14:00 - 16:00= CEST (online, yet to be announced where)
    • There=E2=80=99s already the OCaml security advisory database https://github.com/ocaml/sec= urity-advisories (still empty, we=E2=80=99ll fill it over the next week= s)

    Testo 0.2.0 - test library with support for snapshots, paralle= l runs, xfails, timeouts

    Martin Jambon announced

    Testo was designed as a feature-rich testing framework that makes common ta= sks easy and unusual ones possible. It is similar to Alcotest but supports = more options including notably:

    • snapshotting: large output capture and diffing
    • test-driven development: write tests first, make them pass later (~expected_outcome option)
    • review test results without re-running them (status subcom= mand)
    • fast parallel execution supporting Windows and older OCaml versions (&g= t;=3D 4.08)
    • complete documentation= : tutorial, howto guides, OCaml AP= I reference
    • timeouts (new!)

    We=E2=80=99ve been using Testo at Semgrep where we need the snapshotting feature to track the outpu= t of the semgrep command in end-to-end tests.

    Changes sin= ce the last release include bugfixes, a few new command-line options, a= nd support for timeouts. Install it now with

    $ opam install testo
    

    Testo development is an open-source community effort that happens on GitHub. It has been funded by Se= mgrep, my employer and fine purveyor of application security software. We'r= e planning for a 1.0 release once the known Windows-specific bugs are gone.= No major breaking changes are in sight.

    For reference, the previous announcement from last year is here.

    Enjoy your free software!

    tinyfiledialogs bindings

    Charles Averill announced

    Bindings to the cross-platform tinyfiledialogs library, providing an API fo= r (you guessed it) simple graphical file/directory/color selection using wh= at the host operating system provides.=20

    https://opam.o= caml.org/packages/tinyfiledialogs/

    RFC: for...in construct

    Sacha Ayoun announced

    Hello,

    Here's an RFC I draft= ed for adding a for...in construct to the language. Feedback i= s welcome here :slight_smile:=20

    Some reservations were already voiced here, and acknowledged in the RFC.

    dead_code_analyzer 1.0.0

    fantazio announced

    Hello everyone,

    Almost 10 years later, the dead_code_analyzer is coming back !

    Thanks to all the more or less recent contributors and reviewers (I am not = allowed to tag you all as a new user).

    The tool has been updated to OCaml 5.2. It is available on opa= m. There is planned work to update it to OCaml 5.3. There is planned work to offer a version compatible with OCaml 4.14. Howeve= r, there is no intent to maintain the dead_code_analyzer on an= y OCaml version other than the latest.

    This static analyzer is a complement to the compiler=E2=80=99s warnings on = unused code constructs. It reads .cmi and .cmt files, produce= d by using -keep-locs (on by default) on .mli files and= -bin-annot on .ml files.

    It scans a compiled OCaml project and reports various warnings about suspic= ious code:

    • exported values never used,
    • class fields never used,
    • constructors and record fields never used,
    • optional arguments always or never used,
    • some stylistic issues.

    By default, only the 3 first elements of the above list are reported. More details available in the project=E2=80=99s README. A mo= re thorough documentation is in progress.

    Relocatable OCaml

    David Allsopp announced

    It is my great pleasure, 3 years to the day since I finalised the first ful= l demonstration of it in Ljubljana for the OCaml Workshop in 2022, to annou= nce the general availability of Relocatable OCaml for testing and review.

    For example, this creates a 5.4.0 switch (the good old-fashioned slow way):

    $ time opam switch create --repos=3Drelocatable=3Dgit+https://github.com/dr=
    a27/opam-repository.git#relocatable,default original-compiler ocaml.5.4.0
    real    1m27.646s
    

    But, having run that, subsequent switches are a just a tad quicker:

    $ eval $(opam env)
    $ ocamlopt -where
    /home/opam/.opam/original-compiler/lib/ocaml
    $ time opam switch create . --repos=3Drelocatable,default ocaml.5.4.0
    real    0m5.105s
    $ eval $(opam env)
    $ ocamlopt -where
    /home/opam/myproject/_opam/lib/ocaml
    

    And, um, that's it really!

    Oh, there are a few other things bundled into the relocatable branch on dra27/opam-repository:

    • It's available for all versions of OCaml since 4.08. They install using= their "trunk" versions - i.e. the version number of what would be the next= release of OCaml (4.08.2, 4.09.2, 4.10.3, 4.11.3, 4.12.2, 4.13.2, 4.14.3, = 5.0.1, 5.1.2, 5.2.2, 5.1.3, pre-release 5.4.0 and, for completeness, trunk = OCaml is present as 5.5.0)
    • Relocatable versions of ocamlbuild and ocamlfind are included, along with patches for omod and stdcom= pat
    • The ocaml-option- packages work for all of the older versi= ons, too
    • They all work on Windows (including 4.08-4.12, which aren't yet availab= le in opam-repository)
    • They all work on Apple silicon (including 4.08, 4.09 and 4.11)

    I have literally just opened the PRs on ocaml/ocaml (ocaml/ocaml#14243, ocaml/ocaml#14244, ocaml/ocaml#14245 and ocaml/ocaml#14246). In the int= erests of those of us who maintain libraries and tools which have to target= multiple versions of OCaml, there will be some kind of story for keeping t= hese older versions available, but the focus for now will be reaching a con= sensus for merging the feature itself into OCaml 5.5.

    Please do test and report any issues at https://github.com/dra27/relocatable/issues. Over-= zealous lock-file systems notwithstanding, the compiler should be as "drop-= in" a replacement as updating to any "point release" of the compiler (i.e. = if you have something which works in OCaml 5.3.0 but doesn't work in Reloca= table OCaml 5.3.1, that's a bug, and I'd love to hear about it a.s.a.p., please!)

    FUN OCaml is live on YouTube and Twitch

    Sabine Schmaltz announced

    We're at FUN OCaml and having some awesome OCaml talks today! And you can j= oin us remotely. =F0=9F=A7=A1=F0=9F=90=AB

    For the schedule and links to the live streams of FUN OCaml 2025 from Warsa= w, see

    https://fun-ocaml.com

    We also have a discord server for FUN OCaml here:

    https://discord.gg/DxAghYKqn4

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=SVA7XF6G; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id D284B400A0 for ; Tue, 23 Sep 2025 13:24:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=IuSAF+pps0QraGiLoc4O2Ox9MZABalKtqgoNALikCU4=; b=SVA7XF6Gk//s35xuX29Eb6ScTgyrTdEn/XVE+bCtNngd74k3ksQr0iFg Lpu4hRmI5v6z1KxYptQXas+zoHVBkxww1TQZp2H1wyEgBl2T8m1Av+84K 40bOEUaAiykYUIZt0MhirvxLy7ce+rSgpvdrPYMOFGx4xbg0uWb+qtMTg k=; X-CSE-ConnectionGUID: GwBITAjbQcSpYpxpHTG/5w== X-CSE-MsgGUID: jbvQ+oiHSoi0k3JuRIuIxA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.18,288,1751234400"; d="scan'208,217";a="240635494" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Sep 2025 15:24:02 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 54083E0C55; Tue, 23 Sep 2025 15:24:02 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 864AFE0171 for ; Tue, 23 Sep 2025 15:23:59 +0200 (CEST) X-CSE-ConnectionGUID: 4advLFN+RISAvD712mXtGw== X-CSE-MsgGUID: PH84EIYHQP+sX+lKC5LM1w== X-IronPort-AV: E=Sophos;i="6.18,288,1751234400"; d="scan'208,217";a="240635463" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail2-relais-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Sep 2025 15:23:59 +0200 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 23 Sep 2025 15:23:59 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19379 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 16 to 23, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Introduction to the Dune build system, by OCamlPro memprof-limits (first official release): Memory limits, allocation limits, = and thread cancellation, with interrupt-safe resources mlfront-shell - reference implementation of a build system Zanuda =E2=80=93 OCaml linter experiment YOCaml, a framework for static site generator Lwt.6.0.0~beta (direct-style, multi-domain parallelism) schm-ocaml detri cmd seven ocaml tutorials Ortac/Wrapper: a new plugin for specification driven unit testing Other OCaml News Old CWN Introduction to the Dune build system, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 *Greetings Cameleers,* We=E2=80=99ve just released a new blog post: [OCaml Onboarding: Introduct= ion to the Dune build system] This is a practical, compact guide for those starting their OCaml and Dune journey =E2=80=94 or helping others do so. Instead of diving into internals, we focus on what you need to know to get up and running with Dune confidently. We walk through: =E2=80=A2 How Dune thinks about builds and directories =E2=80=A2 The role of dune files and static declarations =E2=80=A2 The tooling one interacts with day-to-day The post keeps things hands-on and beginner-focused, with just enough theory to make the practical bits stick. We end by circling back to `dune init' =E2=80=94 showing how understanding the basics makes the scaffolding tool far more intuitive. =F0=9F=93=9D Read it on the [OCamlPro Blog] Perfect for sharing with colleagues or newcomers dipping their toes into OCaml and Dune. As always, feedback welcome! Until next time, =E2=80=94 The OCamlPro Team [OCaml Onboarding: Introduction to the Dune build system] [OCamlPro Blog] memprof-limits (first official release): Memory limits, allocation limits, = and thread cancellation, with interrupt-safe resources =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Guillaume Munch-Maccagnoni announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 I am pleased to announce the version `0.3.0' of the package `memprof-limits'. The main contribution of this release is the *support for OCaml 5 with multiple parallel domains*. Memprof-limits can henceforth be used to conveniently interrupt (CPU-bound) domains in your parallel computations, using /cancellation tokens/, with the support of features to ensure interrupt-safety and resource-safety. As example of uses, plans are underway to use memprof-limits to ensure the resource-safety of user interrupts in the Rocq prover (eliminating a class of bugs) and to add tactics for portable timeouts (that count allocations rather than elapsed time). =E2=80=A2 Read more: =E2=80=A2 Report bugs and suggestions: mlfront-shell - reference implementation of a build system =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 There have been many improvements since the last update. Here are some of them: 1. The trace store (needed to not rebuild everything from scratch) has been implemented. 2. Build file ASTs are parsed, marshalled and put into a key-value directory (which can be shared or cached in CI). 3. Build keys are generated and used to protect sharing of the parsed AST. 4. A full walkthrough of =E2=80=9Cbuilding=E2=80=9D the 7zip executable f= rom 7zip binary assets (it is more complicated than it sounds) is on the [documentation page] 5. An `=E2=80=93autofix' option to update build files with checksums, and allowing SHA1 checksum for local files (both are for eventual support of Meta=E2=80=99s watchman tool) 6. A new format for the JSON files (many functions versus one). The old format is deprecated. 7. Many many bug fixes, including specification updates. [documentation page] Zanuda =E2=80=93 OCaml linter experiment =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Kakadu announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Zanuda 2.0.0 with OCaml 5.3 support have hit opam. YOCaml, a framework for static site generator =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Release `2.5.0' =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We are delighted to present the new release of YOCaml: `2.5.0'! As you can see, there have been a few intermediate versions since our last announcement. However, we have reached a new milestone: YOCaml can now be used seamlessly with an Applicative API (instead of the Arrow one), making many tasks much easier to express! We have also finally taken the time to write [a tutorial that explains how to use YOCaml to create a complete blog], step by step, and our goal is to expand it over time to add more and more guides! (The documentation/guide generator ( is also written in YOCaml and gives an idea of what can be done fairly quickly.) =E2=80=A2 [Repository] =E2=80=A2 [YOCaml packages] =E2=80=A2 [Complete release note] We look forward to receiving your feedback! YOCaml is a free and collaborative project, so any contributions (including the guide) are more than welcome! We would also be DELIGHTED to see your creations with YOCaml! /Happy Hacking!/ [a tutorial that explains how to use YOCaml to create a complete blog] [Repository] [YOCaml packages] [Complete release note] Lwt.6.0.0~beta (direct-style, multi-domain parallelism) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 After some feedback and some work, I'm happy to announce the release of `lwt.6.0.0~beta00' and `lwt_direct.6.0.0~beta00'! () major CHANGES are: =E2=80=A2 direct style mode (see [alpha release announce]): use `await : = 'a Lwt.t -> 'a' to transform any promises into a simple value. This allows you to break out of the monad which makes it possible to use libraries previously incompatible with Lwt. =E2=80=A2 multi-domain support: run separate schedulers in separate domai= ns (some of the more advanced functions on Lwt are now domain-dependent, e.g., `run_in_main' becomes `run_in_domain' and takes one additional parameter) Feedback is very welcome. Happy beta-testing and good luck with the parallel-programming! [alpha release announce] schm-ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 schm-ocaml provides a scheme-like syntax. schm3 integrates nicely with the rescript-version that provides the ocaml syntax. schm4 integrates with one of the later ocaml 4 versions, and tries to be accessible from .c There is a tutorial: The oo got lost in a computer crash. So there is no oo. detri cmd =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There is now a fifth variant for detri: This fifth one outputs .html, in-stead of console. If you took a previous version for the console, it was already something you could do by-yourself easily rewriting the console esc-chars to html, but now there is a ready-made one. (There is also a small tutorial, but it should be re-written, ) seven ocaml tutorials =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You will find seven new ocaml-tutorials on this page that I wrote recently: It was not writen with a chat-bot, but you will maybe notice a difference in the style of writing, since I=E2=80=99m using a chat-bot. Ortac/Wrapper: a new plugin for specification driven unit testing =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charl=C3=A8ne_Gros announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello everyone, We, at Tarides, are excited to announce the release of a new plugin for `ortac': [Ortac/Wrapper]! This plugin is part of the Gospel project, a contract-based behavioural specification language for OCaml. `ortac' is a tool that converts an OCaml module interface with [Gospel] specifications into code to check those specifications. There are various ways to check specifications, all provided by plugins, and this post announces the new plugin: Ortac/Wrapper! This plugin is designed to generate a wrapped module that exposes the same interface as the original module but instruments all function calls with assertions corresponding to the Gospel specifications. The main objective is to assist with unit testing. You provide the Gospel specification for your file, and Ortac will instrument it. When you run the unit tests on the wrapped version, if a specification is violated, Ortac will crash with an explicit error, telling you which portion of your code is incorrect and which specifications were violated. This work has been started by Cl=C3=A9ment Pascutto during his PhD at LMF and Tarides . I continued his work to support some Gospel features such as the `old' operator and models. [Ortac/Wrapper] [Gospel] Installation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C To install the Wrapper plugin, use the following command: `opam install ortac-wrapper' This will install the following OPAM packages: =E2=80=A2 `ortac-core.opam' which provides the `ortac' command-line tool = and the core functionalities used by all plugins, =E2=80=A2 `ortac-runtime.opam' which provides the support library for the= code generated by the Wrapper Ortac plugin, =E2=80=A2 `ortac-wrapper.opam' which provides the Wrapper plugin for the `ortac' command-line tool. =E2=97=8A To automatically generate dune files If you need dune rules to integrate Ortac into your project, you can install the Dune plugin: `opam install ortac-dune' This will install the following OPAM packages: =E2=80=A2 `ortac-core.opam' which provides the `ortac' command-line tool = and the core functionalities used by all plugins, =E2=80=A2 `ortac-dune.opam' which provides the Dune plugin for the `ortac' command-line tool. Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Let=E2=80=99s dive into a mini tutorial to see how the Ortac/Wrapper plug= in can be used to enhance your unit testing with Gospel specifications. We=E2=80=99ll walk through creating a simple polymorphic container type with limited capacity and see how to specify and test its behavior using Gospel. =E2=97=8A 1- Define the type and models First, we define a polymorphic container type `'a t' with Gospel specifications. This type will have a fixed capacity and a mutable list of contents. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a t =E2=94=82 (*@ model capacity: int =E2=94=82 mutable model contents: 'a list =E2=94=82 with t =E2=94=82 invariant t.capacity > 0 =E2=94=82 invariant List.length t.contents <=3D t.capacity *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here, we define two models: =E2=80=A2 `capacity': Represents the fixed size of the container. =E2=80=A2 `contents': Represents the mutable list of elements currently s= tored in the container. The invariants ensure that the capacity is always positive and that the contents list never exceeds the declared capacity. =E2=97=8A 2- Specify function behavior Next, we specify the behavior of functions that manipulate the type `'a t'. We=E2=80=99ll define a `create' function to initialize the contai= ner and an `add' function to insert elements into the container. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val create: int -> 'a t =E2=94=82 (*@ t =3D create c =E2=94=82 requires c > 0 =E2=94=82 ensures t.capacity =3D c =E2=94=82 ensures t.contents =3D [] *) =E2=94=82 val add: 'a t -> 'a -> unit =E2=94=82 (*@ add t x =E2=94=82 modifies t.contents =E2=94=82 ensures t.contents =3D x :: (old t.contents) *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here the functions `create' and `add' are specified in Gospel. =E2=80=A2 The `create' function requires the capacity `c' to be strictly positive and ensures that the model of the new container has the specified capacity and an empty list of contents. =E2=80=A2 The `add' function modifies the contents of the container and ensures that the new element `x' is added to the list of contents. =E2=97=8A 3- Define projection functions To validate these specifications at runtime, you need to provide projection functions that link OCaml values to their Gospel models. Projection functions can be defined in two ways. =E2=80=A2 Using the same name as the model. =E2=80=A2 Using a different name, annotated with the attribute `@@projection_for' and the name of its Gospel model. For our example, we define the projection functions as follows. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val capacity : 'a t -> int =E2=94=82 val to_list : 'a t -> 'a list [@@projection_for contents] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Where we encounter the two types of naming. =E2=80=A2 The `capacity' function directly corresponds to the `capacity' model. =E2=80=A2 The `to_seq' function is explicitly declared as the projection = for the `contents' model using the `@@projection_for' attribute. These projection functions are mandatory for the Wrapper plugin to instrument the specifications. If any projection function is missing, nothing will be generated and an error will be printed. =E2=97=8A 4- Generate the wrapped version Once you have both of the interface file annotated with Gospel and your implementation, you can start the generation. If you have installed the `ortac-dune' package (which is recommended), you need to add the following in the dune file where you want to put the tests. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (rule =E2=94=82 (alias runtest) =E2=94=82 (mode promote) =E2=94=82 (action =E2=94=82 (with-stdout-to =E2=94=82 dune.wrapper.inc =E2=94=82 (setenv =E2=94=82 ORTAC_ONLY_PLUGIN =E2=94=82 dune-rules =E2=94=82 (run ortac dune wrapper ))))) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This will generate an additional Dune file called `dune.wrapper.inc' that you will need to include once created: `(include dune.wrapper.inc)'. Also, add the name of the wrapped module to the `libraries' stanza of the test folder. =E2=97=8A 5- Add unit tests In order to test the `Lib' module, we can now simply write a program using the wrapped version. No need to specify the expected behaviour as the instrumentation will take care of that. For example, if you run the following program: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Lib_wrapped =E2=94=82 let () =3D =E2=94=82 let q =3D create 3 in =E2=94=82 add q 1; =E2=94=82 let q2 =3D create (-1) in =E2=94=82 add q2 1; =E2=94=82 () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You will obtain the following result: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 File "lib.mli", line 8, characters 0-175: =E2=94=82 Runtime error in function ~create' =E2=94=82 - the pre-condition =E2=94=82 `c > 0' =E2=94=82 was violated. =E2=94=82 Fatal error: exception Ortac_runtime.Error(_) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This process helps ensure that your code adheres to the specified behavior, making your unit tests more robust and informative. Feel free to report =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C For more information here is the link of the [dedicated README]. If you encounter any bugs or misunderstandings, please feel free to report them as an issue on [GitHub]. We hope this plugin will be useful to you and look forward to your feedback! [dedicated README] [GitHub] Acknowledgments =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This work is partly founded by the ANR grant ANR-22-CE48-0013. Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Database Testing in OCaml: From CRUD to Connection Pool Stress Testing] =E2=80=A2 [Vulkan graphics in OCaml vs C] =E2=80=A2 [Apache Parquet Files] =E2=80=A2 [Optimising Data Access in Parquet Files] =E2=80=A2 [FreeBSD unionfs deadlock] =E2=80=A2 [A first foray into agentic coding] =E2=80=A2 [Auto-configuration of MirageOS unikernels] [the ocaml.org blog] [Upcoming OCaml Events] [Database Testing in OCaml: From CRUD to Connection Pool Stress Testing] [Vulkan graphics in OCaml vs C] [Apache Parquet Files] [Optimising Data Access in Parquet Files] [FreeBSD unionfs deadlock] [A first foray into agentic coding] [Auto-configuration of MirageOS unikernels] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 16 to 23, 2= 025.

    Introduction to the Dune build system, by OCamlPro

    OCamlPro announced

    Greetings Cameleers,

    We=E2=80=99ve just released a new blog post: OCaml Onboarding:= Introduction to the Dune build system

    This is a practical, compact guide for those starting their OCaml and Dune = journey =E2=80=94 or helping others do so. Instead of diving into internals= , we focus on what you need to know to get up and running with Dune confide= ntly.

    We walk through:

    • How Dune thinks about builds and directories
    • The role of dune files and static declarations
    • The tooling one interacts with day-to-day

    The post keeps things hands-on and beginner-focused, with just enough theor= y to make the practical bits stick. We end by circling back to dune i= nit =E2=80=94 showing how understanding the basics makes the scaffol= ding tool far more intuitive.

    =F0=9F=93=9D Read it on the OCamlPro= Blog

    Perfect for sharing with colleagues or newcomers dipping their toes into OC= aml and Dune.

    As always, feedback welcome! Until next time, =E2=80=94 The OCamlPro Team

    memprof-limits (first official release): Memory limits, alloca= tion limits, and thread cancellation, with interrupt-safe resources

    Guillaume Munch-Maccagnoni announced

    I am pleased to announce the version 0.3.0 of the package memprof-limits. The main contribution of this release is the su= pport for OCaml 5 with multiple parallel domains.

    Memprof-limits can henceforth be used to conveniently interrupt (CPU-bound)= domains in your parallel computations, using cancellation tokens, w= ith the support of features to ensure interrupt-safety and resource-safety.

    As example of uses, plans are underway to use memprof-limits to ensure the = resource-safety of user interrupts in the Rocq prover (eliminating a class = of bugs) and to add tactics for portable timeouts (that count allocations r= ather than elapsed time).

    mlfront-shell - reference implementation of a build system

    jbeckford announced

    There have been many improvements since the last update. Here are some of t= hem:

    1. The trace store (needed to not rebuild everything from scratch) has bee= n implemented.
    2. Build file ASTs are parsed, marshalled and put into a key-value directo= ry (which can be shared or cached in CI).
    3. Build keys are generated and used to protect sharing of the parsed AST.=
    4. A full walkthrough of =E2=80=9Cbuilding=E2=80=9D the 7zip executable fr= om 7zip binary assets (it is more complicated than it sounds) is on the documentation page
    5. An =E2=80=93autofix option to update build files with chec= ksums, and allowing SHA1 checksum for local files (both are for eventual su= pport of Meta=E2=80=99s watchman tool)
    6. A new format for the JSON files (many functions versus one). The old fo= rmat is deprecated.
    7. Many many bug fixes, including specification updates.

    Zanuda – OCaml linter experiment

    Continuing this thread, Kakadu announced

    Zanuda 2.0.0 with OCaml 5.3 support have hit opam.

    YOCaml, a framework for static site generator

    Xavier Van de Woestyne announced

    Release 2.5.0

    We are delighted to present the new release of YOCaml: 2.5.0! As you can see, there have been a few intermediate versions since our last = announcement. However, we have reached a new milestone: YOCaml can now be u= sed seamlessly with an Applicative API (instead of the Arrow one), making m= any tasks much easier to express!

    We have also finally taken the time to write a tutorial that explains how to use YOCaml to create a comp= lete blog, step by step, and our goal is to expand it over time to add = more and more guides! (The documentation/guide generator (https://github.com/yocaml/yocaml-www is= also written in YOCaml and gives an idea of what can be done fairly quickl= y.)

    We look forward to receiving your feedback! YOCaml is a free and collaborat= ive project, so any contributions (including the guide) are more than welco= me! We would also be DELIGHTED to see your creations with YOCaml!=20=20

    Happy Hacking!

    Lwt.6.0.0~beta (direct-style, multi-domain parallelism)

    Rapha=C3=ABl Proust announced

    After some feedback and some work, I'm happy to announce the release of lwt.6.0.0~beta00 and lwt_direct.6.0.0~beta00! (https://github.c= om/ocaml/opam-repository/pull/28558)

    major CHANGES are:

    • direct style mode (see alpha release announce): use aw= ait : 'a Lwt.t -> 'a to transform any promises into a simple valu= e. This allows you to break out of the monad which makes it possible to use= libraries previously incompatible with Lwt.
    • multi-domain support: run separate schedulers in separate domains (some= of the more advanced functions on Lwt are now domain-dependent, e.g., run_in_main becomes run_in_domain and takes one addit= ional parameter)

    Feedback is very welcome. Happy beta-testing and good luck with the paralle= l-programming!

    schm-ocaml

    Florent Monnier announced

    schm-ocaml provides a scheme-like syntax.

    schm3 integrates nicely with the rescript-version that provides the ocaml s= yntax.

    schm4 integrates with one of the later ocaml 4 versions, and tries to be ac= cessible from .c

    http://decapode314.free= .fr/ocaml2/schm/

    There is a tutorial:

    http://dec= apode314.free.fr/ocaml2/schm/schm-tut.html

    http:/= /decapode314.free.fr/ocaml2/schm/dl/schm4-0.03.zip

    The oo got lost in a computer crash.

    So there is no oo.

    detri cmd

    Florent Monnier announced

    There is now a fifth variant for detri:

    http://decapode314= .free.fr/ocaml/detris.html

    This fifth one outputs .html, in-stead of console.

    If you took a previous version for the console, it was already something yo= u could do by-yourself easily rewriting the console esc-chars to html, but = now there is a ready-made one.

    (There is also a small tutorial, but it should be re-written,

    http:= //decapode314.free.fr/ocaml/detri/tut/detri-tut.html

    )

    seven ocaml tutorials

    Florent Monnier announced

    You will find seven new ocaml-tutorials on this page that I wrote recently:

    http://decapode314.free= .fr/ocaml2/blog/

    It was not writen with a chat-bot, but you will maybe notice a difference i= n the style of writing, since I=E2=80=99m using a chat-bot.

    Ortac/Wrapper: a new plugin for specification driven unit tes= ting

    Charl=C3=A8ne_Gros announced

    Hello everyone,

    We, at Tarides, are excited to announce the release of a new plugin for ortac: Ortac/Wrapper!

    This plugin is part of the Gospel project, a contract-based behavioural spe= cification language for OCaml. ortac is a tool that converts a= n OCaml module interface with Gospel specifications into code to check those specifications. Th= ere are various ways to check specifications, all provided by plugins, and = this post announces the new plugin: Ortac/Wrapper!

    This plugin is designed to generate a wrapped module that exposes the same = interface as the original module but instruments all function calls with as= sertions corresponding to the Gospel specifications. The main objective is to assist with unit testing. You provide the Gospel s= pecification for your file, and Ortac will instrument it. When you run the = unit tests on the wrapped version, if a specification is violated, Ortac wi= ll crash with an explicit error, telling you which portion of your code is = incorrect and which specifications were violated.

    This work has been started by Cl=C3=A9ment Pascutto during his PhD at LMF a= nd Tarides https://th= eses.hal.science/tel-04696708v1. I continued his work to support some Gospel features such as the old<= /code> operator and models.

    Installation

    To install the Wrapper plugin, use the following command: opam install ortac-wrapper

    This will install the following OPAM packages:

    • ortac-core.opam which provides the ortac comm= and-line tool and the core functionalities used by all plugins,
    • ortac-runtime.opam which provides the support library for = the code generated by the Wrapper Ortac plugin,
    • ortac-wrapper.opam which provides the Wrapper plugin for t= he ortac command-line tool.
    • To automatically generate dune files

      If you need dune rules to integrate Ortac into your project, you can instal= l the Dune plugin: opam install ortac-dune This will install the following OPAM packages:

      • ortac-core.opam which provides the ortac comm= and-line tool and the core functionalities used by all plugins,
      • ortac-dune.opam which provides the Dune plugin for the ortac command-line tool.

    Try it!

    Let=E2=80=99s dive into a mini tutorial to see how the Ortac/Wrapper plugin= can be used to enhance your unit testing with Gospel specifications. We=E2= =80=99ll walk through creating a simple polymorphic container type with lim= ited capacity and see how to specify and test its behavior using Gospel.

    • 1- Define the type and models

      First, we define a polymorphic container type 'a t with Gospel= specifications. This type will have a fixed capacity and a mutable list of= contents.

      type 'a t
      (*@ model capacity: int
              mutable model contents: 'a list
              with t
              invariant t.capacity > 0
              invariant List.length t.contents <=3D t.capacity *)
      

      Here, we define two models:

      • capacity: Represents the fixed size of the container.
      • contents: Represents the mutable list of elements currentl= y stored in the container.

      The invariants ensure that the capacity is always positive and that the con= tents list never exceeds the declared capacity.

    • 2- Specify function behavior

      Next, we specify the behavior of functions that manipulate the type '= a t. We=E2=80=99ll define a create function to initiali= ze the container and an add function to insert elements into t= he container.

      val create: int -&=
      gt; 'a t
      (*@ t =3D create c
              requires c > 0
              ensures t.capacity =3D c
              ensures t.contents =3D [] *)
      val add: 'a t -> 'a -> unit
      (*@ add t x
              modifies t.contents
              ensures t.contents =3D x :: (old t.contents) *)
      

      Here the functions create and add are specified i= n Gospel.

      • The create function requires the capacity c t= o be strictly positive and ensures that the model of the new container has = the specified capacity and an empty list of contents.
      • The add function modifies the contents of the container an= d ensures that the new element x is added to the list of conte= nts.
    • 3- Define projection functions

      To validate these specifications at runtime, you need to provide projection= functions that link OCaml values to their Gospel models. Projection functi= ons can be defined in two ways.

      • Using the same name as the model.
      • Using a different name, annotated with the attribute @@projection= _for and the name of its Gospel model.

      For our example, we define the projection functions as follows.

      val capacity : 'a =
      t -> int
      val to_list : 'a t -> 'a list [@@projection_for contents]
      

      Where we encounter the two types of naming.

      • The capacity function directly corresponds to the ca= pacity model.
      • The to_seq function is explicitly declared as the projecti= on for the contents model using the @@projection_for attribute.

      These projection functions are mandatory for the Wrapper plugin to instrume= nt the specifications. If any projection function is missing, nothing will = be generated and an error will be printed.

    • 4- Generate the wrapped version

      Once you have both of the interface file annotated with Gospel and your imp= lementation, you can start the generation. If you have installed the ortac-dune package (which is recomme= nded), you need to add the following in the dune file where you want to put= the tests.

      (rule
       (alias runtest)
       (mode promote)
       (action
        (with-stdout-to
         dune.wrapper.inc
         (setenv
          ORTAC_ONLY_PLUGIN
          dune-rules
          (run ortac dune wrapper <path to lib/lib.mli>)))))
      

      This will generate an additional Dune file called dune.wrapper.inc that you will need to include once created: (include dune.wrappe= r.inc). Also, add the name of the wrapped module to the librar= ies stanza of the test folder.

    • 5- Add unit tests

      In order to test the Lib module, we can now simply write a pro= gram using the wrapped version. No need to specify the expected behaviour a= s the instrumentation will take care of that.

      For example, if you run the following program:

      open Lib_wrapped
      let () =3D
        let q =3D create 3 in
        add q 1;
        let q2 =3D create (-1) in
        add q2 1;
        ()
      

      You will obtain the following result:

      File "lib.mli", line 8, characters 0-175:
      Runtime error in function ~create'
        - the pre-condition
            `c > 0'
          was violated.
      Fatal error: exception Ortac_runtime.Error(_)
      

      This process helps ensure that your code adheres to the specified behavior,= making your unit tests more robust and informative.

    Feel free to report

    For more information here is the link of the dedicated README. If you encounter any bugs or misunderstandings, please feel free to report = them as an issue on GitHub.

    We hope this plugin will be useful to you and look forward to your feedback!

    Acknowledgments

    This work is partly founded by the ANR grant ANR-22-CE48-0013.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=celY8ZF6; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=TcPMMa2s; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 7DBED40085 for ; Tue, 30 Sep 2025 13:12:17 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=sLdNJ4Kxvh9e169tECTtyC5+15PVPcFQ1WoF9ezujAs=; b=celY8ZF6jDy+4BcWvh81VGvQ1TuC2R0V+9U7ANWI7hHytNfRVIuzFEY5 rVBWHRfIIDFgoGOKNjVr02UyzoDUNRhc2GtR+u4wyJGmh/EtLHmgJ1Ejq huJhxv0SAJduuXyCvevfPFVGbncfxIGC8LMIaeXvx7POcKl6pca3BB4Ew M=; X-CSE-ConnectionGUID: HcY7jb7MT8eCOClxzdqUfQ== X-CSE-MsgGUID: X02netXSTUOOtaR7xzTyVw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,304,1751234400"; d="scan'208,217";a="241786087" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Sep 2025 15:12:17 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id C3C2DE0CDA; Tue, 30 Sep 2025 15:12:16 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 65FFAE0171 for ; Tue, 30 Sep 2025 15:12:14 +0200 (CEST) X-CSE-ConnectionGUID: nVt0eUYXSpS5KNb1EK/Mvw== X-CSE-MsgGUID: lRZGgHN3TOqFO91MNJok3g== IronPort-SDR: 68dbd72b_qwswg9X8N/tEX++ZDtKHTF1dNmqcBrEWsooTdtMKOrk6po4 0vOeifD3bQpv8fpMB+jQdy5XsZ/o5sQ586l5KYg== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EbAwCP1ttohSIeaIFaAhSCRoE9WygZAWhaMwcISQNAH?= =?us-ascii?q?oM4PIFjgWyLQoJgA4oQhzqKe4FpgSwWAiEVAQMBDS4BGwQBAgQBAQMBAgGCD?= =?us-ascii?q?IE9cUYCjEYCHwYBBDMGDgECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBA?= =?us-ascii?q?gQGAQIQAQEBAUBJhhUBBQEzDYJFGThxZQk3AQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAECBQsRBAlNAQEEDQ4BCAoTA?= =?us-ascii?q?QEpAwMJBBQjAwoBCQEGAwIRATUXARIUBgFiggUBgiICKCYDBQwEApoEmnsaN?= =?us-ascii?q?3qBMoEBggwBAQaBCD4CAQIJAgJAAdoMgWQJgUmFbYJKGgEFJUlrAoRHCYQxA?= =?us-ascii?q?icPgVVEgRU1gXNRb4FQLgUoFAQHDAsBAQEBAYEfBAUBEQIBBhQPJAkSAgSDD?= =?us-ascii?q?YJpgiaBAhQdgTiCOU1ubYEiQIIXhToMPH2BMkyBNYpVgURLMywBVRMXCwcFW?= =?us-ascii?q?4EIAyo0MW4yHYEnhQuEHitPhQKBGINTERNrDwaBFYNbiXEPegMLbT03FBuYV?= =?us-ascii?q?xcrGWoBFYFSASUOOAgGDxQFDiQJCgcOBQgMCAwCAQENEwINKQ4fBQYBCgUQB?= =?us-ascii?q?BEIDQUFBAQXChoFBgsLAh4HBgIDgRGDT41rAwklAx0NBY9XiyyCbJNZHW00B?= =?us-ascii?q?4QfgV4GDIkIgSaODIQjg1eEBIFXizyHApJSIphkIoEJgS2HJ4EmCYFvH0yVN?= =?us-ascii?q?CwjhTaBUiwkSSM/AR0DCQczGjBDgjMBATIJRhwPWIZKhUSBGS0BFoESAQMEA?= =?us-ascii?q?YIbKE1xgSaBOzEIO32BacBXQTUBAQEBBAMDAS0CBwEKAQEDCYViAQGMBgImB?= =?us-ascii?q?wVrYAEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:ei9xyq/ptH7O4IR/P7Ruk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: =?us-ascii?q?9a23=3AbH9A6WtQco4jZ7f7L2DYZqAS6IsjTGGFwUrhE3S?= =?us-ascii?q?gMjtKbrfMZHzX3b17xp8=3D?= X-Talos-MUID: 9a23:sb1qtQaZv3pqEOBTswXeqz5CEpxUxL2ALxFUtLMkvMrfOnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,304,1751234400"; d="scan'208,217";a="126940939" X-MGA-submission: =?us-ascii?q?MDG1cvSuhTQfZc7MR0ZIZrV7mZ6ob4RGjJpQpD?= =?us-ascii?q?RB/VRIWl7hpx9Zmr4Do89i9pUG1sGXO6Euyr43wwjnBiqvKC+9p4Nyfk?= =?us-ascii?q?poUMTXh1dXFQIAuiagMImJHDiV1BdKLBx3hf1oiBTFDj6KEhcVaRfUw5?= =?us-ascii?q?q8DmH0EK1BN2ixQk6U4Jgf3g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Sep 2025 15:12:11 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id AB6001A310; Tue, 30 Sep 2025 15:12:10 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1759237930; bh=dMlOpk901avLDwRl65rVj+Q6LID5eAFMZs6bH5gBplg=; h=From:To:Subject:Date:Message-ID; b=TcPMMa2sQgm4eYbmZtkhp7r6aWyCaXLvziuu6QHRBQYQjMOnjc6+OFewEvS+voNiu 7Io1T2w4DaM21tRRhSXWT1D9ZViNqWGEX74rUx3IjSx4eYia+DVsapUSyZpwrCBNrd 974foKa7RrlsbRlOWBPrft1xqBVNyM9ht7M2jSgQ= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 30 Sep 2025 15:12:09 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Sep 30 15:12:10 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.471941, queueID=CB8DE1A311 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19381 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 23 to 30, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 OCaml security team ocaml-xmlerr 0.08.2 available Contract OCaml Engineer =E2=80=93 Terrateam (Remote, 3 months) Mk-man module gil scm .cmd mini-svg version 0.03.13b, of 0.03.13 An efficient priority queue with low integer priorities Cmdliner 2.0.0 Detrow, a command-line calendar rpmfile 0.8.0+ library OCaml compiler office hours? (preparation thread) Other OCaml News Old CWN OCaml security team =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear everyone, We are starting an effort to push security into OCaml. This is based on discussions in the OCaml Software Foundation with industry partners. The main goal is to have best practises similar to those of other programming language ecosystems. Reporting security issues =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This entails a point of contact for the security team - which deals with communication between the person who found a security-relevant problem in OCaml software (named "reporter"), who can then contact us - the security team - instead of using a public bug tracker, and the upstream OCaml developer(s). We, the security team, will establish the three-way communication, and since we have a documented security disclosure process (which will be published soon), we will guide everyone through the process and ensure that timelines are met, CVE numbers are assigned, =E2=80=A6 Team composition =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml security team currently consists of individual security experts and individuals representing company sponsors of the OCaml Software Foundation. Individual members participating on a personal capacity may be compensated for their time from the OCaml Software Foundation. The team currently consists of 7 members =E2=80=A2 Hannes Mehnert - individual, chair =E2=80=A2 Mindy - individual =E2=80=A2 Joe - individual =E2=80=A2 Edwin T=C3=B6r=C3=B6k - individ= ual =E2=80=A2 Nicol=C3=A1s Ojeda B=C3=A4r - LexiFi =E2=80=A2 Louis Roch=C3=A9 - ahrefs =E2=80=A2 Maxim Grankin - Bloomberg We're in the process to formalise the responsibilities of the team, our proposed disclosure process, and how to join & leave the team. Funding for security actions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C In complement to the security disclosure process, we will accept funding requests for projects that make OCaml more secure (including guidelines how to develop OCaml in a secure way/what are common pitfalls; static analysis; dissemination tools; =E2=80=A6). The OCaml Sof= tware Foundation will provide funding for these security actions. After this summer we will discuss this in more depth with the community. Next steps =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C We will setup a website (similar to has) soon, and provide an email address for contacting us - security At ocamlDoT org is forwarding to our team. We plan to setup a mailing list for security announcements. But more on that at a later point, this brief post is mainly about the fact that this team starts to exist now, and is working on improving the security story of OCaml. If you have any questions for now, please feel free to discuss them in this announcement. Please be aware that it is vacation time soon, so we may not be very responsive. Hannes Mehnert later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Dear everyone, we=E2=80=99ve accomplished several tasks: =E2=80=A2 is now live =E2=80=A2 The public mailing list for security advisories is sympa.inria.fr/sympa/info/ocsf-ocaml-security-announcements =E2=80=93 p= lease subscribe if you=E2=80=99d like to receive security announcements =E2=80=A2 There=E2=80=99ll be a brief introduction at [Fun OCaml] and a t= alk at [OCaml workshop (ICFP)] )16:00 - 16:30 =E2=80=A2 We will have a public meeting for discussions on Oct 22nd 14:00= - 16:00 CEST (online, yet to be announced where) =E2=80=A2 There=E2=80=99s already the OCaml security advisory database (still empty, we=E2=80= =99ll fill it over the next weeks) [Fun OCaml] [OCaml workshop (ICFP)] Hannes Mehnert then said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We will have a public meeting for discussions on Oct 22nd 14:00 - 16:00 CEST (online, yet to be announced where) =E2=80=93 save the date if you=E2=80=99re interested We settled on a platform, and will have the meeting at An agenda will be posted before the meeting. ocaml-xmlerr 0.08.2 available =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is an annouce for ocaml-xmlerr. *ocaml-xmlerr* version *0.08.2* is *available*. This main module of this package is a small module to read xml with errors. The main purpose was not to really read xml with errors, but to read html from the web. At the beginning I wrote in the read-me file that I wrote it in one afternoon, but this is without considering that in fact it was the third time I was trying to make something like this. One of the first attempt even probably took me almost a day. So we can not say that I succeed easily. In the .zip archive of ocaml-xmlerr version 0.08.2, you will find the different modules re-organized with dirs. And there are also two additional commands build on top of the first module. *htmlxtr* is a simple extractor for HTML from a simple template. Please read the man page for more description about how to use it: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ man ./htmlxtr.1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There is also *htmluxtr* - a simple extractor for .html using a simple un-template / re-template method. Please read the man page for more informations : =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ man ./htmluxtr.1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There is a new example of use provided in the 'using' directory. There is a script to help you writing your pattern matching of xml fragments. The base module providing a list for tags and contents, the pattern matching is not done based on a tree-structure. And there is now an additional module to convert this flat-list structure into a tree structure, inside the addon directory. The report module has not been widely tested yet. This is not professional quality. If I'm not mistaken "amateur" is both pejorative, in both french and in english languages, exept if it's associated with "astronomer". [http://decapode314.free.fr/ocaml/xmlerr/] PS: if you edit my posts, I would prefer you edit the links with normal links (like above), please. PS-2 : I haven't been able to pattern-match all the opam packages with uxtr, the total doesn't match, I only find 38_000. [http://decapode314.free.fr/ocaml/xmlerr/] Contract OCaml Engineer =E2=80=93 Terrateam (Remote, 3 months) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Josh Pollara announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Terrateam () is looking for an experienced OCaml engineer to join us on a 3-month contract. *About us* Terrateam is an open-source tool for GitOps-based Terraform automation. We are a small, bootstrapped team building infrastructure automation software used by enterprises. *The role* We are extending our OCaml codebase to support new functionality around Terraform state and plan execution. The work is primarily in OCaml, with a focus on systems programming, concurrency, and backend development. You=E2=80=99ll work directly with the founding t= eam on scoped engineering projects and help push forward the internals of how Terraform can be used at scale. *Details* =E2=80=A2 Contract length: 3 months (with potential extension) =E2=80=A2 Compensation: competitive, commensurate with experience =E2=80=A2 Location: remote (EU timezone preferred) =E2=80=A2 Start date: as soon as possible *Requirements* =E2=80=A2 Strong background in OCaml development =E2=80=A2 Experience with systems programming or infrastructure tooling (Terraform or related) is a plus =E2=80=A2 Ability to work independently in a fast-moving environment If you are interested, please contact me directly at [josh@terrateam.io]. [josh@terrateam.io] Mk-man module =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Mk-man tries to provide a simple way to write a man page, [http://decapode314.free.fr/ocaml2/mk_man/] and also with a similare module to produce the web page. [http://decapode314.free.fr/ocaml2/mk_man/] gil scm .cmd =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Gil-scm is not really an scm, (source management control), [http://decapode314.free.fr/ocaml2/gil/] it takes its inspiration from an scm, but it should more be considerated as a "snapshot-management-script". It can output an .html interface of the following versions: [example] [http://decapode314.free.fr/ocaml2/gil/] [example] mini-svg version 0.03.13b, of 0.03.13 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The release "0.03.13" has been deleted, because chat-gpt informed me that the repository replicating some mondrian art hosted at github has been deleted. The rel-0.03.13 was also containing some pop-art replications, with random additions. So these elements have been deleted, and are not there in "0.03.13b" anymore. Sorry for the inconveniance. PS: [mini-svg] PS2: mini-svg is not professional quality. PS3: To the extent permitted by law, you can use mini-svg with any spdx license. [mini-svg] An efficient priority queue with low integer priorities =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hello, I am happy to announce the release of `intPQueue', a package that offers (two variants of) an efficient priority queue, which is restricted to scenarios where the priorities are low integers. See the [documentation]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update && opam install intPQueue =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Happy queueing, Fran=C3=A7ois. [documentation] Cmdliner 2.0.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, It is my pleasure to announce the release of cmdliner 2.0.0. Cmdliner is a library that allows the declarative definition of command line interfaces with outstanding support for command line interface user conventions and standards. The main points of this release are: =E2=80=A2 ANSI styled error and deprecation messages ([details]) =E2=80=A2 Support for manpage installation ([details]) =E2=80=A2 Support for shell auto-completion ([details]) The latter was made possible by good initial [ground work] of @andreypopp who can now claim to have unblocked my mind and the [very first] and 11 years old Cmdliner issue. Many thanks to him! This addition has the following consequences: 1. The problematic feature that allowed you to specify command names, option names and enumerant values by a prefix if the prefix was unambiguous has now been removed. See [this issue] for the rationale. Set `CMDLINER_LEGACY_PREFIXES=3Dtrue' in your environment if you find yourself in need of a quick backward compatibility fix because one of your scripts is failing due to a prefix being used (but do eventually correct the script!). 2. It finally triggered making the type `Arg.conv' abstract as [announced] it would become in 2017. See [this issue] for details. If you are a user of cmdliner based tools. You may want to have at a look how to [configure your shell] in order to benefit from their completion scripts, especially if said tools are installed via `opam'. After installing `cmdliner' you should be able to check that your configuration works correctly on the new `cmdliner' tool that now gets installed with cmdliner itself. For other changes that may affect you or your users please head to the [release notes] which have many other details. Other than that a full pass was made over the documentation to try to improve and bring it up-to-date with the latest style and additions. Notably the [tutorial] and [examples] were updated to make use of the binding operators; however obscure [let punning] may feel, these are less error prone as your number of cli arguments grow. I also added a [cookbook] which tries to distill in shorter snippets some of cmdliner's features and the experience I gathered over the past 14 years of using cmdliner to define dozens of command line interfaces. It includes [source code structure tips] and a few bootstrapping [blueprints] to cut and paste for when you start your next command line tool. For this release I'm very thankful to a private one-time donation[^1], a grant from the [OCaml software foundation] and, as always, my few but faithfull [donors]. All of which are essential for these releases to eventually get out. They do take quite a bit longer to devise that one would expect :=E2=80=93) Home page: API docs & manuals: or `odig doc cmdliner' Install: `opam install cmdliner' (once [the PR] is merged, may take a few days) Best, Daniel [^1]: Which are as nice as recurring donations ;=E2=80=93) [details] [details] [details] [ground work] [very first] [this issue] [announced] [this issue] [configure your shell] [release notes] [tutorial] [examples] [let punning] [cookbook] [source code structure tips] [blueprints] [OCaml software foundation] [donors] [the PR] Daniel B=C3=BCnzli later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 To follow up on the completion feature. It should be stressed that I don't consider it to be fully "done" as it stands. I'm pretty sure the completion API, protocol, features and the generic completion scripts can be improved. The main problem is that it seems shell programmers are more interested in cajoling the look of their prompts than defining sane cross-shell standard protocols for tool/shell interaction. The current completion mecanisms are [broken] beyond imagination. Issues about completion are tagged accordingly in the issue tracker. Do not hesitate to chime in if you have ideas or more knowledge than I do for improvements. I'm also happy to add support for more shells but it's better if you help for that because working with shells makes me want to throw my computer out of the window. Meanwhile I'd like to show two completion feature that I'm quite happy to have support for in this release. [broken] Context sensitive completion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C The idea here, suggested by @andreypopp, is that completion can depend on a context that is specified via a cmdliner term itself. This is typically useful for configuration dependent completions: you have a cmdliner term that represents your configuration and you access it when doing a completion. For example in the next release of `odig' you can autocomplete package names on `odig doc [PKG]'. The available packages depend on looking up a libdir which can be specified with a command line argument itself. So for example this completes according to the automatic libdir lookup =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Auto discovered libdir =E2=94=82 > odig doc c=E2=90=89 =E2=94=82 camlp-streams checkseum cmarkit camlpdf cairo2=20=20 =E2=94=82 containers cmdliner cpuid cppo cpdf=20=20=20=20 =E2=94=82 cstruct-lwt cstruct ctypes crunch csexp=20=20=20 =E2=94=82 ctypes-foreign=20=20=20=20=20=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 But the following looks for packages in another switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Explicit libdir =E2=94=82 > odig doc c=E2=90=89 --lib-dir $(opam var lib --switch=3Dmyswi= tch)=20 =E2=94=82 capitalization cerberus-lib calendar charon=20=20=20=20=20= =20=20=20 =E2=94=82 core_kernel core_unix cmdliner cppo core=20=20 =E2=94=82 cstruct csexp=20=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [The commit] that implements this in `odig' is rather straightforward, it simply reuses the existing `conf' term for the completion context. Also the cookbook has a [simple self-contained example] to start from. [The commit] [simple self-contained example] Compositional completion (restart and raw) =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The second completion feature is to retain completion on the tools that another tool invokes =E2=80=93 commands like `sudo'. For example in the `b0' tool, the build system I'm using for all my developments. The `b0 vcs [OPTION]=E2=80=A6 -- VCS [ARG]=E2=80=A6' comman= d allows to bulk operate the VCSs of the projects you included in a `B0.ml' build description file. Using appopriate cmdliner completion directives the completion of this command first completes the `VCS' enum (which can be `git' or `hg') and then gracefully drops back to the completion of your VCS: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 > b0 vcs -- =E2=90=89 =E2=94=82 git hg -- =E2=94=82 > b0 vcs -- git sh=E2=90=89 =E2=94=82 shell -- restricted login shell for GIT-only SSH access =E2=94=82 shortlog -- summarize git log output =E2=94=82 show -- show various types of objects =E2=94=82 show-branch -- show branches and their commits =E2=94=82 show-index -- show packed archive index =E2=94=82 show-ref -- list references in a local repository =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is a [restart] completion type. It restarts the completion context as if the cli started after the `--' token. It is the kind of behaviour you want from e.g. `opam exec', though arguably in the case of `opam exec' it will be sligthly misleading since completions will occur using the outer environment rather than the one setup by `opam exec -- TOOL [ARG]=E2=80=A6'. Still, sometimes inaccurate completion is better than no completion. Note that this would be quite easy to solve with a good cross-shell completion standard: just invoke `TOOL' in the environment setup by `opam exec' according to the completion standard (e.g. the [cmdliner completion protocol]) and propagate the result back in the completion for `opam exec', but we do not live in that world. Still the API is ready for such a technique to be used, by using a [raw] completion type (I [use this] in `b0' to complete custom, library and user-defined, actions like `b0 -- .opam' or `b0 -- .ocaml'). [restart] [cmdliner completion protocol] [raw] [use this] Detrow, a command-line calendar =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [Detrow] is a command-line calendar which displays the months of a calendar in colomns. (So each days of months are aligned in rows) (With [Detris], months are displayed in a similar way than the cal unix command.) You can download it with the following command: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 wget http://decapode314.free.fr/ocaml2/detrow/dl/0.01b/detrow.ml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Then you can call it like this: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml detrow.ml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It will display the first half of the month, Januray until June. If you want the second half of the year, Jully until December, you can call it again with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml detrow.ml b =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The first half, can also be called with the "a" parameter: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml detrow.ml a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you call it like this: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml detrow.ml ann-file 2025 b =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With the file called "ann-file" containing: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ cat ann-file =E2=94=82 2025-09-27: detrow-ann =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You will see the string `"detrow-ann"` displayed in the calendar in front of the day `"2025-09-27"`. (The number of chars that can be displayed is lower than 8 (`< 8').) [Detrow] [Detris] rpmfile 0.8.0+ library =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hello, I am pleased to announce the next /major/ version of [my library for reading RPM packages], powered by [Angstrom]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # #require "rpmfile";; =E2=94=82=20 =E2=94=82 # let pkg =3D=20 =E2=94=82 In_channel.with_open_bin=20 =E2=94=82 "hello-2.12.2-2.fc43.x86_64.rpm"=20 =E2=94=82 Rpmfile.Reader.of_channel =E2=94=82 |> Result.get_ok;; =E2=94=82=20 =E2=94=82 # Rpmfile.View.name pkg;; =E2=94=82 - : string =3D "hello" =E2=94=82=20 =E2=94=82 # Rpmfile.View.vendor pkg;; =E2=94=82 - : string =3D "Fedora Project" =E2=94=82=20 =E2=94=82 # Rpmfile.View.version pkg;; =E2=94=82 - : string =3D "2.12.2" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release has *broken the previous API* and made it simpler and more compact. Added capture of the payload of the RPM package body. But it is not effective enough. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # pkg.payload;; =E2=94=82 - : string option =3D None =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 You can implement this functionality manually using [Lwt] and angstrom-lwt-unix or something else. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* examples/extract_payload_by_lwt.ml *) =E2=94=82=20 =E2=94=82 let default_tags_selector =3D =E2=94=82 Rpmfile.Reader. =E2=94=82 { =E2=94=82 predicate_signature_tag =3D Fun.const true; =E2=94=82 predicate_header_tag =3D Fun.const true; =E2=94=82 } =E2=94=82=20 =E2=94=82 let pkg_parser =3D =E2=94=82 Rpmfile.Reader.make_package_parser ~capture_payload:false =E2=94=82 ~tags_selector:default_tags_selector =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let open Lwt.Syntax in =E2=94=82 Lwt_main.run =E2=94=82 @@ =E2=94=82 let* ic =3D Lwt_io.open_file ~mode:Input "hello.rpm" in =E2=94=82 let* _pkg =3D =E2=94=82 let* b, r =3D Angstrom_lwt_unix.parse pkg_parser ic in =E2=94=82 let+ _ =3D Lwt_io.set_position ic (Int64.of_int b.off) in =E2=94=82 Result.get_ok r =E2=94=82 in =E2=94=82 let* payload =3D Lwt_io.read ic in =E2=94=82=20 =E2=94=82 (* ... *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A6 :pie: [my library for reading RPM packages] [Angstrom] [Lwt] OCaml compiler office hours? (preparation thread) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Given the current votes, I propose to pick *Friday October 10th* UTC 11:00 =E2=80=93 UTC 12:30* as the time slot for this test run of OCaml compiler office hours. Save the date! I propose to try [This online meeting room] (this is a BigBlueButton instance hosted by the French government for public workers), and take notes on [this collaborative pad]. I am planning to join audio-only to save bandwidth, but people are free to do as they prefer. A reminder on the format, topic: Format: a synchronous remote meeting (voice with optional video), backed by a collaborative pad to record questions, take notes, share links etc. People can join and leave at any time during the office hours. Topic: anything related to the development of the OCaml compiler, that is, the github/ocaml/ocaml project. (All topics and questions are welcome, at all levels of knowledge and familiarity with the compiler.) [This online meeting room] [this collaborative pad] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [A second foray into agentic coding] =E2=80=A2 [Model Validation & Time Utilities Sprint: From Basic Models to Proper Validation Layer] =E2=80=A2 [Parsimoni Joins Techstars' Autumn 2025 Programme!] =E2=80=A2 [Retrofitting a build system into a compiler] =E2=80=A2 [Caching opam solutions - part 2] =E2=80=A2 [Upcoming OCaml Events] [the ocaml.org blog] [A second foray into agentic coding] [Model Validation & Time Utilities Sprint: From Basic Models to Proper Validation Layer] [Parsimoni Joins Techstars' Autumn 2025 Programme!] [Retrofitting a build system into a compiler] [Caching opam solutions - part 2] [Upcoming OCaml Events] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 23 to 30, 2= 025.

    OCaml security team

    Hannes Mehnert announced

    Dear everyone,

    We are starting an effort to push security into OCaml. This is based on dis= cussions in the OCaml Software Foundation with industry partners. The main = goal is to have best practises similar to those of other programming langua= ge ecosystems.

    Reporting security issues

    This entails a point of contact for the security team - which deals with co= mmunication between the person who found a security-relevant problem in OCa= ml software (named "reporter"), who can then contact us - the security team= - instead of using a public bug tracker, and the upstream OCaml developer(= s).

    We, the security team, will establish the three-way communication, and sinc= e we have a documented security disclosure process (which will be published= soon), we will guide everyone through the process and ensure that timeline= s are met, CVE numbers are assigned, …

    Team composition

    The OCaml security team currently consists of individual security experts a= nd individuals representing company sponsors of the OCaml Software Foundati= on. Individual members participating on a personal capacity may be compensa= ted for their time from the OCaml Software Foundation.

    The team currently consists of 7 members

    We're in the process to formalise the responsibilities of the team, our pro= posed disclosure process, and how to join & leave the team.

    Funding for security actions

    In complement to the security disclosure process, we will accept funding re= quests for projects that make OCaml more secure (including guidelines how t= o develop OCaml in a secure way/what are common pitfalls; static analysis; = dissemination tools; …). The OCaml Software Foundation will provide = funding for these security actions. After this summer we will discuss this = in more depth with the community.

    Next steps

    We will setup a website (similar to https://www.haskell.org/security/ has) soon, and provide an emai= l address for contacting us - security At ocamlDoT org is forwarding to our= team. We plan to setup a mailing list for security announcements.

    But more on that at a later point, this brief post is mainly about the fact= that this team starts to exist now, and is working on improving the securi= ty story of OCaml.

    If you have any questions for now, please feel free to discuss them in this= announcement. Please be aware that it is vacation time soon, so we may not= be very responsive.

    Hannes Mehnert later added

    Dear everyone,

    we=E2=80=99ve accomplished several tasks:

    • https://ocaml.org/security i= s now live
    • The public mailing list for security advisories is sympa.inria.fr/sympa= /info/ocsf-ocaml-security-announcements =E2=80=93 please subscribe if you= =E2=80=99d like to receive security announcements
    • There=E2=80=99ll be a brief introduction at Fun OCaml and a talk at OCaml workshop (ICFP) )16:00 - 16:30
    • We will have a public meeting for discussions on Oct 22nd 14:00 - 16:00= CEST (online, yet to be announced where)
    • There=E2=80=99s already the OCaml security advisory database https://github.com/ocaml/sec= urity-advisories (still empty, we=E2=80=99ll fill it over the next week= s)

    Hannes Mehnert then said

    We will have a public meeting for discussions on Oct 22nd 14:00 - 16:00 CES= T (online, yet to be announced where) =E2=80=93 save the date if you=E2=80= =99re interested

    We settled on a platform, and will have the meeting at https://meet.bornhack.dk/OCamlS= ecurityPublicMeeting

    An agenda will be posted before the meeting.

    ocaml-xmlerr 0.08.2 available

    Florent Monnier announced

    This is an annouce for ocaml-xmlerr.

    ocaml-xmlerr version 0.08.2 is available.

    This main module of this package is a small module to read xml with errors.

    The main purpose was not to really read xml with errors, but to read html f= rom the web.

    At the beginning I wrote in the read-me file that I wrote it in one afterno= on, but this is without considering that in fact it was the third time I wa= s trying to make something like this.

    One of the first attempt even probably took me almost a day. So we can not = say that I succeed easily.

    In the .zip archive of ocaml-xmlerr version 0.08.2, you will find the diffe= rent modules re-organized with dirs.

    And there are also two additional commands build on top of the first module.

    htmlxtr is a simple extractor for HTML from a simple template. Please read the man page for more description about how to use it:

    $ man ./htmlxtr.1
    

    There is also htmluxtr - a simple extractor for .html using a simple= un-template / re-template method. Please read the man page for more informations :

    $ man ./htmluxtr.1
    

    There is a new example of use provided in the 'using' directory.

    There is a script to help you writing your pattern matching of xml fragment= s. The base module providing a list for tags and contents, the pattern matchin= g is not done based on a tree-structure.

    And there is now an additional module to convert this flat-list structure i= nto a tree structure, inside the addon directory. The report module has not= been widely tested yet.

    This is not professional quality.

    If I'm not mistaken "amateur" is both pejorative, in both french and in eng= lish languages, exept if it's associated with "astronomer".

    http://deca= pode314.free.fr/ocaml/xmlerr/

    PS: if you edit my posts, I would prefer you edit the links with normal lin= ks (like above), please.

    PS-2 : I haven't been able to pattern-match all the opam packages with uxtr= , the total doesn't match, I only find 38_000.

    Contract OCaml Engineer =E2=80=93 Terrateam (Remote, 3 months)=

    Josh Pollara announced

    Terrateam (https://terrateam.io) is lo= oking for an experienced OCaml engineer to join us on a 3-month contract.

    About us Terrateam is an open-source tool for GitOps-based Terraform automation. We = are a small, bootstrapped team building infrastructure automation software = used by enterprises.

    The role We are extending our OCaml codebase to support new functionality around Ter= raform state and plan execution. The work is primarily in OCaml, with a foc= us on systems programming, concurrency, and backend development. You=E2=80= =99ll work directly with the founding team on scoped engineering projects a= nd help push forward the internals of how Terraform can be used at scale.

    Details

    • Contract length: 3 months (with potential extension)
    • Compensation: competitive, commensurate with experience
    • Location: remote (EU timezone preferred)
    • Start date: as soon as possible

    Requirements

    • Strong background in OCaml development
    • Experience with systems programming or infrastructure tooling (Terrafor= m or related) is a plus
    • Ability to work independently in a fast-moving environment

    If you are interested, please contact me directly at josh@terrateam.io.

    Mk-man module

    Florent Monnier announced

    Mk-man tries to provide a simple way to write a man page, http://decapode314.fr= ee.fr/ocaml2/mk_man/ and also with a similare module to produce the web page.

    gil scm .cmd

    Florent Monnier announced

    Gil-scm is not really an scm, (source management control), http://decapo= de314.free.fr/ocaml2/gil/ it takes its inspiration from an scm, but it should more be considerated as= a "snapshot-management-script". It can output an .html interface of the following versions: example<= /a>

    mini-svg version 0.03.13b, of 0.03.13

    Florent Monnier announced

    The release "0.03.13" has been deleted, because chat-gpt informed me that t= he repository replicating some mondrian art hosted at github has been delet= ed. The rel-0.03.13 was also containing some pop-art replications, with ran= dom additions.

    So these elements have been deleted, and are not there in "0.03.13b" anymor= e.

    Sorry for the inconveniance.

    PS: mini-svg

    PS2: mini-svg is not professional quality.

    PS3: To the extent permitted by law, you can use mini-svg with any spdx lic= ense.

    An efficient priority queue with low integer priorities

    Fran=C3=A7ois Pottier announced

    Hello,

    I am happy to announce the release of intPQueue, a package tha= t offers (two variants of) an efficient priority queue, which is restricted= to scenarios where the priorities are low integers. See the documentation.

    opam update && opam install intPQueue
    

    Happy queueing, Fran=C3=A7ois.

    Cmdliner 2.0.0

    Daniel B=C3=BCnzli announced

    Hello,=20

    It is my pleasure to announce the release of cmdliner 2.0.0.=20

    Cmdliner is a library that allows the declarative definition of command lin= e interfaces with outstanding support for command line interface user conve= ntions and standards.

    The main points of this release are:

    • ANSI styled error and deprecation messages (details)
    • Support for manpage installation (details)
    • Support for shell auto-completion (details)

    The latter was made possible by good initial ground work of @andreypopp who can now clai= m to have unblocked my mind and the very first and 11 years old Cmdliner issue. Many tha= nks to him!

    This addition has the following consequences:=20

    1. The problematic feature that allowed you to specify command names, opti= on names and enumerant values by a prefix if the prefix was unambiguous has= now been removed. See this issue for the rationale. Set CMDLINER_LEGACY_PREFIXE= S=3Dtrue in your environment if you find yourself in need of a quick= backward compatibility fix because one of your scripts is failing due to a= prefix being used (but do eventually correct the script!).
    2. It finally triggered making the type Arg.conv abstract as = announced it would become in 2017. See this issue fo= r details.

    If you are a user of cmdliner based tools. You may want to have at a look h= ow to configure your shell in order to benefit from their compl= etion scripts, especially if said tools are installed via opam= . After installing cmdliner you should be able to check that y= our configuration works correctly on the new cmdliner tool tha= t now gets installed with cmdliner itself.

    For other changes that may affect you or your users please head to the release notes which have many other details.

    Other than that a full pass was made over the documentation to try to impro= ve and bring it up-to-date with the latest style and additions. Notably the= tutor= ial and examples were updated to make use of the binding operators; howev= er obscure let punning may feel, these are less error prone as your n= umber of cli arguments grow.

    I also added a cookbook which tries to distill in shorter snippets some of cm= dliner's features and the experience I gathered over the past 14 years of u= sing cmdliner to define dozens of command line interfaces. It includes source code structure tips and a few bootstrapping bluepri= nts to cut and paste for when you start your next command line tool.

    For this release I'm very thankful to a private one-time donation[^1], a gr= ant from the OCaml software foundation and, as always, my few but faithfull donors. All of which are essential for these releases to e= ventually get out. They do take quite a bit longer to devise that one would= expect :=E2=80=93)

    Home page: https://errat= ique.ch/software/cmdliner

    API docs & manuals: https://erratique.ch/software/cmdliner/doc/ or odig doc cmd= liner

    Install: opam install cmdliner (once the PR is merged, may take a few= days)

    Best,=20

    Daniel

    [^1]: Which are as nice as recurring donations ;=E2=80=93)

    Daniel B=C3=BCnzli later added

    To follow up on the completion feature. It should be stressed that I don't = consider it to be fully "done" as it stands. I'm pretty sure the completion= API, protocol, features and the generic completion scripts can be improved= . The main problem is that it seems shell programmers are more interested i= n cajoling the look of their prompts than defining sane cross-shell standar= d protocols for tool/shell interaction. The current completion mecanisms ar= e broken be= yond imagination.

    Issues about completion are tagged accordingly in the issue tracker. Do not= hesitate to chime in if you have ideas or more knowledge than I do for imp= rovements. I'm also happy to add support for more shells but it's better if= you help for that because working with shells makes me want to throw my co= mputer out of the window.

    Meanwhile I'd like to show two completion feature that I'm quite happy to h= ave support for in this release.=20

    Context sensitive completion

    The idea here, suggested by @andreypopp, is that completion can depend on a= context that is specified via a cmdliner term itself. This is typically us= eful for configuration dependent completions: you have a cmdliner term that= represents your configuration and you access it when doing a completion.

    For example in the next release of odig you can autocomplete p= ackage names on odig doc [PKG]. The available packages depend = on looking up a libdir which can be specified with a command line argument = itself. So for example this completes according to the automatic libdir loo= kup

    # Auto discovered libdir
    > odig doc c=E2=90=89
    camlp-streams   checkseum  cmarkit  camlpdf  cairo2=20=20
    containers      cmdliner   cpuid    cppo     cpdf=20=20=20=20
    cstruct-lwt     cstruct    ctypes   crunch   csexp=20=20=20
    ctypes-foreign=20=20=20=20=20=20
    

    But the following looks for packages in another switch:

    # Explicit libdir
    > odig doc c=E2=90=89 --lib-dir $(opam var lib --switch=3Dmyswitch)=20
    capitalization  cerberus-lib  calendar  charon=20=20=20=20=20=20=20=20
    core_kernel     core_unix     cmdliner  cppo    core=20=20
    cstruct         csexp=20=20
    

    The commit that implements this in odig= is rather straightforward, it simply reuses the existing conf= term for the completion context. Also the cookbook has a simple = self-contained example to start from.

    Compositional completion (restart and raw)

    The second completion feature is to retain completion on the tools that ano= ther tool invokes =E2=80=93 commands like sudo.=20

    For example in the b0 tool, the build system I'm using for all= my developments. The b0 vcs [OPTION]=E2=80=A6 -- VCS [ARG]=E2=80=A6<= /code> command allows to bulk operate the VCSs of the projects you included= in a B0.ml build description file.=20

    Using appopriate cmdliner completion directives the completion of this comm= and first completes the VCS enum (which can be git or hg) and then gracefully drops back to the completion of your VCS:

    > b0 vcs -- =E2=90=89
    git  hg  --
    > b0 vcs -- git sh=E2=90=89
    shell       -- restricted login shell for GIT-only SSH access
    shortlog    -- summarize git log output
    show        -- show various types of objects
    show-branch -- show branches and their commits
    show-index  -- show packed archive index
    show-ref    -- list references in a local repository
    

    This is a restart completion type. It restar= ts the completion context as if the cli started after the -- t= oken.=20

    It is the kind of behaviour you want from e.g. opam exec, thou= gh arguably in the case of opam exec it will be sligthly misle= ading since completions will occur using the outer environment rather than = the one setup by opam exec -- TOOL [ARG]=E2=80=A6. Still, som= etimes inaccurate completion is better than no completion.=20

    Note that this would be quite easy to solve with a good cross-shell complet= ion standard: just invoke TOOL in the environment setup by opam exec according to the completion standard (e.g. the cmdliner completion protocol) and propagate the result back in the co= mpletion for opam exec, but we do not live in that world. Stil= l the API is ready for such a technique to be used, by using a raw completion type (I use this in b0 to complete custom, library an= d user-defined, actions like b0 -- .opam or b0 -- .ocaml= ).=20

    Detrow, a command-line calendar

    Florent Monnier announced

    Detrow is a comma= nd-line calendar which displays the months of a calendar in colomns.

    (So each days of months are aligned in rows)

    (With Detris, = months are displayed in a similar way than the cal unix command.)

    You can download it with the following command:

    wget http://decapode314.free.fr/ocaml2/detrow/dl/0.01b/detrow.ml
    

    Then you can call it like this:

    $ \ocaml detrow.ml
    

    It will display the first half of the month, Januray until June.

    If you want the second half of the year, Jully until December, you can call= it again with:

    $ \ocaml detrow.ml b
    

    The first half, can also be called with the "a" parameter:

    $ \ocaml detrow.ml a
    

    If you call it like this:

    $ \ocaml detrow.ml ann-file 2025 b
    

    With the file called "ann-file" containing:

    $ cat ann-file
    2025-09-27: detrow-ann
    

    You will see the string `"detrow-ann"` displayed in the calendar in front o= f the day `"2025-09-27"`. (The number of chars that can be displayed is lower than 8 (< 8).)

    rpmfile 0.8.0+ library

    Mikhail announced

    Hello,

    I am pleased to announce the next major version of my library for reading RPM packages, power= ed by Angstrom.

    # #require "rpmfile";;
    
    # let pkg =3D=20
        In_channel.with_open_bin=20
          "hello-2.12.2-2.fc43.x86_64.rpm"=20
          Rpmfile.Reader.of_channel
        |> Result.get_ok;;
    
    # Rpmfile.View.name pkg;;
    - : string =3D "hello"
    
    # Rpmfile.View.vendor pkg;;
    - : string =3D "Fedora Project"
    
    # Rpmfile.View.version pkg;;
    - : string =3D "2.12.2"
    

    This release has broken the previous API and made it simpler and mor= e compact.

    Added capture of the payload of the RPM package body. But it is not effecti= ve enough.

    # pkg.payload;;
    - : string option =3D None
    

    You can implement this functionality manually using Lwt and angstrom-lwt-unix or something else.

    (* e=
    xamples/extract_payload_by_lwt.ml *)
    
    let default_tags_selector =3D
      Rpmfile.Reader.
        {
          predicate_signature_tag =3D Fun.const true;
          predicate_header_tag =3D Fun.c=
    onst true;
        }
    
    let pkg_parser =3D
      Rpmfile.Reader.make_package_parser=
     ~capture_payload:false
        ~tags_selector:default_tags_sele=
    ctor
    
    let () =3D
      let open Lwt.Syntax in
      Lwt_main.run
      @@
      let* ic =3D Lwt_io.=
    open_file ~mode:Input "hello.rpm" in
      let* _pkg =3D
        let* b, r =
    =3D Angstrom_lwt_unix.parse pkg_pars=
    er ic in
        let+ _ =3D Lwt_io=
    .set_position ic (Int64.of_in=
    t b.off) in
        Result.get_ok r
      in
      let* payload =3D Lw=
    t_io.read ic in
    
      (* ... *)
    

    … :pie:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Cm734XSm; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=nGDmRmca; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 2EAE540023 for ; Tue, 7 Oct 2025 12:22:56 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=6Cc2nnIGNfk4avWgrBeto1g+rm/1p7PKeR/BtL0KDJc=; b=Cm734XSmtG8VcYdvJ0G0YTARBB5i5tRi+9x/wppeZOPvPEs4+KFJmYfg 1BwYxTso7bJuHZ+uOvQGnBiTNcSkL+gZcSYn5Y/FH6zTv4KMsp8JRaskM To54kSAYr4sEAXRwJhS7j33KBc468y8PKTF6gUQ4iEqovDTVoCDhj3pHs U=; X-CSE-ConnectionGUID: y4nGpRngSaeqMtxE2unldQ== X-CSE-MsgGUID: elAcua5wSJ+SK7jPebwFcQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.18,321,1751234400"; d="scan'208,217";a="242899204" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Oct 2025 14:22:55 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id EBD44E0CDA; Tue, 7 Oct 2025 14:22:54 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id 4CA9EE0171 for ; Tue, 7 Oct 2025 14:22:51 +0200 (CEST) X-CSE-ConnectionGUID: M5Ok2Q+AT7uzrnh80upqpA== X-CSE-MsgGUID: vQqbrznJRzS678wRcOi2ng== IronPort-SDR: 68e50619_OzQAS3Y123T3qV9baLGxnC2ntYJOat94gbsBe8g9SP09WVs W+S0IKuSO5QXT0CAMsf07PBloK3qpDhutgGakTQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HIBQBkBeVodyIeaIFTBxMBAQGEAFsoGQFoXjMHCEkDX?= =?us-ascii?q?oM4PINPhTWIb4EWkDeDRYc2gWmBEQMYFiMVAQMBDS4BFQoBAgQBAQMBAgGCD?= =?us-ascii?q?IIuRgKMRwIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAFDSYZPDYJFLSRxYQQDBgYBAQEBAQEBAQEnAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIEBAMBAQIFIg4LAT8ODgECB?= =?us-ascii?q?gQGEwEBJgUNGBQPAwkBAQkBBgMCEQE1AxQBEhQFAQGCD1mCIAICTwMFDAaRH?= =?us-ascii?q?JtMen8zgQGCDAEBBoEIPgIBAgkCBQEOCSbaDIFkCYFKhW2CShoBKklrAoRHh?= =?us-ascii?q?DwnD4FVRIEVNYFzSgdvgVBvIgEBAQEYQgI7CQQFARECAQgDDw8REwkJCQKDE?= =?us-ascii?q?YJpghEVgQIUHVg/ITRfcDaBOQJtgSJAghcsGnWER4IrAwYEQns6AgMBi3SBR?= =?us-ascii?q?EszLAFVExcLBwVbgQgDKjQxbjIdgSeFC4QeK0+FAoEYg1MPE2sPBoEVg1qJb?= =?us-ascii?q?A+CdQMLbT03FBuZVRcrGWIGAhaBQwQRAQEEIA44BgIgCQMEDBoBEgoHBQkFA?= =?us-ascii?q?QIFDAgOAQEEHAIuAwUFBBAKCgwHBRYPAQILAQkFBgMVAwMCDh8LCy8DghKQO?= =?us-ascii?q?QoCJQMqAgF0nH2TWR1tNAeEH4FeBgyIHmqBJo4ADIQjg1eEBIFXhUCFfIcCk?= =?us-ascii?q?lIimGQigjaGGoENgSYJgW8fTJU0AioXCYU5gX8jbD8BHQwHMxowQw0QAgIBg?= =?us-ascii?q?hEBATIJCjwcD1eHSoVeKwMWgRIBAoJJM4ELInkGBYE7OTt9QIEprDIDQTUBA?= =?us-ascii?q?QEBDCwCBwEKAQEDCYViAQGMBgImAwlrA10BAQ?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 tVgD7XSyqhIxIC9FYB6ETk0xq8= IronPort-HdrOrdr: A9a23:KWX18qrHr+DYEwj6G29Iz1saV5oWeYIsimQD101hICG9E/bo9P xG+c5w6faaslgssR0b9OxoW5PhfZq/z/9ICOAqVN/IYOCMggSVxe9ZgbfK8nnJJGnV9+JW16 tsGpIOauHYPBxdlsi/xAG5Fr8bsb26GU2T9ILj80s= X-Talos-CUID: 9a23:sLuE6WOQmwww1u5DfXRA9xQtWekZLWDP1nHQcxelEX9xYejA X-Talos-MUID: 9a23:x2DxgwunvnCdRftJY82nmgh7Pt165YaUGntTzsUZgcKjNHZ2NGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.18,321,1751234400"; d="scan'208,217";a="242899164" X-MGA-submission: =?us-ascii?q?MDF2TBUANIefsWUN07fIgJrQ+rjeq2yANjdl2k?= =?us-ascii?q?tetPNbIly43azK5HOtxazODIXJQQnC/KrpmMZB3FJvYNgrX1yHqyfupu?= =?us-ascii?q?eUSzfWbx5tLZ9YOJVazJTdLH7Pn/rzCRSe1dt12TxiPrqNY/H3VFDEm3?= =?us-ascii?q?1PqwcmXevrqshKG1XuIG7lkg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Oct 2025 14:22:49 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id F33321A2E9; Tue, 7 Oct 2025 14:22:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1759839769; bh=iS+J1XhiOef5BusoYOdEYsMO7vwv4aIoqrTYymsrk6I=; h=From:To:Subject:Date:Message-ID; b=nGDmRmcavbUfJiz3TKuJRC0SlfOEFxJo8eYT3QRITtd3aGv2hC8tCQ4idMmyAPdUU aeIHofwYEGuZXwDw1h4igy9tyqXJHxidA0LRjpiol0i2m6K3Qm6hhY2HZkEWUyBOjl QkaecKM657ZKRBWQbvNSM7bBu5Q5AGjBVfir8feM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 07 Oct 2025 14:22:48 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 7 14:22:49 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.468686, queueID=2559A1A2F8 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19383 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of September 30 to October 07, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 moonpool 0.9, moonpool-lwt 0.9 First release candidate for OCaml 5.4.0 Announcing the OCaml Zulip at ocaml.zulipchat.com An impressive macrobenchmark for eio nim-ocaml Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline Nov 17) ocp-indent 1.9.0 Sketch.sh now supports OCaml 5.3.0 OUPS meetup october 2025 New releases of Merlin (5.6) and OCaml-LSP (1.24.0) Other OCaml News Old CWN moonpool 0.9, moonpool-lwt 0.9 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello camels, I=E2=80=99m happy to announce the release of [moonpool 0.9] and moonpool-= lwt 0.9. Moonpool is a concurrency and parallelism library that provides lightweight fibers and a concept of `Runner.t' that they can be dispatched on. Multiple runners can co-exist inside a program. This release is a fairly large one. First, Moonpool now requires OCaml >=3D 5.0 (no more 4.xx compat), which removes the need for a preprocessor and makes `await' generally available on every `Runner.t'. Some sub-libraries are now deprecated (`moonpool-io', `moonpool.sync' in favor of picos, etc.). The biggest improvement is `moonpool-lwt'. It now wraps `Lwt_main.run' and turns it into a `Moonpool.Runner.t', meaning that `Lwt', `Lwt_io', `Lwt_unix', and all the libraries built on top can now directly be used from Moonpool. `Lwt' promises can be turned into moonpool futures and conversely; fibers can be spawned in the `Lwt_engine' loop from any thread (to perform IO and call lwt libraries) and be awaited from other threads, too. Documentation: , [moonpool 0.9] Example echo server =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module M_lwt =3D Moonpool_lwt =E2=94=82=20 =E2=94=82 let ( let@ ) =3D ( @@ ) =E2=94=82 let str_of_sockaddr =3D function =E2=94=82 | Unix.ADDR_UNIX s -> s =E2=94=82 | Unix.ADDR_INET (addr, port) -> =E2=94=82 Printf.sprintf "%s:%d" (Unix.string_of_inet_addr addr) port =E2=94=82=20 =E2=94=82=20 =E2=94=82 let main ~port () : unit =3D =E2=94=82 (* never resolved *) =E2=94=82 let lwt_fut, _lwt_prom =3D Lwt.wait () in =E2=94=82=20 =E2=94=82 let handle_client client_addr (ic, oc) : _ Lwt.t =3D =E2=94=82 (* spawn a new fiber in the lwt thread *) =E2=94=82 let@ () =3D M_lwt.spawn_lwt in =E2=94=82 Printf.printf "got new client on %s\n%!" (str_of_sockaddr c= lient_addr); =E2=94=82=20 =E2=94=82 let buf =3D Bytes.create 1024 in =E2=94=82 let continue =3D ref true in =E2=94=82 while !continue do =E2=94=82 let n =3D Lwt_io.read_into ic buf 0 (Bytes.length buf) |>= M_lwt.await_lwt in =E2=94=82 if n =3D 0 then =E2=94=82 continue :=3D false =E2=94=82 else ( =E2=94=82 Lwt_io.write_from_exactly oc buf 0 n |> M_lwt.await_lwt; =E2=94=82 Lwt_io.flush oc |> M_lwt.await_lwt; =E2=94=82 ) =E2=94=82 done; =E2=94=82 Printf.printf "done with client on %s\n%!" (str_of_sockaddr= client_addr); =E2=94=82 in =E2=94=82=20 =E2=94=82 Printf.printf "listening on port=3D%d\n%!" port; =E2=94=82 let addr =3D Unix.ADDR_INET (Unix.inet_addr_any, port) in =E2=94=82 let _server =3D =E2=94=82 Lwt_io.establish_server_with_client_address addr handle_cli= ent =E2=94=82 |> M_lwt.await_lwt =E2=94=82 in =E2=94=82=20 =E2=94=82 M_lwt.await_lwt lwt_fut (* never returns *) =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let port =3D ref 1234 in =E2=94=82 let opts =3D =E2=94=82 [ =E2=94=82 "-p", Arg.Set_int port, " port"; =E2=94=82 ] =E2=94=82 |> Arg.align =E2=94=82 in =E2=94=82 Arg.parse opts ignore "echo server"; =E2=94=82=20 =E2=94=82 M_lwt.lwt_main @@ fun _ -> main ~port:!port () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Run it as `echo_server -p 1234' and use `nc localhost 1234' to connect. It will echo lines sent to it. We can reuse `Lwt_io.establish_server_with_client_address' just fine, and use direct style to implement the client handler inside a single `Moonpool' fiber (via `Moonpool_lwt.spawn_lwt' that runs its argument in the lwt event loop). Small server with a thread pool for compute =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C a variation on the previous one, with a thread pool on which CPU bound tasks can be run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module M_lwt =3D Moonpool_lwt =E2=94=82=20 =E2=94=82 let ( let@ ) =3D ( @@ ) =E2=94=82 let str_of_sockaddr =3D function =E2=94=82 | Unix.ADDR_UNIX s -> s =E2=94=82 | Unix.ADDR_INET (addr, port) -> =E2=94=82 Printf.sprintf "%s:%d" (Unix.string_of_inet_addr addr) port =E2=94=82=20 =E2=94=82 (* don't do this at home *) =E2=94=82 let rec fib n =3D =E2=94=82 if n <=3D 2 then 1 else fib (n-1) + fib (n-2) =E2=94=82=20 =E2=94=82 let main ~port ~tpool () : unit =3D =E2=94=82 (* never resolved *) =E2=94=82 let lwt_fut, _lwt_prom =3D Lwt.wait () in =E2=94=82=20 =E2=94=82 let handle_client client_addr (ic, oc) : _ Lwt.t =3D =E2=94=82 (* spawn a new fiber in the lwt thread *) =E2=94=82 let@ () =3D M_lwt.spawn_lwt in =E2=94=82 Printf.printf "got new client on %s\n%!" (str_of_sockaddr c= lient_addr); =E2=94=82=20 =E2=94=82 let continue =3D ref true in =E2=94=82 while !continue do =E2=94=82 match Lwt_io.read_line ic |> M_lwt.await_lwt with =E2=94=82 | exception End_of_file -> continue :=3D false =E2=94=82 | line -> =E2=94=82 let input =3D int_of_string @@ String.trim line in =E2=94=82 (* run fib(input) in the thread pool and suspend until =E2=94=82 it's done *) =E2=94=82 let fib_input =3D =E2=94=82 Moonpool.Fut.spawn ~on:tpool (fun () -> fib input) =E2=94=82 |> Moonpool.Fut.await =E2=94=82 in =E2=94=82=20 =E2=94=82 Lwt_io.write oc (Printf.sprintf "%d\n" fib_input) =E2=94=82 |> M_lwt.await_lwt; =E2=94=82 Lwt_io.flush oc |> M_lwt.await_lwt; =E2=94=82 done; =E2=94=82=20 =E2=94=82 Printf.printf "done with client on %s\n%!" (str_of_sockaddr= client_addr); =E2=94=82 in =E2=94=82=20 =E2=94=82 Printf.printf "listening on port=3D%d\n%!" port; =E2=94=82 let addr =3D Unix.ADDR_INET (Unix.inet_addr_any, port) in =E2=94=82 let _server =3D =E2=94=82 Lwt_io.establish_server_with_client_address addr handle_cli= ent =E2=94=82 |> M_lwt.await_lwt =E2=94=82 in =E2=94=82=20 =E2=94=82 M_lwt.await_lwt lwt_fut (* never returns *) =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 let port =3D ref 1234 in =E2=94=82 let j =3D ref 8 in =E2=94=82 let opts =3D =E2=94=82 [ =E2=94=82 "-j", Arg.Set_int j, " thread pool size"; =E2=94=82 "-p", Arg.Set_int port, " port"; =E2=94=82 ] =E2=94=82 |> Arg.align =E2=94=82 in =E2=94=82 Arg.parse opts ignore "echo server"; =E2=94=82=20 =E2=94=82 let@ tpool =3D Moonpool.Ws_pool.with_ ~num_threads:!j () in =E2=94=82 M_lwt.lwt_main @@ fun _ -> main ~port:!port ~tpool () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Note how the computation is done by starting a task in the `tpool' argument (a moonpool `Runner.t' provided to the main, by default a work stealing pool of 8 threads that can be set via `-j ') and then `await'-ed from the lwt handler. While the computation is running, the lwt client handler is suspended and doesn=E2=80=99t prevent other clients from making progress. To test this one, use `nc localhost 1234' and write (small) integers to get `fib(n)' computed. To see it work in parallel, open `top' or `htop' and run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 for i in `seq 1 200`; do nc localhost 1234 <<< '35' & done =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 First release candidate for OCaml 5.4.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 The release of OCaml 5.4.0 is imminent. As a final step, we are publishing a release candidate to check that everything is in order before the release in the upcoming week. If you find any bugs, please report them on the [OCaml's issue tracker]. Compared to the second beta, this release candidate only contains a fix in the TSAN mode, and one metadata fix in the changelog itself. The full change log for OCaml 5.4.0 is available on [GitHub]. Happy hacking, Florian Angeletti for the OCaml team. [OCaml's issue tracker] [GitHub] Installation instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: opam update opam switch create 5.4.0~rc1 The source code for the release candidate is also directly available on: =E2=80=A2 GitHub: =E2=80=A2 OCaml archives at Inria: Fine-tuned compiler configuration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.4.0~rc1+optio= ns =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `' is a space-separated list of `ocaml-option-*' packages. For instance, for a `flambda' and `no-flat-float-array' switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.4.0~rc1+flambda+nffa ocaml-variants.5.4.0~= rc1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Announcing the OCaml Zulip at ocaml.zulipchat.com =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ancolie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Dear OCaml community, There has been a recent renewed interest in maintaining an open, organized and synchronous communication channel, and the OCaml Zulip has been revived. It is freely readable without an account at [ocaml.zulipchat.org], and can be accessed through various means of authentication, including Github accounts. On Zulip, we have full access to our data at all time, and should the company change its policy, the data can be retrieved and the current version of Zulip server is self-hostable. In the meantime, we have been graciously offered sponsorship as an open community and can enjoy all features of the platform for free, and we thank Zulip for that. The platform can be accessed either on the web (one tab per server), or on the desktop and mobile client, which allow for managing multiple organizations. Talking about multiple organizations, there are already many OCaml, programming languages and verification related Zulip servers, such as [Rocq], [Types], [Why3], [Catala], [Bytecode alliance], [Owi] or [Aeneas]. Check-out the full list of [open to the public communities] for more. Finally, we would like to emphasize that any governance team or project is welcome to host their discussions on the Zulip, where a channel can be created and admin rights granted. Cheers! PS: For anyone already on the Zulip, as part of this effort, the URL was migrated from `caml.zulipchat.org' to `ocaml.zulipchat.org' and you may have to remove the server and login again. [ocaml.zulipchat.org] [Rocq] [Types] [Why3] [Catala] [Bytecode alliance] [Owi] [Aeneas] [open to the public communities] An impressive macrobenchmark for eio =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: conroj said =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80 While wandering around the web I came across a link to a [slide deck] by our own @kayceesrk. On slide #35 is a macrobenchmark showing an EIO-based network server, and its throughput is pretty favorable compared to the Rust implementation=E2=80=99s. Taking this at face value, it seems like quite an achievement - not only because GC is (supposedly) a handicap for OCaml, but also because this seems like a major improvement over a [similar benchmark] from 2022. I couldn=E2=80=99t find links to deeper discussion of these results= , so I thought I would ask some of the obvious follow-up questions: =E2=80=A2 Is OCaml=E2=80=99s tail latency on par with Rust=E2=80=99s in t= hese scenarios? =E2=80=A2 Are both the =E2=80=9COCaml eio=E2=80=9D and =E2=80=9CRust Hype= r=E2=80=9D results using similar kernel capabilities, e.g. `io_uring'? (The slide seems to suggest so, but just confirming.) =E2=80=A2 Do these results generalize to different levels of concurrency, request/response sizes, etc? Either way, kudos for raising OCaml=E2=80=99s profile as a platform for scalable computing! [slide deck] [similar benchmark] Anil Madhavapeddy replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 They both used io_uring, yes. The OCaml bindings are at ; but note that there are several levels of io_uring usage possible depending on your tolerance for ranges of Linux kernel support (I=E2=80=99m just adding zero-copy transmit support at the moment for a project involving a petabyte of data). OCaml=E2=80=99s tail latency will be worse than Rust=E2=80=99s due to hav= ing a GC, but not terribly so. As for generalization, those tests were run on a pre-5.0 version of OCaml, so the whole test suite would have to be rebased against the released versions. A good and useful exercise if someone would like to have a go at it! Thomas Leonard also replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 I think the benchmarks are from I don=E2=80=99t think the Rust ones are using uring, but I=E2=80=99m not = sure. I suspect that all the non-OCaml ones could do with a fan of that language optimising them a bit. In my experience, whether the Rust or Eio version gets better throughput depends on e.g. the number of connections, and tail latency was always better with Rust. But the basic result is that OCaml is competitive with Rust here. nim-ocaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I read a paper maybe not this one, but it seems it talks about the same thing [https://arxiv.org/html/2506.04657v1]. At the beginning I thought it's about the new programming language, but then chatgpt explained me that in fact it's a small game with stones. We put a given number of stones in the middle, and each player can take 1, 2 or 3 stones from the stack. There are two variants of the game, the one that only has one stone in front of him at the end wins or not. So I tryed to make a `nim-ocaml' to play against its `Random.state', here below: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let () =3D =E2=94=82 Random.self_init () ; =E2=94=82 let n =3D 13 + (Random.int 23) in =E2=94=82 let _n =3D ref n in =E2=94=82 let run =3D ref true in =E2=94=82 while !run do =E2=94=82 Printf.printf "%d\n" !_n; =E2=94=82 if !_n <=3D 1 then run :=3D false ; =E2=94=82 let line =3D read_line () in =E2=94=82 begin =E2=94=82 try =E2=94=82 let d =3D int_of_string line in =E2=94=82 _n :=3D !_n - d ; =E2=94=82 with _ -> =E2=94=82 Printf.printf "please input an integer number\n%!"; =E2=94=82 end; =E2=94=82 let b =3D Random.int 2 + Random.int 3 in =E2=94=82 Printf.printf "b played: %d\n" b; =E2=94=82 _n :=3D !_n - b ; =E2=94=82 done; =E2=94=82 Printf.printf "done!\n" ; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml nim.ml=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Or later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wget http://decapode314.free.fr/ocaml2/nim/nim.ml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ \ocaml nim.ml =E2=94=82 23 =E2=94=82 3 =E2=94=82 b played: 3 =E2=94=82 17 =E2=94=82 7 =E2=94=82 b played: 0 =E2=94=82 10 =E2=94=82 3 =E2=94=82 b played: 2 =E2=94=82 5 =E2=94=82 2 =E2=94=82 b played: 2 =E2=94=82 1 =E2=94=82 0 =E2=94=82 b played: 0 =E2=94=82 done! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Another version to play against your collegue at the pause: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ wget http://decapode314.free.fr/ocaml2/nim/.gil/nim.ml.0 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [https://arxiv.org/html/2506.04657v1] Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline Nov 17) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Michael Sperber announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml contributions are spot-on for BOB - send us some! *BOB Conference 2026 - Call for Contributions* =E2=80=9CWhat happens when we use what=E2=80=99s best for a change?=E2=80=9D =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C =E2=80=A2 =E2=80=A2 Berlin, Mar 13 =E2=80=A2 Deadline: November 17, 2025 Looking for Speakers =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C You are actively engaged in advanced software engineering methods, solve ambitious problem with software and are open to cutting-edge innovation? Attend this conference, meet people that share your goals, and get to know the best software tools and technologies available today. We strive to offer a day full of new experiences and impressions that you can use to immediately improve your daily life as a software developer. If you share our vision and want to contribute, submit a proposal for a talk or tutorial! *NOTE*: The conference fee will be waived for presenters. Travel expenses will not be covered (for exceptions see =E2=80=9CSpeaker Grants= =E2=80=9D). Topics =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We are looking for talks about best-of-breed software technology, e.g.: =E2=80=A2 functional programming =E2=80=A2 persistent data structures and databases =E2=80=A2 event-based modelling and architecture =E2=80=A2 =E2=80=9Cfancy types=E2=80=9D (dependent types, gradual typing,= linear types, =E2=80=A6) =E2=80=A2 formal methods for correctness and robustness =E2=80=A2 abstractions for concurrency and parallelism =E2=80=A2 metaprogramming =E2=80=A2 probabilistic programming =E2=80=A2 math and programming =E2=80=A2 controlled side effects =E2=80=A2 program synthesis =E2=80=A2 AI beyond vibecoding and chatbots =E2=80=A2 linked data =E2=80=A2 symbolic AI =E2=80=A2 next-generation IDEs =E2=80=A2 effective abstractions for data analytics =E2=80=A2 =E2=80=A6 everything really that isn=E2=80=99t mainstream, but = you think should be =E2=80=A2 =E2=80=A6 including rough ideas that are worth discussing. Presenters should provide the audience with information that is practically useful for software developers. Challenges =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Furthermore, we seek contributions on successful approaches for solving hard problems, for example: =E2=80=A2 bias in machine-learning systems =E2=80=A2 digital transformation in difficult settings =E2=80=A2 accessibility =E2=80=A2 systems with critical reliability requirements =E2=80=A2 ecologically sustainable software development *We=E2=80=99re especially interested in experience reports.* Other topics are also relevant, e.g.: =E2=80=A2 introductory talks on technical background =E2=80=A2 overviews of a given field =E2=80=A2 demos and how-tos Requirements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C We accept proposals for presentations of 45 minutes (40 minutes talk + 5 minutes questions), as well as 90 minute tutorials for beginners. The language of presentation should be either English or German. Your proposal should include (in your presentation language of choice): =E2=80=A2 An abstract of max. 1500 characters. =E2=80=A2 A short bio/cv =E2=80=A2 Contact information (including at least email address) =E2=80=A2 A list of 3-5 concrete ideas of how your work can be applied in= a developer=E2=80=99s daily life =E2=80=A2 additional material (websites, blogs, slides, videos of past presentations, =E2=80=A6) [Submit here] [Submit here] Organisation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Direct questions to `konferenz at bobkonf dot de' =E2=80=A2 Proposal deadline: *November 17, 2025* =E2=80=A2 Notification: December 5, 2025 =E2=80=A2 Program: December 12, 2025 Shepherding =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C The program committee offers shepherding to all speakers. Shepherding provides speakers assistance with preparing their sessions. Specifically: =E2=80=A2 advice on structure and presentation =E2=80=A2 review of talk slides Speaker Grants =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C BOB has Speaker Grants available to support speakers from groups under-represented in technology. We specifically seek women speakers, speakers of color, and speakers who are not able to attend the conference for financial reasons. ocp-indent 1.9.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here at OCamlPro we=E2=80=99re happy to announce the (long awaited) relea= se of ocp-indent.1.9.0. The full release notes are available [here] if you want the detailed version. 1.9.0 contains mostly bug fixes, better and more consistent indentation of `fun _ ->' and `|>', compatibility with cmdliner.1.3.0 and above (it works with 2.0.0) and a new utility tool: `ocp-indent-gen-rules' for those of you who would like to try `ocp-indent' in a `dune fmt' like workflow. This last bit is documented [here]. This is a feature that some of us wanted internally at OCamlPro so we decided to ship it with the tool as an experiment. We=E2=80=99d really like to hear if this fits your ocp-indent usage so please don=E2=80=99t hesitate to try it out and give = us some feedback. We=E2=80=99re also interested in hearing how you use ocp-indent in genera= l and what you expect from it. Reach out if you have any request! We=E2=80=99ve also updated the repo to fit the more recent development standards. We migrated the test suite to dune cram tests and re-enabled them in opam. Hopefully this should make contributing to ocp-indent a smoother experience! Also be aware that we=E2=80=99ll do our best to maintain ocp-indent more actively from now on. We=E2=80=99d like to thank our external contributors for this release: @dbuenzli, @nojb, @bcc32 and @Julow. Happy indenting! [here] [here] Sketch.sh now supports OCaml 5.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Javier Ch=C3=A1varri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The interactive OCaml sketchbook [sketch.sh] has added support for OCaml 5.3.0. [sketch.sh] *Support for 5.3.0* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C Storing and running sketches using the compiler version 5.3.0 is now possible, this functionality has been added to the already existing support for versions 4.06.1 and 4.13.1. This new version brings support for OCaml 5=E2=80=99s effect handlers and multicore capabilities. Since sketch.sh runs in the browser using JavaScript via js_of_ocaml, the multicore capabilities are simulated using [continuation-passing style]. Here you can see a sketch showcasing effects: [Effects Example - Sketch.sh]. While support for intermediate versions is technically possible, it will require adding a mechanism to support choosing the version of the compiler for the current sketch (see [issue #375]). [continuation-passing style] [Effects Example - Sketch.sh] [issue #375] *Existing sketches and forks* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Previously existing sketches remain in their original compiler version, while newly created sketches will be on 5.3.0 by default. For now, the only way to "migrate" a sketch to a newer version of the compiler is by copying its content and pasting it in a new sketch. Forked sketches inherit the compiler version of the upstream sketch. *Reporting features and issues* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Please [let us know] in case you have a feature request, or if you encounter any issues or bugs. Also, don't hesitate to reach out via [Reason Discord] or Discuss DMs if you would like to contribute or participate in the project in some way. There are a lot of opportunities to do so, both on the frontend and backend sides. [let us know] [Reason Discord] OUPS meetup october 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ancolie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The next OUPS meetup will take place on *Monday, 13th of October* 2025. It will start at *6:30pm* at the *4 place Jussieu* in Paris. It will be in the in the *Esclangon building* (amphi Astier). Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. Moreover, we'd like to announce that the organizing team moved to the [OCaml Zulip]. Feel free to contact us there if you'd like to suggest talks. This time we=E2=80=99ll have the following talks: *What's the deal with modular implicits ? =E2=80=93 Samuel Vivien* Modular implicits est une extension d'OCaml pr=C3=A9sent=C3=A9e en 2014 comme une solution =C3=A0 l'absence de type classe en OCaml. Cependant malgr=C3=A9 l'anciennet=C3=A9 de cette proposition cette fonctionnalit=C3=A9 n'est toujours pas disponible dans OCaml. Nous ferons un tour d'horizon de modular implicits pour rappeler comment cette fonctionnalit=C3=A9 marche, ce qui as d=C3=A9j=C3=A0 =C3=A9t=C3=A9 impl=C3=A9ment=C3=A9 dans le compil= ateur mais aussi ce qu'il reste =C3=A0 faire ainsi que les probl=C3=A9matiques li=C3=A9= s au typage des implicites. *Flambda2: Abstractions without Cost =E2=80=93 Guillaume Bury* Surprise. After the talks there will be some pizzas offered by the [OCaml Software Foundation] and later on we=E2=80=99ll move to a pub nearby as u= sual. [register on meetup ] [OUPS=E2=80=99 website ] [OCaml Zulip] [OCaml Software Foundation] New releases of Merlin (5.6) and OCaml-LSP (1.24.0) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We are pleased to announce new releases of *Merlin* (`5.6-504' and `5.6-503') and *OCaml-LSP* (`1.24.0', for `5.4', and `1.23.1')! This release of *Merlin* offers, firstly, support for OCaml `5.4'. It improves support for OpenBSD (for `merlin-reader'), improves typing recovery in the handling of mutual recursion, and adds a new feature to the protocol: `locate-types'. It works similarly to `locate-type', except that it allows you to distinguish between several _locatable_ types in an expression like this: `(int, Foo.t) result' enabling the location of: `int', `Foo.t' and `('a, 'b) result'. In addition, the Vim client has been fixed for the use of `project-wide-occurrences'. The release of *OCaml LSP* also mainly concerns support for `5.4' and several bug fixes. As with every version upgrade, *we are eager to hear user feedback*. Try out these new releases on your `5.4' switches and don't hesitate to report any issues you encounter ([Merlin], [OCaml LSP])! [Merlin] [OCaml LSP] Merlin Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Merlin `5.6-504' (& `5.6-503') =E2=81=83 merlin binary =E2=80=A2 Add `locate-types' command (#1951) =E2=81=83 merlin library =E2=80=A2 Fix `merlin_reader' for OpenBSD (#1956) =E2=80=A2 Improve recovery of mutually recursive definitions (#1962, #1= 963, fixes #1953) =E2=80=A2 Support for OCaml `5.4' (#1974) (*only for `5.6-504'*) =E2=81=83 vim plugin =E2=80=A2 Fix error when `:MerlinOccurrencesProjectWide' fails to gather code previews (#1970) =E2=81=83 test suite =E2=80=A2 Add more short-paths tests cases (#1904) OCaml LSP Changelog =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C =E2=97=8A `1.24.0' & `1.23.1' =E2=81=83 features =E2=80=A2 Support for OCaml `5.4' (#1559) =E2=81=83 fixes =E2=80=A2 Fix hover on method calls not showing the type. (#1553, fixes #1552) =E2=80=A2 Fix error on opening `.mll' files (#1557) =E2=80=A2 Ensure compatibility with both yojson 2.0 and 3.0. (#1534) *Happy Hacking*! The Merlin Team :man_mage: :two_hump_camel: Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [One year at Ahrefs] =E2=80=A2 [Attempting overlayfs with macFuse] =E2=80=A2 [Mental Check: Reflecting on the OCaml Journey So Far] =E2=80=A2 [Ocsigen: A Full OCaml Framework for Websites and Apps] =E2=80=A2 [File descriptors as integers considered harmful] =E2=80=A2 [Hacking OCaml] =E2=80=A2 [File descriptors are not integers] [the ocaml.org blog] [Upcoming OCaml Events] [One year at Ahrefs] [Attempting overlayfs with macFuse] [Mental Check: Reflecting on the OCaml Journey So Far] [Ocsigen: A Full OCaml Framework for Websites and Apps] [File descriptors as integers considered harmful] [Hacking OCaml] [File descriptors are not integers] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of September 30 to Octob= er 07, 2025.

    moonpool 0.9, moonpool-lwt 0.9

    Simon Cruanes announced

    Hello camels,

    I=E2=80=99m happy to announce the release of moonpool 0.9 and moonpool-lwt 0.9. M= oonpool is a concurrency and parallelism library that provides lightweight = fibers and a concept of Runner.t that they can be dispatched o= n. Multiple runners can co-exist inside a program.

    This release is a fairly large one. First, Moonpool now requires OCaml >= =3D 5.0 (no more 4.xx compat), which removes the need for a preprocessor an= d makes await generally available on every Runner.t. Some sub-libraries are now deprecated (moonpool-io, = moonpool.sync in favor of picos, etc.).

    The biggest improvement is moonpool-lwt. It now wraps Lw= t_main.run and turns it into a Moonpool.Runner.t, meani= ng that Lwt, Lwt_io, Lwt_unix, and a= ll the libraries built on top can now directly be used from Moonpool. Lwt promises can be turned into moonpool futures and conversely; fi= bers can be spawned in the Lwt_engine loop from any thread (to= perform IO and call lwt libraries) and be awaited from other threads, too.

    Documentation: https://c-cube.github.io/moonpool/moonpool/index.html , https://c-cube.github.io/moonpool/moonpool-lwt/Moonpool_lwt/index.html

    Example echo server

    module M_lwt =3D <=
    span style=3D"color: #444fcf;">Moonpool_lwt
    
    let ( let@ ) =3D ( @@=
     )
    let str_of_sockaddr =3D function
      | Unix.ADDR_UNIX s -> s
      | Unix.ADDR_INET (addr, port) ->
        Printf.sprintf "%s:%d" (Unix.=
    string_of_inet_addr addr) port
    
    
    let main ~port () : unit =3D
      (* never resolved *)
      let lwt_fut, _lwt_p=
    rom =3D Lwt.wait () in
    
      let handle_client c=
    lient_addr (ic, oc) : _ =
    Lwt.=
    t =3D
        (* spawn a new fiber in the lwt thr=
    ead *)
        let@ () =3D <=
    span style=3D"color: #444fcf;">M_lwt.spawn_lwt in
        Printf.printf "got new client on %s\n%!" (str_of_sockaddr client_add=
    r);
    
        let buf =3D Bytes=
    .create 1024 in
        let continue =3D ref true <=
    span style=3D"color: #000000; font-weight: bold;">in
        while !continue do
          let n =3D Lwt_i=
    o.read_into ic buf 0 (Bytes.l=
    ength buf) |> M_lwt.await_lwt in
          if n =3D 0 =
    then
            continue :=3D false
          else (
            Lwt_io.write_from_exactly oc=
     buf 0 n |> M_lwt.await_lwt;
            Lwt_io.flush oc |> M_lwt.await_lwt;
          )
        done;
        Printf.printf "done with client on %s\n%!" (str_of_sockaddr client_a=
    ddr);
      in
    
      Printf.printf "listening on port=3D%d\n%!" port;
      let addr =3D Unix.<=
    /span>ADDR_INET<=
    /span> (Unix.inet_addr_any, port) in
      let _server =3D
        Lwt_io.establish_server_with_cli=
    ent_address addr handle_client
        |> M_lwt.await_lwt
      in
    
      M_lwt.await_lwt lwt_fut (* never returns *)
    
    let () =3D
      let port =3D ref 1234 in
      let opts =3D
        [
          "-p", Arg.Set_int port, " port";
        ]
        |> Arg.align
      in
      Arg.parse opts ignore "echo server";
    
      M_lwt.lwt_main @@ f=
    un _ -> main ~port:!p=
    ort ()
    

    Run it as echo_server -p 1234 and use nc localhost 1234<= /code> to connect. It will echo lines sent to it.

    We can reuse Lwt_io.establish_server_with_client_address just = fine, and use direct style to implement the client handler inside a single = Moonpool fiber (via Moonpool_lwt.spawn_lwt that r= uns its argument in the lwt event loop).=20

    Small server with a thread pool for compute

    a variation on the previous one, with a thread pool on which CPU bound task= s can be run:

    module M_lwt =3D <=
    span style=3D"color: #444fcf;">Moonpool_lwt
    
    let ( let@ ) =3D ( @@=
     )
    let str_of_sockaddr =3D function
      | Unix.ADDR_UNIX s -> s
      | Unix.ADDR_INET (addr, port) ->
        Printf.sprintf "%s:%d" (Unix.=
    string_of_inet_addr addr) port
    
    (* don't do this at home *)
    let rec fib n =3D
      if n <=3D 2 =
    then 1 else fib (n-1) + fib (n-2)
    
    let main ~port ~tpool () : unit =3D
      (* never resolved *)
      let lwt_fut, _lwt_p=
    rom =3D Lwt.wait () in
    
      let handle_client c=
    lient_addr (ic, oc) : _ =
    Lwt.=
    t =3D
        (* spawn a new fiber in the lwt thr=
    ead *)
        let@ () =3D <=
    span style=3D"color: #444fcf;">M_lwt.spawn_lwt in
        Printf.printf "got new client on %s\n%!" (str_of_sockaddr client_add=
    r);
    
        let continue =3D ref true <=
    span style=3D"color: #000000; font-weight: bold;">in
        while !continue do
          match Lwt_io.read_line ic |> M_lwt.await_=
    lwt with
          | exception=
     End_of_file -> continue :=3D false
          | line ->
            let input =3D int_of_string @@ String.trim=
     line in
            (* run fib(input) in the thread=
     pool and suspend until
               it's done *)
            let fib_input =3D
              Moonpool.Fut.spawn ~on:tpool (fun () -> fib input)
              |> Moonpool.Fut.await
            in
    
            Lwt_io.write oc (Printf.sprintf =
    "%d\n" fib_input)
              |> M_lwt.await_lwt;
            Lwt_io.flush oc |> M_lwt.await_lwt;
        done;
    
        Printf.printf "done with client on %s\n%!" (str_of_sockaddr client_a=
    ddr);
      in
    
      Printf.printf "listening on port=3D%d\n%!" port;
      let addr =3D Unix.<=
    /span>ADDR_INET<=
    /span> (Unix.inet_addr_any, port) in
      let _server =3D
        Lwt_io.establish_server_with_cli=
    ent_address addr handle_client
        |> M_lwt.await_lwt
      in
    
      M_lwt.await_lwt lwt_fut (* never returns *)
    
    let () =3D
      let port =3D ref 1234 in
      let j =3D ref 8 i=
    n
      let opts =3D
        [
          "-j", Arg.Set_int j, " thread pool size";
          "-p", Arg.Set_int port, " port";
        ]
        |> Arg.align
      in
      Arg.parse opts ignore "echo server";
    
      let@ tpool =3D Moon=
    pool.Ws_pool.with_ ~num_threads:!j () in
      M_lwt.lwt_main @@ f=
    un _ -> main ~port:!p=
    ort ~tpool ()
    

    Note how the computation is done by starting a task in the tpool argument (a moonpool Runner.t provided to the main, by defa= ult a work stealing pool of 8 threads that can be set via -j <numb= er of threads>) and then await-ed from the lwt handl= er. While the computation is running, the lwt client handler is suspended a= nd doesn=E2=80=99t prevent other clients from making progress.

    To test this one, use nc localhost 1234 and write (small) inte= gers to get fib(n) computed. To see it work in parallel, open = top or htop and run:

    for i in `seq 1 200`; do nc localhost 1234 <<< '35' &  done
    

    First release candidate for OCaml 5.4.0

    octachron announced

    The release of OCaml 5.4.0 is imminent.

    As a final step, we are publishing a release candidate to check that everyt= hing is in order before the release in the upcoming week.

    If you find any bugs, please report them on the OCaml's issue tracker.

    Compared to the second beta, this release candidate only contains a fix in = the TSAN mode, and one metadata fix in the changelog itself. The full chang= e log for OCaml 5.4.0 is available on GitHub.

    Happy hacking, Florian Angeletti for the OCaml team.

    Installation instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update opam switch create 5.4.0~rc1

    The source code for the release candidate is also directly available on:

    Fine-tuned compiler configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.4.0~rc1+options <=
    ;option_list>
    

    where <option_list> is a space-separated list of o= caml-option-* packages. For instance, for a flambda and= no-flat-float-array switch:

    opam switch create 5.4.0~rc1+flambda+nffa ocaml-variants.5.4.0~rc1+options =
    ocaml-option-flambda ocaml-option-no-flat-float-array
    

    All available options can be listed with opam search ocaml-option.

    Announcing the OCaml Zulip at ocaml.zulipchat.com

    ancolie announced

    Dear OCaml community,

    There has been a recent renewed interest in maintaining an open, organized = and synchronous communication channel, and the OCaml Zulip has been revived= . It is freely readable without an account at ocaml.zulipchat.org, and can be accessed through various mea= ns of authentication, including Github accounts.

    On Zulip, we have full access to our data at all time, and should the compa= ny change its policy, the data can be retrieved and the current version of = Zulip server is self-hostable. In the meantime, we have been graciously off= ered sponsorship as an open community and can enjoy all features of the pla= tform for free, and we thank Zulip for that.

    The platform can be accessed either on the web (one tab per server), or on = the desktop and mobile client, which allow for managing multiple organizati= ons.

    Talking about multiple organizations, there are already many OCaml, program= ming languages and verification related Zulip servers, such as Rocq, Types, Why3, Catala, Bytecode alliance, Owi or Aeneas= . Check-out the full list of open to the public communities for more.

    Finally, we would like to emphasize that any governance team or project is = welcome to host their discussions on the Zulip, where a channel can be crea= ted and admin rights granted.

    Cheers!

    PS: For anyone already on the Zulip, as part of this effort, the URL was mi= grated from caml.zulipchat.org to ocaml.zulipchat.org and you may have to remove the server and login again.

    An impressive macrobenchmark for eio

    conroj said

    While wandering around the web I came across a link to a slide deck by our own @ka= yceesrk. On slide #35 is a macrobenchmark showing an EIO-based network serv= er, and its throughput is pretty favorable compared to the Rust implementat= ion=E2=80=99s.

    Taking this at face value, it seems like quite an achievement - not only be= cause GC is (supposedly) a handicap for OCaml, but also because this seems = like a major improvement over a similar benchmark from 2022. I couldn=E2=80=99t find links to deeper discussion of these r= esults, so I thought I would ask some of the obvious follow-up questions:

    • Is OCaml=E2=80=99s tail latency on par with Rust=E2=80=99s in these sce= narios?
    • Are both the =E2=80=9COCaml eio=E2=80=9D and =E2=80=9CRust Hyper=E2=80= =9D results using similar kernel capabilities, e.g. io_uring? = (The slide seems to suggest so, but just confirming.)
    • Do these results generalize to different levels of concurrency, request= /response sizes, etc?

    Either way, kudos for raising OCaml=E2=80=99s profile as a platform for sca= lable computing!

    Anil Madhavapeddy replied

    They both used io_uring, yes. The OCaml bindings are at https://github.com/ocaml-multicore/= ocaml-uring ; but note that there are several levels of io_uring usage = possible depending on your tolerance for ranges of Linux kernel support (I= =E2=80=99m just adding zero-copy transmit support at the moment for a proje= ct involving a petabyte of data).

    OCaml=E2=80=99s tail latency will be worse than Rust=E2=80=99s due to havin= g a GC, but not terribly so. As for generalization, those tests were run on= a pre-5.0 version of OCaml, so the whole test suite would have to be rebas= ed against the released versions. A good and useful exercise if someone wou= ld like to have a go at it!

    Thomas Leonard also replied

    I think the benchmarks are from https://github.com/ocaml-multicore/retro-httpaf-benc= h

    I don=E2=80=99t think the Rust ones are using uring, but I=E2=80=99m not su= re. I suspect that all the non-OCaml ones could do with a fan of that langu= age optimising them a bit.

    In my experience, whether the Rust or Eio version gets better throughput de= pends on e.g. the number of connections, and tail latency was always better= with Rust.

    But the basic result is that OCaml is competitive with Rust here.

    nim-ocaml

    Florent Monnier announced

    I read a paper maybe not this one, but it seems it talks about the same thi= ng https://arxiv.org/html/2506= .04657v1. At the beginning I thought it's about the new programming language, but the= n chatgpt explained me that in fact it's a small game with stones. We put a= given number of stones in the middle, and each player can take 1, 2 or 3 s= tones from the stack. There are two variants of the game, the one that only= has one stone in front of him at the end wins or not.

    So I tryed to make a nim-ocaml to play against its Rando= m.state, here below:

    let () =3D
      Random.self_init () ;
      let n =3D 13 + (Ran=
    dom.int 23) in
      let _n =3D ref n =
    in
      let run =3D ref true in
      while !run do
        Printf.printf "%d\n" !_n;
        if !_n <=3D 1 then run :=3D fal=
    se ;
        let line =3D read_line () in
        begin
          try
            let d =3D int_of_string line in
            _n :=3D !_n - d ;
          with _ ->
            Printf.printf "please input an integer number\n%!";
        end;
        let b =3D Random.=
    int 2 + Random.int 3 in
        Printf.printf "b played: %d\n" b;
        _n :=3D !_n - b ;
      done;
      Printf.printf "done!\n" ;
    
    $ \ocaml nim.ml=20
    

    Or later:

    $ wget http://decapode314.free.fr/ocaml2/nim/nim.ml
    
    $ \ocaml nim.ml
    23
    3
    b played: 3
    17
    7
    b played: 0
    10
    3
    b played: 2
    5
    2
    b played: 2
    1
    0
    b played: 0
    done!
    

    Another version to play against your collegue at the pause:

    $ wget http://decapode314.free.fr/ocaml2/nim/.gil/nim.ml.0
    

    Call for Contributions: BOB 2026 (Berlin, March 13 - Deadline = Nov 17)

    Michael Sperber announced

    OCaml contributions are spot-on for BOB - send us some!

    BOB Conference 2026 - Call for Contributions

    =E2=80=9CWhat happens when we use what=E2=80=99s best= for a change?=E2=80=9D

    Looking for Speakers

    You are actively engaged in advanced software engineering methods, solve ambitious problem with software and are open to cutting-edge innovation? Attend this conference, meet people that share your goals, and get to know the best software tools and technologies available today. We strive to offer a day full of new experiences and impressions that you can use to immediately improve your daily life as a software developer.

    If you share our vision and want to contribute, submit a proposal for a talk or tutorial!

    NOTE: The conference fee will be waived for presenters. Travel expenses will not be covered (for exceptions see =E2=80=9CSpeaker Grants=E2= =80=9D).

    Topics

    We are looking for talks about best-of-breed software technology, e.g.:

    • functional programming
    • persistent data structures and databases
    • event-based modelling and architecture
    • =E2=80=9Cfancy types=E2=80=9D (dependent types, gradual typing, linear = types, =E2=80=A6)
    • formal methods for correctness and robustness
    • abstractions for concurrency and parallelism
    • metaprogramming
    • probabilistic programming
    • math and programming
    • controlled side effects
    • program synthesis
    • AI beyond vibecoding and chatbots
    • linked data
    • symbolic AI
    • next-generation IDEs
    • effective abstractions for data analytics
    • =E2=80=A6 everything really that isn=E2=80=99t mainstream, but you thin= k should be
    • =E2=80=A6 including rough ideas that are worth discussing.

    Presenters should provide the audience with information that is practically= useful for software developers.

    Challenges

    Furthermore, we seek contributions on successful approaches for solving har= d problems, for example:

    • bias in machine-learning systems
    • digital transformation in difficult settings
    • accessibility
    • systems with critical reliability requirements
    • ecologically sustainable software development

    We=E2=80=99re especially interested in experience reports.

    Other topics are also relevant, e.g.:

    • introductory talks on technical background
    • overviews of a given field
    • demos and how-tos

    Requirements

    We accept proposals for presentations of 45 minutes (40 minutes talk + 5 minutes questions), as well as 90 minute tutorials for beginners. The language of presentation should be either English or German.

    Your proposal should include (in your presentation language of choice):

    • An abstract of max. 1500 characters.
    • A short bio/cv
    • Contact information (including at least email address)
    • A list of 3-5 concrete ideas of how your work can be applied in a devel= oper=E2=80=99s daily life
    • additional material (websites, blogs, slides, videos of past presentati= ons, =E2=80=A6)

    Submit here

    Organisation

    • Direct questions to konferenz at bobkonf dot de
    • Proposal deadline: November 17, 2025
    • Notification: December 5, 2025
    • Program: December 12, 2025

    Shepherding

    The program committee offers shepherding to all speakers. Shepherding provides speakers assistance with preparing their sessions. Specifically:

    • advice on structure and presentation
    • review of talk slides

    Speaker Grants

    BOB has Speaker Grants available to support speakers from groups under-represented in technology. We specifically seek women speakers, speakers of color, and speakers who are not able to attend the conference for financial reasons.

    ocp-indent 1.9.0

    Nathan Rebours announced

    Here at OCamlPro we=E2=80=99re happy to announce the (long awaited) release= of ocp-indent.1.9.0.

    The full release notes are available here if you want the detailed version.

    1.9.0 contains mostly bug fixes, better and more consistent indentation of = fun _ -> and |>, compatibility with cmdline= r.1.3.0 and above (it works with 2.0.0) and a new utility tool: ocp-i= ndent-gen-rules for those of you who would like to try ocp-ind= ent in a dune fmt like workflow.

    This last bit is documented here.= This is a feature that some of us wanted internally at OCamlPro so we deci= ded to ship it with the tool as an experiment. We=E2=80=99d really like to = hear if this fits your ocp-indent usage so please don=E2=80=99t hesitate to= try it out and give us some feedback.

    We=E2=80=99re also interested in hearing how you use ocp-indent in general = and what you expect from it. Reach out if you have any request!

    We=E2=80=99ve also updated the repo to fit the more recent development stan= dards. We migrated the test suite to dune cram tests and re-enabled them in= opam. Hopefully this should make contributing to ocp-indent a smoother experience!

    Also be aware that we=E2=80=99ll do our best to maintain ocp-indent more ac= tively from now on.

    We=E2=80=99d like to thank our external contributors for this release: @dbu= enzli, @nojb, @bcc32 and @Julow.

    Happy indenting!

    Sketch.sh now supports OCaml 5.3.0

    Javier Ch=C3=A1varri announced

    The interactive OCaml sketchbook sketch.sh has added support for OCaml 5.3.0.

    Existing sketches and forks

    Previously existing sketches remain in their original compiler version, whi= le newly created sketches will be on 5.3.0 by default. For now, the only wa= y to "migrate" a sketch to a newer version of the compiler is by copying it= s content and pasting it in a new sketch.

    Forked sketches inherit the compiler version of the upstream sketch.

    Reporting features and issues

    Please let us= know in case you have a feature request, or if you encounter any issue= s or bugs. Also, don't hesitate to reach out via Reason Discord or Discuss DMs if you would like to contri= bute or participate in the project in some way. There are a lot of opportun= ities to do so, both on the frontend and backend sides.

    OUPS meetup october 2025

    ancolie announced

    The next OUPS meetup will take place on Monday, 13th of October 2025= . It will start at 6:30pm at the 4 place Jussieu in Paris. It= will be in the in the Esclangon building (amphi Astier).

    Please, register on meetup as soon as possible to let us know how ma= ny pizza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    Moreover, we'd like to announce that the organizing team moved to the OCaml Zulip. Feel free to contact us= there if you'd like to suggest talks.

    This time we=E2=80=99ll have the following talks:

    What's the deal with modular implicits ? – Samuel Vivien

    Modular implicits est une extension d'OCaml pr=C3=A9sent=C3=A9e en 2014 com= me une solution =C3=A0 l'absence de type classe en OCaml. Cependant malgr= =C3=A9 l'anciennet=C3=A9 de cette proposition cette fonctionnalit=C3=A9 n'e= st toujours pas disponible dans OCaml. Nous ferons un tour d'horizon de mod= ular implicits pour rappeler comment cette fonctionnalit=C3=A9 marche, ce q= ui as d=C3=A9j=C3=A0 =C3=A9t=C3=A9 impl=C3=A9ment=C3=A9 dans le compilateur= mais aussi ce qu'il reste =C3=A0 faire ainsi que les probl=C3=A9matiques l= i=C3=A9s au typage des implicites.

    Flambda2: Abstractions without Cost – Guillaume Bury

    Surprise.

    After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

    New releases of Merlin (5.6) and OCaml-LSP (1.24.0)

    Xavier Van de Woestyne announced

    We are pleased to announce new releases of Merlin (5.6-504 and 5.6-503) and OCaml-LSP (1.24.0, fo= r 5.4, and 1.23.1)!=20

    This release of Merlin offers, firstly, support for OCaml 5.4<= /code>. It improves support for OpenBSD (for merlin-reader), i= mproves typing recovery in the handling of mutual recursion, and adds a new= feature to the protocol: locate-types. It works similarly to = locate-type, except that it allows you to distinguish between = several locatable types in an expression l= ike this: (int, Foo.t) result enabling the location of: = int, Foo.t and ('a, 'b) result. In additio= n, the Vim client has been fixed for the use of project-wide-occurren= ces.

    The release of OCaml LSP also mainly concerns support for 5.4<= /code> and several bug fixes.

    As with every version upgrade, we are eager to hear user feedback. T= ry out these new releases on your 5.4 switches and don't hesit= ate to report any issues you encounter (Merlin, OCaml LSP)!

    Merlin Changelog

    • Merlin 5.6-504 (& 5.6-5= 03)
      • merlin binary
        • Add locate-types command (#1951)
      • merlin library
        • Fix merlin_reader for OpenBSD (#1956)
        • Improve recovery of mutually recursive definitions (#1962, #1963, fixes= #1953)
        • Support for OCaml 5.4 (#1974) (only for 5.6-504)
      • vim plugin
        • Fix error when :MerlinOccurrencesProjectWide fails to gath= er code previews (#1970)
      • test suite
        • Add more short-paths tests cases (#1904)

    OCaml LSP Changelog

    • 1.24.0 & 1.23.1<= br />
      • features
        • Support for OCaml 5.4 (#1559)
      • fixes
        • Fix hover on method calls not showing the type. (#1553, fixes #1552)
        • Fix error on opening .mll files (#1557)
        • Ensure compatibility with both yojson 2.0 and 3.0. (#1534)

      Happy Hacking! The Merlin Team :man_mage: :two_hump_camel:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=h1Tvtc7s; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=daLpJwau; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 77902400A0 for ; Tue, 14 Oct 2025 09:56:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=H6qAaKcuSjgLLw46pJpC7R2yZhk2Zfr3fcrMEbWvVBU=; b=h1Tvtc7shJJ/h5hUTvAttsHQeveOrjAPviIqAuEb6FTq1WJmHQuXfUcR rvJOhYEAVl9+UD9UQo+xpYv74iDP6ONvzUwqihe/d3hpO7P6+u3aWU/MW oUExJPXlb2NdLBsciyGpqHLvekRnzv4GumpUrlfusC89K0RubOAU1R+yF o=; X-CSE-ConnectionGUID: iF7NNiSZTJie5M04q1f2lw== X-CSE-MsgGUID: 54QCtHOnQH2qMeGuGIr1BA== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,227,1754949600"; d="scan'208,217";a="244122920" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Oct 2025 11:56:54 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id 08BBAE0C55; Tue, 14 Oct 2025 11:56:54 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 525BDE0172 for ; Tue, 14 Oct 2025 11:56:47 +0200 (CEST) X-CSE-ConnectionGUID: rJna6FlhQNSOFG/fYS55tA== X-CSE-MsgGUID: edpEgpVgS86j2/cI2JR33g== IronPort-SDR: 68ee1e5d_VruE5603nIhNoNXaZmUNYJ6yWJZFpmkKWitJBWjRnV0Vn6F vOSGwh39h9ByveJJPYcbMBRD1d6mF93MHJZ5D+g== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GrAwAxHe5ogSIeaIFaHgESCwEMg01bKBkBaF4zBwhJB?= =?us-ascii?q?E6EA4NPhTWIb5FNiEuCMIFpgSwWIxUBAwENLgEbBAECBAEBAwECAYUAAoxMA?= =?us-ascii?q?h8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAQE9B?= =?us-ascii?q?UmGTw2CRRk4cWUJNwEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQIEBAQBAgUKARV3AQgEBhMBATgYIwMUAQYDAhEBNQMBEwESF?= =?us-ascii?q?AaCEFmCIAICTwMFDAaSJJp7Gjd6fzOBAYIMAQEGUjY+AwIJAgIDDy4B2gyBZ?= =?us-ascii?q?AmBSoVtgkoaASpJURoChEcJhDQnD4FVRIFKgVYdSgdvgj8LFwEBAQEBgRUCD?= =?us-ascii?q?AUBEQIBKSQJGIMNgmmCERVTJxQdElmFLIInAwYEQoEzjAqBREszLAFVExcLB?= =?us-ascii?q?wVbgQgDKjQtbjIdgSdDHnOBFINJDxJoDwaBE4NUiWoPhGsDC209NxQbkjlCG?= =?us-ascii?q?RgVgVMvDgoBMwIsECMUBw4FAQcMCAgEAgEBBRsCLggFCR0HAgQBCgUTAQ4NA?= =?us-ascii?q?QoFBQQEARYvCQICCQEBLQOSQxsdBCoDj1mDVopCCJRbNAeEH4FeBgyJCIEml?= =?us-ascii?q?gaEBIFXizyHApJSIpgmPiKCNoYngQAKgRcFCYFva4UjkDMKCB6FM4FSLSNsP?= =?us-ascii?q?x4MBzMaMEOCMwEBMglGHA9Yjn0BCYJCb0+BDBqBIwRFCDu3UkE1AgEBBzECB?= =?us-ascii?q?wEKAQEDCYViAQGMBgICDRcHBWtgAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 4QqbTgsfXxXgnId3Sqtl7C51f3ZUP7SI+0UUBqy IronPort-HdrOrdr: A9a23:SqBVKqgqeoljPo4DC1Pfl74TB3BQXucji2hC6mlwRA09TyX4rb HMoB1/73XJYVkqNk3I9ersBEDiexPhHPxOgLX5VI3KNGLbUQCTQ72Kg7GP/xTQXwXAssRd2a 1jf6UWMqyTMXFKyeDg7k2dG9YkqeP3lJxAaN2uqktQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3AJWZSLWnur3p9LzFXxqjnUB62wtXXOWf/yn6ODUu?= =?us-ascii?q?4MEBSb5O6DlGhw/45j+M7zg=3D=3D?= X-Talos-MUID: 9a23:itYzQwoMDvFGlIuFqeUezzxuLOpn+5qhMxBTk89BsOjeFxYrYDjI2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,227,1754949600"; d="scan'208,217";a="128146267" X-MGA-submission: =?us-ascii?q?MDGCIz0kP0qd671h4r+DeBHJW5oc/6E3a3oywH?= =?us-ascii?q?V5WmFGnJOSGbMsXOC4s2YvA8Athlx7gbuqBUwzXVhcFGEDIZCxnqwyHh?= =?us-ascii?q?RtAFf7q+DOK3lxSIGvC7PUDD00DCA7bGL+20BvUqAVeN4/ApCO59m+Aq?= =?us-ascii?q?gcp7jecd9MVUtB9HhS8uoi8A=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Oct 2025 11:56:45 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D0BE31A335; Tue, 14 Oct 2025 11:56:44 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1760435804; bh=HkyN7k4CdyjjEdCt//HX9X3TRpopc31mjKDwb4uPKJw=; h=From:To:Subject:Date:Message-ID; b=daLpJwau73AexCWyaOB9AELxi+Y6y/PY8qfZpc9QP66C52UZ/K2ryJ4rGDdssH8Eu VDbpRJA5Wwc7dOvHG7EECEnZqI+tUK9OM2te6xn7aRGPO+3s+aW8G53lFD3kcfO04q whRLyEW8raX8Zi/I8h7SFLmtmkcvid6vnjhc8j2U= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Oct 2025 11:56:44 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 14 11:56:45 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499389, queueID=007C51A545 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19388 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 07 to 14, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam-publish 2.7.0 OCaml.org: Introducing Backstage OCaml - Separate Feeds for Stable and Expe= rimental Features LexiFi at FUN OCaml 2025 Introducing `oui' OCaml 5.4.0 released OCaml compiler office hours tutorial about compiling ocaml-5 on a ChromBook with Crostini dune-release-action: Automate your opam package releases with GitHub Actions Other OCaml News Old CWN opam-publish 2.7.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the release of opam-publish 2.7.0 (and 2.6.0), which together brought the ability to more easily publish your releases automatically, thanks to @filipeom: =E2=80=A2 A new `OPAM_PUBLISH_GH_TOKEN' environment variable and `--token' argument are now available to pass the GitHub token =E2=80=A2 SSH keys aren't used to push the branch to the user's fork anymore. Instead the token we already require is used. =E2=80=A2 If undefined, the git config variables `user.name' and `user.em= ail' are automatically filled with the github username and username@opam-publish as a backup An example of the new automated setup can be found in [this CI job]. Other minor changes include: =E2=80=A2 The addition of a message after the PR is open, to notify users= that they can re-run opam-publish to update the PR. *Thanks to @punchagan* =E2=80=A2 The switch from `lwt_ssl' to `tls-lwt' which avoid one dependen= cy and avoid depending on the system libssl Happy publishing! <> <> The opam team <> <> :camel: [this CI job] OCaml.org: Introducing Backstage OCaml - Separate Feeds for Stable and Expe= rimental Features =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're pleased to announce that OCaml.org now has dedicated RSS feeds and pages for stable and experimental announcements, introduced in [PR #3278]! *What's new:* =E2=80=A2 *OCaml Changelog* at [ocaml.org/changelog] =E2=80=94 Official s= table release announcements and updates from the OCaml compiler, OCaml infrastructure, and the OCaml Platform Tools =E2=80=A2 *Backstage OCaml* at [ocaml.org/backstage] =E2=80=94 Updates on= experimental releases, work-in-progress, and opportunities to contribute to the development of the OCaml Platform and its infrastructure This separation helps keep the main changelog focused on production-ready releases while providing a dedicated space for those interested in experimental work, early testing, and contributing to OCaml's development. Both pages have their own RSS feeds, so you can subscribe to whichever matches your needs=E2=80=94or both! We welcome your feedback as we continue improving OCaml.org. [PR #3278] [ocaml.org/changelog] [ocaml.org/backstage] LexiFi at FUN OCaml 2025 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nicolas Ojeda Bar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Dear OCaml enthusiasts, LexiFi participated in this year's [FUN OCaml] that took place in Warsaw this past September 15 and 16. The event was a great success, thanks to the efforts of the organizers and the other participants. Hopefully the event will continue to take place and develop in the future. LexiFi both sponsored and contributed (two) presentations to the event: a 30-minute retrospective on 25 years of using OCaml at LexiFi, and a 2-hour workshop on implementing a toy version of our type-reflection extension to the compiler. If you are interested, we wrote a short blog post where you will find the slides and the video for the 30-minute presentation, as well as the code and the slides for the 2-hour workshop (the video recording for this part is not yet available). Enjoy! Best wishes, Nicolas [FUN OCaml] Introducing `oui' =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 At [OCamlPro] we're happy to announce our new ongoing project funded by the [CEA-List]: ocaml-universal-installer or `oui'! `oui''s goal is to help teams developping applications in OCaml to package them for their users outside the OCaml World by building binary installers for all major platforms: Linux, Windows and macOS. `oui' builds standalone installers: you just need to download and run the file. No need to install OCaml, Opam and to compile anything on the target system anymore. The tool will be used to package and distribute [Frama-C] and its plugins to non opam users. It is still in development but we'd like to present it to the community with the hope that it will prove helpful to you as well. [OCamlPro] [CEA-List] [Frama-C] How it works =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C You take care of building your application and provide `oui' the list of your binaries and extra files you'd like installed alongside them and it will assemble an installer from those. It uses different tools and build different types of installers for all three main platfoms: =E2=80=A2 on Linux, we build self extracting archives using [makeself]. =E2=80=A2 on Windows, we build MSI using the [Wix6 toolset] =E2=80=A2 on macOS, we build regular OSX installers using `pkgbuild~/~productbuild' We started `oui' on top of an older but very similar project: `opam-wix'. `opam-wix' was an opam plugin used to build a Windows MSI from a locally installed opam package. This feature, though not the core focus of the early development, is still available via `opam-oui' and will be extended with the ability to build installers for the other supported platforms. [makeself] [Wix6 toolset] A tool for the community =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Though it is initially developped for Frama-C's distribution, both the CEA-List and ourselves at OCamlPro would like to make `oui' a community tool that can help open source OCaml developpers ship their applications easily. The goal of this early announcement is to gather data and feedback on other use cases for binary installers across the OCaml Ecosystem to help us shape `oui' into the right tool from the start. This is an ongoing project, if you'd like to follow the development, it is publicly hosted [here]. [here] OCaml 5.4.0 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 We have the pleasure of celebrating the birthdays of Camille Saint-Sa=C3=ABns and Karl Schwarzschild by announcing the release of OCaml version 5.4.0. Some of the highlights of OCaml 5.4.0 are: Labelled tuples =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C It is now possible to add labels on tuple fields =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let ( * ) (x,~dx) (y, ~dy) =3D =E2=94=82 x*.y, ~dx:(x *. dy +. y *. dx ) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Those labeled tuples are equivalent to SML records: they are an ordered and structurally-typed variants of records. In particular this implies that partial pattern matching on tuples is only possible for labelled tuples with a known type: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type t =3D float * dx:float =E2=94=82 let v (x_and_dx:t) =3D let (x,..) =3D x_and_dx in x =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Those types are mostly intended for local types where previous code was using tuples. Array literal syntax support for immutable arrays and ~floatarray~s =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C The array literal syntax is now shared by array-like primitive types, like `'a array', `floatarray' and immutable array `iarray'. For instance, this code =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let x =3D Float.Array.of_list [0.;1.;2.] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 can now be written =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let x : floatarray =3D [|0.; 1.; 2.|] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This also supported in patterns =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let one =3D match x with =E2=94=82 | [|_;y;_|] -> Some y =E2=94=82 | _ -> None =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 However array indexing still needs to go through user-defined indexing operators =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let (.$()) =3D Float.Array.get =E2=94=82 let (.$()<-) =3D Float.Array.set =E2=94=82 let () =3D x.$(0) <- x.$(1) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Immutable arrays =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Along with shared array literals, OCaml 5.4 adds support for immutable arrays. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let v: int iarray =3D [| 0; 1; 2 |] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Immutable arrays are covariant in the type of their elements, it is thus possible to coerce immutable arrays with no costs at runtime: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let i1: _ iarray =3D [|object method m =3D 0 end|] =E2=94=82 let i2 =3D ( i1 :> < > iarray) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Atomic record fields =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C It is now possible to mark a field of a record as atomic. Atomic operations on those fields require to use the new `Atomic.Loc' submodule after accessing the location with the `[%atomic.loc ...]' builtin extension. For instance, =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a mpsc_list =3D { mutable head:'a list; mutable tail: 'a = list [@atomic] } =E2=94=82=20 =E2=94=82 let rec push t x =3D =E2=94=82 let before =3D Atomic.Loc.get [%atomic.loc t.tail] in =E2=94=82 let after =3D x :: before in =E2=94=82 if not (Atomic.Loc.compare_and_set [%atomic.loc t.tail] befor= e after) then =E2=94=82 push t x =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Moreover, it is forbidden to pattern match on atomic fields: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f { head; tail } =3D tail =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Error: Atomic fields (here tail) are forbidden in patterns, =E2=94=82 as it is difficult to reason about when the atomic read =E2=94=82 will happen during pattern matching: the field may be re= ad =E2=94=82 zero, one or several times depending on the patterns aro= und it. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 in order to make all reads on those atomic fields explicit. Four new standard library modules: Pair, Pqueue, Repr, and Iarray =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The standard library has been extended with four new modules: =E2=80=A2 Pair: functions for working on pairs =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let ones =3D Pair.map_fst succ (0,1) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Pqueue: priority queues, generic or not =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module Int_pqueue =3D Pqueue.MakeMin(Int) =E2=94=82 let q =3D Int_pqueue.of_list [4;0;5;7] =E2=94=82 let some_zero =3D Int_pqueue.pop_min q =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Repr: physical and structural equality, comparison function, mo= re generically all functions dependent on the memory representation of values. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let f =3D Repr.phys_equal (ref 0) (ref 0) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=80=A2 Iarray: functions on immutable arrays =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let a =3D Iarray.init 10 Fun.id =E2=94=82 let b =3D Iarray.map succ a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Restored "memory cleanup upon exit" mode =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C This mode allows to restart many time the OCaml runtime in C-driven programs that interact with OCaml libraries. It is also useful to reduce noise when tracking memory leaks in C code running the OCaml runtime. To get around cancellation issues, the restored mode currently assumes that all domains are joined before exiting the OCaml runtime. A new section in the reference manual on profiling OCaml programs on Linux = and macOS =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C A new section in the [reference manual] explains how to use OS specific profiling tools to profile native OCaml programs. [reference manual] A lot of incremental changes: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Many runtime and code generation improvements =E2=80=A2 More than thirty new standard library functions =E2=80=A2 Nearly a dozen improved error messages =E2=80=A2 Around fifty bug fixes Please report any unexpected behaviours on the [OCaml issue tracker] and post any questions or comments you might have on our [discussion forums]. The full list of changes can be found in the full changelog. /Editor note: please follow the archive link above for the installation instructions and the full changelog/ Happy hacking, Florian Angeletti for the OCaml team. [OCaml issue tracker] [discussion forums] OCaml compiler office hours =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Continuing this thread, gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The meeting went well =E2=80=93 see the [collaborative pad] for notes. I propose to have another meeting about a month from now: on *November 7th* at *15:30=E2=80=9317:00* UTC (I picked a different time slot from the current one, that also looks reasonable given previous poll results. If extra people would like to join, please feel free to participate to the time-slot poll in [the first post] so that I can tell when are good meeting times.) @giltho thanks for noticing the language issue on the online-meeting service I proposed; this is a new issue that looks like it comes from a version upgrade, it of course had a fine English interface when I adopted the service. Let's keep jitsi.meet for now. [collaborative pad] [the first post] tutorial about compiling ocaml-5 on a ChromBook with Crostini =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Florent Monnier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello dear list, I wrote another mini-tutorial to explain how to compile ocaml-5 on a chromebook with crostini: [http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html] The trick to compile ocaml-5 in this environement was the same than to compile ocaml-4 in the same environement because `ln -s' doesn't seem to produce the expected result. At the beginning I edited the `Makefile' to replace the `ln -s' commands by `cp' commands, but an easier way is to use the `make' feature that permits you to change the value of one of the variable from the command line which invokes `make', like this `make LN=3Dcp'. With this trick everything was producing the expected `ocaml' `tools' with ocaml-4, but with ocaml-5, I have only been able to get `ocamlnat' and `ocamlopt' tools (which is enough.) `ocamlopt' was installed as expected by the `make install' command, but `ocamlnat' had to be copied by hand. If the command `ocaml' produces an error (`cannot execute'), in scripts I can still replace: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/usr/bin/env ocaml =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 by: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 #!/usr/bin/env ocamlnat =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 By defining the same environement variables than `opam' I can get two different ocaml version usable at the same time, one 4 version, and a 5 version, next to each other at the same time, without using `opam' because `opam' grew up a lot, and in crostini environement we quickly lack of space. PS: If someone want to help finding how to get the `ocaml' and `ocamlc' commands functioning, the help will be wellcome, and I will update this mini-tutorial. [http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html] dune-release-action: Automate your opam package releases with GitHub Actions =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: David Sancho announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone =F0=9F=91=8B I'm excited to share a new GitHub Action I've been working on: *dune-release-action* If you maintain OCaml packages, you know the drill: every release involves a ritual of commands and manual steps. You need to: 1. Ensure your CHANGES.md is properly formatted 2. Tag your release 3. Run `dune-release' `lint + distrib + submit' 4. Create a GitHub release with the correct changelog section 5. Check the opam-repository's PR 6. Oh shit, github token is expired 7. Create new token without expiration (??) 8. Retry For me, was following this guide by @anmonteiro, but it typically took around an hour per release. dune-release-action =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C `dune-release-action' automates the entire release workflow in GitHub Actions. Push a git tag, and the action runs dune-release for you with: =E2=80=A2 Handles all the `dune-release' orchestration =E2=80=A2 Validates your changelog format (right tag exists, etc) =E2=80=A2 Creates a GitHub release with proper description (from your changelog section (!!)) =E2=80=A2 Submits a PR to opam-repository =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 name: Release =E2=94=82=20 =E2=94=82 on: =E2=94=82 push: =E2=94=82 tags: =E2=94=82 - '*' =E2=94=82=20 =E2=94=82 permissions: =E2=94=82 contents: write =E2=94=82 pull-requests: write =E2=94=82=20 =E2=94=82 jobs: =E2=94=82 release: =E2=94=82 runs-on: ubuntu-latest =E2=94=82 steps: =E2=94=82 - uses: actions/checkout@v4 =E2=94=82 with: =E2=94=82 fetch-depth: 0 =E2=94=82=20 =E2=94=82 - uses: ocaml/setup-ocaml@v3 =E2=94=82 with: =E2=94=82 ocaml-compiler: 5.3.0 =E2=94=82=20 =E2=94=82 - run: opam install dune-release -y =E2=94=82=20 =E2=94=82 - uses: davesnx/dune-release-action@v1 =E2=94=82 with: =E2=94=82 package-name: 'your-package' =E2=94=82 github-token: ${{ secrets.GH_TOKEN }} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is very much a one-day half vibe-coded project and it's hard to test in many use cases, I'm sure there are edge cases and workflows I haven't considered. =E2=80=A2 *Repository*: =E2=80=A2 *Documentation*: Looking forward to hearing your thoughts! Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [OCaml 5.4 Release: New Features, Fixes, and More!] =E2=80=A2 [Docker base image build rate] =E2=80=A2 [LexiFi at FUN OCaml 2025] =E2=80=A2 [Upcoming OCaml Events] =E2=80=A2 [Updating OCaml CI systems to FreeBSD 14.3] [the ocaml.org blog] [OCaml 5.4 Release: New Features, Fixes, and More!] [Docker base image build rate] [LexiFi at FUN OCaml 2025] [Upcoming OCaml Events] [Updating OCaml CI systems to FreeBSD 14.3] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 07 to 14, 202= 5.

    opam-publish 2.7.0

    Kate announced

    Hi everyone,

    We are happy to announce the release of opam-publish 2.7.0 (and 2.6.0), whi= ch together brought the ability to more easily publish your releases automa= tically, thanks to @filipeom:

    • A new OPAM_PUBLISH_GH_TOKEN environment variable and --token argument are now available to pass the GitHub token
    • SSH keys aren't used to push the branch to the user's fork anymore. Ins= tead the token we already require is used.
    • If undefined, the git config variables user.name and user.email are automatically filled with the github username and us= ername@opam-publish as a backup

    An example of the new automated setup can be found in t= his CI job.

    Other minor changes include:

    • The addition of a message after the PR is open, to notify users that th= ey can re-run opam-publish to update the PR. Thanks to @punchagan
    • The switch from lwt_ssl to tls-lwt which avoi= d one dependency and avoid depending on the system libssl

    Happy publishing!

    <> <> The opam team <> <> :camel:

    OCaml.org: Introducing Backstage OCaml - Separate Feeds for St= able and Experimental Features

    Sabine Schmaltz announced

    We're pleased to announce that OCaml.org now has dedicated RSS feeds and pa= ges for stable and experimental announcements, introduced in PR #3278!

    What's new:

    • OCaml Changelog at ocaml= .org/changelog =E2=80=94 Official stable release announcements and upda= tes from the OCaml compiler, OCaml infrastructure, and the OCaml Platform T= ools
    • Backstage OCaml at ocaml= .org/backstage =E2=80=94 Updates on experimental releases, work-in-prog= ress, and opportunities to contribute to the development of the OCaml Platf= orm and its infrastructure

    This separation helps keep the main changelog focused on production-ready r= eleases while providing a dedicated space for those interested in experimen= tal work, early testing, and contributing to OCaml's development.

    Both pages have their own RSS feeds, so you can subscribe to whichever matc= hes your needs=E2=80=94or both!

    We welcome your feedback as we continue improving OCaml.org.

    LexiFi at FUN OCaml 2025

    Nicolas Ojeda Bar announced

    Dear OCaml enthusiasts,

    LexiFi participated in this year's FUN OC= aml that took place in Warsaw this past September 15 and 16. The event = was a great success, thanks to the efforts of the organizers and the other = participants. Hopefully the event will continue to take place and develop i= n the future.

    LexiFi both sponsored and contributed (two) presentations to the event: a 3= 0-minute retrospective on 25 years of using OCaml at LexiFi, and a 2-hour w= orkshop on implementing a toy version of our type-reflection extension to t= he compiler.

    If you are interested, we wrote a short blog post https://www.lexifi.com/blog/ocaml/fun-= ocaml-2025/ where you will find the slides and the video for the 30-min= ute presentation, as well as the code and the slides for the 2-hour worksho= p (the video recording for this part is not yet available).

    Enjoy!

    Best wishes, Nicolas

    Introducing oui

    Nathan Rebours announced

    At OCamlPro we're happy to announce o= ur new ongoing project funded by the CE= A-List: ocaml-universal-installer or oui!

    oui's goal is to help teams developping applications in OCaml = to package them for their users outside the OCaml World by building binary = installers for all major platforms: Linux, Windows and macOS.

    oui builds standalone installers: you just need to download an= d run the file. No need to install OCaml, Opam and to compile anything on t= he target system anymore.

    The tool will be used to package and distribute Frama-C and its plugins to non opam users.

    It is still in development but we'd like to present it to the community wit= h the hope that it will prove helpful to you as well.

    How it works

    You take care of building your application and provide oui the= list of your binaries and extra files you'd like installed alongside them = and it will assemble an installer from those.

    It uses different tools and build different types of installers for all thr= ee main platfoms:

    • on Linux, we build self extracting archives using makeself.
    • on Windows, we build MSI using the = Wix6 toolset
    • on macOS, we build regular OSX installers using pkgbuild~/~produc= tbuild

    We started oui on top of an older but very similar project: opam-wix. opam-wix was an opam plugin used to build= a Windows MSI from a locally installed opam package. This feature, though = not the core focus of the early development, is still available via o= pam-oui and will be extended with the ability to build installers fo= r the other supported platforms.

    A tool for the community

    Though it is initially developped for Frama-C's distribution, both the CEA-= List and ourselves at OCamlPro would like to make oui a commun= ity tool that can help open source OCaml developpers ship their application= s easily.

    The goal of this early announcement is to gather data and feedback on other= use cases for binary installers across the OCaml Ecosystem to help us shap= e oui into the right tool from the start.

    This is an ongoing project, if you'd like to follow the development, it is = publicly hosted here.

    OCaml 5.4.0 released

    octachron announced

    We have the pleasure of celebrating the birthdays of Camille Saint-Sa=C3=AB= ns and Karl Schwarzschild by announcing the release of OCaml version 5.4.0.

    Some of the highlights of OCaml 5.4.0 are:

    Labelled tuples

    It is now possible to add labels on tuple fields

    let ( * ) (x,~dx) (y, ~dy) =3D
      x*.y, ~dx:(x *. dy +. y *. dx )
    

    Those labeled tuples are equivalent to SML records: they are an ordered and structurally-typed variants of records. In particular this implies that partial pattern matching on tuples is only possible for labelled tuples wit= h a known type:

    type t =3D float *=
     dx:float
    let v (x_and_dx:t) =3D let (x,..) =3D x_and_dx in<=
    /span> x
    

    Those types are mostly intended for local types where previous code was usi= ng tuples.

    Array literal syntax support for immutable arrays and= ~floatarray~s

    The array literal syntax is now shared by array-like primitive types, like = 'a array, floatarray and immutable array iarray. For instance, this code

    let x =3D Float.Array.of_list [0.;1.;2.]
    

    can now be written

    let x : floatarray =3D [|0.; 1.; 2.|]
    

    This also supported in patterns

    let one =3D match x wi=
    th
      | [|_;y;_|] -> Some y
      | _ -> None
    

    However array indexing still needs to go through user-defined indexing oper= ators

    let (.$()) =3D Float.Array.get
    let (.$()<-) =3D F=
    loat.Array.set
    let () =3D x.$(0) <- x.$(1)
    

    Immutable arrays

    Along with shared array literals, OCaml 5.4 adds support for immutable arra= ys.

    let v: int iarray =3D [| 0; 1; 2 |]
    

    Immutable arrays are covariant in the type of their elements, it is thus po= ssible to coerce immutable arrays with no costs at runtime:

    let i1: _ iarray =3D [|object method m =3D 0 end|]
    let i2 =3D ( i1 :> < > iarray)
    

    Atomic record fields

    It is now possible to mark a field of a record as atomic. Atomic operatio= ns on those fields require to use the new Atomic.Loc submodule after= accessing the location with the [%atomic.loc ...] builtin extension. For ins= tance,

    type 'a mpsc_list =
    =3D { mutable head:'a list; mutable tail: 'a list [@atomic] }
    
    let rec push t x =3D
      let before =3D Atom=
    ic.Loc.get ] in<=
    /span>
      let after =3D x ::<=
    /span> before in
      if not (Atomic.Loc.compare_and_=
    set [%atomic.loc=
     t.tail]<=
    /span> before after) then
        push t x
      ...
    

    Moreover, it is forbidden to pattern match on atomic fields:

    let f { head; tail } =3D tail
    
    Error: Atomic fields (here tail) are forbidden in patterns,
           as it is difficult to reason about when the atomic read
           will happen during pattern matching: the field may be read
           zero, one or several times depending on the patterns around it.
    

    in order to make all reads on those atomic fields explicit.

    Four new standard library modules: Pair, Pqueue, Repr= , and Iarray

    The standard library has been extended with four new modules:

    • Pair: functions for working on pairs
    let ones =3D Pair.map_fst succ (0,1)
    
    • Pqueue: priority queues, generic or not
    module Int_pqueue =
    =3D Pqueue.MakeMin(Int)
    let q =3D Int_pqueu=
    e.of_list [4;0;5;7]
    let some_zero =3D I=
    nt_pqueue.pop_min q
    
    • Repr: physical and structural equality, comparison function, more generically all functions dependent on the memory representation of values.
    let f =3D Repr.phys_equal (ref 0) (ref 0)
    
    • Iarray: functions on immutable arrays
    let a =3D Iarray.init 10 Fun.id
    let b =3D Iarray.map succ a
    

    Restored "memory cleanup upon exit" mode

    This mode allows to restart many time the OCaml runtime in C-driven programs that interact with OCaml libraries. It is also useful to reduce noise when tracking memory leaks in C code running the OCaml runtime. To get around cancellation issues, the restored mode currently assumes that all domains a= re joined before exiting the OCaml runtime.

    A new section in the reference manual on profiling OC= aml programs on Linux and macOS

    A new section in the refer= ence manual explains how to use OS specific profiling tools to profile native OCaml programs.

    A lot of incremental changes:

    • Many runtime and code generation improvements
    • More than thirty new standard library functions
    • Nearly a dozen improved error messages
    • Around fifty bug fixes

    Please report any unexpected behaviours on the OCaml issue tracker and post any questions or comments you might have on our discus= sion forums.

    The full list of changes can be found in the full changelog. Editor note= : please follow the archive link above for the installation instructions an= d the full changelog

    Happy hacking, Florian Angeletti for the OCaml team.

    OCaml compiler office hours

    Continuing this thread, gasche announced

    The meeting went well – see the collaborative pad for notes.

    I propose to have another meeting about a month from now:

    on November 7th at 15:30–17:00 UTC

    (I picked a different time slot from the current one, that also looks reaso= nable given previous poll results. If extra people would like to join, plea= se feel free to participate to the time-slot poll in the first post so t= hat I can tell when are good meeting times.)

    @giltho thanks for noticing the language issue on the online-meeting servic= e I proposed; this is a new issue that looks like it comes from a version u= pgrade, it of course had a fine English interface when I adopted the servic= e. Let's keep jitsi.meet for now.

    tutorial about compiling ocaml-5 on a ChromBook with Crostini<= /h2>

    Florent Monnier announced

    Hello dear list, I wrote another mini-tutorial to explain how to compile ocaml-5 on a chrome= book with crostini: http://decapode314.free.fr/ocaml2/tut/tut-ocaml-5/tut-ocaml-5.html The trick to compile ocaml-5 in this environement was the same than to comp= ile ocaml-4 in the same environement because ln -s doesn't see= m to produce the expected result. At the beginning I edited the Makefile to replace the ln= -s commands by cp commands, but an easier way is to us= e the make feature that permits you to change the value of one= of the variable from the command line which invokes make, lik= e this make LN=3Dcp.

    With this trick everything was producing the expected ocaml tools with ocaml-4, but with ocaml-5, I have only been able to g= et ocamlnat and ocamlopt tools (which is enough.)

    ocamlopt was installed as expected by the make install command, but ocamlnat had to be copied by hand.

    If the command ocaml produces an error (cannot execute), in scripts I can still replace:

    #!/usr/bin/env ocaml
    

    by:

    #!/usr/bin/env ocamlnat
    

    By defining the same environement variables than opam I can ge= t two different ocaml version usable at the same time, one 4 version, and a= 5 version, next to each other at the same time, without using opam because opam grew up a lot, and in crostini environement= we quickly lack of space.

    PS: If someone want to help finding how to get the ocaml and <= code>ocamlc commands functioning, the help will be wellcome, and I w= ill update this mini-tutorial.

    dune-release-action: Automate your opam package releases with = GitHub Actions

    David Sancho announced

    Hi everyone =F0=9F=91=8B

    I'm excited to share a new GitHub Action I've been working on: dune-rele= ase-action

    If you maintain OCaml packages, you know the drill: every release involves = a ritual of commands and manual steps. You need to:

    1. Ensure your CHANGES.md is properly formatted
    2. Tag your release
    3. Run dune-release lint + distrib + submit
    4. Create a GitHub release with the correct changelog section
    5. Check the opam-repository's PR
    6. Oh shit, github token is expired
    7. Create new token without expiration (??)
    8. Retry

    For me, was following this guide https://gist.github.com/anmonteiro/ab= d9275456888740758aa9f772d1992a by @anmonteiro, but it typically took ar= ound an hour per release.

    dune-release-action

    dune-release-action automates the entire release workflow in G= itHub Actions. Push a git tag, and the action runs dune-release for you wit= h:

    • Handles all the dune-release orchestration
    • Validates your changelog format (right tag exists, etc)
    • Creates a GitHub release with proper description (from your changelog s= ection (!!))
    • Submits a PR to opam-repository
    name: Release
    
    on:
      push:
        tags:
          - '*'
    
    permissions:
      contents: write
      pull-requests: write
    
    jobs:
      release:
        runs-on: ubuntu-latest
        steps:
          - uses: actions/checkout@v4
            with:
              fetch-depth: 0
    
          - uses: ocaml/setup-ocaml@v3
            with:
              ocaml-compiler: 5.3.0
    
          - run: opam install dune-release -y
    
          - uses: davesnx/dune-release-action@v1
            with:
              package-name: 'your-package'
              github-token: ${{ secrets.GH_TOKEN }}
    

    This is very much a one-day half vibe-coded project and it's hard to test i= n many use cases, I'm sure there are edge cases and workflows I haven't con= sidered.

    Looking forward to hearing your thoughts!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=hVqENRvZ; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=UVT/Sezx; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 3F1034009D for ; Tue, 21 Oct 2025 09:17:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=wpU+B2lOY0ZuVjf0lfZZD9XHzTzeof6zdWFA74UnZGk=; b=hVqENRvZvWcjKAOB4WwHe3f5wwiqXrnZR8aHsY+/u+xVnQecVkvnpbeM Du83igEUmkTdQkezmZyenRohcqG7+Fp8pnp/oeRx9slsM/hyPX7CHffPE /3lOT/4aE0070a+LrNpzjy48GHWCfSuuMUvW95wEZKy9+lAkvyb7dsP7u o=; X-CSE-ConnectionGUID: w67y90rRT22VvyjKcWTpDA== X-CSE-MsgGUID: 7PivSmycSb+4+W+zgvZe3g== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,244,1754949600"; d="scan'208,217";a="245403072" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Oct 2025 11:17:55 +0200 Received: by sympa.inria.fr (Postfix, from userid 20132) id D7E99E0CD6; Tue, 21 Oct 2025 11:17:54 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id BB14EE0171 for ; Tue, 21 Oct 2025 11:17:49 +0200 (CEST) X-CSE-ConnectionGUID: nAU1bJ4kS0GEhIBwJ5wqRA== X-CSE-MsgGUID: REU13J7MSfKzhRopzbeoWQ== IronPort-SDR: 68f74fbd_V8vSH6JJIZJTOFQNMQ4yYp8X2FIZz5dbcDGk5IGnAP0UZ/b bN9ZZ4GeUE83pvjZUEf73EEFdjVFIkoyLfcBotQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GxAwBeTvdobSIeaIFahBaBAwcSAWheMwcISYRVg0+OJ?= =?us-ascii?q?JxIgysiFgEDAQ0uARUKAQIEAQEDAQIBhQACFow2Ah8GAQQ0EwECBAEBAQEDA?= =?us-ascii?q?gMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQREmGTw2CRVFxgSUBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAgBgScKEwEBK?= =?us-ascii?q?w0YIwMUBwMCBA0BNRcBEhQGgmmCIAICTwMFDJElm0x6gTKBAYIMAQEGgQg+A?= =?us-ascii?q?hMP2juBZAmBSoVtgkoaASpJawKER4Q9Jw+BVUSBSoJEb4JKFwEBAQEYgSQBA?= =?us-ascii?q?QhFCYMlgmmCJnoUHYYLkTuBREszLAFVExcLBwVbgQgDKjQtbjIdgSdBGHOBF?= =?us-ascii?q?INJDxJoDwaBE4NUiV0PhlcDC209NxQbkyJCGSyCAg5sHww3KQEBIAI2OSIBJ?= =?us-ascii?q?gUJGwMsCw0wkn8dngGUYzQHhB+BXgYMiQiBJpYGhVulECKYZCKJXYEmCYJal?= =?us-ascii?q?TQshVmBfyOBXDMaMEOCMwEBMglGHA+SIYE+gSaBdDt9t39BNQEBAQE4AgcBC?= =?us-ascii?q?gEBAwmFYgEBjDqBSwEB?= IronPort-PHdr: A9a23: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 iqusYOH2CTYSIjMvwaFVi+jCvccncJfcnswfQ== IronPort-Data: A9a23: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 TBdeF2oi31XhaI8/QiMtpKV9NwkUOvT8ggV IronPort-HdrOrdr: A9a23:DaBqw6Adop7IMXflHemR55DYdb4zR+YMi2TDtnoBKiC9F/bzqy nAppomPHPP5Qr5O0tBpTnjAsi9qBrnnPYf3WB7B9iftWfd1FeAHcVL0s/JwjHrGSHyn9Qtt5 tIQuxZE9O1KVB7iK/BkW2F+jsbsby6zJw= X-Talos-CUID: =?us-ascii?q?9a23=3AavqXdGpglxCJo04Mip3xThTmUcYMTyTX7ivTGBe?= =?us-ascii?q?XJGZIYqK3FECJwooxxg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3AgwJZeQ0zLJXXoHM+ZKeOJrur3jUj2YmTURsvzrA?= =?us-ascii?q?9teqWNRZ3IyWXgTOIe9py?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,244,1754949600"; d="scan'208,217";a="245403022" X-MGA-submission: =?us-ascii?q?MDEzKYwvlzLbv1HcZBFMewjxFpphNNsxfmC89L?= =?us-ascii?q?35Jl69h/dFzTnTjfE8BkVm/t1Bc03JL0NryG5GbR/zx1CNxsg6fU5Pb5?= =?us-ascii?q?hgYO+9iEZjKEroHou8/F2t0N1gCsSRJwH4S6sTA6F4Hn0ibbBs2gigkB?= =?us-ascii?q?c9TL3K8BIC87Jkr+Rxa8H7PA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Oct 2025 11:17:49 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id BA57F1A904; Tue, 21 Oct 2025 11:17:48 +0200 (CEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1761038268; bh=n2obJTD8rds2ZN4wleHoppt4com8whgYk/eH2TAFL3A=; h=From:To:Subject:Date:Message-ID; b=UVT/SezxJys1LZKQzKPVJmFlfhcEQtCepy+lQdFHEHIoPcKodjuqqH8PS+DCVnEAm bgEqbU6c8J7UVhpA0DukNROcVurKv5au/oylfHtCPHUNjvJe5YG93sAjJd84tbgZpn RrFBpdvGHh0hxitMimnz7KW4yr10kKLoCyHdaz2w= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 21 Oct 2025 11:17:47 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 21 11:17:48 2025 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499591, queueID=D91B91A90C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19390 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgT2N0b2JlciAxNCB0byAyMSwNCjIwMjUuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KQmFja3N0 YWdlIE9DYW1sOiBvY2FtbC5udmltIC0gQSBOZW92aW0gUGx1Z2luIGZvciBPQ2FtbA0KT2NhbWwg bm90ZWJvb2tzIGluIHdlYiBicm93c2VyDQpDdXJlMiAtIGNvbWJpbmF0b3IgZnJvbnRlbmQgZm9y IHJlMg0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkJhY2tzdGFnZSBPQ2FtbDogb2Nh bWwubnZpbSAtIEEgTmVvdmltIFBsdWdpbiBmb3IgT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWJhY2tzdGFnZS1vY2FtbC1vY2FtbC1udmltLWEtbmVv dmltLXBsdWdpbi1mb3Itb2NhbWwvMTczODMvMT4NCg0KDQpDaGFybMOobmVfR3JvcyBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIFdl4oCZcmUgZXhjaXRlZCB0byBhbm5vdW5jZSAqKm9jYW1s Lm52aW0qKiwgYSBuZXcgTmVvdmltIHBsdWdpbiBhY3RpdmVseQ0KICBiZWluZyBkZXZlbG9wZWQg YnkgVGFyaWRlcyB0aGF0IGJyaW5ncyBhZHZhbmNlZCBPQ2FtbCBkZXZlbG9wbWVudA0KICBmZWF0 dXJlcyB0byBOZW92aW0gdXNlcnMuIFRoaW5rIG9mIGl0IGFzIHRoZSBOZW92aW0gc2libGluZyBv Zg0KICBbb2NhbWwtZWdsb3RdLCB3aGljaCB3ZSByZWxlYXNlZCBlYXJsaWVyIHRoaXMgeWVhciBm b3IgRW1hY3MgdXNlcnMuDQoNCg0KW29jYW1sLWVnbG90XSA8aHR0cHM6Ly9naXRodWIuY29tL3Rh cmlkZXMvb2NhbWwtZWdsb3Q+DQoNCldoYXQgaXMgb2NhbWwubnZpbT8NCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE1vZGVybiBj b2RlIGVkaXRvcnMgY29tbXVuaWNhdGUgd2l0aCBwcm9ncmFtbWluZyBsYW5ndWFnZXMgdGhyb3Vn aCB0aGUNCiAgTGFuZ3VhZ2UgU2VydmVyIFByb3RvY29sIChMU1ApLCB3aGljaCBwcm92aWRlcyBl c3NlbnRpYWwgZmVhdHVyZXMgbGlrZQ0KICBzeW50YXggY2hlY2tpbmcsIGNvZGUgbmF2aWdhdGlv biwgYW5kIGF1dG8tY29tcGxldGlvbi4gSG93ZXZlciwNCiAgT0NhbWzigJlzIGxhbmd1YWdlIHNl cnZlciBleHBvc2VzIHBvd2VyZnVsIGN1c3RvbSBjb21tYW5kcyBiZXlvbmQgd2hhdA0KICBnZW5l cmljIExTUCBjbGllbnRzIGNhbiBhY2Nlc3MuDQoNCiAgb2NhbWwubnZpbSB3b3JrcyBhbG9uZ3Np ZGUgZ2VuZXJpYyBOZW92aW0gTFNQIHBsdWdpbnMgbGlrZQ0KICBgbnZpbS1sc3Bjb25maWcnLCBw cm92aWRpbmcgZGlyZWN0IGFjY2VzcyB0byBhZHZhbmNlZCBvY2FtbGxzcA0KICBmZWF0dXJlcyB3 aXRob3V0IHJlcXVpcmluZyBjb21wbGV4IGVkaXRvci1zaWRlIGxvZ2ljLiBUaGUgcGx1Z2luIGdp dmVzDQogIHlvdSBhY2Nlc3MgdG8gYWxsIHRoZSBhZHZhbmNlZCBNZXJsaW4gY29tbWFuZHMgbm90 IHN1cHBvcnRlZCBieQ0KICBnZW5lcmljIExTUCBjbGllbnRzLg0KDQoNCktleSBGZWF0dXJlcw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgKlR5cGVkIEhvbGVzIE5h dmlnYXRpb24qIC0gTmF2aWdhdGUgYmV0d2VlbiB0eXBlZCBob2xlcyAoYF8nKSBhbmQNCiAgIGlu dGVyYWN0aXZlbHkgc3Vic3RpdHV0ZSB0aGVtIHdpdGggdGhlIENvbnN0cnVjdCBjb21tYW5kLg0K DQogICpTZW1hbnRpYyBOYXZpZ2F0aW9uKiAtIE1vdmUgdGhyb3VnaCB5b3VyIGNvZGUgc2VtYW50 aWNhbGx5OiBqdW1wDQogICBiZXR3ZWVuIGV4cHJlc3Npb25zLCBwYXJlbnQgYGxldCcgYmluZGlu Z3MsIG1vZHVsZXMsIGZ1bmN0aW9ucywgYW5kDQogICBgbWF0Y2gnIGV4cHJlc3Npb25zLg0KDQog ICpQaHJhc2UgTmF2aWdhdGlvbiogLSBNb3ZlIGJldHdlZW4gT0NhbWwgcGhyYXNlcyAodG9wLWxl dmVsDQogICBkZWZpbml0aW9ucykgaW4geW91ciBidWZmZXIuDQoNCiAgTWFueSBtb3JlIGZlYXR1 cmVzIGFyZSBpbiBkZXZlbG9wbWVudCwgaW5jbHVkaW5nIGFsdGVybmF0aW5nIGJldHdlZW4NCiAg YC5tbCcgYW5kIGAubWxpJyBmaWxlcywgdHlwZSBlbmNsb3NpbmcsIGFuZCBwYXR0ZXJuIG1hdGNo aW5nDQogIGdlbmVyYXRpb24uDQoNCg0KR2V0dGluZyBTdGFydGVkDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJbnN0YWxsYXRpb24gaXMgc3RyYWln aHRmb3J3YXJkIHdpdGggbGF6eS5udmltOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgcmVx dWlyZSgibGF6eSIpLnNldHVwKHsNCiAg4pSCICAgeyAidGFyaWRlcy9vY2FtbC5udmltIiwNCiAg 4pSCICAgICBjb25maWcgPSBmdW5jdGlvbigpDQogIOKUgiAgICAgICByZXF1aXJlKCJvY2FtbCIp LnNldHVwKCkNCiAg4pSCICAgICBlbmQNCiAg4pSCICAgfQ0KICDilIIgfSkNCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgVGhlIHBsdWdpbiBjb21wbGVtZW50cyB5b3VyIGV4aXN0aW5nIExTUCBzZXR1 cOKAlHlvdeKAmWxsIGNvbnRpbnVlIHRvIHVzZQ0KICBOZW92aW3igJlzIGJ1aWx0LWluIExTUCBm b3Igc3RhbmRhcmQgZmVhdHVyZXMgd2hpbGUgb2NhbWwubnZpbSBhZGRzDQogIE9DYW1sLXNwZWNp ZmljIGNhcGFiaWxpdGllcy4NCg0KDQpQcm9qZWN0IFN0YXR1cw0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIG9jYW1sLm52aW0gcmVwb3NpdG9yeSBp cyBub3cgcHVibGljIG9uIFtHaXRIdWJdLCB3aXRoDQogIGNvbXByZWhlbnNpdmUgZG9jdW1lbnRh dGlvbiwgYSBmZWF0dXJlIHRhYmxlLCBhbmQgc2NyZWVuY2FzdA0KICBkZW1vbnN0cmF0aW9ucy4g V2XigJlyZSB3b3JraW5nIHRvd2FyZHMgYSBzdGFibGUgMS4wIHJlbGVhc2UgYW5kIHdlbGNvbWUN CiAgZmVlZGJhY2sgZnJvbSB0aGUgY29tbXVuaXR5Lg0KDQogIFRyeSBvdXQgYG9jYW1sLm52aW0n IGFuZCBsZXQgdXMga25vdyB3aGF0IHlvdSB0aGluayEgRm9yIHF1ZXN0aW9ucyBvcg0KICBmZWVk YmFjaywgeW91IGNhbiBwb3N0IGFuIGlzc3VlIG9uIHRoZSBvY2FtbC5udmltIEdpdEh1YiByZXBv c2l0b3J5Lg0KDQoNCltHaXRIdWJdIDxodHRwczovL2dpdGh1Yi5jb20vdGFyaWRlcy9vY2FtbC5u dmltPg0KDQoNCk9jYW1sIG5vdGVib29rcyBpbiB3ZWIgYnJvd3Nlcg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9vY2FtbC1ub3RlYm9va3MtaW4td2ViLWJyb3dzZXIvMTczODUvMT4NCg0KDQpEYXZ5 IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSGVsbG8gZXZlcnlvbmUgIQ0KDQogIEnigJltIGN1cnJlbnRseSBsZWFybmluZyBPY2FtbCwg YW5kIGZvdW5kIG5vIGJldHRlciB3YXkgdG8gbGVhcm4gdGhhbg0KICB3b3JraW5nIG9uIGEgcHJv amVjdCA6DQoNCiAgSeKAmW0gaGFwcHkgdG8gYW5ub3VuY2UgKnhldXMtb2NhbWwqLCBhIG5ldyBr ZXJuZWwgdG8gcnVuIE9jYW1sIGZyb20NCiAgKkp1cHl0ZXJsaXRlKiBub3RlYm9va3MgOnBhcnR5 aW5nX2ZhY2U6DQoNCiAgSeKAmW0gZmFyIGZyb20gYSBwcm9mZXNzaW9uYWwgZGV2ZWxvcGVyLCBh bmQgdmVyeSBuZXcgdG8gT2NhbWwsIHNvIGRvDQogIG5vdCBoZXNpdGF0ZSB0byBbdHJ5IGl0XSB3 aXRoIHlvdXIgd29ya2Zsb3csIHJlcG9ydCBhbnkgW25ldyBpc3N1ZXNdLA0KICBhc2sgZm9yIG90 aGVyIGV4dGVybmFsIGxpYnJhcmllcyAoY3VycmVudGx5IG9ubHkgc3RkbGliIGFuZA0KICBvY2Ft bGdyYXBoKSwgb3IgY29udHJpYnV0ZSB0byBpdHMgZGV2ZWxvcG1lbnQgdG8gbWFrZSB0aGUgY29k ZSBtb3JlDQogIHJvYnVzdCBhbmQgaWRpb21hdGljLg0KDQogIEFueSBmZWVkYmFjayB3b3VsZCBi ZSBhcHByZWNpYXRlZCENCg0KDQpbdHJ5IGl0XQ0KPGh0dHBzOi8vZGF2eTM5LmdpdGh1Yi5pby94 ZXVzLW9jYW1sL2xhYi9pbmRleC5odG1sP3BhdGg9ZGVtby5pcHluYj4NCg0KW25ldyBpc3N1ZXNd IDxodHRwczovL2dpdGh1Yi5jb20vZGF2eTM5L3hldXMtb2NhbWwvaXNzdWVzL25ldz4NCg0KDQpD dXJlMiAtIGNvbWJpbmF0b3IgZnJvbnRlbmQgZm9yIHJlMg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3VyZTItY29tYmluYXRvci1mcm9udGVuZC1mb3ItcmUyLzE3 NDEwLzE+DQoNCg0KRW1pbGUgVHJvdGlnbm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgW0N1cmUyXSBpcyBhIGxpdHRsZSBsaWJyYXJ5IEkganVzdCBtYWRlLCB0aGF0IHByb3Zp ZGUgYSBjb21iaW5hdG9yDQogIGZyb250ZW5kIHRvIFJlMi4NCg0KICBXaXRoIGl0LCBpbnN0ZWFk IG9mDQogIGAiaHR0cHM/OlxcL1xcLyg/Ond3d1xcLik/Wy1hLXpBLVowLTlAOiUuX1xcK34jPV17 MSwyNTZ9XFwuW2EtekEtWjAtOSgpXXsxLDZ9XFxiKD86Wy1hLXpBLVowLTkoKUA6JV9cXCsufiM/ Ji8vPV0qKSInLA0KICB5b3UgY2FuIHdyaXRlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg bGV0IHNlY29uZF9sZXZlbF9jaGFyID0gY2hhcnNldCBDaGFyc2V0LltBc2NpaS5hbG51bTsgY2hh cnMgIi1AOiUuX1xcK34jPSJdIGluDQogIOKUgiBsZXQgdG9wX2xldmVsX2NoYXJzID0gY2hhcnNl dCBDaGFyc2V0LltBc2NpaS5hbG51bTsgY2hhcnMgIigpIl0gaW4NCiAg4pSCIGxldCBwYXRoX2No YXJzID0gY2hhcnNldCBDaGFyc2V0LltBc2NpaS5hbG51bTsgY2hhcnMgIigpQDolX1xcKy5+Iz8m Lz0iXSBpbg0KICDilIIgc3RyICJodHRwIiArICE/KGNoYXIgJ3MnKSArIHN0ciAiOi8vIg0KICDi lIIgKyAhPyhzdHIgInd3dy4iKSArIHJlcCB+bWluOjEgfm1heDoyNTYgc2Vjb25kX2xldmVsX2No YXINCiAg4pSCICsgY2hhciAnLicgKyByZXAgfm1pbjoxIH5tYXg6NiB0b3BfbGV2ZWxfY2hhcnMN CiAg4pSCICsgYm93ICsgcmVwIHBhdGhfY2hhcnMNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW0N1 cmUyXSA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9jdXJlMj4NCg0KDQpPdGhlciBPQ2FtbCBO ZXdzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K RnJvbSB0aGUgb2NhbWwub3JnIGJsb2cNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlcmUgYXJlIGxpbmtz IGZyb20gbWFueSBPQ2FtbCBibG9ncyBhZ2dyZWdhdGVkIGF0IFt0aGUgb2NhbWwub3JnDQogIGJs b2ddLg0KDQogIOKAoiBbU2V0dGluZyB1cCBPcGVuIFRlbGVtZXRyeSAoT1RlbCwgUHJvbWV0aGV1 cywgR3JhZmFuYSBhbmQgSmFlZ2VyKQ0KICAgIHdpdGggT0NhbWxdDQogIOKAoiBbQ0kgc3VwcG9y dCBmb3IgT0NhbWwgNS40XQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1s Lm9yZy9ibG9nLz4NCg0KW1NldHRpbmcgdXAgT3BlbiBUZWxlbWV0cnkgKE9UZWwsIFByb21ldGhl dXMsIEdyYWZhbmEgYW5kIEphZWdlcikgd2l0aA0KT0NhbWxdIDxodHRwczovL2ZlYXJmdWwtb2Rk cy5yb2Nrcy9ibG9nL3NldHRpbmctdXAtb3RlbC13aXRoLW9jYW1sPg0KDQpbQ0kgc3VwcG9ydCBm b3IgT0NhbWwgNS40XQ0KPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMTAvMTgvY2ktc3Vw cG9ydC1mb3Itb2NhbWwtNTQvPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3Nh Z2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhl IGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5 b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1 YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpb c2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3Jn Pg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoN CltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0 L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1w YS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 14 to 21, 202= 5.

    Backstage OCaml: ocaml.nvim - A Neovim Plugin for OCaml

    Charl=C3=A8ne_Gros announced

    We=E2=80=99re excited to announce ocaml.nvim, a new Neovim pl= ugin actively being developed by Tarides that brings advanced OCaml develop= ment features to Neovim users. Think of it as the Neovim sibling of ocaml-eglot, which we relea= sed earlier this year for Emacs users.

    What is ocaml.nvim?

    Modern code editors communicate with programming languages through the Lang= uage Server Protocol (LSP), which provides essential features like syntax c= hecking, code navigation, and auto-completion. However, OCaml=E2=80=99s lan= guage server exposes powerful custom commands beyond what generic LSP clien= ts can access.

    ocaml.nvim works alongside generic Neovim LSP plugins like nvim-lspco= nfig, providing direct access to advanced ocamllsp features without = requiring complex editor-side logic. The plugin gives you access to all the= advanced Merlin commands not supported by generic LSP clients.

    Key Features

    Typed Holes Navigation - Navigate between typed holes (_) and interactively substitute them with the Construct command.

    Semantic Navigation - Move through your code semantically: jump betw= een expressions, parent let bindings, modules, functions, and = match expressions.

    Phrase Navigation - Move between OCaml phrases (top-level definition= s) in your buffer.

    Many more features are in development, including alternating between = .ml and .mli files, type enclosing, and pattern matchin= g generation.

    Getting Started

    Installation is straightforward with lazy.nvim:

    require("lazy").setup({
      { "tarides/ocaml.nvim",
        config =3D function()
          require("ocaml").setup()
        end
      }
    })
    

    The plugin complements your existing LSP setup=E2=80=94you=E2=80=99ll conti= nue to use Neovim=E2=80=99s built-in LSP for standard features while ocaml.= nvim adds OCaml-specific capabilities.

    Project Status

    The ocaml.nvim repository is now public on GitHub, with comprehensive documentation, a feature t= able, and screencast demonstrations. We=E2=80=99re working towards a stable= 1.0 release and welcome feedback from the community.

    Try out ocaml.nvim and let us know what you think! For questio= ns or feedback, you can post an issue on the ocaml.nvim GitHub repository.

    Ocaml notebooks in web browser

    Davy announced

    Hello everyone !

    I=E2=80=99m currently learning Ocaml, and found no better way to learn than= working on a project :

    I=E2=80=99m happy to announce xeus-ocaml, a new kernel to run Ocaml = from Jupyterlite notebooks :partying_face:

    I=E2=80=99m far from a professional developer, and very new to Ocaml, so do= not hesitate to try it with your workflow, report any new issues, ask for o= ther external libraries (currently only stdlib and ocamlgraph), or contribu= te to its development to make the code more robust and idiomatic.

    Any feedback would be appreciated!

    Cure2 - combinator frontend for re2

    Emile Trotignon announced

    Cure2 is a little library I= just made, that provide a combinator frontend to Re2.

    With it, instead of "https?:\\/\\/(?:www\\.)?[-a-zA-Z0-9@:%._\\+~#=3D= ]{1,256}\\.[a-zA-Z0-9()]{1,6}\\b(?:[-a-zA-Z0-9()@:%_\\+.~#?&//=3D]*)", you can write:

    let second_level_char =3D charset Charset.[Ascii.alnum; chars "-@:%._\\+~#=3D"] in
    let top_level_chars =3D charset Charset.[Ascii.a=
    lnum; chars "()"] in
    let path_chars =3D charset Charset.[Ascii.alnum;=
     chars "()@:%_\\+.~#?&/=3D"] in
    str "http" + !?(char 's') + str <=
    span style=3D"color: #ca3400;">"://"
    + !?(str "www.") + rep ~min:1 ~max:256 second_level_char
    + char '.' + rep ~min:1 ~max:6 to=
    p_level_chars
    + bow + rep path_chars
    

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=OCP8cVzs; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=G1SDxjPj; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 4234E400C5 for ; Tue, 28 Oct 2025 13:31:02 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=DvEMj8U4NpA/vgjPdqIOUjven+Ve/5bpBLOTzbi3sHg=; b=OCP8cVzsAHS/vMXt1iVoc0BVKMn8vBu23fbCwrX1Nc89mVPq6LCF+BAG KaJ1/ATEtYiXrGrozOfIz7z0lcHWw+ElL8+PoGChRgA9VhqaMd4OCXSW2 0ybcO7Tod6OyD53CgBMTxRk/jyP2XyhGH2Z3wF6fAFtN5IJtoTGr4ATNk M=; X-CSE-ConnectionGUID: 7vXoCF0BTe2Eg8/0NEulRQ== X-CSE-MsgGUID: ZZaPylxWSpqkik/xdjYgpQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,261,1754949600"; d="scan'208,217";a="246512429" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Oct 2025 14:31:02 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B99BAE0CD8; Tue, 28 Oct 2025 14:31:01 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 55EBCE0172 for ; Tue, 28 Oct 2025 14:30:56 +0100 (CET) X-CSE-ConnectionGUID: 5y3egpJYR7SCVZVBS1oqgQ== X-CSE-MsgGUID: VPTNmJNcRFOvc0Lh7w7aqQ== IronPort-SDR: 6900c58f_v2LbCAE5OUXFJj6q0cLzqx1IZNiH15n+SetWiMu4NcikUz0 16zT3xEX26TEc7lzlGpde8ht15GdsoiLEQjgBSQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EXBQAUxABpdyIeaIFagluBO4EDGQFoXjMHCEmEVYNPj?= =?us-ascii?q?iSaGIIwgWmBLBYbHQEDAQ0uARUKAQIEAQEDAQIBhQCMUQIfBgEENBMBAgQBA?= =?us-ascii?q?QEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAFDSYZPDUkBDAGBblFxY?= =?us-ascii?q?QQDBjcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QECBAgBQmUKEwEBOBgjAxAEBwMCEQE1AwETARIagmmCIAICTwMEAQwGlnabT?= =?us-ascii?q?HqBMoEBggwBAQaBCD4DCwICQAHaDIFkCYFKhW2CShoBKklrAoRHhD0nD4FVR?= =?us-ascii?q?IQOb4I/BAcXAgEBGH4mAQEGBEODLoJpgiZ6FB2GDIJ2gTOGDGEGhnKBRCIDJ?= =?us-ascii?q?jMsAVUTFwsHBVuBCAMqNC1uMh2BJ0EYc4EUg0kPEmgPBoESg1OJMQ+IWgMLb?= =?us-ascii?q?T03FBuUBkIZLIFbJg44BgE9Fg4TGgEpAiI2CCUECCMcGBovAQsLApMHKCoDs?= =?us-ascii?q?UqBCjQHhB+BXgYMiQiBJpYGhASBV4s8hwKSUiKYZCKCNkCGZwqBHAmBb2uVY?= =?us-ascii?q?IVZgX8jgUkMBzMaMEOCZwlGHA+SIYE+gSaBdDt9xQNCNQEBAQE4AgcBCgEBA?= =?us-ascii?q?wmFRR0BAYlNgjoQFwyBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:S3VEyKiu3YgHkNpb/NO9NNJtX161qBQKZh0ujC45NGQN5FlHY01je htvX22HPq7YamKmfYsib46woUhVv5bcz4M2QFQ5+ypjRH9jpJueD7x1DG+gZnLIdpWroGFPt phFNIGYdKjYaleG+39B55C49SEUOZmgH+e6VaidfHgsGGeIcQ954Tp7gek1n4V0ttawBgKJq LvartbWULOf82cc3lk8teTa+XuDgNyo4GlF5wRkNagQ1LPjvyB94Kw3dfnZw0TQGdE88t6SH 47r0Ly/92XFyBYhYvvNuqr7aEADXonJNgGIjHdMM4D66vSVjnFaPg4TbZLwWG8P49m7t4gZJ OZl6fRcfTwU0pjkw4zxZfX3/xZWZsWq8JefSZS2XFf6I0fuKxMAyN02ZK060BFxFk+azgii+ NRBQA3hYCxviMrr0em2RfFOt/58F+LVDr01gShn1D7gWKNOrZDrG80m5PddzG52nsdKDOrTb MofaCNyYVLHeRIn1lU/Uchv2r7w2j+kK3sD9Dp5poJvi4TX5DdL6+C4IfPkIonXa5BNmUKJu m/N/2L4GwwXctuFxm+M9nuqwPTEnSb6RJ46Hrql8PVnmxuWmnxVDwcZPbe+iaDj2xXnBo0Hc ST4/AIQlZQU8W6NRePTeAOz+FqE4QFDUsNpRrhSBAalkfeIvV3GXgDoVAVpY9UjsIoyRCc2/ kSYmsvgQz1pqrycD3yHnop4thu3KXFTNWgGdDMJRgsD4sD+rcc0lB2nostf/LCd08yuFD7o4 QGw8xMVuYctp/VS0Ly0xAWS696znaQlWDLZ8S35ZAqYAu5RYZ78IZSv7UnH4P1AKoeAU1THu 2IL8yR/0AzsJc/S/MBuaLxTdF1M2xpjGGaF6bKIN8J7nwlBA1b5IehtDMhWfS+FyProhgMFk GeI5F8Pv8ALVJdbRaJ8ZIa8Q9wtybn8GN/lUPHNc9cGb4BqfxfvwRyCkXW4hji3+GB1yPFXB HtuWZ/9ZZrsIf02lGLuLwrcuJd3rh0DKZT7HsqikEr/j+TFPxZ4i94taTOzUwzw14vcyC29z jqVH5LiJ8x3AbymMBrEu5UeN04LJnUdDJX74Z4fPO2aLwYsXClrB/bNyPlzM8ZojoZEpNfup 3udY05/zEagpHvlLQ7RVGtvRomyVrlCrFU6HxcWA3CW51YZb7ySsZgvL6kMQeF/9chI7+JFc P0eSsDRXtVNUmvm/hoeX7ncratjVhWh3jyTDnCbchw6J8ZtbFHX8drvfy/E1ioHPgyov+QQ/ pyi0QL6R8IYZgJAVcz5VtOm/2mTj1M8xt1gfhLvDIFIWUPO9INKFXTAvsUvKZtRFSSZlyqo6 QmGJDw5+8/PmtYR2/vUj/mmq4yJLbNPLnBCFTOG0YfsZDjoxUv984puS+3SQCv8Ulnz86CcZ el46fHwHfkEvVRSubpHDLdZ4vMi1uTruoNl4FxoLFfTY3SvL4FQEH2M8M1Ml69Kn5tymw+9X GCR8dh7Z5SNHu7YE2AqGQl0VdTbiMkomQTT488lf2T8xit8p4ScXWtoYhKjtS16LZlOCr0D/ 9sPgsAtxjKatgsLKfeD1yBdyHSNJCcPUoIhrZArP7XogQsKlHBHOMD5MXLp6sufNtljDEsjD WKMj5r8g5BZl1vwYlsoNH33xeEGr48/iBNL614jJlqyhdvOgMEs7iBR6TgaSgd0zA1N9vBaY 0xHFhRSC/2V3jFKgMNjYTidKztZDkfExn2rmko7qmLJamKJCErPFTQZEsSQ9hk792l8QGBqz IuAwjy4bQewLdDD5Qpsa0tLsPe5cMdQ8DfFk8WZH8ioOZk2TD7mo622b1oztBrVLpIttXLDu NVV0r58WY/jOQ4Uhp8LOY2Q+LATaRKDfUhpY/Vq+oEXFmD9JhC2/xWzKH6KR8AcHMySrHeEC PFvKPlfCDW49iKF9Q4ACYA2frRbof8O5fg5QI3NG1IoibWkgwBSgMrizRSm3G4PaPdyoPk5M bLUJm6jEHTPpH56mF3tjchjO0ina4MUOQHT4uK837gRHKI9tMVpIFAAw5qvnnCvKAA81Qmlj ADCQK73zuJZ1oVnmbX3IJhDHwmZLdDSVvyC1QKO7+R1ctLENPnRuzMvqlXIOxpcOZ0TUY9Vk YuhncHW3kSfmpoLSEHcxoe8EpdW6fWIXOZ4Ntz9KF9Yl3CgXO7u+x4yxHCqG6dWkd9y5tiVe CXgUZGeLeUqYtZ6wGFZTwN8EBxHUqT+UfrGlBOH9v+JDkAQ7BzDINaZ7kTWVGB8dBITGpjAG wTx6ueP5NdZkdx2PyU6JcpaWr12HFyyfpEdVYzBhWHNRC3gyFaPoaDrmhcc+CnGQCvMWtrz5 ZXeAAPyblKusaXP18tUqJF2ogZRNntmnO0sZQgIzraaUdxh4LIudozx8KnqC624VgT3xMi+f DbJfXcvAiX7XC1ZfFP7+tuLssK3GLkVItmgTtA21xr8Vst0LNro7HhdGuNI6XBrfDDu16eid cFY/Wf/VvR06o88Xv4dv5RXns8+rs43BRs0FYTVi8v2EgoTCrUM1WV8EUxKTyOv/wQhUqnUD TBdeF2oi31XhaI8/QiMtpKV9NwkUOvT8ggV IronPort-HdrOrdr: A9a23:O37Ke638fZUra9zpOeB9wAqjBI8kLtp133Aq2lEZdPU1SL36qy nKpp4mPHDP5gr5NEtMpTniAsm9qBHnlKKdiLN5VdyftWLd11dAQrsP0aLShxXeXwf++uRe2a oISdkdNPTASX5gg4Lf6Am8euxQpOVvHZrY4Nvj8w== X-Talos-CUID: 9a23:gYgqvmG10XfIWWJ9qmI65RUZFdgHQ0eC91zuEXGSMj9uUbKsHAo= X-Talos-MUID: 9a23:wnpShgtvgsuFXVtAEs2nugleEsJKxa+UJmcTms0iu5abaiVpAmLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,261,1754949600"; d="scan'208,217";a="129315702" X-MGA-submission: =?us-ascii?q?MDGo3/xMqChBPfqZuLhyQwLaNN0oCGhS2FnDyh?= =?us-ascii?q?TqbYqIDwjlMkfjs1gKa3UzGu19EZXCh8SU8P2D8EF6FxkcX7PAt5td/3?= =?us-ascii?q?yfiXNqcYr4pLKN3dYHhDPte+4mZQntATv9+5683smBiKOfJY43XsBe1e?= =?us-ascii?q?E1b88AOkvZQbhQG/2YzNpQVA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Oct 2025 14:30:55 +0100 Received: from TM.local (unknown [37.169.9.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2B5761A316; Tue, 28 Oct 2025 14:30:50 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1761658254; bh=MdKToZNTGmx/li+uR0/Xf/qQwwPIlKJIX9M1//iFFnE=; h=From:To:Subject:Date:Message-ID; b=G1SDxjPjjtU7wkHBzWdmofdopVz5hXobfDPchj/1j5at7+ZU4igAFKz50XYyASrT7 J0UNxt69ix/YYBvE7eq3tU2nno8CQEtS0scK5XGyVetd7bbMTtR4FbkmjAu4AXwoC7 rAu293BdnN25MtizKKWVgy+1/CSiwXkSpnhdg3QM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 28 Oct 2025 14:30:45 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Oct 28 14:30:54 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.452553, queueID=835081A32D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19393 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 21 to 28, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.5.0~alpha1 Release of Fmlib 0.6.0 MlFront 2.4.2.x Other OCaml News Old CWN opam 2.5.0~alpha1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the first alpha release of opam 2.5.0. This version is an alpha, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release. What=E2=80=99s new? Some highlights: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :high_speed_train: Speed up `opam update' up to 70%. Thanks to [@arozovyk], `opam update' now loads opam files incrementally, only parsing the files that have changed since the last time you called `opam update'. Before that, opam files in opam repositories were all loaded from the file system after an update if there was any change. The performance improvement of this change thus depends on how often you call `opam update' and what type of repository and OS you are using. ([#5824]) =E2=80=A2 :spiral_shell: Improved shell integration. A number of users ha= ve been hitting issues with opam's shell integration where parts of a previous environment was kept in the current environment, causing a number of issues. These can be triggered by, for example, nuking your opam root directory (by default `~/.opam' or `%LocalAppData%\opam'). For this particular case we are still working on a fix, but many other users have reported similar issues without nuking their root directory and in that case we believe to have fixed the majority of issues. ([dbuenzli/topkg#142], [#4649], [#5761]) =E2=80=A2 :spiral_shell:=C2=B2 We've also changed the default file to whi= ch `opam init' writes the opam shell integration to be `.bashrc' instead of the previous `.profile' or `.bash_profile' when `bash' is detected. Doing it this way prevents some issues with existing `.profile' files that source the `.bashrc' file and causing an infinite loop when opam asks users to ensure they source their `.bashrc' file in their `.profile' file. ([#5819], [#4201], [#3990]) =E2=80=A2 :shield: The opam install script now installs an appropriate `apparmor' profile on systems configured with `apparmor' (this is enabled by default on Ubuntu). This change is not strictly speaking related to this release as it is deployed for every version. ([#5968]) =E2=80=A2 :ocean: Many more UI additions and improvements, bug fixes, =E2= =80=A6 :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [@arozovyk] [#5824] [dbuenzli/topkg#142] [#4649] [#5761] [#5819] [#4201] [#3990] [#5968] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.5.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.5.0~alpha1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Release of Fmlib 0.6.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Helmut announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have the pleasure to annouce the release of version 0.6.0 of `fmlib'. The main components of `fmlib' are 1. Web Applications in the Elm style 2. Pretty Printing 3. Combinator Parsing Documentation see [https://hbr.github.io/fmlib/odoc/index.html]. This release is mainly focussed on pretty printing and web applications. The new release has some breaking changes because some function names or function arguments have changed. The breaking changes can be easily fixed by looking into the documentation which contains all functions and the corresponding arguments. Web applications: =E2=80=A2 Single page applications are now fully supported. I.e. it is possible to manage several virtual pages in one application. The switching between the pages can be done by accessing the browser history. I.e. the user is capable of pressing back and forward buttons and the application remains the same. For an introduction to single page applications see [here]. An example of a single page application can be seen [here]. =E2=80=A2 Web applications can contain reference elements. These can be u= sed to optimize applications with really big doms (e.g. several hundreds or thousands of elements). Introduction to reference elements see [here]. A simple spreadsheet implemented as a web application can be found [here]. =E2=80=A2 Files on the local machine can be selected and loaded into the application. =E2=80=A2 Session and local storage of the browser can be used. Pretty Printing: A new algorithm based on Phil Wadler=E2=80=99s design is= used which makes the code more elegant, easy to read and fixes some bugs in the previous algorithm. The new algorithm is in a separate module `Pretty'. The old module `Print' is kept but will be removed in the next release. Combinator Parsing: As a convenience there are lexeme parsers which support languages with some standard syntax (like Haskell=E2=80=99s Parsec). Some bugfixes and minor additional functions. No breaking changes. [https://hbr.github.io/fmlib/odoc/index.html] [here] [here] [here] [here] MlFront 2.4.2.x =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 MlFront 2.4.2.30, a set of packages centered around language-agnostic build tooling, is available on opam. Changes include: =E2=80=A2 MlFront_Core: `FilePath.absolute' has flags to create Windows p= aths longer than 260-characters (`MAX_PATH'). =E2=80=A2 MlFront_ZipFile: Now has a `deterministic' mode when creating z= ip files. =E2=80=A2 MlFront_Cache: Now embeds the sqlite3 C library so you don=E2= =80=99t need pkg-config (etc.) to install it. =E2=80=A2 MlFront_Exec: Supports downloading attested (signed) binary pac= kages from GitHub. Confer with my article on GitHub attestations: =E2=80=A2 MlFront_Thunk: Its ThunkLexers and ThunkParsers include a JSONC parser that can be used to edit config files. Relies on the fmlib_parser library. I use it to autofix JSONC build files with correct checksums and file sizes. (Ping/reply if you would use it so I can separate it) Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Setting up Open Telemetry (OTel) with OCaml and Azure Monitor Integration] =E2=80=A2 [Hacking OCaml] [the ocaml.org blog] [Setting up Open Telemetry (OTel) with OCaml and Azure Monitor Integration] [Hacking OCaml] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 21 to 28, 202= 5.

    opam 2.5.0~alpha1

    Kate announced

    Hi everyone,

    We are happy to announce the first alpha release of opam 2.5.0.

    This version is an alpha, we invite users to test it to spot previously unn= oticed bugs as we head towards the stable release.

    What=E2=80=99s new? Some highlights:

    • :high_speed_train: Speed up opam update up to 70%. Thanks = to @arozovyk, opam update= now loads opam files incrementally, only parsing the files that hav= e changed since the last time you called opam update. Before t= hat, opam files in opam repositories were all loaded from the file system a= fter an update if there was any change. The performance improvement of this= change thus depends on how often you call opam update and wha= t type of repository and OS you are using. (#5824)
    • :spiral_shell: Improved shell integration. A number of users have been = hitting issues with opam's shell integration where parts of a previous envi= ronment was kept in the current environment, causing a number of issues. Th= ese can be triggered by, for example, nuking your opam root directory (by d= efault ~/.opam or %LocalAppData%\opam). For this = particular case we are still working on a fix, but many other users have re= ported similar issues without nuking their root directory and in that case = we believe to have fixed the majority of issues. (dbuenzli/topkg#142, #4649, #5761)
    • :spiral_shell:=C2=B2 We've also changed the default file to which opam init writes the opam shell integration to be .bashrc instead of the previous .profile or .bash_profile when bash is detected. Doing it this way prevents some i= ssues with existing .profile files that source the .bash= rc file and causing an infinite loop when opam asks users to ensure = they source their .bashrc file in their .profile = file. (#5819, #4201, #3990)
    • :shield: The opam install script now installs an appropriate appa= rmor profile on systems configured with apparmor (this = is enabled by default on Ubuntu). This change is not strictly speaking rela= ted to this release as it is deployed for every version. (#5968)
    • :ocean: Many more UI additions and improvements, bug fixes, =E2=80=A6

    :open_book: You can read our blog post for more information about these changes and mor= e, and for even more details you can take a look at the release note or the changelog= .

    Try it!

    The upgrade instructions are unchanged:

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    5.0~alpha1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.5.0~alpha1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    Release of Fmlib 0.6.0

    Helmut announced

    I have the pleasure to annouce the release of version 0.6.0 of fmlib<= /code>. The main components of fmlib are

    1. Web Applications in the Elm style
    2. Pretty Printing
    3. Combinator Parsing

    Documentation see h= ttps://hbr.github.io/fmlib/odoc/index.html.

    This release is mainly focussed on pretty printing and web applications. Th= e new release has some breaking changes because some function names or func= tion arguments have changed. The breaking changes can be easily fixed by lo= oking into the documentation which contains all functions and the correspon= ding arguments.

    Web applications:

    • Single page applications are now fully supported. I.e. it is possible t= o manage several virtual pages in one application. The switching between th= e pages can be done by accessing the browser history. I.e. the user is capa= ble of pressing back and forward buttons and the application remains the sa= me. For an introduction to single page applications see he= re. An example of a single page application can be seen here.
    • Web applications can contain reference elements. These can be used to o= ptimize applications with really big doms (e.g. several hundreds or thousan= ds of elements). Introduction to reference elements see here. A simple spreadsheet implemented as a web application can be found here.
    • Files on the local machine can be selected and loaded into the applicat= ion.
    • Session and local storage of the browser can be used.

    Pretty Printing: A new algorithm based on Phil Wadler=E2=80=99s design is u= sed which makes the code more elegant, easy to read and fixes some bugs in = the previous algorithm. The new algorithm is in a separate module Pre= tty. The old module Print is kept but will be removed i= n the next release.

    Combinator Parsing: As a convenience there are lexeme parsers which support= languages with some standard syntax (like Haskell=E2=80=99s Parsec). Some = bugfixes and minor additional functions. No breaking changes.

    MlFront 2.4.2.x

    jbeckford announced

    MlFront 2.4.2.30, a set of packages centered around language-agnostic build= tooling, is available on opam. Changes include:

    • MlFront_Core: FilePath.absolute has flags to create Window= s paths longer than 260-characters (MAX_PATH).
    • MlFront_ZipFile: Now has a deterministic mode when creatin= g zip files.
    • MlFront_Cache: Now embeds the sqlite3 C library so you don=E2=80=99t ne= ed pkg-config (etc.) to install it.
    • MlFront_Exec: Supports downloading attested (signed) binary packages fr= om GitHub. Confer with my article on GitHub attestations: https://github.com/diskuv/dk/blob/V2_4/docs/posts/2025-10-24-overv= iew-ci-attestations.md
    • MlFront_Thunk: Its ThunkLexers and ThunkParsers include a JSONC parser = that can be used to edit config files. Relies on the fmlib_parser library. = I use it to autofix JSONC build files with correct checksums and file sizes= . (Ping/reply if you would use it so I can separate it)

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=kFefGPbd; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=oA5qyZx7; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 20E58400B1 for ; Tue, 4 Nov 2025 13:21:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=76iAnkdpJgoC7wB+v97z1IlgNbos29VYSfzKT139thw=; b=kFefGPbd12Uimz3kLD8r4cwrZc+04eXCDLIWhHuRcndNJMiiOV/hji3R vOhky9uQgzCXNgHGzejK8stPfqAqsfT5M9Y3+TJZEIj6ZK1Q/A5014EOv pyLOubWdjFntmhyAEtcKMUgR9zbLRnruJ+FgoxSsI6SRxR2XJ8kuY6Iez M=; X-CSE-ConnectionGUID: 71zLTaXTSZeh/t3V7Noa2Q== X-CSE-MsgGUID: vcW21ieySB+MS3HvpWNiIQ== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (body hash did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,279,1754949600"; d="scan'208,217";a="247535886" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 04 Nov 2025 14:21:41 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id CA9D6E0172; Tue, 4 Nov 2025 14:21:40 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by sympa.inria.fr (Postfix) with ESMTPS id C2B71E0172 for ; Tue, 4 Nov 2025 14:21:35 +0100 (CET) X-CSE-ConnectionGUID: hNabRk3dRT2I0VZEUb++2Q== X-CSE-MsgGUID: Hopsv11dT1aFJsHypWuD3w== IronPort-SDR: 6909fddd_oIXK9AoYye1x36c8dziC+Jnw4yHsCWMotKz2BwOIZN1zbM8 YcA21nr0bJSSe3FKsTJP5wUMLw6N3KAMEZLlphA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0ESAQAx/AlpgSIeaIFaHQITCQMFBYIABQwBgTyBAxkBa?= =?us-ascii?q?F4zBwhJhFWDTwiOHJFNiEuCMIMVFiMVAQMBDS4BGwQBAgQBAQMBAgGCDIJ0A?= =?us-ascii?q?oxWAh8GAQQzBg4BAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECE?= =?us-ascii?q?AEBPQVJhk8NgkVRUx4UUQkGAQEBAQEBAQEBAQEBAQEiAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIEBAQBAgoNRUABAgYEB?= =?us-ascii?q?hMBATIGGCMDFAEGAwIRATUDARMBEhkBAYIjRYIgAgJPAwUMBpVIm0x6fzOBA?= =?us-ascii?q?YIMAQEGgQg+AgELAgIDAQ4JJQHaDIFkCYEyGAGFbIJKGgEFJUlrAoRHCYMVg?= =?us-ascii?q?R8IHw+BVUSBFTWCRG+CAj0LFwIBAYE5AwEBCEUJgyWCaYIRFXoUHYYKeIEwg?= =?us-ascii?q?X8GhlYGh1OBREszLAFVExcLBwVbgQgDKjQtbjIdgSRBGHGBFINJDxJoDwaBE?= =?us-ascii?q?oNRiSYPiTsDC209NxQblC9CGSyBbhUOCy0CAwEXGwwPBw0BAgQUBA8BCgoHD?= =?us-ascii?q?gIiKwECCAUJChUTAgEZDgECCAQJBQYDEAUGCxkFBgsCCQItA5JXCRsBAwQoA?= =?us-ascii?q?XSSO4pCk3ZtNAeEH4FeBgyJCIEmhyaOYIQEgVeFQIV8hwKRa2cimGQigjaGJ?= =?us-ascii?q?4EAClNEBQmCDkyVJBACJAYEBIVRgX4kSWIBGgMMBzMaMCIhgjMBMwlGHA+II?= =?us-ascii?q?YYJAxaDNigQgS6BJoF0O33FU0I1AQEBATgCBwEKAQEDCYViAQGMCC0FgUsBA?= =?us-ascii?q?Q?= IronPort-PHdr: A9a23:qm76OhxvzRxY3E7XCzLKxFBlVkEcU1XcAAcZ59Idhq5Udez7ptK+Z xeZvakm1Q+QBNyTq6odzbaN6Oa4Ai1IyK3CmU5BWaQEbwUCh8QSkl5oK+++Imq/AdjUKgcXJ 4B8bmJj5GyxKkNPGczzNBX4q3y26iMOSF2kbVImbuv6FZTPgMupyuu854PcYxlShDq6fLh+M Ai6oR/eu8QYj4ZuMLo9xxTGrndVeOla2H5kKU+OlBr4+su84YRv/itetv8v7cJMTav3c6ElR rFEEToqNHw468LsuRTfVwWE+2ESUn8RkhpGAgjF6A/1U5LsuSbkteRzxTeXM9TuQb47QTqt4 L5nRQHnhikaLzI2/33ZhcJ2jKJAvRKuvAd/zJLOYIGUL/VxYKXQds4HSGVbX8ZRUytBAp6gb 4YKEuEMM/pUo5X7qlATqhSwGBSsBPj3yjBWmnD2waM00+MkEQ7c3QwgGc8FvHDbodjxMasfV /2+wqvVwjXZd/5Y2Snz5pXGfB4irv6DQal9ftDNxUQ1DQ7JkkmcpI7jMjiI1uoNqW+b7+94W O+zj24osQdxqSWyyMgwionJg4MVykzY9S5kx4s6P9m4R1R9YdK+C5tfqyGaN453QsM+X2Flo z46yroCuZ+7YCgF1ogoxx7Za/yGaoiI/wzsWPyWITdii3JoYbSyjAu9/ka80OPzTNW00EpUo SpflNnBrnEA2gLS58aJRfVx40es1CuB2Q7d5O9JL1w5mKXFJ5Au3LI9lIYfvEDfEyPol0v7k LOae1sk9OS16+nqYKvqq5GaOoRphA/+NaEulda+AeQ+KgUOR3aU+fi91L3/40L5WLJKjvgzk qbHqpzaI9oUprKhDw9Szoks8RO/DzO83NQfh3kHI0pJdw+Aj4juJl7OJO73Ae2jjFSrlTdn3 //GPrz9ApXNM3jMi63tcqp6605Z0AYz19df6IlJCrEbOv78RkjxtNvADhMhPAy0wvrnCNVg1 owFQ26PA6iZPLvMvl+S/OIgOfWMZI4MuDbgNfcp/eLhjX8hlVABfammx50XaH+mEfR9OUmZZ Gfjjs8GEWgWpAU+SejqhESZUT5dfXqyWLg85j4jBIK6DIfDQ56igKSF3CemBZ1afHxJCleJE XvweISLQekMaCOMLc97ljwLS6KhS4gh1B20sw/60bVnIvLI+i0CqJLjz8R16PPOmhE89Dx0F cGd0m+XQGFugGwEXTg23LpwoUBlzVeMzbJ3g/lcFdBJ/f9JVR06NZHEw+xmEd/yQAPBccqXR 1a9WNmpHTYxTtcpz98AfUlyAc+ijh7e3yquGrMVkKGEC4Ev8q7GxXjxINpyy3Xd1KU5jlkmR NFPNWy8iaJl+QjTHYjEmFiamaaybakQwTDB+WOZwWaToE1VXxR8XKvZUXwFaEbbosz16l7MQ rOzE7grLAtMxMGYJqdUd9Hll0tKSfjnNdnYfmm/gX2/BQySybOJdIfqe3sS3CHaCEUclgAS8 muKORImBiemp2LfDCBuGkzzbEPs9+l+qWq7TlIqwA2QaE1hzbW19gYUhfyaVfwTwqoJtDo/p zhwBlqxws7aBtWaqwdvYKlQe90w7Vhf2WLcrQN9P5igL654hl4ZdgR6p17g2QlqBIlcicUrr HckwgRzKa+A0F5PcCuV3Yj3Or3TKmjy4A6gZLLW2lHY0daW47oP5+oip1XkpgGpGVIv/G9j0 9ZP1XuQ/I7KAxYSUZL0U0Y36wR6qqrBbSk6+oPU02FjPrevsjPY3tIkC+Qkxgynf9dFP6OID BXyHNECB8iyNOwqnECkYQ4eM+BX8K44Jsemd/qd2K63J+tghzKnjWFf4I9nyE6M9ix8SvTJ3 5kf2f2Y0BGHWy/6jFi6qs/3g5xLZSkOHmqjzijpHJNdarV9fYkVDmegINe5y81+iZDxQ3JY7 kCsB00F1sGzYReSalP80RBK2UQPpnynnSu5zyBqnD41rqqf2i3Ow/3/dBUZIGJLQ3NijVj0L YepjNAaXU2oYhAxmhWq60n02bRVqbh5IWXLXEhIejL5L3t+XaaorrSMetZB5pwwvSVMSOS8b 0iXRKThrhUHzi3vB3BexCg1dz6yupX2gRh6iGWFIXhpsHfXZNx+ll/j44mWQeFXlHJSQDZ+o T3IAB66MsX/uZ2fnpLH9+S/TH6JV5tJcCCtw5nTmjG84DhDBRS518u4mtjmDRRyhSb/3t8sT i7IqRfgfqHz0KCrLe9sfk9pHULxrc1gFdctwcMLmJgM1C1C1d2u9n0dnDKvYL2zuIr7ZXsJH 3sQxsLNpRLi0wtlJ26IwITwUjOcxNFgbp+0eDBewTozuuZNDqrc97lYhW1tuFPtpAbYZ75ml TcYyOcywGYdh/AVtQEtyCSEH71UGlNXbmT3jxrd19mlt+1MYXq3N7251U5wh9ekWYq4mVkJS VTVe8J/OHpo6cFuLF/H0Hvy85zpPt7KYocashSS1QzLj+1UNI4ZnP0XgyFqIiT44W1jzPQ03 lR1xZ/vhIGcMC12+b6hRB5VMjqgf8QI5jTklrpThO6Tz9npBpJlCykGV5vuTOu1HXQVr/uP2 x+mNjo6pz/bHLPeGVXa80J6tzfVFJvtMXiLJX4fxNEkRR+HJUUZjhpGFDM91oU0EAyn3qmDO A9w+ywR61jkqxBN1vMgNh/xVX3arRupbTF8QYaWLR5f5AVPr0nPNsnW4uV2FiBetpqvyW7FY mWfbgIOFmoJX02YG3j7Ob2/+dTL8+6ZH/ezafzUbvTGqOBTUeuJ2YP6ypFvrFPufo2EOnhvC eF+21IWBCooXZ2Bx3NUE2pMy3GoDYbTvhq39yxpo9rq9f3qXFiq/o6TE/5INt4p/RmqgKCFP urWhSBjKD8e2IlfoB2AgLUZwlMWjDljMje3FrFV/xX3d/qFi417DktGTnZrM89Z86833g9MI NPWzNTv2etxivczTUxOVVnght2Bb8sXJWqwLxXCWFbNM66Jb26uoYm/ceanRLtcgf8B/RS0s DDdCETjOzWfixHxUBS+LexHjCeaJQFT/oanfVw+bAqrBMKjYRq9PthtiDQwyrBhnXLGO1kXN j1kel9MpLmdhc9Bqs12AHcJrn9sLO3e3j2c8/GdMJEd9/1iHiVzketepnU80bpcqi9eFrR5n y7br9gmpF/D8KHH8QBcCE9fiBpK0d+u6F1lPbTF+5JAX3fd4R9L6n+fXh0Ort0jEdbvvqFM1 vDFk7/1IzpZtdeI7Y0bHcexSorPPHc6MBXvESLZF0NcF2/tbDmDwRcF1qrOvnSO5oA3sJ3th IYDRvdAWVo5G+lbbyYtVN0OLZFrXy81xLuSjcoG/327/1HaQMRXuIyCV+rHWK++bm/B0f8fP 11TneCdT8xbLIDw1k18Z0MvmY3LHxCVRtVRumh7aQRypkxR8X94R2l12kT/awrr7mVAcJz81 hMwlAZ6ZvwgsTn25FJibGHwn3NlgWsdmIC4pGWJdzrgMKq7XYdXEjf58U8rPcbyRw9zKxa5n UllKCvsTbVMibBtbiZu1B+avoFAU605L+UMcFoLyPebau99m29mkX3y1G1r5L6YLM56kw87b ZOnr3RBwh9uKtkvKvnZIKNPiENbhqePojOA3OcsxgQTPAAIrHPUfzQH8h9tVPFuN2+j+epi7 haHkj1IdT0XVvYklflt81s0J+WKyy+zm64GME26MPaTar+Io2WV39DdWUs+jwlb8isNtagzy 8oodFCYElwi3KfEXQpcLtLMcEkWbtIOpiGJLGDX6bmLmsozZNn1VeHwEb3X7vdS2xr4Wl1xW d9Ri6ZJVtqtyB2KfJ6hdeRcj0t3ol2zex3GDewXKkjTyG5V/5izlM1+j9ZUK2xPUztxbnXlv e2yxEdiw/ubAoVsOi9DDNddOipkAZ/rxyJU7SYfV2e7gL1Fl1DKqjb4om644CDUV9N4f7/UY BptDIvz4jAj6+2sjlWR9JzCJmb8PNAku9nV6OpcqYzVQ/9TSLB8tQ/blew6DzSyVHXTFNeuO 5XqQ4w8NJrsDXKrTlG0izQ0Vtr8etG3IeCEjBrpSoBdrISAlGl5ZInkTm1YQE82/L1L7bkZB 0VLe5chZB/0qwkyf7eyJguVyJTmQmqgLydXU+gKzei+YO8fxC4tY+mmjXo4G8hgnq/uqRJLH 8lM1U2NoJTrL5NTWiXyBHFHLgDGpC5j0nNkKv532OA0hhXBrVgbNTmPMu1vcm1N+d8mVjbwa T17DHQ1Q1iEgM/N+AmpivopxRAFysd2/ewQ7V2rppjbcS6hU6ytqIzIvmwnd9dzqql4N8r4K cuDtY/CtjbYUZ/bvxbDVXKqUf1AlZIDRUAQCOkNgmwjNcEc7MBZ7lEtU84lO7FVIKw8//ayb j51ESMZzSkYTp6NmjsYja3vvtmS3gfVe5MkPhsetZxEidZISC96bBQVo6q7XpnXnWuJGSAbZ R0e5gNW6Ecch5d9K6r7tZHQQsYGmFs067pkFzHGHZ5y+x7nR3GK1BLmHe65nbXh1EoXxfbom LHztzZ1DlVbzOtN0E50OPdwMaZC5+YiUxeNZRq8pGXp2ferL1lXyNTJehv/FoWX7AIUtwUE/ nkFWYJEyHfeDIkf1Q1jZ/RzzGg= IronPort-Data: A9a23:Er/RvK54ZpPzIDR8ZnhZ7gxRtO7DchMFZxGqfqrLsTDasY5as4F+v mMfXWrVa/rZMTfweognOti290hVv8KGzoI3HAE/+CwxZn8b8sCt6faxfh6hZXvKRiHgZBs6t JtGMoGowOQcFCK0SsKFa+C5xZVE/fjVAOe6UaicZ30ZqTZMEE8JkQhkl/MynrlmiN24BxLlk d7pqqUzAnf8s9JPGjxSsvPrRC9H5qyo5WpB5gBmP5ingXeH/5UrJMJHTU2OByCgKmVkNrbSb /rOyri/4lTY838FYvu5kqz2e1E9WbXbOw6DkBJ+A8BOVTAfzsCa+v9T2Ms0MS+7uR3R9zxC4 IklWaiLdOscFvakdNLx/PVvO3oW0aVuoNcrKJUk2CCZ5xWun3DEm52CAKyqVGGxFyke7Wxmr JQlxD4xgh+rh8S/yoi4EeVWup4CdPfZEb4V+TI69GSMZRomacirr6Ti4M8Bmi83gtFSEP3eY csAdDcpaw7PC/FNEg5NWdRnxLvu3SG5KGEwRFG9/cLb50Do9jcphanPHNuAJ/nfXcJRj1qVr WLA/n3kD1cdLtPKwD6M9DS3je/KnD/ncIgVCbuz++UshQGDgGsJB3X6UHPh/abk0RPgAYI3x 0o82i02trZrrUCXF9DTfQaYsWa7ozJHRI8FewE9wFrQlvSPvF7x6nI/ZjVIbdhjsM4tWRQxx 1qRlpXoAyZuufubUxqgGqy8qCPrfzASKX4eaCQESwoc/tSlp5s85v7Scjp9OK6Th9fPGmr8+ QzQjXAAtZguh41IjZzuqDgrnAmQSo71ohkdyD+/Y45IxgZpPci9YIi59VXQ7fBBNZuUCF6bs xDoevRyDshQUvlhdwTUH43h+Y1FAd7eaVUwZnY0RPEcG8yFoSLLQGypyGgWyL1V3jk4lc/BO xKP51gOvPe/zVOnZqhzbsqpDMA70aXrFdLkT+3ZJtdWeZNpHDK6ENVVTRfIhQjFyRF0+YlmY MfzTCpZJSxLYUiR5GDnH79FuVLqrwhirV7uqWfTlUX5juHDPSPIGd/o8jKmN4gE0U9Nmy2Nm /43CidA408OOAEnSniGqdwgPhoRIGIlBJv7jcVSe6TRakBlAWwtQbuZi78oZ4Uvzewfm/bq7 0ONfBZS6GP+onnbdiSMSHRoM430UbhF8HkUAC0LPHST4UYFX7qB1qklSsYITeEVz9A7lf9QZ NsZSvqEGcVKG2jm+SxCTJzTr75CVRWMhCCPNXGbfQllQYxEQlSR9/S5YADq/ygqJQi0vPsYv LeP+F76Q50CZgI6F+fQSqul4G2QtEgnutBZfhX3MPgKX2u066lsCSj6rsFvEvE2MR+Zmwerj VeHMykXtczmgtET8uCQoYumso3wMe91PnQCLlnh9bzsaBXrpDuy87RhDtSNUyvWDl7v2aOYY u5Q8fHwHdsHkHtOsKt+C7xb9r0/1fS+u45lyhlYI1uTY2SJEr9AJly07ftLvIBJxZ5bvlKSc WCL8d94J76IGZ3EFHg8GQkbVdmAhMokwmTq0fcIIUvB9HBW+piDWh5sJBWisnFWA4Z0F4IH+ t0fnvAqxTaxsTcQCebevBtorzyNClciT5QYsoorBd63qwgzlXBHT5/uKg73x5CtdN8WIhQmD QGWjYWfn79s+E7mdisiJ2nsxstYv4wF4zpR/W8BJnOIu9vLveA21xtv6gYKThxZ4xFE8uBrM E1pChFFHrqP9DJWm8RzZWCgNAVfDhm/+Eaq6V82uEDGbkuvDErhEXYcPLuTwUUn7G5sRDhX0 7WGwmLDUzyxXsXQ3DM3aHF1uc7YUt192Q3Tqv+JR/3fMcEBXgPkpauyaU4jiRjtW5oxjXKag 9haxr97bKmjOBMAp6E+NZKh6o0RbxK5P01Hf+Bq+fIYPGPbeQzq4wO0FWKKRppvKcDJoGiCM O4/AuJUVh+76jSCkSBDO44IPI1PvaAI4PgsR+rVAFAo4pqlkypRkZPP9yLBqnchbPdwnO0cd I7AVTKwPVaBpHlTmmX9o9lgPECma/kAPD/D+ue/9eEZG60+res3U0cT06S1jVqRIgBI7xKZh yKdRq70nshJ65VgoJvoKYpHXz6LENLUUP+a1SyOqPFMUI//CtjPvAYrtVXXBQRaEr8PUdBRl 77WktrI8G7anbQxCUb1poKgEvRX2MCMQ+ZnCML7A31Ely+kWsW3wR8i+Xi9GKNZguFm+cira AupWvSeLedPdY9m+0RUTCxCHzI2Kaf9NP7grBzgicW8MEEW1AifIe638XPsU3pgSRYJHJ/DE S7xheel44FJjYZLBSJcPcpcPb1DHAbBV5clJvrLjhvJPlnw1xnG8vHnmAE74D7GNmicHYyoq djZTxz5b1KptLuO0NhdtJdoswYKCGpmx9M9ZV8Z58U8ngXS4LTq9gjBGc5u5lBofi3OOFXQY SGUKnMlDTThUD9EdxTl/dmlWR2QbgDLEsmsPSQnpit4dA/vbL5swpM4nsuj35uyUjHk0eesJ MpY/yHgeB+rzfmFgM4Ns+ejj74PKuzynxo1FIOUryA2Kw4ZBaQW2XdhGgtUSCGBFNvC/KkOy a7ZWkgcKHyGpYXN/QqMtpKb9Nz1fN8i8tnwURqy/Q== IronPort-HdrOrdr: A9a23:njGBw690rMIXPfa5UzNuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:uYEEIG718UHp01ZYZtss9GgdEPomKXHn8C3xe3GKJFtjC/7PcArF X-Talos-MUID: =?us-ascii?q?9a23=3ArwY1AAyzk+vRPwPrnowjj8Zt1iyaqISpEFsTyMw?= =?us-ascii?q?Kh5CNGw5rGyaFsymbGZByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,279,1754949600"; d="scan'208,217";a="247535628" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFWBnOtFGGGdHTu4Deb6kb368Kr3/sCY5tGtT?= =?us-ascii?q?X1qnHlP5HArV/1JAtAEL086PmqsdeD9vbilY4AnifWaliMZxPQK0tHUo?= =?us-ascii?q?NA9CIL1GpL5NGvzhDVn0UnqbkBay3OqTeISZtXG+S8V9qrv6wvaY0P9g?= =?us-ascii?q?WNsiNTAIAGvO3G/BQ4EgDRkA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 04 Nov 2025 14:21:33 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3BF521A318; Tue, 4 Nov 2025 14:21:32 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1762262492; bh=hNMrlebsWOZ5Q3lG2LsPBk0JH93u/IACSwCWWbyJHdw=; h=From:To:Subject:Date:Message-ID; b=oA5qyZx75/utNmyZdBeLdLO0Ki11cx+Ue+Ku/0mSs8xKqOnbCFmKM7q5Htr7xp9Bg 7sHOJXqxWUeB2qfhCE7Om/0/jP/knzwTsSCDKuzJHJ41+fy0/1afrJegria12ywFgW vBetuQaAjBjkdhTXVvFtTurJAdqEMvEsWc9HYWn0= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 04 Nov 2025 14:21:30 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 4 14:21:32 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498289, queueID=5D3801A379 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19399 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of October 28 to November 04, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Caml in the Capital Ppxlib: Support for future compilers Miou, a simple scheduler for OCaml 5 Cmarkit 0.4.0 - CommonMark parser and renderer for OCaml OCaml library for Timeplus Proton timeseries streaming database Book draft: "Control structures in programming languages" oplot 0.85 - mathematical plotter QCheck 0.27 Bytesrw 0.3.0 =E2=80=93 The cryptographic edition Other OCaml News Old CWN Caml in the Capital =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Alistair O'Brien announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi everyone =F0=9F=91=8B We (@giltho and myself) are happy to announce the first OCaml meetup in London (Caml in the Capital)! Think of it as the British cousin of OCaml Users Meetup in Paris (OUPS). What? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Caml in the Capital is an informal evening of talks, demos, and hacking from anyone working with or interested in OCaml. The goal is to create a friendly local space for sharing ideas, showing off projects, and connecting with other OCaml developers in the UK. When? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We=E2=80=99re aiming for February 2026. Please fill out this short poll to help us pick a date: =F0=9F=91=89 [Doodle poll link] Options: Thu 5th Feb, Thu 12th Feb, Thu 19th Feb, Thu 26th Feb The meetup will take place in central London (venue TBA =E2=80=94 likely Imperial College), starting around 6:30pm and running until 8:30pm, with informal drinks and discussions afterwards. [Doodle poll link] What=E2=80=99s the `Fmt'? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C A mix of: =E2=80=A2 Workshop-style talks =E2=80=93 anything from an accessible intr= oduction of your work or research, a deep dive into your library, a live demo, or a tutorial. =E2=80=A2 Hacking / discussions Call for presentations? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you=E2=80=99d like to give a talk, please message me or @giltho direct= ly with: =E2=80=A2 A title and short abstract =E2=80=A2 Expected time slot Once we confirm the first date, we=E2=80=99ll: =E2=80=A2 Confirm the programme and publish a new forum post =E2=80=A2 Setup website, a Zulip channel, and a Meetup page for registrat= ion Looking forward to meeting more OCaml users in person! =E2=80=93 Alistair & Sacha Ppxlib: Support for future compilers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Nathan Rebours announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 *Handling future AST changes in ppxlib* The OCaml 5.2 compiler release has introduced changes in core parts of the AST types. Reflecting those changes when we bumped the internal AST used by ppxlib in [0.36.0] caused breakage in a lot of reverse dependencies. Despite [our efforts to keep the ecosystem up to date], it has lead to a split in the opam universe between packages that are compatible with 0.36.0 and above and those that aren't. Looking at the 5.3 and 5.4 AST changes, we cannot reasonably keep the same ["update the universe" approach] going forward I would like to propose a slightly different but much more stable and sustainable approach. I think it's important to have a bit of context on why ppxlib is designed the way it is and how we've been handling new compiler releases over the past few years to understand this new approach and how it's going to improve the situation. The next section of this post will summarize this. If you're already familiar with ppxlib's history and design choices, please skip ahead to the [Proposed Approach section](#proposed-approach-for-53-onward). [0.36.0] [our efforts to keep the ecosystem up to date] ["update the universe" approach] Ppxlib and compiler releases: How it works today =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Ppxlib internal AST Before ppxlib there was [ocaml-migrate-parsetree]. OMP had the advantage of providing a stable API for ppx authors. Each ppx would select a fixed version of the AST and be implemented as a full AST rewrite, i.e. a `structure -> structure' or `signature -> signature' function. This had the advantage of making ppx-es forward compatible as omp maintainers would add support for new compiler releases in the form of a new module containing the AST types for this version and migration functions to convert to/from the types matching the previous compiler version. OMP also came with a ppx driver, i.e. a program in charge of applying a set of ppx-es on a given AST or source file and spit out the final preprocessed AST for the compiler. The driver was responsible for migrating the AST from the compiler's version to the one used by a ppx. Because each ppx could require a different AST version, it also potentially had to migrate the AST transformed by a ppx before it passing it on to the next one. This had a few disadvantages though: 1. poor performance as the AST was traversed and migrated (i.e. copied) several times through the course of a single driver run. 2. transformations semantic issues: the order in which ppx-es were applied was uncertain or rather tied to the set of ppx-es version used. That meant that updating one ppx could change its "turn" and result in a different AST returned by the driver. This also did not allow ppx-es to interact together reliably. ppxlib aimed at fixing those issues by forcing ppx-es to agree on the AST version to use. ppxlib provides its own, fixed AST version that ppx-es have to use. Its driver handles the migration to/from the current compiler and provides a smooth API to write transformations as rewriting rules. The driver then handles the AST rewrite by recursively applying those rules in the right places in a single AST traversal. [ocaml-migrate-parsetree] =E2=97=8A Support for new compilers Support for new compilers comes in two stages. =E2=97=8A Build and preprocess old code with new compiler This is the most basic support, that is making sure that one can still build and preprocess its code using the newest compiler, provided they don't use any of the new language features. To do this, we add the new AST types and migration functions, just as OMP used to do. This does not allow new features in the code because those cannot be represented with the old AST types and the migration would fail (*This was also an existing limitation of OMP*). This is usually released early on, when the compiler is still in beta and is a non breaking change, all reverse dependencies still build with this new version. =E2=97=8A Support new language features To support new language features, we bump the AST used by ppxlib. This means new features don't have to be migrated anymore and are therefore supported. This does change types that are exposed as part of ppxlib's API and can cause breakage in reverse dependencies, depending on which part of the AST were modified and which part each individual ppx uses explicitly. We provide tools that can help make ppx code more robust as they allow matching over and producing AST nodes without explicitly referencing the types themselves: `metaquot', `Ast_builder' or `Ast_pattern' for instance. That's not always enough though and eventually, those ppx-es have to be updated to be compatible with the latest version of ppxlib. As was the case for the 5.2 AST bump, when we release such a ppxlib version, we send PRs to help maintainers of our opam reverse dependencies update and carefully add upper bounds to the versions that aren't compatible anymore. This worked pretty well for a few years as the AST was relatively stable and the parts that were modified were not directly used by a lot of ppx-es. A problem with this approach is that even though we can help maintainers go through the update, we cannot release packages in their stead which means that unmaintained ppx-es aren't compatible anymore no matter how much effort we put into easing the upgrade. It is also often the case that not all ppx-es have a compatible release straight away and this results in a transition period with the opam universe split mentioned in the introduction. Proposed approach for 5.3 onward =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The first part of this plan is to freeze ppxlib's internal AST for each major versions. That means that until we release ppxlib.1.0.0 our internal AST will always be the 5.2 AST. The second and most important part is to provide complete forward compatibility despite the AST freeze. We will allow migrating new features down to our AST by encoding them inside specific language extensions and migrating them back to their original form before returning the preprocessed AST to the compiler. This will allow existing ppx-es to be used with new compilers AND to be used in the same files as new language features as long as they don't have to directly interact with them without being updated in any way. We will also provide a stable API to allow ppx-es that would like to add special support for these new features to build and match over such nodes. You can take a look at the examples below to get an idea of what that would look like for recent language features such as the [effect syntax](#effect-syntax-example) from OCaml 5.3 or the [bivariance annotation](#bivariant-type-parameter-example) from OCaml 5.4. As part of these changes, we will deprecate ppxlib's copy of `Ast_helper' in favor of `Ast_builder', aiming to remove `Ast_helper' entirely in 1.0.0. We have been maintaining two distinct modules for quite a while now. `Ast_helper' also has a tendency to encourage its users to generate all their code with `Location.none' as their location which makes the life of their users a bit hard when they have to interpret compiler errors. This can be seen as a middle ground between the approach proposed [here] 6 years ago (/that we gave up on due to its complexity/) and the current situation. [here] =E2=97=8A Limitations Encoding new features into extension points is not always easy, only specific parts of the AST can be replaced by an extension point. To keep things under control and prevent ppx-es from generating inconsistent nodes, all new features will always be migrated into an extension point. That means that if the impacted node cannot directly be encoded that way, we will encode the first suitable parent node. In some scenarios, that can climb up the AST types quite significantly, potentially all the way to the `structure_item~/~signature_item'. This means that new features won't be equal when it comes to how easy it is to use them in conjunction with some ppx-es. It's important to keep in mind that this is still a net improvement as it was previously not possible to use them together at all. Similarly, providing a nice API to allow building and destructing encoded new features will vastly depend on the features themselves and how entangled they are with new AST types. We will likely not always expose such builder/destructor pairs and might only add some of them if the demand is high enough. It is also part of the reason why we will probably still bump our AST at some points in time even if much less frequently than we have in the past. When that eventually happens, we will be able to maintain the previous major versions for quite a while as this will just be a matter of adding our newest migrations there as well. =E2=97=8A Effect syntax example OCaml 5.3 introduced the following syntax: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 match f () with =E2=94=82 | v -> Complete v =E2=94=82 | effect (Xchg msg), k -> =E2=94=82 ... =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This special effect pattern is represented in the 5.3 AST with the `Ppat_effect' variant: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 | Ppat_effect of pattern * pattern =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We cannot represent this in the 5.2 AST and previously, any attempt at migrating such a node down would have failed. With this new approach we instead migrate it to something along those lines: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 [%ppxlib.migration.ppat_effect? (Xchg msg, k)] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and the upward migration knows to translate this to the right `Ppat_effect' node. This migration needs to work without context outside the extension so that any ppx that would unknowingly copy such a node elsewhere in the AST would not cause an uninterpreted extension error later on during the compilation. If this is passed down to an existing ppx as part of its payload and it tries to interpret it, it should fail as it won't know what to do with such an extension. *Note that ppx authors should never rely on the actual extension point encoding, we reserve ourselves the right to change that encoding as part of minor or patch releases of ppxlib. Such nodes should be left untouched or dealt with using the stable API described below.* Now if a ppx author needs to add explicit support for effects they will be able to use something like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val ppat_effect : loc: location -> pattern -> pattern -> pattern =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 from `Ast_builder' to generate such a node. Of course if your ppx generates an `effect' pattern with an older compiler, this will lead to a compile error as the extension won't be translated unless migrated back up. Authors will have to be mindful of this and properly document when/how they'll generate newer nodes and eventually restrict their ppx to the right range of compilers. These will likely come with a "destruct" version in `Ast_pattern'. For the `effect' pattern it should look like: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 val ppat_effect : (pattern * pattern, 'a, 'b) t -> (pattern, 'a= , 'b) t =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=97=8A Bivariant type parameter example This example is probably a bit of a stretch as it is a very niche syntax change and is highly unlikely to actually be used in the wild, but it makes a good example of a feature that is hard to encode. In OCaml 5.4, a new variant was added to the `Asttypes.variance' type: `Bivariant'. The `variance' type is used in the AST to describe how a type parameter behaves relative to the type itself. This can be manually annotated for each parameter when writing a type declaration or a class. The `Bivariant' case is a bit of a special one as a parameter can only be `Bivariant' (i.e. covariant AND contravariant) with the type if it does not actually appear in the concrete type definition, that is in cases such as: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type 'a t =3D A =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For reasons that we won't expand upon here, 5.4 introduced the following syntax to allow one to explicit annotate a parameter as bivariant: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type +-'a t =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The problem is that the variance cannot be replaced directly by an extension point, see the type `type_declaration' for instance: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 and type_declaration =3D =E2=94=82 { =E2=94=82 ptype_name: string loc; =E2=94=82 ptype_params: (core_type * (variance * injectivity)) list; =E2=94=82 ^^^^^^^^ =E2=94=82 (** [('a1,...'an) t] *) =E2=94=82 ptype_cstrs: (core_type * core_type * Location.t) list; =E2=94=82 (** [... constraint T1=3DT1' ... constraint Tn=3DTn'] *) =E2=94=82 ptype_kind: type_kind; =E2=94=82 ptype_private: private_flag; (** for [=3D private ...] *) =E2=94=82 ptype_manifest: core_type option; (** represents [=3D T] = *) =E2=94=82 ptype_attributes: attributes; (** [... [\@\@id1] [\@\@id2= ]] *) =E2=94=82 ptype_loc: Location.t; =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 In this example we have to encode the entire parent node of the type declaration as an extension point. This means that it spreads in quite a few places, `type_declaration' can be found in `structure_items', `signature_items' and inside some `module_type' nodes as well. Given there's very little to no use for this syntax, we won't be providing any function to build or destruct such nodes initially. Miou, a simple scheduler for OCaml 5 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am delighted to announce the release of Miou version 0.5.0. This release now uses `poll(2)~/~ppoll(2)' instead of `select(3P)' in order to improve I/O management performance. Since I/O management is decoupled from the scheduler, this does not change the Miou API or the `miou.unix' library. I would particularly like to thank @backtracking for allowing us to integrate part of his [bitv] library under a different licence, as well as @haesbaert, the original author of [ocaml-iomux], for allowing us to use `poll(2)~/~ppoll(2)'. This has allowed us to go further, particularly with [vif], our web framework for OCaml 5, and our website [builder-web] has been completely rewritten to move to OCaml 5 (thanks to @reynir and @yomimono who participated in this rewrite and provided important feedbacks). This release comes with a new package, [flux] (still experimental), offering streaming abstractions that can be used with Miou. I would like to thank @rizo for his sketch [streaming] in this regard (pre-OCaml 5). This library takes advantage of the parallelism offered by Miou (with `Miou.call') as well as resource management and finalisers (with `Miou.Ownership'). A tutorial is available [here] to create a tiny `curl' with a loading bar. Finally, we are continuing to lay the groundwork for the development of unikernels with [mkernel]. We are currently experimenting with three unikernels: =E2=80=A2 [immuable], which reuses Vif to create websites in OCaml 5 in t= he form of unikernels =E2=80=A2 [chaos] (still at a very experimental stage), which aims to be = an NTP server =E2=80=A2 [dns-resolver], which is a DNS query resolver in the form of a unikernel Finally, we would also like to thank everyone who has been involved in the development of Miou and its related ecosystem, whether directly or indirectly. Happy hacking! [bitv] [ocaml-iomux] [vif] [builder-web] [flux] [streaming] [here] [mkernel] [immuable] [chaos] [dns-resolver] Cmarkit 0.4.0 - CommonMark parser and renderer for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, It's my pleasure to announce a new release of [cmarkit], an ISC-licensed CommonMark parser and renderer for OCaml. This release provides support for the latest version of the CommonMark specification, updated data for Unicode 17.0.0, a notable semantic change in the task item extension (thanks to @samoht) and a couple of bug fixes and improvements mostly in the CommonMark renderer. All the details are in the [release notes]. Thanks to everyone who reported issues. This release is brought to you by essential funding from the [OCaml software foundation] and my [donors]. =E2=80=A2 Homepage: =E2=80=A2 Docs: (or `odig doc cmarkit`) =E2=80=A2 Install: `opam install cmarkit` ([opam PR]) =E2=80=94 P.S. I'm surprised by the number of users (or rather, dissatisfied users :=E2=80=93) of the CommonMark renderer. If you are using it don't hesitate to tell how/why you are using it in this thread, just curious :=E2=80=93) [cmarkit] [release notes] [OCaml software foundation] [donors] [opam PR] OCaml library for Timeplus Proton timeseries streaming database =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Michael Freeman announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A high-performance, feature-rich OCaml driver for [Timeplus Proton] - the streaming database built on ClickHouse. [Timeplus Proton] *Features* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=80=A2 *Streaming Queries* - Process large datasets with constant memo= ry usage =E2=80=A2 *Async Inserts* - High-throughput data ingestion with automatic batching =E2=80=A2 *Compression* - LZ4 and ZSTD support for reduced network overhe= ad =E2=80=A2 *TLS Security* - Secure connections with certificate validation =E2=80=A2 *Connection Pooling* - Efficient resource management for high-concurrency applications =E2=80=A2 *Rich Data Types* - Full support for ClickHouse types including Arrays, Maps, Enums, DateTime64 =E2=80=A2 *Idiomatic OCaml* - Functional API leveraging OCaml's strengths Book draft: "Control structures in programming languages" =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Leroy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce that a draft of my upcoming book "Control structures in programming languages: from goto to algebraic effects" is now available at [https://xavierleroy.org/control-structures] . The book compares several programming languages from the standpoint of control structures. OCaml is used intensively to discuss control in functional programming, including continuation-passing style, control operators, exceptions, user-defined effects and effect handlers, with many examples that I hope you'll like. The book also discusses in depth a number of questions that are often raised in this forum, such as the theory and practice of algebraic effects and handlers, and the static checking of exceptions and effects. Enjoy! [https://xavierleroy.org/control-structures] oplot 0.85 - mathematical plotter =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hello I=E2=80=99m happy to announce a new version of [oplot], a library for plo= tting mathematical functions, using openGL by default for fast rendering and animations, but also providing high quality vector graphics exports. This version has a new feature that math lovers will appreciate: `implicit_curve' plotting! For instance do you want to know what the solutions to the equation (x=C2=B2+y=C2=B2-1)=C2=B3 - x=C2=B2 y=C2=B3 =3D 0 look like? Here is the result: If you already dug into the problem of plotting implicit curves you know that it=E2=80=99s sometimes very difficult to localize in advance the various singularities of the curve. `oplot' gives you 3 ways of tuning the computation: grid size, recursive grid size for subsampling where the curvature of the curve seems high, and control over the iterations of the Newton method. There is also a pole detection, where the function changes sign but probably still doesn=E2=80=99t have a zero there. You can obtain debug information for any curve, for instance here you see the default parameters automatically detected for the above curve: initial grid (green) and subsampling (cyan): `oplot' is available in opam, doc is [here]. [oplot] [here] QCheck 0.27 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 QCheck 0.27 is now available from the opam repository :partying_face: The 0.27 release is focused on improving the `float' shrinking support and also contains a small patch to make the package compile with OxCaml: =E2=80=A2 Add `QCheck.Shrink.float' and enable shrinking for `QCheck.floa= t' =E2=80=A2 Add `QCheck.Shrink.float_bound' and enable shrinking for `QCheck.float_bound_inclusive' and `QCheck.float_bound_exclusive' =E2=80=A2 Add `QCheck.Shrink.float_range' and enable shrinking for `QCheck.float_range' =E2=80=A2 Enable shrinking for `QCheck.{pos_float,neg_float,exponential}' =E2=80=A2 Patch `QCheck.Print.float' and `QCheck2.Print.float' to print negative nans consistently as "-nan" also on Windows and macOS, and correct documentation for `QCheck.{float,pos_float,neg_float}' in that they may produce ~nan~s since #350 from 0.26 =E2=80=A2 Eta-expand a couple of partial application to compile under OxC= aml Happy testing! :smiley: Bytesrw 0.3.0 =E2=80=93 The cryptographic edition =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Daniel B=C3=BCnzli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, It's my pleasure to announce a new release of the [bytesrw] set of ISC licensed libraries. Bytesrw extends the OCaml Bytes module with composable, memory efficient, byte stream readers and writers compatible with effect-based concurrency. Optional support for compressed, hashed and encrypted bytes depend, at your wish, on the C `zlib', `libzstd', `blake3', `libmd', `xxhash' and `mbedtls' libraries. This release adds optional libraries to support for `SHA-3' hashes, cryptographically secure pseudo-random bytes streams, TLS encrypted byte stream and low-level support for cryptographic operations on slices: =E2=80=A2 [`Bytesrw_sysrandom'] provides pseudorandom byte streams and en= tropy directly sourced from your operating system primitives. =E2=80=A2 [`Bytesrw_crypto.Psa'] provides low-level cryptographic operati= ons on byte slices via thin and safe bindings to the [TF-PSA-Crypto] C library distributed with Mbed TLS. This library is an implementation of the [PSA Crypto API Specification]. Its design is particularly suited if you care about key materiel not being seen by the OCaml GC (implementations also allow further degrees of isolation as can be read in the API's [design goals]). Besides the API is nicely and thoroughly documented. It is quite bureaucratic to use but that's what you likely want from a cryptographic library (e.g. key usages have to be declared upfront and are checked at runtime by cryptographic operations). =E2=80=A2 [`Bytesrw_crypto'] (will) provides a few higher-level operations implemented over PSA. The module is rather shallow at the moment, more will be added in the future as we abstract over our usage of PSA Crypto. For now it mostly contains an API to access the hashes provided by PSA Crypto in the way other `bytesrw' hashing modules expose their hashing service. This notably provides the `SHA-3' family of hashes which were not previously available in the set of optional `bytesrw' libraries. =E2=80=A2 [`Bytesrw_tls'] provides support for TLS encrypted streams and = the needed X.509 certificate management (including system lookups for trusted CAs). The backend is provided by the [Mbed TLS] C library. For now these streams are instantied over blocking fds, but this restriction will be lifted in the future. I also added a little tool called `certown' which you may find handy for dealing with certificates for localhost when you develop servers. Note that the binding to PSA cryptography has been used to implement a few things (e.g. the horrific passkeys specification) but has not run in production yet. However the binding is pleasantly unsophisticated, the underlying C API is straightforward to bind to. See the [release notes] for details about other changes. This release was made possible thanks to a grant from the [OCaml software foundation] and to my [donors]. =E2=80=A2 Homepage: =E2=80=A2 Docs: (or `odig doc bytesrw') =E2=80=A2 Install: `opam install bytesrw conf-=E2=80=A6' ([opam pr]) =E2=80=94 P.S. Libraries that depend on Mbed TLS need the recent 4.0.0 version which is quite fresh and may take a bit of time to trickle in system package managers. If you trust me you can use my [distribution crutch] opam repository to install it. [bytesrw] [`Bytesrw_sysrandom'] [`Bytesrw_crypto.Psa'] [TF-PSA-Crypto] [PSA Crypto API Specification] [design goals] [`Bytesrw_crypto'] [`Bytesrw_tls'] [Mbed TLS] [release notes] [OCaml software foundation] [donors] [opam pr] [distribution crutch] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Supporting OCurrent: FLOSS/Fund Backs Maintenance for OCaml's Native CI Framework] =E2=80=A2 [WebAuthn & Passkeys in OCaml: Implementing Passwordless Authentication] [the ocaml.org blog] [Supporting OCurrent: FLOSS/Fund Backs Maintenance for OCaml's Native CI Framework] [WebAuthn & Passkeys in OCaml: Implementing Passwordless Authentication] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of October 28 to Novembe= r 04, 2025.

    Caml in the Capital

    Alistair O'Brien announced

    Hi everyone =F0=9F=91=8B

    We (@giltho and myself) are happy to announce the first OCaml meetup in Lon= don (Caml in the Capital)! Think of it as the British cousin of OCaml Users= Meetup in Paris (OUPS).

    What?

    Caml in the Capital is an informal evening of talks, demos, and hacking fro= m anyone working with or interested in OCaml. The goal is to create a frien= dly local space for sharing ideas, showing off projects, and connecting wit= h other OCaml developers in the UK.

    When?

    We=E2=80=99re aiming for February 2026. Please fill out this short poll to = help us pick a date:

    =F0=9F=91=89 Doodle poll link

    Options: Thu 5th Feb, Thu 12th Feb, Thu 19th Feb, Thu 26th Feb

    The meetup will take place in central London (venue TBA =E2=80=94 likely Im= perial College), starting around 6:30pm and running until 8:30pm, with info= rmal drinks and discussions afterwards.

    What=E2=80=99s the Fmt?

    A mix of:

    • Workshop-style talks =E2=80=93 anything from an accessible introduction= of your work or research, a deep dive into your library, a live demo, or a= tutorial.
    • Hacking / discussions

    Call for presentations?

    If you=E2=80=99d like to give a talk, please message me or @giltho directly= with:

    • A title and short abstract
    • Expected time slot

    Once we confirm the first date, we=E2=80=99ll:

    • Confirm the programme and publish a new forum post
    • Setup website, a Zulip channel, and a Meetup page for registration

    Looking forward to meeting more OCaml users in person!

    =E2=80=93 Alistair & Sacha

    Ppxlib: Support for future compilers

    Nathan Rebours announced

    Handling future AST changes in ppxlib

    The OCaml 5.2 compiler release has introduced changes in core parts of the = AST types. Reflecting those changes when we bumped the internal AST used by= ppxlib in 0.36.0 caused breakage in a lot of reverse dependencies. Despite our efforts to keep the ecosystem up to date, it has= lead to a split in the opam universe between packages that are compatible = with 0.36.0 and above and those that aren't.

    Looking at the 5.3 and 5.4 AST changes, we cannot reasonably keep the same = "= update the universe" approach going forward I would like to propose a s= lightly different but much more stable and sustainable approach.

    I think it's important to have a bit of context on why ppxlib is designed t= he way it is and how we've been handling new compiler releases over the pas= t few years to understand this new approach and how it's going to improve t= he situation.

    The next section of this post will summarize this. If you're already famili= ar with ppxlib's history and design choices, please skip ahead to the [Prop= osed Approach section](#proposed-approach-for-53-onward).

    Ppxlib and compiler releases: How it works today

    • Ppxlib internal AST

      Before ppxlib there was ocaml-migrate-parsetree. OMP had the advantage of providi= ng a stable API for ppx authors. Each ppx would select a fixed version of t= he AST and be implemented as a full AST rewrite, i.e. a structure -&g= t; structure or signature -> signature function.

      This had the advantage of making ppx-es forward compatible as omp maintaine= rs would add support for new compiler releases in the form of a new module = containing the AST types for this version and migration functions to conver= t to/from the types matching the previous compiler version.

      OMP also came with a ppx driver, i.e. a program in charge of applying a set= of ppx-es on a given AST or source file and spit out the final preprocesse= d AST for the compiler. The driver was responsible for migrating the AST fr= om the compiler's version to the one used by a ppx. Because each ppx could = require a different AST version, it also potentially had to migrate the AST= transformed by a ppx before it passing it on to the next one.

      This had a few disadvantages though:

      1. poor performance as the AST was traversed and migrated (i.e. copied) se= veral times through the course of a single driver run.
      2. transformations semantic issues: the order in which ppx-es were applied= was uncertain or rather tied to the set of ppx-es version used. That meant= that updating one ppx could change its "turn" and result in a different AS= T returned by the driver. This also did not allow ppx-es to interact togeth= er reliably.

      ppxlib aimed at fixing those issues by forcing ppx-es to agree on the AST v= ersion to use. ppxlib provides its own, fixed AST version that ppx-es have = to use. Its driver handles the migration to/from the current compiler and p= rovides a smooth API to write transformations as rewriting rules. The drive= r then handles the AST rewrite by recursively applying those rules in the r= ight places in a single AST traversal.

    • Support for new compilers

      Support for new compilers comes in two stages.

      • Build and preprocess old code with new compile= r

        This is the most basic support, that is making sure that one can still buil= d and preprocess its code using the newest compiler, provided they don't us= e any of the new language features.

        To do this, we add the new AST types and migration functions, just as OMP u= sed to do. This does not allow new features in the code because those canno= t be represented with the old AST types and the migration would fail (Th= is was also an existing limitation of OMP).

        This is usually released early on, when the compiler is still in beta and i= s a non breaking change, all reverse dependencies still build with this new= version.

      • Support new language features

        To support new language features, we bump the AST used by ppxlib. This mean= s new features don't have to be migrated anymore and are therefore supporte= d.

        This does change types that are exposed as part of ppxlib's API and can cau= se breakage in reverse dependencies, depending on which part of the AST wer= e modified and which part each individual ppx uses explicitly.

        We provide tools that can help make ppx code more robust as they allow matc= hing over and producing AST nodes without explicitly referencing the types = themselves: metaquot, Ast_builder or Ast_pa= ttern for instance. That's not always enough though and eventually, = those ppx-es have to be updated to be compatible with the latest version of= ppxlib.

        As was the case for the 5.2 AST bump, when we release such a ppxlib version= , we send PRs to help maintainers of our opam reverse dependencies update a= nd carefully add upper bounds to the versions that aren't compatible anymor= e.

        This worked pretty well for a few years as the AST was relatively stable an= d the parts that were modified were not directly used by a lot of ppx-es.

        A problem with this approach is that even though we can help maintainers go= through the update, we cannot release packages in their stead which means = that unmaintained ppx-es aren't compatible anymore no matter how much effo= rt we put into easing the upgrade. It is also often the case that not all p= px-es have a compatible release straight away and this results in a transit= ion period with the opam universe split mentioned in the introduction.

    Proposed approach for 5.3 onward

    The first part of this plan is to freeze ppxlib's internal AST for each maj= or versions. That means that until we release ppxlib.1.0.0 our internal AST= will always be the 5.2 AST.

    The second and most important part is to provide complete forward compatibi= lity despite the AST freeze. We will allow migrating new features down to o= ur AST by encoding them inside specific language extensions and migrating t= hem back to their original form before returning the preprocessed AST to th= e compiler.

    This will allow existing ppx-es to be used with new compilers AND to be use= d in the same files as new language features as long as they don't have to = directly interact with them without being updated in any way.

    We will also provide a stable API to allow ppx-es that would like to add sp= ecial support for these new features to build and match over such nodes.

    You can take a look at the examples below to get an idea of what that would= look like for recent language features such as the [effect syntax](#effect= -syntax-example) from OCaml 5.3 or the [bivariance annotation](#bivariant-t= ype-parameter-example) from OCaml 5.4.

    As part of these changes, we will deprecate ppxlib's copy of Ast_help= er in favor of Ast_builder, aiming to remove Ast_= helper entirely in 1.0.0. We have been maintaining two distinct modu= les for quite a while now. Ast_helper also has a tendency to e= ncourage its users to generate all their code with Location.none as their location which makes the life of their users a bit hard when th= ey have to interpret compiler errors.

    This can be seen as a middle ground between the approach proposed here 6 years ag= o (that we gave up on due to its complexity) and the current situati= on.

    • Limitations

      Encoding new features into extension points is not always easy, only specif= ic parts of the AST can be replaced by an extension point. To keep things u= nder control and prevent ppx-es from generating inconsistent nodes, all new= features will always be migrated into an extension point. That means that = if the impacted node cannot directly be encoded that way, we will encode th= e first suitable parent node. In some scenarios, that can climb up the AST = types quite significantly, potentially all the way to the structure_i= tem~/~signature_item. This means that new features won't be equal wh= en it comes to how easy it is to use them in conjunction with some ppx-es. = It's important to keep in mind that this is still a net improvement as it w= as previously not possible to use them together at all.

      Similarly, providing a nice API to allow building and destructing encoded n= ew features will vastly depend on the features themselves and how entangled= they are with new AST types. We will likely not always expose such builder= /destructor pairs and might only add some of them if the demand is high eno= ugh.

      It is also part of the reason why we will probably still bump our AST at so= me points in time even if much less frequently than we have in the past. Wh= en that eventually happens, we will be able to maintain the previous major = versions for quite a while as this will just be a matter of adding our newe= st migrations there as well.

    • Effect syntax example

      OCaml 5.3 introduced the following syntax:

      match f () with
      | v -> Complete v
      | effect (Xchg msg), k ->
        ...
      

      This special effect pattern is represented in the 5.3 AST with the Pp= at_effect variant:

      | Ppat_e=
      ffect of pattern * pattern
      

      We cannot represent this in the 5.2 AST and previously, any attempt at migr= ating such a node down would have failed. With this new approach we instead= migrate it to something along those lines:

      [%ppxlib.migration.ppat_effect? (Xchg msg, k)]
      

      and the upward migration knows to translate this to the right Ppat_ef= fect node. This migration needs to work without context outside the = extension so that any ppx that would unknowingly copy such a node elsewhere= in the AST would not cause an uninterpreted extension error later on durin= g the compilation.

      If this is passed down to an existing ppx as part of its payload and it tri= es to interpret it, it should fail as it won't know what to do with such an= extension.

      Note that ppx authors should never rely on the actual extension point en= coding, we reserve ourselves the right to change that encoding as part of m= inor or patch releases of ppxlib. Such nodes should be left untouched or de= alt with using the stable API described below.

      Now if a ppx author needs to add explicit support for effects they will be = able to use something like:

      val ppat_effect : loc: location -> pattern -> pattern -> pattern
      

      from Ast_builder to generate such a node. Of course if your pp= x generates an effect pattern with an older compiler, this wil= l lead to a compile error as the extension won't be translated unless migra= ted back up. Authors will have to be mindful of this and properly document = when/how they'll generate newer nodes and eventually restrict their ppx to = the right range of compilers.

      These will likely come with a "destruct" version in Ast_pattern. For the effect pattern it should look like:

      val ppat_effect : (pattern * pattern,=
       'a, 'b) t -> (pattern, 'a, 'b) t
      
    • Bivariant type parameter example

      This example is probably a bit of a stretch as it is a very niche syntax ch= ange and is highly unlikely to actually be used in the wild, but it makes a= good example of a feature that is hard to encode.

      In OCaml 5.4, a new variant was added to the Asttypes.variance= type: Bivariant. The variance type is used in th= e AST to describe how a type parameter behaves relative to the type itself.= This can be manually annotated for each parameter when writing a type decl= aration or a class.

      The Bivariant case is a bit of a special one as a parameter ca= n only be Bivariant (i.e. covariant AND contravariant) with th= e type if it does not actually appear in the concrete type definition, that= is in cases such as:

      type 'a t =3D A
      

      For reasons that we won't expand upon here, 5.4 introduced the following sy= ntax to allow one to explicit annotate a parameter as bivariant:

      type +-'a t
      

      The problem is that the variance cannot be replaced directly by an extensio= n point, see the type type_declaration for instance:

      and type_declaration =3D
          {
           ptype_name: string loc;
           ptype_params: (core_type * (variance * injectivity)) list;
                                       ^^^^^^^^
            (** [('a1,...'an) t] *)
           ptype_cstrs: (core_type * core_type * =
      Location.t) list;
            (** [... constraint T1=3DT1'  ... constraint Tn=3DTn'] *)
           ptype_kind: type_kind;
           ptype_private: private_flag;  (** for =
      [=3D private ...] *)
           ptype_manifest: core_type option;  (**=
       represents [=3D T] *)
           ptype_attributes: attributes;  (** [... [\@\@id1] [\@\@id2]<=
      span style=3D"color: #804f60;">] *)<=
      /span>
           ptype_loc: Location.t;
          }
      

      In this example we have to encode the entire parent node of the type declar= ation as an extension point.

      This means that it spreads in quite a few places, type_declaration can be found in structure_items, signature_items and inside some module_type nodes as well.

      Given there's very little to no use for this syntax, we won't be providing = any function to build or destruct such nodes initially.

    Miou, a simple scheduler for OCaml 5

    Calascibetta Romain announced

    I am delighted to announce the release of Miou version 0.5.0. This release = now uses poll(2)~/~ppoll(2) instead of select(3P)= in order to improve I/O management performance.

    Since I/O management is decoupled from the scheduler, this does not change = the Miou API or the miou.unix library.

    I would particularly like to thank @backtracking for allowing us to integra= te part of his bitv li= brary under a different licence, as well as @haesbaert, the original author= of ocaml-iomux<= /a>, for allowing us to use poll(2)~/~ppoll(2).

    This has allowed us to go further, particularly with vif, our web framework for OCaml 5, and our web= site builder-web h= as been completely rewritten to move to OCaml 5 (thanks to @reynir and @yom= imono who participated in this rewrite and provided important feedbacks).

    This release comes with a new package, flux (still experimental), offering streaming abstractions t= hat can be used with Miou. I would like to thank @rizo for his sketch streaming in this regard (pre-= OCaml 5). This library takes advantage of the parallelism offered by Miou (= with Miou.call) as well as resource management and finalisers = (with Miou.Ownership). A tutorial is available here to create a ti= ny curl with a loading bar.

    3D"fetch.gif"

    Finally, we are continuing to lay the groundwork for the development of uni= kernels with mkernel.= We are currently experimenting with three unikernels:

    Finally, we would also like to thank everyone who has been involved in the = development of Miou and its related ecosystem, whether directly or indirect= ly.

    Happy hacking!

    Cmarkit 0.4.0 - CommonMark parser and renderer for OCaml

    Daniel B=C3=BCnzli announced

    Hello,=20

    It's my pleasure to announce a new release of cmarkit, an ISC-licensed CommonMark parser and ren= derer for OCaml.

    This release provides support for the latest version of the CommonMark spec= ification, updated data for Unicode 17.0.0, a notable semantic change in th= e task item extension (thanks to @samoht) and a couple of bug fixes and imp= rovements mostly in the CommonMark renderer.

    All the details are in the release notes. Thanks to ev= eryone who reported issues.=20

    This release is brought to you by essential funding from the OCaml software foundation and my donors.

    P.S. I'm surprised by the number of users (or rather, dissatisfied users := =E2=80=93) of the CommonMark renderer. If you are using it don't hesitate t= o tell how/why you are using it in this thread, just curious :=E2=80=93)

    OCaml library for Timeplus Proton timeseries streaming databas= e

    Michael Freeman announced

    A high-performance, feature-rich OCaml driver for Timeplus Proton - the streaming database built on ClickHouse.

    Features

    • Streaming Queries - Process large datasets with constant memory = usage
    • Async Inserts - High-throughput data ingestion with automatic ba= tching
    • Compression - LZ4 and ZSTD support for reduced network overhead<= /li>
    • TLS Security - Secure connections with certificate validation
    • Connection Pooling - Efficient resource management for high-conc= urrency applications
    • Rich Data Types - Full support for ClickHouse types including Ar= rays, Maps, Enums, DateTime64
    • Idiomatic OCaml - Functional API leveraging OCaml's strengths

    https://gith= ub.com/mfreeman451/proton-ocaml-driver

    Book draft: "Control structures in programming languages"

    Xavier Leroy announced

    I am happy to announce that a draft of my upcoming book "Control structures= in programming languages: from goto to algebraic effects" is now available= at https://xavierle= roy.org/control-structures .

    The book compares several programming languages from the standpoint of cont= rol structures. OCaml is used intensively to discuss control in functional= programming, including continuation-passing style, control operators, exce= ptions, user-defined effects and effect handlers, with many examples that I= hope you'll like.

    The book also discusses in depth a number of questions that are often raise= d in this forum, such as the theory and practice of algebraic effects and h= andlers, and the static checking of exceptions and effects.

    Enjoy!

    oplot 0.85 - mathematical plotter

    sanette announced

    Hello=20

    I=E2=80=99m happy to announce a new version of oplot, a library for plotting mathematical functions, = using openGL by default for fast rendering and animations, but also providi= ng high quality vector graphics exports.

    This version has a new feature that math lovers will appreciate: impl= icit_curve plotting!

    For instance do you want to know what the solutions to the equation (x=C2= =B2+y=C2=B2-1)=C2=B3 - x=C2=B2 y=C2=B3 =3D 0 look like?

    Here is the result:

    3D"00f=

    If you already dug into the problem of plotting implicit curves you know th= at it=E2=80=99s sometimes very difficult to localize in advance the various= singularities of the curve. oplot gives you 3 ways of tuning = the computation: grid size, recursive grid size for subsampling where the c= urvature of the curve seems high, and control over the iterations of the Ne= wton method. There is also a pole detection, where the function changes sig= n but probably still doesn=E2=80=99t have a zero there. You can obtain debu= g information for any curve, for instance here you see the default paramete= rs automatically detected for the above curve: initial grid (green) and sub= sampling (cyan):

    3D"1ed=

    oplot is available in opam, doc is here.

    QCheck 0.27

    Jan Midtgaard announced

    QCheck 0.27 is now available from the opam repository :partying_face:

    https://git= hub.com/c-cube/qcheck/releases/tag/v0.27

    The 0.27 release is focused on improving the float shrinking s= upport and also contains a small patch to make the package compile with OxC= aml:

    • Add QCheck.Shrink.float and enable shrinking for QCh= eck.float
    • Add QCheck.Shrink.float_bound and enable shrinking for QCheck.float_bound_inclusive and QCheck.float_bound_exclusi= ve
    • Add QCheck.Shrink.float_range and enable shrinking for QCheck.float_range
    • Enable shrinking for QCheck.{pos_float,neg_float,exponential}
    • Patch QCheck.Print.float and QCheck2.Print.float to print negative nans consistently as "-nan" also on Windows and macOS= , and correct documentation for QCheck.{float,pos_float,neg_float} in that they may produce ~nan~s since #350 from 0.26
    • Eta-expand a couple of partial application to compile under OxCaml

    Happy testing! :smiley:

    Bytesrw 0.3.0 =E2=80=93 The cryptographic edition

    Daniel B=C3=BCnzli announced

    Hello,=20

    It's my pleasure to announce a new release of the bytesrw set of ISC licensed libraries.

    Bytesrw extends the OCaml Bytes module with composable, memory efficient, = byte stream readers and writers compatible with effect-based concurrency.

    Optional support for compressed, hashed and encrypted bytes depend, at your= wish, on the C zlib, libzstd, blake3, libmd, xxhash and mbedtls librar= ies.

    This release adds optional libraries to support for SHA-3 hash= es, cryptographically secure pseudo-random bytes streams, TLS encrypted byt= e stream and low-level support for cryptographic operations on slices:

    • Bytesrw_sysrandom provides pseudorandom byte s= treams and entropy directly sourced from your operating system primitives.<= /li>
    • Bytesrw_crypto.Psa provides low-level cryptog= raphic operations on byte slices via thin and safe bindings to the TF-PSA-Crypto C library = distributed with Mbed TLS. This library is an implementation of the PSA Crypto API Spec= ification. Its design is particularly suited if you care about key mate= riel not being seen by the OCaml GC (implementations also allow further deg= rees of isolation as can be read in the API's design goals). Bes= ides the API is nicely and thoroughly documented. It is quite bureaucratic = to use but that's what you likely want from a cryptographic library (e.g. k= ey usages have to be declared upfront and are checked at runtime by cryptog= raphic operations).
    • Bytesrw_crypto (will) provides a few higher-level= operations implemented over PSA. The module is rather shallow at the momen= t, more will be added in the future as we abstract over our usage of PSA Cr= ypto. For now it mostly contains an API to access the hashes provided by PS= A Crypto in the way other bytesrw hashing modules expose their= hashing service. This notably provides the SHA-3 family of ha= shes which were not previously available in the set of optional bytes= rw libraries.
    • Bytesrw_tls provides support for TLS encrypted strea= ms and the needed X.509 certificate management (including system lookups fo= r trusted CAs). The backend is provided by the Mbed TLS C library. For now these st= reams are instantied over blocking fds, but this restriction will be lifted= in the future. I also added a little tool called certown whic= h you may find handy for dealing with certificates for localhost when you d= evelop servers.

    Note that the binding to PSA cryptography has been used to implement a few = things (e.g. the horrific passkeys specification) but has not run in produc= tion yet. However the binding is pleasantly unsophisticated, the underlying= C API is straightforward to bind to.

    See the release notes for details about other changes.

    This release was made possible thanks to a grant from the OCaml software foundation and to my donors.

    P.S. Libraries that depend on Mbed TLS need the recent 4.0.0 version which = is quite fresh and may take a bit of time to trickle in system package mana= gers. If you trust me you can use my distribution cr= utch opam repository to install it.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=A809UmmK; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=RqU61ORb; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 1CDBF400A5 for ; Tue, 11 Nov 2025 09:49:59 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=qcgYe0BSuPoQoiPRLm/0fcgmvZPrBAnp2dVofu/D3Dw=; b=A809UmmK3ow2/BoHn9jozWC3Ujkae9pkzlXx0nsHKd0QXO+1Y4de52lE T2nkEk7ssUfrzCNIrRw+t9Q6oIPxEN2KJtt/OPvu6e9mU8KNaP0ZfBxLc QtzP14JqDOKJ+P394y/kQWM9MfCE6vcKExitf7De9vr/U8MKoAAsSApLH s=; X-CSE-ConnectionGUID: vhUtVWMSQk67iFUwk5qRlA== X-CSE-MsgGUID: 6alnLa8BQBm+M+b+a4imvw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,296,1754949600"; d="scan'208,217";a="248573072" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 11 Nov 2025 10:49:58 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id E3A2DE0CD7; Tue, 11 Nov 2025 10:49:57 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 2D1C2E0171 for ; Tue, 11 Nov 2025 10:49:52 +0100 (CET) X-CSE-ConnectionGUID: +jbnY1oVQI+jIbp3EIlS6A== X-CSE-MsgGUID: aJchttLaSAO1/4MQERGLag== IronPort-SDR: 691306be_zQFOewyRRKLQq573GLiDECnk0iXRgQYU835viurGShfHQob anrtjAvnXxlPw9REIHITzSEqAHQra5WHIpuwLZQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FNBwCdBRNphSIeaIFahBaBAxkBYgZeMwcISQOEUoFjg?= =?us-ascii?q?WwIiz2CYJFNinuBaYEsFgUeFQEDAQ0uARsEAQIEAQEDAQIBggyBPYE3AhaMR?= =?us-ascii?q?QIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBA?= =?us-ascii?q?QFASYZPDYJFGThTHlEUCQYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQIAStzAQgKEwEBJgUNG?= =?us-ascii?q?CMDEAQBBgMCBA0BNQMBEwESFAYFgmMBgiACAk8DBAEMBpN/m0x6gTKBAYIMA?= =?us-ascii?q?QEGgQg+AwEBCQICAgEBDgklAdoMgRpKCYFKhW6CShsBKklrAoRJgx6BHQInD?= =?us-ascii?q?4FVRIEUAYIoUW+BfkELFwEBAQFaRgQYAQEIRQmDJYJpgg0ZehQdS4U/gXUyL?= =?us-ascii?q?IFThjoGggOGUIFEIgMmMywBVRMXCwcFW4EIAyo0LW4yHYEkQRhxgRSDSQ8Ta?= =?us-ascii?q?A8GgRKDUYkeD4pdAwttPTcUG5R8QhksggECDgszAiwQIwEuExAGAk0DAQMEB?= =?us-ascii?q?QkmDwIWAQ4BAgwTBAMBEQYCDg0MBgsLAgQpA5JXEBgqd7BzbTQHhB+BXgYMi?= =?us-ascii?q?QiBJpYGhASBV5I+iwuHRyKYJj4igjaHJ4EmCYFva5UkECwCAgSFUYF/I4ErH?= =?us-ascii?q?gwHMxowQw0VBYJACQo8HA+Nfy0Xg14QgS6DGjuCZrdPQjUCAQEKLgIHAQoBA?= =?us-ascii?q?QMJhUUdAQGMCC0Fbl0BAQ?= IronPort-PHdr: A9a23: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 dKBJTYVyT4FWoiA2j0bn+r63KHVxE/4TQ== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:2nxPta5nq/zeb3bpKgPXwPXXdLJyesId70hD6qkRc203TiX8ra qTdZsguyMc5Ax9ZJhCo7C90cu7IE80nKQdieIs1NyZMzUO1lHFEKhSqaPchxfgFyf9+uM179 YDT4FOTPvqAxxfhcb+iTPId+rILeP3lZyVuQ== X-Talos-CUID: 9a23:egFvfm67/a7GyN4Oitsst0weHPF8dUPk7TTSAkWgUktITIbLYArF X-Talos-MUID: 9a23:7ppv6gaQ5tuAheBTvh3nhC1+EM5TyoP3TxwoqLg8lO2NOnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,296,1754949600"; d="scan'208,217";a="130507462" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDENgovMDythL2QHyBFdkKGljapEwVO0CAUMBJ?= =?us-ascii?q?v73qyK3+6v+liVQrCDcIw3Pqsm1f1ZjrTREenfYQSpH295+Ewh34QVN+?= =?us-ascii?q?YD97VuYNgZRJCBsijDL4aFA/oLgKYGvYkesyvaF63hLs0sFBDwTnNiov?= =?us-ascii?q?xn58BuIz/FOVFC3Cu+iU839w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Nov 2025 10:49:51 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 79EF81A381; Tue, 11 Nov 2025 10:49:49 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1762854589; bh=nv9R2PoebMhBMS4sLg5TgUMb7qDxNoujmMDwneceXe4=; h=From:To:Subject:Date:Message-ID; b=RqU61ORbspfPVB+VySH1LbhzmxmxJLBGrvlwijC8FoUfhAHdhmSAAkvcHdfYuyXTz vQd1JOkAAlVaYnA1aKz628vr/mB9ly7c7nrhKCo4RHMcBGaoLDUzAB4T1ZKYixCSJ2 Bpz/cFytJeHFMDo/cjGPMIfq266c4NtBXq08+EGM= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 11 Nov 2025 10:49:48 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 11 10:49:49 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498299, queueID=97CA61A31D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19400 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMDQgdG8gMTEsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9wYW0t cmVwb3NpdG9yeSwgc2lnbmVkISBjb25leCBpcyBpbiBiZXRhIG5vdyA6KQ0KT0NhbWwgUGxhdGZv cm0gTmV3c2xldHRlcjogU2VwdGVtYmVyIHRvIE9jdG9iZXIgMjAyNQ0KRGVtb25zdHJhdGlvbiBv ZiB0aGUgZXh0ZW5zaW9uIGxpdGVyYWxzIGFuZCBjb25zdGFudCByZXdyaXRpbmcgZmVhdHVyZXMN Ck9sZCBDV04NCg0KDQpPcGFtLXJlcG9zaXRvcnksIHNpZ25lZCEgY29uZXggaXMgaW4gYmV0YSBu b3cgOikNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb3BhbS1yZXBvc2l0b3J5LXNpZ25lZC1jb25leC1p cy1pbi1iZXRhLW5vdy8xNzQ2MS8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeW9uZSwNCg0KICB3ZeKAmXJlIHByb3VkIHRvIGFu bm91bmNlIHRoYXQgY29uZXgsIGluIGFuIGluaXRpYWwgdmVyc2lvbiwgaXMgbm93DQogIGxpdmUh IFlvdSBjYW4gcmVjZWl2ZSBzaWduZWQgdXBkYXRlcyBvZiB0aGUgb3BhbS1yZXBvc2l0b3J5LiBB IHF1aWNrDQogIGd1aWRlOg0KDQogIFRvIHNldHVwIG9wYW0gd2l0aCBjb25leCBvbiB5b3VyIG1h Y2hpbmUsIHlvdSBuZWVkIHRvIGluc3RhbGwgY29uZXgNCiAgKGFuZC9vciBjb25leC1taXJhZ2Ut Y3J5cHRvLCBzZWUgYmVsb3cpIC0gY3VycmVudGx5IG9ubHkgYXZhaWxhYmxlIGFzDQogIG9wYW0g cGFja2FnZSAoc29ycnkgYWJvdXQgdGhlIGJvb3RzdHJhcCBwcm9ibGVtIC0gaG9wZWZ1bGx5IGl0 IHdpbGwgYmUNCiAgaW50ZWdyYXRlZCBpbnRvIG9wYW0gYXQgc29tZSB0aW1lKS4NCg0KICBUaGVu LCBpbiB5b3VyIOKAnFx+Ly5vcGFtL2NvbmZpZ+KAnSB5b3UgbmVlZCB0byBzcGVjaWZ5IHRoZQ0K ICBbcmVwb3NpdG9yeS12YWxpZGF0aW9uLWNvbW1hbmRdOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0K ICDilIIgcmVwb3NpdG9yeS12YWxpZGF0aW9uLWNvbW1hbmQ6IFsNCiAg4pSCICAgIi9wYXRoL3Rv L2NvbmV4X3ZlcmlmeV9taXJhZ2VfY3J5cHRvIg0KICDilIIgICAiLS1xdW9ydW09JXtxdW9ydW19 JSINCiAg4pSCICAgIi0tdHJ1c3QtYW5jaG9ycz0le2FuY2hvcnN9JSINCiAg4pSCICAgIi0tcmVw b3NpdG9yeT0le3JlcG99JSIge2luY3JlbWVudGFsfQ0KICDilIIgICAiLS1kaXI9JXtkaXJ9JSIg eyFpbmNyZW1lbnRhbH0NCiAg4pSCICAgIi0tcGF0Y2g9JXtwYXRjaH0lIiB7aW5jcmVtZW50YWx9 DQogIOKUgiAgICItLWluY3JlbWVudGFsIiB7aW5jcmVtZW50YWx9DQogIOKUgiBdDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIEluc3RlYWQgb2Yg4oCcY29uZXhfdmVyaWZ5X21pcmFnZV9jcnlwdG/i gJ0sIHlvdSBjYW4gYXMgd2VsbCB1c2UNCiAg4oCcY29uZXhfdmVyaWZ5X29wZW5zc2zigJ0gKGZl d2VyIGRlcGVuZGVuY2llcywgY2FsbHMgb3V0IHRvIE9wZW5TU0wgYXMNCiAgdGhlIGNyeXB0b2dy YXBoaWMgcHJvdmlkZXIsIGlzIHNsb3dlcikuDQoNCiAgVGhlbiB5b3UgY2FuIHJ1biBgb3BhbSBy ZXBvIGFkZCBjb25leC1yb2J1ciBodHRwczovL2NvbmV4LnJvYnVyLmNvb3AgMQ0KICBzaGEyNTY9 YWQ1ZWIwZTRhNzdhYmZiYzZjMWJiNTY2MWViYTQ2MDQ5NDA0ZTAyMjI1ODhkZDA1OWM4N2YxMjQz NmQ0MWEyOCcuIFRoZXJlYWZ0ZXINCiAgeW91IGNhbiBgb3BhbSByZXBvIHJlbW92ZSBkZWZhdWx0 JywgYW5kIHRoZW4geW914oCZcmUgb25seSB1c2luZyBzaWduZWQNCiAgbWV0YWRhdGEuIFRoZSDi gJwx4oCdIGlzIHRoZSBxdW9ydW0gb2Ygcm9vdCBrZXlzIGZvciBzaWduYXR1cmVzIHRvIGJlDQog IHZhbGlkLCB0aGUNCiAg4oCcc2hhMjU2PWFkNWViMGU0YTc3YWJmYmM2YzFiYjU2NjFlYmE0NjA0 OTQwNGUwMjIyNTg4ZGQwNTljODdmMTI0MzZkNDFhMjjigJ0NCiAgaXMgdGhlIGhhc2ggb2YgdGhl IHB1YmxpYyByb290IGtleS4NCg0KICBSZWFkIHRoZSBmdWxsIGFydGljbGUgYXQNCiAgPGh0dHBz Oi8vaGFubmVzLnJvYnVyLmNvb3AvUG9zdHMvQ29uZXhSdW5uaW5nPiDigJMgaGFwcHkgdG8gcmVj ZWl2ZQ0KICBmZWVkYmFjay4NCg0KICBUaGUgZGV2ZWxvcG1lbnQgb2YgY29uZXggaXMgc3VwcG9y dGVkIGJ5IHRoZSBbT0NhbWwgU29mdHdhcmUNCiAgRm91bmRhdGlvbl0gYW5kIGJ5IFthaHJlZnNd Lg0KDQoNCltyZXBvc2l0b3J5LXZhbGlkYXRpb24tY29tbWFuZF0NCjxodHRwczovL29wYW0ub2Nh bWwub3JnL2RvYy9NYW51YWwuaHRtbCNjb25maWdmaWVsZC1yZXBvc2l0b3J5LXZhbGlkYXRpb24t Y29tbWFuZD4NCg0KW09DYW1sIFNvZnR3YXJlIEZvdW5kYXRpb25dIDxodHRwczovL29jYW1sLXNm Lm9yZy8+DQoNClthaHJlZnNdIDxodHRwczovL2FocmVmcy5jb20vPg0KDQoNCk9DYW1sIFBsYXRm b3JtIE5ld3NsZXR0ZXI6IFNlcHRlbWJlciB0byBPY3RvYmVyIDIwMjUNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci1zZXB0ZW1iZXItdG8t b2N0b2Jlci0yMDI1LzE3NDYyLzE+DQoNCg0KU2FiaW5lIFNjaG1hbHR6IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSADQoNCiAgV2VsY29tZSB0byB0aGUgc2l4dGVlbnRoIGVkaXRpb24gb2Yg dGhlIE9DYW1sIFBsYXRmb3JtIG5ld3NsZXR0ZXIhDQoNCiAgSW4gdGhpcyBTZXB0ZW1iZXIgdG8g T2N0b2JlciAyMDI1IGVkaXRpb24sIHdlIGFyZSBleGNpdGVkIHRvIGJyaW5nIHlvdQ0KICB0aGUg bGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29udGludWluZyBvdXIgdHJhZGl0aW9uIG9m DQogIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1lbnRzIGFzIHNlZW4gaW4gW3ByZXZpb3Vz IGVkaXRpb25zXS4gVG8NCiAgdW5kZXJzdGFuZCB0aGUgZGlyZWN0aW9uIHdlJ3JlIGhlYWRlZCwg ZXNwZWNpYWxseSByZWdhcmRpbmcNCiAgZGV2ZWxvcG1lbnQgd29ya2Zsb3dzIGFuZCB1c2VyIGV4 cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBvdXQgb3VyDQogIFtyb2FkbWFwXS4NCg0KICBZ b3UgY2FuIFtzdWJzY3JpYmUgdG8gdGhpcyBuZXdzbGV0dGVyIG9uIExpbmtlZEluXSENCg0KICAq SGlnaGxpZ2h0czoqDQoNCiAg4oCiICpPQ2FtbCA1LjQuMCBSZWxlYXNlZCo6IE1ham9yIHN0YWJs ZSByZWxlYXNlIGZlYXR1cmluZyBsYWJlbGxlZA0KICAgICB0dXBsZXMsIGltbXV0YWJsZSBhcnJh eXMsIHVuaWZpZWQgYXJyYXkgbGl0ZXJhbCBzeW50YXgsIGF0b21pYw0KICAgICByZWNvcmQgZmll bGRzLCBhbmQgZm91ciBuZXcgc3RhbmRhcmQgbGlicmFyeSBtb2R1bGVzDQogIOKAoiAqU2VjdXJp dHkgUmVzcG9uc2UgVGVhbSBFc3RhYmxpc2hlZCo6IE5ldyB0ZWFtIGZvcm1lZCB0byBoYW5kbGUN CiAgICAgc2VjdXJpdHkgdnVsbmVyYWJpbGl0aWVzIGluIHRoZSBPQ2FtbCBlY29zeXN0ZW0NCiAg 4oCiICpFbmhhbmNlZCBFZGl0b3IgU3VwcG9ydCo6IE9DYW1sLUxTUCAxLjI0LjAgYW5kIE1lcmxp biA1LjYgYnJpbmcNCiAgICAgaW1wcm92ZWQgcHJvamVjdCBuYXZpZ2F0aW9uIGFuZCBwZXJmb3Jt YW5jZSBvcHRpbWl6YXRpb25zDQogIOKAoiAqT0NhbWwub3JnIFJlb3JnYW5pemF0aW9uKjogQ2xl YXIgc2VwYXJhdGlvbiBiZXR3ZWVuIG5ld3MgYWJvdXQNCiAgICAgcHJvZHVjdGlvbi1yZWFkeSBm ZWF0dXJlcyBhbmQgcmVsZWFzZXMgKE9DYW1sIENoYW5nZWxvZykgYW5kDQogICAgIG9uZ29pbmcg d29yayBhbmQgZXhwZXJpbWVudGFsIGZlYXR1cmVzIChCYWNrc3RhZ2UgT0NhbWwpDQogIOKAoiAq RXhwZXJpbWVudGFsIFRvb2xzIFByb2dyZXNzKjogR29zcGVsIGVjb3N5c3RlbSB0b29scyByZWFk eSBmb3INCiAgICAgdGVzdGluZywgbmV3IG9jYW1sLm52aW0gcGx1Z2luIGZvciBOZW92aW0gdXNl cnMsIGFuZCBleHBlcmltZW50YWwNCiAgICAgTWVybGluIGJyYW5jaCB1c2luZyBkb21haW5zIGFu ZCBlZmZlY3RzDQoNCiAgKk9DYW1sIENoYW5nZWxvZzoqDQoNCiAg4oCiIFtPQ2FtbC5vcmc6IElu dHJvZHVjaW5nIEJhY2tzdGFnZSBPQ2FtbCAtIFNlcGFyYXRlIEZlZWRzIGZvciBTdGFibGUNCiAg ICBhbmQgRXhwZXJpbWVudGFsIEZlYXR1cmVzXSAoT2N0IDgsIDIwMjUpDQogIOKAoiBbT0NhbWwg U2VjdXJpdHkgUmVzcG9uc2UgVGVhbSBFc3RhYmxpc2hlZF0gKE9jdCAzLCAyMDI1KQ0KDQogICpC YWNrc3RhZ2UgT0NhbWw6Kg0KDQogIOKAoiBbR29zcGVsIEVjb3N5c3RlbTogVG9vbHMgUmVhZHkg dG8gVHJ5LCBMYW5ndWFnZSBFdm9sdmluZ10gKE9jdCAxNSwNCiAgICAyMDI1KQ0KICDigKIgW0Jh Y2tzdGFnZSBPQ2FtbDogb2NhbWwubnZpbSAtIEEgTmVvdmltIFBsdWdpbiBmb3IgT0NhbWxdIChP Y3QgMTQsDQogICAgMjAyNSkNCiAg4oCiIFtCYWNrc3RhZ2UgT0NhbWw6IFlvdSBDYW4gVHJ5IHRo ZSBFeHBlcmltZW50YWwgQnJhbmNoIG9mIE1lcmxpbiBUaGF0DQogICAgVXNlcyBEb21haW5zIGFu ZCBFZmZlY3RzXSAoT2N0IDgsIDIwMjUpDQoNCiAgKlN0YWJsZSBSZWxlYXNlczoqDQoNCiAg4oCi IFtSZWxlYXNlIG9mIE9DYW1sIDUuNC4wXSAoT2N0IDksIDIwMjUpDQogIOKAoiBbb3BhbS1wdWJs aXNoIDIuNy4wXSAoT2N0IDcsIDIwMjUpDQogIOKAoiBbT0NhbWwtTFNQIDEuMjQuMF0gKE9jdCA0 LCAyMDI1KQ0KICDigKIgW01lcmxpbiA1LjYtNTAzIGFuZCA1LjYtNTA0XSAoT2N0IDQsIDIwMjUp DQogIOKAoiBbT0NhbWwtTFNQIDEuMjMuMV0gKE9jdCAzLCAyMDI1KQ0KICDigKIgW1BweGxpYiAw LjM2LjJdIChPY3QgMSwgMjAyNSkNCiAg4oCiIFtvY3AtaW5kZW50IDEuOS4wXSAoT2N0IDEsIDIw MjUpDQogIOKAoiBbb3BhbS1wdWJsaXNoIDIuNi4wXSAoU2VwIDE5LCAyMDI1KQ0KICDigKIgW0R1 bmUgMy4yMC4yXSAoU2VwIDEwLCAyMDI1KQ0KDQogICpVbnN0YWJsZSBSZWxlYXNlczoqDQoNCiAg 4oCiIFtGaXJzdCByZWxlYXNlIGNhbmRpZGF0ZSBmb3IgT0NhbWwgNS40LjBdIChTZXAgMjksIDIw MjUpDQogIOKAoiBbU2Vjb25kIGJldGEgcmVsZWFzZSBvZiBPQ2FtbCA1LjQuMF0gKFNlcCA5LCAy MDI1KQ0KDQoNCltwcmV2aW91cyBlZGl0aW9uc10gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dGFnL3BsYXRmb3JtLW5ld3NsZXR0ZXI+DQoNCltyb2FkbWFwXSA8aHR0cHM6Ly9vY2FtbC5vcmcv ZG9jcy9wbGF0Zm9ybS1yb2FkbWFwPg0KDQpbc3Vic2NyaWJlIHRvIHRoaXMgbmV3c2xldHRlciBv biBMaW5rZWRJbl0NCjxodHRwczovL3d3dy5saW5rZWRpbi5jb20vbmV3c2xldHRlcnMvb2NhbWwt cGxhdGZvcm0tbmV3c2xldHRlci03MzA1MjcwNjk0NTY3NjYxNTY4Lz4NCg0KW09DYW1sLm9yZzog SW50cm9kdWNpbmcgQmFja3N0YWdlIE9DYW1sIC0gU2VwYXJhdGUgRmVlZHMgZm9yIFN0YWJsZSBh bmQNCkV4cGVyaW1lbnRhbCBGZWF0dXJlc10NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cv MjAyNS0xMC0wOC1pbnRyb2R1Y2luZy1iYWNrc3RhZ2Utb2NhbWw+DQoNCltPQ2FtbCBTZWN1cml0 eSBSZXNwb25zZSBUZWFtIEVzdGFibGlzaGVkXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxv Zy8yMDI1LTEwLTAzLXNlY3VyaXR5LXRlYW0+DQoNCltHb3NwZWwgRWNvc3lzdGVtOiBUb29scyBS ZWFkeSB0byBUcnksIExhbmd1YWdlIEV2b2x2aW5nXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2JhY2tz dGFnZS8yMDI1LTEwLTE1LWdvc3BlbC1sYW5ndWFnZS1ldm9sdmluZz4NCg0KW0JhY2tzdGFnZSBP Q2FtbDogb2NhbWwubnZpbSAtIEEgTmVvdmltIFBsdWdpbiBmb3IgT0NhbWxdDQo8aHR0cHM6Ly9v Y2FtbC5vcmcvYmFja3N0YWdlLzIwMjUtMTAtMTQtb2NhbWwtbnZpbS1hLW5lb3ZpbS1wbHVnaW4t Zm9yLW9jYW1sPg0KDQpbQmFja3N0YWdlIE9DYW1sOiBZb3UgQ2FuIFRyeSB0aGUgRXhwZXJpbWVu dGFsIEJyYW5jaCBvZiBNZXJsaW4gVGhhdA0KVXNlcyBEb21haW5zIGFuZCBFZmZlY3RzXQ0KPGh0 dHBzOi8vb2NhbWwub3JnL2JhY2tzdGFnZS8yMDI1LTEwLTA4LW1lcmxpbi1kb21haW5zPg0KDQpb UmVsZWFzZSBvZiBPQ2FtbCA1LjQuMF0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAy NS0xMC0wOS1vY2FtbC01NDA+DQoNCltvcGFtLXB1Ymxpc2ggMi43LjBdDQo8aHR0cHM6Ly9vY2Ft bC5vcmcvY2hhbmdlbG9nLzIwMjUtMTAtMDctb3BhbS1wdWJsaXNoLTItNy0wPg0KDQpbT0NhbWwt TFNQIDEuMjQuMF0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMC0wNC1vY2Ft bC1sc3AtMTI0MD4NCg0KW01lcmxpbiA1LjYtNTAzIGFuZCA1LjYtNTA0XQ0KPGh0dHBzOi8vb2Nh bWwub3JnL2NoYW5nZWxvZy8yMDI1LTEwLTA0LW1lcmxpbi12NTYtNTAzLWFuZC01MDQ+DQoNCltP Q2FtbC1MU1AgMS4yMy4xXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEwLTAz LW9jYW1sLWxzcC0xMjMxPg0KDQpbUHB4bGliIDAuMzYuMl0gPGh0dHBzOi8vb2NhbWwub3JnL2No YW5nZWxvZy8yMDI1LTEwLTAxLXBweGxpYi0wMzYyPg0KDQpbb2NwLWluZGVudCAxLjkuMF0NCjxo dHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMC0wMS1vY3AtaW5kZW50LTE5MD4NCg0K W29wYW0tcHVibGlzaCAyLjYuMF0NCjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0w OS0xOS1vcGFtLXB1Ymxpc2gtMi02LTA+DQoNCltEdW5lIDMuMjAuMl0gPGh0dHBzOi8vb2NhbWwu b3JnL2NoYW5nZWxvZy8yMDI1LTA5LTEwLWR1bmUzMjAyPg0KDQpbRmlyc3QgcmVsZWFzZSBjYW5k aWRhdGUgZm9yIE9DYW1sIDUuNC4wXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2JhY2tzdGFnZS8yMDI1 LTA5LTI5LW9jYW1sLTU0MC1yYzE+DQoNCltTZWNvbmQgYmV0YSByZWxlYXNlIG9mIE9DYW1sIDUu NC4wXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2JhY2tzdGFnZS8yMDI1LTA5LTA5LW9jYW1sLTU0MC1i ZXRhMj4NCg0KT0NhbWwgQ29tcGlsZXINCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQril4ogT0NhbWwgNS40LjAgU3RhYmxlIFJlbGVhc2UNCg0KICBUaGUgW09j dG9iZXIgOSwgMjAyNSByZWxlYXNlIG9mIE9DYW1sIDUuNC4wXSByZXByZXNlbnRzIGEgbWFqb3IN CiAgbWlsZXN0b25lIHdpdGggc2lnbmlmaWNhbnQgbGFuZ3VhZ2UgZW5oYW5jZW1lbnRzLiBBZnRl ciB0d28gYmV0YQ0KICByZWxlYXNlcyBhbmQgYSByZWxlYXNlIGNhbmRpZGF0ZSBpbiBTZXB0ZW1i ZXIsIHRoZSBzdGFibGUgdmVyc2lvbg0KICBkZWxpdmVyczoNCg0KICAqTGFuZ3VhZ2UgRmVhdHVy ZXM6Kg0KDQogIOKAoiAqTGFiZWxsZWQgdHVwbGVzKjogRW5hYmxlIGJldHRlciBkb2N1bWVudGF0 aW9uIGFuZCB0eXBlIHNhZmV0eSB3aXRoDQogICAgIGxhYmVscyBvbiB0dXBsZSBmaWVsZHMNCg0K ICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiBsZXQgKCAqICkgKHgsfmR4KSAoeSx+ZHg6ZHkp ID0geCoueSwgfmR4Oih4ICouIGR5ICsuIHkgKi4gZHgpDQogICAg4pSU4pSA4pSA4pSA4pSADQoN CiAg4oCiICpJbW11dGFibGUgYXJyYXlzKiAoYCdhIGlhcnJheScpOiBDb3ZhcmlhbnQgYXJyYXlz IGZvciBzYWZlcg0KICAgICBjb25jdXJyZW50IHByb2dyYW1taW5nDQogIOKAoiAqVW5pZmllZCBh cnJheSBsaXRlcmFsIHN5bnRheCo6IGBbfCAuLi4gfF0nIG5vdyB3b3JrcyBmb3IgYCdhDQogICAg IGFycmF5JywgYCdhIGlhcnJheScsIGFuZCBgZmxvYXRhcnJheScNCiAg4oCiICpBdG9taWMgcmVj b3JkIGZpZWxkcyo6IE5ldyBgW0BhdG9taWNdJyBhdHRyaWJ1dGUgd2l0aCBgQXRvbWljLkxvYycN CiAgICAgc3VibW9kdWxlIGZvciBsb2NrLWZyZWUgY29uY3VycmVudCBhY2Nlc3MNCg0KICAqU3Rh bmRhcmQgTGlicmFyeSBBZGRpdGlvbnM6Kg0KDQogIOKAoiBgUGFpcic6IFV0aWxpdHkgZnVuY3Rp b25zIGZvciBwYWlycw0KICDigKIgYFBxdWV1ZSc6IFByaW9yaXR5IHF1ZXVlIGltcGxlbWVudGF0 aW9uDQogIOKAoiBgUmVwcic6IEV4cGxpY2l0IGZ1bmN0aW9ucyBmb3IgcGh5c2ljYWwgZXF1YWxp dHkgYW5kIGNvbXBhcmlzb24NCiAg4oCiIGBJYXJyYXknOiBPcGVyYXRpb25zIG9uIGltbXV0YWJs ZSBhcnJheXMNCg0KICAqUnVudGltZSBJbXByb3ZlbWVudHM6Kg0KDQogIOKAoiBGcmFtZSBwb2lu dGVycyBzdXBwb3J0IGZvciBBUk02NCAoTGludXggYW5kIG1hY09TKQ0KICDigKIgUGVyZm9ybWFu Y2UgZml4IGZvciBBcHBsZSBTaWxpY29uICh1c2luZyBgc3RscicgaW5zdGVhZCBvZiBgZG1iDQog ICAgaXNobGQ7IHN0cicpDQogIOKAoiBTb2Z0d2FyZSBwcmVmZXRjaGluZyBmb3IgQVJNNjQsIHMz OTB4LCBQUEM2NCwgYW5kIFJJU0MtVg0KICDigKIgUmVzdG9yZWQgIm1lbW9yeSBjbGVhbnVwIHVw b24gZXhpdCIgbW9kZQ0KDQogIFRoZSBbU2VwdGVtYmVyIGJldGEgcmVsZWFzZXNdIGFuZCBbcmVs ZWFzZSBjYW5kaWRhdGVdIGRlbW9uc3RyYXRlZCB0aGUNCiAgbWF0dXJpdHkgb2YgdGhlIHJlbGVh c2UsIHdpdGggb25seSBtaW5vciBUU0FOIGFuZCBtZXRhZGF0YSBmaXhlcw0KICBuZWVkZWQuDQoN Cg0KICBbT2N0b2JlciA5LCAyMDI1IHJlbGVhc2Ugb2YgT0NhbWwgNS40LjBdDQogIDxodHRwczov L29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMC0wOS1vY2FtbC01NDA+DQoNCiAgW1NlcHRlbWJl ciBiZXRhIHJlbGVhc2VzXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvYmFja3N0YWdlLzIwMjUtMDkt MDktb2NhbWwtNTQwLWJldGEyPg0KDQogIFtyZWxlYXNlIGNhbmRpZGF0ZV0NCiAgPGh0dHBzOi8v b2NhbWwub3JnL2JhY2tzdGFnZS8yMDI1LTA5LTI5LW9jYW1sLTU0MC1yYzE+DQoNCg0K4peKIFdJ UDogUmVsb2NhdGFibGUgT0NhbWwNCg0KICBXb3JrIG9uICpSZWxvY2F0YWJsZSBPQ2FtbCogaXMg cHJvZ3Jlc3NpbmcgdG93YXJkIGluY2x1c2lvbiBpbiBPQ2FtbA0KICA1LjUsIHdpdGggaW1wbGVt ZW50YXRpb24gUFJzIG9wZW5lZCBieSBEYXZpZCBBbGxzb3BwIGluIFNlcHRlbWJlci4gVGhlDQog IGNoYW5nZXMgYXJlIHVuZGVyZ29pbmcgcmV2aWV3IGZyb20gU2FtdWVsIEh5bSwgSm9uYWggQmVj a2ZvcmQsIGFuZA0KICBvdGhlcnMuDQoNCiAgKldoYXQgUmVsb2NhdGFibGUgT0NhbWwgRW5hYmxl czoqDQoNCiAgVGhpcyBmZWF0dXJlIGFsbG93cyB0aGUgT0NhbWwgY29tcGlsZXIgYW5kIGl0cyBh c3NvY2lhdGVkIHRvb2xzIHRvIGJlDQogIG1vdmVkIHRvIGRpZmZlcmVudCBmaWxlc3lzdGVtIGxv Y2F0aW9ucyBhZnRlciBpbnN0YWxsYXRpb24gd2l0aG91dA0KICBicmVha2luZyBmdW5jdGlvbmFs aXR5LiBLZXkgYmVuZWZpdHMgaW5jbHVkZToNCg0KICDigKIgQmluYXJ5IGRpc3RyaWJ1dGlvbnMg dGhhdCB3b3JrIHJlZ2FyZGxlc3Mgb2YgaW5zdGFsbGF0aW9uIHBhdGgNCiAg4oCiIEltcHJvdmVk IGZsZXhpYmlsaXR5IGZvciBwYWNrYWdlIG1hbmFnZXJzIG9yZ2FuaXppbmcgT0NhbWwNCiAgICBp bnN0YWxsYXRpb25zDQogIOKAoiBCdW5kbGluZyBvZiBzcGVjaWZpYyBPQ2FtbCB2ZXJzaW9ucyBi eSBkZXZlbG9wZXIgdG9vbHMgd2l0aG91dCBwYXRoDQogICAgY29uZmxpY3RzDQogIOKAoiBTaW1w bGlmaWVkIGNyb3NzLXBsYXRmb3JtIGRpc3RyaWJ1dGlvbg0KDQogICpDdXJyZW50IFN0YXR1czoq DQoNCiAgVGhlIGltcGxlbWVudGF0aW9uIGlzIGluIGFjdGl2ZSByZXZpZXcgd2l0aCBvbmdvaW5n IHJlc3BvbnNlcyB0bw0KICBmZWVkYmFjay4gVGhlIGNvcmUgZGV2ZWxvcG1lbnQgdGVhbSBpcyBs aWtlbHkgdG8gcmV2aWV3IHRoZSBjaGFuZ2VzIGF0DQogIGFuIHVwY29taW5nIG1lZXRpbmcsIHRh cmdldGluZyBpbmNsdXNpb24gaW4gT0NhbWwgNS41Lg0KDQogIEZvciB0ZWNobmljYWwgZGV0YWls cyBhYm91dCB0aGUgaW1wbGVtZW50YXRpb24gYXBwcm9hY2ggYW5kIGl0cw0KICBpbXBsaWNhdGlv bnMgZm9yIHRoZSBlY29zeXN0ZW0sIHNlZSBEYXZpZCBBbGxzb3BwJ3MgW2Jsb2cgcG9zdCBvbg0K ICBSZWxvY2F0YWJsZSBPQ2FtbF0gYW5kIHRoZSBhc3NvY2lhdGVkIFtEaXNjdXNzIHRocmVhZF0u DQoNCg0KICBbYmxvZyBwb3N0IG9uIFJlbG9jYXRhYmxlIE9DYW1sXQ0KICA8aHR0cHM6Ly93d3cu ZHJhMjcudWsvYmxvZy9wbGF0Zm9ybS8yMDI1LzA5LzE1L3JlbG9jYXRhYmxlLW9jYW1sLmh0bWw+ DQoNCiAgW0Rpc2N1c3MgdGhyZWFkXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JlbG9j YXRhYmxlLW9jYW1sLzE3MjUzPg0KDQoNCkJ1aWxkIFN5c3RlbQ0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBEdW5lDQoNCiAgW0R1bmUgMy4yMC4yXSAoU2VwdGVt YmVyIDEwLCAyMDI1KSBwcm92aWRlcyBidWcgZml4ZXMgYW5kIHN0YWJpbGl0eQ0KICBpbXByb3Zl bWVudHMgZm9yIHRoZSAzLjIwIHNlcmllcy4NCg0KDQogIFtEdW5lIDMuMjAuMl0gPGh0dHBzOi8v b2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTA5LTEwLWR1bmUzMjAyPg0KDQogIOKXiiBFeHBlcmlt ZW50YWw6IER1bmUgUGFja2FnZSBNYW5hZ2VtZW50DQoNCiAgICBXZSBrZWVwIGV4cGxvcmluZzoN Cg0KICAgIOKAoiAqUG9ydGFibGUgRXh0ZXJuYWwgRGVwZW5kZW5jaWVzKjogQW4gYXBwcm9hY2gg Zm9yIHN0b3Jpbmcgc3lzdGVtDQogICAgICAgcGFja2FnZSBkZXBlbmRlbmNpZXMgaW4gYSBwbGF0 Zm9ybS1hZ25vc3RpYyBmb3JtYXQsIGFsbG93aW5nDQogICAgICAgcHJvamVjdHMgdG8gbWFpbnRh aW4gYSBzaW5nbGUgc3BlY2lmaWNhdGlvbiB0aGF0IHJlc29sdmVzDQogICAgICAgY29ycmVjdGx5 IGFjcm9zcyBMaW51eCwgbWFjT1MsIGFuZCBXaW5kb3dzIGVudmlyb25tZW50cywgZW5zdXJpbmcN CiAgICAgICBjb25zaXN0ZW50IGJ1aWxkcyByZWdhcmRsZXNzIG9mIHBsYXRmb3JtLXNwZWNpZmlj IHBhY2thZ2UgbmFtaW5nDQogICAgICAgYW5kIHZlcnNpb25pbmcgZGlmZmVyZW5jZXMuDQogICAg 4oCiICpQb3J0YWJsZSBMb2NrIERpcmVjdG9yaWVzKjogTG9jayBkaXJlY3RvcmllcyB0aGF0IHdv cmsNCiAgICAgICBjb25zaXN0ZW50bHkgYWNyb3NzIGRpZmZlcmVudCBvcGVyYXRpbmcgc3lzdGVt cyBhbmQNCiAgICAgICBhcmNoaXRlY3R1cmVzLCBhZGRyZXNzaW5nIHRoZSBjdXJyZW50IGxpbWl0 YXRpb24gd2hlcmUNCiAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBkZXBlbmRlbmN5IHJlc29sdXRp b25zIHByZXZlbnQgdGVhbXMgZnJvbQ0KICAgICAgIHNoYXJpbmcgbG9jayBmaWxlcyB0aHJvdWdo IHZlcnNpb24gY29udHJvbCBpbiBoZXRlcm9nZW5lb3VzDQogICAgICAgZGV2ZWxvcG1lbnQgZW52 aXJvbm1lbnRzLg0KICAgIOKAoiAqTG9jayBEaXJlY3RvcmllcyBhcyBCdWlsZCBUYXJnZXRzKjog Q3VycmVudGx5LCB0aGUgc29sdmVyIHRoYXQNCiAgICAgICBjb21lcyB1cCB3aXRoIGEgc2V0IG9m IGNvbXBhdGlibGUgZGVwZW5kZW5jaWVzIG5lZWRzIHRvIGJlIHJ1biBieQ0KICAgICAgIHRoZSB1 c2VyIGV4cGxpY2l0ZWx5ICh1c2luZyBgZHVuZSBwa2cgbG9jaycpLCBidXQgaW4gdGhlIGZ1dHVy ZQ0KICAgICAgIHdlIGludGVuZCB0byBjcmVhdGUgYnVpbGQgcGxhbnMgaW1wbGljaXRseSB2aWEg RHVuZSBidWlsZA0KICAgICAgIHJ1bGVzLiBUaGlzIHNob3VsZCBtYWtlIG1ha2UgcGFja2FnZSBt YW5hZ2VtZW50IHNpbXBsZXIgdG8gdXNlIGFzDQogICAgICAgaXQgcmVxdWlyZXMgZmV3ZXIgdXNl ciBhY3Rpb25zIGFuZCBkb2VzIG5vdCByZXF1aXJlIHB1dHRpbmcNCiAgICAgICB2ZXJib3NlIGxv Y2sgZGlyZWN0b3JpZXMgaW50byB0aGUgcHJvamVjdCBzb3VyY2UNCiAgICAgICBkaXJlY3Rvcmll cy4gVGhpcyBjaGFuZ2UgYWxzbyBwYXZlcyB0aGUgd2F5IGZvciBhdXRvbWF0aWMNCiAgICAgICBy ZWxvY2tpbmcgd2hlbiBkZXBlbmRlbmNpZXMgY2hhbmdlLCBpbmNsdWRpbmcgaW4gd2F0Y2ggbW9k ZS4NCg0KICAgIFRoZXNlIGZlYXR1cmVzIHJlbWFpbiB1bmRlciBhY3RpdmUgZGV2ZWxvcG1lbnQg YW5kIHNob3VsZCBub3QgYmUNCiAgICByZWxpZWQgb24gaW4gcHJvZHVjdGlvbi4gSG93ZXZlciwg d2UgZW5jb3VyYWdlIGNhdXRpb3VzIGFkb3B0aW9uIG9mDQogICAgRHVuZSBQYWNrYWdlIE1hbmFn ZW1lbnQgaXRzZWxmIGZvciB1c2VycyBjb21mb3J0YWJsZSB3aXRoDQogICAgYmxlZWRpbmctZWRn ZSB0b29scyB0aGF0IG1heSBzdGlsbCBjaGFuZ2UuIER1bmUgcGFja2FnZSBtYW5hZ2VtZW50DQog ICAgaXMgYXZhaWxhYmxlIGluIHRoZSBzdGFibGUgcmVsZWFzZSBvZiBEdW5lLCBhcyBhbiBleHBl cmltZW50YWwNCiAgICBmZWF0dXJlLg0KDQogICAgKkR1bmUgTWFpbnRhaW5lZCBieSo6IFJ1ZGkg R3JpbmJlcmcgKEByZ3JpbmJlcmcsIEphbmUgU3RyZWV0KSwNCiAgICAgTmljb2zDoXMgT2plZGEg QsOkciAoQG5vamIsIExleGlGaSksIE1hcmVrIEt1YmljYQ0KICAgICAoQExlb25pZGFzLWZyb20t WElWLCBUYXJpZGVzKSwgQWxpIENhZ2xheWFuIChAQWxpenRlciwgVGFyaWRlcyksDQogICAgIEV0 aWVubmUgTWlsbG9uIChAZW1pbGxvbiksIFN0ZXBoZW4gU2hlcnJhdHQgKEBncmlkYnVncywgVGFy aWRlcyksDQogICAgIEFudG9uaW8gTnVubyBNb250ZWlybyAoQGFubW9udGVpcm8pLCBFdGllbm5l IE1hcmFpcyAoQG1haXN0ZSkNCg0KDQpQYWNrYWdlIE1hbmFnZW1lbnQNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogb3BhbS1wdWJs aXNoDQoNCiAgV2UgY2VsZWJyYXRlIHR3byByZWxlYXNlcyBvZiBvcGFtLXB1Ymxpc2g6IFsqb3Bh bS1wdWJsaXNoIDIuNi4wKl0NCiAgKFNlcHRlbWJlciAxOSwgMjAyNSkgYW5kIFsqb3BhbS1wdWJs aXNoIDIuNy4wKl0gKE9jdG9iZXIgNywgMjAyNSkuDQoNCiAgVGhlc2UgcmVsZWFzZXMgbWFrZSBp dCBlYXNpZXIgdG8gYXV0b21hdGUgcGFja2FnZSBwdWJsaXNoaW5nLA0KICBwYXJ0aWN1bGFybHkg YmVuZWZpdGluZyBwcm9qZWN0cyB3aXRoIGNvbnRpbnVvdXMgZGVwbG95bWVudCBwaXBlbGluZXMu DQoNCiAgKk1haW50YWluZWQgYnkqOiBSYWphIEJvdWpiZWwgKEByamJvdSwgT0NhbWxQcm8pLCBL YXRlIERlcGxhaXgNCiAgIChAa2l0LXR5LWthdGUsIEFocmVmcykNCg0KDQogIFsqb3BhbS1wdWJs aXNoIDIuNi4wKl0NCiAgPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTA5LTE5LW9w YW0tcHVibGlzaC0yLTYtMD4NCg0KICBbKm9wYW0tcHVibGlzaCAyLjcuMCpdDQogIDxodHRwczov L29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMC0wNy1vcGFtLXB1Ymxpc2gtMi03LTA+DQoNCg0K RWRpdG9yIFRvb2xzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICAq Um9hZG1hcDogW0VkaXQgLyAoVzE5KSBOYXZpZ2F0ZSBDb2RlXSoNCg0KDQpbRWRpdCAvIChXMTkp IE5hdmlnYXRlIENvZGVdDQo8aHR0cHM6Ly9vY2FtbC5vcmcvdG9vbHMvcGxhdGZvcm0tcm9hZG1h cCN3MTktbmF2aWdhdGUtY29kZT4NCg0K4peKIE9DYW1sLUxTUCBTZXJ2ZXIgYW5kIE1lcmxpbg0K DQogIFNlcHRlbWJlciBhbmQgT2N0b2JlciBzYXcgc2lnbmlmaWNhbnQgdXBkYXRlcyB0byBlZGl0 b3Igc3VwcG9ydDoNCg0KDQogIOKXiiBTdGFibGUgUmVsZWFzZXMNCg0KICAgIOKAoiBbKk9DYW1s LUxTUCAxLjI0LjAqXSAoT2N0b2JlciA0LCAyMDI1KTogTWFqb3IgcmVsZWFzZSB3aXRoDQogICAg ICBpbXByb3ZlZCBwcm9qZWN0IG5hdmlnYXRpb24gYW5kIHBlcmZvcm1hbmNlIG9wdGltaXphdGlv bnMNCiAgICDigKIgWypPQ2FtbC1MU1AgMS4yMy4xKl0gKE9jdG9iZXIgMywgMjAyNSk6IEJ1ZyBm aXggcmVsZWFzZQ0KICAgIOKAoiBbKk1lcmxpbiA1LjYtNTAzIGFuZCA1LjYtNTA0Kl0gKE9jdG9i ZXIgNCwgMjAyNSk6IFN1cHBvcnQgZm9yDQogICAgICBPQ2FtbCA1LjMgYW5kIDUuNCB3aXRoIHBl cmZvcm1hbmNlIGltcHJvdmVtZW50cw0KDQoNCiAgICBbKk9DYW1sLUxTUCAxLjI0LjAqXQ0KICAg IDxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMC0wNC1vY2FtbC1sc3AtMTI0MD4N Cg0KICAgIFsqT0NhbWwtTFNQIDEuMjMuMSpdDQogICAgPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5n ZWxvZy8yMDI1LTEwLTAzLW9jYW1sLWxzcC0xMjMxPg0KDQogICAgWypNZXJsaW4gNS42LTUwMyBh bmQgNS42LTUwNCpdDQogICAgPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEwLTA0 LW1lcmxpbi12NTYtNTAzLWFuZC01MDQ+DQoNCg0KICDil4ogRXhwZXJpbWVudGFsOiBNZXJsaW4g d2l0aCBEb21haW5zIGFuZCBFZmZlY3RzDQoNCiAgICBUaGUgW2V4cGVyaW1lbnRhbCBNZXJsaW4g YnJhbmNoIHVzaW5nIGRvbWFpbnMgYW5kIGVmZmVjdHNdIG9mZmVycw0KICAgIHBvdGVudGlhbCBw ZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgdGhyb3VnaCBwYXJhbGxlbGl6YXRpb24uIFRoaXMNCiAg ICBleHBlcmltZW50YWwgdmVyc2lvbiBpcyBhdmFpbGFibGUgZm9yIHRlc3RpbmcgYnV0IG5vdCBy ZWNvbW1lbmRlZA0KICAgIGZvciBwcm9kdWN0aW9uIHVzZS4NCg0KDQogICAgW2V4cGVyaW1lbnRh bCBNZXJsaW4gYnJhbmNoIHVzaW5nIGRvbWFpbnMgYW5kIGVmZmVjdHNdDQogICAgPGh0dHBzOi8v b2NhbWwub3JnL2JhY2tzdGFnZS8yMDI1LTEwLTA4LW1lcmxpbi1kb21haW5zPg0KDQoNCuKXiiBv Y3AtaW5kZW50DQoNCiAgWypvY3AtaW5kZW50IDEuOS4wKl0gKE9jdG9iZXIgMSwgMjAyNSk6IFVw ZGF0ZXMgZm9yIE9DYW1sIDUuNC4wDQogIGNvbXBhdGliaWxpdHkgYW5kIGltcHJvdmVkIGZvcm1h dHRpbmcgcnVsZXMuDQoNCg0KICBbKm9jcC1pbmRlbnQgMS45LjAqXQ0KICA8aHR0cHM6Ly9vY2Ft bC5vcmcvY2hhbmdlbG9nLzIwMjUtMTAtMDEtb2NwLWluZGVudC0xOTA+DQoNCg0K4peKIEV4cGVy aW1lbnRhbDogb2NhbWwubnZpbQ0KDQogIFtUYXJpZGVzIGFubm91bmNlZCBvY2FtbC5udmltXSwg YSBuZXcgTmVvdmltIHBsdWdpbiBmb3IgT0NhbWwNCiAgZGV2ZWxvcG1lbnQuIFRoaXMgZXhwZXJp bWVudGFsIHBsdWdpbiBzZXJ2ZXMgYXMgdGhlIE5lb3ZpbSBjb3VudGVycGFydA0KICB0byBvY2Ft bC1lZ2xvdCwgbGV2ZXJhZ2luZyBMU1AgZm9yIG1vZGVybiBlZGl0b3IgZmVhdHVyZXMuDQoNCiAg Kk9DYW1sIExTUCBTZXJ2ZXIgbWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9v cywgVGFyaWRlcyksDQogICBYYXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwg UnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywNCiAgIEphbmUgU3RyZWV0KQ0KDQogICpNZXJsaW4g bWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksIFhhdmll ciBWYW4NCiAgIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwgTXVsdWggR29kc29uIChAUGl6 aWVEdXN0LCBUYXJpZGVzKSwNCg0KDQogIFtUYXJpZGVzIGFubm91bmNlZCBvY2FtbC5udmltXQ0K ICA8aHR0cHM6Ly9vY2FtbC5vcmcvYmFja3N0YWdlLzIwMjUtMTAtMTQtb2NhbWwtbnZpbS1hLW5l b3ZpbS1wbHVnaW4tZm9yLW9jYW1sPg0KDQoNCkRvY3VtZW50YXRpb24gYW5kIFBQWCBUb29scw0K 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBQcHhsaWINCg0KICBbKlBweGxpYiAwLjM2 LjIqXSAoT2N0b2JlciAxLCAyMDI1KTogQ29tcGF0aWJpbGl0eSB1cGRhdGVzIGZvciBPQ2FtbA0K ICA1LjQuMCBhbmQgZml4ZXMgZm9yIEFTVCBoYW5kbGluZy4NCg0KICAqTWFpbnRhaW5lZCBieSo6 IE5hdGhhbiBSZWJvdXJzIChATmF0aGFuUmViKQ0KDQoNCiAgWypQcHhsaWIgMC4zNi4yKl0gPGh0 dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEwLTAxLXBweGxpYi0wMzYyPg0KDQoNCkdv c3BlbCBFY29zeXN0ZW0gKEV4cGVyaW1lbnRhbCkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIFRoZSBHb3NwZWwgZm9ybWFsIHNwZWNpZmljYXRpb24gZWNvc3lzdGVt IG5vdyBvZmZlcnMgdG9vbHMgZm9yDQogIGV4cGVyaW1lbnRhbCBzcGVjaWZpY2F0aW9uLWRyaXZl biB0ZXN0aW5nLCBhcyBkZXRhaWxlZCBpbiBbIkdvc3BlbA0KICBFY29zeXN0ZW06IFRvb2xzIFJl YWR5IHRvIFRyeSwgTGFuZ3VhZ2UgRXZvbHZpbmciXS4NCg0KICAqQXZhaWxhYmxlIFRvb2xzOioN Cg0KICDigKIgKk9ydGFjL1FDaGVjay1TVE0qIGdlbmVyYXRlcyBwcm9wZXJ0eS1iYXNlZCB0ZXN0 cyBmcm9tIEdvc3BlbA0KICAgICBzcGVjaWZpY2F0aW9ucyB3cml0dGVuIGluIGAubWxpJyBmaWxl cy4gVGhlIHRvb2wgd29uIHRoZSBUQUNBUyAyMDI1DQogICAgIEJlc3QgVG9vbCBQYXBlciBhd2Fy ZCBhbmQgY2FuIGF1dG9tYXRpY2FsbHkgcHJvZHVjZSBjb21wcmVoZW5zaXZlDQogICAgIHRlc3Qg c3VpdGVzIGZyb20gZm9ybWFsIHNwZWNpZmljYXRpb25zLiBXaGlsZSB0aGUgdW5kZXJseWluZyBH b3NwZWwNCiAgICAgbGFuZ3VhZ2Ugc3ludGF4IG1heSBzdGlsbCBjaGFuZ2UsIHRoZSB0ZXN0aW5n IHdvcmtmbG93IGlzIHN0YWJsZQ0KICAgICBlbm91Z2ggZm9yIGV4cGVyaW1lbnRhbCB1c2UgaW4g ZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnRzLg0KDQogICpDdXJyZW50IFN0YXR1czoqDQoNCiAgVGhl IHRvb2xzIHdvcmsgd2VsbCBmb3IgaXNvbGF0ZWQgbW9kdWxlcyB3aGVyZSB5b3UgY2FuIHdyaXRl DQogIHNwZWNpZmljYXRpb25zIGFuZCBnZW5lcmF0ZSB0ZXN0cywgYnV0IHRoZSBHb3NwZWwgbGFu Z3VhZ2UgaXRzZWxmDQogIHJlbWFpbnMgdW5kZXIgYWN0aXZlIGRldmVsb3BtZW50IHdpdGggcG90 ZW50aWFsIGJyZWFraW5nIGNoYW5nZXMNCiAgYWhlYWQuIFRlYW1zIHVzaW5nIHRoZXNlIHRvb2xz IHNob3VsZCBiZSBwcmVwYXJlZCB0byB1cGRhdGUNCiAgc3BlY2lmaWNhdGlvbnMgYXMgdGhlIGxh bmd1YWdlIGV2b2x2ZXMuIFRoaXMgbWFrZXMgdGhlIGVjb3N5c3RlbQ0KICBzdWl0YWJsZSBmb3Ig Z3JlZW5maWVsZCBwcm9qZWN0cywgZXhwZXJpbWVudGFsIGNvZGViYXNlcywgb3INCiAgd2VsbC1p c29sYXRlZCBjb21wb25lbnRzIHdoZXJlIHNwZWNpZmljYXRpb24gY2hhbmdlcyB3b24ndCBjYXNj YWRlDQogIHRocm91Z2ggbGFyZ2Ugc3lzdGVtcy4NCg0KDQpbIkdvc3BlbCBFY29zeXN0ZW06IFRv b2xzIFJlYWR5IHRvIFRyeSwgTGFuZ3VhZ2UgRXZvbHZpbmciXQ0KPGh0dHBzOi8vb2NhbWwub3Jn L2JhY2tzdGFnZS8yMDI1LTEwLTE1LWdvc3BlbC1sYW5ndWFnZS1ldm9sdmluZz4NCg0KDQpQbGF0 Zm9ybSBJbmZyYXN0cnVjdHVyZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKXiiBPQ2FtbCBTZWN1cml0eSBS ZXNwb25zZSBUZWFtDQoNCiAgVGhlIFtlc3RhYmxpc2htZW50IG9mIHRoZSBPQ2FtbCBTZWN1cml0 eSBSZXNwb25zZSBUZWFtXSAoT2N0b2JlciAzLA0KICAyMDI1KSBtYXJrcyBhbiBpbXBvcnRhbnQg c3RlcCBpbiBlY29zeXN0ZW0gbWF0dXJpdHkuIFRoZSB0ZWFtIHdpbGwNCiAgaGFuZGxlIHNlY3Vy aXR5IHZ1bG5lcmFiaWxpdGllcyBmb2xsb3dpbmcgZXN0YWJsaXNoZWQgZGlzY2xvc3VyZQ0KICBw cmFjdGljZXMuDQoNCg0KICBbZXN0YWJsaXNobWVudCBvZiB0aGUgT0NhbWwgU2VjdXJpdHkgUmVz cG9uc2UgVGVhbV0NCiAgPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEwLTAzLXNl Y3VyaXR5LXRlYW0+DQoNCg0K4peKIE9DYW1sLm9yZyBSZW9yZ2FuaXphdGlvbg0KDQogIFRoZSBb bmV3bHkgaW50cm9kdWNlZCBzZXBhcmF0aW9uIG9mIE9DYW1sIENoYW5nZWxvZyBhbmQgQmFja3N0 YWdlDQogIE9DYW1sXSBwcm92aWRlcyBjbGVhcmVyIGNvbW11bmljYXRpb246DQoNCiAg4oCiICpP Q2FtbCBDaGFuZ2Vsb2cqOiBPZmZpY2lhbCBzdGFibGUgcmVsZWFzZXMgYW5kIHByb2R1Y3Rpb24t cmVhZHkNCiAgICAgdXBkYXRlcw0KICDigKIgKkJhY2tzdGFnZSBPQ2FtbCo6IEV4cGVyaW1lbnRh bCByZWxlYXNlcywgd29yay1pbi1wcm9ncmVzcywgYW5kDQogICAgIGRldmVsb3BtZW50IG9wcG9y dHVuaXRpZXMNCg0KICBUaGlzIGhlbHBzIHJlYWRlcnMgZGlzdGluZ3Vpc2ggbW9yZSBlYXNpbHkg YmV0d2VlbiB3aGF0J3MgcmVhZHkgZm9yDQogIHByb2R1Y3Rpb24gdXNlIGFuZCB3aGF0J3Mgc3Rp bGwgZXhwZXJpbWVudGFsLg0KDQoNCiAgW25ld2x5IGludHJvZHVjZWQgc2VwYXJhdGlvbiBvZiBP Q2FtbCBDaGFuZ2Vsb2cgYW5kIEJhY2tzdGFnZSBPQ2FtbF0NCiAgPGh0dHBzOi8vb2NhbWwub3Jn L2NoYW5nZWxvZy8yMDI1LTEwLTA4LWludHJvZHVjaW5nLWJhY2tzdGFnZS1vY2FtbD4NCg0KDQpD b21tdW5pdHkgRXZlbnRzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0K4peKIEZVTiBPQ2FtbCAyMDI1DQoNCiAgVGhlIEZVTiBPQ2FtbCBjb25mZXJl bmNlIHRvb2sgcGxhY2Ugb24gKlNlcHRlbWJlciAxNS0xNiwgMjAyNSogaW4NCiAgV2Fyc2F3LCBQ b2xhbmQsIGZlYXR1cmluZyB0YWxrcyBvbiBwcmFjdGljYWwgT0NhbWwgZGV2ZWxvcG1lbnQsDQog IGluZHVzdHJ5IGFwcGxpY2F0aW9ucywgYW5kIGNvbW11bml0eSBwcm9qZWN0cy4gVGhlIFtGVU4g T0NhbWwgMjAyNQ0KICBwcm9ncmFtIGFuZCBzcGVha2VyIGxpbmV1cF0gc2hvd2Nhc2VzIHRoZSBk aXZlcnNlIGVjb3N5c3RlbSBvZiBPQ2FtbA0KICBpbiBwcm9kdWN0aW9uLiBWaWRlbyByZWNvcmRp bmdzIG9mIGFsbCBwcmVzZW50YXRpb25zIHdpbGwgYmUgYXZhaWxhYmxlDQogIHNvb24gZm9yIHRo b3NlIHdobyBjb3VsZG4ndCBhdHRlbmQgaW4gcGVyc29uLg0KDQoNCiAgW0ZVTiBPQ2FtbCAyMDI1 IHByb2dyYW0gYW5kIHNwZWFrZXIgbGluZXVwXQ0KICA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tLzIw MjUvPg0KDQoNCuKXiiBPQ2FtbCBXb3Jrc2hvcCAyMDI1DQoNCiAgVGhlIE9DYW1sIFVzZXJzIGFu ZCBEZXZlbG9wZXJzIFdvcmtzaG9wIHdhcyBoZWxkIG9uICpPY3RvYmVyIDE3LCAyMDI1Kg0KICBp biBTaW5nYXBvcmUsIGNvLWxvY2F0ZWQgd2l0aCBJQ0ZQL1NQTEFTSCwgYnJpbmdpbmcgdG9nZXRo ZXINCiAgcmVzZWFyY2hlcnMgYW5kIHByYWN0aXRpb25lcnMuIFlvdSBjYW4gZmluZCB0aGUgbGlz dCBvZiBwcmVzZW50YXRpb25zDQogIGFuZCBhIGxpbmsgdG8gdGhlIHZpZGVvIHJlY29yZGluZ3Mg b24gW3RoZSBPQ2FtbCBXb3Jrc2hvcCAyMDI1IHBhZ2Ugb24NCiAgT0NhbWwub3JnXSENCg0KICDi gJQNCg0KICBXZSdyZSBwbGVhc2VkIHRvIHNlZSB0aGUgc3VjY2Vzc2Z1bCByZWxlYXNlIG9mIE9D YW1sIDUuNC4wLCBtYXJraW5nIGENCiAgc2lnbmlmaWNhbnQgbWlsZXN0b25lIHdpdGggbGFiZWxs ZWQgdHVwbGVzLCBpbW11dGFibGUgYXJyYXlzLCBhbmQNCiAgYXRvbWljIGZpZWxkcy4gVGhlIGVz dGFibGlzaG1lbnQgb2YgdGhlIFNlY3VyaXR5IFJlc3BvbnNlIFRlYW0gYW5kIHRoZQ0KICByZW9y Z2FuaXphdGlvbiBvZiBPQ2FtbC5vcmcgZGVtb25zdHJhdGUgdGhlIGVjb3N5c3RlbSdzIGdyb3dp bmcNCiAgbWF0dXJpdHkuDQoNCiAgVGhlIGNsZWFyIHNlcGFyYXRpb24gYmV0d2VlbiBzdGFibGUg cmVsZWFzZXMgYW5kIGV4cGVyaW1lbnRhbCB3b3JrDQogIGhlbHBzIHRoZSBjb21tdW5pdHkgbWFr ZSBpbmZvcm1lZCBkZWNpc2lvbnMgYWJvdXQgdG9vbCBhZG9wdGlvbi4gV2hpbGUNCiAgZXhwZXJp bWVudGFsIGZlYXR1cmVzIGluIHRoZSBEdW5lIERldmVsb3BlciBQcmV2aWV3LCBvY2FtbC5udmlt LCBhbmQNCiAgR29zcGVsIGVjb3N5c3RlbSBzaG93IHByb21pc2luZyBkaXJlY3Rpb25zLCB0aGV5 IHJlbWFpbiBpbiB0ZXN0aW5nIGFuZA0KICBzaG91bGQgbm90IGJlIHVzZWQgaW4gcHJvZHVjdGlv bi4NCg0KICBBcyBhbHdheXMsIHdlIGVuY291cmFnZSBmZWVkYmFjayBhbmQgY29udHJpYnV0aW9u cyBmcm9tIHRoZSBjb21tdW5pdHkNCiAgYXMgd2UgY29udGludWUgdG8gaW1wcm92ZSB0aGUgT0Nh bWwgUGxhdGZvcm0gZWNvc3lzdGVtLg0KDQoNCiAgW3RoZSBPQ2FtbCBXb3Jrc2hvcCAyMDI1IHBh Z2Ugb24gT0NhbWwub3JnXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY29uZmVyZW5jZXMvb2NhbWwt d29ya3Nob3AtMjAyNT4NCg0KDQpEZW1vbnN0cmF0aW9uIG9mIHRoZSBleHRlbnNpb24gbGl0ZXJh bHMgYW5kIGNvbnN0YW50IHJld3JpdGluZyBmZWF0dXJlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9kZW1vbnN0cmF0aW9uLW9mLXRoZS1leHRlbnNpb24tbGl0ZXJhbHMtYW5kLWNv bnN0YW50LXJld3JpdGluZy1mZWF0dXJlcy8xNzQ2Ni8xPg0KDQoNCk1pa2hhaWwgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBZbyEgOnlveW86IDp3YXZpbmdfaGFuZDoNCg0KICBJIHN0YXJ0ZWQgbGVhcm5pbmcgdGhlIGJl YXV0aWZ1bCBbcHB4bGliXSBsaWJyYXJ5IGFuZCBmb3VuZA0KICBpbnRlcmVzdGluZyBpbmZvcm1h dGlvbiBpbiB0aGVpciBkb2N1bWVudGF0aW9uIGFib3V0IE9DYW1sJ3Mgc3ludGF4DQogIGZlYXR1 cmVzLCBzdWNoIGFzIGV4dGVuc2lvbiBsaXRlcmFscyAtIHRoZSBhYmlsaXR5IHRvIGFwcGVuZCBh DQogIG9uZS1sZXR0ZXIgaWRlbnRpZmllciB0byBudW1lcmljIGxpdGVyYWxzLiBJIHdhcyBzdXJw cmlzZWQgYXQgaG93IGVhc3kNCiAgaXQgd2FzIHRvIGRvIHRoaXMuDQoNCiAgQmVjYXVzZSBJIHdh cyBpbnNwaXJlZCBieSB0aGlzLCBJIHdyb3RlIGEgZGVtb25zdHJhdGlvbiBwcm9qZWN0DQogIChs b2NhdGVkIGluIG15IFtHaXRIdWIgcmVwb3NpdG9yeV0pIHRvIHNob3cgaG93IHRvIHVzZSBpdCB0 byBpbXBsZW1lbnQNCiAgbWV0cmljIHN5c3RlbSBzdXBwb3J0IGluIGNvZGUuDQoNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiB1dG9wICMgNW07OyANCiAg4pSCIC0gOiBNZXRyaWMuTWV0ZXIudCA9 IDUNCiAg4pSCIA0KICDilIIgdXRvcCAjIE1ldHJpYy5NZXRlci4oMW0gKyAxMG0pOzsNCiAg4pSC IC0gOiBNZXRyaWMuTWV0ZXIudCA9IDExDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFJlZmVyZW5j ZXM6DQogIOKAoiBPQ2FtbCDigJMgTGFuZ3VhZ2UgZXh0ZW5zaW9ucyDigJMgW0V4dGVuc2lvbiBs aXRlcmFsc10NCiAg4oCiIFBweGxpYiDigJMgQ29udGV4dC1mcmVlIHRyYW5zZm9ybWF0aW9uIOKA kyBbQ29uc3RhbnQgUmV3cml0aW5nXSgpDQoNCg0KW3BweGxpYl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC1wcHgvcHB4bGliPg0KDQpbR2l0SHViIHJlcG9zaXRvcnldIDxodHRwczovL2dpdGh1 Yi5jb20vZHgzbW9kL21ldHJpY19zeW50YXg+DQoNCltFeHRlbnNpb24gbGl0ZXJhbHNdDQo8aHR0 cHM6Ly9vY2FtbC5vcmcvbWFudWFsLzUuNC9leHRlbnNpb25zeW50YXguaHRtbCNzczpleHRlbnNp b24tbGl0ZXJhbHM+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYg eW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5k IEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2 ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNv IHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJl DQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1l IGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0 aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBm ZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3 bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8v Y2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 04 to 11, 20= 25.

    Opam-repository, signed! conex is in beta now :)

    Hannes Mehnert announced

    Dear everyone,

    we=E2=80=99re proud to announce that conex, in an initial version, is now l= ive! You can receive signed updates of the opam-repository. A quick guide:

    To setup opam with conex on your machine, you need to install conex (and/or= conex-mirage-crypto, see below) - currently only available as opam package= (sorry about the bootstrap problem - hopefully it will be integrated into = opam at some time).

    Then, in your =E2=80=9C\~/.opam/config=E2=80=9D you need to specify the repository-validation-command:

    repository-validation-command: [
      "/path/to/conex_verify_mirage_crypto"
      "--quorum=3D%{quorum}%"
      "--trust-anchors=3D%{anchors}%"
      "--repository=3D%{repo}%" {incremental}
      "--dir=3D%{dir}%" {!incremental}
      "--patch=3D%{patch}%" {incremental}
      "--incremental" {incremental}
    ]
    

    Instead of =E2=80=9Cconex_verify_mirage_crypto=E2=80=9D, you can as well us= e =E2=80=9Cconex_verify_openssl=E2=80=9D (fewer dependencies, calls out to = OpenSSL as the cryptographic provider, is slower).

    Then you can run opam repo add conex-robur https://conex.robur.coop 1= sha256=3Dad5eb0e4a77abfbc6c1bb5661eba46049404e0222588dd059c87f12436d41a28<= /code>. Thereafter you can opam repo remove default, and then = you=E2=80=99re only using signed metadata. The =E2=80=9C1=E2=80=9D is the q= uorum of root keys for signatures to be valid, the =E2=80=9Csha256=3Dad5eb0= e4a77abfbc6c1bb5661eba46049404e0222588dd059c87f12436d41a28=E2=80=9D is the = hash of the public root key.

    Read the full article at https://hannes.robur.coop/Posts/ConexRunning =E2=80=93 happy to = receive feedback.

    The development of conex is supported by the OCaml Software Foundation and by ah= refs.

    OCaml Platform Newsletter: September to October 2025

    Sabine Schmaltz announced

    Welcome to the sixteenth edition of the OCaml Platform newsletter!

    In this September to October 2025 edition, we are excited to bring you the = latest on the OCaml Platform, continuing our tradition of highlighting rece= nt developments as seen in previous editions. To understand the direction we're head= ed, especially regarding development workflows and user experience improvem= ents, check out our roa= dmap.

    You can subscribe to this newsletter on LinkedIn!

    Highlights:

    • OCaml 5.4.0 Released: Major stable release featuring labelled tu= ples, immutable arrays, unified array literal syntax, atomic record fields,= and four new standard library modules
    • Security Response Team Established: New team formed to handle se= curity vulnerabilities in the OCaml ecosystem
    • Enhanced Editor Support: OCaml-LSP 1.24.0 and Merlin 5.6 bring i= mproved project navigation and performance optimizations
    • OCaml.org Reorganization: Clear separation between news about pr= oduction-ready features and releases (OCaml Changelog) and ongoing work and= experimental features (Backstage OCaml)
    • Experimental Tools Progress: Gospel ecosystem tools ready for te= sting, new ocaml.nvim plugin for Neovim users, and experimental Merlin bran= ch using domains and effects

    OCaml Changelog:

    Backstage OCaml:

    Stable Releases:

    Unstable Releases:

    OCaml Compiler

    • OCaml 5.4.0 Stable Release

      The October 9,= 2025 release of OCaml 5.4.0 represents a major milestone with signific= ant language enhancements. After two beta releases and a release candidate = in September, the stable version delivers:

      Language Features:

      • Labelled tuples: Enable better documentation and type safety with la= bels on tuple fields

        let ( * ) (x,~dx) (y,~dx:dy) =3D x*.y, ~dx:(x *. dy +. y *. dx)
        
      • Immutable arrays ('a iarray): Covariant arrays for = safer concurrent programming
      • Unified array literal syntax: [| ... |] now works f= or 'a array, 'a iarray, and floatarray
      • Atomic record fields: New [@atomic] attribute with = Atomic.Loc submodule for lock-free concurrent access

      Standard Library Additions:

      • Pair: Utility functions for pairs
      • Pqueue: Priority queue implementation
      • Repr: Explicit functions for physical equality and compari= son
      • Iarray: Operations on immutable arrays

      Runtime Improvements:

      • Frame pointers support for ARM64 (Linux and macOS)
      • Performance fix for Apple Silicon (using stlr instead of <= code>dmb ishld; str)
      • Software prefetching for ARM64, s390x, PPC64, and RISC-V
      • Restored "memory cleanup upon exit" mode

      The Sept= ember beta releases and release candidate demonstrated the maturity of the re= lease, with only minor TSAN and metadata fixes needed.

    • WIP: Relocatable OCaml

      Work on Relocatable OCaml is progressing toward inclusion in OCaml 5= .5, with implementation PRs opened by David Allsopp in September. The chang= es are undergoing review from Samuel Hym, Jonah Beckford, and others.

      What Relocatable OCaml Enables:

      This feature allows the OCaml compiler and its associated tools to be moved= to different filesystem locations after installation without breaking func= tionality. Key benefits include:

      • Binary distributions that work regardless of installation path
      • Improved flexibility for package managers organizing OCaml installation= s
      • Bundling of specific OCaml versions by developer tools without path con= flicts
      • Simplified cross-platform distribution

      Current Status:

      The implementation is in active review with ongoing responses to feedback. = The core development team is likely to review the changes at an upcoming me= eting, targeting inclusion in OCaml 5.5.

      For technical details about the implementation approach and its implication= s for the ecosystem, see David Allsopp's blog post on Relocatable OCa= ml and the associated Discuss thread.

    Build System

    • Dune

      Dune 3.20.2= (September 10, 2025) provides bug fixes and stability improvements for the= 3.20 series.

      • Experimental: Dune Package Management

        We keep exploring:

        • Portable External Dependencies: An approach for storing system p= ackage dependencies in a platform-agnostic format, allowing projects to mai= ntain a single specification that resolves correctly across Linux, macOS, a= nd Windows environments, ensuring consistent builds regardless of platform-= specific package naming and versioning differences.
        • Portable Lock Directories: Lock directories that work consistent= ly across different operating systems and architectures, addressing the cur= rent limitation where platform-specific dependency resolutions prevent team= s from sharing lock files through version control in heterogeneous developm= ent environments.
        • Lock Directories as Build Targets: Currently, the solver that co= mes up with a set of compatible dependencies needs to be run by the user ex= plicitely (using dune pkg lock), but in the future we intend t= o create build plans implicitly via Dune build rules. This should make make= package management simpler to use as it requires fewer user actions and do= es not require putting verbose lock directories into the project source dir= ectories. This change also paves the way for automatic relocking when depen= dencies change, including in watch mode.

        These features remain under active development and should not be relied on = in production. However, we encourage cautious adoption of Dune Package Mana= gement itself for users comfortable with bleeding-edge tools that may still= change. Dune package management is available in the stable release of Dune= , as an experimental feature.

        Dune Maintained by: Rudi Grinberg (@rgrinberg, Jane Street), Nicol= =C3=A1s Ojeda B=C3=A4r (@nojb, LexiFi), Marek Kubica (@Leonidas-from-XIV, T= arides), Ali Caglayan (@Alizter, Tarides), Etienne Millon (@emillon), Steph= en Sherratt (@gridbugs, Tarides), Antonio Nuno Monteiro (@anmonteiro), Etie= nne Marais (@maiste)

    Package Management

    • opam-publish

      We celebrate two releases of opam-publish: opam-publish 2.6.0 (Septem= ber 19, 2025) and opam-publish 2.7.0 (October 7, 2025).

      These releases make it easier to automate package publishing, particularly = benefiting projects with continuous deployment pipelines.

      Maintained by: Raja Boujbel (@rjbou, OCamlPro), Kate Deplaix (@kit-t= y-kate, Ahrefs)

    Editor Tools

    • OCaml-LSP Server and Merlin

      September and October saw significant updates to editor support:

    • ocp-indent

      ocp-in= dent 1.9.0 (October 1, 2025): Updates for OCaml 5.4.0 compatibility= and improved formatting rules.

    • Experimental: ocaml.nvim

      Tarides announced ocaml.nvim, a new Neovim plugin for OCam= l development. This experimental plugin serves as the Neovim counterpart to= ocaml-eglot, leveraging LSP for modern editor features.

      OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

      Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides), Muluh Godson (@PizieDust, Tarides),

    Documentation and PPX Tools

    • Ppxlib

      Ppxlib 0.= 36.2 (October 1, 2025): Compatibility updates for OCaml 5.4.0 and f= ixes for AST handling.

      Maintained by: Nathan Rebours (@NathanReb)

    Gospel Ecosystem (Experimental)

    The Gospel formal specification ecosystem now offers tools for experimental= specification-driven testing, as detailed in "Gospel Ecosystem: Tools Rea= dy to Try, Language Evolving".

    Available Tools:

    • Ortac/QCheck-STM generates property-based tests from Gospel spec= ifications written in .mli files. The tool won the TACAS 2025 = Best Tool Paper award and can automatically produce comprehensive test suit= es from formal specifications. While the underlying Gospel language syntax = may still change, the testing workflow is stable enough for experimental us= e in development environments.

    Current Status:

    The tools work well for isolated modules where you can write specifications= and generate tests, but the Gospel language itself remains under active de= velopment with potential breaking changes ahead. Teams using these tools sh= ould be prepared to update specifications as the language evolves. This mak= es the ecosystem suitable for greenfield projects, experimental codebases, = or well-isolated components where specification changes won't cascade throu= gh large systems.

    Community Events

    • FUN OCaml 2025

      The FUN OCaml conference took place on September 15-16, 2025 in Wars= aw, Poland, featuring talks on practical OCaml development, industry applic= ations, and community projects. The FUN OCaml 2025 program and speaker lineup showcases the diverse ecosys= tem of OCaml in production. Video recordings of all presentations will be a= vailable soon for those who couldn't attend in person.

    • OCaml Workshop 2025

      The OCaml Users and Developers Workshop was held on October 17, 2025= in Singapore, co-located with ICFP/SPLASH, bringing together researchers a= nd practitioners. You can find the list of presentations and a link to the = video recordings on the OCaml Workshop 2025 page on OCaml.org!

      We're pleased to see the successful release of OCaml 5.4.0, marking a signi= ficant milestone with labelled tuples, immutable arrays, and atomic fields.= The establishment of the Security Response Team and the reorganization of = OCaml.org demonstrate the ecosystem's growing maturity.

      The clear separation between stable releases and experimental work helps th= e community make informed decisions about tool adoption. While experimental= features in the Dune Developer Preview, ocaml.nvim, and Gospel ecosystem s= how promising directions, they remain in testing and should not be used in = production.

      As always, we encourage feedback and contributions from the community as we= continue to improve the OCaml Platform ecosystem.

    Demonstration of the extension literals and constant rewriting= features

    Mikhail announced

    Yo! :yoyo: :waving_hand:=20

    I started learning the beautiful ppxlib library and found interesting information in their documen= tation about OCaml's syntax features, such as extension literals - the abil= ity to append a one-letter identifier to numeric literals. I was surprised = at how easy it was to do this.

    Because I was inspired by this, I wrote a demonstration project (located in= my GitHub repository) to show how to use it to implement metric system support in code.

    utop # 5m;;=20
    - : Metric.Meter.=
    t =3D 5
    
    utop # Metric.Meter.(1m + 10m);;
    - : Metric.Meter.=
    t =3D 11
    

    References:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Hlv7Vrzt; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=fUzCsqQt; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 6157A400B1 for ; Tue, 18 Nov 2025 14:01:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=omaqWvjVoKdMHzYQNa0awvdFKwSOvsY5W56aSiGxzq0=; b=Hlv7VrztHhIj79egwuCufRWvyWQoW1v11wF6oE8+kbJnLoMQe3jzoC64 TyoKsQQFXK9zZ8S/PhHaLoH8X1FrzRwYq6sBlAfwLdkmmBgBmx2S5/Zaw X3A95uu0ILSH6j5P9M+7jKbUWmzuEfi8hTqU3INUCAQXEdRPNzF4mFGx6 U=; X-CSE-ConnectionGUID: tQT1pmteRHKKUY8nbHq85g== X-CSE-MsgGUID: 9EKGfLN7RbSU2su9EXJvoA== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.19,314,1754949600"; d="scan'208,217";a="249829476" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 18 Nov 2025 15:01:05 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B8C18E0171; Tue, 18 Nov 2025 15:01:05 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id B3EFDE0171 for ; Tue, 18 Nov 2025 15:01:03 +0100 (CET) X-CSE-ConnectionGUID: 3mVAUfaBSdqujc9BXAbsCQ== X-CSE-MsgGUID: fLamE/qzSnecbrHhUiE3Lw== IronPort-SDR: 691c7c1d_JUp14sHAgpDoKy57FZEZ/eVtI7NDP3JVHbFHO9c+2ZjKrv3 luqYhV/fZbHtvFw6rF/PEunZCMxQol2o+WJXchQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HsAQArexxphSIeaIFaHAEBAQEBAQcBARIBAQQEAQGCE?= =?us-ascii?q?IE9gQMZAWheMwcISQOEUoNPCIs9gmCRTYhLgjCDFRYjFQEDAQ0uARUKAQIEA?= =?us-ascii?q?QEDAQIBggyCLkYCjFsCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBA?= =?us-ascii?q?QECAQECBAYBAhABAQEBQEmGFQgyDYJFGThxXgMEAwY3AQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAEwBwtcCQoTAQE4G?= =?us-ascii?q?BYNAwoBCQEGAwIRATUDARMBEhqCaAGCIAICTwMFDAaTEZtMeoEygQGCDAEBB?= =?us-ascii?q?oEIPgMLAgIDAQ4JJQHaDIFkAwaBSoVugkobAQUlSWsChEkJhDICJw+BVUSBF?= =?us-ascii?q?TWCRG+BfkwXAQEBAQEXgSQBAQgCNg0JEgKDEYJpgR+BB3oUHYYKeIFbHocxB?= =?us-ascii?q?oE+QIZ9gURLMywBVRMXCwcFW4EIAyo0LW4yHYEkQRhxgRSDSQ8TaA8GgRKDU?= =?us-ascii?q?YkfD4oqAwttPTcUG5RuQhksJYE7JQ4LMwIVJxwIGhMcDgIiNggRCgoEAw8VB?= =?us-ascii?q?B0JCgQFFgEPHwsLAgQYFJJOCSgFJQOPWY4Yk1mBCjQHhB+BXgYMiQiBJowdg?= =?us-ascii?q?W+HeoQEjROHApJSIphkIoI2hycKgRwJgW9rlWAED4VGgX8jgSsBGwIMBzMaM?= =?us-ascii?q?EOCMwEBATEJCgwwHA+MLoFzDRWBZoFQKIE+gQyCDju9aEI1AgEBBjICBwEKA?= =?us-ascii?q?QEDCYViAQFpix4BJgyBSwEB?= IronPort-PHdr: A9a23:UefFYBcI8aa2pqOsCTzGM/aelGM+ztDLVj580XLHo4xHfqnrxZn+J kuXvawr0ASSG92HoKge0raG++C4ACpcus3H6CtDOLV3FDY7yuwu1zQ6B8CEDUCpZNXLVAcdW OlkahpO0kr/D3JoHt3jbUbZuHy44G1aMBz+MQ1oOra9QdaK3Iy42O+o5pLcfRhDiiajbrNuN hW2qhjautULjYd4Jas8xBXErmFUd+lZym9kO0yfkwvz68qz4ZVv9zhct+87+8NPX6j3cb40Q aBWATgjLms4+NDluR7fQASA4XcRTn8YmQdSDQjf6xH6UJbxsi/kued4xSKXI874Q60qVDq79 6tlRwfmhygeOzMn/2/Zl9R8g61Hrh2voRx/2JPUb5qONPViZKPdfMgVSnRHU81MSiFOGIK8b 48ID+ocIeZVqpT2qlUSoReiAwSnGePjxDxOhn/o3K06yOUhHhrC3AM+AtkPvnPUrM/oO6cJT Ou5yKfFwSnGY/5QxDzz6pXHcgo5rP+MQ7x+bMTfx0ogGAzZlVifs5DpMimP2+gRr2SW7extX v+vhW49rAFxpyCiy9soiobTgIIe103K+jl5wIYwJN24VFJ7asOjHZRKsyGVLY12Ttk5Q250u CY6z7wGuYKnfCUR0JQnwBrfavybc4eW/h3jVOCRITZhhHJ4Zr2znRGy8VKvyuDlUMS/zVlFo DZfnNbWqnANywLc6tKBSvZl8UqsxziC2Q/d5+xLPU04iLbXJoAhz7M+l5cev0fOECH4lkj5k KOYeUUp9Oem5urobLvrpYGQO5Johgz+PakjmsqyCvk2PAgJWmiU4+W81Lv78E3hXrpKkvw2k rXHv5DCIsQbo6u5DBFP3oYl9Rm/Ey+q0NMEknYdKVJFfAiLj4/zO1HBOPz4Ava/g0iskDd23 P/KJKHuApLILnTbkbfhe61961JGxwo3ydBT/YlUCrEZLP3pXk/xtcDXAQElPAOuxubnDM9x1 oQEWWKAGqOYMKTSsUKU5uIyOOaDepUZtyr6K/gg//Lhk2U5mUUHcqm13JsXcW24Eep8L0qFY XrgmtkAEWYJvgo/VOzllkCNUT9JaHqoWKI8/D47BJqkDYfEWI+thKaN3CamEZFOaWFKEEyDE XDtd4mcWvcMbTidIsl8nTweT7etUZUu1RC2uADn1bVnMOvU9TEGup751dh14ePTlRYq+TxuC MSdyH2CT2BpkWMVXD86xrxwoUt4ylub0Kh4heZYFd1J6P9TXAc6L5jRxPF5BdDqQg/NY8mFR VK8Ttm7HT08Qcg9ztESb0pnFdivgQjP0zekDrMIjbCHGpw5/63G03TvOspx0WjK2aYlglQgX 8BBL3ephrRl+AjWH4PJk1uWl6KtdakE2S7M+3qPwXCWvEFfVA5xUbnFUm4DaUvWq9T551rCT 6KwBrg9NQtB08GCJrNLat3vk1pGWO/uNMnAb2+1gWu8GAqEy7yWYIfkZ2kRxivQBUccnwAW5 3mGNAw+Bim7o2LZCTxjDU/hbV/x/+VisH60QUo0wQSWY0B517e55AYYheSbS/MX3rMEpDkup Cl0HFa73tLWEseAqBR7cKVbe9M9709K2njdtwNnOJysNbtiiUIecwRyvkPuywl3B55bnsgts XMqyhZ9JryD0F9bcjOV0p/xNqfQKmno8xCjc7TW1U3G0NaK5qcP7+w1pEn5swGsEkou6nFn0 9hO03uA/ZjKFwoTUZfpUkkt7RR6prfaYjM854zOz3FsP7O0vifE290yHOQl0Aqvf89DMKOYE w//C9AWC9ChKOM0nFinbQgKMfhS+qAoJ8+mbeWJ2LCoMuh6hD+miGtG7J1n3kKU8Cp8Tu7J3 4obzP6E3guHUTb8jE68ss/pg4xEYisSHmWnxSf5B45RZ6hycJ4TB2mhLcK52MlwioLrVXJA6 VGjAkkJ2NW1dheKd1LzxBVe20sPrXy8gSu4wSR5nSs1o6SCwSLC2//idAIJOmFTRGltk1PsI Y+sgt4AQEWmchUnx1OZ4hOww7dd7uwrK3bVaUNXeW7wIn00FuO7v7+GJspO848AsCNNUe36b 0rJZKT6pk4z1yrlV1BVxDU6ay3i7pz9lho8k2mdKXdvsFLBfsVh2RrU5NrdXONcmD0cS38r2 nHsGlGgMozxrp2vnJDZv7XlDwpJN7VWeCjvlsabsTejoHZtGVu5luyyndvuFU471zX63p9kT 3aAtw7yN6/s0anyKud7Zg9wHlap4s5zHMdlmYs1hY0M8WAdgoSJ8HEHl2bqLNgd3rjxPzIWX TBe+9fO+0D+3VF7aHeAxob3THKYl/BbXIHvXGY1gndgtZVSD6OF8LFPnS10u0e16wXLbq10m j4bj+Al6Hsbn/0hsg0wyC6QGfYXQVkeOjbjxFyT997rlKxMfy60dKSokkpzmdf0FLaZvgRVQ 2r0YL8nDXY29sJ7IU7B233165j5dZ/Xd917WgS8tRDGgqAVLZswkqFPni97ISfmumVjzecnj Bto1JX8vY6dKmwr8rjrShhffib4Yc8e4FSPxe5Xg9qW0oazH55gBiRDXZ3mSuitGS4TsvKvP hiHETk1oHOWUbTFGgrX5EBjpnPJW5elUhPfbHAdxNMkXxKdIU1DnCgMWzErgpMyFgar3dHsN kBj6XFZ51L1rAdN1vM9LwP2AQK97E+jbjY5ToTaLQIDt1sToR6NbYrFtqQoQ3I9nNXptgGGJ 22Fah4dCGgIXhfBHFX/Jvy14sGG9eGEB+24Jv+IYLOUqOUYWe3boPDnmoZg4TuIMd2Ce3d4C PhukHF5ZigsJcH6w2BSEXkPkCbcc8OQpBG94zB66Mel/6HiXAvpo5CEC75TLclH8Rerh6yOL KiV2DY/LixXnMBppzeA2P0E0Vgehjs7PTCpGLJGriXNSaPMhodPCBoKdy54NM1J9r8xmA5XN oSI77G9nq49hfkzBVBfUFXnkcz8fs0GLVa2M1bfDVqKPrCLTdHS6/n+erj0CbhZjeEP8ga1p S7eCEj7eDKKizjuURmrd+BKliCSehJE6smxdRNkCG6rS9yDCFXzC+VM1WgIxJ5s0y6QYHYbN SlgfkhNqLyJ8C4ehe9wTmVF53wjNuKEnieF88HSLYsQuvZwRCEoh6Rd+ntfqfMd4CxfRfNzk TfftZY3+QDgy7HTjGE/FkES4j9QzJqGp0BjJbnU+tFbVHDI8QhMiAfYQxUGqt15C8H+7qVZy 9zBjqX2e39J99PZ+9dZBtCBcZjWdiN5bVyyQHiPUFhgL3bjL2zUik1DnevH83SUqsN/sZ3wg N8VTacdUlUpF/QcA0AjHdoYIZ4xUCl39NzTxMMO+3e6qwHcActAuZWSHMmoOq26FjO61ewZP U4QxrfpMYkYNov6wlFvLF5gk9HDH0PWG8tGoihgchMcqkJQ9nNzVSs2h1KjbRmiqix2d7b8j lsthw1ybP54vgzW2A9iGF/p/H5tyhwpntH0nT2acDjwNbq9G4ZMBH/9s0E3dIjwQwN0cRGal 0t5MjzJXPRU06smcnpkwly529MHCbtXSqtKZwUVzPecaqAz0FhSnS6gwFdO+erPDZYx3Btva 5OnqGhMnh5ydNNgb7KFP7JHlxID48DG9j/tzO06xxUSYloA4H/HMjBdo1QGb/FlJjL0rLU2u Erbw2cFIzBKDKZi4fNyqhFkYbXGlnq8leUbbBvsUo7XZ+CYozSSxJfOGwlpkB1S0RAdovA10 N99IRDMDxl9kOKdT0YAZ5XLJFwHPZReqyiBJn3r062FgpNtYdfnTrixH7PXuP5G2xD1QAokT dZTtZoNTMbwjxmQaM7jKPRtJQwF3A3wPx3FCf1IfEnOizIbu4Sky4cx24BBJzYbCGE7MCOt5 7+RqBV4yPaEWd43ZD8dUO5mfjouX9amnidCo3laJDyni6QBzwyT8zL3piLRFSTxKd15a7+Ya AhtB9e/5Tgku/Hs2BiOqsmYfDm8bogqs8Sqi6tSv5udDvJIUbRx+1zRnYVVXT3iUmLCF8K0O 4mla4Qoao+8AXK7X1qjzjMtGp6rbZD0dvTO2lmuHtoH1evTlCouPsK8CDwEThJ5puVYobl5e RVGeJ0jJxjhqwU5MaW7ZgaeyNSnBWi3el40B7FSy/u3Y7tPwm8idOi/nTEbdKpimtey0hZYG ctflhba1OqubIlYUDHuFzpaYQqarC4wkS56PeY3w/sj6BnPrF8XPivNcbB5LmtesJtvYDHaa WUzEWc+S1KG2MDb5RWw2rkJ4yZHt9NEiKtdt3zvopLUYDStQbGm75LPvGBzCLpu6700OovlL MycsZrYlTGKV5jcvDqOVyuiHuZbkNxdc2pIBeNFkmY/NYkaqJJMvAAvA9wmKeUFW8xO7vi6L CBpBikIwWoFWpOciXYc1/yk1eKSn1/VeZAmenTsUb1HkoJbSylycz8Tr6+lVpzLmimDUGdZe W/7CCxU4wYRioJ7fubk+ZfFCphWxGwOyxqbeiHMC59j+kC9Tz2Gx1/iR6f4+9E= IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:6B5VoK+S7dpg2Ff1CPhuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: 9a23:F7WHL2BQ8FrDKvr6E3JiymcpFMkPSXHE0XXbcmWIIGxyY4TAHA== X-Talos-MUID: =?us-ascii?q?9a23=3AtZ2S8Q/bPAFUl/Y66krzihOQf8lM6qGDT1kfqpM?= =?us-ascii?q?LsMOeFSxNOhrGqCviFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.19,314,1754949600"; d="scan'208,217";a="131192113" X-MGA-submission: =?us-ascii?q?MDEI+a2QYqescI2f72Yu14QFxEkMNXataSGa5U?= =?us-ascii?q?ZSCmGow9GIWFOliVAZL5PxtqBLZqK2ecsOBIW5csV/2x2iODfLIql4bn?= =?us-ascii?q?f0PBp9vQoP9FhGecc1Gt4ho7y+FqVovHjg+wcJdcTnvt/ohZifmamBdS?= =?us-ascii?q?bvCu9oAaCaUQp9PQgV1Kb0Jw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 18 Nov 2025 15:01:01 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 322091A3CD; Tue, 18 Nov 2025 15:01:01 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1763474461; bh=UnErdcGxAL8uARf54lZuJRatO4EJeB317AVZT1JboPc=; h=From:To:Subject:Date:Message-ID; b=fUzCsqQtMkzbyMdt8Zxl1YHvWfHmtDd8M8BDSgIjHmCAkp/T0q5yrspWmHtV+hd+G iFG0dleXoi4J9pIB0XYKyAGnHLLtKT90Mhe3+vbxfRgdxt691pB+zY/Gc52ADjJnfb xJtwnFbc9uD9sy+iKB+Z+41S33SU+b+QartYWOjs= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 18 Nov 2025 15:01:00 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 18 15:01:01 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.491425, queueID=584921A3EB X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19403 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 11 to 18, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 opam 2.5.0~beta1 Announcing the first release of Alice, a radical OCaml build system First release of ppx_deriving_jsont crypt 2.0 - unix crypt function Artisanal Coding Is Dead, Long Live Artisanal Coding! Moonpool 0.10, and a blogpost about Moonpool at Imandra libdrm - OCaml bindings for Linux mode setting, etc New release of visitors MirageOS on Unikraft Old CWN opam 2.5.0~beta1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We are happy to announce the first beta release of opam 2.5.0. This version is a beta, we invite users to test it to spot previously unnoticed bugs as we head towards the stable release. Changes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :red_apple: Allow the macOS sandbox to write in the `/var/folde= rs/' and `/var/db/mds/' directories as it is required by some of macOS core tools ([#4389], [#6460]) =E2=80=A2 Stop `opam switch create --dry-run' from creating any directory. *Thanks to @hannes for this contribution.* ([#5918]) =E2=80=A2 :ocean: A couple more changes were made and minor regressions w= ere fixed :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [#4389] [#6460] [#5918] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.5.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.5.0~beta1" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Announcing the first release of Alice, a radical OCaml build system =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: Steve Sherratt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m pleased to announce the initial release of [Alice], a radical, experimental OCaml build system, package manager, and environment manager for [Windows], macOS, and Linux. Its goal is to allow anyone to program in OCaml with as little friction as possible. To build your first program with Alice, run: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ alice tools install # Skip this if you already have an OCam= l compiler! =E2=94=82 $ alice new hello =E2=94=82 $ cd hello =E2=94=82 $ alice run =E2=94=82 Compiling hello v0.1.0 =E2=94=82 Running hello/build/packages/hello-0.1.0/debug/executable/he= llo =E2=94=82=20 =E2=94=82 Hello, World! =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The UI is heavily inspired by Cargo. An important distinction between Alice's and Opam's packaging philosophies is that in Alice, _the OCaml compiler and development tools are not packages_. The `alice tools install' command will install a pre-compiled ([relocatable!]) OCaml compiler, a compatible `ocamllsp', and `ocamlformat' user-wide, similar to how `rustup' installs the Rust compiler and LSP server. This lets you go from zero to OCaml really fast because you don't have to build the compiler from source. This speedup is particularly noticeable on Windows where building the compiler can take upwards of 10 minutes. Alice supports building packages with dependencies on other packages, but currently only local packages are supported, and it can only build _Alice_ packages, not Opam packages. See an example [here]. I'll probably add Opam compatibility in the future. It's still early days and [a lot] is missing before Alice could feasibly be used for real projects. If you want to try it out anyway, install the `alice' Opam package, the `github:alicecaml/alice' Nix flake, or run the interactive install script: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 curl -fsSL https://alicecaml.org/install.sh | sh =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 More details about installing Alice are [here]. If you want read more, check out the [blog]. [Alice] [Windows] [relocatable!] [here] [a lot] [here] [blog] First release of ppx_deriving_jsont =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: vds announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I am happy to announce the first release of [`ppx_deriving_jsont']. As the name implies, it is a tool that automates some of the burden inherent to writing Jsont descriptions. [Jsont] is a fairly novel library for declarative JSON data manipulation, created by @dbuenzli. This ppx can manage most of the basic types, tuples, variants and records, but still lacks a lot of features and control. It is also quite bad at error reporting. The current roadmap, which highlights existing and missing features can be found in [the project=E2=80=99s read= me] along with many examples. I focused on generating readable and reusable code, close to the [cookbook] illustrations. Note that Jsont offers much finer control and many more features than what that you can achieve using this crude ppx. Please take some time to read about all of its intricacies: =E2=80=A2 In the official [documentation] and [cookbook] =E2=80=A2 In Daniel=E2=80=99s [introductory post] here on discuss. When precision and good error handling are required, such as when interacting with external json sources, thoughtfully crafted descriptions should still be considered. But I do believe this ppx to be very useful for bootstrapping, prototyping or when both the encoders and decoders are entirely under the app=E2=80=99s control. I wro= te it to that intent and already use it in several personal projects. I hope you will find it useful too! (and not too non-sensical :slightly_smiling_face:) [`ppx_deriving_jsont'] [Jsont] [the project=E2=80=99s readme] [cookbook] [documentation] [introductory post] crypt 2.0 - unix crypt function =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi there! I'm happy to announce the release of a new major version (i.e., 2.0) of the [crypt] library (bindings to the [Unix crypt]() function). The previous version, 1.3, was outdated, since the last commit was six years ago. This version does not support correct compilation on various Unix platforms (Linux, FreeBSD, macOS), and uses deprecated tools. However, the new version addresses these issues: it supports Linux, FreeBSD and macOS, uses modern tools, has safe C stubs, provides excellent documentation, and features an idiomatic high-level wrapper. [crypt] Installation =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C by OPAM package manager: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install crypt.2.0=20=20 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Example of usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # #require "crypt";; =E2=94=82=20 =E2=94=82 # Crypt.crypt ~salt:"GUBv0xjJ" "hello";; =E2=94=82 - : string =3D "GUpsIDCLVu8AY" =E2=94=82=20 =E2=94=82 # Crypt.crypt ~derivation:Md5 ~salt:"GUBv0xjJ" "hello";; =E2=94=82 - : string =3D "$1$GUBv0xjJ$rQSvX8r6cT7H/NItzzVNQ/" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If you don't provide any salt, a new salt will be generated every time the function is called. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Crypt.crypt "hello";; =E2=94=82 - : string =3D "QwD.wi5nLT/0s" =E2=94=82=20 =E2=94=82 # Crypt.crypt "hello";; =E2=94=82 - : string =3D "MYM.5hv5Lk2Mg" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 But for a deterministic generation, you should use one salt that you can generate using the `Crypt.Salt' module or another external module. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # let salt =3D Crypt.Salt.gen_base64 9;; =E2=94=82 val salt : string =3D "dHiPl3q99" =E2=94=82=20 =E2=94=82 # Crypt.crypt ~salt "hello";; =E2=94=82 - : string =3D "dHDdeFGUWcGyQ" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 P.S. =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Project that uses `crypt': =E2=80=A2 Recently I wrote [toy implementation of `login' utility written= in OCaml] [toy implementation of `login' utility written in OCaml] Artisanal Coding Is Dead, Long Live Artisanal Coding! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Joel Reymont announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I wrote [a blog post] about adding command history browsing and editing, as well as tab completion, to `ocamldebug', without typing a single line of code. I challenge you to review the PR for fun and to try to find holes in it! I=E2=80=99m going to add DWARF debugging information to OCaml next. I thi= nk it=E2=80=99s [almost ready to go] but needs double and triple checking. Commits look like this =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Date: Thu Nov 13 14:55:24 2025 +0200 =E2=94=82=20 =E2=94=82=20 =E2=94=82 Add DWARF tests for basic functionality =E2=94=82=20 =E2=94=82 Add minimal tests to verify DWARF emission works correctly with= -g flag. =E2=94=82 Tests compile OCaml programs with debugging enabled and verify = correct =E2=94=82 execution. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 and =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Date: Thu Nov 13 14:54:30 2025 +0200 =E2=94=82=20 =E2=94=82 Implement DWARF v4 debugging support for OCaml =E2=94=82=20 =E2=94=82 Add complete DWARF version 4 debugging information generation f= or OCaml =E2=94=82 native code. The implementation generates debug info for functi= ons, types, =E2=94=82 and line numbers, enabling debugger support for OCaml programs. =E2=94=82=20 =E2=94=82 Key components: =E2=94=82 - Low-level DWARF primitives (tags, attributes, forms, encoding= s) =E2=94=82 - Debug Information Entries (DIE) construction =E2=94=82 - Line number program generation =E2=94=82 - String table management with offset tracking =E2=94=82 - Code address tracking and relocation =E2=94=82 - Integration with OCaml compilation pipeline =E2=94=82 - Configuration flags to enable/disable DWARF emission =E2=94=82=20 =E2=94=82 The implementation follows the DWARF 4 specification and genera= tes =E2=94=82 valid debug sections (.debug_info, .debug_line, .debug_str, .de= bug_abbrev) =E2=94=82 that can be consumed by standard debuggers like gdb and lldb. =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 [a blog post] [almost ready to go] Moonpool 0.10, and a blogpost about Moonpool at Imandra =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Good morning, A couple of news about Moonpool. Moonpool is a concurrency and parallelism library that provides a `Runner.t' abstraction, implemented mostly by thread pools, as a way to run lightweight tasks possibly on multiple cores. First, I just wrote a blog post about [our use of Moonpool] at Imandra. The post discusses our experience with using Moonpool and some lessons learned over time. Secondly, Moonpool 0.10 was just released. It contains a few bugfixes, and removes some deprecated modules. It also removes `moonpool.fib' (fibers with structured concurrency) as they have turned out, over the years, to be somewhat hard to use properly (they assume the existence of a parent fiber, making code highly context-dependent). Lightweight thread-safe futures (based on Picos') with per-future local-storage are still there and serve mostly the same purpose. The release and change notes can be found [here]. [our use of Moonpool] [here] libdrm - OCaml bindings for Linux mode setting, etc =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the first release of [libdrm-ocaml] (OCaml bindings for the libdrm C library). libdrm is used by applications such as Wayland compositors to control the physical graphics hardware. For example, you can use the library to enumerate graphics devices: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 utop # Drm.Device.list ();; =E2=94=82 - : Drm.Device.Info.t list =3D =E2=94=82 [{primary_node =3D Some "/dev/dri/card0"; =E2=94=82 render_node =3D Some "/dev/dri/renderD128"; =E2=94=82 info =3D PCI {bus =3D {domain =3D 0; bus =3D 1; dev =3D 0; fu= nc =3D 0}; =E2=94=82 dev =3D {vendor_id =3D 0x1002; =E2=94=82 device_id =3D 0x67ff; =E2=94=82 subvendor_id =3D 0x1458; =E2=94=82 subdevice_id =3D 0x230b; =E2=94=82 revision_id =3D 0xff}}}] =E2=94=82=20 =E2=94=82 utop # let dev =3D Unix.openfile "/dev/dri/card0" [O_CLOEXEC; O= _RDWR] 0;; =E2=94=82=20 =E2=94=82 utop # Drm.Device.Version.get dev;; =E2=94=82 - : Drm.Device.Version.t =3D =E2=94=82 {version =3D 3.61.0; name =3D "amdgpu"; date =3D "0"; desc =3D = "AMD GPU"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here's an excerpt configuring a hardware plane to present a framebuffer on a CRT controller: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 plane.%{ K.Plane.fb_id } <- Some fb; =E2=94=82 (* Source region on frame-buffer: *) =E2=94=82 plane.%{ K.Plane.src_x } <- Drm.Ufixed.of_int 0; =E2=94=82 plane.%{ K.Plane.src_y } <- Drm.Ufixed.of_int 0; =E2=94=82 plane.%{ K.Plane.src_w } <- Drm.Ufixed.of_int (fst size); =E2=94=82 plane.%{ K.Plane.src_h } <- Drm.Ufixed.of_int (snd size); =E2=94=82 (* Destination region on CRTC: *) =E2=94=82 plane.%{ K.Plane.crtc_x } <- 0; =E2=94=82 plane.%{ K.Plane.crtc_y } <- 0; =E2=94=82 plane.%{ K.Plane.crtc_w } <- fst size; =E2=94=82 plane.%{ K.Plane.crtc_h } <- snd size; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 For a proper tutorial, see [Linux mode setting, from the comfort of OCaml]. [libdrm-ocaml] [Linux mode setting, from the comfort of OCaml] New release of visitors =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce a new release of `visitors', a tool that automatically generates visitor classes for algebraic data types. The new features of this release are as follows: =E2=80=A2 `visitors' now decorates every generated method with a type annotation. This can help understand the generated code. More importantly, this enables type-directed disambiguation, so `visitors' now supports situations where two distinct types have a field or a data constructor by the same name. (Reported by Guillaume Boisseau. Contributed by Sacha =C3=89lie-Ayoun.) =E2=80=A2 Install a new executable command, `visitors_preprocess', to preprocess an OCaml source file and see the result. =E2=80=A2 Update `Makefile.preprocess' to use `visitors_preprocess'. =E2=80=A2 Require `ppxlib' version 0.37.0 or newer. MirageOS on Unikraft =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, shym announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Just a short update to let you know that OCaml/Unikraft 1.1.0 [has been released] with support for OCaml 5.4 and Unikraft 0.20.0. Happy hacking! [has been released] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 11 to 18, 20= 25.

    opam 2.5.0~beta1

    Kate announced

    Hi everyone,

    We are happy to announce the first beta release of opam 2.5.0.

    This version is a beta, we invite users to test it to spot previously unnot= iced bugs as we head towards the stable release.

    Changes

    • :red_apple: Allow the macOS sandbox to write in the /var/folders/= and /var/db/mds/ directories as it is required by some= of macOS core tools (#4389, #6460= )
    • Stop opam switch create --dry-run from creating any direct= ory. Thanks to @hannes for this contribution. (#5918)
    • :ocean: A couple more changes were made and minor regressions were fixe= d

    :open_book: You can read our blog post for more information about these changes and more= , and for even more details you can take a look at the release note or the changelog.

    Announcing the first release of Alice, a radical OCaml build s= ystem

    Steve Sherratt announced

    I=E2=80=99m pleased to announce the initial release of Alice, a radical, experimental OCaml build s= ystem, package manager, and environment manager for Windows, macOS, and Linux. Its= goal is to allow anyone to program in OCaml with as little friction as pos= sible.

    To build your first program with Alice, run:

    $ alice tools install   # Skip this if you already have an OCaml compiler!
    $ alice new hello
    $ cd hello
    $ alice run
     Compiling hello v0.1.0
       Running hello/build/packages/hello-0.1.0/debug/executable/hello
    
    Hello, World!
    

    The UI is heavily inspired by Cargo.

    An important distinction between Alice's and Opam's packaging philosophies = is that in Alice, the OCaml compiler and developm= ent tools are not packages. The alice tools install com= mand will install a pre-compiled (relocatable!) OCaml compiler, a compatible ocaml= lsp, and ocamlformat user-wide, similar to how ru= stup installs the Rust compiler and LSP server. This lets you go fro= m zero to OCaml really fast because you don't have to build the compiler fr= om source. This speedup is particularly noticeable on Windows where buildin= g the compiler can take upwards of 10 minutes.

    Alice supports building packages with dependencies on other packages, but c= urrently only local packages are supported, and it can only build Alice packages, not Opam packages. See an example <= a href=3D"https://github.com/alicecaml/alice?tab=3Dreadme-ov-file#tutorial"= >here. I'll probably add Opam compatibility in the future.

    It's still early days and a lot is missing before Alice could feas= ibly be used for real projects.

    If you want to try it out anyway, install the alice Opam packa= ge, the github:alicecaml/alice Nix flake, or run the interacti= ve install script:

    curl -fsSL https://alicecaml.org/install.sh | sh
    

    More details about installing Alice are here.

    If you want read more, check out the blog.

    First release of ppx_deriving_jsont

    vds announced

    I am happy to announce the first release of ppx_deriving_jsont.

    As the name implies, it is a tool that automates some of the burden inheren= t to writing Jsont descriptions. Jsont is a fairly novel library for declarative JSON data manipul= ation, created by @dbuenzli.

    This ppx can manage most of the basic types, tuples, variants and records, = but still lacks a lot of features and control. It is also quite bad at erro= r reporting. The current roadmap, which highlights existing and missing fea= tures can be found in the project=E2=80=99s readme a= long with many examples. I focused on generating readable and reusable code= , close to the cookbook illustrations.

    Note that Jsont offers much finer control and many more features than what = that you can achieve using this crude ppx. Please take some time to read ab= out all of its intricacies:

    When precision and good error handling are required, such as when interacti= ng with external json sources, thoughtfully crafted descriptions should sti= ll be considered. But I do believe this ppx to be very useful for bootstrap= ping, prototyping or when both the encoders and decoders are entirely under= the app=E2=80=99s control. I wrote it to that intent and already use it in= several personal projects. I hope you will find it useful too! (and not to= o non-sensical :slightly_smiling_face:)

    crypt 2.0 - unix crypt function

    Mikhail announced

    Hi there!

    I'm happy to announce the release of a new major version (i.e., 2.0) of the= crypt library (bind= ings to the [Unix crypt](https://en.wikipedia.org/wiki/Crypt_(Unix)) function). The previou= s version, 1.3, was outdated, since the last commit was six years ago. This= version does not support correct compilation on various Unix platforms (Li= nux, FreeBSD, macOS), and uses deprecated tools. However, the new version a= ddresses these issues: it supports Linux, FreeBSD and macOS, uses modern to= ols, has safe C stubs, provides excellent documentation, and features an id= iomatic high-level wrapper.

    Installation

    by OPAM package manager:

    $ opam install crypt.2.0=20=20
    

    Example of usage

    # #require "crypt";;
    
    # Crypt.crypt ~salt:"GUBv0xjJ" "hello"=
    ;;
    - : string =3D "GUpsIDCLVu8AY"
    
    # Crypt.crypt ~derivation:Md5 ~salt:"GUBv0xjJ" <=
    span style=3D"color: #ca3400;">"hello""$1$GUBv0xjJ$rQSvX8r6cT7H/NI=
    tzzVNQ/"
    

    If you don't provide any salt, a new salt will be generated every time the = function is called.

    # Crypt.crypt "hello";;
    - : string =3D "QwD.wi5nLT/0s"
    
    # Crypt.crypt "hello"=
    ;;
    - : string =3D "MYM.5hv5Lk2Mg"
    

    But for a deterministic generation, you should use one salt that you can ge= nerate using the Crypt.Salt module or another external module.

    # let salt =3D Crypt.Salt.gen_base6=
    4 9;;
    val salt : string =3D "dHiPl3q99"
    
    # Crypt.crypt ~sa=
    lt "hello";;
    - : string =3D "dHDdeFGUWcGyQ"
    

    P.S.

    Project that uses crypt:

    Artisanal Coding Is Dead, Long Live Artisanal Coding!

    Joel Reymont announced

    I wrote a blog post about adding command history browsing and edit= ing, as well as tab completion, to ocamldebug, without typing = a single line of code. I challenge you to review the PR for fun and to try = to find holes in it!

    I=E2=80=99m going to add DWARF debugging information to OCaml next. I think= it=E2=80=99s almost ready to go but needs double and triple checking. Com= mits look like this

    Date:   Thu Nov 13 14:55:24 2025 +0200
    
    
    Add DWARF tests for basic functionality
    
    Add minimal tests to verify DWARF emission works correctly with -g flag.
    Tests compile OCaml programs with debugging enabled and verify correct
    execution.
    

    and

    Date:   Thu Nov 13 14:54:30 2025 +0200
    
    Implement DWARF v4 debugging support for OCaml
    
    Add complete DWARF version 4 debugging information generation for OCaml
    native code. The implementation generates debug info for functions, types,
    and line numbers, enabling debugger support for OCaml programs.
    
    Key components:
    - Low-level DWARF primitives (tags, attributes, forms, encodings)
    - Debug Information Entries (DIE) construction
    - Line number program generation
    - String table management with offset tracking
    - Code address tracking and relocation
    - Integration with OCaml compilation pipeline
    - Configuration flags to enable/disable DWARF emission
    
    The implementation follows the DWARF 4 specification and generates
    valid debug sections (.debug_info, .debug_line, .debug_str, .debug_abbrev)
    that can be consumed by standard debuggers like gdb and lldb.
    

    Moonpool 0.10, and a blogpost about Moonpool at Imandra

    Simon Cruanes announced

    Good morning,

    A couple of news about Moonpool. Moonpool is a concurrency and parallelism = library that provides a Runner.t abstraction, implemented most= ly by thread pools, as a way to run lightweight tasks possibly on multiple = cores.

    First, I just wrote a blog post about our use of Moonpool= at Imandra. The post discusses our experience with using Moonpool and = some lessons learned over time.

    Secondly, Moonpool 0.10 was just released. It contains a few bugfixes, and = removes some deprecated modules. It also removes moonpool.fib = (fibers with structured concurrency) as they have turned out, over the year= s, to be somewhat hard to use properly (they assume the existence of a pare= nt fiber, making code highly context-dependent). Lightweight thread-safe fu= tures (based on Picos') with per-future local-storage are still there and s= erve mostly the same purpose. The release and change notes can be found here.

    libdrm - OCaml bindings for Linux mode setting, etc

    Thomas Leonard announced

    I'm pleased to announce the first release of libdrm-ocaml (OCaml bindings for the libdrm C libr= ary).

    libdrm is used by applications such as Wayland compositors to control the p= hysical graphics hardware.

    For example, you can use the library to enumerate graphics devices:

    utop # Drm.Device.list ()=
    ;;
    - : Drm.Device.Info.t list =3D
    [{primary_node =3D Some "/dev/dri/card0";
      render_node =3D Some "/dev/dri/renderD128";
      info =3D PCI {bus =3D {domain =3D =
    0; bus =3D 1; dev =3D 0; func =3D 0};
                  dev =3D {vendor_id =3D 0x1002;
                         device_id =3D 0x67ff;
                         subvendor_id =3D 0x1458;
                         subdevice_id =3D 0x230b;
                         revision_id =3D 0xff}}}]
    
    utop # let dev =3D Unix.openfile "/dev=
    /dri/card0" [O_CLOEXEC; O_RDWR] 0=
    ;;
    
    utop # Drm.Device.Versio=
    n.get dev;;
    - : Drm.Device.Version.<=
    /span>t =3D
    {version =3D 3.61.0; name =3D "amdgpu"; date =3D "0"; desc =3D "AMD GPU"}
    

    Here's an excerpt configuring a hardware plane to present a framebuffer on = a CRT controller:

    plane.%<=
    /span>{ K.Plane.f=
    b_id } <- Some fb;
    (* Source region on frame-buffer: *)
    plane.%{ K.Plane.src_x } <- Drm.Ufixed.of_int 0;
    plane.%{ K.Plane.src_y } <- Drm.Ufixed.of_int 0;
    plane.%{ K.Plane.src_w } <- Drm.Ufixed.of_int (fst size);
    plane.%{ K.Plane.src_h } <- Drm.Ufixed.of_int (snd size);
    (* Destination region on CRTC:=
     *)
    plane.%{ K.Plane.crtc_x } <- 0;
    plane.%{ K.Plane.crtc_y } <- 0;
    plane.%{ K.Plane.crtc_w } <- fst size;
    plane.%{ K.Plane.crtc_h } <- snd size;
    

    For a proper tutorial, see Linux mode setting, from the comfort of OCaml.

    MirageOS on Unikraft

    Continuing this thread, shym announced

    Just a short update to let you know that OCaml/Unikraft 1.1.0 has been released wi= th support for OCaml 5.4 and Unikraft 0.20.0.

    Happy hacking!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=FgjTL7iW; dkim=fail reason="signature verification failed" (1024-bit key; secure) header.d=polytechnique.org header.i=@polytechnique.org header.a=rsa-sha256 header.s=svoboda header.b=snS3x0UC; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 7C70740022 for ; Tue, 25 Nov 2025 13:49:34 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=MWvKDr+FS1Z/jw+523RMqHEFIqjSjmDvHLXFgwfmk8w=; b=FgjTL7iW4tl7nMVgohpe9chfs4RrKgAyhzdugqJJR3xIWyQ1GDLtq4x1 8BEaYsd/8pZqCeu4PrQvRP/cm6sHqxvBReIR/BAJAQ42CMh1a49MB6iCn mOaiZAU5kzrVOxKl/gy+ayuSU5IuQJZk9yUkEVuV9+vZJfjvC+Jis80NN w=; X-CSE-ConnectionGUID: TNUKQ9FlQiuWu1AOOyULuw== X-CSE-MsgGUID: F7YXeVhdSGSk5mv6r34HUw== Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only Authentication-Results: mail2-relais-roc.national.inria.fr; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr; dkim=hardfail (signature did not verify [final]) header.i=@polytechnique.org X-IronPort-AV: E=Sophos;i="6.20,225,1758578400"; d="scan'208,217";a="251130898" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 25 Nov 2025 14:49:34 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id B85AEE0AF1; Tue, 25 Nov 2025 14:49:33 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 79A84E0157 for ; Tue, 25 Nov 2025 14:49:31 +0100 (CET) X-CSE-ConnectionGUID: BvrE/t3QQOi+9THtcpBhng== X-CSE-MsgGUID: Yo32O+TwTyO0uQlXrSBYTA== IronPort-SDR: 6925b3e8_49OcZBKEO0EoPOQIlTNX1oo+rtaIBjTTCGOO42IpyP7pr1g kp0Fh+d1W88itk3VjX1MeBwZmVxrU8hoY2Lz1EA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FsBAAMsyVphSIeaIFahBZbKBkBaF4zBwhJA4RSgWOBb?= =?us-ascii?q?AiOHYEWkDeKe4FpgREDGBYjFQEDAQ0uARUKAQIEAQEDAQIBggyBPYE3AhaMS?= =?us-ascii?q?wIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBA?= =?us-ascii?q?QFASYZPDUaBfxk4Ux5hAwEDBQEGAQEBAQEBAQEBAgEBASIBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAECLhJcAQgEB?= =?us-ascii?q?hMBATgYIwMUAQYDAgQNATUDARMBEhQGgmgBgiACAk8DBQwGlimbTHp/M4EBg?= =?us-ascii?q?gwBAQaBCD4DAgkCAgMBDgklAdoMgWQJgUqFboJKGwEFJUlrAoRJCYQ0Jw+BV?= =?us-ascii?q?USBFTWBVmcHb4I/CxcBAQEBARdCPA4YAQFNCYMlgmmCERV6FB2GCYFzfYcMB?= =?us-ascii?q?okygURLMywBVRMXCwcFW4EIAyo0LW4yHYEkPhhzgRSDSRATaA8GgRGDT4kaD?= =?us-ascii?q?4pOAwttPTcUG5R3QhkXFSWBMgkBJQ4/FksoBgcDHwEBIjY0DAMZNAQBFwEtC?= =?us-ascii?q?QILIA+QDoJAAwkkAgIqA49Zons0B4QfgV4GDIkIgSaOKwmDe4NXhASBV4s8h?= =?us-ascii?q?wKSUiKYZCKCNocngSYJYIEPa5UkPAQPGYUtgX8jPG8BHQwHMxowQw0VghEBA?= =?us-ascii?q?QExCRYwHA+Nf4FWAQeBJnYoEDF9gQyCDjt9wC5CNQEBAQEENAIHAQoBAQMJh?= =?us-ascii?q?WIBAWmLHw8XBwWBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:l7YlgKHJVGTLoSzmpLqE1ceALOsnbusQ8zAXPiFKOH9om6mj/f xG88506faZslsssRIb+exoWpPgfZq0z/ccirX5Vo3MYOCJggeVBbAnxbSn6TztES/z+4dmpM VdWpk7Lsb/SXxzjcOS2njdLz/M+qjjzJyV X-Talos-CUID: 9a23:fjKRIWG48zlvNPsEqmJN6lQ5Xdx+S0T6zTSBH2+kAn5DSLuaHAo= X-Talos-MUID: =?us-ascii?q?9a23=3AwfYw+Qy4Ifjvugg10uD7WkAcbRuaqJWpUxoq0qk?= =?us-ascii?q?Zh9ijbTFJPweHtx6GfqZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.20,225,1758578400"; d="scan'208,217";a="131871469" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDEsEsMudptCuGtxLvLDUQW2CpET7orIP0XqHR?= =?us-ascii?q?q5IV0trVl+j1nhontSg9yG9T8xoe0WmtOpbbmLXJs3gLVHnwRQmtkcaQ?= =?us-ascii?q?7AgFzU2Mjzoi1sJC86EvJVoThHOYzWlSERBuw86o93L/U7F5s4PvmSbC?= =?us-ascii?q?lZ/iwmHHV4SRBIpOjbbReP7w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 25 Nov 2025 14:49:29 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E74731A385; Tue, 25 Nov 2025 14:49:27 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=polytechnique.org; s=svoboda; t=1764078568; bh=DCDNPLQRXF139PUMIiWY6NWNX2CMMLo5YfAKj44LqAw=; h=From:To:Subject:Date:Message-ID; b=snS3x0UCpSDiH/4lO4OsyWHwMk3vAqxTJf+EfIllekKam9VzRapaoJIakXuZNzYzg q96dwYxNl2fzwfouaVyJW2hQM8dQnuHldbZUO++1L3LvCRUUf7Fh/wa2J2v1QDXX0I o/N1KGxyhChDuStYES79BFZsPklb/7g8hy4mm57w= From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 25 Nov 2025 14:49:27 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Nov 25 14:49:28 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.489604, queueID=11F8A1A387 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19404 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTm92ZW1iZXIgMTggdG8gMjUsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClRhcGFr OiBFeHBlcmltZW50YWwgV2ViIEZyYW1ld29yayBCYXNlZCBvbiBFSU8NCkZVTiBPQ2FtbCBpcyBs aXZlIG9uIFlvdVR1YmUgYW5kIFR3aXRjaA0KTmF0aXZlIGRlYnVnZ2luZyBvbiBtYWNPUyAoRFdB UkYgc3VwcG9ydCkNClBhY2thZ2UgSHlnaWVuZSBpbiBBbGljZQ0KY3J5cHQgMi4wIC0gdW5peCBj cnlwdCBmdW5jdGlvbg0Kb3BhbSAyLjUuMH5yYzEgYW5kIG9wYW0tcHVibGlzaCAyLjcuMQ0Kb2Nh bWwtcHJvdG9jIDQuMCwgcGJydCA0LjANCkNtZGxpbmVyIDIuMS4wIOKAkyBUaGUgcG93ZXJzaGVs bCBlZGl0aW9uDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KVGFwYWs6IEV4cGVyaW1l bnRhbCBXZWIgRnJhbWV3b3JrIEJhc2VkIG9uIEVJTw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGFwYWst ZXhwZXJpbWVudGFsLXdlYi1mcmFtZXdvcmstYmFzZWQtb24tZWlvLzE3NTA3LzE+DQoNCg0KU3lh aWZ1bCBCYWhyaSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvISBJIGFtIGEgbmV3 Y29tZXIgdG8gdGhlIE9DYW1sIGNvbW11bml0eSwgYW5kIHRoaXMgaXMgbXkgZmlyc3QNCiAgcG9z dC4NCg0KICBJIHdvdWxkIGxpa2UgdG8gc2hhcmUgYW4gZXhwZXJpbWVudGFsIHdlYiBmcmFtZXdv cmsgSSBoYXZlIGJlZW4NCiAgd29ya2luZyBvbiwgYmFzZWQgb24gRWlvLiBJIGFtIGEgaGFwcHkg dXNlciBvZiBEcmVhbSBhbmQgT3BpdW0sIGJ1dCBJDQogIGZlbHQgdGhlcmUgd2FzIHN0aWxsIHJv b20gZm9yIGltcHJvdmVtZW50Lg0KDQogIEnigJl2ZSBzaGFyZWQgbXkgbW90aXZhdGlvbiBoZXJl Og0KICA8aHR0cHM6Ly93d3cuc2JhaHJpLmNvbS9wcm9qZWN0cy90YXBhay8+DQoNCiAgSSB3b3Vs ZCBsb3ZlIHRvIGhlYXIgeW91ciBzdWdnZXN0aW9ucyBhbmQgb3BpbmlvbnMgcmVnYXJkaW5nIHRo ZQ0KICBBUEkuIFdoYXQgaW1wb3J0YW50IGZlYXR1cmVzIGRvIHlvdSBmZWVsIGFyZSBtaXNzaW5n IGluIGV4aXN0aW5nDQogIGxpYnJhcmllcz8gUGVyc29uYWxseSwgSSBtaXNzIHRoZSB0eXBlLXNh ZmUgcm91dGluZyB0aGF0IFNlcnZhbnQNCiAgb2ZmZXJzLCBhcyB3ZWxsIGFzIHRoZSBQaG9lbml4 IHJlYWwtdGltZSBBUEkuDQoNCg0KRlVOIE9DYW1sIGlzIGxpdmUgb24gWW91VHViZSBhbmQgVHdp dGNoDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Z1 bi1vY2FtbC1pcy1saXZlLW9uLXlvdXR1YmUtYW5kLXR3aXRjaC8xNzI1NC8zPg0KDQoNCkNvbnRp bnVpbmcgdGhpcyB0aHJlYWQsIFNhYmluZSBTY2htYWx0eiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEFmdGVyIGhpZGluZyB0aGUgb3JpZ2luYWwgbGl2 ZSBzdHJlYW0gcmVjb3JkaW5nLCBhbmQgc3RhcnRpbmcgdG8NCiAgcHVibGlzaCB0aGUgdGFsayBy ZWNvcmRpbmdzIGluZGl2aWR1YWxseSBvbiB0aGUgWW91VHViZSBjaGFubmVsIGF0DQogIDxodHRw czovL3d3dy55b3V0dWJlLmNvbS9ARlVOT0NhbWw+LCB3ZSdyZSBhbG1vc3QgZG9uZSBsaXN0aW5n IGFsbCB0aGUNCiAgdGFsa3MhDQoNCiAgPGh0dHBzOi8veW91dHUuYmUvMEh3ZDdOeFE4X2M/c2k9 UGtySnRKWFBZUzFrU0F5Zz4NCg0KDQpOYXRpdmUgZGVidWdnaW5nIG9uIG1hY09TIChEV0FSRiBz dXBwb3J0KQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9uYXRpdmUtZGVidWdnaW5nLW9uLW1hY29zLWR3YXJmLXN1cHBvcnQvMTc1MDkvMT4N Cg0KDQpKb2VsIFJleW1vbnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXaXRoIERXQVJGIHY1 IHN1cHBvcnQsIHRoZSBjb21waWxlciBub3cgaW5jbHVkZXMgcHJvcGVyIGRlYnVnIGluZm8g4oCU DQogIGxpbmUgbWFwcGluZ3MsIHN5bWJvbHMsIGFuZCB2YXJpYWJsZSBuYW1lcyDigJQgc28gTExE QiBjYW4gYWN0dWFsbHkNCiAgZm9sbG93IHlvdXIgY29kZS4NCg0KICBBIHNtYWxsIExMREIgUHl0 aG9uIHBsdWctaW4gcmVhZHMgT0NhbWwgdmFsdWVzIGF0IHJ1bnRpbWUgYW5kIHByaW50cw0KICB0 aGVtIGluIGEgcmVhZGFibGUgZm9ybTogbGlzdHMsIHR1cGxlcywgY2xvc3VyZXMsIHN0cmluZ3Ms IGV0Yy4gSXQNCiAgZm9sbG93cyBEV0FSRiBsb2NhdGlvbiBsaXN0cyB0byB0cmFjayB3aGVyZSBl YWNoIHZhcmlhYmxlIGxpdmVzIGFuZA0KICB1c2VzIHRoZSBydW50aW1lIGhlYWRlcnMgdG8gZGVj b2RlIHRoZW0uIFRoZSBgcCcgYW5kIGBvY2FtbF92YXJzJw0KICBjb21tYW5kcyB3b3JrIGxpa2Ug bm9ybWFsIExMREIgY29tbWFuZHMgYnV0IHVuZGVyc3RhbmQgT0NhbWwgdmFsdWVzLg0KDQogIEl0 4oCZcyBub3QgY29tcGxldGUgeWV0IChyZWNvcmRzIGFuZCB2YXJpYW50cyBzdGlsbCBzaG93IGFz IHR1cGxlcyksIGJ1dA0KICBpdCBtYWtlcyBkZWJ1Z2dpbmcgbmF0aXZlIE9DYW1sIGNvZGUgc3Ry YWlnaHRmb3J3YXJkLiBZb3UgY2FuIGZpbmFsbHkNCiAgc2V0IGJyZWFrcG9pbnRzIGJ5IHNvdXJj ZSwgaW5zcGVjdCBsb2NhbHMsIGFuZCB1bmRlcnN0YW5kIHdoYXTigJlzIGluDQogIG1lbW9yeSB3 aXRob3V0IHN3aXRjaGluZyB0byBkaXNhc3NlbWJseS4NCg0KICA8aHR0cHM6Ly9qb2VsLmlkL25h dGl2ZS1iaW5hcnktZGVidWdnaW5nLWZvci1vY2FtbC8+DQoNCg0KUGFja2FnZSBIeWdpZW5lIGlu IEFsaWNlDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3BhY2thZ2UtaHlnaWVuZS1pbi1hbGljZS8xNzUxMy8xPg0KDQoNClN0ZXZl IFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgPGh0dHBzOi8vd3d3LmFs aWNlY2FtbC5vcmcvYmxvZy9wYWNrYWdlLWh5Z2llbmUtaW4tYWxpY2UvPg0KDQogIEFsaWNlIGlz IGFuIE9DYW1sIGJ1aWxkIHN5c3RlbSBhbmQgcGFja2FnZSBtYW5hZ2VyIEknbSBkZXZlbG9waW5n IGluDQogIG15IHNwYXJlIHRpbWUuIFRoaXMgcG9zdCBpcyBhYm91dCBBbGljZSdzIHBhY2thZ2lu ZyBwcm90b2NvbCBhbmQgaG93DQogIGl0IGVuZm9yY2VzIGh5Z2llbmUgd2hpbGUgYnVpbGRpbmcg cGFja2FnZXMuDQoNCg0KY3J5cHQgMi4wIC0gdW5peCBjcnlwdCBmdW5jdGlvbg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tY3J5cHQtMi0wLXVuaXgtY3J5cHQtZnVuY3Rpb24vMTc0ODUv Mj4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBNaWtoYWlsIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSADQoNCiAgTWlub3IgdXBkYXRlOiBjcnlwdCAyLjEuDQoNCiAgV2UgaGF2ZSBhZGRlZCBhIG11 dGV4IGZvciB0aGUgUE9TSVggY3J5cHQgZnVuY3Rpb24gYW5kIGENCiAgcGxhdGZvcm0tZGVwZW5k ZW50IGltcGxlbWVudGF0aW9uIG9mIGNyeXB0LCBpLmUuLCBjcnlwdF9yIGZvciBMaW51eA0KICBh bmQgRnJlZUJTRC4gV2UgaGF2ZSBhbHNvIGFkZGVkIHRoZSBGZmkgbW9kdWxlIGZvciBhY2Nlc3Np bmcgbmF0aXZlDQogIHBsYXRmb3JtIGJpbmRpbmdzLg0KDQoNCm9wYW0gMi41LjB+cmMxIGFuZCBv cGFtLXB1Ymxpc2ggMi43LjENCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLW9wYW0tMi01LTAtcmMxLW9wYW0tcHVibGlzaC0yLTctMS8xNzUxNS8xPg0KDQoN CkthdGUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBXZSBhcmUgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZp cnN0IHJlbGVhc2UgY2FuZGlkYXRlIG9mIG9wYW0gYDIuNS4wJywNCiAgd2hpY2ggYm9hc3RzIGEg Z3JhbmQgdG90YWwgb2YgemVybyAoMCkgY2hhbmdlcyBjb21wYXJlZCB0bw0KICBgMi41LjB+YmV0 YTEnIQ0KDQogIFdlIGFsc28gdGFrZSB0aGlzIG9wcG9ydHVuaXR5IHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIG9wYW0tcHVibGlzaA0KICBgMi43LjEnLCB3aG9zZSBmdWxsIHJlbGVhc2Ugbm90 ZXMgY2FuIGJlIHNlZW4gW2hlcmVdLg0KDQoNCltoZXJlXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sLW9wYW0vb3BhbS1wdWJsaXNoL3JlbGVhc2VzL3RhZy8yLjcuMT4NCg0KQ2hhbmdlcyBpbiBv cGFtLXB1Ymxpc2ggMi43LjENCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIElu IGAyLjcuMCcsIG9wYW0tcHVibGlzaCBjaGFuZ2VkIHRoZSB3YXkgdXNlcidzIGJyYW5jaGVzIGFy ZSBwdXNoZWQgdG8NCiAgdGhlaXIgR2l0SHViIGZvcmtzIGJlZm9yZSBvcGVuaW5nIGEgUFIsIHN3 aXRjaGluZyBmcm9tIHVzaW5nIFNTSCBrZXlzDQogIHRvIHVzaW5nIHRoZSBHaXRIdWIgQVBJIHRv a2VuIHRoYXQgb3BhbS1wdWJsaXNoIGFscmVhZHkgcmVxdWlyZXMuDQoNCiAgYDIuNy4xJyBmaXhl cyBhIGNvdXBsZSBvZiBidWdzIHJlbGF0ZWQgdG8gdGhhdCB3aGVyZSBvcGFtLXB1Ymxpc2gNCiAg c3RvcHBlZCB3b3JraW5nIGlmIHRoZSBHaXRIdWIgQWN0aW9uIHdvcmtmbG93IGZpbGVzIG9mIHVw c3RyZWFtDQogIG9wYW0tcmVwb3NpdG9yeSBhcmUgY2hhbmdlZCwgb3dpbmcgdG8gdGhlIHdheSBH aXRIdWIgdG9rZW4gcGVybWlzc2lvbnMNCiAgd29yay4gICpUaGFua3MgdG8gW0BmaWxpcGVvbV0g Ym90aCBmb3IgdGhlIG9yaWdpbmFsIGNvbnRyaWJ1dGlvbiBpbg0KICBgMi43LjAnIGFuZCBmb3Ig c3Vic2VxdWVudCB3b3JrIG9uIGl0IGluIGAyLjcuMScqLg0KDQogIFJlYWQgb3VyIFtibG9nIHBv c3RdIGZvciBtb3JlIGRldGFpbHMuDQoNCiAgUGxlYXNlIHJlcG9ydCBhbnkgaXNzdWVzIHRvIFt0 aGUgb3BhbSBidWctdHJhY2tlcl0gb3IgW3RoZQ0KICBvcGFtLXB1Ymxpc2ggYnVnLXRyYWNrZXJd Lg0KDQoNCltAZmlsaXBlb21dIDxodHRwczovL2dpdGh1Yi5jb20vZmlsaXBlb20+DQoNCltibG9n IHBvc3RdIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0yLTUtMC1yYzEtcHVibGlz aC8+DQoNClt0aGUgb3BhbSBidWctdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9v cGFtL2lzc3Vlcz4NCg0KW3RoZSBvcGFtLXB1Ymxpc2ggYnVnLXRyYWNrZXJdDQo8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29wYW0tcHVibGlzaC9pc3N1ZXM+DQoNCg0KVHJ5IHRoZSBuZXcgb3Bh bSAyLjUuMCByZWxlYXNlIGNhbmRpZGF0ZToNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSB1cGdyYWRlIGlu c3RydWN0aW9ucyBhcmUgdW5jaGFuZ2VkOg0KDQogIEZvciBVbml4IHN5c3RlbXMNCiAg4pSM4pSA 4pSA4pSA4pSADQogIOKUgiBiYXNoIC1jICJzaCA8KGN1cmwgLWZzU0wgaHR0cHM6Ly9vcGFtLm9j YW1sLm9yZy9pbnN0YWxsLnNoKSAtLXZlcnNpb24gMi41LjB+cmMxIg0KICDilJTilIDilIDilIDi lIANCiAgb3IgZnJvbSBQb3dlclNoZWxsIGZvciBXaW5kb3dzIHN5c3RlbXMNCiAg4pSM4pSA4pSA 4pSA4pSADQogIOKUgiBJbnZva2UtRXhwcmVzc2lvbiAiJiB7ICQoSW52b2tlLVJlc3RNZXRob2Qg aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9pbnN0YWxsLnBzMSkgfSAtVmVyc2lvbiAyLjUuMH5yYzEi DQogIOKUlOKUgOKUgOKUgOKUgA0KICBQbGVhc2UgcmVwb3J0IGFueSBpc3N1ZXMgdG8gdGhlIFti dWctdHJhY2tlcl0uDQoNCiAgSGFwcHkgaGFja2luZywgPD4gPD4gVGhlIG9wYW0gdGVhbSA8PiA8 PiA6Y2FtZWw6DQoNCg0KW2J1Zy10cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29w YW0vaXNzdWVzPg0KDQoNCm9jYW1sLXByb3RvYyA0LjAsIHBicnQgNC4wDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fu bi1vY2FtbC1wcm90b2MtNC0wLXBicnQtNC0wLzE3NTI0LzE+DQoNCg0KU2ltb24gQ3J1YW5lcyBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgY2FtbCByaWRlcnMsIEknbSBoYXBweSB0 byBhbm5vdW5jZSB0aGUgcmVsZWFzZSBvZiBbb2NhbWwtcHJvdG9jXQ0KICA0LjAsIGFsb25nc2lk ZSBpdHMgcnVudGltZSBsaWJyYXJpZXMgYHBicnQnLCBgcGJydF95b2pzb24nLCBhbmQNCiAgYHBi cnRfc2VydmljZXMnLg0KDQogIE9jYW1sLXByb3RvYyBpcyBhIHB1cmUgT0NhbWwgaW1wbGVtZW50 YXRpb24gb2YgYSBbcHJvdG9idWZdIGNvbXBpbGVyDQogIGFuZCBydW50aW1lLiBbUHJvdG9idWZd IGlzIGEgYmluYXJ5IHNlcmlhbGl6YXRpb24gZm9ybWF0IGFuZCBJREwNCiAgKGludGVyZmFjZSBk ZXNjcmlwdGlvbiBsYW5ndWFnZSkgZmlyc3QgaW50cm9kdWNlZCBieSBHb29nbGUgaW4gdGhlDQog IGVhcmx5IDAwcywgYW5kIHN0aWxsIGluIHBlcnZhc2l2ZSB1c2UgdGhlcmUgYW5kIGVsc2V3aGVy ZS4gSXQgaXMNCiAgZmFzdGVyICh0byBlbmNvZGUvZGVjb2RlKSBhbmQgbW9yZSBjb21wYWN0IHRo YW4gSlNPTiwgYW5kIGlzIGRlc2lnbmVkDQogIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IG9u IHRoZSB3aXJlLg0KDQogIEFueXdheSwgdGhpcyBuZXcgbWFqb3IgcmVsZWFzZSBpcyAqYnJlYWtp bmcqIGJlY2F1c2UgaXQgZmluYWxseQ0KICBmb2xsb3dzIHRoZSBzdGFuZGFyZCdzIHNlbWFudGlj cyBhYm91dCBbX2ZpZWxkIHByZXNlbmNlX10uIEJ5IGRlZmF1bHQsDQogIG1hbnkgZmllbGRzIGlu IHByb3RvYnVmIGFyZSBzb21ld2hhdCBvcHRpb25hbFteMV0gYW5kIGFyZSBub3QNCiAgc2VyaWFs aXplZCBhdCBhbGwgaWYgbm90IHByZXNlbnQuIE9jYW1sLXByb3RvYyBub3cgdHJhY2tzIHRoaXMg Zm9yDQogIGV2ZXJ5IG5vbi1yZXF1aXJlZCBmaWVsZCwgZXZlbiBzY2FsYXJzLCBtb3ZpbmcgdG93 YXJkcyBiZXR0ZXINCiAgY29tcGxpYW5jZSB3aXRoIHRoZSBzdGFuZGFyZC4gSXQgZG9lcyB0aGF0 IGVpdGhlciB2aWEgYG9wdGlvbicgb3IgdmlhDQogIGEgcHJlc2VuY2UgYml0ZmllbGQuIEJlY2F1 c2Ugb2YgdGhpcywgdGhlIGdlbmVyYXRlZCBjb2RlIGhhcyBjaGFuZ2VkDQogIHNpZ25pZmljYW50 bHkgYW5kIGxvb2tzIG1vcmUgbGlrZSB3aGF0IHRoZSBvZmZpY2lhbCBgcHJvdG9jJyBwcm9kdWNl cy4NCg0KICBJbiBhIG51dHNoZWxsLCBlYWNoIHByb3RvYnVmIG1lc3NhZ2Ugbm93IGJlY29tZXMg YSBwcml2YXRlIHJlY29yZCB0eXBlDQogIHdpdGggbXV0YWJsZSBmaWVsZHMgYW5kIGEgcHJlc2Vu Y2UgYml0ZmllbGQuIEFsbCBtb2RpZmljYXRpb24gYW5kDQogIGNyZWF0aW9uIGZvciBhIHR5cGUg YGZvbycgaXMgZG9uZSB2aWEgYG1ha2VfZm9vJyBhbmQgYGZvb19zZXRfPGZpZWxkPicNCiAgZnVu Y3Rpb25zOyBwcmVzZW5jZSBjYW4gYmUgY2hlY2tlZCB3aXRoIGBmb29faGFzXzxmaWVsZD4nLiBU aGlzIG1lYW5zDQogIHRoZSBydW50aW1lIGtub3dzIHdoaWNoIGZpZWxkcyBoYXZlIGJlZW4gZXhw bGljaXRseSBtb2RpZmllZC4NCg0KICBJIGRvbid0IHRoaW5rIG9jYW1sLXByb3RvYyBpcyAxMDAl IGNvbXBsaWFudCB3aXRoIHRoZSBmaW5lIHByaW50IG9uDQogIGRlZmF1bHQgdmFsdWVzIGluIHBy b3RvMywgZXRjLiBidXQgdGhpcyBpcyBhIGxvdCBjbG9zZXIgdGhhbiBpdCB1c2VkDQogIHRvIGJl LiBUaGFua3MgdG8gdGhlIHdvcmsgb2YgW0BsdXB1c10gdGhlcmUncyBhbHNvIGEgbmV3IG9wdGlv bg0KICB2YWxpZGF0aW9uIGxheWVyLg0KDQoNCltvY2FtbC1wcm90b2NdIDxodHRwczovL2dpdGh1 Yi5jb20vbXJhbnNhbi9vY2FtbC1wcm90b2MvPg0KDQpbcHJvdG9idWZdIDxodHRwczovL3Byb3Rv YnVmLmRldj4NCg0KW1Byb3RvYnVmXSA8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvUHJv dG9jb2xfQnVmZmVycz4NCg0KW19maWVsZCBwcmVzZW5jZV9dDQo8aHR0cHM6Ly9wcm90b2J1Zi5k ZXYvcHJvZ3JhbW1pbmctZ3VpZGVzL2ZpZWxkX3ByZXNlbmNlLz4NCg0KW0BsdXB1c10gPGh0dHBz Oi8vZ2l0aHViLmNvbS9MdXB1cz4NCg0KZGV0YWlsZWQgZXhhbXBsZQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTGV0J3MgbG9vayBhdCB0aGlz IHNpbXBsZSBleGFtcGxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHN5bnRheCA9ICJwcm90 bzMiOw0KICDilIIgDQogIOKUgiBtZXNzYWdlIFBlcnNvbiB7DQogIOKUgiAgIHN0cmluZyBuYW1l ID0gMTsNCiAg4pSCICAgc2ludDY0IGFnZSA9IDI7DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIG1l c3NhZ2UgU3RvcmUgew0KICDilIIgICBzdHJpbmcgYWRkcmVzcyA9IDE7DQogIOKUgiAgIHJlcGVh dGVkIFBlcnNvbiBlbXBsb3llZXMgPSAyOw0KICDilIIgICByZXBlYXRlZCBQZXJzb24gY2xpZW50 cyA9IDM7DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIG1lc3NhZ2UgQ29tcGFueSB7DQogIOKUgiAg IHN0cmluZyBuYW1lID0gMTsNCiAg4pSCICAgcmVwZWF0ZWQgU3RvcmUgc3RvcmVzID0gMjsNCiAg 4pSCICAgcmVwZWF0ZWQgQ29tcGFueSBzdWJzaWRpYXJpZXMgPSAzOw0KICDilIIgfQ0KICDilJTi lIDilIDilIDilIANCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICgqIGdlbmVyYXRlZCBmcm9t ICJvcmdjaGFydC5wcm90byIsIGRvIG5vdCBlZGl0ICopDQogIOKUgiANCiAg4pSCICgqKiB7MiBU eXBlc30gKikNCiAg4pSCIA0KICDilIIgdHlwZSBwZXJzb24gPSB7DQogIOKUgiAgIG5hbWUgOiBz dHJpbmc7DQogIOKUgiAgIGFnZSA6IGludDY0Ow0KICDilIIgfQ0KICDilIIgDQogIOKUgiB0eXBl IHN0b3JlID0gew0KICDilIIgICBhZGRyZXNzIDogc3RyaW5nOw0KICDilIIgICBlbXBsb3llZXMg OiBwZXJzb24gbGlzdDsNCiAg4pSCICAgY2xpZW50cyA6IHBlcnNvbiBsaXN0Ow0KICDilIIgfQ0K ICDilIIgDQogIOKUgiB0eXBlIGNvbXBhbnkgPSB7DQogIOKUgiAgIG5hbWUgOiBzdHJpbmc7DQog IOKUgiAgIHN0b3JlcyA6IHN0b3JlIGxpc3Q7DQogIOKUgiAgIHN1YnNpZGlhcmllcyA6IGNvbXBh bnkgbGlzdDsNCiAg4pSCIH0NCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgQmFzaWMgdmFs dWVzfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVmYXVsdF9wZXJzb24gOiANCiAg4pSCICAgP25h bWU6c3RyaW5nIC0+DQogIOKUgiAgID9hZ2U6aW50NjQgLT4NCiAg4pSCICAgdW5pdCAtPg0KICDi lIIgICBwZXJzb24NCiAg4pSCICgqKiBbZGVmYXVsdF9wZXJzb24gKCldIGlzIHRoZSBkZWZhdWx0 IHZhbHVlIGZvciB0eXBlIFtwZXJzb25dICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X3N0 b3JlIDogDQogIOKUgiAgID9hZGRyZXNzOnN0cmluZyAtPg0KICDilIIgICA/ZW1wbG95ZWVzOnBl cnNvbiBsaXN0IC0+DQogIOKUgiAgID9jbGllbnRzOnBlcnNvbiBsaXN0IC0+DQogIOKUgiAgIHVu aXQgLT4NCiAg4pSCICAgc3RvcmUNCiAg4pSCICgqKiBbZGVmYXVsdF9zdG9yZSAoKV0gaXMgdGhl IGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgW3N0b3JlXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVm YXVsdF9jb21wYW55IDogDQogIOKUgiAgID9uYW1lOnN0cmluZyAtPg0KICDilIIgICA/c3RvcmVz OnN0b3JlIGxpc3QgLT4NCiAg4pSCICAgP3N1YnNpZGlhcmllczpjb21wYW55IGxpc3QgLT4NCiAg 4pSCICAgdW5pdCAtPg0KICDilIIgICBjb21wYW55DQogIOKUgiAoKiogW2RlZmF1bHRfY29tcGFu eSAoKV0gaXMgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiAN CiAg4pSCIA0KICDilIIgKCoqIHsyIEZvcm1hdHRlcnN9ICopDQogIOKUgiANCiAg4pSCIHZhbCBw cF9wZXJzb24gOiBGb3JtYXQuZm9ybWF0dGVyIC0+IHBlcnNvbiAtPiB1bml0IA0KICDilIIgKCoq IFtwcF9wZXJzb24gdl0gZm9ybWF0cyB2ICopDQogIOKUgiANCiAg4pSCIHZhbCBwcF9zdG9yZSA6 IEZvcm1hdC5mb3JtYXR0ZXIgLT4gc3RvcmUgLT4gdW5pdCANCiAg4pSCICgqKiBbcHBfc3RvcmUg dl0gZm9ybWF0cyB2ICopDQogIOKUgiANCiAg4pSCIHZhbCBwcF9jb21wYW55IDogRm9ybWF0LmZv cm1hdHRlciAtPiBjb21wYW55IC0+IHVuaXQgDQogIOKUgiAoKiogW3BwX2NvbXBhbnkgdl0gZm9y bWF0cyB2ICopDQogIOKUgiANCiAg4pSCIA0KICDilIIgKCoqIHsyIFByb3RvYnVmIEVuY29kaW5n fSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZW5jb2RlX3BiX3BlcnNvbiA6IHBlcnNvbiAtPiBQYnJ0 LkVuY29kZXIudCAtPiB1bml0DQogIOKUgiAoKiogW2VuY29kZV9wYl9wZXJzb24gdiBlbmNvZGVy XSBlbmNvZGVzIFt2XSB3aXRoIHRoZSBnaXZlbiBbZW5jb2Rlcl0gKikNCiAg4pSCIA0KICDilIIg dmFsIGVuY29kZV9wYl9zdG9yZSA6IHN0b3JlIC0+IFBicnQuRW5jb2Rlci50IC0+IHVuaXQNCiAg 4pSCICgqKiBbZW5jb2RlX3BiX3N0b3JlIHYgZW5jb2Rlcl0gZW5jb2RlcyBbdl0gd2l0aCB0aGUg Z2l2ZW4gW2VuY29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBlbmNvZGVfcGJfY29tcGFueSA6 IGNvbXBhbnkgLT4gUGJydC5FbmNvZGVyLnQgLT4gdW5pdA0KICDilIIgKCoqIFtlbmNvZGVfcGJf Y29tcGFueSB2IGVuY29kZXJdIGVuY29kZXMgW3ZdIHdpdGggdGhlIGdpdmVuIFtlbmNvZGVyXSAq KQ0KICDilIIgDQogIOKUgiANCiAg4pSCICgqKiB7MiBQcm90b2J1ZiBEZWNvZGluZ30gKikNCiAg 4pSCIA0KICDilIIgdmFsIGRlY29kZV9wYl9wZXJzb24gOiBQYnJ0LkRlY29kZXIudCAtPiBwZXJz b24NCiAg4pSCICgqKiBbZGVjb2RlX3BiX3BlcnNvbiBkZWNvZGVyXSBkZWNvZGVzIGEgW3BlcnNv bl0gYmluYXJ5IHZhbHVlIGZyb20gW2RlY29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWNv ZGVfcGJfc3RvcmUgOiBQYnJ0LkRlY29kZXIudCAtPiBzdG9yZQ0KICDilIIgKCoqIFtkZWNvZGVf cGJfc3RvcmUgZGVjb2Rlcl0gZGVjb2RlcyBhIFtzdG9yZV0gYmluYXJ5IHZhbHVlIGZyb20gW2Rl Y29kZXJdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWNvZGVfcGJfY29tcGFueSA6IFBicnQuRGVj b2Rlci50IC0+IGNvbXBhbnkNCiAg4pSCICgqKiBbZGVjb2RlX3BiX2NvbXBhbnkgZGVjb2Rlcl0g ZGVjb2RlcyBhIFtjb21wYW55XSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rlcl0gKikNCiAg4pSC IGBgYA0KICDilIIgDQogIOKUgiBuZXcgY29kZToNCiAg4pSCIA0KICDilIIgYGBgb2NhbWwNCiAg 4pSCIA0KICDilIIgKCoqIENvZGUgZm9yIG9yZ2NoYXJ0LnByb3RvICopDQogIOKUgiANCiAg4pSC ICgqIGdlbmVyYXRlZCBmcm9tICJvcmdjaGFydC5wcm90byIsIGRvIG5vdCBlZGl0ICopDQogIOKU giANCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgVHlwZXN9ICopDQogIOKUgiANCiAg4pSC IHR5cGUgcGVyc29uID0gcHJpdmF0ZSB7DQogIOKUgiAgIG11dGFibGUgX3ByZXNlbmNlOiBQYnJ0 LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMiBmaWVsZHMgKikNCiAg4pSCICAgbXV0YWJs ZSBuYW1lIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxlIGFnZSA6IGludDY0Ow0KICDilIIgfQ0K ICDilIIgDQogIOKUgiB0eXBlIHN0b3JlID0gcHJpdmF0ZSB7DQogIOKUgiAgIG11dGFibGUgX3By ZXNlbmNlOiBQYnJ0LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMSBmaWVsZHMgKikNCiAg 4pSCICAgbXV0YWJsZSBhZGRyZXNzIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxlIGVtcGxveWVl cyA6IHBlcnNvbiBsaXN0Ow0KICDilIIgICBtdXRhYmxlIGNsaWVudHMgOiBwZXJzb24gbGlzdDsN CiAg4pSCIH0NCiAg4pSCIA0KICDilIIgdHlwZSBjb21wYW55ID0gcHJpdmF0ZSB7DQogIOKUgiAg IG11dGFibGUgX3ByZXNlbmNlOiBQYnJ0LkJpdGZpZWxkLnQ7ICgqKiBwcmVzZW5jZSBmb3IgMSBm aWVsZHMgKikNCiAg4pSCICAgbXV0YWJsZSBuYW1lIDogc3RyaW5nOw0KICDilIIgICBtdXRhYmxl IHN0b3JlcyA6IHN0b3JlIGxpc3Q7DQogIOKUgiAgIG11dGFibGUgc3Vic2lkaWFyaWVzIDogY29t cGFueSBsaXN0Ow0KICDilIIgfQ0KICDilIIgDQogIOKUgiANCiAg4pSCICgqKiB7MiBCYXNpYyB2 YWx1ZXN9ICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X3BlcnNvbiA6IHVuaXQgLT4gcGVy c29uIA0KICDilIIgKCoqIFtkZWZhdWx0X3BlcnNvbiAoKV0gaXMgYSBuZXcgZW1wdHkgdmFsdWUg Zm9yIHR5cGUgW3BlcnNvbl0gKikNCiAg4pSCIA0KICDilIIgdmFsIGRlZmF1bHRfc3RvcmUgOiB1 bml0IC0+IHN0b3JlIA0KICDilIIgKCoqIFtkZWZhdWx0X3N0b3JlICgpXSBpcyBhIG5ldyBlbXB0 eSB2YWx1ZSBmb3IgdHlwZSBbc3RvcmVdICopDQogIOKUgiANCiAg4pSCIHZhbCBkZWZhdWx0X2Nv bXBhbnkgOiB1bml0IC0+IGNvbXBhbnkgDQogIOKUgiAoKiogW2RlZmF1bHRfY29tcGFueSAoKV0g aXMgYSBuZXcgZW1wdHkgdmFsdWUgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiANCiAg4pSC IA0KICDilIIgKCoqIHsyIE1ha2UgZnVuY3Rpb25zfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgbWFr ZV9wZXJzb24gOiANCiAg4pSCICAgP25hbWU6c3RyaW5nIC0+DQogIOKUgiAgID9hZ2U6aW50NjQg LT4NCiAg4pSCICAgdW5pdCAtPg0KICDilIIgICBwZXJzb24NCiAg4pSCICgqKiBbbWFrZV9wZXJz b24g4oCmICgpXSBpcyBhIGJ1aWxkZXIgZm9yIHR5cGUgW3BlcnNvbl0gKikNCiAg4pSCIA0KICDi lIIgdmFsIGNvcHlfcGVyc29uIDogcGVyc29uIC0+IHBlcnNvbg0KICDilIIgDQogIOKUgiB2YWwg cGVyc29uX2hhc19uYW1lIDogcGVyc29uIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9m IGZpZWxkICJuYW1lIiBpbiBbcGVyc29uXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgcGVyc29uX3Nl dF9uYW1lIDogcGVyc29uIC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQg bmFtZSBpbiBwZXJzb24gKikNCiAg4pSCIA0KICDilIIgdmFsIHBlcnNvbl9oYXNfYWdlIDogcGVy c29uIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9mIGZpZWxkICJhZ2UiIGluIFtwZXJz b25dICopDQogIOKUgiANCiAg4pSCIHZhbCBwZXJzb25fc2V0X2FnZSA6IHBlcnNvbiAtPiBpbnQ2 NCAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgYWdlIGluIHBlcnNvbiAqKQ0KICDilIIg DQogIOKUgiB2YWwgbWFrZV9zdG9yZSA6IA0KICDilIIgICA/YWRkcmVzczpzdHJpbmcgLT4NCiAg 4pSCICAgP2VtcGxveWVlczpwZXJzb24gbGlzdCAtPg0KICDilIIgICA/Y2xpZW50czpwZXJzb24g bGlzdCAtPg0KICDilIIgICB1bml0IC0+DQogIOKUgiAgIHN0b3JlDQogIOKUgiAoKiogW21ha2Vf c3RvcmUg4oCmICgpXSBpcyBhIGJ1aWxkZXIgZm9yIHR5cGUgW3N0b3JlXSAqKQ0KICDilIIgDQog IOKUgiB2YWwgY29weV9zdG9yZSA6IHN0b3JlIC0+IHN0b3JlDQogIOKUgiANCiAg4pSCIHZhbCBz dG9yZV9oYXNfYWRkcmVzcyA6IHN0b3JlIC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9m IGZpZWxkICJhZGRyZXNzIiBpbiBbc3RvcmVdICopDQogIOKUgiANCiAg4pSCIHZhbCBzdG9yZV9z ZXRfYWRkcmVzcyA6IHN0b3JlIC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmll bGQgYWRkcmVzcyBpbiBzdG9yZSAqKQ0KICDilIIgDQogIOKUgiB2YWwgc3RvcmVfc2V0X2VtcGxv eWVlcyA6IHN0b3JlIC0+IHBlcnNvbiBsaXN0IC0+IHVuaXQNCiAg4pSCICAgKCoqIHNldCBmaWVs ZCBlbXBsb3llZXMgaW4gc3RvcmUgKikNCiAg4pSCIA0KICDilIIgdmFsIHN0b3JlX3NldF9jbGll bnRzIDogc3RvcmUgLT4gcGVyc29uIGxpc3QgLT4gdW5pdA0KICDilIIgICAoKiogc2V0IGZpZWxk IGNsaWVudHMgaW4gc3RvcmUgKikNCiAg4pSCIA0KICDilIIgdmFsIG1ha2VfY29tcGFueSA6IA0K ICDilIIgICA/bmFtZTpzdHJpbmcgLT4NCiAg4pSCICAgP3N0b3JlczpzdG9yZSBsaXN0IC0+DQog IOKUgiAgID9zdWJzaWRpYXJpZXM6Y29tcGFueSBsaXN0IC0+DQogIOKUgiAgIHVuaXQgLT4NCiAg 4pSCICAgY29tcGFueQ0KICDilIIgKCoqIFttYWtlX2NvbXBhbnkg4oCmICgpXSBpcyBhIGJ1aWxk ZXIgZm9yIHR5cGUgW2NvbXBhbnldICopDQogIOKUgiANCiAg4pSCIHZhbCBjb3B5X2NvbXBhbnkg OiBjb21wYW55IC0+IGNvbXBhbnkNCiAg4pSCIA0KICDilIIgdmFsIGNvbXBhbnlfaGFzX25hbWUg OiBjb21wYW55IC0+IGJvb2wNCiAg4pSCICAgKCoqIHByZXNlbmNlIG9mIGZpZWxkICJuYW1lIiBp biBbY29tcGFueV0gKikNCiAg4pSCIA0KICDilIIgdmFsIGNvbXBhbnlfc2V0X25hbWUgOiBjb21w YW55IC0+IHN0cmluZyAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgbmFtZSBpbiBjb21w YW55ICopDQogIOKUgiANCiAg4pSCIHZhbCBjb21wYW55X3NldF9zdG9yZXMgOiBjb21wYW55IC0+ IHN0b3JlIGxpc3QgLT4gdW5pdA0KICDilIIgICAoKiogc2V0IGZpZWxkIHN0b3JlcyBpbiBjb21w YW55ICopDQogIOKUgiANCiAg4pSCIHZhbCBjb21wYW55X3NldF9zdWJzaWRpYXJpZXMgOiBjb21w YW55IC0+IGNvbXBhbnkgbGlzdCAtPiB1bml0DQogIOKUgiAgICgqKiBzZXQgZmllbGQgc3Vic2lk aWFyaWVzIGluIGNvbXBhbnkgKikNCiAg4pSCIA0KICDilIIgDQogIOKUgiAoKiogezIgRm9ybWF0 dGVyc30gKikNCiAg4pSCIA0KICDilIIgdmFsIHBwX3BlcnNvbiA6IEZvcm1hdC5mb3JtYXR0ZXIg LT4gcGVyc29uIC0+IHVuaXQgDQogIOKUgiAoKiogW3BwX3BlcnNvbiB2XSBmb3JtYXRzIHYgKikN CiAg4pSCIA0KICDilIIgdmFsIHBwX3N0b3JlIDogRm9ybWF0LmZvcm1hdHRlciAtPiBzdG9yZSAt PiB1bml0IA0KICDilIIgKCoqIFtwcF9zdG9yZSB2XSBmb3JtYXRzIHYgKikNCiAg4pSCIA0KICDi lIIgdmFsIHBwX2NvbXBhbnkgOiBGb3JtYXQuZm9ybWF0dGVyIC0+IGNvbXBhbnkgLT4gdW5pdCAN CiAg4pSCICgqKiBbcHBfY29tcGFueSB2XSBmb3JtYXRzIHYgKikNCiAg4pSCIA0KICDilIIgDQog IOKUgiAoKiogezIgUHJvdG9idWYgRW5jb2Rpbmd9ICopDQogIOKUgiANCiAg4pSCIHZhbCBlbmNv ZGVfcGJfcGVyc29uIDogcGVyc29uIC0+IFBicnQuRW5jb2Rlci50IC0+IHVuaXQNCiAg4pSCICgq KiBbZW5jb2RlX3BiX3BlcnNvbiB2IGVuY29kZXJdIGVuY29kZXMgW3ZdIHdpdGggdGhlIGdpdmVu IFtlbmNvZGVyXSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZW5jb2RlX3BiX3N0b3JlIDogc3RvcmUg LT4gUGJydC5FbmNvZGVyLnQgLT4gdW5pdA0KICDilIIgKCoqIFtlbmNvZGVfcGJfc3RvcmUgdiBl bmNvZGVyXSBlbmNvZGVzIFt2XSB3aXRoIHRoZSBnaXZlbiBbZW5jb2Rlcl0gKikNCiAg4pSCIA0K ICDilIIgdmFsIGVuY29kZV9wYl9jb21wYW55IDogY29tcGFueSAtPiBQYnJ0LkVuY29kZXIudCAt PiB1bml0DQogIOKUgiAoKiogW2VuY29kZV9wYl9jb21wYW55IHYgZW5jb2Rlcl0gZW5jb2RlcyBb dl0gd2l0aCB0aGUgZ2l2ZW4gW2VuY29kZXJdICopDQogIOKUgiANCiAg4pSCIA0KICDilIIgKCoq IHsyIFByb3RvYnVmIERlY29kaW5nfSAqKQ0KICDilIIgDQogIOKUgiB2YWwgZGVjb2RlX3BiX3Bl cnNvbiA6IFBicnQuRGVjb2Rlci50IC0+IHBlcnNvbg0KICDilIIgKCoqIFtkZWNvZGVfcGJfcGVy c29uIGRlY29kZXJdIGRlY29kZXMgYSBbcGVyc29uXSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rl cl0gKikNCiAg4pSCIA0KICDilIIgdmFsIGRlY29kZV9wYl9zdG9yZSA6IFBicnQuRGVjb2Rlci50 IC0+IHN0b3JlDQogIOKUgiAoKiogW2RlY29kZV9wYl9zdG9yZSBkZWNvZGVyXSBkZWNvZGVzIGEg W3N0b3JlXSBiaW5hcnkgdmFsdWUgZnJvbSBbZGVjb2Rlcl0gKikNCiAg4pSCIA0KICDilIIgdmFs IGRlY29kZV9wYl9jb21wYW55IDogUGJydC5EZWNvZGVyLnQgLT4gY29tcGFueQ0KICDilIIgKCoq IFtkZWNvZGVfcGJfY29tcGFueSBkZWNvZGVyXSBkZWNvZGVzIGEgW2NvbXBhbnldIGJpbmFyeSB2 YWx1ZSBmcm9tIFtkZWNvZGVyXSAqKQ0KICDilJTilIDilIDilIDilIANCg0KICBbXjFdOiB0aGUg cHJlY2lzZSBzZW1hbnRpY3Mgb2YgcHJlc2VuY2UgYXJlLCBpbWhvLCBxdWl0ZSBtZXNzeS4NCg0K DQpDbWRsaW5lciAyLjEuMCDigJMgVGhlIHBvd2Vyc2hlbGwgZWRpdGlvbg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tY21kbGluZXItMi0xLTAt dGhlLXBvd2Vyc2hlbGwtZWRpdGlvbi8xNzUyNy8xPg0KDQoNCkJyaWFuIFdhcmQgYW5ub3VuY2Vk DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZWxsbywNCg0KICBJdCdzIG15IHBsZWFzdXJlIHRvIGFubm91bmNlIHRoZSB2 ZXJzaW9uIDIuMS4wIG9mIGNtZGxpbmVyDQoNCiAgICAgICAgQ21kbGluZXIgaXMgYW4gSVNDLWxp Y2Vuc2VkIGxpYnJhcnkgdGhhdCBhbGxvd3MgdGhlDQogICAgICAgIGRlY2xhcmF0aXZlIGFuZCBj b21wb3NpdGlvbmFsIGRlZmluaXRpb24gb2YgY29tbWFuZCBsaW5lcw0KICAgICAgICB3aXRoIGV4 Y2VsbGVudCBzdXBwb3J0IGZvciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlIHVzZXINCiAgICAgICAg Y29udmVudGlvbnMgYW5kIHN0YW5kYXJkcy4NCg0KICBUaGlzIHJlbGVhc2VzIGNvbnNvbGlkYXRl cyBhZGRpdGlvbmFsIHdvcmsgb24gY29tbWFuZCBsaW5lDQogIGNvbXBsZXRpb24uIEkgYWRkZWQ6 DQoNCiAg4oCiIFN1cHBvcnQgZm9yIHBvd2Vyc2hlbGwgYXV0by1jb21wbGV0aW9uIChbZGV0YWls c10pLg0KICDigKIgU2lnbmlmaWNhbnQgaW1wcm92ZW1lbnRzIHRvIHRoZSBgYmFzaCcgY29tcGxl dGlvbi4NCiAg4oCiIFVwZGF0ZWQgW2BkdW5lJyBpbnN0YWxsIGluc3RydWN0aW9uc10gaW4gdGhl IGNvb2tib29rLg0KDQogIEknZCBsaWtlIHRvIHRoYW5rIEBkYnVlbnpsaSBmb3IgaGlzIGdyYWNp b3VzIGZlZWRiYWNrIG9uIHRoZXNlDQogIGNoYW5nZXMsIGFuZCBpbXBvcnRhbnRseSBmb3IgdGVs bGluZyBtZSDigJxub+KAnSB0byBzZXZlcmFsIG90aGVycw0KICBiZWZvcmVoYW5kIDopDQoNCiAg Rm9yIGFsbCB0aGUgb3RoZXIgZGV0YWlscyBzZWUgdGhlIFtyZWxlYXNlIG5vdGVzXS4NCg0KICDi gKIgSG9tZXBhZ2U6IDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9jbWRsaW5lcj4NCiAg 4oCiIERvY3M6IDxodHRwczovL2VycmF0aXF1ZS5jaC9zb2Z0d2FyZS9kb2M+IG9yIGBvZGlnIGRv YyBjbWRsaW5lcicNCiAg4oCiIEluc3RhbGw6IGBvcGFtIGluc3RhbGwgY21kbGluZXInIChvbmNl IFt0aGUgUFJdIGlzIG1lcmdlZCwgbWF5IHRha2UNCiAgICBhIGZldyBkYXlzKQ0KDQoNCltkZXRh aWxzXQ0KPGh0dHBzOi8vZXJyYXRpcXVlLmNoL3NvZnR3YXJlL2NtZGxpbmVyL2RvYy9jbGkuaHRt bCN1c2VyX3B3c2g+DQoNCltgZHVuZScgaW5zdGFsbCBpbnN0cnVjdGlvbnNdDQo8aHR0cHM6Ly9l cnJhdGlxdWUuY2gvc29mdHdhcmUvY21kbGluZXIvZG9jL2Nvb2tib29rLmh0bWwjdG9wX3Rvb2xf c3VwcG9ydF93aXRoX2R1bmVfaW5zdGFsbD4NCg0KW3JlbGVhc2Ugbm90ZXNdDQo8aHR0cHM6Ly9n aXRodWIuY29tL2RidWVuemxpL2NtZGxpbmVyL2Jsb2IvbWFzdGVyL0NIQU5HRVMubWQ+DQoNClt0 aGUgUFJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjg5 NjI+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBh dCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW1JlYWRpbmcgdGhlIEdhcyBNZXRl cl0NCiAg4oCiIFtFbmFibGluZyBTU0ggaW4gQXp1cmUgQXBwIFNlcnZpY2UgZm9yIE9DYW1sIENv bnRhaW5lcnM6IEENCiAgICBQcm9kdWN0aW9uIEpvdXJuZXldDQogIOKAoiBbQSBWaXNpb24gZm9y IE9DYW1sIGluIHRoZSBBSSBFcmEgLSBUaGliYXV0IE1hdHRpbyAtIEZVTiBPQ2FtbCAyMDI1XQ0K ICDigKIgW09DYW1sIGF0IExleGlGaSAtIE5pY29sw6FzIE9qZWRhIELDpHIgLSBGVU4gT0NhbWwg MjAyNV0NCiAg4oCiIFtUZXN0aW5nIGEgcHJpb3JpdHkgcXVldWUgd2l0aCBNb25vbGl0aF0NCiAg 4oCiIFtMaW51eCBtb2RlIHNldHRpbmcsIGZyb20gdGhlIGNvbWZvcnQgb2YgT0NhbWxdDQogIOKA oiBbT0NhbWwgb24gYSBSYXNwYmVycnkgUGldDQogIOKAoiBbSSBDYW4gU2VlIFRoZSBQaXhlbHM6 IERlc2lnbmluZyBDcm9zcy1TdGl0Y2ggUGF0dGVybnMgaW4gT0NhbWwgLQ0KICAgIE1pbmR5IFBy ZXN0b24gLSBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtGcmFtZXdvcmtzOiBObywgTGlicmFyaWVz OiBZZXMuIERldmVsb3BpbmcgYSBwcm9kdWN0IGluIE9DYW1sIGZyb20NCiAgICBTY3JhdGNoIC0g RlVOIE9DYW1sIDIwMjVdDQogIOKAoiBbUHVyZWx5IGZ1bmN0aW9uYWwgZ1JQQyBhbmQgSFRUUC8y IHdpdGggT0NhbWwgLSBBZGFtIENob2xld2luzIFza2kgLQ0KICAgIEZVTiBPQ2FtbCAyMDI1XQ0K ICDigKIgW0Fubm91bmNpbmcgVW5pa3JhZnQgU3VwcG9ydCBmb3IgTWlyYWdlT1MgVW5pa2VybmVs c10NCiAg4oCiIFtBbmFseXppbmcgUHJvZ3JhbXMgd2l0aCBTTVQgU29sdmVycyAtIFRpa2hvbiBK ZWx2aXMgLSBGVU4gT0NhbWwNCiAgICAyMDI1XQ0KICDigKIgW1NsaXBzaG93OiBBIEZ1bGwtRmVh dHVyZWQgUHJlc2VudGF0aW9uIFRvb2wgaW4gT0NhbWwgLSBQYXVsLUVsbGlvdA0KICAgIEFuZ2zD qHMgZCdBdXJpYWMgLSBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtPbiB0aGUgcGF0aCB0byB0aGUg VUsvSW5kaWEgQUkgU3VtbWl0IHdpdGggT3BlblVLIGFuZCB0aGUgQVRJXQ0KICDigKIgWzB4Q2Ft bCBGcm9tIGEgU3lzdGVtIEVuZ2luZWVyJ3MgUG9pbnQgb2YgVmlldyAtIERtaXRyaXkgS292YWxl bmtvIC0NCiAgICBGVU4gT0NhbWwgMjAyNV0NCiAg4oCiIFtQZXJmb3JtYW5jZSBQaXRmYWxsczog VGFsZXMgRnJvbSBhIFB5dGhvbi9PQ2FtbCBDb2RlYmFzZSAtIEVtbWEgSmluDQogICAgLSBGVU4g T0NhbWwgMjAyNV0NCiAg4oCiIFtHZW5lcmF0aW5nIFN0YXRpYyBXZWJzaXRlcyB0aGUgRnVuY3Rp b25hbCBQcm9ncmFtbWluZyBXYXkgLSBYYXZpZXINCiAgICBWYW4gZGUgV29lc3R5bmUgLSBGVU4g T0NhbWwgMjAyNV0NCiAg4oCiIFtGcm9tIE9DYW1sIDQgdG8gNSBhbmQgZnJvbSBQYXJtYXAgdG8g RWZmZWN0czogQSBsZWdhY3kgY29kZQ0KICAgIHRyYW5zaXRpb24gc3RvcnkgLSBGVU4gT0NhbWwg MjAyNV0NCiAg4oCiIFtDb25leCwgc2VjdXJpbmcgdGhlIG9wYW0tcmVwb3NpdG9yeSwgaXMgbm93 IGluIHByb2R1Y3Rpb25dDQogIOKAoiBbT0NhbWwgUm91bmR1cDogT2N0b2JlciAyMDI1XQ0KDQoN Clt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW1JlYWRp bmcgdGhlIEdhcyBNZXRlcl0gPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMTEvMjMvZ2Fz LW1ldGVyLz4NCg0KW0VuYWJsaW5nIFNTSCBpbiBBenVyZSBBcHAgU2VydmljZSBmb3IgT0NhbWwg Q29udGFpbmVyczogQSBQcm9kdWN0aW9uDQpKb3VybmV5XQ0KPGh0dHBzOi8vZmVhcmZ1bC1vZGRz LnJvY2tzL2Jsb2cvYXp1cmUtc3NoLW9jYW1sLWNvbnRhaW5lcnMtcHJvZHVjdGlvbj4NCg0KW0Eg VmlzaW9uIGZvciBPQ2FtbCBpbiB0aGUgQUkgRXJhIC0gVGhpYmF1dCBNYXR0aW8gLSBGVU4gT0Nh bWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9CQXZYcWQwUWVWTT92ZXJz aW9uPTM+DQoNCltPQ2FtbCBhdCBMZXhpRmkgLSBOaWNvbMOhcyBPamVkYSBCw6RyIC0gRlVOIE9D YW1sIDIwMjVdDQo8aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2gvX3V3dnJhMU5GSmc/dmVy c2lvbj0zPg0KDQpbVGVzdGluZyBhIHByaW9yaXR5IHF1ZXVlIHdpdGggTW9ub2xpdGhdDQo8aHR0 cHM6Ly9jYW1iaXVtLmlucmlhLmZyL2Jsb2cvdGVzdGluZy1hLXByaW9yaXR5LXF1ZXVlLXdpdGgt TW9ub2xpdGg+DQoNCltMaW51eCBtb2RlIHNldHRpbmcsIGZyb20gdGhlIGNvbWZvcnQgb2YgT0Nh bWxdDQo8aHR0cHM6Ly9yb3NjaWR1cy5jb20vYmxvZy9ibG9nLzIwMjUvMTEvMTYvbGliZHJtLW9j YW1sLz4NCg0KW09DYW1sIG9uIGEgUmFzcGJlcnJ5IFBpXQ0KPGh0dHBzOi8vd3d3LnR1bmJ1cnku b3JnLzIwMjUvMTEvMTUvb2NhbWwtcmFzcGJlcnJ5LXBpLz4NCg0KW0kgQ2FuIFNlZSBUaGUgUGl4 ZWxzOiBEZXNpZ25pbmcgQ3Jvc3MtU3RpdGNoIFBhdHRlcm5zIGluIE9DYW1sIC0gTWluZHkNClBy ZXN0b24gLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9R Mi1xSXJZelNYdz92ZXJzaW9uPTM+DQoNCltGcmFtZXdvcmtzOiBObywgTGlicmFyaWVzOiBZZXMu IERldmVsb3BpbmcgYSBwcm9kdWN0IGluIE9DYW1sIGZyb20NClNjcmF0Y2ggLSBGVU4gT0NhbWwg MjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC8wSHdkN054UThfYz92ZXJzaW9u PTM+DQoNCltQdXJlbHkgZnVuY3Rpb25hbCBnUlBDIGFuZCBIVFRQLzIgd2l0aCBPQ2FtbCAtIEFk YW0gQ2hvbGV3aW7MgXNraSAtIEZVTg0KT0NhbWwgMjAyNV0gPGh0dHBzOi8vd3d3LnlvdXR1YmUu Y29tL3dhdGNoL2V4UjVlV1NRXzhvP3ZlcnNpb249Mz4NCg0KW0Fubm91bmNpbmcgVW5pa3JhZnQg U3VwcG9ydCBmb3IgTWlyYWdlT1MgVW5pa2VybmVsc10NCjxodHRwczovL3RhcmlkZXMuY29tL2Js b2cvMjAyNS0xMS0xMy1hbm5vdW5jaW5nLXVuaWtyYWZ0LXN1cHBvcnQtZm9yLW1pcmFnZW9zLXVu aWtlcm5lbHM+DQoNCltBbmFseXppbmcgUHJvZ3JhbXMgd2l0aCBTTVQgU29sdmVycyAtIFRpa2hv biBKZWx2aXMgLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRj aC9CTDhibXRCZmQ3RT92ZXJzaW9uPTM+DQoNCltTbGlwc2hvdzogQSBGdWxsLUZlYXR1cmVkIFBy ZXNlbnRhdGlvbiBUb29sIGluIE9DYW1sIC0gUGF1bC1FbGxpb3QNCkFuZ2zDqHMgZCdBdXJpYWMg LSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC81SE1waUdL SHU5QT92ZXJzaW9uPTM+DQoNCltPbiB0aGUgcGF0aCB0byB0aGUgVUsvSW5kaWEgQUkgU3VtbWl0 IHdpdGggT3BlblVLIGFuZCB0aGUgQVRJXQ0KPGh0dHBzOi8vYW5pbC5yZWNvaWwub3JnL25vdGVz L3BhdGgtdG8tdWstaW5kaWEtYWktc3VtbWl0Pg0KDQpbMHhDYW1sIEZyb20gYSBTeXN0ZW0gRW5n aW5lZXIncyBQb2ludCBvZiBWaWV3IC0gRG1pdHJpeSBLb3ZhbGVua28gLSBGVU4NCk9DYW1sIDIw MjVdIDxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9pUWM1ZkhXNVNaQT92ZXJzaW9uPTM+ DQoNCltQZXJmb3JtYW5jZSBQaXRmYWxsczogVGFsZXMgRnJvbSBhIFB5dGhvbi9PQ2FtbCBDb2Rl YmFzZSAtIEVtbWEgSmluIC0NCkZVTiBPQ2FtbCAyMDI1XSA8aHR0cHM6Ly93d3cueW91dHViZS5j b20vd2F0Y2gvVWZycnlxbHRaVVE/dmVyc2lvbj0zPg0KDQpbR2VuZXJhdGluZyBTdGF0aWMgV2Vi c2l0ZXMgdGhlIEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcgV2F5IC0gWGF2aWVyIFZhbg0KZGUgV29l c3R5bmUgLSBGVU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3d3dy55b3V0dWJlLmNvbS93YXRjaC9y SEdNRDQ5ZWJfaz92ZXJzaW9uPTM+DQoNCltGcm9tIE9DYW1sIDQgdG8gNSBhbmQgZnJvbSBQYXJt YXAgdG8gRWZmZWN0czogQSBsZWdhY3kgY29kZSB0cmFuc2l0aW9uDQpzdG9yeSAtIEZVTiBPQ2Ft bCAyMDI1XQ0KPGh0dHBzOi8vd3d3LnlvdXR1YmUuY29tL3dhdGNoL3pmR2xRWjJwa3NzP3ZlcnNp b249Mz4NCg0KW0NvbmV4LCBzZWN1cmluZyB0aGUgb3BhbS1yZXBvc2l0b3J5LCBpcyBub3cgaW4g cHJvZHVjdGlvbl0NCjxodHRwczovL2hhbm5lcy5yb2J1ci5jb29wL1Bvc3RzL0NvbmV4UnVubmlu Zz4NCg0KW09DYW1sIFJvdW5kdXA6IE9jdG9iZXIgMjAyNV0NCjxodHRwczovL3BhdHJpY2suc2ly cmVmLm9yZy9vY2FtbC1yb3VuZHVwLW9jdG9iZXItMjAyNS8+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2Fu IFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRh a2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJj aGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5 IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxh biBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRA cG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5 bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0 cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 18 to 25, 20= 25.

    Tapak: Experimental Web Framework Based on EIO

    Syaiful Bahri announced

    Hello! I am a newcomer to the OCaml community, and this is my first post.

    I would like to share an experimental web framework I have been working on,= based on Eio. I am a happy user of Dream and Opium, but I felt there was s= till room for improvement.

    I=E2=80=99ve shared my motivation here: https://www.sbahri.com/projects/tapak/

    I would love to hear your suggestions and opinions regarding the API. What = important features do you feel are missing in existing libraries? Personall= y, I miss the type-safe routing that Servant offers, as well as the Phoenix= real-time API.

    FUN OCaml is live on YouTube and Twitch

    Continuing this thread, Sabine Schmaltz announced

    After hiding the original live stream recording, and starting to publish th= e talk recordings individually on the YouTube channel at https://www.youtube.com/@FUNOCaml, we're al= most done listing all the talks!

    https://yout= u.be/0Hwd7NxQ8_c?si=3DPkrJtJXPYS1kSAyg

    Native debugging on macOS (DWARF support)

    Joel Reymont announced

    With DWARF v5 support, the compiler now includes proper debug info =E2=80= =94 line mappings, symbols, and variable names =E2=80=94 so LLDB can actual= ly follow your code.

    A small LLDB Python plug-in reads OCaml values at runtime and prints them i= n a readable form: lists, tuples, closures, strings, etc. It follows DWARF = location lists to track where each variable lives and uses the runtime head= ers to decode them. The p and ocaml_vars commands= work like normal LLDB commands but understand OCaml values.

    It=E2=80=99s not complete yet (records and variants still show as tuples), = but it makes debugging native OCaml code straightforward. You can finally s= et breakpoints by source, inspect locals, and understand what=E2=80=99s in = memory without switching to disassembly.

    https://joel= .id/native-binary-debugging-for-ocaml/

    Package Hygiene in Alice

    Steve Sherratt announced

    https:= //www.alicecaml.org/blog/package-hygiene-in-alice/

    Alice is an OCaml build system and package manager I'm developing in my spa= re time. This post is about Alice's packaging protocol and how it enforces = hygiene while building packages.

    crypt 2.0 - unix crypt function

    Continuing this thread, Mikhail announced

    Minor update: crypt 2.1.

    We have added a mutex for the POSIX crypt function and a platform-dependent= implementation of crypt, i.e., crypt_r for Linux and FreeBSD. We have also= added the Ffi module for accessing native platform bindings.

    opam 2.5.0~rc1 and opam-publish 2.7.1

    Kate announced

    Hi everyone,

    We are happy to announce the first release candidate of opam 2.5.0, which boasts a grand total of zero (0) changes compared to 2.5.= 0~beta1!

    We also take this opportunity to announce the release of opam-publish 2.7.1, whose full release notes can be seen here.

    Changes in opam-publish 2.7.1

    In 2.7.0, opam-publish changed the way user's branches are pus= hed to their GitHub forks before opening a PR, switching from using SSH key= s to using the GitHub API token that opam-publish already requires.

    2.7.1 fixes a couple of bugs related to that where opam-publis= h stopped working if the GitHub Action workflow files of upstream opam-repo= sitory are changed, owing to the way GitHub token permissions work. Thanks to @filipeom both for= the original contribution in 2.7.0 and for subsequent work on= it in 2.7.1.

    Read our bl= og post for more details.

    Please report any issues to the opam bug-tracker or the opam-publish bug-tracker.

    Try the new opam 2.5.0 release candidate:

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    5.0~rc1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.5.0~rc1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    ocaml-protoc 4.0, pbrt 4.0

    Simon Cruanes announced

    Dear caml riders, I'm happy to announce the release of ocaml-protoc 4.0, alongside its runtim= e libraries pbrt, pbrt_yojson, and pbrt_ser= vices.

    Ocaml-protoc is a pure OCaml implementation of a protobuf compiler and runtime. Protobuf is a binary serialization format and= IDL (interface description language) first introduced by Google in the ear= ly 00s, and still in pervasive use there and elsewhere. It is faster (to en= code/decode) and more compact than JSON, and is designed for backward compa= tibility on the wire.

    Anyway, this new major release is breaking because it finally follow= s the standard's semantics about field presence. By default, many fields in protobuf are somewhat optional[^1] and are n= ot serialized at all if not present. Ocaml-protoc now tracks this for every= non-required field, even scalars, moving towards better compliance with th= e standard. It does that either via option or via a presence b= itfield. Because of this, the generated code has changed significantly and = looks more like what the official protoc produces.

    In a nutshell, each protobuf message now becomes a private record type with= mutable fields and a presence bitfield. All modification and creation for = a type foo is done via make_foo and foo_se= t_<field> functions; presence can be checked with foo_ha= s_<field>. This means the runtime knows which fields have been= explicitly modified.

    I don't think ocaml-protoc is 100% compliant with the fine print on default= values in proto3, etc. but this is a lot closer than it used to be. Thanks= to the work of @lupus there's als= o a new option validation layer.

    detailed example

    Let's look at this simple example:

    syntax =3D "proto3";
    
    message Person {
      string name =3D 1;
      sint64 age =3D 2;
    }
    
    message Store {
      string address =3D 1;
      repeated Person employees =3D 2;
      repeated Person clients =3D 3;
    }
    
    message Company {
      string name =3D 1;
      repeated Store stores =3D 2;
      repeated Company subsidiaries =3D 3;
    }
    
    (* g=
    enerated from "orgchart.proto", do not edit *)
    
    (** {2 Types}type person =3D {
      name : string;
      age : int64;
    }
    
    type store =3D {
      address : string;
      employees : person list;
      clients : person list;
    }
    
    type company =3D {
      name : string;
      stores : store list;
      subsidiaries : company list;
    }
    
    
    (** {2 Basic values} *)
    
    val default_person :=20
      ?name:string -&=
    gt;
      ?age:int64 ->
      unit ->
      person
    (** [default_person ()] is the default value for type [person] *)
    
    val default_store :=20
      ?address:string=
     ->
      ?employees:pers=
    on list ->
      ?clients:person=
     list ->
      unit ->
      store
    (** [default_store ()] is the default value for type [store] *)
    
    val default_company :=20
      ?name:string -&=
    gt;
      ?stores:store l=
    ist ->
      ?subsidiaries:c=
    ompany list ->
      unit ->
      company
    (** [default_company ()] is the default value for type [company] *)
    
    
    (** {2 Formatters} *)
    
    val pp_person : Format.formatter -> person -> unit=20
    (** [pp_person v] formats v *)
    
    val pp_store : Format.formatter -> store -> unit=20
    (** [pp_store v] formats v *)
    
    val pp_company : Format.formatter -> company -> unit=20
    (** [pp_company v] formats v *)
    
    
    (** {2 Protobuf Encoding} *)
    
    val encode_pb_person : person -> Pbrt.Encoder.t -> unit
    (** [encode_pb_person v encoder=
    ] encodes [v] with the given [encoder] *)
    
    val encode_pb_store : store -> Pbrt.Encoder.t -> unit
    (** [encode_pb_store v encoder<=
    span style=3D"color: #804f60; font-style: italic;">] encodes [v]=
     with the given =
    [encoder]=
     *)
    
    val encode_pb_company : company -> Pbrt.Encoder.t -> unit
    (** [encode_pb_company v encode=
    r] encodes [v]] *)
    
    
    (** {2 Protobuf Decoding} *)
    
    val decode_pb_person : Pbrt.Decoder.t -> person
    (** [decode_pb_person decoder] decodes a [person] binary value from [decoder] *)
    
    val decode_pb_store : Pbrt.Decoder.t -> store
    (** [decode_pb_store decoder] decodes a [store] binary value from [decoder]=
     *)
    
    val decode_pb_company : Pbrt.Decoder.t -> company
    (** [decode_pb_company decoder<=
    span style=3D"color: #804f60; font-style: italic;">] decodes a [company] binary value from [decoder] *)
    ```
    
    new code:
    
    ```ocaml
    
    (** Code for orgchart.p=
    roto *)
    
    (* generated from "orgchart.proto", d=
    o not edit *)
    
    
    
    (** {2 Types}type person =3D private {
      mutable _presen=
    ce: Pbrt.Bitfield.t; (** presence for 2 =
    fields *)
      mutable name : =
    string;
      mutable age : i=
    nt64;
    }
    
    type store =3D private {
      mutable _presen=
    ce: Pbrt.Bitfield.t; (** presence for 1 =
    fields *)
      mutable address=
     : string;
      mutable employe=
    es : person list;
      mutable clients=
     : person list;
    }
    
    type company =3D private {
      mutable _presen=
    ce: Pbrt.Bitfield.t; (** presence for 1 =
    fields *)
      mutable name : =
    string;
      mutable stores =
    : store list;
      mutable subsidi=
    aries : company list;
    }
    
    
    (** {2 Basic values} *)
    
    val default_person : unit -> person=20
    (** [default_person ()] is a new empty value for type [person] *)
    
    val default_store : unit -> store=20
    (** [default_store ()] is a new empty value for type [store] *)
    
    val default_company : unit -> company=20
    (** [default_company ()] is a new empty value for type [company] *)
    
    
    (** {2 Make functions} *)
    
    val make_person :=20
      ?name:string -&=
    gt;
      ?age:int64 ->
      unit ->
      person
    (** [make_person … ()] is a builder for type [person] *)
    
    val copy_person : person -> person
    
    val person_has_name : person -> bool
      (** presence of field=
     "name" in [person] *)
    
    val person_set_name : person -> string -> unit
      (** set field name in=
     person *)
    
    val person_has_age : person -> bool
      (** presence of field=
     "age" in [person] *)
    
    val person_set_age : person -> int64 -> unit
      (** set field age in =
    person *)
    
    val make_store :=20
      ?address:string=
     ->
      ?employees:pers=
    on list ->
      ?clients:person=
     list ->
      unit ->
      store
    (** [make_store … ()] is a builder for type [store] *)
    
    val copy_store : store -> store
    
    val store_has_address : store -> bool
      (** presence of field=
     "address" in [<=
    /span>store] *)
    
    val store_set_address : store -> string -> un=
    it
      (** set field address=
     in store *)
    
    val store_set_employees : store -> person list -=
    > unit
      (** set field employe=
    es in store *)
    
    val store_set_clients : store -> person list -&g=
    t; unit
      (** set field clients=
     in store *)
    
    val make_company :=20
      ?name:string -&=
    gt;
      ?stores:store l=
    ist ->
      ?subsidiaries:c=
    ompany list ->
      unit ->
      company
    (** [make_company … ()] is a builder for type [company] *)
    
    val copy_company : company -> company
    
    val company_has_name : company -> bool
      (** presence of field=
     "name" in [company] *)
    
    val company_set_name : company -> string -> u=
    nit
      (** set field name in=
     company *)
    
    val company_set_stores : company -> store list -=
    > unit
      (** set field stores =
    in company *)
    
    val company_set_subsidiaries : company -> compan=
    y list -> unit
      (** set field subsidi=
    aries in company *)
    
    
    (** {2 Formatters} *)
    
    val pp_person : Format.formatter -> person -> unit=20
    (** [pp_person v] formats v *)
    
    val pp_store : Format.formatter -> store -> unit=20
    (** [pp_store v] formats v *)
    
    val pp_company : Format.formatter -> company -> unit=20
    (** [pp_company v] formats v *)
    
    
    (** {2 Protobuf Encoding} *)
    
    val encode_pb_person : person -> Pbrt.Encoder.t -> unit
    (** [encode_pb_person v encoder=
    ] encodes [v] with the given [encoder] *)
    
    val encode_pb_store : store -> Pbrt.Encoder.t -> unit
    (** [encode_pb_store v encoder<=
    span style=3D"color: #804f60; font-style: italic;">] encodes [v]=
     with the given =
    [encoder]=
     *)
    
    val encode_pb_company : company -> Pbrt.Encoder.t -> unit
    (** [encode_pb_company v encode=
    r] encodes [v]] *)
    
    
    (** {2 Protobuf Decoding} *)
    
    val decode_pb_person : Pbrt.Decoder.t -> person
    (** [decode_pb_person decoder] decodes a [person] binary value from [decoder] *)
    
    val decode_pb_store : Pbrt.Decoder.t -> store
    (** [decode_pb_store decoder] decodes a [store] binary value from [decoder]=
     *)
    
    val decode_pb_company : Pbrt.Decoder.t -> company
    (** [decode_pb_company decoder<=
    span style=3D"color: #804f60; font-style: italic;">] decodes a [company] binary value from [decoder] *)
    

    [^1]: the precise semantics of presence are, imho, quite messy.

    Cmdliner 2.1.0 =E2=80=93 The powershell edition

    Brian Ward announced

    Hello,=20

    It's my pleasure to announce the version 2.1.0 of cmdliner

    Cmdliner is an ISC-licensed library that allows the declarative and compositional definition of command lines with excellent support for command line interface user conventions and standards.

    This releases consolidates additional work on command line completion. I ad= ded:

    I'd like to thank @dbuenzli for his gracious feedback on these changes, and= importantly for telling me =E2=80=9Cno=E2=80=9D to several others beforeha= nd :)

    For all the other details see the release notes.

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=mvO1FIy8; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 8B5BC40085 for ; Tue, 2 Dec 2025 10:39:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=yH+AI/5JT12b/50SGygGsOuGB6MJ0A1/0bjlqUMFWQQ=; b=mvO1FIy8Yt82RoOQESfO3AEYGeJ54EzDlojuHaWge588KlOKiU4BCXdm hqAP/7BRGJJASxSZgEZKriX5Pi7rIPS0qJsvPDr1NzmZLJ3diGtkBTWbx T10SK8bDw/Z8z1I3pG3LJGEhY1BJSdboMpUZmSbsGDYxFszAs9FERBz9o k=; X-CSE-ConnectionGUID: wWL4Elz+TrWgF1QfB4BMcA== X-CSE-MsgGUID: B/Mo5DJAR6y/KBPsgttnzg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=Pass smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@sympa.inria.fr Received-SPF: Pass (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr designates 128.93.162.160 as permitted sender) identity=mailfrom; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@sympa.inria.fr) identity=helo; client-ip=128.93.162.160; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@sympa.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.20,242,1758578400"; d="scan'208,217";a="252313810" Received: from prod-listesu18.inria.fr (HELO sympa.inria.fr) ([128.93.162.160]) by mail2-relais-roc.national.inria.fr with ESMTP; 02 Dec 2025 11:39:09 +0100 Received: by sympa.inria.fr (Postfix, from userid 20132) id 7802DE0AF1; Tue, 2 Dec 2025 11:39:09 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by sympa.inria.fr (Postfix) with ESMTPS id 0B371E0157 for ; Tue, 2 Dec 2025 11:39:06 +0100 (CET) X-CSE-ConnectionGUID: c+o4w70LTWegQGaXAPm34A== X-CSE-MsgGUID: uYBZGFzfRZ2R81wh4zeu7g== X-IronPort-AV: E=Sophos;i="6.20,242,1758578400"; d="scan'208,217";a="132528829" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Dec 2025 11:39:06 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 02 Dec 2025 11:39:05 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19407 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: List-Subscribe: List-Unsubscribe: List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of November 25 to December 02, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 avro-simple, an OCaml implementation of Apache Avro Sunsetting of DkML distribution opam 2.5.0 is out! Transient emacs command for dune Slipshow! Two open roles at Tarides: Compiler Engineer and VP of Software Engineering RFSM version 2.2 Alice v0.2.0, now with LSP Gendarme, a modular marshalling library FUN OCaml is live on YouTube and Twitch Other OCaml News Old CWN avro-simple, an OCaml implementation of Apache Avro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Tim McGilchrist announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99ve been building a library for Apache Avro called [avro-simple]= . It is an OCaml implementation of [Apache Avro] with codec-based design, schema evolution support, and container file format. The key principles for this library are: =E2=80=A2 *Value-centric design*: Manual codec construction using combina= tors (no code generation required) =E2=80=A2 *Pure OCaml*: No external C dependencies for core functionality =E2=80=A2 *Schema evolution*: Built-in support for reading data with diff= erent schemas =E2=80=A2 *Container files*: Full support for Avro Object Container File format =E2=80=A2 *Compression*: Multiple compression codecs (null, deflate, snap= py, zstandard) with compression plugins =E2=80=A2 *Streaming*: Memory-efficient block-level streaming for large f= iles =E2=80=A2 *Type-safe*: Codec-enforced types with composable combinators This compares to [ocaml-avro] which uses code generation based on JSON schemas and is missing some of the schema evolution features. I'm mainly using this for reading and writing Avro container files, however it should be possible to integrate with [ocaml-kafka] if you use Kafka. The performance is reasonable so far, 1.4 times slower than the fastest Rust based library I could find and I haven't really tried to optimise it yet. HEAPs faster than the official Apache Avro libraries in Python. There are a few other places I think I can improve the performance and memory usage, but it should be quite usable for small to medium sized files. Enjoy :slight_smile: [avro-simple] [Apache Avro] [ocaml-avro] [ocaml-kafka] Sunsetting of DkML distribution =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 DkML, the Windows-friendly distribution of OCaml, is being sunset. DkML was launched to get Windows + OCaml off life-support when an earlier Windows distribution was retired. Mission accomplished. And thanks to OCSF for the support in the early years! Existing users: Official end-of-life for the distribution will be *12/31/2026*. 1 year and 1 month from this posting the distribution binaries, C libraries and overlay repositories will no longer be hosted. Please use the native Windows support from opam! To be clear, the Windows *distribution* is the following two products which will disappear: =E2=80=A2 *dkml-installer*: This is the Windows installer available throu= gh `winget' (). *I=E2=80=99ll wit= hdraw it from winget soon; that won=E2=80=99t affect existing users.* =E2=80=A2 *setup-dkml*: This is the GitHub/GitLab CI for MSVC. In contrast, the following products are much broader than Windows, are actively maintained, and will *_not be sunset_*: =E2=80=A2 /dkml-compiler/ and /dkml-base-compiler/. These have patches for [Android] and [bytecode]. =E2=80=A2 /MlFront/ and /dk/. This is the build and scripting system; mor= e on that in upcoming announcements. [Android] [bytecode] opam 2.5.0 is out! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, We're happy to announce the release of opam 2.5.0 and encourage all users to upgrade. *Note*: the following section will recap the various major changes in opam `2.5.0' for anyone who haven't already read the previous pre-release announcements. For those who did, note that nothing changed between `2.5.0~beta1' and the final `2.5.0'. What=E2=80=99s new? Some highlights: =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 :high_speed_train: Speedup opam update up to 70%. Thanks to [@arozovyk], `opam update' now load opam file incrementally, only parsing the files that have changed since the last time you called `opam update'. Before that, opam files in opam repositories were all loaded after an update if there was any change. The performance improvement of this change thus depends on how often you call `opam update' and what type of repository and OS you are using. ([#5824]) =E2=80=A2 :spiral_shell: Improved shell integration. A number of users ha= ve been hitting issues with opam's shell integration where parts of a previous environment was kept in the current environment, causing a number of issues. These can be triggered by, for example, nuking your opam root directory (by default `~/.opam' or `%LocalAppData%\opam'). For this particular case we are still working on a fix, but many other users have reported similar issues without nuking their root directory and in that case we believe to have fixed the majority of issues. ([dbuenzli/topkg#142], [#4649], [#5761]) =E2=80=A2 :spiral_shell:=C2=B2 We've also changed the default file to whi= ch `opam init' writes the opam shell integration to be `.bashrc' instead of the previous `.profile' or `.bash_profile' when `bash' is detected. Doing it this way prevents some issues with existing `.profile' files that source the `.bashrc' file and causing an infinity loop when opam asks users to make sure to source their `.bashrc' file into their `.profile' file. ([#5819], [#4201], [#3990]) =E2=80=A2 :shield: The opam install script now installs an appropriate `apparmor' profile on systems configured with `apparmor' (this is enabled by default on Ubuntu). This change is not strictly speaking related to this release as it is deployed for every versions. ([#5968]). =E2=80=A2 :ocean: Many more UI additions and improvements, bug fixes, =E2= =80=A6 :open_book: You can read our [blog post] for more information about these changes and more, and for even more details you can take a look at the [release note] or the [changelog]. [@arozovyk] [#5824] [dbuenzli/topkg#142] [#4649] [#5761] [#5819] [#4201] [#3990] [#5968] [blog post] [release note] [changelog] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --v= ersion 2.5.0" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 or from PowerShell for Windows systems =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.o= rg/install.ps1) } -Version 2.5.0" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Transient emacs command for dune =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello! :tada: On the behalf of everyone who has contributed to a training set for an LLM by writing something on the internet, I'm happy to announce the release of [`dune-transient'], an emacs transient command to drive dune! :tada: When invoked with `M-x dune-transient', it opens a first panel: Some keys provide direct access to common workflows. Pressing B will open a subsequent panel allowing you to build your very own command in the transient way: Now that you know the gist of the tool, let me quote an important part of the README^[This text was written by me so it's acceptable to publish it here!]: It was built entirely by an AI. I was only in charge of copy-pasting various bits of inscrutable text from one place to the other. As a consequence, I'm afraid this project cannot accept contributions made by humans. We need to wait a bit before humans are reliable enough. You are however welcome to open PR, provided both the PR text and the code in it has been written by an AI, without human review. If you find it useful, you are welcome to use it, even if you are not 100% an AI. You've been warned! [`dune-transient'] Slipshow! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Paul-Elliot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm back! Slipshow 0.7.0: The Slipshow of Dorian Gray =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C It's with guilty pleasure that I announce the new [release] of Slipshow 0.7.0: The Slipshow of Dorian Gray, on [opam]. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam update =E2=94=82 $ opam upgrade slipshow =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release contains a handful of bugfixes. But the highlight of the changelog is an experimental support for recording and replaying annotations! [Peek 2025-11-26 13-25] The gif above was made using the new feature. You can also [view it live]. If you want an example of a more interesting use of the feature than a picture of me grow old, you can also see [this presentation]. You can also find the doc [here]. The exclusive feature, that might not be obvious above, is that once you've recorded a series of strokes, you can edit it. For instance, here is the timeline for this [presentation]: You can see it live and edit it by pressing `Shift + R' in the presentation, and selecting one of the recording in the dropdown on the bottom left. However experimental this is, I can't wait to see what kind of good and bad uses it can have for your presentations. Please post them here! Thanks a lot to [NLNet] for their invaluable [support]. And before the changelog, an exclusive information relevant to OCaml users! The drawing edition UI, and actually the whole drawing mechanism, is made using Functional Reactive Programming, in particular with @let-def's [brr-lwd] library! As always, I'd like to say thank you to the developers of open source libraries, you are so great. Here are the release notes: [release] [opam] [Peek 2025-11-26 13-25] [view it live] [this presentation] [here] [presentation] [NLNet] [support] [brr-lwd] BREAKING CHANGES! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C =E2=80=A2 I removed support for the "setext" headings: Underlining a title with dashes will no longer make a title. Sorry for breaking a standard, but that messes too much with the `---' separator. Replace it with atx headings: `# This is a title'. =E2=80=A2 A bug in the carousel was fixed, breaking the workaround. If you used `+2' to go to the next meaningful page, you can now change that, either to `+1' or to `all'. =E2=80=A2 The semantics of `focus' and `unfocus' was changed. Before, you= had to unfocus as many times as you focused. Now, you have to unfocus only once. =E2=80=A2 If you find any migration problem, please open an issue and I'll help for the migration! Compiler =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Embed Liberation Sans fonts (and use them) (#150) =E2=80=A2 Fix missing favicon (which was missing since speaker view) (#15= 0) =E2=80=A2 Fix changing step number from speaker note does not update serve mode state (#154) =E2=80=A2 Fix blank lines considered as elements in carousel (#170) =E2=80=A2 Allow to specify port in `slipshow serve' with `-p' or `--port' (#176) =E2=80=A2 Fix link with no content in block raising a syntax error (#180) =E2=80=A2 Remove support for Setext headings (#178) Engine =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Allow to record and replay strokes (#187) =E2=80=A2 Fix speaker note scrolling (#150) =E2=80=A2 Fix script undos recovery when script execution fails (#150) =E2=80=A2 Hide paused/unrevealed elems also for mouse (#150) =E2=80=A2 Don't execute scripts when computing toc (#150) =E2=80=A2 Mute medias in speaker view (#152) =E2=80=A2 Use the [perfect-freehand] library to generate strokes. (#151) =E2=80=A2 Fix order of execution of actions (`center' after `enter') (#17= 1) =E2=80=A2 Fix pauses not being scoped in slides (#179) =E2=80=A2 Fix exiting not where it should (#179) =E2=80=A2 Fix `unfocus' behavior to match the docs (#179) =E2=80=A2 Fix wrong position bug on custom dimensions (#182) =E2=80=A2 Fix infinitely jiggling autoresizing (#187) =E2=80=A2 Fix not being able to draw outside of inner presentation (#187) =E2=80=A2 Fix permanent fast-moving bug (#187) [perfect-freehand] Two open roles at Tarides: Compiler Engineer and VP of Software Engineering =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Gazagnaire announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Hi all, Tarides=E2=80=99 mission is to help make OCaml mainstream. We work across= the stack: contributing upstream to the compiler, maintaining ecosystem tooling, and supporting organisations that rely on OCaml in production. Our work ranges from training and team extensions to full product development. For instance, Tarides recently spun off [Parsimoni] which builds software-defined satellite systems using a platform based on MirageOS (in OCaml) and Unikraft. We also collaborate with companies that already operate large OCaml codebases, such as Jane Street and Semgrep, supporting them on targeted projects and long-term initiatives. To sustain this breadth of activity, we are opening two roles on . [Parsimoni] *Compiler Engineer* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C The compiler team at Tarides has been central to major changes in OCaml over the past years, including the design and integration of the multicore runtime and effect handlers in OCaml 5. Beyond that milestone, the team continues to shape the evolution of the language and its runtime: improving the OCaml/WASM toolchain, refining the behavior of OCaml 5 programs under load, and exploring new directions for the type system and tooling. The role suits someone who enjoys language implementation, runtime internals, and the practical constraints of deploying OCaml in production environments (especially performance). Details: *VP of Software Engineering* =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C As our projects and teams have grown, we are looking for a VP of Software Engineering to guide the group of team leads across Tarides. The role involves structuring delivery, keeping teams aligned with the technical roadmap, and maintaining a clear interface between engineering and the rest of the company. It is a VP-level position, but experienced team leads or engineering managers who are ready to step into a wider leadership role should consider applying. Details: If you would like to discuss either post or want more context about current projects, feel free to reach out. Best, Thomas Thomas Gazagnaire later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 And now a third one, to improve the OCaml runtime's performance and create a successor to venerable [sandmark]. [sandmark] Runtime Systems Engineer =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The multicore work merged in OCaml 5.0 introduced native support for scalable concurrency and shared-memory parallelism. Its design combines effect handlers for expressing structured concurrent workflows, a concurrent garbage collector aimed at responsive networked applications, and a modular memory model that supports local reasoning without sacrificing performance. With these foundations now in the mainline compiler, Tarides is helping partners migrate their systems to OCaml 5. This third role focuses on the practical side of that transition: developing tooling to understand runtime behaviour, maintaining benchmarks that guide runtime improvements, and collaborating on future directions for the scheduler and GC. It is well-suited to someone who wants to work on the boundary between research-grade runtime design and the realities of large OCaml deployments. Details: RFSM version 2.2 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jserot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 It=E2=80=99s my pleasure to announce the availability of version `2.2' of= the `RFSM' language and compiler. `RFSM' is a domain specific language for describing, simulating and generating code from *reactive finite state machines*. From a description of a system composed of a set of reactive FSMs, the `RFSM' compiler can generate =E2=80=A2 graphical description of the system in the `.dot' format =E2=80=A2 execution traces in the `.vcd' file format =E2=80=A2 code in `C', `SystemC' and `VHDL' for simulation or implementat= ion on a target platform The most significant change since version 2.0 is the introduction of a *server mode* allowing the compiler to be called on fragments of code. This feature is used by the [Grasp] application, a graphical front-end to `RFSM' (superseding the previous `Rfsm-Light' application). `RFSM' is available from this [GH page] or as an [OPAM package]. Comments, feedbacks and bug reports welcome ! [Grasp] [GH page] [OPAM package] Alice v0.2.0, now with LSP =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Steve Sherratt announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the release of [Alice v0.2.0]. Alice is a radical, experimental OCaml build system, package manager, and toolchain manager for Windows and Unix-based OSes. Its goal is to allow anyone to program in OCaml with as little friction as possible. The main new addition is support for LSP. Alice now generates some additional files that can be interpreted by OCaml-LSP/Merlin. To use OCaml-LSP in an Alice project, make sure to configure your editor to start the LSP server with the command `ocamllsp --fallback-read-dot-merlin' and install `dot-merlin-reader' (either by running `alice tools install' or from the `dot-merlin-reader' opam package). See [this page] for more info on setting up LSP for Alice projects. Alice has gotten slightly easier to install. There's now a package in the [WinGet] repository so Windows users can install Alice by running: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 winget install OCaml.Alice =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 There's also a Homebrew tap for Alice, so macOS users can install Alice by running: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 brew install alicecaml/homebrew-tap/alice =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The [Install page] has an interactive OS picker that displays install instructions for the current OS by default. [Alice v0.2.0] [this page] [WinGet] [Install page] Gendarme, a modular marshalling library =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Benjamin Somers announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone! This is my first post on this forum, and I=E2=80=99m pleased to present [Gendarme], a generic-but-opinionated library to marshal and unmarshal OCaml data types in a variety of formats. [Gendarme] Why a new library? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C OCaml has a few libraries in the `ppx_deriving' family, like the famous [`ppx_deriving_yojson'], allowing to very conveniently generate marshallers and unmarshallers for OCaml types. However, two elements didn=E2=80=99t suit me in this approach: =E2=80=A2 These libraries pollute the namespace quite a bit when we start combining them (*e.g.* when developing user-facing apps that allow ingesting several serialization formats); =E2=80=A2 Adding support for a new format is hard and requires some PPX expertise most OCaml users don=E2=80=99t have. [`ppx_deriving_yojson'] How the project is born =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C When discovering the Go language, I was pleasantly surprised by how easy it was to marshal and unmarshal structs with simple annotations, and wanted a similar hassle-free mechanism in OCaml. I also wanted to learn about GADTs, as I never had found any use for them in my projects before. This project was originally named `Marshal', but a module of the same name already exists in the standard library. =E2=80=9CGendarme=E2=80=9D is one way to translate =E2=80=9CMars= hal=E2=80=9D in French. What=E2=80=99s particular about Gendarme? =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Gendarme is a modular, extendable, PPX-heavy marshaller and unmarshaller based on type witnesses, supporting various data formats (CSV, JSON, TOML, YAML). The curious reader may find **way more** information on [the project=E2=80=99s repository], but here=E2=80=99s the= gist: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 [%%marshal.load Yojson] =E2=94=82=20 =E2=94=82 type t =3D { t_foo: int list [@json "foo"]; =E2=94=82 t_bar: t list [@json "bar"] } [@@marshal] =E2=94=82 type u =3D t * int [@@marshal] =E2=94=82=20 =E2=94=82 let v =3D ({ t_foo =3D [1; 2]; t_bar =3D [{ t_foo =3D [3; 4]; t= _bar =3D [] }] }, 3) =E2=94=82=20 =E2=94=82 let json =3D [%encode.Json] ~v u =E2=94=82 (* =E2=94=82 val json : string =3D "[{\"foo\":[1,2],\"bar\":[{\"foo\":[3,4],= \"bar\":[]}]},3]" =E2=94=82 *) =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Annotating a type `my_type' with `[@@marshal]' and providing the required additional data (such as field names in the case of records) builds a witness value `my_type' of type `my_type Gendarme.ty' that tells Gendarme how to marshal and unmarshal values. Currently, [only a subset of OCaml core types are supported], but generic support gets improved as the need appears in my personal and professional projects. Gendarme was written both with users (application and library developers) and developers (people developing new Gendarme encoders) in mind. If your target format is able to encode objects/records (optional but nice to have), lists/arrays, and supports arbitrarily nesting them, then writing a new encoder requires writing **at most** 100 lines of what is essentially pattern-matching cases to tell Gendarme what to do with your data (see for example [the code for `gendarme-ezjsonm']). Each encoder is heavily tested, and most of the encoders that we ship have more lines of code for tests than for their actual logic. This is a very quick introduction, but if you are interested in this project, head over to [its README] to learn more! I=E2=80=99m obviously h= appy to answer any questions you may have. [the project=E2=80=99s repository] [only a subset of OCaml core types are supported] [the code for `gendarme-ezjsonm'] [its README] FUN OCaml is live on YouTube and Twitch =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 FUN OCaml talks are now uploaded to [FUN OCaml's watch.ocaml.org channel]: ETA: still transcoding :sweat_smile: but due to appear any moment [FUN OCaml's watch.ocaml.org channel] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Keeping your branch up-to-date] =E2=80=A2 [The AI French Connection to the Practice of Science] =E2=80=A2 [OCaml 5.4 native Arm32 branch] =E2=80=A2 [Bringing Emacs Support to OCaml's LSP Server with `ocaml-eglot= '] =E2=80=A2 [Advent of FPGA =E2=80=94 A Jane Street Challenge] =E2=80=A2 [Four Ps for Building Massive Collective Knowledge Systems] [the ocaml.org blog] [Keeping your branch up-to-date] [The AI French Connection to the Practice of Science] [OCaml 5.4 native Arm32 branch] [Bringing Emacs Support to OCaml's LSP Server with `ocaml-eglot'] [Advent of FPGA =E2=80=94 A Jane Street Challenge] [Four Ps for Building Massive Collective Knowledge Systems] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of November 25 to Decemb= er 02, 2025.

    avro-simple, an OCaml implementation of Apache Avro

    Tim McGilchrist announced

    I=E2=80=99ve been building a library for Apache Avro called avro-simple. It is an OCaml im= plementation of Apache Avro with codec-based design, schema evolution support, and = container file format.

    The key principles for this library are:

    • Value-centric design: Manual codec construction using combinator= s (no code generation required)
    • Pure OCaml: No external C dependencies for core functionality
    • Schema evolution: Built-in support for reading data with differe= nt schemas
    • Container files: Full support for Avro Object Container File for= mat
    • Compression: Multiple compression codecs (null, deflate, snappy,= zstandard) with compression plugins
    • Streaming: Memory-efficient block-level streaming for large file= s
    • Type-safe: Codec-enforced types with composable combinators

    This compares to ocaml-avr= o which uses code generation based on JSON schemas and is missing some = of the schema evolution features.

    I'm mainly using this for reading and writing Avro container files, however= it should be possible to integrate with ocaml-kafka if you use Kafka. The performance is= reasonable so far, 1.4 times slower than the fastest Rust based library I = could find and I haven't really tried to optimise it yet. HEAPs faster than= the official Apache Avro libraries in Python.=20

    There are a few other places I think I can improve the performance and memo= ry usage, but it should be quite usable for small to medium sized files. En= joy :slight_smile:

    Sunsetting of DkML distribution

    jbeckford announced

    DkML, the Windows-friendly distribution of OCaml, is being sunset. DkML was= launched to get Windows + OCaml off life-support when an earlier Windows d= istribution was retired. Mission accomplished. And thanks to OCSF for the s= upport in the early years!

    Existing users: Official end-of-life for the distribution will be 12/31/= 2026. 1 year and 1 month from this posting the distribution binaries, C= libraries and overlay repositories will no longer be hosted. Please use th= e native Windows support from opam!

    To be clear, the Windows distribution is the following two products = which will disappear:

    • dkml-installer: This is the Windows installer available through = winget (htt= ps://winstall.app/apps/Diskuv.OCaml). I=E2=80=99ll withdraw it from = winget soon; that won=E2=80=99t affect existing users.
    • setup-dkml: This is the GitHub/GitLab CI for MSVC.

    In contrast, the following products are much broader than Windows, are acti= vely maintained, and will not be sunset= :

    • dkml-compiler and dkml-base-compiler. These have patches = for Android and bytecode.
    • MlFront and dk. This is the build and scripting system; m= ore on that in upcoming announcements.

    opam 2.5.0 is out!

    Kate announced

    Hi everyone,

    We're happy to announce the release of opam 2.5.0 and encourage all users t= o upgrade.

    Note: the following section will recap the various major changes in = opam 2.5.0 for anyone who haven't already read the previous pr= e-release announcements. For those who did, note that nothing changed betwe= en 2.5.0~beta1 and the final 2.5.0.

    What=E2=80=99s new? Some highlights:

    • :high_speed_train: Speedup opam update up to 70%. Thanks to @arozovyk, opam update now lo= ad opam file incrementally, only parsing the files that have changed since = the last time you called opam update. Before that, opam files = in opam repositories were all loaded after an update if there was any chang= e. The performance improvement of this change thus depends on how often you= call opam update and what type of repository and OS you are u= sing. (#5824)
    • :spiral_shell: Improved shell integration. A number of users have been = hitting issues with opam's shell integration where parts of a previous envi= ronment was kept in the current environment, causing a number of issues. Th= ese can be triggered by, for example, nuking your opam root directory (by d= efault ~/.opam or %LocalAppData%\opam). For this = particular case we are still working on a fix, but many other users have re= ported similar issues without nuking their root directory and in that case = we believe to have fixed the majority of issues. (dbuenzli/topkg#142, #4649, #5761)
    • :spiral_shell:=C2=B2 We've also changed the default file to which opam init writes the opam shell integration to be .bashrc instead of the previous .profile or .bash_profile when bash is detected. Doing it this way prevents some i= ssues with existing .profile files that source the .bash= rc file and causing an infinity loop when opam asks users to make su= re to source their .bashrc file into their .profile file. (#5819, = #4201, #3990)
    • :shield: The opam install script now installs an appropriate appa= rmor profile on systems configured with apparmor (this = is enabled by default on Ubuntu). This change is not strictly speaking rela= ted to this release as it is deployed for every versions. (#5968).
    • :ocean: Many more UI additions and improvements, bug fixes, =E2=80=A6

    :open_book: You can read our blog post for more information about these changes and more, and = for even more details you can take a look at the release note or the changelog.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    5.0"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.5.0"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    Transient emacs command for dune

    Paul-Elliot announced

    Hello!

    :tada: On the behalf of everyone who has contributed to a training set for = an LLM by writing something on the internet, I'm happy to announce the rele= ase of dune-tr= ansient, an emacs transient command to drive dune! :tada:=20

    When invoked with M-x dune-transient, it opens a first panel:

    3D"main_panel.png"

    Some keys provide direct access to common workflows. Pressing B will open a= subsequent panel allowing you to build your very own command in the transi= ent way:

    3D"build_panel.png"

    Now that you know the gist of the tool, let me quote an important part of t= he README^[This text was written by me so it's acceptable to publish it her= e!]:

    It was built entirely by an AI. I was only in charge of copy-pasting variou= s bits of inscrutable text from one place to the other.

    As a consequence, I'm afraid this project cannot accept contributions made = by humans. We need to wait a bit before humans are reliable enough. You are= however welcome to open PR, provided both the PR text and the code in it h= as been written by an AI, without human review.

    If you find it useful, you are welcome to use it, even if you are not 100% = an AI.

    You've been warned!

    Slipshow!

    Paul-Elliot announced

    I'm back!

    Slipshow 0.7.0: The Slipshow of Dorian Gray

    It's with guilty pleasure that I announce the new release of Slipshow 0.7.0: = The Slipshow of Dorian Gray, on opam.

    $ opam update
    $ opam upgrade slipshow
    

    This release contains a handful of bugfixes. But the highlight of the chang= elog is an experimental support for recording and replaying annotations!

    Peek 2025-11-26 13-25

    The gif above was made using the new feature. You can also view it live. If you want an example= of a more interesting use of the feature than a picture of me grow old, yo= u can also see this presen= tation. You can also find the doc here.

    The exclusive feature, that might not be obvious above, is that once you've= recorded a series of strokes, you can edit it. For instance, here is the t= imeline for this presentat= ion:

    3D"05f6493543d78b90=

    You can see it live and edit it by pressing Shift + R in the p= resentation, and selecting one of the recording in the dropdown on the bott= om left.

    However experimental this is, I can't wait to see what kind of good and bad= uses it can have for your presentations. Please post them here!

    Thanks a lot to NLNet for their invaluabl= e support.

    And before the changelog, an exclusive information relevant to OCaml users!= The drawing edition UI, and actually the whole drawing mechanism, is made = using Functional Reactive Programming, in particular with @let-def's brr-lwd library! As always, I'd li= ke to say thank you to the developers of open source libraries, you are so = great.

    Here are the release notes:

    BREAKING CHANGES!

    • I removed support for the "setext" headings: Underlining a title with d= ashes will no longer make a title. Sorry for breaking a standard, but that = messes too much with the --- separator. Replace it with atx he= adings: # This is a title.
    • A bug in the carousel was fixed, breaking the workaround. If you used <= code>+2 to go to the next meaningful page, you can now change that, = either to +1 or to all.
    • The semantics of focus and unfocus was change= d. Before, you had to unfocus as many times as you focused. Now, you have t= o unfocus only once.
    • If you find any migration problem, please open an issue and I'll help f= or the migration!

    Compiler

    • Embed Liberation Sans fonts (and use them) (#150)
    • Fix missing favicon (which was missing since speaker view) (#150)
    • Fix changing step number from speaker note does not update serve mode s= tate (#154)
    • Fix blank lines considered as elements in carousel (#170)
    • Allow to specify port in slipshow serve with -p or --port (#176)
    • Fix link with no content in block raising a syntax error (#180)
    • Remove support for Setext headings (#178)

    Engine

    • Allow to record and replay strokes (#187)
    • Fix speaker note scrolling (#150)
    • Fix script undos recovery when script execution fails (#150)
    • Hide paused/unrevealed elems also for mouse (#150)
    • Don't execute scripts when computing toc (#150)
    • Mute medias in speaker view (#152)
    • Use the per= fect-freehand library to generate strokes. (#151)
    • Fix order of execution of actions (center after ente= r) (#171)
    • Fix pauses not being scoped in slides (#179)
    • Fix exiting not where it should (#179)
    • Fix unfocus behavior to match the docs (#179)
    • Fix wrong position bug on custom dimensions (#182)
    • Fix infinitely jiggling autoresizing (#187)
    • Fix not being able to draw outside of inner presentation (#187)
    • Fix permanent fast-moving bug (#187)

    Two open roles at Tarides: Compiler Engineer and VP of Softwar= e Engineering

    Thomas Gazagnaire announced

    Hi all,

    Tarides=E2=80=99 mission is to help make OCaml mainstream. We work across t= he stack: contributing upstream to the compiler, maintaining ecosystem tool= ing, and supporting organisations that rely on OCaml in production. Our wor= k ranges from training and team extensions to full product development. For= instance, Tarides recently spun off Parsi= moni which builds software-defined satellite systems using a platform b= ased on MirageOS (in OCaml) and Unikraft. We also collaborate with companie= s that already operate large OCaml codebases, such as Jane Street and Semgr= ep, supporting them on targeted projects and long-term initiatives.

    To sustain this breadth of activity, we are opening two roles on https://tarides.com/careers/.

    Compiler Engineer

    The compiler team at Tarides has been central to major changes in OCaml ove= r the past years, including the design and integration of the multicore run= time and effect handlers in OCaml 5. Beyond that milestone, the team contin= ues to shape the evolution of the language and its runtime: improving the O= Caml/WASM toolchain, refining the behavior of OCaml 5 programs under load, = and exploring new directions for the type system and tooling. The role suit= s someone who enjoys language implementation, runtime internals, and the pr= actical constraints of deploying OCaml in production environments (especial= ly performance).

    Details: https://jobs.world.luccas= oftware.com/tarides-com/compiler-engineer-a384e70c-cd83-4c82-9cdb-a2ab12132= 9a7

    VP of Software Engineering

    As our projects and teams have grown, we are looking for a VP of Software E= ngineering to guide the group of team leads across Tarides. The role involv= es structuring delivery, keeping teams aligned with the technical roadmap, = and maintaining a clear interface between engineering and the rest of the c= ompany. It is a VP-level position, but experienced team leads or engineerin= g managers who are ready to step into a wider leadership role should consid= er applying.

    Details: https://jobs.wo= rld.luccasoftware.com/tarides-com/vp-of--software-engineering-ad64996f-0d3c= -4991-8af9-6b7f0e943faf

    If you would like to discuss either post or want more context about current= projects, feel free to reach out.

    Best, Thomas

    Thomas Gazagnaire later added

    And now a third one, to improve the OCaml runtime's performance and create = a successor to venerable sandmark.

    Runtime Systems Engineer

    The multicore work merged in OCaml 5.0 introduced native support for scalab= le concurrency and shared-memory parallelism. Its design combines effect ha= ndlers for expressing structured concurrent workflows, a concurrent garbage= collector aimed at responsive networked applications, and a modular memory= model that supports local reasoning without sacrificing performance. With = these foundations now in the mainline compiler, Tarides is helping partners= migrate their systems to OCaml 5.

    This third role focuses on the practical side of that transition: developin= g tooling to understand runtime behaviour, maintaining benchmarks that guid= e runtime improvements, and collaborating on future directions for the sche= duler and GC. It is well-suited to someone who wants to work on the boundar= y between research-grade runtime design and the realities of large OCaml de= ployments.

    Details: https://jobs.world= .luccasoftware.com/tarides-com/runtime-systems-engineer-14f4aa23-9a0d-4d66-= 88b6-4f5805e70166

    RFSM version 2.2

    jserot announced

    It=E2=80=99s my pleasure to announce the availability of version 2.2<= /code> of the RFSM language and compiler.

    RFSM is a domain specific language for describing, simulating = and generating code from reactive finite state machines.

    >From a description of a system composed of a set of reactive FSMs, the RFSM compiler can generate

    • graphical description of the system in the .dot format
    • execution traces in the .vcd file format
    • code in C, SystemC and VHDL for = simulation or implementation on a target platform

    The most significant change since version 2.0 is the introduction of a s= erver mode allowing the compiler to be called on fragments of code. Thi= s feature is used by the Grasp<= /a> application, a graphical front-end to RFSM (superseding th= e previous Rfsm-Light application).=20

    RFSM is available from this GH page or as an OPAM package.

    Comments, feedbacks and bug reports welcome !

    Alice v0.2.0, now with LSP

    Steve Sherratt announced

    I'm happy to announce the release of Alice v0.2.0. Alice is a radical, experimental OCaml= build system, package manager, and toolchain manager for Windows and Unix-= based OSes. Its goal is to allow anyone to program in OCaml with as little = friction as possible.=20=20=20

    The main new addition is support for LSP. Alice now generates some addition= al files that can be interpreted by OCaml-LSP/Merlin. To use OCaml-LSP in a= n Alice project, make sure to configure your editor to start the LSP server= with the command ocamllsp --fallback-read-dot-merlin and inst= all dot-merlin-reader (either by running alice tools ins= tall or from the dot-merlin-reader opam package).

    See this page for more info = on setting up LSP for Alice projects.

    Alice has gotten slightly easier to install. There's now a package in the <= a href=3D"https://learn.microsoft.com/en-us/windows/package-manager/winget/= ">WinGet repository so Windows users can install Alice by running:

    winget install OCaml.Alice
    

    There's also a Homebrew tap for Alice, so macOS users can install Alice by = running:

    brew install alicecaml/homebrew-tap/alice
    

    The Install page has an = interactive OS picker that displays install instructions for the current OS= by default.

    Gendarme, a modular marshalling library

    Benjamin Somers announced

    Hi everyone!

    This is my first post on this forum, and I=E2=80=99m pleased to present Gendarme, a generic-= but-opinionated library to marshal and unmarshal OCaml data types in a vari= ety of formats.

    Why a new library?

    OCaml has a few libraries in the ppx_deriving family, like the= famous ppx_deriving_yojson, allowing to very conveniently generate = marshallers and unmarshallers for OCaml types. However, two elements didn= =E2=80=99t suit me in this approach:

    • These libraries pollute the namespace quite a bit when we start combini= ng them (e.g. when developing user-facing apps that allow ingesting = several serialization formats);
    • Adding support for a new format is hard and requires some PPX expertise= most OCaml users don=E2=80=99t have.

    How the project is born

    When discovering the Go language, I was pleasantly surprised by how easy it= was to marshal and unmarshal structs with simple annotations, and wanted a= similar hassle-free mechanism in OCaml. I also wanted to learn about GADTs= , as I never had found any use for them in my projects before. This project was originally named Marshal, but a module of the= same name already exists in the standard library. =E2=80=9CGendarme=E2=80= =9D is one way to translate =E2=80=9CMarshal=E2=80=9D in French.

    What=E2=80=99s particular about Gendarme?

    Gendarme is a modular, extendable, PPX-heavy marshaller and unmarshaller ba= sed on type witnesses, supporting various data formats (CSV, JSON, TOML, YA= ML). The curious reader may find way more information on the project=E2=80=99s repositor= y, but here=E2=80=99s the gist:

    [%%marshal.load Y=
    ojson]
    
    type t =3D { t_foo: int list [@json "=
    foo"];
               t_bar: t list [@json "bar"] } [@@marshal]
    type u =3D t * int [@@marshal]
    
    let v =3D ({ t_foo =3D [1; 2]; t_bar =3D [{ t_foo =
    =3D [3; 4]; t_bar =3D [] }] }, 3)
    
    let json =3D [%encode.Json] ~v u
    (*
    val json : string =3D "[{\"foo\":[1,2],\"bar\":[{\"foo\":[3,4],\"bar\":[]}]=
    },3]"
    *)
    

    Annotating a type my_type with [@@marshal] and pr= oviding the required additional data (such as field names in the case of re= cords) builds a witness value my_type of type my_type Ge= ndarme.ty that tells Gendarme how to marshal and unmarshal values.

    Currently, only a subset of OCaml core types are = supported, but generic support gets improved as the need appears in my = personal and professional projects.

    Gendarme was written both with users (application and library developers) a= nd developers (people developing new Gendarme encoders) in mind. If your ta= rget format is able to encode objects/records (optional but nice to have), = lists/arrays, and supports arbitrarily nesting them, then writing a new enc= oder requires writing at most 100 lines of what is essentiall= y pattern-matching cases to tell Gendarme what to do with your data (see fo= r example the code for gendarme-ezjsonm). Each encoder is = heavily tested, and most of the encoders that we ship have more lines of co= de for tests than for their actual logic.

    This is a very quick introduction, but if you are interested in this projec= t, head over to its README to learn more! I=E2=80=99m obviously happy to answe= r any questions you may have.

    FUN OCaml is live on YouTube and Twitch

    Continuing this thread, Sabine Schmaltz announced

    FUN OCaml talks are now uploaded to FUN OCaml's watch.ocaml.org channel:

    https://watch.ocaml.o= rg/c/funocaml/videos

    ETA: still transcoding :sweat_smile: but due to appear any moment

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=HUYBbfBx; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 8E531400A6 for ; Tue, 9 Dec 2025 15:05:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=2l3AljDR/3tn7pIHeEMOVE3XXIY0rvwpt+6hUgg3Qbc=; b=HUYBbfBxUEIqk99sAI7vC5JljQ80EvBb/fdYFGq4OIDLe18tpRuxx+Cd k/G25De8GgaJbUj6XGaKaqlpHtQQVsssy1CzmHomcyRwKvp2GsE+5Bkwu fAdfuJ088lGLyiyR+NR2fPADcGAD9dCrm+14AV4ruCbm3/6zyKLcqdAtX Q=; X-CSE-ConnectionGUID: agXpF5rmSvmdxEkh8xczTQ== X-CSE-MsgGUID: jxEHZVLERme0CNBl9qYSqw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.20,261,1758578400"; d="scan'208,217";a="253584039" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 09 Dec 2025 16:05:03 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3993880E45; Tue, 9 Dec 2025 16:05:03 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (dsi-ha-lb1-dmz.inria.fr [128.93.162.100]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id ADD1D80E42 for ; Tue, 9 Dec 2025 16:04:55 +0100 (CET) X-CSE-ConnectionGUID: QTEsMbETSq699PID3ssmbA== X-CSE-MsgGUID: PqCAmKrAQJ2S0kSj67sdzg== IronPort-SDR: 69383a96_O0EPeXe+7cl52dB9G6uQ4lLRWZNjQc3plogk3P9HBRWgtBw zVyEMg0uVYP5Ft7kpeeFUCDJFC6aLyEzOUZ6x3A== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HZAgCmOThpdyIeaIFaHgEBCxIMg01bKBkBbF8zBwhJh?= =?us-ascii?q?FWBY4FsCI4dgRWbM4J6AwQUFiMVAQMBDS4BGwQBAgQBAQMBAgGDSYE3AhaMU?= =?us-ascii?q?gIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAE+A?= =?us-ascii?q?0uGTw2CRRk4cWECAgMDAzcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQECBAgBAhcKBhlcCQQGEwEBJgQIBhgUDwMUAQYDAgQNA?= =?us-ascii?q?TUDFAESFAUBAoIOWYIgAgJPAwUMBpROm016fzOBAYIMAQEGgQg+AwsCBQEOC?= =?us-ascii?q?SbaDoFkCYEzGIVugkobASpJawKESYQ9Jw+BVUSBFTWBc1FvgVAyPQUGFwEBA?= =?us-ascii?q?QEBF0RgAQECBkUJgyWCaYImehQdgWSEHoJxgTCFWAaBTIdggURLMywBVRMXC?= =?us-ascii?q?wcFW4EIAyo0LW4yHYEjPhdzgRSDSR5oDwaBEYNRiRkPiXsyAwttPTcUG5RqQ?= =?us-ascii?q?hkpJYFlDh8fFycbIw4ZCA4BAQUdLggOFRYKFQMBJgQBCQIcLAsLAh4PA5J/B?= =?us-ascii?q?iZ1nH2Tdm00B4QfgV4GDIhLPYEmlgaEBIFXizyZVCKYZCKCNocngSYJgW9rl?= =?us-ascii?q?WAThUWBfyM8bzEzGjAiIQ0GgiABATIJRhwPjX8iDBaBEgEBB4FCgQFBfYEdg?= =?us-ascii?q?X07u3YCQjUCAQE4AgcBCgEBAwmFYgEBjDqBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:s+FEpak/rlHwQP/A/Zr2jPro5gxfIkRdPkR7XQ2eYbSJt1+Wr1Gzt xJMWDvTa6uOMzH0c9l3YYm/ox9S6pfRzoc2TgRor3tkEFtH+JHPbTi7BhepbnnKdqUvb2o+s p5AMoGYRCwQZiWBzvt4GuG59RGQ7YnRG/yhTreCYn0sLeNdYH9JoQp5nOIkiZJfj9G8Agec0 fv/uMS31GWNglaYCUpKrfjbwP9TlK6q4m5B5ARvPakjUGL2zhH5MrpPfcldEFOjGuG4LsbiL 87fwbew+H/u/htFIruNjrbhf0QWdaXZNA6Ih2A+c/DKbs9q+0Teeo5iXBYtQR8/Zwehx7id+ /0R3XCEcjrFC4WX8Agrv7a0JAklVUFO0OevzXFSKqV/xWWeG5fn660G4E3boeT0Uwu4aI1D3 aVwFdwDUvyMr9uK7ameQMRQvd19fZjTHa9EoWplxxiMWJ7KQbibK0nLzdpIhXEogcRfAfvVZ 8wYcCdiKhPabHWjOH9OUsN4xb/0wCKnNWYEwL6WjfJfD2z79zZKiO38MoPcL4KyEN1SmleEq 2nG+WXgHxxcM8aQnDOB+3TqneTPmCLnRKoYE6C+/fNxxljP1ioUEhJ+uV6T+6Ti1x7lCokFQ 6AS0hI3hoE311aCd/unZEW7m3za4QUQSdUFRoXW7ynWl/aKuFnBboQedRZKYdki8cs3XiACz U6Mh9qvBDp1sbTTR2j1y1uPhTaiYG4NKmsTeSIPTQ0E+sTu5oYpgXojU+qPDoaMsvDuPDvd/ wuT8nlvv5Q/1tUQ0q+SqAWvby2XmnTfcuIizivtNl9JAyt8dNfjf4us+ETW5vZGLZ+EQx+Gp ndsdymiAAImU8HleM+lGr1l8FSVCxCta2a0bblHRMVJythV0yT/Fb28GRknTKuTDir7RdMZS BSO5V0Ku8c70IqCYKRwZ4/5E8Mu3LTtHtTjV+nJY5JDeoN6bGe6wc2aXmbBjwjFyRF0+YlmY MfzWZj3Vx4yV/84pAdass9EgNfHMAhnlDuLHfgWDn2PjdKjWZJiYexUbgfSP7phs/rsTce82 483CvZmAi53CIXWChQ7O6ZKRbzTBSlqXcLFuIZMe/SdIwFrPmgkBrWDifkiYoFp1eAd3OvB4 nj3CAcSxUvdlE/3D1yASkliT7fzArd5j3YwZhI3MXiShnMMXIeI7YUkTaURQ4UJzuJZ8KNLf 6E3QPnYWvVrYRbbygsZdqj4/dBDdgz0pAegPBiFQTkYfrxhTVf35+6+QBnL8XFWAwHqq8A7q LyE/SHYSKolWA5NIpv3avWu7lXpplkburt4cHXpK+lpWnfH0dZVOQ2oqdFvOOAKCxHI5gXC5 jasGR1C+NX8+d4kwufGlYWvjtmPEdInOmF4AmOCz7K9FReCz1qZ2YUaDdq5J2HMZljVppenS /5elcznEfs9m11PjYpwPpBrwY865Prtv7Vq9RtlLlqac2WUDq5cHVfe0fltrqFtwppriTmyU G+L+fhYPuytE+HhG1gzOgEkT7qi0dc5pzrs1sk2cX7KvHJPwLm6UEtpL0atjg5ZJ+BLK48L+ 7oql/MXzA2dsSAUFOi6oBpazEm2FUxYYZ4b7skbJKTJljsUzkpzZM2AKy3uv7CKRdZ+EmgrB T62m6CYl+lQ6XTAelVuDXP94+55gMUfigFr134HHUyCwfDet8803TpQ0DU5dRtUxRN5yNBOO nBnGkl2BKeW9RJquZRzZH+tEAR/GxGpwEz95F8Xnmn/TUPzdGjyAEAiGOSKpmY1znl9e2VFw bSm12rVazbmU8Xv1C8UW0Q+ifjCT8R0xzLSivKcAMWJMJkrUwXL2pb0SzIzlCLmJsctiGnsh +pgpr9wYJKmEx8gmfQwDo3C2IkATByBGnd5fshg26E0BkDZRiC53GmfCkK2e/4VHcfwz22DN 5VMKP5MBjOE7wTfihAABKUJHa14o+5x2voGZYHQBDAnt5mxk2NXlaz+pwnEuX8TYtRxkMwCB JvbWBCcH0ex23ZFuW//g/NVG2i/YNM0ax3Y2sqr+sUNT6A8luZmdEUi3oSJon/OEg1G/g2Vj izHdaT53+xv8qUyvorOQ4FoJRS4FsP3b8uMqDuMitVpacjdFOvzrCYXlwXXBBtXNr4vRNhHr 7SBn9rp1kfjvrxtcWTmt7SeNqtOv+OeYfF2N5/pEXxkgieyYs/gzB8d8WSeK5YSstd85NGid jSoevmLat8ZdNdM9kJ7MxEEPU4mNJ32SaP8qQeWjfeGUEEd2DOaCuKXzybiaGUDexIYP5H7N BTPhM+vwdJlt6VJOg4PAqB3Ip1/IWK7Y5AcSf/KiWC6AFWr03S4gZmzpSp4vHuPQjOBHd3h6 J3IegnmeV7g8OvUxdVeqMppsgdREH95hvIqc1kA/8JtzQq3F3MCMf9XJKBu5ku4ScAu/MqQi PDxgGoe5eHVWCQdNw375MX/UwyfAO0XJ9q/ISYml69RQznjH5uOWdON6Q85i0qauBO6pA1kF T3a0nf3Ix66z4ovQLoDoPuhjo+LA9vEk2kQ9xmVf9PaWn4j7HZj6JClNBJKUT3bHsrNkkTSO GVzQnpLKK1+pYgdDu44E0No9NolUP8DAtnmgepjADoShmlD8NB99Q== IronPort-HdrOrdr: A9a23:7HBPiauvmh78VEY3+MrgeRu17skCkYMji2hC6mlwRA09TyXGra 2TdaUgvyMc1gx7ZJh5o6HnBEDyewKkyXcV2/hnAV7GZmXbUQSTXeVfBOfZogEIeBeOgNK1t5 0QFJSWYeeYZTcVsS+Q2njaLz9U+qjjzEnev5a9854Cd2FXQpAlyz08JheQE0VwSgUDL4E+Do Cg6s1OoCflUWgLb+ygb0N1F9TrlpnurtbLcBQGDxko5E2lljWz8oP3FBCew1M3Ty5P+7E/6m LI+jaJrZlL8svLgCM05VWjo6i+q+GRheerw/b8xPT9Hw+cxzpAor4RGoFq8gpF4N1Ho2xa6O Uk6y1QRPibrUmhN11d6CGdoTXIwXIg7WTvxkSfhmamqcvlRCgiA84Eno5BdADFgnBQzu2U/Z g7r15xjaAnfi/ojWD4/ZzFRhtqnk27rT4rlvMSlWVWVc8bZKVKpYIS8UtJGNNYdRiKnLwPAa 1rFoXR9fxWeVSVYzTQuXRu2sWlWjA2Eg2dSkYPt8SJ23xdnWx/zUEf2MsD901wga4VWt1B/a DJI65onLZBQosfar98Hv4IRY+tBmnEUXv3QROvyJTcZd860l722uHKCe8OlZyXkbQzvecPpK g= X-Talos-CUID: 9a23:6jdwXmBFlCcLDBb6ExBb2VUxEO0ZSWSDnSboAmPjEn1sQpTAHA== X-Talos-MUID: 9a23:3M8s1wa4EdEQheBTjybHrTRBLu5Rwf6VUEM2k8tZoMWWOnkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.20,261,1758578400"; d="scan'208,217";a="253583932" X-MGA-submission: =?us-ascii?q?MDF0ZeJsbH+gH3K/AeaOsaMeFUlh6VtAk64eCn?= =?us-ascii?q?BJYn20B1rwYpFj4AoiuATOcTtPKaI865IIRnAtSbQXKFH/Bp6rqPgMUD?= =?us-ascii?q?bC/Gj2Iv6QO1zx+YX/oJCq1j16dkoPWmyZ5Sk26/azsWBlx9UD5eX7lB?= =?us-ascii?q?jf43ZAL2Y97/7lyHwjKWs9Ww=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 09 Dec 2025 16:04:54 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 304F91A336; Tue, 9 Dec 2025 16:04:54 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 09 Dec 2025 16:04:51 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 9 16:04:54 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.492586, queueID=4C99B1A3A9 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19409 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMDIgdG8gMDksDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCmVkaXRv cnMgZGV2LW1lZXRpbmc6IDE1dGggb2YgRGVjZW1iZXIgYWJvdXQgdGhlIGBvY2FtbC5udmltJyBw bHVnaW4NCk1vc2FpYyAtIEEgTW9kZXJuIFRlcm1pbmFsIFVzZXIgSW50ZXJmYWNlIEZyYW1ld29y ayBmb3IgT0NhbWwgKEVhcmx5IFByZXZpZXcpDQpNYWtpbmcgaHRtbF9vZl9qc3ggfjEweCBmYXN0 ZXINClR5cmUgLSB0eXBlLXNhZmUgcmVndWxhciBleHByZXNzaW9ucyAxLjANClBvcnRpbmcgYW4g T3hDYW1sIFByb2plY3QgdG8gRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnQNCk90aGVyIE9DYW1sIE5l d3MNCk9sZCBDV04NCg0KDQplZGl0b3JzIGRldi1tZWV0aW5nOiAxNXRoIG9mIERlY2VtYmVyIGFi b3V0IHRoZSBgb2NhbWwubnZpbScgcGx1Z2luDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1lZGl0 b3JzLWRldi1tZWV0aW5nLTE1dGgtb2YtZGVjZW1iZXItYWJvdXQtdGhlLW9jYW1sLW52aW0tcGx1 Z2luLzE3NTU5LzE+DQoNCg0KQ2hhcmzDqG5lX0dyb3MgYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIaSENCg0KICBXZSBhcmUgb3JnYW5pemluZyB0aGUgbmV4dCBwdWJsaWMgZGV2IG1lZXRp bmcgYWJvdXQgZWRpdG9ycyBmb3IgT0NhbWwhDQoNCiAgSXQgd2lsbCB0YWtlIHBsYWNlIG9uIERl Y2VtYmVyIDE1dGggYXQgNSBwbS4NCg0KICBUaGUgZm9jdXMgd2lsbCBiZSBvbiB0aGUgbmV3IE5l b1ZpbSBwbHVnaW4gZm9yIE9DYW1sLCB3aGljaCBhZGRzIGV4dHJhDQogIGZlYXR1cmVzIHRvIHRo ZSBjbGFzc2ljYWwgYGxzcGNvbmZpZycgZm9yIHN0YW5kYXJkIExTUCBzdXBwb3J0LCB0bw0KICBw cm92aWRlIGFsbCBvZiB0aGUgTWVybGluIGZlYXR1cmVzIGluIE5lb3ZpbS4NCg0KICBXZSB3aWxs IGV4cGxvcmUgd2h5IGhhdmluZyB0aGlzIHR5cGUgb2YgcGx1Z2luIGlzIGJlbmVmaWNpYWwgZm9y DQogIG1haW50YWluaW5nIE9DYW1sIGVkaXRvciB0b29scywgYW5kIHdlIHdpbGwgZGl2ZSBpbnRv IHRoZSBjb2RlYmFzZSB0bw0KICB1bmRlcnN0YW5kIGhvdyBpdCB3b3JrcyBhbmQgc2VlIHdoYXQg aGFwcGVucyBpbiBOZW92aW0uDQoNCiAgRm9yIHRoZSBhZ2VuZGE6DQoNCiAg4oCiIEEgdG91ci1k ZS10YWJsZSB0byBhbGxvdyB0aGUgcGFydGljaXBhbnRzIHdobyB3aXNoIHRvIGRvIHNvIHRvDQog ICAgcHJlc2VudCB0aGVtc2VsdmVzIGFuZCBtZW50aW9uIGlzc3VlcyAvIFBScyB0aGV5IGFyZSBp bnRlcmVzdGVkIGluLg0KDQogIOKAoiBUYWxrIGFuZCBRJkENCg0KICDigKIgRGlzY3VzcyBpc3N1 ZXMgYW5kIHB1bGwgcmVxdWVzdHMgdGhhdCB3ZXJlIHRhZ2dlZCBpbiBhZHZhbmNlIG9yDQogICAg bWVudGlvbmVkIGR1cmluZyB0aGUgdG91ci1kZS10YWJsZS4NCg0KICBGZWVsIGZyZWUgdG8gam9p biENCg0KICBNZWV0aW5nIGxpbms6IDxodHRwczovL21lZXQuZ29vZ2xlLmNvbS9xeHItenhnZS1m dmc+DQoNCg0KTW9zYWljIC0gQSBNb2Rlcm4gVGVybWluYWwgVXNlciBJbnRlcmZhY2UgRnJhbWV3 b3JrIGZvciBPQ2FtbCAoRWFybHkgUHJldmlldykNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1vc2FpYy1hLW1vZGVybi10ZXJtaW5hbC11c2Vy LWludGVyZmFjZS1mcmFtZXdvcmstZm9yLW9jYW1sLWVhcmx5LXByZXZpZXcvMTc1NzIvMT4NCg0K DQpUaGliYXV0IE1hdHRpbyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEknbSBleGNp dGVkIHRvIHNoYXJlIGFuIGVhcmx5IHByZXZpZXcgb2YgW01vc2FpY10sIGEgbW9kZXJuIHRlcm1p bmFsDQogIHVzZXIgaW50ZXJmYWNlIGZyYW1ld29yayBmb3IgT0NhbWwuDQoNCg0KW01vc2FpY10g PGh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYz4NCg0KV2hhdCBpcyBNb3NhaWM/DQri lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNb3NhaWMg aXMgYSBoaWdoLWxldmVsIGZyYW1ld29yayBmb3IgYnVpbGRpbmcgdGVybWluYWwgdXNlciBpbnRl cmZhY2VzDQogIGluIE9DYW1sLiBJdCBwcm92aWRlcyBhIFRFQSAoVGhlIEVsbSBBcmNoaXRlY3R1 cmUpIHJ1bnRpbWUgd2l0aCBhDQogIENTUy1jb21wYXRpYmxlIGZsZXhib3ggbGF5b3V0IGVuZ2lu ZSBhbmQgYSByaWNoIHNldCBvZiBjb21wb3NhYmxlDQogIGNvbXBvbmVudHMuIEl0IGhhbmRsZXMg dGV4dCBzaGFwaW5nIChzdHlsaW5nLCB3cmFwcGluZywgc2VsZWN0aW9uKSwNCiAgZm9jdXMgYW5k IGV2ZW50IGJ1YmJsaW5nLCB6LW9yZGVyaW5nLCBhbmQgcmVzcG9uc2l2ZSBsYXlvdXQuDQoNCiAg VW5kZXIgdGhlIGhvb2QsIGl0IGJ1aWxkcyBvbiB0d28gbGlicmFyaWVzIHRoYXQgY2FuIGFsc28g YmUgdXNlZA0KICBpbmRlcGVuZGVudGx5Og0KDQogIOKAoiAqTWF0cml4KjogYSB0ZXJtaW5hbCBy dW50aW1lIGZvY3VzZWQgb24gcGVyZm9ybWFuY2UgYW5kIG1vZGVybg0KICAgICBwcm90b2NvbHMu IEhpZ2hsaWdodHM6IG5lYXItemVyby1hbGxvY2F0aW9uIGRpZmZlZCByZW5kZXJpbmcsDQogICAg IGltbWVkaWF0ZS0gbW9kZSBBUEksIEtpdHR5IGtleWJvYXJkLCBTR1IvVVJYVlQvWDEwIG1vdXNl LCBicmFja2V0ZWQNCiAgICAgcGFzdGUsIGZvY3VzIHRyYWNraW5nLCBpbmxpbmUvYWx0L3NwbGl0 IGRpc3BsYXkgbW9kZXMsIGFuZCBidWlsdC1pbg0KICAgICBkZWJ1ZyBvdmVybGF5L2ZyYW1lIGR1 bXBzLiBJdCBhbHNvIHByb3ZpZGVzIGEgdmlydHVhbCB0ZXJtaW5hbA0KICAgICBlbXVsYXRvciAo VlRFKSBhbmQgcHNldWRvLXRlcm1pbmFsIChQVFkpIG1hbmFnZW1lbnQgc3Vic3lzdGVtcy4NCiAg 4oCiICpUb2ZmZWUqOiBhIENTUy1jb21wYXRpYmxlIGxheW91dCBlbmdpbmUuIEl0J3MgYSBwb3J0 IG9mIFJ1c3TigJlzDQogICAgIFtUYWZmeV0gd2l0aCBGbGV4Ym94LCBDU1MgR3JpZCwgYW5kIEJs b2NrIGxheW91dDsNCiAgICAgZ2FwL3BhZGRpbmcvYm9yZGVycy90aXRsZXM7IGFuZCBsYXlvdXQg Y2FjaGluZyBmb3IgZWZmaWNpZW5jeS4NCg0KDQpbVGFmZnldIDxodHRwczovL2dpdGh1Yi5jb20v RGlveHVzTGFicy90YWZmeT4NCg0KDQpXaHkgTW9zYWljPw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgVGVybWluYWwgVUlzIGFyZSBzZWVpbmcgYSByZW5haXNzYW5jZS4g VG9vbHMgbGlrZSBDbGF1ZGUgQ29kZSBhbmQNCiAgT3BlbkNvZGUgaGF2ZSBnb3R0ZW4gcGVvcGxl IGV4Y2l0ZWQgYWJvdXQgd2hhdCBjYW4gYmUgYnVpbHQgaW4gdGhlDQogIHRlcm1pbmFsIGFuZCB0 aGUgVFVJIGNvbW11bml0eSBpcyBnYWluaW5nIG1vbWVudHVtIGluIG90aGVyDQogIGVjb3N5c3Rl bXMuDQoNCiAgT0NhbWwgaGFzIGhhZCBMYW1iZGFUZXJtIGFuZCBOb3R0eSBmb3IgdGVybWluYWwg Z3JhcGhpY3MgZm9yIHllYXJzLA0KICBidXQgdGhlcmUncyBiZWVuIGEgZ2FwIHdoZW4gaXQgY29t ZXMgdG8gcGVyZm9ybWFuY2UgYW5kIGhpZ2gtbGV2ZWwNCiAgYWJzdHJhY3Rpb25zIGZvciBidWls ZGluZyBjb21wbGV4IFVJcy4NCg0KICBNb3NhaWMgYWltcyB0byBmaWxsIHRoYXQgZ2FwIGJ5IHBy b3ZpZGluZyBNYXRyaXggYXMgYSBzb2xpZCB0ZXJtaW5hbA0KICBmb3VuZGF0aW9uLCBhbmQgYnVp bGRpbmcgYSBoaWdoLWxldmVsIFRFQSBmcmFtZXdvcmsgd2l0aCBsYXlvdXQgYW5kDQogIGNvbXBv bmVudHMgb24gdG9wLg0KDQogIE9uIGEgcGVyc29uYWwgc2lkZSwgSSdtIGJ1aWxkaW5nIE1vc2Fp YyB0byBwb3dlciB0aGUgdHdvIHByb2plY3RzIEknbQ0KICBjdXJyZW50bHkgd29ya2luZyBvbjoN Cg0KICDigKIgSXQgd2lsbCBiZSB0aGUgYmFzaXMgZm9yIGEgVFVJIGRhc2hib2FyZCBmb3IgbW9u aXRvcmluZyBtb2RlbA0KICAgIHRyYWluaW5nIGluIFtSYXZlbl0uIFdlJ3JlIHN0YXJ0aW5nIGFu IFtPdXRyZWFjaHldIGludGVybnNoaXAgdG8NCiAgICBidWlsZCB0aGlzIG91dCB0aGlzIE1vbmRh eS4NCiAg4oCiIEl0IHBvd2VycyBTcGljZSwgdGhlIHVwY29taW5nIE9DYW1sIGNvZGluZyBhZ2Vu dCBJIGFubm91bmNlZCBhdA0KICAgIFtGdW5PQ2FtbCAyMDI1XS4NCg0KDQpbUmF2ZW5dIDxodHRw czovL2dpdGh1Yi5jb20vcmF2ZW4tbWwvcmF2ZW4+DQoNCltPdXRyZWFjaHldIDxodHRwczovL3d3 dy5vdXRyZWFjaHkub3JnLz4NCg0KW0Z1bk9DYW1sIDIwMjVdIDxodHRwczovL3d3dy55b3V0dWJl LmNvbS93YXRjaD92PUJBdlhxZDBRZVZNPg0KDQoNClRyeSBJdCBOb3cNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSBsaWJyYXJpZXMgYXJlbid0IG9uIG9wYW0geWV0LCBi dXQgeW91IGNhbiB0cnkgdGhlbSB0b2RheToNCg0KICAqT3B0aW9uIDE6IFBpbiBmcm9tIEdpdEh1 YioNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gcGluIGFkZCBodHRwczovL2dpdGh1 Yi5jb20vdG1hdHRpby9tb3NhaWMuZ2l0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogICpPcHRpb24g MjogQnVpbGQgZnJvbSBzb3VyY2UqDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBnaXQgY2xv bmUgaHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljDQogIOKUgiBjZCBtb3NhaWMNCiAg 4pSCIG9wYW0gaW5zdGFsbCAuIC0tZGVwcy1vbmx5DQogIOKUgiBkdW5lIGJ1aWxkDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIFRoZW4gcnVuIHNvbWUgZXhhbXBsZXM6DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiAjIEludGVyYWN0aXZlIEdhbWUgb2YgTGlmZSAocG9ydGVkIGZyb20gTm90dHkg ZXhhbXBsZXMpDQogIOKUgiBkdW5lIGV4ZWMgLi9tYXRyaXgvZXhhbXBsZXMvMDItbGlmZS9tYWlu LmV4ZQ0KICDilIIgDQogIOKUgiAjIFBhcnRpY2xlcyBzaW11bGF0aW9uIHdpdGggbXVsdGlwbGUg ZGlzcGxheSBtb2Rlcw0KICDilIIgZHVuZSBleGVjIC4vbWF0cml4L2V4YW1wbGVzLzE0LXBhcnRp Y2xlcy9tYWluLmV4ZQ0KICDilIIgDQogIOKUgiAjIEhpZ2gtbGV2ZWwgVEVBIGNvdW50ZXINCiAg 4pSCIGR1bmUgZXhlYyAuL21vc2FpYy9leGFtcGxlcy8wMS1jb3VudGVyL21haW4uZXhlDQogIOKU lOKUgOKUgOKUgOKUgA0KDQogIEhhdmUgYSBsb29rIGF0IHRoZSBleGFtcGxlcyBkaXJlY3Rvcmll cyAoW01hdHJpeF0gYW5kIFtNb3NhaWNdKSBmb3INCiAgbW9yZSBkZW1vcyB0byBleHBsb3JlIQ0K DQogIEFzIGEgYm9udXMsIHdlIGFsc28gaGF2ZSBtb3JlIGNvbXBsZXRlIGRlbW9zIGZvciBib3Ro IHByb2plY3RzOg0KDQogIOKAoiBBIGdyYXBoaWNhbCB0ZXJtaW5hbCBlbXVsYXRvciBidWlsdCB3 aXRoIE1hdHJpeDoNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljL3RyZWUv bWFpbi9tYXRyaXgvZXhhbXBsZXMveC1lbXVsYXRvcj4NCiAg4oCiIEEgZGFzaGJvYXJkIGFwcCBi dWlsdCB3aXRoIE1vc2FpYzoNCiAgICA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWlj L3RyZWUvbWFpbi9tb3NhaWMvZXhhbXBsZXMveC1kYXNoYm9hcmQ+DQoNCg0KW01hdHJpeF0gPGh0 dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYy90cmVlL21haW4vbWF0cml4L2V4YW1wbGVz Pg0KDQpbTW9zYWljXSA8aHR0cHM6Ly9naXRodWIuY29tL3RtYXR0aW8vbW9zYWljL3RyZWUvbWFp bi9tb3NhaWMvZXhhbXBsZXM+DQoNCg0KUXVpY2sgRXhhbXBsZXMNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogTW9zYWljOiBUaGUgRWxtIEFyY2hpdGVj dHVyZQ0KDQogIE1vc2FpYyBmb2xsb3dzIFRFQSBmb3IgYnVpbGRpbmcgZGVjbGFyYXRpdmUgVUlz Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BlbiBNb3NhaWNfdGVhDQogIOKUgiANCiAg 4pSCIHR5cGUgbXNnID0gSW5jcmVtZW50IHwgRGVjcmVtZW50IHwgUXVpdA0KICDilIIgDQogIOKU giBsZXQgaW5pdCAoKSA9ICgwLCBDbWQubm9uZSkNCiAg4pSCIA0KICDilIIgbGV0IHVwZGF0ZSBt c2cgbW9kZWwgPQ0KICDilIIgICBtYXRjaCBtc2cgd2l0aA0KICDilIIgICB8IEluY3JlbWVudCAt PiAobW9kZWwgKyAxLCBDbWQubm9uZSkNCiAg4pSCICAgfCBEZWNyZW1lbnQgLT4gKG1vZGVsIC0g MSwgQ21kLm5vbmUpDQogIOKUgiAgIHwgUXVpdCAtPiAobW9kZWwsIENtZC5xdWl0KQ0KICDilIIg DQogIOKUgiBsZXQgdmlldyBtb2RlbCA9DQogIOKUgiAgIGJveCB+YWxpZ25faXRlbXM6Q2VudGVy IH5qdXN0aWZ5X2NvbnRlbnQ6Q2VudGVyDQogIOKUgiAgICAgfnNpemU6eyB3aWR0aCA9IHBjdCAx MDA7IGhlaWdodCA9IHBjdCAxMDAgfQ0KICDilIIgICAgIFsNCiAg4pSCICAgICAgIGJveCB+Zmxl eF9kaXJlY3Rpb246Q29sdW1uIH5hbGlnbl9pdGVtczpDZW50ZXIgfmdhcDooZ2FwIDEpDQogIOKU giAgICAgICAgIH5ib3JkZXI6dHJ1ZSB+cGFkZGluZzoocGFkZGluZyAyKSB+dGl0bGU6IkNvdW50 ZXIiDQogIOKUgiAgICAgICAgIFsNCiAg4pSCICAgICAgICAgICB0ZXh0IH5jb250ZW50OihQcmlu dGYuc3ByaW50ZiAiQ291bnQ6ICVkIiBtb2RlbCkgKCk7DQogIOKUgiAgICAgICAgICAgdGV4dCB+ Y29udGVudDoiUHJlc3MgKyBvciAtIHRvIGNoYW5nZSwgcSB0byBxdWl0IiAoKTsNCiAg4pSCICAg ICAgICAgXTsNCiAg4pSCICAgICBdDQogIOKUgiANCiAg4pSCIGxldCBzdWJzY3JpcHRpb25zIF9t b2RlbCA9DQogIOKUgiAgIFN1Yi5vbl9rZXkgKGZ1biBldiAtPg0KICDilIIgICAgICAgbWF0Y2gg KE1vc2FpY191aS5FdmVudC5LZXkuZGF0YSBldikua2V5IHdpdGgNCiAg4pSCICAgICAgIHwgQ2hh ciBjIHdoZW4gVWNoYXIuZXF1YWwgYyAoVWNoYXIub2ZfY2hhciAnKycpIC0+IFNvbWUgSW5jcmVt ZW50DQogIOKUgiAgICAgICB8IENoYXIgYyB3aGVuIFVjaGFyLmVxdWFsIGMgKFVjaGFyLm9mX2No YXIgJy0nKSAtPiBTb21lIERlY3JlbWVudA0KICDilIIgICAgICAgfCBDaGFyIGMgd2hlbiBVY2hh ci5lcXVhbCBjIChVY2hhci5vZl9jaGFyICdxJykgLT4gU29tZSBRdWl0DQogIOKUgiAgICAgICB8 IEVzY2FwZSAtPiBTb21lIFF1aXQNCiAg4pSCICAgICAgIHwgXyAtPiBOb25lKQ0KICDilIIgDQog IOKUgiBsZXQgKCkgPSBydW4geyBpbml0OyB1cGRhdGU7IHZpZXc7IHN1YnNjcmlwdGlvbnMgfQ0K ICDilJTilIDilIDilIDilIANCg0KDQril4ogTWF0cml4OiBMb3ctTGV2ZWwgUG93ZXINCg0KICBG b3IgZGlyZWN0IHRlcm1pbmFsIGNvbnRyb2wsIE1hdHJpeCBwcm92aWRlcyBhbiBpbW1lZGlhdGUt bW9kZSBBUEk6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIE1hdHJpeA0KICDilIIg DQogIOKUgiBsZXQgKCkgPQ0KICDilIIgICBydW4NCiAg4pSCICAgICB+b25fcmVuZGVyOihmdW4g X2N0eCAtPg0KICDilIIgICAgICAgSW1hZ2UuKA0KICDilIIgICAgICAgICBzdHJpbmcgIkhlbGxv IGZyb20gTWF0cml4ISIgfD4gYmcgQ29sb3IuYmx1ZSB8PiBwYWQgfmw6MiB+dDoxKSkNCiAg4pSC ICAgICB+b25faW5wdXQ6KGZ1biBjdHggLT4gZnVuY3Rpb24NCiAg4pSCICAgICAgIHwgS2V5IHsg a2V5ID0gRXNjYXBlOyBfIH0gLT4gcXVpdCBjdHgNCiAg4pSCICAgICAgIHwgXyAtPiAoKSkNCiAg 4pSCICAgICAoKQ0KICDilJTilIDilIDilIDilIANCg0KDQpDb21pbmcgU29vbjogVFVJIGZvciBN TCBUcmFpbmluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg V2UncmUgc3RhcnRpbmcgYW4gW091dHJlYWNoeV0gaW50ZXJuc2hpcCB0byBidWlsZCBhIFRVSSBm b3IgbW9uaXRvcmluZw0KICBtb2RlbCB0cmFpbmluZyB3aXRoIFtSYXZlbl0sIHRoZSBzY2llbnRp ZmljIGNvbXB1dGluZyBlY29zeXN0ZW0gZm9yDQogIE9DYW1sLiBJdCB3aWxsIHByb3ZpZGUgYSBb VGVuc29yQm9hcmRdIGV4cGVyaWVuY2UgaW4gdGhlIHRlcm1pbmFsLA0KICBidWlsdCBlbnRpcmVs eSB3aXRoIE1vc2FpYy4NCg0KICBBIGdvb2QgZXhhbXBsZSBvZiB3aGF0IHdlJ3JlIGFpbWluZyB0 byBidWlsZCBpcyBXYW5kYidzIG5ld2x5IHJlbGVhc2VkDQogIFRVSToNCg0KICA8aHR0cHM6Ly91 czEuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxvYWRzL29jYW1sL29wdGltaXplZC8yWC8x LzFhMDMwMzQxOGZiYTY0YmI0YTE2OGU0YWUxNDg4NTkyZDNjYjk2YzBfMl8xMzgweDgxNC5qcGVn Pg0KDQoNCltPdXRyZWFjaHldIDxodHRwczovL3d3dy5vdXRyZWFjaHkub3JnLz4NCg0KW1JhdmVu XSA8aHR0cHM6Ly9naXRodWIuY29tL3JhdmVuLW1sL3JhdmVuPg0KDQpbVGVuc29yQm9hcmRdIDxo dHRwczovL3d3dy50ZW5zb3JmbG93Lm9yZy90ZW5zb3Jib2FyZD4NCg0KDQpNb3NhaWMgdnMgTm90 dHkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE5v dHR5IGlzIHRoZSBjdXJyZW50IGdvLXRvIHRlcm1pbmFsIFVJIGxpYnJhcnkgZm9yIE9DYW1sLCB3 aXRoIGENCiAgd2VsbC1kZXNpZ25lZCBkZWNsYXJhdGl2ZSBpbWFnZSBBUEkuIE1vc2FpYyBzaXRz IGEgbGV2ZWwgYWJvdmU6IGl04oCZcyBhDQogIFRFQSBydW50aW1lIHdpdGggZmxleGJveCBsYXlv dXQsIHJpY2ggY29tcG9uZW50cywgZm9jdXMvZXZlbnQNCiAgYnViYmxpbmcsIGFuZCBkaWZmZWQg cmVuZGVyaW5nIHZpYSBNYXRyaXguIEluIHNjb3BlLCBOb3R0eSBpcyBjbG9zZXINCiAgdG8gTWF0 cml4ICh0aGUgdGVybWluYWwgaW5mcmFzdHJ1Y3R1cmUgdW5kZXIgTW9zYWljKSB0aGFuIHRvIE1v c2FpYw0KICBpdHNlbGYuDQoNCiAgTWF0cml4IGNvdmVycyB0aGUgbG93LWxldmVsIHJlbmRlcmlu ZywgbW9kZXJuIHRlcm1pbmFsIHByb3RvY29scywgYW5kDQogIGltbWVkaWF0ZS1tb2RlIEFQSSB0 aGF0IE5vdHR5IGRvZXNu4oCZdC4gRm9yIGEgZGV0YWlsZWQgTWF0cml4IHZzIE5vdHR5DQogIGNv bXBhcmlzb24sIHNlZSBvdXIgW2NvbXBhcmlzb24gdGFibGVdLg0KDQoNCltjb21wYXJpc29uIHRh YmxlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS90bWF0dGlvL21vc2FpYy90cmVlL21haW4vbWF0cml4 I21hdHJpeC12cy1ub3R0eT4NCg0KDQpBY2tub3dsZWRnZW1lbnRzDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBNb3NhaWMgc3RhbmRzIG9uIHRo ZSBzaG91bGRlcnMgb2YgZ3JlYXQgd29yazoNCg0KICDigKIgW0J1YmJsZSBUZWFdIC0gaW5zcGly YXRpb24gZm9yIHRoZSBoaWdoLWxldmVsIFRFQSBydW50aW1lIGFuZCBhcHANCiAgICBzdHJ1Y3R1 cmUuDQogIOKAoiBbTm90dHldIC0gTWF0cml4J3MgZGVjbGFyYXRpdmUgSW1hZ2UgQVBJIGlzIGRp cmVjdGx5IGNvcGllZCBmcm9tDQogICAgTm90dHkncyB0byBwcm92aWRlIGEgZmFtaWxpYXIgaW50 ZXJmYWNlIGZvciBPQ2FtbCB1c2Vycy4NCiAg4oCiIFtPcGVuVFVJXSAtIHRoZSBiaWdnZXN0IGlu Zmx1ZW5jZSBvbiBNb3NhaWMgVUkgaW50ZXJuYWxzIChyZW5kZXINCiAgICB0cmVlLCB0ZXh0IGJ1 ZmZlciwgZXZlbnRzLCBzZWxlY3Rpb24pLiBNb3NhaWMncyBVSSBpbnRlcm5hbHMgaGF2ZQ0KICAg IGJlZW4gcmV3cml0dGVuIHRvIG1pcnJvciBPcGVuVFVJJ3MgZm9sbG93aW5nIGl0cyByZWxlYXNl LCBpZiB5b3UncmUNCiAgICB3b3JraW5nIGluIFR5cGVTY3JpcHQsIEkgY2FuJ3QgcmVjb21tZW5k IGl0IGVub3VnaCwgaXQncyBhIGZhbnRhc3RpYw0KICAgIHBpZWNlIG9mIGVuZ2luZWVyaW5nLg0K ICDigKIgW1JpY2hdIGFuZCBbVGV4dHVhbF0gLSBmb3IgaWRlYXMgb24gcmljaCB0ZXh0LCBkaWFn bm9zdGljcywgYW5kDQogICAgcG9saXNoZWQgdGVybWluYWwgVVguDQoNCg0KW0J1YmJsZSBUZWFd IDxodHRwczovL2dpdGh1Yi5jb20vY2hhcm1icmFjZWxldC9idWJibGV0ZWE+DQoNCltOb3R0eV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9wcXd5L25vdHR5Lz4NCg0KW09wZW5UVUldIDxodHRwczovL2dp dGh1Yi5jb20vc3N0L29wZW50dWkvPg0KDQpbUmljaF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9UZXh0 dWFsaXplL3JpY2gvPg0KDQpbVGV4dHVhbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9UZXh0dWFsaXpl L3RleHR1YWw+DQoNCg0KRmVlZGJhY2sgV2VsY29tZQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhpcyBpcyBhbiBlYXJseSBwcmV2aWV3LiBB UElzIGFyZSBzdGFiaWxpemluZyBidXQgbWF5IGNoYW5nZS4gSSdkDQogIGxvdmUgeW91ciBmZWVk YmFjayBvbjoNCg0KICDigKIgQVBJIGVyZ29ub21pY3MNCiAg4oCiIE1pc3NpbmcgY29tcG9uZW50 cyBvciBmZWF0dXJlcyB5b3UgbmVlZA0KICDigKIgUGVyZm9ybWFuY2Ugb24geW91ciB0ZXJtaW5h bA0KICDigKIgQnVncyAocGxlYXNlIG9wZW4gaXNzdWVzISkNCg0KICBHaXZlIGl0IGEgdHJ5IGFu ZCBsZXQgbWUga25vdyB3aGF0IHlvdSB0aGluayENCg0KDQpNYWtpbmcgaHRtbF9vZl9qc3ggfjEw eCBmYXN0ZXINCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvbWFraW5nLWh0bWwtb2YtanN4LTEweC1m YXN0ZXIvMTc1NzkvMT4NCg0KDQpEYXZpZCBTYW5jaG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0K ICBIZWxsbyBvY2FtbGVycywNCg0KICBJIHdyb3RlIGEgYmxvZyBwb3N0IGFib3V0IHNvbWUgb3B0 aW1pemF0aW9ucyBJIG1hZGUgaW4gW2h0bWxfb2ZfanN4XQ0KDQogIDxodHRwczovL3NhbmNoby5k ZXYvYmxvZy9tYWtpbmctaHRtbC1vZi1qc3gtMTB4LWZhc3Rlcj4NCg0KICBJIHdhbnRlZCB0byBz aGFyZSBpdCBzaW5jZSB0aG9zZSB0cmlja3MgYXJlIG9ubHkgcG9zc2libGUgYXQgdGhlDQogIHBy ZXByb2Nlc3Mgc3RhZ2UsIGFuZCBhIGxpYnJhcnkgd291bGQgZmFsbCBzaG9ydC4gaHRtbF9vZl9q c3ggaXMgYQ0KICBzbWFsbCBsaWJyYXJ5IHRoYXQgaXMgdXNlZCBpbiBhIGZldyBwbGFjZXMsIGJ1 dCBhbHNvIGEgcGxheWdyb3VuZCBmb3INCiAgc2VydmVyLXJlYXNvbi1yZWFjdCAoYSBiaWdnZXIg cHJvamVjdCkuDQoNCiAgQW55d2F5LCBJJ20gc3RpbGwgZ2V0dGluZyB1c2VkIHRvIHNoYXJlIHNv bWUgb2YgdGhlIGxvbmcgZm9ybXMgb2YNCiAgY29udGVudCwgc28gZmVlbCBmcmVlIHRvIGdpdmUg bWUgc29tZSBmZWVkYmFjay9jb3JyZWN0aW9ucyBvciBhc2sgYW55DQogIHF1ZXN0aW9uLg0KDQoN CltodG1sX29mX2pzeF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlc254L2h0bWxfb2ZfanN4Lz4N Cg0KDQpUeXJlIC0gdHlwZS1zYWZlIHJlZ3VsYXIgZXhwcmVzc2lvbnMgMS4wDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi10eXJlLXR5cGUt c2FmZS1yZWd1bGFyLWV4cHJlc3Npb25zLTEtMC8xNzU4NC8xPg0KDQoNCkVtaWxlIFRyb3RpZ25v biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3Vu Y2UgdGhlIHJlbGVhc2Ugb2YgW1R5cmVdIDEuMC4NCg0KICBUaGlzIHJlbGVhc2UgbWFrZXMgYmln IGNoYW5nZXMgdG8gdGhlIHR5cGluZzogdGhlcmUgaXMgYSB3aG9sZSBob3N0IG9mDQogIGZhciBt b3JlIHByYWN0aWNhbCBjb21iaW5hdG9ycyBhbGxvd2luZyB5b3UgdG8gd3JpdGUgY29kZSBsaWtl IGluIGENCiAgcGFyc2VyIGNvbWJpbmF0b3IgbGlicmFyeSA6DQoNCiAg4pSM4pSA4pSA4pSA4pSA DQogIOKUgiBsZXQgdXJsID0NCiAg4pSCICAgbGV0KyBzY2hlbWUgPSBvcHQgKGNvbnN0IEh0dHAg KHN0ciAiaHR0cCIpIDx8PiBjb25zdCBIdHRwcyAoc3RyICJodHRwIikgPCogc3RyICI6Ly8iKSAN CiAg4pSCICAgYW5kKyBob3N0ID0gcmVwX2FueQ0KICDilIIgICBhbmQrIHBvcnQgPSBvcHQgKHN0 ciAiOiIgKj4gcG9zX2ludCkNCiAg4pSCICAgYW5kKyBwYXRoID0gbGlzdCAoc3RyICIvIiAqPiBy ZXBfYW55KQ0KICDilIIgICBpbg0KICDilIIgICAoc2NoZW1lLCBob3N0LCBwb3J0LCBwYXRoKQ0K ICDilJTilIDilIDilIDilIANCiAgKHRoaXMgaXMgbm90IGEgY29ycmVjdCB1cmwgcGFyc2VyIGJ5 IGFueSBtZWFucywgaXRzIGp1c3QgdG8gZ2l2ZSBhbg0KICBpZGVhIG9mIGhvdyB5b3UgY2FuIHVz ZSB0aGlzIGxpYikNCg0KICBUaGlzIGRvZXMgbm90IGFsbG93IHlvdSB0byB1c2UgYGV2YWwnLCBi ZWNhdXNlIG9ubHkgb25lIGRpcmVjdGlvbiBvZg0KICB0aGUgY29udmVyc2lvbiBpcyBnaXZlbiAo dGhlcmUgaXMgbm8gY29kZSB0byBjb252ZXJ0IGZyb20gYSB1cmwNCiAgdHVwbGUpLiBIb3dldmVy IGluIHRoZSBjYXNlcyB3aGVyZSB5b3UgZG9uJ3QgbmVlZCBgZXZhbCcgdGhpcyBpcyBmYXINCiAg ZWFzaWVyIHRvIHdyaXRlLiBUaGUgZGlmZmVyZW5jZSBpcyB0eXBlZCwgeW91IGNhbid0IGdldCBy dW50aW1lIGVycm9yDQogIGJ5IGNhbGxpbmcgZXZhbCBvbiB0aGUgd3JvbmcgcmVnZXguDQoNCiAg VGhlcmUgYXJlIGFsc28gY29udmVuY2llbmNlIGNoYW5nZXMgc3VjaCBhcyBjaGFyc2V0IGFuZCB0 aGUNCiAgYG1hdGNoZWRfc3RyaW5nJyBmdW5jdGlvbiwgdGhhdCByZWR1Y2UgdGhlIG5lZWQgdG8g aW5zZXJ0IGBSZScgYml0cyBpbg0KICB5b3VyIHJlZ2V4cC4NCg0KICBIZXJlIGlzIHRoZSBmdWxs IGNoYW5nZWxvZzoNCg0KICDigKIgSW50cm9kdWNlIGNoYXJzZXRzOiBjb250cmFyeSB0byBgUmUn LCB0aGV5IGhhdmUgYSBkaWZmZXJlbnQgdHlwZQ0KICAgIGZyb20gcmVnZXguDQogIOKAoiBUeXBl IHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gcmVnZXhwcyB0aGF0IGNhbiBiZSBldmFsdWF0ZWQgcmV2 ZXJzZWQNCiAgICBhbmQgdGhlIG9uZXMgdGhhdCBjYW5ub3Q6IGAoZXZhbHVhYmxlLCAnYSkgVHly ZS50JyBhbmQNCiAgICBgKG5vbl9ldmFsdWFibGUsICdhKSBUeXJlLnQnLg0KICDigKIgSW50cm9k dWNlIGFsaWFzIGB0eXBlIHBhdHRlcm4nIGZvciBgKG5vbl9ldmFsdWFibGUsICdhKSBUeXJlLnQn Lg0KICDigKIgSW50cm9kdWNlIGB2YWwgbGlmdCA6ICgnYSAtPiBzdHJpbmcpIC0+ICdhIHBhdHRl cm4gLT4gKCdlLCAnYSkgdCcgdG8NCiAgICB0cmFuc2Zvcm0gYSBwYXR0ZXJuIGludG8gYW4gZXhw cmVzc2lvbiBieSBnaXZpbmcgYW4gZXhwbGljaXQNCiAgICBjb252ZXJzaW9uIGZ1bmN0aW9uLiAg QWxzbyBgbGlmdHBwJyB0aGF0IGRvZXMgdGhlIHNhbWUgd2l0aCBiZXR0ZXINCiAgICBwZXJmb3Jt YW5jZSBieSB1c2luZyBgRm9ybWF0Jy4NCiAg4oCiIEludHJvZHVjZSBgdmFsIHVubGlmdCA6IChl dmFsdWFibGUsICdhKSB0IC0+ICdhIHBhdHRlcm4nLg0KICDigKIgSW50cm9kdWNlIGB2YWwgZWl0 aGVyOiAoJ2UsICdhKSBUeXJlLnQgLT4gKCdlLCAnYikgVHlyZS50IC0+ICgnZSwNCiAgICAoJ2Es ICdiKSBFaXRoZXIudCkgVHlyZS50Jy4NCiAg4oCiIENoYW5nZSB0aGUgdHlwZSBvZiBgYWx0JyB0 byBgKF8sICdhKSB0IC0+IChfLCAnYSkgdCAtPiAnYQ0KICAgIHBhdHRlcm4nLiBQcmV2aW91cyB1 c2VycyBvZiBgYWx0JyBzaG91bGQgc3dpdGNoIHRvIGBlaXRoZXInLg0KICDigKIgSW50cm9kdWNl IGB+dmFsIGFsdF9ldmFsOiAoJ2EgLT4gW35MZWZ0IHwgflJpZ2h0XSkgLT4gKCdlLCAnYSkgdCAt Pg0KICAgICgnZSwgJ2EpIHQgLT4gKCdlLCAnYSkgdH4nIFRoaXMgaGFzIGZsYXQgdHlwaW5nIGJ1 dCBpcyBjb21wYXRpYmxlDQogICAgd2l0aCBgZXZhbCcuDQogIOKAoiBPcGVyYXRvcnM6IGA8fD4n IGlzIGBhbHQnLCBgPHx8PicgaXMgYGVpdGhlcicuDQogIOKAoiBJbnRyb2R1Y2UgYHZhbCBtYXAg OiAoJ2EgLT4gJ2IpIC0+IChfLCAnYSkgdCAtPiAnYiBwYXR0ZXJuJyBhbmQgaXRzDQogICAgY29y cmVzcG9uZGluZyBvcGVyYXRvcnM6IGBsZXQrJyBhbmQgYDwkPicuDQogIOKAoiBJbnRyb2R1Y2Ug YChhbmQrKScgd2hpY2ggaXMgYW4gYWxpYXMgb2YgYHNlcScuDQogIOKAoiBJbnRyb2R1Y2UgYHZh bCBhcHA6ICgnZSwgJ2EgLT4gJ2IpIHQgLT4gKCdlLCAnYSkgdCAtPiAnYiBwYXR0ZXJuJw0KICAg IGFuZCBpdHMgY29ycmVzcG9uZGluZyBvcGVyYXRvciBgPCo+Jw0KICDigKIgSW50cm9kdWNlIGB2 YWwgbWF0Y2hlZF9zdHJpbmcgOiAoXywgJ2EpIHQgLT4gKF8sIHN0cmluZykgdCcgdGhhdA0KICAg IGRpc2NhcmRzIHRoZSBjb21wdXRlZCB2YWx1ZSBhbmQganVzdCByZXR1cm4gdGhlIHN0cmluZyB0 aGF0IHdhcw0KICAgIG1hdGNoZWQuDQogIOKAoiBEcm9wIGRlcGVuZGVuY3kgb24gYFJlc3VsdCcg bGlicmFyeS4gU3RkbGliIGlzIG5vdyB1c2VkLg0KICDigKIgSW50cm9kdWNlIGB2YWwgcmVwX2No YXJzZXQ6IENoYXJzZXQudCAtPiAoXywgc3RyaW5nKSB0JywgYW5kDQogICAgc2hvcnRjdXQgYHZh bCByZXBfYW55OiAoXywgc3RyaW5nKSB0Jy4NCg0KDQpbVHlyZV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9EcnVwL3R5cmUvPg0KDQoNClBvcnRpbmcgYW4gT3hDYW1sIFByb2plY3QgdG8gRHVuZSBQYWNr YWdlIE1hbmFnZW1lbnQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYmxvZy1wb3J0 aW5nLWFuLW94Y2FtbC1wcm9qZWN0LXRvLWR1bmUtcGFja2FnZS1tYW5hZ2VtZW50LzE3NTgyLzE+ DQoNCg0KU3VkaGEgUGFyaW1hbGEgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHJl Y2VudGx5IHdvcmtlZCBvbiBwb3J0aW5nIHRoZSBbT3hDYW1sIHR1dG9yaWFsXSB0byBidWlsZCB3 aXRoIER1bmUNCiAgUGFja2FnZSBNYW5hZ2VtZW50LiBXaGF0IHdhcyBpbml0aWFsbHkgYW50aWNp cGF0ZWQgYXMgYQ0KICBzdHJhaWdodGZvcndhcmQgY2hhbmdlIGVuZGVkIHVwIHVuY292ZXJpbmcg YSBmZXcgaXNzdWVzIGFuZCByZXF1aXJpbmcNCiAgc2V2ZXJhbCBwYXRjaGVzLiBJIHdyb3RlIGFi b3V0IHRoZSBleHBlcmllbmNlIGhlcmU6DQogIDxodHRwczovL3RlbnNvcnMuaW5rL3Bvc3RzL294 Y2FtbC1kdW5lLXBrZz4uIEFueSBxdWVzdGlvbnMgb3IgZmVlZGJhY2sNCiAgd2VsY29tZSENCg0K DQpbT3hDYW1sIHR1dG9yaWFsXSA8aHR0cHM6Ly9naXRodWIuY29tL294Y2FtbC90dXRvcmlhbC1p Y2ZwMjU+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRl ZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0lDRlAgMjAyNTogTG9va2lu ZyBCYWNrIGF0IHRoZSBCaWdnZXN0IEZ1bmN0aW9uYWwgUHJvZ3JhbW1pbmcNCiAgICBDb25mZXJl bmNlIG9mIHRoZSBZZWFyXQ0KICDigKIgW0ZvdW5kYXRpb25hbCBBSSBmb3IgRWNvc3lzdGVtIFJl c2lsaWVuY2Ugd29ya3Nob3BdDQogIOKAoiBbVGlsZSBTZXJ2ZXJdDQogIOKAoiBbQSBWaXNpb24g Zm9yIE9DYW1sIGluIHRoZSBBSSBFcmEgLSBUaGliYXV0IE1hdHRpbyAtIEZVTiBPQ2FtbCAyMDI1 XQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0K W0lDRlAgMjAyNTogTG9va2luZyBCYWNrIGF0IHRoZSBCaWdnZXN0IEZ1bmN0aW9uYWwgUHJvZ3Jh bW1pbmcNCkNvbmZlcmVuY2Ugb2YgdGhlIFllYXJdDQo8aHR0cHM6Ly90YXJpZGVzLmNvbS9ibG9n LzIwMjUtMTItMDQtaWNmcC0yMDI1LWxvb2tpbmctYmFjay1hdC10aGUtYmlnZ2VzdC1mdW5jdGlv bmFsLXByb2dyYW1taW5nLWNvbmZlcmVuY2Utb2YtdGhlLXllYXI+DQoNCltGb3VuZGF0aW9uYWwg QUkgZm9yIEVjb3N5c3RlbSBSZXNpbGllbmNlIHdvcmtzaG9wXQ0KPGh0dHBzOi8vYW5pbC5yZWNv aWwub3JnL25vdGVzL2ZvdW5kYXRpb25hbC1lY29zeXN0ZW0td29ya3Nob3A+DQoNCltUaWxlIFNl cnZlcl0gPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjUvMTIvMDIvdGVzc2VyYS1zdGFjLz4N Cg0KW0EgVmlzaW9uIGZvciBPQ2FtbCBpbiB0aGUgQUkgRXJhIC0gVGhpYmF1dCBNYXR0aW8gLSBG VU4gT0NhbWwgMjAyNV0NCjxodHRwczovL3dhdGNoLm9jYW1sLm9yZy92aWRlb3Mvd2F0Y2gvYjk1 OWVlYWYtZThjMS00OGU0LTlkMTYtZjgwODRhN2JkZGE5Pg0KDQoNCk9sZCBDV04NCuKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBb c2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtl IGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hp dmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBt YWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4g U2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBv bHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9t bWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4u cGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1w YS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBz Oi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 02 to 09, 20= 25.

    editors dev-meeting: 15th of December about the ocaml.nv= im plugin

    Charl=C3=A8ne_Gros announced

    Hi!

    We are organizing the next public dev meeting about editors for OCaml!

    It will take place on December 15th at 5 pm.

    The focus will be on the new NeoVim plugin for OCaml, which adds extra feat= ures to the classical lspconfig for standard LSP support, to p= rovide all of the Merlin features in Neovim.

    We will explore why having this type of plugin is beneficial for maintainin= g OCaml editor tools, and we will dive into the codebase to understand how = it works and see what happens in Neovim.

    For the agenda:

    • A tour-de-table to allow the participants who wish to do so to present = themselves and mention issues / PRs they are interested in.
    • Talk and Q&A
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.

    Feel free to join!

    Meeting link: https://meet= .google.com/qxr-zxge-fvg

    Mosaic - A Modern Terminal User Interface Framework for OCaml = (Early Preview)

    Thibaut Mattio announced

    I'm excited to share an early preview of Mosaic, a modern terminal user interface framework for OCam= l.

    What is Mosaic?

    Mosaic is a high-level framework for building terminal user interfaces in O= Caml. It provides a TEA (The Elm Architecture) runtime with a CSS-compatibl= e flexbox layout engine and a rich set of composable components. It handles= text shaping (styling, wrapping, selection), focus and event bubbling, z-o= rdering, and responsive layout.

    Under the hood, it builds on two libraries that can also be used independen= tly:

    • Matrix: a terminal runtime focused on performance and modern pro= tocols. Highlights: near-zero-allocation diffed rendering, immediate- mode = API, Kitty keyboard, SGR/URXVT/X10 mouse, bracketed paste, focus tracking, = inline/alt/split display modes, and built-in debug overlay/frame dumps. It = also provides a virtual terminal emulator (VTE) and pseudo-terminal (PTY) m= anagement subsystems.
    • Toffee: a CSS-compatible layout engine. It's a port of Rust=E2= =80=99s Taffy with Flex= box, CSS Grid, and Block layout; gap/padding/borders/titles; and layout cac= hing for efficiency.

    Why Mosaic?

    Terminal UIs are seeing a renaissance. Tools like Claude Code and OpenCode = have gotten people excited about what can be built in the terminal and the = TUI community is gaining momentum in other ecosystems.

    OCaml has had LambdaTerm and Notty for terminal graphics for years, but the= re's been a gap when it comes to performance and high-level abstractions fo= r building complex UIs.

    Mosaic aims to fill that gap by providing Matrix as a solid terminal founda= tion, and building a high-level TEA framework with layout and components on= top.

    On a personal side, I'm building Mosaic to power the two projects I'm curre= ntly working on:

    • It will be the basis for a TUI dashboard for monitoring model training = in Raven. We're starting = an Outreachy internship to build= this out this Monday.
    • It powers Spice, the upcoming OCaml coding agent I announced at FunOCaml 2025.

    Try It Now

    The libraries aren't on opam yet, but you can try them today:

    Option 1: Pin from GitHub

    opam pin add https://github.com/tmattio/mosaic.git
    

    Option 2: Build from source

    git clone https://github.com/tmattio/mosaic
    cd mosaic
    opam install . --deps-only
    dune build
    

    Then run some examples:

    # Interactive Game of Life (ported from Notty examples)
    dune exec ./matrix/examples/02-life/main.exe
    
    # Particles simulation with multiple display modes
    dune exec ./matrix/examples/14-particles/main.exe
    
    # High-level TEA counter
    dune exec ./mosaic/examples/01-counter/main.exe
    

    Have a look at the examples directories (Matrix and Mosaic) for more demo= s to explore!

    As a bonus, we also have more complete demos for both projects:

    Quick Examples

    • Mosaic: The Elm Architecture

      Mosaic follows TEA for building declarative UIs:

      open M=
      osaic_tea
      
      type msg =3D Increment | Decrement | Quit
      
      let init () =3D (0, Cmd.none)
      
      let update msg model =3D
        match msg with
        | Increment -> (model + 1, Cmd.none)
        | Decrement -> (model - 1, Cmd.none)
        | Quit -> (model, Cmd.quit)
      
      let view model =3D
        box ~align_items:Center ~justify_content:Center
          ~size:{ width=
       =3D pct 100; height =3D pct 100 }
          [
            box ~flex_directio=
      n:Column ~align_items:Center ~g=
      ap:(gap 1)
              ~border:<=
      span style=3D"color: #00824f;">true ~padding:(padding 2) ~title:"Count=
      er"
              [
                text ~content<=
      /span>:(Printf.sp=
      rintf "Count: %d" model) ();
                text ~content<=
      /span>:"Press + or - to change, q to quit"<=
      /span> ();
              ];
          ]
      
      let subscriptions _=
      model =3D
        Sub.on_key (fun ev ->
            match (Mosaic_ui.Event.Key.d=
      ata ev).key with
            | Char c when Uchar.equal c (Uchar.of_char '+') -> Some Increment
            | Char c when Uchar.equal c (Uchar.of_char '-') -> Some Decrement
            | Char c when Uchar.equal c (Uchar.of_char 'q') -> Some Quit
            | Escape -> Some Quit
            | _ -> None)
      
      let () =3D run { =
      init; update; view; subscriptions }
      
    • Matrix: Low-Level Power

      For direct terminal control, Matrix provides an immediate-mode API:

      open M=
      atrix
      
      let () =3D
        run
          ~on_render:(<=
      span style=3D"color: #006f00; font-weight: bold;">fun _ctx ->
            Image.(
              string "Hello from Matrix!" =
      |> bg Color.blue |=
      > pad ~l:2 ~t:1))
          ~on_input:(fun ctx -> function
            | Key { key =3D Escape; _ } -> quit ctx
            | _ -> ())
          ()
      

    Coming Soon: TUI for ML Training

    We're starting an Outreachy inte= rnship to build a TUI for monitoring model training with Raven, the scientific computing ecosystem f= or OCaml. It will provide a TensorBoard experience in the terminal, built entirely with Mosaic.

    A good example of what we're aiming to build is Wandb's newly released TUI:

    3D"1a0=

    Mosaic vs Notty

    Notty is the current go-to terminal UI library for OCaml, with a well-desig= ned declarative image API. Mosaic sits a level above: it=E2=80=99s a TEA ru= ntime with flexbox layout, rich components, focus/event bubbling, and diffe= d rendering via Matrix. In scope, Notty is closer to Matrix (the terminal i= nfrastructure under Mosaic) than to Mosaic itself.

    Matrix covers the low-level rendering, modern terminal protocols, and immed= iate-mode API that Notty doesn=E2=80=99t. For a detailed Matrix vs Notty co= mparison, see our comparison table.

    Acknowledgements

    Mosaic stands on the shoulders of great work:

    • Bubble Tea -= inspiration for the high-level TEA runtime and app structure.
    • Notty - Matrix's declara= tive Image API is directly copied from Notty's to provide a familiar interf= ace for OCaml users.
    • OpenTUI - the biggest i= nfluence on Mosaic UI internals (render tree, text buffer, events, selectio= n). Mosaic's UI internals have been rewritten to mirror OpenTUI's following= its release, if you're working in TypeScript, I can't recommend it enough,= it's a fantastic piece of engineering.
    • Rich and Textual - for ideas on rich tex= t, diagnostics, and polished terminal UX.

    Feedback Welcome

    This is an early preview. APIs are stabilizing but may change. I'd love you= r feedback on:

    • API ergonomics
    • Missing components or features you need
    • Performance on your terminal
    • Bugs (please open issues!)

    Give it a try and let me know what you think!

    Making html_of_jsx ~10x faster

    David Sancho announced

    Hello ocamlers,

    I wrote a blog post about some optimizations I made in html_of_jsx=20=20

    https://s= ancho.dev/blog/making-html-of-jsx-10x-faster

    I wanted to share it since those tricks are only possible at the preprocess= stage, and a library would fall short. html_of_jsx is a small library that= is used in a few places, but also a playground for server-reason-react (a = bigger project).

    Anyway, I'm still getting used to share some of the long forms of content, = so feel free to give me some feedback/corrections or ask any question.

    Tyre - type-safe regular expressions 1.0

    Emile Trotignon announced

    I am happy to announce the release of Tyre 1.0.

    This release makes big changes to the typing: there is a whole host of far = more practical combinators allowing you to write code like in a parser comb= inator library :

    let url =3D
      let+ scheme =3D opt (const Http (str "http") <=
    ;|> const Https (str "http") &=
    lt;* str "://")=20
      and+ host =3D rep_any
      and+ port =3D opt (str ":" *> pos_int)
      and+ path =3D list (str "/" *> rep_any)
      in
      (scheme, host, port, path)
    

    (this is not a correct url parser by any means, its just to give an idea of= how you can use this lib)

    This does not allow you to use eval, because only one directio= n of the conversion is given (there is no code to convert from a url tuple)= . However in the cases where you don't need eval this is far e= asier to write. The difference is typed, you can't get runtime error by cal= ling eval on the wrong regex.

    There are also convencience changes such as charset and the matched_s= tring function, that reduce the need to insert Re bits = in your regexp.

    Here is the full changelog:

    • Introduce charsets: contrary to Re, they have a different = type from regex.
    • Type the difference between regexps that can be evaluated reversed and = the ones that cannot: (evaluable, 'a) Tyre.t and (non_evalua= ble, 'a) Tyre.t.
    • Introduce alias type pattern for (non_evaluable, 'a)= Tyre.t.
    • Introduce val lift : ('a -> string) -> 'a pattern -> ('e= , 'a) t to transform a pattern into an expression by giving an explicit conversion function. Also liftpp that does the same with better performance by usin= g Format.
    • Introduce val unlift : (evaluable, 'a) t -> 'a pattern.=
    • Introduce val either: ('e, 'a) Tyre.t -> ('e, 'b) Tyre.t ->= ('e, ('a, 'b) Either.t) Tyre.t.
    • Change the type of alt to (_, 'a) t -> (_, 'a) t = -> 'a pattern. Previous users of alt should switch to either.
    • Introduce ~val alt_eval: ('a -> [~Left | ~Right]) -> ('e, '= a) t -> ('e, 'a) t -> ('e, 'a) t~ This has flat typing but is compatible with eval.
    • Operators: <|> is alt, <||>= is either.
    • Introduce val map : ('a -> 'b) -> (_, 'a) t -> 'b patter= n and its corresponding operators: let+ and <$>.
    • Introduce (and+) which is an alias of seq.
    • Introduce val app: ('e, 'a -> 'b) t -> ('e, 'a) t -> 'b = pattern and its corresponding operator <*>
    • Introduce val matched_string : (_, 'a) t -> (_, string) t that discards the computed value and just return the string that was matched.
    • Drop dependency on Result library. Stdlib is now used.
    • Introduce val rep_charset: Charset.t -> (_, string) t, = and shortcut val rep_any: (_, string) t.

    Porting an OxCaml Project to Dune Package Management

    Sudha Parimala announced

    I recently worked on porting the OxCaml tutorial to build with Dune Package Management. What= was initially anticipated as a straightforward change ended up uncovering = a few issues and requiring several patches. I wrote about the experience he= re: https://tensors.i= nk/posts/oxcaml-dune-pkg. Any questions or feedback welcome!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=CmdYTyMs; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 9764140084 for ; Tue, 16 Dec 2025 13:31:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=RG1GO3BkmspsonOBZqCkY7R0VrhIzUhchkL77UdOvno=; b=CmdYTyMs6ap1ajx/t7u0wQ8gqmcRjOSQgCkDNM6aUfqdAkBax/YsXcdP gxokprQHpGOOlSuZ8gCehFr6c2vBsh5iIq+GB28Tl6+dt8X7R1NyZK06D au1lD2Jjw6oPmKv/YYZuENKA3B2/rqx+beUXyXD73IPZXiE9MLAAYAf/p A=; X-CSE-ConnectionGUID: r4xC5wX+TtaitUDTmZwNgg== X-CSE-MsgGUID: /WcjeEhaTJq6OJJSJ97LfQ== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,153,1763420400"; d="scan'208,217";a="254701759" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 16 Dec 2025 14:31:06 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 1A52281C2B; Tue, 16 Dec 2025 14:31:06 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (dsi-ha-lb1-dmz.inria.fr [128.93.162.100]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 5E26C81BC6 for ; Tue, 16 Dec 2025 14:30:56 +0100 (CET) X-CSE-ConnectionGUID: mu5iamSiSv+v4VP3crSxIA== X-CSE-MsgGUID: XKSG8vBbTGa3UUnLWiMSNA== IronPort-SDR: 69415f0e_M9Oi71f75pk0S0x6YdcC6dTKCB6LxvxWPlEGnFuxG2lVmQy ROp7NVIyW8AFdILaR40+Wyahmu86eEunnzTKA+w== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EyBQAEXkFphSIeaIFahBZbKBkBbF8zBwhJhFWDTwiLP?= =?us-ascii?q?YJgnEiBaYEsFgUeFQEDAQ0uARsEAQIEAQEDAQIBggyCdAIWjFMCHwYBBDQTA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABAQEBQEmGTw2CR?= =?us-ascii?q?Rk4Ux5lCQYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAECBRwQawECBgQGEwEBJhIYFA8DF?= =?us-ascii?q?AEGAwIEDQE1AwETARIaghBYAYIgAgJPAwUMBAKWNJtNen8zgQGCDAEBBoEIP?= =?us-ascii?q?gIBAgIHAgUBDgkm2g6BZAmBMxiFboJKGwEFJUlRGgKESQmEMgInD4FVRIFKg?= =?us-ascii?q?XMSP2+BfkELFwEBAQEVA4EIBAUBCwYCAQgSDyQJgyWCaYImehQdhgKCcHgvB?= =?us-ascii?q?4VZBolbgURLMywBVRMXCwcFXoEIAyo0LW4yHYEjPhdzgRSDSR5oDwaBEYNPi?= =?us-ascii?q?RgPiWxXAwttPTcUG5R6QxkWEyWBQCUOOAYrExoBOQUDEQ4BASAPHwEBBAQJG?= =?us-ascii?q?goHBQoZHQkEAQkCGS8LOgOEYI1uCSQBAyoCj1qOGJNZgQo0B4QfgV4GDIkIg?= =?us-ascii?q?SaHJo5ghASBV4VAhXyHApE2gRwimGQiiV2BJgmBb2uFI4NXgRSLFjwEhVSBf?= =?us-ascii?q?yNsPwEdDAczGjAiIQ0PBIITAQEyCUYcD44tFoNeECOBC4MaFyTDbi8CQjUCA?= =?us-ascii?q?QEHMQIHAQoBAQMJhWIBAWmLHSwIgUsBAQ?= IronPort-PHdr: A9a23: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 i9NLWeg4HvYCJIZnhE/bfo74lJWL9L/Ens= IronPort-Data: A9a23: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 4QqbTgsfXxXgnId3Sqtl7C51f3ZUP7SI+0UUBqy IronPort-HdrOrdr: A9a23:FoTDsK8nNeb06FCNOlNuk+DlI+orL9Y04lQ7vn2ZKCYlEfBw8v rFoB1173HJYVoqNU3I+urhBEDjexLhHPdOiOF7AV7IZmbbUQWTQL1K3M/L/HnLGiH19OJRvJ 0QEZRWOZnXFlY/qc775WCDYrIdKTS8gcWVuds= X-Talos-CUID: =?us-ascii?q?9a23=3ANLysVmoglI0jJMv3aCb6C4rmUcU4L3zUyUzRGFH?= =?us-ascii?q?7FzpXcOaeU2SA2Yoxxg=3D=3D?= X-Talos-MUID: 9a23:S6GNCwW8lIHOt/3q/A/Pvx4yKu1i34unU30wl7E5uuy/EwUlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,153,1763420400"; d="scan'208,217";a="133857738" X-URL-ContentFilter: X-MGA-submission: =?us-ascii?q?MDFRc+A1yEtk35MQj002IfPKOpEYKGl9p4fdYe?= =?us-ascii?q?SHKQD3V6d+I+fw5Dq2OEbOP+ARAvbnpgpXd/2fabEno+hoaUN+dudJBI?= =?us-ascii?q?pF1FMQ9hOnEq7nM8Gzi4WPliazSmfG4NE7G8c1pJ139U4UmbJsUicoHO?= =?us-ascii?q?4ttvmoWtuiXrDWDany29/u3w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 16 Dec 2025 14:30:54 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8EFF81A372; Tue, 16 Dec 2025 14:30:53 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 16 Dec 2025 14:30:53 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 16 14:30:53 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499999, queueID=B02F11A3B2 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19412 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMDkgdG8gMTYsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClNvZnR3 YXJlIEVuZ2luZWVyIChPQ2FtbCkg4oCTIExleGlGaSwgUGFyaXMNCk9wYW0gcmVwb3NpdG9yeSBh cmNoaXZhbCwgbmV4dCBydW4gKHNjaGVkdWxlZCAyMDI2LTAxLTAxKQ0KYmxhbWUsIGEgc2ltcGxl IHdlYmFwcCBhcyBhbiB1bmlrZXJuZWwNCkEgbmV3IGtpbmQgb2Yga25vd2xlZGdlLWJhc2UgZm9y IE9DYW1sJ3MgZG9jDQpTZXJpYWxwb3J0IC0gbmV3IHNlcmlhbCBjb21tdW5pY2F0aW9uIGxpYnJh cnkNCkx3dC42LjAuMH5iZXRhIChkaXJlY3Qtc3R5bGUsIG11bHRpLWRvbWFpbiBwYXJhbGxlbGlz bSkNCkNhbGwgZm9yIFBhcnRpY2lwYXRpb246IEJPQiAyMDI2IChCZXJsaW4sIE1hciAxMykNCk90 aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpTb2Z0d2FyZSBFbmdpbmVlciAoT0NhbWwpIOKA kyBMZXhpRmksIFBhcmlzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2pvYi1zb2Z0d2FyZS1lbmdpbmVlci1vY2FtbC1sZXhpZmktcGFyaXMv MTc1ODYvMT4NCg0KDQpBbGFpbiBGcmlzY2ggYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBh bGwsDQoNCiAgW0xleGlGaV0gaXMgbG9va2luZyBmb3IgYSAqU29mdHdhcmUgRW5naW5lZXIqIHRv IGpvaW4gb3VyIGRldmVsb3BtZW50DQogIHRlYW0gaW4gUGFyaXMuIFRoZSB3b3JrIGlzIHByaW1h cmlseSBpbiBPQ2FtbCwgY29udHJpYnV0aW5nIHRvIG91cg0KICBjb2RlYmFzZSBhY3Jvc3MgY29y ZSBjb21wb25lbnRzLCB0b29saW5nLCBhbmQgcHJvZHVjdCBmZWF0dXJlcy4NCg0KICBJZiB5b3Un cmUgaW50ZXJlc3RlZCBpbiB3b3JraW5nIG9uIGEgbGFyZ2UsIGxvbmctbGl2ZWQgT0NhbWwgc3lz dGVtDQogIHVzZWQgaW4gcHJvZHVjdGlvbiBieSBmaW5hbmNpYWwgaW5zdGl0dXRpb25zLCB5b3Ug Y2FuIGZpbmQgdGhlIGZ1bGwNCiAgam9iIGRlc2NyaXB0aW9uIGhlcmU6DQogIFtodHRwczovL3d3 dy5sZXhpZmkuY29tL2NhcmVlcnMvc29mdHdhcmVfZW5naW5lZXIvXQ0KDQogIEhhcHB5IHRvIGFu c3dlciBhbnkgcXVlc3Rpb25zIQ0KDQoNCltMZXhpRmldIDxodHRwczovL3d3dy5sZXhpZmkuY29t Pg0KDQpbaHR0cHM6Ly93d3cubGV4aWZpLmNvbS9jYXJlZXJzL3NvZnR3YXJlX2VuZ2luZWVyL10N CjxodHRwczovL3d3dy5sZXhpZmkuY29tL2NhcmVlcnMvc29mdHdhcmVfZW5naW5lZXIvP3V0bV9z b3VyY2U9Y2hhdGdwdC5jb20+DQoNCg0KT3BhbSByZXBvc2l0b3J5IGFyY2hpdmFsLCBuZXh0IHJ1 biAoc2NoZWR1bGVkIDIwMjYtMDEtMDEpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29wYW0tcmVwb3NpdG9yeS1hcmNoaXZhbC1uZXh0LXJ1bi1zY2hlZHVs ZWQtMjAyNi0wMS0wMS8xNzU4Ny8xPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeW9uZSwNCg0KICB3ZSBkaWQgYW5vdGhlciBydW4g b2YgdGhlIGFyY2hpdmFsIGJhc2VkIG9uIHRoZSB4LW1haW50ZW5hbmNlLWludGVudA0KICBvZiBv cGFtIHBhY2thZ2VzLiBUaGUgcnVuIHdhcyB1c2luZyBbb3BhbS1yZXBvc2l0b3J5IGF0IGNvbW1p dA0KICBkNjg0Yzg5NmViNmY3ZTYwMzBkNmVlNjUzMzhkOWRiMjJhNjEyZjAxXSAoRGVjIDl0aCwg MjA6MDA6MDAgQ0VUKS4NCg0KICBUaGUgdG9vbCB1c2VkIGlzIFttYWludGVuYW5jZS1pbnRlbnQt ZmlsdGVyXSB3aXRoIG9wYW0gMi41IGFuZCBPQ2FtbA0KICA1LjQuIEl0IHRvb2sgYXJvdW5kIDFH QiBvZiBtZW1vcnkgYW5kIGFyb3VuZCAxMDBoIG9mIENQVSB0aW1lDQogIChbZG9uYXRpb25zIHdl bGNvbWVdKS4NCg0KICBJbiB0b3RhbCwgNDUxMCBwYWNrYWdlcyB3ZXJlIGNhbmRpZGF0ZXMsIG91 dCBvZiB3aGljaCAzMzYxIGFyZQ0KICBzY2hlZHVsZWQgZm9yIGFyY2hpdmFsLg0KDQoNCltvcGFt LXJlcG9zaXRvcnkgYXQgY29tbWl0IGQ2ODRjODk2ZWI2ZjdlNjAzMGQ2ZWU2NTMzOGQ5ZGIyMmE2 MTJmMDFdDQo8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeS90cmVlL2Q2 ODRjODk2ZWI2ZjdlNjAzMGQ2ZWU2NTMzOGQ5ZGIyMmE2MTJmMDE+DQoNClttYWludGVuYW5jZS1p bnRlbnQtZmlsdGVyXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9oYW5uZXNtL21haW50ZW5hbmNlLWlu dGVudC1maWx0ZXIvdHJlZS8xNGQzZDgwZWQxZDI2ZjI3NzlmMGNlZDNlM2I5ODUyYmM1OWFjN2Zi Pg0KDQpbZG9uYXRpb25zIHdlbGNvbWVdIDxodHRwczovL3JvYnVyLmNvb3AvRG9uYXRlPg0KDQpU ZXN0aW5nDQrilYzilYzilYzilYzilYzilYzilYwNCg0KICBUbyB0ZXN0IHdoZXRoZXIgeW91ciBD SSAvIGxvY2sgLyBlbnZpcm9ubWVudCB3aWxsIGJlIGFmZmVjdGVkIGJ5IHRoZQ0KICByZW1vdmFs IG9mIHBhY2thZ2VzLCB5b3UgY2FuIGNyZWF0ZSBhIGZyZXNoIG9wYW0gc3dpdGNoIGFuZCB1c2Ug dGhlDQogIG9wYW0tcmVwb3NpdG9yeSBmcm9tIHRoZSBicmFuY2g6DQoNCiAg4pSM4pSA4pSA4pSA 4pSADQogIOKUgiAkIG9wYW0gcmVwb3NpdG9yeSBhZGQgYXJjaGl2YWwtMjAyNjAxMDEgaHR0cHM6 Ly9naXRodWIuY29tL2hhbm5lc20vb3BhbS1yZXBvc2l0b3J5LmdpdCNhcmNoaXZhbC0yMDI2MDEw MQ0KICDilIIgJCBvcGFtIHN3aXRjaCBjcmVhdGUgYXJjaGl2YWwtMjAyNjAxMDEgIC0tcmVwb3Np dG9yaWVzIGFyY2hpdmFsLTIwMjYwMTAxDQogIOKUgiAkIGV2YWwgYG9wYW0gZW52YA0KICDilJTi lIDilIDilIDilIANCg0KICBBbHRlcm5hdGl2ZWx5LCBpbiBDSSBzeXN0ZW1zIHlvdSBjYW4gZG8g dGVtcG9yYXJpbHkgZm9yIHRlc3Rpbmc6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgJCBvcGFt IHJlcG8gc2V0LXVybCBkZWZhdWx0IGh0dHBzOi8vZ2l0aHViLmNvbS9oYW5uZXNtL29wYW0tcmVw b3NpdG9yeS5naXQjYXJjaGl2YWwtMjAyNjAxMDENCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KUmV2 ZXJ0aW5nIGFyY2hpdmFsDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYwNCg0KICBJZiB5b3Ugd2FudCB0byBwcmVzZXJ2ZSBhIHBhY2thZ2UsIHBs ZWFzZSBkb27igJl0IGhlc2l0YXRlIHRvIGNvbW1lbnQgb24NCiAgdGhlIGlzc3VlIDxodHRwczov L2dpdGh1Yi5jb20vb2NhbWwvb3BhbS1yZXBvc2l0b3J5L3B1bGwvMjkwNTg+DQoNCiAgSXQgaXMg aW1wb3J0YW50IHRoYXQgeW91IGluY2x1ZGUgdGhlIHBhY2thZ2UgbmFtZSBhbmQgaXRzIHZlcnNp b24sIGFzDQogIHdlbGwgYXMgd2hlcmUgaXQgaXMgdXNlZCAocHJlZmVyYWJseSBhIFVSTCksIGFu ZCBhIGNvbnRhY3QgKGVtYWlsDQogIGFkZHJlc3MpLg0KDQogIC9FZGl0b3LigJlzIG5vdGU6IHBs ZWFzZSBmb2xsb3cgdGhlIGFyY2hpdmUgbGluayBmb3IgdGhlIGxpc3Qgb2YNCiAgcGFja2FnZXMg dG8gYmUgYXJjaGl2ZWQuLw0KDQoNCmJsYW1lLCBhIHNpbXBsZSB3ZWJhcHAgYXMgYW4gdW5pa2Vy bmVsDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1i bGFtZS1hLXNpbXBsZS13ZWJhcHAtYXMtYW4tdW5pa2VybmVsLzE3NTg4LzE+DQoNCg0KQ2FsYXNj aWJldHRhIFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEkgYW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgZGV2ZWxvcG1lbnQgb2YgW2BibGFtZSdd LCBhIHVuaWtlcm5lbA0KICB0aGF0IHByb3ZpZGVzIGEgc2VhcmNoIGVuZ2luZSBpbiB0aGUgZm9y bSBvZiBhIHdlYiBpbnRlcmZhY2UgYmFzZWQgb24NCiAgYW4gZW1haWwgYXJjaGl2ZS4NCg0KICBU aGlzIHdvcmsgaXMgc3BvbnNvcmVkIGJ5IFtOTG5ldF0gYXMgcGFydCBvZiBvdXIgW1BUVF0gcHJv amVjdC4gRm9yDQogIG1vcmUgZGV0YWlscyBvbiB0aGUgdW5pa2VybmVsLCBvdXIgYXJjaGl2ZSBz eXN0ZW0sIGFuZCBvdXIgc2VhcmNoDQogIGVuZ2luZSwgd2UgcmVjb21tZW5kIHJlYWRpbmcgb3Vy IGFydGljbGUgYXZhaWxhYmxlIFtoZXJlXS4gVGhpcw0KICBwcm9qZWN0IGlzIHRoZSBzeW50aGVz aXMgb2Ygc2V2ZXJhbCBwcm9qZWN0cyBvbiB0aGUgc3ViamVjdDoNCiAg4oCiIFttcm1pbWVdIHRv IHBhcnNlL2VuY29kZSBlbWFpbHMNCiAg4oCiIFtjYXJ0b25dIHRvIGFyY2hpdmUgZW1haWxzDQog IOKAoiBbc3RlbV0gdG8gc2VhcmNoIGVtYWlscw0KICDigKIgW2JsYXplXSBsaWtlIGEgU3dpc3Mg QXJteSBrbmlmZSBmb3IgbWFuaXB1bGF0aW5nIGVtYWlscyBhbmQgYXJjaGl2ZXMNCiAg4oCiIGFu ZCBvZiBjb3Vyc2Ugc29tZSBvZiBvdXIgcHJvamVjdHMgbGlrZSBbbWlvdV0sIFt1dGNwXSBvciBb dmlmXQ0KDQogIElmIHlvdSBsaWtlIG91ciB3b3JrLCB5b3UgY2FuIHNwb25zb3IgdXMgW3ZpYSBH aXRIdWJdIG9yIGJ5IGZvbGxvd2luZw0KICB0aGUgaW5zdHJ1Y3Rpb25zIGF2YWlsYWJsZSBbaGVy ZV0uIFRoYW5rIHlvdSB0byBldmVyeW9uZSB3aG8gaGFzDQogIHBhcnRpY2lwYXRlZCBpbiB0aGUg ZGV2ZWxvcG1lbnQgb2YgdGhlc2UgcHJvamVjdHMsIHdoZXRoZXIgZGlyZWN0bHkgb3INCiAgaW5k aXJlY3RseS4NCg0KICBTbywgaGFwcHkgaGFja2luZyAiZGlzY3JpbWluYXRpbmcgaGFja2VycyIg OikgIQ0KDQoNCltgYmxhbWUnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvYmxhbWUu Z2l0Pg0KDQpbTkxuZXRdIDxodHRwczovL25sbmV0Lm5sLz4NCg0KW1BUVF0gPGh0dHBzOi8vbmxu ZXQubmwvcHJvamVjdC9QVFQvPg0KDQpbaGVyZV0NCjxodHRwczovL2Jsb2cucm9idXIuY29vcC9h cnRpY2xlcy8yMDI1LTA0LTEyLXB0dC1zZWFyY2gtd2ViYXBwLmh0bWw+DQoNClttcm1pbWVdIDxo dHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21ybWltZT4NCg0KW2NhcnRvbl0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9yb2J1ci1jb29wL2NhcnRvbj4NCg0KW3N0ZW1dIDxodHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC9zdGVtPg0KDQpbYmxhemVdIDxodHRwczovL2dpdGh1Yi5jb20vZGlub3NhdXJl L2JsYXplPg0KDQpbbWlvdV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL21pb3U+DQoN Clt1dGNwXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdXRjcD4NCg0KW3ZpZl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW3ZpYSBHaXRIdWJdIDxodHRwczov L2dpdGh1Yi5jb20vc3BvbnNvcnMvcm9idXItY29vcD4NCg0KW2hlcmVdIDxodHRwczovL3JvYnVy LmNvb3AvRG9uYXRlPg0KDQoNCkEgbmV3IGtpbmQgb2Yga25vd2xlZGdlLWJhc2UgZm9yIE9DYW1s J3MgZG9jDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2EtbmV3LWtpbmQtb2Yta25vd2xlZGdlLWJhc2UtZm9yLW9jYW1scy1k b2MvMTc1OTMvMT4NCg0KDQpNb3N0YWZhIFRvdW55IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSGVsbG8sDQoNCiAgSSBoYXZlIGJlZW4gZm9sbG93aW5nIEBzYWJpbmUncyBwb3N0LA0KICA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2xvb2tpbmctZm9yLW1haW50YWluZXJzLW1vZGVy YXRvcnMtZm9yLXRoZS1vY2FtbC1jb29rYm9vay8xNjQ5Nz4uDQoNCiAgSSByZWFsbHkgd2FudCB0 byBjb250cmlidXRlIGJ1dCBsaWtlIGFueSBlbmdpbmVlciwgSSBhbSBwcmVzc3VyZWQgb24NCiAg ZGVhZGxpbmVzLCB3aGljaCBpbmNlbnRpdml6ZXMgbWUgdG8gYXNrIGhlcmUgb3IgaW4gRGlzY29y ZC4gVGhlcmUgYXJlDQogIGV2ZW4gd29uZGVyZnVsIGJvb2tzIGxpa2UgW1R5cGUgVGhlb3J5IGFu ZCBGb3JtYWwgUHJvb2ZdLCBidXQgSSBjYW5ub3QNCiAgYWxsb2NhdGUgZ29vZCB0aW1lIHRvIHJl YWQgdGhlbS4NCg0KICBUaGF0IG1vdGl2YXRlZCBtZSB0byB0aGluayBvZiBhIG5ldyBtZWNoYW5p c20sIHdoZXJlIGRvY3VtZW50YXRpb25zDQogIGFuZCBxdWVzdGlvbi1hbnN3ZXJzIGFyZSBicmlk Z2VkLCB0aHJvdWdoIFtTbmlwcGV0XSBwcm9qZWN0Lg0KDQogIFNvbWVvbmUgYXNrcyBhIHF1ZXN0 aW9uIGxpa2UgW3RoaXNdLiBJbnN0ZWFkIG9mIGFuc3dlcmluZyB0aGUNCiAgcXVlc3Rpb24sIHlv dSBtdXN0IGNvbnRyaWJ1dGUgYSBzZWxmLWNvbnRhaW5lZCBwYXJhZ3JhcGgsIGNhbGxlZA0KICAi c25pcHBldCIsIHRoZW4gY2l0ZSBpdCBpbiB0aGUgcXVlc3Rpb24uIEZvciBleGFtcGxlIHRoZSBx dWVzdGlvbg0KICBjaXRlczoNCiAg4oCiIHNuaXBwZXQgW1BhcmFtZXRyaWMgQWJzdHJhY3Rpb24g d2l0aCBGdW5jdG9ycyBhbmQgTW9kdWxlc10gZGVzaWduDQogICAgcGF0dGVybiBpbiBPQ2FtbCwg Y2l0aW5nDQogIOKAoiBzbmlwcGV0IFtGdW5jdG9yLCBPQ2FtbF0gbGlua2luZyB0byBPQ2FtbCdz IGRvYywgY2l0aW5nDQogIOKAoiBzbmlwcGV0IFtGdW5jdG9yLCBQTF0gbGlua2luZyB0byBDYXRl Z29yeSB0aGVvcnkgYmxvZywgY2l0aW5nDQogIOKAoiBzbmlwcGV0IFtBYnN0cmFjdCBEYXRhIFR5 cGVzXSBsaW5raW5nIHRvIFNvZnR3YXJlIEZvdW5kYXRpb25zIGJvb2suDQoNCiAgSWYgc29tZSBz bmlwcGV0IGdldHMgYSBoaWdoIG51bWJlciBvZiBjaXRhdGlvbnMsIHRoZW4gdGhhdCB3b3VsZCBi ZSBhDQogIHNpZ25hbCB0byBjb250cmlidXRlIGl0IHRvIE9DYW1sJ3MgZG9jdW1lbnRhdGlvbnMg b3IgW09DYW1sdmVyc2VdLiBJbg0KICBvdGhlciB3b3JkcywgT0NhbWwncyBjb29rYm9va3Mgd2ls bCBiZSBuYXR1cmFsbHkgY29udHJpYnV0ZWQgYXMgbW9yZQ0KICBwZW9wbGUncyBxdWVzdGlvbnMg Z2V0IGFuc3dlcmVkLCBhbmQgd2lsbCBiZSBuYXR1cmFsbHkgY2VydGlmaWVkIGFzDQogIG1vcmUg cGVvcGxlIGNpdGUgaXQhDQoNCiAgVGhlIHByb2plY3QgaXMgYnVpbHQgb24gRHJlYW0sIG9wZW4t c291cmNlLCBhbmQgQ0MgNC4wIGxpY2Vuc2VkLiBJJ2QNCiAgYmUgaGFwcHkgdG8gc2VlIE9DYW1s J3MgbWFpbnRhaW5lcnMgc2VsZi1ob3N0IGFuIGluc3RhbmNlIG9mIGl0IGluDQogIE9DYW1sJ3Mg b2ZmaWNpYWwgd2Vic2l0ZS4gV2UgY291bGQgZXZlbiBkZXNpZ24gYSB2b3RpbmcgbWVjaGFuaXNt IHRvDQogIGVsZWN0IHNuaXBwZXRzIGZvciB0aGUgb2ZmaWNpYWwgZG9jdW1lbnRhdGlvbi4NCg0K ICBGb3Igbm93LCBJIGFtIGhhcHB5IHRvIGxpc3RlbiB0byB5b3VyIGZlZWRiYWNrLg0KDQoNCltU eXBlIFRoZW9yeSBhbmQgRm9ybWFsIFByb29mXQ0KPGh0dHBzOi8vd3d3LmNhbWJyaWRnZS5vcmcv Y29yZS9ib29rcy90eXBlLXRoZW9yeS1hbmQtZm9ybWFsLXByb29mLzA0NzI2NDBBQUQzNEUwNDVD N0YxNDBCNDZBNTdBNjdDPg0KDQpbU25pcHBldF0gPGh0dHBzOi8vc25pcHBldC5tb3N0YWZhdG91 bnkuY29tL2Fib3V0Pg0KDQpbdGhpc10gPGh0dHBzOi8vc25pcHBldC5tb3N0YWZhdG91bnkuY29t L3F1ZXN0aW9uLzIvc2hvdz4NCg0KW1BhcmFtZXRyaWMgQWJzdHJhY3Rpb24gd2l0aCBGdW5jdG9y cyBhbmQgTW9kdWxlc10NCjxodHRwczovL3NuaXBwZXQubW9zdGFmYXRvdW55LmNvbS9zbmlwcGV0 LzI1L3Nob3c+DQoNCltGdW5jdG9yLCBPQ2FtbF0gPGh0dHBzOi8vc25pcHBldC5tb3N0YWZhdG91 bnkuY29tL3NuaXBwZXQvMjYvc2hvdz4NCg0KW0Z1bmN0b3IsIFBMXSA8aHR0cHM6Ly9zbmlwcGV0 Lm1vc3RhZmF0b3VueS5jb20vc25pcHBldC8yOC9zaG93Pg0KDQpbQWJzdHJhY3QgRGF0YSBUeXBl c10gPGh0dHBzOi8vc25pcHBldC5tb3N0YWZhdG91bnkuY29tL3NuaXBwZXQvMjcvc2hvdz4NCg0K W09DYW1sdmVyc2VdIDxodHRwczovL29jYW1sdmVyc2UubmV0Lz4NCg0KDQpTZXJpYWxwb3J0IC0g bmV3IHNlcmlhbCBjb21tdW5pY2F0aW9uIGxpYnJhcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0K DQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXNlcmlhbHBv cnQtbmV3LXNlcmlhbC1jb21tdW5pY2F0aW9uLWxpYnJhcnkvMTc1OTQvMT4NCg0KDQpNaWtoYWls IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgSGkgdGhlcmUhDQoNCiAgSSdtIGhhcHB5IHRvIGFubm91bmNlIHRoZSBmaXJz dCByZWxlYXNlIG9mIHRoZSBbc2VyaWFscG9ydF0NCiAgbGlicmFyeS4gVGhlIGxpYnJhcnkgaXMg cGxhbm5lZCB0byBiZSBhIGNyb3NzLXBsYXRmb3JtIGxpYnJhcnkgZm9yDQogIHNlcmlhbCBwb3J0 IGNvbW11bmljYXRpb24gaW4gT0NhbWwsIHdoaWNoIHN1cHBvcnRzIGJvdGggUE9TSVggYW5kDQog IFdpbmRvd3Mgc3lzdGVtcy4gSXQgcHJvdmlkZXMgc3luY2hyb25vdXMgYW5kIGFzeW5jaHJvbm91 cyBpbnRlcmZhY2VzDQogIHVzaW5nIHZhcmlvdXMgSS9PIGxpYnJhcmllcyAobGlrZSBMd3QgYW5k IG90aGVyKS4NCg0KICBUaGUgbGlicmFyeSBjdXJyZW50bHkgb25seSBzdXBwb3J0cyBQT1NJWCBz eXN0ZW1zLg0KDQogIDxodHRwczovL2dpc3QuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2R4M21vZC80 MDJlZjRjNWYzZjA2NjQ1YzZjNzEwMGRhMmU4Njc2Zi9yYXcvMzFmMjFmMTk5MjNlZDJkZDRhMWE0 NzdkOGNiYmMxZDA2ZDU5ZjA3Yi9zZXJpYWxwb3J0LnN2Zz4NCg0KICBUaGUgbWFpbiBtb3RpdmF0 aW9uIGJlaGluZCBjcmVhdGluZyB0aGlzIHByb2plY3QgaXMgdG8gYWRkcmVzcyB0aGUNCiAgbGFj ayBvZiBhIGNvbXByZWhlbnNpdmUgbGlicmFyeSBmb3IgbWFuYWdpbmcgc2VyaWFsIHBvcnQgY29t bXVuaWNhdGlvbg0KICBpbiBkaWZmZXJlbnQgZW52aXJvbm1lbnRzLCBhcyB3ZWxsIGFzIHRoZSBs YWNrIG9mIGFuIGludHVpdGl2ZSBBUEkgZm9yDQogIHRoaXMgdGFzay4gVGhlIGV4aXN0aW5nIFtP U2VyaWFsXSBsaWJyYXJ5IGhhcyBzaWduaWZpY2FudCBsaW1pdGF0aW9ucw0KICBpbiB0ZXJtcyBv ZiBmdW5jdGlvbmFsaXR5IGFuZCBmdXR1cmUgZGV2ZWxvcG1lbnQsIG1ha2luZyBpdCB1bnN1aXRh YmxlDQogIGZvciB1c2UgaW4gbW9kZXJuIGVudmlyb25tZW50cy4NCg0KICBUaGUgc2VyaWFsIHBv cnQgbGlicmFyeSBpcyBtb3N0IGluc3BpcmVkIGJ5IHNpbWlsYXIgaW1wbGVtZW50YXRpb25zIGlu DQogIG90aGVyIGxhbmd1YWdlcywgc3VjaCBhcyBSdXN0J3Mgc2VyaWFscG9ydCBhbmQgR29sYW5n J3MNCiAgYnVnc3QvZ28tc2VyaWFsLg0KDQoNCltzZXJpYWxwb3J0XSA8aHR0cHM6Ly9naXRodWIu Y29tL2R4M21vZC9zZXJpYWxwb3J0Pg0KDQpbT1NlcmlhbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9t LWxhbmlha2VhL29zZXJpYWw+DQoNClVzYWdlDQrilYzilYzilYzilYzilYwNCg0KICBUeXBpY2Fs bHksIGFuIGV4YW1wbGUgb2YgdXNhZ2UgaXMgY29tbXVuaWNhdGlvbiBiZXR3ZWVuIGEgUEMgYW5k IGFuDQogIEFyZHVpbm8gYm9hcmQgb3Igb3RoZXIgZGV2aWNlcyB2aWEgYW4gb2xkLXNjaG9vbCBz ZXJpYWwgcG9ydC4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCICMgI3JlcXVpcmUgInNlcmlh bHBvcnQudW5peCI7Ow0KICDilIIgICgqICNyZXF1aXJlICJzZXJpYWxwb3J0Lmx3dCI7OyAqKQ0K ICDilIIgDQogIOKUgiAjIGxldCBwb3J0X29wdHMgPSBTZXJpYWxwb3J0LlBvcnRfb3B0aW9ucy5t YWtlIH5iYXVkX3JhdGU6OTYwMCAoKQ0KICDilIIgICBhbmQgcG9ydF9uYW1lID0gIi9kZXYvdHR5 VVNCMCIgaW4NCiAg4pSCIA0KICDilIIgICBTZXJpYWxwb3J0X3VuaXgud2l0aF9vcGVuX2NvbW11 bmljYXRpb24gfm9wdHM6cG9ydF9vcHRzIHBvcnRfbmFtZQ0KICDilIIgICAgIGJlZ2luIGZ1biBz ZXJfcG9ydCAtPg0KICDilIIgICAgICAgKCogR2V0IGNoYW5uZWxzIGFic3RyYWN0aW9ucyBmb3Ig aGlnaC1sZXZlbCB3b3JraW5nIHdpdGggSS9PIHdpdGhvdXQgYnVmZmVyaW5nLiAqKQ0KICDilIIg ICAgICAgbGV0IGljLCBvYyA9IFNlcmlhbHBvcnRfdW5peC50b19jaGFubmVscyBzZXJfcG9ydCBp bg0KICDilIIgICAgICAgKCogV2FpdCB1bnRpbCBBcmR1aW5vIGhhcyBiZWVuIGluaXRpYWxpemVk LiAqKQ0KICDilIIgICAgICAgVW5peC5zbGVlcCAyOw0KICDilIIgICAgICAgKCogU2VuZCB0aGUg bWVzc2FnZSB0byB0aGUgQXJkdWlubyB2aWEgdGhlIHNlcmlhbCBwb3J0LiAqKQ0KICDilIIgICAg ICAgT3V0X2NoYW5uZWwub3V0cHV0X3N0cmluZyBvYyAiSGVsbG8gZnJvbSBQQyFcbiI7DQogIOKU giAgICAgICAoKiBSZWFkIHRoZSByZXNwb25zZSBmcm9tIHRoZSBzZXJpYWwgcG9ydC4gKikNCiAg 4pSCICAgICAgIEluX2NoYW5uZWwuaW5wdXRfbGluZSBpYw0KICDilIIgICAgIGVuZA0KICDilJTi lIDilIDilIDilIANCg0KICBFbmpveSBpdCENCg0KDQpXaW5kb3dzIHN1cHBvcnRzDQrilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBJIHdpbGwgYmUg aW1wbGVtZW50aW5nIFdpbmRvd3Mgc3VwcG9ydCBpbiB0aGUgbmV4dCB2ZXJzaW9uIChjb21pbmcN CiAgc29vbikuDQoNCg0KUC5TLg0K4pWM4pWM4pWM4pWMDQoNCiAgSSB3b3VsZCBiZSBkZWxpZ2h0 ZWQgdG8gZGlzY3VzcyB5b3VyIGlkZWFzIGFuZCBzdWdnZXN0aW9uIQ0KDQoNCkx3dC42LjAuMH5i ZXRhIChkaXJlY3Qtc3R5bGUsIG11bHRpLWRvbWFpbiBwYXJhbGxlbGlzbSkNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWx3dC02LTAtMC1iZXRhLWRpcmVjdC1z dHlsZS1tdWx0aS1kb21haW4tcGFyYWxsZWxpc20vMTcyODMvOD4NCg0KDQpSYXBoYcOrbCBQcm91 c3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBgbHd0LjYuMC4wLWJldGEwMScgaGFz IGJlZW4gcmVsZWFzZWQhDQoNCiAgV2l0aCB0aGlzIHJlbGVhc2UgY29tZXMgYSBjaGFuZ2UgaW4g dGhlIHRpdGxlIG9mIHRoaXMgdGhyZWFkOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIC0gW0FO Tl0gTHd0LjYuMC4wfmJldGEgKGRpcmVjdC1zdHlsZSwgbXVsdGktZG9tYWluIHBhcmFsbGVsaXNt KQ0KICDilIIgKyBbQU5OXSBMd3QuNi4wLjB+YmV0YSAoZGlyZWN0LXN0eWxlLCBydW50aW1lLWV2 ZW50IHRyYWNpbmcpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoaXMgaXMgbGlrZWx5IHRoZSBs YXN0IGJldGEgYmVmb3JlIHRoZSByZWxlYXNlIG9mIEx3dC42LjAuMCwgcGxlYXNlDQogIHRlc3Qg YW5kIHNoYXJlIHlvdXIgZmVlZGJhY2suIFRoZSBoaWdobGlnaHRzIGFyZQ0KICDigKIgKGNvbXBh cmVkIHRvIHByZXZpb3VzIGJldGEpIG5vIG1vcmUgbXVsdGlkb21haW4tbXVsdGlzY2hlZHVsZXIN CiAgICBwYXJhbGxlbGlzbQ0KICAgIOKAoiBpdCB3YXMgdG9vIGJ1Z2d5LA0KICAgIOKAoiB5b3Ug Y2FuIHN0aWxsIHVzZSBgTHd0X2RvbWFpbicNCiAg4oCiIChjb21wYXJlZCB0byBwcmV2aW91cyBi ZXRhKSBydW50aW1lLWV2ZW50cyBwcm9kdWNlIGEgdHJhY2Ugb2YNCiAgICBleGVjdXRpb24gb2Yg eW91ciBsd3QgcHJvZ3JhbSBmb3IgYmV0dGVyIGRlYnVnZ2luZw0KICAgIOKAoiBvbmx5IGlmIGBs d3RfcnVudGltZV9ldmVudHMnIGlzIGluc3RhbGxlZCwNCiAgICDigKIgdHJhY2luZyBpbnN0cnVj dGlvbnMgYWRkZWQgYnkgcHB4LA0KICAgIOKAoiBleGFtcGxlIHByb2R1Y2luZyBhIHRyYWNlIG9m IHJlY2VudCBldmVudHMgaW4gY2FzZSBvZiBjcmFzaCBpbg0KICAgICAgPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY3NpZ2VuL2x3dC90cmVlLzYuMC4wLWJldGEwMS9leGFtcGxlcy90cmFjaW5nPg0KICAg IOKAoiBleGFtcGxlIGxpdmUgbW9uaXRvcmluZyB0aGUgZXZlbnRzIHRvIHNlbmQgc2lnbmFsIGlu IGNhc2Ugb2Ygc3RhbGwNCiAgICAgIGluDQogICAgICA8aHR0cHM6Ly9naXRodWIuY29tL29jc2ln ZW4vbHd0L3RyZWUvNi4wLjAtYmV0YTAxL2V4YW1wbGVzL3N0YWxsX2RldGVjdGlvbj4NCiAg4oCi IChjb21wYXJlZCB0byBMd3QuNS45KSBkaXJlY3Qtc3R5bGUgd2l0aCBgTHd0X2RpcmVjdCcNCiAg ICDigKIgeW91IGNhbiB3cml0ZSBkaXJlY3Qtc3R5bGUgbHd0ICh3aXRoaW4gYSBnaXZlbiBzY29w ZSkNCiAgICDigKIgZS5nLiwgeW91IGNhbiBpbnRlcmFjdCB3aXRoIGxpYnJhcmllcyB0aGF0IG9u bHkgcHJvdmlkZSBgaXRlciA6DQogICAgICAoJ2EgLT4gdW5pdCkgLT4gJ2EgLT4gdW5pdCcgc3Vj aCBhcw0KICAgICAg4pSM4pSA4pSA4pSA4pSADQogICAgICDilIIgbGV0IGl0ZXJfcyBmIGggPQ0K ICAgICAg4pSCICAgTHd0X2RpcmVjdC5zcGF3biBAQCBmdW4gKCkgLT4NCiAgICAgIOKUgiAgICAg SGFzaHRibC5pdGVyIChmdW4gayB2IC0+IEx3dF9kaXJlY3QuYXdhaXQgKGYgayB2KSkgaA0KICAg ICAg4pSU4pSA4pSA4pSA4pSADQoNCiAgT25jZSBhZ2FpbiwgdGhhbmtzIHRvIEBjLWN1YmUgZm9y IHRoZSBkaXJlY3Qtc3R5bGUgZmVhdHVyZSB3aGljaCBtYWtlcw0KICBpdCBwb3NzaWJsZSB0byB1 c2UgTHd0IGluIGNvbmp1bmN0aW9uIHdpdGggbGlicmFyaWVzIGV2ZW4gaWYgdGhleQ0KICBkb24n dCBpbmNsdWRlIHNwZWNpYWwgYW1lbml0aWVzIGZvciBpdC4NCg0KICBUaGFua3MgYWdhaW4gZm9y IEBlZHdpbiBmb3IgdGhlIGJ1ZyByZXBvcnQgb24gbXVsdGktc2NoZWR1bGVyLXJlbGF0ZWQNCiAg ZmFpbHVyZXMuDQoNCg0KQ2FsbCBmb3IgUGFydGljaXBhdGlvbjogQk9CIDIwMjYgKEJlcmxpbiwg TWFyIDEzKQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1wYXJ0aWNpcGF0aW9uLWJv Yi0yMDI2LWJlcmxpbi1tYXItMTMvMTc1OTgvMT4NCg0KDQpNaWNoYWVsIFNwZXJiZXIgYW5ub3Vu Y2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBGaW5hbGx5LCBsb3RzIG9mIE9DYW1sIGNvbnRl bnQgYXQgQk9CIQ0KDQoNCuKAnFdoYXQgaGFwcGVucyB3aGVuIHdlIHVzZSB3aGF04oCZcyBiZXN0 IGZvciBhIGNoYW5nZT/igJ0NCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBbYGJvYmtvbmYuZGUvMjAyNi8nXQ0KICDigKIgQmVybGluLCBNYXIgMTMN Cg0KICBCT0IgY29uZmVyZW5jZSBpcyBhIHBsYWNlIGZvciBkZXZlbG9wZXJzLCBhcmNoaXRlY3Rz LCBhbmQNCiAgZGVjaXNpb24tbWFrZXJzIHRvIGV4cGxvcmUgdGVjaG5vbG9naWVzIGJleW9uZCB0 aGUgbWFpbnN0cmVhbSBpbg0KICBzb2Z0d2FyZSBkZXZlbG9wbWVudCBhbmQgdG8gZmluZCB0aGUg YmVzdCB0b29scyBhdmFpbGFibGUgdG8gc29mdHdhcmUNCiAgZGV2ZWxvcGVycyB0b2RheS4gT3Vy IGdvYWwgaXMgZm9yIGFsbCBwYXJ0aWNpcGFudHMgb2YgQk9CIHRvIHJldHVybg0KICBob21lIHdp dGggbmV3IGluc2lnaHRzIHRoYXQgZW5hYmxlIHRoZW0gdG8gaW1wcm92ZSB0aGVpciBvd24gc29m dHdhcmUNCiAgZGV2ZWxvcG1lbnQgZXhwZXJpZW5jZS4NCg0KDQpbYGJvYmtvbmYuZGUvMjAyNi8n XSA8aHR0cHM6Ly9ib2Jrb25mLmRlLzIwMjYvPg0KDQoNCltQcm9ncmFtXQ0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIFtwcm9ncmFtXSBmZWF0dXJlcyAxNiB0YWxrcyBhbmQg OCB0dXRvcmlhbHMgb24gY3VycmVudCB0b3BpY3MuDQoNCiAgVGFsayBzdWJqZWN0cyBpbmNsdWRl cyBmdW5jdGlvbmFsIHByb2dyYW1taW5nLCBzb2Z0d2FyZSBhcmNoaXRlY3R1cmUsDQogIGZvcm1h bCBtZXRob2RzLCBhY2Nlc3NpYmlsaXR5LCBVSSBwcm9ncmFtbWluZywgcmVhY3RpdmUgc3lzdGVt cywgYW5kDQogIGRvbWFpbi1kcml2ZW4gZGVzaWduLg0KDQogIEJPQiB0dXRvcmlhbCBpbmNsdWRl IHNlc3Npb25zIG9uIFR5cGVTY3JpcHQsIE9DYW1sLCBIYXNrZWxsLCBBZ2RhLA0KICBhY2Nlc3Np YmlsaXR5LCBhbmQgcmVhY3RpdmUgc3lzdGVtcy4NCg0KICBTdGVmYW4gS2F1Zm1hbm4gd2lsbCBn aXZlIHRoZSBrZXlub3RlIHRhbGsgb24gZGlnaXRhbCBzb3ZlcmVpZ250eS4NCg0KDQpbUHJvZ3Jh bV0gPGh0dHBzOi8vYm9ia29uZi5kZS8yMDI2L3Byb2dyYW0uaHRtbD4NCg0KW3Byb2dyYW1dIDxo dHRwczovL2JvYmtvbmYuZGUvMjAyNi9wcm9ncmFtLmh0bWw+DQoNCg0KW1JlZ2lzdHJhdGlvbl0N CuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFtSZWdpc3Ry YXRpb25dIGlzIG9wZW4gLSBtYW55IGRpc2NvdW50IG9wdGlvbnMgLSBpbmNsdWRpbmcgbGltaXRl ZA0KICBlYXJseS1iaXJkIGRpc2NvdW50cyAtIGFyZSBhdmFpbGFibGUsIGFzIGFyZSBncmFudHMg Zm9yIG1lbWJlcnMgb2YNCiAgZ3JvdXBzIHVuZGVycmVwcmVzZW50ZWQgaW4gdGVjaC4NCg0KDQpb UmVnaXN0cmF0aW9uXSA8aHR0cHM6Ly9ib2Jrb25mLmRlLzIwMjYvcmVnaXN0cmF0aW9uLmh0bWw+ DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIAN Cg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBb dGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0FvQUggRGF5IDE0OiBEZWJ1Z2dpbmcg YSBLYXJha2VlcCBDTEkgYWdhaW5zdCB0aGUgbGl2ZSBzZXJ2aWNlXQ0KICDigKIgW0FvQUggRGF5 IDEzOiBIZWNrbGluZyBhbiBPQ2FtbCBIVFRQIGNsaWVudCBmcm9tIDUwIGltcGxlbWVudGF0aW9u cw0KICAgIGluIDEwIGxhbmd1YWdlc10NCiAg4oCiIFtBZHZlbnQgb2YgQ29kZSAyMDI1XQ0KICDi gKIgW0FvQUggRGF5IDEyOiBFaW8gQ29ubmVjdGlvbiBwb29saW5nIGFuZCBldmVudCB0cmFjaW5n XQ0KICDigKIgW09uZSBNb2xseW1hd2ssIE11bHRpcGxlIEFsYmF0cm9zcyBzZXJ2ZXJzXQ0KICDi gKIgW0FvQUggRGF5IDEwOiBCdWlsZGluZyBhIFRVSSBmb3IgU29ydGFsIHVzaW5nIE1vc2FpY10N CiAg4oCiIFtBb0FIIERheSAxMTogSFRUUCBDb29raWVzIGFuZCB2aWJpbmcgUkZDcyBmb3IgYnJl YWtmYXN0XQ0KICDigKIgW0NyZWF0aW5nIGBvY2FtbC5udmltJyB0byBCcmluZyBOZW92aW0gU3Vw cG9ydCB0byBPQ2FtbCdzIExTUA0KICAgIFNlcnZlcl0NCiAg4oCiIFtBb0FIIERheSA5OiBBZGRp bmcgYSBCb25zYWkgdGVybWluYWwgVUkgdG8gU29ydGFsXQ0KICDigKIgW09DYW1sIFJvdW5kdXA6 IE5vdmVtYmVyIDIwMjVdDQogIOKAoiBbQW4gU1ZHIGlzIGFsbCB5b3UgbmVlZF0NCiAg4oCiIFtB b0FIIERheSA4OiBCdWlsZGluZyBhIGNvbnRhY3RzIENMSSBtYW5hZ2VyIHdpdGggU29ydGFsXQ0K ICDigKIgW0FvQUggRGF5IDc6IENvbnZlcnRpbmcgYmV0d2VlbiBKU09OIGFuZCBZYW1sIHdpdGgg eWFtbHRdDQogIOKAoiBbQW9BSCBEYXkgNjogR2V0dGluZyBhIFlhbWwgMS4yIGltcGxlbWVudGF0 aW9uIGluIHB1cmUgT0NhbWxdDQogIOKAoiBbUHJpdmF0ZSByZXBvcyBpbiBPQ3VycmVudF0NCiAg 4oCiIFtBb0FIIERheSA1OiBCeXRlc3J3IEVpbyBhZGFwdGVycyBhbmQgYXV0b21hdGluZyBvcGFt IG1ldGFkYXRhXQ0KICDigKIgW0Egd2ViYXBwIHRvIHNlYXJjaCBlbWFpbHMgYXMgYW4gdW5pa2Vy bmVsXQ0KICDigKIgW0FvQUggRGF5IDQ6IEdvaW5nIHJlY3Vyc2l2ZSB3aXRoIENsYXVkZWlvIGZv ciBDbGF1ZGVdDQogIOKAoiBbQW9BSCBEYXkgMzogWERHIGZpbGVzeXN0ZW0gcGF0aHMgdXNpbmcg RWlvIGNhcGFiaWxpdGllc10NCiAg4oCiIFtBb0FIIERheSAyOiBCdWlsZGluZyBhbiBPQ2FtbCBK U09ORmVlZCBsaWJyYXJ5XQ0KICDigKIgW0FvQUggRGF5IDE6IEJ1aWxkaW5nIGEgQmFzZTMyIENy b2NrZm9yZCBsaWJyYXJ5IGluIE9DYW1sXQ0KICDigKIgW1RoZSBBSSBGcmVuY2ggQ29ubmVjdGlv biB0byB0aGUgUHJhY3RpY2Ugb2YgU2NpZW5jZV0NCiAg4oCiIFsyMDI1IEFkdmVudCBvZiBBZ2Vu dGljIEh1bXBzOiBCdWlsZGluZyBhIHVzZWZ1bCBPKHgpQ2FtbCBsaWJyYXJ5DQogICAgZXZlcnkg ZGF5XQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4N Cg0KW0FvQUggRGF5IDE0OiBEZWJ1Z2dpbmcgYSBLYXJha2VlcCBDTEkgYWdhaW5zdCB0aGUgbGl2 ZSBzZXJ2aWNlXQ0KPGh0dHBzOi8vYW5pbC5yZWNvaWwub3JnL25vdGVzL2FvYWgtMjAyNS0xND4N Cg0KW0FvQUggRGF5IDEzOiBIZWNrbGluZyBhbiBPQ2FtbCBIVFRQIGNsaWVudCBmcm9tIDUwIGlt cGxlbWVudGF0aW9ucyBpbg0KMTAgbGFuZ3VhZ2VzXSA8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcv bm90ZXMvYW9haC0yMDI1LTEzPg0KDQpbQWR2ZW50IG9mIENvZGUgMjAyNV0NCjxodHRwczovL3d3 dy50dW5idXJ5Lm9yZy8yMDI1LzEyLzEyL2FkdmVudC1vZi1jb2RlLz4NCg0KW0FvQUggRGF5IDEy OiBFaW8gQ29ubmVjdGlvbiBwb29saW5nIGFuZCBldmVudCB0cmFjaW5nXQ0KPGh0dHBzOi8vYW5p bC5yZWNvaWwub3JnL25vdGVzL2FvYWgtMjAyNS0xMj4NCg0KW09uZSBNb2xseW1hd2ssIE11bHRp cGxlIEFsYmF0cm9zcyBzZXJ2ZXJzXQ0KPGh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVz L21vbGx5bWF3a19tZXRhLmh0bWw+DQoNCltBb0FIIERheSAxMDogQnVpbGRpbmcgYSBUVUkgZm9y IFNvcnRhbCB1c2luZyBNb3NhaWNdDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMvYW9h aC0yMDI1LTEwPg0KDQpbQW9BSCBEYXkgMTE6IEhUVFAgQ29va2llcyBhbmQgdmliaW5nIFJGQ3Mg Zm9yIGJyZWFrZmFzdF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9hb2FoLTIwMjUt MTE+DQoNCltDcmVhdGluZyBgb2NhbWwubnZpbScgdG8gQnJpbmcgTmVvdmltIFN1cHBvcnQgdG8g T0NhbWwncyBMU1AgU2VydmVyXQ0KPGh0dHBzOi8vdGFyaWRlcy5jb20vYmxvZy8yMDI1LTEyLTEw LWNyZWF0aW5nLW9jYW1sLW52aW0tdG8tYnJpbmctbmVvdmltLXN1cHBvcnQtdG8tb2NhbWwtcy1s c3Atc2VydmVyPg0KDQpbQW9BSCBEYXkgOTogQWRkaW5nIGEgQm9uc2FpIHRlcm1pbmFsIFVJIHRv IFNvcnRhbF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9hb2FoLTIwMjUtOT4NCg0K W09DYW1sIFJvdW5kdXA6IE5vdmVtYmVyIDIwMjVdDQo8aHR0cHM6Ly9wYXRyaWNrLnNpcnJlZi5v cmcvb2NhbWwtcm91bmR1cC1ub3ZlbWJlci0yMDI1Lz4NCg0KW0FuIFNWRyBpcyBhbGwgeW91IG5l ZWRdDQo8aHR0cHM6Ly9qb24ucmVjb2lsLm9yZy9ibG9nLzIwMjUvMTIvYW4tc3ZnLWlzLWFsbC15 b3UtbmVlZC5odG1sPg0KDQpbQW9BSCBEYXkgODogQnVpbGRpbmcgYSBjb250YWN0cyBDTEkgbWFu YWdlciB3aXRoIFNvcnRhbF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9hb2FoLTIw MjUtOD4NCg0KW0FvQUggRGF5IDc6IENvbnZlcnRpbmcgYmV0d2VlbiBKU09OIGFuZCBZYW1sIHdp dGggeWFtbHRdDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTc+DQoN CltBb0FIIERheSA2OiBHZXR0aW5nIGEgWWFtbCAxLjIgaW1wbGVtZW50YXRpb24gaW4gcHVyZSBP Q2FtbF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9hb2FoLTIwMjUtNj4NCg0KW1By aXZhdGUgcmVwb3MgaW4gT0N1cnJlbnRdDQo8aHR0cHM6Ly93d3cudHVuYnVyeS5vcmcvMjAyNS8x Mi8wNS9vY3VycmVudC1wcml2YXRlLXJlcG9zLz4NCg0KW0FvQUggRGF5IDU6IEJ5dGVzcncgRWlv IGFkYXB0ZXJzIGFuZCBhdXRvbWF0aW5nIG9wYW0gbWV0YWRhdGFdDQo8aHR0cHM6Ly9hbmlsLnJl Y29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTU+DQoNCltBIHdlYmFwcCB0byBzZWFyY2ggZW1haWxz IGFzIGFuIHVuaWtlcm5lbF0NCjxodHRwczovL2Jsb2cucm9idXIuY29vcC9hcnRpY2xlcy8yMDI1 LTA0LTEyLXB0dC1zZWFyY2gtd2ViYXBwLmh0bWw+DQoNCltBb0FIIERheSA0OiBHb2luZyByZWN1 cnNpdmUgd2l0aCBDbGF1ZGVpbyBmb3IgQ2xhdWRlXQ0KPGh0dHBzOi8vYW5pbC5yZWNvaWwub3Jn L25vdGVzL2FvYWgtMjAyNS00Pg0KDQpbQW9BSCBEYXkgMzogWERHIGZpbGVzeXN0ZW0gcGF0aHMg dXNpbmcgRWlvIGNhcGFiaWxpdGllc10NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9h b2FoLTIwMjUtMz4NCg0KW0FvQUggRGF5IDI6IEJ1aWxkaW5nIGFuIE9DYW1sIEpTT05GZWVkIGxp YnJhcnldDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTI+DQoNCltB b0FIIERheSAxOiBCdWlsZGluZyBhIEJhc2UzMiBDcm9ja2ZvcmQgbGlicmFyeSBpbiBPQ2FtbF0N CjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9hb2FoLTIwMjUtMT4NCg0KW1RoZSBBSSBG cmVuY2ggQ29ubmVjdGlvbiB0byB0aGUgUHJhY3RpY2Ugb2YgU2NpZW5jZV0NCjxodHRwczovL2Fu aWwucmVjb2lsLm9yZy9ub3Rlcy9lbnRlbnRlLWNvcmRpYWxlPg0KDQpbMjAyNSBBZHZlbnQgb2Yg QWdlbnRpYyBIdW1wczogQnVpbGRpbmcgYSB1c2VmdWwgTyh4KUNhbWwgbGlicmFyeSBldmVyeQ0K ZGF5XSA8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMvYW9haC0yMDI1Pg0KDQoNCk9sZCBD V04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENX TiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91 LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2Yg dGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZl cnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0u DQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxh bi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8 aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2No bWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 09 to 16, 20= 25.

    Software Engineer (OCaml) – LexiFi, Paris

    Alain Frisch announced

    Hi all,

    LexiFi is looking for a Software = Engineer to join our development team in Paris. The work is primarily i= n OCaml, contributing to our codebase across core components, tooling, and = product features.

    If you're interested in working on a large, long-lived OCaml system used in= production by financial institutions, you can find the full job descriptio= n here: https://www.lexifi.com/careers/software_engineer/

    Happy to answer any questions!

    Opam repository archival, next run (scheduled 2026-01-01)

    Hannes Mehnert announced

    Dear everyone,

    we did another run of the archival based on the x-maintenance-intent of opa= m packages. The run was using opam-repository at co= mmit d684c896eb6f7e6030d6ee65338d9db22a612f01 (Dec 9th, 20:00:00 CET).

    The tool used is maintenance-intent-fil= ter with opam 2.5 and OCaml 5.4. It took around 1GB of memory and aroun= d 100h of CPU time (donations welcome= ).

    In total, 4510 packages were candidates, out of which 3361 are scheduled fo= r archival.

    Testing

    To test whether your CI / lock / environment will be affected by the remova= l of packages, you can create a fresh opam switch and use the opam-reposito= ry from the branch:

    $ opam repository add archival-20260101 https://github.com/hannesm/opam-rep=
    ository.git#archival-20260101
    $ opam switch create archival-20260101  --repositories archival-20260101
    $ eval `opam env`
    

    Alternatively, in CI systems you can do temporarily for testing:

    $ opam repo set-url default https://github.com/hannesm/opam-repository.git#=
    archival-20260101
    

    Reverting archival

    If you want to preserve a package, please don=E2=80=99t hesitate to comment= on the issue https://github.com/ocaml/opam-repository/pull/29058

    It is important that you include the package name and its version, as well = as where it is used (preferably a URL), and a contact (email address).

    Editor=E2=80=99s note: please follow the archive link for the list of pa= ckages to be archived.

    blame, a simple webapp as an unikernel

    Calascibetta Romain announced

    I am pleased to announce the development of blame, a unikernel that provides a se= arch engine in the form of a web interface based on an email archive.

    This work is sponsored by NLnet as part o= f our PTT project. For more d= etails on the unikernel, our archive system, and our search engine, we reco= mmend reading our article available here. This project is the synth= esis of several projects on the subject:

    • mrmime to parse/encode= emails
    • carton to archive = emails
    • stem to search email= s
    • blaze like a Swiss A= rmy knife for manipulating emails and archives
    • and of course some of our projects like miou, ut= cp or vif

    If you like our work, you can sponsor us via GitHub or by following the instructions available = here. Thank you to everyone who h= as participated in the development of these projects, whether directly or i= ndirectly.

    So, happy hacking "discriminating hackers" :) !

    A new kind of knowledge-base for OCaml's doc

    Mostafa Touny announced

    Hello,

    I have been following @sabine's post, https://= discuss.ocaml.org/t/looking-for-maintainers-moderators-for-the-ocaml-cookbo= ok/16497.

    I really want to contribute but like any engineer, I am pressured on deadli= nes, which incentivizes me to ask here or in Discord. There are even wonder= ful books like Type Theory and Formal P= roof, but I cannot allocate good time to read them.

    That motivated me to think of a new mechanism, where documentations and que= stion-answers are bridged, through Snippet project.

    Someone asks a question like this. Instead of answering the question, you must contri= bute a self-contained paragraph, called "snippet", then cite it in the ques= tion. For example the question cites:

    If some snippet gets a high number of citations, then that would be a signa= l to contribute it to OCaml's documentations or OCamlverse. In other words, OCaml's cookbooks will be naturall= y contributed as more people's questions get answered, and will be naturall= y certified as more people cite it!

    The project is built on Dream, open-source, and CC 4.0 licensed. I'd be hap= py to see OCaml's maintainers self-host an instance of it in OCaml's offici= al website. We could even design a voting mechanism to elect snippets for t= he official documentation.

    For now, I am happy to listen to your feedback.

    Serialport - new serial communication library

    Mikhail announced

    Hi there!

    I'm happy to announce the first release of the serialport library. The library is planned to be a= cross-platform library for serial port communication in OCaml, which suppo= rts both POSIX and Windows systems. It provides synchronous and asynchronou= s interfaces using various I/O libraries (like Lwt and other).

    The library currently only supports POSIX systems.

    The main motivation behind creating this project is to address the lack of = a comprehensive library for managing serial port communication in different= environments, as well as the lack of an intuitive API for this task. The e= xisting OSerial libra= ry has significant limitations in terms of functionality and future develop= ment, making it unsuitable for use in modern environments.

    The serial port library is most inspired by similar implementations in othe= r languages, such as Rust's serialport and Golang's bugst/go-serial.

    Usage

    Typically, an example of usage is communication between a PC and an Arduino= board or other devices via an old-school serial port.

    # #require "serialport.unix";;
     (* #require "serialport.lwt";;=
     *)
    
    # let port_opts =3D Serialport.Port_options.make ~baud_rate:9600 ()
      and port_name =3D "=
    /dev/ttyUSB0" in<=
    /span>
    
      Serialport_unix.with_open_communication ~opts:port_opts port_name
        begin fun ser_port ->
          (* Get channels abstractions for =
    high-level working with I/O without buffering. *)
          let ic, oc =3D Serialport_unix.<=
    /span>to_channels ser_port in
          (* Wait until Arduino has been in=
    itialized. *)
          Unix.sleep =
    2;
          (* Send the message to the Arduin=
    o via the serial port. *)
          Out_channel.output_string oc "Hello from PC!\n";
          (* Read the response from the ser=
    ial port. *)
          In_channel.=
    input_line ic
        end
    

    Enjoy it!

    Windows supports

    I will be implementing Windows support in the next version (coming soon).

    P.S.

    I would be delighted to discuss your ideas and suggestion!

    Lwt.6.0.0~beta (direct-style, multi-domain parallelism)

    Rapha=C3=ABl Proust announced

    lwt.6.0.0-beta01 has been released!

    With this release comes a change in the title of this thread:

    - [ANN] Lwt.6.0.0~beta (direct-style, multi-domain parallelism)
    + [ANN] Lwt.6.0.0~beta (direct-style, runtime-event tracing)
    

    This is likely the last beta before the release of Lwt.6.0.0, please test a= nd share your feedback. The highlights are

    • (compared to previous beta) no more multidomain-multischeduler parallel= ism
      • it was too buggy,
      • you can still use Lwt_domain
    • (compared to previous beta) runtime-events produce a trace of execution= of your lwt program for better debugging
      • only if lwt_runtime_events is installed,
      • tracing instructions added by ppx,
      • example producing a trace of recent events in case of crash in http= s://github.com/ocsigen/lwt/tree/6.0.0-beta01/examples/tracing
      • example live monitoring the events to send signal in case of stall in <= a href=3D"https://github.com/ocsigen/lwt/tree/6.0.0-beta01/examples/stall_d= etection">https://github.com/ocsigen/lwt/tree/6.0.0-beta01/examples/stall_d= etection
    • (compared to Lwt.5.9) direct-style with Lwt_direct
      • you can write direct-style lwt (within a given scope)
      • e.g., you can interact with libraries that only provide iter : ('a -&= gt; unit) -> 'a -> unit such as

        let iter_s f h =
        =3D
          Lwt_direct.spaw=
        n @@ fun () ->
            Hashtbl.iter =
        (fun k v ->=
        ; Lwt_direct.awai=
        t (f k v)) h
        

    Once again, thanks to @c-cube for the direct-style feature which makes it p= ossible to use Lwt in conjunction with libraries even if they don't include= special amenities for it.

    Thanks again for @edwin for the bug report on multi-scheduler-related failu= res.

    Call for Participation: BOB 2026 (Berlin, Mar 13)

    Michael Sperber announced

    Finally, lots of OCaml content at BOB!

    =E2=80=9CWhat happens when we use what=E2=80=99s best= for a change?=E2=80=9D

    BOB conference is a place for developers, architects, and decision-makers to explore technologies beyond the mainstream in software development and to find the best tools available to software developers today. Our goal is for all participants of BOB to return home with new insights that enable them to improve their own software development experience.

    Prog= ram

    The program features 1= 6 talks and 8 tutorials on current topics.

    Talk subjects includes functional programming, software architecture, formal methods, accessibility, UI programming, reactive systems, and domain-driven design.

    BOB tutorial include sessions on TypeScript, OCaml, Haskell, Agda, accessibility, and reactive systems.

    Stefan Kaufmann will give the keynote talk on digital sovereignty.

    Registration

    Registration is o= pen - many discount options - including limited early-bird discounts - are available, as are grants for members of groups underrepresented in tech.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=C+Y6ZirM; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id BE2EE400A3 for ; Tue, 23 Dec 2025 11:01:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Nqyhu1mDxOTMdkMCGZhweMqrDx7mZA9LjtDqmCIiat4=; b=C+Y6ZirMJ/Of30gjgSXrS1U6uDjBHTbgW/mcLw1zkQzOqki2dExZIsG0 n39/hDiJarCTFIATXDf07w0xL3Jd2VmBDAsDPYgHVSNcPdTO8iN56sr8+ UHM1tcQEmYdNDLmb9FTECXj06MXQh+KPFs3V6anP9fCmcRwaMjaFceu40 o=; X-CSE-ConnectionGUID: x7o7zC6PQnORSQiZ+plgHA== X-CSE-MsgGUID: 15ADCRkCT26l/KGt2GVr2g== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,170,1763420400"; d="scan'208,217";a="255707278" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 23 Dec 2025 12:01:06 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 28AAA827ED; Tue, 23 Dec 2025 12:01:06 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 990A7827CE for ; Tue, 23 Dec 2025 12:00:49 +0100 (CET) X-CSE-ConnectionGUID: JKCu7dn2RbivrITTh35uNQ== X-CSE-MsgGUID: a8RaD1fFSGablp+f8chyEQ== IronPort-SDR: 694a7660_R+06Rpt6235tW5sFLBPhb48XI9zdD2xT59JAgZ1gEetc7d4 8FuSh4nhq0l/R1gRBGMPG1BeZSEyhb2Ce9SYBMw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HfBQBEdUppdyIeaIFaFggBAQsSDIISgTtbKBoBZgZfM?= =?us-ascii?q?wcISQSEVINPCI4dgRaQN4p7gWmBQiMSAwEDAQ0uARUKAQIEAQEDAQIBggyCd?= =?us-ascii?q?AIWjFMCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBA?= =?us-ascii?q?hABQ0mGTw1JARABgWpRcYElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAgQHAQEIgRYBAgYKEwEBJhIYIwMQBAEGAwIEDQE1F?= =?us-ascii?q?wEJCRQBAQMBgmmCIAICTwMEAQwGlAqaegVOeoEygQE7gVEBAQaBCD4CAQsCA?= =?us-ascii?q?gMBDgklAdoPgRpMCUSBCYVugkobASpJawEChEkJhDQnD4FVRIEVgigSOAdvg?= =?us-ascii?q?koXAQEBARiBEQEKBQICAQ4MDyQJgyWCaYImehQdhXoGglMbA4cIBoFIZCaHH?= =?us-ascii?q?YFEIgMmMywBVRMXCwcFXoEIAyovLW4yHYEjPhdzgRSDSR9oDgaBEYNPiQ8Pi?= =?us-ascii?q?WR0AwttPTcUG5UKQxkpJYE/ASUOVQkLIhUeCg0DCQgHBwIbBy4IBQsTCgwHA?= =?us-ascii?q?gMDLQQJBQUEBBEjEgsCCQItkloQFQMqd45ljhiTWR1tNAeEH4FeBgyJCIEmj?= =?us-ascii?q?h6HaYQEgVeLPJlUIphkIolegSYJglqVYBMNAQ2FKoF/IzwwPwEBARgBAgwHM?= =?us-ascii?q?xowIiENB4IfAQEyCQo8HA9XjUqBNAEDBYJDQX2DGjuBPL5xQjUCAQE4AgcBC?= =?us-ascii?q?gEBAwmFRR0BAYMyiFYPFwcFgUsBAQ?= IronPort-PHdr: A9a23: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 jH6cBtvUA5FwOJHikYjKLd2MrQd+InQvW3RHX4= IronPort-Data: A9a23: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 lTZiYyJrI9XhKIx/Qtdl6ZpJSwk IronPort-HdrOrdr: A9a23:QYzXzKyaPFqJd4NfdoUTKrPwE71zdoMgy1knxilNoH1uA66lfq WV9pkmPHDP6Qr5NEtNpTniAtjifZq/z/5ICOAqVN/IYOCMggWVxe9ZgrfK8nnJJGnV9+JW16 tsGpIObeHYPBxdlsi/xAG5Fr8bsb66GU2T9IPj80s= X-Talos-CUID: =?us-ascii?q?9a23=3AtVR5PGiB1EInZ3/bPhpjtrSvEDJuUF720SjcJRW?= =?us-ascii?q?CA2d3UpypdV/Lpb5Cqp87?= X-Talos-MUID: 9a23:fLcv+AZYiJwS5+BTvm/WjR07OulTzK2kDFhOn8UNu9ipDHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,170,1763420400"; d="scan'208,217";a="255707109" X-MGA-submission: =?us-ascii?q?MDF4AK//ugR0TXgjghuqVrCEPbLL2pp/aRaNUq?= =?us-ascii?q?Kp1sE4qeZf2+DuH26XjRD9jbF8rpry4cGAjzcLxalJyrLq4wrJNOWhA1?= =?us-ascii?q?xzSYzkN8T4BJWN29+fel7uh3WRQaH1Fef+uxR+c4VCW0xYRe/eCsLYU0?= =?us-ascii?q?HmQ8iemUkMh2EqBS67+NqB2w=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 23 Dec 2025 12:00:48 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 90C371A381; Tue, 23 Dec 2025 12:00:47 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 23 Dec 2025 12:00:45 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 23 12:00:47 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=AF3911A38A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19417 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMTYgdG8gMjMsDQoyMDI1Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNhbXAs IHRoZSBDYW1sIEFtcA0KQWhyZWZzIEdyYW50IFByb2dyYW0gZm9yIE9DYW1sDQpDYWxsIGZvciBD b250cmlidXRpb25zOiBDYW1sIGluIHRoZSBDYXBpdGFsIChGZWIgMjYpDQpEcmVhbSDigJMgbG9v a2luZyBmb3IgbWFpbnRhaW5lcnMgdG8gdGFrZSBvd25lcnNoaXANClFDaGVjayAwLjkwOiBUaGUg R3JlYXQgUmVuYW1pbmcNCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpDYW1wLCB0aGUg Q2FtbCBBbXANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2luYm94LmNpLmRldi9jYW1sLWxpc3Qv Qjc4NTI4MjUtMzM1RS00RjNGLTg3QzAtN0QxMEYxNDA5MERBQG1waS1zd3Mub3JnLz4NCg0KDQpB bmRyZWFzIFJvc3NiZXJnIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGFw cHkgdG8gc2hhcmUg4oCcQ2FtcOKAnSwgdGhlIENhbWwgQW1wIOKAlCBhbiBvbGQtc2Nob29sIG11 c2ljIHBsYXllcg0KICBoZWF2aWx5IGluc3BpcmVkIGJ5IGdvb2Qgb2xkIFdpbmFtcCwgd2l0aCBh IGZvY3VzIG9uIGRlY2VudCBtdXNpYw0KICBsaWJyYXJ5IGFuZCBwbGF5bGlzdCBoYW5kbGluZy4N Cg0KICBJIHdhcyBmZWQgdXAgd2l0aCBXaW5hbXAgYmVpbmcgZGVhZCBhbmQgbGFja2luZyBmZWF0 dXJlcyBJIHdhbnRlZCwgc28NCiAgSSB3ZW50IGludG8gZnVsbC1vbiBuZXJkIG1vZGUgYW5kIGlt cGxlbWVudGVkIG15IG93biBvcGluaW9uYXRlZA0KICByZXBsYWNlbWVudCwgYWxsIGluIE9DYW1s IHVzaW5nIHRoZSBSYXlsaWIgbGlicmFyeToNCg0KICA8aHR0cHM6Ly9tcGktc3dzLm9yZy9+cm9z c2JlcmcvY2FtcC8+DQoNCiAgSWYgeW91IGhhdmUgbm90IHlldCBiZWVuIHN1Y2tlZCBpbiBieSB0 aGUgc3RyZWFtaW5nIGNhcnRlbHMsIHlvdSBtaWdodA0KICBmaW5kIGl0IHVzZWZ1bC4NCg0KICDi gKIgUnVucyBvbiBXaW5kb3dzLCBNYWMsIGFuZCBMaW51eA0KICDigKIgU3VwcG9ydCBmb3IgV0FW LCBGTEFDLCBNUDMsIE9HRywgUU9BLCBNT0QsIGFuZCBYTQ0KICDigKIgQWR2YW5jZWQgbXVzaWMg bGlicmFyeSBtYW5hZ2VtZW50IHdpdGggbWFueSBicm93c2UgYW5kIHNlYXJjaA0KICAgIGZlYXR1 cmVzDQogIOKAoiBFbGFib3JhdGUgcGxheWxpc3QgbWFuaXB1bGF0aW9uIGFuZCBxdWVyeS1iYXNl ZCDigJxzbWFydOKAnSBwbGF5bGlzdHMNCiAg4oCiIEFuaW1hdGVkIHVzZXIgaW50ZXJmYWNlIHN0 eWxlZCBhZnRlciBoaWZpIHdoZW4gaXQgc3RpbGwgbG9va2VkIGdvb2QNCiAgICAobm8gY29ybmVy cyB3ZXJlIHJvdW5kZWQgaW4gdGhlIG1ha2luZyBvZiB0aGlzIGFwcCkNCg0KICBFbmpveSwgL0Fu ZHJlYXMNCg0KDQpBaHJlZnMgR3JhbnQgUHJvZ3JhbSBmb3IgT0NhbWwNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYWhyZWZzLWdyYW50LXByb2dyYW0tZm9yLW9jYW1sLzE3NjA0LzE+DQoNCg0KTG91 aXMgUm9jaMOpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgQWhyZWZzIGlzIGV4Y2l0ZWQgdG8gYW5u b3VuY2UgYSBuZXcgKkFocmVmcyBHcmFudCBQcm9ncmFtIGZvciBPQ2FtbCoNCiAgdG8gc3VwcG9y dCBwcm9qZWN0cyBpbiB0aGUgT0NhbWwgZWNvc3lzdGVtLiBUaGlzIGVmZm9ydCBjb21lcyBpbg0K ICBhZGRpdGlvbiB0byB0aGUgb3RoZXIgc3BvbnNvcnNoaXBzIHdlIGRvIChzdWNoIGFzIHRoZSBb T0NTRl0sIHRoZQ0KICBbSUNGUF0gYW5kIFtGdW4gT0NhbWxdIGNvbmZlcmVuY2VzLCBbZ2l0aHVi IHNwb25zb3JpbmddLCBhbmQgW3ZhcmlvdXMNCiAgb3RoZXIgcHJvamVjdHNdKSBXZSBhcmUgYWxs b2NhdGluZyBtb25leSB0byBmdW5kIG9uZSBvciBtdWx0aXBsZQ0KICBpbml0aWF0aXZlcyB0aGF0 IGhlbHAgYWR2YW5jZSBPQ2FtbCBhbmQgaXRzIHRvb2xpbmcuDQoNCiAgWW91IGNhbiBsZWFybiBt b3JlIGFib3V0IG91ciBlbmdpbmVlcmluZyBjdWx0dXJlIGFuZCBvcGVuc291cmNlDQogIHN1cHBv cnQgd29yayBhdCBbaHR0cHM6Ly9haHJlZnMuY29tL3RlY2hdDQoNCg0KW09DU0ZdIDxodHRwczov L29jYW1sLXNmLm9yZy8+DQoNCltJQ0ZQXSA8aHR0cHM6Ly9pY2ZwMjUuc2lncGxhbi5vcmcvPg0K DQpbRnVuIE9DYW1sXSA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tLz4NCg0KW2dpdGh1YiBzcG9uc29y aW5nXSA8aHR0cHM6Ly9naXRodWIuY29tL29yZ3MvYWhyZWZzL3Nwb25zb3Jpbmc+DQoNClt2YXJp b3VzIG90aGVyIHByb2plY3RzXSA8aHR0cHM6Ly9haHJlZnMuY29tL3RlY2g+DQoNCltodHRwczov L2FocmVmcy5jb20vdGVjaF0gPGh0dHBzOi8vYWhyZWZzLmNvbS90ZWNoPg0KDQpDYWxsIGZvciBB cHBsaWNhdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlIGludml0ZSBpbmRpdmlkdWFscywgdGVhbXMsIGFu ZCBvcmdhbml6YXRpb25zIHdvcmtpbmcgd2l0aCBPQ2FtbCB0bw0KICBzdWJtaXQgcHJvcG9zYWxz IGZvciBmdW5kaW5nLiBPdXIgZ29hbCBpcyB0byBzdXBwb3J0IG1lYW5pbmdmdWwsDQogIHByYWN0 aWNhbCBpbXByb3ZlbWVudHMgdG8gdGhlIGVjb3N5c3RlbSwgd2hldGhlciB0aHJvdWdoIG5ldyB0 b29scywNCiAgbGlicmFyaWVzLCBpbmZyYXN0cnVjdHVyZSwgZWR1Y2F0aW9uLCBvciBsb25n4oCR dGVybSBtYWludGVuYW5jZSBvZg0KICBleGlzdGluZyBwcm9qZWN0cy4NCg0KICBBcHBsaWNhdGlv bnMgc2hvdWxkIGJlIHN1Ym1pdHRlZCB0aHJvdWdoIFt0aGlzIGdvb2dsZSBmb3JtXS4NCg0KICBU aGUgZGVhZGxpbmUgZm9yIHN1Ym1pc3Npb25zIGlzIEphbnVhcnkgMjB0aCAyMDI2Lg0KDQoNClt0 aGlzIGdvb2dsZSBmb3JtXQ0KPGh0dHBzOi8vZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJ cFFMU2NVTkFBbnpZZXpoTDZIUnJhVWNia3lfVkJrOWtsTGRoODZURkpXQkk4VEtocHFjdy92aWV3 Zm9ybT4NCg0KDQpXaGF0IFdlIEFyZSBMb29raW5nIEZvcg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgV2Ug d2VsY29tZSBwcm9wb3NhbHMgdGhhdDoNCg0KICDigKIgU3RyZW5ndGhlbiB0aGUgT0NhbWwgY29t cGlsZXIgb3IgY29yZSBsaWJyYXJpZXMNCiAg4oCiIEltcHJvdmUgZGV2ZWxvcGVyIGV4cGVyaWVu Y2UgKHRvb2xpbmcsIGRvY3VtZW50YXRpb24sIGRlYnVnZ2luZywNCiAgICBwcm9maWxpbmcsIHBh Y2thZ2luZywg4oCmKQ0KICDigKIgRXhwYW5kIHRoZSBPQ2FtbCBlY29zeXN0ZW0gdGhyb3VnaCBu ZXcgbGlicmFyaWVzIG9yIG1vZGVybml6YXRpb24gb2YNCiAgICBrZXkgZGVwZW5kZW5jaWVzDQog IOKAoiBFbmhhbmNlIHJlbGlhYmlsaXR5LCBwZXJmb3JtYW5jZSwgb3Igc2FmZXR5IG9mIE9DYW1s 4oCRYmFzZWQgc3lzdGVtcw0KICDigKIgU3VwcG9ydCBlZHVjYXRpb24sIGNvbW11bml0eSBpbmZy YXN0cnVjdHVyZSwgb3IgbG9uZ+KAkXRlcm0NCiAgICBtYWludGVuYW5jZQ0KDQogIEJvdGggc21h bGwgYW5kIGxhcmdlIGluaXRpYXRpdmVzIGFyZSB3ZWxjb21lLiBXZSB3aWxsIHByaW9yaXRpemUN CiAgcHJvamVjdHMgdGhhdCB3aWxsIGhhdmUgbGFzdGluZyBpbXBhY3QgYW5kIHdpbGwgYmUgbWFp bnRhaW5lZC4NCg0KICBUaGUgc2VsZWN0aW9uIG9mIHByb3Bvc2FsIHdpbGwgbmVjZXNzYXJpbHkg YmUgc3ViamVjdGl2ZSBhbmQgZGVwZW5kIG9uDQogIG91ciBwcmlvcml0aWVzIGFuZCBpbnRlcmVz dHMuDQoNCg0KRnVuZGluZw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgQXBwbGljYW50cyBt YXkgcmVxdWVzdCB1cCB0byAqVVNEIDUwLDAwMCogaW4gc3VwcG9ydCBwZXIgcHJvamVjdC4gV2UN CiAgbWF5IGF3YXJkIGEgc2luZ2xlIHByb2plY3Qgb3IgZGlzdHJpYnV0ZSBhbW9uZyBzZXZlcmFs IHByb3Bvc2Fscy4NCg0KDQpIb3cgdG8gQXBwbHkNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjA0KDQogIFlvdXIgYXBwbGljYXRpb24gc2hvdWxkIGZvbGxvdyB0aGUgZm9ybWF0 IGJlbG93IGFuZCBiZSBzZW50IHRocm91Z2gNCiAgW3RoaXMgZ29vZ2xlIGZvcm1dLg0KDQogIFBs ZWFzZSBiZSBzaG9ydCBhbmQgdG8gdGhlIHBvaW50IGluIHlvdXIgYW5zd2VyczsgZm9jdXMgcHJp bWFyaWx5IG9uDQogIHRoZSB3aGF0IGFuZCBob3csIG5vdCBzbyBtdWNoIG9uIHRoZSB3aHkuIElm IEVuZ2xpc2ggaXNuJ3QgeW91ciBmaXJzdA0KICBsYW5ndWFnZSwgZG9uJ3Qgd29ycnkg4oCUIG91 ciByZXZpZXdlcnMgZG9uJ3QgY2FyZSBhYm91dCBzcGVsbGluZw0KICBlcnJvcnMsIG9ubHkgYWJv dXQgZ3JlYXQgaWRlYXMuIFlvdSBjYW4gYmUgYXMgdGVjaG5pY2FsIGFzIHlvdSBuZWVkIHRvDQog IGJlLiBEbyBzdGF5IHNwZWNpZmljLg0KDQoNClt0aGlzIGdvb2dsZSBmb3JtXQ0KPGh0dHBzOi8v ZG9jcy5nb29nbGUuY29tL2Zvcm1zL2QvZS8xRkFJcFFMU2NVTkFBbnpZZXpoTDZIUnJhVWNia3lf VkJrOWtsTGRoODZURkpXQkk4VEtocHFjdy92aWV3Zm9ybT4NCg0K4peKICoxLiBDb250YWN0IElu Zm9ybWF0aW9uKg0KDQogIOKAoiAqTmFtZSoNCiAg4oCiICpPcmdhbml6YXRpb24qIChpZiBhcHBs aWNhYmxlKQ0KICDigKIgKkVtYWlsIGFkZHJlc3MqDQogIOKAoiAqQ291bnRyeSoNCg0KDQril4og KjIuIEdlbmVyYWwgUHJvamVjdCBJbmZvcm1hdGlvbioNCg0KICDigKIgKlRpdGxlKg0KICDigKIg KkFic3RyYWN0KiAodXAgdG8gMTIwMCBjaGFyYWN0ZXJzKSBFeHBsYWluIHRoZSAqd2hvbGUgcHJv amVjdCogYW5kDQogICAgIGl0cyBleHBlY3RlZCBvdXRjb21lKHMpLg0KICDigKIgKllvdXJzZWxm IG9yIHRoZSB0ZWFtKiAoMjUwMCBjaGFyYWN0ZXJzKSBXaG8gaXMgcGFydGljaXBhdGluZz8gSGF2 ZQ0KICAgICB5b3UgYmVlbiBpbnZvbHZlZCB3aXRoIHNpbWlsYXIgb3IgcmVsYXRlZCBwcm9qZWN0 cz8gUGxlYXNlIHByb3ZpZGUNCiAgICAgYmFja2dyb3VuZCBpbmZvcm1hdGlvbiBhbmQgZGVzY3Jp YmUgeW91ciBwYXN0IGNvbnRyaWJ1dGlvbnMuDQogIOKAoiAqV2Vic2l0ZSogKGlmIGFueSkNCiAg 4oCiICpMaWNlbnNlKiBVbmRlciB3aGljaCBsaWNlbnNlIHdpbGwgdGhlIHByb2plY3QgYmUgZGlz dHJpYnV0ZWQ/IEl0DQogICAgICptdXN0KiBiZSBhbiBvcGVuIHNvdXJjZSBsaWNlbnNlLg0KDQoN CuKXiiAqMy4gUmVxdWVzdGVkIFN1cHBvcnQqDQoNCiAg4oCiICpSZXF1ZXN0ZWQgQW1vdW50KiAo dXAgdG8gVVNEIDUwLDAwMCkNCiAg4oCiICpCdWRnZXQgYW5kIEJyZWFrZG93biogKHVwIHRvIDI1 MDAgY2hhcmFjdGVycykgRXhwbGFpbiB3aGF0IHRoZQ0KICAgICBidWRnZXQgd2lsbCBiZSB1c2Vk IGZvci4gQXJlIHRoZXJlIG90aGVyIGZ1bmRpbmcgc291cmNlcz8gSW5jbHVkZSBhDQogICAgIGJy ZWFrZG93biBvZiB0YXNrcywgZXN0aW1hdGVkIGVmZm9ydCwgYW5kIGV4cGxpY2l0IHJhdGVzLg0K ICDigKIgKkRlc2NyaWJlIHlvdXIgcHJvamVjdCBhbmQgaXRzIHRlY2huaWNhbCBjaGFsbGVuZ2Vz KiAodXAgdG8gNTAwMA0KICAgICBjaGFyYWN0ZXJzKSBXaGF0IGFyZSBzaWduaWZpY2FudCB0ZWNo bmljYWwgY2hhbGxlbmdlcyB5b3UgZXhwZWN0IHRvDQogICAgIHNvbHZlIGR1cmluZyB0aGUgcHJv amVjdCwgaWYgYW55PyBDb21wYXJlIHlvdXIgb3duIHByb2plY3Qgd2l0aA0KICAgICBleGlzdGlu ZyBvciBoaXN0b3JpY2FsIGVmZm9ydHMuIEUuZy4gd2hhdCBpcyBuZXcsIG1vcmUgdGhvcm91Z2gg b3INCiAgICAgb3RoZXJ3aXNlIGRpZmZlcmVudC4NCiAg4oCiICpFY29zeXN0ZW0gYW5kIE91dHJl YWNoKiAodXAgdG8gMTIwMCBjaGFyYWN0ZXJzKSBEZXNjcmliZSB0aGUNCiAgICAgcHJvamVjdCBl Y29zeXN0ZW0gYW5kIGhvdyB5b3Ugd2lsbCBlbmdhZ2Ugd2l0aCByZWxldmFudCBhY3RvcnMgb3IN CiAgICAgcHJvbW90ZSB0aGUgYWRvcHRpb24uDQoNCg0KUXVlc3Rpb25zDQrilYzilYzilYzilYzi lYzilYzilYzilYzilYwNCg0KICBJZiB5b3UgaGF2ZSBxdWVzdGlvbnMgcHJpb3IgdG8gc3VibWl0 dGluZyBhbiBhcHBsaWNhdGlvbiwgZmVlbCBmcmVlIHRvDQogIHJlYWNoIG91dCBhdCBgZ3JhbnRz QGFocmVmcy5jb20nLg0KDQogIFdlIGxvb2sgZm9yd2FyZCB0byBzdXBwb3J0IHRoZSB3b3JrIHRo YXQgd2lsbCBtb3ZlIHRoZSBPQ2FtbCBlY29zeXN0ZW0NCiAgZm9yd2FyZC4NCg0KDQpDYWxsIGZv ciBDb250cmlidXRpb25zOiBDYW1sIGluIHRoZSBDYXBpdGFsIChGZWIgMjYpDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NhbGwtZm9yLWNvbnRyaWJ1dGlvbnMtY2FtbC1pbi10aGUt Y2FwaXRhbC1mZWItMjYvMTc2MDYvMT4NCg0KDQoiQWxpc3RhaXIgTydCcmllbiBhbm5vdW5jZWQN CuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhleSBhbGwg8J+RiywNCg0KICBBIHF1aWNr IGZvbGxvdy11cCBvbiBDYW1sIGluIHRoZSBDYXBpdGFsOiB0aGUgZmlyc3QgbWVldHVwIGlzIG5v dw0KICBjb25maXJtZWQg8J+OiS4NCg0KICAqV2hlbio6IFRodXJzZGF5IDI2dGggRmVicnVhcnkg MjAyNiwgNjozMC04OjMwcG0NCg0KICAqV2hlcmUqOiBJbXBlcmlhbCBDb2xsZWdlIExvbmRvbiwg Rmxvd2VycyBCdWlsZGluZw0KDQogIFRoYW5rcyB0byBldmVyeW9uZSB3aG8gaGVscGVkIHNldHRs ZSBvbiBhIGRhdGUhDQoNCg0KQ2FsbCBmb3IgY29udHJpYnV0aW9ucw0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg V2XigJlyZSBzdGlsbCBsb29raW5nIGZvciBwcmVzZW50ZXJzISBUYWxrcyBhcmUgd29ya3Nob3At c3R5bGU6IGFueXRoaW5nDQogIGZyb20gYW4gYWNjZXNzaWJsZSBpbnRyb2R1Y3Rpb24gb2YgeW91 ciB3b3JrIG9yIHJlc2VhcmNoLCBhIGRlZXAgZGl2ZQ0KICBpbnRvIHlvdXIgbGlicmFyeSwgYSBs aXZlIGRlbW8sIG9yIGEgdHV0b3JpYWwuDQoNCiAgSWYgeW914oCZZCBsaWtlIHRvIGdpdmUgYSB0 YWxrLCBwbGVhc2UgbWVzc2FnZSBtZSBvciBAZ2lsdGhvIGRpcmVjdGx5DQogIHdpdGg6DQogIOKA oiBBIHRpdGxlDQogIOKAoiBTaG9ydCBhYnN0cmFjdA0KICDigKIgRXhwZWN0ZWQgdGltZSBzbG90 DQoNCiAgKkRlYWRsaW5lKjogMXN0IEZlYnJ1YXJ5IDIwMjYNCg0KICBXZeKAmXZlIHNldCBhIGRl YWRsaW5lIHNvIHdlIGhhdmUgZW5vdWdoIHRpbWUgdG8gZmluYWxpemUgdGhlIHByb2dyYW1tZQ0K ICBhbmQgaGFuZGxlIHRoZSBwcmFjdGljYWwgb3JnYW5pc2F0aW9uIChyb29tIHNldHVwLCBzY2hl ZHVsZSwNCiAgYW5ub3VuY2VtZW50cywgZXRjLikuDQoNCg0KQ2FsbCBmb3IgcGFydGljaXBhdGlv bg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWMDQoNCiAgWW914oCZcmUgdmVyeSB3ZWxjb21lIHRvIGF0dGVuZCBldmVuIGlm IHlvdeKAmXJlIG5vdCBwcmVzZW50aW5nLiBJZiB5b3UNCiAgcGxhbiB0byBhdHRlbmQsIHBsZWFz ZSByZWdpc3RlciBbaGVyZV0uDQoNCg0KICBNYW55IHRoYW5rcyB0byBJbXBlcmlhbCBDb2xsZWdl IGZvciBob3N0aW5nIHVzIGFuZCBPQ2FtbCBTb2Z0d2FyZQ0KICBGb3VuZGF0aW9uIGZvciBmdW5k aW5nIHVzISEgOnJhaXNlZF9oYW5kczoNCg0KICBBbGlzdGFpciAmIFNhY2hhDQoNCg0KW2hlcmVd DQo8aHR0cHM6Ly93d3cuZXZlbnRicml0ZS5zZy9lL2NhbWwtaW4tdGhlLWNhcGl0YWwtZmViLTIw MjYtdGlja2V0cy0xOTc3NzMwNjE0NTA3P2FmZj1vZGR0ZHRjcmVhdG9yPg0KDQoNClNhY2hhIEF5 b3VuIGxhdGVyIGFkZGVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJZiB0aGVyZSBhcmUgYW55IGFkZGl0 aW9uYWwgcXVlc3Rpb25zIG9uIHJlZ2lzdHJhdGlvbiwgb3JnYW5pc2F0aW9uLA0KICBsb2dpc3Rp Y3MsIGZlZWwgZnJlZSB0byBhc2sgcXVlc3Rpb25zIGluIHRoaXMgdGhyZWFkLCBvciBpbiB0aGUN CiAgW2RlZGljYXRlZCBadWxpcCBjaGFubmVsXSgNCiAgPGh0dHBzOi8vb2NhbWwuenVsaXBjaGF0 LmNvbS8jbmFycm93L2NoYW5uZWwvNTUzMzc1LUNhbWwtSW4tVGhlLUNhcGl0YWw+KQ0KICDwn5mC DQoNCg0KRHJlYW0g4oCTIGxvb2tpbmcgZm9yIG1haW50YWluZXJzIHRvIHRha2Ugb3duZXJzaGlw DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2RyZWFtLWxvb2tpbmctZm9yLW1haW50YWluZXJzLXRv LXRha2Utb3duZXJzaGlwLzE3NjA3LzE+DQoNCg0KQW50b24gQmFjaGluIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgKltEcmVhbV0qLCB0aGUgV2ViIGZyYW1ld29yaywgaXMgbG9va2luZyBmb3Ig YSBtYWludGVuYW5jZSB0ZWFtIQ0KDQogIEkgb3JpZ2luYWxseSB3cm90ZSBEcmVhbSBpbiAyMDIx LCBhbmQgYWN0aXZlbHkgbWFpbnRhaW5lZCBpdCBmb3INCiAgc2V2ZXJhbCB5ZWFycy4gSXQgaGFz IGdvdHRlbiBtYW55IGdyZWF0IGNvbnRyaWJ1dGlvbnMgZnJvbSBvdGhlcg0KICBhdXRob3JzIHNp bmNlIGl0cyBmaXJzdCByZWxlYXNlLCBmb3Igd2hpY2ggSSBhbSB2ZXJ5IGdyYXRlZnVsIQ0KDQog IEF0IHRoZSBwcmVzZW50IHRpbWUsIEkgYW0gbm8gbG9uZ2VyIGluIGEgcG9zaXRpb24gdG8gc3Vz dGFpbmFibHkNCiAgbWFpbnRhaW4gRHJlYW0uIEnigJlkIGxpa2UgdG8geWllbGQgaXQgdG8gb25l IG9yIHNldmVyYWwgbWFpbnRhaW5lcnMsDQogIHdobyB3b3VsZCBoYXZlIHRoZSBhYmlsaXR5IHRv IHB1cnN1ZSB0aGVpciB2aXNpb24sIGJyaW5nIHRoZWlyIGlkZWFzLA0KICBjcmVkaWJseSBzZWVr IGZ1bmRpbmcgZm9yIHdvcmsgdGhhdCBzdWJzdGFudGlhbGx5IGFmZmVjdHMgaXQsIGFuZCBjaXRl DQogIGl0IG9uIHRoZWlyIHJlc3VtZSBvciBlbHNld2hlcmUuIEluIG90aGVyIHdvcmRzLCB0byB0 YWtlIG93bmVyc2hpcCBvZg0KICBpdC4gSSB3b3VsZCBzdGF5IG9uIGluIGFuIGFkdmlzb3J5IHJv bGUsIHRvIHRyYW5zZmVyIGtub3dsZWRnZSwgaGVscA0KICBuZWdvdGlhdGUsIGFuZCBhc3Npc3Qg aW4gdmFyaW91cyB3YXlzLCBhcyBhIHZvbHVudGVlci4NCg0KICBXZeKAmXZlIGFscmVhZHkgYmVl biBoYXZpbmcgRHJlYW0gY29tbXVuaXR5IGRldmVsb3BtZW50IG1lZXRpbmdzIG92ZXIgb24NCiAg RGlzY29yZCBzaW5jZSBBdWd1c3QsIHdoaWNoIGhhdmUgYmVlbiB2ZXJ5IGhlbHBmdWwuIExhc3Qg bW9udGgsIEkNCiAgdHJhbnNmZXJyZWQgRHJlYW0gdG8gYW4gb3JnIG9uIEdpdEh1Yi4gSXTigJlz IHJlYWR5IGZvciB0aGUgbmV4dCBzdGVwDQogIDpzbGlnaHRfc21pbGU6DQoNCiAgRHJlYW0gaGFz IGEgdmVyeSBsYXJnZSBhbW91bnQgb2YgaW50ZXJlc3Rpbmcgd29yayB0byBkby4gVGhlIG9yaWdp bmFsDQogIG1vdGl2YXRpb24gd2FzIG5vdCBvbmx5IHRvIGNyZWF0ZSBhIG1vZGVybiwgaGlnaGx5 IGVyZ29ub21pYyBXZWINCiAgZnJhbWV3b3JrIGluIGEgbWluaW1hbCBzZW5zZSwgYnV0IHRvIGRv IGEgd2hvbGUgdG91ciB0aHJvdWdoIHRoZSBPQ2FtbA0KICBXZWIgZGV2ZWxvcG1lbnQgZWNvc3lz dGVtIGFuZCBhZGRyZXNzIGV2ZXJ5IG90aGVyIHBsYWNlIHdoZXJlIGEgbWFqb3INCiAgbGlicmFy eSBpcyBtaXNzaW5nLCBvciB3aGVyZSBxdWFsaXR5IG9mIGxpZmUgY2FuIGJlIGltcHJvdmVkLiBT ZWUgdGhlDQogIFtyb2FkbWFwXSBmb3Igc29tZSBvZiB0aGUgbWFueSBpZGVhcy4NCg0KICBJbiBm YWN0LCB3ZSBoYWQgc3RhcnRlZCB3b3JraW5nIG9uIHRoaXMgYmFjayBpbiAyMDIyIHdpdGggYSBz bWFsbCB0ZWFtDQogIG9mIHBlb3BsZSwgYW5kIGNyZWF0ZWQgYW4gT0F1dGggbGlicmFyeS4gVGhh dCBlbnRlcnByaXNlIHdhcw0KICB1bmZvcnR1bmF0ZWx5IHRlcm1pbmF0ZWQgYnkgZXZlbnRzIG91 dHNpZGUgb3VyIGNvbnRyb2wsIGFuZCB0aGUNCiAgbG9naWNhbCBzdGVwIG5vdyBpcyBmb3IgbWUg dG8geWllbGQgY29udHJvbCBvZiBEcmVhbSBpdHNlbGYgdG8gYQ0KICBkaWZmZXJlbnRseSBzdHJ1 Y3R1cmVkIHRlYW0sIGZvciBpdHMgbmF0dXJhbCBkZXZlbG9wbWVudA0KICA6c2xpZ2h0X3NtaWxl Og0KDQogIElmIHlvdeKAmXJlIGludGVyZXN0ZWQsIHBsZWFzZSBETSBtZSBoZXJlIG9uIERpc2N1 c3MhIElmIHlvdSBoYXZlIHN1Y2gsDQogIHBsZWFzZSBsaW5rIHlvdXIgcHJvamVjdHMgcmVsYXRl ZCB0byBXZWIgZGV2ZWxvcG1lbnQsIG9yIHdoZXJlIHlvdQ0KICBoYXZlIGJlZW4gYSBtYWludGFp bmVyLiBMZXQgbWUga25vdyBpZiB5b3XigJlyZSBhIHVzZXIgb2YgRHJlYW0sIGFuZA0KICB3aGF0 IHlvdeKAmWQgbGlrZSB0byBzZWUgaW4gV2ViIGRldmVsb3BtZW50IGluIE9DYW1sLg0KDQogIFRo YW5rIHlvdSENCg0KDQpbRHJlYW1dIDxodHRwczovL2dpdGh1Yi5jb20vY2FtbHdvcmtzL2RyZWFt Pg0KDQpbcm9hZG1hcF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jYW1sd29ya3MvZHJlYW0vd2lraS9S b2FkbWFwPg0KDQoNClFDaGVjayAwLjkwOiBUaGUgR3JlYXQgUmVuYW1pbmcNCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLXFjaGVjay0wLTkwLXRoZS1ncmVhdC1yZW5hbWluZy8xNzYxMy8x Pg0KDQoNCkphbiBNaWR0Z2FhcmQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJdCBpcyBt eSBwbGVhc3VyZSB0byBhbm5vdW5jZSByZWxlYXNlIDAuOTAgb2YgdGhlIFFDaGVjaw0KICBwYWNr YWdlcy4gUUNoZWNrIGlzIGFuIE9DYW1sIGxpYnJhcnkgZm9yIHJhbmRvbWl6ZWQgcHJvcGVydHkt YmFzZWQNCiAgdGVzdGluZyBpbiB0aGUgc3R5bGUgb2YgSGFza2VsbCdzIFF1aWNrQ2hlY2suDQoN CiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3JlbGVhc2VzL3RhZy92MC45MD4N Cg0KICBJdCBoYXMgYmVlbiBvdmVyIDEyIHllYXJzIGFuZCA0MCByZWxlYXNlcyBzaW5jZSBAYy1j dWJlIHJlbGVhc2VkDQogIHZlcnNpb24gMC4xIGJhY2sgaW4gT2N0b2JlciAyMDEzLiBPdmVyIHRo aXMgcGVyaW9kIFFDaGVjayBoYXMgZ3Jvd24NCiAgb3JnYW5pY2FsbHkNCiAg4oCiIHdpdGggbmV3 IGNvbWJpbmF0b3JzIG9uIGEgImJ5LW5lZWQiIGJhc2lzIGFuZA0KICDigKIgd2l0aCBhIHNlcGFy YXRlIGBRQ2hlY2syJyBtb2R1bGUgb2ZmZXJpbmcgZ2VuZXJhdG9ycyB3aXRoIGludGVncmF0ZWQN CiAgICBzaHJpbmtpbmcuDQoNCiAgVGhpcyBoYXMgdW5mb3J0dW5hdGVseSByZXN1bHRlZCBpbiBh IGJpdCBvZiBhIG5hbWluZyBtZXNzIHdpdGgNCiAgaW5jb25zaXN0ZW50IGdlbmVyYXRvciBuYW1l cy4gRm9yIGV4YW1wbGUsIHRoZSAobm93IGRlcHJlY2F0ZWQpDQogIGBzbWFsbF9pbnQnIGNvbWJp bmF0b3Igd2lsbCBnZW5lcmF0ZSBvbmx5IHNtYWxsIG5vbi1uZWdhdGl2ZSBudW1iZXJzLA0KICBh bmQgYSBjb21iaW5hdG9yIGZvciBnZW5lcmF0aW5nIHBvc2l0aXZlIGludGVnZXJzIHVuaWZvcm1s eSBpcyBuYW1lZA0KICBlaXRoZXIgYHBpbnQnIG9yIGBwb3NfaW50JyBhY3Jvc3MgZGlmZmVyZW50 IFFDaGVjayBtb2R1bGVzLg0KDQogIFRoZSAwLjkwIHJlbGVhc2UgdGh1cyB0YWtlcyBvbiBhIGNs ZWFudXAgdW5kZXIgdGhlIGhlYWRpbmcgIlRoZSBHcmVhdA0KICBSZW5hbWluZyIuICBUbyBndWlk ZSB0aGUgcmVuYW1pbmcgcHJvY2Vzcywgd2UgaGF2ZSBhc3NlbWJsZWQgYSBsaXN0IG9mDQogIGhh cmQtbGVhcm5lZCBuYW1pbmcgcHJpbmNpcGxlczoNCg0KICDigKIgR2VuZXJhdG9yIG5hbWVzIHNo b3VsZCBhbGlnbiB3aXRoIHR5cGUgbmFtZXMgKGBib29sJywgYGNoYXInLCDigKYNCiAgICBgbGlz dCcsIGBvcHRpb24nKSB0byBiZSBhcyBwcmVkaWN0YWJsZSBhcyBwb3NzaWJsZQ0KICDigKIgV2Ug c2hvdWxkIGhhdmUgc2hvcnQsIHVucGFyYW1ldGVyaXplZCBnZW5lcmF0b3JzIChgaW50JywgYHN0 cmluZycsDQogICAg4oCmKSB0byBsb3dlciB0aGUgYmFycmllciB0byBlbnRyeQ0KICDigKIgU3Bl Y2lhbGl6ZWQgZ2VuZXJhdG9ycyBhbHNvIHN0YXJ0IHdpdGggdGhlIHR5cGUgbmFtZSwgYnV0IHVz ZSBhDQogICAgY29uc2lzdGVudCBzdWZmaXggKGBfcG9zJywgYF9uZWcnLCBgX3NpemUnLCBgX29m Jywg4oCmKSB0byBoZWxwIGZpbmQNCiAgICB0aGVtLCBlLmcuLCB3aXRoIHRhYi1jb21wbGV0aW9u DQogIOKAoiBXZSBtYXkgaW5jbHVkZSBhIGZldyBzaG9ydGhhbmQgbmFtZXMgZm9yIGNvbnZlbmll bmNlIChlLmcuLCBgbmF0JykNCiAg4oCiIE92ZXJhbGwgd2UgYWltIHRvIGJlIGFzIGNvbnNpc3Rl bnQgYXMgcG9zc2libGUsIGUuZy4sIG9mZmVyaW5nDQogICAgc2ltaWxhciBzaWduYXR1cmVzIGFj cm9zcyBnZW5lcmF0b3IgaW50ZXJmYWNlcyAoYFFDaGVjay5HZW4nLA0KICAgIGBRQ2hlY2suYXJi aXRyYXJ5JywgYW5kIGBRQ2hlY2syLkdlbicpDQoNCiAgVGhlIDAuOTAgcmVsZWFzZSB0aHVzIGJv dGgNCiAg4oCiIGludHJvZHVjZXMgYSByYW5nZSBvZiBuZXcgKGFuZCBob3BlZnVsbHkgbW9yZSBj b25zaXN0ZW50KSBjb21iaW5hdG9yDQogICAgbmFtZXMgYW5kDQogIOKAoiBkZXByZWNhdGVzIGEg c2l6YWJsZSBudW1iZXIgb2Ygb2xkLCBpbmNvbnNpc3RlbnQgY29tYmluYXRvciBuYW1lcw0KDQog IFRoZSBkZXByZWNhdGVkIGNvbWJpbmF0b3JzIGhhdmUgYmVlbiBhbm5vdGF0ZWQgd2l0aCBgQEBk ZXByZWNhdGVkJw0KICBhdHRyaWJ1dGVzLg0KDQogIFJhdGhlciB0aGFuIGxldCBhIGNvdXBsZSBt b3JlIHllYXJzIHBhc3Mgd2l0aCBhbiBldmVuIGJpZ2dlciBhbmQgbW9yZQ0KICBjb25mdXNpbmcg bmFtZSBwb29sLCB3ZSBhcmUgdXNpbmcgdGhpcyBvcHBvcnR1bml0eSB0byBwcmVwYXJlIGEgbG9u Zw0KICBvdmVyZHVlIDEuMC4wIHJlbGVhc2UsIHdoZXJlIHdlIHdpbGwgcmVtb3ZlIHRoZSBvbGQs IGRlcHJlY2F0ZWQNCiAgY29tYmluYXRvciBuYW1lcy4NCg0KICBXZSB1bmRlcnN0YW5kIHRoYXQg dXBkYXRpbmcgZXhpc3RpbmcgdGVzdHMgdG8gdGhlIG5ldyBuYW1lcyB0YWtlcyBzb21lDQogIGVm Zm9ydCwgYnV0IGFwcGVhbCB0byB1c2VycyB0aGF0IHRoaXMgc2hvdWxkIGJlIGEgb25lLXRpbWUg aW52ZXN0bWVudA0KICB0bw0KICDigKIgb2ZmZXIgbW9yZSBjb25zaXN0ZW50IGFuZCBlYXNpZXIg dG8gcmVjYWxsIGNvbWJpbmF0b3IgbmFtZXMgYW5kDQogICAgc2ltdWx0YW5lb3VzbHkNCiAg4oCi IGxldCB1cyBjbGVhbiB1cCBRQ2hlY2sgdGVjaCBkZWJ0IGFuZCBhZGRyZXNzIGEgbG9uZy10aW1l IHBhaW4gcG9pbnQuDQoNCg0KICBUaGUgY2hhbmdlcyBhcmUgc3VtbWFyaXplZCBpbiBhIHJlY29y ZC1sb25nIENIQU5HRUxPRyBzZWN0aW9uIGZvciB0aGUNCiAgcmVsZWFzZToNCg0KICA8aHR0cHM6 Ly9naXRodWIuY29tL2MtY3ViZS9xY2hlY2svYmxvYi92MC45MC9DSEFOR0VMT0cubWQ+DQoNCiAg YW5kIFtjLWN1YmUvcWNoZWNrIzM2Nl0gcHJvdmlkZXMgYSBydW4gZG93biBvZiB0aGUgcmVuYW1p bmcgcHJvY2Vzcy4NCg0KICBGb3IgbW9yZSBkZXRhaWxzLCBzZWUgdGhlIGZvbGxvd2luZyBsaXN0 IG9mIFBSczoNCg0KICDigKIgW3FjaGVjay9wdWxsIzM2N10NCiAg4oCiIFtxY2hlY2svcHVsbCMz NjldDQogIOKAoiBbcWNoZWNrL3B1bGwjMzcwXQ0KICDigKIgW3FjaGVjay9wdWxsIzM3MV0NCiAg 4oCiIFtxY2hlY2svcHVsbCMzNzJdDQogIOKAoiBbcWNoZWNrL3B1bGwjMzczXQ0KICDigKIgW3Fj aGVjay9wdWxsIzM3NF0NCiAg4oCiIFtxY2hlY2svcHVsbCMzNzZdDQogIOKAoiBbcWNoZWNrL3B1 bGwjMzc5XQ0KICDigKIgW3FjaGVjay9wdWxsIzM4MF0NCiAg4oCiIFtxY2hlY2svcHVsbCMzODFd DQogIOKAoiBbcWNoZWNrL3B1bGwjMzg2XQ0KICDigKIgW3FjaGVjay9wdWxsIzM4N10NCiAg4oCi IFtxY2hlY2svcHVsbCMzODhdDQogIOKAoiBbcWNoZWNrL3B1bGwjMzg5XQ0KICDigKIgW3FjaGVj ay9wdWxsIzM5MF0NCiAg4oCiIFtxY2hlY2svcHVsbCMzOTFdDQogIOKAoiBbcWNoZWNrL3B1bGwj MzkyXQ0KICDigKIgW3FjaGVjay9wdWxsIzM5M10NCiAg4oCiIFtxY2hlY2svcHVsbCMzOTRdDQog IOKAoiBbcWNoZWNrL3B1bGwjMzk2XQ0KDQoNCiAgRmluYWxseSwgb24gYmVoYWxmIG9mIHRoZSBt YWludGFpbmVycyBJIHdvdWxkIGxpa2UgdG8gdGhhbmsNCiAg4oCiIHRoZSB2YXJpb3VzIGZvbGtz IGNvbnRyaWJ1dGluZyB0byBRQ2hlY2sgb3ZlciB0aGUgcGFzdCAxMiB5ZWFycyBhbmQNCiAg4oCi IHRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uIGZvciBmaW5hbmNpYWxseSBzdXBwb3J0aW5n IHRoZSB3b3JrIG9uDQogICAgdGhlc2UgcGFzdCB0aHJlZSByZWxlYXNlcy4NCg0KDQogIE1lcnJ5 IENocmlzdG1hcyBhbmQgaGFwcHkgdGVzdGluZyEgOmV2ZXJncmVlbl90cmVlOiA6d3JhcHBlZF9n aWZ0Og0KDQoNCltjLWN1YmUvcWNoZWNrIzM2Nl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUv cWNoZWNrL2lzc3Vlcy8zNjY+DQoNCltxY2hlY2svcHVsbCMzNjddIDxodHRwczovL2dpdGh1Yi5j b20vYy1jdWJlL3FjaGVjay9wdWxsLzM2Nz4NCg0KW3FjaGVjay9wdWxsIzM2OV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3B1bGwvMzY5Pg0KDQpbcWNoZWNrL3B1bGwjMzcwXSA8 aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9xY2hlY2svcHVsbC8zNzA+DQoNCltxY2hlY2svcHVs bCMzNzFdIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjay9wdWxsLzM3MT4NCg0KW3Fj aGVjay9wdWxsIzM3Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3B1bGwvMzcy Pg0KDQpbcWNoZWNrL3B1bGwjMzczXSA8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9xY2hlY2sv cHVsbC8zNzM+DQoNCltxY2hlY2svcHVsbCMzNzRdIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJl L3FjaGVjay9wdWxsLzM3ND4NCg0KW3FjaGVjay9wdWxsIzM3Nl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9jLWN1YmUvcWNoZWNrL3B1bGwvMzc2Pg0KDQpbcWNoZWNrL3B1bGwjMzc5XSA8aHR0cHM6Ly9n aXRodWIuY29tL2MtY3ViZS9xY2hlY2svcHVsbC8zNzk+DQoNCltxY2hlY2svcHVsbCMzODBdIDxo dHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjay9wdWxsLzM4MD4NCg0KW3FjaGVjay9wdWxs IzM4MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3B1bGwvMzgxPg0KDQpbcWNo ZWNrL3B1bGwjMzg2XSA8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9xY2hlY2svcHVsbC8zODY+ DQoNCltxY2hlY2svcHVsbCMzODddIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjay9w dWxsLzM4Nz4NCg0KW3FjaGVjay9wdWxsIzM4OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUv cWNoZWNrL3B1bGwvMzg4Pg0KDQpbcWNoZWNrL3B1bGwjMzg5XSA8aHR0cHM6Ly9naXRodWIuY29t L2MtY3ViZS9xY2hlY2svcHVsbC8zODk+DQoNCltxY2hlY2svcHVsbCMzOTBdIDxodHRwczovL2dp dGh1Yi5jb20vYy1jdWJlL3FjaGVjay9wdWxsLzM5MD4NCg0KW3FjaGVjay9wdWxsIzM5MV0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3B1bGwvMzkxPg0KDQpbcWNoZWNrL3B1bGwj MzkyXSA8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9xY2hlY2svcHVsbC8zOTI+DQoNCltxY2hl Y2svcHVsbCMzOTNdIDxodHRwczovL2dpdGh1Yi5jb20vYy1jdWJlL3FjaGVjay9wdWxsLzM5Mz4N Cg0KW3FjaGVjay9wdWxsIzM5NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9jLWN1YmUvcWNoZWNrL3B1 bGwvMzk0Pg0KDQpbcWNoZWNrL3B1bGwjMzk2XSA8aHR0cHM6Ly9naXRodWIuY29tL2MtY3ViZS9x Y2hlY2svcHVsbC8zOTY+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9n DQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3Mg YWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0FvQUggRGF5 IDIxOiBDb21wbGV0ZSBkeW5hbWljIEhUTUw1IHZhbGlkYXRpb24gaW4gT0NhbWwgYW5kIHRoZQ0K ICAgIGJyb3dzZXJdDQogIOKAoiBbQW9BSCBEYXkgMjA6IEh1bWFuIGxhbmd1YWdlIGRldGVjdGlv biBpbiBuYXRpdmUgY29kZSwgSlMgYW5kIHdhc21dDQogIOKAoiBbQW9BSCBEYXkgMTk6IFp1bGlw IGJvdCBmcmFtZXdvcmsgdG8gYnJpbmcgVmljdW5hIHRoZSBmcmllbmRseSBjYW1lbA0KICAgIGJh Y2tdDQogIOKAoiBbQW9BSCBEYXkgMTg6IFRPTUwgMS4xIGNvZGVjcyBkaXJlY3RseSBmcm9tIHRo ZSBzcGVjIGFuZCBwYXBlcl0NCiAg4oCiIFtDbGF1ZGUgYW5kIER1bmVdDQogIOKAoiBbUGFydHJp ZGdlIFB1enpsZV0NCiAg4oCiIFtBb0FIIERheSAxNzogT0NhbWwgSk1BUCB0byBwbGFzdGVyIG15 IHBhaW5mdWwgZW1haWwgcGFwZXJjdXRzXQ0KICDigKIgW0FvQUggRGF5IDE2OiBWaWJlc3BsYWlu aW5nIEpTT04gUG9pbnRlcnMgdXNpbmcgT0NhbWwvSmF2YXNjcmlwdF0NCiAg4oCiIFtBb0FIIERh eSAxNTogUG9ydGluZyBhIGNvbXBsZXRlIEhUTUw1IHBhcnNlciBhbmQgYnJvd3NlciB0ZXN0DQog ICAgc3VpdGVdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Js b2cvPg0KDQpbQW9BSCBEYXkgMjE6IENvbXBsZXRlIGR5bmFtaWMgSFRNTDUgdmFsaWRhdGlvbiBp biBPQ2FtbCBhbmQgdGhlDQpicm93c2VyXSA8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMv YW9haC0yMDI1LTIxPg0KDQpbQW9BSCBEYXkgMjA6IEh1bWFuIGxhbmd1YWdlIGRldGVjdGlvbiBp biBuYXRpdmUgY29kZSwgSlMgYW5kIHdhc21dDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90 ZXMvYW9haC0yMDI1LTIwPg0KDQpbQW9BSCBEYXkgMTk6IFp1bGlwIGJvdCBmcmFtZXdvcmsgdG8g YnJpbmcgVmljdW5hIHRoZSBmcmllbmRseSBjYW1lbA0KYmFja10gPGh0dHBzOi8vYW5pbC5yZWNv aWwub3JnL25vdGVzL2FvYWgtMjAyNS0xOT4NCg0KW0FvQUggRGF5IDE4OiBUT01MIDEuMSBjb2Rl Y3MgZGlyZWN0bHkgZnJvbSB0aGUgc3BlYyBhbmQgcGFwZXJdDQo8aHR0cHM6Ly9hbmlsLnJlY29p bC5vcmcvbm90ZXMvYW9haC0yMDI1LTE4Pg0KDQpbQ2xhdWRlIGFuZCBEdW5lXQ0KPGh0dHBzOi8v am9uLnJlY29pbC5vcmcvYmxvZy8yMDI1LzEyL2NsYXVkZS1hbmQtZHVuZS5odG1sPg0KDQpbUGFy dHJpZGdlIFB1enpsZV0NCjxodHRwczovL3d3dy50dW5idXJ5Lm9yZy8yMDI1LzEyLzE3L3BhcnRy aWRnZS1wdXp6bGUvPg0KDQpbQW9BSCBEYXkgMTc6IE9DYW1sIEpNQVAgdG8gcGxhc3RlciBteSBw YWluZnVsIGVtYWlsIHBhcGVyY3V0c10NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9h b2FoLTIwMjUtMTc+DQoNCltBb0FIIERheSAxNjogVmliZXNwbGFpbmluZyBKU09OIFBvaW50ZXJz IHVzaW5nIE9DYW1sL0phdmFzY3JpcHRdDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMv YW9haC0yMDI1LTE2Pg0KDQpbQW9BSCBEYXkgMTU6IFBvcnRpbmcgYSBjb21wbGV0ZSBIVE1MNSBw YXJzZXIgYW5kIGJyb3dzZXIgdGVzdCBzdWl0ZV0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9u b3Rlcy9hb2FoLTIwMjUtMTU+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2Fn ZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUg YXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+ DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0K W1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBh L2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 16 to 23, 20= 25.

    Camp, the Caml Amp

    Andreas Rossberg announced

    Happy to share =E2=80=9CCamp=E2=80=9D, the Caml Amp =E2=80=94 an old-school= music player heavily inspired by good old Winamp, with a focus on decent m= usic library and playlist handling.

    I was fed up with Winamp being dead and lacking features I wanted, so I wen= t into full-on nerd mode and implemented my own opinionated replacement, all in OCaml using the Raylib library:

    https://mpi-sws.org/~rossbe= rg/camp/

    If you have not yet been sucked in by the streaming cartels, you might find= it useful.

    • Runs on Windows, Mac, and Linux
    • Support for WAV, FLAC, MP3, OGG, QOA, MOD, and XM
    • Advanced music library management with many browse and search features<= /li>
    • Elaborate playlist manipulation and query-based =E2=80=9Csmart=E2=80=9D= playlists
    • Animated user interface styled after hifi when it still looked good (no corners were rounded in the making of this app)

    Enjoy, /Andreas

    Ahrefs Grant Program for OCaml

    Louis Roch=C3=A9 announced

    Ahrefs is excited to announce a new Ahrefs Grant Program for OCaml t= o support projects in the OCaml ecosystem. This effort comes in addition to= the other sponsorships we do (such as the OCSF, the ICFP and Fun OCaml conferences, github sponsoring, and various other projects) We are allocating money = to fund one or multiple initiatives that help advance OCaml and its tooling.

    You can learn more about our engineering culture and opensource support wor= k at https://ahrefs.com/tech

    Call for Applications

    We invite individuals, teams, and organizations working with OCaml to submi= t proposals for funding. Our goal is to support meaningful, practical impro= vements to the ecosystem, whether through new tools, libraries, infrastruct= ure, education, or long=E2=80=91term maintenance of existing projects.

    Applications should be submitted through this google form.

    The deadline for submissions is January 20th 2026.

    What We Are Looking For

    We welcome proposals that:

    • Strengthen the OCaml compiler or core libraries
    • Improve developer experience (tooling, documentation, debugging, profil= ing, packaging, =E2=80=A6)
    • Expand the OCaml ecosystem through new libraries or modernization of ke= y dependencies
    • Enhance reliability, performance, or safety of OCaml=E2=80=91based syst= ems
    • Support education, community infrastructure, or long=E2=80=91term maint= enance

    Both small and large initiatives are welcome. We will prioritize projects t= hat will have lasting impact and will be maintained.

    The selection of proposal will necessarily be subjective and depend on our = priorities and interests.

    Funding

    Applicants may request up to USD 50,000 in support per project. We m= ay award a single project or distribute among several proposals.

    How to Apply

    Your application should follow the format below and be sent through this google form.

    Please be short and to the point in your answers; focus primarily on the wh= at and how, not so much on the why. If English isn't your first language, d= on't worry =E2=80=94 our reviewers don't care about spelling errors, only a= bout great ideas. You can be as technical as you need to be. Do stay specif= ic.

    • 1. Contact Information
      • Name
      • Organization (if applicable)
      • Email address
      • Country
    • 2. General Project Information
      • Title
      • Abstract (up to 1200 characters) Explain the whole project and its expected outcome(s).
      • Yourself or the team (2500 characters) Who is participating? Hav= e you been involved with similar or related projects? Please provide backgr= ound information and describe your past contributions.
      • Website (if any)
      • License Under which license will the project be distributed? It = must be an open source license.
    • 3. Requested Support
      • Requested Amount (up to USD 50,000)
      • Budget and Breakdown (up to 2500 characters) Explain what the bu= dget will be used for. Are there other funding sources? Include a breakdown= of tasks, estimated effort, and explicit rates.
      • Describe your project and its technical challenges (up to 5000 c= haracters) What are significant technical challenges you expect to solve du= ring the project, if any? Compare your own project with existing or histori= cal efforts. E.g. what is new, more thorough or otherwise different.
      • Ecosystem and Outreach (up to 1200 characters) Describe the proj= ect ecosystem and how you will engage with relevant actors or promote the a= doption.

    Questions

    If you have questions prior to submitting an application, feel free to reac= h out at grants@ahrefs.com.

    We look forward to support the work that will move the OCaml ecosystem forw= ard.

    Call for Contributions: Caml in the Capital (Feb 26)

    "Alistair O'Brien announced

    Hey all =F0=9F=91=8B,=20

    A quick follow-up on Caml in the Capital: the first meetup is now confirmed= =F0=9F=8E=89.=20

    When: Thursday 26th February 2026, 6:30-8:30pm

    Where: Imperial College London, Flowers Building=20

    Thanks to everyone who helped settle on a date!=20

    Call for contributions

    We=E2=80=99re still looking for presenters! Talks are workshop-style: anyth= ing from an accessible introduction of your work or research, a deep dive i= nto your library, a live demo, or a tutorial.=20

    If you=E2=80=99d like to give a talk, please message me or @giltho directly= with:=20

    • A title
    • Short abstract
    • Expected time slot

    Deadline: 1st February 2026

    We=E2=80=99ve set a deadline so we have enough time to finalize the program= me and handle the practical organisation (room setup, schedule, announcemen= ts, etc.).

    Call for participation

    You=E2=80=99re very welcome to attend even if you=E2=80=99re not presenting= . If you plan to attend, please register here.

    Many thanks to Imperial College for hosting us and OCaml Software Foundatio= n for funding us!! :raised_hands:=20

    Alistair & Sacha

    Sacha Ayoun later added

    If there are any additional questions on registration, organisation, logist= ics, feel free to ask questions in this thread, or in the [dedicated Zulip = channel]( https://ocaml.zulipchat.com/#narrow/channel/553375-Caml-I= n-The-Capital) =F0=9F=99=82

    Dream =E2=80=93 looking for maintainers to take ownership

    Anton Bachin announced

    Dream, the Web fr= amework, is looking for a maintenance team!

    I originally wrote Dream in 2021, and actively maintained it for several ye= ars. It has gotten many great contributions from other authors since its fi= rst release, for which I am very grateful!

    At the present time, I am no longer in a position to sustainably maintain D= ream. I=E2=80=99d like to yield it to one or several maintainers, who would= have the ability to pursue their vision, bring their ideas, credibly seek = funding for work that substantially affects it, and cite it on their resume= or elsewhere. In other words, to take ownership of it. I would stay on in = an advisory role, to transfer knowledge, help negotiate, and assist in vari= ous ways, as a volunteer.

    We=E2=80=99ve already been having Dream community development meetings over= on Discord since August, which have been very helpful. Last month, I trans= ferred Dream to an org on GitHub. It=E2=80=99s ready for the next step :sli= ght_smile:=20

    Dream has a very large amount of interesting work to do. The original motiv= ation was not only to create a modern, highly ergonomic Web framework in a = minimal sense, but to do a whole tour through the OCaml Web development eco= system and address every other place where a major library is missing, or w= here quality of life can be improved. See the roadmap for some of the many ideas.

    In fact, we had started working on this back in 2022 with a small team of p= eople, and created an OAuth library. That enterprise was unfortunately term= inated by events outside our control, and the logical step now is for me to= yield control of Dream itself to a differently structured team, for its na= tural development :slight_smile:=20

    If you=E2=80=99re interested, please DM me here on Discuss! If you have suc= h, please link your projects related to Web development, or where you have = been a maintainer. Let me know if you=E2=80=99re a user of Dream, and what = you=E2=80=99d like to see in Web development in OCaml.

    Thank you!

    QCheck 0.90: The Great Renaming

    Jan Midtgaard announced

    It is my pleasure to announce release 0.90 of the QCheck packages. QCheck i= s an OCaml library for randomized property-based testing in the style of Haskell= 's QuickCheck.

    https://git= hub.com/c-cube/qcheck/releases/tag/v0.90

    It has been over 12 years and 40 releases since @c-cube released version 0.1 back in October 2013. Over this period QCheck has grown organically

    • with new combinators on a "by-need" basis and
    • with a separate QCheck2 module offering generators with in= tegrated shrinking.

    This has unfortunately resulted in a bit of a naming mess with inconsistent generator names. For example, the (now deprecated) small_int c= ombinator will generate only small non-negative numbers, and a combinator for generating positive integers uniformly is named either pint or pos_= int across different QCheck modules.

    The 0.90 release thus takes on a cleanup under the heading "The Great Renam= ing". To guide the renaming process, we have assembled a list of hard-learned naming principles:

    • Generator names should align with type names (bool, = char, … list, option) to be as pred= ictable as possible
    • We should have short, unparameterized generators (int, string, …) to lower the barrier to entry
    • Specialized generators also start with the type name, but use a consist= ent suffix (_pos, _neg, _size, _of, …) to help find them, e.g., with tab-completion
    • We may include a few shorthand names for convenience (e.g., nat)
    • Overall we aim to be as consistent as possible, e.g., offering similar = signatures across generator interfaces (QCheck.Gen, QCheck.arbitrar= y, and QCheck2.Gen)

    The 0.90 release thus both

    • introduces a range of new (and hopefully more consistent) combinator na= mes and
    • deprecates a sizable number of old, inconsistent combinator names

    The deprecated combinators have been annotated with @@deprecated attributes.

    Rather than let a couple more years pass with an even bigger and more confu= sing name pool, we are using this opportunity to prepare a long overdue 1.0.0 release, where we will remove the old, deprecated combinator names.

    We understand that updating existing tests to the new names takes some effo= rt, but appeal to users that this should be a one-time investment to

    • offer more consistent and easier to recall combinator names and simulta= neously
    • let us clean up QCheck tech debt and address a long-time pain point.

    The changes are summarized in a record-long CHANGELOG section for the relea= se:

    https:= //github.com/c-cube/qcheck/blob/v0.90/CHANGELOG.md

    and c-cube/qcheck#3= 66 provides a run down of the renaming process.

    For more details, see the following list of PRs:

    Finally, on behalf of the maintainers I would like to thank

    • the various folks contributing to QCheck over the past 12 years and
    • the OCaml Software Foundation for financially supporting the work on th= ese past three releases.

    Merry Christmas and happy testing! :evergreen_tree: :wrapped_gift:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=IJn8vT1P; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) (using TLSv1.2 with cipher ECDHE-ECDSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by plum.tunbury.org (Postfix) with ESMTPS id 41FA7400A7 for ; Tue, 30 Dec 2025 09:33:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=ZtXXp7yjPu7/NWqRY/quI9mR7xgkvFwRFdmoClOaYsI=; b=IJn8vT1PN++Enmx9QEeryxwC/XCZRHMLUY8W+pt46MzNojJXPUin0BZ+ XeJ3wtdmN9zRTBdblyfU3CUnSCuEbg/LlCpAo8N2rsc9RcHeihBeZKBh/ M94uMGejLKWhAw6Z5BEyV1sYeqNfnFCAkwvS4Q6zx3AUjieXGH9UtSRpl c=; X-CSE-ConnectionGUID: ajCAmowBQsqgL/YWaWCF4Q== X-CSE-MsgGUID: DxM7ImSCQZ2cAhxcsBusnQ== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,188,1763420400"; d="scan'208,217";a="256319581" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 30 Dec 2025 10:33:25 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 04FCD813BB; Tue, 30 Dec 2025 10:33:25 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id A9AB8806A0 for ; Tue, 30 Dec 2025 10:33:15 +0100 (CET) X-CSE-ConnectionGUID: LdGzepajSuuJz3m6nXjDsg== X-CSE-MsgGUID: b5Txs2vPQyqfqxyLSqq8Xg== IronPort-SDR: 69539c5a_tqUZvLgD8T0Nh/wY4F8KYc1xgPMYjOeUiErmRaXjr5RFkef qgNXxmlFKClq3bk/DUY9wUK98lL3UF9CJb5S3Pw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0G8AwCam1NpdyIeaIFaHgEBCxIMg01bKRoBZgZfMwcIS?= =?us-ascii?q?YRYg08Ijh2cSIFpgUIYCxUBAwENLgEOEQECBAEBAwECAYUAAoxpAh8GAQQ0E?= =?us-ascii?q?wECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAUNJhk8NgkUZO?= =?us-ascii?q?HGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QIECAGBJwoTAQE4GCMDEAQBBgMCEQE1FwESGoJpgiACAk8DBAEMBpRmm016g?= =?us-ascii?q?TKBAYIMAQEGgQg+AgELAgUYJtoPgRpMCYFNhW6CShsBKklrAQKESYQ7AicPg?= =?us-ascii?q?VVEgRWCKFFvgX5MFwIBAQGBIxgBAU0JgyWCaYImehQdhgJ4iQIGigCBRCIDJ?= =?us-ascii?q?jMsAVUTFwsHBV6BCAMqLy1uMh2BIz4Xc4EUg0kfaA8GgRGDUYkGD4legQUDC?= =?us-ascii?q?209NxQblRJcKSWBNi8OOAgNCCc+EwEpAlAIDjUZNDcSAQsNLQOSVyizATQHh?= =?us-ascii?q?B+BXgYMiQiBJpYHhVulECKYZCKJXl1JCYFva5VghViBfyM8gSAzGjAiIYJnC?= =?us-ascii?q?UYcD44hgTQBAwSCRIEBPYMaO7hiQjUCAQE4AgcBCgEBAwmFRR0BAYwILQWBS?= =?us-ascii?q?wEB?= IronPort-PHdr: A9a23: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 y0e4oUQTViBi4HO+Uipg6BU+DFSzY887A== IronPort-Data: A9a23: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 VUIqat4rI1XhKI//QuMu5KYJf3BgA7S8g== IronPort-HdrOrdr: A9a23:RG/M6aFRWkXNePBopLqEi8eALOsnbusQ8zAXPidKKSC9E/b4qy nAppsmPHPP5Qr5O0tKpTnoAsDpfZryz/RICOIqU4tKMjOLhFeV X-Talos-CUID: 9a23:nh0mlGxu5VIAZ+RWByjRBgUwFu83f2XUzkzNPm2qUmM3To2XZUSfrfY= X-Talos-MUID: 9a23:4PHREAsib3IuDDAFA82njmxeJNwy/ZyXGVkDiIUXn/KdLHxANGLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,188,1763420400"; d="scan'208,217";a="134734715" X-MGA-submission: =?us-ascii?q?MDGmLixm58PgOgP141vgdah4UhiRAHroKWBLc5?= =?us-ascii?q?pRq9tnuhz+OuK3rt8jkf3U/smpXpfV8CdSuMPJolCGYsupXs2vdhzwjT?= =?us-ascii?q?h8EWnSH8pspYtwZ4AGSBLIjH642lLHvaaF1PTB9vhx800jrhBluvJ0JZ?= =?us-ascii?q?BaTvzjNXSM7NdrvaPFXEVjPw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 30 Dec 2025 10:33:14 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 991D318130; Tue, 30 Dec 2025 10:33:13 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 30 Dec 2025 10:33:12 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Dec 30 10:33:13 2025 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.497443, queueID=B61001A31F X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19420 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of December 23 to 30, 2025. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Release of pacomb 1.4 Raven Dev Meetings Frontmatter_extractor.0.1 QCheck 0.90: The Great Renaming Other OCaml News Old CWN Release of pacomb 1.4 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Christophe Raffalli announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear camlers, I am pleased to announce the release of pacomb 1.4. Pacomb is a library + ppx to write grammars. It support: self extensible grammars, ambiguous grammars (with merge), late rejection of rule via raising exception from action code, priority and others. Is it relatively fast because it is compiled to efficient combinators. More details are available in the [git page] and the [documentation]. As teaser, the usual calculator example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 (* The three levels of priorities *) =E2=94=82 type p =3D Atom | Prod | Sum =E2=94=82=20 =E2=94=82 let%parser rec =E2=94=82 (* This includes each priority level in the next one *) =E2=94=82 expr p =3D Atom < Prod < Sum =E2=94=82 (* all other rules are selected by their priority l= evel *) =E2=94=82 ; (p=3DAtom) (x::FLOAT) =3D>= x =E2=94=82 ; (p=3DAtom) '(' (e::expr Sum) ')' =3D>= e =E2=94=82 ; (p=3DProd) (x::expr Prod) '*' (y::expr Atom) =3D>= x*.y =E2=94=82 ; (p=3DProd) (x::expr Prod) '/' (y::expr Atom) =3D>= x/.y =E2=94=82 ; (p=3DSum ) (x::expr Sum ) '+' (y::expr Prod) =3D>= x+.y =E2=94=82 ; (p=3DSum ) (x::expr Sum ) '-' (y::expr Prod) =3D>= x-.y =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here is a list of the main changes from 1.3: =E2=80=A2 Add a "not charset combinator" for regexp `\[!...\]', it is dis= tinct from `\[^...\]' as it parses nothing. =E2=80=A2 File was not closed by Grammar.parse_file in case of parse error =E2=80=A2 New Grammar.set_debug_merge to allow debugging ambiguous gramma= rs (report by Matthieu Lemerre) =E2=80=A2 Compatibility with latest ocaml and ppxlib =E2=80=A2 Travis action to check compilation =E2=80=A2 Various documentation fix Possible roadmap for future version: =E2=80=A2 1.5 : integrate a lexical entry for ocaml code with call back f= or specific {xxx| =E2=80=A6 |xxx}. This is code existing in simple_httpd= =E2=80=99s chaml parser (equivalent to php but in cocaml), that I wish to integrate in pacomb. =E2=80=A2 2.0 : rewrite the combinators with algebraic effects. The seman= tics will be much better than the current implementation using references. Cheers, Christophe [git page] [documentation] Raven Dev Meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Continuing this thread, Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We'll be skipping the dev meeting on the 29th for the holidays, so the next Raven dev meeting will be on *Monday, January 5, 2026, at 10:00 AM CET (2:30 PM IST)*. Link: Frontmatter_extractor.0.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi there! :waving_hand: I am writing again about my new library, which I must create, because there is simply no alternative available. [Frontmatter_extractor] is a small library that extracts the front matter section of a text file. It is commonly used in static content generators (blog engines, etc), such as those that convert Markdown files into HTML or other formats. *Example of usage* =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let some_text =3D {| =E2=94=82 --- =E2=94=82 title: "My First Blog Post" =E2=94=82 date: 2025-12-1 =E2=94=82 --- =E2=94=82=20 =E2=94=82 Hello! It's just some text... =E2=94=82 |};; =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Extract frontmatter as plain text. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Frontmatter_extractor.of_string some_text;; =E2=94=82=20 =E2=94=82 - : Frontmatter_extractor.extracted =3D =E2=94=82 {Frontmatter_extractor.matter =3D =E2=94=82 Some "\ntitle: \"My First Blog Post\"\ndate: 2025-12-1\n"; =E2=94=82 body =3D "\n\nHello! It's just some text...\n"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Extract the front matter as parsed YAML values. The yaml library needs to be installed. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # Frontmatter_extractor_yaml.of_string_exn some_text;; =E2=94=82=20 =E2=94=82 - : Frontmatter_extractor_yaml.extracted =3D =E2=94=82 {Frontmatter_extractor_yaml.attrs =3D =E2=94=82 Some =E2=94=82 (`O [("title", `String "My First Blog Post"); ("date", `Stri= ng "2025-12-1")]); =E2=94=82 body =3D "\n\nHello! It's just some text...\n"} =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 *P.S.* It's not fully tested, but it's usable as a first version. [Frontmatter_extractor] QCheck 0.90: The Great Renaming =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Jan Midtgaard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Version 0.91 of the QCheck packages is now available: This release adds [ocamlmig] annotations to most of the renamed combinators, in an attempt to ease migration for users. From my experiments so far, these work pretty well and allowed me to port [multicoretests] with little effort. Thanks to @raphael-proust for the suggestion and @v-gb for a nice tool! :folded_hands: Happy migration and testing! :smiley: [ocamlmig] [multicoretests] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [AoAH Day 25: Claude OCaml Marketplace for all your festive cod= ing needs] =E2=80=A2 [AoAH Day 24: Tuatara, an evolving Atom aggregator that mutates] =E2=80=A2 [AoAH Day 23: Unpac unifies git branching with package manageme= nt] =E2=80=A2 [AoAH Day 22: Assembling monorepos for agentic OCaml developmen= t] =E2=80=A2 [AoAH Day 21: Complete dynamic HTML5 validation in OCaml and the browser] [the ocaml.org blog] [AoAH Day 25: Claude OCaml Marketplace for all your festive coding needs] [AoAH Day 24: Tuatara, an evolving Atom aggregator that mutates] [AoAH Day 23: Unpac unifies git branching with package management] [AoAH Day 22: Assembling monorepos for agentic OCaml development] [AoAH Day 21: Complete dynamic HTML5 validation in OCaml and the browser] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 23 to 30, 20= 25.

    Release of pacomb 1.4

    Christophe Raffalli announced

    Dear camlers, I am pleased to announce the release of pacomb 1.4.=20

    Pacomb is a library + ppx to write grammars. It support: self extensible gr= ammars, ambiguous grammars (with merge), late rejection of rule via raising= exception from action code, priority and others. Is it relatively fast bec= ause it is compiled to efficient combinators. More details are available in= the git page and the documentation.

    As teaser, the usual calculator example:

    (* T=
    he three levels of priorities *)
    type p =3D Atom | Prod | Sum
    
    let%parser rec
         (* This includes each priority lev=
    el in the next oneexpr p =3D Atom < Prod &l=
    t; Sum
                (* <=
    span style=3D"color: #8f6f4a; font-style: italic;">all other rules are sele=
    cted by their priority level *)
                ; (p=3DAtom) (x::FLOAT)                        =3D> x
                ; (p=3DAtom) '(' (e::=
    expr Sum) ')'             =3D> e
                ; (p=3DProd) (x::expr Prod) '*' (y::expr Atom) =3D>=
     x*.y
                ; (p=3DProd) (x::expr Prod) '/' (y::expr Atom) =3D>=
     x/.y
                ; (p=3DSum ) (x::expr Sum ) '+' (y::expr Prod) =3D>=
     x+.y
                ; (p=3DSum ) (x::expr Sum ) '-' (y::expr Prod) =3D>=
     x-.y
    

    Here is a list of the main changes from 1.3:

    • Add a "not charset combinator" for regexp \[!...\], it is = distinct from \[^...\] as it parses nothing.
    • File was not closed by Grammar.parse_file in case of parse error
    • New Grammar.set_debug_merge to allow debugging ambiguous grammars (repo= rt by Matthieu Lemerre)
    • Compatibility with latest ocaml and ppxlib
    • Travis action to check compilation
    • Various documentation fix

    Possible roadmap for future version:

    • 1.5 : integrate a lexical entry for ocaml code with call back for speci= fic {xxx| =E2=80=A6 |xxx}. This is code existing in simple_httpd=E2=80=99s = chaml parser (equivalent to php but in cocaml), that I wish to integrate in= pacomb.
    • 2.0 : rewrite the combinators with algebraic effects. The semantics wil= l be much better than the current implementation using references.

    Cheers,

    Christophe

    Raven Dev Meetings

    Continuing this thread, Thibaut Mattio announced

    We'll be skipping the dev meeting on the 29th for the holidays, so the next= Raven dev meeting will be on Monday, January 5, 2026, at 10:00 AM CET (= 2:30 PM IST).

    Link: https://meet.google.= com/giw-bsdy-sjf

    Frontmatter_extractor.0.1

    Mikhail announced

    Hi there! :waving_hand:=20

    I am writing again about my new library, which I must create, because there= is simply no alternative available.

    Frontmatter_ext= ractor is a small library that extracts the front matter section of a = text file. It is commonly used in static content generators (blog engines, = etc), such as those that convert Markdown files into HTML or other formats.

    Example of usage

    let some_text =3D =
    {|
    ---
    title: "My First Blog Post"
    date: 2025-12-1
    ---
    
    Hello! It's just some text...
    |};;
    

    Extract frontmatter as plain text.

    # Frontmatter_extractor.of_string some_text;;
    
    - : Frontmatter_extracto=
    r.extracted =3D
    {Frontmatter_extractor.<=
    /span>matter =3D
      Some "\ntitle: \"My First Blog Post\"\ndate: 2025-12-1\n";
     body =3D "\n\nHello! It's just some text..=
    .\n"}
    

    Extract the front matter as parsed YAML values. The yaml library needs to b= e installed.

    # Frontmatter_extractor_yaml.of_string_exn some_text;;
    
    - : Frontmatter_extracto=
    r_yaml.extracted =3D
    {Frontmatter_extractor_y=
    aml.attrs =3D
      Some
       (`O [("title", `String "My First Blog Post"); ("date", `String =
    "2025-12-1")]);
     body =3D "\n\nHello! It's just some text..=
    .\n"}
    

    P.S.

    It's not fully tested, but it's usable as a first version.

    QCheck 0.90: The Great Renaming

    Continuing this thread, Jan Midtgaard announced

    Version 0.91 of the QCheck packages is now available:

    https://git= hub.com/c-cube/qcheck/releases/tag/v0.91

    This release adds ocamlmig= annotations to most of the renamed combinators, in an attempt to ease migr= ation for users. From my experiments so far, these work pretty well and all= owed me to port multicoretests with little effort. Thanks to @raphael-proust for the= suggestion and @v-gb for a nice tool! :folded_hands:=20

    Happy migration and testing! :smiley:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=eWYiVMft; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 415DD400A7 for ; Tue, 6 Jan 2026 13:15:08 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=Gwp1RJopFbAez7hyuN8/jzwW9qiiRkGn85tNfMl3VtU=; b=eWYiVMftnNnaj4nMfAEY7dwDl3SeFis6Oar65ZErtReffRML0ulGJV51 AfxXN42Lm17FXcAoaZWzKN0v838n5lVfS5CPq4n1stfuWDczgkO3Vfo2p fTU1JOPO1iJ/Jy7ybVnHqmItEmb98tc2h/sC2eda1c8gAP8xsLJaCmrF1 k=; X-CSE-ConnectionGUID: cjYzgBt6TwKqg6K5vs8Xkw== X-CSE-MsgGUID: d86hoZKwR0qHSzZ8pqIJrg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,204,1763420400"; d="scan'208,217";a="257214130" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 06 Jan 2026 14:15:05 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 01A4781D69; Tue, 6 Jan 2026 14:15:05 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id AB7D381D16 for ; Tue, 6 Jan 2026 14:14:57 +0100 (CET) X-CSE-ConnectionGUID: 37CTY7ayRhigZcyLtaMOrQ== X-CSE-MsgGUID: sU3dB3ERSdaPcngC7m9i7Q== IronPort-SDR: 695d0ad0_vsw8stQ8K/c5A30+yjq86YLVIPswQTINUoiPBEto7QUCtz0 PCwV7esz9PaXNUHndjOeTyRszNPZA3JfZEwHcSw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0G3BABDCl1pgSIeaIFaFggBAQsSDIISgTuBBBoBZgZfM?= =?us-ascii?q?wcISYRYg0+OJYEWknOGVlmBEIFpgUIbHQEDAQ0uARUKAQIEAQEDAQIBhQAYj?= =?us-ascii?q?FcCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABA?= =?us-ascii?q?T0FSYZPDUkBEAGBahk4cYElAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAgQIAYEnChMBATEHGCMDEAQHAwIEDQE1AxQBEhQGg?= =?us-ascii?q?mmCIAICTwMEAQwGk3ebTXqBMoEBggwBAQaBCFMBDgnaNYEaTAmBTYVugkobA?= =?us-ascii?q?SpJawEChEkJhDQnD4FVRIEVgnIHb4JKFwEBAQEYREgYAQEIRYMugmmCJnoUH?= =?us-ascii?q?YNYLC6GeAaJQ4FEIgMmMywBVRMXCwcFXoEIAyovLW4yHYEjPhc+YyEJBYJsi?= =?us-ascii?q?QYPiVqBFQMLbT03FBuQZ0MZIYIJDh8fAlcjExwIBgJYBRMLIBgBJg4VCC0Lk?= =?us-ascii?q?yQYKp10lGM0B4QfgV4GDIkIgSaLZoohhVulECKYZCKJXoEmCYJalWAgCIEyg?= =?us-ascii?q?36BfyOBXDMaMEOCMwEBMgkKPBwPjiEMFoNbA0F9gxo7vXtCNQIBATgCBwEKA?= =?us-ascii?q?QEDCYVFHQEBaYMJiEiBSwEB?= IronPort-PHdr: A9a23:cGXNfRPk9Ny6NqGO3dwl6naAAhdPi9zP1u491JMrhvp0f7i5+Ny6Z QqDvqkr1AeCBN2Dsa0MotGVmp6jcFRI2YyGvnEGfc4EfD4+ouJSsioeReWoMgnFFsPsdDEwB 89YVVVorDmROElRH9viNRWJ+iXhpTEdFQ/iOgVrO+/7BpDdj9it1+C15pbffxhEiCCybL58I xi6txndutUZjYd/Nqo91gXFr3lVcOlK2G1kIk6ekBn76sqs5pBo7j5eu+gm985OUKX6e7o3Q LlFBzk4MG47+dPmuwDbQQWA/nUTXXwanwRHDQbY9B31UYv/vSX8tupmxSmVJtb2QqwuWTSj9 KhkVhnlgzoaOjEj8WHXjstwjL9HoB+kuhdyzZLYbJ2TOfFjfq/TftUaRXRAXsZKVixOGYe8Y JUSBOsPOuZYtZTyp0ATphe6CwSgGObjxzlVjXH0wKI6yfwsHwHY0gI9EdwAs3vbo8nuOagIT ey41rPFwSnfY/5U3zr29YjGcgomofGJRb99bc7RxlMpFwjYk1uftYzlPzaU1uQRr2iQ8u1tW viri2E9rQF9uCOvydssionMh4IV1kzE+D5hwIYyId25SFJ7bsC4H5tQsSGaNpJ2Qt48TG1yv yY60LIGtIe9cSMXx5sp2wTRZOabc4iU/B3jTuCRLC94in54dryzmRi8/VSuxOD/VMS50VlHo yhbntTRuH0A2ADf58mHR/Vy40us1zeC2x3d5+xaLk45ibTXJ4Auz7IukJcYrErNHijzmErsj a+WcF0p+vC25OT7Y7XmuoGTN5dzigH7N6QhhNazAeImPQgSR2Sb/viz26fm/U39WrlKiec2k qbBvJ/AIcQbp7K2DBFJ3Yk57ha/Cy2q0NMCnXkINF5FdgiHgJb3NF7TPv/4FvS/g0irkDdz3 fzGOafhAprVInjAjbjheaxx5FNCxwot1dxf6JNUCq0BIPLuQUD9rsDXDhg8MwCszObnEtJ91 oAEVW2TBa+ZNbvevkOP5u0yPeaDf5EauCzyK/Q/4P7ul3A5lUcafaa1x5QXbXS4Eu58L0Wee 3rsjc8NEXwNvgUkVOzmkkGNUTldZ3a8Qa0z+Ck3CJ67DYfFXY+tnaaB3SehEp1RfGBGBUiAE Xbud4WeWvcDcjieIsF7kjAcW7ihUYgh1RS0uA/+zLpoMvDb+ikeuJn+19Z1//XemQws+TFwF ciRzn2BQm5ukm4GWzM6xq5yrENlxlqAz6R0mf1VGN1J6/9XXQo2KYTQwuNnB930RwnPZM2GS Ey8TdWjGTwxTsw+w9sJY0tlHtWjgQ3P0zCyA78Sk7yKBIA0/bzA0HjxIcZ9ym/G1LQ/gFU8R ctPL2KmirZ+9wjVGYHJj12Um7u0eakYxiLB6XuPwGWUsExWTAJ8S6vIUH8HakvTt9v550fCT 7G0CbQgNwtM0dOMJLdXZNH1lVhJWPftNtXeYm+pmWq+Aw6FxquLbIrue2QdwDvSB1QEkwAV/ HaGLBU+CTm7r2LZFjxuGkribFno8eZkrnO3VFQ0wB2Kb01k1rq15gIViOeHRPMUw7IEvjsup CtvHFqn2tLbBNWBqxBmfKVGbtMx+E1H2n7BtwxhIpygKLhviUIEfARyu0PizhF3CoRbkcg2t 34q1wpzKaeA0FxbbT+Y3JbwOqfWKmbo5hyvZbTW1knY0NmN4qgP8ug3q03/vAG1EUov62hr3 8Fa03SC4ZXEDxAcXIrxXEgr7xR6va/VYjc+6Y3OzXBsNKa1viLY19IxA+slzhahf8tBP6yYF A/yFcwaB9GzKOM0gVSpaQgEPO9K+KEpPMOmdv6G1bazMuhvkj2ok3hJ7Zx73E6U6iV8T/TH3 4wZzPyAxgWJTi/ygli5vsDsgYBEaykfEHCjxCb5GYBdfrZyfZ4FCWi2I8242NF+h5n1VnBC6 FOtGk4Ii4eVfk/Ya0P7l0UE0VsRiXi4n22+wiAi13kip6+bmSjP2PjKdRwdO2cNSnMxo03rJ N2di9kcFHOjbw0oiAftsU/+zq4dv69/KmjPXW9QeCznM2xpUq2xr6ePJclV58V74m1sTO2gb AXCGfbGqBwA3na4RwO2pRg+fjCu4NDimgBizXiaJzB1pWbYfsd5wVHe4sbdTLhfxGlOXzF23 B/QAFX0JNy15ZOMjZ6Wu+S3USS6XZ1WcDX35ZuHsDqn6GZqBxymgv31ncfoQkAhySGu79BxT m3TqQrkJIzi1qC0K+ViK3JSPwep4ORVC9Qhtt4og5UBxXURhpOU5GcK12DpPoBS3av4KmEGR TsK38L96g/43kZuNTSMm5K/UW+SkYN6f9fvWmoNwWom6txSTqeZ6LsRhSxuvl+xth7ce9B4j m5b0fwq+WIXiOEPuRMww2OaGL968VBwGyvqmlzI6tm/qP8Sf2Ozaf2q00E4m9m9DbaEqwUaW XDje55kEzUipsN4eEnB1nH+8OSGMJHZcM4TuxuIkhzBk/kdKZQ/keAPjDZmPmS1tGMsyuoyh xhjlZ+gu43PJ2Jo9aO/ShlWU1+9L8oX8zerlq1em8eKw6i3GZFwBjgAXJ3pVO+lVjUIurWvN gqDFiE9tmbOAaDWTmr9oA9tq3PCFYzuNmnCfSNIi4w6GF/GfAoE3FNxPn1yhJMyGwG0yda0d U544mpU/Vvksl5WzekuMRDjU2DZrQPuazEuSZHZIgAFi2MKr0rTL8Ga6fp+Wi9C+Zj05je3E TTObCpnHDRWfhmcAFTyIrSl5d/B6vWVQO2kIK7HZbyI7/dVV/KJ2Y6H2Ix7+T2BLYOKYmkkC Oc0kBkmPzgxC4HCljMDRjZC3SvJZsjdvxy8/yxrsuin9/D6RA/k5Y2OEqZfd9J19Frl5MXLf /7VjyF/JzFC05oKznKd07kT0mkZjCR2fiWsG7AN3cLUZJrZgbQfTxsSaicpcdBN87p5xA5Gf 8jSltLy0Ld8yP8zEVZME1L7yImlYskDImf1M12iZg7DD469fWjA7e7mNPyYHKVXiPRIuhawv zeCDkKlOS6MwjDtXhbpKupMiSCHIDRUv5y7eRt2T22/XJThcBLeUpc/gTAtwLIyj2/HLiZFa 2k6KhsR6ObIq3gEyvxkU3RM9H9kMfWJl26C4u/UJ4xX1JkjSiV4muRG4Wgrnr5c7SVKXvtwy 2PZqt9jpU3jk/Hak2A2FkMW9nAQ3MTQ4RYHW+2R7JRLVHfa8QhY6GyRD05PvN55Epj1vKsWz NHTlaX1ITME8tTO/MJaCdKHTaDPeHcnLxftHybZSQUfSjv+f1rlvBQIm9+95yjKis0irZz9h JcFSrlaTUE4UPQABRFsGNUEZox8XjYljaKzhskV43Gzt1/UGNUcuYrIHKH3Y72nOHOCgL9Ia gFdi4jCFtxGPaPUyhk9Tgxim4DbB0fbXdZMuzBsKAgurxBE9HF4CHY420fkdh+F6ngOE/W5h Vgz1hs4Zv4ivmSJgR9/Nh/Boy0+l1M0kNPujGWKcTL/G6y3WJlfFyv+s0VieoO+WQt+ahe+2 FB1LDqRDawElKNuLCo47W2U8YsKA/NXSrdIJQMd1e3CLet9ykxS823kxFcbt7KfWN07zFdsK sbq9C4ImAN7MIxsf/2WffIViAMIwPnT203gnqMw2FNMdh9LqTnLPnBS/hVQafFlJjL2rLY0s VXQx2JPIDoFBaUjr684pB0xZLTSlHmFsfYLaUGpab7Fd/vA6TSZmZbaGwFhik8FxRsapuZ6g 5h/LBLcEkkryPH5+w0hDcPZMkkVasNT8CKWZiOSqaDXxpkzOYyhF+fuROvItaAOg0viEhx7V 4gL680AGNGr3iS6ZY//K6UZzBw2+AnxDFCVVbJRfxaajDoMo8e+1YJ6m45HKXkRDH58PiO++ rvM7lZw0bzaBItwOS9cBddMP2lTOoXygyNDunVcEDS7mvkUzgSP9X60pyjdCiX9c8s2ZPqQY kAkA9W39DMjtqmu3AeNo9OHfz28bowk4YOcjIFS74yKAP5VU7Rn5kLVmo0CAmevT3aKC9m+Y Z75d4gra9XwTHe8SF22zTwvHKKTdJ6gKLaFhQbwSMNaqo6eiXoYD/TlQzowNAYl+MVW/KV4d BEOaJo9YAf1ukI5LaPqKQOR1JO1SGaoKCdKZ/NY0OOxaqcRynY8KOigxzFzK/Nyh/ny6kMLS JwQ21vGwu2/YoBFTSXpMnlNIkPXoi4oi2VqNuAz2/oyhhTSvhNPVlLDPPwsY2tCsdYmAFqUK ngjEWs0SWiXio/b6xKt1bQfrGNN2sxZ2upfvD3ir4fSNXiyDbezp8yf4E9CJZA25rd8Oov5L o6auYPCy3bBGYLIvFTNWWb/Hv5e0LC4zwpSR+ROkmw+f8laqcxG80VjD6/WwpRXD609ur2ha TxlFDMfiygDWNHYtNTjquKsgv3CkROBbJkpMBoFqYhPxNwHXHwvCh4= IronPort-Data: A9a23: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 XcdHQh5fa1wdaI9/QuMtZKY9NH1cQ4DFwkVUBo= IronPort-HdrOrdr: A9a23:5mS4Kq8HaAI7Vl+nH0xuk+DnI+orL9Y04lQ7vn2ZKCYlEPBw8v rF8cjzuiWUtN98Yh0dcLO7Scq9qBHnlaKdiLN5VdyftWLd1ldAQrsM0aLShxXeXwf++uRe2a oISdkaNPTASX5gg4Lf6Am8euxQp+VvHZrY4dvj8w== X-Talos-CUID: 9a23:cPU/dmE5S2OJFNIqqmI8q2UoK58sY0fdzXjiKF6cFW9Mb6esHAo= X-Talos-MUID: 9a23:V4Il7wuyubIcC7MlXc2nnww5OO0zzp6VBEk1mpMJkJaBZC0vAmLI X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,204,1763420400"; d="scan'208,217";a="257214013" X-MGA-submission: =?us-ascii?q?MDHBp5l/wK2poseNL38YlzntCefU6+f7PHxijG?= =?us-ascii?q?e4DWxrX5R1NJmMUG+VmuwuyhA7A6AsPjQViUzjIXbwngVlxX+JYkj5Es?= =?us-ascii?q?Tf6J6IK1szUMiyAjXH/ono+jqYn7aodS3dk2qeLW35tLmQvnSN+MUUwZ?= =?us-ascii?q?Ty1eyJa3HOBgtD7ZZlGAnMWQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jan 2026 14:14:57 +0100 Received: from TM.local (unknown [82.66.240.41]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 3325818141; Tue, 6 Jan 2026 14:14:56 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 06 Jan 2026 14:14:55 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 6 14:14:56 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.470348, queueID=4F8D218146 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19423 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRGVjZW1iZXIgMzAsIDIwMjUNCnRvIEphbnVhcnkgMDYsIDIwMjYuDQoNClRhYmxlIG9m IENvbnRlbnRzDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KQW5ub3VuY2luZyB0aGUgZmlyc3QgcmVsZWFzZSBvZiBBbGljZSwgYSByYWRpY2Fs IE9DYW1sIGJ1aWxkIHN5c3RlbQ0KT0NhbWwvb3BhbSBwYWNrYWdlIG1hbmFnZXIgc3VwcG9ydCBm b3IgRGVwZW5kYWJvdCAtIEkgbmVlZCB5b3VyIGhlbHANCnNoYWt1aGFjaGkgMC4xLjAgLSBBIG11 c2ljIGNvbGxlY3Rpb24gbWFuYWdlcg0KLm1seCBzeW50YXggZGlhbGVjdA0Kb2NhbWwtcG9zaXgg cmVsZWFzZSA0LjAuMA0KT3RoZXIgT0NhbWwgTmV3cw0KT2xkIENXTg0KDQoNCkFubm91bmNpbmcg dGhlIGZpcnN0IHJlbGVhc2Ugb2YgQWxpY2UsIGEgcmFkaWNhbCBPQ2FtbCBidWlsZCBzeXN0ZW0N CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5ub3VuY2luZy10aGUtZmlyc3QtcmVsZWFzZS1vZi1hbGlj ZS1hLXJhZGljYWwtb2NhbWwtYnVpbGQtc3lzdGVtLzE3NDcyLzIwPg0KDQoNCkNvbnRpbnVpbmcg dGhpcyB0aHJlYWQsIFN0ZXZlIFNoZXJyYXR0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgW0FsaWNlIHYwLjMuMF0gaXMgb3V0ISBUaGlzIGludHJvZHVjZXMg YSBicmVha2luZyBjaGFuZ2Ugd2hpY2ggaXMgdGhhdA0KICBBbGljZSBub3cgZm9sbG93cyB0aGUg W1hERyBCYXNlIERpcmVjdG9yeSBTcGVjXSBpbiBsaWV1IG9mIGNyZWF0aW5nIGENCiAgYH4vLmFs aWNlJyBkaXJlY3RvcnkuDQoNCiAgVG8gbWlncmF0ZSBmcm9tIGFuIG9sZGVyIHZlcnNpb246DQog IOKAoiBEZWxldGUgYH4vLmFsaWNlJy4NCiAg4oCiIElmIHlvdSBoYXZlIGEgYmxvY2sgaW4geW91 ciBzaGVsbCBjb25maWcgc3RhcnRpbmcgd2l0aCBgIyBCRUdJTg0KICAgIGNvbmZpZ3VyYXRpb24g ZnJvbSBBbGljZSBpbnN0YWxsZXInLCByZW1vdmUgdGhhdCBibG9jay4NCiAg4oCiIElmIHlvdSBp bnN0YWxsZWQgQWxpY2Ugd2l0aCB0aGUgaW5zdGFsbGF0aW9uIHNjcmlwdCB0aGVuIHJ1biB0aGUN CiAgICBzY3JpcHQgYWdhaW4gKGluc3RydWN0aW9ucyBbaGVyZV0pLg0KICDigKIgSWYgeW91IHVz ZWQgQWxpY2UgdG8gaW5zdGFsbCBPQ2FtbCB0b29scywgeW91J2xsIG5lZWQgdG8gcmVpbnN0YWxs DQogICAgdGhvc2UgdG9vbHMgKHJ1biBgYWxpY2UgdG9vbHMgaW5zdGFsbCcpLg0KICDigKIgSWYg eW91J3ZlIGNvbmZpZ3VyZWQgYSBjdXN0b20gc2FuZGJveCB0ZW1wbGF0ZSB3aXRoIFZpc3VhbCBT dHVkaW8NCiAgICBDb2RlIGZvciBhbnkgQWxpY2UgcHJvamVjdHMsIGNoYW5nZSB0aGUgdGVtcGxh dGUgYmFzZWQgb24gdGhlIG5ldw0KICAgIExTUCBpbnN0cnVjdGlvbnMgZm9yIFZpc3VhbCBTdHVk aW8gQ29kZSBbaGVyZV0uDQoNCiAgVG8gZW5hYmxlIGJhc2gvenNoIGNvbXBsZXRpb25zIGZvciBB bGljZSwgc291cmNlIHRoZSBhcHByb3ByaWF0ZSBmaWxlDQogIGZyb20gYH4vLmxvY2FsL3NoYXJl L2FsaWNlL2VudicuDQoNCg0KW0FsaWNlIHYwLjMuMF0gPGh0dHBzOi8vd3d3LmFsaWNlY2FtbC5v cmcvYmxvZy9hbGljZS12MC0zLTAvPg0KDQpbWERHIEJhc2UgRGlyZWN0b3J5IFNwZWNdDQo8aHR0 cHM6Ly9zcGVjaWZpY2F0aW9ucy5mcmVlZGVza3RvcC5vcmcvYmFzZWRpci9sYXRlc3QvPg0KDQpb aGVyZV0gPGh0dHBzOi8vd3d3LmFsaWNlY2FtbC5vcmcvaW5zdGFsbD4NCg0KW2hlcmVdIDxodHRw czovL3d3dy5hbGljZWNhbWwub3JnL2xzcC8jdmlzdWFsLXN0dWRpby1jb2RlPg0KDQoNClN0ZXZl IFNoZXJyYXR0IGxhdGVyIGFkZGVkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbQWxpY2Ug djAuNC4wXSBpcyBvdXQuIFRoZSBtYWluIGNoYW5nZSBpcyB0aGF0IHBhY2thZ2UgbWFuaWZlc3Rz IG5vdw0KICB1c2UgW0tETF0gaW5zdGVhZCBvZiBUT01MLiBTZWUgW3RoaXMgcG9zdF0gZm9yIHRo ZSBtb3RpdmF0aW9uIGZvciB0aGlzDQogIGNoYW5nZS4gVGhlcmUncyBhIG1pZ3JhdGlvbiBndWlk ZSBbaGVyZV0uDQoNCg0KW0FsaWNlIHYwLjQuMF0gPGh0dHBzOi8vd3d3LmFsaWNlY2FtbC5vcmcv YmxvZy9hbGljZS12MC00LTAvPg0KDQpbS0RMXSA8aHR0cHM6Ly9rZGwuZGV2Lz4NCg0KW3RoaXMg cG9zdF0gPGh0dHBzOi8vd3d3LmFsaWNlY2FtbC5vcmcvYmxvZy9zd2l0Y2hpbmctbWFuaWZlc3Rz LXRvLWtkbC8+DQoNCltoZXJlXQ0KPGh0dHBzOi8vd3d3LmFsaWNlY2FtbC5vcmcvYmxvZy9hbGlj ZS12MC00LTAvI21pZ3JhdGluZy1mcm9tLWVhcmxpZXItdmVyc2lvbnM+DQoNCg0KT0NhbWwvb3Bh bSBwYWNrYWdlIG1hbmFnZXIgc3VwcG9ydCBmb3IgRGVwZW5kYWJvdCAtIEkgbmVlZCB5b3VyIGhl bHANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtb3BhbS1wYWNrYWdlLW1hbmFnZXItc3Vw cG9ydC1mb3ItZGVwZW5kYWJvdC1pLW5lZWQteW91ci1oZWxwLzE3NjU2LzE+DQoNCg0KSmFrdWIg UG9sYWsgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbyBPQ2FtbCBjb21tdW5pdHkhIPCfmIoN Cg0KICBMZXQncyBraWNrIG9mZiB0aGUgbmV3IHllYXIgd2l0aCBzb21ldGhpbmcgZXhjaXRpbmch IEkganVzdCBjcmVhdGVkIGENCiAgUHVsbCBSZXF1ZXN0IHRvIGRlcGVuZGFib3QtY29yZSB0aGF0 IGFkZHMgc3VwcG9ydCBmb3IgT3BhbSBpbg0KICBPQ2FtbC4gVGhpcyBjb3VsZCBiZSBzdXBlciB1 c2VmdWwgZm9yIGFsbCBvZiB1cyB1c2luZyB0aGlzIGVjb3N5c3RlbQ0KICBpbiBvdXIgcHJvamVj dHMhDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9kZXBlbmRhYm90L2RlcGVuZGFib3QtY29yZS9w dWxsLzEzODc3Pg0KDQogIEJ1dCB0aGUgRGVwZW5kYWJvdCBtYWludGFpbmVycyBlbXBoYXNpemVk IHRoYXQgbWFpbnRhaW5pbmcgbmV3DQogIGVjb3N5c3RlbXMgcmVxdWlyZXMgY29tbXVuaXR5IHN1 cHBvcnQgKGNoZWNrIHRoZWlyIGNvbW1lbnQgaGVyZToNCiAgW2h0dHBzOi8vZ2l0aHViLmNvbS9k ZXBlbmRhYm90L2RlcGVuZGFib3QtY29yZS9wdWxsLzEzNzExI2lzc3VlY29tbWVudC0zNjU5ODk5 MzIxXSkuIFRoZXkNCiAgYWxyZWFkeSBoYXZlIDMgY29tbXVuaXR5LW1haW50YWluZWQgZWNvc3lz dGVtcyBhbmQgd2FudCBtb3JlLCBidXQgb25seQ0KICBpZiB0aGUgY29tbXVuaXR5IGhlbHBzIHdp dGggbG9uZy10ZXJtIHVwZGF0ZXIgc3VwcG9ydC4NCg0KICBUaGV5IHdpbGwgYmUgbG9va2luZyBm b3Igdm9sdW50ZWVycyB0byBoZWxwIG1haW50YWluIHRoaXMg4oCTIGluDQogIHRlc3RpbmcsIGZp eGVzLCBvciBvbmdvaW5nIG1haW50ZW5hbmNlLiBXZSBjYW4gcHVzaCB0aGlzIHRvZ2V0aGVyIGlm DQogIHlvdSByZWFsbHkgd2FudCBpdC4NCg0KICBXaGF0IGRvIHlvdSB0aGluaz8NCg0KDQpbaHR0 cHM6Ly9naXRodWIuY29tL2RlcGVuZGFib3QvZGVwZW5kYWJvdC1jb3JlL3B1bGwvMTM3MTEjaXNz dWVjb21tZW50LTM2NTk4OTkzMjFdDQo8aHR0cHM6Ly9naXRodWIuY29tL2RlcGVuZGFib3QvZGVw ZW5kYWJvdC1jb3JlL3B1bGwvMTM3MTE/cmVmZXJyZXI9Z3Jvay5jb20jaXNzdWVjb21tZW50LTM2 NTk4OTkzMjE+DQoNCg0Kc2hha3VoYWNoaSAwLjEuMCAtIEEgbXVzaWMgY29sbGVjdGlvbiBtYW5h Z2VyDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1zaGFrdWhhY2hpLTAtMS0wLWEtbXVzaWMtY29sbGVjdGlvbi1t YW5hZ2VyLzE3NjU5LzE+DQoNCg0KRXJ1RXJpIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBhbGwsDQoNCiAgSSBodW1i bHkgYW5ub3VuY2Ugc2hha3VoYWNoaSBgMC4xLjBgLg0KDQogIFNoYWt1aGFjaGkgaXMgYSBtdXNp YyBjb2xsZWN0aW9uIG1hbmFnZXIuIEl0IGFpbXMgdG8gYmUgYSByYXRoZXINCiAgc2ltcGxlIGNv bGxlY3Rpb24gbWFuYWdlciBleHRlbnNpYmxlIGJ5IHBsdWdpbnMuIEl0IG9yZ2FuaXplcyBtdXNp Y3MNCiAgaW50byBhbiBhcnRpc3QvYWxidW0gZGlyZWN0b3J5IHN0cnVjdHVyZSwgY2FuIGhhbmRs ZSBtdWx0aXBsZQ0KICBjb2xsZWN0aW9ucyBhbmQgcHJvdmlkZXMgYSBtZWNoYW5pc20gc2ltaWxh ciB0byBgR2l0SHViIC0NCiAgYmVldGJveC9iZWV0JyBmb3IgcXVlcnlpbmcgYSBjb2xsZWN0aW9u LiAgU2hha3VoYWNoaSBhbHNvIGV4cG9zZXMgc29tZQ0KICBvZiBpdHMgaW50ZXJuYWxzIHdoaWNo IGFsbG93cyB0byBob29rIGl0IGluc2lkZSBvdGhlciBhcHBsaWNhdGlvbnMuDQoNCiAgWW91IGNh biB2aXNpdCB0aGUgc291cmNlIGNvZGUgYXQgW2NvZGViZXJnIC0gZXJ1ZXJpL3NoYWt1aGFjaGld Lg0KDQogIFlvdSBjYW4gYWxzbyBzZWUgYW4gZXhhbXBsZSBvZiBpbnRlZ3JhdGluZyBzaGFrdWhh Y2hpIGluc2lkZSBhIEMrKw0KICBtdXNpYyBwbGF5ZXIgW2NvZGViZXJnIC0gZXJ1ZXJpL2F1ZGFj aW91cy1za2hjLXBsdWdpbl0uDQoNCiAgU2luY2VyZWx5IHlvdXJzLg0KDQoNCltjb2RlYmVyZyAt IGVydWVyaS9zaGFrdWhhY2hpXSA8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvRXJ1RXJpL3NoYWt1aGFj aGk+DQoNCltjb2RlYmVyZyAtIGVydWVyaS9hdWRhY2lvdXMtc2toYy1wbHVnaW5dDQo8aHR0cHM6 Ly9jb2RlYmVyZy5vcmcvRXJ1RXJpL2F1ZGFjaW91cy1za2hjLXBsdWdpbj4NCg0KDQpDaHJpc3Rp YW4gTGluZGlnIGxhdGVyIHNhaWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIOKAoiA8 aHR0cHM6Ly9naXRodWIuY29tL3Jvc3NiZXJnL2NhbXA+DQoNCiAgVGhpcyBpcyBhbiBNUDMgcGxh eWVyIHRoYXQgY2xhaW1zIHRvIGhhdmUgZ29vZCBsaWJyYXJ5IG1hbmFnZW1lbnQgLQ0KICBtYXli ZSB3b3J0aCBhIGNvbXBhcmlzb24uDQoNCg0KLm1seCBzeW50YXggZGlhbGVjdA0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbWx4LXN5bnRheC1kaWFsZWN0 LzE1MDM1LzIyPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIEFuZHJleSBQb3BwIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgU29tZSB1cGRhdGVzIGZyb20gLm1seCB0 ZWFtIChAZGF2ZXNueCBhbmQgbWUpOg0KDQogIOKAoiBtbHggMC4xMSBpcyByZWxlYXNlZCwgT0Nh bWwgNS40IHN1cHBvcnQgKyBzb21lIGxleGVyIGltcHJvdmVtZW50cw0KICDigKIgb2NhbWxmb3Jt YXQtbWx4IDAuMjguMSBpcyByZWxlYXNlZCwgT0NhbWwgNS40IHN1cHBvcnQgKyBmb3JtYXR0aW5n DQogICAgaW1wcm92ZW1lbnRzDQogIOKAoiBvY2FtbC1sc3Atc2VydmVyIGFuZCB2c2NvZGXigJlz IE9DYW1sIFBsYXRmb3JtIGV4dGVuc2lvbiBub3cgaGF2ZQ0KICAgIGZpcnN0IGNsYXNzIHN1cHBv cnQgZm9yIC5tbHgNCg0KDQpvY2FtbC1wb3NpeCByZWxlYXNlIDQuMC4wDQrilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1v Y2FtbC1wb3NpeC1yZWxlYXNlLTQtMC0wLzE3NjcwLzE+DQoNCg0KUm9tYWluIEJlYXV4aXMgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSB0aGVyZSENCg0KICBJ4oCZbSBoYXBweSB0 byByZXBvcnQgdGhlIHJlbGVhc2Ugb2YgYG9jYW1sLXBvc2l4JyB2ZXJzaW9uIGA0LjAuMCc6DQog IDxodHRwczovL2dpdGh1Yi5jb20vc2F2b25ldC9vY2FtbC1wb3NpeD4NCg0KICBUaGlzIGNvbGxl Y3Rpb24gb2YgbW9kdWxlcyB3YXMgc3RhcnRlZCBzb21lIHRpbWUgYWdvIHdpdGggdGhlIGdvYWwg b2YNCiAgY2VudHJhbGl6aW5nIGFuZCBub3JtYWxpemluZyB0aGUgcGF0dGVybnMgZm9yIGJpbmRp bmcgY29uc3RhbnRzLCB0eXBlcw0KICAoaW5jbHVkaW5nIEMgYHN0dWN0JyApIGFuZCBmdW5jdGlv bnMgZnJvbSB0aGUgUE9TSVggc3RhbmRhcmQgdXNpbmcNCiAgYGN0eXBlcycuDQoNCiAgVGhlIGdv YWwgaXMgdG8gb2ZmZXI6DQoNCiAg4oCiIEEgY29tbW9uIHNldCBvZiB0b29scyBhbmQgcHJhY3Rp Y2VzIGZvciBzdHJ1Y3R1cmluZyBhbmQgYmluZGluZw0KICAgIHVzaW5nIGBjdHlwZXMnLg0KICDi gKIgQVBJcyBhbmQgbW9kdWxlcyBzdWl0YWJsZSBmb3IgbG93LWxldmVsIGBjdHlwZXMnIHVzZS4N CiAg4oCiIEhpZ2ggbGV2ZWwgQVBJcyBhbmQgbW9kdWxlcyBzdWl0YWJsZSBmb3IgZGlyZWN0IE9D YW1sIHVzZS4NCiAg4oCiIE11bHRpIHBsYXRmb3JtIGNvbXBhdGliaWxpdHk6IGAqQlNEJywgYGxp bnV4JywgYG1hY29zJyBhbmQNCiAgICB+d2luZG93c353aGVuIGF2YWlsYWJsZS4NCiAg4oCiIENy b3NzLXBsYXRmb3JtIGNvbXBpbGF0aW9uIHVzaW5nIGBkdW5lJydzIGF3ZXNvbWUgY3Jvc3MtY29t cGlsYXRpb24NCiAgICBzdXBwb3J0IHdoZW4gYXBwbGljYWJsZSAoY3VycmVudGx5IG9ubHkgYHBv c2l4LWVycm5vfmFuZA0KICAgIH5wb3NpeC1zb2NrZXQnKQ0KDQogIFdpdGggdGhpcyByZWxlYXNl LCA0IG5ldyBtb2R1bGVzIGhhdmUgYmVlbiBhZGRlZDoNCg0KICDigKIgYHBvc2l4LWVycm5vJyB0 byBkZWFsIHdpdGggdW5peCBlcnJvciBudW1iZXJzLiBBbHRob3VnaCB0aGVyZSBhcmUNCiAgICBz b21lIGFsdGVybmF0aXZlcyBhbHJlYWR5IGV4aXN0aW5nLCB0aGlzIG9uZSBpcyBhIG1vcmUNCiAg ICBzdHJhaWdodC1mb3J3YXJkIGFuZCBtb2Rlcm4gaW1wbGVtZW50YXRpb24gdXNpbmcgYGR1bmUn IGZvciBidWlsZGluZw0KICAgIHdpdGggY3Jvc3MtY29tcGlsYXRpb24gYW5kIG11bHRpLXBsYXRm b3JtIHN1cHBvcnQuDQogIOKAoiBgcG9zaXgtc3RhdCcsIGBwb3NpeC1yZXNvdXJjZScgYW5kIHRo ZSBleHRlbnNpdmUgYHBvc2l4LXVuaXN0ZCcuDQoNCiAgSG9wZWZ1bGx5IHRoZXNlIG1vZHVsZXMg Y2FuIGJlIHVzZWZ1bCB0byBtb3JlIGRldmVsb3BlcnMgYW5kIHByb3ZpZGUgYQ0KICBjb21tb24g cGxhdGZvcm0gZm9yIGludGVyZmFjaW5nIE9DYW1sIHByb2dyYW1zIHdpdGggc3lzdGVtIGNhbGxz IGluIGENCiAgcG9ydGFibGUgYW5kIGV4dGVuc2libGUgd2F5IQ0KDQoNCkZBUToNCuKVjOKVjOKV jOKVjA0KDQogIOKAoiBXaHkgaXMgdGhpcyBub3QgdXNpbmcgYGR1bmUnJ3MgZGlyZWN0IHN1cHBv cnQgZm9yIGBjdHlwZXMnPw0KDQogIENyb3NzLWNvbXBpbGF0aW9uIHN1cHBvcnQgcmVxdWlyZXMg cnVubmluZyBiaW5hcnkgY29tcGlsZWQgZm9yIHRoZQ0KICB0YXJnZXQgKGUuZy4gYHdpbmRvd3Mn KSBvbiB0aGUgaG9zdCAoZS5nLiBgbGludXgnKSBpbiBvcmRlciB0byBleHRyYWN0DQogIHNwZWNp ZmljIGRhdGEgcG9pbnRzIHN1Y2ggYXMgQyBjb25zdGFudHMgdmFsdWVzIGFuZCBDIHN0cnVjdCBl bnRyaWVzDQogIG9mZnNldC4gQ3VycmVudGx5LCB0aGlzIGlzIG5vdCBzdXBwb3J0ZWQgdXNpbmcg YGR1bmUnJyBidWlsdGluDQogIGBjdHlwZXMnIHN1cHBvcnQuIEhvd2V2ZXIsIHN1cHBvcnQgZm9y IHRoaXMgaXMgW2JlaW5nIHdvcmtlZCBvbl0uDQoNCg0KW2JlaW5nIHdvcmtlZCBvbl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTMxMTI+DQoNCg0KT3RoZXIgT0NhbWwgTmV3 cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZy b20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBm cm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVnYXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9n XS4NCg0KICDigKIgW0kgQ2Fubm90IFNTSCBJbnRvIE15IFNlcnZlciBBbnltb3JlIChBbmQgVGhh dOKAmXMgRmluZSldDQogIOKAoiBbTXVsdGkgRG9tYWluIE9DYW1sIG9uIFJhc3BiZXJyeSBQaSBQ aWNvIDIgTWljcm9jb250cm9sbGVyXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJsb2ddIDxodHRwczov L29jYW1sLm9yZy9ibG9nLz4NCg0KW0kgQ2Fubm90IFNTSCBJbnRvIE15IFNlcnZlciBBbnltb3Jl IChBbmQgVGhhdOKAmXMgRmluZSldDQo8aHR0cHM6Ly9zb2FwLmNvZmZlZS9+bHRobXMvcG9zdHMv aS1jYW5ub3Qtc3NoLWludG8tbXktc2VydmVyLWFueW1vcmUuaHRtbD4NCg0KW011bHRpIERvbWFp biBPQ2FtbCBvbiBSYXNwYmVycnkgUGkgUGljbyAyIE1pY3JvY29udHJvbGxlcl0NCjxodHRwczov L3d3dy50dW5idXJ5Lm9yZy8yMDI1LzEyLzMxL29jYW1sLXBpY28vPg0KDQoNCk9sZCBDV04NCuKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91 IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBn byB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQog IGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2Vl ayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAg W0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2ht aXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0 aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczov L2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6 Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0g PGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of December 30, 2025 to = January 06, 2026.

    Announcing the first release of Alice, a radical OCaml build s= ystem

    Continuing this thread, Steve Sherratt announced

    Alice v0.3.0 i= s out! This introduces a breaking change which is that Alice now follows th= e XDG Ba= se Directory Spec in lieu of creating a ~/.alice directory.

    To migrate from an older version:

    • Delete ~/.alice.
    • If you have a block in your shell config starting with # BEGIN co= nfiguration from Alice installer, remove that block.
    • If you installed Alice with the installation script then run the script= again (instructions here= ).
    • If you used Alice to install OCaml tools, you'll need to reinstall thos= e tools (run alice tools install).
    • If you've configured a custom sandbox template with Visual Studio Code = for any Alice projects, change the template based on the new LSP instructio= ns for Visual Studio Code here.

    To enable bash/zsh completions for Alice, source the appropriate file from = ~/.local/share/alice/env.

    Steve Sherratt later added

    Alice v0.4.0 i= s out. The main change is that package manifests now use KDL instead of TOML. See this post for the motivation for th= is change. There's a migration guide here.

    OCaml/opam package manager support for Dependabot - I need you= r help

    Jakub Polak announced

    Hello OCaml community! =F0=9F=98=8A

    Let's kick off the new year with something exciting! I just created a Pull = Request to dependabot-core that adds support for Opam in OCaml. This could = be super useful for all of us using this ecosystem in our projects!

    https:= //github.com/dependabot/dependabot-core/pull/13877

    But the Dependabot maintainers emphasized that maintaining new ecosystems r= equires community support (check their comment here: https://github.com/dependabot/dependabot-core/pull/13711#is= suecomment-3659899321). They already have 3 community-maintained ecosys= tems and want more, but only if the community helps with long-term updater = support.

    They will be looking for volunteers to help maintain this =E2=80=93 in test= ing, fixes, or ongoing maintenance. We can push this together if you really= want it.

    What do you think?

    shakuhachi 0.1.0 - A music collection manager

    EruEri announced

    Dear all,

    I humbly announce shakuhachi `0.1.0`.

    Shakuhachi is a music collection manager. It aims to be a rather simple col= lection manager extensible by plugins. It organizes musics into an artist/a= lbum directory structure, can handle multiple collections and provides a me= chanism similar to GitHub - beetbox/beet for querying a collec= tion. Shakuhachi also exposes some of its internals which allows to hook i= t inside other applications.

    You can visit the source code at codeberg - erueri/shakuhachi.

    You can also see an example of integrating shakuhachi inside a C++ music pl= ayer codeberg= - erueri/audacious-skhc-plugin.

    Sincerely yours.

    Christian Lindig later said

    This is an MP3 player that claims to have good library management - maybe w= orth a comparison.

    .mlx syntax dialect

    Continuing this thread, Andrey Popp announced

    Some updates from .mlx team (@davesnx and me):=20

    • mlx 0.11 is released, OCaml 5.4 support + some lexer improvements
    • ocamlformat-mlx 0.28.1 is released, OCaml 5.4 support + formatting impr= ovements
    • ocaml-lsp-server and vscode=E2=80=99s OCaml Platform extension now have= first class support for .mlx

    ocaml-posix release 4.0.0

    Romain Beauxis announced

    Hi there!

    I=E2=80=99m happy to report the release of ocaml-posix version= 4.0.0: htt= ps://github.com/savonet/ocaml-posix

    This collection of modules was started some time ago with the goal of centr= alizing and normalizing the patterns for binding constants, types (includin= g C stuct ) and functions from the POSIX standard using = ctypes.

    The goal is to offer:

    • A common set of tools and practices for structuring and binding using <= code>ctypes.
    • APIs and modules suitable for low-level ctypes use.
    • High level APIs and modules suitable for direct OCaml use.
    • Multi platform compatibility: *BSD, linux, macos and ~windows~when available.
    • Cross-platform compilation using dune's awesome cross-comp= ilation support when applicable (currently only posix-errno~and ~posi= x-socket)

    With this release, 4 new modules have been added:

    • posix-errno to deal with unix error numbers. Although ther= e are some alternatives already existing, this one is a more straight-forwa= rd and modern implementation using dune for building with cros= s-compilation and multi-platform support.
    • posix-stat, posix-resource and the extensive = posix-unistd.

    Hopefully these modules can be useful to more developers and provide a comm= on platform for interfacing OCaml programs with system calls in a portable = and extensible way!

    FAQ:

    • Why is this not using dune's direct support for ctyp= es?

    Cross-compilation support requires running binary compiled for the target (= e.g. windows) on the host (e.g. linux) in order t= o extract specific data points such as C constants values and C struct entr= ies offset. Currently, this is not supported using dune' built= in ctypes support. However, support for this is being worked on.

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=R/Dwhrj3; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id E4AFB400A6 for ; Tue, 13 Jan 2026 08:27:38 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=IxoX8QWi2iB3ASQdTVt0SR2AYbs0/ZAnQb0IOiRwFBQ=; b=R/Dwhrj33+cYDqbRszWUJ5sNsIJZIYDdh0Wn8+NUYCL+cq4gkMf9HaSL 4pc4Gug9pmXitxQe0AxdzphCs8rQWCHfRNbujc9swx1d6nQPxNhkIy49+ pfX4c+5SWytfvRQlk/ji6U7OEupKh0XLAI8c4go2BfIMMhr9Yh9wxxEw+ w=; X-CSE-ConnectionGUID: 2LNp0p98SaKwI0o7mEk0Tg== X-CSE-MsgGUID: JZPBO3OcQsKuraAaAvbfhA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,222,1763420400"; d="scan'208,217";a="258264351" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 13 Jan 2026 09:27:36 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 4E39582B83; Tue, 13 Jan 2026 09:27:36 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 614F982B79 for ; Tue, 13 Jan 2026 09:27:24 +0100 (CET) X-CSE-ConnectionGUID: sSDcl1XmQjGb4pPOMN8APg== X-CSE-MsgGUID: uBDrs8JJQu2kBC/bAl3REA== IronPort-SDR: 696601eb_8ZrTOq2/VKOlibYm7tk2oXFFWIwGQums4lgh9/pykzUB8wp TqtkFvysn7lvJ9gTIW6dL19psOFZ6vUwLau86lQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0E0BgAPAWZpgSIeaIFahBZbKRoBbF8zBwhJA4QZPIFjg?= =?us-ascii?q?WyOJZFNgjyGVlmBEIFpgSwWBR4VAQMBDS4BGwQBAgQBAQMBAgGCDIE9gTcCj?= =?us-ascii?q?G0CHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABA?= =?us-ascii?q?T0FSYZPDYJFUVMeYQQDBgYBAQEBAQEBAQEBAQEBASIBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQEBAEMBx0STg4JBAYTA?= =?us-ascii?q?QEsDBgjAxAEAQYDAhEBNRcBEhQGgmmCIAICTwMEAQwGj3ebTXp/M4EBggwBA?= =?us-ascii?q?QaBCD4FDgIPL9oQgWYJFIE5hW6CShsBBSVJawEChEkJhDQnD4FVRIEVgnlvg?= =?us-ascii?q?koXAQEBAQEXgQwSBgEBTQmDJYJpghEVehQdijUGiUaBRCIDJjMsAVUTFwsHB?= =?us-ascii?q?V6BCAMqLy1uMh2BIz4XMlgbBwWBeIkDD4lFgTQDC209NxQbkBBCGRyBXisOC?= =?us-ascii?q?gE1KS4LJgUBEwgOAiACNgQKKwoFIgkCBAkKBCUaBQYLDR4PjyeDMxAVAyqPX?= =?us-ascii?q?KIObTQHhB+BXgYMiQiBJotmiiGEBIFXpRAimGQigjaHKF1JCYFva4h6jCoQJ?= =?us-ascii?q?QcChVaBRzgjSWIBHQMJBzMaMEMNBoJUCUYcD4tIgjeBVgEHgkQQMX2BJnp6O?= =?us-ascii?q?7oKQjUCAQEKLgIHAQoBAQMJhUUdAQGMBzOBSwEB?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 VUIqat4rI1XhKI//QuMu5KYJf3BgA7S8g== IronPort-HdrOrdr: A9a23:cLrpeK1VWJSwwI2jTvQTaQqjBKkkLtp133Aq2lEZdPUCSKKlfq eV7ZYmPH7P6Ar5N0tLpTntAsS9qBDnlKKdn7NhXotKNTOO0ACVxepZgbcKrQeOJxHD X-Talos-CUID: 9a23:ufa222DcmxQPtIL6EzJc2EUQQ/AgS3/yxivIG2idLzZAcLLAHA== X-Talos-MUID: 9a23:S16/wgZOSeJgEOBTqhXAnioyFuVR/v6tImtKm7wC4POpHHkl X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,222,1763420400"; d="scan'208,217";a="258264251" X-MGA-submission: =?us-ascii?q?MDEqBFzSyl92XNirq+SJtL2g/Mdul5jg9gv4Ak?= =?us-ascii?q?Z4cyVPyczAFqER5NHV7ycy1gW2Rzc+L7s63EEMAK/euLDytCvqKLzVUG?= =?us-ascii?q?4+xTehdNZmS8tlh+bAggTlqjvLbbZE+fjsPH8Ft10h0E8Ug2llgchXjJ?= =?us-ascii?q?P6XR/dka3tTXI3mLA/KEPeVA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 13 Jan 2026 09:27:23 +0100 Received: from TM.local (unknown [176.57.242.30]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id E665718143; Tue, 13 Jan 2026 09:27:22 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 13 Jan 2026 09:27:22 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 13 09:27:23 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.461990, queueID=229801A369 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19426 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 06 to 13, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 camlid: A library for building C stub generators restricted 1.1 - Restrict possible system operations and filesystem view of= your program OCaml Security Team 2025 End-Of-Year Report Lwt.6.0.0 release (direct-style, tracing) Other OCaml News Old CWN camlid: A library for building C stub generators =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Bobot announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear all, I'm happy to announce the first release of [camlid] ([documentation]). While there are many C stub generators for OCaml, **camlid** takes a different approach: it is an OCaml library designed to help you build custom C stub generators. *Key Comparisons*: =E2=80=A2 Vs. *Ctypes*: Manipulation of C structures stays in C. You don't need to replicate C type descriptions in OCaml, keeping the compilation and maintenance simple. =E2=80=A2 Vs. *Camlidl/SWIG*: The generator is written in pure OCaml. This makes it easier to factorize and customize your bindings without resorting to `m4', `sed', or complex external DSLs. *Highlighted Features*: =E2=80=A2 *Library-specific initialization*: Easily handle data structure setup. =E2=80=A2 *Native Optimization*: supports `unboxed~/~untagged' parameters= in native mode. =E2=80=A2 *Automated Definitions*: Automatically generates the C/OCaml definitions your generated code uses. Referencing a generated C function name in your generated OCaml code automatically triggers its generation in the C file. =E2=80=A2 *Free Variables*: Generated functions can contain free variables that are automatically added as formal parameters. This allows you to easily pass a global "context" or "handle" through a generic function without manual boilerplate. *Example Usage*: Using the built-in helpers, a generator is as simple as: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 open Camlid =E2=94=82 open Helper =E2=94=82=20 =E2=94=82 let () =3D Generate.to_file =E2=94=82 (* Indicates the basename used for the generated files *) =E2=94=82 "mylib" =E2=94=82 (* Indicates header to include *) =E2=94=82 ~headers:["alib.h"] =E2=94=82 [ =E2=94=82 func "f_input" [ input int_trunc]; =E2=94=82 func "f_output" [ output (ptr_ref int_trunc)]; =E2=94=82 func "f_with_res" [] ~result:int_trunc; =E2=94=82 func "f_no_arg_no_result" []; =E2=94=82 ] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Only the `mli' of the generated module remains to be written with the documentation. For the first function above, the parameter is correctly marked as `untagged' (for OCaml versions that support it): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 external f_input: (int [@untagged]) -> unit =3D "camlid_stub_f_= input_byte" "camlid_stub_f_input" =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 A more complex example (converting the `flint' binding from Ctypes) can be found [here]. The API is still experimental, and I would love to hear your feedback on the organization and naming! The package is already in the opam repository. (The [modern-ocaml] template is awesome!) [camlid] [documentation] [here] [modern-ocaml] restricted 1.1 - Restrict possible system operations and filesystem view of= your program =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: removewingman announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, I would like to announce a new package [restricted]. This library lets you limit which system operations and which parts of the filesystem your program can access. Call it as early as possible in your program so that the rest of the code runs with reduced privileges. Currently, actual enforced restrictions are implemented for these operating systems: =E2=80=A2 OpenBSD Even on other operating systems, you can still use `restricted' to document which privileges your program needs. Users can then test that your program respects these promises with tools such as [pledge on Linux]. Enjoy ;) =E2=80=A2 opam: =E2=80=A2 homepage: =E2=80=A2 Documented Interface and Examples: =E2=80=A2 License: [AGPL] This is my first ocaml library so feel free to give feedback. [restricted] [pledge on Linux] [AGPL] OCaml Security Team 2025 End-Of-Year Report =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 OCaml Security Team 2025 End-Of-Year Report =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C In May of 2025, the OCaml Software Foundation encouraged the formation of an OCaml Security Team, which would handle issues and provide guidance for improving software security in the OCaml ecosystem. Throughout 2025, the team has been building structure and procedures to accomplish these goals. A regular public update on the team's activity is among many good ideas taken from the Haskell Security Response Team, and we hope the community will find this first public update useful. The team consists of: =E2=80=A2 Hannes Mehnert - @hannesm - individual, robur.coop =E2=80=A2 Mindy Preston - @yomimono - individual =E2=80=A2 Joe - @cfcs - individual =E2=80=A2 Edwin T=C3=B6r=C3=B6k - @edwintorok - individual =E2=80=A2 Nicol=C3=A1s Ojeda B=C3=A4r - @nojb - LexiFi =E2=80=A2 Louis Roch=C3=A9 - @Khady - ahrefs =E2=80=A2 Boning Dong - Bloomberg Until December 2025: =E2=80=A2 Maxim Grankin - @maxim092001 - Bloomberg The newly created website [ocaml.org/security] gives some guidelines for people finding security issues. [ocaml.org/security] Contact and Disclosure Process =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The team established a procedure for reporting security issues as one of its first activities. The security disclosure process is available at . The OCaml Security Team can also be contacted at security@ocaml.org for matters besides vulnerability disclosure. Mails to security@ocaml.org are not public. The public, announce-only mailing list will broadcast information on security advisories. These procedures were [announced in July 2025]. [announced in July 2025] Vulnerability Database =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A public vulnerability database for OCaml software is another of the Security Team's goals. We indend to accomplish this by publishing information from the existing, but empty to the public [osv.dev] database (again borrowing a good idea from the Haskell SRT). Some work on a pipeline for publishing advisories there and backporting existing advisories is ongoing. [osv.dev] Tool development =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C An OCaml library that supports the [package URL] "purl" was developed and released to the opam-repository (, ). In the process, we propose to make the policy for opam-repository more strict to have immutable packages (where the source is not modified): . We also propose to integrate opam into the package URL specification . The vulnerability database mentioned above hosts advisories in markdown (with some opam-file-format metadata header). We developed [tooling] to convert these into json (following the json schema from osv.dev). We also made OCaml/opam known for the schema . [package URL] [tooling] Public Meetings and Presentations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C On September 15, Hannes Mehnert gave an introduction to the OCaml Security Team at [FUN OCaml] in Warsaw. Maxim Grankin gave a talk ["Towards a More Secure OCaml Ecosystem"] at the OCaml Users and Developers Workshop in October of 2025, which is available at . On October 22 2025, the Security Team held a public meeting, for which the notes are available at . [FUN OCaml] ["Towards a More Secure OCaml Ecosystem"] Advisories =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C A potential clickjacking issue with ocurrent's web interface was reported to the Security Team by Kunal Mhaske was fixed by Mark Elvers in . No other communications with the security team have resulted in publicly available remediation information or advisories. Future Plans =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C The Security Team has received a lot of interest in the advisory database mentioned above, and this work is a high priority for the team. The Security Team also hopes to publish security guides for OCaml programmers and project maintainers. The OCaml Software Foundation has indicated that some funding may be available for projects that make OCaml more secure. The Security Team is actively developing a process for soliciting and evaluating proposals, as discussed in the October public meeting. Acknowledgements =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The Security Team is an initiative of the OCaml Software Foundation and is grateful to the OCSF and its sponsors for their support. Lwt.6.0.0 release (direct-style, tracing) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Version 6.0.0 of Lwt has been [released] through opam! This new version of Lwt brings the following notable additions: =E2=80=A2 Lwt_direct: a package/library for using Lwt in direct-style. (Contribution from @c-cube) =E2=80=A2 Lwt_runtime_events: a package/library for emmitting runtime-eve= nts. Check the [release notes] for a full changelog), including removal of some deprecated values. [released] [release notes] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [OCaml Roundup: December 2025] =E2=80=A2 [Opam 104: Sharing Your Code] =E2=80=A2 [Devcontainer for using O(x)Caml and Claude in your projects] =E2=80=A2 [What would make OCaml serverless ready?] =E2=80=A2 [Fun with Algebraic Effects - from Toy Examples to Hardcaml Simulations] [the ocaml.org blog] [OCaml Roundup: December 2025] [Opam 104: Sharing Your Code] [Devcontainer for using O(x)Caml and Claude in your projects] [What would make OCaml serverless ready?] [Fun with Algebraic Effects - from Toy Examples to Hardcaml Simulations] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 06 to 13, 202= 6.

    camlid: A library for building C stub generators

    Fran=C3=A7ois Bobot announced

    Dear all,

    I'm happy to announce the first release of camlid (documentation).

    While there are many C stub generators for OCaml, camlid take= s a different approach: it is an OCaml library designed to help you build c= ustom C stub generators.

    Key Comparisons:

    • Vs. Ctypes: Manipulation of C structures stays in C. You don't n= eed to replicate C type descriptions in OCaml, keeping the compilation and = maintenance simple.
    • Vs. Camlidl/SWIG: The generator is written in pure OCaml. This m= akes it easier to factorize and customize your bindings without resorting t= o m4, sed, or complex external DSLs.

    Highlighted Features:

    • Library-specific initialization: Easily handle data structure se= tup.
    • Native Optimization: supports unboxed~/~untagged pa= rameters in native mode.
    • Automated Definitions: Automatically generates the C/OCaml defin= itions your generated code uses. Referencing a generated C function name in= your generated OCaml code automatically triggers its generation in the C f= ile.
    • Free Variables: Generated functions can contain free variables t= hat are automatically added as formal parameters. This allows you to easily= pass a global "context" or "handle" through a generic function without man= ual boilerplate.

    Example Usage: Using the built-in helpers, a generator is as simple = as:

    open C=
    amlid
    open Helper
    
     let () =3D Generate.to_file
        (* Indicates the basename used for =
    the generated files *)
        "mylib"
        (* Indicates header to include *)
        ~headers:["alib.h"]
      [
        func "f_input" [ input int_trunc=
    ];
        func "f_output" [ output (ptr_re=
    f int_trunc)];
        func "f_with_res" [] ~result:int_trunc;
        func "f_no_arg_no_result" [];
      ]
    

    Only the mli of the generated module remains to be written wit= h the documentation. For the first function above, the parameter is correct= ly marked as untagged (for OCaml versions that support it):

    external f_input: =
    (int [@untagged]) -> unit =3D "camlid_stub_f_input_byte" "camlid_stub_f_input"
    

    A more complex example (converting the flint binding from Ctyp= es) can be found = here.

    The API is still experimental, and I would love to hear your feedback on th= e organization and naming! The package is already in the opam repository.

    (The modern-ocaml te= mplate is awesome!)

    restricted 1.1 - Restrict possible system operations and files= ystem view of your program

    removewingman announced

    Hello,

    I would like to announce a new package restricted.

    This library lets you limit which system operations and which parts of the = filesystem your program can access. Call it as early as possible in your pr= ogram so that the rest of the code runs with reduced privileges. Currently,= actual enforced restrictions are implemented for these operating systems:

    • OpenBSD

    Even on other operating systems, you can still use restricted = to document which privileges your program needs. Users can then test that y= our program respects these promises with tools such as pledge on Linux. Enjoy ;)

    This is my first ocaml library so feel free to give feedback.

    OCaml Security Team 2025 End-Of-Year Report

    Hannes Mehnert announced

    OCaml Security Team 2025 End-Of-Year Report

    In May of 2025, the OCaml Software Foundation encouraged the formation of a= n OCaml Security Team, which would handle issues and provide guidance for i= mproving software security in the OCaml ecosystem. Throughout 2025, the tea= m has been building structure and procedures to accomplish these goals. A r= egular public update on the team's activity is among many good ideas taken = from the Haskell Security Response Team, and we hope the community will fin= d this first public update useful.

    The team consists of:

    • Hannes Mehnert - @hannesm - individual, robur.coop
    • Mindy Preston - @yomimono - individual
    • Joe - @cfcs - individual
    • Edwin T=C3=B6r=C3=B6k - @edwintorok - individual
    • Nicol=C3=A1s Ojeda B=C3=A4r - @nojb - LexiFi
    • Louis Roch=C3=A9 - @Khady - ahrefs
    • Boning Dong - Bloomberg

    Until December 2025:

    • Maxim Grankin - @maxim092001 - Bloomberg

    The newly created website ocaml.org/= security gives some guidelines for people finding security issues.

    Contact and Disclosure Process

    The team established a procedure for reporting security issues as one of it= s first activities. The security disclosure process is available at https://github.com/ocaml/security-advisories?tab=3Dre= adme-ov-file#reporting-vulnerabilities . The OCaml Security Team can al= so be contacted at security@ocaml.org for matters besides vulnerability dis= closure. Mails to security@ocaml.org are not public.

    The public, announce-only mailing list https://sympa.inria.fr/sympa/in= fo/ocsf-ocaml-security-announcements will broadcast information on secu= rity advisories.

    These procedures were announced in July 2025.

    Vulnerability Database

    A public vulnerability database for OCaml software is another of the Securi= ty Team's goals. We indend to accomplish this by publishing information fro= m the existing, but empty https://github.com/ocaml/security-advisories to the public osv.dev database (again borrowing a good idea f= rom the Haskell SRT). Some work on a pipeline for publishing advisories the= re and backporting existing advisories is ongoing.

    Tool development

    An OCaml library that supports the package URL "purl" was developed and released to the opam-= repository (https://github.com/= hannesm/purl, https://ocaml= .org/p/purl/latest). In the process, we propose to make the policy for = opam-repository more strict to have immutable packages (where the source is= not modified): https://github.com/ocaml/opam-repository/pull/29072. We also propo= se to integrate opam into the package URL specification https://github.com/package-url/p= url-spec/pull/763.

    The vulnerability database mentioned above hosts advisories in markdown (wi= th some opam-file-format metadata header). We developed tooling to convert these into json (foll= owing the json schema from osv.dev). We also made OCaml/opam known for the = schema https://gith= ub.com/ossf/osv-schema/pull/473.

    Public Meetings and Presentations

    On September 15, Hannes Mehnert gave an introduction to the OCaml Security = Team at FUN OCaml in Warsaw.

    Maxim Grankin gave a talk "To= wards a More Secure OCaml Ecosystem" at the OCaml Users and Developers = Workshop in October of 2025, which is available at https://www.youtube.com/watch?v=3DPekeGxG= lc3Q .

    On October 22 2025, the Security Team held a public meeting, for which the = notes are available at https://pad.data.coop/7-Ic5rG6ToynsW02hJsndg?both .

    Advisories

    A potential clickjacking issue with ocurrent's web interface was reported t= o the Security Team by Kunal Mhaske was fixed by Mark Elvers in https://github.com/ocurrent/= ocurrent/pull/465 .

    No other communications with the security team have resulted in publicly av= ailable remediation information or advisories.

    Future Plans

    The Security Team has received a lot of interest in the advisory database m= entioned above, and this work is a high priority for the team.

    The Security Team also hopes to publish security guides for OCaml programme= rs and project maintainers.

    The OCaml Software Foundation has indicated that some funding may be availa= ble for projects that make OCaml more secure. The Security Team is actively= developing a process for soliciting and evaluating proposals, as discussed= in the October public meeting.

    Acknowledgements

    The Security Team is an initiative of the OCaml Software Foundation and is = grateful to the OCSF and its sponsors for their support.

    Lwt.6.0.0 release (direct-style, tracing)

    Rapha=C3=ABl Proust announced

    Version 6.0.0 of Lwt has been released through opam! This new version of Lwt brings = the following notable additions:

    • Lwt_direct: a package/library for using Lwt in direct-style. (Contribut= ion from @c-cube)
    • Lwt_runtime_events: a package/library for emmitting runtime-events.

    Check the rel= ease notes for a full changelog), including removal of some deprecated = values.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=WPmRlt9L; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 9AEAA400A5 for ; Tue, 20 Jan 2026 09:19:26 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=SJlLOBVNJVQCtSGrBcIWB2d9wB15l/PLXRLbyjj2rpY=; b=WPmRlt9LkbIoN/vI/IwLFzPEOEf4YfgUFLAyMEgaeNfoj3MafHegHDJR hDtquUQxhyzoYDY+3hNtDzbAdXkibj4mbpSFL5jfpqRTg/u9AKoA5Gjdh AVAnWSfVc/+3Vg148OKJ+n+3GM/PLwvgzY2x7xij1IBTAqw1W4EgueKFi Q=; X-CSE-ConnectionGUID: GR2Lk/1VRA+tSpxSbOndeA== X-CSE-MsgGUID: 4bmjOzU3Q76uk/67popD+g== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,240,1763420400"; d="scan'208,217";a="259401338" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 20 Jan 2026 10:19:25 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 8750A839A3; Tue, 20 Jan 2026 10:19:24 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id D0BE5817E3 for ; Tue, 20 Jan 2026 10:19:15 +0100 (CET) X-CSE-ConnectionGUID: BWkze3k3RryaWdWcfg/q3w== X-CSE-MsgGUID: DUdD7RahT2i+NdJ8qdPJpA== IronPort-SDR: 696f4892_9z3ikwmUoA1ZjuiOleYT5U2ZWQQ/zKSQhQYdWpiEW18Dxlu lkhZTmGNKWlsLaf2QkQLRFdn1kc9Bb09TqlVxuA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HHBQAgSG9phSIeaIFahBZbKRoBbF8ZGgcISQOEGTyDT?= =?us-ascii?q?44lgRUBiH2HOop7gWmBLBYjFQEDAQ0uARsEAQIEAQEDAQIBggyCdAKMeQIfB?= =?us-ascii?q?gEENBMBAgQBAQEBAwIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBAQFAS?= =?us-ascii?q?YYVBwQvDYJFUVQdXgYBCAEGAS8BAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAgQEBAECCiQDKyQODgECBgoTAQEmEhgjAxAEA?= =?us-ascii?q?QYDAhEBNQMBEwESFAIDAYJoAYIgAgJPAwUMBpJfmnwaN3qBMoEBggwBAQaBC?= =?us-ascii?q?D4CAQEBDQMBDgkm2hCBSxwJFIE5hW6CShsBKklRGgEChCkgCYMVgR0CJw+BV?= =?us-ascii?q?USBFYIoSgUCb4JEBhcBAQEBAReBDBEEAwEBTQmDJYJpghEVehQddYEYAS4Dg?= =?us-ascii?q?UE1AYVZBoFIYyaHC4FEIgMmMywBVRMXCwcFXoEIAyovLW4yHYEjPhcyWBsHB?= =?us-ascii?q?YEiiQQPiTOBXwMLbT03FBuPb0IZHCuBNgUmDjgGAhUnJAIYBQkFAwUDCRYBA?= =?us-ascii?q?QUdLQEEBA4VEQUHAxkRCAQJBQUEARoQAxYGCQICCysChGONawwREwEDBhcNA?= =?us-ascii?q?nWaEYJsk3ZtNAeEH4FeBgyJCIEmkjCDV4QEgVeFQIV8hwKSUiKYZCKCNoYog?= =?us-ascii?q?QCBIQUJgW9rhSOBSnCOAwQBA4VQgX8jPA1iAR0MBzMaMEMNCoIcAQEBMQlGH?= =?us-ascii?q?A+JNoRCATQWgRIBAQiCQoEBPYEmgXQ7wwBCNQIBAQQGBSkCBwEKAQEDCYVFH?= =?us-ascii?q?QEBaYsdNIFLAQE?= IronPort-PHdr: A9a23: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 /k72UeE5gdxwWe/ZDZ95FIyxg== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:u7scr6O1X2WPYMBcTzj155DYdb4zR+YMi2TDiHoedfUFSKOlfp 6V8MjztSWE9Ar5lktQ7uxoWZPwDE80kKQFmfhrAV7MZniVhILFFvAW0WKm+UyoJ8SczJ8W6U 4DSdkJNDSYNzET56uKmTVUC+xQv6j4zEnrv5aX854Hd3AgV0gU1XY5Nu/tKDw5eOApP+tMKL OsouJaujudY3gNB/7LRUUtbqzonfGOvpTgZhINGh4g7yezrR7A0s+BLzGomj0lf3dq27kNzU jp+jaJm5lLtcvLuiP05iv2xdB9nsLwo+EzZ/Cku4wwAHHNjQiyaJ56H4CDuDxdmpDI1H8a1P 3n5zInOd020XPeeWmpvQDgsjOQtwoG2jvH4xuijX7qsaXCJA7S6fAx9r5xQ1/840okltB116 VG2njcn4ZLDFfhkU3Glr31fiAvskK1pFAimekVg3lEFbETb7JctqwTlXklcqvoZBiKp7zPR9 MeQP301bJtSmnyVQGYgoEErebGP0gbL1O9QEhHgcqfzyJK9UoJq3cw9Ygjn2wN/I8GQZFC4O jedptlj7xPRNJ+V9MNONs8 X-Talos-CUID: =?us-ascii?q?9a23=3AkRaSEmgiIT+xWzB1DHPmbTXPMzJuWELe3nqLIBS?= =?us-ascii?q?CE3dgd7GqQlGfv7o/jJ87?= X-Talos-MUID: =?us-ascii?q?9a23=3AqkQbpwyr6HfLf7uyfd8sRjCGeNiaqIiTBGxSq5w?= =?us-ascii?q?Gh5OFdgp8GWeEgAyVWqZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,240,1763420400"; d="scan'208,217";a="259401173" X-MGA-submission: =?us-ascii?q?MDGjf1NLaLuomX/k139A6eAA0EvIZHRq4/3eNf?= =?us-ascii?q?bXAjIZysRKkyZvYJ3dD1OZn1KPRUGhM7ec+eQRbUhjE+UoLPODETS7qn?= =?us-ascii?q?6M9loW4vuGcTGii1fgajxkj/0QJTEfKmWizjhSsjMfpvGm2d9xDo9lUq?= =?us-ascii?q?oPla780iBRU8cWEPgypn0G4Q=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 20 Jan 2026 10:19:14 +0100 Received: from TM.local (unknown [131.254.252.189]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 133A718143; Tue, 20 Jan 2026 10:19:14 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 20 Jan 2026 10:19:13 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 20 10:19:14 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.484015, queueID=43CBB1A382 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19430 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 13 to 20, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Standard Library Team OCaml Software Foundation: January 2026 update Dune 3.21.0 Raven Dev Meetings Ufind 0.2.0 Curious OCaml: Functional Programming in OCaml Testo 0.3 The dk0 build system Opam 104: Sharing Your Code, by OCamlPro Other OCaml News Old CWN Standard Library Team =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Nicolas Ojeda Bar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Dear Community, On behalf of the OCaml developer team, I am happy to announce the formation of a "Standard Library Team" which will take the lead in shepherding, reviewing and generally staying on top of standard library contributions in the service of the community. Its members (and GitHub handles) are: =E2=80=A2 Kate Deplaix @kit-ty-kate =E2=80=A2 Simon Cruanes @c-cube =E2=80=A2 Daniel B=C3=BCnzli @dbuenzli =E2=80=A2 L=C3=A9o Andr=C3=A8s @redianthus (previously @zapashcanon) =E2=80=A2 Nicolas Ojeda Bar @nojb (myself, acting as relay with the core = dev team) All of them are experienced users who have made great contributions to the standard library, and the community in general, over the years. Making them part of this team is a way of recognizing a role they already play in many ways. Besides crediting their valuable work, I hope this will encourage them to take even greater responsibility in the evolution of the standard library. We hope that by putting this team together, we will be able to improve the way standard library contributions are handled: making sure that contributions are acted on in a timely fashion, that decisions are taken (instead of sometimes letting contributions languish without a clear decision), and that a coherent set of criteria and direction is applied to decide what gets integrated into the standard library. Very much related to this, a document with design guidelines for standard library contributions is being proposed for integration in the compiler repository. This document, which is rather general in character, is meant to guide the work of this team. Everyone is welcome to peruse it. Do not hesitate to get back to me or to any other member of the team if you have any questions. Best wishes, Nicolas OCaml Software Foundation: January 2026 update =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This is an update on recent works of the [OCaml Software Foundation], covering our 2025 actions =E2=80=93 the previous update was in [January 2025]. (In the present thread I will mention things that we agreed to fund in 2025; many of the actions that actually happened in 2025 were approved in 2024 and are listed in the previous thread.) The OCaml Software Foundation is a non-profit foundation that receives funding from [industrial sponsors] each year, and tries its best to spend it to support and strengthen the OCaml ecosystem and community. The funding volume we receive each year is around 200K=E2=82=AC. (For comparison: this is the yearly cost of one experienced full-time software engineer in many parts of the world.) We do not fund people full-time for long periods. Most actions receive from 3K=E2=82=AC to 20K= =E2=82=AC. The work to prepare and execute actions is mostly done by the (unpaid) [Executive Committee]. It is currently formed by Nicol=C3=A1s Ojeda B=C3= =A4r, Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB=85n, Virgile Prevosto and my= self, with administrative personnel provided by [INRIA] and general assistance by Alan Schmitt. Our current sponsors (thanks!) are [ahrefs], [Jane Street], [Tezos], [Bloomberg], [Lexifi], [SimCorp], [MERCE] and [Tarides]. (If your company would like to join as a sponsor, please [get in touch]. Unfortunately, we still cannot efficiently process small donations, so we are not calling for individual donations.) Feel free to use this thread for questions/suggestions :-) [OCaml Software Foundation] [January 2025] [industrial sponsors] [Executive Committee] [INRIA] [ahrefs] [Jane Street] [Tezos] [Bloomberg] [Lexifi] [SimCorp] [MERCE] [Tarides] [get in touch] Education and outreach =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We keep funding the OCaml meetups in Paris and Toulouse, France. The meetup in Chennai, India unfortunately seems to be inactive currently. A new meetup is starting in London ( ), we are setting up funding. (If you want to start an OCaml meeting in some other place, please do not hesitate to get in touch!) We sponsored the [JFLA 2026], a functional programming conference in France. We also sponsored ICFP 2025 in Singapore, and provided financial support for the colocated [OCaml Workshop 2025], for PC members and speakers who could not otherwise cover the travel and registration costs. We recently started funding Thomas Leonard for his time writing excellent technical blog posts about OCaml. The first [blog post] covered by this support is on his new OCaml library and tool for linux mode setting (very technical!). [JFLA 2026] [OCaml Workshop 2025] [blog post] Research =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The OCaml Software Foundation is typically not involved in funding research, focusing on actions that have a more immediate impact on the language and its community. We do provide recurrent funding to the Cambium research team at INRIA, which corresponds to the funding they received from the OCaml consortium before the OCaml Foundation was created. This year we also agreed to fund a grant for a long internship on [Cameleer], a program-verification tool for OCaml on top of the Why3 verification environment. M=C3=A1rio Perreira, funding recipient and auth= or of Cameleer, also wrote [a book] on the tool with his student Pedro Gasparinho. Finally, Jane Street agreed to provide additional funding (roughly one person-year) for the professional expenses of people at INRIA who work on the OCaml compiler. [Cameleer] [a book] Ecosystem =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Compiler We supported Tarides for some (a small portion) of the time spent by David Allsopp and Olivier Nicole on compiler maintenance. We funded Cl=C3=A9ment Blaudeau to work on the implementation of the OCaml module system, as a more practical follow-up after his PhD on the OCaml module system. Cl=C3=A9ment found many small issues and started fixing them, and is now working on a much more ambitious [plan for 'transparent ascriptions'] in OCaml, which could improve module-checking performance and is a requirement for modular implicits. We funded Pierre Boutillier to work on the OCaml bytecode debugger. Pierre Boutillier wanted to provide built-in support for running `ocamldebug' from Dune, an equivalent of `dune utop' for a toplevel. He completed the compiler side of the work, but he moved to a different full-time job before attacking the Dune side. We funded Thomas Refis to review the "Type error recovery" PR from Xavier van de Woestyne (Tarides), which upstreams a part of the Merlin changes to the typechecker, to make Merlin maintenance easier in the future. We funded Jan Midtgaard to keep working on his [multicoretests] fuzzing suite, which has found various Multicore-related correctness issues in the OCaml runtime and standard library. [plan for 'transparent ascriptions'] [multicoretests] =E2=97=8A Infrastructure As in previous years, we funded the work of Kate Deplaix to check that the OCaml ecosystem is compatible with upcoming compiler releases. We are trying our best to support the work of opam-repository maintainers, through individual funding grants for the active maintainers. This year we supported Tarides for some of the time of Shon Feder on the opam-repository, and we fund Jan Midtgaard for opam-repository maintenance, with in particular a focus on Windows and FreeBSD support. Probably the biggest "infrastructure" change which involved the Foundation this year is the [OCaml Security Team], which was created by the Foundation as a result of a proposal by Tarides, with in particular generous financial support of Bloomberg. The Security Team just published [their own activity report]. [OCaml Security Team] [their own activity report] =E2=97=8A Tools We funded the maintenance of `ppxlib' by Nathan Rebours. We funded development on the `opam' client by Raja Boujbel (OCamlPro). We funded contributions of Ali Caglayan to `dune'. We funded Jules Aiguillon (Tarides) to update `ocamlformat' for OCaml 5.5. =E2=97=8A Libraries We supported the work of Petter Urkedal on the [Caqti] library, the main database connection library in the OCaml community. We supported the maintenance of the Ocsigen web toolkit. We funded the maintenance of [ctypes]. We funded Thomas Leonard to work on a Wayland window manager in OCaml. We supported the contributions of Daniel B=C3=BCnzli to the OCaml ecosystem. This year, Daniel used this support to fund the development of =E2=80=A2 [support] for Unicode 17.0 in his Unicode libraries =E2=80=A2 [bytesrw], a library of composable byte stream readers and writ= es, extended in version 0.3 for support with various TLS-related crypto algorithms. =E2=80=A2 the 0.4 release of [Cmarkit], a CommonMark parser and renderer. =E2=80=A2 [release 2.0.0] of the Cmdliner library for command-line argume= nt parsing, bringing support for manpage installation and auto-completion. [Caqti] [ctypes] [support] [bytesrw] [Cmarkit] [release 2.0.0] Hannes Mehnert asked and gasche replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Is it true that Tarides sponsors OCSF and at the same time Tarides receives money from OCSF? It's a mistake on my part, Tarides was not among our sponsors for the reason you mentioned. (We have strict rules not to do this as paying someone who sponsors us could be interpreted as a tax-evasion scheme. This is the same reason why OCamlPro are not sponsors since a few years ago.) Their people are doing useful work that we want to be able to support, and we decided that it was more important than receiving their funding. Dune 3.21.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Shon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune team is pleased to announce [the release of dune 3.21.0]. This is a large release, including dozens of fixes, improvements, and additions, thanks to many contributors. See [the full changelog] for all changes and contributors. If you encounter a problem with this release, please report it in [our issues tracker]. We also note that @maiste has stepped away from the role of release manager: on behalf of the Dune team, I extend @maiste our thanks for his time doing this important work! :pray: [the release of dune 3.21.0] [the full changelog] [our issues tracker] Raven Dev Meetings =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Continuing this thread, Thibaut Mattio announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We're moving the Raven dev meetings to a monthly basis. The next dev meeting will be *Monday, February 2, 2026, at 10:00 AM CET* with the same link: We've seen limited interest in the dev meetings so far, so I'm considering discontinuing them after the current Outreachy internships. Let me know if you're in favor of keeping them, that will help gauge the community interest beyond the attendance of the first two meetings. Ufind 0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hello I'm happy to announce that the [Ufind] library is now available on `opam'. `Ufind' is a Utf8 search engine with parameterized case and accent sensibility. _Example:_ I use it daily at work for the following problem: I have lists of names (students, professors) where I Iike to keep all the correct accents (like "Ljubi=C4=8Di=C4=87", or "Gi=C3=A1p =C4=90=C3=B4ng = Ngh=E1=BB=8B", or "H=C3=A9l=C3=A8ne", etc.) However, I often have to match these names against other lists from the University administration which, usually, have no or very few accents. I wrote `Ufind' for this. Now I can search for "dong" and it will return "Gi=C3=A1p =C4=90=C3=B4ng = Ngh=E1=BB=8B" (with some ranking score) See the [README] file or the [documentation] for more details. Internally, `ufind' uses [ubase] for dealing with accents/diacritics. [Ufind] [README] [documentation] [ubase] Curious OCaml: Functional Programming in OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Lukasz Stafiniak announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 Hi! I=E2=80=99m happy to announce a translation of my Functional Programming = (in OCaml) lectures into a textbook format, modernized to cover algebraic effects, is complete! Claude Opus 4.5 did the bulk of the work; GPT-5.2 wrote chapter 10 and tackled the toughest challenges. HTML version: PDF version: Website and Markdown original as README: Enjoy! Testo 0.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Martin Jambon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Testo 0.3.4 is out! [Testo] is an industry-grade test framework for OCaml. It is suitable for unit-testing OCaml code and for end-to-end testing command-line executables. Testo is an [open-source project] maintained by the OCaml community, with support from Semgrep. Highlights of this release include: =E2=80=A2 better integration with Dune (testo-template, `--chdir') =E2=80=A2 improved Windows support (internal CI checks, CRLF/LF diff highlighting) =E2=80=A2 quick start instructions and revised tutorial Enjoy! [Testo] [open-source project] The dk0 build system =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 It is my pleasure to announce the first official release of `dk0'. It is a build system with the following features: =E2=80=A2 Written in OCaml with minimal dependencies. Its C code is porta= ble (no depext). The main OCaml dependencies are fmlib-parse and spawn. =E2=80=A2 Language agnostic like Bazel/Buck2. =E2=80=A2 Repeatable builds (my made-up term for a weak form of reproduci= ble builds). =E2=80=A2 Lua scripting for build rules. The Lua implementation is pure O= Caml and extends [Lua-ML] (thanks @lindig et al). In `dk0' Lua plays the same role as Starlark in Bazel and Buck2. =E2=80=A2 Dynamic dependencies. This is somewhat esoteric for build syste= ms but important for some languages (OCaml, C++20). =E2=80=A2 Single file scripts. Think `uv' but for arbitrary languages. =E2=80=A2 Multi-platform federated binary caching with indexed downloads. Think `nix' binary package caching, but each package can do its own caching in GitHub Actions / etc. =E2=80=A2 Attestations (security) But repeatable builds means repackaging common system packages (git, tar, etc.) and providing build rules for compilers (msvc, clang, ocamlopt, etc.). That is a difficult, time-consuming assignment, especially when packaging for multiple operating systems (Windows, macOS and Linux). Status: =E2=80=A2 dk0 is ready enough for making useful packages. However, a few backwards incompatible changes still need to be made and that might require tweaks to packages. =E2=80=A2 Today I have a couple packages; realistically there needs to be 20-30 packages to be useful. OCaml in particular will need a lot of packages that **do not exist today**. =E2=80=A2 When I complete a new package I'll post an `[ANN]' similar to n= ew opam packages. Docs: =E2=80=A2 spec: =E2=80=A2 site: On the "site" link above you'll see an example for a single-file script with C# / .NET =E2=80=A6 that example exists because I needed the script but more importantly because .NET has minimal transitive dependencies. If development goes well I'll replace that with a more useful example that builds a Windows OCaml executable on macOS/Linux (using build rules that download/run wine, msvc, etc.). If you are interested in contributing packages, I can setup video or audio time to get you or a group started quickly. Lastly, I happen to like Dune (especially its watch mode) and the simplicity of Alice. Obviously I wouldn't have made `dk0' if I didn't need to go beyond what exists today, but `dk0' is open-source (libraries are Apache-2.0, executable is OSL-3.0) =E2=80=A6 I hope librar= ies can be shared across the different build systems! And because `dk0' has dynamic dependencies, it is straightforward for dk0 to wrap other build systems (that is what I did with the .NET build system). Thanks, Jonah [Lua-ML] Opam 104: Sharing Your Code, by OCamlPro =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: OCamlPro announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 *Greetings Cameleers,* We=E2=80=99ve just released a new blog post: *[Opam 104: Sharing Your Cod= e]* This article is the final entry in our **opam deep-dives** series, and it focuses on a key step in every OCaml project=E2=80=99s life: making it= easy for others to work with your code =E2=80=94 and sharing it with the wider community. We cover two practical topics: =E2=80=A2 Quickly setting up a complete development environment for an existing project =E2=80=A2 Releasing your package to the official `opam-repository' Along the way, we look at developer-focused `opam install' workflows, local switches, dependency locking with `opam lock', and reproducible setups for teams and CI. We then walk through publishing a package using `opam-publish', with a clear explanation of how releases actually make their way into opam. The post stays hands-on and workflow-oriented, building on the previous Opam 101=E2=80=93103 articles, and wraps up the opam10x series w= ith a full start-to-release pipeline. :memo: Read it, and the rest of the `opam deep-dives' on the [OCamlPro Blog] ! Perfect for developers onboarding to an existing project, or for anyone preparing to publish their first OCaml package, and of course, the curious beginner Cameleer ! As always, feedback welcome! =E2=80=94 The OCamlPro Team [Opam 104: Sharing Your Code] [OCamlPro Blog] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Base Image Builder] =E2=80=A2 [Updating ARM64 Workers to Ubuntu Noble] =E2=80=A2 [Moving to opam 2.5] =E2=80=A2 [Base Fibonacci] =E2=80=A2 [More OCaml on Pi Pico 2 W] [the ocaml.org blog] [Base Image Builder] [Updating ARM64 Workers to Ubuntu Noble] [Moving to opam 2.5] [Base Fibonacci] [More OCaml on Pi Pico 2 W] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 13 to 20, 202= 6.

    Standard Library Team

    Nicolas Ojeda Bar announced

    Dear Community,

    On behalf of the OCaml developer team, I am happy to announce the formation= of a "Standard Library Team" which will take the lead in shepherding, revi= ewing and generally staying on top of standard library contributions in the= service of the community. Its members (and GitHub handles) are:

    • Kate Deplaix @kit-ty-kate
    • Simon Cruanes @c-cube
    • Daniel B=C3=BCnzli @dbuenzli
    • L=C3=A9o Andr=C3=A8s @redianthus (previously @zapashcanon)
    • Nicolas Ojeda Bar @nojb (myself, acting as relay with the core dev team= )

    All of them are experienced users who have made great contributions to the = standard library, and the community in general, over the years. Making them= part of this team is a way of recognizing a role they already play in many= ways. Besides crediting their valuable work, I hope this will encourage th= em to take even greater responsibility in the evolution of the standard lib= rary.

    We hope that by putting this team together, we will be able to improve the = way standard library contributions are handled: making sure that contributi= ons are acted on in a timely fashion, that decisions are taken (instead of = sometimes letting contributions languish without a clear decision), and tha= t a coherent set of criteria and direction is applied to decide what gets i= ntegrated into the standard library.

    Very much related to this, a document with design guidelines for standard l= ibrary contributions is being proposed for integration in the compiler repo= sitory. This document, which is rather general in character, is meant to gu= ide the work of this team. Everyone is welcome to peruse it.

    https://github.com/oc= aml/ocaml/pull/14459

    Do not hesitate to get back to me or to any other member of the team if you= have any questions.

    Best wishes, Nicolas

    OCaml Software Foundation: January 2026 update

    gasche announced

    This is an update on recent works of the O= Caml Software Foundation, covering our 2025 actions – the previou= s update was in January 2025. (In the present thread= I will mention things that we agreed to fund in 2025; many of the actions = that actually happened in 2025 were approved in 2024 and are listed in the = previous thread.)

    The OCaml Software Foundation is a non-profit foundation that receives fund= ing from industrial sponsors = each year, and tries its best to spend it to support and strengthen the OCa= ml ecosystem and community.

    The funding volume we receive each year is around 200K=E2=82=AC. (For compa= rison: this is the yearly cost of one experienced full-time software engine= er in many parts of the world.) We do not fund people full-time for long pe= riods. Most actions receive from 3K=E2=82=AC to 20K=E2=82=AC. The work to p= repare and execute actions is mostly done by the (unpaid) Executive Committee. It is currently formed by= Nicol=C3=A1s Ojeda B=C3=A4r, Damien Doligez, Xavier Leroy, Kim Nguy=E1=BB= =85n, Virgile Prevosto and myself, with administrative personnel provided b= y INRIA and general assistance by Alan = Schmitt.

    Our current sponsors (thanks!) are ahrefs, Jane Street, Tezos, Bloomberg, <= a href=3D"https://lexifi.com/">Lexifi, SimCorp, MERCE = and Tarides. (If your company would li= ke to join as a sponsor, please get in touch. Unfortunately, we still cannot efficiently proce= ss small donations, so we are not calling for individual donations.)

    Feel free to use this thread for questions/suggestions :-)

    Education and outreach

    We keep funding the OCaml meetups in Paris and Toulouse, France. The meetup= in Chennai, India unfortunately seems to be inactive currently. A new meet= up is starting in London ( https://discuss.ocaml.org/t/ann-caml-in-the-capital/1= 7428 ), we are setting up funding. (If you want to start an OCaml meeti= ng in some other place, please do not hesitate to get in touch!)

    We sponsored the JFLA 2026<= /a>, a functional programming conference in France. We also sponsored ICFP 2025 in Singapore, and provided financial support fo= r the colocated OCaml Workshop 2025, for PC members and speakers who could not other= wise cover the travel and registration costs.

    We recently started funding Thomas Leonard for his time writing excellent t= echnical blog posts about OCaml. The first blog post covered by this support i= s on his new OCaml library and tool for linux mode setting (very technical!= ).

    Research

    The OCaml Software Foundation is typically not involved in funding research= , focusing on actions that have a more immediate impact on the language and= its community. We do provide recurrent funding to the Cambium research tea= m at INRIA, which corresponds to the funding they received from the OCaml c= onsortium before the OCaml Foundation was created.

    This year we also agreed to fund a grant for a long internship on Cameleer, a program= -verification tool for OCaml on top of the Why3 verification environment. M= =C3=A1rio Perreira, funding recipient and author of Cameleer, also wrote a book on the to= ol with his student Pedro Gasparinho.

    Finally, Jane Street agreed to provide additional funding (roughly one pers= on-year) for the professional expenses of people at INRIA who work on the O= Caml compiler.

    Ecosystem

    • Compiler

      We supported Tarides for some (a small portion) of the time spent by David = Allsopp and Olivier Nicole on compiler maintenance.

      We funded Cl=C3=A9ment Blaudeau to work on the implementation of the OCaml = module system, as a more practical follow-up after his PhD on the OCaml mod= ule system. Cl=C3=A9ment found many small issues and started fixing them, a= nd is now working on a much more ambitious plan for 'transparent ascriptions' in OCaml, which co= uld improve module-checking performance and is a requirement for modular im= plicits.

      We funded Pierre Boutillier to work on the OCaml bytecode debugger. Pierre = Boutillier wanted to provide built-in support for running ocamldebug<= /code> from Dune, an equivalent of dune utop for a toplevel. H= e completed the compiler side of the work, but he moved to a different full= -time job before attacking the Dune side.

      We funded Thomas Refis to review the "Type error recovery" PR from Xavier v= an de Woestyne (Tarides), which upstreams a part of the Merlin changes to t= he typechecker, to make Merlin maintenance easier in the future.

      We funded Jan Midtgaard to keep working on his multicoretests fuzzing suite, which = has found various Multicore-related correctness issues in the OCaml runtime= and standard library.

    • Infrastructure

      As in previous years, we funded the work of Kate Deplaix to check that the = OCaml ecosystem is compatible with upcoming compiler releases.

      We are trying our best to support the work of opam-repository maintainers, = through individual funding grants for the active maintainers. This year we = supported Tarides for some of the time of Shon Feder on the opam-repository= , and we fund Jan Midtgaard for opam-repository maintenance, with in partic= ular a focus on Windows and FreeBSD support.

      Probably the biggest "infrastructure" change which involved the Foundation = this year is the OCaml Security Team, which was created by the Foundation as= a result of a proposal by Tarides, with in particular generous financial s= upport of Bloomberg. The Security Team just published their = own activity report.

    • Tools

      We funded the maintenance of ppxlib by Nathan Rebours.

      We funded development on the opam client by Raja Boujbel (OCam= lPro).

      We funded contributions of Ali Caglayan to dune.

      We funded Jules Aiguillon (Tarides) to update ocamlformat for = OCaml 5.5.

    • Libraries

      We supported the work of Petter Urkedal on the Caqti library, the main database connection l= ibrary in the OCaml community.

      We supported the maintenance of the Ocsigen web toolkit.

      We funded the maintenance of ctypes.

      We funded Thomas Leonard to work on a Wayland window manager in OCaml.

      We supported the contributions of Daniel B=C3=BCnzli to the OCaml ecosystem= . This year, Daniel used this support to fund the development of

      • support for Unicode 17.0 in his Unicode l= ibraries
      • bytesrw, a library of composable byte stream readers= and writes, extended in version 0.3 for support with various TLS-related c= rypto algorithms.
      • the 0.4 release of Cmarkit, a CommonM= ark parser and renderer.
      • releas= e 2.0.0 of the Cmdliner library for command-line argument parsing, brin= ging support for manpage installation and auto-completion.

    Hannes Mehnert asked and gasche replied

    Is it true that Tarides sponsors OCSF and at the same time Tarides receives= money from OCSF?

    It's a mistake on my part, Tarides was not among our sponsors for the reaso= n you mentioned. (We have strict rules not to do this as paying someone who= sponsors us could be interpreted as a tax-evasion scheme. This is the same= reason why OCamlPro are not sponsors since a few years ago.) Their people = are doing useful work that we want to be able to support, and we decided th= at it was more important than receiving their funding.

    Dune 3.21.0

    Shon announced

    The Dune team is pleased to announce the release of dune 3.21.0.

    This is a large release, including dozens of fixes, improvements, and addit= ions, thanks to many contributors. See the full changelog for all changes and contri= butors.

    If you encounter a problem with this release, please report it in our issues tracker.

    We also note that @maiste has stepped away from the role of release manager= : on behalf of the Dune team, I extend @maiste our thanks for his time doin= g this important work! :pray:

    Raven Dev Meetings

    Continuing this thread, Thibaut Mattio announced

    We're moving the Raven dev meetings to a monthly basis. The next dev meetin= g will be Monday, February 2, 2026, at 10:00 AM CET with the same li= nk: https://meet.google.co= m/giw-bsdy-sjf

    We've seen limited interest in the dev meetings so far, so I'm considering = discontinuing them after the current Outreachy internships. Let me know if = you're in favor of keeping them, that will help gauge the community interes= t beyond the attendance of the first two meetings.

    Ufind 0.2.0

    sanette announced

    Hello

    I'm happy to announce that the Ufind library is now available on opam.

    Ufind is a Utf8 search engine with parameterized case and acce= nt sensibility.

    Example: I use it daily at work for the fo= llowing problem: I have lists of names (students, professors) where I Iike = to keep all the correct accents (like "Ljubi=C4=8Di=C4=87", or "Gi=C3=A1p = =C4=90=C3=B4ng Ngh=E1=BB=8B", or "H=C3=A9l=C3=A8ne", etc.) However, I often= have to match these names against other lists from the University administ= ration which, usually, have no or very few accents. I wrote Ufind for this.

    Now I can search for "dong" and it will return "Gi=C3=A1p =C4=90=C3=B4ng Ng= h=E1=BB=8B" (with some ranking score)

    See the README= file or the documentation= for more details.

    Internally, ufind uses ubase for dealing with accents/diacritics.

    Curious OCaml: Functional Programming in OCaml

    Lukasz Stafiniak announced

    Hi!

    I=E2=80=99m happy to announce a translation of my Functional Programming (i= n OCaml) lectures into a textbook format, modernized to cover algebraic eff= ects, is complete!

    Claude Opus 4.5 did the bulk of the work; GPT-5.2 wrote chapter 10 and tack= led the toughest challenges.

    HTML version: https://lukstafi.github.io/curious-ocaml/new_book.html

    PDF version: https://github.com/lukstafi/curious-ocaml/blob/main/pdf= s/new_book.pdf

    Website and Markdown original as README: https://github.com/lukstafi/curious-ocaml/tre= e/main

    Enjoy!

    Testo 0.3

    Martin Jambon announced

    Testo 0.3.4 is out!

    Testo is an industry-grade test fram= ework for OCaml. It is suitable for unit-testing OCaml code and for end-to-= end testing command-line executables. Testo is an open-source project maintained by the OCaml communi= ty, with support from Semgrep.

    Highlights of this release include:

    • better integration with Dune (testo-template, --chdir)
    • improved Windows support (internal CI checks, CRLF/LF diff highlighting= )
    • quick start instructions and revised tutorial

    Enjoy!

    The dk0 build system

    jbeckford announced

    It is my pleasure to announce the first official release of dk0. It is a build system with the following features:

    • Written in OCaml with minimal dependencies. Its C code is portable (no = depext). The main OCaml dependencies are fmlib-parse and spawn.
    • Language agnostic like Bazel/Buck2.
    • Repeatable builds (my made-up term for a weak form of reproducible buil= ds).
    • Lua scripting for build rules. The Lua implementation is pure OCaml and= extends Lua-ML (thanks @l= indig et al). In dk0 Lua plays the same role as Starlark in Ba= zel and Buck2.
    • Dynamic dependencies. This is somewhat esoteric for build systems but i= mportant for some languages (OCaml, C++20).
    • Single file scripts. Think uv but for arbitrary languages.=
    • Multi-platform federated binary caching with indexed downloads. Think <= code>nix binary package caching, but each package can do its own cac= hing in GitHub Actions / etc.
    • Attestations (security)

    But repeatable builds means repackaging common system packages (git, tar, e= tc.) and providing build rules for compilers (msvc, clang, ocamlopt, etc.).= That is a difficult, time-consuming assignment, especially when packaging = for multiple operating systems (Windows, macOS and Linux).

    Status:

    • dk0 is ready enough for making useful packages. However, a few backward= s incompatible changes still need to be made and that might require tweaks = to packages.
    • Today I have a couple packages; realistically there needs to be 20-30 p= ackages to be useful. OCaml in particular will need a lot of packages that = do not exist today.
    • When I complete a new package I'll post an [ANN] similar t= o new opam packages.

    Docs:

    On the "site" link above you'll see an example for a single-file script wit= h C# / .NET … that example exists because I needed the script but mo= re importantly because .NET has minimal transitive dependencies. If develop= ment goes well I'll replace that with a more useful example that builds a W= indows OCaml executable on macOS/Linux (using build rules that download/run= wine, msvc, etc.).

    If you are interested in contributing packages, I can setup video or audio = time to get you or a group started quickly.

    Lastly, I happen to like Dune (especially its watch mode) and the simplicit= y of Alice. Obviously I wouldn't have made dk0 if I didn't nee= d to go beyond what exists today, but dk0 is open-source (libr= aries are Apache-2.0, executable is OSL-3.0) … I hope libraries can = be shared across the different build systems! And because dk0 = has dynamic dependencies, it is straightforward for dk0 to wrap other build= systems (that is what I did with the .NET build system).

    Thanks, Jonah

    Opam 104: Sharing Your Code, by OCamlPro

    OCamlPro announced

    Greetings Cameleers,

    We=E2=80=99ve just released a new blog post: Opam 104: Sharing Your Co= de

    This article is the final entry in our opam deep-dives series= , and it focuses on a key step in every OCaml project=E2=80=99s life: makin= g it easy for others to work with your code =E2=80=94 and sharing it with t= he wider community.

    We cover two practical topics:

    • Quickly setting up a complete development environment for an existing p= roject
    • Releasing your package to the official opam-repository

    Along the way, we look at developer-focused opam install workf= lows, local switches, dependency locking with opam lock, and r= eproducible setups for teams and CI. We then walk through publishing a pack= age using opam-publish, with a clear explanation of how releas= es actually make their way into opam.

    The post stays hands-on and workflow-oriented, building on the previous Opa= m 101=E2=80=93103 articles, and wraps up the opam10x series with a full sta= rt-to-release pipeline.

    :memo: Read it, and the rest of the opam deep-dives on the OCamlPro Blog !

    Perfect for developers onboarding to an existing project, or for anyone pre= paring to publish their first OCaml package, and of course, the curious beg= inner Cameleer !

    As always, feedback welcome!

    =E2=80=94 The OCamlPro Team

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=DLwZtyyY; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 91616400A8 for ; Tue, 27 Jan 2026 12:42:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=m1KI80si0CU0C7NVW8KQSe4KbbOBY8kk7uIhq5fqpQw=; b=DLwZtyyYn3kXenmoNdmWlHfr/Nrsc1MHznKmq/BP5uEYTn7+g0g6OcbA oE0CWt4K5INLR2ZdfoiobqjeOgCdeGjWBebsMCYGQ73vv2JiqA+TbzF5s uC1A0VkR5WN7F2Y+IdUVh96ECFpN+fdh9R7ochVTjh9pr4doksy1ROsNx Y=; X-CSE-ConnectionGUID: pPMV+H9hR9WmUEaKsBvAZg== X-CSE-MsgGUID: KTI9vpGGTLSL2RQMxMekRg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,257,1763420400"; d="scan'208,217";a="260549922" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 27 Jan 2026 13:42:03 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3D88F8279E; Tue, 27 Jan 2026 13:42:03 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 2A75682461 for ; Tue, 27 Jan 2026 13:41:53 +0100 (CET) X-CSE-ConnectionGUID: WBDEyr9xSEWVp7+EjmeGuw== X-CSE-MsgGUID: ngqwKbEdRVykTg9KHSUP8w== IronPort-SDR: 6978b28f_gZMldyQS7o3tHdikRdr9zReWDvjZ//AE7v6+IeDvL1yQlRD nDHw2h9q/MhPxY71qJ234BnTLe6m5b2DEqXJGaA== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HaAQApsnhpjyIeaIFaFgcBAQEBCQESAQUFAYIQgT2BB?= =?us-ascii?q?BoBbF8ZGgcISQOEVYFjgWyOJTOcFYFpgSwWIxUBAwENLgEFGgECBAEBAwECA?= =?us-ascii?q?YNJcUYCFox4Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBA?= =?us-ascii?q?gQGAQIQAQEBAQEBOQVJhhUHMw2CRRk4YBFlCQYwAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIEBwEBBxwNEz8cCQQGEwEBO?= =?us-ascii?q?BgjAxAEAQYDAgQNATUXARIUBoJoAYIiAk8DBAEMBpYdm056fzOBAYIMAQEGg?= =?us-ascii?q?Qg+AgELAgIDGCUB2hGBZwmBTYVugkobAQUlSWsBAoRJhD0nD4FVRIEUAYILb?= =?us-ascii?q?m+CYQEBAQEBgSMEAQEMBQIBCAIfJAmDJYJpghEVehQdghwshyQGglGHQYFEI?= =?us-ascii?q?gMmMywBVRMXCwcFXoEIAyovLW4yHYEjPhcyWBsHBV+Ifw+JGYFrVwMLbT03F?= =?us-ascii?q?BuPWkIZGiqBNC8OHx8+GwkCDwkJCgEbDgEBIAI2DgoSDwkBGQ4DCAQJDgQSB?= =?us-ascii?q?AMICBcGCwsCHg8DknwDKgOdcZNZgQo0B4QfgV4GDIkIgSaWB4QEgVeLPIcek?= =?us-ascii?q?jYilnyBaCKJXoEmCYFva4h6jDoNH4VYgX8jbD8BGgMMBzMaMEOCMwEBMgkKP?= =?us-ascii?q?BwPV4hfhEkiDBaDXhAjgQuBDBp6ehckCYJdujVCNQIBAQouAgcBCgEBAwmFR?= =?us-ascii?q?R0BAYwHM4FLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:LFlMUqMbaThuJGzvrR18k8FynXyQoLVcMsEvi/4bfWQNrUol3z1Vm mQeD2DTbKuIYGagftx+bonj9x4D6pPcn99hHHM5pCpnJ55ogZqcVI7Bdi8cHAvLc5adFBo/h yk6QoOdRCzhZiaE/n9BCpC48D8hk/jOHuehYAL9EngZbRd+Tys8gg5Ulec8g4p56fC0GArlV ena+qUzA3f7nWQtWo4ow/jb8k035a6t4GpwUmEWPJingneOzxH5M7pEfcldH1OgKqFIE+izQ fr0zb3R1gvx4xc3B9q5pa3we0sMT6S6FVDmZq1+BsBOKjAbzsAD+v5T2Mg0MS+7uB3V9zxF8 +ihgLTrIesf0gIgr8xGO/VQO3kW0aSrY9YrK1Dn2SCY5xWun3cBX5yCpaz5VGEV0r8fPI1Ay RAXAA8nQj2SnbOm+5+EdPEzxekhKcTEIZxK7xmMzRmBZRonaZXTGuPS4ttJwDo7hsZPBOvTI c0DZlKDbjyZOUwJYw9LTslm2rz07pX8W2UwRFa9npAMuz36jzxfhZHEZcLSfs2WSM5VmEeBu 2+A+H72VxgePdrZ0jGF93OwmsfFmj79U48JUrjk5rhtmlL7Kmk7UUZJDAfh8Kbp4qK4c9RQM lM38Acil5Yj93CkH/rdZCCA8GHR63bwXPILTrFks17VokbO2C6SD20ACzpAc8AOr94zXTVs1 1mTntqvCyYHjVGOYXeNr/GMqjejJSUeLWkDfDIJCwwf7LEPvb3fkDrwZPpOAbTknubYJg/on HOnri0zqKgM2JtjO7qAwbzRv967jrbzJjPZCy3STjvj9gR9dZKobIyu6EHG4LBHNonxori9U JosxZj2AAMmVM/leMmxrAMlR+jBCxGta2a0vLKXN8N9nwlBAlb6FWyq3N2BGKuZGp1ZJWGyP xe7VfJ56ZRUOHbidahzcp68AMQszLH9GJzoTuvfdrJzX3SFTyfepHsGTRfJhwjFyRF8+YlhY s3zWZj3Uh4n5VFPkGHeqxE1jeRznnhWKKK6bcyT8ilLJpLEPy/EFuhdbAfQBg37hYvdyDjoH x9kH5Pi431ivCfWOEE7KKZCfAhYHmtxHp3stc1ce8iKJwcsSilrCObczfllM8Zplrhc3LWAt HyseF5q+Hymj13+KCKOdi9CbpHrVs1Btn4VB3EnEmup/HkBWryRypkjWaE5RpQZ0dBy7OVVS qAFcvqQA/4URTXg/S8cXKbHr4djVUqKgFvSGhH4fzJlb8NsaDLL8/C5ZgDfyi0qC3umh9ofu Jyl7BvQGrAYdjRhDeHXSfOh9Eywtn4jg9BPX1PED91QWUf0+q14AnXVot5uBO9UMjTF5D+R9 zjOMCciveOX/rMEqojYt56Lv6KCMrVYHHMDO0L58LzvFy3R3lT78L96SOzSIAzsDjLlyp6DO 9dQ4er3asAcvVBwtIF5LbZn4IQ+6/brpJ5Y1g5UJ2rKXXv6FoJfJmS64ucXup1v3rN5vS6Ea nCL8PReOpSLP5rBO3wVLwwHcO+C9K81nh//0PcLG3j5tRRHpOe/bUZvPhe3mHN8KplxO9gb2 usPgpMdxDG+rRsICey4qB5o2V6CFVE6aJV/hKomWNfqriEJ1mB9ZYftD36qwZOXNPRJHEoYA h6Vo6vgmL4G1hfOXEQxHFeQxeFtu5AqvUFb/k4jPHWMoMLO3dUs7S1S8BM2bwVb9QpG2ORNI VpWN1V5CKGN3jVwju1BYjycIB5ADxin5UDB8VsFu2nHRU2OVGaWDmkCFcuS3UIeqURwQyN6+ eyG9WPbTjraRsH98S8sU0pDqfa4b9hQ9BXHqf+3Dfa+AJg2Tjr0sJCAPVNShUPcPvowo0nbq c1B3uV6M/T7PBFNhZwLMdCR0LBIRS2UIGBHf+paw5oIOmPhYxC35ymFLhGgW8FKJsGSy3SCN e5VGpttWSi9hQG0lRJKIY4XIrRxouwl28paRJPvOlw9kuW+qhhHjcvu0xbQ1UEXR+dgq8IfE r/qVimjFzWQjEREmmWWo8hjPHG5UOY+Zwb9/b6U9ccXG61estNcVFw47oHom3DEITl23gm1u TnbbPT81N1SyoVLnqrtHJ5cBg6yF8jBaeSQ/C23sPVMddnqM/qShzgKq1LiARtaDYERV/tzi 76Jltz9h2HBg5obTEHbnMOnO5RSxMDvQtdSDN37HENakQSGRsXoxRkJoEK8CJ5RleJi9tuVf BS5ZOSwZOwqdY9knlMNUBdnEjEZF6jTRYXjr3nkr/2zVz4s4TaeJ9ajrXLUfWVXcxETAKLHC yj2hu2P4+5Jp4EdFT4GAPBbW6VDGmHBYpd/VdPNtmi/NFKK02Oy4u6o0VJq7DzQEXCLHfrr+ Z+PFFC0aB22v7qO191D9ZB7uhoMFntmnO0sZQQn9sVrjyyhRnszRQjH3U7q1rkP+sAz6H35W N0JRG4yUGPlWjBVbRj34NLiRxqSQOsUNb8V4xQ3qliMZX7e6JyoWdNcGuVIuh+auQcPCMmtL swY8XDreB3t0tduX+l7CjmTn7J83v2Drp4X0RmVriExairyxZ0S03hwAAdGVSrGCtzA0kLRK gDZgIyCrF6TESbMLCqrR5KZ9Nz1ct8iI/XEoBpjGOrihrg= IronPort-HdrOrdr: A9a23:TSJbwqx+dBbh1sLYKS6OKrPwE71zdoMgy1knxilNoH1uA66lfq WV9pkmPHDP6Qr5NEtNpTniAtjifZq/z/5ICOAqVN/IYOCMggWVxe9ZgrfK8nnJJGnV9+JW16 tsGpIObeHYPBxdlsi/xAG5Fr8bsb66GU2T9IPj80s= X-Talos-CUID: =?us-ascii?q?9a23=3Ajwwxa2jOsry845Bk/x8GHb4FVDJuTVfx4WbKcl+?= =?us-ascii?q?DJFlXUOLWZF2V9Yx5jJ87?= X-Talos-MUID: =?us-ascii?q?9a23=3AZ3cobgxRLvvO7MuakjVZmYhTtj6aqKKhEV8um7g?= =?us-ascii?q?KgfeVNhB/ahS9twmPEpByfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,257,1763420400"; d="scan'208,217";a="137142978" X-MGA-submission: =?us-ascii?q?MDFR1LJpmQrzupCJA4MdZ8NVamjle1aDNWTZAc?= =?us-ascii?q?sKEPDc48yr5H42NogScpJxMmPHoAq/gk2xhWQsR8zh+8RW0RTs6MCEa6?= =?us-ascii?q?7PGBNhvM0RRLXuKPE2Jr8s7h0wo0BKKuA4HYk1ZG8lOWv6tijYKXHIp4?= =?us-ascii?q?NtBMU/xN9gVr+nesIK35C3iw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 27 Jan 2026 13:41:52 +0100 Received: from TM.local (unknown [185.127.243.192]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 8EB451813E; Tue, 27 Jan 2026 13:41:50 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 27 Jan 2026 13:41:48 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Jan 27 13:41:50 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.498609, queueID=DCFD01814C X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19440 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgSmFudWFyeSAyMCB0byAyNywNCjIwMjYuDQoNClRhYmxlIG9mIENvbnRlbnRzDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KbHd0LXRv LWVpbzogQXV0b21hdGluZyB0aGUgbWVjaGFuaWNhbCBwYXJ0cyBvZiBMd3QgLT4gRWlvIG1pZ3Jh dGlvbg0KVGhlIG5ldyBvd25lcnMtbWFpbnRhaW5lcnMgb2YgRHJlYW0NClNsaXBzaG93IQ0KQmFu Y29zOiBBIHBlcnNpc3RlbnQgS2V5LVZhbHVlIHN0b3JlIGJhc2VkIG9uIFJPV0VYL1AtQVJUDQpy ZXN0cmljdGVkIDEuMi4wIGxpbWl0IHdoaWNoIHN5c3RlbSBvcGVyYXRpb25zIGFuZCB3aGljaCBw YXJ0cyBvZiB0aGUgZmlsZXN5c3RlbSB5b3VyIHByb2dyYW0gY2FuIGFjY2Vzcw0KZGVhZF9jb2Rl X2FuYWx5emVyIDEuMS4wDQpPQ2FtbCBzZWN1cml0eSB0ZWFtDQpQcm9wb3NhbDogbWFrZSB0aGUg bWluaW11bSB0ZXN0ZWQgb3BhbSAyLjEgYW5kIGhpZ2hlcg0KY3NleHAtcXVlcnkgaW5pdGlhbCBy ZWxlYXNlDQpPdGhlciBPQ2FtbCBOZXdzDQpPbGQgQ1dODQoNCg0KbHd0LXRvLWVpbzogQXV0b21h dGluZyB0aGUgbWVjaGFuaWNhbCBwYXJ0cyBvZiBMd3QgLT4gRWlvIG1pZ3JhdGlvbg0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9hbm4tbHd0LXRvLWVpby1hdXRvbWF0aW5nLXRoZS1tZWNoYW5pY2FsLXBh cnRzLW9mLWx3dC1laW8tbWlncmF0aW9uLzE3Njk2LzE+DQoNCg0Kb3VnLXQgYW5ub3VuY2VkDQri lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVy eW9uZSwNCg0KICBMaWtlIG1hbnkgb2YgeW91LCBJ4oCZdmUgYmVlbiBsb29raW5nIGludG8gbWln cmF0aW5nIG15IGxpYnJhcmllcyBmcm9tDQogIEx3dCB0byBFaW8gdG8gdGFrZSBhZHZhbnRhZ2Ug b2YgT0NhbWwgNeKAmXMgZGlyZWN0LXN0eWxlDQogIGNvbmN1cnJlbmN5LiBXaGlsZSB0aGUgbWFu dWFsIG1pZ3JhdGlvbiBndWlkZXMgYXJlIGV4Y2VsbGVudCwgSSBmb3VuZA0KICBteXNlbGYgbWFr aW5nIHRoZSBzYW1lIG1lY2hhbmljYWwgY2hhbmdlcyBvdmVyIGFuZCBvdmVy4oCUZmxhdHRlbmlu Zw0KICBiaW5kcywgdW53cmFwcGluZyBwcm9taXNlcywgYW5kIHJld3JpdGluZyBtYXBzLg0KDQog IFNvLCBJIGJ1aWx0ICpgbHd0LXRvLWVpbycqLCBhIHRvb2wgdGhhdCBhdXRvbWF0ZXMgdGhlIGJv cmluZyBwYXJ0cyBvZg0KICB0aGlzIHRyYW5zaXRpb24uDQoNCiAgKlJlcG86KiBbaHR0cHM6Ly9n aXRodWIuY29tL291Zy10L2x3dC10by1laW9dDQoNCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9vdWct dC9sd3QtdG8tZWlvXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vdWctdC9sd3QtdG8tZWlvPg0KDQpX aGF0IGl0IGRvZXMgKFRoZSBNYWdpYykNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEl0IHBhcnNlcyB5 b3VyIE9DYW1sIHNvdXJjZSBjb2RlIGFuZCBwZXJmb3JtcyBBU1QtbGV2ZWwgcmV3cml0ZXMgdG8N CiAgdHJhbnNmb3JtIG1vbmFkaWMgTHd0IHBhdHRlcm5zIGludG8gZGlyZWN0LXN0eWxlIEVpbyBj b2RlLg0KDQogICpJbnB1dCAoTHd0KToqDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQg ZmV0Y2hfZGF0YSBpZCA9DQogIOKUgiAgIEx3dC5iaW5kIChEYi5nZXRfdXNlciBpZCkgKGZ1biB1 c2VyIC0+DQogIOKUgiAgICAgRGIuZ2V0X3Bvc3RzIHVzZXIuaWQgPj49IChmdW4gcG9zdHMgLT4N CiAg4pSCICAgICAgIEx3dF9saXN0Lm1hcF9wIHByb2Nlc3MgcG9zdHMNCiAg4pSCICAgICApDQog IOKUgiAgICkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgKk91dHB1dCAoRWlvKSoNCg0KICDilIzi lIDilIDilIDilIANCiAg4pSCIGxldCBmZXRjaF9kYXRhIGlkID0NCiAg4pSCICAgbGV0IHVzZXIg PSBMd3RfZWlvLlByb21pc2UuYXdhaXRfbHd0IChEYi5nZXRfdXNlciBpZCkgaW4NCiAg4pSCICAg bGV0IHBvc3RzID0gTHd0X2Vpby5Qcm9taXNlLmF3YWl0X2x3dCAoRGIuZ2V0X3Bvc3RzIHVzZXIu aWQpIGluDQogIOKUgiAgIEVpby5GaWJlci5MaXN0Lm1hcCBwcm9jZXNzIHBvc3RzDQogIOKUlOKU gOKUgOKUgOKUgA0KDQoNCkN1cnJlbnQgU3RhdHVzICYgSGVscCBXYW50ZWQNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoaXMgaXMgY3VycmVudGx5IGFuICpNVlAqLiBJdCBoYW5k bGVzIHRoZSBtb3N0IGNvbW1vbiBwYXR0ZXJucyBJDQogIGVuY291bnRlcmVkIChiaW5kcywgYG1h cF9wJywgYHNsZWVwJywgYHJldHVybicpLCBidXQgdGhlcmUgaXMgcGxlbnR5DQogIG9mIHN1cmZh Y2UgYXJlYSBsZWZ0IHRvIGNvdmVyLg0KDQogIEknbSBsb29raW5nIGZvciBjb250cmlidXRvcnMg dG8gaGVscCBhZGQgcnVsZXMgZm9yIG90aGVyIGNvbW1vbg0KICBwYXR0ZXJucy4gSSd2ZSB0YWdn ZWQgYSBmZXcgaXNzdWVzIGFzICoiR29vZCBGaXJzdCBJc3N1ZXMiKiBpZiBhbnlvbmUNCiAgd2Fu dHMgdG8gZGlwIHRoZWlyIHRvZXMgaW50byBgcHB4bGliJyBhbmQgQVNUIHJld3JpdGluZzoNCg0K ICDigKIgKmBMd3QuY2F0Y2gnIC0+IGB0cnkvd2l0aCcqOiBUcmFuc2Zvcm1pbmcgbW9uYWRpYyBl cnJvciBoYW5kbGluZyB0bw0KICAgICBkaXJlY3Qgc3R5bGUgZXhjZXB0aW9ucy4NCiAg4oCiICpg THd0X2lvJyBzdXBwb3J0KjogTWFwcGluZyBsZWdhY3kgSU8gZnVuY3Rpb25zIHRvIEVpbyBidWZm ZXJzLg0KDQogIEZlZWRiYWNrLCBQUnMsIGFuZCAiSXQgYnJva2Ugb24gbXkgZmlsZSEiIHJlcG9y dHMgYXJlIGFsbCB2ZXJ5DQogIHdlbGNvbWUuDQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpUaGUg bmV3IG93bmVycy1tYWludGFpbmVycyBvZiBEcmVhbQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC90aGUtbmV3LW93bmVycy1tYWludGFpbmVycy1vZi1kcmVhbS8xNzcxMi8x Pg0KDQoNCkFudG9uIEJhY2hpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gdmVyeSBw bGVhc2VkIHRvIGFubm91bmNlIHRoYXQgW0RyZWFtXSwgdGhlIFdlYiBmcmFtZXdvcmssIGlzIG5v dw0KICBvd25lZCBhbmQgbWFpbnRhaW5lZCBieSBhIG5ldyB0ZWFtLCBvZjoNCg0KICDigKIgU2Fi aW5lIFNjaG1hbHR6IChAc2FiaW5lKSwgbWFpbnRhaW5lciBvZiBPQ2FtbC5vcmcNCiAg4oCiIFNl YmFzdGlhbiBXaWxsZW5icmluayAoIDxodHRwczovL2dpdGh1Yi5jb20vV2lsbGVuYnJpbms+ICks IGF1dGhvcg0KICAgIG9mIHRoZSBlZmZvcnQgdG8gcG9ydCBEcmVhbSB0byBFaW8NCiAg4oCiIFlh d2FyIEFtaW4gKEB5YXdhcmFtaW4pLCBhdXRob3Igb2YgZHJlYW0taHRtbCwgYW5kIHRoZSBXZWIg ZnJhbWV3b3JrDQogICAgUmVXZWINCg0KICDigKZhbW9uZyB0aGVpciBvdGhlciBwcm9qZWN0cyBh bmQgY29udHJpYnV0aW9ucyB0byB0aGUgT0NhbWwNCiAgY29tbXVuaXR5LiBBbGwgYXJlIG1ham9y IGFuZCBsb25nLXRlcm0gY29udHJpYnV0b3JzIHRvLCBhbmQgdXNlcnMgb2YsDQogIERyZWFtLg0K DQogIEnigJl2ZSBzdGVwcGVkIGJhY2sgZnJvbSBvd25lcnNoaXAgYW5kIG92ZXJhbGwgbWFpbnRl bmFuY2UsIGJ1dCB3aWxsDQogIHN0aWxsIHdvcmsgb24gcGFydHMgb2YgRHJlYW0gZXZlcnkgbm93 IGFuZCB0aGVuIGFzIGEgY29udHJpYnV0b3IsDQogIGFsb25nIHdpdGggYWxsIG9mIERyZWFt4oCZ cyBjb250cmlidXRvcnMgOnNsaWdodF9zbWlsZToNCg0KICBEcmVhbSBpcyBkaXNjdXNzZWQgaW4g dGhpcyBmb3J1bSwgaW4gaXRzIFtpc3N1ZSB0cmFja2VyXSwgWyN3ZWJkZXZdIGluDQogIHRoZSBP Q2FtbCBEaXNjb3JkLCBhbmQgWyNkcmVhbV0gb24gWnVsaXAuIERyZWFtIGhhcyBhIChyb3VnaGx5 KSB3ZWVrbHkNCiAgb3BlbiB2aWRlbyBjYWxsIG9uIERpc2NvcmQgZm9yIGNvbnRyaWJ1dG9ycyB0 byBkaXNjdXNzIHRlY2huaWNhbA0KICBpc3N1ZXMgd2l0aCBlYWNoIG90aGVyIGFuZCB3aXRoIG1h aW50YWluZXJzLg0KDQogIFdlbGNvbWUgdG8gU2FiaW5lLCBTZWJhc3RpYW4sIFlhd2FyLCB0aGUg bmV3IHRlYW0hDQoNCg0KW0RyZWFtXSA8aHR0cHM6Ly9naXRodWIuY29tL2NhbWx3b3Jrcy9kcmVh bT4NCg0KW2lzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vY2FtbHdvcmtzL2RyZWFt L2lzc3Vlcz4NCg0KWyN3ZWJkZXZdDQo8aHR0cHM6Ly9kaXNjb3JkLmNvbS9jaGFubmVscy80MzY1 NjgwNjAyODgxNzIwNDIvNDM5MDYyNzQ0MTA1NDg0Mjg4Pg0KDQpbI2RyZWFtXSA8aHR0cHM6Ly9v Y2FtbC56dWxpcGNoYXQuY29tLyNuYXJyb3cvY2hhbm5lbC81NTYwNjMtZHJlYW0+DQoNCg0KU2xp cHNob3chDQrilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6 Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zbGlwc2hvdy8xNjMzNy8xNz4NCg0KDQpQYXVsLUVs bGlvdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvIQ0KDQogIEl0IGlzIGluIGEgc3RhdGUg b2Ygc2xpcGxlc3NuZXNzIHRoYXQgSSBhbm5vdW5jZSB0aGUgbmV3IHJlbGVhc2Ugb2YNCiAgU2xp cHNob3chDQoNCiAgKlNsaXBzaG93IDAuOC4wOiBMZXMgZ25vbWVzIHZvbGV1cnMgZGUgU2xpcHNo b3cqDQoNCiAgVGhpcyByZWxlYXNlIGNvbWVzIHdpdGggYSBoYW5kZnVsIG9mIGJ1Z2ZpeGVzLCBp biBwYXJ0aWN1bGFyIG9uIHRoZQ0KICBuZXcgYW5kIGV4cGVyaW1lbnRhbCByZWNvcmQtYW5kLXJl cGxheSBmb3IgZHJhd2luZ3MuDQoNCiAgQnV0IHRoZSBzdGFyIG9mIHRoZSByZWxlYXNlIGlzICp0 aGUgbmV3IFtkb2N1bWVudGF0aW9uXSohIEZvcg0KICBpbnN0YW5jZSwgdGhlIHR1dG9yaWFsIG9u IFtzdHJ1Y3R1cmluZyB5b3VyIHByZXNlbnRhdGlvbiB2aXN1YWxseV0NCiAgd2lsbCBhbGxvdyB5 b3UgdG8gY3JlYXRlIHByZXNlbnRhdGlvbnMgc3VjaCBhcyB0aGlzIG9uZSwgcHJlc2VudGluZw0K ICBTbGlwc2hvdydzIGJ1c2luZXNzIG1vZGVsOg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vdXNl ci1hdHRhY2htZW50cy9hc3NldHMvNDE1MzljNzgtZjk5OC00NTk3LTkzOTItNGQ1NTU0MzVkNWEz Pg0KDQogIFRoZSB0dXRvcmlhbHMgYWxzbyBpbmNsdWRlcyBsaXZlIGNvZGUgYmxvY2tzLCBhbmQg U2xpcHNob3cgaGFzIG5vdyBhDQogIFtkZWRpY2F0ZWQgd2Vic2l0ZV0uDQoNCiAgSGVyZSBpcyB0 aGUgZnVsbCBjaGFuZ2Vsb2chDQoNCg0KW2RvY3VtZW50YXRpb25dIDxodHRwczovL3NsaXBzaG93 LnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS8+DQoNCltzdHJ1Y3R1cmluZyB5b3VyIHByZXNlbnRh dGlvbiB2aXN1YWxseV0NCjxodHRwczovL3NsaXBzaG93LnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJs ZS92aXN1YWwtc3RydWN0dXJlLmh0bWw+DQoNCltkZWRpY2F0ZWQgd2Vic2l0ZV0gPGh0dHBzOi8v c2xpcHNob3cub3JnPg0KDQpGZWF0dXJlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg 4oCiIEFkZCBhICJtaXJyb3IgbW9kZSIgdG8gdGhlIHNwZWFrZXIgdmlldywgd2hpY2ggbWlycm9y cyB0aGUgZW50aXJlDQogICAgc2NyZWVuIHlvdSBhcmUgc2hhcmluZyB3aXRoIHRoZSBhdWRpZW5j ZSAoIzE4OCkNCiAg4oCiIEFkZCBzdXBwb3J0IGZvciBleHRlcm5hbCBmaWxlcyB0aHJvdWdoIENM SSBhbmQgZnJvbnRtYXR0ZXIgKCMxOTEpDQogIOKAoiBBZGQgc2hvcnRjdXQgdG8gZGVsZXRlIG9y IHVuc2VsZWN0IHNlbGVjdGlvbiBpbiBkcmF3aW5nIGVkaXRpbmcNCiAgICAoIzE5MikNCiAg4oCi IEFkZCBhICJDbG9zZSBlZGl0aW5nIHBhbmVsIiBidXR0b24gd2hlbiB0aGVyZSBhcmUgbm8gc3Ry b2tlcyAoIzE5MikNCiAg4oCiIERlZmF1bHQgZmlsZSBuYW1lcyBmb3IgZHJhd2luZyByZWNvcmRp bmcgZGVwZW5kIG9uIHRoZWlyIG5hbWVzDQogICAgKCMxOTIpDQogIOKAoiBJbXByb3ZlIGAtbycg YXJndW1lbnQgd3J0IGRpcmVjdG9yaWVzICgjMTkwKQ0KICDigKIgSW5saW5lIFNWR3MgaW5zdGVh ZCBvZiBhZGRpbmcgdGhlbSBhcyBpbWFnZXMsIGFsbG93aW5nIHRoZSB1c2Ugb2YNCiAgICBjbGFz c2VzIGFuZCBpZHMgaW4gU1ZHcyAoIzE5MCkNCiAg4oCiIFJld29yayB0aGUgZG9jcyEgKCMxOTAp DQoNCg0KRml4DQrilYzilYzilYwNCg0KICDigKIgRml4IHBhdXNlcyB0aW1lIG5vdCB1cGRhdGVk IGFmdGVyIGEgcmVyZWNvcmRpbmcgKCMxOTIpDQogIOKAoiBGaXggZHJhd2luZyBlZGl0aW5nIHNo b3J0Y3V0cyB0cmlnZ2VyaW5nIGV2ZW4gd2hlbiBmb2N1c2luZyBvbiBhDQogICAgdGV4dGFyZWEg KCMxOTIpDQogIOKAoiBGaXggaW50ZXJhY3Rpb24gYmV0d2VlbiBmaWVsZHMgYW5kIGRyYXdpbmcg ZWRpdGluZyBzaG9ydGN1dHMgKCMxOTIpDQogIOKAoiBGaXggb3JkZXIgb2YgYGNsZWFyJyBhbmQg YGRyYXcnIGFjdGlvbjogdGhlIGZpcnN0IGNvbWVzIGZpcnN0ICgjMTkyKQ0KICDigKIgVXNlIC53 b2ZmMiBmb3IgZW1iZWRkZWQgZm9udHMgKCMxOTApDQoNCg0KICBUaGFua3MgYWdhaW4gdG8gTkxO ZXQgZm9yIFtzdXBwb3J0aW5nXSB0aGUgZGV2ZWxvcG1lbnQgb2YgU2xpcHNob3chDQoNCg0KW3N1 cHBvcnRpbmddIDxodHRwczovL25sbmV0Lm5sL3Byb2plY3QvU2xpcHNob3cvPg0KDQoNCkJhbmNv czogQSBwZXJzaXN0ZW50IEtleS1WYWx1ZSBzdG9yZSBiYXNlZCBvbiBST1dFWC9QLUFSVA0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tYmFuY29zLWEt cGVyc2lzdGVudC1rZXktdmFsdWUtc3RvcmUtYmFzZWQtb24tcm93ZXgtcC1hcnQvMTc3MTkvMT4N Cg0KDQpDYWxhc2NpYmV0dGEgUm9tYWluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSSBhbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBmaXJzdCByZWxlYXNl IG9mIFtiYW5jb3NdLCBvdXIgbmV3DQogIHBlcnNpc3RlbnQgS2V5LVZhbHVlIHN0b3JlLg0KDQog IEJhbmNvcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBhbiBBZGFwdGl2ZSBSYWRpeCBUcmVlIChb QVJUXSkgbW9kaWZpZWQNCiAgdG8gc3VwcG9ydCBwYXJhbGxlbCByZWFkcyBhbmQgd3JpdGVzIChb Uk9XRVhdKSBkaXJlY3RseSBvbiBhIGZpbGUNCiAgKGJhc2VkIG9uIHRoZSBbUkVDSVBFL1AtQVJU XSBhcHByb2FjaCkuDQoNCiAg4oCiIE91ciBwcm9qZWN0IGlzIGRlc2lnbmVkIGZvciBpbmRleGlu ZyB3aXRoIGZpbGUtYmFja2VkIHN0b3JhZ2UuDQogIOKAoiBXZSBwcm92aWRlIGFuIGltcGxlbWVu dGF0aW9uIGNvbXBhdGlibGUgd2l0aCB1bmlrZXJuZWxzLiBJdCBpcw0KICAgIGN1cnJlbnRseSBi ZWluZyB1c2VkIGJ5IFtrZXZpbl0sIGFuIEhUVFAvMS4xIHNlcnZlciB1bmlrZXJuZWwgdGhhdA0K ICAgIGV4cG9zZXMgcm91dGVzIGZvciBrZXkgaW5zZXJ0aW9uIGFuZCBsb29rdXAuDQogIOKAoiBU aGlzIHdvcmsgaXMgcGFydCBvZiBvdXIgYnJvYWRlciBnb2FsIHRvIGluZGV4IGVtYWlscyBieSB0 aGVpcg0KICAgIGBNZXNzYWdlLUlEJy4gQW4gZXh0ZW5zaW9uIG9mIG91ciB0b29sIFtibGF6ZV0g bm93IGFsbG93cyBzZWFyY2hpbmcNCiAgICB0aHJvdWdoIGFyY2hpdmVzIG5vdyAoaWYgeW91IGFy ZSBpbnRlcmVzdGluZyBhYm91dCBvdXIgYXJjaGl2ZQ0KICAgIHN5c3RlbSwgeW91IGNhbiB0YWtl IGEgbG9vayBbaGVyZV0pLiBUaGlzIGluZGV4aW5nIGFsc28gZW5hYmxlcw0KICAgIGVmZmljaWVu dCBlbWFpbCB0aHJlYWQgZXh0cmFjdGlvbiB1c2luZyBgSW4tUmVwbHktVG8nIGhlYWRlcnMuDQoN CiAgV2hpbGUgc3RpbGwgZXhwZXJpbWVudGFsLCB0aGUgcmVzdWx0cyDigJQgZXNwZWNpYWxseSB3 aGVuIHBhaXJlZCB3aXRoDQogIG91ciBbTWlvdV0gc2NoZWR1bGVyIOKAlCBhcmUgdmVyeSBwcm9t aXNpbmcuIFRoaXMgcmVsZWFzZSBvZiBbYmFuY29zXQ0KICBjb21lcyBhbG9uZ3NpZGUgc2V2ZXJh bCB1cGRhdGVzIGFjcm9zcyBvdXIgc3RhY2s6DQogIOKAoiBbZmx1eF06IE91ciBPQ2FtbCBzdHJl YW0gbGlicmFyeSBmb3IgTWlvdQ0KICDigKIgW2NhcnRvbl06IEZvciBtYW5pcHVsYXRpbmcgUEFD S3YyIGFyY2hpdmVzIChhcyB1c2VkIGJ5IEdpdCkNCiAg4oCiIFtic3RyXTogQSBsaWJyYXJ5IGZv ciBoYW5kbGluZyBiaWdieXRlcyBhbmQgbWVtb3J5IGJ1ZmZlcnMNCiAg4oCiIFtjYWNoZXRdOiBB IGxpYnJhcnkgdG8gY2FjaGUgYG1tYXAnIHN5c2NhbGwgcmVzdWx0cy4gTm90YWJseSwgdGhpcw0K ICAgIGluY2x1ZGUgc2lnbmlmaWNhbnQgd29yayBvbiBhbiBfYXN5bmNocm9ub3VzIHdyaXRlIHBp cGVsaW5lXyBmb3INCiAgICB1bmlrZXJuZWxzIG9uIGJsb2NrIGRldmljZXMNCg0KICBZb3UgY2Fu IGZpbmQgdGhlIHByb2plY3QgaGVyZTogPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2Jh bmNvcz4NCg0KICBGb3IgYSBkZWVwZXIgZGl2ZSBpbnRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBi YW5jb3MgYW5kIGl0cw0KICBhcHBsaWNhdGlvbiB0byBlbWFpbCBpbmRleGluZywgd2UgaGF2ZSBw cmVwYXJlZCBhIGRldGFpbGVkIGJsb2cgcG9zdA0KICBbaGVyZV0uDQoNCiAgSGFwcHkgaGFja2lu ZyENCg0KDQpbYmFuY29zXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvYmFuY29zPg0K DQpbQVJUXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9hcnQ+DQoNCltST1dFWF0gPGh0 dHBzOi8vZGIuaW4udHVtLmRlL35sZWlzL3BhcGVycy9hcnRzeW5jLnBkZj4NCg0KW1JFQ0lQRS9Q LUFSVF0gPGh0dHBzOi8vYXJ4aXYub3JnL3BkZi8xOTA5LjEzNjcwPg0KDQpba2V2aW5dIDxodHRw czovL2dpdGh1Yi5jb20vcm9idXItY29vcC9rZXZpbj4NCg0KW2JsYXplXSA8aHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9ibGF6ZT4NCg0KW2hlcmVdDQo8aHR0cHM6Ly9ibG9nLnJvYnVyLmNv b3AvYXJ0aWNsZXMvMjAyNS0wMS0wNy1jYXJ0b24tYW5kLWNhY2hldC5odG1sPg0KDQpbTWlvdV0g PGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL21pb3U+DQoNCltmbHV4XSA8aHR0cHM6Ly9n aXRodWIuY29tL3JvYnVyLWNvb3AvZmx1eD4NCg0KW2NhcnRvbl0gPGh0dHBzOi8vZ2l0aHViLmNv bS9yb2J1ci1jb29wL2NhcnRvbj4NCg0KW2JzdHJdIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXIt Y29vcC9ic3RyPg0KDQpbY2FjaGV0XSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvY2Fj aGV0Pg0KDQpbaGVyZV0gPGh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzLzIwMjUtMTgt MTItYmFuY29zLmh0bWw+DQoNCg0KcmVzdHJpY3RlZCAxLjIuMCBsaW1pdCB3aGljaCBzeXN0ZW0g b3BlcmF0aW9ucyBhbmQgd2hpY2ggcGFydHMgb2YgdGhlIGZpbGVzeXN0ZW0geW91ciBwcm9ncmFt IGNhbiBhY2Nlc3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXJlc3RyaWN0ZWQtMS0yLTAtbGltaXQt d2hpY2gtc3lzdGVtLW9wZXJhdGlvbnMtYW5kLXdoaWNoLXBhcnRzLW9mLXRoZS1maWxlc3lzdGVt LXlvdXItcHJvZ3JhbS1jYW4tYWNjZXNzLzE3NzMyLzE+DQoNCg0KcmVtb3Zld2luZ21hbiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvLA0KDQogIEkgYW0gaGFwcHkgdG8gYW5ub3Vu Y2UgYSBuZXcgdmVyc2lvbiBvZiBbcmVzdHJpY3RlZF0uDQoNCiAgVGhpcyBsaWJyYXJ5IGxldHMg eW91IGxpbWl0IHdoaWNoIHN5c3RlbSBvcGVyYXRpb25zIGFuZCB3aGljaCBwYXJ0cyBvZg0KICB0 aGUgZmlsZXN5c3RlbSB5b3VyIHByb2dyYW0gY2FuIGFjY2Vzcy4gQ2FsbCBpdCBhcyBlYXJseSBh cyBwb3NzaWJsZQ0KICBpbiB5b3VyIHByb2dyYW0gc28gdGhhdCB0aGUgcmVzdCBvZiB0aGUgY29k ZSBydW5zIHdpdGggcmVkdWNlZA0KICBwcml2aWxlZ2VzLiBDdXJyZW50bHksIGFjdHVhbCBlbmZv cmNlZCByZXN0cmljdGlvbnMgYXJlIGltcGxlbWVudGVkDQogIGZvciB0aGVzZSBvcGVyYXRpbmcg c3lzdGVtczoNCg0KICDigKIgT3BlbkJTRA0KICDigKIgTGludXggKG9ubHkgZmlsZXN5c3RlbSB2 aWV3KQ0KDQogIEV2ZW4gb24gb3RoZXIgb3BlcmF0aW5nIHN5c3RlbXMsIHlvdSBjYW4gc3RpbGwg dXNlIFtyZXN0cmljdGVkXSB0bw0KICBkb2N1bWVudCB3aGljaCBwcml2aWxlZ2VzIHlvdXIgcHJv Z3JhbSBuZWVkcy4gVXNlcnMgY2FuIHRoZW4gdGVzdCBpZg0KICB5b3VyIHByb2dyYW0gcmVzcGVj dHMgdGhlc2UgcHJvbWlzZXMgd2l0aCB0b29scyBzdWNoIGFzIFtwbGVkZ2Ugb24NCiAgTGludXhd LiBFbmpveSA6c2xpZ2h0X3NtaWxlOg0KDQogIOKAoiBbb3BhbV0NCiAg4oCiIFthcGldDQogIOKA oiBbZXhhbXBsZXNdDQogIOKAoiBbZ2l0IHJlcG9dDQogIOKAoiBbTGljZW5zZSBBR1BMXQ0KDQog IENIQU5HRUxPRzoNCg0KICDigKIgYWRkIExpbnV4IChvbmx5IGZpbGVzeXN0ZW0gdmlldykgdmlh IGxhbmRsb2NrKDcpDQogICAg4oCiIGV4Y2VwdCB1bmxpbmsvcmVtb3ZpbmcsIHdob2xlIG90aGVy IHRoaW5nIHdpdGgNCiAgICAgIExBTkRMT0NLX0FDQ0VTU19GU19SRUFEX0ZJTEUgaW4gbGFuZGxv Y2sNCiAg4oCiIGFkZCBbU2VtYW50aWMgVmVyc2lvbmluZ10NCiAg4oCiIGNoYW5nZSBkZXNjcmlw dGlvbiB0byBtYWtlIGl0IG1vcmUgY2xlYXINCiAg4oCiIHRlc3RlZCB3aXRoIGZsYW1iZGEgc3dp dGNoIG9uOg0KICAgIOKAoiB4ODZfNjQtb3BlbmJzZA0KICAgIOKAoiB4ODZfNjQtYXJjaC1saW51 eCwgeDg2XzY0LWFscGluZS1saW51eCAoTGFuZGxvY2sgQUJJIHZlcnNpb246IDcpDQoNCg0KW3Jl c3RyaWN0ZWRdDQo8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9yZXN0cmljdGVkL3Jl c3RyaWN0ZWQuMS4yLjAvPg0KDQpbcmVzdHJpY3RlZF0gPGh0dHBzOi8vcmVtb3Zld2luZ21hbi5j b2RlYmVyZy5wYWdlL3Jlc3RyaWN0ZWQvPg0KDQpbcGxlZGdlIG9uIExpbnV4XSA8aHR0cHM6Ly9q dXN0aW5lLmxvbC9wbGVkZ2UvPg0KDQpbb3BhbV0gPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFj a2FnZXMvcmVzdHJpY3RlZC9yZXN0cmljdGVkLjEuMi4wLz4NCg0KW2FwaV0gPGh0dHBzOi8vcmVt b3Zld2luZ21hbi5jb2RlYmVyZy5wYWdlL3Jlc3RyaWN0ZWQvPg0KDQpbZXhhbXBsZXNdDQo8aHR0 cHM6Ly9jb2RlYmVyZy5vcmcvcmVtb3Zld2luZ21hbi9yZXN0cmljdGVkL3NyYy9icmFuY2gvbWFp biN1c2FnZS1hbmQtZXhhbXBsZXM+DQoNCltnaXQgcmVwb10gPGh0dHBzOi8vY29kZWJlcmcub3Jn L3JlbW92ZXdpbmdtYW4vcmVzdHJpY3RlZD4NCg0KW0xpY2Vuc2UgQUdQTF0NCjxodHRwczovL2Vu Lndpa2lwZWRpYS5vcmcvd2lraS9HTlVfQWZmZXJvX0dlbmVyYWxfUHVibGljX0xpY2Vuc2U+DQoN CltTZW1hbnRpYyBWZXJzaW9uaW5nXSA8aHR0cHM6Ly9zZW12ZXIub3JnLz4NCg0KDQpkZWFkX2Nv ZGVfYW5hbHl6ZXIgMS4xLjANCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWRlYWQtY29kZS1hbmFseXplci0xLTEtMC8xNzcz NC8xPg0KDQoNCmZhbnRhemlvIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8gZXZlcnlvbmUsDQoNCiAgSSBh bSBoYXBweSB0byBhbm5vdW5jZSBbdGhlIHJlbGVhc2Ugb2YgdGhlIGRlYWRfY29kZV9hbmFseXpl ciAxLjEuMF0NCiAgKGF2YWlsYWJsZSB2aWEgYG9wYW0nKSAhDQoNCiAgVGhhbmtzIHRvIEBlZHdp bmFucywgQG5vamIsIGFuZCBAVGlibyBmb3IgdGhlaXIgY29udHJpYnV0aW9ucywNCiAgcmV2aWV3 cywgYW5kIGZlZWRiYWNrLg0KDQogIFRoaXMgcmVsZWFzZSBncmVhdGx5IGltcHJvdmVzIHRoZSBz dXBwb3J0IG9mIHByb2plY3RzIGJ1aWx0IHdpdGgNCiAgYGR1bmUnIGFuZCBpbnRyb2R1Y2VzIHNv bWUgW3VzZXIgZG9jdW1lbnRhdGlvbl0uICBUaGUgdG9vbCBzdGlsbA0KICByZXF1aXJlcyAqKk9D YW1sIDUuMioqLiBUaGVyZSBpcyBhIFt3b3JrIGluIHByb2dyZXNzIHRvIHN1cHBvcnQgT0NhbWwN CiAgNS4zXS4NCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRoaXMgcmVsZWFz ZSwgcGxlYXNlIFtyZXBvcnQgaXQgb24gdGhlDQogIGdpdGh1YiByZXBvc2l0b3J5XS4gIEZlZWRi YWNrIGFuZCBjb250cmlidXRpb25zIGFyZSB3ZWxjb21lLg0KDQoNClt0aGUgcmVsZWFzZSBvZiB0 aGUgZGVhZF9jb2RlX2FuYWx5emVyIDEuMS4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9MZXhpRmkv ZGVhZF9jb2RlX2FuYWx5emVyL3JlbGVhc2VzL3RhZy8xLjEuMD4NCg0KW3VzZXIgZG9jdW1lbnRh dGlvbl0NCjxodHRwczovL2dpdGh1Yi5jb20vTGV4aUZpL2RlYWRfY29kZV9hbmFseXplci9ibG9i LzEuMS4wL2RvY3MvVVNFUl9ET0MubWQ+DQoNClt3b3JrIGluIHByb2dyZXNzIHRvIHN1cHBvcnQg T0NhbWwgNS4zXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9MZXhpRmkvZGVhZF9jb2RlX2FuYWx5emVy L3B1bGwvMzg+DQoNCltyZXBvcnQgaXQgb24gdGhlIGdpdGh1YiByZXBvc2l0b3J5XQ0KPGh0dHBz Oi8vZ2l0aHViLmNvbS9MZXhpRmkvZGVhZF9jb2RlX2FuYWx5emVyL2lzc3Vlcz4NCg0KDQpPQ2Ft bCBzZWN1cml0eSB0ZWFtDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1vY2FtbC1zZWN1cml0eS10ZWFtLzE2OTAyLzExPg0KDQoNCkNvbnRpbnVpbmcg dGhpcyB0aHJlYWQsIEhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeW9uZSwgYXMgd2UgZGlzY3Vzc2VkIGluIHRoZSBl YXJsaWVyIHB1YmxpYyBtZWV0aW5nLCB3ZSBwbGFuDQogIHRvIGhhdmUgZXZlcnkgMyBtb250aHMg YW5vdGhlciBvbmUuDQoNCiAgVGhlIG5leHQgcHVibGljIHNlY3VyaXR5IG1lZXRpbmcgaXMgc2No ZWR1bGVkIGZvciBUaHVyc2RheSwgTWFyY2ggMTl0aA0KICAxNDowMCBDRVQgLSAxNjowMCBDRVQu IFBsZWFzZSBwdXQgdGhhdCBpbnRvIHlvdXIgY2FsZW5kYXIgaWYgeW91IHBsYW4NCiAgdG8gYXR0 ZW5kLg0KDQoNClByb3Bvc2FsOiBtYWtlIHRoZSBtaW5pbXVtIHRlc3RlZCBvcGFtIDIuMSBhbmQg aGlnaGVyDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0K ICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3Byb3Bvc2FsLW1ha2Ut dGhlLW1pbmltdW0tdGVzdGVkLW9wYW0tMi0xLWFuZC1oaWdoZXIvMTc3MzYvMT4NCg0KDQpBbmls IE1hZGhhdmFwZWRkeSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIE11 Y2ggYXMgd2UgZGlkIGEgd2hpbGUgYmFjayB3aXRoIFtyYWlzaW5nIHRoZSBtaW5pbXVtIHZlcnNp b24gb2YgT0NhbWwNCiAgdGVzdGVkIHRvIDQuMDhdLCBpdCdzIG5vdyB0aW1lIHRvIHJhaXNlIHRo ZSBtaW5pbXVtIHZlcnNpb24gb2Ygb3BhbQ0KICB0aGF0IHdlIHRlc3QgaW4gdGhlIENJIG1hdHJp eC4NCg0KICBbb3BhbSAyLjAuMCB3YXMgcmVsZWFzZWRdIGluIDIwMTgsIGFuZCBldmVyIHNpbmNl IHRoZW4gdGhlIERvY2tlcg0KICBpbWFnZXMgaGF2ZSBbYnVpbHQgZXZlcnkgdmVyc2lvbl0sIHdp dGggdGhlIGRlZmF1bHQgYmVpbmcgdGhlIG1pbmltdW0NCiAgdmVyc2lvbiAoMi4wLngpIGFsbCB0 aGUgd2F5IHRocm91Z2ggdG8gMi41LnguDQoNCiAgSSBub3cgcHJvcG9zZSB0aGF0IHdlIHJhaXNl IHRoZSBtaW5pbXVtIHRlc3RlZCB2ZXJzaW9uIG9mIG9wYW0gdG8NCiAgMi4xLnguIExvb2tpbmcg aW4gW3JlcG9sb2d5L29wYW1dLCB0aGUgb25seSBub3RhYmxlIGRpc3RybyBzdGlsbA0KICBzaGlw cGluZyBvcGFtIDIuMCBpcyBVYnVudHUgMjAuMDQsIHdoaWNoIHdlbnQgRU9MIGluIE1heSAyMDI1 LiAgVWJ1bnR1DQogIDI0LjA0IHN0aWxsIGhhcyBoYXZlIDIuMS54LCBzbyBJIGV4cGVjdCB0aGlz IHdpbGwgYmUgdGhlIHRlc3RpbmcgZmxvb3INCiAgZm9yIHNvbWUgeWVhcnMgdW50aWwgdGhhdCBy b3RhdGVzIG91dC4NCg0KICBUaGUgbW9zdCBvYnNlcnZhYmxlIGltcHJvdmVtZW50IGZyb20gdGhp cyB3aWxsIGJlIHRoZSBvcGFtLXJlcG9zaXRvcnkNCiAgQ0kgJ1RoZSBhY3Rpb25zIHRvIHByb2Nl c3MgaGF2ZSBjeWNsaWMgZGVwZW5kZW5jaWVzJyBmYWlsdXJlIHdpbGwgbm8NCiAgbG9uZ2VyIGJ1 ZyB1cyBmb3IgZXZlcnkgcGFja2FnZSBzdWJtaXR0ZWQgdGhhdCBoYXMgYHt3aXRoLXRlc3R9Jw0K ICBjbGF1c2VzIQ0KDQoNCltyYWlzaW5nIHRoZSBtaW5pbXVtIHZlcnNpb24gb2YgT0NhbWwgdGVz dGVkIHRvIDQuMDhdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3JhaXNpbmctdGhlLW1p bmltdW0tdGVzdGVkLXZlcnNpb24tb2Ytb2NhbWwtdG8tNC0wNS1vci00LTA4LWZyb20tNC0wMi8x MjQ2ND4NCg0KW29wYW0gMi4wLjAgd2FzIHJlbGVhc2VkXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tb3BhbS0yLTAtMC1maW5hbC1yZWxlYXNlLWFuZC1yZXBvc2l0b3J5LXVwZ3Jh ZGUvMjU4NT4NCg0KW2J1aWx0IGV2ZXJ5IHZlcnNpb25dDQo8aHR0cHM6Ly9naXRodWIuY29tL29j dXJyZW50L29jYW1sLWRvY2tlcmZpbGUvYmxvYi9tYXN0ZXIvc3JjLW9wYW0vb3BhbS5tbGkjTDQ0 LUw1Mj4NCg0KW3JlcG9sb2d5L29wYW1dIDxodHRwczovL3JlcG9sb2d5Lm9yZy9wcm9qZWN0L29w YW0vdmVyc2lvbnM+DQoNCg0KY3NleHAtcXVlcnkgaW5pdGlhbCByZWxlYXNlDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1jc2V4cC1xdWVyeS1pbml0aWFsLXJlbGVhc2UvMTc3MzcvMT4NCg0KDQpKb3NoIEJl cmRpbmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgY3NleHAtcXVlcnkgMC4xLjAgW29w YW0gcGFja2FnZV0gaXMgbm93IGF2YWlsYWJsZS4NCg0KICBJZiB5b3UgaGF2ZSBldmVyIHdhbnRl ZCB0byBxdWVyeSBlLmcuIHRoZSBvdXRwdXQgb2YgYGR1bmUgZGVzY3JpYmUnDQogIChidXQgZGlk bid0IHdhbnQgdGhlIGRlcGVuZGVuY3kgY29uZSBvZiBbc2V4cF0pLCB0aGVuIFtjc2V4cC1xdWVy eV0NCiAgbWlnaHQgYmUgaW50ZXJlc3RpbmcuDQoNCiAgYGNzZXhwLXF1ZXJ5JyBpcyBhIG1pbmlt YWwgY29tbWFuZC1saW5lIHRvb2wgdG8gcXVlcnkgW2Nhbm9uaWNhbA0KICBzLWV4cHJlc3Npb25z XSAoY3NleHApIGZyb20gc3RkaW4uIEZvciBleGFtcGxlLA0KICDilIzilIDilIDilIDilIANCiAg 4pSCIGR1bmUgZGVzY3JpYmUgd29ya3NwYWNlIC0tZm9ybWF0PWNzZXhwIHwgY3NleHAtcXVlcnkg JyhmaWVsZCByb290KScNCiAg4pSU4pSA4pSA4pSA4pSADQogIHdpbGwgZXh0cmFjdCB0aGUgZHVu ZSBwcm9qZWN0IHJvb3QuDQoNCiAgSGFwcHkgaGFja2luZyENCg0KDQpbb3BhbSBwYWNrYWdlXSA8 aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9jc2V4cC1xdWVyeS8+DQoNCltzZXhwXSA8 aHR0cHM6Ly9naXRodWIuY29tL2phbmVzdHJlZXQvc2V4cD4NCg0KW2NzZXhwLXF1ZXJ5XSA8aHR0 cHM6Ly9naXRodWIuY29tL2piZXJkaW5lL2NzZXhwLXF1ZXJ5Pg0KDQpbY2Fub25pY2FsIHMtZXhw cmVzc2lvbnNdDQo8aHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQ2Fub25pY2FsX1MtZXhw cmVzc2lvbnM+DQoNCg0KT3RoZXIgT0NhbWwgTmV3cw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCkZyb20gdGhlIG9jYW1sLm9yZyBibG9nDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIZXJlIGFyZSBsaW5rcyBmcm9tIG1hbnkgT0NhbWwgYmxvZ3MgYWdncmVn YXRlZCBhdCBbdGhlIG9jYW1sLm9yZw0KICBibG9nXS4NCg0KICDigKIgW0V4dGVuZGluZyBSUEMg Y2FwYWJpbGl0aWVzIGluIE9DdXJyZW50XQ0KICDigKIgW0VtYWlsIG5vdGlmaWNhdGlvbnMgY29t ZSB0byBNb2xseW1hd2tdDQogIOKAoiBbb3BlbiBDb3JlXQ0KDQoNClt0aGUgb2NhbWwub3JnIGJs b2ddIDxodHRwczovL29jYW1sLm9yZy9ibG9nLz4NCg0KW0V4dGVuZGluZyBSUEMgY2FwYWJpbGl0 aWVzIGluIE9DdXJyZW50XQ0KPGh0dHBzOi8vd3d3LnR1bmJ1cnkub3JnLzIwMjYvMDEvMjYvb2N1 cnJlbnQtcnBjLz4NCg0KW0VtYWlsIG5vdGlmaWNhdGlvbnMgY29tZSB0byBNb2xseW1hd2tdDQo8 aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvbW9sbHltYXdrLWVtYWlsLW5vdGlmcy5o dG1sPg0KDQpbb3BlbiBDb3JlXQ0KPGh0dHBzOi8vd3d3LmRyYTI3LnVrL2Jsb2cvcGxhdGZvcm0v MjAyNi8wMS8xOS9wbG90dGluZy1hLW5ldy1jb3Vyc2UuaHRtbD4NCg0KDQpPbGQgQ1dODQrilZDi lZDilZDilZDilZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBj YW4gW3NlbmQgbWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28g dGFrZSBhIGxvb2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBh cmNoaXZlc10uDQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsg YnkgbWFpbCwgeW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtB bGFuIFNjaG1pdHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0 dEBwb2x5dGVjaG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9h bGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8v c3ltcGEuaW5yaWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxo dHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 20 to 27, 202= 6.

    lwt-to-eio: Automating the mechanical parts of Lwt -> Eio m= igration

    oug-t announced

    Hi everyone,

    Like many of you, I=E2=80=99ve been looking into migrating my libraries fro= m Lwt to Eio to take advantage of OCaml 5=E2=80=99s direct-style concurrenc= y. While the manual migration guides are excellent, I found myself making t= he same mechanical changes over and over=E2=80=94flattening binds, unwrappi= ng promises, and rewriting maps.

    So, I built lwt-to-eio, a tool that automates the borin= g parts of this transition.

    Repo: https://github= .com/oug-t/lwt-to-eio

    What it does (The Magic)

    It parses your OCaml source code and performs AST-level rewrites to transfo= rm monadic Lwt patterns into direct-style Eio code.

    Input (Lwt):

    let fetch_data id =3D
      Lwt.bind (Db.get_user id) (fun user ->
        Db.get_posts =
    user.id >>=3D (fun=
     posts ->
          Lwt_list.ma=
    p_p process posts
        )
      )
    

    Output (Eio)

    let fetch_data id =3D
      let user =3D Lwt_eio.Promise.await_lwt (Db.get_user id) in
      let posts =3D Lwt_eio.Promise.await_lwt (Db.get_posts user.id) in
      Eio.Fiber.List.=
    map process posts
    

    Current Status & Help Wanted

    This is currently an MVP. It handles the most common patterns I enco= untered (binds, map_p, sleep, return= ), but there is plenty of surface area left to cover.

    I'm looking for contributors to help add rules for other common patterns. I= 've tagged a few issues as "Good First Issues" if anyone wants to di= p their toes into ppxlib and AST rewriting:

    • Lwt.catch -> try/with: Transforming= monadic error handling to direct style exceptions.
    • Lwt_io support: Mapping legacy IO functions to Eio = buffers.

    Feedback, PRs, and "It broke on my file!" reports are all very welcome.

    Happy hacking!

    The new owners-maintainers of Dream

    Anton Bachin announced

    I am very pleased to announce that Dream, the Web framework, is now owned and maintained by a new t= eam, of:

    • Sabine Schmaltz (@sabine), maintainer of OCaml.org
    • Sebastian Willenbrink ( http= s://github.com/Willenbrink ), author of the effort to port Dream to Eio=
    • Yawar Amin (@yawaramin), author of dream-html, and the Web framework Re= Web

    =E2=80=A6among their other projects and contributions to the OCaml communit= y. All are major and long-term contributors to, and users of, Dream.

    I=E2=80=99ve stepped back from ownership and overall maintenance, but will = still work on parts of Dream every now and then as a contributor, along wit= h all of Dream=E2=80=99s contributors :slight_smile:

    Dream is discussed in this forum, in its issue tracker, #webdev in the OCaml Discord= , and = #dream on Zulip. Dream has a (roughly) weekly open video call on Discor= d for contributors to discuss technical issues with each other and with mai= ntainers.

    Welcome to Sabine, Sebastian, Yawar, the new team!

    Slipshow!

    Paul-Elliot announced

    Hello!

    It is in a state of sliplessness that I announce the new release of Slipsho= w!

    Slipshow 0.8.0: Les gnomes voleurs de Slipshow

    This release comes with a handful of bugfixes, in particular on the new and= experimental record-and-replay for drawings.

    But the star of the release is the new documentation! For instance, the tutorial on = structuring your presentation visually will allow you to create presen= tations such as this one, presenting Slipshow's business model:

    https://github.com/user-attachments/assets/4= 1539c78-f998-4597-9392-4d555435d5a3

    The tutorials also includes live code blocks, and Slipshow has now a dedicated website.

    Here is the full changelog!

    Features

    • Add a "mirror mode" to the speaker view, which mirrors the entire scree= n you are sharing with the audience (#188)
    • Add support for external files through CLI and frontmatter (#191)
    • Add shortcut to delete or unselect selection in drawing editing (#192)<= /li>
    • Add a "Close editing panel" button when there are no strokes (#192)
    • Default file names for drawing recording depend on their names (#192)
    • Improve -o argument wrt directories (#190)
    • Inline SVGs instead of adding them as images, allowing the use of class= es and ids in SVGs (#190)
    • Rework the docs! (#190)

    Fix

    • Fix pauses time not updated after a rerecording (#192)
    • Fix drawing editing shortcuts triggering even when focusing on a textar= ea (#192)
    • Fix interaction between fields and drawing editing shortcuts (#192)
    • Fix order of clear and draw action: the first= comes first (#192)
    • Use .woff2 for embedded fonts (#190)

    Thanks again to NLNet for su= pporting the development of Slipshow!

    Bancos: A persistent Key-Value store based on ROWEX/P-ART

    Calascibetta Romain announced

    I am pleased to announce the first release of bancos, our new persistent Key-Value store.

    Bancos is an implementation of an Adaptive Radix Tree (ART) modified to support parallel reads and wr= ites (ROWEX) = directly on a file (based on the RECIPE/P-ART approach).

    • Our project is designed for indexing with file-backed storage.
    • We provide an implementation compatible with unikernels. It is currentl= y being used by kevin, = an HTTP/1.1 server unikernel that exposes routes for key insertion and look= up.
    • This work is part of our broader goal to index emails by their Me= ssage-ID. An extension of our tool blaze now allows searching through archives now (if you a= re interesting about our archive system, you can take a look here).= This indexing also enables efficient email thread extraction using I= n-Reply-To headers.

    While still experimental, the results =E2=80=94 especially when paired with= our Miou scheduler =E2= =80=94 are very promising. This release of bancos comes alongside several updates across our stac= k:

    • flux: Our OCaml stre= am library for Miou
    • carton: For manipu= lating PACKv2 archives (as used by Git)
    • bstr: A library for = handling bigbytes and memory buffers
    • cachet: A library = to cache mmap syscall results. Notably, this include significa= nt work on an asynchronous write pipeline = for unikernels on block devices

    You can find the project here: https://github.com/robur-coop/bancos

    For a deeper dive into the implementation of bancos and its application to = email indexing, we have prepared a detailed blog post here.

    Happy hacking!

    restricted 1.2.0 limit which system operations and which parts= of the filesystem your program can access

    removewingman announced

    Hello,

    I am happy to announce a new version of restricted.

    This library lets you limit which system operations and which parts of the = filesystem your program can access. Call it as early as possible in your pr= ogram so that the rest of the code runs with reduced privileges. Currently,= actual enforced restrictions are implemented for these operating systems:

    • OpenBSD
    • Linux (only filesystem view)

    Even on other operating systems, you can still use restricted to document which privil= eges your program needs. Users can then test if your program respects these= promises with tools such as pledge= on Linux. Enjoy :slight_smile:

    CHANGELOG:

    • add Linux (only filesystem view) via landlock(7)
      • except unlink/removing, whole other thing with LANDLOCK_ACCESS_FS_READ_= FILE in landlock
    • add Semantic Versioning
    • change description to make it more clear
    • tested with flambda switch on:
      • x86_64-openbsd
      • x86_64-arch-linux, x86_64-alpine-linux (Landlock ABI version: 7)

    dead_code_analyzer 1.1.0

    fantazio announced

    Hello everyone,

    I am happy to announce the release of the dead_code_analyzer 1.1.0 (av= ailable via opam) !

    Thanks to @edwinans, @nojb, and @Tibo for their contributions, reviews, and= feedback.

    This release greatly improves the support of projects built with dune= and introduces some user documentation. The tool still requires OCaml 5.2. There is a work in progress to suppo= rt OCaml 5.3.

    If you encounter a problem with this release, please report it on the github repositor= y. Feedback and contributions are welcome.

    OCaml security team

    Continuing this thread, Hannes Mehnert announced

    Dear everyone, as we discussed in the earlier public meeting, we plan to ha= ve every 3 months another one.

    The next public security meeting is scheduled for Thursday, March 19th 14:0= 0 CET - 16:00 CET. Please put that into your calendar if you plan to attend.

    Proposal: make the minimum tested opam 2.1 and higher

    Anil Madhavapeddy announced

    Much as we did a while back with r= aising the minimum version of OCaml tested to 4.08, it's now time to ra= ise the minimum version of opam that we test in the CI matrix.

    opam 2.0.0 was released in 2018, and ever since t= hen the Docker images have built every version, wit= h the default being the minimum version (2.0.x) all the way through to 2.5.= x.

    I now propose that we raise the minimum tested version of opam to 2.1.x. Lo= oking in repology/op= am, the only notable distro still shipping opam 2.0 is Ubuntu 20.04, wh= ich went EOL in May 2025. Ubuntu 24.04 still has have 2.1.x, so I expect = this will be the testing floor for some years until that rotates out.

    The most observable improvement from this will be the opam-repository CI 'T= he actions to process have cyclic dependencies' failure will no longer bug = us for every package submitted that has {with-test} clauses!

    csexp-query initial release

    Josh Berdine announced

    The csexp-query 0.1.0 opam package is now available.

    If you have ever wanted to query e.g. the output of dune describe (but didn't want the dependency cone of sexp), then csexp-query might be interesting.

    csexp-query is a minimal command-line tool to query canonical s-express= ions (csexp) from stdin. For example,

    dune describe workspace --format=3Dcsexp | csexp-query '(field root)'
    

    will extract the dune project root.

    Happy hacking!

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=DhIZOIjW; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 2B1FD400A5 for ; Tue, 3 Feb 2026 10:05:06 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=oGv0ya3tUL0/jzxMvpSaIzWFMIc8K6MSMn3lk3MZTa4=; b=DhIZOIjWI9GUsrsKykEyWinOHvZCS8lVDA1fZwavu0TeyE3El5LwwJQi tl/wVuQcV7DwM6U7KdURNpBj2kBiMo4fX48/gEppEyN00C+8VxpoWkA/t X8YeDffHmqqNIlZ1XzDl32vTbTae6Zt5sygZe1qHigaOCZlA9+QKN3Oed w=; X-CSE-ConnectionGUID: bWL/BG4HTqKwqXbYuo7Zqg== X-CSE-MsgGUID: 58J3j00RRdWz8I90V25oiA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,270,1763420400"; d="scan'208,217";a="261651711" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Feb 2026 11:05:05 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 71C91832C9; Tue, 3 Feb 2026 11:05:05 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id A3031832C9 for ; Tue, 3 Feb 2026 11:04:54 +0100 (CET) X-CSE-ConnectionGUID: bjqrmdArSeiuRPSs+QinUw== X-CSE-MsgGUID: dylKslqySnWV1RZXhD4TaQ== IronPort-SDR: 6981c845_owKn6NvCLNgU9stJz22mrJlAu9L1axqexyU4Yfn2Qc14/+S eAL4kizIwGSsy6EExSo42Ofeupm72OBfNZMlLgw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EjAgDTx4FpjyIeaIFaFoQAgQQaAWxfGRoHCEkDhFWBY?= =?us-ascii?q?4FsjiWBFpsygWmBEQMYFgUeFQEDAQ0uARsEAQIEAQEDAQIBggyBPXFABAICj?= =?us-ascii?q?RUCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABA?= =?us-ascii?q?QEBAQE5BUmGTw2CRS0kcWUJBgEBAQEBAQEBAScBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAgQHAQECDAseZwkKEwEBMQcYI?= =?us-ascii?q?wMUAQYDAhEBNRcBEhQGgiREAYIiAk8DBQwGlEibPhB6gTKBAYIMAQEGgQg+A?= =?us-ascii?q?wICBwIFDy/XQIJRgWcJgTUYhW6CShsBKklrAQKEKSAJhDQnD4FVRIEVNYI9B?= =?us-ascii?q?2+CPwsXAQEBARhCAkgYAQFNCYMlgmmCJnoUHYwnh3CBREszLAFVExcLBwVeg?= =?us-ascii?q?QgDKi8tbjIdgSM+FzJYGwcFiTYPiRKBa3lBAwttPTcUG49vQhkaKoFAJQ4+A?= =?us-ascii?q?hUUXwUBCgkWAlgOKgEHOQ8IHQ8YBQEWAh4PA5JDFCUDKo9cjhiTdm00B4Qfg?= =?us-ascii?q?V4GDIkIgSaWB4QEgVeFQIV8hwKSUiKYZCKCNocogSYJglqVYCiFMIF/I0liM?= =?us-ascii?q?TMaMEMNCAKCHAEBATEJCjwcD41/hB8DgT6BAiSBdDu6QjFCNQIBAQcDLgIHA?= =?us-ascii?q?QoBAQMJhWIBAYw6bl0BAQ?= IronPort-PHdr: A9a23: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 5kNO8py/XDnF/EdUKU= IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:Y2bCb68570vkoKx3eyRuk+DnI+orL9Y04lQ7vn2ZKCYlEPBw8v rF8cjzuiWUtN98Yh0dcLO7Scq9qBHnlaKdiLN5VdyftWLd1ldAQrsM0aLShxXeXwf++uRe2a oISdkaNPTASX5gg4Lf6Am8euxQp+VvHZrY4dvj8w== X-Talos-CUID: 9a23:Jp4Yg22l4Cw/RrlKFsogY7xfEMI8aHjR5W3rLk6lM15SU/6sSFmt5/Yx X-Talos-MUID: 9a23:x2PC4AipwNeUlt57zUlBDMMpONZswL+qEVE2l6o44vO2BSxcZwuUtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,270,1763420400"; d="scan'208,217";a="261651563" X-MGA-submission: =?us-ascii?q?MDHdDI3JvE3+jznJvymnBoHZNpUzbS5jmapq7H?= =?us-ascii?q?xAVFd1ItHmdxyBWnTn2WieaDzFHhO9jCSKhSYfW5sacIms9YjM7r+88C?= =?us-ascii?q?LyKIfHX541VC/gcGXmpVHTdA2O1rYdVcr3d6L7maE0p1Z35Z1NQX4in6?= =?us-ascii?q?eF4rnrEBRv7sjZqEAae8Qc+g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Feb 2026 11:04:53 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4DEF91A31F; Tue, 3 Feb 2026 11:04:53 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Feb 2026 11:04:52 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 3 11:04:53 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499982, queueID=7861E1A3A2 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19444 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of January 27 to February 03, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Ofortune! OUPS meetup february 2026 shakuhachi v0.2.0 OCaml security grants New release of Menhir (20260122) OCaml for Industry Mset 0.2.0 - new library for small multisets Lwt.6.1.0, Lwt_ppx.6.1.0 Other OCaml News Old CWN Ofortune! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Tim ats announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi everyone, I'm very glad to announce the release of [Ofortune]! Ofortune is a fortune-teller written in OCaml. For those who didn't know, `fortune' is a small NetBSD utility which, according to its [man page], "prints a random, hopefully interesting, adage". Even though the goal of Ofortune is not to behave exactly like the legacy implementation, it shares most of the same command-line flags. By default, Ofortune searches fortune files in the directory `/usr/share/games/fortune', but you may directly set the files used to pick a random fortune (with eventually an associated probability) by doing the following `ofortune 60% quotations 40% funny-quotations'. I think that ofortune is one of those software programs that is moderately interesting unless you give it an excellent database to work with, so feel free to write your own cookie files. Your can for you can place it in your bashrc file to display a random quote each time you open a terminal. Ofortune is written in dependance free OCaml > 5.4. To install it, type (this will install an executable named `ofortune' in your path): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 git clone https://git.sr.ht/~tim-ats-d/ofortune && cd ofortune = && make native && install -T ofortune_unix.native /bin/ofortune =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 An online version compiled with js_of_ocaml is available at this address: . Ofortune is distributed under the LGPL-3.0 license, and the source code is available [here]. [Ofortune] [man page] [here] OUPS meetup february 2026 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ancolie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The next OUPS meetup will take place on *Wednesday, 25th of February* 2026. It will start at *6:30pm* at the *4 place Jussieu* in Paris. It will be in the in the *Esclangon building* (amphi Astier). Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. Moreover, we=E2=80=99d like to announce that the organizing team moved to= the [OCaml Zulip]. Feel free to contact us there if you=E2=80=99d like to sug= gest talks. =E2=80=94 This time we=E2=80=99ll have the following talks: *Coccinelle, for C and for Rust =E2=80=93 Julia Lawall* Coccinelle is a tool for automating complex repetitive searches and transformations in source code. It was originally developed for the C language, targetting the Linux kernel, but we have recently started working on Rust. This talk will give an overview of Coccinelle targeting C, present the main design decisions and how they translate to Rust, and present some practical examples involving Rust. Both versions of Coccinelle are available in open source. =E2=80=A2 =E2=80=A2 *OCaml and the MOPSA static analysis platform =E2=80=93 Marco Milanese* In this talk we present MOPSA, a static analysis platform built in OCaml: MOPSA implements a sound analysis (based on the theory of abstract interpretation), with an emphasis on reusability and modularity of abstractions. To this end each domain performs a simple, targeted, simplification of the program and it can be swapped or combined with other domains to tune the precision/performance tradeoff of the analysis. OCaml and its type and module systems play a crucial role to achieve this goal.. we will see how monads, modules and abstract data types (and more!) naturally describe the components of a static analysis tool. =E2=80=94 After the talks there will be some pizzas offered by the [OCaml Software Foundation] and later on we=E2=80=99ll move to a pub nearby as u= sual. [register on meetup ] [OUPS=E2=80=99 website ] [OCaml Zulip] [OCaml Software Foundation] shakuhachi v0.2.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90 Archive: EruEri announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm happy to announce the release [shakuhachi v0.2.0]. Shakuhachi is a music collection manager. It aims to be a rather simple collection manager extensible by plugins. This release is mostly a bug-fix release, but some new functions are exposed through its API. Sincerely yours. [shakuhachi v0.2.0] OCaml security grants =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear OCaml hackers, we're pleased to announce that there are grants (up to 100_000 EUR) available for the broad topic of OCaml and security. The main idea is to strengthen the OCaml ecosystem in terms of security - being it tooling, documentation, guides, =E2=80=A6. Your submitted proposal (until March 1st) will be reviewed by the OCaml security team (). This wouldn't be possible with the OCSF () and their sponsors. If you have an idea, please go to and submit your proposal. Thanks, Hannes (in the name of the OCaml security team) New release of Menhir (20260122) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 I am pleased to announce a new version of Menhir. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update && opam install menhir.20260122 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The main new feature is a brand new GLR back-end. This back-end is selected by the command line switch `--GLR'. GLR is a non-deterministic parsing algorithm; it is useful when the grammar lies outside the class LR(1), either because the grammar is unambiguous but requires more than one token of lookahead, or because the grammar is truly ambiguous. For more information on GLR, please [read the manual]. There are also many minor changes in this release; please see [the change log] for details. Happy parsing, Fran=C3=A7ois. [read the manual] [the change log] OCaml for Industry =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90 Archive: Nicolas Ojeda Bar announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 Dear community, This Friday, Feb 6 at 15:00-17:00 CET the OCSF is organizing a video call in collaboration with Tarides and OCamlPro to discuss all aspects of OCaml relevant to __industrial__ users. We have invited all OCSF sponsors to participate, but would be very happy to welcome other industrial users (who are not currently OCSF sponsors) if they want to participate. So, if you are an industrial user of OCaml and would like to participate, please get in touch and I will forward the meeting details. Thanks! Cheers, Nicolas Mset 0.2.0 - new library for small multisets =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90 Archive: Jean Christophe Filliatre announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80 Dear OCaml community, I=E2=80=99m pleased to announce the first release of `mset', a library th= at implements multisets as soon as they are small enough to fit inside a single `int' (as a bitset). It is available via `opam' and here at GitHub: =E2=80=A2 [https://github.com/backtracking/mset] =E2=80=A2 [documentation] I implemented this library as part of a project to [count anagrams] but I anticipate it might be useful for other purposes. Happy hacking, Jean-Christophe [https://github.com/backtracking/mset] [documentation] [count anagrams] Lwt.6.1.0, Lwt_ppx.6.1.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Rapha=C3=ABl Proust announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 *Lwt.6.1.0* has been release. It contains some fixes (see full [changelog], special thanks to @kit-ty-kate and @otini) as well as the following notable addition: =E2=80=A2 New `Lwt_engine.engine_id' to know what underlying engine Lwt is currently using. *Lwt_ppx.6.1.0* (also *Lwt_ppx.5.9.3*) has been released. It contains a fix to correctly carry type annotations: `let%lwt x : t =3D =E2=80=A6 = in =E2=80=A6' now produces code that correctly place the `t' annotation. (This was caused by a change in ppxlib which was not accounted for previously.) Versions 6.0.0 and 5.9.2 or lwt_ppx are marked as `avoid-version' in opam-repository. They are fine to use as long as you don't use type annotations but you should update to 6.1.0 or 5.9.3. Special thanks to @Halbaroth for the bug report. [changelog] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [My (very) fast zero-allocation webserver using OxCaml] =E2=80=A2 [Weeknotes for weeks 4-5] =E2=80=A2 [What Happened in January 2026?] =E2=80=A2 [ OCaml.org Now Uses `odoc' 3: What=E2=80=99s New?] =E2=80=A2 [Getting Claude to complete the spec] [the ocaml.org blog] [My (very) fast zero-allocation webserver using OxCaml] [Weeknotes for weeks 4-5] [What Happened in January 2026?] [ OCaml.org Now Uses `odoc' 3: What=E2=80=99s New?] [Getting Claude to complete the spec] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 27 to Februar= y 03, 2026.

    Ofortune!

    Tim ats announced

    Hi everyone,

    I'm very glad to announce the release of Ofortune! Ofortune is a fortune-teller written in OCaml= . For those who didn't know, fortune is a small NetBSD utility= which, according to its man page, "prints a random, hopefully interesting, adage".

    3D"ced911b15beffb91=

    Even though the goal of Ofortune is not to behave exactly like the legacy i= mplementation, it shares most of the same command-line flags. By default, O= fortune searches fortune files in the directory /usr/share/games/fort= une, but you may directly set the files used to pick a random fortun= e (with eventually an associated probability) by doing the following = ofortune 60% quotations 40% funny-quotations.

    I think that ofortune is one of those software programs that is moderately = interesting unless you give it an excellent database to work with, so feel = free to write your own cookie files. Your can for you can place it in your = bashrc file to display a random quote each time you open a terminal.

    Ofortune is written in dependance free OCaml > 5.4. To install it, type = (this will install an executable named ofortune in your path):

    git clone https://git.sr.ht/~tim-ats-d/ofortune && cd ofortune &=
    ;& make native && install -T ofortune_unix.native /bin/ofortune
    

    An online version compiled with js_of_ocaml is available at this address: <= a href=3D"https://site.condor-du-plateau.fr/ofortune-web.html">https://site= .condor-du-plateau.fr/ofortune-web.html.

    Ofortune is distributed under the LGPL-3.0 license, and the source code is = available here.

    OUPS meetup february 2026

    ancolie announced

    The next OUPS meetup will take place on Wednesday, 25th of February = 2026. It will start at 6:30pm at the 4 place Jussieu in Paris= . It will be in the in the Esclangon building (amphi Astier).

    Please, register on meetup as soon as possible to let us know how ma= ny pizza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    Moreover, we=E2=80=99d like to announce that the organizing team moved to t= he OCaml Zulip. Feel free to co= ntact us there if you=E2=80=99d like to suggest talks.

    This time we=E2=80=99ll have the following talks:

    Coccinelle, for C and for Rust – Julia Lawall

    Coccinelle is a tool for automating complex repetitive searches and transfo= rmations in source code. It was originally developed for the C language, ta= rgetting the Linux kernel, but we have recently started working on Rust. Th= is talk will give an overview of Coccinelle targeting C, present the main d= esign decisions and how they translate to Rust, and present some practical = examples involving Rust. Both versions of Coccinelle are available in open = source.

    OCaml and the MOPSA static analysis platform – Marco Milanese

    In this talk we present MOPSA, a static analysis platform built in OCaml: M= OPSA implements a sound analysis (based on the theory of abstract interpret= ation), with an emphasis on reusability and modularity of abstractions.

    To this end each domain performs a simple, targeted, simplification of the = program and it can be swapped or combined with other domains to tune the pr= ecision/performance tradeoff of the analysis. OCaml and its type and module systems play a crucial role to achieve this g= oal.. we will see how monads, modules and abstract data types (and more!) n= aturally describe the components of a static analysis tool.

    After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

    shakuhachi v0.2.0

    EruEri announced

    I'm happy to announce the release shakuhachi v0.2.0.=20=20 Shakuhachi is a music collection manager. It aims to be a rather simple col= lection manager extensible by plugins.

    This release is mostly a bug-fix release, but some new functions are expose= d through its API.

    Sincerely yours.

    OCaml security grants

    Hannes Mehnert announced

    Dear OCaml hackers,

    we're pleased to announce that there are grants (up to 100_000 EUR) availab= le for the broad topic of OCaml and security. The main idea is to strengthe= n the OCaml ecosystem in terms of security - being it tooling, documentatio= n, guides, ….

    Your submitted proposal (until March 1st) will be reviewed by the OCaml sec= urity team (https://ocaml.org/securi= ty). This wouldn't be possible with the OCSF (https://ocaml-sf.org/) and their sponsors.

    If you have an idea, please go to https://cryptpad.fr/= form/#/2/form/view/ozl80ZB3ndLhMcGeu0buygGOIwZWL6+dxbPuXgT+Wxs/ and sub= mit your proposal.

    Thanks,

    Hannes (in the name of the OCaml security team)

    New release of Menhir (20260122)

    Fran=C3=A7ois Pottier announced

    I am pleased to announce a new version of Menhir.

    opam update && opam install menhir.20260122
    

    The main new feature is a brand new GLR back-end. This back-end is selected= by the command line switch --GLR. GLR is a non-deterministic = parsing algorithm; it is useful when the grammar lies outside the class LR(= 1), either because the grammar is unambiguous but requires more than one to= ken of lookahead, or because the grammar is truly ambiguous. For more infor= mation on GLR, please read the manual.

    There are also many minor changes in this release; please see the change log for details.

    Happy parsing,

    Fran=C3=A7ois.

    OCaml for Industry

    Nicolas Ojeda Bar announced

    Dear community,

    This Friday, Feb 6 at 15:00-17:00 CET the OCSF is organizing a video call i= n collaboration with Tarides and OCamlPro to discuss all aspects of OCaml r= elevant to industrial users. We have invited all OCSF sponsors to participate, but w= ould be very happy to welcome other industrial users (who are not currently= OCSF sponsors) if they want to participate.

    So, if you are an industrial user of OCaml and would like to participate, p= lease get in touch and I will forward the meeting details.

    Thanks!

    Cheers, Nicolas

    Mset 0.2.0 - new library for small multisets

    Jean Christophe Filliatre announced

    Dear OCaml community,

    I=E2=80=99m pleased to announce the first release of mset, a l= ibrary that implements multisets as soon as they are small enough to fit in= side a single int (as a bitset).

    It is available via opam and here at GitHub:

    I implemented this library as part of a project to count anagrams= but I anticipate it might be useful for other purposes.

    Happy hacking,

    Jean-Christophe

    Lwt.6.1.0, Lwt_ppx.6.1.0

    Rapha=C3=ABl Proust announced

    Lwt.6.1.0 has been release. It contains some fixes (see full changelog, special thanks to @kit-ty-kate and @otini)= as well as the following notable addition:

    • New Lwt_engine.engine_id to know what underlying engine Lw= t is currently using.

    Lwt_ppx.6.1.0 (also Lwt_ppx.5.9.3) has been released. It cont= ains a fix to correctly carry type annotations: let%lwt x : t =3D =E2= =80=A6 in =E2=80=A6 now produces code that correctly place the t annotation. (This was caused by a change in ppxlib which was not = accounted for previously.)

    Versions 6.0.0 and 5.9.2 or lwt_ppx are marked as avoid-version in opam-repository. They are fine to use as long as you don't use type an= notations but you should update to 6.1.0 or 5.9.3.

    Special thanks to @Halbaroth for the bug report.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=gDfwyvt2; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 43FFD40083 for ; Tue, 10 Feb 2026 10:36:50 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=QSx0bAxBFBTlyzHxGyOrgwi4gL0Qx1XD+wk5dRvI/10=; b=gDfwyvt2/zpgE1Xm9GcSG7wpvuhcvH1aB/QMyNaWj0JCgNSiuCuO3Ge+ ypi4vxK7c1wqYzrMcGT/MdHJrw/FnySuW/tY2AqxBkNCoRXSFg3kA1oHH uw1g7Q3iOMbppm1LmcxFPo1sDwgbkUk6xYxhqZAUqGBRF8QNntIxscbFK 4=; X-CSE-ConnectionGUID: 8rSXxn2+Qk+3qYDzuFzVTg== X-CSE-MsgGUID: xwsM7zQASKir6itUBy8LQA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,283,1763420400"; d="scan'208,217";a="262770471" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Feb 2026 11:36:50 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3C23D82150; Tue, 10 Feb 2026 11:36:50 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 0A4DF82103 for ; Tue, 10 Feb 2026 11:36:35 +0100 (CET) X-CSE-ConnectionGUID: TXZhqfeGSGmtmP1rySkWcQ== X-CSE-MsgGUID: ED3dgrafRfifwKcYB/ADjA== IronPort-SDR: 698b0a32_cf6JZAGAFAOQlFZyuO9HixWZaC8KwufP9NOl4Kp4zgPn70+ YAQQmatolhcC94zHNvFa9RVh/mXmmUX+kF6LLSg== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EaAwA+CYtphSIeaIFahBaBBBoBbF8zBwhJhFiDT44ln?= =?us-ascii?q?EiDFRYiFgEDAQ0uARUKAQIEAQEDAQIBggyCdAKNHQIfBgEENBMBAgQBAQEBA?= =?us-ascii?q?wIDAQEBAQEBAQEBDQEBBQEBAQIBAQIEBgECEAEBAQFASYZPDYJFGThxYQQDB?= =?us-ascii?q?jcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECB?= =?us-ascii?q?AgBCDplChMBATgYFg0DFAcDAhEBNQMBEwESFAaCaAGCIAICTwMFDAaNX5tOe?= =?us-ascii?q?oEygQGCDAEBBoEIPgMCAgcCBQEOCSbaEYFnCYFNhW6CShsBKklRGgEChE0Jh?= =?us-ascii?q?DICJw+BVUSBFTWCRG+BfkELFwEBAQEYRF0DAQEOMg0JgyWCaYImehQdgUeBa?= =?us-ascii?q?YoXBYYSgURLMywBVRMXCwcFXoEIAyovLW4yHYEjPhcyWBsHBYgtD4kPgWiBI?= =?us-ascii?q?F0DC209NxQbjzNCGRgqgWYOCoFDFBYCBUkCCA4rIiwJBEZFkkIMDCgsdZx9k?= =?us-ascii?q?lOBI200B4QfgV4GDIkIgSaSMINXhASBV4s8hwKSUiKYJj4iiV6BJgmCWpVgE?= =?us-ascii?q?w2FOIF/I4ErAR0MBzMaMEMNBwOCHAEBMgkKPBwPkiGBPoMaO4E8vGlCNQIBA?= =?us-ascii?q?TgCBwEKAQEDCYViAQGMOoFLAQE?= IronPort-PHdr: A9a23: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 mg8ZRM= IronPort-Data: A9a23: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 kBtLV15rIqHpYId3Cqul7O52P3Ugd838wgVUA== IronPort-HdrOrdr: A9a23:Kt3IEayx6me3cvQe7NHlKrPwE71zdoMgy1knxilNoH1uA66lfq WV9pkmPHDP6Qr5NEtNpTniAtjifZq/z/5ICOAqVN/IYOCMggWVxe9ZgrfK8nnJJGnV9+JW16 tsGpIObeHYPBxdlsi/xAG5Fr8bsb66GU2T9IPj80s= X-Talos-CUID: 9a23:AqTGC2985bV88438DeGVv3IkKMA8fHDy91jVP0qAUHx4c76qQmbFrQ== X-Talos-MUID: 9a23:HXlibgSXsk/xRjp1RXTBqGpuO91h7Z6gCU4Ssp43kY6tGS5ZbmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,283,1763420400"; d="scan'208,217";a="262770360" X-MGA-submission: =?us-ascii?q?MDHftlGFksMqfBL51pz9zMvpJ/Qn96nOIitPoh?= =?us-ascii?q?4zZs6Z1la3yq9Kp19n5JRMzg/euaJbZG6oJGxqVAVr6ukiY9kNF36CGE?= =?us-ascii?q?uPR5rm5cc0WdiodeuuSOlN9WcnVWRYfQziq1cGHLdqcyEYpL3bWG47tZ?= =?us-ascii?q?gRHf9sZnG+ScfsI9yq1dFS+g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Feb 2026 11:36:34 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 1FED91A384; Tue, 10 Feb 2026 11:36:34 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Feb 2026 11:36:33 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 10 11:36:34 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499199, queueID=39F1B1A3BA X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19446 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 03 to 10, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 intel_hex.0.3 layoutz 0.0.2 - a tiny DSL for beautiful CLI output in OCaml =F0=9F=AA=B6 New release of Menhir (20260122) Caml in the Capital - Registrations Open! An experimental branch of Merlin based on Domains and Effects Other OCaml News Old CWN intel_hex.0.3 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Mikhail announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Hi there! I am excited to announce the release of the [intel_hex] library. This library is a manipulation library that provides functions for reading, writing, and creating Intel HEX data, which is a common format used in embedded system programming. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 Intel_hex.Record. =E2=94=82 [ =E2=94=82 Extended_segment_address 0x0F; =E2=94=82 Data (0x0000, "Hello "); =E2=94=82 Data (0x0007, "World!"); =E2=94=82 End_of_file; =E2=94=82 ] =E2=94=82 |> Intel_hex.records_to_string=20 =E2=94=82 |> print_endline =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 :02000002000FED =E2=94=82 :0600000048656C6C6F20E6 =E2=94=82 :06000700576F726C6421CA =E2=94=82 :00000001FF =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Also, you can of course read the IHEX object file from other sources: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 In_channel.with_open_text "data.hex" Intel_hex.object_of_channel =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 - : Intel_hex.Object.t =3D=20 =E2=94=82 {=20 =E2=94=82 start_linear_address =3D 0; =E2=94=82 start_segment_address =3D {cs =3D 0; ip =3D 0}; =E2=94=82 chunks =3D [(240, "Hello "); (247, "World!")] =E2=94=82 } =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Limitations 32-bitness. To represent 32-bit integers, the library uses the OCaml int data type. This may be problematic for 32-bit systems, as it can lead to overflow errors, but it works fine for most 64-bit systems. Start addressing and extending addressing. Not fully supported for real-world use. I would appreciate your pull request on this! [intel_hex] layoutz 0.0.2 - a tiny DSL for beautiful CLI output in OCaml =F0=9F=AA=B6 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Matthieu Court announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello all! Been working on [layoutz], a tiny, zero-dep combinator lib for making pretty, structured, terminal output: tables, trees, boxes, ANSI styled elements, etc. Would love to hear how the API feels: Smooth? Any missing primitives you'd expect? Many thanks! [layoutz] New release of Menhir (20260122) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Fran=C3=A7ois Pottier announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I have introduced a printing bug in the Rocq back-end, reported by Xavier Leroy. I am releasing version 20260203 today to fix this bug. Caml in the Capital - Registrations Open! =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sacha Ayoun announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone ! We are excited to officially invite you to the first Caml in the Capital meetup! We have two fantastic talks planned, some free pizza =F0=9F=8D=95 generously sponsored by the OCaml Software Foundation =F0=9F= =90=AA and great company to chat with :grinning_face_with_smiling_eyes: =E2=80=A2 *Registration link:* [HERE] *(Please register asap so we can anticipate)* =E2=80=A2 *Date:* Thursday February 26th from 6:30pm to 8:30pm =E2=80=A2 *Location:* Imperial College London, Flowers Building, Room FLOW G.47A. [HERE] Talks =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=97=8A Compile-time Computation for Caml /by Jeremy Yallop/ (Abstract TBD) =E2=97=8A Dynamic Verification of OCaml Software with ORTAC/QCheck-STM /by Nikolaus Huber/ In this talk I would like to introduce the QCheck-STM plugin for ORTAC, a framework for dynamic verification of OCaml code. ORTAC/QCheck-STM consumes OCaml module signatures annotated with contracts expressed in the Gospel language and generates code for automated runtime assertion checking from it. I will highlight some details of the implementation of the tool, the structure of the generated code, and on errors found in established OCaml libraries. =E2=80=94 We are very much looking forward to meeting the OCaml community in London! Cheers, Alistair & Sacha An experimental branch of Merlin based on Domains and Effects =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Carine Morel announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello! For those interested, [here] is the link to the video of the talk @pitag and I gave on the subject at Lambda World last year! Don't hesitate to ask questions here or under the video! [here] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Windows Docker Images] =E2=80=A2 [Weeknotes for week 6] =E2=80=A2 [More CFI and frame pointers work] =E2=80=A2 [OCaml Roundup: January 2026] [the ocaml.org blog] [Windows Docker Images] [Weeknotes for week 6] [More CFI and frame pointers work] [OCaml Roundup: January 2026] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 03 to 10, 20= 26.

    intel_hex.0.3

    Mikhail announced

    Hi there!

    I am excited to announce the release of the intel_hex library. This library is a manipulation libr= ary that provides functions for reading, writing, and creating Intel HEX da= ta, which is a common format used in embedded system programming.

    Intel_hex.Record.
      [
          Extended_segment_address 0x0F;
          Data (0x0000, "Hello ");
          Data (0x0007, "World!");
          End_of_file;
      ]
    |> Intel_hex.records_to_string=20
    |> print_endline
    
    :02000002000FED
    :0600000048656C6C6F20E6
    :06000700576F726C6421CA
    :00000001FF
    

    Also, you can of course read the IHEX object file from other sources:

    In_channel.with_open_text "data.hex" Intel=
    _hex.object_of_channel
    
    - : Intel_hex.Object.t =3D=20
    {=20
      start_linear_address =3D 0;
      start_segment_address =3D {cs =3D 0; ip =3D 0};
      chunks =3D [(240, "Hello "); (247,=
     "World!")]
    }
    

    Limitations

    32-bitness. To represent 32-bit integers, the library uses the OCaml int da= ta type. This may be problematic for 32-bit systems, as it can lead to over= flow errors, but it works fine for most 64-bit systems.

    Start addressing and extending addressing. Not fully supported for real-wor= ld use. I would appreciate your pull request on this!

    layoutz 0.0.2 - a tiny DSL for beautiful CLI output in OCaml = =F0=9F=AA=B6

    Matthieu Court announced

    Hello all! Been working on layoutz, a tiny, zero-dep combinator lib fo= r making pretty, structured, terminal output: tables, trees, boxes, ANSI st= yled elements, etc.

    Would love to hear how the API feels: Smooth? Any missing primitives you'd = expect? Many thanks!

    New release of Menhir (20260122)

    Continuing this thread, Fran=C3=A7ois Pottier announc= ed

    I have introduced a printing bug in the Rocq back-end, reported by Xavier L= eroy. I am releasing version 20260203 today to fix this bug.

    Caml in the Capital - Registrations Open!

    Sacha Ayoun announced

    Hi everyone !

    We are excited to officially invite you to the first Caml in the Capital me= etup! We have two fantastic talks planned, some free pizza =F0=9F=8D=95 generousl= y sponsored by the OCaml Software Foundation =F0=9F=90=AA and great company= to chat with :grinning_face_with_smiling_eyes:

    • Registration link: HERE (Please register = asap so we can anticipate)
    • Date: Thursday February 26th from 6:30pm to 8:30pm
    • Location: Imperial College London, Flowers Building, Room FLOW G= .47A.

    Talks

    • Compile-time Computation for Caml

      by Jeremy Yallop

      (Abstract TBD)

    • Dynamic Verification of OCaml Software with OR= TAC/QCheck-STM

      by Nikolaus Huber

      In this talk I would like to introduce the QCheck-STM plugin for ORTAC, a f= ramework for dynamic verification of OCaml code. ORTAC/QCheck-STM consumes = OCaml module signatures annotated with contracts expressed in the Gospel la= nguage and generates code for automated runtime assertion checking from it.= I will highlight some details of the implementation of the tool, the struc= ture of the generated code, and on errors found in established OCaml librar= ies.

      We are very much looking forward to meeting the OCaml community in London!

      Cheers, Alistair & Sacha

    An experimental branch of Merlin based on Domains and Effects<= /h2>

    Continuing this thread, Carine Morel announced

    Hello! For those interested, here is the link to the video of the talk @pitag and I gave= on the subject at Lambda World last year! Don't hesitate to ask questions = here or under the video!

    Other OCaml News

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=pPHvqVbV; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id F3BC0400A2 for ; Tue, 17 Feb 2026 13:47:32 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=CW5me7pSdig318gR5Y1Sg4vnMK2ICT841Gjs4Dkkwqw=; b=pPHvqVbVH2J65DqyMVk0xEtcylOgC0aGaoYkjdbun2hxLJd07VYPuMEQ K0LIP04+GtNsUviZTH43JIcwuJI4CpMJbXWsuobRuRfTJ6udaKX6eHAQE EI/LfG0rlpD+EGjgmMo7hNpsw7BGV4Jey48T4AcRtjpHUCDxIfzUhpF2z E=; X-CSE-ConnectionGUID: dbzNi6X1S3aQcVb29v7r6Q== X-CSE-MsgGUID: l4+7vl92QAKZHdpYf6RFkg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,296,1763420400"; d="scan'208,217";a="263862349" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Feb 2026 14:47:29 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id EF85182C9B; Tue, 17 Feb 2026 14:47:28 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id B33B582C94 for ; Tue, 17 Feb 2026 14:47:18 +0100 (CET) X-CSE-ConnectionGUID: xAePbKDxRzinEQ7pwH7ylw== X-CSE-MsgGUID: 0DvaabbwScyQLm3dCM0O3w== IronPort-SDR: 69947165_bB8RyfNnjKdYCrMsAttNwN98Lk3+p3g0Lv1/SBqLhiM+Cmq h0uXv1MJTXHNbCdfdy4k9GdYhzS3oeTdqSsEFSg== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0HfAwDCcJRpjyIeaIFaEwEBCQEBCxIMghKBO1spGgFsX?= =?us-ascii?q?xkaBwhJAwqES1yBB4FsjiWBFpA3gjyGVlmBEIFpgREHFBYjFQEDAQ0uARsEA?= =?us-ascii?q?QIEAQEDAQIBg0lxRgJPFYw8Ah8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQENA?= =?us-ascii?q?QEFAQEBAgEBAgQGAQIQAQEBAQEBOQVJhk8NSQEQAYFqUXFlCTcBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAgBAhcKDW4BC?= =?us-ascii?q?AQGEwEBJRMYIwMJCwEGAwIRATUDARMBCQkaAYIPWAGCIgJPAwUMBo8vmn0aN?= =?us-ascii?q?3p/M4EBggwBAQaBCD4CAQIJAgIDAQ4JJQHaEYFnCYE1GIJYgxeCShsBKklsA?= =?us-ascii?q?QKETYQ/CB8PgVVEgRU1gXNKB2+CHiEEBxcBAQEBARd/DQQBARABAgEGAgIQD?= =?us-ascii?q?yQJCYMcgmmCERV6FB11boElhyGBB3AYXQWGJYFESzMsAVUTFwsHBV6BCAMqL?= =?us-ascii?q?y1uMh2BIz4XM1gbBwWHcw+JBYFmgR+BBAMLbT03FBuPEkIBGBcqgTctAg44B?= =?us-ascii?q?hcXNAIYDgUBBwwWAhQODR8KIxEFBwMEFRkECQoEFSIIBQUBCQMKAi0DklUCC?= =?us-ascii?q?RwDBScBj1mDVl6JZJNZHW00B4QfgV4GDIgeaoEmi2aKIYQEgVeLPIcCklIim?= =?us-ascii?q?GQigjaHKIEmCYFvH0MJlWA5hR+BfyMuDjA/HgwHMxowQ4IzAQEBMQlGHA9Xj?= =?us-ascii?q?SgiDBaCBYFZQX2BJoF0O4FduC8xQjUCAQEHAwUpAgcBCgEBAwmFYgEBfII2i?= =?us-ascii?q?FUBDxcHBYFLAQE?= IronPort-PHdr: A9a23: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 GEZTo9JyWjCGNIViQUrMM4W IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:lR05rKqAbOkVNDhCass1qFsaV5oUeYIsimQD101hICG9E/bo9f xG+c5wuCMc5wxxZJhNo7y90cq7MBDhHPxOgbX5VI3KNGLbUQCTQr2Kg7GM/xTQXwXAssRd2a 1jf6UWMqyUMXFKyeDg7k2dG9YkqeP3l5xAaN2uq0tQcQ== X-Talos-CUID: =?us-ascii?q?9a23=3ASPwKZmnuGpNKk6Dp/Ne3TpjxxvbXOW30wU/aAGO?= =?us-ascii?q?oM3RoTpCsFkeP2Px1l9U7zg=3D=3D?= X-Talos-MUID: 9a23:AMgnfglNcV7PkxkI9thXdno6GNlh6q6kF3sGgKwivpKIHgkoHGyC2WE= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.21,296,1763420400"; d="scan'208,217";a="263862247" X-MGA-submission: =?us-ascii?q?MDHJmupshpa39maVPc6ulpAKyQ2y1sam9OSeE+?= =?us-ascii?q?A/MABismd/MFeOasQG+hGuKZ3LjQ2n81AsBJGOMQvIjn1zJkhJuIqdm1?= =?us-ascii?q?2iR02dtIJolykM0PGUJoa7AT9ygRlYwmK46FEFz0v+m3kG4sH2A+a236?= =?us-ascii?q?OUIjJG1S/Acixy/QAqb2YOAg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Feb 2026 14:47:17 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id B4EF11A342; Tue, 17 Feb 2026 14:47:16 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Feb 2026 14:47:16 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Feb 17 14:47:16 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.475100, queueID=D70371A394 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19448 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of February 10 to 17, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 trace 0.11 Bogue, the OCaml GUI OCaml examples of computing with encrypted or private data CMake, Ninja and Google or-tools packages Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers YOCaml, a framework for static site generator Other OCaml News Old CWN trace 0.11 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Simon Cruanes announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear all, I'm delighted to announce the release of [trace 0.11]. This is a major release and hopefully the last one before 1.0. [trace] is a lightweight foundation for instrumentation, a bit like [rust's tracing]. It provides a _protocol_ between, one the one hand, libraries and applications that are instrumented; and a _collector_ that decides what to do with that. My hope is that projects (especially libraries) can adopt `trace' without fear because of the tiny footprint and high flexibility, the same way `logs' is used in many places. Existing collectors can produce [chrome format traces], fuchsia traces, plug into [tracy], or into [opentelemetry]; a bridge to `Runtime_events' is planned[^1]. [^1]: trace is more flexible than `Runtime_events' and works on OCaml 4, but of course it should be possible to have both interoperate! [API docs for the main library] [trace 0.11] [trace] [rust's tracing] [chrome format traces] [tracy] [opentelemetry] [API docs for the main library] brief example =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C A simple example program from the readme: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 let (let@) =3D (@@) =E2=94=82=20 =E2=94=82 let run () =3D =E2=94=82 Trace.set_process_name "main"; =E2=94=82 Trace.set_thread_name "t1"; =E2=94=82=20 =E2=94=82 let n =3D ref 0 in =E2=94=82=20 =E2=94=82 for _i =3D 1 to 50 do =E2=94=82 let@ _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "outer.loo= p" in =E2=94=82 for _j =3D 2 to 5 do =E2=94=82 incr n; =E2=94=82 let _sp =3D Trace.with_span ~__FILE__ ~__LINE__ "inner.lo= op" in =E2=94=82 Trace.messagef (fun k -> k "hello %d %d" _i _j); =E2=94=82 Trace.message "world"; =E2=94=82 Trace.counter_int "n" !n; =E2=94=82 done =E2=94=82 done =E2=94=82=20 =E2=94=82 let () =3D =E2=94=82 (* here we setup the collector *) =E2=94=82 let@ () =3D Trace_tef.with_setup ~out:(`File "trace.json") ()= in =E2=94=82 run () =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 If we run the program with `TRACE=3D1' to enable this particular collector, we get a trace file in `trace.json' (but with actual timestamps): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 [{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"= }}, =E2=94=82 {"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name"= :"t1"}}, =E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"= I"}, =E2=94=82 {"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"}, =E2=94=82 {"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}}, =E2=94=82 =E2=80=A6 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Opening it in we get something like this: [screenshot of perfetto UI] [screenshot of perfetto UI] what's new in 0.11 =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C 0.11 contains major changes, almost all of which are breaking _on the collector side_. Instrumented programs should be **mostly** unaffected, aside from many deprecation warnings. The core change is that `Trace.span' is [now] an **open sum type**, and not `int64'. This means less global state and fewer tables needed: collectors can pick exactly what data gets carried from the `enter_span' site into the `exit_span' site, if any. In turns, collectors get simpler and faster. The notion of "manual" span is now dead (a simple alias to normal spans) and all related functions are deprecated. 1.0 will not have this notion at all. In addition, collectors are now [a bag of callbacks+a state], rather than a first class module. `trace.subscriber' has been removed because the notion of subscriber is subsumed by the notion of collector (now more easily composable). The TEF and fuchsia collectors are now simpler and free of global state. `user_data' is now a polymorphic variant to, for better ease of use. Metrics are an open sum type, and the previous `int' and `float' cases are just provided as constructors of this type. Dependencies on `thread-local-storage' and `hmap' are now entirely gone. [now] [a bag of callbacks+a state] organization note =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C Note: the project has moved from my gh account (c-cube) to a dedicated organization [ocaml-tracing] for telemetry and tracing projects. Other projects such as [opentelemetry] have also migrated there. [ocaml-tracing] [opentelemetry] Bogue, the OCaml GUI =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, sanette announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi I'm happy to announce [Bogue] version 20260208, now available on opam. The main novelties are =E2=81=83 Color management has been improved (_warning: breaking change_) =E2=81=83 New: *Text input validator* : you can write rules (or simply a regexp) to warn the user whether the text they are typing is correct. =E2=81=83 New: *Mailbox* module: setup a mailbox server and send arbitrary messages between widgets. =E2=81=83 Installation on Windows has been simplified. =E2=81=83 Compatibility with old versions of SDL. Have fun! Here are the details: =E2=81=83 /Colors/: All colors and some of the API have been split into t= he `RGB' and `RGBA' modules. Named colors are now true identifiers: =E2=81=83 instead of writing `let c =3D Draw.find_color "aliceblue' you= should now use `let c =3D RGB.aliceblue'; and instead of `let c =3D Draw.(opaque (find_color "aliceblue"))' you write now `let c =3D RGBA.aliceblue'. =E2=81=83 if you're lazy to correct these, you may simply do `open Bogu= e.RGB open Bogue.RGBA'; it should be enough in most cases. =E2=81=83 /Text input validator/: Example using the included *email validator*: =E2=81=83 /Mailbox API/: for complicated GUIs with circular connnections between widgets, the usual Bogue solution was to use an `update' event, see [here]. Now this method has been leveraged to a full Mailbox system where any type of message can be sent. =E2=81=83 /Windows/ users should follow the instructions [here]. Continuo= us testing (CI) is now guaranteed to work on Windows mingw64 (and of course Linux and MacOS) =E2=81=83 /SDL/: if you have an old version of SDL (>=3D 2.0.6) and are t= oo lazy to upgrade, rejoice: simply follow the instructions [here] [Bogue] [here] [here] [here] OCaml examples of computing with encrypted or private data =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Xavier Leroy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Last Fall, I gave a [series of lectures] on secure computing (computing with encrypted or private data). Here is some companion OCaml code that demonstrates these techniques: . If you're curious about homomorphic encryption, zero-knowledge proofs, secure multi-party computation, oblivious transfers, private set intersection and so on, you might enjoy these code examples and the explanations given in the lectures. This code is probably insecure and not intended to be used in actual high-security applications. If you're into this kind of things, see [Belenios], an excellent e-voting system written in OCaml that uses many of these secure computing techniques. [series of lectures] [Belenios] CMake, Ninja and Google or-tools packages =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: jbeckford announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 It is my pleasure to announce the following packages for (): =E2=80=A2 [`CommonsBase_Build.CMake0@3.25.3'] and [`CommonsBase_Build.Ninja0@1.12.1']: CMake and Ninja. The C compiler, Ninja and CMake are the basic tools used to build the majority of modern C projects. =E2=80=A2 [`NotGoogleDev_OR.Tools.F_Lib@9.15.0'] and [`NotInriaParkas_Caml.ORTools@9.15.0']: Google's `or-tools' libraries discussed by @tbrk in a couple threads last week ( and ) These packages are my /start/ to a clean replacement for opam `depexts'. `depexts' does not work well for me: basic engineering (reproducibility) is gone, system packages often are too far behind their upstream versions, the complete unavailability for Windows users, the occasional symlink break with homebrew, etc. Here's the basic idea (macOS only for now): =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 # There are other ways to install dk0 but for now use this =E2=94=82 $ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc =E2=94=82=20 =E2=94=82 # Then invoke a fully-qualified target to build `or-tools` =E2=94=82 # which will quickly download precompiled artifacts =E2=94=82 $ dksrc/dk0 --trial get-object NotInriaParkas_Caml.ORTools@9.15= .0 \ =E2=94=82 -s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/ =E2=94=82=20 =E2=94=82 # See what is there =E2=94=82 $ tree target/ocaml-ortools-arm64 --filelimit 5 =E2=94=82 target/ocaml-ortools-arm64 =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 include [33 entries exceeds fileli= mit, not opening dir] =E2=94=82 =E2=94=9C=E2=94=80=E2=94=80 shared =E2=94=82 =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [262 entries excee= ds filelimit, not opening dir] =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 static =E2=94=82 =E2=94=94=E2=94=80=E2=94=80 lib [131 entries exceeds filel= imit, not opening dir] =E2=94=82 # ... =E2=94=82 $ du -sh target/ocaml-ortools-arm64 =E2=94=82 464M target/ocaml-ortools-arm64 =E2=94=82 # ... =E2=94=82 $ find target/ocaml-ortools-arm64 -name 'libortools*' =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.= so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.9.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools.so =E2=94=82 target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so =E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools.a =E2=94=82 target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 /`or-tools' is just a proof of concept to test my CMake package. I know little about `or-tools'! I just picked it because it was the C library being discussed last week./ Calling a build target looks at first like installing a package: =E2=80=A2 you get a 125MB compressed download of precompiled `or-tools' libraries. In this case those libraries have been packaged to follow OCaml conventions (both static and shared libraries are present, and `.so' extensions instead of `.dylib' on macOS) =E2=80=A6 the same thing= you expect when you use depexts. But `dk0' is a build tool. So if you change to a set of parameters that has not been precompiled like so: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 rm t/d/val.1/j* # hack for bug https://github.com/diskuv/dk/iss= ues/98 =E2=94=82=20 =E2=94=82 dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial \ =E2=94=82 get-object NotInriaParkas_Caml.ORTools@9.15.0 \=20 =E2=94=82 -s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/ =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 the build will happen locally (~1 hour on an M1). This style of build system may be unfamiliar. So my analogies would be: =E2=80=A2 a `nix' binary cache with overlays (I haven't personally used `nix'); JSON and Lua serve the same purpose as the Nix language, or =E2=80=A2 an Internet-accessible dune cache that everybody can use; JSON = and Lua serve the same purpose as dune files and dune `(rule ...)' expressions. The CMake package limitations as of 2026-02-12 =E2=80=A6 but scroll down = in this thread to see if I have posted an update: =E2=80=A2 I haven't had the time to complete dk0 packages for C compilers= , so the CMake package is incomplete. CMake + Ninja discovers C compilers on macOS trivially, and last week's threads were discussing macOS, so I prioritized macOS with xcode. =E2=80=A2 I tested the CMake package on Apple Silicon. Windows is partial= ly tested but don't use Windows yet. =E2=80=A2 There is no integration with opam or dune yet. Thanks! =E2=80=94 [`CommonsBase_Build.CMake0@3.25.3'] [`CommonsBase_Build.Ninja0@1.12.1'] [`NotGoogleDev_OR.Tools.F_Lib@9.15.0'] [`NotInriaParkas_Caml.ORTools@9.15.0'] Building your own packages =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C /This is bonus material for those thinking about building dk0 packages/ The JSON build file for `NotInriaParkas_Caml.ORTools@9.15.0' is `NotInriaParkas_Caml.ORTools@9.15.0' uses the C library package `NotGoogleDev_OR.Tools.F_Lib@9.15.0'. Its Lua build file is . And `NotGoogleDev_OR.Tools.F_Lib@9.15.0' uses the tool package `CommonsBase_Build.CMake0.F_Build@3.25.3'. You can use a command line variation of it (`CommonsBase_Build.CMake0.Build@3.25.3') without any JSON or Lua build files =E2=80=A6 here is an example: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 dksrc/dk0 --trial run CommonsBase_Build.CMake0.Build@3.25.3 ins= talldir=3Di/llama-cpp \ =E2=94=82 > 'mirrors[]=3Dhttps://github.com/ggml-org/llama.cpp/archiv= e/refs/tags' \ =E2=94=82 > 'urlpath=3Db7974.zip#be9d624603e39cd4edee5fa85e8812eb8e13= 93537c8e4e4629bc4bd016388053,29881192' \ =E2=94=82 > 'nstrip=3D1' 'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF' \ =E2=94=82 > 'exe[]=3Dbin/*' \ =E2=94=82 > 'out[]=3Dbin/llama-quantize' \ =E2=94=82 > 'outrmglob[]=3Dtest-*' 'outrmglob[]=3D*.py' \ =E2=94=82 > 'outrmglob[]=3Dllama-[a-p]*' 'outrmglob[]=3Dllama-[r-z]*'= \ =E2=94=82 > 'outrmexact[]=3Dinclude' 'outrmexact[]=3Dlib' =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 With that single command, `CommonsBase_Build.CMake0.Build@3.25.3' will download the popular C package `llama.cpp', build a static library, remove several of its artifacts, and install what remains (especially bin/llama-quantize) into the `i/llama-cpp' directory. Then type `i/llama-cpp/bin/llama-quantize --help' to run what you just built. If you want to make your own CMake-based package for OCaml, work backwards from that explanation: 1. use the command line first to build a CMake project. It will do the download, and run the `cmake -G', `cmake --build', `cmake --install' on your behalf. The `dk0' error messages usually print with helpful recommendations, and look at the top of [`CommonsBase_Build.CMake0@3.25.3'] for documentation. 2. then make a Lua build file to package it for C. You'll make a Lua function ("rule") to set the command line arguments (what you tested in the last step). At minimum, you need your Lua rule to say how to get static vs shared libraries (you need both), and what CMake flags to use for what platforms. 3. then make a JSON build file to package it for OCaml. Again, rely on the `dk0' error messages. 4. then make a GitHub Actions job to distribute it. Here is the GitHub Actions job for one of today's announced packages: . On success, GitHub Actions will print the import commands you can run so all the precompiled artifacts are available on your desktop. [`CommonsBase_Build.CMake0@3.25.3'] Neocaml-mode (A modern Emacs major mode for OCaml) is looking for testers =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Bozhidar Batsov announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hey everyone, Just wanted to let you know I=E2=80=99ve spent a bit of time polishing [neocaml] and I think now it=E2=80=99s ready to be used (or at least test= ed) by more people. The font-locking and indentation are more or less done, and there=E2=80=99s also a basic integration with OCaml toplevels. Coupled with something like `ocaml-eglot' the existing functionality should get you pretty far. You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80= =99ll find detailed instructions there), but I=E2=80=99ve also opened a MELPA recipe= PR, so I hope the installation process will become simpler soon. Feel free to share feedback and feature requests here and over at GitHub! P.S. I know the name is a bit controversial (some people said it evokes nvim vibes), and the down the road I may just rename it to ocaml-mode or try to merge it with Tuareg. Naming remains hard=E2=80=A6 [neocaml] Bozhidar Batsov later added =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 A couple of small updates: =E2=80=A2 Neocaml is now on MELPA =E2=80=A2 I wrote a short blog post about the first =E2=80=9Cofficial=E2= =80=9D release YOCaml, a framework for static site generator =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Xavier Van de Woestyne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 *[ANN] YOCaml 3.0.0* It had been a while since we announced a release of YOCaml (since `2.5.0'), but this weekend we released version `3.0.0' (already available on OPAM)! Since version `2.5.0', many changes have been made to YOCaml, which you can read about in the release notes for the various versions released over the months: ([`2.6.0'], [`2.7.0'], [`2.8.0']). Some major innovations that can be noted are: =E2=80=A2 YOCaml finally deletes files that it did not create, which allo= ws for intermediate build steps that construct finer caches (making it possible, for example, to create [backlinks] or [transclusions]) ([yocaml#108]) =E2=80=A2 As mentioned by @benfaerber, adding `yocaml_liquid' as an alternative template engine. ([yocaml#101]) =E2=80=A2 Major improvements to the validation/projection language (and greater rigour in the concept of validation/normalisation) ([yocaml#98], [yocaml#109], [yocaml#115]) =E2=80=A2 Greater control over the iteration logic of actions, allowing recursive traversal of file system fragments, among other things ([yocaml#111]). =E2=80=A2 _Last but not least_, in this poorly named PR, [yocaml#120], we added the possibility for a task to create multiple files and replaced the internal representation of time. Previously, we used integers, but now we have switched to floats, which offer greater precision (and allow CI to correctly execute CRAM tests that generate sites). In addition, there are bug fixes, usability improvements, and=E2=80=A6 **a drastic improvement in error reporting**, which I will explain in the next section! [`2.6.0'] [`2.7.0'] [`2.8.0'] [backlinks] [transclusions] [yocaml#108] [yocaml#101] [yocaml#98] [yocaml#109] [yocaml#115] [yocaml#111] [yocaml#120] About the Outreachy =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C Many of the improvements to YOCaml were made possible thanks to various participants in the [Outreachy programme], which led to @Linda_Njau being selected as an intern! His work is divided into two specific areas: =E2=80=A2 Drastically improve YOCaml error reporting : [yocaml#113], [yocaml#114], [yocaml#116]. Before these patches, YOCaml errors were extremely difficult to diagnose. Since @Linda_Njau took care of them, they are now easier to read, provide context (which file failed to create, and which file was being read), and are displayed in the preview server, so you don't have to go and read the terminal! =E2=80=A2 The second part of his internship involves working on [yocaml-codex], a project currently under development that aims to provide a standard library of templates for building websites faster with YOCaml and sharing the various templates that have been written over the course of the websites developed with YOCaml. _Stay tuned_! We are very satisfied (and impressed) with her work, and she has documented her contributions in a blog=E2=80=A6 freshly designed, with YO= Caml, of course: [Outreachy programme] [yocaml#113] [yocaml#114] [yocaml#116] [yocaml-codex] About the tutorial =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C The tutorial is progressing slowly but surely, and we have notably added a section that describes how to validate/project data to work with most description languages (such as Yaml, ToML, etc.) and most template engines (Jingoo, Mustache, Liquid) : [Your Own Data Model] We also took the opportunity to clarify the [use of file paths] and document [the resolver technique]! We will continue to write sections and document the use of YOCaml, so if you have any suggestions, comments, or requests, please send them to us! [Your Own Data Model] [use of file paths] [the resolver technique] Closing words =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C In September last year, I gave a very clumsy (_so French_) [presentation of YOCaml at Fun OCaml] which presents YOCaml's design choices! YOCaml is becoming increasingly usable thanks to the [contributions of many people]! Thank you. If you want to create a static blog/website in OCaml, YOCaml is one of many fun options! =E2=80=A2 [Repository] =E2=80=A2 [Release note] =E2=80=A2 [Packages] =F0=9F=90=AB _Happy hacking and blogging_ =F0=9F=90=AB [presentation of YOCaml at Fun OCaml] [contributions of many people] [Repository] [Release note] [Packages] Other OCaml News =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 >>From the ocaml.org blog =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Here are links from many OCaml blogs aggregated at [the ocaml.org blog]. =E2=80=A2 [Day10: opam package testing tool] =E2=80=A2 [Tessera pipeline in OCaml] =E2=80=A2 [.plan-26-07: Storage, Lego, Echo, and the IUCN] =E2=80=A2 [Neocaml 0.1: Ready for Action] =E2=80=A2 [The 15-Game] =E2=80=A2 [Optimizing an MP3 Codec with OCaml/OxCaml] =E2=80=A2 [Announcing New Wasm_of_ocaml Optimisations] [the ocaml.org blog] [Day10: opam package testing tool] [Tessera pipeline in OCaml] [.plan-26-07: Storage, Lego, Echo, and the IUCN] [Neocaml 0.1: Ready for Action] [The 15-Game] [Optimizing an MP3 Codec with OCaml/OxCaml] [Announcing New Wasm_of_ocaml Optimisations] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 10 to 17, 20= 26.

    trace 0.11

    Simon Cruanes announced

    Dear all, I'm delighted to announce the release of trace 0.11. This is= a major release and hopefully the last one before 1.0.

    trace is a li= ghtweight foundation for instrumentation, a bit like rust's tracing. It provides a protocol between, one the one hand, libraries and applica= tions that are instrumented; and a collector that decides what to do with that. My hope is that projects (especially = libraries) can adopt trace without fear because of the tiny fo= otprint and high flexibility, the same way logs is used in man= y places. Existing collectors can produce chrome form= at traces, fuchsia traces, plug into tracy, or into opentelemetry; a bridge to Runtim= e_events is planned[^1].

    [^1]: trace is more flexible than Runtime_events and works on = OCaml 4, but of course it should be possible to have both interoperate!

    API docs for the main library

    brief example

    A simple example program from the readme:

    let (let@) =3D (@@)
    
    let run () =3D
      Trace.set_proce=
    ss_name "main";
      Trace.set_threa=
    d_name "t1";
    
      let n =3D ref 0 i=
    n
    
      for _i =3D 1 to 50 do
        let@ _sp =3D Trace.with_span ~__FI=
    LE__ ~__LINE__ "outer.loop" in
        for _j =3D 2 =
    to 5 do
          incr n;
          let _sp =3D Trace.with_span ~__F=
    ILE__ ~__LINE__ "inner.loop" in
          Trace.messa=
    gef (fun k -> k "h=
    ello %d %d" _i _j);
          Trace.messa=
    ge "world";
          Trace.count=
    er_int "n" !n;
        done
      done
    
    let () =3D
      (* here we setup the collector=
     *)
      let@ () =3D Trace_tef.with_setup=
     ~out:(`File "trace.j=
    son") () in
      run ()
    

    If we run the program with TRACE=3D1 to enable this particular= collector, we get a trace file in trace.json (but with actual= timestamps):

    [{"pid":2,"name":"process_name","ph":"M","args": {"name":"main"}},
    {"pid":2,"tid": 3,"name":"thread_name","ph":"M","args": {"name":"t1"}},
    {"pid":2,"cat":"","tid": 3,"ts": 2.00,"name":"hello 1 2","ph":"I"},
    {"pid":2,"cat":"","tid": 3,"ts": 3.00,"name":"world","ph":"I"},
    {"pid":2,"tid":3,"ts":4.00,"name":"c","ph":"C","args": {"n":1}},
    =E2=80=A6
    

    Opening it in https://ui.perfetto.dev we get something like this:

    screenshot of perfetto UI

    what's new in 0.11

    0.11 contains major changes, almost all of which are breaking on the collector side. Instrumented programs should b= e mostly unaffected, aside from many deprecation warnings.

    The core change is that Trace.span is now an open sum type, and not int64. This means l= ess global state and fewer tables needed: collectors can pick exactly what = data gets carried from the enter_span site into the exit= _span site, if any. In turns, collectors get simpler and faster. The= notion of "manual" span is now dead (a simple alias to normal spans) and a= ll related functions are deprecated. 1.0 will not have this notion at all.

    In addition, collectors are now a bag of callbacks+a sta= te, rather than a first class module. trace.subscriber has= been removed because the notion of subscriber is subsumed by the notion of= collector (now more easily composable). The TEF and fuchsia collectors are= now simpler and free of global state.

    user_data is now a polymorphic variant to, for better ease of = use. Metrics are an open sum type, and the previous int and float cases are just provided as constructors of this type. Depe= ndencies on thread-local-storage and hmap are now= entirely gone.

    organization note

    Note: the project has moved from my gh account (c-cube) to a dedicated orga= nization ocaml-tracing fo= r telemetry and tracing projects. Other projects such as opentelemetry have also = migrated there.

    Bogue, the OCaml GUI

    OCaml examples of computing with encrypted or private data

    Xavier Leroy announced

    Last Fall, I gave a series of lectures on secure computing (computing with encryp= ted or private data).

    Here is some companion OCaml code that demonstrates these techniques: https://github.com/x= avierleroy/secure-computing .

    If you're curious about homomorphic encryption, zero-knowledge proofs, secu= re multi-party computation, oblivious transfers, private set intersection a= nd so on, you might enjoy these code examples and the explanations given in= the lectures.

    This code is probably insecure and not intended to be used in actual high-s= ecurity applications. If you're into this kind of things, see Belenios, an excellent e-voting system writte= n in OCaml that uses many of these secure computing techniques.

    CMake, Ninja and Google or-tools packages

    jbeckford announced

    It is my pleasure to announce the following packages for (https://discuss.ocaml= .org/t/ann-the-dk0-build-system/17709):

    These packages are my start to a clean replacement for opam de= pexts. depexts does not work well for me: basic enginee= ring (reproducibility) is gone, system packages often are too far behind th= eir upstream versions, the complete unavailability for Windows users, the o= ccasional symlink break with homebrew, etc.

    Here's the basic idea (macOS only for now):

    # Th=
    ere are other ways to install dk0 but for now use this
    $ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc
    
    # Then invoke a fully-qualified target =
    to build `or-tools`
    # which will quickly download pr=
    ecompiled artifacts
    $ dksrc/dk0 --trial get-object NotInriaParkas_Caml.ORTools@9.15.0 \
      -s Release.Darwin_arm64 -d target/ocaml-ortools-arm64/
    
    # See what is there
    $ tree target/ocaml-ortools-arm64 --filelimit 5
    target/ocaml-ortools-arm64
    ├── include  [33 entries exceeds filelimit, not opening d=
    ir]
    ├── shared
    │   └── lib  [262 entries exceeds filelimit, not op=
    ening dir]
    └── static
        └── lib  [131 entries exceeds filelimit, not opening =
    dir]
    # ...
    $ du -sh target/ocaml-ortools-arm64
    464M    target/ocaml-ortools-arm64
    # ...
    $ find target/ocaml-ortools-arm64 -name 'libortools*'
    target/ocaml-ortools-arm64/shared/lib/libortools.9.15.so
    target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.so
    target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.15.so
    target/ocaml-ortools-arm64/shared/lib/libortools.9.so
    target/ocaml-ortools-arm64/shared/lib/libortools.so
    target/ocaml-ortools-arm64/shared/lib/libortools_flatzinc.9.so
    target/ocaml-ortools-arm64/static/lib/libortools.a
    target/ocaml-ortools-arm64/static/lib/libortools_flatzinc.a
    

    or-tools is just a proof of concept to test my CMake packag= e. I know little about or-tools! I just picked it because it w= as the C library being discussed last week.

    Calling a build target looks at first like installing a package:

    • you get a 125MB compressed download of precompiled or-tools libraries. In this case those libraries have been packaged to follow OCam= l conventions (both static and shared libraries are present, and .so<= /code> extensions instead of .dylib on macOS) … the sam= e thing you expect when you use depexts.

    But dk0 is a build tool. So if you change to a set of paramete= rs that has not been precompiled like so:

    rm t/d/val.1/j* # hack for bug https://github.com/diskuv/dk/issues/98
    
    dksrc/dk0 --verbose -I dksrc/etc/dk/v --trial \
      get-object NotInriaParkas_Caml.ORTools@9.15.0 \ 
      -s Release.Darwin_x86_64 -d target/ocaml-ortools-intel/
    

    the build will happen locally (~1 hour on an M1).

    This style of build system may be unfamiliar. So my analogies would be:

    • a nix binary cache with overlays (I haven't personally use= d nix); JSON and Lua serve the same purpose as the Nix languag= e, or
    • an Internet-accessible dune cache that everybody can use; JSON and Lua = serve the same purpose as dune files and dune (rule ...) expre= ssions.

    The CMake package limitations as of 2026-02-12 … but scroll down in = this thread to see if I have posted an update:

    • I haven't had the time to complete dk0 packages for C compilers, so the= CMake package is incomplete. CMake + Ninja discovers C compilers on macOS = trivially, and last week's threads were discussing macOS, so I prioritized = macOS with xcode.
    • I tested the CMake package on Apple Silicon. Windows is partially teste= d but don't use Windows yet.
    • There is no integration with opam or dune yet.

    Thanks!

    Building your own packages

    This is bonus material for those thinking about building dk0 packages

    The JSON build file for NotInriaParkas_Caml.ORTools@9.15.0 is = https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/N= otInriaParkas_Caml/ORTools.values.jsonc

    NotInriaParkas_Caml.ORTools@9.15.0 uses the C library package = NotGoogleDev_OR.Tools.F_Lib@9.15.0. Its Lua build file is https://github.com/diskuv/dk/blob/V2_5/etc/dk/v/NotGoogleDev_= OR/Tools.values.lua.

    And NotGoogleDev_OR.Tools.F_Lib@9.15.0 uses the tool package <= code>CommonsBase_Build.CMake0.F_Build@3.25.3. You can use a command = line variation of it (CommonsBase_Build.CMake0.Build@3.25.3) w= ithout any JSON or Lua build files … here is an example:

    dksrc/dk0 --trial run CommonsBase_Build.=
    CMake0.Build@3.25.3 installdir=3Di/l=
    lama-cpp \
      >   'mirrors[]=3Dhttps://github.com/gg=
    ml-org/llama.cpp/archive/refs/tags' =
    \
      >   'urlpath=3Db7974.zip#be9d624603e39=
    cd4edee5fa85e8812eb8e1393537c8e4e4629bc4bd016388053,29881192' \
      >   'nstrip=3D1' 'gargs[]=3D-DBUILD_SHARED_LIBS:BOOL=3DOFF' \
      >   'exe[]=3Dbin/*' \
      >   'out[]=3Dbin/llama-quantize' \
      >   'outrmglob[]=3Dtest-*' 'outrmglob[]=3D*.py' \
      >   'outrmglob[]=3Dllama-[a-p]*' 'outrmglob[]=3Dllama-[r-z]*' \
      >   'outrmexact[]=3Dinclude' 'outrmexact[]=3Dlib'
    

    With that single command, CommonsBase_Build.CMake0.Build@3.25.3 will download the popular C package llama.cpp, build a stati= c library, remove several of its artifacts, and install what remains (espec= ially bin/llama-quantize) into the i/llama-cpp directory. Then= type i/llama-cpp/bin/llama-quantize --help to run what you ju= st built.

    If you want to make your own CMake-based package for OCaml, work backwards = from that explanation:

    1. use the command line first to build a CMake project. It will do the dow= nload, and run the cmake -G, cmake --build, cmake --install on your behalf. The dk0 error messages= usually print with helpful recommendations, and look at the top of CommonsBase_Build.CMake0@3.25.3 for document= ation.
    2. then make a Lua build file to package it for C. You'll make a Lua funct= ion ("rule") to set the command line arguments (what you tested in the last= step). At minimum, you need your Lua rule to say how to get static vs shar= ed libraries (you need both), and what CMake flags to use for what platform= s.
    3. then make a JSON build file to package it for OCaml. Again, rely on the= dk0 error messages.
    4. then make a GitHub Actions job to distribute it. Here is the GitHub Act= ions job for one of today's announced packages: https://github.com/diskuv/dk/blob/7b1942596= 9be61bed0f1d6bf3015dac26d7966e1/.github/workflows/distribute-2.5.yml#L282-L= 364. On success, GitHub Actions will print the import commands you can = run so all the precompiled artifacts are available on your desktop.

    Neocaml-mode (A modern Emacs major mode for OCaml) is looking = for testers

    Bozhidar Batsov announced

    Hey everyone,

    Just wanted to let you know I=E2=80=99ve spent a bit of time polishing neocaml and I think now it= =E2=80=99s ready to be used (or at least tested) by more people. The font-l= ocking and indentation are more or less done, and there=E2=80=99s also a ba= sic integration with OCaml toplevels. Coupled with something like oca= ml-eglot the existing functionality should get you pretty far.

    You=E2=80=99ll still have to install it from the GitHub repo (you=E2=80=99l= l find detailed instructions there), but I=E2=80=99ve also opened a MELPA r= ecipe PR, so I hope the installation process will become simpler soon.

    Feel free to share feedback and feature requests here and over at GitHub!

    P.S. I know the name is a bit controversial (some people said it evokes nvi= m vibes), and the down the road I may just rename it to ocaml-mode or try t= o merge it with Tuareg. Naming remains hard=E2=80=A6

    Bozhidar Batsov later added

    A couple of small updates:

    YOCaml, a framework for static site generator

    Continuing this thread, Xavier Van de Woestyne announ= ced

    [ANN] YOCaml 3.0.0

    It had been a while since we announced a release of YOCaml (since 2.5= .0), but this weekend we released version 3.0.0 (alread= y available on OPAM)!

    Since version 2.5.0, many changes have been made to YOCaml, wh= ich you can read about in the release notes for the various versions releas= ed over the months: (2.6.0, 2.7.0, 2.8.0).

    Some major innovations that can be noted are:

    In addition, there are bug fixes, usability improvements, and… a drastic improvement in error reporting, which I will explain in = the next section!

    About the Outreachy

    Many of the improvements to YOCaml were made possible thanks to various par= ticipants in the Outreachy programme= , which led to @Linda_Njau being selected as an intern! His work is div= ided into two specific areas:

    • Drastically improve YOCaml error reporting : yocaml#113, yocaml#114, yocaml#116. Before these patches, YOCaml errors= were extremely difficult to diagnose. Since @Linda_Njau took care of them,= they are now easier to read, provide context (which file failed to create,= and which file was being read), and are displayed in the preview server, s= o you don't have to go and read the terminal!
    • The second part of his internship involves working on yocaml-codex, a project currently und= er development that aims to provide a standard library of templates for bui= lding websites faster with YOCaml and sharing the various templates that ha= ve been written over the course of the websites developed with YOCaml. Stay tuned!

    We are very satisfied (and impressed) with her work, and she has documented= her contributions in a blog… freshly designed, with YOCaml, of cour= se: https://engineering-yocaml-with-linda.netlify.app/articles/s= econd_article

    About the tutorial

    The tutorial is progressing slowly but surely, and we have notably added a = section that describes how to validate/project data to work with most descr= iption languages (such as Yaml, ToML, etc.) and most template engines (Jing= oo, Mustache, Liquid) : Your Own Data Model

    We also took the opportunity to clarify the use of file paths and document the resolver technique!

    We will continue to write sections and document the use of YOCaml, so if yo= u have any suggestions, comments, or requests, please send them to us!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=AZWMvqFu; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 4FE31400A7 for ; Tue, 24 Feb 2026 13:37:11 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=OOHgZDall2oAFHsqhY5dTQbqrxxvRRtwnuVGZVmu87c=; b=AZWMvqFuDP2NtMWZhjuVtg0p9DZ5kJXBRB5pdBcgX3V38bDlLD7gv2vr tJUN8iLDn/RZM42ktMX5aS4bukyvE7GSVB8ec6CMk9A9Wb0QDnji1cmMc VF2bPxWY9qu5m77pFvXCOLKANgfO82GZl3bMuARB+Sxk4ne1/UBJhA/8J w=; X-CSE-ConnectionGUID: 5UirxDr9T9+LVZOBjHbPfQ== X-CSE-MsgGUID: VTMRyDsMTVq5UMcLyTHs5A== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,308,1763420400"; d="scan'208,217";a="264935717" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Feb 2026 14:37:07 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 6DC5F83704; Tue, 24 Feb 2026 14:37:07 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 35B60805B4 for ; Tue, 24 Feb 2026 14:36:59 +0100 (CET) X-CSE-ConnectionGUID: gn4ZI2KgSimHy+CdAr9TiA== X-CSE-MsgGUID: O9cP1sFET2ua34WPv77/3Q== X-IronPort-AV: E=Sophos;i="6.21,308,1763420400"; d="scan'208,217";a="139663849" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Feb 2026 14:36:59 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 24 Feb 2026 14:36:57 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19458 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMTcgdG8gMjQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCk9TRUMt MjAyNi0wMSBpbiB0aGUgT0NhbWwgcnVudGltZTogQnVmZmVyIE92ZXItUmVhZCBpbiBPQ2FtbCBN YXJzaGFsIERlc2VyaWFsaXphdGlvbg0KT0NhbWwgNS40LjEgYW5kIDQuMTQuMyByZWxlYXNlZA0K QW5uOiBPY2hhdCDigJQgVHJ5IE9jaGF0IGZvciB0ZXJtaW5hbC1iYXNlZCBMTE0gd29ya2Zsb3dz DQpTZXJpYWxwb3J0IC0gbmV3IHNlcmlhbCBjb21tdW5pY2F0aW9uIGxpYnJhcnkNClNsaXBzaG93 IQ0KUmVtb3RlIE9DYW1sIERpc3RyaWJ1dGVkIFN5c3RlbXMgRW5naW5lZXIgKExpbnV4IC8gU3Rv cmFnZSAvIE5ldHdvcmtpbmcpIOKAkyB3aGl0ZXNreS5jbG91ZCDigJMgRU1FQS9Bc2lhDQpHcmFj ZSAwLjMuMCDwn5KFLCBmYW5jeSBkaWFnbm9zdGljcyBsaWJyYXJ5IGZvciBjb21waWxlcnMNCkpz X29mX29jYW1sIC8gV2FzbV9vZl9vY2FtbCA2LjMNCmtxdWV1ZS1tbCAwLjUuMA0KRHVuZSAzLjIx LjANCk90aGVyIE9DYW1sIE5ld3MNCk9sZCBDV04NCg0KDQpPU0VDLTIwMjYtMDEgaW4gdGhlIE9D YW1sIHJ1bnRpbWU6IEJ1ZmZlciBPdmVyLVJlYWQgaW4gT0NhbWwgTWFyc2hhbCBEZXNlcmlhbGl6 YXRpb24NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2luYm94LmNpLmRldi9jYW1sLWxpc3QvYzMyOTgzMDktYTA2ZC00YWM4LTg3NGMtZmUyMTA0MDc4 ZTYxQG1laG5lcnQub3JnL1QvPg0KDQoNCkhhbm5lcyBNZWhuZXJ0IGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgRGVhciBldmVyeW9uZSwNCg0KICBpdCBpcyBteSBwbGVhc3VyZSB0byBh bm5vdW5jZSB0aGUgZmlyc3Qgc2VjdXJpdHkgYW5ub3VuY2VtZW50IG9mIHRoaXMNCiAgeWVhciwg YW5kIHRoZSBmaXJzdCBjb29yZGluYXRlZCBieSB0aGUgbmV3IE9DYW1sIHNlY3VyaXR5IHJlc3Bv bnNlDQogIHRlYW0gKDxodHRwczovL29jYW1sLm9yZy9zZWN1cml0eT4pLg0KDQogIFBsZWFzZSBz dWJzY3JpYmUgdG8gdGhlIE9DYW1sIHNlY3VyaXR5IGFubm91bmNlbWVudCBtYWlsaW5nIGxpc3QN CiAgKDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vb2NzZi1vY2FtbC1zZWN1cml0 eS1hbm5vdW5jZW1lbnRzPikNCiAgdG8gcmVjZWl2ZSBhbGwgc2VjdXJpdHkgYWR2aXNvcmllcy4g VG8gdGhpcyBtYWlsaW5nIGxpc3QgSSdsbCBvbmx5DQogIGNvcHkgdGhvc2UgYWZmZWN0aW5nIHRo ZSBjb3JlIG9mIE9DYW1sIGRpc3RyaWJ1dGlvbi4NCg0KICBJdCBzaG91bGQgYW55IG1vbWVudCBu b3cgYWxzbyBhcHBlYXIgYXQNCiAgPGh0dHBzOi8vb3N2LmRldi9saXN0P3E9T1NFQy0yMDI2LTAx Pg0KDQogIEh1bWFuIGxpbms6DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvc2VjdXJpdHkt YWR2aXNvcmllcy90cmVlL21haW4vYWR2aXNvcmllcy8yMDI2L09TRUMtMjAyNi0wMS5tZD4NCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIGlkOiBPU0VDLTIwMjYtMDENCiAg4pSCIG1vZGlmaWVk OiAiMjAyNi0wMi0xN1QxMzozMDowMFoiDQogIOKUgiBwdWJsaXNoZWQ6ICIyMDI2LTAyLTE3VDEz OjMwOjAwWiINCiAg4pSCIGFsaWFzZXM6IFsgIEdIU0EtajI2ai1tNXhyLWcyM2MgR0hTQS1tMzRy LWNncTctamhmbSBdDQogIOKUgiBzZXZlcml0eTogIkNWU1M6My4xL0FWOkwvQUM6TC9QUjpOL1VJ Ok4vUzpVL0M6SC9JOkwvQTpOIg0KICDilIIgc2V2ZXJpdHlfc2NvcmU6ICI2LjgiDQogIOKUgiBh ZmZlY3RlZDogIm9jYW1sIiB7PCAiNC4xNC4zIiB8ICg+PSAiNSIgJiA8ICI1LjQuMSIpfQ0KICDi lIIgZXZlbnRzOiBbDQogIOKUgiAgICBbDQogIOKUgiAgICAgIGdpdCAiaHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sIiBbDQogIOKUgiAgICAgICAgW2ZpeGVkICJiMGEyNjE0Njg0YTUyYWNk ZWQ3ODRlYzIxM2YxNGRkZmUwODVkMTQ2Il0NCiAg4pSCICAgICAgXQ0KICDilIIgICAgXQ0KICDi lIIgICAgWw0KICDilIIgICAgICBnaXQgImh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbCIg Ww0KICDilIIgICAgICAgIFtmaXhlZCAiZTM5MTlmZWY0MzZmODkyNzFiYzMwYmJlODU5Mjg1MWY3 Mjg5ZmI2OCJdDQogIOKUgiAgICAgIF0NCiAg4pSCICAgIF0NCiAg4pSCIF0NCiAg4pSCIHJlZmVy ZW5jZXM6IFsNCiAg4pSCICAgIFtyZXBvcnQgDQogIOKUgiAiaHR0cHM6Ly9naXRodWIuY29tL29j YW1sL3NlY3VyaXR5LWFkdmlzb3JpZXMvc2VjdXJpdHkvYWR2aXNvcmllcy9HSFNBLWoyNmotbTV4 ci1nMjNjIl0NCiAg4pSCIF0NCiAg4pSCIGNyZWRpdHM6IFsNCiAg4pSCICAgIFtyZXBvcnRlciAi SnVzdGluIFRpbXBlcmlvIl0NCiAg4pSCICAgIFtyZW1lZGlhdGlvbl9kZXZlbG9wZXIgIk5pY29s w6FzIE9qZWRhIELDpHIiXQ0KICDilIIgICAgW3JlbWVkaWF0aW9uX2RldmVsb3BlciAiWGF2aWVy IExlcm95Il0NCiAg4pSCICAgIFtyZW1lZGlhdGlvbl9kZXZlbG9wZXIgIkdhYnJpZWwgU2NoZXJl ciJdDQogIOKUgiAgICBbcmVtZWRpYXRpb25fcmV2aWV3ZXIgIlhhdmllciBMZXJveSJdDQogIOKU giAgICBbcmVtZWRpYXRpb25fcmV2aWV3ZXIgIk9saXZpZXIgTmljb2xlIl0NCiAg4pSCICAgIFty ZW1lZGlhdGlvbl92ZXJpZmllciAiTWluZHkgUHJlc3RvbiJdDQogIOKUgiAgICBbcmVtZWRpYXRp b25fdmVyaWZpZXIgIkVkd2luIFTDtnLDtmsiXQ0KICDilIIgICAgW2Nvb3JkaW5hdG9yICJIYW5u ZXMgTWVobmVydCJdDQogIOKUgiBdDQogIOKUgiBjd2U6IFsgQ1dFLTEyNiBDV0UtNTAyIENXRS03 NTQgXQ0KICDilJTilIDilIDilIDilIANCg0KICAqQnVmZmVyIE92ZXItUmVhZCBpbiBPQ2FtbCBN YXJzaGFsIERlc2VyaWFsaXphdGlvbioNCg0KDQpTdW1tYXJ5DQrilYzilYzilYzilYzilYzilYzi lYwNCg0KICBBIGNyaXRpY2FsIGJ1ZmZlciBvdmVyLXJlYWQgdnVsbmVyYWJpbGl0eSBpbiBPQ2Ft bCdzIE1hcnNoYWwNCiAgZGVzZXJpYWxpemF0aW9uIChydW50aW1lL2ludGVybi5jKSBlbmFibGVz IHJlbW90ZSBjb2RlIGV4ZWN1dGlvbg0KICB0aHJvdWdoIGEgbXVsdGktcGhhc2UgYXR0YWNrIGNo YWluLiBUaGUgdnVsbmVyYWJpbGl0eSBzdGVtcyBmcm9tDQogIG1pc3NpbmcgYm91bmRzIHZhbGlk YXRpb24gaW4gdGhlIHJlYWRibG9jaygpIGZ1bmN0aW9uLCB3aGljaCBwZXJmb3Jtcw0KICB1bmJv dW5kZWQgbWVtY3B5KCkgb3BlcmF0aW9ucyB1c2luZyBhdHRhY2tlci1jb250cm9sbGVkIGxlbmd0 aHMgZnJvbQ0KICBtYWxpY2lvdXMgTWFyc2hhbCBkYXRhLg0KDQogIFBsZWFzZSBub3RlIHRoYXQg TWFyc2hhbCBpcyBub3QgdHlwZSBzYWZlLCBhbmQgeW91IGhhdmUgdG8gYmUgY2FyZWZ1bA0KICBp ZiB5b3UgdXNlIHRoZSBkZXNlcmlhbGl6YXRpb24gb24gdW50cnVzdGVkIGlucHV0IChkdWUgdG8g dHlwZQ0KICBjb25mdXNpb24sIGFuZCByZW1vdGUgY29kZSBleGVjdXRpb24gYnkgZGVzaWduIC0g eW91IGNhbiB1c2UgTWFyc2hhbA0KICBmb3IgY29kZSkuDQoNCiAgQWZmZWN0ZWQgZnVuY3Rpb25z OiBgTWFyc2hhbC5mcm9tX2NoYW5uZWwnLCBgTWFyc2hhbC5mcm9tX2J5dGVzJywNCiAgYE1hcnNo YWwuZnJvbV9zdHJpbmcnLCBgU3RkbGliLmlucHV0X3ZhbHVlJywgYFBlcnZhc2l2ZXMuaW5wdXRf dmFsdWUnDQogIHdoZW4gcmVhZGluZyBkYXRhIGZyb20gYW4gdW50cnVzdGVkIHNvdXJjZS4NCg0K DQpWdWxuZXJhYmlsaXR5IEF0dGFjayBWZWN0b3INCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIENvcnJ1cHRlZCBvciBtYWxpY2lvdXMgbWFyc2hhbGVkIGRhdGEgdGhhdCBjYXVzZXMgdW5k ZWZpbmVkIGJlaGF2aW91cg0KICBpbiB0aGUgcnVudGltZSBzeXN0ZW0gd2hlbiB1bm1hcnNoYWxl ZC4gIGBpbnB1dF92YWx1ZScgc2hvdWxkIGVpdGhlcg0KICBmYWlsIGNsZWFubHkgb3IgcHJvZHVj ZSBhIHdlbGwtZm9ybWVkIE9DYW1sIG9iamVjdCwgd2l0aG91dCBjb3JydXB0aW5nDQogIHRoZSBy dW50aW1lIHN5c3RlbS4NCg0KICBDb25zZXF1ZW50bHksIHRoaXMgZXhjbHVkZXM6DQoNCiAg4oCi IHdlbGwtZm9ybWVkIG1hcnNoYWxlZCBkYXRhIHRoYXQgcHJvZHVjZXMgYW4gT0NhbWwgb2JqZWN0 IHRoYXQgaXMgbm90DQogICAgb2YgdGhlIHR5cGUgZXhwZWN0ZWQgYnkgdGhlIE9DYW1sIGNvZGUg YW5kIGNhdXNlcyB0aGUgT2NhbWwgY29kZSB0bw0KICAgIGNyYXNoIG9yIG1pc2JlaGF2ZQ0KDQog IOKAoiBtaXN1c2VzIG9mIHRoZSBPQ2FtbCBydW50aW1lIHN5c3RlbSBieSB0aGUgcHJvZ3JhbSBw ZXJmb3JtaW5nDQogICAgaW5wdXRfdmFsdWUsIHN1Y2ggYXMgc2V0dGluZyBgRGVidWdnZXIuZnVu Y3Rpb25fcGxhY2Vob2xkZXInIHRvIHRoZQ0KICAgIHdyb25nIGZ1bmN0aW9uLg0KDQogIFRoZSBm b3JtZXIgaXNzdWUgbWF5IGJlIGFkZHJlc3NlZCBhdCBzb21lIHBvaW50IGJ5IHZhbGlkYXRpbmcg dGhlDQogIHVubWFyc2hhbGVkIE9DYW1sIHZhbHVlIGFnYWluc3QgdGhlIGV4cGVjdGVkIHR5cGUs IHVzaW5nIHRoZSBmdW5jdGlvbnMNCiAgZnJvbSBtb2R1bGUgYE9iaicgYW5kIHNvbWUga2luZCBv ZiBydW4tdGltZSB0eXBlIGRlc2NyaXB0aW9uLg0KDQogIFRoZSBsYXR0ZXIgaXNzdWUgaXMgYSBi dWcgaW4gdGhlIHByb2dyYW0gdGhhdCB1bm1hcnNoYWxzIHRoZSBkYXRhLg0KDQoNCkZpeA0K4pWM 4pWM4pWMDQoNCuKXiiBPQ2FtbCBydW50aW1lDQoNCiAgVGhlIE9DYW1sIHJ1bnRpbWUgaGFzIGJl ZW4gaGFyZGVuZWQgd2l0aCBhZGRpdGlvbmFsIGJvdW5kcyBjaGVja3MuIEFuDQogIGV4Y2VwdGlv biBpcyByYWlzZWQgb24gYmFkIGlucHV0Lg0KDQoNCuKXiiBUaGlyZCBwYXJ0eSBsaWJyYXJpZXMN Cg0KICBUaGlyZCBwYXJ0eSBsaWJyYXJpZXMgdGhhdCB3YW50IHRvIGhhcmRlbiB0aGVpciBjdXN0 b20gTWFyc2hhbA0KICBkZXNlcmlhbGl6YXRpb24gY29kZSBjYW4gZm9sbG93IHRoZSBleGFtcGxl IGZpeCBmb3IgYmlnYXJyYXlzIGZyb20gdGhlDQogIHN0YW5kYXJkIGxpYnJhcnkuICBUaGVyZSBh cmUgbmV3IG1hY3JvcyBpbiBgY3VzdG9tLmgnIGNhbGxlZA0KICBgV3NpemVfY3VzdG9tX2RhdGEn IGFuZCBgQnNpemVfY3VzdG9tX2RhdGEnIHRoYXQgcmV0dXJuIHRoZSBzaXplIGluDQogIHdvcmRz IG9yIGJ5dGVzIG9mIHRoZSBhbGxvY2F0ZWQgY3VzdG9tIGRlc3RpbmF0aW9uIGJsb2NrLiBUaGUN CiAgZGVzZXJpYWxpemVyIG5lZWRzIHRvIGVuc3VyZSBpdCBvbmx5IHdyaXRlcyBkYXRhIHdpdGhp biB0aG9zZSBib3VuZHMuDQoNCiAgVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgaWYgdGhlIGxp YnJhcnkgZGVmaW5lcyBhIGN1c3RvbSB0eXBlIGluIGEgQw0KICBiaW5kaW5nLCBhbmQgYHN0cnVj dCBjdXN0b21fb3BlcmF0aW9ucycncyBgZGVzZXJpYWxpemUnIGZpZWxkIGlzIG5vdA0KICBzZXQg dG8gYE5VTEwnIG9yIGBjdXN0b21fZGVzZXJpYWxpemVfZGVmYXVsdCcsIGFuZCBgc3RydWN0DQog IGN1c3RvbV9vcGVyYXRpb25zJydzIGBmaXhlZF9sZW5ndGgnIGZpZWxkIGlzIHNldCB0byBgTlVM TCcgb3INCiAgYGN1c3RvbV9maXhlZF9sZW5ndGhfZGVmYXVsdCcNCg0KICBTaW5jZSBgTWFyc2hh bC5mcm9tKicgYW5kIGBpbnB1dF92YWx1ZScgcmVtYWluIHVuc2FmZSB0byB1c2UsIHRoZSBmaXgN CiAgZm9yIHRoZSBPQ2FtbCBydW50aW1lIGlzIHJlbGVhc2VkLCBhbmQgd2Ugd291bGRuJ3QgYXR0 ZW1wdCB0bw0KICBjb29yZGluYXRlIHVwZGF0aW5nIGFsbCBkZXNlcmlhbGl6YXRpb24gZnVuY3Rp b25zIGluIHRoZSBlY29zeXN0ZW0uDQoNCg0KVGltZWxpbmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBOb3YgNHRoIDIwMjU6IERpc2NvdmVyeSBEYXRlOiBEaXNjb3ZlcmVkIGZp cnN0IGluIE94Q2FtbA0KICDigKIgTm92IDV0aCAyMDI1OiBGaXJzdCBEaXNjbG9zdXJlIERhdGUg KEphbmUgU3RyZWV0IFRlYW0pOiBFbWFpbGVkIHRvcA0KICAgIG1haW50YWluZXJzLCBubyByZXNw b25zZS4NCiAg4oCiIE5vdiA5dGggMjAyNTogU2Vjb25kIERpc2Nsb3N1cmUgRGF0ZSAoT0NhbWwg VGVhbSk6IFN1Ym1pdHRlZCB0bw0KICAgIE9DYW1sL29jYW1sIEdpdEh1YiBSZXBvIGFzIGEgU2Vj dXJpdHkgQWR2aXNvcnkuDQogIOKAoiBOb3YgMTF0aCAyMDI1OiBFbWFpbGVkIE9DYW1sIFNlY3Vy aXR5IE1haWwgTGlzdDogU3VibWl0dGVkIHRvIE9DYW1sDQogICAgb3ZlciBlbWFpbCwgcmVzcG9u ZGVkIGFza2luZyBmb3IgZGV0YWlscy4NCiAg4oCiIE5vdiAxMXRoIDIwMjU6IFRoaXJkIERpc2Ns b3N1cmUgKE9DYW1sIFNlY3VyaXR5IFJlc3BvbnNlIFRlYW0pOg0KICAgIFN1Ym1pdHRlZCB0byBv Y2FtbC9zZWN1cml0eS1hZHZpc29yaWVzIEdpdEh1YiBSZXBvIGFzIGEgU2VjdXJpdHkNCiAgICBB ZHZpc29yeS4NCiAg4oCiIERlYyAxNnRoIDIwMjU6IEluaXRpYWwgcGF0Y2ggaXMgZGV2ZWxvcGVk DQogIOKAoiBEZWMgMTd0aCAyMDI1OiBGdXp6IHRlc3RpbmcgZm91bmQgZnVydGhlciBpc3N1ZXMN CiAg4oCiIERlYyAyNHRoIDIwMjU6IEZpbmFsIHBhdGNoIGZvciBPQ2FtbCBpcyBkZXZlbG9wZWQN CiAg4oCiIERlYyAyNXRoIDIwMjU6IEZ1enogdGVzdGluZyBjb3VsZG4ndCBmaW5kIGFueSBmdXJ0 aGVyIGlzc3Vlcw0KICDigKIgSmFuIDJuZCAyMDI2OiBQYXRjaCBnb3QgcmV2aWV3ZWQgYnkgT0Nh bWwgbWFpbnRhaW5lcnMNCiAg4oCiIEphbiA0dGggMjAyNjogQmVuY2htYXJraW5nIG9mIHRoZSBw YXRjaCB3aXRoIGdvb2QgcmVzdWx0cw0KICDigKIgSmFuIDZ0aCAyMDI2OiBSZXBvcnRlciBnb3Qg Y29udGFjdGVkIHRvIGNvbmZpcm0NCiAg4oCiIEphbiAyNXRoIDIwMjY6IEZ1cnRoZXIgcmVsYXRl ZCBpc3N1ZXMgZGlzY292ZXJlZCBieSBmdXp6aW5nDQogIOKAoiBGZWIgMTd0aCAyMDI2OiBmaXhl ZCBPQ2FtbCByZWxlYXNlcyBhcmUgcHVibGlzaGVkLCBzZWN1cml0eSBhZHZpc29yeQ0KICAgIGlz IHB1Ymxpc2hlZA0KDQoNCk9DYW1sIDUuNC4xIGFuZCA0LjE0LjMgcmVsZWFzZWQNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvb2NhbWwtNS00LTEtYW5kLTQtMTQtMy1yZWxlYXNlZC8xNzgyMi8x Pg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFdlIGhhdmUgdGhlIHBsZWFzdXJlIG9m IGFubm91bmNpbmcgdGhlIGR1YWwgcmVsZWFzZXMgb2YgT0NhbWwgNC4xNC4zDQogIGFuZCBPQ2Ft bCA1LjQuMSwgZGVkaWNhdGVkIHRvIHRoZSBtZW1vcnkgb2YgTmljb2xhYXMgR292ZXJ0IGRlIEJy dWlqbg0KICBvbiB0aGUgYW5uaXZlcnNhcnkgb2YgaGlzIGRlYXRoLg0KDQogIFRob3NlIHJlbGVh c2VzIGFyZSBhIGNvbGxlY3Rpb24gb2Ygc2FmZSBhbmQgdmFsdWFibGUgcnVudGltZSBidWdmaXhl cy4NCiAgVGhlIE9DYW1sIDUuNC4xIHJlbGVhc2UgYWxzbyBjb250YWlucyBhIGZpeCBmb3IgdGhl IGAtcGFjaycgbW9kZSBmb3INCiAgbWFjT3MgYW5kIHZhcmlvdXMgVFNBTiBmaXhlcy4NCg0KICBN b3JlIGltcG9ydGFudGx5LCB0aG9zZSBuZXcgdmVyc2lvbnMgaGFyZGVuIHRoZSBNYXJzaGFsIG1v ZHVsZSBhZ2FpbnN0DQogIG1hbGljaW91cyBpbnB1dHMgYXMgZGVzY3JpYmVkIGluIHRoZSBzZWN1 cml0eSBhbm5vdW5jZW1lbnQNCiAgW09TRUMtMjAyNi0wMV0uDQoNCiAgV2UgYXJlIGVuY291cmFn aW5nIHlvdSB0byBzd2l0Y2ggdG8gdGhvc2UgbmV3IHJlbGVhc2VzIHdoZW5ldmVyDQogIHBvc3Np YmxlLg0KDQogIERvbid0IGhlc2l0YXRlIHRvIHJlcG9ydCBhbnkgYnVncyBvbiB0aGUgW09DYW1s IGlzc3VlIHRyYWNrZXJdLg0KDQogIFNlZSB0aGUgbGlzdCBvZiBjaGFuZ2VzIGJlbG93IGZvciBt b3JlIGRldGFpbHMuDQoNCiAgSGFwcHkgaGFja2luZywg4oCTIEZsb3JpYW4gQW5nZWxldHRpIGZv ciB0aGUgT0NhbWwgdGVhbS4NCg0KDQogICpJbnN0YWxsYXRpb24gSW5zdHJ1Y3Rpb25zKg0KDQog IFRoZSBiYXNlIGNvbXBpbGVycyB3aWxsIGJlIHNvb24gaW5zdGFsbGFibGUgYXMgYW4gb3BhbSBz d2l0Y2ggd2l0aCB0aGUNCiAgZm9sbG93aW5nIGNvbW1hbmRzOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgb3BhbSB1cGRhdGUNCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA0LjE0LjMNCiAg 4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjQuMQ0KICDilJTilIDilIDilIDilIANCg0KDQogIFRo ZSBzb3VyY2UgY29kZSBmb3IgdGhlIHJlbGVhc2UgY2FuZGlkYXRlIGlzIGFsc28gZGlyZWN0bHkg YXZhaWxhYmxlDQogIG9uOg0KDQogIOKAoiBHaXRIdWI6DQogICAg4oCiIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvYXJjaGl2ZS80LjE0LjMudGFyLmd6Pg0KICAgIOKAoiA8aHR0cHM6 Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2FyY2hpdmUvNS40LjEudGFyLmd6Pg0KDQogIOKAoiBJ bnJpYSBhcmNoaXZlOg0KICAgIOKAoiA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmli L29jYW1sLTQuMTQvb2NhbWwtNC4xNC4zLnRhci5nej4NCiAgICDigKIgPGh0dHBzOi8vY2FtbC5p bnJpYS5mci9wdWIvZGlzdHJpYi9vY2FtbC01LjQvb2NhbWwtNS40LjEudGFyLmd6Pg0KDQoNCiAg Kk9DYW1sIDQuMTQuMyAoMTcgRmVicnVhcnkgMjAyNikqDQoNCiAg4oCiIFsjMTIwNzBdLCBbIzEy MDc1XSwgWyMxMzIwOV06IGF1dG8tZGV0ZWN0IHdoZXRoZXIgYGFyJyBzdXBwb3J0IEBGSUxFDQog ICAgYXJndW1lbnRzIGF0IGNvbmZpZ3VyZS10aW1lIHRvIGF2b2lkIHVzaW5nIHRoaXMgZmVhdHVy ZSB3aXRoDQogICAgdG9vbGNoYWlucyB0aGF0IGRvIG5vdCBzdXBwb3J0IGl0IChlZyBGcmVlQlNE L0Rhcndpbik7IGJhY2twb3J0IGZyb20NCiAgICA1LjMuICAoYmFja3BvcnQgYnkgQm9yaXMgRG9i cm9zbGF2b3YsIG9yaWdpbmFsIGZpeCBieSBOaWNvbMOhcyBPamVkYQ0KICAgIELDpHIsIHJldmll dyBieSBYYXZpZXIgTGVyb3ksIERhdmlkIEFsbHNvcHAsIEphdmllciBDaMOhdmFycmksIEFuaWwN CiAgICBNYWRoYXZhcGVkZHkpDQoNCiAg4oCiIFsjMTIyMDddLCBbIzEyMjIyXTogTWFrZSBjbG9z dXJlIGNvbXB1dGF0aW9uIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mDQogICAgcmVjdXJzaXZlIGZ1 bmN0aW9ucyBpbnN0ZWFkIG9mIHF1YWRyYXRpYyAoVmluY2VudCBMYXZpcm9uLCByZXBvcnQgYnkN CiAgICBGcmFuw6dvaXMgUG90dGllciwgcmV2aWV3IGJ5IE5hdGhhbmHDq2xsZSBDb3VyYW50IGFu ZCBHYWJyaWVsIFNjaGVyZXIpDQoNCiAg4oCiIFsjMTM0MzBdLCBbIzEzNDM0XTogcHJvdGVjdCBt ZW1vcnktc2FmZXR5IG9uIExhenkuZm9yY2UgcmFjZXMNCiAgICAoR2FicmllbCBTY2hlcmVyIGFu ZCBWaW5jZW50IExhdmlyb24sIHJlcG9ydCBieSBFZHdpbiBUw7Zyw7ZrLCByZXZpZXcNCiAgICBi eSBWaW5jZW50IExhdmlyb24pDQoNCiAg4oCiIFsjMTM0NDhdLCBbIzEzNDQ5XTogZml4IGEgY29k ZS1nZW5lcmF0aW9uIGJ1ZyBvbiB1bnNhZmUgYXJyYXkNCiAgICBhY2Nlc3NlcyBhdCB0eXBlIGlu dDMyLCBpbnQ2NCwgbmF0aXZlaW50LCB3aGljaCBoYXMgYmVlbiBpbnRyb2R1Y2VkDQogICAgaW4g T0NhbWwgNC4wNC4gIChHYWJyaWVsIFNjaGVyZXIsIHJldmlldyBieSBOaWNvbMOhcyBPamVkYSBC w6RyIGFuZA0KICAgIFZpbmNlbnQgTGF2aXJvbiwgcmVwb3J0IGJ5IFNpbW9uIENydWFuZXMpDQoN CiAg4oCiIFsjMTM1MTZdOiBGaXggcmVncmVzc2lvbiB3aGVyZSBlcnJvciBjb25kaXRpb25zIGR1 cmluZyBieXRlY29kZQ0KICAgIGluaXRpYWxpc2F0aW9uIGNhdXNlZCBhIHNlZ21lbnRhdGlvbiBm YXVsdCByYXRoZXIgdGhhbiBiZWluZw0KICAgIHByb3Blcmx5IHJlcG9ydGVkIChyZWdyZXNzaW9u IG9mIFsjNTExNV0gaW4gWyMxMTc4OF0pIChEYXZpZA0KICAgIEFsbHNvcHAsIHJldmlldyBieSBO aWNvbMOhcyBPamVkYSBCw6RyKQ0KDQogIOKAoiBbIzEzODQ3XTogT24gV2luZG93cywgbWFpbnRh aW4gYSBudW1iZXIgb2YgdGhyZWFkcyB3YWl0aW5nIG9uIHRoZQ0KICAgIG1hc3RlciBsb2NrIHRv IGF2b2lkIHVubmVjZXNzYXJ5IGNvbnRleHQgc3dpdGNoZXMgKERtaXRyeSBCZWx5LA0KICAgIHJl dmlldyBieSBBbnRvbmluIETDqWNpbW8pDQoNCiAg4oCiIFsjMTQwMDddLCBbIzE0MDE1XTogRml4 IG1lbW9yeSBjb3JydXB0aW9uIHdoZW4gYW4gZXhjZXB0aW9uIGlzDQogICAgcmFpc2VkIGR1cmlu ZyBkZW1hcnNoYWxpbmcuICAoQmVub8OudCBWYXVnb24sIHJldmlldyBieSBEYXZpZCBBbGxzb3Bw DQogICAgYW5kIEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgW09TRUMtMjAyNi0wMV06IHJvYnVz dGlmeSBpbnRlcm4uYyAoWGF2aWVyIExlcm95LCByZXZpZXcgYnkgRGFtaWVuDQogICAgRG9saWdl eiBhbmQgT2xpdmllciBOaWNvbGUpDQoNCiAgKk9DYW1sIDUuNC4xICgxNyBGZWJydWFyeSAyMDI2 KSoNCg0KDQpbT1NFQy0yMDI2LTAxXSA8aHR0cHM6Ly9vc3YuZGV2L3Z1bG5lcmFiaWxpdHkvT1NF Qy0yMDI2LTAxPg0KDQpbT0NhbWwgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXM+DQoNClsjMTIwNzBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv b2NhbWwvaXNzdWVzLzEyMDcwPg0KDQpbIzEyMDc1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1s L29jYW1sL2lzc3Vlcy8xMjA3NT4NCg0KWyMxMzIwOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9vY2FtbC9pc3N1ZXMvMTMyMDk+DQoNClsjMTIyMDddIDxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvb2NhbWwvaXNzdWVzLzEyMjA3Pg0KDQpbIzEyMjIyXSA8aHR0cHM6Ly9naXRodWIuY29tL29j YW1sL29jYW1sL2lzc3Vlcy8xMjIyMj4NCg0KWyMxMzQzMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC9pc3N1ZXMvMTM0MzA+DQoNClsjMTM0MzRdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzLzEzNDM0Pg0KDQpbIzEzNDQ4XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL2lzc3Vlcy8xMzQ0OD4NCg0KWyMxMzQ0OV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTM0NDk+DQoNClsjMTM1MTZdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzEzNTE2Pg0KDQpbIzUxMTVdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzUxMTU+DQoNClsjMTE3ODhdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvaXNzdWVzLzExNzg4Pg0KDQpbIzEzODQ3XSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL2lzc3Vlcy8xMzg0Nz4NCg0KWyMxNDAwN10gPGh0dHBzOi8vZ2l0aHVi LmNvbS9vY2FtbC9vY2FtbC9pc3N1ZXMvMTQwMDc+DQoNClsjMTQwMTVdIDxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvb2NhbWwvaXNzdWVzLzE0MDE1Pg0KDQpCdWcgZml4ZXM6DQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICDigKIgWyMxNDAxMF06IEZpeCBtaXNjb21waWxhdGlv biAvIGxpdmVuZXNzIGVycm9ycyBmb3Igc3RyaW5nIG9wZXJhdGlvbnMNCiAgICAoTWFyayBTaGlu d2VsbCwgWGF2aWVyIENsZXJjLCByZXZpZXcgYnkgWGF2aWVyIExlcm95IGFuZCBHYWJyaWVsDQog ICAgU2NoZXJlcikNCg0KICDigKIgWyMxNDA2NV06IEZpeCBmdW5jdGlvbiBzaWduYXR1cmUgbWlz bWF0Y2ggb2YgYF9fdHNhbl9mdW5jX2V4aXQnIHdpdGgNCiAgICBHQ0MgMTUuICBDaGVjayBpbiB0 aGUgY29uZmlndXJlIHN0ZXAgaWYgdGhlIFRTYW4gcHJvdmlkZWQgaW50ZXJuYWwNCiAgICBidWls dGlucyBhcmUgdGhlIHNhbWUgYXMgd2hhdCB3ZSBleHBlY3QsIGludHJvZHVjZSBgY2FtbF90c2Fu XyonDQogICAgd3JhcHBlcnMgZm9yIHRoZSBgX190c2FuXyonIGZ1bmN0aW9ucyB3ZSB1c2UuICAo SGFyaSBIYXJhIE5hdmVlbiBTLA0KICAgIHJlcG9ydCBieSBIYXJpIEhhcmEgTmF2ZWVuIFMsIHJl dmlldyBieSBHYWJyaWVsIFNjaGVyZXIsIEFudG9uaW4NCiAgICBEw6ljaW1vLCBPbGl2aWVyIE5p Y29sZSkNCg0KICDigKIgWyMxNDQxN106IEZpeCBpc3N1ZSB3aXRoIG5lc3RlZCBwYWNrcyBvbiBt YWNPUy4gIChWaW5jZW50IExhdmlyb24sDQogICAgcmVwb3J0IGJ5IEthdGUgRGVwbGFpeCwgcmV2 aWV3IGJ5IEdhYnJpZWwgU2NoZXJlcikNCg0KICDigKIgWyMxNDIxM106IEZpeCBzaGFkb3ctc3Rh Y2stcmVsYXRlZCBjcmFzaGVzIHdpdGggVFNhbiAoT2xpdmllcg0KICAgIE5pY29sZSwgcmVwb3J0 IGJ5IE5hdGhhbiBUYXlsb3IsIHJldmlldyBieSBHYWJyaWVsIFNjaGVyZXIgYW5kDQogICAgU3Rl ZmFuIE11ZW56ZWwpDQoNCiAg4oCiIFsjMTQyNTVdOiBGaXggVFNhbiBidWcgd2l0aCBDIGNhbGxz IHRoYXQgdGFrZSBtYW55IGFyZ3VtZW50cw0KICAgIChPbGl2aWVyIE5pY29sZSBhbmQgTWlvZCBW YWxsYXQsIHJlcG9ydCBieSBOYXRoYW4gVGF5bG9yLCByZXZpZXcgYnkNCiAgICBHYWJyaWVsIFNj aGVyZXIpDQoNCiAg4oCiIFtPU0VDLTIwMjYtMDFdOiByb2J1c3RpZnkgaW50ZXJuLmMgKFhhdmll ciBMZXJveSBhbmQgTmljb2zDoXMgT2plZGENCiAgICBCw6RyLCByZXZpZXcgYnkgT2xpdmllciBO aWNvbGUsIE1pbmR5IFByZXN0b24sIEVkd2luIFTDtnLDtmssIGFuZA0KICAgIEdhYnJpZWwgU2No ZXJlcikNCg0KDQpbIzE0MDEwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vl cy8xNDAxMD4NCg0KWyMxNDA2NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9pc3N1 ZXMvMTQwNjU+DQoNClsjMTQ0MTddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvaXNz dWVzLzE0NDE3Pg0KDQpbIzE0MjEzXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sL2lz c3Vlcy8xNDIxMz4NCg0KWyMxNDI1NV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2FtbC9p c3N1ZXMvMTQyNTU+DQoNCltPU0VDLTIwMjYtMDFdIDxodHRwczovL29zdi5kZXYvdnVsbmVyYWJp bGl0eS9PU0VDLTIwMjYtMDE+DQoNCg0KQW5uOiBPY2hhdCDigJQgVHJ5IE9jaGF0IGZvciB0ZXJt aW5hbC1iYXNlZCBMTE0gd29ya2Zsb3dzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1vY2hhdC10cnktb2NoYXQtZm9yLXRlcm1pbmFsLWJhc2VkLWxsbS13b3Jr Zmxvd3MvMTc4MjkvMT4NCg0KDQpEYWtvdGEgTXVycGh5IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgSGkgYWxsIOKAlCBJ4oCZZCBsaWtlIHRvIHNoYXJlIGEgcHJvamVjdCBJ4oCZdmUgYmVl biBidWlsZGluZzogKk9jaGF0Ki4NCg0KICDigKIgUmVwbzogKltodHRwczovL2dpdGh1Yi5jb20v ZGFrb3RhbXVycGh5dWNmL29jaGF0XSoNCiAg4oCiIERlbW86ICpbaHR0cHM6Ly95b3V0dS5iZS9l R2dtVWRaZm54TV0qDQoNCg0KW2h0dHBzOi8vZ2l0aHViLmNvbS9kYWtvdGFtdXJwaHl1Y2Yvb2No YXRdDQo8aHR0cHM6Ly9naXRodWIuY29tL2Rha290YW11cnBoeXVjZi9vY2hhdD4NCg0KW2h0dHBz Oi8veW91dHUuYmUvZUdnbVVkWmZueE1dIDxodHRwczovL3lvdXR1LmJlL2VHZ21VZFpmbnhNPg0K DQoqV2hhdCBpdCBpcyoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IE9jaGF0IGlzIGEgdG9vbGtpdCBmb3IgYnVpbGRpbmcgTExNIHdvcmtmbG93cyBhcyAqcGxhaW4g ZmlsZXMqLiBUaGUNCiAgY29yZSBmb3JtYXQgaXMgKkNoYXRNYXJrZG93biAoQ2hhdE1EKSo6IE1h cmtkb3duIHBsdXMgYSBzbWFsbCwgY2xvc2VkDQogIFhNTCB2b2NhYnVsYXJ5Lg0KDQogIEEgc2lu Z2xlIENoYXRNRCBmaWxlIGlzIGJvdGg6DQoNCiAg4oCiIHRoZSAqcHJvbXB0L3Byb2dyYW0qICht b2RlbCBjb25maWcsIHRvb2wgYWxsb3dsaXN0LCBpbnN0cnVjdGlvbnMsDQogICAgY29udGV4dCks IGFuZA0KICDigKIgdGhlICphdWRpdGFibGUgdHJhbnNjcmlwdCogKGFzc2lzdGFudCByZXBsaWVz ICsgdG9vbCBjYWxscyArIHRvb2wNCiAgICBvdXRwdXRzKQ0KDQogIEJlY2F1c2UgZXZlcnl0aGlu ZyBpcyBwbGFpbiB0ZXh0LCB3b3JrZmxvd3MgYXJlIHJlcHJvZHVjaWJsZSBhbmQNCiAgZGlmZmFi bGUgaW4gZ2l0Lg0KDQoNCipQcm9tcHQgcGFja3M6IGJ1aWxkaW5nIGxhcmdlciB3b3JrZmxvd3Mg ZnJvbSBzbWFsbCBhZ2VudHMqDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBPY2hhdCBzdXBwb3J0cyAqYWdlbnQtYXMt dG9vbCo6IHlvdSBjYW4gbW91bnQgb25lIENoYXRNRCBwcm9tcHQgYXMgYQ0KICBjYWxsYWJsZSB0 b29sIGluc2lkZSBhbm90aGVyLiBUaGlzIGxldHMgeW91IGJ1aWxkICpwcm9tcHQgcGFja3MqDQog IChwbGFubmVyL2NvZGVyL3Jldmlld2VyL2RvY3MvdGVzdCB0cmlhZ2UvZXRjLikgYW5kIG9yY2hl c3RyYXRlIHRoZW0NCiAgZnJvbSBhIHRvcC1sZXZlbCBwcm9tcHQsIHdpdGhvdXQgd3JpdGluZyBh IGN1c3RvbSDigJxhZ2VudCBhcHDigJ0uDQoNCg0KKmNoYXRfdHVpOiBhIE5vdHR5LWJhc2VkIHRl cm1pbmFsIFVJIChydW50aW1lIHVzZXMgRWlvKSoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIE9jaGF0IHNoaXBzIGFuIGludGVyYWN0 aXZlIHRlcm1pbmFsIFVJIGNhbGxlZCAqY2hhdF90dWkqLg0KDQogIOKAoiBUaGUgVUkgaXMgYnVp bHQgd2l0aCAqTm90dHkqDQogIOKAoiBUaGUgdW5kZXJseWluZyBydW50aW1lIHVzZXMgKkVpbyog KHN0cnVjdHVyZWQgY29uY3VycmVuY3kgKyBJL08pDQoNCiAgQSBDaGF0TUQgZmlsZSBjYW4gYmUg dHJlYXRlZCBhcyBhIOKAnHRlcm1pbmFsIGFnZW504oCdOiB5b3UgYXV0aG9yIGFuDQogIGFnZW50 IHByb21wdCBhcyBhIC5tZCwgb3BlbiBpdCBpbiBjaGF0X3R1aSwgYW5kIHJ1bi9pdGVyYXRlIG9u IGl0DQogIHdoaWxlIHRoZSB0cmFuc2NyaXB0IChpbmNsdWRpbmcgdG9vbCB0cmFjZXMpIGlzIHBl cnNpc3RlZC4NCg0KICBTb21lIGNoYXRfdHVpIGZlYXR1cmVzOg0KDQogIOKAoiBzdHJlYW1pbmcg b3V0cHV0IChhc3Npc3RhbnQgdGV4dCArIHRvb2wgY2FsbHMgKyB0b29sIG91dHB1dHMpDQogIOKA oiBwZXJzaXN0ZW50IHNlc3Npb25zIHlvdSBjYW4gcmVzdW1lL2JyYW5jaC9leHBvcnQNCiAg4oCi IG1hbnVhbCBjb250ZXh0IGNvbXBhY3Rpb24gKDpjb21wYWN0KSBmb3IgbG9uZyBoaXN0b3JpZXMN CiAg4oCiIHN5bnRheCBoaWdobGlnaHRpbmcgKGluY2x1ZGluZyBPQ2FtbCkNCiAg4oCiIEFJIGNv bXBsZXRpb25zIGluIHRoZSB0ZXh0IGlucHV0ICh0byBzcGVlZCB1cCBkcmFmdGluZykNCiAg4oCi IFZpbS1pc2ggZWRpdGluZyBtb2RlcyBhbmQgbWVzc2FnZSBzZWxlY3Rpb24veWFuay9lZGl0L3Jl c3VibWl0DQogICAgd29ya2Zsb3dzDQoNCg0KKlVzZWZ1bCBidWlsdC1pbiB0b29scyAoZXNwZWNp YWxseSBmb3IgY29kZSB3b3JrZmxvd3MpKg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgT2NoYXQgaW5jbHVkZXMgYnVpbHQtaW4gdG9vbHMg dGhhdCBjb3ZlciBtb3N0IOKAnGFnZW50ICsgcmVwb+KAnSBsb29wczoNCg0KICDigKIgcmVhZF9m aWxlIC8gcmVhZF9kaXIgZm9yIHNhZmUgcmVwbyBuYXZpZ2F0aW9uDQogIOKAoiBhcHBseV9wYXRj aCBmb3IgYXRvbWljLCByZXBvLXNhZmUgZWRpdHMNCiAg4oCiIHdlYnBhZ2VfdG9fbWFya2Rvd24g Zm9yIGhpZ2gtc2lnbmFsIGluZ2VzdGlvbiAoaW5jbC4gR2l0SHViIGJsb2INCiAgICBmYXN0LXBh dGgpDQogIOKAoiBpbmRleGluZy9yZXRyaWV2YWwgdG9vbHMgZm9yIGdyb3VuZGluZyBvdmVyIGRv Y3MgYW5kIGNvZGUNCiAg4oCiIG9wdGlvbmFsIHZpc2lvbiBpbnB1dHMgdmlhIGltcG9ydF9pbWFn ZQ0KDQoNCipNQ1AgdG9vbCBpbXBvcnQgKG9wdGlvbmFsKSoNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjA0KDQogIE9jaGF0IGNhbiBhbHNvIG1vdW50IGV4dGVybmFsIHRvb2xzIHZpYSBNQ1Ag KHN0ZGlvIG9yIEhUVFApLiBGb3INCiAgZXhhbXBsZSwgaW1wb3J0aW5nIEJyYXZlIFNlYXJjaCBv dmVyIHN0ZGlvOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgPHRvb2wgbWNwX3NlcnZlcj0i c3RkaW86bnB4IC15IGJyYXZlLXNlYXJjaC1tY3AiIG5hbWU9ImJyYXZlX3dlYl9zZWFyY2giIC8+ DQogIOKUlOKUgOKUgOKUgOKUgA0KDQoNCipRdWljayBleGFtcGxlOiBhIOKAnGN1c3RvbSB0ZXJt aW5hbCBvcmNoZXN0cmF0b3IgYWdlbnTigJ0qDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGlzIGlzIGEgY29tcGxldGUgYWdlbnQgZGVm aW5pdGlvbiAoYW5kIGJlY29tZXMgdGhlIHJ1bm5hYmxlIOKAnGFwcOKAnQ0KICB3aGVuIG9wZW5l ZCBpbiBjaGF0X3R1aSk6DQoNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIDxjb25maWcgbW9k ZWw9ImdwdC01LjIiIHJlYXNvbmluZ19lZmZvcnQ9Im1lZGl1bSIgLz4NCiAg4pSCIA0KICDilIIg PCEtLSBjb3JlIGJ1aWx0LWlucyAtLT4NCiAg4pSCIDx0b29sIG5hbWU9InJlYWRfZGlyIi8+DQog IOKUgiA8dG9vbCBuYW1lPSJyZWFkX2ZpbGUiLz4NCiAg4pSCIDx0b29sIG5hbWU9ImFwcGx5X3Bh dGNoIi8+DQogIOKUgiA8dG9vbCBuYW1lPSJ3ZWJwYWdlX3RvX21hcmtkb3duIi8+DQogIOKUgiAN CiAg4pSCIDwhLS0gb3B0aW9uYWw6IGltcG9ydCBhbiBleHRlcm5hbCB0b29sIHZpYSBNQ1AgLS0+ DQogIOKUgiA8dG9vbCBtY3Bfc2VydmVyPSJzdGRpbzpucHggLXkgYnJhdmUtc2VhcmNoLW1jcCIg bmFtZT0iYnJhdmVfd2ViX3NlYXJjaCIgLz4NCiAg4pSCIA0KICDilIIgPCEtLSBwcm9tcHQtcGFj ayB0b29scyAoYWdlbnRzIGFzIHRvb2xzKSAtLT4NCiAg4pSCIDx0b29sIG5hbWU9InBsYW4iICAg YWdlbnQ9InByb21wdHMvcGFjay9wbGFuLm1kIiBsb2NhbC8+DQogIOKUgiA8dG9vbCBuYW1lPSJj b2RlIiAgIGFnZW50PSJwcm9tcHRzL3BhY2svY29kZS5tZCIgbG9jYWwvPg0KICDilIIgPHRvb2wg bmFtZT0icmV2aWV3IiBhZ2VudD0icHJvbXB0cy9wYWNrL3Jldmlldy5tZCIgbG9jYWwvPg0KICDi lIIgDQogIOKUgiA8ZGV2ZWxvcGVyPg0KICDilIIgWW91IGFyZSB0aGUgb3JjaGVzdHJhdG9yLiBD YWxsIHBsYW4gZmlyc3QuDQogIOKUgiBLZWVwIGVkaXRzIHNtYWxsLiBCZWZvcmUgYXBwbHlfcGF0 Y2g6IGV4cGxhaW4gdGhlIGRpZmYgYW5kIHdhaXQgZm9yIGNvbmZpcm1hdGlvbi4NCiAg4pSCIDwv ZGV2ZWxvcGVyPg0KICDilIIgDQogIOKUgiA8dXNlcj4NCiAg4pSCIEFkZCBhIFF1aWNrc3RhcnQg c2VjdGlvbiB0byBSRUFETUUubWQuDQogIOKUgiA8L3VzZXI+DQogIOKUlOKUgOKUgOKUgOKUgA0K DQogIFJ1biBpdCBmcm9tIHRoZSByZXBvIHdpdGg6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giBkdW5lIGV4ZWMgY2hhdF90dWkgLS0gLWZpbGUgcHJvbXB0cy9yZWZhY3Rvci5tZA0KICDilJTi lIDilIDilIDilIANCg0KDQoqU3RhdHVzIC8gY2F2ZWF0cyoNCuKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKAoiBQcm92aWRlciBzdXBw b3J0IHRvZGF5IGlzICpPcGVuQUktb25seSouDQogIOKAoiBUaGUgcHJvamVjdCBpcyBtb3Zpbmcg cXVpY2tseS4NCg0KDQoqRmVlZGJhY2sgLyBjb250cmlidXRvcnMqDQrilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYwNCg0KICBJ4oCZZCBhcHByZWNpYXRlIGFueSBmZWVkYmFjayBvciBjb250cmlidXRpb25zDQoN CiAgSWYgeW91IHRyeSBpdCBhbmQgYW55dGhpbmfigJlzIGNvbmZ1c2luZyBvciByb3VnaCwgcGxl YXNlIG9wZW4gYW4gaXNzdWUuDQoNCg0KU2VyaWFscG9ydCAtIG5ldyBzZXJpYWwgY29tbXVuaWNh dGlvbiBsaWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1zZXJpYWxwb3J0LW5ldy1zZXJpYWwtY29tbXVu aWNhdGlvbi1saWJyYXJ5LzE3NTk0LzM+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgTWlr aGFpbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtBZGRlZF0gKGFrYSBpbXBsZW1lbnRlZCkg V2luMzIgc3VwcG9ydCwgd2hpY2ggaGFzIG5vdCBiZWVuIHRob3JvdWdobHkNCiAgdGVzdGVkLCBi dXQgbWF5IGJlIHVzZWZ1bCBmb3IgY2VydGFpbiB0YXJnZXQgdXNlIGNhc2VzLg0KDQoNCltBZGRl ZF0NCjxodHRwczovL2dpdGh1Yi5jb20vZHgzbW9kL3NlcmlhbHBvcnQvY29tbWl0L2QwNTdhMDA0 YzA1MDIzNGI2NGU0ZWRiZWUyYzEzYTA0YmY0YzI3MzQ+DQoNCg0KU2xpcHNob3chDQrilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L2Fubi1zbGlwc2hvdy8xNjMzNy8xOD4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFk LCBQYXVsLUVsbGlvdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEl0IGlz IHdpdGggZXh0cmF0ZXJyZXN0cmlhbCBleGNpdGVtZW50IHRoYXQgSSBhbm5vdW5jZSB0aGUgbmV4 dA0KICByZWxlYXNlIG9mIFNsaXBzaG93Og0KDQogICpTbGlwc2hvdyAwLjkuMDogTWFuaW0gQmxh Y2sqDQoNCiAgVGhlIGZlYXR1cmVkIG5ldyBmZWF0dXJlIG9mIHRoaXMgcmVsZWFzZSBpcyB0aGUg YWJpbGl0eSB0byBlYXNpbHkNCiAgaW50ZWdyYXRlIFtNYW5pbV0gdmlkZW9zIGluIHlvdXIgcHJl c2VudGF0aW9uLg0KDQogIDxodHRwczovL2dpdGh1Yi5jb20vdXNlci1hdHRhY2htZW50cy9hc3Nl dHMvZjY3YmI4ZmMtYzI4OC00ZmYzLWI2YmMtZTcyYzEyZTYzNmE3Pg0KDQogIE5vdGUgdGhhdCwg Y29tcGFyZWQgdG8ganVzdCBwbGF5aW5nIGEgdmlkZW8sIHlvdSBjYW4gc2NoZWR1bGUgcGF1c2Vz LA0KICBnbyBmYXN0ZXIgdG8gdGhlIG5leHQgcGF1c2UsIGFuZCBnbyBiYWNrIHRvIHRoZSBwcmV2 aW91cyBwYXVzZXMsIGFzDQogIHNob3djYXNlZCBiZWxvdy4NCg0KDQpbTWFuaW1dIDxodHRwczov L3d3dy5tYW5pbS5jb21tdW5pdHkvPg0KDQpTa2lwcGluZyBzdGVwcyBhbmQgZ29pbmcgYmFja3dh cmQgZGVtbw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS91c2VyLWF0dGFjaG1lbnRzL2Fzc2V0 cy9jZjFhZDI2NC1hNWUyLTQyZDItOWY1Ny0wOTU1MWYzYTM1ZTg+DQoNCiAgVGhpcyByZWxlYXNl IGZlYXR1cmVzIG1hbnkgbW9yZSBjaGFuZ2VzLCBzdWNoIGFzIFRpa1ogYW5kIE1lcm1haWRKUw0K ICBpbnRlZ3JhdGlvbiEgSGVyZSBpcyB0aGUgZnVsbCBjaGFuZ2Vsb2c6DQoNCg0KQWRkZWQNCuKV jOKVjOKVjOKVjOKVjA0KDQogIOKAoiBTdXBwb3J0IGZvciBNZXJtYWlkIEpTIChbIzIwNV0pDQog IOKAoiBTdXBwb3J0IGZvciBzeW50YXggaGlnaGxpZ2h0aW5nIG9mIGFsbCBoaWdobGlnaHRqcy1z dXBwb3J0ZWQNCiAgICBsYW5ndWFnZXMgYW5kIHRoZW1lcyAoWyMyMDBdLCBbIzIwOF0pDQogIOKA oiBTdXBwb3J0IGZvciBNYXRoSmF4IGV4dGVuc2lvbnMsIGVzcGVjaWFsbHkgdGhlIGh0bWwgZXh0 ZW5zaW9uIHRvDQogICAgYWxsb3cgYWN0aW9ucyB0byB0YXJnZXQgbWF0aCBlbGVtZW50cyAoWyMy MDJdKQ0KICDigKIgQWRkIEthVGVYIGFzIGEgcG9zc2libGUgYWx0ZXJuYXRlIHJlbmRlcmVyIChb IzIwMl0pDQogIOKAoiBBZGRlZCBgY2Fyb3VzZWwtZml4ZWQtc2l6ZScgdG8gaGF2ZSBjYXJvdXNl bCBub3QgY2hhbmdlIHNpemUNCiAgICAoWyMyMDddKQ0KDQoNClsjMjA1XSA8aHR0cHM6Ly9naXRo dWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjA1Pg0KDQpbIzIwMF0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9wYW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwMD4NCg0KWyMyMDhdIDxodHRwczovL2dp dGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMDg+DQoNClsjMjAyXSA8aHR0cHM6Ly9n aXRodWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjAyPg0KDQpbIzIwN10gPGh0dHBzOi8v Z2l0aHViLmNvbS9wYW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwNz4NCg0KDQpGaXgNCuKVjOKVjOKV jA0KDQogIOKAoiBGaXggaW1wb3NzaWJpbGl0eSB0byByZW9wZW4gc3BlYWtlciB2aWV3IGFmdGVy IGNsb3NpbmcgaXQgb24gRmlyZWZveA0KICAgIChbIzE5OF0sIGlzc3VlIFsjMTk0XSkNCiAg4oCi IEZpeCBpbXBvc3NpYmlsaXR5IHRvIG9wZW4gc3BlYWtlciB2aWV3IGluIHNlcnZlIG1vZGUgKFsj MTk4XSwgaXNzdWUNCiAgICBbIzE5N10pDQogIOKAoiBGaXggbGlua3Mgb3BlbmluZyBpbnNpZGUg aWZyYW1lIChbIzE5OF0pDQogIOKAoiBGaXggZW5kaW5nIGV4Y3Vyc2lvbnMgd2l0aCBgaWprbCcg b25seSB3aGVuIG5lZWRlZCAoWyMyMDddKQ0KICDigKIgRml4ZWQgdmlkZW8gbG9uZy1zdGVwIGhh bmRsaW5nIChbIzIwN10pDQogIOKAoiBSZW1vdmVkIGNvbmZ1c2luZyBhdXRvLWdlbmVyYXRlZCBJ RHMgKFsjMjA5XSkNCiAg4oCiIEZpeCBgcGxheS1tZWRpYScgYmVoYXZpb3Igd2hlbiBmYWNpbmcg ZXJyb3JzIChbIzIxMF0pDQoNCg0KWyMxOThdIDxodHRwczovL2dpdGh1Yi5jb20vcGFuZ2xlc2Qv c2xpcHNob3cvcHVsbC8xOTg+DQoNClsjMTk0XSA8aHR0cHM6Ly9naXRodWIuY29tL3BhbmdsZXNk L3NsaXBzaG93L2lzc3Vlcy8xOTQ+DQoNClsjMTk3XSA8aHR0cHM6Ly9naXRodWIuY29tL3Bhbmds ZXNkL3NsaXBzaG93L2lzc3Vlcy8xOTc+DQoNClsjMjA3XSA8aHR0cHM6Ly9naXRodWIuY29tL3Bh bmdsZXNkL3NsaXBzaG93L3B1bGwvMjA3Pg0KDQpbIzIwOV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9w YW5nbGVzZC9zbGlwc2hvdy9wdWxsLzIwOT4NCg0KWyMyMTBdIDxodHRwczovL2dpdGh1Yi5jb20v cGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMTA+DQoNCg0KRG9jcw0K4pWM4pWM4pWM4pWMDQoNCiAg 4oCiIEFkZCBob3cgdG8gaW5jbHVkZSBUaWtaIGZpZ3VyZXMgaW4geW91ciBTbGlwc2hvdyBwcmVz ZW50YXRpb24NCiAgICAoWyMyMDZdKQ0KICDigKIgQWRkIGhvdyB0byBpbmNsdWRlIE1hbmltIHZp ZGVvcyBpbiB5b3VyIFNsaXBzaG93IHByZXNlbnRhdGlvbg0KICAgIChbIzIwN10pDQoNCiAgQ3Jl ZGl0OiBAdmRzIGZvciB0aGUgbmFtZSBvZiB0aGUgcmVsZWFzZS4NCg0KICBUaGFua3MgYWdhaW4g dG8gTkxOZXQgZm9yIFtzdXBwb3J0aW5nXSB0aGUgZGV2ZWxvcG1lbnQgb2YgU2xpcHNob3chDQoN Cg0KWyMyMDZdIDxodHRwczovL2dpdGh1Yi5jb20vcGFuZ2xlc2Qvc2xpcHNob3cvcHVsbC8yMDY+ DQoNClsjMjA3XSA8aHR0cHM6Ly9naXRodWIuY29tL3BhbmdsZXNkL3NsaXBzaG93L3B1bGwvMjA3 Pg0KDQpbc3VwcG9ydGluZ10gPGh0dHBzOi8vbmxuZXQubmwvcHJvamVjdC9TbGlwc2hvdy8+DQoN Cg0KUmVtb3RlIE9DYW1sIERpc3RyaWJ1dGVkIFN5c3RlbXMgRW5naW5lZXIgKExpbnV4IC8gU3Rv cmFnZSAvIE5ldHdvcmtpbmcpIOKAkyB3aGl0ZXNreS5jbG91ZCDigJMgRU1FQS9Bc2lhDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L3JlbW90ZS1vY2FtbC1kaXN0cmlidXRlZC1zeXN0ZW1zLWVuZ2luZWVyLWxpbnV4LXN0b3Jh Z2UtbmV0d29ya2luZy13aGl0ZXNreS1jbG91ZC1lbWVhLWFzaWEvMTc4MzIvMT4NCg0KDQpHZWVy dCBBdWRlbmFlcnQgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBXZSBhcmUgbG9v a2luZyBmb3IgYW4gT0NhbWwgZW5naW5lZXIgdG8gam9pbiAqd2hpdGVza3kuY2xvdWQqIHRvIHdv cmsNCiAgb24gbG93LWxldmVsIGRpc3RyaWJ1dGVkIGluZnJhc3RydWN0dXJlIGNvbXBvbmVudHMu DQoNCiAgKkFib3V0IHRoZSB3b3JrKg0KDQogIFlvdSB3aWxsIHdvcmsgb24gY29yZSBidWlsZGlu ZyBibG9ja3Mgb2YgYSBzb3ZlcmVpZ24gY2xvdWQgcGxhdGZvcm0sDQogIGluY2x1ZGluZyBkaXN0 cmlidXRlZCBzdG9yYWdlIGFuZCBjb29yZGluYXRpb24gc2VydmljZXMuDQoNCiAgRXhhbXBsZXMg b2YgcmVsYXRlZCBwcm9qZWN0czoNCg0KICDigKIgW2h0dHBzOi8vZ2l0aHViLmNvbS9vcGVudnN0 b3JhZ2UvYWxiYV0NCiAg4oCiIFtodHRwczovL2dpdGh1Yi5jb20vb3BlbnZzdG9yYWdlL2FyYWtv b25dDQoNCiAgVGhlIHdvcmsgaW52b2x2ZXM6DQoNCiAg4oCiIERpc3RyaWJ1dGVkIHN5c3RlbXMg ZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbg0KICDigKIgSGlnaC1wZXJmb3JtYW5jZSBuZXR3b3Jr aW5nIGFuZCBJL08NCiAg4oCiIExpbnV4IHN5c3RlbXMgcHJvZ3JhbW1pbmcNCiAg4oCiIERlYnVn Z2luZyBhbmQgb3B0aW1pemluZyBiZWhhdmlvciB1bmRlciByZWFsIHByb2R1Y3Rpb24gbG9hZA0K ICDigKIgTG9uZy1ydW5uaW5nIHNlcnZpY2VzIHdoZXJlIHJlbGlhYmlsaXR5IGFuZCBjb3JyZWN0 bmVzcyBtYXR0ZXINCg0KICBUaGlzIGlzICppbmZyYXN0cnVjdHVyZSB3b3JrKiwgbm90IHdlYiBk ZXZlbG9wbWVudC4NCg0KICDigJQNCg0KICAqV2hhdCB3ZSBhcmUgbG9va2luZyBmb3IqDQoNCiAg 4oCiIFN0cm9uZyBPQ2FtbCBleHBlcmllbmNlICpvciogc3Ryb25nIHN5c3RlbXMgcHJvZ3JhbW1p bmcgYmFja2dyb3VuZA0KICAgIHdpdGggd2lsbGluZ25lc3MgdG8gd29yayBpbiBPQ2FtbA0KICDi gKIgR29vZCB1bmRlcnN0YW5kaW5nIG9mOg0KICAgIOKAoyBMaW51eCBpbnRlcm5hbHMNCiAgICDi gKMgTmV0d29ya2luZyAvIFRDUC9JUA0KICAgIOKAoyBDb25jdXJyZW5jeSBhbmQgcGVyZm9ybWFu Y2UNCiAg4oCiIEludGVyZXN0IGluIGRpc3RyaWJ1dGVkIHN5c3RlbXMsIHN0b3JhZ2UsIG9yIGNv bnNlbnN1cyBhbGdvcml0aG1zDQoNCiAgV2UgY2FyZSBtb3JlIGFib3V0ICpzeXN0ZW1zIHRoaW5r aW5nIGFuZCBlbmdpbmVlcmluZyBkZXB0aCogdGhhbiBhYm91dA0KICBzcGVjaWZpYyBmcmFtZXdv cmtzLg0KDQogIOKAlA0KDQogICpQcmFjdGljYWwgZGV0YWlscyoNCg0KICDigKIgRnVsbC10aW1l IHBvc2l0aW9uDQogIOKAoiBGdWxseSByZW1vdGUNCiAg4oCiIExvY2F0aW9uOiBFTUVBIG9yIEFz aWENCiAg4oCiIFNhbGFyeTogYXJvdW5kICrigqwzMDAwL21vbnRoKiAoZGVwZW5kaW5nIG9uIGV4 cGVyaWVuY2UgYW5kIGxvY2F0aW9uKQ0KDQogIFdlIGtub3cgdGhpcyBpcyBub3QgYSBiaWctdGVj aCBzYWxhcnkuIFdlIGFyZSBhIHNtYWxsDQogIGVuZ2luZWVyaW5nLWRyaXZlbiBjb21wYW55LCBh bmQgdGhlIHJvbGUgaXMgYWltZWQgYXQgZW5naW5lZXJzIHdobw0KICBlbmpveSB3b3JraW5nIGNs b3NlIHRvIHRoZSBzeXN0ZW0sIHNvbHZpbmcgcmVhbCBpbmZyYXN0cnVjdHVyZQ0KICBwcm9ibGVt cywgYW5kIGhhdmluZyBhIGRpcmVjdCBpbXBhY3QuDQoNCiAg4oCUDQoNCiAgKkFib3V0IHdoaXRl c2t5Kg0KDQogIHdoaXRlc2t5IGJ1aWxkcyBhIGNvbXBsZXRlIGNsb3VkIHBsYXRmb3JtIGJhc2Vk IG9uIExpbnV4IGFuZCBLVk0sDQogIGZvY3VzZWQgb24gc292ZXJlaWdudHkgYW5kIGNvbnRyb2wu ICBUaGUgcGxhdGZvcm0gaXMgdXNlZCBieSBNU1BzLA0KICBTYWFTIHByb3ZpZGVycyBhbmQgZW50 ZXJwcmlzZXMgdG8gcnVuIHRoZWlyIG93biBjbG91ZCBpbmZyYXN0cnVjdHVyZS4NCg0KICBZb3Ug d2lsbCBiZSB3b3JraW5nIG9uIGNvbXBvbmVudHMgdGhhdCBydW4gaW4gcHJvZHVjdGlvbiBlbnZp cm9ubWVudHMNCiAgYW5kIGZvcm0gcGFydCBvZiBhIGRpc3RyaWJ1dGVkIGNsb3VkIHN0YWNrLg0K DQogIOKAlA0KDQogIElmIHRoaXMgc291bmRzIGludGVyZXN0aW5nLCBwbGVhc2UgY29udGFjdDoN Cg0KICAqZ2VlcnQuYXVkZW5hZXJ0QHdoaXRlc2t5LmNsb3VkKg0KDQogIG9yIHNlbmQgYSBETS4N Cg0KICBXZSBhcmUgaGFwcHkgdG8gYW5zd2VyIHF1ZXN0aW9ucyBvciBkaXNjdXNzIHdoZXRoZXIg dGhpcyBjb3VsZCBiZSBhDQogIGdvb2QgZml0Lg0KDQoNCltodHRwczovL2dpdGh1Yi5jb20vb3Bl bnZzdG9yYWdlL2FsYmFdDQo8aHR0cHM6Ly9naXRodWIuY29tL29wZW52c3RvcmFnZS9hbGJhPg0K DQpbaHR0cHM6Ly9naXRodWIuY29tL29wZW52c3RvcmFnZS9hcmFrb29uXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9vcGVudnN0b3JhZ2UvYXJha29vbj4NCg0KDQpHcmFjZSAwLjMuMCDwn5KFLCBmYW5j eSBkaWFnbm9zdGljcyBsaWJyYXJ5IGZvciBjb21waWxlcnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWdyYWNlLTAtMy0wLWZhbmN5LWRpYWdub3N0aWNzLWxp YnJhcnktZm9yLWNvbXBpbGVycy8xNzgzMy8xPg0KDQoNCiJBbGlzdGFpciBPJ0JyaWVuIiBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGV4Y2l0ZWQgdG8g YW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgW2dyYWNlIDAuMy4wXSwgYW4gT0NhbWwgbGlicmFyeQ0K ICBmb3IgYnVpbGRpbmcsIHJlcG9ydGluZyBhbmQgcmVuZGVyaW5nIGJlYXV0aWZ1bCBjb21waWxl ciBkaWFnbm9zdGljcw0KICA6Y2FtZWw6IDpwYWludGJydXNoOi4gTm93IGF2YWlsYWJsZSBvbiBb b3BhbS1yZXBvc2l0b3J5XS4NCg0KICBUaGlzIHJlbGVhc2UgaW5jbHVkZXM6DQoNCiAg4oCiIDp3 aW5kb3c6ICpXaW5kb3dzIHN1cHBvcnQqOiBHcmFjZSBub3cgd29ya3Mgb24gV2luZG93cywgYQ0K ICAgIGxvbmctYXdhaXRlZCBmZWF0dXJlIHNpbmNlIGl0cyAwLjEuMCByZWxlYXNlISA6cm9ja2V0 Og0KICDigKIgOmtleWJvYXJkOiAqVFRZIGF1dG8tZGV0ZWN0aW9uKjogYEdyYWNlX2Fuc2lfcmVu ZGVyZXInIGNhbiBub3cNCiAgICBhdXRvbWF0aWNhbGx5IGNvbmZpZ3VyZSBpdHNlbGYgYmFzZWQg b24gd2hldGhlciB0aGUgb3V0cHV0IGNoYW5uZWwNCiAgICBpcyBhIFRUWS4gIE5ldyBmdW5jdGlv bnM6IGBwcl9kaWFnbm9zdGljJywgYGVwcl9kaWFnbm9zdGljJywgYW5kDQogICAgYG91dHB1dF9k aWFnbm9zdGljJy4NCiAg4oCiIDplbGVwaGFudDogKkxpbmUgZWxpc2lvbio6IGBHcmFjZV9hbnNp X3JlbmRlcmVyJyBub3cgZWxpZGVzDQogICAgdW5uZWNlc3NhcnkgbGluZXMgaW4gZGlhZ25vc3Rp Y3MsIHByb2R1Y2luZyBtb3JlIGZvY3VzZWQgb3V0cHV0Lg0KICDigKIgOnplcm86ICpaZXJvLXdp ZHRoIHJhbmdlcyo6IGBHcmFjZV9hbnNpX3JlbmRlcmVyJyBjYW4gbm93IGhhbmRsZQ0KICAgIHpl cm8td2lkdGggcmFuZ2VzIHdpdGhpbiBsaW5lcywgYXMgd2VsbCBhcyBhdCBlbmQtb2YtbGluZSAo RU9MKSBhbmQNCiAgICBlbmQtb2YtZmlsZSAoRU9GKSBwb3NpdGlvbnMuDQoNCiAgTWFueSB0aGFu a3MgdG8gQGdpbHRobyBmb3IgdGhlaXIgY29udHJpYnV0aW9ucyB0byB0aGlzIHJlbGVhc2UhDQog IDpmbGV4ZWRfYmljZXBzOg0KDQoNCltncmFjZSAwLjMuMF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9q b2hueW9iL2dyYWNlL3JlbGVhc2VzL3RhZy8wLjMuMD4NCg0KW29wYW0tcmVwb3NpdG9yeV0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9zaXRvcnkvcHVsbC8yOTM3OT4NCg0KQ0hB TkdFUw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIGZlYXQocmVuZGVyZXIpOiBhZGQg YnJlYWtzIGluIGxhcmdlIGRpYWdub3N0aWNzIChbIzYzXSkNCiAg4oCiIGZlYXQocmVuZGVyZXIp OiBjaGVjayBmb3IgdHR5IHdoZW4gcmVuZGVyaW5nIChbIzYwXSkNCiAg4oCiIGZpeChyZW5kZXJl cik6IG9mZi1ieS1vbmUgaW4gYGxpbmVzX29mX2xhYmVscycgKFsjNjVdKQ0KICDigKIgZml4KHJl bmRlcmVyKTogY3JlYXRlIDAtc2l6ZWQgc2VnbWVudCBvbiBlbXB0eSBsYWJlbCByYW5nZSAoWyM2 NF0pDQogIOKAoiBmaXgocmVuZGVyZXIpOiByZW5kZXJlciBtdWx0aS1saW5lIGxhYmVscyB3aGVu IG1lc3NhZ2UgaXMgZW1wdHkNCiAgICAoWyM1M10pDQogIOKAoiBmaXgocmVuZGVyZXIpOiBmaXgg ZXJyb3JzIHRoYXQgb2NjdXIgd2l0aCBzcGVjaWFsIHplcm8td2lkdGgNCiAgICBzZWdtZW50cyAo WyM0MV0pDQogIOKAoiBmaXgocmVuZGVyZXIpOiB1c2UgYEZvcm1hdC5wcF9pbmZpbml0eScgaW4g YE1lc3NhZ2UudG9fc3RyaW5nJyBmb3INCiAgICBPQ2FtbCA+NS4yIChbIzQwXSkNCiAg4oCiIHJl ZmFjdG9yITogcmVtb3ZlcyBiYXNlL2NvcmUgZGVwZW5kZW5jeSAoWyM1OF0pDQoNCg0KWyM2M10g PGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvNjM+DQoNClsjNjBdIDxodHRw czovL2dpdGh1Yi5jb20vam9obnlvYi9ncmFjZS9wdWxsLzYwPg0KDQpbIzY1XSA8aHR0cHM6Ly9n aXRodWIuY29tL2pvaG55b2IvZ3JhY2UvcHVsbC82NT4NCg0KWyM2NF0gPGh0dHBzOi8vZ2l0aHVi LmNvbS9qb2hueW9iL2dyYWNlL3B1bGwvNjQ+DQoNClsjNTNdIDxodHRwczovL2dpdGh1Yi5jb20v am9obnlvYi9ncmFjZS9wdWxsLzUzPg0KDQpbIzQxXSA8aHR0cHM6Ly9naXRodWIuY29tL2pvaG55 b2IvZ3JhY2UvcHVsbC80MT4NCg0KWyM0MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9qb2hueW9iL2dy YWNlL3B1bGwvNDA+DQoNClsjNThdIDxodHRwczovL2dpdGh1Yi5jb20vam9obnlvYi9ncmFjZS9w dWxsLzU4Pg0KDQoNCkJSRUFLSU5HIENIQU5HRQ0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIE1hbnkgYmFzZS9jb3JlIGludGVyZmFjZXMgZnJv bSBgR3JhY2UnIGhhdmUgYmVlbiByZXBsYWNlZCB3aXRoDQogICAgY3VzdG9tIG9uZXMuDQogIOKA oiBgU291cmNlLnJlYWRlcicgaGFzIGJlZW4gcmVtb3ZlZC4gVXNlIGBTb3VyY2UuUmVhZGVyLnQn IGluc3RlYWQuDQoNCg0KSnNfb2Zfb2NhbWwgLyBXYXNtX29mX29jYW1sIDYuMw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9hbm4tanMtb2Ytb2NhbWwtd2FzbS1vZi1vY2FtbC02LTMvMTc4MzQv MT4NCg0KDQpKw6lyw7RtZSBWb3VpbGxvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEknbSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBqb2ludCByZWxlYXNlIG9mIGpzX29mX29j YW1sIGFuZA0KICB3YXNtX29mX29jYW1sIDYuMy4NCg0KICBKc19vZl9vY2FtbCBpcyBhIGNvbXBp bGVyIGZyb20gT0NhbWwgYnl0ZWNvZGUgdG8gSmF2YVNjcmlwdC4gSXQgbWFrZXMNCiAgaXQgcG9z c2libGUgdG8gcnVuIHB1cmUgT0NhbWwgcHJvZ3JhbXMgaW4gSmF2YVNjcmlwdCBlbnZpcm9ubWVu dCBsaWtlDQogIGJyb3dzZXJzIGFuZCBOb2RlLmpzLg0KDQogIFdhc21fb2Zfb2NhbWwgaXMgYSBj b21waWxlciBmcm9tIE9DYW1sIGJ5dGVjb2RlIHRvIFdlYkFzc2VtYmx5LiBJdCBpcw0KICBoaWdo bHkgY29tcGF0aWJsZSB3aXRoIEpzX29mX29jYW1sLCBzbyB5b3UgY2FuIGNvbXBpbGUgeW91ciBw cm9ncmFtcw0KICB3aXRoIHdhc21fb2Zfb2NhbWwgaW5zdGVhZCBvZiBqc19vZl9vY2FtbCBhbmQg ZXhwZXJpZW5jZSBvdmVyYWxsDQogIGJldHRlciBwZXJmb3JtYW5jZS4NCg0KICBNb3N0IHNpZ25p ZmljYW50IGNoYW5nZXMgKHNpbmNlIDYuMSk6DQoNCiAg4oCiICpOdW1iZXIgdW5ib3hpbmcgZm9y IHdhc21fb2Zfb2NhbWwqOiBhIHR5cGUgYW5hbHlzaXMgcGFzcyBub3cgdHJhY2tzDQogICAgIHdo aWNoIHZhbHVlcyBhcmUgZmxvYXRzLCBpbnRlZ2Vycywgb3IgbmF0aXZlaW50cywgZW5hYmxpbmcg dGhlDQogICAgIGNvbXBpbGVyIHRvIHVuYm94IHRoZW0gYW5kIHVzZSBuYXRpdmUgV2FzbSBpbnN0 cnVjdGlvbnMNCiAgICAgZGlyZWN0bHkuIFRoaXMgYWxzbyBlbmFibGVzIHNwZWNpYWxpc2F0aW9u IG9mIG51bWJlciBjb21wYXJpc29ucw0KICAgICBhbmQgYmlnYXJyYXkgb3BlcmF0aW9ucywgYXZv aWRpbmcgY29zdGx5IGdlbmVyaWMgcnVudGltZSBjYWxscy4NCiAg4oCiICpDb25zdGFudCBzaW5r aW5nIGZvciBqc19vZl9vY2FtbCo6IGEgbmV3IG9wdGltaXNhdGlvbiBwYXNzIG1vdmVzDQogICAg IGNvbnN0YW50cyBjbG9zZXIgdG8gdGhlaXIgdXNlIHNpdGVzLCByZWR1Y2luZyByZWdpc3Rlcg0K ICAgICBwcmVzc3VyZS4gTWFueSBjb25zdGFudHMgZW5kIHVwIGlubGluZWQsIHJlc3VsdGluZyBp biBzbWFsbGVyIGNvZGUNCiAgICAgc2l6ZS4NCiAg4oCiICpKUyBwYXJzZXIgaW1wcm92ZW1lbnRz Kjogc3VwcG9ydCBmb3IgaW1wb3J0L2V4cG9ydCBhdHRyaWJ1dGVzLA0KICAgICBkZWNvcmF0b3Jz LCBgdXNpbmcnIGRlY2xhcmF0aW9ucyAocmVzb3VyY2UgbWFuYWdlbWVudCksIGFuZCBIVE1MDQog ICAgIGNvbW1lbnRzLg0KICDigKIgTWFueSBidWcgZml4ZXMgYWNyb3NzIHRoZSBjb21waWxlciwg cnVudGltZSwgbGlicmFyeSBiaW5kaW5ncywgYW5kDQogICAgUFBYLg0KDQogIFNlZSB0aGUgW0No YW5nZWxvZ10gZm9yIHRoZSBmdWxsIGxpc3Qgb2YgY2hhbmdlcy4NCg0KDQpbQ2hhbmdlbG9nXQ0K PGh0dHBzOi8vZ2l0aHViLmNvbS9vY3NpZ2VuL2pzX29mX29jYW1sL2Jsb2IvbWFzdGVyL0NIQU5H RVMubWQ+DQoNCg0Ka3F1ZXVlLW1sIDAuNS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9y Zy90L2Fubi1rcXVldWUtbWwtMC01LTAvMTc4MzUvMT4NCg0KDQpBbnVyYWcgU29uaSBhbm5vdW5j ZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEhpLA0KDQogIEknZCBsaWtlIHRvIGFubm91bmNlIGEgbmV3IHJlbGVh c2UgZm9yIFtrcXVldWUtbWwgdmVyc2lvbiAwLjUuMF0NCg0KICAqS3F1ZXVlLW1sOiogVGhpbiBi aW5kaW5ncyB0byBrcXVldWUgZXZlbnQgbm90aWZpY2F0aW9uIHN5c3RlbS4NCg0KICBDaGFuZ2Vz IHNpbmNlIHRoZSBsYXN0IHJlbGVhc2U6DQoNCiAg4oCiIE1vdmVkIGRldmVsb3BtZW50IHRvIFtj b2RlYmVyZ10NCiAg4oCiIFJlbW92ZSBkZXBlbmRlbmNpZXMgb24gYHBweF9vcHRjb21wJyBhbmQg YHBweF9leHBlY3QnIChEZXBlbmRlbmNpZXMNCiAgICBhcmUgbGltaXRlZCB0byB0aGUgb2NhbWwg c3RhbmRhcmQgbGlicmFyeSBhbmQgZHVuZSkNCg0KICBCZXN0LCBBbnVyYWcNCg0KDQpba3F1ZXVl LW1sIHZlcnNpb24gMC41LjBdDQo8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9rcXVl dWUva3F1ZXVlLjAuNS4wLz4NCg0KW2NvZGViZXJnXSA8aHR0cHM6Ly9jb2RlYmVyZy5vcmcvYW51 cmFnc29uaS9rcXVldWUtbWwvPg0KDQoNCkR1bmUgMy4yMS4wDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90 L2Fubi1kdW5lLTMtMjEtMC8xNzcwMC8yPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFNo b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGFubm91bmNlcyBbdGhlIHJlbGVhc2Ug b2YgZHVuZSAzLjIxLjFdLg0KDQogIFRoaXMgaXMgYSBzbWFsbCBwYXRjaCByZWxlYXNlIGNvbnNp c3Rpbmcgb2YgYSBmZXcgYnVnIGZpeGVzLiBTZWUgW3RoZQ0KICBmdWxsIGNoYW5nZWxvZ10gZm9y IGFsbCB0aGUgY2hhbmdlcy4NCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRo aXMgcmVsZWFzZSwgcGxlYXNlIHJlcG9ydCBpdCBpbiBbb3VyDQogIGlzc3VlIHRyYWNrZXJdLg0K DQoNClt0aGUgcmVsZWFzZSBvZiBkdW5lIDMuMjEuMV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMS4xPg0KDQpbdGhlIGZ1bGwgY2hhbmdlbG9nXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcmVsZWFzZXMvdGFnLzMuMjEuMT4NCg0KW291ciBp c3N1ZSB0cmFja2VyXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNzdWVzPg0KDQoN Ck90aGVyIE9DYW1sIE5ld3MNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQpGcm9tIHRoZSBvY2FtbC5vcmcgYmxvZw0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg SGVyZSBhcmUgbGlua3MgZnJvbSBtYW55IE9DYW1sIGJsb2dzIGFnZ3JlZ2F0ZWQgYXQgW3RoZSBv Y2FtbC5vcmcNCiAgYmxvZ10uDQoNCiAg4oCiIFtBdCB0aGUgQUkgSW1wYWN0IFN1bW1pdCBpbiBE ZWxoaTogcGVvcGxlLCBwbGFuZXQsIHByb2dyZXNzXQ0KICDigKIgW09CdWlsZGVyIG9uIFdpbmRv d3M6IEJyaW5naW5nIE5hdGl2ZSBDb250YWluZXIgQnVpbGRzIHdpdGggdGhlIEhDUw0KICAgIEJh Y2tlbmRdDQogIOKAoiBbMXN0IFRFU1NFUkEvQ29SRSBoYWNrYXRob24gYXQgdGhlIEluZGlhbiBB SSBTdW1taXRdDQoNCg0KW3RoZSBvY2FtbC5vcmcgYmxvZ10gPGh0dHBzOi8vb2NhbWwub3JnL2Js b2cvPg0KDQpbQXQgdGhlIEFJIEltcGFjdCBTdW1taXQgaW4gRGVsaGk6IHBlb3BsZSwgcGxhbmV0 LCBwcm9ncmVzc10NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9pbmRpYS1haS1zdW1t aXQ+DQoNCltPQnVpbGRlciBvbiBXaW5kb3dzOiBCcmluZ2luZyBOYXRpdmUgQ29udGFpbmVyIEJ1 aWxkcyB3aXRoIHRoZSBIQ1MNCkJhY2tlbmRdIDxodHRwczovL3d3dy50dW5idXJ5Lm9yZy8yMDI2 LzAyLzE5L29idWlsZGVyLWhjcy8+DQoNClsxc3QgVEVTU0VSQS9Db1JFIGhhY2thdGhvbiBhdCB0 aGUgSW5kaWFuIEFJIFN1bW1pdF0NCjxodHRwczovL2FuaWwucmVjb2lsLm9yZy9ub3Rlcy9maXJz dC10ZXNzZXJhLWhhY2thdGhvbj4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDilZDilZDilZAN Cg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQgbWUgYSBtZXNz YWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxvb2sgYXQgW3Ro ZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10uDQoNCiAgSWYg eW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwgeW91IG1heSBz dWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1pdHRdDQoNCg0K W3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVjaG5pcXVlLm9y Zz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC9jd24vPg0K DQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5yaWEuZnIvc3lt cGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2FsYW4ucGV0aXRl cG9tbWUubmV0Lz4NCg0K --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 17 to 24, 20= 26.

    OSEC-2026-01 in the OCaml runtime: Buffer Over-Read in OCaml M= arshal Deserialization

    Hannes Mehnert announced

    Dear everyone,

    it is my pleasure to announce the first security announcement of this=20 year, and the first coordinated by the new OCaml security response team=20 (https://ocaml.org/security).

    Please subscribe to the OCaml security announcement mailing list=20 (https://sympa.inria.fr/sympa/info/ocsf-ocaml-security-announcements) to=20 receive all security advisories. To this mailing list I'll only copy=20 those affecting the core of OCaml distribution.

    It should any moment now also appear at https://osv.dev/list?q=3DOSEC-2026-01

    Human link:=20 https://github.com/ocaml/security-advisories/tree/m= ain/advisories/2026/OSEC-2026-01.md

    id: OSEC-2026-01
    modified: "2026-02-17T13:30:00Z"
    published: "2026-02-17T13:30:00Z"
    aliases: [  GHSA-j26j-m5xr-g23c GHSA-m34r-cgq7-jhfm ]
    severity: "CVSS:3.1/AV:L/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N"
    severity_score: "6.8"
    affected: "ocaml" {< "4.14.3" | (>=3D "5" & < "5.4.1")}
    events: [
       [
         git "https://github.com/ocaml/ocaml" [
           [fixed "b0a2614684a52acded784ec213f14ddfe085d146"]
         ]
       ]
       [
         git "https://github.com/ocaml/ocaml" [
           [fixed "e3919fef436f89271bc30bbe8592851f7289fb68"]
         ]
       ]
    ]
    references: [
       [report=20
    "https://github.com/ocaml/security-advisories/security/advisories/GHSA-j26j=
    -m5xr-g23c"]
    ]
    credits: [
       [reporter "Justin Timperio"]
       [remediation_developer "Nicol=C3=A1s Ojeda B=C3=A4r"]
       [remediation_developer "Xavier Leroy"]
       [remediation_developer "Gabriel Scherer"]
       [remediation_reviewer "Xavier Leroy"]
       [remediation_reviewer "Olivier Nicole"]
       [remediation_verifier "Mindy Preston"]
       [remediation_verifier "Edwin T=C3=B6r=C3=B6k"]
       [coordinator "Hannes Mehnert"]
    ]
    cwe: [ CWE-126 CWE-502 CWE-754 ]
    

    Buffer Over-Read in OCaml Marshal Deserialization

    Summary

    A critical buffer over-read vulnerability in OCaml's Marshal=20 deserialization (runtime/intern.c) enables remote code execution through=20 a multi-phase attack chain. The vulnerability stems from missing bounds=20 validation in the readblock() function, which performs unbounded=20 memcpy() operations using attacker-controlled lengths from malicious=20 Marshal data.

    Please note that Marshal is not type safe, and you have to be careful if=20 you use the deserialization on untrusted input (due to type confusion,=20 and remote code execution by design - you can use Marshal for code).

    Affected functions: Marshal.from_channel, Marshal.from_b= ytes,=20 Marshal.from_string, Stdlib.input_value, Pe= rvasives.input_value=20 when reading data from an untrusted source.

    Vulnerability Attack Vector

    Corrupted or malicious marshaled data that causes undefined behaviour in=20 the runtime system when unmarshaled. input_value should either fail cleanly or produce a well-forme= d OCaml=20 object, without corrupting the runtime system.

    Consequently, this excludes:

    • well-formed marshaled data that produces an OCaml object that is not of= the type expected by the OCaml code and causes the Ocaml code to crash or = misbehave
    • misuses of the OCaml runtime system by the program performing input_val= ue, such as setting Debugger.function_placeholder to the wrong= function.

    The former issue may be addressed at some point by validating the=20 unmarshaled OCaml value against the expected type, using the functions=20 from module Obj and some kind of run-time type description.

    The latter issue is a bug in the program that unmarshals the data.

    Fix

    • OCaml runtime

      The OCaml runtime has been hardened with additional bounds checks. An=20 exception is raised on bad input.

    • Third party libraries

      Third party libraries that want to harden their custom Marshal=20 deserialization code can follow the example fix for bigarrays from the=20 standard library. There are new macros in custom.h called Wsize_custom_dat= a and=20 Bsize_custom_data that return the size in words or bytes of th= e=20 allocated custom destination block. The deserializer needs to ensure it=20 only writes data within those bounds.

      This only needs to be done if the library defines a custom type in a C=20 binding, and struct custom_operations's deserialize field is not set=20 to NULL or custom_deserialize_default, and = struct=20 custom_operations's fixed_length field is set to = NULL or=20 custom_fixed_length_default

      Since Marshal.from* and input_value remain unsafe= to use, the fix=20 for the OCaml runtime is released, and we wouldn't attempt to coordinate=20 updating all deserialization functions in the ecosystem.

    Timeline

    • Nov 4th 2025: Discovery Date: Discovered first in OxCaml
    • Nov 5th 2025: First Disclosure Date (Jane Street Team): Emailed top mai= ntainers, no response.
    • Nov 9th 2025: Second Disclosure Date (OCaml Team): Submitted to OCaml/o= caml GitHub Repo as a Security Advisory.
    • Nov 11th 2025: Emailed OCaml Security Mail List: Submitted to OCaml ove= r email, responded asking for details.
    • Nov 11th 2025: Third Disclosure (OCaml Security Response Team): Submitt= ed to ocaml/security-advisories GitHub Repo as a Security Advisory.
    • Dec 16th 2025: Initial patch is developed
    • Dec 17th 2025: Fuzz testing found further issues
    • Dec 24th 2025: Final patch for OCaml is developed
    • Dec 25th 2025: Fuzz testing couldn't find any further issues
    • Jan 2nd 2026: Patch got reviewed by OCaml maintainers
    • Jan 4th 2026: Benchmarking of the patch with good results
    • Jan 6th 2026: Reporter got contacted to confirm
    • Jan 25th 2026: Further related issues discovered by fuzzing
    • Feb 17th 2026: fixed OCaml releases are published, security advisory is= published

    OCaml 5.4.1 and 4.14.3 released

    octachron announced

    We have the pleasure of announcing the dual releases of OCaml 4.14.3 and OC= aml 5.4.1, dedicated to the memory of Nicolaas Govert de Bruijn on the anni= versary of his death.

    Those releases are a collection of safe and valuable runtime bugfixes. The OCaml 5.4.1 release also contains a fix for the -pack mode= for macOs and various TSAN fixes.

    More importantly, those new versions harden the Marshal module against mali= cious inputs as described in the security announcement OSEC-2026-01.

    We are encouraging you to switch to those new releases whenever possible.

    Don't hesitate to report any bugs on the OCaml issue tracker.

    See the list of changes below for more details.

    Happy hacking, – Florian Angeletti for the OCaml team.

    Installation Instructions

    The base compilers will be soon installable as an opam switch with the foll= owing commands:

    opam update
    opam switch create 4.14.3
    opam switch create 5.4.1
    

    The source code for the release candidate is also directly available on:

    OCaml 4.14.3 (17 February 2026)

    • #12070, #12075, #13209: auto-detect wheth= er ar support @FILE arguments at configure-time to avoid using this feature with toolchains that do not supp= ort it (eg FreeBSD/Darwin); backport from 5.3. (backport by Boris Dobroslavov, original fix by Nicol=C3=A1s Ojeda B=C3=A4r= , review by Xavier Leroy, David Allsopp, Javier Ch=C3=A1varri, Anil Madhavapeddy)
    • #12207, #12222: Make closu= re computation linear in the number of recursive functions instead of quadratic (Vincent Laviron, report by Fran=C3=A7ois Pottier, review by Nathana=C3=ABl= le Courant and Gabriel Scherer)
    • #13430, #13434: protect me= mory-safety on Lazy.force races (Gabriel Scherer and Vincent Laviron, report by Edwin T=C3=B6r=C3=B6k, review by Vincent Laviron)
    • #13448, #13449: fix a code= -generation bug on unsafe array accesses at type int32, int64, nativeint, which has been introduced in OCaml 4.04. (Gabriel Scherer, review by Nicol=C3=A1s Ojeda B=C3=A4r and Vincent Laviron, report by Simon Cruanes)
    • #13516: Fix= regression where error conditions during bytecode initialisation caused a segmentation fault rather than being properly reported (regression= of #5115 in #11788) (David Allsopp, review by Nicol=C3=A1s Ojeda B=C3=A4r)
    • #13847: On = Windows, maintain a number of threads waiting on the master lock to avoid unnecessary context switches (Dmitry Bely, review by Antonin D=C3=A9cimo)
    • #14007, #14015: Fix memory= corruption when an exception is raised during demarshaling. (Beno=C3=AEt Vaugon, review by David Allsopp and Gabriel Scherer)
    • OSEC-2026-01= : robustify intern.c (Xavier Leroy, review by Damien Doligez and Olivier Nicole)

    OCaml 5.4.1 (17 February 2026)

    Bug fixes:

    • #14010: Fix= miscompilation / liveness errors for string operations (Mark Shinwell, Xavier Clerc, review by Xavier Leroy and Gabriel Scherer)
    • #14065: Fix= function signature mismatch of __tsan_func_exit with GCC 15. Check in the configure step if the TSan provided internal builtins are the same as what we expect, introduce caml_tsan_* wrappers for the= __tsan_* functions we use. (Hari Hara Naveen S, report by Hari Hara Naveen S, review by Gabriel Scherer, Antonin D=C3=A9cimo, Olivier Nicole)
    • #14417: Fix= issue with nested packs on macOS. (Vincent Laviron, report by Kate Deplaix, review by Gabriel Scherer)
    • #14213: Fix= shadow-stack-related crashes with TSan (Olivier Nicole, report by Nathan Taylor, review by Gabriel Scherer and Stefan Muenzel)
    • #14255: Fix= TSan bug with C calls that take many arguments (Olivier Nicole and Miod Vallat, report by Nathan Taylor, review by Gabriel Scherer)
    • OSEC-2026-01= : robustify intern.c (Xavier Leroy and Nicol=C3=A1s Ojeda B=C3=A4r, review by Olivier Nicole, Mi= ndy Preston, Edwin T=C3=B6r=C3=B6k, and Gabriel Scherer)

    Ann: Ochat =E2=80=94 Try Ochat for terminal-based LLM workflow= s

    Dakota Murphy announced

    Hi all =E2=80=94 I=E2=80=99d like to share a project I=E2=80=99ve been buil= ding: Ochat.

    What it is

    Ochat is a toolkit for building LLM workflows as plain files. The co= re format is ChatMarkdown (ChatMD): Markdown plus a small, closed XM= L vocabulary.

    A single ChatMD file is both:

    • the prompt/program (model config, tool allowlist, instructions, = context), and
    • the auditable transcript (assistant replies + tool calls + tool = outputs)

    Because everything is plain text, workflows are reproducible and diffable i= n git.

    Prompt packs: building larger workflows from small= agents

    Ochat supports agent-as-tool: you can mount one ChatMD prompt as a c= allable tool inside another. This lets you build prompt packs (plann= er/coder/reviewer/docs/test triage/etc.) and orchestrate them from a top-le= vel prompt, without writing a custom =E2=80=9Cagent app=E2=80=9D.

    chat_tui: a Notty-based terminal UI (runtime uses = Eio)

    Ochat ships an interactive terminal UI called chat_tui.

    • The UI is built with Notty
    • The underlying runtime uses Eio (structured concurrency + I/O)

    A ChatMD file can be treated as a =E2=80=9Cterminal agent=E2=80=9D: you aut= hor an agent prompt as a .md, open it in chat_tui, and run/iterate on it wh= ile the transcript (including tool traces) is persisted.

    Some chat_tui features:

    • streaming output (assistant text + tool calls + tool outputs)
    • persistent sessions you can resume/branch/export
    • manual context compaction (:compact) for long histories
    • syntax highlighting (including OCaml)
    • AI completions in the text input (to speed up drafting)
    • Vim-ish editing modes and message selection/yank/edit/resubmit workflow= s

    Useful built-in tools (especially for code workflo= ws)

    Ochat includes built-in tools that cover most =E2=80=9Cagent + repo=E2=80= =9D loops:

    • read_file / read_dir for safe repo navigation
    • apply_patch for atomic, repo-safe edits
    • webpage_to_markdown for high-signal ingestion (incl. GitHub blob fast-p= ath)
    • indexing/retrieval tools for grounding over docs and code
    • optional vision inputs via import_image

    MCP tool import (optional)

    Ochat can also mount external tools via MCP (stdio or HTTP). For example, i= mporting Brave Search over stdio:

    <tool "stdio:npx -y brave-s=
    earch-mcp" name=3D"brave_web_search" />
    

    Quick example: a =E2=80=9Ccustom terminal orchestr= ator agent=E2=80=9D

    This is a complete agent definition (and becomes the runnable =E2=80=9Capp= =E2=80=9D when opened in chat_tui):

    <config model=3D"gpt-5.2" reasoning_effort=3D"medium" />
    
    <!-- core built-ins -->
    <=
    tool name=3D"read_dir"/>
    <=
    tool name=3D"read_file"/>
    <=
    tool name=3D"apply_patch"/=
    >
    <=
    tool name=3D"webpage_to_markdown"=
    />
    
    <!-- optional: import an external to=
    ol via MCP -->=
    ;
    <=
    tool mcp_server=3D"stdio:npx -y brave-search-mcp" name=3D"brave_web_s=
    earch" />
    
    <!-- prompt-pack tools (agents as to=
    ols) -->
    <=
    tool name=3D"plan"   agent=
    =3D"prompts/pack/plan.md" local/>
    <=
    tool name=3D"code"   agent=
    =3D"prompts/pack/code.md" local/>
    <=
    tool name=3D"review" agent=
    =3D"prompts/pack/review.md" local/>
    
    <=
    developer>
    You are the orchestrator. Call plan first.
    Keep edits small. Before apply_patch: explain the diff and wait for confirm=
    ation.
    </developer>
    
    <=
    user>
    Add a Quickstart section to README.md.
    </user>
    

    Run it from the repo with:

    dune exec chat_tui -- -file prompts/refactor.md
    

    Status / caveats

    • Provider support today is OpenAI-only.
    • The project is moving quickly.

    Feedback / contributors

    I=E2=80=99d appreciate any feedback or contributions

    If you try it and anything=E2=80=99s confusing or rough, please open an iss= ue.

    Serialport - new serial communication library

    Continuing this thread, Mikhail announced

    Added (aka implemented) Win32 support, which has = not been thoroughly tested, but may be useful for certain target use cases.

    Slipshow!

    Continuing this thread, Paul-Elliot announced

    It is with extraterrestrial excitement that I announce the next release of = Slipshow:

    Slipshow 0.9.0: Manim Black

    The featured new feature of this release is the ability to easily integrate= Manim videos in your presenta= tion.

    https://github.com/user-attachments/assets/f67bb8fc-c288-4= ff3-b6bc-e72c12e636a7

    Note that, compared to just playing a video, you can schedule pauses, go fa= ster to the next pause, and go back to the previous pauses, as showcased be= low.

    Skipping steps and going backward demo

    https://github.com/user-attachments/assets/c= f1ad264-a5e2-42d2-9f57-09551f3a35e8

    This release features many more changes, such as TikZ and MermaidJS integra= tion! Here is the full changelog:

    Added

    • Support for Mermaid JS (#205)
    • Support for syntax highlighting of all highlightjs-supported languages = and themes (#200<= /a>, #208)
    • Support for MathJax extensions, especially the html extension to allow = actions to target math elements (#202)
    • Add KaTeX as a possible alternate renderer (#202)
    • Added carousel-fixed-size to have carousel not change size= (#207)

    Fix

    • Fix impossibility to reopen speaker view after closing it on Firefox (<= a href=3D"https://github.com/panglesd/slipshow/pull/198">#198, issue #194)
    • Fix impossibility to open speaker view in serve mode (#198, issue #197)
    • Fix links opening inside iframe (#198)
    • Fix ending excursions with ijkl only when needed (#207)
    • Fixed video long-step handling (#207)
    • Removed confusing auto-generated IDs (#209)
    • Fix play-media behavior when facing errors (#210)

    Docs

    • Add how to include TikZ figures in your Slipshow presentation (#206)
    • Add how to include Manim videos in your Slipshow presentation (#207)

    Credit: @vds for the name of the release.

    Thanks again to NLNet for su= pporting the development of Slipshow!

    Remote OCaml Distributed Systems Engineer (Linux / Storage / N= etworking) =E2=80=93 whitesky.cloud =E2=80=93 EMEA/Asia

    Geert Audenaert announced

    We are looking for an OCaml engineer to join whitesky.cloud to work = on low-level distributed infrastructure components.

    About the work

    You will work on core building blocks of a sovereign cloud platform, includ= ing distributed storage and coordination services.

    Examples of related projects:

    The work involves:

    • Distributed systems design and implementation
    • High-performance networking and I/O
    • Linux systems programming
    • Debugging and optimizing behavior under real production load
    • Long-running services where reliability and correctness matter

    This is infrastructure work, not web development.

    What we are looking for

    • Strong OCaml experience or strong systems programming background= with willingness to work in OCaml
    • Good understanding of:
      • Linux internals
      • Networking / TCP/IP
      • Concurrency and performance
    • Interest in distributed systems, storage, or consensus algorithms

    We care more about systems thinking and engineering depth than about= specific frameworks.

    Practical details

    • Full-time position
    • Fully remote
    • Location: EMEA or Asia
    • Salary: around =E2=82=AC3000/month (depending on experience and = location)

    We know this is not a big-tech salary. We are a small engineering-driven co= mpany, and the role is aimed at engineers who enjoy working close to the sy= stem, solving real infrastructure problems, and having a direct impact.

    About whitesky

    whitesky builds a complete cloud platform based on Linux and KVM, focused o= n sovereignty and control. The platform is used by MSPs, SaaS providers and enterprises to run their o= wn cloud infrastructure.

    You will be working on components that run in production environments and f= orm part of a distributed cloud stack.

    If this sounds interesting, please contact:

    geert.audenaert@whitesky.cloud

    or send a DM.

    We are happy to answer questions or discuss whether this could be a good fi= t.

    Grace 0.3.0 =F0=9F=92=85, fancy diagnostics library for compil= ers

    "Alistair O'Brien" announced

    I=E2=80=99m excited to announce the release of grace 0.3.0, an OCaml library for b= uilding, reporting and rendering beautiful compiler diagnostics :camel: :pa= intbrush:. Now available on opam-repository.

    This release includes:

    • :window: Windows support: Grace now works on Windows, a long-awa= ited feature since its 0.1.0 release! :rocket:
    • :keyboard: TTY auto-detection: Grace_ansi_renderer = can now automatically configure itself based on whether the output channel = is a TTY. New functions: pr_diagnostic, epr_diagnostic<= /code>, and output_diagnostic.
    • :elephant: Line elision: Grace_ansi_renderer now el= ides unnecessary lines in diagnostics, producing more focused output.
    • :zero: Zero-width ranges: Grace_ansi_renderer can n= ow handle zero-width ranges within lines, as well as at end-of-line (EOL) a= nd end-of-file (EOF) positions.

    Many thanks to @giltho for their contributions to this release! :flexed_bic= eps:=20

    CHANGES

    • feat(renderer): add breaks in large diagnostics (#63)
    • feat(renderer): check for tty when rendering (#60)
    • fix(renderer): off-by-one in lines_of_labels (#65)
    • fix(renderer): create 0-sized segment on empty label range (#64)
    • fix(renderer): renderer multi-line labels when message is empty (#53)
    • fix(renderer): fix errors that occur with special zero-width segments (= #41)
    • fix(renderer): use Format.pp_infinity in Message.to_= string for OCaml >5.2 (#40)
    • refactor!: removes base/core dependency (#58)

    BREAKING CHANGE

    • Many base/core interfaces from Grace have been replaced wi= th custom ones.
    • Source.reader has been removed. Use Source.Reader.t<= /code> instead.

    Js_of_ocaml / Wasm_of_ocaml 6.3

    J=C3=A9r=C3=B4me Vouillon announced

    I'm pleased to announce the joint release of js_of_ocaml and wasm_of_ocaml = 6.3.

    Js_of_ocaml is a compiler from OCaml bytecode to JavaScript. It makes it po= ssible to run pure OCaml programs in JavaScript environment like browsers a= nd Node.js.

    Wasm_of_ocaml is a compiler from OCaml bytecode to WebAssembly. It is highl= y compatible with Js_of_ocaml, so you can compile your programs with wasm_o= f_ocaml instead of js_of_ocaml and experience overall better performance.

    Most significant changes (since 6.1):

    • Number unboxing for wasm_of_ocaml: a type analysis pass now trac= ks which values are floats, integers, or nativeints, enabling the compiler = to unbox them and use native Wasm instructions directly. This also enables = specialisation of number comparisons and bigarray operations, avoiding cost= ly generic runtime calls.
    • Constant sinking for js_of_ocaml: a new optimisation pass moves = constants closer to their use sites, reducing register pressure. Many const= ants end up inlined, resulting in smaller code size.
    • JS parser improvements: support for import/export attributes, de= corators, using declarations (resource management), and HTML c= omments.
    • Many bug fixes across the compiler, runtime, library bindings, and PPX.=

    See the Changelog for the full list of changes.

    kqueue-ml 0.5.0

    Anurag Soni announced

    Hi,

    I'd like to announce a new release for kqueue-ml version 0.5.0

    Kqueue-ml: Thin bindings to kqueue event notification system.=20

    Changes since the last release:

    • Moved development to codeberg
    • Remove dependencies on ppx_optcomp and ppx_expect (Dependencies are limited to the ocaml standard library and dune)

    Best, Anurag

    Dune 3.21.0

    Continuing this thread, Shon announced

    The Dune team announces the release of dune 3.21.1.

    This is a small patch release consisting of a few bug fixes. See the full changelog = for all the changes.

    If you encounter a problem with this release, please report it in our issue tracker.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Svv6jQ05; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 1EBBB4009D for ; Tue, 3 Mar 2026 13:55:00 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=6cn3bwSqZHlN69gkX6tMqgMeHJR6ZjlBzaWj81fPT+k=; b=Svv6jQ05iMfaCTRJZiTmbWqAkkUz7W2/0OvZNIPpL3zZo/09XdNrGooF akSUtUXsY3bjvPWIgwudhYhO3e8x0o5Cu3My3CjN+WbkOEiPIITUD7uc4 PW24buxXZBJ5CE5b2f+kAwHzs/8R+y3iaVaGQJL7z91DKT4Ujub78dX7B w=; X-CSE-ConnectionGUID: rnRkQbb/T4Kv2RrbgFTRxw== X-CSE-MsgGUID: S7lXBaK9Q5SKPA1CthAlRA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.21,322,1763420400"; d="scan'208,217";a="266028220" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 03 Mar 2026 14:54:57 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id CCB738292C; Tue, 3 Mar 2026 14:54:56 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 7CB848292A for ; Tue, 3 Mar 2026 14:54:43 +0100 (CET) X-CSE-ConnectionGUID: pD3FL3xWTwSmun6III3KWw== X-CSE-MsgGUID: ze0SEhFgS5+AmLLAx0Em9w== X-IronPort-AV: E=Sophos;i="6.21,322,1763420400"; d="scan'208,217";a="140290974" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Mar 2026 14:54:43 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 03 Mar 2026 14:54:42 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19466 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgRmVicnVhcnkgMjQgdG8NCk1hcmNoIDAzLCAyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50 cw0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN Ckx3dC42LjEuMCwgTHd0X3BweC42LjEuMA0KT0NhbWwgUGxhdGZvcm0gTmV3c2xldHRlcjogTm92 ZW1iZXIgMjAyNSB0byBKYW51YXJ5IDIwMjYNCkFubm91bmNpbmcgdGhlIGZpcnN0IHJlbGVhc2Ug b2YgQWxpY2UsIGEgcmFkaWNhbCBPQ2FtbCBidWlsZCBzeXN0ZW0NCm1uZXQsIGEgbmV3IFRDUC9J UCBzdGFjayBmb3IgdW5pa2VybmVscyBpbiBPQ2FtbA0KRXhwZXJpbWVudDogZm9ybWF0LWxpbmUN CkNhbWwgaW4gdGhlIENhcGl0YWwgLSBSZWdpc3RyYXRpb25zIE9wZW4hDQpFeHBlcmltZW50YWwg dG9vbHMgZm9yIG1pZ3JhdGluZyBmcm9tIEx3dCB0byBFaW8NCkZpcnN0IGFscGhhIHJlbGVhc2Ug b2YgT0NhbWwgNS41LjANCk5vdElucmlhQ2FtbF9TdGQuV2VudkAwLjEuMCAtIGNyZWF0ZSBXaW5k b3dzIGVudnMgb24gbWFjT1MgW2RrMF0NClJ1bm5pbmcgUmVhbCBEb2NrZXIgQ29udGFpbmVycyBp biBPQ2FtbCBUZXN0cw0KSSB3cm90ZSBhIERTTCBmb3IgQUkgcGVyc29uYWxpdGllcyBpbiBPQ2Ft bA0KT3V0cmVhY2h5IE1heSAyMDI2DQpPbGQgQ1dODQoNCg0KTHd0LjYuMS4wLCBMd3RfcHB4LjYu MS4wDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi1sd3QtNi0xLTAtbHd0LXBweC02LTEtMC8xNzc3MC8yPg0KDQoNCkNvbnRp bnVpbmcgdGhpcyB0aHJlYWQsIFJhcGhhw6tsIFByb3VzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEx3dC42LjEuMSBoYXMgYmVlbiByZWxlYXNlZC4gSXQg Y29udGFpbnMgYSBmaXggdG8gc3VwcG9ydCBidWlsZCB3aXRoDQogIE9DYW1sLjUuNS4gVGhhbmtz IHRvIEBraXQtdHkta2F0ZSBmb3IgdGhlIGNvbnRyaWJ1dGlvbi4NCg0KDQpPQ2FtbCBQbGF0Zm9y bSBOZXdzbGV0dGVyOiBOb3ZlbWJlciAyMDI1IHRvIEphbnVhcnkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToN CiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC1wbGF0Zm9ybS1uZXdzbGV0dGVy LW5vdmVtYmVyLTIwMjUtdG8tamFudWFyeS0yMDI2LzE3ODQ1LzE+DQoNCg0KU2FiaW5lIFNjaG1h bHR6IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2VsY29tZSB0byB0aGUgc2V2 ZW50ZWVudGggZWRpdGlvbiBvZiB0aGUgT0NhbWwgUGxhdGZvcm0gbmV3c2xldHRlciENCg0KICBJ biB0aGlzIE5vdmVtYmVyIDIwMjUgdG8gSmFudWFyeSAyMDI2IGVkaXRpb24sIHdlIGFyZSBleGNp dGVkIHRvIGJyaW5nDQogIHlvdSB0aGUgbGF0ZXN0IG9uIHRoZSBPQ2FtbCBQbGF0Zm9ybSwgY29u dGludWluZyBvdXIgdHJhZGl0aW9uIG9mDQogIGhpZ2hsaWdodGluZyByZWNlbnQgZGV2ZWxvcG1l bnRzIGFzIHNlZW4gaW4gW3ByZXZpb3VzIGVkaXRpb25zXS4gVG8NCiAgdW5kZXJzdGFuZCB0aGUg ZGlyZWN0aW9uIHdlJ3JlIGhlYWRlZCwgZXNwZWNpYWxseSByZWdhcmRpbmcNCiAgZGV2ZWxvcG1l bnQgd29ya2Zsb3dzIGFuZCB1c2VyIGV4cGVyaWVuY2UgaW1wcm92ZW1lbnRzLCBjaGVjayBvdXQg b3VyDQogIFtyb2FkbWFwXS4NCg0KICBZb3UgY2FuIFtzdWJzY3JpYmUgdG8gdGhpcyBuZXdzbGV0 dGVyIG9uIExpbmtlZEluXSENCg0KICAqSGlnaGxpZ2h0czoqDQoNCiAg4oCiICpvcGFtIDIuNS4w IFJlbGVhc2VkKjogTWFqb3IgcmVsZWFzZSBmZWF0dXJpbmcgaW5jcmVtZW50YWwgb3BhbSBmaWxl DQogICAgIGxvYWRpbmcgZm9yIHVwIHRvIDcwJSBmYXN0ZXIgYG9wYW0gdXBkYXRlJywgaW1wcm92 ZWQgc2hlbGwNCiAgICAgaW50ZWdyYXRpb24sIGFuZCBiZXR0ZXIgbWFjT1Mgc2FuZGJveCBzdXBw b3J0DQogIOKAoiAqUmVsb2NhdGFibGUgT0NhbWwgTWVyZ2VkKjogVGhlIGZpbmFsIHBpZWNlIG9m IHRoZSByZWxvY2F0YWJsZSBPQ2FtbA0KICAgICBwdXp6bGUgd2FzIG1lcmdlZCBpbiBEZWNlbWJl ciwgZW5hYmxpbmcgb3BhbSB0byBjbG9uZSBzd2l0Y2hlcw0KICAgICBpbnN0ZWFkIG9mIHJlY29t cGlsaW5nIHRoZW0uIFRoaXMgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0DQogICAgIGFs cGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41DQogIOKAoiAqRHVuZSAzLjIxLjAqOiBMYXJnZSByZWxl YXNlIHdpdGggZG96ZW5zIG9mIGZpeGVzLCBpbXByb3ZlbWVudHMsIGFuZA0KICAgICBuZXcgZmVh dHVyZXMgaW5jbHVkaW5nIE94Q2FtbCBjb21waWxlciBzdXBwb3J0IGFuZCBjb3B5LW9uLXdyaXRl DQogICAgIGZpbGUgb3BlcmF0aW9ucw0KICDigKIgKkVuaGFuY2VkIEVkaXRvciBTdXBwb3J0Kjog T0NhbWwtTFNQIDEuMjUuMCBhZGRzIGAubWx4JyBmaWxlIHN1cHBvcnQNCiAgICAgd2l0aCBmb3Jt YXR0aW5nLCBkaWFnbm9zdGljcywgYW5kIGNvZGUgYWN0aW9ucywgcGx1cyBuZXcgY3VzdG9tDQog ICAgIHJlcXVlc3RzDQogIOKAoiAqTWVybGluIDUuNi4xLTUwNCo6IFBlcmZvcm1hbmNlIG9wdGlt aXphdGlvbnMsIHNtYXJ0ZXIgc2lnbmF0dXJlDQogICAgIGhlbHAsIGFuZCBmaXhlZCBjb21wbGV0 aW9uIGZvciBpbmxpbmVkIHJlY29yZCBsYWJlbHMNCiAg4oCiICpvcGFtLXB1Ymxpc2ggMi43LjEq OiBGaXhlcyBmb3IgR2l0SHViIEFQSSB0b2tlbiBwZXJtaXNzaW9ucw0KICDigKIgKmR1bmUtcmVs ZWFzZSAyLjIuMCo6IEZ1bGwgY29tcGF0aWJpbGl0eSB3aXRoIGNtZGxpbmVyIDIuMC4wDQogIOKA oiAqb3BhbS1yZXBvc2l0b3J5IEFyY2hpdmFsKjogSmFudWFyeSAxLCAyMDI2IGFyY2hpdmFsIHJ1 biByZW1vdmVkDQogICAgIDMsMjY0IHBhY2thZ2UgdmVyc2lvbnMgdG8gbWFpbnRhaW4gcmVwb3Np dG9yeSBzdXN0YWluYWJpbGl0eQ0KDQogICpCYWNrc3RhZ2UgT0NhbWw6Kg0KDQogIOKAoiBbT0Nh bWwgSW5mcmFzdHJ1Y3R1cmU6IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzXSAoTm92IDUs IDIwMjUpDQoNCiAgKlN0YWJsZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtLXB1Ymxpc2ggMi43 LjFdIChOb3YgMTgsIDIwMjUpDQogIOKAoiBbb3BhbSAyLjUuMF0gKE5vdiAyNywgMjAyNSkNCiAg 4oCiIFtNZXJsaW4gNS42LjEtNTA0XSAoRGVjIDIwLCAyMDI1KQ0KICDigKIgW09DYW1sLUxTUCAx LjI1LjBdIChEZWMgMjAsIDIwMjUpDQogIOKAoiBbRHVuZSAzLjIxLjBdIChKYW4gMTYsIDIwMjYp DQogIOKAoiBbZHVuZS1yZWxlYXNlIDIuMi4wXSAoSmFuIDI5LCAyMDI2KQ0KDQogICpVbnN0YWJs ZSBSZWxlYXNlczoqDQoNCiAg4oCiIFtvcGFtIDIuNS4wfnJjMV0gKE5vdiAyMCwgMjAyNSkNCiAg 4oCiIFtvcGFtIDIuNS4wfmJldGExXSAoTm92IDEwLCAyMDI1KQ0KDQoNCltwcmV2aW91cyBlZGl0 aW9uc10gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdGFnL3BsYXRmb3JtLW5ld3NsZXR0ZXI+ DQoNCltyb2FkbWFwXSA8aHR0cHM6Ly9vY2FtbC5vcmcvZG9jcy9wbGF0Zm9ybS1yb2FkbWFwPg0K DQpbc3Vic2NyaWJlIHRvIHRoaXMgbmV3c2xldHRlciBvbiBMaW5rZWRJbl0NCjxodHRwczovL3d3 dy5saW5rZWRpbi5jb20vbmV3c2xldHRlcnMvb2NhbWwtcGxhdGZvcm0tbmV3c2xldHRlci03MzA1 MjcwNjk0NTY3NjYxNTY4Lz4NCg0KW09DYW1sIEluZnJhc3RydWN0dXJlOiBIb3cgdGhlIG9wYW0t cmVwb3NpdG9yeSBXb3Jrc10NCjxodHRwczovL29jYW1sLm9yZy9iYWNrc3RhZ2UvMjAyNS0xMS0w NS1ob3ctdGhlLW9wYW0tcmVwb3NpdG9yeS13b3Jrcz4NCg0KW29wYW0tcHVibGlzaCAyLjcuMV0N CjxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xOC1vcGFtLXB1Ymxpc2gtMi43 LjE+DQoNCltvcGFtIDIuNS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEt Mjctb3BhbS0yLjUuMD4NCg0KW01lcmxpbiA1LjYuMS01MDRdDQo8aHR0cHM6Ly9vY2FtbC5vcmcv Y2hhbmdlbG9nLzIwMjUtMTItMjAtbWVybGluLXY1LTYtMS01MDQ+DQoNCltPQ2FtbC1MU1AgMS4y NS4wXQ0KPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1LTEyLTIwLW9jYW1sLWxzcC0x LTI1LTA+DQoNCltEdW5lIDMuMjEuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI2 LTAxLTE2LWR1bmUtMy0yMS0wPg0KDQpbZHVuZS1yZWxlYXNlIDIuMi4wXQ0KPGh0dHBzOi8vb2Nh bWwub3JnL2NoYW5nZWxvZy9kdW5lLXJlbGVhc2UvMjAyNi0wMS0yOS1kdW5lLXJlbGVhc2UtMi4y LjA+DQoNCltvcGFtIDIuNS4wfnJjMV0gPGh0dHBzOi8vb2NhbWwub3JnL2NoYW5nZWxvZy8yMDI1 LTExLTIwLW9wYW0tMi01LTAtcmMxPg0KDQpbb3BhbSAyLjUuMH5iZXRhMV0NCjxodHRwczovL29j YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMS0xMC1vcGFtLTItNS0wLWJldGExPg0KDQpPQ2FtbCBD b21waWxlcg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCuKX iiBSZWxvY2F0YWJsZSBPQ2FtbCBNZXJnZWQNCg0KICBJbiBEZWNlbWJlciAyMDI1LCB0aGUgZmlu YWwgcGllY2Ugb2YgdGhlIFtSZWxvY2F0YWJsZSBPQ2FtbF0gcHV6emxlDQogIHdhcyBtZXJnZWQs IGVuYWJsaW5nIG9wYW0gdG8gY2xvbmUgc3dpdGNoZXMgaW5zdGVhZCBvZiByZWNvbXBpbGluZw0K ICB0aGVtLiBUaGlzIGZlYXR1cmUgd2lsbCBiZSBhdmFpbGFibGUgaW4gdGhlIGZpcnN0IGFscGhh IHJlbGVhc2Ugb2YNCiAgT0NhbWwgNS41Lg0KDQogICpXaGF0IFJlbG9jYXRhYmxlIE9DYW1sIEVu YWJsZXM6Kg0KDQogIFRoaXMgZmVhdHVyZSBhbGxvd3MgdGhlIE9DYW1sIGNvbXBpbGVyIGFuZCBp dHMgYXNzb2NpYXRlZCB0b29scyB0byBiZQ0KICBtb3ZlZCB0byBkaWZmZXJlbnQgZmlsZXN5c3Rl bSBsb2NhdGlvbnMgYWZ0ZXIgaW5zdGFsbGF0aW9uIHdpdGhvdXQNCiAgYnJlYWtpbmcgZnVuY3Rp b25hbGl0eS4gS2V5IGJlbmVmaXRzIGluY2x1ZGU6DQoNCiAg4oCiIEJpbmFyeSBkaXN0cmlidXRp b25zIHRoYXQgd29yayByZWdhcmRsZXNzIG9mIGluc3RhbGxhdGlvbiBwYXRoDQogIOKAoiBJbXBy b3ZlZCBmbGV4aWJpbGl0eSBmb3IgcGFja2FnZSBtYW5hZ2VycyBvcmdhbml6aW5nIE9DYW1sDQog ICAgaW5zdGFsbGF0aW9ucw0KICDigKIgQnVuZGxpbmcgb2Ygc3BlY2lmaWMgT0NhbWwgdmVyc2lv bnMgYnkgZGV2ZWxvcGVyIHRvb2xzIHdpdGhvdXQgcGF0aA0KICAgIGNvbmZsaWN0cw0KICDigKIg U2ltcGxpZmllZCBjcm9zcy1wbGF0Zm9ybSBkaXN0cmlidXRpb24NCg0KICBUaGUgaW1wbGVtZW50 YXRpb24gaXMgdGhlIGN1bG1pbmF0aW9uIG9mIHdvcmsgYnkgRGF2aWQgQWxsc29wcCwgd2l0aA0K ICByZXZpZXcgZnJvbSBTYW11ZWwgSHltLCBKb25haCBCZWNrZm9yZCwgYW5kIG90aGVycy4gU2Vl IHRoZQ0KICBbYW5ub3VuY2VtZW50IG9uIERpc2N1c3NdIGFuZCB0aGUgW21lcmdlZCBQUnNdIChb IzE0MjQ0XSwgWyMxNDI0NV0sDQogIFsjMTQyNDZdLCBbIzE0MjQ3XSkgZm9yIHRlY2huaWNhbCBk ZXRhaWxzLg0KDQoNCiAgW1JlbG9jYXRhYmxlIE9DYW1sXQ0KICA8aHR0cHM6Ly93d3cuZHJhMjcu dWsvYmxvZy9wbGF0Zm9ybS8yMDI1LzEyLzE3L2l0cy1tZXJnZWQuaHRtbD4NCg0KICBbYW5ub3Vu Y2VtZW50IG9uIERpc2N1c3NdDQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmVsb2Nh dGFibGUtb2NhbWwvMTcyNTM+DQoNCiAgW21lcmdlZCBQUnNdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvcHVsbC8xNDI0Mz4NCg0KICBbIzE0MjQ0XSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sL29jYW1sL3B1bGwvMTQyNDQ+DQoNCiAgWyMxNDI0NV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9vY2FtbC9wdWxsLzE0MjQ1Pg0KDQogIFsjMTQyNDZdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvb2NhbWwvcHVsbC8xNDI0Nj4NCg0KICBbIzE0MjQ3XSA8aHR0cHM6Ly9naXRodWIu Y29tL29jYW1sL29jYW1sL3B1bGwvMTQyNDc+DQoNCg0KQnVpbGQgU3lzdGVtDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0K4peKIER1bmUNCg0KICBbRHVuZSAzLjIxLjBd IChKYW51YXJ5IDE2LCAyMDI2KSBpcyBhIGxhcmdlIHJlbGVhc2UgaW5jbHVkaW5nIGRvemVucw0K ICBvZiBmaXhlcywgaW1wcm92ZW1lbnRzLCBhbmQgYWRkaXRpb25zIGZyb20gbWFueSBjb250cmli dXRvcnMuDQoNCiAgKk5vdGFibGUgQWRkaXRpb25zOioNCg0KICDigKIgKEV4cGVyaW1lbnRhbCk6 IGBsaWJyYXJ5X3BhcmFtZXRlcicgc3RhbnphIGZvciB0aGUgT3hDYW1sIGNvbXBpbGVyDQogIOKA oiBDb3B5LW9uLXdyaXRlIChDT1cpIHdoZW4gY29weWluZyBmaWxlcyBvbiBzdXBwb3J0aW5nIGZp bGVzeXN0ZW1zDQogICAgKEJ0cmZzLCBaRlMsIFhGUykgdW5kZXIgTGludXgNCiAg4oCiIFN1cHBv cnQgZm9yIFRhbmdsZWQgQVRwcm90by1iYXNlZCBjb2RlIHJlcG9zaXRvcmllcw0KICDigKIgTmV3 IGAoZGlyIC4uKScgZmllbGQgb24gcGFja2FnZXMgdG8gZmlsdGVyIHN0YW56YXMgd2l0aA0KICAg IGAtLW9ubHktcGFja2FnZXMnDQogIOKAoiBgZHVuZSBwcm9tb3Rpb24gc2hvdycgY29tbWFuZCB0 byBwcmV2aWV3IGNvcnJlY3RlZCBmaWxlcw0KICDigKIgTmV3IGAobGFuZyByb2NxKScgYnVpbGQg bW9kZSBmb3IgUm9jcSA5LjAgYW5kIGxhdGVyDQogIOKAoiBTdXBwb3J0IGZvciBpbnN0YW50aWF0 aW5nIE94Q2FtbCBwYXJhbWV0ZXJpc2VkIGxpYnJhcmllcw0KICDigKIgYGR1bmUgZGVzY3JpYmUg dGVzdHMnIHRvIGxpc3QgdGVzdHMgaW4gdGhlIHdvcmtzcGFjZQ0KICDigKIgSG9yaXpvbnRhbCBz Y3JvbGxpbmcgaW4gVFVJDQogIOKAoiBTdXBwb3J0IGZvciBleHBhbmRpbmcgdmFyaWFibGVzIGlu IGAocHJvbW90ZSAoaW50byAuLikpJw0KDQogICpOb3RhYmxlIEZpeGVzOioNCg0KICDigKIgRml4 ZWQgYGluY2x1ZGVfc3ViZGlycyBxdWFsaWZpZWQnIHBpY2tpbmcgdGhlIGZ1cnRoZXN0IG1vZHVs ZQ0KICAgIGluc3RlYWQgb2YgdGhlIGNsb3Nlc3QNCiAg4oCiIEltcHJvdmVkIGVycm9yIG1lc3Nh Z2VzIGZvciBpbnZhbGlkIHZlcnNpb24gZm9ybWF0cyB3aXRoIG5vbi1BU0NJSQ0KICAgIGNoYXJh Y3RlcnMNCiAg4oCiIEZpeGVkIGNyYXNoIHdoZW4gcnVubmluZyBgZHVuZSBidWlsZCBAY2hlY2sn IG9uIGxpYnJhcmllcyB3aXRoDQogICAgdmlydHVhbCBtb2R1bGVzDQogIOKAoiBBbGxvdyBgJCBk dW5lIGluaXQnIHRvIHdvcmsgb24gYWJzb2x1dGUgcGF0aHMNCiAg4oCiIFN0b3AgaGlkaW5nIHRo ZSBgcm9vdF9tb2R1bGUnIGZyb20gdGhlIGluY2x1ZGUgcGF0aA0KDQogIEZvciB0aGUgY29tcGxl dGUgbGlzdCBvZiBjaGFuZ2VzLCBzZWUgdGhlIFtmdWxsIHJlbGVhc2Ugb24gR2l0SHViXS4NCg0K ICAqRHVuZSBNYWludGFpbmVkIGJ5KjogUnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywgSmFuZSBT dHJlZXQpLCBOaWNvbMOhcw0KICAgT2plZGEgQsOkciAoQG5vamIsIExleGlGaSksIE1hcmVrIEt1 YmljYSAoQExlb25pZGFzLWZyb20tWElWLA0KICAgVGFyaWRlcyksIEFsaSBDYWdsYXlhbiAoQEFs aXp0ZXIsIFRhcmlkZXMpLCBTdGVwaGVuIFNoZXJyYXR0DQogICAoQGdyaWRidWdzLCBUYXJpZGVz KSwgQW50b25pbyBOdW5vIE1vbnRlaXJvIChAYW5tb250ZWlybyksIFN1ZGhhDQogICBQYXJpbWFs YSAoQFN1ZGhhMjQ3LCBUYXJpZGVzKSwgQW1icmUgU3VoYW15IChARWxlY3RyZUFBUywgVGFyaWRl cyksDQogICBQdW5lZXRoIENoYWdhbnRpIChAcHVuY2hhZ2FuLCBUYXJpZGVzKQ0KDQoNCiAgW0R1 bmUgMy4yMS4wXSA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjYtMDEtMTYtZHVuZS0z LTIxLTA+DQoNCiAgW2Z1bGwgcmVsZWFzZSBvbiBHaXRIdWJdDQogIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMS4wPg0KDQoNClBhY2thZ2UgTWFuYWdlbWVu dA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCuKXiiBvcGFtDQoNCiAgW29wYW0gMi41LjBdIChOb3ZlbWJlciAyNywgMjAyNSkgaXMgYSBt YWpvciByZWxlYXNlIHdpdGggc2lnbmlmaWNhbnQNCiAgcGVyZm9ybWFuY2UgYW5kIHVzYWJpbGl0 eSBpbXByb3ZlbWVudHMuDQoNCiAgKktleSBGZWF0dXJlczoqDQoNCiAg4oCiICpNYXNzaXZlIHNw ZWVkdXAgZm9yIGBvcGFtIHVwZGF0ZScqOiBUaGFua3MgdG8gQGFyb3pvdnlrLCBvcGFtDQogICAg IHVwZGF0ZSBub3cgbG9hZHMgb3BhbSBmaWxlcyBpbmNyZW1lbnRhbGx5LCBvbmx5IHBhcnNpbmcg ZmlsZXMgdGhhdA0KICAgICBoYXZlIGNoYW5nZWQgc2luY2UgdGhlIGxhc3QgdXBkYXRlLiBGb3Ig dHlwaWNhbCBzbWFsbCBkaWZmcywgdGhpcw0KICAgICBtZWFucyBvcGVyYXRpb25zIHRoYXQgdG9v ayBzZWNvbmRzIG5vdyBjb21wbGV0ZSBpbiBtaWxsaXNlY29uZHMNCiAg4oCiICpJbXByb3ZlZCBz aGVsbCBpbnRlZ3JhdGlvbio6IEZpeGVkIGlzc3VlcyB3aGVyZSBwYXJ0cyBvZiBhIHByZXZpb3Vz DQogICAgIGVudmlyb25tZW50IHdlcmUga2VwdCBpbiB0aGUgY3VycmVudCBlbnZpcm9ubWVudCwg Y2F1c2luZyB2YXJpb3VzDQogICAgIHByb2JsZW1zDQogIOKAoiAqQ2hhbmdlZCBkZWZhdWx0IHNo ZWxsIGludGVncmF0aW9uIGZpbGUqOiBOb3cgd3JpdGVzIHRvIGAuYmFzaHJjJw0KICAgICBpbnN0 ZWFkIG9mIGAucHJvZmlsZScgd2hlbiBiYXNoIGlzIGRldGVjdGVkLCBwcmV2ZW50aW5nIGluZmlu aXRlDQogICAgIGxvb3AgaXNzdWVzDQogIOKAoiAqQXBwQXJtb3IgcHJvZmlsZSo6IFRoZSBpbnN0 YWxsIHNjcmlwdCBub3cgaW5zdGFsbHMgYW4gYXBwcm9wcmlhdGUNCiAgICAgYXBwYXJtb3IgcHJv ZmlsZSBvbiBzeXN0ZW1zIGNvbmZpZ3VyZWQgd2l0aCBhcHBhcm1vciAoZW5hYmxlZCBieQ0KICAg ICBkZWZhdWx0IG9uIFVidW50dSkNCiAg4oCiICptYWNPUyBzYW5kYm94IGltcHJvdmVtZW50cyo6 IEFsbG93IHdyaXRpbmcgdG8gYC92YXIvZm9sZGVycy8nIGFuZA0KICAgICBgL3Zhci9kYi9tZHMv JyBkaXJlY3RvcmllcyBhcyByZXF1aXJlZCBieSBzb21lIG1hY09TIGNvcmUgdG9vbHMNCg0KICAq QnVpbGQgQ2hhbmdlczoqDQoNCiAg4oCiICpFY29zeXN0ZW0gY21kbGluZXIgMi4wLjAgY29tcGF0 aWJpbGl0eSo6IG9wYW0gbm8gbG9uZ2VyIGRlcGVuZHMgb24NCiAgICAgYGNtZGxpbmVyJywgcmVt b3ZpbmcgYSBrZXkgYmxvY2tlciB0aGF0IHByZXZlbnRlZCBjbWRsaW5lciAxLnggYW5kDQogICAg IDIuMC4wIGZyb20gYmVpbmcgY28taW5zdGFsbGFibGUuIFRoaXMgY2hhbmdlIGVuYWJsZXMgZWNv c3lzdGVtLXdpZGUNCiAgICAgbWlncmF0aW9uIHRvIGNtZGxpbmVyIDIuMC4wDQogIOKAoiBPQ2Ft bCA1LjUgKHRydW5rKSBzdXBwb3J0IHdoZW4gdXNpbmcgZHVuZSdzIGRldiBwcm9maWxlDQogIOKA oiBUaGUgcmVsZWFzZSBhcmNoaXZlIChgb3BhbS1mdWxsLSoudGFyLmd6JykgaXMgbm93IHJlcHJv ZHVjaWJsZQ0KICDigKIgT3BlbkJTRCBiaW5hcnkgaXMgbm93IGEgZnVsbCBzdGF0aWMgYmluYXJ5 DQoNCiAgRm9yIG1vcmUgZGV0YWlscywgc2VlIHRoZSBbb2ZmaWNpYWwgb3BhbSAyLjUuMCBhbm5v dW5jZW1lbnQgYmxvZ10gYW5kDQogIFtmdWxsIHJlbGVhc2Ugbm90ZXMgb24gR2l0SHViXS4NCg0K ICAqb3BhbSBNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpLCBEYXZpZCBBbGxzb3BwIChA ZHJhMjcsIFRhcmlkZXMpDQoNCg0KICBbb3BhbSAyLjUuMF0gPGh0dHBzOi8vb2NhbWwub3JnL2No YW5nZWxvZy8yMDI1LTExLTI3LW9wYW0tMi41LjA+DQoNCiAgW29mZmljaWFsIG9wYW0gMi41LjAg YW5ub3VuY2VtZW50IGJsb2ddDQogIDxodHRwczovL29wYW0ub2NhbWwub3JnL2Jsb2cvb3BhbS0y LTUtMC8+DQoNCiAgW2Z1bGwgcmVsZWFzZSBub3RlcyBvbiBHaXRIdWJdDQogIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvb3BhbS9yZWxlYXNlcy90YWcvMi41LjA+DQoNCg0K4peKIG9wYW0tcHVi bGlzaA0KDQogIFtvcGFtLXB1Ymxpc2ggMi43LjFdIChOb3ZlbWJlciAxOCwgMjAyNSkgZml4ZXMg YnVncyByZWxhdGVkIHRvIHRoZQ0KICBHaXRIdWIgQVBJIHRva2VuIHBlcm1pc3Npb25zIGludHJv ZHVjZWQgaW4gdmVyc2lvbiAyLjcuMC4NCg0KICAqQ2hhbmdlczoqDQoNCiAg4oCiIEFkdmVydGlz ZSB0aGUgbmVlZCwgYW5kIGNoZWNrLCBmb3IgdGhlIGB3b3JrZmxvdycgc2NvcGUgZm9yIEdpdEh1 Yg0KICAgIHBlcnNvbmFsIGFjY2VzcyB0b2tlbnMNCiAg4oCiIEVuZm9yY2UgdGhlIGdpdCByZW1v dGUgdXNlZCB0byBwdXNoIGJyYW5jaGVzIHRvIHVzZXJzJyBmb3JrIHRvIGJlDQogICAgdXNlZCBp bnN0ZWFkIG9mIHRoZSBTU0ggbWV0aG9kDQogIOKAoiBBdm9pZCBwb3RlbnRpYWwgcHJldmlvdXNs eSB1c2VkIHRva2VucyB3aXRoIHdyb25nIHBlcm1pc3Npb25zIHRvIGJlDQogICAgdXNlZCBpbnN0 ZWFkIG9mIHRoZSBuZXcgb25lDQogIOKAoiBBZGQgc3VwcG9ydCBmb3IgdGhlIG9wYW0gMi41IEFQ SQ0KDQogICpNYWludGFpbmVkIGJ5KjogUmFqYSBCb3VqYmVsIChAcmpib3UsIE9DYW1sUHJvKSwg S2F0ZSBEZXBsYWl4DQogICAoQGtpdC10eS1rYXRlLCBBaHJlZnMpDQoNCg0KICBbb3BhbS1wdWJs aXNoIDIuNy4xXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMTgtb3Bh bS1wdWJsaXNoLTIuNy4xPg0KDQoNCuKXiiBvcGFtLXJlcG9zaXRvcnkgQXJjaGl2YWw6IEphbnVh cnkgMSwgMjAyNg0KDQogIE9uIEphbnVhcnkgMSwgMjAyNiwgdGhlIG9wYW0tcmVwb3NpdG9yeSBj b21wbGV0ZWQgaXRzIHNjaGVkdWxlZA0KICBhcmNoaXZhbCBydW4sIHJlbW92aW5nICozLDI2NCBw YWNrYWdlIHZlcnNpb25zKiAoODgxIHVuaXF1ZSBwYWNrYWdlcykNCiAgbWFya2VkIHdpdGggYHgt bWFpbnRlbmFuY2UtaW50ZW50OiBhcmNoaXZhbCcuIFRoaXMgb25nb2luZyBtYWludGVuYW5jZQ0K ICBwcm9jZXNzIGhlbHBzIGtlZXAgdGhlIHJlcG9zaXRvcnkgbWFuYWdlYWJsZSBieSByZW1vdmlu ZyB1bm1haW50YWluZWQNCiAgb3Igb2Jzb2xldGUgcGFja2FnZSB2ZXJzaW9ucy4NCg0KICAqV2hh dCBUaGlzIE1lYW5zOioNCg0KICDigKIgQXJjaGl2ZWQgcGFja2FnZXMgYXJlIG5vIGxvbmdlciBh dmFpbGFibGUgaW4gdGhlIGRlZmF1bHQgb3BhbQ0KICAgIHJlcG9zaXRvcnkNCiAg4oCiIENJIHN5 c3RlbXMgYW5kIGxvY2sgZmlsZXMgbWF5IG5lZWQgdXBkYXRlcyBpZiB0aGV5IGRlcGVuZCBvbg0K ICAgIGFyY2hpdmVkIHZlcnNpb25zDQogIOKAoiBUaGUgYXJjaGl2YWwgaXMgYmFzZWQgb24gbWV0 YWRhdGEgZXhwbGljaXRseSBzZXQgYnkgcGFja2FnZQ0KICAgIG1haW50YWluZXJzDQoNCiAgKkJh Y2tncm91bmQ6Kg0KDQogIFRoZSBhcmNoaXZhbCBwcm9jZXNzIHdhcyBhbm5vdW5jZWQgYnkgSGFu bmVzIE1laG5lcnQgaW4gRGVjZW1iZXIgMjAyNQ0KICAoc2VlIHRoZSBbRGlzY3VzcyBhbm5vdW5j ZW1lbnRdKSwgZ2l2aW5nIHBhY2thZ2UgbWFpbnRhaW5lcnMgYW5kIHVzZXJzDQogIHRpbWUgdG8g cHJlcGFyZS4gUGFja2FnZXMgY2FuIGJlIHJlc3RvcmVkIGZyb20gYXJjaGl2YWwgYnkgbWFpbnRh aW5lcnMNCiAgdXBvbiByZXF1ZXN0Lg0KDQogIFRoaXMgbWFpbnRlbmFuY2UgcHJhY3RpY2UgZW5z dXJlcyB0aGUgb3BhbSByZXBvc2l0b3J5IHJlbWFpbnMNCiAgc3VzdGFpbmFibGUgYW5kIGZvY3Vz ZWQgb24gYWN0aXZlbHkgbWFpbnRhaW5lZCBwYWNrYWdlcy4NCg0KDQogIFtEaXNjdXNzIGFubm91 bmNlbWVudF0NCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vcGFtLXJlcG9zaXRvcnkt YXJjaGl2YWwtbmV4dC1ydW4tc2NoZWR1bGVkLTIwMjYtMDEtMDEvMTc1ODc+DQoNCg0K4peKIGR1 bmUtcmVsZWFzZQ0KDQogIFtkdW5lLXJlbGVhc2UgMi4yLjBdIChKYW51YXJ5IDI5LCAyMDI2KSBi cmluZ3MgZnVsbCBjb21wYXRpYmlsaXR5IHdpdGgNCiAgY21kbGluZXIgMi4wLjAsIGNvbnRpbnVp bmcgdGhlIGVjb3N5c3RlbS13aWRlIG1pZ3JhdGlvbiB0aGF0IGJlZ2FuDQogIHdpdGggb3BhbSAy LjUuMCdzIHJlbW92YWwgb2YgdGhlIGNtZGxpbmVyIGRlcGVuZGVuY3kuDQoNCiAgKldoeSBUaGlz IE1hdHRlcnM6Kg0KDQogIGNtZGxpbmVyIDIuMC4wIGludHJvZHVjZWQgc3RyaWN0ZXIgcmVxdWly ZW1lbnRzIHRoYXQgaW1wcm92ZSBDTEkNCiAgcmVsaWFiaWxpdHkgYnV0IHByZXZlbnQgY28taW5z dGFsbGFiaWxpdHkgd2l0aCBjbWRsaW5lciAxLnguIEZvbGxvd2luZw0KICBvcGFtIDIuNS4wJ3Mg bGVhZCBpbiByZW1vdmluZyB0aGlzIGNvbmZsaWN0LCBkdW5lLXJlbGVhc2UgMi4yLjANCiAgdXBk YXRlcyB0byB1c2UgY21kbGluZXIgMi4wLjAgZXhjbHVzaXZlbHkuIFRoaXMgY29vcmRpbmF0ZWQg ZWZmb3J0DQogIGFjcm9zcyB0aGUgcGxhdGZvcm0gdG9vbHMgZW5hYmxlcyB1c2VycyB0byB1cGdy YWRlIHdpdGhvdXQNCiAgZW5jb3VudGVyaW5nIGRlcGVuZGVuY3kgY29uZmxpY3RzLg0KDQogICpJ bXBvcnRhbnQgQ2hhbmdlczoqDQoNCiAg4oCiICpCcmVha2luZyo6IEZvbGxvd2luZyBjbWRsaW5l ciAyLjAncyBzdHJpY3RlciByZXF1aXJlbWVudHMsDQogICAgIHByZWZpeC1tYXRjaGluZyBmb3Ig Y29tbWFuZCBvcHRpb25zIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQNCiAg4oCiIFVzZXJzIG11c3Qg bm93IHByb3ZpZGUgdGhlIGZ1bGwgd29yZGluZyBmb3IgYWxsIGZsYWdzIChmb3IgZXhhbXBsZSwN CiAgICBgLS1za2lwLXRlc3RzJyBpbnN0ZWFkIG9mIGAtLXNraXAtdGVzdCcpDQogIOKAoiBUaGlz IGNoYW5nZSBlbnN1cmVzIGNvbXBhdGliaWxpdHkgd2l0aCBjbWRsaW5lciAyLjAuMCBhbmQgYWxp Z25zDQogICAgd2l0aCBtb2Rlcm4gQ0xJIGJlc3QgcHJhY3RpY2VzDQogIOKAoiBJZiB5b3UgaGF2 ZSBhdXRvbWF0aW9uIHNjcmlwdHMgdXNpbmcgc2hvcnRlbmVkIGZsYWdzLCB1cGRhdGUgdGhlbQ0K ICAgIGJlZm9yZSB1cGdyYWRpbmcNCg0KICBGb3IgdGVjaG5pY2FsIGRldGFpbHMsIHNlZSB0aGUg W2NtZGxpbmVyIDIuMC4wIGRvY3VtZW50YXRpb25dIGFuZCB0aGUNCiAgW2R1bmUtcmVsZWFzZSBQ UiAjNTEyXS4NCg0KICAqTWFpbnRhaW5lZCBieSo6IFRhcmlkZXMNCg0KDQogIFtkdW5lLXJlbGVh c2UgMi4yLjBdDQogIDxodHRwczovL29jYW1sLm9yZy9jaGFuZ2Vsb2cvZHVuZS1yZWxlYXNlLzIw MjYtMDEtMjktZHVuZS1yZWxlYXNlLTIuMi4wPg0KDQogIFtjbWRsaW5lciAyLjAuMCBkb2N1bWVu dGF0aW9uXQ0KICA8aHR0cHM6Ly9lcnJhdGlxdWUuY2gvc29mdHdhcmUvY21kbGluZXIvZG9jL0Nt ZGxpbmVyPg0KDQogIFtkdW5lLXJlbGVhc2UgUFIgIzUxMl0NCiAgPGh0dHBzOi8vZ2l0aHViLmNv bS90YXJpZGVzL2R1bmUtcmVsZWFzZS9wdWxsLzUxMj4NCg0KDQpFZGl0b3IgVG9vbHMNCuKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpSb2FkbWFwOiBbRWRpdCAvIChX MTkpIE5hdmlnYXRlIENvZGVdKg0KDQoNCltFZGl0IC8gKFcxOSkgTmF2aWdhdGUgQ29kZV0NCjxo dHRwczovL29jYW1sLm9yZy90b29scy9wbGF0Zm9ybS1yb2FkbWFwI3cxOS1uYXZpZ2F0ZS1jb2Rl Pg0KDQril4ogT0NhbWwtTFNQIFNlcnZlcg0KDQogIFtPQ2FtbC1MU1AgMS4yNS4wXSAoRGVjZW1i ZXIgMjAsIDIwMjUpIGludHJvZHVjZXMgc3VwcG9ydCBmb3IgYC5tbHgnDQogIGZpbGVzIGFuZCBu ZXcgY3VzdG9tIHJlcXVlc3RzLg0KDQogICpGZWF0dXJlczoqDQoNCiAg4oCiICpgLm1seCcgU3Vw cG9ydCo6IEFkZGVkIHN1cHBvcnQgZm9yIGAubWx4JyBmaWxlcywgaW5jbHVkaW5nDQogICAgIGRp YWdub3N0aWNzLCBjb2RlIGFjdGlvbnMsIGhvdmVyLCBhbmQgZm9ybWF0dGluZyB2aWENCiAgICAg YG9jYW1sZm9ybWF0LW1seCcNCiAg4oCiICpOZXcgQ3VzdG9tIFJlcXVlc3RzKjogQWRkZWQgYHR5 cGVFeHByZXNzaW9uJywgYGxvY2F0ZScsIGFuZA0KICAgICBgcGhyYXNlJyByZXF1ZXN0cyB0byB0 aGUgc2VydmVyDQogIOKAoiAqQ29kZS1MZW5zIENvbmZpZ3VyYXRpb24qOiBDb2RlLWxlbnMgZm9y IG5lc3RlZCBgbGV0JyBiaW5kaW5ncyBpcw0KICAgICBub3cgY29uZmlndXJhYmxlDQoNCiAgKkZp eGVzOioNCg0KICDigKIgVGhlIHNlcnZlciBub3cgZmFsbHMgYmFjayB0byBgLm1lcmxpbicgY29u ZmlndXJhdGlvbiBpZiBhDQogICAgYGR1bmUtcHJvamVjdCcgZmlsZSBpcyBtaXNzaW5nLCBwcm92 aWRlZCBbZG90LW1lcmxpbi1yZWFkZXJdIGlzDQogICAgaW5zdGFsbGVkDQogIOKAoiBJbXByb3Zl ZCBwcmVjaXNpb24gb2YgdGltZXN0YW1wcyBmb3IgY29sbGVjdGVkIG1ldHJpY3MNCg0KDQogIFtP Q2FtbC1MU1AgMS4yNS4wXQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTIt MjAtb2NhbWwtbHNwLTEtMjUtMD4NCg0KICBbZG90LW1lcmxpbi1yZWFkZXJdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvbWVybGluPg0KDQoNCuKXiiBNZXJsaW4NCg0KICBbTWVybGluIDUuNi4x LTUwNF0gKERlY2VtYmVyIDIwLCAyMDI1KSBicmluZ3MgcGVyZm9ybWFuY2UNCiAgb3B0aW1pemF0 aW9ucyBhbmQgaW1wcm92ZWQgc3RhYmlsaXR5Lg0KDQogICpLZXkgSW1wcm92ZW1lbnRzOioNCg0K ICDigKIgKlNtYXJ0ZXIgU2lnbmF0dXJlIEhlbHAqOiBOb3cgdHJpZ2dlcnMgY29ycmVjdGx5IG9u IHVuZmluaXNoZWQgYGxldA0KICAgICAuLi4gaW4nIGJpbmRpbmdzIGFuZCBubyBsb25nZXIgYXBw ZWFycyByZWR1bmRhbnRseSBvbiBmdW5jdGlvbg0KICAgICBuYW1lcw0KICDigKIgKk1vcmUgUmVs aWFibGUgQ29tcGxldGlvbio6IEZpeGVkIGlzc3VlcyB3aXRoIGNvbXBsZXRpb24gZm9yIGlubGlu ZWQNCiAgICAgcmVjb3JkIGxhYmVscw0KICDigKIgKkltcHJvdmVkIFBlcmZvcm1hbmNlKjogT3B0 aW1pemVkIGJ1ZmZlciBpbmRleGluZyBhbmQgcGF0aA0KICAgICBjYWxjdWxhdGlvbnMNCiAg4oCi ICpCdWcgRml4ZXMqOiBSZXNvbHZlZCBhIGJ1ZyB3aGVyZSB0aGUgYGRvY3VtZW50JyBjb21tYW5k DQogICAgIGNvbmNhdGVuYXRlZCBsYWJlbHMgYW5kIHZhcmlhbnRzIGluY29ycmVjdGx5DQoNCiAg Kk9DYW1sIExTUCBTZXJ2ZXIgbWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9v cywgVGFyaWRlcyksDQogICBYYXZpZXIgVmFuIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwg UnVkaSBHcmluYmVyZyAoQHJncmluYmVyZywNCiAgIEphbmUgU3RyZWV0KQ0KDQogICpNZXJsaW4g bWFpbnRhaW5lZCBieSo6IFVseXNzZSBHw6lyYXJkIChAdm9vZG9vcywgVGFyaWRlcyksIFhhdmll ciBWYW4NCiAgIGRlIFdvZXN0eW5lIChAeHZ3LCBUYXJpZGVzKSwgTXVsdWggR29kc29uIChAUGl6 aWVEdXN0LCBUYXJpZGVzKQ0KDQoNCiAgW01lcmxpbiA1LjYuMS01MDRdDQogIDxodHRwczovL29j YW1sLm9yZy9jaGFuZ2Vsb2cvMjAyNS0xMi0yMC1tZXJsaW4tdjUtNi0xLTUwND4NCg0KDQril4og T0NhbWwtZWdsb3QNCg0KICBXZSBoYXZlIGRyYXN0aWNhbGx5IG1vZGlmaWVkIHRoZSBgeHJlZicg YmFja2VuZCAoYWxsb3dpbmcgbmF2aWdhdGlvbg0KICBmcm9tIGRlZmluaXRpb24gdG8gZGVmaW5p dGlvbikgdG8gbWFrZSBpdCBtb3JlIHN1aXRhYmxlIGZvciBPQ2FtbC4NCg0KICBJbiBhZGRpdGlv biwgd2UgYWRkZWQgdGhlIGFiaWxpdHkgdG8gYW5ub3RhdGUgdGhlIHR5cGUgb2YgYW4gZW5jbG9z aW5nDQogIGFjdGl2ZV8gKHVzZWQgd2l0aCB0aGUgYG9jYW1sLWVnbG90LXR5cGUtZW5jbG9zaW5n JyBjb21tYW5kKSBvciBzaW1wbHkNCiAgdG8gdHlwZSB0aGUgc2VsZWN0aW9uLg0KDQogIFRoZXNl IHVwZGF0ZXMgaGF2ZSBiZWVuIG1lcmdlZCBpbnRvIGBtYWluJywgbWFraW5nIHRoZW0gYXZhaWxh YmxlIHZpYQ0KICBhIE1FTFBBIHVwZGF0ZS4NCg0KICAqb2NhbWwtZWdsb3QgbWFpbnRhaW5lZCBi eSo6IFhhdmllciBWYW4gZGUgV29lc3R5bmUgKEB4dncsIFRhcmlkZXMpDQoNCg0KUGxhdGZvcm0g SW5mcmFzdHJ1Y3R1cmUNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQril4ogT0NhbWwgSW5mcmFzdHJ1Y3R1cmU6 IEhvdyB0aGUgb3BhbS1yZXBvc2l0b3J5IFdvcmtzDQoNCiAgVGhlIFtOb3ZlbWJlciA1LCAyMDI1 IGFydGljbGUgb24gdGhlIG9wYW0tcmVwb3NpdG9yeV0gcHJvdmlkZXMgYW4NCiAgaW4tZGVwdGgg bG9vayBhdCB0aGlzIGNyaXRpY2FsIHBpZWNlIG9mIE9DYW1sIGluZnJhc3RydWN0dXJlLiBUaGUg b3BhbQ0KICByZXBvc2l0b3J5IHNlcnZlcyBhcyB0aGUgY2VudHJhbCBwYWNrYWdlIHJlZ2lzdHJ5 IGZvciB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLCBob3N0aW5nIG92ZXIgNCw1MDAgcGFja2FnZXMu IEl0IHJlbGllcyBvbiBkZWRpY2F0ZWQNCiAgdm9sdW50ZWVyIG1haW50YWluZXJzIHdobyByZXZp ZXcgZXZlcnkgc3VibWlzc2lvbi4NCg0KICDigJQNCg0KICBBcyBhbHdheXMsIHdlIGVuY291cmFn ZSBmZWVkYmFjayBhbmQgY29udHJpYnV0aW9ucyBmcm9tIHRoZSBjb21tdW5pdHkNCiAgYXMgd2Ug Y29udGludWUgdG8gaW1wcm92ZSB0aGUgT0NhbWwgUGxhdGZvcm0gZWNvc3lzdGVtLg0KDQoNCiAg W05vdmVtYmVyIDUsIDIwMjUgYXJ0aWNsZSBvbiB0aGUgb3BhbS1yZXBvc2l0b3J5XQ0KICA8aHR0 cHM6Ly9vY2FtbC5vcmcvY2hhbmdlbG9nLzIwMjUtMTEtMDUtaG93LXRoZS1vcGFtLXJlcG9zaXRv cnktd29ya3M+DQoNCg0KQW5ub3VuY2luZyB0aGUgZmlyc3QgcmVsZWFzZSBvZiBBbGljZSwgYSBy YWRpY2FsIE9DYW1sIGJ1aWxkIHN5c3RlbQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm5vdW5jaW5n LXRoZS1maXJzdC1yZWxlYXNlLW9mLWFsaWNlLWEtcmFkaWNhbC1vY2FtbC1idWlsZC1zeXN0ZW0v MTc0NzIvNDU+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgU3RldmUgU2hlcnJhdHQgYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBBbm5vdW5jaW5nIHRo ZSByZWxlYXNlIG9mIFtBbGljZSB2MC41LjBdIHdoaWNoIGludHJvZHVjZXMgcGFyYWxsZWwNCiAg YnVpbGRzLg0KDQoNCltBbGljZSB2MC41LjBdIDxodHRwczovL3d3dy5hbGljZWNhbWwub3JnL2Js b2cvYWxpY2UtdjAtNS0wLz4NCg0KDQptbmV0LCBhIG5ldyBUQ1AvSVAgc3RhY2sgZm9yIHVuaWtl cm5lbHMgaW4gT0NhbWwNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hp dmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlw LXN0YWNrLWZvci11bmlrZXJuZWxzLWluLW9jYW1sLzE3ODUxLzE+DQoNCg0KQ2FsYXNjaWJldHRh IFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkg YW0gcGxlYXNlZCB0byBhbm5vdW5jZSBhIHNlcmllcyBvZiByZWxlYXNlcyBmb3IgZGV2ZWxvcGlu Zw0KICB1bmlrZXJuZWxzIHdpdGggT0NhbWwgNSBhbmQgW01pb3VdLiBBZnRlciBleHRlbnNpdmUg dGVzdGluZywgd2UgYXJlDQogIG5vdyBhYmxlIHRvIG9mZmVyIGEgbmV3IFRDUC9JUHY0IGFuZCBJ UHY2IHN0YWNrIGluIE9DYW1sIHRoYXQgYWltcyB0bw0KICByZXBsYWNlIFttaXJhZ2UtdGNwaXBd IGFuZCBwYXZlIHRoZSB3YXkgZm9yIGRpcmVjdC1zdHlsZSB1bmlrZXJuZWwNCiAgZGV2ZWxvcG1l bnQuIEJlbG93IGlzIGFuIG92ZXJ2aWV3IG9mIHRoZSBsaWJyYXJpZXMgd2UgaGF2ZSBidWlsdCB0 bw0KICBtYWtlIHRoaXMgcG9zc2libGUuDQoNCg0KW01pb3VdIDxodHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC9taW91Pg0KDQpbbWlyYWdlLXRjcGlwXSA8aHR0cHM6Ly9naXRodWIuY29tL21p cmFnZS9taXJhZ2UtdGNwaXA+DQoNCm1rZXJuZWwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IGBta2VybmVsJyBpcyBhIHNtYWxsIGxpYnJhcnkgdGhhdCBwcm92aWRlcyB0aGUgZXNzZW50aWFs cyBmb3INCiAgZGV2ZWxvcGluZyBhIHVuaWtlcm5lbCB0YXJnZXRpbmcgW1NvbG81XSBvciBbVW5p a3JhZnRdLiBJdHMgcHVycG9zZSBpcw0KICB0byBleHBvc2UgaHlwZXJjYWxscyAodGhlIHVuaWtl cm5lbCBlcXVpdmFsZW50IG9mIHN5c2NhbGxzKSBzbyB0aGF0DQogIHlvdXIgYXBwbGljYXRpb24g Y2FuIGludGVyYWN0IHdpdGggbmV0d29yayBhbmQgYmxvY2sgZGV2aWNlcy4NCg0KICBXZSByZWNv bW1lbmQgcmVhZGluZyB0aGUgYG1rZXJuZWwnIFtkb2N1bWVudGF0aW9uXSB0byB1bmRlcnN0YW5k IHRoZQ0KICBrZXkgY29uY2VwdHMgYmVoaW5kIHVuaWtlcm5lbHMgKGh5cGVyY2FsbHMsIGRldmlj ZXMsIHRlbmRlcnMsDQogIGV0Yy4pLiBUaGUgW3NsaWRlc10gd2UgcHJlc2VudGVkIGF0IHRoZSBs YXN0IFtNaXJhZ2VPUyByZXRyZWF0XSBhcmUNCiAgYWxzbyBoZWxwZnVsIGZvciB1bmRlcnN0YW5k aW5nIG91ciBuZXcgd29ya2Zsb3cuIENvbXBpbGluZyBhIHVuaWtlcm5lbA0KICBub3cgb25seSBy ZXF1aXJlcyBgZHVuZScgYW5kIHZlbmRvcmVkIGxpYnJhcmllcy4gV2UgaGF2ZSB0aGVyZWZvcmUN CiAgY2hvc2VuIG5vdCB0byByZXNvbHZlIGRlcGVuZGVuY2llcyBhdXRvbWF0aWNhbGx5IChhcyBb b3BhbS1tb25vcmVwb10NCiAgZGlkKSBvciB0byBpbXBvc2UgdGhlbSAoYXMgdGhlIGBtaXJhZ2Un IHRvb2wgZG9lcyksIGdpdmluZyBkZXZlbG9wZXJzDQogIGZ1bGwgZnJlZWRvbSB0byBidWlsZCB0 aGVpciB1bmlrZXJuZWxzIGFzIHRoZXkgc2VlIGZpdC4gSW4gcGFydGljdWxhciwNCiAgdGhpcyBt YWtlcyBpdCBzdHJhaWdodGZvcndhcmQgdG8gdXNlIHBweCByZXdyaXRlcnMsIHdoaWNoIHdhcw0K ICBkaWZmaWN1bHQgb3IgaW1wb3NzaWJsZSB3aXRoIHRoZSBgbWlyYWdlJyB0b29sLg0KDQoNCltT b2xvNV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9zb2xvNS9zb2xvNT4NCg0KW1VuaWtyYWZ0XSA8aHR0 cHM6Ly91bmlrcmFmdC5vcmcvPg0KDQpbZG9jdW1lbnRhdGlvbl0NCjxodHRwczovL3JvYnVyLWNv b3AuZ2l0aHViLmlvL21rZXJuZWwvbG9jYWwvbWtlcm5lbC9Na2VybmVsL2luZGV4Lmh0bWw+DQoN CltzbGlkZXNdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvbWtlcm5lbC9ibG9iL21h aW4vc2xpZGVzL3JldHJlYXQubWQ+DQoNCltNaXJhZ2VPUyByZXRyZWF0XSA8aHR0cHM6Ly9yZXRy ZWF0Lm1pcmFnZW9zLm9yZy8+DQoNCltvcGFtLW1vbm9yZXBvXSA8aHR0cHM6Ly9naXRodWIuY29t L3RhcmlkZXMvb3BhbS1tb25vcmVwbz4NCg0K4peKIEEgbmV3IHdvcmtmbG93IGFuZCB0YXJnZXRz DQoNCiAgVGhpcyByZWxlYXNlIGlzIGV4cGVyaW1lbnRhbDogWGVuIGlzIG5vdCB5ZXQgc3VwcG9y dGVkLCBhbmQgVW5pa3JhZnQNCiAgc3VwcG9ydCBpcyBwYXJ0aWFsLiBIb3dldmVyLCBib3RoIHBs YXRmb3JtcyBhcmUgb24gb3VyIHJvYWRtYXAsIHNvIGlmDQogIHlvdSBhcmUgaW50ZXJlc3RlZCBp biB0aGVtLCBwbGVhc2UgbGV0IHVzIGtub3chIFdlIGFyZSBhbHNvIGRldmVsb3BpbmcNCiAgdG9v bGluZyB0byBzdHJlYW1saW5lIHRoZSB3b3JrZmxvdywgd2l0aCB0aGUgZ3VpZGluZyBwcmluY2lw bGUgdGhhdA0KICB0aGVzZSB0b29scyBzaG91bGQgbmV2ZXIgZGljdGF0ZSB3aGljaCBkZXBlbmRl bmNpZXMgeW91ciB1bmlrZXJuZWwNCiAgdXNlcyBvciB3aGljaCBidWlsZCBzeXN0ZW0geW91IGNo b29zZS4NCg0KDQptbmV0DQrilYzilYzilYzilYwNCg0KICBgbW5ldCcgaXMgdGhlIGNlbnRlcnBp ZWNlIG9mIHRoaXMgcmVsZWFzZS4gSXQgaXMgZGVzaWduZWQgdG8gcmVwbGFjZQ0KICAoYW5kIGlt cHJvdmUgdXBvbikgW21pcmFnZS10Y3BpcF0gYnkgb2ZmZXJpbmcgYSBkaXJlY3Qtc3R5bGUgQVBJ IGJ1aWx0DQogIG9uIGVmZmVjdHMuIFRoZSBBUEkgZGVsaWJlcmF0ZWx5IG1pcnJvcnMgdGhlIGBV bml4JyBzb2NrZXQgaW50ZXJmYWNlOg0KICBgY29ubmVjdCcsIGBsaXN0ZW4nLCBgYWNjZXB0Jywg YHJlYWQnLCBgd3JpdGUnLCBhbmQgYGNsb3NlJyBhbGwgYmVoYXZlDQogIHRoZSB3YXkgeW91IHdv dWxkIGV4cGVjdC4NCg0KICBIZXJlIGlzIGEgc21hbGwgZXhhbXBsZSBvZiBhbiBlY2hvIHNlcnZl cjoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBsZXQgcnVuIChpcHY0LCBnYXRld2F5LCBpcHY2 KSA9DQogIOKUgiAgIE1rZXJuZWwuKHJ1biBbIHJuZzsgTW5ldC5zdGFjayB+bmFtZToic2Vydmlj ZSIgP2dhdGV3YXkgfmlwdjYgaXB2NCBdKQ0KICDilIIgICBAQCBmdW4gcm5nIChkYWVtb24sIHRj cCwgdWRwKSAtPg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+IE1uZXQua2lsbCBkYWVtb24g aW4NCiAg4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNaXJhZ2VfY3J5cHRvX3JuZ19ta2VybmVs LmtpbGwgcm5nIGluDQogIOKUgiAgIGxldCBsaXN0ZW4gPSBNbmV0LlRDUC5saXN0ZW4gdGNwIDkw MDAgaW4NCiAg4pSCICAgbGV0IGZsb3cgPSBNbmV0LlRDUC5hY2NlcHQgdGNwIGxpc3RlbiBpbg0K ICDilIIgICBsZXQgYnVmID0gQnl0ZXMuY3JlYXRlIDQwOTYgaW4NCiAg4pSCICAgbGV0IHJlYyBl Y2hvICgpID0NCiAg4pSCICAgICBsZXQgbGVuID0gTW5ldC5UQ1AucmVhZCBmbG93IGJ1ZiBpbg0K ICDilIIgICAgIGlmIGxlbiA+IDAgdGhlbiBiZWdpbg0KICDilIIgICAgICAgTW5ldC5UQ1Aud3Jp dGUgZmxvdyAoQnl0ZXMuc3ViX3N0cmluZyBidWYgMCBsZW4pOw0KICDilIIgICAgICAgZWNobyAo KQ0KICDilIIgICAgIGVuZA0KICDilIIgICBpbg0KICDilIIgICBsZXRAICgpID0gZnVuICgpIC0+ IE1uZXQuVENQLmNsb3NlIGZsb3cgaW4NCiAg4pSCICAgZWNobyAoKQ0KICDilJTilIDilIDilIDi lIANCg0KICBUTFMgc3VwcG9ydCAodmlhIFtvY2FtbC10bHNdKSBpcyBhbHJlYWR5IGF2YWlsYWJs ZSwgYWxsb3dpbmcgeW91IHRvDQogIGVzdGFibGlzaCBzZWN1cmUgY29ubmVjdGlvbnMgd2l0aCB5 b3VyIHVuaWtlcm5lbC4gRE5TIHJlc29sdXRpb24gKHZpYQ0KICBbb2NhbWwtZG5zXSkgYW5kIHRo ZSBbSGFwcHkgRXllYmFsbHNdIGFsZ29yaXRobSBhcmUgYWxzbyBpbmNsdWRlZCwgc28NCiAgdGhh dCBhIHVuaWtlcm5lbCBjYW4gcmVzb2x2ZSBob3N0bmFtZXMgYW5kIGNvbm5lY3QgdG8gcmVtb3Rl IHNlcnZpY2VzDQogIG92ZXIgYm90aCBJUHY0IGFuZCBJUHY2Lg0KDQogIEEgW3Nob3J0IHR1dG9y aWFsXSB3YWxrcyB5b3UgdGhyb3VnaCBjcmVhdGluZyBhbiBlY2hvIHNlcnZlciBhcyBhDQogIHVu aWtlcm5lbCwgc2ltaWxhciB0byB3aGF0IHdlIFthbHJlYWR5IG9mZmVyXSBmb3IgTWlvdS4gRm9y IHRoZQ0KICBjdXJpb3VzLCBhbiBhcnRpY2xlIGFib3V0IElQdjQgYW5kIE1pb3UgaXMgYXZhaWxh YmxlIFtoZXJlXS4NCg0KICBCZXlvbmQgdGhlIG1vdmUgdG8gZWZmZWN0cyBmb3IgYWxsIHNjaGVk dWxpbmcsIEkgd291bGQgbGlrZSB0byBnaXZlDQogIHNwZWNpYWwgdGhhbmtzIHRvOg0KICDigKIg RWR3aW4gVMO2csO2ayBmb3IgcHJvcG9zaW5nIGZpeGVzIHRvIHByZXZlbnQgZGVuaWFsLW9mLXNl cnZpY2UNCiAgICBhdHRhY2tzLCB3aGljaCBoYXZlIGJlZW4gaW50ZWdyYXRlZCBpbnRvIGBtbmV0 JyAoaW4gcGFydGljdWxhciBmb3INCiAgICBbQVJQXSkuDQogIOKAoiBOaWNvbGFzIE9qZWRhIELD pHIgZm9yIGNvbnRyaWJ1dGluZyBhbiBJUHY2IGltcGxlbWVudGF0aW9uIHRoYXQgd2UNCiAgICBh ZG9wdGVkIGFuZCBpbXByb3ZlZCAoY2FjaGVzLCBwYWNrZXQgZnJhZ21lbnRhdGlvbiBhbmQgcmVh c3NlbWJseSwNCiAgICBldGMuKQ0KICDigKIgUmV5bmlyIGZvciBwYXRpZW50bHkgZGVidWdnaW5n IFBDQVAgdHJhY2VzDQogIOKAoiBIYW5uZXMgZm9yIHNoYXJpbmcgaGlzIGRlZXAga25vd2xlZGdl IG9mIHRoZSBUQ1AgcHJvdG9jb2wgYW5kIGl0cw0KICAgIGludGVyYWN0aW9ucyB3aXRoIElQdjQg YW5kIElQdjYNCg0KICBBcyB3ZWxsIGFzIG90aGVycyB3aG8gcGFydGljaXBhdGVkIGluIHRoZSBk ZXZlbG9wbWVudCBvZiBgbW5ldCcgaW4gb25lDQogIHdheSBvciBhbm90aGVyLg0KDQoNClttaXJh Z2UtdGNwaXBdIDxodHRwczovL2dpdGh1Yi5jb20vbWlyYWdlL21pcmFnZS10Y3BpcD4NCg0KW29j YW1sLXRsc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJsZWZ0L29jYW1sLXRscz4NCg0KW29jYW1s LWRuc10gPGh0dHBzOi8vZ2l0aHViLmNvbS9taXJhZ2Uvb2NhbWwtZG5zPg0KDQpbSGFwcHkgRXll YmFsbHNdIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9oYXBweS1leWViYWxscz4NCg0K W3Nob3J0IHR1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdpdGh1Yi5pby9tbmV0Lz4NCg0K W2FscmVhZHkgb2ZmZXJdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21pb3UvZWNoby5o dG1sPg0KDQpbaGVyZV0gPGh0dHBzOi8vYmxvZy5yb2J1ci5jb29wL2FydGljbGVzL3V0Y3BfYW5k X2VmZmVjdHMuaHRtbD4NCg0KW0FSUF0gPGh0dHBzOi8vb3N2LmRldi92dWxuZXJhYmlsaXR5L09T RUMtMjAyNi0wMj4NCg0K4peKIERldmVsb3BpbmcgYW5kIGRlcGxveWluZyB1bmlrZXJuZWxzDQoN CiAgVGhpcyBsaWJyYXJ5IGFsc28gbWFya3MgYSB0dXJuaW5nIHBvaW50IGluIG91ciBhcHByb2Fj aCB0bw0KICB1bmlrZXJuZWxzLiBXZSBubyBsb25nZXIgdHJlYXQgYSByZWd1bGFyIE9DYW1sIGFw cGxpY2F0aW9uIGFzDQogIHNvbWV0aGluZyB0aGF0IGNhbiBiZSB0cmFuc3BhcmVudGx5IHR1cm5l ZCBpbnRvIGENCiAgdW5pa2VybmVsLiBEZXZlbG9waW5nIGEgdW5pa2VybmVsIG5vdyBtZWFucyBk ZXZlbG9waW5nIGEgdW5pa2VybmVsDQogIGZyb20gdGhlIHN0YXJ0LiBJbiBvdXIgZXhwZXJpZW5j ZSwgdHJ5aW5nIHRvIHJldHJvZml0IGFuIGV4aXN0aW5nDQogIGFwcGxpY2F0aW9uIGludG8gYSB1 bmlrZXJuZWwgd2FzIG5laXRoZXIgcHJhY3RpY2FsIG5vciB3b3J0aHdoaWxlLg0KDQogIE91ciB0 dXRvcmlhbCB0aGVyZWZvcmUgY292ZXJzIGJvdGggdGhlIGRldmVsb3BtZW50IGFuZCBkZXBsb3lt ZW50IG9mDQogIHVuaWtlcm5lbHMuIE9uIHRoZSBkZXBsb3ltZW50IHNpZGUsIHdlIGFsc28gcmVj b21tZW5kIGV4cGxvcmluZw0KICBbQWxiYXRyb3NzXS4NCg0KDQogIFtBbGJhdHJvc3NdIDxodHRw czovL2dpdGh1Yi5jb20vcm9idXItY29vcC9hbGJhdHJvc3M+DQoNCg0KdXRjcA0K4pWM4pWM4pWM 4pWMDQoNCiAgW2B1dGNwJ10gaXMgYSBwdXJlIE9DYW1sIGltcGxlbWVudGF0aW9uIG9mIHRoZSBU Q1AgcHJvdG9jb2wsIHVzZWQNCiAgaW50ZXJuYWxseSBieSBgbW5ldCcgdG8gaGFuZGxlIFRDUCBj b25uZWN0aW9ucy4gVGhlIGltcGxlbWVudGF0aW9uIGlzDQogIGJhc2VkIG9uIGEgc3RhdGUgbWFj aGluZSBhbmQgcGVyZm9ybXMgbm8gSS9PIGl0c2VsZiwgbWFraW5nIGl0IGVhc3kgdG8NCiAgdGVz dCBhbmQgcmVhc29uIGFib3V0Lg0KDQogIGB1dGNwJyBjb3ZlcnMgdGhlIGZ1bGwgVENQIGxpZmVj eWNsZTogdGhlIHRocmVlLXdheSBoYW5kc2hha2UsDQogIHJlbGlhYmxlIGluLW9yZGVyIGRhdGEg ZGVsaXZlcnkgd2l0aCByZXRyYW5zbWlzc2lvbnMsIGZsb3cgY29udHJvbCwNCiAgY29uZ2VzdGlv biBjb250cm9sLCBhbmQgY29ubmVjdGlvbiB0ZWFyZG93bi4gSXQgaGFzIGJlZW4gdGVzdGVkDQog IGV4dGVuc2l2ZWx5IHRocm91Z2ggb3VyIGVuZC10by1lbmQgdW5pa2VybmVsIHRlc3RzIChhIHNp bXBsZSBbZWNob10NCiAgc2VydmVyIGFuZCBjbGllbnQsIGFuZCBhIFtETlMgcmVzb2x2ZXJdKS4N Cg0KDQpbYHV0Y3AnXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvdXRjcD4NCg0KW2Vj aG9dIDxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9tbmV0L3RyZWUvbWFpbi91bmlrZXJu ZWxzL2VjaG8+DQoNCltETlMgcmVzb2x2ZXJdDQo8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNv b3AvbW5ldC90cmVlL21haW4vdW5pa2VybmVscy9yZXNvbHZlcj4NCg0K4peKIFVuaWtlcm5lbHMg YW5kIHByb29mcw0KDQogIGB1dGNwJyBhbHNvIHJlZmxlY3RzIG91ciBhbWJpdGlvbiB0byBpbmNv cnBvcmF0ZSwgYXMgdGltZSBwZXJtaXRzLA0KICBwcm9vZi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMu IE90aGVyIGV4YW1wbGVzIGluY2x1ZGU6DQogIOKAoiBtaW91IHdpdGggaXRzIHByaW9yaXR5IHF1 ZXVlIChzZWUgdGhlIFtWT0NBTF0gcHJvamVjdCkNCiAg4oCiIG1pcmFnZS1jcnlwdG8gd2l0aCBj ZXJ0YWluIGNyeXB0b2dyYXBoaWMgcHJpbWl0aXZlcyAoc2VlIHRoZSBbZmlhdF0NCiAgICBwcm9q ZWN0KQ0KICDigKIgYW5kIG5vdyB1dGNwIChzZWUgW25ldHNlbV0pDQoNCiAgVGhpcyBlZmZvcnQg aXMgc3RpbGwgaW4gaXRzIGVhcmx5IHN0YWdlcywgYnV0IHdlIHdlbGNvbWUgaW1wcm92ZW1lbnRz DQogIGFuZCBjb2xsYWJvcmF0aW9ucyBpbiB0aGlzIGFyZWEuDQoNCg0KICBbVk9DQUxdIDxodHRw czovL2lucmlhLmhhbC5zY2llbmNlL2hhbC0wMTU2MTA5ND4NCg0KICBbZmlhdF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9taXQtcGx2L2ZpYXQtY3J5cHRvPg0KDQogIFtuZXRzZW1dIDxodHRwczovL3d3 dy5jbC5jYW0uYWMudWsvfnBlczIwL05ldHNlbS8+DQoNCg0KbWh0dHANCuKVjOKVjOKVjOKVjOKV jA0KDQogIFRvIHJlYWNoIGEgd2lkZXIgYXVkaWVuY2UsIHdlIGFsc28gcHJvdmlkZSBhbiBIVFRQ IHByb3RvY29sDQogIGltcGxlbWVudGF0aW9uIGZvciB1bmlrZXJuZWxzLCBidWlsZGluZyBvbiB0 aGUgd29yayB3ZSBzdGFydGVkIChhbmQNCiAgY3VycmVudGx5IHVzZSBpbiBwcm9kdWN0aW9uKSB3 aXRoIFtodHRwY2F0c10uDQoNCiAgYG1odHRwJyBpcyBlc3NlbnRpYWxseSBhIHVuaWtlcm5lbC1v cmllbnRlZCBjb3VudGVycGFydCB0byBgaHR0cGNhdHMnLA0KICB1c2luZyBbb2NhbWwtaDFdIGFu ZCBbb2NhbWwtaDJdIGFzIGl0cyBIVFRQLzEuMSBhbmQgSDIgYmFja2VuZHMuDQoNCg0KW2h0dHBj YXRzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvaHR0cGNhdHM+DQoNCltvY2FtbC1o MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWgxPg0KDQpbb2NhbWwtaDJd IDxodHRwczovL2dpdGh1Yi5jb20vYW5tb250ZWlyby9vY2FtbC1oMj4NCg0K4peKIEVjb3N5c3Rl bSBhbmQgY29tcG9zYWJpbGl0eQ0KDQogIEFsdGhvdWdoIGBtaHR0cCcgaXMgYSBzbWFsbCBwcm9q ZWN0LCBpdCBpbGx1c3RyYXRlcyBhIGJyb2FkZXINCiAgcHJpbmNpcGxlIGJlaGluZCBvdXIgY29v cGVyYXRpdmUncyBhcHByb2FjaCB0byBsaWJyYXJ5IGRldmVsb3BtZW50LiBBcw0KICB3ZSBoYXZl IFtzdGF0ZWQgYmVmb3JlXSwgZXZlcnl0aGluZyB3ZSBidWlsZCBpcyBkZXNpZ25lZCB0byBiZQ0K ICByZXVzYWJsZSB3aXRoIHNjaGVkdWxlcnMgb3RoZXIgdGhhbiBNaW91IGFuZCBpbiBjb250ZXh0 cyBvdGhlciB0aGFuDQogIHVuaWtlcm5lbHMuIFJlZ2FyZGxlc3Mgb2Ygd2hpY2ggc2NoZWR1bGVy IG9uZSBwcmVmZXJzLCB3ZSBiZWxpZXZlIGluIGENCiAgcHJhZ21hdGljLCBjb29wZXJhdGl2ZSBh cHByb2FjaCB0byBjb250cmlidXRpbmcgdG8gdGhlIGNvbW11bml0eS4NCg0KICBPdXIgcHJpbWFy eSBmb2N1cyByZW1haW5zIHVuaWtlcm5lbCBkZXZlbG9wbWVudCwgYnV0IHllYXJzIG9mDQogIGV4 cGVyaWVuY2UgYnVpbGRpbmcgcHJvdG9jb2wgYW5kIGZvcm1hdCBsaWJyYXJpZXMgaGF2ZSB0YXVn aHQgdXMgdGhhdA0KICBrZWVwaW5nIHRoZW0gc2NoZWR1bGVyLWFnbm9zdGljIGlzIGluIGV2ZXJ5 b25lJ3MgYmVzdCBpbnRlcmVzdCwgZm9yDQogIG1haW50YWluYWJpbGl0eSwgdGVzdGFiaWxpdHks IGFuZCByZWxpYWJpbGl0eSBhbGlrZS4gV2hlcmV2ZXINCiAgcG9zc2libGUsIHlvdSB3aWxsIGZp bmQgYSBnZW5lcmFsLXB1cnBvc2UgbGlicmFyeSBhbG9uZ3NpZGUgaXRzDQogIHVuaWtlcm5lbCBj b3VudGVycGFydDogYGh0dHBjYXRzJyBhbmQgYG1odHRwJyBhcmUgb25lIHN1Y2ggcGFpci4NCg0K DQogIFtzdGF0ZWQgYmVmb3JlXQ0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29uLWNv bmN1cnJlbmN5LW1vZGVscy8xNTg5OS8xMz91PWRpbm9zYXVyZT4NCg0KDQpWaWZ1DQrilYzilYzi lYzilYwNCg0KICBBcyBbcHJldmlvdXNseSBhbm5vdW5jZWRdLCB3ZSBoYXZlIGRldmVsb3BlZCBh IHdlYiBmcmFtZXdvcmsgZm9yIE9DYW1sDQogIDUgY2FsbGVkIFt2aWZdLCB3aGljaCB3ZSB1c2Ug aW4gcHJvZHVjdGlvbiBmb3Igb3VyIFtidWlsZHMucm9idXIuY29vcF0NCiAgd2Vic2l0ZSAod2Ug cmVjb21tZW5kIHRoZSBbdHV0b3JpYWxdIHByZXNlbnRlZCBhdCBbRlVOIE9DYW1sXSAyMDI1KS4N Cg0KICBgdmlmJyBub3cgaGFzIGEgdW5pa2VybmVsIHZhcmlhbnQ6IGB2aWZ1Jy4gSXQgb2ZmZXJz IG5lYXJseSB0aGUgc2FtZQ0KICBpbnRlcmZhY2UgYXMgYHZpZicgKGV4Y2VwdCBmb3Igc3RhdGlj IGZpbGUgbWFuYWdlbWVudCksIG1ha2luZyBpdA0KICBwb3NzaWJsZSB0byBidWlsZCB3ZWJzaXRl cyBlbnRpcmVseSBpbiBPQ2FtbC4gSGVyZSBpcyBhIHNtYWxsDQogIHVuaWtlcm5lbCB0aGF0IGRp c3BsYXlzICJIZWxsbyBXb3JsZCEiOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IGhl bGxvX3dvcmxkIHJlcSBfc2VydmVyICgpID0NCiAg4pSCICAgbGV0IG9wZW4gVmlmdS5SZXNwb25z ZS5TeW50YXggaW4NCiAg4pSCICAgbGV0KiAoKSA9IFZpZnUuUmVzcG9uc2Uud2l0aF90ZXh0IHJl cSAiSGVsbG8gV29ybGQhXG4iIGluDQogIOKUgiAgIFZpZnUuUmVzcG9uc2UucmVzcG9uZCBgT0sN CiAg4pSCIA0KICDilIIgbGV0IHJ1biAoaXB2NCwgZ2F0ZXdheSwgaXB2NikgPQ0KICDilIIgICBN a2VybmVsLihydW4gWyBybmc7IE1uZXQuc3RhY2sgfm5hbWU6InNlcnZpY2UiID9nYXRld2F5IH5p cHY2IGlwdjQgXSkNCiAg4pSCICAgQEAgZnVuIHJuZyAoZGFlbW9uLCB0Y3AsIHVkcCkgLT4NCiAg 4pSCICAgbGV0QCAoKSA9IGZ1biAoKSAtPiBNbmV0LmtpbGwgZGFlbW9uIGluDQogIOKUgiAgIGxl dEAgKCkgPSBmdW4gKCkgLT4gTWlyYWdlX2NyeXB0b19ybmdfbWtlcm5lbC5raWxsIHJuZyBpbg0K ICDilIIgICBsZXQgY2ZnID0gVmlmdS5Db25maWcudiA4MCBpbg0KICDilIIgICBsZXQgcm91dGVz ID0gVmlmdS5bIGdldCAocmVsIC8/PyBhbnkpIC0tPiBoZWxsb193b3JsZCBdIGluDQogIOKUgiAg IFZpZnUucnVuIH5jZmcgdGNwIHJvdXRlcyAoKQ0KICDilJTilIDilIDilIDilIANCg0KICAqZGlz Y2xhaW1lcio6IElmIHlvdSB3b3VsZCBsaWtlIHRvIHVzZSBgdmlmdScsIHBsZWFzZSBub3RlIHRo YXQNCiAgIGFsdGhvdWdoIGEgcmVjZW50IHJlbGVhc2UgaGFzIGJlZW4gbWFkZSwgb25lIGZpbmFs IGZpeCBpcyBzdGlsbA0KICAgbmVlZGVkIHRvIGNvbXBpbGUgYSB1bmlrZXJuZWwgd2l0aCB0aGlz IGxpYnJhcnkgKHRvIGF2b2lkIHB1bGxpbmcgaW4NCiAgIHRoZSBgdW5peCcgbW9kdWxlKS4gV2Ug cmVjb21tZW5kIHBpbm5pbmcgYHZpZnUnIGZvciBub3cuDQoNCg0KW3ByZXZpb3VzbHkgYW5ub3Vu Y2VkXQ0KPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taHR0cGNhdHMtb2NhbWwtaDEt dmlmLWh1cmwtYS13ZWJzdGFjay1mb3Itb2NhbWwtNS8xNzEwND4NCg0KW3ZpZl0gPGh0dHBzOi8v Z2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2J1aWxkcy5yb2J1ci5jb29wXSA8aHR0cHM6 Ly9idWlsZHMucm9idXIuY29vcD4NCg0KW3R1dG9yaWFsXSA8aHR0cHM6Ly9yb2J1ci1jb29wLmdp dGh1Yi5pby92aWYvPg0KDQpbRlVOIE9DYW1sXSA8aHR0cHM6Ly9mdW4tb2NhbWwuY29tPg0KDQoN ClVuaWtlcm5lbHMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEJlaGluZCBh bGwgdGhlc2UgbGlicmFyaWVzLCB0aGVyZSBhcmUgY29uY3JldGUgcHJvamVjdHMgdGhhdCB3ZSB3 b3VsZA0KICBsaWtlIHRvIHNoYXJlIHdpdGggeW91Og0KICDigKIgT3VyIFtgaW1tdXRhYmxlJ10g dW5pa2VybmVsLCBhIHdlYiBzZXJ2ZXIgZm9yIHN0YXRpYyBmaWxlcyAod2hpY2gNCiAgICBjYW4g YmUgZ2VuZXJhdGVkLCBmb3IgZXhhbXBsZSwgd2l0aCBbWU9DYW1sXSkuDQogIOKAoiBBIEROUyBy ZXNvbHZlciB1bmlrZXJuZWw6IFtgcGFnZWphdW5lJ10NCiAg4oCiIEEgc21hbGwgc2VhcmNoIGVu Z2luZSBmb3IgZW1haWxzIGZyb20gYW4gYXJjaGl2ZSBzdWNoIGFzIHRoZQ0KICAgIGNhbWwtbGlz dDogW2BibGFtZSddLiBNb3JlIGRldGFpbHMgYXJlIGF2YWlsYWJsZSBbaGVyZV0uDQoNCg0KW2Bp bW11dGFibGUnXSA8aHR0cHM6Ly9naXRodWIuY29tL2Rpbm9zYXVyZS9pbW11YWJsZT4NCg0KW1lP Q2FtbF0gPGh0dHBzOi8vZ2l0aHViLmNvbS94aHRtbGJvaS95b2NhbWw+DQoNCltgcGFnZWphdW5l J10gPGh0dHBzOi8vZ2l0aHViLmNvbS9kaW5vc2F1cmUvcGFnZWphdW5lPg0KDQpbYGJsYW1lJ10g PGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2JsYW1lPg0KDQpbaGVyZV0NCjxodHRwczov L2Jsb2cucm9idXIuY29vcC9hcnRpY2xlcy8yMDI1LTA0LTEyLXB0dC1zZWFyY2gtd2ViYXBwLmh0 bWw+DQoNCg0KQ29uY2x1c2lvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg QWZ0ZXIgc2V2ZXJhbCB5ZWFycyBvZiB3b3JrLCB3ZSBhcmUgbm93IGFibGUgdG8gZGV2ZWxvcCB1 bmlrZXJuZWxzDQogIHdpdGggT0NhbWwgNSBpbiBlYXJuZXN0LiBXZSBob3BlIHRoYXQgb3VyIG5l dyB3b3JrZmxvdyB3aWxsIGJlIG9mDQogIGludGVyZXN0IHRvIHRoZSBjb21tdW5pdHkgYW5kIHRo YXQgdGhlc2UgbGlicmFyaWVzIHdpbGwgYmUgYSB1c2VmdWwNCiAgY29udHJpYnV0aW9uIHRvIHRo ZSBPQ2FtbCBlY29zeXN0ZW0uDQoNCiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gdHJ5IGl0IG91dCwg d2UgcmVjb21tZW5kIHN0YXJ0aW5nIHdpdGggdGhlIFttbmV0DQogIHR1dG9yaWFsXSBhbmQgdGhl IFtta2VybmVsIGRvY3VtZW50YXRpb25dLiBGZWVsIGZyZWUgdG8gb3BlbiBpc3N1ZXMgb3INCiAg cmVhY2ggb3V0IHRvIHVzIGlmIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMhDQoNCg0KW21uZXQgdHV0 b3JpYWxdIDxodHRwczovL3JvYnVyLWNvb3AuZ2l0aHViLmlvL21uZXQvPg0KDQpbbWtlcm5lbCBk b2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vcm9idXItY29vcC5naXRodWIuaW8vbWtlcm5lbC9sb2Nh bC9ta2VybmVsL01rZXJuZWwvaW5kZXguaHRtbD4NCg0KDQpFeHBlcmltZW50OiBmb3JtYXQtbGlu ZQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5v cmcvdC9hbm4tZXhwZXJpbWVudC1mb3JtYXQtbGluZS8xNzg1NC8xPg0KDQoNCkVtaWxlIFRyb3Rp Z25vbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgbWFkZSB0aGlzIGxpdHRs ZSBleHBlcmltZW50IGEgd2hpbGUgYmFjazoNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMv Zm9ybWF0LWxpbmU+DQoNCiAgVGhlIGlkZWEgaXMgdG8gcHJvdmlkZSBhIGNvbXBsZW1lbnQgdG8g b2NwLWluZGVudCB0byBkZWNpZGUgd2hpY2gNCiAgdG9rZW4gc2hvdWxkIGJlIHNlcGFyYXRlZCBi eSB3aGl0ZXNwYWNlIGFuZCB3aGljaCBzaG91bGQgbm90LiBGb3Igbm93DQogIGl0IGlzIGJhc2Vk IG9ubHkgb24gbGV4aW5nIGluZm9ybWF0aW9uLCB3aGljaCBtYWtlIHRoZSBjb2RlIHNpbXBsZSBi dXQNCiAgYWxzbyBkb2VzIG5vdCBhbHdheXMgcHJvdmlkZSBlbm91Z2ggaW5mb3JtYXRpb24gdG8g aGF2ZSBhIG5pY2UNCiAgZm9ybWF0dGluZy4NCg0KICBBbiBpZGVhIG9mIHRoZSBvdXRwdXQgY2Fu IGJlIHJlYWQgaGVyZToNCiAgPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMvZm9ybWF0LWxpbmUv YmxvYi9tYXN0ZXIvdGVzdC9ydW4udD4NCg0KICBUaGUgcHJvamVjdCBpdHNlbGYgaXMgZm9ybWF0 dGVkIHdpdGggb2NhbWxmb3JtYXQsIGFuZCBpbiB0aGUgdGhlcmUgaXMNCiAgYSBkaWZmIG9mIHdo YXQgdGhpcyBjaGFuZ2VzIGNvbXBhcmVkIHRvIG9jYW1sZm9ybWF0LCBvbiB0aGUgbWFpbg0KICBz b3VyY2UgZmlsZS4NCg0KICBJIHRoaW5rIHRoaXMgYXBwcm9hY2ggY291bGQgYmUgaW1wcm92ZWQg YnkgaGF2aW5nIGEgaHlicmlkIGFzdC10b2tlbg0KICBzdHJlYW0gZGF0YXN0cnVjdHVyZS4gU29t ZXRoaW5nIHdoZXJlIHlvdSB3b3JrIG9uIGEgc3RyZWFtIG9mIHRva2VuDQogIGJ1dCB5b3UgY2Fu IHF1ZXJ5IHRoZSBBU1QgY29udGV4dCBvZiBhIGdpdmVuIHRva2VuLg0KDQogIFdoYXQgZG8geW91 IHRoaW5rID8NCg0KDQpDYW1sIGluIHRoZSBDYXBpdGFsIC0gUmVnaXN0cmF0aW9ucyBPcGVuIQ0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tY2FtbC1pbi10aGUtY2FwaXRhbC1yZWdpc3RyYXRpb25zLW9wZW4vMTc3NzYvNj4NCg0KDQpD b250aW51aW5nIHRoaXMgdGhyZWFkLCBTYWNoYSBBeW91biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEFuZCBoZXJlIGlzIHRoZSBbbGluayB0byB0aGUgcmVjb3JkaW5nXSEN Cg0KICBXZSdkIGxpa2UgdG8gdGhhbmsgb3VyIHNwZWFrZXJzIEplcmVteSBhbmQgTmljayBhZ2Fp biwgYXMgd2VsbCBhcyB0aGUNCiAgfjMwIGF0dGVuZGVlcyB0byB0aGUgbWVldHVwISBJdCB3YXMg Z3JlYXQgaGF2aW5nIHlvdSwgYW5kIHdlIGhvcGUgdG8NCiAgc2VlIHlvdSBhZ2FpbiBuZXh0IHRp bWUgOikNCg0KDQpbbGluayB0byB0aGUgcmVjb3JkaW5nXSA8aHR0cHM6Ly93d3cueW91dHViZS5j b20vd2F0Y2g/dj02Q005SjJDNThkZz4NCg0KDQpFeHBlcmltZW50YWwgdG9vbHMgZm9yIG1pZ3Jh dGluZyBmcm9tIEx3dCB0byBFaW8NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWV4cGVyaW1lbnRh bC10b29scy1mb3ItbWlncmF0aW5nLWZyb20tbHd0LXRvLWVpby8xNzg1NS8xPg0KDQoNCkp1bGVz IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgV2UgZGV2ZWxvcGVkIHRvb2xzIHRvIGhlbHAgdXMgbWlncmF0ZSBPY3NpZ2VuIGxpYnJh cmllcyBhbmQNCiAgYXBwbGljYXRpb25zIHRvIGRpcmVjdC1zdHlsZSBjb25jdXJyZW5jeSBhbmQg d2UgYXJlIGhhcHB5IHRvIHNoYXJlDQogIHRoZW0uDQoNCiAgVGhlcmUgYXJlIDQgaW5kZXBlbmRl bnQgdG9vbHMgZm9yIGRpZmZlcmVudCBwdXJwb3NlczoNCg0KICDigKIgUmVwbGFjaW5nIGV2ZXJ5 IHVzZXMgb2YgYGx3dF9wcHgnIHdpdGggYEx3dCcgZnVuY3Rpb24gY2FsbHMNCiAgICAoZS5nLiBy ZXBsYWNpbmcgYGxldCVsd3QgLi4uIGluJyB3aXRoIGBsZXQqIC4uLiBpbicpLiAgVGhpcyBpcw0K ICAgIHB1cmVseSBzeW50YWN0aWMgYW5kIGFsbG93cyB5b3UgdG8gZWFzaWx5IHJlbW92ZSBhIFBQ WC4gSXQgaGFuZGxlcw0KICAgIGluc2VydGluZyBgb3BlbiBMd3QuU3ludGF4JyBhdCB0aGUgdG9w IG9mIHRoZSBmaWxlLg0KDQogIOKAoiBXYXJuaW5nIGFib3V0IG9jY3VycmVuY2VzIG9mIGBsZXQg XyA9IC4uLicgYW5kIGBpZ25vcmUgLi4uJywgd2hpY2gNCiAgICBtYWtlIHRoZSBuZXh0IHRvb2xz IGxlc3MgcmVsaWFibGUuICBUaGVzZSBhcmUgY2FsbGVkIOKAnGltcGxpY2l0IGZvcmvigJ0NCiAg ICBiZWNhdXNlIGNvZGUgcnVuIGNvbmN1cnJlbnRseSBpZiB0aGUgaWdub3JlZCB2YWx1ZSBpcyBh biBMd3QNCiAgICB0aHJlYWQuIFRoaXMgcmVxdWlyZXMgYW4gZXhwbGljaXQgY2FsbCB0byBgRmli ZXIuZm9yaycgd2l0aCBFaW8uDQoNCiAg4oCiIE1pZ3JhdGluZyB1c2VzIG9mIGBMd3RfbG9nJyB0 byBgTG9ncycuICBJdCB3YXMgdXNlZCBvbg0KICAgIFtvY3NpZ2Vuc2VydmVyXSBmb3IgZXhhbXBs ZS4gIEF0IHRoaXMgcG9pbnQgd2UgZ2VuZXJhdGUgY29kZSB3b3JraW5nDQogICAgYXMgYmVmb3Jl IGFuZCBkaWQgbm90IGludHJvZHVjZSBhIGRlcGVuZGVuY3kgb24gRWlvLg0KDQogIOKAoiBNaWdy YXRpbmcgdXNlcyBvZiBgTHd0JyB0byBgRWlvJy4gSXQgcmV3cml0ZXMgY29kZSB3cml0dGVuIGlu DQogICAgbW9uYWRpYyBzdHlsZSBpbnRvIGRpcmVjdC1zdHlsZSwgZm9yIGV4YW1wbGUgdGhpcyBj b2RlOg0KDQogICAg4pSM4pSA4pSA4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBs ZXQqIHggPSBmIDEgaW4NCiAgICDilIIgICBsZXQrIHkgPSBmIDIgaW4NCiAgICDilIIgICBMd3Qu YmluZCAoZiAzKSAoZnVuIHogLT4NCiAgICDilIIgICAgIEx3dC5yZXR1cm4gKHggKyB5ICsgeikp DQogICAg4pSU4pSA4pSA4pSA4pSADQoNCiAgICBpcyByZXdyaXR0ZW4gdG86DQoNCiAgICDilIzi lIDilIDilIDilIANCiAgICDilIIgbGV0IF8gPQ0KICAgIOKUgiAgIGxldCB4ID0gZiAxIGluDQog ICAg4pSCICAgbGV0IHkgPSBmIDIgaW4NCiAgICDilIIgICBsZXQgeiA9IGYgMyBpbg0KICAgIOKU giAgIHggKyB5ICsgeg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgSXQgYWxzbyByZXdyaXRl IGBMd3QnIGZ1bmN0aW9uIGNhbGxzIHRvIHRoZWlyIGVxdWl2YWxlbnQgaW4gYEVpbycNCiAgICBh bmQgaGFuZGxlcyBtYW55IElPIG9wZXJhdGlvbnMuDQoNCiAgICBVbmZvcnR1bmF0ZWx5LCB0aGlz IHRvb2wgZG9lc27igJl0IGdlbmVyYXRlIGZ1bGx5IGVxdWl2YWxlbnQgY29kZSBhbmQNCiAgICBy ZXF1aXJlcyBtYW51YWwgbW9kaWZpY2F0aW9ucy4gQ29tbWVudHMgYXJlIGluc2VydGVkIGluIG1h bnkgcGxhY2VzDQogICAgd2hlcmUgaW50ZXJ2ZW50aW9uIGlzIG5lZWRlZC4NCg0KICAgIEFuIGV4 YW1wbGUgb2YgZ2VuZXJhdGVkIGluY29ycmVjdCBjb2RlIGlzOg0KDQogICAg4pSM4pSA4pSA4pSA 4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSA9IG9wZXJhdGlvbl8xICgpIGlu DQogICAg4pSCICAgbGV0KiBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQqIGEg PSBhIGluDQogICAg4pSCICAgTHd0LnJldHVybiAoYSArIGIpDQogICAg4pSU4pSA4pSA4pSA4pSA DQoNCiAgICB3aGljaCBpcyByZXdyaXR0ZW4gaW50bzoNCg0KICAgIOKUjOKUgOKUgOKUgOKUgA0K ICAgIOKUgiBsZXQgXyA9DQogICAg4pSCICAgbGV0IGEgPSBvcGVyYXRpb25fMSAoKSBpbg0KICAg IOKUgiAgIGxldCBiID0gb3BlcmF0aW9uXzIgKCkgaW4NCiAgICDilIIgICBsZXQgYSA9IGEgaW4N CiAgICDilIIgICBhICsgYg0KICAgIOKUlOKUgOKUgOKUgOKUgA0KDQogICAgVGhpcyBpcyBpbmNv cnJlY3QgYmVjYXVzZSBgb3BlcmF0aW9uXzEnIGFuZCBgb3BlcmF0aW9uXzInIGFyZSBub3cNCiAg ICBzZXF1ZW50aWFsIGJ1dCB3ZXJlIGNvbmN1cnJlbnQgYmVmb3JlLiBUaGlzIGlzIGEgY2FzZSBv ZiBhbiBpbXBsaWNpdA0KICAgIGZvcmsgdGhhdCBjYW5ub3QgZWFzaWx5IGJlIGRldGVjdGVkLiBU aGUgY29ycmVjdCB0cmFuc2Zvcm1hdGlvbg0KICAgIHdvdWxkIGJlOg0KDQogICAg4pSM4pSA4pSA 4pSA4pSADQogICAg4pSCIGxldCBfID0NCiAgICDilIIgICBsZXQgYSwgYiA9IEVpby5GaWJlci5w YWlyIG9wZXJhdGlvbl8xIG9wZXJhdGlvbl8yIGluDQogICAg4pSCICAgYSArIGINCiAgICDilJTi lIDilIDilIDilIANCg0KICAgIFdlIGNvdWxkIGFjaGlldmUgdGhlIG1pZ3JhdGlvbiBvbiBbZWxp b21dIGFuZCBbb2NzaWdlbnNlcnZlcl0NCg0KICBBbGwgdGhlIHRvb2xzIHVzZSBPQ2FtbGZvcm1h dCB1bmRlciB0aGUgaG9vZCB0byBnZW5lcmF0ZSB0aGUNCiAgY29kZS4gVGhpcyBoYXMgdGhlIGlu Y29udmVuaWVudCBvZiBlbmZvcmNpbmcgdGhlIHVzZSBvZiBPQ2FtbGZvcm1hdA0KICBiZWZvcmUg dXNpbmcgdGhlbSBhcyB0aGV5IHdpbGwgcmVmb3JtYXQgdGhlIGVudGlyZSBjb2RlYmFzZS4NCg0K ICBUaGUgbGFzdCB0d28gdG9vbHMgdXNlIE1lcmxpbiB1bmRlciB0aGUgaG9vZCB0byBsb2NhdGUg dXNlcyBvZiBgTHd0Jw0KICBmdW5jdGlvbnMgaW4gdGhlIHNvdXJjZSBmaWxlcy4gVGhpcyB3b3Jr cyBieSByZWFkaW5nIE1lcmxpbuKAmXMNCiAgb2NhbWwtaW5kZXggZmlsZXMgYnVpbHQgYnkgRHVu ZSB0byBleHRyYWN0IHRoZSBsb2NhdGlvbiBpbiB0aGUgc291cmNlDQogIGZpbGVzIHRoYXQgd2Ug bmVlZC4NCg0KICBDdXJyZW50bHksIGl0IG9ubHkgc3VwcG9ydHMgRWlvIGFzIGEgYmFja2VuZCBi dXQgY2FuIGVhc2lseSBiZQ0KICBbYWRhcHRlZF0gdG8gb3RoZXIgZGlyZWN0LXN0eWxlIGNvbmN1 cnJlbmN5IGxpYnJhcmllcy4NCg0KICBUaGlzIHdvcmsgd2FzIG1hZGUgcG9zc2libGUgdGhhbmtz IHRvIHRoZSBzdXBwb3J0IG9mIHRoZSBbTkdJIFplcm8NCiAgQ29yZSBmdW5kXSB0aHJvdWdoIHRo ZSBbTmxuZXQgZm91bmRhdGlvbl0sIGFuZCBpcyBwZXJmb21lZCBieQ0KICBbVGFyaWRlc10uDQoN Cg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2Vuc2Vy dmVyL3B1bGwvMjU2Pg0KDQpbZWxpb21dIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9lbGlv bS9wdWxsLzg0Nj4NCg0KW29jc2lnZW5zZXJ2ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdl bi9vY3NpZ2Vuc2VydmVyL3B1bGwvMjY5Pg0KDQpbYWRhcHRlZF0NCjxodHRwczovL2dpdGh1Yi5j b20vdGFyaWRlcy9jaWFvLWx3dC9ibG9iL21haW4vYmluL2NpYW9fbHd0L3RvX2RpcmVjdF9zdHls ZS9jb25jdXJyZW5jeV9iYWNrZW5kLm1sPg0KDQpbTkdJIFplcm8gQ29yZSBmdW5kXSA8aHR0cHM6 Ly9ubG5ldC5ubC90aGVtYS9OR0laZXJvQ29yZS5odG1sPg0KDQpbTmxuZXQgZm91bmRhdGlvbl0g PGh0dHBzOi8vbmxuZXQubmwvPg0KDQpbVGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20vPg0K DQoNCkZpcnN0IGFscGhhIHJlbGVhc2Ugb2YgT0NhbWwgNS41LjANCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvZmlyc3QtYWxwaGEtcmVsZWFzZS1vZi1vY2FtbC01LTUtMC8xNzg1 Ni8xPg0KDQoNCm9jdGFjaHJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEZvdXIgbW9udGhzIGFmdGVyIHRo ZSByZWxlYXNlIG9mIE9DYW1sIDUuNC4wLCB0aGUgc2V0IG9mIG5ldyBmZWF0dXJlcw0KICBmb3Ig dGhlIGZ1dHVyZSB2ZXJzaW9uIDUuNS4wIG9mIE9DYW1sIGhhcyBiZWVuIGZyb3plbi4gV2UgYXJl IHRodXMNCiAgaGFwcHkgdG8gYW5ub3VuY2UgdGhlIGZpcnN0IGFscGhhIHJlbGVhc2UgZm9yIE9D YW1sIDUuNS4wLg0KDQogIFRoaXMgYWxwaGEgdmVyc2lvbiBpcyBoZXJlIHRvIGhlbHAgZmVsbG93 IGhhY2tlcnMgam9pbiB1cyBlYXJseSBpbiBvdXINCiAgYnVnIGh1bnRpbmcgYW5kIG9wYW0gZWNv c3lzdGVtIGZpeGluZyBmdW4gKHNlZSBiZWxvdyBmb3IgdGhlDQogIGluc3RhbGxhdGlvbiBpbnN0 cnVjdGlvbnMpLiBNb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWxlYXNlIHByb2Nlc3MNCiAg aXMgYXZhaWxhYmxlIGF0DQogIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90 cnVuay9yZWxlYXNlLWluZm8vaW50cm9kdWN0aW9uLm1kPi4NCg0KICBUaGUgcHJvZ3Jlc3Mgb24g c3RhYmlsaXNpbmcgdGhlIGVjb3N5c3RlbSBpcyB0cmFja2VkIG9uIHRoZSBbb3BhbQ0KICByZWFk aW5lc3MgZm9yIDUuNS4wIG1ldGEtaXNzdWVdIC4NCg0KICBUaGVyZSBpcyBhbHNvIGEgY29tcGFu aW9uIGFscGhhIG9wYW0gcmVwb3NpdG9yeSBhdmFpbGFibGUgZm9yIHRoaXMNCiAgYWxwaGEgcmVs ZWFzZQ0KICDilIzilIDilIDilIDilIANCiAg4pSCICQgb3BhbSByZXBvIGFkZCBhbHBoYSBnaXQr aHR0cHM6Ly9naXRodWIuY29tL2tpdC10eS1rYXRlL29wYW0tYWxwaGEtcmVwb3NpdG9yeS5naXQN CiAg4pSU4pSA4pSA4pSA4pSADQogIHdoaWNoIGNvbnRhaW5zIGluLXByb2dyZXNzIGFscGhhIHJl bGVhc2VzIG9mIG9wYW0gcGFja2FnZXMgdGhhdCBhcmUNCiAgYmVpbmcgdXBkYXRlZCBmb3IgT0Nh bWwgNS41LjAgLg0KDQogIFRoZSBmdWxsIHJlbGVhc2UgaXMgZXhwZWN0ZWQgYmV0d2VlbiBNYXkg YW5kIEp1bmUuIFRoZXJlIGFyZSBtb3JlDQogIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBpbiB0aGUg W3Byb3NwZWN0aXZlIHJlbGVhc2UgY2FsZW5kYXJdLg0KDQogIElmIHlvdSBmaW5kIGFueSBidWdz LCBwbGVhc2UgcmVwb3J0IHRoZW0gb24gdGhlIFtPQ2FtbCdzIGlzc3VlDQogIHRyYWNrZXJdLg0K DQogIElmIHlvdSBhcmUgaW50ZXJlc3RlZCBpbiB0aGUgb25nb2luZyBsaXN0IG9mIG5ldyBmZWF0 dXJlcyBhbmQgYnVnDQogIGZpeGVzLCB0aGUgdXBkYXRlZCBbY2hhbmdlIGxvZyBmb3IgT0NhbWwg NS41LjAgaXMgYXZhaWxhYmxlIG9uDQogIEdpdEh1Yl0uDQoNCiAgSGFwcHkgaGFja2luZywgRmxv cmlhbiBBbmdlbGV0dGkgZm9yIHRoZSBPQ2FtbCB0ZWFtDQoNCg0KW29wYW0gcmVhZGluZXNzIGZv ciA1LjUuMCBtZXRhLWlzc3VlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vcGFtLXJlcG9z aXRvcnkvaXNzdWVzLzI5NDYzPg0KDQpbcHJvc3BlY3RpdmUgcmVsZWFzZSBjYWxlbmRhcl0NCjxo dHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi90cnVuay9yZWxlYXNlLWluZm8vY2Fs ZW5kYXIubWQ+DQoNCltPQ2FtbCdzIGlzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20v b2NhbWwvb2NhbWwvaXNzdWVzPg0KDQpbY2hhbmdlIGxvZyBmb3IgT0NhbWwgNS41LjAgaXMgYXZh aWxhYmxlIG9uIEdpdEh1Yl0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvb2NhbWwvYmxvYi81 LjUvQ2hhbmdlcz4NCg0KSW5zdGFsbGF0aW9uIEluc3RydWN0aW9ucw0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgVGhlIGJhc2UgY29tcGlsZXIgY2FuIGJlIGluc3RhbGxlZCBhcyBhbiBvcGFtIHN3 aXRjaCB3aXRoIHRoZQ0KICBmb2xsb3dpbmcgY29tbWFuZHMgb24gb3BhbSAyLjEgYW5kIGxhdGVy Og0KDQogIG9wYW0gdXBkYXRlIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTENCg0KICBU aGUgc291cmNlIGNvZGUgZm9yIHRoZSBhbHBoYSBpcyBhbHNvIGF2YWlsYWJsZSBhdCB0aGVzZSBh ZGRyZXNzZXM6DQoNCiAg4oCiIEdpdEh1YjogPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9vY2Ft bC9hcmNoaXZlLzUuNS4wLWFscGhhMS50YXIuZ3o+DQogIOKAoiBPQ2FtbCBhcmNoaXZlcyBhdCBJ bnJpYToNCiAgICA8aHR0cHM6Ly9jYW1sLmlucmlhLmZyL3B1Yi9kaXN0cmliL29jYW1sLTUuNS9v Y2FtbC01LjUuMH5hbHBoYTEudGFyLmd6Pg0KDQoNCkZpbmUtVHVuZWQgQ29tcGlsZXIgQ29uZmln dXJhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg SWYgeW91IHdhbnQgdG8gdHdlYWsgdGhlIGNvbmZpZ3VyYXRpb24gb2YgdGhlIGNvbXBpbGVyLCB5 b3UgY2FuIHN3aXRjaA0KICB0byB0aGUgb3B0aW9uIHZhcmlhbnQgd2l0aDoNCg0KICDilIzilIDi lIDilIDilIANCiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIHN3aXRjaCBjcmVhdGUgPHN3 aXRjaF9uYW1lPiBvY2FtbC12YXJpYW50cy41LjUuMH5hbHBoYTErb3B0aW9ucyA8b3B0aW9uX2xp c3Q+DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoZXJlIGBvcHRpb25fbGlzdCcgaXMgYSBzcGFj ZSBzZXBhcmF0ZWQgbGlzdCBvZiBgb2NhbWwtb3B0aW9uLSonDQogIHBhY2thZ2VzLiBGb3IgaW5z dGFuY2UsIGZvciBhIGZsYW1iZGEgYW5kIG5vLWZsYXQtZmxvYXQtYXJyYXkgc3dpdGNoOg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gc3dpdGNoIGNyZWF0ZSA1LjUuMH5hbHBoYTErZmxh bWJkYStuZmZhIG9jYW1sLXZhcmlhbnRzLjUuNS4wfmFscGhhMStvcHRpb25zIG9jYW1sLW9wdGlv bi1mbGFtYmRhIG9jYW1sLW9wdGlvbi1uby1mbGF0LWZsb2F0LWFycmF5DQogIOKUlOKUgOKUgOKU gOKUgA0KDQogIEFsbCBhdmFpbGFibGUgb3B0aW9ucyBjYW4gYmUgbGlzdGVkIHdpdGggYG9wYW0g c2VhcmNoIG9jYW1sLW9wdGlvbicuDQoNCg0KTm90SW5yaWFDYW1sX1N0ZC5XZW52QDAuMS4wIC0g Y3JlYXRlIFdpbmRvd3MgZW52cyBvbiBtYWNPUyBbZGswXQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tbm90aW5y aWFjYW1sLXN0ZC13ZW52LTAtMS0wLWNyZWF0ZS13aW5kb3dzLWVudnMtb24tbWFjb3MtZGswLzE3 ODU4LzE+DQoNCg0KamJlY2tmb3JkIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSXQgaXMgbXkgcGxlYXN1cmUg dG8gYW5ub3VuY2UgdGhlIGZvbGxvd2luZyBwYWNrYWdlIGZvciBbdGhlIGRrMCBidWlsZA0KICBz eXN0ZW1dIHRoYXQgY3JlYXRlcyBhIFdpbmRvd3MgZW52aXJvbm1lbnQgKCJ3ZW52IikgdXNpbmcg YSBjdXN0b20NCiAgV2luZSBidWlsZCBmb3IgbWFjT1M6DQoNCiAg4oCiIFtOb3RJbnJpYUNhbWxf U3RkLldlbnZAMC4xLjBdDQoNCiAgSGVyZSBpcyBhIHNhbXBsZSBzZXNzaW9uOg0KDQogIOKUjOKU gOKUgOKUgOKUgA0KICDilIIgIyBTaW1wbGVzdCB3YXkgdG8gaW5zdGFsbCBkazAgdG9kYXkuIFVz ZSB+Z2l0IHB1bGx+IGlmIGV4aXN0cyBhbHJlYWR5LiANCiAg4pSCICQgZ2l0IGNsb25lIC0tYnJh bmNoIFYyXzUgaHR0cHM6Ly9naXRodWIuY29tL2Rpc2t1di9kay5naXQgZGtzcmMNCiAg4pSCIA0K ICDilIIgIyBDbGVhciBvdXQgZGF0YSwgY2FjaGUgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBmcm9t IGFueSBwcmlvcg0KICDilIIgIyBleHBlcmltZW50cyAoZnJvbSB0aGUgIi0tdHJpYWwiIG9wdGlv biBzZWVuIGluIFtBTk5dIHBvc3RzKQ0KICDilIIgJCBybSAtcmYgdC8NCiAg4pSCIA0KICDilIIg IyBXaXRoIHRoZSBkZWZhdWx0IEx1YSBydWxlcyAoIi1JIGRrc3JjL2V0Yy9kay92IiksIHJ1biB0 aGUNCiAg4pSCICMgT0NhbWwgV2luZG93cyBlbnZpcm9ubWVudCBjcmVhdGlvbiBydWxlICgicnVu DQogIOKUgiAjIE5vdElucmlhQ2FtbF9TdGQuV2Vudi5DcmVhdGVAMC4xLjAiKS4gVGVsbCB0aGUg cnVsZSB0byBjcmVhdGUgdGhlDQogIOKUgiAjIHdlbnYgYXQgdGFyZ2V0L215LXdlbnYvICgiZGly PS4uLiIpIGFuZCBtYWtlIGEgbW91bnQNCiAg4pSCICMgKCJtb3VudFtdPS4uLiIpIGluc2lkZSB0 aGUgd2VudiB3aGVyZSB0aGUgVW5peCBkaXJlY3RvcnkgJFBXRCBpcw0KICDilIIgIyBtYXBwZWQg dG8gV2luZG93cyBNOlxwcm9qZWN0LiBEZXBlbmRpbmcgb24gSW50ZXJuZXQsIGV4cGVjdCAzLTQN CiAg4pSCICMgbWludXRlcyBmb3IgYSBzaW5nbGUtdGhyZWFkZWQgZG93bmxvYWQgb2YgYXJ0aWZh Y3RzICg1ODFNQikuDQogIOKUgiAkIGRrc3JjL2RrMCAtLXRyaWFsIC1JIGRrc3JjL2V0Yy9kay92 IFwNCiAg4pSCICAgICBydW4gTm90SW5yaWFDYW1sX1N0ZC5XZW52LkNyZWF0ZUAwLjEuMCBcDQog IOKUgiAgICAgZGlyPSRQV0QvdGFyZ2V0L215LXdlbnYgXA0KICDilIIgICAgICJtb3VudFtdPXR5 cGU9YmluZCxzcmM9JFBXRCxkc3Q9TTovcHJvamVjdCINCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg 4pSM4pSA4pSA4pSA4pSADQogIOKUgiAjIFRoZW4gZW50ZXIgdGhlIHdlbnYgYnkgcnVubmluZyBD b21tYW5kIFByb21wdCAoImNtZC5leGUiKS4gVHVybg0KICDilIIgIyBvZmYgV2luZSBkZWJ1ZyBt ZXNzYWdlcyAoIldJTkVERUJVRz0tYWxsIikuIFJlbWVtYmVyIHRoYXQNCiAg4pSCICMgQ3RybC1a IGlzIHRoZSBXaW5kb3dzIGVxdWl2YWxlbnQgb2YgQ3RybC1EIChFT0YpIGluIFVuaXguDQogIOKU giAkIFdJTkVERUJVRz0tYWxsIHRhcmdldC9teS13ZW52L2Jpbi9lbnRlciBjbWQuZXhlDQogIOKU giANCiAg4pSCIE1pY3Jvc29mdCBXaW5kb3dzIDEwLjAuMTkwNDUNCiAg4pSCIFo6XD4gb2NhbWxv cHQgLWNvbmZpZw0KICDilIIgWjpcPiBnY2MgLS12ZXJzaW9uDQogIOKUgiBaOlw+IGRpciBNOg0K ICDilIIgMDIvMjcvMjAyNiAxMDoyNCBBTSA8RElSPiBwcm9qZWN0DQogIOKUgiBaOlw+IG9jYW1s DQogIOKUgiBPQ2FtbCB2ZXJzaW9uIDUuNC4xDQogIOKUgiANCiAg4pSCIEVudGVyICNoZWxwOzsg Zm9yIGhlbHAuDQogIOKUgiANCiAg4pSCICMgMSsxIDs7DQogIOKUgiAtIDogaW50ID0gMg0KICDi lIIgDQogIOKUgiAjIF5aDQogIOKUgiANCiAg4pSCIFo6XD4gZWNobyBsZXQgKCkgPSBwcmludF9l bmRsaW5lICJhYmN4eXoiID4gbGV0dGVycy5tbA0KICDilIIgWjpcPiBvY2FtbG9wdCAtbyBsZXR0 ZXJzLmV4ZSBsZXR0ZXJzLm1sDQogIOKUgiBaOlw+IC5cbGV0dGVycy5leGUNCiAg4pSCIGFiY3h5 eg0KICDilIIgWjpcPiBleGl0DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIERldGFpbHM6DQoNCiAg 4oCiIE1pbkdXIHdpdGggVUNSVCBXaW5kb3dzIEFQSSBhbmQgTExWTSB0b29sY2hhaW4gKGxsdm0t bWluZ3cpIGZvciBXaW5lDQogICAgb24gdGhlIGhvc3QgKG1hY09TKS4gWDExIGhhcyBiZWVuIGRp c2FibGVkLg0KICDigKIgTWluR1cgd2l0aCBNU1ZDUlQgV2luZG93cyBBUEkgYW5kIEdOVSBjb21w aWxlciBhbmQgQnVzeUJveCBiaW5hcmllcw0KICAgICh3NjRkZXZraXQpIGluc2lkZSBXaW5kb3dz IGd1ZXN0Lg0KICDigKIgV2luZSBoYXMgZ29vZCBzdXBwb3J0IGZvciBwcm9ncmFtcyB0aGF0IHVz ZSBXaW5kb3dzIGNvbnZlbnRpb25zDQogICAgKE1TVkMsIFdpbmRvd3MgQVBJIHJhdGhlciB0aGFu IGBzeXNjYWxsJywgZXRjKS4gQnV0IHRoZXJlIGFyZQ0KICAgIGltcG9ydGFudCBwcm9ncmFtcyB0 aGF0IHdvbid0IHdvcmsgY29ycmVjdGx5IHRvZGF5OiBNU1lTMi9DeWd3aW4sDQogICAgUnVzdCB1 dXRpbHMuDQoNCiAgRW5qb3khIOKAk2pvbmFoDQoNCg0KW3RoZSBkazAgYnVpbGQgc3lzdGVtXQ0K PGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tdGhlLWRrMC1idWlsZC1zeXN0ZW0vMTc3 MDk+DQoNCltOb3RJbnJpYUNhbWxfU3RkLldlbnZAMC4xLjBdDQo8aHR0cHM6Ly9naXRodWIuY29t L2Rpc2t1di9kay9ibG9iL2EyOWU5ZGEzZjMwZGY0MWZhM2NmYzg1NWIzMjNmZGNkYTZhMTA2YzIv ZXRjL2RrL3YvTm90SW5yaWFDYW1sX1N0ZC9XZW52LnZhbHVlcy5sdWE+DQoNCg0KUnVubmluZyBS ZWFsIERvY2tlciBDb250YWluZXJzIGluIE9DYW1sIFRlc3RzDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1ydW5u aW5nLXJlYWwtZG9ja2VyLWNvbnRhaW5lcnMtaW4tb2NhbWwtdGVzdHMvMTc4NTkvMT4NCg0KDQpT YWNoaW4gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBJ4oCZdmUgYmVlbiB3b3JraW5nIG9uIGEg cHJvamVjdCBjYWxsZWQgKlt0ZXN0Y29udGFpbmVycy1vY2FtbF0qLCB3aGljaA0KICBicmluZ3Mg VGVzdGNvbnRhaW5lcnMgc3R5bGUgaW50ZWdyYXRpb24gdGVzdGluZyB0byBPQ2FtbC4NCg0KICBU aGUgaWRlYSBpcyBzaW1wbGU6DQoNCiAgICAgICAgSW5zdGVhZCBvZiBtb2NraW5nIGluZnJhc3Ry dWN0dXJlIChQb3N0Z3JlcywgUmVkaXMsIEthZmthLA0KICAgICAgICBldGMuKSwgc3RhcnQgcmVh bCBEb2NrZXIgY29udGFpbmVycyBpbnNpZGUgeW91ciB0ZXN0IHN1aXRlDQogICAgICAgIGFuZCB0 ZWFyIHRoZW0gZG93biBhdXRvbWF0aWNhbGx5Lg0KDQogIOKAlA0KDQoNClt0ZXN0Y29udGFpbmVy cy1vY2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vYmVub2Rpd2FsL3Rlc3Rjb250YWluZXJzLW9j YW1sPg0KDQpXaHk/DQrilYzilYzilYzilYwNCg0KICBJbiBtYW55IE9DYW1sIHByb2plY3RzLCBp bnRlZ3JhdGlvbiB0ZXN0cyBlaXRoZXI6DQoNCiAg4oCiIFJlbHkgb24gbW9ja3MNCg0KICDigKIg RGVwZW5kIG9uIGdsb2JhbGx5IHJ1bm5pbmcgc2VydmljZXMNCg0KICDigKIgT3IgYXJlIHNraXBw ZWQgZW50aXJlbHkgaW4gQ0kNCg0KICBNb2NrcyBhcmUgdXNlZnVsLCBidXQgdGhleSBkb27igJl0 IGNhdGNoIGlzc3VlcyBsaWtlOg0KDQogIOKAoiBTY2hlbWEgbWlzbWF0Y2hlcw0KDQogIOKAoiBD b25uZWN0aW9uIHBvb2wgYmVoYXZpb3INCg0KICDigKIgUmVhbCBuZXR3b3JraW5nIGZhaWx1cmVz DQoNCiAg4oCiIFN0YXJ0dXAgdGltaW5nIHByb2JsZW1zDQoNCiAg4oCiIE1pZ3JhdGlvbiBpc3N1 ZXMNCg0KICBTcGlubmluZyB1cCBkaXNwb3NhYmxlIGNvbnRhaW5lcnMgcGVyIHRlc3QgZ2l2ZXMg dXM6DQoNCiAg4oCiIElzb2xhdGVkIHRlc3QgZW52aXJvbm1lbnRzDQoNCiAg4oCiIE5vIHNoYXJl ZCBnbG9iYWwgc3RhdGUNCg0KICDigKIgQ0kgcmVwcm9kdWNpYmlsaXR5DQoNCiAg4oCiIFJlYWwg aW5mcmFzdHJ1Y3R1cmUgYmVoYXZpb3INCg0KDQpDdXJyZW50IFN0YXR1cw0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHByb2plY3QgaXMgY3VycmVu dGx5IGluY3ViYXRpbmcgdW5kZXIgdGhlIERvY2tlciBvcmdhbml6YXRpb24uDQoNCiAgSeKAmW0g c3RpbGwgYWN0aXZlbHkgc2hhcGluZyB0aGUgQVBJIGFuZCB3b3VsZCByZWFsbHkgYXBwcmVjaWF0 ZQ0KICBmZWVkYmFjayBmcm9tIHRoZSBPQ2FtbCBjb21tdW5pdHkgb246DQoNCiAg4oCiIEFQSSBl cmdvbm9taWNzDQoNCiAg4oCiIFByZWJ1aWx0IG1vZHVsZXMgKFBvc3RncmVzLCBSZWRpcywgZXRj LikNCg0KICDigKIgVGVzdGluZyBiZXN0IHByYWN0aWNlcyBpbiBPQ2FtbA0KDQogIElmIGFueW9u ZSBoZXJlIGhhcyBleHBlcmllbmNlIHdpdGggaW50ZWdyYXRpb24gdGVzdGluZyBwYXR0ZXJucyBp bg0KICBPQ2FtbCwgSeKAmWQgbG92ZSB0byBoZWFyIHRob3VnaHRzLg0KDQogIFRoYW5rcyENCg0K DQpJIHdyb3RlIGEgRFNMIGZvciBBSSBwZXJzb25hbGl0aWVzIGluIE9DYW1sDQrilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2ktd3Jv dGUtYS1kc2wtZm9yLWFpLXBlcnNvbmFsaXRpZXMtaW4tb2NhbWwvMTc4NjAvMT4NCg0KDQpHcmlm ZmluIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgSGkgZ3V5cywNCg0KICA8aHR0cHM6Ly9naXRodWIuY29tL0dyaWZmaW5D YW5Db2RlL0NhbGxvc3VtPg0KDQogIDxodHRwczovL3B5cGkub3JnL3Byb2plY3QvY2FsbG9zdW0t ZHNsLz4NCg0KICBJIHdhbnRlZCBhIG1vcmUgZGV0ZXJtaW5pc3RpYyB3YXkgdG8gY3JlYXRlIHBl cnNvbmFsaXRpZXMgZm9yIG15IEFJDQogIGFnZW50cyB0aGF0IHdhcyBjb25zaXN0ZW50IGluIHBy b2R1Y3Rpb24uIFRoZSBpbnRlcmVzdGluZyBjYXRjaCBiZWluZw0KICB0aGF0IHRoZSBjb21waWxl ciBoYWQgdG8gb3V0cHV0IGEgcHJvbXB0LCBhbmQgaXQgbmVlZGVkIHRvIGJlDQogIGFjY2Vzc2li bGUgZm9yIGFnZW50cyBpbiBQeXRob24uIFRoZSBzb2x1dGlvbiB3YXMgdGhpcyBEU0wsIGEgZm9y bWF0DQogIGZvciB3cml0aW5nIGRldGVybWluaXN0aWMgY2F0ZWdvcmllcyAoc2ltaWxhciB0byBZ QU1MKSB0aGF0IGNvbXBpbGUgdG8NCiAgYSBwcm9tcHQgaW5qZWN0YWJsZSBpbnRvIExhbmdjaGFp biBhZ2VudHMuIE9DYW1sIHdhcyB0aGUgbmF0dXJhbA0KICBjaG9pY2UgZHVlIHRvIGl0cyBwZXJm b3JtYW5jZSBhbmQgcHJvdmVuIGNhcGFiaWxpdGllcyB0byBob3N0DQogIGNvbXBpbGVycyAoUnVz dCBvYnYpLiBMb29raW5nIGZvciBiZXRhIHRlc3RlcnMgYW5kIGFueSBmZWVkYmFjayBpcw0KICB3 ZWxjb21lIQ0KDQoNCk91dHJlYWNoeSBNYXkgMjAyNg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlz Y3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktbWF5LTIwMjYvMTc4NjMvMT4NCg0KDQpQYXRyaWNr IEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvIGV2ZXJ5b25lLA0K DQogIFRoZSBPQ2FtbCBjb21tdW5pdHkgaGFzIHNpZ25lZCB1cCB0byBPdXRyZWFjaHkgTWF5IDIw MjYgKHNlZSBbcGFzdF0NCiAgW3Bvc3RzXSkhDQoNCiAgICAgICAgKldoYXQgaXMgT3V0cmVhY2h5 PyoNCg0KICAgICAgICBPdXRyZWFjaHkgaXMgYSBwYWlkLCByZW1vdGUgaW50ZXJuc2hpcCBwcm9n cmFtLiBPdXRyZWFjaHkNCiAgICAgICAgcHJvbW90ZXMgZGl2ZXJzaXR5IGluIG9wZW4gc291cmNl IGFuZCBvcGVuIHNjaWVuY2UuIE91cg0KICAgICAgICBpbnRlcm5zaGlwcyBhcmUgZm9yIHBlb3Bs ZSB3aG8gZmFjZSB1bmRlci1yZXByZXNlbnRhdGlvbiwNCiAgICAgICAgYW5kIGRpc2NyaW1pbmF0 aW9uIG9yIHN5c3RlbWljIGJpYXMgaW4gdGhlIHRlY2hub2xvZ3kNCiAgICAgICAgaW5kdXN0cnkg b2YgdGhlaXIgY291bnRyeS4NCg0KICBUaGUgY3VycmVudCByb3VuZCBpcyBzdGlsbCBvbmdvaW5n IHdpdGggaW50ZXJucyBtYWtpbmcgZ3JlYXQgcHJvZ3Jlc3MNCiAgd2l0aCBAdG1hdHRpbyBvbiBb UmF2ZW5dLCB3aXRoIEB4dncgb24gW1lPQ2FtbF0gYW5kIHdpdGggbXlzZWxmIG9uDQogIFtvY2Ft bC10aWZmXS4NCg0KDQpbcGFzdF0gPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFj aHktZGVjZW1iZXItMjAyNC1yb3VuZD4NCg0KW3Bvc3RzXSA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1s Lm9yZy90L291dHJlYWNoeS1qdW5lLTIwMjU+DQoNCltSYXZlbl0gPGh0dHBzOi8vcmF2ZW4tbWwu ZGV2Lz4NCg0KW1lPQ2FtbF0gPGh0dHBzOi8veW9jYW1sLmdpdGh1Yi5pby9kb2MveW9jYW1sL2lu ZGV4Lmh0bWw+DQoNCltvY2FtbC10aWZmXSA8aHR0cHM6Ly9naXRodWIuY29tL2dlb2NhbWwvb2Nh bWwtdGlmZi8+DQoNCkltcG9ydGFudCBEYXRlcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgRm9yIHRoaXMgbmV4dCByb3VuZCwgdGhlIGltcG9ydGFu dCBkYXRlcyBhcmUgYXMgZm9sbG93cyAodGhlc2UgYXJlDQogIGFsd2F5cyBzdWJqZWN0IHRvIHNv bWUgY2hhbmdlKToNCg0KICDigKIgTWFyIDEgLSBDb21tdW5pdHkgc2lnbiB1cCBkZWFkbGluZSA6 d2hpdGVfY2hlY2tfbWFyazoNCiAg4oCiIE1hciAxNCAtIFtNZW50b3IgU2lnbnVwXQ0KICDigKIg TWFyIDE3IHRvIEFwciAxNSAtIENvbnRyaWJ1dGlvbiBwZXJpb2QNCiAg4oCiIE1heSAxOCB0byBB dWcgMTcgLSBJbnRlcm5zaGlwIHBlcmlvZA0KDQogICpPdXIgbmV4dCBkZWFkbGluZSBpcyBmb3Ig bWVudG9ycyB0byBzaWduIHVwIHRvIHRoZSBPQ2FtbCBjb21tdW5pdHkqDQogICB3aXRoIGEgcHJv amVjdCBpZGVhLiBQbGVhc2UgZG8gY29uc2lkZXIgYmVpbmcgYW4gT3V0cmVhY2h5IG1lbnRvci4g SWYNCiAgIHlvdSBoYXZlIGFueSBxdWVzdGlvbnMgb3IgaWRlYXMgeW91IGNhbiBhbHdheXMgcmVh Y2ggb3V0IHRvIG1lDQogICBkaXJlY3RseS4gSWYgeW91IG5lZWQgYSByZWZyZXNoZXIgb2YgcGFz dCBwcm9qZWN0cywgdGhlcmXigJlzIGENCiAgIGRlZGljYXRlZCBwYWdlIG9uIHRoZSBPQ2FtbCB3 ZWJzaXRlOiBbT0NhbWwgT3V0cmVhY2h5DQogICBJbnRlcm5zaGlwc10uIEZlZWwgZnJlZSB0byBk aXNjdXNzIGlkZWFzIG9uIHRoaXMgdGhyZWFkIHRvbyENCg0KICBUaGUgT0NhbWwgY29tbXVuaXR5 IGlzIGN1cnJlbnRseSBhYmxlIHRvIGZpbmFuY2lhbGx5IHN1cHBvcnQgT3V0cmVhY2h5DQogIGlu dGVybnNoaXBzIHRoYW5rcyB0byB0aGUgZ2VuZXJvdXMgc3VwcG9ydCBvZiBbVGFyaWRlc10gYW5k DQogIFtKYW5lc3RyZWV0XS4gVGhpcyBpbmNsdWRlcyBiZWluZyBhYmxlIHRvIGZ1bmQgbWVudG9y cyBhcyB3ZWxsLg0KDQogIFRoYW5rcyEgOmNhbWVsOg0KDQoNCltNZW50b3IgU2lnbnVwXSA8aHR0 cHM6Ly93d3cub3V0cmVhY2h5Lm9yZy9jb21tdW5pdGllcy9jZnAvb2NhbWwvPg0KDQpbT0NhbWwg T3V0cmVhY2h5IEludGVybnNoaXBzXSA8aHR0cHM6Ly9vY2FtbC5vcmcvb3V0cmVhY2h5Pg0KDQpb VGFyaWRlc10gPGh0dHBzOi8vdGFyaWRlcy5jb20+DQoNCltKYW5lc3RyZWV0XSA8aHR0cHM6Ly93 d3cuamFuZXN0cmVldC5jb20+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2Fn ZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUg YXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlv dSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vi c2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltz ZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+ DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0K W1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBh L2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBv bW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of February 24 to March = 03, 2026.

    OCaml Platform Newsletter: November 2025 to January 2026

    Sabine Schmaltz announced

    Welcome to the seventeenth edition of the OCaml Platform newsletter!

    In this November 2025 to January 2026 edition, we are excited to bring you = the latest on the OCaml Platform, continuing our tradition of highlighting = recent developments as seen in previous editions. To understand the direction we're = headed, especially regarding development workflows and user experience impr= ovements, check out our roadmap.

    You can subscribe to this newsletter on LinkedIn!

    Highlights:

    • opam 2.5.0 Released: Major release featuring incremental opam fi= le loading for up to 70% faster opam update, improved shell in= tegration, and better macOS sandbox support
    • Relocatable OCaml Merged: The final piece of the relocatable OCa= ml puzzle was merged in December, enabling opam to clone switches instead o= f recompiling them. This will be available in the first alpha release of OC= aml 5.5
    • Dune 3.21.0: Large release with dozens of fixes, improvements, a= nd new features including OxCaml compiler support and copy-on-write file op= erations
    • Enhanced Editor Support: OCaml-LSP 1.25.0 adds .mlx= file support with formatting, diagnostics, and code actions, plus new cust= om requests
    • Merlin 5.6.1-504: Performance optimizations, smarter signature h= elp, and fixed completion for inlined record labels
    • opam-publish 2.7.1: Fixes for GitHub API token permissions
    • dune-release 2.2.0: Full compatibility with cmdliner 2.0.0
    • opam-repository Archival: January 1, 2026 archival run removed 3= ,264 package versions to maintain repository sustainability

    Backstage OCaml:

    Stable Releases:

    Unstable Releases:

    OCaml Compiler

    • Relocatable OCaml Merged

      In December 2025, the final piece of the Relocatable OCaml puzzle was me= rged, enabling opam to clone switches instead of recompiling them. This fea= ture will be available in the first alpha release of OCaml 5.5.

      What Relocatable OCaml Enables:

      This feature allows the OCaml compiler and its associated tools to be moved= to different filesystem locations after installation without breaking func= tionality. Key benefits include:

      • Binary distributions that work regardless of installation path
      • Improved flexibility for package managers organizing OCaml installation= s
      • Bundling of specific OCaml versions by developer tools without path con= flicts
      • Simplified cross-platform distribution

      The implementation is the culmination of work by David Allsopp, with review= from Samuel Hym, Jonah Beckford, and others. See the announcement on Discuss and = the merged PRs (<= a href=3D"https://github.com/ocaml/ocaml/pull/14244">#14244, #14245, #14246, #14247) for technical details.

    Build System

    Package Management

    Editor Tools

    • OCaml-LSP Server

      OCaml-L= SP 1.25.0 (December 20, 2025) introduces support for .mlx = files and new custom requests.

      Features:

      • .mlx Support: Added support for .mlx f= iles, including diagnostics, code actions, hover, and formatting via = ocamlformat-mlx
      • New Custom Requests: Added typeExpression, lo= cate, and phrase requests to the server
      • Code-Lens Configuration: Code-lens for nested let b= indings is now configurable

      Fixes:

      • The server now falls back to .merlin configuration if a dune-project file is missing, provided dot-merlin-reader is installed
      • Improved precision of timestamps for collected metrics
    • Merlin

      Merlin= 5.6.1-504 (December 20, 2025) brings performance optimizations and imp= roved stability.

      Key Improvements:

      • Smarter Signature Help: Now triggers correctly on unfinished let ... in bindings and no longer appears redundantly on function= names
      • More Reliable Completion: Fixed issues with completion for inlin= ed record labels
      • Improved Performance: Optimized buffer indexing and path calcula= tions
      • Bug Fixes: Resolved a bug where the document comman= d concatenated labels and variants incorrectly

      OCaml LSP Server maintained by: Ulysse G=C3=A9rard (@voodoos, Taride= s), Xavier Van de Woestyne (@xvw, Tarides), Rudi Grinberg (@rgrinberg, Jane= Street)

      Merlin maintained by: Ulysse G=C3=A9rard (@voodoos, Tarides), Xavier= Van de Woestyne (@xvw, Tarides), Muluh Godson (@PizieDust, Tarides)

    • OCaml-eglot

      We have drastically modified the xref backend (allowing naviga= tion from definition to definition) to make it more suitable for OCaml.

      In addition, we added the ability to annotate the type of an enclosing acti= ve_ (used with the ocaml-eglot-type-enclosing command) or simp= ly to type the selection.

      These updates have been merged into main, making them availabl= e via a MELPA update.

      ocaml-eglot maintained by: Xavier Van de Woestyne (@xvw, Tarides)

    Platform Infrastructure

    • OCaml Infrastructure: How the opam-repository = Works

      The November 5, 2025 article on the opam-repository provides an i= n-depth look at this critical piece of OCaml infrastructure. The opam repos= itory serves as the central package registry for the OCaml ecosystem, hosti= ng over 4,500 packages. It relies on dedicated volunteer maintainers who re= view every submission.

      As always, we encourage feedback and contributions from the community as we= continue to improve the OCaml Platform ecosystem.

    Announcing the first release of Alice, a radical OCaml build s= ystem

    Continuing this thread, Steve Sherratt announced

    Announcing the release of Alice v0.5.0 which introduces parallel builds.

    mnet, a new TCP/IP stack for unikernels in OCaml

    Calascibetta Romain announced

    I am pleased to announce a series of releases for developing unikernels wit= h OCaml 5 and Miou. Afte= r extensive testing, we are now able to offer a new TCP/IPv4 and IPv6 stack= in OCaml that aims to replace mirage-tcpip and pave the way for direct-style unikernel develop= ment. Below is an overview of the libraries we have built to make this poss= ible.

    mkernel

    mkernel is a small library that provides the essentials for de= veloping a unikernel targeting S= olo5 or Unikraft. Its purpose is = to expose hypercalls (the unikernel equivalent of syscalls) so that your ap= plication can interact with network and block devices.

    We recommend reading the mkernel documentation to u= nderstand the key concepts behind unikernels (hypercalls, devices, tenders,= etc.). The slides we presented at the last MirageOS retreat are also helpful for understanding o= ur new workflow. Compiling a unikernel now only requires dune = and vendored libraries. We have therefore chosen not to resolve dependencie= s automatically (as op= am-monorepo did) or to impose them (as the mirage tool doe= s), giving developers full freedom to build their unikernels as they see fi= t. In particular, this makes it straightforward to use ppx rewriters, which= was difficult or impossible with the mirage tool.

    • A new workflow and targets

      This release is experimental: Xen is not yet supported, and Unikraft suppor= t is partial. However, both platforms are on our roadmap, so if you are int= erested in them, please let us know! We are also developing tooling to stre= amline the workflow, with the guiding principle that these tools should nev= er dictate which dependencies your unikernel uses or which build system you= choose.

    mnet

    mnet is the centerpiece of this release. It is designed to rep= lace (and improve upon) = mirage-tcpip by offering a direct-style API built on effects. The API d= eliberately mirrors the Unix socket interface: connect, listen, accept, read, w= rite, and close all behave the way you would expect.

    Here is a small example of an echo server:

    let run (ipv4, gateway=
    , ipv6) =3D
      Mkernel.(run [ =
    rng; Mnet.stack <=
    span style=3D"color: #444fcf; font-weight: bold;">~name:"service" ?gateway ~ipv6 ipv4 ])
      @@ fun rng (=
    daemon, tcp, udp) ->
      let@ () =3D fun () -> Mnet.kill daemon in
      let@ () =3D fun () -> Mirage_crypto_rng_mkernel.kill rng in
      let listen =3D Mnet.TCP.listen tcp 9000 in
      let flow =3D Mnet.TCP.accept tcp listen in
      let buf =3D Bytes.create 4096 in
      let rec echo () =3D
        let len =3D Mnet.TCP.read flow buf in
        if len > 0=
     then begin
          Mnet.TCP.wr=
    ite flow (Bytes.s=
    ub_string buf 0 len);
          echo ()
        end
      in
      let@ () =3D fun () -> Mnet.TCP.close flow in
      echo ()
    

    TLS support (via ocaml-tls= ) is already available, allowing you to establish secure connections wi= th your unikernel. DNS resolution (via ocaml-dns) and the Happy Eyeballs algorithm are also included, so that a = unikernel can resolve hostnames and connect to remote services over both IP= v4 and IPv6.

    A short tutorial walks y= ou through creating an echo server as a unikernel, similar to what we already offer for Mi= ou. For the curious, an article about IPv4 and Miou is available here.

    Beyond the move to effects for all scheduling, I would like to give special= thanks to:

    • Edwin T=C3=B6r=C3=B6k for proposing fixes to prevent denial-of-service = attacks, which have been integrated into mnet (in particular for ARP).
    • Nicolas Ojeda B=C3=A4r for contributing an IPv6 implementation that we = adopted and improved (caches, packet fragmentation and reassembly, etc.)
    • Reynir for patiently debugging PCAP traces
    • Hannes for sharing his deep knowledge of the TCP protocol and its interactions with IPv4 and IPv6

    As well as others who participated in the development of mnet = in one way or another.

    • Developing and deploying unikernels

      This library also marks a turning point in our approach to unikernels. We n= o longer treat a regular OCaml application as something that can be transpa= rently turned into a unikernel. Developing a unikernel now means developing= a unikernel from the start. In our experience, trying to retrofit an exist= ing application into a unikernel was neither practical nor worthwhile.

      Our tutorial therefore covers both the development and deployment of uniker= nels. On the deployment side, we also recommend exploring Albatross.

    utcp

    utcp is a p= ure OCaml implementation of the TCP protocol, used internally by mnet= to handle TCP connections. The implementation is based on a state m= achine and performs no I/O itself, making it easy to test and reason about.

    utcp covers the full TCP lifecycle: the three-way handshake, r= eliable in-order data delivery with retransmissions, flow control, congesti= on control, and connection teardown. It has been tested extensively through= our end-to-end unikernel tests (a simple echo server and client, and a <= a href=3D"https://github.com/robur-coop/mnet/tree/main/unikernels/resolver"= >DNS resolver).

    • Unikernels and proofs

      utcp also reflects our ambition to incorporate, as time permit= s, proof-based implementations. Other examples include:

      • miou with its priority queue (see the VOCAL project)
      • mirage-crypto with certain cryptographic primitives (see the fiat project)
      • and now utcp (see n= etsem)

      This effort is still in its early stages, but we welcome improvements and c= ollaborations in this area.

    mhttp

    To reach a wider audience, we also provide an HTTP protocol implementation = for unikernels, building on the work we started (and currently use in produ= ction) with httpcats.

    mhttp is essentially a unikernel-oriented counterpart to httpcats, using = ocaml-h1 and ocaml-h= 2 as its HTTP/1.1 and H2 backends.

    • Ecosystem and composability

      Although mhttp is a small project, it illustrates a broader pr= inciple behind our cooperative's approach to library development. As we hav= e stated before, everything we build is designed to be reus= able with schedulers other than Miou and in contexts other than unikernels.= Regardless of which scheduler one prefers, we believe in a pragmatic, coop= erative approach to contributing to the community.

      Our primary focus remains unikernel development, but years of experience bu= ilding protocol and format libraries have taught us that keeping them sched= uler-agnostic is in everyone's best interest, for maintainability, testabil= ity, and reliability alike. Wherever possible, you will find a general-purp= ose library alongside its unikernel counterpart: httpcats and = mhttp are one such pair.

    Vifu

    As previously announced, we have developed a w= eb framework for OCaml 5 called vif, which we use in production for our builds.robur.coop website (we recommend the tutorial presented at FUN OCaml 2025).

    vif now has a unikernel variant: vifu. It offers = nearly the same interface as vif (except for static file manag= ement), making it possible to build websites entirely in OCaml. Here is a s= mall unikernel that displays "Hello World!":

    let hello_world req _s=
    erver () =3D
      let open Vifu.Response.Syntax in
      let* () =3D Vifu.Response.with_t=
    ext req "Hello World!\n" in
      Vifu.Response.r=
    espond `OK
    
    let run (ipv4, gateway, ipv6) =3D
      Mkernel.(run [ =
    rng; Mnet.stack <=
    span style=3D"color: #444fcf; font-weight: bold;">~name:"service" ?gateway ~ipv6 ipv4 ])
      @@ fun rng (=
    daemon, tcp, udp) ->
      let@ () =3D fun () -> Mnet.kill daemon in
      let@ () =3D fun () -> Mirage_crypto_rng_mkernel.kill rng in
      let cfg =3D Vifu.Config.v 80 in
      let routes =3D Vifu.[ get (rel /?? any) --> hello_world ] in
      Vifu.run ~cfg t=
    cp routes ()
    

    disclaimer: If you would like to use vifu, please note = that although a recent release has been made, one final fix is still needed= to compile a unikernel with this library (to avoid pulling in the un= ix module). We recommend pinning vifu for now.

    Unikernels

    Behind all these libraries, there are concrete projects that we would like = to share with you:

    Conclusion

    After several years of work, we are now able to develop unikernels with OCa= ml 5 in earnest. We hope that our new workflow will be of interest to the c= ommunity and that these libraries will be a useful contribution to the OCam= l ecosystem.

    If you would like to try it out, we recommend starting with the mnet tutorial and the mkerne= l documentation. Feel free to open issues or reach out to us if you hav= e any questions!

    Experiment: format-line

    Emile Trotignon announced

    I made this little experiment a while back: https://github.com/ahrefs/format-line

    The idea is to provide a complement to ocp-indent to decide which token sho= uld be separated by whitespace and which should not. For now it is based on= ly on lexing information, which make the code simple but also does not alwa= ys provide enough information to have a nice formatting.

    An idea of the output can be read here: https://github.com/ahrefs/format-line= /blob/master/test/run.t

    The project itself is formatted with ocamlformat, and in the there is a dif= f of what this changes compared to ocamlformat, on the main source file.

    I think this approach could be improved by having a hybrid ast-token stream= datastructure. Something where you work on a stream of token but you can q= uery the AST context of a given token.

    What do you think ?

    Caml in the Capital - Registrations Open!

    Continuing this thread, Sacha Ayoun announced

    And here is the l= ink to the recording!

    We'd like to thank our speakers Jeremy and Nick again, as well as the ~30 a= ttendees to the meetup! It was great having you, and we hope to see you aga= in next time :)

    Experimental tools for migrating from Lwt to Eio

    Jules announced

    We developed tools to help us migrate Ocsigen libraries and applications to= direct-style concurrency and we are happy to share them.

    There are 4 independent tools for different purposes:

    • Replacing every uses of lwt_ppx with Lwt func= tion calls (e.g. replacing let%lwt ... in with let* ... = in). This is purely syntactic and allows you to easily remove a PPX. It handles = inserting open Lwt.Syntax at the top of the file.
    • Warning about occurrences of let _ =3D ... and ignor= e ..., which make the next tools less reliable. These are called =E2=80=9Cimplicit fork=E2=80=9D because code run concurren= tly if the ignored value is an Lwt thread. This requires an explicit call t= o Fiber.fork with Eio.
    • Migrating uses of Lwt_log to Logs. It was used on ocsigenserver for example. At this point we generate code working as before and did not introduce a de= pendency on Eio.
    • Migrating uses of Lwt to Eio. It rewrites code wr= itten in monadic style into direct-style, for example this code:

      let _ =3D
        let* x =3D f 1 in
        let+ y =3D f 2 in
        Lwt.bind (f 3) =
      (fun z ->
          Lwt.return (x=
       + y + z))
      

      is rewritten to:

      let _ =3D
        let x =3D f 1 in
        let y =3D f 2 in
        let z =3D f 3 in
        x + y + z
      

      It also rewrite Lwt function calls to their equivalent in Eio and handles many IO operations.

      Unfortunately, this tool doesn=E2=80=99t generate fully equivalent code and= requires manual modifications. Comments are inserted in many places where = intervention is needed.

      An example of generated incorrect code is:

      let _ =3D
        let a =3D operation_1 () in
        let* b =3D operation_2 () in
        let* a =3D a in
        Lwt.return (a +=
       b)
      

      which is rewritten into:

      let _ =3D
        let a =3D operation_1 () in
        let b =3D operation_2 () in
        let a =3D a in
        a + b
      

      This is incorrect because operation_1 and operation_2 are now sequential but were concurrent before. This is a case of an im= plicit fork that cannot easily be detected. The correct transformation woul= d be:

      let _ =3D
        let a, b =3D=
       Eio.Fiber.pair o=
      peration_1 operation_2 i=
      n
        a + b
      

      We could achieve the migration on eliom and ocsigenserver

    All the tools use OCamlformat under the hood to generate the code. This has= the inconvenient of enforcing the use of OCamlformat before using them as = they will reformat the entire codebase.

    The last two tools use Merlin under the hood to locate uses of Lwt functions in the source files. This works by reading Merlin=E2=80=99s = ocaml-index files built by Dune to extract the location in the source files= that we need.

    Currently, it only supports Eio as a backend but can easily be adapted to other direct-style concurrency librar= ies.

    This work was made possible thanks to the support of the NGI Zero Core fund through the Nlnet foundation, and is perfomed by Tarides.

    First alpha release of OCaml 5.5.0

    octachron announced

    Four months after the release of OCaml 5.4.0, the set of new features for t= he future version 5.5.0 of OCaml has been frozen. We are thus happy to anno= unce the first alpha release for OCaml 5.5.0.

    This alpha version is here to help fellow hackers join us early in our bug = hunting and opam ecosystem fixing fun (see below for the installation instr= uctions). More information about the release process is available at https://github.com/ocaml/ocaml/blob/trunk/release-info/introduction.md.

    The progress on stabilising the ecosystem is tracked on the opam readiness for 5.5.0= meta-issue .

    There is also a companion alpha opam repository available for this alpha re= lease

    $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-reposit=
    ory.git
    

    which contains in-progress alpha releases of opam packages that are being u= pdated for OCaml 5.5.0 .

    The full release is expected between May and June. There are more informati= on available in the prospective release calendar.

    If you find any bugs, please report them on the OCaml's issue tracker.

    If you are interested in the ongoing list of new features and bug fixes, the updated change = log for OCaml 5.5.0 is available on GitHub.

    Happy hacking, Florian Angeletti for the OCaml team

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update opam switch create 5.5.0~alpha1

    The source code for the alpha is also available at these addresses:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.5.0~alpha1+options =
    <option_list>
    

    where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

    opam switch create 5.5.0~alpha1+flambda+nffa ocaml-variants.5.5.0~alpha1+op=
    tions ocaml-option-flambda ocaml-option-no-flat-float-array
    

    All available options can be listed with opam search ocaml-option.

    NotInriaCaml_Std.Wenv@0.1.0 - create Windows envs on macOS [dk= 0]

    jbeckford announced

    It is my pleasure to announce the following package for the dk0 build system that creates a Windows environment ("wenv") using a custom Wine build for= macOS:

    Here is a sample session:

    # Simplest way to install dk0 today. Use ~git pull~ if exists already.=20
    $ git clone --branch V2_5 https://github.com/diskuv/dk.git dksrc
    
    # Clear out data, cache and intermediate files from any prior
    # experiments (from the "--trial" option seen in [ANN] posts)
    $ rm -rf t/
    
    # With the default Lua rules ("-I dksrc/etc/dk/v"), run the
    # OCaml Windows environment creation rule ("run
    # NotInriaCaml_Std.Wenv.Create@0.1.0"). Tell the rule to create the
    # wenv at target/my-wenv/ ("dir=3D...") and make a mount
    # ("mount[]=3D...") inside the wenv where the Unix directory $PWD is
    # mapped to Windows M:\project. Depending on Internet, expect 3-4
    # minutes for a single-threaded download of artifacts (581MB).
    $ dksrc/dk0 --trial -I dksrc/etc/dk/v \
        run NotInriaCaml_Std.Wenv.Create@0.1.0 \
        dir=3D$PWD/target/my-wenv \
        "mount[]=3Dtype=3Dbind,src=3D$PWD,dst=3DM:/project"
    
    # Then enter the wenv by running Command Prompt ("cmd.exe"). Turn
    # off Wine debug messages ("WINEDEBUG=3D-all"). Remember that
    # Ctrl-Z is the Windows equivalent of Ctrl-D (EOF) in Unix.
    $ WINEDEBUG=3D-all target/my-wenv/bin/enter cmd.exe
    
    Microsoft Windows 10.0.19045
    Z:\> ocamlopt -config
    Z:\> gcc --version
    Z:\> dir M:
    02/27/2026 10:24 AM <DIR> project
    Z:\> ocaml
    OCaml version 5.4.1
    
    Enter #help;; for help.
    
    # 1+1 ;;
    - : int =3D 2
    
    # ^Z
    
    Z:\> echo let () =3D print_endline "abcxyz" > letters.ml
    Z:\> ocamlopt -o letters.exe letters.ml
    Z:\> .\letters.exe
    abcxyz
    Z:\> exit
    

    Details:

    • MinGW with UCRT Windows API and LLVM toolchain (llvm-mingw) for Wine on= the host (macOS). X11 has been disabled.
    • MinGW with MSVCRT Windows API and GNU compiler and BusyBox binaries (w6= 4devkit) inside Windows guest.
    • Wine has good support for programs that use Windows conventions (MSVC, = Windows API rather than syscall, etc). But there are important= programs that won't work correctly today: MSYS2/Cygwin, Rust uutils.

    Enjoy! –jonah

    Running Real Docker Containers in OCaml Tests

    Sachin announced

    Hi everyone,

    I=E2=80=99ve been working on a project called testcontainers-ocaml, which bri= ngs Testcontainers style integration testing to OCaml.

    The idea is simple:

    Instead of mocking infrastructure (Postgres, Redis, Kafka, etc.), start rea= l Docker containers inside your test suite and tear them down automatically.

    Why?

    In many OCaml projects, integration tests either:

    • Rely on mocks
    • Depend on globally running services
    • Or are skipped entirely in CI

    Mocks are useful, but they don=E2=80=99t catch issues like:

    • Schema mismatches
    • Connection pool behavior
    • Real networking failures
    • Startup timing problems
    • Migration issues

    Spinning up disposable containers per test gives us:

    • Isolated test environments
    • No shared global state
    • CI reproducibility
    • Real infrastructure behavior

    Current Status

    The project is currently incubating under the Docker organization.

    I=E2=80=99m still actively shaping the API and would really appreciate feed= back from the OCaml community on:

    • API ergonomics
    • Prebuilt modules (Postgres, Redis, etc.)
    • Testing best practices in OCaml

    If anyone here has experience with integration testing patterns in OCaml, I= =E2=80=99d love to hear thoughts.

    Thanks!

    I wrote a DSL for AI personalities in OCaml

    Griffin announced

    Hi guys,

    https://github.com/G= riffinCanCode/Callosum

    https://pypi.org/project= /callosum-dsl/

    I wanted a more deterministic way to create personalities for my AI agents = that was consistent in production. The interesting catch being that the com= piler had to output a prompt, and it needed to be accessible for agents in = Python. The solution was this DSL, a format for writing deterministic categ= ories (similar to YAML) that compile to a prompt injectable into Langchain = agents. OCaml was the natural choice due to its performance and proven capa= bilities to host compilers (Rust obv). Looking for beta testers and any fee= dback is welcome!

    Outreachy May 2026

    Patrick Ferris announced

    Hello everyone,

    The OCaml community has signed up to Outreachy May 2026 (see past posts)!

    What is Outreachy?

    Outreachy is a paid, remote internship program. Outreachy promotes diversit= y in open source and open science. Our internships are for people who face = under-representation, and discrimination or systemic bias in the technology= industry of their country.

    The current round is still ongoing with interns making great progress with = @tmattio on Raven, with @xvw on YOCaml and with m= yself on ocaml-tiff.

    Important Dates

    For this next round, the important dates are as follows (these are always s= ubject to some change):

    • Mar 1 - Community sign up deadline :white_check_mark:
    • Mar 14 - M= entor Signup
    • Mar 17 to Apr 15 - Contribution period
    • May 18 to Aug 17 - Internship period

    Our next deadline is for mentors to sign up to the OCaml community w= ith a project idea. Please do consider being an Outreachy mentor. If you ha= ve any questions or ideas you can always reach out to me directly. If you n= eed a refresher of past projects, there=E2=80=99s a dedicated page on the O= Caml website: OCaml Outreachy Inter= nships. Feel free to discuss ideas on this thread too!=20

    The OCaml community is currently able to financially support Outreachy inte= rnships thanks to the generous support of T= arides and Janestreet. This = includes being able to fund mentors as well.

    Thanks! :camel:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=vxR9nWoe; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 9772B400A7 for ; Tue, 10 Mar 2026 13:30:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=NKA+njg8bFSJOCAYrHz0ROzmYH/kqw36lgvec9uNOhY=; b=vxR9nWoesMnaI2PzOGCNGTMrahYGaSDo7LgKLhTKGtj0XKxUDT0GyncT vb8+V9w8JKylQ2RVQwnDRv0ypbdA4Qid26by2LUpvJB11+GOxtGTrorZv eHJs9oX3WYbxG6hb/Cvco5dePBy54wByX40vHYs1AqmjL571lVsZAfFs/ U=; X-CSE-ConnectionGUID: 8CDo8YS+QMuoUlIcIWXuIQ== X-CSE-MsgGUID: Z0ZlRgeMRyqeQyChHMFezg== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,112,1770591600"; d="scan'208,217";a="267101812" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 10 Mar 2026 14:30:21 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id D1FF9833F7; Tue, 10 Mar 2026 14:30:20 +0100 (CET) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 5FDF382DE4 for ; Tue, 10 Mar 2026 14:30:13 +0100 (CET) X-CSE-ConnectionGUID: /A96WS1iSeCLgWAoJpRSmA== X-CSE-MsgGUID: P28LhzoxTlmXRba+L4QL9Q== IronPort-SDR: 69b01ce5_coY/m9R4SKtYsXzFYw35otMRugKxkt2gcm5RZkXJPelrAPI 4kIM7TDik4Ps9SzD9EScmfW7zjJusE1lbghj02g== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FnAwB9G7BphSIeaIFagRWDAVspGgFsXzMHCElJCoQFg?= =?us-ascii?q?0+NQWScSIFpgUIYIAEDAQ0uARsEAQIEAQEDAQIBhDpGAhY5FYw9Ah8GAQQ0E?= =?us-ascii?q?wECBAEBAQEDAgMBAQEBAQEBAQENAQEFAQEBAgEBAgQGAQIQAQEBAUBJhk8Ng?= =?us-ascii?q?kUZOHGBJQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQIEBAQBMytJChMBATgYIwMUBwMCBA0BNRcBCQkaghBYAYIgAgJPAwUMB?= =?us-ascii?q?pB5m0R6gTKBAYIMAQEGgQg+AwIJAgUPL9oRgWcJgU2Fb4JKGwEFJUlsAQKET?= =?us-ascii?q?YQ/Jw+BVUSBSoI9B2+BUAF5FwEBAQEBgSMYAQEGAkUJgyWCaYImehQdgVyFR?= =?us-ascii?q?QaBTIIIVgUgPYZQgURLMywBVRMXCwcFXoEIAyovLW4yHYEjPhczWBsHBYUfD?= =?us-ascii?q?4hygWKBE4MeAwttPTcUG45PQxk+gWcOQCkHGxQpBQETGCA4OVcDRws6kwIqj?= =?us-ascii?q?1yhcYEKNAeEH4FeBgyJCIEmlgeEBIFXizyHApJSIphkIolegSYJgW9rTJUUI?= =?us-ascii?q?BmFH4F/I4FcMxowQw0RgkkJRhwPV5AbgS8tgRGDGjvEEkI1AQEBATgCBwEKA?= =?us-ascii?q?QEDCYViAQGMOoFLAQE?= IronPort-PHdr: A9a23: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 A== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:MwDnh6DAlUWLOPHlHemT55DYdb4zR+YMi2TDtnoBKyC9F/bz+v xG88576faZslossRIb6LO90cu7IU80nKQdieIs1NyZMjUO1lHGEKhSqaPchxfgFyf9+uM179 YET4FOTPvqAxxfhcb+iTPIdOrILeP3lJyVuQ== X-Talos-CUID: 9a23:3cr5nG2Z50j5FpbtxRgq+rxfXel0LELmlXbrLmScBllAT5+Nc2SV0fYx X-Talos-MUID: 9a23:n2W7OghA221Bt/uIVAvjAcMpDJ04x6S8D1AxlZA2gcONdggsAhPMtWHi X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,112,1770591600"; d="scan'208,217";a="267101697" X-MGA-submission: =?us-ascii?q?MDGqJMvbag1LNMtjveOpQc8X5QVW42uah+ubjA?= =?us-ascii?q?UC/pgyqHWpFUrl+Il+JIS6wjjfLFTx3H1lm2vQo2YHYysXWf8/u/udl3?= =?us-ascii?q?2A/J0ijBgd9Tdxj4NU+p7O5UfGgX4vMZvLvGNRplAotu4b6E0pD6LMLy?= =?us-ascii?q?cMOncw8JFyTiYTc4HTlkFXqQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 10 Mar 2026 14:30:12 +0100 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5141E1A3E6; Tue, 10 Mar 2026 14:30:12 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 10 Mar 2026 14:30:12 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 10 14:30:12 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.491497, queueID=6A9B41A412 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19468 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMDMgdG8gMTAsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkVsaW9tIDEy OiBDbGllbnQtc2VydmVyIGFwcGxpY2F0aW9ucyBpbiBXZWIgQXNzZW1ibHkNCm1lbGFuZ2Utc3Ry OiBTdHIgbW9kdWxlIGZvciBNZWxhbmdlDQpPdXRyZWFjaHkgTWF5IDIwMjYNClJlc2VhcmNoIGVu Z2luZWVyIG9yIHBvc3Rkb2MgcG9zaXRpb24gYXQgSW5yaWEgUmVubmVzOiBzdGF0aWMgYW5hbHlz aXMgb2YgT0NhbWwgcHJvZ3JhbXMNClJGQzogbXVsdGlmaWxlIEFURCBkZWZpbml0aW9uIHN1cHBv cnQgdmlhIGltcG9ydCBzdGF0ZW1lbnRzDQpPbGQgQ1dODQoNCg0KRWxpb20gMTI6IENsaWVudC1z ZXJ2ZXIgYXBwbGljYXRpb25zIGluIFdlYiBBc3NlbWJseQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9lbGlvbS0xMi1jbGllbnQtc2VydmVyLWFwcGxpY2F0aW9ucy1pbi13ZWItYXNz ZW1ibHkvMTc4NzEvMT4NCg0KDQpWaW5jZW50IEJhbGF0IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA DQoNCiAgT24gYmVoYWxmIG9mIHRoZSBPY3NpZ2VuIHRlYW0sIEkgYW0gcGxlYXNlZCB0byBhbm5v dW5jZSB0aGUgcmVsZWFzZSBvZg0KICBFbGlvbSAxMi4gRm9sbG93aW5nIG91ciByZWNlbnQgcmVs ZWFzZSBvZiB3YXNtX29mX29jYW1sLCB0aGlzDQogIHZlcnNpb24ncyBtYWluIGZlYXR1cmUgaXMg ZnVsbCBzdXBwb3J0IGZvciBXZWIgQXNzZW1ibHkuIEVsaW9tDQogIGFwcGxpY2F0aW9ucyBhcmUg bm93IHNlcnZlZCBieSBkZWZhdWx0IGFzIFdlYiBBc3NlbWJseSBwcm9ncmFtcyAod2l0aA0KICBh IEphdmFTY3JpcHQgZmFsbGJhY2spLiBUaGUgZGVmYXVsdCBidWlsZCBzeXN0ZW0gaGFzIGJlZW4g YWRhcHRlZA0KICBhY2NvcmRpbmdseS4gVGhlIE9jc2lnZW4gU3RhcnQgdGVtcGxhdGUgaGFzIGFs c28gYmVlbiB1cGRhdGVkLg0KDQogIFRoZSBuZXcgdmVyc2lvbiBhcmUgYXZhaWxhYmxlIGluIG9w YW0uDQoNCiAgSWYgeW91IHdhbnQgdG8gZ2l2ZSBpdCBhIHRyeSwgcGxlYXNlIHJlYWQgdGhlIFtt YWluIGRvY3VtZW50YXRpb24NCiAgcGFnZV0gZmlyc3QuDQoNCiAgWW91IGNhbiBzZWUgYSBydW5u aW5nIGV4YW1wbGUgYXBwIFtoZXJlXS4NCg0KDQpbbWFpbiBkb2N1bWVudGF0aW9uIHBhZ2VdDQo8 aHR0cHM6Ly9vY3NpZ2VuLm9yZy90dXRvL2xhdGVzdC9tYW51YWwvYmFzaWNzPg0KDQpbaGVyZV0g PGh0dHBzOi8vb2NzaWdlbi0xLmlucmlhLmZyL29jc2lnZW4tc3RhcnQvZGVtby8+DQoNCg0KbWVs YW5nZS1zdHI6IFN0ciBtb2R1bGUgZm9yIE1lbGFuZ2UNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLW1lbGFuZ2Utc3RyLXN0ci1tb2R1bGUtZm9yLW1lbGFuZ2UvMTc4 NzcvMT4NCg0KDQpEYXZpZCBTYW5jaG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbbWVsYW5n ZS1zdHJdIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIE9DYW1sJ3MgYFN0cicgbW9kdWxlIGZvcg0K ICBNZWxhbmdlLCB1c2luZyBKYXZhU2NyaXB0J3MgUmVnRXhwIGFzIHRoZSBiYWNrZW5kLg0KDQog IE9DYW1sJ3MgYFN0cicgbGlicmFyeSBwcm92aWRlcyByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hp bmcsIHNlYXJjaGluZywNCiAgcmVwbGFjZW1lbnQsIGFuZCBzcGxpdHRpbmcuIEl0J3MgcGFydCBv ZiB0aGUgc3RhbmRhcmQgZGlzdHJpYnV0aW9uIGFuZA0KICB3aWRlbHkgdXNlZC4gSG93ZXZlciwg YFN0cicgaXMgaW1wbGVtZW50ZWQgaW4gQywgd2hpY2ggbWVhbnMgaXQncw0KICB1bmF2YWlsYWJs ZSB3aGVuIGNvbXBpbGluZyBPQ2FtbCB0byBKYXZhU2NyaXB0IHZpYSBNZWxhbmdlLg0KDQogIFRo ZSBtb2R1bGUgaXMgZXhwb3NlZCBhcyBgU3RyJyAobm90IGBNZWxhbmdlX3N0ci5TdHInKSwgc28g ZXhpc3RpbmcNCiAgY29kZSB0aGF0IG9wZW5zIG9yIHJlZmVyZW5jZXMgYFN0cicgd29ya3Mgd2l0 aG91dCBjaGFuZ2VzLg0KDQogICpSZXBvc2l0b3J5KjogPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZl c254L21lbGFuZ2Utc3RyPg0KDQogIEZlZWRiYWNrLCBidWcgcmVwb3J0cywgYW5kIGNvbnRyaWJ1 dGlvbnMgYXJlIHdlbGNvbWUuIElmIHlvdSBlbmNvdW50ZXINCiAgYW55IGJlaGF2aW9yYWwgZGlm ZmVyZW5jZXMgYmV0d2VlbiBuYXRpdmUgYFN0cicgYW5kIGBtZWxhbmdlLXN0cicsDQogIHBsZWFz ZSBvcGVuIGFuIGlzc3VlIG9yIGxldCBtZSBrbm93IQ0KDQoNClttZWxhbmdlLXN0cl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9kYXZlc254L21lbGFuZ2Utc3RyPg0KDQoNCk91dHJlYWNoeSBNYXkgMjAy Ng0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ DQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vdXRyZWFjaHktbWF5 LTIwMjYvMTc4NjMvMz4NCg0KDQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBQYXRyaWNrIEZlcnJp cyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBkZWFk bGluZSBmb3IgbWVudG9yIHNpZ251cCBoYXMgYmVlbiBleHRlbmRlZCB0byBNYXJjaCAxNnRoIQ0K DQoNClJlc2VhcmNoIGVuZ2luZWVyIG9yIHBvc3Rkb2MgcG9zaXRpb24gYXQgSW5yaWEgUmVubmVz OiBzdGF0aWMgYW5hbHlzaXMgb2YgT0NhbWwgcHJvZ3JhbXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvcmVzZWFyY2gtZW5naW5lZXItb3ItcG9zdGRvYy1wb3NpdGlvbi1hdC1pbnJpYS1yZW5u ZXMtc3RhdGljLWFuYWx5c2lzLW9mLW9jYW1sLXByb2dyYW1zLzE3ODc5LzE+DQoNCg0KQmVub8Ou dCBNb250YWd1IGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGVhciBPQ2FtbCBmb2xr cywNCg0KICBhcyBwYXJ0IG9mIGEgcHJvamVjdCBiZXR3ZWVuIFtJbnJpYV0gYW5kIFtMZXhpZmld LCB3ZSBhcmUgb2ZmZXJpbmcgYQ0KICAyLXllYXIgcmVzZWFyY2ggZW5naW5lZXIgb3IgcG9zdGRv YyBwb3NpdGlvbiwgdG8gd29yayBvbiB0aGUgW1NhbHRvDQogIHN0YXRpYyBhbmFseXNlcl0gZm9y IE9DYW1sIHByb2dyYW1zLiAgVGhlIHBvc2l0aW9uIGNhbiBzdGFydCBhbnl0aW1lDQogIGZyb20g c3ByaW5nIDIwMjYsIGFuZCBpcyBsb2NhdGVkIGluIHRoZSBbw4lwaWN1cmUgSW5yaWEgcmVzZWFy Y2ggdGVhbV0sDQogIGluIHRoZSB2aWJyYW50IGNpdHkgb2YgUmVubmVzLCBGcmFuY2UuICBJZiB5 b3UgaGF2ZSBzdWNjZXNzZnVsbHkNCiAgZGVmZW5kZWQgYSBQaC5ELiBpbiBjb21wdXRlciBzY2ll bmNlLCBhbmQgeW91IGFyZSBhY3F1YWludGVkIHdpdGggdGhlDQogIHRvcGljIG9mIHN0YXRpYyBh bmFseXNpcywgcGxlYXNlIGNvbnRhY3QgbWUhDQoNCiAgRXhwZXJpZW5jZSB3aXRoIHByb2dyYW1t aW5nIGluIE9DYW1sIG9yIGluIGFub3RoZXIgZnVuY3Rpb25hbCBsYW5ndWFnZQ0KICBpcyBzdHJv bmdseSByZWNvbW1lbmRlZC4NCg0KICBJZiB5b3Ugd2FudCB0byBrbm93IG1vcmUgYWJvdXQgdGhp cyBwb3NpdGlvbiwgcGxlYXNlIGhhdmUgbG9vayBhdCB0aGUNCiAgW2RldGFpbGVkIGpvYiBkZXNj cmlwdGlvbl0sIGFuZCBbY29udGFjdCBtZV0hDQoNCiAgUGxlYXNlIGZlZWwgZnJlZSB0byB0cmFu c2ZlciB0aGlzIGFubm91bmNlIHRvIHBlb3BsZSB0aGF0IHlvdSB0aGluaw0KICBjb3VsZCBiZSBp bnRlcmVzdGVkLg0KDQoNCltJbnJpYV0gPGh0dHBzOi8vd3d3LmlucmlhLmZyLz4NCg0KW0xleGlm aV0gPGh0dHBzOi8vd3d3LmxleGlmaS5jb20vPg0KDQpbU2FsdG8gc3RhdGljIGFuYWx5c2VyXSA8 aHR0cHM6Ly9zYWx0by5naXRsYWJwYWdlcy5pbnJpYS5mci8+DQoNClvDiXBpY3VyZSBJbnJpYSBy ZXNlYXJjaCB0ZWFtXSA8aHR0cHM6Ly90ZWFtLmlucmlhLmZyL2VwaWN1cmUvPg0KDQpbZGV0YWls ZWQgam9iIGRlc2NyaXB0aW9uXQ0KPGh0dHBzOi8vam9icy5pbnJpYS5mci9wdWJsaWMvY2xhc3Np Yy9lbi9vZmZyZXMvMjAyNi0wOTg0Mj4NCg0KW2NvbnRhY3QgbWVdIDxodHRwczovL3Blb3BsZS5p cmlzYS5mci9CZW5vaXQuTW9udGFndS8+DQoNCg0KUkZDOiBtdWx0aWZpbGUgQVREIGRlZmluaXRp b24gc3VwcG9ydCB2aWEgaW1wb3J0IHN0YXRlbWVudHMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvcmZjLW11bHRpZmlsZS1hdGQtZGVmaW5pdGlv bi1zdXBwb3J0LXZpYS1pbXBvcnQtc3RhdGVtZW50cy8xNzg4MS8xPg0KDQoNCk1hcnRpbiBKYW1i b24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbywNCg0KICBXZSdyZSBhZGRpbmcg c3VwcG9ydCBmb3Igc3BsaXR0aW5nIFtBVERdIHR5cGUgZGVmaW5pdGlvbnMgaW50byBzbWFsbGVy DQogIGZpbGVzLiBJdCB3YXNuJ3QgcG9zc2libGUgdG8gY29udmVuaWVudGx5IHJlZmVyZW5jZSB0 eXBlcyBkZWZpbmVkIGZyb20NCiAgb3RoZXIgQVREIGZpbGVzIHVudGlsIG5vdywgcmVzdWx0aW5n IGluIGxhcmdlIGludGVyZmFjZSBmaWxlcw0KICAoW2V4YW1wbGVdKS4NCg0KICBJIHdvdWxkIGxp a2UgYSBwYWlyIG9mIGV5ZXMgdG8gaGVscCBtZSBjaGVjayB0aGUgc2FuaXR5IG9mIHRoZSBzcGVj DQogIHdoaWNoIGlzIGNvcHktcGFzdGVkIGJlbG93IGZyb20gdGhlIFtwdWxsIHJlcXVlc3RdIGJl Zm9yZSB0aGlzIGdvZXMNCiAgbGl2ZSBpbiBhdGQgNC4wLjAuDQoNCg0KW0FURF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9haHJlZnMvYXRkPg0KDQpbZXhhbXBsZV0NCjxodHRwczovL2dpdGh1Yi5jb20v c2VtZ3JlcC9zZW1ncmVwLWludGVyZmFjZXMvYmxvYi9tYWluL3NlbWdyZXBfb3V0cHV0X3YxLmF0 ZD4NCg0KW3B1bGwgcmVxdWVzdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9haHJlZnMvYXRkL3B1bGwv NDUxPg0KDQpJbXBvcnQgZGVjbGFyYXRpb25zDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBbiBBVEQgZmlsZSBtYXkgaW1wb3J0 IG90aGVyIEFURCBtb2R1bGVzIHVzaW5nIGBpbXBvcnQnIGRlY2xhcmF0aW9ucy4NCiAgSW1wb3J0 IGRlY2xhcmF0aW9ucyBtdXN0IGFwcGVhciBhZnRlciBhbnkgdG9wLWxldmVsIGFubm90YXRpb25z IGFuZA0KICBiZWZvcmUgYW55IHR5cGUgZGVmaW5pdGlvbnMuDQoNCiAgU3ludGF4Og0KICAgICAg ICBpbXBvcnQgbW9kdWxlLnBhdGggPGFubm90YXRpb25zPiBhcyBhbGlhcyA8YW5ub3RhdGlvbnM+ DQoNCiAgVGhlIGBhcycgY2xhdXNlIGlzIG9wdGlvbmFsLiBXaXRob3V0IGl0LCB0aGUgbG9jYWwg bmFtZSBvZiB0aGUNCiAgaW1wb3J0ZWQgbW9kdWxlIGlzIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0 aGUgZG90dGVkIHBhdGggKGUuZy4gYGltcG9ydA0KICBmb28uYmFyJyBiaW5kcyB0aGUgbG9jYWwg bmFtZSBgYmFyJykuDQoNCiAgVHlwZSBuYW1lcyBmcm9tIGFuIGltcG9ydGVkIG1vZHVsZSBhcmUg cmVmZXJlbmNlZCB1c2luZyBkb3Qgbm90YXRpb246DQogIGBhbGlhcy50eXBlbmFtZScgKG9yIGBs YXN0Y29tcG9uZW50LnR5cGVuYW1lJyB3aGVuIG5vIGFsaWFzIGlzIGdpdmVuKS4NCiAgRm9yIGV4 YW1wbGUsIGlmIGEgbW9kdWxlIGB0eXBlcycgaXMgaW1wb3J0ZWQsIHRoZSB0eXBlIGBkYXRlJyBm cm9tDQogIHRoYXQgbW9kdWxlIGlzIHdyaXR0ZW4gYHR5cGVzLmRhdGUnIGluIHR5cGUgZXhwcmVz c2lvbnMuDQoNCiAgQW5ub3RhdGlvbnMgb24gdGhlIHBhdGggb3IgYWxpYXMgYWxsb3cgbGFuZ3Vh Z2Utc3BlY2lmaWMgYmFja2VuZHMgdG8NCiAgb3ZlcnJpZGUgdGhlIG1vZHVsZSBuYW1lIHVzZWQg aW4gZ2VuZXJhdGVkIGNvZGUuIFRoZSBhbm5vdGF0aW9uDQogIGA8b2NhbWwgbmFtZT0iLi4uIj4n IChvciB0aGUgZXF1aXZhbGVudCBmb3IgYW5vdGhlciB0YXJnZXQgbGFuZ3VhZ2UpDQogIG9uIHRo ZSBwYXRoIGNvbnRyb2xzIGhvdyB0aGUgbW9kdWxlIGlzIHJlZmVyZW5jZWQgaW4gZ2VuZXJhdGVk IG91dHB1dCwNCiAgd2hpbGUgdGhlIHNhbWUgYW5ub3RhdGlvbiBvbiB0aGUgYGFzJyBjbGF1c2Ug Y29udHJvbHMgdGhlIGxvY2FsIGFsaWFzDQogIG5hbWUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkIGNv ZGUuDQoNCiAgRXhhbXBsZXM6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBTaW1wbGUg aW1wb3J0OiBsb2NhbCBuYW1lIGlzICJjb21tb24iICopDQogIOKUgiBpbXBvcnQgbXlsaWIuY29t bW9uDQogIOKUgiANCiAg4pSCICgqIEltcG9ydCB3aXRoIGFuIGFsaWFzICopDQogIOKUgiBpbXBv cnQgbXlsaWIuY29tbW9uIGFzIGMNCiAg4pSCIA0KICDilIIgKCogVXNpbmcgYW4gaW1wb3J0ZWQg dHlwZSBpbiBhIGRlZmluaXRpb24gKikNCiAg4pSCIHR5cGUgZXZlbnQgPSB7DQogIOKUgiAgIGlk IDogc3RyaW5nOw0KICDilIIgICB0aW1lc3RhbXAgOiBjb21tb24uZGF0ZTsNCiAg4pSCIH0NCiAg 4pSU4pSA4pSA4pSA4pSADQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBMYW5ndWFnZS1z cGVjaWZpYyBuYW1lIGFubm90YXRpb24gb24gdGhlIHBhdGggKikNCiAg4pSCIGltcG9ydCBteWxp Yi5jb21tb24gPG9jYW1sIG5hbWU9Ik15bGliX2NvbW1vbiI+DQogIOKUgiANCiAg4pSCICgqIExh bmd1YWdlLXNwZWNpZmljIG5hbWUgYW5ub3RhdGlvbiBvbiB0aGUgYWxpYXMgKikNCiAg4pSCIGlt cG9ydCBteWxpYi5jb21tb24gYXMgYyA8b2NhbWwgbmFtZT0iQ29tbW9uIj4NCiAg4pSU4pSA4pSA 4pSA4pSADQoNCiAgV2FybmluZzoNCiAgICAgICAgRG90dGVkIG1vZHVsZSBwYXRocyAoZS5nLiBg aW1wb3J0IGZvby5iYXIuYmF6JykgYXJlIGFuDQogICAgICAgIGV4cGVyaW1lbnRhbCBmZWF0dXJl LiBFYWNoIGNvZGUgZ2VuZXJhdG9yIG1hcHMgdGhlbSB0bw0KICAgICAgICBmaWxlIHBhdGhzIGlu IGl0cyBvd24gd2F5IGFuZCB0aGVyZSBpcyBjdXJyZW50bHkgbm8NCiAgICAgICAgZ3VhcmFudGVl IG9mIGNvbnNpc3RlbnQgYmVoYXZpb3IgYWNyb3NzIGJhY2tlbmRzLiAgV2hlbg0KICAgICAgICBw b3NzaWJsZSwgcHJlZmVyIHNpbmdsZS1jb21wb25lbnQgbW9kdWxlIG5hbWVzDQogICAgICAgIChl LmcuIGBpbXBvcnQgYmF6JyBvciBgaW1wb3J0IGZvbyBhcyBiYXInKS4gU3VwcG9ydCBmb3INCiAg ICAgICAgZG90dGVkIG1vZHVsZSBwYXRocyBtYXkgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxl YXNlLg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBw ZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1h aWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRo ZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRv IHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0 aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3Nh Z2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hp dmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0 aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0K DQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlz dD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 03 to 10, 2026.

    Eliom 12: Client-server applications in Web Assembly

    Vincent Balat announced

    On behalf of the Ocsigen team, I am pleased to announce the release of Elio= m 12. Following our recent release of wasm_of_ocaml, this version's main fe= ature is full support for Web Assembly. Eliom applications are now served b= y default as Web Assembly programs (with a JavaScript fallback). The defaul= t build system has been adapted accordingly. The Ocsigen Start template has= also been updated.

    The new version are available in opam.

    If you want to give it a try, please read the main documentation page first.

    You can see a running example app here.

    melange-str: Str module for Melange

    David Sancho announced

    melange-str is an im= plementation of OCaml's Str module for Melange, using JavaScri= pt's RegExp as the backend.

    OCaml's Str library provides regular expression matching, sear= ching, replacement, and splitting. It's part of the standard distribution a= nd widely used. However, Str is implemented in C, which means = it's unavailable when compiling OCaml to JavaScript via Melange.

    The module is exposed as Str (not Melange_str.Str= ), so existing code that opens or references Str works without= changes.

    Repository: https= ://github.com/davesnx/melange-str

    Feedback, bug reports, and contributions are welcome. If you encounter any = behavioral differences between native Str and melange-st= r, please open an issue or let me know!

    Outreachy May 2026

    Continuing this thread, Patrick Ferris announced

    The deadline for mentor signup has been extended to March 16th!

    Research engineer or postdoc position at Inria Rennes: static = analysis of OCaml programs

    Beno=C3=AEt Montagu announced

    Dear OCaml folks,

    as part of a project between Inria an= d Lexifi, we are offering a 2-year = research engineer or postdoc position, to work on the Salto static analyser for OCaml programs. The position can start anytime from spring 2026, and is located in the =C3=89picure Inria research team= , in the vibrant city of Rennes, France. If you have successfully defended a Ph.D. in computer science, and you are = acquainted with the topic of static analysis, please contact me!

    Experience with programming in OCaml or in another functional language is s= trongly recommended.

    If you want to know more about this position, please have look at the detailed j= ob description, and contact me!

    Please feel free to transfer this announce to people that you think could b= e interested.

    RFC: multifile ATD definition support via import statements

    Martin Jambon announced

    Hello,

    We're adding support for splitting ATD type definitions into smaller files. It wasn't possible to conve= niently reference types defined from other ATD files until now, resulting i= n large interface files (example).

    I would like a pair of eyes to help me check the sanity of the spec which i= s copy-pasted below from the pull request before this goes live in atd 4.0.0.

    Import declarations

    An ATD file may import other ATD modules using import declarat= ions. Import declarations must appear after any top-level annotations and before any type definitions.

    Syntax:

    import module.path <annotations> as alias <annotations>

    The as clause is optional. Without it, the local name of the i= mported module is the last component of the dotted path (e.g. import foo.bar<= /code> binds the local name bar).

    Type names from an imported module are referenced using dot notation: alias.typename (or lastcomponent.typename when no= alias is given). For example, if a module types is imported, the type dat= e from that module is written types.date in type expressions.

    Annotations on the path or alias allow language-specific backends to override the module name used in generated code. The annotation <ocaml name=3D"..."> (or the equivalent for another targ= et language) on the path controls how the module is referenced in generated output, while the same annotation on the as clause controls the local = alias name used in the generated code.

    Examples:

    (* S=
    imple import: local name is "common" *)
    import mylib.common
    
    (* Import with an alias *)
    import mylib.common as c
    
    (* Using an imported type in a defini=
    tion *)
    type event =3D {
      id : string;
      timestamp : common.date;
    }
    
    (* L=
    anguage-specific name annotation on the path *)
    import mylib.common <ocaml name=3D"Mylib=
    _common">
    
    (* Language-specific name annotation =
    on the alias *)<=
    /span>
    import mylib.common as c <ocaml name=3D"Common">
    

    Warning:

    Dotted module paths (e.g. import foo.bar.baz) are an experimen= tal feature. Each code generator maps them to file paths in its own way and there is currently no guarantee of consistent behavior across backends. When possible, prefer single-component module names (e.g. import baz<= /code> or import foo as bar). Support for dotted module paths may be = removed in a future release.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=ZqrnPn2l; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 077AF4009D for ; Tue, 17 Mar 2026 14:39:13 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=3i4dP1OmJSKvFznQGmyPiqLzPhzNTfBdYq81pSWPt+4=; b=ZqrnPn2lTXJsB4CDOONx/QTRa2pKOv3mp/SWzNIptfW7xPyfKUd6BYch u3H95l8n/P8atzqFy6tbahlheDeDKYxieG7w/og+IgV2Fki9WTSFK91hQ hIJpR9+kTIFnhD1RhvlZH22thhoKOldu/AetXABvEOu7g7BYxabhlXhsf c=; X-CSE-ConnectionGUID: iXQdYK0oR5GNZNczUWT5vA== X-CSE-MsgGUID: 01+Vm8O2SCCAI5l9eWP5vw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,126,1770591600"; d="scan'208,217";a="268201401" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 17 Mar 2026 15:39:14 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 6423483763; Tue, 17 Mar 2026 15:39:13 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 61781823E5 for ; Tue, 17 Mar 2026 15:39:06 +0100 (CET) X-CSE-ConnectionGUID: aLMfCwOpQBmPTSso8f/Daw== X-CSE-MsgGUID: cldyxlnySQygGBLLjhnqvg== X-IronPort-AV: E=Sophos;i="6.23,126,1770591600"; d="scan'208,217";a="141577572" Received: from mac-03220211.irisa.fr ([131.254.21.249]) by mail3-relais-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 17 Mar 2026 15:39:06 +0100 From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 17 Mar 2026 15:39:05 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19472 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMTAgdG8gMTcsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNClB1YmxpYyBz ZWN1cml5IG1lZXRpbmcNCkdvb2dsZSBPUi1Ub29sczogQ1AtU0FUIFN1YnNldA0KTmVvY2FtbC1t b2RlIChBIG1vZGVybiBFbWFjcyBtYWpvciBtb2RlIGZvciBPQ2FtbCkgaXMgbG9va2luZyBmb3Ig dGVzdGVycw0Kb3VpOiBtdWx0aS1wbGF0Zm9ybSBiaW5hcnkgaW5zdGFsbGVycw0KTml4dGFtYWw6 IEZ1bGZpbGxpbmcgSW5wdXQgUGlubmluZyBmb3IgTml4DQpPQ2FtbC1SREYgMS4yLjANClNsaXBz aG93IQ0KSXMgdGhlcmUgYSBwdWJsaWMgYXJjaGl2ZSBmb3IgdGhlIGNhbWwtbGlzdD8NCk9sZCBD V04NCg0KDQpQdWJsaWMgc2VjdXJpeSBtZWV0aW5nDQrilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOiA8 aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3B1YmxpYy1zZWN1cml5LW1lZXRpbmcvMTc4ODIv MT4NCg0KDQpIYW5uZXMgTWVobmVydCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERl YXIgZXZlcnlvbmUsDQoNCiAgYXMgYSByZW1pbmRlciDigJMgbmV4dCB3ZWVrIFRodXJzZGF5IChN YXJjaCAxOXRoKSAxNDowMCBDRVNULCB0aGVyZSB3aWxsDQogIGJlIGEgcHVibGljIE9DYW1sIHNl Y3VyaXR5IG1lZXRpbmcgaG9zdGVkIGJ5IHRoZQ0KICA8aHR0cHM6Ly9vY2FtbC5vcmcvc2VjdXJp dHk+IHRlYW0uIFdlIHdpbGwgbWVldCBhdA0KICA8aHR0cHM6Ly9tZWV0LmJvcm5oYWNrLmRrL09D YW1sU2VjdXJpdHlQdWJsaWNNZWV0aW5nPg0KDQogIE91ciBhZ2VuZGEgYW5kIG5vdGVzIHdpbGwg YmUgYXQNCiAgPGh0dHBzOi8vcGFkLmRhdGEuY29vcC9JZTV2b0JlUFNpS3ZqWmRFa282b3RRPiMN Cg0KICBJZiB5b3UncmUgY3VyaW91cywgdGhlIG5vdGVzIGZyb20gb3VyIGxhc3QgbWVldGluZyBh cmUgYXQNCiAgPGh0dHBzOi8vcGFkLmRhdGEuY29vcC83LUljNXJHNlRveW5zVzAyaEpzbmRnPg0K DQogIEhvcGUgdG8gc2VlIHlvdSB0aGVyZSENCg0KDQpHb29nbGUgT1ItVG9vbHM6IENQLVNBVCBT dWJzZXQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQog IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvZ29vZ2xlLW9yLXRvb2xzLWNwLXNhdC1zdWJz ZXQvMTc4ODUvMT4NCg0KDQpUaW1vdGh5IEJvdXJrZSBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gA0KDQogIFRoZSBbR29vZ2xlIE9SLVRvb2xzXSBhcmUgYSBzdWl0ZSBvZiB0b29scyBmb3Igc29s dmluZyBvcHRpbWl6YXRpb24NCiAgcHJvYmxlbXMuIFRoZXkgaW5jbHVkZSwgaW4gcGFydGljdWxh ciwgW0NQLVNBVF0sIHdoaWNoIGlzIGEgcG93ZXJmdWwNCiAgY29uc3RyYWludCBzb2x2ZXIgYW5k IG9wdGltaXplciBmb3IgaW50ZWdlciBsaW5lYXIgcHJvZ3JhbW1pbmcgYW5kDQogIGJvb2xlYW4g c2F0aXNmaWFiaWxpdHkgcHJvYmxlbXMuDQoNCiAgVGhlIFtvY2FtbC1vcnRvb2xzXSBwYWNrYWdl IHByb3ZpZGVzIGFuIE9DYW1sIGludGVyZmFjZSB0byBhIHN1YnNldCBvZg0KICBDUC1TQVQgY29u c3RyYWludHMuIEl0IGNvbXByaXNlcyB0d28gcGFydHMgYG9ydG9vbHNgLCB3aGljaCBhbGxvd3MN CiAgbW9kZWxsaW5nIGNvbnN0cmFpbnQgcHJvYmxlbXMgaW4gT0NhbWwgYW5kIHRyYW5zbGF0aW5n IHRoZW0gdG8gYQ0KICBwcm90b2NvbCBidWZmZXIgZm9ybWF0ICh0aGFua3MgdG8gW29jYW1sLXBy b3RjXSksIGFuZA0KICBgb3J0b29sc19zb2x2ZXJzYCwgd2hpY2ggYWxsb3dzIGFuIGVtYmVkZGVk IHZlcnNpb24gb2YgQ1AtU0FUIHRvIGJlDQogIGNhbGxlZCBkaXJlY3RseSBmcm9tIE9DYW1sLiBC b3RoIHBhcnRzIGNhbiBiZSBpbnN0YWxsZWQgdXNpbmcgb3BhbSBvcg0KICBidWlsdCB3aXRoIGR1 bmUuIFRoZSBsYXR0ZXIgaW5jbHVkZXMgdGhlIHNvdXJjZSBvZiBPUi1Ub29scyA5LjE1IHdoaWNo DQogIGlzIGJ1aWx0IHRvZ2V0aGVyIHdpdGggbW9zdCBvZiBpdHMgbGlicmFyaWVzIGFuZCBpbnN0 YWxsZWQgYXMgcGFydCBvZg0KICB0aGUgb3BhbSBwYWNrYWdlLg0KDQogIFNvbWUgc2ltcGxlIGV4 YW1wbGVzIGNhbiBiZSBmb3VuZCBpbiB0aGUgW29ubGluZSBkb2N1bWVudGF0aW9uXSBhbmQNCiAg W3NvdXJjZSBjb2RlXS4gVGhleSBjYW4gYmUgYnVpbHQgdXNpbmcgdGhlIGZvbGxvd2luZyBjb21t YW5kcy4NCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIG9wYW0gaW5zdGFsbCBvcnRvb2xzIG9y dG9vbHNfc29sdmVycw0KICDilIIgb2NhbWxmaW5kIG9jYW1sb3B0IC1vIHByb2cgLXBhY2thZ2Ug b3J0b29scyAtcGFja2FnZSBvcnRvb2xzX3NvbHZlcnMgLWxpbmtwa2cgcHJvZy5tbA0KICDilJTi lIDilIDilIDilIANCg0KICBJIHdvdWxkIGJlIGhhcHB5IHRvIGFjY2VwdCBwdWxsIHJlcXVlc3Rz IGZvciB0aGUgbWlzc2luZyBDUC1TQVQNCiAgY29uc3RyYWludHMgKEkgdGhpbmsgaXQgYmVzdCB0 byBkZXZlbG9wIHRoZSBpbnRlcmZhY2UgdG9nZXRoZXIgd2l0aA0KICByZWFsIGFwcGxpY2F0aW9u cywgYW5kIEkgb25seSBuZWVkIHRoZSBJTFAgYW5kIGJvb2xlYW4gcGFydHMgYXQgdGhlDQogIG1v bWVudCksIHRvIHRyYW5zbGF0ZSBtb3JlIG9mIHRoZSBzdGFuZGFyZCBleGFtcGxlIHByb2dyYW1z IChhbiBlYXN5DQogIHdheSB0byBjb250cmlidXRlKSwgYW5kIHRvIGluY2x1ZGUgb3RoZXIgc29s dmVycyBmcm9tIHRoZSBzdWl0ZQ0KICAobGlrZWx5IHRvIGludm9sdmUgc29sdmluZyB0ZWRpb3Vz IGNvbXBpbGF0aW9uIGFuZCBjb21wYXRpYmlsaXR5DQogIHByb2JsZW1zIGFjcm9zcyBtdWx0aXBs ZSBwbGF0Zm9ybXMpLg0KDQogIFRoYW5rcyB0byBAbm9qYiwgQFJ1Y2lraXIgLCBhbmQgb3RoZXJz IGZvciBbdGhlaXIgaGVscF0gd2l0aCBbZHVuZV0sDQogIGFuZCBAeHZ3IGFuZCBAcGFuZ2xlc2Qg Zm9yIFt0aGVpciBoZWxwXSB3aXRoIG9kb2MuIFRoYW5rcyB0byBAam1pZCAsDQogIEBtc2VyaSAs IGFuZCBAYXZzbSBmb3IgZGlzY3Vzc2luZyBhbmQgbWVyZ2luZyBteSBbb3BhbS1yZXBvc2l0b3J5 XQ0KICBwdWxsIHJlcXVlc3RzLg0KDQoNCltHb29nbGUgT1ItVG9vbHNdIDxodHRwczovL2RldmVs b3BlcnMuZ29vZ2xlLmNvbS9vcHRpbWl6YXRpb24+DQoNCltDUC1TQVRdIDxodHRwczovL2Qta3J1 cGtlLmdpdGh1Yi5pby9jcHNhdC1wcmltZXIvPg0KDQpbb2NhbWwtb3J0b29sc10gPGh0dHBzOi8v Z2l0aHViLmNvbS9JTlJJQS9vY2FtbC1vcnRvb2xzPg0KDQpbb2NhbWwtcHJvdGNdIDxodHRwczov L2dpdGh1Yi5jb20vbXJhbnNhbi9vY2FtbC1wcm90b2M+DQoNCltvbmxpbmUgZG9jdW1lbnRhdGlv bl0NCjxodHRwczovL2lucmlhLmdpdGh1Yi5pby9vY2FtbC1vcnRvb2xzL29ydG9vbHMvaW5kZXgu aHRtbD4NCg0KW3NvdXJjZSBjb2RlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9JTlJJQS9vY2FtbC1v cnRvb2xzL3RyZWUvbWFzdGVyL3NhbXBsZXMvc2F0Pg0KDQpbdGhlaXIgaGVscF0NCjxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvZm9yZWlnbi1hcmNoaXZlcy1uby1zdGF0aWMtbGlicmFyaWVz LWR5bGliLW9uLW1hYy8xNzY2OT4NCg0KW2R1bmVdIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvZHVuZS1jbWFrZS1hbmQtai8xNzc2OD4NCg0KW3RoZWlyIGhlbHBdDQo8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L29kb2MtaW5kZXgtZm9yLW11bHRpcGxlLXBhY2thZ2VzLWludGVyLXBh Y2thZ2UtbGlua3MtYW5kLWxvY2FsLWdsb2JhbC1zaWRlYmFyLzE3NjUyPg0KDQpbb3BhbS1yZXBv c2l0b3J5XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL29wYW0tcmVwb3NpdG9yeT4NCg0KDQpO ZW9jYW1sLW1vZGUgKEEgbW9kZXJuIEVtYWNzIG1ham9yIG1vZGUgZm9yIE9DYW1sKSBpcyBsb29r aW5nIGZvciB0ZXN0ZXJzDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L25l b2NhbWwtbW9kZS1hLW1vZGVybi1lbWFjcy1tYWpvci1tb2RlLWZvci1vY2FtbC1pcy1sb29raW5n LWZvci10ZXN0ZXJzLzE3ODA3LzIzPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIEJvemhp ZGFyIEJhdHNvdiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEZZSSAtIDxodHRwczovL2dpdGh1Yi5jb20vYmJhdHNvdi9uZW9jYW1sL3JlbGVhc2VzL3Rh Zy92MC40LjA+DQoNCiAgWW91J2xsIG5lZWQgdG8gdXBkYXRlIHlvdXIgVHJlZS1zaXR0ZXIgZ3Jh bW1hcnMgZHVlIHRvIHNvbWUgdXBzdHJlYW0NCiAgKGJyZWFraW5nKSBjaGFuZ2VzIGluIHRoZSBU UyBPQ2FtbCBncmFtbWFyLg0KDQoNCm91aTogbXVsdGktcGxhdGZvcm0gYmluYXJ5IGluc3RhbGxl cnMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW91aS1t dWx0aS1wbGF0Zm9ybS1iaW5hcnktaW5zdGFsbGVycy8xNzg4Ni8xPg0KDQoNCk5hdGhhbiBSZWJv dXJzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgV2UgYXJlIGhhcHB5IHRvIGFubm91 bmNlIHRoZSBmaXJzdCByZWxlYXNlIG9mIGBvdWknIQ0KDQogIGBvdWknIGlzIGEgdG9vbCB0aGF0 IGdlbmVyYXRlcyBtdWx0aS1wbGF0Zm9ybSBiaW5hcnkgaW5zdGFsbGVycyBmb3INCiAgeW91ciBP Q2FtbCBhcHBsaWNhdGlvbnMuIEl0IGNhbiBnZW5lcmF0ZSBpbnN0YWxsZXJzIGZvciBXaW5kb3dz LCBMaW51eA0KICBhbmQgTWFjT1MuICBXZSBob3BlIGl0IHdpbGwgaGVscCBhbGwgb2YgeW91IG91 dCB0aGVyZSBkZXZlbG9wcGluZw0KICBhcHBsaWNhdGlvbnMgZm9yIG5vbiBPQ2FtbCBkZXZlbG9w ZXJzLCBhbGxvd2luZyB5b3VyIHVzZXJzIHRvIGluc3RhbGwNCiAgeW91ciBwcm9ncmFtcyB3aXRo b3V0IGhhdmluZyB0byBpbnN0YWxsIE9DYW1sIGFuZC9vciBvcGFtLCB0aHVzDQogIGdyZWF0bHkg c2ltcGxpZnlpbmcgdGhlaXIgdXNlciBleHBlcmllbmNlLg0KDQogIFlvdSBjYW4gaW5zdGFsbCBg b3VpJyB3aXRoIHRoZSBmb2xsb3dpbmcgY29tbWFuZDoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKU giBvcGFtIGluc3RhbGwgb3VpDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFdlIG1hZGUgaXQgYXMg Z2VuZXJpYyBhcyBwb3NzaWJsZSB0byBlbnN1cmUgaXQgd29ya3MgZm9yIGV2ZXJ5b25lLiBZb3UN CiAgaW52b2tlIGl0IGFzIGZvbGxvd3M6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3VpIGJ1 aWxkIG91aS5qc29uIGluc3RhbGwtYnVuZGxlDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIHdoZXJl IGBpbnN0YWxsLWJ1bmRsZScgaXMgYSBmb2xkZXIgY29udGFpbmluZyB5b3VyIHByZWNvbXBpbGVk DQogIGJpbmFyaWVzIGFuZCBhbnkgZmlsZXMgeW91IHdhbnQgdG8gaW5zdGFsbCBhbG9uZ3NpZGUg dGhlbSwgYXJyYW5nZWQgaW4NCiAgYW55IHdheSB5b3UnZCBsaWtlLiAgVGhlIGBvdWkuanNvbicg ZmlsZSBpcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB0aGF0DQogIGNvbnRhaW5zIG1ldGFkYXRhIGFu ZCBpbmZvcm1hdGlvbiBvbiB0aGUgaW5zdGFsbGF0aW9uIGJ1bmRsZSdzIGxheW91dA0KICBzdWNo IGFzIHdoZXJlIHRvIGZpbmQgYmluYXJpZXMgdG8gYWRkIHRvIHRoZSBgUEFUSCcgb3Igd2hlcmUg dG8gZmluZA0KICBtYW5wYWdlcy4NCg0KICBgb3VpJyBjYW4gYWxzbyBjcmVhdGUgaW5zdGFsbGVy cyBmb3IgcGx1Z2lucywgYXNzdW1pbmcgdGhlIG1haW4NCiAgYXBwbGljYXRpb24gd2FzIGVpdGhl ciBpbnN0YWxsZWQgYnkgYSBgb3VpJyBnZW5lcmF0ZWQgaW5zdGFsbGVyLCBvcg0KICB3YXMgaW5z dGFsbGVkIGZvbGxvd2luZyBzb21lIGJhc2ljIHJ1bGVzLg0KDQogIFRoZSBwcm9qZWN0IGlzIGhv c3RlZCBvbiBnaXRodWI6DQogIDxodHRwczovL2dpdGh1Yi5jb20vT0NhbWxQcm8vb2NhbWwtdW5p dmVyc2FsLWluc3RhbGxlcj4gVGhlIGZ1bGwNCiAgZG9jdW1lbnRhdGlvbiBpcyBhdmFpbGFibGUg W2hlcmVdLiBJbiBwYXJ0aWN1bGFyLCB5b3UgY2FuIGZpbmQNCiAgZ3VpZGVsaW5lcyBvbiBob3cg dG8gdXNlIGl0IHRvIGNyZWF0ZSBpbnN0YWxsZXJzIGZvciB5b3VyIGR1bmUgYnVpbHQNCiAgcHJv amVjdCBbaGVyZV0uDQoNCiAgUGxlYXNlIGdvIGFoZWFkIGFuZCBnaXZlIGl0IGEgdHJ5LCB3ZSdk IGxvdmUgdG8gaGVhciB5b3VyIGZlZWRiYWNrLg0KDQogIFdlIHdlbGNvbWUgZXh0ZXJuYWwgY29u dHJpYnV0b3JzIHNvIGlmIHlvdSdkIGxpa2UgdG8gdGFrZSBwYXJ0IGluIHRoZQ0KICBwcm9qZWN0 LCBwbGVhc2UgcmVhZCBvdXIgW0NPTlRSSUJVVElORy5tZF0gYW5kIGp1bXAgaW4hDQoNCiAgVGhl IHByb2plY3QgaXMgc3RpbGwgaW4gYSByZWxhdGl2ZWx5IGVhcmx5IHN0YWdlIGFuZCB0aGVyZSBh cmUgc29tZQ0KICBrZXkgZmVhdHVyZXMgd2UnZCBsaWtlIHRvIGFkZCwgc3VjaCBhcyBzdHJlYW1s aW5pbmcgdGhlIHVzZXINCiAgZXhwZXJpZW5jZSBmb3IgZHVuZSBwcm9qZWN0cyAocmVtb3Zpbmcg dGhlIG5lY2Vzc2l0eSB0byBtYWludGFpbiBhDQogIHNlcGFyYXRlIGNvbmZpZ3VyYXRpb24gZmls ZSBmb3IgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcykgb3Igc3VwcG9ydA0KICBmb3IgY3Jvc3Mt Y29tcGlsYXRpb24vY3Jvc3MtcGxhdGZvcm0gaW5zdGFsbGVyIGdlbmVyYXRpb24uIElmIHRob3Nl DQogIGZlYXR1cmVzIHNvdW5kIGludGVyZXN0aW5nIHRvIHlvdSBhbmQgeW91IHdvdWxkIGxpa2Ug dG8gZnVuZCB0aGVpcg0KICBkZXZlbG9wbWVudCwgcGxlYXNlIHJlYWNoIG91dCB0byBjb250YWN0 QG9jYW1scHJvLmNvbSAuDQoNCiAgRmluYWxseSwgd2UnZCBsaWtlIHRvIHRoYW5rIG91ciBwYXJ0 bmVyIENFQS1saXN0IHdobyBmdW5kZWQgdGhlDQogIGluaXRpYWwgZGV2ZWxvcG1lbnQgb2YgYG91 aScgZnJvbSBgb3BhbS13aXgnIGFuZCBtYWRlIGl0IGFsbCBwb3NzaWJsZSENCg0KICBIYXBweSBp bnN0YWxsaW5nIQ0KDQoNCltoZXJlXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFByby9vY2Ft bC11bml2ZXJzYWwtaW5zdGFsbGVyL2Jsb2IvbWFzdGVyL2RvYy9SRUFETUUubWQ+DQoNCltoZXJl XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9PQ2FtbFByby9vY2FtbC11bml2ZXJzYWwtaW5zdGFsbGVy L2Jsb2IvbWFzdGVyL2RvYy9SRUFETUUubWQjZ2VuZXJhdGluZy1hLWJpbmFyeS1pbnN0YWxsZXIt Zm9yLXlvdXItZHVuZS1wcm9qZWN0Pg0KDQpbQ09OVFJJQlVUSU5HLm1kXQ0KPGh0dHBzOi8vZ2l0 aHViLmNvbS9PQ2FtbFByby9vY2FtbC11bml2ZXJzYWwtaW5zdGFsbGVyL2Jsb2IvbWFzdGVyL0NP TlRSSUJVVElORy5tZD4NCg0KDQpOaXh0YW1hbDogRnVsZmlsbGluZyBJbnB1dCBQaW5uaW5nIGZv ciBOaXgNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvYW5uLW5peHRhbWFsLWZ1bGZpbGxpbmctaW5wdXQtcGlubmluZy1mb3Itbml4LzE3 ODg3LzE+DQoNCg0KdG9hc3RhbCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFtOaXh0YW1hbF0gaXMgbXkgZmlyc3Qgc2Vy aW91cyBPQ2FtbCBwcm9qZWN0IHJlbGVhc2UsIG5vdyBhdCB2ZXJpc29uDQogIDEuMS40LiBJdCB3 YXMgY3JlYXRlZCBhcyBhIHJlYWN0aW9uIHRvIHRoZSBsYWNrIG9mIGZlYXR1cmVzIEkgd2FudGVk DQogIGZyb20gaXRzIOKAnGNvbXBldGl0b3Jz4oCdIGBuaXYnICYgYG5waW5zJyB3aGlsZSBhZGRp dGlvbmFsbHkgY292ZXJpbmcNCiAgZmVhdHVyZXMgTml4IGZsYWtlcyBuZXZlciBjb3VsZCBzdXBw b3J0IGdpdmVuIGl04oCZcyByaWdpZCBkZXNpZ24NCiAgcGhpbG9zb3BoeSB3aGljaCBoYXMgbW9y ZSBkcmF3YmFja3MgdGhhbiBmb2xrcyBpbml0aWFsbHkgcmVhbGl6ZS4gSQ0KICBoYXZlIGJlZW4g dXNpbmcgaXQgb24gYWxsIHByb2plY3RzIGZvciBhIGNvdXBsZSBtb250aHMgbm93ICYgaGFkIGF0 DQogIGxlYXN0IGEgY291cGxlIGZvbGtzIEkgZGlkbuKAmXQga25vdyBwcmlvciB0cnkgaXQgb3V0 IHByb3ZpZGluZyBmZWVkYmFjaw0KICAmIGJ1ZyByZXBvcnRzLg0KDQogICpLZXkgZmVhdHVyZXM6 Kg0KDQogIOKAoiBBdXRvbWF0ZSB0aGUgbWFudWFsIHdvcmsgb2YgaW5wdXQgcGlubmluZyBmb3Ig ZGVwZW5kZW5jeSBtYW5hZ2VtZW50DQogIOKAoiBBbGxvdyBlYXN5IHdheXMgdG8gbG9jayAmIHJl ZnJlc2ggdGhvc2UgaW5wdXRzDQogIOKAoiBEZWNsYXJhdGl2ZSBbS0RMXSBtYW5pZmVzdCBmaWxl IG92ZXIgaW1wZXJhdGl2ZSA8YWJiciB0aXRsZT0iY29tbWFuZA0KICAgIGxpbmUgaW50ZXJmYWNl Ij5DTEk8L2FiYnI+IGZsYWdzDQogIOKAoiBIb3N0LCBmb3JnZSwgPGFiYnIgdGl0bGU9InZlcnNp b24gY29udHJvbA0KICAgIHN5c3RlbSI+VkNTPC9hYmJyPi1hZ25vc3RpYw0KICDigKIgQ2hvb3Nl IDxhYmJyIHRpdGxlPSJldmFsdWF0aW9uIj5ldmFsPC9hYmJyPiB0aW1lIGZldGNoZXJzIChidWls dGlucykNCiAgICBvciBidWlsZCB0aW1lIGZldGNoZXJzIChOaXhwa2dzLCBkZWZhdWx0KSDigJQg d2hpY2ggb3BlbnMgdXAgZmV0Y2hpbmcNCiAgICBub3ctc3VwcG9ydGVkIFtEYXJjc10sIFtQaWp1 bF0sICYgW0Zvc3NpbF0NCiAg4oCiIFN1cHBvcnRzIG1pcnJvcnMgKG9uIGtpbmRzIHRoYXQgc3Vw cG9ydCBtaXJyb3JzKQ0KICDigKIgT3ZlcnJpZGUgaGFzaCBhbGdvcml0aG0gb24gYSBwZXItcHJv amVjdCAmIHBlci1pbnB1dCBiYXNpcyDigJQNCiAgICBpbmNsdWRpbmcgQkxBS0UzIHN1cHBvcnQg KHdoaWNoIF9kb2VzXyByZXF1aXJlIGVuYWJsaW5nDQogICAgYGJsYWtlMy1oYXNoZXNgIHRvIG9w dCBpbikNCiAg4oCiIEN1c3RvbSBmcmVzaG5lc3MgY29tbWFuZHMgKGF2b2lkIHJlZmV0Y2hpbmcg bWFzc2l2ZSBpbnB1dHMganVzdCB0bw0KICAgIGNoZWNrIHRoZSBoYXNoIGhhc27igJl0IGNoYW5n ZWQpDQogIOKAoiBObyBleHBlcmltZW50YWwgTml4IGZlYXR1cmVzIHJlcXVpcmVkIChmbGFrZXMp DQoNCiAgT3V0c2lkZSB0aGUgaG9tZXBhZ2UsIGl0IHdvdWxkIGJlIHdvcnRoIGNoZWNraW5nIHRo ZSBbPGFiYnINCiAgdGl0bGU9ImZyZXF1ZW50bHkgYXNrZWQgcXVlc3Rpb25zIj5GQVFzPC9hYmJy Pl0gaWYgYW55IC93aGF0cy8gb3INCiAgL3doeXMvIGNvbWUgdXAuDQoNCg0KW05peHRhbWFsXSA8 aHR0cHM6Ly9uaXh0YW1hbC50b2FzdC5hbD4NCg0KW0tETF0gPGh0dHBzOi8va2RsLmRldj4NCg0K W0RhcmNzXSA8aHR0cHM6Ly9kYXJjcy5uZXQ+DQoNCltQaWp1bF0gPGh0dHBzOi8vcGlqdWwub3Jn Pg0KDQpbRm9zc2lsXSA8aHR0cHM6Ly9mb3NzaWwtc2NtLm9yZz4NCg0KWzxhYmJyIHRpdGxlPSJm cmVxdWVudGx5IGFza2VkIHF1ZXN0aW9ucyI+RkFRczwvYWJicj5dDQo8aHR0cHM6Ly9uaXh0YW1h bC50b2FzdC5hbC9mYXFzLz4NCg0KDQpPQ2FtbC1SREYgMS4yLjANCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1 c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXJkZi0xLTItMC8xNzg5MC8xPg0KDQoNClpvZ2d5IGFu bm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgSGVsbG8sDQoNCiAgQSBuZXcgcmVsZWFzZSBvZiBPQ2FtbC1SREYsIFsxLjIuMF0sIGlzIGF2 YWlsYWJsZS4gVGhlIG1haW4gYWRkaXRpb25zDQogIGFyZToNCg0KICDigKIgYSBuZXcgW0lncmFw aF0gbW9kdWxlLCBwcm92aWRpbmcgaW1tdXRhYmxlIGdyYXBocyAoZm9yIGZ1bmN0aW9uYWwNCiAg ICBzdHlsZSkuDQogIOKAoiBhIG5ldyBbcmRmX3JkZmFdIHBhY2thZ2UgaW1wbGVtZW50aW5nIGEg W1JkZmEgMS4xXSBwcm9jZXNzb3IuDQoNCiAgSXQgaXMgYXZhaWxhYmxlIGZyb20gW215IG93biBv cGFtIHJlcG9zaXRvcnldLg0KDQoNClsxLjIuMF0gPGh0dHBzOi8vd3d3Lmdvb2QtZXJpcy5uZXQv b2NhbWwtcmRmL3Bvc3RzL29jYW1sLXJkZi0xLjIuMC5odG1sPg0KDQpbSWdyYXBoXQ0KPGh0dHBz Oi8vd3d3Lmdvb2QtZXJpcy5uZXQvb2NhbWwtcmRmL3JlZmRvYy9yZGYvUmRmL0lncmFwaC9pbmRl eC5odG1sPg0KDQpbcmRmX3JkZmFdDQo8aHR0cHM6Ly93d3cuZ29vZC1lcmlzLm5ldC9vY2FtbC1y ZGYvcmVmZG9jL3JkZl9yZGZhL2luZGV4Lmh0bWw+DQoNCltSZGZhIDEuMV0gPGh0dHBzOi8vd3d3 LnczLm9yZy9UUi9yZGZhLWNvcmU+DQoNCltteSBvd24gb3BhbSByZXBvc2l0b3J5XSA8aHR0cHM6 Ly9mcmFtYWdpdC5vcmcvem9nZ3kvb3BhbS1yZXBvc2l0b3J5Pg0KDQoNClNsaXBzaG93IQ0K4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5v Y2FtbC5vcmcvdC9hbm4tc2xpcHNob3cvMTYzMzcvMjI+DQoNCg0KQ29udGludWluZyB0aGlzIHRo cmVhZCwgUGF1bC1FbGxpb3QgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJ dCBpcyB3aXRoIGEgYmxhdGFudCBkZW5pYWwgb2YgdGhlIGN1cnJlbnQgc2l0dWF0aW9uIHRoYXQg SSBhbm5vdW5jZQ0KICB0aGUgbmV4dCByZWxlYXNlIG9mIFNsaXBzaG93Og0KDQoNClNsaXBzaG93 IDAuMTAuMDogRG9uJ3QgbG9vayBge3VwfScNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjA0KDQogIFRoZSArYXN0ZXJvaWQrIHN0YXIgb2YgdGhlIHJlbGVhc2Ug aXMgdGhlIG5ldyB3YXJuaW5ncyB0aGF0IHRoZQ0KICBjb21waWxlciBjYW4gcmFpc2UgdG8gaGVs cCB5b3Ugd3JpdGUgYSBidWctZnJlZSBwcmVzZW50YXRpb24uIFRob3NlDQogIHdhcm5pbmdzIGFy ZSB2aXNpYmxlIG9uIHRoZSBjb21tYW5kLWxpbmUsIGJ1dCBhbHNvIGluIHRoZQ0KICBob3QtcmVs b2FkaW5nIHByZXZpZXcgaW4gYHNlcnZlJyBtb2RlIQ0KDQogIDxodHRwczovL2dpdGh1Yi5jb20v dXNlci1hdHRhY2htZW50cy9hc3NldHMvZjc4NTY4ZTUtZGJiZi00OWUzLTljZDMtOGQyZTVjNGVk ZmRhPg0KDQogIFdhcm5pbmdzIHdpbGwgaG9wZWZ1bGx5IGhlbHAgZGV0ZWN0IGJ1Z3MgaW4geW91 ciBwcmVzZW50YXRpb25zIGFuZA0KICBpbXByb3ZlIHRoZSBleHBlcmllbmNlLCBlc3BlY2lhbGx5 IG9mIG5ld2NvbWVycyENCg0KICBUaGlzIHRpbWUsIEknZCBsaWtlIHRvIHRoYW5rcyBAQWxpc3Rh aXIgZm9yIHRoZSBpbmNyZWRpYmxlIFtHcmFjZSDwn5KFXQ0KICBsaWJyYXJ5LiBXaGVuZXZlciBJ IGxvb2sgc29tZXdoZXJlLCBJIGZpbmQgYSBuZXcgT0NhbWwgcGVhcmwuIFRoYW5rDQogIHlvdSBm b3IgdGhhdCEgVGhpcyBsaWJyYXJ5LCB0aGUgZWNvc3lzdGVtLCBvcGVuLXNvdXJjZSwgYXJlIGFs bA0KICBhd2Vzb21lIHRoaW5ncy4NCg0KICBBbmQgdGhhbmtzIGFnYWluIHRvIE5MTmV0IGZvciBb c3VwcG9ydGluZ10gdGhlIGRldmVsb3BtZW50IG9mDQogIFNsaXBzaG93IQ0KDQogIEhlcmUgaXMg dGhlIGZ1bGwgY2hhbmdlbG9nOg0KDQoNCltHcmFjZSDwn5KFXSA8aHR0cHM6Ly9naXRodWIuY29t L2pvaG55b2IvZ3JhY2U+DQoNCltzdXBwb3J0aW5nXSA8aHR0cHM6Ly9ubG5ldC5ubC9wcm9qZWN0 L1NsaXBzaG93Lz4NCg0KDQpBZGRlZA0K4pWM4pWM4pWM4pWM4pWMDQoNCiAg4oCiIEhlbHBmdWwg d2FybmluZ3MgYXQgY29tcGlsZS10aW1lICgjMjEzKToNCiAgICDigKIgQWN0aW9uIHBhcnNpbmcg ZmFpbHVyZXMsDQogICAg4oCiIE1pc3NpbmcgSUQgKGFuZCBgZXh0ZXJuYWwtaWRzJyBmcm9udG1h dHRlciBmaWVsZCB0byBzZWxlY3RpdmVseQ0KICAgICAgZGVhY3RpdmF0ZSksDQogICAg4oCiIER1 cGxpY2F0ZWQgSUQsDQogICAg4oCiIEZyb250bWF0dGVyIHBhcnNpbmcgZXJyb3IsDQogICAg4oCi IFdyb25nIHRhcmdldCB0eXBlIGZvciBhY3Rpb25zLA0KICAgIOKAoiBNaXNzaW5nIGZpbGUsDQog ICAg4oCiIFVua25vd24gYXR0cmlidXRlLA0KICAgIOKAoiDigKYNCg0KDQpGaXhlZA0K4pWM4pWM 4pWM4pWM4pWMDQoNCiAg4oCiIEZpeGVkIGRyYXdpbmcgc3RvcHBpbmcgc2xpZ2h0bHkgYWZ0ZXIg cGF1c2VzICgjMjE2KQ0KICDigKIgRml4ZWQga2V5Ym9hcmQgc2hvcnRjdXRzIG5vdCB3b3JraW5n IGluIHNlcnZlIG1vZGUgdW50aWwgdGhlIHByZXZpZXcNCiAgICB3YXMgY2xpY2tlZCAoIzIxNSkN CiAg4oCiIEZpeCBzaG9ydGN1dHMgbm90IHdvcmtpbmcgYWZ0ZXIgc2F2aW5nIGEgZHJhd2luZyAo IzIxNykNCiAg4oCiIEZpeCB3cm9uZyBleGFtcGxlIGxpbmtzIGluIGRvY3MgKCMyMTgpDQoNCg0K SXMgdGhlcmUgYSBwdWJsaWMgYXJjaGl2ZSBmb3IgdGhlIGNhbWwtbGlzdD8NCuKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvaXMt dGhlcmUtYS1wdWJsaWMtYXJjaGl2ZS1mb3ItdGhlLWNhbWwtbGlzdC8xNjM3NC82Pg0KDQoNCkNv bnRpbnVpbmcgdGhpcyB0aHJlYWQsIENhbGFzY2liZXR0YSBSb21haW4gYW5ub3VuY2VkDQrilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIZWxsbywgSSBh bSBwbGVhc2VkIHRvIGFubm91bmNlIHRoZSBsYXVuY2ggb2YNCiAgPGh0dHBzOi8vY2FtbC1saXN0 LnJvYnVyLmNvb3AvPiwgYSB1bmlrZXJuZWwgdGhhdCBwcm92aWRlcyBhIHNlYXJjaA0KICBlbmdp bmUgZm9yIHRoZSBjYW1sLWxpc3QuIFdlIG5vdyBoYXZlIHB1YmxpYyBhY2Nlc3MgdG8gdGhpcyBh cmNoaXZlDQogIDp0YWRhOiENCg0KICBPdXIgY29vcGVyYXRpdmUgaXMgY3VycmVudGx5IHdvcmtp bmcgb24gc2V2ZXJhbCBmcm9udHMsIGluY2x1ZGluZw0KICBlbWFpbCwgYnkgb2ZmZXJpbmcgYW4g YXJjaGl2aW5nIHN5c3RlbS4gRm9yIG1vcmUgZGV0YWlscywgcGxlYXNlIHNlZQ0KICBbdGhpcyBh cnRpY2xlXS4gQW5vdGhlciBhcnRpY2xlIGRlc2NyaWJlcyBbdGhlIHNlYXJjaCBlbmdpbmVdIHdl IHVzZSwNCiAgYW5kIGEgdGhpcmQgZXhwbGFpbnMgW2hvdyB3ZSBkZXZlbG9wZWQgdGhpcyB1bmlr ZXJuZWxdIChhbHRob3VnaCB0aGUNCiAgbGF0dGVyIGhhcyBldm9sdmVkIGNvbnNpZGVyYWJseSBz aW5jZSB0aGVuLCB0aGUgY29yZSByZW1haW5zIHRoZQ0KICBzYW1lKS4NCg0KICBXZSBhcmUgdGhl cmVmb3JlIGRlbGlnaHRlZCB0byBtYWtlIHRoaXMgc2VydmljZSBhdmFpbGFibGUgdG8gdGhlDQog IGNvbW11bml0eSwgYW5kIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGhlbHAgdXMgaW1wcm92ZSBpdCwg dGhlIHByb2plY3QgaXMNCiAgY3VycmVudGx5IGF2YWlsYWJsZSBbaGVyZV0uIFdlIHdvdWxkIGxp a2UgdG8gdGhhbmsgW05MbmV0XSBmb3IgZnVuZGluZw0KICB0aGlzIHVuaWtlcm5lbCwgYW5kIGlm IHlvdSBhcHByZWNpYXRlIG91ciB3b3JrLCBwbGVhc2UgZG8gbm90IGhlc2l0YXRlDQogIHRvIG1h a2UgYSBkb25hdGlvbiB0byBvdXIgY29vcGVyYXRpdmUgKHZpYSBbR2l0SHViXSBvciBbZGlyZWN0 bHkgdG8NCiAgb3VyIGNvb3BlcmF0aXZlXSkNCg0KICBGaW5hbGx5LCB0aGlzIGV4YW1wbGUgYWxz byBzaG93Y2FzZXMgYWxsIG91ciB3b3JrIG9uIHVuaWtlcm5lbHM6IGZyb20NCiAgd2hhdCBhbiBF dGhlcm5ldCBmcmFtZSBpcywgdGhyb3VnaCB0aGUgYXJjaGl2ZSBzeXN0ZW0gYW5kIHRoZQ0KICBl eHRyYWN0aW9uIG9mIGVtYWlscyBmcm9tIGEgdmlydHVhbGlzZWQgaGFyZCBkcml2ZSwgcmlnaHQg dXAgdG8gdGhlDQogIEhUVFAgcmVxdWVzdCAtICpldmVyeXRoaW5nIGlzIGRvbmUgaW4gT0NhbWwq IChhbmQgd2Ugd291bGQgb25jZSBhZ2Fpbg0KICByZWNvbW1lbmQgcmVhZGluZyBvdXIgdHV0b3Jp YWwgb24gW21uZXRdIGlmIHlvdSB3b3VsZCBsaWtlIHRvIGJ1aWxkIHVwDQogIHVuaWtlcm5lbHMp Lg0KDQogIFNvIGhhdmUgZnVuIGh1bnRpbmcgZm9yIHJlbGljcyBmcm9tIHRoZSBoaXN0b3J5IG9m IE9DYW1sIQ0KDQoNClt0aGlzIGFydGljbGVdDQo8aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0 aWNsZXMvMjAyNS0wMS0wNy1jYXJ0b24tYW5kLWNhY2hldC5odG1sPg0KDQpbdGhlIHNlYXJjaCBl bmdpbmVdDQo8aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvcHR0X3N0ZW1fYW5kX3Nl YXJjaF9lbmdpbmUuaHRtbD4NCg0KW2hvdyB3ZSBkZXZlbG9wZWQgdGhpcyB1bmlrZXJuZWxdDQo8 aHR0cHM6Ly9ibG9nLnJvYnVyLmNvb3AvYXJ0aWNsZXMvMjAyNS0wNC0xMi1wdHQtc2VhcmNoLXdl YmFwcC5odG1sPg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL2JsYW1l Pg0KDQpbTkxuZXRdIDxodHRwczovL25sbmV0Lm5sLz4NCg0KW0dpdEh1Yl0gPGh0dHBzOi8vZ2l0 aHViLmNvbS9zcG9uc29ycy9yb2J1ci1jb29wPg0KDQpbZGlyZWN0bHkgdG8gb3VyIGNvb3BlcmF0 aXZlXSA8aHR0cHM6Ly9yb2J1ci5jb29wL0RvbmF0ZT4NCg0KW21uZXRdIDxodHRwczovL3JvYnVy LWNvb3AuZ2l0aHViLmlvL21uZXQvPg0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIElmIHlvdSBoYXBwZW4gdG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1l c3NhZ2VdIGFuZCBJJ2xsIG1haWwNCiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBb dGhlIGFyY2hpdmVdIG9yIHRoZSBbUlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJ ZiB5b3UgYWxzbyB3aXNoIHRvIHJlY2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5 IHN1YnNjcmliZQ0KICB0byB0aGUgW2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0K DQpbc2VuZCBtZSBhIG1lc3NhZ2VdIDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUu b3JnPg0KDQpbdGhlIGFyY2hpdmVdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+ DQoNCltSU1MgZmVlZCBvZiB0aGUgYXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUu bmV0L2N3bi9jd24ucnNzPg0KDQpbY2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9z eW1wYS9pbmZvL2NhbWwtbGlzdD4NCg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRp dGVwb21tZS5uZXQvPg0KDQo= --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 10 to 17, 2026.

    Public securiy meeting

    Hannes Mehnert announced

    Dear everyone,

    as a reminder =E2=80=93 next week Thursday (March 19th) 14:00 CEST, there w= ill be a public OCaml security meeting hosted by the https://ocaml.org/security team. We will meet at https://meet.bo= rnhack.dk/OCamlSecurityPublicMeeting

    Our agenda and notes will be at https://pad.data.coop/Ie5voBePSiKvjZdEko6otQ#

    If you're curious, the notes from our last meeting are at https://pad.data.coop/7-Ic5rG6Toyns= W02hJsndg

    Hope to see you there!

    Google OR-Tools: CP-SAT Subset

    Timothy Bourke announced

    The Google OR-Tools<= /a> are a suite of tools for solving optimization problems. They include, i= n particular, CP-SAT, which is a powerful constraint solver and optimizer for integer linear = programming and boolean satisfiability problems.

    The ocaml-ortools pa= ckage provides an OCaml interface to a subset of CP-SAT constraints. It com= prises two parts `ortools`, which allows modelling constraint problems in O= Caml and translating them to a protocol buffer format (thanks to ocaml-protc), and `ortools_so= lvers`, which allows an embedded version of CP-SAT to be called directly fr= om OCaml. Both parts can be installed using opam or built with dune. The la= tter includes the source of OR-Tools 9.15 which is built together with most= of its libraries and installed as part of the opam package.

    Some simple examples can be found in the online documentation and source code= . They can be built using the following commands.

    opam install ortools ortools_solvers
    ocamlfind ocamlopt -o prog -package ortools -package ortools_solvers -linkp=
    kg prog.ml
    

    I would be happy to accept pull requests for the missing CP-SAT constraints= (I think it best to develop the interface together with real applications,= and I only need the ILP and boolean parts at the moment), to translate mor= e of the standard example programs (an easy way to contribute), and to incl= ude other solvers from the suite (likely to involve solving tedious compila= tion and compatibility problems across multiple platforms).

    Thanks to @nojb, @Rucikir , and others for their help<= /a> with dun= e, and @xvw and @panglesd for their help with odoc. Thanks to @jmid , @mseri , and @avsm for= discussing and merging my opam-repository pull requests.

    Neocaml-mode (A modern Emacs major mode for OCaml) is looking = for testers

    Continuing this thread, Bozhidar Batsov announced

    FYI - ht= tps://github.com/bbatsov/neocaml/releases/tag/v0.4.0

    You'll need to update your Tree-sitter grammars due to some upstream (break= ing) changes in the TS OCaml grammar.

    oui: multi-platform binary installers

    Nathan Rebours announced

    We are happy to announce the first release of oui!

    oui is a tool that generates multi-platform binary installers = for your OCaml applications. It can generate installers for Windows, Linux = and MacOS. We hope it will help all of you out there developping applications for non = OCaml developers, allowing your users to install your programs without havi= ng to install OCaml and/or opam, thus greatly simplifying their user experi= ence.

    You can install oui with the following command:

    opam install oui
    

    We made it as generic as possible to ensure it works for everyone. You invo= ke it as follows:

    oui build oui.json install-bundle
    

    where install-bundle is a folder containing your precompiled b= inaries and any files you want to install alongside them, arranged in any w= ay you'd like. The oui.json file is a configuration file that contains metada= ta and information on the installation bundle's layout such as where to fin= d binaries to add to the PATH or where to find manpages.

    oui can also create installers for plugins, assuming the main = application was either installed by a oui generated installer,= or was installed following some basic rules.

    The project is hosted on github: https://github.com/OCamlPro/ocaml-universal-install= er The full documentation is available here. In particula= r, you can find guidelines on how to use it to create installers for your d= une built project here.

    Please go ahead and give it a try, we'd love to hear your feedback.

    We welcome external contributors so if you'd like to take part in the proje= ct, please read our CONTRIBUTING.md and jump in!

    The project is still in a relatively early stage and there are some key fea= tures we'd like to add, such as streamlining the user experience for dune p= rojects (removing the necessity to maintain a separate configuration file f= or the most common use cases) or support for cross-compilation/cross-platfo= rm installer generation. If those features sound interesting to you and you= would like to fund their development, please reach out to contact@ocamlpro= .com .

    Finally, we'd like to thank our partner CEA-list who funded the initial dev= elopment of oui from opam-wix and made it all pos= sible!

    Happy installing!

    Nixtamal: Fulfilling Input Pinning for Nix

    toastal announced

    Nixtamal is my first serious OCam= l project release, now at verison 1.1.4. It was created as a reaction to th= e lack of features I wanted from its =E2=80=9Ccompetitors=E2=80=9D ni= v & npins while additionally covering features Nix = flakes never could support given it=E2=80=99s rigid design philosophy which= has more drawbacks than folks initially realize. I have been using it on a= ll projects for a couple months now & had at least a couple folks I did= n=E2=80=99t know prior try it out providing feedback & bug reports.

    Key features:

    • Automate the manual work of input pinning for dependency management
    • Allow easy ways to lock & refresh those inputs
    • Declarative KDL manifest file over impe= rative <abbr title=3D"command line interface">CLI</abbr> flags<= /li>
    • Host, forge, <abbr title=3D"version control system">VCS</abbr&= gt;-agnostic
    • Choose <abbr title=3D"evaluation">eval</abbr> time fetchers= (builtins) or build time fetchers (Nixpkgs, default) =E2=80=94 which opens= up fetching now-supported Darcs, Pijul, & = Fossil
    • Supports mirrors (on kinds that support mirrors)
    • Override hash algorithm on a per-project & per-input basis =E2=80= =94 including BLAKE3 support (which does r= equire enabling `blake3-hashes` to opt in)
    • Custom freshness commands (avoid refetching massive inputs just to chec= k the hash hasn=E2=80=99t changed)
    • No experimental Nix features required (flakes)

    Outside the homepage, it would be worth checking the <abbr title=3D"frequently asked questions">FAQs= </abbr> if any whats or whys come up.

    OCaml-RDF 1.2.0

    Zoggy announced

    Hello,

    A new release of OCaml-RDF, 1.2.0, is available. The main additions are:

    • a new Igraph module, providing immutable graphs (for function= al style).
    • a new rdf_rdfa package implementing a Rdfa 1.1 processor.

    It is available from my own opam repository.

    Slipshow!

    Continuing this thread, Paul-Elliot announced

    It is with a blatant denial of the current situation that I announce the ne= xt release of Slipshow:

    Slipshow 0.10.0: Don't look {up}

    The asteroid star of the release is the new warnings that the co= mpiler can raise to help you write a bug-free presentation. Those warnings = are visible on the command-line, but also in the hot-reloading preview in <= code>serve mode!

    https://github.com/user-attachments/assets/f78568e5-dbbf-4= 9e3-9cd3-8d2e5c4edfda

    Warnings will hopefully help detect bugs in your presentations and improve = the experience, especially of newcomers!

    This time, I'd like to thanks @Alistair for the incredible Grace =F0=9F=92=85 library. Whenever I loo= k somewhere, I find a new OCaml pearl. Thank you for that! This library, th= e ecosystem, open-source, are all awesome things.

    And thanks again to NLNet for supporting the development of Slipshow!

    Here is the full changelog:

    Added

    • Helpful warnings at compile-time (#213):
      • Action parsing failures,
      • Missing ID (and external-ids frontmatter field to selectiv= ely deactivate),
      • Duplicated ID,
      • Frontmatter parsing error,
      • Wrong target type for actions,
      • Missing file,
      • Unknown attribute,

    Fixed

    • Fixed drawing stopping slightly after pauses (#216)
    • Fixed keyboard shortcuts not working in serve mode until the preview was clicked (#215)
    • Fix shortcuts not working after saving a drawing (#217)
    • Fix wrong example links in docs (#218)

    Is there a public archive for the caml-list?

    Continuing this thread, Calascibetta Romain announced=

    Hello, I am pleased to announce the launch of https://caml-list.robur.coop/, a unikernel that provides a= search engine for the caml-list. We now have public access to this archive= :tada:!

    Our cooperative is currently working on several fronts, including email, by= offering an archiving system. For more details, please see this articl= e. Another article describes the search engine we use, and a thir= d explains how we developed this unikernel (although the latter has= evolved considerably since then, the core remains the same).

    We are therefore delighted to make this service available to the community,= and if you would like to help us improve it, the project is currently avai= lable here. We would li= ke to thank NLnet for funding this uniker= nel, and if you appreciate our work, please do not hesitate to make a donat= ion to our cooperative (via GitHub or directly to our coo= perative)

    Finally, this example also showcases all our work on unikernels: from what = an Ethernet frame is, through the archive system and the extraction of emai= ls from a virtualised hard drive, right up to the HTTP request - everyth= ing is done in OCaml (and we would once again recommend reading our tut= orial on mnet if you wou= ld like to build up unikernels).

    So have fun hunting for relics from the history of OCaml!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=gtyEu5LY; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id EB78E400A2 for ; Tue, 24 Mar 2026 09:58:21 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=TZ0M/ij2qif/o09jsx1TjgUCuT1zkSkIkyfE4q/Z1E8=; b=gtyEu5LYs0KVWJB10uPg/qBNwUBO+w2OScGD0/QJN9zJiepSwK3FgXTF x8mfvVlpk8ESQ8BNxDji9pcRt6WDV6KjBTB2b+PGDASkQzDcOSeKStvGH vbfqfyGAWDmXB5flkWSXeaWEi3EKSN8bLCMk9JjkNcuQp6lONoIF4YyYX w=; X-CSE-ConnectionGUID: REsEHG4aTvGzwIKbwtzg3g== X-CSE-MsgGUID: +J4VDfs4T4q95ejV9lRbaw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 include:mailout.safebrands.com a:basic-mail.safebrands.com a:basic-mail01.safebrands.com a:basic-mail02.safebrands.com ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,138,1770591600"; d="scan'208,217";a="269190315" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 24 Mar 2026 10:58:18 +0100 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 8192982B99; Tue, 24 Mar 2026 10:58:18 +0100 (CET) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id E019581672 for ; Tue, 24 Mar 2026 10:58:08 +0100 (CET) X-CSE-ConnectionGUID: ABnNY9wUS42L/vEgDMujqA== X-CSE-MsgGUID: 5n5hNDnBSSmQqzQ3BIpe2g== IronPort-SDR: 69c2602f_MXB6zCkFf1W5aR0S5M0sgNzJq08lnCJYwA9/JgbF8rb7Rt+ qwDlialUmd2m09wUFxQiYJAT6KDv+WkGAXB4C/Q== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0FyAwB+XsJphSIeaIFahBaBBBoBbF8zBwhJVYQDgWOBb?= =?us-ascii?q?I4lnEiBaYEsFhgLFQEDAQ0uARUKAQIEAQEDAQIBg0lxRgIWjQ4CHwYBBDQTA?= =?us-ascii?q?QIEAQEBAQMCAwEBAQEBAQEBAQ0BAQUBAQECAQECBAYBAhABAQEBQEmGFQczD?= =?us-ascii?q?YJFUXFgBAMGOAEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQIECAGBJwQGEwEBOBgjAxAEAQYDAgQNATUXARIagmgBgiACAk8DB?= =?us-ascii?q?QwGlRebRHp/M4EBggwBAQaBCD4CEw/aQIFnCYFNhW+CShwBKklsAQKETgmEN?= =?us-ascii?q?icPgVVEgyBub4JKFwEBAQGBKQERAgEaDyQJgyWCaYImehQdgWIFhA4GhCoFH?= =?us-ascii?q?TWHDoFEIgMmMywBVRMXCwcFXoEIAyovLW4yHYEjPhc0WBsHBYJJD4hxgWGBE?= =?us-ascii?q?4QjAwttPTcUG41VQxk2gTgvDkAwGwwJGhMBKQIgAjYOFRU1IxwuCz2SVygqA?= =?us-ascii?q?p1ylGM0B4QfgV4GDIkIgSaWB4QEjROZVCKYZCKJXoEmCYFva4h5jGcIC4VFg?= =?us-ascii?q?X8jbD8xMxowQw0GgiABMwlGHA+JNoRJhCJvT4EmgXQ7wxZCNQIBATsHAgcOA?= =?us-ascii?q?oVOHQEBjDqBSwEB?= IronPort-PHdr: A9a23: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 Xh9Cmw5XkKRy43Z7Vz0t40= IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:5prJG6ixCMg4b2jMCP2aL9Ufw3BQXtkji2hC6mlwRA09TyXPrb HMoB17726TtN9/YhsdcLy7VJVoBEmskKKdgrNhWotKPjOGhILAFugLhrcKgQeQfxEWkNQz6U 4KScZD4bPLYGSSpPyKgjVQa+xB/OW6 X-Talos-CUID: 9a23:5R2402+aEV8BE1RYg8qVv2c+HOYUI2Lg9yuKBwimJGlFbaCXUHbFrQ== X-Talos-MUID: 9a23:3wEShwXSupNlzaTq/GLq2TFEGMFC2J+rMVkfqM4smtGJbyMlbg== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,138,1770591600"; d="scan'208,217";a="142163686" X-MGA-submission: =?us-ascii?q?MDFpUl+YKSw6pPjiLqFymkFcbb6AUT6x9LeB5+?= =?us-ascii?q?cLMaTQ4RFtWdaWyML0YOhrojR4lDmqsQBQktm1CpLfAJpGRLPhTCKUpZ?= =?us-ascii?q?SAS+F7LSdDoYyQ56KSRv80l4x0pxTK33RsWwwWHMJHxoZq4c9nRb3YMt?= =?us-ascii?q?yxYs5RvzzVnyOubgXluqLt4A=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 24 Mar 2026 10:58:08 +0100 Received: from TM.local (unknown [131.254.161.240]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 0D19F1A425; Tue, 24 Mar 2026 10:58:07 +0100 (CET) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 24 Mar 2026 10:58:06 +0100 Message-ID: MIME-Version: 1.0 Content-Type: multipart/alternative; boundary="=-=-=" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 24 10:58:07 2026 +0100 (CET)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.500000, queueID=320D71A405 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19474 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --=-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMTcgdG8gMjQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkludHJvZHVj aW5nIGF0ZG1sIChleHBlcmltZW50YWwpDQpFeHBlcmltZW50YWwgbW9kdWxlIGltcG9ydHMgaW4g QVREIChBVEQgNC4wLjApDQpEdW5lIDMuMjINClBhcnNlZmY6IHBhcnNlciBjb21iaW5hdG9yIGxp YnJhcnkgZm9yIE9DYW1sIDUNCk91dHJlYWNoeSBEZW1vIERheSBmb3IgRGVjZW1iZXIgMjAyNSBS b3VuZA0KT2xkIENXTg0KDQoNCkludHJvZHVjaW5nIGF0ZG1sIChleHBlcmltZW50YWwpDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0 cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1pbnRyb2R1Y2luZy1hdGRtbC1leHBlcmltZW50 YWwvMTc5MDgvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoN CiAgQVREIDQuMC4wIHdhcyByZWxlYXNlZCB0b2RheSBvbiBvcGFtLg0KDQogIFRoaXMgcmVsZWFz ZSBpbnRyb2R1Y2VzICphdGRtbCosIGFuIGV4cGVyaW1lbnRhbCByZXBsYWNlbWVudCBmb3INCiAg YXRkZ2VuLg0KDQogIFRoZSBnb2FsIGlzIHRvIG1vZGVybml6ZSB0aGUgaW1wbGVtZW50YXRpb24g YW5kIG1ha2UgaXQgZWFzaWVyIHRvDQogIGV4dGVuZCwgd2hpbGUga2VlcGluZyBjb21wYXRpYmls aXR5IHdpdGggZXhpc3RpbmcgQVREIHdvcmtmbG93cy4NCg0KICBIZXJlJ3MgYSBzYW1wbGUgaW5w dXQgZmlsZSBgZXhhbXBsZS5hdGQnOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIHR5cGUgbG9j YXRpb24gPSB7DQogIOKUgiAgIHJvdzogaW50Ow0KICDilIIgICBjb2x1bW46IGludDsNCiAg4pSC ICAgP2ZpbGU6IHN0cmluZyBvcHRpb247DQogIOKUgiB9DQogIOKUlOKUgOKUgOKUgOKUgA0KDQog IEF0ZG1sIGlzIGludm9rZWQgYXMgZm9sbG93cywgbm9ybWFsbHkgYnkgdGhlIGJ1aWxkIHN5c3Rl bToNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAkIGF0ZG1sIGV4YW1wbGUuYXRkDQogIOKUlOKU gOKUgOKUgOKUgA0KDQogIEl0IHByb2R1Y2VzIGEgcGFpciBvZiBtbGkgYW5kIG1sIGZpbGVzLiBU aGlzIGlzIGBleGFtcGxlLm1saSc6DQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgKCogQXV0by1n ZW5lcmF0ZWQgZnJvbSAiZXhhbXBsZS5hdGQiIGJ5IGF0ZG1sLiAqKQ0KICDilIIgDQogIOKUgiB0 eXBlIGxvY2F0aW9uID0gew0KICDilIIgICByb3c6IGludDsNCiAg4pSCICAgY29sdW1uOiBpbnQ7 DQogIOKUgiAgIGZpbGU6IHN0cmluZyBvcHRpb247DQogIOKUgiB9DQogIOKUgiANCiAg4pSCIHZh bCBjcmVhdGVfbG9jYXRpb24gOiByb3c6aW50IC0+IGNvbHVtbjppbnQgLT4gP2ZpbGU6c3RyaW5n IC0+IHVuaXQgLT4gbG9jYXRpb24NCiAg4pSCIHZhbCBsb2NhdGlvbl9vZl95b2pzb24gOiBZb2pz b24uU2FmZS50IC0+IGxvY2F0aW9uDQogIOKUgiB2YWwgeW9qc29uX29mX2xvY2F0aW9uIDogbG9j YXRpb24gLT4gWW9qc29uLlNhZmUudA0KICDilIIgdmFsIGxvY2F0aW9uX29mX2pzb24gOiBzdHJp bmcgLT4gbG9jYXRpb24NCiAg4pSCIHZhbCBqc29uX29mX2xvY2F0aW9uIDogbG9jYXRpb24gLT4g c3RyaW5nDQogIOKUgiANCiAg4pSCIG1vZHVsZSBMb2NhdGlvbiA6IHNpZw0KICDilIIgICB0eXBl IG5vbnJlYyB0ID0gbG9jYXRpb24NCiAg4pSCICAgdmFsIGNyZWF0ZSA6IHJvdzppbnQgLT4gY29s dW1uOmludCAtPiA/ZmlsZTpzdHJpbmcgLT4gdW5pdCAtPiB0DQogIOKUgiAgIHZhbCBvZl95b2pz b24gOiBZb2pzb24uU2FmZS50IC0+IHQNCiAg4pSCICAgdmFsIHRvX3lvanNvbiA6IHQgLT4gWW9q c29uLlNhZmUudA0KICDilIIgICB2YWwgb2ZfanNvbiA6IHN0cmluZyAtPiB0DQogIOKUgiAgIHZh bCB0b19qc29uIDogdCAtPiBzdHJpbmcNCiAg4pSCIGVuZA0KICDilJTilIDilIDilIDilIANCg0K ICBSZWxlYXNlIG5vdGVzOiA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQvcmVsZWFzZXMv dGFnLzQuMC4wPg0KDQogIERvY3VtZW50YXRpb246IDxodHRwczovL2F0ZC5yZWFkdGhlZG9jcy5p by8+DQoNCiAgUHJvamVjdCBwYWdlOiA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQ+DQoN Cg0KRXhwZXJpbWVudGFsIG1vZHVsZSBpbXBvcnRzIGluIEFURCAoQVREIDQuMC4wKQ0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2Ft bC5vcmcvdC9hbm4tZXhwZXJpbWVudGFsLW1vZHVsZS1pbXBvcnRzLWluLWF0ZC1hdGQtNC0wLTAv MTc5MDkvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAg QVREIDQuMC4wIGFkZHMgZXhwZXJpbWVudGFsIHN1cHBvcnQgZm9yIGltcG9ydHMgYmV0d2VlbiBB VEQgZmlsZXMuDQoNCiAgVGhpcyBhbGxvd3Mgc3BsaXR0aW5nIHNjaGVtYXMgYWNyb3NzIG11bHRp cGxlIGZpbGVzIGluIGEgbmF0dXJhbCB3YXkuDQoNCiAgQ3VycmVudGx5IHN1cHBvcnRlZCBpbjoN CiAg4oCiIGF0ZG1sIChPQ2FtbCkNCiAg4oCiIGF0ZHB5IChQeXRob24pDQogIOKAoiBhdGR0cyAo VHlwZVNjcmlwdCkNCg0KICBFeGFtcGxlOg0KICDilIzilIDilIDilIDilIANCiAg4pSCIGZyb20g dXRpbHMgYXMgdSBpbXBvcnQgZW1haWwNCiAg4pSCIA0KICDilIIgdHlwZSBlbWFpbF9hZGRyZXNz ZXMgPSB1LmVtYWlsIGxpc3QNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRGV0YWlsczogPGh0dHBz Oi8vZ2l0aHViLmNvbS9haHJlZnMvYXRkL3JlbGVhc2VzL3RhZy80LjAuMD4NCg0KICBGb3IgYW4g ZWFybGllciBkaXNjdXNzaW9uIG9mIHRoZSBkZXNpZ24sIHNlZQ0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L3JmYy1tdWx0aWZpbGUtYXRkLWRlZmluaXRpb24tc3VwcG9ydC12aWEtaW1w b3J0LXN0YXRlbWVudHMvMTc4ODE+XS4NCg0KDQpEdW5lIDMuMjINCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5u LWR1bmUtMy0yMi8xNzkxMi8xPg0KDQoNClNob24gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGlzIHBsZWFzZWQg dG8gYW5ub3VuY2UgW3RoZSByZWxlYXNlIG9mIGR1bmUgMy4yMi4wXS4NCg0KICBJbiBhZGRpdGlv biB0byBtYW55IGZpeGVzIGFuZCBzbWFsbCBpbXByb3ZlbWVudHMsIG5vdGFibGUgaGlnaGxpZ2h0 cw0KICBvZiB0aGlzIHJlbGVhc2UgaW5jbHVkZToNCg0KICDigKIgRml4ZXMgdG8gdGhlIGR1bmUg Y2FjaGUgb24gV2luZG93cywgdGhhbmtzIHRvIFtATmV2b3JdIGluDQogICAgW29jYW1sL2R1bmUj MTM3MTNdLg0KICDigKIgTmV3IHRyYWNpbmcgZnVuY3Rpb25hbGl0eSwgdG8gaW5zcGVjdCBhbmQg ZGlhZ25vc2UgdGhlIGJ1aWxkDQogICAgcHJvY2Vzc2VzIHRoYW5rcyB0byBbQHJncmluYmVyZ10g YWNyb3NzIG1hbnkgUFJzLiBTZWUgW3RoZQ0KICAgIGRvY3VtZW50YXRpb25dLg0KICDigKIgQWRk aXRpb24gb2YgdGhlIGBkdW5lLWFjdGlvbi10cmFjZScgbGlicmFyeSwgdG8gaW5zdHJ1bWVudCB0 cmFjZQ0KICAgIGVtaXNzaW9uLCB0aGFua3MgdG8gW0ByZ3JpbmJlcmddLg0KICDigKIgU3VwcG9y dCBmb3IgZ2VuZXJhdGluZyBvZG9jIGRvY3VtZW50YXRpb24gaW4gbWFya2Rvd24gdmlhIHRoZQ0K ICAgIGBAZG9jLW1hcmtkb3duJyBidWlsZCBhbGlhcyB0aGFua3MgdG8gW0BkYXZlc254XSBbb2Nh bWwvZHVuZSMxMjU4MV0uDQogIOKAoiBGdWxsIHN1cHBvcnQgZm9yIE94Q2FtbCdzIHBhcmFtZXRl cmlzZWQgbGlicmFyaWVzLCB0aGFua3MgdG8NCiAgICBbQGFydC13XSBhbmQgW0BtYWlzdGVdLiBU byBsZWFybiBtb3JlLCBzZWUgW3RoZSBkb2NzXS4NCg0KICBTZWUgW3RoZSBmdWxsIGNoYW5nZWxv Z10gZm9yIGFsbCBuZXcgZmVhdHVyZXMgYW5kIGZpeGVzLCBhbmQgZm9yDQogIGF0dHJpYnV0aW9u IHRvIHRoZSBjb250cmlidXRvcnMgd2hvIG1hZGUgaXQgYWxsIHBvc3NpYmxlLiBUaGFuayB5b3Us DQogIGNvbnRyaWJ1dG9ycyENCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxlbSB3aXRoIHRo aXMgcmVsZWFzZSwgcGxlYXNlIHJlcG9ydCBpdCBpbiBbb3VyDQogIGlzc3VlIHRyYWNrZXJdLg0K DQoNClt0aGUgcmVsZWFzZSBvZiBkdW5lIDMuMjIuMF0NCjxodHRwczovL2dpdGh1Yi5jb20vb2Nh bWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMi4wPg0KDQpbQE5ldm9yXSA8aHR0cHM6Ly9naXRodWIu Y29tL05ldm9yPg0KDQpbb2NhbWwvZHVuZSMxMzcxM10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9kdW5lL3B1bGwvMTM3MTM+DQoNCltAcmdyaW5iZXJnXSA8aHR0cHM6Ly9naXRodWIuY29tL3Jn cmluYmVyZz4NCg0KW3RoZSBkb2N1bWVudGF0aW9uXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9j cy5pby9lbi9zdGFibGUvaGFja2luZy5odG1sI2luc3BlY3RpbmctdHJhY2VzLXdpdGgtanE+DQoN CltAZGF2ZXNueF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9kYXZlc254Pg0KDQpbb2NhbWwvZHVuZSMx MjU4MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTI1ODE+DQoNCltAYXJ0 LXddIDxodHRwczovL2dpdGh1Yi5jb20vYXJ0LXc+DQoNCltAbWFpc3RlXSA8aHR0cHM6Ly9naXRo dWIuY29tL21haXN0ZT4NCg0KW3RoZSBkb2NzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5p by9lbi9zdGFibGUvdHV0b3JpYWxzL294Y2FtbC1wYXJhbWV0ZXJpemVkLWxpYnJhcnkvaW5kZXgu aHRtbD4NCg0KW3RoZSBmdWxsIGNoYW5nZWxvZ10gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9k dW5lL3JlbGVhc2VzL3RhZy8zLjIyLjA+DQoNCltvdXIgaXNzdWUgdHJhY2tlcl0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcz4NCg0KDQpQYXJzZWZmOiBwYXJzZXIgY29tYmlu YXRvciBsaWJyYXJ5IGZvciBPQ2FtbCA1DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1wYXJzZWZmLXBhcnNl ci1jb21iaW5hdG9yLWxpYnJhcnktZm9yLW9jYW1sLTUvMTc5MTQvMT4NCg0KDQpEYXZpZCBTYW5j aG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBJ4oCZbSBzaGFy aW5nICpQYXJzZWZmKiwgYSBwYXJzZXIgY29tYmluYXRvciBsaWJyYXJ5IGZvciAqT0NhbWwgNSou DQoNCiAgSWYgeW91IGxpa2UgcGFyc2VyIGNvbWJpbmF0b3JzIGJ1dCBkb27igJl0IGxvdmUgd3Jp dGluZyBldmVyeXRoaW5nIGluDQogIG1vbmFkaWMgc3R5bGUsIFBhcnNlZmYgaXMgYnVpbHQgZm9y IHRoYXQuIFBhcnNlcnMgYXJlIHBsYWluIGZ1bmN0aW9ucw0KICAoYHVuaXQgLT4gJ2EnKSBhbmQg eW91IGNvbXBvc2UgdGhlbSBpbiBkaXJlY3Qgc3R5bGUsIHdoaWxlIFBhcnNlZmYNCiAgaGFuZGxl cyBiYWNrdHJhY2tpbmcgYW5kIHN0cmVhbWluZyB1bmRlciB0aGUgaG9vZCAodXNpbmcgZWZmZWN0 cyEpDQoNCg0KV2h5IFBhcnNlZmYNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0K DQogIOKAoiAqRGlyZWN0LXN0eWxlIEFQSSo6IHdyaXRlIHNlcXVlbnRpYWwgT0NhbWwgY29kZSwg bm8gYD4+PScsIGBsZXQqJywNCiAgICAgb3IgYXBwbGljYXRpdmUgb3BlcmF0b3IgY2hhaW5zIHJl cXVpcmVkLg0KICDigKIgKlR5cGVkIGVycm9ycyo6IHJhaXNlIGRvbWFpbiBlcnJvcnMgd2l0aCBw b2x5bW9ycGhpYyB2YXJpYW50cyB2aWENCiAgICAgYFBhcnNlZmYuZXJyb3InLg0KICDigKIgKlN0 cmVhbWluZyBpbnB1dCo6IHNhbWUgcGFyc2VyIHdvcmtzIHdpdGggYFBhcnNlZmYucGFyc2UnIChz dHJpbmcpDQogICAgIGFuZCBgUGFyc2VmZi5wYXJzZV9zb3VyY2UnIChzdHJlYW0pLg0KICDigKIg Klplcm8tY29weSArIGZ1c2VkIG9wcyo6IHNwYW4gQVBJcyBhbmQgZnVzZWQgb3BlcmF0aW9ucyBm b3IgaG90DQogICAgIHBhcnNpbmcgcGF0aHMuDQogIOKAoiAqRG9tYWluLXNhZmUgZXhlY3V0aW9u KjogcGFyc2UgY2FsbHMgYXJlIHNlbGYtY29udGFpbmVkIChubyBnbG9iYWwNCiAgICAgbXV0YWJs ZSBzdGF0ZSkuDQogIOKAoiBBdXRvbWF0aWMgYmFja3RyYWNraW5nIHdpdGggW2BQYXJzZWZmLm9y XyddDQogIOKAoiBNaW5pbWFsIGRlcGVuZGVuY3kgZm9vdHByaW50OiBvbmx5IGByZScgZm9yIHJl Z2V4DQoNCg0KW2BQYXJzZWZmLm9yXyddIDxodHRwczovL2RhdmVzbnguZ2l0aHViLmlvL3BhcnNl ZmYvYXBpL2NvbWJpbmF0b3JzLyNvcl8+DQoNCg0KUGVyZm9ybWFuY2UNCuKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEluIHRoZSBpbmNsdWRlZCBiZW5jaG1hcmtzLCBQYXJz ZWZmIGlzIGZhc3RlciB0aGFuIEFuZ3N0cm9tIGFuZA0KICBNUGFyc2VyOg0KDQogIOKAoiBhcm91 bmQgKn4yeCogaW4gZmFpciBjb21wYXJpc29ucw0KICDigKIgdXAgdG8gKn40eCsqIHdpdGggemVy by1jb3B5IG9wdGltaXplZCBwYXRocw0KICBCZW5jaG1hcmsgZGV0YWlscyBhbmQgY29kZSBhcmUg aW4gdGhlIHJlcG8gZG9jcy4NCg0KICAjIyBEb2N1bWVudGF0aW9uDQoNCiAgSeKAmXZlIHB1dCBh IGxvdCBvZiBlZmZvcnQgaW50byB0aGUgZG9jcyAocXVpY2sgc3RhcnQsIGd1aWRlcywgYW5kIEFQ SQ0KICBwYWdlcykgdG8ga2VlcCBQYXJzZWZmIGVhc3kgdG8gbGVhcm4uIEEgYml0IHByb3VkIG9m IHVzaW5nIG9kb2PigJlzDQogIE1hcmtkb3duIGJhY2tlbmQgcGx1cyBtZHgsIEkgY2FuIGdlbmVy YXRlIGFuZCBjaGVjayBleGFtcGxlcyBvbiB0aGUNCiAgZmx5LCBzbyBzbmlwcGV0cyBzdGF5IHR5 cGUtc2FmZS4NCg0KICA8aHR0cHM6Ly9kYXZlc254LmdpdGh1Yi5pby9wYXJzZWZmPg0KDQoNCklu c3RhbGwNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIg b3BhbSBpbnN0YWxsIHBhcnNlZmYgLXkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KTGlua3MNCuKV jOKVjOKVjOKVjOKVjA0KDQogIOKAoiBEb2NzOiA8aHR0cHM6Ly9kYXZlc254LmdpdGh1Yi5pby9w YXJzZWZmLz4NCiAg4oCiIENvbXBhcmlzb24gZ3VpZGU6DQogICAgPGh0dHBzOi8vZGF2ZXNueC5n aXRodWIuaW8vcGFyc2VmZi9ndWlkZXMvY29tcGFyaXNvbi8+DQogIOKAoiBHaXRIdWI6IDxodHRw czovL2dpdGh1Yi5jb20vZGF2ZXNueC9wYXJzZWZmPg0KDQogIElmIHlvdSB0cnkgaXQsIEnigJlk IHJlYWxseSB2YWx1ZSBmZWVkYmFjayBvbjogQVBJIGVyZ29ub21pY3MsIGVycm9yDQogIGhhbmRs aW5nIGV4cGVyaWVuY2Ugb3IgbWlzc2luZyBjb21iaW5hdG9ycyBvciBkb2NzIGdhcHMhDQoNCiAg VGhhbmtzIQ0KDQoNCk91dHJlYWNoeSBEZW1vIERheSBmb3IgRGVjZW1iZXIgMjAyNSBSb3VuZA0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9vdXRyZWFjaHktZGVtby1kYXktZm9yLWRlY2VtYmVyLTIwMjUtcm91bmQvMTc4ODMvNT4NCg0K DQpDb250aW51aW5nIHRoaXMgdGhyZWFkLCBQYXRyaWNrIEZlcnJpcyBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSByZWNvcmRpbmcgb2Ygb3VyIChuZWFy bHkgdHdvIGhvdXIhKSBtZWV0aW5nIGlzIG5vdyBvbmxpbmU6DQogIDxodHRwczovL3dhdGNoLm9j YW1sLm9yZy93LzhhVXFNaEZ2aFFHcTRXSkxIM3VrakE+ICENCg0KICBUaGFuayB5b3UgdG8gZXZl cnlvbmUgd2hvIGpvaW5lZCA6dHdvX2h1bXBfY2FtZWw6DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtz ZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2Ug YSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2 ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1h aWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBT Y2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9s eXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21t ZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5w ZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBh LmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6 Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --=-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 17 to 24, 2026.

    Introducing atdml (experimental)

    Martin Jambon announced

    ATD 4.0.0 was released today on opam.

    This release introduces atdml, an experimental replacement for atdge= n.

    The goal is to modernize the implementation and make it easier to extend, while keeping compatibility with existing ATD workflows.

    Here's a sample input file example.atd:

    type location =3D {
      row: int;
      column: int;
      ?file: string option;
    }
    

    Atdml is invoked as follows, normally by the build system:

    $ atdml example.atd
    

    It produces a pair of mli and ml files. This is example.mli:

    (* A=
    uto-generated from "example.atd" by atdml. *)
    
    type location =3D {
      row: int;
      column: int;
      file: string option;
    }
    
    val create_location : row:int -> column:int -> ?file:string -> unit -> location
    val location_of_yojson : Yojson.Safe.t -> location
    val yojson_of_location : location -> Yojson.Safe.t
    val location_of_json : string -> location
    val json_of_location : location -> string
    
    module Location : sig
      type nonrec t =3D location
      val create : row:int -> column:int -> ?file:string -> unit -> t
      val of_yojson : Yojson.Safe.t -> t
      val to_yojson : t -> Yojson.Safe.t
      val of_json : string -> t
      val to_json : t -> string
    end
    

    Release notes: https://github= .com/ahrefs/atd/releases/tag/4.0.0

    Documentation: https://atd.readthedocs.io/

    Project page: https://github.com/ahrefs/atd

    Experimental module imports in ATD (ATD 4.0.0)

    Martin Jambon announced

    ATD 4.0.0 adds experimental support for imports between ATD files.

    This allows splitting schemas across multiple files in a natural way.

    Currently supported in:

    • atdml (OCaml)
    • atdpy (Python)
    • atdts (TypeScript)

    Example:

    from utils as u import email
    
    type email_addresses =3D u.email list
    

    Details: https://github= .com/ahrefs/atd/releases/tag/4.0.0

    For an earlier discussion of the design, see = https://discuss.ocaml.org/t/rfc-multifile-atd-definition-support-via-import= -statements/17881].

    Dune 3.22

    Shon announced

    The Dune team is pleased to announce the release of dune 3.22.0.

    In addition to many fixes and small improvements, notable highlights of thi= s release include:

    See the full = changelog for all new features and fixes, and for attribution to the contributors who= made it all possible. Thank you, contributors!

    If you encounter a problem with this release, please report it in our issue tracker.

    Parseff: parser combinator library for OCaml 5

    David Sancho announced

    Hi everyone,

    I=E2=80=99m sharing Parseff, a parser combinator library for OCam= l 5.

    If you like parser combinators but don=E2=80=99t love writing everything in= monadic style, Parseff is built for that. Parsers are plain functions (unit -> 'a) and you compose them in direct style, while Parsef= f handles backtracking and streaming under the hood (using effects!)

    Why Parseff

    • Direct-style API: write sequential OCaml code, no >>= =3D, let*, or applicative operator chains required.
    • Typed errors: raise domain errors with polymorphic variants via = Parseff.error.
    • Streaming input: same parser works with Parseff.parse (string) and Parseff.parse_source (stream).
    • Zero-copy + fused ops: span APIs and fused operations for hot pa= rsing paths.
    • Domain-safe execution: parse calls are self-contained (no global= mutable state).
    • Automatic backtracking with Parseff.or_
    • Minimal dependency footprint: only re for regex

    Performance

    In the included benchmarks, Parseff is faster than Angstrom and MParser:

    • around ~2x in fair comparisons
    • up to ~4x+ with zero-copy optimized paths

    Benchmark details and code are in the repo docs.

    ## Documentation

    I=E2=80=99ve put a lot of effort into the docs (quick start, guides, and AP= I pages) to keep Parseff easy to learn. A bit proud of using odoc=E2=80=99s= Markdown backend plus mdx, I can generate and check examples on the fly, s= o snippets stay type-safe.

    https://davesnx.github.io/par= seff

    Install

    opam install parseff -y
    

    Links

    If you try it, I=E2=80=99d really value feedback on: API ergonomics, error = handling experience or missing combinators or docs gaps!

    Thanks!

    Outreachy Demo Day for December 2025 Round

    Continuing this thread, Patrick Ferris announced

    The recording of our (nearly two hour!) meeting is now online: https://watch.ocaml.org/w/= 8aUqMhFvhQGq4WJLH3ukjA !

    Thank you to everyone who joined :two_hump_camel:

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --=-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=BFed9Met; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 50ED940093 for ; Tue, 31 Mar 2026 06:10:42 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=NYuBa+l50dLYEyYQ3tOXcb/k+iQx22RvY/rm2r4uWH0=; b=BFed9MetuHoSbw+3lHmzr++r5e57NCHAgmHEQCPSWkH6Df6CQ78EVYyW CbmJluuDf1S1HtkdVXTbSEVnO7gEPbdNjwrj2wA76ca1AvBK40BR0nmqA l7t0JJoRriWgOWEc31n+flK3oEzYxsZQi+yf+E478TRnIQvI9HulzIEjj o=; X-CSE-ConnectionGUID: h+HpmW+KSJGpk6rGH7xg8A== X-CSE-MsgGUID: lEAmldXcQZmGQbE6kK4zrw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,151,1770591600"; d="asc'?scan'208,217";a="270249817" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 31 Mar 2026 08:10:42 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id D548280733; Tue, 31 Mar 2026 08:10:41 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 84BD7800CB for ; Tue, 31 Mar 2026 08:10:27 +0200 (CEST) X-CSE-ConnectionGUID: BkPdnJk6QjWZj4j+BXPraA== X-CSE-MsgGUID: IeS35O8pQOeurjruA2oZNQ== IronPort-SDR: 69cb6551_LVmpn9SvUlH/DyD73LP9EhEqSiExZDK/SOPPMGCFxKRCUgT V0dXbmbx+Lfuoy1q2g9IYaDCPE9RF0hdvYRFKpQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EmBADeY8tpjyIeaIFagluBO4EEGgFsXzMHCEmEWINPj?= =?us-ascii?q?iWRTYp7gWmBLBYhAg4HAQMBCAUuARsEAQIEAQEDAQIBggyCLkaNKAIfBgEEN?= =?us-ascii?q?BMBAgQBAQEBAwIDAQEBAQEBAQEBAQELAQEFAQEBAgEBAgQGAQIQAQEBAQEBO?= =?us-ascii?q?QVJhk8NSQEMAYFuLSRxXgIBBAIBBgYBAQEBAQEBAQEnAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQIECAEZFwQOHAE9AgEIC?= =?us-ascii?q?hMBATgYFA8DCQcEAQYDAhEBNQMUARIUBoJoAYIiAk8DBAEMBpocm0R6gTKBA?= =?us-ascii?q?YIMAQEGgQg+AQIDDAMPL9oRgV4JAwYUgSEYgViEGIJKDw0BBSVJagIBAoROh?= =?us-ascii?q?D8nD4FVRIEVgnlvgUKBCBcBAQEBARd/CRwBAQIERxKDHIJpghEVgQ6Bf4U+g?= =?us-ascii?q?V4FHS85hnCBZgNZLAFVExcLBwVegQgDKi8tbjIdgSM+FzRYGwcFgVCIFoFhg?= =?us-ascii?q?RODfj8DC209NxQbiwQQIQ2BJkMZKAGBaA4LMwIFECcWBggCPwgKAgICBRsCL?= =?us-ascii?q?gQEBS0HBwMVAyEGBAEJHQ4QDwkNAisCkkYnFSp3jmWOGJNZgQo0B4QfgV4GD?= =?us-ascii?q?IkIgSaWB4QEjROZVCKYZCKCNocogSYJYIEPH0wWlR4sBAQLhUWBfyOBXDMaM?= =?us-ascii?q?EOCMwEBATEJRhwPWIQfjSqBPoEmgXQ7vUcyQTUCAQEHNAcCBwELBIVOHQEBh?= =?us-ascii?q?GuHT4FLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 JusPx4BFE5Lk89BM80IXDvUX1S/k4o8Jw== IronPort-HdrOrdr: A9a23:WWI6tqF7479bBpfJpLqE18eALOsnbusQ8zAXPiFKOH5om6mj/a 2TdZsgtCMc5Ax8ZJhCo6HiBEDjexPhHPdOiOF7AV7IZmfbUQWTQ71K3M/L/HnLGiH19OJRvJ 0QFpRWOZnXFlY/qc775WCDYrEdKTS8gcSVuds= X-Talos-CUID: =?us-ascii?q?9a23=3AH0yGH2q4EQsAs6LIMv+cfwPmUeomSnHb7nSOGk2?= =?us-ascii?q?HO2Q1Sv6/eWeK8Yoxxg=3D=3D?= X-Talos-MUID: 9a23:8exNjQpD3LNkNc7pU6gezxBvD5w1xPS2MWcAjI8EodStbytCHQ7I2Q== X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,151,1770591600"; d="asc'?scan'208,217";a="142779497" X-MGA-submission: =?us-ascii?q?MDGHBRioYaZXwBbw9VAUDUF7Coo19PCEnMwCsI?= =?us-ascii?q?VLb417qjQfns9OEuJEojxC+lWPpYdzCqP5v6Svv9OjwebFKyRGkkDzij?= =?us-ascii?q?HSy1scGnelr0sHgnVK3QYmvSqbw/gaa0btJ5321ooT1uJhdTbwXV33HS?= =?us-ascii?q?AjOA82wMU7omXVQpD0jKEQaQ=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Mar 2026 08:10:25 +0200 Received: from TM.local (unknown [212.133.41.95]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 2DF791A4E2; Tue, 31 Mar 2026 08:10:24 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 31 Mar 2026 08:10:20 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Mar 31 08:10:24 2026 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.332080, queueID=B00B01A502 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19481 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of March 24 to 31, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 Improve signature-help feature in Merlin Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions OCaml Users Survey 2023 Results ortac-0.8 specification-driven testing with Domains Third alpha release for OCaml 5.5.0 ocaml-openapi-gen 0.1.0, ocaml-forgejo CS6868 Concurrent Programming =E2=80=93 Course Materials libinput - OCaml bindings for Linux input devices OCaml compiler office hours Old CWN Improve signature-help feature in Merlin =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Charl=C3=A8ne_Gros announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 We, at Tarides, are very happy to announce some improvements made to Merlin=E2=80=99s `signature-help' feature! As a reminder, `signature-help' is a feature in Merlin that displays the function signature and highlights the active parameter. In the editor, this is typically displayed in a tooltip, floating window, or minibuffer. For instance, the following image displays the `signature-help' for the function `exec_prog' in VSCode. The implementation of the signature-help command had a few shortcomings, which have been fixed. These fixes are making the feature way more pleasant to use. Some of these improvements are already part of the last Merlin and ocaml-lsp releases, others will be included in the next release. Results: =E2=80=A2 Merlin only displays `signature-help' information on the functi= on parameters and no longer displays it on the function name. =E2=80=A2 `signature-help' displays the function's information only for t= he active parameters, and no longer loops back to highlight the first parameter after the last one. =E2=80=A2 `signature-help' is now triggered even if used inside a `let ..= in' binding, in which the `in' is not yet written after the function call =E2=80=A2 The optional parameters are now detected and highlighted when t= he active parameter starts writing one. Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, I am preparing the OCaml Users Survey 2026 on behalf of the OCSF and would like your input on the survey questions before we finalize them. You can find the proposed question list here: [Proposed OCaml Users Survey Questions 2026] For reference, there is a [summary of the changes compared to the 2023 survey]. [Proposed OCaml Users Survey Questions 2026] [summary of the changes compared to the 2023 survey] Summary of proposed changes since the 2023 survey =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C New sections: =E2=80=A2 AI/LLM Usage (4 questions) - Do you use AI/LLM tools for OCaml development? Which ones? What for? =E2=80=A2 Debugging & Profiling (3 questions) - What debugging approaches= and tools do you use? What are the biggest challenges? (Motivated by frequent mentions of debugging difficulties in the 2023 free-text responses.) New standalone questions: =E2=80=A2 Community size preference ("I wish the community was=E2=80=A6") =E2=80=A2 Documentation tools used (odoc, ocamldoc, etc.) =E2=80=A2 Dedicated free-text fields for tooling and package repository feedback Removed questions (10 total) - questions that yielded low-actionability data or were redundant, including: largest project size, release schedule satisfaction, source hosting platform, web deployment platforms, "OCaml tooling provides a comfortable workflow for me", "OCaml libraries are stable enough", "software written in OCaml is easy to maintain", and the language feature wishlist (effect handlers have shipped in OCaml 5). Modified questions - new answer options reflecting ecosystem evolution: OxCaml, Zig, Helix, Zed, WebAssembly targets, dune package management, Nix-based builds, Bluesky, and AI/LLM-related options in the "burning desires" section. Old compiler versions (4.02-4.06) collapsed into "=E2=89=A44.07". Benchmarking tools now listed by specific= name rather than category. We'd love your feedback on: =E2=80=A2 Are there questions you think should be added or removed? =E2=80=A2 Are any answer options missing? =E2=80=A2 Are there new topics that are important to the OCaml community = that we should ask about? =E2=80=A2 Is the survey too long, too short, or about right at 58 questio= ns? Thank you for helping us make the survey as useful as possible! :two_hump_camel: :orange_heart: Sabine PS: See also [the results of the OCaml Users Survey 2023]! [the results of the OCaml Users Survey 2023] OCaml Users Survey 2023 Results =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sabine Schmaltz announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, on behalf of the OCSF, I am happy to announce the (belated) report on the responses to the OCaml Users Survey 2023. We apologize for the delay in evaluating and are committed to run the OCaml Users Survey reliably in a yearly fashion from now on. Without further ceremony, here is the link to the report: We welcome any feedback on the report, discussion around the responses and numbers (please share your interpretations and opinions), or other commentary. Thank you to everyone who participated in the survey to help us better understand the state of OCaml and its ecosystem! :orange_heart: :two_hump_camel: Sabine PS: the 2026 OCaml Users Survey is coming up. We greatly value your input on [the feedback thread about 2026 survey question changes]. [the feedback thread about 2026 survey question changes] ortac-0.8 specification-driven testing with Domains =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Nicolas Osborne announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi! We, at Tarides, are very excited to announce the release of ortac-0.8.0 for specification-driven testing! `ortac' is a tool in the [Gospel] ecosystem. The core idea is to translate a subset of the Gospel specification language into OCaml code and use these translations to generate runtime checking. `ortac' has a plugin architecture. You can install it via opam: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam install ortac-wrapper # install the wrapper plugin fo= r runtime assertion checking, with all the other necessary parts (runtime a= nd cli) =E2=94=82 $ opam install ortac-qcheck-stm # install the qcheck-stm plugin= that generates QCheck-STM tests, with all the other necessary parts (runti= me and cli) =E2=94=82 $ opam install ortac-dune # install the dune plugin to ge= nerate dune boilerplate to use the two previous plugins =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 This release focuses on making Ortac/QCheck-STM take advantage of more features from the QCheck-STM test framework: namely testing in a parallel context and flexibility of the command generation. You can take a look at the [documentation] that explains how it works. Regarding testing in a parallel context, with the introduction of the bug report feature in version 0.2 and the coverage of SUT-returning functions in version 0.4, it was not possible anymore to easily generate QCheck-STM tests in a parallel context (which is quite easy in hand-written QCheck-STM tests). This is now fixed! Information for the bug report are partly collected in the function doing the actual testing (comparing the results from the actual run and the results from the model). This means that implementing the bug report feature for the parallel testing requires to rewrite this function, which is the heart of QCheck-STM+Domains and what we are trusting when running the tests (the Trusted Testing Base if you will). In order to check that we keep the same behaviour, that the generated tests have the same semantic as corresponding hand-written QCheck-STM tests, we minimized the diff of the [commit] introducing the collection of the information so that the preservation of the logic is apparent (at the end of the day, human review is what we trust). Since version 0.4, SUT-returning functions are included in the tests. The newly created SUT is then added to the store of SUTs that are picked as argument for the next calls. The question here is what to do with them in a parallel context: We can't add a SUT created in a parallel branch in a global store, as it is not supposed to be shared between domains. We've chosen a simple design, where we stop storing newly created SUTs once we are in a parallel context. No worries, these SUT-returning functions will still be fully tested in the sequential part of the testing (in sequential mode and/or in the sequential prefix of the parallel mode). One of the power of the QCheck-STM test framework is the flexibility of its command generator. This flexibility comes from the `QCheck.Gen' API itself and from the fact that the QCheck-STM command generator is parameterized over the state of the current model (think generation of a `lookup' command for a key-value store, you want to be able to have a chance to generate a call that lookup a key that is actually associated to a value). An automatically generated command generator ought to be a bit naive. In order to mitigate this naivet=C3=A9, we allow the user to provide: =E2=80=A2 weights to be applied to specific command generation, usefull f= or example to disable the generation of the `push' command on a [work stealing queue] on the domain that is not supposed to own the queue. =E2=80=A2 complete command generator implementation when the user wants to take advantage on the command generator being parameterized over the current state of the model. Happy testing! [Gospel] [documentation] [commit] [work stealing queue] Third alpha release for OCaml 5.5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 With the progress of the ongoing stabilisation effort for OCaml 5.5.0, we are happy to announce a third alpha release for OCaml 5.5.0. The missing second alpha was unreleased due to an unforeseen interaction between the relocatable compiler and bootstrapping. This issue is fixed in this third alpha. Beyond this important change, compared to the first alpha this new alpha release contains =E2=80=A2 two code generation fixes =E2=80=A2 three type system fixes =E2=80=A2 one standard library fix (see the Changelog below for a full list). Overall, it looks like 5.5.0 is stabilizing quite well and alpha versions of most development tools are available. Thus we are planning to switch to a beta release in the beginning of April. More precisely, the ongoing progress on stabilising the ecosystem is tracked on the [5.5.0 readiness meta-issueon opam]. There is also a companion alpha opam repository available for this alpha release =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-a= lpha-repository.git =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which contains in-progress alpha releases of opam packages that are being updated for OCaml 5.5.0 . The final release is still planned for between May and June. If you find any bugs, please report them on the [issue tracker]. If you are interested by the full list of new features and bug fixes, the updated [changelog for OCaml 5.5.0] is available. Happy hacking, Florian Angeletti for the OCaml team [5.5.0 readiness meta-issueon opam] [issue tracker] [changelog for OCaml 5.5.0] Changes compared to the first alpha =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C =E2=97=8A Compiler artefact fixes =E2=80=A2 More bootstrap-friendly relocatable compiler =E2=80=A2 A bootstrap to fix compiler-libs related issues reported by js_of_ocaml =E2=97=8A Code generation bug fixes =E2=80=A2 [#14583]: fix bug in linear scan spilling heuristic that in cer= tain situations could lead to miscompilations. (Nicol=C3=A1s Ojeda B=C3=A4r, review by Vincent Laviron) =E2=80=A2 [#13693], [#14514]: s390x: fix heap corruption with libasmrun_shared.so caused by PLT lazy binding trampoline saving FPRs into OCaml's fiber stack. Replace PLT calls with GOT-indirect calls in the s390x code emitter. (Zane Hambly, review by David Allsopp and Xavier Leroy) [#14583] [#13693] [#14514] =E2=97=8A Type system bug fixes =E2=80=A2 [#14434], [#14652]: Protect check_counter_example_pat against polymorphic types, restoring type soundness. (Stephen Dolan and Jacques Garrigue, report and review by Alistair O'Brien) =E2=80=A2 [#14603], [#14604]: avoid Ctype.apply failures when mixing polymorphic types and unboxed constructors. (Gabriel Scherer and Stefan Muenzel, report by Brandon Stride, review by Florian Angeletti) =E2=80=A2 [#14626], [#14675]: take in account module-dependent functions = when determining if an optional argument is non-erasable. (Alistair O'Brien and Florian Angeletti, review by Gabriel Scherer) [#14434] [#14652] [#14603] [#14604] [#14626] [#14675] =E2=97=8A Standard library fix =E2=80=A2 [#14635]: Fix a bug in `caml_floatarray_gather' that would caus= e the result of `Float.Array.sub', `Float.Array.append', `Float.Array.concat' (when empty) not to be equal to `[||]'. (Marc Lasson, review by Gabriel Scherer) [#14635] =E2=97=8A Documentation update =E2=80=A2 [#13590]: Document automatic command-line expansion of `*' and = `?' wildcards by the runtime under Windows. (Benjamin Sigonneau, review by Nicol=C3=A1s Ojeda B=C3=A4r) [#13590] ocaml-openapi-gen 0.1.0, ocaml-forgejo =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Zoggy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, I just made a first release of [ocaml-openapi-gen], a tool generating code from an [openapis] specification. The `openapi_gen' package is available from my [personal opam repository]. This tool is used to generate code for [ocaml-forgejo], a library to interact with Codeberg and other forgejo-based platforms through the [provided REST API]. The generated interfaces way evolve in the future. [ocaml-openapi-gen] [openapis] [personal opam repository] [ocaml-forgejo] [provided REST API] CS6868 Concurrent Programming =E2=80=93 Course Materials =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: KC Sivaramakrishnan announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 I=E2=80=99m currently teaching a course called =E2=80=9CCS6868: Concurrent Programming=E2=80=9D at IIT Madras. The goal of the course is to teach concurrent and parallel programming using OCaml 5, and then introduce [OxCaml] for safe and fast parallelism. I=E2=80=99ve covered the OCaml 5 parts, and will be starting OxCaml next. I thought it would be good to share the course materials with the community. CS6868 assumes knowledge of OCaml, which I cover in [CS3100: Paradigms of Programming]. This course includes a [YouTube playlist] with all the lectures, notebooks, and assignments. CS6868 builds the foundations of parallelism, reasoning about correctness through linearizability, parallel programming through spin locks, mutexes, condition variables, memory consistency models, and the basics of performance and non-blocking data structures (lock-free linked lists, queues, and stacks). Here, the course closely follows the book [The Art of Multiprocessor Programming]. All the code has been redone in OCaml 5. In addition to the book content, the course also covers the OCaml relaxed memory model. We also cover a fair bit of OCaml-specific tools here, including concurrent property-based testing using [qcheck-lin and qcheck-stm], and [data race detection using TSAN]. Following this, the course covers the basics of effect handlers, following specific parts of [Control structures in programming languages: from goto to algebraic effects]. We then build a full-fledged Go-like, multicore-capable concurrent programming library with lightweight threads, buffered channels, selective communication (in the vein of [Concurrent ML]), nested parallel programming (as in [domainslib]), and basic asynchronous IO (as in [Eio]). There is a growing collection of [course projects], which should be doable if you=E2=80=99ve gone through the course materials. Let me know i= f you have ideas for course projects. The course tries to bring together the content from [many] [tutorials] [we] [have] done in the past. Let me know if you have feedback. I=E2=80= =99m open to accepting PRs fixing small issues, but given that this is an ongoing course, any large PRs will likely not be accepted. I hope you will enjoy working through this as much as I had fun making it. [OxCaml] [CS3100: Paradigms of Programming] [YouTube playlist] [The Art of Multiprocessor Programming] [qcheck-lin and qcheck-stm] [data race detection using TSAN] [Control structures in programming languages: from goto to algebraic effects] [Concurrent ML] [domainslib] [Eio] [course projects] [many] [tutorials] [we] [have] libinput - OCaml bindings for Linux input devices =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Thomas Leonard announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I'm pleased to announce the first release of [libinput-ocaml] (OCaml bindings for the libinput C library). libinput is used by applications such as Wayland compositors to access mice, keyboards, touch pads, etc. [Linux input devices (with libinput-ocaml)] explains how input devices work on Linux, and shows how to use the library to create a little game: [libinput-ocaml] [Linux input devices (with libinput-ocaml)] OCaml compiler office hours =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90 Archive: Continuing this thread, gasche announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 I propose to hold OCaml compiler office hours on Friday April 3d, 11:00-12:00 UTC (in local time, [date-range from=3D2026-04-03T11:00:00 to=3D2026-04-03T12:00:00 timezone=3DUTC].) =E2=80=A2 [collaborative pad to prepare questions/topics] [collaborative pad to prepare questions/topics] Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 24 to 31, 2026.

    Improve signature-help feature in Merlin

    Charl=C3=A8ne_Gros announced

    We, at Tarides, are very happy to announce some improvements made to Merlin= =E2=80=99s signature-help feature!

    As a reminder, signature-help is a feature in Merlin that disp= lays the function signature and highlights the active parameter. In the edi= tor, this is typically displayed in a tooltip, floating window, or minibuff= er. For instance, the following image displays the signature-help for the function exec_prog in VSCode.

    3D"46e99c5c69bab991=

    The implementation of the signature-help command had a few shortcomings, wh= ich have been fixed. These fixes are making the feature way more pleasant t= o use. Some of these improvements are already part of the last Merlin and o= caml-lsp releases, others will be included in the next release.

    Results:

    • Merlin only displays signature-help information on the fun= ction parameters and no longer displays it on the function name.
    • signature-help displays the function's information only fo= r the active parameters, and no longer loops back to highlight the first pa= rameter after the last one.
    • signature-help is now triggered even if used inside a let .. in binding, in which the in is not yet written= after the function call
    • The optional parameters are now detected and highlighted when the activ= e parameter starts writing one.

    Feedback Wanted: Upcoming OCaml Users Survey 2026 Questions

    Sabine Schmaltz announced

    Hi everyone,=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 I am preparing the OCaml Users Survey 2026 on behalf of the OCSF and woul= d like your input on the survey questions before we finalize them.

    You can find the proposed question list here: Proposed OCaml Users Survey Questions 2026=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20 For reference, there is a summary of the changes compared to the 2023 survey.=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20

    Summary of proposed changes since the 2023 survey

    New sections:

    • AI/LLM Usage (4 questions) - Do you use AI/LLM tools for OCaml developm= ent? Which ones? What for?
    • Debugging & Profiling (3 questions) - What debugging approaches and= tools do you use? What are the biggest challenges? (Motivated by frequent = mentions of debugging difficulties in the 2023 free-text responses.)

    New standalone questions:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20

    • Community size preference ("I wish the community was…")
    • Documentation tools used (odoc, ocamldoc, etc.)
    • Dedicated free-text fields for tooling and package repository feedback<= /li>

    Removed questions (10 total) - questions that yielded low-actionability dat= a or were redundant, including: largest project size, release schedule sati= sfaction, source hosting platform, web deployment platforms, "OCaml tooling= provides a comfortable workflow for me", "OCaml libraries are stable enoug= h", "software written in OCaml is easy to maintain", and the language featu= re wishlist (effect handlers have shipped in OCaml 5).=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20

    Modified questions - new answer options reflecting ecosystem evolution: OxC= aml, Zig, Helix, Zed, WebAssembly targets, dune package management, Nix-bas= ed builds, Bluesky, and AI/LLM-related options in the "burning desires" sec= tion. Old compiler versions (4.02-4.06) collapsed into "=E2=89=A44.07". Ben= chmarking tools now listed by specific name rather than category.

    We'd love your feedback on:=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20

    • Are there questions you think should be added or removed?
    • Are any answer options missing?
    • Are there new topics that are important to the OCaml community that we = should ask about?
    • Is the survey too long, too short, or about right at 58 questions?

    Thank you for helping us make the survey as useful as possible! :two_hump_c= amel: :orange_heart:=20

    Sabine

    PS: See also the results of the OCaml Users Survey 2023!

    OCaml Users Survey 2023 Results

    Sabine Schmaltz announced

    Hi everyone,

    on behalf of the OCSF, I am happy to announce the (belated) report on the r= esponses to the OCaml Users Survey 2023. We apologize for the delay in eval= uating and are committed to run the OCaml Users Survey reliably in a yearly= fashion from now on.

    Without further ceremony, here is the link to the report:

    https://ocam= l-sf.org/docs/2023/survey-results.html

    We welcome any feedback on the report, discussion around the responses and = numbers (please share your interpretations and opinions), or other commenta= ry.

    Thank you to everyone who participated in the survey to help us better unde= rstand the state of OCaml and its ecosystem! :orange_heart: :two_hump_camel= :=20

    Sabine

    PS: the 2026 OCaml Users Survey is coming up. We greatly value your input o= n the feedback thread about 2026 survey que= stion changes.

    ortac-0.8 specification-driven testing with Domains

    Nicolas Osborne announced

    Hi! We, at Tarides, are very excited to announce the release of ortac-0.8.0= for specification-driven testing!

    ortac is a tool in the Gospel ecosystem. The core idea is to translate a subset of the Go= spel specification language into OCaml code and use these translations to g= enerate runtime checking.

    ortac has a plugin architecture. You can install it via opam:

    $ opam install ortac-wrapper    # install the wrapper plugin for runtime as=
    sertion checking, with all the other necessary parts (runtime and cli)
    $ opam install ortac-qcheck-stm # install the qcheck-stm plugin that genera=
    tes QCheck-STM tests, with all the other necessary parts (runtime and cli)
    $ opam install ortac-dune       # install the dune plugin to generate dune =
    boilerplate to use the two previous plugins
    

    This release focuses on making Ortac/QCheck-STM take advantage of more feat= ures from the QCheck-STM test framework: namely testing in a parallel conte= xt and flexibility of the command generation.

    You can take a look at the documentation that explains how it works.

    Regarding testing in a parallel context, with the introduction of the bug r= eport feature in version 0.2 and the coverage of SUT-returning functions in= version 0.4, it was not possible anymore to easily generate QCheck-STM tes= ts in a parallel context (which is quite easy in hand-written QCheck-STM te= sts). This is now fixed!

    Information for the bug report are partly collected in the function doing t= he actual testing (comparing the results from the actual run and the result= s from the model). This means that implementing the bug report feature for = the parallel testing requires to rewrite this function, which is the heart = of QCheck-STM+Domains and what we are trusting when running the tests (the = Trusted Testing Base if you will). In order to check that we keep the same = behaviour, that the generated tests have the same semantic as corresponding= hand-written QCheck-STM tests, we minimized the diff of the commit introducing the collection of the information so that t= he preservation of the logic is apparent (at the end of the day, human revi= ew is what we trust).

    Since version 0.4, SUT-returning functions are included in the tests. The n= ewly created SUT is then added to the store of SUTs that are picked as argu= ment for the next calls. The question here is what to do with them in a par= allel context: We can't add a SUT created in a parallel branch in a global = store, as it is not supposed to be shared between domains. We've chosen a s= imple design, where we stop storing newly created SUTs once we are in a par= allel context. No worries, these SUT-returning functions will still be full= y tested in the sequential part of the testing (in sequential mode and/or i= n the sequential prefix of the parallel mode).

    One of the power of the QCheck-STM test framework is the flexibility of its= command generator. This flexibility comes from the QCheck.Gen= API itself and from the fact that the QCheck-STM command generator is para= meterized over the state of the current model (think generation of a = lookup command for a key-value store, you want to be able to have a = chance to generate a call that lookup a key that is actually associated to = a value). An automatically generated command generator ought to be a bit na= ive. In order to mitigate this naivet=C3=A9, we allow the user to provide:

    • weights to be applied to specific command generation, usefull for examp= le to disable the generation of the push command on a work stealing queue on the domain that is not = supposed to own the queue.
    • complete command generator implementation when the user wants to take a= dvantage on the command generator being parameterized over the current stat= e of the model.

    Happy testing!

    Third alpha release for OCaml 5.5.0

    octachron announced

    With the progress of the ongoing stabilisation effort for OCaml 5.5.0, we a= re happy to announce a third alpha release for OCaml 5.5.0.

    The missing second alpha was unreleased due to an unforeseen interaction be= tween the relocatable compiler and bootstrapping. This issue is fixed in th= is third alpha.

    Beyond this important change, compared to the first alpha this new alpha re= lease contains=20

    • two code generation fixes
    • three type system fixes
    • one standard library fix

    (see the Changelog below for a full list).

    Overall, it looks like 5.5.0 is stabilizing quite well and alpha versions o= f most development tools are available. Thus we are planning to switch to a= beta release in the beginning of April.

    More precisely, the ongoing progress on stabilising the ecosystem is tracke= d on the = 5.5.0 readiness meta-issueon opam.

    There is also a companion alpha opam repository available for this alpha re= lease

    $ opam repo add alpha git+https://github.com/kit-ty-kate/opam-alpha-reposit=
    ory.git
    

    which contains in-progress alpha releases of opam packages that are being u= pdated for OCaml 5.5.0 .

    The final release is still planned for between May and June.

    If you find any bugs, please report them on the issue tracker.

    If you are interested by the full list of new features and bug fixes, the updated changel= og for OCaml 5.5.0 is available.

    Happy hacking, Florian Angeletti for the OCaml team

    Changes compared to the first alpha

    • Compiler artefact fixes
      • More bootstrap-friendly relocatable compiler
      • A bootstrap to fix compiler-libs related issues reported by js_of_ocaml=
    • Code generation bug fixes
      • #14583: fix= bug in linear scan spilling heuristic that in certain situations could lead to miscompilations. (Nicol=C3=A1s Ojeda B=C3=A4r, review by Vincent Laviron)
      • #13693, #14514: s390x: fix= heap corruption with libasmrun_shared.so caused by PLT lazy binding trampoline saving FPRs into OCaml's fiber stack. Replace PLT calls with GOT-indirect calls in the s390x code emitter. (Zane Hambly, review by David Allsopp and Xavier Leroy)
    • Type system bug fixes
      • #14434, #14652: Protect ch= eck_counter_example_pat against polymorphic types, restoring type soundness. (Stephen Dolan and Jacques Garrigue, report and review by Alistair O'Brien)=
      • #14603, #14604: avoid Ctyp= e.apply failures when mixing polymorphic types and unboxed constructors. (Gabriel Scherer and Stefan Muenzel, report by Brandon Stride, review by Florian Angeletti)
      • #14626, #14675: take in ac= count module-dependent functions when determining if an optional argument is non-erasable. (Alistair O'Brien and Florian Angeletti, review by Gabriel Scherer)
    • Standard library fix
      • #14635: Fix= a bug in caml_floatarray_gather that would cause the result of Float.Array.sub, Float.Array.append= , Float.Array.concat (when empty) not to be equal to [||]. (Marc Lasson, review by Gabriel Scherer)
    • Documentation update
      • #13590: Doc= ument automatic command-line expansion of * and ?= wildcards by the runtime under Windows. (Benjamin Sigonneau, review by Nicol=C3=A1s Ojeda B=C3=A4r)

    ocaml-openapi-gen 0.1.0, ocaml-forgejo

    Zoggy announced

    Hello,

    I just made a first release of = ocaml-openapi-gen, a tool generating code from an openapis specification.

    The openapi_gen package is available from my personal opam repository.

    This tool is used to generate code for ocaml-forgejo, a library to interact with Codeberg and ot= her forgejo-based platforms through the provided REST API.

    The generated interfaces way evolve in the future.

    CS6868 Concurrent Programming – Course Materials

    KC Sivaramakrishnan announced

    I=E2=80=99m currently teaching a course called =E2=80=9CCS6868: Concurrent = Programming=E2=80=9D at IIT Madras. The goal of the course is to teach conc= urrent and parallel programming using OCaml 5, and then introduce OxCaml for safe and fast parallelism. I=E2=80= =99ve covered the OCaml 5 parts, and will be starting OxCaml next. I though= t it would be good to share the course materials with the community.

    https://github.com/kayc= eesrk/cs6868_s26

    CS6868 assumes knowledge of OCaml, which I cover in CS3100: Paradigms of Programming. This cou= rse includes a YouTube playlist with all t= he lectures, notebooks, and assignments.

    CS6868 builds the foundations of parallelism, reasoning about correctness t= hrough linearizability, parallel programming through spin locks, mutexes, c= ondition variables, memory consistency models, and the basics of performanc= e and non-blocking data structures (lock-free linked lists, queues, and sta= cks). Here, the course closely follows the book The Art of Multiprocessor Programming. All the code has been redo= ne in OCaml 5. In addition to the book content, the course also covers the = OCaml relaxed memory model. We also cover a fair bit of OCaml-specific tool= s here, including concurrent property-based testing using qcheck-lin and qcheck-stm= , and data race detectio= n using TSAN.=20

    Following this, the course covers the basics of effect handlers, following = specific parts of C= ontrol structures in programming languages: from goto to algebraic effects<= /a>. We then build a full-fledged Go-like, multicore-capable concurrent pro= gramming library with lightweight threads, buffered channels, selective com= munication (in the vein of Concurrent ML), nested parallel programming (as in domainslib), and basic as= ynchronous IO (as in Eio= ).=20

    There is a growing collection of course projects, which should be d= oable if you=E2=80=99ve gone through the course materials. Let me know if y= ou have ideas for course projects.=20

    The course tries to bring together the content from many tutorials we have done in the past. Let me know if you have feedback. I=E2=80=99m= open to accepting PRs fixing small issues, but given that this is an ongoi= ng course, any large PRs will likely not be accepted. I hope you will enjoy= working through this as much as I had fun making it.

    libinput - OCaml bindings for Linux input devices

    Thomas Leonard announced

    I'm pleased to announce the first release of libinput-ocaml (OCaml bindings for the libinput = C library).

    libinput is used by applications such as Wayland compositors to access mice= , keyboards, touch pads, etc.

    Linux = input devices (with libinput-ocaml) explains how input devices work on = Linux, and shows how to use the library to create a little game:

    3D"87988f00d0f601de=

    OCaml compiler office hours

    Continuing this thread, gasche announced

    I propose to hold OCaml compiler office hours on Friday April 3d, 11:00-12:= 00 UTC (in local time, [date-range from=3D2026-04-03T11:00:00 to=3D2026-04-= 03T12:00:00 timezone=3DUTC].)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmnLZU0bFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cehRwf/djc1IDgpVJT92d4TQ2PPeEPCEiO7JdSg4b/wXtZr +GYqPZZM0g34ASc5EIAlFyg/V+fHmPoYItszUEpOrrUgihdWVgmljXjg5L98YJL6 Cf411NcgXElJ7m/Yw4vpjnthu6mpxO6HD0s4PG22uAsm4RX6m47i4peS8DeGXrzK sFS0mRxHWb7bBwOaPJ8RqoGnkTpBRy8mLhg091l0AiCwUuEg8/eJmhXCMEd/5/3w cDnfZD9Z1ko0Ub6GW9VLPLeG1EfbXQprUTg3TROBFUU7VuoV2qvTiVSiagXGU6Jk RvmbTRxfllhyKGYsZmGwxxKKbn202nVYIn1cPYVOZt+77g== =5mhi -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=eK4cZCty; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id C8E3B40087 for ; Tue, 7 Apr 2026 09:32:45 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=EBCIzrT0jHmK1YQmLZjwFCGAwcyLAz0Iqx+PeTbQpZw=; b=eK4cZCtyhZDMzJ55HiTEUZsVXd1CcGJxOncwLVWI1wTEq/6SCf6jxMo3 L3aSRzXbMkcyXObG4XGveDbQOpvQbQGIgnG4TTLR4y+Vqi/zGHN7FSrwI EjfXCFwT3zqQ7sh7mXmnmPWy5xn+gSVC85cpqf1pjwQyJUp5YEsK+POXX g=; X-CSE-ConnectionGUID: ZCTLOwJlRgm41OMStczbsQ== X-CSE-MsgGUID: re/9fWmfTPaxU5h7+0FCsw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,165,1770591600"; d="asc'?scan'208,217";a="271269486" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 07 Apr 2026 11:32:43 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id ABA0981ADA; Tue, 7 Apr 2026 11:32:43 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 9F76481AA2 for ; Tue, 7 Apr 2026 11:32:30 +0200 (CEST) X-CSE-ConnectionGUID: 4kYcNs+cT4uFaP3zJ/7vyA== X-CSE-MsgGUID: UyyArz5PSNuCim3ou3y26Q== IronPort-SDR: 69d4cf2c_wkOQYbSlIXi04fKTNGVdJ06DapsaEiQGwW05GSVj87cJEUQ XR21gWR8LvfHVmXyYCpuUnHrpAZN7LH3AZ8/r3Q== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0EHAwA8ztRpjyIeaIFahBZbKRoBbF8zBwhJA4QZPINPC?= =?us-ascii?q?Y4cgRaQN4I8hlZZgRCBaYERAxgWIQIOBwEDAQgFLgEFGgECBAEBAwECAYIMg?= =?us-ascii?q?i5GAhaNFQIfBgEENBMBAgQBAQEBAwIDAQEBAQEBAQEBAQELAQEFAQEBAgEBA?= =?us-ascii?q?gQGAQIQAQEBAQEBOQVJhhUHMw2CRVFxYQQDBjcBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAgBEQgBFmAOAQgKEwEBKQkGG?= =?us-ascii?q?CMDEAQBBgMCBA0BNQMBEwESFAaCEFgBgiICTwMFDAY/mVqacxo3eoEygQGCD?= =?us-ascii?q?AEBBoEIPgIBBQEMAQ4J2jeBXgkJgTUYgViEGYJKDw0BBSVJagIBAoRPCYQ2J?= =?us-ascii?q?w+BVUSBFYIoSgdvgVABeRcBAQEBAYEjBA4GAQEGRgEJgyWCaYIRFXoUg1oGg?= =?us-ascii?q?UaBB3BuBR0BLiyHC4FmA1ksAVUTFwsHBV6BCAMqLy1uMh2BIz4XNFgbBwWBS?= =?us-ascii?q?4Y0gWGBE4N3cQMLbT03FBuKGxAhDYEgQxkngTsvCAZ8DxcrAQoJFgEBIAI2O?= =?us-ascii?q?QcDGREIBA4FBAQBHgITEgsNHg+SUggIChYqnXSTWR1tNAeEH4FeBgyJCIEmg?= =?us-ascii?q?12DfoQLiiGEBIFXizyHApJSIphkIoI2hyiBJgmBbx9Mg2yBN4NXjDosBAQLh?= =?us-ascii?q?UWBfyOBKx4MBzMaMEOCMwEzCUYcD4k2hh8BCIJDQX2BJnopUTsHAlHAIkE1A?= =?us-ascii?q?gEBCjEHAgcBCwSFTh0BAYwHM4FLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:RvFJU6F3BpqLMT+CpLqE18eALOsnbusQ8zAXPiFKOH5om6mj/a 2TdZsgtCMc5Ax8ZJhCo6HiBEDjexPhHPdOiOF7AV7IZmfbUQWTQ71K3M/L/HnLGiH19OJRvJ 0QFpRWOZnXFlY/qc775WCDYrEdKTS8gcSVuds= X-Talos-CUID: =?us-ascii?q?9a23=3AUgDtwmk+Fbf1BU2a/hAZF1ZVXM/XOSHe/Xz2OAy?= =?us-ascii?q?zNTp0ZrStEk2yv/x6guM7zg=3D=3D?= X-Talos-MUID: =?us-ascii?q?9a23=3A1NEJ6Axsds5evy2vfkXDY5bo90maqJm/GWkXg8g?= =?us-ascii?q?+gO+ZHi11YDCA1yXtHLZyfw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,165,1770591600"; d="asc'?scan'208,217";a="271269324" X-MGA-submission: =?us-ascii?q?MDFrNZyfceoNJVVrRr0wBTfOSKGb3elQvoYUCG?= =?us-ascii?q?mqH2R1Gc8lbE3fP4D5Kux2PpHHQIC514wYRTFZbpJNdClGIn8O5sQ+Gx?= =?us-ascii?q?q3XhGKaPNUpqe+keMIZmH7KeCAoOSW0UVq34FhztaG5j74adxaAZQ1Ya?= =?us-ascii?q?3W3etUqrH39bOOWRc2yVZ5hw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 07 Apr 2026 11:32:28 +0200 Received: from TM.local (unknown [131.254.162.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 4A2891A460; Tue, 7 Apr 2026 11:32:28 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 07 Apr 2026 11:32:27 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 7 11:32:28 2026 +0200 (CEST)) X-Spam-Flag: No, tests=bogofilter, spamicity=0.203057, queueID=7097D1A46D X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19482 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgTWFyY2ggMzEgdG8gQXByaWwNCjA3LCAyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCnJl c3RyaWN0ZWQgMi4wLjAgbGltaXQgd2hpY2ggc3lzdGVtIG9wZXJhdGlvbnMgYW5kIHdoaWNoIHBh cnRzIG9mIHRoZSBmaWxlc3lzdGVtIHlvdXIgcHJvZ3JhbSBjYW4gYWNjZXNzDQpKb2Igb2ZmZXI6 IGNvbXBpbGVyIGVuZ2luZWVyIGZvciBDYXRhbGEgQCBDTkFGIChzb2NpYWwgYmVuZWZpdHMgYWdl bmN5KQ0Kb2NndGsgMC4xOiBPQ2FtbCBiaW5kaW5ncyBmb3IgR1RLIDQgKHByZXZpZXcgcmVsZWFz ZSkNCm91dC1jaGFubmVsLXJlZGlyZWN0IDAuMSDigJQgUmVkaXJlY3QgYW5kIGNhcHR1cmUgb3V0 X2NoYW5uZWwgb3V0cHV0DQpwcHhsaWIuMC4zOC4wDQpBIFByb3Bvc2FsIGZvciBWb2x1bnRhcnkg QUkgRGlzY2xvc3VyZSBpbiBPQ2FtbCBDb2RlDQpCbG9nOiBPQ2FtbCBkb2N1bWVudGF0aW9uIGFz IG1hcmtkb3duDQpob3RzZWF0IFNxdWF2YSAoYSB0aW55IExhYmxHdGsyIGRlbW8pDQpvcGVudGVs ZW1ldHJ5IDAuOTAgKGFuZCBhc3NvY2lhdGVkIGxpYnJhcmllcykNCkR1bmUgMy4yMg0KT2xkIENX Tg0KDQoNCnJlc3RyaWN0ZWQgMi4wLjAgbGltaXQgd2hpY2ggc3lzdGVtIG9wZXJhdGlvbnMgYW5k IHdoaWNoIHBhcnRzIG9mIHRoZSBmaWxlc3lzdGVtIHlvdXIgcHJvZ3JhbSBjYW4gYWNjZXNzDQri lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi1yZXN0cmljdGVkLTItMC0wLWxpbWl0LXdoaWNoLXN5c3RlbS1v cGVyYXRpb25zLWFuZC13aGljaC1wYXJ0cy1vZi10aGUtZmlsZXN5c3RlbS15b3VyLXByb2dyYW0t Y2FuLWFjY2Vzcy8xNzk0Mi8xPg0KDQoNCnJlbW92ZXdpbmdtYW4gYW5ub3VuY2VkDQrilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIANCg0KICBIZWxsbywNCg0KICBJIGFtIGhhcHB5IHRvIGFubm91bmNlIGEgbmV3IHZlcnNp b24gb2YgW3Jlc3RyaWN0ZWRdLg0KDQogIFRoaXMgbGlicmFyeSBsZXRzIHlvdSBsaW1pdCB3aGlj aCBzeXN0ZW0gb3BlcmF0aW9ucyBhbmQgd2hpY2ggcGFydHMgb2YNCiAgdGhlIGZpbGVzeXN0ZW0g eW91ciBwcm9ncmFtIGNhbiBhY2Nlc3MuIENhbGwgaXQgYXMgZWFybHkgYXMgcG9zc2libGUNCiAg aW4geW91ciBwcm9ncmFtIHNvIHRoYXQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgcnVucyB3aXRoIHJl ZHVjZWQNCiAgcHJpdmlsZWdlcy4gQ3VycmVudGx5LCBhY3R1YWwgZW5mb3JjZWQgcmVzdHJpY3Rp b25zIGFyZSBpbXBsZW1lbnRlZA0KICBmb3IgdGhlc2Ugb3BlcmF0aW5nIHN5c3RlbXM6DQoNCiAg 4oCiIE9wZW5CU0QNCiAg4oCiIExpbnV4IChvbmx5IGZpbGVzeXN0ZW0gdmlldykNCg0KICBFdmVu IG9uIG90aGVyIG9wZXJhdGluZyBzeXN0ZW1zLCB5b3UgY2FuIHN0aWxsIHVzZSBbcmVzdHJpY3Rl ZF0gdG8NCiAgZG9jdW1lbnQgd2hpY2ggcHJpdmlsZWdlcyB5b3VyIHByb2dyYW0gbmVlZHMuIFVz ZXJzIGNhbiB0aGVuIHRlc3QgaWYNCiAgeW91ciBwcm9ncmFtIHJlc3BlY3RzIHRoZXNlIHByb21p c2VzIHdpdGggdG9vbHMgc3VjaCBhcyBbcGxlZGdlIG9uDQogIExpbnV4XS4gRW5qb3kgOnNsaWdo dF9zbWlsZToNCg0KICDigKIgW29wYW1dDQogIOKAoiBbYXBpXQ0KICDigKIgW2V4YW1wbGVzXQ0K ICDigKIgW2dpdCByZXBvXQ0KICDigKIgW0xpY2Vuc2UgQUdQTF0NCg0KICBDSEFOR0VMT0c6DQoN CiAg4oCiIHRlc3RlZCBvbjoNCiAgICDigKMgeDg2XzY0IG9wZW5ic2QgKDE2LzE2IFRlc3RzIHBh c3NlZCkNCiAgICDigKMgeDg2XzY0LWFscGluZS1saW51eCAoTGFuZGxvY2sgQUJJIHZlcnNpb246 IDcpICg0LzEyIFRlc3RzIHBhc3NlZDoNCiAgICAgIGZpbGVfcmVhZF91bnYsIGZpbGVfd3JpdGVf dW52LCBmaWxlX2NyZWF0ZV91bnZfbGludXgsDQogICAgICBmaWxlX2N3cnJfdW52X2xpbnV4KQ0K DQoNCltyZXN0cmljdGVkXSA8aHR0cHM6Ly9vcGFtLm9jYW1sLm9yZy9wYWNrYWdlcy9yZXN0cmlj dGVkLz4NCg0KW3Jlc3RyaWN0ZWRdIDxodHRwczovL3JlbW92ZXdpbmdtYW4uY29kZWJlcmcucGFn ZS9yZXN0cmljdGVkLz4NCg0KW3BsZWRnZSBvbiBMaW51eF0gPGh0dHBzOi8vanVzdGluZS5sb2wv cGxlZGdlLz4NCg0KW29wYW1dIDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL3Jlc3Ry aWN0ZWQvcmVzdHJpY3RlZC4xLjIuMC8+DQoNClthcGldIDxodHRwczovL3JlbW92ZXdpbmdtYW4u Y29kZWJlcmcucGFnZS9yZXN0cmljdGVkLz4NCg0KW2V4YW1wbGVzXQ0KPGh0dHBzOi8vY29kZWJl cmcub3JnL3JlbW92ZXdpbmdtYW4vcmVzdHJpY3RlZC9zcmMvYnJhbmNoL21haW4jdXNhZ2UtYW5k LWV4YW1wbGVzPg0KDQpbZ2l0IHJlcG9dIDxodHRwczovL2NvZGViZXJnLm9yZy9yZW1vdmV3aW5n bWFuL3Jlc3RyaWN0ZWQ+DQoNCltMaWNlbnNlIEFHUExdDQo8aHR0cHM6Ly9lbi53aWtpcGVkaWEu b3JnL3dpa2kvR05VX0FmZmVyb19HZW5lcmFsX1B1YmxpY19MaWNlbnNlPg0KDQpBZGRlZA0K4pWM 4pWM4pWM4pWM4pWMDQoNCiAg4oCiIEFQSTogZXhlYyBwcm9taXNlcyBhbmQgYWNjZXNzZXMgb3B0 aW9uYWwNCiAg4oCiIE9wZW5CU0Q6IGV4ZWMgcHJvbWlzZXMNCg0KDQpSZW1vdmVkDQrilYzilYzi lYzilYzilYzilYzilYwNCg0KICDigKIgU3lzdGVtT3BlcmF0aW9uLlRtcFBhdGggKGRlcHJlY2F0 ZWQgc2VlOiBgcGxlZGdlICgyKScpDQoNCg0KSm9iIG9mZmVyOiBjb21waWxlciBlbmdpbmVlciBm b3IgQ2F0YWxhIEAgQ05BRiAoc29jaWFsIGJlbmVmaXRzIGFnZW5jeSkNCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3Qvam9iLW9mZmVyLWNvbXBpbGVyLWVuZ2luZWVyLWZvci1jYXRhbGEt Y25hZi1zb2NpYWwtYmVuZWZpdHMtYWdlbmN5LzE3OTQzLzE+DQoNCg0KRGVuaXMgTWVyaWdvdXgg YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBbVGhlIGZvbGxvd2luZyBpcyBpbiBGcmVu Y2ggc2luY2UgdGhpcyBpcyBhIGpvYiBvZmZlciBpbiB0aGUgRnJlbmNoDQogIHB1YmxpYyBzZWN0 b3JdDQoNCiAgKkNhbmRpZGF0ZXogaWNpIDoqDQogICA8aHR0cHM6Ly93d3cubGFzZWN1cmVjcnV0 ZS5mci9vZmZyZS1lbXBsb2kvaW5nZW5pZXVyLWV4cGVydC1lbi1jb21waWxhdGlvbi1sYW5nYWdl cy1kZS1wcm9ncmFtbWF0aW9uLS1mLWgvbm9ybWFuZGllLzEwNjU0OTc+DQoNCiAgICAgICAgTGEg KkNOQUYqIChDYWlzc2UgTmF0aW9uYWxlIGRlcyBBbGxvY2F0aW9ucyBGYW1pbGlhbGVzKSwNCiAg ICAgICAgdMOqdGUgZGUgcsOpc2VhdSBkZXMgMTAxIENBRiwgcmVwcsOpc2VudGUgbGEgYnJhbmNo ZSBGYW1pbGxlDQogICAgICAgIGRlIGxhIFPDqWN1cml0w6kgc29jaWFsZSBldCBhIHBvdXIgbWlz c2lvbiBkZSBwaWxvdGVyIGxhDQogICAgICAgIHBvbGl0aXF1ZSBmYW1pbGlhbGUgZXQgbOKAmWFp ZGUgYXV4IHBvcHVsYXRpb25zIGVuIHNpdHVhdGlvbg0KICAgICAgICBkZSBwcsOpY2FyaXTDqSBh aW5zaSBxdWUgbGEgcG9saXRpcXVlIGTigJlhY3Rpb24gc29jaWFsZS4NCg0KICAgICAgICBBdSBz ZWluIGRlIGxhIERpcmVjdGlvbiBkZXMgU3lzdMOobWVzIGTigJlJbmZvcm1hdGlvbiAoRFNJKSwN CiAgICAgICAgY29tcHRhbnQgZW52aXJvbiA4ODAgY29sbGFib3JhdGV1cnMsIGxhICpEaXJlY3Rp b24NCiAgICAgICAgUHJlc3RhdGlvbnMgRmx1eCBldCBEw6ljaXNpb25uZWwgKERQRkQpKiBlc3Qg ZMOpY291cMOpZSBlbiA0DQogICAgICAgIGTDqXBhcnRlbWVudHMgZXQgdm91cyBzZXJleiByYXR0 YWNow6kgYXUgKmTDqXBhcnRlbWVudCDCqw0KICAgICAgICBQcmVzdGF0aW9ucyBJbmRpdmlkdWVs bGVzIGV0IFLDqWbDqXJlbnRpZWxzIE3DqXRpZXJzIMK7KiBxdWkNCiAgICAgICAgZXN0IHByw6lz ZW50IHN1ciBsZXMgc2l0ZXMgZGUgQ2FlbiwgTGUgTWFucyBldCBSZW5uZXMuDQoNCiAgICAgICAg Q2UgZMOpcGFydGVtZW50IGEgcG91ciBtaXNzaW9uIHByaW5jaXBhbGUgZGUgY29uY2V2b2lyLA0K ICAgICAgICBkw6l2ZWxvcHBlciBldCBtYWludGVuaXIgbGUgc3lzdMOobWUgZOKAmWluZm9ybWF0 aW9uIGxpw6kgYXV4DQogICAgICAgIHByZXN0YXRpb25zIGluZGl2aWR1ZWxsZXMgKHByZXN0YXRp b25zIHZlcnPDqWVzIGF1eA0KICAgICAgICBhbGxvY2F0YWlyZXMgdGVsbGVzIHF1ZSBs4oCZYWxs b2NhdGlvbiBmYW1pbGlhbGUsDQogICAgICAgIGzigJlhbGxvY2F0aW9uIGxvZ2VtZW50LCBsYSBw cmltZSDDoCBsYSBuYWlzc2FuY2UsIGxlIFJTQSwgbGENCiAgICAgICAgcHJpbWUgZOKAmWFjdGl2 aXTDqSwg4oCmKS4gTGUgZMOpcGFydGVtZW50IGZvdXJuaXQgYWluc2kgZGVzDQogICAgICAgIG1v dGV1cnMgZGUgcsOoZ2xlcywgYWluc2kgcXVlIGxlcyBzcMOpY2lmaWNhdGlvbnMNCiAgICAgICAg Zm9uY3Rpb25uZWxsZXMgYXNzb2Npw6llcyBhZmluIGRlIGNhbGN1bGVyIGxlIGJvbiBkcm9pdCwg YXUNCiAgICAgICAgYm9uIG1vbWVudCwgcG91ciBsZXMgYWxsb2NhdGlvbnMgdmVyc8OpZXMgcGFy IGxlcyBDQUYuDQoNCiAgICAgICAgRGFucyBsZSBjYWRyZSBkZSBwcm9qZXRzIHN0cmF0w6lnaXF1 ZXMgcG91ciBsYSBicmFuY2hlDQogICAgICAgIGZhbWlsbGUsIGxhIG91IGxlIGNhbmRpZGF0IGlu dMOpZ3JlcmEgbGUgKmNlbnRyZSB0ZWNobmlxdWUNCiAgICAgICAgQ2F0YWxhIGRlIGxhIENOQUYq Lg0KDQogICAgICAgIENhdGFsYSBlc3QgdW4gbGFuZ2FnZSBkZSBwcm9ncmFtbWF0aW9uIGTDqWRp w6kgZMOpdmVsb3Bww6kgcGFyDQogICAgICAgIGzigJlJbnN0aXR1dCBOYXRpb25hbCBkZSBSZWNo ZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuDQogICAgICAgIEF1dG9tYXRpcXVlIChJbnJpYSks IHNww6ljaWFsZW1lbnQgYWRhcHTDqSDDoCBsYQ0KICAgICAgICB0cmFuc2Zvcm1hdGlvbiBkZSBz cMOpY2lmaWNhdGlvbnMganVyaWRpcXVlcyBldA0KICAgICAgICByw6lnbGVtZW50YWlyZXMgZW4g Y29kZSBpbmZvcm1hdGlxdWUuIExhIENOQUYgYXlhbnQgZMOpY2lkw6kNCiAgICAgICAgZGUgc+KA mWFwcHV5ZXIgc3VyIENhdGFsYSBwb3VyIGxlcyBwcm9qZXRzIGRlIG1vZGVybmlzYXRpb24NCiAg ICAgICAgZGUgc29uIHN5c3TDqG1lIGRlIGNhbGN1bCBkZXMgcHJlc3RhdGlvbnMgc29jaWFsZXMs IGVsbGUNCiAgICAgICAgc291aGFpdGUgw6lnYWxlbWVudCBpbnRlcm5hbGlzZXIgZGVzIGNvbXDD qXRlbmNlcyBkZQ0KICAgICAgICBtYWludGVuYW5jZSBzdXIgbOKAmW91dGlsbGFnZSBkZSBDYXRh bGEgYXUgdHJhdmVycyBkZSBjZQ0KICAgICAgICBwb3N0ZS4NCg0KICAgICAgICBMZSBjZW50cmUg dGVjaG5pcXVlIENhdGFsYSBhIGFpbnNpIHZvY2F0aW9uIMOgIHByb2R1aXJlIGRlcw0KICAgICAg ICBjb250cmlidXRpb25zIG9wZW4tc291cmNlIHN1ciBDYXRhbGEsIG1haXMgYXVzc2kgw6ANCiAg ICAgICAgcsOpcG9uZHJlIGF1eCBiZXNvaW5zIGTigJlleHBlcnRpc2UgdGVjaG5pcXVlIGR1IGTD qXBhcnRlbWVudA0KICAgICAgICDCqyBQcmVzdGF0aW9ucyBJbmRpdmlkdWVsbGVzIGV0IFLDqWbD qXJlbnRpZWxzIE3DqXRpZXJzIMK7IHBvdXINCiAgICAgICAgc2VzIHByb2pldHMgbGnDqXMgYXV4 IG1vdGV1cnMgZGUgY2FsY3VsIGRlcyBwcmVzdGF0aW9ucw0KICAgICAgICBzb2NpYWxlcy4NCg0K ICBMYSBwZXJzb25uZSByZWNydXTDqWUgdHJhdmFpbGxlcmEgYXZlYyBs4oCZw6lxdWlwZSBDYXRh bGEgZGUgbOKAmUlucmlhDQogIChMb3VpcyBHZXNiZXJ0LCBWaW5jZW50IEJvdGJvbCwgUm9tYWlu IFByaW1ldCBldCBtb2ktbcOqbWUpICEgTuKAmWjDqXNpdGV6DQogIHBhcyDDoCBtZSBjb250YWN0 ZXIgc2kgdm91cyBhdmV6IGRlcyBxdWVzdGlvbnMgc3VyIGxlIGpvYg0KICA6c2xpZ2h0X3NtaWxl Og0KDQogIFVuIHBldGl0IGFwZXLDp3UgZGVzIGNob3NlcyBmYWl0ZXMgZXQgw6AgZmFpcmUgZW4g Y29tcGlsYXRpb24gc3VyIENhdGFsYQ0KICA6IDxodHRwczovL2Jsb2cubWVyaWdvdXgub3ZoL2Vu LzIwMjYvMDIvMTkvYnVpbGRpbmctcHJvcGVyLXBsLmh0bWw+DQoNCg0Kb2NndGsgMC4xOiBPQ2Ft bCBiaW5kaW5ncyBmb3IgR1RLIDQgKHByZXZpZXcgcmVsZWFzZSkNCuKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rp c2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jZ3RrLTAtMS1vY2FtbC1iaW5kaW5ncy1mb3ItZ3RrLTQt cHJldmlldy1yZWxlYXNlLzE3OTQ0LzE+DQoNCg0KQ2hyaXMgQXJtc3Ryb25nIGFubm91bmNlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSeKAmW0gcGxlYXNlZCB0byBhbm5vdW5jZSB0aGUgZmly c3QgcHJldmlldyByZWxlYXNlIG9mIG9jZ3RrLCBPQ2FtbA0KICBiaW5kaW5ncyBmb3IgR1RLIDQg KHYwLjEtcHJldmlldzApLg0KDQoNCldoYXQgaXMgaXQ/DQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBbb2NndGtdIHByb3ZpZGVzIE9DYW1sIGJpbmRpbmdzIGZvciB0aGUg R1RLIDQgd2lkZ2V0IHRvb2xraXQgYW5kIGl0cw0KICBhc3NvY2lhdGVkIGxpYnJhcmllcyAoR0RL LCBHSU8sIFBhbmdvLCBHZGtQaXhidWYsIEdTSywgR3JhcGhlbmUsDQogIENhaXJvKS4gSXQgdGFy Z2V0cyBPQ2FtbCA+PTUuMyAoZm9yIG5vdykuDQoNCiAgSXQgaXMgaW5zcGlyZWQgYnksIGFuZCBk cmF3cyBzb21lIGNvcmUgY29tbW9uIGNvZGUgYW5kIG1hbnkgZGVzaWduDQogIGlkZWFzIGZyb20s IGxhYmxndGszIOKAlCB0aGUgbG9uZy1zdGFuZGluZyBHVEsgMyBiaW5kaW5ncw0KICBsaWJyYXJ5 LiBIb3dldmVyLCB0aGUgQVBJcyBhcmUgbm90IGNvbXBhdGlibGU6IHdoZXJlYXMgbGFibGd0azPi gJlzDQogIGJpbmRpbmdzIGFyZSBsYXJnZWx5IGhhbmQtd3JpdHRlbiwgb2NndGsgdXNlcyBhIGNv ZGUgZ2VuZXJhdG9yIHRoYXQNCiAgcmVhZHMgR09iamVjdCBJbnRyb3NwZWN0aW9uIChHSVIpIGRl ZmluaXRpb24gZmlsZXMgdG8gcHJvZHVjZSBib3RoIEMNCiAgc3R1YnMgYW5kIE9DYW1sIHdyYXBw ZXJzLiBUaGlzIG1lYW5zIGJpbmRpbmcgY292ZXJhZ2UgdHJhY2tzIHRoZSBHSVINCiAgZGVmaW5p dGlvbnMgcmF0aGVyIHRoYW4gaGFuZC13cml0dGVuIGVmZm9ydCwgYW5kIHRoZSBnZW5lcmF0ZWQg Y29kZQ0KICBmb2xsb3dzIGEgY29uc2lzdGVudCBwcm9jZWR1cmFsIHN0cnVjdHVyZS4NCg0KICAq QSBub3RlIG9uIHRvb2xpbmcqOiB0aGUgY29kZSBnZW5lcmF0b3IgaXRzZWxmIHdhcyBkZXZlbG9w ZWQgd2l0aA0KICAgaGVhdnkgYXNzaXN0YW5jZSBmcm9tIExMTXMuIEhvd2V2ZXIsIHRoZSBvdXRw dXQgKHRoZSBDIHN0dWJzIGFuZA0KICAgT0NhbWwgbW9kdWxlcyB0aGF0IGZvcm0gdGhlIGFjdHVh bCBsaWJyYXJ5KSBpcyBwcm9ncmFtbWF0aWNhbGx5DQogICBnZW5lcmF0ZWQgZnJvbSB0aGUgR0lS IGRlZmluaXRpb25zLCBub3Qgd3JpdHRlbiBieSBhbiBMTE0uDQoNCg0KW29jZ3RrXSA8aHR0cHM6 Ly9naXRodWIuY29tL2NocmlzLWFybXN0cm9uZy9vY2d0az4NCg0KDQpXaGF04oCZcyBpbXBsZW1l bnRlZA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAg4oCiIEJpbmRpbmdzIGZvciBHVEsgNCwgR0RLLCBHSU8sIFBhbmdvLCBHZGtQaXhi dWYsIEdTSywgR3JhcGhlbmUsIGFuZA0KICAgIENhaXJvDQogIOKAoiBDbGFzc2VzLCByZWNvcmRz LCBlbnVtZXJhdGlvbnMsIGFuZCBiaXRmaWVsZHMNCiAg4oCiIENvbnN0cnVjdG9ycywgbWV0aG9k cywgYW5kIHByb3BlcnRpZXMNCiAg4oCiIFNpZ25hbHMgKG5vIHJldHVybiB2YWx1ZXMgb3IgcGFy YW1ldGVycykNCiAg4oCiIEEgd29ya2luZyBleGFtcGxlOiBhIEdUSyA0IGNhbGN1bGF0b3IgYXBw bGljYXRpb24NCg0KDQpXaGF04oCZcyBtaXNzaW5nDQrilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYwNCg0KICBUaGlzIGlzIGEgZmlyc3QgbWlsZXN0b25lLCBub3QgYSBw cm9kdWN0aW9uLXJlYWR5IHJlbGVhc2UuIFNldmVyYWwNCiAgaW1wb3J0YW50IGZlYXR1cmVzIGFy ZSBub3QgeWV0IHN1cHBvcnRlZDoNCg0KICDigKIgKkludGVyZmFjZXMqOiBHT2JqZWN0IGludGVy ZmFjZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkLiBUaGlzIGhhcyBhDQogICAgYnJvYWRlciBpbXBh Y3QgdGhhbiBpdCBtaWdodCBhcHBlYXI6IG5vdCBvbmx5IGFyZSBpbnRlcmZhY2UgdHlwZXMNCiAg ICB0aGVtc2VsdmVzIGFic2VudCwgYnV0IGFueSBtZXRob2Qgb24gYSBjbGFzcyB0aGF0IHRha2Vz IGFuIGludGVyZmFjZQ0KICAgIGFzIGEgcGFyYW1ldGVyIG9yIHJldHVybnMgYW4gaW50ZXJmYWNl IHR5cGUgaXMgYWxzbyBzdXBwcmVzc2VkLiBUaGlzDQogICAgbWVhbnMgc29tZSBtZXRob2RzIG9u IG90aGVyd2lzZS1zdXBwb3J0ZWQgY2xhc3NlcyB3aWxsIGJlIG1pc3NpbmcNCiAgICBmcm9tIHRo ZSBiaW5kaW5ncy4NCiAg4oCiICpDYWxsYmFja3MqOiBGdW5jdGlvbnMgdGhhdCBhY2NlcHQgT0Nh bWwgY2FsbGJhY2tzIGFzIGFyZ3VtZW50cw0KICAgIChiZXlvbmQgc2lnbmFscykgYXJlIG5vdCB5 ZXQgc3VwcG9ydGVkLiBUaGlzIGxpbWl0cyB1c2Ugb2YgbWFueQ0KICAgIGFzeW5jaHJvbm91cyBH SU8gQVBJcyBhbmQgc29tZSBHVEsgcGF0dGVybnMuDQogIOKAoiAqRnJlZSBmdW5jdGlvbnM6KiBU b3AtbGV2ZWwgZnVuY3Rpb25zIChub3QgYXR0YWNoZWQgdG8gYSBjbGFzcykgYXJlDQogICAgbm90 IHlldCBnZW5lcmF0ZWQuIFNvbWUgdXRpbGl0eSBBUElzIGFyZSB0aGVyZWZvcmUgdW5hdmFpbGFi bGUuDQogIOKAoiAqTm9uLW9wYXF1ZSByZWNvcmQgZmllbGQgYWNjZXNzOiogRmllbGRzIG9mIG5v bi1vcGFxdWUgR0xpYi9HREsNCiAgICByZWNvcmRzIGNhbm5vdCB5ZXQgYmUgcmVhZCBkaXJlY3Rs eS4NCiAg4oCiICpNdWx0aS1wYXJhbWV0ZXIgc2lnbmFsczoqIE9ubHkgc2lnbmFscyB3aXRoIHpl cm8gcGFyYW1ldGVycyBhbmQgbm8NCiAgICAgcmV0dXJuIHZhbHVlIGFyZSBzdXBwb3J0ZWQ7IHNp Z25hbHMgd2l0aCBjb21wbGV4IHNpZ25hdHVyZXMgYXJlDQogICAgIHNpbGVudGx5IHNraXBwZWQu DQogIOKAoiAqR0xpYiB0eXBlcyo6IG1vc3QgR0xpYiB0eXBlcyBhcmUgbm90IGJvdW5kLCB3aGlj aCBtZWFucyB0aGF0DQogICAgIHNldmVyYWwgdXNlZnVsIEFQSXMgdGhhdCB1c2UgbGlzdHMsIGJ5 dGUgYXJyYXlzLCBHVmFyaWFudHMgKGhlYXZpbHkNCiAgICAgdXNlZCBieSBEQnVzKSBhcmUgbm90 IGF2YWlsYWJsZS4NCg0KICBUaGVzZSBnYXBzIG1lYW4geW91IGNhbiBidWlsZCBiYXNpYyBHVEsg YXBwbGljYXRpb25zLCBidXQgZXhwZWN0IHRvDQogIGhpdCB3YWxscyB3aXRoIG1vcmUgYWR2YW5j ZWQgd2lkZ2V0IHVzYWdlLCBhc3luY2hyb25vdXMgSS9PLCBvciBhbnkNCiAgQVBJIHRoYXQgcmVs aWVzIGhlYXZpbHkgb24gaW50ZXJmYWNlcy4NCg0KICBUaGVyZSBpcyBhIFtST0FETUFQLm1kXSB0 aGF0IGxpc3RzIHRoZSByb3VnaCBwbGFuIHRvIGRlYWwgd2l0aCBtdWNoIG9mDQogIHRoZSBhYm92 ZS4NCg0KDQpbUk9BRE1BUC5tZF0NCjxodHRwczovL2dpdGh1Yi5jb20vY2hyaXMtYXJtc3Ryb25n L29jZ3RrL2Jsb2IvbWFpbi9ST0FETUFQLm1kPg0KDQoNCkRvY3VtZW50YXRpb24NCuKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIEFQSSByZWZlcmVuY2UgZG9jdW1l bnRhdGlvbiBpcyBjdXJyZW50bHkgZGVmaWNpZW50LiBBY2N1cmF0ZWx5DQogIGdlbmVyYXRpbmcg ZG9jdW1lbnRhdGlvbiBmcm9tIEdJUiBkZWZpbml0aW9ucyBpcyBhbiB1bnNvbHZlZCBwcm9ibGVt DQogIGZvciB0aGlzIHByb2plY3QsIHNvIGZvciBub3cgdGhlIGdlbmVyYXRlZCBtb2R1bGVzIGFy ZSBsYXJnZWx5DQogIHVuZG9jdW1lbnRlZC4gSW4gdGhlIG1lYW50aW1lLCB0aGUgR1RLIDQgZG9j dW1lbnRhdGlvbiBpcyB0aGUgYmVzdA0KICByZWZlcmVuY2UgZm9yIHVuZGVyc3RhbmRpbmcgd2hh dCBlYWNoIGJpbmRpbmcgY29ycmVzcG9uZHMgdG8sIGFuZCB0aGUNCiAgZXhhbXBsZXMgaW4gdGhl IHJlcG9zaXRvcnkgaWxsdXN0cmF0ZSBwcmFjdGljYWwgdXNhZ2Ug4oCUIGluIHBhcnRpY3VsYXIN CiAgdGhlIGNhbGN1bGF0b3IgZXhhbXBsZSwgd2hpY2ggZGVtb25zdHJhdGVzIGEgbm9uLXRyaXZp YWwgR1RLIDQNCiAgYXBwbGljYXRpb24uDQoNCg0KU3RhYmlsaXR5DQrilYzilYzilYzilYzilYzi lYzilYzilYzilYwNCg0KICBUaGlzIGNvZGUgaXMgdW50ZXN0ZWQgaW4gcHJvZHVjdGlvbiBlbnZp cm9ubWVudHMuIFRoZSBnZW5lcmF0ZWQNCiAgYmluZGluZ3MgY292ZXIgYSBsYXJnZSBzdXJmYWNl IGFyZWEsIGJ1dCB0ZXN0IGNvdmVyYWdlIGlzIG5vdCB5ZXQNCiAgY29tcHJlaGVuc2l2ZS4gSSB3 b3VsZCBjYXV0aW9uIGFnYWluc3QgdXNlIGluIGFueSBwcm9kdWN0aW9uIG9yDQogIHNhZmV0eS1z ZW5zaXRpdmUgY29udGV4dCBhdCB0aGlzIHN0YWdlLiBDb21tZW50cyBvciBNUnMgYXJlIHdlbGNv bWUuDQoNCiAgVGhpcyBjb2RlIGhhcyBub3QgYmVlbiB0ZXN0ZWQgb3V0c2lkZSBvZiBMaW51eCBl bnZpcm9ubWVudHMuDQoNCg0KSW5zdGFsbGF0aW9uIGFuZCBVc2FnZQ0K4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg RG93bmxvYWQgYW5kIHBpbiB0aGUgc291cmNlIGNvZGUgZm9yIG5vdyAoSeKAmW0gaW4gdGhlIHBy b2Nlc3Mgb2YNCiAgcHJlcGFyaW5nIGFuIG9wYW0gcmVsZWFzZS4gVGhpcyBpcyB0YWtpbmcgYSBz b21lIHRpbWUgdG8gc29ydCB0aHJvdWdoDQogIGNyb3NzLXBsYXRmb3JtIGlzc3Vlcywgc28gSeKA mWxsIHVwZGF0ZSBoZXJlIHdpdGggYSBjb21tZW50IHdoZW4gdGhhdCBpcw0KICBhdmFpbGFibGUp Lg0KDQogIFRoZSBiaW5kaW5ncyBoYXZlIGJlZW4gZ2VuZXJhdGVkIGFnYWluc3QgR1RLIDQuMTQu NSAoVWJ1bnR1IDI0LjA0KS4gSWYNCiAgeW91IGhhdmUgYW4gb2xkZXIgdmVyc2lvbiwgaXQgc2hv dWxkIHN0aWxsIGNvbXBpbGUgKGluIHRoZW9yeSksIGJ1dA0KICB5b3Ugd2lsbCByZWNlaXZlIHJ1 bnRpbWUgZXJyb3JzIG9uIEFQSXMgbm90IGF2YWlsYWJsZSBpbiB5b3VyIHZlcnNpb24uDQoNCiAg MS4gRG93bmxvYWQgdGhlIHJlcG9zaXRvcnk6PGh0dHBzOi8vZ2l0aHViLmNvbS9jaHJpcy1hcm1z dHJvbmcvb2NndGs+DQogICAgICh5b3UgY2FuIHVzZSB0aGUgdjAuMS1wcmV2aWV3MCB0YWcgdG8g Z2V0IHdoYXQgSeKAmXZlIG1lbnRpb25lZCBoZXJlKQ0KICAyLiBQaW4gdGhlIGNvbmYtZ3RrNCBh bmQgb2NndGsgcGFja2FnZXMgaW4gdGhlaXIgcmVzcGVjdGl2ZQ0KICAgICBzdWJkaXJlY3Rvcmll cw0KICAgICAxLiBgb3BhbSBwaW4gY29uZi1ndGsnDQogICAgIDIuIGBvcGFtIHBpbiBvY2d0aycN CiAgMy4gUnVuIGBvcGFtIGluc3RhbGwgb2NndGsnDQoNCiAgRWFjaCBsaWJyYXJ5IGlzIGV4cG9z ZWQgYXQgdGhlIG9jYW1sZmluZCBsZXZlbCBhcyBgb2NndGsuPGxpYm5hbWU+JyAtDQogIGZvciBl eGFtcGxlLCBhZGQgYG9jZ3RrLmd0aycgb3IgYG9jZ3RrLmdkaycgdG8geW91ciBkdW5lIGZpbGUs IHdoaWxlDQogIGRlcGVuZGluZyBvbiBgb2NndGsnIGluIHlvdXIgYG9wYW0nIC8gYGR1bmUtcHJv amVjdCcgZmlsZS4NCg0KICAqU291cmNlIGFuZCBpc3N1ZSB0cmFja2VyKjogPGh0dHBzOi8vZ2l0 aHViLmNvbS9jaHJpcy1hcm1zdHJvbmcvb2NndGs+DQoNCiAgRmVlZGJhY2sgYW5kIGJ1ZyByZXBv cnRzIHdlbGNvbWUuDQoNCg0Kb3V0LWNoYW5uZWwtcmVkaXJlY3QgMC4xIOKAlCBSZWRpcmVjdCBh bmQgY2FwdHVyZSBvdXRfY2hhbm5lbCBvdXRwdXQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW91dC1j aGFubmVsLXJlZGlyZWN0LTAtMS1yZWRpcmVjdC1hbmQtY2FwdHVyZS1vdXQtY2hhbm5lbC1vdXRw dXQvMTc5NDUvMT4NCg0KDQpIaHVnbyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEnigJltIGhhcHB5IHRvIGFubm91bmNlIHRoZSBm aXJzdCByZWxlYXNlIG9mIFtvdXQtY2hhbm5lbC1yZWRpcmVjdF0sIGENCiAgbGlicmFyeSBmb3Ig cmVkaXJlY3RpbmcgYW5kIGNhcHR1cmluZyBvdXRwdXQgd3JpdHRlbiB0byBvdXRfY2hhbm5lbHMu DQoNCg0KW291dC1jaGFubmVsLXJlZGlyZWN0XSA8aHR0cHM6Ly9naXRodWIuY29tL2hodWdvL291 dC1jaGFubmVsLXJlZGlyZWN0Pg0KDQpGZWF0dXJlczoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIOKAoiBDYXB0dXJlIGFueSBvdXRfY2hhbm5lbCBpbnRvIGEgc3RyaW5nICh3aXRo IGNvbnZlbmllbmNlIHNob3J0aGFuZHMNCiAgICBmb3Igc3Rkb3V0IGFuZCBzdGRlcnIpDQogIOKA oiBSZWRpcmVjdCBvbmUgY2hhbm5lbCBpbnRvIGFub3RoZXINCiAg4oCiIFdvcmtzIG9uIG5hdGl2 ZSAodmlhIGR1cC9kdXAyKSwgSmF2YVNjcmlwdCAoanNfb2Zfb2NhbWwpLCBhbmQNCiAgICBXZWJB c3NlbWJseSAod2FzbV9vZl9vY2FtbCkNCiAg4oCiIEV4cGVydCBBUEkgZm9yIG1hbnVhbCByZWRp cmVjdGlvbiBsaWZldGltZSBjb250cm9sDQoNCg0KSW5zdGFsbGF0aW9uOg0K4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBv cGFtIGluc3RhbGwgb3V0LWNoYW5uZWwtcmVkaXJlY3QNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0K UXVpY2sgZXhhbXBsZToNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgbGV0IG91dHB1dCwgcmVzdWx0ID0NCiAg4pSC ICAgT3V0X2NoYW5uZWxfcmVkaXJlY3QuY2FwdHVyZV9jaGFubmVsIHNvbWVfY2hhbm5lbCB+Zjoo ZnVuICgpIOKGkiANCiAg4pSCICAgICBQcmludGYuZnByaW50ZiBzb21lX2NoYW5uZWwg4oCcaGVs bG/igJ07DQogIOKUgiAgICAgNDIpDQogIOKUgiAoKiBvdXRwdXQgPSDigJxoZWxsb+KAnSwgcmVz dWx0ID0gNDIgKikNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KcHB4bGliLjAuMzguMA0K4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZTogPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tcHB4bGliLTAtMzgtMC8xNzk0OC8xPg0KDQoNCk5hdGhh biBSZWJvdXJzIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgVGhlIHBweGxpYiB0ZWFt IGlzIGhhcHB5IHRvIGFubm91bmNlIHRoZSByZWxlYXNlIG9mIHBweGxpYi4wLjM4LjAuDQoNCiAg VGhlIG1haW4gZmVhdHVyZXMgb2YgdGhpcyByZWxlYXNlIGFyZSBzdXBwb3J0IGZvciBPQ2FtbCA1 LjUgYW5kDQogIGltcHJvdmVkIHN1cHBvcnQgb2YgT0NhbWwgNS40IGFuZCA1LjMuIEl0IGFsc28g Y29tZXMgd2l0aCBhIGZldyBidWcNCiAgZml4ZXMgYW5kIGEgY291cGxlIG5ldyBBUEkgZW50cmll cywgeW91IGNhbiByZWFkIHRoZSBleHRlbnNpdmUgcmVsZWFzZQ0KICBub3RlcyBbaGVyZV0uDQoN CiAgVGhpcyBpcyBvdXIgZmlyc3QgcmVsZWFzZSBzaW5jZSB3ZSBhbm5vdW5jZWQgb3VyIG5ldyBh cHByb2FjaCB0bw0KICBzdXBwb3J0aW5nIG5ldyBjb21waWxlcnMgaW4gW3RoaXMgdGhyZWFkXS4g QWxsIHN1cHBvcnQgZm9yIGNvbXBpbGVycw0KICB2ZXJzaW9ucyBgPj0gNS4zJyBpcyBpbXBsZW1l bnRlZCB1c2luZyB0aGlzIHRlY2huaXF1ZSBhbmQgbmV3IGxhbmd1YWdlDQogIGZlYXR1cmVzIGFy ZSBlbmNvZGVkIGludG8gdGhlIEFTVC4gV2UndmUgYWRkZWQgYEFzdF9idWlsZGVyJyBhbmQNCiAg YEFzdF9wYXR0ZXJuJyBmdW5jdGlvbnMgdG8gYWxsb3cgeW91IHRvIG1hbmlwdWxhdGUgc29tZSBv ZiB0aG9zZSwgc3VjaA0KICBhcyBsYWJlbGVkIHR1cGxlcyBvciBlZmZlY3QgcGF0dGVybnMuIFlv dSBjYW4gc2VlIHRob3NlIGluIG91ciBBUEkNCiAgZG9jdW1lbnRhdGlvbiBbaGVyZV0gYW5kIFt0 aGVyZV0uIFdlJ3ZlIGFsc28gaWxsdXN0cmF0ZWQgaG93IHRvIHVzZQ0KICB0aGVtIGluIG91ciBb bmV3IG1hbnVhbCBzZWN0aW9uXS4gSWYgeW91J3JlIGludGVyZXN0ZWQgaW4gcHJvZHVjaW5nIG9y DQogIGNvbnN1bWluZyBvdGhlciBuZXcgbGFuZ3VhZ2UgZmVhdHVyZXMgdGhhdCBjYW5ub3QgYmUg cmVwcmVzZW50ZWQgd2l0aA0KICBvdXIgY3VycmVudCBpbnRlcm5hbCBBU1QgKDUuMiksIHBsZWFz ZSBbb3BlbiBhbiBpc3N1ZV0gc28gd2UgY2FuIGFkZA0KICB0aGUgcmVsZXZhbnQgaGVscGVycy4N Cg0KICBHaXZlbiB0aGUgZWNvc3lzdGVtIGhhc24ndCB5ZXQgcmVjb3ZlcmVkIGZyb20gdGhlIDUu MiBBU1QgYnVtcCBhbmQNCiAgYHBweGxpYi4wLjM2LjAnLCB3ZSdyZSBnbGFkIHRoYXQgd2UgY2Fu IGFkZCBzdXBwb3J0IGZvciBuZXcgY29tcGlsZXJzDQogIHdpdGhvdXQgaW50cm9kdWNpbmcgZnVy dGhlciBicmVha2FnZSBhbmQga2VlcCB0aGUgbWFpbnRlbmFuY2UgYnVyZGVuDQogIHdpdGhpbiBw cHhsaWIncyBib3VuZHMuICBXZSd2ZSBzdGFydGVkIFtkaXNjdXNzaW9uc10gd2l0aCB0aGUgY29t cGlsZXINCiAgdGVhbSB0byBtYWtlIHRoaXMgYXBwcm9hY2ggZXZlbiBtb3JlIHZpYWJsZSBpbiB0 aGUgZnV0dXJlIG9uIG91ciBlbmQuDQoNCiAgV2UnZCBsaWtlIHRvIHRoYW5rIEBjZWFzdGx1bmQg d2hvJ3Mgb3VyIG9ubHkgZXh0ZXJuYWwgY29udHJpYnV0b3IgZm9yDQogIHRoaXMgcmVsZWFzZS4N Cg0KICBJJ2QgcGVyc29uYWxseSBsaWtlIHRvIHRoYW5rIEBwYXRyaWNvZmVycmlzIGZvciBoaXMg aGVscCBnZXR0aW5nIHRoaXMNCiAgb3V0IHRoZSBkb29yIGFzIHdlbGwgYXMgdGhlIE9DYW1sIFNv ZnR3YXJlIEZvdW5kYXRpb24gYW5kIE9DYW1sUHJvIGZvcg0KICBmdW5kaW5nIG15IHdvcmsgb24g cHB4bGliLg0KDQogIFRoYW5rIHlvdSBmb3IgcmVhZGluZyBhbmQgaGFwcHkgcHJlcHJvY2Vzc2lu ZyENCg0KDQpbaGVyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1wcHgvcHB4bGliL3JlbGVh c2VzL3RhZy8wLjM4LjA+DQoNClt0aGlzIHRocmVhZF0NCjxodHRwczovL2Rpc2N1c3Mub2NhbWwu b3JnL3QvYW5uLXBweGxpYi1zdXBwb3J0LWZvci1mdXR1cmUtY29tcGlsZXJzLzE3NDMwPg0KDQpb aGVyZV0NCjxodHRwczovL29jYW1sLXBweC5naXRodWIuaW8vcHB4bGliL3BweGxpYi9QcHhsaWIv QXN0X2J1aWxkZXIvRGVmYXVsdC9pbmRleC5odG1sI2Z1dHVyZS1hc3RzPg0KDQpbdGhlcmVdDQo8 aHR0cHM6Ly9vY2FtbC1wcHguZ2l0aHViLmlvL3BweGxpYi9wcHhsaWIvUHB4bGliL0FzdF9wYXR0 ZXJuL2luZGV4Lmh0bWwjZnV0dXJlLWFzdHM+DQoNCltuZXcgbWFudWFsIHNlY3Rpb25dDQo8aHR0 cHM6Ly9vY2FtbC1wcHguZ2l0aHViLmlvL3BweGxpYi9wcHhsaWIvY29tcGF0aWJpbGl0eS5odG1s I2Z1dHVyZV9jb21waWxlcnM+DQoNCltvcGVuIGFuIGlzc3VlXSA8aHR0cHM6Ly9naXRodWIuY29t L29jYW1sLXBweC9wcHhsaWIvaXNzdWVzL25ldz4NCg0KW2Rpc2N1c3Npb25zXSA8aHR0cHM6Ly9n aXRodWIuY29tL29jYW1sL29jYW1sL2lzc3Vlcy8xNDY2OD4NCg0KDQpBIFByb3Bvc2FsIGZvciBW b2x1bnRhcnkgQUkgRGlzY2xvc3VyZSBpbiBPQ2FtbCBDb2RlDQrilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNz Lm9jYW1sLm9yZy90L2EtcHJvcG9zYWwtZm9yLXZvbHVudGFyeS1haS1kaXNjbG9zdXJlLWluLW9j YW1sLWNvZGUvMTc5NTAvMT4NCg0KDQpBbmlsIE1hZGhhdmFwZWRkeSBhbm5vdW5jZWQNCuKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIERlYXIgYWxsLA0KDQogIEkndmUgcHV0IHRvZ2V0aGVy IGFuICpbb2NhbWwtYWktZGlzY2xvc3VyZV0qIHByb3Bvc2FsIHRvIGFsbG93DQogIHZvbHVudGFy eSBkaXNjbG9zdXJlIG9mIEFJIHVzYWdlIGluIHB1Ymxpc2hlZCBPQ2FtbCBjb2RlLCB1c2luZyBv cGFtDQogIG1ldGFkYXRhIGFuZCBbZXh0ZW5zaW9uIGF0dHJpYnV0ZXNdIGluIHNvdXJjZSBjb2Rl Lg0KDQogIFRoZSByZXBvc2l0b3J5IGFuZCBbYmxvZyBwb3N0XSBoYXZlIG1vcmUgZGV0YWlscywg c29tZSBwcm90b3R5cGUNCiAgdG9vbGluZyB0byBleHRyYWN0IGF0dHJpYnV0ZXMsIGFuZCBhIEZB USwgYnV0IGluIGEgbnV0c2hlbGwgSSdtDQogIHByb3Bvc2luZyBzb21ldGhpbmcgdmVyeSBzaW1p bGFyIHRvIGEgW1czQyBkaXNjbG9zdXJlIHByb3Bvc2FsIGZvcg0KICBIVE1MXS4NCg0KDQpbb2Nh bWwtYWktZGlzY2xvc3VyZV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9hdnNtL29jYW1sLWFpLWRpc2Ns b3N1cmU+DQoNCltleHRlbnNpb24gYXR0cmlidXRlc10gPGh0dHBzOi8vb2NhbWwub3JnL21hbnVh bC81LjMvYXR0cmlidXRlcy5odG1sPg0KDQpbYmxvZyBwb3N0XSA8aHR0cHM6Ly9hbmlsLnJlY29p bC5vcmcvbm90ZXMvb3BhbS1haS1kaXNjbG9zdXJlPg0KDQpbVzNDIGRpc2Nsb3N1cmUgcHJvcG9z YWwgZm9yIEhUTUxdDQo8aHR0cHM6Ly93d3cudzMub3JnL2NvbW11bml0eS9haS1jb250ZW50LWRp c2Nsb3N1cmUvPg0KDQpQYWNrYWdlIERpc2Nsb3N1cmVzDQrilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBbiBvcGFtIHBhY2thZ2Ug Y2FuIGRlY2xhcmUgaXRzIGRpc2Nsb3N1cmUgdXNpbmcgZXh0ZW5zaW9uIGZpZWxkczoNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIHgtYWktZGlzY2xvc3VyZTogImFpLWFzc2lzdGVkIg0KICDi lIIgeC1haS1tb2RlbDogImNsYXVkZS1vcHVzLTQtNiINCiAg4pSCIHgtYWktcHJvdmlkZXI6ICJB bnRocm9waWMiDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIC9Ob3RlOiBUaGlzIG1heSBqdXN0IGJl Y29tZSBhIGxpc3Qgb2YgdmFsdWVzIGluIHRoZSBmaW5hbCBwcm9wb3NhbCwNCiAgYnV0IHlvdSBn ZXQgdGhlIGlkZWEuLw0KDQoNCk9DYW1sIE1vZHVsZSBsZXZlbA0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgT0NhbWwgc3VwcG9ydHMg ZXh0ZW5zaW9uIGF0dHJpYnV0ZXMsIHdoaWNoIHdlIHVzZSB2aWEgYSBmbG9hdGluZw0KICBhdHRy aWJ1dGUgdGhhdCBhcHBsaWVzIHRvIHRoZSBlbnRpcmUgY29tcGlsYXRpb24gdW5pdDoNCg0KICDi lIzilIDilIDilIDilIANCiAg4pSCIFtAQEBhaV9kaXNjbG9zdXJlICJhaS1nZW5lcmF0ZWQiXQ0K ICDilIIgW0BAQGFpX21vZGVsICJjbGF1ZGUtb3B1cy00LTYiXQ0KICDilIIgW0BAQGFpX3Byb3Zp ZGVyICJBbnRocm9waWMiXQ0KICDilIIgDQogIOKUgiBsZXQgZm9vID0gLi4uDQogIOKUgiBsZXQg YmFyID0gLi4uDQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIFRoZXNlIGNhbiBhbHNvIGJlIHNjb3Bl ZCBtb3JlIGZpbmVseSB2aWEgZGVjbGFyYXRpb24gYXR0cmlidXRlcyB0aGF0DQogIGFwcGx5IHRv IGEgc2luZ2xlIGJpbmRpbmc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbQEBAYWlfZGlz Y2xvc3VyZSAiYWktYXNzaXN0ZWQiXQ0KICDilIIgDQogIOKUgiBsZXQgaHVtYW5fd3JpdHRlbiB4 ID0gLi4uDQogIOKUgiANCiAg4pSCIGxldCBhaV9oZWxwZXIgeSA9IC4uLg0KICDilIIgW0BAYWlf ZGlzY2xvc3VyZSAiYWktZ2VuZXJhdGVkIl0NCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgRGlzY2xv c3VyZSBmb2xsb3dzIGEgbmVhcmVzdC1hbmNlc3RvciBpbmhlcml0YW5jZSBtb2RlbCBsaWtlIHRo ZSBXM0MNCiAgSFRNTCBwcm9wb3NhbCwgd2hlcmVieSBhbiBleHBsaWNpdCBhbm5vdGF0aW9uIG92 ZXJyaWRlcyB0aGUgaW5oZXJpdGVkDQogIHZhbHVlLg0KDQogIEkgd3JvdGUgYSBbYmxvZyBwb3N0 IHdpdGggbW9yZSBkZXRhaWxzXSwgYXMgd2VsbCBhcyBhbiBbRkFRIGluIHRoZQ0KICBwcm9wb3Nh bCByZXBvc2l0b3J5XSBhYm91dCBzb21lIG9mIHRoZSBpbXBsaWNhdGlvbnMuDQoNCiAgSSBjb3Vs ZG4ndCBmaW5kIGFueSBvdGhlciBwcmlvciBhcnQgb2Ygb3RoZXIgbGFuZ3VhZ2UgZWNvc3lzdGVt cw0KICB0cnlpbmcgYW55dGhpbmcgc2ltaWxhciwgc28gSSdkIGJlIGludGVyZXN0ZWQgaW4gaGVh cmluZyBhYm91dCBhbnkNCiAgb3RoZXJzIHlvdSBhbGwga25vdyBhYm91dC4gSWYgdGhlcmUncyBu byBpbnRlcmVzdCBpbiB0aGUgd2lkZXINCiAgZWNvc3lzdGVtIGluIGRvaW5nIHRoaXMsIHRoZW4g SSdsbCBqdXN0IHVzZSBpdCBteXNlbGYsIGJ1dCBJIGZpZ3VyZWQNCiAgdGhlcmUncyBubyBoYXJt IGluIHN0YXJ0aW5nIHRoZSBkaXNjdXNzaW9uIQ0KDQoNCltibG9nIHBvc3Qgd2l0aCBtb3JlIGRl dGFpbHNdDQo8aHR0cHM6Ly9hbmlsLnJlY29pbC5vcmcvbm90ZXMvb3BhbS1haS1kaXNjbG9zdXJl Pg0KDQpbRkFRIGluIHRoZSBwcm9wb3NhbCByZXBvc2l0b3J5XQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9hdnNtL29jYW1sLWFpLWRpc2Nsb3N1cmU+DQoNCg0KQmxvZzogT0NhbWwgZG9jdW1lbnRhdGlv biBhcyBtYXJrZG93bg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9ibG9nLW9jYW1sLWRvY3VtZW50YXRpb24tYXMtbWFya2Rvd24vMTc5NTEvMT4NCg0KDQpEYXZp ZCBTYW5jaG8gYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJIHB1Ymxpc2hlZCBhIGJsb2cgcG9z dCBhYm91dCBvZG9jJ3MgbWFya2Rvd24gYmFja2VuZCBhbmQgaG93IEkgdXNlZA0KICBpdCB0byBt YWtlIHRoZSBtZWxhbmdlLnJlIGRvY3VtZW50YXRpb24gYmV0dGVyLCBob3BlIHlvdSBsaWtlIGl0 Og0KDQogIDxodHRwczovL3NhbmNoby5kZXYvYmxvZy9vY2FtbC1kb2N1bWVudGF0aW9uLWFzLW1h cmtkb3duPg0KDQogIFRoYW5rcyB0byBAam9ubHVkbGFtIEByZ3JpbmJlcmcgYW5kIEBBbGl6dGVy IGZvciByZXZpZXdpbmcgdGhlIHdvcmsNCiAgdGhhdCBtYWRlIGl0IHBvc3NpYmxlLg0KDQoNCmhv dHNlYXQgU3F1YXZhIChhIHRpbnkgTGFibEd0azIgZGVtbykNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWhvdHNlYXQtc3F1YXZhLWEtdGlueS1sYWJsZ3Rr Mi1kZW1vLzE3OTU3LzE+DQoNCg0KRGFtaWVuIEd1aWNoYXJkIGFubm91bmNlZA0K4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSADQoNCiAgPGh0dHBzOi8vcGFzdGViaW4uY29tL053dTJhQzdBPg0KDQogIFRoZSBb U3F1YXZhIGJvYXJkIGdhbWVdLg0KDQogIDxodHRwczovL3VzMS5kaXNjb3Vyc2UtY2RuLmNvbS9m bGV4MDIwL3VwbG9hZHMvb2NhbWwvb3JpZ2luYWwvMlgvOC84N2MzMWQ5ZjEyN2Y5OWYxMmU5NmVj ZmY2YzU3OWI3MTA5MjZmOTQ1LnBuZz4NCg0KICBTcXVhdmEgMS4xIGhhcyBubyB2ZWN0b3IgZ3Jh cGhpY3MsIGhvd2V2ZXIgeW91IGNhbiBlZGl0L3Nocmluay9zdHJldGNoDQogIGAuL3NxdWF2YS5w bmcnIGFuZCB0aGUgcHJvZ3JhbSB3aWxsIGFkYXB0IHRoZSBib2FyZCB1c2luZyB0aGUgbmV3DQog IHBpeG1hcC4NCg0KICA8aHR0cHM6Ly91czEuZGlzY291cnNlLWNkbi5jb20vZmxleDAyMC91cGxv YWRzL29jYW1sL29yaWdpbmFsLzJYLzYvNjZjYzQxMmU4MDRmN2QxZTgxYTZkMTFlYTVjNDY0NWYz ZWRmYzg3MS5qcGVnPg0KDQoNCltTcXVhdmEgYm9hcmQgZ2FtZV0gPGh0dHBzOi8vYm9hcmRnYW1l Z2Vlay5jb20vYm9hcmRnYW1lLzExMjc0NS9zcXVhdmE+DQoNCg0Kb3BlbnRlbGVtZXRyeSAwLjkw IChhbmQgYXNzb2NpYXRlZCBsaWJyYXJpZXMpDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBB cmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Fubi1vcGVudGVsZW1ldHJ5 LTAtOTAtYW5kLWFzc29jaWF0ZWQtbGlicmFyaWVzLzE3OTU4LzE+DQoNCg0KU2ltb24gQ3J1YW5l cyBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhlbGxvLA0KDQogIEknbSB0aHJpbGxlZCB0 byBhbm5vdW5jZSBbb3BlbnRlbGVtZXRyeSAwLjkwXSAoYXMgd2VsbCBhcw0KICBgb3BlbnRlbGVt ZXRyeS1jbGllbnQnLCBgb3BlbnRlbGVtZXRyeS1jbGllbnQtY29odHRwLWx3dCcsIGV0Yy4pLg0K DQogIE9wZW50ZWxlbWV0cnkgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgPGh0dHBzOi8vb3BlbnRl bGVtZXRyeS5pby8+IGZvcg0KICBPQ2FtbDsgaXQgY292ZXJzIGJvdGggdGhlIGNvcmUgX2NsaWVu dCBBUElfIChmb3IgaW5zdHJ1bWVudGF0aW9uIG9mDQogIGxpYnJhcmllcywgZXRjLikgYW5kIHRo ZSBmdWxsIFNESyB3aXRoIHZhcmlvdXMgX2V4cG9ydGVyc18uIEl0IGlzDQogIGNvbXBhdGlibGUg d2l0aCBbVHJhY2VdLg0KDQogIFRoaXMgcmVsZWFzZSBpcyB0aGUgcmVzdWx0IG9mIG1vbnRocyBv ZiB3b3JrIGFuZCBpcyBob3BlZnVsbHkgb25lIG9mDQogIHRoZSBsYXN0IGJlZm9yZSAxLjAuIFRo ZSBbY2hhbmdlbG9nXSBpcyBwcmV0dHkgYmlnLCBJIHJld29ya2VkIGEgbG90DQogIG9mIHRoaW5n czsgYW1vbmcgb3RoZXJzOg0KICDigKIgbW92ZSB0byBvY2FtbC1wcm90b2MvcGJydCA0LjAgKHdp dGggbXV0YWJsZSBmaWVsZHMgYW5kIGEgZGlmZmVyZW50DQogICAgY29kZWdlbiBmb3IgcHJvdG9i dWZzKQ0KICDigKIgdGhlIEFQSSBpcyBjbG9zZXIgdG8gZ3VpZGVsaW5lcyBmcm9tIDxodHRwczov L29wZW50ZWxlbWV0cnkuaW8+IChub3QNCiAgICBmdWxseSB0aGVyZSB5ZXQgYnV0IGJldHRlcikN CiAg4oCiIG1vZHVsYXJpdHkgb2YgdGhlIGludGVybmFsIHByb2Nlc3Npbmcgb2Ygc2lnbmFscyBp cyBtdWNoIGltcHJvdmVkLA0KICAgIHdpdGggYmV0dGVyIGNvZGUgcmV1c2UsIHBsdWdnYWJsZSB+ ZXZlcnl0aGluZywgYmV0dGVyDQogICAgcXVldWVpbmcvYmF0Y2hpbmcsIEhUVFAgcmV0cmllcw0K ICDigKIgc3VwcG9ydCBmb3IgZXhwb3J0aW5nIGFzIEpTT04gaW5zdGVhZCBvZiBwcm90b2J1Zg0K ICDigKIgc3VwcG9ydCBmb3IgdHJhY2UgMC4xMSwgd2hpY2ggYWxsb3dzIGBvcGVudGVsZW1ldHJ5 LnRyYWNlJyB0byBlc2NoZXcNCiAgICBhbGwgaXRzIGdsb2JhbCBzdGF0ZSBleGNlcHQgZm9yIHRo ZSBnbG9iYWwgT1RFTCBleHBvcnRlcg0KICDigKIgYmV0dGVyIGxpZmVjeWNsZSBhbmQgY2xlYW51 cA0KDQogIEFQSSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZCBbaGVyZV0uIEFzIGFsd2F5cywg ZmVlZGJhY2ssIGJ1Zw0KICByZXBvcnRzLCBldGMgYXJlIHZlcnkgd2VsY29tZS4NCg0KDQpbb3Bl bnRlbGVtZXRyeSAwLjkwXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC10cmFjaW5nL29jYW1s LW9wZW50ZWxlbWV0cnkvcmVsZWFzZXMvdGFnL3YwLjkwPg0KDQpbVHJhY2VdIDxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwtdHJhY2luZy9vY2FtbC10cmFjZS8+DQoNCltjaGFuZ2Vsb2ddDQo8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sLXRyYWNpbmcvb2NhbWwtb3BlbnRlbGVtZXRyeS9ibG9iL21h aW4vQ0hBTkdFUy5tZCMwOTA+DQoNCltoZXJlXSA8aHR0cHM6Ly9vY2FtbC10cmFjaW5nLmdpdGh1 Yi5pby9vY2FtbC1vcGVudGVsZW1ldHJ5Lz4NCg0KDQpEdW5lIDMuMjINCuKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6IDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qv YW5uLWR1bmUtMy0yMi8xNzkxMi8yPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFNob24g YW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIANCg0KICBUaGUgRHVuZSB0ZWFtIGlzIHBsZWFzZWQgdG8gYW5ub3VuY2UgW3Ro ZSByZWxlYXNlIG9mIGR1bmUgMy4yMi4xXS4NCg0KICBJZiB5b3UgZW5jb3VudGVyIGEgcHJvYmxl bSB3aXRoIHRoaXMgcmVsZWFzZSwgcGxlYXNlIHJlcG9ydCBpdCBpbiBbb3VyDQogIGlzc3VlIHRy YWNrZXJdLg0KDQoNClt0aGUgcmVsZWFzZSBvZiBkdW5lIDMuMjIuMV0NCjxodHRwczovL2dpdGh1 Yi5jb20vb2NhbWwvZHVuZS9yZWxlYXNlcy90YWcvMy4yMi4xPg0KDQpbb3VyIGlzc3VlIHRyYWNr ZXJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1ZXM+DQoNCkZpeGVkDQrilYzi lYzilYzilYzilYwNCg0KICDigKIgUmVzdG9yZSBjb21wYXRpYmlsaXR5IHdpdGggV2luZG93cyA3 ICgjMTM5MDUsIEBub2piKQ0KDQogIOKAoiBgZHVuZSB0ZXN0JyBub3cgcnVucyB0ZXN0cyBpbiB0 aGUgZGVmYXVsdCBjb250ZXh0IG9ubHkuIFdoZW4gdGhlcmUNCiAgICBpcyBhIHNpbmdsZSBjb250 ZXh0LCBpdCBpcyB0cmVhdGVkIGFzIHRoZSBkZWZhdWx0LiBUaGlzIGZpeGVzIGENCiAgICBjcmFz aCB3aGVuIHRoZSB3b3Jrc3BhY2UgaGFzIG5vIGNvbnRleHQgbmFtZWQgImRlZmF1bHQiLiAoIzEz OTMwLA0KICAgIGZpeGVzICMxMzkwNCwgQEFsaXp0ZXIpDQoNCiAg4oCiIEZpeCBgZHVuZSB0cmFj ZSBjYXQgLS1jaHJvbWUtdHJhY2UnIHRvIGFkaGVyZSB0byB0aGUgQ2hyb21lIFRyYWNlDQogICAg RXZlbnQgRm9ybWF0IGJ5IHByb3ZpZGluZyB0aW1lc3RhbXBzIGFuZCBkdXJhdGlvbnMgYXQgbWlj cm9zZWNvbmQNCiAgICBncmFudWxhcml0eSAoIzEzOTExLCBmaXhlcyAjMTM5MDYsIEBBbGl6dGVy KQ0KDQoNCk9sZCBDV04NCuKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIElmIHlvdSBoYXBwZW4g dG8gbWlzcyBhIENXTiwgeW91IGNhbiBbc2VuZCBtZSBhIG1lc3NhZ2VdIGFuZCBJJ2xsIG1haWwN CiAgaXQgdG8geW91LCBvciBnbyB0YWtlIGEgbG9vayBhdCBbdGhlIGFyY2hpdmVdIG9yIHRoZSBb UlNTIGZlZWQgb2YgdGhlDQogIGFyY2hpdmVzXS4NCg0KICBJZiB5b3UgYWxzbyB3aXNoIHRvIHJl Y2VpdmUgaXQgZXZlcnkgd2VlayBieSBtYWlsLCB5b3UgbWF5IHN1YnNjcmliZQ0KICB0byB0aGUg W2NhbWwtbGlzdF0uDQoNCiAgW0FsYW4gU2NobWl0dF0NCg0KDQpbc2VuZCBtZSBhIG1lc3NhZ2Vd IDxtYWlsdG86YWxhbi5zY2htaXR0QHBvbHl0ZWNobmlxdWUub3JnPg0KDQpbdGhlIGFyY2hpdmVd IDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi8+DQoNCltSU1MgZmVlZCBvZiB0aGUg YXJjaGl2ZXNdIDxodHRwczovL2FsYW4ucGV0aXRlcG9tbWUubmV0L2N3bi9jd24ucnNzPg0KDQpb Y2FtbC1saXN0XSA8aHR0cHM6Ly9zeW1wYS5pbnJpYS5mci9zeW1wYS9pbmZvL2NhbWwtbGlzdD4N Cg0KW0FsYW4gU2NobWl0dF0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvPg0KDQo= --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 31 to April 07,= 2026.

    restricted 2.0.0 limit which system operations and which parts= of the filesystem your program can access

    removewingman announced

    Hello,

    I am happy to announce a new version of restricted.

    This library lets you limit which system operations and which parts of the = filesystem your program can access. Call it as early as possible in your pr= ogram so that the rest of the code runs with reduced privileges. Currently,= actual enforced restrictions are implemented for these operating systems:

    • OpenBSD
    • Linux (only filesystem view)

    Even on other operating systems, you can still use restricted to document which privil= eges your program needs. Users can then test if your program respects these= promises with tools such as pledge= on Linux. Enjoy :slight_smile:

    CHANGELOG:

    • tested on:
      • x86_64 openbsd (16/16 Tests passed)
      • x86_64-alpine-linux (Landlock ABI version: 7) (4/12 Tests passed: file_= read_unv, file_write_unv, file_create_unv_linux, file_cwrr_unv_linux)

    Added

    • API: exec promises and accesses optional
    • OpenBSD: exec promises

    Removed

    • SystemOperation.TmpPath (deprecated see: pledge (2))

    Job offer: compiler engineer for Catala @ CNAF (social benefit= s agency)

    Denis Merigoux announced

    [The following is in French since this is a job offer in the French public = sector]

    Candidatez ici : https://www.lasecurecrute.fr/offre-emploi/ingenieur-expert-en-comp= ilation-langages-de-programmation--f-h/normandie/1065497

    La CNAF (Caisse Nationale des Allocations Familiales), t=C3=AAte de = r=C3=A9seau des 101 CAF, repr=C3=A9sente la branche Famille de la S=C3=A9cu= rit=C3=A9 sociale et a pour mission de piloter la politique familiale et l= =E2=80=99aide aux populations en situation de pr=C3=A9carit=C3=A9 ainsi que= la politique d=E2=80=99action sociale.

    Au sein de la Direction des Syst=C3=A8mes d=E2=80=99Information (DSI), comp= tant environ 880 collaborateurs, la Direction Prestations Flux et D=C3= =A9cisionnel (DPFD) est d=C3=A9coup=C3=A9e en 4 d=C3=A9partements et vo= us serez rattach=C3=A9 au d=C3=A9partement =C2=AB Prestations Individuel= les et R=C3=A9f=C3=A9rentiels M=C3=A9tiers =C2=BB qui est pr=C3=A9sent = sur les sites de Caen, Le Mans et Rennes.

    Ce d=C3=A9partement a pour mission principale de concevoir, d=C3=A9velopper= et maintenir le syst=C3=A8me d=E2=80=99information li=C3=A9 aux prestation= s individuelles (prestations vers=C3=A9es aux allocataires telles que l=E2= =80=99allocation familiale, l=E2=80=99allocation logement, la prime =C3=A0 = la naissance, le RSA, la prime d=E2=80=99activit=C3=A9, =E2=80=A6). Le d=C3= =A9partement fournit ainsi des moteurs de r=C3=A8gles, ainsi que les sp=C3= =A9cifications fonctionnelles associ=C3=A9es afin de calculer le bon droit,= au bon moment, pour les allocations vers=C3=A9es par les CAF.

    Dans le cadre de projets strat=C3=A9giques pour la branche famille, la ou l= e candidat int=C3=A9grera le centre technique Catala de la CNAF.

    Catala est un langage de programmation d=C3=A9di=C3=A9 d=C3=A9velopp=C3=A9 = par l=E2=80=99Institut National de Recherche en Informatique et en Automati= que (Inria), sp=C3=A9cialement adapt=C3=A9 =C3=A0 la transformation de sp= =C3=A9cifications juridiques et r=C3=A9glementaires en code informatique. L= a CNAF ayant d=C3=A9cid=C3=A9 de s=E2=80=99appuyer sur Catala pour les proj= ets de modernisation de son syst=C3=A8me de calcul des prestations sociales= , elle souhaite =C3=A9galement internaliser des comp=C3=A9tences de mainten= ance sur l=E2=80=99outillage de Catala au travers de ce poste.

    Le centre technique Catala a ainsi vocation =C3=A0 produire des contributio= ns open-source sur Catala, mais aussi =C3=A0 r=C3=A9pondre aux besoins d=E2= =80=99expertise technique du d=C3=A9partement =C2=AB Prestations Individuel= les et R=C3=A9f=C3=A9rentiels M=C3=A9tiers =C2=BB pour ses projets li=C3=A9= s aux moteurs de calcul des prestations sociales.

    La personne recrut=C3=A9e travaillera avec l=E2=80=99=C3=A9quipe Catala de = l=E2=80=99Inria (Louis Gesbert, Vincent Botbol, Romain Primet et moi-m=C3= =AAme) ! N=E2=80=99h=C3=A9sitez pas =C3=A0 me contacter si vous avez des qu= estions sur le job :slight_smile:

    Un petit aper=C3=A7u des choses faites et =C3=A0 faire en compilation sur C= atala : https://blog.merigoux.ovh/en/2026/02/19/building-proper-pl.html

    ocgtk 0.1: OCaml bindings for GTK 4 (preview release)

    Chris Armstrong announced

    I=E2=80=99m pleased to announce the first preview release of ocgtk, OCaml b= indings for GTK 4 (v0.1-preview0).

    What is it?

    ocgtk provides OCa= ml bindings for the GTK 4 widget toolkit and its associated libraries (GDK,= GIO, Pango, GdkPixbuf, GSK, Graphene, Cairo). It targets OCaml >=3D5.3 (for n= ow).

    It is inspired by, and draws some core common code and many design ideas fr= om, lablgtk3 =E2=80=94 the long-standing GTK 3 bindings library. However, t= he APIs are not compatible: whereas lablgtk3=E2=80=99s bindings are largely= hand-written, ocgtk uses a code generator that reads GObject Introspection= (GIR) definition files to produce both C stubs and OCaml wrappers. This me= ans binding coverage tracks the GIR definitions rather than hand-written ef= fort, and the generated code follows a consistent procedural structure.

    A note on tooling: the code generator itself was developed with heav= y assistance from LLMs. However, the output (the C stubs and OCaml modules = that form the actual library) is programmatically generated from the GIR de= finitions, not written by an LLM.

    What=E2=80=99s implemented

    • Bindings for GTK 4, GDK, GIO, Pango, GdkPixbuf, GSK, Graphene, and Cair= o
    • Classes, records, enumerations, and bitfields
    • Constructors, methods, and properties
    • Signals (no return values or parameters)
    • A working example: a GTK 4 calculator application

    What=E2=80=99s missing

    This is a first milestone, not a production-ready release. Several importan= t features are not yet supported:

    • Interfaces: GObject interfaces are not yet supported. This has a= broader impact than it might appear: not only are interface types themselves absent, but any method on a= class that takes an interface as a parameter or returns an interface type = is also suppressed. This means some methods on otherwise-supported classes = will be missing from the bindings.
    • Callbacks: Functions that accept OCaml callbacks as arguments (b= eyond signals) are not yet supported. This limits use of many asynchronous GIO APIs and some GTK patte= rns.
    • Free functions: Top-level functions (not attached to a class) ar= e not yet generated. Some utility APIs are therefore unavailable.
    • Non-opaque record field access: Fields of non-opaque GLib/GDK re= cords cannot yet be read directly.
    • Multi-parameter signals: Only signals with zero parameters and = no return value are supported; signals with complex signatures are silentl= y skipped.
    • GLib types: most GLib types are not bound, which means that seve= ral useful APIs that use lists, byte arrays, GVariants (heavily used by DBu= s) are not available.

    These gaps mean you can build basic GTK applications, but expect to hit wal= ls with more advanced widget usage, asynchronous I/O, or any API that relie= s heavily on interfaces.

    There is a ROADMAP.md that lists the rough plan to deal with much of the= above.

    Documentation

    API reference documentation is currently deficient. Accurately generating d= ocumentation from GIR definitions is an unsolved problem for this project, so for now the generat= ed modules are largely undocumented. In the meantime, the GTK 4 documentation is the best referenc= e for understanding what each binding corresponds to, and the examples in the repository illust= rate practical usage =E2=80=94 in particular the calculator example, which demonstrates a non-trivial GTK = 4 application.

    Stability

    This code is untested in production environments. The generated bindings co= ver a large surface area, but test coverage is not yet comprehensive. I would caution a= gainst use in any production or safety-sensitive context at this stage. Comments or MRs are w= elcome.

    This code has not been tested outside of Linux environments.

    Installation and Usage

    Download and pin the source code for now (I=E2=80=99m in the process of pre= paring an opam release. This is taking a some time to sort through cross-pl= atform issues, so I=E2=80=99ll update here with a comment when that is avai= lable).

    The bindings have been generated against GTK 4.14.5 (Ubuntu 24.04). If you = have an older version, it should still compile (in theory), but you will re= ceive runtime errors on APIs not available in your version.

    1. Download the repository:https://github.com/chris-armstrong/ocgtk (you can use the v0.1-pr= eview0 tag to get what I=E2=80=99ve mentioned here)
    2. Pin the conf-gtk4 and ocgtk packages in their respective subdirectories
      1. opam pin conf-gtk
      2. opam pin ocgtk
    3. Run opam install ocgtk

    Each library is exposed at the ocamlfind level as ocgtk.<libname&g= t; - for example, add ocgtk.gtk or ocgtk.gdk to your dune file, while depending on ocgtk in your o= pam / dune-project file.

    Source and issue tracker: https://github.com/chris-armstrong/ocgtk

    Feedback and bug reports welcome.

    out-channel-redirect 0.1 =E2=80=94 Redirect and capture out_ch= annel output

    Hhugo announced

    I=E2=80=99m happy to announce the first release of out-channel-redirect, a library for r= edirecting and capturing output written to out_channels.

    Features:

    • Capture any out_channel into a string (with convenience shorthands for = stdout and stderr)
    • Redirect one channel into another
    • Works on native (via dup/dup2), JavaScript (js_of_ocaml), and WebAssemb= ly (wasm_of_ocaml)
    • Expert API for manual redirection lifetime control

    Installation:

    opam install out-channel-redirect
    

    Quick example:

    let output, result =3D
      Out_channel_redirect.<=
    /span>capture_channel some_channel ~f:(fu=
    n () →=20
        Printf.fprintf so=
    me_channelhello”=
    ;;
        42)
    (* output =3D “hello”, result =3D<=
    span style=3D"color: #8f6f4a; font-style: italic;"> 42 *)
    

    ppxlib.0.38.0

    Nathan Rebours announced

    The ppxlib team is happy to announce the release of ppxlib.0.38.0.

    The main features of this release are support for OCaml 5.5 and improved su= pport of OCaml 5.4 and 5.3. It also comes with a few bug fixes and a couple= new API entries, you can read the extensive release notes here.

    This is our first release since we announced our new approach to supporting= new compilers in this thread. All support for compilers ver= sions >=3D 5.3 is implemented using this technique and new = language features are encoded into the AST. We've added Ast_builder and Ast_pattern functions to allow you to manipulate som= e of those, such as labeled tuples or effect patterns. You can see those in= our API documentation here and there. We've also illustrated how to use them in our new manual section. If you're interested in producing or consum= ing other new language features that cannot be represented with our current= internal AST (5.2), please open an issue so we can add the relevant helpers.

    Given the ecosystem hasn't yet recovered from the 5.2 AST bump and pp= xlib.0.36.0, we're glad that we can add support for new compilers wi= thout introducing further breakage and keep the maintenance burden within p= pxlib's bounds. We've started discu= ssions with the compiler team to make this approach even more viable in= the future on our end.

    We'd like to thank @ceastlund who's our only external contributor for this = release.

    I'd personally like to thank @patricoferris for his help getting this out t= he door as well as the OCaml Software Foundation and OCamlPro for funding m= y work on ppxlib.

    Thank you for reading and happy preprocessing!

    A Proposal for Voluntary AI Disclosure in OCaml Code

    Anil Madhavapeddy announced

    Dear all,

    I've put together an ocaml-ai-disclosure proposal to allow voluntary disclosure of = AI usage in published OCaml code, using opam metadata and extension attributes in source = code.

    The repository and blog post have more details, some prototype tooling to extract att= ributes, and a FAQ, but in a nutshell I'm proposing something very similar = to a W3C di= sclosure proposal for HTML.

    Package Disclosures

    An opam package can declare its disclosure using extension fields:

    x-ai-disclosure: "ai-assisted"
    x-ai-model: "claude-opus-4-6"
    x-ai-provider: "Anthropic"
    

    Note: This may just become a list of values in the final proposal, but y= ou get the idea.

    OCaml Module level

    OCaml supports extension attributes, which we use via a floating attribute = that applies to the entire compilation unit:

    [@@@ai_d=
    isclosure "ai-generated"]
    [@@@ai_model "claude-opus-4-6"]
    [@@@ai_provider "Anthropic"]
    
    let foo =3D ...
    let bar =3D ...
    

    These can also be scoped more finely via declaration attributes that apply = to a single binding:

    [@@@ai_d=
    isclosure "ai-assisted"]
    
    let human_written x=
     =3D ...
    
    let ai_helper y =3D ...
    [@@ai_disclosure "ai-generated"]
    

    Disclosure follows a nearest-ancestor inheritance model like the W3C HTML p= roposal, whereby an explicit annotation overrides the inherited value.

    I wrote a blog= post with more details, as well as an FAQ in the proposal repository about some of th= e implications.

    I couldn't find any other prior art of other language ecosystems trying any= thing similar, so I'd be interested in hearing about any others you all kno= w about. If there's no interest in the wider ecosystem in doing this, then = I'll just use it myself, but I figured there's no harm in starting the disc= ussion!

    Blog: OCaml documentation as markdown

    David Sancho announced

    I published a blog post about odoc's markdown backend and how I used it to = make the melange.re documentation better, hope you like it:

    https:/= /sancho.dev/blog/ocaml-documentation-as-markdown

    Thanks to @jonludlam @rgrinberg and @Alizter for reviewing the work that ma= de it possible.

    hotseat Squava (a tiny LablGtk2 demo)

    Damien Guichard announced

    https://pastebin.com/Nwu2aC7A

    The Squava bo= ard game.

    3D"87c31d9f127f99f1=

    Squava 1.1 has no vector graphics, however you can edit/shrink/stretch ./squava.png and the program will adapt the board using the new pi= xmap.

    3D"66cc412e804f7d1=

    opentelemetry 0.90 (and associated libraries)

    Simon Cruanes announced

    Hello,

    I'm thrilled to announce opentelemetry 0.90 (as well as = opentelemetry-client, opentelemetry-client-cohttp-lwt, = etc.).

    Opentelemetry is an implementation of https://opentelemetry.io/ for OCaml; it covers both the core client API (for instrumentation of libraries, etc.)= and the full SDK with various exporters. = It is compatible with Trace.

    This release is the result of months of work and is hopefully one of the la= st before 1.0. The changelog is pretty big, I reworked a= lot of things; among others:

    • move to ocaml-protoc/pbrt 4.0 (with mutable fields and a different code= gen for protobufs)
    • the API is closer to guidelines from https://opentelemetry.io (not fully there yet but better)
    • modularity of the internal processing of signals is much improved, with= better code reuse, pluggable ~everything, better queueing/batching, HTTP r= etries
    • support for exporting as JSON instead of protobuf
    • support for trace 0.11, which allows opentelemetry.trace t= o eschew all its global state except for the global OTEL exporter
    • better lifecycle and cleanup

    API documentation can be found here. As always, feedback, bug reports, etc are ve= ry welcome.

    Dune 3.22

    Continuing this thread, Shon announced

    The Dune team is pleased to announce the release of dune 3.22.1.

    If you encounter a problem with this release, please report it in our issue tracker.

    Fixed

    • Restore compatibility with Windows 7 (#13905, @nojb)
    • dune test now runs tests in the default context only. When= there is a single context, it is treated as the default. This fixes a cras= h when the workspace has no context named "default". (#13930, fixes #13904,= @Alizter)
    • Fix dune trace cat --chrome-trace to adhere to the Chrome = Trace Event Format by providing timestamps and durations at microsecond gra= nularity (#13911, fixes #13906, @Alizter)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmnUzysbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cerMQgA0k0MgCJbP+FHKjPNsUpKo2vOhNu38KRw58INQPmQ Uo05NFShu9/pLmasE1meRpaa8vpvt0Fxvmc7V5DhJixe++e+/ynpPtp1Ei35cjyy 4zQVSrV9vY7nhfLG5qJFMlhBh/Y0wGJ9nmlR2c7FqncvQiMoGGS1RSJf03JJAXri 0KHnvq1ZFiGrO94QLIxxwg6gLbQ3rurGtVwB31gHwWVUFpYRW4eJiEvKwhsZ3Z57 9nY/Aa0JRZXMDFsMe21odLeycRPRvFuhoAoY/Jf532/43g4zLvW0XFJKhsz/AKez 5Yqf1O2MaRseN9VOQQUtBcPiZqMtnlxBuT2OZ37mudayAQ== =f1fC -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=N2kekb5x; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id C14B440085 for ; Tue, 14 Apr 2026 09:50:14 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=NI9ERJYthiWcrEZS0WaAR1/DWM27+XfVg3yqrpaOowQ=; b=N2kekb5xgVcuFtXeCeMOXe5pgq7IwIWaCYMb/smu7VbMr24wEyazsxnn CyoNv5gW9Yd0gWSbu0R+WFm3JbgBUvCOglUlUvS2YMHro65CD9GaYYUCO SOhaVZcte1GeHR5GUQEx2zkkuf5LyjoDqBpK+2JXHw47uFG8WlCh7igUN k=; X-CSE-ConnectionGUID: sSRPEU/lQ7qMwA0PPjx+Tw== X-CSE-MsgGUID: h4GGMINoTzWz0dE5JCWkCA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,179,1770591600"; d="asc'?scan'208,217";a="272404658" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 14 Apr 2026 11:50:14 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id A492D82CCD; Tue, 14 Apr 2026 11:50:13 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id D4B1682CBB for ; Tue, 14 Apr 2026 11:50:02 +0200 (CEST) X-CSE-ConnectionGUID: IgT2Wl2iRBGixnPnqCGKgQ== X-CSE-MsgGUID: srvPW6llROeU2EtVpPdcPg== IronPort-SDR: 69de0dc9_goDV0G9Breelx95FnUm0vlJKK2M7Kq1jUwk8b/GZ9nQduAy a+zdLmabJrPrvU0zeqn+t+0YdvNyzaNvNZa+iVw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0G2EgCWDN5pjyIeaIFagRWDAVspGgFsXxkaBwhJSYQPg?= =?us-ascii?q?0+OJYEWkDeJcYEKDYJtAxgWIQIOBwEDAQgFLgEVCgECBAEBAwECAYIMgnQCF?= =?us-ascii?q?jkVjEkCHwYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQEBCwEBBQEBAQIBAQIEB?= =?us-ascii?q?gECEAEBAQEBATkFSYZPDYJFUXFlCTcBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQECBAQDAQEjDW4DBgQGEwEBOBgjAxQBBgMCB?= =?us-ascii?q?A0BNRcBEhQGghBYAYIiAk8DBQwGmT6bRHp/M4EBggwBAQaBCD4DDwMBDgkm2?= =?us-ascii?q?hGBXgkJgTUYgViEGYJKDw0BBSVJagIBAoRPCYQ2Jw+BVUSBFTWCPQdvgVABe?= =?us-ascii?q?RcBAQEBAYE0BAMBAQhFCYMlgmmCJnoUHYJbBoFGYYIEBR0wgX+FP4JCLAFVE?= =?us-ascii?q?xcLBwVegQgDKi8tbjIdgSM+FzRYGwcFgUuFKoFhgRODbIEDAwttPTcUG4lYE?= =?us-ascii?q?CENgR1DGSKBPC0CDj0BAg8GCR4PFAEaEwEbDgEBIi0BCCMWCgUUDg4BEwQ3C?= =?us-ascii?q?QoIAw0tkk4MJQECBiSddJNZHW00B4QfgV4GDIkIgSaSMINXhASBV4s8hwKSU?= =?us-ascii?q?iKYZCKCNocogSYJgW9rlWACBoVQgX8jgVwzGjAiIYIzATMJRhwPiCGGDBaBE?= =?us-ascii?q?wEBgRuBByiBNAqBJoF0O7ooQTUBAQEBOwcCBwELBIVrAQGMBjRuXQEB?= IronPort-PHdr: A9a23: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 FjQRTtubovtrcn1fZJITT0JkKA= IronPort-Data: A9a23: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 M6s7jn2xG5rsu5jEewpcBf1r4WLd4s8Jzk= IronPort-HdrOrdr: A9a23:O+yhTag829+2GXmvK+6YA5lF93BQXuUji2hC6mlwRA09TyX4rb HNoB1/73WYtN9/YhAdcLy7VJVoIkmslqKdg7NwAV7KZmCP01dAR7sN0WKN+VLdMhy73tEY/6 ZteapzBbTLfD1HpPe/xhK3V/IpwNzvytHOuQ4y9QYIcT1X X-Talos-CUID: =?us-ascii?q?9a23=3AQ53+v2ped0XVGOVqJOZQtirmUeEqTifiyC3RGWW?= =?us-ascii?q?XCHZvcLuMYnCz95oxxg=3D=3D?= X-Talos-MUID: 9a23:fPXeaQT7RMP7mjcWRXT3ni9aC5ls556JBX1XvIk4o/GIPhR/bmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,179,1770591600"; d="asc'?scan'208,217";a="272404539" X-MGA-submission: =?us-ascii?q?MDE/sFmemRlXOlQkm50+FG0+oX3J/Mxmqffoe4?= =?us-ascii?q?S7hLGdwb/cQ1HjBUnWMMyOkmqKqVp6RVa6bxWrUiVBdxlSKhRBGQI5tt?= =?us-ascii?q?xM7NFivrvfu2PlNn6Mg+NJcUH+oFnt5HSBe2wkhWgUMVAZiGOB7Cxguo?= =?us-ascii?q?N8LwX6YMZX5jbBQoyCo4vTsg=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 14 Apr 2026 11:50:02 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 5D2CF1A47B; Tue, 14 Apr 2026 11:50:01 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 14 Apr 2026 11:50:00 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 14 11:50:01 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499622, queueID=7E42F1A828 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19486 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMDcgdG8gMTQsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNhbGwgZm9y IHByZXNlbnRhdGlvbnM6IENhbWwgaW4gdGhlIENhcGl0YWwgSUkNCkxpc3QgeW91ciBvcGVuIE9D YW1sIHBvc2l0aW9ucyBvbiB0aGUgT0NhbWwub3JnIGpvYiBib2FyZA0KWUFNTHg6IHB1cmUtT0Nh bWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCm9jYW1sLWxldHNlbmNyeXB0LCBhbiBPQ2FtbCB3YXkg dG8gZ2V0IFRMUyBjZXJ0aWZpY2F0ZXMNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAg YW5kIE1lcmxpbiA1LjcuMC01MDQNCk9DYW1sIFlBTUwgbGlicmFyeQ0KSTE4biA1LjAg4oCUIElu dGVybmF0aW9uYWxpc2F0aW9uIG1hZGUgZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0KQVREIDQuMS4w IC0gbm93IHdpdGggWUFNTCBzdXBwb3J0DQpPbGQgQ1dODQoNCg0KQ2FsbCBmb3IgcHJlc2VudGF0 aW9uczogQ2FtbCBpbiB0aGUgQ2FwaXRhbCBJSQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoN CiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9jYWxsLWZvci1wcmVz ZW50YXRpb25zLWNhbWwtaW4tdGhlLWNhcGl0YWwtaWkvMTc5NTkvMT4NCg0KDQpTYWNoYSBBeW91 biBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lIDp3YXZpbmdfaGFuZDoNCg0KICBG b2xsb3dpbmcgdGhlIHN1Y2Nlc3Mgb2YgdGhlIGxhc3QgZXZlbnQsIHdlJ3JlIG9yZ2FuaXNpbmcg YSBzZWNvbmQNCiAgZWRpdGlvbiBvZiBDYW1sIEluIHRoZSBDYXBpdGFsIChoYXBwZW5pbmcgaW4g TG9uZG9uKS4gRnJvbSB0YWxraW5nIHRvDQogIHRoZSBhdHRlbmRlZXMgYXQgdGhlIGZpcnN0IGV2 ZW50LCB3ZSB3aWxsIGJlIGRvaW5nIHNob3J0ZXIgdGFsa3MgYW5kDQogIG1vcmUgc29jaWFsaXNp bmcg8J+NlQ0KDQogIFNvIGZhciwgd2UgYXJlIGFpbWluZyBmb3IgKk1heSAxNHRoKiwgdG8gYmUg Y29uZmlybWVkIG9uY2Ugd2UgaGF2ZQ0KICBzZWN1cmVkIGEgdmVudWUuIFBsZWFzZSBsZXQgdXMg a25vdyBpZiB0aGlzIGlzIGNsYXNoaW5nIHdpdGggYW5vdGhlcg0KICBiaWcgZXZlbnQgb2ZmIG91 ciByYWRhci4NCg0KICBPbmNlIHdlIGNvbmZpcm0gdGhlIGRhdGUgYW5kIHByZXNlbnRhdGlvbnMs IHdlJ2xsIHBvc3QgaGVyZSBhbmQgb24gdGhlDQogIGRlZGljYXRlZCBbWnVsaXAgY2hhbm5lbF0g YXMgd2VsbCBhcyBbb3VyIHdlYnNpdGVdLg0KDQoNCltadWxpcCBjaGFubmVsXQ0KPGh0dHBzOi8v b2NhbWwuenVsaXBjaGF0LmNvbS8jbmFycm93L2NoYW5uZWwvNTUzMzc1LUNhbWwtSW4tVGhlLUNh cGl0YWw+DQoNCltvdXIgd2Vic2l0ZV0gPGh0dHBzOi8vY2FtbC1pbi10aGUtY2FwaXRhbC5naXRo dWIuaW8+DQoNCkNhbGwgZm9yIHByZXNlbnRhdGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFdlJ3JlIGxv b2tpbmcgZm9yIHRhbGtzIHRoYXQgYXJlIG9mIGludGVyZXN0IHRvIHRoZSBlbnRpcmUgT0NhbWwN CiAgY29tbXVuaXR5LiAgVG9waWNzIGluY2x1ZGVzIChidXQgYXJlIG5vdCBsaW1pdGVkIHRvKToN CiAg4oCiIE9DYW1sIHRvb2xpbmcgKGJ1aWxkIHN5c3RlbXMsIHBhY2thZ2UgbWFuYWdlbWVudCwg bHNwLA0KICAgIGRvY3VtZW50YXRpb27igKYpDQogIOKAoiBUaGUgY29vbCBsaWJyYXJ5IHlvdSdy ZSB3b3JraW5nIG9uDQogIOKAoiBZb3VyIE9DYW1sLXJlbGF0ZWQgcmVzZWFyY2ggKGFzIGxvbmcg YXMgeW91IG1ha2UgaXQgYWNjZXNzaWJsZSBmb3INCiAgICBwZW9wbGUgb3V0c2lkZSB5b3VyIGZp ZWxkKQ0KICDigKIgU29tZSBwaWVjZSBvZiB0aGUgT0NhbWwgZWNvc3lzdGVtIHRoYXQgeW91J2Qg bGlrZSBwZW9wbGUgdG8gaGVhcg0KICAgIGFib3V0IChvY2FtbC5vcmcsIHRoZSBPQ2FtbCBTb2Z0 d2FyZSBGb3VuZGF0aW9uLCDigKYpDQogIOKAoiBZb3VyIGluZHVzdHJpYWwgdXNlIG9mIE9DYW1s DQogIOKAoiBldGMuDQoNCiAgSWYgeW914oCZZCBsaWtlIHRvIGdpdmUgYSB0YWxrLCBwbGVhc2Ug bWVzc2FnZSBtZSBvciBAQWxpc3RhaXIgZGlyZWN0bHkNCiAgd2l0aCBhIHRpdGxlIGFuZCBzaG9y dCBhYnN0cmFjdC4NCg0KDQpMaXN0IHlvdXIgb3BlbiBPQ2FtbCBwb3NpdGlvbnMgb24gdGhlIE9D YW1sLm9yZyBqb2IgYm9hcmQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2Nh bWwub3JnL3QvbGlzdC15b3VyLW9wZW4tb2NhbWwtcG9zaXRpb25zLW9uLXRoZS1vY2FtbC1vcmct am9iLWJvYXJkLzExMzc3LzIxPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJlYWQsIFZpa2FzSyBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgd291bGQgbGlrZSB0byBwb3N0IHRoaXMgam9iIHRoYXQg d2UgYXJlIGhpcmluZyBmb3IuDQoNCiAg4oCiIHRpdGxlOiBMZWFkIFN5c3RlbXMgU29mdHdhcmUg RW5naW5lZXINCiAg4oCiIGxpbms6DQogICAgPGh0dHBzOi8vY2FyZWVycy5jbG91ZC5jb20vam9i cy9sZWFkLXN5c3RlbXMtc29mdHdhcmUtZW5naW5lZXItcmVtb3RlLXVuaXRlZC1raW5nZG9tPg0K ICDigKIgbG9jYXRpb25zOg0KICAgIOKAoiBSZW1vdGUNCiAgICDigKIgVW5pdGVkLUtpbmdkb20N CiAg4oCiIHB1YmxpY2F0aW9uX2RhdGU6IDIwMjYtMDQtMDgNCiAg4oCiIGNvbXBhbnk6IENsb3Vk IFNvZnR3YXJlIEdyb3VwDQogIOKAoiBjb21wYW55X2xvZ286DQogICAgPGh0dHBzOi8vd3d3LmNs b3VkLmNvbS9tZWRpYV8xZTQwZTdkMDQ4ZjAxMTdkNDU0M2M5NDBmOWU3NDMzYjU0OWMwOGEwMy5z dmc+DQoNCg0KWUFNTHg6IHB1cmUtT0NhbWwgWUFNTCAxLjIvMS4xIGxpYnJhcnkNCuKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFy Y2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2Nh bWwteWFtbC0xLTItMS0xLWxpYnJhcnkvMTc5NzAvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91 bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGVsbG8sDQoNCiAgSSdtIGV4Y2l0ZWQgdG8gYW5ub3Vu Y2UgdGhlIGF2YWlsYWJpbGl0eSBvZiBbWUFNTHhdLCBhIGNvbXBsZXRlDQogIGltcGxlbWVudGF0 aW9uIG9mIHRoZSBZQU1MIDEuMiBhbmQgMS4xIHN0YW5kYXJkcy4gSXQgaXMgaW50ZW5kZWQgdG8N CiAgc3VwcG9ydCBtb3N0IHVzZXMgb2YgWUFNTCBpbmNsdWRpbmcgaXRzIHVzZSBhcyBhIGNvbmZp Z3VyYXRpb24gZmlsZQ0KICBmb3JtYXQgaW4gbmV3IGFwcGxpY2F0aW9ucyBhbmQgYW5hbHl6aW5n IFlBTUwgZmlsZXMgb2Ygb3RoZXINCiAgYXBwbGljYXRpb25zLg0KDQogIEZvciBhIGZ1bGxlciBk ZXNjcmlwdGlvbiwgY2hlY2sgb3V0IHRoZSBbcmVsZWFzZSBub3Rlc10uDQoNCiAgR2V0IHN0YXJ0 ZWQgd2l0aCBgb3BhbSBpbnN0YWxsIHlhbWx4Jy4gVGhlbiB1c2UgdGhlIGB5YW1seCcgY29tcGFu aW9uDQogIGNvbW1hbmQgdG8gY2hlY2sgdGhhdCBpdCBwYXJzZXMgYW5kIGludGVycHJldHMgeW91 ciBmYXZvcml0ZSBZQU1MDQogIGZpbGVzIGNvcnJlY3RseS4NCg0KICBIZXJlJ3MgYW4gZXhhbXBs ZSBzaG93aW5nIHRoZSB1c2Ugb2YgdGhlIGxpYnJhcnkgdG8gY29udmVydCBZQU1MIHRvDQogIEpT T046DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBSZWFkIFlBTUwgZnJvbSBzdGRpbiB3 aXRoIFlBTUx4LCBwcmludCBKU09OIHRvIHN0ZG91dCB3aXRoIFlvanNvbg0KICDilIIgDQogIOKU giAgICBUaGlzIGlzIGEgZGVtbyBzaG93aW5nIGhvdyB0byB1c2UgdGhlIFlBTUx4IGxpYnJhcnkg d2l0aCB0aGUgZGVmYXVsdA0KICDilIIgICAgc2V0dGluZ3MuICdZQU1MeC5WYWx1ZXMub25lX29m X3lhbWxfZXhuJyBvZmZlcnMgb3B0aW9ucyB0byByZXN0cmljdA0KICDilIIgICAgdGhlIGlucHV0 IGxhbmd1YWdlIG9yIHRvIGZvcmNlIHRoZSBpbnRlcnByZXRhdGlvbiBhcyBZQU1MIDEuMSBpbnN0 ZWFkIG9mDQogIOKUgiAgICBZQU1MIDEuMi4NCiAg4pSCIA0KICDilIIgICAgQ29tcGlsZSB3aXRo Og0KICDilIIgICAgICBvY2FtbGZpbmQgb3B0IC1vIHlhbWwtdG8tanNvbiBcDQogIOKUgiAgICAg ICAgLXBhY2thZ2UgeWFtbHgseW9qc29uIC1saW5rcGtnIHlhbWxfdG9fanNvbi5tbA0KICDilIIg KikNCiAg4pSCIA0KICDilIIgb3BlbiBQcmludGYNCiAg4pSCIA0KICDilIIgbGV0IHJlYyB5b2pz b25fb2ZfeWFtbHggKHggOiBZQU1MeC52YWx1ZSkgOiBZb2pzb24uU2FmZS50ID0NCiAg4pSCICAg bWF0Y2ggeCB3aXRoDQogIOKUgiAgIHwgTnVsbCBfIC0+IGBOdWxsDQogIOKUgiAgIHwgQm9vbCAo XywgeCkgLT4gYEJvb2wgeA0KICDilIIgICB8IEludCAoXywgeCkgLT4gYEludGxpdCAoSW50NjQu dG9fc3RyaW5nIHgpDQogIOKUgiAgIHwgRmxvYXQgKF8sIHgpIC0+IGBGbG9hdCB4DQogIOKUgiAg IHwgU3RyaW5nIChfLCB4KSAtPiBgU3RyaW5nIHgNCiAg4pSCICAgfCBTZXEgKF8sIHhzKSAtPiBg TGlzdCAoTGlzdC5tYXAgeW9qc29uX29mX3lhbWx4IHhzKQ0KICDilIIgICB8IE1hcCAoXywgeHMp IC0+DQogIOKUgiAgICAgICBgQXNzb2MgKExpc3QubWFwIChmdW4gKGxvYywgaywgdikgLT4NCiAg 4pSCICAgICAgICAgbWF0Y2ggKGsgOiBZQU1MeC52YWx1ZSkgd2l0aA0KICDilIIgICAgICAgICB8 IFN0cmluZyAoXywgaykgLT4gKGssIHlvanNvbl9vZl95YW1seCB2KQ0KICDilIIgICAgICAgICB8 IF8gLT4NCiAg4pSCICAgICAgICAgICAgIGtzcHJpbnRmIGZhaWx3aXRoICIlczogb25seSBzdHJp bmcga2V5cyBhcmUgc3VwcG9ydGVkIg0KICDilIIgICAgICAgICAgICAgICAoWUFNTHguZGVmYXVs dF9mb3JtYXRfbG9jIGxvYykNCiAg4pSCICAgICAgICkgeHMpDQogIOKUgiANCiAg4pSCIGxldCAo KSA9DQogIOKUgiAgIFlBTUx4LnJlZ2lzdGVyX2V4Y2VwdGlvbl9wcmludGVycyAoKTsNCiAg4pSC ICAgc3RkaW4NCiAg4pSCICAgfD4gSW5fY2hhbm5lbC5pbnB1dF9hbGwNCiAg4pSCICAgfD4gWUFN THguVmFsdWVzLm9uZV9vZl95YW1sX2V4bg0KICDilIIgICB8PiB5b2pzb25fb2ZfeWFtbHgNCiAg 4pSCICAgfD4gWW9qc29uLlNhZmUucHJldHR5X3RvX2NoYW5uZWwgc3Rkb3V0DQogIOKUgiAgIHw+ IHByaW50X25ld2xpbmUNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KW1lBTUx4XSA8aHR0cHM6Ly9n aXRodWIuY29tL21qYW1ib24veWFtbHg+DQoNCltyZWxlYXNlIG5vdGVzXSA8aHR0cHM6Ly9naXRo dWIuY29tL21qYW1ib24veWFtbHgvcmVsZWFzZXMvdGFnLzAuMS4wPg0KDQpGdW5kaW5nDQrilYzi lYzilYzilYzilYzilYzilYwNCg0KICBZQU1MeCBpcyBjdXJyZW50bHkgcmVsZWFzZWQgdW5kZXIg dGhlICpBR1BMKi4gVGhlcmUgaXMgYW4gb25nb2luZw0KICBmdW5kcmFpc2VyOiBvbmNlIGEgZnVu ZGluZyBnb2FsIGlzIHJlYWNoZWQsIHRoZSBsaWNlbnNlIHdpbGwgc3dpdGNoIHRvDQogIHRoZSBw ZXJtaXNzaXZlICpJU0MqIGxpY2Vuc2UgZm9yIGV2ZXJ5b25lLiBEb25vcnMgYWJvdmUgYSBjZXJ0 YWluDQogIHRocmVzaG9sZCByZWNlaXZlIGFuIGltbWVkaWF0ZSAqY29tbWVyY2lhbCBsaWNlbnNl Ki4gU2VlIFtteSBHaXRIdWINCiAgU3BvbnNvcnMgcHJvZmlsZV0gZm9yIGRldGFpbHMuDQoNCg0K W215IEdpdEh1YiBTcG9uc29ycyBwcm9maWxlXSA8aHR0cHM6Ly9naXRodWIuY29tL3Nwb25zb3Jz L21qYW1ib24+DQoNCg0Kb2NhbWwtbGV0c2VuY3J5cHQsIGFuIE9DYW1sIHdheSB0byBnZXQgVExT IGNlcnRpZmljYXRlcw0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9h bm4tb2NhbWwtbGV0c2VuY3J5cHQtYW4tb2NhbWwtd2F5LXRvLWdldC10bHMtY2VydGlmaWNhdGVz LzE3OTc1LzE+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gZGVsaWdodGVkIHRvIGFubm91bmNlIHRoZSBy ZWxlYXNlIG9mIFtvY2FtbC1sZXRzZW5jcnlwdF0gKHZlcnNpb24NCiAgMi4xLjApLiBUaGlzIHZl cnNpb24gaW50cm9kdWNlcyBhIG5ldyBBUEkgdGhhdCBhbGxvd3MgaXQgdG8gb3BlcmF0ZQ0KICBp bmRlcGVuZGVudGx5IG9mIGEgc2NoZWR1bGVyIGFuZCBhbiBIVFRQIGNsaWVudC4gSXQgaXMgYWxz byBhIHJld3JpdGUNCiAgdXNpbmcgb3VyIGJyYW5kLW5ldyBbandzXSBsaWJyYXJ5LCB3aGljaCBu b3cgdXRpbGlzZXMgdGhlIFtqc29udF0NCiAgbGlicmFyeSAocmF0aGVyIHRoYW4gW3lvanNvbl0p Lg0KDQogIGBvY2FtbC1sZXRzZW5jcnlwdCcgaW1wbGVtZW50cyBbY2hhbGxlbmdlc10gbmVlZGVk IHRvIG9idGFpbiBhDQogIGNlcnRpZmljYXRlIHZpYSB0aGUgdGhyZWUgd2F5czogRE5TLCBIVFRQ IGFuZCBBQ01FLVRMUy4gSXQgdGhlcmVmb3JlDQogIGVuYWJsZXMgYSB3ZWJzaXRlIGRlcGxveW1l bnQgc3RyYXRlZ3kgKGltcGxlbWVudGVkIHdpdGggW1ZpZl0sIGZvcg0KICBleGFtcGxlKSB0byBi ZSBwcm92aWRlZCBlbnRpcmVseSBpbiBPQ2FtbC4NCg0KICBXZSB1c2UgaXQgd2l0aGluIG91ciBj b29wZXJhdGl2ZSBmb3IgcHJvamVjdHMgc3VjaCBhczoNCiAg4oCiIFtgZG5zLWxldHNlbmNyeXB0 LXNlY29uZGFyeSddLCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBzZWNvbmRhcnkNCiAgICBE TlMgc2VydmVyIGNhcGFibGUgb2YgcGVyZm9ybWluZyB0aGUgRE5TIGNoYWxsZW5nZSBmb3IgYSBz cGVjaWZpYw0KICAgIGRvbWFpbiBhbmQgZ2VuZXJhdGluZyB0aGUgY2VydGlmaWNhdGUgYW5kIHBy aXZhdGUga2V5LiBJdCBnZW5lcmFsbHkNCiAgICB3b3JrcyBpbiB0YW5kZW0gd2l0aCBvdXIgW2Bw cmltYXJ5LWdpdCddLCBvdXIgcHJpbWFyeSBETlMgc2VydmVyLg0KICDigKIgW2Bjb250cnVubydd LCBhIHVuaWtlcm5lbCB0aGF0IGFjdHMgYXMgYSBUTFMgcmV2ZXJzZSBwcm94eSBhbmQgaXMNCiAg ICBjYXBhYmxlIG9mIHBlcmZvcm1pbmcgSFRUUCBjaGFsbGVuZ2VzLiBUaGUgbGF0dGVyIGlzIGN1 cnJlbnRseSBiZWluZw0KICAgIGNvbXBsZXRlbHkgcmV3cml0dGVuIHVzaW5nIFtgbW5ldCddLg0K DQogIEdvb2QgbHVjayB3aXRoIGRlcGxveWluZyB5b3VyIHdlYnNpdGVzLCBhbmQgaGFwcHkgaGFj a2luZyEgSGVyZeKAmXMNCiAgaG9waW5nIHRoYXQgYGp3cycgYWxzbyBmaW5kcyBpdHMgcGxhY2Ug YXMgYSBsaWJyYXJ5IHdpdGhpbiB0aGUgT0NhbWwNCiAgZWNvc3lzdGVtLg0KDQoNCltvY2FtbC1s ZXRzZW5jcnlwdF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL29jYW1sLWxldHNlbmNy eXB0Pg0KDQpbandzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JvYnVyLWNvb3AvandzPg0KDQpbanNv bnRdIDxodHRwczovL2VycmF0aXF1ZS5jaC9sb2dpY2llbC9qc29udD4NCg0KW3lvanNvbl0gPGh0 dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC1jb21tdW5pdHkveW9qc29uPg0KDQpbY2hhbGxlbmdlc10g PGh0dHBzOi8vbGV0c2VuY3J5cHQub3JnL2ZyL2RvY3MvY2hhbGxlbmdlLXR5cGVzLz4NCg0KW1Zp Zl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9yb2J1ci1jb29wL3ZpZj4NCg0KW2BkbnMtbGV0c2VuY3J5 cHQtc2Vjb25kYXJ5J10NCjxodHRwczovL2dpdGh1Yi5jb20vcm9idXItY29vcC9kbnMtbGV0c2Vu Y3J5cHQtc2Vjb25kYXJ5Lz4NCg0KW2BwcmltYXJ5LWdpdCddIDxodHRwczovL2dpdGh1Yi5jb20v cm9idXItY29vcC9kbnMtcHJpbWFyeS1naXQ+DQoNCltgY29udHJ1bm8nXSA8aHR0cHM6Ly9naXRo dWIuY29tL2Rpbm9zYXVyZS9jb250cnVubz4NCg0KW2BtbmV0J10NCjxodHRwczovL2Rpc2N1c3Mu b2NhbWwub3JnL3QvYW5uLW1uZXQtYS1uZXctdGNwLWlwLXN0YWNrLWZvci11bmlrZXJuZWxzLWlu LW9jYW1sLzE3ODUxPg0KDQoNCk5ldyByZWxlYXNlIG9mIE9DYW1sIExTUCAxLjI2LjAgYW5kIE1l cmxpbiA1LjcuMC01MDQNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW5ldy1y ZWxlYXNlLW9mLW9jYW1sLWxzcC0xLTI2LTAtbWVybGluLTUtNy0wLTUwNC8xNzk3OC8xPg0KDQoN ClBpemllRHVzdCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIFdlIGFyZSBoYXBw eSB0byBhbm5vdW5jZSB0aGUgZG91YmxlIHJlbGVhc2Ugb2YgW21lcmxpbiA1LjcuMC01MDRdIGFu ZA0KICBbb2NhbWwtbHNwIDEuMjYuMF0uDQoNCiAgVGhlIG5ldyByZWxlYXNlcyBjb250YWlucyBl eGNpdGluZyBjaGFuZ2VzIHN1Y2ggYXMgaW1wcm92ZW1lbnRzIHRvDQogIHR5cGUgZW5jbG9zaW5n IGJlaGF2aW91ciBvbiB2YXJpb3VzIGNsYXNzIGFuZCBvYmplY3QgcmVsYXRlZCBpdGVtcywNCiAg c2lnbmF0dXJlIGhlbHAgaW1wcm92ZW1lbnRzIGFuZCBzZXZlcmFsIHNldmVyYWwgYnVnIGZpeGVz Lg0KDQogIFBsZWFzZSBkbyBub3QgaGVzaXRhdGUgb3BlbiBpc3N1ZXMgb24gb3VyIGJ1ZyB0cmFj a2VycyBpZiB5b3UNCiAgZW5jb3VudGVyIGFueSBwcm9ibGVtczoNCg0KICDigKIgTWVybGluOiBb QnVnIFRyYWNrZXJdDQogIOKAoiBPQ2FtbCBMU1A6IFtCdWcgVGFja2VyXQ0KDQoNClttZXJsaW4g NS43LjAtNTA0XQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9tZXJsaW4vcmVsZWFzZXMvdGFn L3Y1LjcuMC01MDQ+DQoNCltvY2FtbC1sc3AgMS4yNi4wXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9v Y2FtbC9vY2FtbC1sc3AvcmVsZWFzZXMvdGFnLzEuMjYuMD4NCg0KW0J1ZyBUcmFja2VyXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL21lcmxpbi9pc3N1ZXM+DQoNCltCdWcgVGFja2VyXSA8aHR0 cHM6Ly9naXRodWIuY29tL29jYW1sL29jYW1sLWxzcC9pc3N1ZXM+DQoNCg0KT0NhbWwgWUFNTCBs aWJyYXJ5DQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZANCg0KICBBcmNoaXZlOiA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L29jYW1sLXlh bWwtbGlicmFyeS80Mjk3Lzc+DQoNCg0KQ29udGludWluZyB0aGlzIHRocmVhZCwgTWFydGluIEph bWJvbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIDIwMjYgdXBk YXRlOg0KICDigKIgaW4gRGVjZW1iZXIgMjAyNSwgQGF2c20gY3JlYXRlZCBhIHB1cmUtT0NhbWwg WUFNTCBsaWJyYXJ5IGluIGp1c3QNCiAgICBvbmUgZGF5IHVzaW5nIGFuIEFJIGFnZW50IGFuZCBb d3JvdGUgYWJvdXQgaXRdLg0KICDigKIgaW4gQXByaWwgMjAyNiwgSSBkaWQgc29tZXRoaW5nIHNp bWlsYXIgYW5kIHRvb2sgdGhlIHRpbWUgdG8gbWFrZSBpdA0KICAgIGEgY29tcGxldGUsIHByb2R1 Y3Rpb24tZ3JhZGUgMS4yLzEuMSBZQU1MIGxpYnJhcnkgY2FsbGVkIFlBTUx4IHRoYXQNCiAgICBJ IFthbm5vdW5jZWQgaGVyZV0uDQoNCg0KW3dyb3RlIGFib3V0IGl0XSA8aHR0cHM6Ly9hbmlsLnJl Y29pbC5vcmcvbm90ZXMvYW9haC0yMDI1LTY+DQoNClthbm5vdW5jZWQgaGVyZV0NCjxodHRwczov L2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0xLWxp YnJhcnkvMTc5NzA+DQoNCg0KSTE4biA1LjAg4oCUIEludGVybmF0aW9uYWxpc2F0aW9uIG1hZGUg ZWFzeSBmb3IgYW55IE9DYW1sIGFwcA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8v ZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4taTE4bi01LTAtaW50ZXJuYXRpb25hbGlzYXRpb24tbWFk ZS1lYXN5LWZvci1hbnktb2NhbWwtYXBwLzE3OTgxLzE+DQoNCg0KVmluY2VudCBCYWxhdCBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIFRoZSBPY3NpZ2VuIHRlYW0gaXMgaGFwcHkgdG8gYW5u b3VuY2UgdGhlIHJlbGVhc2Ugb2YgKm9jc2lnZW4taTE4bg0KICA1LjAqLCBhIHNtYWxsIGJ1dCBw cmFjdGljYWwgaW50ZXJuYXRpb25hbGlzYXRpb24gbGlicmFyeSBmb3IgT0NhbWwuDQoNCiAgVGhl IGJpZyBjaGFuZ2UgaW4gdGhpcyByZWxlYXNlOiBvY3NpZ2VuLWkxOG4gaXMgbm8gbG9uZ2VyIHRp ZWQgdG8NCiAgRWxpb20uIEl0IGNhbiBub3cgYmUgdXNlZCBpbiAqYW55IE9DYW1sIHByb2plY3Qq LCB3aXRoIG9wdGlvbmFsDQogIGV4dGVuc2lvbnMgZm9yIFR5eG1sIGFuZCBFbGlvbSB3aGVuIHlv dSBuZWVkIHRoZW0uDQoNCiAgT2NzaWdlbi1pMThuIHdhcyBpbml0aWFsbHkgd3JpdHRlbiBieSBA c2Fnb3RjaCBmcm9tIEJlIFNwb3J0LiBUaGlzDQogIHJlbGVhc2UgaGFzIGJlZW4gbWFkZSBwb3Nz aWJsZSB0aGFua3MgdG8gdGhlIHdvcmsgb2YgW0hhYmliXSwgZnVuZGVkDQogIGJ5IFtJUklMTF0u DQoNCiAgICAgICAgb3BhbSBpbnN0YWxsIG9jc2lnZW4taTE4bg0KDQoNCltIYWJpYl0gPGh0dHBz Oi8vZ2l0aHViLmNvbS9taGpkPg0KDQpbSVJJTExdIDxodHRwczovL3d3dy5pcmlsbC5vcmc+DQoN CkhvdyBpdCB3b3Jrcw0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg VHJhbnNsYXRpb25zIGFyZSB3cml0dGVuIGluIGEgcGxhaW4gKlRTViBmaWxlKiAob25lIGtleSBw ZXIgbGluZSwgb25lDQogIGNvbHVtbiBwZXIgbGFuZ3VhZ2UpOg0KDQogIOKUjOKUgOKUgOKUgOKU gA0KICDilIIgZm9vICAgICAgICAgICAgICAgICBUaGlzIGlzIGEgc2ltcGxlIGtleS4gICAgICAg IENlY2kgZXN0IHVuZSBjbMOpIHRvdXRlIHNpbXBsZS4NCiAg4pSCIGFfaHVtYW4gICAgICAgICAg ICAgYSBodW1hbiAgICAgICAgICAgICAgICAgICAgICB1biBodW1haW4NCiAg4pSCIGJhciAgICAg ICAgICAgICAgICAgSSBhbSB7e3h9fS4gICAgICAgICAgICAgICAgICBKZSBzdWlzIHt7eH19Lg0K ICDilIIgYmF6ICAgICAgICAgICAgICAgICBUaGVyZSB7e3tjP2FyZXx8aXMgYW59fX0gYXBwbGV7 e3tjP3N8fH19fSBoZXJlISAgSWwgeSBhIHt7e2M/ZGVzfHx1bmV9fX0gcG9tbWV7e3tjP3N8fH19 fSBpY2kgIQ0KICDilIIgYnUgICAgICAgICAgICAgICAgICBJIGFtIHt7eCAlc319ICh7e24gJWR9 fSkuICAgIEplIHN1aXMge3t4ICVzfX0gKHt7biAlZH19KS4NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgVGhlIG1pbmktdGVtcGxhdGluZyBsYW5ndWFnZSBzdXBwb3J0czoNCg0KICDigKIgYHt7eH19 JyBhIHN0cmluZyB2YXJpYWJsZSBgfngnDQogIOKAoiBge3t4ICVkfX0nIGEgdHlwZWQgdmFyaWFi bGUgdXNpbmcgdGhlIGdpdmVuIGZvcm1hdCBzcGVjaWZpZXINCiAg4oCiIGB7e3tjP3llc3x8bm99 fX0nIGFuIG9wdGlvbmFsIGJvb2xlYW4gYD9jJyBzd2l0Y2hpbmcgYmV0d2VlbiB0d28NCiAgICBz dHJpbmdzDQoNCiAgVGhlbiBpbiB5b3VyIGNvZGUsIGEgKlBQWCBleHRlbnNpb24qIHR1cm5zIGBb JWkxOG4ga2V5XScgaW50byB0aGUNCiAgcmlnaHQgY2FsbDoNCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvb107DQogIOKUgiBwcmludF9lbmRsaW5lIFsl aTE4biBiYXIgfng6WyVpMThuIGFfaHVtYW5dXTsNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThu IGJheiB+YzoobmIgPiAxKV07DQogIOKUgiBwcmludF9lbmRsaW5lIFslaTE4biBidSB+eDoiSmVh bi1NaWNoZWwiIH5uOjQyXTsNCiAg4pSCIA0KICDilIIgKCogU3dpdGNoaW5nIGxhbmd1YWdlIGV4 cGxpY2l0bHkgKikNCiAg4pSCIHByaW50X2VuZGxpbmUgWyVpMThuIGZvbyB+bGFuZzpNeV9pMThu LkZyXTsNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAgVGhlIGN1cnJlbnQgbGFuZ3VhZ2UgaXMgaGVs ZCBpbiBhIG11dGFibGUgcmVmZXJlbmNlIHlvdSBjYW4gc3dhcCAob3INCiAgcmVwbGFjZSB3aXRo IGFuIEVsaW9tIHNjb3BlZCByZWZlcmVuY2UgaWYgeW91IG5lZWQgcGVyLXNlc3Npb24vdGFiDQog IGxhbmd1YWdlcykuDQoNCg0KRHVuZSBpbnRlZ3JhdGlvbg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgVGhlIHRvb2wgcGx1Z3MgaW50byBEdW5l IHZlcnkgbmF0dXJhbGx5LiBHZW5lcmF0ZSB0aGUgT0NhbWwgbW9kdWxlDQogIGZyb20geW91ciBU U1YgZmlsZSB3aXRoIGEgcnVsZToNCg0KICDilIzilIDilIDilIDilIANCiAg4pSCIChydWxlDQog IOKUgiAgKHRhcmdldCBleGFtcGxlX2kxOG4ubWwpDQogIOKUgiAgKGRlcHMgZXhhbXBsZV9pMThu LnRzdikNCiAg4pSCICAoYWN0aW9uDQogIOKUgiAgIChydW4gJXtiaW46b2NzaWdlbi1pMThufSAt LWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0KICDilIIgICAgICAgICAgICAg ICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0pKSkNCiAg4pSU4pSA4pSA4pSA 4pSADQoNCiAgQW5kIHdpcmUgdGhlIFBQWCBpbiB5b3VyIGxpYnJhcnkvZXhlY3V0YWJsZToNCg0K ICDilIzilIDilIDilIDilIANCiAg4pSCIChwcmVwcm9jZXNzIChwcHMgb2NzaWdlbi1pMThuIC0t IC0tZGVmYXVsdC1tb2R1bGUgRXhhbXBsZV9pMThuKSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCiAg VGhhdOKAmXMgYWxsIHlvdSBuZWVkIGZvciBhIHBsYWluIE9DYW1sIHByb2plY3QuDQoNCg0KVHl4 bWwgc3VwcG9ydA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAg UGFzcyBgLS10eXhtbCcgdG8gdGhlIGdlbmVyYXRvciBhbmQgdGhlIHNhbWUgYFslaTE4biBrZXld JyBleHByZXNzaW9uDQogIG5vdyBwcm9kdWNlcyBhICpsaXN0IG9mIFR5eG1sIEhUTUwgZWxlbWVu dHMqIGluc3RlYWQgb2YgYSBzdHJpbmc6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAoKiBC dWlsZHMgYW4gSFRNTCBmcmFnbWVudCwgcmVhZHkgdG8gZHJvcCBpbnRvIGEgVHl4bWwgdHJlZSAq KQ0KICDilIIgbGV0IGdyZWV0aW5nID0gWyVpMThuIGJhciB+eDpbJWkxOG4gYV9odW1hbl1dDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIFZhcmlhYmxlcyBjYW4gdGhlbXNlbHZlcyBiZSBsaXN0cyBv ZiBIVE1MIG5vZGVzLCBzbyB5b3UgY2FuIG1peA0KICB0cmFuc2xhdGVkIHRleHQgd2l0aCBtYXJr dXAgbmF0dXJhbGx5Og0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgWyVpMThuIGJhciB+eDpb IHR4dCAiSmVhbi1NaWNoZWwgKCINCiAg4pSCICAgICAgICAgICAgICAgOyB0eHQgKHN0cmluZ19v Zl9pbnQgaWQpDQogIOKUgiAgICAgICAgICAgICAgIDsgdHh0ICIpIiBdXQ0KICDilJTilIDilIDi lIDilIANCg0KICBJZiB5b3UgbmVlZCBhIHBsYWluIHN0cmluZyBpbiBUeXhtbCBtb2RlIChmb3Ig YW4gYXR0cmlidXRlLCBmb3INCiAgaW5zdGFuY2UpLCBqdXN0IHByZWZpeCB3aXRoIGBTLic6DQoN CiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBbJWkxOG4gUy5iYXIgfng6WyVpMThuIFMuYV9odW1h bl1dICAgKCogc3RyaW5nIG91dHB1dCAqKQ0KICDilJTilIDilIDilIDilIANCg0KDQpFbGlvbSBz dXBwb3J0DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBGb3Ig Y2xpZW504oCTc2VydmVyIEVsaW9tIGFwcHMsIHBhc3MgYC0tZWxpb20nLiBUaGUgZ2VuZXJhdG9y IGVtaXRzIGFuDQogIGAuZWxpb20nIGZpbGUgKHNvIHRoZSBzYW1lIHRyYW5zbGF0aW9ucyBhcmUg YXZhaWxhYmxlIG9uIGJvdGggc2lkZXMpLA0KICBpbXBsaWVzIGAtLXR5eG1sJywgYW5kIGFkZHMg YFtAQGRlcml2aW5nIGpzb25dJyBvbiB0aGUgbGFuZ3VhZ2UgdHlwZQ0KICBzbyB5b3UgY2FuIHNl cmlhbGlzZSBpdCBhY3Jvc3MgdGhlIHdpcmU6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiAo cnVsZQ0KICDilIIgICh0YXJnZXQgZXhhbXBsZV9pMThuLmVsaW9tKQ0KICDilIIgIChkZXBzIGV4 YW1wbGVfaTE4bi50c3YpDQogIOKUgiAgKGFjdGlvbg0KICDilIIgICAocnVuICV7YmluOm9jc2ln ZW4taTE4bn0gLS1lbGlvbSAtLWxhbmd1YWdlcyBlbixmciAtLWlucHV0LWZpbGUgJXtkZXBzfQ0K ICDilIIgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS1vdXRwdXQtZmlsZSAle3RhcmdldH0p KSkNCiAg4pSU4pSA4pSA4pSA4pSADQoNCg0KTXVsdGlwbGUgVFNWIGZpbGVzDQrilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBZb3UgY2Fu IHNwbGl0IHRyYW5zbGF0aW9ucyBhY3Jvc3Mgc2V2ZXJhbCBmaWxlcy4gVGhlIFBQWCB1c2VzIHlv dXINCiAgbW9kdWxlIHBhdGggdG8gZmluZCB0aGUgcmlnaHQgb25lOg0KDQogIOKUjOKUgOKUgOKU gOKUgA0KICDilIIgWyVpMThuIGZvb10gICAgICAgICAgICAgICAgICAgICAgICAgICgqIGRlZmF1 bHQgbW9kdWxlICopDQogIOKUgiBbJWkxOG4gTXlJMThuLmZvb10gICAgICAgICAgICAgICAgICAg KCogTXlJMThuLmZvbyAqKQ0KICDilIIgWyVpMThuIE15STE4bi5TLmJhciB+eDpbJWkxOG4gUy5m b29dXQ0KICDilJTilIDilIDilIDilIANCg0KICBPcHRpb25hbCBgLS1wcmVmaXgnIC8gYC0tc3Vm Zml4JyBmbGFncyBsZXQgeW91IGtlZXAgY2FsbC1zaXRlcyBjb25jaXNlDQogIChgWyVpMThuIEZl YXR1cmUuZm9vXScg4oaSIGBQcl9GZWF0dXJlX2kxOG4uZm9vICgpJykuDQoNCiAg4oCUDQoNCiAg 4oCiIFNvdXJjZXM6IDxodHRwczovL2dpdGh1Yi5jb20vb2NzaWdlbi9vY3NpZ2VuLWkxOG4+DQog IOKAoiBEb2N1bWVudGF0aW9uOiBSRUFETUUgb24gdGhlIHJlcG8NCiAg4oCiIEJ1ZyByZXBvcnRz OiA8aHR0cHM6Ly9naXRodWIuY29tL29jc2lnZW4vb2NzaWdlbi1pMThuL2lzc3Vlcz4NCg0KICBI YXBweSB0cmFuc2xhdGluZyENCg0KDQpBVEQgNC4xLjAgLSBub3cgd2l0aCBZQU1MIHN1cHBvcnQN CuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLWF0ZC00LTEtMC1ub3ctd2l0aC15 YW1sLXN1cHBvcnQvMTc5ODIvMT4NCg0KDQpNYXJ0aW4gSmFtYm9uIGFubm91bmNlZA0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSADQoNCiAgW0FURF0gbm93IGhhcyBPQ2FtbCBzdXBwb3J0IGZvciBjb252ZW5pZW50bHkg cmVhZGluZyBkYXRhIGZyb20gWUFNTA0KICBmaWxlcyBhcyB3ZWxsIGFzIGZyb20gb3RoZXIgZm9y bWF0cyB3aXRoIG1pbmltYWwgZWZmb3J0LiBJdCBtZWFuczoNCg0KICAxLiBZb3UgZGVmaW5lIGEg W3R5cGUgZm9yIHlvdXIgY29uZmlnIGRhdGFdLg0KICAyLiBgYXRkbWwgLS1tb2RlIGpzb25saWtl IGFwcF9jb25maWcuYXRkJyBnZW5lcmF0ZXMgdGhlIE9DYW1sIGNvZGUNCiAgICAgdGhhdCBjb252 ZXJ0cyBhIEpTT04tbGlrZSBBU1QgY29udGFpbmluZyBzb3VyY2UgbG9jYXRpb25zIGludG8geW91 cg0KICAgICBjb25maWcgZGF0YSBzdHJ1Y3R1cmUuDQogIDMuIFtZb3VyIHByb2dyYW1dIGxvYWRz IGEgWUFNTCBmaWxlLCBjb252ZXJ0cyBpdCB0byBhIEpTT04tbGlrZSB0cmVlLA0KICAgICBhbmQg dGhlbiBjYWxscyB0aGUgZ2VuZXJhdGVkIGZ1bmN0aW9uIHRvIHRyYW5zbGF0ZSBpdCBpbnRvIGFu DQogICAgIE9DYW1sIGRhdGEgc3RydWN0dXJlLg0KICA0LiBZb3VyIGFwcGxpY2F0aW9uIHByaW50 cyB1c2VmdWwgZXJyb3IgbWVzc2FnZXMgaWYgdGhlIGNvbmZpZyBpcw0KICAgICBtYWxmb3JtZWQg b3IgaW5jb21wbGV0ZS4NCg0KICBBbiBbZXhhbXBsZV0gaXMgaW5jbHVkZWQgaW4gdGhlIGRpc3Ry aWJ1dGlvbi4gSXQgdXNlcyB0aGUgW3JlY2VudGx5DQogIHJlbGVhc2VkIFlBTUx4IGxpYnJhcnld Lg0KDQogIF9Ob3RlIHRoYXQgWUFNTHggbmVlZHMgZ2VuZXJvdXMgc3BvbnNvcnMgdG8gZnVuZCB0 aGUgd29yayB0aGF0IHdhcw0KICBkb25lIGFuZCBbdW5sb2NrIGEgcGVybWlzc2l2ZSBJU0MgbGlj ZW5zZV0gZm9yIGV2ZXJ5b25lLiBPciB5b3UgY2FuDQogIGFjY2VwdCB0aGUgdGVybXMgb2YgdGhl IFtBR1BMIGxpY2Vuc2VdIGlmIHlvdSdyZSBoYXBweSB0byBzaGFyZSB5b3VyDQogIGFwcGxpY2F0 aW9uJ3Mgc291cmNlIGNvZGUgd2l0aCB0aGUgdXNlcnMuXw0KDQogIE90aGVyIGlucHV0IGZpbGUg Zm9ybWF0cyBvciBvdGhlciBZQU1MIGxpYnJhcmllcyBjYW4gYmUgdXNlZCBzaW1pbGFybHkNCiAg d2l0aCBtaW5pbXVtIGVmZm9ydCBhcyBsb25nIGFzIHNvdXJjZSBsb2NhdGlvbnMgYXJlIGF2YWls YWJsZS4gRm9yDQogIHRoaXMsIHlvdSdsbCBuZWVkIFthIGJyaWRnZV0gdGhhdCBjb252ZXJ0cyB5 b3VyIEFTVCBpbnRvIHRoZQ0KICBbSlNPTi1saWtlIEFTVF0uDQoNCg0KW0FURF0gPGh0dHBzOi8v Z2l0aHViLmNvbS9haHJlZnMvYXRkPg0KDQpbdHlwZSBmb3IgeW91ciBjb25maWcgZGF0YV0NCjxo dHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rlci9hdGQteWFtbHgvZXhhbXBs ZXMvYXBwX2NvbmZpZy5hdGQ+DQoNCltZb3VyIHByb2dyYW1dDQo8aHR0cHM6Ly9naXRodWIuY29t L2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlhbWx4L2V4YW1wbGVzL21haW4ubWw+DQoNCltl eGFtcGxlXSA8aHR0cHM6Ly9naXRodWIuY29tL2FocmVmcy9hdGQvYmxvYi9tYXN0ZXIvYXRkLXlh bWx4L2V4YW1wbGVzPg0KDQpbcmVjZW50bHkgcmVsZWFzZWQgWUFNTHggbGlicmFyeV0NCjxodHRw czovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLXlhbWx4LXB1cmUtb2NhbWwteWFtbC0xLTItMS0x LWxpYnJhcnkvMTc5NzA+DQoNClt1bmxvY2sgYSBwZXJtaXNzaXZlIElTQyBsaWNlbnNlXQ0KPGh0 dHBzOi8vZ2l0aHViLmNvbS9tamFtYm9uL3lhbWx4L2Jsb2IvbWFpbi9GVU5ESU5HLm1kPg0KDQpb QUdQTCBsaWNlbnNlXQ0KPGh0dHBzOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0dOVV9BZmZlcm9f R2VuZXJhbF9QdWJsaWNfTGljZW5zZT4NCg0KW2EgYnJpZGdlXQ0KPGh0dHBzOi8vZ2l0aHViLmNv bS9haHJlZnMvYXRkL2Jsb2IvbWFzdGVyL2F0ZC15YW1seC9zcmMvQXRkX3lhbWx4Lm1sPg0KDQpb SlNPTi1saWtlIEFTVF0NCjxodHRwczovL2dpdGh1Yi5jb20vYWhyZWZzL2F0ZC9ibG9iL21hc3Rl ci9hdGQtanNvbmxpa2Uvc3JjL0FTVC5tbGk+DQoNCg0KT2xkIENXTg0K4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dOLCB5b3UgY2FuIFtzZW5kIG1l IGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3UsIG9yIGdvIHRha2UgYSBsb29r IGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0aGUNCiAgYXJjaGl2ZXNdLg0K DQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVyeSB3ZWVrIGJ5IG1haWwsIHlv dSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4NCg0KICBbQWxhbiBTY2htaXR0 XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFuLnNjaG1pdHRAcG9seXRlY2hu aXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQv Y3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0dHBzOi8vYWxhbi5wZXRpdGVw b21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxodHRwczovL3N5bXBhLmlucmlh LmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2htaXR0XSA8aHR0cHM6Ly9hbGFu LnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 07 to 14, 2026.

    Call for presentations: Caml in the Capital II

    Sacha Ayoun announced

    Hi everyone :waving_hand:

    Following the success of the last event, we're organising a second edition = of Caml In the Capital (happening in London). From talking to the attendees= at the first event, we will be doing shorter talks and more socialising = =F0=9F=8D=95

    So far, we are aiming for May 14th, to be confirmed once we have sec= ured a venue. Please let us know if this is clashing with another big event= off our radar.

    Once we confirm the date and presentations, we'll post here and on the dedi= cated Zulip channel as well as our website.

    Call for presentations

    We're looking for talks that are of interest to the entire OCaml community. Topics includes (but are not limited to):

    • OCaml tooling (build systems, package management, lsp, documentation&he= llip;)
    • The cool library you're working on
    • Your OCaml-related research (as long as you make it accessible for peop= le outside your field)
    • Some piece of the OCaml ecosystem that you'd like people to hear about = (ocaml.org, the OCaml Software Foundation, …)
    • Your industrial use of OCaml
    • etc.

    If you=E2=80=99d like to give a talk, please message me or @Alistair direct= ly with a title and short abstract.

    List your open OCaml positions on the OCaml.org job board

    Continuing this thread, VikasK announced

    I would like to post this job that we are hiring for.

    YAMLx: pure-OCaml YAML 1.2/1.1 library

    Martin Jambon announced

    Hello,

    I'm excited to announce the availability of YAMLx, a complete implementation of the YAML 1.2 and 1.1 = standards. It is intended to support most uses of YAML including its use as= a configuration file format in new applications and analyzing YAML files o= f other applications.

    For a fuller description, check out the release notes.

    Get started with opam install yamlx. Then use the yamlx<= /code> companion command to check that it parses and interprets your favori= te YAML files correctly.

    Here's an example showing the use of the library to convert YAML to JSON:

    (* R=
    ead YAML from stdin with YAMLx, print JSON to stdout with Yojson
    
       This is a demo showing how to use the YAMLx library with the default
       settings. 'YAMLx.Values.one_of_yaml_exn' offers options to restrict
       the input language or to force the interpretation as YAML 1.1 instead of
       YAML 1.2.
    
       Compile with:
         ocamlfind opt -o yaml-to-json \
           -package yamlx,yojson -linkpkg yaml_to_json.ml
    *)
    
    open Printf
    
    let rec yojson_of_yamlx (x :<=
    span style=3D"color: #444fcf; font-weight: bold;"> YAMLx.value) : Yojson.Safe.t =3D
      match x with
      | Null _ -> `Null
      | Bool (_, x) -> `Bool x
      | Int (_, x) -> `Intlit (Int64.to_string x)
      | Float (_, x) -> `Float x
      | String (_, x) -> `String x
      | Seq (_, xs) -> `List (List.map yojson_of_yamlx xs)
      | Map (_, xs) ->
          `Assoc (List.map (fun (loc, k, match (k =
    : YAMLx.value) with
            | String (_, k) -> (k, yo=
    json_of_yamlx v)
            | _ ->
                ksprintf fai=
    lwith "%s: only string keys are supp=
    orted"
                  (YAMLx.default_format_loc loc)
          ) xs)
    
    let () =3D
      YAMLx.register_=
    exception_printers ();
      stdin
      |> In_channel.input_all
      |> YAMLx.Values.one_of_yaml_exn
      |> yojson_of_yamlx
      |> Yojson.Safe.pretty_to_channel stdout
      |> print_newline
    

    Funding

    YAMLx is currently released under the AGPL. There is an ongoing fund= raiser: once a funding goal is reached, the license will switch to the perm= issive ISC license for everyone. Donors above a certain threshold re= ceive an immediate commercial license. See my GitHub Sponsors profile for details.

    ocaml-letsencrypt, an OCaml way to get TLS certificates

    Calascibetta Romain announced

    I am delighted to announce the release of ocaml-letsencrypt (version 2.1.0). This vers= ion introduces a new API that allows it to operate independently of a sched= uler and an HTTP client. It is also a rewrite using our brand-new jws library, which now utilises = the jsont library (rath= er than yojson).

    ocaml-letsencrypt implements challenges needed to obtain a certificate v= ia the three ways: DNS, HTTP and ACME-TLS. It therefore enables a website d= eployment strategy (implemented with Vif, for example) to be provided entirely in OCaml.

    We use it within our cooperative for projects such as:

    • dns-letsencrypt-secondary, a unikernel that acts as a second= ary DNS server capable of performing the DNS challenge for a specific domai= n and generating the certificate and private key. It generally works in tan= dem with our primary-git, our primary DNS server.
    • contruno= , a unikernel that acts as a TLS reverse proxy and is capable of perfor= ming HTTP challenges. The latter is currently being completely rewritten us= ing mnet.

    Good luck with deploying your websites, and happy hacking! Here=E2=80=99s h= oping that jws also finds its place as a library within the OC= aml ecosystem.

    OCaml YAML library

    Continuing this thread, Martin Jambon announced

    2026 update:=20

    • in December 2025, @avsm created a pure-OCaml YAML library in just one d= ay using an AI agent and wrote about it.
    • in April 2026, I did something similar and took the time to make it a c= omplete, production-grade 1.2/1.1 YAML library called YAMLx that I announced here.

    I18n 5.0 =E2=80=94 Internationalisation made easy for any OCam= l app

    Vincent Balat announced

    The Ocsigen team is happy to announce the release of ocsigen-i18n 5.0, a small but practical internationalisation library for OCaml.

    The big change in this release: ocsigen-i18n is no longer tied to Eliom. It= can now be used in any OCaml project, with optional extensions for = Tyxml and Eliom when you need them.

    Ocsigen-i18n was initially written by @sagotch from Be Sport. This release = has been made possible thanks to the work of Habib, funded by IRILL.

    opam install ocsigen-i18n

    How it works

    Translations are written in a plain TSV file (one key per line, one = column per language):

    foo                 This is a simple key.        Ceci est une cl=C3=A9 tout=
    e simple.
    a_human             a human                      un humain
    bar                 I am {{x}}.                  Je suis {{x}}.
    baz                 There {{{c?are||is an}}} apple{{{c?s||}}} here!  Il y a=
     {{{c?des||une}}} pomme{{{c?s||}}} ici !
    bu                  I am {{x %s}} ({{n %d}}).    Je suis {{x %s}} ({{n %d}}=
    ).
    

    The mini-templating language supports:

    • {{x}} a string variable ~x
    • {{x %d}} a typed variable using the given format specifier=
    • {{{c?yes||no}}} an optional boolean ?c switch= ing between two strings

    Then in your code, a PPX extension turns [%i18n key] in= to the right call:

    print_endline [%i18n foo];
    print_endline [%=
    i18n bar ~x:[%i18n a_human]];
    print_endline [%=
    i18n baz ~c:(nb > 1)];
    print_endline [%=
    i18n bu ~x=
    :"Jean-Michel" ~n:42];
    
    (* Switching language explicitly *)
    print_endline [%=
    i18n foo ~lang:My_i18n.Fr];
    

    The current language is held in a mutable reference you can swap (or replac= e with an Eliom scoped reference if you need per-session/tab languages).

    Dune integration

    The tool plugs into Dune very naturally. Generate the OCaml module from you= r TSV file with a rule:

    (rule
     (target example_i18n.ml)
     (deps example_i18n.tsv)
     (action
      (run %{bin:ocsigen-i18n} --languages en,fr --input-file %{deps}
                               --output-file %{target})))
    

    And wire the PPX in your library/executable:

    (preprocess (pps ocsigen-i18n -- --defaul=
    t-module Example_i18n))
    

    That=E2=80=99s all you need for a plain OCaml project.

    Tyxml support

    Pass --tyxml to the generator and the same [%i18n key] expression now produces a list of Tyxml HTML elements instead = of a string:

    (* B=
    uilds an HTML fragment, ready to drop into a Tyxml tree *)
    let greeting =3D [%i18n bar ~x:[%i18n =
    a_human]]
    

    Variables can themselves be lists of HTML nodes, so you can mix translated = text with markup naturally:

    [%i18n bar ~x:[ txt "Jean-Michel (=
    "
                  ; txt (string_of_int id)
                  ; txt ")" ]]
    

    If you need a plain string in Tyxml mode (for an attribute, for instance), = just prefix with S.:

    [%i18n S.bar ~x=
    :[%i18n S.a_human]]   (* string output *)
    

    Eliom support

    For client=E2=80=93server Eliom apps, pass --eliom. The genera= tor emits an .eliom file (so the same translations are availab= le on both sides), implies --tyxml, and adds [@@deriving= json] on the language type so you can serialise it across the wire:

    (rule
     (target example_i18n.eliom)
     (deps example_i18n.tsv)
     (action
      (run %{bin:ocsigen-i18n} --eliom --languages en,fr --input-file %{deps}
                               --output-file %{target})))
    

    Multiple TSV files

    You can split translations across several files. The PPX uses your module p= ath to find the right one:

    [%i18n foo]                          (* default module *)
    [%i18n MyI18n.foo]                 =
      (* MyI18n.foo *)
    [%i18n MyI18n.S.bar ~x:[%i18n ]=
    
    

    Optional --prefix / --suffix flags let you keep c= all-sites concise ([%i18n Feature.foo] =E2=86=92 Pr_Feat= ure_i18n.foo ()).

    Happy translating!

    ATD 4.1.0 - now with YAML support

    Martin Jambon announced

    ATD now has OCaml support for= conveniently reading data from YAML files as well as from other formats wi= th minimal effort. It means:

    1. You define a type for your config data.
    2. atdml --mode jsonlike app_config.atd generates the OCaml c= ode that converts a JSON-like AST containing source locations into your con= fig data structure.
    3. Your program loads a YAML file, converts it to a JSON-like tr= ee, and then calls the generated function to translate it into an OCaml dat= a structure.
    4. Your application prints useful error messages if the config is malforme= d or incomplete.

    An example is included in the distribution. It uses the rece= ntly released YAMLx library.

    Note that YAMLx needs generous sponsors to fund t= he work that was done and unlock a permissive ISC license for everyone. Or you c= an accept the terms of the AGPL license if you're happy to share your = application's source code with the users.

    Other input file formats or other YAML libraries can be used similarly with= minimum effort as long as source locations are available. For this, you'll= need a bridge that converts your AST into the JSON-like AST<= /a>.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmneDckbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5ceFRgf/XhNku8f9cofDMBVUDoGIqf2diQ/AHn0a5pfJhZeu 9XdpslfekVBIkViylQfn2qVPgRMbFLG4S7REQcVjp+T9uT3luhyTY7cVY29/7VuV sRg5wSG5SP+mvKWYtPint/RJjhsKVgo1V3PadSDqMu70++N5w0Hw0nIUtlf0+keI qjbgVSXCWMBkGkia6AupuaqLr33WCr4q2ABZ3YKKVl5sIR+As49YIbzfeQ6Se3d7 9K5pMOur9IvTCoQ66T8AWVAY9Awmbt3NeIG/IXauIFBORw3FfDI0vNQCggzJLeGk 75dWJ+QhJKt5X3dbimKngZIuvs9GPsh1wmi2gxyMkpChWA== =fpPG -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=uwvt4nvz; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 1D2EE4009B for ; Tue, 21 Apr 2026 09:34:51 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=C9DZnmaUKvXdvmNSn44IUbS9UYFjBylqTe7dgodU8n4=; b=uwvt4nvzRXUm1hE7BpkJrBMIAX5QicdfPxT9SSALftZ1WrFEzdr7IdUM 4JmOOBhlyklw8o7m0rAXz5Ty/P2r0JFLPS5ABloI0gysnGaNWVUraqwqN 8Ot/YNHNcljCa0LYg9VXBRaKS16agTB7Oe5AJRfQMKr6DZ7LCAY6ofFGQ k=; X-CSE-ConnectionGUID: GT/Q+0hjSRCLE280ckPjBg== X-CSE-MsgGUID: 6dmmWfmLSVaLBvyJUtsyBA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,191,1770591600"; d="asc'?scan'208,217";a="273438568" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 21 Apr 2026 11:34:46 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 81C8B82FF3; Tue, 21 Apr 2026 11:34:46 +0200 (CEST) Received: from mail3-relais-sop.national.inria.fr (mail3-relais-sop.national.inria.fr [192.134.164.104]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 87D1282FB4 for ; Tue, 21 Apr 2026 11:34:33 +0200 (CEST) X-CSE-ConnectionGUID: 6wOE3D/wR0qV+owdjgyfNQ== X-CSE-MsgGUID: LO+UjBB6TGeTEBq1XE25kQ== IronPort-SDR: 69e744a6_riMpKKWGWUUmYLWtNhcfKeAK8XCJpsWxcPShR6z10Bh/NSK Neh69Fcuxt2pfaPw2a4YAq7r/aWWabPANuFR4XQ== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GFAAD8Q+dpjyIeaIFRCRYDAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBEgEBAQEBAQEBAQEBAYIQgT1bKRoBbF8zBwhJA4RVgWOBbI4lgRaQN4p7D?= =?us-ascii?q?YFcgSwWIQIOBwEDAQgFLgEbBAECBAEBAQEBAQIBgguBPYE3Ao0tAh8GAQQ0E?= =?us-ascii?q?wECBAEBAQEDAgMBAQEBAQEBAQEBAQsBAQEEAQEBAgEBAgQDAQEBAQIQAQEBA?= =?us-ascii?q?QEBOQVJhhUBBjMNgkUtJFMNEWAEAQIGAQYBAQEBAQEBAQECAQEBIgEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQECBAcBAQc8P?= =?us-ascii?q?xwBCAQGEwEBJQcGBhgUDwMJCwEGAwIRATUDARMBDgQUBgGCZwGCIgJPAwUMB?= =?us-ascii?q?j+VNJsNN3p/M4EBO4FRAQEGgQg+AgECCQICAwEOCSUB2hGBXgkJFAGBOAGBV?= =?us-ascii?q?4QagkoPDQEFJUlqAgEChE8JhDYnD4FVRIEVNYFzSgdvgVCBEQEBAQEBF0I9C?= =?us-ascii?q?AEEBQEIAgEBBQIBBgISDxETCQmDHIJpghEVehQdgVsGLgaBNBKBB4FdBR0wL?= =?us-ascii?q?FQGYoVigkIsAVUTFwsHBV6BCAMqLy1uMh2BIz4XNFgbBwWBS4Q2gVeBC4Mxg?= =?us-ascii?q?TcDC209NxQbiRUQIQ2BHkMZIRCBLgkmDi8JBgEBDQEHBQ8TGwgBAhEHCQUFA?= =?us-ascii?q?QcDCQgOAQEUDAINHwEBBwEFHhYKFQQRCBEBCRYFAQEBDQIBCQEHBQYBCAILA?= =?us-ascii?q?gQYEQOEYI1jFBAUAQMdDQN0jmQBoS9fbTQHhB+BXgYMiQiBJpYHhASBV4VAh?= =?us-ascii?q?XyHApE2gRwimGQigjaHKIEmCQeBaB9MiHqMKhAsIBMGYoQ9gX8jSSM/AQEBG?= =?us-ascii?q?AECDAczGjBDDQKCJAEzCQoMMRwPhAaFMIRJIgwWgRMBBAVKgXgQWhc9IoEEI?= =?us-ascii?q?oFSO4FxvSdBNQIBAQoxBwIHAQsEhWsBAYwGAQEPFwQDBW5dAQE?= IronPort-PHdr: A9a23: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 o9VZM94v2bhFahEPpmIvnBwvabgmCaxxg== IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:Cm+HaaHY/uyQj+PIpLqE18eALOsnbusQ8zAXPiFKOH5om6mj/a 2TdZsgtCMc5Ax8ZJhCo6HiBEDjexPhHPdOiOF7AV7IZmfbUQWTQ71K3M/L/HnLGiH19OJRvJ 0QFpRWOZnXFlY/qc775WCDYrEdKTS8gcSVuds= X-Talos-CUID: 9a23:htlyemPo7iRcCu5DBjZA2RU4Xd8fKmTjj3DPL023GGhPcejA X-Talos-MUID: 9a23:9dAVawsk8PZ6UHXAgs2noBYhCcVCyfqSJ00xvL8f4vmpb3FzAmLI X-IronPort-Anti-Spam-Filtered: true X-URL-LookUp-ScanningError: 1 X-IronPort-AV: E=Sophos;i="6.23,191,1770591600"; d="asc'?scan'208,217";a="144664585" X-URL-ContentFilter: X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDHhGPGUS4bxordpLJ21SNitUcr/61fUmHEs56?= =?us-ascii?q?r3pAld8n8gDmNBcFhMNWYBycZ5XXJLBMX4ipKtYgKJAA245XuUF5sOT8?= =?us-ascii?q?gtJSabbvjRKnyj9zzjIprpVdiS4QnTR6/7BHffaUMcWSy5cWIYH66DZc?= =?us-ascii?q?POltd3FkYmx9Wx3sLGW7x0Gw=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail3-smtp-sop.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 21 Apr 2026 11:34:30 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id 774071A496; Tue, 21 Apr 2026 11:34:23 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 21 Apr 2026 11:34:20 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 21 11:34:25 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.484425, queueID=3115C1A49A X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19493 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: quoted-printable Hello Here is the latest OCaml Weekly News, for the week of April 14 to 21, 2026. Table of Contents =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 http-date v0.2 =E2=80=94 Zero-dependency HTTP date parsing for OCaml Caqti 2.3.0 layoutz 0.1.0 =F0=9F=AA=B6 - Zero-dep Elm-style TUIs and terminal plots for= your OCaml apps Dune 3.22 ptt, a mailing list system as unikernel Mollymawk and Albatross orchestrating all virtual machines OUPS meetup april 2026 Stk 0.6 released opam 2.5.1 Restarting OCaml.jp: The OCaml Japan User Group Code navigation and search on Github Seeking maintainers for our OCaml SIP server, gRPC, and HTTP/2 libraries ppx_mixins: slightly more elegant mixin syntax Experience Report: Refining Dune=E2=80=99s Dependency Graph First beta release of OCaml 5.5.0 ocgtk 0.1: OCaml bindings for GTK 4 (preview release) Old CWN http-date v0.2 =E2=80=94 Zero-dependency HTTP date parsing for OCaml =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Bikal Lem announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 I just released v0.2 of http-date, an RFC 9110 compliant HTTP datetime decoder/encoder for OCaml. This is a major rewrite from v0.1. Here's what changed: Zero dependencies =E2=80=94 Replaced the ocamllex/menhir parser with a hand-written implementation and removed the ptime dependency entirely. The library now only requires ocaml and dune. New type-safe API =E2=80=94 The parsed result is now a polymorphic variant tagged by format (IMF, RFC850, `ASCTIME), so you always know which HTTP date format was parsed. The dayname, date, time, and datetime types are all exposed in the public API. Serious testing =E2=80=94 Added property-based tests with alcobar and AFL= fuzz testing infrastructure to build confidence in the hand-written parser. If you're working with HTTP headers in OCaml, give it a try: opam install http-date Caqti 2.3.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Petter A. Urkedal announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 I would like to announce the release of [Caqti] 2.3.0. TL;DR: Consider adding the `caqti.classic' to your link line (available since this version). It currently only re-exports the `caqti' library, but will be replaced by a compatibility layer for the Caqti 2 API in Caqti 3 to allow incremental migration. [Caqti] Release Notes =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Note that some of the new features of this release are only accessible through the still unstable `caqti.template' library, which will soon be stabilized as part of an upcoming Caqti 3 API. Due to adjustments to module names, switching to `caqti.template' will not ensure future compatibility. Instead, users are encouraged to add the new `caqti.classic' to their dependencies to ease migration to Caqti 3. =E2=80=A2 Added an alias `caqti.classic' for the `caqti' library. This w= ill be turned into a library providing compatibility with the current Caqti 2 API when Caqti 3 is released. The two APIs can be used side-by-side to allow incremental migration. =E2=80=A2 The dialect descriptor for MariaDB in `caqti.template' now prov= ides the server version. =E2=80=A2 Added `Query.parens', `Query.litf', `Query.vars', `Row_type.fie= lds' to the `caqti.template' library. =E2=80=A2 Revised the interface for creating row types to allow instantia= ting parametric types applicatively. Before this change, each application of a function representing a parametric type would generate a new type ID even when applied to the same type parameter argument. The key part of this interface is the `Caqti_template.Constructor_type' module. =E2=80=A2 The query functions provided to request templates are now memoi= zed, so that they are only called once per dialect. This is meant as an optimization; it's still good practise to avoid side-effects here. =E2=80=A2 The new function `Query.with_pos_of' allows query generators to= add source locations to the syntax tree, which will be emitted as SQL comments in the query string if the `enable_query_annotations' is set. This should simplify debugging when the query is assembled from different parts of the application code. =E2=80=A2 The still unstable `caqti.template' library now supports multip= le statements in a single request template, sent opportunistically as a single query where allowed. This is still experimental. =E2=80=A2 Fixed package scoping of shim rules for sqlite3 (#133 by mefyl). =E2=80=A2 Fixed the error classification for the SQLite3 driver (#132). =E2=80=A2 Fixed reconnect after connection loss for PostgreSQL. layoutz 0.1.0 =F0=9F=AA=B6 - Zero-dep Elm-style TUIs and terminal plots for= your OCaml apps =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Matthieu Court announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello all! Thanks for your feedback last time - [layoutz] now has an Elm-style TUI runtime (quite [different in spirit] than (the excellent) Minttea) =E2=80=A6 a smoothed API .. and terminal plot built-i= ns. Looking for feedback! Many thanks [layoutz] [different in spirit] Dune 3.22 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90 Archive: Continuing this thread, Shon announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The Dune team is pleased to announce [the release of dune 3.22.2]. This is a patch release consisting of bug fixes. See [the full changelog] for all the changes and for attribution to the contributors who made it all possible. Thank you, contributors! If you encounter a problem with this release, please report it in [our issue [the release of dune 3.22.2] [the full changelog] Fixed =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C =E2=80=A2 Revert the change in behavior of `--diff-command' back to 3.21. Non-existent files are now passed to this command instead of being replaced with /dev/null ([#14098], fixes 13891, [@rgrinberg]) [#14098] [@rgrinberg] ptt, a mailing list system as unikernel =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Calascibetta Romain announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hey! We just launched a new mailing list powered entirely by OCaml unikernels. The website (itself a unikernel) is at . You can subscribe to ptt@mailingl.st by sending an email to ptt-subscribe@mailingl.st if you're interested in the development and deployment of SMTP-related unikernels. Fair warning: this is still a *public test* mailing list for now. In the long run, it will focus on our ptt project. The SMTP protocol: a long and winding road! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C =E2=97=8A In the beginning, email It all started with [Mr.MIME], our library for decoding and encoding emails. It's a synthesis of the relevant RFCs, but more importantly it's been battle-tested against real-world emails from the IEEE, [Enron], [KVM] and, most recently, the [caml-list]. This work also let us build [Hamlet], a database of valid random emails generated using a fuzzer. Under the hood, Mr.MIME relies on [unstrctrd] for decoding the most general form of values found in an email (with internationalisation support via [rosetta]) and [prettym] for encoding emails while respecting SMTP constraints and (Comment) Folding Whitespace handling. [Mr.MIME] [Enron] [KVM] [caml-list] [Hamlet] [unstrctrd] [rosetta] [prettym] =E2=97=8A Next, the protocol Then came [colombe], our OCaml implementation of the SMTP protocol. It uses [ocaml-tls] for `STARTTLS' support. The protocol is supposedly "simple" (though the Internet always has surprises in store), but from day one we designed colombe to be independent of any scheduler and network layer. That way it slots right into unikernels without friction. [colombe] [ocaml-tls] =E2=97=8A Finally, legitimacy On top of these core components, we built several email security layers: =E2=80=A2 [ocaml-dkim] handles signing and verifying email integrity in a streaming fashion (both for verification and signature generation) =E2=80=A2 [uspf] verifies sender identity and, like most of our libraries, stays independent of any scheduler or DNS implementation =E2=80=A2 [ocaml-dmarc] automates DKIM and SPF verification, stamps emails with the result, and checks alignment across a domain name =E2=80=A2 [ocaml-arc](github.com/robur-coop/ocaml-arc) lets you verify and sign emails to complete a chain of trust when an email passes through multiple SMTP servers (which is exactly what happens with a mailing list) We wrote a short article about all of this [here]. [ocaml-dkim] [uspf] [ocaml-dmarc] [here] All in the form of unikernels =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Our first experiments already showed that we [could handle emails] with MirageOS unikernels. But we also hit real limitations: memory leaks, security vulnerabilities, and build issues. So we decided to start fresh, and take the opportunity to fully embrace OCaml 5 and effects. We rebuilt the key pieces from scratch: =E2=80=A2 a new effect-based scheduler: [Miou]/[Mkernel] =E2=80=A2 a much more complete TCP/IP stack: [Mnet] =E2=80=A2 a new FAT32 file system: [Mfat] `ptt' is built on this new stack, and so far we haven=E2=80=99t observed = any memory leaks (thanks to [mkernel-memtrace] for tracing memory usage, viewable via [memtrace-viewer]). The CVEs related to [mirage-tcpip] were taken into account during ~mnet~=E2=80=99s development, and the build story is much simpler now. A GitHub action can build and actually run the unikernel to test it, as you can see with [mnet]. Other unikernels using this approach are available too. If you=E2=80=99re curious, check out [this tutorial] on creating a unikernel in OCaml. [could handle emails] [Miou] [Mkernel] [Mnet] [Mfat] [mkernel-memtrace] [memtrace-viewer] [mirage-tcpip] [mnet] [this tutorial] Deployment =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C `ptt' also tackles the deployment question. We have [an article] presenting the "stateless" aspect of `ptt'. We'd also like to (re)introduce [Albatross](github.com/robur-coop/albatross), our secure unikernel orchestrator, and [Mollymawk], a web interface for deploying unikernels (which is itself a unikernel). More broadly, this is what [our cooperative] is working towards: we really want to improve the user experience, whether you're a developer or a deployer. We believe that actually developing, deploying, and using our unikernels is the only way to get them adopted more widely. So make sure to follow us on these projects too! [an article] [Mollymawk] [our cooperative] Usage =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Along the way, we found it really helpful to have a tool that lets you track every stage of an email=E2=80=99s lifecycle. That=E2=80=99s how [`b= laze'] came about: a Swiss Army knife for handling emails. It=E2=80=99s still experimental, but it already lets you: =E2=80=A2 use our archive system (generate, read, index, etc.) =E2=80=A2 handle other archives such as `mbox' or `maildir' =E2=80=A2 communicate via the POP3 protocol =E2=80=A2 sign and verify emails (DKIM and ARC) =E2=80=A2 build emails from the command line =E2=80=A2 send emails =E2=80=A2 run a small local SMTP server `blaze' is how we iterate on our library APIs and validate implementations. It=E2=80=99s experimental, but it=E2=80=99s gradually tu= rning into a full email client. [`blaze'] =E2=97=8A Archiving & Indexing We'd also like to present the [stem] project, which extracts word roots from a document (such as an email) and tokenises them to get something analysable without the complexity of natural language. This tokenisation is what powers our small [bm25] search engine. You can see results [here]. This is also what drives our caml-list search engine, available as a unikernel: [blame], which you can try at (powered by [vif]). Beyond search, there's also email indexing via Message-IDs. For that we built [bancos]: a *persistent* radix tree in OCaml that supports *parallel* access! More details [here]. Finally, our indexing system uses the PACKv2 format (the same one Git uses to store objects), implemented by the [carton] library. It has proven its stability through the [ocaml-git] project, so we decided to reuse it for archiving emails (much like [public-inbox] did, though in a different form). [stem] [bm25] [here] [blame] [vif] [bancos] [here] [carton] [ocaml-git] [public-inbox] Conclusion =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C Thanks to all this work, OCaml now has a solid set of email-related projects. This journey started back in 2016 and there's still a long way to go, as we always aim to offer robu(r)st, battle-tested solutions. Unlike some implementations in other languages (though we are in discussion with folks in the Rust community), ours actually adhere to the standards! It may not seem like a big deal, and you won't see any major difference when just exchanging emails, but we believe this approach paves the way for a better internet. In the form of unikernels, it represents a genuine reclaiming of the means of communication! Mollymawk and Albatross orchestrating all virtual machines =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Hannes Mehnert announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Dear everyone, we just finished and deployed [Albatross] and [Mollymawk] to support virtual machines that are not MirageOS unikernels. The reasoning is simple: we embedded so many nice features (metrics, console output, deploying via web UI, multi-tenant, startup dependencies, restart-on-failure,..) that we really wanted to deploy our non-MirageOS virtual machines as well with the same mechanism and don't have duplicated code all over. For the time being, it only supports FreeBSD BHyve, but let us know if you're interested in other virtualization technologies and we will prioritize that work! We also wrote a brief blog article with screenshots: [Albatross] [Mollymawk] OUPS meetup april 2026 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: ancolie announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80 The next OUPS meetup will take place on *Wednesday, 29th of April* 2026. It will start at *6:30pm* at the *45 rue d'Ulm* in Paris. It will be in the in the *Rataud amphitheater*. :warning: It's not in Jussieu as usual but in ENS Ulm! If you're not familiar with the place, there is a [map of the buildings]. Please, *[register on meetup ]* as soon as possible to let us know how many pizza we should order. For more details, you may check the [OUPS=E2=80=99 website ]. Moreover, we=E2=80=99d like to announce that the organizing team moved to= the [OCaml Zulip]. Feel free to contact us there if you=E2=80=99d like to sug= gest talks. =E2=80=94 This time we=E2=80=99ll have the following talks: *When Turing machines meet GADTs =E2=80=93 Florian Angeletti* Have you ever wondered why one needs to write down explicit unreachable clauses in a GADT-pattern matching? Or how much computation one can sneak inside an OCaml type? This talk proposes to answers those questions and more with a deep dive into GADTs, the OCaml compiler implementation of the exhaustiveness checking for pattern match, and how to best trick the typechecker into finding the BB(3) champion by itself. *Extending OCaml's pattern matching =E2=80=93 Yanni Lefki* Pattern matching has been studied for decades and has been the subject of extensive research and numerous extensions. Nevertheless, recent language features=E2=80=94such as Rust=E2=80=99s if-let construct, and re= cent work such as Cheng and Parreaux (OOPSLA 2024), suggest that there is still room for improvement. We propose a streamlined approach that unifies pattern matching with extended forms of conditionals. In particular, our prototype introduces binding-boolean-expressions, which allow variables to be bound within pattern guards, within if-conditions (and subsequently used in the then branch), and within while-conditions (and used in the loop body). Our system also incorporates Haskell-style views, enabling the definition of smart deconstructors, the dual of smart constructors. In this talk, we present an ML-like language equipped with evaluation rules, typing rules, and a simple compilation scheme. We conclude with a demonstration of our implementation: an OCaml PPX prototype that parses an extended ML syntax exposing these constructs, type-checks programs according to our (highly intuitive!) rules, and translates them into a correct OCaml AST via our (non-optimizing) transformation. =E2=80=94 After the talks there will be some pizzas offered by the [OCaml Software Foundation] and later on we=E2=80=99ll move to a pub nearby as u= sual. [map of the buildings] [register on meetup ] [OUPS=E2=80=99 website ] [OCaml Zulip] [OCaml Software Foundation] Stk 0.6 released =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Zoggy announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, Stk is a SDL-based graphical user interface toolkit. Its interface is inspired by Gtk and should look familiar to developers using Lablgtk. Stk 0.6 is available. Among changes listed [here], this release introduces [Tooltips] and [handling of user's configuration], including user-defined themes. The `stk*' packages are available from my [personal opam repository]. [here] [Tooltips] [handling of user's configuration] [personal opam repository] opam 2.5.1 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90 Archive: Kate announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hi everyone, opam 2.5.1 is now available. This release is fixing a security issue ([OSEC-2026-03]) and other minor things. /Thanks to [@andrew] for reporting this issue./ We invite everyone to upgrade to 2.5.1 as soon as possible. If you depend on the older opam package of your preferred distribution, distributions such as Debian Stable have already started backporting the relevant fix and the patched version should be available there very soon. You can read our [blog post] for relevant links and details. [OSEC-2026-03] [@andrew] [blog post] Try it! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The upgrade instructions are unchanged: For Unix systems bash -c "sh <(curl -fsSL ) =E2=80=93version 2.5.1" or from PowerShell for Windows systems Invoke-Expression "& { $(Invoke-RestMethod ) } -Version 2.5.1" Please report any issues to the [bug-tracker]. Happy hacking, <> <> The opam team <> <> :camel: [bug-tracker] Restarting OCaml.jp: The OCaml Japan User Group =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: mt_caret announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80 Dear OCaml community, We're excited to announce the relaunch of *OCaml.jp* ([https://ocaml.jp/]), the OCaml Japan User Group! Our goal is to grow and energize the OCaml community in Japan by bringing together users to foster broader adoption and deeper engagement with OCaml across the country. [https://ocaml.jp/] Current Activities =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C We've already kicked off a couple of initiatives: =E2=80=A2 *OCaml Weekly News - Japanese Edition*: We're maintaining a Jap= anese translation of the OCaml Weekly News at [https://ocaml.jp/cwn-ja/], making it easier for Japanese speakers to stay up to date with the latest happenings in the OCaml ecosystem. =E2=80=A2 *OCaml Meetup in Tokyo (August 2026)*: We are currently prepari= ng to host an OCaml Meetup in Tokyo this August, the first one in [over ten years]! More details will be shared soon; please stay tuned! [https://ocaml.jp/cwn-ja/] [over ten years] Join Us! =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C We're using *Discord* as our primary communication platforms. Whether you're based in Japan, are a Japanese-speaking OCaml enthusiast anywhere in the world, or simply want to connect with the Japanese OCaml community, we'd love to have you join us! Please use the following link to join Discord: [https://discord.gg/qQTbny8KF4] We look forward to building a vibrant OCaml community in Japan together. =E3=82=88=E3=82=8D=E3=81=97=E3=81=8F=E3=81=8A=E9=A1=98=E3=81=84= =E3=81=97=E3=81=BE=E3=81=99=EF=BC=81 [https://discord.gg/qQTbny8KF4] Code navigation and search on Github =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90 Archive: Pieter Goetschalckx announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80 GitHub is now using [tree-sitter-ocaml] for [code navigation] and [code search]. =E2=80=A2 Code highlighting should be more accurate (compared to the old TextMate grammar) and supports all features up to OCaml 5.4. =E2=80=A2 There is a symbols side panel for each file. =E2=80=A2 You can click on symbols to find definitions and references. =E2=80=A2 You can [search for definitions]. =E2=80=A2 There is limited support for [nested structures]. They enabled it [a few months ago] already, but I forgot to post it here. The code navigation is not always 100% accurate, but good enough to be helpful. If you encounter any issues with incorrectly highlighted code, this could be a tree-sitter-ocaml issue. [tree-sitter-ocaml] [code navigation] [code search] [search for definitions] [nested structures] [a few months ago] Seeking maintainers for our OCaml SIP server, gRPC, and HTTP/2 libraries =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Wojtek Czekalski announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80 As we're moving off OCaml at [dialo], we'd like to donate the libraries we built to people who will properly maintain them. We built a highly performant telephony system using OCaml, but as a small team we ended up maintaining too much software for our liking. We initially built a SIP server implementation in OCaml, which was a perfect fit. We needed to connect it to the rest of our system in a language agnostic way. We chose gRPC and that's where things got difficult. At a smaller scale our own buggy implementation of gRPC on top of [h2] was good enough. Then we started scaling and at the same time transitioned to OCaml 5.0. The combination of those factors resulted in: 1. Performance regressions in 5.0 related to memory management, both inside of app code, SIP stack, and inside of h2. 2. We needed a more robust implementation of gRPC to handle errors and edge cases better. Long story short we ended up: 1. Writing our own implementation of [http2] 2. Rewriting the gRPC library exclusively for eio to limit the scope together with [decent codegen] and robust Then, in late 2025, we had to add new features to the SIP server and something inside us just broke. The SIP server had accumulated quite a bit of legacy code over 3.5 years, so we wanted to rewrite some parts. We were extremely excited to build the new architecture centered around effects =E2=80=94 [only to discover that user-space effec= ts and concurrency libraries don't really work well together], since callbacks lose their scope (duh). That was the final straw. We decided to run two 1-week stints to try rewriting the service in Rust and Go. We ended up choosing Rust. We still miss OCaml, but not having to implement and maintain our own http2/grpc/sip stack is a breath of fresh air. So here we are =E2=80=94 we're gradually removing OCaml from our stack, a= nd that's why we'd like to donate: =E2=80=A2 [ocaml-grpc] - the new code is on `dialo' branch, eio only at t= he moment, battle tested on production. It does have some bugs in it but few and it's pretty solid. =E2=80=A2 [haha (http2)] - overall good but could be better. We cancel fi= bers too often, it's a very low hanging fruit to make it much faster. =E2=80=A2 Our SIP stack =E2=80=94 this is currently not open source, but = we're happy to share the source code with the right person or team. Please write dms to me and feel free to ask me or @adamchol about specifics. [dialo] [h2] [http2] [decent codegen] [only to discover that user-space effects and concurrency libraries don't really work well together] [ocaml-grpc] [haha (http2)] ppx_mixins: slightly more elegant mixin syntax =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: Sacha Ayoun announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Hello, I've written a tiny ppx called [`ppx_mixins'] so that one can write: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type u [@@mixins Map.OrderedType + Printable] =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 which gets desugared to =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type u =E2=94=82 include Map.OrderedType with type t :=3D u =E2=94=82 include Printable with type t :=3D u =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Not much but increases readability in a codebase that uses the "mixin" pattern a lot [`ppx_mixins'] Constructing type signatures =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C In the upcoming release, one can also write =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 module type M =3D [%mixins Map.OrderedType + Printable] =E2=94=82 (* desugars to *) =E2=94=82 module type M =3D sig=20 =E2=94=82 type t=20 =E2=94=82 include Map.OrderedType with type t :=3D t =E2=94=82 include Printable with type t :=3D t =E2=94=82 end =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Additional features =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C One can also override other types, e.g. =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 type u [@@mixins Mappable(key =3D int; value :=3D v)] =E2=94=82 (* desugars to *) =E2=94=82 type u =E2=94=82 include Mappable with type t :=3D u and type key =3D int and ty= pe value :=3D v =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 Limitations =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C =E2=80=A2 No support for parametric types, e.g. `with type 'a u =3D 'a v' =E2=80=A2 No support for tuple and function types, e.g. `with type t =3D = int -> bool' This is because the preprocessor parses the payload as an expression, and these don't parse nicely a expressions. Deeper support (e.g. for mixins with type parameters) would probably also require language support. Experience Report: Refining Dune=E2=80=99s Dependency Graph =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90 Archive: Robin Bate Boerop announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 *Refining Dune's Dependency Graph: Per-Module Library Filtering* I've been working on improving Dune's inter-library dependency tracking, and wanted to share the experience =E2=80=94 both the technical details and what it's like as a first-time contributor to this large open source OCaml project. The Problem I Took On =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C When `libA' depends on `libB', Dune gives every module in `libA' a glob dependency on /all/ `.cmi' files in `libB'. If any `.cmi' in `libB' changes, every module in `libA' is recompiled =E2=80=94 even modul= es that never reference `libB'. For projects with many libraries, this creates a cascade of unnecessary recompilations. The issue that tracks this matter [#4572] has been open since 2021. [#4572] My Approach =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C Dune already runs `ocamldep' to compute intra-library module dependencies. The key insight: that same output tells us which /libraries/ each module references, via their entry module names. We can use this to filter both the build dependencies and the `-I~/'-H~ compiler flags per-module. The implementation ([PR #14116] and [PR #14186]) works as follows: 1. For each module and its transitive intra-library dependencies, read the `ocamldep' output (both `.ml' and `.mli') 2. Union all referenced module names, including `-open' flags 3. Map those names to libraries via a `Lib_index' 4. Transitively close the filtered library set via `Lib.closure' 5. Use the result for both hidden deps and `-I~/'-H~ compiler flags, partitioning into direct (visible via `-I') and hidden (via `-H') based on `requires_compile' membership With both deps and flags filtered, a clean build will fail if a module references a library it doesn't declare =E2=80=94 previously, overly-broad `-I' flags could mask such errors. [PR #14116] [PR #14186] A False Start =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C My first attempt ([PR #14021]) tried to implement the filtering in a single PR without sufficient test coverage. It was closed after review revealed that the approach was fragile in edge cases I hadn't anticipated =E2=80=94 particularly around transparent module aliases and virtual libraries. [PR #14021] Challenges =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C *Transparent module aliases.* OCaml's module alias mechanism means `ocamldep' doesn't always report all libraries a module transitively depends on. If `libB' has `module M =3D LibC.Something', and a module in `libA' uses `LibB.M', `ocamldep' reports `LibB' but not `LibC'. The fix: transitively close the filtered library set using `Lib.closure', bounded by the compilation context. *Root modules.* The `(root_module)' stanza creates a module that implicitly aliases all libraries in the compilation context. When `ocamldep' reports a reference to a root module, we can't determine which underlying libraries are actually needed, so we fall back to the full dependency set. *Virtual libraries.* When virtual library implementations are present in the compilation context, parameter libraries may not appear in `requires_compile', so filtering could miss them. Another fallback case. *Menhir-generated modules.* These mock modules aren't in the `ocamldep' dependency graph, so we skip filtering for them. *Null build overhead.* The filtering reads `.d' files and computes library closures per-module. On a fresh `dune' process (no memo cache), this is new work on every build =E2=80=94 including null builds = where nothing changed. This is a real trade-off: better incremental rebuild performance at the cost of some null-build overhead. Prerequisite Test PRs =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C Before the implementation PRs, I submitted six test-only PRs to document existing behavior and establish a safety net: =E2=80=A2 [#14017] =E2=80=94 Baseline tests documenting current inter-lib= rary recompilation behavior =E2=80=A2 [#14031] =E2=80=94 Test documenting module name shadowing betwe= en stanzas and libraries =E2=80=A2 [#14100] =E2=80=94 Test verifying library file deps in compilat= ion rules and sandboxed builds =E2=80=A2 [#14101] =E2=80=94 Test verifying transparent alias incremental= build safety =E2=80=A2 [#14129] =E2=80=94 Test verifying incremental builds with alias= re-exported libraries =E2=80=A2 [#14178] =E2=80=94 Test documenting `ocamldep' behavior with tr= ansparent alias chains This made the implementation PRs' diffs focused on the actual change, and gave reviewers confidence that existing behavior was preserved. It also helped me understand the edge cases that tripped up my first attempt. [#14017] [#14031] [#14100] [#14101] [#14129] [#14178] The Review Process =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C The Dune maintainers ([@rgrinberg] and [@art-w]) provided thorough, constructive reviews. Some highlights: =E2=80=A2 Replacing my hand-rolled transitive closure with `Lib.closure' = from the existing library =E2=80=94 a cleaner approach I wouldn't have found without familiarity with Dune's internals =E2=80=A2 Identifying that both `.ml' and `.mli' ocamldep output need to = be read, since the interface can reference different libraries than the implementation =E2=80=A2 Suggesting per-module `-I~/'-H~ flag filtering, which makes cle= an builds more precise and improves caching =E2=80=A2 Questioning every fallback case and special-cased module kind, leading to simpler code The PRs went through significant refactoring during review =E2=80=94 the = final versions are substantially tighter than the initial submissions. [@rgrinberg] [@art-w] What Could Be Better =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C Working on this was a positive experience overall, but a few things created friction: *No way to benchmark before merging.* The null-build overhead question came up late in the process. I discovered through manual benchmarking that the change added \~70% to null build time =E2=80=94 a significant regression. Dune's benchmark CI workflow runs only on pushes to main, not on PRs. Contributor-accessible performance tooling would help catch regressions before they land. *Review momentum vs. rebasing.* The test PRs merged quickly, but the implementation PR required multiple rounds of review over days. Between rounds, main moves forward, requiring rebases that risk introducing conflicts. The contributor carries the burden of keeping branches fresh. This is compounded when PRs depend on each other =E2=80= =94 every rebase of #14116 required rebasing #14186 as well. GitHub has no first-class support for PR stacks, so this is manual and error-prone. Of course, all GitHub-hosted repos suffer from this. *Flaky CI*. Many CI runs had errors that were not related to my code. It was often an upstream provider of an OCaml package that was unreachable or faulty (temporarily). These problems often resolved themselves, but caused day-long delays in the PR lifetimes. The problem stems from the setup code that is run and re-run over and over in CI jobs. Reflections =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C The Dune codebase is well-structured, with clear separation between the build engine, rule generation, and scheduler. It is also of good quality, making it feel like time spent on keeping the quality high is worthwhile. I found the cram test infrastructure good for testing. Each test scenario is a self-contained shell script with expected output, making it easy to document and verify exact recompilation behavior. It inspires confidence in the code. The maintainers have been responsive and the review process, while slowed by thoroughness, is collaborative and professional. Thank you, maintainers! Steffen Smolka then replied =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80 GitHub has no first-class support for PR stacks It does now: First beta release of OCaml 5.5.0 =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 Archive: octachron announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80 With most developer tools available and the good stability of the compiler, I am happy to announce the first beta release of OCaml 5.5.0. Compared to the last alpha, this new version improves the manpage for ocamlopt and fixes: =E2=80=A2 two runtime bugs (for ephemerons and the bytecode interpreter) =E2=80=A2 two type system bugs (for classes and module-dependent function= s) =E2=80=A2 three warning or error message bugs (See the Changelog below for a full list). Concerning the associated compiler tools, most of them are already available (as least in a preview version), and there are patches in progress for the remaining ones. You can track the last remaining update efforts on the [release readiness meta-issue]. Thus, it should be safe to test your libraries and programs with the new version OCaml 5.5.0 version in preparation of the final release. If everything goes well, we might see a release in May. If you find any bugs, please report them to the [GitHub issue tracker]. If you are interested by the full list of new features and bug fixes, the [changelog for OCaml 5.5.0] is the most up-to-date resource. Happy hacking, Florian Angeletti for the OCaml team. [release readiness meta-issue] [GitHub issue tracker] [changelog for OCaml 5.5.0] Installation Instructions =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C The base compiler can be installed as an opam switch with the following commands on opam 2.1 and later: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create 5.5.0~beta1 =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 The source code for the beta is also available at these addresses: =E2=80=A2 GitHub: =E2=80=A2 OCaml archives at Inria: Fine-Tuned Compiler Configuration =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C If you want to tweak the configuration of the compiler, you can switch to the option variant with: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam update =E2=94=82 opam switch create ocaml-variants.5.5.0~beta1+opt= ions =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 where `option_list' is a space separated list of `ocaml-option-*' packages. For instance, for a flambda and no-flat-float-array switch: =E2=94=8C=E2=94=80=E2=94=80=E2=94=80=E2=94=80 =E2=94=82 opam switch create 5.5.0~beta1+flambda+nffa ocaml-variants.5.5.= 0~beta1+options ocaml-option-flambda ocaml-option-no-flat-float-array =E2=94=94=E2=94=80=E2=94=80=E2=94=80=E2=94=80 All available options can be listed with `opam search ocaml-option'. Changes compared to the last alpha =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95= =8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C= =E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2=95=8C=E2= =95=8C =E2=97=8A Documentation update =E2=80=A2 [#14684]: Improve ocamlopt's manual page (Samuel Hym, review by Florian Angeletti) [#14684] =E2=97=8A Runtime fixes =E2=80=A2 [#14644], [#14647]: Fix a bug related to unhandled effects in bytecode. (Vincent Laviron, report by Thibaut Mattio, review by Nicol=C3=A1s Ojeda B=C3=A4r, Stephen Dolan and Olivier Nicole) =E2=80=A2 [#14349], [#14718]: runtime, fix in the orphaning of ephemerons (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Jan Midtgaard) [#14644] [#14647] [#14349] [#14718] =E2=97=8A Type system fixes =E2=80=A2 [#14557], [#12150], [#14696]: ensure that the self type of class cannot escape through type constraints. (Leo White, review by Florian Angeletti) =E2=80=A2 [#14667]: enable application related warnings for module-depend= ent functions (Florian Angeletti, review by Gabriel Scherer) [#14557] [#12150] [#14696] [#14667] =E2=97=8A Error messages and warning fixes =E2=80=A2 [#14690]: Fix `Name_type_mismatch' error message when the expec= ted type is an alias: print the expanded path on the right-hand side of the equality, not the alias twice. (Weixie Cui, review by Florian Angeletti) =E2=80=A2 [#14719], [#14721]: compute arity correctly for module-dependent function (Florian Angeletti, report by Jeremy Yallop, review by Stefan Muenzel) =E2=80=A2 [#14655], [#14691]: check for size overflow in caml_ba_reshape (Stephen Dolan, review by Xavier Leroy) [#14690] [#14719] [#14721] [#14655] [#14691] ocgtk 0.1: OCaml bindings for GTK 4 (preview release) =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2= =95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95= =90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90= =E2=95=90=E2=95=90=E2=95=90 Archive: Continuing this thread, Chris Armstrong announced =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80= =E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2= =94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94= =80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80=E2=94=80 /ocgtk preview1 release has landed in opam./ (preview0 was abandoned as considerable work was required to get it building on other Linux distributions and Mac). A special thanks to @jmid for helping me get it over the line. In addition to the features above, it includes: =E2=80=A2 Extended support for more GLib types, including integer primiti= ves (guint8, int16, guint32, etc) and lists (GLib.SList and GLib.List) =E2=80=A2 Gobject interfaces The combination of the above enables more methods to be generated (that were previously excluded) when they include those types in their parameters and/or return types, opening up much more of the API surface of GTK (and related libraries). *Next steps*: my focus now is on internal cleanup and reorganisation to better structure the tests and split gir_gen (the GObject code generator) into a seperate dune project. This will reduce the dependency list considerably and enable targeting earlier OCaml versions, as well as reducing release headaches related to gir_gen (which is not required by packages just using ocgtk) Old CWN =E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90=E2=95=90 If you happen to miss a CWN, you can [send me a message] and I'll mail it to you, or go take a look at [the archive] or the [RSS feed of the archives]. If you also wish to receive it every week by mail, you may subscribe to the [caml-list]. [Alan Schmitt] [send me a message] [the archive] [RSS feed of the archives] [caml-list] [Alan Schmitt] --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 14 to 21, 2026.

    http-date v0.2 =E2=80=94 Zero-dependency HTTP date parsing for= OCaml

    Bikal Lem announced

    I just released v0.2 of http-date, an RFC 9110 compliant HTTP datetime deco= der/encoder for OCaml.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20

    This is a major rewrite from v0.1. Here's what changed:=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20

    Zero dependencies =E2=80=94 Replaced the ocamllex/menhir parser with a hand= -written implementation and removed the ptime=20=20=20=20=20=20=20 dependency entirely. The library now only requires ocaml and dune.

    New type-safe API =E2=80=94 The parsed result is now a polymorphic variant = tagged by format (IMF,=20 RFC850, `ASCTIME), so you=20=20=20=20 always know which HTTP date format was parsed. The dayname, date, time, and= datetime types are all exposed in the public API.=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20

    Serious testing =E2=80=94 Added property-based tests with alcobar and AFL f= uzz testing infrastructure to build confidence in the hand-written parser.

    If you're working with HTTP headers in OCaml, give it a try:=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20

    opam install http-date=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20=20= =20=20=20=20=20

    https://github.com/bikall= em/http-date

    Caqti 2.3.0

    Petter A. Urkedal announced

    I would like to announce the release of Caqti 2.3.0.

    TL;DR: Consider adding the caqti.classic to your link line (av= ailable since this version). It currently only re-exports the caqti<= /code> library, but will be replaced by a compatibility layer for the Caqti= 2 API in Caqti 3 to allow incremental migration.

    Release Notes

    Note that some of the new features of this release are only accessible through the still unstable caqti.template library, which will = soon be stabilized as part of an upcoming Caqti 3 API. Due to adjustments to module names, switching to caqti.template will not ensure future comp= atibility. Instead, users are encouraged to add the new caqti.classic to = their dependencies to ease migration to Caqti 3.

    • Added an alias caqti.classic for the caqti li= brary. This will be turned into a library providing compatibility with the current Caqti 2 API when Caqti 3 is released. The two APIs can be used side-by-side to allow incremental migration.
    • The dialect descriptor for MariaDB in caqti.template now p= rovides the server version.
    • Added Query.parens, Query.litf, Query.v= ars, Row_type.fields to the caqti.template library.
    • Revised the interface for creating row types to allow instantiating parametric types applicatively. Before this change, each application of a function representing a parametric type would generate a new type ID even when applied to the same type parameter argument. The key part of this interface is the Caqti_template.Constructor_type module.<= /li>
    • The query functions provided to request templates are now memoized, so that they are only called once per dialect. This is meant as an optimization; it's still good practise to avoid side-effects here.
    • The new function Query.with_pos_of allows query generators= to add source locations to the syntax tree, which will be emitted as SQL comments in the query string if the enable_query_annotations i= s set. This should simplify debugging when the query is assembled from different parts of the application code.
    • The still unstable caqti.template library now supports mul= tiple statements in a single request template, sent opportunistically as a single query where allowed. This is still experimental.
    • Fixed package scoping of shim rules for sqlite3 (#133 by mefyl).
    • Fixed the error classification for the SQLite3 driver (#132).
    • Fixed reconnect after connection loss for PostgreSQL.

    layoutz 0.1.0 =F0=9F=AA=B6 - Zero-dep Elm-style TUIs and termi= nal plots for your OCaml apps

    Matthieu Court announced

    Hello all! Thanks for your feedback last time - layoutz now has an Elm= -style TUI runtime (quite different in spirit than (the excellent)= Minttea) =E2=80=A6 a smoothed API .. and terminal plot built-ins.

    Looking for feedback! Many thanks

    Dune 3.22

    Continuing this thread, Shon announced

    The Dune team is pleased to announce the release of dune 3.22.2.

    This is a patch release consisting of bug fixes. See the full changelog for all the = changes and for attribution to the contributors who made it all possible. T= hank you, contributors!

    If you encounter a problem with this release, please report it in [our issue

    Fixed

    • Revert the change in behavior of --diff-command back to 3.= 21. Non-existent files are now passed to this command instead of being repl= aced with /dev/null (#= 14098, fixes 13891, @rgrinberg= )

    ptt, a mailing list system as unikernel

    Calascibetta Romain announced

    Hey! We just launched a new mailing list powered entirely by OCaml unikerne= ls. The website (itself a unikernel) is at = https://mailingl.st. You can subscribe to ptt@mailingl.st by sending an= email to ptt-subscribe@mailingl.st if you're interested in the development= and deployment of SMTP-related unikernels.

    Fair warning: this is still a public test mailing list for now. In t= he long run, it will focus on our ptt project.

    The SMTP protocol: a long and winding road!

    • In the beginning, email

      It all started with Mr.MIME, our library for decoding and encoding emails. It's a synthesis of the re= levant RFCs, but more importantly it's been battle-tested against real-worl= d emails from the IEEE, Enron, KVM and, most recently, the <= a href=3D"https://discuss.ocaml.org/t/is-there-a-public-archive-for-the-cam= l-list/16374/6?u=3Ddinosaure">caml-list.

      This work also let us build Ha= mlet, a database of valid random emails generated using a fuzzer.

      Under the hood, Mr.MIME relies on unstrctrd for decoding the most general form of values found = in an email (with internationalisation support via rosetta) and prettym for encoding emails while respecting SMTP constrai= nts and (Comment) Folding Whitespace handling.

    • Next, the protocol

      Then came colombe, our OC= aml implementation of the SMTP protocol. It uses ocaml-tls for STARTTLS support.

      The protocol is supposedly "simple" (though the Internet always has surpris= es in store), but from day one we designed colombe to be independent of any= scheduler and network layer. That way it slots right into unikernels witho= ut friction.

    • Finally, legitimacy

      On top of these core components, we built several email security layers:

      • ocaml-dkim handles= signing and verifying email integrity in a streaming fashion (both for ver= ification and signature generation)
      • uspf verifies sender ide= ntity and, like most of our libraries, stays independent of any scheduler o= r DNS implementation
      • ocaml-dmarc au= tomates DKIM and SPF verification, stamps emails with the result, and check= s alignment across a domain name
      • [ocaml-arc](github.com/robur-coop/ocaml-arc) lets you verify and sign e= mails to complete a chain of trust when an email passes through multiple SM= TP servers (which is exactly what happens with a mailing list)

      We wrote a short article about all of this here.

    All in the form of unikernels

    Our first experiments already showed that we could handle emails with MirageOS unikernels. B= ut we also hit real limitations: memory leaks, security vulnerabilities, an= d build issues.

    So we decided to start fresh, and take the opportunity to fully embrace OCa= ml 5 and effects. We rebuilt the key pieces from scratch:

    ptt is built on this new stack, and so far we haven=E2=80=99t = observed any memory leaks (thanks to mkernel-memtrace for tracing memory usage, viewa= ble via memtrace-viewer= ). The CVEs related to mirage-tcpip were taken into account during ~mnet~=E2=80=99s develop= ment, and the build story is much simpler now. A GitHub action can build an= d actually run the unikernel to test it, as you can see with mnet.

    Other unikernels using this approach are available too. If you=E2=80=99re c= urious, check out this tutor= ial on creating a unikernel in OCaml.

    Deployment

    ptt also tackles the deployment question. We have an article present= ing the "stateless" aspect of ptt. We'd also like to (re)intro= duce [Albatross](github.com/robur-coop/albatross), our secure unikernel orc= hestrator, and Mollyma= wk, a web interface for deploying unikernels (which is itself a unikern= el).

    More broadly, this is what our cooperative is working towards: we really want to improve the user experience, wheth= er you're a developer or a deployer. We believe that actually developing, d= eploying, and using our unikernels is the only way to get them adopted more= widely. So make sure to follow us on these projects too!

    Usage

    Along the way, we found it really helpful to have a tool that lets you trac= k every stage of an email=E2=80=99s lifecycle. That=E2=80=99s how blaze came about: = a Swiss Army knife for handling emails.

    It=E2=80=99s still experimental, but it already lets you:

    • use our archive system (generate, read, index, etc.)
    • handle other archives such as mbox or maildir=
    • communicate via the POP3 protocol
    • sign and verify emails (DKIM and ARC)
    • build emails from the command line
    • send emails
    • run a small local SMTP server

    blaze is how we iterate on our library APIs and validate imple= mentations. It=E2=80=99s experimental, but it=E2=80=99s gradually turning i= nto a full email client.

    • Archiving & Indexing

      We'd also like to present the stem project, which extracts word roots from a document (such as an em= ail) and tokenises them to get something analysable without the complexity = of natural language. This tokenisation is what powers our small bm25 search engine. You can s= ee results here.

      This is also what drives our caml-list search engine, available as a uniker= nel: blame, which you c= an try at https://caml-list.robur.= coop (powered by vif).

      Beyond search, there's also email indexing via Message-IDs. For that we bui= lt bancos: a persis= tent radix tree in OCaml that supports parallel access! More det= ails he= re.

      Finally, our indexing system uses the PACKv2 format (the same one Git uses = to store objects), implemented by the carton library. It has proven its stability through the ocaml-git project, so we d= ecided to reuse it for archiving emails (much like public-inbox did, though in a different form).

    Conclusion

    Thanks to all this work, OCaml now has a solid set of email-related project= s. This journey started back in 2016 and there's still a long way to go, as= we always aim to offer robu(r)st, battle-tested solutions. Unlike some imp= lementations in other languages (though we are in discussion with folks in = the Rust community), ours actually adhere to the standards!

    It may not seem like a big deal, and you won't see any major difference whe= n just exchanging emails, but we believe this approach paves the way for a = better internet. In the form of unikernels, it represents a genuine reclaim= ing of the means of communication!

    Mollymawk and Albatross orchestrating all virtual machines

    Hannes Mehnert announced

    Dear everyone,

    we just finished and deployed Albatross and Mollymawk to support virtual machines that are not MirageOS unikernel= s.

    The reasoning is simple: we embedded so many nice features (metrics, consol= e output, deploying via web UI, multi-tenant, startup dependencies, restart= -on-failure,..) that we really wanted to deploy our non-MirageOS virtual ma= chines as well with the same mechanism and don't have duplicated code all o= ver.

    For the time being, it only supports FreeBSD BHyve, but let us know if you'= re interested in other virtualization technologies and we will prioritize t= hat work!

    We also wrote a brief blog article with screenshots: https://blog.robur.coop/article= s/mollymawk-other.html

    OUPS meetup april 2026

    ancolie announced

    The next OUPS meetup will take place on Wednesday, 29th of April 202= 6. It will start at 6:30pm at the 45 rue d'Ulm in Paris. It w= ill be in the in the Rataud amphitheater.

    :warning: It's not in Jussieu as usual but in ENS Ulm! If you're not famili= ar with the place, there is a map of the buildings.

    Please, register on meetup as soon as possible to let us know how many pi= zza we should order.

    For more details, you may check the OUPS= =E2=80=99 website .

    Moreover, we=E2=80=99d like to announce that the organizing team moved to t= he OCaml Zulip. Feel free to co= ntact us there if you=E2=80=99d like to suggest talks.

    This time we=E2=80=99ll have the following talks:

    When Turing machines meet GADTs – Florian Angeletti

    Have you ever wondered why one needs to write down explicit unreachable clauses in a GADT-pattern matching? Or how much computation one can sneak inside an OCaml type?

    This talk proposes to answers those questions and more with a deep dive into GADTs, the OCaml compiler implementation of the exhaustiveness checking for pattern match, and how to best trick the typechecker into finding the BB(3) champion by itself.

    Extending OCaml's pattern matching – Yanni Lefki

    Pattern matching has been studied for decades and has been the subject of e= xtensive research and numerous extensions. Nevertheless, recent language fe= atures=E2=80=94such as Rust=E2=80=99s if-let construct, and recent work suc= h as Cheng and Parreaux (OOPSLA 2024), suggest that there is still room for= improvement. We propose a streamlined approach that unifies pattern matchi= ng with extended forms of conditionals.

    In particular, our prototype introduces binding-boolean-expressions, which = allow variables to be bound within pattern guards, within if-conditions (an= d subsequently used in the then branch), and within while-conditions (and u= sed in the loop body). Our system also incorporates Haskell-style views, en= abling the definition of smart deconstructors, the dual of smart constructo= rs.

    In this talk, we present an ML-like language equipped with evaluation rules= , typing rules, and a simple compilation scheme. We conclude with a demonst= ration of our implementation: an OCaml PPX prototype that parses an extende= d ML syntax exposing these constructs, type-checks programs according to ou= r (highly intuitive!) rules, and translates them into a correct OCaml AST v= ia our (non-optimizing) transformation.

    After the talks there will be some pizzas offered by the OCaml Software Foundation and later on we=E2=80=99ll mov= e to a pub nearby as usual.

    Stk 0.6 released

    Zoggy announced

    Hello,

    Stk is a SDL-based graphical user interface toolkit. Its interface is inspi= red by Gtk and should look familiar to developers using Lablgtk.

    Stk 0.6 is available. Among changes listed here, this release introduces Tooltips and handling of user's configuration, including user-defined themes.

    The stk* packages are available from my personal opam repository.

    opam 2.5.1

    Kate announced

    Hi everyone,

    opam 2.5.1 is now available. This release is fixing a security issue (OSEC-2026-03) and other minor things. Thanks to <= a href=3D"https://github.com/andrew">@andrew for reporting this issue.<= /i>

    We invite everyone to upgrade to 2.5.1 as soon as possible.

    If you depend on the older opam package of your preferred distribution, dis= tributions such as Debian Stable have already started backporting the relev= ant fix and the patched version should be available there very soon.

    You can read our blog p= ost for relevant links and details.

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL h= ttps://opam.ocaml.org/install.sh) –version 2.5.1"

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/install.ps1) } -Version 2.5.1"

    Please report any issues to the bug-tracker.

    Happy hacking,

    <> <> The opam team <> <> :camel:

    Restarting OCaml.jp: The OCaml Japan User Group

    mt_caret announced

    Dear OCaml community,

    We're excited to announce the relaunch of OCaml.jp (https://ocaml.jp/), the OCaml Japan User Group!

    Our goal is to grow and energize the OCaml community in Japan by bringing t= ogether users to foster broader adoption and deeper engagement with OCaml a= cross the country.

    Current Activities

    We've already kicked off a couple of initiatives:

    • OCaml Weekly News - Japanese Edition: We're maintaining a Japane= se translation of the OCaml Weekly News at https://ocaml.jp/cwn-ja/, making it easier for Japanese speakers t= o stay up to date with the latest happenings in the OCaml ecosystem.
    • OCaml Meetup in Tokyo (August 2026): We are currently preparing = to host an OCaml Meetup in Tokyo this August, the first one in over ten years! More details will be shared so= on; please stay tuned!

    Join Us!

    We're using Discord as our primary communication platforms. Whether = you're based in Japan, are a Japanese-speaking OCaml enthusiast anywhere in= the world, or simply want to connect with the Japanese OCaml community, we= 'd love to have you join us!

    Please use the following link to join Discord: https://discord.gg/qQTbny8KF4

    We look forward to building a vibrant OCaml community in Japan together. = =E3=82=88=E3=82=8D=E3=81=97=E3=81=8F=E3=81=8A=E9=A1=98=E3=81=84=E3=81=97=E3= =81=BE=E3=81=99=EF=BC=81

    Code navigation and search on Github

    Pieter Goetschalckx announced

    GitHub is now using tree-sitter-ocaml for code navi= gation and code s= earch.

    • Code highlighting should be more accurate (compared to the old TextMate= grammar) and supports all features up to OCaml 5.4.
    • There is a symbols side panel for each file.
    • You can click on symbols to find definitions and references.
    • You can search for definitions.
    • There is limited support for nested structures.

    They enabled it a few months ago already, but I forgot to post it here.

    The code navigation is not always 100% accurate, but good enough to be help= ful. If you encounter any issues with incorrectly highlighted code, this co= uld be a tree-sitter-ocaml issue.

    Seeking maintainers for our OCaml SIP server, gRPC, and HTTP/= 2 libraries

    Wojtek Czekalski announced

    As we're moving off OCaml at dialo, we'd = like to donate the libraries we built to people who will properly maintain = them. We built a highly performant telephony system using OCaml, but as a s= mall team we ended up maintaining too much software for our liking.

    We initially built a SIP server implementation in OCaml, which was a perfec= t fit. We needed to connect it to the rest of our system in a language agno= stic way. We chose gRPC and that's where things got difficult.

    At a smaller scale our own buggy implementation of gRPC on top of h2 was good enough. Then we= started scaling and at the same time transitioned to OCaml 5.0. The combin= ation of those factors resulted in:

    1. Performance regressions in 5.0 related to memory management, both insid= e of app code, SIP stack, and inside of h2.
    2. We needed a more robust implementation of gRPC to handle errors and edg= e cases better.

    Long story short we ended up:

    1. Writing our own implementation of http2
    2. Rewriting the gRPC library exclusively for eio to limit the scope toget= her with decent codegen and robust

    Then, in late 2025, we had to add new features to the SIP server and someth= ing inside us just broke. The SIP server had accumulated quite a bit of leg= acy code over 3.5 years, so we wanted to rewrite some parts. We were extrem= ely excited to build the new architecture centered around effects — <= a href=3D"https://discuss.ocaml.org/t/effect-composability-actual-callstack= -vs-syntactic-scope/17536">only to discover that user-space effects and con= currency libraries don't really work well together, since callbacks los= e their scope (duh). That was the final straw.

    We decided to run two 1-week stints to try rewriting the service in Rust an= d Go. We ended up choosing Rust. We still miss OCaml, but not having to imp= lement and maintain our own http2/grpc/sip stack is a breath of fresh air.

    So here we are — we're gradually removing OCaml from our stack, and t= hat's why we'd like to donate:

    • ocaml-grpc= - the new code is on dialo branch, eio only at the moment= , battle tested on production. It does have some bugs in it but few and it'= s pretty solid.
    • haha (http2) - overall = good but could be better. We cancel fibers too often, it's a very low hangi= ng fruit to make it much faster.
    • Our SIP stack — this is currently not open source, but we're happ= y to share the source code with the right person or team.

    Please write dms to me and feel free to ask me or @adamchol about specifics.

    ppx_mixins: slightly more elegant mixin syntax

    Sacha Ayoun announced

    Hello,

    I've written a tiny ppx called ppx_mixins so that one can write:

    type u=
     [@@mixins Map.OrderedType + Printab=
    le]
    

    which gets desugared to

    type u=
    
    include Map.OrderedType with type t :=3D u
    include Printable with type t :=3D u
    

    Not much but increases readability in a codebase that uses the "mixin" patt= ern a lot

    Constructing type signatures

    In the upcoming release, one can also write

    module type M =3D [%mixins Map.<=
    /span>OrderedType + Printable]
    (* desugars to *)
    module type M =3D sig=20
       type t=20
       include Map.OrderedType with type t :=3D t
       include Printable with type t :=3D t
    end
    

    Additional features

    One can also override other types, e.g.

    type u=
     [@@mixins Mappable(key =3D int; val=
    ue :=3D v)]
    (* desugars to *)
    type u
    include Mappable with type t :=3D u and type key =3D int and type va=
    lue :=3D v
    

    Limitations

    • No support for parametric types, e.g. with type 'a u =3D 'a v
    • No support for tuple and function types, e.g. with type t =3D int= -> bool

    This is because the preprocessor parses the payload as an expression, and t= hese don't parse nicely a expressions. Deeper support (e.g. for mixins with type parameters) would probably also r= equire language support.

    Experience Report: Refining Dune=E2=80=99s Dependency Graph

    Robin Bate Boerop announced

    Refining Dune's Dependency Graph: Per-Module Library Filtering

    I've been working on improving Dune's inter-library dependency tracking, an= d wanted to share the experience — both the technical details and wha= t it's like as a first-time contributor to this large open source OCaml pro= ject.

    The Problem I Took On

    When libA depends on libB, Dune gives every modul= e in libA a glob dependency on all .cmi fi= les in libB. If any .cmi in libB cha= nges, every module in libA is recompiled — even modules = that never reference libB.

    For projects with many libraries, this creates a cascade of unnecessary rec= ompilations. The issue that tracks this matter #4572 has been open since 2021.

    My Approach

    Dune already runs ocamldep to compute intra-library module dep= endencies. The key insight: that same output tells us which libraries each module references, via their entry module names. We can use this to = filter both the build dependencies and the -I~/-H~ compiler fl= ags per-module.

    The implementation (PR= #14116 and PR #14= 186) works as follows:

    1. For each module and its transitive intra-library dependencies, read the= ocamldep output (both .ml and .mli)=
    2. Union all referenced module names, including -open flags
    3. Map those names to libraries via a Lib_index
    4. Transitively close the filtered library set via Lib.closure
    5. Use the result for both hidden deps and -I~/-H~ compiler f= lags, partitioning into direct (visible via -I) and hidden (vi= a -H) based on requires_compile membership

    With both deps and flags filtered, a clean build will fail if a module refe= rences a library it doesn't declare — previously, overly-broad = -I flags could mask such errors.

    A False Start

    My first attempt (PR #= 14021) tried to implement the filtering in a single PR without sufficie= nt test coverage. It was closed after review revealed that the approach was= fragile in edge cases I hadn't anticipated — particularly around tra= nsparent module aliases and virtual libraries.

    Challenges

    Transparent module aliases. OCaml's module alias mechanism means ocamldep doesn't always report all libraries a module transitivel= y depends on. If libB has module M =3D LibC.Something, and a module in libA uses LibB.M, oca= mldep reports LibB but not LibC. The fix: = transitively close the filtered library set using Lib.closure,= bounded by the compilation context.

    Root modules. The (root_module) stanza creates a module= that implicitly aliases all libraries in the compilation context. When ocamldep reports a reference to a root module, we can't determine= which underlying libraries are actually needed, so we fall back to the ful= l dependency set.

    Virtual libraries. When virtual library implementations are present = in the compilation context, parameter libraries may not appear in req= uires_compile, so filtering could miss them. Another fallback case.

    Menhir-generated modules. These mock modules aren't in the oca= mldep dependency graph, so we skip filtering for them.

    Null build overhead. The filtering reads .d files and c= omputes library closures per-module. On a fresh dune process (= no memo cache), this is new work on every build — including null buil= ds where nothing changed. This is a real trade-off: better incremental rebu= ild performance at the cost of some null-build overhead.

    Prerequisite Test PRs

    Before the implementation PRs, I submitted six test-only PRs to document ex= isting behavior and establish a safety net:

    • #14017 —= Baseline tests documenting current inter-library recompilation behavior
    • #14031 —= Test documenting module name shadowing between stanzas and libraries
    • #14100 —= Test verifying library file deps in compilation rules and sandboxed builds=
    • #14101 —= Test verifying transparent alias incremental build safety
    • #14129 —= Test verifying incremental builds with alias re-exported libraries
    • #14178 —= Test documenting ocamldep behavior with transparent alias cha= ins

    This made the implementation PRs' diffs focused on the actual change, and g= ave reviewers confidence that existing behavior was preserved. It also help= ed me understand the edge cases that tripped up my first attempt.

    The Review Process

    The Dune maintainers (@rgrinberg and @art-w) provided thorough, = constructive reviews. Some highlights:

    • Replacing my hand-rolled transitive closure with Lib.closure from the existing library — a cleaner approach I wouldn't have fou= nd without familiarity with Dune's internals
    • Identifying that both .ml and .mli ocamldep o= utput need to be read, since the interface can reference different librarie= s than the implementation
    • Suggesting per-module -I~/-H~ flag filtering, which makes = clean builds more precise and improves caching
    • Questioning every fallback case and special-cased module kind, leading = to simpler code

    The PRs went through significant refactoring during review — the fina= l versions are substantially tighter than the initial submissions.

    What Could Be Better

    Working on this was a positive experience overall, but a few things created= friction:

    No way to benchmark before merging. The null-build overhead question= came up late in the process. I discovered through manual benchmarking that= the change added \~70% to null build time — a significant regression= . Dune's benchmark CI workflow runs only on pushes to main, not on PRs. Con= tributor-accessible performance tooling would help catch regressions before= they land.

    Review momentum vs. rebasing. The test PRs merged quickly, but the i= mplementation PR required multiple rounds of review over days. Between roun= ds, main moves forward, requiring rebases that risk introducing conflicts. = The contributor carries the burden of keeping branches fresh. This is compo= unded when PRs depend on each other — every rebase of #14116 required= rebasing #14186 as well. GitHub has no first-class support for PR stacks, = so this is manual and error-prone. Of course, all GitHub-hosted repos suffe= r from this.

    Flaky CI. Many CI runs had errors that were not related to my code. = It was often an upstream provider of an OCaml package that was unreachable = or faulty (temporarily). These problems often resolved themselves, but caus= ed day-long delays in the PR lifetimes. The problem stems from the setup co= de that is run and re-run over and over in CI jobs.

    Reflections

    The Dune codebase is well-structured, with clear separation between the bui= ld engine, rule generation, and scheduler. It is also of good quality, maki= ng it feel like time spent on keeping the quality high is worthwhile.

    I found the cram test infrastructure good for testing. Each test scenario i= s a self-contained shell script with expected output, making it easy to doc= ument and verify exact recompilation behavior. It inspires confidence in th= e code.

    The maintainers have been responsive and the review process, while slowed b= y thoroughness, is collaborative and professional. Thank you, maintainers!

    Steffen Smolka then replied

    GitHub has no first-class support for PR stacks

    It does now: https://github= .github.com/gh-stack/

    First beta release of OCaml 5.5.0

    octachron announced

    With most developer tools available and the good stability of the compiler,= I am happy to announce the first beta release of OCaml 5.5.0.

    Compared to the last alpha, this new version improves the manpage for ocamlopt and fixes:

    • two runtime bugs (for ephemerons and the bytecode interpreter)
    • two type system bugs (for classes and module-dependent functions)
    • three warning or error message bugs

    (See the Changelog below for a full list).

    Concerning the associated compiler tools, most of them are already available (as least in a preview version), and there are patches in progress for the remaining ones. You can track the last remaining update efforts on the release readiness meta-issue.

    Thus, it should be safe to test your libraries and programs with the new version OCaml 5.5.0 version in preparation of the final release. If everything goes well, we might see a release in May.

    If you find any bugs, please report them to the GitHub issue tracker.

    If you are interested by the full list of new features and bug fixes, the changelog for O= Caml 5.5.0 is the most up-to-date resource.

    Happy hacking, Florian Angeletti for the OCaml team.

    Installation Instructions

    The base compiler can be installed as an opam switch with the following com= mands on opam 2.1 and later:

    opam update
    opam switch create 5.5.0~beta1
    

    The source code for the beta is also available at these addresses:

    Fine-Tuned Compiler Configuration

    If you want to tweak the configuration of the compiler, you can switch to t= he option variant with:

    opam update
    opam switch create <switch_name> ocaml-variants.5.5.0~beta1+options &=
    lt;option_list>
    

    where option_list is a space separated list of ocaml-opt= ion-* packages. For instance, for a flambda and no-flat-float-array = switch:

    opam switch create 5.5.0~beta1+flambda+nffa ocaml-variants.5.5.0~beta1+opti=
    ons ocaml-option-flambda ocaml-option-no-flat-float-array
    

    All available options can be listed with opam search ocaml-option.

    Changes compared to the last alpha

    • Documentation update
      • #14684: Imp= rove ocamlopt's manual page (Samuel Hym, review by Florian Angeletti)
    • Runtime fixes
      • #14644, #14647: Fix a bug = related to unhandled effects in bytecode. (Vincent Laviron, report by Thibaut Mattio, review by Nicol=C3=A1s Ojeda B=C3=A4r, Stephen Dolan and Olivier Nicole)
      • #14349, #14718: runtime, f= ix in the orphaning of ephemerons (Gabriel Scherer, review by Olivier Nicole and Damien Doligez, report by Jan Midtgaard)
    • Type system fixes
      • #14557, #12150, #14696: ensure that the s= elf type of class cannot escape through type constraints. (Leo White, review by Florian Angeletti)
      • #14667: ena= ble application related warnings for module-dependent functions (Florian Angeletti, review by Gabriel Scherer)
    • Error messages and warning fixes
      • #14690: Fix= Name_type_mismatch error message when the expected type is an alias: print the expanded path on the right-hand side of the equality, not the alias twice. (Weixie Cui, review by Florian Angeletti)
      • #14719, #14721: compute ar= ity correctly for module-dependent function (Florian Angeletti, report by Jeremy Yallop, review by Stefan Muenzel)
      • #14655, #14691: check for = size overflow in caml_ba_reshape (Stephen Dolan, review by Xavier Leroy)

    ocgtk 0.1: OCaml bindings for GTK 4 (preview release)

    Continuing this thread, Chris Armstrong announced

    ocgtk preview1 release has landed in opam.

    (preview0 was abandoned as considerable work was required to get it buildin= g on other Linux distributions and Mac). A special thanks to @jmid for help= ing me get it over the line.

    In addition to the features above, it includes:

    • Extended support for more GLib types, including integer primitives (gui= nt8, int16, guint32, etc) and lists (GLib.SList and GLib.List)
    • Gobject interfaces

    The combination of the above enables more methods to be generated (that wer= e previously excluded) when they include those types in their parameters an= d/or return types, opening up much more of the API surface of GTK (and rel= ated libraries).

    Next steps: my focus now is on internal cleanup and reorganisation t= o better structure the tests and split gir_gen (the GObject code generator)= into a seperate dune project. This will reduce the dependency list conside= rably and enable targeting earlier OCaml versions, as well as reducing rele= ase headaches related to gir_gen (which is not required by packages just us= ing ocgtk)

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmnnRJ0bFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5ceTXggAzTQNhx7nmxq8aUT1xY5MQIbgU48FeoBPoZwxLzLB K7Y4VPaNOaAZCH8zFVpErg2m2rBdNE86OEQ6bcBFoDz2E5F9HJiKCmXFt9d0ergD vLM0KJueY8r0DBGv6WlQ//DiQghMxzRPil8x8TVwWKHJQ2qTGsruolRP8FgHirrI jht4Pwu//TBbyzrMqiXEXrRjG6abNuVOwnoe/TdXYYA1Sp8SOS6r921vDOTy51Xh ctJlJvPHPDjW2QArY8+krd6ETmiZP3sv685y7NtLtBqG99blUge9vb9hvvCGcq2s 47ddRAjeNiwLSUhvSon35uFLdKoC47phYV1VDm0ttbd19w== =Wn1s -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=Z6UhsGLM; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 10B164009B for ; Tue, 28 Apr 2026 07:59:53 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=xLEloXjMUR0CnJLzlpmOr9LftHmXaznXEsqqpugYYvQ=; b=Z6UhsGLMmEhVDPYzwELxboGsWRA+gpcxae7vsB7KFzFixXB9i2Kz414e jwYJyrXma8tTFqdKwgMJGTqKKlvqrg5T4ojQ7gvXgait2yd9e6Me7sjM+ RHQDRBxNxf16ljc4ggZnjJQ01zcIu2gHf0GUjK2RnzfOuWeXqoAeIHrNV 0=; X-CSE-ConnectionGUID: Ux/2KVHWRNOzriFkizk3vA== X-CSE-MsgGUID: Bnk/FRtlQ5OLF6TuPhRtPA== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,203,1770591600"; d="asc'?scan'208,217";a="274375926" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 28 Apr 2026 09:59:51 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 14AB982966; Tue, 28 Apr 2026 09:59:51 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 00B3C80697 for ; Tue, 28 Apr 2026 09:59:41 +0200 (CEST) X-CSE-ConnectionGUID: rsqWR2a+Q+6S/ZLdqH4aEw== X-CSE-MsgGUID: ZzAbVxE0SnKVWjxZohmHcg== IronPort-SDR: 69f068ec_GO7PIdC5rEtLC0Ps45W7Md2AaX8+YfLOiZSSchQLYaCVaux xvSOsGxVEkpube4HfwhvrrOkWZJTBZowT+nXrgw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0E9AgC7aPBpjyIeaIFaEwEBhAGBBBoBbF8ZGgcISYRYg?= =?us-ascii?q?0+OJYEWkDeKew2DHiECDgcBAwEIBS4BGwQBAgQBAQEBAQECAYQ5RgIWjRwCH?= =?us-ascii?q?wYBBDQTAQIEAQEBAQMCAwEBAQEBAQEBAQEBCwEBAQQBAQECAQECBAMBAQEBA?= =?us-ascii?q?hABAQEBAQE5BUmGTw2CRVFxgSUBAQEBAQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQECBAgBKVkcAQIGBAYTAQE4GBQPAxQBBgMCBA0BN?= =?us-ascii?q?QMUARIUBoJoAYIiAk8DBQwGnCebRHp/M4EBggwBAQaBCD4DCwICAwEOCSUB2?= =?us-ascii?q?hOBXgkJgU2BWIQagkoPDQEqSWoCAYRRCYQ2Jw+BVUSBFTWCPQdvgkoXAQEBA?= =?us-ascii?q?RiBJAEBTQmDJYJpgiaBDoF+gQYSgW9zBRswgQABZYZCgkIsAVUTFwsHBV6BC?= =?us-ascii?q?AMqLy1uMh2BIz4XNFgbBwWBS4MegVeBBoRgeCMsAxsDC209NxQbiSQQIQ2BJ?= =?us-ascii?q?EQZHg+BTBUOCxQbBA8RHhsBCAMXDgUBBwIBCQgOAiACLggIKgcMAxAEDiMDC?= =?us-ascii?q?xEEDQsSCyEckmkSAgKBIbFgNAeEH4FeBgyJCIEmlgeEBIFXkj6SUiKYZCKCN?= =?us-ascii?q?ocogSYJgg5MlTQsE4VFgX8jgVwzGjBDgjMBMwlHHA+SI4E+gSaBI1E7wVlBN?= =?us-ascii?q?QIBAQc0BwIHDgKFawEBjAgtBYFLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23: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 IronPort-HdrOrdr: A9a23:ATU/3KP/NZ7gDMBcTv6jsMiBIKoaSvp037BL7TESdfUxSKb0qy nAppUmPHPP5Ar5O0tQ+uxoWpPhfZq0z/ccirX5Vo3NYOCJggSVBbAnxbSn6TztES/z+4dmpM JdWpk7Lsb/SXxzjcOS2njeLz/M+qjizJyV X-Talos-CUID: =?us-ascii?q?9a23=3AqHB5eWt01qZVHBGMA5a6kHFA6Is/aWTi9i3ZYHb?= =?us-ascii?q?7V10uepmZUH/M8Y57xp8=3D?= X-Talos-MUID: 9a23:ZSnU7gTQUd+qGoq/RXTelhhoCtdFu5+oK34yk4U0vMmBFSd/bmI= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,203,1770591600"; d="asc'?scan'208,217";a="274375802" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDHxMLD1kYeCEldqyv05upBo9k51sZqtMWIXyW?= =?us-ascii?q?xAyXVSfXJNKjUHnUHkAzx0tlZ0m3tUcKXa0zKFh4ErkG0Bli4N5DkKps?= =?us-ascii?q?FICMpnptUzh1427QLOhXSELk6Vee7myezcK5OjA16O6oc+muh6LnGILO?= =?us-ascii?q?FWCBUIqxTZjYrCSiUVidOjRA=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Apr 2026 09:59:40 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id ECE4A1A428; Tue, 28 Apr 2026 09:59:31 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 28 Apr 2026 09:59:30 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue Apr 28 09:59:35 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.499744, queueID=BDBB21A384 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19498 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjEgdG8gMjgsDQoyMDI2Lg0KDQpUYWJsZSBvZiBDb250ZW50cw0K4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCkNsb3Npbmcg T2xkIEJ1Z3MgV2l0aCBUZXN0czogQSBEdW5lIENvbnRyaWJ1dGlvbiBTdG9yeQ0Kb2NhbWwtd2ly ZTogYSBCaW5hcnkgd2lyZSBmb3JtYXQgRFNMIHdpdGggRXZlclBhcnNlIDNEIG91dHB1dA0KdmFs a2V5OiBtb2Rlcm4gVmFsa2V5IGNsaWVudCBmb3IgT0NhbWwgNSArIEVpbywgb24gb3BhbQ0KVW5p ZmllZFNjcmlwdF97U3RkLFRvcH0gLSBsaXRlcmF0ZSB0ZXN0aW5nDQpvcGVucm91dGVyX2FwaTog QW4gT3BlblJvdXRlciBjbGllbnQgbGlicmFyeQ0KQ2FsbCBmb3IgcHJlc2VudGF0aW9uczogQ2Ft bCBpbiB0aGUgQ2FwaXRhbCBJSQ0KT2xkIENXTg0KDQoNCkNsb3NpbmcgT2xkIEJ1Z3MgV2l0aCBU ZXN0czogQSBEdW5lIENvbnRyaWJ1dGlvbiBTdG9yeQ0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vz cy5vY2FtbC5vcmcvdC9jbG9zaW5nLW9sZC1idWdzLXdpdGgtdGVzdHMtYS1kdW5lLWNvbnRyaWJ1 dGlvbi1zdG9yeS8xODAwOC8xPg0KDQoNClJvYmluIEJhdGUgQm9lcm9wIGFubm91bmNlZA0K4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSSByZWNlbnRseSBzdGFydGVkIGNvbnRyaWJ1dGlu ZyB0byBEdW5lIHdpdGggbm8gcHJpb3IgZmFtaWxpYXJpdHkgd2l0aA0KICB0aGUgY29kZSBiYXNl LiBPbmUgdGhpbmcgSSBmb3VuZCByZXdhcmRpbmcgd2FzIGNsb3Npbmcgb2xkIGlzc3VlcyDigJQN CiAgc29tZSBmaWxlZCBhcyBmYXIgYmFjayBhcyAyMDE4IOKAlCBhbmQgSSB3YW50ZWQgdG8gc2hh cmUgdGhlIGFwcHJvYWNoIEkNCiAgdXNlZC4NCg0KDQpUaGUgTWV0aG9kOiBDbG9zZSBXaXRoIGEg VGVzdA0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgTWFueSBvcGVuIGlzc3Vl cyBkZXNjcmliZSBiZWhhdmlvdXIgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGZpeGVkLCBvcg0KICBi ZWhhdmlvdXIgdGhhdCBpcyB3b3JraW5nIGNvcnJlY3RseSBidXQgd2FzIG5ldmVyIHZlcmlmaWVk IHdpdGggYQ0KICB0ZXN0LiBNeSBhcHByb2FjaDogd3JpdGUgYSBjcmFtIHRlc3QgdGhhdCBkZW1v bnN0cmF0ZXMgdGhlIGV4cGVjdGVkDQogIGJlaGF2aW91ciwgbGluayB0aGUgUFIgdG8gdGhlIGlz c3VlIHdpdGggYGZpeGVzICNOTk5OJywgYW5kIGxldCB0aGUNCiAgbWVyZ2UgY2xvc2UgdGhlIGlz c3VlIGF1dG9tYXRpY2FsbHkuDQoNCiAgVGhpcyBoYXMgc2V2ZXJhbCBhZHZhbnRhZ2VzIG92ZXIg c2ltcGx5IGNsb3NpbmcgYW4gaXNzdWUgd2l0aCBhDQogIGNvbW1lbnQgbGlrZSAidGhpcyB3b3Jr cyBub3ciOg0KDQogIOKAoiAqSXQncyB2ZXJpZmlhYmxlLiogQW55b25lIGNhbiByZWFkIHRoZSB0 ZXN0IGFuZCBzZWUgZXhhY3RseSB3aGF0DQogICAgIGJlaGF2aW91ciBpcyBiZWluZyBhc3NlcnRl ZC4gVGhlcmUncyBubyBhcmd1bWVudCBhYm91dCB3aGV0aGVyIHRoZQ0KICAgICBpc3N1ZSBpcyB0 cnVseSByZXNvbHZlZC4NCiAg4oCiICpJdCBwcmV2ZW50cyByZWdyZXNzaW9ucy4qIElmIHRoZSBi ZWhhdmlvdXIgYnJlYWtzIGFnYWluIGluIHRoZQ0KICAgICBmdXR1cmUsIHRoZSB0ZXN0IGZhaWxz LiBUaGUgaXNzdWUgZG9lc24ndCBzaWxlbnRseSByZW9wZW4g4oCUIHRoZSBDSQ0KICAgICBjYXRj aGVzIGl0Lg0KICDigKIgKkl0IGdyb3dzIHRoZSB0ZXN0IHN1aXRlLiogRXZlcnkgY2xvc2VkIGlz c3VlIGxlYXZlcyBiZWhpbmQgYSB0ZXN0DQogICAgIHRoYXQgZG9jdW1lbnRzIGEgcmVhbC13b3Js ZCBzY2VuYXJpbyBzb21lb25lIGNhcmVkIGFib3V0Lg0KICDigKIgKkl0IHJlc3BlY3RzIHRoZSBy ZXBvcnRlci4qIFNvbWVvbmUgdG9vayB0aGUgdGltZSB0byBmaWxlIHRoZQ0KICAgICBpc3N1ZS4g QSB0ZXN0IHRoYXQgY2FwdHVyZXMgdGhlaXIgY29uY2VybiBpcyBhIGJldHRlcg0KICAgICBhY2tu b3dsZWRnZW1lbnQgdGhhbiBhIGRyaXZlLWJ5IGNsb3NlLg0KDQogIEFmdGVyIGEgZmV3IHdlZWtz IG9mIGNvbnRyaWJ1dGluZyB0ZXN0IFBScyBhbmQgYnVnIGZpeGVzLCBJIHdhcyBnaXZlbg0KICB0 cmlhZ2VyIGFuZCB0aGVuIG1haW50YWluZXIgc3RhdHVzIG9uIHRoZSBwcm9qZWN0LiBUaGlzIGxl dCBtZSBjbG9zZQ0KICBpc3N1ZXMgZGlyZWN0bHkgd2hlbiB0aGV5IHdlcmUgY2xlYXJseSByZXNv bHZlZCwgYW5kIG1lcmdlIG15IG93biB0ZXN0DQogIFBScy4gQmVmb3JlIHRoYXQsIHRoZSBleGlz dGluZyBtYWludGFpbmVycyBtZXJnZWQgdGhlbSBvbiBteSBiZWhhbGYuDQoNCiAgSG9uZXN0bHks IEkgcmVncmV0IGNsb3NpbmcgaXNzdWVzIHdoZXJlIEkgY291bGQgaGF2ZSB1c2VkIHRoaXMgbWV0 aG9kDQogIGJ1dCBkaWRuJ3QuIFRoZSBtZXRob2QgaXMgbXVjaCBzdXBlcmlvciB0byBzaW1wbHkg YWRkaW5nIHRvIGEgR2l0SHViDQogIGRpc2N1c3Npb24gYWJvdXQgdGhlIGJ1ZyBhbmQgdGhlbiBj bG9zaW5nIHRoZSBpc3N1ZS4NCg0KDQpJc3N1ZXMgSSBIZWxwZWQgQ2xvc2UNCuKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQog IEhlcmUncyBhbiBhY2NvdW50aW5nIG9mIHdoYXQgSSBoZWxwZWQgY2xvc2UsIGdyb3VwZWQgYnkg d2hhdCBpdCB0b29rOg0KDQoNCuKXiiBDb25maXJtZWQgcmVzb2x2ZWQ7IGNsb3NlZCBkaXJlY3Rs eQ0KDQogIFRoZXNlIGlzc3VlcyBkZXNjcmliZWQgcHJvYmxlbXMgdGhhdCBubyBsb25nZXIgZXhp c3RlZCBvbiBtYWluLiBJbg0KICBzb21lIGNhc2VzIEkgY29uZmlybWVkIHRoaXMgbXlzZWxmLCBp biBvdGhlcnMgc29tZW9uZSBlbHNlIGhhZCBhbHJlYWR5DQogIHZlcmlmaWVkIGl0LiBBcyBhIHRy aWFnZXIvbWFpbnRhaW5lciBJIHdhcyBhYmxlIHRvIGNsb3NlIHRoZW06DQoNCiAg4oCiIFsjMTk3 NF0g4oCUIGBAYWxsJyB0YXJnZXQgZG9lc24ndCBpbnRlcmFjdCB3ZWxsIHdpdGggYChpbmNsdWRl X3N1YmRpcnMNCiAgICAuLi4pJyAoZmlsZWQgMjAxOSkNCiAg4oCiIFsjMzE3M10g4oCUIENhbid0 IHByb21vdGUgaW50byBhIGRpcmVjdG9yeSBzdGFydGluZyB3aXRoIHVuZGVyc2NvcmUNCiAgICAo ZmlsZWQgMjAyMCkNCiAg4oCiIFsjMzgwNV0g4oCUIE5vIHN1Y2ggZmlsZSBvciBkaXJlY3Rvcnkg d2hlbiBgRFVORV9CVUlMRF9ESVInIGlzIHNldA0KICAgIGR1cmluZyB0ZXN0IChmaWxlZCAyMDIw KQ0KICDigKIgWyM4MjQyXSDigJQgVmVyeSBzbG93IGVtYWNzIGNvbXBpbGF0aW9uIGJ1ZmZlciB1 cGRhdGVzIChmaWxlZCAyMDIzKQ0KICDigKIgWyMxMDM2MF0g4oCUIGBleGVjdXRhYmxlc19pbXBs aWNpdF9lbXB0eV9pbnRmJyBleHBlY3RzIGR1bmUgPj0gMi45IGJ1dA0KICAgIHdhcyBvbmx5IGFk ZGVkIGluIDMuMCAoZmlsZWQgMjAyNCkNCg0KDQogIFsjMTk3NF0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL2lzc3Vlcy8xOTc0Pg0KDQogIFsjMzE3M10gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL2lzc3Vlcy8zMTczPg0KDQogIFsjMzgwNV0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL2lzc3Vlcy8zODA1Pg0KDQogIFsjODI0Ml0gPGh0dHBzOi8vZ2l0aHViLmNv bS9vY2FtbC9kdW5lL2lzc3Vlcy84MjQyPg0KDQogIFsjMTAzNjBdIDxodHRwczovL2dpdGh1Yi5j b20vb2NhbWwvZHVuZS9pc3N1ZXMvMTAzNjA+DQoNCg0K4peKIENsb3NlZCB3aXRoIGEgdGVzdCBQ Ug0KDQogIFRoZXNlIGlzc3VlcyB3ZXJlIHJlc29sdmVkIGJ5IHdyaXRpbmcgYSB0ZXN0IHRoYXQg ZGVtb25zdHJhdGVzIHRoZQ0KICBjb3JyZWN0IGJlaGF2aW91ci4gTm8gY29kZSBjaGFuZ2VzIHdl cmUgbmVlZGVkIOKAlCB0aGUgdGVzdCBpdHNlbGYNCiAgY2xvc2VkIHRoZSBpc3N1ZToNCg0KICDi gKIgWyMyMzcwXSDigJQgYC5oJyBmaWxlcyBjb3BpZWQgdG8gYF9idWlsZCcgd2l0aG91dCBmb3Jl aWduIHN0dWJzIChmaWxlZA0KICAgIDIwMTksIHRlc3Q6IFsjMTQxNzJdKQ0KICDigKIgWyMzMzYy XSDigJQgQ2Fubm90IHVzZSBgJXtsaWI6Li4ufScgaW4gdGhlIGBmbGFncycgc3RhbnphIChmaWxl ZCAyMDIwLA0KICAgIHRlc3Q6IFsjMTQxNDZdKQ0KICDigKIgWyMzNDg0XSDigJQgUHJvbW90aW5n IG92ZXIgYSBydW5uaW5nIGJpbmFyeSAoZmlsZWQgMjAyMCwgdGVzdDoNCiAgICBbIzE0MTczXSkN CiAg4oCiIFsjMTExMTBdIOKAlCBMaWJleGVjIHNpdGUgaW5zdGFsbCBkb2Vzbid0IHNldCBleGVj dXRhYmxlIGJpdCAoZmlsZWQNCiAgICAyMDI0LCB0ZXN0OiBbIzE0MTcxXSkNCg0KDQogIFsjMjM3 MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy8yMzcwPg0KDQogIFsjMTQx NzJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzE0MTcyPg0KDQogIFsjMzM2 Ml0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy8zMzYyPg0KDQogIFsjMTQx NDZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzE0MTQ2Pg0KDQogIFsjMzQ4 NF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL2lzc3Vlcy8zNDg0Pg0KDQogIFsjMTQx NzNdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9wdWxsLzE0MTczPg0KDQogIFsjMTEx MTBdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1ZXMvMTExMTA+DQoNCiAgWyMx NDE3MV0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5lL3B1bGwvMTQxNzE+DQoNCg0K4peK IENsb3NlZCB3aXRoIGEgdGVzdCBhbmQgYSBjb2RlIGZpeA0KDQogIFRoZXNlIHJlcXVpcmVkIGJv dGggYSB0ZXN0IGFuZCBhIGNvZGUgY2hhbmdlIHRvIHJlc29sdmU6DQoNCiAg4oCiIFsjODc4XSDi gJQgYGR1bmUgc3Vic3QnIGFkZHMgZHVwbGljYXRlIHZlcnNpb24gZmllbGQgaW4gb3BhbSAoZmls ZWQNCiAgICAyMDE4LCBmaXg6IFsjMTQxMzZdKQ0KICDigKIgWyMyNDQ1XSDigJQgZHVuZSBzZW5k cyBTSUdLSUxMIHdpdGhvdXQgcHJpb3IgU0lHVEVSTSAoZmlsZWQgMjAxOSwNCiAgICBmaXhlczog WyMxNDE3MF0sIFsjMTQyMjRdKQ0KICDigKIgWyMzOTE2XSDigJQgRHVwbGljYXRlIGJvdW5kcyBp biBhdXRvZ2VuZXJhdGVkIG9wYW0gZmlsZXMgKGZpbGVkIDIwMjAsDQogICAgZml4OiBbIzE0MTc1 XSkNCiAg4oCiIFsjNjE0OF0g4oCUIGByb290X21vZHVsZScgZ2VuZXJhdGVzIGR1cGxpY2F0ZSBt b2R1bGUgZGVmaW5pdGlvbiAoZmlsZWQNCiAgICAyMDIyLCBmaXg6IFsjMTQxMzVdKQ0KICDigKIg WyM5NzU3XSDigJQgYGR1bmUgcnVudGVzdCcgZG9lc24ndCBleGVjdXRlIGJ5dGUtb25seSBpbmxp bmUgdGVzdHMNCiAgICAoZmlsZWQgMjAyNCwgZml4OiBbIzE0MTc0XSkNCiAg4oCiIFsjMTA3MDdd IOKAlCBNaXNzaW5nIG1lbmhpciBsb3dlciBib3VuZCBpbiBnZW5lcmF0ZWQgb3BhbSBmaWxlcyAo ZmlsZWQNCiAgICAyMDI0LCBmaXg6IFsjMTQxNjhdKQ0KICDigKIgWyMxMTAwMl0g4oCUIG9wYW0g ZmlsZSBnZW5lcmF0aW9uIGVycm9yLXByb25lIChmaWxlZCAyMDI0LCBmaXg6DQogICAgWyMxNDEz Nl0pDQogIOKAoiBbIzExMTA2XSDigJQgUmVkdW5kYW50IGR1bmUgdmVyc2lvbiBjb25zdHJhaW50 IGluIG9wYW0gZmlsZXMgKGZpbGVkDQogICAgMjAyNCwgZml4OiBbIzE0MTc1XSkNCiAg4oCiIFsj MTIwMDddIOKAlCBgZHVuZSBidWlsZCBAb2NhbWwtaW5kZXgnIGJ1aWxkcyB0b28gbWFueSBmaWxl cyAoZmlsZWQNCiAgICAyMDI1LCBwYXJ0aWFsbHkgZml4ZWQgd2l0aCBbIzE0MTM3XSkNCiAg4oCi IFsjMTQwODldIOKAlCBJbmNyZW1lbnRhbCBidWlsZHMgd2l0aCBgKHdyYXBwZWQgKHRyYW5zaXRp b24gLi4uKSknDQogICAgYnJva2VuIChmaWxlZCAyMDI2LCB0ZXN0OiBbIzE0MDg4XSwgZml4OiBb IzE0MDkwXSkNCg0KDQogIFsjODc4XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNz dWVzLzg3OD4NCg0KICBbIzE0MTM2XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDEzNj4NCg0KICBbIzI0NDVdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1 ZXMvMjQ0NT4NCg0KICBbIzE0MTcwXSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDE3MD4NCg0KICBbIzE0MjI0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDIyND4NCg0KICBbIzM5MTZdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1 ZXMvMzkxNj4NCg0KICBbIzE0MTc1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDE3NT4NCg0KICBbIzYxNDhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1 ZXMvNjE0OD4NCg0KICBbIzE0MTM1XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDEzNT4NCg0KICBbIzk3NTddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1 ZXMvOTc1Nz4NCg0KICBbIzE0MTc0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVs bC8xNDE3ND4NCg0KICBbIzEwNzA3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvaXNz dWVzLzEwNzA3Pg0KDQogIFsjMTQxNjhdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9w dWxsLzE0MTY4Pg0KDQogIFsjMTEwMDJdIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwvZHVuZS9p c3N1ZXMvMTEwMDI+DQoNCiAgWyMxMTEwNl0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2FtbC9kdW5l L2lzc3Vlcy8xMTEwNj4NCg0KICBbIzEyMDA3XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1 bmUvaXNzdWVzLzEyMDA3Pg0KDQogIFsjMTQxMzddIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9wdWxsLzE0MTM3Pg0KDQogIFsjMTQwODldIDxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9pc3N1ZXMvMTQwODk+DQoNCiAgWyMxNDA4OF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9kdW5lL3B1bGwvMTQwODg+DQoNCiAgWyMxNDA5MF0gPGh0dHBzOi8vZ2l0aHViLmNvbS9vY2Ft bC9kdW5lL3B1bGwvMTQwOTA+DQoNCg0KV2hhdCBJIExlYXJuZWQNCuKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogICpXcml0aW5nIHRlc3RzIGlzIGEgZ29vZCB3 YXkgdG8gbGVhcm4gYWJvdXQgYSBjb2RlIGJhc2UuKiBFYWNoIHRlc3QNCiAgIGZvcmNlZCBtZSB0 byB1bmRlcnN0YW5kIGhvdyBhIGZlYXR1cmUgYWN0dWFsbHkgd29ya3Mg4oCUIG5vdCB0aGUNCiAg IGFyY2hpdGVjdHVyZSBpbiB0aGUgYWJzdHJhY3QsIGJ1dCB0aGUgY29uY3JldGUgYmVoYXZpb3Vy IGluIHNwZWNpZmljDQogICBzY2VuYXJpb3MuIFRoZSB1bmRlcnN0YW5kaW5nIGNvbXBvdW5kZWQu DQoNCiAgKkR1bmUncyBjcmFtIHRlc3RzIG1ha2UgdGhpcyBlYXN5LiogRWFjaCB0ZXN0IGlzIGEg c2VsZi1jb250YWluZWQNCiAgIHNoZWxsIHNjcmlwdCB3aXRoIGV4cGVjdGVkIG91dHB1dCwgY2hl Y2tlZCBpbnRvIHRoZSByZXBvIGFzIGEgYC50Jw0KICAgZmlsZS4gVGhlIGJhcnJpZXIgdG8gd3Jp dGluZyBhIHRlc3QgaXMgbG93LCB3aGljaCBpcyBleGFjdGx5IHdoYXQgeW91DQogICB3YW50IHdo ZW4geW91ciBnb2FsIGlzIHRvIGNsb3NlIGlzc3VlcyBieSB0ZXN0aW5nIHRoZW0uIFRoaXMNCiAg IG9jY2FzaW9uYWxseSBiYWNrZmlyZWQgYnkgYmVpbmcgInRvbyBlYXN5IiAtIHdoZW4gSSB3cm90 ZSB0ZXN0cyB0bw0KICAgd2hpY2ggbWFpbnRhaW5lcnMgb2JqZWN0ZWQgYmVjYXVzZSBJIGhhZCBu b3QgZG9uZSBzbyBpbiBhDQogICBEdW5lLWlkaW9tYXRpYyB3YXk7IGJ1dCB0aGlzIHdhcyBzdGls bCBuZXQgcG9zaXRpdmUgZm9yIHN1cmUuDQoNCiAgKkNvbnNpc3RlbnQgcHJlc2VuY2UgbWF0dGVy cy4qIEkgY29udHJpYnV0ZWQgbmVhcmx5IGV2ZXJ5IGRheSBvdmVyDQogICBzZXZlcmFsIHdlZWtz LiBJIHRoaW5rIHRoYXQgdGhpcyBoZWxwZWQgbWFpbnRhaW5lcnMgZmVlbCB0aGF0IEkgd2FzDQog ICAicHJlc2VudCIgLSB0aGF0IGVmZm9ydHMgdGhhdCB0aGV5IG1hZGUgdG8gaGVscCBtZSB3ZXJl IGludmVzdG1lbnRzOw0KICAgc28gdGhleSB3ZXJlIGxlc3MgcHJvbmUgdG8gaG9sZGluZyBiYWNr IHJldmlld3MuDQoNCg0Kb2NhbWwtd2lyZTogYSBCaW5hcnkgd2lyZSBmb3JtYXQgRFNMIHdpdGgg RXZlclBhcnNlIDNEIG91dHB1dA0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBz Oi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9hbm4tb2NhbWwtd2lyZS1hLWJpbmFyeS13aXJlLWZvcm1h dC1kc2wtd2l0aC1ldmVycGFyc2UtM2Qtb3V0cHV0LzE4MDA5LzE+DQoNCg0KVGhvbWFzIEdhemFn bmFpcmUgYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBJJ20gaGFwcHkg dG8gYW5ub3VuY2UgdGhlIHJlbGVhc2Ugb2YgYG9jYW1sLXdpcmUgMC45LjAnIHRvIG9wYW0hDQoN CiAgYG9jYW1sLXdpcmUnIGlzIGEgc2V0IG9mIGNvbWJpbmF0b3JzIHRvIGRlc2NyaWJlIGJpbmFy eSBwcm90b2NvbHMgaW4NCiAgT0NhbWwuICJCaW5hcnkiIGFzIGluIGZpeGVkLWxheW91dDogc2l6 ZXMgYW5kIHNoYXBlcyBhcmUgbW9zdGx5IGtub3duDQogIHVwIGZyb250LCBzbyB5b3UncmUgcmVh ZGluZyBmaWVsZHMgYXQga25vd24gb2Zmc2V0cyByYXRoZXIgdGhhbg0KICBwYXJzaW5nIGEgZnJl ZS1mb3JtIGdyYW1tYXIgKGxpa2UgaW4gTWVuaGlyKS4gVGhlcmUgYXJlIGFscmVhZHkgbWFueQ0K ICBnb29kIGJpbmFyeSBwYXJzZXIgZnJhbWV3b3JrcyBpbiBPQ2FtbCDigJMgaGVyZSdzIHdoYXQn cyBkaWZmZXJlbnQgaW4NCiAgYG9jYW1sLXdpcmUnOg0KDQogIOKAoiBUaGUgY2VudHJhbCBkYXRh IHN0cnVjdHVyZSBpcyBFdmVyUGFyc2UncyBbM0QgZ3JhbW1hcl0uIFRoZSBPQ2FtbA0KICAgIGNv bWJpbmF0b3JzIGRlc2NyaWJlIGEgM0Qgc3RydWN0dXJlLiBGb2xsb3dpbmcgW0RhbmllbCdzIHRh Z2dlZA0KICAgIGZpbmFsIGVuY29kaW5nIGFwcHJvYWNoXSwgeW91IGJ1aWxkIGEgY29kZWMgdGhh dCBkZXNjcmliZXMgYSBzdHJ1Y3QNCiAgICBhbmQgaG93IHRvIHNlcmlhbGlzZS9kZXNlcmlhbGlz ZSBpdCBmcm9tIGFuIE9DYW1sIHZhbHVlLg0KICDigKIgV2hpY2ggbWVhbnMgZXZlcnkgZGVzY3Jp cHRpb24gY2FuIGNvbXBpbGUgZG93biB0byBhIC4zZCBmaWxlIGFuZA0KICAgIGZyb20gdGhlcmUg dG8gQyB2aWEgRXZlclBhcnNlIOKAkyBhbmQgdGhlIGdlbmVyYXRlZCBDIGNvbXBpbGVzIGNsZWFu bHkNCiAgICB3aXRoIGAtc3RkPWM5OSAtV2FsbCAtV2Vycm9yJy4gU28geW91IGNvdWxkLCBpbiB0 aGVvcnkgKEkgaGF2ZW4ndA0KICAgIHB1c2hlZCBvbiB0aGlzIHRvbyBmYXIgZm9yIG5vdyksIGJ1 aWxkIGFuZCBsaW5rIGEgY29tcGxleCBzdGFjayBhcw0KICAgIGFuIHN0YW5kYWxvbmUsIGV4dGVy bmFsIEMgcGFyc2VyIHdob3NlIG1lbW9yeSBzYWZldHksIHNpbmdsZS1wYXNzDQogICAgYmVoYXZp b3VyLCBhbmQgY29uZm9ybWFuY2UgdG8gdGhlIDNEIHNwZWMgYXJlIHByb3ZlbiBpbiBGKihFdmVy UGFyc2UNCiAgICBkb2Vzbid0IGdpdmUgeW91IHNlcmlhbGlzZXJzLCB1bmZvcnR1bmF0ZWx5KS4N CiAg4oCiIElmIHlvdSBwcmVmZXIsIHlvdSBjYW4gc3RpbGwgdXNlIHRoZSBPQ2FtbCBwYXJzZXJz L3ZlcmlmaWVycywgd2hpY2gNCiAgICBoYXZlIGJlZW4gbWFkZSByZWFzb25hYmx5IGZhc3QgKGku ZS4gbm8gZXh0cmEgYWxsb2NhdGlvbnMgb24gdGhlIGhvdA0KICAgIHBhdGgpLCBhbmQgYXMgdGhl eSBhcmUgc3RyZWFtaW5nIGNvZGVjcyB5b3UgY2FuIGp1c3QgcmVhZCBvciB3cml0ZSBhDQogICAg c2luZ2xlIGZpZWxkIG9mIHRoZSBzdHJ1Y3R1cmUgd2l0aG91dCBwYXJzaW5nIHRoZSB3aG9sZSB0 aGluZy4gVGhleQ0KICAgIGFsc28gY29tcGlsZSB0cml2aWFsbHkgdG8gSmF2YVNjcmlwdCB2aWEg YGpzX29mX29jYW1sJywgaWYgeW91IG5lZWQNCiAgICB0byBwYXJzZSB0aGUgc2FtZSBmb3JtYXQg aW4gdGhlIGJyb3dzZXIuDQoNCiAgQSBzbWFsbCBleGFtcGxlIOKAkyBhIHBhY2tldCB3aXRoIHR3 byBuaWJibGUtd2lkZSBmaWVsZHMsIGEgYmlnLWVuZGlhbg0KICBsZW5ndGgsIGFuZCBhIHZhcmlh YmxlLXNpemUgcGF5bG9hZCB3aG9zZSBsZW5ndGggaXMgcmVhZCBmcm9tIHRoZQ0KICBMZW5ndGgg ZmllbGQ6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGVuIFdpcmUNCiAg4pSCIA0KICDi lIIgdHlwZSBwYWNrZXQgPSB7IHZlcnNpb24gOiBpbnQ7IGZsYWdzIDogaW50OyBsZW5ndGggOiBp bnQ7IHBheWxvYWQgOiBzdHJpbmcgfQ0KICDilIIgDQogIOKUgiBsZXQgZl92ZXJzaW9uID0gRmll bGQudiAiVmVyc2lvbiIgKGJpdHMgfndpZHRoOjQgVTgpDQogIOKUgiBsZXQgZl9mbGFncyAgID0g RmllbGQudiAiRmxhZ3MiICAgKGJpdHMgfndpZHRoOjQgVTgpDQogIOKUgiBsZXQgZl9sZW5ndGgg ID0gRmllbGQudiAiTGVuZ3RoIiAgdWludDE2YmUNCiAg4pSCIGxldCBmX3BheWxvYWQgPSBGaWVs ZC52ICJQYXlsb2FkIiAoYnl0ZV9hcnJheSB+c2l6ZTooRmllbGQucmVmIGZfbGVuZ3RoKSkNCiAg 4pSCIA0KICDilIIgbGV0IGNvZGVjID0NCiAg4pSCICAgbGV0IG9wZW4gQ29kZWMgaW4NCiAg4pSC ICAgdiAiUGFja2V0IiAoZnVuIHZlcnNpb24gZmxhZ3MgbGVuZ3RoIHBheWxvYWQgLT4geyB2ZXJz aW9uOyBmbGFnczsgbGVuZ3RoOyBwYXlsb2FkIH0pDQogIOKUgiAgICAgWyBmX3ZlcnNpb24gJCAo ZnVuIHAgLT4gcC52ZXJzaW9uKTsNCiAg4pSCICAgICAgIGZfZmxhZ3MgICAkIChmdW4gcCAtPiBw LmZsYWdzKTsNCiAg4pSCICAgICAgIGZfbGVuZ3RoICAkIChmdW4gcCAtPiBwLmxlbmd0aCk7DQog IOKUgiAgICAgICBmX3BheWxvYWQgJCAoZnVuIHAgLT4gcC5wYXlsb2FkKSBdDQogIOKUlOKUgOKU gOKUgOKUgA0KDQogIGBGaWVsZC5yZWYgZl9sZW5ndGgnIGlzIHRoZSBkZXBlbmRlbnQtc2l6ZSBi aXQ6IHRoZSBwYXlsb2FkJ3MgbGVuZ3RoDQogIGNvbWVzIGZyb20gdGhlIGBmX2xlbmd0aCcgZmll bGQgcmVhZCBlYXJsaWVyIGluIHRoZSBzYW1lIHN0cnVjdC4gVGhhdA0KICBzYW1lIGNvZGVjIHZh bHVlIGlzIHdoYXQgeW91IGhhbmQgdG8gYEV2ZXJwYXJzZS5zY2hlbWEnIHRvIGdldCB0aGUgM0QN CiAgZmlsZSBvdXQsIGFuZCB3aGF0IGJhY2tzIGBDb2RlYy5nZXQnIC8gYENvZGVjLnNldCcgZm9y IHN0cmVhbWluZyBmaWVsZA0KICBhY2Nlc3MgZnJvbSBPQ2FtbC4gYG9jYW1sLXdpcmUnIGFsc28g c2hpcHMgdGhlIGluZnJhc3RydWN0dXJlIGZvcg0KICBnZW5lcmF0aW5nIEZGSSBzdHVicyBhbmQg Zm9yIGRpZmZlcmVudGlhbCB0ZXN0aW5nIHRvIG1ha2Ugc3VyZSB0aGUNCiAgdmVyaWZpZWQgQyBh bmQgaGFuZC13cml0dGVuIE9DYW1sIHBhcnNlcnMgYWdyZWUuIFNvIGZhciB0aGV5IHNlZW0gdG8N CiAgOi0pDQoNCiAgWW91IGNhbiByZWFkIG1vcmUgYWJvdXQgaXQgaGVyZToNCiAgPGh0dHBzOi8v Z2F6YWduYWlyZS5vcmcvYmxvZy8yMDI2LTAzLTMxLW9jYW1sLXdpcmUuaHRtbD4uDQoNCiAgVG8g dHJ5IGl0OiBgb3BhbSBpbnN0YWxsIHdpcmUnDQoNCiAgRmVlZGJhY2sgdmVyeSB3ZWxjb21lIFtv biB0aGUgaXNzdWUgdHJhY2tlcl0gKG9yIGJlbGxvdykhDQoNCg0KWzNEIGdyYW1tYXJdDQo8aHR0 cHM6Ly9wcm9qZWN0LWV2ZXJlc3QuZ2l0aHViLmlvL2V2ZXJwYXJzZS8zZC5odG1sI2xhbmd1YWdl LXJlZmVyZW5jZT4NCg0KW0RhbmllbCdzIHRhZ2dlZCBmaW5hbCBlbmNvZGluZyBhcHByb2FjaF0N CjxodHRwczovL2dpdGh1Yi5jb20vZGJ1ZW56bGkvanNvbnQvYmxvYi9tYWluL3BhcGVyL3NvdXAu cGRmPg0KDQpbb24gdGhlIGlzc3VlIHRyYWNrZXJdIDxodHRwczovL2dpdGh1Yi5jb20vcGFyc2lt b25pLWxhYnMvb2NhbWwtd2lyZT4NCg0KDQp2YWxrZXk6IG1vZGVybiBWYWxrZXkgY2xpZW50IGZv ciBPQ2FtbCA1ICsgRWlvLCBvbiBvcGFtDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNjdXNzLm9j YW1sLm9yZy90L2Fubi12YWxrZXktbW9kZXJuLXZhbGtleS1jbGllbnQtZm9yLW9jYW1sLTUtZWlv LW9uLW9wYW0vMTgwMTAvMT4NCg0KDQpBdmkgRmVuZXNoIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgSGkg ZXZlcnlvbmUsDQoNCiAgSSB3YW50ZWQgdG8gc2hhcmUgdGhhdCBgdmFsa2V5JyAwLjIuMCBpcyBu b3cgb24gb3BhbToNCg0KICDigKIgb3BhbTogPGh0dHBzOi8vb3BhbS5vY2FtbC5vcmcvcGFja2Fn ZXMvdmFsa2V5L3ZhbGtleS4wLjIuMC8+DQogIOKAoiBSZXBvIGFuZCBHZXR0aW5nIFN0YXJ0ZWQ6 DQogICAgPGh0dHBzOi8vZ2l0aHViLmNvbS9hdmlmZW5lc2gvb2NhbWwtdmFsa2V5L2Jsb2IvbWFp bi9kb2NzL2dldHRpbmctc3RhcnRlZC5tZD4NCg0KICBUaGUgbWFpbiB0aGluZyBJIHdhbnRlZCB3 aXRoIHRoaXMgcHJvamVjdCB3YXMgdG8gZm9jdXMgb24gdGhlIGN1cnJlbnQNCiAgVmFsa2V5IHN0 YWNrIHdpdGggdGhlIG5ld2VyIE9DYW1sIHN0YWNrLg0KDQogIFNvIGB2YWxrZXknIGlzIGJ1aWx0 IGFyb3VuZDoNCg0KICDigKIgT0NhbWwgNQ0KICDigKIgRWlvLW5hdGl2ZSBkaXJlY3Qtc3R5bGUg Y29uY3VycmVuY3kNCiAg4oCiIFJFU1AzIG9ubHkNCiAg4oCiIE1vZGVybiBWYWxrZXkgZmVhdHVy ZXMgYW5kIHJlYWwgY2x1c3RlciBiZWhhdmlvcg0KDQogIEEgZmV3IHBhcnRzIEknbSBoYXBweSB3 aXRoOg0KDQogIOKAoiBDbHVzdGVyIHN1cHBvcnQgd2l0aCBhIHN0cm9uZyBmb2N1cyBvbiBkdXJh YmlsaXR5IGFuZCBoaWdoDQogICAgYXZhaWxhYmlsaXR5OiB0b3BvbG9neSByZWZyZXNoLCBwZXJp b2RpYyBiYWNrZ3JvdW5kIHJlZnJlc2gsIGBNT1ZFRCcNCiAgICAvIGBBU0snIC8gYENMVVNURVJE T1dOJyBoYW5kbGluZywgcmVwbGljYS1hd2FyZSByZWFkcywgQVotYXdhcmUNCiAgICByb3V0aW5n LCBhbmQgZmFpbG92ZXItYXdhcmUgc2hhcmRlZCBwdWIvc3ViIHJlcGxheQ0KICDigKIgY29ubmVj dGlvbi9ydW50aW1lIGJlaGF2aW9yOiBjaXJjdWl0IGJyZWFrZXIsIHJlY29ubmVjdCBoYW5kbGlu ZywNCiAgICBrZWVwYWxpdmUsIFRMUywgYW5kIG9wdGlvbmFsIHNlcGFyYXRpb24gYmV0d2VlbiBz b2NrZXQgSS9PIGFuZA0KICAgIHBhcnNpbmcgdmlhIGBFaW8uRG9tYWluX21hbmFnZXInLCBzbyBv bmUgc2lkZSBvZiB0aGUgc3lzdGVtIGRvZXMgbm90DQogICAgYmxvY2sgdGhlIG90aGVyDQogIOKA oiBiYXRjaCBzdXBwb3J0OiBzY2F0dGVyLWdhdGhlciBhY3Jvc3Mgc2xvdHMsIGF0b21pYyBzaW5n bGUtc2xvdCBmbG93cw0KICAgIHdpdGggYFdBVENIJyAvIGBNVUxUSScgLyBgRVhFQycsIG11bHRp LXNsb3QgaGVscGVycywgYW5kIGluIGAwLjIuMCcNCiAgICBhbHNvIFdBVENIIGd1YXJkcyBmb3Ig cmVhZC1tb2RpZnktd3JpdGUgQ0FTIHBsdXMgY3Jvc3Mtc2xvdA0KICAgIGBwZmNvdW50X2NsdXN0 ZXInDQogIOKAoiBjb21tYW5kIHN1cmZhY2U6IHR5cGVkIGhlbHBlcnMgYWNyb3NzIGEgcHJldHR5 IGJyb2FkIHNldCBvZg0KICAgIGNvbW1hbmRzLCBgQ2xpZW50LmN1c3RvbScgL35jdXN0b21fbXVs dGl+IGZvciBjdXN0b20gY29tbWFuZHMgYW5kDQogICAgbXVsdGktbm9kZSBleGVjdXRpb24sIGFu ZCBuYW1lZCBjb21tYW5kcyBzbyB5b3UgY2FuIHJlZ2lzdGVyIGNvbW1hbmQNCiAgICB0ZW1wbGF0 ZXMgb25jZSBhbmQgcmV1c2UgdGhlbSBsYXRlcg0KICDigKIgc2NyaXB0aW5nOiBsb2NhbCBzY3Jp cHQgY2FjaGluZyBhbmQgb3B0aW1pc3RpYyBgRVZBTFNIQScgaGFuZGxpbmcNCiAgICB3aXRoIGF1 dG9tYXRpYyBmYWxsYmFjay9yZXRyeSBvbiBgTk9TQ1JJUFQnLCBzbyBjYWxsZXJzIGRvbid0IG5l ZWQNCiAgICB0byBtYW5hZ2UgdGhhdCBmbG93IHRoZW1zZWx2ZXMNCg0KICBUaGVyZSBpcyBhbHNv IGFscmVhZHkgYSBwcmV0dHkgZ29vZCBhbW91bnQgb2YgdmFsaWRhdGlvbiBhcm91bmQgaXQ6DQog IGludGVncmF0aW9uIHRlc3RzLCBwcm9wZXJ0eSB0ZXN0cywgZnV6emluZywgY2hhb3MgdGVzdGlu ZywgZXhhbXBsZXMsDQogIGFuZCBndWlkZXMuDQoNCiAgUGVyZm9ybWFuY2Utd2lzZSwgaXQgYWxz byBjYW1lIG91dCBwcmV0dHkgbmljZWx5OiBpbiBzZXZlcmFsIHNjZW5hcmlvcw0KICBpdCBnZXRz IHRvIDkwJSsgb2YgdGhlIEMgcmVmZXJlbmNlIGNsaWVudC4NCg0KICDilIzilIDilIDilIDilIAN CiAg4pSCIG9wYW0gdXBkYXRlDQogIOKUgiBvcGFtIGluc3RhbGwgdmFsa2V5IGVpb19tYWluDQog IOKUlOKUgOKUgOKUgOKUgA0KDQogIEN1cnJlbnQgbmV4dCBzdGVwcyBvbiB0aGUgcm9hZG1hcCBh cmUgdGhpbmdzIGxpa2U6DQoNCiAg4oCiIGNsaWVudC1zaWRlIGNhY2hpbmcNCiAg4oCiIGNvbm5l Y3Rpb24gcG9vbHMgLyBibG9ja2luZyBwb29scw0KICDigKIgYElBTScgKyBgbVRMUycNCiAg4oCi IFZhbGtleSBtb2R1bGUgc3VwcG9ydCAoSlNPTiwgc2VhcmNoLCBibG9vbSkNCg0KICBJZiB0aGVy ZSdzIGEgZmVhdHVyZSBwZW9wbGUgY2FyZSBhYm91dCwgSSdkIGJlIHZlcnkgaGFwcHkgdG8NCiAg cmVwcmlvcml0aXplIHRoZSByb2FkbWFwIGFyb3VuZCByZWFsIGludGVyZXN0Lg0KDQogIEknZCBh bHNvIHJlYWxseSBsb3ZlIGZlZWRiYWNrIGZyb20gdGhlIE9DYW1sIGNvbW11bml0eSBvbiB0aGUg QVBJLA0KICBlcmdvbm9taWNzLCBkb2NzLCBhbmQgZ2VuZXJhbCBkZXNpZ24uDQoNCiAgSSdtIHZl cnkgZmFtaWxpYXIgd2l0aCB0aGUgVmFsa2V5IHdvcmxkLCBidXQgT0NhbWwgaXMgbW9yZSBvZiBh IHNpZGUNCiAgZnVuIGZvciBtZSB0aGFuIG15IGRhaWx5IGxhbmd1YWdlLCBzbyBmZWVkYmFjayBm cm9tIHBlb3BsZSB3aG8gcmVhbGx5DQogIGxpdmUgaW4gdGhlIE9DYW1sIGVjb3N5c3RlbSBpcyBl c3BlY2lhbGx5IHZhbHVhYmxlIHRvIG1lLg0KDQogIElmIHlvdSB0cnkgaXQsIEknZCBsb3ZlIHRv IGhlYXIgd2hhdCB5b3UgdGhpbmsuDQoNCg0KVW5pZmllZFNjcmlwdF97U3RkLFRvcH0gLSBsaXRl cmF0ZSB0ZXN0aW5nDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9kaXNj dXNzLm9jYW1sLm9yZy90L2Fubi11bmlmaWVkc2NyaXB0LXN0ZC10b3AtbGl0ZXJhdGUtdGVzdGlu Zy8xODAxMy8xPg0KDQoNCmpiZWNrZm9yZCBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEkgYW0gcGxlYXNlZCB0 byBpbnRyb2R1Y2UgdGhlIGBVbmlmaWVkU2NyaXB0X1N0ZCcgYW5kDQogIGBVbmlmaWVkU2NyaXB0 X1RvcCcgcGFja2FnZXMuIFVuaWZpZWQgc2NyaXB0cyBhcmUgYSB3YXkgdG8gd3JpdGUgdGVzdHMN CiAgYW5kIGRvY3VtZW50YXRpb24gc2ltdWx0YW5lb3VzbHkuIENyYW0gdGVzdHMgYW5kIFtNRFgg c2NyaXB0c10gYXJlDQogIGJvdGggc2ltaWxhciB0byB1bmlmaWVkIHNjcmlwdHMsIGJ1dCB1bmlm aWVkIHNjcmlwdHMgYXJlbid0IHRpZWQgdG8NCiAgTWFya2Rvd24gKE1EWCkgb3IgdGllZCB0byBQ T1NJWCBzaGVsbCBjb21tYW5kcyAoY3JhbSB0ZXN0cykuDQoNCiAgRXhhbXBsZXM6DQoNCiAg4oCi IC9NYXJrZG93biBleGFtcGxlLzogSGVyZSBhcmUgdGhlIHppbGxpb25zIG9mIHRlc3RzIGZyb20g YG9jYW1sLXJlJw0KICAgIGNvbnZlcnRlZCBpbnRvIE1hcmtkb3duOiBbb2NhbWwtcmUvRVhBTVBM RVMubWRdLiBDdXN0b20gT0NhbWwgUkVQTA0KICAgIHByaW50ZXJzIGFyZSB1c2VkIHNvIHRoYXQg bWFueSBvZiB0aGUgdGVzdHMgYXJlIHByaW50ZWQgYXMgTWFya2Rvd24NCiAgICB0YWJsZXMuIC9h c2lkZTogV291bGRuJ3QgaXQgYmUgbmljZSBpZiB0ZXN0cyB5b3UgYXJlIGFscmVhZHkgd3JpdGlu Zw0KICAgIGJlY2FtZSBkb2N1bWVudGF0aW9uPyBUaGF0IHdhcyBhIDQgeWVhciBmb2xsb3ctdXAg dG8NCiAgICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L3doYXQtYXJlLXRoZS1iaWdnZXN0 LXJlYXNvbnMtbmV3Y29tZXJzLWdpdmUtdXAtb24tb2NhbWwvMTA5NTgvMTM/dT1qYmVja2ZvcmQ+ Lw0KICDigKIgL2AubWwnIGV4YW1wbGUvOiBUaGUgZm9sbG93aW5nIGlzIGEgc25pcHBldCBmcm9t IFthIHJlZ3VsYXIgT0NhbWwNCiAgICBgLm1sJyBtb2R1bGVdIHdoZXJlIHRoZSBgKCogLi4uICop JyBjb21tZW50cyBhcmUgT0NhbWwgUkVQTCB0b3BsZXZlbA0KICAgIHJlc3BvbnNlcyBtYWludGFp bmVkIGJ5IHRoZSB1bmlmaWVkIHRvb2xzLg0KICAgIOKUjOKUgOKUgOKUgOKUgA0KICAgIOKUgiBs ZXQgbHlyaWNzID0NCiAgICDilIIgICAiRXZlcnlib2R5IHN0ZXAgdG8gdGhlIGxlZnQuIg0KICAg IOKUgiAgICgqIHZhbCBseXJpY3MgOiBzdHJpbmcgPSAiRXZlcnlib2R5IHN0ZXAgdG8gdGhlIGxl ZnQuIiAqKVtAb2NhbWxmb3JtYXQgImRpc2FibGUiXQ0KICAgIOKUgiANCiAgICDilIIgbGV0IChf IDogc3RyaW5nKSA9DQogICAg4pSCICAgUHJpbnRmLnNwcmludGYgIk5vdyBsZXQncyBzaW5nOiAl cyIgbHlyaWNzDQogICAg4pSCICAgKCogLSA6IHN0cmluZyA9ICJOb3cgbGV0J3Mgc2luZzogRXZl cnlib2R5IHN0ZXAgdG8gdGhlIGxlZnQuIiAqKVtAb2NhbWxmb3JtYXQgImRpc2FibGUiXQ0KICAg IOKUlOKUgOKUgOKUgOKUgA0KDQogIERvY3MgYXJlIGF0IFtkay9kb2NzL1VOSUZJRURfU0NSSVBU Uy5tZF0gKG9mIGNvdXJzZSBnZW5lcmF0ZWQgYnkgdGhlDQogIHVuaWZpZWQgdG9vbHMpLg0KDQog IEluc3RhbGwgdGhlIHRvb2xzIHdpdGg6DQoNCiAg4pSM4pSA4pSA4pSA4pSADQogIOKUgiBvcGFt IHBpbiBhZGQgVW5pZmllZFNjcmlwdF9TdGQgaHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvYnVpbGQt dG9vbHMvTWxGcm9udC8tL3JlbGVhc2VzL3Blcm1hbGluay9sYXRlc3QvZG93bmxvYWRzL01sRnJv bnQudGFyLmd6DQogIOKUgiBvcGFtIHBpbiBhZGQgVW5pZmllZFNjcmlwdF9Ub3AgaHR0cHM6Ly9n aXRsYWIuY29tL2RrbWwvYnVpbGQtdG9vbHMvTWxGcm9udC8tL3JlbGVhc2VzL3Blcm1hbGluay9s YXRlc3QvZG93bmxvYWRzL01sRnJvbnQudGFyLmd6DQogIOKUlOKUgOKUgOKUgOKUgA0KDQogIEFm dGVyIGZlZWRiYWNrIEknbGwgcmVsZWFzZSB0aGVtIG9mZmljaWFsbHkgdG8gb3BhbS4gSSB3b3Vs ZCBsaWtlDQogIGZlZWRiYWNrIG92ZXJhbGwgYW5kIGFsc28gc3BlY2lmaWNhbGx5IG9uIHRoZSBb YWdlbnQgc2tpbGwgdGhhdA0KICBjb252ZXJ0cyBleHBlY3QgdGVzdHMgdG8gdW5pZmllZCB0ZXN0 c10uDQoNCg0KW01EWCBzY3JpcHRzXSA8aHR0cHM6Ly9naXRodWIuY29tL3JlYWx3b3JsZG9jYW1s L21keD4NCg0KW29jYW1sLXJlL0VYQU1QTEVTLm1kXQ0KPGh0dHBzOi8vZ2l0aHViLmNvbS9qb25h aGJlY2tmb3JkL29jYW1sLXJlL2Jsb2IvN2RiZmM0NDZiZDU5NDMwM2FkZDAwZjQ0M2JkZWEyMDZi MDg1MTFjMi9FWEFNUExFUy5tZD4NCg0KW2EgcmVndWxhciBPQ2FtbCBgLm1sJyBtb2R1bGVdDQo8 aHR0cHM6Ly9naXRsYWIuY29tL2RrbWwvYnVpbGQtdG9vbHMvTWxGcm9udC8tL2Jsb2IvMzc0YmJh Yzc3MDAzY2Q4Y2VlNTZmMDY2NGNlYzk3NGFhMzE0YzY0OC9zcmMvVW5pZmllZFNjcmlwdF9Ub3Av cGxhaW5tb2R1bGUubWw+DQoNCltkay9kb2NzL1VOSUZJRURfU0NSSVBUUy5tZF0NCjxodHRwczov L2dpdGh1Yi5jb20vZGlza3V2L2RrL2Jsb2IvZmZhMTMwYTFkYmVmY2QxMzRiMGQxNWYxMTJmZDZk NmM5OWRjMGZjOC9kb2NzL1VOSUZJRURfU0NSSVBUUy5tZD4NCg0KW2FnZW50IHNraWxsIHRoYXQg Y29udmVydHMgZXhwZWN0IHRlc3RzIHRvIHVuaWZpZWQgdGVzdHNdDQo8aHR0cHM6Ly9naXRodWIu Y29tL2pvbmFoYmVja2ZvcmQvb2NhbWwtcmUvYmxvYi9tYWtlLWxpdGVyYXRlLXRlc3RzLy5jbGF1 ZGUvc2tpbGxzL21ha2UtbGl0ZXJhdGUtdGVzdHMvU0tJTEwubWQ+DQoNCg0Kb3BlbnJvdXRlcl9h cGk6IEFuIE9wZW5Sb3V0ZXIgY2xpZW50IGxpYnJhcnkNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQog IEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9wZW5yb3V0ZXIt YXBpLWFuLW9wZW5yb3V0ZXItY2xpZW50LWxpYnJhcnkvMTgwMTYvMT4NCg0KDQptdF9jYXJldCBh bm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgA0KDQogIEknbSBoYXBweSB0byBhbm5vdW5jZSB0aGUgZmlyc3QgdmVyc2lvbiAodjAu MC4xKSBvZiBgb3BlbnJvdXRlcl9hcGknLA0KICBhIGxpYnJhcnkgZm9yIHF1ZXJ5aW5nIGxhcmdl IGxhbmd1YWdlIG1vZGVscyB2aWEgT3BlblJvdXRlciwgYSBzZXJ2aWNlDQogIHdoaWNoIHByb3Zp ZGVzIGFjY2VzcyB0byBhIHZhcmlldHkgb2YgbW9kZWxzIHVuZGVyIGEgdW5pZmllZCBBUEkuDQoN CiAg4oCiIG9wYW06IDxodHRwczovL29wYW0ub2NhbWwub3JnL3BhY2thZ2VzL29wZW5yb3V0ZXJf YXBpLz4NCiAg4oCiIEdpdEh1YjogW2h0dHBzOi8vZ2l0aHViLmNvbS9tdC1jYXJldC9vcGVucm91 dGVyLW9jYW1sXQ0KICDigKIgZG9jczoNCiAgICA8aHR0cHM6Ly9tdC1jYXJldC5naXRodWIuaW8v b3BlbnJvdXRlci1vY2FtbC9vcGVucm91dGVyX2FwaS9pbmRleC5odG1sPg0KDQogIEkndmUgYmVl biB1c2luZyB0aGlzIGxpYnJhcnkgaW4gbXkgcGVyc29uYWwgcHJvamVjdHMgd2hlbmV2ZXIgSSB3 YW50DQogIHRvIGludGVncmF0ZSBhbiBBSSBtb2RlbCwgYW5kIEkndmUgZm91bmQgaXQgcXVpdGUg dXNlZnVsOyBJIGhvcGUNCiAgb3RoZXJzIHdpbGwgZmluZCBpdCB1c2VmdWwgYXMgd2VsbC4gSXNz dWVzIGFuZCBjb250cmlidXRpb25zIGFyZQ0KICB3ZWxjb21lLg0KDQoNCltodHRwczovL2dpdGh1 Yi5jb20vbXQtY2FyZXQvb3BlbnJvdXRlci1vY2FtbF0NCjxodHRwczovL2dpdGh1Yi5jb20vbXQt Y2FyZXQvb3BlbnJvdXRlci1vY2FtbD4NCg0KDQpDYWxsIGZvciBwcmVzZW50YXRpb25zOiBDYW1s IGluIHRoZSBDYXBpdGFsIElJDQrilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZl Og0KICA8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2NhbGwtZm9yLXByZXNlbnRhdGlvbnMt Y2FtbC1pbi10aGUtY2FwaXRhbC1paS8xNzk1OS8yPg0KDQoNCkNvbnRpbnVpbmcgdGhpcyB0aHJl YWQsIFNhY2hhIEF5b3VuIGFubm91bmNlZA0K4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgRGF0 ZSBhbmQgbG9jYXRpb24gaGF2ZSBiZWVuIGNvbmZpcm1lZCEgSnVuZSAzcmQgYXQgdGhlIEphbmUg U3RyZWV0DQogIG9mZmljZSEhICBJIGhhdmUgdXBkYXRlZCB0aGUgcG9zdC4NCg0KICBXZSdyZSBz dGlsbCBvcGVuIGZvciBwcmVzZW50YXRpb24gcHJvcG9zYWxzIGFzIHdlbGwhDQoNCg0KT2xkIENX Tg0K4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgSWYgeW91IGhhcHBlbiB0byBtaXNzIGEgQ1dO LCB5b3UgY2FuIFtzZW5kIG1lIGEgbWVzc2FnZV0gYW5kIEknbGwgbWFpbA0KICBpdCB0byB5b3Us IG9yIGdvIHRha2UgYSBsb29rIGF0IFt0aGUgYXJjaGl2ZV0gb3IgdGhlIFtSU1MgZmVlZCBvZiB0 aGUNCiAgYXJjaGl2ZXNdLg0KDQogIElmIHlvdSBhbHNvIHdpc2ggdG8gcmVjZWl2ZSBpdCBldmVy eSB3ZWVrIGJ5IG1haWwsIHlvdSBtYXkgc3Vic2NyaWJlDQogIHRvIHRoZSBbY2FtbC1saXN0XS4N Cg0KICBbQWxhbiBTY2htaXR0XQ0KDQoNCltzZW5kIG1lIGEgbWVzc2FnZV0gPG1haWx0bzphbGFu LnNjaG1pdHRAcG9seXRlY2huaXF1ZS5vcmc+DQoNClt0aGUgYXJjaGl2ZV0gPGh0dHBzOi8vYWxh bi5wZXRpdGVwb21tZS5uZXQvY3duLz4NCg0KW1JTUyBmZWVkIG9mIHRoZSBhcmNoaXZlc10gPGh0 dHBzOi8vYWxhbi5wZXRpdGVwb21tZS5uZXQvY3duL2N3bi5yc3M+DQoNCltjYW1sLWxpc3RdIDxo dHRwczovL3N5bXBhLmlucmlhLmZyL3N5bXBhL2luZm8vY2FtbC1saXN0Pg0KDQpbQWxhbiBTY2ht aXR0XSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5ldC8+DQoNCg== --==-=-= Content-Type: text/html Content-Disposition: inline OCaml Weekly News

    OCaml Weekly News

    Previous Week Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 21 to 28, 2026.

    Closing Old Bugs With Tests: A Dune Contribution Story

    Robin Bate Boerop announced

    I recently started contributing to Dune with no prior familiarity with the code base. One thing I found rewarding was closing old issues — some filed as far back as 2018 — and I wanted to share the approach I used.

    The Method: Close With a Test

    Many open issues describe behaviour that has already been fixed, or behaviour that is working correctly but was never verified with a test. My approach: write a cram test that demonstrates the expected behaviour, link the PR to the issue with fixes #NNNN, and let the merge close the issue automatically.

    This has several advantages over simply closing an issue with a comment like "this works now":

    • It's verifiable. Anyone can read the test and see exactly what behaviour is being asserted. There's no argument about whether the issue is truly resolved.
    • It prevents regressions. If the behaviour breaks again in the future, the test fails. The issue doesn't silently reopen — the CI catches it.
    • It grows the test suite. Every closed issue leaves behind a test that documents a real-world scenario someone cared about.
    • It respects the reporter. Someone took the time to file the issue. A test that captures their concern is a better acknowledgement than a drive-by close.

    After a few weeks of contributing test PRs and bug fixes, I was given triager and then maintainer status on the project. This let me close issues directly when they were clearly resolved, and merge my own test PRs. Before that, the existing maintainers merged them on my behalf.

    Honestly, I regret closing issues where I could have used this method but didn't. The method is much superior to simply adding to a GitHub discussion about the bug and then closing the issue.

    Issues I Helped Close

    Here's an accounting of what I helped close, grouped by what it took:

    • Confirmed resolved; closed directly

      These issues described problems that no longer existed on main. In some cases I confirmed this myself, in others someone else had already verified it. As a triager/maintainer I was able to close them:

      • #1974@all target doesn't interact well with (include_subdirs ...) (filed 2019)
      • #3173 — Can't promote into a directory starting with underscore (filed 2020)
      • #3805 — No such file or directory when DUNE_BUILD_DIR is set during test (filed 2020)
      • #8242 — Very slow emacs compilation buffer updates (filed 2023)
      • #10360executables_implicit_empty_intf expects dune >= 2.9 but was only added in 3.0 (filed 2024)
    • Closed with a test PR

      These issues were resolved by writing a test that demonstrates the correct behaviour. No code changes were needed — the test itself closed the issue:

      • #2370.h files copied to _build without foreign stubs (filed 2019, test: #14172)
      • #3362 — Cannot use %{lib:...} in the flags stanza (filed 2020, test: #14146)
      • #3484 — Promoting over a running binary (filed 2020, test: #14173)
      • #11110 — Libexec site install doesn't set executable bit (filed 2024, test: #14171)
    • Closed with a test and a code fix

      These required both a test and a code change to resolve:

      • #878dune subst adds duplicate version field in opam (filed 2018, fix: #14136)
      • #2445 — dune sends SIGKILL without prior SIGTERM (filed 2019, fixes: #14170, #14224)
      • #3916 — Duplicate bounds in autogenerated opam files (filed 2020, fix: #14175)
      • #6148root_module generates duplicate module definition (filed 2022, fix: #14135)
      • #9757dune runtest doesn't execute byte-only inline tests (filed 2024, fix: #14174)
      • #10707 — Missing menhir lower bound in generated opam files (filed 2024, fix: #14168)
      • #11002 — opam file generation error-prone (filed 2024, fix: #14136)
      • #11106 — Redundant dune version constraint in opam files (filed 2024, fix: #14175)
      • #12007dune build @ocaml-index builds too many files (filed 2025, partially fixed with #14137)
      • #14089 — Incremental builds with (wrapped (transition ...)) broken (filed 2026, test: #14088, fix: #14090)

    What I Learned

    Writing tests is a good way to learn about a code base. Each test forced me to understand how a feature actually works — not the architecture in the abstract, but the concrete behaviour in specific scenarios. The understanding compounded.

    Dune's cram tests make this easy. Each test is a self-contained shell script with expected output, checked into the repo as a .t file. The barrier to writing a test is low, which is exactly what you want when your goal is to close issues by testing them. This occasionally backfired by being "too easy" - when I wrote tests to which maintainers objected because I had not done so in a Dune-idiomatic way; but this was still net positive for sure.

    Consistent presence matters. I contributed nearly every day over several weeks. I think that this helped maintainers feel that I was "present" - that efforts that they made to help me were investments; so they were less prone to holding back reviews.

    ocaml-wire: a Binary wire format DSL with EverParse 3D output

    Thomas Gazagnaire announced

    I'm happy to announce the release of ocaml-wire 0.9.0 to opam!

    ocaml-wire is a set of combinators to describe binary protocols in OCaml. "Binary" as in fixed-layout: sizes and shapes are mostly known up front, so you're reading fields at known offsets rather than parsing a free-form grammar (like in Menhir). There are already many good binary parser frameworks in OCaml – here's what's different in ocaml-wire:

    • The central data structure is EverParse's 3D grammar. The OCaml combinators describe a 3D structure. Following Daniel's tagged final encoding approach, you build a codec that describes a struct and how to serialise/deserialise it from an OCaml value.
    • Which means every description can compile down to a .3d file and from there to C via EverParse – and the generated C compiles cleanly with -std=c99 -Wall -Werror. So you could, in theory (I haven't pushed on this too far for now), build and link a complex stack as an standalone, external C parser whose memory safety, single-pass behaviour, and conformance to the 3D spec are proven in F*(EverParse doesn't give you serialisers, unfortunately).
    • If you prefer, you can still use the OCaml parsers/verifiers, which have been made reasonably fast (i.e. no extra allocations on the hot path), and as they are streaming codecs you can just read or write a single field of the structure without parsing the whole thing. They also compile trivially to JavaScript via js_of_ocaml, if you need to parse the same format in the browser.

    A small example – a packet with two nibble-wide fields, a big-endian length, and a variable-size payload whose length is read from the Length field:

    open Wire
    
    type packet = { version : int; flags : int; length : int; payload : string }
    
    let f_version = Field.v "Version" (bits ~width:4 U8)
    let f_flags   = Field.v "Flags"   (bits ~width:4 U8)
    let f_length  = Field.v "Length"  uint16be
    let f_payload = Field.v "Payload" (byte_array ~size:(Field.ref f_length))
    
    let codec =
      let open Codec in
      v "Packet" (fun version flags length payload -> { version; flags; length; payload })
        [ f_version $ (fun p -> p.version);
          f_flags   $ (fun p -> p.flags);
          f_length  $ (fun p -> p.length);
          f_payload $ (fun p -> p.payload) ]
    

    Field.ref f_length is the dependent-size bit: the payload's length comes from the f_length field read earlier in the same struct. That same codec value is what you hand to Everparse.schema to get the 3D file out, and what backs Codec.get / Codec.set for streaming field access from OCaml. ocaml-wire also ships the infrastructure for generating FFI stubs and for differential testing to make sure the verified C and hand-written OCaml parsers agree. So far they seem to :-)

    You can read more about it here: https://gazagnaire.org/blog/2026-03-31-ocaml-wire.html.

    To try it: opam install wire

    Feedback very welcome on the issue tracker (or bellow)!

    valkey: modern Valkey client for OCaml 5 + Eio, on opam

    Avi Fenesh announced

    Hi everyone,

    I wanted to share that valkey 0.2.0 is now on opam:

    The main thing I wanted with this project was to focus on the current Valkey stack with the newer OCaml stack.

    So valkey is built around:

    • OCaml 5
    • Eio-native direct-style concurrency
    • RESP3 only
    • Modern Valkey features and real cluster behavior

    A few parts I'm happy with:

    • Cluster support with a strong focus on durability and high availability: topology refresh, periodic background refresh, MOVED / ASK / CLUSTERDOWN handling, replica-aware reads, AZ-aware routing, and failover-aware sharded pub/sub replay
    • connection/runtime behavior: circuit breaker, reconnect handling, keepalive, TLS, and optional separation between socket I/O and parsing via Eio.Domain_manager, so one side of the system does not block the other
    • batch support: scatter-gather across slots, atomic single-slot flows with WATCH / MULTI / EXEC, multi-slot helpers, and in 0.2.0 also WATCH guards for read-modify-write CAS plus cross-slot pfcount_cluster
    • command surface: typed helpers across a pretty broad set of commands, Client.custom /~custom_multi~ for custom commands and multi-node execution, and named commands so you can register command templates once and reuse them later
    • scripting: local script caching and optimistic EVALSHA handling with automatic fallback/retry on NOSCRIPT, so callers don't need to manage that flow themselves

    There is also already a pretty good amount of validation around it: integration tests, property tests, fuzzing, chaos testing, examples, and guides.

    Performance-wise, it also came out pretty nicely: in several scenarios it gets to 90%+ of the C reference client.

    opam update
    opam install valkey eio_main
    

    Current next steps on the roadmap are things like:

    • client-side caching
    • connection pools / blocking pools
    • IAM + mTLS
    • Valkey module support (JSON, search, bloom)

    If there's a feature people care about, I'd be very happy to reprioritize the roadmap around real interest.

    I'd also really love feedback from the OCaml community on the API, ergonomics, docs, and general design.

    I'm very familiar with the Valkey world, but OCaml is more of a side fun for me than my daily language, so feedback from people who really live in the OCaml ecosystem is especially valuable to me.

    If you try it, I'd love to hear what you think.

    UnifiedScript_{Std,Top} - literate testing

    jbeckford announced

    I am pleased to introduce the UnifiedScript_Std and UnifiedScript_Top packages. Unified scripts are a way to write tests and documentation simultaneously. Cram tests and MDX scripts are both similar to unified scripts, but unified scripts aren't tied to Markdown (MDX) or tied to POSIX shell commands (cram tests).

    Examples:

    • Markdown example: Here are the zillions of tests from ocaml-re converted into Markdown: ocaml-re/EXAMPLES.md. Custom OCaml REPL printers are used so that many of the tests are printed as Markdown tables. aside: Wouldn't it be nice if tests you are already writing became documentation? That was a 4 year follow-up to https://discuss.ocaml.org/t/what-are-the-biggest-reasons-newcomers-give-up-on-ocaml/10958/13?u=jbeckford
    • .ml example: The following is a snippet from a regular OCaml .ml module where the (* ... *) comments are OCaml REPL toplevel responses maintained by the unified tools.

      let lyrics =
        "Everybody step to the left."
        (* val lyrics : string = "Everybody step to the left." *)[@ocamlformat "disable"]
      
      let (_ : string) =
        Printf.sprintf "Now let's sing: %s" lyrics
        (* - : string = "Now let's sing: Everybody step to the left." *)[@ocamlformat "disable"]
      

    Docs are at dk/docs/UNIFIED_SCRIPTS.md (of course generated by the unified tools).

    Install the tools with:

    opam pin add UnifiedScript_Std https://gitlab.com/dkml/build-tools/MlFront/-/releases/permalink/latest/downloads/MlFront.tar.gz
    opam pin add UnifiedScript_Top https://gitlab.com/dkml/build-tools/MlFront/-/releases/permalink/latest/downloads/MlFront.tar.gz
    

    After feedback I'll release them officially to opam. I would like feedback overall and also specifically on the agent skill that converts expect tests to unified tests.

    openrouter_api: An OpenRouter client library

    mt_caret announced

    I'm happy to announce the first version (v0.0.1) of openrouter_api, a library for querying large language models via OpenRouter, a service which provides access to a variety of models under a unified API.

    I've been using this library in my personal projects whenever I want to integrate an AI model, and I've found it quite useful; I hope others will find it useful as well. Issues and contributions are welcome.

    Call for presentations: Caml in the Capital II

    Continuing this thread, Sacha Ayoun announced

    Date and location have been confirmed! June 3rd at the Jane Street office!! I have updated the post.

    We're still open for presentation proposals as well!

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a look at the archive or the RSS feed of the archives.

    If you also wish to receive it every week by mail, you may subscribe to the caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmnwaOMbFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5ceJSAgArPiTJVJOPifsdgzYliZcHKecEs0QGt6p7C9dvgre M/4TUajLXxIEDEjx6pIf1563OrqkeS9+ByIIaXUdpZfdKnIsZIyMiTOSSG8ywiSm /iUprGb7/x3G0XBB6jMzpQmwmRZ/bN7tniqBswrMMMUQsMNStcx2uU/fNSxUR4Ux jpn5yw50rF8Ly3vm/3OawZX/BBah+pC2OqDwxylibhXp1z0J9CnCJZeZWofh3kDE Qh9y9Aqx0tOLJ3msnuS0NEuqpSOkvDko+VxksRJZS5ojkpkGiG8sDO8+MidE9MwI e1Fm7J8tZLgu/ZqnV3Xe6w4AhfKDJOua/se05VsDJgha2Q== =oFOc -----END PGP SIGNATURE----- --===-=-=-- From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Authentication-Results: plum.tunbury.org; dkim=pass (1024-bit key; unprotected) header.d=inria.fr header.i=@inria.fr header.a=rsa-sha256 header.s=dc header.b=GyFW1CjY; dkim-atps=neutral Received-SPF: Pass (mailfrom) identity=mailfrom; client-ip=192.134.164.83; helo=mail2-relais-roc.national.inria.fr; envelope-from=caml-list-owner@inria.fr; receiver=tunbury.org Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by plum.tunbury.org (Postfix) with ESMTP id 4A10440097 for ; Tue, 5 May 2026 09:36:12 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=inria.fr; s=dc; h=from:to:date:message-id:mime-version:subject:reply-to: sender:list-id:list-help:list-subscribe:list-unsubscribe: list-post:list-owner:list-archive; bh=QK1g8Rq+T5NlqosgSMAhwdyZxgodu7utibpk8FwKiOo=; b=GyFW1CjYgdcVDVNOSng4t24bB8EVEtRaqNR4RX0aflLsng/hhL1mx1Yj J1ZRgnzlGRdQw0xMU50IjryzOpQw8+pr+ImAE6Z6xYHkSVpbsZOC7xho2 JcM9CPR9asATH1YGuHIJQf1mtDfeC3yEXl14odUuJsC6rPvyIAZtcexdl U=; X-CSE-ConnectionGUID: Qnw7g2k3RFOUXMEOlULHFg== X-CSE-MsgGUID: DZxaO7RZQjWUyCT5kRiPzw== Authentication-Results: mail2-relais-roc.national.inria.fr; dkim=none (message not signed) header.i=none; spf=SoftFail smtp.mailfrom=caml-list-owner@inria.fr; spf=None smtp.helo=postmaster@prod-sympa-app.inria.fr Received-SPF: SoftFail (mail2-relais-roc.national.inria.fr: domain of caml-list-owner@inria.fr is inclined to not designate 128.93.162.27 as permitted sender) identity=mailfrom; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="caml-list-owner@inria.fr"; x-conformance=spf_only; x-record-type="v=spf1"; x-record-text="v=spf1 ip4:128.93.142.0/24 ip4:192.134.164.0/24 ip4:128.93.162.160 ip4:128.93.162.3 ip4:128.93.162.88 ip4:89.107.174.7 mx ~all" Received-SPF: None (mail2-relais-roc.national.inria.fr: no sender authenticity information available from domain of postmaster@prod-sympa-app.inria.fr) identity=helo; client-ip=128.93.162.27; receiver=mail2-relais-roc.national.inria.fr; envelope-from="caml-list-owner@inria.fr"; x-sender="postmaster@prod-sympa-app.inria.fr"; x-conformance=spf_only X-IronPort-AV: E=Sophos;i="6.23,217,1770591600"; d="asc'?scan'208,217";a="275362255" Received: from prod-sympa-app.inria.fr ([128.93.162.27]) by mail2-relais-roc.national.inria.fr with ESMTP; 05 May 2026 11:36:10 +0200 Received: by prod-sympa-app.inria.fr (Postfix, from userid 990) id 3B8BC820DC; Tue, 5 May 2026 11:36:10 +0200 (CEST) Received: from mail2-relais-roc.national.inria.fr (mail2-relais-roc.national.inria.fr [192.134.164.83]) by prod-sympa-app.inria.fr (Postfix) with ESMTP id 722AE820CD for ; Tue, 5 May 2026 11:35:57 +0200 (CEST) X-CSE-ConnectionGUID: xY3itXBAR2y+h5Bt4vx9lg== X-CSE-MsgGUID: CJ+YZXfWRnSZpw3qnU4TmA== IronPort-SDR: 69f9b9fc_5N23au1SdyV09u9dxO6ZkbsiH+nf2p6w4+ghqqElRdZp0qh fTodNFvFThtGFAQdbSFt8iM7R2EY7hP+CpNhlRw== X-ThreatScanner-Verdict: Negative X-IPAS-Result: =?us-ascii?q?A0GWFAA4uPlphSIeaIFahBZbKRoBbF8ZGgcISQOEGTyDT?= =?us-ascii?q?44lik2HAIp7DYFcgREDGBYhAg4HAQMBCAUuARsEAQIEAQEBAgECAYILgnQCF?= =?us-ascii?q?o0cAh8GAQQ0EwECBAEBAQEDAgMBAQEBAQEBAQEBAQsBAQEEAQEBAgEBAgQDA?= =?us-ascii?q?QEBAQIQAQEBAUBJhhUGNA2CRVFxZQk3AQEBAQEBAQEBAQEBAQEBAQEBAQEBA?= =?us-ascii?q?QEBAQEBAQEBAQEBAQEBAQEBAQEBAgQIAYEQDAIBCAoTAQE4GCMDCQMIAQYDA?= =?us-ascii?q?gQNATUXARIUBoJoAYIgAgJPAwUMBplFm0R6gTKBAYIMAQEGgQg+BRAP2kKBX?= =?us-ascii?q?gkJgU2BWIQagkoPDQEqSWoCAQKET4Q/Jw+BVUSBFTWBc1FvgkoXAQEBARh/J?= =?us-ascii?q?QEBAgZFCQkRgwuCaYIRFYEOgXx8gQaBWwUbJ4FkhB+BSYEhgkIsAVUTFwsHB?= =?us-ascii?q?V6BCAMqLy1uMh2BIz4XNFgbBwWBS4JngVeBA4ReeCMvA052AwttPTcUG4lSE?= =?us-ascii?q?CENgSVEGR0PgTQJJg4fGQUBAjwjAQIRBwkFBQEHAwkBBwgGAQEiLgQEBQMBE?= =?us-ascii?q?AIIEQQBCQEFEAQRCAoDBAEGAwIZAgMMDBIBCAILAQEtA44thBYlFAECKopQp?= =?us-ascii?q?n0dbTQHhB+BXgYMiQiBJpYHhASBV4s8hwKSUiKYZCKCNocogSYJB4JTig4Ii?= =?us-ascii?q?z0NE4VFgX8jPA2BAAwHMxowQ4JnCUccD4R2imEBBQMBgWReQX0teYF0O4Jmv?= =?us-ascii?q?25BNQIBAQ8sBwIHAQsEhWsBAYwsDoFLAQE?= IronPort-PHdr: A9a23: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 IronPort-Data: A9a23:c97M1aPiJcKz5q7vrR2TnMFynXyQoLVcMsEvi/8bNLWB5Y4Qp3Zem TxOHSzEb+HbITHFz+oGPti090MC6JWAzNYwQVBr+Xs3FisSoMGZW4/BIxr9Y32fIsecHR1qt swSY9LMJZhoFnXS+0n0aeTo83J1i6jQHNIQZAK81gVZHGeIHw9810ILd5cFv7NVbfiF7yKlt YKrrZLWYgKr1WMtbW8a4vuJ8B1ksKX8tDhBsgFjbvkX5Q+PnHQ8Ms4jKPDqJRMUYKEER7/gH 76rIJKRpz6CoU91UrtJtp6hLyXml5aLZVDmZkJ+Avbk2l4e4HRrjM7XDdJEAW9PkTKFgttt/ 9tEsJ20WG8BM7bF8Agne0Aw/xpWY+sco9crHVDl6ZbNlxCeLiO1qxlTJBhe0bMwqr4f7V5mr qRwxAAlNnirm++wybSnfehg7uxLBNXrJo4WpkZ7xjjfC/s8KbibK0kdzYIwMJ8Y36iiLN6GD yYrQWMHgCfoOnWjDmwq5KcWwI9EsFGvKmwC8Ar9SZ0fuAA/xCQpuFTk3UG8ltaiHa25lW7Bz o7KEviQ7rj3+7VzxBLcmk9AiNMjkgvradkTCI2S38QwkR6Tm0YPVAMGBF+09KzRZk6WA7qzK mQR6nNota825VCmRdn7XgSlrTiDpBF0t9h4SrdrrljVluyPu0DCWgDoTRYZADAinPQMfmR/7 W6nkobFLml3t7mEVX+W9rGVtC6/fy8PIjoLYSYCCxAO49zivJ0bhBXSSN1uC+iw0s2zHiv/q 9yPhHJh2u5N15dRjs1X+3jsoXGdlKjHcTQz3TfPQTm86D4lWIuMMtnABV/ztqscct3GFjFtp kMskMGb6KUKDIqRvDecRf0EWrCv/feMdjPG6WODBLEk523r43mnbJxd6zF4JV50P4ADYzCBj FLvVR159K4IPWeaR4ZNOZPyC5kA0fT+BYXhWaWBBjZRWaSdYjNr6wlAXyatM43FlVh117k4P YaHfM2sC3cDFKkhyyC5Lwv87VPJ7n5grY8wbcmrp/hC7VZ4TCXIIVviGADeBt3VFIve/G3oH y93bqNmMSmzr9ESkgGMrNJNdg9SRZTKLZ39rMhaPvaEJht6FWohDf7I3L5pdpR+lLw9q9okC kqVAxcCoHKm3C2vAVvRMBhLNuiwNauTWFpgZkTAy37zgCB7Oe5CLc43K/MKQFXQ3Lc8kq8rH 6JUK5/o7zYmYm2vxgnxpKLV9ORKHClHTyrXV8Z8SGFnL8QydB+D4dL+YArk+Q8HCyf954N0o KSt2kmfCdAPThhrRpSeIv++7UKDjV5EksJLXmzMPoZyfmfo+9NUMCDftKI8DPwNDhTh/QGk8 TiqLy0Wn9SQnL9twuL13fiFi6yLD9pBGlFrGjiHzLSuagjf0GmR4a5Bd+eqQQ3ZcXzMxoOQX +BonsvRFawMswdRvrpGF4cxzb831/W2lYQH0A9hFyT6UESrALI9MEjc3dVGhpcV/5B7pweJB 0C9yvxHM4mzZOfgQU8jNSs+T+G5zfpPsCLj3fc0B0Tb5SFM47uMV3tJDSSMkCBwKLhUMpsv5 OUc5P4t9A20jyQ1Pua8jix783qGKloCWf4Fsq42LZDKiA1x7H1/er3ZVzHL5a+QZ+V2MkUFJ iGegIzAje9+wmvAa38CKmjf79FChJghuAF483FaHg6nwuH6v/4Q2AFd1R8VTQ4PlxVO7L9VC 1hRbkZwIf2DwidsiM19RFuTIgBmBiCC20nP2lAMxXz4TU6pazT3F1cDG92xpWIXz2ENWQJg3 uC86H3kWjPUbs3OznMMeUp6mcfCE/111CP/wf6CIerUPqMUQzTfho2WWVEpsDriWMM4u13Gr 7Jl/cF2cqzKChQTqKwaVaif+68hd0yZLzZkRvte+PsFMEvDcmuihDShFUK4VZ5VLMz09Wu9W t1cN+NUdhGEzC3VhCsqNa0NBL5WtvQGyscjVJXpLEFfq7e/lztni43R/S7An10WQ81ivMI+C 4HJfReALzCgvmRVkGrzs8V0AGq0Tt0abgna3uru0uE2O78ckeNrK2ce76CVuiiLDQ5Z4B6kh gPPSKvIxehEy443vY/NEL1GNjqkO+HIS+WE3wCigetgNeqVH5/1iDoUjV37MyB9H7gbAY13n IvQlu/H5hrOubJuXl3Jn5WEKbJy2vyze+hqKePyEmhRmHqTec3r4iZbwVuCF75yrIp/6PWkF iyCU+nhUf4OWtxY+m9ZVDgGLTYZFJbMT/nBoQGTkq2yLyYzgC39EcOf1H72bGtkWDcCFL/gB yTV5fu/xNBqg75dJR0DBvtWDI9cJnX9U4siL+/Okz6SC224jmy/p7G5txwB6C7KOFaAAs3V8 ZLIfTmgVRWQ6YXj7sBVjJx2hTITVE1CuOgXelkP3vJLkBW4MTI2FvscOpA4FZ1kqCz++5Xmb jXrbmF5KyHCcRlbUBf7uvLPYxy+A7EQB9LHOTAZxUOYRCOoDoemArE61CNB4W9zSwTz3tOcN tAS1X3hDCefmqgza74o2cW6puN7ytfx5HECoxn9mvOvJScuO+wB0Xg5ETddUSDCLdr2q3zKA moIXkFBflCwTB/gMMRnekMNIiojghHU82wKYxuMkfHlgKfK/N0Ynbe7c6v236YYZcsHGK8WS DmlDyGR6mSRwToItbFvp9sthrRuBOmWGtShapXuXhAWg7r6/1FP0xnuRsbTZJpKFM9j/1Lhe v2E5mhnQlyCLFFN1baWzwQQ5p83VWgDZ90MpBCqvifIyHTV0PCAEyVGDiqiQX0zl0Qnl09fX TEZYV3XpgGG8jz+qlGSc9wF80efD5h5+WbsC0gVo1CbrvtoYHdaEKF93ko60dNI7XACwZ9bH EpUPxPR56r/Nh6yM8vYcBv1r1SpQ3rt2ujOtlMxwC9WKw== IronPort-HdrOrdr: A9a23:3Y3Uh6+dLYMxnRY5qcxuk+DLI+orL9Y04lQ7vn2ZKCYlEPBw8v rEoB11726RtN98YhAdcLO7Scq9qA3nhPtICOAqVN/JMTUO3lHJEGgI1+TfKlPbdxEWjtQy6Z td X-Talos-CUID: 9a23:G2X5tmDlPXZmxVn6EzlWr08IKuoMSCfMj3eNCVPkF3Y4TLLAHA== X-Talos-MUID: =?us-ascii?q?9a23=3A1Xgx5A+tTIYMIVPER0dvbDWQf+xKoJWcOE4yq5M?= =?us-ascii?q?9idGbbjV2BmuhiR3iFw=3D=3D?= X-IronPort-Anti-Spam-Filtered: true X-IronPort-AV: E=Sophos;i="6.23,217,1770591600"; d="asc'?scan'208,217";a="275362121" X-IronPort-Outbreak-Status: No, level 0, Unknown - Unknown X-MGA-submission: =?us-ascii?q?MDGHvcVibp1tjxk6vFSHMaLWJBHGc5IpOlLDN4?= =?us-ascii?q?GCaB6qkqKRmTzec7zjcMt+SMt0LESrcQnL5WsI1bTL1rdTW69OiaCLjw?= =?us-ascii?q?s/5mRNfGvcSBlklCzRo5189rnbzXF1ML2OrptIwTA65gr9xa1n7RCwk8?= =?us-ascii?q?8FlNZqkvr4UjHx1OpwAuzj2g=3D=3D?= Received: from mx1.polytechnique.org ([129.104.30.34]) by mail2-smtp-roc.national.inria.fr with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 05 May 2026 11:35:56 +0200 Received: from mac-03220211.irisa.fr (mac-03220211.irisa.fr [131.254.21.249]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ssl.polytechnique.org (Postfix) with ESMTPSA id D68E81A39C; Tue, 5 May 2026 11:35:55 +0200 (CEST) From: Alan Schmitt To: "lwn" , caml-list@inria.fr Date: Tue, 05 May 2026 11:35:53 +0200 Message-ID: MIME-Version: 1.0 Content-Type: multipart/signed; boundary="===-=-="; micalg=pgp-sha256; protocol="application/pgp-signature" X-AV-Checked: ClamAV using ClamSMTP at svoboda.polytechnique.org (Tue May 5 11:35:56 2026 +0200 (CEST)) X-Spam-Flag: Unsure, tests=bogofilter, spamicity=0.495977, queueID=033881A4C7 X-Org-Mail: alan.schmitt.1995@polytechnique.org Subject: [Caml-list] Attn: Development Editor, Latest OCaml Weekly News Reply-To: Alan Schmitt X-Loop: caml-list@inria.fr X-Sequence: 19504 Errors-To: caml-list-owner@inria.fr Precedence: list Precedence: bulk Sender: caml-list-request@inria.fr X-no-archive: yes List-Id: List-Help: , List-Subscribe: , List-Unsubscribe: , List-Post: List-Owner: List-Archive: Archived-At: --===-=-= Content-Type: multipart/mixed; boundary="=-=-=" --=-=-= Content-Type: multipart/alternative; boundary="==-=-=" --==-=-= Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: base64 SGVsbG8NCg0KSGVyZSBpcyB0aGUgbGF0ZXN0IE9DYW1sIFdlZWtseSBOZXdzLCBmb3IgdGhlIHdl ZWsgb2YgQXByaWwgMjggdG8gTWF5DQowNSwgMjAyNi4NCg0KVGFibGUgb2YgQ29udGVudHMNCuKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQpPYyDi gJQgYSBDYXJnby1saWtlIENMSSBmb3IgT0NhbWwgYmVnaW5uZXJzIChBSS1hc3Npc3RlZCwgZmVl ZGJhY2sgdmVyeSB3ZWxjb21lKQ0KRHVuZSBQYWNrYWdlIE1hbmFnZW1lbnQgVXBkYXRlcw0KT0Nh bWwgVXNlcnMgU3VydmV5IDIwMjYNCk9DYW1sIFdlYiB0dXRvcmlhbHMNClZhbGtleSAwLjMuMTog Y2xpZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmcgcG9vbHMsIElBTSBhdXRoIGFuZCBtVExTDQpP bGQgQ1dODQoNCg0KT2Mg4oCUIGEgQ2FyZ28tbGlrZSBDTEkgZm9yIE9DYW1sIGJlZ2lubmVycyAo QUktYXNzaXN0ZWQsIGZlZWRiYWNrIHZlcnkgd2VsY29tZSkNCuKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6 DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3Qvb2MtYS1jYXJnby1saWtlLWNsaS1mb3It b2NhbWwtYmVnaW5uZXJzLWFpLWFzc2lzdGVkLWZlZWRiYWNrLXZlcnktd2VsY29tZS8xODAyMC8x Pg0KDQoNCkVtaWwgS2xvZWRlbiBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25l LA0KDQogIEknbSBhIG5ld2NvbWVyIHRvIE9DYW1sLCBhbmQgb25lIG9mIHRoZSB0aGluZ3MgdGhh dCBoYXMgc2xvd2VkIG1lIGRvd24NCiAgaXMgdGhlIHRvb2xpbmcgc2V0dXA6IHVuZGVyc3RhbmRp bmcgb3BhbSBzd2l0Y2hlcywgcmVtZW1iZXJpbmcgdG8NCiAgYGV2YWwgJChvcGFtIGVudiknLCBr bm93aW5nIHdoZW4gdG8gcmVnZW5lcmF0ZSBgLm9wYW1+ZmlsZXMuIFNvDQogICh0b2dldGhlciB3 aXRoIENsYXVkZSBDb2RlKSBJIGJ1aWx0IH5vYycgLSBhIHNtYWxsIENMSSB0aGF0IHdyYXBzDQog IGBvcGFtJyBhbmQgYGR1bmUnIGFuZCBnaXZlcyB0aGVtIGEgQ2FyZ28tIG9yIHV2LWxpa2UgaW50 ZXJmYWNlOg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb2MgbmV3IG15X2FwcCAjIHNjYWZm b2xkIHByb2plY3QgKyBpbml0aWFsaXNlIGlzb2xhdGVkIHN3aXRjaA0KICDilIIgb2MgYWRkIHlv anNvbiAjIGFkZCBkZXBlbmRlbmN5LCB1cGRhdGUgb2MudG9tbCwgaW5zdGFsbA0KICDilIIgb2Mg YnVpbGQgIyBlbnN1cmUgZGVwcywgZHVuZSBidWlsZA0KICDilIIgb2MgcnVuICMgZW5zdXJlIGRl cHMsIGR1bmUgZXhlYw0KICDilJTilIDilIDilIDilIANCg0KICBObyBgb3BhbSBzd2l0Y2ggY3Jl YXRlJywgbm8gYGV2YWwgJChvcGFtIGVudiknLCBubyBoYW5kLWVkaXRpbmcNCiAgYC5vcGFtJyBm aWxlcy4NCg0KDQpXaGF0IGl0IGlzOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM DQoNCiAgQSBzbWFsbCwgdGhpbiBvcmNoZXN0cmF0aW9uIGxheWVyIHdpdGggbm8gZGVwZW5kZW5j aWVzIGJleW9uZCBvcGFtIGFuZA0KICBkdW5lIHRoZW1zZWx2ZXMuIEl0IGNhbGxzIG9wYW0gdG8g bWFuYWdlIHN3aXRjaGVzIGFuZCByZXNvbHZlDQogIHBhY2thZ2VzLCBhbmQgZHVuZSB0byBidWls ZCAtIHdyYXBwaW5nIHRoZSB0b29scyB0aGUgY29tbXVuaXR5IGFscmVhZHkNCiAgdXNlcyBhbmQg dHJ1c3RzIHJhdGhlciB0aGFuIHJlcGxhY2luZyB0aGVtLiBJdCBkZWxpYmVyYXRlbHkgZG9lcyBs ZXNzOg0KICBpZiB5b3Ugd2FudCBmdWxsIGNvbnRyb2wgb3ZlciB5b3VyIGVudmlyb25tZW50LCBv cGFtIGdpdmVzIHlvdSB0aGF0DQogIGRpcmVjdGx5Lg0KDQoNCldoYXQgaXQgaXNuJ3Q6DQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBBIHJlcGxhY2VtZW50 IGZvciBvcGFtIG9yIGR1bmUuIFRoZSBpbnRlbnRpb24gaXMgdG8gb2ZmZXIgYSBzaW1wbGVyDQog IHN1cmZhY2UgZm9yIHRob3NlIHdobyBwcmVmZXIgaXQsIHdoZXRoZXIgeW91J3JlIGp1c3Qgc3Rh cnRpbmcgb3V0IG9yDQogIHlvdSd2ZSBiZWVuIHdyaXRpbmcgT0NhbWwgZm9yIHllYXJzIGFuZCB3 YW50IGxlc3MgY2VyZW1vbnkgZm9yDQogIGV2ZXJ5ZGF5IHRhc2tzLg0KDQoNCkEgbm90ZSBvbiBB SSBhc3Npc3RhbmNlOg0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWM4pWMDQoNCiAgSSBzaG91bGQgYmUgdXBmcm9udDog dGhpcyBwcm9qZWN0IHdhcyBkZXZlbG9wZWQgYWxtb3N0IGVudGlyZWx5IHdpdGgNCiAgdGhlIGhl bHAgb2YgQ2xhdWRlIENvZGUuIEkgd3JvdGUgdGhlIHNwZWNzLCBtYWRlIHRoZSBkZXNpZ24gZGVj aXNpb25zLA0KICBhbmQgcmV2aWV3ZWQgZXZlcnl0aGluZyAtIGJ1dCB0aGUgY29kZSBpcyBhbG1v c3QgZW50aXJlbHkNCiAgQUktZ2VuZXJhdGVkLiBJIHRoaW5rIHRoYXQncyB3b3J0aCBuYW1pbmcs IGJvdGggZm9yIHRyYW5zcGFyZW5jeSBhbmQNCiAgYmVjYXVzZSBpdCdzIGFuIGludGVyZXN0aW5n IGNhc2Ugc3R1ZHkgaW4gd2hhdCBBSS1hc3Npc3RlZCBkZXZlbG9wbWVudA0KICBsb29rcyBsaWtl IGZvciBhIHNtYWxsIHRvb2wuDQoNCg0KUHJpb3IgYXJ0Og0K4pWM4pWM4pWM4pWM4pWM4pWM4pWM 4pWM4pWM4pWMDQoNCiAgSSdtIGF3YXJlIG9mIGEgZmV3IHNpbWlsYXIgZWZmb3J0cy4gYGVzeScg aXMgdGhlIGNsb3Nlc3QgaW4gc3Bpcml0IC0NCiAgc2FuZGJveGVkIGJ1aWxkcywgYSBsb2NrIGZp bGUsIGEgc2ltcGxlciBtYW5pZmVzdCAtIGJ1dCBpdCBtYWtlcyBzb21lDQogIGRpZmZlcmVudCBj aG9pY2VzOiBpdCByZXF1aXJlcyBOb2RlLmpzIChgbnBtIGluc3RhbGwgLWcgZXN5JykgYW5kDQog IGJyaW5ncyBpdHMgb3duIGRlcGVuZGVuY3kgcmVzb2x2ZXIgcmF0aGVyIHRoYW4gZGVsZWdhdGlu ZyB0bw0KICBvcGFtLiBgb2MnIGlzIGEgbmFycm93ZXIgdG9vbDogbm8gYWRkaXRpb25hbCBydW50 aW1lIGRlcGVuZGVuY2llcywNCiAgc3RheXMgb24gdG9wIG9mIHN0YW5kYXJkIG9wYW0gYW5kIGR1 bmUsIGFuZCB0cmFkZXMgcG93ZXIgZm9yDQogIHNpbXBsaWNpdHkufiBkdW5lIGluaXQgcHJvamVj dH4gaGFuZGxlcyBzY2FmZm9sZGluZyBidXQgbGVhdmVzIHN3aXRjaA0KICBtYW5hZ2VtZW50IHRv IHlvdS4gb3BhbSdzIG93biBsb2NhbCBzd2l0Y2hlcyAoYG9wYW0gc3dpdGNoIGNyZWF0ZQ0KICAu IDUuMi4wJykgYXJlIGVzc2VudGlhbGx5IHdoYXQgYG9jJyBhdXRvbWF0ZXMsIGJ1dCB5b3Ugc3Rp bGwgaGF2ZSB0bw0KICBkcml2ZSB0aGVtIG1hbnVhbGx5LiBJZiB0aGVyZSdzIHNvbWV0aGluZyBJ J3ZlIG1pc3NlZCB0aGF0IGFscmVhZHkNCiAgc29sdmVzIHRoaXMgY2xlYW5seSwgSSdkIGdlbnVp bmVseSBsaWtlIHRvIGtub3cuDQoNCg0KV2h5IG5vdCBqdXN0IHNoZWxsIGFsaWFzZXM/DQrilYzi lYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYwNCg0KICBZb3UgcHJvYmFibHkgY291bGQgZ2V0IGNsb3NlIHdp dGggYSBmZXcgc2hlbGwgZnVuY3Rpb25zLiBUaGUgcmVhc29ucyBJDQogIHdlbnQgZnVydGhlcjog YSBjcm9zcy1wbGF0Zm9ybSBiaW5hcnkgbmVlZHMgbm8gc2hlbGwgc2V0dXAsIHRoZQ0KICBsb2Nr ZmlsZSBnaXZlcyByZXByb2R1Y2libGUgYnVpbGRzIGFjcm9zcyBtYWNoaW5lcywgYW5kIGhhdmlu ZyBhDQogIHNpbmdsZSBgb2MudG9tbCcgYXMgdGhlIHNvdXJjZSBvZiB0cnV0aCBpcyBjbGVhbmVy IHRoYW4gcmVtZW1iZXJpbmcNCiAgd2hpY2ggb3BhbSBjb21tYW5kcyB0byBydW4uIFdoZXRoZXIg dGhhdCdzIHdvcnRoIGl0IGlzIGEgZmFpcg0KICBxdWVzdGlvbi4NCg0KDQpXaHkgR28sIG5vdCBP Q2FtbDoNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjA0KDQogIFBhcnRseSB0aGUgYm9vdHN0cmFwcGluZyBwcm9ibGVtIOKAlCBpdCBmZWx0IG9k ZCB0byB3cml0ZSBhIHRvb2wgdGhhdA0KICBoZWxwcyB5b3Ugc2V0IHVwIE9DYW1sIGJlZm9yZSB5 b3UgY2FuIHNldCB1cCBPQ2FtbC4gTW9yZSBwcmFjdGljYWxseSwNCiAgR28gbWFkZSBpdCBlYXN5 IHRvIHNoaXAgYSBzaW5nbGUgc3RhdGljIGJpbmFyeSB3aXRoIG5vIHJ1bnRpbWUNCiAgZGVwZW5k ZW5jaWVzLCBhbmQgaXQgbGV0IG1lIGJ1aWxkIGFuZCBpdGVyYXRlIG9uIHRoZSB0b29sIHF1aWNr bHkuIEknbQ0KICBub3QgYWdhaW5zdCBhIHBvcnQgdG8gT0NhbWwgaWYgc29tZW9uZSB3YW50ZWQg dG8gdGFrZSB0aGF0IG9uLg0KDQoNCkN1cnJlbnQgc3RhdGU6DQrilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGUgdG9vbCB3b3JrcyBmb3IgbXkgcGVyc29u YWwgdXNlLCBoYXMgYSB0ZXN0IHN1aXRlLCBhIGxvY2tmaWxlLCBhbmQNCiAgYmFzaWMgQ0kuIEl0 J3Mgcm91Z2ggYXJvdW5kIHRoZSBlZGdlcyBhbmQgSSdtIHN1cmUgdGhlcmUgYXJlIHRoaW5ncw0K ICB0aGF0IHdvdWxkIG1ha2UgYW4gZXhwZXJpZW5jZWQgT0NhbWwgZGV2ZWxvcGVyIHdpbmNlLiBU aGF0J3MgcGFydCBvZg0KICB3aHkgSSdtIHBvc3RpbmcgLSBJJ2QgZ2VudWluZWx5IHZhbHVlIGZl ZWRiYWNrIG9uOg0KICDigKIgRG9lcyB0aGlzIHNvbHZlIGEgcmVhbCBwcm9ibGVtLCBvciBkb2Vz IHRoZSBjb21tdW5pdHkgaGF2ZSBiZXR0ZXINCiAgICBhbnN3ZXJzIEkgbWlzc2VkPw0KICDigKIg QXJlIHRoZXJlIGNvcnJlY3RuZXNzIGlzc3VlcyB3aXRoIGhvdyBgb2MnIG1hbmFnZXMgc3dpdGNo ZXMgb3INCiAgICBnZW5lcmF0ZXMgYC5vcGFtJyBmaWxlcz8NCiAg4oCiIFdoYXQncyBtaXNzaW5n IGJlZm9yZSB0aGlzIHdvdWxkIGJlIHVzZWZ1bCB0byB5b3U/DQoNCiAgVGhlIGhvbWVwYWdlIGlz IGF0IFtlbWlsa2xvZWRlbi5naXRodWIuaW8vb2MgXSBhbmQgdGhlIHNvdXJjZSBpcyBhdA0KICBb Z2l0aHViLmNvbS9lbWlsa2xvZWRlbi9vY10uDQoNCiAgVGhhbmtzIGZvciByZWFkaW5nIGFuZCBJ IGxvb2sgZm9yd2FyZCB0byB5b3VyIGZlZWRiYWNrLg0KDQoNCltlbWlsa2xvZWRlbi5naXRodWIu aW8vb2MgXSA8aHR0cHM6Ly9lbWlsa2xvZWRlbi5naXRodWIuaW8vb2M+DQoNCltnaXRodWIuY29t L2VtaWxrbG9lZGVuL29jXSA8aHR0cHM6Ly9naXRodWIuY29tL2VtaWxrbG9lZGVuL29jPg0KDQoN CkR1bmUgUGFja2FnZSBNYW5hZ2VtZW50IFVwZGF0ZXMNCuKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKVkOKV kOKVkOKVkOKVkOKVkA0KDQogIEFyY2hpdmU6DQogIDxodHRwczovL2Rpc2N1c3Mub2NhbWwub3Jn L3QvZHVuZS1wYWNrYWdlLW1hbmFnZW1lbnQtdXBkYXRlcy8xODAyMy8xPg0KDQoNClNob24gYW5u b3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBI ZWxsbyEgVGhlIFRhcmlkZXMgdGVhbSBpcyB3cml0aW5nIHRvIHNoYXJlIHVwZGF0ZXMgb24gRHVu ZSBwYWNrYWdlDQogIG1hbmFnZW1lbnQuDQoNCg0KQ29udGV4dA0K4pWM4pWM4pWM4pWM4pWM4pWM 4pWMDQoNCiAgRHVuZSBwYWNrYWdlIG1hbmFnZW1lbnQgYWltcyB0byBpbXByb3ZlIHNvbWUgZGV2 ZWxvcGVyIHdvcmtmbG93cyBieQ0KICBzaW1wbGlmeWluZyB0aGUgdXNlIG9mIG9wYW0gZGVwZW5k ZW5jaWVzIGluIHByb2plY3RzIGJ1aWx0IHdpdGgNCiAgRHVuZS4gVG8gbGVhcm4gbW9yZSwgc2Vl IHRoZSB0dXRvcmlhbCwgW09DYW1sIFBhY2thZ2UgTWFuYWdlbWVudCBXaXRoDQogIER1bmVdLg0K DQogIEl04oCZcyBiZWVuIHRvbyBsb25nIHNpbmNlIHdlIHNoYXJlZCBhbiB1cGRhdGUsIGVzcGVj aWFsbHkgY29uc2lkZXJpbmcNCiAgb3VyIGdyYXRpdHVkZSBmb3IgW2FsbCB0aGUgZXhjZWxsZW50 IGZlZWRiYWNrXSB3ZSBoYXZlIHJlY2VpdmVkLiBCdXQNCiAgRHVuZSBjb250cmlidXRvcnMgaGF2 ZSBiZWVuIGhhcmQgYXQgd29yayBbZml4aW5nIGlzc3Vlc10gYW5kIHNvbHZpbmcNCiAgdHJpY2t5 IGFyY2hpdGVjdHVyYWwgc25hZ3MgcHJlc2VudCBpbiB0aGUgcHJldmlvdXMgaXRlcmF0aW9uLg0K DQoNCltPQ2FtbCBQYWNrYWdlIE1hbmFnZW1lbnQgV2l0aCBEdW5lXQ0KPGh0dHBzOi8vZHVuZS5y ZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50 L2luZGV4Lmh0bWw+DQoNClthbGwgdGhlIGV4Y2VsbGVudCBmZWVkYmFja10NCjxodHRwczovL2dp dGh1Yi5jb20vb2NhbWwvZHVuZS9pc3N1ZXM/cT1pcyUzQWlzc3VlJTIwc3RhdGUlM0FvcGVuJTIw bGFiZWwlM0ElMjJwYWNrYWdlJTIwbWFuYWdlbWVudCUyMj4NCg0KW2ZpeGluZyBpc3N1ZXNdDQo8 aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUvcHVsbHM/cT1pcyUzQXByK3BrZytpcyUzQWNs b3NlZD4NCg0KDQpBdmFpbGFibGUgbm93DQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYwNCg0KICBUaGFua3MgdG8gbWFueSBjb250cmlidXRvcnMsIHRoZSBmb2xsb3dpbmcg ZnVuY3Rpb25hbGl0aWVzIGFyZQ0KICBhdmFpbGFibGUgb24gTGludXggYW5kIE1hY09TIGluIHRo ZSBsYXRlc3QgcmVsZWFzZSBvZiBEdW5lICgzLjIyKToNCg0KICDigKIgW21hbmFnaW5nIGRlcGVu ZGVuY2llcyBwdWJsaXNoZWQgaW4gb3BhbSByZXBvc2l0b3JpZXNdICh0aGUgW3Zhc3QNCiAgICBt YWpvcml0eSBvZiBvcGFtIHBhY2thZ2VzIGFyZSBzdXBwb3J0ZWRdLCBidXQgbm90IGFsbCkNCiAg 4oCiIFtwaW5uaW5nIGRlcGVuZGVuY2llcyAocmVjdXJzaXZlbHkpXQ0KICDigKIgW3N1cHBvcnQg Zm9yIGN1c3RvbSBvcGFtLXJlcG9zaXRvcmllc10gKHdoaWNoLCBmb3IgZXhhbXBsZSwgY2FuIGJl DQogICAgdXNlZCBmb3IgT3hDYW1sIHByb2plY3RzIGJ5IGZvbGxvd2luZyB0aGlzIFtkb2N1bWVu dGVkIGNvbmZpZ3VyYXRpb24NCiAgICByZWNpcGVdKQ0KICDigKIgW2xvY2tpbmcgZGVwZW5kZW5j eSB2ZXJzaW9uc10sIHRvIHByb3ZpZGUgYSByZXByb2R1Y2libGUgZW52aXJvbm1lbnQNCiAgICBm b3IgZGV2ZWxvcGVycyBhbmQgQ0kgKHBvcnRhYmx5LCBhY3Jvc3Mgc3VwcG9ydGVkIHBsYXRmb3Jt cykNCiAg4oCiIFtzdXBwb3J0IGZvciBtYW5hZ2luZyBzZWxlY3QgZGV2ZWxvcGVyIHRvb2xpbmdd IChzaGFreSwgYnV0IHVzYWJsZQ0KICAgIG9uIHRoZSBoYXBweSBwYXRoKQ0KICDigKIgbW9zdCBy ZWNlbnRseSwgd2XigJl2ZSBbYWRkZWQgc3VwcG9ydF0gZm9yIHRoZSBbcmVsb2NhdGFibGUgY29t cGlsZXJdDQoNCiAgQWRkaXRpb25hbGx5LCB0aGUgZm9sbG93aW5nIHN1cHBvcnRpbmcgdXRpbGl0 aWVzIGFyZSBhdmFpbGFibGU6DQoNCiAg4oCiIFthIGJpbmFyeSBkaXN0cmlidXRpb24gZm9yIHN1 cHBvcnRlZCBwbGF0Zm9ybXNdIG9mZmVyaW5nIG5pZ2h0bHkNCiAgICBidWlsZHMgYW5kIHJlbGVh c2VkIHZlcnNpb25zDQogIOKAoiBbc2V0dXAtZHVuZV0sIGEgR2l0SHViIGFjdGlvbiBlbmFibGlu ZyBxdWljayBhbmQgZWFzeSBDSSBmb3INCiAgICBwcm9qZWN0cyB0aGF0IHVzZSBkdW5lIHBhY2th Z2UgbWFuYWdlbWVudA0KDQoNClttYW5hZ2luZyBkZXBlbmRlbmNpZXMgcHVibGlzaGVkIGluIG9w YW0gcmVwb3NpdG9yaWVzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9zdGFibGUv dHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50L3NldHVwLmh0bWwjZGVjbGFyZS1kZXBl bmRlbmNpZXM+DQoNClt2YXN0IG1ham9yaXR5IG9mIG9wYW0gcGFja2FnZXMgYXJlIHN1cHBvcnRl ZF0NCjxodHRwczovL2R1bmUuY2hlY2suY2kuZGV2Lz4NCg0KW3Bpbm5pbmcgZGVwZW5kZW5jaWVz IChyZWN1cnNpdmVseSldDQo8aHR0cHM6Ly9kdW5lLnJlYWR0aGVkb2NzLmlvL2VuL3N0YWJsZS90 dXRvcmlhbHMvZHVuZS1wYWNrYWdlLW1hbmFnZW1lbnQvcGlubmluZy5odG1sPg0KDQpbc3VwcG9y dCBmb3IgY3VzdG9tIG9wYW0tcmVwb3NpdG9yaWVzXQ0KPGh0dHBzOi8vZHVuZS5yZWFkdGhlZG9j cy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50L3JlcG9zLmh0 bWw+DQoNCltkb2N1bWVudGVkIGNvbmZpZ3VyYXRpb24gcmVjaXBlXQ0KPGh0dHBzOi8vZHVuZS5y ZWFkdGhlZG9jcy5pby9lbi9zdGFibGUvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5hZ2VtZW50 L294Y2FtbC5odG1sPg0KDQpbbG9ja2luZyBkZXBlbmRlbmN5IHZlcnNpb25zXQ0KPGh0dHBzOi8v ZHVuZS5yZWFkdGhlZG9jcy5pby9lbi9sYXRlc3QvdHV0b3JpYWxzL2R1bmUtcGFja2FnZS1tYW5h Z2VtZW50L2xvY2tpbmcuaHRtbD4NCg0KW3N1cHBvcnQgZm9yIG1hbmFnaW5nIHNlbGVjdCBkZXZl bG9wZXIgdG9vbGluZ10NCjxodHRwczovL2R1bmUucmVhZHRoZWRvY3MuaW8vZW4vbGF0ZXN0L3Jl ZmVyZW5jZS9kdW5lLXRvb2xzLmh0bWw+DQoNClthZGRlZCBzdXBwb3J0XSA8aHR0cHM6Ly9naXRo dWIuY29tL29jYW1sL2R1bmUvcHVsbC8xMzMyMT4NCg0KW3JlbG9jYXRhYmxlIGNvbXBpbGVyXQ0K PGh0dHBzOi8vd3d3LmRyYTI3LnVrL2Jsb2cvcGxhdGZvcm0vMjAyNS8xMi8xNy9pdHMtbWVyZ2Vk Lmh0bWw+DQoNClthIGJpbmFyeSBkaXN0cmlidXRpb24gZm9yIHN1cHBvcnRlZCBwbGF0Zm9ybXNd DQo8aHR0cHM6Ly9uaWdodGx5LmR1bmUuYnVpbGQvPg0KDQpbc2V0dXAtZHVuZV0gPGh0dHBzOi8v Z2l0aHViLmNvbS9vY2FtbC1kdW5lL3NldHVwLWR1bmU+DQoNCg0KQ3VycmVudCBzdGF0dXMgYW5k IGZvY3VzDQrilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzilYzi lYzilYzilYzilYzilYzilYzilYzilYwNCg0KICBUaGFua3MgdG8gc2V2ZXJhbCByZWd1bGFyIHVz ZXJzIGluIHRoZSBjb21tdW5pdHkgYW5kIHVzYWdlIGluIG1hbnkgb2YNCiAgdGhlIENJIHN5c3Rl bXMgd2UgbWFpbnRhaW4sIHdlIGFyZSBnYXRoZXJpbmcgb25nb2luZyBmZWVkYmFjayBhbmQNCiAg ZXhlcmNpc2luZyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5LiBIb3dldmVyLCBvdXIgdGVzdGluZyBo YXMgc2hvd24gdGhlDQogIGZlYXR1cmVzIGFyZSBub3QgeWV0IG1hdHVyZSBlbm91Z2ggdG8gcmVj b21tZW5kIHdpZGVyIHVzZSwgYmV5b25kDQogIGVhZ2VyIGFuZCBlYXJseSBhZG9wdGVycy4gQ29u c2VxdWVudGx5LCBhbGwgdGhlIGRvY3VtZW50YXRpb24gd2FybnMNCiAgdGhhdCB0aGlzIGZ1bmN0 aW9uYWxpdHkgaXMgZXhwZXJpbWVudGFsIGFuZCBzdWJqZWN0IHRvIGNoYW5nZS4NCg0KICBXZSBh cmUgY3VycmVudGx5IGZvY3VzZWQgb24gbWF0dXJpbmcgcGFja2FnZSBtYW5hZ2VtZW50IGJleW9u ZCBpdHMNCiAgZXhwZXJpbWVudGFsIHN0YXR1cy4gVGhpcyByZXF1aXJlcyByZXdvcmtpbmcgdGhl IGRldmVsb3BlciB0b29saW5nDQogIHN1cHBvcnQsIHN1cHBvcnRpbmcgcGFja2FnZXMgdGhhdCB1 c2Ugc3ltbGlua3MsIGFuZCBlbnN1cmluZyB3ZSBjYW4NCiAgZG9nZm9vZCBEdW5lIHBhY2thZ2Ug bWFuYWdlbWVudCBpbiBpdHMgb3duIGRldmVsb3BtZW50LiBUaGUgYmVzdCBwbGFjZQ0KICB0byBs b29rIGZvciB3aGF0IHdlIGhhdmUgcGxhbm5lZCBpbiB0aGlzIGN1cnJlbnQgcGhhc2UgaXMNCiAg W05vbi1leHBlcmltZW50YWwgcGFja2FnZSBtYW5hZ2VtZW50IMK3IE1pbGVzdG9uZSAjNjIgwrcg b2NhbWwvZHVuZV0uDQoNCg0KW05vbi1leHBlcmltZW50YWwgcGFja2FnZSBtYW5hZ2VtZW50IMK3 IE1pbGVzdG9uZSAjNjIgwrcgb2NhbWwvZHVuZV0NCjxodHRwczovL2dpdGh1Yi5jb20vb2NhbWwv ZHVuZS9taWxlc3RvbmUvNjI+DQoNCg0KTmV4dCAgdXANCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jA0KDQogIEFmdGVyIG1hdHVyaW5nIHRoZSBjb3JlIGZ1bmN0aW9uYWxpdHksIHdlIHdpbGwgdHVy biBvdXIgZm9jdXMgdG8NCiAgZXh0ZW5kaW5nIHRoZSBzdXBwb3J0ZWQgcGxhdGZvcm1zIGFuZCBp bXByb3ZpbmcgZWNvc3lzdGVtDQogIGludGVncmF0aW9uLiBUaGlzIHdvcmsgd2lsbCBpbmNsdWRl IGFkZGluZyBzdXBwb3J0IGZvciBXaW5kb3dzLA0KICBpbXByb3ZpbmcgY3Jvc3MtY29tcGlsYXRp b24sIHN1cHBvcnRpbmcgYWR2YW5jZWQgdmVuZG9yaW5nIHdvcmtmbG93cywNCiAgYW5kIGludGVn cmF0aW5nIER1bmUgcGFja2FnZSBtYW5hZ2VtZW50IGludG8gdGhlICpvcGFtLWNpKi4gTW9yZQ0K ICB1cGRhdGVzIGFuZCBtb3JlIGFjY2Vzc2libGUgcGxhbm5pbmcgd2lsbCBmb2xsb3cuDQoNCg0K SW5wdXQgYW5kIGNvbnRyaWJ1dGlvbnMNCuKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKV jOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjOKVjA0KDQogIFBsZWFzZSBbcmVhY2gg b3V0XSBpZiB5b3UgZmluZCB0aGlzIHdvcmsgaW50ZXJlc3RpbmcgYW5kIHdvdWxkIGxpa2UgdG8N CiAgaGVscCENCg0KDQpbcmVhY2ggb3V0XSA8aHR0cHM6Ly9naXRodWIuY29tL29jYW1sL2R1bmUv YmxvYi9tYWluL0NPTlRSSUJVVElORy5tZD4NCg0KDQpPQ2FtbCBVc2VycyBTdXJ2ZXkgMjAyNg0K 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJjaGl2ZToNCiAgPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcv dC9hbm4tb2NhbWwtdXNlcnMtc3VydmV5LTIwMjYvMTgwMjYvMT4NCg0KDQpTYWJpbmUgU2NobWFs dHogYW5ub3VuY2VkDQrilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDi lIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIANCg0KICBIaSBldmVyeW9uZSwNCg0KICBP biBiZWhhbGYgb2YgdGhlIFtPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uXSAoT0NTRiksIEknbSBk ZWxpZ2h0ZWQgdG8NCiAgYW5ub3VuY2UgdGhlICpPQ2FtbCBVc2VycyBTdXJ2ZXkgMjAyNiouIFdl IGludml0ZSB5b3UgdG8gdGFrZSAxMCB0byAxNQ0KICBtaW51dGVzIHRvIGZpbGwgaXQgb3V0IGFu ZCB0byBzaGFyZSBpdCB3aXRoIG90aGVyIE9DYW1sIHByb2dyYW1tZXJzLg0KDQogICpTdXJ2ZXkg bGluazoqIDxodHRwczovL2Zvcm1zLmdsZS9ndDVuaWtxVW1vUVdlWVlROT4NCg0KICA8aHR0cHM6 Ly9mb3Jtcy5nbGUvZ3Q1bmlrcVVtb1FXZVlZUTk+DQoNCiAgVGhlIHN1cnZleSB3aWxsIHJlbWFp biBvcGVuIHVudGlsICpNYXkgMjV0aCwgMjAyNiAoQU9FKSouDQoNCiAgVGhpcyB5ZWFyJ3MgZWRp dGlvbiBidWlsZHMgb24gdGhlIFsyMDIzIGl0ZXJhdGlvbl0uIE1hbnkgcXVlc3Rpb25zIGFyZQ0K ICBrZXB0IGNvbXBhcmFibGUgc28gd2UgY2FuIHRyYWNrIHRyZW5kcyBvdmVyIHRpbWUsIHdoaWxl IG90aGVycyBoYXZlDQogIGJlZW4gcmVmcmVzaGVkLCBmaXhlZCwgb3IgYWRkZWQgYmFzZWQgb24g Y29tbXVuaXR5IGZlZWRiYWNrIGdhdGhlcmVkDQogIGVhcmxpZXIgdGhpcyB5ZWFyIChbZmVlZGJh Y2sgdGhyZWFkXSkuIE5vdGFibGUgYWRkaXRpb25zIGluY2x1ZGUNCiAgcXVlc3Rpb25zIG9uIEFJ L0xMTSB0b29saW5nIGFuZCBvbiBkZWJ1Z2dpbmcgJiBwcm9maWxpbmcuDQoNCiAgQSBmZXcgbm90 ZXM6DQoNCiAg4oCiIFRoZSBzdXJ2ZXkgaXMgYWRtaW5pc3RlcmVkIHZpYSBHb29nbGUgRm9ybXMg YnV0IGNvbmZpZ3VyZWQgdG8gKm5vdCoNCiAgICByZXF1aXJlIHNpZ25pbmcgaW4gdG8gYSBHb29n bGUgYWNjb3VudCwgYW5kIGFuc3dlcnMgYXJlIG5vdCB0aWVkIHRvDQogICAgYW55IGFjY291bnQu IEFzIGEgY29uc2VxdWVuY2UsIHlvdXIgcHJvZ3Jlc3MgaXMgKm5vdCogc2F2ZWQgaWYgeW91DQog ICAgY2xvc2UgeW91ciBicm93c2VyIHRhYiBiZWZvcmUgZmluaXNoaW5nLg0KICDigKIgQWxsIHF1 ZXN0aW9ucyBhcmUgb3B0aW9uYWwuDQogIOKAoiBQbGVhc2UgYXZvaWQgZW50ZXJpbmcgcGVyc29u YWwgaW5mb3JtYXRpb24gaW4gZnJlZS1mb3JtIHRleHQgZmllbGRzOg0KICAgIHRoZSByYXcgcmVz cG9uc2VzIHdpbGwgYmUgbWFkZSBhdmFpbGFibGUgdG8gdGhlIGNvbW11bml0eSBhbG9uZ3NpZGUN CiAgICB0aGUgc3VtbWFyeSByZXBvcnQuIFdlIHdpbGwgcmVkYWN0IHdoYXQgd2UgZGV0ZWN0LCBi dXQgbWF5IG1pc3MNCiAgICBzb21lLg0KICDigKIgQXMgYW4gb2ZmaWNpYWwgT0NhbWwgb25saW5l IHNwYWNlLCB0aGlzIHN1cnZleSBoYXMgYWRvcHRlZCB0aGUNCiAgICBbT0NhbWwgQ29kZSBvZiBD b25kdWN0XS4NCg0KICBSZXN1bHRzIHdpbGwgYmUgcHVibGlzaGVkIG9uIHRoZSBPQ1NGIHdlYnNp dGUgYW5kIGFubm91bmNlZCBoZXJlIG9uDQogIGRpc2N1c3Mub2NhbWwub3JnLg0KDQogIFRoYW5r IHlvdSBpbiBhZHZhbmNlIGZvciB5b3VyIHBhcnRpY2lwYXRpb24sIGFuZCBwbGVhc2Ugc2hhcmUg dGhlDQogIHN1cnZleSB3aWRlbHkhDQoNCiAg4oCTIFNhYmluZSBTY2htYWx0eiwgb24gYmVoYWxm IG9mIHRoZSBPQ2FtbCBTb2Z0d2FyZSBGb3VuZGF0aW9uDQoNCg0KW09DYW1sIFNvZnR3YXJlIEZv dW5kYXRpb25dIDxodHRwczovL29jYW1sLXNmLm9yZy8+DQoNClsyMDIzIGl0ZXJhdGlvbl0NCjxo dHRwczovL2Rpc2N1c3Mub2NhbWwub3JnL3QvYW5uLW9jYW1sLXVzZXItc3VydmV5LTIwMjMvMTM0 Njk+DQoNCltmZWVkYmFjayB0aHJlYWRdDQo8aHR0cHM6Ly9kaXNjdXNzLm9jYW1sLm9yZy90L2Zl ZWRiYWNrLXdhbnRlZC11cGNvbWluZy1vY2FtbC11c2Vycy1zdXJ2ZXktMjAyNi1xdWVzdGlvbnMv MTc5MjU+DQoNCltPQ2FtbCBDb2RlIG9mIENvbmR1Y3RdIDxodHRwczovL29jYW1sLm9yZy9wb2xp Y2llcy9jb2RlLW9mLWNvbmR1Y3Q+DQoNCg0KT0NhbWwgV2ViIHR1dG9yaWFscw0K4pWQ4pWQ4pWQ 4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQ4pWQDQoNCiAgQXJj aGl2ZTogPGh0dHBzOi8vZGlzY3Vzcy5vY2FtbC5vcmcvdC9vY2FtbC13ZWItdHV0b3JpYWxzLzE4 MDM5LzE+DQoNCg0KRnLDqWTDqXJpYyBMb3llciBhbm5vdW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgA0K DQogIEkgaGF2ZSBzdGFydGVkIGEgc2VyaWVzIG9mIE9DYW1sIFdlYiB0dXRvcmlhbHMuIFRoZSBp ZGVhIGlzIHRvIHRyeQ0KICBtdWx0aXBsZSBsaWJyYXJpZXMgYW5kIHNlZSBob3cgdGhleSBmaXQg dG9nZXRoZXIuIChCdXQgdGhlIERyZWFtDQogIGZyYW1ld29yayBkb2N1bWVudCBhbmQgZXhhbXBs ZSBzZXQgaXMgcXVpdGUgZ29vZCBlbm91Z2gsIEkgd2lsbCBub3QNCiAgcGFyYXBocmFzZSBpdCku DQoNCiAgRm9yIHRoZSBtb21lbnQsIEkgaGF2ZSBvbmx5IHRyaWVkIGEgU2VydmVyIFNpZGUgUmVu ZGVyaW5nLCBidXQgSSBwbGFuDQogIHRvIHRyeSBhIENsaWVudCBTaWRlIFJlbmRlcmluZyB3aGVy ZSBPY3NpZ2VuIChhbmQgVmRvbSA/4oCmKSBjb3VsZCBiZQ0KICB3ZWxjb21lZC4NCg0KICBUaGUg aWRlYSBpcyB0byBwcm9wb3NlIGEgZHVtbXkgYXBwbGljYXRpb24gdGhhdCB1c2Ugd2hhdCBtb3N0 IHBlb3BsZQ0KICB3b3VsZCBleHBlY3QgZnJvbSBhIFdlYiBGcmFtZXdvcmsgKGZvcm0gaGFuZGxp bmcsIGRhdGFiYXNlIGFjY2Vzc2VzLA0KICDigKYpDQoNCiAgU2VlIFtPQ2FtIHdlYiB0dXRvcmlh bHNdDQoNCg0KW09DYW0gd2ViIHR1dG9yaWFsc10gPGh0dHA6Ly9naXRodWIuY29tL0YtTG95ZXIv T0NhbWxfV2ViX3R1dG8+DQoNCg0KQ2FsYXNjaWJldHRhIFJvbWFpbiB0aGVuIHN1Z2dlc3RlZA0K 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA 4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSADQoNCiAgWW91IGNh biB0YWtlIGFuIGluc3BpcmF0aW9uIGZyb20gdGhlIHR1dG9yaWFsIHdlIG1hZGUgYWJvdXQgW2B2 aWYnXSwNCiAgaXQgc2hvd3MgeW91IHdlYnNvY2tldCBzdHVmZnMgYXQgdGhlIGVuZCBhbmQgaW5j bHVkZSBgY2FxdGknIGFuZA0KICBgdHl4bWwnIDpzbGlnaHRfc21pbGU6DQoNCg0KW2B2aWYnXSA8 aHR0cHM6Ly9yb2J1ci1jb29wLmdpdGh1Yi5pby92aWYvPg0KDQoNClZhbGtleSAwLjMuMTogY2xp ZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmcgcG9vbHMsIElBTSBhdXRoIGFuZCBtVExTDQrilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDilZDi lZDilZDilZDilZDilZDilZDilZDilZDilZDilZANCg0KICBBcmNoaXZlOg0KICA8aHR0cHM6Ly9k aXNjdXNzLm9jYW1sLm9yZy90L3ZhbGtleS0wLTMtMS1jbGllbnQtc2lkZS1jYWNoaW5nLWJsb2Nr aW5nLXBvb2xzLWlhbS1hdXRoLWFuZC1tdGxzLzE4MDQxLzE+DQoNCg0KQXZpIEZlbmVzaCBhbm5v dW5jZWQNCuKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKU gOKUgOKUgOKUgA0KDQogIEhpIGV2ZXJ5b25lLA0KDQogIEkgd2FudGVkIHRvIHNoYXJlIHRoYXQg YHZhbGtleS4wLjMuMScgaXMgbm93IG9uIG9wYW0uDQoNCiAgVGhpcyBpcyB0aGUgbmV4dCByZWxl YXNlIGFmdGVyIHRoZSBgMC4yLjAnIGFubm91bmNlbWVudC4gVGhlIHNob3J0DQogIHZlcnNpb246 IGEgZmV3IG9mIHRoZSByb2FkbWFwIGl0ZW1zIGZyb20gdGhhdCBwb3N0IGFyZSBub3cgc2hpcHBl ZCDigJQNCiAgY2xpZW50LXNpZGUgY2FjaGluZywgYmxvY2tpbmctY29tbWFuZCBwb29scywgSUFN IGF1dGgsIGFuZCBtVExTLg0KDQogIOKUjOKUgOKUgOKUgOKUgA0KICDilIIgb3BhbSB1cGRhdGUN CiAg4pSCIG9wYW0gaW5zdGFsbCB2YWxrZXkgZWlvX21haW4NCiAg4pSU4pSA4pSA4pSA4pSADQoN CiAgUmVwbyBhbmQgZG9jczogPGh0dHBzOi8vZ2l0aHViLmNvbS9hdmlmZW5lc2gvb2NhbWwtdmFs a2V5Pg0KDQogIFRoZSBsYXJnZXN0IG5ldyBmZWF0dXJlIGlzICpjbGllbnQtc2lkZSBjYWNoaW5n Ki4NCg0KICBgdmFsa2V5JyBub3cgc3VwcG9ydHMgVmFsa2V5IGBDTElFTlQgVFJBQ0tJTkcnIHdp dGggYSBib3VuZGVkDQogIGluLXByb2Nlc3MgTFJVIGNhY2hlLCBSRVNQMyBpbnZhbGlkYXRpb24g cHVzaCBoYW5kbGluZywgc2luZ2xlLWZsaWdodA0KICBwcm90ZWN0aW9uLCBvcHRpb25hbCBUVEwg c2FmZXR5IG5ldCwgYW5kIG1ldHJpY3MuIEl0IHdvcmtzIGluIGJvdGgNCiAgc3RhbmRhbG9uZSBh bmQgY2x1c3RlciBtb2RlLCBhbmQgc3VwcG9ydHMgdGhlIHRocmVlIHRyYWNraW5nIHNoYXBlcyBJ DQogIHdhbnRlZCB0byBjb3ZlcjoNCg0KICDigKIgZGVmYXVsdCB0cmFja2luZw0KICDigKIgYEJD QVNUJyBwcmVmaXggdHJhY2tpbmcNCiAg4oCiIGBPUFRJTicgdHJhY2tpbmcNCg0KICBUaGUgY2x1 c3RlciBwYXRoIHdhcyB0aGUgdHJpY2t5IHBhcnQuIE9QVElOIHJlYWRzIG5lZWQgYENMSUVOVCBD QUNISU5HDQogIFlFUycgdG8gc3RheSBhZGphY2VudCB0byB0aGUgYWN0dWFsIHJlYWQgb24gdGhl IHdpcmUsIGluY2x1ZGluZyBhY3Jvc3MNCiAgTU9WRUQgLyBBU0sgcmVkaXJlY3RzLiBUaGF0IGlz IG5vdyBoYW5kbGVkIGluc2lkZSB0aGUgY2xpZW50IHJhdGhlcg0KICB0aGFuIHB1c2hlZCBvbnRv IGNhbGxlcnMuDQoNCiAgVGhlIHNlY29uZCBiaWcgYWRkaXRpb24gaXMgYSAqYmxvY2tpbmctY29t bWFuZCBwb29sKi4NCg0KICBUaGUgbm9ybWFsIGNsaWVudCBpcyBzdGlsbCBidWlsdCBhcm91bmQg bXVsdGlwbGV4ZWQgY29ubmVjdGlvbnMsIHdoaWNoDQogIGlzIHRoZSByaWdodCBzaGFwZSBmb3Ig cmVndWxhciB0cmFmZmljLiBCdXQgY29tbWFuZHMgc3VjaCBhcyBgQkxQT1AnLA0KICBgQlJQT1An LCBgQkxNT1ZFJywgYEJMTVBPUCcsIGBCWlBPUConLCBgWFJFQUQgQkxPQ0snLCBhbmQgYFhSRUFE R1JPVVANCiAgQkxPQ0snIGFyZSBpbnRlbnRpb25hbGx5IGJsb2NraW5nIG9uIHRoZSBzZXJ2ZXIg c2lkZS4gU2VuZGluZyBvbmUgb2YNCiAgdGhvc2UgdGhyb3VnaCB0aGUgbm9ybWFsIG11bHRpcGxl eGVkIEZJRk8gY2FuIGZyZWV6ZSB1bnJlbGF0ZWQNCiAgcmVxdWVzdHMgcXVldWVkIGJlaGluZCBp dC4NCg0KICBgMC4zLngnIGFkZHMgYSBuYXJyb3cgcGVyLW5vZGUgbGVhc2UgcG9vbCBmb3IgdGhv c2UgY29tbWFuZHMuIEJsb2NraW5nDQogIGNhbGxzIGxlYXNlIGFuIGV4Y2x1c2l2ZSBjb25uZWN0 aW9uIGZvciB0aGUgZHVyYXRpb24gb2YgdGhlIGNvbW1hbmQsDQogIHdoaWxlIHJlZ3VsYXIgdHJh ZmZpYyBjb250aW51ZXMgb24gdGhlIG5vcm1hbCBjbGllbnQuIFRoZSBwb29sIGlzDQogIGJvdW5k ZWQsIGhhcyB0eXBlZCBlcnJvcnMsIGhhbmRsZXMgdG9wb2xvZ3kgY2hhbmdlcywgYW5kIGlzIG9m ZiBieQ0KICBkZWZhdWx0IHVubGVzcyBjb25maWd1cmVkLg0KDQogIFRoZSB0aGlyZCBhZGRpdGlv biBpcyAqSUFNIGF1dGggYW5kIG1UTFMqLg0KDQogIFRoZXJlIGlzIG5vdyBhIGZpcnN0LWNsYXNz IGBDb25uZWN0aW9uLkF1dGgucHJvdmlkZXInIGFic3RyYWN0aW9uDQogIGluc3RlYWQgb2Ygb25s eSBzdGF0aWMgdXNlcm5hbWUvcGFzc3dvcmQgY29uZmlnLiBUaGF0IG1lYW5zIGV2ZXJ5DQogIGlu aXRpYWwgaGFuZHNoYWtlIGFuZCByZWNvbm5lY3QgY2FuIHB1bGwgZnJlc2ggY3JlZGVudGlhbHMg ZnJvbSBhDQogIHByb3ZpZGVyLg0KDQogIE9uIHRvcCBvZiB0aGF0LCB0aGUgbGlicmFyeSBub3cg aW5jbHVkZXM6DQoNCiAg4oCiIHB1cmUgT0NhbWwgQVdTIFNpZ1Y0IHNpZ25pbmcgZm9yIEVsYXN0 aUNhY2hlIElBTSBhdXRoDQogIOKAoiBhbiBhdXRvLXJlZnJlc2hpbmcgSUFNIHByb3ZpZGVyDQog IOKAoiBgQ2xpZW50LmNvbm5lY3Rfd2l0aF9pYW0nDQogIOKAoiBsaXZlIGBBVVRIJyByZWZyZXNo IHN1cHBvcnQNCiAg4oCiIG1UTFMgY2xpZW50IGNlcnRpZmljYXRlIGNvbmZpZ3VyYXRpb24gdmlh DQogICAgYFRsc19jb25maWcud2l0aF9jbGllbnRfY2VydCcNCg0KICBUaGUgSUFNIHBhdGggZG9l cyBub3QgZGVwZW5kIG9uIHRoZSBBV1MgU0RLLiBUaGUgc2lnbmVyIGlzIGltcGxlbWVudGVkDQog IGluIE9DYW1sIGFuZCB0ZXN0ZWQgYWdhaW5zdCBBV1MgU2lnVjQgdGVzdCB2ZWN0b3JzLg0KDQog IFRoZXJlIHdlcmUgYWxzbyBhIGZldyBjb3JyZWN0bmVzcyBhbmQgb3BlcmFiaWxpdHkgaW1wcm92 ZW1lbnRzOg0KDQogIOKAoiBPcGVuVGVsZW1ldHJ5IHNwYW5zIGZvciBjb25uZWN0LCBjbHVzdGVy IGRpc2NvdmVyeSwgYW5kIHRvcG9sb2d5DQogICAgcmVmcmVzaA0KICDigKIgY2FjaGUgYW5kIGJs b2NraW5nLXBvb2wgbWV0cmljIGJyaWRnZXMNCiAg4oCiIHRpZ2h0ZXIgVExTIC8gY29ubmVjdGlv biBlcnJvciByZWRhY3Rpb24NCiAg4oCiIGJldHRlciBNT1ZFRCAvIEFTSyAvIHRvcG9sb2d5LXJl ZnJlc2ggYmVoYXZpb3IgdW5kZXIgY2x1c3RlciBjaGFuZ2VzDQogIOKAoiBmaXhlcyBhcm91bmQg V0FUQ0ggLyBNVUxUSSAvIEVYRUMgd2hlbiBzbG90IG93bmVyc2hpcCBjaGFuZ2VzIGR1cmluZw0K ICAgIGFuIGF0b21pYyBmbG93DQogIOKAoiBtb3JlIHRlc3RzIGFyb3VuZCBDU0MgaW52YWxpZGF0 aW9uLCBjbHVzdGVyIG1pZ3JhdGlvbiwgYmxvY2tpbmctcG9vbA0KICAgIGJlaGF2aW9yLCBJQU0g cmVmcmVzaCwgYW5kIG1UTFMgY29uZmlnDQoNCiAgYDAuMy4xJyBpdHNlbGYgaXMgYSBzbWFsbCBm b2xsb3ctdXAgdG8gbWFrZSB0aGUgb3BhbSBzYW5kYm94IHRlc3RzDQogIGNsZWFuOiB0aGUgbVRM UyBjb25maWcgdGVzdHMgbm93IHVzZSBjb21taXR0ZWQgdGVzdCBmaXh0dXJlcyBpbnN0ZWFkDQog IG9mIGRlcGVuZGluZyBvbiBnZW5lcmF0ZWQgY2VydHMgZnJvbSB0aGUgbG9jYWwgZGV2ZWxvcG1l bnQgc2NyaXB0cy4NCg0KICBUaGUgcHJvamVjdCBpcyBzdGlsbCBhbHBoYSwgYW5kIHRoZSBBUEkg bWF5IHN0aWxsIGNoYW5nZSBiZWZvcmUgYDEuMCcsDQogIGJ1dCB0aGUgc3VyZmFjZSBpcyBnZXR0 aW5nIGNsb3NlciB0byB0aGUgc2hhcGUgSSBvcmlnaW5hbGx5IHdhbnRlZDogYW4NCiAgT0NhbWwg NSAvIEVpby1uYXRpdmUgVmFsa2V5IGNsaWVudCB0aGF0IHRyZWF0cyBjbHVzdGVyIGJlaGF2aW9y LA0KICBSRVNQMywgbW9kZXJuIFZhbGtleSBmZWF0dXJlcywgYW5kIHByb2R1Y3Rpb24gZmFpbHVy ZSBtb2RlcyBhcw0KICBmaXJzdC1jbGFzcyBjb25jZXJucy4NCg0KICBJIHdvdWxkIGVzcGVjaWFs bHkgYXBwcmVjaWF0ZSBmZWVkYmFjayBmcm9tIHBlb3BsZSB3aG8gdXNlIE9DYW1sIGluDQogIHBy b2R1Y3Rpb24gb246DQoNCiAg4oCiIEFQSSBzaGFwZSBhbmQgbmFtaW5nDQogIOKAoiBFaW8gZXJn b25vbWljcw0KICDigKIgZG9jcyBjbGFyaXR5DQogIOKAoiB3aGV0aGVyIHRoZSBjYWNoaW5nIC8g YmxvY2tpbmctcG9vbCAvIElBTSBBUElzIGZlZWwgbmF0dXJhbA0KICDigKIgd2hhdCBzaG91bGQg YmUgcHJpb3JpdGl6ZWQgYmVmb3JlIGAxLjAnDQoNCiAgTmV4dCB0aGluZ3Mgb24gdGhlIHJvYWRt YXAgYXJlIHN0aWxsIFZhbGtleSBtb2R1bGUgc3VwcG9ydCDigJQgSlNPTiwNCiAgc2VhcmNoLCBi bG9vbSDigJQgYW5kIGEgZGVlcGVyIHByZS1gMS4wJyBhdWRpdCBwYXNzLg0KDQogIElmIHlvdSB0 cnkgaXQsIEnigJlkIGxvdmUgdG8gaGVhciB3aGF0IGZlZWxzIGdvb2QsIHdoYXQgZmVlbHMgYXdr d2FyZCwNCiAgYW5kIHdoYXQgaXMgbWlzc2luZy4NCg0KDQpPbGQgQ1dODQrilZDilZDilZDilZDi lZDilZDilZANCg0KICBJZiB5b3UgaGFwcGVuIHRvIG1pc3MgYSBDV04sIHlvdSBjYW4gW3NlbmQg bWUgYSBtZXNzYWdlXSBhbmQgSSdsbCBtYWlsDQogIGl0IHRvIHlvdSwgb3IgZ28gdGFrZSBhIGxv b2sgYXQgW3RoZSBhcmNoaXZlXSBvciB0aGUgW1JTUyBmZWVkIG9mIHRoZQ0KICBhcmNoaXZlc10u DQoNCiAgSWYgeW91IGFsc28gd2lzaCB0byByZWNlaXZlIGl0IGV2ZXJ5IHdlZWsgYnkgbWFpbCwg eW91IG1heSBzdWJzY3JpYmUNCiAgdG8gdGhlIFtjYW1sLWxpc3RdLg0KDQogIFtBbGFuIFNjaG1p dHRdDQoNCg0KW3NlbmQgbWUgYSBtZXNzYWdlXSA8bWFpbHRvOmFsYW4uc2NobWl0dEBwb2x5dGVj aG5pcXVlLm9yZz4NCg0KW3RoZSBhcmNoaXZlXSA8aHR0cHM6Ly9hbGFuLnBldGl0ZXBvbW1lLm5l dC9jd24vPg0KDQpbUlNTIGZlZWQgb2YgdGhlIGFyY2hpdmVzXSA8aHR0cHM6Ly9hbGFuLnBldGl0 ZXBvbW1lLm5ldC9jd24vY3duLnJzcz4NCg0KW2NhbWwtbGlzdF0gPGh0dHBzOi8vc3ltcGEuaW5y aWEuZnIvc3ltcGEvaW5mby9jYW1sLWxpc3Q+DQoNCltBbGFuIFNjaG1pdHRdIDxodHRwczovL2Fs YW4ucGV0aXRlcG9tbWUubmV0Lz4NCg0K --==-=-= Content-Type: text/html; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable OCaml Weekly News

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 28 to May 05, 2= 026.

    Oc =E2=80=94 a Cargo-like CLI for OCaml beginners (AI-assisted= , feedback very welcome)

    Emil Kloeden announced

    Hi everyone,=20

    I'm a newcomer to OCaml, and one of the things that has slowed me down is t= he tooling setup: understanding opam switches, remembering to eval $(= opam env), knowing when to regenerate .opam~files. So (togethe= r with Claude Code) I built ~oc - a small CLI that wraps opam<= /code> and dune and gives them a Cargo- or uv-like interface:= =20

    oc new my_app # scaffold project + initialise isolated switch
    oc add yojson # add dependency, update oc.toml, install
    oc build # ensure deps, dune build
    oc run # ensure deps, dune exec
    

    No opam switch create, no eval $(opam env), no ha= nd-editing .opam files.

    What it is:

    A small, thin orchestration layer with no dependencies beyond opam and dune= themselves. It calls opam to manage switches and resolve packages, and dun= e to build - wrapping the tools the community already uses and trusts rathe= r than replacing them. It deliberately does less: if you want full control = over your environment, opam gives you that directly.

    What it isn't:

    A replacement for opam or dune. The intention is to offer a simpler surface= for those who prefer it, whether you're just starting out or you've been w= riting OCaml for years and want less ceremony for everyday tasks.

    A note on AI assistance:

    I should be upfront: this project was developed almost entirely with the he= lp of Claude Code. I wrote the specs, made the design decisions, and review= ed everything - but the code is almost entirely AI-generated. I think that'= s worth naming, both for transparency and because it's an interesting case = study in what AI-assisted development looks like for a small tool.

    Prior art:

    I'm aware of a few similar efforts. esy is the closest in spir= it - sandboxed builds, a lock file, a simpler manifest - but it makes some = different choices: it requires Node.js (npm install -g esy) and brings its own dependency resolver rather than d= elegating to opam. oc is a narrower tool: no additional runtime dependencies, stays on top of sta= ndard opam and dune, and trades power for simplicity.~ dune init project~ h= andles scaffolding but leaves switch management to you. opam's own local sw= itches (opam switch create . 5.2.0) are essentially what oc automates, but you still have to drive them manually. If there's= something I've missed that already solves this cleanly, I'd genuinely like= to know.

    Why not just shell aliases?

    You probably could get close with a few shell functions. The reasons I went= further: a cross-platform binary needs no shell setup, the lockfile gives = reproducible builds across machines, and having a single oc.toml as the source of truth is cleaner than remembering which opam commands t= o run. Whether that's worth it is a fair question.

    Why Go, not OCaml:

    Partly the bootstrapping problem =E2=80=94 it felt odd to write a tool that= helps you set up OCaml before you can set up OCaml. More practically, Go m= ade it easy to ship a single static binary with no runtime dependencies, an= d it let me build and iterate on the tool quickly. I'm not against a port t= o OCaml if someone wanted to take that on.

    Current state:

    The tool works for my personal use, has a test suite, a lockfile, and basic= CI. It's rough around the edges and I'm sure there are things that would m= ake an experienced OCaml developer wince. That's part of why I'm posting - = I'd genuinely value feedback on:=20

    • Does this solve a real problem, or does the community have better answe= rs I missed?
    • Are there correctness issues with how oc manages switches = or generates .opam files?
    • What's missing before this would be useful to you?

    The homepage is at emilkloeden= .github.io/oc and the source is at github.com/emilkloeden/oc.=20

    Thanks for reading and I look forward to your feedback.

    Dune Package Management Updates

    Shon announced

    Hello! The Tarides team is writing to share updates on Dune package managem= ent.

    Context

    Dune package management aims to improve some developer workflows by simplif= ying the use of opam dependencies in projects built with Dune. To learn mor= e, see the tutorial, OCaml Package Management With Dune= .

    It=E2=80=99s been too long since we shared an update, especially considerin= g our gratitude for all the excell= ent feedback we have received. But Dune contributors have been hard at = work fixing issues and solving tricky architectural snags present in t= he previous iteration.

    Available now

    Thanks to many contributors, the following functionalities are available on= Linux and MacOS in the latest release of Dune (3.22):

    Additionally, the following supporting utilities are available:

    Current status and focus

    Thanks to several regular users in the community and usage in many of the C= I systems we maintain, we are gathering ongoing feedback and exercising the= core functionality. However, our testing has shown the features are not ye= t mature enough to recommend wider use, beyond eager and early adopters. Co= nsequently, all the documentation warns that this functionality is experime= ntal and subject to change.

    We are currently focused on maturing package management beyond its experime= ntal status. This requires reworking the developer tooling support, support= ing packages that use symlinks, and ensuring we can dogfood Dune package ma= nagement in its own development. The best place to look for what we have p= lanned in this current phase is Non-experimental package management =C2=B7 Milestone #62 =C2=B7= ocaml/dune.=20

    Next up

    After maturing the core functionality, we will turn our focus to extending = the supported platforms and improving ecosystem integration. This work will= include adding support for Windows, improving cross-compilation, supportin= g advanced vendoring workflows, and integrating Dune package management int= o the opam-ci. More updates and more accessible planning will follow.

    Input and contributions

    Please = reach out if you find this work interesting and would like to help!

    OCaml Users Survey 2026

    Sabine Schmaltz announced

    Hi everyone,

    On behalf of the OCaml Software Foundatio= n (OCSF), I'm delighted to announce the OCaml Users Survey 2026.= We invite you to take 10 to 15 minutes to fill it out and to share it with= other OCaml programmers.

    Survey link: https:/= /forms.gle/gt5nikqUmoQWeYYQ9

    https://forms.gle/gt5nikqUm= oQWeYYQ9

    The survey will remain open until May 25th, 2026 (AOE).

    This year's edition builds on the 2023 iteration. Many questions are kept= comparable so we can track trends over time, while others have been refres= hed, fixed, or added based on community feedback gathered earlier this year= (feedback thread). Notable additions inc= lude questions on AI/LLM tooling and on debugging & profiling.

    A few notes:

    • The survey is administered via Google Forms but configured to not require signing in to a Google account, and answers are not tied to any a= ccount. As a consequence, your progress is not saved if you close yo= ur browser tab before finishing.
    • All questions are optional.
    • Please avoid entering personal information in free-form text fields: th= e raw responses will be made available to the community alongside the summa= ry report. We will redact what we detect, but may miss some.
    • As an official OCaml online space, this survey has adopted the OCaml Code of Conduct.<= /li>

    Results will be published on the OCSF website and announced here on discuss= .ocaml.org.

    Thank you in advance for your participation, and please share the survey wi= dely!

    – Sabine Schmaltz, on behalf of the OCaml Software Foundation

    OCaml Web tutorials

    Fr=C3=A9d=C3=A9ric Loyer announced

    I have started a series of OCaml Web tutorials. The idea is to try multiple= libraries and see how they fit together. (But the Dream framework document= and example set is quite good enough, I will not paraphrase it).

    For the moment, I have only tried a Server Side Rendering, but I plan to tr= y a Client Side Rendering where Ocsigen (and Vdom ?=E2=80=A6) could be welc= omed.

    The idea is to propose a dummy application that use what most people would = expect from a Web Framework (form handling, database accesses, =E2=80=A6)

    See OCam web tutorials=

    Calascibetta Romain then suggested

    You can take an inspiration from the tutorial we made about vif, it shows you websocket= stuffs at the end and include caqti and tyxml :s= light_smile:

    Valkey 0.3.1: client-side caching, blocking pools, IAM auth an= d mTLS

    Avi Fenesh announced

    Hi everyone,

    I wanted to share that valkey.0.3.1 is now on opam.

    This is the next release after the 0.2.0 announcement. The sho= rt version: a few of the roadmap items from that post are now shipped =E2= =80=94 client-side caching, blocking-command pools, IAM auth, and mTLS.

    opam update
    opam install valkey eio_main
    

    Repo and docs: https:= //github.com/avifenesh/ocaml-valkey

    The largest new feature is client-side caching.

    valkey now supports Valkey CLIENT TRACKING with a= bounded in-process LRU cache, RESP3 invalidation push handling, single-fli= ght protection, optional TTL safety net, and metrics. It works in both stan= dalone and cluster mode, and supports the three tracking shapes I wanted to= cover:

    • default tracking
    • BCAST prefix tracking
    • OPTIN tracking

    The cluster path was the tricky part. OPTIN reads need CLIENT CACHING= YES to stay adjacent to the actual read on the wire, including acro= ss MOVED / ASK redirects. That is now handled inside the client rather than= pushed onto callers.

    The second big addition is a blocking-command pool.

    The normal client is still built around multiplexed connections, which is t= he right shape for regular traffic. But commands such as BLPOP= , BRPOP, BLMOVE, BLMPOP, BZPOP= *, XREAD BLOCK, and XREADGROUP BLOCK are i= ntentionally blocking on the server side. Sending one of those through the = normal multiplexed FIFO can freeze unrelated requests queued behind it.

    0.3.x adds a narrow per-node lease pool for those commands. Bl= ocking calls lease an exclusive connection for the duration of the command,= while regular traffic continues on the normal client. The pool is bounded,= has typed errors, handles topology changes, and is off by default unless c= onfigured.

    The third addition is IAM auth and mTLS.

    There is now a first-class Connection.Auth.provider abstractio= n instead of only static username/password config. That means every initial= handshake and reconnect can pull fresh credentials from a provider.

    On top of that, the library now includes:

    • pure OCaml AWS SigV4 signing for ElastiCache IAM auth
    • an auto-refreshing IAM provider
    • Client.connect_with_iam
    • live AUTH refresh support
    • mTLS client certificate configuration via Tls_config.with_client_= cert

    The IAM path does not depend on the AWS SDK. The signer is implemented in O= Caml and tested against AWS SigV4 test vectors.

    There were also a few correctness and operability improvements:

    • OpenTelemetry spans for connect, cluster discovery, and topology refres= h
    • cache and blocking-pool metric bridges
    • tighter TLS / connection error redaction
    • better MOVED / ASK / topology-refresh behavior under cluster changes
    • fixes around WATCH / MULTI / EXEC when slot ownership changes during an= atomic flow
    • more tests around CSC invalidation, cluster migration, blocking-pool be= havior, IAM refresh, and mTLS config

    0.3.1 itself is a small follow-up to make the opam sandbox tes= ts clean: the mTLS config tests now use committed test fixtures instead of = depending on generated certs from the local development scripts.

    The project is still alpha, and the API may still change before 1.0, but the surface is getting closer to the shape I originally wanted: = an OCaml 5 / Eio-native Valkey client that treats cluster behavior, RESP3, = modern Valkey features, and production failure modes as first-class concern= s.

    I would especially appreciate feedback from people who use OCaml in product= ion on:

    • API shape and naming
    • Eio ergonomics
    • docs clarity
    • whether the caching / blocking-pool / IAM APIs feel natural
    • what should be prioritized before 1.0

    Next things on the roadmap are still Valkey module support =E2=80=94 JSON, = search, bloom =E2=80=94 and a deeper pre-1.0 audit pass.

    If you try it, I=E2=80=99d love to hear what feels good, what feels awkward= , and what is missing.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    --==-=-=-- --=-=-=-- --===-=-= Content-Type: application/pgp-signature; name="signature.asc" -----BEGIN PGP SIGNATURE----- iQFvBAEBCABZFiEE6lXof/BsSVW56ZmGBA0KO07S5ccFAmn5ufobFIAAAAAABAAO bWFudTIsMi41KzEuMTIsMCwzHxxhbGFuLnNjaG1pdHRAcG9seXRlY2huaXF1ZS5v cmcACgkQBA0KO07S5cfjbwf9EtZcfgp+7oiQNd2VoPgKNg0cO4QghVJ6BV+WEKYw DCo9czrrvSS2d5GGpP/GLlpIW9dg0eqerpBsYd0xgo+dyC1q8c8QwD+zRHA8DMeb hBfcBiFAGgGLTr/+IF8rwRH4pZYqjasiIFTCsAgbFBhuiE2y68pQHotDfvZViJws hiLQcy6EXXQMxVUluH6TPtE+IMQRjnUugUpqj4TfYcI9F5VgOs5lk27++wtrqbX8 nV3VGPS3xxDJSalOFIpj77+re6vuGpFAlbGsgaROVDtDJmJIlNksjfiuPAIZuuPZ yPyVtHlJNs+9gT8YGFBvWi02Zlx22V/6wUxfhJtbZoNFJQ== =EYUu -----END PGP SIGNATURE----- --===-=-=--

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of July 08 to 15, 2025.

    OCaml Language Committee: an update on a policy for conflicts = of interest

    octachron announced

    When discussing the proposition for include functors, the language committee fe= lt in the rabbit hole of discussing conflict of interests.

    After some discussions, as the current committee chair, I have decided to p= ropose to amend the committee description with our current understanding of= transparency-based policy for conflicts of interest at https://github.com/ocaml/RFCs/pull/55 .

    The core idea behind that policy is that in a small-world community like ou= rs, trying to completely avoid conflicts would be counter-productive. At th= e same time, making sure that anyone is aware of potential conflicts is fai= rer for all participants.

    Thus the current proposal, which is not definitive. In particular, if we ha= ve any comments, you are more than welcome to participate in the discussion= in the RFC above.

    OCaml intern for Claudius

    Shreya Pawaskar announced

    Hello Everyone! =F0=9F=91=8B=F0=9F=91=8B

    I am Shreya Pawaskar, an outreachy intern working on the Claudius Project.= =20

    A little late to post my blogs here. But here we go!

    This is my first blog. Here I've talked about my experience during the= contribution phase and my fav contribution.=20

    And here's the second one. This one is all about the journey and the l= earnings I made working with ocaml-gif. And ofcourse, the beautiful cover i= mage for my second blog is built and captured with Claudius!

    An example for every OCaml package

    John Whitington announced

    (One day, maybe).

    Wouldn't it be nice if every OCaml package had examples as well as document= ation? As part of a pilot programme funded by the OCaml Software Foundation= , I've been looking into the feasibility of such an idea.

    What do we mean by examples, and what distinguishes them from documentation= and from tests?

    What an example is

    • Examples are independent of the library they explain. They do not requi= re the source of the library, or any built artefacts.
    • Examples are self-contained. They require only OCaml, a build system, a= nd the library in question to be installed.
    • Examples are easy to build. They are built in a single command, and do = not depend on environment.
    • Examples are easy to edit and play with. They are of a reasonable size,= split into chunks, and are commented liberally.
    • Examples use standard techniques. Both in how the library is used, and = in how the OCaml code is written.
    • Examples are open licensed. Users should be able to copy & paste co= de from the examples without care.

    What an example is not

    • Examples are not tests. Unlike tests, examples do not care about code c= overage, cannot be automatically generated, and need not necessarily be tig= htly integrated into the source repository.
    • Examples are not in the API documentation. Examples need to be buildabl= e, and separate from the API documentation. This is not to say that they mi= ght then not be automatically imported into the API documentation one day.<= /li>
    • Examples need not be comprehensive. Better a small example than no exam= ple at all. So long as the basics of an API are introduced, the cliff is cl= imbed and the API documentation should thereafter suffice.

    Pilot project plan

    The plan was to build small examples for about twenty packages, put togethe= r a place for them to live, and then try to upstream them. The examples' ho= me, prior to upstreaming, is the OCaml Nursery:

    https://github.= com/johnwhitington/ocaml-nursery

    Most of these little examples have been submitted to upstream - you may hav= e noticed the pull requests on your repositories - with varying degrees of = interest / success.

    Opinions requested, please!

    Are you interested in adding examples for your package or someone else's pa= ckage? To the nursery or to upstream? What do you think of the definition o= f example I gave above? Do you think examples should sit in a separate spac= e like the nursery or be upstreamed or both? Opinions requested on all thos= e topics, please!

    Esa 0.1.0 - Enhanced Suffix Arrary(and further plans)

    Geoffrey Borough announced

    I just ported the original C++ Enhanced Suffix Tree to pure OCaml, you can = find it here: https://github.co= m/gborough/esa.

    It's the first time I have attempted at writing low allocation/no allocatio= n code in OCaml and I must say this has been a great learning experience fo= r the past few weeks, and it makes me appreciate more how OCaml is able to = provide low level tunings that match other low level languages, whilst stay= ing functional at the same time.

    One of my personal goals(also our company tech alignment) is to bring OCaml= up to the same level of convenience as Python in some areas of AI/L= LM. We are inspired by existing efforts in the OCaml community to take on t= his challenge and our plan of attack will be more or less similar. Currentl= y we are tackling the following problems:

    • Porting Google Sentencepiece(in progress): Enhanced Suffix Arrary done = as a dependency, Double-Array Trie and few other tokenizer utilities in pro= gress.
    • Porting Hugging Face Tokenizers(in progress): Pending the completion of= sentencepiece though less dependent codes are being converted.

    The end product probably contains a mixture of pure OCaml as well as a fair= amount of FFI code. I dread to think how they are going to look like obvio= usly there will be a ton of verbatim translations to OCaml, but I have litt= le doubt about matching C++/Rust performance most of the time. We'll also l= ook into the upcoming OxCaml extension to see if more performance can be ek= ed out.

    Hopefully we will have something to show for the community in the near futu= re.

    Tutorial: cut and pasting code

    Daniel B=C3=BCnzli announced

    Dear all,=20

    I sometimes notice that my code gets cut and pasted or vendored litterally = or modified in other projects. That's very fine, it's the reason why= I publish almost all my code under a license that makes that extremely simple.=20

    Yet people often fail to abide by the simple, single phrase request of the = license which is (emphasis added):

    Copyright (c) [year] [fullname]

    Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyright notice and this permission notice appear in all copies.

    In all my source files you can find a header that has the copyright notice = and a SPDX license identifier as per convention (example). So I kindly ask you when you reuse my code:

    1. If you copy the whole file to retain that copyright header. Reformatting the header is ok. Also if you end up reworking the code significantly=20 indicating:

      (* Part of this code is based on the xxx project and
         Copyright (c) 2020 The xxx programmers.
         SPDX-License-Identifier: ISC *)
      

      works for me.

    2. If you copy say a single function please add a comment with the copyright notice and the SPDX license identifier. For example:

      (* This code is Copyright (c) 2011 The xxx programmers.
          SPDX-License-Identifier: ISC *)
      
    3. If you end up vendoring a significant part of the code without modifying it (that is if technically you depend on the project) please mention it=20 in your toplevel LICENSE file.

    Now let's be clear, I will not call the police if don't do this or if you p= retend to have written code you did not. Police and lawyers are at the top = of the list of people I do not want to deal with or inflict onto other peop= le.

    What I'm seeking here is attribution. Not for having my name in your projec= t, I couldn't care less and the copyrights of my projects are contributor b= ased anyways. This is so that the code contribution can be traced for the l= ittle times I manage to convince people to pay me for making them rather th= an investing my own money in these projects.

    Btw. this should not only be about my code. This is about any open source c= ode you cut and paste from (and I also do this).=20

    Ah and yes, please, if you are using them, also teach your LLMs to do that.= If they are able to write OCaml code it's also thanks to me :=E2=80=93)

    Thank for your attention.=20

    Daniel

    QCheck 0.24

    Jan Midtgaard announced

    QCheck 0.26 is now available from your favorite opam repository! :tada:

    https://github.com/c-= cube/qcheck/releases

    The 0.26 release adjusts the QCheck and QCheck2 <= code>float generator distributions, which was previously confined to= a subset of floating point numbers. Users may experience that existing tes= ts known to pass start to fail with the new and broader distribution. In ad= dition the release contains a number of other fixes and documentation impro= vements, incl. the removal of an annoying newline which would cause the tes= t suite to fail on OCaml 5.4.0:

    • Align printed collect statistics and also add a percentage=
    • Fix QCheck{,2}.Gen.float generator which would only genera= te numbers with an exponent between 2^{-21} and 2^{22}
    • Elaborate on the QCheck~/~QCheck2 situation in the README<= /li>
    • Add a missing description field to the *.opam files
    • Document Shrink invariants in the QCheck modu= le
    • Fix a qcheck-ounit test suite failure on OCaml 5.4, removi= ng a needless extra newline
    • Fix QCheck2 float_range operator which would = fail on negative bounds
    • Fix QCHECK_MSG_INTERVAL not being applied to the first in-= progress message

    Thanks to @Pat-Lafon, @rmonat, and @kit-ty-kate for contributing! :pray:

    New Odoc-3-Generated Package Documentation is Live on OCaml.or= g

    Sabine Schmaltz announced

    Hi everyone,

    I just merged the patch https://github.com/ocaml/ocaml.org/pull/3124 which enables the ne= w and improved package documentation built with odoc 3 on OCaml.org. Thanks= @mtelvers, @jonludlam, @panglesd for putting in the effort to make this ha= ppen for OCaml.org!

    Thanks to everyone who gave us feedback when we ran this on the staging env= ironment (https://discuss.ocaml.org/t/hel= p-test-the-new-odoc-3-powered-package-documentation-pages/16795/6), we'= re reasonably confident that things work well enough to apply this upgrade.= :orange_heart:=20

    In case you see something that could be improved, please let us know (by re= plying here or by opening an issue on https://github.com/ocaml/ocaml.org)!

    Cheers Sabine

    Lwt.6.0.0~alpha (direct-style)

    Rapha=C3=ABl Proust announced

    It is a great pleasure to announce the release of the first alpha release o= f Lwt 6. This major version bump brings two major changes to Lwt:

    • Using Lwt in direct-style! (Big thanks to @c-cube !!)
    • Using multiple Lwt schedulers running in separate domains!

    Direct-style

    This contribution from @c-cube is available in alpha00. It comes in the for= m of an lwt_direct package which provide an Lwt_direct module which provide two core functions:

    val run : (unit -&=
    gt; 'a) -> 'a Lwt.t
    val await : 'a Lwt.=
    t -> 'a
    

    and allows you to write code such as

    run (fun () ->
      let continue =3D ref true in
      while !continue do
        match await <=
    span style=3D"color: #a52a2a;">@@ Lw=
    t_io.read_line ic with
        | line -> await @@ Lwt_io.write_line oc line
        | exception <=
    span style=3D"color: #242521; background-color: #fcf7ef;">End_of_file -> continue :=3D false
      done)
    

    There are a few more functions. All of which is documented in = lwt_direct.mli.

    Multi-scheduler

    This addition is not available in alpha00 but should be added to alpha01 so= on. It allows to call Lwt_main.run in different domains and be= nefit from actual parallelism. (Sneak peek in this pull request)

    Installation

    lwt.6.0.0~alpha00 and lwt_direct.6.0.0~alpha00 wi= ll soon be released on opam (PR on opam-repo. I'll publish some more alphas as the= work progresses, and announce the releases on this thread.

    You can also pin the packages to the lwt-6 branch to get everything a littl= e bit earlier:

    opam pin lwt https://github.com/ocsigen/lwt.git#lwt-6
    opam pin lwt_direct https://github.com/ocsigen/lwt.git#lwt-6
    

    Feedback

    Don't hesitate to chime in on here with any feedback you may have. Ideas, c= omments, requests, suggestions, etc.

    MirageOS on Unikraft

    shym announced

    On behalf of all the developers involved (namely @fabbing, @Firobe, @n-osbo= rne and me), it=E2=80=99s my pleasure to announce that the first release of= the Unikraft backend support in Mirag= eOS unikernels.

    Unikraft is a unikernel development ki= t: it is a pretty large collection of components that can be picked up, or not, in th= e unikernel tradition of modularity. The scope of Unikraft is much larger t= han Solo5, as it aims to ma= ke it easy to turn any Unix server into an efficient unikernel. This was in fact a first motivation to explore using Unikraft as MirageOS b= ackend: to experiment and see what performance we could get, in particular = using their virtio-based network interface, as virtio is implemented currently only for one specific x86_64-onl= y backend in Solo5.

    Some of the immediate performance differences we observed are detailed furt= her, but that is not all we hope from this Unikraft backend in the long-ter= m. In particular, Unikraft is on the road to be multicore-compatible (i.e. = having one unikernel use multiple cores). While this is not ready today and= there are still significant efforts to get there, it means that this Mirag= eOS backend will be able to benefit from these efforts and eventually suppo= rt the full feature set of OCaml 5.

    Furthermore, the Unikraft community (which is quite active) is experimentin= g with a variety of other targets such as bare-metal for some platforms or = new hypervisors (e.g. seL4). Any new target Unikraft supports can be then s= upported "for free" by MirageOS too. For example, this already brings firecracker as a new supported VMM for MirageOS.

    Lastly, since Unikraft is POSIX-compatible (for a large subset of syscalls)= , this potentially enables MirageOS unikernel to embed OCaml libraries that= have not been ported to use the Mirage interfaces in the future. This woul= d be useful for large libraries which are hard to port (owl comes to mind).

    Overview of the Unikraft support

    To add new MirageOS backends requires to create or modify a series of compo= nents:

    Using Unikraft with a QEMU or a Firecracker backend is as simple as choosin= g the unikraft-qemu target or the unikraft-firecracker one when configuring a unikernel.

    • The OCaml/Unikraft cross compiler

      To build the OCaml cro= ss compiler to Unikraft, we use the Un= ikraft core, the Unikraft lib-musl and musl its= elf. musl is the C library recommend= ed by Unikraft to build programs using the POSIX interface. This made it ea= sy to build the OCaml 5 runtime, in particular because it provides an imple= mentation of the pthread API which is now used in many places = in the runtime[^*]. This could also make it easier to port some libraries t= hat depend on Unix to work on Unikraft backends.

      [^*]: Adding support for Thread-Local Storage has been a large part of the = work to get OCaml 5 working on Solo5: even if the creation of threads is no= t supported, TLS is still necessary to get the runtime to compile.

      The OCaml cross compiler per se builds upo= n the work that has been upstreamed to ease the creation= of cross compilers, using almost the same series of patches than for <= code>ocaml-solo5. So the only version of the compiler that is curren= tly supported for OCaml/Unikraft is OCaml 5.3. Almost all the patches will = be in the upcoming OCaml 5.4 and there should no longer be any patches requ= ired by OCaml 5.5.

      Note that we didn=E2=80=99t go with the full standard Unikraft POSIX stack,= which includes lwIP= to provide network support. We had a prototype at some point relying o= n lwIP to validate our progress on other building blocks but it raised many= incompatibility issues with the standard MirageOS network stack so we drop= ped support for lwIP in that first release; we developed instead the librar= ies required to plug the MirageOS stacks into the low-level interfaces prov= ided by the Unikraft core.

    • The new MirageOS libraries for Unikraft suppor= t

      The Unikraft support comes with packages using the standard names: mi= rage-block-unikraft and mirage-net-unikraft to support = the block and network devices. Those libraries are implemented directly on = top of the low-level Unikraft APIs, and so are using virtio on= both QEMU and Firecracker VMMs. To evaluate the quality of the implementations for those devices, we ran a = couple of small benchmarks. You can find those benchmarks (the unikernels a= long with some scripts to set them up and run them) in the benchmarks= directory in @Firobe=E2=80=99s fork of mirage-skeleton, benchmarks= branch.=20

      • Network device

        To measure the performance of the network stack, we have tweaked the simple= network skeleton unikernel to compute some statistics and us= ed a variable number of clients all sending 512MB of null bytes. We have ru= n this benchmark both on a couple of x86_64 laptops and on a L= X2160 aarch64 board, all running a GNU/Linux OS.

        We have observed a lot of variability in the performance of the solo5= -spt unikernel (sometimes better, sometimes worse than unikraf= t-qemu) depending on the actual computer used, so those measures sho= uld be read with a grain of salt.

        On two different x86_64 laptops:

        3D"0ee00c0dca5cb89=

        3D"d8b19b3acbfb283a=

        On the LX2160 aarch64 board:

        3D"fd4364c26dbd295=

      • Block device

        To measure the performance of the block devices, we wrote a simple unikerne= l copying data from one disk to another. We can see that the performance of= unikraft-qemu is lower than solo5-hvt for small = buffer sizes; fortunately, the situation improves with larger buffer sizes.= We ran this benchmark only on a x86_64 laptop as there=E2=80= =99s currently an issue with two block devices on aarch64 on Unikraft.

        3D"ee6f=

        It is worth mentioning that I/Os can be parallelised, which also gives a si= gnificant performance boost. Indeed, mirage-block-unikraft can= leverage the parallelised virtio backend of QEMU and Firecracker; it takes= care of limiting I/Os to what the hardware supports in terms of both paral= lelism and sector size.=20

    • Current limitations
      1. In our tests only Linux appeared well supported to compile Unikraft at = the moment so we=E2=80=99ve restricted our packages to that OS for now.
      2. Unikraft supports various backends itself; in this first release, we=E2= =80=99ve only added support and tested its two major ones: QEMU and Firecracker.

    How to use

    To try the new Unikraft backend for MirageOS, you need to use an OCaml 5.3 = switch, so create one first if needed. Then add our opam overlay to get acc= ess to our latest versions of the packages until they are published on the = standard repository and install mirage and the OCaml/Unikraft = cross compiler. The short version could be:

    $ opam switch create unikraft-test 5.3.0
    $ opam repo add mirage-unikraft-overlays https://github.com/Firobe/mirage-u=
    nikraft-overlays.git
    $ opam install mirage ocaml-unikraft-backend-qemu ocaml-unikraft-x86_64
    

    See below for some explanations about the numerous OCaml/Unikraft packages.

    >>From then on, you can follow the standard procedure (see how to install MirageOS and how to build a hello-world unikernel) to b= uild your unikernel with the Unikraft backend of your choice.

    $ mirage configure -t unikraft-qemu
    $ make
    
    • Details about the various packages for the OCa= ml/Unikraft cross compiler

      The OCaml cross compil= er to Unikraft is split up into 14 packages (see the PR to opam-repository for more details) so that users can:

      • choose which of the backends (QEMU or Firecracker) and which of the arc= hitectures (x86_64 and arm64) they want to instal= l, where all combinations can be installed at the same time,
      • choose which architecture is generated when they use the unikraft= ocamlfind toolchain by installing one of the two ocaml-unikra= ft-default-<arch> package,
      • install the ocaml-unikraft-option-debug to enable the (rea= lly verbose!) debugging messages.

      The virtual packages can be installed to make sure one of the architecture-= specific packages is indeed installed:

      • ocaml-unikraft can be installed to make sure that there is= indeed a unikraft ocamlfind toolchain installed,
      • ocaml-unikraft-backend-qemu and ocaml-unikraft-backe= nd-firecracker can be intalled to make sure that the unikraft<= /code> ocamlfind toolchain supports the corresponding backend.

      Those virtual packages will be used in particular by the mirage tool when the target is unikraft-qemu or unikraft-fire= cracker.

      All those packages use one of two version numbers. The backend packages use= the Unikraft version number they are using, while the OCaml compiler packa= ges per se use version 1.0.0.

    Conclusion

    This is a first release, which we are experimenting with; we expect to run = it in production in the coming months but it may need improvements neverthe= less. Notably absent from this release is an early attempt to leverage Unik= raft=E2=80=99s POSIX compatibility to implement Mirage interfaces instead o= f hooking directly to Unikraft=E2=80=99s internal components. This early ve= rsion used Unikraft=E2=80=99s lwIP-based network stack instead= of Mirage=E2=80=99s (fooling Mirage into thinking it was running on Unix),= and it may be interesting to revisit this kind of deployment, in particula= r for easy inclusion of unix-only OCaml libraries in unikernels.

    We are eager for reviews, comments and discussion on the implementation, de= sign and approach of this new Mirage backend, and hope it will be useful to= others.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of March 18 to 25, 2025.

    Ocsigen migrating to effect-based concurrency

    Vincent Balat announced

    We're delighted to announce that the Ocsige= n project has just launched one of its most ambitious changes: moving f= rom Lwt to effects-based concurrency.

    If this experiment goes well, it will be another step towards simplifying W= eb development in OCaml, by eliminating the need for monads.

    Of course we will try to make this transition as smooth as possible, by pro= viding a compatibility interface for application developers, and tools to h= elp Web and mobile developers to do the transition themselves if they want = to. These tools will be released in order to help other projects to do the = transition and avoid incompatibilities between OCaml libraries as much as p= ossible.=20

    This work was made possible thanks to the support of the NGI Zero Core fund through the Nlnet foundation, and is perfomed by Tarides.

    Read the full announcement by Tarides.

    Slipshow!

    Paul-Elliot announced

    Dear reader,

    I am absolutely thrilled to announce the r= elease of slipshow 0.1.1 on this forum! As you have all notice= d, that is a huge leap from the previous v= ersion, 0.0.34. (What can have motivated this?)

    Recall that Slipshow i= s a tool to prepare presentation support, that is based on scripted scrolli= ng and zooming (instead of slides).

    I'll use this single thread to announce all future versions of slipshow, to= avoid polluting the global namespace, as it makes sense to keep this forum= centered around OCaml, and this tool has nothing to do with OCaml …

    … well, almost nothing to do with OCaml, since in this version the e= ngine has been fully rewritten in OCaml (hence the bold new version) and wo= rks much better! Making it a full OCaml project. Thanks, OCaml developers o= f open source libraries and language!

    To upgrade it, you can do:

    $ opam update
    $ opam upgrade slipshow
    

    What? Some people don't have it installed already? For those, it will be:

    $ opam update
    $ opam install slipshow
    

    Now comes the moment you are all waiting for: the list of new features!

    TLDR:

    • Engine rewritten in OCaml
      • Fewer bugs when navigating back
      • Stronger foundation (eg, for subslips)
      • Custom scripts requires minor adjustments
      • Breaking change in subslip HTML
    • Drawing now in SVG
      • No more zoom issues
      • Erasing works "per-stroke"
    • Revamped table of content
      • Now based on title structure rather than subslips
    • New --markdown-output flag for converting to GFM
    • Parser bugfixes
    • License change: Now GPLv3 (previously MIT)
    • npm distribution discontinued.
    • Special thanks to NLNet for their sponsorship!

    Dear readers,

    I am thrilled to announce the 0.1 release of Slipshow, the slip-based prese= ntation tool!

    This is a major minor release. While versi= ons 0.0.1 to 0.0.33 have served well to experimen= t, this release marks a fresh start, aimed at being a solid foundation for = a project with a clear direction. A huge thank you to NLNet for sponsoring this milestone!

    So, what is new? Quite a lot, the main change being that the engine has bee= n fully rewritten.

    The engine

    Started as a single file javascript project, the old engine evolved present= ation by presentation – leading to numerous bugs, maintenance challe= nge or extensibility issue. (In other word, I did all I could not to touch = it despite all the bugs)

    This release introduces a complete rewrite of the engine in OCaml, with new= design choices that improve reliability and expandability. Let's go over t= he key benefits and breaking changes.

    • Navigating Forward… and Backward

      One of the greatest weakness of the old engine was handling backward naviga= tion. Since it started as a simple "script scheduler", going back wasn't st= raightforward. The workaround involved taking a snapshot of… everyth= ing (the DOM, the state, …), to be able to go back in time.

      This had many bugs, in animations (such as the "focus" action), and in its = iteraction with other features (such as drawing).

      So, what is new in this engine? The engine now records an undo function for= each step of the presentation. While this may not sound much, it is a ton = better in terms of development. It's a much stronger foundation to build ne= w features from. It's also much more efficient for long presentations.

      In most cases, your old presentations will work without modification in the= new engine. However, there is one case where it needs modification: when y= ou include the execution of a custom script in your presentation. In this c= ase, you need to return the function undo to undo the executed step: see th= e documentation! (This is not ideal and better solutions are bein= g experimented)

    • Writing

      Previously, live annotations used the excellent atrament library. While great in many cases, it= s bitmap-based approach caused blurriness when zooming.

      This release introduces a custom SVG-based annotation system, which elimina= tes zoom issues. Another change: erasing now works stroke-by-stroke instead= of pixel-by-pixel.

    • Table of content

      The old table of contents was based on the slip structure, which didn=E2=80= =99t work well for presentations that primarily used a single slip (as is o= ften the case with compiled presentations).

      The new sidebar-style table of contents is now generated from headers, maki= ng it more intuitive and aligned with the presentation=E2=80=99s structure= =E2=80=94resulting in a much smoother navigation experience!

    • Breaking change: Subslips

      The HTML structure for subslips has evolved, in particuler to avoid having = to provide the scale of your subslips.

      Support for subslip in the new engine is not mature and will be announced i= n the next release, but bear in mind that if your presentation relies on th= em, you might want to wait a bit before migrating to the new engine!

    Compiler

    While this release focuses on the engine, the compiler has also seen improv= ements, including bug fixes (particularly in the parser) and a new feature:

    • --markdown-output for markdown ex= ports

      If you want to print your presentation or host it as a static webpage, the = default format can be cluttered with annotations. The new --markdown-= output flag lets you generate a clean, GitHub Flavored Markdown (GFM= ) file without annotations.

    Other

    A small but maybe important note: the license has changed, the project has = transitioned from MIT to GPLv3, aligning better with its values.

    Conclusion

    Looking forward to your bug reports!

    Christian Lindig asked and Paul-Elliot replied

    Could you link to a demo presentation done with this tool?

    Sure!

    Here= is a presentation of the tool itself, in French. The source file for it is= here.

    Here is a math presentation using more features (made using a previous= version of the engine, which had more features and more bugs).

    Here= is the historical first presentation made in Slipshow (made with the worst= version of the engine).

    (I include presentations made with old versions of the engine to give an id= ea of what you can do, as the new engine is very new I don't have many exam= ples using it, and it has some breaking changes which makes porting old pre= sentations using too many features hard to port!)

    Daniel B=C3=BCnzli added

    Here= is a non-dogfooded one.

    Odoc 3.0 released!

    Jon Ludlam announced

    On behalf of the Odoc development team, I=E2=80=99m delighted to announce t= he release of Odoc 3! This is a big big release with loads of new features = and bug fixes, and I encourage everyone to install it and have a play!

    For an overview of the new features see our beta release announcement. tl= ;dr:

    $ opam install odoc-driver # will install odoc 3
    $ odoc_driver odoc odoc-parser odoc-driver odoc-md sherlodoc --remap
    

    and point your browser at _html/index.html. This example shows= odoc_driver creating the docs for the 5 packages specified and remapping l= inks to other packages (see here for an explanation)

    If you try the above command, you'll note something interesting, and hopefu= lly this will encourage you to run odoc_driver on your own pac= kages before you release them, as then you'll be able to avoid slightly emb= arrassing post-release fixes like this one =F0=9F=98=AC

    Here are the changes from the beta release:

    4th editor tooling dev-meeting: 28th of March

    PizieDust announced

    Hi everyone, join us for the next Editor Public Dev-Meeting on Ma= rch 28th! This session will feature a talk from Xavier (@xvw) on= the latest Emacs functionalities integrated with OCaml LSP serve= r.

    :clipboard: Meeting agenda:

    • A tour-de-table to allow the participants that wish to do so to present= themselves and mention issues / prs they are interested in.
    • Talk from Xavier and Q&A
    • Discuss issues and pull requests that were tagged in advance or mention= ed during the tour-de-table.
    • =F0=9F=94=B9 What=E2=80=99s new in Emacs for OCaml development?<= /li>
    • =F0=9F=94=B9 How the latest LSP improvements enhance the experience?=
    • =F0=9F=94=B9 Live demo and discussion on upcoming features
    • =F0=9F=93=85 Date: March 28th
    • =F0=9F=95=90 Time: 4PM CET
    • =F0=9F=93=8D Location: https://meet.google.com/w= rv-dovu-ypb

    This is a great opportunity to learn about the latest improvements and shar= e feedback with the community. Looking forward to seeing you there! =F0=9F= =9A=80

    Previous meeting notes are available in Merlin=E2=80=99s repository wiki<= /a>

    https://calendar.= app.google/zPx5ZQ47C4dwq3437

    The Call for Papers for FUNARCH2025 is open!

    Jeffrey Young announced

    Hello everyone,

    This year I am chairing the Functional Architecture workshop colocated with= ICFP and SPLASH.

    I'm happy to announce that the Call for Papers for FUNARCH2025 is open - deadline is June 16th! Send us research papers, experience reports, ar= chitectural pearls, or submit to the open category! The idea behind the workshop is to cross poll= inate the software architecture and functional programming discourse, and t= o share techniques for constructing large long-lived systems in a functiona= l language.

    See FUNARCH2025 - ICFP/SPLASH for more info= rmation. You may also browse previous year's submissions here and here.

    See you in Singapore!

    Proposal for the replacement of Set and Map in the stdlib

    Christophe Raffalli announced

    Hello,

    While working on AVL for teaching I found an alternative to the AVL that se= ems overall better than the current ocaml implementation. The code is avail= able here: https= ://github.com/craff/ocaml-avl/tree/master. The Readme.md contains the i= nequality needed to prove correctness and termination of the balancing func= tion "join".

    The idea is to replace the constraint

    |height left_son - height right_son| <=3D 2=20
    

    By

    size left_son <=3D 2 * size right_son + 1
    size right_son <=3D 2 * size left_son + 1
    

    We see 3 advantages:

    • O(1) cardinal of set or map
    • slightly simpler code or at least not more complicated (see below)
    • seems faster in many cases (not always and strangely depends on compilation options). Use dune exec ./test.exe for some simple tests.

    Before submitting a PR, I think it call be a good idea to call for comments= here.

    Cheers, Christophe

    A tool to reverse debug OCaml (and other binaries) runs

    Sid Kshatriya announced

    I'd like to announce a debugging tool I've built ! It's called Software Counters mode rr .=20

    It is available at http= s://github.com/sidkshatriya/rr.soft

    Many of you may have already heard of a debugger called rr – it allows you t= o record and replay programs on Linux. It is extremely useful for instance = to debug issues with garbage collection or other low level issues in native= ly compiled OCaml programs. Once you capture a bug during the record phase,= that bug can be replayed any number of times during replay.

    One major limitation of rr is that it requires access to CPU H= ardware Performance counters which is usually not available in cloud VMs or= containers.

    Software Counters mode rr = is a modification of the rr debugger that lifts this limitatio= n – access to CPU Hardware Performance counters is not required.= This means you can run rr in many more configurations.

    I've been able to successfully record/replay the whole OCaml compiler test = suite using Software Counters mode r= r (Except for a single ocaml test called pr2195 which e= xhausts the file descriptors).

    I've also written a blog post about record/replay debugging generall= y and Software Counters mode in particular= . Please see here.

    Feedback request: New lesson on Lazy

    Jakub Svec announced

    Hello,

    I created a lesson on the Lazy module that I'd like to propose= for the language tutorials section of ocaml.org.

    You can find the draft on HackMD

    Please suggest anything you would like, I'm happy to make several rounds of= improvement.

    Lesson implementation decisions:

    This lesson is focused on beginners.

    The first draft of this lesson is 345 lines, which is on the shorter side c= ompared to other lessons.

    The surface area of the Lazy module is small, so I took the op= portunity to supplement the lesson with a thorough explanation of evaluation strategies.= This is supplemental, however, and can be shortened or removed based on your prefer= ences.

    Without the supplemental section, the lesson is only 200 lines long.

    OCaml Workshop 2025 at ICFP/SPLASH - announcement and call for= proposals

    Kiran Gopinathan announced

    Hihi everyone!!!

    This year, the ICFP (Internation= al conference on Functional Programming) Programming Languages conferences = will be held in Singapore (colocated with SPLASH in fact!):

    3D"920=

    Continuing this community's annual tradition from 2012, we will be hosting = the OCaml workshop after the ICFP conference, on the 17th October 2025 (= Friday). The workshop is intended to cover all different kinds of aspec= ts of the OCaml programming language as well as the OCaml ecosystem and its= community, such as scientific and/or research-oriented, engineering and/or= user-oriented, as well as social and/or community-oriented.

    Call for talk proposals

    The call for talk proposals for the workshop is now open!

    • Dates

      Here are the important dates:

      • Talk proposal submission deadline: July 3rd (Thursday)
      • Author notification: August 7th (Thursday)
      • Workshop: October 17th (Friday)
    • Submissions

      Submissions are typically around 2 pages long (flexible), describing the mo= tivations of the work and what the presentation would be about.

      We encourage everyone who might be interested in giving a talk to submit a = proposal! We truly mean everyone, and also have strongly anyone in mind who= belongs to a group that=E2=80=99s traditionally underrepresented at OCaml = workshops, e.g. due to your gender(s) or non-gender, where you=E2=80=99re f= rom or based or whatever other kinds of characteristics you might have. You= should all be able to find all information you=E2=80=99ll need to submit a= proposal on the official call for talk proposals. = However, if you have any question, don=E2=80=99t hesitate to ask us.

    • Quota on accepted talks per affiliation

      Following the approach from last year which worked well, this year again we= will try to enforce a quota of a maximum of four talks given by speakers w= ith the same company/university/institute affiliation. In order to guarante= e a coverage of a diverse range of topics and perspectives, we=E2=80=99ll e= xperiment with the same affiliation quota again.

      Do not hesitate to submit your talk proposal in any case: quotas, if needed= , will be taken into account by the PC after reviewing all submissions, so = there=E2=80=99s no reason to self-select upfront.

    About the workshop itself

    So far, we=E2=80=99ve only covered the talk proposals and formalities. The = exciting part will be the workshop itself! The OCaml workshop is going to b= e a whole-day event and, similarly to previous years, it=E2=80=99s likely g= oing to have four sessions of about four talks each. It=E2=80=99s a fairly = informal and interactive environment, where people engage in all kinds of c= onversations about OCaml during the breaks and after the workshop.

    • Hybrid attendance and cost for speakers

      We=E2=80=99re aiming to make the workshop hybrid with the same streaming mo= dalities as last year, meaning that talks as well as participation can b= e either in-person or remote, and remote attendance will be free= . To promote a good atmosphere, communication and engagement, we prefer to = have most talks in-person, but remote talks will be most welcome as well.

      There may be opportunities for speakers who would not have funding otherwis= e (via their employer or university) to attend, although we are still in th= e process of confirming this. (Please keep an eye on this post, which will = be updated once we get confirmation!)

      We will do our best to provide the best workshop experience possible for re= mote participants, within the constraints of the hybrid format. While atten= ding in-person does come with advantages, it also comes with an environment= al cost, and we strongly support transitioning to a less plane-intensive or= ganization for conferences and community events :deciduous_tree: .

    • Related events

      The day before the OCaml workshop, i.e. Oct 16th (Thursday), is the day of = the ML workshop, with focus on more theoretical aspects of OCaml and= the whole family of ML languages in general. The ML workshop and tends to = be very interesting for OCaml lovers as well.=20

      That aside, this year, I believe, is the first year that both the ICFP and = SPLASH programming languages conferences are going to be co-located, so thi= s is an exciting opportunity to experience the whole breadth of two of the = top-ranked PL conferences over the span of a week! What a time to be alive!

      We=E2=80=99re looking forward to the the talk submissions and to the worksh= op! Let us know if you have any questions. @Gopiandcode & @yasunariw

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of January 28 to Februar= y 04, 2025.

    Opam repository archive - clarification of the opam fields

    Hannes Mehnert announced

    Dear everyone,

    we had further discussions about the semantics of x-maintenance-inten= t, and hope to clarify in this post. Also, we adapted the policy whi= ch is in the opam-repository git repository: https:/= /github.com/ocaml/opam-repository/blob/master/governance/policies/archiving= .md

    x-maintenance-intent

    We've had some further discussions on Phase 3 and the semantics of the x-maintenance-intent field.

    • Goal

      Our aim is to be not disruptive for the common OCaml programmer or user. Th= e opam-repository supports (from February 1st on) OCaml 4.08 and greater. T= his means that if you install OCaml 4.08 you should be able to install all = the packages that have ever been released with 4.08 support.

      The revised semantics of "(latest)" is "the latest version of this package,= so that every supported OCaml version will have an installation candidate".

      • Example

        Let me give you an example, consider the package "basic" which exists in th= ree versions:

        • basic.1.0.0 with the dependency "ocaml" {>=3D "4.05" & < "5"}=
        • basic.1.0.1 with the dependency "ocaml" {>=3D "4.08" & < "5"}=
        • basic.2.0.0 with the dependency "ocaml" {>=3D "4.14" & < "5"}=

        Here, if the x-maintenance-intent: [ "(latest)" ] is present, = we will only (try to) archive basic.1.0.0 – since 1.0.1 is needed fo= r OCaml 4.08 .. 4.13.

    • Default value

      The default value of x-maintenance-intent will for now be "(any)" - so all versions are kept. In the future, we may change t= his default to "(latest)", but will announce this ahead of the= change with plenty of time.

      This default value is agreed on by the non-disruptive agreement to cause th= e least trouble.

    x-maintained

    In addition to the x-maintenance-intent - which covers the sem= antics of all versions of an opam package, we support another field, = x-maintained: BOOL. This is an overwrite for a specific opam package= version, and allows to declare whether it is maintained or not.

    It is useful in the setting where you've lots of pre-releases that are no l= onger maintained and you like to state this without writing a global intent= for the opam package (e.g. for the OCaml compiler packages, the alpha, bet= a, and rc versions). Here, x-maintained: false is a nice setti= ng. NB: earlier we proposed flags: deprecated - but we stay aw= ay from the flags, since there may be packages that are deprecated but stil= l maintained (opam prints a warning if you install a package with the depre= cated flag).

    If you have a private project and depend on a specific version of an opam p= ackage, you can as well PR the x-maintained: true field for th= at opam file (please specify when, who, and why). This will ensure that thi= s opam file stays in the opam repository.

    Phase 3

    In Phase 3, we will consider all packages marked with x-maintenance-i= ntent (the versions not matching the intent) and x-maintained:= false to be archived.

    We plan to ensure that (a) all supported OCaml versions will retain an inst= allation candidate (b) all reverse dependencies will still be installable. = As a note, if you have an availability condition (some version will only wo= rk on some OS), we won't take that into consideration – you will nee= d to specify the x-maintenance-intent to cover your versions.

    Our plan is to publish the list of packages to be archived by February 15th= on this discourse. It is likely we'll have candidate lists PRed to the opam-repository-a= rchive earlier. We have lots of ideas and plans for CI systems to give = feedback which opam versions are falling into the maintenance intent when y= ou open a PR to the opam-repository (but we're not there yet).

    Future

    As noted above, the default value of x-maintenance-intent may = change in time. If this is decided, we will announce this with plenty of ti= me before.

    Also, at some point in the future we will bump the OCaml lower bound (from = February 1st it is 4.08).

    Action

    For the smooth shrinking of the opam-repository, please don't hesitate to f= ill in your x-maintenance-intent (especially "(none)" and "(latest)" are fi= ne and safe choices).

    If you want to contribute more, the opam-repository needs help for triaging= and merging PRs - why not become a maintainer? See the old but still valid= 'call for new opam-repository maintainers' if you're inter= ested.

    Ch=C3=BAc m=E1=BB=ABng n=C4=83m m=E1=BB=9Bi =E1=BA=A4t T=E1=BB= =B5 2025!

    sanette announced

    Happy Vietnamese (and Chinese too) New Year!

    It's the year of the snake, no its has nothing to do with python, but why not play Sn=C3=B3k= e ;)

    Happy OCaml snaky year to all

    3D"724=

    Rewriting Slipshow in OCaml: The undo-able monad

    Paul-Elliot announced

    Hello OCamlers,

    I have recently rewritten Slipshow's engine from JavaScript to OCaml. It turns out this rewriting was very satisfying, and many niceties came out= of it. I have written a blog post about a specifically interesting one: the use of= custom let operators with the "undo-able" monad. I hope you e= njoy the read!

    The blog post: How I fix= ed Slipshow's worst flaw using OCaml and a monad.

    Announcing climate.0.4.0

    Steve Sherratt announced

    Climate is a declarativ= e command-line parser for OCaml. This release is mostly focused on improvin= g --help messages and allowing the colours of help messages to= be configured.

    Added

    • Allow help messages colours to be configured (#7)
    • Proof of concept of manpage generation (disabled in release as it's ver= y incomplete) (#11<= /a>)

    Fixes

    • Remove superfluous style reset escape sequences (#7)
    • Don't apply formatting to trailing spaces in argument names in help mes= sages (#8)
    • Print a readable error when the argument spec is invalid (#10)

    15th MirageOS retreat May 13th - 20th

    Hannes Mehnert announced

    Dear everybody,

    we'll have another MirageOS retreat in May 2025 (13th - 20th). Happy to see= lots of old and new faces there.

    Please jump to https://retreat.mir= ageos.org for further details, and sign up and spread the word :)

    Don't hesitate to ask questions in this topic.

    Dune dev meeting

    Etienne Marais announced

    Hi Dune enthusiasts :smile:,

    We will hold the regular Dune Dev Meeting on Wednesday, February, 5th= at 9:00 CET. As usual, the session will be one hour long.

    Whether you are a maintainer, a regular contributor, a new joiner or just c= urious, you are welcome to join: these discussions are opened! The goal of = these meetings is to provide a place to discuss the ongoing work together a= nd synchronize with the Dune developers! :ok_hand:=20

    :calendar: Agenda

    The agenda is available on the meeting dedicated page. Feel free to ask if y= ou want to add more items in it.

    :computer: Links

    Other OCaml News

    From the ocaml.org blog

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 15 to 22, 2025.

    Flambda2 Ep. 4: How to write a purely functional compiler, by = OCamlPro

    OCamlPro announced

    Greetings Cameleers!

    We're back with another deep dive into the Flambda2 Optimizing Compiler<= /b>! Our latest entry in the Flambda2 Snippets blog series is out != =20

    F= lambda2 Ep. 4: How to write a purely functional compiler

    Beware, this episode is a hefty one ! :muscle: :triumph:

    This time again, we take you on a journey through the heart of Flambda2<= /b>'s optimization process. Indeed, we take a look at the high-level consid= erations of Simplify, the main optimization algorithm! This po= st is the most important one yet. The subject is key to coming to grasps wi= th the philosophy and design behind our home-made compiler and we highly re= commend that you read it if you're interested in functional programming<= /b>, exotic compiler architectures, novel engineering, and programming language representation!

    If you've been following the series, this article builds on what= we've covered before =E2=80=94 especially Foundational Design Decisions<= /b> (episode 1), and Speculative inlining (episode 3) =E2=80= =94 so you might want to check these out first. And as always, this is all = leading up to even more compiler spelunking in future posts! :pick:=20

    Hope you enjoy the read, and let us know what you think!

    Until next time, The OCamlPro Team

    R and D Engineer Positions available at OCamlPro, in Paris (Fr= ance)

    OCamlPro announced

    Greetings Cameleers,

    We are thrilled to announce that OCamlPro is hiring!

    OCamlPro is a R&D lab founded in 2011, with the mission to help industr= ial users benefit from experts with a state-of-the-art knowledge of program= ming languages theory and practice. We provide audit, support, custom devel= oper tools and training for both the most modern languages, such as Rust, W= asm and OCaml, and for legacy languages. We design, create and implement so= ftware with great added-value for our clients. We have a long history of cr= eating and maintaining open-source projects, such as the Opam package manag= er, the LearnOCaml web platform, Ocp-indent / Ocp-index, Flambda and Flambd= a2 optimizing OCaml compilers. We also contributed to the Rust compiler and= standard library, and are now core contributors of the GnuCOBOL project. W= e are also experts of Formal Methods, developing tools such as our SMT Solv= er Alt-Ergo.

    We are currently looking to hire French speaking Senior and <= b>non-Senior R&D Engineers as well as new Project Managers. = Since speaking French is mandatory, the rest of this article, and th= e job offers linked below, will be written in French. :france:

    OCamlPro recrute :

    • Un=C2=B7e Ing=C3=A9nieur=C2=B7e R&D Senior

      Conception et dev en OCaml (et Rust), encadrement, relation client, explora= tion techno, perfs, tests, veille et formations. Poste cl=C3=A9 au c=C5=93u= r d=E2=80=99une =C3=A9quipe experte.

    • Un=C2=B7e Ing=C3=A9nieur=C2=B7e R&D

      D=C3=A9veloppement en OCaml (et Rust), conception logicielle, perfs, tests,= veille techno, mont=C3=A9e en comp=C3=A9tences et travail en =C3=A9quipe e= xperte.

    • Un=C2=B7e Chef=C2=B7fe de Projet Informatique & R&D

      Pilotage de projets, coordination d=E2=80=99=C3=A9quipes, interface client,= suivi budget/d=C3=A9lais, reporting, et veille techno dans un environnemen= t innovant.

    Notre =C3=A9quipe est principalement bas=C3=A9e =C3=A0 Paris, mais nous som= mes ouverts au travail =C3=A0 distance, tant que des s=C3=A9jours r=C3=A9gu= liers =C3=A0 Paris sont possibles pour renforcer la coh=C3=A9sion de l'=C3= =A9quipe.

    Veuillez envoyer votre CV ainsi qu'une description de certaines de vos meil= leures r=C3=A9alisations =C3=A0 l'adresse suivante : [contact@ocamlpro.com]= (mailto:contact@ocamlpro.com)

    Vous trouverez des fiches de poste d=C3=A9taill=C3=A9es au format PDF ic= i : http://www.ocamlpro.com/jobs

    Release of ocaml-eglot 1.2.0

    Xavier Van de Woestyne announced

    We (at Tarides) are particularly pl= eased to announce the release of OCaml-eglot 1.2.0, An overlay on Eglot (the <= i>built-in LSP client for Emacs) for editing OCaml!

    ocaml-eglot is an alternative mode to merlin which uses ocaml-lsp-server (instea= d of ocamlmerlin) as the language server. So yes, if you decid= e to use~ocaml-eglot~, merlin is no longer needed. (Mer= lin is still used as a library, in ocaml-lsp-server).

    This version discreetly improves the ergonomics of certain orders, gives mo= re control over customer-side order support and drastically improves error = handling! Here's the full changelog and, in the meantime, I'm adding the ch= angelog for version 1.1.0, which hadn't been announced:

    1.2.0

    • Fix Type-enclosing's buffer update when using caml-mode (<= a href=3D"https://github.com/tarides/ocaml-eglot/pull/48">#48)
    • Add ocaml-eglot-search-definition, ocaml-eglot-searc= h-declaration and alternative functions (#45)
    • Fix some warnings on byte-compilation (#40)
    • Fix error on on ocaml-eglot-construct (#42)
    • ocaml-eglot-alternate-file now visits file in other window= when prefix argument is set (#51)
    • Add error-handling for jsonrpc-request (#52)
    • Maintain more diagnostics for location failure (#52)
    • Fix hole cycle navigation (#53)
    • Relay on custom request (if it is available) for managing holes (#53)
    • Implementation of support for experimental client commands (and impleme= ntation of ocaml.next-hole in the presence of the ocaml-= eglot-destruct action) (#54)

    1.1.0

    • A first support for flycheck (#29, #33 and #37)
    • Use a more efficient way to ensure that a vector is empty (#27)
    • Made the mode-line "lighter" more conventional (#26)

    Spotlight on new features

    Two easily observable features:

    • Finding an identifier
      • ocaml-eglot-find-identifier-declaration
      • ocaml-eglot-find-identifier-definition

      the two commands behave like their analogues (ocaml-eglot-find-defini= tion and ocaml-eglot-find-declaration) but allow the us= er to enter the identifier directly:

      3D"5835742f3fadaf60=

    • Searching for a definition or a declaration
      • ocaml-eglot-search-declaration
      • ocaml-eglot-search-definition

      Allows you to search by type or polarity to find the definition (implementa= tion) or declaration (signature) of values!

      3D"f48b3cb62a6eb6b8=

    Upgrading

    The release is available on MELPA, so you can update it using the usual pro= cess. As always, your feedback is invaluable!

    Happy hacking

    Outreachy December 2024 Round

    Continuing this thread, Patrick Ferris announced

    Thank you everyone who came along to our demo day. I think I speak for ever= yone when I say @abdulaziz.alkurd's work is very impressive and we all can'= t wait for being able to easily diff OCaml APIs!

    The meeting has now been published: https://watch.ocaml.org/w/eWRikkpwoox1SboAwrDshD

    Dune 3.18

    Etienne Marais announced

    We are happy to announce the release of Dune 3.18.1 :camel:=20

    This version is a minor release that contains a bug fix to an issue that wa= s preventing pkg-config from finding some libraries in some co= ntexts.

    If you encounter a problem with this release, you can report it on the ocaml/dune repository.

    Changelog

    • Fixed
      • fix: pass pkg-config (extra) args in all pkgconfig invocations. A missi= ng --personality flag would result in pkgconf not finding librari= es in some contexts. (#11619, @MisterDA)

    opam 2.4.0~alpha1

    Kate announced

    Hi everyone,

    We are happy to announce the first alpha release of opam 2.4.0.

    This version is an alpha, we invite users to test it to spot previously unn= oticed bugs as we head towards the stable release.

    What=E2=80=99s new? Some highlights:

    • :dragon_face: On opam init the compiler chosen for = the default switch will no longer be ocaml-system (#3509) This was done because the system compiler (as-is your ocaml installed syste= m wide, e.g. /usr/bin/ocaml) is known to be under-tested and prone to a var= iety of bugs and configuration issues. Removing it from the default compiler allows new-comers a more smooth exper= ience. Note: if you wish to use it anyway, you are always able to do it explici= tly using opam init --compiler=3Docaml-system
    • :camel: GNU patch and the diff = command are no longer runtime dependencies. Instead the OCaml = patch library is used (#6019, #= 6052, #3782, = ocaml/setup-ocaml= #933) Doing this we've removed some rarely used features of GNU Patch such as the= support of Context diffs. The new implementation only supports Unified diffs includ= ing the git extended heade= rs, however file permission changes via said extended headers have no e= ffect.
    • :snowflake: Add Nix support for external dependencies (depext= s) by adding support for stateless package managers (#5982). Thanks to @RyanGibb for this contribution
    • :cockroach: Fix opam install <local_dir> with= and without options like --deps-only or --show-action having unexpected behaviours (#6248, #5567) such as:
      • reporting Nothing to do despite dependencies or package no= t being up-to-date
      • asking to install the wrong dependencies
    • :ocean: Many more UI additions and improvements, bug fixes, performance= improvements, =E2=80=A6

    :open_book: You can read our blog post for more information about these changes and mor= e, and for even more details you can take a look at the release note or the changelog= .

    Try it!

    The upgrade instructions are unchanged:

    For Unix systems

    bash -c "sh <(curl -fsSL https://opam.ocaml.org/install.sh) --version 2.=
    4.0~alpha1"
    

    or from PowerShell for Windows systems

    Invoke-Expression "& { $(Invoke-RestMethod https://opam.ocaml.org/insta=
    ll.ps1) } -Version 2.4.0~alpha1"
    

    Please report any issues to the bug-tracker.

    Happy hacking, <> <> The opam team <> <> :camel:

    ML Family Workshop 2025: Call for Presentations

    Sam announced

    We are happy to invite submissions to the 2025 ML Family Workshop! Please h= elp spread the word and consider submitting! https://conf.researchr.org/home/icfp-splash-2025/mlsymposium-2025

    Higher-order, Typed, Inferred, Strict: ML Family Work= shop 2025

    Co-located with ICFP/SPLASH

    Workshop date: October 16, 2025, Singapore

    Submission deadline: June 19, 2025

    The ML Family Workshop is an established informal workshop serving to promo= te and inform the development of programming languages in the ML family (su= ch as OCaml, Standard ML, F#, and many others) as well as related languages= (such as Haskell, Scala, Rust, Koka, F*, Eff, ATS, Nemerle, Links, etc.) W= e welcome presentations on all aspects of the design, semantics, theory, ap= plication, implementation, and teaching of languages in the entire extended= ML family.

    The ML 2025 workshop will continue the informal approach followed since 201= 0. Presentations are selected by the program committee from submitted propo= sals. There are no published proceedings, so contributions may be submitted= for publication elsewhere. The main criterion is promoting and informing t= he development of the entire extended ML family and delivering a lively wor= kshop atmosphere. We particularly encourage talks about works in progress, = presentations of negative results (things that were expected to but did not= quite work out) and informed positions.

    Each presentation should take 20-25 minutes. The exact time will be decided= based on scheduling constraints.

    We plan the workshop to an be in-person event with remote participation (st= reamed live). We hope that speakers are able to present in person. If a spe= aker is unable to attend, they may instead present remotely.

    The 2025 ML family workshop is co-located with ICFP/SPLASH 2025 and will ta= ke place on October 16, 2025 in Singapore.

    Scope

    We seek presentations on topics including (but not limited to):

    • Language design: abstraction, higher forms of polymorphism, concurrency and parallelism, distribution and mobility, staging, extensions for semi-structured data, generic programming, object systems, etc.
    • Implementation: compilers, interpreters, type checkers, partial evaluators, runtime systems, garbage collectors, foreign function interfaces, etc.
    • Type systems: inference, effects, modules, contracts, specifications and assertions, dynamic typing, error reporting, etc.
    • Applications: case studies, experience reports, pearls, etc.
    • Environments: libraries, tools, editors, debuggers, cross-language interoperability, functional data structures, etc.
    • Semantics of ML-family languages: operational and denotational semantics, program equivalence, parametricity, mechanization, etc.

    We specifically encourage reporting what did not meet expectations or what, despite all efforts, did not work to satisfaction.

    Four kinds of submissions are solicited: Research Presentations, Experience Reports, Demos, and Informed Positions.

    • Research Presentations: Research presentations should describe new ideas, experimental results, or significant advances in ML-related projects. We especially encourage presentations that describe work in progress, that outline a future research agenda, or that encourage lively discussion. These presentations should be structured in a way which can be, at least in part, of interest to (advanced) users.
    • Experience Reports: Users are invited to submit Experience Reports about their use of ML and related languages. These presentations do not need to contain original research but they should tell an interesting story to researchers or other advanced users, such as an innovative or unexpected use of advanced features or a description of the challenges they are facing or attempting to solve.
    • Demos: Live demonstrations or short tutorials should show new developments, interesting prototypes, or work in progress, in the form of tools, libraries, or applications built on or related to ML and related languages. (You will need to provide all the hardware and software required for your demo; the workshop organizers are only able to provide a projector.)
    • Informed Positions: A justified argument for or against a language feature. The argument must be substantiated, either theoretically (e.g., by a demonstration of (un)soundness, an inference algorithm, a complexity analysis), empirically or by substantial experience. Personal experience is accepted as justification so long as it is extensive and illustrated with concrete examples.

    Submission details

    Submissions must be in the PDF format and have a short summary (abstract) at the beginning. Submissions in the categories of Experience Reports, Demos, or Informed Positions should indicate so in the title or subtitle. The point of the submission should be clear from its two first pages (PC members are not obligated to read any further.)

    Submissions must be uploaded to the workshop submission website before the submission deadline.

    Only the short summary/abstract of accepted submissions will be published on the conference website. After acceptance, authors will have the opportunity to attach or link to that summary any relevant material (such as the updated submission, slides, etc.)

    Submission Website: https://ml2025.hotcrp.com/

    Workshop Website: https://conf.researchr.org/home/icfp-splash-2025/mlsymposium-2025

    Dates and Deadlines

    Submission Deadline: Thursday, June 19 AoE

    Initial Author Notification (most cases): Thursday, July 31

    Final Author Notification (if needed): Thursday, Aug 7

    Workshop Date: Thursday, Oct 16

    Program Committee

    • Sam Westrick (New York University, USA) (Chair)
    • Michael D. Adams (National University of Singapore, Singapore)
    • Jonathan Brachth=C3=A4user (University of T=C3=BCbingen, Germany)
    • Chris Casinghino (Jane Street, USA)
    • Arthur Chargu=C3=A9raud (INRIA, France)
    • Kiran Gopinathan (University of Illinois Urbana-Champaign, USA)
    • Mirai Ikebuchi (Kyoto University, Japan)
    • Keigo Imai (DeNA Co., Ltd., Japan)
    • Anton Lorenzen (University of Edinburgh, UK)
    • Cyrus Omar (University of Michigan, USA)
    • Zoe Paraskevopoulou (National Technical University of Athens, Greece)
    • Filip Sieczkowski (Heriot-Watt University, UK)
    • Yong Kiam Tan (A*STAR Institute for Infocomm Research, Singapore)
    • Yuting Wang (Shanghai Jiao Tong University, China)

    Coordination with the OCaml Users and Developers Work= shop

    The OCaml workshop is seen as more practical and is dedicated in significant part to OCaml community building and the development of the OCaml system. In contrast, the ML family workshop is not focused on any language in particular, is more research-oriented, and deals with general issues of ML-style programming and type systems. There is some overlap, which we are keen to explore in various ways. The authors who feel their submission fits both workshops are encouraged to mention it at submission time or contact the program chairs.

    Other OCaml News

    From the ocaml.org blog

    Here are links from many OCaml blogs aggregated at the ocaml.org blog.

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe to the= caml-list.

    OCaml Weekly News

    Previous Week<= /a> Up Next Week

    Hello

    Here is the latest OCaml Weekly News, for the week of April 05 to 12, 2022.

    LexiFi is hiring!

    Alain Frisch announced

    =F0=9F=93=A2 LexiFi is hiring!

    =E2=9C=94=EF=B8=8F Software Engineer (full-time): https://lnkd.in/evhkxTg

    =E2=9C=94=EF=B8=8F Software Development Internship: https://lnkd.in/gb-bdDA9

    LexiFi is a software editor, based in Paris. We have been happily using OCa= ml =F0=9F=90=AA for more than 20 years in our entire software stack, from backend components to UI (web & native) front-end,= and we contribute back to the OCaml community (check out our blog post : https://www.lexifi.com/blog/ocaml/ocaml-open-source/)

    Don't hesitate to contact me directly if you want to learn more about the p= ositions before applying!

    D=C3=A9veloppeur principal =C3=A0 plein temps d'Alt-Ergo chez = OCamlPro

    Fabrice Le Fessant announced

    Alt-Ergo est l'un des solveurs SMT les plus efficaces pour la v=C3=A9rifica= tion formelle de code. Il est ainsi utilis=C3=A9 derri=C3=A8re des ateliers tels que Why3, Frama-C et Spark. Initialement d= =C3=A9velopp=C3=A9 par Sylvain Conchon au LRI, il est aujourd'hui maintenu par OCamlPro, gr=C3=A2ce aux financements du Club Alt-= Ergo (AdaCore, Trust-in-Soft, Thal=C3=A8s, MERCE, CEA List), =C3=A0 des contrats bilat=C3=A9raux d'=C3=A9volution et =C3=A0 d= es projets collaboratifs.

    OCamlPro souhaite aujourd'hui recruter un d=C3=A9veloppeur principal =C3=A0= temps plein pour Alt-Ergo, pour compl=C3=A9ter son =C3=A9quipe m=C3=A9thodes formelles et acc=C3=A9l=C3=A9rer l'=C3=A9volution= d'Alt-Ergo. Disposant d'une exp=C3=A9rience dans les m=C3=A9thodes formelles, ses missions seront :

    • de d=C3=A9couvrir le projet Alt-Ergo et tous ses composants (prouveur, = interface graphique, etc.) et d'en comprendre le fonctionnement =C3=A0 trav= ers l'exploration du code et la lecture d'articles scientifiques;
    • d'=C3=A9laborer la roadmap de maintenance =C3=A9volutive d'Alt-Ergo, en= collaboration avec les membres du Club Alt-Ergo, et de proposer des am=C3= =A9liorations qui pourront =C3=AAtre financ=C3=A9es au travers de contrats = bilat=C3=A9raux ou de projets collaboratifs;
    • de participer avec l'=C3=A9quipe =C3=A0 la maintenance corrective d'Alt= -Ergo et de fournir du support aux membres du Club Alt-Ergo;
    • de participer =C3=A0 l'encadrement de stages et de th=C3=A8ses CIFRE au= tour d'Alt-Ergo et des solveurs SMT en g=C3=A9n=C3=A9ral;
    • de suivre l'actualit=C3=A9 des solveurs SMTs et des travaux scientifiqu= es connexes, et de maintenir des collaborations avec les experts acad=C3=A9= miques du domaine;

    Int=C3=A9gr=C3=A9 au sein de l'=C3=A9quipe M=C3=A9thodes Formelles d'OCamlP= ro, il b=C3=A9n=C3=A9ficiera de leur exp=C3=A9rience et leur fera b=C3=A9n= =C3=A9ficier de son expertise croissante dans l'utilisation d'Alt-Ergo. Outre la mainten= ance d'Alt-Ergo, l'=C3=A9quipe M=C3=A9thodes Formelles d'OCamlPro participe =C3=A0 diverses activit=C3=A9s:

    • D=C3=A9veloppement d'outils open-source pour les m=C3=A9thodes formelle= s, tels que Dolmen, Matla, etc.
    • Expertises sur WhyML, TLA, Coq, et autres langages de sp=C3=A9cificatio= n et de v=C3=A9rification;
    • Certification de logiciels pour les Crit=C3=A8res Communs (EAL6 et plus= )
    • Sp=C3=A9cification et v=C3=A9rification formelle de smart contracts (So= lidity, etc.)

    Les bureaux d'OCamlPro sont dans le 14=C3=A8me arrondissement de Paris (Al= =C3=A9sia). L'entreprise est connue pour son =C3=A9quipe sympathique, son excellence technique, sa productivit=C3=A9, ses valeurs et= son =C3=A9thique.

    Si ce poste vous int=C3=A9resse, n'h=C3=A9sitez pas =C3=A0 envoyer votre CV= =C3=A0:

    contact@ocamlpro.com

    Pour plus d'informations sur OCamlPro:

    https://www.ocamlpro.com/

    Pour plus d'informations sur Alt-Ergo:

    https://alt-ergo.ocamlpro.com/

    Pour plus d'informations sur le Club Alt-Ergo:

    https://www.ocamlpro.com= /club-alt-ergo

    Using an external JavaScript file in js_of_ocaml

    John Whitington asked

    I am a beginner at both Javascript and js_of_ocaml, so I may b= e mixing up all sorts of mistakes and misconceptions here.

    I have compiled up an existing project, my command line PDF tools, using js_of_ocaml, and all is well:

    $ node cpdf.js -info hello.pdf
    Encryption: Not encrypted
    Permissions:
    Linearized: false
    Version: 1.1
    Pages: 1
    

    Like magic! But I had to comment out the parts of my code which use externa= l C code of course - that is zlib and some encryption primitives. So now I wish to bind javascript libraries for those= . I am experimenting with a simple library of my own, first, which is given on the command line to js_of_ocaml as foomod.js:

    foo =3D 42;
    

    I can get to this global variable easily from OCaml:

    let foo =3D Js.Unsafe.global#
    
    exports.foo =3D 42;
    

    How can I get to that? Giving foomod.js on the js_of_oca= ml command line includes the contents of foomod.js in some way, but does not contain the string foomod, so I'm not s= ure how to get to the foomod's variables and functions. How to I access them? In the node REPL, I can simply do:

    > foomod =3D require('./foomod.js');
    { foo; 42 }
    > foomod.foo;
    42
    

    I have read the js_of_ocaml help page on how to bind JS module= s:

    https://= ocsigen.org/js_of_ocaml/latest/manual/bindings

    I imagine if I could get over this hump, all the rest of the information I = need will be there.

    Nicol=C3=A1s Ojeda B=C3=A4r replied

    Not exactly what you asked, but if you just want to provide a JS version of= some C primitive

    external foo : unit ->=
    ; int =3D "caml_foo"
    

    you can do this by writing the following in your .js file:

    //Provides: caml_foo
    function caml_foo() {
      return 42;
    }
    

    Then js_of_ocaml will automatically replace calls to the exter= nal function by a call to its JS implementation.

    This is the same mechanism used by js_of_ocaml to implement it= s own JS version of the OCaml runtime, see eg

    https://github.com/ocsi= gen/js_of_ocaml/blob/3850a67b1cb00cfd2ee4399cf1e2948062884b92/runtime/bigar= ray.js#L328-L335

    diskuvbox: small set of cross-platform CLI tools

    jbeckford announced

    TLDR:

    $ opam update
    $ opam install diskuvbox
    
    $ diskuvbox copy-dir --mode 755 src1/ src2/ dest/
    $ diskuvbox copy-file --mode 400 src/a dest/b
    $ diskuvbox copy-file-into src1/a src2/b dest/
    $ diskuvbox touch-file x/y/z
    
    $ diskuvbox find-up . _build
    Z:/source/_build
    
    $ diskuvbox tree --max-depth 2 --encoding=3DUTF-8 .
    .
    =E2=94=9C=E2=94=80=E2=94=80 CHANGES.md
    =E2=94=9C=E2=94=80=E2=94=80 README.md
    =E2=94=9C=E2=94=80=E2=94=80 _build/
    =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 default/
    =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 install/
    =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 log
    

    Problem: When writing cram tests, Dune rules and Opam build steps, o= ften we default to using GNU binaries (/usr/bin/*) available on Linux (ex. /usr/bin/cp -R). Unfortunately these commands rarely work on Windows, and as a consequence Windows OCaml developers are forced to maintain Cygwin or MSY= S2 installations to get GNU tooling.

    Solution: Provide some of the same functionality for Windows and mac= OS that the GNU binaries in /usr/bin/* do in Linux.

    diskuvbox is a single binary that today provides an analog for= a very small number of binaries that I have needed in the Diskuv Windows OCaml distribution. It is liberally licensed under Ap= ache v2.0. With your PRs it could emulate much more!

    diskuvbox has CI testing for Windows, macOS and Linux. Usage a= nd help are available in the diskuvbox README: https://github.c= om/diskuv/diskuvbox#diskuv-box

    diskuvbox also has a OCaml library, but consider the API un= stable until version 1.0.

    Alternatives:

    • There are some shell scripting tools like shexp and feather that give you POSIX pipes in OCaml-friendly syntax. I f= eel these complement Diskuv Box.
    • Dune exposes (copy) to copy a file in Dune rules; theoreti= cally more operations could be added.

    Internally diskuvbox is a wrapper on the excellent bos - Basic OS interaction library.

    Acknowledgements

    The first implementations of Diskuv Box were implemented with the assistanc= e of the OCaml Software Foundation (OCSF), a sub-foundation of the INRIA = Foundation.

    Two OCaml libraries (bos = and cmdliner) are essential to Diskuv Box; these libraries were created by Daniel B=C3=BCnzli (@dbuenzli) .

    Examples

    The following are examples that have been condensed from the diskuvbox README.md Ȃ= 6;

    Using in Dune cram tests
    $ install -d a/b/c/d/e/f
    $ install -d a/b2/c2/d2/e2/f2
    $ install -d a/b2/c3/d3/e3/f3
    $ install -d a/b2/c3/d4/e4/f4
    $ install -d a/b2/c3/d4/e5/f5
    $ install -d a/b2/c3/d4/e5/f6
    $ touch a/b/x
    $ touch a/b/c/y
    $ touch a/b/c/d/z
    
    $ diskuvbox tree a --max-depth 10 --encoding UTF-8
    a
    =E2=94=9C=E2=94=80=E2=94=80 b/
    =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 c/
    =E2=94=82   =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 d/
    =E2=94=82   =E2=94=82   =E2=94=82   =E2=94=9C=E2=94=80=E2=94=80 e/
    =E2=94=82   =E2=94=82   =E2=94=82   =E2=94=82   =E2=94=94=E2=94=80=E2=94=80=
     f/
    =E2=94=82   =E2=94=82   =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 z
    =E2=94=82   =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 y
    =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 x
    =E2=94=94=E2=94=80=E2=94=80 b2/
        =E2=94=9C=E2=94=80=E2=94=80 c2/
        =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 d2/
        =E2=94=82       =E2=94=94=E2=94=80=E2=94=80 e2/
        =E2=94=82           =E2=94=94=E2=94=80=E2=94=80 f2/
        =E2=94=94=E2=94=80=E2=94=80 c3/
            =E2=94=9C=E2=94=80=E2=94=80 d3/
            =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 e3/
            =E2=94=82       =E2=94=94=E2=94=80=E2=94=80 f3/
            =E2=94=94=E2=94=80=E2=94=80 d4/
                =E2=94=9C=E2=94=80=E2=94=80 e4/
                =E2=94=82   =E2=94=94=E2=94=80=E2=94=80 f4/
                =E2=94=94=E2=94=80=E2=94=80 e5/
                    =E2=94=9C=E2=94=80=E2=94=80 f5/
                    =E2=94=94=E2=94=80=E2=94=80 f6/
    
    Using in Opam build steps
    build: [
      ["diskuvbox" "copy-file-into" "assets/icon.png" "assets/public.gpg" "%{_:=
    share}%"]
    ]
    
    Using in Dune rules
    (rule
     (targets diskuvbox.corrected.ml diskuvbox.corrected.mli)
     (deps
      (:license %{project_root}/etc/lice=
    nse-header.txt)
      (:conf    %{project_root}/etc/head=
    ache.conf))
     (action
      (progn
       (run diskuvbox copy-file -m 644 diskuvbox.ml  diskuvbox.corrected.ml)
       (run diskuvbox copy-file -m 644 diskuvbox.mli diskuvbox.corrected.mli)
       (run headache -h %{license} -c %{conf} %{targets})
       (run ocamlformat --inplace --disable-conf-files --enable-outside-detecte=
    d-project %{targets}))))
    

    Old CWN

    If you happen to miss a CWN, you can send me a message and I'll mail it to you, or go take a loo= k at the archive or the <= a href=3D"https://alan.petitepomme.net/cwn/cwn.rss">RSS feed of the archive= s.

    If you also wish to receive it every week by mail, you may subscribe online.